libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

registry.kt (13835B)


      1 /*
      2  * This file is part of LibEuFin.
      3  * Copyright (C) 2025 Taler Systems S.A.
      4 
      5  * LibEuFin is free software; you can redistribute it and/or modify
      6  * it under the terms of the GNU Affero General Public License as
      7  * published by the Free Software Foundation; either version 3, or
      8  * (at your option) any later version.
      9 
     10  * LibEuFin is distributed in the hope that it will be useful, but
     11  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     12  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General
     13  * Public License for more details.
     14 
     15  * You should have received a copy of the GNU Affero General Public
     16  * License along with LibEuFin; see the file COPYING.  If not, see
     17  * <http://www.gnu.org/licenses/>
     18  */
     19 
     20 package tech.libeufin.common
     21 
     22 /** IBAN ASCII characters rules */
     23 enum class IbanC {
     24     /** Digits (0-9) */
     25     n,
     26     /** Uppercase (A-Z) */
     27     a,
     28     /** Digits or uppercase (0-9 & A-Z) */
     29     c,
     30 }
     31 
     32 enum class Country(val ibanLen: Int, val rules: List<Pair<Int, IbanC>>, val bbanRegex: Regex) {
     33     AD(24, listOf(Pair(8, IbanC.n),Pair(12, IbanC.c),), Regex("^[0-9]{8}[0-9A-Z]{12}$")),
     34     AE(23, listOf(Pair(19, IbanC.n),), Regex("^[0-9]{19}$")),
     35     AL(28, listOf(Pair(8, IbanC.n),Pair(16, IbanC.c),), Regex("^[0-9]{8}[0-9A-Z]{16}$")),
     36     AT(20, listOf(Pair(16, IbanC.n),), Regex("^[0-9]{16}$")),
     37     AZ(28, listOf(Pair(4, IbanC.a),Pair(20, IbanC.c),), Regex("^[A-Z]{4}[0-9A-Z]{20}$")),
     38     BA(20, listOf(Pair(16, IbanC.n),), Regex("^[0-9]{16}$")),
     39     BE(16, listOf(Pair(12, IbanC.n),), Regex("^[0-9]{12}$")),
     40     BG(22, listOf(Pair(4, IbanC.a),Pair(6, IbanC.n),Pair(8, IbanC.c),), Regex("^[A-Z]{4}[0-9]{6}[0-9A-Z]{8}$")),
     41     BH(22, listOf(Pair(4, IbanC.a),Pair(14, IbanC.c),), Regex("^[A-Z]{4}[0-9A-Z]{14}$")),
     42     BI(27, listOf(Pair(23, IbanC.n),), Regex("^[0-9]{23}$")),
     43     BR(29, listOf(Pair(23, IbanC.n),Pair(1, IbanC.a),Pair(1, IbanC.c),), Regex("^[0-9]{23}[A-Z]{1}[0-9A-Z]{1}$")),
     44     BY(28, listOf(Pair(4, IbanC.c),Pair(4, IbanC.n),Pair(16, IbanC.c),), Regex("^[0-9A-Z]{4}[0-9]{4}[0-9A-Z]{16}$")),
     45     CH(21, listOf(Pair(5, IbanC.n),Pair(12, IbanC.c),), Regex("^[0-9]{5}[0-9A-Z]{12}$")),
     46     CR(22, listOf(Pair(18, IbanC.n),), Regex("^[0-9]{18}$")),
     47     CY(28, listOf(Pair(8, IbanC.n),Pair(16, IbanC.c),), Regex("^[0-9]{8}[0-9A-Z]{16}$")),
     48     CZ(24, listOf(Pair(20, IbanC.n),), Regex("^[0-9]{20}$")),
     49     DE(22, listOf(Pair(18, IbanC.n),), Regex("^[0-9]{18}$")),
     50     DJ(27, listOf(Pair(23, IbanC.n),), Regex("^[0-9]{23}$")),
     51     DK(18, listOf(Pair(14, IbanC.n),), Regex("^[0-9]{14}$")),
     52     DO(28, listOf(Pair(4, IbanC.c),Pair(20, IbanC.n),), Regex("^[0-9A-Z]{4}[0-9]{20}$")),
     53     EE(20, listOf(Pair(16, IbanC.n),), Regex("^[0-9]{16}$")),
     54     EG(29, listOf(Pair(25, IbanC.n),), Regex("^[0-9]{25}$")),
     55     ES(24, listOf(Pair(20, IbanC.n),), Regex("^[0-9]{20}$")),
     56     FI(18, listOf(Pair(14, IbanC.n),), Regex("^[0-9]{14}$")),
     57     FK(18, listOf(Pair(2, IbanC.a),Pair(12, IbanC.n),), Regex("^[A-Z]{2}[0-9]{12}$")),
     58     FO(18, listOf(Pair(14, IbanC.n),), Regex("^[0-9]{14}$")),
     59     FR(27, listOf(Pair(10, IbanC.n),Pair(11, IbanC.c),Pair(2, IbanC.n),), Regex("^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$")),
     60     GB(22, listOf(Pair(4, IbanC.a),Pair(14, IbanC.n),), Regex("^[A-Z]{4}[0-9]{14}$")),
     61     GE(22, listOf(Pair(2, IbanC.a),Pair(16, IbanC.n),), Regex("^[A-Z]{2}[0-9]{16}$")),
     62     GI(23, listOf(Pair(4, IbanC.a),Pair(15, IbanC.c),), Regex("^[A-Z]{4}[0-9A-Z]{15}$")),
     63     GL(18, listOf(Pair(14, IbanC.n),), Regex("^[0-9]{14}$")),
     64     GR(27, listOf(Pair(7, IbanC.n),Pair(16, IbanC.c),), Regex("^[0-9]{7}[0-9A-Z]{16}$")),
     65     GT(28, listOf(Pair(24, IbanC.c),), Regex("^[0-9A-Z]{24}$")),
     66     HN(28, listOf(Pair(4, IbanC.a),Pair(20, IbanC.n),), Regex("^[A-Z]{4}[0-9]{20}$")),
     67     HR(21, listOf(Pair(17, IbanC.n),), Regex("^[0-9]{17}$")),
     68     HU(28, listOf(Pair(24, IbanC.n),), Regex("^[0-9]{24}$")),
     69     IE(22, listOf(Pair(4, IbanC.a),Pair(14, IbanC.n),), Regex("^[A-Z]{4}[0-9]{14}$")),
     70     IL(23, listOf(Pair(19, IbanC.n),), Regex("^[0-9]{19}$")),
     71     IQ(23, listOf(Pair(4, IbanC.a),Pair(15, IbanC.n),), Regex("^[A-Z]{4}[0-9]{15}$")),
     72     IS(26, listOf(Pair(22, IbanC.n),), Regex("^[0-9]{22}$")),
     73     IT(27, listOf(Pair(1, IbanC.a),Pair(10, IbanC.n),Pair(12, IbanC.c),), Regex("^[A-Z]{1}[0-9]{10}[0-9A-Z]{12}$")),
     74     JO(30, listOf(Pair(4, IbanC.a),Pair(4, IbanC.n),Pair(18, IbanC.c),), Regex("^[A-Z]{4}[0-9]{4}[0-9A-Z]{18}$")),
     75     KW(30, listOf(Pair(4, IbanC.a),Pair(22, IbanC.c),), Regex("^[A-Z]{4}[0-9A-Z]{22}$")),
     76     KZ(20, listOf(Pair(3, IbanC.n),Pair(13, IbanC.c),), Regex("^[0-9]{3}[0-9A-Z]{13}$")),
     77     LB(28, listOf(Pair(4, IbanC.n),Pair(20, IbanC.c),), Regex("^[0-9]{4}[0-9A-Z]{20}$")),
     78     LC(32, listOf(Pair(4, IbanC.a),Pair(24, IbanC.c),), Regex("^[A-Z]{4}[0-9A-Z]{24}$")),
     79     LI(21, listOf(Pair(5, IbanC.n),Pair(12, IbanC.c),), Regex("^[0-9]{5}[0-9A-Z]{12}$")),
     80     LT(20, listOf(Pair(16, IbanC.n),), Regex("^[0-9]{16}$")),
     81     LU(20, listOf(Pair(3, IbanC.n),Pair(13, IbanC.c),), Regex("^[0-9]{3}[0-9A-Z]{13}$")),
     82     LV(21, listOf(Pair(4, IbanC.a),Pair(13, IbanC.c),), Regex("^[A-Z]{4}[0-9A-Z]{13}$")),
     83     LY(25, listOf(Pair(21, IbanC.n),), Regex("^[0-9]{21}$")),
     84     MC(27, listOf(Pair(10, IbanC.n),Pair(11, IbanC.c),Pair(2, IbanC.n),), Regex("^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$")),
     85     MD(24, listOf(Pair(20, IbanC.c),), Regex("^[0-9A-Z]{20}$")),
     86     ME(22, listOf(Pair(18, IbanC.n),), Regex("^[0-9]{18}$")),
     87     MK(19, listOf(Pair(3, IbanC.n),Pair(10, IbanC.c),Pair(2, IbanC.n),), Regex("^[0-9]{3}[0-9A-Z]{10}[0-9]{2}$")),
     88     MN(20, listOf(Pair(16, IbanC.n),), Regex("^[0-9]{16}$")),
     89     MR(27, listOf(Pair(23, IbanC.n),), Regex("^[0-9]{23}$")),
     90     MT(31, listOf(Pair(4, IbanC.a),Pair(5, IbanC.n),Pair(18, IbanC.c),), Regex("^[A-Z]{4}[0-9]{5}[0-9A-Z]{18}$")),
     91     MU(30, listOf(Pair(4, IbanC.a),Pair(19, IbanC.n),Pair(3, IbanC.a),), Regex("^[A-Z]{4}[0-9]{19}[A-Z]{3}$")),
     92     NI(28, listOf(Pair(4, IbanC.a),Pair(20, IbanC.n),), Regex("^[A-Z]{4}[0-9]{20}$")),
     93     NL(18, listOf(Pair(4, IbanC.a),Pair(10, IbanC.n),), Regex("^[A-Z]{4}[0-9]{10}$")),
     94     NO(15, listOf(Pair(11, IbanC.n),), Regex("^[0-9]{11}$")),
     95     OM(23, listOf(Pair(3, IbanC.n),Pair(16, IbanC.c),), Regex("^[0-9]{3}[0-9A-Z]{16}$")),
     96     PK(24, listOf(Pair(4, IbanC.a),Pair(16, IbanC.c),), Regex("^[A-Z]{4}[0-9A-Z]{16}$")),
     97     PL(28, listOf(Pair(24, IbanC.n),), Regex("^[0-9]{24}$")),
     98     PS(29, listOf(Pair(4, IbanC.a),Pair(21, IbanC.c),), Regex("^[A-Z]{4}[0-9A-Z]{21}$")),
     99     PT(25, listOf(Pair(21, IbanC.n),), Regex("^[0-9]{21}$")),
    100     QA(29, listOf(Pair(4, IbanC.a),Pair(21, IbanC.c),), Regex("^[A-Z]{4}[0-9A-Z]{21}$")),
    101     RO(24, listOf(Pair(4, IbanC.a),Pair(16, IbanC.c),), Regex("^[A-Z]{4}[0-9A-Z]{16}$")),
    102     RS(22, listOf(Pair(18, IbanC.n),), Regex("^[0-9]{18}$")),
    103     RU(33, listOf(Pair(14, IbanC.n),Pair(15, IbanC.c),), Regex("^[0-9]{14}[0-9A-Z]{15}$")),
    104     SA(24, listOf(Pair(2, IbanC.n),Pair(18, IbanC.c),), Regex("^[0-9]{2}[0-9A-Z]{18}$")),
    105     SC(31, listOf(Pair(4, IbanC.a),Pair(20, IbanC.n),Pair(3, IbanC.a),), Regex("^[A-Z]{4}[0-9]{20}[A-Z]{3}$")),
    106     SD(18, listOf(Pair(14, IbanC.n),), Regex("^[0-9]{14}$")),
    107     SE(24, listOf(Pair(20, IbanC.n),), Regex("^[0-9]{20}$")),
    108     SI(19, listOf(Pair(15, IbanC.n),), Regex("^[0-9]{15}$")),
    109     SK(24, listOf(Pair(20, IbanC.n),), Regex("^[0-9]{20}$")),
    110     SM(27, listOf(Pair(1, IbanC.a),Pair(10, IbanC.n),Pair(12, IbanC.c),), Regex("^[A-Z]{1}[0-9]{10}[0-9A-Z]{12}$")),
    111     SO(23, listOf(Pair(19, IbanC.n),), Regex("^[0-9]{19}$")),
    112     ST(25, listOf(Pair(21, IbanC.n),), Regex("^[0-9]{21}$")),
    113     SV(28, listOf(Pair(4, IbanC.a),Pair(20, IbanC.n),), Regex("^[A-Z]{4}[0-9]{20}$")),
    114     TL(23, listOf(Pair(19, IbanC.n),), Regex("^[0-9]{19}$")),
    115     TN(24, listOf(Pair(20, IbanC.n),), Regex("^[0-9]{20}$")),
    116     TR(26, listOf(Pair(6, IbanC.n),Pair(16, IbanC.c),), Regex("^[0-9]{6}[0-9A-Z]{16}$")),
    117     UA(29, listOf(Pair(6, IbanC.n),Pair(19, IbanC.c),), Regex("^[0-9]{6}[0-9A-Z]{19}$")),
    118     VA(22, listOf(Pair(18, IbanC.n),), Regex("^[0-9]{18}$")),
    119     VG(24, listOf(Pair(4, IbanC.a),Pair(16, IbanC.n),), Regex("^[A-Z]{4}[0-9]{16}$")),
    120     XK(20, listOf(Pair(16, IbanC.n),), Regex("^[0-9]{16}$")),
    121     YE(30, listOf(Pair(4, IbanC.a),Pair(4, IbanC.n),Pair(18, IbanC.c),), Regex("^[A-Z]{4}[0-9]{4}[0-9A-Z]{18}$")),
    122 ;
    123     val bbanLen get() = ibanLen - 4
    124 }
    125 val VALID_IBAN = listOf(
    126     Pair("AD1200012030200359100100", "00012030200359100100"),
    127     Pair("AE070331234567890123456", "0331234567890123456"),
    128     Pair("AL47212110090000000235698741", "212110090000000235698741"),
    129     Pair("AT611904300234573201", "1904300234573201"),
    130     Pair("AZ21NABZ00000000137010001944", "NABZ00000000137010001944"),
    131     Pair("BA391290079401028494", "1290079401028494"),
    132     Pair("BE68539007547034", "539007547034"),
    133     Pair("BG80BNBG96611020345678", "BNBG96611020345678"),
    134     Pair("BH67BMAG00001299123456", "BMAG00001299123456"),
    135     Pair("BI4210000100010000332045181", "10000100010000332045181"),
    136     Pair("BR1800360305000010009795493C1", "00360305000010009795493C1"),
    137     Pair("BY13NBRB3600900000002Z00AB00", "NBRB 3600900000002Z00AB00"),
    138     Pair("CH9300762011623852957", "00762011623852957"),
    139     Pair("CR05015202001026284066", "015202001026284066"),
    140     Pair("CY17002001280000001200527600", "002001280000001200527600"),
    141     Pair("CZ6508000000192000145399", "08000000192000145399"),
    142     Pair("DE89370400440532013000", "370400440532013000"),
    143     Pair("DJ2100010000000154000100186", "00010000000154000100186"),
    144     Pair("DK5000400440116243", "00400440116243"),
    145     Pair("DO28BAGR00000001212453611324", "BAGR00000001212453611324"),
    146     Pair("EE382200221020145685", "2200221020145685"),
    147     Pair("EG380019000500000000263180002", "0019000500000000263180002"),
    148     Pair("ES9121000418450200051332", "21000418450200051332"),
    149     Pair("FI2112345600000785", null),
    150     Pair("FK88SC123456789012", "SC123456789012"),
    151     Pair("FO6264600001631634", "64600001631634"),
    152     Pair("FR1420041010050500013M02606", "20041010050500013M02606"),
    153     Pair("GB29NWBK60161331926819", "NWBK60161331926819"),
    154     Pair("GE29NB0000000101904917", "NB0000000101904917"),
    155     Pair("GI75NWBK000000007099453", "NWBK000000007099453"),
    156     Pair("GL8964710001000206", "64710001000206"),
    157     Pair("GR1601101250000000012300695", "01101250000000012300695"),
    158     Pair("GT82TRAJ01020000001210029690", "TRAJ01020000001210029690"),
    159     Pair("HN88CABF00000000000250005469", "CABF00000000000250005469"),
    160     Pair("HR1210010051863000160", "10010051863000160"),
    161     Pair("HU42117730161111101800000000", "117730161111101800000000"),
    162     Pair("IE29AIBK93115212345678", "AIBK93115212345678"),
    163     Pair("IL620108000000099999999", "0108000000099999999"),
    164     Pair("IQ98NBIQ850123456789012", "NBIQ850123456789012"),
    165     Pair("IS140159260076545510730339", "0159260076545510730339"),
    166     Pair("IT60X0542811101000000123456", "X0542811101000000123456"),
    167     Pair("JO94CBJO0010000000000131000302", "CBJO0010000000000131000302"),
    168     Pair("KW81CBKU0000000000001234560101", "CBKU0000000000001234560101"),
    169     Pair("KZ86125KZT5004100100", "125KZT5004100100"),
    170     Pair("LB62099900000001001901229114", "0999 0000 0001 0019 0122 9114"),
    171     Pair("LC55HEMM000100010012001200023015", "HEMM000100010012001200023015"),
    172     Pair("LI21088100002324013AA", "088100002324013AA"),
    173     Pair("LT121000011101001000", "1000011101001000"),
    174     Pair("LU280019400644750000", "0019400644750000"),
    175     Pair("LV80BANK0000435195001", "BANK0000435195001"),
    176     Pair("LY83002048000020100120361", "002048000020100120361"),
    177     Pair("MC5811222000010123456789030", "11222 00001 01234567890 30"),
    178     Pair("MD24AG000225100013104168", "AG000225100013104168"),
    179     Pair("ME25505000012345678951", "505000012345678951"),
    180     Pair("MK07250120000058984", "250120000058984"),
    181     Pair("MN121234123456789123", "1234123456789123"),
    182     Pair("MR1300020001010000123456753", "00020001010000123456753"),
    183     Pair("MT84MALT011000012345MTLCAST001S", "MALT011000012345MTLCAST001S"),
    184     Pair("MU17BOMM0101101030300200000MUR", "BOMM0101101030300200000MUR"),
    185     Pair("NI45BAPR00000013000003558124", "BAPR00000013000003558124"),
    186     Pair("NL91ABNA0417164300", "ABNA0417164300"),
    187     Pair("NO9386011117947", "86011117947"),
    188     Pair("OM810180000001299123456", "0180000001299123456"),
    189     Pair("PK36SCBL0000001123456702", "SCBL0000001123456702"),
    190     Pair("PL61109010140000071219812874", "109010140000071219812874"),
    191     Pair("PS92PALS000000000400123456702", "PALS000000000400123456702"),
    192     Pair("PT50000201231234567890154", "000201231234567890154"),
    193     Pair("QA58DOHB00001234567890ABCDEFG", "DOHB00001234567890ABCDEFG"),
    194     Pair("RO49AAAA1B31007593840000", "AAAA1B31007593840000"),
    195     Pair("RS35260005601001611379", "260005601001611379"),
    196     Pair("RU0304452522540817810538091310419", "044525225 40817 810 5 3809 1310419"),
    197     Pair("SA0380000000608010167519", "80000000608010167519"),
    198     Pair("SC18SSCB11010000000000001497USD", "SSCB11010000000000001497USD"),
    199     Pair("SD2129010501234001", "29010501234001"),
    200     Pair("SE4550000000058398257466", "50000000058398257466"),
    201     Pair("SI56263300012039086", "263300012039086"),
    202     Pair("SK3112000000198742637541", "12000000198742637541"),
    203     Pair("SM86U0322509800000000270100", "U0322509800000000270100"),
    204     Pair("SO211000001001000100141", "1000001001000100141"),
    205     Pair("ST23000100010051845310146", "000100010051845310146"),
    206     Pair("SV62CENR00000000000000700025", "CENR00000000000000700025"),
    207     Pair("TL380080012345678910157", "0080012345678910157"),
    208     Pair("TN5910006035183598478831", "10006035183598478831"),
    209     Pair("TR330006100519786457841326", "0006100519786457841326"),
    210     Pair("UA213223130000026007233566001", "3223130000026007233566001"),
    211     Pair("VA59001123000012345678", "001123000012345678"),
    212     Pair("VG96VPVG0000012345678901", "VPVG0000012345678901"),
    213     Pair("XK051212012345678906", "1212012345678906"),
    214     Pair("YE15CBYE0001018861234567891234", "CBYE0001018861234567891234"),
    215 );