@@ -648,6 +648,26 @@ def _build_transforms_for_reference(transforms_node, reference, exclude_c14n_tra
648648 def test_excision_of_untrusted_comments (self ):
649649 pass # TODO: test comments excision
650650
651+ def test_mismatched_key_value_with_x509_data (self ):
652+ crt , key = self .load_example_keys ()
653+ data = etree .parse (os .path .join (os .path .dirname (__file__ ), "example.xml" )).getroot ()
654+ signer = XMLSigner ()
655+ signed = signer .sign (data , key = key , cert = crt , always_add_key_value = True )
656+ key_info = signed .find (".//ds:KeyInfo" , namespaces = namespaces )
657+ key_value = key_info .find ("ds:KeyValue" , namespaces = namespaces )
658+ key_info .remove (key_value )
659+ mismatched_key = rsa .generate_private_key (public_exponent = 65537 , key_size = 2048 )
660+ signer ._serialize_key_value (mismatched_key , key_info )
661+ signed_xml = etree .tostring (signed )
662+
663+ with self .assertRaisesRegex (
664+ InvalidInput ,
665+ "Both X509Data and KeyValue found and they represent different public keys" ,
666+ ):
667+ XMLVerifier ().verify (signed_xml , x509_cert = crt )
668+
669+ XMLVerifier ().verify (signed_xml , x509_cert = crt , ignore_ambiguous_key_info = True )
670+
651671 def test_ws_security (self ):
652672 wsse_dir = os .path .join (interop_dir , "ws-security" , "ws.js" )
653673 with open (os .path .join (wsse_dir , "examples" , "server_public.pem" ), "rb" ) as fh :
0 commit comments