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