From 978e323a4dbc9e790c13cc479b68c260677dc4c4 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Fri, 16 Apr 2021 11:13:30 +0100 Subject: [PATCH] Add the function OSSL_LIB_CTX_get0_global_default() An API function for obtaining the global default lib ctx. Reviewed-by: Paul Dale Reviewed-by: Tim Hudson Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/14890) --- crypto/context.c | 12 ++++++++++-- doc/man3/OSSL_LIB_CTX.pod | 20 ++++++++++++++------ include/openssl/crypto.h.in | 1 + util/libcrypto.num | 1 + 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/crypto/context.c b/crypto/context.c index 07fff535ff..d7671d66a8 100644 --- a/crypto/context.c +++ b/crypto/context.c @@ -199,9 +199,17 @@ void OSSL_LIB_CTX_free(OSSL_LIB_CTX *ctx) OPENSSL_free(ctx); } +#ifndef FIPS_MODULE +OSSL_LIB_CTX *OSSL_LIB_CTX_get0_global_default(void) +{ + if (!RUN_ONCE(&default_context_init, default_context_do_init)) + return NULL; + + return &default_context_int; +} + OSSL_LIB_CTX *OSSL_LIB_CTX_set0_default(OSSL_LIB_CTX *libctx) { -#ifndef FIPS_MODULE OSSL_LIB_CTX *current_defctx; if ((current_defctx = get_default_context()) != NULL) { @@ -209,10 +217,10 @@ OSSL_LIB_CTX *OSSL_LIB_CTX_set0_default(OSSL_LIB_CTX *libctx) set_default_context(libctx); return current_defctx; } -#endif return NULL; } +#endif OSSL_LIB_CTX *ossl_lib_ctx_get_concrete(OSSL_LIB_CTX *ctx) { diff --git a/doc/man3/OSSL_LIB_CTX.pod b/doc/man3/OSSL_LIB_CTX.pod index a23a10f5ce..f2bf3d9de6 100644 --- a/doc/man3/OSSL_LIB_CTX.pod +++ b/doc/man3/OSSL_LIB_CTX.pod @@ -3,7 +3,7 @@ =head1 NAME OSSL_LIB_CTX, OSSL_LIB_CTX_new, OSSL_LIB_CTX_free, OSSL_LIB_CTX_load_config, -OSSL_LIB_CTX_set0_default +OSSL_LIB_CTX_get0_global_default, OSSL_LIB_CTX_set0_default - OpenSSL library context =head1 SYNOPSIS @@ -15,6 +15,7 @@ OSSL_LIB_CTX_set0_default OSSL_LIB_CTX *OSSL_LIB_CTX_new(void); int OSSL_LIB_CTX_load_config(OSSL_LIB_CTX *ctx, const char *config_file); void OSSL_LIB_CTX_free(OSSL_LIB_CTX *ctx); + OSSL_LIB_CTX *OSSL_LIB_CTX_get0_global_default(void); OSSL_LIB_CTX *OSSL_LIB_CTX_set0_default(OSSL_LIB_CTX *ctx); =head1 DESCRIPTION @@ -38,12 +39,17 @@ from a configuration. OSSL_LIB_CTX_free() frees the given I, unless it happens to be the default OpenSSL library context. +OSSL_LIB_CTX_get0_global_default() returns a concrete (non NULL) reference to +the global default library context. + OSSL_LIB_CTX_set0_default() sets the default OpenSSL library context to be I in the current thread. The previous default library context is returned. Care should be taken by the caller to restore the previous default library context with a subsequent call of this function. If I is NULL then no change is made to the default library context, but a pointer to -the current library context is still returned. +the current library context is still returned. On a successful call of this +function the returned value will always be a concrete (non NULL) library +context. Care should be taken when changing the default library context and starting async jobs (see L), as the default library context when @@ -55,15 +61,17 @@ that job has finished. =head1 RETURN VALUES -OSSL_LIB_CTX_new() and OSSL_LIB_CTX_set0_default() return a library context -pointer on success, or NULL on error. +OSSL_LIB_CTX_new(), OSSL_LIB_CTX_get0_global_default() and +OSSL_LIB_CTX_set0_default() return a library context pointer on success, or NULL +on error. OSSL_LIB_CTX_free() doesn't return any value. =head1 HISTORY -OSSL_LIB_CTX, OSSL_LIB_CTX_new(), OSSL_LIB_CTX_load_config(), OSSL_LIB_CTX_free() -and OSSL_LIB_CTX_set0_default() were added in OpenSSL 3.0. +OSSL_LIB_CTX, OSSL_LIB_CTX_new(), OSSL_LIB_CTX_load_config(), +OSSL_LIB_CTX_free(), OSSL_LIB_CTX_get0_global_default() and +OSSL_LIB_CTX_set0_default() were added in OpenSSL 3.0. =head1 COPYRIGHT diff --git a/include/openssl/crypto.h.in b/include/openssl/crypto.h.in index adceb0c103..f25b997e32 100644 --- a/include/openssl/crypto.h.in +++ b/include/openssl/crypto.h.in @@ -519,6 +519,7 @@ int CRYPTO_THREAD_compare_id(CRYPTO_THREAD_ID a, CRYPTO_THREAD_ID b); OSSL_LIB_CTX *OSSL_LIB_CTX_new(void); int OSSL_LIB_CTX_load_config(OSSL_LIB_CTX *ctx, const char *config_file); void OSSL_LIB_CTX_free(OSSL_LIB_CTX *); +OSSL_LIB_CTX *OSSL_LIB_CTX_get0_global_default(void); OSSL_LIB_CTX *OSSL_LIB_CTX_set0_default(OSSL_LIB_CTX *libctx); # ifdef __cplusplus diff --git a/util/libcrypto.num b/util/libcrypto.num index 1ec8ee6fd9..a059aecd5e 100644 --- a/util/libcrypto.num +++ b/util/libcrypto.num @@ -5356,3 +5356,4 @@ EVP_MD_CTX_get0_md ? 3_0_0 EXIST::FUNCTION: EVP_MD_CTX_get1_md ? 3_0_0 EXIST::FUNCTION: EVP_CIPHER_CTX_get0_cipher ? 3_0_0 EXIST::FUNCTION: EVP_CIPHER_CTX_get1_cipher ? 3_0_0 EXIST::FUNCTION: +OSSL_LIB_CTX_get0_global_default ? 3_0_0 EXIST::FUNCTION: -- 2.39.2