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 "gsmsmsparamcodec_fuzzer.h"
17e5d0e473Sopenharmony_ci
18e5d0e473Sopenharmony_ci#define private public
19e5d0e473Sopenharmony_ci#include "addsmstoken_fuzzer.h"
20e5d0e473Sopenharmony_ci#include "core_manager_inner.h"
21e5d0e473Sopenharmony_ci#include "i_sms_service_interface.h"
22e5d0e473Sopenharmony_ci#include "sms_service.h"
23e5d0e473Sopenharmony_ci
24e5d0e473Sopenharmony_ciusing namespace OHOS::Telephony;
25e5d0e473Sopenharmony_cinamespace OHOS {
26e5d0e473Sopenharmony_cistatic bool g_isInited = false;
27e5d0e473Sopenharmony_cistatic constexpr int32_t UINT8_COUNT = 256;
28e5d0e473Sopenharmony_cistatic constexpr int32_t CODE_SCHEME_SIZE = 6;
29e5d0e473Sopenharmony_cistatic constexpr int32_t TIME_FORMAT_SIZE = 3;
30e5d0e473Sopenharmony_ciconstexpr int32_t SLEEP_TIME_SECONDS = 1;
31e5d0e473Sopenharmony_ci
32e5d0e473Sopenharmony_cibool IsServiceInited()
33e5d0e473Sopenharmony_ci{
34e5d0e473Sopenharmony_ci    if (!g_isInited) {
35e5d0e473Sopenharmony_ci        CoreManagerInner::GetInstance().isInitAllObj_ = true;
36e5d0e473Sopenharmony_ci        DelayedSingleton<SmsService>::GetInstance()->registerToService_ = true;
37e5d0e473Sopenharmony_ci        DelayedSingleton<SmsService>::GetInstance()->WaitCoreServiceToInit();
38e5d0e473Sopenharmony_ci        DelayedSingleton<SmsService>::GetInstance()->OnStart();
39e5d0e473Sopenharmony_ci        if (DelayedSingleton<SmsService>::GetInstance()->GetServiceRunningState() ==
40e5d0e473Sopenharmony_ci            static_cast<int32_t>(Telephony::ServiceRunningState::STATE_RUNNING)) {
41e5d0e473Sopenharmony_ci            g_isInited = true;
42e5d0e473Sopenharmony_ci        }
43e5d0e473Sopenharmony_ci    }
44e5d0e473Sopenharmony_ci    return g_isInited;
45e5d0e473Sopenharmony_ci}
46e5d0e473Sopenharmony_ci
47e5d0e473Sopenharmony_civoid T7BitSubmitSms()
48e5d0e473Sopenharmony_ci{
49e5d0e473Sopenharmony_ci    std::vector<unsigned char> pdu = StringUtils::HexToByteVector("21010B818176251308F4000002C130");
50e5d0e473Sopenharmony_ci    ShortMessage *message = new ShortMessage();
51e5d0e473Sopenharmony_ci    if (message == nullptr) {
52e5d0e473Sopenharmony_ci        return;
53e5d0e473Sopenharmony_ci    }
54e5d0e473Sopenharmony_ci    ShortMessage::CreateMessage(pdu, u"3gpp", *message);
55e5d0e473Sopenharmony_ci    delete message;
56e5d0e473Sopenharmony_ci}
57e5d0e473Sopenharmony_ci
58e5d0e473Sopenharmony_civoid Ucs2SubmitSms()
59e5d0e473Sopenharmony_ci{
60e5d0e473Sopenharmony_ci    std::vector<unsigned char> pdu = StringUtils::HexToByteVector("21020B818176251308F40008046D4B8BD5");
61e5d0e473Sopenharmony_ci    ShortMessage *message = new ShortMessage();
62e5d0e473Sopenharmony_ci    if (message == nullptr) {
63e5d0e473Sopenharmony_ci        return;
64e5d0e473Sopenharmony_ci    }
65e5d0e473Sopenharmony_ci    ShortMessage::CreateMessage(pdu, u"3gpp", *message);
66e5d0e473Sopenharmony_ci    delete message;
67e5d0e473Sopenharmony_ci}
68e5d0e473Sopenharmony_ci
69e5d0e473Sopenharmony_civoid T7BitDeliverySms()
70e5d0e473Sopenharmony_ci{
71e5d0e473Sopenharmony_ci    std::vector<unsigned char> pdu =
72e5d0e473Sopenharmony_ci        StringUtils::HexToByteVector("0891683108200075F4240D91688129562983F600001240800102142302C130");
73e5d0e473Sopenharmony_ci    ShortMessage *message = new ShortMessage();
74e5d0e473Sopenharmony_ci    if (message == nullptr) {
75e5d0e473Sopenharmony_ci        return;
76e5d0e473Sopenharmony_ci    }
77e5d0e473Sopenharmony_ci    ShortMessage::CreateMessage(pdu, u"3gpp", *message);
78e5d0e473Sopenharmony_ci    delete message;
79e5d0e473Sopenharmony_ci}
80e5d0e473Sopenharmony_ci
81e5d0e473Sopenharmony_civoid Ucs2DeliverySms()
82e5d0e473Sopenharmony_ci{
83e5d0e473Sopenharmony_ci    std::vector<unsigned char> pdu =
84e5d0e473Sopenharmony_ci        StringUtils::HexToByteVector("0891683110206005F0240DA1688176251308F4000832500381459323044F60597D");
85e5d0e473Sopenharmony_ci    ShortMessage *message = new ShortMessage();
86e5d0e473Sopenharmony_ci    if (message == nullptr) {
87e5d0e473Sopenharmony_ci        return;
88e5d0e473Sopenharmony_ci    }
89e5d0e473Sopenharmony_ci    ShortMessage::CreateMessage(pdu, u"3gpp", *message);
90e5d0e473Sopenharmony_ci    delete message;
91e5d0e473Sopenharmony_ci}
92e5d0e473Sopenharmony_ci
93e5d0e473Sopenharmony_civoid StatusReportSms()
94e5d0e473Sopenharmony_ci{
95e5d0e473Sopenharmony_ci    std::vector<unsigned char> pdu =
96e5d0e473Sopenharmony_ci        StringUtils::HexToByteVector("0891683110808805F006510B818176251308F4325013113382233250131143802300");
97e5d0e473Sopenharmony_ci
98e5d0e473Sopenharmony_ci    ShortMessage *message = new ShortMessage();
99e5d0e473Sopenharmony_ci    if (message == nullptr) {
100e5d0e473Sopenharmony_ci        return;
101e5d0e473Sopenharmony_ci    }
102e5d0e473Sopenharmony_ci    ShortMessage::CreateMessage(pdu, u"3gpp", *message);
103e5d0e473Sopenharmony_ci    delete message;
104e5d0e473Sopenharmony_ci}
105e5d0e473Sopenharmony_ci
106e5d0e473Sopenharmony_civoid MultiPageUcs2Sms()
107e5d0e473Sopenharmony_ci{
108e5d0e473Sopenharmony_ci    std::vector<unsigned char> pdu = StringUtils::HexToByteVector(
109e5d0e473Sopenharmony_ci        "0891683110205005F06005A00110F00008325052214182238C050003D3030200310030002E0063006E002F007100410053004B00380020"
110e5d0e473Sopenharmony_ci        "FF0C4EE5514D6B216708521D6263966476F851738D397528540E5F7154CD60A876846B635E384F7F752830024E2D56FD"
111e5d0e473Sopenharmony_ci        "8054901A0041005000507545723D65B04F539A8CFF0C70B951FB0020002000680074007400700073003A002F002F0075002E0031003000"
112e5d0e473Sopenharmony_ci        "3000310030002E");
113e5d0e473Sopenharmony_ci
114e5d0e473Sopenharmony_ci    ShortMessage *message = new ShortMessage();
115e5d0e473Sopenharmony_ci    if (message == nullptr) {
116e5d0e473Sopenharmony_ci        return;
117e5d0e473Sopenharmony_ci    }
118e5d0e473Sopenharmony_ci    ShortMessage::CreateMessage(pdu, u"3gpp", *message);
119e5d0e473Sopenharmony_ci    delete message;
120e5d0e473Sopenharmony_ci}
121e5d0e473Sopenharmony_ci
122e5d0e473Sopenharmony_civoid WapPushSms()
123e5d0e473Sopenharmony_ci{
124e5d0e473Sopenharmony_ci    std::vector<unsigned char> pdu = StringUtils::HexToByteVector(
125e5d0e473Sopenharmony_ci        "0891683110205005F0640BA10156455102F1000432109261715023880605040B8423F04C06246170706C69636174696F6E2F766E642E77"
126e5d0e473Sopenharmony_ci        "61702E6D6D732D6D65737361676500B487AF848C829850765030303031365A645430008D9089178031363630373532313930382F545950"
127e5d0e473Sopenharmony_ci        "453D504C4D4E008A808E040001298D"
128e5d0e473Sopenharmony_ci        "8805810303F47B83687474703A2F2F31302E3132332E31382E38303A3138302F76564F455F3000");
129e5d0e473Sopenharmony_ci
130e5d0e473Sopenharmony_ci    ShortMessage *message = new ShortMessage();
131e5d0e473Sopenharmony_ci    if (message == nullptr) {
132e5d0e473Sopenharmony_ci        return;
133e5d0e473Sopenharmony_ci    }
134e5d0e473Sopenharmony_ci    ShortMessage::CreateMessage(pdu, u"3gpp", *message);
135e5d0e473Sopenharmony_ci    delete message;
136e5d0e473Sopenharmony_ci}
137e5d0e473Sopenharmony_ci
138e5d0e473Sopenharmony_civoid DataSmsDeliverySms()
139e5d0e473Sopenharmony_ci{
140e5d0e473Sopenharmony_ci    std::vector<unsigned char> pdu = StringUtils::HexToByteVector(
141e5d0e473Sopenharmony_ci        "0891683110808805F0640D91686106571209F80000327030021205231306050400640000E8329BFD06DDDF723619");
142e5d0e473Sopenharmony_ci
143e5d0e473Sopenharmony_ci    ShortMessage *message = new ShortMessage();
144e5d0e473Sopenharmony_ci    if (message == nullptr) {
145e5d0e473Sopenharmony_ci        return;
146e5d0e473Sopenharmony_ci    }
147e5d0e473Sopenharmony_ci    ShortMessage::CreateMessage(pdu, u"3gpp", *message);
148e5d0e473Sopenharmony_ci    delete message;
149e5d0e473Sopenharmony_ci}
150e5d0e473Sopenharmony_ci
151e5d0e473Sopenharmony_civoid Smsc00DeliverySms()
152e5d0e473Sopenharmony_ci{
153e5d0e473Sopenharmony_ci    std::vector<unsigned char> pdu = StringUtils::HexToByteVector("00240D91689141468496F600001270721142432302B319");
154e5d0e473Sopenharmony_ci
155e5d0e473Sopenharmony_ci    ShortMessage *message = new ShortMessage();
156e5d0e473Sopenharmony_ci    if (message == nullptr) {
157e5d0e473Sopenharmony_ci        return;
158e5d0e473Sopenharmony_ci    }
159e5d0e473Sopenharmony_ci    ShortMessage::CreateMessage(pdu, u"3gpp", *message);
160e5d0e473Sopenharmony_ci    delete message;
161e5d0e473Sopenharmony_ci}
162e5d0e473Sopenharmony_ci
163e5d0e473Sopenharmony_civoid MultiPage7bitSms()
164e5d0e473Sopenharmony_ci{
165e5d0e473Sopenharmony_ci    std::vector<unsigned char> pdu = StringUtils::HexToByteVector(
166e5d0e473Sopenharmony_ci        "0891683110206005F0640DA1688176251308F4000032806190051123A00500030F020162B1582C168BC562B1582C168BC562B2198D369B"
167e5d0e473Sopenharmony_ci        "CD68B5582C269BCD62B1582C168BC562B1582C168BC562B1582C168BC562B1582C168BC562B1582C168BC562B1582C168BC562B1582C16"
168e5d0e473Sopenharmony_ci        "8BC562B1582C168BC562B1582C168BC562B1582C168BC562B1582C168BC562B1582C168BC540B1582C168BC562B1582C168BC56231D98C"
169e5d0e473Sopenharmony_ci        "469BCD66");
170e5d0e473Sopenharmony_ci
171e5d0e473Sopenharmony_ci    ShortMessage *message = new ShortMessage();
172e5d0e473Sopenharmony_ci    if (message == nullptr) {
173e5d0e473Sopenharmony_ci        return;
174e5d0e473Sopenharmony_ci    }
175e5d0e473Sopenharmony_ci    ShortMessage::CreateMessage(pdu, u"3gpp", *message);
176e5d0e473Sopenharmony_ci    delete message;
177e5d0e473Sopenharmony_ci}
178e5d0e473Sopenharmony_ci
179e5d0e473Sopenharmony_civoid T7BitOtherSubmitSms()
180e5d0e473Sopenharmony_ci{
181e5d0e473Sopenharmony_ci    std::vector<unsigned char> pdu = StringUtils::HexToByteVector("00010005910110F0000003E17018");
182e5d0e473Sopenharmony_ci    ShortMessage *message = new ShortMessage();
183e5d0e473Sopenharmony_ci    if (message == nullptr) {
184e5d0e473Sopenharmony_ci        return;
185e5d0e473Sopenharmony_ci    }
186e5d0e473Sopenharmony_ci    ShortMessage::CreateMessage(pdu, u"3gpp", *message);
187e5d0e473Sopenharmony_ci    delete message;
188e5d0e473Sopenharmony_ci}
189e5d0e473Sopenharmony_ci
190e5d0e473Sopenharmony_civoid EncodePduItemsTest(const uint8_t *data, size_t size)
191e5d0e473Sopenharmony_ci{
192e5d0e473Sopenharmony_ci    if (!IsServiceInited()) {
193e5d0e473Sopenharmony_ci        return;
194e5d0e473Sopenharmony_ci    }
195e5d0e473Sopenharmony_ci    auto codec = std::make_shared<GsmSmsParamCodec>();
196e5d0e473Sopenharmony_ci    AddressNumber *pAddress = new AddressNumber();
197e5d0e473Sopenharmony_ci    std::string addrParam(reinterpret_cast<const char *>(data), size);
198e5d0e473Sopenharmony_ci    codec->EncodeAddressPdu(pAddress, addrParam);
199e5d0e473Sopenharmony_ci
200e5d0e473Sopenharmony_ci    uint8_t decodeData[UINT8_COUNT + 1];
201e5d0e473Sopenharmony_ci    uint16_t len = UINT8_COUNT < size ? UINT8_COUNT : size;
202e5d0e473Sopenharmony_ci    if (memcpy_s(decodeData, len, data, len) != EOK) {
203e5d0e473Sopenharmony_ci        return;
204e5d0e473Sopenharmony_ci    }
205e5d0e473Sopenharmony_ci    codec->EncodeSmscPdu(addrParam.c_str(), decodeData);
206e5d0e473Sopenharmony_ci    pAddress->address[0] = data[0];
207e5d0e473Sopenharmony_ci    codec->EncodeAddressPdu(pAddress, addrParam);
208e5d0e473Sopenharmony_ci    codec->EncodeSmscPdu(pAddress, decodeData, len);
209e5d0e473Sopenharmony_ci    codec->EncodeAddressPdu(nullptr, addrParam);
210e5d0e473Sopenharmony_ci    codec->EncodeSmscPdu(nullptr, decodeData);
211e5d0e473Sopenharmony_ci    codec->EncodeSmscPdu(nullptr, decodeData, len);
212e5d0e473Sopenharmony_ci
213e5d0e473Sopenharmony_ci    std::string timeParam(reinterpret_cast<const char *>(data), size);
214e5d0e473Sopenharmony_ci    codec->EncodeTimePdu(nullptr, timeParam);
215e5d0e473Sopenharmony_ci    SmsTimeStamp *stamp = new SmsTimeStamp();
216e5d0e473Sopenharmony_ci    stamp->format = static_cast<SmsTimeFormat>(size % TIME_FORMAT_SIZE);
217e5d0e473Sopenharmony_ci    stamp->time.absolute.timeZone = size;
218e5d0e473Sopenharmony_ci    codec->EncodeTimePdu(stamp, timeParam);
219e5d0e473Sopenharmony_ci
220e5d0e473Sopenharmony_ci    SmsDcs *dcs = new SmsDcs();
221e5d0e473Sopenharmony_ci    std::string dcsParam(reinterpret_cast<const char *>(data), size);
222e5d0e473Sopenharmony_ci    codec->EncodeDCS(nullptr, dcsParam);
223e5d0e473Sopenharmony_ci    dcs->codingGroup = static_cast<PduSchemeGroup>(size % CODE_SCHEME_SIZE);
224e5d0e473Sopenharmony_ci    dcs->codingScheme = static_cast<DataCodingScheme>(size % CODE_SCHEME_SIZE);
225e5d0e473Sopenharmony_ci    codec->EncodeDCS(dcs, dcsParam);
226e5d0e473Sopenharmony_ci}
227e5d0e473Sopenharmony_ci
228e5d0e473Sopenharmony_civoid DecodePduItemsTest(const uint8_t *data, size_t size)
229e5d0e473Sopenharmony_ci{
230e5d0e473Sopenharmony_ci    if (!IsServiceInited()) {
231e5d0e473Sopenharmony_ci        return;
232e5d0e473Sopenharmony_ci    }
233e5d0e473Sopenharmony_ci    T7BitSubmitSms();
234e5d0e473Sopenharmony_ci    Ucs2SubmitSms();
235e5d0e473Sopenharmony_ci    T7BitDeliverySms();
236e5d0e473Sopenharmony_ci    Ucs2DeliverySms();
237e5d0e473Sopenharmony_ci    StatusReportSms();
238e5d0e473Sopenharmony_ci    MultiPageUcs2Sms();
239e5d0e473Sopenharmony_ci    WapPushSms();
240e5d0e473Sopenharmony_ci    DataSmsDeliverySms();
241e5d0e473Sopenharmony_ci    Smsc00DeliverySms();
242e5d0e473Sopenharmony_ci    MultiPage7bitSms();
243e5d0e473Sopenharmony_ci    T7BitOtherSubmitSms();
244e5d0e473Sopenharmony_ci    auto codec = std::make_shared<GsmSmsParamCodec>();
245e5d0e473Sopenharmony_ci    std::string pdu(reinterpret_cast<const char *>(data), size);
246e5d0e473Sopenharmony_ci    SmsReadBuffer buffer(pdu);
247e5d0e473Sopenharmony_ci    AddressNumber *address = new AddressNumber();
248e5d0e473Sopenharmony_ci    codec->DecodeAddressPdu(buffer, address);
249e5d0e473Sopenharmony_ci
250e5d0e473Sopenharmony_ci    SmsTimeStamp *stamp = new SmsTimeStamp();
251e5d0e473Sopenharmony_ci    codec->DecodeTimePdu(buffer, stamp);
252e5d0e473Sopenharmony_ci
253e5d0e473Sopenharmony_ci    SmsDcs *dcs = new SmsDcs();
254e5d0e473Sopenharmony_ci    codec->DecodeDcsPdu(buffer, dcs);
255e5d0e473Sopenharmony_ci
256e5d0e473Sopenharmony_ci    int32_t setType[UINT8_COUNT] = { 0 };
257e5d0e473Sopenharmony_ci    int32_t indType[UINT8_COUNT] { 0 };
258e5d0e473Sopenharmony_ci    codec->CheckVoicemail(buffer, setType, indType);
259e5d0e473Sopenharmony_ci}
260e5d0e473Sopenharmony_ci
261e5d0e473Sopenharmony_civoid DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size)
262e5d0e473Sopenharmony_ci{
263e5d0e473Sopenharmony_ci    if (data == nullptr || size == 0) {
264e5d0e473Sopenharmony_ci        return;
265e5d0e473Sopenharmony_ci    }
266e5d0e473Sopenharmony_ci
267e5d0e473Sopenharmony_ci    EncodePduItemsTest(data, size);
268e5d0e473Sopenharmony_ci    DecodePduItemsTest(data, size);
269e5d0e473Sopenharmony_ci    sleep(SLEEP_TIME_SECONDS);
270e5d0e473Sopenharmony_ci    DelayedSingleton<SmsService>::DestroyInstance();
271e5d0e473Sopenharmony_ci}
272e5d0e473Sopenharmony_ci} // namespace OHOS
273e5d0e473Sopenharmony_ci
274e5d0e473Sopenharmony_ci/* Fuzzer entry point */
275e5d0e473Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
276e5d0e473Sopenharmony_ci{
277e5d0e473Sopenharmony_ci    /* Run your code on data */
278e5d0e473Sopenharmony_ci    OHOS::AddSmsTokenFuzzer token;
279e5d0e473Sopenharmony_ci    OHOS::DoSomethingInterestingWithMyAPI(data, size);
280e5d0e473Sopenharmony_ci    return 0;
281e5d0e473Sopenharmony_ci}
282