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