mirror of
https://github.com/open-quantum-safe/liboqs.git
synced 2025-10-04 00:02:01 -04:00
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:
parent
f88e6237c5
commit
c520cdb871
@ -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)
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
@ -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);
|
||||
|
@ -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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user