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 "wappushbuffer_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 "sms_wap_push_handler.h" 24e5d0e473Sopenharmony_ci 25e5d0e473Sopenharmony_ciusing namespace OHOS::Telephony; 26e5d0e473Sopenharmony_cinamespace OHOS { 27e5d0e473Sopenharmony_cistatic int32_t SIM_COUNT = 2; 28e5d0e473Sopenharmony_ci 29e5d0e473Sopenharmony_civoid WapPushBuffer(const uint8_t *data, size_t size) 30e5d0e473Sopenharmony_ci{ 31e5d0e473Sopenharmony_ci int32_t slotId = static_cast<int32_t>(size % SIM_COUNT); 32e5d0e473Sopenharmony_ci std::string strValue(reinterpret_cast<const char *>(data), size); 33e5d0e473Sopenharmony_ci std::unique_ptr<SmsWapPushHandler> smsWapPushHandler = std::make_unique<SmsWapPushHandler>(slotId); 34e5d0e473Sopenharmony_ci auto indexer = std::make_shared<SmsReceiveIndexer>(); 35e5d0e473Sopenharmony_ci smsWapPushHandler->DecodeWapPushPdu(indexer, strValue); 36e5d0e473Sopenharmony_ci 37e5d0e473Sopenharmony_ci auto decodeBuffer = std::make_shared<SmsWapPushBuffer>(); 38e5d0e473Sopenharmony_ci if (decodeBuffer == nullptr) { 39e5d0e473Sopenharmony_ci return; 40e5d0e473Sopenharmony_ci } 41e5d0e473Sopenharmony_ci uint32_t desLen = static_cast<uint32_t>(size); 42e5d0e473Sopenharmony_ci decodeBuffer->ReadDataBuffer(desLen); 43e5d0e473Sopenharmony_ci 44e5d0e473Sopenharmony_ci std::unique_ptr<char[]> inBuff = std::make_unique<char[]>(desLen); 45e5d0e473Sopenharmony_ci decodeBuffer->WriteDataBuffer(std::move(inBuff), desLen); 46e5d0e473Sopenharmony_ci decodeBuffer->GetCurPosition(); 47e5d0e473Sopenharmony_ci decodeBuffer->GetSize(); 48e5d0e473Sopenharmony_ci 49e5d0e473Sopenharmony_ci uint8_t uint8tValue; 50e5d0e473Sopenharmony_ci decodeBuffer->PeekOneByte(uint8tValue); 51e5d0e473Sopenharmony_ci decodeBuffer->IncreasePointer(desLen); 52e5d0e473Sopenharmony_ci decodeBuffer->DecreasePointer(desLen); 53e5d0e473Sopenharmony_ci decodeBuffer->DecodeUintvar(desLen, desLen); 54e5d0e473Sopenharmony_ci 55e5d0e473Sopenharmony_ci decodeBuffer->DecodeShortLength(uint8tValue); 56e5d0e473Sopenharmony_ci decodeBuffer->DecodeValueLength(desLen); 57e5d0e473Sopenharmony_ci decodeBuffer->CharIsToken(uint8tValue); 58e5d0e473Sopenharmony_ci decodeBuffer->DecodeTokenText(strValue, desLen); 59e5d0e473Sopenharmony_ci decodeBuffer->DecodeText(strValue, desLen); 60e5d0e473Sopenharmony_ci 61e5d0e473Sopenharmony_ci decodeBuffer->DecodeQuotedText(strValue, desLen); 62e5d0e473Sopenharmony_ci decodeBuffer->DecodeShortInteger(uint8tValue); 63e5d0e473Sopenharmony_ci 64e5d0e473Sopenharmony_ci uint64_t uint64tValue; 65e5d0e473Sopenharmony_ci decodeBuffer->DecodeLongInteger(uint64tValue); 66e5d0e473Sopenharmony_ci decodeBuffer->DecodeInteger(uint64tValue); 67e5d0e473Sopenharmony_ci 68e5d0e473Sopenharmony_ci decodeBuffer->DecodeIsShortInt(); 69e5d0e473Sopenharmony_ci decodeBuffer->DecodeIsString(); 70e5d0e473Sopenharmony_ci decodeBuffer->DecodeIsValueLength(); 71e5d0e473Sopenharmony_ci decodeBuffer->DecodeExtensionMedia(); 72e5d0e473Sopenharmony_ci decodeBuffer->DecodeConstrainedEncoding(); 73e5d0e473Sopenharmony_ci 74e5d0e473Sopenharmony_ci bool isNoValue = slotId == 0 ? true : false; 75e5d0e473Sopenharmony_ci decodeBuffer->DecodeTextValue(strValue, isNoValue); 76e5d0e473Sopenharmony_ci decodeBuffer->DecodeNoValue(isNoValue); 77e5d0e473Sopenharmony_ci decodeBuffer->MarkPosition(); 78e5d0e473Sopenharmony_ci decodeBuffer->UnMarkPosition(); 79e5d0e473Sopenharmony_ci} 80e5d0e473Sopenharmony_ci 81e5d0e473Sopenharmony_civoid DoWapPushBufferWithMyAPI(const uint8_t *data, size_t size) 82e5d0e473Sopenharmony_ci{ 83e5d0e473Sopenharmony_ci if (data == nullptr || size == 0) { 84e5d0e473Sopenharmony_ci return; 85e5d0e473Sopenharmony_ci } 86e5d0e473Sopenharmony_ci 87e5d0e473Sopenharmony_ci WapPushBuffer(data, size); 88e5d0e473Sopenharmony_ci} 89e5d0e473Sopenharmony_ci} // namespace OHOS 90e5d0e473Sopenharmony_ci 91e5d0e473Sopenharmony_ci/* Fuzzer entry point */ 92e5d0e473Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 93e5d0e473Sopenharmony_ci{ 94e5d0e473Sopenharmony_ci /* Run your code on data */ 95e5d0e473Sopenharmony_ci OHOS::AddSmsTokenFuzzer token; 96e5d0e473Sopenharmony_ci OHOS::DoWapPushBufferWithMyAPI(data, size); 97e5d0e473Sopenharmony_ci return 0; 98e5d0e473Sopenharmony_ci} 99