@@ -2959,7 +2959,7 @@ int test_wc_dilithium_der(void)
29592959 idx = 0;
29602960#ifdef WOLFSSL_DILITHIUM_FIPS204_DRAFT
29612961 ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der, &idx, key, privDerLen),
2962- WC_NO_ERR_TRACE(BAD_FUNC_ARG ));
2962+ WC_NO_ERR_TRACE(ASN_PARSE_E ));
29632963#else
29642964 ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der, &idx, key, privDerLen),
29652965 WC_NO_ERR_TRACE(ASN_PARSE_E));
@@ -16658,3 +16658,130 @@ int test_wc_dilithium_verify_kats(void)
1665816658 return EXPECT_RESULT();
1665916659}
1666016660
16661+ int test_mldsa_pkcs8(void)
16662+ {
16663+ EXPECT_DECLS;
16664+ #if !defined(NO_ASN) && defined(HAVE_PKCS8) && \
16665+ defined(HAVE_DILITHIUM) && !defined(NO_TLS) && \
16666+ (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
16667+
16668+ WOLFSSL_CTX* ctx = NULL;
16669+ size_t i;
16670+ const int derMaxSz = DILITHIUM_MAX_BOTH_KEY_DER_SIZE;
16671+ const int tempMaxSz = DILITHIUM_MAX_BOTH_KEY_PEM_SIZE;
16672+ byte* der = NULL;
16673+ byte* temp = NULL; /* Store PEM or intermediate key */
16674+ word32 derSz = 0;
16675+ word32 pemSz = 0;
16676+ word32 keySz = 0;
16677+ dilithium_key mldsa_key;
16678+ WC_RNG rng;
16679+ word32 size;
16680+
16681+ struct {
16682+ int wcId;
16683+ int oidSum;
16684+ int keySz;
16685+ } test_variant[] = {
16686+ {WC_ML_DSA_44, ML_DSA_LEVEL2k, ML_DSA_LEVEL2_PRV_KEY_SIZE},
16687+ {WC_ML_DSA_65, ML_DSA_LEVEL3k, ML_DSA_LEVEL3_PRV_KEY_SIZE},
16688+ {WC_ML_DSA_87, ML_DSA_LEVEL5k, ML_DSA_LEVEL5_PRV_KEY_SIZE}
16689+ };
16690+
16691+ (void) pemSz;
16692+
16693+ ExpectNotNull(der = (byte*) XMALLOC(derMaxSz, NULL,
16694+ DYNAMIC_TYPE_TMP_BUFFER));
16695+ ExpectNotNull(temp = (byte*) XMALLOC(tempMaxSz, NULL,
16696+ DYNAMIC_TYPE_TMP_BUFFER));
16697+
16698+ #ifndef NO_WOLFSSL_SERVER
16699+ ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()));
16700+ #else
16701+ ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()));
16702+ #endif /* NO_WOLFSSL_SERVER */
16703+
16704+ ExpectIntEQ(wc_InitRng(&rng), 0);
16705+ ExpectIntEQ(wc_dilithium_init(&mldsa_key), 0);
16706+
16707+ /* Test private + public key (separated format) */
16708+ for (i = 0; i < sizeof(test_variant) / sizeof(test_variant[0]); ++i) {
16709+ ExpectIntEQ(wc_dilithium_set_level(&mldsa_key,
16710+ test_variant[i].wcId), 0);
16711+ ExpectIntEQ(wc_dilithium_make_key(&mldsa_key, &rng), 0);
16712+
16713+ ExpectIntGT(derSz = wc_Dilithium_KeyToDer(&mldsa_key, der, derMaxSz),
16714+ 0);
16715+ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz,
16716+ WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS);
16717+
16718+ #ifdef WOLFSSL_DER_TO_PEM
16719+ ExpectIntGT(pemSz = wc_DerToPem(der, derSz, temp, tempMaxSz,
16720+ PKCS8_PRIVATEKEY_TYPE), 0);
16721+ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, temp, pemSz,
16722+ WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS);
16723+ #endif /* WOLFSSL_DER_TO_PEM */
16724+ }
16725+
16726+ /* Test private key only */
16727+ for (i = 0; i < sizeof(test_variant) / sizeof(test_variant[0]); ++i) {
16728+ ExpectIntEQ(wc_dilithium_set_level(&mldsa_key, test_variant[i].wcId),
16729+ 0);
16730+ ExpectIntEQ(wc_dilithium_make_key(&mldsa_key, &rng), 0);
16731+
16732+ ExpectIntGT(derSz = wc_Dilithium_PrivateKeyToDer(&mldsa_key, der,
16733+ derMaxSz), 0);
16734+ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz,
16735+ WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS);
16736+
16737+ #ifdef WOLFSSL_DER_TO_PEM
16738+ ExpectIntGT(pemSz = wc_DerToPem(der, derSz, temp, tempMaxSz,
16739+ PKCS8_PRIVATEKEY_TYPE), 0);
16740+ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, temp, pemSz,
16741+ WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS);
16742+ #endif /* WOLFSSL_DER_TO_PEM */
16743+ }
16744+
16745+ /* Test private + public key (integrated format) */
16746+ for (i = 0; i < sizeof(test_variant) / sizeof(test_variant[0]); ++i) {
16747+ ExpectIntEQ(wc_dilithium_set_level(&mldsa_key, test_variant[i].wcId),
16748+ 0);
16749+ ExpectIntEQ(wc_dilithium_make_key(&mldsa_key, &rng), 0);
16750+
16751+ keySz = 0;
16752+ temp[0] = 0x04; /* ASN.1 OCTET STRING */
16753+ temp[1] = 0x82; /* 2 bytes length field */
16754+ temp[2] = (test_variant[i].keySz >> 8) & 0xff; /* MSB of the length */
16755+ temp[3] = test_variant[i].keySz & 0xff; /* LSB of the length */
16756+ keySz += 4;
16757+ size = tempMaxSz - keySz;
16758+ ExpectIntEQ(wc_dilithium_export_private(&mldsa_key, temp + keySz,
16759+ &size), 0);
16760+ keySz += size;
16761+ size = tempMaxSz - keySz;
16762+ ExpectIntEQ(wc_dilithium_export_public(&mldsa_key, temp + keySz, &size),
16763+ 0);
16764+ keySz += size;
16765+ derSz = derMaxSz;
16766+ ExpectIntGT(wc_CreatePKCS8Key(der, &derSz, temp, keySz,
16767+ test_variant[i].oidSum, NULL, 0), 0);
16768+ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz,
16769+ WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS);
16770+
16771+ #ifdef WOLFSSL_DER_TO_PEM
16772+ ExpectIntGT(pemSz = wc_DerToPem(der, derSz, temp, tempMaxSz,
16773+ PKCS8_PRIVATEKEY_TYPE), 0);
16774+ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, temp, pemSz,
16775+ WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS);
16776+ #endif /* WOLFSSL_DER_TO_PEM */
16777+ }
16778+
16779+ wc_dilithium_free(&mldsa_key);
16780+ ExpectIntEQ(wc_FreeRng(&rng), 0);
16781+ wolfSSL_CTX_free(ctx);
16782+ XFREE(temp, NULL, DYNAMIC_TYPE_TMP_BUFFER);
16783+ XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
16784+
16785+ #endif
16786+ return EXPECT_RESULT();
16787+ }
0 commit comments