From f051c605220a0eb901f6969d43eeb9640dc87c38 Mon Sep 17 00:00:00 2001 From: Kris Kwiatkowski Date: Wed, 17 Feb 2021 13:38:23 +0000 Subject: [PATCH] Add one AVX target --- CMakeLists.txt | 186 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 156 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6224134c..01e061fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,21 +13,21 @@ set(CMAKE_CXX_STANDARD 11) string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER) if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") - set(ARCH "QRS_ARCH_x86_64") + set(ARCH "ARCH_x86_64") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "amd64") - set(ARCH "QRS_ARCH_x86_64") + set(ARCH "ARCH_x86_64") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64") - set(ARCH "QRS_ARCH_x86_64") + set(ARCH "ARCH_x86_64") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86") - set(ARCH "QRS_ARCH_x86") + set(ARCH "ARCH_x86") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386") - set(ARCH "QRS_ARCH_x86") + set(ARCH "ARCH_x86") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686") - set(ARCH "QRS_ARCH_x86") + set(ARCH "ARCH_x86") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") - set(ARCH "QRS_ARCH_aarch64") + set(ARCH "ARCH_aarch64") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64") - set(ARCH "QRS_ARCH_aarch64") + set(ARCH "ARCH_aarch64") else() message(FATAL_ERROR "Unknown processor:" ${CMAKE_SYSTEM_PROCESSOR}) endif() @@ -82,16 +82,8 @@ include_directories( set(CMAKE_C_FLAGS "${C_CXX_FLAGS} -D${ARCH}") set(CMAKE_CXX_FLAGS "${C_CXX_FLAGS} -D${ARCH}") -add_library( - common - OBJECT - - common/fips202.c - common/sp800-185.c - common/randombytes.c -) - -function(define_crypto_alg name namespace src inc) +# Common function for defining algorithm component +function(define_crypto_alg name namespace src inc test_src) add_library( pqclean_${name} OBJECT @@ -101,6 +93,7 @@ function(define_crypto_alg name namespace src inc) target_include_directories( pqclean_${name} PRIVATE common + ${inc} ) target_compile_definitions( @@ -111,7 +104,7 @@ function(define_crypto_alg name namespace src inc) add_library( pqclean_test_${name} OBJECT - test/crypto_sign/testvectors.c + ${test_src} ) target_compile_definitions( @@ -124,8 +117,27 @@ function(define_crypto_alg name namespace src inc) common ${inc} ) + + add_executable( + test_runner_${name} + ) + target_link_libraries( + test_runner_${name} + + common + pqclean_${name} + pqclean_test_${name} + ) endfunction() +function(define_kem_alg name namespace src inc) + define_crypto_alg(${name} ${namespace} "${src}" "${inc}" test/crypto_kem/testvectors.c) +endfunction() +function(define_sig_alg name namespace src inc) + define_crypto_alg(${name} ${namespace} "${src}" "${inc}" test/crypto_sign/testvectors.c) +endfunction() + +# Define sources of the components set( SRC_CLEAN_DILITHIUM2 crypto_sign/dilithium2/clean/ntt.c @@ -142,10 +154,117 @@ set( INC_CLEAN_DILITHIUM2 crypto_sign/dilithium2/clean ) - -define_crypto_alg(dilithium2_clean +define_sig_alg(dilithium2_clean PQCLEAN_DILITHIUM2_CLEAN "${SRC_CLEAN_DILITHIUM2}" "${INC_CLEAN_DILITHIUM2}") +set( + SRC_CLEAN_DILITHIUM3 + crypto_sign/dilithium3/clean/ntt.c + crypto_sign/dilithium3/clean/packing.c + crypto_sign/dilithium3/clean/poly.c + crypto_sign/dilithium3/clean/polyvec.c + crypto_sign/dilithium3/clean/reduce.c + crypto_sign/dilithium3/clean/rounding.c + crypto_sign/dilithium3/clean/sign.c + crypto_sign/dilithium3/clean/symmetric-shake.c +) + +set( + INC_CLEAN_DILITHIUM3 + crypto_sign/dilithium3/clean +) +define_sig_alg(dilithium3_clean + PQCLEAN_DILITHIUM3_CLEAN "${SRC_CLEAN_DILITHIUM3}" "${INC_CLEAN_DILITHIUM3}") + +set( + SRC_CLEAN_DILITHIUM5 + crypto_sign/dilithium5/clean/ntt.c + crypto_sign/dilithium5/clean/packing.c + crypto_sign/dilithium5/clean/poly.c + crypto_sign/dilithium5/clean/polyvec.c + crypto_sign/dilithium5/clean/reduce.c + crypto_sign/dilithium5/clean/rounding.c + crypto_sign/dilithium5/clean/sign.c + crypto_sign/dilithium5/clean/symmetric-shake.c +) + +set( + INC_CLEAN_DILITHIUM5 + crypto_sign/dilithium5/clean +) + +define_sig_alg(dilithium5_clean + PQCLEAN_DILITHIUM5_CLEAN "${SRC_CLEAN_DILITHIUM5}" "${INC_CLEAN_DILITHIUM5}") + +set( + SRC_CLEAN_KYBER512 + crypto_kem/kyber512/clean/cbd.c + crypto_kem/kyber512/clean/indcpa.c + crypto_kem/kyber512/clean/kem.c + crypto_kem/kyber512/clean/ntt.c + crypto_kem/kyber512/clean/poly.c + crypto_kem/kyber512/clean/polyvec.c + crypto_kem/kyber512/clean/reduce.c + crypto_kem/kyber512/clean/symmetric-shake.c + crypto_kem/kyber512/clean/verify.c +) +set( + INC_CLEAN_KYBER512 + crypto_kem/kyber512/clean +) +define_kem_alg(kyber512_clean + PQCLEAN_KYBER512_CLEAN "${SRC_CLEAN_KYBER512}" "${INC_CLEAN_KYBER512}") + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=haswell") +set( + SRC_AVX2_KYBER512 + crypto_kem/kyber512/avx2/cbd.c + crypto_kem/kyber512/avx2/consts.c + crypto_kem/kyber512/avx2/fips202x4.c + crypto_kem/kyber512/avx2/indcpa.c + crypto_kem/kyber512/avx2/kem.c + crypto_kem/kyber512/avx2/poly.c + crypto_kem/kyber512/avx2/polyvec.c + crypto_kem/kyber512/avx2/rejsample.c + crypto_kem/kyber512/avx2/symmetric-shake.c + crypto_kem/kyber512/avx2/verify.c + crypto_kem/kyber512/avx2/basemul.S + crypto_kem/kyber512/avx2/fq.S + crypto_kem/kyber512/avx2/invntt.S + crypto_kem/kyber512/avx2/ntt.S + crypto_kem/kyber512/avx2/shuffle.S +) + +if(${ARCH} STREQUAL "ARCH_x86_64") +set( + INC_AVX2_KYBER512 + crypto_kem/kyber512/avx2 +) + +define_kem_alg(kyber512_avx2 + PQCLEAN_KYBER512_AVX2 "${SRC_AVX2_KYBER512}" "${INC_AVX2_KYBER512}") +endif() + +# The rest of the library +set(SRC_COMMON_GENERIC + common/fips202.c + common/sp800-185.c + common/randombytes.c +) + +if(${ARCH} STREQUAL "ARCH_x86_64") +set(SRC_COMMON_AVX2 + common/keccak4x/KeccakP-1600-times4-SIMD256.c +) +endif() + +add_library( + common + OBJECT + ${SRC_COMMON_GENERIC} + ${SRC_COMMON_AVX2} +) + add_library( pqclean SHARED @@ -160,20 +279,27 @@ target_link_libraries( pqclean common pqclean_dilithium2_clean + pqclean_dilithium3_clean + pqclean_dilithium5_clean ) target_link_libraries( pqclean_s common pqclean_dilithium2_clean + pqclean_dilithium3_clean + pqclean_dilithium5_clean ) -add_executable( - test -) - -target_link_libraries( - test - pqclean_s - pqclean_test_dilithium2_clean -) +# TODO: this requires changes to testvectors.c +# add_executable( +# test +# ) +# +# target_link_libraries( +# test +# pqclean_s +# pqclean_test_dilithium2_clean +# pqclean_test_dilithium3_clean +# pqclean_test_dilithium5_clean +# )