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