1e5d0e473Sopenharmony_ci/*
2e5d0e473Sopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3e5d0e473Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e5d0e473Sopenharmony_ci * you may not use this file except in compliance with the License.
5e5d0e473Sopenharmony_ci * You may obtain a copy of the License at
6e5d0e473Sopenharmony_ci *
7e5d0e473Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e5d0e473Sopenharmony_ci *
9e5d0e473Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e5d0e473Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e5d0e473Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e5d0e473Sopenharmony_ci * See the License for the specific language governing permissions and
13e5d0e473Sopenharmony_ci * limitations under the License.
14e5d0e473Sopenharmony_ci */
15e5d0e473Sopenharmony_ci
16e5d0e473Sopenharmony_ci#include "smsrecvitem_fuzzer.h"
17e5d0e473Sopenharmony_ci
18e5d0e473Sopenharmony_ci#ifdef GTEST_API_
19e5d0e473Sopenharmony_ci#define private public
20e5d0e473Sopenharmony_ci#define protected public
21e5d0e473Sopenharmony_ci#endif
22e5d0e473Sopenharmony_ci
23e5d0e473Sopenharmony_ci#include "addsmstoken_fuzzer.h"
24e5d0e473Sopenharmony_ci#include "cdma_sms_message.h"
25e5d0e473Sopenharmony_ci#include "common_event.h"
26e5d0e473Sopenharmony_ci#include "common_event_manager.h"
27e5d0e473Sopenharmony_ci#include "common_event_support.h"
28e5d0e473Sopenharmony_ci#include "delivery_short_message_callback_stub.h"
29e5d0e473Sopenharmony_ci#include "send_short_message_callback_stub.h"
30e5d0e473Sopenharmony_ci#include "sms_broadcast_subscriber_receiver.h"
31e5d0e473Sopenharmony_ci#include "sms_interface_manager.h"
32e5d0e473Sopenharmony_ci#include "sms_receive_reliability_handler.h"
33e5d0e473Sopenharmony_ci#include "string_utils.h"
34e5d0e473Sopenharmony_ci
35e5d0e473Sopenharmony_ciusing namespace OHOS::Telephony;
36e5d0e473Sopenharmony_cinamespace OHOS {
37e5d0e473Sopenharmony_ciusing namespace EventFwk;
38e5d0e473Sopenharmony_ciconstexpr int32_t SLOT_NUM = 2;
39e5d0e473Sopenharmony_cibool g_flag = false;
40e5d0e473Sopenharmony_ci
41e5d0e473Sopenharmony_civoid DoRecvItemsTest(const uint8_t *data, size_t size, std::shared_ptr<SmsReceiveManager> smsReceiveManager)
42e5d0e473Sopenharmony_ci{
43e5d0e473Sopenharmony_ci    const std::shared_ptr<GsmSmsMessage> smsGsmMessage = std::make_shared<GsmSmsMessage>();
44e5d0e473Sopenharmony_ci    const std::shared_ptr<CdmaSmsMessage> smsCdmaMessage = std::make_shared<CdmaSmsMessage>();
45e5d0e473Sopenharmony_ci    smsReceiveManager->gsmSmsReceiveHandler_->HandleReceivedSms(smsGsmMessage);
46e5d0e473Sopenharmony_ci    smsReceiveManager->cdmaSmsReceiveHandler_->HandleReceivedSms(smsCdmaMessage);
47e5d0e473Sopenharmony_ci    smsReceiveManager->gsmSmsReceiveHandler_->HandleSmsByType(smsGsmMessage);
48e5d0e473Sopenharmony_ci    smsReceiveManager->cdmaSmsReceiveHandler_->HandleSmsByType(smsCdmaMessage);
49e5d0e473Sopenharmony_ci
50e5d0e473Sopenharmony_ci    std::int32_t result = static_cast<int32_t>(size);
51e5d0e473Sopenharmony_ci    smsReceiveManager->gsmSmsReceiveHandler_->ReplySmsToSmsc(result);
52e5d0e473Sopenharmony_ci    smsReceiveManager->cdmaSmsReceiveHandler_->ReplySmsToSmsc(result);
53e5d0e473Sopenharmony_ci
54e5d0e473Sopenharmony_ci    const std::shared_ptr<SmsReceiveIndexer> smsReceiveIndexer = std::make_shared<SmsReceiveIndexer>();
55e5d0e473Sopenharmony_ci    smsReceiveManager->gsmSmsReceiveHandler_->CombineMessagePart(smsReceiveIndexer);
56e5d0e473Sopenharmony_ci    smsReceiveManager->cdmaSmsReceiveHandler_->CombineMessagePart(smsReceiveIndexer);
57e5d0e473Sopenharmony_ci
58e5d0e473Sopenharmony_ci    smsReceiveManager->gsmSmsReceiveHandler_->IsRepeatedMessagePart(smsReceiveIndexer);
59e5d0e473Sopenharmony_ci    smsReceiveManager->cdmaSmsReceiveHandler_->IsRepeatedMessagePart(smsReceiveIndexer);
60e5d0e473Sopenharmony_ci
61e5d0e473Sopenharmony_ci    int32_t slotId = static_cast<int32_t>(size % SLOT_NUM);
62e5d0e473Sopenharmony_ci    auto reliabilityHandler = std::make_shared<SmsReceiveReliabilityHandler>(slotId);
63e5d0e473Sopenharmony_ci    if (reliabilityHandler == nullptr) {
64e5d0e473Sopenharmony_ci        return;
65e5d0e473Sopenharmony_ci    }
66e5d0e473Sopenharmony_ci    reliabilityHandler->DeleteMessageFormDb(smsReceiveIndexer->GetMsgRefId());
67e5d0e473Sopenharmony_ci
68e5d0e473Sopenharmony_ci    std::vector<SmsReceiveIndexer> dbIndexers;
69e5d0e473Sopenharmony_ci    std::string strData(reinterpret_cast<const char *>(data), size);
70e5d0e473Sopenharmony_ci    auto indexer = SmsReceiveIndexer(StringUtils::HexToByteVector(strData), size, size, size % SLOT_NUM, strData,
71e5d0e473Sopenharmony_ci        strData, size, size, size, size % SLOT_NUM, strData);
72e5d0e473Sopenharmony_ci
73e5d0e473Sopenharmony_ci    dbIndexers.push_back(indexer);
74e5d0e473Sopenharmony_ci    indexer = SmsReceiveIndexer(
75e5d0e473Sopenharmony_ci        StringUtils::HexToByteVector(strData), size, size, size % SLOT_NUM, size % SLOT_NUM, strData, strData, strData);
76e5d0e473Sopenharmony_ci    dbIndexers.push_back(indexer);
77e5d0e473Sopenharmony_ci    reliabilityHandler->CheckUnReceiveWapPush(dbIndexers);
78e5d0e473Sopenharmony_ci
79e5d0e473Sopenharmony_ci    std::shared_ptr<std::vector<std::string>> userDataRaws = std::make_shared<std::vector<std::string>>();
80e5d0e473Sopenharmony_ci    userDataRaws->push_back(strData);
81e5d0e473Sopenharmony_ci
82e5d0e473Sopenharmony_ci    int32_t pages = 0;
83e5d0e473Sopenharmony_ci    reliabilityHandler->GetWapPushUserDataSinglePage(indexer, userDataRaws);
84e5d0e473Sopenharmony_ci    reliabilityHandler->GetWapPushUserDataMultipage(pages, dbIndexers, size, userDataRaws);
85e5d0e473Sopenharmony_ci    reliabilityHandler->ReadyDecodeWapPushUserData(indexer, userDataRaws);
86e5d0e473Sopenharmony_ci    reliabilityHandler->GetSmsUserDataMultipage(pages, dbIndexers, size, userDataRaws);
87e5d0e473Sopenharmony_ci    reliabilityHandler->ReadySendSmsBroadcast(indexer, userDataRaws);
88e5d0e473Sopenharmony_ci    reliabilityHandler->DeleteMessageFormDb(size, size);
89e5d0e473Sopenharmony_ci    reliabilityHandler->RemoveBlockedSms(dbIndexers);
90e5d0e473Sopenharmony_ci
91e5d0e473Sopenharmony_ci    std::shared_ptr<SmsReceiveIndexer> indexerPtr =
92e5d0e473Sopenharmony_ci        std::make_shared<SmsReceiveIndexer>(StringUtils::HexToByteVector(strData), size, size, size % SLOT_NUM, strData,
93e5d0e473Sopenharmony_ci            strData, size, size, size, size % SLOT_NUM, strData);
94e5d0e473Sopenharmony_ci    if (indexerPtr == nullptr) {
95e5d0e473Sopenharmony_ci        return;
96e5d0e473Sopenharmony_ci    }
97e5d0e473Sopenharmony_ci    reliabilityHandler->SendBroadcast(indexerPtr, userDataRaws);
98e5d0e473Sopenharmony_ci}
99e5d0e473Sopenharmony_ci
100e5d0e473Sopenharmony_civoid DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size)
101e5d0e473Sopenharmony_ci{
102e5d0e473Sopenharmony_ci    if (data == nullptr || size == 0) {
103e5d0e473Sopenharmony_ci        return;
104e5d0e473Sopenharmony_ci    }
105e5d0e473Sopenharmony_ci
106e5d0e473Sopenharmony_ci    if (g_flag) {
107e5d0e473Sopenharmony_ci        return;
108e5d0e473Sopenharmony_ci    }
109e5d0e473Sopenharmony_ci    g_flag = true;
110e5d0e473Sopenharmony_ci
111e5d0e473Sopenharmony_ci    int32_t slotId = static_cast<int32_t>(size % SLOT_NUM);
112e5d0e473Sopenharmony_ci    auto smsInterfaceManager = std::make_shared<SmsInterfaceManager>(slotId);
113e5d0e473Sopenharmony_ci    if (smsInterfaceManager == nullptr) {
114e5d0e473Sopenharmony_ci        return;
115e5d0e473Sopenharmony_ci    }
116e5d0e473Sopenharmony_ci
117e5d0e473Sopenharmony_ci    smsInterfaceManager->InitInterfaceManager();
118e5d0e473Sopenharmony_ci    auto smsReceiveManager = std::make_shared<SmsReceiveManager>(slotId);
119e5d0e473Sopenharmony_ci    if (smsReceiveManager == nullptr) {
120e5d0e473Sopenharmony_ci        return;
121e5d0e473Sopenharmony_ci    }
122e5d0e473Sopenharmony_ci    smsReceiveManager->Init();
123e5d0e473Sopenharmony_ci    if (smsReceiveManager->gsmSmsReceiveHandler_ == nullptr || smsReceiveManager->cdmaSmsReceiveHandler_ == nullptr) {
124e5d0e473Sopenharmony_ci        return;
125e5d0e473Sopenharmony_ci    }
126e5d0e473Sopenharmony_ci    smsReceiveManager->gsmSmsReceiveHandler_->Init();
127e5d0e473Sopenharmony_ci    smsReceiveManager->cdmaSmsReceiveHandler_->Init();
128e5d0e473Sopenharmony_ci
129e5d0e473Sopenharmony_ci    std::int32_t eventId = static_cast<int32_t>(size);
130e5d0e473Sopenharmony_ci    std::int64_t refId = static_cast<int64_t>(size);
131e5d0e473Sopenharmony_ci
132e5d0e473Sopenharmony_ci    AppExecFwk::InnerEvent::Pointer response = AppExecFwk::InnerEvent::Get(eventId, refId);
133e5d0e473Sopenharmony_ci    smsReceiveManager->gsmSmsReceiveHandler_->ProcessEvent(response);
134e5d0e473Sopenharmony_ci    smsReceiveManager->cdmaSmsReceiveHandler_->ProcessEvent(response);
135e5d0e473Sopenharmony_ci
136e5d0e473Sopenharmony_ci    MatchingSkills smsSkills;
137e5d0e473Sopenharmony_ci    std::string strData(reinterpret_cast<const char *>(data), size);
138e5d0e473Sopenharmony_ci    smsSkills.AddEvent(strData);
139e5d0e473Sopenharmony_ci    CommonEventSubscribeInfo smsSubscriberInfo(smsSkills);
140e5d0e473Sopenharmony_ci    std::string addr(reinterpret_cast<const char *>(data), size);
141e5d0e473Sopenharmony_ci    auto smsReceiver = std::make_shared<SmsBroadcastSubscriberReceiver>(smsSubscriberInfo, nullptr, size, size, addr);
142e5d0e473Sopenharmony_ci    CommonEventData comData;
143e5d0e473Sopenharmony_ci    smsReceiver->OnReceiveEvent(comData);
144e5d0e473Sopenharmony_ci
145e5d0e473Sopenharmony_ci    DoRecvItemsTest(data, size, smsReceiveManager);
146e5d0e473Sopenharmony_ci}
147e5d0e473Sopenharmony_ci} // namespace OHOS
148e5d0e473Sopenharmony_ci
149e5d0e473Sopenharmony_ci/* Fuzzer entry point */
150e5d0e473Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
151e5d0e473Sopenharmony_ci{
152e5d0e473Sopenharmony_ci    /* Run your code on data */
153e5d0e473Sopenharmony_ci    OHOS::AddSmsTokenFuzzer token;
154e5d0e473Sopenharmony_ci    OHOS::DoSomethingInterestingWithMyAPI(data, size);
155e5d0e473Sopenharmony_ci    return 0;
156e5d0e473Sopenharmony_ci}
157