1e5d0e473Sopenharmony_ci/*
2e5d0e473Sopenharmony_ci * Copyright (c) 2023 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 "gsmsmssender_fuzzer.h"
17e5d0e473Sopenharmony_ci
18e5d0e473Sopenharmony_ci#define private public
19e5d0e473Sopenharmony_ci#define protected public
20e5d0e473Sopenharmony_ci
21e5d0e473Sopenharmony_ci#include "addsmstoken_fuzzer.h"
22e5d0e473Sopenharmony_ci#include "core_manager_inner.h"
23e5d0e473Sopenharmony_ci#include "delivery_short_message_callback_stub.h"
24e5d0e473Sopenharmony_ci#include "i_sms_service_interface.h"
25e5d0e473Sopenharmony_ci#include "send_short_message_callback_stub.h"
26e5d0e473Sopenharmony_ci#include "sms_service.h"
27e5d0e473Sopenharmony_ci
28e5d0e473Sopenharmony_ciusing namespace OHOS::Telephony;
29e5d0e473Sopenharmony_cinamespace OHOS {
30e5d0e473Sopenharmony_cistatic bool g_isInited = false;
31e5d0e473Sopenharmony_ciconstexpr int32_t SLOT_NUM = 2;
32e5d0e473Sopenharmony_cistatic int32_t STATUS_COUNT = 4;
33e5d0e473Sopenharmony_ciconstexpr int32_t TYPE_NUM = 6;
34e5d0e473Sopenharmony_ciconstexpr int32_t SLEEP_TIME_SECONDS = 2;
35e5d0e473Sopenharmony_ci
36e5d0e473Sopenharmony_cibool IsServiceInited()
37e5d0e473Sopenharmony_ci{
38e5d0e473Sopenharmony_ci    if (!g_isInited) {
39e5d0e473Sopenharmony_ci        CoreManagerInner::GetInstance().isInitAllObj_ = true;
40e5d0e473Sopenharmony_ci        DelayedSingleton<SmsService>::GetInstance()->registerToService_ = true;
41e5d0e473Sopenharmony_ci        DelayedSingleton<SmsService>::GetInstance()->WaitCoreServiceToInit();
42e5d0e473Sopenharmony_ci        DelayedSingleton<SmsService>::GetInstance()->OnStart();
43e5d0e473Sopenharmony_ci        if (DelayedSingleton<SmsService>::GetInstance()->GetServiceRunningState() ==
44e5d0e473Sopenharmony_ci            static_cast<int32_t>(Telephony::ServiceRunningState::STATE_RUNNING)) {
45e5d0e473Sopenharmony_ci            g_isInited = true;
46e5d0e473Sopenharmony_ci        }
47e5d0e473Sopenharmony_ci    }
48e5d0e473Sopenharmony_ci    return g_isInited;
49e5d0e473Sopenharmony_ci}
50e5d0e473Sopenharmony_ci
51e5d0e473Sopenharmony_civoid OnRemoteRequest(const uint8_t *data, size_t size)
52e5d0e473Sopenharmony_ci{
53e5d0e473Sopenharmony_ci    if (!IsServiceInited()) {
54e5d0e473Sopenharmony_ci        return;
55e5d0e473Sopenharmony_ci    }
56e5d0e473Sopenharmony_ci
57e5d0e473Sopenharmony_ci    MessageParcel dataParcel;
58e5d0e473Sopenharmony_ci    if (!dataParcel.WriteInterfaceToken(SmsInterfaceStub::GetDescriptor())) {
59e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("OnRemoteRequest WriteInterfaceToken is false");
60e5d0e473Sopenharmony_ci        return;
61e5d0e473Sopenharmony_ci    }
62e5d0e473Sopenharmony_ci
63e5d0e473Sopenharmony_ci    MessageParcel replyParcel;
64e5d0e473Sopenharmony_ci    MessageOption option(MessageOption::TF_SYNC);
65e5d0e473Sopenharmony_ci
66e5d0e473Sopenharmony_ci    dataParcel.WriteBuffer(data, size);
67e5d0e473Sopenharmony_ci    dataParcel.RewindRead(0);
68e5d0e473Sopenharmony_ci    uint32_t code = static_cast<uint32_t>(size);
69e5d0e473Sopenharmony_ci
70e5d0e473Sopenharmony_ci    DelayedSingleton<SmsService>::GetInstance()->OnRemoteRequest(code, dataParcel, replyParcel, option);
71e5d0e473Sopenharmony_ci    return;
72e5d0e473Sopenharmony_ci}
73e5d0e473Sopenharmony_ci
74e5d0e473Sopenharmony_civoid AddSimMessage(const uint8_t *data, size_t size)
75e5d0e473Sopenharmony_ci{
76e5d0e473Sopenharmony_ci    if (!IsServiceInited()) {
77e5d0e473Sopenharmony_ci        return;
78e5d0e473Sopenharmony_ci    }
79e5d0e473Sopenharmony_ci
80e5d0e473Sopenharmony_ci    MessageParcel dataParcel;
81e5d0e473Sopenharmony_ci    MessageParcel replyParcel;
82e5d0e473Sopenharmony_ci    MessageOption option(MessageOption::TF_SYNC);
83e5d0e473Sopenharmony_ci
84e5d0e473Sopenharmony_ci    std::string smsc(reinterpret_cast<const char *>(data), size);
85e5d0e473Sopenharmony_ci    std::string pdu(reinterpret_cast<const char *>(data), size);
86e5d0e473Sopenharmony_ci    auto smscU16 = Str8ToStr16(smsc);
87e5d0e473Sopenharmony_ci    auto pduU16 = Str8ToStr16(pdu);
88e5d0e473Sopenharmony_ci    int32_t slotId = static_cast<int32_t>(size % SLOT_NUM);
89e5d0e473Sopenharmony_ci    auto status = static_cast<ISmsServiceInterface::SimMessageStatus>(size % STATUS_COUNT);
90e5d0e473Sopenharmony_ci
91e5d0e473Sopenharmony_ci    dataParcel.WriteInt32(slotId);
92e5d0e473Sopenharmony_ci    dataParcel.WriteString16(smscU16);
93e5d0e473Sopenharmony_ci    dataParcel.WriteString16(pduU16);
94e5d0e473Sopenharmony_ci    dataParcel.WriteUint32(status);
95e5d0e473Sopenharmony_ci    dataParcel.RewindRead(0);
96e5d0e473Sopenharmony_ci    DelayedSingleton<SmsService>::GetInstance()->OnAddSimMessage(dataParcel, replyParcel, option);
97e5d0e473Sopenharmony_ci
98e5d0e473Sopenharmony_ci    std::shared_ptr<SmsInterfaceManager> interfaceManager = std::make_shared<SmsInterfaceManager>(slotId);
99e5d0e473Sopenharmony_ci    if (interfaceManager == nullptr) {
100e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("interfaceManager nullptr");
101e5d0e473Sopenharmony_ci        return;
102e5d0e473Sopenharmony_ci    }
103e5d0e473Sopenharmony_ci    interfaceManager->InitInterfaceManager();
104e5d0e473Sopenharmony_ci    interfaceManager->AddSimMessage(smsc, pdu, status);
105e5d0e473Sopenharmony_ci
106e5d0e473Sopenharmony_ci    std::shared_ptr<SmsMiscManager> smsMiscManager = std::make_shared<SmsMiscManager>(slotId);
107e5d0e473Sopenharmony_ci    if (smsMiscManager == nullptr) {
108e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("smsMiscManager nullptr");
109e5d0e473Sopenharmony_ci        return;
110e5d0e473Sopenharmony_ci    }
111e5d0e473Sopenharmony_ci    smsMiscManager->AddSimMessage(smsc, pdu, status);
112e5d0e473Sopenharmony_ci}
113e5d0e473Sopenharmony_ci
114e5d0e473Sopenharmony_civoid HasSmsCapability(const uint8_t *data, size_t size)
115e5d0e473Sopenharmony_ci{
116e5d0e473Sopenharmony_ci    if (!IsServiceInited()) {
117e5d0e473Sopenharmony_ci        return;
118e5d0e473Sopenharmony_ci    }
119e5d0e473Sopenharmony_ci
120e5d0e473Sopenharmony_ci    MessageParcel dataParcel;
121e5d0e473Sopenharmony_ci    MessageParcel replyParcel;
122e5d0e473Sopenharmony_ci    MessageOption option(MessageOption::TF_SYNC);
123e5d0e473Sopenharmony_ci
124e5d0e473Sopenharmony_ci    dataParcel.WriteBuffer(data, size);
125e5d0e473Sopenharmony_ci    dataParcel.RewindRead(0);
126e5d0e473Sopenharmony_ci    DelayedSingleton<SmsService>::GetInstance()->OnHasSmsCapability(dataParcel, replyParcel, option);
127e5d0e473Sopenharmony_ci
128e5d0e473Sopenharmony_ci    int32_t slotId = static_cast<int32_t>(size % SLOT_NUM);
129e5d0e473Sopenharmony_ci    std::shared_ptr<SmsInterfaceManager> interfaceManager = std::make_shared<SmsInterfaceManager>(slotId);
130e5d0e473Sopenharmony_ci    if (interfaceManager == nullptr) {
131e5d0e473Sopenharmony_ci        TELEPHONY_LOGE("interfaceManager nullptr error");
132e5d0e473Sopenharmony_ci        return;
133e5d0e473Sopenharmony_ci    }
134e5d0e473Sopenharmony_ci    interfaceManager->InitInterfaceManager();
135e5d0e473Sopenharmony_ci    interfaceManager->HasSmsCapability();
136e5d0e473Sopenharmony_ci}
137e5d0e473Sopenharmony_ci
138e5d0e473Sopenharmony_civoid SendSmsTest(const uint8_t *data, size_t size)
139e5d0e473Sopenharmony_ci{
140e5d0e473Sopenharmony_ci    std::function<void(std::shared_ptr<SmsSendIndexer>)> fun = nullptr;
141e5d0e473Sopenharmony_ci    int32_t slotId = static_cast<int32_t>(size % SLOT_NUM);
142e5d0e473Sopenharmony_ci    auto sender = std::make_shared<GsmSmsSender>(slotId, fun);
143e5d0e473Sopenharmony_ci    sender->Init();
144e5d0e473Sopenharmony_ci
145e5d0e473Sopenharmony_ci    std::string desAddr(reinterpret_cast<const char *>(data), size);
146e5d0e473Sopenharmony_ci    std::string scAddr(reinterpret_cast<const char *>(data), size);
147e5d0e473Sopenharmony_ci    std::string text(reinterpret_cast<const char *>(data), size);
148e5d0e473Sopenharmony_ci    const sptr<ISendShortMessageCallback> sendCallback =
149e5d0e473Sopenharmony_ci        iface_cast<ISendShortMessageCallback>(new SendShortMessageCallbackStub());
150e5d0e473Sopenharmony_ci    const sptr<IDeliveryShortMessageCallback> deliveryCallback =
151e5d0e473Sopenharmony_ci        iface_cast<IDeliveryShortMessageCallback>(new DeliveryShortMessageCallbackStub());
152e5d0e473Sopenharmony_ci    uint16_t dataBaseId = 1;
153e5d0e473Sopenharmony_ci    sender->TextBasedSmsDelivery(desAddr, scAddr, text, sendCallback, deliveryCallback, dataBaseId);
154e5d0e473Sopenharmony_ci    sender->DataBasedSmsDelivery(desAddr, scAddr, size, data, size, sendCallback, deliveryCallback);
155e5d0e473Sopenharmony_ci
156e5d0e473Sopenharmony_ci    std::vector<struct SplitInfo> cellsInfos;
157e5d0e473Sopenharmony_ci    struct SplitInfo cellInfo;
158e5d0e473Sopenharmony_ci    cellInfo.langId = static_cast<MSG_LANGUAGE_ID_T>(data[0]);
159e5d0e473Sopenharmony_ci    cellInfo.encodeType = static_cast<DataCodingScheme>(data[0] % TYPE_NUM);
160e5d0e473Sopenharmony_ci    cellInfo.encodeData.push_back(data[0]);
161e5d0e473Sopenharmony_ci    cellsInfos.push_back(cellInfo);
162e5d0e473Sopenharmony_ci    DataCodingScheme codingType = static_cast<DataCodingScheme>(data[0] % TYPE_NUM);
163e5d0e473Sopenharmony_ci    bool isStatusReport = (size % SLOT_NUM == 1);
164e5d0e473Sopenharmony_ci    GsmSmsMessage msg;
165e5d0e473Sopenharmony_ci    std::shared_ptr<struct SmsTpdu> tpdu =
166e5d0e473Sopenharmony_ci        msg.CreateDefaultSubmitSmsTpdu(desAddr, scAddr, text, isStatusReport, codingType);
167e5d0e473Sopenharmony_ci    sender->TextBasedSmsSplitDelivery(
168e5d0e473Sopenharmony_ci        text, text, cellsInfos, codingType, isStatusReport, tpdu, msg, sendCallback, deliveryCallback, dataBaseId);
169e5d0e473Sopenharmony_ci    sender->SendCallbackExceptionCase(sendCallback, text);
170e5d0e473Sopenharmony_ci
171e5d0e473Sopenharmony_ci    std::shared_ptr<SmsSendIndexer> smsIndexer =
172e5d0e473Sopenharmony_ci        std::make_shared<SmsSendIndexer>(desAddr, scAddr, text, sendCallback, deliveryCallback);
173e5d0e473Sopenharmony_ci    sender->SendSmsToRil(smsIndexer);
174e5d0e473Sopenharmony_ci    sender->ResendTextDelivery(smsIndexer);
175e5d0e473Sopenharmony_ci    sender->ResendDataDelivery(smsIndexer);
176e5d0e473Sopenharmony_ci    bool isMore = (size % SLOT_NUM == 0);
177e5d0e473Sopenharmony_ci    auto encodeInfo = msg.GetSubmitEncodeInfo(text, isMore);
178e5d0e473Sopenharmony_ci    sender->SetSendIndexerInfo(smsIndexer, encodeInfo, 1);
179e5d0e473Sopenharmony_ci    sender->ResendTextDelivery(smsIndexer);
180e5d0e473Sopenharmony_ci    sender->voiceServiceState_ = static_cast<int32_t>(size);
181e5d0e473Sopenharmony_ci    sender->imsSmsCfg_ = static_cast<int32_t>(size);
182e5d0e473Sopenharmony_ci    sender->SendSmsToRil(smsIndexer);
183e5d0e473Sopenharmony_ci    sender->SetPduInfo(smsIndexer, msg, isMore);
184e5d0e473Sopenharmony_ci}
185e5d0e473Sopenharmony_ci
186e5d0e473Sopenharmony_civoid SendSmsTest2(const uint8_t *data, size_t size)
187e5d0e473Sopenharmony_ci{
188e5d0e473Sopenharmony_ci    std::function<void(std::shared_ptr<SmsSendIndexer>)> fun = nullptr;
189e5d0e473Sopenharmony_ci    int32_t slotId = static_cast<int32_t>(size % SLOT_NUM);
190e5d0e473Sopenharmony_ci    auto sender = std::make_shared<GsmSmsSender>(slotId, fun);
191e5d0e473Sopenharmony_ci    sender->Init();
192e5d0e473Sopenharmony_ci    sender->RegisterSatelliteCallback();
193e5d0e473Sopenharmony_ci    sender->UnregisterSatelliteCallback();
194e5d0e473Sopenharmony_ci    std::string desAddr(reinterpret_cast<const char *>(data), size);
195e5d0e473Sopenharmony_ci    std::string scAddr(reinterpret_cast<const char *>(data), size);
196e5d0e473Sopenharmony_ci    std::string text(reinterpret_cast<const char *>(data), size);
197e5d0e473Sopenharmony_ci    const sptr<ISendShortMessageCallback> sendCallback =
198e5d0e473Sopenharmony_ci        iface_cast<ISendShortMessageCallback>(new SendShortMessageCallbackStub());
199e5d0e473Sopenharmony_ci    const sptr<IDeliveryShortMessageCallback> deliveryCallback =
200e5d0e473Sopenharmony_ci        iface_cast<IDeliveryShortMessageCallback>(new DeliveryShortMessageCallbackStub());
201e5d0e473Sopenharmony_ci    GsmSimMessageParam smsData;
202e5d0e473Sopenharmony_ci    std::string pdu(reinterpret_cast<const char *>(data), size);
203e5d0e473Sopenharmony_ci    smsData.refId = static_cast<int64_t>(size);
204e5d0e473Sopenharmony_ci    smsData.smscPdu = pdu;
205e5d0e473Sopenharmony_ci    smsData.pdu = pdu;
206e5d0e473Sopenharmony_ci    std::shared_ptr<SmsSendIndexer> smsIndexer =
207e5d0e473Sopenharmony_ci        std::make_shared<SmsSendIndexer>(desAddr, scAddr, text, sendCallback, deliveryCallback);
208e5d0e473Sopenharmony_ci    sender->SendCsSms(smsIndexer, smsData);
209e5d0e473Sopenharmony_ci    sender->SendSatelliteSms(smsIndexer, smsData);
210e5d0e473Sopenharmony_ci    sender->SendImsSms(smsIndexer, smsData);
211e5d0e473Sopenharmony_ci    bool isSupported;
212e5d0e473Sopenharmony_ci    sender->IsImsSmsSupported(slotId, isSupported);
213e5d0e473Sopenharmony_ci    InnerEvent::Pointer event = InnerEvent::Get(static_cast<int32_t>(size));
214e5d0e473Sopenharmony_ci    sender->StatusReportAnalysis(event);
215e5d0e473Sopenharmony_ci    event = InnerEvent::Get(static_cast<int32_t>(size));
216e5d0e473Sopenharmony_ci    sender->StatusReportGetImsSms(event);
217e5d0e473Sopenharmony_ci}
218e5d0e473Sopenharmony_ci
219e5d0e473Sopenharmony_civoid DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size)
220e5d0e473Sopenharmony_ci{
221e5d0e473Sopenharmony_ci    if (data == nullptr || size == 0) {
222e5d0e473Sopenharmony_ci        return;
223e5d0e473Sopenharmony_ci    }
224e5d0e473Sopenharmony_ci
225e5d0e473Sopenharmony_ci    OnRemoteRequest(data, size);
226e5d0e473Sopenharmony_ci    AddSimMessage(data, size);
227e5d0e473Sopenharmony_ci    HasSmsCapability(data, size);
228e5d0e473Sopenharmony_ci    SendSmsTest(data, size);
229e5d0e473Sopenharmony_ci    SendSmsTest2(data, size);
230e5d0e473Sopenharmony_ci    DelayedSingleton<ImsSmsClient>::GetInstance()->Init();
231e5d0e473Sopenharmony_ci    DelayedSingleton<ImsSmsClient>::GetInstance()->UnInit();
232e5d0e473Sopenharmony_ci    DelayedSingleton<ImsSmsClient>::DestroyInstance();
233e5d0e473Sopenharmony_ci    sleep(SLEEP_TIME_SECONDS);
234e5d0e473Sopenharmony_ci    DelayedSingleton<SmsService>::DestroyInstance();
235e5d0e473Sopenharmony_ci}
236e5d0e473Sopenharmony_ci} // namespace OHOS
237e5d0e473Sopenharmony_ci
238e5d0e473Sopenharmony_ci/* Fuzzer entry point */
239e5d0e473Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
240e5d0e473Sopenharmony_ci{
241e5d0e473Sopenharmony_ci    /* Run your code on data */
242e5d0e473Sopenharmony_ci    OHOS::AddSmsTokenFuzzer token;
243e5d0e473Sopenharmony_ci    OHOS::DoSomethingInterestingWithMyAPI(data, size);
244e5d0e473Sopenharmony_ci    return 0;
245e5d0e473Sopenharmony_ci}
246