From ab970ae2c08c0263ed844c1f0121419a4166bd2d Mon Sep 17 00:00:00 2001 From: Douglas Stebila Date: Thu, 1 Aug 2019 11:53:15 -0400 Subject: [PATCH] Switch KEM KAT checks to Python test suite --- .gitignore | 1 - .travis/kat-check.sh | 28 -------- Makefile.am | 7 -- README.md | 6 +- VisualStudio/kat-check.bat | 13 ---- appveyor.yml | 12 ++-- scripts/check_kats.sh | 72 ------------------- .../KATs/kem}/BIKE1-L1-Additional.kat | 0 .../KATs/kem}/BIKE1-L1.Additional.const.kat | 0 .../KATs/kem}/BIKE1-L1.Additional.kat | 0 {src/kem/bike => tests/KATs/kem}/BIKE1-L1.kat | 0 .../KATs/kem}/BIKE1-L3-Additional.kat | 0 .../KATs/kem}/BIKE1-L3.Additional.const.kat | 0 .../KATs/kem}/BIKE1-L3.Additional.kat | 0 {src/kem/bike => tests/KATs/kem}/BIKE1-L3.kat | 0 .../KATs/kem}/BIKE1-L5-Additional.kat | 0 .../KATs/kem}/BIKE1-L5.Additional.const.kat | 0 .../KATs/kem}/BIKE1-L5.Additional.kat | 0 {src/kem/bike => tests/KATs/kem}/BIKE1-L5.kat | 0 .../KATs/kem}/BIKE2-L1-Additional.kat | 0 .../KATs/kem}/BIKE2-L1.Additional.const.kat | 0 .../KATs/kem}/BIKE2-L1.Additional.kat | 0 {src/kem/bike => tests/KATs/kem}/BIKE2-L1.kat | 0 .../KATs/kem}/BIKE2-L3-Additional.kat | 0 .../KATs/kem}/BIKE2-L3.Additional.const.kat | 0 .../KATs/kem}/BIKE2-L3.Additional.kat | 0 {src/kem/bike => tests/KATs/kem}/BIKE2-L3.kat | 0 .../KATs/kem}/BIKE2-L5-Additional.kat | 0 .../KATs/kem}/BIKE2-L5.Additional.const.kat | 0 .../KATs/kem}/BIKE2-L5.Additional.kat | 0 {src/kem/bike => tests/KATs/kem}/BIKE2-L5.kat | 0 .../KATs/kem}/BIKE3-L1-Additional.kat | 0 .../KATs/kem}/BIKE3-L1.Additional.const.kat | 0 .../KATs/kem}/BIKE3-L1.Additional.kat | 0 {src/kem/bike => tests/KATs/kem}/BIKE3-L1.kat | 0 .../KATs/kem}/BIKE3-L3-Additional.kat | 0 .../KATs/kem}/BIKE3-L3.Additional.const.kat | 0 .../KATs/kem}/BIKE3-L3.Additional.kat | 0 {src/kem/bike => tests/KATs/kem}/BIKE3-L3.kat | 0 .../KATs/kem}/BIKE3-L5-Additional.kat | 0 .../KATs/kem}/BIKE3-L5.Additional.const.kat | 0 .../KATs/kem}/BIKE3-L5.Additional.kat | 0 {src/kem/bike => tests/KATs/kem}/BIKE3-L5.kat | 0 .../KATs/kem}/FireSaber-KEM.kat | 0 .../KATs/kem}/FrodoKEM-1344-AES.kat | 0 .../KATs/kem}/FrodoKEM-1344-SHAKE.kat | 0 .../KATs/kem}/FrodoKEM-640-AES.kat | 0 .../KATs/kem}/FrodoKEM-640-SHAKE.kat | 0 .../KATs/kem}/FrodoKEM-976-AES.kat | 0 .../KATs/kem}/FrodoKEM-976-SHAKE.kat | 0 .../kyber => tests/KATs/kem}/Kyber1024.kat | 0 .../kem/kyber => tests/KATs/kem}/Kyber512.kat | 0 .../kem/kyber => tests/KATs/kem}/Kyber768.kat | 0 .../KATs/kem}/LightSaber-KEM.kat | 0 .../KATs/kem}/NTRU-HPS-2048-509.kat | 0 .../KATs/kem}/NTRU-HPS-2048-677.kat | 0 .../KATs/kem}/NTRU-HPS-4096-821.kat | 0 .../ntru => tests/KATs/kem}/NTRU-HRSS-701.kat | 0 .../KATs/kem}/NewHope-1024-CCA.kat | 0 .../KATs/kem}/NewHope-512-CCA.kat | 0 .../saber => tests/KATs/kem}/Saber-KEM.kat | 0 .../kem/sike => tests/KATs/kem}/Sike-p434.kat | 0 .../kem/sike => tests/KATs/kem}/Sike-p503.kat | 0 .../kem/sike => tests/KATs/kem}/Sike-p610.kat | 0 .../kem/sike => tests/KATs/kem}/Sike-p751.kat | 0 tests/helpers.py | 20 ++++++ tests/kat_kem.c | 47 +++++------- tests/test_hash.py | 10 ++- tests/test_kat.py | 25 +++++++ 69 files changed, 83 insertions(+), 158 deletions(-) delete mode 100755 .travis/kat-check.sh delete mode 100644 VisualStudio/kat-check.bat delete mode 100755 scripts/check_kats.sh rename {src/kem/bike => tests/KATs/kem}/BIKE1-L1-Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE1-L1.Additional.const.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE1-L1.Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE1-L1.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE1-L3-Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE1-L3.Additional.const.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE1-L3.Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE1-L3.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE1-L5-Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE1-L5.Additional.const.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE1-L5.Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE1-L5.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE2-L1-Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE2-L1.Additional.const.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE2-L1.Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE2-L1.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE2-L3-Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE2-L3.Additional.const.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE2-L3.Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE2-L3.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE2-L5-Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE2-L5.Additional.const.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE2-L5.Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE2-L5.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE3-L1-Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE3-L1.Additional.const.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE3-L1.Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE3-L1.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE3-L3-Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE3-L3.Additional.const.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE3-L3.Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE3-L3.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE3-L5-Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE3-L5.Additional.const.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE3-L5.Additional.kat (100%) rename {src/kem/bike => tests/KATs/kem}/BIKE3-L5.kat (100%) rename {src/kem/saber => tests/KATs/kem}/FireSaber-KEM.kat (100%) rename {src/kem/frodokem => tests/KATs/kem}/FrodoKEM-1344-AES.kat (100%) rename {src/kem/frodokem => tests/KATs/kem}/FrodoKEM-1344-SHAKE.kat (100%) rename {src/kem/frodokem => tests/KATs/kem}/FrodoKEM-640-AES.kat (100%) rename {src/kem/frodokem => tests/KATs/kem}/FrodoKEM-640-SHAKE.kat (100%) rename {src/kem/frodokem => tests/KATs/kem}/FrodoKEM-976-AES.kat (100%) rename {src/kem/frodokem => tests/KATs/kem}/FrodoKEM-976-SHAKE.kat (100%) rename {src/kem/kyber => tests/KATs/kem}/Kyber1024.kat (100%) rename {src/kem/kyber => tests/KATs/kem}/Kyber512.kat (100%) rename {src/kem/kyber => tests/KATs/kem}/Kyber768.kat (100%) rename {src/kem/saber => tests/KATs/kem}/LightSaber-KEM.kat (100%) rename {src/kem/ntru => tests/KATs/kem}/NTRU-HPS-2048-509.kat (100%) rename {src/kem/ntru => tests/KATs/kem}/NTRU-HPS-2048-677.kat (100%) rename {src/kem/ntru => tests/KATs/kem}/NTRU-HPS-4096-821.kat (100%) rename {src/kem/ntru => tests/KATs/kem}/NTRU-HRSS-701.kat (100%) rename {src/kem/newhope => tests/KATs/kem}/NewHope-1024-CCA.kat (100%) rename {src/kem/newhope => tests/KATs/kem}/NewHope-512-CCA.kat (100%) rename {src/kem/saber => tests/KATs/kem}/Saber-KEM.kat (100%) rename {src/kem/sike => tests/KATs/kem}/Sike-p434.kat (100%) rename {src/kem/sike => tests/KATs/kem}/Sike-p503.kat (100%) rename {src/kem/sike => tests/KATs/kem}/Sike-p610.kat (100%) rename {src/kem/sike => tests/KATs/kem}/Sike-p751.kat (100%) create mode 100644 tests/test_kat.py diff --git a/.gitignore b/.gitignore index fc9f08209..51b29ed9d 100644 --- a/.gitignore +++ b/.gitignore @@ -45,7 +45,6 @@ tests/test_sha3 #kat tests/kat_kem -kat_kem_rsp/ # Debug files *.dSYM/ diff --git a/.travis/kat-check.sh b/.travis/kat-check.sh deleted file mode 100755 index 03a3aa7aa..000000000 --- a/.travis/kat-check.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -### -# Checks that all KATs pass. -### - -set -e - -source $(dirname $0)/defs.sh - -RET=0 - -./tests/kat_kem -scripts/check_kats.sh -error=$? -if [ $error -eq 0 ]; -then - ${PRINT_GREEN} - echo "All known answer tests passed."; - ${PRINT_RESET} -else - ${PRINT_RED} - echo "Error in known answer tests."; - ${PRINT_RESET} - RET=1 -fi - -exit ${RET} diff --git a/Makefile.am b/Makefile.am index 4ea46dff8..c674baea0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -105,10 +105,6 @@ test: check tests/test_sha3 python3 -m pytest -v -kat: clean-kats check - tests/kat_kem - scripts/check_kats.sh - links: $(MKDIR_P) include/oqs cp -f src/oqs.h include/oqs @@ -144,9 +140,6 @@ clean-local: clean-tests: rm -f tests/example_kem tests/example_sig tests/speed_kem tests/speed_sig tests/test_kem tests/test_sig tests/test_aes tests/test_sha3 -clean-kats: - rm -rf tests/kat_kem kat_kem_rsp/ - prettyprint: find src tests -name '*.c' -o -name '*.h' | grep -v picnic/external* | grep -v frodokem/external* | grep -v pqclean | xargs $(CLANGFORMAT) -style=file -i diff --git a/README.md b/README.md index 4ffedb6dd..806902234 100644 --- a/README.md +++ b/README.md @@ -164,13 +164,17 @@ There are also a variety of test programs built under the `tests` directory: - `test_kem`: Simple test harness for all enabled key encapsulation mechanisms - `test_sig`: Simple test harness for all enabled key signature schemes -- `kat_kem`: Program that generates known answer test (KAT) values for all enabled key encapsulation mechanisms using the same mechanism as the NIST submission requirements, for checking against submitted KAT values using `scripts/check_kats.sh` +- `kat_kem`: Program that generates known answer test (KAT) values for all enabled key encapsulation mechanisms using the same mechanism as the NIST submission requirements, for checking against submitted KAT values using `tests/test_kat.py` - `speed_kem`: Benchmarking program for key encapsulation mechanisms; see `./speed_kem --help` for usage instructions - `speed_sig`: Benchmarking program for signature mechanisms; see `./speed_sig --help` for usage instructions - `example_kem`: Minimal runnable example showing the usage of the KEM API - `example_sig`: Minimal runnable example showing the usage of the signature API - `test_aes`, `test_sha3`: Simple test harnesses for crypto sub-components +A range of tests can be run using + + python3 -m pytest + Building and running on Windows ------------------------------- diff --git a/VisualStudio/kat-check.bat b/VisualStudio/kat-check.bat deleted file mode 100644 index 91da3dd6b..000000000 --- a/VisualStudio/kat-check.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -REM compares KAT files for Windows-enabled KEM algs -for /R src\kem\ %%K in (*.kat) DO ( - if exist kat_kem_rsp\%%~nxK ( - FC %%K kat_kem_rsp\%%~nxK >nul 2>nul - if errorlevel 1 ( - echo %%~nxK not matching - exit /b 1 - ) - ) -) - diff --git a/appveyor.yml b/appveyor.yml index b17e4d9c5..3bf50b01a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,6 +12,10 @@ branches: - /.*nist.*/ - /master-new-.*/ +init: + - set PATH="C:\\Python37";"C:\\Python37\Scripts";%PATH% + + configuration: - Debug - DebugDLL @@ -20,16 +24,16 @@ configuration: test_script: - cmd: >- + python -m pip install pytest + cd %APPVEYOR_BUILD_FOLDER% + python -m pytest -v + %APPVEYOR_BUILD_FOLDER%\VisualStudio\%PLATFORM%\%CONFIGURATION%\test_kem.exe %APPVEYOR_BUILD_FOLDER%\VisualStudio\%PLATFORM%\%CONFIGURATION%\test_sig.exe %APPVEYOR_BUILD_FOLDER%\VisualStudio\%PLATFORM%\%CONFIGURATION%\example_kem.exe - %APPVEYOR_BUILD_FOLDER%\VisualStudio\%PLATFORM%\%CONFIGURATION%\kat_kem.exe - - %APPVEYOR_BUILD_FOLDER%\VisualStudio\kat-check.bat - %APPVEYOR_BUILD_FOLDER%\VisualStudio\%PLATFORM%\%CONFIGURATION%\speed_kem.exe %APPVEYOR_BUILD_FOLDER%\VisualStudio\%PLATFORM%\%CONFIGURATION%\speed_sig.exe diff --git a/scripts/check_kats.sh b/scripts/check_kats.sh deleted file mode 100755 index d88fc2589..000000000 --- a/scripts/check_kats.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash - -### -# Checks that all generated KATs match their upstream values. -### - -PRINT_GREEN="tput setaf 2" -PRINT_RED="tput setaf 1" -PRINT_RESET="tput sgr 0" -PRINT_YELLOW="tput setaf 3" - -RET=0 - -ALGS=$(grep -E 'define OQS_(KEM|SIG)_alg_' src/kem/kem.h src/sig/sig.h | grep -v 'default' | grep -v 'sidh' | sed -e 's/^[^"]*"//' | sed -e 's/".*$//' | tr -d '[:blank:]') -for alg in ${ALGS}; do - - kat=$(find kat_*_rsp -name ${alg}.kat |tr '\n' ' ') - if [ -z "${kat}" ]; - then - ${PRINT_YELLOW} - echo "KAT file not generated for ${alg}" - ${PRINT_RESET} - RET=0 - continue - fi - - origs=$(find src -name ${alg}.kat -o -name ${alg}.*.kat |tr '\n' ' ') - if [[ "x${origs}x" == "xx" ]]; - then - ${PRINT_RED} - echo "No original KAT file found for ${alg}" - ${PRINT_RESET} - RET=1 - continue - fi - - match=0 - for orig in ${origs}; do - diff ${orig} ${kat} > /dev/null 2>&1 - error=$? - if [ $error -eq 0 ] - then - echo "KAT values match for ${alg} and ${orig}" - match=1 - break - elif [ ! $error -eq 1 ] - then - ${PRINT_RED} - echo "An error occurred in the diff command" - ${PRINT_RESET} - RET=1 - fi - done - - if [ $match -eq 0 ] - then - ${PRINT_RED} - echo "KAT values do not match for ${alg} with any of ${origs}" - ${PRINT_RESET} - RET=1 - fi -done - - -if [[ "${RET}" == "0" ]]; -then - ${PRINT_GREEN} - echo "All KAT values matched."; - ${PRINT_RESET} -fi - -exit ${RET} diff --git a/src/kem/bike/BIKE1-L1-Additional.kat b/tests/KATs/kem/BIKE1-L1-Additional.kat similarity index 100% rename from src/kem/bike/BIKE1-L1-Additional.kat rename to tests/KATs/kem/BIKE1-L1-Additional.kat diff --git a/src/kem/bike/BIKE1-L1.Additional.const.kat b/tests/KATs/kem/BIKE1-L1.Additional.const.kat similarity index 100% rename from src/kem/bike/BIKE1-L1.Additional.const.kat rename to tests/KATs/kem/BIKE1-L1.Additional.const.kat diff --git a/src/kem/bike/BIKE1-L1.Additional.kat b/tests/KATs/kem/BIKE1-L1.Additional.kat similarity index 100% rename from src/kem/bike/BIKE1-L1.Additional.kat rename to tests/KATs/kem/BIKE1-L1.Additional.kat diff --git a/src/kem/bike/BIKE1-L1.kat b/tests/KATs/kem/BIKE1-L1.kat similarity index 100% rename from src/kem/bike/BIKE1-L1.kat rename to tests/KATs/kem/BIKE1-L1.kat diff --git a/src/kem/bike/BIKE1-L3-Additional.kat b/tests/KATs/kem/BIKE1-L3-Additional.kat similarity index 100% rename from src/kem/bike/BIKE1-L3-Additional.kat rename to tests/KATs/kem/BIKE1-L3-Additional.kat diff --git a/src/kem/bike/BIKE1-L3.Additional.const.kat b/tests/KATs/kem/BIKE1-L3.Additional.const.kat similarity index 100% rename from src/kem/bike/BIKE1-L3.Additional.const.kat rename to tests/KATs/kem/BIKE1-L3.Additional.const.kat diff --git a/src/kem/bike/BIKE1-L3.Additional.kat b/tests/KATs/kem/BIKE1-L3.Additional.kat similarity index 100% rename from src/kem/bike/BIKE1-L3.Additional.kat rename to tests/KATs/kem/BIKE1-L3.Additional.kat diff --git a/src/kem/bike/BIKE1-L3.kat b/tests/KATs/kem/BIKE1-L3.kat similarity index 100% rename from src/kem/bike/BIKE1-L3.kat rename to tests/KATs/kem/BIKE1-L3.kat diff --git a/src/kem/bike/BIKE1-L5-Additional.kat b/tests/KATs/kem/BIKE1-L5-Additional.kat similarity index 100% rename from src/kem/bike/BIKE1-L5-Additional.kat rename to tests/KATs/kem/BIKE1-L5-Additional.kat diff --git a/src/kem/bike/BIKE1-L5.Additional.const.kat b/tests/KATs/kem/BIKE1-L5.Additional.const.kat similarity index 100% rename from src/kem/bike/BIKE1-L5.Additional.const.kat rename to tests/KATs/kem/BIKE1-L5.Additional.const.kat diff --git a/src/kem/bike/BIKE1-L5.Additional.kat b/tests/KATs/kem/BIKE1-L5.Additional.kat similarity index 100% rename from src/kem/bike/BIKE1-L5.Additional.kat rename to tests/KATs/kem/BIKE1-L5.Additional.kat diff --git a/src/kem/bike/BIKE1-L5.kat b/tests/KATs/kem/BIKE1-L5.kat similarity index 100% rename from src/kem/bike/BIKE1-L5.kat rename to tests/KATs/kem/BIKE1-L5.kat diff --git a/src/kem/bike/BIKE2-L1-Additional.kat b/tests/KATs/kem/BIKE2-L1-Additional.kat similarity index 100% rename from src/kem/bike/BIKE2-L1-Additional.kat rename to tests/KATs/kem/BIKE2-L1-Additional.kat diff --git a/src/kem/bike/BIKE2-L1.Additional.const.kat b/tests/KATs/kem/BIKE2-L1.Additional.const.kat similarity index 100% rename from src/kem/bike/BIKE2-L1.Additional.const.kat rename to tests/KATs/kem/BIKE2-L1.Additional.const.kat diff --git a/src/kem/bike/BIKE2-L1.Additional.kat b/tests/KATs/kem/BIKE2-L1.Additional.kat similarity index 100% rename from src/kem/bike/BIKE2-L1.Additional.kat rename to tests/KATs/kem/BIKE2-L1.Additional.kat diff --git a/src/kem/bike/BIKE2-L1.kat b/tests/KATs/kem/BIKE2-L1.kat similarity index 100% rename from src/kem/bike/BIKE2-L1.kat rename to tests/KATs/kem/BIKE2-L1.kat diff --git a/src/kem/bike/BIKE2-L3-Additional.kat b/tests/KATs/kem/BIKE2-L3-Additional.kat similarity index 100% rename from src/kem/bike/BIKE2-L3-Additional.kat rename to tests/KATs/kem/BIKE2-L3-Additional.kat diff --git a/src/kem/bike/BIKE2-L3.Additional.const.kat b/tests/KATs/kem/BIKE2-L3.Additional.const.kat similarity index 100% rename from src/kem/bike/BIKE2-L3.Additional.const.kat rename to tests/KATs/kem/BIKE2-L3.Additional.const.kat diff --git a/src/kem/bike/BIKE2-L3.Additional.kat b/tests/KATs/kem/BIKE2-L3.Additional.kat similarity index 100% rename from src/kem/bike/BIKE2-L3.Additional.kat rename to tests/KATs/kem/BIKE2-L3.Additional.kat diff --git a/src/kem/bike/BIKE2-L3.kat b/tests/KATs/kem/BIKE2-L3.kat similarity index 100% rename from src/kem/bike/BIKE2-L3.kat rename to tests/KATs/kem/BIKE2-L3.kat diff --git a/src/kem/bike/BIKE2-L5-Additional.kat b/tests/KATs/kem/BIKE2-L5-Additional.kat similarity index 100% rename from src/kem/bike/BIKE2-L5-Additional.kat rename to tests/KATs/kem/BIKE2-L5-Additional.kat diff --git a/src/kem/bike/BIKE2-L5.Additional.const.kat b/tests/KATs/kem/BIKE2-L5.Additional.const.kat similarity index 100% rename from src/kem/bike/BIKE2-L5.Additional.const.kat rename to tests/KATs/kem/BIKE2-L5.Additional.const.kat diff --git a/src/kem/bike/BIKE2-L5.Additional.kat b/tests/KATs/kem/BIKE2-L5.Additional.kat similarity index 100% rename from src/kem/bike/BIKE2-L5.Additional.kat rename to tests/KATs/kem/BIKE2-L5.Additional.kat diff --git a/src/kem/bike/BIKE2-L5.kat b/tests/KATs/kem/BIKE2-L5.kat similarity index 100% rename from src/kem/bike/BIKE2-L5.kat rename to tests/KATs/kem/BIKE2-L5.kat diff --git a/src/kem/bike/BIKE3-L1-Additional.kat b/tests/KATs/kem/BIKE3-L1-Additional.kat similarity index 100% rename from src/kem/bike/BIKE3-L1-Additional.kat rename to tests/KATs/kem/BIKE3-L1-Additional.kat diff --git a/src/kem/bike/BIKE3-L1.Additional.const.kat b/tests/KATs/kem/BIKE3-L1.Additional.const.kat similarity index 100% rename from src/kem/bike/BIKE3-L1.Additional.const.kat rename to tests/KATs/kem/BIKE3-L1.Additional.const.kat diff --git a/src/kem/bike/BIKE3-L1.Additional.kat b/tests/KATs/kem/BIKE3-L1.Additional.kat similarity index 100% rename from src/kem/bike/BIKE3-L1.Additional.kat rename to tests/KATs/kem/BIKE3-L1.Additional.kat diff --git a/src/kem/bike/BIKE3-L1.kat b/tests/KATs/kem/BIKE3-L1.kat similarity index 100% rename from src/kem/bike/BIKE3-L1.kat rename to tests/KATs/kem/BIKE3-L1.kat diff --git a/src/kem/bike/BIKE3-L3-Additional.kat b/tests/KATs/kem/BIKE3-L3-Additional.kat similarity index 100% rename from src/kem/bike/BIKE3-L3-Additional.kat rename to tests/KATs/kem/BIKE3-L3-Additional.kat diff --git a/src/kem/bike/BIKE3-L3.Additional.const.kat b/tests/KATs/kem/BIKE3-L3.Additional.const.kat similarity index 100% rename from src/kem/bike/BIKE3-L3.Additional.const.kat rename to tests/KATs/kem/BIKE3-L3.Additional.const.kat diff --git a/src/kem/bike/BIKE3-L3.Additional.kat b/tests/KATs/kem/BIKE3-L3.Additional.kat similarity index 100% rename from src/kem/bike/BIKE3-L3.Additional.kat rename to tests/KATs/kem/BIKE3-L3.Additional.kat diff --git a/src/kem/bike/BIKE3-L3.kat b/tests/KATs/kem/BIKE3-L3.kat similarity index 100% rename from src/kem/bike/BIKE3-L3.kat rename to tests/KATs/kem/BIKE3-L3.kat diff --git a/src/kem/bike/BIKE3-L5-Additional.kat b/tests/KATs/kem/BIKE3-L5-Additional.kat similarity index 100% rename from src/kem/bike/BIKE3-L5-Additional.kat rename to tests/KATs/kem/BIKE3-L5-Additional.kat diff --git a/src/kem/bike/BIKE3-L5.Additional.const.kat b/tests/KATs/kem/BIKE3-L5.Additional.const.kat similarity index 100% rename from src/kem/bike/BIKE3-L5.Additional.const.kat rename to tests/KATs/kem/BIKE3-L5.Additional.const.kat diff --git a/src/kem/bike/BIKE3-L5.Additional.kat b/tests/KATs/kem/BIKE3-L5.Additional.kat similarity index 100% rename from src/kem/bike/BIKE3-L5.Additional.kat rename to tests/KATs/kem/BIKE3-L5.Additional.kat diff --git a/src/kem/bike/BIKE3-L5.kat b/tests/KATs/kem/BIKE3-L5.kat similarity index 100% rename from src/kem/bike/BIKE3-L5.kat rename to tests/KATs/kem/BIKE3-L5.kat diff --git a/src/kem/saber/FireSaber-KEM.kat b/tests/KATs/kem/FireSaber-KEM.kat similarity index 100% rename from src/kem/saber/FireSaber-KEM.kat rename to tests/KATs/kem/FireSaber-KEM.kat diff --git a/src/kem/frodokem/FrodoKEM-1344-AES.kat b/tests/KATs/kem/FrodoKEM-1344-AES.kat similarity index 100% rename from src/kem/frodokem/FrodoKEM-1344-AES.kat rename to tests/KATs/kem/FrodoKEM-1344-AES.kat diff --git a/src/kem/frodokem/FrodoKEM-1344-SHAKE.kat b/tests/KATs/kem/FrodoKEM-1344-SHAKE.kat similarity index 100% rename from src/kem/frodokem/FrodoKEM-1344-SHAKE.kat rename to tests/KATs/kem/FrodoKEM-1344-SHAKE.kat diff --git a/src/kem/frodokem/FrodoKEM-640-AES.kat b/tests/KATs/kem/FrodoKEM-640-AES.kat similarity index 100% rename from src/kem/frodokem/FrodoKEM-640-AES.kat rename to tests/KATs/kem/FrodoKEM-640-AES.kat diff --git a/src/kem/frodokem/FrodoKEM-640-SHAKE.kat b/tests/KATs/kem/FrodoKEM-640-SHAKE.kat similarity index 100% rename from src/kem/frodokem/FrodoKEM-640-SHAKE.kat rename to tests/KATs/kem/FrodoKEM-640-SHAKE.kat diff --git a/src/kem/frodokem/FrodoKEM-976-AES.kat b/tests/KATs/kem/FrodoKEM-976-AES.kat similarity index 100% rename from src/kem/frodokem/FrodoKEM-976-AES.kat rename to tests/KATs/kem/FrodoKEM-976-AES.kat diff --git a/src/kem/frodokem/FrodoKEM-976-SHAKE.kat b/tests/KATs/kem/FrodoKEM-976-SHAKE.kat similarity index 100% rename from src/kem/frodokem/FrodoKEM-976-SHAKE.kat rename to tests/KATs/kem/FrodoKEM-976-SHAKE.kat diff --git a/src/kem/kyber/Kyber1024.kat b/tests/KATs/kem/Kyber1024.kat similarity index 100% rename from src/kem/kyber/Kyber1024.kat rename to tests/KATs/kem/Kyber1024.kat diff --git a/src/kem/kyber/Kyber512.kat b/tests/KATs/kem/Kyber512.kat similarity index 100% rename from src/kem/kyber/Kyber512.kat rename to tests/KATs/kem/Kyber512.kat diff --git a/src/kem/kyber/Kyber768.kat b/tests/KATs/kem/Kyber768.kat similarity index 100% rename from src/kem/kyber/Kyber768.kat rename to tests/KATs/kem/Kyber768.kat diff --git a/src/kem/saber/LightSaber-KEM.kat b/tests/KATs/kem/LightSaber-KEM.kat similarity index 100% rename from src/kem/saber/LightSaber-KEM.kat rename to tests/KATs/kem/LightSaber-KEM.kat diff --git a/src/kem/ntru/NTRU-HPS-2048-509.kat b/tests/KATs/kem/NTRU-HPS-2048-509.kat similarity index 100% rename from src/kem/ntru/NTRU-HPS-2048-509.kat rename to tests/KATs/kem/NTRU-HPS-2048-509.kat diff --git a/src/kem/ntru/NTRU-HPS-2048-677.kat b/tests/KATs/kem/NTRU-HPS-2048-677.kat similarity index 100% rename from src/kem/ntru/NTRU-HPS-2048-677.kat rename to tests/KATs/kem/NTRU-HPS-2048-677.kat diff --git a/src/kem/ntru/NTRU-HPS-4096-821.kat b/tests/KATs/kem/NTRU-HPS-4096-821.kat similarity index 100% rename from src/kem/ntru/NTRU-HPS-4096-821.kat rename to tests/KATs/kem/NTRU-HPS-4096-821.kat diff --git a/src/kem/ntru/NTRU-HRSS-701.kat b/tests/KATs/kem/NTRU-HRSS-701.kat similarity index 100% rename from src/kem/ntru/NTRU-HRSS-701.kat rename to tests/KATs/kem/NTRU-HRSS-701.kat diff --git a/src/kem/newhope/NewHope-1024-CCA.kat b/tests/KATs/kem/NewHope-1024-CCA.kat similarity index 100% rename from src/kem/newhope/NewHope-1024-CCA.kat rename to tests/KATs/kem/NewHope-1024-CCA.kat diff --git a/src/kem/newhope/NewHope-512-CCA.kat b/tests/KATs/kem/NewHope-512-CCA.kat similarity index 100% rename from src/kem/newhope/NewHope-512-CCA.kat rename to tests/KATs/kem/NewHope-512-CCA.kat diff --git a/src/kem/saber/Saber-KEM.kat b/tests/KATs/kem/Saber-KEM.kat similarity index 100% rename from src/kem/saber/Saber-KEM.kat rename to tests/KATs/kem/Saber-KEM.kat diff --git a/src/kem/sike/Sike-p434.kat b/tests/KATs/kem/Sike-p434.kat similarity index 100% rename from src/kem/sike/Sike-p434.kat rename to tests/KATs/kem/Sike-p434.kat diff --git a/src/kem/sike/Sike-p503.kat b/tests/KATs/kem/Sike-p503.kat similarity index 100% rename from src/kem/sike/Sike-p503.kat rename to tests/KATs/kem/Sike-p503.kat diff --git a/src/kem/sike/Sike-p610.kat b/tests/KATs/kem/Sike-p610.kat similarity index 100% rename from src/kem/sike/Sike-p610.kat rename to tests/KATs/kem/Sike-p610.kat diff --git a/src/kem/sike/Sike-p751.kat b/tests/KATs/kem/Sike-p751.kat similarity index 100% rename from src/kem/sike/Sike-p751.kat rename to tests/KATs/kem/Sike-p751.kat diff --git a/tests/helpers.py b/tests/helpers.py index f04cbf4dd..98efc7260 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -48,3 +48,23 @@ def run_subprocess(command, working_dir='.', env=None, expected_returncode=0, in print(stdout.decode('utf-8')) assert retcode == expected_returncode, "Got unexpected return code {}".format(retcode) return stdout.decode('utf-8') + +def enabled_kems_by_name(): + enabled_symbols = [] + with open('include/oqs/oqsconfig.h') as fh: + for line in fh: + if line.startswith("#define OQS_ENABLE_KEM_"): + kem_symbol = line.split(' ')[1] + kem_symbol = kem_symbol[len("OQS_ENABLE_KEM_"):] + enabled_symbols.append(kem_symbol) + enabled_names = [] + with open('include/oqs/kem.h') as fh: + for line in fh: + if line.startswith("#define OQS_KEM_alg"): + kem_symbol = line.split(' ')[1] + kem_symbol = kem_symbol[len("OQS_KEM_alg_"):] + kem_name = line.split(' ')[2] + kem_name = kem_name[1:-2] + if kem_symbol in enabled_symbols: + enabled_names.append(kem_name) + return enabled_names diff --git a/tests/kat_kem.c b/tests/kat_kem.c index d92d91198..b2a54aa0b 100644 --- a/tests/kat_kem.c +++ b/tests/kat_kem.c @@ -40,7 +40,6 @@ OQS_STATUS kem_kat(const char *method_name) { uint8_t *ciphertext = NULL; uint8_t *shared_secret_e = NULL; uint8_t *shared_secret_d = NULL; - char filename[200]; OQS_STATUS rc, ret = OQS_ERROR; int rv; @@ -60,12 +59,7 @@ OQS_STATUS kem_kat(const char *method_name) { } OQS_randombytes_nist_kat_init(entropy_input, NULL, 256); - sprintf(filename, "kat_kem_rsp/%s.kat", method_name); - - fh = fopen(filename, "w"); - if (fh == NULL) { - goto err; - } + fh = stdout; fprintf(fh, "count = 0\n"); OQS_randombytes(seed, 48); @@ -123,9 +117,6 @@ algo_not_enabled: ret = OQS_SUCCESS; cleanup: - if (fh != NULL) { - fclose(fh); - } if (kem != NULL) { OQS_MEM_secure_free(secret_key, kem->length_secret_key); OQS_MEM_secure_free(shared_secret_e, kem->length_shared_secret); @@ -137,27 +128,25 @@ cleanup: return ret; } -int main() { - - int ret = EXIT_SUCCESS; - OQS_STATUS rc; - - int status; -#if defined(_WIN32) - status = _mkdir("kat_kem_rsp"); -#else - status = mkdir("kat_kem_rsp", S_IRWXU); -#endif - if (!((status == 0) || (errno == EEXIST))) { +int main(int argc, char **argv) { + + if (argc != 2) { + fprintf(stderr, "Usage: kat_kem algname\n"); + fprintf(stderr, " algname: "); + for (size_t i = 0; i < OQS_KEM_algs_length; i++) { + if (i > 0) { + fprintf(stderr, ", "); + } + fprintf(stderr, "%s", OQS_KEM_alg_identifier(i)); + } + fprintf(stderr, "\n"); return EXIT_FAILURE; } - for (size_t i = 0; i < OQS_KEM_algs_length; i++) { - rc = kem_kat(OQS_KEM_alg_identifier(i)); - if (rc != OQS_SUCCESS) { - ret = EXIT_FAILURE; - } + char *alg_name = argv[1]; + OQS_STATUS rc = kem_kat(alg_name); + if (rc != OQS_SUCCESS) { + return EXIT_FAILURE; } - - return ret; + return EXIT_SUCCESS; } diff --git a/tests/test_hash.py b/tests/test_hash.py index c658c50c4..bcd9beb7f 100644 --- a/tests/test_hash.py +++ b/tests/test_hash.py @@ -1,11 +1,13 @@ import hashlib import helpers +import os.path import pytest @pytest.mark.parametrize('msg', ['', 'a', 'abc', '1234567890123456789012345678901678901567890']) def test_sha256(msg): output = helpers.run_subprocess( - ['tests/test_hash', 'sha256'], + [os.path.join('.', 'test_hash'), 'sha256'], + working_dir = 'tests', input = msg.encode(), ) assert(output.rstrip() == hashlib.sha256(msg.encode()).hexdigest()) @@ -13,7 +15,8 @@ def test_sha256(msg): @pytest.mark.parametrize('msg', ['', 'a', 'abc', '1234567890123456789012345678901678901567890']) def test_sha384(msg): output = helpers.run_subprocess( - ['tests/test_hash', 'sha384'], + [os.path.join('.', 'test_hash'), 'sha384'], + working_dir = 'tests', input = msg.encode(), ) assert(output.rstrip() == hashlib.sha384(msg.encode()).hexdigest()) @@ -21,7 +24,8 @@ def test_sha384(msg): @pytest.mark.parametrize('msg', ['', 'a', 'abc', '1234567890123456789012345678901678901567890']) def test_sha512(msg): output = helpers.run_subprocess( - ['tests/test_hash', 'sha512'], + [os.path.join('.', 'test_hash'), 'sha512'], + working_dir = 'tests', input = msg.encode(), ) assert(output.rstrip() == hashlib.sha512(msg.encode()).hexdigest()) diff --git a/tests/test_kat.py b/tests/test_kat.py new file mode 100644 index 000000000..9ca576fe8 --- /dev/null +++ b/tests/test_kat.py @@ -0,0 +1,25 @@ +import hashlib +import helpers +import os +import os.path +import pytest + +@pytest.mark.parametrize('kem_name', helpers.enabled_kems_by_name()) +def test_kem(kem_name): + if kem_name.startswith('Sidh'): pytest.skip('KATs not available for SIDH') + output = helpers.run_subprocess( + ['kat_kem', kem_name], + working_dir = 'tests' + ) + kats = [] + for file in os.scandir(os.path.join('tests', 'KATs', 'kem')): + filename = file.name + if filename.startswith(kem_name + '.') and filename.endswith('.kat'): + with open(os.path.join('tests', 'KATs', 'kem', filename), 'r') as myfile: + kats.append(myfile.read()) + assert(output in kats) + +if __name__ == "__main__": + import sys + pytest.main(sys.argv) +