18e920a95Sopenharmony_ci/*
28e920a95Sopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
38e920a95Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
48e920a95Sopenharmony_ci * you may not use this file except in compliance with the License.
58e920a95Sopenharmony_ci * You may obtain a copy of the License at
68e920a95Sopenharmony_ci *
78e920a95Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
88e920a95Sopenharmony_ci *
98e920a95Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
108e920a95Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
118e920a95Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128e920a95Sopenharmony_ci * See the License for the specific language governing permissions and
138e920a95Sopenharmony_ci * limitations under the License.
148e920a95Sopenharmony_ci */
158e920a95Sopenharmony_ci
168e920a95Sopenharmony_ci#ifndef CODE_SIGN_BYTE_BUFFER_H
178e920a95Sopenharmony_ci#define CODE_SIGN_BYTE_BUFFER_H
188e920a95Sopenharmony_ci
198e920a95Sopenharmony_ci#include <memory>
208e920a95Sopenharmony_ci#include <climits>
218e920a95Sopenharmony_ci#include <cstdio>
228e920a95Sopenharmony_ci#include <cstdint>
238e920a95Sopenharmony_ci#include <cstdlib>
248e920a95Sopenharmony_ci#include <cstring>
258e920a95Sopenharmony_ci#include <securec.h>
268e920a95Sopenharmony_ci
278e920a95Sopenharmony_cinamespace OHOS {
288e920a95Sopenharmony_cinamespace Security {
298e920a95Sopenharmony_cinamespace CodeSign {
308e920a95Sopenharmony_ciclass ByteBuffer {
318e920a95Sopenharmony_cipublic:
328e920a95Sopenharmony_ci    ByteBuffer(): data(nullptr), size(0)
338e920a95Sopenharmony_ci    {
348e920a95Sopenharmony_ci    }
358e920a95Sopenharmony_ci
368e920a95Sopenharmony_ci    ByteBuffer(uint32_t bufferSize): data(nullptr), size(0)
378e920a95Sopenharmony_ci    {
388e920a95Sopenharmony_ci        Init(bufferSize);
398e920a95Sopenharmony_ci    }
408e920a95Sopenharmony_ci
418e920a95Sopenharmony_ci    ByteBuffer(const ByteBuffer &other): data(nullptr), size(0)
428e920a95Sopenharmony_ci    {
438e920a95Sopenharmony_ci        CopyFrom(other.GetBuffer(), other.GetSize());
448e920a95Sopenharmony_ci    }
458e920a95Sopenharmony_ci
468e920a95Sopenharmony_ci    ~ByteBuffer()
478e920a95Sopenharmony_ci    {
488e920a95Sopenharmony_ci        if (data != nullptr) {
498e920a95Sopenharmony_ci            data.reset(nullptr);
508e920a95Sopenharmony_ci            data = nullptr;
518e920a95Sopenharmony_ci        }
528e920a95Sopenharmony_ci        size = 0;
538e920a95Sopenharmony_ci    }
548e920a95Sopenharmony_ci    bool CopyFrom(const uint8_t *srcData, uint32_t srcSize)
558e920a95Sopenharmony_ci    {
568e920a95Sopenharmony_ci        if (srcData == nullptr) {
578e920a95Sopenharmony_ci            return false;
588e920a95Sopenharmony_ci        }
598e920a95Sopenharmony_ci        if (!Resize(srcSize)) {
608e920a95Sopenharmony_ci            return false;
618e920a95Sopenharmony_ci        }
628e920a95Sopenharmony_ci        if (memcpy_s(data.get(), size, srcData, srcSize) != EOK) {
638e920a95Sopenharmony_ci            return false;
648e920a95Sopenharmony_ci        }
658e920a95Sopenharmony_ci        return true;
668e920a95Sopenharmony_ci    }
678e920a95Sopenharmony_ci
688e920a95Sopenharmony_ci    bool PutData(uint32_t pos, const uint8_t *srcData, uint32_t srcSize)
698e920a95Sopenharmony_ci    {
708e920a95Sopenharmony_ci        if (pos >= size) {
718e920a95Sopenharmony_ci            return false;
728e920a95Sopenharmony_ci        }
738e920a95Sopenharmony_ci        if (memcpy_s(data.get() + pos, size - pos, srcData, srcSize) != EOK) {
748e920a95Sopenharmony_ci            return false;
758e920a95Sopenharmony_ci        }
768e920a95Sopenharmony_ci        return true;
778e920a95Sopenharmony_ci    }
788e920a95Sopenharmony_ci
798e920a95Sopenharmony_ci    bool Resize(uint32_t newSize)
808e920a95Sopenharmony_ci    {
818e920a95Sopenharmony_ci        if (data != nullptr) {
828e920a95Sopenharmony_ci            data.reset(nullptr);
838e920a95Sopenharmony_ci        }
848e920a95Sopenharmony_ci        return Init(newSize);
858e920a95Sopenharmony_ci    }
868e920a95Sopenharmony_ci
878e920a95Sopenharmony_ci    uint8_t *GetBuffer() const
888e920a95Sopenharmony_ci    {
898e920a95Sopenharmony_ci        return data.get();
908e920a95Sopenharmony_ci    }
918e920a95Sopenharmony_ci
928e920a95Sopenharmony_ci    uint32_t GetSize() const
938e920a95Sopenharmony_ci    {
948e920a95Sopenharmony_ci        return size;
958e920a95Sopenharmony_ci    }
968e920a95Sopenharmony_ci
978e920a95Sopenharmony_ci    bool Empty() const
988e920a95Sopenharmony_ci    {
998e920a95Sopenharmony_ci        return (size == 0) || (data == nullptr);
1008e920a95Sopenharmony_ci    }
1018e920a95Sopenharmony_ciprivate:
1028e920a95Sopenharmony_ci    bool Init(uint32_t bufferSize)
1038e920a95Sopenharmony_ci    {
1048e920a95Sopenharmony_ci        if (bufferSize == 0) {
1058e920a95Sopenharmony_ci            return false;
1068e920a95Sopenharmony_ci        }
1078e920a95Sopenharmony_ci        data = std::make_unique<uint8_t[]>(bufferSize);
1088e920a95Sopenharmony_ci        if (data == nullptr) {
1098e920a95Sopenharmony_ci            return false;
1108e920a95Sopenharmony_ci        }
1118e920a95Sopenharmony_ci        size = bufferSize;
1128e920a95Sopenharmony_ci        return true;
1138e920a95Sopenharmony_ci    }
1148e920a95Sopenharmony_ci
1158e920a95Sopenharmony_ci    std::unique_ptr<uint8_t[]> data;
1168e920a95Sopenharmony_ci    uint32_t size;
1178e920a95Sopenharmony_ci};
1188e920a95Sopenharmony_ci}
1198e920a95Sopenharmony_ci}
1208e920a95Sopenharmony_ci}
1218e920a95Sopenharmony_ci#endif