blob: d35cba486b92c1c7a64972ee8414ffefffaf4913 [file] [log] [blame]
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Top-level Makefile for chaps.
#
# Setting LINUX_BUILD=1 will build chaps for a standard (non-Chrome OS) linux
# system.
# Pull in chromium os defaults
PWD ?= $(CURDIR)
OUT ?= $(PWD)/build-opt-local
include common.mk
ifeq ($(LINUX_BUILD), 1)
PLATFORM = linux
else
PLATFORM = chromeos
endif
PKG_CONFIG ?= pkg-config
DBUSXX_XML2CPP = dbusxx-xml2cpp
PROTOC = protoc
INSTALL ?= install
INSTALL_DATA = $(INSTALL) -m 0644
BUILD_PAM_MODULE ?= $(LINUX_BUILD)
LIB_DIR ?= /usr/lib
PAM_MODULE_DIR ?= /lib/security
BASE_VER ?= 180609
PC_DEPS = dbus-c++-1 protobuf openssl \
libchrome-$(BASE_VER) libchromeos-$(BASE_VER)
PC_CFLAGS := $(shell $(PKG_CONFIG) --cflags $(PC_DEPS))
PC_LIBS := $(shell $(PKG_CONFIG) --libs $(PC_DEPS))
CXXFLAGS += -I$(SRC)/.. -I$(OUT) $(PC_CFLAGS) -DNDEBUG
LDLIBS += $(PC_LIBS)
# Test if libmemenv is available, and whether libsnappy is required to
# compile LevelDB.
MEMENV_LIB := $(call check_cxx,-lmemenv)
ifneq ($(MEMENV_LIB), -lmemenv)
CPPFLAGS += -DNO_MEMENV
endif
LEVELDB_LIBS := $(call check_libs_cxx, \
'\#include<leveldb/db.h>\nint main(){\
leveldb::Options options; leveldb::DB::Open(options, 0, 0);\
return 0;}',\
-lleveldb $(MEMENV_LIB), -lleveldb $(MEMENV_LIB) -lsnappy)
# Test if libmetric is available
METRICS_LIB := $(call check_cxx,-lmetrics)
ifneq ($(METRICS_LIB), -lmetrics)
CPPFLAGS += -DNO_METRICS
endif
DBUS_ADAPTORS_DIR = $(OUT)/chaps/dbus_adaptors
DBUS_PROXIES_DIR = $(OUT)/chaps/dbus_proxies
# Rules for Generated Code
$(DBUS_PROXIES_DIR)/chaps_interface.h: $(SRC)/chaps_interface.xml
mkdir -p $(DBUS_PROXIES_DIR)
$(DBUSXX_XML2CPP) $< --proxy=$@
clean: CLEAN($(DBUS_PROXIES_DIR)/chaps_interface.h)
chaps_client.o.depends \
chaps_proxy.o.depends \
chapsd_test.o.depends \
chaps.o.depends \
chaps_event_generator.o.depends \
token_manager_client.o.depends: $(DBUS_PROXIES_DIR)/chaps_interface.h
$(DBUS_ADAPTORS_DIR)/chaps_interface.h: $(SRC)/chaps_interface.xml
mkdir -p $(DBUS_ADAPTORS_DIR)
$(DBUSXX_XML2CPP) $< --adaptor=$@
clean: CLEAN($(DBUS_ADAPTORS_DIR)/chaps_interface.h)
chaps_adaptor.o.depends \
chapsd.o.depends : $(DBUS_ADAPTORS_DIR)/chaps_interface.h
PROTO_DIR = $(OUT)/chaps/proto_bindings
$(PROTO_DIR)/attributes.pb.h \
$(PROTO_DIR)/attributes.pb.cc: $(SRC)/attributes.proto
mkdir -p $(PROTO_DIR)
$(PROTOC) -I$(SRC) --cpp_out=$(OUT)/chaps/proto_bindings $<
clean: CLEAN($(PROTO_DIR)/attributes.pb.h $(PROTO_DIR)/attributes.pb.cc)
$(eval $(call add_object_rules,$(PROTO_DIR)/attributes.pb.o,CXX,cc,CXXFLAGS))
object_pool_impl.o.depends \
object_pool_test.o.depends \
attributes.o.depends: $(PROTO_DIR)/attributes.pb.h
# Common Files
COMMON_OBJS = chaps_utility.o $(PROTO_DIR)/attributes.pb.o attributes.o
# Chaps Daemon
chapsd_OBJS = $(COMMON_OBJS) \
chapsd.o \
chaps_service.o \
chaps_service_redirect.o \
chaps_adaptor.o \
isolate_$(PLATFORM).o \
slot_manager_impl.o \
session_impl.o \
object_impl.o \
object_policy_common.o \
object_policy_data.o \
object_policy_cert.o \
object_policy_key.o \
object_policy_public_key.o \
object_policy_private_key.o \
object_policy_secret_key.o \
object_pool_impl.o \
platform_globals_$(PLATFORM).o \
tpm_utility_impl.o \
chaps_factory_impl.o \
object_store_impl.o \
opencryptoki_importer.o
chapsd_LIBS = -ldl -ltspi $(LEVELDB_LIBS) $(METRICS_LIB)
CXX_BINARY(chapsd): $(chapsd_OBJS)
CXX_BINARY(chapsd): LDLIBS += $(chapsd_LIBS)
clean: CLEAN(chapsd)
all: CXX_BINARY(chapsd)
# Chaps DBus Configuration
ifeq ($(LINUX_BUILD),1)
DBUS_POLICY = "context=\"default\""
else
DBUS_POLICY = "group=\"pkcs11\""
endif
.PHONY: $(OUT)/org.chromium.Chaps.conf
$(OUT)/org.chromium.Chaps.conf :
sed -e "s/@POLICY_PERMISSIONS@/$(DBUS_POLICY)/" \
$(SRC)/org.chromium.Chaps.conf.in > $@
all: $(OUT)/org.chromium.Chaps.conf
clean: CLEAN($(OUT)/org.chromium.Chaps.conf)
# Chaps Client Library
libchaps_OBJS = $(COMMON_OBJS) chaps.o chaps_proxy.o token_manager_client.o \
isolate_$(PLATFORM).o
CXX_LIBRARY(libchaps.so): $(libchaps_OBJS)
clean: CLEAN(libchaps.so)
all: CXX_LIBRARY(libchaps.so)
# Chaps Client CLI App
chaps_client_OBJS = $(COMMON_OBJS) chaps_client.o chaps_proxy.o \
token_manager_client.o isolate_$(PLATFORM).o
CXX_BINARY(chaps_client): $(chaps_client_OBJS)
clean: CLEAN(chaps_client)
all: CXX_BINARY(chaps_client)
# PKCS #11 Replay Utility
p11_replay_OBJS = p11_replay.o
CXX_BINARY(p11_replay): $(p11_replay_OBJS) CXX_LIBRARY(libchaps.so)
clean: CLEAN(p11_replay)
all: CXX_BINARY(p11_replay)
ifeq ($(BUILD_PAM_MODULE), 1)
# Chaps PAM Module
pamchaps_OBJS = $(COMMON_OBJS) chaps_pam_module.o chaps.o chaps_proxy.o \
token_manager_client.o isolate_login_client.o pam_helper.o \
token_file_manager_$(PLATFORM).o isolate_$(PLATFORM).o \
platform_globals_$(PLATFORM).o
CXX_LIBRARY(pam_chaps.so): $(pamchaps_OBJS)
clean: CLEAN(pam_chaps.so)
all: CXX_LIBRARY(pam_chaps.so)
endif
ifeq ($(LINUX_BUILD), 1)
# Install chaps files into their locations on Linux.
install_files: all
$(INSTALL) -D $(OUT)/chapsd $(DESTDIR)/usr/sbin/chapsd
$(INSTALL) -D $(OUT)/chaps_client $(DESTDIR)/usr/bin/chaps_client
$(INSTALL) -D $(OUT)/libchaps.so $(DESTDIR)$(LIB_DIR)/libchaps.so
$(INSTALL_DATA) -D $(OUT)/org.chromium.Chaps.conf \
$(DESTDIR)/etc/dbus-1/system.d/org.chromium.Chaps.conf
$(INSTALL_DATA) -D $(SRC)/org.chromium.Chaps.service \
$(DESTDIR)/usr/share/dbus-1/system-services/org.chromium.Chaps.service
ifeq ($(BUILD_PAM_MODULE), 1)
$(INSTALL) -D $(OUT)/pam_chaps.so \
$(DESTDIR)$(PAM_MODULE_DIR)/pam_chaps.so
$(INSTALL_DATA) -D $(SRC)/pam_chaps.cfg \
$(DESTDIR)/usr/share/pam-configs/chaps
endif
# Perform all post-install operations for Chaps on Linux.
install_ops: install_files
$(INSTALL) -m 700 -d $(DESTDIR)/var/lib/chaps/tokens/
$(INSTALL) -m 755 -d $(DESTDIR)/var/lib/chaps/isolates/
ifeq ($(BUILD_PAM_MODULE), 1)
ifeq ($(DESTDIR),)
pam-auth-update --package
endif
endif
install: install_files install_ops
endif
# Common Test Dependencies
MOCK_OBJS = chaps_factory_mock.o \
object_mock.o \
object_policy_mock.o \
object_pool_mock.o \
object_store_mock.o \
pam_helper_mock.o \
session_mock.o \
slot_manager_mock.o \
tpm_utility_mock.o \
object_importer_mock.o
GMOCK_LIBS = -lgtest -lgmock
# QEMU will not run death-tests, generate RSA keys, or handle the import sample
# tarball. These tests need to be filtered out.
qemu_test_exclusions = *DeathTest* \
*ImportSample* \
TestSession.RSA* \
TestSession.KeyTypeMismatch \
TestSession.KeyFunctionPermission \
TestSession.BadKeySize \
TestSession.BadSignature
# We want $(space)=' '.
space :=
space +=
qemu_test_filter := -$(subst $(space),:,$(strip $(qemu_test_exclusions)))
tests: override GTEST_ARGS.qemu.arm := --gtest_filter=$(qemu_test_filter)
# Unit Tests
chaps_test_OBJS = $(COMMON_OBJS) isolate_$(PLATFORM).o chaps_test.o
chaps_test_LIBS = $(GMOCK_LIBS)
CXX_BINARY(chaps_test): $(chaps_test_OBJS) CXX_LIBRARY(libchaps.so)
CXX_BINARY(chaps_test): LDLIBS += $(chaps_test_LIBS)
clean: CLEAN(chaps_test)
tests: TEST(CXX_BINARY(chaps_test))
chaps_service_test_OBJS = $(COMMON_OBJS) $(MOCK_OBJS) \
chaps_service_test.o chaps_service.o \
isolate_$(PLATFORM).o
chaps_service_test_LIBS = $(GMOCK_LIBS)
CXX_BINARY(chaps_service_test): $(chaps_service_test_OBJS)
CXX_BINARY(chaps_service_test): LDLIBS += $(chaps_service_test_LIBS)
clean: CLEAN(chaps_service_test)
tests: TEST(CXX_BINARY(chaps_service_test))
slot_manager_test_OBJS = $(COMMON_OBJS) $(MOCK_OBJS) \
slot_manager_test.o slot_manager_impl.o \
isolate_$(PLATFORM).o
slot_manager_test_LIBS = $(GMOCK_LIBS)
CXX_BINARY(slot_manager_test): $(slot_manager_test_OBJS)
CXX_BINARY(slot_manager_test): LDLIBS += $(slot_manager_test_LIBS)
clean: CLEAN(slot_manager_test)
tests: TEST(CXX_BINARY(slot_manager_test))
session_test_OBJS = $(COMMON_OBJS) $(MOCK_OBJS) session_test.o session_impl.o
session_test_LIBS = $(GMOCK_LIBS)
CXX_BINARY(session_test): $(session_test_OBJS)
CXX_BINARY(session_test): LDLIBS += $(session_test_LIBS)
clean: CLEAN(session_test)
tests: TEST(CXX_BINARY(session_test))
object_test_OBJS = $(COMMON_OBJS) $(MOCK_OBJS) object_test.o object_impl.o
object_test_LIBS = $(GMOCK_LIBS)
CXX_BINARY(object_test): $(object_test_OBJS)
CXX_BINARY(object_test): LDLIBS += $(object_test_LIBS)
clean: CLEAN(object_test)
tests: TEST(CXX_BINARY(object_test))
object_policy_test_OBJS = $(COMMON_OBJS) $(MOCK_OBJS) \
object_policy_test.o \
object_policy_common.o \
object_policy_data.o \
object_policy_cert.o \
object_policy_key.o \
object_policy_public_key.o \
object_policy_private_key.o \
object_policy_secret_key.o
object_policy_test_LIBS = $(GMOCK_LIBS)
CXX_BINARY(object_policy_test): $(object_policy_test_OBJS)
CXX_BINARY(object_policy_test): LDLIBS += $(object_policy_test_LIBS)
clean: CLEAN(object_policy_test)
tests: TEST(CXX_BINARY(object_policy_test))
object_pool_test_OBJS = $(COMMON_OBJS) $(MOCK_OBJS) \
object_pool_test.o object_pool_impl.o
object_pool_test_LIBS = $(GMOCK_LIBS)
CXX_BINARY(object_pool_test): $(object_pool_test_OBJS)
CXX_BINARY(object_pool_test): LDLIBS += $(object_pool_test_LIBS)
clean: CLEAN(object_pool_test)
tests: TEST(CXX_BINARY(object_pool_test))
object_store_test_OBJS = $(COMMON_OBJS) object_store_test.o object_store_impl.o
object_store_test_LIBS = -lgtest $(LEVELDB_LIBS) $(METRICS_LIB)
CXX_BINARY(object_store_test): $(object_store_test_OBJS)
CXX_BINARY(object_store_test): LDLIBS += $(object_store_test_LIBS)
clean: CLEAN(object_store_test)
tests: TEST(CXX_BINARY(object_store_test))
opencryptoki_importer_test_OBJS = $(COMMON_OBJS) $(MOCK_OBJS) \
opencryptoki_importer_test.o \
opencryptoki_importer.o
opencryptoki_importer_test_LIBS = $(GMOCK_LIBS)
CXX_BINARY(opencryptoki_importer_test): $(opencryptoki_importer_test_OBJS)
CXX_BINARY(opencryptoki_importer_test): LDLIBS += \
$(opencryptoki_importer_test_LIBS)
clean: CLEAN(opencryptoki_importer_test)
tests: $(OUT)/opencryptoki_sample_token.tgz
$(OUT)/opencryptoki_sample_token.tgz:
cp $(SRC)/opencryptoki_sample_token.tgz $@
clean: CLEAN(opencryptoki_sample_token.tgz)
tests: TEST(CXX_BINARY(opencryptoki_importer_test))
isolate_login_client_test_OBJS = $(COMMON_OBJS) $(MOCK_OBJS) \
isolate_$(PLATFORM).o \
token_file_manager_$(PLATFORM).o \
token_manager_client.o \
chaps_proxy.o \
isolate_login_client.o \
isolate_login_client_test.o
isolate_login_client_test_LIBS = $(GMOCK_LIBS)
CXX_BINARY(isolate_login_client_test): $(isolate_login_client_test_OBJS)
CXX_BINARY(isolate_login_client_test): LDLIBS += \
$(isolate_login_client_test_LIBS)
clean: CLEAN(isolate_login_client_test)
tests: TEST(CXX_BINARY(isolate_login_client_test))
ifeq ($(BUILD_PAM_MODULE), 1)
chaps_pam_module_test_OBJS = $(COMMON_OBJS) $(MOCK_OBJS) \
isolate_$(PLATFORM).o \
token_file_manager_$(PLATFORM).o \
platform_globals_$(PLATFORM).o \
token_manager_client.o \
isolate_login_client.o \
chaps_proxy.o \
pam_helper.o \
chaps_pam_module_test.o \
chaps_pam_module.o
chaps_pam_module_test_LIBS = $(GMOCK_LIBS)
CXX_BINARY(chaps_pam_module_test): $(chaps_pam_module_test_OBJS)
CXX_BINARY(chaps_pam_module_test): LDLIBS += \
$(chaps_pam_module_test_LIBS)
clean: CLEAN(chaps_pam_module_test)
tests: TEST(CXX_BINARY(chaps_pam_module_test))
endif
import_random: override GTEST_ARGS := \
--gtest_repeat=100 \
--gtest_break_on_failure \
--gtest_filter=RandomizedTests/TestImporterWithModifier.ImportSample/*
import_random: override GTEST_ARGS.qemu.arm := --gtest_filter=-*
import_random: TEST(CXX_BINARY(opencryptoki_importer_test))
more_tests: import_random
# Live Tests
# Note: These tests require a live system with gtest and gmock installed. These
# cannot be run without a real TPM and cannot be run with autotest. These tests
# do not need to be run regularly but may be useful in the future and so have
# been kept around. To run these tests:
# 1) Add the targets to 'all'.
# 2) Add 'dobin' instructions to the ebuild and install on target device.
# 3) On the target system, login as any user and open a shell.
# 4) Run 'sudo tpm_utility_test'.
# 5) Run 'sudo chapsd_test'.
# 6) Run 'chapsd_test --use_dbus'.
chapsd_test_OBJS = $(COMMON_OBJS) chapsd_test.o chaps_proxy.o \
chaps_service_redirect.o
chapsd_test_LIBS = -lgtest -lgflags -ldl
CXX_BINARY(chapsd_test): $(chapsd_test_OBJS) CXX_LIBRARY(libchaps.so)
CXX_BINARY(chapsd_test): LDLIBS += $(chapsd_test_LIBS)
clean: CLEAN(chapsd_test)
tpm_utility_test_OBJS = $(COMMON_OBJS) $(MOCK_OBJS) \
tpm_utility_test.o \
tpm_utility_impl.o
tpm_utility_test_LIBS = $(GMOCK_LIBS) -ltspi
CXX_BINARY(tpm_utility_test): $(tpm_utility_test_OBJS)
CXX_BINARY(tpm_utility_test): LDLIBS += $(tpm_utility_test_LIBS)
clean: CLEAN(tpm_utility_test)