From a82d1a6b12f4e40e07c95a11f559e380cd05ffc1 Mon Sep 17 00:00:00 2001 From: Koji Takeda Date: Mon, 14 Jul 2025 10:35:31 +0900 Subject: [PATCH 1/4] Support importing seed of ML-DSA key --- tests/api/test_mldsa.c | 253 ++++++++++++++++++++++++++++++++------ tests/api/test_mldsa.h | 32 ++--- wolfcrypt/src/asn.c | 134 ++++++++++++-------- wolfcrypt/src/dilithium.c | 112 ++++++++--------- wolfssl/wolfcrypt/asn.h | 10 +- 5 files changed, 376 insertions(+), 165 deletions(-) diff --git a/tests/api/test_mldsa.c b/tests/api/test_mldsa.c index 873a085c9..132b797c9 100644 --- a/tests/api/test_mldsa.c +++ b/tests/api/test_mldsa.c @@ -16658,7 +16658,219 @@ int test_wc_dilithium_verify_kats(void) return EXPECT_RESULT(); } -int test_mldsa_pkcs8(void) +#if !defined(NO_ASN) && defined(HAVE_PKCS8) && \ + defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + !defined(WOLFSSL_DILITHIUM_NO_ASN1) && defined(WOLFSSL_ASN_TEMPLATE) +static struct { + const char* fileName; + byte level; + /* 0: Unsupported, 1: Supported*/ + int p8_lv; /* Support PKCS8 format with specifying level */ + int p8_nolv; /* Support PKCS8 format without specifying level */ + int trad_lv; /* Support traditional format with specifying level */ + int trad_nolv; /* Support traditional format without specifying level */ +} ossl_form[] = { + /* + * Generated test files with the following commands: + * openssl genpkey -outform DER -algorithm ${ALGO} \ + * -provparam ml-dsa.output_formats=${OUT_FORM} -out ${OUT_FILE} + */ + + /* ALGO=ML-DSA-44, OUT_FORM=seed-only, OUT_FILE=mldsa44_seed-only.der */ + {"certs/mldsa/mldsa44_seed-only.der", WC_ML_DSA_44, 1, 1, 1, 0}, + /* ALGO=ML-DSA-44, OUT_FORM=priv-only, OUT_FILE=mldsa44_priv-only.der */ + {"certs/mldsa/mldsa44_priv-only.der", WC_ML_DSA_44, 1, 1, 1, 0}, + /* ALGO=ML-DSA-44, OUT_FORM=seed-priv, OUT_FILE=mldsa44_seed-priv.der */ + {"certs/mldsa/mldsa44_seed-priv.der", WC_ML_DSA_44, 1, 1, 1, 0}, + /* ALGO=ML-DSA-44, OUT_FORM=oqskeypair, OUT_FILE=mldsa44_oqskeypair.der */ + {"certs/mldsa/mldsa44_oqskeypair.der", WC_ML_DSA_44, 1, 1, 1, 0}, + /* ALGO=ML-DSA-44, OUT_FORM=bare-seed, OUT_FILE=mldsa44_bare-seed.der */ + {"certs/mldsa/mldsa44_bare-seed.der", WC_ML_DSA_44, 0, 0, 0, 0}, + /* ALGO=ML-DSA-44, OUT_FORM=bare-priv, OUT_FILE=mldsa44_bare-priv.der */ + {"certs/mldsa/mldsa44_bare-priv.der", WC_ML_DSA_44, 0, 0, 0, 0}, + /* ALGO=ML-DSA-65, OUT_FORM=seed-only, OUT_FILE=mldsa65_seed-only.der */ + {"certs/mldsa/mldsa65_seed-only.der", WC_ML_DSA_65, 1, 1, 1, 0}, + /* ALGO=ML-DSA-65, OUT_FORM=priv-only, OUT_FILE=mldsa65_priv-only.der */ + {"certs/mldsa/mldsa65_priv-only.der", WC_ML_DSA_65, 1, 1, 1, 0}, + /* ALGO=ML-DSA-65, OUT_FORM=seed-priv, OUT_FILE=mldsa65_seed-priv.der */ + {"certs/mldsa/mldsa65_seed-priv.der", WC_ML_DSA_65, 1, 1, 1, 0}, + /* ALGO=ML-DSA-65, OUT_FORM=oqskeypair, OUT_FILE=mldsa65_oqskeypair.der */ + {"certs/mldsa/mldsa65_oqskeypair.der", WC_ML_DSA_65, 1, 1, 1, 0}, + /* ALGO=ML-DSA-65, OUT_FORM=bare-seed, OUT_FILE=mldsa65_bare-seed.der */ + {"certs/mldsa/mldsa65_bare-seed.der", WC_ML_DSA_65, 0, 0, 0, 0}, + /* ALGO=ML-DSA-65, OUT_FORM=bare-priv, OUT_FILE=mldsa65_bare-priv.der */ + {"certs/mldsa/mldsa65_bare-priv.der", WC_ML_DSA_65, 0, 0, 0, 0}, + /* ALGO=ML-DSA-87, OUT_FORM=seed-only, OUT_FILE=mldsa87_seed-only.der */ + {"certs/mldsa/mldsa87_seed-only.der", WC_ML_DSA_87, 1, 1, 1, 0}, + /* ALGO=ML-DSA-87, OUT_FORM=priv-only, OUT_FILE=mldsa87_priv-only.der */ + {"certs/mldsa/mldsa87_priv-only.der", WC_ML_DSA_87, 1, 1, 1, 0}, + /* ALGO=ML-DSA-87, OUT_FORM=seed-priv, OUT_FILE=mldsa87_seed-priv.der */ + {"certs/mldsa/mldsa87_seed-priv.der", WC_ML_DSA_87, 1, 1, 1, 0}, + /* ALGO=ML-DSA-87, OUT_FORM=oqskeypair, OUT_FILE=mldsa87_oqskeypair.der */ + {"certs/mldsa/mldsa87_oqskeypair.der", WC_ML_DSA_87, 1, 1, 1, 0}, + /* ALGO=ML-DSA-87, OUT_FORM=bare-seed, OUT_FILE=mldsa87_bare-seed.der */ + {"certs/mldsa/mldsa87_bare-seed.der", WC_ML_DSA_87, 0, 0, 0, 0}, + /* ALGO=ML-DSA-87, OUT_FORM=bare-priv, OUT_FILE=mldsa87_bare-priv.der */ + {"certs/mldsa/mldsa87_bare-priv.der", WC_ML_DSA_87, 0, 0, 0, 0} +}; +#endif + +int test_wc_Dilithium_PrivateKeyDecode_OpenSSL_form(void) +{ + EXPECT_DECLS; + +#if !defined(NO_ASN) && defined(HAVE_PKCS8) && \ + defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + !defined(WOLFSSL_DILITHIUM_NO_ASN1) && defined(WOLFSSL_ASN_TEMPLATE) + + byte* der = NULL; + size_t derMaxSz = ML_DSA_LEVEL5_BOTH_KEY_DER_SIZE; + size_t derSz = 0; + FILE* fp = NULL; + word32 inOutIdx = 0; + word32 inOutIdx2 = 0; + dilithium_key key; + int expect = 0; + int pkeySz = 0; + byte level = 0; + + ExpectNotNull(der = (byte*) XMALLOC(derMaxSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + + for (size_t i = 0; i < sizeof(ossl_form) / sizeof(ossl_form[0]); ++i) { + ExpectNotNull(fp = XFOPEN(ossl_form[i].fileName, "rb")); + ExpectIntGT(derSz = XFREAD(der, 1, derMaxSz, fp), 0); + ExpectIntEQ(XFCLOSE(fp), 0); + + /* Specify a level with PKCS8 format */ + XMEMSET(&key, 0, sizeof(key)); + ExpectIntEQ(wc_dilithium_init(&key), 0); + ExpectIntEQ(wc_dilithium_set_level(&key, ossl_form[i].level), 0); + inOutIdx = 0; + expect = ossl_form[i].p8_lv ? 0 : ASN_PARSE_E; + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der, &inOutIdx, &key, + (word32)derSz), expect); + if (expect == 0) { + ExpectIntEQ(wc_dilithium_get_level(&key, &level), 0); + ExpectIntEQ(level, ossl_form[i].level); + } + wc_dilithium_free(&key); + + /* Not specify a level with PKCS8 format */ + XMEMSET(&key, 0, sizeof(key)); + ExpectIntEQ(wc_dilithium_init(&key), 0); + inOutIdx = 0; + expect = ossl_form[i].p8_nolv ? 0 : ASN_PARSE_E; + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der, &inOutIdx, &key, + (word32)derSz), expect); + if (expect == 0) { + ExpectIntEQ(wc_dilithium_get_level(&key, &level), 0); + ExpectIntEQ(level, ossl_form[i].level); + } + wc_dilithium_free(&key); + + /* Specify a level with traditional format */ + XMEMSET(&key, 0, sizeof(key)); + ExpectIntEQ(wc_dilithium_init(&key), 0); + ExpectIntEQ(wc_dilithium_set_level(&key, ossl_form[i].level), 0); + inOutIdx = 0; + expect = ossl_form[i].trad_lv ? 0 : ASN_PARSE_E; + ExpectIntGT(pkeySz = wc_GetPkcs8TraditionalOffset(der, &inOutIdx, + (word32)derSz), 0); + inOutIdx2 = 0; + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der + inOutIdx, &inOutIdx2, + &key, (word32)pkeySz), expect); + if (expect == 0) { + ExpectIntEQ(wc_dilithium_get_level(&key, &level), 0); + ExpectIntEQ(level, ossl_form[i].level); + } + wc_dilithium_free(&key); + + /* Not specify a level with traditional format */ + XMEMSET(&key, 0, sizeof(key)); + ExpectIntEQ(wc_dilithium_init(&key), 0); + inOutIdx = 0; + expect = ossl_form[i].trad_nolv ? 0 : ASN_PARSE_E; + ExpectIntGT(pkeySz = wc_GetPkcs8TraditionalOffset(der, &inOutIdx, + (word32)derSz), 0); + inOutIdx2 = 0; + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der + inOutIdx, &inOutIdx2, + &key, (word32)pkeySz), expect); + if (expect == 0) { + ExpectIntEQ(wc_dilithium_get_level(&key, &level), 0); + ExpectIntEQ(level, ossl_form[i].level); + } + wc_dilithium_free(&key); + } + + XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +int test_mldsa_pkcs8_import_OpenSSL_form(void) +{ + EXPECT_DECLS; +#if !defined(NO_ASN) && defined(HAVE_PKCS8) && \ + defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + !defined(WOLFSSL_DILITHIUM_NO_ASN1) && defined(WOLFSSL_ASN_TEMPLATE) && \ + !defined(NO_TLS) && \ + (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) + + byte* der = NULL; + size_t derMaxSz = ML_DSA_LEVEL5_BOTH_KEY_DER_SIZE; + size_t derSz = 0; + WOLFSSL_CTX* ctx = NULL; + FILE* fp = NULL; +#ifdef WOLFSSL_DER_TO_PEM + byte* pem = NULL; + size_t pemMaxSz = ML_DSA_LEVEL5_BOTH_KEY_PEM_SIZE; + size_t pemSz = 0; +#endif /* WOLFSSL_DER_TO_PEM */ + int expect = 0; + + ExpectNotNull(der = (byte*) XMALLOC(derMaxSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); +#ifdef WOLFSSL_DER_TO_PEM + ExpectNotNull(pem = (byte*) XMALLOC(pemMaxSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); +#endif /* WOLFSSL_DER_TO_PEM */ + +#ifndef NO_WOLFSSL_SERVER + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); +#else + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); +#endif /* NO_WOLFSSL_SERVER */ + + for (size_t i = 0; i < sizeof(ossl_form) / sizeof(ossl_form[0]); ++i) { + ExpectNotNull(fp = XFOPEN(ossl_form[i].fileName, "rb")); + ExpectIntGT(derSz = XFREAD(der, 1, derMaxSz, fp), 0); + ExpectIntEQ(XFCLOSE(fp), 0); + + /* DER */ + expect = ossl_form[i].p8_nolv ? WOLFSSL_SUCCESS : WOLFSSL_BAD_FILE; + ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, + WOLFSSL_FILETYPE_ASN1), expect); + +#ifdef WOLFSSL_DER_TO_PEM + /* PEM */ + ExpectIntGT(pemSz = wc_DerToPem(der, (word32)derSz, pem, + (word32)pemMaxSz, PKCS8_PRIVATEKEY_TYPE), 0); + expect = ossl_form[i].p8_nolv ? WOLFSSL_SUCCESS : ASN_PARSE_E; + ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, pem, pemSz, + WOLFSSL_FILETYPE_PEM), expect); +#endif /* WOLFSSL_DER_TO_PEM */ + } + + XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#ifdef WOLFSSL_DER_TO_PEM + XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif /* WOLFSSL_DER_TO_PEM */ +#endif + return EXPECT_RESULT(); +} + +int test_mldsa_pkcs8_export_import_wolfSSL_form(void) { EXPECT_DECLS; #if !defined(NO_ASN) && defined(HAVE_PKCS8) && \ @@ -16676,10 +16888,8 @@ int test_mldsa_pkcs8(void) byte* temp = NULL; /* Store PEM or intermediate key */ word32 derSz = 0; word32 pemSz = 0; - word32 keySz = 0; dilithium_key mldsa_key; WC_RNG rng; - word32 size; int ret; struct { @@ -16746,43 +16956,6 @@ int test_mldsa_pkcs8(void) ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); -#ifdef WOLFSSL_DER_TO_PEM - ExpectIntGT(pemSz = wc_DerToPem(der, derSz, temp, tempMaxSz, - PKCS8_PRIVATEKEY_TYPE), 0); - ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, temp, pemSz, - WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); -#endif /* WOLFSSL_DER_TO_PEM */ - } - - /* Test private + public key (integrated format) */ - for (i = 0; i < sizeof(test_variant) / sizeof(test_variant[0]); ++i) { - ExpectIntEQ(wc_dilithium_set_level(&mldsa_key, test_variant[i].wcId), - 0); - ExpectIntEQ(wc_dilithium_make_key(&mldsa_key, &rng), 0); - - if (EXPECT_FAIL()) - break; - - keySz = 0; - temp[0] = 0x04; /* ASN.1 OCTET STRING */ - temp[1] = 0x82; /* 2 bytes length field */ - temp[2] = (test_variant[i].keySz >> 8) & 0xff; /* MSB of the length */ - temp[3] = test_variant[i].keySz & 0xff; /* LSB of the length */ - keySz += 4; - size = tempMaxSz - keySz; - ExpectIntEQ(wc_dilithium_export_private(&mldsa_key, temp + keySz, - &size), 0); - keySz += size; - size = tempMaxSz - keySz; - ExpectIntEQ(wc_dilithium_export_public(&mldsa_key, temp + keySz, &size), - 0); - keySz += size; - derSz = derMaxSz; - ExpectIntGT(wc_CreatePKCS8Key(der, &derSz, temp, keySz, - test_variant[i].oidSum, NULL, 0), 0); - ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, - WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); - #ifdef WOLFSSL_DER_TO_PEM ExpectIntGT(pemSz = wc_DerToPem(der, derSz, temp, tempMaxSz, PKCS8_PRIVATEKEY_TYPE), 0); diff --git a/tests/api/test_mldsa.h b/tests/api/test_mldsa.h index d1322e571..488c3a2b3 100644 --- a/tests/api/test_mldsa.h +++ b/tests/api/test_mldsa.h @@ -35,22 +35,26 @@ int test_wc_dilithium_der(void); int test_wc_dilithium_make_key_from_seed(void); int test_wc_dilithium_sig_kats(void); int test_wc_dilithium_verify_kats(void); -int test_mldsa_pkcs8(void); +int test_wc_Dilithium_PrivateKeyDecode_OpenSSL_form(void); +int test_mldsa_pkcs8_import_OpenSSL_form(void); +int test_mldsa_pkcs8_export_import_wolfSSL_form(void); int test_mldsa_pkcs12(void); -#define TEST_MLDSA_DECLS \ - TEST_DECL_GROUP("mldsa", test_wc_dilithium), \ - TEST_DECL_GROUP("mldsa", test_wc_dilithium_make_key), \ - TEST_DECL_GROUP("mldsa", test_wc_dilithium_sign), \ - TEST_DECL_GROUP("mldsa", test_wc_dilithium_verify), \ - TEST_DECL_GROUP("mldsa", test_wc_dilithium_sign_vfy), \ - TEST_DECL_GROUP("mldsa", test_wc_dilithium_check_key), \ - TEST_DECL_GROUP("mldsa", test_wc_dilithium_public_der_decode), \ - TEST_DECL_GROUP("mldsa", test_wc_dilithium_der), \ - TEST_DECL_GROUP("mldsa", test_wc_dilithium_make_key_from_seed), \ - TEST_DECL_GROUP("mldsa", test_wc_dilithium_sig_kats), \ - TEST_DECL_GROUP("mldsa", test_wc_dilithium_verify_kats), \ - TEST_DECL_GROUP("mldsa", test_mldsa_pkcs8), \ +#define TEST_MLDSA_DECLS \ + TEST_DECL_GROUP("mldsa", test_wc_dilithium), \ + TEST_DECL_GROUP("mldsa", test_wc_dilithium_make_key), \ + TEST_DECL_GROUP("mldsa", test_wc_dilithium_sign), \ + TEST_DECL_GROUP("mldsa", test_wc_dilithium_verify), \ + TEST_DECL_GROUP("mldsa", test_wc_dilithium_sign_vfy), \ + TEST_DECL_GROUP("mldsa", test_wc_dilithium_check_key), \ + TEST_DECL_GROUP("mldsa", test_wc_dilithium_public_der_decode), \ + TEST_DECL_GROUP("mldsa", test_wc_dilithium_der), \ + TEST_DECL_GROUP("mldsa", test_wc_dilithium_make_key_from_seed), \ + TEST_DECL_GROUP("mldsa", test_wc_dilithium_sig_kats), \ + TEST_DECL_GROUP("mldsa", test_wc_dilithium_verify_kats), \ + TEST_DECL_GROUP("mldsa", test_wc_Dilithium_PrivateKeyDecode_OpenSSL_form), \ + TEST_DECL_GROUP("mldsa", test_mldsa_pkcs8_import_OpenSSL_form), \ + TEST_DECL_GROUP("mldsa", test_mldsa_pkcs8_export_import_wolfSSL_form), \ TEST_DECL_GROUP("mldsa", test_mldsa_pkcs12) #endif /* WOLFCRYPT_TEST_MLDSA_H */ diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 83159ad65..bd448c355 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -36991,6 +36991,7 @@ int wc_EccKeyToPKCS8(ecc_key* key, byte* output, /* ASN.1 template for a general asymmetric private key: Ed25519, Ed448, * falcon, dilithium, etc. * RFC 8410, 7 - Private Key Format (but public value is EXPLICIT OCTET_STRING) + * Check draft-ietf-lamps-dilithium-certificates of draft RFC also. */ static const ASNItem privateKeyASN[] = { /* SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, @@ -37001,9 +37002,13 @@ static const ASNItem privateKeyASN[] = { /* PKEYALGO_OID */ { 2, ASN_OBJECT_ID, 0, 0, 1 }, /* privateKey */ /* PKEY */ { 1, ASN_OCTET_STRING, 0, 1, 0 }, - /* CurvePrivateKey */ + /* CurvePrivateKey */ /* PKEY_CURVEPKEY */ { 2, ASN_OCTET_STRING, 0, 0, 2 }, -/* PKEY_MLDSASEQ */ { 2, ASN_SEQUENCE, 1, 0, 2 }, +/* PKEY_SEED_ONLY */ { 2, ASN_CONTEXT_SPECIFIC | ASN_PKEY_SEED, + 0, 0, 2 }, +/* PKEY_BOTH_SEQ */ { 2, ASN_SEQUENCE, 1, 1, 2 }, +/* PKEY_BOTH_SEED */ { 3, ASN_OCTET_STRING, 0, 0, 0 }, +/* PKEY_BOTH_KEY */ { 3, ASN_OCTET_STRING, 0, 0, 0 }, /* attributes */ /* ATTRS */ { 1, ASN_CONTEXT_SPECIFIC | ASN_ASYMKEY_ATTRS, 1, 1, 1 }, /* publicKey */ @@ -37016,7 +37021,10 @@ enum { PRIVKEYASN_IDX_PKEYALGO_OID, PRIVKEYASN_IDX_PKEY, PRIVKEYASN_IDX_PKEY_CURVEPKEY, - PRIVKEYASN_IDX_PKEY_MLDSASEQ, + PRIVKEYASN_IDX_PKEY_SEED_ONLY, + PRIVKEYASN_IDX_PKEY_BOTH_SEQ, + PRIVKEYASN_IDX_PKEY_BOTH_SEED, + PRIVKEYASN_IDX_PKEY_BOTH_KEY, PRIVKEYASN_IDX_ATTRS, PRIVKEYASN_IDX_PUBKEY }; @@ -37033,9 +37041,11 @@ enum { int DecodeAsymKey_Assign(const byte* input, word32* inOutIdx, word32 inSz, + const byte** seed, word32* seedLen, const byte** privKey, word32* privKeyLen, const byte** pubKey, word32* pubKeyLen, int* inOutKeyType) { + int allowSeed = 0; #ifndef WOLFSSL_ASN_TEMPLATE word32 oid; int version, length, endKeyIdx, privSz, pubSz; @@ -37048,14 +37058,27 @@ int DecodeAsymKey_Assign(const byte* input, word32* inOutIdx, word32 inSz, #endif if (input == NULL || inOutIdx == NULL || inSz == 0 || - privKey == NULL || privKeyLen == NULL || inOutKeyType == NULL) { + privKey == NULL || privKeyLen == NULL || + pubKey == NULL || pubKeyLen == NULL || + inOutKeyType == NULL) { #ifdef WOLFSSL_ASN_TEMPLATE FREE_ASNGETDATA(dataASN, NULL); #endif return BAD_FUNC_ARG; } + if ((seed == NULL && seedLen != NULL) || + (seed != NULL && seedLen == NULL)) { + return BAD_FUNC_ARG; + } + + allowSeed = (seed != NULL && seedLen != NULL); #ifndef WOLFSSL_ASN_TEMPLATE + /* The seed can't be parsed without WOLF_ASN_TEMPLATE */ + if (allowSeed) { + return ASN_PARSE_E; + } + if (GetSequence(input, inOutIdx, &length, inSz) >= 0) { endKeyIdx = (int)*inOutIdx + length; @@ -37083,13 +37106,7 @@ int DecodeAsymKey_Assign(const byte* input, word32* inOutIdx, word32 inSz, return ASN_PARSE_E; if (GetOctetString(input, inOutIdx, &privSz, inSz) < 0) { - if (oid != ML_DSA_LEVEL2k && oid != ML_DSA_LEVEL3k && - oid != ML_DSA_LEVEL5k) { - return ASN_PARSE_E; - } - if (GetSequence(input, inOutIdx, &privSz, inSz) < 0) { - return ASN_PARSE_E; - } + return ASN_PARSE_E; } priv = input + *inOutIdx; @@ -37150,53 +37167,69 @@ int DecodeAsymKey_Assign(const byte* input, word32* inOutIdx, word32 inSz, } /* Parse full private key. */ - ret = GetASN_Items(privateKeyASN, dataASN, privateKeyASN_Length, 1, input, - inOutIdx, inSz); - if (ret != 0) { - /* Parse just the OCTET_STRING. */ + ret = GetASN_Items(privateKeyASN, dataASN, privateKeyASN_Length, 1, + input, inOutIdx, inSz); + if (ret == 0) { + /* Store detected OID if requested */ + if (ret == 0 && *inOutKeyType == ANONk) { + *inOutKeyType = + (int)dataASN[PRIVKEYASN_IDX_PKEYALGO_OID].data.oid.sum; + } + } + /* Parse traditional format (a part of full private key). */ + else if (ret != 0) { ret = GetASN_Items(&privateKeyASN[PRIVKEYASN_IDX_PKEY_CURVEPKEY], - &dataASN[PRIVKEYASN_IDX_PKEY_CURVEPKEY], 1, 0, input, - inOutIdx, inSz); + &dataASN[PRIVKEYASN_IDX_PKEY_CURVEPKEY], + PRIVKEYASN_IDX_ATTRS - PRIVKEYASN_IDX_PKEY_CURVEPKEY, 0, + input, inOutIdx, inSz); if (ret != 0) { ret = ASN_PARSE_E; } } - - /* Store detected OID if requested */ - if (ret == 0 && *inOutKeyType == ANONk) { - *inOutKeyType = - (int)dataASN[PRIVKEYASN_IDX_PKEYALGO_OID].data.oid.sum; + } + if (ret == 0) { + /* priv-only */ + if (dataASN[PRIVKEYASN_IDX_PKEY_CURVEPKEY].data.ref.length != 0) { + if (allowSeed) { + *seedLen = 0; + *seed = NULL; + } + *privKeyLen + = dataASN[PRIVKEYASN_IDX_PKEY_CURVEPKEY].data.ref.length; + *privKey = dataASN[PRIVKEYASN_IDX_PKEY_CURVEPKEY].data.ref.data; } - } - if (ret == 0 && dataASN[PRIVKEYASN_IDX_PKEY_CURVEPKEY].data.ref.length != 0) { - /* Import private value. */ - *privKeyLen = dataASN[PRIVKEYASN_IDX_PKEY_CURVEPKEY].data.ref.length; - *privKey = dataASN[PRIVKEYASN_IDX_PKEY_CURVEPKEY].data.ref.data; - } - else if (ret == 0 && - dataASN[PRIVKEYASN_IDX_PKEY_MLDSASEQ].data.ref.length != 0) { - if (*inOutKeyType != ML_DSA_LEVEL2k && - *inOutKeyType != ML_DSA_LEVEL3k && - *inOutKeyType != ML_DSA_LEVEL5k) { - ret = ASN_PARSE_E; + /* seed-only */ + else if (allowSeed && + dataASN[PRIVKEYASN_IDX_PKEY_SEED_ONLY].data.ref.length != 0) { + *seedLen = dataASN[PRIVKEYASN_IDX_PKEY_SEED_ONLY].data.ref.length; + *seed = dataASN[PRIVKEYASN_IDX_PKEY_SEED_ONLY].data.ref.data; + *privKeyLen = 0; + *privKey = NULL; + } + /* seed-priv */ + else if (allowSeed && + dataASN[PRIVKEYASN_IDX_PKEY_BOTH_SEQ].data.ref.length != 0) { + *seedLen = dataASN[PRIVKEYASN_IDX_PKEY_BOTH_SEED].data.ref.length; + *seed = dataASN[PRIVKEYASN_IDX_PKEY_BOTH_SEED].data.ref.data; + *privKeyLen = dataASN[PRIVKEYASN_IDX_PKEY_BOTH_KEY].data.ref.length; + *privKey = dataASN[PRIVKEYASN_IDX_PKEY_BOTH_KEY].data.ref.data; } else { - /* Import private value. */ - *privKeyLen = dataASN[PRIVKEYASN_IDX_PKEY_MLDSASEQ].data.ref.length; - *privKey = dataASN[PRIVKEYASN_IDX_PKEY_MLDSASEQ].data.ref.data; + ret = ASN_PARSE_E; } } - if ((ret == 0) && dataASN[PRIVKEYASN_IDX_PUBKEY].tag == 0) { - /* Set public length to 0 as not seen. */ - if (pubKeyLen != NULL) - *pubKeyLen = 0; - } - else if (ret == 0) { - /* Import public value. */ - if (pubKeyLen != NULL) + + if (ret == 0) { + if (dataASN[PRIVKEYASN_IDX_PUBKEY].data.ref.length != 0) { + /* Import public value. */ *pubKeyLen = dataASN[PRIVKEYASN_IDX_PUBKEY].data.ref.length; - if (pubKey != NULL && pubKeyLen != NULL) *pubKey = dataASN[PRIVKEYASN_IDX_PUBKEY].data.ref.data; + } + else { + /* Set public length to 0 as not seen. */ + *pubKeyLen = 0; + *pubKey = NULL; + } } FREE_ASNGETDATA(dataASN, NULL); @@ -37219,8 +37252,8 @@ int DecodeAsymKey(const byte* input, word32* inOutIdx, word32 inSz, } if (ret == 0) { - ret = DecodeAsymKey_Assign(input, inOutIdx, inSz, &privKeyPtr, - &privKeyPtrLen, &pubKeyPtr, &pubKeyPtrLen, &keyType); + ret = DecodeAsymKey_Assign(input, inOutIdx, inSz, NULL, NULL, + &privKeyPtr, &privKeyPtrLen, &pubKeyPtr, &pubKeyPtrLen, &keyType); } if ((ret == 0) && (privKeyPtrLen > *privKeyLen)) { ret = BUFFER_E; @@ -37606,10 +37639,11 @@ int SetAsymKeyDer(const byte* privKey, word32 privKeyLen, oidKeyType); /* Leave space for private key. */ SetASN_Buffer(&dataASN[PRIVKEYASN_IDX_PKEY_CURVEPKEY], NULL, privKeyLen); + /* Don't write ML-DSA specific things. */ + SetASNItem_NoOut(dataASN, PRIVKEYASN_IDX_PKEY_SEED_ONLY, + PRIVKEYASN_IDX_ATTRS); /* Don't write out attributes. */ dataASN[PRIVKEYASN_IDX_ATTRS].noOut = 1; - /* Don't write sequence. */ - dataASN[PRIVKEYASN_IDX_PKEY_MLDSASEQ].noOut = 1; if (pubKey) { /* Leave space for public key. */ SetASN_Buffer(&dataASN[PRIVKEYASN_IDX_PUBKEY], NULL, pubKeyLen); diff --git a/wolfcrypt/src/dilithium.c b/wolfcrypt/src/dilithium.c index ac8e5d810..ea0219c48 100644 --- a/wolfcrypt/src/dilithium.c +++ b/wolfcrypt/src/dilithium.c @@ -9659,31 +9659,6 @@ int dilithium_get_oid_sum(dilithium_key* key, int* keyFormat) { #if defined(WOLFSSL_DILITHIUM_PRIVATE_KEY) -/* OCT OCT */ -#define ALT_PRIV_DER_PREFIX (2 + 32 + 4) -/* SEQ [ OCT OCT ] */ -#define ALT_PRIV_DER_PREFIX_SEQ (4 + 2 + 32 + 4) - -/* Get the private only key size for the ML-DSA level/parameter id. - * - * @param [in] level Level of the ML-DSA key. - * @return Private key only encoding size for key level on success. - * @return 0 on failure. - */ -static word32 dilithium_get_priv_size(int level) -{ - switch (level) { - case WC_ML_DSA_44: - return ML_DSA_LEVEL2_KEY_SIZE; - case WC_ML_DSA_65: - return ML_DSA_LEVEL3_KEY_SIZE; - case WC_ML_DSA_87: - return ML_DSA_LEVEL5_KEY_SIZE; - default: - return 0; - } -} - /* Decode the DER encoded Dilithium key. * * @param [in] input Array holding DER encoded data. @@ -9708,11 +9683,14 @@ int wc_Dilithium_PrivateKeyDecode(const byte* input, word32* inOutIdx, dilithium_key* key, word32 inSz) { int ret = 0; + const byte* seed = NULL; const byte* privKey = NULL; const byte* pubKey = NULL; + word32 seedLen = 0; word32 privKeyLen = 0; word32 pubKeyLen = 0; int keyType = 0; + int autoKeyType = ANONk; /* Validate parameters. */ if ((input == NULL) || (inOutIdx == NULL) || (key == NULL) || (inSz == 0)) { @@ -9756,34 +9734,45 @@ int wc_Dilithium_PrivateKeyDecode(const byte* input, word32* inOutIdx, if (ret == 0) { /* Decode the asymmetric key and get out private and public key data. */ +#ifndef WOLFSSL_ASN_TEMPLATE ret = DecodeAsymKey_Assign(input, inOutIdx, inSz, + NULL, NULL, &privKey, &privKeyLen, - &pubKey, &pubKeyLen, &keyType); - if (ret == 0 -#ifdef WOLFSSL_WC_DILITHIUM - && key->params == NULL -#endif - ) { + &pubKey, &pubKeyLen, &autoKeyType); +#else + ret = DecodeAsymKey_Assign(input, inOutIdx, inSz, + &seed, &seedLen, + &privKey, &privKeyLen, + &pubKey, &pubKeyLen, &autoKeyType); +#endif /* WOLFSSL_ASN_TEMPLATE */ + } + + if (ret == 0) { + if (keyType == ANONk && autoKeyType != ANONk) { /* Set the security level based on the decoded key. */ - ret = mapOidToSecLevel(keyType); + ret = mapOidToSecLevel(autoKeyType); if (ret > 0) { ret = wc_dilithium_set_level(key, (byte)ret); } } - /* If it failed to decode try alternative DER encoding. */ - else if (ret != 0) { - word32 levelSize = dilithium_get_priv_size(key->level); - privKey = input + *inOutIdx; - privKeyLen = inSz - *inOutIdx; - - /* Check for an alternative DER encoding. */ - if (privKeyLen == ALT_PRIV_DER_PREFIX_SEQ + levelSize) { - privKey += ALT_PRIV_DER_PREFIX_SEQ; - privKeyLen -= ALT_PRIV_DER_PREFIX_SEQ; + else if (keyType != ANONk && autoKeyType != ANONk) { + if (keyType == autoKeyType) ret = 0; - } + else + ret = ASN_PARSE_E; + } + else if (keyType != ANONk && autoKeyType == ANONk) { + ret = 0; + } + else { /* keyType == ANONk && autoKeyType == ANONk */ + /* + * When decoding traditional format with not specifying a level will + * cause this error. + */ + ret = ASN_PARSE_E; } } + if ((ret == 0) && (pubKey == NULL) && (pubKeyLen == 0)) { /* Check if the public key is included in the private key. */ #if defined(WOLFSSL_DILITHIUM_FIPS204_DRAFT) @@ -9828,32 +9817,39 @@ int wc_Dilithium_PrivateKeyDecode(const byte* input, word32* inOutIdx, pubKeyLen = ML_DSA_LEVEL5_PUB_KEY_SIZE; privKeyLen -= ML_DSA_LEVEL5_PUB_KEY_SIZE; } - else { - word32 levelSize = dilithium_get_priv_size(key->level); - - if (privKeyLen == ALT_PRIV_DER_PREFIX + levelSize) { - privKey += ALT_PRIV_DER_PREFIX; - privKeyLen -= ALT_PRIV_DER_PREFIX; - } - } } if (ret == 0) { - /* Check whether public key data was found. */ -#if defined(WOLFSSL_DILITHIUM_PUBLIC_KEY) - if (pubKeyLen == 0) + /* Generate a key pair if seed exists and decoded key pair is ignored */ + if (seedLen != 0) { +#if defined(WOLFSSL_WC_DILITHIUM) + if (seedLen == DILITHIUM_SEED_SZ) { + ret = wc_dilithium_make_key_from_seed(key, seed); + } + else { + ret = ASN_PARSE_E; + } +#else + ret = NOT_COMPILED_IN; #endif - { - /* No public key data, only import private key data. */ - ret = wc_dilithium_import_private(privKey, privKeyLen, key); } #if defined(WOLFSSL_DILITHIUM_PUBLIC_KEY) - else { + /* Check whether public key data was found. */ + else if (pubKeyLen != 0 && privKeyLen != 0) { /* Import private and public key data. */ ret = wc_dilithium_import_key(privKey, privKeyLen, pubKey, pubKeyLen, key); } #endif + else if (pubKeyLen == 0 && privKeyLen != 0) + { + /* No public key data, only import private key data. */ + ret = wc_dilithium_import_private(privKey, privKeyLen, key); + } + else { + /* Not a problem of ASN.1 structure, but the contents is invalid */ + ret = ASN_PARSE_E; + } } (void)pubKey; diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h index 136735876..cffd587e3 100644 --- a/wolfssl/wolfcrypt/asn.h +++ b/wolfssl/wolfcrypt/asn.h @@ -204,7 +204,10 @@ enum ASN_Tags { /* OneAsymmetricKey Fields */ ASN_ASYMKEY_ATTRS = 0x00, - ASN_ASYMKEY_PUBKEY = 0x01 + ASN_ASYMKEY_PUBKEY = 0x01, + + /* PKEY Fields */ + ASN_PKEY_SEED = 0x00 }; /* NOTE: If ASN_UTC_TIME_SIZE or ASN_GENERALIZED_TIME_SIZE are ever modified @@ -2727,8 +2730,9 @@ WOLFSSL_LOCAL int VerifyX509Acert(const byte* cert, word32 certSz, || (defined(HAVE_CURVE448) && defined(HAVE_CURVE448_KEY_IMPORT)) \ || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS)) WOLFSSL_LOCAL int DecodeAsymKey_Assign(const byte* input, word32* inOutIdx, - word32 inSz, const byte** privKey, word32* privKeyLen, const byte** pubKey, - word32* pubKeyLen, int* inOutKeyType); + word32 inSz, const byte** seed, word32* seedLen, const byte** privKey, + word32* privKeyLen, const byte** pubKey, word32* pubKeyLen, + int* inOutKeyType); WOLFSSL_LOCAL int DecodeAsymKey(const byte* input, word32* inOutIdx, word32 inSz, byte* privKey, word32* privKeyLen, byte* pubKey, From 778dcbaafb28ae80a8478b13648d944069372664 Mon Sep 17 00:00:00 2001 From: Koji Takeda Date: Mon, 14 Jul 2025 11:00:36 +0900 Subject: [PATCH 2/4] Add test data --- certs/include.am | 1 + certs/mldsa/include.am | 23 +++++++++++++++++++++++ certs/mldsa/mldsa44_bare-priv.der | Bin 0 -> 2584 bytes certs/mldsa/mldsa44_bare-seed.der | Bin 0 -> 52 bytes certs/mldsa/mldsa44_oqskeypair.der | Bin 0 -> 3900 bytes certs/mldsa/mldsa44_priv-only.der | Bin 0 -> 2588 bytes certs/mldsa/mldsa44_seed-only.der | Bin 0 -> 54 bytes certs/mldsa/mldsa44_seed-priv.der | Bin 0 -> 2626 bytes certs/mldsa/mldsa65_bare-priv.der | Bin 0 -> 4056 bytes certs/mldsa/mldsa65_bare-seed.der | Bin 0 -> 52 bytes certs/mldsa/mldsa65_oqskeypair.der | Bin 0 -> 6012 bytes certs/mldsa/mldsa65_priv-only.der | Bin 0 -> 4060 bytes certs/mldsa/mldsa65_seed-only.der | Bin 0 -> 54 bytes certs/mldsa/mldsa65_seed-priv.der | Bin 0 -> 4098 bytes certs/mldsa/mldsa87_bare-priv.der | Bin 0 -> 4920 bytes certs/mldsa/mldsa87_bare-seed.der | Bin 0 -> 52 bytes certs/mldsa/mldsa87_oqskeypair.der | Bin 0 -> 7516 bytes certs/mldsa/mldsa87_priv-only.der | Bin 0 -> 4924 bytes certs/mldsa/mldsa87_seed-only.der | Bin 0 -> 54 bytes certs/mldsa/mldsa87_seed-priv.der | Bin 0 -> 4962 bytes 20 files changed, 24 insertions(+) create mode 100644 certs/mldsa/include.am create mode 100644 certs/mldsa/mldsa44_bare-priv.der create mode 100644 certs/mldsa/mldsa44_bare-seed.der create mode 100644 certs/mldsa/mldsa44_oqskeypair.der create mode 100644 certs/mldsa/mldsa44_priv-only.der create mode 100644 certs/mldsa/mldsa44_seed-only.der create mode 100644 certs/mldsa/mldsa44_seed-priv.der create mode 100644 certs/mldsa/mldsa65_bare-priv.der create mode 100644 certs/mldsa/mldsa65_bare-seed.der create mode 100644 certs/mldsa/mldsa65_oqskeypair.der create mode 100644 certs/mldsa/mldsa65_priv-only.der create mode 100644 certs/mldsa/mldsa65_seed-only.der create mode 100644 certs/mldsa/mldsa65_seed-priv.der create mode 100644 certs/mldsa/mldsa87_bare-priv.der create mode 100644 certs/mldsa/mldsa87_bare-seed.der create mode 100644 certs/mldsa/mldsa87_oqskeypair.der create mode 100644 certs/mldsa/mldsa87_priv-only.der create mode 100644 certs/mldsa/mldsa87_seed-only.der create mode 100644 certs/mldsa/mldsa87_seed-priv.der diff --git a/certs/include.am b/certs/include.am index 90e66c997..e4f6a0e6c 100644 --- a/certs/include.am +++ b/certs/include.am @@ -152,4 +152,5 @@ include certs/dilithium/include.am include certs/sphincs/include.am include certs/rpk/include.am include certs/acert/include.am +include certs/mldsa/include.am diff --git a/certs/mldsa/include.am b/certs/mldsa/include.am new file mode 100644 index 000000000..94868dc61 --- /dev/null +++ b/certs/mldsa/include.am @@ -0,0 +1,23 @@ +# vim:ft=automake +# All paths should be given relative to the root +# + +EXTRA_DIST += \ + certs/mldsa/mldsa44_seed-only.der \ + certs/mldsa/mldsa44_priv-only.der \ + certs/mldsa/mldsa44_seed-priv.der \ + certs/mldsa/mldsa44_oqskeypair.der \ + certs/mldsa/mldsa44_bare-seed.der \ + certs/mldsa/mldsa44_bare-priv.der \ + certs/mldsa/mldsa65_seed-only.der \ + certs/mldsa/mldsa65_priv-only.der \ + certs/mldsa/mldsa65_seed-priv.der \ + certs/mldsa/mldsa65_oqskeypair.der \ + certs/mldsa/mldsa65_bare-seed.der \ + certs/mldsa/mldsa65_bare-priv.der \ + certs/mldsa/mldsa87_seed-only.der \ + certs/mldsa/mldsa87_priv-only.der \ + certs/mldsa/mldsa87_seed-priv.der \ + certs/mldsa/mldsa87_oqskeypair.der \ + certs/mldsa/mldsa87_bare-seed.der \ + certs/mldsa/mldsa87_bare-priv.der diff --git a/certs/mldsa/mldsa44_bare-priv.der b/certs/mldsa/mldsa44_bare-priv.der new file mode 100644 index 0000000000000000000000000000000000000000..56a03bf9c1f6a44c7efdf3cd1fbb9dfe78dc046e GIT binary patch literal 2584 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 GcLo3+O^g@- literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa44_bare-seed.der b/certs/mldsa/mldsa44_bare-seed.der new file mode 100644 index 0000000000000000000000000000000000000000..809ef71501e7665459d25cf92fdba029f1f6ba44 GIT binary patch literal 52 zcmXpoVq#=4;AZ1YX!Br9WoBU(WKnSE_^iQlLe)HWTF}yKOZ|gxU8y*;@Va?J!jm+H I;D)3(09sNK2LJ#7 literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa44_oqskeypair.der b/certs/mldsa/mldsa44_oqskeypair.der new file mode 100644 index 0000000000000000000000000000000000000000..4669c183e65869ad2d03c71ff6780d63f267869d GIT binary patch literal 3900 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 E0BNn|^#A|> literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa44_priv-only.der b/certs/mldsa/mldsa44_priv-only.der new file mode 100644 index 0000000000000000000000000000000000000000..81fec03b65110013c2cee6dda09e99701c6e6689 GIT binary patch literal 2588 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 TmsVMI(H+j`Lk^m(U$q?ocy^>5 literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa44_seed-only.der b/certs/mldsa/mldsa44_seed-only.der new file mode 100644 index 0000000000000000000000000000000000000000..82d0a73845f3ad0e74d8b0f8fe56bf81e0718e6e GIT binary patch literal 54 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 Bny3H( literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa65_bare-priv.der b/certs/mldsa/mldsa65_bare-priv.der new file mode 100644 index 0000000000000000000000000000000000000000..07d42314eb60fa6697b6b1644b9a430c3c0de975 GIT binary patch literal 4056 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 literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa65_bare-seed.der b/certs/mldsa/mldsa65_bare-seed.der new file mode 100644 index 0000000000000000000000000000000000000000..53011bcfdfbca2c2a699ecaad75d4769740fe9f5 GIT binary patch literal 52 zcmXpoVq#=4;AZ1YX!Br9WoBU(Vo}hJ*I0Uc^}5#|*&S5Bx_mH<&*JUw>@2@){&ya4 I@sEJ*0CDOP$p8QV literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa65_oqskeypair.der b/certs/mldsa/mldsa65_oqskeypair.der new file mode 100644 index 0000000000000000000000000000000000000000..4c43bdfd74aff3836b0a116a0dbb0ba76be206fc GIT binary patch literal 6012 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 BdFKEC literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa65_priv-only.der b/certs/mldsa/mldsa65_priv-only.der new file mode 100644 index 0000000000000000000000000000000000000000..bdf04a2cade148ee20c46f6ed8b23c10ef3bdee4 GIT binary patch literal 4060 zcmXqL;=jSf$Y8+D#+lIO!I;X-!Ystn#D9dPiT?oWG;5K&p^uXuJ$i91Kw}l>i5rCn z?=dmokKHco?6Ius>=CJs3)bMJ!xP!adki8&#W<9E({hBE(oyQytlrL)<(ilpW9fMia8%6K919vH1k*KG*owkS5``=jIT*{+*b6!wSxhXFOiWBW zL_&-?B7{pB(+z`~3mS~o961!y9gE#V%M;rJ$_pfzTMX14#LQJV#FPR{k`yaSnvDZX zGzuL#ijp!I+5?$7B0`nISOl3$*__myQv}~aa8X^>hJ4DLMTonZ? zGCUevo5c-E0?f=BA~@1m9Fy3URM|sR*qFtd*vdoPJUWsMHN*>9m{>C08r4KZL(5&1 zMAKXy6jU{m70lC_4HTUd1Kl*7m5R)m#R}YmLWKk@l+{!X4H<=1IFvJ*I*K(ij1q#} zT3J&%S{aJi5;8PWLOPPl)eM4)%#Bh#%ESePiv!q1jKdAhJ;W6f*fk8*jRh)PQW%WX zg+m!=9aR}r zjWrqrRLj*P8bk#}0z?9p3d&td)EZdKJOovW9K+L684@)jnoC`oK?$B-P{9=4T>3!0^5{|MAOPx4NC)@ zoWtA&**z@El)~K|on2E^1(YNd!qN<#ncZ8>QW+`=GfJ4-6-tyUBuq;iQi26kn44PK zniAmLIo4k6+}y0 z8xzFajXR8lB!rn80s{!$b?24Jue1Gs2r$Lf8UY*%%{&(?Ww(6^c~?6`fKwN)tE? zmED+4nUj(fQ#i!iR9G4_f;dtF3tWU#7z+#&1td(&-I|?E+So&!3X0X4+0+t@g4@Fc z*+fj66kIrx*@G21Dv~oagbNdd+n7UHQbbLQLz)~K7|oc)Sp!89%{3Z~i^@6}*c)3y z6Iomu3o6YHfz?|cXywx?!3acFe9VrW#Y8*%8v}C>4#bF zzFDNTt(;RejxTV*fuFIxy>9Xc3mtZEGdb86J@r)Q`BT?k{>VL{a44kY=&t$qoaW`< z77@)#X)`SfKKk(AADk6HRAxOv&{oVY8@){%Yz3p7usC)_aY{mLLR(f-M- z&o}d#vTK*-X@6bVk-6CGcu>hySEil(f(0h;j~Tq*bm>QsONfe^?)52}s&xfC<}XB- z3*CJsFSDVoKYo6|!_N=1*cF_YKe?`SB0X#R_O~g*mB*OhcinUod-=ycC6jHAJDY>{ zTKk6$OSfp6=%1au)xwp^qlsU&3V%~bv-HX&yUaiGuz)Lx}UFc?GyRz#`{|u3@X1$v!cc9&7MSdPCV%2soRpx=U)zDv|I!x|LCz4zMX#?(A4y&t@;Fzb@gd8DXBoC@+pFKct>FKA zjMGNRl==RJU)Srl?F>CHXf@~1My8cJw!L>f?)52Gyxv5`a?ASV(l?XK8$8@Qejm0I z6+6v+=f{z64f&6{uBaTzG!%KbL1v-kW~JU07dp}|hfPXsJAL9z%BIqdKV?@aHVNG= zQ95}pdQbA2Yfkl7Z-0>P->~$`obJ^Zcrs7id>(s^-_rB!)U}5=zOPhgp1t_V^R-_? zUxhy43SM~Ed!4eQL@JlS{JSjThcC7+pSAS(dy9SHzfT>XB>eZcghcyFkv~%AB8lfx zy#Fg+oxRa7QzWA=Tx!>$h`;Bbo;tJOP^DnSRtDckztj>cSc*(;-*|m?`x4&u`(ElV zlluG5{f`j4KwJ>FXBz2ebMOVR%b7eEP3Y`tkdPblj+{iJBt?liZXdngr^ZHdQT`Y3RPlyTWZ%aY;aXYUQVXztZjJ)b;I8KqVI-`@5wTEA1}GWSC@#h%}nXYB7hB@-oM`rz%V zx*$He+1x*ORR}!ZJnOZ*RcCzlE=9@IFK!VxC$G5IkSDY0^V0U<-1#<6_6y(azsr@r zbu{=9n(<5cz1yaJ zcX&#ylpYH!9LTtQCgV7{BA3yK27KoeE$7i|w@j6sMq#3cbH;4;A@v zuMfC<>od=sFPEiH&6*bZT~}cibKSbik_lOL`wKSqzWuv>c3a0@PEOHfPxEIzI$OF>v}UCqpE|BbGkLs35S=6iqp#qHvi=6Y_o>!sr<$rrSm z3yWfoO=ZIgW zCO3-`7C)_i_uZseH%qG|l*jL%%tVn#?o5%p-u7F(51;zjPC~wDdRg<9$#K)qv++#* zC0bz@vmi4_Y03$K)fY2cDyC`Au5PpiZ9|8diYlyqo*Kn7z4ixoO$LlWZf1O8+Vn1^@~lf%c5GGfr@24( zBxcWuHLzsZU=R}ME2LeN)AfeOOe1gBp11cBPNqukJNsZ$bZMQa>*a?x+yrcHzY+_0 zNB11Ur}pfv|89T(@cvn`Damw14*)1;ZrPa~g+Y}k7yCrsaS@hXusE%~XF z(zeg~zkS~n%Uj!hOxzCMxYBotdD*2G3w|8Ebl7A`!z;#n>sTMJ=31hZ7=P-f%!Hzw z@2#hlxBQCXR9x4dZ@Do#eZlz^O$#D_A7BcUc3waA&1#WTg{AG{anIY@B+QoYnLQH# DXBVNw literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa65_seed-only.der b/certs/mldsa/mldsa65_seed-only.der new file mode 100644 index 0000000000000000000000000000000000000000..f7e0ba696cb37f659e33863dfbf23549bee3e5d3 GIT binary patch literal 54 zcmXpoVPa%3;AZ1YX!Br9WoBU(Vo_>PI92=Mzt#Cg1uL|9-eu2xJICVw4)g6#&mD8< Ls@6XJWTO)R#yl1q literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa65_seed-priv.der b/certs/mldsa/mldsa65_seed-priv.der new file mode 100644 index 0000000000000000000000000000000000000000..005825f555001a7f09b2cf5158cf6b3dd18504d4 GIT binary patch literal 4098 zcmXqL;{V6Q$Y8+D#+lIO!I;X-!Ystn#Q(~miT@dk0>_=jW|=1&zxte(F*5qG(BSau z_{S^HiSGHF)^kSZ#h0}#P5cMuIn4bwE9%(qDg2FDEn#uXwq@S>$(uf-=%xFjkb;|q z|C*-UU|;&aTd{b1i6Z9%2lm4oa^qxLH~R)@&R<;_SUI09ea@`ULFaYccfYwacay}` z<=yh4caAjg*dQVu)+i(W(mSo{($iVnRu>n{_QK? z31zr4q!~IUGr5~KGL@Gxw<)sinAgh_VWZ2bC8Esu~5br!}QmG>L^4mS>cgIYb0^6qgvQD@q8qYq**@ zD3=?SF(?|i7gU&<6gruQm$oE_rM0;ksz?|rl%$zCcvOfPm6(aUi6Ts3j={au|dZstPwdXEcYEq>6KRcqqD;C#YC7NmQ7nWT+&zxhjVVs|vF^B%6yj zF@>`h7OF67uyGW+v>60BrWO~OrD<`&P2q+pBv>Pd@D-^3|hz2V(lnO93rwFNtNN^;I zG*xgUGPspCG>Mib7nmrErx+Qzn3M?_FekV*XB3%;xH+4MB!?H92{8$ZBsqi%77K*4 z7!(z$q-r>obrdVR83ZW_s41$JnKKq7a%2dGDM_S=8y1>1J4+}jF$V=O2$hDWHiem4 z2qdwUnrNsd79qfvay9KI|~N7nK}!&F}AueF$OsVCJCe@ zF{+j&ml!rCG_iY#3aYrVSO{taHz%c6{-knlqv*8G%2bHh_^?Cx3;w^x{H*yl!%L{hpQ*E zmx!0EvnEA^iyKrFvIrTsn2v!%E(yDGGFm>8C)r%E`OwJ@hQ2OBD|BrqF> zo2MuTH8O=cF$5VpF&hMSB&v9XdQ=EXhz6IrBq=zXnX9?DhKEY9F|}qCrY8i3h$|P0 z1Ua~77#cYyB_^`4rz*EAG?_4kC#Y8lrKlJnQ~~Pvy`@U6bU*gh_N-hvkH_s znl&qMq_sMQhX{BCGkBO6F|)fhl?5t_hC5U+vappYCoq{YsCtApg&PP52#N~`sR|}I zvKJ_)1hOZj8Y+ibD783?Brt>)mn*S2s)?{Er#A(e3OE)TF|fOTAXFr_6IGbEcZMu@YD6>6jzB${%hmX^Ag1u_+Dm^-$IMzn;MG%+=m z85yK-G%AK!6eb9YIEViS1^?p3MaG+B%2l` zWw5--E!Z_Nd^|_r1fib$RB&4_oIo${jj4XQkuzS-*dNy{paboR_rcpj?j5 zicJe5U`TP?$veOqieU(b!r^KPrCE& zamD>&`nO!vyVE4C{oUk_I<~{-1w}cU3UX&u7$kY<7nPapNUyvrBWlK+b!{WV?Js{l z{pW0ccklN-rPJK^Chhy^Sfl-Oin(o}%-L}Wo76UCh8>gLe0lwIUbZXE7%WbII;%0k&Zk+KB}p#O&gjK_ zh1f}3SEnyXc-A+Cvv(d>ew*>!Uklitd=8l-&?w80_V2EO-5jleTII`12fadWpZ;*Y z#`bl&{?;hbQz55Y_fw3KarX4G(pe_z_Y;!UweD=n z+{*AA4c#aDrnl1V4^?Mfxu^f|2e0Xo@Al2jh$;3u6@2cizrE85VUfW6SG#6Cv=UvTAgk&io_F5i^Q>oH z)`godUeTGM_n}2zN59M8<^KM+C)R2hhj=&n>ECS-)wVV*P=CAAI=8-kPw(kTto%l= zy>4#5nCEz)@>|Qnqqz#%f^R)+)~?@fcB`^`+oqMqtM3TT{+AZ2c|3M@TWVkQ2mOal z-&Q&$Y`rG;v&g*flBkept>?x=iyroh`Ti3%;A*c4-?iU)o#tJuyR93WUrA>lIVdc! z%%M+BPF(Oqy?IOI?$p^=jFLD`R~kDVD0QCv>x6?Fhr*Zt+`b8_MP4T_%ImGV z^5K7USoT9ll|`0YeWS$1SG`a2R+&2WWc%(9$G=UBTYUS~PrD}(uT^5SGv4a@Wa)Sw z_!|8%%fRYl&!i6FV^`TO_)K?LapYcpGVbfkmI`Fs~unFBvtY@wl zt?KGIDzfE#^!ZrUMppBsi~k*|KjcuCr^uLHdHu=cI}5U8ov&HD=-k&^+Pi1U!ix;P z>la=5-Fj__%A1KH_Fw#ym!DFfv)_A`=(oMw4qlS@cRWDrkapxq8MEvu!bn;m{J zHDK${EppkDzjM4Ox?4O|U3BV4-h7+vQ2xlnk5sombyRp)$X~6kGxc5oucU6|p4n3; ziShpbB2yt_>~(uXP;4gKQJHi3=NVU}T{TNIQd9d^@#}`F!lXT`{#o1ZEcN7QnCqD7 zR5|TOwbBjK9}ky)IhUUE?eiLu18H{{j9M-BoM&6;tWp(o=XUt1&j<5diiCcauw1N~ zXU(iy_EsYWm1zb}_6 zt?Y1|eo|wTsYd6esGRC!p02&!y~&DKc845D%l_b(Zpjh2?qj3Ls?D#Td^omTxLJ#7 zy~N~qJ0^!~uHfA~=|p{}ZjJuZ-e8T%Pe^Uz11aW#J9`ZuG=TFtqW>)G~d$ zcaP)QB&Q`4Jfgl%{9+Qxr)Uac5*!Y&Hm?>yjdN0W7V;R zF;3fvZ2-VKVrwp0ZogeZt-B@#D^67@E8LdlnJ{vE+zTzswtB`jd&)2s2 zTx4I!@L;KI`hM5v6Pv$;{gCMX?ehJ16_5G>+hZ?Ut8ZilO<(l&^Ea00*Z=d^)}Q}7 zOZMkBPfq8{KmFFWt3FmqZ+DgJa5DVNa!l*P><>*DMwJ^gZl7Gz<#P4=F)`(eXOQHOvAY9J@}~&iE$(fcyKeN3F$%H9hi;Q+}?OXIRgEma#~) z^ry#`)-BR91%>wKKDo#D?_XGRZze-n*hj|~2cBqfD)1a=OkmMDaH;q9)iT5AtA7`o zCeMGT^JvzqfUml-`5yfTnQ!$}KG90tDX1)aH)ZM!#}##!+osp?lklzUuh3{xM=A^>8GxmJhBN3xgK;aENV%tsa*Uh?zo8;@9Q^yn;9P$zq6h6 zFw}33$$@X6{b_TiGk;ci5i8~x8IoN6+d{6k&Y`;O@2&gG z1NMGeraJLN`o&8g>lceYNuSfn`az06QuMcp>zuY$eeu6pvqUNjj%B0MsuA9Hk`{{L)Yvr>OCi=PjZ#`vkA;D#` z(dK#FF_|^f&RU;Tn`%0_(ZH(f~zD> zKg$v|a&j*5)4X9F_tE-(`iq?_B_?lG`|`0w|GW6Wf;ms#oSL!cZcN^eHwK(G8>T=1 z^3}1-TsC~O+eOjOG669riSIPR4QtzGN}rS6pY!C-fx~rQCq#eunPnX}_3at{h1#Z> zwKEt`ANn*kpyRyM@3_L|Z@)Hud2)W$qwc$+nSShxj!)RWYE#6*55ij(FqiEM%J1`z z$Xx%1jk8m7nxW*06p5`FK}Je5mgHVBaJsxn@W2$!=xGWK5=Kr3Se-2tg;;_(9J^+* zaYV2<#2EQZ+2q0EsdC0d=)xfuC$S`k?Vgj_S`I1c`Irdtuq#b6YngCFKtWYekfSJR zN8kek0i{WTvyM3~-jOnSg6|@Zi7Xp)98D4gR zfeoHL96HRd4R_pl54z|~Q4y4yEVxL`r^|%x(J{`+LRvGIOuQrD6(hu>!q}$BlBaMi zbB%or1#zm|u1|BYK zO)`!d5@IRJ>=`Frx&%#f1DXURSsOh)bgyjVWD?++!cugwBSVGLZPE#!NEMy~O07yA z8X`L!XE+HaD=2X~b52z8TDYwD5>ucegV32{DU24HGiSIY?O;(^+`?(ndXXvj@ia}D zZHfyf2|Th;Y!G0%aAKl|g~9Engd-wF0&bctoN5H zX;3tgMMH9$#)Bz_liNB3or4&sCc0>7T#zt`XyCbM-?lNne~Gx;<&^&FVsqof|-E#Y=kgORJnP|8wkriT;Lu|N(n zp-2u-7B&qPRn4AhI?7I}g3f{|lM-)FX<$+}JgwxGU?6mR0>_yahZ7zhlaDDX85G_U z%ZOB%kZ{0bAycCaD_iseU#9J?O2!N_EjovGbg)d)O>7G2Xq%wy$lKLWcx4Og2{%3E znSwHgO+vcKqKHF=TBMV8KPhQccbjLOPfLd==2o4`HQwR?uD@`8lP5-Gt`csQ1OI5;qHbxv?J@R`Fh zL3ugnY%!J_O)d)Usf^onBN+H3EP3X*v`m`jB4XIc%$mBufm7sAM;C)nw+5@il$HsH z7$QzIC@HB%FzI%4C^CDdEoxGgndEwh$*ZfQHOR#1q=M0frkoCkuE--A!p9vwER0Ti zXel@8dK&TFQgCDB?37{&V&TkD5fo%_?@f}(iC)yn)!^VYBQw#gDa0)+WkcpIp@0-N z)lpRvix>qVWFHuNk88cx2@}D zd8V&m(n-?Xwdm#b*Zi~2wRW!BZGUy`SN@5O$?|T}MfZ-S{xjdUMEUocg@^P-&Ng_( zA76Q2c+DKQQbkt3iLp6zaeV=8c@>K3{k^fT{Ft5|&=8t)4 z?R=WQ;K@YMXR`(ScdoE@s7*V4&t)aEy6exYh8^#EtNCIhT2Fu57Q~^X0;uE(Hw+{l*uz6AaJYOuP}I^<>8D2|LzpGyeJ@ z!`1t1XOh^I-mQ$g%Qm<{`srYN-uEFmq~j$6nB?*{5qo=7w{`cqVcVGP>%g-XZSt^J5NdJSJ-IJEId|~8q zk`r|Fp11N!%(jWz!s|~*Xq`MByzpLUfkdYgH>1}FIhW$a*W_MU?foZmsiQ}#Zf*T} zg;U=yt36xY6EOX-`2&BsS4|gP8ox=t4e1kq!PUFtM$6Qs)syU2@|!FQdC+#_A7kZ) z)>}K0_tge%`n<^aOIgePv}Ex{wco|duI%7r5}5M-WmLz0zS&o%2Bvkl^{#8Wd1>-1 zG3Uwp_DP0y%;!x-%fx3}3tC(gmaEq)ds?n{*?7*MEo{mMpT})Bvikp;Yh9b!hV$_v zMX_ladpB;Hw&o3EZRLzF3Y|f}a~B`C|HRjxaVS1hb$<8p&+qq7I-u_HM1Aw-TXh%Q zcy~GJr9?&g@LMnls`k}qZ_9EF-jcHVGS`BxpJ5!)(+dPs!e;O)hTWLr5*cqV^_3}d zew)quFGk`oW)$x-a5Sh~{bi!f$5&_9tezvYTHwe+iJyL=)w891u02}Z&*yg2=fsy! zoh#=uoGmMJJld~SSMBY6BlX>})tiz(?XOCh8J9U<{%F*c;4R{A5mTDKe+e-8w#nR3 z^wj;Hm8`bAx6k>#f8NX7P91IK*$GGNQ&&Z?6m4FrGAT1DZll@CN+WgG)q3@@*S8(+ znfpUzv#s^vFRgiJb2M1|G(}Ul)Vycexi$CKE2YH0w&r&%o=E4{E5Hb zfA#D%ABMkf=I=cYr#J8!v*f(#7S`xEc<{r9j}zW@3D2rK;PZgHaoabg=e#yp} z_r~yH-)iR{$5u{tJ9eUf{_)cJn6qN~wr(KbmtQGX>w{v96*PbQW1+!Tce1hB9FW5cIefOm6)Gfn%ckF(ZWG=Kk zV<`6`+U?*4`va$fpM80srP$Q${p!c-&=*Zy4_NZfiw39$9FUplbK!)zt>4K>HFZIC zZ};|0kx&kK?R}#w{eN53|6ex+j?55QEyL#TWPbMyv$pK*j2n_}4zFZ4pJn@Y*Ynl= zYV8|o_g0t8`TLZOdFQ|Sf>o1r^A1+Xh6YU2C=hGPIbW1-$KU9azAvz1YDDH@pB2+i zFSwOy#Kjg448 z)!@UC&;L5yug;xvbsd{c*5i)jMQUCB(^|U(9DL&DUHf5t+Wl3y;G9GE3(9WRzOGN2 za(VBODSdl)tcVKw{&(w@dD20XOrxC^p9?=@ek|zCiJ~R)Er#rl^F7YDubs5$%Yn3G z&WFV#{W8KL)6TN2oMZQVxqsprvqcHPr8Cwh1TUX8Gq&`Oxz9QKvo04*SMSK~VER7M zz(H+6-D{TD3m4}GE^O3Q6F4Akab~LX)v`sRXVo556@~?jaB_C zr4khUj!*d#azrim-u0)?HR2z{u#`PvJtBQBq_OF~!uDUk-z+dT+$I^mnc>EoN3+-( z-_N`BWmlhb>f)XqB9$LnBo-IEnpNZ2oAJP(cV1Gw`qtTvW+wG=GoJc#*)mJ@f3=$% z+V*UJ^{vxQ^-qOE%KqNndR|V`dWoTI-p7u+M}Bv%{QpG8{Me^}Z^ok2i<0^ezlxjs zm3LYu_u;Oc|*-L=}@&G)}HHaWg1swM24HIo{ewEgt1dK@3KD<47TSiIN+Bznc?hlW4WZDbI6?#d2*fe>T!R(wqeT}v4tGc|kju#w# z`q0?GShwIdlUGj;%M#UW;hRaSnpI)XCSRHz@7p)+`8jX*s-s%-eIABh%4pk~?e(%w zY^vMtG`{#L=ih66h_vcks-LFQUi6W31LMIxeL|cM<20mY+Bv`J7*C5TJ2{=JAlYGd zZP8!X*>m_8E{lJ*|JrkrHihqRmo+G^-&Dw^V=vV9mofgHu)KWv5fkUxX0j{&8U8D} zzE%6dpj-TEOO$<^Qt4!-$?M$m8K>JgvadL+F4QH@Et(j$R_Baz>8HypY9BLfa$2=V zaPpkvwVTd&y>)HbmiBb!r6UXK4nJ+L{k2=PA3A>}S z?XXSkwb`)`XX#Adq_8N)CoFECarVh2-U^RyeUhkRI%2i*zh2StS;-e)u8H*6#5uvD z(lRn^QM|fO$IR1j@2srbus+O;S>`6sZ=Lh$-`6(X4as+@^pd zoR`_pJD&>>?Z5GR&v%i=n)ojz_fIgpP5ag^RotU%Zy8gN*K~6F$I~)N&v(eKxHEzG z;;f6+$#;C2BW$fE2ABqFMEMyMpG`hFX}9nchewIN3y){KxT0O<^ut(e_G0PV3;F#{ zc|7RlHghTe^UgEQzHxf#@1EK@Q#v=UxVyJ_ zO=IoKj;LdsP9EXS+cWvd{2Mk}IsQ`9?1P(YY|HfoM63KREs&iZ%;V6h7tQ|UR=Ve; zoS2YHN3+(isNXF!L15`W)?%3*Q)BzRBOixxeqm~jdmy14e)kMh~N=OUIhmlFPe zQ;yLxDJ~b?AdaK;czU6y-+0Wa(p@kXo z4ttb^CM5lZLnSxeQknMxzO9AOdku5 z+BjalT>kmi1=p7?!3!05(kq_}h;9+M8CdQjBYeX{tXM`*-edZSb1ct}*S>TK{_6VM zu`oq=uh$$&DYn?Hc+woV$5)PH&p0J0ma6m0QT;Oo2}OP<#gFKPZpUY zDiZ^Cg)HD*;az=s`_aAr@AglSW9@4-HFS2rrkwlfhl0qi$fWlH2{Zh98=C}cXRp1^ K@wY(GFbx2L){yT2 literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa87_bare-seed.der b/certs/mldsa/mldsa87_bare-seed.der new file mode 100644 index 0000000000000000000000000000000000000000..bf0dcc7c36efae130dad78daff8a0dd8955b990b GIT binary patch literal 52 zcmXpoVq#=4;AZ1YX!Br9WoBU(W>Huh-z;cyLrCcRZu|L(UVZX1``a~AH(ofmV>0u~ I!q{(W09Eo4TmS$7 literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa87_oqskeypair.der b/certs/mldsa/mldsa87_oqskeypair.der new file mode 100644 index 0000000000000000000000000000000000000000..d81717730772c5a64627466dec075f3d9fec57d4 GIT binary patch literal 7516 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 literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa87_priv-only.der b/certs/mldsa/mldsa87_priv-only.der new file mode 100644 index 0000000000000000000000000000000000000000..7b94ea37f95867bd0ca08975465326219f74abf0 GIT binary patch literal 4924 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 Nc<33C>{9DG2LQ)pp(y|W literal 0 HcmV?d00001 diff --git a/certs/mldsa/mldsa87_seed-only.der b/certs/mldsa/mldsa87_seed-only.der new file mode 100644 index 0000000000000000000000000000000000000000..6ec75512b722643297a10afd19693e77cf6433d0 GIT binary patch literal 54 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 E0J*Wb5C8xG literal 0 HcmV?d00001 From bbcdfe92e05f9abf99fbd676803fe5e43c20974c Mon Sep 17 00:00:00 2001 From: Koji Takeda Date: Mon, 28 Jul 2025 17:39:42 +0900 Subject: [PATCH 3/4] Disable exporting dilithium DER tests without WOLFSSL_ASN_TEMPLATE --- tests/api/test_mldsa.c | 34 +++++++++++++++++++++++++++++++++- wolfcrypt/src/asn.c | 5 +++++ wolfcrypt/test/test.c | 6 +++--- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/tests/api/test_mldsa.c b/tests/api/test_mldsa.c index 132b797c9..445412cff 100644 --- a/tests/api/test_mldsa.c +++ b/tests/api/test_mldsa.c @@ -3004,8 +3004,13 @@ int test_wc_dilithium_der(void) ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(NULL, NULL, 0 ), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); +#ifndef WOLFSSL_ASN_TEMPLATE + ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key , NULL, + 0 ), BAD_FUNC_ARG); +#else ExpectIntGT(wc_Dilithium_PrivateKeyToDer(key , NULL, 0 ), 0); +#endif ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(NULL, der , 0 ), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(NULL, NULL, @@ -3015,13 +3020,23 @@ int test_wc_dilithium_der(void) ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key , der , 0 ), WC_NO_ERR_TRACE(BUFFER_E)); /* Get length only. */ +#ifndef WOLFSSL_ASN_TEMPLATE + ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key , NULL, + DILITHIUM_MAX_DER_SIZE), BAD_FUNC_ARG); +#else ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key , NULL, DILITHIUM_MAX_DER_SIZE), privDerLen); +#endif ExpectIntEQ(wc_Dilithium_KeyToDer(NULL, NULL, 0 ), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); +#ifndef WOLFSSL_ASN_TEMPLATE + ExpectIntEQ(wc_Dilithium_KeyToDer(key , NULL, 0 ), + BAD_FUNC_ARG); +#else ExpectIntGT(wc_Dilithium_KeyToDer(key , NULL, 0 ), 0 ); +#endif ExpectIntEQ(wc_Dilithium_KeyToDer(NULL, der , 0 ), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); ExpectIntEQ(wc_Dilithium_KeyToDer(NULL, NULL, DILITHIUM_MAX_DER_SIZE), @@ -3031,8 +3046,13 @@ int test_wc_dilithium_der(void) ExpectIntEQ(wc_Dilithium_KeyToDer(key , der , 0 ), WC_NO_ERR_TRACE(BUFFER_E)); /* Get length only. */ +#ifndef WOLFSSL_ASN_TEMPLATE + ExpectIntEQ(wc_Dilithium_KeyToDer(key , NULL, DILITHIUM_MAX_DER_SIZE), + BAD_FUNC_ARG); +#else ExpectIntEQ(wc_Dilithium_KeyToDer(key , NULL, DILITHIUM_MAX_DER_SIZE), keyDerLen); +#endif ExpectIntEQ(wc_Dilithium_PublicKeyDecode(NULL, NULL, NULL, 0 ), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); @@ -3081,15 +3101,25 @@ int test_wc_dilithium_der(void) idx = 0; ExpectIntEQ(wc_Dilithium_PublicKeyDecode(der, &idx, key, len), 0); +#ifndef WOLFSSL_ASN_TEMPLATE + ExpectIntEQ(len = wc_Dilithium_PrivateKeyToDer(key, der, + DILITHIUM_MAX_DER_SIZE), BAD_FUNC_ARG); +#else ExpectIntEQ(len = wc_Dilithium_PrivateKeyToDer(key, der, DILITHIUM_MAX_DER_SIZE), privDerLen); idx = 0; ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der, &idx, key, len), 0); +#endif +#ifndef WOLFSSL_ASN_TEMPLATE + ExpectIntEQ(len = wc_Dilithium_KeyToDer(key, der, DILITHIUM_MAX_DER_SIZE), + BAD_FUNC_ARG); +#else ExpectIntEQ(len = wc_Dilithium_KeyToDer(key, der, DILITHIUM_MAX_DER_SIZE), keyDerLen); idx = 0; ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der, &idx, key, len), 0); +#endif wc_dilithium_free(key); @@ -3097,6 +3127,8 @@ int test_wc_dilithium_der(void) XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); + + (void)keyDerLen; #endif return EXPECT_RESULT(); } @@ -16878,7 +16910,7 @@ int test_mldsa_pkcs8_export_import_wolfSSL_form(void) (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) && \ !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) && \ !defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ - !defined(WOLFSSL_DILITHIUM_NO_ASN1) + !defined(WOLFSSL_DILITHIUM_NO_ASN1) && defined(WOLFSSL_ASN_TEMPLATE) WOLFSSL_CTX* ctx = NULL; size_t i; diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index bd448c355..d1e892dcc 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -37583,6 +37583,11 @@ int SetAsymKeyDer(const byte* privKey, word32 privKeyLen, } #ifndef WOLFSSL_ASN_TEMPLATE + if (privKeyLen >= 128 || pubKeyLen >= 128) { + /* privKeyLen and pubKeyLen are assumed to be less than 128 */ + return BAD_FUNC_ARG; + } + /* calculate size */ if (pubKey) { pubSz = 2 + pubKeyLen; diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index c05cb23cd..a0850bbd9 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -46932,7 +46932,7 @@ static wc_test_ret_t test_dilithium_decode_level(const byte* rawKey, int isPublicOnlyKey) { int ret = 0; -#ifndef WOLFSSL_DILITHIUM_NO_ASN1 +#if !defined(WOLFSSL_DILITHIUM_NO_ASN1) && defined(WOLFSSL_ASN_TEMPLATE) /* Size the buffer to accommodate the largest encoded key size */ const word32 maxDerSz = DILITHIUM_MAX_PRV_KEY_DER_SIZE; word32 derSz; @@ -46982,7 +46982,7 @@ static wc_test_ret_t test_dilithium_decode_level(const byte* rawKey, #endif } -#ifndef WOLFSSL_DILITHIUM_NO_ASN1 +#if !defined(WOLFSSL_DILITHIUM_NO_ASN1) && defined(WOLFSSL_ASN_TEMPLATE) /* Export raw key as DER */ if (ret == 0) { #ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY @@ -47056,7 +47056,7 @@ static wc_test_ret_t test_dilithium_decode_level(const byte* rawKey, ret = WC_TEST_RET_ENC_NC; } #endif /* !WOLFSSL_DILITHIUM_FIPS204_DRAFT */ -#endif /* WOLFSSL_DILITHIUM_NO_ASN1 */ +#endif /* !WOLFSSL_DILITHIUM_NO_ASN1 && WOLFSSL_ASN_TEMPLATE */ /* Cleanup */ wc_dilithium_free(key); From 189ba201f302f38604485712daa0430203eb8d86 Mon Sep 17 00:00:00 2001 From: Koji Takeda Date: Tue, 29 Jul 2025 07:15:32 +0900 Subject: [PATCH 4/4] Follow copilot review --- wolfcrypt/src/asn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index d1e892dcc..b9edf8e30 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -37074,7 +37074,7 @@ int DecodeAsymKey_Assign(const byte* input, word32* inOutIdx, word32 inSz, allowSeed = (seed != NULL && seedLen != NULL); #ifndef WOLFSSL_ASN_TEMPLATE - /* The seed can't be parsed without WOLF_ASN_TEMPLATE */ + /* The seed can't be parsed without WOLFSSL_ASN_TEMPLATE */ if (allowSeed) { return ASN_PARSE_E; }