1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "c_array.h" 17094332d3Sopenharmony_ci 18094332d3Sopenharmony_ci#include "securec.h" 19094332d3Sopenharmony_ci 20094332d3Sopenharmony_ci#include "adaptor_log.h" 21094332d3Sopenharmony_ci#include "adaptor_memory.h" 22094332d3Sopenharmony_ci 23094332d3Sopenharmony_civoid DestroyUint8Array(Uint8Array **array) 24094332d3Sopenharmony_ci{ 25094332d3Sopenharmony_ci IF_TRUE_LOGE_AND_RETURN(array == NULL); 26094332d3Sopenharmony_ci if (*array == NULL) { 27094332d3Sopenharmony_ci return; 28094332d3Sopenharmony_ci } 29094332d3Sopenharmony_ci if ((*array)->len != 0 && ((*array)->len < UINT32_MAX / sizeof(uint8_t))) { 30094332d3Sopenharmony_ci uint32_t arraySize = sizeof(uint8_t) * (*array)->len; 31094332d3Sopenharmony_ci (void)memset_s((*array)->data, arraySize, 0, arraySize); 32094332d3Sopenharmony_ci } 33094332d3Sopenharmony_ci IAM_FREE_AND_SET_NULL((*array)->data); 34094332d3Sopenharmony_ci IAM_FREE_AND_SET_NULL(*array); 35094332d3Sopenharmony_ci} 36094332d3Sopenharmony_ci 37094332d3Sopenharmony_civoid DestroyUint64Array(Uint64Array **array) 38094332d3Sopenharmony_ci{ 39094332d3Sopenharmony_ci IF_TRUE_LOGE_AND_RETURN(array == NULL); 40094332d3Sopenharmony_ci if (*array == NULL) { 41094332d3Sopenharmony_ci return; 42094332d3Sopenharmony_ci } 43094332d3Sopenharmony_ci if ((*array)->len != 0 && ((*array)->len < UINT32_MAX / sizeof(uint64_t))) { 44094332d3Sopenharmony_ci uint32_t arraySize = sizeof(uint64_t) * (*array)->len; 45094332d3Sopenharmony_ci (void)memset_s((*array)->data, arraySize, 0, arraySize); 46094332d3Sopenharmony_ci } 47094332d3Sopenharmony_ci IAM_FREE_AND_SET_NULL((*array)->data); 48094332d3Sopenharmony_ci IAM_FREE_AND_SET_NULL(*array); 49094332d3Sopenharmony_ci} 50094332d3Sopenharmony_ci 51094332d3Sopenharmony_ciUint8Array *CreateUint8ArrayBySize(uint32_t size) 52094332d3Sopenharmony_ci{ 53094332d3Sopenharmony_ci Uint8Array *array = Malloc(sizeof(Uint8Array)); 54094332d3Sopenharmony_ci IF_TRUE_LOGE_AND_RETURN_VAL(array == NULL, NULL); 55094332d3Sopenharmony_ci if (size == 0) { 56094332d3Sopenharmony_ci LOG_INFO("create an empty uint8_t array"); 57094332d3Sopenharmony_ci return array; 58094332d3Sopenharmony_ci } 59094332d3Sopenharmony_ci array->data = Malloc(size); 60094332d3Sopenharmony_ci if (array->data == NULL) { 61094332d3Sopenharmony_ci LOG_ERROR("malloc fail"); 62094332d3Sopenharmony_ci Free(array); 63094332d3Sopenharmony_ci return NULL; 64094332d3Sopenharmony_ci } 65094332d3Sopenharmony_ci array->len = size; 66094332d3Sopenharmony_ci 67094332d3Sopenharmony_ci return array; 68094332d3Sopenharmony_ci} 69094332d3Sopenharmony_ci 70094332d3Sopenharmony_ciUint8Array *CreateUint8ArrayByData(const uint8_t *data, uint32_t len) 71094332d3Sopenharmony_ci{ 72094332d3Sopenharmony_ci if (data == NULL && len != 0) { 73094332d3Sopenharmony_ci LOG_ERROR("invalid para"); 74094332d3Sopenharmony_ci return NULL; 75094332d3Sopenharmony_ci } 76094332d3Sopenharmony_ci 77094332d3Sopenharmony_ci Uint8Array *array = CreateUint8ArrayBySize(len); 78094332d3Sopenharmony_ci IF_TRUE_LOGE_AND_RETURN_VAL(array == NULL, NULL); 79094332d3Sopenharmony_ci if (len == 0) { 80094332d3Sopenharmony_ci return array; 81094332d3Sopenharmony_ci } 82094332d3Sopenharmony_ci 83094332d3Sopenharmony_ci if (memcpy_s(array->data, len, data, len) != EOK) { 84094332d3Sopenharmony_ci LOG_ERROR("memcpy fail"); 85094332d3Sopenharmony_ci DestroyUint8Array(&array); 86094332d3Sopenharmony_ci return NULL; 87094332d3Sopenharmony_ci } 88094332d3Sopenharmony_ci array->len = len; 89094332d3Sopenharmony_ci 90094332d3Sopenharmony_ci return array; 91094332d3Sopenharmony_ci} 92094332d3Sopenharmony_ci 93094332d3Sopenharmony_ciUint64Array *CreateUint64ArrayByData(const uint64_t *data, uint32_t len) 94094332d3Sopenharmony_ci{ 95094332d3Sopenharmony_ci if ((data == NULL && len != 0) || (len > UINT32_MAX / sizeof(uint64_t))) { 96094332d3Sopenharmony_ci LOG_ERROR("invalid para"); 97094332d3Sopenharmony_ci return NULL; 98094332d3Sopenharmony_ci } 99094332d3Sopenharmony_ci 100094332d3Sopenharmony_ci Uint64Array *array = Malloc(sizeof(Uint64Array)); 101094332d3Sopenharmony_ci IF_TRUE_LOGE_AND_RETURN_VAL(array == NULL, NULL); 102094332d3Sopenharmony_ci 103094332d3Sopenharmony_ci if (len == 0) { 104094332d3Sopenharmony_ci return array; 105094332d3Sopenharmony_ci } 106094332d3Sopenharmony_ci 107094332d3Sopenharmony_ci array->data = Malloc(len * sizeof(uint64_t)); 108094332d3Sopenharmony_ci if (array->data == NULL) { 109094332d3Sopenharmony_ci LOG_ERROR("malloc fail"); 110094332d3Sopenharmony_ci Free(array); 111094332d3Sopenharmony_ci return NULL; 112094332d3Sopenharmony_ci } 113094332d3Sopenharmony_ci 114094332d3Sopenharmony_ci if (memcpy_s(array->data, len * sizeof(uint64_t), data, len * sizeof(uint64_t)) != EOK) { 115094332d3Sopenharmony_ci LOG_ERROR("memcpy fail"); 116094332d3Sopenharmony_ci DestroyUint64Array(&array); 117094332d3Sopenharmony_ci return NULL; 118094332d3Sopenharmony_ci } 119094332d3Sopenharmony_ci array->len = len; 120094332d3Sopenharmony_ci 121094332d3Sopenharmony_ci return array; 122094332d3Sopenharmony_ci}