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

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