+ if (ctx->cipher->prov == NULL)
+ goto legacy;
+
+ switch (type) {
+ case EVP_CTRL_SET_KEY_LENGTH:
+ params[0] = OSSL_PARAM_construct_int(OSSL_CIPHER_PARAM_KEYLEN, &arg);
+ break;
+ case EVP_CTRL_RAND_KEY: /* Used by DES */
+ case EVP_CTRL_SET_PIPELINE_OUTPUT_BUFS: /* Used by DASYNC */
+ case EVP_CTRL_INIT: /* TODO(3.0) Purely legacy, no provider counterpart */
+ default:
+ return EVP_CTRL_RET_UNSUPPORTED;
+ case EVP_CTRL_GET_IV:
+ set_params = 0;
+ params[0] = OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_IV,
+ ptr, (size_t)arg);
+ break;
+ case EVP_CTRL_AEAD_SET_IVLEN:
+ if (arg < 0)
+ return 0;
+ sz = (size_t)arg;
+ params[0] =
+ OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_AEAD_IVLEN, &sz);
+ break;
+ case EVP_CTRL_GCM_SET_IV_FIXED:
+ params[0] =
+ OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED,
+ ptr, (size_t)arg);
+ break;
+ case EVP_CTRL_AEAD_SET_TAG:
+ params[0] =
+ OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG,
+ ptr, (size_t)arg);
+ break;
+ case EVP_CTRL_AEAD_GET_TAG:
+ set_params = 0;
+ params[0] = OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG,
+ ptr, (size_t)arg);
+ break;
+ case EVP_CTRL_AEAD_TLS1_AAD:
+ /* This one does a set and a get - since it returns a padding size */
+ params[0] =
+ OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD,
+ ptr, (size_t)arg);
+ ret = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->provctx, params);
+ if (ret <= 0)
+ return ret;
+ params[0] =
+ OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD, &sz);
+ ret = evp_do_ciph_ctx_getparams(ctx->cipher, ctx->provctx, params);
+ if (ret <= 0)
+ return 0;
+ return sz;
+ }
+
+ if (set_params)
+ ret = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->provctx, params);
+ else
+ ret = evp_do_ciph_ctx_getparams(ctx->cipher, ctx->provctx, params);
+ return ret;
+
+/* TODO(3.0): Remove legacy code below */
+legacy:
+ if (ctx->cipher->ctrl == NULL) {