1518678f8Sopenharmony_ci/*
2518678f8Sopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd.
3518678f8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4518678f8Sopenharmony_ci * you may not use this file except in compliance with the License.
5518678f8Sopenharmony_ci * You may obtain a copy of the License at
6518678f8Sopenharmony_ci *
7518678f8Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8518678f8Sopenharmony_ci *
9518678f8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10518678f8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11518678f8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12518678f8Sopenharmony_ci * See the License for the specific language governing permissions and
13518678f8Sopenharmony_ci * limitations under the License.
14518678f8Sopenharmony_ci */
15518678f8Sopenharmony_ci
16518678f8Sopenharmony_ci#include "addressutils_fuzzer.h"
17518678f8Sopenharmony_ci
18518678f8Sopenharmony_ci#include <cstddef>
19518678f8Sopenharmony_ci#include <cstdint>
20518678f8Sopenharmony_ci#include <unistd.h>
21518678f8Sopenharmony_ci#include "securec.h"
22518678f8Sopenharmony_ci#include "address_utils.h"
23518678f8Sopenharmony_ci#include "dhcp_s_define.h"
24518678f8Sopenharmony_ci
25518678f8Sopenharmony_cinamespace OHOS {
26518678f8Sopenharmony_cinamespace Wifi {
27518678f8Sopenharmony_ciconstexpr size_t DHCP_SLEEP_1 = 2;
28518678f8Sopenharmony_ciconstexpr size_t U32_AT_SIZE_ZERO = 4;
29518678f8Sopenharmony_ciconstexpr int CFG_DATA_MAX_BYTES = 20;
30518678f8Sopenharmony_ci
31518678f8Sopenharmony_civoid NetworkAddressTest(const uint8_t* data, size_t size)
32518678f8Sopenharmony_ci{
33518678f8Sopenharmony_ci    uint32_t index = 0;
34518678f8Sopenharmony_ci    uint32_t ip = static_cast<uint32_t>(data[index++]);
35518678f8Sopenharmony_ci    uint32_t netmask = static_cast<uint32_t>(data[0]);
36518678f8Sopenharmony_ci    NetworkAddress(ip, netmask);
37518678f8Sopenharmony_ci}
38518678f8Sopenharmony_ci
39518678f8Sopenharmony_civoid FirstIpAddressTest(const uint8_t* data, size_t size)
40518678f8Sopenharmony_ci{
41518678f8Sopenharmony_ci    uint32_t index = 0;
42518678f8Sopenharmony_ci    uint32_t ip = static_cast<uint32_t>(data[index++]);
43518678f8Sopenharmony_ci    uint32_t netmask = static_cast<uint32_t>(data[0]);
44518678f8Sopenharmony_ci    FirstIpAddress(ip, netmask);
45518678f8Sopenharmony_ci}
46518678f8Sopenharmony_ci
47518678f8Sopenharmony_civoid NextIpAddressTest(const uint8_t* data, size_t size)
48518678f8Sopenharmony_ci{
49518678f8Sopenharmony_ci    uint32_t index = 0;
50518678f8Sopenharmony_ci    uint32_t currIp = static_cast<uint32_t>(data[index++]);
51518678f8Sopenharmony_ci    uint32_t netmask = static_cast<uint32_t>(data[0]);
52518678f8Sopenharmony_ci    uint32_t offset = static_cast<uint32_t>(data[index++]);
53518678f8Sopenharmony_ci    NextIpAddress(currIp, netmask, offset);
54518678f8Sopenharmony_ci}
55518678f8Sopenharmony_ci
56518678f8Sopenharmony_civoid FirstNetIpAddressTest(const uint8_t* data, size_t size)
57518678f8Sopenharmony_ci{
58518678f8Sopenharmony_ci    uint32_t index = 0;
59518678f8Sopenharmony_ci    uint32_t networkAddr = static_cast<uint32_t>(data[index++]);
60518678f8Sopenharmony_ci    FirstNetIpAddress(networkAddr);
61518678f8Sopenharmony_ci}
62518678f8Sopenharmony_ci
63518678f8Sopenharmony_civoid LastIpAddressTest(const uint8_t* data, size_t size)
64518678f8Sopenharmony_ci{
65518678f8Sopenharmony_ci    uint32_t index = 0;
66518678f8Sopenharmony_ci    uint32_t ip = static_cast<uint32_t>(data[index++]);
67518678f8Sopenharmony_ci    uint32_t netmask = static_cast<uint32_t>(data[0]);
68518678f8Sopenharmony_ci    LastIpAddress(ip, netmask);
69518678f8Sopenharmony_ci}
70518678f8Sopenharmony_ci
71518678f8Sopenharmony_civoid IpInNetworkTest(const uint8_t* data, size_t size)
72518678f8Sopenharmony_ci{
73518678f8Sopenharmony_ci    uint32_t index = 0;
74518678f8Sopenharmony_ci    uint32_t ip = static_cast<uint32_t>(data[index++]);
75518678f8Sopenharmony_ci    uint32_t network = static_cast<uint32_t>(data[index++]);
76518678f8Sopenharmony_ci    uint32_t netmask = static_cast<uint32_t>(data[0]);
77518678f8Sopenharmony_ci    IpInNetwork(ip, network, netmask);
78518678f8Sopenharmony_ci}
79518678f8Sopenharmony_ci
80518678f8Sopenharmony_civoid IpInRangeTest(const uint8_t* data, size_t size)
81518678f8Sopenharmony_ci{
82518678f8Sopenharmony_ci    uint32_t index = 0;
83518678f8Sopenharmony_ci    uint32_t ip = static_cast<uint32_t>(data[index++]);
84518678f8Sopenharmony_ci    uint32_t beginIp = static_cast<uint32_t>(data[index++]);
85518678f8Sopenharmony_ci    uint32_t endIp = static_cast<uint32_t>(data[index++]);
86518678f8Sopenharmony_ci    uint32_t netmask = static_cast<uint32_t>(data[0]);
87518678f8Sopenharmony_ci    IpInRange(ip, beginIp, endIp, netmask);
88518678f8Sopenharmony_ci}
89518678f8Sopenharmony_ci
90518678f8Sopenharmony_civoid BroadCastAddressTest(const uint8_t* data, size_t size)
91518678f8Sopenharmony_ci{
92518678f8Sopenharmony_ci    uint32_t index = 0;
93518678f8Sopenharmony_ci    uint32_t ip = static_cast<uint32_t>(data[index++]);
94518678f8Sopenharmony_ci    uint32_t netmask = static_cast<uint32_t>(data[0]);
95518678f8Sopenharmony_ci    BroadCastAddress(ip, netmask);
96518678f8Sopenharmony_ci}
97518678f8Sopenharmony_ci
98518678f8Sopenharmony_civoid ParseIpAddrTest(const uint8_t* data, size_t size)
99518678f8Sopenharmony_ci{
100518678f8Sopenharmony_ci    const char *strIp = "TEXT";
101518678f8Sopenharmony_ci    (void)ParseIpAddr(strIp);
102518678f8Sopenharmony_ci}
103518678f8Sopenharmony_ci
104518678f8Sopenharmony_civoid ParseIpHtonlTest(const uint8_t* data, size_t size)
105518678f8Sopenharmony_ci{
106518678f8Sopenharmony_ci    const char *strIp = "TEXT";
107518678f8Sopenharmony_ci    (void)ParseIpHtonl(strIp);
108518678f8Sopenharmony_ci}
109518678f8Sopenharmony_ci
110518678f8Sopenharmony_civoid NetworkBitsTest(const uint8_t* data, size_t size)
111518678f8Sopenharmony_ci{
112518678f8Sopenharmony_ci    uint32_t netmask = static_cast<uint32_t>(data[0]);
113518678f8Sopenharmony_ci    NetworkBits(netmask);
114518678f8Sopenharmony_ci}
115518678f8Sopenharmony_ci
116518678f8Sopenharmony_civoid HostBitsTest(const uint8_t* data, size_t size)
117518678f8Sopenharmony_ci{
118518678f8Sopenharmony_ci    uint32_t netmask = static_cast<uint32_t>(data[0]);
119518678f8Sopenharmony_ci    HostBits(netmask);
120518678f8Sopenharmony_ci}
121518678f8Sopenharmony_ci
122518678f8Sopenharmony_civoid HostTotalTest(const uint8_t* data, size_t size)
123518678f8Sopenharmony_ci{
124518678f8Sopenharmony_ci    uint32_t netmask = static_cast<uint32_t>(data[0]);
125518678f8Sopenharmony_ci    HostTotal(netmask);
126518678f8Sopenharmony_ci}
127518678f8Sopenharmony_ci
128518678f8Sopenharmony_civoid ParseIpTest(const uint8_t* data, size_t size)
129518678f8Sopenharmony_ci{
130518678f8Sopenharmony_ci    uint8_t *ipAddr = NULL;
131518678f8Sopenharmony_ci    if (memcpy_s(ipAddr, CFG_DATA_MAX_BYTES, data, CFG_DATA_MAX_BYTES - 1) != EOK) {
132518678f8Sopenharmony_ci        return;
133518678f8Sopenharmony_ci    }
134518678f8Sopenharmony_ci    ParseIp(ipAddr);
135518678f8Sopenharmony_ci}
136518678f8Sopenharmony_ci
137518678f8Sopenharmony_civoid IsEmptyHWAddrTest(const uint8_t* data, size_t size)
138518678f8Sopenharmony_ci{
139518678f8Sopenharmony_ci    uint8_t ipAddr[DHCP_HWADDR_LENGTH];
140518678f8Sopenharmony_ci    IsEmptyHWAddr(&ipAddr[0]);
141518678f8Sopenharmony_ci}
142518678f8Sopenharmony_ci
143518678f8Sopenharmony_civoid ParseStrMacTest(const uint8_t* data, size_t size)
144518678f8Sopenharmony_ci{
145518678f8Sopenharmony_ci    uint8_t* macAddr = nullptr;
146518678f8Sopenharmony_ci    size_t addrSize = MAC_ADDR_LENGTH;
147518678f8Sopenharmony_ci    ParseStrMac(macAddr, addrSize);
148518678f8Sopenharmony_ci}
149518678f8Sopenharmony_ci
150518678f8Sopenharmony_civoid ParseMacAddressTest(const uint8_t* data, size_t size)
151518678f8Sopenharmony_ci{
152518678f8Sopenharmony_ci    const char *strMac = "TEXT";
153518678f8Sopenharmony_ci    uint8_t macAddr[DHCP_HWADDR_LENGTH];
154518678f8Sopenharmony_ci    (void)ParseMacAddress(strMac, &macAddr[0]);
155518678f8Sopenharmony_ci}
156518678f8Sopenharmony_ci
157518678f8Sopenharmony_civoid ParseHostNameTest(const uint8_t* data, size_t size)
158518678f8Sopenharmony_ci{
159518678f8Sopenharmony_ci    const char *strHostName = "TEXT";
160518678f8Sopenharmony_ci    char hostName[DHCP_BOOT_FILE_LENGTH];
161518678f8Sopenharmony_ci    (void)ParseHostName(strHostName, &hostName[0]);
162518678f8Sopenharmony_ci}
163518678f8Sopenharmony_ci
164518678f8Sopenharmony_civoid HostToNetworkTest(const uint8_t* data, size_t size)
165518678f8Sopenharmony_ci{
166518678f8Sopenharmony_ci    uint32_t index = 0;
167518678f8Sopenharmony_ci    uint32_t host = static_cast<uint32_t>(data[index++]);
168518678f8Sopenharmony_ci    HostToNetwork(host);
169518678f8Sopenharmony_ci}
170518678f8Sopenharmony_ci
171518678f8Sopenharmony_civoid NetworkToHostTest(const uint8_t* data, size_t size)
172518678f8Sopenharmony_ci{
173518678f8Sopenharmony_ci    uint32_t index = 0;
174518678f8Sopenharmony_ci    uint32_t network = static_cast<uint32_t>(data[index++]);
175518678f8Sopenharmony_ci    NetworkToHost(network);
176518678f8Sopenharmony_ci}
177518678f8Sopenharmony_ci
178518678f8Sopenharmony_civoid ParseLogMacTest(const uint8_t* data, size_t size)
179518678f8Sopenharmony_ci{
180518678f8Sopenharmony_ci    uint8_t macAddr[DHCP_HWADDR_LENGTH];
181518678f8Sopenharmony_ci    ParseLogMac(&macAddr[0]);
182518678f8Sopenharmony_ci}
183518678f8Sopenharmony_ci
184518678f8Sopenharmony_civoid AddrEquelsTest(const uint8_t* data, size_t size)
185518678f8Sopenharmony_ci{
186518678f8Sopenharmony_ci    int index = 0;
187518678f8Sopenharmony_ci    int addrLength = static_cast<int>(data[index++]);
188518678f8Sopenharmony_ci    uint8_t firstAddr[DHCP_HWADDR_LENGTH];
189518678f8Sopenharmony_ci    uint8_t secondAddr[DHCP_HWADDR_LENGTH];
190518678f8Sopenharmony_ci    AddrEquels(&firstAddr[0], &secondAddr[0], addrLength);
191518678f8Sopenharmony_ci}
192518678f8Sopenharmony_ci
193518678f8Sopenharmony_ci/* Fuzzer entry point */
194518678f8Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
195518678f8Sopenharmony_ci{
196518678f8Sopenharmony_ci    if ((data == nullptr) || (size <= OHOS::Wifi::U32_AT_SIZE_ZERO)) {
197518678f8Sopenharmony_ci        return 0;
198518678f8Sopenharmony_ci    }
199518678f8Sopenharmony_ci    sleep(DHCP_SLEEP_1);
200518678f8Sopenharmony_ci    OHOS::Wifi::NetworkAddressTest(data, size);
201518678f8Sopenharmony_ci    OHOS::Wifi::FirstIpAddressTest(data, size);
202518678f8Sopenharmony_ci    OHOS::Wifi::NextIpAddressTest(data, size);
203518678f8Sopenharmony_ci    OHOS::Wifi::FirstNetIpAddressTest(data, size);
204518678f8Sopenharmony_ci    OHOS::Wifi::LastIpAddressTest(data, size);
205518678f8Sopenharmony_ci    OHOS::Wifi::IpInNetworkTest(data, size);
206518678f8Sopenharmony_ci    OHOS::Wifi::IpInRangeTest(data, size);
207518678f8Sopenharmony_ci    OHOS::Wifi::BroadCastAddressTest(data, size);
208518678f8Sopenharmony_ci    OHOS::Wifi::ParseIpAddrTest(data, size);
209518678f8Sopenharmony_ci    OHOS::Wifi::ParseIpHtonlTest(data, size);
210518678f8Sopenharmony_ci    OHOS::Wifi::NetworkBitsTest(data, size);
211518678f8Sopenharmony_ci    OHOS::Wifi::HostBitsTest(data, size);
212518678f8Sopenharmony_ci    OHOS::Wifi::HostTotalTest(data, size);
213518678f8Sopenharmony_ci    OHOS::Wifi::ParseIpTest(data, size);
214518678f8Sopenharmony_ci    OHOS::Wifi::IsEmptyHWAddrTest(data, size);
215518678f8Sopenharmony_ci    OHOS::Wifi::ParseStrMacTest(data, size);
216518678f8Sopenharmony_ci    OHOS::Wifi::ParseMacAddressTest(data, size);
217518678f8Sopenharmony_ci    OHOS::Wifi::ParseHostNameTest(data, size);
218518678f8Sopenharmony_ci    OHOS::Wifi::HostToNetworkTest(data, size);
219518678f8Sopenharmony_ci    OHOS::Wifi::NetworkToHostTest(data, size);
220518678f8Sopenharmony_ci    OHOS::Wifi::ParseLogMacTest(data, size);
221518678f8Sopenharmony_ci    OHOS::Wifi::AddrEquelsTest(data, size);
222518678f8Sopenharmony_ci    return 0;
223518678f8Sopenharmony_ci}
224518678f8Sopenharmony_ci}  // namespace Wifi
225518678f8Sopenharmony_ci}  // namespace OHOS
226