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#include <functional> 17#include "fuzzer/FuzzedDataProvider.h" 18#include "ohscan.h" 19#include "scancapi_fuzzer.h" 20 21namespace OHOS { 22namespace Scan { 23constexpr uint8_t MAX_STRING_LENGTH = 255; 24constexpr int MAX_SET_NUMBER = 100; 25constexpr size_t FOO_MAX_LEN = 1024; 26constexpr size_t U32_AT_SIZE = 4; 27 28void DiscoveryCallBack(Scan_ScannerDevice** devices, int32_t deviceCount) {} 29 30void OHScanOpenScannerFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 31{ 32 OH_Scan_Init(); 33 OH_Scan_StartScannerDiscovery(DiscoveryCallBack); 34 std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 35 OH_Scan_OpenScanner(scannerId.c_str()); 36 OH_Scan_CloseScanner(scannerId.c_str()); 37 OH_Scan_Exit(); 38} 39 40void OHScanGetScannerParameterFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 41{ 42 std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 43 int32_t errorCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 44 OH_Scan_GetScannerParameter(scannerId.c_str(), &errorCode); 45} 46 47void OHScanSetScannerParameterFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 48{ 49 std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 50 int32_t option = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 51 std::string value = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 52 OH_Scan_SetScannerParameter(scannerId.c_str(), option, value.c_str()); 53} 54 55void OHScanStartScanFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 56{ 57 std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 58 bool batchMode = dataProvider->ConsumeBool(); 59 OH_Scan_StartScan(scannerId.c_str(), batchMode); 60} 61 62void OHScanCancelScanFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 63{ 64 std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 65 OH_Scan_CancelScan(scannerId.c_str()); 66} 67 68void OHScanGetScanPictureProgressFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 69{ 70 std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 71 Scan_PictureScanProgress progress; 72 progress.progress = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 73 progress.fd = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 74 progress.isFinal = dataProvider->ConsumeBool(); 75 OH_Scan_GetPictureScanProgress(scannerId.c_str(), &progress); 76} 77 78} 79} 80 81/* Fuzzer entry point */ 82extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) 83{ 84 if (data == nullptr) { 85 return 0; 86 } 87 88 if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) { 89 return 0; 90 } 91 FuzzedDataProvider dataProvider(data, size); 92 OHOS::Scan::OHScanOpenScannerFuzzTest(data, size, &dataProvider); 93 OHOS::Scan::OHScanGetScannerParameterFuzzTest(data, size, &dataProvider); 94 OHOS::Scan::OHScanSetScannerParameterFuzzTest(data, size, &dataProvider); 95 OHOS::Scan::OHScanStartScanFuzzTest(data, size, &dataProvider); 96 OHOS::Scan::OHScanCancelScanFuzzTest(data, size, &dataProvider); 97 OHOS::Scan::OHScanGetScanPictureProgressFuzzTest(data, size, &dataProvider); 98 return 0; 99} 100 101