Skip to content

Commit 0a4c358

Browse files
challetc00kiemon5ter
authored andcommitted
Ouput the according KeyName in encrypted answer
Signed-off-by: Ivan Kanakarakis <[email protected]>
1 parent 59172fc commit 0a4c358

File tree

6 files changed

+73
-29
lines changed

6 files changed

+73
-29
lines changed

src/saml2/entity.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
from saml2.saml import EncryptedAssertion
3131
from saml2.saml import Issuer
3232
from saml2.saml import NAMEID_FORMAT_ENTITY
33-
from saml2.response import AuthnResponse
3433
from saml2.response import LogoutResponse
3534
from saml2.response import UnsolicitedResponse
3635
from saml2.time_util import instant
@@ -683,11 +682,11 @@ def _encrypt_assertion(self, encrypt_cert, sp_entity_id, response, node_xpath=No
683682
_certs = []
684683

685684
if encrypt_cert:
686-
_certs.append(encrypt_cert)
685+
_certs.append((None, encrypt_cert))
687686
elif sp_entity_id is not None:
688687
_certs = self.metadata.certs(sp_entity_id, "any", "encryption")
689688
exception = None
690-
for _cert in _certs:
689+
for _cert_name, _cert in _certs:
691690
wrapped_cert, unwrapped_cert = get_pem_wrapped_unwrapped(_cert)
692691
try:
693692
tmp = make_temp(
@@ -698,7 +697,9 @@ def _encrypt_assertion(self, encrypt_cert, sp_entity_id, response, node_xpath=No
698697
response = self.sec.encrypt_assertion(
699698
response,
700699
tmp.name,
701-
pre_encryption_part(encrypt_cert=unwrapped_cert),
700+
pre_encryption_part(
701+
key_name=_cert_name, encrypt_cert=unwrapped_cert
702+
),
702703
node_xpath=node_xpath,
703704
)
704705
return response

src/saml2/mdstore.py

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -490,20 +490,16 @@ def certs(self, entity_id, descriptor, use="signing"):
490490
def extract_certs(srvs):
491491
res = []
492492
for srv in srvs:
493-
if "key_descriptor" in srv:
494-
for key in srv["key_descriptor"]:
495-
if "use" in key and key["use"] == use:
496-
for dat in key["key_info"]["x509_data"]:
497-
cert = repack_cert(
498-
dat["x509_certificate"]["text"])
499-
if cert not in res:
500-
res.append(cert)
501-
elif not "use" in key:
502-
for dat in key["key_info"]["x509_data"]:
503-
cert = repack_cert(
504-
dat["x509_certificate"]["text"])
505-
if cert not in res:
506-
res.append(cert)
493+
for key in srv.get("key_descriptor", []):
494+
key_use = key.get("use")
495+
key_info = key.get("key_info") or {}
496+
key_name = (key_info.get("key_name") or [{"text": None}])[0]
497+
key_name_txt = key_name.get("text")
498+
if "use" not in key or key_use == use:
499+
for dat in key_info["x509_data"]:
500+
cert = repack_cert(dat["x509_certificate"]["text"])
501+
if cert not in res:
502+
res.append((key_name_txt, cert))
507503

508504
return res
509505

src/saml2/sigver.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,7 +1451,7 @@ def _check_signature(self, decoded_xml, item, node_name=NODE_NAME, origdoc=None,
14511451
_certs = []
14521452
certs = []
14531453

1454-
for cert in _certs:
1454+
for cert_name, cert in _certs:
14551455
if isinstance(cert, six.string_types):
14561456
content = pem_format(cert)
14571457
tmp = make_temp(content,
@@ -1943,7 +1943,7 @@ def pre_encryption_part(
19431943
*,
19441944
msg_enc=TRIPLE_DES_CBC,
19451945
key_enc=RSA_OAEP_MGF1P,
1946-
key_name='my-rsa-key',
1946+
key_name=None,
19471947
encrypted_key_id=None,
19481948
encrypted_data_id=None,
19491949
encrypt_cert=None,
@@ -1958,9 +1958,11 @@ def pre_encryption_part(
19581958
if encrypt_cert
19591959
else None
19601960
)
1961-
key_info = ds.KeyInfo(
1962-
key_name=ds.KeyName(text=key_name),
1963-
x509_data=x509_data,
1961+
key_name = ds.KeyName(text=key_name) if key_name else None
1962+
key_info = (
1963+
ds.KeyInfo(key_name=key_name, x509_data=x509_data)
1964+
if key_name or x509_data
1965+
else None
19641966
)
19651967

19661968
encrypted_key = EncryptedKey(

tests/test_30_mdstore.py

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@
9999
</EntitiesDescriptor>
100100
""".format(cert_data=TEST_CERT)
101101

102-
103102
ATTRCONV = ac_factory(full_path("attributemaps"))
104103

105104
METADATACONF = {
@@ -522,10 +521,45 @@ def test_load_string():
522521
def test_get_certs_from_metadata():
523522
mds = MetadataStore(ATTRCONV, None)
524523
mds.imp(METADATACONF["11"])
525-
certs1 = mds.certs("http://xenosmilus.umdc.umu.se/simplesaml/saml2/idp/metadata.php", "any")
526-
certs2 = mds.certs("http://xenosmilus.umdc.umu.se/simplesaml/saml2/idp/metadata.php", "idpsso")
527524

528-
assert certs1[0] == certs2[0] == TEST_CERT
525+
cert_any_name, cert_any = mds.certs(
526+
"http://xenosmilus.umdc.umu.se/simplesaml/saml2/idp/metadata.php", "any"
527+
)[0]
528+
cert_idpsso_name, cert_idpsso = mds.certs(
529+
"http://xenosmilus.umdc.umu.se/simplesaml/saml2/idp/metadata.php", "idpsso"
530+
)[0]
531+
532+
assert cert_any_name is None
533+
assert cert_idpsso_name is None
534+
535+
536+
def test_get_unnamed_certs_from_metadata():
537+
mds = MetadataStore(ATTRCONV, None)
538+
mds.imp(METADATACONF["11"])
539+
540+
cert_any_name, cert_any = mds.certs(
541+
"http://xenosmilus.umdc.umu.se/simplesaml/saml2/idp/metadata.php", "any"
542+
)[0]
543+
cert_idpsso_name, cert_idpsso = mds.certs(
544+
"http://xenosmilus.umdc.umu.se/simplesaml/saml2/idp/metadata.php", "idpsso"
545+
)[0]
546+
547+
assert cert_any_name is None
548+
assert cert_idpsso_name is None
549+
550+
551+
def test_get_named_certs_from_metadata():
552+
mds = MetadataStore(ATTRCONV, None)
553+
mds.imp(METADATACONF["3"])
554+
555+
cert_sign_name, cert_sign = mds.certs(
556+
"https://coip-test.sunet.se/shibboleth", "spsso", "signing"
557+
)[0]
558+
cert_enc_name, cert_enc = mds.certs(
559+
"https://coip-test.sunet.se/shibboleth", "spsso", "encryption"
560+
)[0]
561+
562+
assert cert_sign_name == cert_enc_name == "coip-test.sunet.se"
529563

530564

531565
def test_get_certs_from_metadata_without_keydescriptor():

tests/test_42_enc.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
__author__ = 'roland'
1414

15-
TMPL_NO_HEADER = """<ns0:EncryptedData xmlns:ns0="http://www.w3.org/2001/04/xmlenc#" xmlns:ns1="http://www.w3.org/2000/09/xmldsig#" Id="{ed_id}" Type="http://www.w3.org/2001/04/xmlenc#Element"><ns0:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /><ns1:KeyInfo><ns0:EncryptedKey Id="{ek_id}"><ns0:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" /><ns1:KeyInfo><ns1:KeyName>my-rsa-key</ns1:KeyName></ns1:KeyInfo><ns0:CipherData><ns0:CipherValue /></ns0:CipherData></ns0:EncryptedKey></ns1:KeyInfo><ns0:CipherData><ns0:CipherValue /></ns0:CipherData></ns0:EncryptedData>"""
15+
TMPL_NO_HEADER = """<ns0:EncryptedData xmlns:ns0="http://www.w3.org/2001/04/xmlenc#" xmlns:ns1="http://www.w3.org/2000/09/xmldsig#" Id="{ed_id}" Type="http://www.w3.org/2001/04/xmlenc#Element"><ns0:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /><ns1:KeyInfo><ns0:EncryptedKey Id="{ek_id}"><ns0:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" />{key_info}<ns0:CipherData><ns0:CipherValue /></ns0:CipherData></ns0:EncryptedKey></ns1:KeyInfo><ns0:CipherData><ns0:CipherValue /></ns0:CipherData></ns0:EncryptedData>"""
1616
TMPL = f"<?xml version='1.0' encoding='UTF-8'?>\n{TMPL_NO_HEADER}"
1717

1818
IDENTITY = {"eduPersonAffiliation": ["staff", "member"],
@@ -47,6 +47,7 @@ def test_pre_enc_with_pregenerated_key():
4747
expected = TMPL_NO_HEADER.format(
4848
ed_id=tmpl.id,
4949
ek_id=tmpl.key_info.encrypted_key.id,
50+
key_info=''
5051
)
5152
assert str(tmpl) == expected
5253

@@ -56,6 +57,16 @@ def test_pre_enc_with_generated_key():
5657
expected = TMPL_NO_HEADER.format(
5758
ed_id=tmpl.id,
5859
ek_id=tmpl.key_info.encrypted_key.id,
60+
key_info=''
61+
)
62+
assert str(tmpl) == expected
63+
64+
def test_pre_enc_with_named_key():
65+
tmpl = pre_encryption_part(key_name="my-rsa-key")
66+
expected = TMPL_NO_HEADER.format(
67+
ed_id=tmpl.id,
68+
ek_id=tmpl.key_info.encrypted_key.id,
69+
key_info='<ns1:KeyInfo><ns1:KeyName>my-rsa-key</ns1:KeyName></ns1:KeyInfo>'
5970
)
6071
assert str(tmpl) == expected
6172

tests/test_70_redirect_signing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def test():
4949
for cert in _certs:
5050
if verify_redirect_signature(
5151
list_values2simpletons(_dict), sp.sec.sec_backend,
52-
cert):
52+
cert[1]):
5353
verified_ok = True
5454

5555
assert verified_ok

0 commit comments

Comments
 (0)