Skip to content

Commit 908029b

Browse files
committed
verify: Support XAdES encapsulated certificates
1 parent 5b5437d commit 908029b

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

signxml/__init__.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
ec="http://www.w3.org/2001/10/xml-exc-c14n#",
2525
dsig_more="http://www.w3.org/2001/04/xmldsig-more#",
2626
xenc="http://www.w3.org/2001/04/xmlenc#",
27-
xenc11="http://www.w3.org/2009/xmlenc11#"
27+
xenc11="http://www.w3.org/2009/xmlenc11#",
28+
xades="http://uri.etsi.org/01903/v1.3.2#"
2829
)
2930

3031
def ds_tag(tag):
@@ -586,6 +587,13 @@ def _get_signature(self, root):
586587
else:
587588
return self._find(root, "Signature", anywhere=True)
588589

590+
def _get_certificates(self, signature, x509_data):
591+
certs = [cert.text for cert in self._findall(x509_data, "X509Certificate")]
592+
encapsulated_path = "ds:Object/xades:QualifyingProperties//xades:EncapsulatedX509Certificate"
593+
for encapsulated in signature.findall(encapsulated_path, namespaces=namespaces):
594+
certs.append(encapsulated.text)
595+
return certs
596+
589597
def _verify_signature_with_pubkey(self, signed_info_c14n, raw_signature, key_value, der_encoded_key_value,
590598
signature_alg):
591599
if der_encoded_key_value is not None:
@@ -823,7 +831,7 @@ def verify(self, data, require_x509=True, x509_cert=None, cert_subject_name=None
823831
if self.x509_cert is None:
824832
if x509_data is None:
825833
raise InvalidInput("Expected a X.509 certificate based signature")
826-
certs = [cert.text for cert in self._findall(x509_data, "X509Certificate")]
834+
certs = self._get_certificates(signature, x509_data)
827835
if len(certs) == 0:
828836
x509_iss = x509_data.find("ds:X509IssuerSerial/ds:X509IssuerName", namespaces=namespaces)
829837
x509_sn = x509_data.find("ds:X509IssuerSerial/ds:X509SerialNumber", namespaces=namespaces)

0 commit comments

Comments
 (0)