b75d02f13625c7320f1d9128fb2c876535b7df98
[oweals/openssl.git] / crypto / evp / keymgmt_meth.c
1 /*
2  * Copyright 2019-2020 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 #include <openssl/crypto.h>
11 #include <openssl/core_numbers.h>
12 #include <openssl/evp.h>
13 #include <openssl/err.h>
14 #include "internal/provider.h"
15 #include "internal/refcount.h"
16 #include "crypto/evp.h"
17 #include "evp_local.h"
18
19
20 static void *keymgmt_new(void)
21 {
22     EVP_KEYMGMT *keymgmt = NULL;
23
24     if ((keymgmt = OPENSSL_zalloc(sizeof(*keymgmt))) == NULL
25         || (keymgmt->lock = CRYPTO_THREAD_lock_new()) == NULL) {
26         EVP_KEYMGMT_free(keymgmt);
27         EVPerr(0, ERR_R_MALLOC_FAILURE);
28         return NULL;
29     }
30
31     keymgmt->refcnt = 1;
32
33     return keymgmt;
34 }
35
36 static void *keymgmt_from_dispatch(int name_id,
37                                    const OSSL_DISPATCH *fns,
38                                    OSSL_PROVIDER *prov)
39 {
40     EVP_KEYMGMT *keymgmt = NULL;
41     int setparamfncnt = 0, getparamfncnt = 0;
42     int setgenparamfncnt = 0;
43     int importfncnt = 0, exportfncnt = 0;
44
45     if ((keymgmt = keymgmt_new()) == NULL) {
46         EVP_KEYMGMT_free(keymgmt);
47         return NULL;
48     }
49     keymgmt->name_id = name_id;
50
51     for (; fns->function_id != 0; fns++) {
52         switch (fns->function_id) {
53         case OSSL_FUNC_KEYMGMT_NEW:
54             if (keymgmt->new == NULL)
55                 keymgmt->new = OSSL_get_OP_keymgmt_new(fns);
56             break;
57         case OSSL_FUNC_KEYMGMT_GEN_INIT:
58             if (keymgmt->gen_init == NULL)
59                 keymgmt->gen_init = OSSL_get_OP_keymgmt_gen_init(fns);
60             break;
61         case OSSL_FUNC_KEYMGMT_GEN_SET_TEMPLATE:
62             if (keymgmt->gen_set_template == NULL)
63                 keymgmt->gen_set_template =
64                     OSSL_get_OP_keymgmt_gen_set_template(fns);
65             break;
66         case OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS:
67             if (keymgmt->gen_set_params == NULL) {
68                 setgenparamfncnt++;
69                 keymgmt->gen_set_params =
70                     OSSL_get_OP_keymgmt_gen_set_params(fns);
71             }
72             break;
73         case OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS:
74             if (keymgmt->gen_settable_params == NULL) {
75                 setgenparamfncnt++;
76                 keymgmt->gen_settable_params =
77                     OSSL_get_OP_keymgmt_gen_settable_params(fns);
78             }
79             break;
80         case OSSL_FUNC_KEYMGMT_GEN:
81             if (keymgmt->gen == NULL)
82                 keymgmt->gen = OSSL_get_OP_keymgmt_gen(fns);
83             break;
84         case OSSL_FUNC_KEYMGMT_GEN_CLEANUP:
85             if (keymgmt->gen_cleanup == NULL)
86                 keymgmt->gen_cleanup = OSSL_get_OP_keymgmt_gen_cleanup(fns);
87             break;
88         case OSSL_FUNC_KEYMGMT_FREE:
89             if (keymgmt->free == NULL)
90                 keymgmt->free = OSSL_get_OP_keymgmt_free(fns);
91             break;
92         case OSSL_FUNC_KEYMGMT_GET_PARAMS:
93             if (keymgmt->get_params == NULL) {
94                 getparamfncnt++;
95                 keymgmt->get_params = OSSL_get_OP_keymgmt_get_params(fns);
96             }
97             break;
98         case OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS:
99             if (keymgmt->gettable_params == NULL) {
100                 getparamfncnt++;
101                 keymgmt->gettable_params =
102                     OSSL_get_OP_keymgmt_gettable_params(fns);
103             }
104             break;
105          case OSSL_FUNC_KEYMGMT_SET_PARAMS:
106             if (keymgmt->set_params == NULL) {
107                 setparamfncnt++;
108                 keymgmt->set_params = OSSL_get_OP_keymgmt_set_params(fns);
109             }
110             break;
111         case OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS:
112             if (keymgmt->settable_params == NULL) {
113                 setparamfncnt++;
114                 keymgmt->settable_params =
115                     OSSL_get_OP_keymgmt_settable_params(fns);
116             }
117             break;
118         case OSSL_FUNC_KEYMGMT_QUERY_OPERATION_NAME:
119             if (keymgmt->query_operation_name == NULL)
120                 keymgmt->query_operation_name =
121                     OSSL_get_OP_keymgmt_query_operation_name(fns);
122             break;
123         case OSSL_FUNC_KEYMGMT_HAS:
124             if (keymgmt->has == NULL)
125                 keymgmt->has = OSSL_get_OP_keymgmt_has(fns);
126             break;
127         case OSSL_FUNC_KEYMGMT_VALIDATE:
128             if (keymgmt->validate == NULL)
129                 keymgmt->validate = OSSL_get_OP_keymgmt_validate(fns);
130             break;
131         case OSSL_FUNC_KEYMGMT_MATCH:
132             if (keymgmt->match == NULL)
133                 keymgmt->match = OSSL_get_OP_keymgmt_match(fns);
134             break;
135         case OSSL_FUNC_KEYMGMT_IMPORT:
136             if (keymgmt->import == NULL) {
137                 importfncnt++;
138                 keymgmt->import = OSSL_get_OP_keymgmt_import(fns);
139             }
140             break;
141         case OSSL_FUNC_KEYMGMT_IMPORT_TYPES:
142             if (keymgmt->import_types == NULL) {
143                 importfncnt++;
144                 keymgmt->import_types = OSSL_get_OP_keymgmt_import_types(fns);
145             }
146             break;
147         case OSSL_FUNC_KEYMGMT_EXPORT:
148             if (keymgmt->export == NULL) {
149                 exportfncnt++;
150                 keymgmt->export = OSSL_get_OP_keymgmt_export(fns);
151             }
152             break;
153         case OSSL_FUNC_KEYMGMT_EXPORT_TYPES:
154             if (keymgmt->export_types == NULL) {
155                 exportfncnt++;
156                 keymgmt->export_types = OSSL_get_OP_keymgmt_export_types(fns);
157             }
158             break;
159         }
160     }
161     /*
162      * Try to check that the method is sensible.
163      * At least one constructor and the destructor are MANDATORY
164      * The functions 'has' is MANDATORY
165      * It makes no sense being able to free stuff if you can't create it.
166      * It makes no sense providing OSSL_PARAM descriptors for import and
167      * export if you can't import or export.
168      */
169     if (keymgmt->free == NULL
170         || (keymgmt->new == NULL && keymgmt->gen == NULL)
171         || keymgmt->has == NULL
172         || (getparamfncnt != 0 && getparamfncnt != 2)
173         || (setparamfncnt != 0 && setparamfncnt != 2)
174         || (setgenparamfncnt != 0 && setgenparamfncnt != 2)
175         || (importfncnt != 0 && importfncnt != 2)
176         || (exportfncnt != 0 && exportfncnt != 2)
177         || (keymgmt->gen != NULL
178             && (keymgmt->gen_init == NULL
179                 || keymgmt->gen_cleanup == NULL))) {
180         EVP_KEYMGMT_free(keymgmt);
181         EVPerr(0, EVP_R_INVALID_PROVIDER_FUNCTIONS);
182         return NULL;
183     }
184     keymgmt->prov = prov;
185     if (prov != NULL)
186         ossl_provider_up_ref(prov);
187
188     return keymgmt;
189 }
190
191 EVP_KEYMGMT *evp_keymgmt_fetch_by_number(OPENSSL_CTX *ctx, int name_id,
192                                          const char *properties)
193 {
194     return evp_generic_fetch_by_number(ctx,
195                                        OSSL_OP_KEYMGMT, name_id, properties,
196                                        keymgmt_from_dispatch,
197                                        (int (*)(void *))EVP_KEYMGMT_up_ref,
198                                        (void (*)(void *))EVP_KEYMGMT_free);
199 }
200
201 EVP_KEYMGMT *EVP_KEYMGMT_fetch(OPENSSL_CTX *ctx, const char *algorithm,
202                                const char *properties)
203 {
204     return evp_generic_fetch(ctx, OSSL_OP_KEYMGMT, algorithm, properties,
205                              keymgmt_from_dispatch,
206                              (int (*)(void *))EVP_KEYMGMT_up_ref,
207                              (void (*)(void *))EVP_KEYMGMT_free);
208 }
209
210 int EVP_KEYMGMT_up_ref(EVP_KEYMGMT *keymgmt)
211 {
212     int ref = 0;
213
214     CRYPTO_UP_REF(&keymgmt->refcnt, &ref, keymgmt->lock);
215     return 1;
216 }
217
218 void EVP_KEYMGMT_free(EVP_KEYMGMT *keymgmt)
219 {
220     int ref = 0;
221
222     if (keymgmt == NULL)
223         return;
224
225     CRYPTO_DOWN_REF(&keymgmt->refcnt, &ref, keymgmt->lock);
226     if (ref > 0)
227         return;
228     ossl_provider_free(keymgmt->prov);
229     CRYPTO_THREAD_lock_free(keymgmt->lock);
230     OPENSSL_free(keymgmt);
231 }
232
233 const OSSL_PROVIDER *EVP_KEYMGMT_provider(const EVP_KEYMGMT *keymgmt)
234 {
235     return keymgmt->prov;
236 }
237
238 int EVP_KEYMGMT_number(const EVP_KEYMGMT *keymgmt)
239 {
240     return keymgmt->name_id;
241 }
242
243 int EVP_KEYMGMT_is_a(const EVP_KEYMGMT *keymgmt, const char *name)
244 {
245     return evp_is_a(keymgmt->prov, keymgmt->name_id, NULL, name);
246 }
247
248 void EVP_KEYMGMT_do_all_provided(OPENSSL_CTX *libctx,
249                                  void (*fn)(EVP_KEYMGMT *keymgmt, void *arg),
250                                  void *arg)
251 {
252     evp_generic_do_all(libctx, OSSL_OP_KEYMGMT,
253                        (void (*)(void *, void *))fn, arg,
254                        keymgmt_from_dispatch,
255                        (void (*)(void *))EVP_KEYMGMT_free);
256 }
257
258 void EVP_KEYMGMT_names_do_all(const EVP_KEYMGMT *keymgmt,
259                               void (*fn)(const char *name, void *data),
260                               void *data)
261 {
262     if (keymgmt->prov != NULL)
263         evp_names_do_all(keymgmt->prov, keymgmt->name_id, fn, data);
264 }
265
266 /*
267  * Internal API that interfaces with the method function pointers
268  */
269 void *evp_keymgmt_newdata(const EVP_KEYMGMT *keymgmt)
270 {
271     void *provctx = ossl_provider_ctx(EVP_KEYMGMT_provider(keymgmt));
272
273     /*
274      * TODO(3.0) 'new' is currently mandatory on its own, but when new
275      * constructors appear, it won't be quite as mandatory, so we have
276      * a check for future cases.
277      */
278     if (keymgmt->new == NULL)
279         return NULL;
280     return keymgmt->new(provctx);
281 }
282
283 void evp_keymgmt_freedata(const EVP_KEYMGMT *keymgmt, void *keydata)
284 {
285     /* This is mandatory, no need to check for its presence */
286     keymgmt->free(keydata);
287 }
288
289 void *evp_keymgmt_gen_init(const EVP_KEYMGMT *keymgmt, int selection)
290 {
291     void *provctx = ossl_provider_ctx(EVP_KEYMGMT_provider(keymgmt));
292
293     if (keymgmt->gen_init == NULL)
294         return NULL;
295     return keymgmt->gen_init(provctx, selection);
296 }
297
298 int evp_keymgmt_gen_set_template(const EVP_KEYMGMT *keymgmt, void *genctx,
299                                  void *template)
300 {
301     /*
302      * It's arguable if we actually should return success in this case, as
303      * it allows the caller to set a template key, which is then ignored.
304      * However, this is how the legacy methods (EVP_PKEY_METHOD) operate,
305      * so we do this in the interest of backward compatibility.
306      * TODO(3.0) Investigate if we should change this behaviour.
307      */
308     if (keymgmt->gen_set_template == NULL)
309         return 1;
310     return keymgmt->gen_set_template(genctx, template);
311 }
312
313 int evp_keymgmt_gen_set_params(const EVP_KEYMGMT *keymgmt, void *genctx,
314                                const OSSL_PARAM params[])
315 {
316     if (keymgmt->gen_set_params == NULL)
317         return 0;
318     return keymgmt->gen_set_params(genctx, params);
319 }
320
321 const OSSL_PARAM *evp_keymgmt_gen_settable_params(const EVP_KEYMGMT *keymgmt)
322 {
323     void *provctx = ossl_provider_ctx(EVP_KEYMGMT_provider(keymgmt));
324
325     if (keymgmt->gen_settable_params == NULL)
326         return NULL;
327     return keymgmt->gen_settable_params(provctx);
328 }
329
330 void *evp_keymgmt_gen(const EVP_KEYMGMT *keymgmt, void *genctx,
331                       OSSL_CALLBACK *cb, void *cbarg)
332 {
333     if (keymgmt->gen == NULL)
334         return NULL;
335     return keymgmt->gen(genctx, cb, cbarg);
336 }
337
338 void evp_keymgmt_gen_cleanup(const EVP_KEYMGMT *keymgmt, void *genctx)
339 {
340     if (keymgmt->gen != NULL)
341         keymgmt->gen_cleanup(genctx);
342 }
343
344 int evp_keymgmt_get_params(const EVP_KEYMGMT *keymgmt, void *keydata,
345                            OSSL_PARAM params[])
346 {
347     if (keymgmt->get_params == NULL)
348         return 1;
349     return keymgmt->get_params(keydata, params);
350 }
351
352 const OSSL_PARAM *evp_keymgmt_gettable_params(const EVP_KEYMGMT *keymgmt)
353 {
354     if (keymgmt->gettable_params == NULL)
355         return NULL;
356     return keymgmt->gettable_params();
357 }
358
359 int evp_keymgmt_set_params(const EVP_KEYMGMT *keymgmt, void *keydata,
360                            const OSSL_PARAM params[])
361 {
362     if (keymgmt->set_params == NULL)
363         return 1;
364     return keymgmt->set_params(keydata, params);
365 }
366
367 const OSSL_PARAM *evp_keymgmt_settable_params(const EVP_KEYMGMT *keymgmt)
368 {
369     if (keymgmt->settable_params == NULL)
370         return NULL;
371     return keymgmt->settable_params();
372 }
373
374 int evp_keymgmt_has(const EVP_KEYMGMT *keymgmt, void *keydata, int selection)
375 {
376     /* This is mandatory, no need to check for its presence */
377     return keymgmt->has(keydata, selection);
378 }
379
380 int evp_keymgmt_validate(const EVP_KEYMGMT *keymgmt, void *keydata,
381                          int selection)
382 {
383     /* We assume valid if the implementation doesn't have a function */
384     if (keymgmt->validate == NULL)
385         return 1;
386     return keymgmt->validate(keydata, selection);
387 }
388
389 int evp_keymgmt_match(const EVP_KEYMGMT *keymgmt,
390                       const void *keydata1, const void *keydata2,
391                       int selection)
392 {
393     /* We assume no match if the implementation doesn't have a function */
394     if (keymgmt->match == NULL)
395         return 0;
396     return keymgmt->match(keydata1, keydata2, selection);
397 }
398
399 int evp_keymgmt_import(const EVP_KEYMGMT *keymgmt, void *keydata,
400                        int selection, const OSSL_PARAM params[])
401 {
402     if (keymgmt->import == NULL)
403         return 0;
404     return keymgmt->import(keydata, selection, params);
405 }
406
407 const OSSL_PARAM *evp_keymgmt_import_types(const EVP_KEYMGMT *keymgmt,
408                                            int selection)
409 {
410     if (keymgmt->import_types == NULL)
411         return NULL;
412     return keymgmt->import_types(selection);
413 }
414
415 int evp_keymgmt_export(const EVP_KEYMGMT *keymgmt, void *keydata,
416                        int selection, OSSL_CALLBACK *param_cb, void *cbarg)
417 {
418     if (keymgmt->export == NULL)
419         return 0;
420     return keymgmt->export(keydata, selection, param_cb, cbarg);
421 }
422
423 const OSSL_PARAM *evp_keymgmt_export_types(const EVP_KEYMGMT *keymgmt,
424                                            int selection)
425 {
426     if (keymgmt->export_types == NULL)
427         return NULL;
428     return keymgmt->export_types(selection);
429 }
430
431 int evp_keymgmt_copy(const EVP_KEYMGMT *keymgmt,
432                      void *keydata_to, const void *keydata_from,
433                      int selection)
434 {
435     /* We assume no copy if the implementation doesn't have a function */
436     if (keymgmt->copy == NULL)
437         return 0;
438     return keymgmt->copy(keydata_to, keydata_from, selection);
439 }