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