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_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 | if (obj == NULL) \ |
29 | return 0; \ |
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); \ |
49 | } |
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 | { |
65 | EVPerr(0, EVP_R_CANNOT_GET_PARAMETERS); |
66 | } |
67 | |
68 | static void seterr(void) |
69 | { |
70 | EVPerr(0, EVP_R_CANNOT_SET_PARAMETERS); |
71 | } |
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) |
82 | |