From f542f6646de7f01f826d12a08b0925be04052036 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Mon, 16 Aug 2021 17:41:07 +0200 Subject: [PATCH] =?UTF-8?q?V=C3=A9rification=20de=20validit=C3=A9=20des=20?= =?UTF-8?q?pass=20li=C3=A9s=20=C3=A0=20des=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Yohann D'ANELLO --- README.rst | 9 ++++++++ pscheck/pscheck.py | 53 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/README.rst b/README.rst index 5bc688c..302e6be 100644 --- a/README.rst +++ b/README.rst @@ -6,6 +6,15 @@ européen, tel que le fait l'application TAC-Vérif lors de la crise sanitaire de Covid-19 en 2021. +Dépendances +----------- + +Le script requiert Python >= 3.6 avec les modules : + + * cbor2 + * cryptography + + Usage ----- diff --git a/pscheck/pscheck.py b/pscheck/pscheck.py index e64edfb..ad663fa 100644 --- a/pscheck/pscheck.py +++ b/pscheck/pscheck.py @@ -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()