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