00d156f34ddadcf1f37d5a3bd55e9040b1f055c0
[openssl.git] / include / internal / cryptlib.h
1 /*
2  * Copyright 1995-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 OSSL_INTERNAL_CRYPTLIB_H
11 # define OSSL_INTERNAL_CRYPTLIB_H
12 # pragma once
13
14 # include <stdlib.h>
15 # include <string.h>
16 # include "../../e_os.h" /* To get strncasecmp() on Windows */
17
18 # ifdef OPENSSL_USE_APPLINK
19 #  define BIO_FLAGS_UPLINK_INTERNAL 0x8000
20 #  include "ms/uplink.h"
21 # else
22 #  define BIO_FLAGS_UPLINK_INTERNAL 0
23 # endif
24
25 # include <openssl/crypto.h>
26 # include <openssl/buffer.h>
27 # include <openssl/bio.h>
28 # include <openssl/asn1.h>
29 # include <openssl/err.h>
30 # include "internal/nelem.h"
31
32 #ifdef NDEBUG
33 # define ossl_assert(x) ((x) != 0)
34 #else
35 __owur static ossl_inline int ossl_assert_int(int expr, const char *exprstr,
36                                               const char *file, int line)
37 {
38     if (!expr)
39         OPENSSL_die(exprstr, file, line);
40
41     return expr;
42 }
43
44 # define ossl_assert(x) ossl_assert_int((x) != 0, "Assertion failed: "#x, \
45                                          __FILE__, __LINE__)
46
47 #endif
48
49 /* Check if |pre|, which must be a string literal, is a prefix of |str| */
50 #define HAS_PREFIX(str, pre) (strncmp(str, pre "", sizeof(pre) - 1) == 0)
51 /* As before, and if check succeeds, advance |str| past the prefix |pre| */
52 #define CHECK_AND_SKIP_PREFIX(str, pre) \
53     (HAS_PREFIX(str, pre) ? ((str) += sizeof(pre) - 1, 1) : 0)
54 /* Check if the string literal |p| is a case-insensitive prefix of |s| */
55 #define HAS_CASE_PREFIX(s, p) (strncasecmp(s, p "", sizeof(p) - 1) == 0)
56 /* As before, and if check succeeds, advance |str| past the prefix |pre| */
57 #define CHECK_AND_SKIP_CASE_PREFIX(str, pre) \
58     (HAS_CASE_PREFIX(str, pre) ? ((str) += sizeof(pre) - 1, 1) : 0)
59 /* Check if the string literal |suffix| is a case-insensitive suffix of |str| */
60 #define HAS_CASE_SUFFIX(str, suffix) (strlen(str) < sizeof(suffix) - 1 ? 0 : \
61     strcasecmp(str + strlen(str) - sizeof(suffix) + 1, suffix "") == 0)
62
63
64 /*
65  * Use this inside a union with the field that needs to be aligned to a
66  * reasonable boundary for the platform.  The most pessimistic alignment
67  * of the listed types will be used by the compiler.
68  */
69 # define OSSL_UNION_ALIGN       \
70     double align;               \
71     ossl_uintmax_t align_int;   \
72     void *align_ptr
73
74 typedef struct ex_callback_st EX_CALLBACK;
75 DEFINE_STACK_OF(EX_CALLBACK)
76
77 typedef struct mem_st MEM;
78 DEFINE_LHASH_OF(MEM);
79
80 # define OPENSSL_CONF             "openssl.cnf"
81
82 # ifndef OPENSSL_SYS_VMS
83 #  define X509_CERT_AREA          OPENSSLDIR
84 #  define X509_CERT_DIR           OPENSSLDIR "/certs"
85 #  define X509_CERT_FILE          OPENSSLDIR "/cert.pem"
86 #  define X509_PRIVATE_DIR        OPENSSLDIR "/private"
87 #  define CTLOG_FILE              OPENSSLDIR "/ct_log_list.cnf"
88 # else
89 #  define X509_CERT_AREA          "OSSL$DATAROOT:[000000]"
90 #  define X509_CERT_DIR           "OSSL$DATAROOT:[CERTS]"
91 #  define X509_CERT_FILE          "OSSL$DATAROOT:[000000]cert.pem"
92 #  define X509_PRIVATE_DIR        "OSSL$DATAROOT:[PRIVATE]"
93 #  define CTLOG_FILE              "OSSL$DATAROOT:[000000]ct_log_list.cnf"
94 # endif
95
96 # define X509_CERT_DIR_EVP        "SSL_CERT_DIR"
97 # define X509_CERT_FILE_EVP       "SSL_CERT_FILE"
98 # define CTLOG_FILE_EVP           "CTLOG_FILE"
99
100 /* size of string representations */
101 # define DECIMAL_SIZE(type)      ((sizeof(type)*8+2)/3+1)
102 # define HEX_SIZE(type)          (sizeof(type)*2)
103
104 void OPENSSL_cpuid_setup(void);
105 #if defined(__i386)   || defined(__i386__)   || defined(_M_IX86) || \
106     defined(__x86_64) || defined(__x86_64__) || \
107     defined(_M_AMD64) || defined(_M_X64)
108 extern unsigned int OPENSSL_ia32cap_P[];
109 #endif
110 void OPENSSL_showfatal(const char *fmta, ...);
111 int ossl_do_ex_data_init(OSSL_LIB_CTX *ctx);
112 void ossl_crypto_cleanup_all_ex_data_int(OSSL_LIB_CTX *ctx);
113 int openssl_init_fork_handlers(void);
114 int openssl_get_fork_id(void);
115
116 char *ossl_safe_getenv(const char *name);
117
118 extern CRYPTO_RWLOCK *memdbg_lock;
119 int openssl_strerror_r(int errnum, char *buf, size_t buflen);
120 # if !defined(OPENSSL_NO_STDIO)
121 FILE *openssl_fopen(const char *filename, const char *mode);
122 # else
123 void *openssl_fopen(const char *filename, const char *mode);
124 # endif
125
126 uint32_t OPENSSL_rdtsc(void);
127 size_t OPENSSL_instrument_bus(unsigned int *, size_t);
128 size_t OPENSSL_instrument_bus2(unsigned int *, size_t, size_t);
129
130 /* ex_data structures */
131
132 /*
133  * Each structure type (sometimes called a class), that supports
134  * exdata has a stack of callbacks for each instance.
135  */
136 struct ex_callback_st {
137     long argl;                  /* Arbitrary long */
138     void *argp;                 /* Arbitrary void * */
139     int priority;               /* Priority ordering for freeing */
140     CRYPTO_EX_new *new_func;
141     CRYPTO_EX_free *free_func;
142     CRYPTO_EX_dup *dup_func;
143 };
144
145 /*
146  * The state for each class.  This could just be a typedef, but
147  * a structure allows future changes.
148  */
149 typedef struct ex_callbacks_st {
150     STACK_OF(EX_CALLBACK) *meth;
151 } EX_CALLBACKS;
152
153 typedef struct ossl_ex_data_global_st {
154     CRYPTO_RWLOCK *ex_data_lock;
155     EX_CALLBACKS ex_data[CRYPTO_EX_INDEX__COUNT];
156 } OSSL_EX_DATA_GLOBAL;
157
158
159 /* OSSL_LIB_CTX */
160
161 # define OSSL_LIB_CTX_PROVIDER_STORE_RUN_ONCE_INDEX          0
162 # define OSSL_LIB_CTX_DEFAULT_METHOD_STORE_RUN_ONCE_INDEX    1
163 # define OSSL_LIB_CTX_METHOD_STORE_RUN_ONCE_INDEX            2
164 # define OSSL_LIB_CTX_MAX_RUN_ONCE                           3
165
166 # define OSSL_LIB_CTX_EVP_METHOD_STORE_INDEX         0
167 # define OSSL_LIB_CTX_PROVIDER_STORE_INDEX           1
168 # define OSSL_LIB_CTX_PROPERTY_DEFN_INDEX            2
169 # define OSSL_LIB_CTX_PROPERTY_STRING_INDEX          3
170 # define OSSL_LIB_CTX_NAMEMAP_INDEX                  4
171 # define OSSL_LIB_CTX_DRBG_INDEX                     5
172 # define OSSL_LIB_CTX_DRBG_NONCE_INDEX               6
173 # define OSSL_LIB_CTX_RAND_CRNGT_INDEX               7
174 # ifdef FIPS_MODULE
175 #  define OSSL_LIB_CTX_THREAD_EVENT_HANDLER_INDEX    8
176 # endif
177 # define OSSL_LIB_CTX_FIPS_PROV_INDEX                9
178 # define OSSL_LIB_CTX_ENCODER_STORE_INDEX           10
179 # define OSSL_LIB_CTX_DECODER_STORE_INDEX           11
180 # define OSSL_LIB_CTX_SELF_TEST_CB_INDEX            12
181 # define OSSL_LIB_CTX_BIO_PROV_INDEX                13
182 # define OSSL_LIB_CTX_GLOBAL_PROPERTIES             14
183 # define OSSL_LIB_CTX_STORE_LOADER_STORE_INDEX      15
184 # define OSSL_LIB_CTX_PROVIDER_CONF_INDEX           16
185 # define OSSL_LIB_CTX_BIO_CORE_INDEX                17
186 # define OSSL_LIB_CTX_CHILD_PROVIDER_INDEX          18
187 # define OSSL_LIB_CTX_MAX_INDEXES                   19
188
189 # define OSSL_LIB_CTX_METHOD_LOW_PRIORITY          -1
190 # define OSSL_LIB_CTX_METHOD_DEFAULT_PRIORITY       0
191 # define OSSL_LIB_CTX_METHOD_PRIORITY_1             1
192 # define OSSL_LIB_CTX_METHOD_PRIORITY_2             2
193
194 typedef struct ossl_lib_ctx_method {
195     int priority;
196     void *(*new_func)(OSSL_LIB_CTX *ctx);
197     void (*free_func)(void *);
198 } OSSL_LIB_CTX_METHOD;
199
200 OSSL_LIB_CTX *ossl_lib_ctx_get_concrete(OSSL_LIB_CTX *ctx);
201 int ossl_lib_ctx_is_default(OSSL_LIB_CTX *ctx);
202 int ossl_lib_ctx_is_global_default(OSSL_LIB_CTX *ctx);
203
204 /* Functions to retrieve pointers to data by index */
205 void *ossl_lib_ctx_get_data(OSSL_LIB_CTX *, int /* index */,
206                             const OSSL_LIB_CTX_METHOD * ctx);
207
208 void ossl_lib_ctx_default_deinit(void);
209 OSSL_EX_DATA_GLOBAL *ossl_lib_ctx_get_ex_data_global(OSSL_LIB_CTX *ctx);
210 typedef int (ossl_lib_ctx_run_once_fn)(OSSL_LIB_CTX *ctx);
211 typedef void (ossl_lib_ctx_onfree_fn)(OSSL_LIB_CTX *ctx);
212
213 int ossl_lib_ctx_run_once(OSSL_LIB_CTX *ctx, unsigned int idx,
214                           ossl_lib_ctx_run_once_fn run_once_fn);
215 int ossl_lib_ctx_onfree(OSSL_LIB_CTX *ctx, ossl_lib_ctx_onfree_fn onfreefn);
216 const char *ossl_lib_ctx_get_descriptor(OSSL_LIB_CTX *libctx);
217
218 OSSL_LIB_CTX *ossl_crypto_ex_data_get_ossl_lib_ctx(const CRYPTO_EX_DATA *ad);
219 int ossl_crypto_new_ex_data_ex(OSSL_LIB_CTX *ctx, int class_index, void *obj,
220                                CRYPTO_EX_DATA *ad);
221 int ossl_crypto_get_ex_new_index_ex(OSSL_LIB_CTX *ctx, int class_index,
222                                     long argl, void *argp,
223                                     CRYPTO_EX_new *new_func,
224                                     CRYPTO_EX_dup *dup_func,
225                                     CRYPTO_EX_free *free_func,
226                                     int priority);
227 int ossl_crypto_free_ex_index_ex(OSSL_LIB_CTX *ctx, int class_index, int idx);
228
229 /* Function for simple binary search */
230
231 /* Flags */
232 # define OSSL_BSEARCH_VALUE_ON_NOMATCH            0x01
233 # define OSSL_BSEARCH_FIRST_VALUE_ON_MATCH        0x02
234
235 const void *ossl_bsearch(const void *key, const void *base, int num,
236                          int size, int (*cmp) (const void *, const void *),
237                          int flags);
238
239 char *ossl_sk_ASN1_UTF8STRING2text(STACK_OF(ASN1_UTF8STRING) *text,
240                                    const char *sep, size_t max_len);
241 char *ossl_ipaddr_to_asc(unsigned char *p, int len);
242
243 char *ossl_buf2hexstr_sep(const unsigned char *buf, long buflen, char sep);
244 unsigned char *ossl_hexstr2buf_sep(const char *str, long *buflen,
245                                    const char sep);
246
247 static ossl_inline int ossl_ends_with_dirsep(const char *path)
248 {
249     if (*path != '\0')
250         path += strlen(path) - 1;
251 # if defined __VMS
252     if (*path == ']' || *path == '>' || *path == ':')
253         return 1;
254 # elif defined _WIN32
255     if (*path == '\\')
256         return 1;
257 # endif
258     return *path == '/';
259 }
260
261 static ossl_inline int ossl_is_absolute_path(const char *path)
262 {
263 # if defined __VMS
264     if (strchr(path, ':') != NULL
265         || ((path[0] == '[' || path[0] == '<')
266             && path[1] != '.' && path[1] != '-'
267             && path[1] != ']' && path[1] != '>'))
268         return 1;
269 # elif defined _WIN32
270     if (path[0] == '\\'
271         || (path[0] != '\0' && path[1] == ':'))
272         return 1;
273 # endif
274     return path[0] == '/';
275 }
276
277 #endif