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 #if defined(HITLS_CRYPTO_EAL) && defined(HITLS_CRYPTO_DRBG)
18
19 #include <stdbool.h>
20 #include <securec.h>
21 #include "crypt_eal_rand.h"
22 #include "crypt_errno.h"
23 #include "bsl_errno.h"
24 #include "bsl_sal.h"
25 #include "crypt_algid.h"
26 #include "crypt_drbg.h"
27
28 #ifdef HITLS_CRYPTO_MD
29 #include "eal_md_local.h"
30 #endif
31 #ifdef HITLS_CRYPTO_MAC
32 #include "eal_mac_local.h"
33 #endif
34 #ifdef HITLS_CRYPTO_CIPHER
35 #include "eal_cipher_local.h"
36 #endif
37 #include "crypt_drbg_local.h"
38 #include "bsl_err_internal.h"
39 #include "crypt_types.h"
40 #include "crypt_utils.h"
41 #include "crypt_util_rand.h"
42 #include "eal_common.h"
43 #include "eal_entropy.h"
44 #include "sal_atomic.h"
45 #include "crypt_ealinit.h"
46 #include "crypt_eal_implprovider.h"
47 #include "crypt_eal_provider.h"
48 #include "crypt_provider.h"
49 #include "crypt_params_key.h"
50
51 #ifdef HITLS_CRYPTO_ENTROPY
52 static EAL_SeedDrbg g_seedDrbg = {HITLS_SEED_DRBG_INIT_RAND_ALG, NULL, NULL, {0}, {0}};
53 static BSL_SAL_ThreadLockHandle g_seedLock = NULL;
54 #endif
55
56 static CRYPT_EAL_RndCtx *EAL_RandNewDrbg(CRYPT_RAND_AlgId id, CRYPT_RandSeedMethod *seedMeth, void *seedCtx);
57
58 #define RETURN_RAND_LOCK(ctx, ret) \
59 do { \
60 (ret) = BSL_SAL_ThreadWriteLock(((ctx)->lock)); \
61 if ((ret) != BSL_SUCCESS) { \
62 BSL_ERR_PUSH_ERROR((ret)); \
63 return (ret); \
64 } \
65 } while (0)
66
67 #define RAND_UNLOCK(ctx) (void)BSL_SAL_ThreadUnlock(((ctx)->lock))
68
69 #if defined(HITLS_CRYPTO_RAND_CB)
70 static CRYPT_EAL_RandFunc g_rndFunc = NULL;
71 static CRYPT_EAL_RandFuncEx g_rndFuncEx = NULL;
72 #endif
73
EAL_RandSetMeth(EAL_RandUnitaryMethod * meth,CRYPT_EAL_RndCtx * ctx)74 static int32_t EAL_RandSetMeth(EAL_RandUnitaryMethod *meth, CRYPT_EAL_RndCtx *ctx)
75 {
76 EAL_RandUnitaryMethod *temp = BSL_SAL_Dump(meth, sizeof(EAL_RandUnitaryMethod));
77 if (temp == NULL) {
78 BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL);
79 return CRYPT_MEM_ALLOC_FAIL;
80 }
81 ctx->meth = temp;
82 return CRYPT_SUCCESS;
83 }
84
GetSeedParam(BSL_Param * seedParam,CRYPT_RandSeedMethod * seedMeth,void * seedCtx)85 static int32_t GetSeedParam(BSL_Param *seedParam, CRYPT_RandSeedMethod *seedMeth, void *seedCtx)
86 {
87 uint32_t iter = 0;
88 if (seedCtx != NULL) {
89 if (BSL_PARAM_InitValue(&seedParam[iter++], CRYPT_PARAM_RAND_SEEDCTX, BSL_PARAM_TYPE_CTX_PTR, seedCtx, 0)
90 != CRYPT_SUCCESS) {
91 return CRYPT_DRBG_PARAM_ERROR;
92 }
93 }
94 if (seedMeth->getEntropy != NULL) {
95 if (BSL_PARAM_InitValue(&seedParam[iter++], CRYPT_PARAM_RAND_SEED_GETENTROPY, BSL_PARAM_TYPE_FUNC_PTR,
96 seedMeth->getEntropy, 0) != CRYPT_SUCCESS) {
97 return CRYPT_DRBG_PARAM_ERROR;
98 }
99 }
100 if (seedMeth->cleanEntropy != NULL) {
101 if (BSL_PARAM_InitValue(&seedParam[iter++], CRYPT_PARAM_RAND_SEED_CLEANENTROPY, BSL_PARAM_TYPE_FUNC_PTR,
102 seedMeth->cleanEntropy, 0) != CRYPT_SUCCESS) {
103 return CRYPT_DRBG_PARAM_ERROR;
104 }
105 }
106 if (seedMeth->getNonce != NULL) {
107 if (BSL_PARAM_InitValue(&seedParam[iter++], CRYPT_PARAM_RAND_SEED_GETNONCE, BSL_PARAM_TYPE_FUNC_PTR,
108 seedMeth->getNonce, 0) != CRYPT_SUCCESS) {
109 return CRYPT_DRBG_PARAM_ERROR;
110 }
111 }
112 if (seedMeth->cleanNonce != NULL) {
113 if (BSL_PARAM_InitValue(&seedParam[iter++], CRYPT_PARAM_RAND_SEED_CLEANNONCE, BSL_PARAM_TYPE_FUNC_PTR,
114 seedMeth->cleanNonce, 0) != CRYPT_SUCCESS) {
115 return CRYPT_DRBG_PARAM_ERROR;
116 }
117 }
118
119 return CRYPT_SUCCESS;
120 }
121
122 /* Initialize the global DRBG. */
EAL_RandNew(CRYPT_RAND_AlgId id,CRYPT_RandSeedMethod * seedMeth,void * seedCtx,CRYPT_EAL_RndCtx * ctx)123 static int32_t EAL_RandNew(CRYPT_RAND_AlgId id, CRYPT_RandSeedMethod *seedMeth, void *seedCtx, CRYPT_EAL_RndCtx *ctx)
124 {
125 if (ctx == NULL) {
126 BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT);
127 return CRYPT_NULL_INPUT;
128 }
129 if (ctx->working == true) {
130 BSL_ERR_PUSH_ERROR(CRYPT_EAL_ERR_RAND_WORKING);
131 return CRYPT_EAL_ERR_RAND_WORKING;
132 }
133 BSL_Param seedParam[6] = {BSL_PARAM_END};
134 int32_t ret = GetSeedParam(seedParam, seedMeth, seedCtx);
135 if (ret != CRYPT_SUCCESS) {
136 BSL_ERR_PUSH_ERROR(ret);
137 return ret;
138 }
139 ctx->ctx = ctx->meth->newCtx(id, seedParam);
140 if (ctx->ctx == NULL) {
141 BSL_ERR_PUSH_ERROR(CRYPT_EAL_ERR_DRBG_INIT_FAIL);
142 return CRYPT_EAL_ERR_DRBG_INIT_FAIL;
143 }
144
145 return CRYPT_SUCCESS;
146 }
147
MethFreeCtx(CRYPT_EAL_RndCtx * ctx)148 static void MethFreeCtx(CRYPT_EAL_RndCtx *ctx)
149 {
150 EAL_RandUnitaryMethod *meth = ctx->meth;
151 if (meth != NULL && meth->freeCtx != NULL) {
152 meth->freeCtx(ctx->ctx);
153 }
154 BSL_SAL_FREE(ctx->meth);
155 return;
156 }
157
158 #ifdef HITLS_CRYPTO_ENTROPY
EAL_SeedDrbgLockInit(void)159 int32_t EAL_SeedDrbgLockInit(void)
160 {
161 if (g_seedLock != NULL) {
162 return BSL_SUCCESS;
163 }
164 return BSL_SAL_ThreadLockNew(&g_seedLock);
165 }
166
EAL_SeedDrbgLockDeInit(void)167 void EAL_SeedDrbgLockDeInit(void)
168 {
169 if (g_seedLock == NULL) {
170 return;
171 }
172 BSL_SAL_ThreadLockFree(g_seedLock);
173 g_seedLock = NULL;
174 }
175
EAL_SeedDrbgRandDeinit(CRYPT_EAL_RndCtx * rndCtx)176 void EAL_SeedDrbgRandDeinit(CRYPT_EAL_RndCtx *rndCtx)
177 {
178 if (rndCtx == NULL) {
179 return;
180 }
181 rndCtx->working = false;
182 MethFreeCtx(rndCtx);
183 BSL_SAL_ThreadLockFree(rndCtx->lock);
184 BSL_SAL_FREE(rndCtx);
185 }
186
EAL_SeedDrbgDeinit(bool isDefaultSeed)187 void EAL_SeedDrbgDeinit(bool isDefaultSeed)
188 {
189 if (!isDefaultSeed) {
190 return;
191 }
192 (void)BSL_SAL_ThreadWriteLock(g_seedLock);
193 int val = 0;
194 BSL_SAL_AtomicDownReferences(&(g_seedDrbg.references), &val);
195 if (val > 0) {
196 (void)BSL_SAL_ThreadUnlock(g_seedLock);
197 return;
198 }
199
200 if (g_seedDrbg.seed != NULL) {
201 EAL_SeedDrbgRandDeinit(g_seedDrbg.seed);
202 g_seedDrbg.seed = NULL;
203 CRYPT_EAL_SeedPoolFree(g_seedDrbg.seedCtx);
204 g_seedDrbg.seedCtx = NULL;
205 (void)memset_s(&(g_seedDrbg.seedMeth), sizeof(g_seedDrbg.seedMeth), 0, sizeof(g_seedDrbg.seedMeth));
206 BSL_SAL_ReferencesFree(&(g_seedDrbg.references));
207 }
208 (void)BSL_SAL_ThreadUnlock(g_seedLock);
209 }
210 #endif
211
EAL_RandDeinit(CRYPT_EAL_RndCtx * ctx)212 void EAL_RandDeinit(CRYPT_EAL_RndCtx *ctx)
213 {
214 if (ctx == NULL) {
215 return;
216 }
217
218 BSL_SAL_ThreadLockHandle lock = ctx->lock;
219 ctx->lock = NULL;
220
221 if (BSL_SAL_ThreadWriteLock(lock) != BSL_SUCCESS) { // write lock
222 MethFreeCtx(ctx);
223 BSL_SAL_ThreadLockFree(lock);
224 #ifdef HITLS_CRYPTO_ENTROPY
225 EAL_SeedDrbgDeinit(ctx->isDefaultSeed);
226 #endif
227 BSL_SAL_FREE(ctx);
228 return;
229 }
230
231 ctx->working = false;
232 EAL_EventReport(CRYPT_EVENT_ZERO, CRYPT_ALGO_RAND, ctx->id, CRYPT_SUCCESS);
233 MethFreeCtx(ctx);
234 (void)BSL_SAL_ThreadUnlock(lock);
235 BSL_SAL_ThreadLockFree(lock); // free the lock resource
236 #ifdef HITLS_CRYPTO_ENTROPY
237 EAL_SeedDrbgDeinit(ctx->isDefaultSeed);
238 #endif
239 BSL_SAL_FREE(ctx);
240 return;
241 }
242
243 // Check whether the state of CTX is available.
CheckRndCtxState(CRYPT_EAL_RndCtx * ctx)244 static int32_t CheckRndCtxState(CRYPT_EAL_RndCtx *ctx)
245 {
246 if (ctx->working == false) {
247 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_RAND, ctx->id, CRYPT_EAL_ERR_RAND_NO_WORKING);
248 return CRYPT_EAL_ERR_RAND_NO_WORKING;
249 }
250
251 return CRYPT_SUCCESS;
252 }
253
254 #if defined(HITLS_CRYPTO_RAND_CB)
CRYPT_EAL_SetRandCallBack(CRYPT_EAL_RandFunc func)255 void CRYPT_EAL_SetRandCallBack(CRYPT_EAL_RandFunc func)
256 {
257 g_rndFunc = func;
258 CRYPT_RandRegist(func);
259 return;
260 }
261
CRYPT_EAL_SetRandCallBackEx(CRYPT_EAL_RandFuncEx func)262 void CRYPT_EAL_SetRandCallBackEx(CRYPT_EAL_RandFuncEx func)
263 {
264 g_rndFuncEx = func;
265 CRYPT_RandRegistEx(func);
266 return;
267 }
268 #endif
269
EAL_DrbgbytesWithAdin(CRYPT_EAL_RndCtx * ctx,uint8_t * byte,uint32_t len,uint8_t * addin,uint32_t addinLen)270 int32_t EAL_DrbgbytesWithAdin(CRYPT_EAL_RndCtx *ctx, uint8_t *byte, uint32_t len, uint8_t *addin,
271 uint32_t addinLen)
272 {
273 if (ctx == NULL || ctx->meth == NULL || ctx->meth->gen == NULL || byte == NULL || len == 0) {
274 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_RAND, CRYPT_RAND_ALGID_MAX, CRYPT_NULL_INPUT);
275 return CRYPT_NULL_INPUT;
276 }
277
278 int32_t ret;
279 RETURN_RAND_LOCK(ctx, ret); // write lock
280 ret = CheckRndCtxState(ctx);
281 if (ret != CRYPT_SUCCESS) {
282 RAND_UNLOCK(ctx);
283 return ret;
284 }
285
286 ret = ctx->meth->gen(ctx->ctx, byte, len, addin, addinLen, NULL);
287 EAL_EventReport((ret == CRYPT_SUCCESS) ? CRYPT_EVENT_RANDGEN : CRYPT_EVENT_ERR, CRYPT_ALGO_RAND, ctx->id, ret);
288 RAND_UNLOCK(ctx);
289
290 return ret;
291 }
292
EAL_DrbgSeedWithAdin(CRYPT_EAL_RndCtx * ctx,uint8_t * addin,uint32_t addinLen)293 int32_t EAL_DrbgSeedWithAdin(CRYPT_EAL_RndCtx *ctx, uint8_t *addin, uint32_t addinLen)
294 {
295 if (ctx == NULL || ctx->meth == NULL || ctx->meth->reSeed == NULL) {
296 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_RAND, CRYPT_RAND_ALGID_MAX, CRYPT_NULL_INPUT);
297 return CRYPT_NULL_INPUT;
298 }
299
300 int32_t ret;
301 RETURN_RAND_LOCK(ctx, ret); // write lock
302 ret = CheckRndCtxState(ctx);
303 if (ret != CRYPT_SUCCESS) {
304 RAND_UNLOCK(ctx);
305 return ret;
306 }
307
308 ret = ctx->meth->reSeed(ctx->ctx, addin, addinLen, NULL);
309 if (ret != CRYPT_SUCCESS) {
310 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_RAND, ctx->id, ret);
311 }
312 RAND_UNLOCK(ctx);
313
314 return ret;
315 }
316
EAL_RandDrbgFree(void * ctx)317 void EAL_RandDrbgFree(void *ctx)
318 {
319 if (ctx == NULL) {
320 return;
321 }
322 DRBG_Ctx *drbg = (DRBG_Ctx *)ctx;
323
324 DRBG_Free(drbg);
325 return;
326 }
327
328 #ifdef HITLS_CRYPTO_ENTROPY
GetSeedDrbgEntropy(void * ctx,CRYPT_Data * entropy,uint32_t strength,CRYPT_Range * lenRange)329 static int32_t GetSeedDrbgEntropy(void *ctx, CRYPT_Data *entropy, uint32_t strength, CRYPT_Range *lenRange)
330 {
331 int32_t ret;
332 CRYPT_EAL_RndCtx *seed = (CRYPT_EAL_RndCtx *)ctx;
333 uint32_t strengthBytes = (strength + 7) / 8; // Figure out how many bytes needed.
334 entropy->len = ((strengthBytes > lenRange->min) ? strengthBytes : lenRange->min);
335 if (entropy->len > lenRange->max) {
336 BSL_ERR_PUSH_ERROR(CRYPT_ENTROPY_RANGE_ERROR);
337 return CRYPT_ENTROPY_RANGE_ERROR;
338 }
339 entropy->data = BSL_SAL_Malloc(entropy->len);
340 if (entropy->data == NULL) {
341 BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL);
342 return CRYPT_MEM_ALLOC_FAIL;
343 }
344
345 ret = EAL_DrbgbytesWithAdin(seed, entropy->data, entropy->len, NULL, 0);
346 if (ret != CRYPT_SUCCESS) {
347 BSL_SAL_FREE(entropy->data);
348 }
349 return ret;
350 }
351
CleanSeedDrbgEntropy(void * ctx,CRYPT_Data * entropy)352 static void CleanSeedDrbgEntropy(void *ctx, CRYPT_Data *entropy)
353 {
354 (void)ctx;
355 BSL_SAL_CleanseData(entropy->data, entropy->len);
356 BSL_SAL_FREE(entropy->data);
357 }
358
EAL_SeedDrbgEntropyMeth(CRYPT_RandSeedMethod * meth)359 void EAL_SeedDrbgEntropyMeth(CRYPT_RandSeedMethod *meth)
360 {
361 meth->getEntropy = GetSeedDrbgEntropy;
362 meth->cleanEntropy = CleanSeedDrbgEntropy;
363 meth->cleanNonce = CleanSeedDrbgEntropy;
364 meth->getNonce = GetSeedDrbgEntropy;
365 }
366
SetSeedDrbgReseedInfo(CRYPT_EAL_RndCtx * rndCtx)367 static int32_t SetSeedDrbgReseedInfo(CRYPT_EAL_RndCtx *rndCtx)
368 {
369 int32_t ret;
370 #if defined(HITLS_CRYPTO_DRBG_GM)
371 if (g_seedDrbg.id == CRYPT_RAND_SM3 || g_seedDrbg.id == CRYPT_RAND_SM4_CTR_DF) {
372 uint32_t gmLevel = 2; // Set gm level 2
373 ret = rndCtx->meth->ctrl(rndCtx->ctx, CRYPT_CTRL_SET_GM_LEVEL, &gmLevel, sizeof(uint32_t));
374 if (ret != CRYPT_SUCCESS) {
375 BSL_ERR_PUSH_ERROR(ret);
376 }
377 return ret;
378 }
379 #endif
380 uint32_t reseedInterval = DRBG_RESEED_INTERVAL;
381 ret = rndCtx->meth->ctrl(rndCtx->ctx, CRYPT_CTRL_SET_RESEED_INTERVAL, &reseedInterval, sizeof(uint32_t));
382 if (ret != CRYPT_SUCCESS) {
383 BSL_ERR_PUSH_ERROR(ret);
384 }
385 return ret;
386 }
387
EAL_SeedDrbgInit(EAL_SeedDrbg * seedDrbg)388 int32_t EAL_SeedDrbgInit(EAL_SeedDrbg *seedDrbg)
389 {
390 CRYPT_RandSeedMethod seedMethond = {0};
391 int32_t ret = EAL_SetDefaultEntropyMeth(&seedMethond);
392 if (ret != CRYPT_SUCCESS) {
393 BSL_ERR_PUSH_ERROR(ret);
394 return ret;
395 }
396 CRYPT_EAL_SeedPoolCtx *seedPoolCtx = CRYPT_EAL_SeedPoolNew(false);
397 if (seedPoolCtx == NULL) {
398 BSL_ERR_PUSH_ERROR(CRYPT_SEED_POOL_NEW_ERROR);
399 return CRYPT_SEED_POOL_NEW_ERROR;
400 }
401
402 CRYPT_EAL_RndCtx *rndCtx = EAL_RandNewDrbg(seedDrbg->id, &seedMethond, seedPoolCtx);
403 if (rndCtx == NULL) {
404 ret = CRYPT_MEM_ALLOC_FAIL;
405 BSL_ERR_PUSH_ERROR(ret);
406 goto EXIT;
407 }
408 ret = SetSeedDrbgReseedInfo(rndCtx);
409 if (ret != CRYPT_SUCCESS) {
410 BSL_ERR_PUSH_ERROR(ret);
411 goto EXIT;
412 }
413 ret = rndCtx->meth->inst(rndCtx->ctx, NULL, 0, NULL);
414 if (ret != CRYPT_SUCCESS) {
415 BSL_ERR_PUSH_ERROR(ret);
416 goto EXIT;
417 }
418 rndCtx->working = true;
419
420 seedDrbg->seed = rndCtx;
421 seedDrbg->seedMeth = seedMethond;
422 seedDrbg->seedCtx = seedPoolCtx;
423 BSL_SAL_ReferencesInit(&(seedDrbg->references));
424 return CRYPT_SUCCESS;
425
426 EXIT:
427 CRYPT_EAL_SeedPoolFree(seedPoolCtx);
428 EAL_RandDeinit(rndCtx);
429 return ret;
430 }
431
EAL_GetDefaultSeed(CRYPT_RandSeedMethod * seedMeth,void ** seedCtx)432 int32_t EAL_GetDefaultSeed(CRYPT_RandSeedMethod *seedMeth, void **seedCtx)
433 {
434 EAL_SeedDrbgEntropyMeth(seedMeth);
435
436 (void)BSL_SAL_ThreadWriteLock(g_seedLock);
437 if (g_seedDrbg.seed != NULL) {
438 *seedCtx = g_seedDrbg.seed;
439 int val = 0;
440 BSL_SAL_AtomicUpReferences(&(g_seedDrbg.references), &val);
441 (void)BSL_SAL_ThreadUnlock(g_seedLock);
442 return CRYPT_SUCCESS;
443 }
444 int32_t ret = EAL_SeedDrbgInit(&g_seedDrbg);
445 if (ret != CRYPT_SUCCESS) {
446 (void)BSL_SAL_ThreadUnlock(g_seedLock);
447 return CRYPT_EAL_ERR_DRBG_INIT_FAIL;
448 }
449 *seedCtx = g_seedDrbg.seed;
450 (void)BSL_SAL_ThreadUnlock(g_seedLock);
451 return CRYPT_SUCCESS;
452 }
453 #endif
454
EAL_RandNewDrbg(CRYPT_RAND_AlgId id,CRYPT_RandSeedMethod * seedMeth,void * seedCtx)455 static CRYPT_EAL_RndCtx *EAL_RandNewDrbg(CRYPT_RAND_AlgId id, CRYPT_RandSeedMethod *seedMeth,
456 void *seedCtx)
457 {
458 #ifdef HITLS_CRYPTO_ASM_CHECK
459 if (CRYPT_ASMCAP_Drbg(id) != CRYPT_SUCCESS) {
460 BSL_ERR_PUSH_ERROR(CRYPT_EAL_ALG_ASM_NOT_SUPPORT);
461 return NULL;
462 }
463 #endif
464 CRYPT_RandSeedMethod seedMethTmp = {0};
465 CRYPT_RandSeedMethod *seedMethond = seedMeth;
466 EAL_RandUnitaryMethod *meth = NULL;
467 void *seedTmp = NULL;
468 int32_t ret;
469
470 CRYPT_EAL_RndCtx *randCtx = (CRYPT_EAL_RndCtx *)BSL_SAL_Calloc(1, sizeof(CRYPT_EAL_RndCtx));
471 if (randCtx == NULL) {
472 BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL);
473 return NULL;
474 }
475 randCtx->isDefaultSeed = false;
476
477 if (seedMeth == NULL || seedMeth->getEntropy == NULL) {
478 #ifdef HITLS_CRYPTO_ENTROPY
479 ret = EAL_GetDefaultSeed(&seedMethTmp, &seedTmp);
480 if (ret != CRYPT_SUCCESS) {
481 BSL_ERR_PUSH_ERROR(ret);
482 goto ERR;
483 }
484 seedCtx = seedTmp;
485 seedMethond = &seedMethTmp;
486 randCtx->isDefaultSeed = true;
487 #else
488 (void)seedMethTmp;
489 (void)seedTmp;
490 BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT);
491 goto ERR;
492 #endif
493 }
494 meth = EAL_RandGetMethod();
495 // Apply for lock resources.
496 ret = BSL_SAL_ThreadLockNew(&(randCtx->lock));
497 if (ret != CRYPT_SUCCESS) {
498 goto ERR;
499 }
500
501 randCtx->isProvider = false;
502 randCtx->working = false;
503 randCtx->id = id;
504
505 ret = EAL_RandSetMeth(meth, randCtx);
506 if (ret != CRYPT_SUCCESS) {
507 BSL_ERR_PUSH_ERROR(ret);
508 goto ERR;
509 }
510
511 ret = EAL_RandNew(id, seedMethond, seedCtx, randCtx);
512 if (ret != CRYPT_SUCCESS) {
513 BSL_ERR_PUSH_ERROR(ret);
514 goto ERR;
515 }
516 return randCtx;
517 ERR:
518 EAL_RandDeinit(randCtx);
519 return NULL;
520 }
521
522 #ifdef HITLS_CRYPTO_DRBG
523 static CRYPT_EAL_RndCtx *g_globalRndCtx = NULL;
524
DrbgParaIsValid(CRYPT_RAND_AlgId id,const CRYPT_RandSeedMethod * seedMeth,const void * seedCtx,const uint8_t * pers,uint32_t persLen)525 static int32_t DrbgParaIsValid(CRYPT_RAND_AlgId id, const CRYPT_RandSeedMethod *seedMeth, const void *seedCtx,
526 const uint8_t *pers, uint32_t persLen)
527 {
528 if (DRBG_GetIdMap(id) == NULL) {
529 BSL_ERR_PUSH_ERROR(CRYPT_EAL_ERR_ALGID);
530 return CRYPT_EAL_ERR_ALGID;
531 }
532
533 if (seedMeth == NULL && seedCtx != NULL) {
534 BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT);
535 return CRYPT_NULL_INPUT;
536 }
537
538 if (pers == NULL && persLen != 0) {
539 BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT);
540 return CRYPT_NULL_INPUT;
541 }
542 if (seedMeth != NULL && seedMeth->getEntropy == NULL) {
543 BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT);
544 return CRYPT_NULL_INPUT;
545 }
546 return CRYPT_SUCCESS;
547 }
548
CRYPT_EAL_RandInit(CRYPT_RAND_AlgId id,CRYPT_RandSeedMethod * seedMeth,void * seedCtx,const uint8_t * pers,uint32_t persLen)549 int32_t CRYPT_EAL_RandInit(CRYPT_RAND_AlgId id, CRYPT_RandSeedMethod *seedMeth, void *seedCtx,
550 const uint8_t *pers, uint32_t persLen)
551 {
552 CRYPT_EAL_RndCtx *ctx = NULL;
553 if (g_globalRndCtx != NULL) { // Prevent DRBG repeated Init
554 BSL_ERR_PUSH_ERROR(CRYPT_EAL_ERR_DRBG_REPEAT_INIT);
555 return CRYPT_EAL_ERR_DRBG_REPEAT_INIT;
556 }
557 int32_t ret = DrbgParaIsValid(id, seedMeth, seedCtx, pers, persLen);
558 if (ret != CRYPT_SUCCESS) {
559 return ret;
560 }
561 ctx = EAL_RandNewDrbg(id, seedMeth, seedCtx);
562 if (ctx == NULL) {
563 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_RAND, id, CRYPT_EAL_ERR_DRBG_INIT_FAIL);
564 return CRYPT_EAL_ERR_DRBG_INIT_FAIL;
565 }
566 ret = CRYPT_EAL_DrbgInstantiate(ctx, pers, persLen);
567 if (ret != CRYPT_SUCCESS) {
568 EAL_RandDeinit(ctx);
569 return ret;
570 }
571 CRYPT_RandRegist((CRYPT_EAL_RandFunc)CRYPT_EAL_Randbytes);
572 g_globalRndCtx = ctx;
573 return CRYPT_SUCCESS;
574 }
575
CRYPT_EAL_RandbytesWithAdin(uint8_t * byte,uint32_t len,uint8_t * addin,uint32_t addinLen)576 int32_t CRYPT_EAL_RandbytesWithAdin(uint8_t *byte, uint32_t len, uint8_t *addin, uint32_t addinLen)
577 {
578 if (g_globalRndCtx == NULL) {
579 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_RAND, CRYPT_RAND_ALGID_MAX, CRYPT_EAL_ERR_GLOBAL_DRBG_NULL);
580 return CRYPT_EAL_ERR_GLOBAL_DRBG_NULL;
581 }
582 return EAL_DrbgbytesWithAdin(g_globalRndCtx, byte, len, addin, addinLen);
583 }
584
CRYPT_EAL_Randbytes(uint8_t * byte,uint32_t len)585 int32_t CRYPT_EAL_Randbytes(uint8_t *byte, uint32_t len)
586 {
587 #if defined(HITLS_CRYPTO_RAND_CB)
588 if (g_rndFunc != NULL) {
589 return g_rndFunc(byte, len);
590 }
591 #endif
592 return CRYPT_EAL_RandbytesWithAdin(byte, len, NULL, 0);
593 }
594
CRYPT_EAL_RandSeedWithAdin(uint8_t * addin,uint32_t addinLen)595 int32_t CRYPT_EAL_RandSeedWithAdin(uint8_t *addin, uint32_t addinLen)
596 {
597 if (g_globalRndCtx == NULL) {
598 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_RAND, CRYPT_RAND_ALGID_MAX, CRYPT_EAL_ERR_GLOBAL_DRBG_NULL);
599 return CRYPT_EAL_ERR_GLOBAL_DRBG_NULL;
600 }
601 return EAL_DrbgSeedWithAdin(g_globalRndCtx, addin, addinLen);
602 }
603
CRYPT_EAL_RandSeed(void)604 int32_t CRYPT_EAL_RandSeed(void)
605 {
606 return CRYPT_EAL_RandSeedWithAdin(NULL, 0);
607 }
608
CRYPT_EAL_RandIsValidAlgId(CRYPT_RAND_AlgId id)609 bool CRYPT_EAL_RandIsValidAlgId(CRYPT_RAND_AlgId id)
610 {
611 return (DRBG_GetIdMap(id) != NULL);
612 }
613 #endif // end of HITLS_CRYPTO_DRBG
614
CRYPT_EAL_DrbgInstantiate(CRYPT_EAL_RndCtx * rndCtx,const uint8_t * pers,uint32_t persLen)615 int32_t CRYPT_EAL_DrbgInstantiate(CRYPT_EAL_RndCtx *rndCtx, const uint8_t *pers, uint32_t persLen)
616 {
617 if (rndCtx == NULL || rndCtx->meth == NULL || rndCtx->meth->inst == NULL) {
618 BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT);
619 return CRYPT_NULL_INPUT;
620 }
621 int32_t ret;
622 RETURN_RAND_LOCK(rndCtx, ret);
623 ret = rndCtx->meth->inst(rndCtx->ctx, pers, persLen, NULL);
624 if (ret != CRYPT_SUCCESS) {
625 RAND_UNLOCK(rndCtx);
626 return ret;
627 }
628 rndCtx->working = true;
629 RAND_UNLOCK(rndCtx);
630 return ret;
631 }
632
CRYPT_EAL_DrbgNew(CRYPT_RAND_AlgId id,CRYPT_RandSeedMethod * seedMeth,void * seedCtx)633 CRYPT_EAL_RndCtx *CRYPT_EAL_DrbgNew(CRYPT_RAND_AlgId id, CRYPT_RandSeedMethod *seedMeth, void *seedCtx)
634 {
635 if (seedMeth == NULL && seedCtx != NULL) {
636 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_RAND, id, CRYPT_NULL_INPUT);
637 return NULL;
638 }
639
640 return EAL_RandNewDrbg(id, seedMeth, seedCtx);
641 }
642
CRYPT_EAL_DrbgSeedWithAdin(CRYPT_EAL_RndCtx * ctx,uint8_t * addin,uint32_t addinLen)643 int32_t CRYPT_EAL_DrbgSeedWithAdin(CRYPT_EAL_RndCtx *ctx, uint8_t *addin, uint32_t addinLen)
644 {
645 return EAL_DrbgSeedWithAdin(ctx, addin, addinLen);
646 }
647
CRYPT_EAL_DrbgSeed(CRYPT_EAL_RndCtx * ctx)648 int32_t CRYPT_EAL_DrbgSeed(CRYPT_EAL_RndCtx *ctx)
649 {
650 return CRYPT_EAL_DrbgSeedWithAdin(ctx, NULL, 0);
651 }
652
CRYPT_EAL_DrbgbytesWithAdin(CRYPT_EAL_RndCtx * ctx,uint8_t * byte,uint32_t len,uint8_t * addin,uint32_t addinLen)653 int32_t CRYPT_EAL_DrbgbytesWithAdin(CRYPT_EAL_RndCtx *ctx, uint8_t *byte, uint32_t len, uint8_t *addin,
654 uint32_t addinLen)
655 {
656 return EAL_DrbgbytesWithAdin(ctx, byte, len, addin, addinLen);
657 }
658
CRYPT_EAL_Drbgbytes(CRYPT_EAL_RndCtx * ctx,uint8_t * byte,uint32_t len)659 int32_t CRYPT_EAL_Drbgbytes(CRYPT_EAL_RndCtx *ctx, uint8_t *byte, uint32_t len)
660 {
661 return CRYPT_EAL_DrbgbytesWithAdin(ctx, byte, len, NULL, 0);
662 }
663
CRYPT_EAL_DrbgDeinit(CRYPT_EAL_RndCtx * ctx)664 void CRYPT_EAL_DrbgDeinit(CRYPT_EAL_RndCtx *ctx)
665 {
666 EAL_RandDeinit(ctx);
667 return;
668 }
669
CRYPT_EAL_DrbgCtrl(CRYPT_EAL_RndCtx * rndCtx,int32_t opt,void * val,uint32_t len)670 int32_t CRYPT_EAL_DrbgCtrl(CRYPT_EAL_RndCtx *rndCtx, int32_t opt, void *val, uint32_t len)
671 {
672 if (rndCtx == NULL || rndCtx->meth == NULL || rndCtx->meth->ctrl == NULL) {
673 BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT);
674 return CRYPT_NULL_INPUT;
675 }
676 int32_t ret;
677 RETURN_RAND_LOCK(rndCtx, ret);
678 if (rndCtx->working == true) {
679 RAND_UNLOCK(rndCtx);
680 BSL_ERR_PUSH_ERROR(CRYPT_EAL_ERR_RAND_WORKING);
681 return CRYPT_EAL_ERR_RAND_WORKING;
682 }
683 ret = rndCtx->meth->ctrl(rndCtx->ctx, opt, val, len);
684 RAND_UNLOCK(rndCtx);
685 return ret;
686 }
687
688 #ifdef HITLS_CRYPTO_PROVIDER
CRYPT_EAL_SetRandMethod(CRYPT_EAL_RndCtx * ctx,const CRYPT_EAL_Func * funcs)689 int32_t CRYPT_EAL_SetRandMethod(CRYPT_EAL_RndCtx *ctx, const CRYPT_EAL_Func *funcs)
690 {
691 int32_t index = 0;
692 EAL_RandUnitaryMethod *method = BSL_SAL_Calloc(1, sizeof(EAL_RandUnitaryMethod));
693 if (method == NULL) {
694 BSL_ERR_PUSH_ERROR(BSL_MALLOC_FAIL);
695 return BSL_MALLOC_FAIL;
696 }
697 while (funcs[index].id != 0) {
698 switch (funcs[index].id) {
699 case CRYPT_EAL_IMPLRAND_DRBGNEWCTX:
700 method->provNewCtx = funcs[index].func;
701 break;
702 case CRYPT_EAL_IMPLRAND_DRBGINST:
703 method->inst = funcs[index].func;
704 break;
705 case CRYPT_EAL_IMPLRAND_DRBGUNINST:
706 method->unInst = funcs[index].func;
707 break;
708 case CRYPT_EAL_IMPLRAND_DRBGGEN:
709 method->gen = funcs[index].func;
710 break;
711 case CRYPT_EAL_IMPLRAND_DRBGRESEED:
712 method->reSeed = funcs[index].func;
713 break;
714 case CRYPT_EAL_IMPLRAND_DRBGCTRL:
715 method->ctrl = funcs[index].func;
716 break;
717 case CRYPT_EAL_IMPLRAND_DRBGFREECTX:
718 method->freeCtx = funcs[index].func;
719 break;
720 default:
721 BSL_SAL_Free(method);
722 BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL);
723 return CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL;
724 }
725 index++;
726 }
727 ctx->meth = method;
728 return CRYPT_SUCCESS;
729 }
730
EAL_ProvRandInitDrbg(CRYPT_EAL_LibCtx * libCtx,CRYPT_RAND_AlgId id,const char * attrName,BSL_Param * param)731 static CRYPT_EAL_RndCtx *EAL_ProvRandInitDrbg(CRYPT_EAL_LibCtx *libCtx, CRYPT_RAND_AlgId id,
732 const char *attrName, BSL_Param *param)
733 {
734 const CRYPT_EAL_Func *funcs = NULL;
735 void *provCtx = NULL;
736 int32_t ret = CRYPT_EAL_ProviderGetFuncs(libCtx, CRYPT_EAL_OPERAID_RAND, id, attrName,
737 &funcs, &provCtx);
738 if (ret != CRYPT_SUCCESS) {
739 BSL_ERR_PUSH_ERROR(ret);
740 return NULL;
741 }
742 CRYPT_EAL_RndCtx *randCtx = BSL_SAL_Calloc(1, sizeof(CRYPT_EAL_RndCtx));
743 if (randCtx == NULL) {
744 BSL_ERR_PUSH_ERROR(CRYPT_MEM_ALLOC_FAIL);
745 return NULL;
746 }
747
748 // Apply for lock resources.
749 ret = BSL_SAL_ThreadLockNew(&(randCtx->lock));
750 if (ret != CRYPT_SUCCESS) {
751 BSL_ERR_PUSH_ERROR(ret);
752 BSL_SAL_FREE(randCtx);
753 return NULL;
754 }
755
756 randCtx->isDefaultSeed = false;
757 randCtx->isProvider = true;
758 randCtx->working = false;
759 randCtx->id = id;
760
761 ret = CRYPT_EAL_SetRandMethod(randCtx, funcs);
762 if (ret != CRYPT_SUCCESS) {
763 goto ERR;
764 }
765 if (randCtx->meth->provNewCtx == NULL) {
766 BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT);
767 goto ERR;
768 }
769
770 randCtx->ctx = randCtx->meth->provNewCtx(provCtx, id, param);
771 if (randCtx->ctx == NULL) {
772 BSL_ERR_PUSH_ERROR(CRYPT_EAL_ERR_DRBG_INIT_FAIL);
773 goto ERR;
774 }
775 return randCtx;
776 ERR:
777 BSL_SAL_ThreadLockFree(randCtx->lock); // free the lock resource
778 BSL_SAL_FREE(randCtx->meth);
779 BSL_SAL_FREE(randCtx);
780 return NULL;
781 }
782
CRYPT_EAL_ProviderDrbgNewCtx(CRYPT_EAL_LibCtx * libCtx,int32_t algId,const char * attrName,BSL_Param * param)783 CRYPT_EAL_RndCtx *CRYPT_EAL_ProviderDrbgNewCtx(CRYPT_EAL_LibCtx *libCtx, int32_t algId, const char *attrName,
784 BSL_Param *param)
785 {
786 return EAL_ProvRandInitDrbg(libCtx, algId, attrName, param);
787 }
788
CRYPT_EAL_ProviderRandInitCtxInner(CRYPT_EAL_LibCtx * libCtx,int32_t algId,const char * attrName,const uint8_t * pers,uint32_t persLen,BSL_Param * param)789 int32_t CRYPT_EAL_ProviderRandInitCtxInner(CRYPT_EAL_LibCtx *libCtx, int32_t algId, const char *attrName,
790 const uint8_t *pers, uint32_t persLen, BSL_Param *param)
791 {
792 CRYPT_EAL_RndCtx *ctx = NULL;
793 CRYPT_EAL_LibCtx *localLibCtx = NULL;
794 localLibCtx = libCtx;
795 if (localLibCtx == NULL) {
796 localLibCtx = CRYPT_EAL_GetGlobalLibCtx();
797 }
798 if (localLibCtx == NULL) {
799 BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_INVALID_LIB_CTX);
800 return CRYPT_PROVIDER_INVALID_LIB_CTX;
801 }
802 if (localLibCtx->drbg != NULL) { // Prevent DRBG repeated Init
803 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_RAND, algId, CRYPT_EAL_ERR_DRBG_REPEAT_INIT);
804 return CRYPT_EAL_ERR_DRBG_REPEAT_INIT;
805 }
806
807 ctx = EAL_ProvRandInitDrbg(libCtx, algId, attrName, param);
808 if (ctx == NULL) {
809 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_RAND, algId, CRYPT_EAL_ERR_DRBG_INIT_FAIL);
810 return CRYPT_EAL_ERR_DRBG_INIT_FAIL;
811 }
812 if (ctx->meth->inst == NULL) {
813 EAL_RandDeinit(ctx);
814 return CRYPT_EAL_ERR_DRBG_INIT_FAIL;
815 }
816 int32_t ret = ctx->meth->inst(ctx->ctx, pers, persLen, param);
817 if (ret != CRYPT_SUCCESS) {
818 EAL_RandDeinit(ctx);
819 return ret;
820 }
821 ctx->working = true;
822 CRYPT_RandRegistEx((CRYPT_EAL_RandFuncEx)CRYPT_EAL_RandbytesEx);
823 localLibCtx->drbg = ctx;
824 return CRYPT_SUCCESS;
825 }
826 #endif // end of HITLS_CRYPTO_PROVIDER
827
CRYPT_EAL_NoProviderRandInitCtxInner(int32_t algId,const uint8_t * pers,uint32_t persLen,BSL_Param * param)828 int32_t CRYPT_EAL_NoProviderRandInitCtxInner(int32_t algId,
829 const uint8_t *pers, uint32_t persLen, BSL_Param *param)
830 {
831 CRYPT_RandSeedMethod seedMeth = {0};
832 void *seedCtx = NULL;
833 const BSL_Param *temp = NULL;
834 int32_t ret;
835 bool hasEnt = false;
836 if ((temp = BSL_PARAM_FindParam(param, CRYPT_PARAM_RAND_SEED_GETENTROPY)) != NULL) {
837 GOTO_ERR_IF(BSL_PARAM_GetPtrValue(temp, CRYPT_PARAM_RAND_SEED_GETENTROPY, BSL_PARAM_TYPE_FUNC_PTR,
838 (void **)&(seedMeth.getEntropy), NULL), ret);
839 hasEnt = true;
840 }
841 if ((temp = BSL_PARAM_FindParam(param, CRYPT_PARAM_RAND_SEED_CLEANENTROPY)) != NULL) {
842 GOTO_ERR_IF(BSL_PARAM_GetPtrValue(temp, CRYPT_PARAM_RAND_SEED_CLEANENTROPY, BSL_PARAM_TYPE_FUNC_PTR,
843 (void **)&(seedMeth.cleanEntropy), NULL), ret);
844 hasEnt = true;
845 }
846 if ((temp = BSL_PARAM_FindParam(param, CRYPT_PARAM_RAND_SEED_GETNONCE)) != NULL) {
847 GOTO_ERR_IF(BSL_PARAM_GetPtrValue(temp, CRYPT_PARAM_RAND_SEED_GETNONCE, BSL_PARAM_TYPE_FUNC_PTR,
848 (void **)&(seedMeth.getNonce), NULL), ret);
849 hasEnt = true;
850 }
851 if ((temp = BSL_PARAM_FindParam(param, CRYPT_PARAM_RAND_SEED_CLEANNONCE)) != NULL) {
852 GOTO_ERR_IF(BSL_PARAM_GetPtrValue(temp, CRYPT_PARAM_RAND_SEED_CLEANNONCE, BSL_PARAM_TYPE_FUNC_PTR,
853 (void **)&(seedMeth.cleanNonce), NULL), ret);
854 hasEnt = true;
855 }
856 if ((temp = BSL_PARAM_FindParam(param, CRYPT_PARAM_RAND_SEEDCTX)) != NULL) {
857 GOTO_ERR_IF(BSL_PARAM_GetPtrValue(temp, CRYPT_PARAM_RAND_SEEDCTX, BSL_PARAM_TYPE_CTX_PTR, &seedCtx, NULL), ret);
858 }
859 if (hasEnt) {
860 ret = CRYPT_EAL_RandInit(algId, &seedMeth, seedCtx, pers, persLen);
861 } else {
862 ret = CRYPT_EAL_RandInit(algId, NULL, seedCtx, pers, persLen);
863 }
864 if (ret != CRYPT_SUCCESS) {
865 BSL_ERR_PUSH_ERROR(ret);
866 }
867 ERR:
868 return ret;
869 }
870
CRYPT_EAL_ProviderRandInitCtx(CRYPT_EAL_LibCtx * libCtx,int32_t algId,const char * attrName,const uint8_t * pers,uint32_t persLen,BSL_Param * param)871 int32_t CRYPT_EAL_ProviderRandInitCtx(CRYPT_EAL_LibCtx *libCtx, int32_t algId, const char *attrName,
872 const uint8_t *pers, uint32_t persLen, BSL_Param *param)
873 {
874 #ifdef HITLS_CRYPTO_PROVIDER
875 return CRYPT_EAL_ProviderRandInitCtxInner(libCtx, algId, attrName, pers, persLen, param);
876 #else
877 (void) libCtx;
878 (void) attrName;
879 return CRYPT_EAL_NoProviderRandInitCtxInner(algId, pers, persLen, param);
880 #endif
881 }
882
CRYPT_EAL_RandDeinitEx(CRYPT_EAL_LibCtx * libCtx)883 void CRYPT_EAL_RandDeinitEx(CRYPT_EAL_LibCtx *libCtx)
884 {
885 #ifdef HITLS_CRYPTO_PROVIDER
886 CRYPT_EAL_LibCtx *localLibCtx = libCtx;
887 if (localLibCtx == NULL) {
888 localLibCtx = CRYPT_EAL_GetGlobalLibCtx();
889 }
890 if (localLibCtx == NULL) {
891 return;
892 }
893 EAL_RandDeinit(localLibCtx->drbg);
894 localLibCtx->drbg = NULL;
895 return;
896 #else
897 (void) libCtx;
898 CRYPT_EAL_RandDeinit();
899 return;
900 #endif
901 }
902
CRYPT_EAL_RandDeinit(void)903 void CRYPT_EAL_RandDeinit(void)
904 {
905 EAL_RandDeinit(g_globalRndCtx);
906 g_globalRndCtx = NULL;
907 return;
908 }
909
910 #ifdef HITLS_CRYPTO_PROVIDER
CRYPT_EAL_RandbytesWithAdinEx(CRYPT_EAL_LibCtx * libCtx,uint8_t * byte,uint32_t len,uint8_t * addin,uint32_t addinLen)911 int32_t CRYPT_EAL_RandbytesWithAdinEx(CRYPT_EAL_LibCtx *libCtx,
912 uint8_t *byte, uint32_t len, uint8_t *addin, uint32_t addinLen)
913 {
914 CRYPT_EAL_LibCtx *localCtx = libCtx;
915 if (localCtx == NULL) {
916 localCtx = CRYPT_EAL_GetGlobalLibCtx();
917 }
918
919 if (localCtx == NULL) {
920 BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_INVALID_LIB_CTX);
921 return CRYPT_PROVIDER_INVALID_LIB_CTX;
922 }
923 return EAL_DrbgbytesWithAdin((CRYPT_EAL_RndCtx *)localCtx->drbg, byte, len, addin, addinLen);
924 }
925 #endif
926
CRYPT_EAL_RandbytesEx(CRYPT_EAL_LibCtx * libCtx,uint8_t * byte,uint32_t len)927 int32_t CRYPT_EAL_RandbytesEx(CRYPT_EAL_LibCtx *libCtx, uint8_t *byte, uint32_t len)
928 {
929 #ifdef HITLS_CRYPTO_PROVIDER
930 CRYPT_EAL_LibCtx *localCtx = libCtx;
931 if (localCtx == NULL) {
932 localCtx = CRYPT_EAL_GetGlobalLibCtx();
933 }
934 if (localCtx == NULL) {
935 BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_INVALID_LIB_CTX);
936 return CRYPT_PROVIDER_INVALID_LIB_CTX;
937 }
938 return EAL_DrbgbytesWithAdin((CRYPT_EAL_RndCtx *)localCtx->drbg, byte, len, NULL, 0);
939 #else
940 (void) libCtx;
941 return CRYPT_EAL_Randbytes(byte, len);
942 #endif
943 }
944
CRYPT_EAL_RandSeedEx(CRYPT_EAL_LibCtx * libCtx)945 int32_t CRYPT_EAL_RandSeedEx(CRYPT_EAL_LibCtx *libCtx)
946 {
947 #ifdef HITLS_CRYPTO_PROVIDER
948 CRYPT_EAL_LibCtx *localCtx = libCtx;
949 if (localCtx == NULL) {
950 localCtx = CRYPT_EAL_GetGlobalLibCtx();
951 }
952
953 if (localCtx == NULL) {
954 BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_INVALID_LIB_CTX);
955 return CRYPT_PROVIDER_INVALID_LIB_CTX;
956 }
957 return EAL_DrbgSeedWithAdin((CRYPT_EAL_RndCtx *)localCtx->drbg, NULL, 0);
958 #else
959 (void) libCtx;
960 return CRYPT_EAL_RandSeed();
961 #endif
962 }
963
964 #endif // end of HITLS_CRYPTO_EAL && HITLS_CRYPTO_DRBG
965