1 /* 2 * Copyright 2025 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/core_dispatch.h> 11 #include <openssl/core_names.h> 12 #include "crypto/types.h" 13 #include "internal/skey.h" 14 #include "prov/provider_ctx.h" 15 #include "prov/providercommon.h" 16 #include "prov/implementations.h" 17 #include "skeymgmt_lcl.h" 18 19 void generic_free(void *keydata) 20 { 21 PROV_SKEY *generic = keydata; 22 23 if (generic == NULL) 24 return; 25 26 OPENSSL_free(generic->data); 27 OPENSSL_free(generic); 28 } 29 30 void *generic_import(void *provctx, int selection, const OSSL_PARAM params[]) 31 { 32 OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(provctx); 33 const OSSL_PARAM *raw_bytes; 34 PROV_SKEY *generic = NULL; 35 int ok = 0; 36 37 if (!ossl_prov_is_running()) 38 return NULL; 39 40 if ((selection & OSSL_SKEYMGMT_SELECT_SECRET_KEY) == 0) 41 return NULL; 42 43 raw_bytes = OSSL_PARAM_locate_const(params, OSSL_SKEY_PARAM_RAW_BYTES); 44 if (raw_bytes == NULL) 45 return NULL; 46 47 generic = OPENSSL_zalloc(sizeof(PROV_SKEY)); 48 if (generic == NULL) 49 return NULL; 50 51 generic->libctx = libctx; 52 53 generic->type = SKEY_TYPE_GENERIC; 54 55 if ((generic->data = OPENSSL_memdup(raw_bytes->data, raw_bytes->data_size)) == NULL) 56 goto end; 57 generic->length = raw_bytes->data_size; 58 ok = 1; 59 60 end: 61 if (ok == 0) { 62 generic_free(generic); 63 generic = NULL; 64 } 65 return generic; 66 } 67 68 int generic_export(void *keydata, int selection, 69 OSSL_CALLBACK *param_callback, void *cbarg) 70 { 71 PROV_SKEY *gen = keydata; 72 OSSL_PARAM params[2]; 73 74 if (!ossl_prov_is_running() || gen == NULL) 75 return 0; 76 77 /* If we use generic SKEYMGMT as a "base class", we shouldn't check the type */ 78 if ((selection & OSSL_SKEYMGMT_SELECT_SECRET_KEY) == 0) 79 return 0; 80 81 params[0] = OSSL_PARAM_construct_octet_string(OSSL_SKEY_PARAM_RAW_BYTES, 82 gen->data, gen->length); 83 params[1] = OSSL_PARAM_construct_end(); 84 85 return param_callback(params, cbarg); 86 } 87 88 const OSSL_DISPATCH ossl_generic_skeymgmt_functions[] = { 89 { OSSL_FUNC_SKEYMGMT_FREE, (void (*)(void))generic_free }, 90 { OSSL_FUNC_SKEYMGMT_IMPORT, (void (*)(void))generic_import }, 91 { OSSL_FUNC_SKEYMGMT_EXPORT, (void (*)(void))generic_export }, 92 OSSL_DISPATCH_END 93 }; 94