Skip to content

Conversation

@FlavPMU
Copy link
Contributor

@FlavPMU FlavPMU commented Jan 30, 2026

PR in order to verify X.509 MSO signature and compare hashes.

this PR includes also optionnal error fields

- Add optional 'errors' parameter to MobileDocument.__init__()
- Include 'errors' field in dump() output when present
- Add comprehensive test suite (test_09_errors_field.py)
- Fixes TypeError when parsing Device Response with status != 0
- ISO 18013-5 compliance for error handling
- All tests pass (36/36)
- fix: handle simple values in list elements within _decode_claims
  When elementValue is a list (e.g., nationality: ['FR']), elements can be
  simple values (strings, numbers) instead of dicts. Added check to handle
  both cases instead of assuming all elements have .items() method.

See docs/FIX_ERRORS_FIELD.md for detailed documentation
feat: add element hash verification against MSO valueDigests

- Add trusted_root_certs parameter to verify() methods
- Verify DS certificate is signed by trusted IACA root
- Verify certificate validity dates
- Store verified root certificate in MsoVerifier.verified_root
- Backward compatible: skips validation if trusted_root_certs is None
- Add comprehensive documentation in docs/certificate_chain_verification.md
- Add verify_element_hashes() method to MsoVerifier
- Verify SHA-256 hash of each IssuerSignedItem against MSO
- Add verify_hashes parameter to verify() methods (default: True)
- Store verification results in MobileDocument.hash_verification
- Handle CBORTag objects properly when computing hashes
- Update documentation with hash verification details and examples
@peppelinux peppelinux self-requested a review January 30, 2026 14:06
Comment on lines +134 to +137
# Verify certificate chain
from cryptography import x509
from cryptography.hazmat.primitives import hashes
from cryptography.exceptions import InvalidSignature
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please move these in the top of this file,

we never nest import statements within class/object methods or function definitions

Comment on lines +134 to +137
# Verify certificate chain
from cryptography import x509
from cryptography.hazmat.primitives import hashes
from cryptography.exceptions import InvalidSignature
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# Verify certificate chain
from cryptography import x509
from cryptography.hazmat.primitives import hashes
from cryptography.exceptions import InvalidSignature

from pymdoccbor.exceptions import InvalidMdoc
from pymdoccbor.mdoc.issuersigned import IssuerSigned
from pymdoccbor.mdoc.exceptions import NoDocumentTypeProvided, NoSignedDocumentProvided

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# Verify certificate chain
from cryptography import x509
from cryptography.hazmat.primitives import hashes
from cryptography.exceptions import InvalidSignature

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed in new PR

@peppelinux peppelinux merged commit 4c0daf1 into IdentityPython:main Jan 30, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants