@@ -191,43 +191,45 @@ def do_contact_person_info(lava):
191191 return cps
192192
193193
194- def do_key_descriptor (cert , use = "both" ):
195- if use == "both" :
196- return [
197- md .KeyDescriptor (
198- key_info = ds .KeyInfo (
199- x509_data = ds .X509Data (
200- x509_certificate = ds .X509Certificate (text = cert )
201- )
202- ),
203- use = "encryption"
204- ),
205- md .KeyDescriptor (
206- key_info = ds .KeyInfo (
207- x509_data = ds .X509Data (
208- x509_certificate = ds .X509Certificate (text = cert )
209- )
210- ),
211- use = "signing"
194+ def do_key_descriptor (cert = None , enc_cert = None , use = "both" ):
195+ kd_list = []
196+ if use in ["signing" , "both" ] and cert is not None :
197+ if not isinstance (cert , list ):
198+ cert = [cert ]
199+ for _cert in cert :
200+ kd_list .append (
201+ md .KeyDescriptor (
202+ key_info = ds .KeyInfo (
203+ x509_data = ds .X509Data (
204+ x509_certificate = ds .X509Certificate (text = _cert )
205+ )
206+ ),
207+ use = "signing"
208+ )
212209 )
213- ]
214- elif use in ["signing" , "encryption" ]:
215- return md .KeyDescriptor (
216- key_info = ds .KeyInfo (
217- x509_data = ds .X509Data (
218- x509_certificate = ds .X509Certificate (text = cert )
210+ if use in ["both" , "encryption" ] and enc_cert is not None :
211+ if not isinstance (enc_cert , list ):
212+ enc_cert = [enc_cert ]
213+ for _enc_cert in enc_cert :
214+ kd_list .append (
215+ md .KeyDescriptor (
216+ key_info = ds .KeyInfo (
217+ x509_data = ds .X509Data (
218+ x509_certificate = ds .X509Certificate (text = _enc_cert )
219+ )
220+ ),
221+ use = "encryption"
219222 )
220- ),
221- use = use
222- )
223- else :
223+ )
224+ if len (kd_list ) == 0 and cert is not None :
224225 return md .KeyDescriptor (
225226 key_info = ds .KeyInfo (
226227 x509_data = ds .X509Data (
227228 x509_certificate = ds .X509Certificate (text = cert )
228229 )
229230 )
230231 )
232+ return kd_list
231233
232234
233235def do_requested_attribute (attributes , acs , is_required = "false" ):
@@ -502,7 +504,7 @@ def do_attribute_consuming_service(conf, spsso):
502504 spsso .attribute_consuming_service = [ac_serv ]
503505
504506
505- def do_spsso_descriptor (conf , cert = None ):
507+ def do_spsso_descriptor (conf , cert = None , enc_cert = None ):
506508 spsso = md .SPSSODescriptor ()
507509 spsso .protocol_support_enumeration = samlp .NAMESPACE
508510
@@ -537,9 +539,9 @@ def do_spsso_descriptor(conf, cert=None):
537539 spsso .extensions = md .Extensions ()
538540 spsso .extensions .add_extension_element (do_uiinfo (ui_info ))
539541
540- if cert :
541- encryption_type = conf .encryption_type
542- spsso .key_descriptor = do_key_descriptor (cert , encryption_type )
542+ if cert or enc_cert :
543+ metadata_key_usage = conf .metadata_key_usage
544+ spsso .key_descriptor = do_key_descriptor (cert = cert , enc_cert = enc_cert , use = metadata_key_usage )
543545
544546 for key in ["want_assertions_signed" , "authn_requests_signed" ]:
545547 try :
@@ -557,7 +559,7 @@ def do_spsso_descriptor(conf, cert=None):
557559 return spsso
558560
559561
560- def do_idpsso_descriptor (conf , cert = None ):
562+ def do_idpsso_descriptor (conf , cert = None , enc_cert = None ):
561563 idpsso = md .IDPSSODescriptor ()
562564 idpsso .protocol_support_enumeration = samlp .NAMESPACE
563565
@@ -586,8 +588,8 @@ def do_idpsso_descriptor(conf, cert=None):
586588 idpsso .extensions = md .Extensions ()
587589 idpsso .extensions .add_extension_element (do_uiinfo (ui_info ))
588590
589- if cert :
590- idpsso .key_descriptor = do_key_descriptor (cert )
591+ if cert or enc_cert :
592+ idpsso .key_descriptor = do_key_descriptor (cert , enc_cert , use = conf . metadata_key_usage )
591593
592594 for key in ["want_authn_requests_signed" ]:
593595 #"want_authn_requests_only_with_valid_cert"]:
@@ -603,7 +605,7 @@ def do_idpsso_descriptor(conf, cert=None):
603605 return idpsso
604606
605607
606- def do_aa_descriptor (conf , cert ):
608+ def do_aa_descriptor (conf , cert = None , enc_cert = None ):
607609 aad = md .AttributeAuthorityDescriptor ()
608610 aad .protocol_support_enumeration = samlp .NAMESPACE
609611
@@ -616,8 +618,8 @@ def do_aa_descriptor(conf, cert):
616618
617619 _do_nameid_format (aad , conf , "aa" )
618620
619- if cert :
620- aad .key_descriptor = do_key_descriptor (cert )
621+ if cert or enc_cert :
622+ aad .key_descriptor = do_key_descriptor (cert , enc_cert , use = conf . metadata_key_usage )
621623
622624 attributes = conf .getattr ("attribute" , "aa" )
623625 if attributes :
@@ -632,7 +634,7 @@ def do_aa_descriptor(conf, cert):
632634 return aad
633635
634636
635- def do_aq_descriptor (conf , cert ):
637+ def do_aq_descriptor (conf , cert = None , enc_cert = None ):
636638 aqs = md .AuthnAuthorityDescriptor ()
637639 aqs .protocol_support_enumeration = samlp .NAMESPACE
638640
@@ -645,13 +647,13 @@ def do_aq_descriptor(conf, cert):
645647
646648 _do_nameid_format (aqs , conf , "aq" )
647649
648- if cert :
649- aqs .key_descriptor = do_key_descriptor (cert )
650+ if cert or enc_cert :
651+ aqs .key_descriptor = do_key_descriptor (cert , enc_cert , use = conf . metadata_key_usage )
650652
651653 return aqs
652654
653655
654- def do_pdp_descriptor (conf , cert ):
656+ def do_pdp_descriptor (conf , cert = None , enc_cert = None ):
655657 """ Create a Policy Decision Point descriptor """
656658 pdp = md .PDPDescriptor ()
657659
@@ -667,13 +669,24 @@ def do_pdp_descriptor(conf, cert):
667669 _do_nameid_format (pdp , conf , "pdp" )
668670
669671 if cert :
670- pdp .key_descriptor = do_key_descriptor (cert )
672+ pdp .key_descriptor = do_key_descriptor (cert , enc_cert , use = conf . metadata_key_usage )
671673
672674 return pdp
673675
674676
675677def entity_descriptor (confd ):
676- mycert = "" .join (open (confd .cert_file ).readlines ()[1 :- 1 ])
678+ mycert = None
679+ enc_cert = None
680+ if confd .cert_file is not None :
681+ mycert = []
682+ mycert .append ("" .join (open (confd .cert_file ).readlines ()[1 :- 1 ]))
683+ if confd .additional_cert_files is not None :
684+ for _cert_file in confd .additional_cert_files :
685+ mycert .append ("" .join (open (_cert_file ).readlines ()[1 :- 1 ]))
686+ if confd .encryption_keypairs is not None :
687+ enc_cert = []
688+ for _encryption in confd .encryption_keypairs :
689+ enc_cert .append ("" .join (open (_encryption ["cert_file" ]).readlines ()[1 :- 1 ]))
677690
678691 entd = md .EntityDescriptor ()
679692 entd .entity_id = confd .entityid
@@ -701,19 +714,19 @@ def entity_descriptor(confd):
701714
702715 if "sp" in serves :
703716 confd .context = "sp"
704- entd .spsso_descriptor = do_spsso_descriptor (confd , mycert )
717+ entd .spsso_descriptor = do_spsso_descriptor (confd , mycert , enc_cert )
705718 if "idp" in serves :
706719 confd .context = "idp"
707- entd .idpsso_descriptor = do_idpsso_descriptor (confd , mycert )
720+ entd .idpsso_descriptor = do_idpsso_descriptor (confd , mycert , enc_cert )
708721 if "aa" in serves :
709722 confd .context = "aa"
710- entd .attribute_authority_descriptor = do_aa_descriptor (confd , mycert )
723+ entd .attribute_authority_descriptor = do_aa_descriptor (confd , mycert , enc_cert )
711724 if "pdp" in serves :
712725 confd .context = "pdp"
713- entd .pdp_descriptor = do_pdp_descriptor (confd , mycert )
726+ entd .pdp_descriptor = do_pdp_descriptor (confd , mycert , enc_cert )
714727 if "aq" in serves :
715728 confd .context = "aq"
716- entd .authn_authority_descriptor = do_aq_descriptor (confd , mycert )
729+ entd .authn_authority_descriptor = do_aq_descriptor (confd , mycert , enc_cert )
717730
718731 return entd
719732
0 commit comments