diff --git a/.CMake/alg_support.cmake b/.CMake/alg_support.cmake index 7aedc6e7bb..c24ba64076 100644 --- a/.CMake/alg_support.cmake +++ b/.CMake/alg_support.cmake @@ -28,7 +28,7 @@ endif() endif() # BIKE is not supported on Windows and 32-bit ARM -cmake_dependent_option(OQS_ENABLE_KEM_BIKE "Enable BIKE algorithm family" ON "NOT WIN32; NOT ARCH_ARM32v7" OFF) +cmake_dependent_option(OQS_ENABLE_KEM_BIKE "Enable BIKE algorithm family" ON "NOT WIN32; NOT ARCH_ARM32v7; NOT ARCH_X86" OFF) cmake_dependent_option(OQS_ENABLE_KEM_bike_l1 "" ON "OQS_ENABLE_KEM_BIKE" OFF) cmake_dependent_option(OQS_ENABLE_KEM_bike_l3 "" ON "OQS_ENABLE_KEM_BIKE" OFF) diff --git a/CMakeLists.txt b/CMakeLists.txt index bcbad3befe..eb712a0d86 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,12 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64") if(${OQS_DIST_BUILD}) set(OQS_DIST_X86_64_BUILD ON) endif() +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i586|i686") + set(ARCH "i586") + set(ARCH_X86 ON) + if(${OQS_DIST_BUILD}) + set(OQS_DIST_X86_BUILD ON) + endif() elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64|arm64v8") set(ARCH "arm64v8") set(ARCH_ARM64v8 ON) @@ -47,6 +53,12 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "armel|armhf|armv7|arm32v7") if(${OQS_DIST_BUILD}) set(OQS_DIST_ARM32v7_BUILD ON) endif() +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le") + set(ARCH "ppc64le") + set(ARCH_PPC64LE ON) + if(${OQS_DIST_BUILD}) + set(OQS_DIST_PPC64LE_BUILD ON) + endif() elseif(OQS_PERMIT_UNSUPPORTED_ARCHITECTURE) message(WARNING "Unknown or unsupported processor: " ${CMAKE_SYSTEM_PROCESSOR}) message(WARNING "Compilation on an unsupported processor should only be used for testing, as it may result an insecure configuration, for example due to variable-time instructions leaking secret information.") diff --git a/src/common/common.c b/src/common/common.c index fa4a991a34..4a89c9bb5d 100644 --- a/src/common/common.c +++ b/src/common/common.c @@ -65,6 +65,11 @@ static void set_available_cpu_extensions(void) { cpu_ext_data[OQS_CPU_EXT_VPCLMULQDQ] = is_bit_set(leaf_7.ecx, 10); } } +#elif defined(OQS_DIST_X86_BUILD) +static void set_available_cpu_extensions(void) { + /* mark that this function has been called */ + cpu_ext_data[OQS_CPU_EXT_INIT] = 1; +} #elif defined(OQS_DIST_ARM64v8_BUILD) #include #include @@ -103,6 +108,11 @@ static void set_available_cpu_extensions(void) { cpu_ext_data[OQS_CPU_EXT_ARM_NEON] = 1; } } +#elif defined(OQS_DIST_PPC64LE_BUILD) +static void set_available_cpu_extensions(void) { + /* mark that this function has been called */ + cpu_ext_data[OQS_CPU_EXT_INIT] = 1; +} #elif defined(OQS_DIST_BUILD) static void set_available_cpu_extensions(void) { } diff --git a/src/kem/sike/CMakeLists.txt b/src/kem/sike/CMakeLists.txt index a7a4afcd59..574f50dea4 100644 --- a/src/kem/sike/CMakeLists.txt +++ b/src/kem/sike/CMakeLists.txt @@ -81,6 +81,8 @@ if(OQS_ENABLE_KEM_sike_p434 OR add_library(sike OBJECT ${SRCS}) if(ARCH STREQUAL "x86") target_compile_definitions(sike PRIVATE _GENERIC_ _X86_) + elseif(ARCH_X86) + target_compile_definitions(sike PRIVATE _GENERIC_ _X86_) elseif(ARCH_X86_64) target_compile_definitions(sike PRIVATE _AMD64_) if(OQS_USE_BMI2_INSTRUCTIONS) @@ -124,6 +126,8 @@ if(OQS_ENABLE_KEM_sike_p434 OR target_compile_definitions(sike PRIVATE USE_SIKEP751_ASM) endif() endif() + elseif(ARCH_PPC64LE) + target_compile_definitions(sike PRIVATE _GENERIC_ _PPC64LE_) endif() if(CMAKE_C_COMPILER_ID STREQUAL "GNU") diff --git a/src/kem/sike/external/P434/P434_internal.h b/src/kem/sike/external/P434/P434_internal.h index b7160db1a7..6c7f66c896 100644 --- a/src/kem/sike/external/P434/P434_internal.h +++ b/src/kem/sike/external/P434/P434_internal.h @@ -9,7 +9,7 @@ #include "../config.h" -#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) +#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) || (TARGET == TARGET_PPC64LE) #define NWORDS_FIELD 7 // Number of words of a 434-bit field element #define p434_ZERO_WORDS 3 // Number of "0" digits in the least significant part of p434 + 1 #elif (TARGET == TARGET_x86) || (TARGET == TARGET_ARM) diff --git a/src/kem/sike/external/P503/P503_internal.h b/src/kem/sike/external/P503/P503_internal.h index d754085f0f..3a9bb326a4 100644 --- a/src/kem/sike/external/P503/P503_internal.h +++ b/src/kem/sike/external/P503/P503_internal.h @@ -9,7 +9,7 @@ #include "../config.h" -#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) +#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) || (TARGET == TARGET_PPC64LE) #define NWORDS_FIELD 8 // Number of words of a 503-bit field element #define p503_ZERO_WORDS 3 // Number of "0" digits in the least significant part of p503 + 1 #elif (TARGET == TARGET_x86) || (TARGET == TARGET_ARM) diff --git a/src/kem/sike/external/P610/P610_internal.h b/src/kem/sike/external/P610/P610_internal.h index 8456d5db24..8a6a08fb4a 100644 --- a/src/kem/sike/external/P610/P610_internal.h +++ b/src/kem/sike/external/P610/P610_internal.h @@ -9,7 +9,7 @@ #include "../config.h" -#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) +#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) || (TARGET == TARGET_PPC64LE) #define NWORDS_FIELD 10 // Number of words of a 610-bit field element #define p610_ZERO_WORDS 4 // Number of "0" digits in the least significant part of p610 + 1 #elif (TARGET == TARGET_x86) || (TARGET == TARGET_ARM) diff --git a/src/kem/sike/external/P751/P751_internal.h b/src/kem/sike/external/P751/P751_internal.h index 9216994904..1f9f231f9e 100644 --- a/src/kem/sike/external/P751/P751_internal.h +++ b/src/kem/sike/external/P751/P751_internal.h @@ -9,7 +9,7 @@ #include "../config.h" -#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) +#if (TARGET == TARGET_AMD64) || (TARGET == TARGET_ARM64) || (TARGET == TARGET_S390X) || (TARGET == TARGET_PPC64LE) #define NWORDS_FIELD 12 // Number of words of a 751-bit field element #define p751_ZERO_WORDS 5 // Number of "0" digits in the least significant part of p751 + 1 #elif (TARGET == TARGET_x86) || (TARGET == TARGET_ARM) diff --git a/src/kem/sike/external/config.h b/src/kem/sike/external/config.h index 1ae39862de..591f1cd554 100644 --- a/src/kem/sike/external/config.h +++ b/src/kem/sike/external/config.h @@ -31,6 +31,7 @@ #define TARGET_S390X 3 #define TARGET_ARM 4 #define TARGET_ARM64 5 +#define TARGET_PPC64LE 6 #if defined(_AMD64_) #define TARGET TARGET_AMD64 @@ -62,6 +63,12 @@ typedef uint16_t hdigit_t; // Unsigned 16-bit digit #define LOG2RADIX 6 typedef uint64_t digit_t; // Unsigned 64-bit digit typedef uint32_t hdigit_t; // Unsigned 32-bit digit +#elif defined(_PPC64LE_) +#define TARGET TARGET_PPC64LE +#define RADIX 64 +#define LOG2RADIX 6 +typedef uint64_t digit_t; // Unsigned 64-bit digit +typedef uint32_t hdigit_t; // Unsigned 32-bit digit #else #error-- "Unsupported ARCHITECTURE" #endif diff --git a/src/oqsconfig.h.cmake b/src/oqsconfig.h.cmake index 9678be6991..88c90b07c3 100644 --- a/src/oqsconfig.h.cmake +++ b/src/oqsconfig.h.cmake @@ -4,8 +4,10 @@ #cmakedefine OQS_COMPILE_BUILD_TARGET "@OQS_COMPILE_BUILD_TARGET@" #cmakedefine OQS_DIST_BUILD 1 #cmakedefine OQS_DIST_X86_64_BUILD 1 +#cmakedefine OQS_DIST_X86_BUILD 1 #cmakedefine OQS_DIST_ARM64v8_BUILD 1 #cmakedefine OQS_DIST_ARM32v7_BUILD 1 +#cmakedefine OQS_DIST_PPC64LE_BUILD 1 #cmakedefine OQS_DEBUG_BUILD 1 #cmakedefine ARCH_X86_64 1 #cmakedefine ARCH_ARM64v8 1