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