From e230ed072885294933891cace8a6f27af5bec22e Mon Sep 17 00:00:00 2001 From: cherninkiy Date: Mon, 6 Apr 2026 06:29:43 +0000 Subject: [PATCH 1/2] feat(repo): add CMake build system and automation script - Add root CMakeLists.txt and third_party/CMakeLists.txt for unified build/test - Add scripts/third_party.sh for install, build, test, clean, and help actions - Update .gitignore --- .gitignore | 3 ++ CMakeLists.txt | 10 ++++ scripts/third_party.sh | 91 +++++++++++++++++++++++++++++++ third_party/CMakeLists.txt | 107 +++++++++++++++++++++++++++++++++++++ 4 files changed, 211 insertions(+) create mode 100644 CMakeLists.txt create mode 100755 scripts/third_party.sh create mode 100644 third_party/CMakeLists.txt diff --git a/.gitignore b/.gitignore index a18aa26..9bfd15b 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,9 @@ __pycache__/ *.csv *.png +# Testing +/Testing/ + # Logs *.log diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..de9201e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.14) +project(SubmodulesProject VERSION 1.0.0 LANGUAGES C CXX) + +option(BUILD_TESTING "Build and run tests" ON) +if(BUILD_TESTING) + enable_testing() + include(CTest) +endif() + +add_subdirectory(third_party) \ No newline at end of file diff --git a/scripts/third_party.sh b/scripts/third_party.sh new file mode 100755 index 0000000..76445c6 --- /dev/null +++ b/scripts/third_party.sh @@ -0,0 +1,91 @@ +#!/bin/bash +# Script for managing third_party dependencies: install, build, test, clean +set -e + + + +## Usage: ./third_party.sh [install|build|tests|all|clear|rebuild|help] +# +# install - install dependencies and initialize submodules +# build - build all third_party +# tests - run all tests (CTest and manual) +# clear - remove build directory +# rebuild - clear and build +# all - full cycle: install, build, tests (default) +# help - show this help message +ACTION="${1:-all}" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +BUILD_DIR="$SCRIPT_DIR/../build" +do_clear() { + echo "[clear] Removing build directory..." + rm -rf "$BUILD_DIR" +} + +do_rebuild() { + do_clear + do_build +} + +do_install() { + echo "[1/3] Installing dependencies..." + sudo apt-get update + sudo apt-get install -y cmake build-essential pkg-config libssl-dev libcppunit-dev libntl-dev + echo "[2/3] Initializing/updating git submodules..." + git submodule update --init --recursive +} + +do_build() { + echo "[3/3] Building all third_party..." + PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + cmake -S "$PROJECT_ROOT" -B "$BUILD_DIR" + cmake --build "$BUILD_DIR" --parallel +} + +do_tests() { + echo "[4/4] Running tests..." + cd "$BUILD_DIR" + ctest --output-on-failure || true + # shipovnik_example + if [ -x third_party/shipovnik/shipovnik_example ]; then + echo "Running shipovnik_example..." + (cd third_party/shipovnik && ./shipovnik_example) + fi + # hypericum PQCgenKAT_sign + if [ -x third_party/hypericum/PQCgenKAT_sign ]; then + echo "Running PQCgenKAT_sign..." + (cd third_party/hypericum && ./PQCgenKAT_sign) + fi +} + + +case "$ACTION" in + install) + do_install + ;; + build) + do_build + ;; + tests) + do_tests + ;; + clear) + do_clear + ;; + rebuild) + do_rebuild + ;; + all) + do_install + do_build + do_tests + ;; + help) + grep '^#' "$0" | sed 's/^# \{0,1\}//' + exit 0 + ;; + *) + echo "Usage: $0 [install|build|tests|all|clear|rebuild|help]" + exit 1 + ;; +esac + diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt new file mode 100644 index 0000000..8c54220 --- /dev/null +++ b/third_party/CMakeLists.txt @@ -0,0 +1,107 @@ + +# third_party/CMakeLists.txt +# Collects all submodules: shipovnik, hypericum, kryzhovnik, iaik_merkle_tree + +cmake_minimum_required(VERSION 3.14) +project(ThirdPartyModules LANGUAGES C CXX) + +# ------------------------------------------------------------------- +# 1. shipovnik (shipovnik/CMakeLists.txt) +# ------------------------------------------------------------------- +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/shipovnik/CMakeLists.txt") + add_subdirectory(shipovnik) +else() + message(WARNING "shipovnik submodule not initialized or missing CMakeLists.txt") +endif() + +# ------------------------------------------------------------------- +# 2. hypericum (hypericum/CMakeLists.txt) +# ------------------------------------------------------------------- +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/hypericum/CMakeLists.txt") + add_subdirectory(hypericum) +else() + message(WARNING "hypericum submodule not initialized or missing CMakeLists.txt") +endif() + +# ------------------------------------------------------------------- +# 3. kryzhovnik (no CMakeLists.txt – build manually) +# ------------------------------------------------------------------- +set(KRYZHOVNIK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/kryzhovnik) +if(EXISTS "${KRYZHOVNIK_DIR}/pqs_test.c") # marker: submodule is loaded + # Find OpenSSL + find_package(PkgConfig) + if(PkgConfig_FOUND) + pkg_check_modules(OPENSSL REQUIRED libcrypto) + else() + find_package(OpenSSL REQUIRED) + endif() + if(NOT OPENSSL_FOUND) + message(FATAL_ERROR "OpenSSL not found (required for kryzhovnik)") + endif() + + # All sources except the main test file + file(GLOB_RECURSE KRYZHOVNIK_SOURCES + "${KRYZHOVNIK_DIR}/*.c" + ) + list(REMOVE_ITEM KRYZHOVNIK_SOURCES "${KRYZHOVNIK_DIR}/pqs_test.c") + + # Build all sources as C++ + set_source_files_properties(${KRYZHOVNIK_SOURCES} PROPERTIES LANGUAGE CXX) + add_library(kryzhovnik STATIC ${KRYZHOVNIK_SOURCES}) + target_include_directories(kryzhovnik PRIVATE + ${KRYZHOVNIK_DIR} + ${OPENSSL_INCLUDE_DIRS} + ) + target_link_libraries(kryzhovnik PRIVATE ${OPENSSL_LIBRARIES}) + target_compile_options(kryzhovnik PRIVATE + $<$,$>:-Wall -Wextra -Wshadow -Wconversion -O3 -march=native> + $<$:/W4 /O2> + ) + + # Test for kryzhovnik (if testing is enabled) + if(BUILD_TESTING) + set_source_files_properties(${KRYZHOVNIK_DIR}/pqs_test.c PROPERTIES LANGUAGE CXX) + add_executable(kryzhovnik_test ${KRYZHOVNIK_DIR}/pqs_test.c) + target_link_libraries(kryzhovnik_test PRIVATE kryzhovnik) + target_compile_definitions(kryzhovnik_test PRIVATE ${CRYPTO_PQPQC_CONFIG_DEFINITIONS}) + add_test(NAME kryzhovnik_test COMMAND kryzhovnik_test) + endif() +else() + message(WARNING "kryzhovnik submodule not initialized (run 'git submodule update --init')") +endif() + +# ------------------------------------------------------------------- +# 4. iaik_merkle_tree (no CMakeLists.txt – build manually) +# ------------------------------------------------------------------- +set(MERKLE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/iaik_merkle_tree) +if(EXISTS "${MERKLE_DIR}/src/merkletree.h") + # Build sources from src + file(GLOB MERKLE_SOURCES "${MERKLE_DIR}/src/*.c") + add_library(merkletree STATIC ${MERKLE_SOURCES}) + target_include_directories(merkletree PUBLIC + $ + ) + # Install (optional) + install(TARGETS merkletree ARCHIVE DESTINATION lib) + install(FILES ${MERKLE_DIR}/src/merkletree.h DESTINATION include) + + # Merkle Tree tests (require CppUnit) + if(BUILD_TESTING AND EXISTS "${MERKLE_DIR}/tests/MerkleTreeTest.cpp") + find_package(PkgConfig) + if(PkgConfig_FOUND) + pkg_check_modules(CPPUNIT REQUIRED cppunit) + else() + find_package(CppUnit REQUIRED) + endif() + if(CPPUNIT_FOUND) + add_executable(merkletree_test ${MERKLE_DIR}/tests/MerkleTreeTest.cpp) + target_include_directories(merkletree_test PRIVATE ${CPPUNIT_INCLUDE_DIRS}) + target_link_libraries(merkletree_test PRIVATE merkletree ${CPPUNIT_LIBRARIES}) + add_test(NAME merkletree_test COMMAND merkletree_test) + else() + message(WARNING "CppUnit not found, skipping merkletree tests") + endif() + endif() +else() + message(WARNING "iaik_merkle_tree submodule not initialized (run 'git submodule update --init')") +endif() \ No newline at end of file From 993e28ca739e931992739a544bc6ac0d0cabf949 Mon Sep 17 00:00:00 2001 From: cherninkiy Date: Mon, 6 Apr 2026 08:52:39 +0000 Subject: [PATCH 2/2] feat(submodules): switch kryzhovnik to wrapper fork and update build - Update .gitmodules to point kryzhovnik to cherninkiy/kryzhovnik-wrapper-tc26 - Modify third_party/CMakeLists.txt to build submodules directly without add_subdirectory - Update scripts/third_party.sh to handle new executable paths and submodule sync - Synchronize README.md and README_ru.md with fork references and compatibility notes - Update third_party/README.md to explain fork usage for hypericum/shipovnik integration --- .gitmodules | 10 +-- README.md | 25 ++++-- README_ru.md | 21 +++-- scripts/third_party.sh | 19 ++-- third_party/CMakeLists.txt | 179 ++++++++++++++++++++++++++++++------- third_party/README.md | 9 +- third_party/kryzhovnik | 2 +- 7 files changed, 205 insertions(+), 60 deletions(-) diff --git a/.gitmodules b/.gitmodules index 0f2b81a..731777e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,12 @@ -[submodule "third_party/shipovnik"] +[submodule "third_party/shipovnik"] path = third_party/shipovnik url = https://github.com/QAPP-tech/shipovnik_tc26.git -[submodule "third_party/hypericum"] +[submodule "third_party/hypericum"] path = third_party/hypericum url = https://github.com/QAPP-tech/hypericum_tc26.git -[submodule "third_party/kryzhovnik"] +[submodule "third_party/kryzhovnik"] path = third_party/kryzhovnik - url = https://github.com/ElenaKirshanova/pqc_LWR_signature.git -[submodule "third_party/iaik_merkle_tree"] + url = https://github.com/cherninkiy/kryzhovnik-wrapper-tc26.git +[submodule "third_party/iaik_merkle_tree"] path = third_party/iaik_merkle_tree url = https://github.com/IAIK/merkle-tree.git diff --git a/README.md b/README.md index 3b7bfe1..8c7e7a6 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,8 @@ The goal is to measure the speedup of signing a batch of messages with a single - Microbenchmarks: sequential vs batch signing, verification overhead - Results exported as CSV + plots +The original Kryzhovnik implementation is documented above. In this repository, the `third_party/kryzhovnik` submodule is pinned to a compatibility fork used for integration with Hypericum and Shipovnik. + ## Repository Structure ``` @@ -38,7 +40,7 @@ batch-pqc/ ├── third_party/ # git submodules │ ├── shipovnik/ → https://github.com/QAPP-tech/shipovnik_tc26 │ ├── hypericum/ → https://github.com/QAPP-tech/hypericum_tc26 -│ ├── kryzhovnik/ → https://github.com/ElenaKirshanova/pqc_LWR_signature +│ ├── kryzhovnik/ → https://github.com/cherninkiy/kryzhovnik-wrapper-tc26 │ └── iaik_merkle_tree/ → https://github.com/IAIK/merkle-tree ├── src/ │ ├── hash/ # hash provider (uses Streebog from hypericum, SHA-256 fallback) @@ -68,16 +70,18 @@ batch-pqc/ git clone --recursive https://github.com/cherninkiy/batch-pqc.git cd batch-pqc -# Build -mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Release -make -j$(nproc) +# Sync submodule URLs in case .gitmodules changed +git submodule sync --recursive +git submodule update --init --recursive + +# Build third-party dependencies and tests +./scripts/third_party.sh build # Run tests -ctest --output-on-failure +./scripts/third_party.sh tests # Run benchmarks (sequential vs batch) -./bench/bench_batch --algo hypericum --batch-size 16 --iterations 100 +./build/bench/bench_batch --algo hypericum --batch-size 16 --iterations 100 ``` ### Expected Output (after MVP) @@ -121,4 +125,9 @@ Third-party components have their own licenses: - [IAIK/merkle-tree](https://github.com/IAIK/merkle-tree) – Merkle tree implementation (public domain / BSD‑like) - [QAPP-tech](https://github.com/QAPP-tech) – Shipovnik and Hypericum (including Streebog hash) PQC signatures -- [Elena Kirshanova](https://github.com/ElenaKirshanova) – Kryzhovnik (lattice‑based) signature +- [Elena Kirshanova](https://github.com/ElenaKirshanova) – original Kryzhovnik implementation: [pqc_LWR_signature](https://github.com/ElenaKirshanova/pqc_LWR_signature) +- A compatibility fork is used in this project to integrate Kryzhovnik with Hypericum and Shipovnik + +--- + +**Warning:** This is an open-source PoC for portfolio and partnership purposes. The code is released under the MIT license. It is not intended for production use. Use at your own risk. diff --git a/README_ru.md b/README_ru.md index 8290412..0bbb3ea 100644 --- a/README_ru.md +++ b/README_ru.md @@ -34,6 +34,8 @@ - Микробенчмарки: последовательная vs пакетная подпись, накладные расходы на верификацию - Экспорт результатов в CSV и графики +Выше указана ссылка на оригинальную реализацию Крыжовника. В этом репозитории сабмодуль `third_party/kryzhovnik` зафиксирован на форке совместимости, который используется для интеграции с Hypericum и Shipovnik. + ## Структура репозитория ``` @@ -42,7 +44,7 @@ batch-pqc/ ├── third_party/ # git submodules │ ├── shipovnik/ → https://github.com/QAPP-tech/shipovnik_tc26 │ ├── hypericum/ → https://github.com/QAPP-tech/hypericum_tc26 -│ ├── kryzhovnik/ → https://github.com/ElenaKirshanova/pqc_LWR_signature +│ ├── kryzhovnik/ → https://github.com/cherninkiy/kryzhovnik-wrapper-tc26 │ └── iaik_merkle_tree/ → https://github.com/IAIK/merkle-tree ├── src/ │ ├── hash/ # провайдер хешей (Стрибог из hypericum, SHA-256 как запасной) @@ -73,16 +75,18 @@ batch-pqc/ git clone --recursive https://github.com/cherninkiy/batch-pqc.git cd batch-pqc -# Сборка -mkdir build && cd build -cmake .. -DCMAKE_BUILD_TYPE=Release -make -j$(nproc) +# Синхронизация URL сабмодулей после обновления .gitmodules +git submodule sync --recursive +git submodule update --init --recursive + +# Сборка сторонних зависимостей и тестов +./scripts/third_party.sh build # Запуск тестов -ctest --output-on-failure +./scripts/third_party.sh tests # Запуск бенчмарков (последовательная vs пакетная) -./bench/bench_batch --algo hypericum --batch-size 16 --iterations 100 +./build/bench/bench_batch --algo hypericum --batch-size 16 --iterations 100 ``` ### Ожидаемые результаты (после MVP) @@ -127,7 +131,8 @@ ctest --output-on-failure - [IAIK/merkle-tree](https://github.com/IAIK/merkle-tree) – реализация дерева Меркла (public domain / BSD‑like) - [QAPP-tech](https://github.com/QAPP-tech) – подписи Шиповник и Гиперикум (включая хеш Стрибог) -- [Elena Kirshanova](https://github.com/ElenaKirshanova) – подпись Крыжовник (на решётках) +- [Elena Kirshanova](https://github.com/ElenaKirshanova) – оригинальная реализация Крыжовника: [pqc_LWR_signature](https://github.com/ElenaKirshanova/pqc_LWR_signature) +- В этом проекте используется форк совместимости для интеграции Крыжовника с Гиперикум и Шиповник --- diff --git a/scripts/third_party.sh b/scripts/third_party.sh index 76445c6..1c28a98 100755 --- a/scripts/third_party.sh +++ b/scripts/third_party.sh @@ -31,6 +31,7 @@ do_install() { sudo apt-get update sudo apt-get install -y cmake build-essential pkg-config libssl-dev libcppunit-dev libntl-dev echo "[2/3] Initializing/updating git submodules..." + git submodule sync --recursive git submodule update --init --recursive } @@ -45,15 +46,21 @@ do_tests() { echo "[4/4] Running tests..." cd "$BUILD_DIR" ctest --output-on-failure || true - # shipovnik_example - if [ -x third_party/shipovnik/shipovnik_example ]; then + if [ -x third_party/shipovnik_example ]; then echo "Running shipovnik_example..." - (cd third_party/shipovnik && ./shipovnik_example) + ./third_party/shipovnik_example fi - # hypericum PQCgenKAT_sign - if [ -x third_party/hypericum/PQCgenKAT_sign ]; then + if [ -x third_party/hypericum_example ]; then + echo "Running hypericum_example..." + ./third_party/hypericum_example + fi + if [ -x third_party/PQCgenKAT_sign ]; then echo "Running PQCgenKAT_sign..." - (cd third_party/hypericum && ./PQCgenKAT_sign) + ./third_party/PQCgenKAT_sign + fi + if [ -x third_party/kryzhovnik_test ]; then + echo "Running kryzhovnik_test..." + ./third_party/kryzhovnik_test fi } diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt index 8c54220..730c40f 100644 --- a/third_party/CMakeLists.txt +++ b/third_party/CMakeLists.txt @@ -6,72 +6,189 @@ cmake_minimum_required(VERSION 3.14) project(ThirdPartyModules LANGUAGES C CXX) # ------------------------------------------------------------------- -# 1. shipovnik (shipovnik/CMakeLists.txt) +# 1. streebog (from hypericum/streebog sources — shared by hypericum and shipovnik) # ------------------------------------------------------------------- -if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/shipovnik/CMakeLists.txt") - add_subdirectory(shipovnik) +set(STREEBOG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/hypericum/streebog) +if(EXISTS "${STREEBOG_DIR}/gost3411-2012-core.c") + set(GOST_OPTIMIZATION "0" CACHE STRING "Set GOST optimization level (0=none, 2=SSE2, 3=SSE4.1)") + set_property(CACHE GOST_OPTIMIZATION PROPERTY STRINGS "0" "1" "2" "3") + + add_library(streebog STATIC + ${STREEBOG_DIR}/gost3411-2012-core.c + ) + target_include_directories(streebog PUBLIC + $ + ) + set(INSTRUCTION_SET_SSE2 2) + set(INSTRUCTION_SET_SSE41 3) + if(GOST_OPTIMIZATION GREATER_EQUAL INSTRUCTION_SET_SSE41) + message(STATUS "GOST 34.11-2012 SSE4.1 optimization enabled") + target_compile_options(streebog PRIVATE -msse4.1 -msse2) + target_compile_definitions(streebog PRIVATE __GOST3411_HAS_SSE41__ __GOST3411_HAS_SSE2__) + elseif(GOST_OPTIMIZATION GREATER_EQUAL INSTRUCTION_SET_SSE2) + message(STATUS "GOST 34.11-2012 SSE2 optimization enabled") + target_compile_options(streebog PRIVATE -msse2) + target_compile_definitions(streebog PRIVATE __GOST3411_HAS_SSE2__) + else() + message(STATUS "GOST 34.11-2012 no optimization enabled") + endif() + set_property(TARGET streebog PROPERTY POSITION_INDEPENDENT_CODE ON) +else() + message(WARNING "hypericum/streebog not found — hypericum and shipovnik will not be built") +endif() + +# ------------------------------------------------------------------- +# 2. hypericum (built directly, without hypericum/CMakeLists.txt) +# ------------------------------------------------------------------- +set(HYPERICUM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/hypericum) +if(TARGET streebog AND EXISTS "${HYPERICUM_DIR}/hypericum.c") + set(HYPERICUM_PARAMSET "b_256_64" CACHE STRING "Select a hypericum parameter set") + set_property(CACHE HYPERICUM_PARAMSET PROPERTY STRINGS + "b_256_64" "m_256_64" "b_256_20" "m_256_20" "b_128_20" "m_128_20") + if(NOT HYPERICUM_PARAMSET) + set(HYPERICUM_PARAMSET "b_256_64") + endif() + message(STATUS "Using Hypericum parameter set ${HYPERICUM_PARAMSET}") + + # Generate current-paramset.h from .h.in using HYPERICUM_PARAMSET as PARAMSET + set(PARAMSET ${HYPERICUM_PARAMSET}) + configure_file( + ${HYPERICUM_DIR}/current-paramset.h.in + ${CMAKE_CURRENT_BINARY_DIR}/hypericum/current-paramset.h + ) + + add_library(hypericum STATIC + ${HYPERICUM_DIR}/sei.c + ${HYPERICUM_DIR}/sei_cryptoapi.c + ${HYPERICUM_DIR}/sei_urandom.c + ${HYPERICUM_DIR}/drbg.c + ${HYPERICUM_DIR}/adrs.c + ${HYPERICUM_DIR}/wotsc.c + ${HYPERICUM_DIR}/sign.c + ${HYPERICUM_DIR}/hash.c + ${HYPERICUM_DIR}/utils.c + ${HYPERICUM_DIR}/pack.c + ${HYPERICUM_DIR}/stack.c + ${HYPERICUM_DIR}/streebog.c + ${HYPERICUM_DIR}/xmss.c + ${HYPERICUM_DIR}/xmssmt.c + ${HYPERICUM_DIR}/fors.c + ${HYPERICUM_DIR}/hypericum.c + ) + target_include_directories(hypericum + PUBLIC + $ + $ + PRIVATE + ${HYPERICUM_DIR} + ${STREEBOG_DIR} + ) + target_link_libraries(hypericum PUBLIC streebog) + target_compile_features(hypericum PRIVATE c_std_99) + + add_executable(hypericum_example ${HYPERICUM_DIR}/example.c) + target_link_libraries(hypericum_example PRIVATE hypericum) + target_compile_definitions(hypericum_example PRIVATE PARAMSET_NAME="${HYPERICUM_PARAMSET}") else() - message(WARNING "shipovnik submodule not initialized or missing CMakeLists.txt") + message(WARNING "hypericum sources not found — skipping hypericum target") endif() # ------------------------------------------------------------------- -# 2. hypericum (hypericum/CMakeLists.txt) +# 3. shipovnik (built directly, without shipovnik/CMakeLists.txt) # ------------------------------------------------------------------- -if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/hypericum/CMakeLists.txt") - add_subdirectory(hypericum) +set(SHIPOVNIK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/shipovnik) +if(TARGET streebog AND EXISTS "${SHIPOVNIK_DIR}/src/shipovnik.c") + set(ENTROPY_SOURCE "/dev/urandom" CACHE STRING "Entropy source path for shipovnik") + + file(GLOB SHIPOVNIK_SOURCES "${SHIPOVNIK_DIR}/src/*.c") + + add_library(shipovnik STATIC ${SHIPOVNIK_SOURCES}) + target_include_directories(shipovnik + PUBLIC + $ + PRIVATE + ${SHIPOVNIK_DIR}/src + ${STREEBOG_DIR} + ) + target_compile_definitions(shipovnik PRIVATE ENTROPY_SOURCE="${ENTROPY_SOURCE}") + target_link_libraries(shipovnik PRIVATE streebog) + + add_executable(shipovnik_example ${SHIPOVNIK_DIR}/shipovnik_example.c) + target_link_libraries(shipovnik_example PRIVATE shipovnik) else() - message(WARNING "hypericum submodule not initialized or missing CMakeLists.txt") + message(WARNING "shipovnik sources not found — skipping shipovnik target") endif() # ------------------------------------------------------------------- -# 3. kryzhovnik (no CMakeLists.txt – build manually) +# 4. kryzhovnik wrapper fork (built directly, without kryzhovnik/CMakeLists.txt) # ------------------------------------------------------------------- set(KRYZHOVNIK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/kryzhovnik) -if(EXISTS "${KRYZHOVNIK_DIR}/pqs_test.c") # marker: submodule is loaded - # Find OpenSSL - find_package(PkgConfig) +if(EXISTS "${KRYZHOVNIK_DIR}/sign.c") + find_package(PkgConfig QUIET) if(PkgConfig_FOUND) - pkg_check_modules(OPENSSL REQUIRED libcrypto) + pkg_check_modules(OPENSSL QUIET IMPORTED_TARGET libcrypto) + endif() + if(TARGET PkgConfig::OPENSSL) + set(KRYZHOVNIK_OPENSSL_TARGET PkgConfig::OPENSSL) else() find_package(OpenSSL REQUIRED) - endif() - if(NOT OPENSSL_FOUND) - message(FATAL_ERROR "OpenSSL not found (required for kryzhovnik)") + set(KRYZHOVNIK_OPENSSL_TARGET OpenSSL::Crypto) endif() - # All sources except the main test file - file(GLOB_RECURSE KRYZHOVNIK_SOURCES - "${KRYZHOVNIK_DIR}/*.c" + set(KRYZHOVNIK_SOURCES + ${KRYZHOVNIK_DIR}/cpucycles.c + ${KRYZHOVNIK_DIR}/fips202.c + ${KRYZHOVNIK_DIR}/getCPUTime.c + ${KRYZHOVNIK_DIR}/poly_mul.c + ${KRYZHOVNIK_DIR}/randombytes.c + ${KRYZHOVNIK_DIR}/rng.c + ${KRYZHOVNIK_DIR}/sign.c ) - list(REMOVE_ITEM KRYZHOVNIK_SOURCES "${KRYZHOVNIK_DIR}/pqs_test.c") + if(EXISTS "${KRYZHOVNIK_DIR}/kryzhovnik_wrapper.c") + list(APPEND KRYZHOVNIK_SOURCES ${KRYZHOVNIK_DIR}/kryzhovnik_wrapper.c) + endif() - # Build all sources as C++ set_source_files_properties(${KRYZHOVNIK_SOURCES} PROPERTIES LANGUAGE CXX) add_library(kryzhovnik STATIC ${KRYZHOVNIK_SOURCES}) - target_include_directories(kryzhovnik PRIVATE - ${KRYZHOVNIK_DIR} - ${OPENSSL_INCLUDE_DIRS} + set_target_properties(kryzhovnik PROPERTIES LINKER_LANGUAGE CXX) + target_include_directories(kryzhovnik PUBLIC + $ ) - target_link_libraries(kryzhovnik PRIVATE ${OPENSSL_LIBRARIES}) + target_link_libraries(kryzhovnik PRIVATE ${KRYZHOVNIK_OPENSSL_TARGET}) target_compile_options(kryzhovnik PRIVATE - $<$,$>:-Wall -Wextra -Wshadow -Wconversion -O3 -march=native> - $<$:/W4 /O2> + $<$,$>:-Wall -Wextra -Wshadow -Wconversion -O3 -march=native> + $<$:/W4 /O2> ) - # Test for kryzhovnik (if testing is enabled) - if(BUILD_TESTING) + if(BUILD_TESTING AND EXISTS "${KRYZHOVNIK_DIR}/pqs_test.c") set_source_files_properties(${KRYZHOVNIK_DIR}/pqs_test.c PROPERTIES LANGUAGE CXX) add_executable(kryzhovnik_test ${KRYZHOVNIK_DIR}/pqs_test.c) + set_target_properties(kryzhovnik_test PROPERTIES LINKER_LANGUAGE CXX) target_link_libraries(kryzhovnik_test PRIVATE kryzhovnik) - target_compile_definitions(kryzhovnik_test PRIVATE ${CRYPTO_PQPQC_CONFIG_DEFINITIONS}) add_test(NAME kryzhovnik_test COMMAND kryzhovnik_test) endif() + + if(BUILD_TESTING AND EXISTS "${KRYZHOVNIK_DIR}/test_wrapper.c") + set_source_files_properties(${KRYZHOVNIK_DIR}/test_wrapper.c PROPERTIES LANGUAGE CXX) + add_executable(kryzhovnik_wrapper_test ${KRYZHOVNIK_DIR}/test_wrapper.c) + set_target_properties(kryzhovnik_wrapper_test PROPERTIES LINKER_LANGUAGE CXX) + target_link_libraries(kryzhovnik_wrapper_test PRIVATE kryzhovnik) + add_test(NAME kryzhovnik_wrapper_test COMMAND kryzhovnik_wrapper_test) + endif() + + if(BUILD_TESTING AND EXISTS "${KRYZHOVNIK_DIR}/test_pqs.c") + set_source_files_properties(${KRYZHOVNIK_DIR}/test_pqs.c PROPERTIES LANGUAGE CXX) + add_executable(kryzhovnik_api_test ${KRYZHOVNIK_DIR}/test_pqs.c) + set_target_properties(kryzhovnik_api_test PROPERTIES LINKER_LANGUAGE CXX) + target_link_libraries(kryzhovnik_api_test PRIVATE kryzhovnik) + add_test(NAME kryzhovnik_api_test COMMAND kryzhovnik_api_test) + endif() else() message(WARNING "kryzhovnik submodule not initialized (run 'git submodule update --init')") endif() # ------------------------------------------------------------------- -# 4. iaik_merkle_tree (no CMakeLists.txt – build manually) +# 5. iaik_merkle_tree (no CMakeLists.txt – build manually) # ------------------------------------------------------------------- set(MERKLE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/iaik_merkle_tree) if(EXISTS "${MERKLE_DIR}/src/merkletree.h") diff --git a/third_party/README.md b/third_party/README.md index b89baea..2a88ed6 100644 --- a/third_party/README.md +++ b/third_party/README.md @@ -4,9 +4,16 @@ This directory contains git submodules for cryptographic primitives and Merkle t - shipovnik/ → https://github.com/QAPP-tech/shipovnik_tc26 - hypericum/ → https://github.com/QAPP-tech/hypericum_tc26 -- kryzhovnik/ → https://github.com/ElenaKirshanova/pqc_LWR_signature +- kryzhovnik/ → https://github.com/cherninkiy/kryzhovnik-wrapper-tc26 - iaik_merkle_tree/ → https://github.com/IAIK/merkle-tree +The original Kryzhovnik repository is https://github.com/ElenaKirshanova/pqc_LWR_signature. +This project uses a compatibility fork for the `third_party/kryzhovnik` submodule to keep compatibility with hypericum and shipovnik. + To initialize all submodules: + git submodule sync --recursive git submodule update --init --recursive + +Build logic for shipovnik, hypericum, streebog, and kryzhovnik is centralized in third_party/CMakeLists.txt. +The project does not rely on the CMakeLists.txt files shipped inside those submodules. diff --git a/third_party/kryzhovnik b/third_party/kryzhovnik index 34948fa..710500a 160000 --- a/third_party/kryzhovnik +++ b/third_party/kryzhovnik @@ -1 +1 @@ -Subproject commit 34948faca4a74cb134aeb788bf8d5e7a4d37d327 +Subproject commit 710500a98a4cbd01c8572a0d8bc57498f390f776