1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci#include "sta_fuzzer.h" 16094332d3Sopenharmony_ci#include "wlan_common_fuzzer.h" 17094332d3Sopenharmony_ci 18094332d3Sopenharmony_cinamespace OHOS { 19094332d3Sopenharmony_cinamespace WIFI { 20094332d3Sopenharmony_ciconstexpr size_t THRESHOLD = 10; 21094332d3Sopenharmony_ciconst char *g_wlanServiceName = "wlan_interface_service"; 22094332d3Sopenharmony_ciconst int32_t wlanType = PROTOCOL_80211_IFTYPE_STATION; 23094332d3Sopenharmony_cistruct IWlanInterface *g_wlanObj = nullptr; 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_cistatic void FuzzStartScan(struct IWlanInterface *interface, const uint8_t *rawData) 26094332d3Sopenharmony_ci{ 27094332d3Sopenharmony_ci struct HdfWifiScan scan = {0}; 28094332d3Sopenharmony_ci struct HdfFeatureInfo feature; 29094332d3Sopenharmony_ci feature.ifName = const_cast<char *>(reinterpret_cast<const char *>(rawData)); 30094332d3Sopenharmony_ci feature.type = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData)); 31094332d3Sopenharmony_ci 32094332d3Sopenharmony_ci interface->StartScan(interface, &feature, &scan); 33094332d3Sopenharmony_ci HDF_LOGI("%{public}s: success", __FUNCTION__); 34094332d3Sopenharmony_ci} 35094332d3Sopenharmony_ci 36094332d3Sopenharmony_cistatic void FuzzSetScanningMacAddress(struct IWlanInterface *interface, const uint8_t *rawData) 37094332d3Sopenharmony_ci{ 38094332d3Sopenharmony_ci struct HdfFeatureInfo feature; 39094332d3Sopenharmony_ci feature.ifName = const_cast<char *>(reinterpret_cast<const char *>(rawData)); 40094332d3Sopenharmony_ci feature.type = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData)); 41094332d3Sopenharmony_ci const uint8_t *scanMac = rawData; 42094332d3Sopenharmony_ci uint32_t macLen = 0; 43094332d3Sopenharmony_ci 44094332d3Sopenharmony_ci if (GetWlanDataSize(&macLen) != HDF_SUCCESS) { 45094332d3Sopenharmony_ci HDF_LOGE("%{public}s: get data size failed!", __FUNCTION__); 46094332d3Sopenharmony_ci } 47094332d3Sopenharmony_ci 48094332d3Sopenharmony_ci interface->SetScanningMacAddress(interface, &feature, scanMac, macLen); 49094332d3Sopenharmony_ci HDF_LOGI("%{public}s: success", __FUNCTION__); 50094332d3Sopenharmony_ci} 51094332d3Sopenharmony_ci 52094332d3Sopenharmony_cistatic FuzzWlanFuncs g_fuzzWlanFuncs[] = { 53094332d3Sopenharmony_ci FuzzStartScan, 54094332d3Sopenharmony_ci FuzzGetChipId, 55094332d3Sopenharmony_ci FuzzGetDeviceMacAddress, 56094332d3Sopenharmony_ci FuzzGetFeatureType, 57094332d3Sopenharmony_ci FuzzGetFreqsWithBand, 58094332d3Sopenharmony_ci FuzzGetNetworkIfaceName, 59094332d3Sopenharmony_ci FuzzSetMacAddress, 60094332d3Sopenharmony_ci FuzzSetTxPower, 61094332d3Sopenharmony_ci FuzzGetPowerMode, 62094332d3Sopenharmony_ci FuzzSetPowerMode, 63094332d3Sopenharmony_ci FuzzGetIfNamesByChipId, 64094332d3Sopenharmony_ci FuzzResetDriver, 65094332d3Sopenharmony_ci FuzzStartChannelMeas, 66094332d3Sopenharmony_ci FuzzSetProjectionScreenParam, 67094332d3Sopenharmony_ci FuzzWifiSendCmdIoctl, 68094332d3Sopenharmony_ci FuzzGetFeatureByIfName, 69094332d3Sopenharmony_ci FuzzGetStaInfo, 70094332d3Sopenharmony_ci FuzzGetChannelMeasResult, 71094332d3Sopenharmony_ci FuzzSetScanningMacAddress, 72094332d3Sopenharmony_ci FuzzResetToFactoryMacAddress, 73094332d3Sopenharmony_ci}; 74094332d3Sopenharmony_ci 75094332d3Sopenharmony_cistatic void FuncToOptimal(struct IWlanInterface *interface, uint32_t cmdId, const uint8_t *data) 76094332d3Sopenharmony_ci{ 77094332d3Sopenharmony_ci FuzzWlanFuncs fuzzWlanFunc = g_fuzzWlanFuncs[cmdId]; 78094332d3Sopenharmony_ci if (fuzzWlanFunc != nullptr) { 79094332d3Sopenharmony_ci fuzzWlanFunc(interface, data); 80094332d3Sopenharmony_ci } 81094332d3Sopenharmony_ci return; 82094332d3Sopenharmony_ci} 83094332d3Sopenharmony_ci 84094332d3Sopenharmony_cibool DoSomethingInterestingWithMyAPI(const uint8_t *rawData, size_t size) 85094332d3Sopenharmony_ci{ 86094332d3Sopenharmony_ci struct HdfFeatureInfo ifeature; 87094332d3Sopenharmony_ci bool result = false; 88094332d3Sopenharmony_ci 89094332d3Sopenharmony_ci if (rawData == nullptr || size == 0) { 90094332d3Sopenharmony_ci return false; 91094332d3Sopenharmony_ci } 92094332d3Sopenharmony_ci 93094332d3Sopenharmony_ci uint32_t cmdId = Convert2Uint32(rawData) % ((sizeof(g_fuzzWlanFuncs) / sizeof(g_fuzzWlanFuncs[0]))); 94094332d3Sopenharmony_ci g_wlanObj = IWlanInterfaceGetInstance(g_wlanServiceName, false); 95094332d3Sopenharmony_ci if (g_wlanObj == nullptr) { 96094332d3Sopenharmony_ci HDF_LOGE("%{public}s: g_wlanObj is null", __FUNCTION__); 97094332d3Sopenharmony_ci return result; 98094332d3Sopenharmony_ci } 99094332d3Sopenharmony_ci uint32_t dataSize = size - OFFSET; 100094332d3Sopenharmony_ci uint8_t *tmpRawData = reinterpret_cast<uint8_t *>(OsalMemCalloc(dataSize + 1)); 101094332d3Sopenharmony_ci if (tmpRawData == nullptr) { 102094332d3Sopenharmony_ci HDF_LOGE("%{public}s: OsalMemCalloc failed!", __FUNCTION__); 103094332d3Sopenharmony_ci return result; 104094332d3Sopenharmony_ci } 105094332d3Sopenharmony_ci int32_t ret = g_wlanObj->Start(g_wlanObj); 106094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 107094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Start failed! ret=%{public}d", __FUNCTION__, ret); 108094332d3Sopenharmony_ci OsalMemFree(tmpRawData); 109094332d3Sopenharmony_ci return result; 110094332d3Sopenharmony_ci } 111094332d3Sopenharmony_ci do { 112094332d3Sopenharmony_ci if (PreProcessRawData(rawData, size, tmpRawData, dataSize + 1) != true) { 113094332d3Sopenharmony_ci break; 114094332d3Sopenharmony_ci } 115094332d3Sopenharmony_ci ret = g_wlanObj->CreateFeature(g_wlanObj, wlanType, &ifeature); 116094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 117094332d3Sopenharmony_ci HDF_LOGE("%{public}s: CreateFeature failed! ret=%{public}d", __FUNCTION__, ret); 118094332d3Sopenharmony_ci break; 119094332d3Sopenharmony_ci } 120094332d3Sopenharmony_ci FuncToOptimal(g_wlanObj, cmdId, tmpRawData); 121094332d3Sopenharmony_ci ret = g_wlanObj->DestroyFeature(g_wlanObj, &ifeature); 122094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 123094332d3Sopenharmony_ci HDF_LOGE("%{public}s: DestroyFeature failed! ret=%{public}d", __FUNCTION__, ret); 124094332d3Sopenharmony_ci break; 125094332d3Sopenharmony_ci } 126094332d3Sopenharmony_ci result = true; 127094332d3Sopenharmony_ci } while (false); 128094332d3Sopenharmony_ci ret = g_wlanObj->Stop(g_wlanObj); 129094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 130094332d3Sopenharmony_ci HDF_LOGE("%{public}s: Stop failed! ret=%{public}d", __FUNCTION__, ret); 131094332d3Sopenharmony_ci result = false; 132094332d3Sopenharmony_ci } 133094332d3Sopenharmony_ci IWlanInterfaceReleaseInstance(g_wlanServiceName, g_wlanObj, false); 134094332d3Sopenharmony_ci OsalMemFree(tmpRawData); 135094332d3Sopenharmony_ci return result; 136094332d3Sopenharmony_ci} 137094332d3Sopenharmony_ci} // namespace WIFI 138094332d3Sopenharmony_ci} // namespace OHOS 139094332d3Sopenharmony_ci 140094332d3Sopenharmony_ci/* Fuzzer entry point */ 141094332d3Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 142094332d3Sopenharmony_ci{ 143094332d3Sopenharmony_ci if (size < OHOS::WIFI::THRESHOLD) { 144094332d3Sopenharmony_ci return 0; 145094332d3Sopenharmony_ci } 146094332d3Sopenharmony_ci 147094332d3Sopenharmony_ci /* Run your code on data */ 148094332d3Sopenharmony_ci OHOS::WIFI::DoSomethingInterestingWithMyAPI(data, size); 149094332d3Sopenharmony_ci return 0; 150094332d3Sopenharmony_ci} 151