Skip to content

Commit f1b3f93

Browse files
committed
Related to #53. Support sign validation of different kinds of algorithm
1 parent fc407d4 commit f1b3f93

File tree

3 files changed

+15
-11
lines changed

3 files changed

+15
-11
lines changed

src/onelogin/saml2/logout_request.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -306,9 +306,6 @@ def is_valid(self, request_data):
306306
else:
307307
sign_alg = get_data['SigAlg']
308308

309-
if sign_alg != OneLogin_Saml2_Constants.RSA_SHA1:
310-
raise Exception('Invalid signAlg in the recieved Logout Request')
311-
312309
signed_query = 'SAMLRequest=%s' % quote_plus(get_data['SAMLRequest'])
313310
if 'RelayState' in get_data:
314311
signed_query = '%s&RelayState=%s' % (signed_query, quote_plus(get_data['RelayState']))
@@ -318,12 +315,12 @@ def is_valid(self, request_data):
318315
raise Exception('In order to validate the sign on the Logout Request, the x509cert of the IdP is required')
319316
cert = idp_data['x509cert']
320317

321-
if not OneLogin_Saml2_Utils.validate_binary_sign(signed_query, b64decode(get_data['Signature']), cert):
318+
if not OneLogin_Saml2_Utils.validate_binary_sign(signed_query, b64decode(get_data['Signature']), cert, sign_alg):
322319
raise Exception('Signature validation failed. Logout Request rejected')
323320

324321
return True
325322
except Exception as err:
326-
# pylint: disable=R0801
323+
# pylint: disable=R0801sign_alg
327324
self.__error = err.__str__()
328325
debug = self.__settings.is_debug_active()
329326
if debug:

src/onelogin/saml2/logout_response.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,6 @@ def is_valid(self, request_data, request_id=None):
120120
else:
121121
sign_alg = get_data['SigAlg']
122122

123-
if sign_alg != OneLogin_Saml2_Constants.RSA_SHA1:
124-
raise Exception('Invalid signAlg in the recieved Logout Response')
125-
126123
signed_query = 'SAMLResponse=%s' % quote_plus(get_data['SAMLResponse'])
127124
if 'RelayState' in get_data:
128125
signed_query = '%s&RelayState=%s' % (signed_query, quote_plus(get_data['RelayState']))
@@ -132,7 +129,7 @@ def is_valid(self, request_data, request_id=None):
132129
raise Exception('In order to validate the sign on the Logout Response, the x509cert of the IdP is required')
133130
cert = idp_data['x509cert']
134131

135-
if not OneLogin_Saml2_Utils.validate_binary_sign(signed_query, b64decode(get_data['Signature']), cert):
132+
if not OneLogin_Saml2_Utils.validate_binary_sign(signed_query, b64decode(get_data['Signature']), cert, sign_alg):
136133
raise Exception('Signature validation failed. Logout Response rejected')
137134

138135
return True

src/onelogin/saml2/utils.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -963,7 +963,7 @@ def validate_sign(xml, cert=None, fingerprint=None, fingerprintalg='sha1', valid
963963
return False
964964

965965
@staticmethod
966-
def validate_binary_sign(signed_query, signature, cert=None, algorithm=xmlsec.TransformRsaSha1, debug=False):
966+
def validate_binary_sign(signed_query, signature, cert=None, algorithm=OneLogin_Saml2_Constants.RSA_SHA1, debug=False):
967967
"""
968968
Validates signed bynary data (Used to validate GET Signature).
969969
@@ -995,7 +995,17 @@ def validate_binary_sign(signed_query, signature, cert=None, algorithm=xmlsec.Tr
995995
dsig_ctx.signKey = xmlsec.Key.load(file_cert.name, xmlsec.KeyDataFormatCertPem, None)
996996
file_cert.close()
997997

998-
dsig_ctx.verifyBinary(signed_query, algorithm, signature)
998+
# Sign the metadata with our private key.
999+
sign_algorithm_transform_map = {
1000+
OneLogin_Saml2_Constants.DSA_SHA1: xmlsec.TransformDsaSha1,
1001+
OneLogin_Saml2_Constants.RSA_SHA1: xmlsec.TransformRsaSha1,
1002+
OneLogin_Saml2_Constants.RSA_SHA256: xmlsec.TransformRsaSha256,
1003+
OneLogin_Saml2_Constants.RSA_SHA384: xmlsec.TransformRsaSha384,
1004+
OneLogin_Saml2_Constants.RSA_SHA512: xmlsec.TransformRsaSha512
1005+
}
1006+
sign_algorithm_transform = sign_algorithm_transform_map.get(algorithm, xmlsec.TransformRsaSha1)
1007+
1008+
dsig_ctx.verifyBinary(signed_query, sign_algorithm_transform, signature)
9991009
return True
10001010
except Exception:
10011011
return False

0 commit comments

Comments
 (0)