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
22 namespace OHOS {
23 namespace UpdateEngine {
24 constexpr uint32_t CHAR_TO_INT_INDEX0 = 0;
25 constexpr uint32_t CHAR_TO_INT_INDEX1 = 1;
26 constexpr uint32_t CHAR_TO_INT_INDEX2 = 2;
27 constexpr uint32_t CHAR_TO_INT_INDEX3 = 3;
28
29 constexpr uint32_t CHAR_TO_INT_MOVE_LEFT0 = 0;
30 constexpr uint32_t CHAR_TO_INT_MOVE_LEFT1 = 8;
31 constexpr uint32_t CHAR_TO_INT_MOVE_LEFT2 = 16;
32 constexpr uint32_t CHAR_TO_INT_MOVE_LEFT3 = 24;
33
34 constexpr uint32_t COUNT_BOOL_TYPE = 2;
35
36 constexpr uint32_t FUZZ_HEAD_DATA = 0;
37 constexpr uint32_t FUZZ_INT_LEN_DATA = 4;
38 constexpr uint32_t FUZZ_CHAR_ARRAY_LEN_DATA = 64;
39
FuzztestHelper()40 FuzztestHelper::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
~FuzztestHelper()64 FuzztestHelper::~FuzztestHelper()
65 {
66 }
67
FtOnEvent(const EventInfo & eventInfo)68 static void FtOnEvent(const EventInfo &eventInfo)
69 {
70 }
71
TrySetData(const uint8_t * data,size_t size)72 bool 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
GetInt()85 int32_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
BuildBusinessType()104 BusinessType FuzztestHelper::BuildBusinessType()
105 {
106 BusinessType businessType;
107 businessType.vendor = BusinessVendor::PUBLIC;
108 businessType.subType = BusinessSubType::FIRMWARE;
109 return businessType;
110 }
111
BuildUpdateCallbackInfo()112 UpdateCallbackInfo FuzztestHelper::BuildUpdateCallbackInfo()
113 {
114 UpdateCallbackInfo cb;
115 cb.onEvent = FtOnEvent;
116 return cb;
117 }
118
BuildUpgradeInfo()119 UpgradeInfo 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
BuildUpgradePolicy()138 UpgradePolicy 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
BuildVersionDigestInfo()150 VersionDigestInfo FuzztestHelper::BuildVersionDigestInfo()
151 {
152 VersionDigestInfo versionDigestInfo;
153 versionDigestInfo.versionDigest = "versionDigest";
154 return versionDigestInfo;
155 }
156
GetCharArray(char * charArray,uint32_t arraySize)157 void 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
GetUInt()168 uint32_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