]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
When changing IV length invalidate previously set IV
authorTomas Mraz <tomas@openssl.org>
Wed, 1 Nov 2023 13:00:22 +0000 (14:00 +0100)
committerTomas Mraz <tomas@openssl.org>
Fri, 3 Nov 2023 12:36:13 +0000 (13:36 +0100)
Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/22590)

providers/implementations/ciphers/cipher_aes_ocb.c
providers/implementations/ciphers/ciphercommon_ccm.c
providers/implementations/ciphers/ciphercommon_gcm.c

index 3f3cc6efbb3c79a0fd09d70621aa1a9192d4d05c..aec988e44ede3e2f825a5bc324bbf545044b1057 100644 (file)
@@ -385,7 +385,10 @@ static int aes_ocb_set_ctx_params(void *vctx, const OSSL_PARAM params[])
         /* IV len must be 1 to 15 */
         if (sz < OCB_MIN_IV_LEN || sz > OCB_MAX_IV_LEN)
             return 0;
-        ctx->base.ivlen = sz;
+        if (ctx->base.ivlen != sz) {
+            ctx->base.ivlen = sz;
+            ctx->iv_state = IV_STATE_UNINITIALISED;
+        }
     }
     p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_KEYLEN);
     if (p != NULL) {
index ce3f7527f31e4bd458fe8a47fd72f43f72738d96..33105911e36668518ea64250e3d04eb7df8f4717 100644 (file)
@@ -109,7 +109,10 @@ int ossl_ccm_set_ctx_params(void *vctx, const OSSL_PARAM params[])
             ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
             return 0;
         }
-        ctx->l = ivlen;
+        if (ctx->l != ivlen) {
+            ctx->l = ivlen;
+            ctx->iv_set = 0;
+        }
     }
 
     p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_AEAD_TLS1_AAD);
index cd7852a547aa9f7b4ebdaa8f579897fa4f6b55d7..fe24b450a5b027355c13f4ce046b83ff58af5d5d 100644 (file)
@@ -280,7 +280,12 @@ int ossl_gcm_set_ctx_params(void *vctx, const OSSL_PARAM params[])
                 ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
                 return 0;
             }
-            ctx->ivlen = sz;
+            if (ctx->ivlen != sz) {
+                /* If the iv was already set or autogenerated, it is invalid. */
+                if (ctx->iv_state != IV_STATE_UNINITIALISED)
+                    ctx->iv_state = IV_STATE_FINISHED;
+                ctx->ivlen = sz;
+            }
             break;
 
         case PIDX_CIPHER_PARAM_AEAD_TLS1_AAD: