xref: /freebsd/crypto/openssl/providers/implementations/skeymgmt/generic.c (revision e7be843b4a162e68651d3911f0357ed464915629)
1*e7be843bSPierre Pronchery /*
2*e7be843bSPierre Pronchery  * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved.
3*e7be843bSPierre Pronchery  *
4*e7be843bSPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5*e7be843bSPierre Pronchery  * this file except in compliance with the License.  You can obtain a copy
6*e7be843bSPierre Pronchery  * in the file LICENSE in the source distribution or at
7*e7be843bSPierre Pronchery  * https://www.openssl.org/source/license.html
8*e7be843bSPierre Pronchery  */
9*e7be843bSPierre Pronchery 
10*e7be843bSPierre Pronchery #include <openssl/core_dispatch.h>
11*e7be843bSPierre Pronchery #include <openssl/core_names.h>
12*e7be843bSPierre Pronchery #include "crypto/types.h"
13*e7be843bSPierre Pronchery #include "internal/skey.h"
14*e7be843bSPierre Pronchery #include "prov/provider_ctx.h"
15*e7be843bSPierre Pronchery #include "prov/providercommon.h"
16*e7be843bSPierre Pronchery #include "prov/implementations.h"
17*e7be843bSPierre Pronchery #include "skeymgmt_lcl.h"
18*e7be843bSPierre Pronchery 
generic_free(void * keydata)19*e7be843bSPierre Pronchery void generic_free(void *keydata)
20*e7be843bSPierre Pronchery {
21*e7be843bSPierre Pronchery     PROV_SKEY *generic = keydata;
22*e7be843bSPierre Pronchery 
23*e7be843bSPierre Pronchery     if (generic == NULL)
24*e7be843bSPierre Pronchery         return;
25*e7be843bSPierre Pronchery 
26*e7be843bSPierre Pronchery     OPENSSL_free(generic->data);
27*e7be843bSPierre Pronchery     OPENSSL_free(generic);
28*e7be843bSPierre Pronchery }
29*e7be843bSPierre Pronchery 
generic_import(void * provctx,int selection,const OSSL_PARAM params[])30*e7be843bSPierre Pronchery void *generic_import(void *provctx, int selection, const OSSL_PARAM params[])
31*e7be843bSPierre Pronchery {
32*e7be843bSPierre Pronchery     OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(provctx);
33*e7be843bSPierre Pronchery     const OSSL_PARAM *raw_bytes;
34*e7be843bSPierre Pronchery     PROV_SKEY *generic = NULL;
35*e7be843bSPierre Pronchery     int ok = 0;
36*e7be843bSPierre Pronchery 
37*e7be843bSPierre Pronchery     if (!ossl_prov_is_running())
38*e7be843bSPierre Pronchery         return NULL;
39*e7be843bSPierre Pronchery 
40*e7be843bSPierre Pronchery     if ((selection & OSSL_SKEYMGMT_SELECT_SECRET_KEY) == 0)
41*e7be843bSPierre Pronchery         return NULL;
42*e7be843bSPierre Pronchery 
43*e7be843bSPierre Pronchery     raw_bytes = OSSL_PARAM_locate_const(params, OSSL_SKEY_PARAM_RAW_BYTES);
44*e7be843bSPierre Pronchery     if (raw_bytes == NULL)
45*e7be843bSPierre Pronchery         return NULL;
46*e7be843bSPierre Pronchery 
47*e7be843bSPierre Pronchery     generic = OPENSSL_zalloc(sizeof(PROV_SKEY));
48*e7be843bSPierre Pronchery     if (generic == NULL)
49*e7be843bSPierre Pronchery         return NULL;
50*e7be843bSPierre Pronchery 
51*e7be843bSPierre Pronchery     generic->libctx = libctx;
52*e7be843bSPierre Pronchery 
53*e7be843bSPierre Pronchery     generic->type = SKEY_TYPE_GENERIC;
54*e7be843bSPierre Pronchery 
55*e7be843bSPierre Pronchery     if ((generic->data = OPENSSL_memdup(raw_bytes->data, raw_bytes->data_size)) == NULL)
56*e7be843bSPierre Pronchery         goto end;
57*e7be843bSPierre Pronchery     generic->length = raw_bytes->data_size;
58*e7be843bSPierre Pronchery     ok = 1;
59*e7be843bSPierre Pronchery 
60*e7be843bSPierre Pronchery end:
61*e7be843bSPierre Pronchery     if (ok == 0) {
62*e7be843bSPierre Pronchery         generic_free(generic);
63*e7be843bSPierre Pronchery         generic = NULL;
64*e7be843bSPierre Pronchery     }
65*e7be843bSPierre Pronchery     return generic;
66*e7be843bSPierre Pronchery }
67*e7be843bSPierre Pronchery 
generic_export(void * keydata,int selection,OSSL_CALLBACK * param_callback,void * cbarg)68*e7be843bSPierre Pronchery int generic_export(void *keydata, int selection,
69*e7be843bSPierre Pronchery                    OSSL_CALLBACK *param_callback, void *cbarg)
70*e7be843bSPierre Pronchery {
71*e7be843bSPierre Pronchery     PROV_SKEY *gen = keydata;
72*e7be843bSPierre Pronchery     OSSL_PARAM params[2];
73*e7be843bSPierre Pronchery 
74*e7be843bSPierre Pronchery     if (!ossl_prov_is_running() || gen == NULL)
75*e7be843bSPierre Pronchery         return 0;
76*e7be843bSPierre Pronchery 
77*e7be843bSPierre Pronchery     /* If we use generic SKEYMGMT as a "base class", we shouldn't check the type */
78*e7be843bSPierre Pronchery     if ((selection & OSSL_SKEYMGMT_SELECT_SECRET_KEY) == 0)
79*e7be843bSPierre Pronchery         return 0;
80*e7be843bSPierre Pronchery 
81*e7be843bSPierre Pronchery     params[0] = OSSL_PARAM_construct_octet_string(OSSL_SKEY_PARAM_RAW_BYTES,
82*e7be843bSPierre Pronchery                                                   gen->data, gen->length);
83*e7be843bSPierre Pronchery     params[1] = OSSL_PARAM_construct_end();
84*e7be843bSPierre Pronchery 
85*e7be843bSPierre Pronchery     return param_callback(params, cbarg);
86*e7be843bSPierre Pronchery }
87*e7be843bSPierre Pronchery 
88*e7be843bSPierre Pronchery const OSSL_DISPATCH ossl_generic_skeymgmt_functions[] = {
89*e7be843bSPierre Pronchery     { OSSL_FUNC_SKEYMGMT_FREE, (void (*)(void))generic_free },
90*e7be843bSPierre Pronchery     { OSSL_FUNC_SKEYMGMT_IMPORT, (void (*)(void))generic_import },
91*e7be843bSPierre Pronchery     { OSSL_FUNC_SKEYMGMT_EXPORT, (void (*)(void))generic_export },
92*e7be843bSPierre Pronchery     OSSL_DISPATCH_END
93*e7be843bSPierre Pronchery };
94