]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
ukify: convert certificate to public key before embedding in .pcrpkey
authorLuca Boccassi <bluca@debian.org>
Mon, 4 Mar 2024 23:12:26 +0000 (23:12 +0000)
committerLuca Boccassi <luca.boccassi@gmail.com>
Wed, 6 Mar 2024 09:53:02 +0000 (09:53 +0000)
Follow-up for 419b25ddcac39cf967555c7a2eaa274fbf1ad03c

src/ukify/ukify.py

index f7d08590d93a73d13ac702f1bae491cb7eb04120..2e89ba17d93ed1c4e4f3f1a9813ad9d44807882b 100755 (executable)
@@ -824,6 +824,20 @@ def make_uki(opts):
     if pcrpkey is None:
         if opts.pcr_public_keys and len(opts.pcr_public_keys) == 1:
             pcrpkey = opts.pcr_public_keys[0]
+            # If we are getting a certificate when using an engine, we need to convert it to public key format
+            if opts.signing_engine is not None and pathlib.Path(pcrpkey).exists():
+                from cryptography.hazmat.primitives import serialization
+                from cryptography.x509 import load_pem_x509_certificate
+
+                try:
+                    cert = load_pem_x509_certificate(pathlib.Path(pcrpkey).read_bytes())
+                except ValueError:
+                    raise ValueError(f'{pcrpkey} must be an X.509 certificate when signing with an engine')
+                else:
+                    pcrpkey = cert.public_key().public_bytes(
+                        encoding=serialization.Encoding.PEM,
+                        format=serialization.PublicFormat.SubjectPublicKeyInfo,
+                    )
         elif opts.pcr_private_keys and len(opts.pcr_private_keys) == 1:
             from cryptography.hazmat.primitives import serialization
             privkey = serialization.load_pem_private_key(pathlib.Path(opts.pcr_private_keys[0]).read_bytes(), password=None)