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 *)¶, 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, ¶1) == CRYPT_SUCCESS);
284 ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, ¶2) == 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 *)¶, 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 *)¶, 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 *)¶, 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, ¶1) == CRYPT_SUCCESS);
1105 ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, ¶2) == 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, ¶1) == CRYPT_SUCCESS);
1149 ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, ¶2) == 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, ¶1) == CRYPT_SUCCESS);
1218 ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, ¶2) == 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 *)¶, 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, ¶1) == CRYPT_SUCCESS);
1292 ASSERT_TRUE(CRYPT_EAL_SeedPoolAddEs(pool, ¶2) == 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, ¶1) == 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 *)¶, 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, ¶1) == 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