@@ -104,6 +104,7 @@ def is_valid(self, request_data, request_id=None, raise_exceptions=False):
104104 has_signed_response = '{%s}Response' % OneLogin_Saml2_Constants .NS_SAMLP in signed_elements
105105 has_signed_assertion = '{%s}Assertion' % OneLogin_Saml2_Constants .NS_SAML in signed_elements
106106
107+ security = self .__settings .get_security_data ()
107108 if self .__settings .is_strict ():
108109 no_valid_xml_msg = 'Invalid SAML Response. Not match the saml-schema-protocol-2.0.xsd'
109110 res = OneLogin_Saml2_Utils .validate_xml (
@@ -130,7 +131,6 @@ def is_valid(self, request_data, request_id=None, raise_exceptions=False):
130131 OneLogin_Saml2_ValidationError .INVALID_XML_FORMAT
131132 )
132133
133- security = self .__settings .get_security_data ()
134134 current_url = OneLogin_Saml2_Utils .get_self_url_no_query (request_data )
135135
136136 in_response_to = self .get_in_response_to ()
@@ -323,14 +323,14 @@ def is_valid(self, request_data, request_id=None, raise_exceptions=False):
323323 multicerts = idp_data ['x509certMulti' ]['signing' ]
324324
325325 # If find a Signature on the Response, validates it checking the original response
326- if has_signed_response and not OneLogin_Saml2_Utils .validate_sign (self .document , cert , fingerprint , fingerprintalg , xpath = OneLogin_Saml2_Utils .RESPONSE_SIGNATURE_XPATH , multicerts = multicerts , raise_exceptions = False ):
326+ if has_signed_response and not OneLogin_Saml2_Utils .validate_sign (self .document , cert , fingerprint , fingerprintalg , xpath = OneLogin_Saml2_Utils .RESPONSE_SIGNATURE_XPATH , multicerts = multicerts , raise_exceptions = False ):
327327 raise OneLogin_Saml2_ValidationError (
328328 'Signature validation failed. SAML Response rejected' ,
329329 OneLogin_Saml2_ValidationError .INVALID_SIGNATURE
330330 )
331331
332332 document_check_assertion = self .decrypted_document if self .encrypted else self .document
333- if has_signed_assertion and not OneLogin_Saml2_Utils .validate_sign (document_check_assertion , cert , fingerprint , fingerprintalg , xpath = OneLogin_Saml2_Utils .ASSERTION_SIGNATURE_XPATH , multicerts = multicerts , raise_exceptions = False ):
333+ if has_signed_assertion and not OneLogin_Saml2_Utils .validate_sign (document_check_assertion , cert , fingerprint , fingerprintalg , xpath = OneLogin_Saml2_Utils .ASSERTION_SIGNATURE_XPATH , multicerts = multicerts , raise_exceptions = False ):
334334 raise OneLogin_Saml2_ValidationError (
335335 'Signature validation failed. SAML Response rejected' ,
336336 OneLogin_Saml2_ValidationError .INVALID_SIGNATURE
@@ -688,6 +688,9 @@ def process_signed_elements(self):
688688 """
689689 sign_nodes = self .__query ('//ds:Signature' )
690690
691+ security = self .__settings .get_security_data ()
692+ reject_deprecated_alg = security .get ('rejectDeprecatedAlgorithm' , False )
693+
691694 signed_elements = []
692695 verified_seis = []
693696 verified_ids = []
@@ -736,6 +739,26 @@ def process_signed_elements(self):
736739 )
737740 verified_seis .append (sei )
738741
742+ # Check the signature and digest algorithm
743+ if reject_deprecated_alg :
744+ sig_method_node = OneLogin_Saml2_Utils .query (sign_node , './/ds:SignatureMethod' )
745+ if sig_method_node :
746+ sig_method = sig_method_node [0 ].get ("Algorithm" )
747+ if sig_method in OneLogin_Saml2_Constants .DEPRECATED_ALGORITHMS :
748+ raise OneLogin_Saml2_ValidationError (
749+ 'Deprecated signature algorithm found: %s' % sig_method ,
750+ OneLogin_Saml2_ValidationError .DEPRECATED_SIGNATURE_METHOD
751+ )
752+
753+ dig_method_node = OneLogin_Saml2_Utils .query (sign_node , './/ds:DigestMethod' )
754+ if dig_method_node :
755+ dig_method = dig_method_node [0 ].get ("Algorithm" )
756+ if dig_method in OneLogin_Saml2_Constants .DEPRECATED_ALGORITHMS :
757+ raise OneLogin_Saml2_ValidationError (
758+ 'Deprecated digest algorithm found: %s' % dig_method ,
759+ OneLogin_Saml2_ValidationError .DEPRECATED_DIGEST_METHOD
760+ )
761+
739762 signed_elements .append (signed_element )
740763
741764 if signed_elements :
0 commit comments