##### # Local unit test Makefile # # This makefile builds and runs the keymaster unit tests locally on the development # machine, not on an Android device. Android.mk builds the same tests into the # "keymaster_tests" binary for execution on-device, but this Makefile runs them locally, # for a very fast edit/build/test development cycle. # # To build and run these tests, one pre-requisite must be manually installed: BoringSSL. # This Makefile expects to find BoringSSL in a directory adjacent to $ANDROID_BUILD_TOP. # To get and build it, first install the Ninja build tool (e.g. apt-get install # ninja-build), then do: # # cd $ANDROID_BUILD_TOP/.. # git clone https://boringssl.googlesource.com/boringssl # cd boringssl # mdkir build # cd build # cmake -GNinja .. # ninja # # Then return to $ANDROID_BUILD_TOP/system/keymaster and run "make". ##### BASE=../.. SUBS=system/core \ hardware/libhardware \ external/gtest \ system/security/softkeymaster \ system/security/keystore GTEST=$(BASE)/external/googletest/googletest INCLUDES=$(foreach dir,$(SUBS),-I $(BASE)/$(dir)/include) \ -I $(BASE)/libnativehelper/include/nativehelper \ -I $(GTEST)/include -isystem $(GTEST) -Iinclude -I$(BASE)/../boringssl/include ifdef FORCE_32_BIT ARCH_FLAGS = -m32 endif ifdef USE_CLANG CC=/usr/bin/clang CXX=/usr/bin/clang CXXFLAGS +=-std=c++11 -DKEYMASTER_CLANG_TEST_BUILD CFLAGS += -DKEYMASTER_CLANG_TEST_BUILD else CXXFLAGS +=-std=c++0x -fprofile-arcs -ftest-coverage CFLAGS += -fprofile-arcs -ftest-coverage endif LDFLAGS += $(ARCH_FLAGS) CPPFLAGS = $(INCLUDES) -g -O0 -MD -MP $(ARCH_FLAGS) -DKEYMASTER_UNIT_TEST_BUILD -DHOST_BUILD CXXFLAGS += -Wall -Werror -Wno-unused -Winit-self -Wpointer-arith -Wunused-parameter \ -Werror=sign-compare -Werror=return-type -fno-permissive \ -Wno-deprecated-declarations -fno-exceptions -DKEYMASTER_NAME_TAGS $(ARCH_FLAGS) CFLAGS += $(ARCH_FLAGS) -DKEYMASTER_UNIT_TEST_BUILD -DHOST_BUILD # Uncomment to enable debug logging. # CXXFLAGS += -DDEBUG LDLIBS=-L$(BASE)/../boringssl/build/crypto -lcrypto -lpthread -lstdc++ -lgcov CPPSRCS=\ aes_key.cpp \ aes_operation.cpp \ android_keymaster.cpp \ android_keymaster_messages.cpp \ android_keymaster_messages_test.cpp \ android_keymaster_test.cpp \ android_keymaster_test_utils.cpp \ android_keymaster_utils.cpp \ asymmetric_key.cpp \ asymmetric_key_factory.cpp \ attestation_record.cpp \ attestation_record_test.cpp \ auth_encrypted_key_blob.cpp \ authorization_set.cpp \ authorization_set_test.cpp \ ec_key.cpp \ ec_key_factory.cpp \ ec_keymaster0_key.cpp \ ec_keymaster1_key.cpp \ ecdsa_keymaster1_operation.cpp \ ecdsa_operation.cpp \ ecies_kem.cpp \ ecies_kem_test.cpp \ gtest_main.cpp \ hkdf.cpp \ hkdf_test.cpp \ hmac.cpp \ hmac_key.cpp \ hmac_operation.cpp \ hmac_test.cpp \ integrity_assured_key_blob.cpp \ iso18033kdf.cpp \ kdf.cpp \ kdf1_test.cpp \ kdf2_test.cpp \ kdf_test.cpp \ key.cpp \ key_blob_test.cpp \ keymaster0_engine.cpp \ keymaster1_engine.cpp \ keymaster_configuration.cpp \ keymaster_configuration_test.cpp \ keymaster_enforcement.cpp \ keymaster_enforcement_test.cpp \ keymaster_tags.cpp \ logger.cpp \ nist_curve_key_exchange.cpp \ nist_curve_key_exchange_test.cpp \ ocb_utils.cpp \ openssl_err.cpp \ openssl_utils.cpp \ operation.cpp \ operation_table.cpp \ rsa_key.cpp \ rsa_key_factory.cpp \ rsa_keymaster0_key.cpp \ rsa_keymaster1_key.cpp \ rsa_keymaster1_operation.cpp \ rsa_operation.cpp \ serializable.cpp \ soft_keymaster_context.cpp \ soft_keymaster_device.cpp \ symmetric_key.cpp CCSRCS=$(GTEST)/src/gtest-all.cc CSRCS=ocb.c OBJS=$(CPPSRCS:.cpp=.o) $(CCSRCS:.cc=.o) $(CSRCS:.c=.o) DEPS=$(CPPSRCS:.cpp=.d) $(CCSRCS:.cc=.d) $(CSRCS:.c=.d) BINARIES = \ android_keymaster_messages_test \ android_keymaster_test \ attestation_record_test \ authorization_set_test \ ecies_kem_test \ hkdf_test \ hmac_test \ kdf1_test \ kdf2_test \ kdf_test \ key_blob_test \ keymaster_configuration_test \ keymaster_enforcement_test \ nist_curve_key_exchange_test .PHONY: coverage memcheck massif clean run %.run: % ./$< touch $@ run: $(BINARIES:=.run) coverage: coverage.info genhtml coverage.info --output-directory coverage coverage.info: run lcov --capture --directory=. --output-file coverage.info %.coverage : % $(MAKE) clean && $(MAKE) $< ./$< lcov --capture --directory=. --output-file coverage.info genhtml coverage.info --output-directory coverage #UNINIT_OPTS=--track-origins=yes UNINIT_OPTS=--undef-value-errors=no MEMCHECK_OPTS=--leak-check=full \ --show-reachable=yes \ --vgdb=full \ $(UNINIT_OPTS) \ --error-exitcode=1 \ --suppressions=valgrind.supp \ --gen-suppressions=all MASSIF_OPTS=--tool=massif \ --stacks=yes %.memcheck : % valgrind $(MEMCHECK_OPTS) ./$< && \ touch $@ %.massif : % valgrind $(MASSIF_OPTS) --massif-out-file=$@ ./$< memcheck: $(BINARIES:=.memcheck) massif: $(BINARIES:=.massif) GTEST_OBJS = $(GTEST)/src/gtest-all.o gtest_main.o keymaster_configuration_test: keymaster_configuration_test.o \ authorization_set.o \ serializable.o \ logger.o \ keymaster_configuration.o \ $(GTEST_OBJS) hmac_test: hmac_test.o \ android_keymaster_test_utils.o \ android_keymaster_utils.o \ authorization_set.o \ hmac.o \ keymaster_tags.o \ logger.o \ serializable.o \ $(GTEST_OBJS) hkdf_test: hkdf_test.o \ android_keymaster_test_utils.o \ android_keymaster_utils.o \ authorization_set.o \ hkdf.o \ hmac.o \ kdf.o \ keymaster_tags.o \ logger.o \ serializable.o \ $(GTEST_OBJS) kdf_test: kdf_test.o \ android_keymaster_utils.o \ kdf.o \ logger.o \ serializable.o \ $(GTEST_OBJS) kdf1_test: kdf1_test.o \ android_keymaster_test_utils.o \ android_keymaster_utils.o \ authorization_set.o \ iso18033kdf.o \ kdf.o \ keymaster_tags.o \ logger.o \ serializable.o \ $(GTEST_OBJS) kdf2_test: kdf2_test.o \ android_keymaster_test_utils.o \ android_keymaster_utils.o \ authorization_set.o \ iso18033kdf.o \ kdf.o \ keymaster_tags.o \ logger.o \ serializable.o \ $(GTEST_OBJS) nist_curve_key_exchange_test: nist_curve_key_exchange_test.o \ android_keymaster_test_utils.o \ authorization_set.o \ keymaster_tags.o \ logger.o \ nist_curve_key_exchange.o \ openssl_err.o \ openssl_utils.o \ serializable.o \ $(GTEST_OBJS) ecies_kem_test: ecies_kem_test.o \ android_keymaster_utils.o \ android_keymaster_test_utils.o \ authorization_set.o \ ecies_kem.o \ hkdf.o \ hmac.o \ kdf.o \ keymaster_tags.o \ logger.o \ nist_curve_key_exchange.o \ openssl_err.o \ openssl_utils.o \ serializable.o \ $(GTEST_OBJS) authorization_set_test: authorization_set_test.o \ android_keymaster_test_utils.o \ authorization_set.o \ keymaster_tags.o \ logger.o \ serializable.o \ $(GTEST_OBJS) key_blob_test: key_blob_test.o \ android_keymaster_test_utils.o \ android_keymaster_utils.o \ auth_encrypted_key_blob.o \ authorization_set.o \ integrity_assured_key_blob.o \ keymaster_tags.o \ logger.o \ ocb.o \ ocb_utils.o \ openssl_err.o \ serializable.o \ $(GTEST_OBJS) android_keymaster_messages_test: android_keymaster_messages_test.o \ android_keymaster_messages.o \ android_keymaster_test_utils.o \ android_keymaster_utils.o \ authorization_set.o \ keymaster_tags.o \ logger.o \ serializable.o \ $(GTEST_OBJS) android_keymaster_test: android_keymaster_test.o \ aes_key.o \ aes_operation.o \ android_keymaster.o \ android_keymaster_messages.o \ android_keymaster_test_utils.o \ android_keymaster_utils.o \ asymmetric_key.o \ asymmetric_key_factory.o \ attestation_record.o \ auth_encrypted_key_blob.o \ authorization_set.o \ ec_key.o \ ec_key_factory.o \ ec_keymaster0_key.o \ ec_keymaster1_key.o \ ecdsa_keymaster1_operation.o \ ecdsa_operation.o \ hmac_key.o \ hmac_operation.o \ integrity_assured_key_blob.o \ key.o \ keymaster0_engine.o \ keymaster1_engine.o \ keymaster_enforcement.o \ keymaster_tags.o \ logger.o \ ocb.o \ ocb_utils.o \ openssl_err.o \ openssl_utils.o \ operation.o \ operation_table.o \ rsa_key.o \ rsa_key_factory.o \ rsa_keymaster0_key.o \ rsa_keymaster1_key.o \ rsa_keymaster1_operation.o \ rsa_operation.o \ serializable.o \ soft_keymaster_context.o \ soft_keymaster_device.o \ symmetric_key.o \ $(BASE)/system/security/softkeymaster/keymaster_openssl.o \ $(BASE)/system/security/keystore/keyblob_utils.o \ $(GTEST_OBJS) keymaster_enforcement_test: keymaster_enforcement_test.o \ android_keymaster_messages.o \ android_keymaster_test_utils.o \ android_keymaster_utils.o \ authorization_set.o \ keymaster_enforcement.o \ keymaster_tags.o \ logger.o \ serializable.o \ $(GTEST_OBJS) attestation_record_test: attestation_record_test.o \ android_keymaster_test_utils.o \ android_keymaster_utils.o \ attestation_record.o \ authorization_set.o \ keymaster_tags.o \ logger.o \ openssl_err.o \ serializable.o \ $(GTEST_OBJS) $(GTEST)/src/gtest-all.o: CXXFLAGS:=$(subst -Wmissing-declarations,,$(CXXFLAGS)) clean: rm -f $(OBJS) $(DEPS) $(BINARIES) \ $(BINARIES:=.run) $(BINARIES:=.memcheck) $(BINARIES:=.massif) \ *gcov *gcno *gcda coverage.info rm -rf coverage -include $(CPPSRCS:.cpp=.d) -include $(CCSRCS:.cc=.d)