1bc03f14fSopenharmony_ci/*
2bc03f14fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3bc03f14fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4bc03f14fSopenharmony_ci * you may not use this file except in compliance with the License.
5bc03f14fSopenharmony_ci * You may obtain a copy of the License at
6bc03f14fSopenharmony_ci *
7bc03f14fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8bc03f14fSopenharmony_ci *
9bc03f14fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10bc03f14fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11bc03f14fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12bc03f14fSopenharmony_ci * See the License for the specific language governing permissions and
13bc03f14fSopenharmony_ci * limitations under the License.
14bc03f14fSopenharmony_ci */
15bc03f14fSopenharmony_ci
16bc03f14fSopenharmony_ci#include "pasteboardobserver_fuzzer.h"
17bc03f14fSopenharmony_ci
18bc03f14fSopenharmony_ci#include "message_parcel.h"
19bc03f14fSopenharmony_ci
20bc03f14fSopenharmony_ci#include <map>
21bc03f14fSopenharmony_ci
22bc03f14fSopenharmony_ci#include "pasteboard_error.h"
23bc03f14fSopenharmony_ci#include "pasteboard_observer.h"
24bc03f14fSopenharmony_ci#include "pasteboard_serv_ipc_interface_code.h"
25bc03f14fSopenharmony_ci
26bc03f14fSopenharmony_cinamespace OHOS {
27bc03f14fSopenharmony_ciusing namespace OHOS::Security::PasteboardServ;
28bc03f14fSopenharmony_ciusing namespace OHOS::MiscServices;
29bc03f14fSopenharmony_ciconstexpr size_t THRESHOLD = 2;
30bc03f14fSopenharmony_ciconst std::u16string PASTEBOARDSERVICE_INTERFACE_TOKEN = u"ohos.miscservices.pasteboard.IPasteboardService";
31bc03f14fSopenharmony_ci
32bc03f14fSopenharmony_citemplate<class T>
33bc03f14fSopenharmony_ciT TypeCast(const uint8_t *data, int *pos = nullptr)
34bc03f14fSopenharmony_ci{
35bc03f14fSopenharmony_ci    if (pos) {
36bc03f14fSopenharmony_ci        *pos += sizeof(T);
37bc03f14fSopenharmony_ci    }
38bc03f14fSopenharmony_ci    return *(reinterpret_cast<const T*>(data));
39bc03f14fSopenharmony_ci}
40bc03f14fSopenharmony_ci
41bc03f14fSopenharmony_cibool FuzzPasteboardObserver(const uint8_t *rawData, size_t size)
42bc03f14fSopenharmony_ci{
43bc03f14fSopenharmony_ci    if (rawData == nullptr || size < sizeof(uint32_t)) {
44bc03f14fSopenharmony_ci        return true;
45bc03f14fSopenharmony_ci    }
46bc03f14fSopenharmony_ci    uint32_t code = TypeCast<uint32_t>(rawData);
47bc03f14fSopenharmony_ci    MessageParcel data;
48bc03f14fSopenharmony_ci    data.WriteInterfaceToken(PASTEBOARDSERVICE_INTERFACE_TOKEN);
49bc03f14fSopenharmony_ci    MessageParcel reply;
50bc03f14fSopenharmony_ci    MessageOption option;
51bc03f14fSopenharmony_ci    std::make_shared<PasteboardObserver>()->OnRemoteRequest(
52bc03f14fSopenharmony_ci        static_cast<uint32_t>(code % THRESHOLD), data, reply, option);
53bc03f14fSopenharmony_ci    return true;
54bc03f14fSopenharmony_ci}
55bc03f14fSopenharmony_ci
56bc03f14fSopenharmony_cibool FuzzPasteboardObserverOnPasteboardChangedStub(const uint8_t *rawData, size_t size)
57bc03f14fSopenharmony_ci{
58bc03f14fSopenharmony_ci    MessageParcel data;
59bc03f14fSopenharmony_ci    data.WriteInterfaceToken(PasteboardObserverStub::GetDescriptor());
60bc03f14fSopenharmony_ci    MessageParcel reply;
61bc03f14fSopenharmony_ci    MessageOption option;
62bc03f14fSopenharmony_ci    std::make_shared<PasteboardObserver>()->OnRemoteRequest(
63bc03f14fSopenharmony_ci        static_cast<uint32_t>(PasteboardObserverInterfaceCode::ON_PASTE_BOARD_CHANGE), data, reply, option);
64bc03f14fSopenharmony_ci    return true;
65bc03f14fSopenharmony_ci}
66bc03f14fSopenharmony_ci
67bc03f14fSopenharmony_cibool FuzzPasteboardObserverOnPasteboardEventStub(const uint8_t *rawData, size_t size)
68bc03f14fSopenharmony_ci{
69bc03f14fSopenharmony_ci    if (rawData == nullptr || size < sizeof(int32_t)) {
70bc03f14fSopenharmony_ci        return true;
71bc03f14fSopenharmony_ci    }
72bc03f14fSopenharmony_ci
73bc03f14fSopenharmony_ci    MessageParcel data;
74bc03f14fSopenharmony_ci    data.WriteInterfaceToken(PasteboardObserverStub::GetDescriptor());
75bc03f14fSopenharmony_ci    MessageParcel reply;
76bc03f14fSopenharmony_ci    MessageOption option;
77bc03f14fSopenharmony_ci    int pos = 0;
78bc03f14fSopenharmony_ci    int32_t status = TypeCast<int32_t>(rawData, &pos);
79bc03f14fSopenharmony_ci    data.WriteString(std::string(reinterpret_cast<const char*>(rawData + pos), size - pos));
80bc03f14fSopenharmony_ci    data.WriteInt32(status);
81bc03f14fSopenharmony_ci    std::make_shared<PasteboardObserver>()->OnRemoteRequest(
82bc03f14fSopenharmony_ci        static_cast<uint32_t>(PasteboardObserverInterfaceCode::ON_PASTE_BOARD_EVENT), data, reply, option);
83bc03f14fSopenharmony_ci    return true;
84bc03f14fSopenharmony_ci}
85bc03f14fSopenharmony_ci} // namespace OHOS
86bc03f14fSopenharmony_ci/* Fuzzer entry point */
87bc03f14fSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
88bc03f14fSopenharmony_ci{
89bc03f14fSopenharmony_ci    /* Run your code on data */
90bc03f14fSopenharmony_ci    OHOS::FuzzPasteboardObserver(data, size);
91bc03f14fSopenharmony_ci    OHOS::FuzzPasteboardObserverOnPasteboardChangedStub(data, size);
92bc03f14fSopenharmony_ci    OHOS::FuzzPasteboardObserverOnPasteboardEventStub(data, size);
93bc03f14fSopenharmony_ci    return 0;
94bc03f14fSopenharmony_ci}
95