From a3dc986d45475d463e3d66eb6add1ee94cc14b5b Mon Sep 17 00:00:00 2001 From: Station <arcticshine@gmail.com> Date: Fri, 6 Sep 2019 21:31:04 +0400 Subject: [PATCH] XKCP ready --- CMakeLists.txt | 241 ++++++- include/dap_crypto_common.h | 12 +- .../lib/high/Keccak/FIPS202/SimpleFIPS202.c | 19 + .../lib/high/Keccak/FIPS202/SimpleFIPS202.h | 11 +- .../SIMD128/KeccakP-1600-times2-SIMD128.c | 10 + src/dap_enc.c | 1 - src/dap_enc_iaes.c | 10 +- src/msrln/kex.c | 32 +- src/msrln/msrln.h | 1 - src/msrln/random.c | 31 +- src/sha3/fips202.c | 587 ------------------ src/sha3/fips202.h | 3 + src/sig_bliss/bliss_b.h | 5 +- src/sig_bliss/bliss_b_signatures.c | 10 +- src/sig_bliss/entropy.c | 2 +- src/sig_dilithium/dilithium_poly.c | 51 +- src/sig_dilithium/dilithium_sign.c | 41 +- src/sig_tesla/poly.c | 63 +- src/sig_tesla/sample.c | 108 ++-- src/sig_tesla/sign.c | 12 +- 20 files changed, 524 insertions(+), 726 deletions(-) delete mode 100755 src/sha3/fips202.c diff --git a/CMakeLists.txt b/CMakeLists.txt index a0fb81f..32fd82a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,8 +4,12 @@ project (dap_crypto) # fix implicit declaration warnings add_definitions ("-D_GNU_SOURCE") -set(CMAKE_C_FLAGS "-std=c11 -O2 -Wall -Wextra -fPIC -fno-pie -no-pie") -set(CMAKE_ASM_FLAGS "-std=c11 -O2 -Wall -Wextra -fPIC -fno-pie -no-pie") +#set(CMAKE_C_FLAGS "-std=c11 -O2 -Wall -Wextra -fPIC -fno-pie -no-pie -fno-ident ") +#set(CMAKE_ASM_FLAGS "-std=c11 -O2 -Wall -Wextra -fPIC -fno-pie -no-pie -fno-ident ") +#set(CMAKE_C_FLAGS "-std=c11 -O3 -Wall -Wextra -fPIC -fno-pie -no-pie -fno-ident -ffast-math -ftree-vectorize -mfpmath=sse -mmmx -msse2 -fno-asynchronous-unwind-tables -ffunction-sections -Wl,--gc-sections -Wl,--strip-all") +#set(CMAKE_ASM_FLAGS "-std=c11 -O3 -Wall -Wextra -fPIC -fno-pie -no-pie -fno-ident -ffast-math -ftree-vectorize -mfpmath=sse -mmmx -msse2 -fno-asynchronous-unwind-tables -ffunction-sections -Wl,--gc-sections -Wl,--strip-all") +#set(CMAKE_C_FLAGS "-static -Wall -O3 -fno-ident -ffast-math -ftree-vectorize -mfpmath=sse -mmmx -msse2 -fno-asynchronous-unwind-tables -ffunction-sections -Wl,--gc-sections -Wl,--strip-all") +#set(CMAKE_ASM_FLAGS "-static -Wall -O3 -fno-ident -ffast-math -ftree-vectorize -mfpmath=sse -mmmx -msse2 -fno-asynchronous-unwind-tables -ffunction-sections -Wl,--gc-sections -Wl,--strip-all") if(NOT (${SUBMODULES_NO_BUILD} MATCHES ON)) @@ -64,8 +68,9 @@ enable_language(ASM) file( GLOB XKCP_SRCS src/XKCP/lib/high/Keccak/FIPS202/KeccakHash.c - src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.c src/XKCP/lib/high/Keccak/KeccakSpongeWidth1600.c + src/XKCP/lib/high/Keccak/SP800-185/SP800-185.c + src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.c ) if(WIN32) @@ -89,24 +94,134 @@ add_library(${PROJECT_NAME} STATIC ${CRYPTO_SRCS} ${XKCP_SRCS} ${XKCP_SRCS2} ${C target_include_directories(dap_crypto PRIVATE src/rand src/iaes src/oaes sha3 src/msrln src/defeo_scheme src/sig_bliss src/sig_tesla src/sig_picnic src/sig_dilithium src include) target_include_directories(dap_crypto INTERFACE src/ src/sha3 include/) -target_include_directories(dap_crypto INTERFACE src/XKCP/lib/common) -target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/common) -target_include_directories(dap_crypto INTERFACE src/XKCP/lib/high/Keccak) -target_include_directories(dap_crypto INTERFACE src/XKCP/lib/high/Keccak/FIPS202) -target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600/Optimized) -target_include_directories(dap_crypto PRIVATE src/XKCP/lib/common) -target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/common) -target_include_directories(dap_crypto PRIVATE src/XKCP/lib/high/Keccak) -target_include_directories(dap_crypto PRIVATE src/XKCP/lib/high/Keccak/FIPS202) -target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600/Optimized) +target_include_directories(dap_crypto INTERFACE + src/XKCP/lib/common + src/XKCP/lib/low/common + src/XKCP/lib/high/Keccak + src/XKCP/lib/high/common + src/XKCP/lib/high/Keccak/FIPS202 + src/XKCP/lib/high/Keccak/SP800-185 + src/XKCP/lib/low/KeccakP-1600/Optimized +) + +target_include_directories(dap_crypto PRIVATE + src/XKCP/lib/common + src/XKCP/lib/low/common + src/XKCP/lib/high/Keccak + src/XKCP/lib/high/common + src/XKCP/lib/high/Keccak/FIPS202 + src/XKCP/lib/high/Keccak/SP800-185 + src/XKCP/lib/low/KeccakP-1600/Optimized +) if(WIN32) if(BUILD_64) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600/OptimizedAsmX86-64/win32) target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600/OptimizedAsmX86-64/win32) + + if(__AVX2__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512/AVX512ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512/AVX512ufull) + elseif(__SSE4_1__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128/SSE2ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128/SSE2ufull) + else() + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/FallbackOn1) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/FallbackOn1) + endif() + + if(__AVX2__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX512ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX512ufull) + elseif(__AVX__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD256) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX2ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD256) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX2ufull) + elseif(__SSE4_1__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn2) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn2) + else() + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn1) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn1) + endif() + + if(__AVX2__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512/AVX512ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512/AVX512ufull) + elseif(__AVX__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn4) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn4) + elseif(__SSE4_1__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn2) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn2) + else() + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn1) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn1) + endif() + else() target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600/Inplace32BI) target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600/Inplace32BI) + + if(__AVX2__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512/AVX512ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512/AVX512ufull) + elseif(__SSE4_1__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128/SSE2ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128/SSE2ufull) + else() + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/FallbackOn1) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/FallbackOn1) + endif() + + if(__AVX2__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX512ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX512ufull) + elseif(__AVX__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD256) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX2ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD256) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX2ufull) + elseif(__SSE4_1__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn2) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn2) + else() + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn1) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn1) + endif() + + if(__AVX2__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512/AVX512ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512/AVX512ufull) + elseif(__AVX__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn4) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn4) + elseif(__SSE4_1__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn2) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn2) + else() + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn1) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn1) + endif() + endif() endif() @@ -114,9 +229,109 @@ if(UNIX) if(BUILD_64) target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600/OptimizedAsmX86-64) target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600/OptimizedAsmX86-64) + + if(__AVX2__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512/AVX512ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512/AVX512ufull) + elseif(__SSE4_1__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128/SSE2ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128/SSE2ufull) + else() + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/FallbackOn1) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/FallbackOn1) + endif() + + if(__AVX2__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX512ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX512ufull) + elseif(__AVX__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD256) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX2ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD256) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX2ufull) + elseif(__SSE4_1__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn2) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn2) + else() + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn1) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn1) + endif() + + if(__AVX2__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512/AVX512ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512/AVX512ufull) + elseif(__AVX__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn4) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn4) + elseif(__SSE4_1__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn2) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn2) + else() + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn1) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn1) + endif() + else() target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600/Inplace32BI) target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600/Inplace32BI) + + if(__AVX2__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512/AVX512ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD512/AVX512ufull) + elseif(__SSE4_1__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128/SSE2ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/SIMD128/SSE2ufull) + else() + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times2/FallbackOn1) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times2/FallbackOn1) + endif() + + if(__AVX2__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX512ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX512ufull) + elseif(__AVX__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD256) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX2ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD256) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/SIMD512/AVX2ufull) + elseif(__SSE4_1__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn2) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn2) + else() + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn1) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times4/FallbackOn1) + endif() + + if(__AVX2__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512/AVX512ufull) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/SIMD512/AVX512ufull) + elseif(__AVX__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn4) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn4) + elseif(__SSE4_1__) + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn2) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn2) + else() + target_include_directories(dap_crypto INTERFACE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn1) + target_include_directories(dap_crypto PRIVATE src/XKCP/lib/low/KeccakP-1600-times8/FallbackOn1) + endif() + endif() endif() diff --git a/include/dap_crypto_common.h b/include/dap_crypto_common.h index f1d09a2..ce80839 100755 --- a/include/dap_crypto_common.h +++ b/include/dap_crypto_common.h @@ -7,13 +7,21 @@ extern "C" { #endif - #include <stdint.h> #include <stdbool.h> #include <stddef.h> -#include "rand/dap_rand.h" + +#include "dap_common.h" + #include "sha3/fips202.h" +#include "KeccakHash.h" +#include "SimpleFIPS202.h" +#include "SP800-185.h" + +#include "rand/dap_rand.h" + + // Definition of operating system #define OS_WIN 1 diff --git a/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.c b/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.c index 6dc9423..3336f68 100755 --- a/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.c +++ b/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.c @@ -16,6 +16,25 @@ int SHAKE128(unsigned char *output, size_t outputByteLen, const unsigned char *i return KeccakWidth1600_Sponge(1344, 256, input, inputByteLen, 0x1F, output, outputByteLen); } +void SHAKE128_InitAbsorb(Keccak_HashInstance *ks, const unsigned char *input, size_t inputByteLen) +{ + Keccak_HashInitialize_SHAKE128( ks ); + Keccak_HashUpdate( &ks, input, inputByteLen * 8 ); + Keccak_HashFinal( &ks, input ); +} + +void SHAKE256_InitAbsorb(Keccak_HashInstance *ks, const unsigned char *input, size_t inputByteLen) +{ + Keccak_HashInitialize_SHAKE256( ks ); + Keccak_HashUpdate( &ks, input, inputByteLen * 8 ); + Keccak_HashFinal( &ks, input ); +} + +void KECCAK_HashSqueeze(Keccak_HashInstance *ks, const unsigned char *out, size_t outByteLen) +{ + Keccak_HashSqueeze( &ks, (unsigned char *)out, outByteLen * 8 ); +} + int SHAKE256(unsigned char *output, size_t outputByteLen, const unsigned char *input, size_t inputByteLen) { return KeccakWidth1600_Sponge(1088, 512, input, inputByteLen, 0x1F, output, outputByteLen); diff --git a/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h b/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h index b451f3e..a2fa944 100755 --- a/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h +++ b/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h @@ -12,6 +12,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ #ifndef _SimpleFIPS202_h_ #define _SimpleFIPS202_h_ +#include "KeccakHash.h" #include "KeccakSpongeWidth1600.h" #include <string.h> @@ -60,15 +61,15 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ int SHAKE128(unsigned char *output, size_t outputByteLen, const unsigned char *input, size_t inputByteLen); - int SHAKE256(unsigned char *output, size_t outputByteLen, const unsigned char *input, size_t inputByteLen); - int SHA3_224(unsigned char *output, const unsigned char *input, size_t inputByteLen); - int SHA3_256(unsigned char *output, const unsigned char *input, size_t inputByteLen); - int SHA3_384(unsigned char *output, const unsigned char *input, size_t inputByteLen); - int SHA3_512(unsigned char *output, const unsigned char *input, size_t inputByteLen); +void SHAKE128_InitAbsorb( Keccak_HashInstance *ks, const unsigned char *input, size_t inputByteLen ); +void SHAKE256_InitAbsorb( Keccak_HashInstance *ks, const unsigned char *input, size_t inputByteLen ); +void KECCAK_HashSqueeze(Keccak_HashInstance *ks, const unsigned char *out, size_t outByteLen); + + #endif diff --git a/src/XKCP/lib/low/KeccakP-1600-times2/SIMD128/KeccakP-1600-times2-SIMD128.c b/src/XKCP/lib/low/KeccakP-1600-times2/SIMD128/KeccakP-1600-times2-SIMD128.c index 99e59c6..47d4ca5 100755 --- a/src/XKCP/lib/low/KeccakP-1600-times2/SIMD128/KeccakP-1600-times2-SIMD128.c +++ b/src/XKCP/lib/low/KeccakP-1600-times2/SIMD128/KeccakP-1600-times2-SIMD128.c @@ -21,6 +21,16 @@ Please refer to LowLevel.build for the exact list of other files it must be comb #include <stdlib.h> #include <string.h> #include <x86intrin.h> +// #include <x86intrin.h> + +//#include <smmintrin.h> +//#include <wmmintrin.h> +//#include <immintrin.h> +//#include <emmintrin.h> + +// #include <mmintrin.h> +// #include <emmintrin.h> + #include "align.h" #include "KeccakP-1600-times2-SnP.h" #include "SIMD128-config.h" diff --git a/src/dap_enc.c b/src/dap_enc.c index 93404a8..8ad781c 100755 --- a/src/dap_enc.c +++ b/src/dap_enc.c @@ -18,7 +18,6 @@ along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. */ - #ifndef _WIN32 #include <arpa/inet.h> #endif diff --git a/src/dap_enc_iaes.c b/src/dap_enc_iaes.c index 5decb17..bdd4a25 100755 --- a/src/dap_enc_iaes.c +++ b/src/dap_enc_iaes.c @@ -3,7 +3,11 @@ #include <string.h> #include "dap_enc_key.h" #include "dap_enc_iaes.h" -#include "sha3/fips202.h" +//#include "sha3/fips202.h" + +#include "KeccakHash.h" +#include "SimpleFIPS202.h" + #include "dap_common.h" @@ -52,8 +56,8 @@ void dap_enc_aes_key_generate(struct dap_enc_key * a_key, const void *kex_buf, memcpy(id_concat_kex,seed, seed_size); memcpy(id_concat_kex + seed_size, kex_buf, kex_size); - shake256(a_key->priv_key_data, IAES_KEYSIZE, id_concat_kex, (kex_size + seed_size)); - shake128(DAP_ENC_AES_KEY(a_key)->ivec, IAES_BLOCK_SIZE, seed, seed_size); + SHAKE256(a_key->priv_key_data, IAES_KEYSIZE, id_concat_kex, (kex_size + seed_size)); + SHAKE128(DAP_ENC_AES_KEY(a_key)->ivec, IAES_BLOCK_SIZE, seed, seed_size); free(id_concat_kex); } diff --git a/src/msrln/kex.c b/src/msrln/kex.c index 558f3cb..942c5ae 100755 --- a/src/msrln/kex.c +++ b/src/msrln/kex.c @@ -5,6 +5,9 @@ #include <malloc.h> #endif +#include "KeccakHash.h" +#include "SimpleFIPS202.h" + // N^-1 * prime_scale^-8 const int32_t MSRLN_Ninv8_ntt1024_12289 = 8350; @@ -383,12 +386,12 @@ static __inline uint32_t LDDecode(int32_t* t) uint32_t mask1, mask2, value; int32_t cneg = -8*PARAMETER_Q; - for (i = 0; i < 4; i++) { + for (i = 0; i < 4; i++) { mask1 = t[i] >> 31; // If t[i] < 0 then mask2 = 0xff...ff, else mask2 = 0 mask2 = (4*PARAMETER_Q - (int32_t)Abs(t[i])) >> 31; // If 4*PARAMETER_Q > Abs(t[i]) then mask2 = 0, else mask2 = 0xff...ff value = ((mask1 & (8*PARAMETER_Q ^ cneg)) ^ cneg); - norm += Abs(t[i] + (mask2 & value)); + norm += Abs(t[i] + (mask2 & value)); } return ((8*PARAMETER_Q - norm) >> 31) ^ 1; // If norm < PARAMETER_Q then return 1, else return 0 @@ -464,9 +467,21 @@ CRYPTO_MSRLN_STATUS generate_a(uint32_t* a, const unsigned char* seed, Extendabl uint16_t val; unsigned int nblocks = 16; uint8_t buf[SHAKE128_RATE * 16]; // was * nblocks, but VS doesn't like this buf init - uint64_t state[SHA3_STATESIZE] = {0}; - shake128_absorb(state, seed, SEED_BYTES); - shake128_squeezeblocks((unsigned char *) buf, nblocks, state); + Keccak_HashInstance ks; + +// uint64_t state[SHA3_STATESIZE] = {0}; +// shake128_absorb(state, seed, SEED_BYTES); +// shake128_squeezeblocks((unsigned char *) buf, nblocks, state); + + #ifdef _WIN32 + SHAKE128_InitAbsorb( &ks, seed, SEED_BYTES ); + KECCAK_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 ); + #else + Keccak_HashInitialize_SHAKE128(&ks); + Keccak_HashUpdate( &ks, seed, SEED_BYTES * 8 ); + Keccak_HashFinal( &ks, seed ); + Keccak_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 * 8 ); + #endif while (ctr < PARAMETER_N) { val = (buf[pos] | ((uint16_t) buf[pos + 1] << 8)) & 0x3fff; @@ -476,7 +491,12 @@ CRYPTO_MSRLN_STATUS generate_a(uint32_t* a, const unsigned char* seed, Extendabl pos += 2; if (pos > SHAKE128_RATE * nblocks - 2) { nblocks = 1; - shake128_squeezeblocks((unsigned char *) buf, nblocks, state); +// shake128_squeezeblocks((unsigned char *) buf, nblocks, state); + #ifdef _WIN32 + KECCAK_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 ); + #else + Keccak_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 * 8 ); + #endif pos = 0; } } diff --git a/src/msrln/msrln.h b/src/msrln/msrln.h index ab41100..5b54822 100755 --- a/src/msrln/msrln.h +++ b/src/msrln/msrln.h @@ -7,7 +7,6 @@ extern "C" { #endif - #include <stdint.h> #include <stdbool.h> #include <stddef.h> diff --git a/src/msrln/random.c b/src/msrln/random.c index 4ab40d8..e5a760c 100755 --- a/src/msrln/random.c +++ b/src/msrln/random.c @@ -1,5 +1,10 @@ #include "msrln_priv.h" +//#include "KeccakHash.h" +//#include "SimpleFIPS202.h" + +#define LOG_TAG "RANDOM" + CRYPTO_MSRLN_STATUS MSRLN_generate_a(const unsigned char* seed, unsigned int seed_nbytes, unsigned int array_ndigits, uint32_t* a) { // Generation of parameter a @@ -7,9 +12,21 @@ CRYPTO_MSRLN_STATUS MSRLN_generate_a(const unsigned char* seed, unsigned int see uint16_t val; unsigned int nblocks = 16; uint8_t buf[SHAKE128_RATE * 16]; // was * nblocks, but VS doesn't like this buf init - uint64_t state[SHA3_STATESIZE]; - shake128_absorb(state, seed, seed_nbytes); - shake128_squeezeblocks((unsigned char *) buf, nblocks, state); + Keccak_HashInstance ks; + +// uint64_t state[SHA3_STATESIZE]; +// shake128_absorb(state, seed, seed_nbytes); +// shake128_squeezeblocks((unsigned char *) buf, nblocks, state); + + #ifdef _WIN32 + SHAKE128_InitAbsorb( &ks, seed, seed_nbytes ); + KECCAK_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 ); + #else + Keccak_HashInitialize_SHAKE128(&ks); + Keccak_HashUpdate( &ks, seed, seed_nbytes * 8 ); + Keccak_HashFinal( &ks, seed ); + Keccak_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 * 8 ); + #endif while (ctr < array_ndigits) { val = (buf[pos] | ((uint16_t) buf[pos + 1] << 8)) & 0x3fff; @@ -19,10 +36,16 @@ CRYPTO_MSRLN_STATUS MSRLN_generate_a(const unsigned char* seed, unsigned int see pos += 2; if (pos > SHAKE128_RATE * nblocks - 2) { nblocks = 1; - shake128_squeezeblocks((unsigned char *) buf, nblocks, state); +// shake128_squeezeblocks((unsigned char *) buf, nblocks, state); + #ifdef _WIN32 + KECCAK_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 ); + #else + Keccak_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 * 8 ); + #endif pos = 0; } } + return CRYPTO_MSRLN_SUCCESS; } diff --git a/src/sha3/fips202.c b/src/sha3/fips202.c deleted file mode 100755 index 022be71..0000000 --- a/src/sha3/fips202.c +++ /dev/null @@ -1,587 +0,0 @@ -/******************************************************************************************** -* SHA3-derived functions: SHAKE and cSHAKE -* -* Based on the public domain implementation in crypto_hash/keccakc512/simple/ -* from http://bench.cr.yp.to/supercop.html by Ronny Van Keer -* and the public domain "TweetFips202" implementation from https://twitter.com/tweetfips202 -* by Gilles Van Assche, Daniel J. Bernstein, and Peter Schwabe -* -* See NIST Special Publication 800-185 for more information: -* http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-185.pdf -* -*********************************************************************************************/ - -#include <stdint.h> -#include <assert.h> -#include "fips202.h" - -#define NROUNDS 24 -#define ROL(a, offset) ((a << offset) ^ (a >> (64-offset))) - - -static uint64_t load64(const unsigned char *x) -{ - unsigned long long r = 0, i; - - for (i = 0; i < 8; ++i) { - r |= (unsigned long long)x[i] << 8 * i; - } - return r; -} - - -static void store64(uint8_t *x, uint64_t u) -{ - unsigned int i; - - for (i = 0; i < 8; ++i) { - x[i] = (uint8_t)u; - u >>= 8; - } -} - - -static const uint64_t KeccakF_RoundConstants[NROUNDS] = -{ - (uint64_t)0x0000000000000001ULL, - (uint64_t)0x0000000000008082ULL, - (uint64_t)0x800000000000808aULL, - (uint64_t)0x8000000080008000ULL, - (uint64_t)0x000000000000808bULL, - (uint64_t)0x0000000080000001ULL, - (uint64_t)0x8000000080008081ULL, - (uint64_t)0x8000000000008009ULL, - (uint64_t)0x000000000000008aULL, - (uint64_t)0x0000000000000088ULL, - (uint64_t)0x0000000080008009ULL, - (uint64_t)0x000000008000000aULL, - (uint64_t)0x000000008000808bULL, - (uint64_t)0x800000000000008bULL, - (uint64_t)0x8000000000008089ULL, - (uint64_t)0x8000000000008003ULL, - (uint64_t)0x8000000000008002ULL, - (uint64_t)0x8000000000000080ULL, - (uint64_t)0x000000000000800aULL, - (uint64_t)0x800000008000000aULL, - (uint64_t)0x8000000080008081ULL, - (uint64_t)0x8000000000008080ULL, - (uint64_t)0x0000000080000001ULL, - (uint64_t)0x8000000080008008ULL -}; - - -void KeccakF1600_StatePermute(uint64_t * state) -{ - int round; - - uint64_t Aba, Abe, Abi, Abo, Abu; - uint64_t Aga, Age, Agi, Ago, Agu; - uint64_t Aka, Ake, Aki, Ako, Aku; - uint64_t Ama, Ame, Ami, Amo, Amu; - uint64_t Asa, Ase, Asi, Aso, Asu; - uint64_t BCa, BCe, BCi, BCo, BCu; - uint64_t Da, De, Di, Do, Du; - uint64_t Eba, Ebe, Ebi, Ebo, Ebu; - uint64_t Ega, Ege, Egi, Ego, Egu; - uint64_t Eka, Eke, Eki, Eko, Eku; - uint64_t Ema, Eme, Emi, Emo, Emu; - uint64_t Esa, Ese, Esi, Eso, Esu; - - //copyFromState(A, state) - Aba = state[ 0]; - Abe = state[ 1]; - Abi = state[ 2]; - Abo = state[ 3]; - Abu = state[ 4]; - Aga = state[ 5]; - Age = state[ 6]; - Agi = state[ 7]; - Ago = state[ 8]; - Agu = state[ 9]; - Aka = state[10]; - Ake = state[11]; - Aki = state[12]; - Ako = state[13]; - Aku = state[14]; - Ama = state[15]; - Ame = state[16]; - Ami = state[17]; - Amo = state[18]; - Amu = state[19]; - Asa = state[20]; - Ase = state[21]; - Asi = state[22]; - Aso = state[23]; - Asu = state[24]; - - for( round = 0; round < NROUNDS; round += 2 ) - { - // prepareTheta - BCa = Aba^Aga^Aka^Ama^Asa; - BCe = Abe^Age^Ake^Ame^Ase; - BCi = Abi^Agi^Aki^Ami^Asi; - BCo = Abo^Ago^Ako^Amo^Aso; - BCu = Abu^Agu^Aku^Amu^Asu; - - //thetaRhoPiChiIotaPrepareTheta(round , A, E) - Da = BCu^ROL(BCe, 1); - De = BCa^ROL(BCi, 1); - Di = BCe^ROL(BCo, 1); - Do = BCi^ROL(BCu, 1); - Du = BCo^ROL(BCa, 1); - - Aba ^= Da; - BCa = Aba; - Age ^= De; - BCe = ROL(Age, 44); - Aki ^= Di; - BCi = ROL(Aki, 43); - Amo ^= Do; - BCo = ROL(Amo, 21); - Asu ^= Du; - BCu = ROL(Asu, 14); - Eba = BCa ^((~BCe)& BCi ); - Eba ^= (uint64_t)KeccakF_RoundConstants[round]; - Ebe = BCe ^((~BCi)& BCo ); - Ebi = BCi ^((~BCo)& BCu ); - Ebo = BCo ^((~BCu)& BCa ); - Ebu = BCu ^((~BCa)& BCe ); - - Abo ^= Do; - BCa = ROL(Abo, 28); - Agu ^= Du; - BCe = ROL(Agu, 20); - Aka ^= Da; - BCi = ROL(Aka, 3); - Ame ^= De; - BCo = ROL(Ame, 45); - Asi ^= Di; - BCu = ROL(Asi, 61); - Ega = BCa ^((~BCe)& BCi ); - Ege = BCe ^((~BCi)& BCo ); - Egi = BCi ^((~BCo)& BCu ); - Ego = BCo ^((~BCu)& BCa ); - Egu = BCu ^((~BCa)& BCe ); - - Abe ^= De; - BCa = ROL(Abe, 1); - Agi ^= Di; - BCe = ROL(Agi, 6); - Ako ^= Do; - BCi = ROL(Ako, 25); - Amu ^= Du; - BCo = ROL(Amu, 8); - Asa ^= Da; - BCu = ROL(Asa, 18); - Eka = BCa ^((~BCe)& BCi ); - Eke = BCe ^((~BCi)& BCo ); - Eki = BCi ^((~BCo)& BCu ); - Eko = BCo ^((~BCu)& BCa ); - Eku = BCu ^((~BCa)& BCe ); - - Abu ^= Du; - BCa = ROL(Abu, 27); - Aga ^= Da; - BCe = ROL(Aga, 36); - Ake ^= De; - BCi = ROL(Ake, 10); - Ami ^= Di; - BCo = ROL(Ami, 15); - Aso ^= Do; - BCu = ROL(Aso, 56); - Ema = BCa ^((~BCe)& BCi ); - Eme = BCe ^((~BCi)& BCo ); - Emi = BCi ^((~BCo)& BCu ); - Emo = BCo ^((~BCu)& BCa ); - Emu = BCu ^((~BCa)& BCe ); - - Abi ^= Di; - BCa = ROL(Abi, 62); - Ago ^= Do; - BCe = ROL(Ago, 55); - Aku ^= Du; - BCi = ROL(Aku, 39); - Ama ^= Da; - BCo = ROL(Ama, 41); - Ase ^= De; - BCu = ROL(Ase, 2); - Esa = BCa ^((~BCe)& BCi ); - Ese = BCe ^((~BCi)& BCo ); - Esi = BCi ^((~BCo)& BCu ); - Eso = BCo ^((~BCu)& BCa ); - Esu = BCu ^((~BCa)& BCe ); - - // prepareTheta - BCa = Eba^Ega^Eka^Ema^Esa; - BCe = Ebe^Ege^Eke^Eme^Ese; - BCi = Ebi^Egi^Eki^Emi^Esi; - BCo = Ebo^Ego^Eko^Emo^Eso; - BCu = Ebu^Egu^Eku^Emu^Esu; - - //thetaRhoPiChiIotaPrepareTheta(round+1, E, A) - Da = BCu^ROL(BCe, 1); - De = BCa^ROL(BCi, 1); - Di = BCe^ROL(BCo, 1); - Do = BCi^ROL(BCu, 1); - Du = BCo^ROL(BCa, 1); - - Eba ^= Da; - BCa = Eba; - Ege ^= De; - BCe = ROL(Ege, 44); - Eki ^= Di; - BCi = ROL(Eki, 43); - Emo ^= Do; - BCo = ROL(Emo, 21); - Esu ^= Du; - BCu = ROL(Esu, 14); - Aba = BCa ^((~BCe)& BCi ); - Aba ^= (uint64_t)KeccakF_RoundConstants[round+1]; - Abe = BCe ^((~BCi)& BCo ); - Abi = BCi ^((~BCo)& BCu ); - Abo = BCo ^((~BCu)& BCa ); - Abu = BCu ^((~BCa)& BCe ); - - Ebo ^= Do; - BCa = ROL(Ebo, 28); - Egu ^= Du; - BCe = ROL(Egu, 20); - Eka ^= Da; - BCi = ROL(Eka, 3); - Eme ^= De; - BCo = ROL(Eme, 45); - Esi ^= Di; - BCu = ROL(Esi, 61); - Aga = BCa ^((~BCe)& BCi ); - Age = BCe ^((~BCi)& BCo ); - Agi = BCi ^((~BCo)& BCu ); - Ago = BCo ^((~BCu)& BCa ); - Agu = BCu ^((~BCa)& BCe ); - - Ebe ^= De; - BCa = ROL(Ebe, 1); - Egi ^= Di; - BCe = ROL(Egi, 6); - Eko ^= Do; - BCi = ROL(Eko, 25); - Emu ^= Du; - BCo = ROL(Emu, 8); - Esa ^= Da; - BCu = ROL(Esa, 18); - Aka = BCa ^((~BCe)& BCi ); - Ake = BCe ^((~BCi)& BCo ); - Aki = BCi ^((~BCo)& BCu ); - Ako = BCo ^((~BCu)& BCa ); - Aku = BCu ^((~BCa)& BCe ); - - Ebu ^= Du; - BCa = ROL(Ebu, 27); - Ega ^= Da; - BCe = ROL(Ega, 36); - Eke ^= De; - BCi = ROL(Eke, 10); - Emi ^= Di; - BCo = ROL(Emi, 15); - Eso ^= Do; - BCu = ROL(Eso, 56); - Ama = BCa ^((~BCe)& BCi ); - Ame = BCe ^((~BCi)& BCo ); - Ami = BCi ^((~BCo)& BCu ); - Amo = BCo ^((~BCu)& BCa ); - Amu = BCu ^((~BCa)& BCe ); - - Ebi ^= Di; - BCa = ROL(Ebi, 62); - Ego ^= Do; - BCe = ROL(Ego, 55); - Eku ^= Du; - BCi = ROL(Eku, 39); - Ema ^= Da; - BCo = ROL(Ema, 41); - Ese ^= De; - BCu = ROL(Ese, 2); - Asa = BCa ^((~BCe)& BCi ); - Ase = BCe ^((~BCi)& BCo ); - Asi = BCi ^((~BCo)& BCu ); - Aso = BCo ^((~BCu)& BCa ); - Asu = BCu ^((~BCa)& BCe ); - } - - //copyToState(state, A) - state[ 0] = Aba; - state[ 1] = Abe; - state[ 2] = Abi; - state[ 3] = Abo; - state[ 4] = Abu; - state[ 5] = Aga; - state[ 6] = Age; - state[ 7] = Agi; - state[ 8] = Ago; - state[ 9] = Agu; - state[10] = Aka; - state[11] = Ake; - state[12] = Aki; - state[13] = Ako; - state[14] = Aku; - state[15] = Ama; - state[16] = Ame; - state[17] = Ami; - state[18] = Amo; - state[19] = Amu; - state[20] = Asa; - state[21] = Ase; - state[22] = Asi; - state[23] = Aso; - state[24] = Asu; - - #undef round -} - -#include <string.h> -#define MIN(a, b) ((a) < (b) ? (a) : (b)) - - -static void keccak_absorb(uint64_t *s, unsigned int r, const unsigned char *m, unsigned long long int mlen, unsigned char p) -{ - unsigned long long i; - unsigned char t[200]; - - while (mlen >= r) - { - for (i = 0; i < r / 8; ++i) - s[i] ^= load64(m + 8 * i); - - KeccakF1600_StatePermute(s); - mlen -= r; - m += r; - } - - for (i = 0; i < r; ++i) - t[i] = 0; - for (i = 0; i < mlen; ++i) - t[i] = m[i]; - t[i] = p; - t[r - 1] |= 128; - for (i = 0; i < r / 8; ++i) - s[i] ^= load64(t + 8 * i); -} - - -static void keccak_squeezeblocks(unsigned char *h, unsigned long long int nblocks, uint64_t *s, unsigned int r) -{ - unsigned int i; - - while(nblocks > 0) - { - KeccakF1600_StatePermute(s); - for (i = 0; i < (r>>3); i++) - { - store64(h+8*i, s[i]); - } - h += r; - nblocks--; - } -} - - -/********** SHAKE128 ***********/ - -void shake128_absorb(uint64_t *s, const unsigned char *input, unsigned int inputByteLen) -{ - keccak_absorb(s, SHAKE128_RATE, input, inputByteLen, 0x1F); -} - - -void shake128_squeezeblocks(unsigned char *output, unsigned long long nblocks, uint64_t *s) -{ - keccak_squeezeblocks(output, nblocks, s, SHAKE128_RATE); -} - - -void shake128(unsigned char *output, unsigned long long outlen, const unsigned char *input, unsigned long long inlen) -{ - uint64_t s[25] = {0}; - unsigned char t[SHAKE128_RATE]; - unsigned long long nblocks = outlen/SHAKE128_RATE; - size_t i; - - /* Absorb input */ - keccak_absorb(s, SHAKE128_RATE, input, inlen, 0x1F); - - /* Squeeze output */ - keccak_squeezeblocks(output, nblocks, s, SHAKE128_RATE); - - output += nblocks*SHAKE128_RATE; - outlen -= nblocks*SHAKE128_RATE; - - if (outlen) - { - keccak_squeezeblocks(t, 1, s, SHAKE128_RATE); - for (i = 0; i < outlen; i++) - output[i] = t[i]; - } -} - - -/********** cSHAKE128 ***********/ - -void cshake128_simple_absorb(uint64_t s[25], uint16_t cstm, const unsigned char *in, unsigned long long inlen) -{ - unsigned char *sep = (unsigned char*)s; - - /* Absorb customization (domain-separation) string */ - sep[0] = 0x01; - sep[1] = 0xa8; - sep[2] = 0x01; - sep[3] = 0x00; - sep[4] = 0x01; - sep[5] = 16; // fixed bitlen of cstm - sep[6] = cstm & 0xff; - sep[7] = cstm >> 8; - - KeccakF1600_StatePermute(s); - - /* Absorb input */ - keccak_absorb(s, SHAKE128_RATE, in, inlen, 0x04); -} - - -void cshake128_simple_squeezeblocks(unsigned char *output, unsigned long long nblocks, uint64_t *s) -{ - keccak_squeezeblocks(output, nblocks, s, SHAKE128_RATE); -} - - -void cshake128_simple(unsigned char *output, unsigned long long outlen, uint16_t cstm, const unsigned char *in, unsigned long long inlen) -{ - uint64_t s[25] = {0}; - unsigned char t[SHAKE128_RATE]; - unsigned int i; - - cshake128_simple_absorb(s, cstm, in, inlen); - - /* Squeeze output */ - keccak_squeezeblocks(output, outlen/SHAKE128_RATE, s, SHAKE128_RATE); - output += (outlen/SHAKE128_RATE)*SHAKE128_RATE; - - if (outlen%SHAKE128_RATE) - { - keccak_squeezeblocks(t, 1, s, SHAKE128_RATE); - for (i = 0; i < outlen%SHAKE128_RATE; i++) - output[i] = t[i]; - } -} - - -/********** SHAKE256 ***********/ - -void shake256_absorb(uint64_t *s, const unsigned char *input, unsigned int inputByteLen) -{ - keccak_absorb(s, SHAKE256_RATE, input, inputByteLen, 0x1F); -} - - -void shake256_squeezeblocks(unsigned char *output, unsigned long long nblocks, uint64_t *s) -{ - keccak_squeezeblocks(output, nblocks, s, SHAKE256_RATE); -} - - -void shake256(unsigned char *output, unsigned long long outlen, const unsigned char *input, unsigned long long inlen) -{ - uint64_t s[25] = {0}; - unsigned char t[SHAKE256_RATE]; - unsigned long long nblocks = outlen/SHAKE256_RATE; - size_t i; - - /* Absorb input */ - keccak_absorb(s, SHAKE256_RATE, input, inlen, 0x1F); - - /* Squeeze output */ - keccak_squeezeblocks(output, nblocks, s, SHAKE256_RATE); - - output += nblocks*SHAKE256_RATE; - outlen -= nblocks*SHAKE256_RATE; - - if (outlen) - { - keccak_squeezeblocks(t, 1, s, SHAKE256_RATE); - for (i = 0; i < outlen; i++) - output[i] = t[i]; - } -} - - -/********** cSHAKE256 ***********/ - -void cshake256_simple_absorb(uint64_t s[25], uint16_t cstm, const unsigned char *in, unsigned long long inlen) -{ - unsigned char *sep = (unsigned char*)s; - - /* Absorb customization (domain-separation) string */ - sep[0] = 0x01; - sep[1] = 0x88; - sep[2] = 0x01; - sep[3] = 0x00; - sep[4] = 0x01; - sep[5] = 16; // fixed bitlen of cstm - sep[6] = cstm & 0xff; - sep[7] = cstm >> 8; - - KeccakF1600_StatePermute(s); - - /* Absorb input */ - keccak_absorb(s, SHAKE256_RATE, in, inlen, 0x04); -} - - -void cshake256_simple_squeezeblocks(unsigned char *output, unsigned long long nblocks, uint64_t *s) -{ - keccak_squeezeblocks(output, nblocks, s, SHAKE256_RATE); -} - - -void cshake256_simple(unsigned char *output, unsigned long long outlen, uint16_t cstm, const unsigned char *in, unsigned long long inlen) -{ - uint64_t s[25] = {0}; - unsigned char t[SHAKE256_RATE]; - unsigned int i; - - cshake256_simple_absorb(s, cstm, in, inlen); - - /* Squeeze output */ - keccak_squeezeblocks(output, outlen/SHAKE256_RATE, s, SHAKE256_RATE); - output += (outlen/SHAKE256_RATE)*SHAKE256_RATE; - - if(outlen%SHAKE256_RATE) - { - keccak_squeezeblocks(t, 1, s, SHAKE256_RATE); - for (i = 0; i < outlen%SHAKE256_RATE; i++) - output[i] = t[i]; - } -} - -void sha3_256(unsigned char *output, const unsigned char *input, unsigned int inputByteLen) -{ - uint64_t s[25] = {0}; - unsigned char t[SHA3_256_RATE]; - int i; - - keccak_absorb(s, SHA3_256_RATE, input, inputByteLen, 0x06); - keccak_squeezeblocks(t, 1, s, SHA3_256_RATE); - for(i=0;i<32;i++) - output[i] = t[i]; -} - -void sha3_512(unsigned char *output, const unsigned char *input, unsigned int inputByteLen) -{ - uint64_t s[25] = {0}; - unsigned char t[SHA3_512_RATE]; - uint32_t i; - - keccak_absorb(s, SHA3_512_RATE, input, inputByteLen, 0x06); - keccak_squeezeblocks(t, 1, s, SHA3_512_RATE); - for(i=0;i<64;i++) - output[i] = t[i]; -} - diff --git a/src/sha3/fips202.h b/src/sha3/fips202.h index e38de9b..40b3fa7 100755 --- a/src/sha3/fips202.h +++ b/src/sha3/fips202.h @@ -12,6 +12,7 @@ #define SHA3_256_RATE 136 +#if 0 void shake128_absorb(uint64_t *s, const unsigned char *input, unsigned int inputByteLen); void shake128_squeezeblocks(unsigned char *output, unsigned long long nblocks, uint64_t *s); void shake128(unsigned char *output, unsigned long long outlen, const unsigned char *input, unsigned long long inlen); @@ -30,5 +31,7 @@ void cshake256_simple(unsigned char *output, unsigned long long outlen, uint16_t void sha3_256(unsigned char *output, const unsigned char *input, unsigned int inputByteLen); void sha3_512(unsigned char *output, const unsigned char *input, unsigned int inputByteLen); +#endif + #endif diff --git a/src/sig_bliss/bliss_b.h b/src/sig_bliss/bliss_b.h index f31f6a3..c60800b 100755 --- a/src/sig_bliss/bliss_b.h +++ b/src/sig_bliss/bliss_b.h @@ -5,7 +5,10 @@ #include <stddef.h> #include <stdlib.h> #include <assert.h> -#include "../sha3/fips202.h" +//#include "../sha3/fips202.h" + +#include "KeccakHash.h" +#include "SimpleFIPS202.h" #define BLISS_B_CRYPTO_SECRETKEYBYTES 256 #define BLISS_B_CRYPTO_PUBLICKEYBYTES 85 diff --git a/src/sig_bliss/bliss_b_signatures.c b/src/sig_bliss/bliss_b_signatures.c index 712fa78..4feee4e 100755 --- a/src/sig_bliss/bliss_b_signatures.c +++ b/src/sig_bliss/bliss_b_signatures.c @@ -134,7 +134,7 @@ static void generateC(uint32_t *indices, uint32_t kappa, const int32_t *n_vector * (so that n_vector[n-1] is taken into account). */ hash[hash_sz - 1]++; - sha3_512(whash, hash, hash_sz); + SHA3_512(whash, hash, hash_sz); memset(array, 0, n); @@ -234,7 +234,7 @@ static void submul_c(int32_t *z, uint32_t n, const int32_t *s, const uint32_t *c * (2 * zeta * a * z1 + zeta * q * c + z2) == v mod 2q */ static void check_before_drop(const bliss_private_key_t *key, uint8_t *hash, uint32_t hash_sz, - const int32_t *v, const int32_t *y1, const int32_t *y2, bliss_param_t *p, ntt_state_t state) { + const int32_t *v, const int32_t *y1, const int32_t *y2, bliss_param_t *p, ntt_state_t state) { int32_t z1[512], z2[512], aux[512]; uint32_t c[40]; int32_t q; @@ -473,7 +473,8 @@ int32_t bliss_b_sign(bliss_signature_t *signature, const bliss_private_key_t *p } /* 0: compute the hash of the msg */ - sha3_512(hash, msg, msg_sz); + + SHA3_512(hash, msg, msg_sz); // for debugging if (false) { @@ -828,7 +829,8 @@ int32_t bliss_b_verify(const bliss_signature_t *signature, const bliss_public_k } /* hash the message into the first SHA3_512_DIGEST_LENGTH bytes of the hash */ - sha3_512(hash, msg, msg_sz); + + SHA3_512(hash, msg, msg_sz); if (false) { printf("verify hash\n"); diff --git a/src/sig_bliss/entropy.c b/src/sig_bliss/entropy.c index 74d26e7..e7fbf3d 100755 --- a/src/sig_bliss/entropy.c +++ b/src/sig_bliss/entropy.c @@ -23,7 +23,7 @@ static void refresh(entropy_t *entropy, uint8_t *hash, uint32_t n) { assert(n > 0); while (n > 0) { - sha3_512(hash, entropy->seed, SHA3_512_DIGEST_LENGTH); + SHA3_512(hash, entropy->seed, SHA3_512_DIGEST_LENGTH); increment_seed(entropy); hash += SHA3_512_DIGEST_LENGTH; n --; diff --git a/src/sig_dilithium/dilithium_poly.c b/src/sig_dilithium/dilithium_poly.c index 4199f35..d9392df 100755 --- a/src/sig_dilithium/dilithium_poly.c +++ b/src/sig_dilithium/dilithium_poly.c @@ -1,6 +1,9 @@ #include <stdint.h> #include "dilithium_poly.h" +#include "KeccakHash.h" +#include "SimpleFIPS202.h" + /*************************************************/ void poly_reduce(poly *a) { unsigned int i; @@ -181,18 +184,34 @@ void poly_uniform_eta(poly *a, const unsigned char seed[SEEDBYTES], unsigned cha unsigned char inbuf[SEEDBYTES + 1]; unsigned char outbuf[2*SHAKE256_RATE]; - uint64_t state[25] = {0}; +// uint64_t state[25] = {0}; + Keccak_HashInstance ks; for(i= 0; i < SEEDBYTES; ++i) inbuf[i] = seed[i]; inbuf[SEEDBYTES] = nonce; - shake256_absorb(state, inbuf, SEEDBYTES + 1); - shake256_squeezeblocks(outbuf, 2, state); +// shake256_absorb(state, inbuf, SEEDBYTES + 1); +// shake256_squeezeblocks(outbuf, 2, state); + + #ifdef _WIN32 + SHAKE256_InitAbsorb( &ks, inbuf, SEEDBYTES + 1 ); + KECCAK_HashSqueeze( &ks, outbuf, 2 * 8 ); + #else + Keccak_HashInitialize_SHAKE256( &ks ); + Keccak_HashUpdate( &ks, inbuf, (SEEDBYTES + 1) * 8 ); + Keccak_HashFinal( &ks, inbuf ); + Keccak_HashSqueeze( &ks, outbuf, 2 * 8 * 8 ); + #endif ctr = rej_eta(a->coeffs, NN, outbuf, 2*SHAKE256_RATE, p); if(ctr < NN) { - shake256_squeezeblocks(outbuf, 1, state); +// shake256_squeezeblocks(outbuf, 1, state); + #ifdef _WIN32 + KECCAK_HashSqueeze( &ks, outbuf, 1 * 8 ); + #else + Keccak_HashSqueeze( &ks, outbuf, 1 * 8 * 8 ); + #endif rej_eta(a->coeffs + ctr, NN - ctr, outbuf, SHAKE256_RATE, p); } } @@ -234,20 +253,36 @@ void poly_uniform_gamma1m1(poly *a, const unsigned char seed[SEEDBYTES + CRHBYTE unsigned char inbuf[SEEDBYTES + CRHBYTES + 2]; unsigned char outbuf[5*SHAKE256_RATE]; - uint64_t state[25] = {0}; +// uint64_t state[25] = {0}; + Keccak_HashInstance ks; for(i = 0; i < SEEDBYTES + CRHBYTES; ++i) inbuf[i] = seed[i]; inbuf[SEEDBYTES + CRHBYTES] = nonce & 0xFF; inbuf[SEEDBYTES + CRHBYTES + 1] = nonce >> 8; - shake256_absorb(state, inbuf, SEEDBYTES + CRHBYTES + 2); - shake256_squeezeblocks(outbuf, 5, state); +// shake256_absorb(state, inbuf, SEEDBYTES + CRHBYTES + 2); +// shake256_squeezeblocks(outbuf, 5, state); + + #ifdef _WIN32 + SHAKE256_InitAbsorb( &ks, inbuf, SEEDBYTES + CRHBYTES + 2 ); + KECCAK_HashSqueeze( &ks, outbuf, 5 * 8 ); + #else + Keccak_HashInitialize_SHAKE128( &ks ); + Keccak_HashUpdate( &ks, inbuf, (SEEDBYTES + CRHBYTES + 2) * 8 ); + Keccak_HashFinal( &ks, inbuf ); + Keccak_HashSqueeze( &ks, outbuf, 5 * 8 * 8 ); + #endif ctr = rej_gamma1m1(a->coeffs, NN, outbuf, 5*SHAKE256_RATE); if(ctr < NN) { - shake256_squeezeblocks(outbuf, 1, state); +// shake256_squeezeblocks(outbuf, 1, state); + #ifdef _WIN32 + KECCAK_HashSqueeze( &ks, outbuf, 1 * 8 ); + #else + Keccak_HashSqueeze( &ks, outbuf, 1 * 8 * 8 ); + #endif rej_gamma1m1(a->coeffs + ctr, NN - ctr, outbuf, SHAKE256_RATE); } } diff --git a/src/sig_dilithium/dilithium_sign.c b/src/sig_dilithium/dilithium_sign.c index d5a4543..ae0c52a 100755 --- a/src/sig_dilithium/dilithium_sign.c +++ b/src/sig_dilithium/dilithium_sign.c @@ -1,6 +1,9 @@ #include <stdint.h> #include "dilithium_sign.h" +#include "KeccakHash.h" +#include "SimpleFIPS202.h" + /********************************************************************************************/ void expand_mat(polyvecl mat[], const unsigned char rho[SEEDBYTES], dilithium_param_t *p) { @@ -15,7 +18,7 @@ void expand_mat(polyvecl mat[], const unsigned char rho[SEEDBYTES], dilithium_pa for(i = 0; i < p->PARAM_K; ++i) { for(j = 0; j < p->PARAM_L; ++j) { inbuf[SEEDBYTES] = i + (j << 4); - shake128(outbuf, sizeof(outbuf), inbuf, SEEDBYTES + 1); + SHAKE128(outbuf, sizeof(outbuf), inbuf, SEEDBYTES + 1); dilithium_poly_uniform(mat[i].vec + j, outbuf); } } @@ -27,15 +30,27 @@ void challenge(poly *c, const unsigned char mu[CRHBYTES], const polyveck *w1, di unsigned int i, b, pos; unsigned char inbuf[CRHBYTES + p->PARAM_K * p->PARAM_POLW1_SIZE_PACKED]; unsigned char outbuf[SHAKE256_RATE]; - uint64_t state[25] = {0}, signs, mask; +// uint64_t state[25] = {0}, signs, mask; + uint64_t signs, mask; + Keccak_HashInstance ks; for(i = 0; i < CRHBYTES; ++i) inbuf[i] = mu[i]; for(i = 0; i < p->PARAM_K; ++i) polyw1_pack(inbuf + CRHBYTES + i * p->PARAM_POLW1_SIZE_PACKED, w1->vec + i); - shake256_absorb(state, inbuf, sizeof(inbuf)); - shake256_squeezeblocks(outbuf, 1, state); +// shake256_absorb(state, inbuf, sizeof(inbuf)); +// shake256_squeezeblocks(outbuf, 1, state); + + #ifdef _WIN32 + SHAKE256_InitAbsorb( &ks, inbuf, sizeof(inbuf) ); + KECCAK_HashSqueeze( &ks, outbuf, 1 * 8 ); + #else + Keccak_HashInitialize_SHAKE256( &ks ); + Keccak_HashUpdate( &ks, inbuf, sizeof(inbuf) * 8 ); + Keccak_HashFinal( &ks, inbuf ); + Keccak_HashSqueeze( &ks, outbuf, 1 * 8 * 8 ); + #endif signs = 0; for(i = 0; i < 8; ++i) @@ -50,7 +65,13 @@ void challenge(poly *c, const unsigned char mu[CRHBYTES], const polyveck *w1, di for(i = 196; i < 256; ++i) { do { if(pos >= SHAKE256_RATE) { - shake256_squeezeblocks(outbuf, 1, state); +// shake256_squeezeblocks(outbuf, 1, state); + #ifdef _WIN32 + KECCAK_HashSqueeze( &ks, outbuf, 1 * 8 ); + #else + Keccak_HashSqueeze( &ks, outbuf, 1 * 8 * 8 ); + #endif + pos = 0; } @@ -143,7 +164,7 @@ int dilithium_crypto_sign_keypair(dilithium_public_key_t *public_key, dilithium_ randombytes(seedbuf, SEEDBYTES); - shake256(seedbuf, 3*SEEDBYTES, seedbuf, SEEDBYTES); + SHAKE256(seedbuf, 3*SEEDBYTES, seedbuf, SEEDBYTES); rho = seedbuf; rhoprime = rho + SEEDBYTES; key = rho + 2*SEEDBYTES; @@ -169,7 +190,7 @@ int dilithium_crypto_sign_keypair(dilithium_public_key_t *public_key, dilithium_ polyveck_power2round(&t1, &t0, &t, p); dilithium_pack_pk(public_key->data, rho, &t1, p); - shake256(tr, CRHBYTES, public_key->data, p->CRYPTO_PUBLICKEYBYTES); + SHAKE256(tr, CRHBYTES, public_key->data, p->CRYPTO_PUBLICKEYBYTES); dilithium_pack_sk(private_key->data, rho, key, tr, &s1, &s2, &t0, p); free(p); @@ -211,7 +232,7 @@ int dilithium_crypto_sign( dilithium_signature_t *sig, const unsigned char *m, u for(i = 0; i < CRHBYTES; ++i) sig->sig_data[p->CRYPTO_BYTES - CRHBYTES + i] = tr[i]; - shake256(mu, CRHBYTES, sig->sig_data + p->CRYPTO_BYTES - CRHBYTES, CRHBYTES + mlen); + SHAKE256(mu, CRHBYTES, sig->sig_data + p->CRYPTO_BYTES - CRHBYTES, CRHBYTES + mlen); expand_mat(mat, rho, p); polyvecl_ntt(&s1, p); @@ -336,8 +357,8 @@ int dilithium_crypto_sign_open( unsigned char *m, unsigned long long mlen, dilit for(i = 0; i < mlen; ++i) tmp_m[CRHBYTES + i] = m[i]; - shake256(tmp_m, CRHBYTES, public_key->data, p->CRYPTO_PUBLICKEYBYTES); - shake256(mu, CRHBYTES, tmp_m, CRHBYTES + mlen); + SHAKE256(tmp_m, CRHBYTES, public_key->data, p->CRYPTO_PUBLICKEYBYTES); + SHAKE256(mu, CRHBYTES, tmp_m, CRHBYTES + mlen); free(tmp_m); expand_mat(mat, rho, p); diff --git a/src/sig_tesla/poly.c b/src/sig_tesla/poly.c index 42aaa1c..996e88a 100755 --- a/src/sig_tesla/poly.c +++ b/src/sig_tesla/poly.c @@ -12,14 +12,14 @@ int64_t reduce(int64_t a, tesla_param_t *p) { // Montgomery reduction u = (a * (int64_t)(p->PARAM_QINV)) & 0xFFFFFFFF; u *= (int64_t)(p->PARAM_Q); - a += u; - return a >> 32; + a += u; + return a >> 32; } int64_t barr_reduce(int64_t a, tesla_param_t *p) { // Barrett reduction int64_t u = ((a * (int64_t)(p->PARAM_BARR_MULT)) >> (int64_t)(p->PARAM_BARR_DIV)) * (int64_t)(p->PARAM_Q); - return a - u; + return a - u; } void ntt(poly *a, const poly *w, tesla_param_t *p) { // Forward NTT transform @@ -27,11 +27,11 @@ void ntt(poly *a, const poly *w, tesla_param_t *p) { // Forward NTT transform int Par_Q = (int)(p->PARAM_Q); int NumoProblems = p->PARAM_N >> 1, jTwiddle = 0; - for (; NumoProblems > 0; NumoProblems >>= 1) { - uint32_t jFirst, j = 0; + for (; NumoProblems > 0; NumoProblems >>= 1) { + uint32_t jFirst, j = 0; for (jFirst = 0; jFirst < p->PARAM_N; jFirst = j + NumoProblems) { - int W = w[jTwiddle++]; - for (j = jFirst; j < jFirst + NumoProblems; j++) { + int W = w[jTwiddle++]; + for (j = jFirst; j < jFirst + NumoProblems; j++) { if(p->kind <= 3) { int temp = reduce(W * a[j + NumoProblems], p); a[j + NumoProblems] = a[j] + (Par_Q - temp); @@ -42,8 +42,8 @@ void ntt(poly *a, const poly *w, tesla_param_t *p) { // Forward NTT transform a[j + NumoProblems] = barr_reduce(a[j] + (2LL * Par_Q - temp), p); a[j] = barr_reduce(temp + a[j], p); } - } - } + } + } } } @@ -93,7 +93,7 @@ void nttinv(poly *a, const poly *w, tesla_param_t *p) { // Inverse NTT transform } } } - } + } } void poly_pointwise(poly *result, const poly *x, const poly *y, tesla_param_t *p) { // Pointwise polynomial multiplication result = x.y @@ -113,7 +113,7 @@ void poly_ntt(poly *x_ntt, const poly *x, tesla_param_t *p) { // Call to NTT fun init_mass_poly( zeta, zetainv, p); for (i = 0; i < p->PARAM_N; i++) - x_ntt[i] = x[i]; + x_ntt[i] = x[i]; ntt(x_ntt, zeta, p); free(zeta); @@ -123,7 +123,7 @@ void poly_ntt(poly *x_ntt, const poly *x, tesla_param_t *p) { // Call to NTT fun } void poly_mul(poly *result, const poly *x, const poly *y, tesla_param_t *p) { // Polynomial multiplication result = x*y, with in place reduction for (X^N+1) - // The inputs x and y are assumed to be in NTT form + // The inputs x and y are assumed to be in NTT form poly *zeta = malloc(p->PARAM_N * sizeof(int64_t)); poly *zetainv = malloc(p->PARAM_N * sizeof(int64_t)); @@ -158,7 +158,7 @@ void poly_add(poly *result, const poly *x, const poly *y, tesla_param_t *p) { // unsigned int i; for (i = 0; i < p->PARAM_N; i++) - result[i] = x[i] + y[i]; + result[i] = x[i] + y[i]; } void poly_sub(poly *result, const poly *x, const poly *y, tesla_param_t *p) { // Polynomial subtraction result = x-y @@ -180,24 +180,27 @@ void poly_uniform(poly_k *a, const unsigned char *seed, tesla_param_t *p) { unsigned int nblocks = p->PARAM_GEN_A; uint32_t val1, val2, val3, val4, mask = (uint32_t)(1 << p->PARAM_Q_LOG) - 1; unsigned char *buf = malloc(SHAKE128_RATE * nblocks * sizeof(char)); - uint16_t dmsp = 0; - - cshake128_simple( buf, SHAKE128_RATE * nblocks, dmsp++, seed, CRYPTO_RANDOMBYTES); + uint16_t dmsp = 0; +// cshake128_simple( buf, SHAKE128_RATE * nblocks, dmsp++, seed, CRYPTO_RANDOMBYTES); + cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, buf, SHAKE128_RATE * nblocks * 8, NULL, 0, &dmsp, 16 ); + ++ dmsp; while (i < p->PARAM_K * p->PARAM_N) { - if (pos > SHAKE128_RATE * nblocks - 4 * nbytes) { - nblocks = 1; - cshake128_simple(buf, SHAKE128_RATE * nblocks, dmsp++, seed, CRYPTO_RANDOMBYTES); - pos = 0; - } - val1 = (*(uint32_t *) (buf + pos)) & mask; - pos += nbytes; - val2 = (*(uint32_t *) (buf + pos)) & mask; - pos += nbytes; - val3 = (*(uint32_t *) (buf + pos)) & mask; - pos += nbytes; - val4 = (*(uint32_t *) (buf + pos)) & mask; - pos += nbytes; + if (pos > SHAKE128_RATE * nblocks - 4 * nbytes) { + nblocks = 1; +// cshake128_simple(buf, SHAKE128_RATE * nblocks, dmsp++, seed, CRYPTO_RANDOMBYTES); + cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, buf, SHAKE128_RATE * nblocks * 8, NULL, 0, &dmsp, 16 ); + ++ dmsp; + pos = 0; + } + val1 = (*(uint32_t *) (buf + pos)) & mask; + pos += nbytes; + val2 = (*(uint32_t *) (buf + pos)) & mask; + pos += nbytes; + val3 = (*(uint32_t *) (buf + pos)) & mask; + pos += nbytes; + val4 = (*(uint32_t *) (buf + pos)) & mask; + pos += nbytes; if (val1 < p->PARAM_Q && i < p->PARAM_K * p->PARAM_N) a[i++] = reduce((int64_t) val1 * p->PARAM_R2_INVN, p); if (val2 < p->PARAM_Q && i < p->PARAM_K * p->PARAM_N) @@ -206,7 +209,7 @@ void poly_uniform(poly_k *a, const unsigned char *seed, tesla_param_t *p) { a[i++] = reduce((int64_t) val3 * p->PARAM_R2_INVN, p); if (val4 < p->PARAM_Q && i < p->PARAM_K * p->PARAM_N) a[i++] = reduce((int64_t) val4 * p->PARAM_R2_INVN, p); - } + } free(buf); buf = NULL; } diff --git a/src/sig_tesla/sample.c b/src/sig_tesla/sample.c index 9bba56a..a72fb90 100755 --- a/src/sig_tesla/sample.c +++ b/src/sig_tesla/sample.c @@ -13,54 +13,62 @@ void sample_y(int64_t *y, const unsigned char *seed, int nonce, tesla_param_t *p unsigned int i = 0, pos = 0, nblocks = p->PARAM_N; unsigned int nbytes = ((p->PARAM_B_BITS + 1) + 7) / 8; unsigned char *buf = malloc(p->PARAM_N * nbytes * sizeof(char) + 1); - int16_t dmsp = (int16_t)(nonce << 8); + int16_t dmsp = (int16_t)(nonce << 8); uint32_t NBLOCKS_SHAKE = 0; if(p->kind == 0 || p->kind == 3) { - cshake128_simple((uint8_t *) buf, p->PARAM_N * nbytes, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cshake128_simple((uint8_t *) buf, p->PARAM_N * nbytes, dmsp++, seed, CRYPTO_RANDOMBYTES); + cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, p->PARAM_N * nbytes * 8, NULL, 0, &dmsp, 16 ); + ++dmsp; NBLOCKS_SHAKE = SHAKE128_RATE / (((p->PARAM_B_BITS + 1) + 7) / 8); } else { - cshake256_simple((uint8_t *) buf, p->PARAM_N * nbytes, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cshake256_simple((uint8_t *) buf, p->PARAM_N * nbytes, dmsp++, seed, CRYPTO_RANDOMBYTES); + cSHAKE256( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, p->PARAM_N * nbytes * 8, NULL, 0, &dmsp, 16 ); + ++dmsp; NBLOCKS_SHAKE = SHAKE256_RATE / (((p->PARAM_B_BITS + 1) + 7) / 8); } while (i < p->PARAM_N) { - if (pos >= nblocks * nbytes) { + if (pos >= nblocks * nbytes) { if(p->kind == 0 || p->kind == 3) { nblocks = NBLOCKS_SHAKE; - cshake128_simple((uint8_t *) buf, SHAKE128_RATE, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cshake128_simple((uint8_t *) buf, SHAKE128_RATE, dmsp++, seed, CRYPTO_RANDOMBYTES); + cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, SHAKE128_RATE * 8, NULL, 0, &dmsp, 16 ); + ++dmsp; } else { nblocks = NBLOCKS_SHAKE; - cshake256_simple((uint8_t *) buf, SHAKE256_RATE, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cshake256_simple((uint8_t *) buf, SHAKE256_RATE, dmsp++, seed, CRYPTO_RANDOMBYTES); + cSHAKE256( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, SHAKE256_RATE * 8, NULL, 0, &dmsp, 16 ); + ++dmsp; } - pos = 0; - } + pos = 0; + } y[i] = (*(uint32_t *) (buf + pos)) & ((1 << (p->PARAM_B_BITS + 1)) - 1); y[i] -= (int64_t)(p->PARAM_B); if (y[i] != (1 << p->PARAM_B_BITS)) - i++; - pos += nbytes; - } + i++; + pos += nbytes; + } free(buf); buf = NULL; } static int64_t mod7(int64_t k) { // Compute k modulo 7 - int64_t i = k; + int64_t i = k; int j; for ( j = 0; j < 2; j++) { - i = (i & 7) + (i >> 3); - } - // i <= 7 at this point. If (i == 7) return 0, else return i - return ((i - 7) >> 3) & i; + i = (i & 7) + (i >> 3); + } + // i <= 7 at this point. If (i == 7) return 0, else return i + return ((i - 7) >> 3) & i; } static uint32_t Bernoulli(int64_t r, int64_t t, tesla_param_t *p) { // Sample a bit from Bernoulli - // Restriction: 20-bit exponent + // Restriction: 20-bit exponent if(p->kind == 0) { static const double exp[3][32] = { { @@ -669,11 +677,15 @@ void sample_gauss_poly(int64_t *x, const unsigned char *seed, int nonce, tesla_p {0x0321020100200100LL, 0x0200010000200001LL}, }; - cshake128_simple(seed_ex, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cshake128_simple(seed_ex, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); + cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, seed_ex, (p->PARAM_N) * 8 * 8, NULL, 0, &dmsp, 16 ); + ++dmsp; for (x_ind = 0; x_ind < (int64_t)(p->PARAM_N); x_ind++) { if ((j + 46) > (int64_t)(p->PARAM_N)) { - cshake128_simple((uint8_t *) buf, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cshake128_simple((uint8_t *) buf, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); + cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, (p->PARAM_N) * 8 * 8, NULL, 0, &dmsp, 16 ); + ++dmsp; j = 0; } do { @@ -760,11 +772,15 @@ void sample_gauss_poly(int64_t *x, const unsigned char *seed, int nonce, tesla_p {0x0000032102010020LL, 0x0100020001000020LL, 0x0001000002000001LL}, }; - cshake256_simple(seed_ex, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cshake256_simple(seed_ex, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); + cSHAKE256( seed, CRYPTO_RANDOMBYTES * 8, seed_ex, (p->PARAM_N) * 8 * 8, NULL, 0, &dmsp, 16 ); + ++dmsp; for (x_ind = 0; x_ind < (int64_t)(p->PARAM_N); x_ind++) { if ((j + 46) > (int64_t)(p->PARAM_N)) { - cshake256_simple((uint8_t *) buf, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cshake256_simple((uint8_t *) buf, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); + cSHAKE256( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, (p->PARAM_N) * 8 * 8, NULL, 0, &dmsp, 16 ); + ++dmsp; j = 0; } @@ -846,38 +862,42 @@ void sample_gauss_poly(int64_t *x, const unsigned char *seed, int nonce, tesla_p void encode_c(uint32_t *pos_list, int16_t *sign_list, unsigned char *c_bin, tesla_param_t *p) { // Encoding of c' by mapping the output of the hash function H to an N-element vector with entries {-1,0,1} uint32_t i; - int pos, cnt = 0; + int pos, cnt = 0; int16_t *c = malloc(p->PARAM_N * sizeof(int16_t)); - const int RLENGTH = SHAKE128_RATE; + const int RLENGTH = SHAKE128_RATE; unsigned char *r = malloc(RLENGTH * sizeof(char)); - uint16_t dmsp = 0; + uint16_t dmsp = 0; - // Use the hash value as key to generate some randomness - cshake128_simple(r, RLENGTH, dmsp++, c_bin, CRYPTO_RANDOMBYTES); + // Use the hash value as key to generate some randomness +// cshake128_simple(r, RLENGTH, dmsp++, c_bin, CRYPTO_RANDOMBYTES); + cSHAKE128( c_bin, CRYPTO_RANDOMBYTES * 8, r, RLENGTH * 8, NULL, 0, &dmsp, 16 ); + ++dmsp; - // Use rejection sampling to determine positions to be set in the new vector + // Use rejection sampling to determine positions to be set in the new vector for (i = 0; i < p->PARAM_N; i++) - c[i] = 0; + c[i] = 0; for (i = 0; i < p->PARAM_W;) { // Sample a unique position k times. Use two bytes - if (cnt > (RLENGTH - 3)) { - cshake128_simple(r, RLENGTH, dmsp++, c_bin, CRYPTO_RANDOMBYTES); - cnt = 0; - } - pos = (r[cnt] << 8) | (r[cnt + 1]); + if (cnt > (RLENGTH - 3)) { +// cshake128_simple(r, RLENGTH, dmsp++, c_bin, CRYPTO_RANDOMBYTES); + cSHAKE128( c_bin, CRYPTO_RANDOMBYTES * 8, r, RLENGTH * 8, NULL, 0, &dmsp, 16 ); + ++dmsp; + cnt = 0; + } + pos = (r[cnt] << 8) | (r[cnt + 1]); pos = pos & ((p->PARAM_N) - 1); // Position is in the range [0,N-1] - if (c[pos] == 0) { // Position has not been set yet. Determine sign - if ((r[cnt + 2] & 1) == 1) - c[pos] = -1; - else - c[pos] = 1; - pos_list[i] = pos; - sign_list[i] = c[pos]; - i++; - } - cnt += 3; - } + if (c[pos] == 0) { // Position has not been set yet. Determine sign + if ((r[cnt + 2] & 1) == 1) + c[pos] = -1; + else + c[pos] = 1; + pos_list[i] = pos; + sign_list[i] = c[pos]; + i++; + } + cnt += 3; + } free(c); free(r); c = NULL; diff --git a/src/sig_tesla/sign.c b/src/sig_tesla/sign.c index 059c799..2575b1c 100755 --- a/src/sig_tesla/sign.c +++ b/src/sig_tesla/sign.c @@ -389,9 +389,9 @@ void hash_vm(unsigned char *c_bin, poly_k *v, const unsigned char *m, unsigned l memcpy(&t[p->PARAM_K * p->PARAM_N], m, mlen); if(p->kind == 0 || p->kind == 3) - shake128(c_bin, CRYPTO_C_BYTES, t, p->PARAM_K * p->PARAM_N + mlen); + SHAKE128(c_bin, CRYPTO_C_BYTES, t, p->PARAM_K * p->PARAM_N + mlen); else - shake256(c_bin, CRYPTO_C_BYTES, t, p->PARAM_K * p->PARAM_N + mlen); + SHAKE256(c_bin, CRYPTO_C_BYTES, t, p->PARAM_K * p->PARAM_N + mlen); free(t); t = NULL; @@ -667,9 +667,9 @@ int tesla_crypto_sign_keypair(tesla_public_key_t *public_key, tesla_private_key_ randombytes(randomness, CRYPTO_RANDOMBYTES); if(p->kind == 0 || p->kind == 3) - shake128(randomness_extended, ((p->PARAM_K) + 3) * CRYPTO_SEEDBYTES, randomness, CRYPTO_RANDOMBYTES); + SHAKE128(randomness_extended, ((p->PARAM_K) + 3) * CRYPTO_SEEDBYTES, randomness, CRYPTO_RANDOMBYTES); else - shake256(randomness_extended, ((p->PARAM_K) + 3) * CRYPTO_SEEDBYTES, randomness, CRYPTO_RANDOMBYTES); + SHAKE256(randomness_extended, ((p->PARAM_K) + 3) * CRYPTO_SEEDBYTES, randomness, CRYPTO_RANDOMBYTES); poly *s = malloc(p->PARAM_N * sizeof(int64_t)); poly *s_ntt = malloc(p->PARAM_N * sizeof(int64_t)); @@ -769,9 +769,9 @@ int tesla_crypto_sign( tesla_signature_t *sig, const unsigned char *m, unsigned memcpy(randomness_input + CRYPTO_RANDOMBYTES + CRYPTO_SEEDBYTES, m, mlen); if(p->kind == 0 || p->kind == 3) - shake128(randomness, CRYPTO_SEEDBYTES, randomness_input, CRYPTO_RANDOMBYTES + CRYPTO_SEEDBYTES + mlen); + SHAKE128(randomness, CRYPTO_SEEDBYTES, randomness_input, CRYPTO_RANDOMBYTES + CRYPTO_SEEDBYTES + mlen); else - shake256(randomness, CRYPTO_SEEDBYTES, randomness_input, CRYPTO_RANDOMBYTES + CRYPTO_SEEDBYTES + mlen); + SHAKE256(randomness, CRYPTO_SEEDBYTES, randomness_input, CRYPTO_RANDOMBYTES + CRYPTO_SEEDBYTES + mlen); uint32_t *pos_list = malloc(p->PARAM_W * sizeof(uint32_t)); int16_t *sign_list = malloc(p->PARAM_W * sizeof(uint16_t)); -- GitLab