| 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 | 
| 234 |  |