Blame SOURCES/0029-Remove-NOMODDB-flag-flag-from-context-init-look-for-.patch

0af72f
From 34c120f0259750ff2228def2955de9ad985340e6 Mon Sep 17 00:00:00 2001
0af72f
From: Rob Crittenden <rcritten@redhat.com>
0af72f
Date: Mon, 26 Aug 2019 22:01:35 +0000
0af72f
Subject: [PATCH] Remove NOMODDB flag flag from context init, look for full
0af72f
 tokens
0af72f
0af72f
The NSS databases were almost universally initialized with the
0af72f
NOMODDB flag. I'm not sure if something changed in NSS but the
0af72f
PKCS#11 modules were not being initialized. Adding this back after
0af72f
permission checks are done results in tokens working again.
0af72f
0af72f
When looking for certs and keys try the full token:nickname string
0af72f
as well as just nickname when comparing values.
0af72f
0af72f
https://pagure.io/certmonger/issue/125
0af72f
---
0af72f
 src/casave.c     |  3 +--
0af72f
 src/certread-n.c | 33 ++++++++++++++++-----------------
0af72f
 src/certsave-n.c |  5 +++++
0af72f
 src/dogtag.c     |  3 +--
0af72f
 src/keygen-n.c   |  5 +++++
0af72f
 src/keyiread-n.c | 11 ++++++++++-
0af72f
 src/scepgen-n.c  |  5 +++++
0af72f
 src/submit-n.c   |  5 +++++
0af72f
 src/toklist.c    |  2 +-
0af72f
 9 files changed, 49 insertions(+), 23 deletions(-)
0af72f
0af72f
diff --git a/src/casave.c b/src/casave.c
0af72f
index bde63f99..1cf5a406 100644
0af72f
--- a/src/casave.c
0af72f
+++ b/src/casave.c
0af72f
@@ -111,8 +111,7 @@ cm_casave_main_n(int fd, struct cm_store_ca *ca, struct cm_store_entry *e,
0af72f
 					break;
0af72f
 				default:
0af72f
 					flags = NSS_INIT_READONLY |
0af72f
-						NSS_INIT_NOROOTINIT |
0af72f
-						NSS_INIT_NOMODDB;
0af72f
+						NSS_INIT_NOROOTINIT;
0af72f
 					/* Sigh.  Not a lot of detail.  Check
0af72f
 					 * if we succeed in read-only mode,
0af72f
 					 * which we'll interpret as lack of
0af72f
diff --git a/src/certread-n.c b/src/certread-n.c
0af72f
index d535030b..bb61b61b 100644
0af72f
--- a/src/certread-n.c
0af72f
+++ b/src/certread-n.c
0af72f
@@ -157,27 +157,22 @@ cm_certread_n_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
0af72f
 		cm_log(1, "Unable to open NSS database.\n");
0af72f
 		_exit(status);
0af72f
 	}
0af72f
+    /* Re-open the database with modules enabled */
0af72f
+	NSS_ShutdownContext(ctx);
0af72f
+	ctx = NSS_InitContext(entry->cm_cert_storage_location,
0af72f
+			      NULL, NULL, NULL, NULL,
0af72f
+			      (readwrite ? 0 : NSS_INIT_READONLY) |
0af72f
+			      NSS_INIT_NOROOTINIT);
0af72f
 	es = util_n_fips_hook();
0af72f
 	if (es != NULL) {
0af72f
 		cm_log(1, "Error putting NSS into FIPS mode: %s\n", es);
0af72f
 		_exit(CM_SUB_STATUS_ERROR_INITIALIZING);
0af72f
 	}
0af72f
-	/* Allocate a memory pool. */
0af72f
-	arena = PORT_NewArena(sizeof(double));
0af72f
-	if (arena == NULL) {
0af72f
-		cm_log(1, "Error opening database '%s'.\n",
0af72f
-		       entry->cm_cert_storage_location);
0af72f
-		if (NSS_ShutdownContext(ctx) != SECSuccess) {
0af72f
-			cm_log(1, "Error shutting down NSS.\n");
0af72f
-		}
0af72f
-		_exit(ENOMEM);
0af72f
-	}
0af72f
 	/* Find the tokens that we might use for cert storage. */
0af72f
 	mech = CKM_RSA_X_509;
0af72f
 	slotlist = PK11_GetAllTokens(mech, PR_FALSE, PR_FALSE, NULL);
0af72f
 	if (slotlist == NULL) {
0af72f
 		cm_log(1, "Error getting list of tokens.\n");
0af72f
-		PORT_FreeArena(arena, PR_TRUE);
0af72f
 		if (NSS_ShutdownContext(ctx) != SECSuccess) {
0af72f
 			cm_log(1, "Error shutting down NSS.\n");
0af72f
 		}
0af72f
@@ -249,6 +244,7 @@ cm_certread_n_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
0af72f
 		}
0af72f
 		/* If we need to log in in order to read certificates, do so. */
0af72f
 		if (PK11_NeedLogin(sle->slot)) {
0af72f
+			cm_log(3, "Need login to token %s\n", PK11_GetTokenName(sle->slot));
0af72f
 			if (cm_pin_read_for_cert(entry, &pin) != 0) {
0af72f
 				cm_log(1, "Error reading PIN for cert db, "
0af72f
 				       "skipping.\n");
0af72f
@@ -272,13 +268,19 @@ cm_certread_n_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
0af72f
 		/* Walk the list of certificates in the slot, looking for one
0af72f
 		 * which matches the specified nickname. */
0af72f
 		certs = PK11_ListCertsInSlot(sle->slot);
0af72f
+		cm_log(3, "Looking for %s\n", entry->cm_cert_nickname);
0af72f
 		if (certs != NULL) {
0af72f
 			for (node = CERT_LIST_HEAD(certs);
0af72f
 			     !CERT_LIST_EMPTY(certs) &&
0af72f
 			     !CERT_LIST_END(node, certs);
0af72f
 			     node = CERT_LIST_NEXT(node)) {
0af72f
-				if (strcmp(node->cert->nickname,
0af72f
-					   entry->cm_cert_nickname) == 0) {
0af72f
+				cm_log(3, "certread-n: Slot nickname %s\n",
0af72f
+							node->cert->nickname);
0af72f
+		        es = talloc_asprintf(entry, "%s:%s",
0af72f
+					   entry->cm_cert_token, entry->cm_cert_nickname);
0af72f
+				if ((strcmp(node->cert->nickname,
0af72f
+					   entry->cm_cert_nickname) == 0) ||
0af72f
+                    (strcmp(node->cert->nickname, es) == 0)) {
0af72f
 					cm_log(3, "Located the certificate "
0af72f
 					       "\"%s\".\n",
0af72f
 					       entry->cm_cert_nickname);
0af72f
@@ -321,7 +323,6 @@ next_slot:
0af72f
 	if (cert == NULL) {
0af72f
 		cm_log(1, "Error locating certificate.\n");
0af72f
 		PK11_FreeSlotList(slotlist);
0af72f
-		PORT_FreeArena(arena, PR_TRUE);
0af72f
 		if (NSS_ShutdownContext(ctx) != SECSuccess) {
0af72f
 			cm_log(1, "Error shutting down NSS.\n");
0af72f
 		}
0af72f
@@ -332,7 +333,6 @@ next_slot:
0af72f
 	fclose(fp);
0af72f
 	CERT_DestroyCertificate(cert);
0af72f
 	PK11_FreeSlotList(slotlist);
0af72f
-	PORT_FreeArena(arena, PR_TRUE);
0af72f
 	if (NSS_ShutdownContext(ctx) != SECSuccess) {
0af72f
 		cm_log(1, "Error shutting down NSS.\n");
0af72f
 	}
0af72f
@@ -358,8 +358,7 @@ cm_certread_n_parse(struct cm_store_entry *entry,
0af72f
 			      NULL, NULL, NULL, NULL,
0af72f
 			      NSS_INIT_NOCERTDB |
0af72f
 			      NSS_INIT_READONLY |
0af72f
-			      NSS_INIT_NOROOTINIT |
0af72f
-			      NSS_INIT_NOMODDB);
0af72f
+			      NSS_INIT_NOROOTINIT);
0af72f
 	if (ctx == NULL) {
0af72f
 		cm_log(1, "Unable to initialize NSS.\n");
0af72f
 		_exit(1);
0af72f
diff --git a/src/certsave-n.c b/src/certsave-n.c
0af72f
index 972a1dfa..eda03b34 100644
0af72f
--- a/src/certsave-n.c
0af72f
+++ b/src/certsave-n.c
0af72f
@@ -186,6 +186,11 @@ cm_certsave_n_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
0af72f
 	} else {
0af72f
 		/* We don't try to force FIPS mode here, as it seems to get in
0af72f
 		 * the way of saving the certificate. */
0af72f
+		NSS_ShutdownContext(ctx);
0af72f
+		ctx = NSS_InitContext(entry->cm_cert_storage_location,
0af72f
+				      NULL, NULL, NULL, NULL,
0af72f
+				      (readwrite ? 0 : NSS_INIT_READONLY) |
0af72f
+				      NSS_INIT_NOROOTINIT);
0af72f
 
0af72f
 		/* Allocate a memory pool. */
0af72f
 		arena = PORT_NewArena(sizeof(double));
0af72f
diff --git a/src/dogtag.c b/src/dogtag.c
0af72f
index 55607f3d..c43664ef 100644
0af72f
--- a/src/dogtag.c
0af72f
+++ b/src/dogtag.c
0af72f
@@ -306,8 +306,7 @@ main(int argc, const char **argv)
0af72f
 			       NULL, NULL, NULL, NULL,
0af72f
 			       NSS_INIT_NOCERTDB |
0af72f
 			       NSS_INIT_READONLY |
0af72f
-			       NSS_INIT_NOROOTINIT |
0af72f
-			       NSS_INIT_NOMODDB);
0af72f
+			       NSS_INIT_NOROOTINIT);
0af72f
 	if (nctx == NULL) {
0af72f
 		cm_log(1, "Unable to initialize NSS.\n");
0af72f
 		_exit(1);
0af72f
diff --git a/src/keygen-n.c b/src/keygen-n.c
0af72f
index 061bd2af..e921d7ec 100644
0af72f
--- a/src/keygen-n.c
0af72f
+++ b/src/keygen-n.c
0af72f
@@ -226,6 +226,11 @@ cm_keygen_n_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
0af72f
 			break;
0af72f
 		}
0af72f
 	}
0af72f
+	NSS_ShutdownContext(ctx);
0af72f
+	ctx = NSS_InitContext(entry->cm_key_storage_location,
0af72f
+			      NULL, NULL, NULL, NULL,
0af72f
+			      (readwrite ? 0 : NSS_INIT_READONLY) |
0af72f
+			      NSS_INIT_NOROOTINIT);
0af72f
 	reason = util_n_fips_hook();
0af72f
 	if (reason != NULL) {
0af72f
 		cm_log(1, "Error putting NSS into FIPS mode: %s\n", reason);
0af72f
diff --git a/src/keyiread-n.c b/src/keyiread-n.c
0af72f
index 91b1be41..dc1c6092 100644
0af72f
--- a/src/keyiread-n.c
0af72f
+++ b/src/keyiread-n.c
0af72f
@@ -115,6 +115,11 @@ cm_keyiread_n_get_keys(struct cm_store_entry *entry, int readwrite)
0af72f
 			break;
0af72f
 		}
0af72f
 	}
0af72f
+	NSS_ShutdownContext(ctx);
0af72f
+	ctx = NSS_InitContext(entry->cm_key_storage_location,
0af72f
+			      NULL, NULL, NULL, NULL,
0af72f
+			      (readwrite ? 0 : NSS_INIT_READONLY) |
0af72f
+			      NSS_INIT_NOROOTINIT);
0af72f
 	reason = util_n_fips_hook();
0af72f
 	if (reason != NULL) {
0af72f
 		cm_log(1, "Error putting NSS into FIPS mode: %s\n", reason);
0af72f
@@ -340,8 +345,12 @@ cm_keyiread_n_get_keys(struct cm_store_entry *entry, int readwrite)
0af72f
 			     cnode = CERT_LIST_NEXT(cnode)) {
0af72f
 				nickname = entry->cm_key_nickname;
0af72f
 				cert = cnode->cert;
0af72f
+				es = talloc_asprintf(entry, "%s:%s",
0af72f
+									         entry->cm_cert_token,
0af72f
+											 entry->cm_cert_nickname);
0af72f
 				if ((nickname != NULL) &&
0af72f
-				    (strcmp(cert->nickname, nickname) == 0)) {
0af72f
+				    ((strcmp(cert->nickname, nickname) == 0) ||
0af72f
+					(strcmp(cert->nickname, es) == 0))) {
0af72f
 					cm_log(3, "Located a certificate with "
0af72f
 					       "the key's nickname (\"%s\").\n",
0af72f
 					       nickname);
0af72f
diff --git a/src/scepgen-n.c b/src/scepgen-n.c
0af72f
index d6735aa7..8c67b122 100644
0af72f
--- a/src/scepgen-n.c
0af72f
+++ b/src/scepgen-n.c
0af72f
@@ -183,6 +183,11 @@ cm_scepgen_n_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
0af72f
 			break;
0af72f
 		}
0af72f
 	}
0af72f
+	NSS_ShutdownContext(ctx);
0af72f
+	ctx = NSS_InitContext(entry->cm_key_storage_location,
0af72f
+			      NULL, NULL, NULL, NULL,
0af72f
+			      NSS_INIT_READONLY |
0af72f
+			      NSS_INIT_NOROOTINIT);
0af72f
 	reason = util_n_fips_hook();
0af72f
 	if (reason != NULL) {
0af72f
 		cm_log(1, "Error putting NSS into FIPS mode: %s\n", reason);
0af72f
diff --git a/src/submit-n.c b/src/submit-n.c
0af72f
index b07ea23a..f27b9c7f 100644
0af72f
--- a/src/submit-n.c
0af72f
+++ b/src/submit-n.c
0af72f
@@ -317,6 +317,11 @@ cm_submit_n_decrypt_envelope(const unsigned char *envelope,
0af72f
 		}
0af72f
 		goto done;
0af72f
 	}
0af72f
+	NSS_ShutdownContext(ctx);
0af72f
+	ctx = NSS_InitContext(args->entry->cm_key_storage_location,
0af72f
+			      NULL, NULL, NULL, NULL,
0af72f
+			      NSS_INIT_READONLY |
0af72f
+			      NSS_INIT_NOROOTINIT);
0af72f
 	reason = util_n_fips_hook();
0af72f
 	if (reason != NULL) {
0af72f
 		cm_log(1, "Error putting NSS into FIPS mode: %s\n", reason);
0af72f
diff --git a/src/toklist.c b/src/toklist.c
0af72f
index a4328218..ac166722 100644
0af72f
--- a/src/toklist.c
0af72f
+++ b/src/toklist.c
0af72f
@@ -79,7 +79,7 @@ main(int argc, const char **argv)
0af72f
 
0af72f
 	/* Open the database. */
0af72f
 	ctx = NSS_InitContext(dbdir, NULL, NULL, NULL, NULL,
0af72f
-			      NSS_INIT_NOROOTINIT | NSS_INIT_NOMODDB);
0af72f
+			      NSS_INIT_NOROOTINIT);
0af72f
 	if (ctx == NULL) {
0af72f
 		printf("Unable to open NSS database '%s'.\n", dbdir);
0af72f
 		_exit(CM_SUB_STATUS_ERROR_INITIALIZING);
0af72f
-- 
0af72f
2.21.0
0af72f