| ##### |
| # 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_GCC |
| CXXFLAGS +=-std=c++14 -fprofile-arcs -ftest-coverage |
| CFLAGS += -fprofile-arcs -ftest-coverage |
| else |
| CC=$(BASE)/prebuilts/clang/host/linux-x86/clang-r370808/bin/clang |
| CXX=$(BASE)/prebuilts/clang/host/linux-x86/clang-r370808/bin/clang++ |
| CXXFLAGS +=-std=c++14 -DKEYMASTER_CLANG_TEST_BUILD |
| CFLAGS += -DKEYMASTER_CLANG_TEST_BUILD |
| 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=\ |
| km_openssl/aes_key.cpp \ |
| km_openssl/aes_operation.cpp \ |
| km_openssl/triple_des_key.cpp \ |
| km_openssl/triple_des_operation.cpp \ |
| android_keymaster/android_keymaster.cpp \ |
| android_keymaster/android_keymaster_messages.cpp \ |
| tests/android_keymaster_messages_test.cpp \ |
| tests/android_keymaster_test.cpp \ |
| tests/android_keymaster_test_utils.cpp \ |
| android_keymaster/android_keymaster_utils.cpp \ |
| km_openssl/asymmetric_key.cpp \ |
| km_openssl/asymmetric_key_factory.cpp \ |
| km_openssl/attestation_record.cpp \ |
| km_openssl/block_cipher_operation.cpp \ |
| tests/attestation_record_test.cpp \ |
| key_blob_utils/auth_encrypted_key_blob.cpp \ |
| android_keymaster/authorization_set.cpp \ |
| tests/authorization_set_test.cpp \ |
| km_openssl/ec_key.cpp \ |
| km_openssl/ec_key_factory.cpp \ |
| legacy_support/ec_keymaster0_key.cpp \ |
| legacy_support/ec_keymaster1_key.cpp \ |
| legacy_support/ecdsa_keymaster1_operation.cpp \ |
| km_openssl/ecdsa_operation.cpp \ |
| km_openssl/ecies_kem.cpp \ |
| tests/ecies_kem_test.cpp \ |
| tests/gtest_main.cpp \ |
| km_openssl/ckdf.cpp \ |
| tests/hkdf_test.cpp \ |
| km_openssl/hkdf.cpp \ |
| tests/hkdf_test.cpp \ |
| km_openssl/hmac.cpp \ |
| km_openssl/hmac_key.cpp \ |
| km_openssl/hmac_operation.cpp \ |
| tests/hmac_test.cpp \ |
| key_blob_utils/integrity_assured_key_blob.cpp \ |
| km_openssl/iso18033kdf.cpp \ |
| km_openssl/kdf.cpp \ |
| tests/kdf1_test.cpp \ |
| tests/kdf2_test.cpp \ |
| tests/kdf_test.cpp \ |
| tests/key_blob_test.cpp \ |
| legacy_support/keymaster0_engine.cpp \ |
| legacy_support/keymaster1_engine.cpp \ |
| android_keymaster/keymaster_configuration.cpp \ |
| tests/keymaster_configuration_test.cpp \ |
| android_keymaster/keymaster_enforcement.cpp \ |
| km_openssl/soft_keymaster_enforcement.cpp \ |
| tests/keymaster_enforcement_test.cpp \ |
| android_keymaster/keymaster_tags.cpp \ |
| android_keymaster/logger.cpp \ |
| km_openssl/nist_curve_key_exchange.cpp \ |
| tests/nist_curve_key_exchange_test.cpp \ |
| key_blob_utils/ocb_utils.cpp \ |
| km_openssl/openssl_err.cpp \ |
| km_openssl/openssl_utils.cpp \ |
| android_keymaster/operation.cpp \ |
| android_keymaster/operation_table.cpp \ |
| km_openssl/rsa_key.cpp \ |
| km_openssl/rsa_key_factory.cpp \ |
| legacy_support/rsa_keymaster0_key.cpp \ |
| legacy_support/rsa_keymaster1_key.cpp \ |
| legacy_support/rsa_keymaster1_operation.cpp \ |
| km_openssl/rsa_operation.cpp \ |
| android_keymaster/serializable.cpp \ |
| contexts/soft_keymaster_context.cpp \ |
| contexts/soft_keymaster_device.cpp \ |
| contexts/pure_soft_keymaster_context.cpp \ |
| km_openssl/symmetric_key.cpp \ |
| km_openssl/software_random_source.cpp \ |
| contexts/soft_attestation_cert.cpp \ |
| km_openssl/attestation_utils.cpp \ |
| key_blob_utils/software_keyblobs.cpp \ |
| km_openssl/wrapped_key.cpp |
| |
| CCSRCS=$(GTEST)/src/gtest-all.cc |
| CSRCS=key_blob_utils/ocb.c |
| |
| OBJS=$(CPPSRCS:.cpp=.o) $(CCSRCS:.cc=.o) $(CSRCS:.c=.o) |
| DEPS=$(CPPSRCS:.cpp=.d) $(CCSRCS:.cc=.d) $(CSRCS:.c=.d) |
| |
| BINARIES = \ |
| tests/android_keymaster_messages_test \ |
| tests/android_keymaster_test \ |
| tests/attestation_record_test \ |
| tests/authorization_set_test \ |
| tests/ecies_kem_test \ |
| tests/ckdf_test \ |
| tests/hkdf_test \ |
| tests/hmac_test \ |
| tests/kdf1_test \ |
| tests/kdf2_test \ |
| tests/kdf_test \ |
| tests/key_blob_test \ |
| tests/keymaster_configuration_test \ |
| tests/keymaster_enforcement_test \ |
| tests/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 tests/gtest_main.o |
| |
| tests/keymaster_configuration_test: tests/keymaster_configuration_test.o \ |
| android_keymaster/authorization_set.o \ |
| android_keymaster/serializable.o \ |
| android_keymaster/logger.o \ |
| android_keymaster/keymaster_configuration.o \ |
| $(GTEST_OBJS) |
| |
| tests/hmac_test: tests/hmac_test.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| android_keymaster/authorization_set.o \ |
| km_openssl/hmac.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| android_keymaster/serializable.o \ |
| $(GTEST_OBJS) |
| |
| tests/ckdf_test: tests/ckdf_test.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| android_keymaster/authorization_set.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| android_keymaster/serializable.o \ |
| km_openssl/ckdf.o \ |
| km_openssl/openssl_err.o \ |
| $(GTEST_OBJS) |
| |
| tests/hkdf_test: tests/hkdf_test.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| android_keymaster/authorization_set.o \ |
| km_openssl/hkdf.o \ |
| km_openssl/hmac.o \ |
| km_openssl/kdf.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| android_keymaster/serializable.o \ |
| $(GTEST_OBJS) |
| |
| tests/kdf_test: tests/kdf_test.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| km_openssl/kdf.o \ |
| android_keymaster/logger.o \ |
| android_keymaster/serializable.o \ |
| $(GTEST_OBJS) |
| |
| tests/kdf1_test: tests/kdf1_test.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| android_keymaster/authorization_set.o \ |
| km_openssl/iso18033kdf.o \ |
| km_openssl/kdf.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| android_keymaster/serializable.o \ |
| $(GTEST_OBJS) |
| |
| tests/kdf2_test: tests/kdf2_test.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| android_keymaster/authorization_set.o \ |
| km_openssl/iso18033kdf.o \ |
| km_openssl/kdf.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| android_keymaster/serializable.o \ |
| $(GTEST_OBJS) |
| |
| tests/nist_curve_key_exchange_test: tests/nist_curve_key_exchange_test.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/authorization_set.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| km_openssl/nist_curve_key_exchange.o \ |
| km_openssl/openssl_err.o \ |
| km_openssl/openssl_utils.o \ |
| android_keymaster/serializable.o \ |
| $(GTEST_OBJS) |
| |
| tests/ecies_kem_test: tests/ecies_kem_test.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/authorization_set.o \ |
| km_openssl/ecies_kem.o \ |
| km_openssl/hkdf.o \ |
| km_openssl/hmac.o \ |
| km_openssl/kdf.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| km_openssl/nist_curve_key_exchange.o \ |
| km_openssl/openssl_err.o \ |
| km_openssl/openssl_utils.o \ |
| android_keymaster/serializable.o \ |
| $(GTEST_OBJS) |
| |
| tests/authorization_set_test: tests/authorization_set_test.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/authorization_set.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| android_keymaster/serializable.o \ |
| $(GTEST_OBJS) |
| |
| tests/key_blob_test: tests/key_blob_test.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| key_blob_utils/auth_encrypted_key_blob.o \ |
| android_keymaster/authorization_set.o \ |
| key_blob_utils/integrity_assured_key_blob.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| key_blob_utils/ocb.o \ |
| key_blob_utils/ocb_utils.o \ |
| km_openssl/openssl_err.o \ |
| android_keymaster/serializable.o \ |
| $(GTEST_OBJS) |
| |
| tests/android_keymaster_messages_test: tests/android_keymaster_messages_test.o \ |
| android_keymaster/android_keymaster_messages.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| android_keymaster/authorization_set.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| android_keymaster/serializable.o \ |
| $(GTEST_OBJS) |
| |
| tests/android_keymaster_test: tests/android_keymaster_test.o \ |
| android_keymaster/android_keymaster.o \ |
| android_keymaster/android_keymaster_messages.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| android_keymaster/authorization_set.o \ |
| android_keymaster/keymaster_enforcement.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| android_keymaster/operation.o \ |
| android_keymaster/operation_table.o \ |
| android_keymaster/serializable.o \ |
| contexts/pure_soft_keymaster_context.o \ |
| contexts/soft_attestation_cert.o \ |
| contexts/soft_keymaster_context.o \ |
| contexts/soft_keymaster_device.o \ |
| key_blob_utils/auth_encrypted_key_blob.o \ |
| key_blob_utils/integrity_assured_key_blob.o \ |
| key_blob_utils/ocb.o \ |
| key_blob_utils/ocb_utils.o \ |
| key_blob_utils/software_keyblobs.o \ |
| km_openssl/aes_key.o \ |
| km_openssl/aes_key.o \ |
| km_openssl/aes_operation.o \ |
| km_openssl/aes_operation.o \ |
| km_openssl/asymmetric_key.o \ |
| km_openssl/asymmetric_key_factory.o \ |
| km_openssl/attestation_record.o \ |
| km_openssl/attestation_utils.o \ |
| km_openssl/block_cipher_operation.o \ |
| km_openssl/ckdf.o \ |
| km_openssl/ec_key.o \ |
| km_openssl/ec_key_factory.o \ |
| km_openssl/ecdsa_operation.o \ |
| km_openssl/hmac_key.o \ |
| km_openssl/hmac_operation.o \ |
| km_openssl/openssl_err.o \ |
| km_openssl/openssl_utils.o \ |
| km_openssl/rsa_key.o \ |
| km_openssl/rsa_key_factory.o \ |
| km_openssl/rsa_operation.o \ |
| km_openssl/soft_keymaster_enforcement.o \ |
| km_openssl/software_random_source.o \ |
| km_openssl/symmetric_key.o \ |
| km_openssl/triple_des_key.o \ |
| km_openssl/triple_des_operation.o \ |
| km_openssl/wrapped_key.o \ |
| legacy_support/ec_keymaster0_key.o \ |
| legacy_support/ec_keymaster1_key.o \ |
| legacy_support/ecdsa_keymaster1_operation.o \ |
| legacy_support/keymaster0_engine.o \ |
| legacy_support/keymaster1_engine.o \ |
| legacy_support/rsa_keymaster0_key.o \ |
| legacy_support/rsa_keymaster1_key.o \ |
| legacy_support/rsa_keymaster1_operation.o \ |
| tests/android_keymaster_test_utils.o \ |
| $(BASE)/system/security/keystore/keyblob_utils.o \ |
| $(GTEST_OBJS) |
| |
| tests/keymaster_enforcement_test: tests/keymaster_enforcement_test.o \ |
| android_keymaster/android_keymaster_messages.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| android_keymaster/authorization_set.o \ |
| android_keymaster/keymaster_enforcement.o \ |
| km_openssl/ckdf.o \ |
| km_openssl/openssl_err.o \ |
| km_openssl/soft_keymaster_enforcement.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| android_keymaster/serializable.o \ |
| $(GTEST_OBJS) |
| |
| tests/attestation_record_test: tests/attestation_record_test.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| km_openssl/attestation_record.o \ |
| android_keymaster/authorization_set.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| km_openssl/openssl_err.o \ |
| android_keymaster/serializable.o \ |
| $(GTEST_OBJS) |
| |
| tests/wrapped_key_test: tests/wrapped_key_test.o \ |
| tests/android_keymaster_test_utils.o \ |
| android_keymaster/android_keymaster_utils.o \ |
| km_openssl/attestation_record.o \ |
| android_keymaster/authorization_set.o \ |
| android_keymaster/keymaster_tags.o \ |
| android_keymaster/logger.o \ |
| km_openssl/openssl_err.o \ |
| android_keymaster/serializable.o \ |
| km_openssl/wrapped_key.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) |