1 /*
2 * This file is part of the openHiTLS project.
3 *
4 * openHiTLS is licensed under the Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 *
8 * http://license.coscl.org.cn/MulanPSL2
9 *
10 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13 * See the Mulan PSL v2 for more details.
14 */
15
16 #include "hitls_build.h"
17 #ifdef HITLS_BSL_PARAMS
18 #include "bsl_errno.h"
19 #include "securec.h"
20 #include "bsl_err_internal.h"
21 #include "bsl_params.h"
22
23 #define BSL_PARAM_MAX_NUMBER 1000
24
BSL_PARAM_InitValue(BSL_Param * param,int32_t key,uint32_t type,void * val,uint32_t valueLen)25 int32_t BSL_PARAM_InitValue(BSL_Param *param, int32_t key, uint32_t type, void *val, uint32_t valueLen)
26 {
27 if (key == 0) {
28 BSL_ERR_PUSH_ERROR(BSL_PARAMS_INVALID_KEY);
29 return BSL_PARAMS_INVALID_KEY;
30 }
31 if (param == NULL) {
32 BSL_ERR_PUSH_ERROR(BSL_INVALID_ARG);
33 return BSL_INVALID_ARG;
34 }
35 if (type != BSL_PARAM_TYPE_FUNC_PTR && type != BSL_PARAM_TYPE_CTX_PTR) {
36 /* Parameter validation: param cannot be NULL, if val is NULL, valueLen must be 0 */
37 if (val == NULL && valueLen != 0) {
38 BSL_ERR_PUSH_ERROR(BSL_INVALID_ARG);
39 return BSL_INVALID_ARG;
40 }
41 }
42
43 switch (type) {
44 case BSL_PARAM_TYPE_UINT8:
45 case BSL_PARAM_TYPE_UINT16:
46 case BSL_PARAM_TYPE_UINT32:
47 case BSL_PARAM_TYPE_OCTETS:
48 case BSL_PARAM_TYPE_BOOL:
49 case BSL_PARAM_TYPE_UINT32_PTR:
50 case BSL_PARAM_TYPE_FUNC_PTR:
51 case BSL_PARAM_TYPE_CTX_PTR:
52 case BSL_PARAM_TYPE_INT32:
53 case BSL_PARAM_TYPE_OCTETS_PTR:
54 param->value = val;
55 param->valueLen = valueLen;
56 param->valueType = type;
57 param->key = key;
58 param->useLen = 0;
59 return BSL_SUCCESS;
60 default:
61 BSL_ERR_PUSH_ERROR(BSL_PARAMS_INVALID_TYPE);
62 return BSL_PARAMS_INVALID_TYPE;
63 }
64 }
65
ParamCheck(BSL_Param * param,int32_t key,uint32_t type)66 static int32_t ParamCheck(BSL_Param *param, int32_t key, uint32_t type)
67 {
68 if (key == 0) {
69 BSL_ERR_PUSH_ERROR(BSL_PARAMS_INVALID_KEY);
70 return BSL_PARAMS_INVALID_KEY;
71 }
72 if (param == NULL) {
73 BSL_ERR_PUSH_ERROR(BSL_INVALID_ARG);
74 return BSL_INVALID_ARG;
75 }
76 if (param->key != key || param->valueType != type) {
77 BSL_ERR_PUSH_ERROR(BSL_PARAMS_MISMATCH);
78 return BSL_PARAMS_MISMATCH;
79 }
80 return BSL_SUCCESS;
81 }
82
SetOtherValues(BSL_Param * param,uint32_t type,void * val,uint32_t len)83 static int32_t SetOtherValues(BSL_Param *param, uint32_t type, void *val, uint32_t len)
84 {
85 if (param->valueLen != len || val == NULL || param->value == NULL) {
86 BSL_ERR_PUSH_ERROR(BSL_INVALID_ARG);
87 return BSL_INVALID_ARG;
88 }
89 switch (type) {
90 case BSL_PARAM_TYPE_UINT8:
91 *(uint8_t *)param->value = *(uint8_t *)val;
92 param->useLen = len;
93 return BSL_SUCCESS;
94 case BSL_PARAM_TYPE_UINT16:
95 *(uint16_t *)param->value = *(uint16_t *)val;
96 param->useLen = len;
97 return BSL_SUCCESS;
98 case BSL_PARAM_TYPE_UINT32:
99 *(uint32_t *)param->value = *(uint32_t *)val;
100 param->useLen = len;
101 return BSL_SUCCESS;
102 case BSL_PARAM_TYPE_BOOL:
103 *(bool *)param->value = *(bool *)val;
104 param->useLen = len;
105 return BSL_SUCCESS;
106 default:
107 BSL_ERR_PUSH_ERROR(BSL_PARAMS_INVALID_TYPE);
108 return BSL_PARAMS_INVALID_TYPE;
109 }
110 }
111
BSL_PARAM_SetValue(BSL_Param * param,int32_t key,uint32_t type,void * val,uint32_t len)112 int32_t BSL_PARAM_SetValue(BSL_Param *param, int32_t key, uint32_t type, void *val, uint32_t len)
113 {
114 int32_t ret = ParamCheck(param, key, type);
115 if (ret != BSL_SUCCESS) {
116 return ret;
117 }
118 switch (type) {
119 case BSL_PARAM_TYPE_OCTETS_PTR:
120 case BSL_PARAM_TYPE_FUNC_PTR:
121 case BSL_PARAM_TYPE_CTX_PTR:
122 param->value = val;
123 param->useLen = len;
124 return BSL_SUCCESS;
125 default:
126 return SetOtherValues(param, type, val, len);
127 }
128 }
129
BSL_PARAM_GetPtrValue(const BSL_Param * param,int32_t key,uint32_t type,void ** val,uint32_t * valueLen)130 int32_t BSL_PARAM_GetPtrValue(const BSL_Param *param, int32_t key, uint32_t type, void **val, uint32_t *valueLen)
131 {
132 if (key == 0) {
133 BSL_ERR_PUSH_ERROR(BSL_PARAMS_INVALID_KEY);
134 return BSL_PARAMS_INVALID_KEY;
135 }
136 if (param == NULL || val == NULL) {
137 BSL_ERR_PUSH_ERROR(BSL_INVALID_ARG);
138 return BSL_INVALID_ARG;
139 }
140 if (type != BSL_PARAM_TYPE_FUNC_PTR && type != BSL_PARAM_TYPE_CTX_PTR) {
141 if (valueLen == NULL) {
142 BSL_ERR_PUSH_ERROR(BSL_INVALID_ARG);
143 return BSL_INVALID_ARG;
144 }
145 }
146 if (param->key != key || param->valueType != type) {
147 BSL_ERR_PUSH_ERROR(BSL_PARAMS_MISMATCH);
148 return BSL_PARAMS_MISMATCH;
149 }
150 switch (type) {
151 case BSL_PARAM_TYPE_UINT32_PTR:
152 case BSL_PARAM_TYPE_OCTETS_PTR:
153 *val = param->value;
154 *valueLen = param->valueLen;
155 return BSL_SUCCESS;
156 case BSL_PARAM_TYPE_FUNC_PTR:
157 case BSL_PARAM_TYPE_CTX_PTR:
158 *val = param->value;
159 return BSL_SUCCESS;
160 default:
161 BSL_ERR_PUSH_ERROR(BSL_PARAMS_INVALID_TYPE);
162 return BSL_PARAMS_INVALID_TYPE;
163 }
164 }
165
BSL_PARAM_GetValue(const BSL_Param * param,int32_t key,uint32_t type,void * val,uint32_t * valueLen)166 int32_t BSL_PARAM_GetValue(const BSL_Param *param, int32_t key, uint32_t type, void *val, uint32_t *valueLen)
167 {
168 if (key == 0) {
169 BSL_ERR_PUSH_ERROR(BSL_PARAMS_INVALID_KEY);
170 return BSL_PARAMS_INVALID_KEY;
171 }
172 if (param == NULL || val == NULL || valueLen == NULL) {
173 BSL_ERR_PUSH_ERROR(BSL_INVALID_ARG);
174 return BSL_INVALID_ARG;
175 }
176 if (param->key != key || param->valueType != type) {
177 BSL_ERR_PUSH_ERROR(BSL_PARAMS_MISMATCH);
178 return BSL_PARAMS_MISMATCH;
179 }
180 switch (type) {
181 case BSL_PARAM_TYPE_UINT16:
182 case BSL_PARAM_TYPE_UINT32:
183 case BSL_PARAM_TYPE_OCTETS:
184 case BSL_PARAM_TYPE_BOOL:
185 case BSL_PARAM_TYPE_INT32:
186 if (*valueLen < param->valueLen) {
187 BSL_ERR_PUSH_ERROR(BSL_INVALID_ARG);
188 return BSL_INVALID_ARG;
189 }
190 (void)memcpy_s(val, param->valueLen, param->value, param->valueLen);
191 *valueLen = param->valueLen;
192 return BSL_SUCCESS;
193 default:
194 BSL_ERR_PUSH_ERROR(BSL_PARAMS_INVALID_TYPE);
195 return BSL_PARAMS_INVALID_TYPE;
196 }
197 }
198
BSL_PARAM_FindConstParam(const BSL_Param * param,int32_t key)199 const BSL_Param *BSL_PARAM_FindConstParam(const BSL_Param *param, int32_t key)
200 {
201 if (key == 0) {
202 BSL_ERR_PUSH_ERROR(BSL_PARAMS_INVALID_KEY);
203 return NULL;
204 }
205 if (param == NULL) {
206 BSL_ERR_PUSH_ERROR(BSL_INVALID_ARG);
207 return NULL;
208 }
209 int32_t index = 0;
210 while (param[index].key != 0 && index < BSL_PARAM_MAX_NUMBER) {
211 if (param[index].key == key) {
212 return ¶m[index];
213 }
214 index++;
215 }
216 BSL_ERR_PUSH_ERROR(BSL_PARAMS_MISMATCH);
217 return NULL;
218 }
219
BSL_PARAM_FindParam(BSL_Param * param,int32_t key)220 BSL_Param *BSL_PARAM_FindParam(BSL_Param *param, int32_t key)
221 {
222 if (key == 0) {
223 BSL_ERR_PUSH_ERROR(BSL_PARAMS_INVALID_KEY);
224 return NULL;
225 }
226 if (param == NULL) {
227 BSL_ERR_PUSH_ERROR(BSL_INVALID_ARG);
228 return NULL;
229 }
230 int32_t index = 0;
231 while (param[index].key != 0 && index < BSL_PARAM_MAX_NUMBER) {
232 if (param[index].key == key) {
233 return ¶m[index];
234 }
235 index++;
236 }
237 BSL_ERR_PUSH_ERROR(BSL_PARAMS_MISMATCH);
238 return NULL;
239 }
240
241 #endif