Skip to content

Commit cff1391

Browse files
author
Roland Hedberg
committed
Merge pull request #289 from HaToHo/master
Try 999. :) Added to possibility to manually set sign and digest alg. as well the possibility to change the default values for sign and digest alg.
2 parents 48c2121 + be15a1e commit cff1391

File tree

14 files changed

+334
-90
lines changed

14 files changed

+334
-90
lines changed

example/idp2/idp.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
from idp_user import USERS
5050
from idp_user import EXTRA
5151
from mako.lookup import TemplateLookup
52+
import saml2.xmldsig as ds
5253

5354
logger = logging.getLogger("saml2.idp")
5455
logger.setLevel(logging.WARNING)
@@ -1068,6 +1069,18 @@ def application(environ, start_response):
10681069
HOST = CONFIG.HOST
10691070
PORT = CONFIG.PORT
10701071

1072+
sign_alg = None
1073+
digest_alg = None
1074+
try:
1075+
sign_alg = CONFIG.SIGN_ALG
1076+
except:
1077+
pass
1078+
try:
1079+
digest_alg = CONFIG.DIGEST_ALG
1080+
except:
1081+
pass
1082+
ds.DefaultSignature(sign_alg, digest_alg)
1083+
10711084
SRV = wsgiserver.CherryPyWSGIServer((HOST, PORT), application)
10721085

10731086
_https = ""

example/idp2/idp_conf.py.example

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ from saml2.saml import NAME_FORMAT_URI
88
from saml2.saml import NAMEID_FORMAT_TRANSIENT
99
from saml2.saml import NAMEID_FORMAT_PERSISTENT
1010
import os.path
11+
import saml2.xmldsig as ds
1112

1213
try:
1314
from saml2.sigver import get_xmlsec_binary
@@ -39,6 +40,11 @@ else:
3940
SERVER_CERT = "pki/mycert.pem"
4041
SERVER_KEY = "pki/mykey.pem"
4142
CERT_CHAIN = ""
43+
SIGN_ALG = None
44+
DIGEST_ALG = None
45+
#SIGN_ALG = ds.SIG_RSA_SHA512
46+
#DIGEST_ALG = ds.DIGEST_SHA512
47+
4248

4349
CONFIG = {
4450
"entityid": "%s/idp.xml" % BASE,

example/sp-wsgi/service_conf.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
from saml2.assertion import Policy
2+
import saml2.xmldsig as ds
23

3-
HOST = '127.0.0.1'
4+
HOST = 'localhost'
45
PORT = 8087
56
HTTPS = False
7+
SIGN_ALG = None
8+
DIGEST_ALG = None
9+
#SIGN_ALG = ds.SIG_RSA_SHA512
10+
#DIGEST_ALG = ds.DIGEST_SHA512
611

712
# Which groups of entity categories to use
813
POLICY = Policy(

example/sp-wsgi/sp.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#from srtest import exception_trace
4646
from saml2.samlp import Extensions
4747
from saml2 import xmldsig as ds
48+
import saml2.xmldsig as ds
4849

4950
logger = logging.getLogger("")
5051
hdlr = logging.FileHandler('spx.log')
@@ -890,6 +891,17 @@ def application(environ, start_response):
890891
POLICY = service_conf.POLICY
891892

892893
add_urls()
894+
sign_alg = None
895+
digest_alg = None
896+
try:
897+
sign_alg = service_conf.SIGN_ALG
898+
except:
899+
pass
900+
try:
901+
digest_alg = service_conf.DIGEST_ALG
902+
except:
903+
pass
904+
ds.DefaultSignature(sign_alg, digest_alg)
893905

894906
SRV = wsgiserver.CherryPyWSGIServer((HOST, PORT), application)
895907

src/saml2/client.py

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

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

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

167167
def do_logout(self, name_id, entity_ids, reason, expire, sign=None,
168-
expected_binding=None, **kwargs):
168+
expected_binding=None, sign_alg=None, digest_alg=None, **kwargs):
169169
"""
170170
171171
:param name_id: Identifier of the Subject (a NameID instance)
@@ -230,11 +230,11 @@ def do_logout(self, name_id, entity_ids, reason, expire, sign=None,
230230
key = None
231231
if sign:
232232
if binding == BINDING_HTTP_REDIRECT:
233-
sigalg = kwargs.get("sigalg", ds.sig_default)
233+
sigalg = kwargs.get("sigalg", ds.DefaultSignature().get_sign_alg())
234234
key = kwargs.get("key", self.signkey)
235235
srequest = str(request)
236236
else:
237-
srequest = self.sign(request)
237+
srequest = self.sign(request, sign_alg=sign_alg, digest_alg=digest_alg)
238238
else:
239239
srequest = str(request)
240240

@@ -294,7 +294,7 @@ def is_logged_in(self, name_id):
294294
identity = self.users.get_identity(name_id)[0]
295295
return bool(identity)
296296

297-
def handle_logout_response(self, response):
297+
def handle_logout_response(self, response, sign_alg=None, digest_alg=None):
298298
""" handles a Logout response
299299
300300
:param response: A response.Response instance
@@ -313,10 +313,12 @@ def handle_logout_response(self, response):
313313
return 0, "200 Ok", [("Content-type", "text/html")], []
314314
else:
315315
status["entity_ids"].remove(issuer)
316+
if "sign_alg" in status:
317+
sign_alg = status["sign_alg"]
316318
return self.do_logout(decode(status["name_id"]),
317319
status["entity_ids"],
318320
status["reason"], status["not_on_or_after"],
319-
status["sign"])
321+
status["sign"], sign_alg=sign_alg, digest_alg=digest_alg)
320322

321323
def _use_soap(self, destination, query_type, **kwargs):
322324
_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
@@ -205,7 +205,7 @@ def create_authn_request(self, destination, vorg="", scoping=None,
205205
nameid_format=None,
206206
service_url_binding=None, message_id=0,
207207
consent=None, extensions=None, sign=None,
208-
allow_create=False, sign_prepare=False, **kwargs):
208+
allow_create=False, sign_prepare=False, sign_alg=None, digest_alg=None, **kwargs):
209209
""" Creates an authentication request.
210210
211211
:param destination: Where the request should be sent.
@@ -342,15 +342,15 @@ def create_authn_request(self, destination, vorg="", scoping=None,
342342
return self._message(AuthnRequest, destination, message_id,
343343
consent, extensions, sign, sign_prepare,
344344
protocol_binding=binding,
345-
scoping=scoping, nsprefix=nsprefix, **args)
345+
scoping=scoping, nsprefix=nsprefix, sign_alg=sign_alg, digest_alg=digest_alg, **args)
346346
return self._message(AuthnRequest, destination, message_id, consent,
347347
extensions, sign, sign_prepare,
348348
protocol_binding=binding,
349-
scoping=scoping, nsprefix=nsprefix, **args)
349+
scoping=scoping, nsprefix=nsprefix, sign_alg=sign_alg, digest_alg=digest_alg, **args)
350350

351351
def create_attribute_query(self, destination, name_id=None,
352352
attribute=None, message_id=0, consent=None,
353-
extensions=None, sign=False, sign_prepare=False,
353+
extensions=None, sign=False, sign_prepare=False, sign_alg=None, digest_alg=None,
354354
**kwargs):
355355
""" Constructs an AttributeQuery
356356
@@ -407,15 +407,15 @@ def create_attribute_query(self, destination, name_id=None,
407407

408408
return self._message(AttributeQuery, destination, message_id, consent,
409409
extensions, sign, sign_prepare, subject=subject,
410-
attribute=attribute, nsprefix=nsprefix)
410+
attribute=attribute, nsprefix=nsprefix, sign_alg=sign_alg, digest_alg=digest_alg)
411411

412412
# MUST use SOAP for
413413
# AssertionIDRequest, SubjectQuery,
414414
# AuthnQuery, AttributeQuery, or AuthzDecisionQuery
415415
def create_authz_decision_query(self, destination, action,
416416
evidence=None, resource=None, subject=None,
417417
message_id=0, consent=None, extensions=None,
418-
sign=None, **kwargs):
418+
sign=None, sign_alg=None, digest_alg=None, **kwargs):
419419
""" Creates an authz decision query.
420420
421421
:param destination: The IdP endpoint
@@ -433,7 +433,7 @@ def create_authz_decision_query(self, destination, action,
433433
return self._message(AuthzDecisionQuery, destination, message_id,
434434
consent, extensions, sign, action=action,
435435
evidence=evidence, resource=resource,
436-
subject=subject, **kwargs)
436+
subject=subject, sign_alg=sign_alg, digest_alg=digest_alg, **kwargs)
437437

438438
def create_authz_decision_query_using_assertion(self, destination,
439439
assertion, action=None,
@@ -485,7 +485,7 @@ def create_assertion_id_request(assertion_id_refs, **kwargs):
485485

486486
def create_authn_query(self, subject, destination=None, authn_context=None,
487487
session_index="", message_id=0, consent=None,
488-
extensions=None, sign=False, nsprefix=None):
488+
extensions=None, sign=False, nsprefix=None, sign_alg=None, digest_alg=None):
489489
"""
490490
491491
:param subject: The subject its all about as a <Subject> instance
@@ -502,14 +502,14 @@ def create_authn_query(self, subject, destination=None, authn_context=None,
502502
extensions, sign, subject=subject,
503503
session_index=session_index,
504504
requested_authn_context=authn_context,
505-
nsprefix=nsprefix)
505+
nsprefix=nsprefix, sign_alg=sign_alg, digest_alg=digest_alg)
506506

507507
def create_name_id_mapping_request(self, name_id_policy,
508508
name_id=None, base_id=None,
509509
encrypted_id=None, destination=None,
510510
message_id=0, consent=None,
511511
extensions=None, sign=False,
512-
nsprefix=None):
512+
nsprefix=None, sign_alg=None, digest_alg=None):
513513
"""
514514
515515
:param name_id_policy:
@@ -531,17 +531,17 @@ def create_name_id_mapping_request(self, name_id_policy,
531531
return self._message(NameIDMappingRequest, destination, message_id,
532532
consent, extensions, sign,
533533
name_id_policy=name_id_policy, name_id=name_id,
534-
nsprefix=nsprefix)
534+
nsprefix=nsprefix, sign_alg=sign_alg, digest_alg=digest_alg)
535535
elif base_id:
536536
return self._message(NameIDMappingRequest, destination, message_id,
537537
consent, extensions, sign,
538538
name_id_policy=name_id_policy, base_id=base_id,
539-
nsprefix=nsprefix)
539+
nsprefix=nsprefix, sign_alg=sign_alg, digest_alg=digest_alg)
540540
else:
541541
return self._message(NameIDMappingRequest, destination, message_id,
542542
consent, extensions, sign,
543543
name_id_policy=name_id_policy,
544-
encrypted_id=encrypted_id, nsprefix=nsprefix)
544+
encrypted_id=encrypted_id, nsprefix=nsprefix, sign_alg=sign_alg, digest_alg=digest_alg)
545545

546546
# ======== response handling ===========
547547

0 commit comments

Comments
 (0)