Implement a EVP_PKEY KDF to KDF provider bridge
[openssl.git] / providers / implementations / keymgmt / kdf_legacy_kmgmt.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 /*
11  * This implemments a dummy key manager for legacy KDFs that still support the
12  * old way of performing a KDF via EVP_PKEY_derive(). New KDFs should not be
13  * implemented this way. In reality there is no key data for such KDFs, so this
14  * key manager does very little.
15  */
16
17 #include <openssl/core_dispatch.h>
18 #include <openssl/core_names.h>
19 #include <openssl/err.h>
20 #include "prov/implementations.h"
21 #include "prov/providercommon.h"
22 #include "prov/provider_ctx.h"
23 #include "prov/kdfexchange.h"
24
25 static OSSL_FUNC_keymgmt_new_fn kdf_newdata;
26 static OSSL_FUNC_keymgmt_free_fn kdf_freedata;
27 static OSSL_FUNC_keymgmt_has_fn kdf_has;
28
29 KDF_DATA *kdf_data_new(void *provctx)
30 {
31     KDF_DATA *kdfdata = OPENSSL_zalloc(sizeof(*kdfdata));
32
33     if (kdfdata == NULL)
34         return NULL;
35
36     kdfdata->lock = CRYPTO_THREAD_lock_new();
37     if (kdfdata->lock == NULL) {
38         OPENSSL_free(kdfdata);
39         return NULL;
40     }
41     kdfdata->libctx = PROV_LIBRARY_CONTEXT_OF(provctx);
42     kdfdata->refcnt = 1;
43
44     return kdfdata;
45 }
46
47 void kdf_data_free(KDF_DATA *kdfdata)
48 {
49     int ref = 0;
50
51     if (kdfdata == NULL)
52         return;
53
54     CRYPTO_DOWN_REF(&kdfdata->refcnt, &ref, kdfdata->lock);
55     if (ref > 0)
56         return;
57
58     CRYPTO_THREAD_lock_free(kdfdata->lock);
59     OPENSSL_free(kdfdata);
60 }
61
62 int kdf_data_up_ref(KDF_DATA *kdfdata)
63 {
64     int ref = 0;
65
66     CRYPTO_UP_REF(&kdfdata->refcnt, &ref, kdfdata->lock);
67     return 1;
68 }
69
70 static void *kdf_newdata(void *provctx)
71 {
72     return kdf_data_new(provctx);
73 }
74
75 static void kdf_freedata(void *kdfdata)
76 {
77     kdf_data_free(kdfdata);
78 }
79
80 static int kdf_has(void *keydata, int selection)
81 {
82     return 0;
83 }
84
85 const OSSL_DISPATCH kdf_keymgmt_functions[] = {
86     { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))kdf_newdata },
87     { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))kdf_freedata },
88     { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))kdf_has },
89     { 0, NULL }
90 };