second-round version of SQIsign

Co-authored-by: Marius A. Aardal <marius.andre.aardal@gmail.com>
Co-authored-by: Gora Adj <gora.adj@tii.ae>
Co-authored-by: Diego F. Aranha <dfaranha@cs.au.dk>
Co-authored-by: Andrea Basso <sqisign@andreabasso.com>
Co-authored-by: Isaac Andrés Canales Martínez <icanalesm0500@gmail.com>
Co-authored-by: Jorge Chávez-Saab <jorgechavezsaab@gmail.com>
Co-authored-by: Maria Corte-Real Santos <mariascrsantos98@gmail.com>
Co-authored-by: Luca De Feo <github@defeo.lu>
Co-authored-by: Max Duparc <max.duparc@epfl.ch>
Co-authored-by: Jonathan Komada Eriksen <jonathan.eriksen97@gmail.com>
Co-authored-by: Décio Luiz Gazzoni Filho <decio@decpp.net>
Co-authored-by: Basil Hess <bhe@zurich.ibm.com>
Co-authored-by: Antonin Leroux <antonin.leroux@polytechnique.org>
Co-authored-by: Patrick Longa <plonga@microsoft.com>
Co-authored-by: Luciano Maino <mainoluciano.96@gmail.com>
Co-authored-by: Michael Meyer <michael@random-oracles.org>
Co-authored-by: Hiroshi Onuki <onuki@mist.i.u-tokyo.ac.jp>
Co-authored-by: Lorenz Panny <lorenz@yx7.cc>
Co-authored-by: Giacomo Pope <giacomopope@gmail.com>
Co-authored-by: Krijn Reijnders <reijnderskrijn@gmail.com>
Co-authored-by: Damien Robert <damien.robert@inria.fr>
Co-authored-by: Francisco Rodríguez-Henriquez <francisco.rodriguez@tii.ae>
Co-authored-by: Sina Schaeffler <sschaeffle@student.ethz.ch>
Co-authored-by: Benjamin Wesolowski <benjamin.wesolowski@ens-lyon.fr>
This commit is contained in:
SQIsign team
2025-02-06 00:00:00 +00:00
committed by Lorenz Panny
parent ff34a8cd18
commit 91e9e464fe
481 changed files with 80785 additions and 55963 deletions

8
.cmake/32bit.cmake Normal file
View File

@@ -0,0 +1,8 @@
set(CMAKE_SYSTEM_NAME ${CMAKE_HOST_SYSTEM_NAME})
if(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "x86_64")
set(CMAKE_SYSTEM_PROCESSOR i686)
endif()
set(GMP_LIBRARY "BUILD" CACHE STRING "" FORCE)
set(GMP_BUILD_CONFIG_ARGS "ABI=32" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS "-m32" CACHE STRING "" FORCE)
set(CMAKE_EXE_LINKER_FLAGS "-m32" CACHE STRING "" FORCE)

12
.cmake/bm.cmake Normal file
View File

@@ -0,0 +1,12 @@
add_custom_target(bm
COMMAND ${CMAKE_COMMAND} -E echo "Running all benchmarks..."
)
foreach(bm_bin ${BM_BINS})
add_custom_command(
TARGET bm
POST_BUILD
COMMAND $<TARGET_FILE:${bm_bin}>
COMMENT "Running ${bm_bin}"
)
endforeach()

View File

@@ -24,19 +24,29 @@ if(MSVC)
endif()
else()
set(STRICT_OPTIONS_CXX "${STRICT_OPTIONS_CXX} -std=c++14 -O2")
set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wall -Wuninitialized -Wno-deprecated-declarations -Wno-missing-field-initializers")
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wall -Wuninitialized -Wno-deprecated-declarations -Wno-missing-field-initializers -Wno-unused-function -Wno-missing-braces")
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -Og -g")
else()
set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -O3")
endif()
set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -std=c99 -Wno-error=strict-prototypes -fvisibility=hidden -funroll-loops -Wno-error=implicit-function-declaration -Wno-error=attributes")
set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -std=c11 -Wno-error=strict-prototypes -fvisibility=hidden -funroll-loops -Wno-error=implicit-function-declaration -Wno-error=attributes")
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wno-error=unknown-warning-option -Qunused-arguments -Wno-tautological-compare")
set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wno-unused-function -Wno-pass-failed")
set(STRICT_OPTIONS_CPP "${STRICT_OPTIONS_CPP} -Wno-pass-failed")
endif()
if(ENABLE_STRICT)
set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} -Werror -Wextra -Wno-unused-parameter -fno-strict-aliasing")
set(STRICT_OPTIONS_C "${STRICT_OPTIONS_C} ${STRICT_OPTIONS_CPP} -Werror -Wextra -Wno-unused-parameter -fno-strict-aliasing")
endif()
endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${STRICT_OPTIONS_C}")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${STRICT_OPTIONS_CXX} ${STRICT_OPTIONS_CPP}")
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
# enable link-time optimization (LTO)
include(CheckIPOSupported)
check_ipo_supported(RESULT result)
if(result)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
endif()
endif()

View File

@@ -1,5 +1,16 @@
if (GMP_LIBRARY STREQUAL "SYSTEM")
# use system gmp version
message(STATUS "Using system GMP")
if (ENABLE_GMP_BUILD)
find_library(GMP gmp)
find_path(GMP_INCLUDE gmp.h)
add_library(GMP UNKNOWN IMPORTED)
set_target_properties(GMP PROPERTIES
IMPORTED_LOCATION ${GMP}
INTERFACE_INCLUDE_DIRECTORIES ${GMP_INCLUDE}
)
elseif (GMP_LIBRARY STREQUAL "BUILD")
# Download and build own libgmp version
if (POLICY CMP0135)
cmake_policy(SET CMP0135 NEW)
@@ -8,29 +19,70 @@ if (ENABLE_GMP_BUILD)
option(ENABLE_GMP_STATIC "Option to statically link. Default is dynamic linking" OFF)
if (ENABLE_GMP_STATIC)
set(GMP_LIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX})
else()
set(GMP_LIB_SUFFIX ${CMAKE_STATIC_LIBRARY_SUFFIX})
else()
set(GMP_LIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX})
endif()
message("${GMP_BUILD_CONFIG_ARGS}")
cmake_host_system_information(RESULT N QUERY NUMBER_OF_PHYSICAL_CORES)
if (N EQUAL 0)
# Choose a "safe" amount
set(N 8)
endif()
set(GMP_PARALLEL_BUILD_ARGS -j${N})
message(STATUS "Building GMP with additional options: ${GMP_BUILD_CONFIG_ARGS}")
include(ExternalProject)
find_program(MAKE_EXE NAMES make gmake nmake)
set(libgmp_INSTALL_DIR "${CMAKE_BINARY_DIR}/libgmp")
ExternalProject_Add(libgmp_external
PREFIX ${libgmp_INSTALL_DIR}
URL https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz
URL_HASH SHA256=fd4829912cddd12f84181c3451cc752be224643e87fac497b69edddadc49b4f2
URL https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz
URL_HASH SHA256=a3c2b80201b89e68616f4ad30bc66aee4927c3ce50e33929ca819d5c43538898
CONFIGURE_COMMAND ${libgmp_INSTALL_DIR}/src/libgmp_external/configure --prefix=${libgmp_INSTALL_DIR} ${GMP_BUILD_CONFIG_ARGS}
BUILD_COMMAND ${MAKE_EXE} -j8
BUILD_COMMAND ${MAKE_EXE} ${GMP_PARALLEL_BUILD_ARGS}
INSTALL_COMMAND ${MAKE_EXE} install
BUILD_BYPRODUCTS ${libgmp_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gmp${GMP_LIB_SUFFIX}
)
set(GMP ${libgmp_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gmp${GMP_LIB_SUFFIX})
include_directories(${libgmp_INSTALL_DIR}/include)
# Needed to avoid errors about missing directory when creating the GMP target
file(MAKE_DIRECTORY ${libgmp_INSTALL_DIR}/include)
if(ENABLE_GMP_STATIC)
add_library(GMP STATIC IMPORTED)
set_target_properties(GMP PROPERTIES
IMPORTED_LOCATION ${libgmp_INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}gmp${GMP_LIB_SUFFIX}
INTERFACE_INCLUDE_DIRECTORIES ${libgmp_INSTALL_DIR}/include
)
else()
add_library(GMP SHARED IMPORTED)
set_target_properties(GMP PROPERTIES
IMPORTED_LOCATION ${libgmp_INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}gmp${GMP_LIB_SUFFIX}
INTERFACE_INCLUDE_DIRECTORIES ${libgmp_INSTALL_DIR}/include
)
endif()
add_dependencies(GMP libgmp_external)
elseif (GMP_LIBRARY STREQUAL "MINI")
# Use mini-gmp
message(STATUS "Using mini-GMP")
include(CheckTypeSize)
add_library(GMP STATIC
${PROJECT_SOURCE_DIR}/src/mini-gmp/mini-gmp.c ${PROJECT_SOURCE_DIR}/src/mini-gmp/mini-gmp-extra.c)
target_include_directories(GMP PRIVATE ${PROJECT_SOURCE_DIR}/src/common/generic/include) # for tutil.h
target_include_directories(GMP INTERFACE ${PROJECT_SOURCE_DIR}/src/mini-gmp)
set_source_files_properties(${PROJECT_SOURCE_DIR}/src/mini-gmp/mini-gmp.c PROPERTIES COMPILE_OPTIONS "-w")
set(CMAKE_REQUIRED_INCLUDES "${PROJECT_SOURCE_DIR}/src/mini-gmp")
set(CMAKE_EXTRA_INCLUDE_FILES "mini-gmp.h")
check_type_size("mp_limb_t" MP_LIMB_T_BYTES)
math(EXPR GMP_LIMB_BITS "${MP_LIMB_T_BYTES} * 8")
add_compile_definitions(GMP_LIMB_BITS=${GMP_LIMB_BITS})
add_compile_definitions(MINI_GMP)
else()
# use system gmp version
find_library(GMP gmp)
find_path(GMP_INCLUDE gmp.h)
include_directories(${GMP_INCLUDE})
endif()
message(FATAL_ERROR "Invalid choice for GMP_LIBRARY: ${GMP_LIBRARY}")
endif()

View File

@@ -1,7 +1,15 @@
get_filename_component(CCSD_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(TOUPPER ${CCSD_NAME} CCSD_NAME_UPPER)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/include)
set(INC_${CCSD_NAME_UPPER}_GENERIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
endif()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${CCSD_NAME}x)
set(${CCSD_NAME_UPPER}_GENERIC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${CCSD_NAME}x)
endif()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/broadwell AND SQISIGN_BUILD_TYPE MATCHES "broadwell")
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/broadwell)
elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/arm64crypto AND SQISIGN_BUILD_TYPE MATCHES "arm64crypto")
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/arm64crypto)
elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/opt AND SQISIGN_BUILD_TYPE MATCHES "opt")
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/opt)
elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/ref)

View File

@@ -1,6 +1,6 @@
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/generic)
set(LIB_${CCSD_NAME_UPPER} sqisign_${CCSD_NAME}_generic CACHE INTERNAL "LIB")
set(INC_${CCSD_NAME_UPPER} ${CMAKE_CURRENT_SOURCE_DIR}/generic/include CACHE INTERNAL "LIB")
set(INC_${CCSD_NAME_UPPER} ${CMAKE_CURRENT_SOURCE_DIR}/generic/include CACHE INTERNAL "INC")
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/generic)
FOREACH(SVARIANT ${SVARIANT_S})
string(TOUPPER ${SVARIANT} SVARIANT_UPPER)

View File

@@ -1,39 +1,100 @@
# SPDX-License-Identifier: Apache-2.0
if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64")
add_definitions(-DTARGET_ARM64)
add_definitions(-DRADIX_64)
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
add_definitions(-DTARGET_ARM)
add_definitions(-DRADIX_32)
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64")
add_definitions(-DTARGET_AMD64)
add_definitions(-DRADIX_64)
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "i386" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "i686")
add_definitions(-DTARGET_X86)
add_definitions(-DRADIX_32)
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(s390x.*|S390X.*)")
add_definitions(-DTARGET_S390X)
add_definitions(-DTARGET_BIG_ENDIAN)
add_definitions(-DRADIX_64)
include(CheckTypeSize)
function(check_target_feature CODE RUN_RESULT)
set(TEMP_FILE "${CMAKE_BINARY_DIR}/check_target_feature.c")
file(WRITE
${TEMP_FILE}
"int main(void) {
${CODE}
return 0;
}")
try_run(TEMP_RUN_RESULT TEMP_COMPILE_RESULT ${CMAKE_BINARY_DIR} ${TEMP_FILE})
set(${RUN_RESULT} ${TEMP_RUN_RESULT} PARENT_SCOPE)
if (ARGC EQUAL 3)
set(${ARGV2} ${TEMP_COMPILE_RESULT} PARENT_SCOPE)
endif()
file(REMOVE ${TEMP_FILE})
endfunction()
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64")
add_compile_definitions(TARGET_ARM64)
set(RADIX 64)
if (NOT APPLE)
check_target_feature("asm volatile(\"mrs x0, PMCCNTR_EL0\" : : : \"x0\");" CYCCNT)
if (CYCCNT STREQUAL "FAILED_TO_RUN")
message(STATUS "Cycle counter not supported, reverting to fallback measurement")
add_compile_definitions(NO_CYCLE_COUNTER)
endif()
endif()
elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
add_compile_definitions(TARGET_ARM)
set(RADIX 32)
elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64")
add_compile_definitions(TARGET_AMD64)
set(RADIX 64)
elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "i386" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "i686")
add_compile_definitions(TARGET_X86)
set(RADIX 32)
elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(s390x.*|S390X.*)")
add_compile_definitions(TARGET_S390X TARGET_BIG_ENDIAN)
set(RADIX 64)
else()
add_definitions(-DTARGET_OTHER)
add_definitions(-DRADIX_64)
add_compile_definitions(TARGET_OTHER)
set(RADIX 64)
message("Warning: system architecture not detected, defaulting to 64 bit")
endif()
if (UNIX)
add_definitions(-DTARGET_OS_UNIX)
if (NOT GF_RADIX STREQUAL "AUTO")
if (NOT((GF_RADIX EQUAL 64) OR (GF_RADIX EQUAL 32)))
message(FATAL_ERROR "Currently supported options for GF_RADIX: 32 or 64. Aborting")
endif()
set(RADIX ${GF_RADIX})
endif()
if (NOT DEFINED SQISIGN_BUILD_TYPE)
set(SQISIGN_BUILD_TYPE "ref")
endif()
if (RADIX EQUAL 32)
if (${SQISIGN_BUILD_TYPE} MATCHES "broadwell")
message(FATAL_ERROR "Broadwell implementation not supported in 32-bit build")
endif()
else()
add_definitions(-DTARGET_OS_OTHER)
# Testing for unsigned 128-bit integer support
check_type_size("__uint128_t" uint128_t)
if (${HAVE_uint128_t} AND (uint128_t EQUAL 16))
add_compile_definitions(HAVE_UINT128)
elseif(${SQISIGN_BUILD_TYPE} MATCHES "ref")
message(WARNING "Compiler/platform does not support unsigned 128-bit integers, falling back to 32-bit build")
set(RADIX 32)
endif()
endif()
message(STATUS "Using ${RADIX}-bit radix for gf module")
if (RADIX EQUAL 32)
add_compile_definitions(RADIX_32)
elseif (RADIX EQUAL 64)
add_compile_definitions(RADIX_64)
endif()
if (UNIX)
add_compile_definitions(TARGET_OS_UNIX)
else()
add_compile_definitions(TARGET_OS_OTHER)
endif()
set(C_OPT_FLAGS "")
if ((NOT DEFINED SQISIGN_BUILD_TYPE))
set(SQISIGN_BUILD_TYPE opt)
if (NOT DEFINED SQISIGN_TEST_REPS)
set(SQISIGN_TEST_REPS 10)
endif()
if ((NOT DEFINED SQISIGN_TEST_REPS))
set(SQISIGN_TEST_REPS 1000)
endif()
add_compile_definitions(SQISIGN_TEST_REPS=${SQISIGN_TEST_REPS})