1 | /*
|
---|
2 | * Copyright 2019-2021 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 | /*
|
---|
46 | * Other items, essentially an int<->pointer map element.
|
---|
47 | *
|
---|
48 | * We make this type distinct from OSSL_DISPATCH to ensure that dispatch
|
---|
49 | * tables remain tables with function pointers only.
|
---|
50 | *
|
---|
51 | * This is used whenever we need to pass things like a table of error reason
|
---|
52 | * codes <-> reason string maps, ...
|
---|
53 | *
|
---|
54 | * Usage determines which field works as key if any, rather than field order.
|
---|
55 | *
|
---|
56 | * An array of these is always terminated by id == 0 && ptr == NULL
|
---|
57 | */
|
---|
58 | struct ossl_item_st {
|
---|
59 | unsigned int id;
|
---|
60 | void *ptr;
|
---|
61 | };
|
---|
62 |
|
---|
63 | /*
|
---|
64 | * Type to tie together algorithm names, property definition string and
|
---|
65 | * the algorithm implementation in the form of a dispatch table.
|
---|
66 | *
|
---|
67 | * An array of these is always terminated by algorithm_names == NULL
|
---|
68 | */
|
---|
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;
|
---|
74 | };
|
---|
75 |
|
---|
76 | /*
|
---|
77 | * Type to pass object data in a uniform way, without exposing the object
|
---|
78 | * structure.
|
---|
79 | *
|
---|
80 | * An array of these is always terminated by key == NULL
|
---|
81 | */
|
---|
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 */
|
---|
88 | };
|
---|
89 |
|
---|
90 | /* Currently supported OSSL_PARAM data types */
|
---|
91 | /*
|
---|
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
|
---|
95 | * available.
|
---|
96 | *
|
---|
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).
|
---|
102 | */
|
---|
103 | # define OSSL_PARAM_INTEGER 1
|
---|
104 | # define OSSL_PARAM_UNSIGNED_INTEGER 2
|
---|
105 | /*-
|
---|
106 | * OSSL_PARAM_REAL
|
---|
107 | * is a C binary floating point values in native form and alignment.
|
---|
108 | */
|
---|
109 | # define OSSL_PARAM_REAL 3
|
---|
110 | /*-
|
---|
111 | * OSSL_PARAM_UTF8_STRING
|
---|
112 | * is a printable string. It is expected to be printed as it is.
|
---|
113 | */
|
---|
114 | # define OSSL_PARAM_UTF8_STRING 4
|
---|
115 | /*-
|
---|
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.
|
---|
119 | */
|
---|
120 | # define OSSL_PARAM_OCTET_STRING 5
|
---|
121 | /*-
|
---|
122 | * OSSL_PARAM_UTF8_PTR
|
---|
123 | * is a pointer to a printable string. It is expected to be printed as it is.
|
---|
124 | *
|
---|
125 | * The difference between this and OSSL_PARAM_UTF8_STRING is that only pointers
|
---|
126 | * are manipulated for this type.
|
---|
127 | *
|
---|
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.
|
---|
131 | *
|
---|
132 | * WARNING! Using these is FRAGILE, as it assumes that the actual
|
---|
133 | * data and its location are constant.
|
---|
134 | *
|
---|
135 | * EXTRA WARNING! If you are not completely sure you most likely want
|
---|
136 | * to use the OSSL_PARAM_UTF8_STRING type.
|
---|
137 | */
|
---|
138 | # define OSSL_PARAM_UTF8_PTR 6
|
---|
139 | /*-
|
---|
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.
|
---|
143 | *
|
---|
144 | * The difference between this and OSSL_PARAM_OCTET_STRING is that only pointers
|
---|
145 | * are manipulated for this type.
|
---|
146 | *
|
---|
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.
|
---|
150 | *
|
---|
151 | * WARNING! Using these is FRAGILE, as it assumes that the actual
|
---|
152 | * data and its location are constant.
|
---|
153 | *
|
---|
154 | * EXTRA WARNING! If you are not completely sure you most likely want
|
---|
155 | * to use the OSSL_PARAM_OCTET_STRING type.
|
---|
156 | */
|
---|
157 | # define OSSL_PARAM_OCTET_PTR 7
|
---|
158 |
|
---|
159 | /*
|
---|
160 | * Typedef for the thread stop handling callback. Used both internally and by
|
---|
161 | * providers.
|
---|
162 | *
|
---|
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.
|
---|
168 | */
|
---|
169 | typedef void (*OSSL_thread_stop_handler_fn)(void *arg);
|
---|
170 |
|
---|
171 |
|
---|
172 | /*-
|
---|
173 | * Provider entry point
|
---|
174 | * --------------------
|
---|
175 | *
|
---|
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.
|
---|
179 | */
|
---|
180 | /*-
|
---|
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
|
---|
185 | * back to the Core.
|
---|
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.
|
---|
189 | */
|
---|
190 | typedef int (OSSL_provider_init_fn)(const OSSL_CORE_HANDLE *handle,
|
---|
191 | const OSSL_DISPATCH *in,
|
---|
192 | const OSSL_DISPATCH **out,
|
---|
193 | void **provctx);
|
---|
194 | # ifdef __VMS
|
---|
195 | # pragma names save
|
---|
196 | # pragma names uppercase,truncated
|
---|
197 | # endif
|
---|
198 | OPENSSL_EXPORT OSSL_provider_init_fn OSSL_provider_init;
|
---|
199 | # ifdef __VMS
|
---|
200 | # pragma names restore
|
---|
201 | # endif
|
---|
202 |
|
---|
203 | /*
|
---|
204 | * Generic callback function signature.
|
---|
205 | *
|
---|
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.
|
---|
212 | *
|
---|
213 | * libcrypto may use the OSSL_PARAM array to create arguments for an
|
---|
214 | * application callback it knows about.
|
---|
215 | */
|
---|
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);
|
---|
219 | /*
|
---|
220 | * Passphrase callback function signature
|
---|
221 | *
|
---|
222 | * This is similar to the generic callback function above, but adds a
|
---|
223 | * result parameter.
|
---|
224 | */
|
---|
225 | typedef int (OSSL_PASSPHRASE_CALLBACK)(char *pass, size_t pass_size,
|
---|
226 | size_t *pass_len,
|
---|
227 | const OSSL_PARAM params[], void *arg);
|
---|
228 |
|
---|
229 | # ifdef __cplusplus
|
---|
230 | }
|
---|
231 | # endif
|
---|
232 |
|
---|
233 | #endif
|
---|