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