Skip to content

Commit 7bd46d0

Browse files
authored
certDigest verification by list number
1 parent 7433b08 commit 7bd46d0

File tree

1 file changed

+24
-23
lines changed

1 file changed

+24
-23
lines changed

signxml/xades/xades.py

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -272,33 +272,34 @@ class XAdESVerifier(XAdESProcessor, XMLVerifier):
272272
def _verify_signing_time(self, verify_result: VerifyResult):
273273
pass
274274

275-
def _verify_cert_digest(self, signing_cert_node, expect_cert):
276-
for cert in self._findall(signing_cert_node, "xades:Cert"):
277-
cert_digest = self._find(cert, "xades:CertDigest")
278-
digest_alg = DigestAlgorithm(self._find(cert_digest, "DigestMethod").get("Algorithm"))
279-
digest_value = self._find(cert_digest, "DigestValue")
280-
# check spec for specific method of retrieving cert
281-
der_encoded_cert = dump_certificate(FILETYPE_ASN1, expect_cert)
275+
def _verify_cert_digest(self, signing_cert_node, expect_cert,idx):
276+
cert = self._find(signing_cert_node, "xades:Cert[{0}]".format(idx):
277+
cert_digest = self._find(cert, "xades:CertDigest")
278+
digest_alg = DigestAlgorithm(self._find(cert_digest, "DigestMethod").get("Algorithm"))
279+
digest_value = self._find(cert_digest, "DigestValue")
280+
# check spec for specific method of retrieving cert
281+
der_encoded_cert = dump_certificate(FILETYPE_ASN1, expect_cert)
282282

283-
if b64decode(digest_value.text) != self._get_digest(der_encoded_cert, algorithm=digest_alg):
284-
raise InvalidDigest("Digest mismatch for certificate digest")
283+
if b64decode(digest_value.text) != self._get_digest(der_encoded_cert, algorithm=digest_alg):
284+
raise InvalidDigest("Digest mismatch for certificate digest")
285285

286286
def _verify_cert_digests(self, verify_result: VerifyResult):
287287
x509_data = verify_result.signature_xml.find("ds:KeyInfo/ds:X509Data", namespaces=namespaces)
288-
cert_from_key_info = load_certificate(
289-
FILETYPE_PEM, add_pem_header(self._find(x509_data, "X509Certificate").text)
290-
)
291-
signed_signature_props = self._find(verify_result.signed_xml, "xades:SignedSignatureProperties")
292-
signing_cert = self._find(signed_signature_props, "xades:SigningCertificate", require=False)
293-
signing_cert_v2 = self._find(signed_signature_props, "xades:SigningCertificateV2", require=False)
294-
if signing_cert is None and signing_cert_v2 is None:
295-
raise InvalidInput("Expected to find XML element xades:SigningCertificate or xades:SigningCertificateV2")
296-
if signing_cert is not None and signing_cert_v2 is not None:
297-
raise InvalidInput("Expected to find exactly one of xades:SigningCertificate or xades:SigningCertificateV2")
298-
if signing_cert is not None:
299-
self._verify_cert_digest(signing_cert, expect_cert=cert_from_key_info)
300-
elif signing_cert_v2 is not None:
301-
self._verify_cert_digest(signing_cert_v2, expect_cert=cert_from_key_info)
288+
for idx,x_cert in enumerate(self._findall(x509_data, "X509Certificate")):
289+
cert_from_key_info = load_certificate(
290+
FILETYPE_PEM, add_pem_header(x_cert.text)
291+
)
292+
signed_signature_props = self._find(verify_result.signed_xml, "xades:SignedSignatureProperties")
293+
signing_cert = self._find(signed_signature_props, "xades:SigningCertificate", require=False)
294+
signing_cert_v2 = self._find(signed_signature_props, "xades:SigningCertificateV2", require=False)
295+
if signing_cert is None and signing_cert_v2 is None:
296+
raise InvalidInput("Expected to find XML element xades:SigningCertificate or xades:SigningCertificateV2")
297+
if signing_cert is not None and signing_cert_v2 is not None:
298+
raise InvalidInput("Expected to find exactly one of xades:SigningCertificate or xades:SigningCertificateV2")
299+
if signing_cert is not None:
300+
self._verify_cert_digest(signing_cert, expect_cert=cert_from_key_info,idx=idx)
301+
elif signing_cert_v2 is not None:
302+
self._verify_cert_digest(signing_cert_v2, expect_cert=cert_from_key_info,idx=idx)
302303

303304
def _verify_signature_policy(self, verify_result: VerifyResult, expect_signature_policy: XAdESSignaturePolicy):
304305
signed_signature_props = self._find(verify_result.signed_xml, "xades:SignedSignatureProperties")

0 commit comments

Comments
 (0)