Home | History | Annotate | Line # | Download | only in openssl
      1 /*
      2  * {- join("\n * ", @autowarntext) -}
      3  *
      4  * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
      5  * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
      6  *
      7  * Licensed under the Apache License 2.0 (the "License").  You may not use
      8  * this file except in compliance with the License.  You can obtain a copy
      9  * in the file LICENSE in the source distribution or at
     10  * https://www.openssl.org/source/license.html
     11  */
     12 
     13 {-
     14 use OpenSSL::stackhash qw(generate_stack_macros);
     15 -}
     16 
     17 #ifndef OPENSSL_CRYPTO_H
     18 # define OPENSSL_CRYPTO_H
     19 # pragma once
     20 
     21 # include <openssl/macros.h>
     22 # ifndef OPENSSL_NO_DEPRECATED_3_0
     23 #  define HEADER_CRYPTO_H
     24 # endif
     25 
     26 # include <stdlib.h>
     27 # include <time.h>
     28 
     29 # include <openssl/e_os2.h>
     30 
     31 # ifndef OPENSSL_NO_STDIO
     32 #  include <stdio.h>
     33 # endif
     34 
     35 # include <openssl/safestack.h>
     36 # include <openssl/opensslv.h>
     37 # include <openssl/types.h>
     38 # include <openssl/opensslconf.h>
     39 # include <openssl/cryptoerr.h>
     40 # include <openssl/core.h>
     41 
     42 # ifdef CHARSET_EBCDIC
     43 #  include <openssl/ebcdic.h>
     44 # endif
     45 
     46 /*
     47  * Resolve problems on some operating systems with symbol names that clash
     48  * one way or another
     49  */
     50 # include <openssl/symhacks.h>
     51 
     52 # ifndef OPENSSL_NO_DEPRECATED_1_1_0
     53 #  include <openssl/opensslv.h>
     54 # endif
     55 
     56 #ifdef  __cplusplus
     57 extern "C" {
     58 #endif
     59 
     60 # ifndef OPENSSL_NO_DEPRECATED_1_1_0
     61 #  define SSLeay                  OpenSSL_version_num
     62 #  define SSLeay_version          OpenSSL_version
     63 #  define SSLEAY_VERSION_NUMBER   OPENSSL_VERSION_NUMBER
     64 #  define SSLEAY_VERSION          OPENSSL_VERSION
     65 #  define SSLEAY_CFLAGS           OPENSSL_CFLAGS
     66 #  define SSLEAY_BUILT_ON         OPENSSL_BUILT_ON
     67 #  define SSLEAY_PLATFORM         OPENSSL_PLATFORM
     68 #  define SSLEAY_DIR              OPENSSL_DIR
     69 
     70 /*
     71  * Old type for allocating dynamic locks. No longer used. Use the new thread
     72  * API instead.
     73  */
     74 typedef struct {
     75     int dummy;
     76 } CRYPTO_dynlock;
     77 
     78 # endif /* OPENSSL_NO_DEPRECATED_1_1_0 */
     79 
     80 typedef void CRYPTO_RWLOCK;
     81 
     82 CRYPTO_RWLOCK *CRYPTO_THREAD_lock_new(void);
     83 __owur int CRYPTO_THREAD_read_lock(CRYPTO_RWLOCK *lock);
     84 __owur int CRYPTO_THREAD_write_lock(CRYPTO_RWLOCK *lock);
     85 int CRYPTO_THREAD_unlock(CRYPTO_RWLOCK *lock);
     86 void CRYPTO_THREAD_lock_free(CRYPTO_RWLOCK *lock);
     87 
     88 int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock);
     89 int CRYPTO_atomic_or(uint64_t *val, uint64_t op, uint64_t *ret,
     90                      CRYPTO_RWLOCK *lock);
     91 int CRYPTO_atomic_load(uint64_t *val, uint64_t *ret, CRYPTO_RWLOCK *lock);
     92 
     93 /* No longer needed, so this is a no-op */
     94 #define OPENSSL_malloc_init() while(0) continue
     95 
     96 # define OPENSSL_malloc(num) \
     97         CRYPTO_malloc(num, OPENSSL_FILE, OPENSSL_LINE)
     98 # define OPENSSL_zalloc(num) \
     99         CRYPTO_zalloc(num, OPENSSL_FILE, OPENSSL_LINE)
    100 # define OPENSSL_realloc(addr, num) \
    101         CRYPTO_realloc(addr, num, OPENSSL_FILE, OPENSSL_LINE)
    102 # define OPENSSL_clear_realloc(addr, old_num, num) \
    103         CRYPTO_clear_realloc(addr, old_num, num, OPENSSL_FILE, OPENSSL_LINE)
    104 # define OPENSSL_clear_free(addr, num) \
    105         CRYPTO_clear_free(addr, num, OPENSSL_FILE, OPENSSL_LINE)
    106 # define OPENSSL_free(addr) \
    107         CRYPTO_free(addr, OPENSSL_FILE, OPENSSL_LINE)
    108 # define OPENSSL_memdup(str, s) \
    109         CRYPTO_memdup((str), s, OPENSSL_FILE, OPENSSL_LINE)
    110 # define OPENSSL_strdup(str) \
    111         CRYPTO_strdup(str, OPENSSL_FILE, OPENSSL_LINE)
    112 # define OPENSSL_strndup(str, n) \
    113         CRYPTO_strndup(str, n, OPENSSL_FILE, OPENSSL_LINE)
    114 # define OPENSSL_secure_malloc(num) \
    115         CRYPTO_secure_malloc(num, OPENSSL_FILE, OPENSSL_LINE)
    116 # define OPENSSL_secure_zalloc(num) \
    117         CRYPTO_secure_zalloc(num, OPENSSL_FILE, OPENSSL_LINE)
    118 # define OPENSSL_secure_free(addr) \
    119         CRYPTO_secure_free(addr, OPENSSL_FILE, OPENSSL_LINE)
    120 # define OPENSSL_secure_clear_free(addr, num) \
    121         CRYPTO_secure_clear_free(addr, num, OPENSSL_FILE, OPENSSL_LINE)
    122 # define OPENSSL_secure_actual_size(ptr) \
    123         CRYPTO_secure_actual_size(ptr)
    124 
    125 size_t OPENSSL_strlcpy(char *dst, const char *src, size_t siz);
    126 size_t OPENSSL_strlcat(char *dst, const char *src, size_t siz);
    127 size_t OPENSSL_strnlen(const char *str, size_t maxlen);
    128 int OPENSSL_buf2hexstr_ex(char *str, size_t str_n, size_t *strlength,
    129                           const unsigned char *buf, size_t buflen,
    130                           const char sep);
    131 char *OPENSSL_buf2hexstr(const unsigned char *buf, long buflen);
    132 int OPENSSL_hexstr2buf_ex(unsigned char *buf, size_t buf_n, size_t *buflen,
    133                           const char *str, const char sep);
    134 unsigned char *OPENSSL_hexstr2buf(const char *str, long *buflen);
    135 int OPENSSL_hexchar2int(unsigned char c);
    136 int OPENSSL_strcasecmp(const char *s1, const char *s2);
    137 int OPENSSL_strncasecmp(const char *s1, const char *s2, size_t n);
    138 
    139 # define OPENSSL_MALLOC_MAX_NELEMS(type)  (((1U<<(sizeof(int)*8-1))-1)/sizeof(type))
    140 
    141 /*
    142  * These functions return the values of OPENSSL_VERSION_MAJOR,
    143  * OPENSSL_VERSION_MINOR, OPENSSL_VERSION_PATCH, OPENSSL_VERSION_PRE_RELEASE
    144  * and OPENSSL_VERSION_BUILD_METADATA, respectively.
    145  */
    146 unsigned int OPENSSL_version_major(void);
    147 unsigned int OPENSSL_version_minor(void);
    148 unsigned int OPENSSL_version_patch(void);
    149 const char *OPENSSL_version_pre_release(void);
    150 const char *OPENSSL_version_build_metadata(void);
    151 
    152 unsigned long OpenSSL_version_num(void);
    153 const char *OpenSSL_version(int type);
    154 # define OPENSSL_VERSION                0
    155 # define OPENSSL_CFLAGS                 1
    156 # define OPENSSL_BUILT_ON               2
    157 # define OPENSSL_PLATFORM               3
    158 # define OPENSSL_DIR                    4
    159 # define OPENSSL_ENGINES_DIR            5
    160 # define OPENSSL_VERSION_STRING         6
    161 # define OPENSSL_FULL_VERSION_STRING    7
    162 # define OPENSSL_MODULES_DIR            8
    163 # define OPENSSL_CPU_INFO               9
    164 
    165 const char *OPENSSL_info(int type);
    166 /*
    167  * The series starts at 1001 to avoid confusion with the OpenSSL_version
    168  * types.
    169  */
    170 # define OPENSSL_INFO_CONFIG_DIR                1001
    171 # define OPENSSL_INFO_ENGINES_DIR               1002
    172 # define OPENSSL_INFO_MODULES_DIR               1003
    173 # define OPENSSL_INFO_DSO_EXTENSION             1004
    174 # define OPENSSL_INFO_DIR_FILENAME_SEPARATOR    1005
    175 # define OPENSSL_INFO_LIST_SEPARATOR            1006
    176 # define OPENSSL_INFO_SEED_SOURCE               1007
    177 # define OPENSSL_INFO_CPU_SETTINGS              1008
    178 
    179 int OPENSSL_issetugid(void);
    180 
    181 struct crypto_ex_data_st {
    182     OSSL_LIB_CTX *ctx;
    183     STACK_OF(void) *sk;
    184 };
    185 
    186 {-
    187     generate_stack_macros("void");
    188 -}
    189 
    190 
    191 /*
    192  * Per class, we have a STACK of function pointers.
    193  */
    194 # define CRYPTO_EX_INDEX_SSL              0
    195 # define CRYPTO_EX_INDEX_SSL_CTX          1
    196 # define CRYPTO_EX_INDEX_SSL_SESSION      2
    197 # define CRYPTO_EX_INDEX_X509             3
    198 # define CRYPTO_EX_INDEX_X509_STORE       4
    199 # define CRYPTO_EX_INDEX_X509_STORE_CTX   5
    200 # define CRYPTO_EX_INDEX_DH               6
    201 # define CRYPTO_EX_INDEX_DSA              7
    202 # define CRYPTO_EX_INDEX_EC_KEY           8
    203 # define CRYPTO_EX_INDEX_RSA              9
    204 # define CRYPTO_EX_INDEX_ENGINE          10
    205 # define CRYPTO_EX_INDEX_UI              11
    206 # define CRYPTO_EX_INDEX_BIO             12
    207 # define CRYPTO_EX_INDEX_APP             13
    208 # define CRYPTO_EX_INDEX_UI_METHOD       14
    209 # define CRYPTO_EX_INDEX_RAND_DRBG       15
    210 # define CRYPTO_EX_INDEX_DRBG            CRYPTO_EX_INDEX_RAND_DRBG
    211 # define CRYPTO_EX_INDEX_OSSL_LIB_CTX    16
    212 # define CRYPTO_EX_INDEX_EVP_PKEY        17
    213 # define CRYPTO_EX_INDEX__COUNT          18
    214 
    215 typedef void CRYPTO_EX_new (void *parent, void *ptr, CRYPTO_EX_DATA *ad,
    216                            int idx, long argl, void *argp);
    217 typedef void CRYPTO_EX_free (void *parent, void *ptr, CRYPTO_EX_DATA *ad,
    218                              int idx, long argl, void *argp);
    219 typedef int CRYPTO_EX_dup (CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from,
    220                            void **from_d, int idx, long argl, void *argp);
    221 __owur int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp,
    222                                    CRYPTO_EX_new *new_func,
    223                                    CRYPTO_EX_dup *dup_func,
    224                                    CRYPTO_EX_free *free_func);
    225 /* No longer use an index. */
    226 int CRYPTO_free_ex_index(int class_index, int idx);
    227 
    228 /*
    229  * Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a
    230  * given class (invokes whatever per-class callbacks are applicable)
    231  */
    232 int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad);
    233 int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to,
    234                        const CRYPTO_EX_DATA *from);
    235 
    236 void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad);
    237 
    238 /* Allocate a single item in the CRYPTO_EX_DATA variable */
    239 int CRYPTO_alloc_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad,
    240                          int idx);
    241 
    242 /*
    243  * Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular
    244  * index (relative to the class type involved)
    245  */
    246 int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val);
    247 void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx);
    248 
    249 # ifndef OPENSSL_NO_DEPRECATED_1_1_0
    250 /*
    251  * This function cleans up all "ex_data" state. It mustn't be called under
    252  * potential race-conditions.
    253  */
    254 # define CRYPTO_cleanup_all_ex_data() while(0) continue
    255 
    256 /*
    257  * The old locking functions have been removed completely without compatibility
    258  * macros. This is because the old functions either could not properly report
    259  * errors, or the returned error values were not clearly documented.
    260  * Replacing the locking functions with no-ops would cause race condition
    261  * issues in the affected applications. It is far better for them to fail at
    262  * compile time.
    263  * On the other hand, the locking callbacks are no longer used.  Consequently,
    264  * the callback management functions can be safely replaced with no-op macros.
    265  */
    266 #  define CRYPTO_num_locks()            (1)
    267 #  define CRYPTO_set_locking_callback(func)
    268 #  define CRYPTO_get_locking_callback()         (NULL)
    269 #  define CRYPTO_set_add_lock_callback(func)
    270 #  define CRYPTO_get_add_lock_callback()        (NULL)
    271 
    272 /*
    273  * These defines where used in combination with the old locking callbacks,
    274  * they are not called anymore, but old code that's not called might still
    275  * use them.
    276  */
    277 #  define CRYPTO_LOCK             1
    278 #  define CRYPTO_UNLOCK           2
    279 #  define CRYPTO_READ             4
    280 #  define CRYPTO_WRITE            8
    281 
    282 /* This structure is no longer used */
    283 typedef struct crypto_threadid_st {
    284     int dummy;
    285 } CRYPTO_THREADID;
    286 /* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */
    287 #  define CRYPTO_THREADID_set_numeric(id, val)
    288 #  define CRYPTO_THREADID_set_pointer(id, ptr)
    289 #  define CRYPTO_THREADID_set_callback(threadid_func)   (0)
    290 #  define CRYPTO_THREADID_get_callback()                (NULL)
    291 #  define CRYPTO_THREADID_current(id)
    292 #  define CRYPTO_THREADID_cmp(a, b)                     (-1)
    293 #  define CRYPTO_THREADID_cpy(dest, src)
    294 #  define CRYPTO_THREADID_hash(id)                      (0UL)
    295 
    296 #  ifndef OPENSSL_NO_DEPRECATED_1_0_0
    297 #   define CRYPTO_set_id_callback(func)
    298 #   define CRYPTO_get_id_callback()                     (NULL)
    299 #   define CRYPTO_thread_id()                           (0UL)
    300 #  endif /* OPENSSL_NO_DEPRECATED_1_0_0 */
    301 
    302 #  define CRYPTO_set_dynlock_create_callback(dyn_create_function)
    303 #  define CRYPTO_set_dynlock_lock_callback(dyn_lock_function)
    304 #  define CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function)
    305 #  define CRYPTO_get_dynlock_create_callback()          (NULL)
    306 #  define CRYPTO_get_dynlock_lock_callback()            (NULL)
    307 #  define CRYPTO_get_dynlock_destroy_callback()         (NULL)
    308 # endif /* OPENSSL_NO_DEPRECATED_1_1_0 */
    309 
    310 typedef void *(*CRYPTO_malloc_fn)(size_t num, const char *file, int line);
    311 typedef void *(*CRYPTO_realloc_fn)(void *addr, size_t num, const char *file,
    312                                    int line);
    313 typedef void (*CRYPTO_free_fn)(void *addr, const char *file, int line);
    314 int CRYPTO_set_mem_functions(CRYPTO_malloc_fn malloc_fn,
    315                              CRYPTO_realloc_fn realloc_fn,
    316                              CRYPTO_free_fn free_fn);
    317 void CRYPTO_get_mem_functions(CRYPTO_malloc_fn *malloc_fn,
    318                               CRYPTO_realloc_fn *realloc_fn,
    319                               CRYPTO_free_fn *free_fn);
    320 
    321 void *CRYPTO_malloc(size_t num, const char *file, int line);
    322 void *CRYPTO_zalloc(size_t num, const char *file, int line);
    323 void *CRYPTO_memdup(const void *str, size_t siz, const char *file, int line);
    324 char *CRYPTO_strdup(const char *str, const char *file, int line);
    325 char *CRYPTO_strndup(const char *str, size_t s, const char *file, int line);
    326 void CRYPTO_free(void *ptr, const char *file, int line);
    327 void CRYPTO_clear_free(void *ptr, size_t num, const char *file, int line);
    328 void *CRYPTO_realloc(void *addr, size_t num, const char *file, int line);
    329 void *CRYPTO_clear_realloc(void *addr, size_t old_num, size_t num,
    330                            const char *file, int line);
    331 
    332 int CRYPTO_secure_malloc_init(size_t sz, size_t minsize);
    333 int CRYPTO_secure_malloc_done(void);
    334 void *CRYPTO_secure_malloc(size_t num, const char *file, int line);
    335 void *CRYPTO_secure_zalloc(size_t num, const char *file, int line);
    336 void CRYPTO_secure_free(void *ptr, const char *file, int line);
    337 void CRYPTO_secure_clear_free(void *ptr, size_t num,
    338                               const char *file, int line);
    339 int CRYPTO_secure_allocated(const void *ptr);
    340 int CRYPTO_secure_malloc_initialized(void);
    341 size_t CRYPTO_secure_actual_size(void *ptr);
    342 size_t CRYPTO_secure_used(void);
    343 
    344 void OPENSSL_cleanse(void *ptr, size_t len);
    345 
    346 # ifndef OPENSSL_NO_CRYPTO_MDEBUG
    347 /*
    348  * The following can be used to detect memory leaks in the library. If
    349  * used, it turns on malloc checking
    350  */
    351 # define CRYPTO_MEM_CHECK_OFF     0x0   /* Control only */
    352 # define CRYPTO_MEM_CHECK_ON      0x1   /* Control and mode bit */
    353 # define CRYPTO_MEM_CHECK_ENABLE  0x2   /* Control and mode bit */
    354 # define CRYPTO_MEM_CHECK_DISABLE 0x3   /* Control only */
    355 
    356 void CRYPTO_get_alloc_counts(int *mcount, int *rcount, int *fcount);
    357 #  ifndef OPENSSL_NO_DEPRECATED_3_0
    358 #    define OPENSSL_mem_debug_push(info) \
    359          CRYPTO_mem_debug_push(info, OPENSSL_FILE, OPENSSL_LINE)
    360 #    define OPENSSL_mem_debug_pop() \
    361          CRYPTO_mem_debug_pop()
    362 #  endif
    363 #  ifndef OPENSSL_NO_DEPRECATED_3_0
    364 OSSL_DEPRECATEDIN_3_0 int CRYPTO_set_mem_debug(int flag);
    365 OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_ctrl(int mode);
    366 OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_debug_push(const char *info,
    367                                                 const char *file, int line);
    368 OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_debug_pop(void);
    369 OSSL_DEPRECATEDIN_3_0 void CRYPTO_mem_debug_malloc(void *addr, size_t num,
    370                                                    int flag,
    371                                                    const char *file, int line);
    372 OSSL_DEPRECATEDIN_3_0 void CRYPTO_mem_debug_realloc(void *addr1, void *addr2,
    373                                                     size_t num, int flag,
    374                                                     const char *file, int line);
    375 OSSL_DEPRECATEDIN_3_0 void CRYPTO_mem_debug_free(void *addr, int flag,
    376                                                  const char *file, int line);
    377 OSSL_DEPRECATEDIN_3_0
    378 int CRYPTO_mem_leaks_cb(int (*cb)(const char *str, size_t len, void *u),
    379                         void *u);
    380 #  endif
    381 #  ifndef OPENSSL_NO_STDIO
    382 #  ifndef OPENSSL_NO_DEPRECATED_3_0
    383 OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_leaks_fp(FILE *);
    384 #  endif
    385 #  endif
    386 # ifndef OPENSSL_NO_DEPRECATED_3_0
    387 OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_leaks(BIO *bio);
    388 # endif
    389 # endif /* OPENSSL_NO_CRYPTO_MDEBUG */
    390 
    391 /* die if we have to */
    392 ossl_noreturn void OPENSSL_die(const char *assertion, const char *file, int line);
    393 # ifndef OPENSSL_NO_DEPRECATED_1_1_0
    394 #  define OpenSSLDie(f,l,a) OPENSSL_die((a),(f),(l))
    395 # endif
    396 # define OPENSSL_assert(e) \
    397     (void)((e) ? 0 : (OPENSSL_die("assertion failed: " #e, OPENSSL_FILE, OPENSSL_LINE), 1))
    398 
    399 int OPENSSL_isservice(void);
    400 
    401 void OPENSSL_init(void);
    402 # ifdef OPENSSL_SYS_UNIX
    403 #  ifndef OPENSSL_NO_DEPRECATED_3_0
    404 OSSL_DEPRECATEDIN_3_0 void OPENSSL_fork_prepare(void);
    405 OSSL_DEPRECATEDIN_3_0 void OPENSSL_fork_parent(void);
    406 OSSL_DEPRECATEDIN_3_0 void OPENSSL_fork_child(void);
    407 #  endif
    408 # endif
    409 
    410 struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result);
    411 int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec);
    412 int OPENSSL_gmtime_diff(int *pday, int *psec,
    413                         const struct tm *from, const struct tm *to);
    414 
    415 /*
    416  * CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal.
    417  * It takes an amount of time dependent on |len|, but independent of the
    418  * contents of |a| and |b|. Unlike memcmp, it cannot be used to put elements
    419  * into a defined order as the return value when a != b is undefined, other
    420  * than to be non-zero.
    421  */
    422 int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len);
    423 
    424 /* Standard initialisation options */
    425 # define OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS 0x00000001L
    426 # define OPENSSL_INIT_LOAD_CRYPTO_STRINGS    0x00000002L
    427 # define OPENSSL_INIT_ADD_ALL_CIPHERS        0x00000004L
    428 # define OPENSSL_INIT_ADD_ALL_DIGESTS        0x00000008L
    429 # define OPENSSL_INIT_NO_ADD_ALL_CIPHERS     0x00000010L
    430 # define OPENSSL_INIT_NO_ADD_ALL_DIGESTS     0x00000020L
    431 # define OPENSSL_INIT_LOAD_CONFIG            0x00000040L
    432 # define OPENSSL_INIT_NO_LOAD_CONFIG         0x00000080L
    433 # define OPENSSL_INIT_ASYNC                  0x00000100L
    434 # define OPENSSL_INIT_ENGINE_RDRAND          0x00000200L
    435 # define OPENSSL_INIT_ENGINE_DYNAMIC         0x00000400L
    436 # define OPENSSL_INIT_ENGINE_OPENSSL         0x00000800L
    437 # define OPENSSL_INIT_ENGINE_CRYPTODEV       0x00001000L
    438 # define OPENSSL_INIT_ENGINE_CAPI            0x00002000L
    439 # define OPENSSL_INIT_ENGINE_PADLOCK         0x00004000L
    440 # define OPENSSL_INIT_ENGINE_AFALG           0x00008000L
    441 /* FREE:                                     0x00010000L */
    442 # define OPENSSL_INIT_ATFORK                 0x00020000L
    443 /* OPENSSL_INIT_BASE_ONLY                    0x00040000L */
    444 # define OPENSSL_INIT_NO_ATEXIT              0x00080000L
    445 /* OPENSSL_INIT flag range 0x03f00000 reserved for OPENSSL_init_ssl() */
    446 /* FREE: 0x04000000L */
    447 /* FREE: 0x08000000L */
    448 /* FREE: 0x10000000L */
    449 /* FREE: 0x20000000L */
    450 /* FREE: 0x40000000L */
    451 /* FREE: 0x80000000L */
    452 /* Max OPENSSL_INIT flag value is 0x80000000 */
    453 
    454 /* openssl and dasync not counted as builtin */
    455 # define OPENSSL_INIT_ENGINE_ALL_BUILTIN \
    456     (OPENSSL_INIT_ENGINE_RDRAND | OPENSSL_INIT_ENGINE_DYNAMIC \
    457     | OPENSSL_INIT_ENGINE_CRYPTODEV | OPENSSL_INIT_ENGINE_CAPI | \
    458     OPENSSL_INIT_ENGINE_PADLOCK)
    459 
    460 /* Library initialisation functions */
    461 void OPENSSL_cleanup(void);
    462 int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings);
    463 int OPENSSL_atexit(void (*handler)(void));
    464 void OPENSSL_thread_stop(void);
    465 void OPENSSL_thread_stop_ex(OSSL_LIB_CTX *ctx);
    466 
    467 /* Low-level control of initialization */
    468 OPENSSL_INIT_SETTINGS *OPENSSL_INIT_new(void);
    469 # ifndef OPENSSL_NO_STDIO
    470 int OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *settings,
    471                                      const char *config_filename);
    472 void OPENSSL_INIT_set_config_file_flags(OPENSSL_INIT_SETTINGS *settings,
    473                                         unsigned long flags);
    474 int OPENSSL_INIT_set_config_appname(OPENSSL_INIT_SETTINGS *settings,
    475                                     const char *config_appname);
    476 # endif
    477 void OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS *settings);
    478 
    479 # if defined(OPENSSL_THREADS) && !defined(CRYPTO_TDEBUG)
    480 #  if defined(_WIN32)
    481 #   if defined(BASETYPES) || defined(_WINDEF_H)
    482 /* application has to include <windows.h> in order to use this */
    483 typedef DWORD CRYPTO_THREAD_LOCAL;
    484 typedef DWORD CRYPTO_THREAD_ID;
    485 
    486 typedef LONG CRYPTO_ONCE;
    487 #    define CRYPTO_ONCE_STATIC_INIT 0
    488 #   endif
    489 #  else
    490 #   if defined(__TANDEM) && defined(_SPT_MODEL_)
    491 #    define  SPT_THREAD_SIGNAL 1
    492 #    define  SPT_THREAD_AWARE 1
    493 #    include <spthread.h>
    494 #   else
    495 #    include <pthread.h>
    496 #   endif
    497 typedef pthread_once_t CRYPTO_ONCE;
    498 typedef pthread_key_t CRYPTO_THREAD_LOCAL;
    499 typedef pthread_t CRYPTO_THREAD_ID;
    500 
    501 #   define CRYPTO_ONCE_STATIC_INIT PTHREAD_ONCE_INIT
    502 #  endif
    503 # endif
    504 
    505 # if !defined(CRYPTO_ONCE_STATIC_INIT)
    506 typedef unsigned int CRYPTO_ONCE;
    507 typedef unsigned int CRYPTO_THREAD_LOCAL;
    508 typedef unsigned int CRYPTO_THREAD_ID;
    509 #  define CRYPTO_ONCE_STATIC_INIT 0
    510 # endif
    511 
    512 int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void));
    513 
    514 int CRYPTO_THREAD_init_local(CRYPTO_THREAD_LOCAL *key, void (*cleanup)(void *));
    515 void *CRYPTO_THREAD_get_local(CRYPTO_THREAD_LOCAL *key);
    516 int CRYPTO_THREAD_set_local(CRYPTO_THREAD_LOCAL *key, void *val);
    517 int CRYPTO_THREAD_cleanup_local(CRYPTO_THREAD_LOCAL *key);
    518 
    519 CRYPTO_THREAD_ID CRYPTO_THREAD_get_current_id(void);
    520 int CRYPTO_THREAD_compare_id(CRYPTO_THREAD_ID a, CRYPTO_THREAD_ID b);
    521 
    522 OSSL_LIB_CTX *OSSL_LIB_CTX_new(void);
    523 OSSL_LIB_CTX *OSSL_LIB_CTX_new_from_dispatch(const OSSL_CORE_HANDLE *handle,
    524                                              const OSSL_DISPATCH *in);
    525 OSSL_LIB_CTX *OSSL_LIB_CTX_new_child(const OSSL_CORE_HANDLE *handle,
    526                                      const OSSL_DISPATCH *in);
    527 int OSSL_LIB_CTX_load_config(OSSL_LIB_CTX *ctx, const char *config_file);
    528 void OSSL_LIB_CTX_free(OSSL_LIB_CTX *);
    529 OSSL_LIB_CTX *OSSL_LIB_CTX_get0_global_default(void);
    530 OSSL_LIB_CTX *OSSL_LIB_CTX_set0_default(OSSL_LIB_CTX *libctx);
    531 
    532 # ifdef  __cplusplus
    533 }
    534 # endif
    535 #endif
    536