]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
CMP: fix handling of unset or missing failInfo PKI status information
authorDr. David von Oheimb <David.von.Oheimb@siemens.com>
Tue, 13 Sep 2022 20:22:48 +0000 (22:22 +0200)
committerDr. David von Oheimb <dev@ddvo.net>
Thu, 24 Nov 2022 13:01:47 +0000 (14:01 +0100)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Todd Short <todd.short@me.com>
Reviewed-by: David von Oheimb <david.von.oheimb@siemens.com>
(Merged from https://github.com/openssl/openssl/pull/19205)

crypto/cmp/cmp_client.c
crypto/cmp/cmp_status.c
doc/man3/OSSL_CMP_CTX_new.pod

index 25f179e107f0c902d6a70130d2817a621dc44d91..800f22316c34606bdae13008184c5fe983ec528e 100644 (file)
@@ -97,13 +97,7 @@ static int save_statusInfo(OSSL_CMP_CTX *ctx, OSSL_CMP_PKISI *si)
     if (ctx->status < OSSL_CMP_PKISTATUS_accepted)
         return 0;
 
-    ctx->failInfoCode = 0;
-    if (si->failInfo != NULL) {
-        for (i = 0; i <= OSSL_CMP_PKIFAILUREINFO_MAX; i++) {
-            if (ASN1_BIT_STRING_get_bit(si->failInfo, i))
-                ctx->failInfoCode |= (1 << i);
-        }
-    }
+    ctx->failInfoCode = ossl_cmp_pkisi_get_pkifailureinfo(si);
 
     if (!ossl_cmp_ctx_set0_statusString(ctx, sk_ASN1_UTF8STRING_new_null())
             || (ctx->statusString == NULL))
index 176c546f9c99ccece3dcb34b521c552a49653419..5c02faec103007a6683adf376873bee8cc13db29 100644 (file)
@@ -73,9 +73,10 @@ int ossl_cmp_pkisi_get_pkifailureinfo(const OSSL_CMP_PKISI *si)
 
     if (!ossl_assert(si != NULL))
         return -1;
-    for (i = 0; i <= OSSL_CMP_PKIFAILUREINFO_MAX; i++)
-        if (ASN1_BIT_STRING_get_bit(si->failInfo, i))
-            res |= 1 << i;
+    if (si->failInfo != NULL)
+        for (i = 0; i <= OSSL_CMP_PKIFAILUREINFO_MAX; i++)
+            if (ASN1_BIT_STRING_get_bit(si->failInfo, i))
+                res |= 1 << i;
     return res;
 }
 
@@ -193,7 +194,7 @@ char *snprint_PKIStatusInfo_parts(int status, int fail_info,
      * failInfo is optional and may be empty;
      * if present, print failInfo before statusString because it is more concise
      */
-    if (fail_info != 0) {
+    if (fail_info != -1 && fail_info != 0) {
         printed_chars = BIO_snprintf(write_ptr, bufsize, "; PKIFailureInfo: ");
         ADVANCE_BUFFER;
         for (failure = 0; failure <= OSSL_CMP_PKIFAILUREINFO_MAX; failure++) {
index 1949a60910e13882fec3ed2a8f10fa40ce0fc9f5..f0933634490c91b7469e3c5d4de7dce0719a7666 100644 (file)
@@ -660,7 +660,8 @@ OSSL_CMP_CTX_get0_statusString() returns the statusString from the last received
 CertRepMessage or Revocation Response or error message, or NULL if unset.
 
 OSSL_CMP_CTX_get_failInfoCode() returns the error code from the failInfo field
-of the last received CertRepMessage or Revocation Response or error message.
+of the last received CertRepMessage or Revocation Response or error message,
+or -1 if no such response was received or OSSL_CMP_CTX_reinit() has been called.
 This is a bit field and the flags for it are specified in the header file
 F<< <openssl/cmp.h> >>.
 The flags start with OSSL_CMP_CTX_FAILINFO, for example: