From 681f53a5e92d3732faf6fd04c8e33a991423daed Mon Sep 17 00:00:00 2001 From: Alexis Date: Fri, 13 Mar 2026 04:35:09 -0400 Subject: [PATCH 1/3] Add more MLDSA test vectors --- docs/development/custom-vectors/mldsa.rst | 18 ++++++++++++++++++ docs/development/test-vectors.rst | 4 ++++ .../asymmetric/MLDSA/mldsa44_priv.der | Bin 0 -> 54 bytes .../asymmetric/MLDSA/mldsa44_pub.der | Bin 0 -> 1334 bytes .../asymmetric/MLDSA/mldsa65_noseed_priv.der | Bin 0 -> 22 bytes 5 files changed, 22 insertions(+) create mode 100644 docs/development/custom-vectors/mldsa.rst create mode 100644 vectors/cryptography_vectors/asymmetric/MLDSA/mldsa44_priv.der create mode 100644 vectors/cryptography_vectors/asymmetric/MLDSA/mldsa44_pub.der create mode 100644 vectors/cryptography_vectors/asymmetric/MLDSA/mldsa65_noseed_priv.der diff --git a/docs/development/custom-vectors/mldsa.rst b/docs/development/custom-vectors/mldsa.rst new file mode 100644 index 000000000000..567585dd15c5 --- /dev/null +++ b/docs/development/custom-vectors/mldsa.rst @@ -0,0 +1,18 @@ +ML-DSA vector creation +====================== + +This page documents the ML-DSA test vectors. These vectors are used to verify: + +* Unsupported ML-DSA variants (i.e. variants other than ML-DSA-65) are + correctly rejected when loading keys. +* ML-DSA-65 private keys without a seed are correctly rejected. + +ML-DSA-44 public key +-------------------- + +The public key was derived from the private key using the OpenSSL CLI +(requires OpenSSL 3.5+): + +.. code-block:: console + + $ openssl pkey -in mldsa44_priv.der -inform DER -pubout -outform DER -out mldsa44_pub.der diff --git a/docs/development/test-vectors.rst b/docs/development/test-vectors.rst index 41f31a1ed0a2..5d57940e2ab9 100644 --- a/docs/development/test-vectors.rst +++ b/docs/development/test-vectors.rst @@ -65,6 +65,8 @@ Asymmetric ciphers * ``asymmetric/PKCS8/ed25519-scrypt.pem`` a PKCS8 encoded Ed25519 key from RustCrypto using scrypt as the KDF. The password is ``hunter42``. * FIPS 204 ML-DSA-{44,65,87} KAT vectors from `post-quantum-cryptography/KAT`_. +* ML-DSA-44 PKCS#8 and SPKI DER test vectors generated by this project. + See :doc:`/development/custom-vectors/mldsa` Custom asymmetric vectors ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -74,6 +76,7 @@ Custom asymmetric vectors custom-vectors/secp256k1 custom-vectors/rsa-oaep-sha2 + custom-vectors/mldsa * ``asymmetric/PEM_Serialization/ec_private_key.pem`` and ``asymmetric/DER_Serialization/ec_private_key.der`` - Contains an Elliptic @@ -1216,6 +1219,7 @@ Created Vectors custom-vectors/idea custom-vectors/seed custom-vectors/hkdf + custom-vectors/mldsa custom-vectors/rc2 diff --git a/vectors/cryptography_vectors/asymmetric/MLDSA/mldsa44_priv.der b/vectors/cryptography_vectors/asymmetric/MLDSA/mldsa44_priv.der new file mode 100644 index 0000000000000000000000000000000000000000..244192344fdcd20657b0cbd3664dde621477f6e3 GIT binary patch literal 54 fcmXpoVPa%3;AZ1YX!Br9WoBU(WKn8R&>{c;-1P`& literal 0 HcmV?d00001 diff --git a/vectors/cryptography_vectors/asymmetric/MLDSA/mldsa44_pub.der b/vectors/cryptography_vectors/asymmetric/MLDSA/mldsa44_pub.der new file mode 100644 index 0000000000000000000000000000000000000000..2598b11b9404d679d0a043f27a2b1c06dbb24e9d GIT binary patch literal 1334 zcmV-61 z|FDLsro)-Bl%+2YL1f8q_@bplH{K*Q3WjT67O#;CZenoLqiUW?HkDp8MD$E!f`I#_#8yEGaqCj2##he zXv4P9Wz?G z#=tgkt@w9G-RS^Q_02{1(+@+W+&oYW>t&D5BU~2}K)T8sS`>3VcT1EO#X$8wxHN&U z$%90(Dnkk8A}a{lctZqdNpKJ`OmAz9uVpqIAz=nNQgx<%bpYGJAor1sZ;iLAWBQg` zN+QP%$d7V;c8ub`$60^Wa2QS;S*Eh#AWX=^&{D;e)ps5Y%#8aPA4da=90qdme6L4G zRxLetsex~?-tjpc@bF*FzbX#4!WzO$Cg)D%0~0=gr;`)iuq+>=hQ{3;LIIUDJ~|Le z|7~E1e{%%-o;$UhwO@h_*jp4u#ZHH z1DWplIyMV~L=L^!>TUtaQCZ`2TeLuh0LrI@%0Nkp9CIM^a5VC?5;{WG3v1o)08 zy3?|VMQD5C%##%J0R5$JIA-Eq? zFUt6G+4u#PWFnQ;Ze3sjAB;5y#uCfQ|Qkp;>9l%?=qCH=bYL=k6r(h zJfI;Oc%1Ca9lL)`UiFp3-j!+??fJ_NxlXER(utFfGu@``$89CCU&}a!D|iFX<}V1@`_OQe zd`@o@NpqG=oxlm0T!jJW*!M1e!iCi+pWO%cO=7I7mp8CE@29EJ(REjRYtNnC&uJ)k suQ=yYW4^v5Qx#k09|t4CbU2DrD!wV*a3kX<2wzN{+ChVxdox$7okVhl!2kdN literal 0 HcmV?d00001 diff --git a/vectors/cryptography_vectors/asymmetric/MLDSA/mldsa65_noseed_priv.der b/vectors/cryptography_vectors/asymmetric/MLDSA/mldsa65_noseed_priv.der new file mode 100644 index 0000000000000000000000000000000000000000..48ef3be4e83b21acf050e81143d14259ed01ffff GIT binary patch literal 22 dcmXpIVPa%3;AZ1YX!Br9WoBU(Vqr310014j0(bxb literal 0 HcmV?d00001 From 3b948fabae88f324c3f62ed5625205c663caf90f Mon Sep 17 00:00:00 2001 From: Alexis Date: Fri, 13 Mar 2026 09:57:07 -0400 Subject: [PATCH 2/3] Simplify docs --- docs/development/custom-vectors/mldsa.rst | 18 ------------------ docs/development/test-vectors.rst | 8 ++++---- 2 files changed, 4 insertions(+), 22 deletions(-) delete mode 100644 docs/development/custom-vectors/mldsa.rst diff --git a/docs/development/custom-vectors/mldsa.rst b/docs/development/custom-vectors/mldsa.rst deleted file mode 100644 index 567585dd15c5..000000000000 --- a/docs/development/custom-vectors/mldsa.rst +++ /dev/null @@ -1,18 +0,0 @@ -ML-DSA vector creation -====================== - -This page documents the ML-DSA test vectors. These vectors are used to verify: - -* Unsupported ML-DSA variants (i.e. variants other than ML-DSA-65) are - correctly rejected when loading keys. -* ML-DSA-65 private keys without a seed are correctly rejected. - -ML-DSA-44 public key --------------------- - -The public key was derived from the private key using the OpenSSL CLI -(requires OpenSSL 3.5+): - -.. code-block:: console - - $ openssl pkey -in mldsa44_priv.der -inform DER -pubout -outform DER -out mldsa44_pub.der diff --git a/docs/development/test-vectors.rst b/docs/development/test-vectors.rst index 5d57940e2ab9..69a6d006a607 100644 --- a/docs/development/test-vectors.rst +++ b/docs/development/test-vectors.rst @@ -65,8 +65,6 @@ Asymmetric ciphers * ``asymmetric/PKCS8/ed25519-scrypt.pem`` a PKCS8 encoded Ed25519 key from RustCrypto using scrypt as the KDF. The password is ``hunter42``. * FIPS 204 ML-DSA-{44,65,87} KAT vectors from `post-quantum-cryptography/KAT`_. -* ML-DSA-44 PKCS#8 and SPKI DER test vectors generated by this project. - See :doc:`/development/custom-vectors/mldsa` Custom asymmetric vectors ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -76,7 +74,6 @@ Custom asymmetric vectors custom-vectors/secp256k1 custom-vectors/rsa-oaep-sha2 - custom-vectors/mldsa * ``asymmetric/PEM_Serialization/ec_private_key.pem`` and ``asymmetric/DER_Serialization/ec_private_key.der`` - Contains an Elliptic @@ -303,6 +300,10 @@ Custom asymmetric vectors encrypted with ``pbeWithSHA1And128BitRC4``. The password is ``password``. * ``asymmetric/PKCS8/enc-rsa-pkcs8-pbkdf2-0iter.pem`` a PKCS8 encoded structure with an invalid PBKDF2 iteration count (zero). +* ``asymmetric/MLDSA/mldsa44_pub.der`` and ``asymmetric/MLDSA/mldsa44_priv.der`` + a PKCS8 encoded key pair for ML-DSA-44 generated by OpenSSL. +* ``asymmetric/MLDSA/mldsa65_noseed_priv.der`` a PKCS8 encoded ML-DSA-65 private + key serialized without the seed. Key exchange ~~~~~~~~~~~~ @@ -1219,7 +1220,6 @@ Created Vectors custom-vectors/idea custom-vectors/seed custom-vectors/hkdf - custom-vectors/mldsa custom-vectors/rc2 From cbaee1372df4c3ec55c76647a7ca2c57e6125148 Mon Sep 17 00:00:00 2001 From: Alexis Date: Mon, 23 Mar 2026 11:00:04 -0400 Subject: [PATCH 3/3] Update vector to have a private key --- .../asymmetric/MLDSA/mldsa65_noseed_priv.der | Bin 22 -> 4060 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/vectors/cryptography_vectors/asymmetric/MLDSA/mldsa65_noseed_priv.der b/vectors/cryptography_vectors/asymmetric/MLDSA/mldsa65_noseed_priv.der index 48ef3be4e83b21acf050e81143d14259ed01ffff..ee05f2940e9426631280c4bc76a1c9230022d403 100644 GIT binary patch literal 4060 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 literal 22 dcmXpIVPa%3;AZ1YX!Br9WoBU(Vqr310014j0(bxb