1190978c3Sopenharmony_ci/*
2190978c3Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3190978c3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4190978c3Sopenharmony_ci * you may not use this file except in compliance with the License.
5190978c3Sopenharmony_ci * You may obtain a copy of the License at
6190978c3Sopenharmony_ci *
7190978c3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8190978c3Sopenharmony_ci *
9190978c3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10190978c3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11190978c3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12190978c3Sopenharmony_ci * See the License for the specific language governing permissions and
13190978c3Sopenharmony_ci * limitations under the License.
14190978c3Sopenharmony_ci */
15190978c3Sopenharmony_ci
16190978c3Sopenharmony_ci#include "fuzztest_helper.h"
17190978c3Sopenharmony_ci
18190978c3Sopenharmony_ci#include "accesstoken_kit.h"
19190978c3Sopenharmony_ci#include "nativetoken_kit.h"
20190978c3Sopenharmony_ci#include "token_setproc.h"
21190978c3Sopenharmony_ci
22190978c3Sopenharmony_cinamespace OHOS {
23190978c3Sopenharmony_cinamespace UpdateEngine {
24190978c3Sopenharmony_ciconstexpr uint32_t CHAR_TO_INT_INDEX0 = 0;
25190978c3Sopenharmony_ciconstexpr uint32_t CHAR_TO_INT_INDEX1 = 1;
26190978c3Sopenharmony_ciconstexpr uint32_t CHAR_TO_INT_INDEX2 = 2;
27190978c3Sopenharmony_ciconstexpr uint32_t CHAR_TO_INT_INDEX3 = 3;
28190978c3Sopenharmony_ci
29190978c3Sopenharmony_ciconstexpr uint32_t CHAR_TO_INT_MOVE_LEFT0 = 0;
30190978c3Sopenharmony_ciconstexpr uint32_t CHAR_TO_INT_MOVE_LEFT1 = 8;
31190978c3Sopenharmony_ciconstexpr uint32_t CHAR_TO_INT_MOVE_LEFT2 = 16;
32190978c3Sopenharmony_ciconstexpr uint32_t CHAR_TO_INT_MOVE_LEFT3 = 24;
33190978c3Sopenharmony_ci
34190978c3Sopenharmony_ciconstexpr uint32_t COUNT_BOOL_TYPE = 2;
35190978c3Sopenharmony_ci
36190978c3Sopenharmony_ciconstexpr uint32_t FUZZ_HEAD_DATA = 0;
37190978c3Sopenharmony_ciconstexpr uint32_t FUZZ_INT_LEN_DATA = 4;
38190978c3Sopenharmony_ciconstexpr uint32_t FUZZ_CHAR_ARRAY_LEN_DATA = 64;
39190978c3Sopenharmony_ci
40190978c3Sopenharmony_ciFuzztestHelper::FuzztestHelper()
41190978c3Sopenharmony_ci{
42190978c3Sopenharmony_ci    static const char *perms[] = {
43190978c3Sopenharmony_ci        "ohos.permission.UPDATE_SYSTEM",
44190978c3Sopenharmony_ci        "ohos.permission.FACTORY_RESET"
45190978c3Sopenharmony_ci    };
46190978c3Sopenharmony_ci    NativeTokenInfoParams infoInstance = {
47190978c3Sopenharmony_ci        .dcapsNum = 0,
48190978c3Sopenharmony_ci        .permsNum = 2,
49190978c3Sopenharmony_ci        .aclsNum = 0,
50190978c3Sopenharmony_ci        .dcaps = nullptr,
51190978c3Sopenharmony_ci        .perms = perms,
52190978c3Sopenharmony_ci        .acls = nullptr,
53190978c3Sopenharmony_ci        .processName = "updateservice_fuzztest",
54190978c3Sopenharmony_ci        .aplStr = "system_basic",
55190978c3Sopenharmony_ci    };
56190978c3Sopenharmony_ci    uint64_t tokenId = GetAccessTokenId(&infoInstance);
57190978c3Sopenharmony_ci    if (tokenId == 0) {
58190978c3Sopenharmony_ci        return;
59190978c3Sopenharmony_ci    }
60190978c3Sopenharmony_ci    SetSelfTokenID(tokenId);
61190978c3Sopenharmony_ci    OHOS::Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo();
62190978c3Sopenharmony_ci}
63190978c3Sopenharmony_ci
64190978c3Sopenharmony_ciFuzztestHelper::~FuzztestHelper()
65190978c3Sopenharmony_ci{
66190978c3Sopenharmony_ci}
67190978c3Sopenharmony_ci
68190978c3Sopenharmony_cistatic void FtOnEvent(const EventInfo &eventInfo)
69190978c3Sopenharmony_ci{
70190978c3Sopenharmony_ci}
71190978c3Sopenharmony_ci
72190978c3Sopenharmony_cibool FuzztestHelper::TrySetData(const uint8_t* data, size_t size)
73190978c3Sopenharmony_ci{
74190978c3Sopenharmony_ci    if (size < FUZZ_DATA_LEN) {
75190978c3Sopenharmony_ci        return false;
76190978c3Sopenharmony_ci    }
77190978c3Sopenharmony_ci
78190978c3Sopenharmony_ci    if (memcpy_s(data_, sizeof(data_), data, sizeof(data_)) != EOK) {
79190978c3Sopenharmony_ci        return false;
80190978c3Sopenharmony_ci    }
81190978c3Sopenharmony_ci
82190978c3Sopenharmony_ci    return true;
83190978c3Sopenharmony_ci}
84190978c3Sopenharmony_ci
85190978c3Sopenharmony_ciint32_t FuzztestHelper::GetInt()
86190978c3Sopenharmony_ci{
87190978c3Sopenharmony_ci    int32_t number;
88190978c3Sopenharmony_ci    if (index_ + FUZZ_INT_LEN_DATA > FUZZ_DATA_LEN) {
89190978c3Sopenharmony_ci        index_ = FUZZ_HEAD_DATA;
90190978c3Sopenharmony_ci    }
91190978c3Sopenharmony_ci    number = static_cast<int32_t>(
92190978c3Sopenharmony_ci        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX0]) <<
93190978c3Sopenharmony_ci        CHAR_TO_INT_MOVE_LEFT3) +
94190978c3Sopenharmony_ci        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX1]) <<
95190978c3Sopenharmony_ci        CHAR_TO_INT_MOVE_LEFT2) +
96190978c3Sopenharmony_ci        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX2]) <<
97190978c3Sopenharmony_ci        CHAR_TO_INT_MOVE_LEFT1) +
98190978c3Sopenharmony_ci        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX3]) <<
99190978c3Sopenharmony_ci        CHAR_TO_INT_MOVE_LEFT0));
100190978c3Sopenharmony_ci    index_ += FUZZ_INT_LEN_DATA;
101190978c3Sopenharmony_ci    return number;
102190978c3Sopenharmony_ci}
103190978c3Sopenharmony_ci
104190978c3Sopenharmony_ciBusinessType FuzztestHelper::BuildBusinessType()
105190978c3Sopenharmony_ci{
106190978c3Sopenharmony_ci    BusinessType businessType;
107190978c3Sopenharmony_ci    businessType.vendor = BusinessVendor::PUBLIC;
108190978c3Sopenharmony_ci    businessType.subType = BusinessSubType::FIRMWARE;
109190978c3Sopenharmony_ci    return businessType;
110190978c3Sopenharmony_ci}
111190978c3Sopenharmony_ci
112190978c3Sopenharmony_ciUpdateCallbackInfo FuzztestHelper::BuildUpdateCallbackInfo()
113190978c3Sopenharmony_ci{
114190978c3Sopenharmony_ci    UpdateCallbackInfo cb;
115190978c3Sopenharmony_ci    cb.onEvent = FtOnEvent;
116190978c3Sopenharmony_ci    return cb;
117190978c3Sopenharmony_ci}
118190978c3Sopenharmony_ci
119190978c3Sopenharmony_ciUpgradeInfo FuzztestHelper::BuildUpgradeInfo()
120190978c3Sopenharmony_ci{
121190978c3Sopenharmony_ci    UpgradeInfo upgradeInfo;
122190978c3Sopenharmony_ci    char upgradeApp[FUZZ_CHAR_ARRAY_LEN_DATA];
123190978c3Sopenharmony_ci    GetCharArray(upgradeApp, FUZZ_CHAR_ARRAY_LEN_DATA);
124190978c3Sopenharmony_ci    upgradeInfo.upgradeApp = upgradeApp;
125190978c3Sopenharmony_ci
126190978c3Sopenharmony_ci    upgradeInfo.businessType = BuildBusinessType();
127190978c3Sopenharmony_ci
128190978c3Sopenharmony_ci    char upgradeDevId[FUZZ_CHAR_ARRAY_LEN_DATA];
129190978c3Sopenharmony_ci    GetCharArray(upgradeDevId, FUZZ_CHAR_ARRAY_LEN_DATA);
130190978c3Sopenharmony_ci    upgradeInfo.upgradeDevId = upgradeDevId;
131190978c3Sopenharmony_ci
132190978c3Sopenharmony_ci    char controlDevId[FUZZ_CHAR_ARRAY_LEN_DATA];
133190978c3Sopenharmony_ci    GetCharArray(controlDevId, FUZZ_CHAR_ARRAY_LEN_DATA);
134190978c3Sopenharmony_ci    upgradeInfo.controlDevId = controlDevId;
135190978c3Sopenharmony_ci    return upgradeInfo;
136190978c3Sopenharmony_ci}
137190978c3Sopenharmony_ci
138190978c3Sopenharmony_ciUpgradePolicy FuzztestHelper::BuildUpgradePolicy()
139190978c3Sopenharmony_ci{
140190978c3Sopenharmony_ci    UpgradePolicy upgradePolicy;
141190978c3Sopenharmony_ci    upgradePolicy.downloadStrategy = static_cast<bool>(GetUInt() % COUNT_BOOL_TYPE);
142190978c3Sopenharmony_ci    upgradePolicy.autoUpgradeStrategy = static_cast<bool>(GetUInt() % COUNT_BOOL_TYPE);
143190978c3Sopenharmony_ci    upgradePolicy.autoUpgradePeriods[0].start = GetUInt();
144190978c3Sopenharmony_ci    upgradePolicy.autoUpgradePeriods[0].end = GetUInt();
145190978c3Sopenharmony_ci    upgradePolicy.autoUpgradePeriods[1].start = GetUInt();
146190978c3Sopenharmony_ci    upgradePolicy.autoUpgradePeriods[1].end = GetUInt();
147190978c3Sopenharmony_ci    return upgradePolicy;
148190978c3Sopenharmony_ci}
149190978c3Sopenharmony_ci
150190978c3Sopenharmony_ciVersionDigestInfo FuzztestHelper::BuildVersionDigestInfo()
151190978c3Sopenharmony_ci{
152190978c3Sopenharmony_ci    VersionDigestInfo versionDigestInfo;
153190978c3Sopenharmony_ci    versionDigestInfo.versionDigest = "versionDigest";
154190978c3Sopenharmony_ci    return versionDigestInfo;
155190978c3Sopenharmony_ci}
156190978c3Sopenharmony_ci
157190978c3Sopenharmony_civoid FuzztestHelper::GetCharArray(char *charArray, uint32_t arraySize)
158190978c3Sopenharmony_ci{
159190978c3Sopenharmony_ci    if (index_ + arraySize > FUZZ_DATA_LEN) {
160190978c3Sopenharmony_ci        index_ = FUZZ_HEAD_DATA;
161190978c3Sopenharmony_ci    }
162190978c3Sopenharmony_ci    for (uint32_t i = 0; i < arraySize; i++) {
163190978c3Sopenharmony_ci        charArray[i] = static_cast<char>(data_[i + index_]);
164190978c3Sopenharmony_ci    }
165190978c3Sopenharmony_ci    index_ += arraySize;
166190978c3Sopenharmony_ci}
167190978c3Sopenharmony_ci
168190978c3Sopenharmony_ciuint32_t FuzztestHelper::GetUInt()
169190978c3Sopenharmony_ci{
170190978c3Sopenharmony_ci    uint32_t number;
171190978c3Sopenharmony_ci    if (index_ + FUZZ_INT_LEN_DATA > FUZZ_DATA_LEN) {
172190978c3Sopenharmony_ci        index_ = FUZZ_HEAD_DATA;
173190978c3Sopenharmony_ci    }
174190978c3Sopenharmony_ci    number = (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX0]) <<
175190978c3Sopenharmony_ci        CHAR_TO_INT_MOVE_LEFT3) +
176190978c3Sopenharmony_ci        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX1]) <<
177190978c3Sopenharmony_ci        CHAR_TO_INT_MOVE_LEFT2) +
178190978c3Sopenharmony_ci        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX2]) <<
179190978c3Sopenharmony_ci        CHAR_TO_INT_MOVE_LEFT1) +
180190978c3Sopenharmony_ci        (static_cast<uint32_t>(data_[index_ + CHAR_TO_INT_INDEX3]) <<
181190978c3Sopenharmony_ci        CHAR_TO_INT_MOVE_LEFT0);
182190978c3Sopenharmony_ci    index_ += FUZZ_INT_LEN_DATA;
183190978c3Sopenharmony_ci    return number;
184190978c3Sopenharmony_ci}
185190978c3Sopenharmony_ci} // namespace UpdateEngine
186190978c3Sopenharmony_ci} // namespace OHOS
187