liboqs/liboqs-0.10.0-dlopen-openssl.patch
Dmitry Belyavskiy 39e74bef9f Use dlopen for OpenSSL algos implementation
Resolves: RHEL-46598
2024-07-08 16:26:02 +02:00

4190 lines
154 KiB
Diff

From 32afec8fccd77a264e6104764986ce46d120f5ff Mon Sep 17 00:00:00 2001
From: Daiki Ueno <ueno@gnu.org>
Date: Fri, 5 Apr 2024 23:20:17 +0900
Subject: [PATCH] Add option to dynamically load libcrypto.so.* (#1603)
* sha2: Use EVP_MD_CTX_free instead of EVP_MD_CTX_destroy
According to the manual page, EVP_MD_CTX_destroy has been renamed to
EVP_MD_CTX_free in OpenSSL 1.1.0 and only provided as a compatibility
macro in later OpenSSL releases:
https://www.openssl.org/docs/man1.1.1/man3/EVP_MD_CTX_free.html
Signed-off-by: Daiki Ueno <dueno@redhat.com>
* ossl_helpers: Use pthread_once instead of CRYPTO_THREAD_run_once
Throughout the code base, liboqs uses pthread_once for one-shot
initialization and falls back to thread-unsafe code if it is not
supported nor enabled on the system. For consistency and to remove
additional dependency on OpenSSL, this switches the use of
CRYPTO_THREAD_run_once with that.
Signed-off-by: Daiki Ueno <dueno@redhat.com>
* Make common algorithms pluggable
This allows applications to replace the implementation of common
cryptographic algorithms at runtime, by setting callback functions for
each operations with OQS_AES_set_callbacks, OQS_SHA2_set_callbacks,
OQS_SHA3_set_callbacks, and OQS_SHA3_x4_callbacks. Those functions
may be called once before OQS_init; otherwise the default
implementation will be used.
Signed-off-by: Daiki Ueno <dueno@redhat.com>
* Add option to dynamically load libcrypto.so.*
This adds OQS_DLOPEN_OPENSSL build option to use OpenSSL through
dynamically loaded libcrypto.so.* with dlopen, instead of linking to
the library at build time.
That way the applications could use their favorite implementation of
common cryptographic primitives without pulling in the OpenSSL as a
hard dependency.
Signed-off-by: Daiki Ueno <dueno@redhat.com>
* Add tests for OQS_*_set_callbacks
This adds tests that exercise OQS_*_set_callbacks by overriding one of
the function of each and ensuring the wrapper function is called.
Signed-off-by: Daiki Ueno <dueno@redhat.com>
---------
Signed-off-by: Daiki Ueno <dueno@redhat.com>
---
.CMake/alg_support.cmake | 2 +
.github/workflows/unix.yml | 4 +
CMakeLists.txt | 14 ++
CONFIGURE.md | 10 +-
src/CMakeLists.txt | 5 +
src/common/CMakeLists.txt | 16 +-
src/common/aes/aes.c | 117 +++----------
src/common/aes/aes.h | 82 +++++++++
src/common/aes/aes_impl.c | 160 ++++++++++++++++++
src/common/aes/aes_local.h | 2 +
src/common/aes/aes_ossl.c | 79 +++++----
src/common/common.c | 6 +-
src/common/ossl_functions.h | 51 ++++++
src/common/ossl_helpers.c | 304 +++++++++++++++++++++++++---------
src/common/ossl_helpers.h | 24 ++-
src/common/rand/rand.c | 8 +-
src/common/rand/rand_nist.c | 13 +-
src/common/sha2/sha2.c | 90 +++-------
src/common/sha2/sha2.h | 113 ++++++++++++-
src/common/sha2/sha2_impl.c | 123 ++++++++++++++
src/common/sha2/sha2_local.h | 2 +
src/common/sha2/sha2_ossl.c | 127 ++++++++------
src/common/sha3/ossl_sha3.c | 237 +++++++++++++++-----------
src/common/sha3/ossl_sha3x4.c | 245 ++++++++++++++-------------
src/common/sha3/sha3.c | 161 ++++++++++++++++++
src/common/sha3/sha3.h | 201 ++++++++++++++++++++++
src/common/sha3/sha3x4.c | 77 +++++++++
src/common/sha3/sha3x4.h | 145 ++++++++++++++++
src/common/sha3/xkcp_sha3.c | 116 ++++++++-----
src/common/sha3/xkcp_sha3x4.c | 53 ++++--
src/oqsconfig.h.cmake | 2 +
tests/test_aes.c | 19 +++
tests/test_hash.c | 44 +++--
tests/test_sha3.c | 38 +++++
34 files changed, 2060 insertions(+), 630 deletions(-)
create mode 100644 src/common/aes/aes_impl.c
create mode 100644 src/common/ossl_functions.h
create mode 100644 src/common/sha2/sha2_impl.c
create mode 100644 src/common/sha3/sha3.c
create mode 100644 src/common/sha3/sha3x4.c
diff --git a/.CMake/alg_support.cmake b/.CMake/alg_support.cmake
index 66449097..3bdb103a 100644
--- a/.CMake/alg_support.cmake
+++ b/.CMake/alg_support.cmake
@@ -69,6 +69,8 @@ cmake_dependent_option(OQS_USE_SHA3_OPENSSL "" OFF "OQS_USE_OPENSSL" OFF)
# sanity check: Disable OpenSSL if not a single OpenSSL component define is on
cmake_dependent_option(OQS_USE_OPENSSL "" ON "OQS_USE_AES_OPENSSL OR OQS_USE_SHA2_OPENSSL OR OQS_USE_SHA3_OPENSSL" OFF)
+option(OQS_DLOPEN_OPENSSL "Enable OpenSSL through dlopen" OFF)
+
if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin")
if(OQS_DIST_X86_64_BUILD OR OQS_USE_AVX2_INSTRUCTIONS)
cmake_dependent_option(OQS_ENABLE_SHA3_xkcp_low_avx2 "" ON "NOT OQS_USE_SHA3_OPENSSL" OFF)
diff --git a/.github/workflows/unix.yml b/.github/workflows/unix.yml
index b4effa7a..b3dd56b7 100644
--- a/.github/workflows/unix.yml
+++ b/.github/workflows/unix.yml
@@ -92,6 +92,10 @@ jobs:
container: openquantumsafe/ci-ubuntu-jammy:latest
CMAKE_ARGS: -DOQS_STRICT_WARNINGS=ON -DOQS_ALGS_ENABLED=STD -DBUILD_SHARED_LIBS=ON
PYTEST_ARGS: --ignore=tests/test_leaks.py --ignore=tests/test_kat_all.py
+ - name: jammy-std-openssl3-dlopen
+ container: openquantumsafe/ci-ubuntu-jammy:latest
+ CMAKE_ARGS: -DOQS_STRICT_WARNINGS=ON -DOQS_ALGS_ENABLED=STD -DBUILD_SHARED_LIBS=ON -DOQS_DLOPEN_OPENSSL=ON
+ PYTEST_ARGS: --ignore=tests/test_leaks.py --ignore=tests/test_kat_all.py
- name: address-sanitizer
container: openquantumsafe/ci-ubuntu-focal-x86_64:latest
CMAKE_ARGS: -DCMAKE_C_COMPILER=clang-9 -DCMAKE_BUILD_TYPE=Debug -DUSE_SANITIZER=Address
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 60cdfc66..77da3023 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -133,6 +133,20 @@ if(${OQS_USE_OPENSSL})
endif()
endif()
find_package(OpenSSL 1.1.1 REQUIRED)
+
+ if(OQS_DLOPEN_OPENSSL)
+ find_program(OBJDUMP objdump)
+ if(NOT OBJDUMP)
+ message(FATAL_ERROR "objdump not found. Please install it from binutils.")
+ endif()
+ execute_process(
+ COMMAND ${OBJDUMP} -p ${OPENSSL_CRYPTO_LIBRARY}
+ COMMAND sed -n "s/[ ]\\{1,\\}SONAME[ ]\\{1,\\}//p"
+ OUTPUT_VARIABLE OQS_OPENSSL_CRYPTO_SONAME
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ COMMAND_ERROR_IS_FATAL ANY)
+ message(STATUS "OpenSSL dlopen SONAME: " ${OQS_OPENSSL_CRYPTO_SONAME})
+ endif()
endif()
set(PUBLIC_HEADERS ${PROJECT_SOURCE_DIR}/src/oqs.h
diff --git a/CONFIGURE.md b/CONFIGURE.md
index 397aa2cd..8adcbb2d 100644
--- a/CONFIGURE.md
+++ b/CONFIGURE.md
@@ -96,7 +96,7 @@ These can be set to `ON` or `OFF` and take an effect if liboqs is built for use
## OQS_USE_OPENSSL
-In order to save size and limit the mount of different cryptographic code bases, it is possible to use OpenSSL as a crypto code provider by setting this configuration option.
+In order to save size and limit the amount of different cryptographic code bases, it is possible to use OpenSSL as a crypto code provider by setting this configuration option.
This can be set to `ON` or `OFF`. When `ON`, the additional options `OQS_USE_AES_OPENSSL`, `OQS_USE_SHA2_OPENSSL`, and `OQS_USE_SHA3_OPENSSL` are made available to control whether liboqs uses OpenSSL's AES, SHA-2, and SHA-3 implementations.
@@ -111,6 +111,14 @@ When `OQS_USE_OPENSSL` is `ON`, CMake also scans the filesystem to find the mini
**Default**: `ON`.
+### OQS_DLOPEN_OPENSSL
+
+Dynamically load OpenSSL through `dlopen`. When using liboqs from other cryptographic libraries, hard dependency on OpenSSL is sometimes undesirable. If this option is `ON`, loading of OpenSSL will be deferred until any of the OpenSSL functions is used.
+
+Only has an effect if the system supports `dlopen` and ELF binary format, such as Linux or BSD family.
+
+**Default**: `OFF`.
+
## OQS_OPT_TARGET
An optimization target. Only has an effect if the compiler is GCC or Clang and `OQS_DIST_BUILD=OFF`. Can take any valid input to the `-march` (on x86-64) or `-mcpu` (on ARM32v7 or ARM64v8) option for `CMAKE_C_COMPILER`. Can also be set to one of the following special values.
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 51e887fe..d0dfb6f0 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -70,8 +70,13 @@ if(DEFINED SANITIZER_LD_FLAGS)
target_link_libraries(oqs-internal PUBLIC ${SANITIZER_LD_FLAGS})
endif()
if(${OQS_USE_OPENSSL})
+ if(${OQS_DLOPEN_OPENSSL})
+ target_link_libraries(oqs PRIVATE ${CMAKE_DL_LIBS})
+ target_link_libraries(oqs-internal PRIVATE ${CMAKE_DL_LIBS})
+ else()
target_link_libraries(oqs PRIVATE ${OPENSSL_CRYPTO_LIBRARY})
target_link_libraries(oqs-internal PRIVATE ${OPENSSL_CRYPTO_LIBRARY})
+ endif()
endif()
target_include_directories(oqs
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index 79172404..73b917e0 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -22,7 +22,7 @@ if(${OQS_USE_AES_OPENSSL})
set(AES_IMPL aes/aes_ossl.c)
set(OSSL_HELPERS ossl_helpers.c)
else()
- set(AES_IMPL aes/aes.c aes/aes_c.c)
+ set(AES_IMPL aes/aes_impl.c aes/aes_c.c)
if (OQS_DIST_X86_64_BUILD OR OQS_USE_AES_INSTRUCTIONS)
set(AES_IMPL ${AES_IMPL} aes/aes128_ni.c)
set(AES_IMPL ${AES_IMPL} aes/aes256_ni.c)
@@ -47,7 +47,7 @@ if(${OQS_USE_SHA2_OPENSSL})
set(SHA2_IMPL sha2/sha2_ossl.c)
set(OSSL_HELPERS ossl_helpers.c)
else()
- set(SHA2_IMPL sha2/sha2.c sha2/sha2_c.c)
+ set(SHA2_IMPL sha2/sha2_impl.c sha2/sha2_c.c)
if (OQS_DIST_ARM64_V8_BUILD)
set(SHA2_IMPL ${SHA2_IMPL} sha2/sha2_armv8.c)
set_source_files_properties(sha2/sha2_armv8.c PROPERTIES COMPILE_FLAGS -mcpu=cortex-a53+crypto)
@@ -71,9 +71,9 @@ else() # using XKCP
set(SHA3_IMPL sha3/xkcp_sha3.c sha3/xkcp_sha3x4.c)
endif()
-add_library(common OBJECT ${AES_IMPL}
- ${SHA2_IMPL}
- ${SHA3_IMPL}
+add_library(common OBJECT ${AES_IMPL} aes/aes.c
+ ${SHA2_IMPL} sha2/sha2.c
+ ${SHA3_IMPL} sha3/sha3.c sha3/sha3x4.c
${OSSL_HELPERS}
common.c
pqclean_shims/fips202.c
@@ -81,9 +81,9 @@ add_library(common OBJECT ${AES_IMPL}
rand/rand.c)
# Implementations of the internal API to be exposed to test programs
-add_library(internal OBJECT ${AES_IMPL}
- ${SHA2_IMPL}
- ${SHA3_IMPL}
+add_library(internal OBJECT ${AES_IMPL} aes/aes.c
+ ${SHA2_IMPL} sha2/sha2.c
+ ${SHA3_IMPL} sha3/sha3.c sha3/sha3x4.c
${OSSL_HELPERS}
common.c
rand/rand_nist.c)
diff --git a/src/common/aes/aes.c b/src/common/aes/aes.c
index 1fef083a..3ac87949 100644
--- a/src/common/aes/aes.c
+++ b/src/common/aes/aes.c
@@ -9,129 +9,60 @@
#include "aes.h"
#include "aes_local.h"
-#if defined(OQS_DIST_X86_64_BUILD)
-#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
- do { \
- if (OQS_CPU_has_extension(OQS_CPU_EXT_AES)) { \
- stmt_ni; \
- } else { \
- stmt_c; \
- } \
- } while(0)
-#elif defined(OQS_DIST_ARM64_V8_BUILD)
-#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
- do { \
- if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_AES)) { \
- stmt_arm; \
- } else { \
- stmt_c; \
- } \
- } while(0)
-#elif defined(OQS_USE_AES_INSTRUCTIONS)
-#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
- stmt_ni
-#elif defined(OQS_USE_ARM_AES_INSTRUCTIONS)
-#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
- stmt_arm
-#else
-#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
- stmt_c
-#endif
-
-void OQS_AES128_ECB_load_schedule(const uint8_t *key, void **_schedule) {
- C_OR_NI_OR_ARM(
- oqs_aes128_load_schedule_c(key, _schedule),
- oqs_aes128_load_schedule_ni(key, _schedule),
- oqs_aes128_load_schedule_no_bitslice(key, _schedule)
- );
+static struct OQS_AES_callbacks *callbacks = &aes_default_callbacks;
+
+OQS_API void OQS_AES_set_callbacks(struct OQS_AES_callbacks *new_callbacks) {
+ callbacks = new_callbacks;
+}
+
+void OQS_AES128_ECB_load_schedule(const uint8_t *key, void **schedule) {
+ callbacks->AES128_ECB_load_schedule(key, schedule);
}
void OQS_AES128_free_schedule(void *schedule) {
- C_OR_NI_OR_ARM(
- oqs_aes128_free_schedule_c(schedule),
- oqs_aes128_free_schedule_ni(schedule),
- oqs_aes128_free_schedule_no_bitslice(schedule)
- );
+ callbacks->AES128_free_schedule(schedule);
}
-void OQS_AES256_ECB_load_schedule(const uint8_t *key, void **_schedule) {
- C_OR_NI_OR_ARM(
- oqs_aes256_load_schedule_c(key, _schedule),
- oqs_aes256_load_schedule_ni(key, _schedule),
- oqs_aes256_load_schedule_no_bitslice(key, _schedule)
- );
+void OQS_AES256_ECB_load_schedule(const uint8_t *key, void **schedule) {
+ callbacks->AES256_ECB_load_schedule(key, schedule);
}
-void OQS_AES256_CTR_inc_init(const uint8_t *key, void **_schedule) {
- OQS_AES256_ECB_load_schedule(key, _schedule);
+void OQS_AES256_CTR_inc_init(const uint8_t *key, void **schedule) {
+ callbacks->AES256_CTR_inc_init(key, schedule);
}
-void OQS_AES256_CTR_inc_iv(const uint8_t *iv, size_t iv_len, void *_schedule) {
- C_OR_NI_OR_ARM(
- oqs_aes256_load_iv_c(iv, iv_len, _schedule),
- oqs_aes256_load_iv_ni(iv, iv_len, _schedule),
- oqs_aes256_load_iv_armv8(iv, iv_len, _schedule)
- );
+void OQS_AES256_CTR_inc_iv(const uint8_t *iv, size_t iv_len, void *schedule) {
+ callbacks->AES256_CTR_inc_iv(iv, iv_len, schedule);
}
-void OQS_AES256_CTR_inc_ivu64(uint64_t iv, void *_schedule) {
- C_OR_NI_OR_ARM(
- oqs_aes256_load_iv_u64_c(iv, _schedule),
- oqs_aes256_load_iv_u64_ni(iv, _schedule),
- (void) iv; (void) _schedule
- );
+void OQS_AES256_CTR_inc_ivu64(uint64_t iv, void *schedule) {
+ callbacks->AES256_CTR_inc_ivu64(iv, schedule);
}
void OQS_AES256_free_schedule(void *schedule) {
- C_OR_NI_OR_ARM(
- oqs_aes256_free_schedule_c(schedule),
- oqs_aes256_free_schedule_ni(schedule),
- oqs_aes256_free_schedule_no_bitslice(schedule)
- );
+ callbacks->AES256_free_schedule(schedule);
}
void OQS_AES128_ECB_enc(const uint8_t *plaintext, const size_t plaintext_len, const uint8_t *key, uint8_t *ciphertext) {
- void *schedule = NULL;
- OQS_AES128_ECB_load_schedule(key, &schedule);
- OQS_AES128_ECB_enc_sch(plaintext, plaintext_len, schedule, ciphertext);
- OQS_AES128_free_schedule(schedule);
+ callbacks->AES128_ECB_enc(plaintext, plaintext_len, key, ciphertext);
}
void OQS_AES128_ECB_enc_sch(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext) {
- C_OR_NI_OR_ARM(
- oqs_aes128_ecb_enc_sch_c(plaintext, plaintext_len, schedule, ciphertext),
- oqs_aes128_ecb_enc_sch_ni(plaintext, plaintext_len, schedule, ciphertext),
- oqs_aes128_ecb_enc_sch_armv8(plaintext, plaintext_len, schedule, ciphertext)
- );
+ callbacks->AES128_ECB_enc_sch(plaintext, plaintext_len, schedule, ciphertext);
}
void OQS_AES256_ECB_enc(const uint8_t *plaintext, const size_t plaintext_len, const uint8_t *key, uint8_t *ciphertext) {
- void *schedule = NULL;
- OQS_AES256_ECB_load_schedule(key, &schedule);
- OQS_AES256_ECB_enc_sch(plaintext, plaintext_len, schedule, ciphertext);
- OQS_AES256_free_schedule(schedule);
+ callbacks->AES256_ECB_enc(plaintext, plaintext_len, key, ciphertext);
}
void OQS_AES256_ECB_enc_sch(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext) {
- C_OR_NI_OR_ARM(
- oqs_aes256_ecb_enc_sch_c(plaintext, plaintext_len, schedule, ciphertext),
- oqs_aes256_ecb_enc_sch_ni(plaintext, plaintext_len, schedule, ciphertext),
- oqs_aes256_ecb_enc_sch_armv8(plaintext, plaintext_len, schedule, ciphertext)
- );
+ callbacks->AES256_ECB_enc_sch(plaintext, plaintext_len, schedule, ciphertext);
}
void OQS_AES256_CTR_inc_stream_iv(const uint8_t *iv, const size_t iv_len, const void *schedule, uint8_t *out, size_t out_len) {
- C_OR_NI_OR_ARM(
- oqs_aes256_ctr_enc_sch_c(iv, iv_len, schedule, out, out_len),
- oqs_aes256_ctr_enc_sch_ni(iv, iv_len, schedule, out, out_len),
- oqs_aes256_ctr_enc_sch_armv8(iv, iv_len, schedule, out, out_len)
- );
+ callbacks->AES256_CTR_inc_stream_iv(iv, iv_len, schedule, out, out_len);
}
void OQS_AES256_CTR_inc_stream_blks(void *schedule, uint8_t *out, size_t out_blks) {
- C_OR_NI_OR_ARM(
- oqs_aes256_ctr_enc_sch_upd_blks_c(schedule, out, out_blks),
- oqs_aes256_ctr_enc_sch_upd_blks_ni(schedule, out, out_blks),
- oqs_aes256_ctr_enc_sch_upd_blks_armv8(schedule, out, out_blks)
- );
+ callbacks->AES256_CTR_inc_stream_blks(schedule, out, out_blks);
}
diff --git a/src/common/aes/aes.h b/src/common/aes/aes.h
index 83649dbe..0194b907 100644
--- a/src/common/aes/aes.h
+++ b/src/common/aes/aes.h
@@ -14,6 +14,8 @@
#include <stdint.h>
#include <stdlib.h>
+#include <oqs/common.h>
+
#if defined(__cplusplus)
extern "C" {
#endif
@@ -147,6 +149,86 @@ void OQS_AES256_CTR_inc_stream_iv(const uint8_t *iv, size_t iv_len, const void *
*/
void OQS_AES256_CTR_inc_stream_blks(void *ctx, uint8_t *out, size_t out_blks);
+/** Data structure implemented by cryptographic provider for AES operations.
+ */
+struct OQS_AES_callbacks {
+ /**
+ * Implementation of function OQS_AES128_ECB_load_schedule.
+ */
+ void (*AES128_ECB_load_schedule)(const uint8_t *key, void **ctx);
+
+ /**
+ * Implementation of function OQS_AES128_free_schedule.
+ */
+ void (*AES128_free_schedule)(void *ctx);
+
+ /**
+ * Implementation of function OQS_AES128_ECB_enc.
+ */
+ void (*AES128_ECB_enc)(const uint8_t *plaintext, const size_t plaintext_len, const uint8_t *key, uint8_t *ciphertext);
+
+ /**
+ * Implementation of function OQS_AES128_ECB_enc_sch.
+ */
+ void (*AES128_ECB_enc_sch)(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext);
+
+ /**
+ * Implementation of function OQS_AES256_ECB_load_schedule.
+ */
+ void (*AES256_ECB_load_schedule)(const uint8_t *key, void **ctx);
+
+ /**
+ * Implementation of function OQS_AES256_CTR_inc_init.
+ */
+ void (*AES256_CTR_inc_init)(const uint8_t *key, void **ctx);
+
+ /**
+ * Implementation of function OQS_AES256_CTR_inc_iv.
+ */
+ void (*AES256_CTR_inc_iv)(const uint8_t *iv, size_t iv_len, void *ctx);
+
+ /**
+ * Implementation of function OQS_AES256_CTR_inc_ivu64.
+ */
+ void (*AES256_CTR_inc_ivu64)(uint64_t iv, void *ctx);
+
+ /**
+ * Implementation of function OQS_AES256_free_schedule.
+ */
+ void (*AES256_free_schedule)(void *ctx);
+
+ /**
+ * Implementation of function OQS_AES256_ECB_enc.
+ */
+ void (*AES256_ECB_enc)(const uint8_t *plaintext, const size_t plaintext_len, const uint8_t *key, uint8_t *ciphertext);
+
+ /**
+ * Implementation of function OQS_AES256_ECB_enc_sch.
+ */
+ void (*AES256_ECB_enc_sch)(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext);
+
+ /**
+ * Implementation of function OQS_AES256_CTR_inc_stream_iv.
+ */
+ void (*AES256_CTR_inc_stream_iv)(const uint8_t *iv, size_t iv_len, const void *ctx, uint8_t *out, size_t out_len);
+
+ /**
+ * Implementation of function OQS_AES256_CTR_inc_stream_blks.
+ */
+ void (*AES256_CTR_inc_stream_blks)(void *ctx, uint8_t *out, size_t out_blks);
+};
+
+/**
+ * Set callback functions for AES operations.
+ *
+ * This function may be called before OQS_init to switch the
+ * cryptographic provider for AES operations. If it is not called, the
+ * default provider determined at build time will be used.
+ *
+ * @param[in] new_callbacks Callback functions defined in OQS_AES_callbacks
+ */
+OQS_API void OQS_AES_set_callbacks(struct OQS_AES_callbacks *new_callbacks);
+
#if defined(__cplusplus)
} // extern "C"
#endif
diff --git a/src/common/aes/aes_impl.c b/src/common/aes/aes_impl.c
new file mode 100644
index 00000000..ae9be662
--- /dev/null
+++ b/src/common/aes/aes_impl.c
@@ -0,0 +1,160 @@
+// SPDX-License-Identifier: MIT
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <oqs/common.h>
+
+#include "aes.h"
+#include "aes_local.h"
+
+#if defined(OQS_DIST_X86_64_BUILD)
+#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
+ do { \
+ if (OQS_CPU_has_extension(OQS_CPU_EXT_AES)) { \
+ stmt_ni; \
+ } else { \
+ stmt_c; \
+ } \
+ } while(0)
+#elif defined(OQS_DIST_ARM64_V8_BUILD)
+#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
+ do { \
+ if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_AES)) { \
+ stmt_arm; \
+ } else { \
+ stmt_c; \
+ } \
+ } while(0)
+#elif defined(OQS_USE_AES_INSTRUCTIONS)
+#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
+ stmt_ni
+#elif defined(OQS_USE_ARM_AES_INSTRUCTIONS)
+#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
+ stmt_arm
+#else
+#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
+ stmt_c
+#endif
+
+static void AES128_ECB_load_schedule(const uint8_t *key, void **_schedule) {
+ C_OR_NI_OR_ARM(
+ oqs_aes128_load_schedule_c(key, _schedule),
+ oqs_aes128_load_schedule_ni(key, _schedule),
+ oqs_aes128_load_schedule_no_bitslice(key, _schedule)
+ );
+}
+
+static void AES128_free_schedule(void *schedule) {
+ C_OR_NI_OR_ARM(
+ oqs_aes128_free_schedule_c(schedule),
+ oqs_aes128_free_schedule_ni(schedule),
+ oqs_aes128_free_schedule_no_bitslice(schedule)
+ );
+}
+
+static void AES256_ECB_load_schedule(const uint8_t *key, void **_schedule) {
+ C_OR_NI_OR_ARM(
+ oqs_aes256_load_schedule_c(key, _schedule),
+ oqs_aes256_load_schedule_ni(key, _schedule),
+ oqs_aes256_load_schedule_no_bitslice(key, _schedule)
+ );
+}
+
+static void AES256_CTR_inc_init(const uint8_t *key, void **_schedule) {
+ AES256_ECB_load_schedule(key, _schedule);
+}
+
+static void AES256_CTR_inc_iv(const uint8_t *iv, size_t iv_len, void *_schedule) {
+ C_OR_NI_OR_ARM(
+ oqs_aes256_load_iv_c(iv, iv_len, _schedule),
+ oqs_aes256_load_iv_ni(iv, iv_len, _schedule),
+ oqs_aes256_load_iv_armv8(iv, iv_len, _schedule)
+ );
+}
+
+static void AES256_CTR_inc_ivu64(uint64_t iv, void *_schedule) {
+ C_OR_NI_OR_ARM(
+ oqs_aes256_load_iv_u64_c(iv, _schedule),
+ oqs_aes256_load_iv_u64_ni(iv, _schedule),
+ (void) iv; (void) _schedule
+ );
+}
+
+static void AES256_free_schedule(void *schedule) {
+ C_OR_NI_OR_ARM(
+ oqs_aes256_free_schedule_c(schedule),
+ oqs_aes256_free_schedule_ni(schedule),
+ oqs_aes256_free_schedule_no_bitslice(schedule)
+ );
+}
+
+static void AES128_ECB_enc_sch(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext);
+
+static void AES128_ECB_enc(const uint8_t *plaintext, const size_t plaintext_len, const uint8_t *key, uint8_t *ciphertext) {
+ void *schedule = NULL;
+ AES128_ECB_load_schedule(key, &schedule);
+ AES128_ECB_enc_sch(plaintext, plaintext_len, schedule, ciphertext);
+ AES128_free_schedule(schedule);
+}
+
+static void AES128_ECB_enc_sch(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext) {
+ C_OR_NI_OR_ARM(
+ oqs_aes128_ecb_enc_sch_c(plaintext, plaintext_len, schedule, ciphertext),
+ oqs_aes128_ecb_enc_sch_ni(plaintext, plaintext_len, schedule, ciphertext),
+ oqs_aes128_ecb_enc_sch_armv8(plaintext, plaintext_len, schedule, ciphertext)
+ );
+}
+
+static void AES256_ECB_enc_sch(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext);
+
+static void AES256_ECB_enc(const uint8_t *plaintext, const size_t plaintext_len, const uint8_t *key, uint8_t *ciphertext) {
+ void *schedule = NULL;
+ AES256_ECB_load_schedule(key, &schedule);
+ AES256_ECB_enc_sch(plaintext, plaintext_len, schedule, ciphertext);
+ AES256_free_schedule(schedule);
+}
+
+static void AES256_ECB_enc_sch(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext) {
+ C_OR_NI_OR_ARM(
+ oqs_aes256_ecb_enc_sch_c(plaintext, plaintext_len, schedule, ciphertext),
+ oqs_aes256_ecb_enc_sch_ni(plaintext, plaintext_len, schedule, ciphertext),
+ oqs_aes256_ecb_enc_sch_armv8(plaintext, plaintext_len, schedule, ciphertext)
+ );
+}
+
+static void AES256_CTR_inc_stream_iv(const uint8_t *iv, const size_t iv_len, const void *schedule, uint8_t *out, size_t out_len) {
+ C_OR_NI_OR_ARM(
+ oqs_aes256_ctr_enc_sch_c(iv, iv_len, schedule, out, out_len),
+ oqs_aes256_ctr_enc_sch_ni(iv, iv_len, schedule, out, out_len),
+ oqs_aes256_ctr_enc_sch_armv8(iv, iv_len, schedule, out, out_len)
+ );
+}
+
+static void AES256_CTR_inc_stream_blks(void *schedule, uint8_t *out, size_t out_blks) {
+ C_OR_NI_OR_ARM(
+ oqs_aes256_ctr_enc_sch_upd_blks_c(schedule, out, out_blks),
+ oqs_aes256_ctr_enc_sch_upd_blks_ni(schedule, out, out_blks),
+ oqs_aes256_ctr_enc_sch_upd_blks_armv8(schedule, out, out_blks)
+ );
+}
+
+struct OQS_AES_callbacks aes_default_callbacks = {
+ AES128_ECB_load_schedule,
+ AES128_free_schedule,
+ AES128_ECB_enc,
+ AES128_ECB_enc_sch,
+ AES256_ECB_load_schedule,
+ AES256_CTR_inc_init,
+ AES256_CTR_inc_iv,
+ AES256_CTR_inc_ivu64,
+ AES256_free_schedule,
+ AES256_ECB_enc,
+ AES256_ECB_enc_sch,
+ AES256_CTR_inc_stream_iv,
+ AES256_CTR_inc_stream_blks,
+};
+
+void OQS_AES_init(void) {
+}
diff --git a/src/common/aes/aes_local.h b/src/common/aes/aes_local.h
index eac87935..4c9942a0 100644
--- a/src/common/aes/aes_local.h
+++ b/src/common/aes/aes_local.h
@@ -40,3 +40,5 @@ void oqs_aes256_enc_sch_block_armv8(const uint8_t *plaintext, const void *_sched
void oqs_aes256_ecb_enc_sch_armv8(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext);
void oqs_aes256_ctr_enc_sch_armv8(const uint8_t *iv, const size_t iv_len, const void *schedule, uint8_t *out, size_t out_len);
void oqs_aes256_ctr_enc_sch_upd_blks_armv8(void *schedule, uint8_t *out, size_t out_blks);
+
+extern struct OQS_AES_callbacks aes_default_callbacks;
diff --git a/src/common/aes/aes_ossl.c b/src/common/aes/aes_ossl.c
index 67193292..feaff395 100644
--- a/src/common/aes/aes_ossl.c
+++ b/src/common/aes/aes_ossl.c
@@ -7,7 +7,6 @@
#include "aes.h"
-#include <openssl/evp.h>
#include "../ossl_helpers.h"
struct key_schedule {
@@ -28,60 +27,60 @@ static inline void br_enc64be(unsigned char *dst, uint64_t x) {
dst[0] = (unsigned char)x;
}
-void OQS_AES128_ECB_load_schedule(const uint8_t *key, void **schedule) {
+static void AES128_ECB_load_schedule(const uint8_t *key, void **schedule) {
*schedule = malloc(sizeof(struct key_schedule));
OQS_EXIT_IF_NULLPTR(*schedule, "OpenSSL");
struct key_schedule *ks = (struct key_schedule *) *schedule;
ks->for_ECB = 1;
- ks->ctx = EVP_CIPHER_CTX_new();
+ ks->ctx = OSSL_FUNC(EVP_CIPHER_CTX_new)();
OQS_EXIT_IF_NULLPTR(ks->ctx, "OpenSSL");
- OQS_OPENSSL_GUARD(EVP_EncryptInit_ex(ks->ctx, oqs_aes_128_ecb(), NULL, key, NULL));
- EVP_CIPHER_CTX_set_padding(ks->ctx, 0);
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_EncryptInit_ex)(ks->ctx, oqs_aes_128_ecb(), NULL, key, NULL));
+ OSSL_FUNC(EVP_CIPHER_CTX_set_padding)(ks->ctx, 0);
}
-void OQS_AES128_free_schedule(void *schedule) {
+static void AES128_free_schedule(void *schedule) {
if (schedule != NULL) {
struct key_schedule *ks = (struct key_schedule *) schedule;
if (ks->ctx != NULL) {
- EVP_CIPHER_CTX_free(ks->ctx);
+ OSSL_FUNC(EVP_CIPHER_CTX_free)(ks->ctx);
}
OQS_MEM_cleanse(ks->key, 32);
OQS_MEM_secure_free(schedule, sizeof(struct key_schedule));
}
}
-void OQS_AES128_ECB_enc(const uint8_t *plaintext, const size_t plaintext_len, const uint8_t *key, uint8_t *ciphertext) {
+static void AES128_ECB_enc(const uint8_t *plaintext, const size_t plaintext_len, const uint8_t *key, uint8_t *ciphertext) {
void *schedule = NULL;
OQS_AES128_ECB_load_schedule(key, &schedule);
OQS_AES128_ECB_enc_sch(plaintext, plaintext_len, schedule, ciphertext);
OQS_AES128_free_schedule(schedule);
}
-void OQS_AES128_ECB_enc_sch(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext) {
+static void AES128_ECB_enc_sch(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext) {
assert(plaintext_len % 16 == 0);
int outlen;
const struct key_schedule *ks = (const struct key_schedule *) schedule;
SIZE_T_TO_INT_OR_EXIT(plaintext_len, plaintext_len_int)
- OQS_OPENSSL_GUARD(EVP_EncryptUpdate(ks->ctx, ciphertext, &outlen, plaintext, plaintext_len_int));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_EncryptUpdate)(ks->ctx, ciphertext, &outlen, plaintext, plaintext_len_int));
assert(outlen == plaintext_len_int);
- OQS_OPENSSL_GUARD(EVP_EncryptFinal_ex(ks->ctx, ciphertext, &outlen));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_EncryptFinal_ex)(ks->ctx, ciphertext, &outlen));
}
-void OQS_AES256_ECB_load_schedule(const uint8_t *key, void **schedule) {
+static void AES256_ECB_load_schedule(const uint8_t *key, void **schedule) {
*schedule = malloc(sizeof(struct key_schedule));
OQS_EXIT_IF_NULLPTR(*schedule, "OpenSSL");
struct key_schedule *ks = (struct key_schedule *) *schedule;
ks->for_ECB = 1;
- ks->ctx = EVP_CIPHER_CTX_new();
+ ks->ctx = OSSL_FUNC(EVP_CIPHER_CTX_new)();
OQS_EXIT_IF_NULLPTR(ks->ctx, "OpenSSL");
- OQS_OPENSSL_GUARD(EVP_EncryptInit_ex(ks->ctx, oqs_aes_256_ecb(), NULL, key, NULL));
- EVP_CIPHER_CTX_set_padding(ks->ctx, 0);
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_EncryptInit_ex)(ks->ctx, oqs_aes_256_ecb(), NULL, key, NULL));
+ OSSL_FUNC(EVP_CIPHER_CTX_set_padding)(ks->ctx, 0);
}
-void OQS_AES256_CTR_inc_init(const uint8_t *key, void **schedule) {
+static void AES256_CTR_inc_init(const uint8_t *key, void **schedule) {
*schedule = malloc(sizeof(struct key_schedule));
struct key_schedule *ks = (struct key_schedule *) *schedule;
- EVP_CIPHER_CTX *ctr_ctx = EVP_CIPHER_CTX_new();
+ EVP_CIPHER_CTX *ctr_ctx = OSSL_FUNC(EVP_CIPHER_CTX_new)();
assert(ctr_ctx != NULL);
OQS_EXIT_IF_NULLPTR(*schedule, "OpenSSL");
@@ -90,7 +89,7 @@ void OQS_AES256_CTR_inc_init(const uint8_t *key, void **schedule) {
memcpy(ks->key, key, 32);
}
-void OQS_AES256_CTR_inc_iv(const uint8_t *iv, size_t iv_len, void *schedule) {
+static void AES256_CTR_inc_iv(const uint8_t *iv, size_t iv_len, void *schedule) {
OQS_EXIT_IF_NULLPTR(schedule, "OpenSSL");
struct key_schedule *ks = (struct key_schedule *) schedule;
if (iv_len == 12) {
@@ -101,36 +100,36 @@ void OQS_AES256_CTR_inc_iv(const uint8_t *iv, size_t iv_len, void *schedule) {
} else {
exit(EXIT_FAILURE);
}
- OQS_OPENSSL_GUARD(EVP_EncryptInit_ex(ks->ctx, oqs_aes_256_ctr(), NULL, ks->key, ks->iv));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_EncryptInit_ex)(ks->ctx, oqs_aes_256_ctr(), NULL, ks->key, ks->iv));
}
-void OQS_AES256_CTR_inc_ivu64(uint64_t iv, void *schedule) {
+static void AES256_CTR_inc_ivu64(uint64_t iv, void *schedule) {
OQS_EXIT_IF_NULLPTR(schedule, "OpenSSL");
struct key_schedule *ks = (struct key_schedule *) schedule;
br_enc64be(ks->iv, iv);
memset(&ks->iv[8], 0, 8);
- OQS_OPENSSL_GUARD(EVP_EncryptInit_ex(ks->ctx, oqs_aes_256_ctr(), NULL, ks->key, ks->iv));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_EncryptInit_ex)(ks->ctx, oqs_aes_256_ctr(), NULL, ks->key, ks->iv));
}
-void OQS_AES256_free_schedule(void *schedule) {
+static void AES256_free_schedule(void *schedule) {
// actually same code as AES 128
OQS_AES128_free_schedule(schedule);
}
-void OQS_AES256_ECB_enc(const uint8_t *plaintext, const size_t plaintext_len, const uint8_t *key, uint8_t *ciphertext) {
+static void AES256_ECB_enc(const uint8_t *plaintext, const size_t plaintext_len, const uint8_t *key, uint8_t *ciphertext) {
void *schedule = NULL;
OQS_AES256_ECB_load_schedule(key, &schedule);
OQS_AES256_ECB_enc_sch(plaintext, plaintext_len, schedule, ciphertext);
OQS_AES256_free_schedule(schedule);
}
-void OQS_AES256_ECB_enc_sch(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext) {
+static void AES256_ECB_enc_sch(const uint8_t *plaintext, const size_t plaintext_len, const void *schedule, uint8_t *ciphertext) {
// actually same code as AES 128
OQS_AES128_ECB_enc_sch(plaintext, plaintext_len, schedule, ciphertext);
}
-void OQS_AES256_CTR_inc_stream_iv(const uint8_t *iv, size_t iv_len, const void *schedule, uint8_t *out, size_t out_len) {
- EVP_CIPHER_CTX *ctr_ctx = EVP_CIPHER_CTX_new();
+static void AES256_CTR_inc_stream_iv(const uint8_t *iv, size_t iv_len, const void *schedule, uint8_t *out, size_t out_len) {
+ EVP_CIPHER_CTX *ctr_ctx = OSSL_FUNC(EVP_CIPHER_CTX_new)();
assert(ctr_ctx != NULL);
uint8_t iv_ctr[16];
if (iv_len == 12) {
@@ -145,21 +144,37 @@ void OQS_AES256_CTR_inc_stream_iv(const uint8_t *iv, size_t iv_len, const void *
exit(EXIT_FAILURE);
}
const struct key_schedule *ks = (const struct key_schedule *) schedule;
- OQS_OPENSSL_GUARD(EVP_EncryptInit_ex(ctr_ctx, oqs_aes_256_ctr(), NULL, ks->key, iv_ctr));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_EncryptInit_ex)(ctr_ctx, oqs_aes_256_ctr(), NULL, ks->key, iv_ctr));
SIZE_T_TO_INT_OR_EXIT(out_len, out_len_input_int)
memset(out, 0, (size_t)out_len_input_int);
int out_len_output;
- OQS_OPENSSL_GUARD(EVP_EncryptUpdate(ctr_ctx, out, &out_len_output, out, out_len_input_int));
- OQS_OPENSSL_GUARD(EVP_EncryptFinal_ex(ctr_ctx, out + out_len_output, &out_len_output));
- EVP_CIPHER_CTX_free(ctr_ctx);
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_EncryptUpdate)(ctr_ctx, out, &out_len_output, out, out_len_input_int));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_EncryptFinal_ex)(ctr_ctx, out + out_len_output, &out_len_output));
+ OSSL_FUNC(EVP_CIPHER_CTX_free)(ctr_ctx);
}
-void OQS_AES256_CTR_inc_stream_blks(void *schedule, uint8_t *out, size_t out_blks) {
+static void AES256_CTR_inc_stream_blks(void *schedule, uint8_t *out, size_t out_blks) {
size_t out_len = out_blks * 16;
struct key_schedule *ks = (struct key_schedule *) schedule;
int out_len_output;
SIZE_T_TO_INT_OR_EXIT(out_len, out_len_input_int);
memset(out, 0, (size_t)out_len_input_int);
- OQS_OPENSSL_GUARD(EVP_EncryptUpdate(ks->ctx, out, &out_len_output, out, (int) out_len));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_EncryptUpdate)(ks->ctx, out, &out_len_output, out, (int) out_len));
}
+
+struct OQS_AES_callbacks aes_default_callbacks = {
+ AES128_ECB_load_schedule,
+ AES128_free_schedule,
+ AES128_ECB_enc,
+ AES128_ECB_enc_sch,
+ AES256_ECB_load_schedule,
+ AES256_CTR_inc_init,
+ AES256_CTR_inc_iv,
+ AES256_CTR_inc_ivu64,
+ AES256_free_schedule,
+ AES256_ECB_enc,
+ AES256_ECB_enc_sch,
+ AES256_CTR_inc_stream_iv,
+ AES256_CTR_inc_stream_blks,
+};
diff --git a/src/common/common.c b/src/common/common.c
index 9d6fc9f0..7de1e658 100644
--- a/src/common/common.c
+++ b/src/common/common.c
@@ -26,9 +26,7 @@
#endif
#if defined(OQS_USE_OPENSSL)
-#include <openssl/evp.h>
#include "ossl_helpers.h"
-CRYPTO_ONCE OQS_ONCE_STATIC_FREE;
#endif
/* Identifying the CPU is expensive so we cache the results in cpu_ext_data */
@@ -233,7 +231,6 @@ OQS_API void OQS_init(void) {
#if defined(OQS_DIST_BUILD)
OQS_CPU_has_extension(OQS_CPU_EXT_INIT);
#endif
- return;
}
OQS_API const char *OQS_version(void) {
@@ -242,9 +239,8 @@ OQS_API const char *OQS_version(void) {
OQS_API void OQS_destroy(void) {
#if defined(OQS_USE_OPENSSL)
- CRYPTO_THREAD_run_once(&OQS_ONCE_STATIC_FREE, oqs_free_ossl_objects);
+ oqs_ossl_destroy();
#endif
- return;
}
OQS_API int OQS_MEM_secure_bcmp(const void *a, const void *b, size_t len) {
diff --git a/src/common/ossl_functions.h b/src/common/ossl_functions.h
new file mode 100644
index 00000000..cece5c95
--- /dev/null
+++ b/src/common/ossl_functions.h
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: MIT
+
+// This file lists all OpenSSL functions used throughout the liboqs source code.
+//
+// Note that this file is included multiple times to generate custom
+// code by definining the FUNC macro, so no header guard should be
+// added here.
+
+VOID_FUNC(void, ERR_print_errors_fp, (FILE *fp), (fp))
+VOID_FUNC(void, EVP_CIPHER_CTX_free, (EVP_CIPHER_CTX *c), (c))
+FUNC(EVP_CIPHER_CTX *, EVP_CIPHER_CTX_new, (void), ())
+FUNC(int, EVP_CIPHER_CTX_set_padding, (EVP_CIPHER_CTX *c, int pad), (c, pad))
+FUNC(int, EVP_DigestFinalXOF, (EVP_MD_CTX *ctx, unsigned char *md, size_t len), (ctx, md, len))
+FUNC(int, EVP_DigestFinal_ex, (EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s), (ctx, md, s))
+FUNC(int, EVP_DigestInit_ex, (EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl), (ctx, type, impl))
+FUNC(int, EVP_DigestUpdate, (EVP_MD_CTX *ctx, const void *d, size_t cnt), (ctx, d, cnt))
+FUNC(int, EVP_EncryptFinal_ex, (EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl), (ctx, out, outl))
+FUNC(int, EVP_EncryptInit_ex, (EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl, const unsigned char *key, const unsigned char *iv),
+ (ctx, cipher, impl, key, iv))
+FUNC(int, EVP_EncryptUpdate, (EVP_CIPHER_CTX *ctx, unsigned char *out,
+ int *outl, const unsigned char *in, int inl),
+ (ctx, out, outl, in, inl))
+FUNC(int, EVP_MD_CTX_copy_ex, (EVP_MD_CTX *out, const EVP_MD_CTX *in), (out, in))
+VOID_FUNC(void, EVP_MD_CTX_free, (EVP_MD_CTX *ctx), (ctx))
+FUNC(EVP_MD_CTX *, EVP_MD_CTX_new, (void), ())
+FUNC(int, EVP_MD_CTX_reset, (EVP_MD_CTX *ctx), (ctx))
+FUNC(const EVP_CIPHER *, EVP_aes_128_ecb, (void), ())
+FUNC(const EVP_CIPHER *, EVP_aes_256_ecb, (void), ())
+FUNC(const EVP_CIPHER *, EVP_aes_256_ctr, (void), ())
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+FUNC(EVP_CIPHER *, EVP_CIPHER_fetch, (OSSL_LIB_CTX *ctx, const char *algorithm,
+ const char *properties),
+ (ctx, algorithm, properties))
+VOID_FUNC(void, EVP_CIPHER_free, (EVP_CIPHER *cipher), (cipher))
+FUNC(EVP_MD *, EVP_MD_fetch, (OSSL_LIB_CTX *ctx, const char *algorithm,
+ const char *properties),
+ (ctx, algorithm, properties))
+VOID_FUNC(void, EVP_MD_free, (EVP_MD *md), (md))
+#else
+FUNC(const EVP_MD *, EVP_sha256, (void), ())
+FUNC(const EVP_MD *, EVP_sha384, (void), ())
+FUNC(const EVP_MD *, EVP_sha3_256, (void), ())
+FUNC(const EVP_MD *, EVP_sha3_384, (void), ())
+FUNC(const EVP_MD *, EVP_sha3_512, (void), ())
+FUNC(const EVP_MD *, EVP_sha512, (void), ())
+FUNC(const EVP_MD *, EVP_shake128, (void), ())
+FUNC(const EVP_MD *, EVP_shake256, (void), ())
+#endif
+FUNC(int, RAND_bytes, (unsigned char *buf, int num), (buf, num))
+FUNC(int, RAND_poll, (void), ())
+FUNC(int, RAND_status, (void), ())
diff --git a/src/common/ossl_helpers.c b/src/common/ossl_helpers.c
index f52ceaef..1c73d8b9 100644
--- a/src/common/ossl_helpers.c
+++ b/src/common/ossl_helpers.c
@@ -1,33 +1,39 @@
// SPDX-License-Identifier: MIT
#include <oqs/oqs.h>
#if defined(OQS_USE_OPENSSL)
-#include <openssl/evp.h>
+#define OQS_OSSL_NO_EXTERN 1
#include "ossl_helpers.h"
+#include <assert.h>
+#include <dlfcn.h>
+
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if defined(OQS_USE_PTHREADS)
+#include <pthread.h>
+
+static pthread_once_t init_once_control = PTHREAD_ONCE_INIT;
+static pthread_once_t free_once_control = PTHREAD_ONCE_INIT;
+#endif
+
static EVP_MD *sha256_ptr, *sha384_ptr, *sha512_ptr,
*sha3_256_ptr, *sha3_384_ptr, *sha3_512_ptr,
*shake128_ptr, *shake256_ptr;
static EVP_CIPHER *aes128_ecb_ptr, *aes256_ecb_ptr, *aes256_ctr_ptr;
-#endif
-CRYPTO_ONCE OQS_ONCE_STATIC_INIT;
+static void fetch_ossl_objects(void) {
+ sha256_ptr = OSSL_FUNC(EVP_MD_fetch)(NULL, "SHA256", NULL);
+ sha384_ptr = OSSL_FUNC(EVP_MD_fetch)(NULL, "SHA384", NULL);
+ sha512_ptr = OSSL_FUNC(EVP_MD_fetch)(NULL, "SHA512", NULL);
-#if OPENSSL_VERSION_NUMBER >= 0x30000000L
-static void oqs_fetch_ossl_objects(void) {
- sha256_ptr = EVP_MD_fetch(NULL, "SHA256", NULL);
- sha384_ptr = EVP_MD_fetch(NULL, "SHA384", NULL);
- sha512_ptr = EVP_MD_fetch(NULL, "SHA512", NULL);
-
- sha3_256_ptr = EVP_MD_fetch(NULL, "SHA3-256", NULL);
- sha3_384_ptr = EVP_MD_fetch(NULL, "SHA3-384", NULL);
- sha3_512_ptr = EVP_MD_fetch(NULL, "SHA3-512", NULL);
- shake128_ptr = EVP_MD_fetch(NULL, "SHAKE128", NULL);
- shake256_ptr = EVP_MD_fetch(NULL, "SHAKE256", NULL);
+ sha3_256_ptr = OSSL_FUNC(EVP_MD_fetch)(NULL, "SHA3-256", NULL);
+ sha3_384_ptr = OSSL_FUNC(EVP_MD_fetch)(NULL, "SHA3-384", NULL);
+ sha3_512_ptr = OSSL_FUNC(EVP_MD_fetch)(NULL, "SHA3-512", NULL);
+ shake128_ptr = OSSL_FUNC(EVP_MD_fetch)(NULL, "SHAKE128", NULL);
+ shake256_ptr = OSSL_FUNC(EVP_MD_fetch)(NULL, "SHAKE256", NULL);
- aes128_ecb_ptr = EVP_CIPHER_fetch(NULL, "AES-128-ECB", NULL);
- aes256_ecb_ptr = EVP_CIPHER_fetch(NULL, "AES-256-ECB", NULL);
- aes256_ctr_ptr = EVP_CIPHER_fetch(NULL, "AES-256-CTR", NULL);
+ aes128_ecb_ptr = OSSL_FUNC(EVP_CIPHER_fetch)(NULL, "AES-128-ECB", NULL);
+ aes256_ecb_ptr = OSSL_FUNC(EVP_CIPHER_fetch)(NULL, "AES-256-ECB", NULL);
+ aes256_ctr_ptr = OSSL_FUNC(EVP_CIPHER_fetch)(NULL, "AES-256-CTR", NULL);
if (!sha256_ptr || !sha384_ptr || !sha512_ptr || !sha3_256_ptr ||
!sha3_384_ptr || !sha3_512_ptr || !shake128_ptr || !shake256_ptr ||
@@ -35,164 +41,314 @@ static void oqs_fetch_ossl_objects(void) {
fprintf(stderr, "liboqs warning: OpenSSL initialization failure. Is provider for SHA, SHAKE, AES enabled?\n");
}
}
-#endif
-void oqs_free_ossl_objects(void) {
+static void free_ossl_objects(void) {
+ OSSL_FUNC(EVP_MD_free)(sha256_ptr);
+ sha256_ptr = NULL;
+ OSSL_FUNC(EVP_MD_free)(sha384_ptr);
+ sha384_ptr = NULL;
+ OSSL_FUNC(EVP_MD_free)(sha512_ptr);
+ sha512_ptr = NULL;
+ OSSL_FUNC(EVP_MD_free)(sha3_256_ptr);
+ sha3_256_ptr = NULL;
+ OSSL_FUNC(EVP_MD_free)(sha3_384_ptr);
+ sha3_384_ptr = NULL;
+ OSSL_FUNC(EVP_MD_free)(sha3_512_ptr);
+ sha3_512_ptr = NULL;
+ OSSL_FUNC(EVP_MD_free)(shake128_ptr);
+ shake128_ptr = NULL;
+ OSSL_FUNC(EVP_MD_free)(shake256_ptr);
+ shake256_ptr = NULL;
+ OSSL_FUNC(EVP_CIPHER_free)(aes128_ecb_ptr);
+ aes128_ecb_ptr = NULL;
+ OSSL_FUNC(EVP_CIPHER_free)(aes256_ecb_ptr);
+ aes256_ecb_ptr = NULL;
+ OSSL_FUNC(EVP_CIPHER_free)(aes256_ctr_ptr);
+ aes256_ctr_ptr = NULL;
+}
+#endif // OPENSSL_VERSION_NUMBER >= 0x30000000L
+
+void oqs_ossl_destroy(void) {
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
- EVP_MD_free(sha256_ptr);
- EVP_MD_free(sha384_ptr);
- EVP_MD_free(sha512_ptr);
- EVP_MD_free(sha3_256_ptr);
- EVP_MD_free(sha3_384_ptr);
- EVP_MD_free(sha3_512_ptr);
- EVP_MD_free(shake128_ptr);
- EVP_MD_free(shake256_ptr);
- EVP_CIPHER_free(aes128_ecb_ptr);
- EVP_CIPHER_free(aes256_ecb_ptr);
- EVP_CIPHER_free(aes256_ctr_ptr);
+#if defined(OQS_USE_PTHREADS)
+ pthread_once(&free_once_control, free_ossl_objects);
+#else
+ if (sha256_ptr || sha384_ptr || sha512_ptr || sha3_256_ptr ||
+ sha3_384_ptr || sha3_512_ptr || shake128_ptr || shake256_ptr ||
+ aes128_ecb_ptr || aes256_ecb_ptr || aes256_ctr_ptr) {
+ free_ossl_objects();
+ }
+#endif
#endif
}
const EVP_MD *oqs_sha256(void) {
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if defined(OQS_USE_PTHREADS)
+ if (pthread_once(&init_once_control, fetch_ossl_objects)) {
+ return NULL;
+ }
+#else
if (!sha256_ptr) {
- if (!CRYPTO_THREAD_run_once(&OQS_ONCE_STATIC_INIT, oqs_fetch_ossl_objects)) {
- return NULL;
- }
+ fetch_ossl_objects();
}
+#endif
return sha256_ptr;
#else
- return EVP_sha256();
+ return OSSL_FUNC(EVP_sha256)();
#endif
}
const EVP_MD *oqs_sha384(void) {
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if defined(OQS_USE_PTHREADS)
+ if (pthread_once(&init_once_control, fetch_ossl_objects)) {
+ return NULL;
+ }
+#else
if (!sha384_ptr) {
- if (!CRYPTO_THREAD_run_once(&OQS_ONCE_STATIC_INIT, oqs_fetch_ossl_objects)) {
- return NULL;
- }
+ fetch_ossl_objects();
}
+#endif
return sha384_ptr;
#else
- return EVP_sha384();
+ return OSSL_FUNC(EVP_sha384)();
#endif
}
const EVP_MD *oqs_sha512(void) {
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if defined(OQS_USE_PTHREADS)
+ if (pthread_once(&init_once_control, fetch_ossl_objects)) {
+ return NULL;
+ }
+#else
if (!sha512_ptr) {
- if (!CRYPTO_THREAD_run_once(&OQS_ONCE_STATIC_INIT, oqs_fetch_ossl_objects)) {
- return NULL;
- }
+ fetch_ossl_objects();
}
+#endif
return sha512_ptr;
#else
- return EVP_sha512();
+ return OSSL_FUNC(EVP_sha512)();
#endif
}
const EVP_MD *oqs_shake128(void) {
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if defined(OQS_USE_PTHREADS)
+ if (pthread_once(&init_once_control, fetch_ossl_objects)) {
+ return NULL;
+ }
+#else
if (!shake128_ptr) {
- if (!CRYPTO_THREAD_run_once(&OQS_ONCE_STATIC_INIT, oqs_fetch_ossl_objects)) {
- return NULL;
- }
+ fetch_ossl_objects();
}
+#endif
return shake128_ptr;
#else
- return EVP_shake128();
+ return OSSL_FUNC(EVP_shake128)();
#endif
}
const EVP_MD *oqs_shake256(void) {
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if defined(OQS_USE_PTHREADS)
+ if (pthread_once(&init_once_control, fetch_ossl_objects)) {
+ return NULL;
+ }
+#else
if (!shake256_ptr) {
- if (!CRYPTO_THREAD_run_once(&OQS_ONCE_STATIC_INIT, oqs_fetch_ossl_objects)) {
- return NULL;
- }
+ fetch_ossl_objects();
}
+#endif
return shake256_ptr;
#else
- return EVP_shake256();
+ return OSSL_FUNC(EVP_shake256)();
#endif
}
const EVP_MD *oqs_sha3_256(void) {
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if defined(OQS_USE_PTHREADS)
+ if (pthread_once(&init_once_control, fetch_ossl_objects)) {
+ return NULL;
+ }
+#else
if (!sha3_256_ptr) {
- if (!CRYPTO_THREAD_run_once(&OQS_ONCE_STATIC_INIT, oqs_fetch_ossl_objects)) {
- return NULL;
- }
+ fetch_ossl_objects();
}
+#endif
return sha3_256_ptr;
#else
- return EVP_sha3_256();
+ return OSSL_FUNC(EVP_sha3_256)();
#endif
}
const EVP_MD *oqs_sha3_384(void) {
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if defined(OQS_USE_PTHREADS)
+ if (pthread_once(&init_once_control, fetch_ossl_objects)) {
+ return NULL;
+ }
+#else
if (!sha3_384_ptr) {
- if (!CRYPTO_THREAD_run_once(&OQS_ONCE_STATIC_INIT, oqs_fetch_ossl_objects)) {
- return NULL;
- }
+ fetch_ossl_objects();
}
+#endif
return sha3_384_ptr;
#else
- return EVP_sha3_384();
+ return OSSL_FUNC(EVP_sha3_384)();
#endif
}
const EVP_MD *oqs_sha3_512(void) {
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if defined(OQS_USE_PTHREADS)
+ if (pthread_once(&init_once_control, fetch_ossl_objects)) {
+ return NULL;
+ }
+#else
if (!sha3_512_ptr) {
- if (!CRYPTO_THREAD_run_once(&OQS_ONCE_STATIC_INIT, oqs_fetch_ossl_objects)) {
- return NULL;
- }
+ fetch_ossl_objects();
}
+#endif
return sha3_512_ptr;
#else
- return EVP_sha3_512();
+ return OSSL_FUNC(EVP_sha3_512)();
#endif
}
const EVP_CIPHER *oqs_aes_128_ecb(void) {
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if defined(OQS_USE_PTHREADS)
+ if (pthread_once(&init_once_control, fetch_ossl_objects)) {
+ return NULL;
+ }
+#else
if (!aes128_ecb_ptr) {
- if (!CRYPTO_THREAD_run_once(&OQS_ONCE_STATIC_INIT, oqs_fetch_ossl_objects)) {
- return NULL;
- }
+ fetch_ossl_objects();
}
+#endif
return aes128_ecb_ptr;
#else
- return EVP_aes_128_ecb();
+ return OSSL_FUNC(EVP_aes_128_ecb)();
#endif
}
const EVP_CIPHER *oqs_aes_256_ecb(void) {
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if defined(OQS_USE_PTHREADS)
+ if (pthread_once(&init_once_control, fetch_ossl_objects)) {
+ return NULL;
+ }
+#else
if (!aes256_ecb_ptr) {
- if (!CRYPTO_THREAD_run_once(&OQS_ONCE_STATIC_INIT, oqs_fetch_ossl_objects)) {
- return NULL;
- }
+ fetch_ossl_objects();
}
+#endif
return aes256_ecb_ptr;
#else
- return EVP_aes_256_ecb();
+ return OSSL_FUNC(EVP_aes_256_ecb)();
#endif
}
const EVP_CIPHER *oqs_aes_256_ctr(void) {
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if defined(OQS_USE_PTHREADS)
+ if (pthread_once(&init_once_control, fetch_ossl_objects)) {
+ return NULL;
+ }
+#else
if (!aes256_ctr_ptr) {
- if (!CRYPTO_THREAD_run_once(&OQS_ONCE_STATIC_INIT, oqs_fetch_ossl_objects)) {
- return NULL;
- }
+ fetch_ossl_objects();
}
+#endif
return aes256_ctr_ptr;
#else
- return EVP_aes_256_ctr();
+ return OSSL_FUNC(EVP_aes_256_ctr)();
+#endif
+}
+
+#if defined(OQS_DLOPEN_OPENSSL)
+
+static void *libcrypto_dlhandle;
+
+static void ensure_library(void);
+
+#if defined(OQS_USE_PTHREADS)
+static pthread_once_t dlopen_once_control = PTHREAD_ONCE_INIT;
+
+#define ENSURE_LIBRARY pthread_once(&dlopen_once_control, ensure_library)
+#else
+#define ENSURE_LIBRARY do { \
+ if (!libcrypto_dlhandle) { \
+ ensure_library(); \
+ } \
+ } while (0)
+#endif // OQS_USE_PTHREADS
+
+/* Define redirection symbols */
+#if (2 <= __GNUC__ || (4 <= __clang_major__))
+#define FUNC(ret, name, args, cargs) \
+ static __typeof__(name)(*_oqs_ossl_sym_##name);
+#else
+#define FUNC(ret, name, args, cargs) \
+ static ret(*_oqs_ossl_sym_##name)args;
#endif
+#define VOID_FUNC FUNC
+#include "ossl_functions.h"
+#undef VOID_FUNC
+#undef FUNC
+
+/* Define redirection wrapper functions */
+#define FUNC(ret, name, args, cargs) \
+ret _oqs_ossl_##name args \
+{ \
+ ENSURE_LIBRARY; \
+ assert(_oqs_ossl_sym_##name); \
+ return _oqs_ossl_sym_##name cargs; \
+}
+#define VOID_FUNC(ret, name, args, cargs) \
+ret _oqs_ossl_##name args \
+{ \
+ ENSURE_LIBRARY; \
+ assert(_oqs_ossl_sym_##name); \
+ _oqs_ossl_sym_##name cargs; \
+}
+#include "ossl_functions.h"
+#undef VOID_FUNC
+#undef FUNC
+
+static void ensure_symbol(const char *name, void **symp) {
+ if (!*symp) {
+ void *sym = dlsym(libcrypto_dlhandle, name);
+ if (!sym) {
+ exit(EXIT_FAILURE);
+ }
+ *symp = sym;
+ }
+}
+
+static void ensure_library(void) {
+ if (!libcrypto_dlhandle) {
+ libcrypto_dlhandle = dlopen(OQS_OPENSSL_CRYPTO_SONAME,
+ RTLD_LAZY | RTLD_LOCAL);
+ if (!libcrypto_dlhandle) {
+ exit(EXIT_FAILURE);
+ }
+ }
+
+#define ENSURE_SYMBOL(name) \
+ ensure_symbol(#name, (void **)&_oqs_ossl_sym_##name)
+#define FUNC(ret, name, args, cargs) \
+ ENSURE_SYMBOL(name);
+#define VOID_FUNC FUNC
+#include "ossl_functions.h"
+#undef VOID_FUNC
+#undef FUNC
+#undef ENSURE_SYMBOL
}
+
+#endif // OQS_DLOPEN_OPENSSL
+
#endif
diff --git a/src/common/ossl_helpers.h b/src/common/ossl_helpers.h
index fd7b0dde..fe6d3468 100644
--- a/src/common/ossl_helpers.h
+++ b/src/common/ossl_helpers.h
@@ -6,8 +6,12 @@
extern "C" {
#endif
+#include <openssl/err.h>
+#include <openssl/evp.h>
+#include <openssl/rand.h>
+
#if defined(OQS_USE_OPENSSL)
-void oqs_free_ossl_objects(void);
+void oqs_ossl_destroy(void);
const EVP_MD *oqs_sha256(void);
@@ -30,6 +34,24 @@ const EVP_CIPHER *oqs_aes_128_ecb(void);
const EVP_CIPHER *oqs_aes_256_ecb(void);
const EVP_CIPHER *oqs_aes_256_ctr(void);
+
+#ifdef OQS_DLOPEN_OPENSSL
+
+#define FUNC(ret, name, args, cargs) \
+ ret _oqs_ossl_##name args;
+#define VOID_FUNC FUNC
+#include "ossl_functions.h"
+#undef VOID_FUNC
+#undef FUNC
+
+#define OSSL_FUNC(name) _oqs_ossl_##name
+
+#else
+
+#define OSSL_FUNC(name) name
+
+#endif
+
#endif
#if defined(__cplusplus)
diff --git a/src/common/rand/rand.c b/src/common/rand/rand.c
index b48d8030..5ff7efe0 100644
--- a/src/common/rand/rand.c
+++ b/src/common/rand/rand.c
@@ -23,7 +23,7 @@ void OQS_randombytes_openssl(uint8_t *random_array, size_t bytes_to_read);
#endif
#ifdef OQS_USE_OPENSSL
-#include <openssl/rand.h>
+#include "../ossl_helpers.h"
// Use OpenSSL's RAND_bytes as the default PRNG
static void (*oqs_randombytes_algorithm)(uint8_t *, size_t) = &OQS_randombytes_openssl;
#else
@@ -113,12 +113,12 @@ void OQS_randombytes_openssl(uint8_t *random_array, size_t bytes_to_read) {
int rep = OQS_RAND_POLL_RETRY;
SIZE_T_TO_INT_OR_EXIT(bytes_to_read, bytes_to_read_int)
do {
- if (RAND_status() == 1) {
+ if (OSSL_FUNC(RAND_status)() == 1) {
break;
}
- RAND_poll();
+ OSSL_FUNC(RAND_poll)();
} while (rep-- >= 0);
- if (RAND_bytes(random_array, bytes_to_read_int) != 1) {
+ if (OSSL_FUNC(RAND_bytes)(random_array, bytes_to_read_int) != 1) {
fprintf(stderr, "No OpenSSL randomness retrieved. DRBG available?\n");
// because of void signature we have no other way to signal the problem
// we cannot possibly return without randomness
diff --git a/src/common/rand/rand_nist.c b/src/common/rand/rand_nist.c
index 5e74b45b..6270a31c 100644
--- a/src/common/rand/rand_nist.c
+++ b/src/common/rand/rand_nist.c
@@ -22,9 +22,6 @@ You are solely responsible for determining the appropriateness of using and dist
#include <oqs/rand_nist.h>
#ifdef OQS_USE_OPENSSL
-#include <openssl/conf.h>
-#include <openssl/evp.h>
-#include <openssl/err.h>
#include "../ossl_helpers.h"
#else
#include <oqs/aes.h>
@@ -42,7 +39,7 @@ __declspec(noreturn)
__attribute__((noreturn))
# endif
static void handleErrors(void) {
- ERR_print_errors_fp(stderr);
+ OSSL_FUNC(ERR_print_errors_fp)(stderr);
abort();
}
#endif
@@ -58,20 +55,20 @@ static void AES256_ECB(unsigned char *key, unsigned char *ctr, unsigned char *bu
int len;
/* Create and initialise the context */
- if (!(ctx = EVP_CIPHER_CTX_new())) {
+ if (!(ctx = OSSL_FUNC(EVP_CIPHER_CTX_new)())) {
handleErrors();
}
- if (1 != EVP_EncryptInit_ex(ctx, oqs_aes_256_ecb(), NULL, key, NULL)) {
+ if (1 != OSSL_FUNC(EVP_EncryptInit_ex)(ctx, oqs_aes_256_ecb(), NULL, key, NULL)) {
handleErrors();
}
- if (1 != EVP_EncryptUpdate(ctx, buffer, &len, ctr, 16)) {
+ if (1 != OSSL_FUNC(EVP_EncryptUpdate)(ctx, buffer, &len, ctr, 16)) {
handleErrors();
}
/* Clean up */
- EVP_CIPHER_CTX_free(ctx);
+ OSSL_FUNC(EVP_CIPHER_CTX_free)(ctx);
#else
void *schedule = NULL;
OQS_AES256_ECB_load_schedule(key, &schedule);
diff --git a/src/common/sha2/sha2.c b/src/common/sha2/sha2.c
index d622b883..9cc732d1 100644
--- a/src/common/sha2/sha2.c
+++ b/src/common/sha2/sha2.c
@@ -1,132 +1,84 @@
// SPDX-License-Identifier: MIT
#include <stdio.h>
-#include <oqs/common.h>
-
#include "sha2.h"
#include "sha2_local.h"
-#if defined(OQS_DIST_ARM64_V8_BUILD)
-#define C_OR_ARM(stmt_c, stmt_arm) \
- do { \
- if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_SHA2)) { \
- stmt_arm; \
- } else { \
- stmt_c; \
- } \
- } while(0)
-#elif defined(OQS_USE_ARM_SHA2_INSTRUCTIONS)
-#define C_OR_ARM(stmt_c, stmt_arm) \
- stmt_arm
-#else
-#define C_OR_ARM(stmt_c, stmt_arm) \
- stmt_c
-#endif
-void OQS_SHA2_sha224_inc_init(OQS_SHA2_sha224_ctx *state) {
- oqs_sha2_sha224_inc_init_c((sha224ctx *) state);
-}
-
-void OQS_SHA2_sha224_inc_ctx_clone(OQS_SHA2_sha224_ctx *dest, const OQS_SHA2_sha224_ctx *src) {
- oqs_sha2_sha224_inc_ctx_clone_c((sha224ctx *) dest, (const sha224ctx *) src);
-}
-
-void OQS_SHA2_sha224_inc_blocks(OQS_SHA2_sha224_ctx *state, const uint8_t *in, size_t inblocks) {
- C_OR_ARM(
- oqs_sha2_sha224_inc_blocks_c((sha224ctx *) state, in, inblocks),
- oqs_sha2_sha224_inc_blocks_armv8((sha224ctx *) state, in, inblocks)
- );
-}
-
-void OQS_SHA2_sha224_inc_finalize(uint8_t *out, OQS_SHA2_sha224_ctx *state, const uint8_t *in, size_t inlen) {
- oqs_sha2_sha224_inc_finalize_c(out, (sha224ctx *) state, in, inlen);
-}
+static struct OQS_SHA2_callbacks *callbacks = &sha2_default_callbacks;
-void OQS_SHA2_sha224_inc_ctx_release(OQS_SHA2_sha224_ctx *state) {
- oqs_sha2_sha224_inc_ctx_release_c((sha224ctx *) state);
+OQS_API void OQS_SHA2_set_callbacks(struct OQS_SHA2_callbacks *new_callbacks) {
+ callbacks = new_callbacks;
}
void OQS_SHA2_sha256_inc_init(OQS_SHA2_sha256_ctx *state) {
- oqs_sha2_sha256_inc_init_c((sha256ctx *) state);
+ callbacks->SHA2_sha256_inc_init(state);
}
void OQS_SHA2_sha256_inc_ctx_clone(OQS_SHA2_sha256_ctx *dest, const OQS_SHA2_sha256_ctx *src) {
- oqs_sha2_sha256_inc_ctx_clone_c((sha256ctx *) dest, (const sha256ctx *) src);
+ callbacks->SHA2_sha256_inc_ctx_clone(dest, src);
}
void OQS_SHA2_sha256_inc_blocks(OQS_SHA2_sha256_ctx *state, const uint8_t *in, size_t inblocks) {
- C_OR_ARM(
- oqs_sha2_sha256_inc_blocks_c((sha256ctx *) state, in, inblocks),
- oqs_sha2_sha256_inc_blocks_armv8((sha256ctx *) state, in, inblocks)
- );
+ callbacks->SHA2_sha256_inc_blocks(state, in, inblocks);
}
void OQS_SHA2_sha256_inc_finalize(uint8_t *out, OQS_SHA2_sha256_ctx *state, const uint8_t *in, size_t inlen) {
- oqs_sha2_sha256_inc_finalize_c(out, (sha256ctx *) state, in, inlen);
+ callbacks->SHA2_sha256_inc_finalize(out, state, in, inlen);
}
void OQS_SHA2_sha256_inc_ctx_release(OQS_SHA2_sha256_ctx *state) {
- oqs_sha2_sha256_inc_ctx_release_c((sha256ctx *) state);
+ callbacks->SHA2_sha256_inc_ctx_release(state);
}
void OQS_SHA2_sha384_inc_init(OQS_SHA2_sha384_ctx *state) {
- oqs_sha2_sha384_inc_init_c((sha384ctx *)state);
+ callbacks->SHA2_sha384_inc_init(state);
}
void OQS_SHA2_sha384_inc_ctx_clone(OQS_SHA2_sha384_ctx *dest, const OQS_SHA2_sha384_ctx *src) {
- oqs_sha2_sha384_inc_ctx_clone_c((sha384ctx *) dest, (const sha384ctx *) src);
+ callbacks->SHA2_sha384_inc_ctx_clone(dest, src);
}
void OQS_SHA2_sha384_inc_blocks(OQS_SHA2_sha384_ctx *state, const uint8_t *in, size_t inblocks) {
- oqs_sha2_sha384_inc_blocks_c((sha384ctx *) state, in, inblocks);
+ callbacks->SHA2_sha384_inc_blocks(state, in, inblocks);
}
void OQS_SHA2_sha384_inc_finalize(uint8_t *out, OQS_SHA2_sha384_ctx *state, const uint8_t *in, size_t inlen) {
- oqs_sha2_sha384_inc_finalize_c(out, (sha384ctx *) state, in, inlen);
+ callbacks->SHA2_sha384_inc_finalize(out, state, in, inlen);
}
void OQS_SHA2_sha384_inc_ctx_release(OQS_SHA2_sha384_ctx *state) {
- oqs_sha2_sha384_inc_ctx_release_c((sha384ctx *) state);
+ callbacks->SHA2_sha384_inc_ctx_release(state);
}
void OQS_SHA2_sha512_inc_init(OQS_SHA2_sha512_ctx *state) {
- oqs_sha2_sha512_inc_init_c((sha512ctx *)state);
+ callbacks->SHA2_sha512_inc_init(state);
}
void OQS_SHA2_sha512_inc_ctx_clone(OQS_SHA2_sha512_ctx *dest, const OQS_SHA2_sha512_ctx *src) {
- oqs_sha2_sha512_inc_ctx_clone_c((sha512ctx *) dest, (const sha512ctx *) src);
+ callbacks->SHA2_sha512_inc_ctx_clone(dest, src);
}
void OQS_SHA2_sha512_inc_blocks(OQS_SHA2_sha512_ctx *state, const uint8_t *in, size_t inblocks) {
- oqs_sha2_sha512_inc_blocks_c((sha512ctx *) state, in, inblocks);
+ callbacks->SHA2_sha512_inc_blocks(state, in, inblocks);
}
void OQS_SHA2_sha512_inc_finalize(uint8_t *out, OQS_SHA2_sha512_ctx *state, const uint8_t *in, size_t inlen) {
- oqs_sha2_sha512_inc_finalize_c(out, (sha512ctx *) state, in, inlen);
+ callbacks->SHA2_sha512_inc_finalize(out, state, in, inlen);
}
void OQS_SHA2_sha512_inc_ctx_release(OQS_SHA2_sha512_ctx *state) {
- oqs_sha2_sha512_inc_ctx_release_c((sha512ctx *) state);
-}
-
-void OQS_SHA2_sha224(uint8_t *out, const uint8_t *in, size_t inlen) {
- C_OR_ARM (
- oqs_sha2_sha224_c(out, in, inlen),
- oqs_sha2_sha224_armv8(out, in, inlen)
- );
+ callbacks->SHA2_sha512_inc_ctx_release(state);
}
void OQS_SHA2_sha256(uint8_t *out, const uint8_t *in, size_t inlen) {
- C_OR_ARM (
- oqs_sha2_sha256_c(out, in, inlen),
- oqs_sha2_sha256_armv8(out, in, inlen)
- );
+ callbacks->SHA2_sha256(out, in, inlen);
}
void OQS_SHA2_sha384(uint8_t *out, const uint8_t *in, size_t inlen) {
- oqs_sha2_sha384_c(out, in, inlen);
+ callbacks->SHA2_sha384(out, in, inlen);
}
void OQS_SHA2_sha512(uint8_t *out, const uint8_t *in, size_t inlen) {
- oqs_sha2_sha512_c(out, in, inlen);
+ callbacks->SHA2_sha512(out, in, inlen);
}
diff --git a/src/common/sha2/sha2.h b/src/common/sha2/sha2.h
index e50a1639..41562f8f 100644
--- a/src/common/sha2/sha2.h
+++ b/src/common/sha2/sha2.h
@@ -18,16 +18,12 @@
#include <stddef.h>
#include <stdint.h>
+#include <oqs/common.h>
+
#if defined(__cplusplus)
extern "C" {
#endif
-/** Data structure for the state of the SHA-224 incremental hashing API. */
-typedef struct {
- /** Internal state */
- void *ctx;
-} OQS_SHA2_sha224_ctx;
-
/**
* \brief Process a message with SHA-256 and return the hash code in the output byte array.
*
@@ -250,6 +246,111 @@ void OQS_SHA2_sha512_inc_finalize(uint8_t *out, OQS_SHA2_sha512_ctx *state, cons
*/
void OQS_SHA2_sha512_inc_ctx_release(OQS_SHA2_sha512_ctx *state);
+/** Data structure implemented by cryptographic provider for SHA-2 operations.
+ */
+struct OQS_SHA2_callbacks {
+ /**
+ * Implementation of function OQS_SHA2_sha256.
+ */
+ void (*SHA2_sha256)(uint8_t *output, const uint8_t *input, size_t inplen);
+
+ /**
+ * Implementation of function OQS_SHA2_sha256_inc_init.
+ */
+ void (*SHA2_sha256_inc_init)(OQS_SHA2_sha256_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA2_sha256_inc_ctx_clone.
+ */
+ void (*SHA2_sha256_inc_ctx_clone)(OQS_SHA2_sha256_ctx *dest, const OQS_SHA2_sha256_ctx *src);
+
+ /**
+ * Implementation of function OQS_SHA2_sha256_inc_blocks.
+ */
+ void (*SHA2_sha256_inc_blocks)(OQS_SHA2_sha256_ctx *state, const uint8_t *in, size_t inblocks);
+
+ /**
+ * Implementation of function OQS_SHA2_sha256_inc_finalize.
+ */
+ void (*SHA2_sha256_inc_finalize)(uint8_t *out, OQS_SHA2_sha256_ctx *state, const uint8_t *in, size_t inlen);
+
+ /**
+ * Implementation of function OQS_SHA2_sha256_inc_ctx_release.
+ */
+ void (*SHA2_sha256_inc_ctx_release)(OQS_SHA2_sha256_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA2_sha384.
+ */
+ void (*SHA2_sha384)(uint8_t *output, const uint8_t *input, size_t inplen);
+
+ /**
+ * Implementation of function OQS_SHA2_sha384_inc_init.
+ */
+ void (*SHA2_sha384_inc_init)(OQS_SHA2_sha384_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA2_sha384_inc_ctx_clone.
+ */
+ void (*SHA2_sha384_inc_ctx_clone)(OQS_SHA2_sha384_ctx *dest, const OQS_SHA2_sha384_ctx *src);
+
+ /**
+ * Implementation of function OQS_SHA2_sha384_inc_blocks.
+ */
+ void (*SHA2_sha384_inc_blocks)(OQS_SHA2_sha384_ctx *state, const uint8_t *in, size_t inblocks);
+
+ /**
+ * Implementation of function OQS_SHA2_sha384_inc_finalize.
+ */
+ void (*SHA2_sha384_inc_finalize)(uint8_t *out, OQS_SHA2_sha384_ctx *state, const uint8_t *in, size_t inlen);
+
+ /**
+ * Implementation of function OQS_SHA2_sha384_inc_ctx_release.
+ */
+ void (*SHA2_sha384_inc_ctx_release)(OQS_SHA2_sha384_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA2_sha512.
+ */
+ void (*SHA2_sha512)(uint8_t *output, const uint8_t *input, size_t inplen);
+
+ /**
+ * Implementation of function OQS_SHA2_sha512_inc_init.
+ */
+ void (*SHA2_sha512_inc_init)(OQS_SHA2_sha512_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA2_sha512_inc_ctx_clone.
+ */
+ void (*SHA2_sha512_inc_ctx_clone)(OQS_SHA2_sha512_ctx *dest, const OQS_SHA2_sha512_ctx *src);
+
+ /**
+ * Implementation of function OQS_SHA2_sha512_inc_blocks.
+ */
+ void (*SHA2_sha512_inc_blocks)(OQS_SHA2_sha512_ctx *state, const uint8_t *in, size_t inblocks);
+
+ /**
+ * Implementation of function OQS_SHA2_sha512_inc_finalize.
+ */
+ void (*SHA2_sha512_inc_finalize)(uint8_t *out, OQS_SHA2_sha512_ctx *state, const uint8_t *in, size_t inlen);
+
+ /**
+ * Implementation of function OQS_SHA2_sha512_inc_ctx_release.
+ */
+ void (*SHA2_sha512_inc_ctx_release)(OQS_SHA2_sha512_ctx *state);
+};
+
+/**
+ * Set callback functions for SHA2 operations.
+ *
+ * This function may be called before OQS_init to switch the
+ * cryptographic provider for SHA2 operations. If it is not called,
+ * the default provider determined at build time will be used.
+ *
+ * @param[in] new_callbacks Callback functions defined in OQS_SHA2_callbacks
+ */
+OQS_API void OQS_SHA2_set_callbacks(struct OQS_SHA2_callbacks *new_callbacks);
+
#if defined(__cplusplus)
} // extern "C"
#endif
diff --git a/src/common/sha2/sha2_impl.c b/src/common/sha2/sha2_impl.c
new file mode 100644
index 00000000..f7f01b24
--- /dev/null
+++ b/src/common/sha2/sha2_impl.c
@@ -0,0 +1,123 @@
+// SPDX-License-Identifier: MIT
+#include <stdio.h>
+
+#include <oqs/common.h>
+
+#include "sha2.h"
+#include "sha2_local.h"
+
+#if defined(OQS_DIST_ARM64_V8_BUILD)
+#define C_OR_ARM(stmt_c, stmt_arm) \
+ do { \
+ if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_SHA2)) { \
+ stmt_arm; \
+ } else { \
+ stmt_c; \
+ } \
+ } while(0)
+#elif defined(OQS_USE_ARM_SHA2_INSTRUCTIONS)
+#define C_OR_ARM(stmt_c, stmt_arm) \
+ stmt_arm
+#else
+#define C_OR_ARM(stmt_c, stmt_arm) \
+ stmt_c
+#endif
+
+static void SHA2_sha256_inc_init(OQS_SHA2_sha256_ctx *state) {
+ oqs_sha2_sha256_inc_init_c((sha256ctx *) state);
+}
+
+static void SHA2_sha256_inc_ctx_clone(OQS_SHA2_sha256_ctx *dest, const OQS_SHA2_sha256_ctx *src) {
+ oqs_sha2_sha256_inc_ctx_clone_c((sha256ctx *) dest, (const sha256ctx *) src);
+}
+
+static void SHA2_sha256_inc_blocks(OQS_SHA2_sha256_ctx *state, const uint8_t *in, size_t inblocks) {
+ C_OR_ARM(
+ oqs_sha2_sha256_inc_blocks_c((sha256ctx *) state, in, inblocks),
+ oqs_sha2_sha256_inc_blocks_armv8((sha256ctx *) state, in, inblocks)
+ );
+}
+
+static void SHA2_sha256_inc_finalize(uint8_t *out, OQS_SHA2_sha256_ctx *state, const uint8_t *in, size_t inlen) {
+ oqs_sha2_sha256_inc_finalize_c(out, (sha256ctx *) state, in, inlen);
+}
+
+static void SHA2_sha256_inc_ctx_release(OQS_SHA2_sha256_ctx *state) {
+ oqs_sha2_sha256_inc_ctx_release_c((sha256ctx *) state);
+}
+
+static void SHA2_sha384_inc_init(OQS_SHA2_sha384_ctx *state) {
+ oqs_sha2_sha384_inc_init_c((sha384ctx *)state);
+}
+
+static void SHA2_sha384_inc_ctx_clone(OQS_SHA2_sha384_ctx *dest, const OQS_SHA2_sha384_ctx *src) {
+ oqs_sha2_sha384_inc_ctx_clone_c((sha384ctx *) dest, (const sha384ctx *) src);
+}
+
+static void SHA2_sha384_inc_blocks(OQS_SHA2_sha384_ctx *state, const uint8_t *in, size_t inblocks) {
+ oqs_sha2_sha384_inc_blocks_c((sha384ctx *) state, in, inblocks);
+}
+
+static void SHA2_sha384_inc_finalize(uint8_t *out, OQS_SHA2_sha384_ctx *state, const uint8_t *in, size_t inlen) {
+ oqs_sha2_sha384_inc_finalize_c(out, (sha384ctx *) state, in, inlen);
+}
+
+static void SHA2_sha384_inc_ctx_release(OQS_SHA2_sha384_ctx *state) {
+ oqs_sha2_sha384_inc_ctx_release_c((sha384ctx *) state);
+}
+
+static void SHA2_sha512_inc_init(OQS_SHA2_sha512_ctx *state) {
+ oqs_sha2_sha512_inc_init_c((sha512ctx *)state);
+}
+
+static void SHA2_sha512_inc_ctx_clone(OQS_SHA2_sha512_ctx *dest, const OQS_SHA2_sha512_ctx *src) {
+ oqs_sha2_sha512_inc_ctx_clone_c((sha512ctx *) dest, (const sha512ctx *) src);
+}
+
+static void SHA2_sha512_inc_blocks(OQS_SHA2_sha512_ctx *state, const uint8_t *in, size_t inblocks) {
+ oqs_sha2_sha512_inc_blocks_c((sha512ctx *) state, in, inblocks);
+}
+
+static void SHA2_sha512_inc_finalize(uint8_t *out, OQS_SHA2_sha512_ctx *state, const uint8_t *in, size_t inlen) {
+ oqs_sha2_sha512_inc_finalize_c(out, (sha512ctx *) state, in, inlen);
+}
+
+static void SHA2_sha512_inc_ctx_release(OQS_SHA2_sha512_ctx *state) {
+ oqs_sha2_sha512_inc_ctx_release_c((sha512ctx *) state);
+}
+
+static void SHA2_sha256(uint8_t *out, const uint8_t *in, size_t inlen) {
+ C_OR_ARM (
+ oqs_sha2_sha256_c(out, in, inlen),
+ oqs_sha2_sha256_armv8(out, in, inlen)
+ );
+}
+
+static void SHA2_sha384(uint8_t *out, const uint8_t *in, size_t inlen) {
+ oqs_sha2_sha384_c(out, in, inlen);
+}
+
+static void SHA2_sha512(uint8_t *out, const uint8_t *in, size_t inlen) {
+ oqs_sha2_sha512_c(out, in, inlen);
+}
+
+struct OQS_SHA2_callbacks sha2_default_callbacks = {
+ SHA2_sha256,
+ SHA2_sha256_inc_init,
+ SHA2_sha256_inc_ctx_clone,
+ SHA2_sha256_inc_blocks,
+ SHA2_sha256_inc_finalize,
+ SHA2_sha256_inc_ctx_release,
+ SHA2_sha384,
+ SHA2_sha384_inc_init,
+ SHA2_sha384_inc_ctx_clone,
+ SHA2_sha384_inc_blocks,
+ SHA2_sha384_inc_finalize,
+ SHA2_sha384_inc_ctx_release,
+ SHA2_sha512,
+ SHA2_sha512_inc_init,
+ SHA2_sha512_inc_ctx_clone,
+ SHA2_sha512_inc_blocks,
+ SHA2_sha512_inc_finalize,
+ SHA2_sha512_inc_ctx_release,
+};
diff --git a/src/common/sha2/sha2_local.h b/src/common/sha2/sha2_local.h
index 028de764..dcb13928 100644
--- a/src/common/sha2/sha2_local.h
+++ b/src/common/sha2/sha2_local.h
@@ -79,6 +79,8 @@ void oqs_sha2_sha256_c(uint8_t *out, const uint8_t *in, size_t inlen);
void oqs_sha2_sha384_c(uint8_t *out, const uint8_t *in, size_t inlen);
void oqs_sha2_sha512_c(uint8_t *out, const uint8_t *in, size_t inlen);
+extern struct OQS_SHA2_callbacks sha2_default_callbacks;
+
#if defined(__cplusplus)
} // extern "C"
#endif
diff --git a/src/common/sha2/sha2_ossl.c b/src/common/sha2/sha2_ossl.c
index c94a07b7..0953feb1 100644
--- a/src/common/sha2/sha2_ossl.c
+++ b/src/common/sha2/sha2_ossl.c
@@ -11,35 +11,34 @@
#include "sha2.h"
-#include <openssl/evp.h>
#include "../ossl_helpers.h"
static void do_hash(uint8_t *output, const uint8_t *input, size_t inplen, const EVP_MD *md) {
EVP_MD_CTX *mdctx;
unsigned int outlen;
- mdctx = EVP_MD_CTX_new();
+ mdctx = OSSL_FUNC(EVP_MD_CTX_new)();
OQS_EXIT_IF_NULLPTR(mdctx, "OpenSSL");
- OQS_OPENSSL_GUARD(EVP_DigestInit_ex(mdctx, md, NULL));
- OQS_OPENSSL_GUARD(EVP_DigestUpdate(mdctx, input, inplen));
- OQS_OPENSSL_GUARD(EVP_DigestFinal_ex(mdctx, output, &outlen));
- EVP_MD_CTX_free(mdctx);
+ OSSL_FUNC(EVP_DigestInit_ex)(mdctx, md, NULL);
+ OSSL_FUNC(EVP_DigestUpdate)(mdctx, input, inplen);
+ OSSL_FUNC(EVP_DigestFinal_ex)(mdctx, output, &outlen);
+ OSSL_FUNC(EVP_MD_CTX_free)(mdctx);
}
-void OQS_SHA2_sha256(uint8_t *output, const uint8_t *input, size_t inplen) {
+static void SHA2_sha256(uint8_t *output, const uint8_t *input, size_t inplen) {
const EVP_MD *md;
md = oqs_sha256();
OQS_EXIT_IF_NULLPTR(md, "OpenSSL");
do_hash(output, input, inplen, md);
}
-void OQS_SHA2_sha384(uint8_t *output, const uint8_t *input, size_t inplen) {
+static void SHA2_sha384(uint8_t *output, const uint8_t *input, size_t inplen) {
const EVP_MD *md;
md = oqs_sha384();
OQS_EXIT_IF_NULLPTR(md, "OpenSSL");
do_hash(output, input, inplen, md);
}
-void OQS_SHA2_sha512(uint8_t *output, const uint8_t *input, size_t inplen) {
+static void SHA2_sha512(uint8_t *output, const uint8_t *input, size_t inplen) {
const EVP_MD *md;
md = oqs_sha512();
OQS_EXIT_IF_NULLPTR(md, "OpenSSL");
@@ -48,109 +47,127 @@ void OQS_SHA2_sha512(uint8_t *output, const uint8_t *input, size_t inplen) {
#define SHA2_BLOCK_SIZE 64
-void OQS_SHA2_sha256_inc_init(OQS_SHA2_sha256_ctx *state) {
+static void SHA2_sha256_inc_init(OQS_SHA2_sha256_ctx *state) {
EVP_MD_CTX *mdctx;
const EVP_MD *md = NULL;
md = oqs_sha256();
OQS_EXIT_IF_NULLPTR(md, "OpenSSL");
- mdctx = EVP_MD_CTX_new();
+ mdctx = OSSL_FUNC(EVP_MD_CTX_new)();
OQS_EXIT_IF_NULLPTR(mdctx, "OpenSSL");
- OQS_OPENSSL_GUARD(EVP_DigestInit_ex(mdctx, md, NULL));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_DigestInit_ex)(mdctx, md, NULL));
state->ctx = mdctx;
}
-void OQS_SHA2_sha256_inc_blocks(OQS_SHA2_sha256_ctx *state, const uint8_t *in, size_t inblocks) {
- OQS_OPENSSL_GUARD(EVP_DigestUpdate((EVP_MD_CTX *) state->ctx, in, inblocks * SHA2_BLOCK_SIZE));
+static void SHA2_sha256_inc_blocks(OQS_SHA2_sha256_ctx *state, const uint8_t *in, size_t inblocks) {
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_DigestUpdate)((EVP_MD_CTX *) state->ctx, in, inblocks * SHA2_BLOCK_SIZE));
}
-void OQS_SHA2_sha256_inc_finalize(uint8_t *out, OQS_SHA2_sha256_ctx *state, const uint8_t *in, size_t inlen) {
+static void SHA2_sha256_inc_finalize(uint8_t *out, OQS_SHA2_sha256_ctx *state, const uint8_t *in, size_t inlen) {
unsigned int md_len;
if (inlen > 0) {
- OQS_OPENSSL_GUARD(EVP_DigestUpdate((EVP_MD_CTX *) state->ctx, in, inlen));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_DigestUpdate)((EVP_MD_CTX *) state->ctx, in, inlen));
}
- OQS_OPENSSL_GUARD(EVP_DigestFinal_ex((EVP_MD_CTX *) state->ctx, out, &md_len));
- EVP_MD_CTX_free((EVP_MD_CTX *) state->ctx);
- state->ctx = NULL;
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_DigestFinal_ex)((EVP_MD_CTX *) state->ctx, out, &md_len));
+ OSSL_FUNC(EVP_MD_CTX_free)((EVP_MD_CTX *) state->ctx);
}
-void OQS_SHA2_sha256_inc_ctx_release(OQS_SHA2_sha256_ctx *state) {
- EVP_MD_CTX_destroy((EVP_MD_CTX *) state->ctx);
+static void SHA2_sha256_inc_ctx_release(OQS_SHA2_sha256_ctx *state) {
+ OSSL_FUNC(EVP_MD_CTX_free)((EVP_MD_CTX *) state->ctx);
state->ctx = NULL;
}
-void OQS_SHA2_sha256_inc_ctx_clone(OQS_SHA2_sha256_ctx *dest, const OQS_SHA2_sha256_ctx *src) {
- OQS_SHA2_sha256_inc_init(dest);
- OQS_OPENSSL_GUARD(EVP_MD_CTX_copy_ex((EVP_MD_CTX *) dest->ctx, (EVP_MD_CTX *) src->ctx));
+static void SHA2_sha256_inc_ctx_clone(OQS_SHA2_sha256_ctx *dest, const OQS_SHA2_sha256_ctx *src) {
+ SHA2_sha256_inc_init(dest);
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_MD_CTX_copy_ex)((EVP_MD_CTX *) dest->ctx, (EVP_MD_CTX *) src->ctx));
}
-void OQS_SHA2_sha384_inc_init(OQS_SHA2_sha384_ctx *state) {
+static void SHA2_sha384_inc_init(OQS_SHA2_sha384_ctx *state) {
EVP_MD_CTX *mdctx;
const EVP_MD *md = NULL;
md = oqs_sha384();
OQS_EXIT_IF_NULLPTR(md, "OpenSSL");
- mdctx = EVP_MD_CTX_new();
+ mdctx = OSSL_FUNC(EVP_MD_CTX_new)();
OQS_EXIT_IF_NULLPTR(mdctx, "OpenSSL");
- OQS_OPENSSL_GUARD(EVP_DigestInit_ex(mdctx, md, NULL));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_DigestInit_ex)(mdctx, md, NULL));
state->ctx = mdctx;
}
-void OQS_SHA2_sha384_inc_blocks(OQS_SHA2_sha384_ctx *state, const uint8_t *in, size_t inblocks) {
- OQS_OPENSSL_GUARD(EVP_DigestUpdate((EVP_MD_CTX *) state->ctx, in, inblocks * 2 * SHA2_BLOCK_SIZE));
+static void SHA2_sha384_inc_blocks(OQS_SHA2_sha384_ctx *state, const uint8_t *in, size_t inblocks) {
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_DigestUpdate)((EVP_MD_CTX *) state->ctx, in, inblocks * SHA2_BLOCK_SIZE));
}
-void OQS_SHA2_sha384_inc_finalize(uint8_t *out, OQS_SHA2_sha384_ctx *state, const uint8_t *in, size_t inlen) {
+static void SHA2_sha384_inc_finalize(uint8_t *out, OQS_SHA2_sha384_ctx *state, const uint8_t *in, size_t inlen) {
unsigned int md_len;
if (inlen > 0) {
- OQS_OPENSSL_GUARD(EVP_DigestUpdate((EVP_MD_CTX *) state->ctx, in, inlen));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_DigestUpdate)((EVP_MD_CTX *) state->ctx, in, inlen));
}
- OQS_OPENSSL_GUARD(EVP_DigestFinal_ex((EVP_MD_CTX *) state->ctx, out, &md_len));
- EVP_MD_CTX_free((EVP_MD_CTX *) state->ctx);
- state->ctx = NULL;
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_DigestFinal_ex)((EVP_MD_CTX *) state->ctx, out, &md_len));
+ OSSL_FUNC(EVP_MD_CTX_free)((EVP_MD_CTX *) state->ctx);
}
-void OQS_SHA2_sha384_inc_ctx_release(OQS_SHA2_sha384_ctx *state) {
- EVP_MD_CTX_destroy((EVP_MD_CTX *) state->ctx);
+static void SHA2_sha384_inc_ctx_release(OQS_SHA2_sha384_ctx *state) {
+ OSSL_FUNC(EVP_MD_CTX_free)((EVP_MD_CTX *) state->ctx);
state->ctx = NULL;
}
-void OQS_SHA2_sha384_inc_ctx_clone(OQS_SHA2_sha384_ctx *dest, const OQS_SHA2_sha384_ctx *src) {
- OQS_SHA2_sha384_inc_init(dest);
- OQS_OPENSSL_GUARD(EVP_MD_CTX_copy_ex((EVP_MD_CTX *) dest->ctx, (EVP_MD_CTX *) src->ctx));
+static void SHA2_sha384_inc_ctx_clone(OQS_SHA2_sha384_ctx *dest, const OQS_SHA2_sha384_ctx *src) {
+ SHA2_sha384_inc_init(dest);
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_MD_CTX_copy_ex)((EVP_MD_CTX *) dest->ctx, (EVP_MD_CTX *) src->ctx));
}
-void OQS_SHA2_sha512_inc_init(OQS_SHA2_sha512_ctx *state) {
+static void SHA2_sha512_inc_init(OQS_SHA2_sha512_ctx *state) {
EVP_MD_CTX *mdctx;
const EVP_MD *md = NULL;
md = oqs_sha512();
OQS_EXIT_IF_NULLPTR(md, "OpenSSL");
- mdctx = EVP_MD_CTX_new();
+ mdctx = OSSL_FUNC(EVP_MD_CTX_new)();
OQS_EXIT_IF_NULLPTR(mdctx, "OpenSSL");
- OQS_OPENSSL_GUARD(EVP_DigestInit_ex(mdctx, md, NULL));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_DigestInit_ex)(mdctx, md, NULL));
state->ctx = mdctx;
}
-void OQS_SHA2_sha512_inc_blocks(OQS_SHA2_sha512_ctx *state, const uint8_t *in, size_t inblocks) {
- OQS_OPENSSL_GUARD(EVP_DigestUpdate((EVP_MD_CTX *) state->ctx, in, inblocks * 2 * SHA2_BLOCK_SIZE));
+static void SHA2_sha512_inc_blocks(OQS_SHA2_sha512_ctx *state, const uint8_t *in, size_t inblocks) {
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_DigestUpdate)((EVP_MD_CTX *) state->ctx, in, inblocks * 2 * SHA2_BLOCK_SIZE));
}
-void OQS_SHA2_sha512_inc_finalize(uint8_t *out, OQS_SHA2_sha512_ctx *state, const uint8_t *in, size_t inlen) {
+static void SHA2_sha512_inc_finalize(uint8_t *out, OQS_SHA2_sha512_ctx *state, const uint8_t *in, size_t inlen) {
unsigned int md_len;
if (inlen > 0) {
- OQS_OPENSSL_GUARD(EVP_DigestUpdate((EVP_MD_CTX *) state->ctx, in, inlen));
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_DigestUpdate)((EVP_MD_CTX *) state->ctx, in, inlen));
}
- OQS_OPENSSL_GUARD(EVP_DigestFinal_ex((EVP_MD_CTX *) state->ctx, out, &md_len));
- EVP_MD_CTX_free((EVP_MD_CTX *) state->ctx);
- state->ctx = NULL;
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_DigestFinal_ex)((EVP_MD_CTX *) state->ctx, out, &md_len));
+ OSSL_FUNC(EVP_MD_CTX_free)((EVP_MD_CTX *) state->ctx);
}
-void OQS_SHA2_sha512_inc_ctx_release(OQS_SHA2_sha512_ctx *state) {
- EVP_MD_CTX_destroy((EVP_MD_CTX *) state->ctx);
+static void SHA2_sha512_inc_ctx_release(OQS_SHA2_sha512_ctx *state) {
+ OSSL_FUNC(EVP_MD_CTX_free)((EVP_MD_CTX *) state->ctx);
state->ctx = NULL;
}
-void OQS_SHA2_sha512_inc_ctx_clone(OQS_SHA2_sha512_ctx *dest, const OQS_SHA2_sha512_ctx *src) {
- OQS_SHA2_sha512_inc_init(dest);
- OQS_OPENSSL_GUARD(EVP_MD_CTX_copy_ex((EVP_MD_CTX *) dest->ctx, (EVP_MD_CTX *) src->ctx));
-}
+static void SHA2_sha512_inc_ctx_clone(OQS_SHA2_sha512_ctx *dest, const OQS_SHA2_sha512_ctx *src) {
+ SHA2_sha512_inc_init(dest);
+ OQS_OPENSSL_GUARD(OSSL_FUNC(EVP_MD_CTX_copy_ex)((EVP_MD_CTX *) dest->ctx, (EVP_MD_CTX *) src->ctx));
+}
+
+struct OQS_SHA2_callbacks sha2_default_callbacks = {
+ SHA2_sha256,
+ SHA2_sha256_inc_init,
+ SHA2_sha256_inc_ctx_clone,
+ SHA2_sha256_inc_blocks,
+ SHA2_sha256_inc_finalize,
+ SHA2_sha256_inc_ctx_release,
+ SHA2_sha384,
+ SHA2_sha384_inc_init,
+ SHA2_sha384_inc_ctx_clone,
+ SHA2_sha384_inc_blocks,
+ SHA2_sha384_inc_finalize,
+ SHA2_sha384_inc_ctx_release,
+ SHA2_sha512,
+ SHA2_sha512_inc_init,
+ SHA2_sha512_inc_ctx_clone,
+ SHA2_sha512_inc_blocks,
+ SHA2_sha512_inc_finalize,
+ SHA2_sha512_inc_ctx_release,
+};
#endif
diff --git a/src/common/sha3/ossl_sha3.c b/src/common/sha3/ossl_sha3.c
index 8b8678a2..de95fc39 100644
--- a/src/common/sha3/ossl_sha3.c
+++ b/src/common/sha3/ossl_sha3.c
@@ -11,136 +11,135 @@
#include "sha3.h"
-#include <openssl/evp.h>
#include "../ossl_helpers.h"
#include <string.h>
static void do_hash(uint8_t *output, const uint8_t *input, size_t inplen, const EVP_MD *md) {
EVP_MD_CTX *mdctx;
- mdctx = EVP_MD_CTX_new();
- EVP_DigestInit_ex(mdctx, md, NULL);
- EVP_DigestUpdate(mdctx, input, inplen);
- EVP_DigestFinal_ex(mdctx, output, NULL);
- EVP_MD_CTX_free(mdctx);
+ mdctx = OSSL_FUNC(EVP_MD_CTX_new)();
+ OSSL_FUNC(EVP_DigestInit_ex)(mdctx, md, NULL);
+ OSSL_FUNC(EVP_DigestUpdate)(mdctx, input, inplen);
+ OSSL_FUNC(EVP_DigestFinal_ex)(mdctx, output, NULL);
+ OSSL_FUNC(EVP_MD_CTX_free)(mdctx);
}
static void do_xof(uint8_t *output, size_t outlen, const uint8_t *input, size_t inplen, const EVP_MD *md) {
EVP_MD_CTX *mdctx;
- mdctx = EVP_MD_CTX_new();
- EVP_DigestInit_ex(mdctx, md, NULL);
- EVP_DigestUpdate(mdctx, input, inplen);
- EVP_DigestFinalXOF(mdctx, output, outlen);
- EVP_MD_CTX_free(mdctx);
+ mdctx = OSSL_FUNC(EVP_MD_CTX_new)();
+ OSSL_FUNC(EVP_DigestInit_ex)(mdctx, md, NULL);
+ OSSL_FUNC(EVP_DigestUpdate)(mdctx, input, inplen);
+ OSSL_FUNC(EVP_DigestFinalXOF)(mdctx, output, outlen);
+ OSSL_FUNC(EVP_MD_CTX_free)(mdctx);
}
/* SHA3-256 */
-void OQS_SHA3_sha3_256(uint8_t *output, const uint8_t *input, size_t inplen) {
+static void SHA3_sha3_256(uint8_t *output, const uint8_t *input, size_t inplen) {
do_hash(output, input, inplen, oqs_sha3_256());
}
/* SHA3-256 incremental */
-void OQS_SHA3_sha3_256_inc_init(OQS_SHA3_sha3_256_inc_ctx *state) {
- state->ctx = EVP_MD_CTX_new();
+static void SHA3_sha3_256_inc_init(OQS_SHA3_sha3_256_inc_ctx *state) {
+ state->ctx = OSSL_FUNC(EVP_MD_CTX_new)();
EVP_MD_CTX *s = (EVP_MD_CTX *)state->ctx;
- EVP_DigestInit_ex(s, oqs_sha3_256(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s, oqs_sha3_256(), NULL);
}
-void OQS_SHA3_sha3_256_inc_absorb(OQS_SHA3_sha3_256_inc_ctx *state, const uint8_t *input, size_t inplen) {
- EVP_DigestUpdate((EVP_MD_CTX *)state->ctx, input, inplen);
+static void SHA3_sha3_256_inc_absorb(OQS_SHA3_sha3_256_inc_ctx *state, const uint8_t *input, size_t inplen) {
+ OSSL_FUNC(EVP_DigestUpdate)((EVP_MD_CTX *)state->ctx, input, inplen);
}
-void OQS_SHA3_sha3_256_inc_finalize(uint8_t *output, OQS_SHA3_sha3_256_inc_ctx *state) {
- EVP_DigestFinal_ex((EVP_MD_CTX *)state->ctx, output, NULL);
+static void SHA3_sha3_256_inc_finalize(uint8_t *output, OQS_SHA3_sha3_256_inc_ctx *state) {
+ OSSL_FUNC(EVP_DigestFinal_ex)((EVP_MD_CTX *)state->ctx, output, NULL);
}
-void OQS_SHA3_sha3_256_inc_ctx_release(OQS_SHA3_sha3_256_inc_ctx *state) {
- EVP_MD_CTX_free((EVP_MD_CTX *)state->ctx);
+static void SHA3_sha3_256_inc_ctx_release(OQS_SHA3_sha3_256_inc_ctx *state) {
+ OSSL_FUNC(EVP_MD_CTX_free)((EVP_MD_CTX *)state->ctx);
}
-void OQS_SHA3_sha3_256_inc_ctx_clone(OQS_SHA3_sha3_256_inc_ctx *dest, const OQS_SHA3_sha3_256_inc_ctx *src) {
- EVP_MD_CTX_copy_ex((EVP_MD_CTX *)dest->ctx, (EVP_MD_CTX *)src->ctx);
+static void SHA3_sha3_256_inc_ctx_clone(OQS_SHA3_sha3_256_inc_ctx *dest, const OQS_SHA3_sha3_256_inc_ctx *src) {
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)((EVP_MD_CTX *)dest->ctx, (EVP_MD_CTX *)src->ctx);
}
-void OQS_SHA3_sha3_256_inc_ctx_reset(OQS_SHA3_sha3_256_inc_ctx *state) {
+static void SHA3_sha3_256_inc_ctx_reset(OQS_SHA3_sha3_256_inc_ctx *state) {
EVP_MD_CTX *s = state->ctx;
- EVP_MD_CTX_reset(s);
- EVP_DigestInit_ex(s, oqs_sha3_256(), NULL);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s);
+ OSSL_FUNC(EVP_DigestInit_ex)(s, oqs_sha3_256(), NULL);
}
/* SHA3-384 */
-void OQS_SHA3_sha3_384(uint8_t *output, const uint8_t *input, size_t inplen) {
+static void SHA3_sha3_384(uint8_t *output, const uint8_t *input, size_t inplen) {
do_hash(output, input, inplen, oqs_sha3_384());
}
/* SHA3-384 incremental */
-void OQS_SHA3_sha3_384_inc_init(OQS_SHA3_sha3_384_inc_ctx *state) {
- state->ctx = EVP_MD_CTX_new();
- EVP_DigestInit_ex((EVP_MD_CTX *)state->ctx, oqs_sha3_384(), NULL);
+static void SHA3_sha3_384_inc_init(OQS_SHA3_sha3_384_inc_ctx *state) {
+ state->ctx = OSSL_FUNC(EVP_MD_CTX_new)();
+ OSSL_FUNC(EVP_DigestInit_ex)((EVP_MD_CTX *)state->ctx, oqs_sha3_384(), NULL);
}
-void OQS_SHA3_sha3_384_inc_absorb(OQS_SHA3_sha3_384_inc_ctx *state, const uint8_t *input, size_t inplen) {
- EVP_DigestUpdate((EVP_MD_CTX *)state->ctx, input, inplen);
+static void SHA3_sha3_384_inc_absorb(OQS_SHA3_sha3_384_inc_ctx *state, const uint8_t *input, size_t inplen) {
+ OSSL_FUNC(EVP_DigestUpdate)((EVP_MD_CTX *)state->ctx, input, inplen);
}
-void OQS_SHA3_sha3_384_inc_finalize(uint8_t *output, OQS_SHA3_sha3_384_inc_ctx *state) {
- EVP_DigestFinal_ex((EVP_MD_CTX *)state->ctx, output, NULL);
+static void SHA3_sha3_384_inc_finalize(uint8_t *output, OQS_SHA3_sha3_384_inc_ctx *state) {
+ OSSL_FUNC(EVP_DigestFinal_ex)((EVP_MD_CTX *)state->ctx, output, NULL);
}
-void OQS_SHA3_sha3_384_inc_ctx_release(OQS_SHA3_sha3_384_inc_ctx *state) {
- EVP_MD_CTX_free((EVP_MD_CTX *)state->ctx);
+static void SHA3_sha3_384_inc_ctx_release(OQS_SHA3_sha3_384_inc_ctx *state) {
+ OSSL_FUNC(EVP_MD_CTX_free)((EVP_MD_CTX *)state->ctx);
}
-void OQS_SHA3_sha3_384_inc_ctx_clone(OQS_SHA3_sha3_384_inc_ctx *dest, const OQS_SHA3_sha3_384_inc_ctx *src) {
- EVP_MD_CTX_copy_ex((EVP_MD_CTX *)dest->ctx, (EVP_MD_CTX *)src->ctx);
+static void SHA3_sha3_384_inc_ctx_clone(OQS_SHA3_sha3_384_inc_ctx *dest, const OQS_SHA3_sha3_384_inc_ctx *src) {
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)((EVP_MD_CTX *)dest->ctx, (EVP_MD_CTX *)src->ctx);
}
-void OQS_SHA3_sha3_384_inc_ctx_reset(OQS_SHA3_sha3_384_inc_ctx *state) {
+static void SHA3_sha3_384_inc_ctx_reset(OQS_SHA3_sha3_384_inc_ctx *state) {
EVP_MD_CTX *s = state->ctx;
- EVP_MD_CTX_reset(s);
- EVP_DigestInit_ex(s, oqs_sha3_384(), NULL);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s);
+ OSSL_FUNC(EVP_DigestInit_ex)(s, oqs_sha3_384(), NULL);
}
/* SHA3-512 */
-void OQS_SHA3_sha3_512(uint8_t *output, const uint8_t *input, size_t inplen) {
+static void SHA3_sha3_512(uint8_t *output, const uint8_t *input, size_t inplen) {
do_hash(output, input, inplen, oqs_sha3_512());
}
/* SHA3-512 incremental */
-void OQS_SHA3_sha3_512_inc_init(OQS_SHA3_sha3_512_inc_ctx *state) {
- state->ctx = EVP_MD_CTX_new();
- EVP_DigestInit_ex((EVP_MD_CTX *)state->ctx, oqs_sha3_512(), NULL);
+static void SHA3_sha3_512_inc_init(OQS_SHA3_sha3_512_inc_ctx *state) {
+ state->ctx = OSSL_FUNC(EVP_MD_CTX_new)();
+ OSSL_FUNC(EVP_DigestInit_ex)((EVP_MD_CTX *)state->ctx, oqs_sha3_512(), NULL);
}
-void OQS_SHA3_sha3_512_inc_absorb(OQS_SHA3_sha3_512_inc_ctx *state, const uint8_t *input, size_t inplen) {
- EVP_DigestUpdate((EVP_MD_CTX *)state->ctx, input, inplen);
+static void SHA3_sha3_512_inc_absorb(OQS_SHA3_sha3_512_inc_ctx *state, const uint8_t *input, size_t inplen) {
+ OSSL_FUNC(EVP_DigestUpdate)((EVP_MD_CTX *)state->ctx, input, inplen);
}
-void OQS_SHA3_sha3_512_inc_finalize(uint8_t *output, OQS_SHA3_sha3_512_inc_ctx *state) {
- EVP_DigestFinal_ex((EVP_MD_CTX *)state->ctx, output, NULL);
+static void SHA3_sha3_512_inc_finalize(uint8_t *output, OQS_SHA3_sha3_512_inc_ctx *state) {
+ OSSL_FUNC(EVP_DigestFinal_ex)((EVP_MD_CTX *)state->ctx, output, NULL);
}
-void OQS_SHA3_sha3_512_inc_ctx_release(OQS_SHA3_sha3_512_inc_ctx *state) {
- EVP_MD_CTX_free((EVP_MD_CTX *)state->ctx);
+static void SHA3_sha3_512_inc_ctx_release(OQS_SHA3_sha3_512_inc_ctx *state) {
+ OSSL_FUNC(EVP_MD_CTX_free)((EVP_MD_CTX *)state->ctx);
}
-void OQS_SHA3_sha3_512_inc_ctx_clone(OQS_SHA3_sha3_512_inc_ctx *dest, const OQS_SHA3_sha3_512_inc_ctx *src) {
- EVP_MD_CTX_copy_ex((EVP_MD_CTX *)dest->ctx, (EVP_MD_CTX *)src->ctx);
+static void SHA3_sha3_512_inc_ctx_clone(OQS_SHA3_sha3_512_inc_ctx *dest, const OQS_SHA3_sha3_512_inc_ctx *src) {
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)((EVP_MD_CTX *)dest->ctx, (EVP_MD_CTX *)src->ctx);
}
-void OQS_SHA3_sha3_512_inc_ctx_reset(OQS_SHA3_sha3_512_inc_ctx *state) {
+static void SHA3_sha3_512_inc_ctx_reset(OQS_SHA3_sha3_512_inc_ctx *state) {
EVP_MD_CTX *s = state->ctx;
- EVP_MD_CTX_reset(s);
- EVP_DigestInit_ex(s, oqs_sha3_512(), NULL);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s);
+ OSSL_FUNC(EVP_DigestInit_ex)(s, oqs_sha3_512(), NULL);
}
/* SHAKE-128 */
-void OQS_SHA3_shake128(uint8_t *output, size_t outlen, const uint8_t *input, size_t inplen) {
+static void SHA3_shake128(uint8_t *output, size_t outlen, const uint8_t *input, size_t inplen) {
do_xof(output, outlen, input, inplen, oqs_shake128());
}
@@ -166,70 +165,70 @@ typedef struct {
size_t n_out;
} intrn_shake128_inc_ctx;
-void OQS_SHA3_shake128_inc_init(OQS_SHA3_shake128_inc_ctx *state) {
+static void SHA3_shake128_inc_init(OQS_SHA3_shake128_inc_ctx *state) {
state->ctx = malloc(sizeof(intrn_shake128_inc_ctx));
intrn_shake128_inc_ctx *s = (intrn_shake128_inc_ctx *)state->ctx;
- s->mdctx = EVP_MD_CTX_new();
+ s->mdctx = OSSL_FUNC(EVP_MD_CTX_new)();
s->n_out = 0;
- EVP_DigestInit_ex(s->mdctx, oqs_shake128(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx, oqs_shake128(), NULL);
}
-void OQS_SHA3_shake128_inc_absorb(OQS_SHA3_shake128_inc_ctx *state, const uint8_t *input, size_t inplen) {
+static void SHA3_shake128_inc_absorb(OQS_SHA3_shake128_inc_ctx *state, const uint8_t *input, size_t inplen) {
intrn_shake128_inc_ctx *s = (intrn_shake128_inc_ctx *)state->ctx;
- EVP_DigestUpdate(s->mdctx, input, inplen);
+ OSSL_FUNC(EVP_DigestUpdate)(s->mdctx, input, inplen);
}
-void OQS_SHA3_shake128_inc_finalize(OQS_SHA3_shake128_inc_ctx *state) {
+static void SHA3_shake128_inc_finalize(OQS_SHA3_shake128_inc_ctx *state) {
(void)state;
}
-void OQS_SHA3_shake128_inc_squeeze(uint8_t *output, size_t outlen, OQS_SHA3_shake128_inc_ctx *state) {
+static void SHA3_shake128_inc_squeeze(uint8_t *output, size_t outlen, OQS_SHA3_shake128_inc_ctx *state) {
intrn_shake128_inc_ctx *s = (intrn_shake128_inc_ctx *)state->ctx;
EVP_MD_CTX *clone;
- clone = EVP_MD_CTX_new();
- EVP_DigestInit_ex(clone, oqs_shake128(), NULL);
- EVP_MD_CTX_copy_ex(clone, s->mdctx);
+ clone = OSSL_FUNC(EVP_MD_CTX_new)();
+ OSSL_FUNC(EVP_DigestInit_ex)(clone, oqs_shake128(), NULL);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx);
if (s->n_out == 0) {
- EVP_DigestFinalXOF(clone, output, outlen);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, output, outlen);
} else {
uint8_t *tmp;
tmp = malloc(s->n_out + outlen);
if (tmp == NULL) {
exit(111);
}
- EVP_DigestFinalXOF(clone, tmp, s->n_out + outlen);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, tmp, s->n_out + outlen);
memcpy(output, tmp + s->n_out, outlen);
free(tmp); // IGNORE free-check
}
- EVP_MD_CTX_free(clone);
+ OSSL_FUNC(EVP_MD_CTX_free)(clone);
s->n_out += outlen;
}
-void OQS_SHA3_shake128_inc_ctx_release(OQS_SHA3_shake128_inc_ctx *state) {
+static void SHA3_shake128_inc_ctx_release(OQS_SHA3_shake128_inc_ctx *state) {
intrn_shake128_inc_ctx *s = (intrn_shake128_inc_ctx *)state->ctx;
- EVP_MD_CTX_free(s->mdctx);
+ OSSL_FUNC(EVP_MD_CTX_free)(s->mdctx);
free(s); // IGNORE free-check
}
-void OQS_SHA3_shake128_inc_ctx_clone(OQS_SHA3_shake128_inc_ctx *dest, const OQS_SHA3_shake128_inc_ctx *src) {
+static void SHA3_shake128_inc_ctx_clone(OQS_SHA3_shake128_inc_ctx *dest, const OQS_SHA3_shake128_inc_ctx *src) {
intrn_shake128_inc_ctx *s = (intrn_shake128_inc_ctx *)src->ctx;
intrn_shake128_inc_ctx *d = (intrn_shake128_inc_ctx *)dest->ctx;
- EVP_MD_CTX_copy_ex(d->mdctx, s->mdctx);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(d->mdctx, s->mdctx);
d->n_out = s->n_out;
}
-void OQS_SHA3_shake128_inc_ctx_reset(OQS_SHA3_shake128_inc_ctx *state) {
+static void SHA3_shake128_inc_ctx_reset(OQS_SHA3_shake128_inc_ctx *state) {
intrn_shake128_inc_ctx *s = (intrn_shake128_inc_ctx *)state->ctx;
- EVP_MD_CTX_reset(s->mdctx);
- EVP_DigestInit_ex(s->mdctx, oqs_shake128(), NULL);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s->mdctx);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx, oqs_shake128(), NULL);
s->n_out = 0;
}
/* SHAKE-256 */
-void OQS_SHA3_shake256(uint8_t *output, size_t outlen, const uint8_t *input, size_t inplen) {
+static void SHA3_shake256(uint8_t *output, size_t outlen, const uint8_t *input, size_t inplen) {
do_xof(output, outlen, input, inplen, oqs_shake256());
}
@@ -243,65 +242,107 @@ typedef struct {
size_t n_out;
} intrn_shake256_inc_ctx;
-void OQS_SHA3_shake256_inc_init(OQS_SHA3_shake256_inc_ctx *state) {
+static void SHA3_shake256_inc_init(OQS_SHA3_shake256_inc_ctx *state) {
state->ctx = malloc(sizeof(intrn_shake256_inc_ctx));
intrn_shake256_inc_ctx *s = (intrn_shake256_inc_ctx *)state->ctx;
- s->mdctx = EVP_MD_CTX_new();
+ s->mdctx = OSSL_FUNC(EVP_MD_CTX_new)();
s->n_out = 0;
- EVP_DigestInit_ex(s->mdctx, oqs_shake256(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx, oqs_shake256(), NULL);
}
-void OQS_SHA3_shake256_inc_absorb(OQS_SHA3_shake256_inc_ctx *state, const uint8_t *input, size_t inplen) {
+static void SHA3_shake256_inc_absorb(OQS_SHA3_shake256_inc_ctx *state, const uint8_t *input, size_t inplen) {
intrn_shake256_inc_ctx *s = (intrn_shake256_inc_ctx *)state->ctx;
- EVP_DigestUpdate(s->mdctx, input, inplen);
+ OSSL_FUNC(EVP_DigestUpdate)(s->mdctx, input, inplen);
}
-void OQS_SHA3_shake256_inc_finalize(OQS_SHA3_shake256_inc_ctx *state) {
+static void SHA3_shake256_inc_finalize(OQS_SHA3_shake256_inc_ctx *state) {
(void)state;
}
-void OQS_SHA3_shake256_inc_squeeze(uint8_t *output, size_t outlen, OQS_SHA3_shake256_inc_ctx *state) {
+static void SHA3_shake256_inc_squeeze(uint8_t *output, size_t outlen, OQS_SHA3_shake256_inc_ctx *state) {
intrn_shake256_inc_ctx *s = (intrn_shake256_inc_ctx *)state->ctx;
EVP_MD_CTX *clone;
- clone = EVP_MD_CTX_new();
- EVP_DigestInit_ex(clone, oqs_shake256(), NULL);
- EVP_MD_CTX_copy_ex(clone, s->mdctx);
+ clone = OSSL_FUNC(EVP_MD_CTX_new)();
+ OSSL_FUNC(EVP_DigestInit_ex)(clone, oqs_shake256(), NULL);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx);
if (s->n_out == 0) {
- EVP_DigestFinalXOF(clone, output, outlen);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, output, outlen);
} else {
uint8_t *tmp;
tmp = malloc(s->n_out + outlen);
if (tmp == NULL) {
exit(111);
}
- EVP_DigestFinalXOF(clone, tmp, s->n_out + outlen);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, tmp, s->n_out + outlen);
memcpy(output, tmp + s->n_out, outlen);
free(tmp); // IGNORE free-check
}
- EVP_MD_CTX_free(clone);
+ OSSL_FUNC(EVP_MD_CTX_free)(clone);
s->n_out += outlen;
}
-void OQS_SHA3_shake256_inc_ctx_release(OQS_SHA3_shake256_inc_ctx *state) {
+static void SHA3_shake256_inc_ctx_release(OQS_SHA3_shake256_inc_ctx *state) {
intrn_shake256_inc_ctx *s = (intrn_shake256_inc_ctx *)state->ctx;
- EVP_MD_CTX_free(s->mdctx);
+ OSSL_FUNC(EVP_MD_CTX_free)(s->mdctx);
free(s); // IGNORE free-check
}
-void OQS_SHA3_shake256_inc_ctx_clone(OQS_SHA3_shake256_inc_ctx *dest, const OQS_SHA3_shake256_inc_ctx *src) {
+static void SHA3_shake256_inc_ctx_clone(OQS_SHA3_shake256_inc_ctx *dest, const OQS_SHA3_shake256_inc_ctx *src) {
intrn_shake256_inc_ctx *s = (intrn_shake256_inc_ctx *)src->ctx;
intrn_shake256_inc_ctx *d = (intrn_shake256_inc_ctx *)dest->ctx;
- EVP_MD_CTX_copy_ex(d->mdctx, s->mdctx);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(d->mdctx, s->mdctx);
d->n_out = s->n_out;
}
-void OQS_SHA3_shake256_inc_ctx_reset(OQS_SHA3_shake256_inc_ctx *state) {
+static void SHA3_shake256_inc_ctx_reset(OQS_SHA3_shake256_inc_ctx *state) {
intrn_shake256_inc_ctx *s = (intrn_shake256_inc_ctx *)state->ctx;
- EVP_MD_CTX_reset(s->mdctx);
- EVP_DigestInit_ex(s->mdctx, oqs_shake256(), NULL);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s->mdctx);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx, oqs_shake256(), NULL);
s->n_out = 0;
}
+extern struct OQS_SHA3_callbacks sha3_default_callbacks;
+
+struct OQS_SHA3_callbacks sha3_default_callbacks = {
+ SHA3_sha3_256,
+ SHA3_sha3_256_inc_init,
+ SHA3_sha3_256_inc_absorb,
+ SHA3_sha3_256_inc_finalize,
+ SHA3_sha3_256_inc_ctx_release,
+ SHA3_sha3_256_inc_ctx_reset,
+ SHA3_sha3_256_inc_ctx_clone,
+ SHA3_sha3_384,
+ SHA3_sha3_384_inc_init,
+ SHA3_sha3_384_inc_absorb,
+ SHA3_sha3_384_inc_finalize,
+ SHA3_sha3_384_inc_ctx_release,
+ SHA3_sha3_384_inc_ctx_reset,
+ SHA3_sha3_384_inc_ctx_clone,
+ SHA3_sha3_512,
+ SHA3_sha3_512_inc_init,
+ SHA3_sha3_512_inc_absorb,
+ SHA3_sha3_512_inc_finalize,
+ SHA3_sha3_512_inc_ctx_release,
+ SHA3_sha3_512_inc_ctx_reset,
+ SHA3_sha3_512_inc_ctx_clone,
+ SHA3_shake128,
+ SHA3_shake128_inc_init,
+ SHA3_shake128_inc_absorb,
+ SHA3_shake128_inc_finalize,
+ SHA3_shake128_inc_squeeze,
+ SHA3_shake128_inc_ctx_release,
+ SHA3_shake128_inc_ctx_clone,
+ SHA3_shake128_inc_ctx_reset,
+ SHA3_shake256,
+ SHA3_shake256_inc_init,
+ SHA3_shake256_inc_absorb,
+ SHA3_shake256_inc_finalize,
+ SHA3_shake256_inc_squeeze,
+ SHA3_shake256_inc_ctx_release,
+ SHA3_shake256_inc_ctx_clone,
+ SHA3_shake256_inc_ctx_reset,
+};
+
#endif
diff --git a/src/common/sha3/ossl_sha3x4.c b/src/common/sha3/ossl_sha3x4.c
index 1e469720..fec62ad6 100644
--- a/src/common/sha3/ossl_sha3x4.c
+++ b/src/common/sha3/ossl_sha3x4.c
@@ -14,8 +14,8 @@
/* SHAKE-128 */
-void OQS_SHA3_shake128_x4(uint8_t *output0, uint8_t *output1, uint8_t *output2, uint8_t *output3, size_t outlen,
- const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inplen) {
+static void SHA3_shake128_x4(uint8_t *output0, uint8_t *output1, uint8_t *output2, uint8_t *output3, size_t outlen,
+ const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inplen) {
OQS_SHA3_shake128(output0, outlen, in0, inplen);
OQS_SHA3_shake128(output1, outlen, in1, inplen);
OQS_SHA3_shake128(output2, outlen, in2, inplen);
@@ -32,108 +32,108 @@ typedef struct {
size_t n_out;
} intrn_shake128_x4_inc_ctx;
-void OQS_SHA3_shake128_x4_inc_init(OQS_SHA3_shake128_x4_inc_ctx *state) {
+static void SHA3_shake128_x4_inc_init(OQS_SHA3_shake128_x4_inc_ctx *state) {
state->ctx = malloc(sizeof(intrn_shake128_x4_inc_ctx));
intrn_shake128_x4_inc_ctx *s = (intrn_shake128_x4_inc_ctx *)state->ctx;
- s->mdctx0 = EVP_MD_CTX_new();
- s->mdctx1 = EVP_MD_CTX_new();
- s->mdctx2 = EVP_MD_CTX_new();
- s->mdctx3 = EVP_MD_CTX_new();
- EVP_DigestInit_ex(s->mdctx0, oqs_shake128(), NULL);
- EVP_DigestInit_ex(s->mdctx1, oqs_shake128(), NULL);
- EVP_DigestInit_ex(s->mdctx2, oqs_shake128(), NULL);
- EVP_DigestInit_ex(s->mdctx3, oqs_shake128(), NULL);
+ s->mdctx0 = OSSL_FUNC(EVP_MD_CTX_new)();
+ s->mdctx1 = OSSL_FUNC(EVP_MD_CTX_new)();
+ s->mdctx2 = OSSL_FUNC(EVP_MD_CTX_new)();
+ s->mdctx3 = OSSL_FUNC(EVP_MD_CTX_new)();
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx0, oqs_shake128(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx1, oqs_shake128(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx2, oqs_shake128(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx3, oqs_shake128(), NULL);
s->n_out = 0;
}
-void OQS_SHA3_shake128_x4_inc_absorb(OQS_SHA3_shake128_x4_inc_ctx *state, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inplen) {
+static void SHA3_shake128_x4_inc_absorb(OQS_SHA3_shake128_x4_inc_ctx *state, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inplen) {
intrn_shake128_x4_inc_ctx *s = (intrn_shake128_x4_inc_ctx *)state->ctx;
- EVP_DigestUpdate(s->mdctx0, in0, inplen);
- EVP_DigestUpdate(s->mdctx1, in1, inplen);
- EVP_DigestUpdate(s->mdctx2, in2, inplen);
- EVP_DigestUpdate(s->mdctx3, in3, inplen);
+ OSSL_FUNC(EVP_DigestUpdate)(s->mdctx0, in0, inplen);
+ OSSL_FUNC(EVP_DigestUpdate)(s->mdctx1, in1, inplen);
+ OSSL_FUNC(EVP_DigestUpdate)(s->mdctx2, in2, inplen);
+ OSSL_FUNC(EVP_DigestUpdate)(s->mdctx3, in3, inplen);
}
-void OQS_SHA3_shake128_x4_inc_finalize(OQS_SHA3_shake128_x4_inc_ctx *state) {
+static void SHA3_shake128_x4_inc_finalize(OQS_SHA3_shake128_x4_inc_ctx *state) {
(void)state;
}
-void OQS_SHA3_shake128_x4_inc_squeeze(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, OQS_SHA3_shake128_x4_inc_ctx *state) {
+static void SHA3_shake128_x4_inc_squeeze(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, OQS_SHA3_shake128_x4_inc_ctx *state) {
intrn_shake128_x4_inc_ctx *s = (intrn_shake128_x4_inc_ctx *)state->ctx;
EVP_MD_CTX *clone;
- clone = EVP_MD_CTX_new();
- EVP_DigestInit_ex(clone, oqs_shake128(), NULL);
+ clone = OSSL_FUNC(EVP_MD_CTX_new)();
+ OSSL_FUNC(EVP_DigestInit_ex)(clone, oqs_shake128(), NULL);
if (s->n_out == 0) {
- EVP_MD_CTX_copy_ex(clone, s->mdctx0);
- EVP_DigestFinalXOF(clone, out0, outlen);
- EVP_MD_CTX_copy_ex(clone, s->mdctx1);
- EVP_DigestFinalXOF(clone, out1, outlen);
- EVP_MD_CTX_copy_ex(clone, s->mdctx2);
- EVP_DigestFinalXOF(clone, out2, outlen);
- EVP_MD_CTX_copy_ex(clone, s->mdctx3);
- EVP_DigestFinalXOF(clone, out3, outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx0);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, out0, outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx1);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, out1, outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx2);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, out2, outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx3);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, out3, outlen);
} else {
uint8_t *tmp;
tmp = malloc(s->n_out + outlen);
if (tmp == NULL) {
exit(111);
}
- EVP_MD_CTX_copy_ex(clone, s->mdctx0);
- EVP_DigestFinalXOF(clone, tmp, s->n_out + outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx0);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, tmp, s->n_out + outlen);
memcpy(out0, tmp + s->n_out, outlen);
- EVP_MD_CTX_copy_ex(clone, s->mdctx1);
- EVP_DigestFinalXOF(clone, tmp, s->n_out + outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx1);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, tmp, s->n_out + outlen);
memcpy(out1, tmp + s->n_out, outlen);
- EVP_MD_CTX_copy_ex(clone, s->mdctx2);
- EVP_DigestFinalXOF(clone, tmp, s->n_out + outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx2);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, tmp, s->n_out + outlen);
memcpy(out2, tmp + s->n_out, outlen);
- EVP_MD_CTX_copy_ex(clone, s->mdctx3);
- EVP_DigestFinalXOF(clone, tmp, s->n_out + outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx3);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, tmp, s->n_out + outlen);
memcpy(out3, tmp + s->n_out, outlen);
free(tmp); // IGNORE free-check
}
- EVP_MD_CTX_free(clone);
+ OSSL_FUNC(EVP_MD_CTX_free)(clone);
s->n_out += outlen;
}
-void OQS_SHA3_shake128_x4_inc_ctx_clone(OQS_SHA3_shake128_x4_inc_ctx *dest, const OQS_SHA3_shake128_x4_inc_ctx *src) {
+static void SHA3_shake128_x4_inc_ctx_clone(OQS_SHA3_shake128_x4_inc_ctx *dest, const OQS_SHA3_shake128_x4_inc_ctx *src) {
intrn_shake128_x4_inc_ctx *s = (intrn_shake128_x4_inc_ctx *)src->ctx;
intrn_shake128_x4_inc_ctx *d = (intrn_shake128_x4_inc_ctx *)dest->ctx;
- EVP_MD_CTX_copy_ex(d->mdctx0, s->mdctx0);
- EVP_MD_CTX_copy_ex(d->mdctx1, s->mdctx1);
- EVP_MD_CTX_copy_ex(d->mdctx2, s->mdctx2);
- EVP_MD_CTX_copy_ex(d->mdctx3, s->mdctx3);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(d->mdctx0, s->mdctx0);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(d->mdctx1, s->mdctx1);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(d->mdctx2, s->mdctx2);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(d->mdctx3, s->mdctx3);
d->n_out = s->n_out;
}
-void OQS_SHA3_shake128_x4_inc_ctx_release(OQS_SHA3_shake128_x4_inc_ctx *state) {
+static void SHA3_shake128_x4_inc_ctx_release(OQS_SHA3_shake128_x4_inc_ctx *state) {
intrn_shake128_x4_inc_ctx *s = (intrn_shake128_x4_inc_ctx *)state->ctx;
- EVP_MD_CTX_free(s->mdctx0);
- EVP_MD_CTX_free(s->mdctx1);
- EVP_MD_CTX_free(s->mdctx2);
- EVP_MD_CTX_free(s->mdctx3);
+ OSSL_FUNC(EVP_MD_CTX_free)(s->mdctx0);
+ OSSL_FUNC(EVP_MD_CTX_free)(s->mdctx1);
+ OSSL_FUNC(EVP_MD_CTX_free)(s->mdctx2);
+ OSSL_FUNC(EVP_MD_CTX_free)(s->mdctx3);
free(s); // IGNORE free-check
}
-void OQS_SHA3_shake128_x4_inc_ctx_reset(OQS_SHA3_shake128_x4_inc_ctx *state) {
+static void SHA3_shake128_x4_inc_ctx_reset(OQS_SHA3_shake128_x4_inc_ctx *state) {
intrn_shake128_x4_inc_ctx *s = (intrn_shake128_x4_inc_ctx *)state->ctx;
- EVP_MD_CTX_reset(s->mdctx0);
- EVP_MD_CTX_reset(s->mdctx1);
- EVP_MD_CTX_reset(s->mdctx2);
- EVP_MD_CTX_reset(s->mdctx3);
- EVP_DigestInit_ex(s->mdctx0, oqs_shake128(), NULL);
- EVP_DigestInit_ex(s->mdctx1, oqs_shake128(), NULL);
- EVP_DigestInit_ex(s->mdctx2, oqs_shake128(), NULL);
- EVP_DigestInit_ex(s->mdctx3, oqs_shake128(), NULL);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s->mdctx0);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s->mdctx1);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s->mdctx2);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s->mdctx3);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx0, oqs_shake128(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx1, oqs_shake128(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx2, oqs_shake128(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx3, oqs_shake128(), NULL);
s->n_out = 0;
}
/* SHAKE-256 */
-void OQS_SHA3_shake256_x4(uint8_t *output0, uint8_t *output1, uint8_t *output2, uint8_t *output3, size_t outlen,
- const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inplen) {
+static void SHA3_shake256_x4(uint8_t *output0, uint8_t *output1, uint8_t *output2, uint8_t *output3, size_t outlen,
+ const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inplen) {
OQS_SHA3_shake256(output0, outlen, in0, inplen);
OQS_SHA3_shake256(output1, outlen, in1, inplen);
OQS_SHA3_shake256(output2, outlen, in2, inplen);
@@ -150,102 +150,123 @@ typedef struct {
size_t n_out;
} intrn_shake256_x4_inc_ctx;
-void OQS_SHA3_shake256_x4_inc_init(OQS_SHA3_shake256_x4_inc_ctx *state) {
+static void SHA3_shake256_x4_inc_init(OQS_SHA3_shake256_x4_inc_ctx *state) {
state->ctx = malloc(sizeof(intrn_shake256_x4_inc_ctx));
intrn_shake256_x4_inc_ctx *s = (intrn_shake256_x4_inc_ctx *)state->ctx;
- s->mdctx0 = EVP_MD_CTX_new();
- s->mdctx1 = EVP_MD_CTX_new();
- s->mdctx2 = EVP_MD_CTX_new();
- s->mdctx3 = EVP_MD_CTX_new();
- EVP_DigestInit_ex(s->mdctx0, oqs_shake256(), NULL);
- EVP_DigestInit_ex(s->mdctx1, oqs_shake256(), NULL);
- EVP_DigestInit_ex(s->mdctx2, oqs_shake256(), NULL);
- EVP_DigestInit_ex(s->mdctx3, oqs_shake256(), NULL);
+ s->mdctx0 = OSSL_FUNC(EVP_MD_CTX_new)();
+ s->mdctx1 = OSSL_FUNC(EVP_MD_CTX_new)();
+ s->mdctx2 = OSSL_FUNC(EVP_MD_CTX_new)();
+ s->mdctx3 = OSSL_FUNC(EVP_MD_CTX_new)();
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx0, oqs_shake256(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx1, oqs_shake256(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx2, oqs_shake256(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx3, oqs_shake256(), NULL);
s->n_out = 0;
}
-void OQS_SHA3_shake256_x4_inc_absorb(OQS_SHA3_shake256_x4_inc_ctx *state, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inplen) {
+static void SHA3_shake256_x4_inc_absorb(OQS_SHA3_shake256_x4_inc_ctx *state, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inplen) {
intrn_shake256_x4_inc_ctx *s = (intrn_shake256_x4_inc_ctx *)state->ctx;
- EVP_DigestUpdate(s->mdctx0, in0, inplen);
- EVP_DigestUpdate(s->mdctx1, in1, inplen);
- EVP_DigestUpdate(s->mdctx2, in2, inplen);
- EVP_DigestUpdate(s->mdctx3, in3, inplen);
+ OSSL_FUNC(EVP_DigestUpdate)(s->mdctx0, in0, inplen);
+ OSSL_FUNC(EVP_DigestUpdate)(s->mdctx1, in1, inplen);
+ OSSL_FUNC(EVP_DigestUpdate)(s->mdctx2, in2, inplen);
+ OSSL_FUNC(EVP_DigestUpdate)(s->mdctx3, in3, inplen);
}
-void OQS_SHA3_shake256_x4_inc_finalize(OQS_SHA3_shake256_x4_inc_ctx *state) {
+static void SHA3_shake256_x4_inc_finalize(OQS_SHA3_shake256_x4_inc_ctx *state) {
(void)state;
}
-void OQS_SHA3_shake256_x4_inc_squeeze(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, OQS_SHA3_shake256_x4_inc_ctx *state) {
+static void SHA3_shake256_x4_inc_squeeze(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, OQS_SHA3_shake256_x4_inc_ctx *state) {
intrn_shake256_x4_inc_ctx *s = (intrn_shake256_x4_inc_ctx *)state->ctx;
EVP_MD_CTX *clone;
- clone = EVP_MD_CTX_new();
- EVP_DigestInit_ex(clone, oqs_shake256(), NULL);
+ clone = OSSL_FUNC(EVP_MD_CTX_new)();
+ OSSL_FUNC(EVP_DigestInit_ex)(clone, oqs_shake256(), NULL);
if (s->n_out == 0) {
- EVP_MD_CTX_copy_ex(clone, s->mdctx0);
- EVP_DigestFinalXOF(clone, out0, outlen);
- EVP_MD_CTX_copy_ex(clone, s->mdctx1);
- EVP_DigestFinalXOF(clone, out1, outlen);
- EVP_MD_CTX_copy_ex(clone, s->mdctx2);
- EVP_DigestFinalXOF(clone, out2, outlen);
- EVP_MD_CTX_copy_ex(clone, s->mdctx3);
- EVP_DigestFinalXOF(clone, out3, outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx0);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, out0, outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx1);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, out1, outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx2);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, out2, outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx3);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, out3, outlen);
} else {
uint8_t *tmp;
tmp = malloc(s->n_out + outlen);
if (tmp == NULL) {
exit(111);
}
- EVP_MD_CTX_copy_ex(clone, s->mdctx0);
- EVP_DigestFinalXOF(clone, tmp, s->n_out + outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx0);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, tmp, s->n_out + outlen);
memcpy(out0, tmp + s->n_out, outlen);
- EVP_MD_CTX_copy_ex(clone, s->mdctx1);
- EVP_DigestFinalXOF(clone, tmp, s->n_out + outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx1);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, tmp, s->n_out + outlen);
memcpy(out1, tmp + s->n_out, outlen);
- EVP_MD_CTX_copy_ex(clone, s->mdctx2);
- EVP_DigestFinalXOF(clone, tmp, s->n_out + outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx2);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, tmp, s->n_out + outlen);
memcpy(out2, tmp + s->n_out, outlen);
- EVP_MD_CTX_copy_ex(clone, s->mdctx3);
- EVP_DigestFinalXOF(clone, tmp, s->n_out + outlen);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(clone, s->mdctx3);
+ OSSL_FUNC(EVP_DigestFinalXOF)(clone, tmp, s->n_out + outlen);
memcpy(out3, tmp + s->n_out, outlen);
free(tmp); // IGNORE free-check
}
- EVP_MD_CTX_free(clone);
+ OSSL_FUNC(EVP_MD_CTX_free)(clone);
s->n_out += outlen;
}
-void OQS_SHA3_shake256_x4_inc_ctx_clone(OQS_SHA3_shake256_x4_inc_ctx *dest, const OQS_SHA3_shake256_x4_inc_ctx *src) {
+static void SHA3_shake256_x4_inc_ctx_clone(OQS_SHA3_shake256_x4_inc_ctx *dest, const OQS_SHA3_shake256_x4_inc_ctx *src) {
intrn_shake256_x4_inc_ctx *s = (intrn_shake256_x4_inc_ctx *)src->ctx;
intrn_shake256_x4_inc_ctx *d = (intrn_shake256_x4_inc_ctx *)dest->ctx;
- EVP_MD_CTX_copy_ex(d->mdctx0, s->mdctx0);
- EVP_MD_CTX_copy_ex(d->mdctx1, s->mdctx1);
- EVP_MD_CTX_copy_ex(d->mdctx2, s->mdctx2);
- EVP_MD_CTX_copy_ex(d->mdctx3, s->mdctx3);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(d->mdctx0, s->mdctx0);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(d->mdctx1, s->mdctx1);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(d->mdctx2, s->mdctx2);
+ OSSL_FUNC(EVP_MD_CTX_copy_ex)(d->mdctx3, s->mdctx3);
d->n_out = s->n_out;
}
-void OQS_SHA3_shake256_x4_inc_ctx_release(OQS_SHA3_shake256_x4_inc_ctx *state) {
+static void SHA3_shake256_x4_inc_ctx_release(OQS_SHA3_shake256_x4_inc_ctx *state) {
intrn_shake256_x4_inc_ctx *s = (intrn_shake256_x4_inc_ctx *)state->ctx;
- EVP_MD_CTX_free(s->mdctx0);
- EVP_MD_CTX_free(s->mdctx1);
- EVP_MD_CTX_free(s->mdctx2);
- EVP_MD_CTX_free(s->mdctx3);
+ OSSL_FUNC(EVP_MD_CTX_free)(s->mdctx0);
+ OSSL_FUNC(EVP_MD_CTX_free)(s->mdctx1);
+ OSSL_FUNC(EVP_MD_CTX_free)(s->mdctx2);
+ OSSL_FUNC(EVP_MD_CTX_free)(s->mdctx3);
free(s); // IGNORE free-check
}
-void OQS_SHA3_shake256_x4_inc_ctx_reset(OQS_SHA3_shake256_x4_inc_ctx *state) {
+static void SHA3_shake256_x4_inc_ctx_reset(OQS_SHA3_shake256_x4_inc_ctx *state) {
intrn_shake256_x4_inc_ctx *s = (intrn_shake256_x4_inc_ctx *)state->ctx;
- EVP_MD_CTX_reset(s->mdctx0);
- EVP_MD_CTX_reset(s->mdctx1);
- EVP_MD_CTX_reset(s->mdctx2);
- EVP_MD_CTX_reset(s->mdctx3);
- EVP_DigestInit_ex(s->mdctx0, oqs_shake256(), NULL);
- EVP_DigestInit_ex(s->mdctx1, oqs_shake256(), NULL);
- EVP_DigestInit_ex(s->mdctx2, oqs_shake256(), NULL);
- EVP_DigestInit_ex(s->mdctx3, oqs_shake256(), NULL);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s->mdctx0);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s->mdctx1);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s->mdctx2);
+ OSSL_FUNC(EVP_MD_CTX_reset)(s->mdctx3);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx0, oqs_shake256(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx1, oqs_shake256(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx2, oqs_shake256(), NULL);
+ OSSL_FUNC(EVP_DigestInit_ex)(s->mdctx3, oqs_shake256(), NULL);
s->n_out = 0;
}
+extern struct OQS_SHA3_x4_callbacks sha3_x4_default_callbacks;
+
+struct OQS_SHA3_x4_callbacks sha3_x4_default_callbacks = {
+ SHA3_shake128_x4,
+ SHA3_shake128_x4_inc_init,
+ SHA3_shake128_x4_inc_absorb,
+ SHA3_shake128_x4_inc_finalize,
+ SHA3_shake128_x4_inc_squeeze,
+ SHA3_shake128_x4_inc_ctx_release,
+ SHA3_shake128_x4_inc_ctx_clone,
+ SHA3_shake128_x4_inc_ctx_reset,
+ SHA3_shake256_x4,
+ SHA3_shake256_x4_inc_init,
+ SHA3_shake256_x4_inc_absorb,
+ SHA3_shake256_x4_inc_finalize,
+ SHA3_shake256_x4_inc_squeeze,
+ SHA3_shake256_x4_inc_ctx_release,
+ SHA3_shake256_x4_inc_ctx_clone,
+ SHA3_shake256_x4_inc_ctx_reset,
+};
+
#endif
diff --git a/src/common/sha3/sha3.c b/src/common/sha3/sha3.c
new file mode 100644
index 00000000..600fc198
--- /dev/null
+++ b/src/common/sha3/sha3.c
@@ -0,0 +1,161 @@
+// SPDX-License-Identifier: MIT
+
+#include <oqs/oqs.h>
+
+#include "sha3.h"
+
+extern struct OQS_SHA3_callbacks sha3_default_callbacks;
+
+static struct OQS_SHA3_callbacks *callbacks = &sha3_default_callbacks;
+
+OQS_API void OQS_SHA3_set_callbacks(struct OQS_SHA3_callbacks *new_callbacks) {
+ callbacks = new_callbacks;
+}
+
+void OQS_SHA3_sha3_256(uint8_t *output, const uint8_t *input, size_t inplen) {
+ callbacks->SHA3_sha3_256(output, input, inplen);
+}
+
+void OQS_SHA3_sha3_256_inc_init(OQS_SHA3_sha3_256_inc_ctx *state) {
+ callbacks->SHA3_sha3_256_inc_init(state);
+}
+
+void OQS_SHA3_sha3_256_inc_absorb(OQS_SHA3_sha3_256_inc_ctx *state, const uint8_t *input, size_t inlen) {
+ callbacks->SHA3_sha3_256_inc_absorb(state, input, inlen);
+}
+
+void OQS_SHA3_sha3_256_inc_finalize(uint8_t *output, OQS_SHA3_sha3_256_inc_ctx *state) {
+ callbacks->SHA3_sha3_256_inc_finalize(output, state);
+}
+
+void OQS_SHA3_sha3_256_inc_ctx_release(OQS_SHA3_sha3_256_inc_ctx *state) {
+ callbacks->SHA3_sha3_256_inc_ctx_release(state);
+}
+
+void OQS_SHA3_sha3_256_inc_ctx_reset(OQS_SHA3_sha3_256_inc_ctx *state) {
+ callbacks->SHA3_sha3_256_inc_ctx_reset(state);
+}
+
+void OQS_SHA3_sha3_256_inc_ctx_clone(OQS_SHA3_sha3_256_inc_ctx *dest, const OQS_SHA3_sha3_256_inc_ctx *src) {
+ callbacks->SHA3_sha3_256_inc_ctx_clone(dest, src);
+}
+
+void OQS_SHA3_sha3_384(uint8_t *output, const uint8_t *input, size_t inplen) {
+ callbacks->SHA3_sha3_384(output, input, inplen);
+}
+
+void OQS_SHA3_sha3_384_inc_init(OQS_SHA3_sha3_384_inc_ctx *state) {
+ callbacks->SHA3_sha3_384_inc_init(state);
+}
+
+void OQS_SHA3_sha3_384_inc_absorb(OQS_SHA3_sha3_384_inc_ctx *state, const uint8_t *input, size_t inlen) {
+ callbacks->SHA3_sha3_384_inc_absorb(state, input, inlen);
+}
+
+void OQS_SHA3_sha3_384_inc_finalize(uint8_t *output, OQS_SHA3_sha3_384_inc_ctx *state) {
+ callbacks->SHA3_sha3_384_inc_finalize(output, state);
+}
+
+void OQS_SHA3_sha3_384_inc_ctx_release(OQS_SHA3_sha3_384_inc_ctx *state) {
+ callbacks->SHA3_sha3_384_inc_ctx_release(state);
+}
+
+void OQS_SHA3_sha3_384_inc_ctx_reset(OQS_SHA3_sha3_384_inc_ctx *state) {
+ callbacks->SHA3_sha3_384_inc_ctx_reset(state);
+}
+
+void OQS_SHA3_sha3_384_inc_ctx_clone(OQS_SHA3_sha3_384_inc_ctx *dest, const OQS_SHA3_sha3_384_inc_ctx *src) {
+ callbacks->SHA3_sha3_384_inc_ctx_clone(dest, src);
+}
+
+void OQS_SHA3_sha3_512(uint8_t *output, const uint8_t *input, size_t inplen) {
+ callbacks->SHA3_sha3_512(output, input, inplen);
+}
+
+void OQS_SHA3_sha3_512_inc_init(OQS_SHA3_sha3_512_inc_ctx *state) {
+ callbacks->SHA3_sha3_512_inc_init(state);
+}
+
+void OQS_SHA3_sha3_512_inc_absorb(OQS_SHA3_sha3_512_inc_ctx *state, const uint8_t *input, size_t inlen) {
+ callbacks->SHA3_sha3_512_inc_absorb(state, input, inlen);
+}
+
+void OQS_SHA3_sha3_512_inc_finalize(uint8_t *output, OQS_SHA3_sha3_512_inc_ctx *state) {
+ callbacks->SHA3_sha3_512_inc_finalize(output, state);
+}
+
+void OQS_SHA3_sha3_512_inc_ctx_release(OQS_SHA3_sha3_512_inc_ctx *state) {
+ callbacks->SHA3_sha3_512_inc_ctx_release(state);
+}
+
+void OQS_SHA3_sha3_512_inc_ctx_reset(OQS_SHA3_sha3_512_inc_ctx *state) {
+ callbacks->SHA3_sha3_512_inc_ctx_reset(state);
+}
+
+void OQS_SHA3_sha3_512_inc_ctx_clone(OQS_SHA3_sha3_512_inc_ctx *dest, const OQS_SHA3_sha3_512_inc_ctx *src) {
+ callbacks->SHA3_sha3_512_inc_ctx_clone(dest, src);
+}
+
+void OQS_SHA3_shake128(uint8_t *output, size_t outlen, const uint8_t *input, size_t inplen) {
+ callbacks->SHA3_shake128(output, outlen, input, inplen);
+}
+
+void OQS_SHA3_shake128_inc_init(OQS_SHA3_shake128_inc_ctx *state) {
+ callbacks->SHA3_shake128_inc_init(state);
+}
+
+void OQS_SHA3_shake128_inc_absorb(OQS_SHA3_shake128_inc_ctx *state, const uint8_t *input, size_t inlen) {
+ callbacks->SHA3_shake128_inc_absorb(state, input, inlen);
+}
+
+void OQS_SHA3_shake128_inc_finalize(OQS_SHA3_shake128_inc_ctx *state) {
+ callbacks->SHA3_shake128_inc_finalize(state);
+}
+
+void OQS_SHA3_shake128_inc_squeeze(uint8_t *output, size_t outlen, OQS_SHA3_shake128_inc_ctx *state) {
+ callbacks->SHA3_shake128_inc_squeeze(output, outlen, state);
+}
+
+void OQS_SHA3_shake128_inc_ctx_release(OQS_SHA3_shake128_inc_ctx *state) {
+ callbacks->SHA3_shake128_inc_ctx_release(state);
+}
+
+void OQS_SHA3_shake128_inc_ctx_clone(OQS_SHA3_shake128_inc_ctx *dest, const OQS_SHA3_shake128_inc_ctx *src) {
+ callbacks->SHA3_shake128_inc_ctx_clone(dest, src);
+}
+
+void OQS_SHA3_shake128_inc_ctx_reset(OQS_SHA3_shake128_inc_ctx *state) {
+ callbacks->SHA3_shake128_inc_ctx_reset(state);
+}
+
+void OQS_SHA3_shake256(uint8_t *output, size_t outlen, const uint8_t *input, size_t inplen) {
+ callbacks->SHA3_shake256(output, outlen, input, inplen);
+}
+
+void OQS_SHA3_shake256_inc_init(OQS_SHA3_shake256_inc_ctx *state) {
+ callbacks->SHA3_shake256_inc_init(state);
+}
+
+void OQS_SHA3_shake256_inc_absorb(OQS_SHA3_shake256_inc_ctx *state, const uint8_t *input, size_t inlen) {
+ callbacks->SHA3_shake256_inc_absorb(state, input, inlen);
+}
+
+void OQS_SHA3_shake256_inc_finalize(OQS_SHA3_shake256_inc_ctx *state) {
+ callbacks->SHA3_shake256_inc_finalize(state);
+}
+
+void OQS_SHA3_shake256_inc_squeeze(uint8_t *output, size_t outlen, OQS_SHA3_shake256_inc_ctx *state) {
+ callbacks->SHA3_shake256_inc_squeeze(output, outlen, state);
+}
+
+void OQS_SHA3_shake256_inc_ctx_release(OQS_SHA3_shake256_inc_ctx *state) {
+ callbacks->SHA3_shake256_inc_ctx_release(state);
+}
+
+void OQS_SHA3_shake256_inc_ctx_clone(OQS_SHA3_shake256_inc_ctx *dest, const OQS_SHA3_shake256_inc_ctx *src) {
+ callbacks->SHA3_shake256_inc_ctx_clone(dest, src);
+}
+
+void OQS_SHA3_shake256_inc_ctx_reset(OQS_SHA3_shake256_inc_ctx *state) {
+ callbacks->SHA3_shake256_inc_ctx_reset(state);
+}
diff --git a/src/common/sha3/sha3.h b/src/common/sha3/sha3.h
index d66c7289..ef259f42 100644
--- a/src/common/sha3/sha3.h
+++ b/src/common/sha3/sha3.h
@@ -18,6 +18,8 @@
#include <stddef.h>
#include <stdint.h>
+#include <oqs/common.h>
+
#if defined(__cplusplus)
extern "C" {
#endif
@@ -421,6 +423,205 @@ void OQS_SHA3_shake256_inc_ctx_clone(OQS_SHA3_shake256_inc_ctx *dest, const OQS_
*/
void OQS_SHA3_shake256_inc_ctx_reset(OQS_SHA3_shake256_inc_ctx *state);
+/** Data structure implemented by cryptographic provider for SHA-3 operations.
+ */
+struct OQS_SHA3_callbacks {
+ /**
+ * Implementation of function OQS_SHA3_sha3_256.
+ */
+ void (*SHA3_sha3_256)(uint8_t *output, const uint8_t *input, size_t inplen);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_256_inc_init.
+ */
+ void (*SHA3_sha3_256_inc_init)(OQS_SHA3_sha3_256_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_256_inc_absorb.
+ */
+ void (*SHA3_sha3_256_inc_absorb)(OQS_SHA3_sha3_256_inc_ctx *state, const uint8_t *input, size_t inlen);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_256_inc_finalize.
+ */
+ void (*SHA3_sha3_256_inc_finalize)(uint8_t *output, OQS_SHA3_sha3_256_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_256_inc_ctx_release.
+ */
+ void (*SHA3_sha3_256_inc_ctx_release)(OQS_SHA3_sha3_256_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_256_inc_ctx_reset.
+ */
+ void (*SHA3_sha3_256_inc_ctx_reset)(OQS_SHA3_sha3_256_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_256_inc_ctx_clone.
+ */
+ void (*SHA3_sha3_256_inc_ctx_clone)(OQS_SHA3_sha3_256_inc_ctx *dest, const OQS_SHA3_sha3_256_inc_ctx *src);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_384.
+ */
+ void (*SHA3_sha3_384)(uint8_t *output, const uint8_t *input, size_t inplen);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_384_inc_init.
+ */
+ void (*SHA3_sha3_384_inc_init)(OQS_SHA3_sha3_384_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_384_inc_absorb.
+ */
+ void (*SHA3_sha3_384_inc_absorb)(OQS_SHA3_sha3_384_inc_ctx *state, const uint8_t *input, size_t inlen);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_384_inc_finalize.
+ */
+ void (*SHA3_sha3_384_inc_finalize)(uint8_t *output, OQS_SHA3_sha3_384_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_384_inc_ctx_release.
+ */
+ void (*SHA3_sha3_384_inc_ctx_release)(OQS_SHA3_sha3_384_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_384_inc_ctx_reset.
+ */
+ void (*SHA3_sha3_384_inc_ctx_reset)(OQS_SHA3_sha3_384_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_384_inc_ctx_clone.
+ */
+ void (*SHA3_sha3_384_inc_ctx_clone)(OQS_SHA3_sha3_384_inc_ctx *dest, const OQS_SHA3_sha3_384_inc_ctx *src);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_512.
+ */
+ void (*SHA3_sha3_512)(uint8_t *output, const uint8_t *input, size_t inplen);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_512_inc_init.
+ */
+ void (*SHA3_sha3_512_inc_init)(OQS_SHA3_sha3_512_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_512_inc_absorb.
+ */
+ void (*SHA3_sha3_512_inc_absorb)(OQS_SHA3_sha3_512_inc_ctx *state, const uint8_t *input, size_t inlen);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_512_inc_finalize.
+ */
+ void (*SHA3_sha3_512_inc_finalize)(uint8_t *output, OQS_SHA3_sha3_512_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_512_inc_ctx_release.
+ */
+ void (*SHA3_sha3_512_inc_ctx_release)(OQS_SHA3_sha3_512_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_512_inc_ctx_reset.
+ */
+ void (*SHA3_sha3_512_inc_ctx_reset)(OQS_SHA3_sha3_512_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_sha3_512_inc_ctx_clone.
+ */
+ void (*SHA3_sha3_512_inc_ctx_clone)(OQS_SHA3_sha3_512_inc_ctx *dest, const OQS_SHA3_sha3_512_inc_ctx *src);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128.
+ */
+ void (*SHA3_shake128)(uint8_t *output, size_t outlen, const uint8_t *input, size_t inplen);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_inc_init.
+ */
+ void (*SHA3_shake128_inc_init)(OQS_SHA3_shake128_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_inc_absorb.
+ */
+ void (*SHA3_shake128_inc_absorb)(OQS_SHA3_shake128_inc_ctx *state, const uint8_t *input, size_t inlen);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_inc_finalize.
+ */
+ void (*SHA3_shake128_inc_finalize)(OQS_SHA3_shake128_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_inc_squeeze.
+ */
+ void (*SHA3_shake128_inc_squeeze)(uint8_t *output, size_t outlen, OQS_SHA3_shake128_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_inc_ctx_release.
+ */
+ void (*SHA3_shake128_inc_ctx_release)(OQS_SHA3_shake128_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_inc_ctx_clone.
+ */
+ void (*SHA3_shake128_inc_ctx_clone)(OQS_SHA3_shake128_inc_ctx *dest, const OQS_SHA3_shake128_inc_ctx *src);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_inc_ctx_reset.
+ */
+ void (*SHA3_shake128_inc_ctx_reset)(OQS_SHA3_shake128_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256.
+ */
+ void (*SHA3_shake256)(uint8_t *output, size_t outlen, const uint8_t *input, size_t inplen);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_inc_init.
+ */
+ void (*SHA3_shake256_inc_init)(OQS_SHA3_shake256_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_inc_absorb.
+ */
+ void (*SHA3_shake256_inc_absorb)(OQS_SHA3_shake256_inc_ctx *state, const uint8_t *input, size_t inlen);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_inc_finalize.
+ */
+ void (*SHA3_shake256_inc_finalize)(OQS_SHA3_shake256_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_inc_squeeze.
+ */
+ void (*SHA3_shake256_inc_squeeze)(uint8_t *output, size_t outlen, OQS_SHA3_shake256_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_inc_ctx_release.
+ */
+ void (*SHA3_shake256_inc_ctx_release)(OQS_SHA3_shake256_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_inc_ctx_clone.
+ */
+ void (*SHA3_shake256_inc_ctx_clone)(OQS_SHA3_shake256_inc_ctx *dest, const OQS_SHA3_shake256_inc_ctx *src);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_inc_ctx_reset.
+ */
+ void (*SHA3_shake256_inc_ctx_reset)(OQS_SHA3_shake256_inc_ctx *state);
+};
+
+/**
+ * Set callback functions for SHA3 operations.
+ *
+ * This function may be called before OQS_init to switch the
+ * cryptographic provider for SHA3 operations. If it is not called,
+ * the default provider determined at build time will be used.
+ *
+ * @param new_callbacks Callback functions defined in OQS_SHA3_callbacks struct
+ */
+OQS_API void OQS_SHA3_set_callbacks(struct OQS_SHA3_callbacks *new_callbacks);
#if defined(__cplusplus)
} // extern "C"
diff --git a/src/common/sha3/sha3x4.c b/src/common/sha3/sha3x4.c
new file mode 100644
index 00000000..b41ea08d
--- /dev/null
+++ b/src/common/sha3/sha3x4.c
@@ -0,0 +1,77 @@
+// SPDX-License-Identifier: MIT
+
+#include <oqs/oqs.h>
+
+#include "sha3x4.h"
+
+extern struct OQS_SHA3_x4_callbacks sha3_x4_default_callbacks;
+
+static struct OQS_SHA3_x4_callbacks *callbacks = &sha3_x4_default_callbacks;
+
+OQS_API void OQS_SHA3_x4_set_callbacks(struct OQS_SHA3_x4_callbacks *new_callbacks) {
+ callbacks = new_callbacks;
+}
+
+void OQS_SHA3_shake128_x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inlen) {
+ callbacks->SHA3_shake128_x4(out0, out1, out2, out3, outlen, in0, in1, in2, in3, inlen);
+}
+
+void OQS_SHA3_shake128_x4_inc_init(OQS_SHA3_shake128_x4_inc_ctx *state) {
+ callbacks->SHA3_shake128_x4_inc_init(state);
+}
+
+void OQS_SHA3_shake128_x4_inc_absorb(OQS_SHA3_shake128_x4_inc_ctx *state, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inlen) {
+ callbacks->SHA3_shake128_x4_inc_absorb(state, in0, in1, in2, in3, inlen);
+}
+
+void OQS_SHA3_shake128_x4_inc_finalize(OQS_SHA3_shake128_x4_inc_ctx *state) {
+ callbacks->SHA3_shake128_x4_inc_finalize(state);
+}
+
+void OQS_SHA3_shake128_x4_inc_squeeze(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, OQS_SHA3_shake128_x4_inc_ctx *state) {
+ callbacks->SHA3_shake128_x4_inc_squeeze(out0, out1, out2, out3, outlen, state);
+}
+
+void OQS_SHA3_shake128_x4_inc_ctx_release(OQS_SHA3_shake128_x4_inc_ctx *state) {
+ callbacks->SHA3_shake128_x4_inc_ctx_release(state);
+}
+
+void OQS_SHA3_shake128_x4_inc_ctx_clone(OQS_SHA3_shake128_x4_inc_ctx *dest, const OQS_SHA3_shake128_x4_inc_ctx *src) {
+ callbacks->SHA3_shake128_x4_inc_ctx_clone(dest, src);
+}
+
+void OQS_SHA3_shake128_x4_inc_ctx_reset(OQS_SHA3_shake128_x4_inc_ctx *state) {
+ callbacks->SHA3_shake128_x4_inc_ctx_reset(state);
+}
+
+void OQS_SHA3_shake256_x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inlen) {
+ callbacks->SHA3_shake256_x4(out0, out1, out2, out3, outlen, in0, in1, in2, in3, inlen);
+}
+
+void OQS_SHA3_shake256_x4_inc_init(OQS_SHA3_shake256_x4_inc_ctx *state) {
+ callbacks->SHA3_shake256_x4_inc_init(state);
+}
+
+void OQS_SHA3_shake256_x4_inc_absorb(OQS_SHA3_shake256_x4_inc_ctx *state, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inlen) {
+ callbacks->SHA3_shake256_x4_inc_absorb(state, in0, in1, in2, in3, inlen);
+}
+
+void OQS_SHA3_shake256_x4_inc_finalize(OQS_SHA3_shake256_x4_inc_ctx *state) {
+ callbacks->SHA3_shake256_x4_inc_finalize(state);
+}
+
+void OQS_SHA3_shake256_x4_inc_squeeze(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, OQS_SHA3_shake256_x4_inc_ctx *state) {
+ callbacks->SHA3_shake256_x4_inc_squeeze(out0, out1, out2, out3, outlen, state);
+}
+
+void OQS_SHA3_shake256_x4_inc_ctx_release(OQS_SHA3_shake256_x4_inc_ctx *state) {
+ callbacks->SHA3_shake256_x4_inc_ctx_release(state);
+}
+
+void OQS_SHA3_shake256_x4_inc_ctx_clone(OQS_SHA3_shake256_x4_inc_ctx *dest, const OQS_SHA3_shake256_x4_inc_ctx *src) {
+ callbacks->SHA3_shake256_x4_inc_ctx_clone(dest, src);
+}
+
+void OQS_SHA3_shake256_x4_inc_ctx_reset(OQS_SHA3_shake256_x4_inc_ctx *state) {
+ callbacks->SHA3_shake256_x4_inc_ctx_reset(state);
+}
diff --git a/src/common/sha3/sha3x4.h b/src/common/sha3/sha3x4.h
index cef4e675..1dc3c79e 100644
--- a/src/common/sha3/sha3x4.h
+++ b/src/common/sha3/sha3x4.h
@@ -18,6 +18,8 @@
#include <stddef.h>
#include <stdint.h>
+#include <oqs/common.h>
+
#if defined(__cplusplus)
extern "C" {
#endif
@@ -255,6 +257,149 @@ void OQS_SHA3_shake256_x4_inc_ctx_clone(
*/
void OQS_SHA3_shake256_x4_inc_ctx_reset(OQS_SHA3_shake256_x4_inc_ctx *state);
+/** Data structure implemented by cryptographic provider for the
+ * four-way parallel incremental SHAKE-256 operations.
+ */
+struct OQS_SHA3_x4_callbacks {
+ /**
+ * Implementation of function OQS_SHA3_shake128_x4.
+ */
+ void (*SHA3_shake128_x4)(
+ uint8_t *out0,
+ uint8_t *out1,
+ uint8_t *out2,
+ uint8_t *out3,
+ size_t outlen,
+ const uint8_t *in0,
+ const uint8_t *in1,
+ const uint8_t *in2,
+ const uint8_t *in3,
+ size_t inlen);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_x4_inc_init.
+ */
+ void (*SHA3_shake128_x4_inc_init)(OQS_SHA3_shake128_x4_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_x4_inc_absorb.
+ */
+ void (*SHA3_shake128_x4_inc_absorb)(
+ OQS_SHA3_shake128_x4_inc_ctx *state,
+ const uint8_t *in0,
+ const uint8_t *in1,
+ const uint8_t *in2,
+ const uint8_t *in3,
+ size_t inlen);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_x4_inc_finalize.
+ */
+ void (*SHA3_shake128_x4_inc_finalize)(OQS_SHA3_shake128_x4_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_x4_inc_squeeze.
+ */
+ void (*SHA3_shake128_x4_inc_squeeze)(
+ uint8_t *out0,
+ uint8_t *out1,
+ uint8_t *out2,
+ uint8_t *out3,
+ size_t outlen,
+ OQS_SHA3_shake128_x4_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_x4_inc_ctx_release.
+ */
+ void (*SHA3_shake128_x4_inc_ctx_release)(OQS_SHA3_shake128_x4_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_x4_inc_ctx_clone.
+ */
+ void (*SHA3_shake128_x4_inc_ctx_clone)(
+ OQS_SHA3_shake128_x4_inc_ctx *dest,
+ const OQS_SHA3_shake128_x4_inc_ctx *src);
+
+ /**
+ * Implementation of function OQS_SHA3_shake128_x4_inc_ctx_reset.
+ */
+ void (*SHA3_shake128_x4_inc_ctx_reset)(OQS_SHA3_shake128_x4_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_x4.
+ */
+ void (*SHA3_shake256_x4)(
+ uint8_t *out0,
+ uint8_t *out1,
+ uint8_t *out2,
+ uint8_t *out3,
+ size_t outlen,
+ const uint8_t *in0,
+ const uint8_t *in1,
+ const uint8_t *in2,
+ const uint8_t *in3,
+ size_t inlen);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_x4_inc_init.
+ */
+ void (*SHA3_shake256_x4_inc_init)(OQS_SHA3_shake256_x4_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_x4_inc_absorb.
+ */
+ void (*SHA3_shake256_x4_inc_absorb)(
+ OQS_SHA3_shake256_x4_inc_ctx *state,
+ const uint8_t *in0,
+ const uint8_t *in1,
+ const uint8_t *in2,
+ const uint8_t *in3,
+ size_t inlen);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_x4_inc_finalize.
+ */
+ void (*SHA3_shake256_x4_inc_finalize)(OQS_SHA3_shake256_x4_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_x4_inc_squeeze.
+ */
+ void (*SHA3_shake256_x4_inc_squeeze)(
+ uint8_t *out0,
+ uint8_t *out1,
+ uint8_t *out2,
+ uint8_t *out3,
+ size_t outlen,
+ OQS_SHA3_shake256_x4_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_x4_inc_ctx_release.
+ */
+ void (*SHA3_shake256_x4_inc_ctx_release)(OQS_SHA3_shake256_x4_inc_ctx *state);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_x4_inc_ctx_clone.
+ */
+ void (*SHA3_shake256_x4_inc_ctx_clone)(
+ OQS_SHA3_shake256_x4_inc_ctx *dest,
+ const OQS_SHA3_shake256_x4_inc_ctx *src);
+
+ /**
+ * Implementation of function OQS_SHA3_shake256_x4_inc_ctx_reset.
+ */
+ void (*SHA3_shake256_x4_inc_ctx_reset)(OQS_SHA3_shake256_x4_inc_ctx *state);
+};
+
+/**
+ * Set callback functions for 4-parallel SHA3 operations.
+ *
+ * This function may be called before OQS_init to switch the
+ * cryptographic provider for 4-parallel SHA3 operations. If it is not
+ * called, the default provider determined at build time will be used.
+ *
+ * @param new_callbacks Callback functions defined in OQS_SHA3_x4_callbacks struct
+ */
+OQS_API void OQS_SHA3_x4_set_callbacks(struct OQS_SHA3_x4_callbacks *new_callbacks);
#if defined(__cplusplus)
} // extern "C"
diff --git a/src/common/sha3/xkcp_sha3.c b/src/common/sha3/xkcp_sha3.c
index e9192862..2fce9d9f 100644
--- a/src/common/sha3/xkcp_sha3.c
+++ b/src/common/sha3/xkcp_sha3.c
@@ -190,7 +190,7 @@ static void keccak_inc_squeeze(uint8_t *h, size_t outlen,
/* SHA3-256 */
-void OQS_SHA3_sha3_256(uint8_t *output, const uint8_t *input, size_t inlen) {
+static void SHA3_sha3_256(uint8_t *output, const uint8_t *input, size_t inlen) {
OQS_SHA3_sha3_256_inc_ctx s;
OQS_SHA3_sha3_256_inc_init(&s);
OQS_SHA3_sha3_256_inc_absorb(&s, input, inlen);
@@ -198,7 +198,7 @@ void OQS_SHA3_sha3_256(uint8_t *output, const uint8_t *input, size_t inlen) {
OQS_SHA3_sha3_256_inc_ctx_release(&s);
}
-void OQS_SHA3_sha3_256_inc_init(OQS_SHA3_sha3_256_inc_ctx *state) {
+static void SHA3_sha3_256_inc_init(OQS_SHA3_sha3_256_inc_ctx *state) {
state->ctx = OQS_MEM_aligned_alloc(KECCAK_CTX_ALIGNMENT, KECCAK_CTX_BYTES);
if (state->ctx == NULL) {
exit(111);
@@ -206,30 +206,30 @@ void OQS_SHA3_sha3_256_inc_init(OQS_SHA3_sha3_256_inc_ctx *state) {
keccak_inc_reset((uint64_t *)state->ctx);
}
-void OQS_SHA3_sha3_256_inc_absorb(OQS_SHA3_sha3_256_inc_ctx *state, const uint8_t *input, size_t inlen) {
+static void SHA3_sha3_256_inc_absorb(OQS_SHA3_sha3_256_inc_ctx *state, const uint8_t *input, size_t inlen) {
keccak_inc_absorb((uint64_t *)state->ctx, OQS_SHA3_SHA3_256_RATE, input, inlen);
}
-void OQS_SHA3_sha3_256_inc_finalize(uint8_t *output, OQS_SHA3_sha3_256_inc_ctx *state) {
+static void SHA3_sha3_256_inc_finalize(uint8_t *output, OQS_SHA3_sha3_256_inc_ctx *state) {
keccak_inc_finalize((uint64_t *)state->ctx, OQS_SHA3_SHA3_256_RATE, 0x06);
keccak_inc_squeeze(output, 32, (uint64_t *)state->ctx, OQS_SHA3_SHA3_256_RATE);
}
-void OQS_SHA3_sha3_256_inc_ctx_release(OQS_SHA3_sha3_256_inc_ctx *state) {
+static void SHA3_sha3_256_inc_ctx_release(OQS_SHA3_sha3_256_inc_ctx *state) {
OQS_MEM_aligned_free(state->ctx);
}
-void OQS_SHA3_sha3_256_inc_ctx_clone(OQS_SHA3_sha3_256_inc_ctx *dest, const OQS_SHA3_sha3_256_inc_ctx *src) {
+static void SHA3_sha3_256_inc_ctx_clone(OQS_SHA3_sha3_256_inc_ctx *dest, const OQS_SHA3_sha3_256_inc_ctx *src) {
memcpy(dest->ctx, src->ctx, KECCAK_CTX_BYTES);
}
-void OQS_SHA3_sha3_256_inc_ctx_reset(OQS_SHA3_sha3_256_inc_ctx *state) {
+static void SHA3_sha3_256_inc_ctx_reset(OQS_SHA3_sha3_256_inc_ctx *state) {
keccak_inc_reset((uint64_t *)state->ctx);
}
/* SHA3-384 */
-void OQS_SHA3_sha3_384(uint8_t *output, const uint8_t *input, size_t inlen) {
+static void SHA3_sha3_384(uint8_t *output, const uint8_t *input, size_t inlen) {
OQS_SHA3_sha3_384_inc_ctx s;
OQS_SHA3_sha3_384_inc_init(&s);
OQS_SHA3_sha3_384_inc_absorb(&s, input, inlen);
@@ -237,7 +237,7 @@ void OQS_SHA3_sha3_384(uint8_t *output, const uint8_t *input, size_t inlen) {
OQS_SHA3_sha3_384_inc_ctx_release(&s);
}
-void OQS_SHA3_sha3_384_inc_init(OQS_SHA3_sha3_384_inc_ctx *state) {
+static void SHA3_sha3_384_inc_init(OQS_SHA3_sha3_384_inc_ctx *state) {
state->ctx = OQS_MEM_aligned_alloc(KECCAK_CTX_ALIGNMENT, KECCAK_CTX_BYTES);
if (state->ctx == NULL) {
exit(111);
@@ -245,30 +245,30 @@ void OQS_SHA3_sha3_384_inc_init(OQS_SHA3_sha3_384_inc_ctx *state) {
keccak_inc_reset((uint64_t *)state->ctx);
}
-void OQS_SHA3_sha3_384_inc_absorb(OQS_SHA3_sha3_384_inc_ctx *state, const uint8_t *input, size_t inlen) {
+static void SHA3_sha3_384_inc_absorb(OQS_SHA3_sha3_384_inc_ctx *state, const uint8_t *input, size_t inlen) {
keccak_inc_absorb((uint64_t *)state->ctx, OQS_SHA3_SHA3_384_RATE, input, inlen);
}
-void OQS_SHA3_sha3_384_inc_finalize(uint8_t *output, OQS_SHA3_sha3_384_inc_ctx *state) {
+static void SHA3_sha3_384_inc_finalize(uint8_t *output, OQS_SHA3_sha3_384_inc_ctx *state) {
keccak_inc_finalize((uint64_t *)state->ctx, OQS_SHA3_SHA3_384_RATE, 0x06);
keccak_inc_squeeze(output, 48, (uint64_t *)state->ctx, OQS_SHA3_SHA3_384_RATE);
}
-void OQS_SHA3_sha3_384_inc_ctx_release(OQS_SHA3_sha3_384_inc_ctx *state) {
+static void SHA3_sha3_384_inc_ctx_release(OQS_SHA3_sha3_384_inc_ctx *state) {
OQS_MEM_aligned_free(state->ctx);
}
-void OQS_SHA3_sha3_384_inc_ctx_clone(OQS_SHA3_sha3_384_inc_ctx *dest, const OQS_SHA3_sha3_384_inc_ctx *src) {
+static void SHA3_sha3_384_inc_ctx_clone(OQS_SHA3_sha3_384_inc_ctx *dest, const OQS_SHA3_sha3_384_inc_ctx *src) {
memcpy(dest->ctx, src->ctx, KECCAK_CTX_BYTES);
}
-void OQS_SHA3_sha3_384_inc_ctx_reset(OQS_SHA3_sha3_384_inc_ctx *state) {
+static void SHA3_sha3_384_inc_ctx_reset(OQS_SHA3_sha3_384_inc_ctx *state) {
keccak_inc_reset((uint64_t *)state->ctx);
}
/* SHA3-512 */
-void OQS_SHA3_sha3_512(uint8_t *output, const uint8_t *input, size_t inlen) {
+static void SHA3_sha3_512(uint8_t *output, const uint8_t *input, size_t inlen) {
OQS_SHA3_sha3_512_inc_ctx s;
OQS_SHA3_sha3_512_inc_init(&s);
OQS_SHA3_sha3_512_inc_absorb(&s, input, inlen);
@@ -276,7 +276,7 @@ void OQS_SHA3_sha3_512(uint8_t *output, const uint8_t *input, size_t inlen) {
OQS_SHA3_sha3_512_inc_ctx_release(&s);
}
-void OQS_SHA3_sha3_512_inc_init(OQS_SHA3_sha3_512_inc_ctx *state) {
+static void SHA3_sha3_512_inc_init(OQS_SHA3_sha3_512_inc_ctx *state) {
state->ctx = OQS_MEM_aligned_alloc(KECCAK_CTX_ALIGNMENT, KECCAK_CTX_BYTES);
if (state->ctx == NULL) {
exit(111);
@@ -284,30 +284,30 @@ void OQS_SHA3_sha3_512_inc_init(OQS_SHA3_sha3_512_inc_ctx *state) {
keccak_inc_reset((uint64_t *)state->ctx);
}
-void OQS_SHA3_sha3_512_inc_absorb(OQS_SHA3_sha3_512_inc_ctx *state, const uint8_t *input, size_t inlen) {
+static void SHA3_sha3_512_inc_absorb(OQS_SHA3_sha3_512_inc_ctx *state, const uint8_t *input, size_t inlen) {
keccak_inc_absorb((uint64_t *)state->ctx, OQS_SHA3_SHA3_512_RATE, input, inlen);
}
-void OQS_SHA3_sha3_512_inc_finalize(uint8_t *output, OQS_SHA3_sha3_512_inc_ctx *state) {
+static void SHA3_sha3_512_inc_finalize(uint8_t *output, OQS_SHA3_sha3_512_inc_ctx *state) {
keccak_inc_finalize((uint64_t *)state->ctx, OQS_SHA3_SHA3_512_RATE, 0x06);
keccak_inc_squeeze(output, 64, (uint64_t *)state->ctx, OQS_SHA3_SHA3_512_RATE);
}
-void OQS_SHA3_sha3_512_inc_ctx_release(OQS_SHA3_sha3_512_inc_ctx *state) {
+static void SHA3_sha3_512_inc_ctx_release(OQS_SHA3_sha3_512_inc_ctx *state) {
OQS_MEM_aligned_free(state->ctx);
}
-void OQS_SHA3_sha3_512_inc_ctx_clone(OQS_SHA3_sha3_512_inc_ctx *dest, const OQS_SHA3_sha3_512_inc_ctx *src) {
+static void SHA3_sha3_512_inc_ctx_clone(OQS_SHA3_sha3_512_inc_ctx *dest, const OQS_SHA3_sha3_512_inc_ctx *src) {
memcpy(dest->ctx, src->ctx, KECCAK_CTX_BYTES);
}
-void OQS_SHA3_sha3_512_inc_ctx_reset(OQS_SHA3_sha3_512_inc_ctx *state) {
+static void SHA3_sha3_512_inc_ctx_reset(OQS_SHA3_sha3_512_inc_ctx *state) {
keccak_inc_reset((uint64_t *)state->ctx);
}
/* SHAKE128 */
-void OQS_SHA3_shake128(uint8_t *output, size_t outlen, const uint8_t *input, size_t inlen) {
+static void SHA3_shake128(uint8_t *output, size_t outlen, const uint8_t *input, size_t inlen) {
OQS_SHA3_shake128_inc_ctx s;
OQS_SHA3_shake128_inc_init(&s);
OQS_SHA3_shake128_inc_absorb(&s, input, inlen);
@@ -318,7 +318,7 @@ void OQS_SHA3_shake128(uint8_t *output, size_t outlen, const uint8_t *input, siz
/* SHAKE128 incremental */
-void OQS_SHA3_shake128_inc_init(OQS_SHA3_shake128_inc_ctx *state) {
+static void SHA3_shake128_inc_init(OQS_SHA3_shake128_inc_ctx *state) {
state->ctx = OQS_MEM_aligned_alloc(KECCAK_CTX_ALIGNMENT, KECCAK_CTX_BYTES);
if (state->ctx == NULL) {
exit(111);
@@ -326,33 +326,33 @@ void OQS_SHA3_shake128_inc_init(OQS_SHA3_shake128_inc_ctx *state) {
keccak_inc_reset((uint64_t *)state->ctx);
}
-void OQS_SHA3_shake128_inc_absorb(OQS_SHA3_shake128_inc_ctx *state, const uint8_t *input, size_t inlen) {
+static void SHA3_shake128_inc_absorb(OQS_SHA3_shake128_inc_ctx *state, const uint8_t *input, size_t inlen) {
keccak_inc_absorb((uint64_t *)state->ctx, OQS_SHA3_SHAKE128_RATE, input, inlen);
}
-void OQS_SHA3_shake128_inc_finalize(OQS_SHA3_shake128_inc_ctx *state) {
+static void SHA3_shake128_inc_finalize(OQS_SHA3_shake128_inc_ctx *state) {
keccak_inc_finalize((uint64_t *)state->ctx, OQS_SHA3_SHAKE128_RATE, 0x1F);
}
-void OQS_SHA3_shake128_inc_squeeze(uint8_t *output, size_t outlen, OQS_SHA3_shake128_inc_ctx *state) {
+static void SHA3_shake128_inc_squeeze(uint8_t *output, size_t outlen, OQS_SHA3_shake128_inc_ctx *state) {
keccak_inc_squeeze(output, outlen, (uint64_t *)state->ctx, OQS_SHA3_SHAKE128_RATE);
}
-void OQS_SHA3_shake128_inc_ctx_clone(OQS_SHA3_shake128_inc_ctx *dest, const OQS_SHA3_shake128_inc_ctx *src) {
+static void SHA3_shake128_inc_ctx_clone(OQS_SHA3_shake128_inc_ctx *dest, const OQS_SHA3_shake128_inc_ctx *src) {
memcpy(dest->ctx, src->ctx, KECCAK_CTX_BYTES);
}
-void OQS_SHA3_shake128_inc_ctx_release(OQS_SHA3_shake128_inc_ctx *state) {
+static void SHA3_shake128_inc_ctx_release(OQS_SHA3_shake128_inc_ctx *state) {
OQS_MEM_aligned_free(state->ctx);
}
-void OQS_SHA3_shake128_inc_ctx_reset(OQS_SHA3_shake128_inc_ctx *state) {
+static void SHA3_shake128_inc_ctx_reset(OQS_SHA3_shake128_inc_ctx *state) {
keccak_inc_reset((uint64_t *)state->ctx);
}
/* SHAKE256 */
-void OQS_SHA3_shake256(uint8_t *output, size_t outlen, const uint8_t *input, size_t inlen) {
+static void SHA3_shake256(uint8_t *output, size_t outlen, const uint8_t *input, size_t inlen) {
OQS_SHA3_shake256_inc_ctx s;
OQS_SHA3_shake256_inc_init(&s);
OQS_SHA3_shake256_inc_absorb(&s, input, inlen);
@@ -363,7 +363,7 @@ void OQS_SHA3_shake256(uint8_t *output, size_t outlen, const uint8_t *input, siz
/* SHAKE256 incremental */
-void OQS_SHA3_shake256_inc_init(OQS_SHA3_shake256_inc_ctx *state) {
+static void SHA3_shake256_inc_init(OQS_SHA3_shake256_inc_ctx *state) {
state->ctx = OQS_MEM_aligned_alloc(KECCAK_CTX_ALIGNMENT, KECCAK_CTX_BYTES);
if (state->ctx == NULL) {
exit(111);
@@ -371,26 +371,68 @@ void OQS_SHA3_shake256_inc_init(OQS_SHA3_shake256_inc_ctx *state) {
keccak_inc_reset((uint64_t *)state->ctx);
}
-void OQS_SHA3_shake256_inc_absorb(OQS_SHA3_shake256_inc_ctx *state, const uint8_t *input, size_t inlen) {
+static void SHA3_shake256_inc_absorb(OQS_SHA3_shake256_inc_ctx *state, const uint8_t *input, size_t inlen) {
keccak_inc_absorb((uint64_t *)state->ctx, OQS_SHA3_SHAKE256_RATE, input, inlen);
}
-void OQS_SHA3_shake256_inc_finalize(OQS_SHA3_shake256_inc_ctx *state) {
+static void SHA3_shake256_inc_finalize(OQS_SHA3_shake256_inc_ctx *state) {
keccak_inc_finalize((uint64_t *)state->ctx, OQS_SHA3_SHAKE256_RATE, 0x1F);
}
-void OQS_SHA3_shake256_inc_squeeze(uint8_t *output, size_t outlen, OQS_SHA3_shake256_inc_ctx *state) {
+static void SHA3_shake256_inc_squeeze(uint8_t *output, size_t outlen, OQS_SHA3_shake256_inc_ctx *state) {
keccak_inc_squeeze(output, outlen, state->ctx, OQS_SHA3_SHAKE256_RATE);
}
-void OQS_SHA3_shake256_inc_ctx_release(OQS_SHA3_shake256_inc_ctx *state) {
+static void SHA3_shake256_inc_ctx_release(OQS_SHA3_shake256_inc_ctx *state) {
OQS_MEM_aligned_free(state->ctx);
}
-void OQS_SHA3_shake256_inc_ctx_clone(OQS_SHA3_shake256_inc_ctx *dest, const OQS_SHA3_shake256_inc_ctx *src) {
+static void SHA3_shake256_inc_ctx_clone(OQS_SHA3_shake256_inc_ctx *dest, const OQS_SHA3_shake256_inc_ctx *src) {
memcpy(dest->ctx, src->ctx, KECCAK_CTX_BYTES);
}
-void OQS_SHA3_shake256_inc_ctx_reset(OQS_SHA3_shake256_inc_ctx *state) {
+static void SHA3_shake256_inc_ctx_reset(OQS_SHA3_shake256_inc_ctx *state) {
keccak_inc_reset((uint64_t *)state->ctx);
}
+
+extern struct OQS_SHA3_callbacks sha3_default_callbacks;
+
+struct OQS_SHA3_callbacks sha3_default_callbacks = {
+ SHA3_sha3_256,
+ SHA3_sha3_256_inc_init,
+ SHA3_sha3_256_inc_absorb,
+ SHA3_sha3_256_inc_finalize,
+ SHA3_sha3_256_inc_ctx_release,
+ SHA3_sha3_256_inc_ctx_reset,
+ SHA3_sha3_256_inc_ctx_clone,
+ SHA3_sha3_384,
+ SHA3_sha3_384_inc_init,
+ SHA3_sha3_384_inc_absorb,
+ SHA3_sha3_384_inc_finalize,
+ SHA3_sha3_384_inc_ctx_release,
+ SHA3_sha3_384_inc_ctx_reset,
+ SHA3_sha3_384_inc_ctx_clone,
+ SHA3_sha3_512,
+ SHA3_sha3_512_inc_init,
+ SHA3_sha3_512_inc_absorb,
+ SHA3_sha3_512_inc_finalize,
+ SHA3_sha3_512_inc_ctx_release,
+ SHA3_sha3_512_inc_ctx_reset,
+ SHA3_sha3_512_inc_ctx_clone,
+ SHA3_shake128,
+ SHA3_shake128_inc_init,
+ SHA3_shake128_inc_absorb,
+ SHA3_shake128_inc_finalize,
+ SHA3_shake128_inc_squeeze,
+ SHA3_shake128_inc_ctx_release,
+ SHA3_shake128_inc_ctx_clone,
+ SHA3_shake128_inc_ctx_reset,
+ SHA3_shake256,
+ SHA3_shake256_inc_init,
+ SHA3_shake256_inc_absorb,
+ SHA3_shake256_inc_finalize,
+ SHA3_shake256_inc_squeeze,
+ SHA3_shake256_inc_ctx_release,
+ SHA3_shake256_inc_ctx_clone,
+ SHA3_shake256_inc_ctx_reset,
+};
diff --git a/src/common/sha3/xkcp_sha3x4.c b/src/common/sha3/xkcp_sha3x4.c
index fbd9a0e8..8ed5da87 100644
--- a/src/common/sha3/xkcp_sha3x4.c
+++ b/src/common/sha3/xkcp_sha3x4.c
@@ -155,7 +155,7 @@ static void keccak_x4_inc_squeeze(uint8_t *out0, uint8_t *out1, uint8_t *out2, u
/********** SHAKE128 ***********/
-void OQS_SHA3_shake128_x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inlen) {
+static void SHA3_shake128_x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inlen) {
OQS_SHA3_shake128_x4_inc_ctx s;
OQS_SHA3_shake128_x4_inc_init(&s);
OQS_SHA3_shake128_x4_inc_absorb(&s, in0, in1, in2, in3, inlen);
@@ -166,7 +166,7 @@ void OQS_SHA3_shake128_x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *
/* SHAKE128 incremental */
-void OQS_SHA3_shake128_x4_inc_init(OQS_SHA3_shake128_x4_inc_ctx *state) {
+static void SHA3_shake128_x4_inc_init(OQS_SHA3_shake128_x4_inc_ctx *state) {
state->ctx = OQS_MEM_aligned_alloc(KECCAK_X4_CTX_ALIGNMENT, KECCAK_X4_CTX_BYTES);
if (state->ctx == NULL) {
exit(111);
@@ -174,33 +174,33 @@ void OQS_SHA3_shake128_x4_inc_init(OQS_SHA3_shake128_x4_inc_ctx *state) {
keccak_x4_inc_reset((uint64_t *)state->ctx);
}
-void OQS_SHA3_shake128_x4_inc_absorb(OQS_SHA3_shake128_x4_inc_ctx *state, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inlen) {
+static void SHA3_shake128_x4_inc_absorb(OQS_SHA3_shake128_x4_inc_ctx *state, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inlen) {
keccak_x4_inc_absorb((uint64_t *)state->ctx, OQS_SHA3_SHAKE128_RATE, in0, in1, in2, in3, inlen);
}
-void OQS_SHA3_shake128_x4_inc_finalize(OQS_SHA3_shake128_x4_inc_ctx *state) {
+static void SHA3_shake128_x4_inc_finalize(OQS_SHA3_shake128_x4_inc_ctx *state) {
keccak_x4_inc_finalize((uint64_t *)state->ctx, OQS_SHA3_SHAKE128_RATE, 0x1F);
}
-void OQS_SHA3_shake128_x4_inc_squeeze(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, OQS_SHA3_shake128_x4_inc_ctx *state) {
+static void SHA3_shake128_x4_inc_squeeze(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, OQS_SHA3_shake128_x4_inc_ctx *state) {
keccak_x4_inc_squeeze(out0, out1, out2, out3, outlen, (uint64_t *)state->ctx, OQS_SHA3_SHAKE128_RATE);
}
-void OQS_SHA3_shake128_x4_inc_ctx_clone(OQS_SHA3_shake128_x4_inc_ctx *dest, const OQS_SHA3_shake128_x4_inc_ctx *src) {
+static void SHA3_shake128_x4_inc_ctx_clone(OQS_SHA3_shake128_x4_inc_ctx *dest, const OQS_SHA3_shake128_x4_inc_ctx *src) {
memcpy(dest->ctx, src->ctx, KECCAK_X4_CTX_BYTES);
}
-void OQS_SHA3_shake128_x4_inc_ctx_release(OQS_SHA3_shake128_x4_inc_ctx *state) {
+static void SHA3_shake128_x4_inc_ctx_release(OQS_SHA3_shake128_x4_inc_ctx *state) {
OQS_MEM_aligned_free(state->ctx);
}
-void OQS_SHA3_shake128_x4_inc_ctx_reset(OQS_SHA3_shake128_x4_inc_ctx *state) {
+static void SHA3_shake128_x4_inc_ctx_reset(OQS_SHA3_shake128_x4_inc_ctx *state) {
keccak_x4_inc_reset((uint64_t *)state->ctx);
}
/********** SHAKE256 ***********/
-void OQS_SHA3_shake256_x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inlen) {
+static void SHA3_shake256_x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inlen) {
OQS_SHA3_shake256_x4_inc_ctx s;
OQS_SHA3_shake256_x4_inc_init(&s);
OQS_SHA3_shake256_x4_inc_absorb(&s, in0, in1, in2, in3, inlen);
@@ -211,7 +211,7 @@ void OQS_SHA3_shake256_x4(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *
/* SHAKE256 incremental */
-void OQS_SHA3_shake256_x4_inc_init(OQS_SHA3_shake256_x4_inc_ctx *state) {
+static void SHA3_shake256_x4_inc_init(OQS_SHA3_shake256_x4_inc_ctx *state) {
state->ctx = OQS_MEM_aligned_alloc(KECCAK_X4_CTX_ALIGNMENT, KECCAK_X4_CTX_BYTES);
if (state->ctx == NULL) {
exit(111);
@@ -219,26 +219,47 @@ void OQS_SHA3_shake256_x4_inc_init(OQS_SHA3_shake256_x4_inc_ctx *state) {
keccak_x4_inc_reset((uint64_t *)state->ctx);
}
-void OQS_SHA3_shake256_x4_inc_absorb(OQS_SHA3_shake256_x4_inc_ctx *state, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inlen) {
+static void SHA3_shake256_x4_inc_absorb(OQS_SHA3_shake256_x4_inc_ctx *state, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, size_t inlen) {
keccak_x4_inc_absorb((uint64_t *)state->ctx, OQS_SHA3_SHAKE256_RATE, in0, in1, in2, in3, inlen);
}
-void OQS_SHA3_shake256_x4_inc_finalize(OQS_SHA3_shake256_x4_inc_ctx *state) {
+static void SHA3_shake256_x4_inc_finalize(OQS_SHA3_shake256_x4_inc_ctx *state) {
keccak_x4_inc_finalize((uint64_t *)state->ctx, OQS_SHA3_SHAKE256_RATE, 0x1F);
}
-void OQS_SHA3_shake256_x4_inc_squeeze(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, OQS_SHA3_shake256_x4_inc_ctx *state) {
+static void SHA3_shake256_x4_inc_squeeze(uint8_t *out0, uint8_t *out1, uint8_t *out2, uint8_t *out3, size_t outlen, OQS_SHA3_shake256_x4_inc_ctx *state) {
keccak_x4_inc_squeeze(out0, out1, out2, out3, outlen, (uint64_t *)state->ctx, OQS_SHA3_SHAKE256_RATE);
}
-void OQS_SHA3_shake256_x4_inc_ctx_clone(OQS_SHA3_shake256_x4_inc_ctx *dest, const OQS_SHA3_shake256_x4_inc_ctx *src) {
+static void SHA3_shake256_x4_inc_ctx_clone(OQS_SHA3_shake256_x4_inc_ctx *dest, const OQS_SHA3_shake256_x4_inc_ctx *src) {
memcpy(dest->ctx, src->ctx, KECCAK_X4_CTX_BYTES);
}
-void OQS_SHA3_shake256_x4_inc_ctx_release(OQS_SHA3_shake256_x4_inc_ctx *state) {
+static void SHA3_shake256_x4_inc_ctx_release(OQS_SHA3_shake256_x4_inc_ctx *state) {
OQS_MEM_aligned_free(state->ctx);
}
-void OQS_SHA3_shake256_x4_inc_ctx_reset(OQS_SHA3_shake256_x4_inc_ctx *state) {
+static void SHA3_shake256_x4_inc_ctx_reset(OQS_SHA3_shake256_x4_inc_ctx *state) {
keccak_x4_inc_reset((uint64_t *)state->ctx);
}
+
+extern struct OQS_SHA3_x4_callbacks sha3_x4_default_callbacks;
+
+struct OQS_SHA3_x4_callbacks sha3_x4_default_callbacks = {
+ SHA3_shake128_x4,
+ SHA3_shake128_x4_inc_init,
+ SHA3_shake128_x4_inc_absorb,
+ SHA3_shake128_x4_inc_finalize,
+ SHA3_shake128_x4_inc_squeeze,
+ SHA3_shake128_x4_inc_ctx_release,
+ SHA3_shake128_x4_inc_ctx_clone,
+ SHA3_shake128_x4_inc_ctx_reset,
+ SHA3_shake256_x4,
+ SHA3_shake256_x4_inc_init,
+ SHA3_shake256_x4_inc_absorb,
+ SHA3_shake256_x4_inc_finalize,
+ SHA3_shake256_x4_inc_squeeze,
+ SHA3_shake256_x4_inc_ctx_release,
+ SHA3_shake256_x4_inc_ctx_clone,
+ SHA3_shake256_x4_inc_ctx_reset,
+};
diff --git a/src/oqsconfig.h.cmake b/src/oqsconfig.h.cmake
index 165d5473..f3b2e7c4 100644
--- a/src/oqsconfig.h.cmake
+++ b/src/oqsconfig.h.cmake
@@ -22,6 +22,8 @@
#cmakedefine OQS_USE_AES_OPENSSL 1
#cmakedefine OQS_USE_SHA2_OPENSSL 1
#cmakedefine OQS_USE_SHA3_OPENSSL 1
+#cmakedefine OQS_DLOPEN_OPENSSL 1
+#cmakedefine OQS_OPENSSL_CRYPTO_SONAME "@OQS_OPENSSL_CRYPTO_SONAME@"
#cmakedefine OQS_EMBEDDED_BUILD 1
diff --git a/tests/test_aes.c b/tests/test_aes.c
index f1fab56a..4ba265c6 100644
--- a/tests/test_aes.c
+++ b/tests/test_aes.c
@@ -116,9 +116,21 @@ static void speed_aes256(void) {
OQS_AES256_free_schedule(schedule_dec);
}
+extern struct OQS_AES_callbacks aes_default_callbacks;
+
+static bool aes_callback_called = false;
+static void override_AES128_ECB_load_schedule(const uint8_t *key, void **_schedule) {
+ aes_callback_called = true;
+ aes_default_callbacks.AES128_ECB_load_schedule(key, _schedule);
+}
+
int main(int argc, char **argv) {
bool bench = false;
+ struct OQS_AES_callbacks callbacks = aes_default_callbacks;
+ callbacks.AES128_ECB_load_schedule = override_AES128_ECB_load_schedule;
+ OQS_AES_set_callbacks(&callbacks);
+
OQS_init();
for (int i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
@@ -156,6 +168,13 @@ int main(int argc, char **argv) {
OQS_destroy();
return EXIT_FAILURE;
}
+
+ if (!aes_callback_called) {
+ printf("AES callback was not called\n");
+ OQS_destroy();
+ return EXIT_FAILURE;
+ }
+
printf("Tests passed.\n\n");
if (bench) {
diff --git a/tests/test_hash.c b/tests/test_hash.c
index d83f08eb..022fb61a 100644
--- a/tests/test_hash.c
+++ b/tests/test_hash.c
@@ -14,6 +14,8 @@
#define BUFFER_SIZE 30000
+static bool sha2_callback_called = false;
+
static int read_stdin(uint8_t **msg, size_t *msg_len) {
*msg = malloc(BUFFER_SIZE);
if (*msg == NULL) {
@@ -198,7 +200,20 @@ static int do_arbitrary_hash(void (*hash)(uint8_t *, const uint8_t *, size_t), s
return 0;
}
+extern struct OQS_SHA2_callbacks sha2_default_callbacks;
+
+static void override_SHA2_sha256_inc_init(OQS_SHA2_sha256_ctx *state) {
+ sha2_callback_called = true;
+ sha2_default_callbacks.SHA2_sha256_inc_init(state);
+}
+
int main(int argc, char **argv) {
+ int ret;
+ struct OQS_SHA2_callbacks sha2_callbacks = sha2_default_callbacks;
+
+ sha2_callbacks.SHA2_sha256_inc_init = override_SHA2_sha256_inc_init;
+ OQS_SHA2_set_callbacks(&sha2_callbacks);
+
OQS_init();
if (argc != 2) {
fprintf(stderr, "Usage: test_hash algname\n");
@@ -213,26 +228,33 @@ int main(int argc, char **argv) {
char *hash_alg = argv[1];
if (strcmp(hash_alg, "sha256inc") == 0) {
- return do_sha256();
+ ret = do_sha256();
} else if (strcmp(hash_alg, "sha384inc") == 0) {
- return do_sha384();
+ ret = do_sha384();
} else if (strcmp(hash_alg, "sha512inc") == 0) {
- return do_sha512();
+ ret = do_sha512();
} else if (strcmp(hash_alg, "sha256") == 0) {
- return do_arbitrary_hash(&OQS_SHA2_sha256, 32);
+ ret = do_arbitrary_hash(&OQS_SHA2_sha256, 32);
} else if (strcmp(hash_alg, "sha384") == 0) {
- return do_arbitrary_hash(&OQS_SHA2_sha384, 48);
+ ret = do_arbitrary_hash(&OQS_SHA2_sha384, 48);
} else if (strcmp(hash_alg, "sha512") == 0) {
- return do_arbitrary_hash(&OQS_SHA2_sha512, 64);
+ ret = do_arbitrary_hash(&OQS_SHA2_sha512, 64);
} else if (strcmp(hash_alg, "sha3_256") == 0) {
- return do_arbitrary_hash(&OQS_SHA3_sha3_256, 32);
+ ret = do_arbitrary_hash(&OQS_SHA3_sha3_256, 32);
} else if (strcmp(hash_alg, "sha3_384") == 0) {
- return do_arbitrary_hash(&OQS_SHA3_sha3_384, 48);
+ ret = do_arbitrary_hash(&OQS_SHA3_sha3_384, 48);
} else if (strcmp(hash_alg, "sha3_512") == 0) {
- return do_arbitrary_hash(&OQS_SHA3_sha3_512, 64);
+ ret = do_arbitrary_hash(&OQS_SHA3_sha3_512, 64);
} else {
fprintf(stderr, "ERROR: Test not implemented\n");
- OQS_destroy();
- return EXIT_FAILURE;
+ ret = EXIT_FAILURE;
}
+
+ if (strcmp(hash_alg, "sha256inc") == 0 && !sha2_callback_called) {
+ fprintf(stderr, "ERROR: SHA2 callback was not called\n");
+ ret = EXIT_FAILURE;
+ }
+
+ OQS_destroy();
+ return ret;
}
diff --git a/tests/test_sha3.c b/tests/test_sha3.c
index 43e1296c..eadd9a09 100644
--- a/tests/test_sha3.c
+++ b/tests/test_sha3.c
@@ -17,6 +17,9 @@
#define UNUSED
#endif
+static bool sha3_callback_called = false;
+static bool sha3_x4_callback_called = false;
+
/**
* \file sha3_test.h
* \brief <b>SHA3 Known Answer Tests</b> \n
@@ -1037,12 +1040,36 @@ int shake_256_x4_kat_test(void) {
return status;
}
+extern struct OQS_SHA3_callbacks sha3_default_callbacks;
+
+static void override_SHA3_sha3_256_inc_init(OQS_SHA3_sha3_256_inc_ctx *state) {
+ sha3_callback_called = true;
+ sha3_default_callbacks.SHA3_sha3_256_inc_init(state);
+}
+
+extern struct OQS_SHA3_x4_callbacks sha3_x4_default_callbacks;
+
+static void override_SHA3_shake128_x4_inc_init(OQS_SHA3_shake128_x4_inc_ctx *state) {
+ sha3_x4_callback_called = true;
+ sha3_x4_default_callbacks.SHA3_shake128_x4_inc_init(state);
+}
+
/**
* \brief Run the SHA3 and SHAKE KAT tests
*/
int main(UNUSED int argc, UNUSED char **argv) {
int ret = EXIT_SUCCESS;
+ struct OQS_SHA3_callbacks sha3_callbacks = sha3_default_callbacks;
+
+ sha3_callbacks.SHA3_sha3_256_inc_init = override_SHA3_sha3_256_inc_init;
+ OQS_SHA3_set_callbacks(&sha3_callbacks);
+
+ struct OQS_SHA3_x4_callbacks sha3_x4_callbacks = sha3_x4_default_callbacks;
+
+ sha3_x4_callbacks.SHA3_shake128_x4_inc_init = override_SHA3_shake128_x4_inc_init;
+ OQS_SHA3_x4_set_callbacks(&sha3_x4_callbacks);
+
OQS_init();
print_system_info();
@@ -1087,6 +1114,17 @@ int main(UNUSED int argc, UNUSED char **argv) {
printf("Failure! failed four-way parallel shake-256 known answer tests \n");
ret = EXIT_FAILURE;
}
+
+ if (!sha3_callback_called) {
+ printf("Failure! SHA3 callback was not called\n");
+ ret = EXIT_FAILURE;
+ }
+
+ if (!sha3_x4_callback_called) {
+ printf("Failure! SHA3_x4 callback was not called\n");
+ ret = EXIT_FAILURE;
+ }
+
OQS_destroy();
--
2.44.0