• 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 #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 */