| /* |
| * 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) |