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