1  /*
2   * Copyright (c) 2023 Huawei Device Co., Ltd.
3   * Licensed under the Apache License, Version 2.0 (the "License");
4   * you may not use this file except in compliance with the License.
5   * You may obtain a copy of the License at
6   *
7   *     http://www.apache.org/licenses/LICENSE-2.0
8   *
9   * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  #include "hostapd_common_fuzzer.h"
16  
17  #define WLAN_FREQ_MAX_NUM 35
18  #define ETH_ADDR_LEN 6
19  #define BITS_NUM_24 24
20  #define BITS_NUM_16 16
21  #define BITS_NUM_8 8
22  #define BUFFSIZE_REQUEST 4096
23  
24  static uint32_t g_wpaTestSize = 0;
25  struct IHostapdCallback *g_hostapdCallbackObj = nullptr;
26  
SetWpaDataSize(const uint32_t * dataSize)27  uint32_t SetWpaDataSize(const uint32_t *dataSize)
28  {
29      if (dataSize != nullptr) {
30          g_wpaTestSize = *dataSize;
31          return HDF_SUCCESS;
32      }
33      HDF_LOGE("%{public}s: set data size failed!", __FUNCTION__);
34      return HDF_FAILURE;
35  }
36  
GetWpaDataSize(uint32_t * dataSize)37  uint32_t GetWpaDataSize(uint32_t *dataSize)
38  {
39      if (dataSize != nullptr) {
40          *dataSize = g_wpaTestSize;
41          return HDF_SUCCESS;
42      }
43      HDF_LOGE("%{public}s: get data size failed!", __FUNCTION__);
44      return HDF_FAILURE;
45  }
46  
Convert2Uint32(const uint8_t * ptr)47  uint32_t Convert2Uint32(const uint8_t *ptr)
48  {
49      if (ptr == nullptr) {
50          return 0;
51      }
52      /*
53       * Move the 0th digit 24 to the left, the first digit 16 to the left, the second digit 8 to the left,
54       * and the third digit no left
55       */
56      return (ptr[0] << BITS_NUM_24) | (ptr[1] << BITS_NUM_16) | (ptr[2] << BITS_NUM_8) | (ptr[3]);
57  }
58  
PreProcessRawData(const uint8_t * rawData,size_t size,uint8_t * tmpRawData,size_t tmpRawDataSize)59  bool PreProcessRawData(const uint8_t *rawData, size_t size, uint8_t *tmpRawData, size_t tmpRawDataSize)
60  {
61      if (rawData == nullptr || tmpRawData == nullptr) {
62          HDF_LOGE("%{public}s: rawData or tmpRawData is nullptr!", __FUNCTION__);
63          return false;
64      }
65      uint32_t dataSize = size - OFFSET;
66      if (memcpy_s(tmpRawData, tmpRawDataSize, rawData + OFFSET, dataSize) != EOK) {
67          HDF_LOGE("%{public}s: memcpy_s failed!", __FUNCTION__);
68          return false;
69      }
70      if (SetWpaDataSize(&dataSize) != HDF_SUCCESS) {
71          HDF_LOGE("%{public}s: set data size failed!", __FUNCTION__);
72          return false;
73      }
74      return true;
75  }
76  
FuzzHostapdInterfaceStartAp(struct IHostapdInterface * interface,const uint8_t * rawData)77  void FuzzHostapdInterfaceStartAp(struct IHostapdInterface *interface, const uint8_t *rawData)
78  {
79      interface->StartAp(interface);
80      HDF_LOGI("%{public}s: success", __FUNCTION__);
81  }
82  
FuzzHostapdInterfaceStopAp(struct IHostapdInterface * interface,const uint8_t * rawData)83  void FuzzHostapdInterfaceStopAp(struct IHostapdInterface *interface, const uint8_t *rawData)
84  {
85      interface->StopAp(interface);
86      HDF_LOGI("%{public}s: success", __FUNCTION__);
87  }
88  
FuzzHostapdInterfaceEnableAp(struct IHostapdInterface * interface,const uint8_t * rawData)89  void FuzzHostapdInterfaceEnableAp(struct IHostapdInterface *interface, const uint8_t *rawData)
90  {
91      const char *ifName = reinterpret_cast<const char *>(rawData);
92      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
93  
94      interface->EnableAp(interface, ifName, id);
95      HDF_LOGI("%{public}s: success", __FUNCTION__);
96  }
97  
FuzzHostapdInterfaceDisableAp(struct IHostapdInterface * interface,const uint8_t * rawData)98  void FuzzHostapdInterfaceDisableAp(struct IHostapdInterface *interface, const uint8_t *rawData)
99  {
100      const char *ifName = reinterpret_cast<const char *>(rawData);
101      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
102  
103      interface->DisableAp(interface, ifName, id);
104      HDF_LOGI("%{public}s: success", __FUNCTION__);
105  }
106  
FuzzHostapdInterfaceSetApPasswd(struct IHostapdInterface * interface,const uint8_t * rawData)107  void FuzzHostapdInterfaceSetApPasswd(struct IHostapdInterface *interface, const uint8_t *rawData)
108  {
109      const char *ifName = reinterpret_cast<const char *>(rawData);
110      const char *pass = reinterpret_cast<const char *>(rawData);
111      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
112  
113      interface->SetApPasswd(interface, ifName, pass, id);
114      HDF_LOGI("%{public}s: success", __FUNCTION__);
115  }
116  
FuzzHostapdInterfaceSetApName(struct IHostapdInterface * interface,const uint8_t * rawData)117  void FuzzHostapdInterfaceSetApName(struct IHostapdInterface *interface, const uint8_t *rawData)
118  {
119      const char *ifName = reinterpret_cast<const char *>(rawData);
120      const char *name = reinterpret_cast<const char *>(rawData);
121      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
122  
123      interface->SetApName(interface, ifName, name, id);
124      HDF_LOGI("%{public}s: success", __FUNCTION__);
125  }
126  
FuzzHostapdInterfaceSetApBand(struct IHostapdInterface * interface,const uint8_t * rawData)127  void FuzzHostapdInterfaceSetApBand(struct IHostapdInterface *interface, const uint8_t *rawData)
128  {
129      const char *ifName = reinterpret_cast<const char *>(rawData);
130      int32_t band = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
131      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
132  
133      interface->SetApBand(interface, ifName, band, id);
134      HDF_LOGI("%{public}s: success", __FUNCTION__);
135  }
136  
FuzzHostapdInterfaceSetAp80211n(struct IHostapdInterface * interface,const uint8_t * rawData)137  void FuzzHostapdInterfaceSetAp80211n(struct IHostapdInterface *interface, const uint8_t *rawData)
138  {
139      const char *ifName = reinterpret_cast<const char *>(rawData);
140      int32_t value = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
141      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
142  
143      interface->SetAp80211n(interface, ifName, value, id);
144      HDF_LOGI("%{public}s: success", __FUNCTION__);
145  }
146  
FuzzHostapdInterfaceSetApWmm(struct IHostapdInterface * interface,const uint8_t * rawData)147  void FuzzHostapdInterfaceSetApWmm(struct IHostapdInterface *interface, const uint8_t *rawData)
148  {
149      const char *ifName = reinterpret_cast<const char *>(rawData);
150      int32_t value = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
151      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
152  
153      interface->SetApWmm(interface, ifName, value, id);
154      HDF_LOGI("%{public}s: success", __FUNCTION__);
155  }
156  
FuzzHostapdInterfaceSetApChannel(struct IHostapdInterface * interface,const uint8_t * rawData)157  void FuzzHostapdInterfaceSetApChannel(struct IHostapdInterface *interface, const uint8_t *rawData)
158  {
159      const char *ifName = reinterpret_cast<const char *>(rawData);
160      int32_t channel = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
161      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
162  
163      interface->SetApChannel(interface, ifName, channel, id);
164      HDF_LOGI("%{public}s: success", __FUNCTION__);
165  }
166  
FuzzHostapdInterfaceSetApMaxConn(struct IHostapdInterface * interface,const uint8_t * rawData)167  void FuzzHostapdInterfaceSetApMaxConn(struct IHostapdInterface *interface, const uint8_t *rawData)
168  {
169      const char *ifName = reinterpret_cast<const char *>(rawData);
170      int32_t maxConn = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
171      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
172  
173      interface->SetApMaxConn(interface, ifName, maxConn, id);
174      HDF_LOGI("%{public}s: success", __FUNCTION__);
175  }
176  
FuzzHostapdInterfaceSetMacFilter(struct IHostapdInterface * interface,const uint8_t * rawData)177  void FuzzHostapdInterfaceSetMacFilter(struct IHostapdInterface *interface, const uint8_t *rawData)
178  {
179      const char *ifName = reinterpret_cast<const char *>(rawData);
180      const char *mac = reinterpret_cast<const char *>(rawData);
181      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
182  
183      interface->SetMacFilter(interface, ifName, mac, id);
184      HDF_LOGI("%{public}s: success", __FUNCTION__);
185  }
186  
FuzzHostapdInterfaceDelMacFilter(struct IHostapdInterface * interface,const uint8_t * rawData)187  void FuzzHostapdInterfaceDelMacFilter(struct IHostapdInterface *interface, const uint8_t *rawData)
188  {
189      const char *ifName = reinterpret_cast<const char *>(rawData);
190      const char *mac = reinterpret_cast<const char *>(rawData);
191      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
192  
193      interface->DelMacFilter(interface, ifName, mac, id);
194      HDF_LOGI("%{public}s: success", __FUNCTION__);
195  }
196  
FuzzHostapdInterfaceGetStaInfos(struct IHostapdInterface * interface,const uint8_t * rawData)197  void FuzzHostapdInterfaceGetStaInfos(struct IHostapdInterface *interface, const uint8_t *rawData)
198  {
199      const char *ifName = reinterpret_cast<const char *>(rawData);
200      char buf[BUFFSIZE_REQUEST] = {0};
201      uint32_t bufLen = *const_cast<uint32_t *>(reinterpret_cast<const uint32_t *>(rawData));
202      int32_t size = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
203      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
204  
205      interface->GetStaInfos(interface, ifName, buf, bufLen, size, id);
206      HDF_LOGI("%{public}s: success", __FUNCTION__);
207  }
208  
FuzzHostapdInterfaceDisassociateSta(struct IHostapdInterface * interface,const uint8_t * rawData)209  void FuzzHostapdInterfaceDisassociateSta(struct IHostapdInterface *interface, const uint8_t *rawData)
210  {
211      const char *ifName = reinterpret_cast<const char *>(rawData);
212      const char *mac = reinterpret_cast<const char *>(rawData);
213      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
214  
215      interface->DisassociateSta(interface, ifName, mac, id);
216      HDF_LOGI("%{public}s: success", __FUNCTION__);
217  }
218  
FuzzHostapdInterfaceRegisterEventCallback(struct IHostapdInterface * interface,const uint8_t * rawData)219  void FuzzHostapdInterfaceRegisterEventCallback(struct IHostapdInterface *interface, const uint8_t *rawData)
220  {
221      const char *ifName = reinterpret_cast<const char *>(rawData);
222  
223      interface->RegisterEventCallback(interface, g_hostapdCallbackObj, ifName);
224      HDF_LOGI("%{public}s: success", __FUNCTION__);
225  }
226  
FuzzHostapdInterfaceUnregisterEventCallback(struct IHostapdInterface * interface,const uint8_t * rawData)227  void FuzzHostapdInterfaceUnregisterEventCallback(struct IHostapdInterface *interface, const uint8_t *rawData)
228  {
229      const char *ifName = reinterpret_cast<const char *>(rawData);
230  
231      interface->UnregisterEventCallback(interface, g_hostapdCallbackObj, ifName);
232      HDF_LOGI("%{public}s: success", __FUNCTION__);
233  }
234  
FuzzHostapdInterfaceReloadApConfigInfo(struct IHostapdInterface * interface,const uint8_t * rawData)235  void FuzzHostapdInterfaceReloadApConfigInfo(struct IHostapdInterface *interface, const uint8_t *rawData)
236  {
237      const char *ifName = reinterpret_cast<const char *>(rawData);
238      int32_t id = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
239  
240      interface->ReloadApConfigInfo(interface, ifName, id);
241      HDF_LOGI("%{public}s: success", __FUNCTION__);
242  }
243