1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2023 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 16094332d3Sopenharmony_ci#include <cerrno> 17094332d3Sopenharmony_ci#include <cstdlib> 18094332d3Sopenharmony_ci#include "securec.h" 19094332d3Sopenharmony_ci#include "v1_1/iwpa_interface.h" 20094332d3Sopenharmony_ci#include "wpa_fuzzer.h" 21094332d3Sopenharmony_ci#include "wpa_common_fuzzer.h" 22094332d3Sopenharmony_ci#include "servmgr_hdi.h" 23094332d3Sopenharmony_ci#include "devmgr_hdi.h" 24094332d3Sopenharmony_ci#include "hdf_remote_service.h" 25094332d3Sopenharmony_ci 26094332d3Sopenharmony_cinamespace OHOS { 27094332d3Sopenharmony_cinamespace WIFI { 28094332d3Sopenharmony_ciconstexpr size_t THRESHOLD = 10; 29094332d3Sopenharmony_ciconst char *g_wpaServiceName = "wpa_interface_service"; 30094332d3Sopenharmony_cistruct IWpaInterface *g_wpaObj = nullptr; 31094332d3Sopenharmony_cistatic struct HDIDeviceManager *g_devMgr = nullptr; 32094332d3Sopenharmony_ci 33094332d3Sopenharmony_civoid FuzzWpaStart(struct IWpaInterface *gWpaObj, uint8_t *tmpRawData) 34094332d3Sopenharmony_ci{ 35094332d3Sopenharmony_ci FuzzWpaInterfaceStart(gWpaObj, tmpRawData); 36094332d3Sopenharmony_ci FuzzWpaInterfaceStop(gWpaObj, tmpRawData); 37094332d3Sopenharmony_ci FuzzWpaInterfaceScan(gWpaObj, tmpRawData); 38094332d3Sopenharmony_ci FuzzWpaInterfaceScanResult(gWpaObj, tmpRawData); 39094332d3Sopenharmony_ci FuzzWpaInterfaceAddNetwork(gWpaObj, tmpRawData); 40094332d3Sopenharmony_ci FuzzWpaInterfaceRemoveNetwork(gWpaObj, tmpRawData); 41094332d3Sopenharmony_ci FuzzWpaInterfaceDisableNetwork(gWpaObj, tmpRawData); 42094332d3Sopenharmony_ci FuzzWpaInterfaceSetNetwork(gWpaObj, tmpRawData); 43094332d3Sopenharmony_ci FuzzWpaInterfaceReconnect(gWpaObj, tmpRawData); 44094332d3Sopenharmony_ci FuzzWpaInterfaceDisconnect(gWpaObj, tmpRawData); 45094332d3Sopenharmony_ci FuzzWpaInterfaceSelectNetwork(gWpaObj, tmpRawData); 46094332d3Sopenharmony_ci FuzzWpaInterfaceEnableNetwork(gWpaObj, tmpRawData); 47094332d3Sopenharmony_ci FuzzWpaInterfaceSetPowerSave(gWpaObj, tmpRawData); 48094332d3Sopenharmony_ci FuzzWpaInterfaceAutoConnect(gWpaObj, tmpRawData); 49094332d3Sopenharmony_ci FuzzWpaInterfaceSaveConfig(gWpaObj, tmpRawData); 50094332d3Sopenharmony_ci FuzzWpaInterfaceWpsCancel(gWpaObj, tmpRawData); 51094332d3Sopenharmony_ci FuzzWpaInterfaceGetCountryCode(gWpaObj, tmpRawData); 52094332d3Sopenharmony_ci FuzzWpaInterfaceGetNetwork(gWpaObj, tmpRawData); 53094332d3Sopenharmony_ci FuzzWpaInterfaceBlocklistClear(gWpaObj, tmpRawData); 54094332d3Sopenharmony_ci FuzzWpaInterfaceSetSuspendMode(gWpaObj, tmpRawData); 55094332d3Sopenharmony_ci FuzzWpaInterfaceGetScanSsid(gWpaObj, tmpRawData); 56094332d3Sopenharmony_ci FuzzWpaInterfaceGetPskPassphrase(gWpaObj, tmpRawData); 57094332d3Sopenharmony_ci FuzzWpaInterfaceGetPsk(gWpaObj, tmpRawData); 58094332d3Sopenharmony_ci FuzzWpaInterfaceGetWepKey(gWpaObj, tmpRawData); 59094332d3Sopenharmony_ci FuzzWpaInterfaceGetWepTxKeyIdx(gWpaObj, tmpRawData); 60094332d3Sopenharmony_ci FuzzWpaInterfaceGetRequirePmf(gWpaObj, tmpRawData); 61094332d3Sopenharmony_ci FuzzWpaInterfaceSetCountryCode(gWpaObj, tmpRawData); 62094332d3Sopenharmony_ci FuzzWpaInterfaceListNetworks(gWpaObj, tmpRawData); 63094332d3Sopenharmony_ci FuzzWpaInterfaceWifiStatus(gWpaObj, tmpRawData); 64094332d3Sopenharmony_ci FuzzWpaInterfaceWpsPbcMode(gWpaObj, tmpRawData); 65094332d3Sopenharmony_ci FuzzWpaInterfaceWpsPinMode(gWpaObj, tmpRawData); 66094332d3Sopenharmony_ci FuzzWpaInterfaceRegisterEventCallback(gWpaObj, tmpRawData); 67094332d3Sopenharmony_ci FuzzWpaInterfaceUnregisterEventCallback(gWpaObj, tmpRawData); 68094332d3Sopenharmony_ci FuzzWpaInterfaceGetConnectionCapabilities(gWpaObj, tmpRawData); 69094332d3Sopenharmony_ci FuzzWpaInterfaceAddWpaIface(gWpaObj, tmpRawData); 70094332d3Sopenharmony_ci FuzzWpaInterfaceRemoveWpaIface(gWpaObj, tmpRawData); 71094332d3Sopenharmony_ci FuzzWpaInterfaceReassociate(gWpaObj, tmpRawData); 72094332d3Sopenharmony_ci FuzzWpaInterfaceStaShellCmd(gWpaObj, tmpRawData); 73094332d3Sopenharmony_ci} 74094332d3Sopenharmony_ci 75094332d3Sopenharmony_civoid FuzzP2pStart(struct IWpaInterface *gWpaObj, uint8_t *tmpRawData) 76094332d3Sopenharmony_ci{ 77094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetSsidPostfixName(gWpaObj, tmpRawData); 78094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetWpsDeviceType(gWpaObj, tmpRawData); 79094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetWpsConfigMethods(gWpaObj, tmpRawData); 80094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetGroupMaxIdle(gWpaObj, tmpRawData); 81094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetWfdEnable(gWpaObj, tmpRawData); 82094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetPersistentReconnect(gWpaObj, tmpRawData); 83094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetWpsSecondaryDeviceType(gWpaObj, tmpRawData); 84094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetupWpsPbc(gWpaObj, tmpRawData); 85094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetupWpsPin(gWpaObj, tmpRawData); 86094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetPowerSave(gWpaObj, tmpRawData); 87094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetDeviceName(gWpaObj, tmpRawData); 88094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetWfdDeviceConfig(gWpaObj, tmpRawData); 89094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetRandomMac(gWpaObj, tmpRawData); 90094332d3Sopenharmony_ci FuzzWpaInterfaceP2pStartFind(gWpaObj, tmpRawData); 91094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetExtListen(gWpaObj, tmpRawData); 92094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetListenChannel(gWpaObj, tmpRawData); 93094332d3Sopenharmony_ci FuzzWpaInterfaceP2pProvisionDiscovery(gWpaObj, tmpRawData); 94094332d3Sopenharmony_ci FuzzWpaInterfaceP2pAddGroup(gWpaObj, tmpRawData); 95094332d3Sopenharmony_ci FuzzWpaInterfaceP2pAddService(gWpaObj, tmpRawData); 96094332d3Sopenharmony_ci FuzzWpaInterfaceP2pRemoveService(gWpaObj, tmpRawData); 97094332d3Sopenharmony_ci FuzzWpaInterfaceP2pStopFind(gWpaObj, tmpRawData); 98094332d3Sopenharmony_ci FuzzWpaInterfaceP2pFlush(gWpaObj, tmpRawData); 99094332d3Sopenharmony_ci FuzzWpaInterfaceP2pFlushService(gWpaObj, tmpRawData); 100094332d3Sopenharmony_ci FuzzWpaInterfaceP2pRemoveNetwork(gWpaObj, tmpRawData); 101094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetGroupConfig(gWpaObj, tmpRawData); 102094332d3Sopenharmony_ci FuzzWpaInterfaceP2pInvite(gWpaObj, tmpRawData); 103094332d3Sopenharmony_ci FuzzWpaInterfaceP2pReinvoke(gWpaObj, tmpRawData); 104094332d3Sopenharmony_ci FuzzWpaInterfaceP2pGetDeviceAddress(gWpaObj, tmpRawData); 105094332d3Sopenharmony_ci FuzzWpaInterfaceP2pReqServiceDiscovery(gWpaObj, tmpRawData); 106094332d3Sopenharmony_ci FuzzWpaInterfaceP2pCancelServiceDiscovery(gWpaObj, tmpRawData); 107094332d3Sopenharmony_ci FuzzWpaInterfaceP2pRespServerDiscovery(gWpaObj, tmpRawData); 108094332d3Sopenharmony_ci FuzzWpaInterfaceP2pConnect(gWpaObj, tmpRawData); 109094332d3Sopenharmony_ci FuzzWpaInterfaceP2pHid2dConnect(gWpaObj, tmpRawData); 110094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSetServDiscExternal(gWpaObj, tmpRawData); 111094332d3Sopenharmony_ci FuzzWpaInterfaceP2pRemoveGroup(gWpaObj, tmpRawData); 112094332d3Sopenharmony_ci FuzzWpaInterfaceP2pCancelConnect(gWpaObj, tmpRawData); 113094332d3Sopenharmony_ci FuzzWpaInterfaceP2pGetGroupConfig(gWpaObj, tmpRawData); 114094332d3Sopenharmony_ci FuzzWpaInterfaceP2pAddNetwork(gWpaObj, tmpRawData); 115094332d3Sopenharmony_ci FuzzWpaInterfaceP2pGetPeer(gWpaObj, tmpRawData); 116094332d3Sopenharmony_ci FuzzWpaInterfaceP2pGetGroupCapability(gWpaObj, tmpRawData); 117094332d3Sopenharmony_ci FuzzWpaInterfaceP2pListNetworks(gWpaObj, tmpRawData); 118094332d3Sopenharmony_ci FuzzWpaInterfaceP2pSaveConfig(gWpaObj, tmpRawData); 119094332d3Sopenharmony_ci} 120094332d3Sopenharmony_ci 121094332d3Sopenharmony_cibool DoSomethingInterestingWithMyAPI(const uint8_t *rawData, size_t size) 122094332d3Sopenharmony_ci{ 123094332d3Sopenharmony_ci bool result = false; 124094332d3Sopenharmony_ci 125094332d3Sopenharmony_ci if (rawData == nullptr || size == 0) { 126094332d3Sopenharmony_ci return false; 127094332d3Sopenharmony_ci } 128094332d3Sopenharmony_ci g_devMgr = HDIDeviceManagerGet(); 129094332d3Sopenharmony_ci if (g_devMgr == nullptr) { 130094332d3Sopenharmony_ci HDF_LOGE("%{public}s : g_wpaObj is null", __FUNCTION__); 131094332d3Sopenharmony_ci return result; 132094332d3Sopenharmony_ci } 133094332d3Sopenharmony_ci int32_t rc = g_devMgr->LoadDevice(g_devMgr, g_wpaServiceName); 134094332d3Sopenharmony_ci if (rc != HDF_SUCCESS) { 135094332d3Sopenharmony_ci HDF_LOGE("%{public}s : g_wpaObj is null", __FUNCTION__); 136094332d3Sopenharmony_ci return result; 137094332d3Sopenharmony_ci } 138094332d3Sopenharmony_ci g_wpaObj = IWpaInterfaceGetInstance(g_wpaServiceName, true); 139094332d3Sopenharmony_ci if (g_wpaObj == nullptr) { 140094332d3Sopenharmony_ci HDF_LOGE("%{public}s : g_wpaObj is null", __FUNCTION__); 141094332d3Sopenharmony_ci return result; 142094332d3Sopenharmony_ci } 143094332d3Sopenharmony_ci uint32_t dataSize = size - OFFSET; 144094332d3Sopenharmony_ci uint8_t *tmpRawData = reinterpret_cast<uint8_t *>(OsalMemCalloc(dataSize + 1)); 145094332d3Sopenharmony_ci if (tmpRawData == nullptr) { 146094332d3Sopenharmony_ci HDF_LOGE("%{public}s : OsalMemCalloc failed!", __FUNCTION__); 147094332d3Sopenharmony_ci return result; 148094332d3Sopenharmony_ci } 149094332d3Sopenharmony_ci if (PreProcessRawData(rawData, size, tmpRawData, dataSize + 1) != true) { 150094332d3Sopenharmony_ci return result; 151094332d3Sopenharmony_ci } 152094332d3Sopenharmony_ci int32_t ret = g_wpaObj->Start(g_wpaObj); 153094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 154094332d3Sopenharmony_ci HDF_LOGE("%{public}s : Start failed!", __FUNCTION__); 155094332d3Sopenharmony_ci OsalMemFree(tmpRawData); 156094332d3Sopenharmony_ci return result; 157094332d3Sopenharmony_ci } 158094332d3Sopenharmony_ci FuzzWpaStart(g_wpaObj, tmpRawData); 159094332d3Sopenharmony_ci FuzzP2pStart(g_wpaObj, tmpRawData); 160094332d3Sopenharmony_ci ret = g_wpaObj->Stop(g_wpaObj); 161094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 162094332d3Sopenharmony_ci HDF_LOGE("%{public}s : Stop failed!", __FUNCTION__); 163094332d3Sopenharmony_ci result = false; 164094332d3Sopenharmony_ci } 165094332d3Sopenharmony_ci IWpaInterfaceReleaseInstance(g_wpaServiceName, g_wpaObj, true); 166094332d3Sopenharmony_ci OsalMemFree(tmpRawData); 167094332d3Sopenharmony_ci g_devMgr->UnloadDevice(g_devMgr, g_wpaServiceName); 168094332d3Sopenharmony_ci g_devMgr = nullptr; 169094332d3Sopenharmony_ci return result; 170094332d3Sopenharmony_ci} 171094332d3Sopenharmony_ci} // namespace WIFI 172094332d3Sopenharmony_ci} // namespace OHOS 173094332d3Sopenharmony_ci 174094332d3Sopenharmony_ci/* Fuzzer entry point */ 175094332d3Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 176094332d3Sopenharmony_ci{ 177094332d3Sopenharmony_ci if (size < OHOS::WIFI::THRESHOLD) { 178094332d3Sopenharmony_ci return 0; 179094332d3Sopenharmony_ci } 180094332d3Sopenharmony_ci 181094332d3Sopenharmony_ci /* Run your code on data */ 182094332d3Sopenharmony_ci OHOS::WIFI::DoSomethingInterestingWithMyAPI(data, size); 183094332d3Sopenharmony_ci return 0; 184094332d3Sopenharmony_ci}