@@ -152,8 +152,8 @@ def process_slo(self, keep_local_session=False, request_id=None, delete_session_
152152
153153 security = self .__settings .get_security_data ()
154154 if 'logoutResponseSigned' in security and security ['logoutResponseSigned' ]:
155- parameters ['SigAlg' ] = OneLogin_Saml2_Constants . RSA_SHA1
156- parameters ['Signature' ] = self .build_response_signature (logout_response , parameters .get ('RelayState' , None ))
155+ parameters ['SigAlg' ] = security [ 'signatureAlgorithm' ]
156+ parameters ['Signature' ] = self .build_response_signature (logout_response , parameters .get ('RelayState' , None ), security [ 'signatureAlgorithm' ] )
157157
158158 return self .redirect_to (self .get_slo_url (), parameters )
159159 else :
@@ -274,8 +274,8 @@ def login(self, return_to=None, force_authn=False, is_passive=False):
274274
275275 security = self .__settings .get_security_data ()
276276 if security .get ('authnRequestsSigned' , False ):
277- parameters ['SigAlg' ] = OneLogin_Saml2_Constants . RSA_SHA1
278- parameters ['Signature' ] = self .build_request_signature (saml_request , parameters ['RelayState' ])
277+ parameters ['SigAlg' ] = security [ 'signatureAlgorithm' ]
278+ parameters ['Signature' ] = self .build_request_signature (saml_request , parameters ['RelayState' ], security [ 'signatureAlgorithm' ] )
279279 return self .redirect_to (self .get_sso_url (), parameters )
280280
281281 def logout (self , return_to = None , name_id = None , session_index = None ):
@@ -315,8 +315,8 @@ def logout(self, return_to=None, name_id=None, session_index=None):
315315
316316 security = self .__settings .get_security_data ()
317317 if security .get ('logoutRequestSigned' , False ):
318- parameters ['SigAlg' ] = OneLogin_Saml2_Constants . RSA_SHA1
319- parameters ['Signature' ] = self .build_request_signature (saml_request , parameters ['RelayState' ])
318+ parameters ['SigAlg' ] = security [ 'signatureAlgorithm' ]
319+ parameters ['Signature' ] = self .build_request_signature (saml_request , parameters ['RelayState' ], security [ 'signatureAlgorithm' ] )
320320 return self .redirect_to (slo_url , parameters )
321321
322322 def get_sso_url (self ):
@@ -342,7 +342,7 @@ def get_slo_url(self):
342342 url = idp_data ['singleLogoutService' ]['url' ]
343343 return url
344344
345- def build_request_signature (self , saml_request , relay_state ):
345+ def build_request_signature (self , saml_request , relay_state , sign_algorithm = OneLogin_Saml2_Constants . RSA_SHA1 ):
346346 """
347347 Builds the Signature of the SAML Request.
348348
@@ -351,21 +351,27 @@ def build_request_signature(self, saml_request, relay_state):
351351
352352 :param relay_state: The target URL the user should be redirected to
353353 :type relay_state: string
354+
355+ :param sign_algorithm: Signature algorithm method
356+ :type sign_algorithm: string
354357 """
355- return self .__build_signature (saml_request , relay_state , 'SAMLRequest' )
358+ return self .__build_signature (saml_request , relay_state , 'SAMLRequest' , sign_algorithm )
356359
357- def build_response_signature (self , saml_response , relay_state ):
360+ def build_response_signature (self , saml_response , relay_state , sign_algorithm = OneLogin_Saml2_Constants . RSA_SHA1 ):
358361 """
359362 Builds the Signature of the SAML Response.
360363 :param saml_request: The SAML Response
361364 :type saml_request: string
362365
363366 :param relay_state: The target URL the user should be redirected to
364367 :type relay_state: string
368+
369+ :param sign_algorithm: Signature algorithm method
370+ :type sign_algorithm: string
365371 """
366- return self .__build_signature (saml_response , relay_state , 'SAMLResponse' )
372+ return self .__build_signature (saml_response , relay_state , 'SAMLResponse' , sign_algorithm )
367373
368- def __build_signature (self , saml_data , relay_state , saml_type ):
374+ def __build_signature (self , saml_data , relay_state , saml_type , sign_algorithm = OneLogin_Saml2_Constants . RSA_SHA1 ):
369375 """
370376 Builds the Signature
371377 :param saml_data: The SAML Data
@@ -376,6 +382,9 @@ def __build_signature(self, saml_data, relay_state, saml_type):
376382
377383 :param saml_type: The target URL the user should be redirected to
378384 :type saml_type: string SAMLRequest | SAMLResponse
385+
386+ :param sign_algorithm: Signature algorithm method
387+ :type sign_algorithm: string
379388 """
380389 assert saml_type in ['SAMLRequest' , 'SAMLResponse' ]
381390
@@ -395,10 +404,20 @@ def __build_signature(self, saml_data, relay_state, saml_type):
395404
396405 saml_data_str = '%s=%s' % (saml_type , quote_plus (saml_data ))
397406 relay_state_str = 'RelayState=%s' % quote_plus (relay_state )
398- alg_str = 'SigAlg=%s' % quote_plus (OneLogin_Saml2_Constants . RSA_SHA1 )
407+ alg_str = 'SigAlg=%s' % quote_plus (sign_algorithm )
399408
400409 sign_data = [saml_data_str , relay_state_str , alg_str ]
401410 msg = '&' .join (sign_data )
402411
403- signature = dsig_ctx .signBinary (str (msg ), xmlsec .TransformRsaSha1 )
412+ # Sign the metadata with our private key.
413+ sign_algorithm_transform_map = {
414+ OneLogin_Saml2_Constants .DSA_SHA1 : xmlsec .TransformDsaSha1 ,
415+ OneLogin_Saml2_Constants .RSA_SHA1 : xmlsec .TransformRsaSha1 ,
416+ OneLogin_Saml2_Constants .RSA_SHA256 : xmlsec .TransformRsaSha256 ,
417+ OneLogin_Saml2_Constants .RSA_SHA384 : xmlsec .TransformRsaSha384 ,
418+ OneLogin_Saml2_Constants .RSA_SHA512 : xmlsec .TransformRsaSha512
419+ }
420+ sign_algorithm_transform = sign_algorithm_transform_map .get (sign_algorithm , xmlsec .TransformRsaSha1 )
421+
422+ signature = dsig_ctx .signBinary (str (msg ), sign_algorithm_transform )
404423 return b64encode (signature )
0 commit comments