Skip to content

Commit 3b84f65

Browse files
author
Hans Hörberg
committed
Added the possibility to set signature and digest algorithm on all the functions I identified.
pysaml2 has a default value for sign and digest. To make it possible to always use the same algorithm this default value has been replaced with a singleton class. The first time the singleton class is instantiated the sign and digest algorithm will be set. After that it cannot be changed. A good place to setup this single class is in the server setup. Example: ds.DefaultSignature(ds.SIG_RSA_SHA512, ds.DIGEST_SHA512)
1 parent 0f209eb commit 3b84f65

File tree

10 files changed

+701
-430
lines changed

10 files changed

+701
-430
lines changed

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ def run_tests(self):
4343
'pytest',
4444
'mako',
4545
'webob',
46+
'mock'
4647
#'pytest-coverage',
4748
]
4849

src/saml2/client.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ def prepare_for_negotiated_authenticate(
135135
raise SignOnError(
136136
"No supported bindings available for authentication")
137137

138-
def global_logout(self, name_id, reason="", expire=None, sign=None):
138+
def global_logout(self, name_id, reason="", expire=None, sign=None, sign_alg=None, digest_alg=None):
139139
""" More or less a layer of indirection :-/
140140
Bootstrapping the whole thing by finding all the IdPs that should
141141
be notified.
@@ -160,10 +160,10 @@ def global_logout(self, name_id, reason="", expire=None, sign=None):
160160

161161
# find out which IdPs/AAs I should notify
162162
entity_ids = self.users.issuers_of_info(name_id)
163-
return self.do_logout(name_id, entity_ids, reason, expire, sign)
163+
return self.do_logout(name_id, entity_ids, reason, expire, sign, sign_alg=sign_alg)
164164

165165
def do_logout(self, name_id, entity_ids, reason, expire, sign=None,
166-
expected_binding=None, **kwargs):
166+
expected_binding=None, sign_alg=None, digest_alg=None, **kwargs):
167167
"""
168168
169169
:param name_id: Identifier of the Subject (a NameID instance)
@@ -226,11 +226,11 @@ def do_logout(self, name_id, entity_ids, reason, expire, sign=None,
226226
key = None
227227
if sign:
228228
if binding == BINDING_HTTP_REDIRECT:
229-
sigalg = kwargs.get("sigalg", ds.sig_default)
229+
sigalg = kwargs.get("sigalg", ds.DefaultSignature().get_sign_alg())
230230
key = kwargs.get("key", self.signkey)
231231
srequest = str(request)
232232
else:
233-
srequest = self.sign(request)
233+
srequest = self.sign(request, sign_alg=sign_alg)
234234
else:
235235
srequest = str(request)
236236

@@ -290,7 +290,7 @@ def is_logged_in(self, name_id):
290290
identity = self.users.get_identity(name_id)[0]
291291
return bool(identity)
292292

293-
def handle_logout_response(self, response):
293+
def handle_logout_response(self, response, sign_alg=None, digest_alg=None):
294294
""" handles a Logout response
295295
296296
:param response: A response.Response instance
@@ -309,10 +309,12 @@ def handle_logout_response(self, response):
309309
return 0, "200 Ok", [("Content-type", "text/html")], []
310310
else:
311311
status["entity_ids"].remove(issuer)
312+
if "sign_alg" in status:
313+
sign_alg = status["sign_alg"]
312314
return self.do_logout(decode(status["name_id"]),
313315
status["entity_ids"],
314316
status["reason"], status["not_on_or_after"],
315-
status["sign"])
317+
status["sign"], sign_alg=sign_alg)
316318

317319
def _use_soap(self, destination, query_type, **kwargs):
318320
_create_func = getattr(self, "create_%s" % query_type)

src/saml2/client_base.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ def create_authn_request(self, destination, vorg="", scoping=None,
202202
nameid_format=None,
203203
service_url_binding=None, message_id=0,
204204
consent=None, extensions=None, sign=None,
205-
allow_create=False, sign_prepare=False, **kwargs):
205+
allow_create=False, sign_prepare=False, sign_alg=None, digest_alg=None, **kwargs):
206206
""" Creates an authentication request.
207207
208208
:param destination: Where the request should be sent.
@@ -339,15 +339,15 @@ def create_authn_request(self, destination, vorg="", scoping=None,
339339
return self._message(AuthnRequest, destination, message_id,
340340
consent, extensions, sign, sign_prepare,
341341
protocol_binding=binding,
342-
scoping=scoping, nsprefix=nsprefix, **args)
342+
scoping=scoping, nsprefix=nsprefix, sign_alg=sign_alg, **args)
343343
return self._message(AuthnRequest, destination, message_id, consent,
344344
extensions, sign, sign_prepare,
345345
protocol_binding=binding,
346-
scoping=scoping, nsprefix=nsprefix, **args)
346+
scoping=scoping, nsprefix=nsprefix, sign_alg=sign_alg, **args)
347347

348348
def create_attribute_query(self, destination, name_id=None,
349349
attribute=None, message_id=0, consent=None,
350-
extensions=None, sign=False, sign_prepare=False,
350+
extensions=None, sign=False, sign_prepare=False, sign_alg=None, digest_alg=None,
351351
**kwargs):
352352
""" Constructs an AttributeQuery
353353
@@ -404,15 +404,15 @@ def create_attribute_query(self, destination, name_id=None,
404404

405405
return self._message(AttributeQuery, destination, message_id, consent,
406406
extensions, sign, sign_prepare, subject=subject,
407-
attribute=attribute, nsprefix=nsprefix)
407+
attribute=attribute, nsprefix=nsprefix, sign_alg=sign_alg)
408408

409409
# MUST use SOAP for
410410
# AssertionIDRequest, SubjectQuery,
411411
# AuthnQuery, AttributeQuery, or AuthzDecisionQuery
412412
def create_authz_decision_query(self, destination, action,
413413
evidence=None, resource=None, subject=None,
414414
message_id=0, consent=None, extensions=None,
415-
sign=None, **kwargs):
415+
sign=None, sign_alg=None, digest_alg=None, **kwargs):
416416
""" Creates an authz decision query.
417417
418418
:param destination: The IdP endpoint
@@ -430,7 +430,7 @@ def create_authz_decision_query(self, destination, action,
430430
return self._message(AuthzDecisionQuery, destination, message_id,
431431
consent, extensions, sign, action=action,
432432
evidence=evidence, resource=resource,
433-
subject=subject, **kwargs)
433+
subject=subject, sign_alg=sign_alg, **kwargs)
434434

435435
def create_authz_decision_query_using_assertion(self, destination,
436436
assertion, action=None,
@@ -482,7 +482,7 @@ def create_assertion_id_request(assertion_id_refs, **kwargs):
482482

483483
def create_authn_query(self, subject, destination=None, authn_context=None,
484484
session_index="", message_id=0, consent=None,
485-
extensions=None, sign=False, nsprefix=None):
485+
extensions=None, sign=False, nsprefix=None, sign_alg=None, digest_alg=None):
486486
"""
487487
488488
:param subject: The subject its all about as a <Subject> instance
@@ -499,14 +499,14 @@ def create_authn_query(self, subject, destination=None, authn_context=None,
499499
extensions, sign, subject=subject,
500500
session_index=session_index,
501501
requested_authn_context=authn_context,
502-
nsprefix=nsprefix)
502+
nsprefix=nsprefix, sign_alg=sign_alg)
503503

504504
def create_name_id_mapping_request(self, name_id_policy,
505505
name_id=None, base_id=None,
506506
encrypted_id=None, destination=None,
507507
message_id=0, consent=None,
508508
extensions=None, sign=False,
509-
nsprefix=None):
509+
nsprefix=None, sign_alg=None, digest_alg=None):
510510
"""
511511
512512
:param name_id_policy:
@@ -528,17 +528,17 @@ def create_name_id_mapping_request(self, name_id_policy,
528528
return self._message(NameIDMappingRequest, destination, message_id,
529529
consent, extensions, sign,
530530
name_id_policy=name_id_policy, name_id=name_id,
531-
nsprefix=nsprefix)
531+
nsprefix=nsprefix, sign_alg=sign_alg)
532532
elif base_id:
533533
return self._message(NameIDMappingRequest, destination, message_id,
534534
consent, extensions, sign,
535535
name_id_policy=name_id_policy, base_id=base_id,
536-
nsprefix=nsprefix)
536+
nsprefix=nsprefix, sign_alg=sign_alg)
537537
else:
538538
return self._message(NameIDMappingRequest, destination, message_id,
539539
consent, extensions, sign,
540540
name_id_policy=name_id_policy,
541-
encrypted_id=encrypted_id, nsprefix=nsprefix)
541+
encrypted_id=encrypted_id, nsprefix=nsprefix, sign_alg=sign_alg)
542542

543543
# ======== response handling ===========
544544

0 commit comments

Comments
 (0)