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}