diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..cb976edb8c8a4e5da47bbb018333f3ca203ce3ad --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# Test data +*.pem +*.srl +*.csr +*.cert + +# Build file +virtrust/build/* + +.vscode \ No newline at end of file diff --git a/virtrust/.clang-format b/virtrust/.clang-format new file mode 100644 index 0000000000000000000000000000000000000000..47d7cda977375e53968838ba1cbb49fae69884c7 --- /dev/null +++ b/virtrust/.clang-format @@ -0,0 +1,112 @@ +Language: Cpp +BasedOnStyle: Google +AccessModifierOffset: -4 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false +AllowShortEnumsOnASingleLine: false +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: false + SplitEmptyRecord: false + SplitEmptyNamespace: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Custom +BreakBeforeInheritanceComma: false +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 120 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IncludeBlocks: Regroup +IncludeCategories: + - Regex: '^<.*\.h>' + Priority: 1 + - Regex: '^<.*' + Priority: 2 + - Regex: '.*\.pb\.h"$' + Priority: 5 + - Regex: '^"virtrust.*' + Priority: 4 + - Regex: '^".*' + Priority: 3 +IncludeIsMainRegex: '(Test)?$' +IndentCaseLabels: true +IndentPPDirectives: None +IndentWidth: 4 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBlockIndentWidth: 4 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 80 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 80 +PointerAlignment: Right +ReflowComments: true +SortIncludes: true +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: false +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +TabWidth: 4 +UseTab: Never \ No newline at end of file diff --git a/virtrust/CMakeLists.txt b/virtrust/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..2369bff6a2575427a4097e087bf494f487c2dd37 --- /dev/null +++ b/virtrust/CMakeLists.txt @@ -0,0 +1,185 @@ +cmake_minimum_required(VERSION 3.14.1) +project(virtrust CXX C) + +option(BUILD_TEST "Enable/Disable tests" On) +option(USE_MOCK_TSB_AGENT "Use Mocked Tsb Agent (DO NOT USE IN PRODUCTION)" On) + +set(USER_DEPS_DIR + "${PROJECT_SOURCE_DIR}/external" + CACHE + STRING + "Pre-Build Dependency Directory, default to ${PROJECT_SOURCE_DIR}/external" +) + +if(NOT BUILD_TEST AND CMAKE_BUILD_TYPE STREQUAL "Asan") + message( + WARNING + "CMAKE_BUILD_TYPE is Asan but BUILD_TEST has been set to Off, turn on BUILD_TEST automatically." + ) + set(BUILD_TEST On) +endif() + +if(NOT BUILD_TEST AND CMAKE_BUILD_TYPE STREQUAL "Coverage") + message( + WARNING + "CMAKE_BUILD_TYPE is Coverage but BUILD_TEST has been set to Off, turn on BUILD_TEST automatically." + ) + set(BUILD_TEST On) +endif() + +if(NOT BUILD_TEST AND CMAKE_BUILD_TYPE STREQUAL "Fuzz") + message( + WARNING + "CMAKE_BUILD_TYPE is Fuzz but BUILD_TEST has been set to Off, turn on BUILD_TEST automatically." + ) + set(BUILD_TEST On) +endif() + +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE + "Release" + CACHE + STRING + "Choose the type of build, e.g. Debug, Release, Coverage, Asan, Fuzz" + FORCE) + message( + WARNING + "CMAKE_BUILD_TYPE not specified, defaulting to '${CMAKE_BUILD_TYPE}'") +endif() + +if(USE_MOCK_TSB_AGENT) + add_compile_definitions(USE_MOCK_TSB_AGENT) + if(CMAKE_BUILD_TYPE STREQUAL "Release") + message( + WARNING + "USE_MOCK_TSB_AGENT has been set to On while building with Release, please make sure this is intentional." + ) + endif() +endif() + +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set_property(CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE ${PROJECT_BINARY_DIR}) + message( + WARNING + "CMAKE_INSTALL_PREFIX not specified, defaulting to '${PROJECT_BINARY_DIR}'" + ) +endif() + +cmake_policy(GET CMP0097 NEW) + +set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/") +set(CMAKE_EXPORT_COMPILE_COMMANDS On) + +include(GNUInstallDirs) + +set(DEPS_INSTALL_PREFIX_NAME deps) +set(CMAKE_DEPS_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/${DEPS_INSTALL_PREFIX_NAME}) +set(CMAKE_DEPS_INCLUDEDIR + ${CMAKE_DEPS_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}) +set(CMAKE_DEPS_LIBDIR ${CMAKE_DEPS_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) + +set(CMAKE_C_STANDARD 17) +set(CMAKE_CXX_STANDARD 17) + +set(CMAKE_POSITION_INDEPENDENT_CODE On) + +set(CMAKE_CXX_FLAGS_RELEASE "") +set(CMAKE_CXX_FLAGS_DEBUG "") + +include(SetToolchainFlags) +set_toolchain_flags() + +# HACK compiler flags, try remove this in the future +add_compiler_flags(-Wno-missing-field-initializers) # for dllib guestfs +add_compiler_flags(-Wno-unused-parameter) # for tsb interface +add_compiler_flags(-Wno-deprecated-declarations) # rapidjson headers +add_compiler_flags(-Wno-error=pragmas) # rapidjson headers +add_compiler_flags(-Wno-class-memaccess) # rapidjson headers +add_compiler_flags(-Wno-implicit-fallthrough) # rapidjson headers +add_compiler_flags(-Wno-template-body) # rapidjson headers + +get_property( + virtrust_link_options + DIRECTORY + PROPERTY LINK_OPTIONS) + +message(STATUS "=============================================================") +message(STATUS "User Options and Configurations") +message(STATUS "=============================================================") +message(STATUS "CMake Version :${CMAKE_VERSION}") +message(STATUS "Build Type :${CMAKE_BUILD_TYPE}") +message(STATUS "CPU Type :${CMAKE_SYSTEM_PROCESSOR}") +message(STATUS "Compiler :${CMAKE_CXX_COMPILER_ID}") +message(STATUS "Compiler Version :${CMAKE_CXX_COMPILER_VERSION}") +message(STATUS "C Standard :${CMAKE_C_STANDARD}") +message(STATUS "C++ Standard :${CMAKE_CXX_STANDARD}") +message(STATUS "Compiler Flags :\n${CMAKE_CXX_FLAGS}") +message(STATUS "Linker Flags :\n${virtrust_link_options}") +message(STATUS "Exe Linker Flags :\n${CMAKE_EXE_LINKER_FLAGS}") +message(STATUS "CMAKE_INSTALL_PREFIX :${CMAKE_INSTALL_PREFIX}") +message(STATUS "CMAKE_DEPS_SRCDIR :${CMAKE_DEPS_SRCDIR}") +message(STATUS "(opt) BUILD_TEST :${BUILD_TEST}") +message(STATUS "(opt) USE_MOCK_TSB_AGENT :${USE_MOCK_TSB_AGENT}") + +include(FetchContent) +include(ExternalProject) + +set(FETCHCONTENT_BASE_DIR ${CMAKE_DEPS_INSTALL_PREFIX}/src) + +include(ImportLibs) +include(deps/openssl) +#include(deps/libboundscheck) +include(deps/spdlog) +include(deps/gtest) +include(deps/rapidjson) + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY + ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY + ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) +set(CMAKE_INCLUDE_OUTPUT_DIRECTORY + ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIRDIR}) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY + ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}) + +include(AddVirtrustTestIf) + +if(BUILD_TEST) + include(CTest) + enable_testing() + list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure") +endif() + +add_subdirectory(src) + +if(BUILD_TEST) + add_subdirectory(test) +endif() + +if(CMAKE_BUILD_TYPE STREQUAL "Coverage") + find_program(LCOV_PATH lcov) + find_program(GENHTML_PATH genhtml) + if(LCOV_PATH AND GENHTML_PATH) + add_custom_target( + coverage + COMMAND + ${LCOV_PATH} --capture --directory . --exclue "build/*" --exclude + "external/*" --exclude "/usr/*" --output-file coverage.info + --ignore-errors mismatch,inconsistent + COMMAND ${GENHTML_PATH} coverage.info --output-directory + ${CMAKE_BINARY_DIR}/coverage_report --ignore-errors inconsistent + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Generating code coverage report..." + VERBATIM) + else() + add_custom_target( + coverage + COMMAND ${CMAKE_COMMAND} -E echo + "lcov and/or genhtml not found. Generating gcov files instead." + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/gcov_report + COMMAND find src -name "*.gcda" -exec gcov -pb {} + + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Generating gcov coverage report..." + VERBATIM) + endif() +endif() diff --git a/virtrust/build.sh b/virtrust/build.sh new file mode 100755 index 0000000000000000000000000000000000000000..9c707e14ada85bc3a9077d0e9df0bd9eb622f56e --- /dev/null +++ b/virtrust/build.sh @@ -0,0 +1,110 @@ +#!/bin/bash + +# +# Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. +# + +### +### build.sh --- build project +### Usage: +### build.sh [-D] [-C] [-t ] +### Options: +### Build target useby Make +### -h, --help show this help message and exit +### -t || --target Specifying build target, default is `all` +### Support targets: +### cicd_default: build default target + + +# 函数内命令(后台命令) 失败时退出脚本 +#set -o errtrace +# 脚本内命令(前台命令)失败时,立即退出脚本 +#set -o errexit + +build_target='cicd_default' +build_type='Release' +build_asan='Off' +enable_test='On' + +# 获取项目根目录(目前为构建脚本所在目录) +PROJECT_ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +OUTPUT_DIR=${PROJECT_ROOT_DIR}/output + +echo "PROJECT_ROOT_DIR $PROJECT_ROOT_DIR" + +# 日志打印辅助函数 +function log_info() { + if [ $# -lt 1 ]; then + return + fi + + echo "$(date +"%F %T") [INFO] $*" +} + +function help() { + sed -rn 's/^### ?//;T;p;' "$0" +} + +# 解析命令行参数 +function parse_args() { + while [[ $# -gt 0 ]]; do + case "$1" in + -h | --help) + help + exit + ;; + -t | --target) + if [[ $# -gt 1 && "$2" != "-"* ]]; then + build_target="$2" + shift 2 + else + log_info "Error: Argument required after -t||--target." + exit 1 + fi + ;; + *) + [ "$1" != ""] && build_target="$1" + shift + ;; + esac + done +} + + +function build_output() { + log_info "***** start build cmake ${OUTPUT_DIR}*****" + mkdir -p build + pushd build + cmake .. -DCMAKE_BUILD_TYPE=${build_type} \ + -DBUILD_TEST=${enable_test}\ + -DUSE_MOCK_TSB_AGENT=On \ + -DCMAKE_INSTALL_PREFIX=${OUTPUT_DIR}/virtrust \ + make + make install + popd +} + +function build_cmake() { + log_info "***** start build cmake *****" + log_info "building target ${build_target}" + if [[ "${build_target}" == "cicd_default" ]]; then + build_type='Release' + enable_test='Off' + build_output + fi + + local ret=$? + if [[ $ret -ne 0 ]]; then + log_info "***** build cmake failed *****" + echo_failure + exit 1 + fi +} + +echo $(date +"%Y-%m-%d %H-%M"): "$0" "$@" +START_TIME=$(date +%s.%N) + +cd ${PROJECT_ROOT_DIR} + +parse_args "$@" +build_cmake diff --git a/virtrust/cmake/AddVirtrustTestIf.cmake b/virtrust/cmake/AddVirtrustTestIf.cmake new file mode 100644 index 0000000000000000000000000000000000000000..26a3a333e36fcea97546b01205f021de36f721cd --- /dev/null +++ b/virtrust/cmake/AddVirtrustTestIf.cmake @@ -0,0 +1,54 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved. + +macro(add_virtrust_test_if NAME) + if(BUILD_TEST) + add_executable(${NAME} ${NAME}.cpp) + target_link_libraries(${NAME} PRIVATE virtrust-shared Deps::gtest) + add_test(NAME ${NAME} COMMAND ${NAME}) + target_include_directories( + ${NAME} PRIVATE $ + ${CMAKE_DEPS_INCLUDEDIR}) + set_tests_properties( + ${NAME} + PROPERTIES + ENVIRONMENT + "LD_LIBRARY_PATH:${CMAKE_LIBRARY_OUTPUT_DIRECTORY}:$ENV{LD_LIBRARY_PATH}" + ) + endif() +endmacro() + +macro(add_virtrust_sh_test_if NAME) + if(BUILD_TEST) + add_executable(${NAME} ${NAME}.cpp) + target_link_libraries(${NAME} PRIVATE virtrust-sh-obj virtrust-shared + Deps::gtest) + add_test(NAME ${NAME} COMMAND ${NAME}) + target_include_directories( + ${NAME} PRIVATE $ + ${CMAKE_DEPS_INCLUDEDIR}) + set_tests_properties( + ${NAME} + PROPERTIES + ENVIRONMENT + "LD_LIBRARY_PATH:${CMAKE_LIBRARY_OUTPUT_DIRECTORY}:$ENV{LD_LIBRARY_PATH}" + ) + endif() +endmacro() + +macro(add_libvirtrustd_test_if NAME) + if(BUILD_TEST) + add_executable(${NAME} ${NAME}.cpp) + target_link_libraries(${NAME} PRIVATE libvirtrustd-obj virtrust-shared + Deps::gtest) + add_test(NAME ${NAME} COMMAND ${NAME}) + target_include_directories( + ${NAME} PRIVATE $ + ${CMAKE_DEPS_INCLUDEDIR}) + set_tests_properties( + ${NAME} + PROPERTIES + ENVIRONMENT + "LD_LIBRARY_PATH:${CMAKE_LIBRARY_OUTPUT_DIRECTORY}:$ENV{LD_LIBRARY_PATH}" + ) + endif() +endmacro() diff --git a/virtrust/cmake/ImportLibs.cmake b/virtrust/cmake/ImportLibs.cmake new file mode 100644 index 0000000000000000000000000000000000000000..ffa6b695f6a7bf43104b5c46555f34804fde12fa --- /dev/null +++ b/virtrust/cmake/ImportLibs.cmake @@ -0,0 +1,19 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved. + +macro(import_static_lib_from LIBNAME LIB) + add_library(${LIBNAME} STATIC IMPORTED) + set_target_properties( + ${LIBNAME} + PROPERTIES IMPORTED_LOCATION + ${CMAKE_DEPS_LIBDIR}/${LIBNAME}${CMAKE_STATIC_LIBRARY_SUFFIX}) + add_dependencies(${LIBNAME} ${LIB}) +endmacro() + +macro(import_shared_lib_from LIBNAME LIB) + add_library(${LIBNAME} SHARED IMPORTED) + set_target_properties( + ${LIBNAME} + PROPERTIES IMPORTED_LOCATION + ${CMAKE_DEPS_LIBDIR}/${LIBNAME}${CMAKE_SHARED_LIBRARY_SUFFIX}) + add_dependencies(${LIBNAME} ${LIB}) +endmacro() diff --git a/virtrust/cmake/SetToolchainFlags.cmake b/virtrust/cmake/SetToolchainFlags.cmake new file mode 100644 index 0000000000000000000000000000000000000000..6e94258b2be82432d1e3ab275d32452959d650dd --- /dev/null +++ b/virtrust/cmake/SetToolchainFlags.cmake @@ -0,0 +1,147 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved. + +include(CheckCXXCompilerFlag) +include(CheckCompilerFlag) +include(CheckLinkerFlag) + +# CXX Compiler Flags +function(add_compiler_flags flag) + string(FIND "${CMAKE_CXX_FLAGS}" "${flag}" flag_already_set) + if(flag_already_set EQUAL -1) + message(STATUS "Adding CXX compiler flag: ${flag} ...") + check_cxx_compiler_flag("${flag}" flag_supported) + if(flag_supported) + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} ${flag}" + PARENT_SCOPE) + endif() + unset(flag_supported CACHE) + endif() +endfunction() + +# C Compiler Flags +function(add_c_compiler_flags flag) + string(FIND "${CMAKE_CXX_FLAGS}" "${flag}" flag_already_set) + if(flag_already_set EQUAL -1) + message(STATUS "Adding C compiler flag: ${flag} ...") + check_compiler_flag(C "${flag}" flag_supported) + if(flag_supported) + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} ${flag}" + PARENT_SCOPE) + endif() + unset(flag_supported CACHE) + endif() +endfunction() + +# Linker Flags +function(add_linker_flags flag) + get_property( + virtrust_link_options + DIRECTORY + PROPERTY LINK_OPTIONS) + string(FIND "${virtrust_link_options}" "${flag}" flag_already_set) + if(flag_already_set EQUAL -1) + message(STATUS "Adding linker flag: ${flag} ...") + check_linker_flag(CXX "${flag}" flag_supported) + if(flag_supported) + add_link_options(${flag}) + endif() + unset(flag_supported CACHE) + endif() +endfunction() + +# Setup Toolchain + +macro(set_toolchain_flags) + + # do no add runtime path information + set(CMAKE_SKIP_RPATH TRUE) + + # all warnings are treated as errors + add_compiler_flags(-Wall) + add_compiler_flags(-Wextra) + add_compiler_flags(-Werror) + + # compiler flags + add_compiler_flags(-pipe) + add_compiler_flags(-fno-common) + add_compiler_flags(-fstrong-eval-order) + add_compiler_flags(-fms-extensions) + add_compiler_flags(-fno-strict-aliasing) + add_compiler_flags(-freg-struct-return) + + # REVIEW additional warnnings + add_compiler_flags(-Winvalid-pch) + add_compiler_flags(-Wunused) + add_compiler_flags(-Wunused-variable) + add_compiler_flags(-Wunused-value) + add_compiler_flags(-Wcast-align) + add_compiler_flags(-Wcast-equal) + add_compiler_flags(-Wwrite-strings) + add_compiler_flags(-Wdata-time) + add_compiler_flags(-Wstrict-prototypes) + add_compiler_flags(-Wdelete-non-virtual-dtor) + add_compiler_flags(-Wtrampolines) + add_compiler_flags(-Woverloaded-virtual) + + # common linker flags (good-to-have) + add_linker_flags(-Wl, -Bsymbolic) + add_linker_flags(-rdynamic) + add_linker_flags(-Wl, --no-undefined) + + # + if(CMAKE_BUILD_TYPE STREQUAL "Release") + add_compiler_flags(-fstrack-protector-strong) + add_compiler_flags(-fPIC) + add_compiler_flags(-fPIE) + add_compiler_flags(-D_FORTIRY_SOURCE=2) + add_compiler_flags(-O2) + add_compiler_flags(-ftrapv) + + add_linker_flags(-pie) + add_linker_flags(-s) + add_linker_flags(-Wl,-z,relro,-z,now) + add_linker_flags(-Wl,-z,noexecstack) + elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") + add_compiler_flags(-g) + elseif(CMAKE_BUILD_TYPE STREQUAL "Coverage") + add_compiler_flags(-g) + + # HACK it's strange that check_cxx_compiler_flags() function fail to add + # --coverage flag, so we add this manually + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftest-coverage") + + # NOTE the following liner flags only work on executables, which does not + # get included in general linker flags + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov") + elseif(CMAKE_BUILD_TYPE STREQUAL "Asan") + add_compiler_flags(-g) + + # https://cmake.org/pipermail/cmake/2019-October/070180.html + set(_saved_CRT ${CMAKE_REQUIRED_LIBRARIES}) + set(CMAKE_REQUIRED_LIBRARIES "-fsanitize=address;asan") + + add_compiler_flags(-fsanitize=address) + add_compiler_flags(-fsanitize=leak) + add_compiler_flags(-fsanitize=undefined) + add_compiler_flags(-fsanitize=pointer-compare) + add_compiler_flags(-fsanitize=pointer-subtract) + + add_linker_flags(-fno-pie) + add_linker_flags(-fsanitize=address) + add_linker_flags(-fsanitize=leak) + add_linker_flags(-fsanitize=undefined) + add_linker_flags(-fsanitize=pointer-compare) + add_linker_flags(-fsanitize=pointer-subtract) + + set(CMAKE_REQUIRED_LIBRARIES ${_saved_CRT}) + elseif(CMAKE_BUILD_TYPE STREQUAL "Fuzz") + # TODO + add_compiler_flags(-g) + endif() + +endmacro() diff --git a/virtrust/cmake/deps/gtest.cmake b/virtrust/cmake/deps/gtest.cmake new file mode 100644 index 0000000000000000000000000000000000000000..b498723d5dde5bfb4f68de8e54b6c073841cd83d --- /dev/null +++ b/virtrust/cmake/deps/gtest.cmake @@ -0,0 +1,40 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved. + +ExternalProject_Add( + googletest + URL https://github.com/google/googletest/archive/refs/tags/v1.15.2.tar.gz + URL_HASH + SHA256=7b42b4d6ed48810c5362c265a17faebe90dc2373c885e5216439d37927f02926 + CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=On # + -DCMAKE_CXX_STANDARD=17 # + -DCMAKE_C_STANDARD_REQUIRED=Yes # + -DCMAKE_INSTALL_PREFIX=${CMAKE_DEPS_INSTALL_PREFIX} # + -DBUILD_GMOCK=On # + PREFIX ${CMAKE_DEPS_INSTALL_PREFIX} + UPDATE_COMMAND "" + BUILD_BYPRODUCTS ${CMAKE_DEPS_LIBDIR}/libgtest${CMAKE_STATIC_LIBRARY_SUFFIX} + BUILD_BYPRODUCTS + ${CMAKE_DEPS_LIBDIR}/libgtest_main${CMAKE_STATIC_LIBRARY_SUFFIX} + BUILD_BYPRODUCTS ${CMAKE_DEPS_LIBDIR}/libgmock${CMAKE_STATIC_LIBRARY_SUFFIX} + BUILD_BYPRODUCTS + ${CMAKE_DEPS_LIBDIR}/libgmock_main${CMAKE_STATIC_LIBRARY_SUFFIX} + EXCLUDE_FROM_ALL true + DOWNLOAD_EXTRACT_TIMESTAMP On + LOG_DOWNLOAD On + LOG_CONFIGURE On + LOG_BUILD On + LOG_INSTALL On) + +import_static_lib_from(libgtest googletest) +import_static_lib_from(libgtest_main googletest) +import_static_lib_from(libgmock_main googletest) +import_static_lib_from(libgmock googletest) + +target_link_libraries(libgtest_main INTERFACE libgtest) +target_link_libraries(libgmock_main INTERFACE libgmock) + +# ----------------------------- +# Alias Target for External Use +# ----------------------------- +add_library(Deps::gtest ALIAS libgtest_main) +add_library(Deps::gmock ALIAS libgmock_main) diff --git a/virtrust/cmake/deps/libboundscheck.cmake b/virtrust/cmake/deps/libboundscheck.cmake new file mode 100644 index 0000000000000000000000000000000000000000..f9ef7dd71415072f89908e35427f5ba389863202 --- /dev/null +++ b/virtrust/cmake/deps/libboundscheck.cmake @@ -0,0 +1,28 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved. + +ExternalProject_Add( + libboundscheck-src + GIT_REPOSITORY https://github.com/openeuler-mirror/libboundscheck + GIT_TAG master + PREFIX ${CMAKE_DEPS_INSTALL_PREFIX} + CONFIGURE_COMMAND "" + BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} + UPDATE_COMMAND "" + INSTALL_COMMAND mkdir -p ${CMAKE_DEPS_INCLUDEDIR}/securec + COMMAND cp include/securec.h ${CMAKE_DEPS_INCLUDEDIR}/securec + COMMAND cp include/securectype.h ${CMAKE_DEPS_INCLUDEDIR}/securec + COMMAND cp lib/libboundscheck${CMAKE_SHARED_LIBRARY_SUFFIX} + ${CMAKE_DEPS_LIBDIR} + BUILD_IN_SOURCE On + EXCLUDE_FROM_ALL true + LOG_DOWNLOAD On + LOG_CONFIGURE On + LOG_BUILD On + LOG_INSTALL On) + +import_shared_lib_from(libboundscheck libboundscheck-src) + +# ----------------------------- +# Alias Target for External Use +# ----------------------------- +add_library(Deps::secure_c ALIAS libboundscheck) diff --git a/virtrust/cmake/deps/openssl.cmake b/virtrust/cmake/deps/openssl.cmake new file mode 100644 index 0000000000000000000000000000000000000000..30624069b7eafce88bfeb2373204d7dbdedcd033 --- /dev/null +++ b/virtrust/cmake/deps/openssl.cmake @@ -0,0 +1,34 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved. + +ExternalProject_Add( + openssl + PREFIX ${CMAKE_DEPS_INSTALL_PREFIX} + URL https://github.com/openssl/openssl/archive/refs/tags/openssl-3.3.2.tar.gz + URL_HASH + SHA256=bedbb16955555f99b1a7b1ba90fc97879eb41025081be359ecd6a9fcbdf1c8d2 + CONFIGURE_COMMAND + ./Configure no-legacy no-weak-ssl-ciphers no-tests no-shared no-ui-console + no-docs no-apps --banner=Finished --release --libdir=${CMAKE_INSTALL_LIBDIR} + --prefix=${CMAKE_DEPS_INSTALL_PREFIX} -w + BUILD_COMMAND make build_sw + UPDATE_COMMAND "" + INSTALL_COMMAND make install_sw + BUILD_IN_SOURCE On + DOWNLOAD_EXTRACT_TIMESTAMP On + BUILD_BYPRODUCTS ${CMAKE_DEPS_LIBDIR}/libcrypto${CMAKE_STATIC_LIBRARY_SUFFIX} + BUILD_BYPRODUCTS ${CMAKE_DEPS_LIBDIR}/libssl${CMAKE_STATIC_LIBRARY_SUFFIX} + EXCLUDE_FROM_ALL true + LOG_DOWNLOAD On + LOG_CONFIGURE On + LOG_BUILD On + LOG_INSTALL On) + +import_static_lib_from(libcrypto openssl) +import_static_lib_from(libssl openssl) + +target_link_libraries(libssl INTERFACE libcrypto) + +# ----------------------------- +# Alias Target for External Use +# ----------------------------- +add_library(Deps::openssl ALIAS libssl) diff --git a/virtrust/cmake/deps/rapidjson.cmake b/virtrust/cmake/deps/rapidjson.cmake new file mode 100644 index 0000000000000000000000000000000000000000..edb2afee5e7809ae22688f652b43e59dda30a41d --- /dev/null +++ b/virtrust/cmake/deps/rapidjson.cmake @@ -0,0 +1,33 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved. + +# HACK compiler flags +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=pragmas") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-class-memaccess") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-implicit-fallthrough") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-template-body") + +ExternalProject_Add( + rapidjson + URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz + URL_HASH + SHA256=bf7ced29704a1e696fbccf2a2b4ea068e7774fa37f6d7dd4039d0787f8bed98e + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_DEPS_INSTALL_PREFIX} + -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_SKIP_RPATH=TRUE + PREFIX ${CMAKE_DEPS_INSTALL_PREFIX} + UPDATE_COMMAND "" + EXCLUDE_FROM_ALL true + DOWNLOAD_EXTRACT_TIMESTAMP On + LOG_DOWNLOAD On + LOG_CONFIGURE On + LOG_BUILD On + LOG_INSTALL On) + +# NOTE rapidjson is a header-only lib +add_library(librapidjson INTERFACE) +target_include_directories(librapidjson INTERFACE ${CMAKE_DEPS_INCLUDEDIR}) +add_dependencies(librapidjson rapidjson) + +# ----------------------------- +# Alias Target for External Use +# ----------------------------- +add_library(Deps::rapidjson ALIAS librapidjson) diff --git a/virtrust/cmake/deps/spdlog.cmake b/virtrust/cmake/deps/spdlog.cmake new file mode 100644 index 0000000000000000000000000000000000000000..183b87c90a1e06c6e33d0cc14a16a67447facb57 --- /dev/null +++ b/virtrust/cmake/deps/spdlog.cmake @@ -0,0 +1,31 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved. + +# HACK spdlog installs in lib64 +file(MAKE_DIRECTORY ${CMAKE_DEPS_INSTALL_PREFIX}/lib64) + +ExternalProject_Add( + spdlog + URL https://github.com/gabime/spdlog/archive/refs/tags/v1.14.1.tar.gz + URL_HASH + SHA256=1586508029a7d0670dfcb2d97575dcdc242d3868a259742b69f100801ab4e16b + CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=On + -DCMAKE_CXX_STANDARD=17 + -DCMAKE_C_STANDARD_REQUIRED=Yes + -DCMAKE_INSTALL_PREFIX=${CMAKE_DEPS_INSTALL_PREFIX} + -DCMAKE_CPP_FLAGS=-isystem\ ${CMAKE_DEPS_INCLUDEDIR} + PREFIX ${CMAKE_DEPS_INSTALL_PREFIX} + UPDATE_COMMAND "" + EXCLUDE_FROM_ALL true + DOWNLOAD_EXTRACT_TIMESTAMP On + BUILD_BYPRODUCTS ${CMAKE_DEPS_LIBDIR}/libspdlog${CMAKE_STATIC_LIBRARY_SUFFIX} + LOG_DOWNLOAD On + LOG_CONFIGURE On + LOG_BUILD On + LOG_INSTALL On) + +import_static_lib_from(libspdlog spdlog) + +# ----------------------------- +# Alias Target for External Use +# ----------------------------- +add_library(Deps::spdlog ALIAS libspdlog) diff --git a/virtrust/format-all.sh b/virtrust/format-all.sh new file mode 100755 index 0000000000000000000000000000000000000000..bfcbc17c1eddc58d26e1bb39f5185288bcba4524 --- /dev/null +++ b/virtrust/format-all.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Check if clang-format exists +if ! command -v clang-format &> /dev/null; then + echo "clang-format not found" + exit 1 +fi + +# Check if cmake-format exists +if ! command -v cmake-format &> /dev/null; then + echo "cmake-format not found" + exit 1 +fi + +# format c/c++ code +find . -name "*.cpp" -o -name "*.hpp" -o -name "*.h" | xargs clang-format -i + +# format cmake code +find . -name "CMakeLists.txt" -exec cmake-format -i {} \; diff --git a/virtrust/src/CMakeLists.txt b/virtrust/src/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..85d0ce2afb4191381c37bcf8782c50a920eaa3e0 --- /dev/null +++ b/virtrust/src/CMakeLists.txt @@ -0,0 +1,13 @@ +# Copyright (C) 2025 by Huawei Technologies Co., Ltd. All rights reserved. + +# api +add_subdirectory(virtrust) + +# cli +add_subdirectory(virtrust-sh) + +# daemon +add_subdirectory(libvirtrustd) + +# mock +add_subdirectory(mock) diff --git a/virtrust/src/libvirtrustd/CMakeLists.txt b/virtrust/src/libvirtrustd/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..5d3c4f408bb770e2dd26bf420039844c85fa6336 --- /dev/null +++ b/virtrust/src/libvirtrustd/CMakeLists.txt @@ -0,0 +1,11 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved. + +# executable +add_executable(libvirtrustd ${CMAKE_CURRENT_LIST_DIR}/main.cpp + ${CMAKE_CURRENT_LIST_DIR}/utils.cpp) + +target_include_directories( + libvirtrustd PRIVATE ${CMAKE_DEPS_INCLUDEDIR} + $) + +target_link_libraries(libvirtrustd PRIVATE virtrust-shared Deps::rapidjson) diff --git a/virtrust/src/libvirtrustd/defines.h b/virtrust/src/libvirtrustd/defines.h new file mode 100644 index 0000000000000000000000000000000000000000..e2ad8a8718fcf62636dfd1909da4271d9eb81abc --- /dev/null +++ b/virtrust/src/libvirtrustd/defines.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved. + */ + +#pragma once + +#include +#include +#include + +namespace virtrust { +// version +constexpr std::string_view LIBVIRTRUSTD_VERSION = "1.0.0"; + +// default values +constexpr std::string_view LIBVIRTRUSTD_SERVER_ADDR = "127.0.0.1"; +constexpr std::string_view LIBVIRTRUSTD_SERVER_ADDR_MASK = "127.0.0.1/8"; +constexpr std::string_view LIBVIRTRUSTD_CA_PATH = "ca-cert.pem"; +constexpr std::string_view LIBVIRTRUSTD_CERT_PATH = "server-cert.pem"; +constexpr std::string_view LIBVIRTRUSTD_SK_PATH = "server-sk.pem"; +constexpr uint16_t LIBVIRTRUSTD_SERVER_PORT = 10086; + +} // namespace virtrust diff --git a/virtrust/src/libvirtrustd/main.cpp b/virtrust/src/libvirtrustd/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..17f70074f62f3280b28082b33296823d4f0d471b --- /dev/null +++ b/virtrust/src/libvirtrustd/main.cpp @@ -0,0 +1,126 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved. + */ + +#include +#include + +#include +#include +#include + +#include "libvirtrustd/defines.h" +#include "libvirtrustd/utils.h" +#include "spdlog/fmt/bundled/core.h" + +#include "virtrust/base/logger.h" + +namespace virtrust { +namespace { +volatile sig_atomic_t g_stopFlag = 0; + +void SignalHandler(int signum) +{ + VIRTRUST_LOG_INFO("Received signal: {}", signum); + if (signum == SIGPIPE) { + VIRTRUST_LOG_INFO("SIGPIPE signal received, ignored."); + + return; + } + g_stopFlag = 1; +} + +void PrintVersion(std::string_view progname) +{ + fmt::print("{} version: {}\n", progname, LIBVIRTRUSTD_VERSION); +} + +void PrintUsage(std::string_view progname) +{ + fmt::print("\n" + " USAGE:\n" + " {} [options]\n" + "\n" + " REQUIRED ARGS:\n" + " --config path to config file\n" + "\n" + " OPTIONS:\n" + " --help print this help\n" + " --version show version\n" + "\n", + progname); +} + +int ProcessArgs(int argc, char **argv) +{ + int arg = -1; + int longindex = -1; + std::vector