From c0deaa495202e102a5d4213b393fde112c847163 Mon Sep 17 00:00:00 2001 From: Thom Wiggers Date: Wed, 16 Jan 2019 13:52:53 +0100 Subject: [PATCH] Add automatic testing --- .travis.yml | 6 +- Makefile | 84 +++++++++++++++------- crypto_kem/test.c | 3 +- crypto_sign/dilithium-iii/clean/rounding.c | 3 +- crypto_sign/test.c | 1 + 5 files changed, 64 insertions(+), 33 deletions(-) diff --git a/.travis.yml b/.travis.yml index 77e414d7..eb6c48d9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,8 +6,6 @@ compiler: script: - make test-all - - if [[ $(find . -iname *.h -o -iname *.c | xargs clang-format -style=file) ]]; then; - echo "Files need formatting."; - exit 1; - fi; + - make check-format + - make tidy # vim: set ft=yaml ts=2 sw=2 tw=0 et : diff --git a/Makefile b/Makefile index 77c5f790..ff5290b0 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,17 @@ # This -Wall was supported by the European Commission through the ERC Starting Grant 805031 (EPOQUE) CFLAGS=-Wall -Wextra -Wpedantic -Werror -std=c99 $(EXTRAFLAGS) +ALL_SCHEMES=$(filter-out crypto_%/test.c, $(wildcard crypto_*/*)) + +default: help + +.PHONY: require_scheme +require_scheme: +# assumes a SCHEME variable; e.g. make functest_kem SCHEME=crypto_kem/kyber768 +ifndef SCHEME + $(error The SCHEME variable is not set. Example: SCHEME=crypto_kem/kyber768) +endif + bin/functest_$(subst /,_,$(SCHEME)): $(dir $(SCHEME))test.c $(wildcard $(SCHEME)/clean/*.c) $(wildcard $(SCHEME)/clean/*.h) | require_scheme mkdir -p bin $(CC) $(CFLAGS) \ @@ -26,49 +37,70 @@ clean: format: find . -iname *.h -o -iname *.c | xargs clang-format -i -style=file +.PHONY: check-format +check-format: + @for src in $(SOURCES) ; do \ + var=`clang-format "$(SRC_DIR)/$$src" | diff "$(SRC_DIR)/$$src" - | wc -l` ; \ + if [ $$var -ne 0 ] ; then \ + echo "$$src does not respect the coding style (diff: $$var lines)" ; \ + exit 1 ; \ + fi ; \ + done + @echo "Style check passed" + .PHONY: tidy -tidy: require_scheme +tidy: + $(eval undefine .TIDY_FIX) + $(MAKE) do-tidy + +do-tidy: require_scheme clang-tidy \ + -quiet $(.TIDY_FIX) \ $(SCHEME)/clean/*.c \ $(SCHEME)/../test.c \ common/*.c \ - $(.TIDY_FIX) \ -- -iquote "common/" -iquote "$(SCHEME)/clean" -.PHONY: fix-tidy -apply-tidy: | $(eval .TIDY_FIX = -fix) tidy +.PHONY: apply-tidy +apply-tidy: + $(MAKE) do-tidy .TIDY_FIX=-fix +# The below should be outlined with ts=8 .PHONY: help help: - @echo make functest SCHEME=scheme run functional tests for SCHEME - @echo make clean clean up the bin/ folder - @echo make format Automatically formats all the source code - @echo make tidy SCHEME=scheme Runs the clang-tidy linter against SCHEME - @echo make fix-tidy SCHEME=scheme Tries to automatically fix the issues found by clang-tidy in SCHEME - @echo make help Displays this message + @echo "make functest SCHEME=scheme Build functional tests for SCHEME" + @echo "make run-functest SCHEME=scheme Run functional tests for SCHEME" + @echo "make run-functest-all Run all functests" + @echo "make clean Clean up the bin/ folder" + @echo "make format Automatically formats all the source code" + @echo "make tidy SCHEME=scheme Runs the clang-tidy linter against SCHEME" + @echo "make apply-tidy SCHEME=scheme Tries to automatically fix the issues found by clang-tidy in SCHEME" + @echo "make tidy-all Runs the clang-tidy linter against all schemes" + @echo "make apply-tidy-all Tidy up all schemes" + @echo "make help Displays this message" -.PHONY: require_scheme -require_scheme: -# assumes a SCHEME variable; e.g. make functest_kem SCHEME=crypto_kem/kyber768 -ifndef SCHEME - $(error The SCHEME variable is not set. Example: SCHEME=crypto_kem/kyber768) -endif +.PHONY: functest-all +build-functests: $(foreach skeme,$(ALL_SCHEMES),bin/functest_$(subst /,_,$(skeme))) -.PHONY: build-functests -build-functests: - find crypto_kem/ crypto_sign/ -mindepth 1 -maxdepth 1 -type d -exec make functest SCHEME={} \; - -.PHONY: run-functests -run-functests: - find crypto_kem/ crypto_sign/ -mindepth 1 -maxdepth 1 -type d -exec make run-functest SCHEME={} \; +.PHONY: run-functest-all +run-functest-all: build-functests + @for functest in bin/functest_* ; do \ + echo ./$$functest ; \ + ./$$functest ; \ + done + @echo Tests completed .PHONY: test-all test-all: run-functests .PHONY: tidy-all tidy-all: - find crypto_kem/ crypto_sign/ -mindepth 1 -maxdepth 1 -type d -exec make tidy SCHEME={} \; + @for scheme in $(ALL_SCHEMES); do \ + $(MAKE) tidy SCHEME=$$scheme; \ + done -.PHONY: applytidy-all +.PHONY: apply-tidy-all apply-tidy-all: - find crypto_kem/ crypto_sign/ -mindepth 1 -maxdepth 1 -type d -exec make apply-tidy SCHEME={} \; + @for scheme in $(ALL_SCHEMES); do \ + $(MAKE) apply-tidy SCHEME=$$scheme; \ + done diff --git a/crypto_kem/test.c b/crypto_kem/test.c index ccfce3da..9e83ee20 100644 --- a/crypto_kem/test.c +++ b/crypto_kem/test.c @@ -16,7 +16,8 @@ static int check_canary(const unsigned char *d) { if (*(uint64_t *)d != 0x0123456789ABCDEF) { return -1; } - { return 0; } + + return 0; } static int test_keys(void) { diff --git a/crypto_sign/dilithium-iii/clean/rounding.c b/crypto_sign/dilithium-iii/clean/rounding.c index 3cd4d59e..fba70fbc 100644 --- a/crypto_sign/dilithium-iii/clean/rounding.c +++ b/crypto_sign/dilithium-iii/clean/rounding.c @@ -102,9 +102,8 @@ uint32_t use_hint(const uint32_t a, const unsigned int hint) { } if (a0 > Q) { return (a1 + 1) & 0xF; - } else { - return (a1 - 1) & 0xF; } + return (a1 - 1) & 0xF; /* If decompose does not divide out ALPHA: if(hint == 0) diff --git a/crypto_sign/test.c b/crypto_sign/test.c index 2480bba1..7a5a0f57 100644 --- a/crypto_sign/test.c +++ b/crypto_sign/test.c @@ -17,6 +17,7 @@ static int check_canary(const unsigned char *d) { if (*(uint64_t *)d != 0x0123456789ABCDEF) { return -1; } + return 0; } static int test_sign(void) {