/* * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy * in the file LICENSE in the source distribution or at * https://www.openssl.org/source/license.html */ /* Internal EVP utility functions */ #include <openssl/core.h> #include <openssl/evp.h> #include <openssl/err.h> #include <openssl/asn1.h> /* evp_local.h needs it */ #include <openssl/safestack.h> /* evp_local.h needs it */ #include "crypto/evp.h" /* evp_local.h needs it */ #include "evp_local.h" /* * EVP_CTRL_RET_UNSUPPORTED = -1 is the returned value from any ctrl function * where the control command isn't supported, and an alternative code path * may be chosen. * Since these functions are used to implement ctrl functionality, we * use the same value, and other callers will have to compensate. */ #define PARAM_CHECK(obj, func, errfunc) \ if (obj == NULL) \ return 0; \ if (obj->prov == NULL) \ return EVP_CTRL_RET_UNSUPPORTED; \ if (obj->func == NULL) { \ errfunc(); \ return 0; \ } #define PARAM_FUNC(name, func, type, err) \ int name (const type *obj, OSSL_PARAM params[]) \ { \ PARAM_CHECK(obj, func, err) \ return obj->func(params); \ } #define PARAM_CTX_FUNC(name, func, type, err) \ int name (const type *obj, void *algctx, OSSL_PARAM params[]) \ { \ PARAM_CHECK(obj, func, err) \ return obj->func(algctx, params); \ } #define PARAM_FUNCTIONS(type, \ getname, getfunc, \ getctxname, getctxfunc, \ setctxname, setctxfunc) \ PARAM_FUNC(getname, getfunc, type, geterr) \ PARAM_CTX_FUNC(getctxname, getctxfunc, type, geterr) \ PARAM_CTX_FUNC(setctxname, setctxfunc, type, seterr) /* * These error functions are a workaround for the error scripts, which * currently require that XXXerr method appears inside a function (not a macro). */ static void geterr(void) { ERR_raise(ERR_LIB_EVP, EVP_R_CANNOT_GET_PARAMETERS); } static void seterr(void) { ERR_raise(ERR_LIB_EVP, EVP_R_CANNOT_SET_PARAMETERS); } PARAM_FUNCTIONS(EVP_CIPHER, evp_do_ciph_getparams, get_params, evp_do_ciph_ctx_getparams, get_ctx_params, evp_do_ciph_ctx_setparams, set_ctx_params) PARAM_FUNCTIONS(EVP_MD, evp_do_md_getparams, get_params, evp_do_md_ctx_getparams, get_ctx_params, evp_do_md_ctx_setparams, set_ctx_params) |