Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support cmake build #88

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
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
@@ -1,3 +1,4 @@
tvecs1024
tvecs512
tvecs768
/build
19 changes: 19 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# CMake minimum version and project details
cmake_minimum_required(VERSION 3.16)
project(PQCKyber 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)

add_subdirectory(ref)
add_subdirectory(avx2)
101 changes: 101 additions & 0 deletions avx2/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpedantic")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-prototypes")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx2")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mbmi2")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mpopcnt")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mtune=native")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fomit-frame-pointer")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -z noexecstack")

set(NISTFLAGS "${NISTFLAGS}"
-Wno-unused-result
-mavx2
-mbmi2
-mpopcnt
-march=native
-mtune=native
-O3
-fomit-frame-pointer
)

set(securitylevel 2 3 4)


# build fips202 shared library
set(SRCS fips202.c fips202x4.c keccak4x/KeccakP-1600-times4-SIMD256.c symmetric-shake.c)

foreach(level IN LISTS securitylevel)
MATH(EXPR NBITS "256 * ${level}" OUTPUT_FORMAT DECIMAL)
set(name pqccrystals_fips202x4_avx2_${NBITS})

add_library(${name} SHARED ${SRCS})
target_compile_definitions(${name} PUBLIC KYBER_K=${level})
endforeach()

set(SRCS
kem.c
indcpa.c
polyvec.c
poly.c
shuffle.S
fq.S
ntt.S
invntt.S
basemul.S
consts.c
rejsample.c
cbd.c
verify.c
)

# build algorithm shared library
foreach(level IN LISTS securitylevel)
MATH(EXPR NBITS "256 * ${level}" OUTPUT_FORMAT DECIMAL)
set(name pqccrystals_kyber${NBITS}_avx2)

add_library(${name} SHARED ${SRCS})
target_compile_definitions(${name} PUBLIC KYBER_K=${level})
target_link_libraries(${name} pqccrystals_fips202x4_avx2_${NBITS})
target_include_directories(${name} PRIVATE .)
endforeach()

# build test_kyber
foreach(level IN LISTS securitylevel)
MATH(EXPR NBITS "256 * ${level}" OUTPUT_FORMAT DECIMAL)

add_executable(test_kyber${NBITS}_avx2 test/test_kyber.c)
target_link_libraries(test_kyber${NBITS}_avx2
pqccrystals_kyber${NBITS}_avx2
randombytes)
endforeach()

# build test_vector
foreach(level IN LISTS securitylevel)
MATH(EXPR NBITS "256 * ${level}" OUTPUT_FORMAT DECIMAL)

add_executable(test_vectors${NBITS}_avx2 test/test_vectors.c)
target_link_libraries(test_vectors${NBITS}_avx2
pqccrystals_kyber${NBITS}_avx2)
endforeach()

# build test_speed
foreach(level IN LISTS securitylevel)
MATH(EXPR NBITS "256 * ${level}" OUTPUT_FORMAT DECIMAL)

add_executable(test_speed${NBITS}_avx2
test/cpucycles.c
test/speed_print.c
test/test_speed.c
)
target_link_libraries(test_speed${NBITS}_avx2
pqccrystals_kyber${NBITS}_avx2
randombytes)
endforeach()
100 changes: 100 additions & 0 deletions ref/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@


set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpedantic")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-prototypes")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fomit-frame-pointer")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -z noexecstack")
set(NISTFLAGS "${NISTFLAGS}" -Wno-unused-result -O3 -fomit-frame-pointer)

set(securitylevel 2 3 4)

# build randombytes
add_library(randombytes SHARED randombytes.c)

# build nist rng
add_library(rng SHARED nistkat/rng.c)
target_link_libraries(rng OpenSSL::Crypto)

set(SRCS
kem.c
indcpa.c
polyvec.c
poly.c
ntt.c
cbd.c
reduce.c
verify.c
)

# build fips202 shared library
foreach(level IN LISTS securitylevel)
MATH(EXPR NBITS "256 * ${level}" OUTPUT_FORMAT DECIMAL)
set(name pqccrystals_fips202_${NBITS}_ref)

add_library(${name} SHARED fips202.c symmetric-shake.c)

target_compile_definitions(${name} PUBLIC KYBER_K=${level})
endforeach()

# build algorithm shared library
foreach(level IN LISTS securitylevel)
MATH(EXPR NBITS "256 * ${level}" OUTPUT_FORMAT DECIMAL)
set(name pqccrystals_kyber${NBITS}_ref)

add_library(${name} SHARED ${SRCS})
target_compile_definitions(${name} PUBLIC KYBER_K=${level})
endforeach()

# build test_kyber
foreach(level IN LISTS securitylevel)
MATH(EXPR NBITS "256 * ${level}" OUTPUT_FORMAT DECIMAL)

add_executable(test_kyber${NBITS} test/test_kyber.c)
target_link_libraries(test_kyber${NBITS}
pqccrystals_fips202_${NBITS}_ref
pqccrystals_kyber${NBITS}_ref
randombytes)
endforeach()

# build test_vector
foreach(level IN LISTS securitylevel)
MATH(EXPR NBITS "256 * ${level}" OUTPUT_FORMAT DECIMAL)

add_executable(test_vectors${NBITS} test/test_vectors.c)
target_link_libraries(test_vectors${NBITS}
pqccrystals_fips202_${NBITS}_ref
pqccrystals_kyber${NBITS}_ref)
endforeach()

# build test_speed
foreach(level IN LISTS securitylevel)
MATH(EXPR NBITS "256 * ${level}" OUTPUT_FORMAT DECIMAL)

add_executable(test_speed${NBITS}
test/cpucycles.c
test/speed_print.c
test/test_speed.c
)
target_link_libraries(test_speed${NBITS}
pqccrystals_fips202_${NBITS}_ref
pqccrystals_kyber${NBITS}_ref
randombytes)
endforeach()

# build nistkat
foreach(level IN LISTS securitylevel)
MATH(EXPR NBITS "256 * ${level}" OUTPUT_FORMAT DECIMAL)

add_compile_options(${NISTFLAGS})
add_executable(PQCgenKAT_kem${NBITS} nistkat/PQCgenKAT_kem.c)
target_link_libraries(PQCgenKAT_kem${NBITS}
pqccrystals_fips202_${NBITS}_ref
pqccrystals_kyber${NBITS}_ref
rng)
endforeach()