From f12bb4b091db35f7b1886edfb889846a9964a8f4 Mon Sep 17 00:00:00 2001 From: Martin van Es <martin@mrvanes.com> Date: Wed, 20 Apr 2022 12:37:33 +0200 Subject: [PATCH] Make key_spec and cert_spec configurable --- mdsigner.yaml.example | 9 ++++++-- signers.py | 52 +++++++++++++++++++++++++------------------ utils.py | 4 ++-- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/mdsigner.yaml.example b/mdsigner.yaml.example index 1d636e9..cbf091c 100644 --- a/mdsigner.yaml.example +++ b/mdsigner.yaml.example @@ -1,7 +1,12 @@ --- test: - signer: test_signer + signer: + name: test_signer + key_spec: meta.key + cert_spec: meta.crt metadir: metadata/test foobar: - signer: foobar_signer + signer: + name: hsm_signer + key_spec: pkcs11:///usr/lib/softhsm/libsofthsm2.so/test?pin=secret metadir: metadata/foobar diff --git a/signers.py b/signers.py index e9717f0..16276f1 100644 --- a/signers.py +++ b/signers.py @@ -1,31 +1,39 @@ import xmlsec -cert = "meta.crt" -key = "meta.key" +def _normal_signer(xml, key_spec, cert_spec): + print(f"Normal signer {key_spec} {cert_spec}") + return xmlsec.sign(xml, key_spec=key_spec, cert_spec=cert_spec) -def Signers(signer): - def _normal_signer(xml): - print("Normal signer") - return xmlsec.sign(xml, key_spec=key, cert_spec=cert) - def _test_signer(xml): - print("Test signer") - return xmlsec.sign(xml, key_spec=key, cert_spec=cert) +def _test_signer(xml, key_spec, cert_spec): + print(f"Test signer {key_spec} {cert_spec}") + return xmlsec.sign(xml, key_spec=key_spec, cert_spec=cert_spec) - def _foobar_signer(xml): - print("Foobar signer") - return xmlsec.sign(xml, key_spec=key, cert_spec=cert) - def _hsm_signer(xml): - print("HSM signer") - return xmlsec.sign(xml, key_spec="pkcs11:///usr/lib/softhsm/libsofthsm2.so/test?pin=secret") +def _foobar_signer(xml, key_spec, cert_spec): + print(f"Foobar signer {key_spec} {cert_spec}") + return xmlsec.sign(xml, key_spec=key_spec, cert_spec=cert_spec) - signers = { - 'normal_signer': _normal_signer, - 'test_signer': _test_signer, - 'foobar_signer': _foobar_signer, - 'hsm_signer': _hsm_signer - } - return signers[signer] +def _hsm_signer(xml, key_spec, cert_spec): + print(f"HSM signer {key_spec} {cert_spec}") + return xmlsec.sign(xml, key_spec=key_spec, cert_spec=cert_spec) + + +_signers = { + 'normal_signer': _normal_signer, + 'test_signer': _test_signer, + 'foobar_signer': _foobar_signer, + 'hsm_signer': _hsm_signer +} + + +class Signers(): + def __init__(self, signer): + self.name = signer['name'] + self.key_spec = signer['key_spec'] + self.cert_spec = signer.get('cert_spec', None) + + def sign(self, xml): + return _signers[self.name](xml, self.key_spec, self.cert_spec) diff --git a/utils.py b/utils.py index b523990..5a059ac 100755 --- a/utils.py +++ b/utils.py @@ -163,7 +163,7 @@ class Realm: print(f"sign {sha1}") valid_until = self.idps[sha1].valid_until if valid_until > datetime.now(tz.tzutc()): - signed_element = self.signer(self.idps[sha1].md) + signed_element = self.signer.sign(self.idps[sha1].md) signed_xml = ET.tostring(signed_element, pretty_print=True).decode() signed_entity = Entity() @@ -208,7 +208,7 @@ class Realm: root.set('cacheDuration', duration_isoformat(cache_duration)) last_modified = datetime.now(tz.tzutc()) - signed_root = self.signer(root) + signed_root = self.signer.sign(root) data.md = ET.tostring(signed_root, pretty_print=True) data.valid_until = valid_until data.last_modified = last_modified -- GitLab