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