Skip to content

Commit deac269

Browse files
authored
Merge pull request #16 from IdentityPython/feat/status_list_support
Status claim support
2 parents e873c8a + 310c4d8 commit deac269

File tree

4 files changed

+96
-2
lines changed

4 files changed

+96
-2
lines changed

pymdoccbor/mdoc/exceptions.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,6 @@ class NoSignedDocumentProvided(Exception):
99

1010
class MissingIssuerAuth(Exception):
1111
pass
12+
13+
class InvalidStatusDescriptor(Exception):
14+
pass

pymdoccbor/mdoc/issuer.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from pymdoccbor.mso.issuer import MsoIssuer
1212

1313
from cbor_diag import cbor2diag
14+
from pymdoccbor.mdoc.exceptions import InvalidStatusDescriptor
1415

1516

1617
logger = logging.getLogger("pymdoccbor")
@@ -74,7 +75,8 @@ def new(
7475
validity: dict = None,
7576
devicekeyinfo: Union[dict, CoseKey, str] = None,
7677
cert_path: str = None,
77-
revocation: dict = None
78+
revocation: dict = None,
79+
status: dict = None
7880
) -> dict:
7981
"""
8082
create a new mdoc with signed mso
@@ -85,6 +87,7 @@ def new(
8587
:param devicekeyinfo: Union[dict, CoseKey, str]: device key info
8688
:param cert_path: str: path to the certificate
8789
:param revocation: dict: revocation status dict it may include status_list and identifier_list keys
90+
:param status: dict: status dict that includes the status list's uri and the idx following the "https://datatracker.ietf.org/doc/draft-ietf-oauth-status-list" specification
8891
8992
:return: dict: signed mdoc
9093
"""
@@ -188,6 +191,17 @@ def new(
188191
"status": self.status,
189192
}
190193

194+
if status:
195+
if not "status_list" in status:
196+
raise InvalidStatusDescriptor("status_list is required")
197+
198+
if not "uri" in status["status_list"]:
199+
raise InvalidStatusDescriptor("uri is required")
200+
if not "idx" in status["status_list"]:
201+
raise InvalidStatusDescriptor("idx is required")
202+
203+
res["status"] = status
204+
191205
logger.debug(f"MSO diagnostic notation: {cbor2diag(mso_cbor)}")
192206

193207
self.signed = res

pymdoccbor/mdoc/verifier.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,8 @@ def verify(self) -> bool:
200200

201201
doc_cnt += 1
202202

203+
self.status = cdict.get('status', None)
204+
203205
return False if self.documents_invalid else True
204206

205207
def __repr__(self) -> str:

pymdoccbor/tests/test_08_mdoc_cbor.py

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ def test_mdoc_cbor_creation():
1818
"issuance_date": "2024-12-31",
1919
"expiry_date": "2050-12-31"
2020
},
21+
status={
22+
"status_list": {
23+
"idx": 412,
24+
"uri": "https://example.com/statuslists/1"
25+
}
26+
}
2127
)
2228

2329
data = cbor2.dumps(mdoc)
@@ -28,4 +34,73 @@ def test_mdoc_cbor_creation():
2834

2935
assert mdoc
3036
assert 'org.micov.medical.1' in mdocp.disclosure_map
31-
assert mdocp.disclosure_map == MICOV_DATA
37+
assert mdocp.disclosure_map == MICOV_DATA
38+
assert mdocp.status == {
39+
"status_list": {
40+
"idx": 412,
41+
"uri": "https://example.com/statuslists/1"
42+
}
43+
}
44+
45+
def test_mdoc_cbor_invalid_status():
46+
mdoci = MdocCborIssuer(
47+
private_key=PKEY,
48+
alg="ES256",
49+
)
50+
51+
try:
52+
mdoci.new(
53+
data=MICOV_DATA,
54+
#devicekeyinfo=PKEY, # TODO
55+
doctype="org.micov.medical.1",
56+
validity={
57+
"issuance_date": "2024-12-31",
58+
"expiry_date": "2050-12-31"
59+
},
60+
status={
61+
"status_list": {
62+
"idx": 412,
63+
# "uri": "https://example.com/statuslists/1" # Missing URI
64+
}
65+
}
66+
)
67+
except Exception as e:
68+
assert str(e) == "uri is required"
69+
70+
try:
71+
mdoci.new(
72+
data=MICOV_DATA,
73+
#devicekeyinfo=PKEY, # TODO
74+
doctype="org.micov.medical.1",
75+
validity={
76+
"issuance_date": "2024-12-31",
77+
"expiry_date": "2050-12-31"
78+
},
79+
status={
80+
"status_list": {
81+
#"idx": 412,
82+
"uri": "https://example.com/statuslists/1" # Missing URI
83+
}
84+
}
85+
)
86+
except Exception as e:
87+
assert str(e) == "idx is required"
88+
89+
try:
90+
mdoci.new(
91+
data=MICOV_DATA,
92+
#devicekeyinfo=PKEY, # TODO
93+
doctype="org.micov.medical.1",
94+
validity={
95+
"issuance_date": "2024-12-31",
96+
"expiry_date": "2050-12-31"
97+
},
98+
status={
99+
"not_status_list": {
100+
"idx": 412,
101+
"uri": "https://example.com/statuslists/1" # Missing URI
102+
}
103+
}
104+
)
105+
except Exception as e:
106+
assert str(e) == "status_list is required"

0 commit comments

Comments
 (0)