From 456deeaa270e315c700f89145e0396de74e75771 Mon Sep 17 00:00:00 2001 From: PascalDR Date: Thu, 20 Mar 2025 16:42:20 +0100 Subject: [PATCH 1/6] fix: import --- pymdoccbor/mdoc/issuer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymdoccbor/mdoc/issuer.py b/pymdoccbor/mdoc/issuer.py index 8dbe415..755e78c 100644 --- a/pymdoccbor/mdoc/issuer.py +++ b/pymdoccbor/mdoc/issuer.py @@ -10,7 +10,7 @@ from pymdoccbor.mso.issuer import MsoIssuer -from cbor_diag import * +from cbor_diag import cbor2diag logger = logging.getLogger("pymdoccbor") From f516b2819bfacf6c36a5b62483fe57df991b6d6b Mon Sep 17 00:00:00 2001 From: PascalDR Date: Thu, 20 Mar 2025 16:42:43 +0100 Subject: [PATCH 2/6] feat: added disclosure map --- pymdoccbor/mdoc/verifier.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/pymdoccbor/mdoc/verifier.py b/pymdoccbor/mdoc/verifier.py index 51ae9b7..941a90d 100644 --- a/pymdoccbor/mdoc/verifier.py +++ b/pymdoccbor/mdoc/verifier.py @@ -104,6 +104,7 @@ def __init__(self) -> None: self.documents: List[MobileDocument] = [] self.documents_invalid: list = [] + self.disclosure_map: dict = {} def loads(self, data: str) -> None: """ @@ -134,6 +135,33 @@ def dumps(self) -> bytes: @property def data_as_string(self) -> str: return self.dumps().decode() + + def _deode_claims(self, claims: list[dict]) -> dict: + decoded_claims = {} + + for claim in claims: + decoded = cbor2.loads(claim.value) + + if isinstance(decoded['elementValue'], cbor2.CBORTag): + decoded_claims[decoded['elementIdentifier']] = decoded['elementValue'].value + elif isinstance(decoded['elementValue'], list): + claims_list = [] + + for element in decoded['elementValue']: + claims_dict = {} + for key, value in element.items(): + if isinstance(value, cbor2.CBORTag): + claims_dict[key] = value.value + else: + claims_dict[key] = value + claims_list.append(claims_dict) + + decoded_claims[decoded['elementIdentifier']] = claims_list + else: + decoded_claims[decoded['elementIdentifier']] = decoded['elementValue'] + + return decoded_claims + def verify(self) -> bool: """" @@ -160,6 +188,9 @@ def verify(self) -> bool: else: self.documents_invalid.append(mso) + for namespace, claims in mso.issuersigned.namespaces.items(): + self.disclosure_map[namespace] = self._deode_claims(claims) + except Exception as e: logger.error( f"COSE Sign1 validation failed to the document number #{doc_cnt}. " From 7b27d7561b09a07d73e9d87f362a6b842fce77fc Mon Sep 17 00:00:00 2001 From: PascalDR Date: Thu, 20 Mar 2025 16:42:53 +0100 Subject: [PATCH 3/6] tests: adapted tests --- pymdoccbor/tests/test_08_mdoc_cbor.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pymdoccbor/tests/test_08_mdoc_cbor.py b/pymdoccbor/tests/test_08_mdoc_cbor.py index eab9e88..c184a34 100644 --- a/pymdoccbor/tests/test_08_mdoc_cbor.py +++ b/pymdoccbor/tests/test_08_mdoc_cbor.py @@ -26,4 +26,6 @@ def test_mdoc_cbor_creation(): mdocp.loads(data) mdocp.verify() - assert mdoc \ No newline at end of file + assert mdoc + assert 'org.micov.medical.1' in mdocp.disclosure_map + assert mdocp.disclosure_map == MICOV_DATA \ No newline at end of file From 2bc4e4d76b953d8291dac9a713929053902b3922 Mon Sep 17 00:00:00 2001 From: PascalDR Date: Thu, 20 Mar 2025 17:04:58 +0100 Subject: [PATCH 4/6] fix: unused imports --- pymdoccbor/x509.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/pymdoccbor/x509.py b/pymdoccbor/x509.py index a2f8f12..b939435 100644 --- a/pymdoccbor/x509.py +++ b/pymdoccbor/x509.py @@ -1,6 +1,3 @@ -import datetime -import os - from cwt import COSEKey from typing import Union From c104464ab0ddefa35bdcd63cd1e41f61d82b7ca6 Mon Sep 17 00:00:00 2001 From: PascalDR Date: Thu, 20 Mar 2025 17:05:45 +0100 Subject: [PATCH 5/6] fix: datetime --- pymdoccbor/mdoc/issuer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymdoccbor/mdoc/issuer.py b/pymdoccbor/mdoc/issuer.py index 755e78c..20cd22f 100644 --- a/pymdoccbor/mdoc/issuer.py +++ b/pymdoccbor/mdoc/issuer.py @@ -2,7 +2,7 @@ import binascii import cbor2 import logging -import datetime +from datetime import datetime, timezone from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePublicKey from pycose.keys import CoseKey, EC2Key @@ -159,7 +159,7 @@ def new( revocation=revocation ) - mso = msoi.sign(doctype=doctype, device_key=devicekeyinfo,valid_from=datetime.datetime.now(datetime.UTC)) + mso = msoi.sign(doctype=doctype, device_key=devicekeyinfo,valid_from=datetime.now(timezone.utc)) mso_cbor = mso.encode( tag=False, From ca70e22bfa274303225ea760e33249e3158007e7 Mon Sep 17 00:00:00 2001 From: PascalDR Date: Thu, 20 Mar 2025 18:07:15 +0100 Subject: [PATCH 6/6] fix: typo --- pymdoccbor/mdoc/verifier.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymdoccbor/mdoc/verifier.py b/pymdoccbor/mdoc/verifier.py index 941a90d..0e6257c 100644 --- a/pymdoccbor/mdoc/verifier.py +++ b/pymdoccbor/mdoc/verifier.py @@ -136,7 +136,7 @@ def dumps(self) -> bytes: def data_as_string(self) -> str: return self.dumps().decode() - def _deode_claims(self, claims: list[dict]) -> dict: + def _decode_claims(self, claims: list[dict]) -> dict: decoded_claims = {} for claim in claims: @@ -189,7 +189,7 @@ def verify(self) -> bool: self.documents_invalid.append(mso) for namespace, claims in mso.issuersigned.namespaces.items(): - self.disclosure_map[namespace] = self._deode_claims(claims) + self.disclosure_map[namespace] = self._decode_claims(claims) except Exception as e: logger.error(