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}