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#include "fuzzer/FuzzedDataProvider.h"
1646debc2cSopenharmony_ci#include "scancallbackproxy_fuzzer.h"
1746debc2cSopenharmony_ci#include "scan_callback_proxy.h"
1846debc2cSopenharmony_ci
1946debc2cSopenharmony_cinamespace OHOS {
2046debc2cSopenharmony_cinamespace Scan {
2146debc2cSopenharmony_ci    constexpr uint8_t MAX_STRING_LENGTH = 255;
2246debc2cSopenharmony_ci    constexpr int MAX_SET_NUMBER = 100;
2346debc2cSopenharmony_ci    constexpr size_t FOO_MAX_LEN = 1024;
2446debc2cSopenharmony_ci    constexpr size_t U32_AT_SIZE = 4;
2546debc2cSopenharmony_ci
2646debc2cSopenharmony_ci    void TestTcpOnCallback(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
2746debc2cSopenharmony_ci    {
2846debc2cSopenharmony_ci        uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
2946debc2cSopenharmony_ci        ScanDeviceInfoTCP info;
3046debc2cSopenharmony_ci        sptr<IRemoteObject> impl;
3146debc2cSopenharmony_ci        ScanCallbackProxy scanCallbackProxy(impl);
3246debc2cSopenharmony_ci        scanCallbackProxy.OnCallback(state, info);
3346debc2cSopenharmony_ci    }
3446debc2cSopenharmony_ci
3546debc2cSopenharmony_ci    void TestUsbOnCallback(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
3646debc2cSopenharmony_ci    {
3746debc2cSopenharmony_ci        uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
3846debc2cSopenharmony_ci        ScanDeviceInfo info;
3946debc2cSopenharmony_ci        sptr<IRemoteObject> impl;
4046debc2cSopenharmony_ci        ScanCallbackProxy scanCallbackProxy(impl);
4146debc2cSopenharmony_ci        scanCallbackProxy.OnCallback(state, info);
4246debc2cSopenharmony_ci    }
4346debc2cSopenharmony_ci
4446debc2cSopenharmony_ci    void TestOnCallbackSync(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
4546debc2cSopenharmony_ci    {
4646debc2cSopenharmony_ci        uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
4746debc2cSopenharmony_ci        ScanDeviceInfoSync info;
4846debc2cSopenharmony_ci        sptr<IRemoteObject> impl;
4946debc2cSopenharmony_ci        ScanCallbackProxy scanCallbackProxy(impl);
5046debc2cSopenharmony_ci        scanCallbackProxy.OnCallbackSync(state, info);
5146debc2cSopenharmony_ci    }
5246debc2cSopenharmony_ci
5346debc2cSopenharmony_ci    void TestOnGetFrameResCallback(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
5446debc2cSopenharmony_ci    {
5546debc2cSopenharmony_ci        bool isGetSucc = dataProvider->ConsumeBool();
5646debc2cSopenharmony_ci        int32_t sizeRead = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
5746debc2cSopenharmony_ci        sptr<IRemoteObject> impl;
5846debc2cSopenharmony_ci        ScanCallbackProxy scanCallbackProxy(impl);
5946debc2cSopenharmony_ci        scanCallbackProxy.OnGetFrameResCallback(isGetSucc, sizeRead);
6046debc2cSopenharmony_ci    }
6146debc2cSopenharmony_ci
6246debc2cSopenharmony_ci    void TestOnScanInitCallback(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
6346debc2cSopenharmony_ci    {
6446debc2cSopenharmony_ci        int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
6546debc2cSopenharmony_ci        sptr<IRemoteObject> impl;
6646debc2cSopenharmony_ci        ScanCallbackProxy scanCallbackProxy(impl);
6746debc2cSopenharmony_ci        scanCallbackProxy.OnScanInitCallback(scanVersion);
6846debc2cSopenharmony_ci    }
6946debc2cSopenharmony_ci
7046debc2cSopenharmony_ci    void TestOnSendSearchMessage(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
7146debc2cSopenharmony_ci    {
7246debc2cSopenharmony_ci        std::string message = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
7346debc2cSopenharmony_ci        sptr<IRemoteObject> impl;
7446debc2cSopenharmony_ci        ScanCallbackProxy scanCallbackProxy(impl);
7546debc2cSopenharmony_ci        scanCallbackProxy.OnSendSearchMessage(message);
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::TestTcpOnCallback(data, size, &dataProvider);
9346debc2cSopenharmony_ci    OHOS::Scan::TestUsbOnCallback(data, size, &dataProvider);
9446debc2cSopenharmony_ci    OHOS::Scan::TestOnCallbackSync(data, size, &dataProvider);
9546debc2cSopenharmony_ci    OHOS::Scan::TestOnGetFrameResCallback(data, size, &dataProvider);
9646debc2cSopenharmony_ci    OHOS::Scan::TestOnScanInitCallback(data, size, &dataProvider);
9746debc2cSopenharmony_ci    OHOS::Scan::TestOnSendSearchMessage(data, size, &dataProvider);
9846debc2cSopenharmony_ci    return 0;
9946debc2cSopenharmony_ci}
10046debc2cSopenharmony_ci
101