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 "setgetcbconfig_fuzzer.h" 17e5d0e473Sopenharmony_ci 18e5d0e473Sopenharmony_ci#ifdef GTEST_API_ 19e5d0e473Sopenharmony_ci#define private public 20e5d0e473Sopenharmony_ci#endif 21e5d0e473Sopenharmony_ci 22e5d0e473Sopenharmony_ci#include "addsmstoken_fuzzer.h" 23e5d0e473Sopenharmony_ci#include "core_manager_inner.h" 24e5d0e473Sopenharmony_ci#include "gsm_cb_gsm_codec.h" 25e5d0e473Sopenharmony_ci#include "gsm_cb_umts_codec.h" 26e5d0e473Sopenharmony_ci#include "sms_service.h" 27e5d0e473Sopenharmony_ci#include "string_utils.h" 28e5d0e473Sopenharmony_ci 29e5d0e473Sopenharmony_ciusing namespace OHOS::Telephony; 30e5d0e473Sopenharmony_cinamespace OHOS { 31e5d0e473Sopenharmony_cistatic bool g_isInited = false; 32e5d0e473Sopenharmony_cistatic int32_t SIM_COUNT = 2; 33e5d0e473Sopenharmony_cistatic int32_t CB_CHANNEL_DIVISOR = 2; 34e5d0e473Sopenharmony_cistatic int32_t NET_COUNT = 3; 35e5d0e473Sopenharmony_ciconstexpr int32_t SLEEP_TIME_SECONDS = 3; 36e5d0e473Sopenharmony_ci 37e5d0e473Sopenharmony_cibool IsServiceInited() 38e5d0e473Sopenharmony_ci{ 39e5d0e473Sopenharmony_ci if (!g_isInited) { 40e5d0e473Sopenharmony_ci CoreManagerInner::GetInstance().isInitAllObj_ = true; 41e5d0e473Sopenharmony_ci DelayedSingleton<SmsService>::GetInstance()->registerToService_ = true; 42e5d0e473Sopenharmony_ci DelayedSingleton<SmsService>::GetInstance()->WaitCoreServiceToInit(); 43e5d0e473Sopenharmony_ci DelayedSingleton<SmsService>::GetInstance()->OnStart(); 44e5d0e473Sopenharmony_ci if (DelayedSingleton<SmsService>::GetInstance()->GetServiceRunningState() == 45e5d0e473Sopenharmony_ci static_cast<int32_t>(Telephony::ServiceRunningState::STATE_RUNNING)) { 46e5d0e473Sopenharmony_ci g_isInited = true; 47e5d0e473Sopenharmony_ci } 48e5d0e473Sopenharmony_ci } 49e5d0e473Sopenharmony_ci return g_isInited; 50e5d0e473Sopenharmony_ci} 51e5d0e473Sopenharmony_ci 52e5d0e473Sopenharmony_civoid SetCBConfigFuzz(const uint8_t *data, size_t size) 53e5d0e473Sopenharmony_ci{ 54e5d0e473Sopenharmony_ci if (!IsServiceInited()) { 55e5d0e473Sopenharmony_ci return; 56e5d0e473Sopenharmony_ci } 57e5d0e473Sopenharmony_ci 58e5d0e473Sopenharmony_ci MessageParcel dataParcel; 59e5d0e473Sopenharmony_ci MessageParcel replyParcel; 60e5d0e473Sopenharmony_ci MessageOption option(MessageOption::TF_SYNC); 61e5d0e473Sopenharmony_ci 62e5d0e473Sopenharmony_ci int32_t slotId = static_cast<int32_t>(size % SIM_COUNT); 63e5d0e473Sopenharmony_ci bool enable = slotId == 1 ? true : false; 64e5d0e473Sopenharmony_ci uint32_t fromMsgId = static_cast<uint32_t>(size / CB_CHANNEL_DIVISOR); 65e5d0e473Sopenharmony_ci uint32_t toMsgId = static_cast<uint32_t>(size); 66e5d0e473Sopenharmony_ci int32_t netType = static_cast<int32_t>(size % NET_COUNT); 67e5d0e473Sopenharmony_ci 68e5d0e473Sopenharmony_ci dataParcel.WriteInt32(slotId); 69e5d0e473Sopenharmony_ci dataParcel.WriteBool(enable); 70e5d0e473Sopenharmony_ci dataParcel.WriteUint32(fromMsgId); 71e5d0e473Sopenharmony_ci dataParcel.WriteUint32(toMsgId); 72e5d0e473Sopenharmony_ci dataParcel.WriteUint8(netType); 73e5d0e473Sopenharmony_ci 74e5d0e473Sopenharmony_ci dataParcel.WriteBuffer(data, size); 75e5d0e473Sopenharmony_ci dataParcel.RewindRead(0); 76e5d0e473Sopenharmony_ci DelayedSingleton<SmsService>::GetInstance()->OnSetCBConfig(dataParcel, replyParcel, option); 77e5d0e473Sopenharmony_ci 78e5d0e473Sopenharmony_ci std::shared_ptr<SmsInterfaceManager> interfaceManager = std::make_shared<SmsInterfaceManager>(slotId); 79e5d0e473Sopenharmony_ci if (interfaceManager == nullptr) { 80e5d0e473Sopenharmony_ci TELEPHONY_LOGE("interfaceManager nullptr error"); 81e5d0e473Sopenharmony_ci return; 82e5d0e473Sopenharmony_ci } 83e5d0e473Sopenharmony_ci interfaceManager->InitInterfaceManager(); 84e5d0e473Sopenharmony_ci interfaceManager->SetCBConfig(enable, fromMsgId, toMsgId, netType); 85e5d0e473Sopenharmony_ci 86e5d0e473Sopenharmony_ci std::shared_ptr<SmsMiscManager> smsMiscManager = std::make_shared<SmsMiscManager>(slotId); 87e5d0e473Sopenharmony_ci if (smsMiscManager == nullptr) { 88e5d0e473Sopenharmony_ci TELEPHONY_LOGE("smsMiscManager nullptr error"); 89e5d0e473Sopenharmony_ci return; 90e5d0e473Sopenharmony_ci } 91e5d0e473Sopenharmony_ci smsMiscManager->SetCBConfig(enable, fromMsgId, toMsgId, netType); 92e5d0e473Sopenharmony_ci} 93e5d0e473Sopenharmony_ci 94e5d0e473Sopenharmony_civoid SetImsSmsConfigFuzz(const uint8_t *data, size_t size) 95e5d0e473Sopenharmony_ci{ 96e5d0e473Sopenharmony_ci if (!IsServiceInited()) { 97e5d0e473Sopenharmony_ci return; 98e5d0e473Sopenharmony_ci } 99e5d0e473Sopenharmony_ci 100e5d0e473Sopenharmony_ci MessageParcel dataParcel; 101e5d0e473Sopenharmony_ci MessageParcel replyParcel; 102e5d0e473Sopenharmony_ci MessageOption option(MessageOption::TF_SYNC); 103e5d0e473Sopenharmony_ci 104e5d0e473Sopenharmony_ci int32_t slotId = static_cast<int32_t>(size % SIM_COUNT); 105e5d0e473Sopenharmony_ci int32_t enable = slotId == 1 ? true : false; 106e5d0e473Sopenharmony_ci dataParcel.WriteInt32(slotId); 107e5d0e473Sopenharmony_ci dataParcel.WriteInt32(enable); 108e5d0e473Sopenharmony_ci dataParcel.WriteBuffer(data, size); 109e5d0e473Sopenharmony_ci dataParcel.RewindRead(0); 110e5d0e473Sopenharmony_ci DelayedSingleton<SmsService>::GetInstance()->OnSetImsSmsConfig(dataParcel, replyParcel, option); 111e5d0e473Sopenharmony_ci 112e5d0e473Sopenharmony_ci std::shared_ptr<SmsInterfaceManager> interfaceManager = std::make_shared<SmsInterfaceManager>(slotId); 113e5d0e473Sopenharmony_ci if (interfaceManager == nullptr) { 114e5d0e473Sopenharmony_ci TELEPHONY_LOGE("interfaceManager nullptr error"); 115e5d0e473Sopenharmony_ci return; 116e5d0e473Sopenharmony_ci } 117e5d0e473Sopenharmony_ci interfaceManager->InitInterfaceManager(); 118e5d0e473Sopenharmony_ci interfaceManager->SetImsSmsConfig(slotId, enable); 119e5d0e473Sopenharmony_ci 120e5d0e473Sopenharmony_ci auto smsSendManager = std::make_shared<SmsSendManager>(slotId); 121e5d0e473Sopenharmony_ci if (smsSendManager == nullptr) { 122e5d0e473Sopenharmony_ci return; 123e5d0e473Sopenharmony_ci } 124e5d0e473Sopenharmony_ci smsSendManager->Init(); 125e5d0e473Sopenharmony_ci smsSendManager->SetImsSmsConfig(slotId, enable); 126e5d0e473Sopenharmony_ci} 127e5d0e473Sopenharmony_ci 128e5d0e473Sopenharmony_civoid UpdataCBMessage(const uint8_t *data, size_t size) 129e5d0e473Sopenharmony_ci{ 130e5d0e473Sopenharmony_ci std::string pdu(reinterpret_cast<const char *>(data), size); 131e5d0e473Sopenharmony_ci std::string gsmData("C00000324811006800610072006D006F006E00790020006F00730020005500" 132e5d0e473Sopenharmony_ci "630073003200200065006E0063006F0064006500200064006100740061"); 133e5d0e473Sopenharmony_ci auto cbMessage = GsmCbCodec::CreateCbMessage(gsmData); 134e5d0e473Sopenharmony_ci if (cbMessage == nullptr) { 135e5d0e473Sopenharmony_ci return; 136e5d0e473Sopenharmony_ci } 137e5d0e473Sopenharmony_ci cbMessage->GetCbHeader(); 138e5d0e473Sopenharmony_ci cbMessage->PduAnalysis(StringUtils::HexToByteVector(pdu)); 139e5d0e473Sopenharmony_ci std::string umtsData("01a41f51101102ea3030a830ea30a230e130fc30eb914d4fe130c630b930c8000" 140e5d0e473Sopenharmony_ci "d000a3053308c306f8a669a137528306e30e130c330bb30fc30b8306730593002" 141e5d0e473Sopenharmony_ci "000d000aff080032003000310033002f00310031002f003252ea3000370020003" 142e5d0e473Sopenharmony_ci "10035003a00340034ff09000d000aff0830a830ea30a25e02ff09000000000000" 143e5d0e473Sopenharmony_ci "00000000000000000000000000000000000000000000000000000000000000000" 144e5d0e473Sopenharmony_ci "000000000000000000022"); 145e5d0e473Sopenharmony_ci auto umtsCbMessage = GsmCbCodec::CreateCbMessage(umtsData); 146e5d0e473Sopenharmony_ci if (umtsCbMessage == nullptr) { 147e5d0e473Sopenharmony_ci return; 148e5d0e473Sopenharmony_ci } 149e5d0e473Sopenharmony_ci umtsCbMessage->GetCbHeader(); 150e5d0e473Sopenharmony_ci umtsCbMessage->PduAnalysis(StringUtils::HexToByteVector(pdu)); 151e5d0e473Sopenharmony_ci auto cbMessageByVectorInit = GsmCbCodec::CreateCbMessage(StringUtils::HexToByteVector(pdu)); 152e5d0e473Sopenharmony_ci if (cbMessageByVectorInit == nullptr) { 153e5d0e473Sopenharmony_ci return; 154e5d0e473Sopenharmony_ci } 155e5d0e473Sopenharmony_ci cbMessageByVectorInit->GetCbMessageRaw(); 156e5d0e473Sopenharmony_ci cbMessageByVectorInit->IsSinglePageMsg(); 157e5d0e473Sopenharmony_ci 158e5d0e473Sopenharmony_ci auto gsmCodec = std::make_shared<GsmCbGsmCodec>(cbMessage->cbHeader_, cbMessage->cbPduBuffer_, cbMessage); 159e5d0e473Sopenharmony_ci auto umtsCodec = 160e5d0e473Sopenharmony_ci std::make_shared<GsmCbUmtsCodec>(umtsCbMessage->cbHeader_, umtsCbMessage->cbPduBuffer_, umtsCbMessage); 161e5d0e473Sopenharmony_ci if (gsmCodec == nullptr || umtsCodec == nullptr) { 162e5d0e473Sopenharmony_ci return; 163e5d0e473Sopenharmony_ci } 164e5d0e473Sopenharmony_ci gsmCodec->Decode2gHeader(); 165e5d0e473Sopenharmony_ci umtsCodec->Decode3gHeader(); 166e5d0e473Sopenharmony_ci 167e5d0e473Sopenharmony_ci gsmCodec->Decode2gCbMsg(); 168e5d0e473Sopenharmony_ci umtsCodec->Decode3gCbMsg(); 169e5d0e473Sopenharmony_ci umtsCodec->Decode3g7Bit(); 170e5d0e473Sopenharmony_ci umtsCodec->Decode3gUCS2(); 171e5d0e473Sopenharmony_ci gsmCodec->DecodeEtwsMsg(); 172e5d0e473Sopenharmony_ci 173e5d0e473Sopenharmony_ci std::string raw(reinterpret_cast<const char *>(data), size); 174e5d0e473Sopenharmony_ci std::string message(reinterpret_cast<const char *>(data), size); 175e5d0e473Sopenharmony_ci cbMessage->ConvertToUTF8(raw, message); 176e5d0e473Sopenharmony_ci} 177e5d0e473Sopenharmony_ci 178e5d0e473Sopenharmony_civoid DoCBConfigWithMyAPI(const uint8_t *data, size_t size) 179e5d0e473Sopenharmony_ci{ 180e5d0e473Sopenharmony_ci if (data == nullptr || size == 0) { 181e5d0e473Sopenharmony_ci return; 182e5d0e473Sopenharmony_ci } 183e5d0e473Sopenharmony_ci SetCBConfigFuzz(data, size); 184e5d0e473Sopenharmony_ci SetImsSmsConfigFuzz(data, size); 185e5d0e473Sopenharmony_ci UpdataCBMessage(data, size); 186e5d0e473Sopenharmony_ci DelayedSingleton<SmsService>::DestroyInstance(); 187e5d0e473Sopenharmony_ci sleep(SLEEP_TIME_SECONDS); 188e5d0e473Sopenharmony_ci} 189e5d0e473Sopenharmony_ci} // namespace OHOS 190e5d0e473Sopenharmony_ci 191e5d0e473Sopenharmony_ci/* Fuzzer entry point */ 192e5d0e473Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 193e5d0e473Sopenharmony_ci{ 194e5d0e473Sopenharmony_ci /* Run your code on data */ 195e5d0e473Sopenharmony_ci OHOS::AddSmsTokenFuzzer token; 196e5d0e473Sopenharmony_ci OHOS::DoCBConfigWithMyAPI(data, size); 197e5d0e473Sopenharmony_ci return 0; 198e5d0e473Sopenharmony_ci} 199