CNIRevelator/src/mrz.py

756 lines
18 KiB
Python
Raw Normal View History

2019-07-09 23:01:09 +02:00
"""
********************************************************************************
* 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 <https:*www.gnu.org/licenses/>. *
********************************************************************************
"""
## 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'ExportImport",
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