1d9f0492fSopenharmony_ci/* 2d9f0492fSopenharmony_ci* Copyright (c) 2024 Huawei Device Co., Ltd. 3d9f0492fSopenharmony_ci* Licensed under the Apache License, Version 2.0 (the "License"); 4d9f0492fSopenharmony_ci* you may not use this file except in compliance with the License. 5d9f0492fSopenharmony_ci* You may obtain a copy of the License at 6d9f0492fSopenharmony_ci* 7d9f0492fSopenharmony_ci* http://www.apache.org/licenses/LICENSE-2.0 8d9f0492fSopenharmony_ci* 9d9f0492fSopenharmony_ci* Unless required by applicable law or agreed to in writing, software 10d9f0492fSopenharmony_ci* distributed under the License is distributed on an "AS IS" BASIS, 11d9f0492fSopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d9f0492fSopenharmony_ci* See the License for the specific language governing permissions and 13d9f0492fSopenharmony_ci* limitations under the License. 14d9f0492fSopenharmony_ci*/ 15d9f0492fSopenharmony_ci 16d9f0492fSopenharmony_ci#include <cstdlib> 17d9f0492fSopenharmony_ci#include <gtest/gtest.h> 18d9f0492fSopenharmony_ci#include "fs_hvb.h" 19d9f0492fSopenharmony_ci#include "init_utils.h" 20d9f0492fSopenharmony_ci#include "securec.h" 21d9f0492fSopenharmony_ci 22d9f0492fSopenharmony_ciusing namespace std; 23d9f0492fSopenharmony_ciusing namespace testing::ext; 24d9f0492fSopenharmony_ci 25d9f0492fSopenharmony_cinamespace init_ut { 26d9f0492fSopenharmony_ciclass FsHvbUnitTest : public testing::Test { 27d9f0492fSopenharmony_cipublic: 28d9f0492fSopenharmony_ci static void SetUpTestCase(void) {}; 29d9f0492fSopenharmony_ci static void TearDownTestCase(void) {}; 30d9f0492fSopenharmony_ci void SetUp(void) {}; 31d9f0492fSopenharmony_ci void TearDown(void) {}; 32d9f0492fSopenharmony_ci}; 33d9f0492fSopenharmony_ci 34d9f0492fSopenharmony_civoid CreateTestFile(const char *fileName, const char *data) 35d9f0492fSopenharmony_ci{ 36d9f0492fSopenharmony_ci CheckAndCreateDir(fileName); 37d9f0492fSopenharmony_ci printf("PrepareParamTestData for %s\n", fileName); 38d9f0492fSopenharmony_ci FILE *tmpFile = fopen(fileName, "a+"); 39d9f0492fSopenharmony_ci if (tmpFile != nullptr) { 40d9f0492fSopenharmony_ci fprintf(tmpFile, "%s", data); 41d9f0492fSopenharmony_ci (void)fflush(tmpFile); 42d9f0492fSopenharmony_ci fclose(tmpFile); 43d9f0492fSopenharmony_ci } 44d9f0492fSopenharmony_ci} 45d9f0492fSopenharmony_ci 46d9f0492fSopenharmony_ciHWTEST_F(FsHvbUnitTest, Init_FsHvbInit_001, TestSize.Level0) 47d9f0492fSopenharmony_ci{ 48d9f0492fSopenharmony_ci const char *cmdLine; 49d9f0492fSopenharmony_ci int ret = FsHvbInit(); 50d9f0492fSopenharmony_ci EXPECT_EQ(ret, HVB_ERROR_INVALID_ARGUMENT); 51d9f0492fSopenharmony_ci 52d9f0492fSopenharmony_ci setenv("VERIFY_VALUE", "PartFail", 1); 53d9f0492fSopenharmony_ci ret = FsHvbInit(); 54d9f0492fSopenharmony_ci EXPECT_EQ(ret, HVB_ERROR_UNSUPPORTED_VERSION); 55d9f0492fSopenharmony_ci 56d9f0492fSopenharmony_ci setenv("VERIFY_VALUE", "Succeed", 1); 57d9f0492fSopenharmony_ci ret = FsHvbInit(); 58d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 59d9f0492fSopenharmony_ci 60d9f0492fSopenharmony_ci cmdLine = "ohos.boot.hvb.hash_algo=test "; // HVB_CMDLINE_HASH_ALG 61d9f0492fSopenharmony_ci CreateTestFile(BOOT_CMD_LINE, cmdLine); 62d9f0492fSopenharmony_ci ret = FsHvbInit(); 63d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 64d9f0492fSopenharmony_ci 65d9f0492fSopenharmony_ci cmdLine = "ohos.boot.hvb.digest=1 "; // HVB_CMDLINE_CERT_DIGEST 66d9f0492fSopenharmony_ci CreateTestFile(BOOT_CMD_LINE, cmdLine); 67d9f0492fSopenharmony_ci ret = FsHvbInit(); 68d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 69d9f0492fSopenharmony_ci remove(BOOT_CMD_LINE); 70d9f0492fSopenharmony_ci 71d9f0492fSopenharmony_ci cmdLine = "ohos.boot.hvb.hash_algo=test "; 72d9f0492fSopenharmony_ci CreateTestFile(BOOT_CMD_LINE, cmdLine); 73d9f0492fSopenharmony_ci cmdLine = "ohos.boot.hvb.digest=1234 "; 74d9f0492fSopenharmony_ci CreateTestFile(BOOT_CMD_LINE, cmdLine); 75d9f0492fSopenharmony_ci ret = FsHvbInit(); 76d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 77d9f0492fSopenharmony_ci remove(BOOT_CMD_LINE); 78d9f0492fSopenharmony_ci 79d9f0492fSopenharmony_ci setenv("HASH_VALUE", "InitFail", 1); 80d9f0492fSopenharmony_ci cmdLine = "ohos.boot.hvb.hash_algo=sha256 "; 81d9f0492fSopenharmony_ci CreateTestFile(BOOT_CMD_LINE, cmdLine); 82d9f0492fSopenharmony_ci cmdLine = "ohos.boot.hvb.digest=12 "; 83d9f0492fSopenharmony_ci CreateTestFile(BOOT_CMD_LINE, cmdLine); 84d9f0492fSopenharmony_ci ret = FsHvbInit(); 85d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 86d9f0492fSopenharmony_ci 87d9f0492fSopenharmony_ci setenv("HASH_VALUE", "UpdateFail", 1); 88d9f0492fSopenharmony_ci ret = FsHvbInit(); 89d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 90d9f0492fSopenharmony_ci 91d9f0492fSopenharmony_ci setenv("HASH_VALUE", "FinalFail", 1); 92d9f0492fSopenharmony_ci ret = FsHvbInit(); 93d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 94d9f0492fSopenharmony_ci 95d9f0492fSopenharmony_ci setenv("HASH_VALUE", "AllSucceed", 1); 96d9f0492fSopenharmony_ci ret = FsHvbInit(); 97d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 98d9f0492fSopenharmony_ci 99d9f0492fSopenharmony_ci remove(BOOT_CMD_LINE); 100d9f0492fSopenharmony_ci unsetenv("VERIFY_VALUE"); 101d9f0492fSopenharmony_ci unsetenv("HASH_VALUE"); 102d9f0492fSopenharmony_ci} 103d9f0492fSopenharmony_ci 104d9f0492fSopenharmony_ciHWTEST_F(FsHvbUnitTest, Init_FsHvbSetupHashtree_001, TestSize.Level0) 105d9f0492fSopenharmony_ci{ 106d9f0492fSopenharmony_ci FstabItem fsItem; 107d9f0492fSopenharmony_ci 108d9f0492fSopenharmony_ci int ret = FsHvbSetupHashtree(nullptr); 109d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 110d9f0492fSopenharmony_ci 111d9f0492fSopenharmony_ci ret = FsHvbSetupHashtree(&fsItem); 112d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 113d9f0492fSopenharmony_ci} 114d9f0492fSopenharmony_ci 115d9f0492fSopenharmony_ciHWTEST_F(FsHvbUnitTest, Init_FsHvbFinal_001, TestSize.Level0) 116d9f0492fSopenharmony_ci{ 117d9f0492fSopenharmony_ci int ret = FsHvbFinal(); 118d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 119d9f0492fSopenharmony_ci} 120d9f0492fSopenharmony_ci 121d9f0492fSopenharmony_ciHWTEST_F(FsHvbUnitTest, Init_FsHvbGetValueFromCmdLine_001, TestSize.Level0) 122d9f0492fSopenharmony_ci{ 123d9f0492fSopenharmony_ci const char *cmdLine; 124d9f0492fSopenharmony_ci char hashAlg[32] = { 0 }; 125d9f0492fSopenharmony_ci 126d9f0492fSopenharmony_ci int ret = FsHvbGetValueFromCmdLine(nullptr, sizeof(hashAlg), "ohos.boot.hvb.hash_algo"); 127d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 128d9f0492fSopenharmony_ci ret = FsHvbGetValueFromCmdLine(&hashAlg[0], sizeof(hashAlg), nullptr); 129d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 130d9f0492fSopenharmony_ci 131d9f0492fSopenharmony_ci cmdLine = "ohos.boot.hvb.hash_algo=sha256 "; 132d9f0492fSopenharmony_ci CreateTestFile(BOOT_CMD_LINE, cmdLine); 133d9f0492fSopenharmony_ci ret = FsHvbGetValueFromCmdLine(&hashAlg[0], sizeof(hashAlg), "ohos.boot.hvb.hash_algo"); 134d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 135d9f0492fSopenharmony_ci EXPECT_EQ(strcmp(hashAlg, "sha256"), 0); 136d9f0492fSopenharmony_ci 137d9f0492fSopenharmony_ci remove(BOOT_CMD_LINE); 138d9f0492fSopenharmony_ci} 139d9f0492fSopenharmony_ci 140d9f0492fSopenharmony_ciHWTEST_F(FsHvbUnitTest, Init_FsHvbConstructVerityTarget_001, TestSize.Level0) 141d9f0492fSopenharmony_ci{ 142d9f0492fSopenharmony_ci DmVerityTarget target; 143d9f0492fSopenharmony_ci const char *devName = "test"; 144d9f0492fSopenharmony_ci struct hvb_cert cert; 145d9f0492fSopenharmony_ci 146d9f0492fSopenharmony_ci int ret = FsHvbConstructVerityTarget(nullptr, devName, &cert); 147d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 148d9f0492fSopenharmony_ci ret = FsHvbConstructVerityTarget(&target, nullptr, &cert); 149d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 150d9f0492fSopenharmony_ci ret = FsHvbConstructVerityTarget(&target, devName, nullptr); 151d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 152d9f0492fSopenharmony_ci 153d9f0492fSopenharmony_ci cert.image_len = 512; 154d9f0492fSopenharmony_ci cert.data_block_size = 0; 155d9f0492fSopenharmony_ci ret = FsHvbConstructVerityTarget(&target, devName, &cert); 156d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 157d9f0492fSopenharmony_ci cert.data_block_size = 8; 158d9f0492fSopenharmony_ci cert.hash_block_size = 0; 159d9f0492fSopenharmony_ci ret = FsHvbConstructVerityTarget(&target, devName, &cert); 160d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 161d9f0492fSopenharmony_ci 162d9f0492fSopenharmony_ci cert.hash_block_size = 8; 163d9f0492fSopenharmony_ci cert.hashtree_offset = 16; 164d9f0492fSopenharmony_ci cert.hash_algo = 2; 165d9f0492fSopenharmony_ci ret = FsHvbConstructVerityTarget(&target, devName, &cert); 166d9f0492fSopenharmony_ci EXPECT_EQ(ret, -1); 167d9f0492fSopenharmony_ci 168d9f0492fSopenharmony_ci cert.hash_algo = 0; 169d9f0492fSopenharmony_ci cert.hash_payload.digest = (uint8_t *)"5"; 170d9f0492fSopenharmony_ci cert.digest_size = 1; 171d9f0492fSopenharmony_ci cert.hash_payload.salt = (uint8_t *)"7"; 172d9f0492fSopenharmony_ci cert.salt_size = 1; 173d9f0492fSopenharmony_ci cert.fec_size = 1; 174d9f0492fSopenharmony_ci cert.fec_num_roots = 1; 175d9f0492fSopenharmony_ci cert.fec_offset = 8; 176d9f0492fSopenharmony_ci ret = FsHvbConstructVerityTarget(&target, devName, &cert); 177d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 178d9f0492fSopenharmony_ci 179d9f0492fSopenharmony_ci cert.hash_algo = 1; 180d9f0492fSopenharmony_ci ret = FsHvbConstructVerityTarget(&target, devName, &cert); 181d9f0492fSopenharmony_ci EXPECT_EQ(ret, 0); 182d9f0492fSopenharmony_ci} 183d9f0492fSopenharmony_ci 184d9f0492fSopenharmony_ciHWTEST_F(FsHvbUnitTest, Init_FsHvbDestoryVerityTarget_001, TestSize.Level0) 185d9f0492fSopenharmony_ci{ 186d9f0492fSopenharmony_ci DmVerityTarget target; 187d9f0492fSopenharmony_ci 188d9f0492fSopenharmony_ci target.paras = (char *)calloc(1, 10); 189d9f0492fSopenharmony_ci FsHvbDestoryVerityTarget(&target); 190d9f0492fSopenharmony_ci} 191d9f0492fSopenharmony_ci}