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