• 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
17 #include <stdbool.h>
18 #include "securec.h"
19 #include "bsl_sal.h"
20 #include "sal_time.h"
21 #include "bsl_hash.h"
22 #include "hitls_error.h"
23 #include "session.h"
24 #include "bsl_errno.h"
25 #include "tls_binlog_id.h"
26 #include "bsl_log_internal.h"
27 #include "bsl_log.h"
28 #include "bsl_err_internal.h"
29 #include "crypt.h"
30 #include "tls.h"
31 #include "session_type.h"
32 #include "session_mgr.h"
33 
34 #define SESSION_DEFAULT_TIMEOUT 7200u
35 #ifdef HITLS_TLS_FEATURE_SESSION
36 #define SESSION_DEFAULT_CACHE_SIZE 256u
37 #endif
38 #define SESSION_GERNERATE_RETRY_MAX_TIMES 10
39 
40 #define SESSION_DEFAULT_HASH_BKT_SZIE 64u
41 
42 typedef struct {
43     uint32_t sessionIdSize;
44     uint8_t sessionId[HITLS_SESSION_ID_MAX_SIZE];
45 } SessionKey;
46 
47 /* For details about the SessKey hash function, see BSL_CstlHashCodeCalcStr */
SessKeyHashCodeCal(uintptr_t key,uint32_t bktSize)48 static uint32_t SessKeyHashCodeCal(uintptr_t key, uint32_t bktSize)
49 {
50     if (bktSize == 0) {
51         return 0;
52     }
53 
54     SessionKey *tmpKey = (SessionKey *)key;
55     uint32_t hashCode =  BSL_HASH_CodeCalc(tmpKey, sizeof(SessionKey));
56     return hashCode % bktSize;
57 }
58 
SessKeyHashMacth(uintptr_t key1,uintptr_t key2)59 static bool SessKeyHashMacth(uintptr_t key1, uintptr_t key2)
60 {
61     SessionKey *tkey1 = (SessionKey *)key1;
62     SessionKey *tkey2 = (SessionKey *)key2;
63 
64     if (memcmp(tkey1, tkey2, sizeof(SessionKey)) == 0) {
65         return true;
66     }
67 
68     return false;
69 }
70 
71 /* Session key copy function, which returns the address for storing character strings */
SessKeyDupFunc(void * src,size_t size)72 static void *SessKeyDupFunc(void *src, size_t size)
73 {
74     if (src == NULL || size == 0) {
75         return NULL;
76     }
77 
78     SessionKey *dupKey = (SessionKey *)BSL_SAL_Dump(src, (uint32_t)size);
79 
80     return (void *)dupKey;
81 }
82 
SessKeyFreeFunc(void * ptr)83 static void SessKeyFreeFunc(void *ptr)
84 {
85     BSL_SAL_FREE(ptr);
86     return;
87 }
88 
89 /* Session copy function */
SessionDupFunc(void * src,size_t size)90 static void *SessionDupFunc(void *src, size_t size)
91 {
92     (void)size;
93     return (void *)HITLS_SESS_Dup((HITLS_Session *)src);
94 }
95 
SessionFreeFunc(void * ptr)96 static void SessionFreeFunc(void *ptr)
97 {
98     HITLS_SESS_Free((HITLS_Session *)ptr);
99     return;
100 }
101 
SESSMGR_New(HITLS_Lib_Ctx * libCtx)102 TLS_SessionMgr *SESSMGR_New(HITLS_Lib_Ctx *libCtx)
103 {
104     TLS_SessionMgr *mgr = (TLS_SessionMgr *)BSL_SAL_Calloc(1u, sizeof(TLS_SessionMgr));
105     if (mgr == NULL) {
106         BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16702, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN, "Calloc fail", 0, 0, 0, 0);
107         return NULL;
108     }
109 
110     if (BSL_SAL_ThreadLockNew(&mgr->lock) != BSL_SUCCESS) {
111         BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16703, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
112             "ThreadLockNew fail", 0, 0, 0, 0);
113         BSL_SAL_FREE(mgr);
114         return NULL;
115     }
116 
117     /* Prepare the default ticket key */
118     if (SAL_CRYPT_Rand(libCtx, mgr->ticketKeyName, sizeof(mgr->ticketKeyName)) != HITLS_SUCCESS ||
119         SAL_CRYPT_Rand(libCtx, mgr->ticketAesKey, sizeof(mgr->ticketAesKey)) != HITLS_SUCCESS ||
120         SAL_CRYPT_Rand(libCtx, mgr->ticketHmacKey, sizeof(mgr->ticketHmacKey)) != HITLS_SUCCESS) {
121         BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16704, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN, "Rand fail", 0, 0, 0, 0);
122         BSL_SAL_ThreadLockFree(mgr->lock);
123         BSL_SAL_FREE(mgr);
124         return NULL;
125     }
126 
127     // Apply for a hash table from mgr->hash
128     ListDupFreeFuncPair keyFunc = {.dupFunc = SessKeyDupFunc, .freeFunc = SessKeyFreeFunc};
129     ListDupFreeFuncPair valueFunc = {.dupFunc = SessionDupFunc, .freeFunc = SessionFreeFunc};
130     mgr->hash = BSL_HASH_Create(SESSION_DEFAULT_HASH_BKT_SZIE,
131         SessKeyHashCodeCal, SessKeyHashMacth, &keyFunc, &valueFunc);
132     if (mgr->hash == NULL) {
133         BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16705, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
134             "HASH_Create fail", 0, 0, 0, 0);
135         BSL_SAL_ThreadLockFree(mgr->lock);
136         BSL_SAL_FREE(mgr);
137         return NULL;
138     }
139 
140 #ifdef HITLS_TLS_FEATURE_SESSION
141     mgr->sessCacheMode = HITLS_SESS_CACHE_SERVER;
142     mgr->sessCacheSize = SESSION_DEFAULT_CACHE_SIZE;
143 #endif
144     mgr->sessTimeout = SESSION_DEFAULT_TIMEOUT;
145     mgr->references = 1;
146     return mgr;
147 }
148 
149 /* Copy the number of references. The number of references increases by 1 */
SESSMGR_Dup(TLS_SessionMgr * mgr)150 TLS_SessionMgr *SESSMGR_Dup(TLS_SessionMgr *mgr)
151 {
152     if (mgr == NULL) {
153         return NULL;
154     }
155 
156     BSL_SAL_ThreadWriteLock(mgr->lock);
157     mgr->references++;
158     BSL_SAL_ThreadUnlock(mgr->lock);
159 
160     return mgr;
161 }
162 
SESSMGR_Free(TLS_SessionMgr * mgr)163 void SESSMGR_Free(TLS_SessionMgr *mgr)
164 {
165     if (mgr != NULL) {
166         BSL_SAL_ThreadWriteLock(mgr->lock);
167         mgr->references--;
168         if (mgr->references > 0) {
169             BSL_SAL_ThreadUnlock(mgr->lock);
170             return;
171         }
172         BSL_SAL_ThreadUnlock(mgr->lock);
173 
174         // Delete all sessions
175         BSL_HASH_Destory(mgr->hash);
176         mgr->hash = NULL;
177 
178         BSL_SAL_ThreadLockFree(mgr->lock);
179         BSL_SAL_FREE(mgr);
180     }
181     return;
182 }
183 
SESSMGR_SetTimeout(TLS_SessionMgr * mgr,uint64_t sessTimeout)184 void SESSMGR_SetTimeout(TLS_SessionMgr *mgr, uint64_t sessTimeout)
185 {
186     if (mgr != NULL) {
187         BSL_SAL_ThreadWriteLock(mgr->lock);
188         mgr->sessTimeout = sessTimeout;
189         BSL_SAL_ThreadUnlock(mgr->lock);
190     }
191     return;
192 }
193 
SESSMGR_GetTimeout(TLS_SessionMgr * mgr)194 uint64_t SESSMGR_GetTimeout(TLS_SessionMgr *mgr)
195 {
196     if (mgr == NULL) {
197         return SESSION_DEFAULT_TIMEOUT;
198     }
199     uint64_t sessTimeout;
200     BSL_SAL_ThreadReadLock(mgr->lock);
201     sessTimeout = mgr->sessTimeout;
202     BSL_SAL_ThreadUnlock(mgr->lock);
203 
204     return sessTimeout;
205 }
206 
207 #ifdef HITLS_TLS_FEATURE_SESSION
SESSMGR_SetCacheMode(TLS_SessionMgr * mgr,HITLS_SESS_CACHE_MODE mode)208 void SESSMGR_SetCacheMode(TLS_SessionMgr *mgr, HITLS_SESS_CACHE_MODE mode)
209 {
210     if (mgr != NULL) {
211         BSL_SAL_ThreadWriteLock(mgr->lock);
212         mgr->sessCacheMode = mode;
213         BSL_SAL_ThreadUnlock(mgr->lock);
214     }
215     return;
216 }
217 
SESSMGR_GetCacheMode(TLS_SessionMgr * mgr)218 HITLS_SESS_CACHE_MODE SESSMGR_GetCacheMode(TLS_SessionMgr *mgr)
219 {
220     HITLS_SESS_CACHE_MODE mode;
221     BSL_SAL_ThreadReadLock(mgr->lock);
222     mode = mgr->sessCacheMode;
223     BSL_SAL_ThreadUnlock(mgr->lock);
224 
225     return mode;
226 }
227 
228 /* Set the maximum number of cache sessions */
SESSMGR_SetCacheSize(TLS_SessionMgr * mgr,uint32_t sessCacheSize)229 void SESSMGR_SetCacheSize(TLS_SessionMgr *mgr, uint32_t sessCacheSize)
230 {
231     if (mgr != NULL) {
232         BSL_SAL_ThreadWriteLock(mgr->lock);
233         mgr->sessCacheSize = sessCacheSize;
234         BSL_SAL_ThreadUnlock(mgr->lock);
235     }
236     return;
237 }
238 
239 /* Obtain the maximum number of cached sessions. Ensure that the pointer is not NULL */
SESSMGR_GetCacheSize(TLS_SessionMgr * mgr)240 uint32_t SESSMGR_GetCacheSize(TLS_SessionMgr *mgr)
241 {
242     uint32_t sessCacheSize = 0u;
243     BSL_SAL_ThreadReadLock(mgr->lock);
244     sessCacheSize = mgr->sessCacheSize;
245     BSL_SAL_ThreadUnlock(mgr->lock);
246 
247     return sessCacheSize;
248 }
249 #endif
250 
251 #if defined(HITLS_TLS_PROTO_TLS_BASIC) || defined(HITLS_TLS_PROTO_DTLS12)
SESSMGR_InsertSession(TLS_SessionMgr * mgr,HITLS_Session * sess,bool isClient)252 void SESSMGR_InsertSession(TLS_SessionMgr *mgr, HITLS_Session *sess, bool isClient)
253 {
254     if (mgr == NULL || sess == NULL) {
255         return;
256     }
257 
258     BSL_SAL_ThreadReadLock(mgr->lock);
259     HITLS_SESS_CACHE_MODE mode = mgr->sessCacheMode;
260     BSL_SAL_ThreadUnlock(mgr->lock);
261 
262     SessionKey key = {0};
263     key.sessionIdSize = sizeof(key.sessionId);
264     if (HITLS_SESS_GetSessionId(sess, key.sessionId, &(key.sessionIdSize)) != HITLS_SUCCESS) {
265         return;
266     }
267 
268     if (key.sessionIdSize == 0) {
269         return;
270     }
271 
272     if (mode == HITLS_SESS_CACHE_NO) {
273         return;
274     }
275 
276     if (isClient == true && mode == HITLS_SESS_CACHE_SERVER) {
277         return;
278     }
279 
280     if (isClient == false && mode == HITLS_SESS_CACHE_CLIENT) {
281         return;
282     }
283 
284     BSL_SAL_ThreadWriteLock(mgr->lock);
285 
286     if (BSL_HASH_Size(mgr->hash) < mgr->sessCacheSize) {
287         /* Insert a session node */
288         BSL_HASH_Insert(mgr->hash, (uintptr_t)&key, sizeof(key), (uintptr_t)sess, 0);
289     } else {
290         BSL_LOG_BINLOG_FIXLEN(
291             BINLOG_ID15305, BSL_LOG_LEVEL_WARN, BSL_LOG_BINLOG_TYPE_RUN, "over sess cache size", 0, 0, 0, 0);
292     }
293 
294     BSL_SAL_ThreadUnlock(mgr->lock);
295     return;
296 }
297 #endif /* #if defined(HITLS_TLS_PROTO_TLS_BASIC) || defined(HITLS_TLS_PROTO_DTLS12) */
298 
299 #ifdef HITLS_TLS_FEATURE_SESSION_ID
300 /* Find the matching session */
SESSMGR_Find(TLS_SessionMgr * mgr,uint8_t * sessionId,uint8_t sessionIdSize)301 HITLS_Session *SESSMGR_Find(TLS_SessionMgr *mgr, uint8_t *sessionId, uint8_t sessionIdSize)
302 {
303     if (mgr == NULL || sessionId == NULL || sessionIdSize == 0) {
304         BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16706, BSL_LOG_LEVEL_WARN, BSL_LOG_BINLOG_TYPE_RUN, "input null", 0, 0, 0, 0);
305         return NULL;
306     }
307     BSL_SAL_ThreadReadLock(mgr->lock);
308 
309     HITLS_Session *sess = NULL;
310     SessionKey key = {0};
311     key.sessionIdSize = sessionIdSize;
312     if (memcpy_s(key.sessionId, sizeof(key.sessionId), sessionId, sessionIdSize) == EOK) {
313         // Query the session corresponding to the key
314         if (BSL_HASH_At(mgr->hash, (uintptr_t)&key, (uintptr_t *)&sess) != BSL_SUCCESS) {
315             BSL_LOG_BINLOG_FIXLEN(
316                 BINLOG_ID15353, BSL_LOG_LEVEL_DEBUG, BSL_LOG_BINLOG_TYPE_RUN, "not find sess", 0, 0, 0, 0);
317                 sess = NULL;
318                 goto EXIT;
319         }
320     }
321 
322     uint64_t curTime = (uint64_t)BSL_SAL_CurrentSysTimeGet();
323     /* Check whether the validity is valid */
324     if (SESS_CheckValidity(sess, curTime) == false) {
325         BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16707, BSL_LOG_LEVEL_INFO, BSL_LOG_BINLOG_TYPE_RUN, "sess time out", 0, 0, 0, 0);
326         sess = NULL;
327     }
328 
329 EXIT:
330     BSL_SAL_ThreadUnlock(mgr->lock);
331     return sess;
332 }
333 
334 #endif /* HITLS_TLS_FEATURE_SESSION_ID */
335 /* Search for the matched session without checking the validity of the session */
SESSMGR_HasMacthSessionId(TLS_SessionMgr * mgr,uint8_t * sessionId,uint8_t sessionIdSize)336 bool SESSMGR_HasMacthSessionId(TLS_SessionMgr *mgr, uint8_t *sessionId, uint8_t sessionIdSize)
337 {
338     if (mgr == NULL || sessionId == NULL || sessionIdSize == 0) {
339         return false;
340     }
341     HITLS_Session *sess = NULL;
342 
343     BSL_SAL_ThreadReadLock(mgr->lock);
344     SessionKey key = {0};
345     key.sessionIdSize = sessionIdSize;
346     if (memcpy_s(key.sessionId, sizeof(key.sessionId), sessionId, sessionIdSize) == EOK) {
347         // Query the session corresponding to the key
348         BSL_HASH_At(mgr->hash, (uintptr_t)&key, (uintptr_t *)&sess);
349     }
350 
351     BSL_SAL_ThreadUnlock(mgr->lock);
352     return (sess == NULL) ? false : true;
353 }
354 
355 /* Clear timeout sessions */
SESSMGR_ClearTimeout(TLS_SessionMgr * mgr)356 void SESSMGR_ClearTimeout(TLS_SessionMgr *mgr)
357 {
358     if (mgr == NULL) {
359         return;
360     }
361 
362     uint64_t curTime = (uint64_t)BSL_SAL_CurrentSysTimeGet();
363 
364     BSL_SAL_ThreadWriteLock(mgr->lock);
365 
366     BSL_HASH_Iterator it = BSL_HASH_IterBegin(mgr->hash);
367 
368     while (it != BSL_HASH_IterEnd(mgr->hash)) {
369         uintptr_t ptr = BSL_HASH_IterValue(mgr->hash, it);
370         HITLS_Session *sess = (HITLS_Session *)ptr;
371         if (SESS_CheckValidity(sess, curTime) == false) {
372             /* Delete the node if it is invalid */
373             uintptr_t tmpKey = BSL_HASH_HashIterKey(mgr->hash, it);
374             // Returns the next iterator of the iterator where the key resides
375             it = BSL_HASH_Erase(mgr->hash, tmpKey);
376         } else {
377             it = BSL_HASH_IterNext(mgr->hash, it);
378         }
379     }
380 
381     BSL_SAL_ThreadUnlock(mgr->lock);
382     return;
383 }
384 
SESSMGR_GernerateSessionId(TLS_Ctx * ctx,uint8_t * sessionId,uint32_t sessionIdSize)385 int32_t SESSMGR_GernerateSessionId(TLS_Ctx *ctx, uint8_t *sessionId, uint32_t sessionIdSize)
386 {
387     int32_t ret = 0;
388     int32_t retry = 0;
389 
390     do {
391         ret = SAL_CRYPT_Rand(LIBCTX_FROM_CTX(ctx), sessionId, sessionIdSize);
392         if (ret != HITLS_SUCCESS) {
393             return ret;
394         }
395 
396         /* If duplicate session IDs already exist, generate new session ID */
397         if (SESSMGR_HasMacthSessionId(ctx->config.tlsConfig.sessMgr, sessionId, (uint8_t)sessionIdSize) == false) {
398             return HITLS_SUCCESS;
399         }
400 
401         retry++;
402     } while (retry < SESSION_GERNERATE_RETRY_MAX_TIMES); // Maximum number of attempts is 10
403 
404     BSL_LOG_BINLOG_FIXLEN(BINLOG_ID15961, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN,
405         "Gernerate server session id error.", 0, 0, 0, 0);
406     BSL_ERR_PUSH_ERROR(HITLS_SESS_ERR_SESSION_ID_GENRATE);
407     return HITLS_SESS_ERR_SESSION_ID_GENRATE;
408 }
409 
410 #ifdef HITLS_TLS_FEATURE_SESSION_TICKET
SESSMGR_SetTicketKeyCb(TLS_SessionMgr * mgr,HITLS_TicketKeyCb ticketKeyCb)411 void SESSMGR_SetTicketKeyCb(TLS_SessionMgr *mgr, HITLS_TicketKeyCb ticketKeyCb)
412 {
413     if (mgr != NULL) {
414         BSL_SAL_ThreadWriteLock(mgr->lock);
415         mgr->ticketKeyCb = ticketKeyCb;
416         BSL_SAL_ThreadUnlock(mgr->lock);
417     }
418     return;
419 }
420 
SESSMGR_GetTicketKeyCb(TLS_SessionMgr * mgr)421 HITLS_TicketKeyCb SESSMGR_GetTicketKeyCb(TLS_SessionMgr *mgr)
422 {
423     if (mgr == NULL) {
424         return NULL;
425     }
426     HITLS_TicketKeyCb ticketKeyCb;
427     BSL_SAL_ThreadReadLock(mgr->lock);
428     ticketKeyCb = mgr->ticketKeyCb;
429     BSL_SAL_ThreadUnlock(mgr->lock);
430 
431     return ticketKeyCb;
432 }
433 
SESSMGR_GetTicketKey(const TLS_SessionMgr * mgr,uint8_t * key,uint32_t keySize,uint32_t * outSize)434 int32_t SESSMGR_GetTicketKey(const TLS_SessionMgr *mgr, uint8_t *key, uint32_t keySize, uint32_t *outSize)
435 {
436     if (mgr == NULL || key == NULL || outSize == NULL) {
437         BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16708, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN, "input null", 0, 0, 0, 0);
438         BSL_ERR_PUSH_ERROR(HITLS_NULL_INPUT);
439         return HITLS_NULL_INPUT;
440     }
441 
442     BSL_SAL_ThreadReadLock(mgr->lock);
443 
444     uint32_t offset = 0;
445     if (memcpy_s(key, keySize, mgr->ticketKeyName, HITLS_TICKET_KEY_NAME_SIZE) != EOK) {
446         BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16709, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN, "memcpy fail", 0, 0, 0, 0);
447         BSL_ERR_PUSH_ERROR(HITLS_MEMCPY_FAIL);
448         BSL_SAL_ThreadUnlock(mgr->lock);
449         return HITLS_MEMCPY_FAIL;
450     }
451     offset += HITLS_TICKET_KEY_NAME_SIZE;
452 
453     if (memcpy_s(&key[offset], keySize - offset, mgr->ticketAesKey, HITLS_TICKET_KEY_SIZE) != EOK) {
454         BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16710, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN, "memcpy fail", 0, 0, 0, 0);
455         BSL_ERR_PUSH_ERROR(HITLS_MEMCPY_FAIL);
456         BSL_SAL_ThreadUnlock(mgr->lock);
457         return HITLS_MEMCPY_FAIL;
458     }
459     offset += HITLS_TICKET_KEY_SIZE;
460 
461     if (memcpy_s(&key[offset], keySize - offset, mgr->ticketHmacKey, HITLS_TICKET_KEY_SIZE) != EOK) {
462         BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16711, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN, "memcpy fail", 0, 0, 0, 0);
463         BSL_ERR_PUSH_ERROR(HITLS_MEMCPY_FAIL);
464         BSL_SAL_ThreadUnlock(mgr->lock);
465         return HITLS_MEMCPY_FAIL;
466     }
467     offset += HITLS_TICKET_KEY_SIZE;
468 
469     *outSize = offset;
470 
471     BSL_SAL_ThreadUnlock(mgr->lock);
472 
473     return HITLS_SUCCESS;
474 }
475 
SESSMGR_SetTicketKey(TLS_SessionMgr * mgr,const uint8_t * key,uint32_t keySize)476 int32_t SESSMGR_SetTicketKey(TLS_SessionMgr *mgr, const uint8_t *key, uint32_t keySize)
477 {
478     if (mgr == NULL || key == NULL ||
479         (keySize != HITLS_TICKET_KEY_NAME_SIZE + HITLS_TICKET_KEY_SIZE + HITLS_TICKET_KEY_SIZE)) {
480         BSL_LOG_BINLOG_FIXLEN(BINLOG_ID16712, BSL_LOG_LEVEL_ERR, BSL_LOG_BINLOG_TYPE_RUN, "input null", 0, 0, 0, 0);
481         BSL_ERR_PUSH_ERROR(HITLS_NULL_INPUT);
482         return HITLS_NULL_INPUT;
483     }
484 
485     BSL_SAL_ThreadWriteLock(mgr->lock);
486 
487     uint32_t offset = 0;
488     (void)memcpy_s(mgr->ticketKeyName, HITLS_TICKET_KEY_NAME_SIZE, key, HITLS_TICKET_KEY_NAME_SIZE);
489     offset += HITLS_TICKET_KEY_NAME_SIZE;
490 
491     (void)memcpy_s(mgr->ticketAesKey, HITLS_TICKET_KEY_SIZE, &key[offset], HITLS_TICKET_KEY_SIZE);
492     offset += HITLS_TICKET_KEY_SIZE;
493 
494     (void)memcpy_s(mgr->ticketHmacKey, HITLS_TICKET_KEY_SIZE, &key[offset], HITLS_TICKET_KEY_SIZE);
495 
496     BSL_SAL_ThreadUnlock(mgr->lock);
497 
498     return HITLS_SUCCESS;
499 }
500 #endif /* #ifdef HITLS_TLS_FEATURE_SESSION_TICKET */
501 #endif /* HITLS_TLS_FEATURE_SESSION */