Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
76 changes: 76 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
68 changes: 68 additions & 0 deletions haraka-aesni/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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()
71 changes: 71 additions & 0 deletions ref/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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()
74 changes: 74 additions & 0 deletions sha2-avx2/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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()
74 changes: 74 additions & 0 deletions shake-avx2/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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()