@@ -13933,6 +13933,119 @@ static int test_wolfSSL_PKCS8_ED448(void)
1393313933 return EXPECT_RESULT();
1393413934}
1393513935
13936+ static int test_wolfSSL_PKCS8_MLDSA(void)
13937+ {
13938+ EXPECT_DECLS;
13939+ #if !defined(NO_ASN) && defined(HAVE_PKCS8) && \
13940+ defined(HAVE_DILITHIUM) && !defined(NO_TLS) && \
13941+ (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
13942+
13943+ WOLFSSL_CTX* ctx = NULL;
13944+ size_t i;
13945+ const int derMaxSz = 8192; /* Largest size will be 7520 of separated format, WC_ML_DSA_87, DER */
13946+ const int tempMaxSz = 10240; /* Largest size will be 10239 of separated format, WC_MLS_DSA_87, PEM */
13947+ byte* der = NULL;
13948+ byte* temp = NULL; /* Store PEM or intermediate key */
13949+ word32 derSz = 0;
13950+ word32 pemSz = 0;
13951+ word32 keySz = 0;
13952+ dilithium_key mldsa_key;
13953+ WC_RNG rng;
13954+ word32 size;
13955+
13956+ struct {
13957+ int wcId;
13958+ int oidSum;
13959+ int keySz;
13960+ } test_variant[] = {{WC_ML_DSA_44, ML_DSA_LEVEL2k, ML_DSA_LEVEL2_PRV_KEY_SIZE},
13961+ {WC_ML_DSA_65, ML_DSA_LEVEL3k, ML_DSA_LEVEL3_PRV_KEY_SIZE},
13962+ {WC_ML_DSA_87, ML_DSA_LEVEL5k, ML_DSA_LEVEL5_PRV_KEY_SIZE}};
13963+
13964+ (void) pemSz;
13965+
13966+ ExpectNotNull(der = (byte*) XMALLOC(derMaxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER));
13967+ ExpectNotNull(temp = (byte*) XMALLOC(tempMaxSz, NULL, DYNAMIC_TYPE_TMP_BUFFER));
13968+
13969+ #ifndef NO_WOLFSSL_SERVER
13970+ ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()));
13971+ #else
13972+ ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()));
13973+ #endif /* NO_WOLFSSL_SERVER */
13974+
13975+ ExpectIntEQ(wc_InitRng(&rng), 0);
13976+ ExpectIntEQ(wc_dilithium_init(&mldsa_key), 0);
13977+
13978+ /* Test private + public key (separated format) */
13979+ for(i = 0; i < sizeof(test_variant) / sizeof(test_variant[0]); ++i) {
13980+ ExpectIntEQ(wc_dilithium_set_level(&mldsa_key, test_variant[i].wcId), 0);
13981+ ExpectIntEQ(wc_dilithium_make_key(&mldsa_key, &rng), 0);
13982+
13983+ ExpectIntGT(derSz = wc_Dilithium_KeyToDer(&mldsa_key, der, derMaxSz), 0);
13984+ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz,
13985+ WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS);
13986+
13987+ #ifdef WOLFSSL_DER_TO_PEM
13988+ ExpectIntGT(pemSz = wc_DerToPem(der, derSz, temp, tempMaxSz, PKCS8_PRIVATEKEY_TYPE), 0);
13989+ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, temp, pemSz,
13990+ WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS);
13991+ #endif /* WOLFSSL_DER_TO_PEM */
13992+ }
13993+
13994+ /* Test private key only */
13995+ for(i = 0; i < sizeof(test_variant) / sizeof(test_variant[0]); ++i) {
13996+ ExpectIntEQ(wc_dilithium_set_level(&mldsa_key, test_variant[i].wcId), 0);
13997+ ExpectIntEQ(wc_dilithium_make_key(&mldsa_key, &rng), 0);
13998+
13999+ ExpectIntGT(derSz = wc_Dilithium_PrivateKeyToDer(&mldsa_key, der, derMaxSz), 0);
14000+ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz,
14001+ WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS);
14002+
14003+ #ifdef WOLFSSL_DER_TO_PEM
14004+ ExpectIntGT(pemSz = wc_DerToPem(der, derSz, temp, tempMaxSz, PKCS8_PRIVATEKEY_TYPE), 0);
14005+ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, temp, pemSz,
14006+ WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS);
14007+ #endif /* WOLFSSL_DER_TO_PEM */
14008+ }
14009+
14010+ /* Test private + public key (integrated format) */
14011+ for(i = 0; i < sizeof(test_variant) / sizeof(test_variant[0]); ++i) {
14012+ ExpectIntEQ(wc_dilithium_set_level(&mldsa_key, test_variant[i].wcId), 0);
14013+ ExpectIntEQ(wc_dilithium_make_key(&mldsa_key, &rng), 0);
14014+
14015+ keySz = 0;
14016+ temp[0] = 0x04; /* ASN.1 OCTET STRING */
14017+ temp[1] = 0x82; /* 2 bytes length field */
14018+ temp[2] = (test_variant[i].keySz >> 8) & 0xff; /* MSB of the length */
14019+ temp[3] = test_variant[i].keySz & 0xff; /* LSB of the length */
14020+ keySz += 4;
14021+ size = tempMaxSz - keySz;
14022+ ExpectIntEQ(wc_dilithium_export_private(&mldsa_key, temp + keySz, &size), 0);
14023+ keySz += size;
14024+ size = tempMaxSz - keySz;
14025+ ExpectIntEQ(wc_dilithium_export_public(&mldsa_key, temp + keySz, &size), 0);
14026+ keySz += size;
14027+ derSz = derMaxSz;
14028+ ExpectIntGT(wc_CreatePKCS8Key(der, &derSz, temp, keySz, test_variant[i].oidSum, NULL, 0), 0);
14029+ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz,
14030+ WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS);
14031+
14032+ #ifdef WOLFSSL_DER_TO_PEM
14033+ ExpectIntGT(pemSz = wc_DerToPem(der, derSz, temp, tempMaxSz, PKCS8_PRIVATEKEY_TYPE), 0);
14034+ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, temp, pemSz,
14035+ WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS);
14036+ #endif /* WOLFSSL_DER_TO_PEM */
14037+ }
14038+
14039+ wc_dilithium_free(&mldsa_key);
14040+ ExpectIntEQ(wc_FreeRng(&rng), 0);
14041+ wolfSSL_CTX_free(ctx);
14042+ XFREE(temp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
14043+ XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
14044+
14045+ #endif
14046+ return EXPECT_RESULT();
14047+ }
14048+
1393614049/* Testing functions dealing with PKCS5 */
1393714050static int test_wolfSSL_PKCS5(void)
1393814051{
@@ -67519,6 +67632,7 @@ TEST_CASE testCases[] = {
6751967632 TEST_DECL(test_wolfSSL_PKCS8),
6752067633 TEST_DECL(test_wolfSSL_PKCS8_ED25519),
6752167634 TEST_DECL(test_wolfSSL_PKCS8_ED448),
67635+ TEST_DECL(test_wolfSSL_PKCS8_MLDSA),
6752267636
6752367637#ifdef HAVE_IO_TESTS_DEPENDENCIES
6752467638 TEST_DECL(test_wolfSSL_get_finished),
0 commit comments