|
|
|
@@ -7,6 +7,7 @@ from cryptography import x509
|
|
|
|
|
from cryptography.hazmat.primitives.asymmetric import ec
|
|
|
|
|
from cryptography.hazmat.primitives.asymmetric.utils import \
|
|
|
|
|
encode_dss_signature
|
|
|
|
|
import datetime
|
|
|
|
|
import json
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
@@ -35,6 +36,8 @@ def analyse_qrcode(qrcode: str, additional_info: bool = False,
|
|
|
|
|
|
|
|
|
|
Si `additional_info` est vrai, les informations de
|
|
|
|
|
vaccination/test sont affichées.
|
|
|
|
|
|
|
|
|
|
Renvoie la validité du pass sous forme de booléen.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
if not qrcode.startswith('HC1:'):
|
|
|
|
@@ -100,28 +103,62 @@ def analyse_qrcode(qrcode: str, additional_info: bool = False,
|
|
|
|
|
valid = True
|
|
|
|
|
print("Attention : la signature du QR code n'a pas été vérifiée.")
|
|
|
|
|
|
|
|
|
|
# TODO: Vérifier les données d'un test
|
|
|
|
|
# Information utile
|
|
|
|
|
p = payload[-260][1]
|
|
|
|
|
|
|
|
|
|
if 'v' in p:
|
|
|
|
|
# Les vaccins sont toujours valide
|
|
|
|
|
valid = valid and True
|
|
|
|
|
elif 't' in p:
|
|
|
|
|
# Les tests négatifs sont valables moins de 72h
|
|
|
|
|
test = p['t'][0]
|
|
|
|
|
assert test['tr'] in ['260373001', '260415000']
|
|
|
|
|
|
|
|
|
|
if test['tr'] == 260373001:
|
|
|
|
|
# Test positif
|
|
|
|
|
valid = False
|
|
|
|
|
|
|
|
|
|
test_date = datetime.datetime.fromisoformat(test['sc'])
|
|
|
|
|
tzinfo = test_date.tzinfo
|
|
|
|
|
delta = datetime.datetime.now(tzinfo) - test_date
|
|
|
|
|
valid = valid and delta.days < 3 # 3 jours de validité
|
|
|
|
|
elif 'r' in p:
|
|
|
|
|
# les tests positifs entre 11 et 182 jours après
|
|
|
|
|
test = p['r'][0]
|
|
|
|
|
valid_from = datetime.datetime.fromisoformat(test['df'])
|
|
|
|
|
valid_until = datetime.datetime.fromisoformat(test['du'])
|
|
|
|
|
tzinfo = valid_from.tzinfo
|
|
|
|
|
valid = valid and \
|
|
|
|
|
valid_from <= datetime.datetime.now(tzinfo) <= valid_until
|
|
|
|
|
else:
|
|
|
|
|
print("Type de passe inconnu.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if valid:
|
|
|
|
|
print("Pass sanitaire valide")
|
|
|
|
|
|
|
|
|
|
# Information utile
|
|
|
|
|
p = payload[-260][1]
|
|
|
|
|
|
|
|
|
|
print("Nom :", p['nam']['fn'])
|
|
|
|
|
print("Prénom :", p['nam']['gn'])
|
|
|
|
|
print("Date de naissance :", p['dob'])
|
|
|
|
|
|
|
|
|
|
if additional_info:
|
|
|
|
|
# TODO Meilleur affichage
|
|
|
|
|
if 'v' in p:
|
|
|
|
|
# Vaccination
|
|
|
|
|
# TODO Meilleur affichage
|
|
|
|
|
print("Informations de vaccination :", p['v'])
|
|
|
|
|
else:
|
|
|
|
|
# TODO Gérer les tests positifs / négatifs
|
|
|
|
|
print("Informations de test :", p)
|
|
|
|
|
print("Informations de vaccination :",
|
|
|
|
|
json.dumps(p['v'][0], indent=2))
|
|
|
|
|
elif 't' in p:
|
|
|
|
|
print("Informations de test :",
|
|
|
|
|
json.dumps(p['t'][0], indent=2))
|
|
|
|
|
elif 'r' in p:
|
|
|
|
|
print("Informations de test :",
|
|
|
|
|
json.dumps(p['r'][0], indent=2))
|
|
|
|
|
else:
|
|
|
|
|
print("Pass sanitaire invalide")
|
|
|
|
|
|
|
|
|
|
return valid
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
|