diff options
author | Dmitry Belyavskiy <beldmit@gmail.com> | 2022-04-13 12:33:21 +0200 |
---|---|---|
committer | Dmitry Belyavskiy <beldmit@gmail.com> | 2022-04-21 17:12:31 +0200 |
commit | 467b6f17a6747fd2e09b7c1475f2e9c91ef2e0ed (patch) | |
tree | 7fc09117f1c81b8659c20c4ec28281e92f3bb2f1 /providers | |
parent | 130de70e0f85ecec08fcfe4daed1d0c491089ea6 (diff) |
FIPS provider modifications
Reviewed-by: Tim Hudson <tjh@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/18103)
Diffstat (limited to 'providers')
-rw-r--r-- | providers/fips/fipsprov.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/providers/fips/fipsprov.c b/providers/fips/fipsprov.c index f4605dcd6c..fc17a958ce 100644 --- a/providers/fips/fipsprov.c +++ b/providers/fips/fipsprov.c @@ -22,6 +22,7 @@ #include "prov/provider_util.h" #include "prov/seeding.h" #include "self_test.h" +#include "internal/core.h" static const char FIPS_DEFAULT_PROPERTIES[] = "provider=fips,fips=yes"; static const char FIPS_UNAPPROVED_PROPERTIES[] = "provider=fips,fips=no"; @@ -35,6 +36,22 @@ static OSSL_FUNC_provider_gettable_params_fn fips_gettable_params; static OSSL_FUNC_provider_get_params_fn fips_get_params; static OSSL_FUNC_provider_query_operation_fn fips_query; +/* Locale object accessor functions */ +#ifdef OPENSSL_SYS_MACOSX +# include <xlocale.h> +#else +# include <locale.h> +#endif + +#if defined OPENSSL_SYS_WINDOWS +# define locale_t _locale_t +# define freelocale _free_locale +#endif +static locale_t loc; + +static int fips_init_casecmp(void); +static void fips_deinit_casecmp(void); + #define ALGC(NAMES, FUNC, CHECK) { { NAMES, FIPS_DEFAULT_PROPERTIES, FUNC }, CHECK } #define ALG(NAMES, FUNC) ALGC(NAMES, FUNC, NULL) @@ -486,6 +503,23 @@ static const OSSL_ALGORITHM *fips_query(void *provctx, int operation_id, return NULL; } +void *ossl_c_locale() { + return (void *)loc; +} + +static int fips_init_casecmp(void) { +# ifdef OPENSSL_SYS_WINDOWS + loc = _create_locale(LC_COLLATE, "C"); +# else + loc = newlocale(LC_COLLATE_MASK, "C", (locale_t) 0); +# endif + return (loc == (locale_t) 0) ? 0 : 1; +} + +static void fips_deinit_casecmp(void) { + freelocale(loc); +} + static void fips_teardown(void *provctx) { OSSL_LIB_CTX_free(PROV_LIBCTX_OF(provctx)); @@ -498,6 +532,7 @@ static void fips_intern_teardown(void *provctx) * We know that the library context is the same as for the outer provider, * so no need to destroy it here. */ + fips_deinit_casecmp(); ossl_prov_ctx_free(provctx); } @@ -547,6 +582,8 @@ int OSSL_provider_init_int(const OSSL_CORE_HANDLE *handle, memset(&selftest_params, 0, sizeof(selftest_params)); + if (!fips_init_casecmp()) + return 0; if (!ossl_prov_seeding_from_dispatch(in)) return 0; for (; in->function_id != 0; in++) { |