xref: /openssl/include/openssl/core.h (revision da1c088f)
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