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..08b39979 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,76 @@ +# 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) + +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) +add_subdirectory(haraka-aesni) +add_subdirectory(sha2-avx2) +add_subdirectory(shake-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 diff --git a/ref/CMakeLists.txt b/ref/CMakeLists.txt new file mode 100644 index 00000000..1f30688a --- /dev/null +++ b/ref/CMakeLists.txt @@ -0,0 +1,71 @@ +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() + +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 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 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