• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &param[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 &param[index];
234         }
235         index++;
236     }
237     BSL_ERR_PUSH_ERROR(BSL_PARAMS_MISMATCH);
238     return NULL;
239 }
240 
241 #endif