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 "gsmsmsmessage_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 SLOT_NUM = 2; 28e5d0e473Sopenharmony_cistatic constexpr int32_t UINT8_COUNT = 256; 29e5d0e473Sopenharmony_cistatic constexpr int32_t UINT16_COUNT = 65536; 30e5d0e473Sopenharmony_cistatic constexpr int32_t DATA_LEN = 160 * 15; 31e5d0e473Sopenharmony_cistatic constexpr int32_t CODE_SCHEME_SIZE = 6; 32e5d0e473Sopenharmony_ciconstexpr int32_t SLEEP_TIME_SECONDS = 1; 33e5d0e473Sopenharmony_ci 34e5d0e473Sopenharmony_cibool IsServiceInited() 35e5d0e473Sopenharmony_ci{ 36e5d0e473Sopenharmony_ci if (!g_isInited) { 37e5d0e473Sopenharmony_ci CoreManagerInner::GetInstance().isInitAllObj_ = true; 38e5d0e473Sopenharmony_ci DelayedSingleton<SmsService>::GetInstance()->registerToService_ = true; 39e5d0e473Sopenharmony_ci DelayedSingleton<SmsService>::GetInstance()->WaitCoreServiceToInit(); 40e5d0e473Sopenharmony_ci DelayedSingleton<SmsService>::GetInstance()->OnStart(); 41e5d0e473Sopenharmony_ci if (DelayedSingleton<SmsService>::GetInstance()->GetServiceRunningState() == 42e5d0e473Sopenharmony_ci static_cast<int32_t>(Telephony::ServiceRunningState::STATE_RUNNING)) { 43e5d0e473Sopenharmony_ci g_isInited = true; 44e5d0e473Sopenharmony_ci } 45e5d0e473Sopenharmony_ci } 46e5d0e473Sopenharmony_ci return g_isInited; 47e5d0e473Sopenharmony_ci} 48e5d0e473Sopenharmony_ci 49e5d0e473Sopenharmony_civoid CreateMessageTest(const uint8_t *data, size_t size) 50e5d0e473Sopenharmony_ci{ 51e5d0e473Sopenharmony_ci if (!IsServiceInited()) { 52e5d0e473Sopenharmony_ci return; 53e5d0e473Sopenharmony_ci } 54e5d0e473Sopenharmony_ci std::string pdu(reinterpret_cast<const char *>(data), size); 55e5d0e473Sopenharmony_ci GsmSmsMessage msg; 56e5d0e473Sopenharmony_ci msg.CreateMessage(pdu); 57e5d0e473Sopenharmony_ci msg.PduAnalysis(pdu); 58e5d0e473Sopenharmony_ci SmsDeliver deliver; 59e5d0e473Sopenharmony_ci msg.AnalysisMsgDeliver(deliver); 60e5d0e473Sopenharmony_ci SmsStatusReport status; 61e5d0e473Sopenharmony_ci msg.AnalysisMsgStatusReport(status); 62e5d0e473Sopenharmony_ci SmsSubmit submit; 63e5d0e473Sopenharmony_ci msg.AnalysisMsgSubmit(submit); 64e5d0e473Sopenharmony_ci} 65e5d0e473Sopenharmony_ci 66e5d0e473Sopenharmony_civoid CalcReplyEncodeAddress(const uint8_t *data, size_t size) 67e5d0e473Sopenharmony_ci{ 68e5d0e473Sopenharmony_ci if (!IsServiceInited()) { 69e5d0e473Sopenharmony_ci return; 70e5d0e473Sopenharmony_ci } 71e5d0e473Sopenharmony_ci GsmSmsMessage msg; 72e5d0e473Sopenharmony_ci std::string replyAddr(reinterpret_cast<const char *>(data), size); 73e5d0e473Sopenharmony_ci msg.CalcReplyEncodeAddress(replyAddr); 74e5d0e473Sopenharmony_ci std::string replyAddress(reinterpret_cast<const char *>(data), 0); 75e5d0e473Sopenharmony_ci msg.CalcReplyEncodeAddress(replyAddress); 76e5d0e473Sopenharmony_ci 77e5d0e473Sopenharmony_ci SmsTimeStamp times; 78e5d0e473Sopenharmony_ci times.format = static_cast<SmsTimeFormat>(size); 79e5d0e473Sopenharmony_ci times.time.absolute.day = static_cast<uint8_t>(size); 80e5d0e473Sopenharmony_ci times.time.absolute.hour = static_cast<uint8_t>(size); 81e5d0e473Sopenharmony_ci times.time.absolute.minute = static_cast<uint8_t>(size); 82e5d0e473Sopenharmony_ci times.time.absolute.month = static_cast<uint8_t>(size); 83e5d0e473Sopenharmony_ci times.time.absolute.second = static_cast<uint8_t>(size); 84e5d0e473Sopenharmony_ci times.time.absolute.timeZone = static_cast<uint8_t>(size); 85e5d0e473Sopenharmony_ci times.time.absolute.year = static_cast<uint8_t>(size); 86e5d0e473Sopenharmony_ci msg.ConvertMsgTimeStamp(times); 87e5d0e473Sopenharmony_ci 88e5d0e473Sopenharmony_ci SmsTimeStamp stamp; 89e5d0e473Sopenharmony_ci stamp.format = static_cast<SmsTimeFormat>(size); 90e5d0e473Sopenharmony_ci stamp.time.relative.time = static_cast<uint8_t>(size); 91e5d0e473Sopenharmony_ci msg.ConvertMsgTimeStamp(stamp); 92e5d0e473Sopenharmony_ci 93e5d0e473Sopenharmony_ci msg.GetIsSIMDataTypeDownload(); 94e5d0e473Sopenharmony_ci msg.GetIsTypeZeroInd(); 95e5d0e473Sopenharmony_ci msg.GetGsm(); 96e5d0e473Sopenharmony_ci msg.GetIsSmsText(); 97e5d0e473Sopenharmony_ci msg.GetDestPort(); 98e5d0e473Sopenharmony_ci msg.GetDestAddress(); 99e5d0e473Sopenharmony_ci msg.GetReplyAddress(); 100e5d0e473Sopenharmony_ci msg.GetFullText(); 101e5d0e473Sopenharmony_ci 102e5d0e473Sopenharmony_ci std::string text(reinterpret_cast<const char *>(data), size); 103e5d0e473Sopenharmony_ci msg.SetFullText(text); 104e5d0e473Sopenharmony_ci msg.ConvertUserData(); 105e5d0e473Sopenharmony_ci msg.ConvertUserPartData(); 106e5d0e473Sopenharmony_ci msg.GetFullText(); 107e5d0e473Sopenharmony_ci msg.CreateDeliverSmsTpdu(); 108e5d0e473Sopenharmony_ci msg.CreateDeliverReportSmsTpdu(); 109e5d0e473Sopenharmony_ci msg.CreateStatusReportSmsTpdu(); 110e5d0e473Sopenharmony_ci msg.ConvertMessageDcs(); 111e5d0e473Sopenharmony_ci std::string addr(reinterpret_cast<const char *>(data), size); 112e5d0e473Sopenharmony_ci msg.SetDestAddress(addr); 113e5d0e473Sopenharmony_ci} 114e5d0e473Sopenharmony_ci 115e5d0e473Sopenharmony_civoid SplitMessageAndCreateSubmitTest(const uint8_t *data, size_t size) 116e5d0e473Sopenharmony_ci{ 117e5d0e473Sopenharmony_ci if (!IsServiceInited()) { 118e5d0e473Sopenharmony_ci return; 119e5d0e473Sopenharmony_ci } 120e5d0e473Sopenharmony_ci GsmSmsMessage msg; 121e5d0e473Sopenharmony_ci std::vector<struct SplitInfo> cellsInfos; 122e5d0e473Sopenharmony_ci std::string text(reinterpret_cast<const char *>(data), size); 123e5d0e473Sopenharmony_ci bool force7BitCode = (size % SLOT_NUM == 1); 124e5d0e473Sopenharmony_ci DataCodingScheme codingType = static_cast<DataCodingScheme>(size % CODE_SCHEME_SIZE); 125e5d0e473Sopenharmony_ci msg.SplitMessage(cellsInfos, text, force7BitCode, codingType, false, ""); 126e5d0e473Sopenharmony_ci bool isStatusReport = (size % SLOT_NUM == 0); 127e5d0e473Sopenharmony_ci std::string desAddr(reinterpret_cast<const char *>(data), size); 128e5d0e473Sopenharmony_ci std::string scAddr(reinterpret_cast<const char *>(data), size); 129e5d0e473Sopenharmony_ci msg.CreateDefaultSubmitSmsTpdu(desAddr, scAddr, text, isStatusReport, codingType); 130e5d0e473Sopenharmony_ci msg.SplitMessage(cellsInfos, text, force7BitCode, codingType, true, ""); 131e5d0e473Sopenharmony_ci uint8_t msgRef8bit = size % UINT8_COUNT; 132e5d0e473Sopenharmony_ci msg.CreateDataSubmitSmsTpdu(desAddr, scAddr, size, data, size, msgRef8bit, codingType, isStatusReport); 133e5d0e473Sopenharmony_ci bool bMore = (size % SLOT_NUM == 1); 134e5d0e473Sopenharmony_ci msg.ConvertUserData(); 135e5d0e473Sopenharmony_ci msg.ConvertUserPartData(); 136e5d0e473Sopenharmony_ci msg.GetSubmitEncodeInfo(text, bMore); 137e5d0e473Sopenharmony_ci uint8_t decodeData[DATA_LEN + 1]; 138e5d0e473Sopenharmony_ci uint16_t len = DATA_LEN < size ? DATA_LEN : size; 139e5d0e473Sopenharmony_ci if (memcpy_s(decodeData, len, data, len) != EOK) { 140e5d0e473Sopenharmony_ci return; 141e5d0e473Sopenharmony_ci } 142e5d0e473Sopenharmony_ci msg.GetSubmitEncodeInfoPartData(decodeData, size, bMore); 143e5d0e473Sopenharmony_ci msg.SetHeaderReply(size); 144e5d0e473Sopenharmony_ci SmsConcat contact; 145e5d0e473Sopenharmony_ci contact.is8Bits = (size % SLOT_NUM == 1); 146e5d0e473Sopenharmony_ci contact.msgRef = size % UINT16_COUNT; 147e5d0e473Sopenharmony_ci contact.seqNum = size % UINT16_COUNT; 148e5d0e473Sopenharmony_ci contact.totalSeg = size % UINT16_COUNT; 149e5d0e473Sopenharmony_ci msg.IsSpecialMessage(); 150e5d0e473Sopenharmony_ci} 151e5d0e473Sopenharmony_ci 152e5d0e473Sopenharmony_civoid DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size) 153e5d0e473Sopenharmony_ci{ 154e5d0e473Sopenharmony_ci if (data == nullptr || size == 0) { 155e5d0e473Sopenharmony_ci return; 156e5d0e473Sopenharmony_ci } 157e5d0e473Sopenharmony_ci CalcReplyEncodeAddress(data, size); 158e5d0e473Sopenharmony_ci SplitMessageAndCreateSubmitTest(data, size); 159e5d0e473Sopenharmony_ci CreateMessageTest(data, size); 160e5d0e473Sopenharmony_ci sleep(SLEEP_TIME_SECONDS); 161e5d0e473Sopenharmony_ci DelayedSingleton<SmsService>::DestroyInstance(); 162e5d0e473Sopenharmony_ci} 163e5d0e473Sopenharmony_ci} // namespace OHOS 164e5d0e473Sopenharmony_ci 165e5d0e473Sopenharmony_ci/* Fuzzer entry point */ 166e5d0e473Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 167e5d0e473Sopenharmony_ci{ 168e5d0e473Sopenharmony_ci /* Run your code on data */ 169e5d0e473Sopenharmony_ci OHOS::AddSmsTokenFuzzer token; 170e5d0e473Sopenharmony_ci OHOS::DoSomethingInterestingWithMyAPI(data, size); 171e5d0e473Sopenharmony_ci return 0; 172e5d0e473Sopenharmony_ci} 173