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 #include "hitls_build.h"
16 #ifdef HITLS_TLS_FEATURE_SESSION_TICKET
17 #include <stdbool.h>
18 #include "securec.h"
19 #include "tlv.h"
20 #include "bsl_log_internal.h"
21 #include "bsl_log.h"
22 #include "bsl_err_internal.h"
23 #include "tls_binlog_id.h"
24 #include "bsl_bytes.h"
25 #include "bsl_sal.h"
26 #include "hitls_error.h"
27 #include "session_enc.h"
28 #include "session_type.h"
29 #include "cert_mgr_ctx.h"
30 #include "cert_method.h"
31 #include "parse_common.h"
32
33 #define MAX_PSK_IDENTITY_LEN 0xffff
34 #ifdef HITLS_TLS_FEATURE_SNI
35 #define MAX_HOST_NAME_LEN 0xff
36 #endif
37 typedef int32_t (*PfuncDecSessionObjFunc)(HITLS_Session *sess, SessionObjType type, const uint8_t *data,
38 uint32_t length, uint32_t *readLen);
39
40 typedef struct {
41 SessionObjType type;
42 PfuncDecSessionObjFunc func;
43 } SessObjDecFunc;
44
DecSessObjVersion(HITLS_Session * sess,SessionObjType type,const uint8_t * data,uint32_t length,uint32_t * readLen)45 static int32_t DecSessObjVersion(HITLS_Session *sess, SessionObjType type, const uint8_t *data, uint32_t length,
46 uint32_t *readLen)
47 {
48 int32_t ret;
49 uint16_t version = 0;
50 BSL_Tlv tlv = {0};
51 tlv.length = sizeof(version);
52 tlv.value = (uint8_t *)&version;
53
54 ret = BSL_TLV_Parse(type, data, length, &tlv, readLen);
55 if (ret != BSL_SUCCESS) {
56 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DEC_VERSION_FAIL);
57 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID15993, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
58 "decode session version fail. ret %d", ret, 0, 0, 0);
59 return HITLS_SESS_ERR_DEC_VERSION_FAIL;
60 }
61
62 sess->version = version;
63 return HITLS_SUCCESS;
64 }
65
DecSessObjCipherSuite(HITLS_Session * sess,SessionObjType type,const uint8_t * data,uint32_t length,uint32_t * readLen)66 static int32_t DecSessObjCipherSuite(HITLS_Session *sess, SessionObjType type, const uint8_t *data, uint32_t length,
67 uint32_t *readLen)
68 {
69 int32_t ret;
70 uint16_t cipherSuite = 0;
71 BSL_Tlv tlv = {0};
72 tlv.length = sizeof(cipherSuite);
73 tlv.value = (uint8_t *)&cipherSuite;
74
75 ret = BSL_TLV_Parse(type, data, length, &tlv, readLen);
76 if (ret != BSL_SUCCESS) {
77 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DEC_CIPHER_SUITE_FAIL);
78 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID15994, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
79 "decode session cipher suite fail. ret %d", ret, 0, 0, 0);
80 return HITLS_SESS_ERR_DEC_CIPHER_SUITE_FAIL;
81 }
82
83 sess->cipherSuite = cipherSuite;
84 return HITLS_SUCCESS;
85 }
86
DecSessObjMasterSecret(HITLS_Session * sess,SessionObjType type,const uint8_t * data,uint32_t length,uint32_t * readLen)87 static int32_t DecSessObjMasterSecret(HITLS_Session *sess, SessionObjType type, const uint8_t *data, uint32_t length,
88 uint32_t *readLen)
89 {
90 int32_t ret;
91 BSL_Tlv tlv = {0};
92 tlv.length = MAX_MASTER_KEY_SIZE;
93 tlv.value = sess->masterKey;
94
95 ret = BSL_TLV_Parse(type, data, length, &tlv, readLen);
96 if (ret != BSL_SUCCESS) {
97 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DEC_MASTER_SECRET_FAIL);
98 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID15995, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
99 "decode session master secret fail. ret %d", ret, 0, 0, 0);
100 return HITLS_SESS_ERR_DEC_MASTER_SECRET_FAIL;
101 }
102
103 sess->masterKeySize = tlv.length;
104 return HITLS_SUCCESS;
105 }
106
DecSessObjStartTime(HITLS_Session * sess,SessionObjType type,const uint8_t * data,uint32_t length,uint32_t * readLen)107 static int32_t DecSessObjStartTime(HITLS_Session *sess, SessionObjType type, const uint8_t *data, uint32_t length,
108 uint32_t *readLen)
109 {
110 int32_t ret;
111 uint64_t startTime = 0;
112 BSL_Tlv tlv = {0};
113 tlv.length = sizeof(startTime);
114 tlv.value = (uint8_t *)&startTime;
115
116 ret = BSL_TLV_Parse(type, data, length, &tlv, readLen);
117 if (ret != BSL_SUCCESS) {
118 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DEC_START_TIME_FAIL);
119 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID15998, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
120 "decode session start time fail. ret %d", ret, 0, 0, 0);
121 return HITLS_SESS_ERR_DEC_START_TIME_FAIL;
122 }
123
124 sess->startTime = startTime;
125 return HITLS_SUCCESS;
126 }
127
DecSessObjTimeout(HITLS_Session * sess,SessionObjType type,const uint8_t * data,uint32_t length,uint32_t * readLen)128 static int32_t DecSessObjTimeout(HITLS_Session *sess, SessionObjType type, const uint8_t *data, uint32_t length,
129 uint32_t *readLen)
130 {
131 int32_t ret;
132 uint64_t timeout = 0;
133 BSL_Tlv tlv = {0};
134 tlv.length = sizeof(timeout);
135 tlv.value = (uint8_t *)&timeout;
136
137 ret = BSL_TLV_Parse(type, data, length, &tlv, readLen);
138 if (ret != BSL_SUCCESS) {
139 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DEC_TIME_OUT_FAIL);
140 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID15999, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
141 "decode session timeout fail. ret %d", ret, 0, 0, 0);
142 return HITLS_SESS_ERR_DEC_TIME_OUT_FAIL;
143 }
144
145 sess->timeout = timeout;
146 return HITLS_SUCCESS;
147 }
148
149 #ifdef HITLS_TLS_FEATURE_SNI
DecSessObjHostName(HITLS_Session * sess,SessionObjType type,const uint8_t * data,uint32_t length,uint32_t * readLen)150 static int32_t DecSessObjHostName(HITLS_Session *sess, SessionObjType type, const uint8_t *data, uint32_t length,
151 uint32_t *readLen)
152 {
153 int32_t ret;
154 uint32_t offset = sizeof(uint32_t);
155 // The length has been verified at the upper layer and must be greater than 8 bytes.
156 uint32_t tlvLen = BSL_ByteToUint32(&data[offset]);
157 if (tlvLen > MAX_HOST_NAME_LEN || tlvLen == 0) {
158 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16701, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN, "tlvLen error", 0, 0, 0, 0);
159 return HITLS_SESS_ERR_DEC_HOST_NAME_FAIL;
160 }
161 uint8_t *hostName = BSL_SAL_Calloc(1u, tlvLen);
162 if (hostName == NULL) {
163 BSL_ERR_PUSH_ERROR(HITLS_MEMALLOC_FAIL);
164 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16000, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
165 "malloc hostName fail when decode session obj host name.", 0, 0, 0, 0);
166 return HITLS_MEMALLOC_FAIL;
167 }
168
169 BSL_Tlv tlv = {0};
170 tlv.length = tlvLen;
171 tlv.value = hostName;
172
173 ret = BSL_TLV_Parse(type, data, length, &tlv, readLen);
174 if (ret != BSL_SUCCESS) {
175 BSL_SAL_FREE(hostName);
176 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DEC_HOST_NAME_FAIL);
177 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16001, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
178 "decode session host name fail. ret %d", ret, 0, 0, 0);
179 return HITLS_SESS_ERR_DEC_HOST_NAME_FAIL;
180 }
181
182 sess->hostName = tlv.value;
183 sess->hostNameSize = tlv.length;
184 return HITLS_SUCCESS;
185 }
186 #endif /* HITLS_TLS_FEATURE_SNI */
187
DecSessObjSessionIdCtx(HITLS_Session * sess,SessionObjType type,const uint8_t * data,uint32_t length,uint32_t * readLen)188 static int32_t DecSessObjSessionIdCtx(HITLS_Session *sess, SessionObjType type, const uint8_t *data, uint32_t length,
189 uint32_t *readLen)
190 {
191 int32_t ret;
192 BSL_Tlv tlv = {0};
193 tlv.length = HITLS_SESSION_ID_MAX_SIZE;
194 tlv.value = sess->sessionIdCtx;
195
196 ret = BSL_TLV_Parse(type, data, length, &tlv, readLen);
197 if (ret != BSL_SUCCESS) {
198 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DEC_SESSION_ID_CTX_FAIL);
199 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16002, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
200 "decode session session id ctx fail. ret %d", ret, 0, 0, 0);
201 return HITLS_SESS_ERR_DEC_SESSION_ID_CTX_FAIL;
202 }
203
204 sess->sessionIdCtxSize = tlv.length;
205 return HITLS_SUCCESS;
206 }
207
DecSessObjSessionId(HITLS_Session * sess,SessionObjType type,const uint8_t * data,uint32_t length,uint32_t * readLen)208 static int32_t DecSessObjSessionId(HITLS_Session *sess, SessionObjType type, const uint8_t *data, uint32_t length,
209 uint32_t *readLen)
210 {
211 int32_t ret;
212 BSL_Tlv tlv = {0};
213 tlv.length = HITLS_SESSION_ID_MAX_SIZE;
214 tlv.value = sess->sessionId;
215
216 ret = BSL_TLV_Parse(type, data, length, &tlv, readLen);
217 if (ret != BSL_SUCCESS) {
218 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DEC_SESSION_ID_FAIL);
219 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16003, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
220 "decode session session id fail. ret %d", ret, 0, 0, 0);
221 return HITLS_SESS_ERR_DEC_SESSION_ID_FAIL;
222 }
223
224 sess->sessionIdSize = tlv.length;
225 return HITLS_SUCCESS;
226 }
227
DecSessObjExtendMasterSecret(HITLS_Session * sess,SessionObjType type,const uint8_t * data,uint32_t length,uint32_t * readLen)228 static int32_t DecSessObjExtendMasterSecret(HITLS_Session *sess, SessionObjType type, const uint8_t *data,
229 uint32_t length, uint32_t *readLen)
230 {
231 int32_t ret;
232 uint8_t haveExtMasterSecret = 0;
233 BSL_Tlv tlv = {0};
234 tlv.length = sizeof(haveExtMasterSecret);
235 tlv.value = &haveExtMasterSecret;
236
237 ret = BSL_TLV_Parse(type, data, length, &tlv, readLen);
238 if (ret != BSL_SUCCESS) {
239 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DEC_EXT_MASTER_SECRET_FAIL);
240 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16004, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
241 "decode session extend master secret fail. ret %d", ret, 0, 0, 0);
242 return HITLS_SESS_ERR_DEC_EXT_MASTER_SECRET_FAIL;
243 }
244
245 sess->haveExtMasterSecret = (bool)haveExtMasterSecret;
246 return HITLS_SUCCESS;
247 }
248
DecSessObjVerifyResult(HITLS_Session * sess,SessionObjType type,const uint8_t * data,uint32_t length,uint32_t * readLen)249 static int32_t DecSessObjVerifyResult(HITLS_Session *sess, SessionObjType type, const uint8_t *data, uint32_t length,
250 uint32_t *readLen)
251 {
252 int32_t ret;
253 uint32_t verifyResult = 0;
254 BSL_Tlv tlv = {0};
255 tlv.length = sizeof(verifyResult);
256 tlv.value = (uint8_t *)&verifyResult;
257
258 ret = BSL_TLV_Parse(type, data, length, &tlv, readLen);
259 if (ret != BSL_SUCCESS) {
260 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DEC_VERIFY_RESULT_FAIL);
261 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16005, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
262 "decode session verify result fail. ret %d", ret, 0, 0, 0);
263 return HITLS_SESS_ERR_DEC_VERIFY_RESULT_FAIL;
264 }
265
266 sess->verifyResult = (int32_t)verifyResult;
267 return HITLS_SUCCESS;
268 }
269
ParseBufToCert(HITLS_Session * sess,const uint8_t * buf,uint32_t bufLen)270 static int32_t ParseBufToCert(HITLS_Session *sess, const uint8_t *buf, uint32_t bufLen)
271 {
272 uint32_t offset = 0;
273 ParsePacket pkt = {.ctx = NULL, .buf = buf, .bufLen = bufLen, .bufOffset = &offset};
274 /* Obtain the certificate length */
275 uint32_t certLen = 0;
276 int32_t ret = ParseBytesToUint24(&pkt, &certLen);
277 if (ret != HITLS_SUCCESS || (certLen != (pkt.bufLen - CERT_LEN_TAG_SIZE))) {
278 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16260, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
279 "decode certLen fail.", 0, 0, 0, 0);
280 return HITLS_PARSE_INVALID_MSG_LEN;
281 }
282 #ifndef HITLS_TLS_FEATURE_PROVIDER
283 CERT_MgrCtx *certMgrCtx = sess->certMgrCtx;
284 if (certMgrCtx == NULL || certMgrCtx->method.certParse == NULL) {
285 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16261, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
286 "certMgrCtx or certMgrCtx->method.certParse is null.", 0, 0, 0, 0);
287 return HITLS_NULL_INPUT;
288 }
289
290 /* Parse the first device certificate. */
291 HITLS_CERT_X509 *cert = certMgrCtx->method.certParse(NULL, &pkt.buf[*pkt.bufOffset], certLen,
292 TLS_PARSE_TYPE_BUFF, TLS_PARSE_FORMAT_ASN1);
293 #else
294 HITLS_CERT_X509 *cert = SAL_CERT_X509Parse(LIBCTX_FROM_SESSION_CTX(sess),
295 ATTRIBUTE_FROM_SESSION_CTX(sess), NULL, &pkt.buf[*pkt.bufOffset], certLen,
296 TLS_PARSE_TYPE_BUFF, TLS_PARSE_FORMAT_ASN1);
297 #endif
298 if (cert == NULL) {
299 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16262, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
300 "parse peer eecert error", 0, 0, 0, 0);
301 return HITLS_CERT_ERR_PARSE_MSG;
302 }
303
304 CERT_Pair *newCertPair = BSL_SAL_Calloc(1u, sizeof(CERT_Pair));
305 if (newCertPair == NULL) {
306 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16263, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
307 "peer cert malloc fail.", 0, 0, 0, 0);
308 SAL_CERT_X509Free(cert);
309 return HITLS_MEMALLOC_FAIL;
310 }
311 newCertPair->cert = cert;
312 sess->peerCert = newCertPair;
313 return HITLS_SUCCESS;
314 }
315
DecSessObjPeerCert(HITLS_Session * sess,SessionObjType type,const uint8_t * data,uint32_t length,uint32_t * readLen)316 static int32_t DecSessObjPeerCert(HITLS_Session *sess, SessionObjType type, const uint8_t *data, uint32_t length,
317 uint32_t *readLen)
318 {
319 (void)type;
320 uint32_t offset = sizeof(uint32_t);
321 // The length has been verified at the upper layer and must be greater than 8 bytes.
322 uint32_t tlvLen = BSL_ByteToUint32(&data[offset]);
323 offset += sizeof(uint32_t);
324 if ((tlvLen == 0) || (tlvLen > length - offset)) {
325 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DEC_PEER_CERT_FAIL);
326 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16264, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
327 "decode peercert fail.", 0, 0, 0, 0);
328 return HITLS_SESS_ERR_DEC_PEER_CERT_FAIL;
329 }
330
331 *readLen = tlvLen + offset;
332 return ParseBufToCert(sess, &data[offset], tlvLen);
333 }
334
DecSessObjTicketAgeAdd(HITLS_Session * sess,SessionObjType type,const uint8_t * data,uint32_t length,uint32_t * readLen)335 static int32_t DecSessObjTicketAgeAdd(HITLS_Session *sess, SessionObjType type, const uint8_t *data, uint32_t length,
336 uint32_t *readLen)
337 {
338 int32_t ret;
339 uint32_t ticketAgeAdd = 0;
340 BSL_Tlv tlv = {0};
341 tlv.length = sizeof(ticketAgeAdd);
342 tlv.value = (uint8_t *)&ticketAgeAdd;
343
344 ret = BSL_TLV_Parse(type, data, length, &tlv, readLen);
345 if (ret != BSL_SUCCESS) {
346 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DEC_START_TIME_FAIL);
347 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID15998, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
348 "decode session TicketAgeAdd fail. ret %d", ret, 0, 0, 0);
349 return HITLS_SESS_ERR_DEC_START_TIME_FAIL;
350 }
351
352 sess->ticketAgeAdd = ticketAgeAdd;
353 return HITLS_SUCCESS;
354 }
355
356 /*
357 * Decoding function list.
358 * Ensure that the sequence of decode and encode types is the same.
359 */
360 static const SessObjDecFunc OBJ_LIST[] = {
361 {SESS_OBJ_VERSION, DecSessObjVersion},
362 {SESS_OBJ_CIPHER_SUITE, DecSessObjCipherSuite},
363 {SESS_OBJ_MASTER_SECRET, DecSessObjMasterSecret},
364 {SESS_OBJ_PEER_CERT, DecSessObjPeerCert},
365 {SESS_OBJ_START_TIME, DecSessObjStartTime},
366 {SESS_OBJ_TIMEOUT, DecSessObjTimeout},
367 #ifdef HITLS_TLS_FEATURE_SNI
368 {SESS_OBJ_HOST_NAME, DecSessObjHostName},
369 #endif
370 {SESS_OBJ_SESSION_ID_CTX, DecSessObjSessionIdCtx},
371 {SESS_OBJ_SESSION_ID, DecSessObjSessionId},
372 {SESS_OBJ_SUPPORT_EXTEND_MASTER_SECRET, DecSessObjExtendMasterSecret},
373 {SESS_OBJ_VERIFY_RESULT, DecSessObjVerifyResult},
374 {SESS_OBJ_AGE_ADD, DecSessObjTicketAgeAdd},
375 };
376
SESS_Decode(HITLS_Session * sess,const uint8_t * data,uint32_t length)377 int32_t SESS_Decode(HITLS_Session *sess, const uint8_t *data, uint32_t length)
378 {
379 if (sess == NULL || data == NULL) {
380 BSL_ERR_PUSH_ERROR(HITLS_INTERNAL_EXCEPTION);
381 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16006, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
382 "SESS_Decode input parameter is NULL.", 0, 0, 0, 0);
383 return HITLS_INTERNAL_EXCEPTION;
384 }
385
386 int32_t ret;
387 uint32_t index;
388 const uint8_t *curPos = data;
389 uint32_t offset = 0;
390 uint32_t readLen = 0;
391
392 for (index = 0; index < sizeof(OBJ_LIST) / sizeof(SessObjDecFunc); index++) {
393 if (length - offset < TLV_HEADER_LENGTH) {
394 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DECODE_TICKET);
395 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16009, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
396 "SESS_Decode length error, offset is %u, length is %u.", offset, length, 0, 0);
397 return HITLS_SESS_ERR_DECODE_TICKET;
398 }
399
400 uint32_t type = BSL_ByteToUint32(curPos);
401 if (OBJ_LIST[index].type != type) {
402 continue;
403 }
404 readLen = 0;
405 ret = OBJ_LIST[index].func(sess, OBJ_LIST[index].type, curPos, length - offset, &readLen);
406 if (ret != HITLS_SUCCESS) {
407 return ret;
408 }
409 offset += readLen;
410 curPos += readLen;
411 }
412 if (offset != length) {
413 BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_DECODE_TICKET);
414 BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16007, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
415 "SESS_Decode fail, offset is %u, length is %u.", offset, length, 0, 0);
416 return HITLS_SESS_ERR_DECODE_TICKET;
417 }
418
419 return HITLS_SUCCESS;
420 }
421 #endif /* HITLS_TLS_FEATURE_SESSION_TICKET */