2 * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
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
10 #ifndef OSSL_INTERNAL_CRYPTLIB_H
11 # define OSSL_INTERNAL_CRYPTLIB_H
16 # include "../../e_os.h" /* To get strncasecmp() on Windows */
18 # ifdef OPENSSL_USE_APPLINK
19 # define BIO_FLAGS_UPLINK_INTERNAL 0x8000
20 # include "ms/uplink.h"
22 # define BIO_FLAGS_UPLINK_INTERNAL 0
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"
33 # define ossl_assert(x) ((x) != 0)
35 __owur
static ossl_inline
int ossl_assert_int(int expr
, const char *exprstr
,
36 const char *file
, int line
)
39 OPENSSL_die(exprstr
, file
, line
);
44 # define ossl_assert(x) ossl_assert_int((x) != 0, "Assertion failed: "#x, \
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)
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.
69 # define OSSL_UNION_ALIGN \
71 ossl_uintmax_t align_int; \
74 typedef struct ex_callback_st EX_CALLBACK
;
75 DEFINE_STACK_OF(EX_CALLBACK
)
77 typedef struct mem_st MEM
;
80 # define OPENSSL_CONF "openssl.cnf"
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"
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"
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"
100 /* size of string representations */
101 # define DECIMAL_SIZE(type) ((sizeof(type)*8+2)/3+1)
102 # define HEX_SIZE(type) (sizeof(type)*2)
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
[];
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);
116 char *ossl_safe_getenv(const char *name
);
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
);
123 void *openssl_fopen(const char *filename
, const char *mode
);
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);
130 /* ex_data structures */
133 * Each structure type (sometimes called a class), that supports
134 * exdata has a stack of callbacks for each instance.
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
;
146 * The state for each class. This could just be a typedef, but
147 * a structure allows future changes.
149 typedef struct ex_callbacks_st
{
150 STACK_OF(EX_CALLBACK
) *meth
;
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
;
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
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
175 # define OSSL_LIB_CTX_THREAD_EVENT_HANDLER_INDEX 8
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
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
194 typedef struct ossl_lib_ctx_method
{
196 void *(*new_func
)(OSSL_LIB_CTX
*ctx
);
197 void (*free_func
)(void *);
198 } OSSL_LIB_CTX_METHOD
;
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
);
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
);
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
);
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
);
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
,
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
,
227 int ossl_crypto_free_ex_index_ex(OSSL_LIB_CTX
*ctx
, int class_index
, int idx
);
229 /* Function for simple binary search */
232 # define OSSL_BSEARCH_VALUE_ON_NOMATCH 0x01
233 # define OSSL_BSEARCH_FIRST_VALUE_ON_MATCH 0x02
235 const void *ossl_bsearch(const void *key
, const void *base
, int num
,
236 int size
, int (*cmp
) (const void *, const void *),
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
);
243 char *ossl_buf2hexstr_sep(const unsigned char *buf
, long buflen
, char sep
);
244 unsigned char *ossl_hexstr2buf_sep(const char *str
, long *buflen
,
247 static ossl_inline
int ossl_ends_with_dirsep(const char *path
)
250 path
+= strlen(path
) - 1;
252 if (*path
== ']' || *path
== '>' || *path
== ':')
254 # elif defined _WIN32
261 static ossl_inline
int ossl_is_absolute_path(const char *path
)
264 if (strchr(path
, ':') != NULL
265 || ((path
[0] == '[' || path
[0] == '<')
266 && path
[1] != '.' && path
[1] != '-'
267 && path
[1] != ']' && path
[1] != '>'))
269 # elif defined _WIN32
271 || (path
[0] != '\0' && path
[1] == ':'))
274 return path
[0] == '/';