Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/22590)
/* 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) {
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);
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: