146debc2cSopenharmony_ci/*
246debc2cSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
346debc2cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
446debc2cSopenharmony_ci * you may not use this file except in compliance with the License.
546debc2cSopenharmony_ci * You may obtain a copy of the License at
646debc2cSopenharmony_ci *
746debc2cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
846debc2cSopenharmony_ci *
946debc2cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1046debc2cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1146debc2cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1246debc2cSopenharmony_ci * See the License for the specific language governing permissions and
1346debc2cSopenharmony_ci * limitations under the License.
1446debc2cSopenharmony_ci */
1546debc2cSopenharmony_ci
1646debc2cSopenharmony_ci#include <functional>
1746debc2cSopenharmony_ci#include "fuzzer/FuzzedDataProvider.h"
1846debc2cSopenharmony_ci#include "ohscan.h"
1946debc2cSopenharmony_ci#include "scancapi_fuzzer.h"
2046debc2cSopenharmony_ci
2146debc2cSopenharmony_cinamespace OHOS {
2246debc2cSopenharmony_cinamespace Scan {
2346debc2cSopenharmony_ciconstexpr uint8_t MAX_STRING_LENGTH = 255;
2446debc2cSopenharmony_ciconstexpr int MAX_SET_NUMBER = 100;
2546debc2cSopenharmony_ciconstexpr size_t FOO_MAX_LEN = 1024;
2646debc2cSopenharmony_ciconstexpr size_t U32_AT_SIZE = 4;
2746debc2cSopenharmony_ci
2846debc2cSopenharmony_civoid DiscoveryCallBack(Scan_ScannerDevice** devices, int32_t deviceCount) {}
2946debc2cSopenharmony_ci
3046debc2cSopenharmony_civoid OHScanOpenScannerFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
3146debc2cSopenharmony_ci{
3246debc2cSopenharmony_ci    OH_Scan_Init();
3346debc2cSopenharmony_ci    OH_Scan_StartScannerDiscovery(DiscoveryCallBack);
3446debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
3546debc2cSopenharmony_ci    OH_Scan_OpenScanner(scannerId.c_str());
3646debc2cSopenharmony_ci    OH_Scan_CloseScanner(scannerId.c_str());
3746debc2cSopenharmony_ci    OH_Scan_Exit();
3846debc2cSopenharmony_ci}
3946debc2cSopenharmony_ci
4046debc2cSopenharmony_civoid OHScanGetScannerParameterFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
4146debc2cSopenharmony_ci{
4246debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
4346debc2cSopenharmony_ci    int32_t errorCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
4446debc2cSopenharmony_ci    OH_Scan_GetScannerParameter(scannerId.c_str(), &errorCode);
4546debc2cSopenharmony_ci}
4646debc2cSopenharmony_ci
4746debc2cSopenharmony_civoid OHScanSetScannerParameterFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
4846debc2cSopenharmony_ci{
4946debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
5046debc2cSopenharmony_ci    int32_t option = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
5146debc2cSopenharmony_ci    std::string value = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
5246debc2cSopenharmony_ci    OH_Scan_SetScannerParameter(scannerId.c_str(), option, value.c_str());
5346debc2cSopenharmony_ci}
5446debc2cSopenharmony_ci
5546debc2cSopenharmony_civoid OHScanStartScanFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
5646debc2cSopenharmony_ci{
5746debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
5846debc2cSopenharmony_ci    bool batchMode = dataProvider->ConsumeBool();
5946debc2cSopenharmony_ci    OH_Scan_StartScan(scannerId.c_str(), batchMode);
6046debc2cSopenharmony_ci}
6146debc2cSopenharmony_ci
6246debc2cSopenharmony_civoid OHScanCancelScanFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
6346debc2cSopenharmony_ci{
6446debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
6546debc2cSopenharmony_ci    OH_Scan_CancelScan(scannerId.c_str());
6646debc2cSopenharmony_ci}
6746debc2cSopenharmony_ci
6846debc2cSopenharmony_civoid OHScanGetScanPictureProgressFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
6946debc2cSopenharmony_ci{
7046debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
7146debc2cSopenharmony_ci    Scan_PictureScanProgress progress;
7246debc2cSopenharmony_ci    progress.progress = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
7346debc2cSopenharmony_ci    progress.fd = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
7446debc2cSopenharmony_ci    progress.isFinal = dataProvider->ConsumeBool();
7546debc2cSopenharmony_ci    OH_Scan_GetPictureScanProgress(scannerId.c_str(), &progress);
7646debc2cSopenharmony_ci}
7746debc2cSopenharmony_ci
7846debc2cSopenharmony_ci}
7946debc2cSopenharmony_ci}
8046debc2cSopenharmony_ci
8146debc2cSopenharmony_ci/* Fuzzer entry point */
8246debc2cSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
8346debc2cSopenharmony_ci{
8446debc2cSopenharmony_ci    if (data == nullptr) {
8546debc2cSopenharmony_ci        return 0;
8646debc2cSopenharmony_ci    }
8746debc2cSopenharmony_ci
8846debc2cSopenharmony_ci    if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) {
8946debc2cSopenharmony_ci        return 0;
9046debc2cSopenharmony_ci    }
9146debc2cSopenharmony_ci    FuzzedDataProvider dataProvider(data, size);
9246debc2cSopenharmony_ci    OHOS::Scan::OHScanOpenScannerFuzzTest(data, size, &dataProvider);
9346debc2cSopenharmony_ci    OHOS::Scan::OHScanGetScannerParameterFuzzTest(data, size, &dataProvider);
9446debc2cSopenharmony_ci    OHOS::Scan::OHScanSetScannerParameterFuzzTest(data, size, &dataProvider);
9546debc2cSopenharmony_ci    OHOS::Scan::OHScanStartScanFuzzTest(data, size, &dataProvider);
9646debc2cSopenharmony_ci    OHOS::Scan::OHScanCancelScanFuzzTest(data, size, &dataProvider);
9746debc2cSopenharmony_ci    OHOS::Scan::OHScanGetScanPictureProgressFuzzTest(data, size, &dataProvider);
9846debc2cSopenharmony_ci    return 0;
9946debc2cSopenharmony_ci}
10046debc2cSopenharmony_ci
101