]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/evp/mac_meth.c
Rename OPENSSL_CTX prefix to OSSL_LIB_CTX
[thirdparty/openssl.git] / crypto / evp / mac_meth.c
CommitLineData
e74bd290
RL
1#include <openssl/evp.h>
2#include <openssl/err.h>
3#include <openssl/core.h>
23c48d94 4#include <openssl/core_dispatch.h>
25f2138b 5#include "crypto/evp.h"
e74bd290 6#include "internal/provider.h"
706457b7 7#include "evp_local.h"
e74bd290
RL
8
9static int evp_mac_up_ref(void *vmac)
10{
11 EVP_MAC *mac = vmac;
12 int ref = 0;
13
14 CRYPTO_UP_REF(&mac->refcnt, &ref, mac->lock);
15 return 1;
16}
17
18static void evp_mac_free(void *vmac)
19{
20 EVP_MAC *mac = vmac;
21 int ref = 0;
22
23 if (mac == NULL)
24 return;
25
26 CRYPTO_DOWN_REF(&mac->refcnt, &ref, mac->lock);
27 if (ref > 0)
28 return;
29 ossl_provider_free(mac->prov);
e74bd290
RL
30 CRYPTO_THREAD_lock_free(mac->lock);
31 OPENSSL_free(mac);
32}
33
34static void *evp_mac_new(void)
35{
36 EVP_MAC *mac = NULL;
37
38 if ((mac = OPENSSL_zalloc(sizeof(*mac))) == NULL
39 || (mac->lock = CRYPTO_THREAD_lock_new()) == NULL) {
40 evp_mac_free(mac);
41 return NULL;
42 }
43
44 mac->refcnt = 1;
45
46 return mac;
47}
48
f7c16d48
RL
49static void *evp_mac_from_dispatch(int name_id,
50 const OSSL_DISPATCH *fns,
0ddf74bf 51 OSSL_PROVIDER *prov)
e74bd290
RL
52{
53 EVP_MAC *mac = NULL;
54 int fnmaccnt = 0, fnctxcnt = 0;
55
f7c16d48 56 if ((mac = evp_mac_new()) == NULL) {
e74bd290
RL
57 EVPerr(0, ERR_R_MALLOC_FAILURE);
58 return NULL;
59 }
f7c16d48 60 mac->name_id = name_id;
e74bd290
RL
61
62 for (; fns->function_id != 0; fns++) {
63 switch (fns->function_id) {
64 case OSSL_FUNC_MAC_NEWCTX:
65 if (mac->newctx != NULL)
66 break;
363b1e5d 67 mac->newctx = OSSL_FUNC_mac_newctx(fns);
e74bd290
RL
68 fnctxcnt++;
69 break;
70 case OSSL_FUNC_MAC_DUPCTX:
71 if (mac->dupctx != NULL)
72 break;
363b1e5d 73 mac->dupctx = OSSL_FUNC_mac_dupctx(fns);
e74bd290
RL
74 break;
75 case OSSL_FUNC_MAC_FREECTX:
76 if (mac->freectx != NULL)
77 break;
363b1e5d 78 mac->freectx = OSSL_FUNC_mac_freectx(fns);
e74bd290
RL
79 fnctxcnt++;
80 break;
81 case OSSL_FUNC_MAC_INIT:
82 if (mac->init != NULL)
83 break;
363b1e5d 84 mac->init = OSSL_FUNC_mac_init(fns);
e74bd290
RL
85 fnmaccnt++;
86 break;
87 case OSSL_FUNC_MAC_UPDATE:
88 if (mac->update != NULL)
89 break;
363b1e5d 90 mac->update = OSSL_FUNC_mac_update(fns);
e74bd290
RL
91 fnmaccnt++;
92 break;
93 case OSSL_FUNC_MAC_FINAL:
94 if (mac->final != NULL)
95 break;
363b1e5d 96 mac->final = OSSL_FUNC_mac_final(fns);
e74bd290
RL
97 fnmaccnt++;
98 break;
99 case OSSL_FUNC_MAC_GETTABLE_PARAMS:
100 if (mac->gettable_params != NULL)
101 break;
102 mac->gettable_params =
363b1e5d 103 OSSL_FUNC_mac_gettable_params(fns);
e74bd290
RL
104 break;
105 case OSSL_FUNC_MAC_GETTABLE_CTX_PARAMS:
106 if (mac->gettable_ctx_params != NULL)
107 break;
108 mac->gettable_ctx_params =
363b1e5d 109 OSSL_FUNC_mac_gettable_ctx_params(fns);
e74bd290
RL
110 break;
111 case OSSL_FUNC_MAC_SETTABLE_CTX_PARAMS:
112 if (mac->settable_ctx_params != NULL)
113 break;
114 mac->settable_ctx_params =
363b1e5d 115 OSSL_FUNC_mac_settable_ctx_params(fns);
e74bd290
RL
116 break;
117 case OSSL_FUNC_MAC_GET_PARAMS:
118 if (mac->get_params != NULL)
119 break;
363b1e5d 120 mac->get_params = OSSL_FUNC_mac_get_params(fns);
e74bd290 121 break;
92d9d0ae
RL
122 case OSSL_FUNC_MAC_GET_CTX_PARAMS:
123 if (mac->get_ctx_params != NULL)
e74bd290 124 break;
363b1e5d 125 mac->get_ctx_params = OSSL_FUNC_mac_get_ctx_params(fns);
e74bd290 126 break;
92d9d0ae
RL
127 case OSSL_FUNC_MAC_SET_CTX_PARAMS:
128 if (mac->set_ctx_params != NULL)
e74bd290 129 break;
363b1e5d 130 mac->set_ctx_params = OSSL_FUNC_mac_set_ctx_params(fns);
e74bd290
RL
131 break;
132 }
133 }
134 if (fnmaccnt != 3
135 || fnctxcnt != 2) {
136 /*
137 * In order to be a consistent set of functions we must have at least
138 * a complete set of "mac" functions, and a complete set of context
139 * management functions, as well as the size function.
140 */
141 evp_mac_free(mac);
142 ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS);
143 return NULL;
144 }
145 mac->prov = prov;
146 if (prov != NULL)
147 ossl_provider_up_ref(prov);
148
149 return mac;
150}
151
b4250010 152EVP_MAC *EVP_MAC_fetch(OSSL_LIB_CTX *libctx, const char *algorithm,
e74bd290
RL
153 const char *properties)
154{
155 return evp_generic_fetch(libctx, OSSL_OP_MAC, algorithm, properties,
0ddf74bf 156 evp_mac_from_dispatch, evp_mac_up_ref,
e74bd290
RL
157 evp_mac_free);
158}
159
160int EVP_MAC_up_ref(EVP_MAC *mac)
161{
162 return evp_mac_up_ref(mac);
163}
164
165void EVP_MAC_free(EVP_MAC *mac)
166{
167 evp_mac_free(mac);
168}
169
7dd0f299
RL
170const OSSL_PROVIDER *EVP_MAC_provider(const EVP_MAC *mac)
171{
172 return mac->prov;
173}
174
e74bd290
RL
175const OSSL_PARAM *EVP_MAC_gettable_params(const EVP_MAC *mac)
176{
177 if (mac->gettable_params == NULL)
178 return NULL;
18ec26ba 179 return mac->gettable_params(ossl_provider_ctx(EVP_MAC_provider(mac)));
e74bd290
RL
180}
181
41f7ecf3 182const OSSL_PARAM *EVP_MAC_gettable_ctx_params(const EVP_MAC *mac)
e74bd290
RL
183{
184 if (mac->gettable_ctx_params == NULL)
185 return NULL;
18ec26ba 186 return mac->gettable_ctx_params(ossl_provider_ctx(EVP_MAC_provider(mac)));
e74bd290
RL
187}
188
41f7ecf3 189const OSSL_PARAM *EVP_MAC_settable_ctx_params(const EVP_MAC *mac)
e74bd290
RL
190{
191 if (mac->settable_ctx_params == NULL)
192 return NULL;
18ec26ba 193 return mac->settable_ctx_params(ossl_provider_ctx(EVP_MAC_provider(mac)));
e74bd290 194}
d1cafb08 195
b4250010 196void EVP_MAC_do_all_provided(OSSL_LIB_CTX *libctx,
251e610c
RL
197 void (*fn)(EVP_MAC *mac, void *arg),
198 void *arg)
d1cafb08
RL
199{
200 evp_generic_do_all(libctx, OSSL_OP_MAC,
201 (void (*)(void *, void *))fn, arg,
0ddf74bf 202 evp_mac_from_dispatch, evp_mac_free);
d1cafb08 203}