Skip to content

Commit dbebbd4

Browse files
committed
Resolve sign_alg and digest_alg wherever pre_signature_part is called
Signed-off-by: Ivan Kanakarakis <[email protected]>
1 parent ff9cbce commit dbebbd4

File tree

3 files changed

+32
-28
lines changed

3 files changed

+32
-28
lines changed

src/saml2/entity.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,10 @@ def _response(
772772
and len(response.assertion.advice.assertion) == 1
773773
)
774774
):
775+
# XXX sig/digest-allowed should be configurable
776+
sign_alg = sign_alg or self.signing_algorithm
777+
digest_alg = digest_alg or self.digest_algorithm
778+
775779
# XXX part-A (common) prepare sign response
776780
if sign:
777781
response.signature = pre_signature_part(

src/saml2/server.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -414,8 +414,8 @@ def setup_assertion(
414414
**kwargs)
415415
return assertion
416416

417-
# XXX calls pre_signature_part
418-
# XXX > _response
417+
# XXX DONE calls pre_signature_part
418+
# XXX calls _response
419419
def _authn_response(
420420
self,
421421
in_response_to,
@@ -479,7 +479,6 @@ def _authn_response(
479479
if farg is None:
480480
assertion_args = {}
481481

482-
args = {}
483482
# if identity:
484483
_issuer = self._issuer(issuer)
485484

@@ -517,13 +516,21 @@ def _authn_response(
517516
to_sign = []
518517
if not encrypt_assertion:
519518
if sign_assertion:
519+
# XXX self.signing_algorithm self.digest_algorithm defined by entity
520+
# XXX this should be handled through entity.py
521+
# XXX sig/digest-allowed should be configurable
522+
sign_alg = sign_alg or self.signing_algorithm
523+
digest_alg = digest_alg or self.digest_algorithm
524+
520525
assertion.signature = pre_signature_part(
521-
assertion.id, self.sec.my_cert, 2, sign_alg=sign_alg, digest_alg=digest_alg
526+
assertion.id,
527+
self.sec.my_cert,
528+
2,
529+
sign_alg=sign_alg,
530+
digest_alg=digest_alg,
522531
)
523532
to_sign.append((class_name(assertion), assertion.id))
524533

525-
args["assertion"] = assertion
526-
527534
if (self.support_AssertionIDRequest() or self.support_AuthnQuery()):
528535
self.session_db.store_assertion(assertion, to_sign)
529536

@@ -544,7 +551,7 @@ def _authn_response(
544551
pefim=pefim,
545552
sign_alg=sign_alg,
546553
digest_alg=digest_alg,
547-
**args,
554+
assertion=assertion,
548555
)
549556

550557
# ------------------------------------------------------------------------
@@ -868,7 +875,7 @@ def create_authn_request_response(
868875
digest_alg=digest_alg,
869876
)
870877

871-
# XXX calls pre_signature_part without ensuring sign_alg/digest_alg
878+
# XXX DONE calls pre_signature_part
872879
# XXX DONE idp create > [...]
873880
def create_assertion_id_request_response(
874881
self, assertion_id, sign=None, sign_alg=None, digest_alg=None, **kwargs
@@ -880,7 +887,12 @@ def create_assertion_id_request_response(
880887

881888
if to_sign:
882889
if assertion.signature is None:
883-
# XXX calls pre_signature_part without ensuring sign_alg/digest_alg
890+
# XXX self.signing_algorithm self.digest_algorithm defined by entity
891+
# XXX this should be handled through entity.py
892+
# XXX sig/digest-allowed should be configurable
893+
sign_alg = sign_alg or self.signing_algorithm
894+
digest_alg = digest_alg or self.digest_algorithm
895+
884896
assertion.signature = pre_signature_part(
885897
assertion.id,
886898
self.sec.my_cert,

tests/test_52_default_sign_alg.py

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,8 @@ def get_ava(assertion):
4242

4343

4444
class TestSignedResponse():
45-
4645
def setup_class(self):
4746
self.server = Server("idp_conf")
48-
sign_alg = Mock()
49-
sign_alg.return_value = ds.SIG_RSA_SHA512
50-
digest_alg = Mock()
51-
digest_alg.return_value = ds.DIGEST_SHA512
52-
self.restet_default = ds.DefaultSignature
53-
ds.DefaultSignature = MagicMock()
54-
ds.DefaultSignature().get_sign_alg = sign_alg
55-
ds.DefaultSignature().get_digest_alg = digest_alg
5647
conf = config.SPConfig()
5748
conf.load_file("server_conf")
5849
self.client = client.Saml2Client(conf)
@@ -62,7 +53,6 @@ def setup_class(self):
6253
"mail": ["[email protected]"], "title": "The man"}
6354

6455
def teardown_class(self):
65-
ds.DefaultSignature = self.restet_default
6656
self.server.close()
6757

6858
def verify_assertion(self, assertion):
@@ -76,7 +66,6 @@ def verify_assertion(self, assertion):
7666
'surName': ['Jeter'], 'title': ['The man']}
7767

7868
def test_signed_response(self):
79-
8069
print(ds.DefaultSignature().get_digest_alg())
8170
name_id = self.server.ident.transient_nameid(
8271
"urn:mace:example.com:saml:roland:sp", "id12")
@@ -96,11 +85,10 @@ def test_signed_response(self):
9685
assert signed_resp
9786

9887
sresponse = response_from_string(signed_resp)
99-
assert ds.SIG_RSA_SHA512 in str(sresponse), "Not correctly signed!"
100-
assert ds.DIGEST_SHA512 in str(sresponse), "Not correctly signed!"
88+
assert ds.SIG_RSA_SHA1 in str(sresponse), "Not correctly signed!"
89+
assert ds.DIGEST_SHA1 in str(sresponse), "Not correctly signed!"
10190

10291
def test_signed_response_1(self):
103-
10492
signed_resp = self.server.create_authn_response(
10593
self.ava,
10694
"id12", # in_response_to
@@ -112,15 +100,15 @@ def test_signed_response_1(self):
112100
)
113101

114102
sresponse = response_from_string(signed_resp)
115-
assert ds.SIG_RSA_SHA512 in str(sresponse), "Not correctly signed!"
116-
assert ds.DIGEST_SHA512 in str(sresponse), "Not correctly signed!"
103+
assert ds.SIG_RSA_SHA1 in str(sresponse), "Not correctly signed!"
104+
assert ds.DIGEST_SHA1 in str(sresponse), "Not correctly signed!"
117105
valid = self.server.sec.verify_signature(signed_resp,
118106
self.server.config.cert_file,
119107
node_name='urn:oasis:names:tc:SAML:2.0:protocol:Response',
120108
node_id=sresponse.id)
121109
assert valid
122-
assert ds.SIG_RSA_SHA512 in str(sresponse.assertion[0]), "Not correctly signed!"
123-
assert ds.DIGEST_SHA512 in str(sresponse.assertion[0]), "Not correctly signed!"
110+
assert ds.SIG_RSA_SHA1 in str(sresponse.assertion[0]), "Not correctly signed!"
111+
assert ds.DIGEST_SHA1 in str(sresponse.assertion[0]), "Not correctly signed!"
124112
valid = self.server.sec.verify_signature(signed_resp,
125113
self.server.config.cert_file,
126114
node_name='urn:oasis:names:tc:SAML:2.0:assertion:Assertion',
@@ -130,7 +118,6 @@ def test_signed_response_1(self):
130118
self.verify_assertion(sresponse.assertion)
131119

132120
def test_signed_response_2(self):
133-
134121
signed_resp = self.server.create_authn_response(
135122
self.ava,
136123
"id12", # in_response_to
@@ -161,6 +148,7 @@ def test_signed_response_2(self):
161148

162149
self.verify_assertion(sresponse.assertion)
163150

151+
164152
if __name__ == "__main__":
165153
ts = TestSignedResponse()
166154
ts.setup_class()

0 commit comments

Comments
 (0)