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 "smspdubuffer_fuzzer.h"
17e5d0e473Sopenharmony_ci
18e5d0e473Sopenharmony_ci#include "addsmstoken_fuzzer.h"
19e5d0e473Sopenharmony_ci#include "sms_pdu_buffer.h"
20e5d0e473Sopenharmony_ci
21e5d0e473Sopenharmony_ciusing namespace OHOS::Telephony;
22e5d0e473Sopenharmony_cinamespace OHOS {
23e5d0e473Sopenharmony_cistatic constexpr uint8_t TEST_BITS = 16;
24e5d0e473Sopenharmony_ci
25e5d0e473Sopenharmony_civoid ReadBuffer(const uint8_t *data, size_t size)
26e5d0e473Sopenharmony_ci{
27e5d0e473Sopenharmony_ci    std::string strValue(reinterpret_cast<const char *>(data), size);
28e5d0e473Sopenharmony_ci    auto buffer = std::make_unique<SmsReadBuffer>(strValue);
29e5d0e473Sopenharmony_ci    if (buffer == nullptr) {
30e5d0e473Sopenharmony_ci        return;
31e5d0e473Sopenharmony_ci    }
32e5d0e473Sopenharmony_ci    buffer->IsEmpty();
33e5d0e473Sopenharmony_ci
34e5d0e473Sopenharmony_ci    uint16_t desLen = static_cast<uint16_t>(size);
35e5d0e473Sopenharmony_ci    desLen += desLen;
36e5d0e473Sopenharmony_ci    for (uint16_t i = 0; i < desLen; i++) {
37e5d0e473Sopenharmony_ci        buffer->SetIndex(i);
38e5d0e473Sopenharmony_ci        buffer->GetIndex();
39e5d0e473Sopenharmony_ci    }
40e5d0e473Sopenharmony_ci    for (uint16_t i = 0; i < desLen; i++) {
41e5d0e473Sopenharmony_ci        buffer->MoveBack(i);
42e5d0e473Sopenharmony_ci    }
43e5d0e473Sopenharmony_ci    for (uint16_t i = 0; i < desLen; i++) {
44e5d0e473Sopenharmony_ci        buffer->MoveForward(i);
45e5d0e473Sopenharmony_ci    }
46e5d0e473Sopenharmony_ci
47e5d0e473Sopenharmony_ci    buffer->SetIndex(0);
48e5d0e473Sopenharmony_ci    uint8_t v1 = 0;
49e5d0e473Sopenharmony_ci    uint16_t v2 = 0;
50e5d0e473Sopenharmony_ci    for (uint16_t i = 0; i < desLen; i++) {
51e5d0e473Sopenharmony_ci        buffer->ReadByte(v1);
52e5d0e473Sopenharmony_ci        buffer->ReadWord(v2);
53e5d0e473Sopenharmony_ci    }
54e5d0e473Sopenharmony_ci
55e5d0e473Sopenharmony_ci    buffer->SetIndex(0);
56e5d0e473Sopenharmony_ci    uint8_t v3 = 0;
57e5d0e473Sopenharmony_ci    for (uint16_t i = 0; i < desLen; i++) {
58e5d0e473Sopenharmony_ci        for (uint8_t j = 0; j < TEST_BITS; j++) {
59e5d0e473Sopenharmony_ci            buffer->ReadBits(v3, j);
60e5d0e473Sopenharmony_ci        }
61e5d0e473Sopenharmony_ci    }
62e5d0e473Sopenharmony_ci    buffer->SkipBits();
63e5d0e473Sopenharmony_ci}
64e5d0e473Sopenharmony_ci
65e5d0e473Sopenharmony_civoid WriteBuffer(const uint8_t *data, size_t size)
66e5d0e473Sopenharmony_ci{
67e5d0e473Sopenharmony_ci    auto buffer = std::make_unique<SmsWriteBuffer>();
68e5d0e473Sopenharmony_ci    if (buffer == nullptr) {
69e5d0e473Sopenharmony_ci        return;
70e5d0e473Sopenharmony_ci    }
71e5d0e473Sopenharmony_ci    buffer->IsEmpty();
72e5d0e473Sopenharmony_ci
73e5d0e473Sopenharmony_ci    for (uint16_t i = 0; i < size; i++) {
74e5d0e473Sopenharmony_ci        buffer->SetIndex(i);
75e5d0e473Sopenharmony_ci        buffer->GetIndex();
76e5d0e473Sopenharmony_ci    }
77e5d0e473Sopenharmony_ci    for (uint16_t i = 0; i < size; i++) {
78e5d0e473Sopenharmony_ci        buffer->MoveBack(i);
79e5d0e473Sopenharmony_ci    }
80e5d0e473Sopenharmony_ci    for (uint16_t i = 0; i < size; i++) {
81e5d0e473Sopenharmony_ci        buffer->MoveForward(i);
82e5d0e473Sopenharmony_ci    }
83e5d0e473Sopenharmony_ci
84e5d0e473Sopenharmony_ci    buffer->SetIndex(0);
85e5d0e473Sopenharmony_ci    for (uint16_t i = 0; i < size; i++) {
86e5d0e473Sopenharmony_ci        buffer->WriteByte(data[i]);
87e5d0e473Sopenharmony_ci    }
88e5d0e473Sopenharmony_ci    auto pduBuffer = buffer->GetPduBuffer();
89e5d0e473Sopenharmony_ci
90e5d0e473Sopenharmony_ci    buffer->SetIndex(0);
91e5d0e473Sopenharmony_ci    for (uint16_t i = 0; i < size; i++) {
92e5d0e473Sopenharmony_ci        buffer->WriteWord(static_cast<uint16_t>(data[i]));
93e5d0e473Sopenharmony_ci    }
94e5d0e473Sopenharmony_ci    auto pduBuffer2 = buffer->GetPduBuffer();
95e5d0e473Sopenharmony_ci
96e5d0e473Sopenharmony_ci    buffer->SetIndex(0);
97e5d0e473Sopenharmony_ci    uint8_t v3 = 0;
98e5d0e473Sopenharmony_ci    for (uint16_t i = 0; i < size; i++) {
99e5d0e473Sopenharmony_ci        for (uint8_t j = 0; j < TEST_BITS; j++) {
100e5d0e473Sopenharmony_ci            buffer->WriteBits(v3, j);
101e5d0e473Sopenharmony_ci        }
102e5d0e473Sopenharmony_ci    }
103e5d0e473Sopenharmony_ci    buffer->SkipBits();
104e5d0e473Sopenharmony_ci    auto pduBuffer3 = buffer->GetPduBuffer();
105e5d0e473Sopenharmony_ci
106e5d0e473Sopenharmony_ci    buffer->SetIndex(0);
107e5d0e473Sopenharmony_ci    for (uint16_t i = 0; i < size; i++) {
108e5d0e473Sopenharmony_ci        buffer->InsertByte(data[i], i);
109e5d0e473Sopenharmony_ci    }
110e5d0e473Sopenharmony_ci    auto pduBuffer4 = buffer->GetPduBuffer();
111e5d0e473Sopenharmony_ci}
112e5d0e473Sopenharmony_ci
113e5d0e473Sopenharmony_civoid DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size)
114e5d0e473Sopenharmony_ci{
115e5d0e473Sopenharmony_ci    if (data == nullptr || size == 0) {
116e5d0e473Sopenharmony_ci        return;
117e5d0e473Sopenharmony_ci    }
118e5d0e473Sopenharmony_ci
119e5d0e473Sopenharmony_ci    ReadBuffer(data, size);
120e5d0e473Sopenharmony_ci    WriteBuffer(data, size);
121e5d0e473Sopenharmony_ci}
122e5d0e473Sopenharmony_ci
123e5d0e473Sopenharmony_ci} // namespace OHOS
124e5d0e473Sopenharmony_ci
125e5d0e473Sopenharmony_ci/* Fuzzer entry point */
126e5d0e473Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
127e5d0e473Sopenharmony_ci{
128e5d0e473Sopenharmony_ci    /* Run your code on data */
129e5d0e473Sopenharmony_ci    OHOS::AddSmsTokenFuzzer token;
130e5d0e473Sopenharmony_ci    OHOS::DoSomethingInterestingWithMyAPI(data, size);
131e5d0e473Sopenharmony_ci    return 0;
132e5d0e473Sopenharmony_ci}
133