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}