1060ff233Sopenharmony_ci/* 2060ff233Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3060ff233Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4060ff233Sopenharmony_ci * you may not use this file except in compliance with the License. 5060ff233Sopenharmony_ci * You may obtain a copy of the License at 6060ff233Sopenharmony_ci * 7060ff233Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8060ff233Sopenharmony_ci * 9060ff233Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10060ff233Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11060ff233Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12060ff233Sopenharmony_ci * See the License for the specific language governing permissions and 13060ff233Sopenharmony_ci * limitations under the License. 14060ff233Sopenharmony_ci */ 15060ff233Sopenharmony_ci 16060ff233Sopenharmony_ci#ifndef FUZZ_DATA_GENERATOR_H 17060ff233Sopenharmony_ci#define FUZZ_DATA_GENERATOR_H 18060ff233Sopenharmony_ci 19060ff233Sopenharmony_ci#include <cstdint> 20060ff233Sopenharmony_ci#include <string> 21060ff233Sopenharmony_ci#include <vector> 22060ff233Sopenharmony_ci 23060ff233Sopenharmony_ci#include "parcel.h" 24060ff233Sopenharmony_ci 25060ff233Sopenharmony_ciclass DataGenerator { 26060ff233Sopenharmony_cipublic: 27060ff233Sopenharmony_ci static void Write(const uint8_t *data, size_t size) 28060ff233Sopenharmony_ci { 29060ff233Sopenharmony_ci DataGenerator::parcel_.WriteBuffer(data, size); 30060ff233Sopenharmony_ci DataGenerator::parcel_.RewindRead(0); 31060ff233Sopenharmony_ci } 32060ff233Sopenharmony_ci 33060ff233Sopenharmony_ci static void Clear() 34060ff233Sopenharmony_ci { 35060ff233Sopenharmony_ci DataGenerator::parcel_.FlushBuffer(); 36060ff233Sopenharmony_ci } 37060ff233Sopenharmony_ci 38060ff233Sopenharmony_ci static OHOS::Parcel &GetInstance() 39060ff233Sopenharmony_ci { 40060ff233Sopenharmony_ci return DataGenerator::parcel_; 41060ff233Sopenharmony_ci } 42060ff233Sopenharmony_ci 43060ff233Sopenharmony_ciprivate: 44060ff233Sopenharmony_ci static inline OHOS::Parcel parcel_; 45060ff233Sopenharmony_ci}; 46060ff233Sopenharmony_ci 47060ff233Sopenharmony_citemplate <typename T> 48060ff233Sopenharmony_ciinline bool GenerateFromList(T &value, const std::vector<T> &candidateValues) 49060ff233Sopenharmony_ci{ 50060ff233Sopenharmony_ci if (candidateValues.empty()) { 51060ff233Sopenharmony_ci return false; 52060ff233Sopenharmony_ci } 53060ff233Sopenharmony_ci uint8_t rawData = 0; 54060ff233Sopenharmony_ci if (!DataGenerator::GetInstance().ReadUint8(rawData)) { 55060ff233Sopenharmony_ci return false; 56060ff233Sopenharmony_ci } 57060ff233Sopenharmony_ci value = candidateValues[rawData % candidateValues.size()]; 58060ff233Sopenharmony_ci return true; 59060ff233Sopenharmony_ci} 60060ff233Sopenharmony_ci 61060ff233Sopenharmony_ciinline bool GenerateBool(bool &value) 62060ff233Sopenharmony_ci{ 63060ff233Sopenharmony_ci return DataGenerator::GetInstance().ReadBool(value); 64060ff233Sopenharmony_ci} 65060ff233Sopenharmony_ci 66060ff233Sopenharmony_ciinline bool GenerateInt8(int8_t &value) 67060ff233Sopenharmony_ci{ 68060ff233Sopenharmony_ci return DataGenerator::GetInstance().ReadInt8(value); 69060ff233Sopenharmony_ci} 70060ff233Sopenharmony_ci 71060ff233Sopenharmony_ciinline bool GenerateInt16(int16_t &value) 72060ff233Sopenharmony_ci{ 73060ff233Sopenharmony_ci return DataGenerator::GetInstance().ReadInt16(value); 74060ff233Sopenharmony_ci} 75060ff233Sopenharmony_ci 76060ff233Sopenharmony_ciinline bool GenerateInt32(int32_t &value) 77060ff233Sopenharmony_ci{ 78060ff233Sopenharmony_ci return DataGenerator::GetInstance().ReadInt32(value); 79060ff233Sopenharmony_ci} 80060ff233Sopenharmony_ci 81060ff233Sopenharmony_ciinline bool GenerateInt64(int64_t &value) 82060ff233Sopenharmony_ci{ 83060ff233Sopenharmony_ci return DataGenerator::GetInstance().ReadInt64(value); 84060ff233Sopenharmony_ci} 85060ff233Sopenharmony_ci 86060ff233Sopenharmony_ciinline bool GenerateUint8(uint8_t &value) 87060ff233Sopenharmony_ci{ 88060ff233Sopenharmony_ci return DataGenerator::GetInstance().ReadUint8(value); 89060ff233Sopenharmony_ci} 90060ff233Sopenharmony_ci 91060ff233Sopenharmony_ciinline bool GenerateUint16(uint16_t &value) 92060ff233Sopenharmony_ci{ 93060ff233Sopenharmony_ci return DataGenerator::GetInstance().ReadUint16(value); 94060ff233Sopenharmony_ci} 95060ff233Sopenharmony_ci 96060ff233Sopenharmony_ciinline bool GenerateUint32(uint32_t &value) 97060ff233Sopenharmony_ci{ 98060ff233Sopenharmony_ci return DataGenerator::GetInstance().ReadUint32(value); 99060ff233Sopenharmony_ci} 100060ff233Sopenharmony_ci 101060ff233Sopenharmony_ciinline bool GenerateUint64(uint64_t &value) 102060ff233Sopenharmony_ci{ 103060ff233Sopenharmony_ci return DataGenerator::GetInstance().ReadUint64(value); 104060ff233Sopenharmony_ci} 105060ff233Sopenharmony_ci 106060ff233Sopenharmony_ciinline bool GenerateFloat(float &value) 107060ff233Sopenharmony_ci{ 108060ff233Sopenharmony_ci return DataGenerator::GetInstance().ReadFloat(value); 109060ff233Sopenharmony_ci} 110060ff233Sopenharmony_ci 111060ff233Sopenharmony_ciinline bool GenerateDouble(double &value) 112060ff233Sopenharmony_ci{ 113060ff233Sopenharmony_ci return DataGenerator::GetInstance().ReadDouble(value); 114060ff233Sopenharmony_ci} 115060ff233Sopenharmony_ci 116060ff233Sopenharmony_ciinline bool GenerateString(std::string &value) 117060ff233Sopenharmony_ci{ 118060ff233Sopenharmony_ci return DataGenerator::GetInstance().ReadString(value); 119060ff233Sopenharmony_ci} 120060ff233Sopenharmony_ci 121060ff233Sopenharmony_ciinline bool GeneratePayload(std::vector<uint8_t> &payload, const std::vector<uint8_t> &prefix = {}) 122060ff233Sopenharmony_ci{ 123060ff233Sopenharmony_ci uint8_t len = 0; 124060ff233Sopenharmony_ci if (!DataGenerator::GetInstance().ReadUint8(len)) { 125060ff233Sopenharmony_ci return false; 126060ff233Sopenharmony_ci } 127060ff233Sopenharmony_ci size_t readableSize = DataGenerator::GetInstance().GetReadableBytes(); 128060ff233Sopenharmony_ci len = (readableSize == 0) ? 0 : (len % readableSize); 129060ff233Sopenharmony_ci payload.push_back(len + prefix.size()); 130060ff233Sopenharmony_ci payload.insert(payload.end(), prefix.begin(), prefix.end()); 131060ff233Sopenharmony_ci for (uint8_t i = 0; i < len; ++i) { 132060ff233Sopenharmony_ci payload.push_back(DataGenerator::GetInstance().ReadUint8()); 133060ff233Sopenharmony_ci } 134060ff233Sopenharmony_ci return true; 135060ff233Sopenharmony_ci} 136060ff233Sopenharmony_ci 137060ff233Sopenharmony_ci#endif // FUZZ_DATA_GENERATOR_H 138