1 | /* |
2 | * Copyright 2019-2023 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 | #ifndef OPENSSL_CORE_H |
11 | # define OPENSSL_CORE_H |
12 | # pragma once |
13 | |
14 | # include <stddef.h> |
15 | # include <openssl/types.h> |
16 | |
17 | # ifdef __cplusplus |
18 | extern "C" { |
19 | # endif |
20 | |
21 | /*- |
22 | * Base types |
23 | * ---------- |
24 | * |
25 | * These are the types that the OpenSSL core and providers have in common |
26 | * to communicate data between them. |
27 | */ |
28 | |
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; |
33 | |
34 | /* |
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. |
37 | * |
38 | * An array of these is always terminated by function_id == 0 |
39 | */ |
40 | struct ossl_dispatch_st { |
41 | int function_id; |
42 | void (*function)(void); |
43 | }; |
44 | |
45 | # define OSSL_DISPATCH_END \ |
46 | { 0, NULL } |
47 | |
48 | /* |
49 | * Other items, essentially an int<->pointer map element. |
50 | * |
51 | * We make this type distinct from OSSL_DISPATCH to ensure that dispatch |
52 | * tables remain tables with function pointers only. |
53 | * |
54 | * This is used whenever we need to pass things like a table of error reason |
55 | * codes <-> reason string maps, ... |
56 | * |
57 | * Usage determines which field works as key if any, rather than field order. |
58 | * |
59 | * An array of these is always terminated by id == 0 && ptr == NULL |
60 | */ |
61 | struct ossl_item_st { |
62 | unsigned int id; |
63 | void *ptr; |
64 | }; |
65 | |
66 | /* |
67 | * Type to tie together algorithm names, property definition string and |
68 | * the algorithm implementation in the form of a dispatch table. |
69 | * |
70 | * An array of these is always terminated by algorithm_names == NULL |
71 | */ |
72 | struct ossl_algorithm_st { |
73 | const char *algorithm_names; /* key */ |
74 | const char *property_definition; /* key */ |
75 | const OSSL_DISPATCH *implementation; |
76 | const char *algorithm_description; |
77 | }; |
78 | |
79 | /* |
80 | * Type to pass object data in a uniform way, without exposing the object |
81 | * structure. |
82 | * |
83 | * An array of these is always terminated by key == NULL |
84 | */ |
85 | struct ossl_param_st { |
86 | const char *key; /* the name of the parameter */ |
87 | unsigned int data_type; /* declare what kind of content is in buffer */ |
88 | void *data; /* value being passed in or out */ |
89 | size_t data_size; /* data size */ |
90 | size_t return_size; /* returned content size */ |
91 | }; |
92 | |
93 | /* Currently supported OSSL_PARAM data types */ |
94 | /* |
95 | * OSSL_PARAM_INTEGER and OSSL_PARAM_UNSIGNED_INTEGER |
96 | * are arbitrary length and therefore require an arbitrarily sized buffer, |
97 | * since they may be used to pass numbers larger than what is natively |
98 | * available. |
99 | * |
100 | * The number must be buffered in native form, i.e. MSB first on B_ENDIAN |
101 | * systems and LSB first on L_ENDIAN systems. This means that arbitrary |
102 | * native integers can be stored in the buffer, just make sure that the |
103 | * buffer size is correct and the buffer itself is properly aligned (for |
104 | * example by having the buffer field point at a C integer). |
105 | */ |
106 | # define OSSL_PARAM_INTEGER 1 |
107 | # define OSSL_PARAM_UNSIGNED_INTEGER 2 |
108 | /*- |
109 | * OSSL_PARAM_REAL |
110 | * is a C binary floating point values in native form and alignment. |
111 | */ |
112 | # define OSSL_PARAM_REAL 3 |
113 | /*- |
114 | * OSSL_PARAM_UTF8_STRING |
115 | * is a printable string. It is expected to be printed as it is. |
116 | */ |
117 | # define OSSL_PARAM_UTF8_STRING 4 |
118 | /*- |
119 | * OSSL_PARAM_OCTET_STRING |
120 | * is a string of bytes with no further specification. It is expected to be |
121 | * printed as a hexdump. |
122 | */ |
123 | # define OSSL_PARAM_OCTET_STRING 5 |
124 | /*- |
125 | * OSSL_PARAM_UTF8_PTR |
126 | * is a pointer to a printable string. It is expected to be printed as it is. |
127 | * |
128 | * The difference between this and OSSL_PARAM_UTF8_STRING is that only pointers |
129 | * are manipulated for this type. |
130 | * |
131 | * This is more relevant for parameter requests, where the responding |
132 | * function doesn't need to copy the data to the provided buffer, but |
133 | * sets the provided buffer to point at the actual data instead. |
134 | * |
135 | * WARNING! Using these is FRAGILE, as it assumes that the actual |
136 | * data and its location are constant. |
137 | * |
138 | * EXTRA WARNING! If you are not completely sure you most likely want |
139 | * to use the OSSL_PARAM_UTF8_STRING type. |
140 | */ |
141 | # define OSSL_PARAM_UTF8_PTR 6 |
142 | /*- |
143 | * OSSL_PARAM_OCTET_PTR |
144 | * is a pointer to a string of bytes with no further specification. It is |
145 | * expected to be printed as a hexdump. |
146 | * |
147 | * The difference between this and OSSL_PARAM_OCTET_STRING is that only pointers |
148 | * are manipulated for this type. |
149 | * |
150 | * This is more relevant for parameter requests, where the responding |
151 | * function doesn't need to copy the data to the provided buffer, but |
152 | * sets the provided buffer to point at the actual data instead. |
153 | * |
154 | * WARNING! Using these is FRAGILE, as it assumes that the actual |
155 | * data and its location are constant. |
156 | * |
157 | * EXTRA WARNING! If you are not completely sure you most likely want |
158 | * to use the OSSL_PARAM_OCTET_STRING type. |
159 | */ |
160 | # define OSSL_PARAM_OCTET_PTR 7 |
161 | |
162 | /* |
163 | * Typedef for the thread stop handling callback. Used both internally and by |
164 | * providers. |
165 | * |
166 | * Providers may register for notifications about threads stopping by |
167 | * registering a callback to hear about such events. Providers register the |
168 | * callback using the OSSL_FUNC_CORE_THREAD_START function in the |in| dispatch |
169 | * table passed to OSSL_provider_init(). The arg passed back to a provider will |
170 | * be the provider side context object. |
171 | */ |
172 | typedef void (*OSSL_thread_stop_handler_fn)(void *arg); |
173 | |
174 | |
175 | /*- |
176 | * Provider entry point |
177 | * -------------------- |
178 | * |
179 | * This function is expected to be present in any dynamically loadable |
180 | * provider module. By definition, if this function doesn't exist in a |
181 | * module, that module is not an OpenSSL provider module. |
182 | */ |
183 | /*- |
184 | * |handle| pointer to opaque type OSSL_CORE_HANDLE. This can be used |
185 | * together with some functions passed via |in| to query data. |
186 | * |in| is the array of functions that the Core passes to the provider. |
187 | * |out| will be the array of base functions that the provider passes |
188 | * back to the Core. |
189 | * |provctx| a provider side context object, optionally created if the |
190 | * provider needs it. This value is passed to other provider |
191 | * functions, notably other context constructors. |
192 | */ |
193 | typedef int (OSSL_provider_init_fn)(const OSSL_CORE_HANDLE *handle, |
194 | const OSSL_DISPATCH *in, |
195 | const OSSL_DISPATCH **out, |
196 | void **provctx); |
197 | # ifdef __VMS |
198 | # pragma names save |
199 | # pragma names uppercase,truncated |
200 | # endif |
201 | OPENSSL_EXPORT OSSL_provider_init_fn OSSL_provider_init; |
202 | # ifdef __VMS |
203 | # pragma names restore |
204 | # endif |
205 | |
206 | /* |
207 | * Generic callback function signature. |
208 | * |
209 | * The expectation is that any provider function that wants to offer |
210 | * a callback / hook can do so by taking an argument with this type, |
211 | * as well as a pointer to caller-specific data. When calling the |
212 | * callback, the provider function can populate an OSSL_PARAM array |
213 | * with data of its choice and pass that in the callback call, along |
214 | * with the caller data argument. |
215 | * |
216 | * libcrypto may use the OSSL_PARAM array to create arguments for an |
217 | * application callback it knows about. |
218 | */ |
219 | typedef int (OSSL_CALLBACK)(const OSSL_PARAM params[], void *arg); |
220 | typedef int (OSSL_INOUT_CALLBACK)(const OSSL_PARAM in_params[], |
221 | OSSL_PARAM out_params[], void *arg); |
222 | /* |
223 | * Passphrase callback function signature |
224 | * |
225 | * This is similar to the generic callback function above, but adds a |
226 | * result parameter. |
227 | */ |
228 | typedef int (OSSL_PASSPHRASE_CALLBACK)(char *pass, size_t pass_size, |
229 | size_t *pass_len, |
230 | const OSSL_PARAM params[], void *arg); |
231 | |
232 | # ifdef __cplusplus |
233 | } |
234 | # endif |
235 | |
236 | #endif |
237 | |