xref: /src/crypto/openssl/providers/implementations/encode_decode/endecoder_common.c (revision f25b8c9fb4f58cf61adb47d7570abe7caa6d385d)
1e4520c8bSEnji Cooper /*
2e4520c8bSEnji Cooper  * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
3e4520c8bSEnji Cooper  *
4e4520c8bSEnji Cooper  * Licensed under the Apache License 2.0 (the "License").  You may not use
5e4520c8bSEnji Cooper  * this file except in compliance with the License.  You can obtain a copy
6e4520c8bSEnji Cooper  * in the file LICENSE in the source distribution or at
7e4520c8bSEnji Cooper  * https://www.openssl.org/source/license.html
8e4520c8bSEnji Cooper  */
9e4520c8bSEnji Cooper 
10e4520c8bSEnji Cooper #include <openssl/core.h>
11e4520c8bSEnji Cooper #include <openssl/buffer.h>
12e4520c8bSEnji Cooper #include "internal/asn1.h"
13e4520c8bSEnji Cooper #include "prov/bio.h"
14e4520c8bSEnji Cooper #include "endecoder_local.h"
15e4520c8bSEnji Cooper 
16e4520c8bSEnji Cooper OSSL_FUNC_keymgmt_new_fn *
ossl_prov_get_keymgmt_new(const OSSL_DISPATCH * fns)17e4520c8bSEnji Cooper ossl_prov_get_keymgmt_new(const OSSL_DISPATCH *fns)
18e4520c8bSEnji Cooper {
19e4520c8bSEnji Cooper     /* Pilfer the keymgmt dispatch table */
20e4520c8bSEnji Cooper     for (; fns->function_id != 0; fns++)
21e4520c8bSEnji Cooper         if (fns->function_id == OSSL_FUNC_KEYMGMT_NEW)
22e4520c8bSEnji Cooper             return OSSL_FUNC_keymgmt_new(fns);
23e4520c8bSEnji Cooper 
24e4520c8bSEnji Cooper     return NULL;
25e4520c8bSEnji Cooper }
26e4520c8bSEnji Cooper 
27e4520c8bSEnji Cooper OSSL_FUNC_keymgmt_free_fn *
ossl_prov_get_keymgmt_free(const OSSL_DISPATCH * fns)28e4520c8bSEnji Cooper ossl_prov_get_keymgmt_free(const OSSL_DISPATCH *fns)
29e4520c8bSEnji Cooper {
30e4520c8bSEnji Cooper     /* Pilfer the keymgmt dispatch table */
31e4520c8bSEnji Cooper     for (; fns->function_id != 0; fns++)
32e4520c8bSEnji Cooper         if (fns->function_id == OSSL_FUNC_KEYMGMT_FREE)
33e4520c8bSEnji Cooper             return OSSL_FUNC_keymgmt_free(fns);
34e4520c8bSEnji Cooper 
35e4520c8bSEnji Cooper     return NULL;
36e4520c8bSEnji Cooper }
37e4520c8bSEnji Cooper 
38e4520c8bSEnji Cooper OSSL_FUNC_keymgmt_import_fn *
ossl_prov_get_keymgmt_import(const OSSL_DISPATCH * fns)39e4520c8bSEnji Cooper ossl_prov_get_keymgmt_import(const OSSL_DISPATCH *fns)
40e4520c8bSEnji Cooper {
41e4520c8bSEnji Cooper     /* Pilfer the keymgmt dispatch table */
42e4520c8bSEnji Cooper     for (; fns->function_id != 0; fns++)
43e4520c8bSEnji Cooper         if (fns->function_id == OSSL_FUNC_KEYMGMT_IMPORT)
44e4520c8bSEnji Cooper             return OSSL_FUNC_keymgmt_import(fns);
45e4520c8bSEnji Cooper 
46e4520c8bSEnji Cooper     return NULL;
47e4520c8bSEnji Cooper }
48e4520c8bSEnji Cooper 
49e4520c8bSEnji Cooper OSSL_FUNC_keymgmt_export_fn *
ossl_prov_get_keymgmt_export(const OSSL_DISPATCH * fns)50e4520c8bSEnji Cooper ossl_prov_get_keymgmt_export(const OSSL_DISPATCH *fns)
51e4520c8bSEnji Cooper {
52e4520c8bSEnji Cooper     /* Pilfer the keymgmt dispatch table */
53e4520c8bSEnji Cooper     for (; fns->function_id != 0; fns++)
54e4520c8bSEnji Cooper         if (fns->function_id == OSSL_FUNC_KEYMGMT_EXPORT)
55e4520c8bSEnji Cooper             return OSSL_FUNC_keymgmt_export(fns);
56e4520c8bSEnji Cooper 
57e4520c8bSEnji Cooper     return NULL;
58e4520c8bSEnji Cooper }
59e4520c8bSEnji Cooper 
ossl_prov_import_key(const OSSL_DISPATCH * fns,void * provctx,int selection,const OSSL_PARAM params[])60e4520c8bSEnji Cooper void *ossl_prov_import_key(const OSSL_DISPATCH *fns, void *provctx,
61e4520c8bSEnji Cooper     int selection, const OSSL_PARAM params[])
62e4520c8bSEnji Cooper {
63e4520c8bSEnji Cooper     OSSL_FUNC_keymgmt_new_fn *kmgmt_new = ossl_prov_get_keymgmt_new(fns);
64e4520c8bSEnji Cooper     OSSL_FUNC_keymgmt_free_fn *kmgmt_free = ossl_prov_get_keymgmt_free(fns);
65808413daSEnji Cooper     OSSL_FUNC_keymgmt_import_fn *kmgmt_import = ossl_prov_get_keymgmt_import(fns);
66e4520c8bSEnji Cooper     void *key = NULL;
67e4520c8bSEnji Cooper 
68e4520c8bSEnji Cooper     if (kmgmt_new != NULL && kmgmt_import != NULL && kmgmt_free != NULL) {
69e4520c8bSEnji Cooper         if ((key = kmgmt_new(provctx)) == NULL
70e4520c8bSEnji Cooper             || !kmgmt_import(key, selection, params)) {
71e4520c8bSEnji Cooper             kmgmt_free(key);
72e4520c8bSEnji Cooper             key = NULL;
73e4520c8bSEnji Cooper         }
74e4520c8bSEnji Cooper     }
75e4520c8bSEnji Cooper     return key;
76e4520c8bSEnji Cooper }
77e4520c8bSEnji Cooper 
ossl_prov_free_key(const OSSL_DISPATCH * fns,void * key)78e4520c8bSEnji Cooper void ossl_prov_free_key(const OSSL_DISPATCH *fns, void *key)
79e4520c8bSEnji Cooper {
80e4520c8bSEnji Cooper     OSSL_FUNC_keymgmt_free_fn *kmgmt_free = ossl_prov_get_keymgmt_free(fns);
81e4520c8bSEnji Cooper 
82e4520c8bSEnji Cooper     if (kmgmt_free != NULL)
83e4520c8bSEnji Cooper         kmgmt_free(key);
84e4520c8bSEnji Cooper }
85e4520c8bSEnji Cooper 
ossl_read_der(PROV_CTX * provctx,OSSL_CORE_BIO * cin,unsigned char ** data,long * len)86e4520c8bSEnji Cooper int ossl_read_der(PROV_CTX *provctx, OSSL_CORE_BIO *cin, unsigned char **data,
87e4520c8bSEnji Cooper     long *len)
88e4520c8bSEnji Cooper {
89e4520c8bSEnji Cooper     BUF_MEM *mem = NULL;
90e4520c8bSEnji Cooper     BIO *in = ossl_bio_new_from_core_bio(provctx, cin);
91e4520c8bSEnji Cooper     int ok;
92e4520c8bSEnji Cooper 
93e4520c8bSEnji Cooper     if (in == NULL)
94e4520c8bSEnji Cooper         return 0;
95e4520c8bSEnji Cooper     ok = (asn1_d2i_read_bio(in, &mem) >= 0);
96e4520c8bSEnji Cooper     if (ok) {
97e4520c8bSEnji Cooper         *data = (unsigned char *)mem->data;
98e4520c8bSEnji Cooper         *len = (long)mem->length;
99e4520c8bSEnji Cooper         OPENSSL_free(mem);
100e4520c8bSEnji Cooper     }
101e4520c8bSEnji Cooper     BIO_free(in);
102e4520c8bSEnji Cooper     return ok;
103e4520c8bSEnji Cooper }
104