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