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