1/* 2 * Copyright (c) 2024 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 16#define TDD_ENABLE 1 17 18#include "fuzzer/FuzzedDataProvider.h" 19#include "napi/native_api.h" 20#include "scan_callback.h" 21#include "scancallbackstub_fuzzer.h" 22 23namespace OHOS::Scan { 24constexpr uint8_t MAX_STRING_LENGTH = 255; 25constexpr int MAX_SET_NUMBER = 100; 26constexpr size_t FOO_MAX_LEN = 1024; 27constexpr size_t U32_AT_SIZE = 4; 28 29void OnRemoteRequestFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 30{ 31 uint32_t code = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER); 32 MessageParcel parcelData; 33 parcelData.WriteInterfaceToken(u"OHOS.Scan.IScanCallback"); 34 MessageParcel reply; 35 ScanCallback callBack(nullptr, nullptr); 36 MessageOption option; 37 callBack.OnRemoteRequest(code, parcelData, reply, option); 38} 39 40void HandleDeviceInfoTcpEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 41{ 42 MessageParcel parcelData; 43 uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER); 44 parcelData.WriteUint32(state); 45 ScanCallback callBack(nullptr, nullptr); 46 MessageParcel reply; 47 callBack.HandleDeviceInfoTcpEvent(parcelData, reply); 48} 49 50void HandleDeviceInfoEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 51{ 52 MessageParcel parcelData; 53 uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER); 54 parcelData.WriteUint32(state); 55 ScanCallback callBack(nullptr, nullptr); 56 MessageParcel reply; 57 callBack.HandleDeviceInfoEvent(parcelData, reply); 58} 59 60void HandleDeviceInfoSyncEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 61{ 62 MessageParcel parcelData; 63 uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER); 64 parcelData.WriteUint32(state); 65 ScanCallback callBack(nullptr, nullptr); 66 MessageParcel reply; 67 callBack.HandleDeviceInfoSyncEvent(parcelData, reply); 68} 69 70void HandleGetFrameResEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 71{ 72 MessageParcel parcelData; 73 bool isGetSucc = dataProvider->ConsumeBool(); 74 parcelData.WriteBool(isGetSucc); 75 int32_t sizeRead = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 76 parcelData.WriteInt32(sizeRead); 77 ScanCallback callBack(nullptr, nullptr); 78 MessageParcel reply; 79 callBack.HandleGetFrameResEvent(parcelData, reply); 80} 81 82void HandleScanInitEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 83{ 84 MessageParcel parcelData; 85 int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 86 parcelData.WriteInt32(scanVersion); 87 ScanCallback callBack(nullptr, nullptr); 88 MessageParcel reply; 89 callBack.HandleScanInitEvent(parcelData, reply); 90} 91 92void HandleSendSearchMessageFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 93{ 94 MessageParcel parcelData; 95 std::string message = parcelData.ReadString(); 96 parcelData.WriteString(message); 97 message = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 98 parcelData.WriteString(message); 99 ScanCallback callBack(nullptr, nullptr); 100 MessageParcel reply; 101 callBack.HandleSendSearchMessage(parcelData, reply); 102} 103 104void HandleSendDeviceListFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 105{ 106 MessageParcel parcelData; 107 int32_t infosSize = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 108 parcelData.WriteInt32(infosSize); 109 std::vector<ScanDeviceInfo> infos(infosSize); 110 for (size_t i = 0; i < infos.size(); i++) { 111 infos[i].Marshalling(parcelData); 112 } 113 ScanCallback callBack(nullptr, nullptr); 114 MessageParcel reply; 115 callBack.HandleSendDeviceList(parcelData, reply); 116} 117 118} 119 120/* Fuzzer entry point */ 121extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) 122{ 123 if (data == nullptr) { 124 return 0; 125 } 126 127 if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) { 128 return 0; 129 } 130 FuzzedDataProvider dataProvider(data, size); 131 OHOS::Scan::OnRemoteRequestFuzzTest(data, size, &dataProvider); 132 OHOS::Scan::HandleDeviceInfoTcpEventFuzzTest(data, size, &dataProvider); 133 OHOS::Scan::HandleDeviceInfoEventFuzzTest(data, size, &dataProvider); 134 OHOS::Scan::HandleDeviceInfoSyncEventFuzzTest(data, size, &dataProvider); 135 OHOS::Scan::HandleGetFrameResEventFuzzTest(data, size, &dataProvider); 136 OHOS::Scan::HandleScanInitEventFuzzTest(data, size, &dataProvider); 137 OHOS::Scan::HandleSendSearchMessageFuzzTest(data, size, &dataProvider); 138 OHOS::Scan::HandleSendDeviceListFuzzTest(data, size, &dataProvider); 139 return 0; 140} 141 142