Blame SOURCES/0001-swtpm_localca-Test-for-available-issuercert-before-c.patch

7b7689
From b6b0611704047b8632b328d48502f3b3f9fe4fe2 Mon Sep 17 00:00:00 2001
7b7689
From: Stefan Berger <stefanb@linux.ibm.com>
7b7689
Date: Tue, 1 Feb 2022 12:40:06 -0500
7b7689
Subject: [PATCH] swtpm_localca: Test for available issuercert before creating
7b7689
 CA
7b7689
7b7689
Avoid trying to create TPM certificates while the issuer certificate has
7b7689
not been created, yet (in a 2nd step).
7b7689
7b7689
To resolve this do not just test for availability of the signing key, which
7b7689
is created first, but also test for the issuer certifcate, which is created
7b7689
in a 2nd step when the local CA is created. If either one is missing,
7b7689
attempt to create the CA.
7b7689
7b7689
Resolves: https://github.com/stefanberger/swtpm/issues/644
7b7689
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
7b7689
---
7b7689
 src/swtpm_localca/swtpm_localca.c | 17 ++++++++++++++++-
7b7689
 1 file changed, 16 insertions(+), 1 deletion(-)
7b7689
7b7689
diff --git a/src/swtpm_localca/swtpm_localca.c b/src/swtpm_localca/swtpm_localca.c
7b7689
index 037bfd5266bb..089e4e0db4ce 100644
7b7689
--- a/src/swtpm_localca/swtpm_localca.c
7b7689
+++ b/src/swtpm_localca/swtpm_localca.c
7b7689
@@ -117,7 +117,7 @@ static int create_localca_cert(const gchar *lockfile, const gchar *statedir,
7b7689
             goto error;
7b7689
     }
7b7689
 
7b7689
-    if (access(signkey, R_OK) != 0) {
7b7689
+    if (access(signkey, R_OK) != 0 || access(issuercert, R_OK) != 0) {
7b7689
         g_autofree gchar *directory = g_path_get_dirname(signkey);
7b7689
         g_autofree gchar *cakey = g_strjoin(G_DIR_SEPARATOR_S, directory, "swtpm-localca-rootca-privkey.pem", NULL);
7b7689
         g_autofree gchar *cacert = g_strjoin(G_DIR_SEPARATOR_S, directory, "swtpm-localca-rootca-cert.pem", NULL);
7b7689
@@ -808,13 +808,28 @@ int main(int argc, char *argv[])
7b7689
         if (ret != 0)
7b7689
             goto error;
7b7689
     } else {
7b7689
+        int create_certs = 0;
7b7689
+
7b7689
+        /* create certificate if either the signing key or issuer cert are missing */
7b7689
         if (access(signkey, R_OK) != 0) {
7b7689
             if (stat(signkey, &statbuf) == 0) {
7b7689
                 logerr(gl_LOGFILE, "Need read rights on signing key %s for user %s.\n",
7b7689
                        signkey, curr_user ? curr_user->pw_name : "<unknown>");
7b7689
                 goto error;
7b7689
             }
7b7689
+            create_certs = 1;
7b7689
+        }
7b7689
+
7b7689
+        if (access(issuercert, R_OK) != 0) {
7b7689
+            if (stat(issuercert, &statbuf) == 0) {
7b7689
+                logerr(gl_LOGFILE, "Need read rights on issuer certificate %s for user %s.\n",
7b7689
+                       issuercert, curr_user ? curr_user->pw_name : "<unknown>");
7b7689
+                goto error;
7b7689
+            }
7b7689
+            create_certs = 1;
7b7689
+        }
7b7689
 
7b7689
+        if (create_certs) {
7b7689
             logit(gl_LOGFILE, "Creating root CA and a local CA's signing key and issuer cert.\n");
7b7689
             if (create_localca_cert(lockfile, statedir, signkey, signkey_password,
7b7689
                                     issuercert) != 0) {
7b7689
-- 
7b7689
2.37.0.rc0
7b7689