""" ******************************************************************************** * CNIRevelator * * * * Desc: MRZ data dictionnary for CNIRevelator analyzer and * * functions to analyze these data * * * * Copyright © 2018-2019 Adrien Bourmault (neox95) * * * * This file is part of CNIRevelator. * * * * CNIRevelator is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * any later version. * * * * CNIRevelator is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY*without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with CNIRevelator. If not, see . * ******************************************************************************** """ ## SEX CODES sexcode = {'M':'Homme', 'F':'Femme', 'X':'Non spécifié'} ## COUNTRY CODES landcode2 = { AW: "Aruba", AF: "Afghanistan", AO: "Angola", AI: "Anguilla", AL: "Albanie", AD: "Andorre", AE: "Emirats arabes unis", AR: "Argentine", AM: "Arménie", AS: "Samoa américaines", AQ: "Antarctique", TF: "Terres australes et antarctiques françaises", AG: "Antigua-et-Barbuda", AU: "Australie", AT: "Autriche", AZ: "Azerbaidjan", BI: "Burundi", BE: "Belgique", BJ: "Benin", BQ: "Pays-Bas caribéens", BF: "Burkina Faso", BD: "Bangladesh", BG: "Bulgarie", BH: "Bahrein", BS: "Bahamas", BA: "Bosnie-Herzegovine", BL: "Saint-Barthélemy", BY: "Bielorussie", BZ: "Belize", BM: "Bermudes", BO: "Bolivie", BR: "Brésil", BB: "Barbade", BN: "Brunei", BT: "Bhoutan", BW: "Botswana", CF: "République Centrafricaine", CA: "Canada", CC: "Îles Cocos", CH: "Suisse", CL: "Chili", CN: "Chine", CI: "Côte d'Ivoire", CM: "Cameroun", CD: "Congo (République démocratique)", CG: "Congo (République)", CK: "Îles Cook", CO: "Colombie", KM: "Comores", CV: "Cap-Vert", CR: "Costa Rica", CU: "Cuba", CW: "Curaçao", CX: "Île Christmas", KY: "Caimans", CY: "Chypre", CZ: "Tchéquie", DE: "Allemagne", DJ: "Djibouti", DM: "Dominique", DK: "Danemark", DO: "République dominicaine", DZ: "Algérie", EC: "Equateur", EG: "Egypte", ER: "Erythrée", EH: "Sahara occidental", ES: "Espagne", EE: "Estonie", ET: "Ethiopie", FI: "Finlande", FJ: "Fidji", FK: "Îles Malouines", FR: "France", FO: "Féroé", FM: "Micronésie", GA: "Gabon", GB: "Royaume-Uni", GE: "Géorgie", GG: "Guernesey", GH: "Ghana", GI: "Gibraltar", GN: "Guinée", GP: "Guadeloupe", GM: "Gambie", GW: "Guinée-Bissau", GQ: "Guinée équatoriale", GR: "Grèce", GD: "Grenade", GL: "Groenland", GT: "Guatemala", GF: "Guyane", GU: "Guam", GY: "Guyana", HK: "Hong Kong", HN: "Honduras", HR: "Croatie", HT: "Haïti", HU: "Hongrie", ID: "Indonésie", IM: "Île de Man", IN: "Inde", IO: "Territoire britannique de l'océan Indien", IE: "Irlande", IR: "Irak", IQ: "Iran", IS: "Islande", IL: "Israël", IT: "Italie", JM: "Jamaïque", JE: "Jersey", JO: "Jordanie", JP: "Japon", KZ: "Kazakhstan", KE: "Kenya", KG: "Kirghizistan", KH: "Cambodge", KI: "Kiribati", KN: "Saint-Christophe-et-Niévès", KR: "Corée du Sud", KW: "Koweït", LA: "Laos", LB: "Liban", LR: "Liberia", LY: "Libye", LC: "Sainte-Lucie", LI: "Liechtenstein", LK: "Sri Lanka", LS: "Lesotho", LT: "Lituanie", LU: "Luxembourg", LV: "Lettonie", MO: "Macao", MF: "Sint-Maarten", MA: "Maroc", MC: "Monaco", MD: "Moldavie", MG: "Madagascar", MV: "Maldives", MX: "Mexique", MH: "Marshall", MK: "Macedoine", ML: "Mali", MT: "Malte", MM: "Birmanie", ME: "Monténégro", MN: "Mongolie", MP: "Îles Mariannes du Nord", MZ: "Mozambique", MR: "Mauritanie", MS: "Montserrat", MQ: "Martinique", MU: "Maurice", MW: "Malawi", MY: "Malaisie", YT: "Mayotte", NA: "Namibie", NC: "Nouvelle-Calédonie", NE: "Niger", NF: "Île Norfolk", NG: "Nigeria", NI: "Nicaragua", NU: "Niue", NL: "Pays-Bas", NO: "Norvège", NP: "Nepal", NR: "Nauru", NZ: "Nouvelle-Zélande", OM: "Oman", PK: "Pakistan", PA: "Panama", PN: "Îles Pitcairn", PE: "Pérou", PH: "Philippines", PW: "Palaos", PG: "Papouasie-Nouvelle-Guinée", PL: "Pologne", PR: "Porto Rico", KP: "Corée du Nord", PT: "Portugal", PY: "Paraguay", PS: "Palestine", PF: "Polynésie française", QA: "Qatar", RE: "Réunion", RO: "Roumanie", RU: "Russie", RW: "Rwanda", SA: "Arabie saoudite", SD: "Soudan", SN: "Sénégal", SG: "Singapour", GS: "Georgie du Sud-et-les iles Sandwich du Sud", SH: "Sainte-Hélène, Ascension et Tristan da Cunha", SJ: "Svalbard et île Jan Mayen", SB: "Salomon", SL: "Sierra Leone", SV: "Salvador", SM: "Saint-Marin", SO: "Somalie", PM: "Saint-Pierre-et-Miquelon", RS: "Serbie", SS: "Soudan du Sud", ST: "Sao Tomé-et-Principe", SR: "Suriname", SK: "Slovaquie", SI: "Slovénie", SE: "Suède", SZ: "eSwatani", SX: "Saint-Martin ", SC: "Seychelles", SY: "Syrie", TC: "Îles Turques-et-Caïques", TD: "Tchad", TG: "Togo", TH: "Thaïlande", TJ: "Tadjikistan", TK: "Tokelau", TM: "Turkmenistan", TL: "Timor oriental", TO: "Tonga", TT: "Trinité-et-Tobago", TN: "Tunisie", TR: "Turquie", TV: "Tuvalu", TW: "Taiwan", TZ: "Tanzanie", UG: "Ouganda", UA: "Ukraine", UY: "Uruguay", US: "Etats-Unis", UZ: "Ouzbékistan", VA: "Saint-Siège (État de la Cité du Vatican)", VC: "Saint-Vincent-et-les-Grenadines", VE: "Venezuela", VG: "Îles Vierges britanniques", VI: "Îles Vierges des États-Unis", VN: "Viêt Nam", VU: "Vanuatu", WF: "Wallis-et-Futuna", WS: "Samoa", XK: "Kosovo", YE: "Yémen", ZA: "Afrique du Sud", ZM: "Zambie", ZW: "Zimbabwe" } landcode3 = { ABW: "Aruba", AFG: "Afghanistan", AGO: "Angola", AIA: "Anguilla", ALB: "Albanie", AND: "Andorre", ARE: "Emirats arabes unis", ARG: "Argentine", ARM: "Arménie", ASM: "Samoa américaines", ATA: "Antarctique", ATF: "Terres australes et antarctiques françaises", ATG: "Antigua-et-Barbuda", AUS: "Australie", AUT: "Autriche", AZE: "Azerbaidjan", BDI: "Burundi", BEL: "Belgique", BEN: "Benin", BES: "Pays-Bas caribéens", BFA: "Burkina Faso", BGD: "Bangladesh", BGR: "Bulgarie", BHR: "Bahrein", BHS: "Bahamas", BIH: "Bosnie-Herzegovine", BLM: "Saint-Barthélemy", BLR: "Bielorussie", BLZ: "Belize", BMU: "Bermudes", BOL: "Bolivie", BRA: "Brésil", BRB: "Barbade", BRN: "Brunei", BTN: "Bhoutan", BWA: "Botswana", CAF: "République Centrafricaine", CAN: "Canada", CCK: "Îles Cocos", CHE: "Suisse", CHL: "Chili", CHN: "Chine", CIV: "Côte d'Ivoire", CMR: "Cameroun", COD: "Congo (République démocratique)", COG: "Congo (République)", COK: "Îles Cook", COL: "Colombie", COM: "Comores", CPV: "Cap-Vert", CRI: "Costa Rica", CUB: "Cuba", CUW: "Curaçao", CXR: "Île Christmas", CYM: "Caimans", CYP: "Chypre", CZE: "Tchéquie", DEU: "Allemagne", DJI: "Djibouti", DMA: "Dominique", DNK: "Danemark", DOM: "République dominicaine", DZA: "Algérie", ECU: "Equateur", EGY: "Egypte", ERI: "Erythrée", ESH: "Sahara occidental", ESP: "Espagne", EST: "Estonie", ETH: "Ethiopie", FIN: "Finlande", FJI: "Fidji", FLK: "Îles Malouines", FRA: "France", FRO: "Féroé", FSM: "Micronésie", GAB: "Gabon", GBR: "Royaume-Uni", GEO: "Géorgie", GGY: "Guernesey", GHA: "Ghana", GIB: "Gibraltar", GIN: "Guinée", GLP: "Guadeloupe", GMB: "Gambie", GNB: "Guinée-Bissau", GNQ: "Guinée équatoriale", GRC: "Grèce", GRD: "Grenade", GRL: "Groenland", GTM: "Guatemala", GUF: "Guyane", GUM: "Guam", GUY: "Guyana", HKG: "Hong Kong", HND: "Honduras", HRV: "Croatie", HTI: "Haïti", HUN: "Hongrie", IDN: "Indonésie", IMN: "Île de Man", IND: "Inde", IOT: "Territoire britannique de l'océan Indien", IRL: "Irlande", IRN: "Irak", IRQ: "Iran", ISL: "Islande", ISR: "Israël", ITA: "Italie", JAM: "Jamaïque", JEY: "Jersey", JOR: "Jordanie", JPN: "Japon", KAZ: "Kazakhstan", KEN: "Kenya", KGZ: "Kirghizistan", KHM: "Cambodge", KIR: "Kiribati", KNA: "Saint-Christophe-et-Niévès", KOR: "Corée du Sud", KWT: "Koweït", LAO: "Laos", LBN: "Liban", LBR: "Liberia", LBY: "Libye", LCA: "Sainte-Lucie", LIE: "Liechtenstein", LKA: "Sri Lanka", LSO: "Lesotho", LTU: "Lituanie", LUX: "Luxembourg", LVA: "Lettonie", MAC: "Macao", MAF: "Sint-Maarten", MAR: "Maroc", MCO: "Monaco", MDA: "Moldavie", MDG: "Madagascar", MDV: "Maldives", MEX: "Mexique", MHL: "Marshall", MKD: "Macedoine", MLI: "Mali", MLT: "Malte", MMR: "Birmanie", MNE: "Monténégro", MNG: "Mongolie", MNP: "Îles Mariannes du Nord", MOZ: "Mozambique", MRT: "Mauritanie", MSR: "Montserrat", MTQ: "Martinique", MUS: "Maurice", MWI: "Malawi", MYS: "Malaisie", MYT: "Mayotte", NAM: "Namibie", NCL: "Nouvelle-Calédonie", NER: "Niger", NFK: "Île Norfolk", NGA: "Nigeria", NIC: "Nicaragua", NIU: "Niue", NLD: "Pays-Bas", NOR: "Norvège", NPL: "Nepal", NRU: "Nauru", NZL: "Nouvelle-Zélande", OMN: "Oman", PAK: "Pakistan", PAN: "Panama", PCN: "Îles Pitcairn", PER: "Pérou", PHL: "Philippines", PLW: "Palaos", PNG: "Papouasie-Nouvelle-Guinée", POL: "Pologne", PRI: "Porto Rico", PRK: "Corée du Nord", PRT: "Portugal", PRY: "Paraguay", PSE: "Palestine", PYF: "Polynésie française", QAT: "Qatar", REU: "Réunion", ROU: "Roumanie", RUS: "Russie", RWA: "Rwanda", SAU: "Arabie saoudite", SDN: "Soudan", SEN: "Sénégal", SGP: "Singapour", SGS: "Georgie du Sud-et-les iles Sandwich du Sud", SHN: "Sainte-Hélène, Ascension et Tristan da Cunha", SJM: "Svalbard et île Jan Mayen", SLB: "Salomon", SLE: "Sierra Leone", SLV: "Salvador", SMR: "Saint-Marin", SOM: "Somalie", SPM: "Saint-Pierre-et-Miquelon", SRB: "Serbie", SSD: "Soudan du Sud", STP: "Sao Tomé-et-Principe", SUR: "Suriname", SVK: "Slovaquie", SVN: "Slovénie", SWE: "Suède", SWZ: "eSwatani", SXM: "Saint-Martin ", SYC: "Seychelles", SYR: "Syrie", TCA: "Îles Turques-et-Caïques", TCD: "Tchad", TGO: "Togo", THA: "Thaïlande", TJK: "Tadjikistan", TKL: "Tokelau", TKM: "Turkmenistan", TLS: "Timor oriental", TON: "Tonga", TTO: "Trinité-et-Tobago", TUN: "Tunisie", TUR: "Turquie", TUV: "Tuvalu", TWN: "Taiwan", TZA: "Tanzanie", UGA: "Ouganda", UKR: "Ukraine", URY: "Uruguay", USA: "Etats-Unis", UZB: "Ouzbékistan", VAT: "Saint-Siège (État de la Cité du Vatican)", VCT: "Saint-Vincent-et-les-Grenadines", VEN: "Venezuela", VGB: "Îles Vierges britanniques", VIR: "Îles Vierges des États-Unis", VNM: "Viêt Nam", VUT: "Vanuatu", WLF: "Wallis-et-Futuna", WSM: "Samoa", XKX: "Kosovo", YEM: "Yémen", ZAF: "Afrique du Sud", ZMB: "Zambie", ZWE: "Zimbabwe", NTZ: "Zone neutre", UNO: "Fonctionnaire des Nations Unies", UNA: "Fonctionnaire d'une organisation affiliée aux Nations Unies", UNK: "Représentant des Nations Unies au Kosovo", XXA: "Apatride Convention 1954", XXB: "Réfugié Convention 1954", XXC: "Réfugié autre", XXX: "Résident Légal de Nationalité Inconnue", D: "Allemagne", EUE: "Union Européenne", GBD: "Citoyen Britannique d'Outre-mer (BOTC)", GBN: "British National (Overseas)", GBO: "British Overseas Citizen", GBP: "British Protected Person", GBS: "British Subject", XBA: "Banque Africaine de Développement", XIM: "Banque Africaine d'Export–Import", XCC: "Caribbean Community or one of its emissaries", XCO: "Common Market for Eastern and Southern Africa", XEC: "Economic Community of West African States", XPO: "International Criminal Police Organization", XOM: "Sovereign Military Order of Malta", RKS: "Kosovo", WSA: "World Service Authority World Passport" } ## DOCUMENTS TYPES P = [ "11222333333333333333333333333333333333333333|444444444566677777789AAAAAABCCCCCCCCCCCCCCDE", { "1": "2|CODE|P*", "2": "3|PAYS|AAA", "3": "39|NOM|&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "4": "9|NO|*********", "5": "1|CTRL|4", "6": "3|NAT|AAA", "7": "6|BDATE|000000", "8": "1|CTRL|7", "9": "1|SEX|A", "A": "6|EDATE|000000", "B": "1|CTRL|A", "C": "14|FACULT|**************", "D": "1|CTRLF|C", "E": "1|CTRL|4578ABCD" }, "Passeport" ] IP = [ "112223333333334555555555555555|66666678999999ABBBCCCCCCCCCCCD", { "1": "2|CODE|IP", "2": "3|PAYS|AAA", "3": "9|NO|*********", "4": "1|CTRL|3", "5": "15|FACULT|***************", "6": "6|BDATE|000000", "7": "1|CTRL|6", "8": "1|SEX|A", "9": "6|EDATE|000000", "A": "1|CTRL|9", "B": "3|NAT|AAA", "C": "11|FACULT|***********", "D": "1|CTRL|345679AC" }, "Carte-passeport" ] I_ = [ "112223333333334555555555555555|66666678999999ABBBCCCCCCCCCCCD", { "1": "2|CODE|I*", "2": "3|PAYS|AAA", "3": "9|NO|*********", "4": "1|CTRL|3", "5": "15|FACULT|***************", "6": "6|BDATE|000000", "7": "1|CTRL|6", "8": "1|SEX|A", "9": "6|EDATE|000000", "A": "1|CTRL|9", "B": "3|NAT|AAA", "C": "11|FACULT|***********", "D": "1|CTRL|345679AC" }, "Titre d'identité/de voyage" ] AC = [ "112223333333334EEE555555555555|66666678999999ABBBCCCCCCCCCCCD", { "1": "2|CODE|AC", "2": "3|PAYS|AAA", "3": "9|NO|*********", "4": "1|CTRL|3", "5": "15|FACULT|***************", "6": "6|BDATE|000000", "7": "1|CTRL|6", "8": "1|SEX|A", "9": "6|EDATE|000000", "A": "1|CTRL|9", "B": "3|NAT|AAA", "C": "11|FACULT|***********", "D": "1|CTRL|345679AC", "E": "3|INDIC|AA&" }, "Certificat de membre d'équipage" ] VA = [ "11222333333333333333333333333333333333333333|444444444566677777789AAAAAABCCCCCCCCCCCCCCDE", { "1": "2|CODE|V*", "2": "3|PAYS|AAA", "3": "39|NOM|&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "4": "9|NO|*********", "5": "1|CTRL|4", "6": "3|NAT|AAA", "7": "6|BDATE|000000", "8": "1|CTRL|7", "9": "1|SEX|A", "A": "6|EDATE|000000", "B": "1|CTRL|A", "C": "14|FACULT|**************" }, "Visa de type A" ] VB = [ "112223333333333333333333333333333333|444444444566677777789AAAAAABCCCCCC", { "1": "2|CODE|V*", "2": "3|PAYS|AAA", "3": "31|NOM|&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "4": "9|NO|*********", "5": "1|CTRL|4", "6": "3|NAT|AAA", "7": "6|BDATE|000000", "8": "1|CTRL|7", "9": "1|SEX|A", "A": "6|EDATE|000000", "B": "1|CTRL|A", "C": "8|FACULT|********" }, "Visa de type B" ] I__ = [ "112223333333333333333333333333333333|444444444566677777789AAAAAABCCCCCCCD", { "1": "2|CODE|I*", "2": "3|PAYS|AAA", "3": "31|NOM|&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "4": "9|NO|*********", "5": "1|CTRL|4", "6": "3|NAT|AAA", "7": "6|BDATE|000000", "8": "1|CTRL|7", "9": "1|SEX|A", "A": "6|EDATE|000000", "B": "1|CTRL|A", "C": "7|FACULT|*******", "D": "1|CTRL|4578ABC" }, "Pièce d'identité/de voyage" ] ID = [ "112223333333333333333333333333444444|555566677777899999999999999AAAAAABCD", { "1": "2|CODE|ID", "2": "3|PAYS|AAA", "3": "25|NOM|&&&&&&&&&&&&&&&&&&&&&&&&&", "4": "6|NOINT|000***", "5": "4|DDATE|0000", "6": "3|NOINT2|000", "7": "5|NOINT3|00000", "8": "1|CTRL|567", "9": "14|PRENOM|A", "A": "6|BDATE|000000", "B": "1|CTRL|A", "C": "1|SEX|A", "D": "1|CTRL|123456789ABC" }, "Pièce d'identité FR" ] DL = [ "112223333333334555555666666667|", { "1": "2|CODE|D1", "2": "3|PAYS|AAA", "3": "9|NO|00AA00000", "4": "1|CTRL|123", "5": "6|EDATE|000000", "6": "8|NOM|&&&&&&&&", "7": "1|CTRL|123456" }, "Permis de conduire" ] TYPES = [ID, I__, VB, VA, AC, I_, IP, P, DL] ## THE ROOT OF THIS PROJECT ! def MRZ(code): """ This function computes a control sum for a range of characters """ resultat = 0 i = -1 facteur = [7, 3, 1] for car in code: if car == '<' or car == '|': valeur = 0 i += 1 else: if car in '0123456789': valeur = int(car) i += 1 else: if car in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ': valeur = ord(car) - 55 i += 1 else: break resultat += valeur * facteur[(i % 3)] return resultat % 10