From bbaf47ebb5d4e4f1f43872a4be80136fa3949fcb Mon Sep 17 00:00:00 2001 From: Bartlomiej Grzelewski Date: Mon, 24 Aug 2015 11:39:02 +0200 Subject: [PATCH] Add mockup for security-manager. Security-manager mockup should be used with unit-tests. CKM compilation with mockup: gbs lb -A i586 --define "build_type DEBUG" --define "mockup_sm ON" Note: It's not possible to compile RELEASE version of CKM with mockup. Change-Id: I793ec55010b3826dd9d4157ce4e33f555dee14c0 --- packaging/key-manager.spec | 3 +- src/CMakeLists.txt | 12 ++++- src/manager/main/socket-2-id-mockup.cpp | 86 +++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 src/manager/main/socket-2-id-mockup.cpp diff --git a/packaging/key-manager.spec b/packaging/key-manager.spec index 7329cf3..d39cdbd 100644 --- a/packaging/key-manager.spec +++ b/packaging/key-manager.spec @@ -120,7 +120,8 @@ export LDFLAGS+="-Wl,--rpath=%{_libdir},-Bsymbolic-functions " -DSECURITY_MDFPP_STATE_ENABLE=1 \ %endif -DSYSTEMD_UNIT_DIR=%{_unitdir} \ - -DSYSTEMD_ENV_FILE="/etc/sysconfig/central-key-manager" + -DSYSTEMD_ENV_FILE="/etc/sysconfig/central-key-manager" \ + -DMOCKUP_SM=%{?mockup_sm:%mockup_sm}%{!?mockup_sm:OFF} make %{?jobs:-j%jobs} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2fa3e94..30d56ab 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -16,10 +16,19 @@ FIND_PACKAGE(Threads REQUIRED) SET(KEY_MANAGER_SRC_PATH ${PROJECT_SOURCE_DIR}/src) SET(KEY_MANAGER_PATH ${PROJECT_SOURCE_DIR}/src/manager) +IF (MOCKUP_SM MATCHES "ON") + IF (CMAKE_BUILD_TYPE MATCHES "RELEASE") + MESSAGE(FATAL_ERROR "You cannot compile release version with mockups!") + ENDIF (CMAKE_BUILD_TYPE MATCHES "RELEASE") + MESSAGE("USING MOCKUP INSTEAD SECURITY MANAGER") + SET(SECURITY_MANAGER_PATH ${KEY_MANAGER_PATH}/main/socket-2-id-mockup.cpp) +ELSE (MOCKUP_SM MATCHES "ON") + SET(SECURITY_MANAGER_PATH ${KEY_MANAGER_PATH}/main/socket-2-id.cpp) +ENDIF (MOCKUP_SM MATCHES "ON") + SET(KEY_MANAGER_SOURCES ${KEY_MANAGER_PATH}/main/generic-socket-manager.cpp ${KEY_MANAGER_PATH}/main/socket-manager.cpp - ${KEY_MANAGER_PATH}/main/socket-2-id.cpp ${KEY_MANAGER_PATH}/main/key-manager-main.cpp ${KEY_MANAGER_PATH}/main/smack-check.cpp ${KEY_MANAGER_PATH}/main/thread-service.cpp @@ -58,6 +67,7 @@ SET(KEY_MANAGER_SOURCES ${KEY_MANAGER_PATH}/crypto/platform/decider.cpp ${KEY_MANAGER_PATH}/crypto/tz-backend/key.cpp ${KEY_MANAGER_PATH}/crypto/tz-backend/store.cpp + ${SECURITY_MANAGER_PATH} ) # -fPIE and -pie flag is added for ASLR diff --git a/src/manager/main/socket-2-id-mockup.cpp b/src/manager/main/socket-2-id-mockup.cpp new file mode 100644 index 0000000..d031a02 --- /dev/null +++ b/src/manager/main/socket-2-id-mockup.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +/* + * @file socket-2-id-mockup.cpp + * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com) + * @version 1.0 + */ +#include +#include +#include + +#include + +#include +#include +#include + +namespace CKM { +namespace { + +int getCredentialsFromSocket(int sock, std::string &res) { + std::vector result(1); + socklen_t length = 1; + + if ((0 > getsockopt(sock, SOL_SOCKET, SO_PEERSEC, result.data(), &length)) + && errno != ERANGE) + { + LogError("getsockopt failed"); + return -1; + } + + result.resize(length); + + if (0 > getsockopt(sock, SOL_SOCKET, SO_PEERSEC, result.data(), &length)) { + LogError("getsockopt failed"); + return -1; + } + + result.push_back('\0'); + res = result.data(); + return 0; +} + +int getPkgIdFromSmack(const std::string &smack, std::string &pkgId) { + pkgId = smack; + return 0; +} + +} // namespace anonymous + + +int Socket2Id::translate(int sock, std::string &result) { + std::string smack; + std::string pkgId; + + if (0 > getCredentialsFromSocket(sock, smack)) { + return -1; + } + + if (0 > getPkgIdFromSmack(smack, pkgId)) { + return -1; + } + + result = pkgId; + return 0; +} + +void Socket2Id::resetCache() { + m_stringMap.clear(); +} + +} // namespace CKM + -- 2.7.4