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