1/*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "fuzztest_helper.h"
17
18#include "accesstoken_kit.h"
19#include "nativetoken_kit.h"
20#include "token_setproc.h"
21
22namespace OHOS {
23namespace UpdateEngine {
24constexpr uint32_t CHAR_TO_INT_INDEX0 = 0;
25constexpr uint32_t CHAR_TO_INT_INDEX1 = 1;
26constexpr uint32_t CHAR_TO_INT_INDEX2 = 2;
27constexpr uint32_t CHAR_TO_INT_INDEX3 = 3;
28
29constexpr uint32_t CHAR_TO_INT_MOVE_LEFT0 = 0;
30constexpr uint32_t CHAR_TO_INT_MOVE_LEFT1 = 8;
31constexpr uint32_t CHAR_TO_INT_MOVE_LEFT2 = 16;
32constexpr uint32_t CHAR_TO_INT_MOVE_LEFT3 = 24;
33
34constexpr uint32_t COUNT_BOOL_TYPE = 2;
35
36constexpr uint32_t FUZZ_HEAD_DATA = 0;
37constexpr uint32_t FUZZ_INT_LEN_DATA = 4;
38constexpr uint32_t FUZZ_CHAR_ARRAY_LEN_DATA = 64;
39
40FuzztestHelper::FuzztestHelper()
41{
42    static const char *perms[] = {
43        "ohos.permission.UPDATE_SYSTEM",
44        "ohos.permission.FACTORY_RESET"
45    };
46    NativeTokenInfoParams infoInstance = {
47        .dcapsNum = 0,
48        .permsNum = 2,
49        .aclsNum = 0,
50        .dcaps = nullptr,
51        .perms = perms,
52        .acls = nullptr,
53        .processName = "updateservice_fuzztest",
54        .aplStr = "system_basic",
55    };
56    uint64_t tokenId = GetAccessTokenId(&infoInstance);
57    if (tokenId == 0) {
58        return;
59    }
60    SetSelfTokenID(tokenId);
61    OHOS::Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo();
62}
63
64FuzztestHelper::~FuzztestHelper()
65{
66}
67
68static void FtOnEvent(const EventInfo &eventInfo)
69{
70}
71
72bool FuzztestHelper::TrySetData(const uint8_t* data, size_t size)
73{
74    if (size < FUZZ_DATA_LEN) {
75        return false;
76    }
77
78    if (memcpy_s(data_, sizeof(data_), data, sizeof(data_)) != EOK) {
79        return false;
80    }
81
82    return true;
83}
84
85int32_t FuzztestHelper::GetInt()
86{
87    int32_t number;
88    if (index_ + FUZZ_INT_LEN_DATA > FUZZ_DATA_LEN) {
89        index_ = FUZZ_HEAD_DATA;
90    }
91    number = static_cast<int32_t>(
92        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX0]) <<
93        CHAR_TO_INT_MOVE_LEFT3) +
94        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX1]) <<
95        CHAR_TO_INT_MOVE_LEFT2) +
96        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX2]) <<
97        CHAR_TO_INT_MOVE_LEFT1) +
98        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX3]) <<
99        CHAR_TO_INT_MOVE_LEFT0));
100    index_ += FUZZ_INT_LEN_DATA;
101    return number;
102}
103
104BusinessType FuzztestHelper::BuildBusinessType()
105{
106    BusinessType businessType;
107    businessType.vendor = BusinessVendor::PUBLIC;
108    businessType.subType = BusinessSubType::FIRMWARE;
109    return businessType;
110}
111
112UpdateCallbackInfo FuzztestHelper::BuildUpdateCallbackInfo()
113{
114    UpdateCallbackInfo cb;
115    cb.onEvent = FtOnEvent;
116    return cb;
117}
118
119UpgradeInfo FuzztestHelper::BuildUpgradeInfo()
120{
121    UpgradeInfo upgradeInfo;
122    char upgradeApp[FUZZ_CHAR_ARRAY_LEN_DATA];
123    GetCharArray(upgradeApp, FUZZ_CHAR_ARRAY_LEN_DATA);
124    upgradeInfo.upgradeApp = upgradeApp;
125
126    upgradeInfo.businessType = BuildBusinessType();
127
128    char upgradeDevId[FUZZ_CHAR_ARRAY_LEN_DATA];
129    GetCharArray(upgradeDevId, FUZZ_CHAR_ARRAY_LEN_DATA);
130    upgradeInfo.upgradeDevId = upgradeDevId;
131
132    char controlDevId[FUZZ_CHAR_ARRAY_LEN_DATA];
133    GetCharArray(controlDevId, FUZZ_CHAR_ARRAY_LEN_DATA);
134    upgradeInfo.controlDevId = controlDevId;
135    return upgradeInfo;
136}
137
138UpgradePolicy FuzztestHelper::BuildUpgradePolicy()
139{
140    UpgradePolicy upgradePolicy;
141    upgradePolicy.downloadStrategy = static_cast<bool>(GetUInt() % COUNT_BOOL_TYPE);
142    upgradePolicy.autoUpgradeStrategy = static_cast<bool>(GetUInt() % COUNT_BOOL_TYPE);
143    upgradePolicy.autoUpgradePeriods[0].start = GetUInt();
144    upgradePolicy.autoUpgradePeriods[0].end = GetUInt();
145    upgradePolicy.autoUpgradePeriods[1].start = GetUInt();
146    upgradePolicy.autoUpgradePeriods[1].end = GetUInt();
147    return upgradePolicy;
148}
149
150VersionDigestInfo FuzztestHelper::BuildVersionDigestInfo()
151{
152    VersionDigestInfo versionDigestInfo;
153    versionDigestInfo.versionDigest = "versionDigest";
154    return versionDigestInfo;
155}
156
157void FuzztestHelper::GetCharArray(char *charArray, uint32_t arraySize)
158{
159    if (index_ + arraySize > FUZZ_DATA_LEN) {
160        index_ = FUZZ_HEAD_DATA;
161    }
162    for (uint32_t i = 0; i < arraySize; i++) {
163        charArray[i] = static_cast<char>(data_[i + index_]);
164    }
165    index_ += arraySize;
166}
167
168uint32_t FuzztestHelper::GetUInt()
169{
170    uint32_t number;
171    if (index_ + FUZZ_INT_LEN_DATA > FUZZ_DATA_LEN) {
172        index_ = FUZZ_HEAD_DATA;
173    }
174    number = (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX0]) <<
175        CHAR_TO_INT_MOVE_LEFT3) +
176        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX1]) <<
177        CHAR_TO_INT_MOVE_LEFT2) +
178        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX2]) <<
179        CHAR_TO_INT_MOVE_LEFT1) +
180        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX3]) <<
181        CHAR_TO_INT_MOVE_LEFT0);
182    index_ += FUZZ_INT_LEN_DATA;
183    return number;
184}
185} // namespace UpdateEngine
186} // namespace OHOS
187