2016-05-18 03:38:09 +08:00
|
|
|
/*
|
2020-04-23 20:55:52 +08:00
|
|
|
* Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
|
1998-12-21 18:52:47 +08:00
|
|
|
*
|
2018-12-06 20:12:35 +08:00
|
|
|
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
2016-05-18 03:38:09 +08:00
|
|
|
* this file except in compliance with the License. You can obtain a copy
|
|
|
|
* in the file LICENSE in the source distribution or at
|
|
|
|
* https://www.openssl.org/source/license.html
|
1998-12-21 18:52:47 +08:00
|
|
|
*/
|
|
|
|
|
2019-09-28 06:45:57 +08:00
|
|
|
#ifndef OSSL_INTERNAL_CRYPTLIB_H
|
|
|
|
# define OSSL_INTERNAL_CRYPTLIB_H
|
1998-12-21 18:52:47 +08:00
|
|
|
|
2015-01-22 11:40:55 +08:00
|
|
|
# include <stdlib.h>
|
|
|
|
# include <string.h>
|
1998-12-21 18:52:47 +08:00
|
|
|
|
2015-01-22 11:40:55 +08:00
|
|
|
# ifdef OPENSSL_USE_APPLINK
|
2018-09-24 19:15:22 +08:00
|
|
|
# define BIO_FLAGS_UPLINK_INTERNAL 0x8000
|
2015-01-22 11:40:55 +08:00
|
|
|
# include "ms/uplink.h"
|
2018-09-24 19:15:22 +08:00
|
|
|
# else
|
|
|
|
# define BIO_FLAGS_UPLINK_INTERNAL 0
|
2015-01-22 11:40:55 +08:00
|
|
|
# endif
|
2005-05-17 08:08:28 +08:00
|
|
|
|
2015-01-22 11:40:55 +08:00
|
|
|
# include <openssl/crypto.h>
|
|
|
|
# include <openssl/buffer.h>
|
|
|
|
# include <openssl/bio.h>
|
2020-03-05 15:43:06 +08:00
|
|
|
# include <openssl/asn1.h>
|
2015-01-22 11:40:55 +08:00
|
|
|
# include <openssl/err.h>
|
2017-08-18 11:52:46 +08:00
|
|
|
# include "internal/nelem.h"
|
1998-12-21 18:52:47 +08:00
|
|
|
|
2017-08-02 21:46:31 +08:00
|
|
|
#ifdef NDEBUG
|
|
|
|
# define ossl_assert(x) ((x) != 0)
|
|
|
|
#else
|
|
|
|
__owur static ossl_inline int ossl_assert_int(int expr, const char *exprstr,
|
|
|
|
const char *file, int line)
|
|
|
|
{
|
|
|
|
if (!expr)
|
|
|
|
OPENSSL_die(exprstr, file, line);
|
|
|
|
|
|
|
|
return expr;
|
|
|
|
}
|
|
|
|
|
|
|
|
# define ossl_assert(x) ossl_assert_int((x) != 0, "Assertion failed: "#x, \
|
|
|
|
__FILE__, __LINE__)
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2019-04-30 18:36:16 +08:00
|
|
|
/*
|
|
|
|
* Use this inside a union with the field that needs to be aligned to a
|
|
|
|
* reasonable boundary for the platform. The most pessimistic alignment
|
|
|
|
* of the listed types will be used by the compiler.
|
|
|
|
*/
|
|
|
|
# define OSSL_UNION_ALIGN \
|
|
|
|
double align; \
|
|
|
|
ossl_uintmax_t align_int; \
|
|
|
|
void *align_ptr
|
|
|
|
|
2016-01-06 10:54:18 +08:00
|
|
|
typedef struct ex_callback_st EX_CALLBACK;
|
|
|
|
DEFINE_STACK_OF(EX_CALLBACK)
|
|
|
|
|
2016-01-11 22:11:13 +08:00
|
|
|
typedef struct mem_st MEM;
|
2016-01-11 23:22:30 +08:00
|
|
|
DEFINE_LHASH_OF(MEM);
|
2016-01-06 10:54:18 +08:00
|
|
|
|
2017-08-24 07:14:10 +08:00
|
|
|
# define OPENSSL_CONF "openssl.cnf"
|
|
|
|
|
2015-01-22 11:40:55 +08:00
|
|
|
# ifndef OPENSSL_SYS_VMS
|
|
|
|
# define X509_CERT_AREA OPENSSLDIR
|
|
|
|
# define X509_CERT_DIR OPENSSLDIR "/certs"
|
|
|
|
# define X509_CERT_FILE OPENSSLDIR "/cert.pem"
|
|
|
|
# define X509_PRIVATE_DIR OPENSSLDIR "/private"
|
2016-03-04 21:18:54 +08:00
|
|
|
# define CTLOG_FILE OPENSSLDIR "/ct_log_list.cnf"
|
2015-01-22 11:40:55 +08:00
|
|
|
# else
|
2016-07-02 14:47:08 +08:00
|
|
|
# define X509_CERT_AREA "OSSL$DATAROOT:[000000]"
|
2016-07-09 00:27:56 +08:00
|
|
|
# define X509_CERT_DIR "OSSL$DATAROOT:[CERTS]"
|
|
|
|
# define X509_CERT_FILE "OSSL$DATAROOT:[000000]cert.pem"
|
|
|
|
# define X509_PRIVATE_DIR "OSSL$DATAROOT:[PRIVATE]"
|
|
|
|
# define CTLOG_FILE "OSSL$DATAROOT:[000000]ct_log_list.cnf"
|
2015-01-22 11:40:55 +08:00
|
|
|
# endif
|
1998-12-21 18:52:47 +08:00
|
|
|
|
2015-01-22 11:40:55 +08:00
|
|
|
# define X509_CERT_DIR_EVP "SSL_CERT_DIR"
|
|
|
|
# define X509_CERT_FILE_EVP "SSL_CERT_FILE"
|
2016-02-25 21:33:48 +08:00
|
|
|
# define CTLOG_FILE_EVP "CTLOG_FILE"
|
1998-12-21 18:52:47 +08:00
|
|
|
|
2002-11-13 23:43:43 +08:00
|
|
|
/* size of string representations */
|
2015-01-22 11:40:55 +08:00
|
|
|
# define DECIMAL_SIZE(type) ((sizeof(type)*8+2)/3+1)
|
|
|
|
# define HEX_SIZE(type) (sizeof(type)*2)
|
2002-11-13 23:43:43 +08:00
|
|
|
|
2004-08-30 00:36:05 +08:00
|
|
|
void OPENSSL_cpuid_setup(void);
|
2019-08-24 17:28:19 +08:00
|
|
|
#if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
|
|
|
|
defined(__x86_64) || defined(__x86_64__) || \
|
|
|
|
defined(_M_AMD64) || defined(_M_X64)
|
2009-04-27 01:49:41 +08:00
|
|
|
extern unsigned int OPENSSL_ia32cap_P[];
|
2019-08-24 17:28:19 +08:00
|
|
|
#endif
|
2015-01-22 11:40:55 +08:00
|
|
|
void OPENSSL_showfatal(const char *fmta, ...);
|
2019-05-01 18:02:43 +08:00
|
|
|
int do_ex_data_init(OPENSSL_CTX *ctx);
|
|
|
|
void crypto_cleanup_all_ex_data_int(OPENSSL_CTX *ctx);
|
2017-06-23 02:00:06 +08:00
|
|
|
int openssl_init_fork_handlers(void);
|
2019-05-28 03:03:09 +08:00
|
|
|
int openssl_get_fork_id(void);
|
2004-08-30 00:36:05 +08:00
|
|
|
|
2018-09-24 09:21:18 +08:00
|
|
|
char *ossl_safe_getenv(const char *name);
|
|
|
|
|
2017-10-05 09:17:58 +08:00
|
|
|
extern CRYPTO_RWLOCK *memdbg_lock;
|
2016-05-23 20:52:29 +08:00
|
|
|
int openssl_strerror_r(int errnum, char *buf, size_t buflen);
|
2016-06-21 21:26:18 +08:00
|
|
|
# if !defined(OPENSSL_NO_STDIO)
|
|
|
|
FILE *openssl_fopen(const char *filename, const char *mode);
|
|
|
|
# else
|
|
|
|
void *openssl_fopen(const char *filename, const char *mode);
|
|
|
|
# endif
|
2016-05-23 20:52:29 +08:00
|
|
|
|
2018-02-06 05:16:26 +08:00
|
|
|
uint32_t OPENSSL_rdtsc(void);
|
2019-01-17 22:15:57 +08:00
|
|
|
size_t OPENSSL_instrument_bus(unsigned int *, size_t);
|
|
|
|
size_t OPENSSL_instrument_bus2(unsigned int *, size_t, size_t);
|
2017-11-20 00:40:56 +08:00
|
|
|
|
2019-05-01 18:02:43 +08:00
|
|
|
/* ex_data structures */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Each structure type (sometimes called a class), that supports
|
|
|
|
* exdata has a stack of callbacks for each instance.
|
|
|
|
*/
|
|
|
|
struct ex_callback_st {
|
|
|
|
long argl; /* Arbitrary long */
|
|
|
|
void *argp; /* Arbitrary void * */
|
|
|
|
CRYPTO_EX_new *new_func;
|
|
|
|
CRYPTO_EX_free *free_func;
|
|
|
|
CRYPTO_EX_dup *dup_func;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The state for each class. This could just be a typedef, but
|
|
|
|
* a structure allows future changes.
|
|
|
|
*/
|
|
|
|
typedef struct ex_callbacks_st {
|
|
|
|
STACK_OF(EX_CALLBACK) *meth;
|
|
|
|
} EX_CALLBACKS;
|
|
|
|
|
|
|
|
typedef struct ossl_ex_data_global_st {
|
|
|
|
CRYPTO_RWLOCK *ex_data_lock;
|
|
|
|
EX_CALLBACKS ex_data[CRYPTO_EX_INDEX__COUNT];
|
|
|
|
} OSSL_EX_DATA_GLOBAL;
|
|
|
|
|
|
|
|
|
|
|
|
/* OPENSSL_CTX */
|
|
|
|
|
|
|
|
# define OPENSSL_CTX_PROVIDER_STORE_RUN_ONCE_INDEX 0
|
|
|
|
# define OPENSSL_CTX_DEFAULT_METHOD_STORE_RUN_ONCE_INDEX 1
|
|
|
|
# define OPENSSL_CTX_METHOD_STORE_RUN_ONCE_INDEX 2
|
|
|
|
# define OPENSSL_CTX_MAX_RUN_ONCE 3
|
|
|
|
|
2019-10-24 23:04:01 +08:00
|
|
|
# define OPENSSL_CTX_EVP_METHOD_STORE_INDEX 0
|
2019-05-01 18:02:43 +08:00
|
|
|
# define OPENSSL_CTX_PROVIDER_STORE_INDEX 1
|
|
|
|
# define OPENSSL_CTX_PROPERTY_DEFN_INDEX 2
|
|
|
|
# define OPENSSL_CTX_PROPERTY_STRING_INDEX 3
|
2019-05-04 18:55:32 +08:00
|
|
|
# define OPENSSL_CTX_NAMEMAP_INDEX 4
|
2019-05-23 21:35:31 +08:00
|
|
|
# define OPENSSL_CTX_DRBG_INDEX 5
|
2019-05-24 23:36:44 +08:00
|
|
|
# define OPENSSL_CTX_DRBG_NONCE_INDEX 6
|
|
|
|
# define OPENSSL_CTX_RAND_CRNGT_INDEX 7
|
2019-05-25 01:20:49 +08:00
|
|
|
# define OPENSSL_CTX_THREAD_EVENT_HANDLER_INDEX 8
|
2019-05-27 23:31:27 +08:00
|
|
|
# define OPENSSL_CTX_FIPS_PROV_INDEX 9
|
SERIALIZER: New API for serialization of objects through providers
Serialization is needed to be able to take a provider object (such as
the provider side key data) and output it in PEM form, DER form, text
form (for display), and possibly other future forms (XML? JSON? JWK?)
The idea is that a serializer should be able to handle objects it has
intimate knowledge of, as well as object data in OSSL_PARAM form. The
latter will allow libcrypto to serialize some object with a different
provider than the one holding the data, if exporting of that data is
allowed and there is a serializer that can handle it.
We will provide serializers for the types of objects we know about,
which should be useful together with any other provider that provides
implementations of the same type of object.
Serializers are selected by method name and a couple of additional
properties:
- format used to tell what format the output should be in.
Possibilities could include "format=text",
"format=pem", "format=der", "format=pem-pkcs1"
(traditional), "format=der-pkcs1" (traditional)
- type used to tell exactly what type of data should be
output, for example "type=public" (the public part of
a key), "type=private" (the private part of a key),
"type=domainparams" (domain parameters).
This also adds a passphrase callback function type,
OSSL_PASSPHRASE_CALLBACK, which is a bit like OSSL_CALLBACK, but it
takes a few extra arguments to place the result in.
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/10394)
2019-11-18 08:29:06 +08:00
|
|
|
# define OPENSSL_CTX_SERIALIZER_STORE_INDEX 10
|
2020-01-15 08:48:01 +08:00
|
|
|
# define OPENSSL_CTX_SELF_TEST_CB_INDEX 11
|
2020-05-06 19:29:57 +08:00
|
|
|
# define OPENSSL_CTX_BIO_PROV_INDEX 12
|
|
|
|
# define OPENSSL_CTX_MAX_INDEXES 13
|
2019-04-30 22:15:48 +08:00
|
|
|
|
2019-02-07 00:42:50 +08:00
|
|
|
typedef struct openssl_ctx_method {
|
2019-05-01 18:02:43 +08:00
|
|
|
void *(*new_func)(OPENSSL_CTX *ctx);
|
2019-02-07 00:42:50 +08:00
|
|
|
void (*free_func)(void *);
|
|
|
|
} OPENSSL_CTX_METHOD;
|
2019-05-01 18:02:43 +08:00
|
|
|
|
2019-05-28 22:58:08 +08:00
|
|
|
OPENSSL_CTX *openssl_ctx_get_concrete(OPENSSL_CTX *ctx);
|
2020-03-25 20:12:59 +08:00
|
|
|
int openssl_ctx_is_default(OPENSSL_CTX *ctx);
|
2019-05-28 22:58:08 +08:00
|
|
|
|
2019-02-07 00:42:50 +08:00
|
|
|
/* Functions to retrieve pointers to data by index */
|
2019-05-01 18:02:43 +08:00
|
|
|
void *openssl_ctx_get_data(OPENSSL_CTX *, int /* index */,
|
|
|
|
const OPENSSL_CTX_METHOD * ctx);
|
2019-02-07 00:42:50 +08:00
|
|
|
|
2019-05-01 18:02:43 +08:00
|
|
|
void openssl_ctx_default_deinit(void);
|
|
|
|
OSSL_EX_DATA_GLOBAL *openssl_ctx_get_ex_data_global(OPENSSL_CTX *ctx);
|
|
|
|
typedef int (openssl_ctx_run_once_fn)(OPENSSL_CTX *ctx);
|
|
|
|
typedef void (openssl_ctx_onfree_fn)(OPENSSL_CTX *ctx);
|
2019-04-30 22:15:48 +08:00
|
|
|
|
|
|
|
int openssl_ctx_run_once(OPENSSL_CTX *ctx, unsigned int idx,
|
|
|
|
openssl_ctx_run_once_fn run_once_fn);
|
|
|
|
int openssl_ctx_onfree(OPENSSL_CTX *ctx, openssl_ctx_onfree_fn onfreefn);
|
2019-05-01 18:02:43 +08:00
|
|
|
|
|
|
|
OPENSSL_CTX *crypto_ex_data_get_openssl_ctx(const CRYPTO_EX_DATA *ad);
|
|
|
|
int crypto_new_ex_data_ex(OPENSSL_CTX *ctx, int class_index, void *obj,
|
|
|
|
CRYPTO_EX_DATA *ad);
|
|
|
|
int crypto_get_ex_new_index_ex(OPENSSL_CTX *ctx, int class_index,
|
|
|
|
long argl, void *argp,
|
|
|
|
CRYPTO_EX_new *new_func,
|
|
|
|
CRYPTO_EX_dup *dup_func,
|
|
|
|
CRYPTO_EX_free *free_func);
|
|
|
|
int crypto_free_ex_index_ex(OPENSSL_CTX *ctx, int class_index, int idx);
|
2019-05-08 16:40:20 +08:00
|
|
|
|
|
|
|
/* Function for simple binary search */
|
|
|
|
|
|
|
|
/* Flags */
|
|
|
|
# define OSSL_BSEARCH_VALUE_ON_NOMATCH 0x01
|
|
|
|
# define OSSL_BSEARCH_FIRST_VALUE_ON_MATCH 0x02
|
|
|
|
|
|
|
|
const void *ossl_bsearch(const void *key, const void *base, int num,
|
|
|
|
int size, int (*cmp) (const void *, const void *),
|
|
|
|
int flags);
|
|
|
|
|
2020-02-22 04:41:56 +08:00
|
|
|
/* system-specific variants defining ossl_sleep() */
|
|
|
|
#ifdef OPENSSL_SYS_UNIX
|
|
|
|
# include <unistd.h>
|
|
|
|
static ossl_inline void ossl_sleep(unsigned long millis)
|
|
|
|
{
|
|
|
|
# ifdef OPENSSL_SYS_VXWORKS
|
|
|
|
struct timespec ts;
|
|
|
|
ts.tv_sec = (long int) (millis / 1000);
|
|
|
|
ts.tv_nsec = (long int) (millis % 1000) * 1000000ul;
|
|
|
|
nanosleep(&ts, NULL);
|
|
|
|
# else
|
|
|
|
usleep(millis * 1000);
|
|
|
|
# endif
|
|
|
|
}
|
|
|
|
#elif defined(_WIN32)
|
|
|
|
# include <windows.h>
|
|
|
|
static ossl_inline void ossl_sleep(unsigned long millis)
|
|
|
|
{
|
|
|
|
Sleep(millis);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
/* Fallback to a busy wait */
|
|
|
|
static ossl_inline void ossl_sleep(unsigned long millis)
|
|
|
|
{
|
|
|
|
struct timeval start, now;
|
|
|
|
unsigned long elapsedms;
|
|
|
|
|
|
|
|
gettimeofday(&start, NULL);
|
|
|
|
do {
|
|
|
|
gettimeofday(&now, NULL);
|
|
|
|
elapsedms = (((now.tv_sec - start.tv_sec) * 1000000)
|
|
|
|
+ now.tv_usec - start.tv_usec) / 1000;
|
|
|
|
} while (elapsedms < millis);
|
|
|
|
}
|
|
|
|
#endif /* defined OPENSSL_SYS_UNIX */
|
|
|
|
|
2020-03-05 15:43:06 +08:00
|
|
|
char *sk_ASN1_UTF8STRING2text(STACK_OF(ASN1_UTF8STRING) *text, const char *sep,
|
|
|
|
size_t max_len);
|
2020-05-01 01:31:07 +08:00
|
|
|
char *ipaddr_to_asc(unsigned char *p, int len);
|
2020-02-22 04:41:56 +08:00
|
|
|
|
1998-12-21 18:52:47 +08:00
|
|
|
#endif
|