From b8b32fe189d5dcf0b22d27f9258a376bbb17d1bb Mon Sep 17 00:00:00 2001 From: LucasVerdelho Date: Tue, 19 Mar 2024 19:18:27 +0000 Subject: [PATCH] Imported certificate loading --- TPs/TP05/sig_fich.py | 50 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 TPs/TP05/sig_fich.py diff --git a/TPs/TP05/sig_fich.py b/TPs/TP05/sig_fich.py new file mode 100644 index 0000000..2d1f256 --- /dev/null +++ b/TPs/TP05/sig_fich.py @@ -0,0 +1,50 @@ +from cryptography import x509 +import datetime + +def cert_load(fname): + """ lê certificado de ficheiro """ + with open(fname, "rb") as fcert: + cert = x509.load_pem_x509_certificate(fcert.read()) + return cert + +def cert_validtime(cert, now=None): + """ valida que 'now' se encontra no período + de validade do certificado. """ + if now is None: + now = datetime.datetime.now(tz=datetime.timezone.utc) + if now < cert.not_valid_before_utc or now > cert.not_valid_after_utc: + raise x509.verification.VerificationError("Certificate is not valid at this time") + +def cert_validsubject(cert, attrs=[]): + """ verifica atributos do campo 'subject'. 'attrs' + é uma lista de pares '(attr,value)' que condiciona + os valores de 'attr' a 'value'. """ + print(cert.subject) + for attr in attrs: + if cert.subject.get_attributes_for_oid(attr[0])[0].value != attr[1]: + raise x509.verification.VerificationError("Certificate subject does not match expected value") + +def cert_validexts(cert, policy=[]): + """ valida extensões do certificado. 'policy' é uma lista de pares '(ext,pred)' onde 'ext' é o OID de uma extensão e 'pred' + o predicado responsável por verificar o conteúdo dessa extensão. """ + for check in policy: + ext = cert.extensions.get_extension_for_oid(check[0]).value + if not check[1](ext): + raise x509.verification.VerificationError("Certificate extensions does not match expected value") + +def valida_certALICE(ca_cert): + try: + cert = cert_load("ALICE.crt") + # obs: pressupõe que a cadeia de certifica só contém 2 níveis + cert.verify_directly_issued_by(ca_cert) + # verificar período de validade... + cert_validtime(cert) + # verificar identidade... (e.g.) + cert_validsubject(cert, [(x509.NameOID.COMMON_NAME, "ALICE")]) + # verificar aplicabilidade... (e.g.) + #cert_validexts(cert, [(x509.ExtensionOID.EXTENDED_KEY_USAGE, lambda e: x509.oid.ExtendedKeyUsageOID.CLIENT_AUTH in e)]) + #print("Certificate is valid!") + return True + except: + #print("Certificate is invalid!") + return False \ No newline at end of file