2 * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved.
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
10 #ifndef OPENSSL_CORE_H
11 # define OPENSSL_CORE_H
15 # include <openssl/types.h>
25 * These are the types that the OpenSSL core and providers have in common
26 * to communicate data between them.
29 /* Opaque handles to be used with core upcall functions from providers */
30 typedef struct ossl_core_handle_st OSSL_CORE_HANDLE;
31 typedef struct openssl_core_ctx_st OPENSSL_CORE_CTX;
32 typedef struct ossl_core_bio_st OSSL_CORE_BIO;
35 * Dispatch table element. function_id numbers and the functions are defined
36 * in core_dispatch.h, see macros with 'OSSL_CORE_MAKE_FUNC' in their names.
38 * An array of these is always terminated by function_id == 0
40 struct ossl_dispatch_st {
42 void (*function)(void);
46 * Other items, essentially an int<->pointer map element.
48 * We make this type distinct from OSSL_DISPATCH to ensure that dispatch
49 * tables remain tables with function pointers only.
51 * This is used whenever we need to pass things like a table of error reason
52 * codes <-> reason string maps, ...
54 * Usage determines which field works as key if any, rather than field order.
56 * An array of these is always terminated by id == 0 && ptr == NULL
64 * Type to tie together algorithm names, property definition string and
65 * the algorithm implementation in the form of a dispatch table.
67 * An array of these is always terminated by algorithm_names == NULL
69 struct ossl_algorithm_st {
70 const char *algorithm_names; /* key */
71 const char *property_definition; /* key */
72 const OSSL_DISPATCH *implementation;
73 const char *algorithm_description;
77 * Type to pass object data in a uniform way, without exposing the object
80 * An array of these is always terminated by key == NULL
82 struct ossl_param_st {
83 const char *key; /* the name of the parameter */
84 unsigned int data_type; /* declare what kind of content is in buffer */
85 void *data; /* value being passed in or out */
86 size_t data_size; /* data size */
87 size_t return_size; /* returned content size */
90 /* Currently supported OSSL_PARAM data types */
92 * OSSL_PARAM_INTEGER and OSSL_PARAM_UNSIGNED_INTEGER
93 * are arbitrary length and therefore require an arbitrarily sized buffer,
94 * since they may be used to pass numbers larger than what is natively
97 * The number must be buffered in native form, i.e. MSB first on B_ENDIAN
98 * systems and LSB first on L_ENDIAN systems. This means that arbitrary
99 * native integers can be stored in the buffer, just make sure that the
100 * buffer size is correct and the buffer itself is properly aligned (for
101 * example by having the buffer field point at a C integer).
103 # define OSSL_PARAM_INTEGER 1
104 # define OSSL_PARAM_UNSIGNED_INTEGER 2
107 * is a C binary floating point values in native form and alignment.
109 # define OSSL_PARAM_REAL 3
111 * OSSL_PARAM_UTF8_STRING
112 * is a printable string. It is expected to be printed as it is.
114 # define OSSL_PARAM_UTF8_STRING 4
116 * OSSL_PARAM_OCTET_STRING
117 * is a string of bytes with no further specification. It is expected to be
118 * printed as a hexdump.
120 # define OSSL_PARAM_OCTET_STRING 5
122 * OSSL_PARAM_UTF8_PTR
123 * is a pointer to a printable string. It is expected to be printed as it is.
125 * The difference between this and OSSL_PARAM_UTF8_STRING is that only pointers
126 * are manipulated for this type.
128 * This is more relevant for parameter requests, where the responding
129 * function doesn't need to copy the data to the provided buffer, but
130 * sets the provided buffer to point at the actual data instead.
132 * WARNING! Using these is FRAGILE, as it assumes that the actual
133 * data and its location are constant.
135 * EXTRA WARNING! If you are not completely sure you most likely want
136 * to use the OSSL_PARAM_UTF8_STRING type.
138 # define OSSL_PARAM_UTF8_PTR 6
140 * OSSL_PARAM_OCTET_PTR
141 * is a pointer to a string of bytes with no further specification. It is
142 * expected to be printed as a hexdump.
144 * The difference between this and OSSL_PARAM_OCTET_STRING is that only pointers
145 * are manipulated for this type.
147 * This is more relevant for parameter requests, where the responding
148 * function doesn't need to copy the data to the provided buffer, but
149 * sets the provided buffer to point at the actual data instead.
151 * WARNING! Using these is FRAGILE, as it assumes that the actual
152 * data and its location are constant.
154 * EXTRA WARNING! If you are not completely sure you most likely want
155 * to use the OSSL_PARAM_OCTET_STRING type.
157 # define OSSL_PARAM_OCTET_PTR 7
160 * Typedef for the thread stop handling callback. Used both internally and by
163 * Providers may register for notifications about threads stopping by
164 * registering a callback to hear about such events. Providers register the
165 * callback using the OSSL_FUNC_CORE_THREAD_START function in the |in| dispatch
166 * table passed to OSSL_provider_init(). The arg passed back to a provider will
167 * be the provider side context object.
169 typedef void (*OSSL_thread_stop_handler_fn)(void *arg);
173 * Provider entry point
174 * --------------------
176 * This function is expected to be present in any dynamically loadable
177 * provider module. By definition, if this function doesn't exist in a
178 * module, that module is not an OpenSSL provider module.
181 * |handle| pointer to opaque type OSSL_CORE_HANDLE. This can be used
182 * together with some functions passed via |in| to query data.
183 * |in| is the array of functions that the Core passes to the provider.
184 * |out| will be the array of base functions that the provider passes
186 * |provctx| a provider side context object, optionally created if the
187 * provider needs it. This value is passed to other provider
188 * functions, notably other context constructors.
190 typedef int (OSSL_provider_init_fn)(const OSSL_CORE_HANDLE *handle,
191 const OSSL_DISPATCH *in,
192 const OSSL_DISPATCH **out,
196 # pragma names uppercase,truncated
198 extern OSSL_provider_init_fn OSSL_provider_init;
200 # pragma names restore
204 * Generic callback function signature.
206 * The expectation is that any provider function that wants to offer
207 * a callback / hook can do so by taking an argument with this type,
208 * as well as a pointer to caller-specific data. When calling the
209 * callback, the provider function can populate an OSSL_PARAM array
210 * with data of its choice and pass that in the callback call, along
211 * with the caller data argument.
213 * libcrypto may use the OSSL_PARAM array to create arguments for an
214 * application callback it knows about.
216 typedef int (OSSL_CALLBACK)(const OSSL_PARAM params[], void *arg);
217 typedef int (OSSL_INOUT_CALLBACK)(const OSSL_PARAM in_params[],
218 OSSL_PARAM out_params[], void *arg);
220 * Passphrase callback function signature
222 * This is similar to the generic callback function above, but adds a
225 typedef int (OSSL_PASSPHRASE_CALLBACK)(char *pass, size_t pass_size,
227 const OSSL_PARAM params[], void *arg);