/src/openssl/crypto/evp/evp_utils.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. |
3 | | * |
4 | | * Licensed under the Apache License 2.0 (the "License"). You may not use |
5 | | * this file except in compliance with the License. You can obtain a copy |
6 | | * in the file LICENSE in the source distribution or at |
7 | | * https://www.openssl.org/source/license.html |
8 | | */ |
9 | | |
10 | | /* Internal EVP utility functions */ |
11 | | |
12 | | #include <openssl/core.h> |
13 | | #include <openssl/evp.h> |
14 | | #include <openssl/err.h> |
15 | | #include <openssl/asn1.h> /* evp_local.h needs it */ |
16 | | #include <openssl/safestack.h> /* evp_local.h needs it */ |
17 | | #include "crypto/evp.h" /* evp_local.h needs it */ |
18 | | #include "evp_local.h" |
19 | | |
20 | | /* |
21 | | * EVP_CTRL_RET_UNSUPPORTED = -1 is the returned value from any ctrl function |
22 | | * where the control command isn't supported, and an alternative code path |
23 | | * may be chosen. |
24 | | * Since these functions are used to implement ctrl functionality, we |
25 | | * use the same value, and other callers will have to compensate. |
26 | | */ |
27 | | #define PARAM_CHECK(obj, func, errfunc) \ |
28 | 0 | if (obj == NULL) \ |
29 | 0 | return 0; \ |
30 | 0 | if (obj->prov == NULL) \ |
31 | 0 | return EVP_CTRL_RET_UNSUPPORTED; \ |
32 | 0 | if (obj->func == NULL) { \ |
33 | 0 | errfunc(); \ |
34 | 0 | return 0; \ |
35 | 0 | } |
36 | | |
37 | | #define PARAM_FUNC(name, func, type, err) \ |
38 | 0 | int name (const type *obj, OSSL_PARAM params[]) \ |
39 | 0 | { \ |
40 | 0 | PARAM_CHECK(obj, func, err) \ |
41 | 0 | return obj->func(params); \ |
42 | 0 | } Unexecuted instantiation: evp_do_ciph_getparams Unexecuted instantiation: evp_do_md_getparams |
43 | | |
44 | | #define PARAM_CTX_FUNC(name, func, type, err) \ |
45 | 0 | int name (const type *obj, void *algctx, OSSL_PARAM params[]) \ |
46 | 0 | { \ |
47 | 0 | PARAM_CHECK(obj, func, err) \ |
48 | 0 | return obj->func(algctx, params); \ |
49 | 0 | } Unexecuted instantiation: evp_do_ciph_ctx_getparams Unexecuted instantiation: evp_do_ciph_ctx_setparams Unexecuted instantiation: evp_do_md_ctx_getparams Unexecuted instantiation: evp_do_md_ctx_setparams |
50 | | |
51 | | #define PARAM_FUNCTIONS(type, \ |
52 | | getname, getfunc, \ |
53 | | getctxname, getctxfunc, \ |
54 | | setctxname, setctxfunc) \ |
55 | | PARAM_FUNC(getname, getfunc, type, geterr) \ |
56 | | PARAM_CTX_FUNC(getctxname, getctxfunc, type, geterr) \ |
57 | | PARAM_CTX_FUNC(setctxname, setctxfunc, type, seterr) |
58 | | |
59 | | /* |
60 | | * These error functions are a workaround for the error scripts, which |
61 | | * currently require that XXXerr method appears inside a function (not a macro). |
62 | | */ |
63 | | static void geterr(void) |
64 | 0 | { |
65 | 0 | ERR_raise(ERR_LIB_EVP, EVP_R_CANNOT_GET_PARAMETERS); |
66 | 0 | } |
67 | | |
68 | | static void seterr(void) |
69 | 0 | { |
70 | 0 | ERR_raise(ERR_LIB_EVP, EVP_R_CANNOT_SET_PARAMETERS); |
71 | 0 | } |
72 | | |
73 | | PARAM_FUNCTIONS(EVP_CIPHER, |
74 | | evp_do_ciph_getparams, get_params, |
75 | | evp_do_ciph_ctx_getparams, get_ctx_params, |
76 | | evp_do_ciph_ctx_setparams, set_ctx_params) |
77 | | |
78 | | PARAM_FUNCTIONS(EVP_MD, |
79 | | evp_do_md_getparams, get_params, |
80 | | evp_do_md_ctx_getparams, get_ctx_params, |
81 | | evp_do_md_ctx_setparams, set_ctx_params) |