Merged
Erase sensitive information in cal #804
jchxAdd on Nov 17, 2025
Erase sensitive information in cal #804
Merged
jchxAdd on Nov 17, 2025
Total: 10 files changed+161-5
@@ -164,7 +164,9 @@ int32_t ForsNode(uint32_t idx, uint32_t height, SlhDsaAdrs *adrs, const CryptSlh
164 }164 }
165 ctx->adrsOps.setTreeHeight(adrs, height);165 ctx->adrsOps.setTreeHeight(adrs, height);
166 ctx->adrsOps.setTreeIndex(adrs, idx);166 ctx->adrsOps.setTreeIndex(adrs, idx);
167- return ctx->hashFuncs.f(ctx, adrs, sk, n, node);167+ ret = ctx->hashFuncs.f(ctx, adrs, sk, n, node);
168+ (void)BSL_SAL_CleanseData(sk, SLH_DSA_MAX_N);
169+ return ret;
168 }170 }
169 171 
170 uint8_t dnode[SLH_DSA_MAX_N * 2];172 uint8_t dnode[SLH_DSA_MAX_N * 2];
@@ -32,7 +32,6 @@ static int32_t MsgToBaseW(const CryptSlhDsaCtx *ctx, const uint8_t *msg, uint32_
32 32 
33 BaseB(msg, msgLen, SLH_DSA_LGW, out, len1);33 BaseB(msg, msgLen, SLH_DSA_LGW, out, len1);
34 34 
35- // todo: check if csum overflow
36 uint64_t csum = 0;35 uint64_t csum = 0;
37 for (uint32_t i = 0; i < len1; i++) {36 for (uint32_t i = 0; i < len1; i++) {
38 csum += SLH_DSA_W - 1 - out[i];37 csum += SLH_DSA_W - 1 - out[i];
@@ -140,6 +139,7 @@ int32_t WotsSign(uint8_t *sig, uint32_t *sigLen, const uint8_t *msg, uint32_t ms
140 }139 }
141 ctx->adrsOps.setChainAddr(adrs, i);140 ctx->adrsOps.setChainAddr(adrs, i);
142 ret = WotsChain(sk, n, 0, msgw[i], ctx->prvKey.pub.seed, adrs, ctx, sig + i * n);141 ret = WotsChain(sk, n, 0, msgw[i], ctx->prvKey.pub.seed, adrs, ctx, sig + i * n);
142+ BSL_SAL_CleanseData(sk, SLH_DSA_MAX_N);
143 if (ret != 0) {143 if (ret != 0) {
144 goto ERR;144 goto ERR;
145 }145 }
@@ -542,16 +542,29 @@ EXIT:
542 * 4. Call the CRYPT_EAL_PkeyDupCtx method to dup ed25519 context, expected result 2.542 * 4. Call the CRYPT_EAL_PkeyDupCtx method to dup ed25519 context, expected result 2.
543 * 5. Call the CRYPT_EAL_PkeyGetPub method to obtain the public key from the contexts, expected result 2.543 * 5. Call the CRYPT_EAL_PkeyGetPub method to obtain the public key from the contexts, expected result 2.
544 * 6. Compare public keys, expected result 3.544 * 6. Compare public keys, expected result 3.
545+ * 7. Call the CRYPT_EAL_PkeyComputeShareKey method to compute the shared key from the dupCtx and ctx,
546+ * expected result 7.
545 * @expect547 * @expect
546 * 1. Success, and context is not NULL.548 * 1. Success, and context is not NULL.
547 * 2. CRYPT_SUCCESS549 * 2. CRYPT_SUCCESS
548 * 3. The two public keys are the same.550 * 3. The two public keys are the same.
551+ * 4. CRYPT_SUCCESS
552+ * 5. CRYPT_SUCCESS
553+ * 6. The two public keys are the same.
554+ * 7. The two shared keys are the same.
549 */555 */
550/* BEGIN_CASE */556/* BEGIN_CASE */
551void SDV_CRYPTO_CURVE25519_DUP_CTX_API_TC001(int id)557void SDV_CRYPTO_CURVE25519_DUP_CTX_API_TC001(int id)
552{558{
553 uint8_t key1[CRYPT_CURVE25519_KEYLEN] = {0};559 uint8_t key1[CRYPT_CURVE25519_KEYLEN] = {0};
554 uint8_t key2[CRYPT_CURVE25519_KEYLEN] = {0};560 uint8_t key2[CRYPT_CURVE25519_KEYLEN] = {0};
561+ uint8_t data[CRYPT_CURVE25519_KEYLEN] = {0};
562+ uint8_t sign[CRYPT_CURVE25519_SIGNLEN] = {0};
563+ uint32_t signLen = sizeof(sign);
564+ uint8_t sharedKey1[CRYPT_CURVE25519_KEYLEN] = {0};
565+ uint32_t sharedLen1 = sizeof(sharedKey1);
566+ uint8_t sharedKey2[CRYPT_CURVE25519_KEYLEN] = {0};
567+ uint32_t sharedLen2 = sizeof(sharedKey2);
555 CRYPT_EAL_PkeyPub pub = {0};568 CRYPT_EAL_PkeyPub pub = {0};
556 Set_Curve25519_Pub(&pub, id, key1, CRYPT_CURVE25519_KEYLEN);569 Set_Curve25519_Pub(&pub, id, key1, CRYPT_CURVE25519_KEYLEN);
557 570 
@@ -572,6 +585,17 @@ void SDV_CRYPTO_CURVE25519_DUP_CTX_API_TC001(int id)
572 585 
573 ASSERT_COMPARE("curve25519 copy ctx", key1, CRYPT_CURVE25519_KEYLEN, key2, CRYPT_CURVE25519_KEYLEN);586 ASSERT_COMPARE("curve25519 copy ctx", key1, CRYPT_CURVE25519_KEYLEN, key2, CRYPT_CURVE25519_KEYLEN);
574 587 
588+ if (id == CRYPT_PKEY_ED25519) {
589+ ASSERT_EQ(CRYPT_EAL_PkeySign(newPkey, CRYPT_MD_SHA512, data, sizeof(data), sign, &signLen), CRYPT_SUCCESS);
590+ ASSERT_EQ(CRYPT_EAL_PkeyVerify(newPkey, CRYPT_MD_SHA512, data, sizeof(data), sign, signLen), CRYPT_SUCCESS);
591+ } else if (id == CRYPT_PKEY_X25519) {
592+ ASSERT_EQ(CRYPT_EAL_PkeyComputeShareKey(newPkey, pkey, sharedKey1, &sharedLen1),
593+ CRYPT_SUCCESS);
594+ ASSERT_EQ(CRYPT_EAL_PkeyComputeShareKey(pkey, newPkey, sharedKey2, &sharedLen2),
595+ CRYPT_SUCCESS);
596+ ASSERT_COMPARE("shared key", sharedKey1, CRYPT_CURVE25519_KEYLEN, sharedKey2, CRYPT_CURVE25519_KEYLEN);
597+ }
598+ 
575EXIT:599EXIT:
576 TestRandDeInit();600 TestRandDeInit();
577 CRYPT_EAL_PkeyFreeCtx(pkey);601 CRYPT_EAL_PkeyFreeCtx(pkey);
@@ -1464,6 +1464,8 @@ EXIT:
1464 * 7. Call the CRYPT_EAL_PkeyGetPub method to obtain the public key from the contexts, expected result 7.1464 * 7. Call the CRYPT_EAL_PkeyGetPub method to obtain the public key from the contexts, expected result 7.
1465 * 8. Compare public keys, expected result 8.1465 * 8. Compare public keys, expected result 8.
1466 * 9. Get para id from dupCtx, expected result 9.1466 * 9. Get para id from dupCtx, expected result 9.
1467+ * 10. Call the CRYPT_EAL_PkeyComputeShareKey method to compute the shared key from the dupCtx and ctx,
1468+ * expected result 10.
1467 * @expect1469 * @expect
1468 * 1. Success, and context is not NULL.1470 * 1. Success, and context is not NULL.
1469 * 2-5. CRYPT_SUCCESS1471 * 2-5. CRYPT_SUCCESS
@@ -1471,6 +1473,7 @@ EXIT:
1471 * 7. CRYPT_SUCCESS1473 * 7. CRYPT_SUCCESS
1472 * 8. The two public keys are the same.1474 * 8. The two public keys are the same.
1473 * 9. Para id is CRYPT_DH_RFC7919_8192.1475 * 9. Para id is CRYPT_DH_RFC7919_8192.
1476+ * 10. The two shared keys are the same.
1474 */1477 */
1475/* BEGIN_CASE */1478/* BEGIN_CASE */
1476void SDV_CRYPTO_DH_DUP_CTX_FUNC_TC001(int isProvider)1479void SDV_CRYPTO_DH_DUP_CTX_FUNC_TC001(int isProvider)
@@ -1483,6 +1486,10 @@ void SDV_CRYPTO_DH_DUP_CTX_FUNC_TC001(int isProvider)
1483 CRYPT_EAL_PkeyPub pub = {0};1486 CRYPT_EAL_PkeyPub pub = {0};
1484 CRYPT_EAL_PkeyCtx *ctx = NULL;1487 CRYPT_EAL_PkeyCtx *ctx = NULL;
1485 CRYPT_EAL_PkeyCtx *dupCtx = NULL;1488 CRYPT_EAL_PkeyCtx *dupCtx = NULL;
1489+ uint8_t share1[1030];
1490+ uint8_t share2[1030];
1491+ uint32_t share1Len = sizeof(share1);
1492+ uint32_t share2Len = sizeof(share2);
1486 1493 
1487 TestMemInit();1494 TestMemInit();
1488 1495 
@@ -1516,6 +1523,11 @@ void SDV_CRYPTO_DH_DUP_CTX_FUNC_TC001(int isProvider)
1516 1523 
1517 ASSERT_TRUE(CRYPT_EAL_PkeyGetParaId(dupCtx) == paraId);1524 ASSERT_TRUE(CRYPT_EAL_PkeyGetParaId(dupCtx) == paraId);
1518 1525 
1526+ ASSERT_TRUE(CRYPT_EAL_PkeyComputeShareKey(ctx, dupCtx, share1, &share1Len) == CRYPT_SUCCESS);
1527+ ASSERT_TRUE(CRYPT_EAL_PkeyComputeShareKey(dupCtx, ctx, share2, &share2Len) == CRYPT_SUCCESS);
1528+ ASSERT_TRUE(share1Len == share2Len);
1529+ ASSERT_TRUE(memcmp(share1, share2, share1Len) == 0);
1530+ 
1519EXIT:1531EXIT:
1520 TestRandDeInit();1532 TestRandDeInit();
1521 CRYPT_EAL_PkeyFreeCtx(ctx);1533 CRYPT_EAL_PkeyFreeCtx(ctx);
@@ -613,6 +613,7 @@ EXIT:
613 * 8. Compare public keys, expected result 8.613 * 8. Compare public keys, expected result 8.
614 * 9. Call the CRYPT_EAL_PkeyGetPrv method to obtain the private key from the contexts, expected result 9.614 * 9. Call the CRYPT_EAL_PkeyGetPrv method to obtain the private key from the contexts, expected result 9.
615 * 10. Compare privates keys, expected result 10.615 * 10. Compare privates keys, expected result 10.
616+ * 11. Call the sign/verify method to sign the message with the dupkey, expected result 11.
616 * @expect617 * @expect
617 * 1. Success, and context is not NULL.618 * 1. Success, and context is not NULL.
618 * 2-3. CRYPT_SUCCESS619 * 2-3. CRYPT_SUCCESS
@@ -623,6 +624,7 @@ EXIT:
623 * 8. The two public keys are the same.624 * 8. The two public keys are the same.
624 * 9. CRYPT_SUCCESS625 * 9. CRYPT_SUCCESS
625 * 10. The two private keys are the same.626 * 10. The two private keys are the same.
627+ * 11. CRYPT_SUCCESS
626 */628 */
627/* BEGIN_CASE */629/* BEGIN_CASE */
628void SDV_CRYPTO_DSA_DUP_CTX_FUNC_TC001(Hex *p, Hex *q, Hex *g, int isProvider)630void SDV_CRYPTO_DSA_DUP_CTX_FUNC_TC001(Hex *p, Hex *q, Hex *g, int isProvider)
@@ -635,7 +637,10 @@ void SDV_CRYPTO_DSA_DUP_CTX_FUNC_TC001(Hex *p, Hex *q, Hex *g, int isProvider)
635 CRYPT_EAL_PkeyPrv prv1, prv2;637 CRYPT_EAL_PkeyPrv prv1, prv2;
636 CRYPT_EAL_PkeyCtx *ctx = NULL;638 CRYPT_EAL_PkeyCtx *ctx = NULL;
637 CRYPT_EAL_PkeyCtx *dupCtx = NULL;639 CRYPT_EAL_PkeyCtx *dupCtx = NULL;
638- 640+ uint8_t *sign = NULL;
641+ uint32_t signLen;
642+ char *msg = "Hello, openHiTLS";
643+ uint32_t msgLen = strlen(msg);
639 Set_DSA_Para(&para, NULL, NULL, p, q, g, NULL, NULL);644 Set_DSA_Para(&para, NULL, NULL, p, q, g, NULL, NULL);
640 645 
641 TestMemInit();646 TestMemInit();
@@ -670,13 +675,20 @@ void SDV_CRYPTO_DSA_DUP_CTX_FUNC_TC001(Hex *p, Hex *q, Hex *g, int isProvider)
670 ASSERT_EQ(CRYPT_EAL_PkeyGetPrv(ctx, &prv1), CRYPT_SUCCESS);675 ASSERT_EQ(CRYPT_EAL_PkeyGetPrv(ctx, &prv1), CRYPT_SUCCESS);
671 ASSERT_EQ(CRYPT_EAL_PkeyGetPrv(dupCtx, &prv2), CRYPT_SUCCESS);676 ASSERT_EQ(CRYPT_EAL_PkeyGetPrv(dupCtx, &prv2), CRYPT_SUCCESS);
672 ASSERT_COMPARE("Compare private key", key1, prv1.key.dsaPrv.len, key2, prv2.key.dsaPrv.len);677 ASSERT_COMPARE("Compare private key", key1, prv1.key.dsaPrv.len, key2, prv2.key.dsaPrv.len);
673- 678+ signLen = CRYPT_EAL_PkeyGetSignLen(ctx);
679+ ASSERT_TRUE(signLen > 0);
680+ sign = (uint8_t *)malloc(signLen);
681+ ASSERT_EQ(CRYPT_EAL_PkeySign(dupCtx, CRYPT_MD_SHA256, (uint8_t *)msg, msgLen, sign, &signLen),
682+ CRYPT_SUCCESS);
683+ ASSERT_EQ(CRYPT_EAL_PkeyVerify(dupCtx, CRYPT_MD_SHA256, (uint8_t *)msg, msgLen, sign, signLen),
684+ CRYPT_SUCCESS);
674EXIT:685EXIT:
675 TestRandDeInit();686 TestRandDeInit();
676 CRYPT_EAL_PkeyFreeCtx(ctx);687 CRYPT_EAL_PkeyFreeCtx(ctx);
677 CRYPT_EAL_PkeyFreeCtx(dupCtx);688 CRYPT_EAL_PkeyFreeCtx(dupCtx);
678 BSL_SAL_Free(key1);689 BSL_SAL_Free(key1);
679 BSL_SAL_Free(key2);690 BSL_SAL_Free(key2);
691+ BSL_SAL_Free(sign);
680}692}
681/* END_CASE */693/* END_CASE */
682 694 
@@ -484,6 +484,7 @@ EXIT:
484 * 5. Get the reference count, expected result 5484 * 5. Get the reference count, expected result 5
485 * 6. Compare the pkey ids obtained from pKeyCtx and newCtx, , expected result 6485 * 6. Compare the pkey ids obtained from pKeyCtx and newCtx, , expected result 6
486 * 7. Compare the curve ids obtained from pKeyCtx and newCtx, expected result 7486 * 7. Compare the curve ids obtained from pKeyCtx and newCtx, expected result 7
487+ * 8. Compute the shared key with pKeyCtx and newCtx, expected result 8
487 * @expect488 * @expect
488 * 1. Success, and the context is not NULL.489 * 1. Success, and the context is not NULL.
489 * 2. CRYPT_SUCCESSY490 * 2. CRYPT_SUCCESSY
@@ -491,10 +492,17 @@ EXIT:
491 * 4. Return non-null.492 * 4. Return non-null.
492 * 5. The reference count is 1.493 * 5. The reference count is 1.
493 * 6-7. Both are the same.494 * 6-7. Both are the same.
495+ * 8. The two shared keys are the same.
494 */496 */
495/* BEGIN_CASE */497/* BEGIN_CASE */
496void SDV_CRYPTO_ECDH_DUP_CTX_API_TC001(int paraId, int isProvider)498void SDV_CRYPTO_ECDH_DUP_CTX_API_TC001(int paraId, int isProvider)
497{499{
500+ ASSERT_EQ(TestRandInit(), CRYPT_SUCCESS);
501+ uint8_t shareKey1[1030];
502+ uint32_t shareKeyLen1 = sizeof(shareKey1);
503+ uint8_t shareKey2[1030];
504+ uint32_t shareKeyLen2 = sizeof(shareKey2);
505+ 
498 CRYPT_EAL_PkeyCtx *pKeyCtx = NULL;506 CRYPT_EAL_PkeyCtx *pKeyCtx = NULL;
499 CRYPT_EAL_PkeyCtx *newCtx = NULL;507 CRYPT_EAL_PkeyCtx *newCtx = NULL;
500 508 
@@ -504,15 +512,22 @@ void SDV_CRYPTO_ECDH_DUP_CTX_API_TC001(int paraId, int isProvider)
504 512 
505 ASSERT_TRUE(CRYPT_EAL_PkeyDupCtx(NULL) == NULL);513 ASSERT_TRUE(CRYPT_EAL_PkeyDupCtx(NULL) == NULL);
506 514 
515+ ASSERT_EQ(CRYPT_EAL_PkeyGen(pKeyCtx), CRYPT_SUCCESS);
516+ 
507 newCtx = CRYPT_EAL_PkeyDupCtx(pKeyCtx);517 newCtx = CRYPT_EAL_PkeyDupCtx(pKeyCtx);
508 ASSERT_TRUE(newCtx != NULL);518 ASSERT_TRUE(newCtx != NULL);
509 519 
510 ASSERT_EQ(newCtx->references.count, 1);520 ASSERT_EQ(newCtx->references.count, 1);
511 ASSERT_TRUE(CRYPT_EAL_PkeyGetId(pKeyCtx) == CRYPT_EAL_PkeyGetId(newCtx));521 ASSERT_TRUE(CRYPT_EAL_PkeyGetId(pKeyCtx) == CRYPT_EAL_PkeyGetId(newCtx));
512 ASSERT_TRUE(CRYPT_EAL_PkeyGetParaId(pKeyCtx) == CRYPT_EAL_PkeyGetParaId(newCtx));522 ASSERT_TRUE(CRYPT_EAL_PkeyGetParaId(pKeyCtx) == CRYPT_EAL_PkeyGetParaId(newCtx));
523+ 
524+ ASSERT_EQ(CRYPT_EAL_PkeyComputeShareKey(pKeyCtx, newCtx, shareKey1, &shareKeyLen1), CRYPT_SUCCESS);
525+ ASSERT_EQ(CRYPT_EAL_PkeyComputeShareKey(newCtx, pKeyCtx, shareKey2, &shareKeyLen2), CRYPT_SUCCESS);
526+ ASSERT_COMPARE("shared key", shareKey1, shareKeyLen1, shareKey2, shareKeyLen2);
513EXIT:527EXIT:
514 CRYPT_EAL_PkeyFreeCtx(pKeyCtx);528 CRYPT_EAL_PkeyFreeCtx(pKeyCtx);
515 CRYPT_EAL_PkeyFreeCtx(newCtx);529 CRYPT_EAL_PkeyFreeCtx(newCtx);
530+ TestRandDeInit();
516}531}
517/* END_CASE */532/* END_CASE */
518 533 
@@ -659,6 +659,10 @@ void SDV_CRYPTO_MLDSA_FUNC_PROVIDER_TC001(int type, Hex *testPubKey, Hex *testPr
659 ret = CRYPT_EAL_PkeyCmp(ctx, ctx3);659 ret = CRYPT_EAL_PkeyCmp(ctx, ctx3);
660 ASSERT_EQ(ret, CRYPT_SUCCESS);660 ASSERT_EQ(ret, CRYPT_SUCCESS);
661 661 
662+ ret = CRYPT_EAL_PkeySign(ctx3, CRYPT_MD_SHA256, msg->x, msg->len, out, &outLen);
663+ ASSERT_EQ(ret, CRYPT_SUCCESS);
664+ ret = CRYPT_EAL_PkeyVerify(ctx3, CRYPT_MD_SHA256, msg->x, msg->len, out, outLen);
665+ ASSERT_EQ(ret, CRYPT_SUCCESS);
662EXIT:666EXIT:
663 CRYPT_EAL_PkeyFreeCtx(ctx);667 CRYPT_EAL_PkeyFreeCtx(ctx);
664 CRYPT_EAL_PkeyFreeCtx(ctx2);668 CRYPT_EAL_PkeyFreeCtx(ctx2);
@@ -1079,3 +1079,72 @@ EXIT:
1079 return;1079 return;
1080}1080}
1081/* END_CASE */1081/* END_CASE */
1082+ 
1083+/* @
1084+* @test SDV_CRYPTO_MLKEM_DECAPS_DUP_API_TC001
1085+* @spec -
1086+* @title CRYPT_EAL_PkeyEncaps test
1087+* @precon nan
1088+* @brief 1.register a random number and generate a context and key pair.
1089+* 2.call CRYPT_EAL_PkeyDecaps to transfer various abnormal values.
1090+* 3.duplicate the context and call CRYPT_EAL_PkeyEncaps and CRYPT_EAL_PkeyDecaps to check the returned value.
1091+* @expect 1.success 2.success 3.success
1092+* @prior nan
1093+* @auto FALSE
1094+@ */
1095+/* BEGIN_CASE */
1096+void SDV_CRYPTO_MLKEM_DECAPS_DUP_API_TC001(int bits)
1097+{
1098+ TestMemInit();
1099+ 
1100+ TestRandInit();
1101+ CRYPT_EAL_PkeyCtx *ctx = NULL;
1102+ CRYPT_EAL_PkeyCtx *dupCtx = NULL;
1103+ 
1104+#ifdef HITLS_CRYPTO_PROVIDER
1105+ ctx = CRYPT_EAL_ProviderPkeyNewCtx(NULL, CRYPT_PKEY_ML_KEM, CRYPT_EAL_PKEY_KEM_OPERATE, "provider=default");
1106+#else
1107+ ctx = CRYPT_EAL_PkeyNewCtx(CRYPT_PKEY_ML_KEM);
1108+#endif
1109+ ASSERT_TRUE(ctx != NULL);
1110+ 
1111+ uint32_t val = (uint32_t)bits;
1112+ int32_t ret = CRYPT_EAL_PkeySetParaById(ctx, val);
1113+ ASSERT_EQ(ret, CRYPT_SUCCESS);
1114+ ret = CRYPT_EAL_PkeyDecapsInit(ctx, NULL);
1115+ ASSERT_EQ(ret, CRYPT_SUCCESS);
1116+ 
1117+ uint32_t cipherLen = 0;
1118+ ret = CRYPT_EAL_PkeyCtrl(ctx, CRYPT_CTRL_GET_CIPHERTEXT_LEN, &cipherLen, sizeof(cipherLen));
1119+ ASSERT_EQ(ret, CRYPT_SUCCESS);
1120+ uint8_t *ciphertext = BSL_SAL_Malloc(cipherLen);
1121+ uint32_t sharedLen = 32;
1122+ uint8_t *sharedKey = BSL_SAL_Malloc(sharedLen);
1123+ 
1124+ ret = CRYPT_EAL_PkeyGen(ctx);
1125+ ASSERT_EQ(ret, CRYPT_SUCCESS);
1126+ 
1127+ ret = CRYPT_EAL_PkeyEncaps(ctx, ciphertext, &cipherLen, sharedKey, &sharedLen);
1128+ ASSERT_EQ(ret, CRYPT_SUCCESS);
1129+ 
1130+ ret = CRYPT_EAL_PkeyDecaps(ctx, ciphertext, cipherLen, sharedKey, &sharedLen);
1131+ ASSERT_EQ(ret, CRYPT_SUCCESS);
1132+ 
1133+ dupCtx = CRYPT_EAL_PkeyDupCtx(ctx);
1134+ ASSERT_TRUE(dupCtx != NULL);
1135+ 
1136+ ret = CRYPT_EAL_PkeyEncaps(dupCtx, ciphertext, &cipherLen, sharedKey, &sharedLen);
1137+ ASSERT_EQ(ret, CRYPT_SUCCESS);
1138+ 
1139+ ret = CRYPT_EAL_PkeyDecaps(dupCtx, ciphertext, cipherLen, sharedKey, &sharedLen);
1140+ ASSERT_EQ(ret, CRYPT_SUCCESS);
1141+ 
1142+EXIT:
1143+ CRYPT_EAL_PkeyFreeCtx(ctx);
1144+ CRYPT_EAL_PkeyFreeCtx(dupCtx);
1145+ BSL_SAL_Free(ciphertext);
1146+ BSL_SAL_Free(sharedKey);
1147+ TestRandDeInit();
1148+ return;
1149+}
1150+/* END_CASE */
@@ -857,3 +857,12 @@ SDV_CRYPTO_MLKEM_INVALID_KEY_DECAPS_API_TC001 tcId 149
857SDV_CRYPTO_MLKEM_INVALID_KEY_DECAPS_API_TC001:CRYPT_KEM_TYPE_MLKEM_1024:CRYPT_MLKEM_INVALID_PRVKEY:"B1A0A4F15091D04CC48FE4840F37B49AF0B7ADBCACB2468824B0B09902BEBD24254E271D2E9B9AEE5BBB4805AD0A3259C7FAA24A829D02EC441195432FE496B2398DEF08428B318911A8104777772794452464BC09941742A9A9B8FC7DFBCC3BE1563CC7F93950EA099B7C5E2585C93F6AB26B0B50FBA293256612DA131EAC2680B1B7C7C4A8CA87E2A9865036F9DCA961A59BADE809A90393686B874AF4758B702065B993DA602F5EA02DF3189E57B1CAB99099105134ACD33208487B849B19054575C383279EFA9C2211BD1E76662C5608BA902BB8A490F7D8C841E8509E228DCDF7267F6CABED44BE1823CCBE550014F7BC83F881B27A14FCFAB5AFD3C5FF9C72C0531A530B01EAA944B827A759A9A46F69036FEB56A6591CC929C464A0AFE7C394D380242F779FC0F10A0C89737D877151452189D7A99D508581E4B3F24B5C78E67B67BB07E9C2A887674374D8AE4658423271BE00FB13146197267A6D19600A3A116ACBCC3E2FC43F1E592FAB06CF46B3CF0940430486A3E86589C4D68A13F63F133B74A1B0A9A0C67B0983C8B311774B6B310BC83CAFE807A693AB29A240D8B80ABD7377AAF05755875315A14D12F7C1F8603ADE8809B52413F5E02B15970A515CBB0E15BC244B2712916B483A844BC9A545354F45665A33D85E69218ADB95BCE20711FFA813842717AFA17F41B01BCA56571D0004DAB9B522467CC5E84855AC542D1605AF84CDEF712B55DC875400075EE543015A1CD96B3358C98DC79146CFB17D4D7300F34A195C805B8F1C3DBD591CD4DCB502B7305675B8EEF14A8905A1ED294050A52CF1B55C1690210D27253CF09AD4BB113DB0101EE810C45CB144CA1577612ACC24ACE29B4E0A591B551165CF524A3C7540238C10897B560E7C7FFA2909BCBA96F0FA752F7B3ECF7B0E0E5272B30616274A8A17369092E28608A0665D87895E1350D7F3AF2B269DBEBA5C0A15212C483E5F68998811AE61D49AD223970DE112F4C768E8FA1A38F4BB1C8C0E9E133E1AE8123D38CEAC5383C4EA10DF2B6AA3596C19CCCE4EC231418ACE90B15657207F70780166DB903B39C8A0D51D11B13A9842240E40BDEA70B2E364C4C874309B708628FA86D41A411AA8398CC04CB8C32178F38C7995C47E757402769C4A8194C6DC22BEE794B5781DC00633AEEC28A3D13476494D176B4D96207097476D0EE1B2995A333E9188AB4B914EA094B0303EAE8174752461E87377425A818A309845D5CF8C953AAD1514EDE931F7F394C0D99824AA6C9A530F7F6C4BE2B62C8782C703BAB573B77620B65CA8B7B376212FF1B1020A299649E84ABCEA5834947B7C055BBBCC6332237DE0B886ADB50B057C07C4903081041FBD1B3A1300169E50CF073B8A41C13A05F986E7A5B5FD8B5CD59A47AAD22AE0968A78C9C914F7A8918BC2749C5362371D0D8B5E68915E28A8750A033D3C26B6939BC3C3E2B59D009265A833A8FB58758299DF52A23F8C9041674C6C64AB8A049AC35769DF4BB828224C6A4C3AC5483CE4F8A95957C90C37703FAB1D1E7048E62AB16AA8B0234AC0197351A8400A8C1A87AEE4B2537B5B400AC4EF98240D0620A63724F6BB9856F32AFC152AACEC7480A17DF7AAB9AFF93C6B56227B3072F74B88D00937D8C4BF18C1B7C3914EF1337C06F6C0A4DC6EB788469E6CBF0DD95C90975FBD34534D3999AA22AA5498AEFBF6A31A263C5CE2A925197A2F294425178319A8B28A430A792CC4360440C602936AD55301422540D931C3975B534C048D946B5FD120903BB3C082CFB0E375A1CB204D54A02A1120E46BB221247E2718315FC75DE4823B16474E086029AA4B852CA96D89FC81A619A1A48A47551440F516B3C09054EE085E92FA531D5B341F571D16B1B0A46168F4EC80770388E602A960B8A12E02920F54CE52560DF4356FD58020964AB4DC3942F04415373C7641A7A1E47B5B81A15BC534202083BB1C8245AA186A84133E0A692207F32C63B3A6FA24014B88AFFDC5AB2637525F9B7F0C960A5CC137C3314AECD96ABAA93774B76F9ED98C987C74BF57909127AE9E985AD526AD6E12292086852C2931D828202A0B02F3564E5BD85A478728A96192AF92046C212CD10033816484940B8F9DB790FA518401B0CFDD168D339A044FD37D9C4B37FACA18A80A3E010037D9420200DBA90B1B2E432798DCDCB7A41461DD869413291EDC75193FC968C5A6A24B59AE1051CB11091615891B065B437BF264DD5092682C67BE8A2FEE6A2932E0172D44A4F906633A282576A24C994C61BB2C6256E24C3B6736730BA4996631D973013057411F8419FA635D17BB145907C870B0331EB76DCC6595072A2A69317A03B887316132D2C28F89B32280793280AB874156C8D5946C26267542AA225CB3B09528465947354B876EEFA1CE06582DA725AD1105B3AD2013F9535F053C3672636E97858A5166C70DB3A2CCF57792B99B18FA700C47756B48BDBAEA2A0001A19A9B322B717AB07B051E8A61690961CBB980BC18BC0319C0FE4B7B75349C3DF488CA068F6FF41CE97CAD45835EA6FB27F894CC22C4226870C0F7D9B9133ABE3BE248190688E8F9117A2B20505C90EF8B86AA5C8DDDD6C7C3623E360652C943670D5891CFA03DF3B9ABA489225E6A6E0CEB5777414626824D1DE5368F1971A37779E7199F0BE779B498CA23E14BBCD30BFDC9BDD12932D8F00F96E089B152BA2B1A6EB504115AF2A83206B5D848644F876A07302D6B1098FC9C24AA709507236CD0FC34067219B3E307611000D0F74545E093E210BA8D48642EDB6DE5963973120DC15407A0426FC8D1CAB6B20DC5316F9B145E35F67F781C52ED19AF1AA49B54708964AB569F174E11276A11027C30E5BFE8A60E54277401A848AD31966DABCC5BE99C19CB5D7B538B18C874EEF9B22171230C7771BCBBCEE0818CA46C8D3B6C4504430581828E17C52665C7AFC14A671B9CB222D78DA359AE958781AE346AD481B2F949360FC84736577BD6C9831D981C8E928729965D5ED81E770748C5D9025D550844A42AA452164267C7B32C6BE4F322633A51A655B00AF53A70530E2ED2A795144314902CD77AAFA7E419A17540A6267302798E488B8CCBA8A7EB40806F980B1131882E37CB7A34583B09072798A1140C61B9E53B155C9800A18A901182DCE15626C6B8B753324DA30DEF51B6C4806A9243640960BA80F0C031A99EDBC7603FECC63086255D187756A5ADF6DB5045BB723866541188CD183CAB15558C87CC322A9AC61486A5B0E8296EE21AC11073D873307FF4C443F0365DD513AE6502F2E4758D58BAC2428EE5877AA76614C48B8309919ED07B0DB20099D0AB60B50243E3839C29E16F0B34025BDA400D7C9F9BBCB592574457005325C22BD36A7EEAA0BEF7F542F4319E51A51EB8580B8DA70C4DB535F626193029983FCB91BB057E7F246A8F078FDEFC014EA79D419B5344C99C566B9A2EE91C3566A275703121382E2BD88C3186ADDF677BD0DA7A6DF5BC9324995FC0559763520D090BCF9546D8A21E8120754AE96C9F726919225D50541D973C4DB2E47CC6079451E05ED9911FEA9196B4F22E43B15919104905618171680BF9213BF670B96545BD586B63E5068A85AC87F246706A107966D9A68F0332BFD39AEF0B426A919FAB9104C9554442C0BB2479B318575959AAC66F7C9FE99850242BBC5B523B517AAC0BB1C2601160987A4B962B398E80635CA634A473BD72F7C6B066672A02B1E758C89AE11F802114B2D66E1FF833CEC5992ED4C0109A2D63363FC8270B061986858A13E28288F0D862AB27020800774E5664F7E5BFFC07779200431936723F54540DC135CE4C39A7390664456D7C98701AB11DF00C88DB5CBE4BF920B0D7BC6D007333B88F3A529CAB2166FD634EAAE394B918AFBED31DD84365097BBA04DC78FB9069BE9BA921797226EACD65D321681900DCB8731D557CA4A288287371A8E00DED3643E9A83150E15FAAA27578B24FFC8906BD168C8EB28B9EA4C2F9616C2BF5CD4D9372F9214CAE4488353C0BE99B08439CACB114662DC30C3DD6331E47A8AB9A74696A50AB296BB0C3765CCC4A8D0C9ACDC5490AB3CBC0641CEF551841C017D35AB95FA7C7ECAAC970CC0B90E66B3212C344873899C862A9D15E7B584C47C5A6F02BB2B1FA61724B84E0C2CA2DE59A6CFCA243A5A28E0B3A170A5A38C588BD24CA594255AE53C362873C9FAB975CE7BAA1B9326A363EFC927D935246ABEBCC8792BED5E44F44171CDDB6CE89168107B7BF73589E3D063FD007CE73DCC8DF473F8C57BA4833CBA618C15E9872D374C801C166D883B20BF83542881FDDAA01E9F9CF8BE538ED6181D0E0E74D7681B7714EF66BC10ED600D291FC37FA47B644973AC5E52BE416CDB0B7487678D2F69C0D00845417D0740BA7E803555E19BDB6001B74F56C3456AC65E78550BFFFC30F6EC5035175B6FF08B67107C9F852189550F953"857SDV_CRYPTO_MLKEM_INVALID_KEY_DECAPS_API_TC001:CRYPT_KEM_TYPE_MLKEM_1024:CRYPT_MLKEM_INVALID_PRVKEY:"B1A0A4F15091D04CC48FE4840F37B49AF0B7ADBCACB2468824B0B09902BEBD24254E271D2E9B9AEE5BBB4805AD0A3259C7FAA24A829D02EC441195432FE496B2398DEF08428B318911A8104777772794452464BC09941742A9A9B8FC7DFBCC3BE1563CC7F93950EA099B7C5E2585C93F6AB26B0B50FBA293256612DA131EAC2680B1B7C7C4A8CA87E2A9865036F9DCA961A59BADE809A90393686B874AF4758B702065B993DA602F5EA02DF3189E57B1CAB99099105134ACD33208487B849B19054575C383279EFA9C2211BD1E76662C5608BA902BB8A490F7D8C841E8509E228DCDF7267F6CABED44BE1823CCBE550014F7BC83F881B27A14FCFAB5AFD3C5FF9C72C0531A530B01EAA944B827A759A9A46F69036FEB56A6591CC929C464A0AFE7C394D380242F779FC0F10A0C89737D877151452189D7A99D508581E4B3F24B5C78E67B67BB07E9C2A887674374D8AE4658423271BE00FB13146197267A6D19600A3A116ACBCC3E2FC43F1E592FAB06CF46B3CF0940430486A3E86589C4D68A13F63F133B74A1B0A9A0C67B0983C8B311774B6B310BC83CAFE807A693AB29A240D8B80ABD7377AAF05755875315A14D12F7C1F8603ADE8809B52413F5E02B15970A515CBB0E15BC244B2712916B483A844BC9A545354F45665A33D85E69218ADB95BCE20711FFA813842717AFA17F41B01BCA56571D0004DAB9B522467CC5E84855AC542D1605AF84CDEF712B55DC875400075EE543015A1CD96B3358C98DC79146CFB17D4D7300F34A195C805B8F1C3DBD591CD4DCB502B7305675B8EEF14A8905A1ED294050A52CF1B55C1690210D27253CF09AD4BB113DB0101EE810C45CB144CA1577612ACC24ACE29B4E0A591B551165CF524A3C7540238C10897B560E7C7FFA2909BCBA96F0FA752F7B3ECF7B0E0E5272B30616274A8A17369092E28608A0665D87895E1350D7F3AF2B269DBEBA5C0A15212C483E5F68998811AE61D49AD223970DE112F4C768E8FA1A38F4BB1C8C0E9E133E1AE8123D38CEAC5383C4EA10DF2B6AA3596C19CCCE4EC231418ACE90B15657207F70780166DB903B39C8A0D51D11B13A9842240E40BDEA70B2E364C4C874309B708628FA86D41A411AA8398CC04CB8C32178F38C7995C47E757402769C4A8194C6DC22BEE794B5781DC00633AEEC28A3D13476494D176B4D96207097476D0EE1B2995A333E9188AB4B914EA094B0303EAE8174752461E87377425A818A309845D5CF8C953AAD1514EDE931F7F394C0D99824AA6C9A530F7F6C4BE2B62C8782C703BAB573B77620B65CA8B7B376212FF1B1020A299649E84ABCEA5834947B7C055BBBCC6332237DE0B886ADB50B057C07C4903081041FBD1B3A1300169E50CF073B8A41C13A05F986E7A5B5FD8B5CD59A47AAD22AE0968A78C9C914F7A8918BC2749C5362371D0D8B5E68915E28A8750A033D3C26B6939BC3C3E2B59D009265A833A8FB58758299DF52A23F8C9041674C6C64AB8A049AC35769DF4BB828224C6A4C3AC5483CE4F8A95957C90C37703FAB1D1E7048E62AB16AA8B0234AC0197351A8400A8C1A87AEE4B2537B5B400AC4EF98240D0620A63724F6BB9856F32AFC152AACEC7480A17DF7AAB9AFF93C6B56227B3072F74B88D00937D8C4BF18C1B7C3914EF1337C06F6C0A4DC6EB788469E6CBF0DD95C90975FBD34534D3999AA22AA5498AEFBF6A31A263C5CE2A925197A2F294425178319A8B28A430A792CC4360440C602936AD55301422540D931C3975B534C048D946B5FD120903BB3C082CFB0E375A1CB204D54A02A1120E46BB221247E2718315FC75DE4823B16474E086029AA4B852CA96D89FC81A619A1A48A47551440F516B3C09054EE085E92FA531D5B341F571D16B1B0A46168F4EC80770388E602A960B8A12E02920F54CE52560DF4356FD58020964AB4DC3942F04415373C7641A7A1E47B5B81A15BC534202083BB1C8245AA186A84133E0A692207F32C63B3A6FA24014B88AFFDC5AB2637525F9B7F0C960A5CC137C3314AECD96ABAA93774B76F9ED98C987C74BF57909127AE9E985AD526AD6E12292086852C2931D828202A0B02F3564E5BD85A478728A96192AF92046C212CD10033816484940B8F9DB790FA518401B0CFDD168D339A044FD37D9C4B37FACA18A80A3E010037D9420200DBA90B1B2E432798DCDCB7A41461DD869413291EDC75193FC968C5A6A24B59AE1051CB11091615891B065B437BF264DD5092682C67BE8A2FEE6A2932E0172D44A4F906633A282576A24C994C61BB2C6256E24C3B6736730BA4996631D973013057411F8419FA635D17BB145907C870B0331EB76DCC6595072A2A69317A03B887316132D2C28F89B32280793280AB874156C8D5946C26267542AA225CB3B09528465947354B876EEFA1CE06582DA725AD1105B3AD2013F9535F053C3672636E97858A5166C70DB3A2CCF57792B99B18FA700C47756B48BDBAEA2A0001A19A9B322B717AB07B051E8A61690961CBB980BC18BC0319C0FE4B7B75349C3DF488CA068F6FF41CE97CAD45835EA6FB27F894CC22C4226870C0F7D9B9133ABE3BE248190688E8F9117A2B20505C90EF8B86AA5C8DDDD6C7C3623E360652C943670D5891CFA03DF3B9ABA489225E6A6E0CEB5777414626824D1DE5368F1971A37779E7199F0BE779B498CA23E14BBCD30BFDC9BDD12932D8F00F96E089B152BA2B1A6EB504115AF2A83206B5D848644F876A07302D6B1098FC9C24AA709507236CD0FC34067219B3E307611000D0F74545E093E210BA8D48642EDB6DE5963973120DC15407A0426FC8D1CAB6B20DC5316F9B145E35F67F781C52ED19AF1AA49B54708964AB569F174E11276A11027C30E5BFE8A60E54277401A848AD31966DABCC5BE99C19CB5D7B538B18C874EEF9B22171230C7771BCBBCEE0818CA46C8D3B6C4504430581828E17C52665C7AFC14A671B9CB222D78DA359AE958781AE346AD481B2F949360FC84736577BD6C9831D981C8E928729965D5ED81E770748C5D9025D550844A42AA452164267C7B32C6BE4F322633A51A655B00AF53A70530E2ED2A795144314902CD77AAFA7E419A17540A6267302798E488B8CCBA8A7EB40806F980B1131882E37CB7A34583B09072798A1140C61B9E53B155C9800A18A901182DCE15626C6B8B753324DA30DEF51B6C4806A9243640960BA80F0C031A99EDBC7603FECC63086255D187756A5ADF6DB5045BB723866541188CD183CAB15558C87CC322A9AC61486A5B0E8296EE21AC11073D873307FF4C443F0365DD513AE6502F2E4758D58BAC2428EE5877AA76614C48B8309919ED07B0DB20099D0AB60B50243E3839C29E16F0B34025BDA400D7C9F9BBCB592574457005325C22BD36A7EEAA0BEF7F542F4319E51A51EB8580B8DA70C4DB535F626193029983FCB91BB057E7F246A8F078FDEFC014EA79D419B5344C99C566B9A2EE91C3566A275703121382E2BD88C3186ADDF677BD0DA7A6DF5BC9324995FC0559763520D090BCF9546D8A21E8120754AE96C9F726919225D50541D973C4DB2E47CC6079451E05ED9911FEA9196B4F22E43B15919104905618171680BF9213BF670B96545BD586B63E5068A85AC87F246706A107966D9A68F0332BFD39AEF0B426A919FAB9104C9554442C0BB2479B318575959AAC66F7C9FE99850242BBC5B523B517AAC0BB1C2601160987A4B962B398E80635CA634A473BD72F7C6B066672A02B1E758C89AE11F802114B2D66E1FF833CEC5992ED4C0109A2D63363FC8270B061986858A13E28288F0D862AB27020800774E5664F7E5BFFC07779200431936723F54540DC135CE4C39A7390664456D7C98701AB11DF00C88DB5CBE4BF920B0D7BC6D007333B88F3A529CAB2166FD634EAAE394B918AFBED31DD84365097BBA04DC78FB9069BE9BA921797226EACD65D321681900DCB8731D557CA4A288287371A8E00DED3643E9A83150E15FAAA27578B24FFC8906BD168C8EB28B9EA4C2F9616C2BF5CD4D9372F9214CAE4488353C0BE99B08439CACB114662DC30C3DD6331E47A8AB9A74696A50AB296BB0C3765CCC4A8D0C9ACDC5490AB3CBC0641CEF551841C017D35AB95FA7C7ECAAC970CC0B90E66B3212C344873899C862A9D15E7B584C47C5A6F02BB2B1FA61724B84E0C2CA2DE59A6CFCA243A5A28E0B3A170A5A38C588BD24CA594255AE53C362873C9FAB975CE7BAA1B9326A363EFC927D935246ABEBCC8792BED5E44F44171CDDB6CE89168107B7BF73589E3D063FD007CE73DCC8DF473F8C57BA4833CBA618C15E9872D374C801C166D883B20BF83542881FDDAA01E9F9CF8BE538ED6181D0E0E74D7681B7714EF66BC10ED600D291FC37FA47B644973AC5E52BE416CDB0B7487678D2F69C0D00845417D0740BA7E803555E19BDB6001B74F56C3456AC65E78550BFFFC30F6EC5035175B6FF08B67107C9F852189550F953"
858SDV_CRYPTO_MLKEM_INVALID_KEY_DECAPS_API_TC001 tcId 154858SDV_CRYPTO_MLKEM_INVALID_KEY_DECAPS_API_TC001 tcId 154
859SDV_CRYPTO_MLKEM_INVALID_KEY_DECAPS_API_TC001:CRYPT_KEM_TYPE_MLKEM_1024:CRYPT_MLKEM_INVALID_PRVKEY:"A6F730473935DAE39954B8C0D90C7F7AFB36F92A12C6C723E605C8203BAF53270D0DF2A25F0AC75A292AFD0C637893372ED15F53B9173524687744C8DF288A0CD07B2ADAA50D595698032665D8227ED63AB4B44288D282C1FB4F47955C9D987B37913F23836593187C37B43F5FDB65BE736C4167749F3951A3E9A502179384078447FB3D19C55541D91B97857E696A0DF3E4BED4E6A900389744F492B72B0D3CD2B4B195049B824CE934425FB0899066ABC199A8CA98A6FEF85311A45B92DA1A26069082A6AE59321599807828081B3E37B87935ADB6564A830BC20CE63E02030D19DC9F8A385418E4759A4A6CC3E8A79F39C6D1564DE4E9332D5809254B73BBF052698AB29C794D3C7C3562940B1756CC5BF792B8E5837D921B5F50B52DD37F6B156FBD67BBFD21448E479F44719A4DECAE0B658A691819D1E8A70DE269511A2277264E3880C0ED20C38452B2AE860EA21B969D7344C9A365514965607890B7A5A41AC123A84BB819B7B5DB140D276890E67AA49F1679B6B0218E53C543985C6C5B715856C0D0D3670AB9BEA8A789EA83429E5034AD9451E0A28F86C8901A788CB7D6684704346A44B44B5B0E82546506114A6C1326F4231097B8A59C791F17CC1B0117586423C45B212AEF7BCEBBB091CFDA1CCE2C7C56F4C93198CC397B4D44F460ADD771202C0BA5F85EBCA261EC6807979320DD1AAEBC58641126435B0B5DBC626D487A1CD7D58051FC0534368EF40876B0B99F5724748FE28D17B41EE75900D3C2AAC5AB237EF5BDC4A477F019856ABA8EE40C7919C3A064A76B63A64430D2A65CB3117457A02135A6D8B1B888485E20F676CA87613D08C64E3874BB1652F8474D93C16B11A06A0BB18B6FBC80DD12328833AC4CEC2AD9999ED42B96DC39C679806F2234C4FE583AF5A43F744405AE8241A46CC9A0B1A156D0143BC0585965734EDAC3D745AEA8D87D73B8C0E97574C02872A5164548FA5030C9730E1C217C84300B4C11A616C62A15752165200B196A5C59C3CE610406C540B1EA1F31310428086D0DAA0DC09A2833AB309C38B22203559DC13279A34B8A5A7C338479969B33CCDA608EE77DDE5123CB949031693D9DF25A5450861C27165487346F10902C866D941B3DEAC90ED9511EBD7673AA28BA1E523FB3355D0647CA4607620F391A7FE50649EC9460CB1E5FA731A28B8606FA9EA9D7213A5461A6B693FA763C5805CECB3AAC80C40BCCBBA2E671580553579F070BF91531D41A3191D1476F392FDC653323359AFACC16410954984B692126231297B4D2778EDD2670E2578FAB287BE5A5C503D9779564A9ADD0277B26610251B69F625293B3546486A5BB23A8CB3326C4979A3C526B1B0588EB9411E7862CAEC4C0C8C55F97889EF40761B5957657183B433200EEE8009408160F0C89E1A04F03F800375674B50A7ECA087583C572F066B6C333B7BBF945F0DBBDD5C1CCE435ACD1493F586CC22A16A7423B5B1BCBBE060C644CF33CBB93922083B573804B55C86EC7F88863AB441A00BC04A52FD99B4DBB937D9E80847168735A83688513A31D25B051B7090CCB79DB39B86BFC4ED7CB5F91E149C2361BE204C432F66CA4B732D3336EB43B34C1F8943C6BA5E409C1D3E08A17AA7AA7485948F38E2B743026B10DF7598B67A95A832B01DF22B8C2132D922359BEC56B3848CD70604C602C93DAFA2AAF2A882574727FAC08927B589D4A5A03F312671B7BFE87640132C6856541CEAB87821720FC963EA336735331A0CFA2114774B866900594422E24B83628E838D909586D16A1F9AA55F14260B1749D3EC966E40447AE1610ABCC8463EC9E63C69E434214C89AC75EBC16AC493C5E0AAC58A7A713B86BA96CCC3757725C9C0AF8A7027E6A1E70613650019656A0473590629CFB857AD561163280DA107B945C2AF7335A17D65A193A4859E6A5B44C2E13A45F20CCAE1BF5B76CF2AF0EE32EF13932D50B81DC6BB5B951C57D27C0D48A18118B0453DC766EA9C3FE8CCF82D92404BA03E53C1ECCB4AB2FB34660C29B68E7812B52AE701C75AD4A117B5C4922C8CEDCD33B42732C1DD1A5A5F78C7FEC9779B73B3DC922DE974D04C4661DDAA7F00136514874D5158D71F84FBFA10CD495595CF482E8874A7CCC6F1914691DB5B05A85C6A9C77284E15CA9E91F42511852719AB1182F484066F526798C59081F2A81B0B63937FA5258A389885B905EB1252837656F578E90128CCC6314720B6E52280912946BC18C0FE2E4A07074A2373A2E115470B143AA60A9A34F4B6D717879458C532ED1790DF9CC19605A2E186B5DC3602EF2CC5EAC9B1362951041BD7B003EF46B258352BB7556A135A5071116C11B73C46B4A280C39A29A78BE3349940D9C3608A2A0565A3448B65581A826A9388C00C34F0136763E409FE2A2A3A768C3C795AD7C852AEB65055CA77120AC0FE8514669FA627D24C2A977726015C8CA001F4291CB35A1C4CEB24A449419F8E4159124585BABA37868C42D85428294AEFC309C01E1AE07E688C19B0EC2568784D2308FA2A5AA36AD653A82F4A88C2F7361A5E9390E4B147CE780E958976529603640BED2338C0BD776A18331F5D06A9E5A2C5B971FCA2010A7040018891A73565AD911A93E275BB5724A4EE24C20AA2A9FE191C5C41CDC5C02F5D8134EA5B2A501AA6A708CD125A0B8129F4F1617607812A1E113ABB77CAB197F0CF368FFBCC5A860B19E6725C9D147AB1561DE1A27EDE91D33D36F7E099AF945ADC7CC2B59021090AC84CEDC3B77F93F6051AE15ACA0FFA48666B767B72C7168E658A8664AECCB34E66B4ACF0B2D84D9BFF84A9425E59F21A4163DC54AAE907BD77A36665B5CA5279B9C352FCD804ED886BFE49C090BD16A7D147C9E7120F347BD716A4E909CC4EF8946D5188D13A58B6CC487872281C6016C5D070020B277234A03E567C0E72255D2785B45AC4795C7175D129EC9D1AF1B56848EBC243F04165DC60CE6825673278AA6D9095F7C1E1C566DF02381F031461AA826D0B3BC059BAD358CA8D4F876C24C82B7F4754DFB0D35F7A5BA4A7179D535C05991AB7CB3BF7B93BB2AA699B2C4A2570A29537C60662BAE128079AC91AF3AB7D8297D3F1499ECD0B5B6906647889313736E5EF5263FF9C5B7B4ADC62C93D6C17181D24BC0DAB26FE5A5A117C66110024D1A56DEA244DEF8080AD8A9D2E0B0EC9A7B5662A43CF00FFEF9567A7BCC49021487E547B71B591849381EC7297323200E906ADBF2540DC3538AFBAFC35CC89B0301C20332D1091C86528C2BD10ABB55A2623605E981650985B89562C85DEA1B1BA784BAA56EB742426D67A08E196FEA2AAADE87C5B52B0AA58A79CCB4AF4AD849B98CB3F9FB2F3A9B3E7DB85663550078BA6F36A850162A0ECFE6845BB58D7079698F070C7DB0686DFACF0D721E01238BF8095E57F1A0E99023A8173C97DAA871D03BC3F085EA49B2F4A462D1133594F903BD8B1E4541760C5914DB159D778877E891336A295810A871B529A2D79AAF28C33C6BB70F633A4EC1B67C70A2C60F034D8A7C73AFD182A523BFEC267327C71F1868111793B129E17F481753AA0587AC435C476895B1721F2B9815A7509126C143A4FC91BE743148B038536879586B8372646F29AC295BDA470A511EAD8AA360A2934C128A23274246B72B77D30A063CCBFF24300D1595B12093ED8973AEE27EEBFA7EFD49823380C797AB41081603A996400AC73AF4C4691AF0888414C543BC2673034C674198C1A74B32D46A3BC75DDF86385AB16166B623B2B984F51392C0C91D1C403319191D8332945EA76AA7710BACA277B5B4302CD0114C3BAA490024B0A990B15B1442304C882CB1B49B6A17B502884385C7DA2741016C184656EB141378666A5EB72ED485231EB816A2372FC0221511F4557282923403A3B546ADB460768D0012B0A30E07FC3E1B233E3D527DF13A856C4C5ABAA0CF7F3405EB76CC873A94268958CA861128360C423022CB605972332D0366CBEA721B648B2B4259B9F7C81B4396197A228638D622C321A1E99B5FA641427D01639DAB7EAEA41EB0E8A2405BC3C51225A66269C1C50814499E2F85A698319B5040442F762A878137DBD7C2D32A02AAB036C87906FB048173BC2323459292A2230247657F74A5788596AB6890906ACBA09230273A2C61682DC39B55F902C26C8553F42B6D01741DC48203949A9D71B49FBC366B47C37328455404C669CA163B6DF31CCCD82DEF1CBBC7319C89F6CE8FF6522D6883E3632F0127A9499C31E1C05D8A06298530612B0ACD0804B6E72C67577689788829E9C331F56937525096669A961DCA549F00A9FE40C4D480B56DB17131FFABAFD1DD0635942836FC2F0D95C9DC102FB89E6BEAB3E5473A16B43D6F2DA98D3A4F0000B39C34943AF8DC741BFB7B46DD7F2BD36809A452321C70E78B22772D139A27731B256C2E92F7D49A52488CDE4B4CC1B3A6EBB8686B5EEEB6D4BE"859SDV_CRYPTO_MLKEM_INVALID_KEY_DECAPS_API_TC001:CRYPT_KEM_TYPE_MLKEM_1024:CRYPT_MLKEM_INVALID_PRVKEY:"A6F730473935DAE39954B8C0D90C7F7AFB36F92A12C6C723E605C8203BAF53270D0DF2A25F0AC75A292AFD0C637893372ED15F53B9173524687744C8DF288A0CD07B2ADAA50D595698032665D8227ED63AB4B44288D282C1FB4F47955C9D987B37913F23836593187C37B43F5FDB65BE736C4167749F3951A3E9A502179384078447FB3D19C55541D91B97857E696A0DF3E4BED4E6A900389744F492B72B0D3CD2B4B195049B824CE934425FB0899066ABC199A8CA98A6FEF85311A45B92DA1A26069082A6AE59321599807828081B3E37B87935ADB6564A830BC20CE63E02030D19DC9F8A385418E4759A4A6CC3E8A79F39C6D1564DE4E9332D5809254B73BBF052698AB29C794D3C7C3562940B1756CC5BF792B8E5837D921B5F50B52DD37F6B156FBD67BBFD21448E479F44719A4DECAE0B658A691819D1E8A70DE269511A2277264E3880C0ED20C38452B2AE860EA21B969D7344C9A365514965607890B7A5A41AC123A84BB819B7B5DB140D276890E67AA49F1679B6B0218E53C543985C6C5B715856C0D0D3670AB9BEA8A789EA83429E5034AD9451E0A28F86C8901A788CB7D6684704346A44B44B5B0E82546506114A6C1326F4231097B8A59C791F17CC1B0117586423C45B212AEF7BCEBBB091CFDA1CCE2C7C56F4C93198CC397B4D44F460ADD771202C0BA5F85EBCA261EC6807979320DD1AAEBC58641126435B0B5DBC626D487A1CD7D58051FC0534368EF40876B0B99F5724748FE28D17B41EE75900D3C2AAC5AB237EF5BDC4A477F019856ABA8EE40C7919C3A064A76B63A64430D2A65CB3117457A02135A6D8B1B888485E20F676CA87613D08C64E3874BB1652F8474D93C16B11A06A0BB18B6FBC80DD12328833AC4CEC2AD9999ED42B96DC39C679806F2234C4FE583AF5A43F744405AE8241A46CC9A0B1A156D0143BC0585965734EDAC3D745AEA8D87D73B8C0E97574C02872A5164548FA5030C9730E1C217C84300B4C11A616C62A15752165200B196A5C59C3CE610406C540B1EA1F31310428086D0DAA0DC09A2833AB309C38B22203559DC13279A34B8A5A7C338479969B33CCDA608EE77DDE5123CB949031693D9DF25A5450861C27165487346F10902C866D941B3DEAC90ED9511EBD7673AA28BA1E523FB3355D0647CA4607620F391A7FE50649EC9460CB1E5FA731A28B8606FA9EA9D7213A5461A6B693FA763C5805CECB3AAC80C40BCCBBA2E671580553579F070BF91531D41A3191D1476F392FDC653323359AFACC16410954984B692126231297B4D2778EDD2670E2578FAB287BE5A5C503D9779564A9ADD0277B26610251B69F625293B3546486A5BB23A8CB3326C4979A3C526B1B0588EB9411E7862CAEC4C0C8C55F97889EF40761B5957657183B433200EEE8009408160F0C89E1A04F03F800375674B50A7ECA087583C572F066B6C333B7BBF945F0DBBDD5C1CCE435ACD1493F586CC22A16A7423B5B1BCBBE060C644CF33CBB93922083B573804B55C86EC7F88863AB441A00BC04A52FD99B4DBB937D9E80847168735A83688513A31D25B051B7090CCB79DB39B86BFC4ED7CB5F91E149C2361BE204C432F66CA4B732D3336EB43B34C1F8943C6BA5E409C1D3E08A17AA7AA7485948F38E2B743026B10DF7598B67A95A832B01DF22B8C2132D922359BEC56B3848CD70604C602C93DAFA2AAF2A882574727FAC08927B589D4A5A03F312671B7BFE87640132C6856541CEAB87821720FC963EA336735331A0CFA2114774B866900594422E24B83628E838D909586D16A1F9AA55F14260B1749D3EC966E40447AE1610ABCC8463EC9E63C69E434214C89AC75EBC16AC493C5E0AAC58A7A713B86BA96CCC3757725C9C0AF8A7027E6A1E70613650019656A0473590629CFB857AD561163280DA107B945C2AF7335A17D65A193A4859E6A5B44C2E13A45F20CCAE1BF5B76CF2AF0EE32EF13932D50B81DC6BB5B951C57D27C0D48A18118B0453DC766EA9C3FE8CCF82D92404BA03E53C1ECCB4AB2FB34660C29B68E7812B52AE701C75AD4A117B5C4922C8CEDCD33B42732C1DD1A5A5F78C7FEC9779B73B3DC922DE974D04C4661DDAA7F00136514874D5158D71F84FBFA10CD495595CF482E8874A7CCC6F1914691DB5B05A85C6A9C77284E15CA9E91F42511852719AB1182F484066F526798C59081F2A81B0B63937FA5258A389885B905EB1252837656F578E90128CCC6314720B6E52280912946BC18C0FE2E4A07074A2373A2E115470B143AA60A9A34F4B6D717879458C532ED1790DF9CC19605A2E186B5DC3602EF2CC5EAC9B1362951041BD7B003EF46B258352BB7556A135A5071116C11B73C46B4A280C39A29A78BE3349940D9C3608A2A0565A3448B65581A826A9388C00C34F0136763E409FE2A2A3A768C3C795AD7C852AEB65055CA77120AC0FE8514669FA627D24C2A977726015C8CA001F4291CB35A1C4CEB24A449419F8E4159124585BABA37868C42D85428294AEFC309C01E1AE07E688C19B0EC2568784D2308FA2A5AA36AD653A82F4A88C2F7361A5E9390E4B147CE780E958976529603640BED2338C0BD776A18331F5D06A9E5A2C5B971FCA2010A7040018891A73565AD911A93E275BB5724A4EE24C20AA2A9FE191C5C41CDC5C02F5D8134EA5B2A501AA6A708CD125A0B8129F4F1617607812A1E113ABB77CAB197F0CF368FFBCC5A860B19E6725C9D147AB1561DE1A27EDE91D33D36F7E099AF945ADC7CC2B59021090AC84CEDC3B77F93F6051AE15ACA0FFA48666B767B72C7168E658A8664AECCB34E66B4ACF0B2D84D9BFF84A9425E59F21A4163DC54AAE907BD77A36665B5CA5279B9C352FCD804ED886BFE49C090BD16A7D147C9E7120F347BD716A4E909CC4EF8946D5188D13A58B6CC487872281C6016C5D070020B277234A03E567C0E72255D2785B45AC4795C7175D129EC9D1AF1B56848EBC243F04165DC60CE6825673278AA6D9095F7C1E1C566DF02381F031461AA826D0B3BC059BAD358CA8D4F876C24C82B7F4754DFB0D35F7A5BA4A7179D535C05991AB7CB3BF7B93BB2AA699B2C4A2570A29537C60662BAE128079AC91AF3AB7D8297D3F1499ECD0B5B6906647889313736E5EF5263FF9C5B7B4ADC62C93D6C17181D24BC0DAB26FE5A5A117C66110024D1A56DEA244DEF8080AD8A9D2E0B0EC9A7B5662A43CF00FFEF9567A7BCC49021487E547B71B591849381EC7297323200E906ADBF2540DC3538AFBAFC35CC89B0301C20332D1091C86528C2BD10ABB55A2623605E981650985B89562C85DEA1B1BA784BAA56EB742426D67A08E196FEA2AAADE87C5B52B0AA58A79CCB4AF4AD849B98CB3F9FB2F3A9B3E7DB85663550078BA6F36A850162A0ECFE6845BB58D7079698F070C7DB0686DFACF0D721E01238BF8095E57F1A0E99023A8173C97DAA871D03BC3F085EA49B2F4A462D1133594F903BD8B1E4541760C5914DB159D778877E891336A295810A871B529A2D79AAF28C33C6BB70F633A4EC1B67C70A2C60F034D8A7C73AFD182A523BFEC267327C71F1868111793B129E17F481753AA0587AC435C476895B1721F2B9815A7509126C143A4FC91BE743148B038536879586B8372646F29AC295BDA470A511EAD8AA360A2934C128A23274246B72B77D30A063CCBFF24300D1595B12093ED8973AEE27EEBFA7EFD49823380C797AB41081603A996400AC73AF4C4691AF0888414C543BC2673034C674198C1A74B32D46A3BC75DDF86385AB16166B623B2B984F51392C0C91D1C403319191D8332945EA76AA7710BACA277B5B4302CD0114C3BAA490024B0A990B15B1442304C882CB1B49B6A17B502884385C7DA2741016C184656EB141378666A5EB72ED485231EB816A2372FC0221511F4557282923403A3B546ADB460768D0012B0A30E07FC3E1B233E3D527DF13A856C4C5ABAA0CF7F3405EB76CC873A94268958CA861128360C423022CB605972332D0366CBEA721B648B2B4259B9F7C81B4396197A228638D622C321A1E99B5FA641427D01639DAB7EAEA41EB0E8A2405BC3C51225A66269C1C50814499E2F85A698319B5040442F762A878137DBD7C2D32A02AAB036C87906FB048173BC2323459292A2230247657F74A5788596AB6890906ACBA09230273A2C61682DC39B55F902C26C8553F42B6D01741DC48203949A9D71B49FBC366B47C37328455404C669CA163B6DF31CCCD82DEF1CBBC7319C89F6CE8FF6522D6883E3632F0127A9499C31E1C05D8A06298530612B0ACD0804B6E72C67577689788829E9C331F56937525096669A961DCA549F00A9FE40C4D480B56DB17131FFABAFD1DD0635942836FC2F0D95C9DC102FB89E6BEAB3E5473A16B43D6F2DA98D3A4F0000B39C34943AF8DC741BFB7B46DD7F2BD36809A452321C70E78B22772D139A27731B256C2E92F7D49A52488CDE4B4CC1B3A6EBB8686B5EEEB6D4BE"
860+ 
861+SDV_CRYPTO_MLKEM_DECAPS_DUP_API_TC001 ML-KEM 512
862+SDV_CRYPTO_MLKEM_DECAPS_DUP_API_TC001:CRYPT_KEM_TYPE_MLKEM_512
863+ 
864+SDV_CRYPTO_MLKEM_DECAPS_DUP_API_TC001 ML-KEM 768
865+SDV_CRYPTO_MLKEM_DECAPS_DUP_API_TC001:CRYPT_KEM_TYPE_MLKEM_768
866+ 
867+SDV_CRYPTO_MLKEM_DECAPS_DUP_API_TC001 ML-KEM 1024
868+SDV_CRYPTO_MLKEM_DECAPS_DUP_API_TC001:CRYPT_KEM_TYPE_MLKEM_1024
@@ -1164,10 +1164,14 @@ void SDV_CRYPTO_RSA_DUP_CTX_API_TC001(Hex *e, int bits, int isProvider)
1164 CRYPT_EAL_PkeyCtx *newPkey = NULL;1164 CRYPT_EAL_PkeyCtx *newPkey = NULL;
1165 CRYPT_EAL_PkeyCtx *pkey = NULL;1165 CRYPT_EAL_PkeyCtx *pkey = NULL;
1166 SetRsaPara(&para, e->x, e->len, bits);1166 SetRsaPara(&para, e->x, e->len, bits);
1167- 1167+ uint8_t *sign = BSL_SAL_Malloc(bits / 8);
1168+ uint32_t signLen = bits / 8;
1169+ char *data = "Hello, openHiTLS";
1170+ uint32_t dataLen = strlen(data);
1168 TestMemInit();1171 TestMemInit();
1169 CRYPT_RandRegist(RandFunc);1172 CRYPT_RandRegist(RandFunc);
1170 CRYPT_RandRegistEx(RandFuncEx);1173 CRYPT_RandRegistEx(RandFuncEx);
1174+ int32_t pkcsv15 = CRYPT_MD_SHA224;
1171 1175 
1172 pkey = TestPkeyNewCtx(NULL, CRYPT_PKEY_RSA, CRYPT_EAL_PKEY_KEYMGMT_OPERATE, "provider=default", isProvider);1176 pkey = TestPkeyNewCtx(NULL, CRYPT_PKEY_RSA, CRYPT_EAL_PKEY_KEYMGMT_OPERATE, "provider=default", isProvider);
1173 ASSERT_TRUE(pkey != NULL);1177 ASSERT_TRUE(pkey != NULL);
@@ -1196,7 +1200,12 @@ void SDV_CRYPTO_RSA_DUP_CTX_API_TC001(Hex *e, int bits, int isProvider)
1196 rsaCtx2->prvKey->d->data,1200 rsaCtx2->prvKey->d->data,
1197 rsaCtx2->prvKey->d->size * sizeof(BN_UINT));1201 rsaCtx2->prvKey->d->size * sizeof(BN_UINT));
1198 1202 
1203+ ASSERT_EQ(CRYPT_EAL_PkeyCtrl(newPkey, CRYPT_CTRL_SET_RSA_EMSA_PKCSV15, &pkcsv15, sizeof(pkcsv15)), CRYPT_SUCCESS);
1204+ ASSERT_EQ(CRYPT_EAL_PkeySign(newPkey, CRYPT_MD_SHA224, (uint8_t *)data, dataLen, sign, &signLen), CRYPT_SUCCESS);
1205+ ASSERT_EQ(CRYPT_EAL_PkeyVerify(newPkey, CRYPT_MD_SHA224, (uint8_t *)data, dataLen, sign, signLen), CRYPT_SUCCESS);
1206+
1199EXIT:1207EXIT:
1208+ BSL_SAL_FREE(sign);
1200 CRYPT_EAL_PkeyFreeCtx(pkey);1209 CRYPT_EAL_PkeyFreeCtx(pkey);
1201 CRYPT_EAL_PkeyFreeCtx(newPkey);1210 CRYPT_EAL_PkeyFreeCtx(newPkey);
1202 TestRandDeInit();1211 TestRandDeInit();