Skip to content

Commit 9e63789

Browse files
authored
Merge pull request #13 from IdentityPython/feat/MdocCbor_disclosure_map
[Presentation] Mdoc Cbor disclosure map
2 parents 6416235 + ca70e22 commit 9e63789

File tree

4 files changed

+37
-7
lines changed

4 files changed

+37
-7
lines changed

pymdoccbor/mdoc/issuer.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
import binascii
33
import cbor2
44
import logging
5-
import datetime
5+
from datetime import datetime, timezone
66
from cryptography.hazmat.primitives import serialization
77
from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePublicKey
88
from pycose.keys import CoseKey, EC2Key
99
from typing import Union
1010

1111
from pymdoccbor.mso.issuer import MsoIssuer
1212

13-
from cbor_diag import *
13+
from cbor_diag import cbor2diag
1414

1515

1616
logger = logging.getLogger("pymdoccbor")
@@ -159,7 +159,7 @@ def new(
159159
revocation=revocation
160160
)
161161

162-
mso = msoi.sign(doctype=doctype, device_key=devicekeyinfo,valid_from=datetime.datetime.now(datetime.UTC))
162+
mso = msoi.sign(doctype=doctype, device_key=devicekeyinfo,valid_from=datetime.now(timezone.utc))
163163

164164
mso_cbor = mso.encode(
165165
tag=False,

pymdoccbor/mdoc/verifier.py

+31
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ def __init__(self) -> None:
104104

105105
self.documents: List[MobileDocument] = []
106106
self.documents_invalid: list = []
107+
self.disclosure_map: dict = {}
107108

108109
def loads(self, data: str) -> None:
109110
"""
@@ -134,6 +135,33 @@ def dumps(self) -> bytes:
134135
@property
135136
def data_as_string(self) -> str:
136137
return self.dumps().decode()
138+
139+
def _decode_claims(self, claims: list[dict]) -> dict:
140+
decoded_claims = {}
141+
142+
for claim in claims:
143+
decoded = cbor2.loads(claim.value)
144+
145+
if isinstance(decoded['elementValue'], cbor2.CBORTag):
146+
decoded_claims[decoded['elementIdentifier']] = decoded['elementValue'].value
147+
elif isinstance(decoded['elementValue'], list):
148+
claims_list = []
149+
150+
for element in decoded['elementValue']:
151+
claims_dict = {}
152+
for key, value in element.items():
153+
if isinstance(value, cbor2.CBORTag):
154+
claims_dict[key] = value.value
155+
else:
156+
claims_dict[key] = value
157+
claims_list.append(claims_dict)
158+
159+
decoded_claims[decoded['elementIdentifier']] = claims_list
160+
else:
161+
decoded_claims[decoded['elementIdentifier']] = decoded['elementValue']
162+
163+
return decoded_claims
164+
137165

138166
def verify(self) -> bool:
139167
""""
@@ -160,6 +188,9 @@ def verify(self) -> bool:
160188
else:
161189
self.documents_invalid.append(mso)
162190

191+
for namespace, claims in mso.issuersigned.namespaces.items():
192+
self.disclosure_map[namespace] = self._decode_claims(claims)
193+
163194
except Exception as e:
164195
logger.error(
165196
f"COSE Sign1 validation failed to the document number #{doc_cnt}. "

pymdoccbor/tests/test_08_mdoc_cbor.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,6 @@ def test_mdoc_cbor_creation():
2626
mdocp.loads(data)
2727
mdocp.verify()
2828

29-
assert mdoc
29+
assert mdoc
30+
assert 'org.micov.medical.1' in mdocp.disclosure_map
31+
assert mdocp.disclosure_map == MICOV_DATA

pymdoccbor/x509.py

-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import datetime
2-
import os
3-
41
from cwt import COSEKey
52
from typing import Union
63

0 commit comments

Comments
 (0)