Fixing OQS ARM inconsistencies (#1307)

* Renamed sha2 C_OR_NI to C_OR_ARM since we only select between C and ARM

* Updated AES C_OR_NI_OR_ARM's formatting and logic

* Renamed sha2_ni.c to sha2_armv8.c and updated CMakeLists.txt to fix build issues with arm optimized AES linking

* Fixed a feature detection logic issue

* Found an issue when compiling a distributed version

* Only apply -march=armv8-a+crypto to arm builds

* updated some naming
This commit is contained in:
Jason Goertzen 2022-11-15 15:47:36 -06:00 committed by GitHub
parent f88e6237c5
commit c520cdb871
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 137 additions and 90 deletions

View File

@ -45,7 +45,11 @@ if(CMAKE_C_COMPILER_ID MATCHES "Clang|GNU")
set(OQS_OPT_FLAG "-march=z10")
else()
# Assume sensible default like -march=x86-64, -march=armv8-a, etc.
set(OQS_OPT_FLAG "")
if(ARCH_ARM64v8)
set(OQS_OPT_FLAG "-march=armv8-a+crypto")
else()
set(OQS_OPT_FLAG "")
endif()
endif()
elseif(OQS_OPT_TARGET STREQUAL "auto")
if(ARCH_X86_64)

View File

@ -24,9 +24,18 @@ else()
set(AES_IMPL ${AES_IMPL} aes/aes256_ni.c)
set_source_files_properties(aes/aes128_ni.c PROPERTIES COMPILE_FLAGS -maes)
set_source_files_properties(aes/aes256_ni.c PROPERTIES COMPILE_FLAGS "-maes -mssse3")
elseif (OQS_DIST_ARM64_V8_BUILD)
set(AES_IMPL ${AES_IMPL} aes/aes128_armv8.c)
set(AES_IMPL ${AES_IMPL} aes/aes256_armv8.c)
set_source_files_properties(aes/aes128_armv8.c PROPERTIES COMPILE_FLAGS -mcpu=cortex-a53+crypto)
set_source_files_properties(aes/aes256_armv8.c PROPERTIES COMPILE_FLAGS -mcpu=cortex-a53+crypto)
elseif (OQS_USE_ARM_AES_INSTRUCTIONS)
set(AES_IMPL ${AES_IMPL} aes/aes128_armv8.c)
set(AES_IMPL ${AES_IMPL} aes/aes256_armv8.c)
if ((CMAKE_SYSTEM_NAME MATCHES "Darwin") AND (${CMAKE_C_COMPILER_ID} STREQUAL "GNU"))
set_source_files_properties(aes/aes128_armv8.c PROPERTIES COMPILE_FLAGS -march=armv8-a+crypto)
set_source_files_properties(aes/aes256_armv8.c PROPERTIES COMPILE_FLAGS -march=armv8-a+crypto)
endif()
endif()
endif()
@ -35,13 +44,13 @@ if(${OQS_USE_SHA2_OPENSSL})
else()
set(SHA2_IMPL sha2/sha2.c sha2/sha2_c.c)
if (OQS_DIST_ARM64_V8_BUILD)
set(SHA2_IMPL ${SHA2_IMPL} sha2/sha2_ni.c)
set_source_files_properties(sha2/sha2_ni.c PROPERTIES COMPILE_FLAGS -mcpu=cortex-a53+crypto)
set(SHA2_IMPL ${SHA2_IMPL} sha2/sha2_armv8.c)
set_source_files_properties(sha2/sha2_armv8.c PROPERTIES COMPILE_FLAGS -mcpu=cortex-a53+crypto)
elseif (OQS_USE_ARM_SHA2_INSTRUCTIONS)
# Assume we are compiling native
set(SHA2_IMPL ${SHA2_IMPL} sha2/sha2_ni.c)
set(SHA2_IMPL ${SHA2_IMPL} sha2/sha2_armv8.c)
if ((CMAKE_SYSTEM_NAME MATCHES "Darwin") AND (${CMAKE_C_COMPILER_ID} STREQUAL "GNU"))
set_source_files_properties(sha2/sha2_ni.c PROPERTIES COMPILE_FLAGS -march=armv8-a+crypto)
set_source_files_properties(sha2/sha2_armv8.c PROPERTIES COMPILE_FLAGS -march=armv8-a+crypto)
endif()
endif()
endif()

View File

@ -11,20 +11,31 @@
#if defined(OQS_DIST_X86_64_BUILD)
#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
if (OQS_CPU_has_extension(OQS_CPU_EXT_AES)) { \
stmt_ni; \
} else { \
stmt_c; \
}
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;
#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;
stmt_arm
#else
#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
stmt_c;
#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) {
@ -32,7 +43,7 @@ void OQS_AES128_ECB_load_schedule(const uint8_t *key, void **_schedule) {
oqs_aes128_load_schedule_c(key, _schedule),
oqs_aes128_load_schedule_ni(key, _schedule),
oqs_aes128_load_schedule_no_bitslice(key, _schedule)
)
);
}
void OQS_AES128_free_schedule(void *schedule) {
@ -40,7 +51,7 @@ void OQS_AES128_free_schedule(void *schedule) {
oqs_aes128_free_schedule_c(schedule),
oqs_aes128_free_schedule_ni(schedule),
oqs_aes128_free_schedule_no_bitslice(schedule)
)
);
}
void OQS_AES256_ECB_load_schedule(const uint8_t *key, void **_schedule) {
@ -48,7 +59,7 @@ void OQS_AES256_ECB_load_schedule(const uint8_t *key, void **_schedule) {
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_CTR_inc_init(const uint8_t *key, void **_schedule) {
@ -60,7 +71,7 @@ void OQS_AES256_CTR_inc_iv(const uint8_t *iv, size_t iv_len, void *_schedule) {
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_ivu64(uint64_t iv, void *_schedule) {
@ -68,7 +79,7 @@ void OQS_AES256_CTR_inc_ivu64(uint64_t iv, void *_schedule) {
oqs_aes256_load_iv_u64_c(iv, _schedule),
oqs_aes256_load_iv_u64_ni(iv, _schedule),
(void) iv; (void) _schedule
)
);
}
void OQS_AES256_free_schedule(void *schedule) {
@ -76,7 +87,7 @@ void OQS_AES256_free_schedule(void *schedule) {
oqs_aes256_free_schedule_c(schedule),
oqs_aes256_free_schedule_ni(schedule),
oqs_aes256_free_schedule_no_bitslice(schedule)
)
);
}
void OQS_AES128_ECB_enc(const uint8_t *plaintext, const size_t plaintext_len, const uint8_t *key, uint8_t *ciphertext) {
@ -91,7 +102,7 @@ void OQS_AES128_ECB_enc_sch(const uint8_t *plaintext, const size_t plaintext_len
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)
)
);
}
void OQS_AES256_ECB_enc(const uint8_t *plaintext, const size_t plaintext_len, const uint8_t *key, uint8_t *ciphertext) {
@ -106,7 +117,7 @@ void OQS_AES256_ECB_enc_sch(const uint8_t *plaintext, const size_t plaintext_len
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)
)
);
}
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) {
@ -114,7 +125,7 @@ void OQS_AES256_CTR_inc_stream_iv(const uint8_t *iv, const size_t iv_len, const
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)
)
);
}
void OQS_AES256_CTR_inc_stream_blks(void *schedule, uint8_t *out, size_t out_blks) {
@ -122,5 +133,5 @@ void OQS_AES256_CTR_inc_stream_blks(void *schedule, uint8_t *out, size_t out_blk
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)
)
);
}

View File

@ -113,16 +113,16 @@ static void set_available_cpu_extensions(void) {
fprintf(stderr, "Error getting HWCAP for ARM on FreeBSD\n");
return;
}
if (hwcaps | HWCAP_AES) {
if (hwcaps & HWCAP_AES) {
cpu_ext_data[OQS_CPU_EXT_ARM_AES] = 1;
}
if (hwcaps | HWCAP_ASIMD) {
if (hwcaps & HWCAP_ASIMD) {
cpu_ext_data[OQS_CPU_EXT_ARM_NEON] = 1;
}
if (hwcaps | HWCAP_SHA2) {
if (hwcaps & HWCAP_SHA2) {
cpu_ext_data[OQS_CPU_EXT_ARM_SHA2] = 1;
}
if (hwcaps | HWCAP_SHA3) {
if (hwcaps & HWCAP_SHA3) {
cpu_ext_data[OQS_CPU_EXT_ARM_SHA3] = 1;
}
}

View File

@ -7,19 +7,19 @@
#include "sha2_local.h"
#if defined(OQS_DIST_ARM64_V8_BUILD)
#define C_OR_NI(stmt_c, stmt_ni) \
#define C_OR_ARM(stmt_c, stmt_arm) \
do { \
if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_SHA2)) { \
stmt_ni; \
stmt_arm; \
} else { \
stmt_c; \
} \
} while(0)
#elif defined(OQS_USE_ARM_SHA2_INSTRUCTIONS)
#define C_OR_NI(stmt_c, stmt_ni) \
stmt_ni
#define C_OR_ARM(stmt_c, stmt_arm) \
stmt_arm
#else
#define C_OR_NI(stmt_c, stmt_ni) \
#define C_OR_ARM(stmt_c, stmt_arm) \
stmt_c
#endif
void OQS_SHA2_sha224_inc_init(OQS_SHA2_sha224_ctx *state) {
@ -31,9 +31,9 @@ void OQS_SHA2_sha224_inc_ctx_clone(OQS_SHA2_sha224_ctx *dest, const OQS_SHA2_sha
}
void OQS_SHA2_sha224_inc_blocks(OQS_SHA2_sha224_ctx *state, const uint8_t *in, size_t inblocks) {
C_OR_NI(
C_OR_ARM(
oqs_sha2_sha224_inc_blocks_c((sha224ctx *) state, in, inblocks),
oqs_sha2_sha224_inc_blocks_ni((sha224ctx *) state, in, inblocks)
oqs_sha2_sha224_inc_blocks_armv8((sha224ctx *) state, in, inblocks)
);
}
@ -54,9 +54,9 @@ void OQS_SHA2_sha256_inc_ctx_clone(OQS_SHA2_sha256_ctx *dest, const OQS_SHA2_sha
}
void OQS_SHA2_sha256_inc_blocks(OQS_SHA2_sha256_ctx *state, const uint8_t *in, size_t inblocks) {
C_OR_NI(
C_OR_ARM(
oqs_sha2_sha256_inc_blocks_c((sha256ctx *) state, in, inblocks),
oqs_sha2_sha256_inc_blocks_ni((sha256ctx *) state, in, inblocks)
oqs_sha2_sha256_inc_blocks_armv8((sha256ctx *) state, in, inblocks)
);
}
@ -109,16 +109,16 @@ void OQS_SHA2_sha512_inc_ctx_release(OQS_SHA2_sha512_ctx *state) {
}
void OQS_SHA2_sha224(uint8_t *out, const uint8_t *in, size_t inlen) {
C_OR_NI (
C_OR_ARM (
oqs_sha2_sha224_c(out, in, inlen),
oqs_sha2_sha224_ni(out, in, inlen)
oqs_sha2_sha224_armv8(out, in, inlen)
);
}
void OQS_SHA2_sha256(uint8_t *out, const uint8_t *in, size_t inlen) {
C_OR_NI (
C_OR_ARM (
oqs_sha2_sha256_c(out, in, inlen),
oqs_sha2_sha256_ni(out, in, inlen)
oqs_sha2_sha256_armv8(out, in, inlen)
);
}

View File

@ -39,7 +39,7 @@ static void store_bigendian_64(uint8_t *x, uint64_t u) {
x[0] = (uint8_t) u;
}
static size_t crypto_hashblocks_sha256_ni(uint8_t *statebytes,
static size_t crypto_hashblocks_sha256_armv8(uint8_t *statebytes,
const uint8_t *data, size_t length) {
static unsigned int s256cst[64] = {
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
@ -167,11 +167,11 @@ static size_t crypto_hashblocks_sha256_ni(uint8_t *statebytes,
return length;
}
void oqs_sha2_sha256_inc_finalize_ni(uint8_t *out, sha256ctx *state, const uint8_t *in, size_t inlen) {
void oqs_sha2_sha256_inc_finalize_armv8(uint8_t *out, sha256ctx *state, const uint8_t *in, size_t inlen) {
uint8_t padded[128];
uint64_t bytes = load_bigendian_64(state->ctx + 32) + inlen;
crypto_hashblocks_sha256_ni(state->ctx, in, inlen);
crypto_hashblocks_sha256_armv8(state->ctx, in, inlen);
in += inlen;
inlen &= 63;
in -= inlen;
@ -194,7 +194,7 @@ void oqs_sha2_sha256_inc_finalize_ni(uint8_t *out, sha256ctx *state, const uint8
padded[61] = (uint8_t) (bytes >> 13);
padded[62] = (uint8_t) (bytes >> 5);
padded[63] = (uint8_t) (bytes << 3);
crypto_hashblocks_sha256_ni(state->ctx, padded, 64);
crypto_hashblocks_sha256_armv8(state->ctx, padded, 64);
} else {
for (size_t i = inlen + 1; i < 120; ++i) {
padded[i] = 0;
@ -207,7 +207,7 @@ void oqs_sha2_sha256_inc_finalize_ni(uint8_t *out, sha256ctx *state, const uint8
padded[125] = (uint8_t) (bytes >> 13);
padded[126] = (uint8_t) (bytes >> 5);
padded[127] = (uint8_t) (bytes << 3);
crypto_hashblocks_sha256_ni(state->ctx, padded, 128);
crypto_hashblocks_sha256_armv8(state->ctx, padded, 128);
}
for (size_t i = 0; i < 32; ++i) {
@ -216,38 +216,38 @@ void oqs_sha2_sha256_inc_finalize_ni(uint8_t *out, sha256ctx *state, const uint8
oqs_sha2_sha256_inc_ctx_release_c(state);
}
void oqs_sha2_sha224_inc_finalize_ni(uint8_t *out, sha224ctx *state, const uint8_t *in, size_t inlen) {
void oqs_sha2_sha224_inc_finalize_armv8(uint8_t *out, sha224ctx *state, const uint8_t *in, size_t inlen) {
uint8_t tmp[32];
oqs_sha2_sha256_inc_finalize_ni(tmp, (sha256ctx *)state, in, inlen);
oqs_sha2_sha256_inc_finalize_armv8(tmp, (sha256ctx *)state, in, inlen);
for (size_t i = 0; i < 28; ++i) {
out[i] = tmp[i];
}
}
void oqs_sha2_sha256_inc_blocks_ni(sha256ctx *state, const uint8_t *in, size_t inblocks) {
void oqs_sha2_sha256_inc_blocks_armv8(sha256ctx *state, const uint8_t *in, size_t inblocks) {
uint64_t bytes = load_bigendian_64(state->ctx + 32);
crypto_hashblocks_sha256_ni(state->ctx, in, 64 * inblocks);
crypto_hashblocks_sha256_armv8(state->ctx, in, 64 * inblocks);
bytes += 64 * inblocks;
store_bigendian_64(state->ctx + 32, bytes);
}
void oqs_sha2_sha224_inc_blocks_ni(sha224ctx *state, const uint8_t *in, size_t inblocks) {
oqs_sha2_sha256_inc_blocks_ni((sha256ctx *) state, in, inblocks);
void oqs_sha2_sha224_inc_blocks_armv8(sha224ctx *state, const uint8_t *in, size_t inblocks) {
oqs_sha2_sha256_inc_blocks_armv8((sha256ctx *) state, in, inblocks);
}
void oqs_sha2_sha256_ni(uint8_t *out, const uint8_t *in, size_t inlen) {
void oqs_sha2_sha256_armv8(uint8_t *out, const uint8_t *in, size_t inlen) {
sha256ctx state;
oqs_sha2_sha256_inc_init_c(&state);
oqs_sha2_sha256_inc_finalize_ni(out, &state, in, inlen);
oqs_sha2_sha256_inc_finalize_armv8(out, &state, in, inlen);
}
void oqs_sha2_sha224_ni(uint8_t *out, const uint8_t *in, size_t inlen) {
void oqs_sha2_sha224_armv8(uint8_t *out, const uint8_t *in, size_t inlen) {
sha224ctx state;
oqs_sha2_sha224_inc_init_c(&state);
oqs_sha2_sha224_inc_finalize_ni(out, &state, in, inlen);
oqs_sha2_sha224_inc_finalize_armv8(out, &state, in, inlen);
}

View File

@ -56,29 +56,23 @@ void oqs_sha2_sha384_inc_blocks_c(sha384ctx *state, const uint8_t *in, size_t in
void oqs_sha2_sha384_inc_finalize_c(uint8_t *out, sha384ctx *state, const uint8_t *in, size_t inlen);
void oqs_sha2_sha384_inc_ctx_release_c(sha384ctx *state);
//void oqs_sha2_sha512(uint8_t *output, const uint8_t *input, size_t inplen);
void oqs_sha2_sha512_inc_init_c(sha512ctx *state);
void oqs_sha2_sha512_inc_ctx_clone_c(sha512ctx *dest, const sha512ctx *src);
void oqs_sha2_sha512_inc_blocks_c(sha512ctx *state, const uint8_t *in, size_t inblocks);
void oqs_sha2_sha512_inc_finalize_c(uint8_t *out, sha512ctx *state, const uint8_t *in, size_t inlen);
void oqs_sha2_sha512_inc_ctx_release_c(sha512ctx *state);
// ARMv8 Crypto Extension functions
void oqs_sha2_sha224_inc_blocks_armv8(sha224ctx *state, const uint8_t *in, size_t inblocks);
void oqs_sha2_sha224_armv8(uint8_t *out, const uint8_t *in, size_t inlen);
void oqs_sha2_sha256_inc_blocks_armv8(sha256ctx *state, const uint8_t *in, size_t inblocks);
void oqs_sha2_sha256_armv8(uint8_t *out, const uint8_t *in, size_t inlen);
// Native instruction functions
void oqs_sha2_sha224_inc_blocks_ni(sha224ctx *state, const uint8_t *in, size_t inblocks);
void oqs_sha2_sha224_ni(uint8_t *out, const uint8_t *in, size_t inlen);
void oqs_sha2_sha256_inc_blocks_ni(sha256ctx *state, const uint8_t *in, size_t inblocks);
void oqs_sha2_sha256_ni(uint8_t *out, const uint8_t *in, size_t inlen);
//void oqs_sha2_sha384(uint8_t *output, const uint8_t *input, size_t inplen);
void oqs_sha2_sha384_inc_init_ni(sha384ctx *state);
void oqs_sha2_sha384_inc_ctx_clone_ni(sha384ctx *dest, const sha384ctx *src);
void oqs_sha2_sha384_inc_blocks_ni(sha384ctx *state, const uint8_t *in, size_t inblocks);
void oqs_sha2_sha384_inc_finalize_ni(uint8_t *out, sha384ctx *state, const uint8_t *in, size_t inlen);
void oqs_sha2_sha384_inc_ctx_release_ni(sha384ctx *state);
void oqs_sha2_sha384_inc_init_armv8(sha384ctx *state);
void oqs_sha2_sha384_inc_ctx_clone_armv8(sha384ctx *dest, const sha384ctx *src);
void oqs_sha2_sha384_inc_blocks_armv8(sha384ctx *state, const uint8_t *in, size_t inblocks);
void oqs_sha2_sha384_inc_finalize_armv8(uint8_t *out, sha384ctx *state, const uint8_t *in, size_t inlen);
void oqs_sha2_sha384_inc_ctx_release_armv8(sha384ctx *state);
void oqs_sha2_sha224_c(uint8_t *out, const uint8_t *in, size_t inlen);
void oqs_sha2_sha256_c(uint8_t *out, const uint8_t *in, size_t inlen);

View File

@ -47,21 +47,49 @@ static void print_platform_info(void) {
#endif
#if defined(OQS_DIST_X86_64_BUILD)
#define C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
if (OQS_CPU_has_extension(OQS_CPU_EXT_AES)) { \
stmt_ni; \
} else { \
stmt_c; \
}
#define AES_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 AES_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;
#define AES_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;
#define AES_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;
#define AES_C_OR_NI_OR_ARM(stmt_c, stmt_ni, stmt_arm) \
stmt_c
#endif
#if defined(OQS_DIST_ARM64_V8_BUILD)
#define SHA2_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 SHA2_C_OR_ARM(stmt_c, stmt_arm) \
stmt_arm
#else
#define SHA2_C_OR_ARM(stmt_c, stmt_arm) \
stmt_c
#endif
/* Display all active CPU extensions: */
@ -203,18 +231,19 @@ static void print_oqs_configuration(void) {
#if defined(OQS_USE_AES_OPENSSL)
printf("AES: OpenSSL\n");
#else
C_OR_NI_OR_ARM(
AES_C_OR_NI_OR_ARM(
printf("AES: C\n"),
printf("AES: NI\n"),
printf("AES: C and ARM CRYPTO extensions\n")
)
);
#endif
#if defined(OQS_USE_SHA2_OPENSSL)
printf("SHA-2: OpenSSL\n");
#elif defined(OQS_USE_ARM_SHA2_INSTRUCTIONS)
printf("SHA-2: C and ARM CRYPTO extensions\n");
#else
printf("SHA-2: C\n");
SHA2_C_OR_ARM(
printf("SHA-2: C\n"),
printf("SHA-2: C and ARM CRYPTO extensions\n")
);
#endif
#if defined(OQS_USE_SHA3_OPENSSL)
printf("SHA-3: OpenSSL\n");