]>
Commit | Line | Data |
---|---|---|
13273237 RL |
1 | /* |
2 | * Copyright 2019 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_locl.h needs it */ | |
16 | #include <openssl/safestack.h> /* evp_locl.h needs it */ | |
25f2138b | 17 | #include "crypto/evp.h" /* evp_locl.h needs it */ |
13273237 RL |
18 | #include "evp_locl.h" |
19 | ||
e870791a SL |
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) \ | |
dc64dc2e SL |
28 | if (obj == NULL) \ |
29 | return 0; \ | |
e870791a SL |
30 | if (obj->prov == NULL) \ |
31 | return EVP_CTRL_RET_UNSUPPORTED; \ | |
32 | if (obj->func == NULL) { \ | |
33 | errfunc(); \ | |
34 | return 0; \ | |
35 | } | |
36 | ||
37 | #define PARAM_FUNC(name, func, type, err) \ | |
38 | int name (const type *obj, OSSL_PARAM params[]) \ | |
39 | { \ | |
40 | PARAM_CHECK(obj, func, err) \ | |
41 | return obj->func(params); \ | |
42 | } | |
43 | ||
44 | #define PARAM_CTX_FUNC(name, func, type, err) \ | |
45 | int name (const type *obj, void *provctx, OSSL_PARAM params[]) \ | |
46 | { \ | |
47 | PARAM_CHECK(obj, func, err) \ | |
48 | return obj->func(provctx, params); \ | |
13273237 RL |
49 | } |
50 | ||
e870791a SL |
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) | |
13273237 | 64 | { |
e870791a | 65 | EVPerr(0, EVP_R_CANNOT_GET_PARAMETERS); |
13273237 RL |
66 | } |
67 | ||
e870791a | 68 | static void seterr(void) |
13273237 | 69 | { |
e870791a | 70 | EVPerr(0, EVP_R_CANNOT_SET_PARAMETERS); |
13273237 | 71 | } |
e870791a SL |
72 | |
73 | PARAM_FUNCTIONS(EVP_CIPHER, | |
74 | evp_do_ciph_getparams, get_params, | |
92d9d0ae RL |
75 | evp_do_ciph_ctx_getparams, get_ctx_params, |
76 | evp_do_ciph_ctx_setparams, set_ctx_params) | |
e870791a | 77 | |
e870791a SL |
78 | PARAM_FUNCTIONS(EVP_MD, |
79 | evp_do_md_getparams, get_params, | |
92d9d0ae RL |
80 | evp_do_md_ctx_getparams, get_ctx_params, |
81 | evp_do_md_ctx_setparams, set_ctx_params) |