diff --git a/interfaces/innerkits/code_sign_utils/include/code_sign_utils.h b/interfaces/innerkits/code_sign_utils/include/code_sign_utils.h index 334709288c8f72b1ee193a46cb6c00588e3316ee..a63969463b0bc54596d9f70e319011135b281996 100644 --- a/interfaces/innerkits/code_sign_utils/include/code_sign_utils.h +++ b/interfaces/innerkits/code_sign_utils/include/code_sign_utils.h @@ -95,6 +95,7 @@ private: static int32_t IsFsVerityEnabled(int fd); static int32_t EnableCodeSignForFile(const std::string &path, const struct code_sign_enable_arg &arg); static void ShowCodeSignInfo(const std::string &path, const struct code_sign_enable_arg &arg); + static void ExecuteEnableCodeSignTask(const std::string &path, const struct code_sign_enable_arg &arg, int32_t &ret); }; } } diff --git a/interfaces/innerkits/code_sign_utils/src/code_sign_utils.cpp b/interfaces/innerkits/code_sign_utils/src/code_sign_utils.cpp index 2df9cccc83d24ec78a39fd06891015133c56a717..7c6d6d2ce7a4efab53d25054aff8b506ea0b2d9e 100644 --- a/interfaces/innerkits/code_sign_utils/src/code_sign_utils.cpp +++ b/interfaces/innerkits/code_sign_utils/src/code_sign_utils.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,7 @@ #include "log.h" #include "stat_utils.h" #include "signer_info.h" +#include "thread_pool.h" #include "code_sign_block.h" namespace OHOS { @@ -44,6 +46,12 @@ namespace Security { namespace CodeSign { constexpr uint32_t DEFAULT_HASH_ALGORITHEM = FS_VERITY_HASH_ALG_SHA256; constexpr uint32_t HASH_PAGE_SIZE = 4096; +constexpr uint32_t DEFAULT_THREADS_NUM = 8; +constexpr uint32_t CODE_SIGN_PROCESS_SLEEP_TIME_US = 50000;//50ms +static int32_t curAddTaskNum = 0; +static int32_t curRetTaskNum = 0; +static std::mutex mutex_; +static OHOS::ThreadPool enableCodeSignTaskWorker_("EnableCodeSign"); #define NOT_SATISFIED_RETURN(CONDITION, ERROR_CODE, LOG_MESSAGE, ...) do { \ if (!(CONDITION)) { \ @@ -230,6 +238,7 @@ int32_t CodeSignUtils::EnforceCodeSignForAppWithOwnerId(std::string ownerId, con const EntryMap &entryPathMap, FileType type) { int32_t ret; + int32_t taskRet = CS_SUCCESS; std::string realPath; if (!OHOS::PathToRealPath(path, realPath)) { @@ -251,6 +260,14 @@ int32_t CodeSignUtils::EnforceCodeSignForAppWithOwnerId(std::string ownerId, con return ret; } + enableCodeSignTaskWorker_.Start(DEFAULT_THREADS_NUM); + if (enableCodeSignTaskWorker_.GetCurTaskNum() >= 1) { + LOG_ERROR(LABEL, "Has enable code sign task"); + return CS_ERR_TASK; + } + curAddTaskNum = 0; + curRetTaskNum = 0; + do { std::string targetFile; struct code_sign_enable_arg arg = {0}; @@ -259,7 +276,7 @@ int32_t CodeSignUtils::EnforceCodeSignForAppWithOwnerId(std::string ownerId, con ret = CS_SUCCESS; break; } else if (ret != CS_SUCCESS) { - return ret; + break; } if (!ownerId.empty()) { @@ -280,17 +297,50 @@ int32_t CodeSignUtils::EnforceCodeSignForAppWithOwnerId(std::string ownerId, con ShowCodeSignInfo(targetFile, arg); if (!CheckFilePathValid(targetFile, Constants::ENABLE_APP_BASE_PATH)) { - return CS_ERR_TARGET_FILE_PATH; + ret = CS_ERR_TARGET_FILE_PATH; + break; } - ret = EnableCodeSignForFile(targetFile, arg); + ExecuteEnableCodeSignTask(targetFile, arg, taskRet); } while (ret == CS_SUCCESS); - return ret; + + while (taskRet == CS_SUCCESS && curAddTaskNum != curRetTaskNum) { + usleep(CODE_SIGN_PROCESS_SLEEP_TIME_US); + } + + if (curAddTaskNum > 0) { + enableCodeSignTaskWorker_.Stop(); + } + return ret | taskRet; } int32_t CodeSignUtils::EnforceCodeSignForApp(const std::string &path, const EntryMap &entryPathMap, FileType type) { return EnforceCodeSignForAppWithOwnerId("", path, entryPathMap, type); } + +void CodeSignUtils::ExecuteEnableCodeSignTask(const std::string &path, const struct code_sign_enable_arg &arg, + int32_t &ret) +{ + auto enableCodeSignTask = [path, arg, &ret]() { + if (ret != CS_SUCCESS) { + return; + } + + LOG_INFO(LABEL, "ExecuteEnableCodeSignTask task called"); + int32_t enableRet = EnableCodeSignForFile(path, arg); + + { + std::unique_lock lock(mutex_); + ret = ret | enableRet; + } + + LOG_DEBUG(LABEL, "ExecuteEnableCodeSignTask task enableRet:%{public}d, " + "EnforceCodeSignForApp ret:%{public}d ", enableRet, ret); + curRetTaskNum++; + }; + enableCodeSignTaskWorker_.AddTask(enableCodeSignTask); + curAddTaskNum++; +} } } } diff --git a/interfaces/innerkits/common/include/errcode.h b/interfaces/innerkits/common/include/errcode.h index 1145993eb5a8222ab66783924d388fd1201f6eaf..93c0099518a4fb418e78c5074577a034c18612ba 100644 --- a/interfaces/innerkits/common/include/errcode.h +++ b/interfaces/innerkits/common/include/errcode.h @@ -24,7 +24,8 @@ enum CommonErrCode { CS_ERR_MEMORY = -0x1, CS_ERR_NO_PERMISSION = -0x2, CS_ERR_NO_SIGNATURE = -0x3, - CS_ERR_INVALID_SIGNATURE = -0x4 + CS_ERR_INVALID_SIGNATURE = -0x4, + CS_ERR_TASK = -0x5 }; enum FileOperationErrCode { diff --git a/test/unittest/code_sign_utils_test.cpp b/test/unittest/code_sign_utils_test.cpp index 22b191df605d1977055df0f7030d7c013b04c309..17bbb606aeb38ae104307e49cd88b14eedd79bde 100644 --- a/test/unittest/code_sign_utils_test.cpp +++ b/test/unittest/code_sign_utils_test.cpp @@ -118,6 +118,47 @@ static const std::vector g_fileSigEnableFailPath = { TMP_BASE_PATH + "/demo_with_multi_lib/pkcs7_error/file/libentry_07.so.fsv-sig", // Cert chain validate fail }; +static EntryMap g_multiThreadLibFile = { + {"libs/arm64-v8a/libalog.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libalog.so"}, + {"libs/arm64-v8a/libandroidmedia.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libandroidmedia.so"}, + {"libs/arm64-v8a/libAndroidPitayaProxy.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libAndroidPitayaProxy.so"}, + {"libs/arm64-v8a/libanimax.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libanimax.so"}, + {"libs/arm64-v8a/libarcore_sdk_c.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libarcore_sdk_c.so"}, + {"libs/arm64-v8a/libarcore_sdk_jni.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libarcore_sdk_jni.so"}, + {"libs/arm64-v8a/libart_sym.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libart_sym.so"}, + {"libs/arm64-v8a/libaudioeffect.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libaudioeffect.so"}, + {"libs/arm64-v8a/libavmdlbase.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libavmdlbase.so"}, + {"libs/arm64-v8a/libavmdlv2.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libavmdlv2.so"}, + {"libs/arm64-v8a/libbdheif.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdheif.so"}, + {"libs/arm64-v8a/libbdmpg123.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdmpg123.so"}, + {"libs/arm64-v8a/libbdsword.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdsword.so"}, + {"libs/arm64-v8a/libbdvideouploader.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdvideouploader.so"}, + {"libs/arm64-v8a/libbdzstd.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdzstd.so"}, + {"libs/arm64-v8a/libc++_shared.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libc++_shared.so"}, + {"libs/arm64-v8a/libentry.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libentry.so"}, + {"libs/arm64-v8a/libentry2.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libentry2.so"}, + {"libs/arm64-v8a/libavframework.so", + APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libavframework.so"} +}; + // examples of can't find the signature file static const EntryMap g_hapSigNotExist = { {"sigNotExist", APP_BASE_PATH + "/demo_without_lib/demo_without_lib.hap"}, @@ -553,6 +594,20 @@ HWTEST_F(CodeSignUtilsTest, CodeSignUtilsTest_0020, TestSize.Level0) ret = CodeSignUtils::EnforceCodeSignForAppWithOwnerId("INVALID_ID", hapRealPath, entryMap, FILE_SELF); EXPECT_EQ(ret, CS_ERR_INVALID_OWNER_ID); } + +/** + * @tc.name: CodeSignUtilsTest_0021 + * @tc.desc: enable code signature for app + * @tc.type: Func + * @tc.require: + */ +HWTEST_F(CodeSignUtilsTest, CodeSignUtilsTest_0021, TestSize.Level0) +{ + std::string hapRealPath = APP_BASE_PATH + "/multi_thread_demo_with_multi_lib/demo_with_code_sign.hap"; + + int32_t ret = CodeSignUtils::EnforceCodeSignForApp(hapRealPath, g_multiThreadLibFile, FILE_ALL); + EXPECT_EQ(ret, CS_SUCCESS); +} } // namespace CodeSign } // namespace Security } // namespace OHOS diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/demo_with_code_sign.hap b/test/unittest/resources/multi_thread_demo_with_multi_lib/demo_with_code_sign.hap new file mode 100644 index 0000000000000000000000000000000000000000..679e092271cc0f0fbaca9852caec07f9342f1110 Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/demo_with_code_sign.hap differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libAndroidPitayaProxy.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libAndroidPitayaProxy.so new file mode 100644 index 0000000000000000000000000000000000000000..f35ab1852463f0b0c8f0b57ad096e71bfce0ac57 Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libAndroidPitayaProxy.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libalog.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libalog.so new file mode 100644 index 0000000000000000000000000000000000000000..7f3d994effabe9b9a7c58a667860fb645bd1d893 Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libalog.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libandroidmedia.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libandroidmedia.so new file mode 100644 index 0000000000000000000000000000000000000000..80650cbd3c0839f233a8759395667c78dfc095fc Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libandroidmedia.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libanimax.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libanimax.so new file mode 100644 index 0000000000000000000000000000000000000000..f89efec45912b0dec2209587341c5a0aceed662e Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libanimax.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libarcore_sdk_c.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libarcore_sdk_c.so new file mode 100644 index 0000000000000000000000000000000000000000..3100dd3e7727885a1a3a1f4a1c8f15dc9f2b7f97 Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libarcore_sdk_c.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libarcore_sdk_jni.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libarcore_sdk_jni.so new file mode 100644 index 0000000000000000000000000000000000000000..6a87c7f80cdc4a487cce3835db14afdc398d60b1 Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libarcore_sdk_jni.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libart_sym.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libart_sym.so new file mode 100644 index 0000000000000000000000000000000000000000..08beb746ffe0a7a3e0774e1e1c1b2b87d2f97269 Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libart_sym.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libaudioeffect.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libaudioeffect.so new file mode 100644 index 0000000000000000000000000000000000000000..0d60e2e6be05a2fcc034747e38626e479e73ccdf Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libaudioeffect.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libavframework.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libavframework.so new file mode 100644 index 0000000000000000000000000000000000000000..83ce31c0b81f2bb5b61976bc2ec2e1c2912e0f23 Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libavframework.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libavmdlbase.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libavmdlbase.so new file mode 100644 index 0000000000000000000000000000000000000000..7258d76f2cd3528361dbe7dbfe875a0d24d46a0d Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libavmdlbase.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libavmdlv2.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libavmdlv2.so new file mode 100644 index 0000000000000000000000000000000000000000..125ce775d79f96d030eeeecc6f310895534b56fb Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libavmdlv2.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdheif.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdheif.so new file mode 100644 index 0000000000000000000000000000000000000000..0fec2ceac53af8bf5dd089d9f41773c740715375 Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdheif.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdmpg123.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdmpg123.so new file mode 100644 index 0000000000000000000000000000000000000000..e6fefc46710282f7ce1e2c1d2cd506aa6f8a088b Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdmpg123.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdsword.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdsword.so new file mode 100644 index 0000000000000000000000000000000000000000..f4c2fab28d9814f254d13cb997bfa4d27da075fe Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdsword.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdvideouploader.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdvideouploader.so new file mode 100644 index 0000000000000000000000000000000000000000..39ada7f8d59a03d1384496c69a92bf5956f27bce Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdvideouploader.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdzstd.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdzstd.so new file mode 100644 index 0000000000000000000000000000000000000000..fe4084296693cb4bfa7adef40c6bf571a2fb7087 Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libbdzstd.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libc++_shared.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libc++_shared.so new file mode 100644 index 0000000000000000000000000000000000000000..53bdc202eb708d20a0f8c75819043f55384239c4 Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libc++_shared.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libentry.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libentry.so new file mode 100644 index 0000000000000000000000000000000000000000..a9105fced37848a811e768bc622f5f858aa3c6c1 Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libentry.so differ diff --git a/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libentry2.so b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libentry2.so new file mode 100644 index 0000000000000000000000000000000000000000..6f4a0a4034d336e68a6750185fe60facd4d887b4 Binary files /dev/null and b/test/unittest/resources/multi_thread_demo_with_multi_lib/libs/arm64-v8a/libentry2.so differ diff --git a/test/unittest/resources/ohos_test.xml b/test/unittest/resources/ohos_test.xml index 8f0b943b21c56809ec17028617588ed00155e22d..2e03b220cb124221185a6e5fdf88ed362e1a84e0 100644 --- a/test/unittest/resources/ohos_test.xml +++ b/test/unittest/resources/ohos_test.xml @@ -60,6 +60,26 @@