1c2b37d2cSopenharmony_ci/*
2c2b37d2cSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3c2b37d2cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c2b37d2cSopenharmony_ci * you may not use this file except in compliance with the License.
5c2b37d2cSopenharmony_ci * You may obtain a copy of the License at
6c2b37d2cSopenharmony_ci *
7c2b37d2cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c2b37d2cSopenharmony_ci *
9c2b37d2cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c2b37d2cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c2b37d2cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c2b37d2cSopenharmony_ci * See the License for the specific language governing permissions and
13c2b37d2cSopenharmony_ci * limitations under the License.
14c2b37d2cSopenharmony_ci */
15c2b37d2cSopenharmony_ci
16c2b37d2cSopenharmony_ci#ifndef FUZZ_DATA_H
17c2b37d2cSopenharmony_ci#define FUZZ_DATA_H
18c2b37d2cSopenharmony_ci#include <string>
19c2b37d2cSopenharmony_ci#include "securec.h"
20c2b37d2cSopenharmony_ci
21c2b37d2cSopenharmony_cinamespace OHOS {
22c2b37d2cSopenharmony_cinamespace {
23c2b37d2cSopenharmony_cistatic constexpr uint32_t BOOL_MODULO_NUM = 2;
24c2b37d2cSopenharmony_ci}
25c2b37d2cSopenharmony_ciusing namespace std;
26c2b37d2cSopenharmony_ciclass FuzzData {
27c2b37d2cSopenharmony_cipublic:
28c2b37d2cSopenharmony_ci    explicit FuzzData(const uint8_t *data, const size_t size) : pos_(0), data_(data), size_(size) {}
29c2b37d2cSopenharmony_ci
30c2b37d2cSopenharmony_ci    template <class T> T GetData()
31c2b37d2cSopenharmony_ci    {
32c2b37d2cSopenharmony_ci        T object{};
33c2b37d2cSopenharmony_ci        size_t objectSize = sizeof(object);
34c2b37d2cSopenharmony_ci        if (data_ == nullptr || objectSize > size_ - pos_) {
35c2b37d2cSopenharmony_ci            return object;
36c2b37d2cSopenharmony_ci        }
37c2b37d2cSopenharmony_ci        errno_t ret = memcpy_s(&object, objectSize, data_ + pos_, objectSize);
38c2b37d2cSopenharmony_ci        if (ret != EOK) {
39c2b37d2cSopenharmony_ci            return {};
40c2b37d2cSopenharmony_ci        }
41c2b37d2cSopenharmony_ci        pos_ += objectSize;
42c2b37d2cSopenharmony_ci        return object;
43c2b37d2cSopenharmony_ci    }
44c2b37d2cSopenharmony_ci
45c2b37d2cSopenharmony_ci    std::string GetStringFromData(size_t pos, size_t strlen)
46c2b37d2cSopenharmony_ci    {
47c2b37d2cSopenharmony_ci        if (pos > size_) {
48c2b37d2cSopenharmony_ci            return "test";
49c2b37d2cSopenharmony_ci        }
50c2b37d2cSopenharmony_ci        char cstr[strlen + 1];
51c2b37d2cSopenharmony_ci        cstr[strlen] = '\0';
52c2b37d2cSopenharmony_ci        pos_ = pos;
53c2b37d2cSopenharmony_ci        for (size_t i = 0; i < strlen; i++) {
54c2b37d2cSopenharmony_ci            char tmp = GetData<char>();
55c2b37d2cSopenharmony_ci            if (tmp == '\0') {
56c2b37d2cSopenharmony_ci                tmp = '1';
57c2b37d2cSopenharmony_ci            }
58c2b37d2cSopenharmony_ci            cstr[i] = tmp;
59c2b37d2cSopenharmony_ci        }
60c2b37d2cSopenharmony_ci        std::string str(cstr);
61c2b37d2cSopenharmony_ci        return str;
62c2b37d2cSopenharmony_ci    }
63c2b37d2cSopenharmony_ci
64c2b37d2cSopenharmony_ci    std::string GenerateRandomString()
65c2b37d2cSopenharmony_ci    {
66c2b37d2cSopenharmony_ci        return GetStringFromData(0, (GetData<uint32_t>() % size_));
67c2b37d2cSopenharmony_ci    }
68c2b37d2cSopenharmony_ci
69c2b37d2cSopenharmony_ci    template <class T> T GenerateRandomEnmu(T enmuMax)
70c2b37d2cSopenharmony_ci    {
71c2b37d2cSopenharmony_ci        return static_cast<T>(GetData<uint32_t>() % (static_cast<uint32_t>(enmuMax) + 1));
72c2b37d2cSopenharmony_ci    }
73c2b37d2cSopenharmony_ci
74c2b37d2cSopenharmony_ci    bool GenerateRandomBool()
75c2b37d2cSopenharmony_ci    {
76c2b37d2cSopenharmony_ci        return (GetData<uint32_t>() % BOOL_MODULO_NUM) == 0;
77c2b37d2cSopenharmony_ci    }
78c2b37d2cSopenharmony_ci
79c2b37d2cSopenharmony_cipublic:
80c2b37d2cSopenharmony_ci    size_t pos_;
81c2b37d2cSopenharmony_ci
82c2b37d2cSopenharmony_ciprivate:
83c2b37d2cSopenharmony_ci    const uint8_t *data_;
84c2b37d2cSopenharmony_ci    const size_t size_;
85c2b37d2cSopenharmony_ci};
86c2b37d2cSopenharmony_ci} // namespace OHOS
87c2b37d2cSopenharmony_ci#endif // FUZZ_DATA_H