11from typing import Any , Dict , List
22
3- from certvalidator import CertificateValidator , ValidationContext
3+ from cryptography .x509 import Certificate , DNSName , load_der_x509_certificate
4+ from cryptography .x509 .oid import NameOID
5+ from cryptography .x509 .verification import PolicyBuilder , Store
46
57from ..cose_key_interface import COSEKeyInterface
68from ..exceptions import VerifyError
@@ -11,28 +13,32 @@ def __init__(self, params: Dict[int, Any]):
1113 super ().__init__ (params )
1214
1315 self ._key : Any = b""
14- self ._cert = b""
15- self ._intermediates = []
16+ self ._cert : Certificate = None
17+ self ._intermediates : List [ Certificate ] = []
1618
1719 if 33 in params :
1820 if not isinstance (params [33 ], (bytes , list )):
1921 raise ValueError ("x5c(33) should be bytes(bstr) or list." )
2022 certs = [params [33 ]] if isinstance (params [33 ], bytes ) else params [33 ]
21- self ._cert = certs [0 ]
23+ self ._cert = load_der_x509_certificate ( certs [0 ])
2224 if len (certs ) > 1 :
23- self ._intermediates = certs [1 :]
25+ for c in certs [1 :]:
26+ self ._intermediates .append (load_der_x509_certificate (c ))
2427 return
2528
26- def validate_certificate (self , ca_certs : List [bytes ]) -> bool :
29+ def validate_certificate (self , ca_certs : List [Certificate ]) -> bool :
2730 if not ca_certs :
2831 raise ValueError ("ca_certs should be set." )
2932 if not self ._cert :
3033 return False
3134
32- ctx = ValidationContext (trust_roots = ca_certs )
35+ store = Store (ca_certs )
36+ builder = PolicyBuilder ().store (store )
37+ verifier = builder .build_server_verifier (
38+ DNSName (self ._cert .subject .get_attributes_for_oid (NameOID .COMMON_NAME )[0 ].value )
39+ )
3340 try :
34- validator = CertificateValidator (self ._cert , self ._intermediates , validation_context = ctx )
35- validator .validate_usage (set (["digital_signature" ]), extended_optional = True )
41+ verifier .verify (self ._cert , self ._intermediates )
3642 except Exception as err :
3743 raise VerifyError ("Failed to validate the certificate bound to the key." ) from err
3844 return True
0 commit comments