From a803e98f99a990c0c291748fd33a3d057d6f77bf Mon Sep 17 00:00:00 2001 From: Dmitry Belyavskiy Date: Sun, 27 Oct 2019 21:15:39 +0300 Subject: [PATCH] Provider file - initial commit --- CMakeLists.txt | 10 ++++- gost_prov.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 gost_prov.c diff --git a/CMakeLists.txt b/CMakeLists.txt index ea1539e..b58456b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,9 +36,7 @@ endif() include (TestBigEndian) TEST_BIG_ENDIAN(IS_BIG_ENDIAN) if(IS_BIG_ENDIAN) - message(STATUS "BIG_ENDIAN") else() - message(STATUS "LITTLE_ENDIAN") add_definitions(-DL_ENDIAN) endif() @@ -138,6 +136,9 @@ set(GOST_ENGINE_SOURCE_FILES gost_omac_acpkm.c ) +set(GOST_PROVIDER_SOURCE_FILES + gost_prov.c) + add_executable(test_digest test_digest.c) target_link_libraries(test_digest gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY}) add_test(NAME digest @@ -217,6 +218,11 @@ set_target_properties(gost_engine PROPERTIES PREFIX "" OUTPUT_NAME "gost") set_target_properties(gost_engine PROPERTIES VERSION ${GOST_SOVERSION} SOVERSION ${GOST_SOVERSION}) target_link_libraries(gost_engine gost_core ${OPENSSL_CRYPTO_LIBRARY}) +add_library(gost_provider SHARED ${GOST_PROVIDER_SOURCE_FILES}) +set_target_properties(gost_provider PROPERTIES PREFIX "" OUTPUT_NAME "gost_prov") +set_target_properties(gost_provider PROPERTIES VERSION ${GOST_SOVERSION} SOVERSION ${GOST_SOVERSION}) +target_link_libraries(gost_provider gost_core ${OPENSSL_CRYPTO_LIBRARY}) + set(GOST_SUM_SOURCE_FILES gostsum.c ) diff --git a/gost_prov.c b/gost_prov.c new file mode 100644 index 0000000..273703b --- /dev/null +++ b/gost_prov.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include +#include + +#define GOST_PROV_VERSION_STR "3.0.0" +#define GOST_PROV_FULL_VERSION_STR "3.0.0" + +/* Functions provided by the core */ +static OSSL_core_gettable_params_fn *c_gettable_params = NULL; +static OSSL_core_get_params_fn *c_get_params = NULL; + +/* Parameters we provide to the core */ +static const OSSL_ITEM gost_param_types[] = { + { OSSL_PARAM_UTF8_PTR, OSSL_PROV_PARAM_NAME }, + { OSSL_PARAM_UTF8_PTR, OSSL_PROV_PARAM_VERSION }, + { OSSL_PARAM_UTF8_PTR, OSSL_PROV_PARAM_BUILDINFO }, + { 0, NULL } +}; + +static const OSSL_ITEM *gost_gettable_params(const OSSL_PROVIDER *prov) +{ + return gost_param_types; +} + +static int gost_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[]) +{ + OSSL_PARAM *p; + + p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME); + if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "GOST Provider")) + return 0; + p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_VERSION); + if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, GOST_PROV_VERSION_STR)) + return 0; + p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_BUILDINFO); + if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, GOST_PROV_FULL_VERSION_STR)) + return 0; + + return 1; +} + +static const OSSL_ALGORITHM gost_digests[] = { + { "md_gost94", "gost.legacy=yes", NULL }, /* FIXME */ + { "md_gost2012_256:streebog256", "gost.gost=yes", NULL }, + { "md_gost2012_512:streebog512", "gost.gost=yes", NULL }, + + { NULL, NULL, NULL } +}; + +static const OSSL_ALGORITHM *gost_query(OSSL_PROVIDER *prov, + int operation_id, + int *no_cache) +{ + *no_cache = 0; + switch (operation_id) { + case OSSL_OP_DIGEST: + return gost_digests; + } + return NULL; +} + +/* Functions we provide to the core */ +static const OSSL_DISPATCH gost_dispatch_table[] = { + { OSSL_FUNC_PROVIDER_GETTABLE_PARAMS, (void (*)(void))gost_gettable_params }, + { OSSL_FUNC_PROVIDER_GET_PARAMS, (void (*)(void))gost_get_params }, + { OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void (*)(void))gost_query }, + { 0, NULL } +}; + +int OSSL_provider_init(const OSSL_PROVIDER *provider, + const OSSL_DISPATCH *in, + const OSSL_DISPATCH **out, + void **provctx) +{ + OSSL_core_get_library_context_fn *c_get_libctx = NULL; + + for (; in->function_id != 0; in++) { + switch (in->function_id) { + case OSSL_FUNC_CORE_GETTABLE_PARAMS: + c_gettable_params = OSSL_get_core_gettable_params(in); + break; + case OSSL_FUNC_CORE_GET_PARAMS: + c_get_params = OSSL_get_core_get_params(in); + break; + case OSSL_FUNC_CORE_GET_LIBRARY_CONTEXT: + c_get_libctx = OSSL_get_core_get_library_context(in); + break; + /* Just ignore anything we don't understand */ + default: + break; + } + } + + if (c_get_libctx == NULL) + return 0; + + *out = gost_dispatch_table; + + /* + * We want to make sure that all calls from this provider that requires + * a library context use the same context as the one used to call our + * functions. We do that by passing it along as the provider context. + */ + *provctx = c_get_libctx(provider); + return 1; +} -- 2.39.2