Vérification de validité des pass liés à des tests

Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
This commit is contained in:
Yohann D'ANELLO 2021-08-16 17:41:07 +02:00
parent d985d14eb9
commit f542f6646d
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
2 changed files with 54 additions and 8 deletions

View File

@ -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
-----

View File

@ -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()