• 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 /* BEGIN_HEADER */
17 
18 #include <stdlib.h>
19 #include <stdio.h>
20 #include <string.h>
21 #include <unistd.h>
22 #include <pthread.h>
23 #include "bsl_sal.h"
24 #include "crypt_errno.h"
25 #include "crypt_entropy.h"
26 #include "crypt_eal_rand.h"
27 #include "eal_entropy.h"
28 #include "securec.h"
29 #include "crypt_eal_entropy.h"
30 #include "crypt_algid.h"
31 
32 #ifdef HITLS_CRYPTO_ENTROPY_SYS
IsCollectionEntropy(void * ctx)33 static bool IsCollectionEntropy(void *ctx)
34 {
35     bool isWork = false;
36     ASSERT_TRUE(CRYPT_EAL_EsCtrl(ctx, CRYPT_ENTROPY_GET_STATE, &isWork, 1) == CRYPT_SUCCESS);
37     uint32_t poolSize = 0;
38     uint32_t currSize = 0;
39     uint32_t cfSize = 0;
40     ASSERT_TRUE(CRYPT_EAL_EsCtrl(ctx, CRYPT_ENTROPY_GET_POOL_SIZE, &poolSize, 4) == CRYPT_SUCCESS);
41     ASSERT_TRUE(CRYPT_EAL_EsCtrl(ctx, CRYPT_ENTROPY_POOL_GET_CURRSIZE, &currSize, 4) == CRYPT_SUCCESS);
42     ASSERT_TRUE(CRYPT_EAL_EsCtrl(ctx, CRYPT_ENTROPY_GET_CF_SIZE, &cfSize, 4) == CRYPT_SUCCESS);
43     return isWork && (cfSize <= poolSize - currSize);
44 EXIT:
45     return false;
46 }
47 
EsGatherAuto(void * ctx)48 static void *EsGatherAuto(void *ctx)
49 {
50     while(true) {
51         if (!IsCollectionEntropy(ctx)) {
52             break;
53         }
54         ASSERT_TRUE(CRYPT_EAL_EsCtrl(ctx, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
55         uint32_t size;
56         ASSERT_TRUE(CRYPT_EAL_EsCtrl(ctx, CRYPT_ENTROPY_POOL_GET_CURRSIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
57         usleep(1000);
58     }
59 EXIT:
60     return NULL;
61 }
62 
EsGetAuto(void * ctx)63 static void *EsGetAuto(void *ctx)
64 {
65     uint8_t buf[48] = {0};
66     for (int32_t iter = 0; iter < 3; iter++) {
67         uint32_t len = CRYPT_EAL_EsEntropyGet(ctx, buf, 48);
68         ASSERT_TRUE(len > 0);
69     }
70 EXIT:
71     return NULL;
72 }
73 
EsGetCfMode(uint32_t algId)74 static const char *EsGetCfMode(uint32_t algId)
75 {
76     switch (algId) {
77         case CRYPT_MD_SM3:
78             return "sm3_df";
79         case CRYPT_MD_SHA224:
80             return "sha224_df";
81         case CRYPT_MD_SHA256:
82             return "sha256_df";
83         case CRYPT_MD_SHA384:
84             return "sha384_df";
85         case CRYPT_MD_SHA512:
86             return "sha512_df";
87         default:
88             return NULL;
89     }
90 }
91 
EsGetCfLen(uint32_t algId)92 static uint32_t EsGetCfLen(uint32_t algId)
93 {
94     switch (algId) {
95         case CRYPT_MD_SM3:
96             return 32u;
97         case CRYPT_MD_SHA224:
98             return 28u;
99         case CRYPT_MD_SHA256:
100             return 32u;
101         case CRYPT_MD_SHA384:
102             return 48u;
103         case CRYPT_MD_SHA512:
104             return 64u;
105         default:
106             return 0u;
107     }
108 }
109 
EntropyReadNormal(void * ctx,uint32_t timeout,uint8_t * buf,uint32_t bufLen)110 static int32_t EntropyReadNormal(void *ctx, uint32_t timeout, uint8_t *buf, uint32_t bufLen)
111 {
112     (void)ctx;
113     (void)timeout;
114     memset_s(buf, bufLen, 0xff, bufLen);
115     return CRYPT_SUCCESS;
116 }
117 
EntropyInitTest(void * para)118 static void *EntropyInitTest(void *para)
119 {
120     (void)para;
121     return EntropyInitTest;
122 }
123 
EntropyInitError(void * para)124 static void *EntropyInitError(void *para)
125 {
126     (void)para;
127     return NULL;
128 }
129 
EntropyReadError(void * ctx,uint32_t timeout,uint8_t * buf,uint32_t bufLen)130 static int32_t EntropyReadError(void *ctx, uint32_t timeout, uint8_t *buf, uint32_t bufLen)
131 {
132     (void)ctx;
133     (void)timeout;
134     memset_s(buf, bufLen, 0xff, bufLen);
135     return -1;
136 }
137 
EntropyReadDiffData(void * ctx,uint32_t timeout,uint8_t * buf,uint32_t bufLen)138 static int32_t EntropyReadDiffData(void *ctx, uint32_t timeout, uint8_t *buf, uint32_t bufLen)
139 {
140     (void)ctx;
141     (void)timeout;
142     for (uint32_t iter = 0; iter < bufLen; iter++) {
143         buf[iter] = iter % 128;
144     }
145     return CRYPT_SUCCESS;
146 }
147 
EntropyDeinitTest(void * ctx)148 static void EntropyDeinitTest(void *ctx)
149 {
150     (void)ctx;
151     return;
152 }
153 
EsMutiAuto(void * ctx)154 static void *EsMutiAuto(void *ctx)
155 {
156     CRYPT_EAL_NsPara para = {
157         "aaa",
158         false,
159         7,
160         {
161             NULL,
162             NULL,
163             EntropyReadNormal,
164             NULL,
165         },
166         {5, 39, 512},
167     };
168     CRYPT_EAL_EsCtrl(ctx, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sha256_df", strlen("sha256_df"));
169     CRYPT_EAL_EsCtrl(ctx, CRYPT_ENTROPY_ADD_NS, (void *)&para, sizeof(CRYPT_EAL_NsPara));
170     uint32_t size = 512;
171     CRYPT_EAL_EsCtrl(ctx, CRYPT_ENTROPY_SET_POOL_SIZE, (void *)&size, sizeof(uint32_t));
172     ASSERT_TRUE(CRYPT_EAL_EsInit(ctx) == CRYPT_SUCCESS);
173     uint8_t buf[48] = {0};
174     for (int32_t iter = 0; iter < 3; iter++) {
175         uint32_t len = CRYPT_EAL_EsEntropyGet(ctx, buf, 48);
176         ASSERT_TRUE(len > 0);
177     }
178 EXIT:
179     return NULL;
180 }
181 
EntropyESMutilTest(void * alg)182 static void EntropyESMutilTest(void *alg)
183 {
184     uint32_t poolSize = 4096;
185     uint32_t expectGetLen = 32;
186     uint8_t buf[1024] = {0};
187     uint32_t currPoolSize = 0;
188 
189     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
190     ASSERT_TRUE(es != NULL);
191     const char *mode = EsGetCfMode((uint32_t)(*(int *)alg));
192     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
193     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_POOL_SIZE, (void *)&poolSize, sizeof(uint32_t)) == CRYPT_SUCCESS);
194     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
195     for(int iter = 0; iter < 1; iter++) {
196         ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
197     }
198     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_POOL_GET_CURRSIZE, &currPoolSize, sizeof(uint32_t)) == CRYPT_SUCCESS);
199     ASSERT_TRUE(currPoolSize > expectGetLen);
200     uint32_t resLen = CRYPT_EAL_EsEntropyGet(es, buf, expectGetLen);
201     ASSERT_TRUE(resLen == expectGetLen);
202 EXIT:
203     CRYPT_EAL_EsFree(es);
204 }
GetEntropyTest(void * seedCtx,CRYPT_Data * entropy,uint32_t strength,CRYPT_Range * lenRange)205 static int32_t GetEntropyTest(void *seedCtx, CRYPT_Data *entropy, uint32_t strength, CRYPT_Range *lenRange)
206 {
207     (void)strength;
208     entropy->len = lenRange->min;
209     entropy->data = malloc(entropy->len);
210     ASSERT_TRUE(CRYPT_EAL_EsEntropyGet(seedCtx, entropy->data, entropy->len) == entropy->len);
211 EXIT:
212     return CRYPT_SUCCESS;
213 }
214 
CleanEntropyTest(void * ctx,CRYPT_Data * entropy)215 static void CleanEntropyTest(void *ctx, CRYPT_Data *entropy)
216 {
217     (void)ctx;
218     BSL_SAL_FREE(entropy->data);
219 }
220 
GetNonceTest(void * ctx,CRYPT_Data * nonce,uint32_t strength,CRYPT_Range * lenRange)221 static int32_t GetNonceTest(void *ctx, CRYPT_Data *nonce, uint32_t strength, CRYPT_Range *lenRange)
222 {
223     return GetEntropyTest(ctx, nonce, strength, lenRange);
224 }
225 
CleanNonceTest(void * ctx,CRYPT_Data * nonce)226 static void CleanNonceTest(void *ctx, CRYPT_Data *nonce)
227 {
228     CleanEntropyTest(ctx, nonce);
229 }
230 #endif
EntropyGetNormal(void * ctx,uint8_t * buf,uint32_t bufLen)231 static uint32_t EntropyGetNormal(void *ctx, uint8_t *buf, uint32_t bufLen)
232 {
233     (void)ctx;
234     (void)buf;
235     (void)bufLen;
236     memset_s(buf, bufLen, 'a', bufLen);
237     return 32 > bufLen ? bufLen : 32;
238 }
239 
EntropyGet0Normal(void * ctx,uint8_t * buf,uint32_t bufLen)240 static uint32_t EntropyGet0Normal(void *ctx, uint8_t *buf, uint32_t bufLen)
241 {
242     (void)ctx;
243     (void)buf;
244     (void)bufLen;
245     memset_s(buf, bufLen, 'a', bufLen);
246     return 0;
247 }
248 
DrbgSeedTest(void * ctx)249 static void *DrbgSeedTest(void *ctx)
250 {
251     CRYPT_RandSeedMethod meth = {0};
252     ASSERT_TRUE(EAL_SetDefaultEntropyMeth(&meth) == CRYPT_SUCCESS);
253     CRYPT_EAL_RndCtx *randCtx = CRYPT_EAL_DrbgNew(CRYPT_RAND_AES128_CTR_DF, &meth, ctx);
254     ASSERT_TRUE(randCtx != NULL);
255     uint32_t in = 1;
256     ASSERT_TRUE(CRYPT_EAL_DrbgCtrl(randCtx, CRYPT_CTRL_SET_RESEED_INTERVAL, &in, 4) == CRYPT_SUCCESS);
257     ASSERT_TRUE(CRYPT_EAL_DrbgInstantiate(randCtx, NULL, 0) == CRYPT_SUCCESS);
258     for (int32_t index = 0; index < 10; index++) {
259         uint8_t buf[32] = {0};
260         ASSERT_TRUE(CRYPT_EAL_Drbgbytes(randCtx, buf, 32) == CRYPT_SUCCESS);
261     }
262 EXIT:
263     CRYPT_EAL_DrbgDeinit(randCtx);
264     return NULL;
265 }
266 
267 #ifdef HITLS_CRYPTO_ENTROPY_SYS
ErrorGetEsEntropy(CRYPT_EAL_Es * esCtx,uint8_t * data,uint32_t len)268 static uint32_t ErrorGetEsEntropy(CRYPT_EAL_Es *esCtx, uint8_t *data, uint32_t len)
269 {
270     (void)esCtx;
271     (void)data;
272     (void)len;
273 
274     return 0;
275 }
276 #endif
277 
GetPoolCtx(uint32_t ent1,uint32_t ent2,bool pes1,bool pes2)278 static CRYPT_EAL_SeedPoolCtx *GetPoolCtx(uint32_t ent1, uint32_t ent2, bool pes1, bool pes2)
279 {
280     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew(true);
281     CRYPT_EAL_EsPara para1 = {pes2, ent2, NULL, (CRYPT_EAL_EntropyGet)EntropyGetNormal};
282     CRYPT_EAL_EsPara para2 = {pes1, ent1, NULL, (CRYPT_EAL_EntropyGet)EntropyGetNormal};
283     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &para1) == CRYPT_SUCCESS);
284     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &para2) == CRYPT_SUCCESS);
285     return pool;
286 EXIT:
287     CRYPT_EAL_SeedPoolFree(pool);
288     return NULL;
289 }
290 
291 /* END_HEADER */
292 
293 /* @
294 * @test  SDV_CRYPTO_ENTROPY_EsNormalTest
295 * @spec  -
296 * @title  Basic function test of the entropy source.
297 * @precon  nan
298 * @prior  Level 1
299 * @auto  TRUE
300 @ */
301 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_EsNormalTest(int alg,int size,int test)302 void SDV_CRYPTO_ENTROPY_EsNormalTest(int alg, int size, int test)
303 {
304 #ifdef HITLS_CRYPTO_ENTROPY_SYS
305     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
306     ASSERT_TRUE(es != NULL);
307     const char *mode = EsGetCfMode((uint32_t)alg);
308     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
309     bool healthTest = (bool)test;
310     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, 1) == CRYPT_SUCCESS);
311     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_POOL_SIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
312     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
313     BSL_SAL_ThreadId thrd;
314     ASSERT_TRUE(BSL_SAL_ThreadCreate(&thrd, EsGatherAuto, es) == 0);
315     BSL_SAL_ThreadId thrdget;
316     ASSERT_TRUE(BSL_SAL_ThreadCreate(&thrdget, EsGetAuto, es) == 0);
317     BSL_SAL_ThreadClose(thrd);
318     BSL_SAL_ThreadClose(thrdget);
319 EXIT:
320     CRYPT_EAL_EsFree(es);
321     return;
322 #else
323     (void)alg;
324     (void)size;
325     (void)test;
326     SKIP_TEST();
327 #endif
328 }
329 /* END_CASE */
330 
331 /* @
332 * @test  SDV_CRYPTO_ENTROPY_EsCtrlTest1
333 * @spec  -
334 * @title  Testing the entropy source setting interface.
335 * @precon  nan
336 * @prior  Level 1
337 * @auto  TRUE
338 @ */
339 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_EsCtrlTest1(int type,int state,int excRes)340 void SDV_CRYPTO_ENTROPY_EsCtrlTest1(int type, int state, int excRes)
341 {
342 #ifdef HITLS_CRYPTO_ENTROPY_SYS
343     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
344     ASSERT_TRUE(es != NULL);
345     uint32_t len = 512;
346     if (state == 1) {
347         ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) == CRYPT_SUCCESS);
348         ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_POOL_SIZE, (void *)&len, sizeof(uint32_t)) == CRYPT_SUCCESS);
349         ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
350     }
351     if (excRes == 1) {
352         ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, type, (void *)&len, sizeof(uint32_t)) == CRYPT_SUCCESS);
353     } else {
354         ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, type, (void *)&len, sizeof(uint32_t)) != CRYPT_SUCCESS);
355     }
356 
357 EXIT:
358     CRYPT_EAL_EsFree(es);
359     return;
360 #else
361     (void)type;
362     (void)state;
363     (void)excRes;
364     SKIP_TEST();
365 #endif
366 }
367 /* END_CASE */
368 
369 /* @
370 * @test  SDV_CRYPTO_ENTROPY_EsCtrlTest2
371 * @spec  -
372 * @title  Testing the entropy source setting interface.
373 * @precon  nan
374 * @prior  Level 1
375 * @auto  TRUE
376 @ */
377 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_EsCtrlTest2(void)378 void SDV_CRYPTO_ENTROPY_EsCtrlTest2(void)
379 {
380 #ifdef HITLS_CRYPTO_ENTROPY_SYS
381     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
382     ASSERT_TRUE(es != NULL);
383     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) == CRYPT_SUCCESS);
384     bool healthTest = true;
385     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, 1) == CRYPT_SUCCESS);
386     CRYPT_EAL_NsPara para = {
387         "aaa",
388         false,
389         7,
390         {
391             NULL,
392             NULL,
393             EntropyReadNormal,
394             NULL,
395         },
396         {5, 39, 512},
397     };
398     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&para, sizeof(CRYPT_EAL_NsPara)) == CRYPT_SUCCESS);
399     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_REMOVE_NS, (void *)(intptr_t)para.name, strlen(para.name)) == CRYPT_SUCCESS);
400     bool flag = false;
401     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_GET_STATE, &flag, 1) == CRYPT_SUCCESS);
402     ASSERT_TRUE(flag == false);
403     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
404     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_GET_STATE, &flag, 1) == CRYPT_SUCCESS);
405     ASSERT_TRUE(flag == true);
406     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) != CRYPT_SUCCESS);
407     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, 1) != CRYPT_SUCCESS);
408     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&para, sizeof(CRYPT_EAL_NsPara)) != CRYPT_SUCCESS);
409     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_REMOVE_NS, (void *)(intptr_t)para.name, strlen(para.name)) != CRYPT_SUCCESS);
410 
411 EXIT:
412     CRYPT_EAL_EsFree(es);
413     return;
414 #else
415     SKIP_TEST();
416 #endif
417 }
418 /* END_CASE */
419 
420 /* @
421 * @test  SDV_CRYPTO_ENTROPY_EsGatherTest
422 * @spec  -
423 * @title  Testing the entropy source gather interface.
424 * @precon  nan
425 * @prior  Level 1
426 * @auto  TRUE
427 @ */
428 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_EsGatherTest(int gather,int length,int expRes)429 void SDV_CRYPTO_ENTROPY_EsGatherTest(int gather, int length, int expRes)
430 {
431 #ifdef HITLS_CRYPTO_ENTROPY_SYS
432     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
433     ASSERT_TRUE(es != NULL);
434     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) == CRYPT_SUCCESS);
435     bool healthTest = true;
436     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, 1) == CRYPT_SUCCESS);
437     uint32_t size = 512;
438     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_POOL_SIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
439     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
440     if (gather == 1) {
441         BSL_SAL_ThreadId thrd;
442         ASSERT_TRUE(BSL_SAL_ThreadCreate(&thrd, EsGatherAuto, es) == 0);
443         BSL_SAL_ThreadClose(thrd);
444     }
445     uint8_t buf[513] = {0};
446     uint32_t len = CRYPT_EAL_EsEntropyGet(es, buf, length);
447     ASSERT_TRUE(len == (uint32_t)expRes);
448 
449 EXIT:
450     CRYPT_EAL_EsFree(es);
451     return;
452 #else
453     (void)gather;
454     (void)length;
455     (void)expRes;
456     SKIP_TEST();
457 #endif
458 }
459 /* END_CASE */
460 
461 /* @
462 * @test  SDV_CRYPTO_ENTROPY_EsWithoutNsTest
463 * @spec  -
464 * @title  No or no available noise source test.
465 * @precon  nan
466 * @prior  Level 1
467 * @auto  TRUE
468 @ */
469 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_EsWithoutNsTest()470 void SDV_CRYPTO_ENTROPY_EsWithoutNsTest()
471 {
472 #ifdef HITLS_CRYPTO_ENTROPY_SYS
473     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
474     ASSERT_TRUE(es != NULL);
475     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) == CRYPT_SUCCESS);
476     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_REMOVE_NS, (void *)(uintptr_t)"timestamp", 9) == CRYPT_SUCCESS);
477     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_REMOVE_NS, (void *)(uintptr_t)"CPU-Jitter", 10) == CRYPT_SUCCESS);
478     ASSERT_TRUE(CRYPT_EAL_EsInit(es) != CRYPT_SUCCESS);
479     CRYPT_EAL_NsPara para = {
480         "aaa",
481         false,
482         7,
483         {
484             NULL,
485             EntropyInitError,
486             EntropyReadError,
487             EntropyDeinitTest,
488         },
489         {5, 39, 512},
490     };
491     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&para, sizeof(CRYPT_EAL_NsPara)) == CRYPT_SUCCESS);
492     ASSERT_TRUE(CRYPT_EAL_EsInit(es) != CRYPT_SUCCESS);
493 
494 EXIT:
495     CRYPT_EAL_EsFree(es);
496     return;
497 #else
498     SKIP_TEST();
499 #endif
500 }
501 /* END_CASE */
502 
503 /* @
504 * @test  SDV_CRYPTO_ENTROPY_EsMultiNsTest
505 * @spec  -
506 * @title  Test with available and various unavailable noise sources.
507 * @precon  nan
508 * @prior  Level 1
509 * @auto  TRUE
510 @ */
511 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_EsMultiNsTest()512 void SDV_CRYPTO_ENTROPY_EsMultiNsTest()
513 {
514 #ifdef HITLS_CRYPTO_ENTROPY_SYS
515     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
516     ASSERT_TRUE(es != NULL);
517     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) == CRYPT_SUCCESS);
518     bool healthTest = true;
519     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, 1) == CRYPT_SUCCESS);
520     CRYPT_EAL_NsPara errPara = {
521         "read-err-ns",
522         false,
523         7,
524         {
525             NULL,
526             NULL,
527             EntropyReadError,
528             NULL,
529         },
530         {5, 39, 512},
531     };
532     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&errPara, sizeof(CRYPT_EAL_NsPara)) == CRYPT_SUCCESS);
533     CRYPT_EAL_NsPara initPara = {
534         "init-err-ns",
535         false,
536         7,
537         {
538             NULL,
539             EntropyInitError,
540             EntropyReadDiffData,
541             EntropyDeinitTest,
542         },
543         {5, 39, 512},
544     };
545     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&initPara, sizeof(CRYPT_EAL_NsPara)) == CRYPT_SUCCESS);
546     CRYPT_EAL_NsPara heaPara = {
547         "health-err-ns",
548         false,
549         7,
550         {
551             NULL,
552             EntropyInitTest,
553             EntropyReadNormal,
554             EntropyDeinitTest,
555         },
556         {5, 39, 512},
557     };
558     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&heaPara, sizeof(CRYPT_EAL_NsPara)) == CRYPT_SUCCESS);
559     CRYPT_EAL_NsPara norPara = {
560         "normal-ns",
561         false,
562         7,
563         {
564             NULL,
565             EntropyInitTest,
566             EntropyReadDiffData,
567             EntropyDeinitTest,
568         },
569         {5, 39, 512},
570     };
571     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&norPara, sizeof(CRYPT_EAL_NsPara)) == CRYPT_SUCCESS);
572     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
573     uint8_t buf[32] = {0};
574     ASSERT_TRUE(CRYPT_EAL_EsEntropyGet(es, buf, 32) == 32);
575 
576 EXIT:
577     CRYPT_EAL_EsFree(es);
578     return;
579 #else
580     SKIP_TEST();
581 #endif
582 }
583 /* END_CASE */
584 
585 /* @
586 * @test  SDV_CRYPTO_ENTROPY_EsNsNumberTest
587 * @spec  -
588 * @title  Test with available and various unavailable noise sources.
589 * @precon  nan
590 * @prior  Level 1
591 * @auto  TRUE
592 @ */
593 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_EsNsNumberTest(int number,int minEn,int expLen)594 void SDV_CRYPTO_ENTROPY_EsNsNumberTest(int number, int minEn, int expLen)
595 {
596 #ifdef HITLS_CRYPTO_ENTROPY_SYS
597     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
598     ASSERT_TRUE(es != NULL);
599     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) == CRYPT_SUCCESS);
600     bool healthTest = true;
601     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, 1) == CRYPT_SUCCESS);
602     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_REMOVE_NS, (void *)(uintptr_t)"timestamp", 9) == CRYPT_SUCCESS);
603     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_REMOVE_NS, (void *)(uintptr_t)"CPU-Jitter", 10) == CRYPT_SUCCESS);
604     CRYPT_EAL_NsPara errPara = {
605         NULL,
606         false,
607         minEn,
608         {
609             NULL,
610             NULL,
611             EntropyReadDiffData,
612             NULL,
613         },
614         {5, 39, 512},
615     };
616     const char *name = "ns-normal-";
617     errPara.name = BSL_SAL_Malloc(strlen(name) + 3);
618     ASSERT_TRUE(errPara.name != NULL);
619     for(int32_t iter = 0; iter < number; iter++) {
620         char str[3] = {0};
621         strncpy_s((char *)(intptr_t)errPara.name, strlen(name) + 3, name, strlen(name));
622         sprintf_s(str, 3, "%d", iter);
623         strcat_s((char *)(intptr_t)errPara.name, strlen(name) + 3, str);
624         if (iter >= 16) {
625             ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&errPara, sizeof(CRYPT_EAL_NsPara)) != CRYPT_SUCCESS);
626         } else {
627             ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&errPara, sizeof(CRYPT_EAL_NsPara)) == CRYPT_SUCCESS);
628         }
629     }
630 
631     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
632     uint8_t buf[32] = {0};
633     ASSERT_TRUE(CRYPT_EAL_EsEntropyGet(es, buf, 32) == (uint32_t)expLen);
634 
635 EXIT:
636     BSL_SAL_Free((void *)(intptr_t)errPara.name);
637     CRYPT_EAL_EsFree(es);
638     return;
639 #else
640     (void)number;
641     (void)minEn;
642     (void)expLen;
643     SKIP_TEST();
644 #endif
645 }
646 /* END_CASE */
647 
648 /* @
649 * @test  SDV_CRYPTO_ENTROPY_EorTest
650 * @spec  -
651 * @title  Test with available and various unavailable noise sources.
652 * @brief    1.conditioning function not set, expected result 1
653             2.entropy source not initialized, expected result 2
654             3.repeated setting of conditioning function, expected result 3
655 * @expect   1. result 1: failed
656             2. result 2: failed
657             3. result 3: failed
658 * @prior  Level 1
659 * @auto  TRUE
660 @ */
661 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_EorTest(void)662 void SDV_CRYPTO_ENTROPY_EorTest(void)
663 {
664 #ifdef HITLS_CRYPTO_ENTROPY_SYS
665     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
666     ASSERT_TRUE(es != NULL);
667     ASSERT_TRUE(CRYPT_EAL_EsInit(es) != CRYPT_SUCCESS);
668     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) == CRYPT_SUCCESS);
669     uint8_t buf[32] = {0};
670     ASSERT_TRUE(CRYPT_EAL_EsEntropyGet(es, buf, 32) == 0);
671     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) != CRYPT_SUCCESS);
672 
673 EXIT:
674     CRYPT_EAL_EsFree(es);
675     return;
676 #else
677     SKIP_TEST();
678 #endif
679 }
680 /* END_CASE */
681 
682 /* @
683 * @test  SDV_CRYPTO_ENTROPY_MutiTest
684 * @spec  -
685 * @title  Test with available and various unavailable noise sources.
686 * @brief
687 * @prior  Level 1
688 * @auto  TRUE
689 @ */
690 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_MutiTest(void)691 void SDV_CRYPTO_ENTROPY_MutiTest(void)
692 {
693 #ifdef HITLS_CRYPTO_ENTROPY_SYS
694     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
695     ASSERT_TRUE(es != NULL);
696     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sha256_df", strlen("sha256_df")) == CRYPT_SUCCESS);
697     uint32_t size = 512;
698     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_POOL_SIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
699     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
700     BSL_SAL_ThreadId thrd;
701     ASSERT_TRUE(BSL_SAL_ThreadCreate(&thrd, EsGatherAuto, es) == 0);
702     BSL_SAL_ThreadClose(thrd);
703     for (int32_t iter = 0; iter < 3; iter++) {
704         BSL_SAL_ThreadId thrdget;
705         ASSERT_TRUE(BSL_SAL_ThreadCreate(&thrdget, EsGetAuto, es) == 0);
706         BSL_SAL_ThreadClose(thrdget);
707     }
708 
709 EXIT:
710     CRYPT_EAL_EsFree(es);
711     return;
712 #else
713     SKIP_TEST();
714 #endif
715 }
716 /* END_CASE */
717 
718 /* @
719 * @test  SDV_CRYPTO_ENTROPY_MutiBeforeInitTest
720 * @spec  -
721 * @title  Test with available and various unavailable noise sources.
722 * @brief
723 * @prior  Level 1
724 * @auto  TRUE
725 @ */
726 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_MutiBeforeInitTest(void)727 void SDV_CRYPTO_ENTROPY_MutiBeforeInitTest(void)
728 {
729 #ifdef HITLS_CRYPTO_ENTROPY_SYS
730     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
731     ASSERT_TRUE(es != NULL);
732     for (int32_t iter = 0; iter < 3; iter++) {
733         BSL_SAL_ThreadId thrdget;
734         ASSERT_TRUE(BSL_SAL_ThreadCreate(&thrdget, EsMutiAuto, es) == 0);
735         BSL_SAL_ThreadClose(thrdget);
736     }
737     BSL_SAL_ThreadId thrd;
738     ASSERT_TRUE(BSL_SAL_ThreadCreate(&thrd, EsGatherAuto, es) == 0);
739     BSL_SAL_ThreadClose(thrd);
740 
741 EXIT:
742     CRYPT_EAL_EsFree(es);
743     return;
744 #else
745     SKIP_TEST();
746 #endif
747 }
748 /* END_CASE */
749 
750 /* @
751 * @test  SDV_CRYPTO_ENTROPY_ES_FUNC_0001
752 * @spec  -
753 * @title  Function test with the health test disabled, noise source not added, and entropy not added.
754 * @precon  nan
755 * @prior  Level 1
756 * @auto  TRUE
757 @ */
758 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_ES_FUNC_0001(int enableTest)759 void SDV_CRYPTO_ENTROPY_ES_FUNC_0001(int enableTest)
760 {
761 #ifdef HITLS_CRYPTO_ENTROPY_SYS
762     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
763     ASSERT_TRUE(es != NULL);
764     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sha512_df", strlen("sha512_df")) == CRYPT_SUCCESS);
765     if(enableTest) {
766         bool healthTest = true;
767         ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, 1) == CRYPT_SUCCESS);
768     }
769     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
770     uint32_t size;
771     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_POOL_GET_CURRSIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
772     ASSERT_EQ(size, 0);
773     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
774     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_POOL_GET_CURRSIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
775     ASSERT_EQ(size, 64);
776     uint8_t buf[8192] = {0};
777     uint32_t resLen = CRYPT_EAL_EsEntropyGet(es, buf, 8192);
778     ASSERT_TRUE(resLen == 64);
779 EXIT:
780     CRYPT_EAL_EsFree(es);
781     return;
782 #else
783     (void)enableTest;
784     SKIP_TEST();
785 #endif
786 }
787 /* END_CASE */
788 
789 /* @
790 * @test  SDV_CRYPTO_ENTROPY_ES_FUNC_0002
791 * @spec  -
792 * @title  Function test of adding noise sources and entropy by pressing Ctrl when the health check mode is disabled.
793 * @precon  nan
794 * @prior  Level 1
795 * @auto  TRUE
796 @ */
797 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_ES_FUNC_0002(int enableTest)798 void SDV_CRYPTO_ENTROPY_ES_FUNC_0002(int enableTest)
799 {
800 #ifdef HITLS_CRYPTO_ENTROPY_SYS
801     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
802     ASSERT_TRUE(es != NULL);
803     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) == CRYPT_SUCCESS);
804     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_REMOVE_NS, (void *)(uintptr_t)"timestamp", 9) == CRYPT_SUCCESS);
805     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_REMOVE_NS, (void *)(uintptr_t)"CPU-Jitter", 10) == CRYPT_SUCCESS);
806     CRYPT_EAL_NsPara norPara = {
807         "normal-ns",
808         enableTest,
809         7,
810         {
811             NULL,
812             EntropyInitTest,
813             EntropyReadDiffData,
814             EntropyDeinitTest,
815         },
816         {5, 39, 512},
817     };
818     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&norPara, sizeof(CRYPT_EAL_NsPara)) == CRYPT_SUCCESS);
819     if(enableTest) {
820         bool healthTest = true;
821         ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, 1) == CRYPT_SUCCESS);
822     }
823     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
824     uint32_t size;
825     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_POOL_GET_CURRSIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
826     ASSERT_EQ(size, 0);
827     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
828     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_POOL_GET_CURRSIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
829     ASSERT_EQ(size, 32);
830     uint8_t buf[8192] = {0};
831     uint32_t resLen = CRYPT_EAL_EsEntropyGet(es, buf, 8192);
832     ASSERT_TRUE(resLen == 32);
833     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_POOL_GET_CURRSIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
834     ASSERT_EQ(size, 0);
835 EXIT:
836     CRYPT_EAL_EsFree(es);
837     return;
838 #else
839     (void)enableTest;
840     SKIP_TEST();
841 #endif
842 }
843 /* END_CASE */
844 
845 /* @
846 * @test  SDV_CRYPTO_ENTROPY_ES_FUNC_0003
847 * @spec  -
848 * @title  Entropy source traversal test with the health test disabled, no noise source added, and different compression functions enabled.
849 * @precon  nan
850 * @prior  Level 1
851 * @auto  TRUE
852 @ */
853 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_ES_FUNC_0003(int alg,int enableTest)854 void SDV_CRYPTO_ENTROPY_ES_FUNC_0003(int alg, int enableTest)
855 {
856 #ifdef HITLS_CRYPTO_ENTROPY_SYS
857     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
858     ASSERT_TRUE(es != NULL);
859     const char *mode = EsGetCfMode((uint32_t)alg);
860     uint32_t expectGetLen = EsGetCfLen((uint32_t)alg);
861     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
862     if(enableTest) {
863         bool healthTest = true;
864         ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, 1) == CRYPT_SUCCESS);
865     }
866     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
867     uint32_t size;
868     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_POOL_GET_CURRSIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
869     ASSERT_EQ(size, 0);
870     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
871     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_POOL_GET_CURRSIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
872     ASSERT_EQ(size, expectGetLen);
873     uint8_t buf[8192] = {0};
874     uint32_t resLen = CRYPT_EAL_EsEntropyGet(es, buf, 8192);
875     ASSERT_TRUE(resLen == expectGetLen);
876 EXIT:
877     CRYPT_EAL_EsFree(es);
878     return;
879 #else
880     (void)alg;
881     (void)enableTest;
882     SKIP_TEST();
883 #endif
884 }
885 /* END_CASE */
886 
887 /* @
888 * @test  SDV_CRYPTO_ENTROPY_ES_FUNC_0004
889 * @spec  -
890 * @title  Function test of adding noise source and removing noise source after obtaining entropy source in health test disabled mode.
891 * @precon  nan
892 * @prior  Level 1
893 * @auto  TRUE
894 @ */
895 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_ES_FUNC_0004(int enableTest)896 void SDV_CRYPTO_ENTROPY_ES_FUNC_0004(int enableTest)
897 {
898 #ifdef HITLS_CRYPTO_ENTROPY_SYS
899     uint32_t expectGetLen = 32;
900     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
901     ASSERT_TRUE(es != NULL);
902     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) == CRYPT_SUCCESS);
903     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_REMOVE_NS, (void *)(uintptr_t)"timestamp", 9) == CRYPT_SUCCESS);
904     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_REMOVE_NS, (void *)(uintptr_t)"CPU-Jitter", 10) == CRYPT_SUCCESS);
905     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_ENTROPY_ES_NO_NS);
906     CRYPT_EAL_NsPara norPara1 = {
907         "normal-ns",
908         enableTest,
909         7,
910         {
911             NULL,
912             EntropyInitTest,
913             EntropyReadDiffData,
914             EntropyDeinitTest,
915         },
916         {0, 0, 512},
917     };
918     CRYPT_EAL_NsPara norPara2 = {
919         "timestamp",
920         enableTest,
921         7,
922         {
923             NULL,
924             EntropyInitTest,
925             EntropyReadDiffData,
926             EntropyDeinitTest,
927         },
928         {5, 39, 512},
929     };
930     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&norPara1, sizeof(CRYPT_EAL_NsPara)) == CRYPT_SUCCESS);
931     if(enableTest) {
932         bool healthTest = true;
933         ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, 1) == CRYPT_SUCCESS);
934     }
935     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
936     uint32_t size;
937     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_POOL_GET_CURRSIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
938     ASSERT_EQ(size, 0);
939     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
940     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_POOL_GET_CURRSIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
941     ASSERT_EQ(size, expectGetLen);
942     uint8_t buf[8192] = {0};
943     uint32_t resLen = CRYPT_EAL_EsEntropyGet(es, buf, 8192);
944     ASSERT_TRUE(resLen == expectGetLen);
945     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_POOL_GET_CURRSIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
946     ASSERT_EQ(size, 0);
947 
948     (void)BSL_SAL_ThreadWriteLock(es->lock);
949     ENTROPY_EsDeinit(es->es);
950     (void)BSL_SAL_ThreadUnlock(es->lock);
951     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_REMOVE_NS, (void *)(uintptr_t)"normal-ns", 10) == CRYPT_SUCCESS);
952     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_ENTROPY_ES_NO_NS);
953     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&norPara2, sizeof(CRYPT_EAL_NsPara)) == CRYPT_SUCCESS);
954     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
955     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
956     resLen = CRYPT_EAL_EsEntropyGet(es, buf, 8192);
957     ASSERT_TRUE(resLen == expectGetLen);
958 EXIT:
959     CRYPT_EAL_EsFree(es);
960     return;
961 #else
962     (void)enableTest;
963     SKIP_TEST();
964 #endif
965 }
966 /* END_CASE */
967 
968 /* @
969 * @test  SDV_CRYPTO_ENTROPY_ES_FUNC_0005
970 * @spec  -
971 * @title  Functional testing of boundary values for different entropy pool sizes.
972 * @precon  nan
973 * @prior  Level 1
974 * @auto  TRUE
975 @ */
976 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_ES_FUNC_0005(void)977 void SDV_CRYPTO_ENTROPY_ES_FUNC_0005(void)
978 {
979 #ifdef HITLS_CRYPTO_ENTROPY_SYS
980     uint32_t poolErrorSize[] = {511, 4097, 1024};
981     uint32_t poolSize = 512;
982     int32_t ret = 1;
983 
984     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
985     ASSERT_TRUE(es != NULL);
986     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) == CRYPT_SUCCESS);
987     for (uint32_t i = 0; i < sizeof(poolErrorSize)/sizeof(uint32_t); i++) {
988         ret = CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_POOL_SIZE, (void *)&poolErrorSize[i], sizeof(uint32_t));
989         if (ret == CRYPT_SUCCESS) {
990             ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_GET_POOL_SIZE, &poolSize, sizeof(uint32_t)) == CRYPT_ENTROPY_ES_STATE_ERROR);
991             ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
992             ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_GET_POOL_SIZE, &poolSize, sizeof(uint32_t)) == CRYPT_SUCCESS);
993             ASSERT_EQ(poolSize, poolErrorSize[i]);
994         } else {
995             ASSERT_TRUE(ret == CRYPT_ENTROPY_CTRL_INVALID_PARAM);
996         }
997     }
998 EXIT:
999     CRYPT_EAL_EsFree(es);
1000     return;
1001 #else
1002     SKIP_TEST();
1003 #endif
1004 }
1005 /* END_CASE */
1006 
1007 /* @
1008 * @test  SDV_CRYPTO_ENTROPY_ES_FUNC_0006
1009 * @spec  -
1010 * @title  Entropy source function test in the multi-thread concurrency scenario.
1011 * @precon  nan
1012 * @prior  Level 1
1013 * @auto  TRUE
1014 @ */
1015 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_ES_FUNC_0006(int alg)1016 void SDV_CRYPTO_ENTROPY_ES_FUNC_0006(int alg)
1017 {
1018 #ifdef HITLS_CRYPTO_ENTROPY_SYS
1019     const uint32_t threadNum = 5;
1020     pthread_t threadId[threadNum];
1021 
1022     for(uint32_t i = 0; i < threadNum; i++) {
1023         int ret = pthread_create(&threadId[i], NULL, (void *)EntropyESMutilTest, &alg);
1024         ASSERT_TRUE(ret == 0);
1025     }
1026 
1027     for(uint32_t i = 0; i < threadNum; i++) {
1028         pthread_join(threadId[i], NULL);
1029     }
1030 EXIT:
1031     return;
1032 #else
1033     (void)alg;
1034     SKIP_TEST();
1035 #endif
1036 }
1037 /* END_CASE */
1038 
1039 /* @
1040 * @test  SDV_CRYPTO_ENTROPY_ES_FUNC_0007
1041 * @spec  -
1042 * @title  Adding an Existing Noise Source Control Test.
1043 * @precon  nan
1044 * @prior  Level 1
1045 * @auto  TRUE
1046 @ */
1047 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_ES_FUNC_0007(int enableTest)1048 void SDV_CRYPTO_ENTROPY_ES_FUNC_0007(int enableTest)
1049 {
1050 #ifdef HITLS_CRYPTO_ENTROPY_SYS
1051     CRYPT_EAL_NsPara norPara = {
1052         "timestamp",
1053         enableTest,
1054         7,
1055         {
1056             NULL,
1057             EntropyInitTest,
1058             EntropyReadDiffData,
1059             EntropyDeinitTest,
1060         },
1061         {5, 39, 512},
1062     };
1063 
1064     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
1065     ASSERT_TRUE(es != NULL);
1066     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sm3_df", strlen("sm3_df")) == CRYPT_SUCCESS);
1067     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&norPara, sizeof(CRYPT_EAL_NsPara)) == CRYPT_ENTROPY_ES_DUP_NS);
1068     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_REMOVE_NS, (void *)(uintptr_t)"notExistNs", 10) == CRYPT_ENTROPY_ES_NS_NOT_FOUND);
1069 EXIT:
1070     CRYPT_EAL_EsFree(es);
1071     return;
1072 #else
1073     (void)enableTest;
1074     SKIP_TEST();
1075 #endif
1076 }
1077 /* END_CASE */
1078 
1079 /* @
1080 * @test  SDV_CRYPTO_EAL_SEEDPOOL_GetTest
1081 * @spec  -
1082 * @title  seedpool_GetTest
1083 * @precon  nan
1084 * @brief    1. Entropy data length: 32 - 512, entropy amount: 384, npes not available, return length: 48
1085             2. Entropy data length: 32 - 512, entropy amount: 384, npes available, return length: 64
1086             3. entropy data length: 64 - 512, entropy: 380, npes not available, return length: 64
1087             4. Entropy data length: 64 - 512, entropy amount: 380, npes available, return length: 64
1088             5. Entropy data length: 48 - 512, entropy amount: 384, npes available, return length: 54
1089             6. entropy data length: 32 - 32, entropy amount: 256, npes not available, return length: 32
1090             7. entropy data length: 48 - 48, entropy amount: 256, npes available, return length: 48
1091             8. entropy data length: 48 - 512, entropy amount: 680, npes available, return length: 48
1092 * @expect
1093 * @prior  Level 1
1094 * @auto  TRUE
1095 @ */
1096 /* BEGIN_CASE */
SDV_CRYPTO_EAL_SEEDPOOL_GetTest(int min,int max,int entropy,int npes,int exp)1097 void SDV_CRYPTO_EAL_SEEDPOOL_GetTest(int min, int max, int entropy, int npes, int exp)
1098 {
1099     uint8_t *buf = NULL;
1100     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew(true);
1101     ASSERT_TRUE(pool != NULL);
1102     CRYPT_EAL_EsPara para1 = {false, 6, NULL, (CRYPT_EAL_EntropyGet)EntropyGetNormal};
1103     CRYPT_EAL_EsPara para2 = {true, 8, NULL, (CRYPT_EAL_EntropyGet)EntropyGetNormal};
1104     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &para1) == CRYPT_SUCCESS);
1105     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &para2) == CRYPT_SUCCESS);
1106     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, (bool)npes, (uint32_t)min, (uint32_t)max, (uint32_t)entropy);
1107     ASSERT_TRUE(ctx != NULL);
1108     ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SUCCESS);
1109     uint32_t len;
1110     buf = EAL_EntropyDetachBuf(ctx, &len);
1111     ASSERT_TRUE(len == (uint32_t)exp);
1112     if (exp == 0) {
1113         ASSERT_TRUE(buf == NULL);
1114     } else {
1115         ASSERT_TRUE(buf != NULL);
1116     }
1117 EXIT:
1118     BSL_SAL_Free(buf);
1119     EAL_EntropyFreeCtx(ctx);
1120     CRYPT_EAL_SeedPoolFree(pool);
1121     return;
1122 }
1123 /* END_CASE */
1124 #if defined(HITLS_CRYPTO_ENTROPY_GETENTROPY) || defined(HITLS_CRYPTO_ENTROPY_DEVRANDOM)
1125 #include "entropy_seed_pool.h"
1126 typedef struct EntCtx {
1127     uint32_t entSum;
1128 } EntCtx;
1129 
EntropyGetSum(void * ctx,uint8_t * buf,uint32_t bufLen)1130 static uint32_t EntropyGetSum(void *ctx, uint8_t *buf, uint32_t bufLen)
1131 {
1132     EntCtx *enctx = (EntCtx *)ctx;
1133     uint32_t ret = ENTROPY_SysEntropyGet(ctx, buf, bufLen);
1134     enctx->entSum += ret;
1135     return ret;
1136 }
1137 #endif
1138 /* BEGIN_CASE */
SDV_CRYPTO_EAL_SEEDPOOL_EntropySumTest(int minEntropy1,int minEntropy2,int min,int entropy,int exp)1139 void SDV_CRYPTO_EAL_SEEDPOOL_EntropySumTest(int minEntropy1, int minEntropy2, int min, int entropy, int exp)
1140 {
1141 #if defined(HITLS_CRYPTO_ENTROPY_GETENTROPY) || defined(HITLS_CRYPTO_ENTROPY_DEVRANDOM)
1142     uint8_t *buf = NULL;
1143     EntCtx enctx = {0};
1144     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew(true);
1145     ASSERT_TRUE(pool != NULL);
1146     CRYPT_EAL_EsPara para1 = {false, minEntropy1, &enctx, (CRYPT_EAL_EntropyGet)EntropyGetSum};
1147     CRYPT_EAL_EsPara para2 = {false, minEntropy2, &enctx, (CRYPT_EAL_EntropyGet)EntropyGetSum};
1148     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &para1) == CRYPT_SUCCESS);
1149     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &para2) == CRYPT_SUCCESS);
1150     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, (uint32_t)min, (uint32_t)min, (uint32_t)entropy);
1151     ASSERT_TRUE(ctx != NULL);
1152     ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SUCCESS);
1153     uint32_t len;
1154     buf = EAL_EntropyDetachBuf(ctx, &len);
1155     ASSERT_TRUE(len == (uint32_t)min);
1156     if (exp == 0) {
1157         ASSERT_TRUE(buf == NULL);
1158     } else {
1159         ASSERT_TRUE(buf != NULL);
1160     }
1161     ASSERT_TRUE(enctx.entSum == (uint32_t)exp);
1162 EXIT:
1163     BSL_SAL_Free(buf);
1164     EAL_EntropyFreeCtx(ctx);
1165     CRYPT_EAL_SeedPoolFree(pool);
1166     return;
1167 #else
1168     (void)minEntropy1;
1169     (void)minEntropy2;
1170     (void)min;
1171     (void)entropy;
1172     (void)exp;
1173     SKIP_TEST();
1174 #endif
1175 }
1176 /* END_CASE */
1177 
1178 /* @
1179 * @test  SDV_CRYPTO_SEEDPOOL_DrbgTest
1180 * @spec  -
1181 * @title  use seedpool to construct an entropy source and generate a random number.
1182 * @precon  nan
1183 * @prior  Level 1
1184 * @auto  TRUE
1185 @ */
1186 /* BEGIN_CASE */
SDV_CRYPTO_SEEDPOOL_DrbgTest(int isNull,int algId)1187 void SDV_CRYPTO_SEEDPOOL_DrbgTest(int isNull, int algId)
1188 {
1189 #ifndef HITLS_CRYPTO_DRBG_GM
1190     if (algId == CRYPT_RAND_SM3 || algId == CRYPT_RAND_SM4_CTR_DF) {
1191         (void)isNull;
1192         SKIP_TEST();
1193     }
1194 #endif
1195 #ifndef HITLS_CRYPTO_DRBG_HASH
1196     if (algId == CRYPT_RAND_SHA256) {
1197         (void)isNull;
1198         SKIP_TEST();
1199     }
1200 #endif
1201 #ifndef HITLS_CRYPTO_DRBG_HMAC
1202     if (algId == CRYPT_RAND_HMAC_SHA256 || algId == CRYPT_RAND_HMAC_SHA384) {
1203         (void)isNull;
1204         SKIP_TEST();
1205     }
1206 #endif
1207 #ifndef HITLS_CRYPTO_DRBG_CTR
1208     if (algId == CRYPT_RAND_AES128_CTR_DF || algId == CRYPT_RAND_SM4_CTR_DF) {
1209         (void)isNull;
1210         SKIP_TEST();
1211     }
1212 #endif
1213     uint8_t output[16];
1214     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew((bool)isNull);
1215     CRYPT_EAL_EsPara para1 = {true, 6, NULL, (CRYPT_EAL_EntropyGet)EntropyGetNormal};
1216     CRYPT_EAL_EsPara para2 = {false, 7, NULL, (CRYPT_EAL_EntropyGet)EntropyGetNormal};
1217     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &para1) == CRYPT_SUCCESS);
1218     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &para2) == CRYPT_SUCCESS);
1219     CRYPT_RandSeedMethod meth = {0};
1220     ASSERT_TRUE(EAL_SetDefaultEntropyMeth(&meth) == CRYPT_SUCCESS);
1221     CRYPT_EAL_RandDeinit();
1222     ASSERT_TRUE(CRYPT_EAL_RandInit((CRYPT_RAND_AlgId)algId, &meth, (void *)pool, NULL, 0) == CRYPT_SUCCESS);
1223     ASSERT_TRUE(CRYPT_EAL_Randbytes(output, 16) == CRYPT_SUCCESS);
1224 EXIT:
1225     CRYPT_EAL_RandDeinit();
1226     CRYPT_EAL_SeedPoolFree(pool);
1227     return;
1228 }
1229 /* END_CASE */
1230 
1231 /* @
1232 * @test  SDV_CRYPTO_ENTROPY_DrbgTest
1233 * @spec  -
1234 * @title  use hitls es to construct an entropy source and generate a random number.
1235 * @precon  nan
1236 * @prior  Level 1
1237 * @auto  TRUE
1238 @ */
1239 /* BEGIN_CASE */
SDV_CRYPTO_ENTROPY_DrbgTest(void)1240 void SDV_CRYPTO_ENTROPY_DrbgTest(void)
1241 {
1242 #ifdef HITLS_CRYPTO_ENTROPY_SYS
1243     uint8_t output[256];
1244     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
1245     ASSERT_TRUE(es != NULL);
1246     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)"sha256_df", strlen("sha256_df")) == CRYPT_SUCCESS);
1247     CRYPT_EAL_NsPara para = {
1248         "aaa",
1249         true,
1250         7,
1251         {
1252             NULL,
1253             NULL,
1254             EntropyReadNormal,
1255             NULL,
1256         },
1257         {5, 39, 512},
1258     };
1259     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&para, sizeof(CRYPT_EAL_NsPara)) == CRYPT_SUCCESS);
1260     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
1261     for (int32_t iter = 0; iter < 5; iter++) {
1262         ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1263     }
1264     CRYPT_RandSeedMethod meth = {GetEntropyTest, CleanEntropyTest, GetNonceTest, CleanNonceTest};
1265     ASSERT_TRUE(CRYPT_EAL_RandInit(CRYPT_RAND_SHA256, &meth, (void *)es, NULL, 0) == CRYPT_SUCCESS);
1266     ASSERT_TRUE(CRYPT_EAL_Randbytes(output, 256) == CRYPT_SUCCESS);
1267 EXIT:
1268     CRYPT_EAL_RandDeinit();
1269     CRYPT_EAL_EsFree(es);
1270     return;
1271 #else
1272     SKIP_TEST();
1273 #endif
1274 }
1275 /* END_CASE */
1276 
1277 /* @
1278 * @test  SDV_CRYPTO_SEEDPOOL_MutiTest
1279 * @spec  -
1280 * @title  use seedpool to construct the entropy source and perform the multi-thread test.
1281 * @precon  nan
1282 * @prior  Level 1
1283 * @auto  TRUE
1284 @ */
1285 /* BEGIN_CASE */
SDV_CRYPTO_SEEDPOOL_MutiTest(void)1286 void SDV_CRYPTO_SEEDPOOL_MutiTest(void)
1287 {
1288     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew(false);
1289     CRYPT_EAL_EsPara para1 = {true, 6, NULL, (CRYPT_EAL_EntropyGet)EntropyGetNormal};
1290     CRYPT_EAL_EsPara para2 = {false, 7, NULL, (CRYPT_EAL_EntropyGet)EntropyGetNormal};
1291     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &para1) == CRYPT_SUCCESS);
1292     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &para2) == CRYPT_SUCCESS);
1293     CRYPT_RandSeedMethod meth = {0};
1294     ASSERT_TRUE(EAL_SetDefaultEntropyMeth(&meth) == CRYPT_SUCCESS);
1295     for (int32_t index = 0; index < 3; index++) {
1296         pthread_t thrd;
1297         ASSERT_TRUE(pthread_create(&thrd, NULL, DrbgSeedTest, pool) == 0);
1298         pthread_join(thrd, NULL);
1299     }
1300 
1301 EXIT:
1302     CRYPT_EAL_SeedPoolFree(pool);
1303     return;
1304 }
1305 /* END_CASE */
1306 
1307 /* @
1308 * @test  SDV_CRYPTO_SEEDPOOL_GetEntropyErrTest
1309 * @spec  -
1310 * @title  The entropy source quality is too poor to meet the requirements.
1311 * @precon  nan
1312 * @prior  Level 1
1313 * @auto  TRUE
1314 @ */
1315 /* BEGIN_CASE */
SDV_CRYPTO_SEEDPOOL_GetEntropyErrTest(void)1316 void SDV_CRYPTO_SEEDPOOL_GetEntropyErrTest(void)
1317 {
1318     CRYPT_EAL_SeedPoolCtx *pool = GetPoolCtx(5, 5, true, false);
1319     ASSERT_TRUE(pool != NULL);
1320     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, 32, 48, 256);
1321     ASSERT_TRUE(ctx != NULL);
1322     ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) != CRYPT_SUCCESS);
1323 
1324 EXIT:
1325     CRYPT_EAL_SeedPoolFree(pool);
1326     EAL_EntropyFreeCtx(ctx);
1327     return;
1328 }
1329 /* END_CASE */
1330 
1331 /* @
1332 * @test  SDV_CRYPTO_SEEDPOOL_EntLenLessMinTest
1333 * @spec  -
1334 * @title  The supplied entropy source data is smaller than the minimum length.
1335 * @precon  nan
1336 * @prior  Level 1
1337 * @auto  TRUE
1338 @ */
1339 /* BEGIN_CASE */
SDV_CRYPTO_SEEDPOOL_EntLenLessMinTest(void)1340 void SDV_CRYPTO_SEEDPOOL_EntLenLessMinTest(void)
1341 {
1342     CRYPT_EAL_SeedPoolCtx *pool = GetPoolCtx(5, 5, true, false);
1343     ASSERT_TRUE(pool != NULL);
1344     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, 32, 48, 128);
1345     ASSERT_TRUE(ctx != NULL);
1346     ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SUCCESS);
1347 
1348 EXIT:
1349     CRYPT_EAL_SeedPoolFree(pool);
1350     EAL_EntropyFreeCtx(ctx);
1351     return;
1352 }
1353 /* END_CASE */
1354 
1355 
1356 /* @
1357 * @test  SDV_CRYPTO_SEEDPOOL_Get0EntropyTest
1358 * @spec  -
1359 * @title  failed to obtain entropy data from the entropy pool.
1360 * @precon  nan
1361 * @prior  Level 1
1362 * @auto  TRUE
1363 @ */
1364 /* BEGIN_CASE */
SDV_CRYPTO_SEEDPOOL_Get0EntropyTest(void)1365 void SDV_CRYPTO_SEEDPOOL_Get0EntropyTest(void)
1366 {
1367     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew(true);
1368     CRYPT_EAL_EsPara para1 = {true, 6, NULL, (CRYPT_EAL_EntropyGet)EntropyGet0Normal};
1369     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &para1) == CRYPT_SUCCESS);
1370     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, 32, 48, 256);
1371     ASSERT_TRUE(ctx != NULL);
1372     ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) != CRYPT_SUCCESS);
1373 EXIT:
1374     CRYPT_EAL_SeedPoolFree(pool);
1375     EAL_EntropyFreeCtx(ctx);
1376     return;
1377 }
1378 /* END_CASE */
1379 
1380 /* @
1381 * @test  SDV_CRYPTO_SEEDPOOL_UnsedSeedPoolTest
1382 * @spec  -
1383 * @title  Failed to obtain the entropy data of sufficient length.
1384 * @precon  nan
1385 * @prior  Level 1
1386 * @auto  TRUE
1387 @ */
1388 /* BEGIN_CASE */
SDV_CRYPTO_SEEDPOOL_UnsedSeedPoolTest(void)1389 void SDV_CRYPTO_SEEDPOOL_UnsedSeedPoolTest(void)
1390 {
1391     CRYPT_EAL_SeedPoolCtx *pool = GetPoolCtx(8, 8, true, false);
1392     ASSERT_TRUE(pool != NULL);
1393     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, 81, 100, 128);
1394     ASSERT_TRUE(ctx != NULL);
1395     ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) != CRYPT_SUCCESS);
1396 EXIT:
1397     CRYPT_EAL_SeedPoolFree(pool);
1398     EAL_EntropyFreeCtx(ctx);
1399     return;
1400 }
1401 /* END_CASE */
1402 
1403 /* @
1404 * @test  SDV_CRYPTO_SEEDPOOL_DiffEntropyTest
1405 * @spec  -
1406 * @title  The entropy pool used for handle creation is inconsistent with the obtained entropy pool. As a result,
1407            the entropy source fails to be obtained.
1408 * @precon  nan
1409 * @prior  Level 1
1410 * @auto  TRUE
1411 @ */
1412 /* BEGIN_CASE */
SDV_CRYPTO_SEEDPOOL_DiffEntropyTest(void)1413 void SDV_CRYPTO_SEEDPOOL_DiffEntropyTest(void)
1414 {
1415     CRYPT_EAL_SeedPoolCtx *pool = GetPoolCtx(8, 8, true, false);
1416     ASSERT_TRUE(pool != NULL);
1417     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, 32, 64, 256);
1418     ASSERT_TRUE(ctx != NULL);
1419     CRYPT_EAL_SeedPoolCtx *pool1 = GetPoolCtx(6, 6, true, false);
1420     ASSERT_TRUE(pool1 != NULL);
1421     ASSERT_TRUE(EAL_EntropyCollection(pool1, ctx) != CRYPT_SUCCESS);
1422     CRYPT_EAL_SeedPoolFree(pool1);
1423 EXIT:
1424     CRYPT_EAL_SeedPoolFree(pool);
1425     EAL_EntropyFreeCtx(ctx);
1426     return;
1427 }
1428 /* END_CASE */
1429 
1430 /* @
1431 * @test  SDV_CRYPTO_SEEDPOOL_Get0EntropyTest
1432 * @spec  -
1433 * @title  Obtains the total entropy output without using the conditioning function.
1434 * @precon  nan
1435 * @prior  Level 1
1436 * @auto  TRUE
1437 @ */
1438 /* BEGIN_CASE */
SDV_CRYPTO_SEEDPOOL_FENoEcfTest(int ent)1439 void SDV_CRYPTO_SEEDPOOL_FENoEcfTest(int ent)
1440 {
1441     CRYPT_EAL_SeedPoolCtx *pool = GetPoolCtx(8, 7, true, false);
1442     ASSERT_TRUE(pool != NULL);
1443     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, 32, 32, ent);
1444     ASSERT_TRUE(ctx != NULL);
1445     ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SUCCESS);
1446     uint32_t len;
1447     uint8_t *data = EAL_EntropyDetachBuf(ctx, &len);
1448     ASSERT_TRUE(data != NULL);
1449     ASSERT_TRUE(len == 32);
1450     BSL_SAL_Free(data);
1451 
1452 EXIT:
1453     CRYPT_EAL_SeedPoolFree(pool);
1454     EAL_EntropyFreeCtx(ctx);
1455     return;
1456 }
1457 /* END_CASE */
1458 
1459 /* @
1460 * @test  SDV_CRYPTO_SEEDPOOL_FEWithEcfTest
1461 * @spec  -
1462 * @title  Obtains the total entropy output without using the conditioning function.
1463 * @precon  nan
1464 * @prior  Level 1
1465 * @auto  TRUE
1466 @ */
1467 /* BEGIN_CASE */
SDV_CRYPTO_SEEDPOOL_FEWithEcfTest(void)1468 void SDV_CRYPTO_SEEDPOOL_FEWithEcfTest(void)
1469 {
1470 #ifndef HITLS_CRYPTO_HMAC
1471     SKIP_TEST();
1472 #endif
1473     CRYPT_EAL_SeedPoolCtx *pool = GetPoolCtx(8, 7, true, false);
1474     ASSERT_TRUE(pool != NULL);
1475     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, 48, 48, 384);
1476     ASSERT_TRUE(ctx != NULL);
1477     ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SUCCESS);
1478     uint32_t len;
1479     uint8_t *data = EAL_EntropyDetachBuf(ctx, &len);
1480     ASSERT_TRUE(data != NULL);
1481     ASSERT_TRUE(len == 48);
1482     BSL_SAL_Free(data);
1483 EXIT:
1484     CRYPT_EAL_SeedPoolFree(pool);
1485     EAL_EntropyFreeCtx(ctx);
1486     return;
1487 }
1488 /* END_CASE */
1489 
1490 /* @
1491 * @test  SDV_CRYPTO_SEEDPOOL_CompleteTest
1492 * @spec  -
1493 * @title  Complete usage testing from entropy source to drbg.
1494 * @precon  nan
1495 * @prior  Level 1
1496 * @auto  TRUE
1497 @ */
1498 /* BEGIN_CASE */
SDV_CRYPTO_SEEDPOOL_CompleteTest(void)1499 void SDV_CRYPTO_SEEDPOOL_CompleteTest(void)
1500 {
1501     CRYPT_EAL_RndCtx *rndCtx = NULL;
1502     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew(false);
1503 #ifdef HITLS_CRYPTO_ENTROPY_SYS
1504     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
1505     ASSERT_TRUE(es != NULL);
1506     char *mode = "sm3_df";
1507     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1508     bool healthTest = true;
1509     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, 1) == CRYPT_SUCCESS);
1510     uint32_t size = 512;
1511     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_POOL_SIZE, (void *)&size, sizeof(uint32_t)) == CRYPT_SUCCESS);
1512     CRYPT_EAL_NsPara para = {
1513         "aaa",
1514         false,
1515         5,
1516         {
1517             NULL,
1518             NULL,
1519             EntropyReadNormal,
1520             NULL,
1521         },
1522         {5, 39, 512},
1523     };
1524     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ADD_NS, (void *)&para, sizeof(CRYPT_EAL_NsPara)) == CRYPT_SUCCESS);
1525     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
1526     BSL_SAL_ThreadId thrd;
1527     ASSERT_TRUE(BSL_SAL_ThreadCreate(&thrd, EsGatherAuto, es) == 0);
1528     BSL_SAL_ThreadClose(thrd);
1529 
1530     CRYPT_EAL_EsPara para1 = {false, 8, es, (CRYPT_EAL_EntropyGet)CRYPT_EAL_EsEntropyGet};
1531     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &para1) == CRYPT_SUCCESS);
1532 #endif
1533     CRYPT_RandSeedMethod meth = {0};
1534     ASSERT_TRUE(EAL_SetDefaultEntropyMeth(&meth) == CRYPT_SUCCESS);
1535 #ifdef HITLS_CRYPTO_DRBG_GM
1536     rndCtx = CRYPT_EAL_DrbgNew(CRYPT_RAND_SM4_CTR_DF, &meth, pool);
1537 #else
1538     rndCtx = CRYPT_EAL_DrbgNew(CRYPT_RAND_AES256_CTR_DF, &meth, pool);
1539 #endif
1540     ASSERT_TRUE(rndCtx != NULL);
1541     ASSERT_TRUE(CRYPT_EAL_DrbgInstantiate(rndCtx, NULL, 0) == CRYPT_SUCCESS);
1542     uint8_t out[16] = {0};
1543     ASSERT_TRUE(CRYPT_EAL_Drbgbytes(rndCtx, out, 16) == CRYPT_SUCCESS);
1544     ASSERT_TRUE(CRYPT_EAL_DrbgSeed(rndCtx) == CRYPT_SUCCESS);
1545 
1546 EXIT:
1547     CRYPT_EAL_DrbgDeinit(rndCtx);
1548     CRYPT_EAL_SeedPoolFree(pool);
1549 #ifdef HITLS_CRYPTO_ENTROPY_SYS
1550     CRYPT_EAL_EsFree(es);
1551 #endif
1552     return;
1553 }
1554 /* END_CASE */
1555 
1556 /* @
1557 * @test  HITLS_SDV_DRBG_GM_FUNC_TC019
1558 * @spec  -
1559 * @title  Complete usage testing from entropy sources.
1560 * @precon  nan
1561 * @prior  Level 1
1562 * @auto  TRUE
1563 @ */
1564 /* BEGIN_CASE */
HITLS_SDV_DRBG_GM_FUNC_TC019(int isCreateNullPool,int isPhysical,int minEntropy,int minL,int maxL,int entropyL,int isValid)1565 void HITLS_SDV_DRBG_GM_FUNC_TC019(int isCreateNullPool, int isPhysical, int minEntropy, int minL, int maxL, int entropyL, int isValid)
1566 {
1567 #ifdef HITLS_CRYPTO_ENTROPY_SYS
1568     CRYPT_EAL_Es *es = CRYPT_EAL_EsNew();
1569     ASSERT_TRUE(es != NULL);
1570     char *mode = "sm3_df";
1571     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1572     bool healthTest = true;
1573     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1574     ASSERT_TRUE(CRYPT_EAL_EsInit(es) == CRYPT_SUCCESS);
1575     if (isCreateNullPool) {
1576         for (int i = 0; i < 16; i++) {
1577             ASSERT_TRUE(CRYPT_EAL_EsCtrl(es, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1578         }
1579     }
1580     CRYPT_EAL_EsPara esPara = {isPhysical, (uint32_t)minEntropy, es, NULL};
1581     if (isValid) {
1582         esPara.entropyGet = (CRYPT_EAL_EntropyGet)CRYPT_EAL_EsEntropyGet;
1583     } else {
1584         esPara.entropyGet = (CRYPT_EAL_EntropyGet)ErrorGetEsEntropy;
1585     }
1586     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew(isCreateNullPool);
1587     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara) == CRYPT_SUCCESS);
1588     uint8_t isNpesUsed = true;
1589     uint32_t minLen = (uint32_t)minL;
1590     uint32_t maxLen = (uint32_t)maxL;
1591     uint32_t entropy = (uint32_t)entropyL;
1592     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, isNpesUsed, minLen, maxLen, entropy);
1593     ASSERT_TRUE(ctx != NULL);
1594     if (isCreateNullPool && !isValid) {
1595         ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SEED_POOL_NOT_MEET_REQUIREMENT);
1596     } else {
1597         ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SUCCESS);
1598     }
1599 EXIT:
1600     CRYPT_EAL_SeedPoolFree(pool);
1601     EAL_EntropyFreeCtx(ctx);
1602     CRYPT_EAL_EsFree(es);
1603     return;
1604 #else
1605     (void)isCreateNullPool;
1606     (void)isPhysical;
1607     (void)minEntropy;
1608     (void)minL;
1609     (void)maxL;
1610     (void)entropyL;
1611     (void)isValid;
1612     SKIP_TEST();
1613 #endif
1614 }
1615 /* END_CASE */
1616 
1617 /* @
1618 * @test  HITLS_SDV_DRBG_GM_FUNC_TC039
1619 * @spec  -
1620 * @title  Complete usage testing from entropy sources.
1621 * @precon  nan
1622 * @prior  Level 1
1623 * @auto  TRUE
1624 @ */
1625 /* BEGIN_CASE */
HITLS_SDV_DRBG_GM_FUNC_TC039(int isCreateNullPool,int isPhysical,int minEntropy,int minL,int maxL,int entropyL)1626 void HITLS_SDV_DRBG_GM_FUNC_TC039(int isCreateNullPool, int isPhysical, int minEntropy, int minL, int maxL, int entropyL)
1627 {
1628 #ifdef HITLS_CRYPTO_ENTROPY_SYS
1629     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew(isCreateNullPool);
1630     CRYPT_EAL_Es *es1 = CRYPT_EAL_EsNew();
1631     ASSERT_TRUE(es1 != NULL);
1632     char *mode = "sm3_df";
1633     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1634     bool healthTest = true;
1635     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1636     ASSERT_TRUE(CRYPT_EAL_EsInit(es1) == CRYPT_SUCCESS);
1637     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1638     CRYPT_EAL_EsPara esPara1 = {isPhysical, (uint32_t)minEntropy, es1, (CRYPT_EAL_EntropyGet)CRYPT_EAL_EsEntropyGet};
1639     CRYPT_EAL_Es *es2 = CRYPT_EAL_EsNew();
1640     ASSERT_TRUE(es2 != NULL);
1641     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1642     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1643     ASSERT_TRUE(CRYPT_EAL_EsInit(es2) == CRYPT_SUCCESS);
1644     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1645     CRYPT_EAL_EsPara esPara2 = {!isPhysical, (uint32_t)minEntropy, es2, (CRYPT_EAL_EntropyGet)CRYPT_EAL_EsEntropyGet};
1646     CRYPT_EAL_Es *es3 = CRYPT_EAL_EsNew();
1647     ASSERT_TRUE(es3 != NULL);
1648     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1649     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1650     ASSERT_TRUE(CRYPT_EAL_EsInit(es3) == CRYPT_SUCCESS);
1651     if (isCreateNullPool) {
1652         for (int i = 0; i < 3; i++) {
1653             ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1654         }
1655     }
1656     CRYPT_EAL_EsPara esPara3 = {isPhysical, (uint32_t)minEntropy, es3, (CRYPT_EAL_EntropyGet)CRYPT_EAL_EsEntropyGet};
1657     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara1) == CRYPT_SUCCESS);
1658     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara2) == CRYPT_SUCCESS);
1659     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara3) == CRYPT_SUCCESS);
1660     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, (uint32_t)minL, (uint32_t)maxL, (uint32_t)entropyL);
1661     ASSERT_TRUE(ctx != NULL);
1662     ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SUCCESS);
1663 EXIT:
1664     CRYPT_EAL_SeedPoolFree(pool);
1665     EAL_EntropyFreeCtx(ctx);
1666     CRYPT_EAL_EsFree(es1);
1667     CRYPT_EAL_EsFree(es2);
1668     CRYPT_EAL_EsFree(es3);
1669     return;
1670 #else
1671     (void)isCreateNullPool;
1672     (void)isPhysical;
1673     (void)minEntropy;
1674     (void)minL;
1675     (void)maxL;
1676     (void)entropyL;
1677     SKIP_TEST();
1678 #endif
1679 }
1680 /* END_CASE */
1681 
1682 /* @
1683 * @test  HITLS_SDV_DRBG_GM_FUNC_TC067
1684 * @spec  -
1685 * @title  Complete usage testing from entropy sources.
1686 * @precon  nan
1687 * @prior  Level 1
1688 * @auto  TRUE
1689 @ */
1690 /* BEGIN_CASE */
HITLS_SDV_DRBG_GM_FUNC_TC067(int isCreateNullPool,int isPhysical,int minEntropy,int minL,int maxL,int entropyL)1691 void HITLS_SDV_DRBG_GM_FUNC_TC067(int isCreateNullPool, int isPhysical, int minEntropy, int minL, int maxL, int entropyL)
1692 {
1693 #ifdef HITLS_CRYPTO_ENTROPY_SYS
1694     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew(isCreateNullPool);
1695     CRYPT_EAL_Es *es1 = CRYPT_EAL_EsNew();
1696     ASSERT_TRUE(es1 != NULL);
1697     char *mode = "sm3_df";
1698     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1699     bool healthTest = true;
1700     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1701     ASSERT_TRUE(CRYPT_EAL_EsInit(es1) == CRYPT_SUCCESS);
1702     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1703     CRYPT_EAL_EsPara esPara1 = {isPhysical, (uint32_t)minEntropy, es1, (CRYPT_EAL_EntropyGet)ErrorGetEsEntropy};
1704     CRYPT_EAL_Es *es2 = CRYPT_EAL_EsNew();
1705     ASSERT_TRUE(es2 != NULL);
1706     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1707     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1708     ASSERT_TRUE(CRYPT_EAL_EsInit(es2) == CRYPT_SUCCESS);
1709     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1710     CRYPT_EAL_EsPara esPara2 = {!isPhysical, (uint32_t)minEntropy, es2, (CRYPT_EAL_EntropyGet)ErrorGetEsEntropy};
1711     CRYPT_EAL_Es *es3 = CRYPT_EAL_EsNew();
1712     ASSERT_TRUE(es3 != NULL);
1713     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1714     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1715     ASSERT_TRUE(CRYPT_EAL_EsInit(es3) == CRYPT_SUCCESS);
1716     CRYPT_EAL_EsPara esPara3 = {isPhysical, (uint32_t)minEntropy, es3, (CRYPT_EAL_EntropyGet)ErrorGetEsEntropy};
1717     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara1) == CRYPT_SUCCESS);
1718     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara2) == CRYPT_SUCCESS);
1719     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara3) == CRYPT_SUCCESS);
1720     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, (uint32_t)minL, (uint32_t)maxL, (uint32_t)entropyL);
1721     ASSERT_TRUE(ctx != NULL);
1722     if (isCreateNullPool) {
1723         ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) != CRYPT_SUCCESS);
1724     } else {
1725         ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SUCCESS);
1726     }
1727 EXIT:
1728     CRYPT_EAL_SeedPoolFree(pool);
1729     EAL_EntropyFreeCtx(ctx);
1730     CRYPT_EAL_EsFree(es1);
1731     CRYPT_EAL_EsFree(es2);
1732     CRYPT_EAL_EsFree(es3);
1733     return;
1734 #else
1735     (void)isCreateNullPool;
1736     (void)isPhysical;
1737     (void)minEntropy;
1738     (void)minL;
1739     (void)maxL;
1740     (void)entropyL;
1741     SKIP_TEST();
1742 #endif
1743 }
1744 /* END_CASE */
1745 
1746 /* @
1747 * @test  HITLS_SDV_DRBG_GM_FUNC_TC071
1748 * @spec  -
1749 * @title  Complete usage testing from entropy sources.
1750 * @precon  nan
1751 * @prior  Level 1
1752 * @auto  TRUE
1753 @ */
1754 /* BEGIN_CASE */
HITLS_SDV_DRBG_GM_FUNC_TC071(int isCreateNullPool,int isPhysical,int minEntropy,int minL,int maxL,int entropyL)1755 void HITLS_SDV_DRBG_GM_FUNC_TC071(int isCreateNullPool, int isPhysical, int minEntropy, int minL, int maxL, int entropyL)
1756 {
1757 #ifdef HITLS_CRYPTO_ENTROPY_SYS
1758     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew(isCreateNullPool);
1759     CRYPT_EAL_Es *es1 = CRYPT_EAL_EsNew();
1760     ASSERT_TRUE(es1 != NULL);
1761     char *mode = "sm3_df";
1762     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1763     bool healthTest = true;
1764     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1765     ASSERT_TRUE(CRYPT_EAL_EsInit(es1) == CRYPT_SUCCESS);
1766     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1767     CRYPT_EAL_EsPara esPara1 = {!isPhysical, (uint32_t)minEntropy, es1, (CRYPT_EAL_EntropyGet)ErrorGetEsEntropy};
1768     CRYPT_EAL_Es *es2 = CRYPT_EAL_EsNew();
1769     ASSERT_TRUE(es2 != NULL);
1770     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1771     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1772     ASSERT_TRUE(CRYPT_EAL_EsInit(es2) == CRYPT_SUCCESS);
1773     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1774     CRYPT_EAL_EsPara esPara2 = {isPhysical, (uint32_t)minEntropy, es2, (CRYPT_EAL_EntropyGet)ErrorGetEsEntropy};
1775     CRYPT_EAL_Es *es3 = CRYPT_EAL_EsNew();
1776     ASSERT_TRUE(es3 != NULL);
1777     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1778     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1779     ASSERT_TRUE(CRYPT_EAL_EsInit(es3) == CRYPT_SUCCESS);
1780     if (isCreateNullPool) {
1781         for (int i = 0; i < 13; i++) {
1782             ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1783         }
1784     }
1785     CRYPT_EAL_EsPara esPara3 = {isPhysical, (uint32_t)minEntropy, es3, (CRYPT_EAL_EntropyGet)CRYPT_EAL_EsEntropyGet};
1786     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara1) == CRYPT_SUCCESS);
1787     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara2) == CRYPT_SUCCESS);
1788     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara3) == CRYPT_SUCCESS);
1789     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, (uint32_t)minL, (uint32_t)maxL, (uint32_t)entropyL);
1790     ASSERT_TRUE(ctx != NULL);
1791     ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SUCCESS);
1792 EXIT:
1793     CRYPT_EAL_SeedPoolFree(pool);
1794     EAL_EntropyFreeCtx(ctx);
1795     CRYPT_EAL_EsFree(es1);
1796     CRYPT_EAL_EsFree(es2);
1797     CRYPT_EAL_EsFree(es3);
1798     return;
1799 #else
1800     (void)isCreateNullPool;
1801     (void)isPhysical;
1802     (void)minEntropy;
1803     (void)minL;
1804     (void)maxL;
1805     (void)entropyL;
1806     SKIP_TEST();
1807 #endif
1808 }
1809 /* END_CASE */
1810 
1811 /* @
1812 * @test  HITLS_SDV_DRBG_GM_FUNC_TC051
1813 * @spec  -
1814 * @title  Complete usage testing from entropy sources.
1815 * @precon  nan
1816 * @prior  Level 1
1817 * @auto  TRUE
1818 @ */
1819 /* BEGIN_CASE */
HITLS_SDV_DRBG_GM_FUNC_TC051(int isCreateNullPool,int isPhysical,int minEntropy1,int minEntropy2,int minEntropy3,int minL,int maxL,int entropyL)1820 void HITLS_SDV_DRBG_GM_FUNC_TC051(int isCreateNullPool, int isPhysical, int minEntropy1,
1821     int minEntropy2, int minEntropy3, int minL, int maxL, int entropyL)
1822 {
1823 #ifdef HITLS_CRYPTO_ENTROPY_SYS
1824     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew(isCreateNullPool);
1825     CRYPT_EAL_Es *es1 = CRYPT_EAL_EsNew();
1826     ASSERT_TRUE(es1 != NULL);
1827     char *mode = "sm3_df";
1828     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1829     bool healthTest = true;
1830     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1831     ASSERT_TRUE(CRYPT_EAL_EsInit(es1) == CRYPT_SUCCESS);
1832     if (isCreateNullPool) {
1833         for (int i = 0; i < 1; i++) {
1834             ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1835         }
1836     }
1837     CRYPT_EAL_EsPara esPara1 = {!isPhysical, (uint32_t)minEntropy1, es1, (CRYPT_EAL_EntropyGet)ErrorGetEsEntropy};
1838     CRYPT_EAL_Es *es2 = CRYPT_EAL_EsNew();
1839     ASSERT_TRUE(es2 != NULL);
1840     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1841     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1842     ASSERT_TRUE(CRYPT_EAL_EsInit(es2) == CRYPT_SUCCESS);
1843     if (isCreateNullPool) {
1844         for (int i = 0; i < 2; i++) {
1845             ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1846         }
1847     }
1848     CRYPT_EAL_EsPara esPara2 = {isPhysical, (uint32_t)minEntropy2, es2, (CRYPT_EAL_EntropyGet)ErrorGetEsEntropy};
1849     CRYPT_EAL_Es *es3 = CRYPT_EAL_EsNew();
1850     ASSERT_TRUE(es3 != NULL);
1851     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1852     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1853     ASSERT_TRUE(CRYPT_EAL_EsInit(es3) == CRYPT_SUCCESS);
1854     if (isCreateNullPool) {
1855         for (int i = 0; i < 13; i++) {
1856             ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_GATHER_ENTROPY, NULL, 0) == CRYPT_SUCCESS);
1857         }
1858     }
1859     CRYPT_EAL_EsPara esPara3 = {isPhysical, (uint32_t)minEntropy3, es3, (CRYPT_EAL_EntropyGet)CRYPT_EAL_EsEntropyGet};
1860     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara1) == CRYPT_SUCCESS);
1861     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara2) == CRYPT_SUCCESS);
1862     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara3) == CRYPT_SUCCESS);
1863     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, (uint32_t)minL, (uint32_t)maxL, (uint32_t)entropyL);
1864     ASSERT_TRUE(ctx != NULL);
1865     ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SUCCESS);
1866 EXIT:
1867     CRYPT_EAL_SeedPoolFree(pool);
1868     EAL_EntropyFreeCtx(ctx);
1869     CRYPT_EAL_EsFree(es1);
1870     CRYPT_EAL_EsFree(es2);
1871     CRYPT_EAL_EsFree(es3);
1872     return;
1873 #else
1874     (void)isCreateNullPool;
1875     (void)isPhysical;
1876     (void)minEntropy1;
1877     (void)minEntropy2;
1878     (void)minEntropy3;
1879     (void)minL;
1880     (void)maxL;
1881     (void)entropyL;
1882     SKIP_TEST();
1883 #endif
1884 }
1885 /* END_CASE */
1886 
1887 /* @
1888 * @test  HITLS_SDV_DRBG_GM_FUNC_TC056
1889 * @spec  -
1890 * @title  Complete usage testing from entropy sources.
1891 * @precon  nan
1892 * @prior  Level 1
1893 * @auto  TRUE
1894 @ */
1895 /* BEGIN_CASE */
HITLS_SDV_DRBG_GM_FUNC_TC056(int isCreateNullPool,int isPhysical,int minEntropy1,int minEntropy2,int minEntropy3,int minL,int maxL,int entropyL)1896 void HITLS_SDV_DRBG_GM_FUNC_TC056(int isCreateNullPool, int isPhysical, int minEntropy1,
1897     int minEntropy2, int minEntropy3, int minL, int maxL, int entropyL)
1898 {
1899 #ifdef HITLS_CRYPTO_ENTROPY_SYS
1900     CRYPT_EAL_SeedPoolCtx *pool = CRYPT_EAL_SeedPoolNew(isCreateNullPool);
1901     CRYPT_EAL_Es *es1 = CRYPT_EAL_EsNew();
1902     ASSERT_TRUE(es1 != NULL);
1903     char *mode = "sm3_df";
1904     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1905     bool healthTest = true;
1906     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es1, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1907     ASSERT_TRUE(CRYPT_EAL_EsInit(es1) == CRYPT_SUCCESS);
1908     CRYPT_EAL_EsPara esPara1 = {!isPhysical, (uint32_t)minEntropy1, es1, (CRYPT_EAL_EntropyGet)ErrorGetEsEntropy};
1909     CRYPT_EAL_Es *es2 = CRYPT_EAL_EsNew();
1910     ASSERT_TRUE(es2 != NULL);
1911     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1912     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es2, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1913     ASSERT_TRUE(CRYPT_EAL_EsInit(es2) == CRYPT_SUCCESS);
1914     CRYPT_EAL_EsPara esPara2 = {isPhysical, (uint32_t)minEntropy2, es2, (CRYPT_EAL_EntropyGet)ErrorGetEsEntropy};
1915     CRYPT_EAL_Es *es3 = CRYPT_EAL_EsNew();
1916     ASSERT_TRUE(es3 != NULL);
1917     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_SET_CF, (void *)(intptr_t)mode, strlen(mode)) == CRYPT_SUCCESS);
1918     ASSERT_TRUE(CRYPT_EAL_EsCtrl(es3, CRYPT_ENTROPY_ENABLE_TEST, &healthTest, sizeof(bool)) == CRYPT_SUCCESS);
1919     ASSERT_TRUE(CRYPT_EAL_EsInit(es3) == CRYPT_SUCCESS);
1920     CRYPT_EAL_EsPara esPara3 = {isPhysical, (uint32_t)minEntropy3, es3, (CRYPT_EAL_EntropyGet)ErrorGetEsEntropy};
1921     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara1) == CRYPT_SUCCESS);
1922     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara2) == CRYPT_SUCCESS);
1923     ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, &esPara3) == CRYPT_SUCCESS);
1924     EAL_EntropyCtx *ctx = EAL_EntropyNewCtx(pool, true, (uint32_t)minL, (uint32_t)maxL, (uint32_t)entropyL);
1925     ASSERT_TRUE(ctx != NULL);
1926     if (isCreateNullPool && minL != maxL) {
1927         ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SEED_POOL_NO_ENTROPY_OBTAINED);
1928     } else if (isCreateNullPool) {
1929         ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SEED_POOL_NOT_MEET_REQUIREMENT);
1930     } else {
1931         ASSERT_TRUE(EAL_EntropyCollection(pool, ctx) == CRYPT_SUCCESS);
1932     }
1933 EXIT:
1934     CRYPT_EAL_SeedPoolFree(pool);
1935     EAL_EntropyFreeCtx(ctx);
1936     CRYPT_EAL_EsFree(es1);
1937     CRYPT_EAL_EsFree(es2);
1938     CRYPT_EAL_EsFree(es3);
1939     return;
1940 #else
1941     (void)isCreateNullPool;
1942     (void)isPhysical;
1943     (void)minEntropy1;
1944     (void)minEntropy2;
1945     (void)minEntropy3;
1946     (void)minL;
1947     (void)maxL;
1948     (void)entropyL;
1949     SKIP_TEST();
1950 #endif
1951 }
1952 /* END_CASE */
1953