From 73197c6516566ed1b5cc717d88af5501aec33ad1 Mon Sep 17 00:00:00 2001 From: Thom Wiggers Date: Wed, 27 Feb 2019 12:44:21 +0100 Subject: [PATCH] Add sanitizers to functests --- test/Makefile | 10 ++++++++++ test/Makefile.Microsoft_nmake | 6 ++++++ test/helpers.py | 18 ++++++++++++++++++ test/test_functest.py | 27 +++++++++++++++++++++++++++ 4 files changed, 61 insertions(+) diff --git a/test/Makefile b/test/Makefile index 31967c2f..a048d7a6 100644 --- a/test/Makefile +++ b/test/Makefile @@ -22,6 +22,16 @@ all: $(DEST_DIR)/functest_$(SCHEME)_$(IMPLEMENTATION) $(DEST_DIR)/testvectors_$( build-scheme: cd $(SCHEME_DIR) && $(MAKE) +.PHONY: clean-scheme +clean-scheme: + cd $(SCHEME_DIR) && $(MAKE) clean + +.PHONY: functest +functest: $(DEST_DIR)/functest_$(SCHEME)_$(IMPLEMENTATION) + +.PHONY: testvectors +testvectors: $(DEST_DIR)/testvectors_$(SCHEME)_$(IMPLEMENTATION) + $(DEST_DIR)/functest_$(SCHEME)_$(IMPLEMENTATION): build-scheme crypto_$(TYPE)/functest.c $(COMMON_FILES) $(COMMON_DIR)/randombytes.c $(COMMON_HEADERS) mkdir -p $(DEST_DIR) $(CC) $(CFLAGS) -DPQCLEAN_NAMESPACE=PQCLEAN_$(SCHEME_UPPERCASE)_$(IMPLEMENTATION_UPPERCASE) -I$(SCHEME_DIR) crypto_$(TYPE)/functest.c $(COMMON_FILES) $(COMMON_DIR)/notrandombytes.c -o $@ -L$(SCHEME_DIR) -l$(SCHEME)_$(IMPLEMENTATION) diff --git a/test/Makefile.Microsoft_nmake b/test/Makefile.Microsoft_nmake index 60e0682f..c37a727e 100644 --- a/test/Makefile.Microsoft_nmake +++ b/test/Makefile.Microsoft_nmake @@ -2,6 +2,7 @@ # nmake /f Makefile.Microsoft_nmake # override as desired +# vim: set ts=4 sw=4 et: TYPE=kem SCHEME=kyber768 SCHEME_UPPERCASE=KYBER768 @@ -25,6 +26,11 @@ build-scheme: nmake /f Makefile.Microsoft_nmake cd ..\..\..\test +clean-scheme: + cd $(SCHEME_DIR) + nmake /f Makefile.Microsoft_nmake clean + cd ..\..\..\test + $(DEST_DIR)\functest_$(SCHEME)_$(IMPLEMENTATION).EXE: build-scheme $(COMMON_OBJECTS) $(COMMON_DIR)\randombytes.obj -MKDIR $(DEST_DIR) $(CC) /c crypto_$(TYPE)\functest.c $(CFLAGS) /I $(SCHEME_DIR) /DPQCLEAN_NAMESPACE=PQCLEAN_$(SCHEME_UPPERCASE)_$(IMPLEMENTATION_UPPERCASE) diff --git a/test/helpers.py b/test/helpers.py index 6b558e7e..0d8537ee 100644 --- a/test/helpers.py +++ b/test/helpers.py @@ -19,3 +19,21 @@ def run_subprocess(command, working_dir='.', expected_returncode=0): print(result.stdout.decode('utf-8')) assert(result.returncode == expected_returncode) return result.stdout.decode('utf-8') + + +def make(*args, working_dir='.', **kwargs): + """ + Runs a make target in the specified working directory + + Usage: + make('clean', 'targetb', SCHEME='bla') + """ + make_command = 'make' + return run_subprocess( + [ + make_command, + *args, + *['{}={}'.format(k, v) for k, v in kwargs.items()], + ], + working_dir=working_dir, + ) diff --git a/test/test_functest.py b/test/test_functest.py index c4d0fbbe..5cf1df6a 100644 --- a/test/test_functest.py +++ b/test/test_functest.py @@ -4,6 +4,9 @@ and executed for every scheme/implementation. """ import os +import platform +import unittest + import pqclean import helpers @@ -14,6 +17,12 @@ def test_functest(): yield check_functest, scheme.name, implementation.name +def test_functest_sanitizers(): + for scheme in pqclean.Scheme.all_schemes(): + for implementation in scheme.implementations: + yield check_functest_sanitizers, scheme.name, implementation.name + + def check_functest(scheme_name, implementation_name): implementation = pqclean.Implementation.by_name( scheme_name, implementation_name) @@ -30,6 +39,24 @@ def check_functest(scheme_name, implementation_name): ) +def check_functest_sanitizers(scheme_name, implementation_name): + if platform.machine() not in ['i386', 'x86_64']: + raise unittest.SkipTest() + implementation = pqclean.Implementation.by_name( + scheme_name, implementation_name) + helpers.make('clean-scheme', 'functest', + TYPE=implementation.scheme.type, + SCHEME=scheme_name, + IMPLEMENTATION=implementation_name, + working_dir=os.path.join('..', 'test'), + EXTRAFLAGS='-fsanitize=address,undefined') + helpers.run_subprocess( + ['./functest_{}_{}'.format(scheme_name, implementation_name)], + os.path.join('..', 'bin'), + ) + return check_functest(scheme_name, implementation_name) + + if __name__ == '__main__': try: import nose2