Skip to content

Commit 6200f15

Browse files
author
Roland Hedberg
committed
Reworked the security backend so you should now be able to use a HSM again for XML security. Support for non-XML crypto using HSMs are on the way.
1 parent 82d3b4d commit 6200f15

18 files changed

+470
-323
lines changed

example/idp2/idp.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,10 @@ def redirect(self):
389389
resp = BadRequest("Message signature verification failure")
390390
return resp(self.environ, self.start_response)
391391

392+
if not self.req_info:
393+
resp = BadRequest("Message parsing failed")
394+
return resp(self.environ, self.start_response)
395+
392396
_req = self.req_info.message
393397

394398
if "SigAlg" in saml_msg and "Signature" in saml_msg:
@@ -397,7 +401,8 @@ def redirect(self):
397401
_certs = IDP.metadata.certs(issuer, "any", "signing")
398402
verified_ok = False
399403
for cert in _certs:
400-
if verify_redirect_signature(saml_msg, cert):
404+
if verify_redirect_signature(saml_msg, IDP.sec.sec_backend,
405+
cert):
401406
verified_ok = True
402407
break
403408
if not verified_ok:

example/idp2/idp_uwsgi.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,8 @@ def redirect(self):
366366
_certs = IDP.metadata.certs(issuer, "any", "signing")
367367
verified_ok = False
368368
for cert in _certs:
369-
if verify_redirect_signature(saml_msg, cert):
369+
if verify_redirect_signature(saml_msg, IDP.sec.sec_backend,
370+
cert):
370371
verified_ok = True
371372
break
372373
if not verified_ok:

example/idp2_repoze/idp.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,8 @@ def redirect(self):
350350
_certs = IDP.metadata.certs(issuer, "any", "signing")
351351
verified_ok = False
352352
for cert in _certs:
353-
if verify_redirect_signature(_info, cert):
353+
if verify_redirect_signature(_info, IDP.sec.sec_backend,
354+
cert):
354355
verified_ok = True
355356
break
356357
if not verified_ok:

setup.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@
4747
"License :: OSI Approved :: Apache Software License",
4848
"Topic :: Software Development :: Libraries :: Python Modules",
4949
"Programming Language :: Python :: 2.7",
50-
"Programming Language :: Python :: 3.4"
50+
"Programming Language :: Python :: 3.4",
51+
"Programming Language :: Python :: 3.5"
5152
],
5253

5354
scripts=["tools/parse_xsd2.py", "tools/make_metadata.py",

src/saml2/client.py

+16-11
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ def prepare_for_authenticate(
6666
:return: session id and AuthnRequest info
6767
"""
6868

69-
reqid, negotiated_binding, info = self.prepare_for_negotiated_authenticate(
69+
reqid, negotiated_binding, info = \
70+
self.prepare_for_negotiated_authenticate(
7071
entityid=entityid,
7172
relay_state=relay_state,
7273
binding=binding,
@@ -137,7 +138,8 @@ def prepare_for_negotiated_authenticate(
137138
raise SignOnError(
138139
"No supported bindings available for authentication")
139140

140-
def global_logout(self, name_id, reason="", expire=None, sign=None, sign_alg=None, digest_alg=None):
141+
def global_logout(self, name_id, reason="", expire=None, sign=None,
142+
sign_alg=None, digest_alg=None):
141143
""" More or less a layer of indirection :-/
142144
Bootstrapping the whole thing by finding all the IdPs that should
143145
be notified.
@@ -162,10 +164,12 @@ def global_logout(self, name_id, reason="", expire=None, sign=None, sign_alg=Non
162164

163165
# find out which IdPs/AAs I should notify
164166
entity_ids = self.users.issuers_of_info(name_id)
165-
return self.do_logout(name_id, entity_ids, reason, expire, sign, sign_alg=sign_alg, digest_alg=digest_alg)
167+
return self.do_logout(name_id, entity_ids, reason, expire, sign,
168+
sign_alg=sign_alg, digest_alg=digest_alg)
166169

167170
def do_logout(self, name_id, entity_ids, reason, expire, sign=None,
168-
expected_binding=None, sign_alg=None, digest_alg=None, **kwargs):
171+
expected_binding=None, sign_alg=None, digest_alg=None,
172+
**kwargs):
169173
"""
170174
171175
:param name_id: Identifier of the Subject (a NameID instance)
@@ -227,22 +231,22 @@ def do_logout(self, name_id, entity_ids, reason, expire, sign=None,
227231
sign = self.logout_requests_signed
228232

229233
sigalg = None
230-
key = None
231234
if sign:
232235
if binding == BINDING_HTTP_REDIRECT:
233-
sigalg = kwargs.get("sigalg", ds.DefaultSignature().get_sign_alg())
234-
key = kwargs.get("key", self.signkey)
236+
sigalg = kwargs.get(
237+
"sigalg", ds.DefaultSignature().get_sign_alg())
238+
#key = kwargs.get("key", self.signkey)
235239
srequest = str(request)
236240
else:
237-
srequest = self.sign(request, sign_alg=sign_alg, digest_alg=digest_alg)
241+
srequest = self.sign(request, sign_alg=sign_alg,
242+
digest_alg=digest_alg)
238243
else:
239244
srequest = str(request)
240245

241246
relay_state = self._relay_state(req_id)
242247

243248
http_info = self.apply_binding(binding, srequest, destination,
244-
relay_state, sigalg=sigalg,
245-
key=key)
249+
relay_state, sigalg=sigalg)
246250

247251
if binding == BINDING_SOAP:
248252
response = self.send(**http_info)
@@ -318,7 +322,8 @@ def handle_logout_response(self, response, sign_alg=None, digest_alg=None):
318322
return self.do_logout(decode(status["name_id"]),
319323
status["entity_ids"],
320324
status["reason"], status["not_on_or_after"],
321-
status["sign"], sign_alg=sign_alg, digest_alg=digest_alg)
325+
status["sign"], sign_alg=sign_alg,
326+
digest_alg=digest_alg)
322327

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

src/saml2/config.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@
5353
"tmp_key_file",
5454
"validate_certificate",
5555
"extensions",
56-
"allow_unknown_attributes"
56+
"allow_unknown_attributes",
57+
"crypto_backend"
5758
]
5859

5960
SP_ARGS = [

0 commit comments

Comments
 (0)