]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
swtpm: Properly configure state directory
authorDaan De Meyer <daan@amutable.com>
Wed, 25 Mar 2026 13:23:11 +0000 (14:23 +0100)
committerDaan De Meyer <daan@amutable.com>
Wed, 25 Mar 2026 14:22:57 +0000 (15:22 +0100)
Otherwise it will unconditionally try to use /var/lib/xxx which won't
work when running unprivileged.

src/shared/swtpm-util.c

index 836f877e12d791e2c4abb67c7cda04482ae44a61..1a475f0e08f3f1b0f0fe6795a3b851d94c2111af 100644 (file)
@@ -7,6 +7,7 @@
 #include "alloc-util.h"
 #include "escape.h"
 #include "fd-util.h"
+#include "fileio.h"
 #include "json-util.h"
 #include "log.h"
 #include "memfd-util.h"
@@ -120,6 +121,43 @@ int manufacture_swtpm(const char *state_dir, const char *secret) {
                 }
         }
 
+        /* Create custom swtpm config files so that swtpm_localca uses our state directory instead of
+         * the system-wide /var/lib/swtpm-localca/ which may not be writable. */
+        _cleanup_free_ char *localca_conf = path_join(state_dir, "swtpm-localca.conf");
+        if (!localca_conf)
+                return log_oom();
+
+        r = write_string_filef(
+                        localca_conf,
+                        WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_TRUNCATE|WRITE_STRING_FILE_MKDIR_0755,
+                        "statedir = %1$s\n"
+                        "signingkey = %1$s/signing-private-key.pem\n"
+                        "issuercert = %1$s/issuer-certificate.pem\n"
+                        "certserial = %1$s/certserial\n",
+                        state_dir);
+        if (r < 0)
+                return log_error_errno(r, "Failed to write swtpm-localca.conf: %m");
+
+        _cleanup_free_ char *swtpm_localca = NULL;
+        r = find_executable("swtpm_localca", &swtpm_localca);
+        if (r < 0)
+                return log_error_errno(r, "Failed to find 'swtpm_localca' binary: %m");
+
+        _cleanup_free_ char *setup_conf = path_join(state_dir, "swtpm_setup.conf");
+        if (!setup_conf)
+                return log_oom();
+
+        r = write_string_filef(
+                        setup_conf,
+                        WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_TRUNCATE|WRITE_STRING_FILE_MKDIR_0755,
+                        "create_certs_tool = %1$s\n"
+                        "create_certs_tool_config = %2$s\n"
+                        "create_certs_tool_options = /etc/swtpm-localca.options\n",
+                        swtpm_localca,
+                        localca_conf);
+        if (r < 0)
+                return log_error_errno(r, "Failed to write swtpm_setup.conf: %m");
+
         strv_free(args);
         args = strv_new(swtpm_setup,
                         "--tpm-state", state_dir,
@@ -129,7 +167,8 @@ int manufacture_swtpm(const char *state_dir, const char *secret) {
                         "--createek",
                         "--create-ek-cert",
                         "--create-platform-cert",
-                        "--not-overwrite");
+                        "--not-overwrite",
+                        "--config", setup_conf);
         if (!args)
                 return log_oom();