From 21e5325e70001f840804d3620c9a81590ecac3d0 Mon Sep 17 00:00:00 2001 From: Yoda Lee Date: Sun, 17 Nov 2024 12:07:59 +0800 Subject: [PATCH 1/6] Add CMakeLists with gitignore --- .gitignore | 1 + CMakeLists.txt | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..b4ce2ab5 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,14 @@ +# CMake minimum version and project details +cmake_minimum_required(VERSION 3.16) +project(PQCSphincsPlus VERSION 1.0 LANGUAGES C CXX ASM) + +# Set C++ standard +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED True) + +# Option to enable/disable tests +option(ENABLE_TESTS "Enable Unit Tests" ON) + +# Set the output directories for binaries and libraries +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) \ No newline at end of file From 58b28983b84b33f3ae97dfb9153202ad5f1efb17 Mon Sep 17 00:00:00 2001 From: Yoda Lee Date: Sun, 17 Nov 2024 13:13:34 +0800 Subject: [PATCH 2/6] Build ref directory with TARGET configuration --- CMakeLists.txt | 61 +++++++++++++++++++++++++++++++++++++++++++++- ref/CMakeLists.txt | 47 +++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 ref/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index b4ce2ab5..72520499 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,4 +11,63 @@ option(ENABLE_TESTS "Enable Unit Tests" ON) # Set the output directories for binaries and libraries set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) \ No newline at end of file +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) + +find_package(OpenSSL REQUIRED) + +# Available build options +# Note that simple and robust will generate identical output +set(AVAILABLE_LIBRARIES "") +list(APPEND AVAILABLE_LIBRARIES + sphincs-haraka-128f-simple + sphincs-haraka-128f-robust + sphincs-haraka-128s-simple + sphincs-haraka-128s-robust + sphincs-haraka-192f-simple + sphincs-haraka-192f-robust + sphincs-haraka-192s-simple + sphincs-haraka-192s-robust + sphincs-haraka-256f-simple + sphincs-haraka-256f-robust + sphincs-haraka-256s-simple + sphincs-haraka-256s-robust + sphincs-sha2-128f-simple + sphincs-sha2-128f-robust + sphincs-sha2-128s-simple + sphincs-sha2-128s-robust + sphincs-sha2-192f-simple + sphincs-sha2-192f-robust + sphincs-sha2-192s-simple + sphincs-sha2-192s-robust + sphincs-sha2-256f-simple + sphincs-sha2-256f-robust + sphincs-sha2-256s-simple + sphincs-sha2-256s-robust + sphincs-shake-128f-simple + sphincs-shake-128f-robust + sphincs-shake-128s-simple + sphincs-shake-128s-robust + sphincs-shake-192f-simple + sphincs-shake-192f-robust + sphincs-shake-192s-simple + sphincs-shake-192s-robust + sphincs-shake-256f-simple + sphincs-shake-256f-robust + sphincs-shake-256s-simple + sphincs-shake-256s-robust +) +string(REPLACE ";" ", " AVAILABLE_LIBRARIES_STRING "${AVAILABLE_LIBRARIES}") + +set(DEFAULT_LIBRARY sphincs-haraka-128f-robust) + +set(TARGET ${DEFAULT_LIBRARY} CACHE STRING "Select target library from available options") + +list(FIND AVAILABLE_LIBRARIES ${TARGET} LIB_INDEX) +if(LIB_INDEX EQUAL -1) + message(FATAL_ERROR + "Invalid TARGET value: ${TARGET}\nAvailable options are: ${AVAILABLE_LIBRARIES_STRING}") +endif() + +message(STATUS "Selected TARGET: ${TARGET}") + +add_subdirectory(ref) diff --git a/ref/CMakeLists.txt b/ref/CMakeLists.txt new file mode 100644 index 00000000..299c80c4 --- /dev/null +++ b/ref/CMakeLists.txt @@ -0,0 +1,47 @@ +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wpedantic -O3 -std=c99 -Wconversion -Wmissing-prototypes ${EXTRA_CFLAGS}") + +# sphincs+ security level definition +set(l_securitylevel 128 192 256) +set(l_robustness simple robust) + +set(shake fips202.c) +set(haraka haraka.c) +set(sha2 sha2.c) +set(l_hash shake haraka sha2) +set(l_variant s f) + +# build randombytes +add_library(randombytes SHARED randombytes.c) + +# build nist rng +add_library(rng SHARED rng.c) +target_link_libraries(rng OpenSSL::Crypto) + +set(SRCS + address.c + merkle.c + wots.c + wotsx1.c + utils.c + utilsx1.c + fors.c + sign.c +) + +foreach(level IN LISTS l_securitylevel) +foreach(hash IN LISTS l_hash) +foreach(variant IN LISTS l_variant) + set(PARAMS "sphincs-${hash}-${level}${variant}") + foreach(robustness IN LISTS l_robustness) + set(LIBNAME "sphincs-${hash}-${level}${variant}-${robustness}") + set(hash_file ${${hash}} hash_${hash}.c thash_${hash}_${robustness}.c) + add_library(${LIBNAME} SHARED ${SRCS} ${hash_file}) + target_compile_definitions(${LIBNAME} PUBLIC PARAMS=${PARAMS}) + endforeach() +endforeach() +endforeach() +endforeach() + +# build PQCgenKAT_sign with the selected TARGET +add_executable(PQCgenKAT_sign PQCgenKAT_sign.c) +target_link_libraries(PQCgenKAT_sign PRIVATE rng ${TARGET}) \ No newline at end of file From d55441728fbd7584ece320d93558dc1a955d1252 Mon Sep 17 00:00:00 2001 From: yodalee Date: Sun, 19 Jan 2025 17:17:18 +0800 Subject: [PATCH 3/6] Build test executable with all variants --- ref/CMakeLists.txt | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/ref/CMakeLists.txt b/ref/CMakeLists.txt index 299c80c4..1f30688a 100644 --- a/ref/CMakeLists.txt +++ b/ref/CMakeLists.txt @@ -42,6 +42,30 @@ endforeach() endforeach() endforeach() -# build PQCgenKAT_sign with the selected TARGET -add_executable(PQCgenKAT_sign PQCgenKAT_sign.c) -target_link_libraries(PQCgenKAT_sign PRIVATE rng ${TARGET}) \ No newline at end of file +foreach(level IN LISTS l_securitylevel) +foreach(hash IN LISTS l_hash) +foreach(variant IN LISTS l_variant) +foreach(robustness IN LISTS l_robustness) + set(SUFFIX "${hash}-${level}${variant}-${robustness}") + set(LIBNAME "sphincs-${hash}-${level}${variant}-${robustness}") + + # build PQCgenKAT_sign + add_executable(PQCgenKAT_sign-${SUFFIX} PQCgenKAT_sign.c) + target_link_libraries(PQCgenKAT_sign-${SUFFIX} PRIVATE rng ${LIBNAME}) + + # build test/benchmark + add_executable(benchmark-${SUFFIX} test/benchmark.c test/cycles.c) + target_link_libraries(benchmark-${SUFFIX} PRIVATE randombytes ${LIBNAME}) + + # build test/fors + add_executable(test_fors-${SUFFIX} test/fors.c) + target_link_libraries(test_fors-${SUFFIX} PRIVATE randombytes ${LIBNAME}) + + # build test/spx + add_executable(test_spx-${SUFFIX} test/spx.c) + target_link_libraries(test_spx-${SUFFIX} PRIVATE randombytes ${LIBNAME}) + +endforeach() +endforeach() +endforeach() +endforeach() \ No newline at end of file From 5100547295e877eee23082c75497035781e48f4b Mon Sep 17 00:00:00 2001 From: yodalee Date: Thu, 30 Jan 2025 11:15:36 +0800 Subject: [PATCH 4/6] Build sha2-x8 with all options --- CMakeLists.txt | 1 + sha2-avx2/CMakeLists.txt | 74 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 sha2-avx2/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 72520499..4450c333 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,3 +71,4 @@ endif() message(STATUS "Selected TARGET: ${TARGET}") add_subdirectory(ref) +add_subdirectory(sha2-avx2) \ No newline at end of file diff --git a/sha2-avx2/CMakeLists.txt b/sha2-avx2/CMakeLists.txt new file mode 100644 index 00000000..89d9977e --- /dev/null +++ b/sha2-avx2/CMakeLists.txt @@ -0,0 +1,74 @@ +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wpedantic -Wmissing-prototypes -O3 -std=c99 -march=native -flto -fomit-frame-pointer ${EXTRA_CFLAGS}") + +# sphincs+ security level definition +set(l_securitylevel 128 192 256) +set(l_robustness simple robust) +set(l_variant s f) + +# randombytes and rng are built in the ref directory +# # build randombytes +# add_library(randombytes SHARED randombytes.c) +# +# # build nist rng +# add_library(rng SHARED rng.c) +# target_link_libraries(rng OpenSSL::Crypto) + +set(SRCS + address.c + merkle.c + wots.c + utils.c + utilsx8.c + fors.c + sign.c +) + +foreach(level IN LISTS l_securitylevel) +foreach(variant IN LISTS l_variant) + set(PARAMS "sphincs-sha2-${level}${variant}") + foreach(robustness IN LISTS l_robustness) + set(LIBNAME "sphincs-${level}${variant}-${robustness}-sha2x8") + set(hash_file + hash_sha2.c + hash_sha2x8.c + thash_sha2_${robustness}.c + thash_sha2_${robustness}x8.c + sha2.c + sha256x8.c + sha512x4.c + sha256avx.c + ) + add_library(${LIBNAME} SHARED ${SRCS} ${hash_file}) + target_compile_definitions(${LIBNAME} PUBLIC PARAMS=${PARAMS}) + endforeach() +endforeach() +endforeach() + +foreach(level IN LISTS l_securitylevel) +foreach(variant IN LISTS l_variant) +foreach(robustness IN LISTS l_robustness) + set(SUFFIX "sha2x8-${level}${variant}-${robustness}") + set(LIBNAME "sphincs-${level}${variant}-${robustness}-sha2x8") + # build PQCgenKAT_sign sha2x8 version + add_executable(PQCgenKAT_sign_${SUFFIX} PQCgenKAT_sign.c) + target_link_libraries(PQCgenKAT_sign_${SUFFIX} PRIVATE rng ${LIBNAME}) + + # build benchmark sha2x8 version + add_executable(test_benchmark_${SUFFIX} test/benchmark.c) + target_link_libraries(test_benchmark_${SUFFIX} PRIVATE randombytes ${LIBNAME}) + + # build test_fors sha2x8 version + add_executable(test_fors_${SUFFIX} test/fors.c) + target_link_libraries(test_fors_${SUFFIX} PRIVATE randombytes ${LIBNAME}) + + # build test_spx sha2x8 version + add_executable(test_spx_${SUFFIX} test/spx.c) + target_link_libraries(test_spx_${SUFFIX} PRIVATE randombytes ${LIBNAME}) + + # build hash x8 test + add_executable(test_${SUFFIX} test/spx.c) + target_link_libraries(test_${SUFFIX} PRIVATE randombytes ${LIBNAME}) + +endforeach() +endforeach() +endforeach() \ No newline at end of file From 317452a0f010bd49ea0d5208aa1e44a2fb227d6e Mon Sep 17 00:00:00 2001 From: yodalee Date: Thu, 30 Jan 2025 20:23:09 +0800 Subject: [PATCH 5/6] Build haraka-x4 with all options --- CMakeLists.txt | 1 + haraka-aesni/CMakeLists.txt | 68 +++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 haraka-aesni/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 4450c333..847c0b69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,4 +71,5 @@ endif() message(STATUS "Selected TARGET: ${TARGET}") add_subdirectory(ref) +add_subdirectory(haraka-aesni) add_subdirectory(sha2-avx2) \ No newline at end of file diff --git a/haraka-aesni/CMakeLists.txt b/haraka-aesni/CMakeLists.txt new file mode 100644 index 00000000..ecb898c7 --- /dev/null +++ b/haraka-aesni/CMakeLists.txt @@ -0,0 +1,68 @@ +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wpedantic -Wmissing-prototypes -O3 -std=c99 -march=native -flto -fomit-frame-pointer ${EXTRA_CFLAGS}") + +# sphincs+ security level definition +set(l_securitylevel 128 192 256) +set(l_robustness simple robust) +set(l_variant s f) + +# randombytes and rng are built in the ref directory +# # build randombytes +# add_library(randombytes SHARED randombytes.c) +# +# # build nist rng +# add_library(rng SHARED rng.c) +# target_link_libraries(rng OpenSSL::Crypto) + +set(SRCS + address.c + merkle.c + wots.c + utils.c + utilsx4.c + fors.c + sign.c +) + +foreach(level IN LISTS l_securitylevel) +foreach(variant IN LISTS l_variant) + set(PARAMS "sphincs-haraka-${level}${variant}") + foreach(robustness IN LISTS l_robustness) + set(LIBNAME "sphincs-${level}${variant}-${robustness}-harakax4") + set(hash_file + haraka.c + hash_haraka.c + hash_harakax4.c + thash_haraka_${robustness}.c + thash_haraka_${robustness}x4.c + ) + add_library(${LIBNAME} SHARED ${SRCS} ${hash_file}) + target_compile_definitions(${LIBNAME} PUBLIC PARAMS=${PARAMS}) + endforeach() +endforeach() +endforeach() + +foreach(level IN LISTS l_securitylevel) +foreach(variant IN LISTS l_variant) +foreach(robustness IN LISTS l_robustness) + set(SUFFIX "harakax4-${level}${variant}-${robustness}") + set(LIBNAME "sphincs-${level}${variant}-${robustness}-harakax4") + + # build PQCgenKAT_sign harakax4 version + add_executable(PQCgenKAT_sign_${SUFFIX} PQCgenKAT_sign.c) + target_link_libraries(PQCgenKAT_sign_${SUFFIX} PRIVATE rng ${LIBNAME}) + + # build benchmark harakax4 version + add_executable(test_benchmark_${SUFFIX} test/benchmark.c) + target_link_libraries(test_benchmark_${SUFFIX} PRIVATE randombytes ${LIBNAME}) + + # build test_fors harakax4 version + add_executable(test_fors_${SUFFIX} test/fors.c) + target_link_libraries(test_fors_${SUFFIX} PRIVATE randombytes ${LIBNAME}) + + # build test_spx harakax4 version + add_executable(test_spx_${SUFFIX} test/spx.c) + target_link_libraries(test_spx_${SUFFIX} PRIVATE randombytes ${LIBNAME}) + +endforeach() +endforeach() +endforeach() \ No newline at end of file From 15bb63908470605f5d98f33a80a720feec476866 Mon Sep 17 00:00:00 2001 From: yodalee Date: Fri, 31 Jan 2025 11:05:18 +0800 Subject: [PATCH 6/6] Build shake-x4 with all options --- CMakeLists.txt | 3 +- shake-avx2/CMakeLists.txt | 74 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 shake-avx2/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 847c0b69..08b39979 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,4 +72,5 @@ message(STATUS "Selected TARGET: ${TARGET}") add_subdirectory(ref) add_subdirectory(haraka-aesni) -add_subdirectory(sha2-avx2) \ No newline at end of file +add_subdirectory(sha2-avx2) +add_subdirectory(shake-avx2) \ No newline at end of file diff --git a/shake-avx2/CMakeLists.txt b/shake-avx2/CMakeLists.txt new file mode 100644 index 00000000..63b9edc9 --- /dev/null +++ b/shake-avx2/CMakeLists.txt @@ -0,0 +1,74 @@ +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wpedantic -Wmissing-prototypes -O3 -std=c99 -march=native -flto -fomit-frame-pointer ${EXTRA_CFLAGS}") + +# sphincs+ security level definition +set(l_securitylevel 128 192 256) +set(l_robustness simple robust) +set(l_variant s f) + +# randombytes and rng are built in the ref directory +# # build randombytes +# add_library(randombytes SHARED randombytes.c) +# +# # build nist rng +# add_library(rng SHARED rng.c) +# target_link_libraries(rng OpenSSL::Crypto) + +set(SRCS + address.c + merkle.c + wots.c + utils.c + utilsx4.c + fors.c + sign.c +) + +foreach(level IN LISTS l_securitylevel) +foreach(variant IN LISTS l_variant) + set(PARAMS "sphincs-shake-${level}${variant}") + foreach(robustness IN LISTS l_robustness) + set(LIBNAME "sphincs-${level}${variant}-${robustness}-shakex4") + set(hash_file + hash_shake.c + hash_shakex4.c + thash_shake_${robustness}.c + thash_shake_${robustness}x4.c + fips202.c + fips202x4.c + keccak4x/KeccakP-1600-times4-SIMD256.c + ) + + add_library(${LIBNAME} SHARED ${SRCS} ${hash_file}) + target_compile_definitions(${LIBNAME} PUBLIC PARAMS=${PARAMS}) + endforeach() +endforeach() +endforeach() + +foreach(level IN LISTS l_securitylevel) +foreach(variant IN LISTS l_variant) +foreach(robustness IN LISTS l_robustness) + set(SUFFIX "shakex4-${level}${variant}-${robustness}") + set(LIBNAME "sphincs-${level}${variant}-${robustness}-shakex4") + # build PQCgenKAT_sign shakex4 version + add_executable(PQCgenKAT_sign_${SUFFIX} PQCgenKAT_sign.c) + target_link_libraries(PQCgenKAT_sign_${SUFFIX} PRIVATE rng ${LIBNAME}) + + # build benchmark shakex4 version + add_executable(test_benchmark_${SUFFIX} test/benchmark.c) + target_link_libraries(test_benchmark_${SUFFIX} PRIVATE randombytes ${LIBNAME}) + + # build test_fors shakex4 version + add_executable(test_fors_${SUFFIX} test/fors.c) + target_link_libraries(test_fors_${SUFFIX} PRIVATE randombytes ${LIBNAME}) + + # build test_spx shakex4 version + add_executable(test_spx_${SUFFIX} test/spx.c) + target_link_libraries(test_spx_${SUFFIX} PRIVATE randombytes ${LIBNAME}) + + # build hash x4 test + add_executable(test_${SUFFIX} test/spx.c) + target_link_libraries(test_${SUFFIX} PRIVATE randombytes ${LIBNAME}) + +endforeach() +endforeach() +endforeach() \ No newline at end of file