• 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 
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