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