Blame SOURCES/0033-Improve-logging-in-SCEP-helper.patch

f0b236
From 0aa25dc4f8c44434e3f28a7fe25a72c0871ac13b Mon Sep 17 00:00:00 2001
f0b236
From: Rob Crittenden <rcritten@redhat.com>
f0b236
Date: Wed, 29 Apr 2020 16:50:16 -0400
f0b236
Subject: [PATCH 33/39] Improve logging in SCEP helper
f0b236
f0b236
Always check return value of cm_pkcs7_verify_signed() and return
f0b236
a unique error message.
f0b236
f0b236
Change log level from 1 to 0 for all errors in scep.c and pkcs7.c
f0b236
so they appear by default.
f0b236
f0b236
Centralize logging across scep.c and pkcs7.c to reduce code
f0b236
duplication.
f0b236
f0b236
Check the return code to cm_pkcs7_verify_signed in all cases.
f0b236
f0b236
Add the last available message, if any, to the error returned
f0b236
via stdout to certmonger as a hint to what is going on.
f0b236
---
f0b236
 src/pkcs7.c     | 111 +++++++++++++++++++++++++++---------------------
f0b236
 src/pkcs7.h     |   2 +
f0b236
 src/scep.c      |  59 ++++++++++---------------
f0b236
 src/scepgen-n.c |  28 ++++++------
f0b236
 src/scepgen-o.c |  72 ++++++++++++++++---------------
f0b236
 src/scepgen.c   |   2 +-
f0b236
 6 files changed, 140 insertions(+), 134 deletions(-)
f0b236
f0b236
diff --git a/src/pkcs7.c b/src/pkcs7.c
f0b236
index 6de1775..29420b9 100644
f0b236
--- a/src/pkcs7.c
f0b236
+++ b/src/pkcs7.c
f0b236
@@ -274,6 +274,25 @@ cm_pkcs7_parse_buffer(const unsigned char *buffer, size_t length,
f0b236
 	}
f0b236
 }
f0b236
 
f0b236
+void
f0b236
+log_pkcs7_errors(int level, char *msg)
f0b236
+{
f0b236
+    char buf[LINE_MAX] = "";
f0b236
+    long error;
f0b236
+	int nss_err;   
f0b236
+
f0b236
+    cm_log(level, "%s\n", msg);
f0b236
+    while ((error = ERR_get_error()) != 0) {
f0b236
+            memset(buf, '\0', sizeof(buf));
f0b236
+            ERR_error_string_n(error, buf, sizeof(buf));
f0b236
+            cm_log(level, "%s\n", buf);
f0b236
+    }
f0b236
+	nss_err = PORT_GetError();
f0b236
+    if (nss_err < 0) {
f0b236
+		cm_log(level, "%d: %s\n", nss_err, PR_ErrorToString(nss_err, 0));
f0b236
+	}
f0b236
+}
f0b236
+
f0b236
 int
f0b236
 cm_pkcs7_parsev(unsigned int flags, void *parent,
f0b236
 		char **certleaf, char **certtop, char ***certothers,
f0b236
@@ -520,26 +539,26 @@ cm_pkcs7_envelope_data(char *encryption_cert, enum cm_prefs_cipher cipher,
f0b236
 
f0b236
 	in = BIO_new_mem_buf(encryption_cert, -1);
f0b236
 	if (in == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	recipient = PEM_read_bio_X509(in, NULL, NULL, NULL);
f0b236
 	if (recipient == NULL) {
f0b236
-		cm_log(1, "Error parsing recipient certificate.\n");
f0b236
+		log_pkcs7_errors(0, "Error parsing recipient certificate.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	BIO_free(in);
f0b236
 
f0b236
 	recipients = sk_X509_new(util_o_cert_cmp);
f0b236
 	if (recipients == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	sk_X509_push(recipients, recipient);
f0b236
 
f0b236
 	in = BIO_new_mem_buf(data, dlength);
f0b236
 	if (in == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	p7 = PKCS7_encrypt(recipients, in, cm_prefs_ossl_cipher_by_pref(cipher),
f0b236
@@ -547,22 +566,22 @@ cm_pkcs7_envelope_data(char *encryption_cert, enum cm_prefs_cipher cipher,
f0b236
 	BIO_free(in);
f0b236
 
f0b236
 	if (p7 == NULL) {
f0b236
-		cm_log(1, "Error encrypting signing request.\n");
f0b236
+		log_pkcs7_errors(0, "Error encrypting signing request.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	len = i2d_PKCS7(p7, NULL);
f0b236
 	if (len < 0) {
f0b236
-		cm_log(1, "Error encoding encrypted signing request.\n");
f0b236
+		log_pkcs7_errors(0, "Error encoding encrypted signing request.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	dp7 = malloc(len);
f0b236
 	if (dp7 == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	u = dp7;
f0b236
 	if (i2d_PKCS7(p7, &u) != len) {
f0b236
-		cm_log(1, "Error encoding encrypted signing request.\n");
f0b236
+		log_pkcs7_errors(0, "Error encoding encrypted signing request.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	*enveloped = dp7;
f0b236
@@ -593,29 +612,29 @@ cm_pkcs7_envelope_csr(char *encryption_cert, enum cm_prefs_cipher cipher,
f0b236
 
f0b236
 	in = BIO_new_mem_buf(csr, -1);
f0b236
 	if (in == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	req = PEM_read_bio_X509_REQ(in, NULL, NULL, NULL);
f0b236
 	BIO_free(in);
f0b236
 	if (req == NULL) {
f0b236
-		cm_log(1, "Error parsing certificate signing request.\n");
f0b236
+		log_pkcs7_errors(0, "Error parsing certificate signing request.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 
f0b236
 	dlen = i2d_X509_REQ(req, NULL);
f0b236
 	if (dlen < 0) {
f0b236
-		cm_log(1, "Error encoding certificate signing request.\n");
f0b236
+		log_pkcs7_errors(0, "Error encoding certificate signing request.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	dreq = malloc(dlen);
f0b236
 	if (dreq == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	u = dreq;
f0b236
 	if (i2d_X509_REQ(req, &u) != dlen) {
f0b236
-		cm_log(1, "Error encoding certificate signing request.\n");
f0b236
+		log_pkcs7_errors(0, "Error encoding certificate signing request.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	ret = cm_pkcs7_envelope_data(encryption_cert, cipher, dreq, dlen,
f0b236
@@ -671,59 +690,61 @@ cm_pkcs7_generate_ias(char *cacert, char *minicert,
f0b236
 
f0b236
 	in = BIO_new_mem_buf(cacert, -1);
f0b236
 	if (in == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	ca = PEM_read_bio_X509(in, NULL, NULL, NULL);
f0b236
 	BIO_free(in);
f0b236
 	if (ca == NULL) {
f0b236
-		cm_log(1, "Error parsing CA certificate.\n");
f0b236
+		log_pkcs7_errors(0, "Error parsing CA certificate.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 
f0b236
 	in = BIO_new_mem_buf(minicert, -1);
f0b236
 	if (in == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	mini = PEM_read_bio_X509(in, NULL, NULL, NULL);
f0b236
 	BIO_free(in);
f0b236
 	if (mini == NULL) {
f0b236
-		cm_log(1, "Error parsing client certificate.\n");
f0b236
+		log_pkcs7_errors(0, "Error parsing client certificate.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 
f0b236
 	issuerlen = i2d_X509_NAME(X509_get_issuer_name(ca), NULL);
f0b236
 	if (issuerlen < 0) {
f0b236
-		cm_log(1, "Error encoding CA certificate issuer name.\n");
f0b236
+		cm_log(0, "Error encoding CA certificate issuer name.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	issuer = malloc(issuerlen);
f0b236
 	if (issuer == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	u = issuer;
f0b236
 	if (i2d_X509_NAME(X509_get_issuer_name(ca), &u) != issuerlen) {
f0b236
-		cm_log(1, "Error encoding CA certificate issuer name.\n");
f0b236
+		log_pkcs7_errors(0, "Error encoding CA certificate issuer name.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 
f0b236
 	subjectlen = i2d_X509_NAME(X509_get_subject_name(mini), NULL);
f0b236
 	if (subjectlen < 0) {
f0b236
-		cm_log(1, "Error encoding client certificate subject name.\n");
f0b236
+		cm_log(0, "Error encoding client certificate subject name.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	subject = malloc(subjectlen);
f0b236
 	if (subject == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	u = subject;
f0b236
 	if (i2d_X509_NAME(X509_get_subject_name(mini), &u) != subjectlen) {
f0b236
-		cm_log(1, "Error encoding client certificate subject name.\n");
f0b236
+		log_pkcs7_errors(0, "Error encoding client certificate subject name.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
+	PORT_SetError(0);
f0b236
+    ERR_clear_error();
f0b236
 	memset(&issuerandsubject, 0, sizeof(issuerandsubject));
f0b236
 	issuerandsubject.issuer.data = issuer;
f0b236
 	issuerandsubject.issuer.len = issuerlen;
f0b236
@@ -731,7 +752,7 @@ cm_pkcs7_generate_ias(char *cacert, char *minicert,
f0b236
 	issuerandsubject.subject.len = subjectlen;
f0b236
 	if (SEC_ASN1EncodeItem(NULL, &encoded, &issuerandsubject,
f0b236
 			       cm_pkcs7_ias_template) != &encoded) {
f0b236
-		cm_log(1, "Error encoding issuer and subject names.\n");
f0b236
+		log_pkcs7_errors(0, "Error encoding issuer and subject names.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	*ias = malloc(encoded.len);
f0b236
@@ -948,28 +969,28 @@ cm_pkcs7_verify_signed(unsigned char *data, size_t length,
f0b236
 	u = data;
f0b236
 	p7 = d2i_PKCS7(NULL, &u, length);
f0b236
 	if ((p7 == NULL) || (u != data + length)) {
f0b236
-		cm_log(1, "Error parsing what should be PKCS#7 signed-data.\n");
f0b236
+		cm_log(0, "Error parsing what should be PKCS#7 signed-data.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	if ((p7->type == NULL) || (OBJ_obj2nid(p7->type) != NID_pkcs7_signed)) {
f0b236
-		cm_log(1, "PKCS#7 data is not signed-data.\n");
f0b236
+		cm_log(0, "PKCS#7 data is not signed-data.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	store = X509_STORE_new();
f0b236
 	if (store == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	X509_STORE_set_verify_cb_func(store, &ignore_purpose_errors);
f0b236
 	certs = sk_X509_new(util_o_cert_cmp);
f0b236
 	if (certs == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	for (i = 0; (roots != NULL) && (roots[i] != NULL); i++) {
f0b236
 		s = talloc_strdup(parent, roots[i]);
f0b236
 		if (s == NULL) {
f0b236
-			cm_log(1, "Out of memory.\n");
f0b236
+			cm_log(0, "Out of memory.\n");
f0b236
 			goto done;
f0b236
 		}
f0b236
 		/* In case one of these is multiple PEM certificates
f0b236
@@ -990,13 +1011,13 @@ cm_pkcs7_verify_signed(unsigned char *data, size_t length,
f0b236
 			}
f0b236
 			in = BIO_new_mem_buf(p, q - p);
f0b236
 			if (in == NULL) {
f0b236
-				cm_log(1, "Out of memory.\n");
f0b236
+				cm_log(0, "Out of memory.\n");
f0b236
 				goto done;
f0b236
 			}
f0b236
 			x = PEM_read_bio_X509(in, NULL, NULL, NULL);
f0b236
 			BIO_free(in);
f0b236
 			if (x == NULL) {
f0b236
-				cm_log(1, "Error parsing chain certificate.\n");
f0b236
+				cm_log(0, "Error parsing chain certificate.\n");
f0b236
 				goto done;
f0b236
 			}
f0b236
 			X509_STORE_add_cert(store, x);
f0b236
@@ -1008,7 +1029,7 @@ cm_pkcs7_verify_signed(unsigned char *data, size_t length,
f0b236
 	for (i = 0; (othercerts != NULL) && (othercerts[i] != NULL); i++) {
f0b236
 		s = talloc_strdup(parent, othercerts[i]);
f0b236
 		if (s == NULL) {
f0b236
-			cm_log(1, "Out of memory.\n");
f0b236
+			cm_log(0, "Out of memory.\n");
f0b236
 			goto done;
f0b236
 		}
f0b236
 		/* In case one of these is multiple PEM certificates
f0b236
@@ -1028,13 +1049,13 @@ cm_pkcs7_verify_signed(unsigned char *data, size_t length,
f0b236
 			}
f0b236
 			in = BIO_new_mem_buf(p, q - p);
f0b236
 			if (in == NULL) {
f0b236
-				cm_log(1, "Out of memory.\n");
f0b236
+				cm_log(0, "Out of memory.\n");
f0b236
 				goto done;
f0b236
 			}
f0b236
 			x = PEM_read_bio_X509(in, NULL, NULL, NULL);
f0b236
 			BIO_free(in);
f0b236
 			if (x == NULL) {
f0b236
-				cm_log(1, "Error parsing chain certificate.\n");
f0b236
+				cm_log(0, "Error parsing chain certificate.\n");
f0b236
 				goto done;
f0b236
 			}
f0b236
 			sk_X509_push(certs, x);
f0b236
@@ -1044,7 +1065,7 @@ cm_pkcs7_verify_signed(unsigned char *data, size_t length,
f0b236
 	}
f0b236
 	out = BIO_new(BIO_s_mem());
f0b236
 	if (out == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	if (roots != NULL) {
f0b236
@@ -1057,19 +1078,19 @@ cm_pkcs7_verify_signed(unsigned char *data, size_t length,
f0b236
 		for (i = 0; i < sk_X509_num(certs); i++) {
f0b236
 			x = X509_dup(sk_X509_value(certs, i));
f0b236
 			if (x == NULL) {
f0b236
-				cm_log(1, "Out of memory.\n");
f0b236
+				cm_log(0, "Out of memory.\n");
f0b236
 				goto done;
f0b236
 			}
f0b236
 			PKCS7_add_certificate(p7, x);
f0b236
 		}
f0b236
 		if (PKCS7_verify(p7, certs, store, NULL, out, 0) != 1) {
f0b236
-			cm_log(1, "Message failed verification.\n");
f0b236
+			cm_log(0, "Message failed verification.\n");
f0b236
 			goto done;
f0b236
 		}
f0b236
 	}
f0b236
 	p7s = p7->d.sign;
f0b236
 	if (sk_PKCS7_SIGNER_INFO_num(p7s->signer_info) != 1) {
f0b236
-		cm_log(1, "Number of PKCS#7 signed-data signers != 1.\n");
f0b236
+		cm_log(0, "Number of PKCS#7 signed-data signers != 1.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	si = sk_PKCS7_SIGNER_INFO_value(p7s->signer_info, 0);
f0b236
@@ -1077,12 +1098,12 @@ cm_pkcs7_verify_signed(unsigned char *data, size_t length,
f0b236
 	encapsulated = p7s->contents;
f0b236
 	if (expected_content_type != NID_undef) {
f0b236
 		if (encapsulated == NULL) {
f0b236
-			cm_log(1, "Error parsing PKCS#7 encapsulated content.\n");
f0b236
+			cm_log(0, "Error parsing PKCS#7 encapsulated content.\n");
f0b236
 			goto done;
f0b236
 		}
f0b236
 		if ((encapsulated->type == NULL) ||
f0b236
 		    (OBJ_obj2nid(encapsulated->type) != expected_content_type)) {
f0b236
-			cm_log(1, "PKCS#7 encapsulated data is not %s (%s).\n",
f0b236
+			cm_log(0, "PKCS#7 encapsulated data is not %s (%s).\n",
f0b236
 			       OBJ_nid2ln(expected_content_type),
f0b236
 			       encapsulated->type ?
f0b236
 			       OBJ_nid2ln(OBJ_obj2nid(encapsulated->type)) :
f0b236
@@ -1091,7 +1112,7 @@ cm_pkcs7_verify_signed(unsigned char *data, size_t length,
f0b236
 		}
f0b236
 	}
f0b236
 	if (attrs == NULL) {
f0b236
-		cm_log(1, "PKCS#7 signed-data contains no signed attributes.\n");
f0b236
+		cm_log(0, "PKCS#7 signed-data contains no signed attributes.\n");
f0b236
 		goto done;
f0b236
 	}
f0b236
 	ret = 0;
f0b236
@@ -1146,7 +1167,7 @@ cm_pkcs7_verify_signed(unsigned char *data, size_t length,
f0b236
 		if (*payload_length > 0) {
f0b236
 			*payload = talloc_size(parent, *payload_length + 1);
f0b236
 			if (*payload == NULL) {
f0b236
-				cm_log(1, "Out of memory.\n");
f0b236
+				cm_log(0, "Out of memory.\n");
f0b236
 				goto done;
f0b236
 			}
f0b236
 			memcpy(*payload, s, *payload_length);
f0b236
@@ -1154,12 +1175,6 @@ cm_pkcs7_verify_signed(unsigned char *data, size_t length,
f0b236
 		}
f0b236
 	}
f0b236
 done:
f0b236
-	if (ret != 0) {
f0b236
-		while ((error = ERR_get_error()) != 0) {
f0b236
-			ERR_error_string_n(error, buf, sizeof(buf));
f0b236
-			cm_log(1, "%s\n", buf);
f0b236
-		}
f0b236
-	}
f0b236
 	if (p7 != NULL) {
f0b236
 		PKCS7_free(p7);
f0b236
 	}
f0b236
diff --git a/src/pkcs7.h b/src/pkcs7.h
f0b236
index 097f7ca..fae52f8 100644
f0b236
--- a/src/pkcs7.h
f0b236
+++ b/src/pkcs7.h
f0b236
@@ -63,4 +63,6 @@ int cm_pkcs7_verify_signed(unsigned char *data, size_t length,
f0b236
 			   size_t *recipient_nonce_length,
f0b236
 			   unsigned char **payload, size_t *payload_length);
f0b236
 
f0b236
+void log_pkcs7_errors(int level, char *msg);
f0b236
+
f0b236
 #endif
f0b236
diff --git a/src/scep.c b/src/scep.c
f0b236
index b37711c..0b8bef9 100644
f0b236
--- a/src/scep.c
f0b236
+++ b/src/scep.c
f0b236
@@ -428,11 +428,15 @@ main(int argc, const char **argv)
f0b236
 	if ((rekey_message != NULL) && (strlen(rekey_message) != 0)) {
f0b236
 		tmp1 = cm_submit_u_base64_from_text(rekey_message);
f0b236
 		tmp2 = cm_store_base64_as_bin(ctx, tmp1, -1, &c);
f0b236
-		cm_pkcs7_verify_signed((unsigned char *) tmp2, c,
f0b236
+		i = cm_pkcs7_verify_signed((unsigned char *) tmp2, c,
f0b236
 				       NULL, NULL, NID_pkcs7_data, ctx, NULL,
f0b236
 				       NULL, &msgtype, NULL, NULL,
f0b236
 				       NULL, NULL,
f0b236
 				       NULL, NULL, NULL, NULL);
f0b236
+		if (i != 0) {
f0b236
+			log_pkcs7_errors(0, "Error: failed to verify signature on "
f0b236
+					"rekey PKCSReq.\n");
f0b236
+		}
f0b236
 		if ((msgtype == NULL) ||
f0b236
 		    ((strcmp(msgtype, SCEP_MSGTYPE_PKCSREQ) != 0) &&
f0b236
 		     (strcmp(msgtype, SCEP_MSGTYPE_GETCERTINITIAL) != 0))) {
f0b236
@@ -454,11 +458,15 @@ main(int argc, const char **argv)
f0b236
 	if ((message != NULL) && (strlen(message) != 0)) {
f0b236
 		tmp1 = cm_submit_u_base64_from_text(message);
f0b236
 		tmp2 = cm_store_base64_as_bin(ctx, tmp1, -1, &c);
f0b236
-		cm_pkcs7_verify_signed((unsigned char *) tmp2, c,
f0b236
+		i = cm_pkcs7_verify_signed((unsigned char *) tmp2, c,
f0b236
 				       NULL, NULL, NID_pkcs7_data, ctx, NULL,
f0b236
 				       &sent_tx, &msgtype, NULL, NULL,
f0b236
 				       &sent_nonce, &sent_nonce_length,
f0b236
 				       NULL, NULL, NULL, NULL);
f0b236
+		if (i != 0) {
f0b236
+			log_pkcs7_errors(0, "Error: failed to verify signature on "
f0b236
+					"message.\n");
f0b236
+		}
f0b236
 		if ((msgtype == NULL) ||
f0b236
 		    ((strcmp(msgtype, SCEP_MSGTYPE_PKCSREQ) != 0) &&
f0b236
 		     (strcmp(msgtype, SCEP_MSGTYPE_GETCERTINITIAL) != 0))) {
f0b236
@@ -933,14 +941,16 @@ main(int argc, const char **argv)
f0b236
 						   &payload, &payload_length);
f0b236
 			if (i != 0) {
f0b236
 				printf(_("Error: failed to verify signature on "
f0b236
-					 "server response.\n"));
f0b236
-				cm_log(1, "Error: failed to verify signature on "
f0b236
-					 "server response.\n");
f0b236
-				while ((error = ERR_get_error()) != 0) {
f0b236
+						 "server response. "));
f0b236
+				error = ERR_peek_last_error();
f0b236
+				if (error != 0) {
f0b236
 					memset(buf, '\0', sizeof(buf));
f0b236
 					ERR_error_string_n(error, buf, sizeof(buf));
f0b236
-					cm_log(1, "%s\n", buf);
f0b236
+					printf("%s", buf);
f0b236
 				}
f0b236
+				printf("\n");
f0b236
+				log_pkcs7_errors(0, "Error: failed to verify signature on "
f0b236
+						  "server response.\n");
f0b236
 				s = cm_store_base64_from_bin(ctx, (unsigned char *) results2,
f0b236
 							     results_length2);
f0b236
 				s = cm_submit_u_pem_from_base64("PKCS7", 0, s);
f0b236
@@ -1050,26 +1060,7 @@ main(int argc, const char **argv)
f0b236
 				p7 = d2i_PKCS7(NULL, &u, payload_length);
f0b236
 				if (p7 == NULL) {
f0b236
 					printf(_("Error: couldn't parse signed-data.\n"));
f0b236
-					while ((error = ERR_get_error()) != 0) {
f0b236
-						memset(buf, '\0', sizeof(buf));
f0b236
-						ERR_error_string_n(error, buf, sizeof(buf));
f0b236
-						cm_log(1, "%s\n", buf);
f0b236
-					}
f0b236
-					s = cm_store_base64_from_bin(ctx,
f0b236
-								     (unsigned char *) results2,
f0b236
-								     results_length2);
f0b236
-					s = cm_submit_u_pem_from_base64("PKCS7", 0, s);
f0b236
-					fprintf(stderr, "Full reply:\n%s", s);
f0b236
-					free(s);
f0b236
-					return CM_SUBMIT_STATUS_UNREACHABLE;
f0b236
-				}
f0b236
-				if (!PKCS7_type_is_enveloped(p7)) {
f0b236
-					printf(_("Error: signed-data payload is not enveloped-data.\n"));
f0b236
-					while ((error = ERR_get_error()) != 0) {
f0b236
-						memset(buf, '\0', sizeof(buf));
f0b236
-						ERR_error_string_n(error, buf, sizeof(buf));
f0b236
-						cm_log(1, "%s\n", buf);
f0b236
-					}
f0b236
+					log_pkcs7_errors(0, "Error: couldn't parse signed-data.\n");
f0b236
 					s = cm_store_base64_from_bin(ctx,
f0b236
 								     (unsigned char *) results2,
f0b236
 								     results_length2);
f0b236
@@ -1080,11 +1071,8 @@ main(int argc, const char **argv)
f0b236
 				}
f0b236
 				if (!PKCS7_type_is_enveloped(p7)) {
f0b236
 					printf(_("Error: signed-data payload is not enveloped-data.\n"));
f0b236
-					while ((error = ERR_get_error()) != 0) {
f0b236
-						memset(buf, '\0', sizeof(buf));
f0b236
-						ERR_error_string_n(error, buf, sizeof(buf));
f0b236
-						cm_log(1, "%s\n", buf);
f0b236
-					}
f0b236
+					log_pkcs7_errors(0, "Error: signed-data payload is not "
f0b236
+								"enveloped-data.\n");
f0b236
 					s = cm_store_base64_from_bin(ctx,
f0b236
 								     (unsigned char *) results2,
f0b236
 								     results_length2);
f0b236
@@ -1098,11 +1086,8 @@ main(int argc, const char **argv)
f0b236
 				    (p7->d.enveloped->enc_data->content_type == NULL) ||
f0b236
 				    (OBJ_obj2nid(p7->d.enveloped->enc_data->content_type) != NID_pkcs7_data)) {
f0b236
 					printf(_("Error: enveloped-data payload is not data.\n"));
f0b236
-					while ((error = ERR_get_error()) != 0) {
f0b236
-						memset(buf, '\0', sizeof(buf));
f0b236
-						ERR_error_string_n(error, buf, sizeof(buf));
f0b236
-						cm_log(1, "%s\n", buf);
f0b236
-					}
f0b236
+					log_pkcs7_errors(0, "Error: enveloped-data payload is "
f0b236
+								"not data.\n");
f0b236
 					s = cm_store_base64_from_bin(ctx,
f0b236
 								     (unsigned char *) results2,
f0b236
 								     results_length2);
f0b236
diff --git a/src/scepgen-n.c b/src/scepgen-n.c
f0b236
index 8c67b12..ce73c31 100644
f0b236
--- a/src/scepgen-n.c
f0b236
+++ b/src/scepgen-n.c
f0b236
@@ -86,14 +86,14 @@ cm_scepgen_n_resign(PKCS7 *p7, SECKEYPrivateKey *privkey)
f0b236
 		return;
f0b236
 	}
f0b236
 	if (sk_PKCS7_SIGNER_INFO_num(p7->d.sign->signer_info) != 1) {
f0b236
-		cm_log(1, "More than one signer, not sure what to do.\n");
f0b236
+		cm_log(0, "More than one signer, not sure what to do.\n");
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 	sinfo = sk_PKCS7_SIGNER_INFO_value(p7->d.sign->signer_info, 0);
f0b236
 	salen = ASN1_item_i2d((ASN1_VALUE *)sinfo->auth_attr, NULL, &PKCS7_ATTR_SIGN_it);
f0b236
 	u = sabuf = malloc(salen);
f0b236
 	if (sabuf == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 	/* ASN1_item_i2d doesn't actually modify the passed-in pointer, which
f0b236
@@ -101,7 +101,7 @@ cm_scepgen_n_resign(PKCS7 *p7, SECKEYPrivateKey *privkey)
f0b236
 	 * that ourselves. */
f0b236
 	l = ASN1_item_i2d((ASN1_VALUE *)sinfo->auth_attr, &u, &PKCS7_ATTR_SIGN_it);
f0b236
 	if (l != salen) {
f0b236
-		cm_log(1, "Error encoding attributes.\n");
f0b236
+		cm_log(0, "Error encoding attributes.\n");
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 
f0b236
@@ -109,12 +109,12 @@ cm_scepgen_n_resign(PKCS7 *p7, SECKEYPrivateKey *privkey)
f0b236
 	digalg = cm_submit_n_tag_from_nid(OBJ_obj2nid(sinfo->digest_alg->algorithm));
f0b236
 	sigalg = SEC_GetSignatureAlgorithmOidTag(privkey->keyType, digalg);
f0b236
 	if (sigalg == SEC_OID_UNKNOWN) {
f0b236
-		cm_log(1, "Unable to match digest algorithm and key.\n");
f0b236
+		cm_log(0, "Unable to match digest algorithm and key.\n");
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 	if (SEC_SignData(&signature, sabuf, salen, privkey,
f0b236
 			 sigalg) != SECSuccess) {
f0b236
-		cm_log(1, "Error re-signing: %s.\n",
f0b236
+		cm_log(0, "Error re-signing: %s.\n",
f0b236
 		       PR_ErrorToName(PORT_GetError()));
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
@@ -143,7 +143,7 @@ cm_scepgen_n_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 	}
f0b236
 
f0b236
 	if (ca->cm_ca_encryption_cert == NULL) {
f0b236
-		cm_log(1, "Can't generate new SCEP request data without "
f0b236
+		cm_log(0, "Can't generate new SCEP request data without "
f0b236
 		       "the RA/CA encryption certificate.\n");
f0b236
 		_exit(CM_SUB_STATUS_NEED_SCEP_DATA);
f0b236
 	}
f0b236
@@ -166,12 +166,12 @@ cm_scepgen_n_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 			fprintf(status, "Error opening database "
f0b236
 				"'%s': %s.\n",
f0b236
 				entry->cm_key_storage_location, es);
f0b236
-			cm_log(1, "Error opening database '%s': %s.\n",
f0b236
+			cm_log(0, "Error opening database '%s': %s.\n",
f0b236
 			       entry->cm_key_storage_location, es);
f0b236
 		} else {
f0b236
 			fprintf(status, "Error opening database '%s'.\n",
f0b236
 				entry->cm_key_storage_location);
f0b236
-			cm_log(1, "Error opening database '%s'.\n",
f0b236
+			cm_log(0, "Error opening database '%s'.\n",
f0b236
 			       entry->cm_key_storage_location);
f0b236
 		}
f0b236
 		switch (ec) {
f0b236
@@ -190,7 +190,7 @@ cm_scepgen_n_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 			      NSS_INIT_NOROOTINIT);
f0b236
 	reason = util_n_fips_hook();
f0b236
 	if (reason != NULL) {
f0b236
-		cm_log(1, "Error putting NSS into FIPS mode: %s\n", reason);
f0b236
+		cm_log(0, "Error putting NSS into FIPS mode: %s\n", reason);
f0b236
 		_exit(CM_SUB_STATUS_ERROR_INITIALIZING);
f0b236
 	}
f0b236
 
f0b236
@@ -198,23 +198,23 @@ cm_scepgen_n_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 	cm_log(1, "Generating dummy key.\n");
f0b236
 	key = EVP_PKEY_new();
f0b236
 	if (key == NULL) {
f0b236
-		cm_log(1, "Error allocating new key.\n");
f0b236
+		cm_log(0, "Error allocating new key.\n");
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 	exponent = BN_new();
f0b236
 	if (exponent == NULL) {
f0b236
-		cm_log(1, "Error setting up exponent.\n");
f0b236
+		cm_log(0, "Error setting up exponent.\n");
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 	BN_set_word(exponent, CM_DEFAULT_RSA_EXPONENT);
f0b236
 	rsa = RSA_new();
f0b236
 	if (rsa == NULL) {
f0b236
-		cm_log(1, "Error allocating new RSA key.\n");
f0b236
+		cm_log(0, "Error allocating new RSA key.\n");
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 retry_gen:
f0b236
 	if (RSA_generate_key_ex(rsa, CM_DEFAULT_PUBKEY_SIZE, exponent, NULL) != 1) {
f0b236
-		cm_log(1, "Error generating key.\n");
f0b236
+		cm_log(0, "Error generating key.\n");
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 	if (RSA_check_key(rsa) != 1) { /* should be unnecessary */
f0b236
@@ -228,7 +228,7 @@ retry_gen:
f0b236
 	if ((keys->privkey->keyType != rsaKey) ||
f0b236
 	    ((keys->privkey_next != NULL) &&
f0b236
 	     (keys->privkey_next->keyType != rsaKey))) {
f0b236
-		cm_log(1, "Keys aren't RSA.  They won't work with SCEP.\n");
f0b236
+		cm_log(0, "Keys aren't RSA.  They won't work with SCEP.\n");
f0b236
 		_exit(CM_SUB_STATUS_ERROR_KEY_TYPE);
f0b236
 	}
f0b236
 
f0b236
diff --git a/src/scepgen-o.c b/src/scepgen-o.c
f0b236
index 010abb7..a431815 100644
f0b236
--- a/src/scepgen-o.c
f0b236
+++ b/src/scepgen-o.c
f0b236
@@ -76,14 +76,14 @@ key_from_file(const char *filename, struct cm_store_entry *entry)
f0b236
 	keyfp = fopen(filename, "r");
f0b236
 	if (keyfp == NULL) {
f0b236
 		if (errno != ENOENT) {
f0b236
-			cm_log(1, "Error opening key file \"%s\" "
f0b236
+			cm_log(0, "Error opening key file \"%s\" "
f0b236
 			       "for reading: %s.\n",
f0b236
 			       filename, strerror(errno));
f0b236
 		}
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 	if (cm_pin_read_for_key(entry, &pin) != 0) {
f0b236
-		cm_log(1, "Internal error reading key encryption PIN.\n");
f0b236
+		cm_log(0, "Internal error reading key encryption PIN.\n");
f0b236
 		_exit(CM_SUB_STATUS_ERROR_AUTH);
f0b236
 	}
f0b236
 	memset(&cb_data, 0, sizeof(cb_data));
f0b236
@@ -93,24 +93,24 @@ key_from_file(const char *filename, struct cm_store_entry *entry)
f0b236
 				   cm_pin_read_for_key_ossl_cb, &cb_data);
f0b236
 	if (pkey == NULL) {
f0b236
 		error = errno;
f0b236
-		cm_log(1, "Error reading private key '%s': %s.\n",
f0b236
+		cm_log(0, "Error reading private key '%s': %s.\n",
f0b236
 		       filename, strerror(error));
f0b236
 		while ((error = ERR_get_error()) != 0) {
f0b236
 			ERR_error_string_n(error, buf, sizeof(buf));
f0b236
-			cm_log(1, "%s\n", buf);
f0b236
+			cm_log(0, "%s\n", buf);
f0b236
 		}
f0b236
 		_exit(CM_SUB_STATUS_ERROR_AUTH); /* XXX */
f0b236
 	} else {
f0b236
 		if ((pin != NULL) &&
f0b236
 		    (strlen(pin) > 0) &&
f0b236
 		    (cb_data.n_attempts == 0)) {
f0b236
-			cm_log(1, "PIN was not needed to read private "
f0b236
+			cm_log(0, "PIN was not needed to read private "
f0b236
 			       "key '%s', though one was provided. "
f0b236
 			       "Treating this as an error.\n",
f0b236
 			       filename);
f0b236
 			while ((error = ERR_get_error()) != 0) {
f0b236
 				ERR_error_string_n(error, buf, sizeof(buf));
f0b236
-				cm_log(1, "%s\n", buf);
f0b236
+				cm_log(0, "%s\n", buf);
f0b236
 			}
f0b236
 			_exit(CM_SUB_STATUS_ERROR_AUTH); /* XXX */
f0b236
 		}
f0b236
@@ -127,13 +127,13 @@ cert_from_pem(char *pem, struct cm_store_entry *entry)
f0b236
 	if ((pem != NULL) && (strlen(pem) > 0)) {
f0b236
 		in = BIO_new_mem_buf(pem, -1);
f0b236
 		if (in == NULL) {
f0b236
-			cm_log(1, "Out of memory.\n");
f0b236
+			cm_log(0, "Out of memory.\n");
f0b236
 			_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 		}
f0b236
 		cert = PEM_read_bio_X509(in, NULL, NULL, NULL);
f0b236
 		BIO_free(in);
f0b236
 		if (cert == NULL) {
f0b236
-			cm_log(1, "Error parsing certificate \"%s\".\n", pem);
f0b236
+			cm_log(0, "Error parsing certificate \"%s\".\n", pem);
f0b236
 			_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 		}
f0b236
 		return cert;
f0b236
@@ -155,19 +155,19 @@ certs_from_nickcerts(struct cm_nickcert **list)
f0b236
 		if ((this->cm_cert != NULL) && (strlen(this->cm_cert) > 0)) {
f0b236
 			in = BIO_new_mem_buf(this->cm_cert, -1);
f0b236
 			if (in == NULL) {
f0b236
-				cm_log(1, "Out of memory.\n");
f0b236
+				cm_log(0, "Out of memory.\n");
f0b236
 				_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 			}
f0b236
 			cert = PEM_read_bio_X509(in, NULL, NULL, NULL);
f0b236
 			BIO_free(in);
f0b236
 			if (cert == NULL) {
f0b236
-				cm_log(1, "Error parsing certificate.\n");
f0b236
+				cm_log(0, "Error parsing certificate.\n");
f0b236
 				_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 			}
f0b236
 			if (sk == NULL) {
f0b236
 				sk = sk_X509_new(util_o_cert_cmp);
f0b236
 				if (sk == NULL) {
f0b236
-					cm_log(1, "Out of memory.\n");
f0b236
+					cm_log(0, "Out of memory.\n");
f0b236
 					_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 				}
f0b236
 			}
f0b236
@@ -300,19 +300,19 @@ build_pkimessage(EVP_PKEY *key, X509 *signer, STACK_OF(X509) *certs,
f0b236
 
f0b236
 	in = BIO_new_mem_buf(data, data_length);
f0b236
 	if (in == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 	ret = PKCS7_sign(signer, key, certs, in, flags);
f0b236
 	if (ret == NULL) {
f0b236
-		cm_log(1, "Error signing data.\n");
f0b236
+		cm_log(0, "Error signing data.\n");
f0b236
 		goto errors;
f0b236
 	}
f0b236
 	BIO_free(in);
f0b236
 
f0b236
 	/* Set the digest to use for signing. */
f0b236
 	if (sk_PKCS7_SIGNER_INFO_num(ret->d.sign->signer_info) != 1) {
f0b236
-		cm_log(1, "Error signing data: %d signers.\n",
f0b236
+		cm_log(0, "Error signing data: %d signers.\n",
f0b236
 		       sk_PKCS7_SIGNER_INFO_num(ret->d.sign->signer_info));
f0b236
 		goto errors;
f0b236
 	}
f0b236
@@ -356,7 +356,7 @@ build_pkimessage(EVP_PKEY *key, X509 *signer, STACK_OF(X509) *certs,
f0b236
 	PKCS7_content_new(ret, NID_pkcs7_data);
f0b236
 	out = PKCS7_dataInit(ret, NULL);
f0b236
 	if (out == NULL) {
f0b236
-		cm_log(1, "Error signing data.\n");
f0b236
+		cm_log(0, "Error signing data.\n");
f0b236
 		goto errors;
f0b236
 	}
f0b236
 	BIO_write(out, data, data_length);
f0b236
@@ -366,7 +366,7 @@ build_pkimessage(EVP_PKEY *key, X509 *signer, STACK_OF(X509) *certs,
f0b236
 errors:
f0b236
 	while ((error = ERR_get_error()) != 0) {
f0b236
 		ERR_error_string_n(error, buf, sizeof(buf));
f0b236
-		cm_log(1, "%s\n", buf);
f0b236
+		cm_log(0, "%s\n", buf);
f0b236
 	}
f0b236
 	_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 }
f0b236
@@ -394,11 +394,11 @@ cm_scepgen_o_cooked(struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 	util_o_init();
f0b236
 	ERR_load_crypto_strings();
f0b236
         if (RAND_status() != 1) {
f0b236
-		cm_log(1, "PRNG not seeded for generating key.\n");
f0b236
+		cm_log(0, "PRNG not seeded for generating key.\n");
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 	if (RAND_bytes(nonce, nonce_length) == -1) {
f0b236
-		cm_log(1, "PRNG unable to generate nonce.\n");
f0b236
+		cm_log(0, "PRNG unable to generate nonce.\n");
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 
f0b236
@@ -410,14 +410,14 @@ cm_scepgen_o_cooked(struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 	pem = cm_submit_u_pem_from_base64("CERTIFICATE", 0,
f0b236
 					  entry->cm_minicert);
f0b236
 	if (pem == NULL) {
f0b236
-		cm_log(1, "Out of memory.\n");
f0b236
+		cm_log(0, "Out of memory.\n");
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 	new_cert = cert_from_pem(pem, entry);
f0b236
 	if (new_cert == NULL) {
f0b236
 		while ((error = ERR_get_error()) != 0) {
f0b236
 			ERR_error_string_n(error, buf, sizeof(buf));
f0b236
-			cm_log(1, "%s\n", buf);
f0b236
+			cm_log(0, "%s\n", buf);
f0b236
 		}
f0b236
 		free(pem);
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
@@ -442,7 +442,7 @@ cm_scepgen_o_cooked(struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 			cipher = cm_prefs_des;
f0b236
 		}
f0b236
 		else {
f0b236
-			cm_log(1, "Option 'scep_cipher' must be one of AES256, AES192, AES128, DES3, or DES. Got '%s'\n", scep_cipher);
f0b236
+			cm_log(0, "Option 'scep_cipher' must be one of AES256, AES192, AES128, DES3, or DES. Got '%s'\n", scep_cipher);
f0b236
 			_exit(1);
f0b236
 		}
f0b236
 
f0b236
@@ -516,7 +516,7 @@ cm_scepgen_o_cooked(struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 			digest = cm_prefs_md5;
f0b236
 		}
f0b236
 		else {
f0b236
-			cm_log(1, "Option 'scep_digest' must be one of SHA512, SHA384, SHA256, SHA1, or MD5. Got '%s'\n", scep_digest);
f0b236
+			cm_log(0, "Option 'scep_digest' must be one of SHA512, SHA384, SHA256, SHA1, or MD5. Got '%s'\n", scep_digest);
f0b236
 			_exit(1);
f0b236
 		}
f0b236
 
f0b236
@@ -578,7 +578,7 @@ cm_scepgen_o_cooked(struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 					  ca->cm_ca_encryption_issuer_cert,
f0b236
 					  entry->cm_cert,
f0b236
 					  &old_ias, &old_ias_length) != 0) {
f0b236
-			cm_log(1, "Error generating enveloped issuer-and-subject.\n");
f0b236
+			cm_log(0, "Error generating enveloped issuer-and-subject.\n");
f0b236
 			free(pem);
f0b236
 			_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 		}
f0b236
@@ -590,7 +590,7 @@ cm_scepgen_o_cooked(struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 				  ca->cm_ca_encryption_issuer_cert,
f0b236
 				  pem,
f0b236
 				  &new_ias, &new_ias_length) != 0) {
f0b236
-		cm_log(1, "Error generating enveloped issuer-and-subject.\n");
f0b236
+		cm_log(0, "Error generating enveloped issuer-and-subject.\n");
f0b236
 		free(pem);
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
@@ -598,7 +598,11 @@ cm_scepgen_o_cooked(struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 	if (cm_pkcs7_envelope_csr(ca->cm_ca_encryption_cert, cipher,
f0b236
 				  entry->cm_csr,
f0b236
 				  &csr, &csr_length) != 0) {
f0b236
-		cm_log(1, "Error generating enveloped CSR.\n");
f0b236
+		cm_log(0, "Error generating enveloped CSR.\n");
f0b236
+		while ((error = ERR_get_error()) != 0) {
f0b236
+			ERR_error_string_n(error, buf, sizeof(buf));
f0b236
+			cm_log(0, "%s\n", buf);
f0b236
+		}
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
 
f0b236
@@ -608,7 +612,7 @@ cm_scepgen_o_cooked(struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 		 * the matching key. */
f0b236
 		pubkey = util_public_EVP_PKEY_dup(util_X509_get0_pubkey(old_cert));
f0b236
 		if (pubkey == NULL) {
f0b236
-			cm_log(1, "Error generating PKCSREQ pkiMessage: error copying key.\n");
f0b236
+			cm_log(0, "Error generating PKCSREQ pkiMessage: error copying key.\n");
f0b236
 			_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 		}
f0b236
 		util_X509_set_pubkey(old_cert, old_pkey);
f0b236
@@ -639,7 +643,7 @@ cm_scepgen_o_cooked(struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 			 * if we do, we did that in another code path. */
f0b236
 			pubkey = util_public_EVP_PKEY_dup(util_X509_get0_pubkey(new_cert));
f0b236
 			if (pubkey == NULL) {
f0b236
-				cm_log(1, "Error generating PKCSREQ pkiMessage: error copying key.\n");
f0b236
+				cm_log(0, "Error generating PKCSREQ pkiMessage: error copying key.\n");
f0b236
 				_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 			}
f0b236
 			util_X509_set_pubkey(new_cert, old_pkey);
f0b236
@@ -673,7 +677,7 @@ cm_scepgen_o_cooked(struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 		 * any previously-issued certificate won't match. */
f0b236
 		pubkey = util_public_EVP_PKEY_dup(util_X509_get0_pubkey(new_cert));
f0b236
 		if (pubkey == NULL) {
f0b236
-			cm_log(1, "Error generating rekeying PKCSREQ pkiMessage: error copying key.\n");
f0b236
+			cm_log(0, "Error generating rekeying PKCSREQ pkiMessage: error copying key.\n");
f0b236
 			_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 		}
f0b236
 		util_X509_set_pubkey(new_cert, new_pkey);
f0b236
@@ -703,7 +707,7 @@ cm_scepgen_o_cooked(struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 	X509_free(new_cert);
f0b236
 	while ((error = ERR_get_error()) != 0) {
f0b236
 		ERR_error_string_n(error, buf, sizeof(buf));
f0b236
-		cm_log(1, "%s\n", buf);
f0b236
+		cm_log(0, "%s\n", buf);
f0b236
 	}
f0b236
 }
f0b236
 
f0b236
@@ -723,14 +727,14 @@ cm_scepgen_o_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 	}
f0b236
 
f0b236
 	if (ca->cm_ca_encryption_cert == NULL) {
f0b236
-		cm_log(1, "Can't generate new SCEP request data without "
f0b236
+		cm_log(0, "Can't generate new SCEP request data without "
f0b236
 		       "the RA/CA encryption certificate.\n");
f0b236
 		_exit(CM_SUB_STATUS_NEED_SCEP_DATA);
f0b236
 	}
f0b236
 
f0b236
 	old_pkey = key_from_file(entry->cm_key_storage_location, entry);
f0b236
 	if (old_pkey == NULL) {
f0b236
-		cm_log(1, "Error reading key from file \"%s\".\n",
f0b236
+		cm_log(0, "Error reading key from file \"%s\".\n",
f0b236
 		       entry->cm_key_storage_location);
f0b236
 		_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 	}
f0b236
@@ -739,14 +743,14 @@ cm_scepgen_o_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 		filename = util_build_next_filename(entry->cm_key_storage_location,
f0b236
 						    entry->cm_key_next_marker);
f0b236
 		if (filename == NULL) {
f0b236
-			cm_log(1, "Error opening key file \"%s\" "
f0b236
+			cm_log(0, "Error opening key file \"%s\" "
f0b236
 			       "for reading: %s.\n",
f0b236
 			       filename, strerror(errno));
f0b236
 			_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
 		}
f0b236
 		new_pkey = key_from_file(filename, entry);
f0b236
 		if (new_pkey == NULL) {
f0b236
-			cm_log(1, "Error reading key from file \"%s\".\n",
f0b236
+			cm_log(0, "Error reading key from file \"%s\".\n",
f0b236
 			       filename);
f0b236
 			free(filename);
f0b236
 			_exit(CM_SUB_STATUS_INTERNAL_ERROR);
f0b236
@@ -757,7 +761,7 @@ cm_scepgen_o_main(int fd, struct cm_store_ca *ca, struct cm_store_entry *entry,
f0b236
 	}
f0b236
 	if ((util_EVP_PKEY_base_id(old_pkey) != EVP_PKEY_RSA) ||
f0b236
 	    ((new_pkey != NULL) && (util_EVP_PKEY_base_id(new_pkey) != EVP_PKEY_RSA))) {
f0b236
-		cm_log(1, "Keys aren't RSA.  They won't work with SCEP.\n");
f0b236
+		cm_log(0, "Keys aren't RSA.  They won't work with SCEP.\n");
f0b236
 		_exit(CM_SUB_STATUS_ERROR_KEY_TYPE);
f0b236
 	}
f0b236
 
f0b236
diff --git a/src/scepgen.c b/src/scepgen.c
f0b236
index eaf2b7c..115446f 100644
f0b236
--- a/src/scepgen.c
f0b236
+++ b/src/scepgen.c
f0b236
@@ -32,7 +32,7 @@ cm_scepgen_start(struct cm_store_ca *ca, struct cm_store_entry *entry)
f0b236
 {
f0b236
 	switch (entry->cm_key_storage_type) {
f0b236
 	case cm_key_storage_none:
f0b236
-		cm_log(1, "Can't generate new SCEP data for %s('%s') without "
f0b236
+		cm_log(0, "Can't generate new SCEP data for %s('%s') without "
f0b236
 		       "the key, and we don't know where that is or should "
f0b236
 		       "be.\n", entry->cm_busname, entry->cm_nickname);
f0b236
 		break;
f0b236
-- 
f0b236
2.21.1
f0b236