Skip to content

Commit 6235254

Browse files
author
Roland Hedberg
committed
Not lists but strings as values in dictionary input to verify_redirect_signature.
1 parent 37e48dc commit 6235254

File tree

3 files changed

+28
-12
lines changed

3 files changed

+28
-12
lines changed

src/saml2/sigver.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -611,18 +611,18 @@ def verify(self, msg, sig, key):
611611
def verify_redirect_signature(saml_msg, cert=None, sigkey=None):
612612
"""
613613
614-
:param saml_msg: A dictionary as produced by parse_qs, means all values are
615-
lists.
614+
:param saml_msg: A dictionary with strings as values, *NOT* lists as
615+
produced by parse_qs.
616616
:param cert: A certificate to use when verifying the signature
617617
:return: True, if signature verified
618618
"""
619619

620620
try:
621-
signer = SIGNER_ALGS[saml_msg["SigAlg"][0]]
621+
signer = SIGNER_ALGS[saml_msg["SigAlg"]]
622622
except KeyError:
623623
raise Unsupported("Signature algorithm: %s" % saml_msg["SigAlg"])
624624
else:
625-
if saml_msg["SigAlg"][0] in SIGNER_ALGS:
625+
if saml_msg["SigAlg"] in SIGNER_ALGS:
626626
if "SAMLRequest" in saml_msg:
627627
_order = REQ_ORDER
628628
elif "SAMLResponse" in saml_msg:
@@ -631,15 +631,15 @@ def verify_redirect_signature(saml_msg, cert=None, sigkey=None):
631631
raise Unsupported(
632632
"Verifying signature on something that should not be "
633633
"signed")
634-
args = saml_msg.copy()
635-
del args["Signature"] # everything but the signature
634+
_args = saml_msg.copy()
635+
del _args["Signature"] # everything but the signature
636636
string = "&".join(
637-
[urllib.urlencode({k: args[k][0]}) for k in _order if k in args])
637+
[urllib.urlencode({k: _args[k]}) for k in _order if k in _args])
638638
if cert:
639639
_key = extract_rsa_key_from_x509_cert(pem_format(cert))
640640
else:
641641
_key = sigkey
642-
_sign = base64.b64decode(saml_msg["Signature"][0])
642+
_sign = base64.b64decode(saml_msg["Signature"])
643643

644644
return bool(signer.verify(string, _sign, _key))
645645

tests/test_51_client.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@
2424
from saml2.saml import NAMEID_FORMAT_TRANSIENT
2525
from saml2.saml import NameID
2626
from saml2.server import Server
27-
from saml2.sigver import pre_encryption_part, rm_xmltag, \
28-
verify_redirect_signature
27+
from saml2.sigver import pre_encryption_part
28+
from saml2.sigver import rm_xmltag
29+
from saml2.sigver import verify_redirect_signature
2930
from saml2.s_utils import do_attribute_statement
3031
from saml2.s_utils import factory
3132
from saml2.time_util import in_a_while
@@ -114,6 +115,10 @@ def _leq(l1, l2):
114115
text="123456")
115116

116117

118+
def list_values2simpletons(_dict):
119+
return dict([(k, v[0]) for k, v in _dict.items()])
120+
121+
117122
class TestClient:
118123
def setup_class(self):
119124
self.server = Server("idp_conf")
@@ -510,7 +515,8 @@ def test_signed_redirect(self):
510515
assert _leq(qs.keys(),
511516
['SigAlg', 'SAMLRequest', 'RelayState', 'Signature'])
512517

513-
assert verify_redirect_signature(qs, sigkey=key)
518+
assert verify_redirect_signature(list_values2simpletons(qs),
519+
sigkey=key)
514520

515521
res = self.server.parse_authn_request(qs["SAMLRequest"][0],
516522
BINDING_HTTP_REDIRECT)

tests/test_70_redirect_signing.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313

1414
__author__ = 'rolandh'
1515

16+
17+
def list_values2simpletons(_dict):
18+
return dict([(k, v[0]) for k, v in _dict.items()])
19+
20+
1621
def test():
1722
with closing(Server(config_file=dotname("idp_all_conf"))) as idp:
1823
conf = SPConfig()
@@ -41,7 +46,12 @@ def test():
4146
_dict = parse_qs(val.split("?")[1])
4247
_certs = idp.metadata.certs(sp.config.entityid, "any", "signing")
4348
for cert in _certs:
44-
if verify_redirect_signature(_dict, cert):
49+
if verify_redirect_signature(
50+
list_values2simpletons(_dict), cert):
4551
verified_ok = True
4652

4753
assert verified_ok
54+
55+
56+
if __name__ == "__main__":
57+
test()

0 commit comments

Comments
 (0)