DPDK patches and discussions
 help / color / mirror / Atom feed
* [RFC] cryptodev: support PQC ML algorithms
@ 2025-08-28  7:06 Gowrishankar Muthukrishnan
  2025-09-30 18:03 ` [PATCH v1 0/3] " Gowrishankar Muthukrishnan
  0 siblings, 1 reply; 10+ messages in thread
From: Gowrishankar Muthukrishnan @ 2025-08-28  7:06 UTC (permalink / raw)
  To: dev, Akhil Goyal, Fan Zhang; +Cc: anoobj, Gowrishankar Muthukrishnan

Add support for PQC ML-KEM and ML-DSA algorithms.

Signed-off-by: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
---
 lib/cryptodev/rte_crypto_asym.h | 262 ++++++++++++++++++++++++++++++++
 lib/cryptodev/rte_cryptodev.c   |  39 +++++
 2 files changed, 301 insertions(+)

diff --git a/lib/cryptodev/rte_crypto_asym.h b/lib/cryptodev/rte_crypto_asym.h
index 9787b710e7..102dd4dc09 100644
--- a/lib/cryptodev/rte_crypto_asym.h
+++ b/lib/cryptodev/rte_crypto_asym.h
@@ -37,6 +37,14 @@ rte_crypto_asym_ke_strings[];
 extern const char *
 rte_crypto_asym_op_strings[];
 
+/** PQC ML crypto op parameters size */
+extern const uint16_t
+rte_crypto_ml_pubkey_size[];
+extern const uint16_t
+rte_crypto_ml_privkey_size[];
+extern const uint16_t
+rte_crypto_ml_output_size[];
+
 #ifdef __cplusplus
 }
 #endif
@@ -720,6 +728,252 @@ struct rte_crypto_sm2_op_param {
 	 */
 };
 
+/**
+ * PQC ML algorithms
+ *
+ * List of ML algorithms used in PQC
+ */
+enum rte_crypto_ml_param_set {
+	RTE_CRYPTO_ML_PARAM_NONE,
+	RTE_CRYPTO_ML_KEM_PARAM_512,
+	RTE_CRYPTO_ML_KEM_PARAM_768,
+	RTE_CRYPTO_ML_KEM_PARAM_1024,
+	RTE_CRYPTO_ML_DSA_PARAM_44,
+	RTE_CRYPTO_ML_DSA_PARAM_65,
+	RTE_CRYPTO_ML_DSA_PARAM_87,
+};
+
+/**
+ * PQC ML op types
+ *
+ * List of ML op types in PQC
+ */
+enum rte_crypto_ml_op {
+	RTE_CRYPTO_ML_OP_NONE,
+	RTE_CRYPTO_ML_KEM_OP_KEYGEN,
+	RTE_CRYPTO_ML_KEM_OP_KEYVER,
+	RTE_CRYPTO_ML_KEM_OP_ENCAP,
+	RTE_CRYPTO_ML_KEM_OP_DECAP,
+	RTE_CRYPTO_ML_DSA_OP_KEYGEN,
+	RTE_CRYPTO_ML_DSA_OP_SIGN,
+	RTE_CRYPTO_ML_DSA_OP_VERIFY,
+};
+
+/**
+ * PQC ML-KEM transform data
+ *
+ * Structure describing ML-KEM xform params
+ */
+struct rte_crypto_ml_kem_xform {
+	enum rte_crypto_ml_param_set param;
+};
+
+/**
+ * PQC ML-KEM KEYGEN op
+ *
+ * Parameters for PQC ML-KEM key generation operation
+ */
+struct rte_crypto_ml_kem_keygen_op {
+	rte_crypto_param d;
+	/**< The seed d value (of 32 bytes in length) to generate key pair.*/
+
+	rte_crypto_param z;
+	/**< The seed z value (of 32 bytes in length) to generate key pair.*/
+
+	rte_crypto_param ek;
+	/**<
+	 * Pointer to output data
+	 * - The computed encapsulation key.
+	 * - Refer `rte_crypto_ml_pubkey_size` for size of buffer.
+	 */
+
+	rte_crypto_param dk;
+	/**<
+	 * Pointer to output data
+	 * - The computed decapsulation key.
+	 * - Refer `rte_crypto_ml_privkey_size` for size of buffer.
+	 */
+};
+
+/**
+ * PQC ML-KEM KEYVER op
+ *
+ * Parameters for PQC ML-KEM key verification operation
+ */
+struct rte_crypto_ml_kem_keyver_op {
+	enum rte_crypto_ml_op op;
+	/**<
+	 * Op associated with key to be verified is one of below:
+	 * - Encapsulation op
+	 * - Decapsulation op
+	 */
+
+	rte_crypto_param key;
+	/**<
+	 * KEM key to check.
+	 * - ek in case of encapsulation op.
+	 * - dk in case of decapsulation op.
+	 */
+};
+
+/**
+ * PQC ML-KEM ENCAP op
+ *
+ * Parameters for PQC ML-KEM encapsulation operation
+ */
+struct rte_crypto_ml_kem_encap_op {
+	rte_crypto_param message;
+	/**< The message to be encapsulated.*/
+
+	rte_crypto_param ek;
+	/**< The encapsulation key.*/
+
+	rte_crypto_param cipher;
+	/**<
+	 * Pointer to output data
+	 * - The computed cipher.
+	 * - Refer `rte_crypto_ml_output_size` for size of buffer.
+	 */
+
+	rte_crypto_param sk;
+	/**<
+	 * Pointer to output data
+	 * - The computed shared secret key.
+	 * - Refer `rte_crypto_ml_pubkey_size` for size of buffer.
+	 */
+};
+
+/**
+ * PQC ML-KEM DECAP op
+ *
+ * Parameters for PQC ML-KEM decapsulation operation
+ */
+struct rte_crypto_ml_kem_decap_op {
+	rte_crypto_param cipher;
+	/**< The cipher to be decapsulated.*/
+
+	rte_crypto_param dk;
+	/**< The decapsulation key.*/
+
+	rte_crypto_param sk;
+	/**<
+	 * Pointer to output data
+	 * - The computed shared secret key.
+	 * - Refer `rte_crypto_ml_pubkey_size` for size of buffer.
+	 */
+};
+
+/**
+ * PQC ML-KEM op
+ *
+ * Parameters for PQC ML-KEM operation
+ */
+struct rte_crypto_ml_kem_op {
+	enum rte_crypto_ml_op op;
+	union {
+		struct rte_crypto_ml_kem_keygen_op keygen;
+		struct rte_crypto_ml_kem_keyver_op keyver;
+		struct rte_crypto_ml_kem_encap_op encap;
+		struct rte_crypto_ml_kem_decap_op decap;
+	};
+};
+
+/**
+ * PQC ML-DSA transform data
+ *
+ * Structure describing ML-DSA xform params
+ */
+struct rte_crypto_ml_dsa_xform {
+	enum rte_crypto_ml_param_set param;
+
+	bool random_seed;
+	/**< The signature generated using random seed (of 32 bytes in length). */
+
+	bool sign_prehash;
+	/**< The signature genearated using prehash or pure routine. */
+};
+
+/**
+ * PQC ML-DSA KEYGEN op
+ *
+ * Parameters for PQC ML-DSA key generation operation
+ */
+struct rte_crypto_ml_dsa_keygen_op {
+	rte_crypto_param seed;
+	/**< The random seed (of 32 bytes in length) to generate key pair.*/
+};
+
+/**
+ * PQC ML-DSA SIGGEN op
+ *
+ * Parameters for PQC ML-DSA sign operation
+ */
+struct rte_crypto_ml_dsa_siggen_op {
+	rte_crypto_param message;
+	/**< The message to generate signature.*/
+
+	rte_crypto_param mu;
+	/**< The mu to generate signature.*/
+
+	rte_crypto_param sk;
+	/**< The secret key to generate signature.*/
+
+	rte_crypto_param seed;
+	/**< The seed to generate signature.*/
+
+	rte_crypto_param ctx;
+	/**< The context key to generate signature.*/
+
+	enum rte_crypto_auth_algorithm hash;
+	/**< Hash function to generate signature. */
+
+	rte_crypto_param sign;
+	/**<
+	 * Pointer to output data
+	 * - The computed signature.
+	 * - Refer `rte_crypto_ml_output_size` for size of buffer.
+	 */
+};
+
+/**
+ * PQC ML-DSA SIGVER op
+ *
+ * Parameters for PQC ML-DSA verify operation
+ */
+struct rte_crypto_ml_dsa_sigver_op {
+	rte_crypto_param pubkey;
+	/**< The public key to verify signature.*/
+
+	rte_crypto_param message;
+	/**< The message used to verify signature.*/
+
+	rte_crypto_param sign;
+	/**< The signature to verify.*/
+
+	rte_crypto_param mu;
+	/**< The mu used to generate signature.*/
+
+	rte_crypto_param ctx;
+	/**< The context key to generate signature.*/
+
+	enum rte_crypto_auth_algorithm hash;
+	/**< Hash function to generate signature. */
+};
+
+/**
+ * PQC ML-DSA op
+ *
+ * Parameters for PQC ML-DSA operation
+ */
+struct rte_crypto_ml_dsa_op {
+	enum rte_crypto_ml_op op;
+	union {
+		struct rte_crypto_ml_dsa_keygen_op keygen;
+		struct rte_crypto_ml_dsa_siggen_op siggen;
+		struct rte_crypto_ml_dsa_sigver_op sigver;
+	};
+};
+
 /**
  * Asymmetric crypto transform data
  *
@@ -751,6 +1005,12 @@ struct rte_crypto_asym_xform {
 		/**< EC xform parameters, used by elliptic curve based
 		 * operations.
 		 */
+
+		struct rte_crypto_ml_kem_xform mlkem;
+		/**< PQC ML-KEM xform parameters */
+
+		struct rte_crypto_ml_dsa_xform mldsa;
+		/**< PQC ML-DSA xform parameters */
 	};
 };
 
@@ -778,6 +1038,8 @@ struct rte_crypto_asym_op {
 		struct rte_crypto_ecpm_op_param ecpm;
 		struct rte_crypto_sm2_op_param sm2;
 		struct rte_crypto_eddsa_op_param eddsa;
+		struct rte_crypto_ml_kem_op mlkem;
+		struct rte_crypto_ml_dsa_op mldsa;
 	};
 	uint16_t flags;
 	/**<
diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c
index bb7bab4dd5..aeb6e1640d 100644
--- a/lib/cryptodev/rte_cryptodev.c
+++ b/lib/cryptodev/rte_cryptodev.c
@@ -229,6 +229,45 @@ const char *rte_crypto_asym_ke_strings[] = {
 	[RTE_CRYPTO_ASYM_KE_PUB_KEY_VERIFY] = "pub_ec_key_verify"
 };
 
+/**
+ * Public key size used in PQC ML based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_pubkey_size)
+const uint16_t rte_crypto_ml_pubkey_size[] = {
+	[RTE_CRYPTO_ML_KEM_PARAM_512] = 800,
+	[RTE_CRYPTO_ML_KEM_PARAM_768] = 1184,
+	[RTE_CRYPTO_ML_KEM_PARAM_1024] = 1568,
+	[RTE_CRYPTO_ML_DSA_PARAM_44] = 1312,
+	[RTE_CRYPTO_ML_DSA_PARAM_65] = 1952,
+	[RTE_CRYPTO_ML_DSA_PARAM_87] = 2592,
+};
+
+/**
+ * Private key size used in PQC ML based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_privkey_size)
+const uint16_t rte_crypto_ml_privkey_size[] = {
+	[RTE_CRYPTO_ML_KEM_PARAM_512] = 1632,
+	[RTE_CRYPTO_ML_KEM_PARAM_768] = 2400,
+	[RTE_CRYPTO_ML_KEM_PARAM_1024] = 3168,
+	[RTE_CRYPTO_ML_DSA_PARAM_44] = 2560,
+	[RTE_CRYPTO_ML_DSA_PARAM_65] = 4032,
+	[RTE_CRYPTO_ML_DSA_PARAM_87] = 4896,
+};
+
+/**
+ * Output buffer size used in PQC ML based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_output_size)
+const uint16_t rte_crypto_ml_output_size[] = {
+	[RTE_CRYPTO_ML_KEM_PARAM_512] = 768,
+	[RTE_CRYPTO_ML_KEM_PARAM_768] = 1088,
+	[RTE_CRYPTO_ML_KEM_PARAM_1024] = 1568,
+	[RTE_CRYPTO_ML_DSA_PARAM_44] = 2420,
+	[RTE_CRYPTO_ML_DSA_PARAM_65] = 3309,
+	[RTE_CRYPTO_ML_DSA_PARAM_87] = 4627,
+};
+
 struct rte_cryptodev_sym_session_pool_private_data {
 	uint16_t sess_data_sz;
 	/**< driver session data size */
-- 
2.37.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v1 0/3] cryptodev: support PQC ML algorithms
  2025-08-28  7:06 [RFC] cryptodev: support PQC ML algorithms Gowrishankar Muthukrishnan
@ 2025-09-30 18:03 ` Gowrishankar Muthukrishnan
  2025-09-30 18:03   ` [PATCH v1 1/3] " Gowrishankar Muthukrishnan
                     ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: Gowrishankar Muthukrishnan @ 2025-09-30 18:03 UTC (permalink / raw)
  To: dev, Akhil Goyal, Fan Zhang, Kai Ji; +Cc: anoobj, Gowrishankar Muthukrishnan

This series added support for PQC ML-KEM and ML-DSA algorithms.

Gowrishankar Muthukrishnan (3):
  cryptodev: support PQC ML algorithms
  crypto/openssl: add ML crypto support
  app/test: add ML crypto test vectors

 app/test/test_cryptodev_asym.c                |  856 ++++++++
 app/test/test_cryptodev_ml_dsa_test_vectors.h | 1856 +++++++++++++++++
 app/test/test_cryptodev_ml_kem_test_vectors.h |  873 ++++++++
 doc/guides/cryptodevs/features/default.ini    |    2 +
 doc/guides/cryptodevs/features/openssl.ini    |    2 +
 doc/guides/prog_guide/cryptodev_lib.rst       |    3 +-
 doc/guides/rel_notes/release_25_11.rst        |   11 +
 drivers/crypto/openssl/openssl_pmd_private.h  |   16 +
 drivers/crypto/openssl/rte_openssl_pmd.c      |  868 ++++++++
 drivers/crypto/openssl/rte_openssl_pmd_ops.c  |  129 ++
 lib/cryptodev/rte_crypto_asym.h               |  306 +++
 lib/cryptodev/rte_cryptodev.c                 |   60 +
 lib/cryptodev/rte_cryptodev.h                 |   15 +-
 13 files changed, 4994 insertions(+), 3 deletions(-)
 create mode 100644 app/test/test_cryptodev_ml_dsa_test_vectors.h
 create mode 100644 app/test/test_cryptodev_ml_kem_test_vectors.h

-- 
2.37.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v1 1/3] cryptodev: support PQC ML algorithms
  2025-09-30 18:03 ` [PATCH v1 0/3] " Gowrishankar Muthukrishnan
@ 2025-09-30 18:03   ` Gowrishankar Muthukrishnan
  2025-09-30 18:03   ` [PATCH v1 2/3] crypto/openssl: add ML crypto support Gowrishankar Muthukrishnan
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Gowrishankar Muthukrishnan @ 2025-09-30 18:03 UTC (permalink / raw)
  To: dev, Akhil Goyal, Fan Zhang, Kai Ji; +Cc: anoobj, Gowrishankar Muthukrishnan

Add support for PQC ML-KEM and ML-DSA algorithms.

Signed-off-by: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
---
 doc/guides/cryptodevs/features/default.ini |   2 +
 doc/guides/prog_guide/cryptodev_lib.rst    |   3 +-
 doc/guides/rel_notes/release_25_11.rst     |  11 +
 lib/cryptodev/rte_crypto_asym.h            | 306 +++++++++++++++++++++
 lib/cryptodev/rte_cryptodev.c              |  60 ++++
 lib/cryptodev/rte_cryptodev.h              |  15 +-
 6 files changed, 394 insertions(+), 3 deletions(-)

diff --git a/doc/guides/cryptodevs/features/default.ini b/doc/guides/cryptodevs/features/default.ini
index 116ffce249..64198f013a 100644
--- a/doc/guides/cryptodevs/features/default.ini
+++ b/doc/guides/cryptodevs/features/default.ini
@@ -134,6 +134,8 @@ ECPM                    =
 ECDH                    =
 SM2                     =
 EdDSA                   =
+ML-DSA                  =
+ML-KEM                  =
 
 ;
 ; Supported Operating systems of a default crypto driver.
diff --git a/doc/guides/prog_guide/cryptodev_lib.rst b/doc/guides/prog_guide/cryptodev_lib.rst
index b54efcb74e..f0ee44eb54 100644
--- a/doc/guides/prog_guide/cryptodev_lib.rst
+++ b/doc/guides/prog_guide/cryptodev_lib.rst
@@ -928,7 +928,8 @@ Asymmetric Cryptography
 The cryptodev library currently provides support for the following asymmetric
 Crypto operations; RSA, Modular exponentiation and inversion, Diffie-Hellman and
 Elliptic Curve Diffie-Hellman public and/or private key generation and shared
-secret compute, DSA and EdDSA signature generation and verification.
+secret compute, DSA and EdDSA signature generation and verification,
+PQC ML-KEM and ML-DSA algorithms.
 
 Session and Session Management
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/guides/rel_notes/release_25_11.rst b/doc/guides/rel_notes/release_25_11.rst
index c3b94e1896..9d47f762d7 100644
--- a/doc/guides/rel_notes/release_25_11.rst
+++ b/doc/guides/rel_notes/release_25_11.rst
@@ -76,6 +76,14 @@ New Features
   * Added multi-process per port.
   * Optimized code.
 
+* **Added PQC ML-KEM and ML-DSA support.**
+
+  * Added PQC ML-KEM support with reference to FIPS203.
+  * Added PQC ML-DSA support with reference to FIPS204.
+
+* **Updated openssl crypto driver.**
+
+  * Added support for PQC ML-KEM and ML-DSA algorithms.
 
 Removed Items
 -------------
@@ -138,6 +146,9 @@ ABI Changes
 * stack: The structure ``rte_stack_lf_head`` alignment has been updated to 16 bytes
   to avoid unaligned accesses.
 
+* cryptodev: The enum ``rte_crypto_asym_xform_type``, struct ``rte_crypto_asym_xform``
+  and struct ``rte_crypto_asym_op`` are updated to include new values to support
+  ML-KEM and ML-DSA.
 
 Known Issues
 ------------
diff --git a/lib/cryptodev/rte_crypto_asym.h b/lib/cryptodev/rte_crypto_asym.h
index 9787b710e7..14a0e57467 100644
--- a/lib/cryptodev/rte_crypto_asym.h
+++ b/lib/cryptodev/rte_crypto_asym.h
@@ -37,6 +37,20 @@ rte_crypto_asym_ke_strings[];
 extern const char *
 rte_crypto_asym_op_strings[];
 
+/** PQC ML crypto op parameters size */
+extern const uint16_t
+rte_crypto_ml_kem_pubkey_size[];
+extern const uint16_t
+rte_crypto_ml_kem_privkey_size[];
+extern const uint16_t
+rte_crypto_ml_kem_cipher_size[];
+extern const uint16_t
+rte_crypto_ml_dsa_pubkey_size[];
+extern const uint16_t
+rte_crypto_ml_dsa_privkey_size[];
+extern const uint16_t
+rte_crypto_ml_dsa_sign_size[];
+
 #ifdef __cplusplus
 }
 #endif
@@ -144,6 +158,14 @@ enum rte_crypto_asym_xform_type {
 	/**< Edwards Curve Digital Signature Algorithm
 	 * Perform Signature Generation and Verification.
 	 */
+	RTE_CRYPTO_ASYM_XFORM_ML_KEM,
+	/**< Module Lattice based Key Encapsulation Mechanism
+	 * Performs Key Pair Generation, Encapsulation and Decapsulation.
+	 */
+	RTE_CRYPTO_ASYM_XFORM_ML_DSA
+	/**< Module Lattice based Digital Signature Algorithm
+	 * Performs Key Pair Generation, Signature Generation and Verification.
+	 */
 };
 
 /**
@@ -720,6 +742,282 @@ struct rte_crypto_sm2_op_param {
 	 */
 };
 
+/**
+ * PQC ML-KEM algorithms
+ *
+ * List of ML-KEM algorithms used in PQC
+ */
+enum rte_crypto_ml_kem_param_set {
+	RTE_CRYPTO_ML_KEM_PARAM_NONE,
+	RTE_CRYPTO_ML_KEM_PARAM_512,
+	RTE_CRYPTO_ML_KEM_PARAM_768,
+	RTE_CRYPTO_ML_KEM_PARAM_1024,
+};
+
+/**
+ * PQC ML-KEM op types
+ *
+ * List of ML-KEM op types in PQC
+ */
+enum rte_crypto_ml_kem_op_type {
+	RTE_CRYPTO_ML_KEM_OP_KEYGEN,
+	RTE_CRYPTO_ML_KEM_OP_KEYVER,
+	RTE_CRYPTO_ML_KEM_OP_ENCAP,
+	RTE_CRYPTO_ML_KEM_OP_DECAP,
+	RTE_CRYPTO_ML_KEM_OP_END
+};
+
+/**
+ * PQC ML-KEM transform data
+ *
+ * Structure describing ML-KEM xform params
+ */
+struct rte_crypto_ml_kem_xform {
+	enum rte_crypto_ml_kem_param_set param;
+};
+
+/**
+ * PQC ML-KEM KEYGEN op
+ *
+ * Parameters for PQC ML-KEM key generation operation
+ */
+struct rte_crypto_ml_kem_keygen_op {
+	rte_crypto_param d;
+	/**< The seed d value (of 32 bytes in length) to generate key pair.*/
+
+	rte_crypto_param z;
+	/**< The seed z value (of 32 bytes in length) to generate key pair.*/
+
+	rte_crypto_param ek;
+	/**<
+	 * Pointer to output data
+	 * - The computed encapsulation key.
+	 * - Refer `rte_crypto_ml_kem_pubkey_size` for size of buffer.
+	 */
+
+	rte_crypto_param dk;
+	/**<
+	 * Pointer to output data
+	 * - The computed decapsulation key.
+	 * - Refer `rte_crypto_ml_kem_privkey_size` for size of buffer.
+	 */
+};
+
+/**
+ * PQC ML-KEM KEYVER op
+ *
+ * Parameters for PQC ML-KEM key verification operation
+ */
+struct rte_crypto_ml_kem_keyver_op {
+	enum rte_crypto_ml_kem_op_type op;
+	/**<
+	 * Op associated with key to be verified is one of below:
+	 * - Encapsulation op
+	 * - Decapsulation op
+	 */
+
+	rte_crypto_param key;
+	/**<
+	 * KEM key to check.
+	 * - ek in case of encapsulation op.
+	 * - dk in case of decapsulation op.
+	 */
+};
+
+/**
+ * PQC ML-KEM ENCAP op
+ *
+ * Parameters for PQC ML-KEM encapsulation operation
+ */
+struct rte_crypto_ml_kem_encap_op {
+	rte_crypto_param message;
+	/**< The message (of 32 bytes in length) for randomness.*/
+
+	rte_crypto_param ek;
+	/**< The encapsulation key.*/
+
+	rte_crypto_param cipher;
+	/**<
+	 * Pointer to output data
+	 * - The computed cipher.
+	 * - Refer `rte_crypto_ml_kem_cipher_size` for size of buffer.
+	 */
+
+	rte_crypto_param sk;
+	/**<
+	 * Pointer to output data
+	 * - The computed shared secret key (32 bytes).
+	 */
+};
+
+/**
+ * PQC ML-KEM DECAP op
+ *
+ * Parameters for PQC ML-KEM decapsulation operation
+ */
+struct rte_crypto_ml_kem_decap_op {
+	rte_crypto_param cipher;
+	/**< The cipher to be decapsulated.*/
+
+	rte_crypto_param dk;
+	/**< The decapsulation key.*/
+
+	rte_crypto_param sk;
+	/**<
+	 * Pointer to output data
+	 * - The computed shared secret key (32 bytes).
+	 */
+};
+
+/**
+ * PQC ML-KEM op
+ *
+ * Parameters for PQC ML-KEM operation
+ */
+struct rte_crypto_ml_kem_op {
+	enum rte_crypto_ml_kem_op_type op;
+	union {
+		struct rte_crypto_ml_kem_keygen_op keygen;
+		struct rte_crypto_ml_kem_keyver_op keyver;
+		struct rte_crypto_ml_kem_encap_op encap;
+		struct rte_crypto_ml_kem_decap_op decap;
+	};
+};
+
+/**
+ * PQC ML-DSA algorithms
+ *
+ * List of ML-DSA algorithms used in PQC
+ */
+enum rte_crypto_ml_dsa_param_set {
+	RTE_CRYPTO_ML_DSA_PARAM_NONE,
+	RTE_CRYPTO_ML_DSA_PARAM_44,
+	RTE_CRYPTO_ML_DSA_PARAM_65,
+	RTE_CRYPTO_ML_DSA_PARAM_87,
+};
+
+/**
+ * PQC ML-DSA op types
+ *
+ * List of ML-DSA op types in PQC
+ */
+enum rte_crypto_ml_dsa_op_type {
+	RTE_CRYPTO_ML_DSA_OP_KEYGEN,
+	RTE_CRYPTO_ML_DSA_OP_SIGN,
+	RTE_CRYPTO_ML_DSA_OP_VERIFY,
+	RTE_CRYPTO_ML_DSA_OP_END
+};
+
+/**
+ * PQC ML-DSA transform data
+ *
+ * Structure describing ML-DSA xform params
+ */
+struct rte_crypto_ml_dsa_xform {
+	enum rte_crypto_ml_dsa_param_set param;
+
+	bool sign_deterministic;
+	/**< The signature generated using deterministic method. */
+
+	bool sign_prehash;
+	/**< The signature generated using prehash or pure routine. */
+};
+
+/**
+ * PQC ML-DSA KEYGEN op
+ *
+ * Parameters for PQC ML-DSA key generation operation
+ */
+struct rte_crypto_ml_dsa_keygen_op {
+	rte_crypto_param seed;
+	/**< The random seed (of 32 bytes in length) to generate key pair.*/
+
+	rte_crypto_param pubkey;
+	/**<
+	 * Pointer to output data
+	 * - The computed public key.
+	 * - Refer `rte_crypto_ml_dsa_pubkey_size` for size of buffer.
+	 */
+
+	rte_crypto_param privkey;
+	/**<
+	 * Pointer to output data
+	 * - The computed secret key.
+	 * - Refer `rte_crypto_ml_dsa_privkey_size` for size of buffer.
+	 */
+};
+
+/**
+ * PQC ML-DSA SIGGEN op
+ *
+ * Parameters for PQC ML-DSA sign operation
+ */
+struct rte_crypto_ml_dsa_siggen_op {
+	rte_crypto_param message;
+	/**< The message to generate signature.*/
+
+	rte_crypto_param mu;
+	/**< The mu to generate signature.*/
+
+	rte_crypto_param privkey;
+	/**< The secret key to generate signature.*/
+
+	rte_crypto_param seed;
+	/**< The seed to generate signature.*/
+
+	rte_crypto_param ctx;
+	/**< The context key to generate signature.*/
+
+	enum rte_crypto_auth_algorithm hash;
+	/**< Hash function to generate signature. */
+
+	rte_crypto_param sign;
+	/**<
+	 * Pointer to output data
+	 * - The computed signature.
+	 * - Refer `rte_crypto_ml_dsa_sign_size` for size of buffer.
+	 */
+};
+
+/**
+ * PQC ML-DSA SIGVER op
+ *
+ * Parameters for PQC ML-DSA verify operation
+ */
+struct rte_crypto_ml_dsa_sigver_op {
+	rte_crypto_param pubkey;
+	/**< The public key to verify signature.*/
+
+	rte_crypto_param message;
+	/**< The message used to verify signature.*/
+
+	rte_crypto_param sign;
+	/**< The signature to verify.*/
+
+	rte_crypto_param mu;
+	/**< The mu used to generate signature.*/
+
+	rte_crypto_param ctx;
+	/**< The context key to generate signature.*/
+
+	enum rte_crypto_auth_algorithm hash;
+	/**< Hash function to generate signature. */
+};
+
+/**
+ * PQC ML-DSA op
+ *
+ * Parameters for PQC ML-DSA operation
+ */
+struct rte_crypto_ml_dsa_op {
+	enum rte_crypto_ml_dsa_op_type op;
+	union {
+		struct rte_crypto_ml_dsa_keygen_op keygen;
+		struct rte_crypto_ml_dsa_siggen_op siggen;
+		struct rte_crypto_ml_dsa_sigver_op sigver;
+	};
+};
+
 /**
  * Asymmetric crypto transform data
  *
@@ -751,6 +1049,12 @@ struct rte_crypto_asym_xform {
 		/**< EC xform parameters, used by elliptic curve based
 		 * operations.
 		 */
+
+		struct rte_crypto_ml_kem_xform mlkem;
+		/**< PQC ML-KEM xform parameters */
+
+		struct rte_crypto_ml_dsa_xform mldsa;
+		/**< PQC ML-DSA xform parameters */
 	};
 };
 
@@ -778,6 +1082,8 @@ struct rte_crypto_asym_op {
 		struct rte_crypto_ecpm_op_param ecpm;
 		struct rte_crypto_sm2_op_param sm2;
 		struct rte_crypto_eddsa_op_param eddsa;
+		struct rte_crypto_ml_kem_op mlkem;
+		struct rte_crypto_ml_dsa_op mldsa;
 	};
 	uint16_t flags;
 	/**<
diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c
index bb7bab4dd5..fd40c8a64c 100644
--- a/lib/cryptodev/rte_cryptodev.c
+++ b/lib/cryptodev/rte_cryptodev.c
@@ -229,6 +229,66 @@ const char *rte_crypto_asym_ke_strings[] = {
 	[RTE_CRYPTO_ASYM_KE_PUB_KEY_VERIFY] = "pub_ec_key_verify"
 };
 
+/**
+ * Public key size used in PQC ML-KEM based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_kem_pubkey_size)
+const uint16_t rte_crypto_ml_kem_pubkey_size[] = {
+	[RTE_CRYPTO_ML_KEM_PARAM_512] = 800,
+	[RTE_CRYPTO_ML_KEM_PARAM_768] = 1184,
+	[RTE_CRYPTO_ML_KEM_PARAM_1024] = 1568,
+};
+
+/**
+ * Private key size used in PQC ML-KEM based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_kem_privkey_size)
+const uint16_t rte_crypto_ml_kem_privkey_size[] = {
+	[RTE_CRYPTO_ML_KEM_PARAM_512] = 1632,
+	[RTE_CRYPTO_ML_KEM_PARAM_768] = 2400,
+	[RTE_CRYPTO_ML_KEM_PARAM_1024] = 3168,
+};
+
+/**
+ * Cipher size used in PQC ML-KEM based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_kem_cipher_size)
+const uint16_t rte_crypto_ml_kem_cipher_size[] = {
+	[RTE_CRYPTO_ML_KEM_PARAM_512] = 768,
+	[RTE_CRYPTO_ML_KEM_PARAM_768] = 1088,
+	[RTE_CRYPTO_ML_KEM_PARAM_1024] = 1568,
+};
+
+/**
+ * Public key size used in PQC ML-DSA based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_dsa_pubkey_size)
+const uint16_t rte_crypto_ml_dsa_pubkey_size[] = {
+	[RTE_CRYPTO_ML_DSA_PARAM_44] = 1312,
+	[RTE_CRYPTO_ML_DSA_PARAM_65] = 1952,
+	[RTE_CRYPTO_ML_DSA_PARAM_87] = 2592,
+};
+
+/**
+ * Private key size used in PQC ML-DSA based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_dsa_privkey_size)
+const uint16_t rte_crypto_ml_dsa_privkey_size[] = {
+	[RTE_CRYPTO_ML_DSA_PARAM_44] = 2560,
+	[RTE_CRYPTO_ML_DSA_PARAM_65] = 4032,
+	[RTE_CRYPTO_ML_DSA_PARAM_87] = 4896,
+};
+
+/**
+ * Sign size used in PQC ML-KEM based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_dsa_sign_size)
+const uint16_t rte_crypto_ml_dsa_sign_size[] = {
+	[RTE_CRYPTO_ML_DSA_PARAM_44] = 2420,
+	[RTE_CRYPTO_ML_DSA_PARAM_65] = 3309,
+	[RTE_CRYPTO_ML_DSA_PARAM_87] = 4627,
+};
+
 struct rte_cryptodev_sym_session_pool_private_data {
 	uint16_t sess_data_sz;
 	/**< driver session data size */
diff --git a/lib/cryptodev/rte_cryptodev.h b/lib/cryptodev/rte_cryptodev.h
index eaf0e50d37..37a6a5e49b 100644
--- a/lib/cryptodev/rte_cryptodev.h
+++ b/lib/cryptodev/rte_cryptodev.h
@@ -167,10 +167,13 @@ struct rte_cryptodev_asymmetric_xform_capability {
 	uint32_t op_types;
 	/**<
 	 * Bitmask for supported rte_crypto_asym_op_type or
+	 * rte_crypto_ml_kem_op_type or rte_crypto_ml_dsa_op_type or
 	 * rte_crypto_asym_ke_type. Which enum is used is determined
 	 * by the rte_crypto_asym_xform_type. For key exchange algorithms
-	 * like Diffie-Hellman it is rte_crypto_asym_ke_type, for others
-	 * it is rte_crypto_asym_op_type.
+	 * like Diffie-Hellman it is rte_crypto_asym_ke_type,
+	 * for ML-KEM algorithms it is rte_crypto_ml_kem_op_type,
+	 * for ML-DSA algorithms it is rte_crypto_ml_dsa_op_type,
+	 * or others it is rte_crypto_asym_op_type.
 	 */
 
 	__extension__
@@ -188,6 +191,12 @@ struct rte_cryptodev_asymmetric_xform_capability {
 
 		uint32_t op_capa[RTE_CRYPTO_ASYM_OP_LIST_END];
 		/**< Operation specific capabilities. */
+
+		uint32_t mlkem_capa[RTE_CRYPTO_ML_KEM_OP_END];
+		/**< Bitmask of supported ML-KEM parameter sets. */
+
+		uint32_t mldsa_capa[RTE_CRYPTO_ML_DSA_OP_END];
+		/**< Bitmask of supported ML-DSA parameter sets. */
 	};
 
 	uint64_t hash_algos;
@@ -577,6 +586,8 @@ rte_cryptodev_asym_get_xform_string(enum rte_crypto_asym_xform_type xform_enum);
 /**< Support inner checksum computation/verification */
 #define RTE_CRYPTODEV_FF_SECURITY_RX_INJECT		(1ULL << 28)
 /**< Support Rx injection after security processing */
+#define RTE_CRYPTODEV_FF_MLDSA_SIGN_PREHASH		(1ULL << 29)
+/**< Support Pre Hash ML-DSA Signature Generation */
 
 /**
  * Get the name of a crypto device feature flag
-- 
2.37.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v1 2/3] crypto/openssl: add ML crypto support
  2025-09-30 18:03 ` [PATCH v1 0/3] " Gowrishankar Muthukrishnan
  2025-09-30 18:03   ` [PATCH v1 1/3] " Gowrishankar Muthukrishnan
@ 2025-09-30 18:03   ` Gowrishankar Muthukrishnan
  2025-09-30 18:03   ` [PATCH v1 3/3] app/test: add ML crypto test vectors Gowrishankar Muthukrishnan
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Gowrishankar Muthukrishnan @ 2025-09-30 18:03 UTC (permalink / raw)
  To: dev, Akhil Goyal, Fan Zhang, Kai Ji; +Cc: anoobj, Gowrishankar Muthukrishnan

Add ML-KEM and ML-DSA support.

Signed-off-by: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
---
 doc/guides/cryptodevs/features/openssl.ini   |   2 +
 drivers/crypto/openssl/openssl_pmd_private.h |  16 +
 drivers/crypto/openssl/rte_openssl_pmd.c     | 868 +++++++++++++++++++
 drivers/crypto/openssl/rte_openssl_pmd_ops.c | 129 +++
 4 files changed, 1015 insertions(+)

diff --git a/doc/guides/cryptodevs/features/openssl.ini b/doc/guides/cryptodevs/features/openssl.ini
index f0074a46f8..df6e7de316 100644
--- a/doc/guides/cryptodevs/features/openssl.ini
+++ b/doc/guides/cryptodevs/features/openssl.ini
@@ -67,6 +67,8 @@ Modular Inversion = Y
 Diffie-hellman = Y
 SM2 = Y
 EdDSA = Y
+ML-KEM = Y
+ML-DSA = Y
 
 ;
 ; Supported Operating systems of the 'openssl' crypto driver.
diff --git a/drivers/crypto/openssl/openssl_pmd_private.h b/drivers/crypto/openssl/openssl_pmd_private.h
index 4a6a088870..7f87840b84 100644
--- a/drivers/crypto/openssl/openssl_pmd_private.h
+++ b/drivers/crypto/openssl/openssl_pmd_private.h
@@ -249,6 +249,20 @@ struct __rte_cache_aligned openssl_asym_session {
 			OSSL_PARAM * params;
 #endif
 		} eddsa;
+		struct {
+			uint8_t param;
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+			EVP_PKEY_CTX * pctx;
+#endif
+		} ml_kem;
+		struct {
+			uint8_t param;
+			bool sign_prehash;
+			bool sign_deterministic;
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+			EVP_PKEY_CTX * pctx;
+#endif
+		} ml_dsa;
 	} u;
 };
 /** Set and validate OPENSSL crypto session parameters */
@@ -264,4 +278,6 @@ openssl_reset_session(struct openssl_session *sess);
 /** device specific operations function pointer structure */
 extern struct rte_cryptodev_ops *rte_openssl_pmd_ops;
 
+extern const char *ml_kem_paramset_names[];
+extern const char *ml_dsa_paramset_names[];
 #endif /* _OPENSSL_PMD_PRIVATE_H_ */
diff --git a/drivers/crypto/openssl/rte_openssl_pmd.c b/drivers/crypto/openssl/rte_openssl_pmd.c
index 5bfad92b7c..4cca583b40 100644
--- a/drivers/crypto/openssl/rte_openssl_pmd.c
+++ b/drivers/crypto/openssl/rte_openssl_pmd.c
@@ -3255,6 +3255,842 @@ process_openssl_eddsa_op_evp(struct rte_crypto_op *cop,
 
 	return ret;
 }
+
+static int
+mlkem_keygen_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_kem_op *op = &cop->asym->mlkem;
+	EVP_PKEY_CTX *pctx = sess->u.ml_kem.pctx;
+	OSSL_PARAM_BLD *param_bld;
+	uint8_t seed[64] = {0};
+	EVP_PKEY *pkey = NULL;
+	OSSL_PARAM *params;
+	const char *param;
+	size_t keylen = 0;
+	void *key = NULL;
+	OSSL_PARAM *p;
+
+	param = ml_kem_paramset_names[sess->u.ml_kem.param];
+	if (param == NULL) {
+		OPENSSL_LOG(ERR, "invalid ml_kem param set");
+		return -EINVAL;
+	}
+
+	memcpy(seed, op->keygen.d.data, op->keygen.d.length);
+	memcpy(seed + op->keygen.d.length,
+		op->keygen.z.data, op->keygen.z.length);
+
+	param_bld = OSSL_PARAM_BLD_new();
+	if (param_bld == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (!OSSL_PARAM_BLD_push_utf8_string(param_bld,
+			OSSL_PKEY_PARAM_GROUP_NAME,
+			param, strlen(param)) ||
+		!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_ML_KEM_SEED,
+			seed, sizeof(seed))) {
+		OSSL_PARAM_BLD_free(param_bld);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	params = OSSL_PARAM_BLD_to_param(param_bld);
+	OSSL_PARAM_BLD_free(param_bld);
+	if (params == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	if (EVP_PKEY_fromdata_init(pctx) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR, params) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	OSSL_PARAM_free(params);
+
+	if (pkey == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	/* extract public and private keys */
+	if (EVP_PKEY_todata(pkey, EVP_PKEY_KEYPAIR, &params) != 1) {
+		OPENSSL_LOG(ERR, "Failed to convert to key pairs");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_PRIV_KEY);
+	if (p == NULL) {
+		OPENSSL_LOG(ERR, "Failed to locate private key");
+		OSSL_PARAM_free(params);
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	OSSL_PARAM_get_octet_string(p, &key,
+		rte_crypto_ml_kem_pubkey_size[sess->u.ml_kem.param], &keylen);
+	memcpy(op->keygen.dk.data, key, keylen);
+	op->keygen.dk.length = keylen;
+
+	p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_PUB_KEY);
+	if (p == NULL) {
+		OPENSSL_LOG(ERR, "Failed to locate public key");
+		OSSL_PARAM_free(params);
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	OSSL_PARAM_get_octet_string(p, &key,
+		rte_crypto_ml_kem_privkey_size[sess->u.ml_kem.param], &keylen);
+	memcpy(op->keygen.ek.data, key, keylen);
+	op->keygen.ek.length = keylen;
+
+	OSSL_PARAM_free(params);
+	EVP_PKEY_free(pkey);
+	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+	return 0;
+}
+
+static int
+mlkem_encap_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_kem_op *op = &cop->asym->mlkem;
+	EVP_PKEY_CTX *pctx = sess->u.ml_kem.pctx;
+	OSSL_PARAM_BLD *param_bld;
+	EVP_PKEY_CTX *cctx = NULL;
+	EVP_PKEY *pkey = NULL;
+	OSSL_PARAM *params;
+	const char *param;
+	size_t keylen = 0;
+	size_t outlen = 0;
+	int ret = -1;
+
+	param = ml_kem_paramset_names[sess->u.ml_kem.param];
+	if (param == NULL) {
+		OPENSSL_LOG(ERR, "invalid ml_kem param set");
+		return -EINVAL;
+	}
+
+	param_bld = OSSL_PARAM_BLD_new();
+	if (param_bld == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (!OSSL_PARAM_BLD_push_utf8_string(param_bld,
+			OSSL_PKEY_PARAM_GROUP_NAME,
+			param, strlen(param)) ||
+		!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_PUB_KEY,
+			op->encap.ek.data, op->encap.ek.length)) {
+		OSSL_PARAM_BLD_free(param_bld);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	params = OSSL_PARAM_BLD_to_param(param_bld);
+	OSSL_PARAM_BLD_free(param_bld);
+	if (params == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata_init(pctx) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_PUBLIC_KEY, params) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	OSSL_PARAM_free(params);
+
+	if (pkey == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	cctx = EVP_PKEY_CTX_new_from_pkey(NULL, pkey, NULL);
+	if (cctx == NULL) {
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_encapsulate_init(cctx, NULL) != 1) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (op->encap.message.length) {
+		const OSSL_PARAM kem_params[] = {
+			OSSL_PARAM_octet_string(OSSL_KEM_PARAM_IKME,
+				(void *)op->encap.message.data, op->encap.message.length),
+			OSSL_PARAM_END
+		};
+
+		if (EVP_PKEY_encapsulate_init(cctx, kem_params) != 1) {
+			EVP_PKEY_free(pkey);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+	}
+
+	if (EVP_PKEY_encapsulate(cctx, NULL, &outlen, NULL, &keylen) != 1) {
+		OPENSSL_LOG(ERR, "Failed to determine output length");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (outlen > op->encap.cipher.length) {
+		OPENSSL_LOG(ERR, "Insufficient buffer for cipher text");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (keylen > op->encap.sk.length) {
+		OPENSSL_LOG(ERR, "Insufficient buffer for shared key");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_encapsulate(cctx, op->encap.cipher.data, &outlen,
+			op->encap.sk.data, &keylen) != 1) {
+		OPENSSL_LOG(ERR, "Failed to encapculate");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	op->encap.cipher.length = outlen;
+	op->encap.sk.length = keylen;
+
+	EVP_PKEY_CTX_free(cctx);
+	EVP_PKEY_free(pkey);
+	ret = 0;
+	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+	return ret;
+}
+
+static int
+mlkem_decap_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_kem_op *op = &cop->asym->mlkem;
+	EVP_PKEY_CTX *pctx = sess->u.ml_kem.pctx;
+	OSSL_PARAM_BLD *param_bld;
+	EVP_PKEY_CTX *cctx = NULL;
+	EVP_PKEY *pkey = NULL;
+	OSSL_PARAM *params;
+	const char *param;
+	size_t keylen = 0;
+	int ret = -1;
+
+	param = ml_kem_paramset_names[sess->u.ml_kem.param];
+	if (param == NULL) {
+		OPENSSL_LOG(ERR, "invalid ml_kem param set");
+		return -EINVAL;
+	}
+
+	param_bld = OSSL_PARAM_BLD_new();
+	if (param_bld == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (!OSSL_PARAM_BLD_push_utf8_string(param_bld,
+			OSSL_PKEY_PARAM_GROUP_NAME,
+			param, strlen(param)) ||
+		!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_PRIV_KEY,
+			op->decap.dk.data, op->decap.dk.length)) {
+		OSSL_PARAM_BLD_free(param_bld);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	params = OSSL_PARAM_BLD_to_param(param_bld);
+	OSSL_PARAM_BLD_free(param_bld);
+	if (params == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata_init(pctx) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_PRIVATE_KEY, params) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	OSSL_PARAM_free(params);
+
+	if (pkey == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	cctx = EVP_PKEY_CTX_new_from_pkey(NULL, pkey, NULL);
+	if (cctx == NULL) {
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_decapsulate_init(cctx, params) != 1) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_decapsulate(cctx, NULL, &keylen,
+		op->decap.cipher.data, op->decap.cipher.length) != 1) {
+		OPENSSL_LOG(ERR, "Failed to determine output length");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (keylen > op->decap.sk.length) {
+		OPENSSL_LOG(ERR, "Insufficient buffer for shared key");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_decapsulate(cctx, op->decap.sk.data, &keylen,
+			op->decap.cipher.data, op->decap.cipher.length) != 1) {
+		OPENSSL_LOG(ERR, "Failed to decapsulate");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	op->decap.sk.length = keylen;
+
+	EVP_PKEY_CTX_free(cctx);
+	EVP_PKEY_free(pkey);
+	ret = 0;
+	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+	return ret;
+}
+
+static int
+process_openssl_mlkem_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_kem_op *op = &cop->asym->mlkem;
+	int ret = -1;
+
+	switch (op->op) {
+	case RTE_CRYPTO_ML_KEM_OP_KEYGEN:
+		ret = mlkem_keygen_op_evp(cop, sess);
+		break;
+	case RTE_CRYPTO_ML_KEM_OP_KEYVER:
+		cop->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
+		break;
+	case RTE_CRYPTO_ML_KEM_OP_ENCAP:
+		ret = mlkem_encap_op_evp(cop, sess);
+		break;
+	case RTE_CRYPTO_ML_KEM_OP_DECAP:
+		ret = mlkem_decap_op_evp(cop, sess);
+		break;
+	default:
+		cop->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
+		break;
+	}
+
+	return ret;
+}
+
+static int
+mldsa_keygen_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_dsa_op *op = &cop->asym->mldsa;
+	EVP_PKEY_CTX *pctx = sess->u.ml_dsa.pctx;
+	OSSL_PARAM_BLD *param_bld;
+	EVP_PKEY *pkey = NULL;
+	OSSL_PARAM *params;
+	const char *param;
+	size_t keylen = 0;
+	void *key = NULL;
+	OSSL_PARAM *p;
+
+	param = ml_dsa_paramset_names[sess->u.ml_dsa.param];
+	if (param == NULL) {
+		OPENSSL_LOG(ERR, "invalid ml_dsa param set");
+		return -EINVAL;
+	}
+
+	param_bld = OSSL_PARAM_BLD_new();
+	if (param_bld == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (!OSSL_PARAM_BLD_push_utf8_string(param_bld,
+			OSSL_PKEY_PARAM_GROUP_NAME,
+			param, strlen(param)) ||
+		!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_ML_DSA_SEED,
+			op->keygen.seed.data, op->keygen.seed.length)) {
+		OSSL_PARAM_BLD_free(param_bld);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	params = OSSL_PARAM_BLD_to_param(param_bld);
+	OSSL_PARAM_BLD_free(param_bld);
+	if (params == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	if (EVP_PKEY_fromdata_init(pctx) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR, params) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	OSSL_PARAM_free(params);
+
+	if (pkey == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	/* extract public and private keys */
+	if (EVP_PKEY_todata(pkey, EVP_PKEY_KEYPAIR, &params) != 1) {
+		OPENSSL_LOG(ERR, "Failed to convert to key pairs");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_PRIV_KEY);
+	if (p == NULL) {
+		OPENSSL_LOG(ERR, "Failed to locate private key");
+		OSSL_PARAM_free(params);
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	OSSL_PARAM_get_octet_string(p, &key,
+		rte_crypto_ml_dsa_privkey_size[sess->u.ml_dsa.param], &keylen);
+	memcpy(op->keygen.privkey.data, key, keylen);
+	op->keygen.privkey.length = keylen;
+
+	p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_PUB_KEY);
+	if (p == NULL) {
+		OPENSSL_LOG(ERR, "Failed to locate public key");
+		OSSL_PARAM_free(params);
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	OSSL_PARAM_get_octet_string(p, &key,
+		rte_crypto_ml_dsa_pubkey_size[sess->u.ml_dsa.param], &keylen);
+	memcpy(op->keygen.pubkey.data, key, keylen);
+	op->keygen.pubkey.length = keylen;
+
+	OSSL_PARAM_free(params);
+	EVP_PKEY_free(pkey);
+	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+	return 0;
+}
+
+static int
+mldsa_sign_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_dsa_op *op = &cop->asym->mldsa;
+	EVP_PKEY_CTX *pctx = sess->u.ml_dsa.pctx;
+	const EVP_MD *check_md = NULL;
+	OSSL_PARAM_BLD *param_bld;
+	EVP_PKEY_CTX *cctx = NULL;
+	EVP_PKEY *pkey = NULL;
+	EVP_SIGNATURE *sigalg;
+	OSSL_PARAM *params;
+	const char *param;
+	unsigned char *md;
+	size_t siglen = 0;
+	size_t mdlen = 0;
+	int ret = -1;
+
+	param = ml_dsa_paramset_names[sess->u.ml_dsa.param];
+	if (param == NULL) {
+		OPENSSL_LOG(ERR, "invalid ml_dsa param set");
+		return -EINVAL;
+	}
+
+	param_bld = OSSL_PARAM_BLD_new();
+	if (param_bld == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (!OSSL_PARAM_BLD_push_utf8_string(param_bld,
+			OSSL_PKEY_PARAM_GROUP_NAME,
+			param, strlen(param)) ||
+		(op->siggen.seed.length &&
+			!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_ML_DSA_SEED,
+			op->siggen.seed.data, op->siggen.seed.length)) ||
+		!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_PRIV_KEY,
+			op->siggen.privkey.data, op->siggen.privkey.length)) {
+		OSSL_PARAM_BLD_free(param_bld);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	params = OSSL_PARAM_BLD_to_param(param_bld);
+	OSSL_PARAM_BLD_free(param_bld);
+	if (params == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata_init(pctx) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_PRIVATE_KEY, params) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (pkey == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	cctx = EVP_PKEY_CTX_new_from_pkey(NULL, pkey, NULL);
+	if (cctx == NULL) {
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	sigalg = EVP_SIGNATURE_fetch(NULL, param, NULL);
+	if (sigalg == NULL) {
+		OPENSSL_LOG(ERR, "Failed to fetch signature algorithm");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_sign_message_init(cctx, sigalg, NULL) != 1) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (sess->u.ml_dsa.sign_deterministic) {
+		int deterministic = 1;
+		const OSSL_PARAM sign_params[] = {
+			OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_DETERMINISTIC, &deterministic),
+			OSSL_PARAM_END
+		};
+
+		if (EVP_PKEY_sign_message_init(cctx, sigalg, sign_params) != 1) {
+			EVP_SIGNATURE_free(sigalg);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+	}
+
+	md = op->siggen.message.data;
+	mdlen = op->siggen.message.length;
+
+	if (op->siggen.mu.length) {
+		int has_mu = 1;
+		const OSSL_PARAM sign_params[] = {
+			OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MU, &has_mu),
+			OSSL_PARAM_END
+		};
+
+		if (EVP_PKEY_sign_message_init(cctx, sigalg, sign_params) != 1) {
+			EVP_SIGNATURE_free(sigalg);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+
+		md = op->siggen.mu.data;
+		mdlen = op->siggen.mu.length;
+	} else if (op->siggen.ctx.length) {
+		int has_ctx = 1;
+		const OSSL_PARAM sign_params[] = {
+			OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING, &has_ctx),
+			OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING,
+				(void *)op->siggen.ctx.data, op->siggen.ctx.length),
+			OSSL_PARAM_END
+		};
+
+		if (EVP_PKEY_sign_message_init(cctx, sigalg, sign_params) != 1) {
+			EVP_SIGNATURE_free(sigalg);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+	}
+
+	EVP_SIGNATURE_free(sigalg);
+
+	switch (op->siggen.hash) {
+	case RTE_CRYPTO_AUTH_SHA3_224:
+		check_md = EVP_sha3_224();
+		break;
+	case RTE_CRYPTO_AUTH_SHA3_256:
+		check_md = EVP_sha3_256();
+		break;
+	case RTE_CRYPTO_AUTH_SHA3_384:
+		check_md = EVP_sha3_384();
+		break;
+	case RTE_CRYPTO_AUTH_SHA3_512:
+		check_md = EVP_sha3_512();
+		break;
+	case RTE_CRYPTO_AUTH_SHAKE_128:
+		check_md = EVP_shake128();
+		break;
+	case RTE_CRYPTO_AUTH_SHAKE_256:
+		check_md = EVP_shake256();
+		break;
+	default:
+		break;
+	}
+
+	if (op->siggen.hash != 0 && check_md == NULL) {
+		OPENSSL_LOG(ERR, "invalid hash type");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (check_md != NULL) {
+		if (EVP_PKEY_CTX_set_signature_md(cctx, check_md) != 1) {
+			OPENSSL_LOG(ERR, "Failed to set signature md");
+			EVP_PKEY_free(pkey);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+	}
+
+	if (EVP_PKEY_sign(cctx, NULL, &siglen, md, mdlen) != 1) {
+		OPENSSL_LOG(ERR, "Failed to determine output length");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (siglen > op->siggen.sign.length) {
+		OPENSSL_LOG(ERR, "Insufficient buffer for signature");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_sign(cctx, op->siggen.sign.data, &siglen, md, mdlen) != 1) {
+		OPENSSL_LOG(ERR, "Failed to sign");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	op->siggen.sign.length = siglen;
+
+	OSSL_PARAM_free(params);
+	EVP_PKEY_CTX_free(cctx);
+	EVP_PKEY_free(pkey);
+	ret = 0;
+	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+	return ret;
+}
+
+static int
+mldsa_verify_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_dsa_op *op = &cop->asym->mldsa;
+	EVP_PKEY_CTX *pctx = sess->u.ml_dsa.pctx;
+	OSSL_PARAM_BLD *param_bld;
+	EVP_PKEY_CTX *cctx = NULL;
+	EVP_PKEY *pkey = NULL;
+	EVP_SIGNATURE *sigalg;
+	OSSL_PARAM *params;
+	const char *param;
+	unsigned char *md;
+	size_t mdlen = 0;
+	int ret = -1;
+
+	param = ml_dsa_paramset_names[sess->u.ml_dsa.param];
+	if (param == NULL) {
+		OPENSSL_LOG(ERR, "invalid ml_dsa param set");
+		return -EINVAL;
+	}
+
+	param_bld = OSSL_PARAM_BLD_new();
+	if (param_bld == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (!OSSL_PARAM_BLD_push_utf8_string(param_bld,
+			OSSL_PKEY_PARAM_GROUP_NAME,
+			param, strlen(param)) ||
+		!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_PUB_KEY,
+			op->sigver.pubkey.data, op->sigver.pubkey.length)) {
+		OSSL_PARAM_BLD_free(param_bld);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	params = OSSL_PARAM_BLD_to_param(param_bld);
+	OSSL_PARAM_BLD_free(param_bld);
+	if (params == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata_init(pctx) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_PUBLIC_KEY, params) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (pkey == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	cctx = EVP_PKEY_CTX_new_from_pkey(NULL, pkey, NULL);
+	if (cctx == NULL) {
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	sigalg = EVP_SIGNATURE_fetch(NULL, param, NULL);
+	if (sigalg == NULL) {
+		OPENSSL_LOG(ERR, "Failed to fetch signature algorithm");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_verify_message_init(cctx, sigalg, NULL) != 1) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	md = op->sigver.message.data;
+	mdlen = op->sigver.message.length;
+
+	if (op->sigver.mu.length) {
+		int has_mu = 1;
+		const OSSL_PARAM sign_params[] = {
+			OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MU, &has_mu),
+			OSSL_PARAM_END
+		};
+
+		if (EVP_PKEY_verify_message_init(cctx, sigalg, sign_params) != 1) {
+			EVP_SIGNATURE_free(sigalg);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+
+		md = op->sigver.mu.data;
+		mdlen = op->sigver.mu.length;
+	} else if (op->sigver.ctx.length) {
+		const OSSL_PARAM sign_params[] = {
+			OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING,
+				(void *)op->sigver.ctx.data, op->sigver.ctx.length),
+			OSSL_PARAM_END
+		};
+
+		if (EVP_PKEY_verify_message_init(cctx, sigalg, sign_params) != 1) {
+			EVP_SIGNATURE_free(sigalg);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+	}
+
+	if (EVP_PKEY_verify(cctx, op->sigver.sign.data, op->sigver.sign.length,
+		md, mdlen) != 1) {
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return 0;
+	}
+
+	OSSL_PARAM_free(params);
+	EVP_PKEY_CTX_free(cctx);
+	EVP_PKEY_free(pkey);
+	ret = 0;
+	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+	return ret;
+}
+
+static int
+process_openssl_mldsa_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_dsa_op *op = &cop->asym->mldsa;
+	int ret = -1;
+
+	switch (op->op) {
+	case RTE_CRYPTO_ML_DSA_OP_KEYGEN:
+		ret = mldsa_keygen_op_evp(cop, sess);
+		break;
+	case RTE_CRYPTO_ML_DSA_OP_SIGN:
+		ret = mldsa_sign_op_evp(cop, sess);
+		break;
+	case RTE_CRYPTO_ML_DSA_OP_VERIFY:
+		ret = mldsa_verify_op_evp(cop, sess);
+		break;
+	default:
+		cop->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
+		break;
+	}
+
+	return ret;
+}
+
 #else
 static int
 process_openssl_rsa_op(struct rte_crypto_op *cop,
@@ -3381,6 +4217,24 @@ process_openssl_eddsa_op(struct rte_crypto_op *cop,
 	RTE_SET_USED(sess);
 	return -ENOTSUP;
 }
+
+static int
+process_openssl_mlkem_op(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	RTE_SET_USED(cop);
+	RTE_SET_USED(sess);
+	return -ENOTSUP;
+}
+
+static int
+process_openssl_mldsa_op(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	RTE_SET_USED(cop);
+	RTE_SET_USED(sess);
+	return -ENOTSUP;
+}
 #endif
 
 static int
@@ -3450,6 +4304,20 @@ process_asym_op(struct openssl_qp *qp, struct rte_crypto_op *op,
 		retval = process_openssl_eddsa_op_evp(op, sess);
 #else
 		retval = process_openssl_eddsa_op(op, sess);
+#endif
+		break;
+	case RTE_CRYPTO_ASYM_XFORM_ML_KEM:
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+		retval = process_openssl_mlkem_op_evp(op, sess);
+#else
+		retval = process_openssl_mlkem_op(op, sess);
+#endif
+		break;
+	case RTE_CRYPTO_ASYM_XFORM_ML_DSA:
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+		retval = process_openssl_mldsa_op_evp(op, sess);
+#else
+		retval = process_openssl_mldsa_op(op, sess);
 #endif
 		break;
 	default:
diff --git a/drivers/crypto/openssl/rte_openssl_pmd_ops.c b/drivers/crypto/openssl/rte_openssl_pmd_ops.c
index d3aa396c76..ce086c1a5e 100644
--- a/drivers/crypto/openssl/rte_openssl_pmd_ops.c
+++ b/drivers/crypto/openssl/rte_openssl_pmd_ops.c
@@ -639,10 +639,77 @@ static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {
 		}
 		}
 	},
+	{
+		/* ML-KEM */
+		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
+		.asym = {
+			.xform_capa = {
+				.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_KEM,
+				.op_types =
+				((1 << RTE_CRYPTO_ML_KEM_OP_KEYGEN) |
+				 (1 << RTE_CRYPTO_ML_KEM_OP_ENCAP) |
+				 (1 << RTE_CRYPTO_ML_KEM_OP_DECAP)),
+				.mlkem_capa = {
+					[RTE_CRYPTO_ML_KEM_OP_KEYGEN] =
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_512) |
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_768) |
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_1024),
+					[RTE_CRYPTO_ML_KEM_OP_ENCAP] =
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_512) |
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_768) |
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_1024),
+					[RTE_CRYPTO_ML_KEM_OP_DECAP] =
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_512) |
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_768) |
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_1024)
+				}
+			}
+		}
+	},
+	{
+		/* ML-DSA */
+		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
+		.asym = {
+			.xform_capa = {
+				.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_DSA,
+				.op_types =
+				((1 << RTE_CRYPTO_ML_DSA_OP_KEYGEN) |
+				 (1 << RTE_CRYPTO_ML_DSA_OP_SIGN) |
+				 (1 << RTE_CRYPTO_ML_DSA_OP_VERIFY)),
+				.mldsa_capa = {
+					[RTE_CRYPTO_ML_DSA_OP_KEYGEN] =
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_44) |
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_65) |
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_87),
+					[RTE_CRYPTO_ML_DSA_OP_SIGN] =
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_44) |
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_65) |
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_87),
+					[RTE_CRYPTO_ML_DSA_OP_VERIFY] =
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_44) |
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_65) |
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_87)
+				}
+			}
+		}
+	},
 
 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
 };
 
+const char *ml_kem_paramset_names[] = {
+	NULL,
+	"ML-KEM-512",
+	"ML-KEM-768",
+	"ML-KEM-1024",
+};
+
+const char *ml_dsa_paramset_names[] = {
+	NULL,
+	"ML-DSA-44",
+	"ML-DSA-65",
+	"ML-DSA-87",
+};
 
 /** Configure device */
 static int
@@ -1573,6 +1640,58 @@ static int openssl_set_asym_session_parameters(
 #else
 		OPENSSL_LOG(WARNING, "EdDSA unsupported for OpenSSL Version < 3.3");
 		return -ENOTSUP;
+#endif
+	}
+	case RTE_CRYPTO_ASYM_XFORM_ML_KEM:
+	{
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+		const char *param;
+
+		param = ml_kem_paramset_names[xform->mlkem.param];
+		if (param == NULL) {
+			OPENSSL_LOG(ERR, "invalid ml_kem param set");
+			return -EINVAL;
+		}
+
+		asym_session->u.ml_kem.pctx = EVP_PKEY_CTX_new_from_name(NULL, param, NULL);
+		if (!asym_session->u.ml_kem.pctx) {
+			OPENSSL_LOG(ERR, "failed to allocate resources");
+			return -1;
+		}
+
+		asym_session->u.ml_kem.param = xform->mlkem.param;
+		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+		break;
+#else
+		OPENSSL_LOG(WARNING, "ML-KEM unsupported for OpenSSL Version < 3.5");
+		return -ENOTSUP;
+#endif
+	}
+	case RTE_CRYPTO_ASYM_XFORM_ML_DSA:
+	{
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+		const char *param;
+
+		param = ml_dsa_paramset_names[xform->mldsa.param];
+		if (param == NULL) {
+			OPENSSL_LOG(ERR, "invalid ml_dsa param set");
+			return -EINVAL;
+		}
+
+		asym_session->u.ml_dsa.pctx = EVP_PKEY_CTX_new_from_name(NULL, param, NULL);
+		if (!asym_session->u.ml_dsa.pctx) {
+			OPENSSL_LOG(ERR, "failed to allocate resources");
+			return -1;
+		}
+
+		asym_session->u.ml_dsa.param = xform->mldsa.param;
+		asym_session->u.ml_dsa.sign_prehash = xform->mldsa.sign_prehash;
+		asym_session->u.ml_dsa.sign_deterministic = xform->mldsa.sign_deterministic;
+		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+		break;
+#else
+		OPENSSL_LOG(WARNING, "ML-DSA unsupported for OpenSSL Version < 3.5");
+		return -ENOTSUP;
 #endif
 	}
 	default:
@@ -1675,6 +1794,16 @@ static void openssl_reset_asym_session(struct openssl_asym_session *sess)
 	case RTE_CRYPTO_ASYM_XFORM_EDDSA:
 #if (OPENSSL_VERSION_NUMBER >= 0x30300000L)
 		OSSL_PARAM_free(sess->u.eddsa.params);
+#endif
+		break;
+	case RTE_CRYPTO_ASYM_XFORM_ML_KEM:
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+		EVP_PKEY_CTX_free(sess->u.ml_kem.pctx);
+#endif
+		break;
+	case RTE_CRYPTO_ASYM_XFORM_ML_DSA:
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+		EVP_PKEY_CTX_free(sess->u.ml_dsa.pctx);
 #endif
 		break;
 	default:
-- 
2.37.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v1 3/3] app/test: add ML crypto test vectors
  2025-09-30 18:03 ` [PATCH v1 0/3] " Gowrishankar Muthukrishnan
  2025-09-30 18:03   ` [PATCH v1 1/3] " Gowrishankar Muthukrishnan
  2025-09-30 18:03   ` [PATCH v1 2/3] crypto/openssl: add ML crypto support Gowrishankar Muthukrishnan
@ 2025-09-30 18:03   ` Gowrishankar Muthukrishnan
  2025-10-01  5:49   ` [PATCH v1 0/3] cryptodev: support PQC ML algorithms Akhil Goyal
  2025-10-01  7:37   ` [PATCH v2 " Gowrishankar Muthukrishnan
  4 siblings, 0 replies; 10+ messages in thread
From: Gowrishankar Muthukrishnan @ 2025-09-30 18:03 UTC (permalink / raw)
  To: dev, Akhil Goyal, Fan Zhang, Kai Ji; +Cc: anoobj, Gowrishankar Muthukrishnan

Add ML-KEM and ML-DSA test vectors.

Signed-off-by: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
---
 app/test/test_cryptodev_asym.c                |  856 ++++++++
 app/test/test_cryptodev_ml_dsa_test_vectors.h | 1856 +++++++++++++++++
 app/test/test_cryptodev_ml_kem_test_vectors.h |  873 ++++++++
 3 files changed, 3585 insertions(+)
 create mode 100644 app/test/test_cryptodev_ml_dsa_test_vectors.h
 create mode 100644 app/test/test_cryptodev_ml_kem_test_vectors.h

diff --git a/app/test/test_cryptodev_asym.c b/app/test/test_cryptodev_asym.c
index 20afb5e98b..942a23e3b3 100644
--- a/app/test/test_cryptodev_asym.c
+++ b/app/test/test_cryptodev_asym.c
@@ -24,6 +24,8 @@
 #include "test_cryptodev_mod_test_vectors.h"
 #include "test_cryptodev_rsa_test_vectors.h"
 #include "test_cryptodev_sm2_test_vectors.h"
+#include "test_cryptodev_ml_kem_test_vectors.h"
+#include "test_cryptodev_ml_dsa_test_vectors.h"
 #include "test_cryptodev_asym_util.h"
 #include "test.h"
 
@@ -3629,6 +3631,33 @@ static int send_one(void)
 	return TEST_SUCCESS;
 }
 
+static int send_one_no_status_check(void)
+{
+	int ticks = 0;
+
+	if (rte_cryptodev_enqueue_burst(params->valid_devs[0], 0,
+			&self->op, 1) != 1) {
+		RTE_LOG(ERR, USER1,
+			"line %u FAILED: Error sending packet for operation on device %d",
+			__LINE__, params->valid_devs[0]);
+		return TEST_FAILED;
+	}
+	while (rte_cryptodev_dequeue_burst(params->valid_devs[0], 0,
+			&self->result_op, 1) == 0) {
+		rte_delay_ms(1);
+		ticks++;
+		if (ticks >= DEQ_TIMEOUT) {
+			RTE_LOG(ERR, USER1,
+				"line %u FAILED: Cannot dequeue the crypto op on device %d",
+				__LINE__, params->valid_devs[0]);
+			return TEST_FAILED;
+		}
+	}
+	TEST_ASSERT_NOT_NULL(self->result_op,
+		"Failed to process asym crypto op");
+	return TEST_SUCCESS;
+}
+
 static int
 modular_cmpeq(const uint8_t *a, size_t a_len, const uint8_t *b, size_t b_len)
 {
@@ -3735,6 +3764,827 @@ modular_multiplicative_inverse(const void *test_data)
 	return TEST_SUCCESS;
 }
 
+static int
+mlkem_keygen(const void *test_data)
+{
+	const struct crypto_testsuite_mlkem_params *vector = test_data;
+	const uint8_t dev_id = params->valid_devs[0];
+	struct rte_crypto_asym_xform xform = {0};
+	uint8_t ek[TEST_DATA_SIZE] = {0};
+	uint8_t dk[TEST_DATA_SIZE] = {0};
+
+	xform.mlkem.param = vector->param;
+	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+	if (rte_cryptodev_asym_session_create(dev_id, &xform,
+			params->session_mpool, &self->sess) < 0) {
+		RTE_LOG(ERR, USER1, "line %u FAILED: Session creation failed",
+			__LINE__);
+		return TEST_FAILED;
+	}
+
+	rte_crypto_op_attach_asym_session(self->op, self->sess);
+	self->op->asym->mlkem.op = RTE_CRYPTO_ML_KEM_OP_KEYGEN;
+	self->op->asym->mlkem.keygen.d.data = vector->d.data;
+	self->op->asym->mlkem.keygen.d.length = vector->d.length;
+	self->op->asym->mlkem.keygen.z.data = vector->z.data;
+	self->op->asym->mlkem.keygen.z.length = vector->z.length;
+	self->op->asym->mlkem.keygen.dk.data = dk;
+	self->op->asym->mlkem.keygen.dk.length = 0;
+	self->op->asym->mlkem.keygen.ek.data = ek;
+	self->op->asym->mlkem.keygen.ek.length = 0;
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-KEM KeyGen)");
+	debug_hexdump(stdout, "Decapsulation key",
+		self->result_op->asym->mlkem.keygen.dk.data,
+		self->result_op->asym->mlkem.keygen.dk.length);
+	debug_hexdump(stdout, "Encapsulation key",
+		self->result_op->asym->mlkem.keygen.ek.data,
+		self->result_op->asym->mlkem.keygen.ek.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.keygen.dk.length,
+		rte_crypto_ml_kem_privkey_size[vector->param],
+		"Incorrect Decapsulation key length\n");
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.keygen.ek.length,
+		rte_crypto_ml_kem_pubkey_size[vector->param],
+		"Incorrect Encapsulation key length\n");
+
+	/* If the seed is all zero, keys are deterministic */
+	if (memcmp(vector->d.data, (uint8_t [32]) {0},
+			vector->d.length) == 0) {
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->dk.data,
+			self->result_op->asym->mlkem.keygen.dk.data,
+			self->result_op->asym->mlkem.keygen.dk.length,
+			"Incorrect Decapsulation key\n");
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->ek.data,
+			self->result_op->asym->mlkem.keygen.ek.data,
+			self->result_op->asym->mlkem.keygen.ek.length,
+			"Incorrect Encapsulation key\n");
+		RTE_LOG(DEBUG, USER1, "Deterministic keygen test passed\n");
+	}
+
+	rte_cryptodev_asym_session_free(dev_id, self->sess);
+	return TEST_SUCCESS;
+}
+
+static int
+mlkem_encap(const void *test_data)
+{
+	const struct crypto_testsuite_mlkem_params *vector = test_data;
+	const uint8_t dev_id = params->valid_devs[0];
+	struct rte_crypto_asym_xform xform = {0};
+	uint8_t cipher[TEST_DATA_SIZE] = {0};
+	uint8_t skcopy[TEST_DATA_SIZE] = {0};
+	uint8_t sk[TEST_DATA_SIZE] = {0};
+	size_t cipher_len;
+
+	xform.mlkem.param = vector->param;
+	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+	if (rte_cryptodev_asym_session_create(dev_id, &xform,
+			params->session_mpool, &self->sess) < 0) {
+		RTE_LOG(ERR, USER1, "line %u FAILED: Session creation failed",
+			__LINE__);
+		return TEST_FAILED;
+	}
+
+	rte_crypto_op_attach_asym_session(self->op, self->sess);
+
+	/* Encapsulate */
+	self->op->asym->mlkem.op = RTE_CRYPTO_ML_KEM_OP_ENCAP;
+	self->op->asym->mlkem.encap.message.data = vector->message.data;
+	self->op->asym->mlkem.encap.message.length = vector->message.length;
+	self->op->asym->mlkem.encap.ek.data = vector->ek.data;
+	self->op->asym->mlkem.encap.ek.length = vector->ek.length;
+	self->op->asym->mlkem.encap.cipher.data = cipher;
+	self->op->asym->mlkem.encap.cipher.length =
+		rte_crypto_ml_kem_cipher_size[vector->param];
+	self->op->asym->mlkem.encap.sk.data = sk;
+	self->op->asym->mlkem.encap.sk.length = 32;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-KEM Encap)");
+	debug_hexdump(stdout, "Cipher",
+		self->result_op->asym->mlkem.encap.cipher.data,
+		self->result_op->asym->mlkem.encap.cipher.length);
+	debug_hexdump(stdout, "Shared secret from encap",
+		self->result_op->asym->mlkem.encap.sk.data,
+		self->result_op->asym->mlkem.encap.sk.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.encap.cipher.length,
+		rte_crypto_ml_kem_cipher_size[vector->param],
+		"Incorrect Cipher length\n");
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.encap.sk.length, 32,
+		"Incorrect Shared key length\n");
+
+	/* If random message is set, cipher and shared secret are deterministic */
+	if (vector->message.length != 0) {
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->cipher.data,
+			self->result_op->asym->mlkem.encap.cipher.data,
+			self->result_op->asym->mlkem.encap.cipher.length,
+			"Incorrect Cipher\n");
+
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->sk.data,
+			self->result_op->asym->mlkem.encap.sk.data,
+			self->result_op->asym->mlkem.encap.sk.length,
+			"Incorrect Shared secret\n");
+		RTE_LOG(DEBUG, USER1, "Deterministic encap test passed\n");
+	}
+
+	/* Decapsulate and verify */
+	cipher_len = self->result_op->asym->mlkem.encap.cipher.length;
+	memcpy(skcopy, self->result_op->asym->mlkem.encap.sk.data,
+		self->result_op->asym->mlkem.encap.sk.length);
+	memset(sk, 0, sizeof(sk));
+
+	self->op->asym->mlkem.op = RTE_CRYPTO_ML_KEM_OP_DECAP;
+	self->op->asym->mlkem.decap.dk.data = vector->dk.data;
+	self->op->asym->mlkem.decap.dk.length = vector->dk.length;
+	self->op->asym->mlkem.decap.cipher.data = cipher;
+	self->op->asym->mlkem.decap.cipher.length = cipher_len;
+	self->op->asym->mlkem.decap.sk.data = sk;
+	self->op->asym->mlkem.decap.sk.length = 32;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-KEM Decap)");
+
+	debug_hexdump(stdout, "Shared secret from decap",
+		self->result_op->asym->mlkem.decap.sk.data,
+		self->result_op->asym->mlkem.decap.sk.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.decap.sk.length, 32,
+		"Incorrect Shared secret length\n");
+	TEST_ASSERT_BUFFERS_ARE_EQUAL(self->result_op->asym->mlkem.decap.sk.data,
+		skcopy, self->result_op->asym->mlkem.decap.sk.length,
+		"Incorrect Shared secret\n");
+
+	/* Negative test */
+	cipher[0] ^= 0x01;
+	memset(sk, 0, sizeof(sk));
+
+	self->op->asym->mlkem.op = RTE_CRYPTO_ML_KEM_OP_DECAP;
+	self->op->asym->mlkem.decap.dk.data = vector->dk.data;
+	self->op->asym->mlkem.decap.dk.length = vector->dk.length;
+	self->op->asym->mlkem.decap.cipher.data = cipher;
+	self->op->asym->mlkem.decap.cipher.length = cipher_len;
+	self->op->asym->mlkem.decap.sk.data = sk;
+	self->op->asym->mlkem.decap.sk.length = 32;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-KEM Decap)");
+
+	debug_hexdump(stdout, "Shared secret from negative test",
+		self->result_op->asym->mlkem.decap.sk.data,
+		self->result_op->asym->mlkem.decap.sk.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.decap.sk.length, 32,
+		"Incorrect Shared secret length\n");
+
+	if (!memcmp(self->result_op->asym->mlkem.decap.sk.data, skcopy, 32)) {
+		rte_cryptodev_asym_session_free(dev_id, self->sess);
+		return TEST_FAILED;
+	}
+
+	rte_cryptodev_asym_session_free(dev_id, self->sess);
+	return TEST_SUCCESS;
+}
+
+static int
+mlkem_decap(const void *test_data)
+{
+	const struct crypto_testsuite_mlkem_params *vector = test_data;
+	const uint8_t dev_id = params->valid_devs[0];
+	struct rte_crypto_asym_xform xform = {0};
+	uint8_t cipher[TEST_DATA_SIZE] = {0};
+	uint8_t sk[TEST_DATA_SIZE] = {0};
+	size_t cipher_len;
+
+	xform.mlkem.param = vector->param;
+	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+	if (rte_cryptodev_asym_session_create(dev_id, &xform,
+			params->session_mpool, &self->sess) < 0) {
+		RTE_LOG(ERR, USER1, "line %u FAILED: Session creation failed",
+			__LINE__);
+		return TEST_FAILED;
+	}
+
+	rte_crypto_op_attach_asym_session(self->op, self->sess);
+
+	/* Decapsulate and verify */
+	self->op->asym->mlkem.op = RTE_CRYPTO_ML_KEM_OP_DECAP;
+	self->op->asym->mlkem.decap.dk.data = vector->dk.data;
+	self->op->asym->mlkem.decap.dk.length = vector->dk.length;
+	self->op->asym->mlkem.decap.cipher.data = vector->cipher.data;
+	self->op->asym->mlkem.decap.cipher.length = vector->cipher.length;
+	self->op->asym->mlkem.decap.sk.data = sk;
+	self->op->asym->mlkem.decap.sk.length = 32;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-KEM Decap)");
+
+	debug_hexdump(stdout, "Shared secret from decap",
+		self->result_op->asym->mlkem.decap.sk.data,
+		self->result_op->asym->mlkem.decap.sk.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.decap.sk.length, 32,
+		"Incorrect Shared secret length\n");
+	TEST_ASSERT_BUFFERS_ARE_EQUAL(self->result_op->asym->mlkem.decap.sk.data,
+		vector->sk.data, vector->sk.length,
+		"Incorrect Shared secret\n");
+
+	/* Negative test */
+	memcpy(cipher, vector->cipher.data, vector->cipher.length);
+	cipher_len = vector->cipher.length;
+	cipher[0] ^= 0x01;
+	memset(sk, 0, sizeof(sk));
+
+	self->op->asym->mlkem.op = RTE_CRYPTO_ML_KEM_OP_DECAP;
+	self->op->asym->mlkem.decap.dk.data = vector->dk.data;
+	self->op->asym->mlkem.decap.dk.length = vector->dk.length;
+	self->op->asym->mlkem.decap.cipher.data = cipher;
+	self->op->asym->mlkem.decap.cipher.length = cipher_len;
+	self->op->asym->mlkem.decap.sk.data = sk;
+	self->op->asym->mlkem.decap.sk.length = 32;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-KEM Decap)");
+
+	debug_hexdump(stdout, "Shared secret from negative test",
+		self->result_op->asym->mlkem.decap.sk.data,
+		self->result_op->asym->mlkem.decap.sk.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.decap.sk.length, 32,
+		"Incorrect Shared secret length\n");
+
+	if (!memcmp(self->result_op->asym->mlkem.decap.sk.data,
+		vector->sk.data, vector->sk.length)) {
+		rte_cryptodev_asym_session_free(dev_id, self->sess);
+		return TEST_FAILED;
+	}
+
+	rte_cryptodev_asym_session_free(dev_id, self->sess);
+	return TEST_SUCCESS;
+}
+
+static int
+mldsa_keygen(const void *test_data)
+{
+	const struct crypto_testsuite_mldsa_params *vector = test_data;
+	const uint8_t dev_id = params->valid_devs[0];
+	struct rte_crypto_asym_xform xform = {0};
+	uint8_t privkey[TEST_DATA_SIZE] = {0};
+	uint8_t pubkey[TEST_DATA_SIZE] = {0};
+
+	xform.mldsa.param = vector->param;
+	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+	if (rte_cryptodev_asym_session_create(dev_id, &xform,
+			params->session_mpool, &self->sess) < 0) {
+		RTE_LOG(ERR, USER1, "line %u FAILED: Session creation failed",
+			__LINE__);
+		return TEST_FAILED;
+	}
+
+	rte_crypto_op_attach_asym_session(self->op, self->sess);
+	self->op->asym->mldsa.op = RTE_CRYPTO_ML_DSA_OP_KEYGEN;
+	self->op->asym->mldsa.keygen.seed.data = vector->seed.data;
+	self->op->asym->mldsa.keygen.seed.length = vector->seed.length;
+	self->op->asym->mldsa.keygen.privkey.data = privkey;
+	self->op->asym->mldsa.keygen.privkey.length = 0;
+	self->op->asym->mldsa.keygen.pubkey.data = pubkey;
+	self->op->asym->mldsa.keygen.pubkey.length = 0;
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-DSA KeyGen)");
+
+	debug_hexdump(stdout, "Private key",
+		self->result_op->asym->mldsa.keygen.privkey.data,
+		self->result_op->asym->mldsa.keygen.privkey.length);
+	debug_hexdump(stdout, "Public key",
+		self->result_op->asym->mldsa.keygen.pubkey.data,
+		self->result_op->asym->mldsa.keygen.pubkey.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mldsa.keygen.privkey.length,
+		rte_crypto_ml_dsa_privkey_size[vector->param],
+		"Incorrect Private key length\n");
+	TEST_ASSERT_EQUAL(self->result_op->asym->mldsa.keygen.pubkey.length,
+		rte_crypto_ml_dsa_pubkey_size[vector->param],
+		"Incorrect Public key length\n");
+
+	/* If the seed is all zero, keys are deterministic */
+	if (memcmp(vector->seed.data, (uint8_t [32]) {0},
+			vector->seed.length) == 0) {
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->privkey.data,
+			self->result_op->asym->mldsa.keygen.privkey.data,
+			self->result_op->asym->mldsa.keygen.privkey.length,
+			"Incorrect Private key\n");
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->pubkey.data,
+			self->result_op->asym->mldsa.keygen.pubkey.data,
+			self->result_op->asym->mldsa.keygen.pubkey.length,
+			"Incorrect Public key\n");
+		RTE_LOG(DEBUG, USER1, "Deterministic keygen test passed\n");
+	}
+
+	rte_cryptodev_asym_session_free(dev_id, self->sess);
+	return TEST_SUCCESS;
+}
+
+static int
+mldsa_sign(const void *test_data)
+{
+	const struct crypto_testsuite_mldsa_params *vector = test_data;
+	const uint8_t dev_id = params->valid_devs[0];
+	struct rte_crypto_asym_xform xform = {0};
+	struct rte_cryptodev_info dev_info;
+	uint8_t sign[TEST_DATA_SIZE] = {0};
+	size_t sign_len;
+
+	xform.mldsa.param = vector->param;
+	xform.mldsa.sign_deterministic = vector->sign_deterministic;
+	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+
+	rte_cryptodev_info_get(dev_id, &dev_info);
+
+	/* Check if prehash is supported */
+	if (vector->hash) {
+		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MLDSA_SIGN_PREHASH)) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support prehash in ML-DSA signature generation. Test skipped\n");
+			return TEST_SKIPPED;
+		}
+	}
+
+	if (rte_cryptodev_asym_session_create(dev_id, &xform,
+			params->session_mpool, &self->sess) < 0) {
+		RTE_LOG(ERR, USER1, "line %u FAILED: Session creation failed",
+			__LINE__);
+		return TEST_FAILED;
+	}
+
+	rte_crypto_op_attach_asym_session(self->op, self->sess);
+
+	/* Sign */
+	self->op->asym->mldsa.op = RTE_CRYPTO_ML_DSA_OP_SIGN;
+	self->op->asym->mldsa.siggen.seed.data = vector->seed.data;
+	self->op->asym->mldsa.siggen.seed.length = vector->seed.length;
+	self->op->asym->mldsa.siggen.privkey.data = vector->privkey.data;
+	self->op->asym->mldsa.siggen.privkey.length = vector->privkey.length;
+	self->op->asym->mldsa.siggen.message.data = vector->message.data;
+	self->op->asym->mldsa.siggen.message.length = vector->message.length;
+	self->op->asym->mldsa.siggen.ctx.data = vector->context.data;
+	self->op->asym->mldsa.siggen.ctx.length = vector->context.length;
+	self->op->asym->mldsa.siggen.mu.data = vector->mu.data;
+	self->op->asym->mldsa.siggen.mu.length = vector->mu.length;
+	self->op->asym->mldsa.siggen.sign.data = sign;
+	self->op->asym->mldsa.siggen.sign.length =
+		rte_crypto_ml_dsa_sign_size[vector->param];
+	self->op->asym->mldsa.siggen.hash = vector->hash;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-DSA Sign)");
+
+	debug_hexdump(stdout, "Signature",
+		self->result_op->asym->mldsa.siggen.sign.data,
+		self->result_op->asym->mldsa.siggen.sign.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mldsa.siggen.sign.length,
+		rte_crypto_ml_dsa_sign_size[vector->param],
+		"Incorrect Signature length\n");
+
+	/* Verify signature if it is deterministic */
+	if (vector->sign_deterministic) {
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->sign.data,
+			self->result_op->asym->mldsa.siggen.sign.data,
+			self->result_op->asym->mldsa.siggen.sign.length,
+			"Incorrect Signature\n");
+		RTE_LOG(DEBUG, USER1, "Deterministic signature test passed\n");
+	}
+
+	/* Verify the signature */
+	sign_len = self->result_op->asym->mldsa.siggen.sign.length;
+
+	self->op->asym->mldsa.op = RTE_CRYPTO_ML_DSA_OP_VERIFY;
+	self->op->asym->mldsa.sigver.message.data = vector->message.data;
+	self->op->asym->mldsa.sigver.message.length = vector->message.length;
+	self->op->asym->mldsa.sigver.ctx.data = vector->context.data;
+	self->op->asym->mldsa.sigver.ctx.length = vector->context.length;
+	self->op->asym->mldsa.sigver.mu.data = vector->mu.data;
+	self->op->asym->mldsa.sigver.mu.length = vector->mu.length;
+	self->op->asym->mldsa.sigver.pubkey.data = vector->pubkey.data;
+	self->op->asym->mldsa.sigver.pubkey.length = vector->pubkey.length;
+	self->op->asym->mldsa.sigver.sign.data = sign;
+	self->op->asym->mldsa.sigver.sign.length = sign_len;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-DSA Verify)");
+
+	/* Verify the result */
+	TEST_ASSERT_EQUAL(self->result_op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
+		"Failed to verify the signature");
+
+	/* Negative test */
+	sign[0] ^= 0x01;
+
+	self->op->asym->mldsa.op = RTE_CRYPTO_ML_DSA_OP_VERIFY;
+	self->op->asym->mldsa.sigver.message.data = vector->message.data;
+	self->op->asym->mldsa.sigver.message.length = vector->message.length;
+	self->op->asym->mldsa.sigver.ctx.data = vector->context.data;
+	self->op->asym->mldsa.sigver.ctx.length = vector->context.length;
+	self->op->asym->mldsa.sigver.mu.data = vector->mu.data;
+	self->op->asym->mldsa.sigver.mu.length = vector->mu.length;
+	self->op->asym->mldsa.sigver.pubkey.data = vector->pubkey.data;
+	self->op->asym->mldsa.sigver.pubkey.length = vector->pubkey.length;
+	self->op->asym->mldsa.sigver.sign.data = sign;
+	self->op->asym->mldsa.sigver.sign.length = sign_len;
+
+	TEST_ASSERT_SUCCESS(send_one_no_status_check(),
+		"Failed to process crypto op (ML-DSA Verify)");
+
+	/* Verify the result */
+	if (self->result_op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) {
+		rte_cryptodev_asym_session_free(dev_id, self->sess);
+		return TEST_FAILED;
+	}
+
+	rte_cryptodev_asym_session_free(dev_id, self->sess);
+	return TEST_SUCCESS;
+}
+
+static int
+mldsa_verify(const void *test_data)
+{
+	const struct crypto_testsuite_mldsa_params *vector = test_data;
+	const uint8_t dev_id = params->valid_devs[0];
+	struct rte_crypto_asym_xform xform = {0};
+	uint8_t sign[TEST_DATA_SIZE] = {0};
+	size_t sign_len;
+
+	xform.mldsa.param = vector->param;
+	xform.mldsa.sign_deterministic = vector->sign_deterministic;
+	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+	if (rte_cryptodev_asym_session_create(dev_id, &xform,
+			params->session_mpool, &self->sess) < 0) {
+		RTE_LOG(ERR, USER1, "line %u FAILED: Session creation failed",
+			__LINE__);
+		return TEST_FAILED;
+	}
+
+	rte_crypto_op_attach_asym_session(self->op, self->sess);
+
+	/* Verify the signature */
+	self->op->asym->mldsa.op = RTE_CRYPTO_ML_DSA_OP_VERIFY;
+	self->op->asym->mldsa.sigver.message.data = vector->message.data;
+	self->op->asym->mldsa.sigver.message.length = vector->message.length;
+	self->op->asym->mldsa.sigver.ctx.data = vector->context.data;
+	self->op->asym->mldsa.sigver.ctx.length = vector->context.length;
+	self->op->asym->mldsa.sigver.mu.data = vector->mu.data;
+	self->op->asym->mldsa.sigver.mu.length = vector->mu.length;
+	self->op->asym->mldsa.sigver.pubkey.data = vector->pubkey.data;
+	self->op->asym->mldsa.sigver.pubkey.length = vector->pubkey.length;
+	self->op->asym->mldsa.sigver.sign.data = vector->sign.data;
+	self->op->asym->mldsa.sigver.sign.length = vector->sign.length;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-DSA Verify)");
+
+	/* Verify the result */
+	TEST_ASSERT_EQUAL(self->result_op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
+		"Failed to verify the signature");
+
+	/* Negative test */
+	memcpy(sign, vector->sign.data, vector->sign.length);
+	sign_len = vector->sign.length;
+	sign[0] ^= 0x01;
+
+	self->op->asym->mldsa.op = RTE_CRYPTO_ML_DSA_OP_VERIFY;
+	self->op->asym->mldsa.sigver.message.data = vector->message.data;
+	self->op->asym->mldsa.sigver.message.length = vector->message.length;
+	self->op->asym->mldsa.sigver.ctx.data = vector->context.data;
+	self->op->asym->mldsa.sigver.ctx.length = vector->context.length;
+	self->op->asym->mldsa.sigver.mu.data = vector->mu.data;
+	self->op->asym->mldsa.sigver.mu.length = vector->mu.length;
+	self->op->asym->mldsa.sigver.pubkey.data = vector->pubkey.data;
+	self->op->asym->mldsa.sigver.pubkey.length = vector->pubkey.length;
+	self->op->asym->mldsa.sigver.sign.data = sign;
+	self->op->asym->mldsa.sigver.sign.length = sign_len;
+
+	TEST_ASSERT_SUCCESS(send_one_no_status_check(),
+		"Failed to process crypto op (ML-DSA Verify)");
+
+	/* Verify the result */
+	if (self->result_op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) {
+		rte_cryptodev_asym_session_free(dev_id, self->sess);
+		return TEST_FAILED;
+	}
+
+	rte_cryptodev_asym_session_free(dev_id, self->sess);
+	return TEST_SUCCESS;
+}
+
+static int
+test_mlkem_keygen(void)
+{
+	struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+	const struct rte_cryptodev_asymmetric_xform_capability *capa;
+	struct rte_cryptodev_asym_capability_idx idx;
+	uint8_t dev_id = ts_params->valid_devs[0];
+	int overall_status = TEST_SUCCESS;
+	int ret;
+
+	/* Check if ML-KEM is supported */
+	idx.type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+	capa = rte_cryptodev_asym_capability_get(dev_id, &idx);
+	if (capa == NULL) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-KEM. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	if (!(capa->op_types & (1 <<  RTE_CRYPTO_ML_KEM_OP_KEYGEN))) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-KEM keygen operation. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	for (uint8_t i = 0; i < RTE_DIM(mlkem_keygen_test_vectors); i++) {
+		if (!(capa->mlkem_capa[RTE_CRYPTO_ML_KEM_OP_KEYGEN] &
+			(1 << mlkem_keygen_test_vectors[i].param))) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support ML-KEM param %u. TestCase %s skipped\n",
+				mlkem_keygen_test_vectors[i].param,
+				mlkem_keygen_test_vectors[i].name);
+			printf("  %u) TestCase %s: skipped\n", i,
+				mlkem_keygen_test_vectors[i].name);
+			continue;
+		}
+		ret = mlkem_keygen(&mlkem_keygen_test_vectors[i]);
+		if (ret == TEST_SUCCESS || ret == TEST_SKIPPED) {
+			printf("  %u) TestCase %s: %s\n", i, mlkem_keygen_test_vectors[i].name,
+				(ret == TEST_SKIPPED) ? "skipped" : "passed");
+				continue;
+		}
+
+		printf("  %u) TestCase %s: failed\n", i, mlkem_keygen_test_vectors[i].name);
+		overall_status = TEST_FAILED;
+	}
+
+	return overall_status;
+}
+
+static int
+test_mlkem_encap(void)
+{
+	struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+	const struct rte_cryptodev_asymmetric_xform_capability *capa;
+	struct rte_cryptodev_asym_capability_idx idx;
+	uint8_t dev_id = ts_params->valid_devs[0];
+	int overall_status = TEST_SUCCESS;
+	int ret;
+
+	/* Check if ML-KEM is supported */
+	idx.type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+	capa = rte_cryptodev_asym_capability_get(dev_id, &idx);
+	if (capa == NULL) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-KEM. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	if (!(capa->op_types & (1 <<  RTE_CRYPTO_ML_KEM_OP_ENCAP))) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-KEM encap operation. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	for (uint8_t i = 0; i < RTE_DIM(mlkem_encap_test_vectors); i++) {
+		if (!(capa->mlkem_capa[RTE_CRYPTO_ML_KEM_OP_ENCAP] &
+			(1 << mlkem_encap_test_vectors[i].param))) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support ML-KEM param %u. TestCase %s skipped\n",
+				mlkem_encap_test_vectors[i].param,
+				mlkem_encap_test_vectors[i].name);
+			printf("  %u) TestCase %s: skipped\n", i,
+				mlkem_encap_test_vectors[i].name);
+			continue;
+		}
+		ret = mlkem_encap(&mlkem_encap_test_vectors[i]);
+		if (ret == TEST_SUCCESS || ret == TEST_SKIPPED) {
+			printf("  %u) TestCase %s: %s\n", i, mlkem_encap_test_vectors[i].name,
+				(ret == TEST_SKIPPED) ? "skipped" : "passed");
+				continue;
+		}
+
+		printf("  %u) TestCase %s: failed\n", i, mlkem_encap_test_vectors[i].name);
+		overall_status = TEST_FAILED;
+	}
+
+	return overall_status;
+}
+
+static int
+test_mlkem_decap(void)
+{
+	struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+	const struct rte_cryptodev_asymmetric_xform_capability *capa;
+	struct rte_cryptodev_asym_capability_idx idx;
+	uint8_t dev_id = ts_params->valid_devs[0];
+	int overall_status = TEST_SUCCESS;
+	int ret;
+
+	/* Check if ML-KEM is supported */
+	idx.type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+	capa = rte_cryptodev_asym_capability_get(dev_id, &idx);
+	if (capa == NULL) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-KEM. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	if (!(capa->op_types & (1 <<  RTE_CRYPTO_ML_KEM_OP_DECAP))) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-KEM decap operation. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	for (uint8_t i = 0; i < RTE_DIM(mlkem_decap_test_vectors); i++) {
+		if (!(capa->mlkem_capa[RTE_CRYPTO_ML_KEM_OP_DECAP] &
+			(1 << mlkem_decap_test_vectors[i].param))) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support ML-KEM param %u. TestCase %s skipped\n",
+				mlkem_decap_test_vectors[i].param,
+				mlkem_decap_test_vectors[i].name);
+			printf("  %u) TestCase %s: skipped\n", i,
+				mlkem_decap_test_vectors[i].name);
+			continue;
+		}
+		ret = mlkem_decap(&mlkem_decap_test_vectors[i]);
+		if (ret == TEST_SUCCESS || ret == TEST_SKIPPED) {
+			printf("  %u) TestCase %s: %s\n", i, mlkem_decap_test_vectors[i].name,
+				(ret == TEST_SKIPPED) ? "skipped" : "passed");
+				continue;
+		}
+
+		printf("  %u) TestCase %s: failed\n", i, mlkem_decap_test_vectors[i].name);
+		overall_status = TEST_FAILED;
+	}
+
+	return overall_status;
+}
+
+static int
+test_mldsa_keygen(void)
+{
+	struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+	const struct rte_cryptodev_asymmetric_xform_capability *capa;
+	struct rte_cryptodev_asym_capability_idx idx;
+	uint8_t dev_id = ts_params->valid_devs[0];
+	int overall_status = TEST_SUCCESS;
+	int ret;
+
+	/* Check if ML-DSA is supported */
+	idx.type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+	capa = rte_cryptodev_asym_capability_get(dev_id, &idx);
+	if (capa == NULL) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-DSA. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	if (!(capa->op_types & (1 <<  RTE_CRYPTO_ML_DSA_OP_KEYGEN))) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-DSA keygen operation. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	for (uint8_t i = 0; i < RTE_DIM(mldsa_keygen_test_vectors); i++) {
+		if (!(capa->mldsa_capa[RTE_CRYPTO_ML_DSA_OP_KEYGEN] &
+			(1 << mldsa_keygen_test_vectors[i].param))) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support ML-DSA param %u. TestCase %s skipped\n",
+				mldsa_keygen_test_vectors[i].param,
+				mldsa_keygen_test_vectors[i].name);
+			printf("  %u) TestCase %s: skipped\n", i,
+				mldsa_keygen_test_vectors[i].name);
+			continue;
+		}
+		ret = mldsa_keygen(&mldsa_keygen_test_vectors[i]);
+		if (ret == TEST_SUCCESS || ret == TEST_SKIPPED) {
+			printf("  %u) TestCase %s: %s\n", i, mldsa_keygen_test_vectors[i].name,
+				(ret == TEST_SKIPPED) ? "skipped" : "passed");
+				continue;
+		}
+
+		printf("  %u) TestCase %s: failed\n", i, mldsa_keygen_test_vectors[i].name);
+		overall_status = TEST_FAILED;
+	}
+
+	return overall_status;
+}
+
+static int
+test_mldsa_sign(void)
+{
+	struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+	const struct rte_cryptodev_asymmetric_xform_capability *capa;
+	struct rte_cryptodev_asym_capability_idx idx;
+	uint8_t dev_id = ts_params->valid_devs[0];
+	int overall_status = TEST_SUCCESS;
+	int ret;
+
+	/* Check if ML-DSA is supported */
+	idx.type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+	capa = rte_cryptodev_asym_capability_get(dev_id, &idx);
+	if (capa == NULL) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-DSA. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	if (!(capa->op_types & (1 <<  RTE_CRYPTO_ML_DSA_OP_SIGN))) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-DSA sign operation. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	for (uint8_t i = 0; i < RTE_DIM(mldsa_sign_test_vectors); i++) {
+		if (!(capa->mldsa_capa[RTE_CRYPTO_ML_DSA_OP_SIGN] &
+			(1 << mldsa_sign_test_vectors[i].param))) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support ML-DSA param %u. TestCase %s skipped\n",
+				mldsa_sign_test_vectors[i].param,
+				mldsa_sign_test_vectors[i].name);
+			printf("  %u) TestCase %s: skipped\n", i,
+				mldsa_sign_test_vectors[i].name);
+			continue;
+		}
+		ret = mldsa_sign(&mldsa_sign_test_vectors[i]);
+		if (ret == TEST_SUCCESS || ret == TEST_SKIPPED) {
+			printf("  %u) TestCase %s: %s\n", i, mldsa_sign_test_vectors[i].name,
+				(ret == TEST_SKIPPED) ? "skipped" : "passed");
+				continue;
+		}
+
+		printf("  %u) TestCase %s: failed\n", i, mldsa_sign_test_vectors[i].name);
+		overall_status = TEST_FAILED;
+	}
+
+	return overall_status;
+}
+
+static int
+test_mldsa_verify(void)
+{
+	struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+	const struct rte_cryptodev_asymmetric_xform_capability *capa;
+	struct rte_cryptodev_asym_capability_idx idx;
+	uint8_t dev_id = ts_params->valid_devs[0];
+	int overall_status = TEST_SUCCESS;
+	int ret;
+
+	/* Check if ML-DSA is supported */
+	idx.type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+	capa = rte_cryptodev_asym_capability_get(dev_id, &idx);
+	if (capa == NULL) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-DSA. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	if (!(capa->op_types & (1 <<  RTE_CRYPTO_ML_DSA_OP_VERIFY))) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-DSA verify operation. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	for (uint8_t i = 0; i < RTE_DIM(mldsa_verify_test_vectors); i++) {
+		if (!(capa->mldsa_capa[RTE_CRYPTO_ML_DSA_OP_VERIFY] &
+			(1 << mldsa_verify_test_vectors[i].param))) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support ML-DSA param %u. TestCase %s skipped\n",
+				mldsa_verify_test_vectors[i].param,
+				mldsa_verify_test_vectors[i].name);
+			printf("  %u) TestCase %s: skipped\n", i,
+				mldsa_verify_test_vectors[i].name);
+			continue;
+		}
+		ret = mldsa_verify(&mldsa_verify_test_vectors[i]);
+		if (ret == TEST_SUCCESS || ret == TEST_SKIPPED) {
+			printf("  %u) TestCase %s: %s\n", i, mldsa_verify_test_vectors[i].name,
+				(ret == TEST_SKIPPED) ? "skipped" : "passed");
+				continue;
+		}
+
+		printf("  %u) TestCase %s: failed\n", i, mldsa_verify_test_vectors[i].name);
+		overall_status = TEST_FAILED;
+	}
+
+	return overall_status;
+}
+
 #define SET_RSA_PARAM(arg, vector, coef) \
 	uint8_t coef[TEST_DATA_SIZE] = { }; \
 	memcpy(coef, vector->coef.data, vector->coef.len); \
@@ -3987,6 +4837,12 @@ static struct unit_test_suite cryptodev_openssl_asym_testsuite  = {
 			ut_setup_asym, ut_teardown_asym,
 			modular_exponentiation, &modex_group_test_cases[7]),
 		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_eddsa_sign_verify_all_curve),
+		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_mlkem_keygen),
+		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_mlkem_encap),
+		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_mlkem_decap),
+		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_mldsa_keygen),
+		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_mldsa_sign),
+		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_mldsa_verify),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
 };
diff --git a/app/test/test_cryptodev_ml_dsa_test_vectors.h b/app/test/test_cryptodev_ml_dsa_test_vectors.h
new file mode 100644
index 0000000000..7dfaca5f90
--- /dev/null
+++ b/app/test/test_cryptodev_ml_dsa_test_vectors.h
@@ -0,0 +1,1856 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2025 Marvell.
+ */
+
+#ifndef __TEST_CRYPTODEV_ML_DSA_TEST_VECTORS_H__
+#define __TEST_CRYPTODEV_ML_DSA_TEST_VECTORS_H__
+
+#include "rte_crypto_asym.h"
+
+struct crypto_testsuite_mldsa_params {
+	const char *name;
+	enum rte_crypto_ml_dsa_param_set param;
+	enum rte_crypto_auth_algorithm hash;
+	rte_crypto_param seed;
+	rte_crypto_param privkey;
+	rte_crypto_param pubkey;
+	rte_crypto_param message;
+	rte_crypto_param context;
+	rte_crypto_param mu;
+	rte_crypto_param sign;
+	bool sign_deterministic;
+};
+
+/* Seed */
+uint8_t mldsa_44_seed[] = {
+	0xf4, 0x41, 0xc9, 0x62, 0x17, 0x32, 0x2c, 0xbc,
+	0xcf, 0x05, 0xf7, 0x5b, 0xd5, 0xfb, 0x0a, 0x0a,
+	0x78, 0xbf, 0xad, 0xab, 0x89, 0x6e, 0x88, 0xdb,
+	0xb4, 0x08, 0x90, 0xe0, 0x16, 0x9b, 0xb6, 0x66,
+};
+
+/* Private key */
+uint8_t mldsa_44_privkey[] = {
+	0xcc, 0x2c, 0x93, 0xce, 0xfc, 0x0b, 0xf6, 0x74,
+	0x93, 0x28, 0x95, 0xe8, 0xc0, 0xc8, 0x83, 0xb8,
+	0xc9, 0x0c, 0x9a, 0x5c, 0x18, 0xd2, 0x79, 0x5c,
+	0xf3, 0x58, 0xd8, 0x02, 0x6c, 0x5e, 0xad, 0x79,
+	0xc1, 0xae, 0x0a, 0x97, 0x90, 0x41, 0x10, 0x32,
+	0x59, 0x46, 0x12, 0x27, 0x0a, 0xa3, 0xc7, 0xf0,
+	0x74, 0x54, 0x3d, 0xb2, 0x24, 0xc2, 0xa2, 0xec,
+	0xaf, 0x31, 0xa0, 0xf4, 0x78, 0x97, 0x7c, 0x6a,
+	0xdc, 0x91, 0x87, 0x60, 0x01, 0xa9, 0x19, 0x2d,
+	0x0d, 0xca, 0xb4, 0x14, 0x9d, 0x41, 0xe3, 0x18,
+	0x4b, 0x99, 0x31, 0xfa, 0xf4, 0xfa, 0xc4, 0x75,
+	0x93, 0x87, 0xc7, 0x7a, 0x8f, 0x0e, 0xc6, 0xb2,
+	0xfa, 0xf6, 0x48, 0x84, 0x17, 0x42, 0x01, 0xcb,
+	0xd2, 0x55, 0x40, 0x2f, 0x23, 0x21, 0x91, 0x11,
+	0x40, 0x00, 0xdc, 0x91, 0x3d, 0xf5, 0x96, 0xdb,
+	0xb3, 0x6d, 0xd5, 0xf4, 0xc5, 0x11, 0x96, 0x8f,
+	0x13, 0x25, 0x4a, 0x24, 0xb3, 0x90, 0x9b, 0x16,
+	0x30, 0x20, 0x96, 0x10, 0x10, 0x97, 0x6c, 0xd0,
+	0x26, 0x26, 0x61, 0x84, 0x85, 0x1b, 0xb2, 0x81,
+	0x5c, 0x10, 0x88, 0x48, 0xc8, 0x8d, 0x1c, 0x42,
+	0x61, 0x19, 0x32, 0x04, 0x81, 0xa6, 0x89, 0x98,
+	0x42, 0x62, 0x14, 0xa3, 0x90, 0xc8, 0xc2, 0x4c,
+	0x41, 0x04, 0x2c, 0x5b, 0x26, 0x2a, 0xd1, 0x30,
+	0x12, 0x18, 0x40, 0x71, 0x08, 0x98, 0x70, 0x60,
+	0x40, 0x09, 0x4a, 0x44, 0x0a, 0x24, 0x43, 0x92,
+	0x04, 0x20, 0x06, 0x80, 0xa2, 0x01, 0x18, 0x47,
+	0x12, 0x23, 0xc7, 0x6c, 0x50, 0x32, 0x61, 0xda,
+	0x26, 0x40, 0x84, 0x98, 0x90, 0xd3, 0x04, 0x66,
+	0x52, 0xb8, 0x70, 0x99, 0x02, 0x6c, 0x64, 0xb2,
+	0x00, 0x1b, 0x35, 0x90, 0x23, 0x00, 0x92, 0x01,
+	0x02, 0x20, 0x12, 0x89, 0x25, 0x62, 0xa6, 0x4d,
+	0x1b, 0x29, 0x08, 0x08, 0x46, 0x72, 0xa1, 0x18,
+	0x11, 0x03, 0x80, 0x60, 0xd4, 0x38, 0x80, 0x64,
+	0x36, 0x4e, 0x23, 0x30, 0x8e, 0x23, 0x81, 0x60,
+	0xd1, 0x84, 0x89, 0xe2, 0xa8, 0x2d, 0x80, 0x92,
+	0x61, 0x8a, 0x22, 0x28, 0x0a, 0xc9, 0x50, 0xe3,
+	0x96, 0x40, 0x84, 0xa0, 0x0d, 0xd8, 0xc2, 0x2c,
+	0xd1, 0x30, 0x10, 0x18, 0xa0, 0x48, 0xe2, 0xb2,
+	0x04, 0x00, 0xa8, 0x29, 0x19, 0x42, 0x68, 0xa3,
+	0xa2, 0x71, 0xd9, 0xc0, 0x45, 0xa2, 0xc6, 0x4c,
+	0x51, 0x36, 0x71, 0xc1, 0x40, 0x02, 0x08, 0x12,
+	0x72, 0x90, 0x04, 0x2e, 0x80, 0x30, 0x24, 0x8b,
+	0x90, 0x44, 0x82, 0x82, 0x68, 0xa2, 0x84, 0x2d,
+	0x08, 0x00, 0x61, 0x23, 0x82, 0x48, 0x00, 0x33,
+	0x29, 0x58, 0x48, 0x86, 0x01, 0x01, 0x21, 0x62,
+	0xa8, 0x91, 0xe3, 0x10, 0x6c, 0x58, 0x24, 0x09,
+	0x0c, 0x14, 0x02, 0x63, 0x22, 0x20, 0x12, 0x48,
+	0x70, 0x81, 0x26, 0x6e, 0x00, 0x86, 0x31, 0x1a,
+	0x22, 0x65, 0x40, 0x38, 0x00, 0x02, 0x47, 0x09,
+	0xc9, 0x82, 0x8c, 0x82, 0xa0, 0x2c, 0xd3, 0x04,
+	0x45, 0x50, 0xb0, 0x28, 0xd0, 0x10, 0x8d, 0x1c,
+	0x10, 0x52, 0x4b, 0x00, 0x66, 0xc8, 0xc0, 0x08,
+	0x9a, 0xa8, 0x2d, 0xd4, 0x02, 0x8a, 0x1b, 0x35,
+	0x65, 0x04, 0xc7, 0x28, 0x84, 0x38, 0x50, 0x18,
+	0x20, 0x4a, 0x91, 0x18, 0x8c, 0x9b, 0x20, 0x09,
+	0x94, 0x08, 0x71, 0x64, 0x06, 0x25, 0x20, 0x23,
+	0x09, 0xd8, 0x82, 0x68, 0x5a, 0xa6, 0x31, 0x63,
+	0x36, 0x32, 0x5c, 0x12, 0x62, 0xdb, 0x32, 0x6e,
+	0x14, 0x93, 0x68, 0x9a, 0x34, 0x80, 0x83, 0x44,
+	0x4a, 0x18, 0x13, 0x49, 0x43, 0xb8, 0x0d, 0xda,
+	0x92, 0x41, 0x42, 0xb8, 0x84, 0x52, 0x94, 0x91,
+	0x04, 0x05, 0x4d, 0xa2, 0x38, 0x64, 0x01, 0x19,
+	0x05, 0x18, 0xa2, 0x4d, 0x90, 0x34, 0x26, 0x91,
+	0x30, 0x68, 0x1c, 0x14, 0x44, 0x4b, 0x18, 0x22,
+	0x12, 0x90, 0x91, 0x42, 0x96, 0x91, 0x19, 0x48,
+	0x4c, 0x24, 0x46, 0x80, 0xc3, 0xb8, 0x8c, 0x1c,
+	0x80, 0x8d, 0x18, 0x45, 0x88, 0xd8, 0x94, 0x4c,
+	0x13, 0x02, 0x65, 0xd3, 0x22, 0x29, 0x49, 0x04,
+	0x82, 0x04, 0xc2, 0x40, 0x04, 0x34, 0x21, 0xe1,
+	0x34, 0x46, 0x20, 0x90, 0x44, 0x93, 0x14, 0x44,
+	0xdb, 0xc0, 0x4d, 0x1b, 0xa2, 0x24, 0x5a, 0x24,
+	0x68, 0x10, 0x46, 0x66, 0x11, 0x43, 0x29, 0xd0,
+	0x90, 0x0d, 0x49, 0x12, 0x4c, 0xc1, 0x96, 0x2c,
+	0xdb, 0x22, 0x65, 0xe4, 0x16, 0x24, 0xd1, 0x24,
+	0x26, 0x53, 0xb8, 0x45, 0x8a, 0xb4, 0x11, 0x04,
+	0x96, 0x28, 0x80, 0x22, 0x8e, 0xd1, 0x10, 0x05,
+	0x44, 0x44, 0x8a, 0x5c, 0xb4, 0x50, 0xdc, 0x10,
+	0x02, 0xc1, 0xa2, 0x4c, 0x11, 0x05, 0x2c, 0x21,
+	0x39, 0x6a, 0x64, 0x36, 0x01, 0x09, 0xc3, 0x0c,
+	0x9a, 0x24, 0x52, 0x92, 0x20, 0x0a, 0xd2, 0xa8,
+	0x49, 0x99, 0xc6, 0x8d, 0x50, 0x26, 0x62, 0x09,
+	0x42, 0x05, 0x5b, 0xc0, 0x41, 0xd0, 0x22, 0x25,
+	0x09, 0xb4, 0x2d, 0x98, 0xa2, 0x24, 0x12, 0x84,
+	0x0d, 0xca, 0x98, 0x11, 0x22, 0x80, 0x21, 0x1b,
+	0x00, 0x44, 0x84, 0xc6, 0x89, 0x92, 0x48, 0x42,
+	0x50, 0xc8, 0x60, 0x24, 0x15, 0x69, 0xa2, 0x48,
+	0x06, 0xc4, 0xb0, 0x24, 0x63, 0x14, 0x40, 0x12,
+	0xc4, 0x61, 0x82, 0x30, 0x60, 0x88, 0x96, 0x89,
+	0xc9, 0xc0, 0x89, 0x12, 0x36, 0x82, 0x8c, 0xc0,
+	0x09, 0xc0, 0x88, 0x91, 0xdb, 0x10, 0x64, 0x08,
+	0x36, 0x71, 0x94, 0x10, 0x46, 0x20, 0x83, 0x10,
+	0x13, 0x13, 0x4c, 0x08, 0x28, 0x45, 0x24, 0xb9,
+	0x64, 0x09, 0xb0, 0x48, 0x1c, 0x25, 0x50, 0x23,
+	0x40, 0x90, 0xe0, 0x96, 0x50, 0x9a, 0x38, 0x41,
+	0xcc, 0xb2, 0x2c, 0xdb, 0x04, 0x66, 0x61, 0x48,
+	0x30, 0x02, 0x34, 0x4e, 0xd1, 0xc2, 0x85, 0xc9,
+	0x06, 0x41, 0x19, 0x30, 0x69, 0xc8, 0x94, 0x68,
+	0x1c, 0x83, 0x70, 0x03, 0x10, 0x4d, 0xc2, 0x16,
+	0x4e, 0x64, 0x92, 0x30, 0x60, 0x16, 0x84, 0xa2,
+	0xa8, 0x90, 0xa4, 0x38, 0x11, 0x0a, 0x88, 0x05,
+	0x10, 0x93, 0x88, 0x43, 0x06, 0x10, 0x18, 0x10,
+	0x70, 0x03, 0x28, 0x42, 0x89, 0x28, 0x8d, 0x8a,
+	0xa8, 0x09, 0x94, 0x42, 0x85, 0xa3, 0x10, 0x61,
+	0x0c, 0x45, 0x50, 0x04, 0x31, 0x4c, 0xd1, 0x10,
+	0x12, 0x8b, 0x96, 0x05, 0x03, 0xa0, 0x89, 0x21,
+	0xc4, 0x4d, 0x61, 0xc8, 0x61, 0x09, 0x99, 0x10,
+	0x59, 0x96, 0x49, 0x00, 0x89, 0x08, 0x23, 0x00,
+	0x10, 0xcc, 0xa4, 0x61, 0x01, 0x25, 0x80, 0x21,
+	0x31, 0x09, 0x13, 0x28, 0x0d, 0x1c, 0x05, 0x85,
+	0x62, 0x92, 0x44, 0x09, 0x10, 0x8a, 0x5a, 0xa6,
+	0x20, 0x89, 0xb0, 0x20, 0x0c, 0xb3, 0x01, 0xc9,
+	0x26, 0x61, 0x0b, 0x34, 0x6a, 0x8b, 0x44, 0x0e,
+	0xf2, 0x47, 0x18, 0xf8, 0x4a, 0xfa, 0x45, 0x60,
+	0x87, 0xeb, 0x0f, 0xff, 0x75, 0xa6, 0xba, 0x18,
+	0x9a, 0x7d, 0x37, 0xc4, 0xc7, 0x7e, 0x1a, 0xc9,
+	0x0d, 0x06, 0x53, 0xca, 0xf0, 0x2c, 0xe9, 0xe9,
+	0x4b, 0x5f, 0x8b, 0xbc, 0x77, 0xc6, 0x71, 0x68,
+	0x4f, 0x8c, 0x3b, 0x30, 0x59, 0x91, 0xf0, 0xb5,
+	0x6d, 0xa6, 0x28, 0x2c, 0xd4, 0x0a, 0x00, 0x27,
+	0x6a, 0x39, 0x17, 0x88, 0xa9, 0x93, 0xbb, 0x6e,
+	0xda, 0x3e, 0x4b, 0xb7, 0x1b, 0x6a, 0xb2, 0xe2,
+	0xc4, 0x6f, 0x21, 0x78, 0x74, 0xff, 0xa2, 0x02,
+	0x65, 0x68, 0xa4, 0xce, 0xb4, 0xfe, 0x0c, 0x18,
+	0x59, 0xb9, 0xc8, 0x33, 0x41, 0x27, 0xa1, 0x4b,
+	0xcf, 0xe9, 0xa9, 0xd7, 0x2d, 0xf9, 0xcd, 0xc6,
+	0xde, 0x4e, 0x1d, 0x7d, 0x07, 0xf4, 0xda, 0xed,
+	0x89, 0xa1, 0xef, 0xbc, 0xec, 0x1b, 0xc3, 0x07,
+	0xfd, 0xf5, 0x96, 0xa3, 0x6c, 0x70, 0xc8, 0xb9,
+	0x9f, 0x46, 0x0a, 0xad, 0x46, 0x01, 0xa1, 0x92,
+	0x7c, 0xd1, 0x12, 0x78, 0x89, 0x89, 0x98, 0x68,
+	0x9e, 0xdd, 0xd9, 0x7b, 0x9f, 0x2b, 0x29, 0xc1,
+	0x0e, 0x29, 0xb0, 0x44, 0x7c, 0x22, 0xd7, 0x67,
+	0x47, 0x91, 0xf0, 0xf8, 0x56, 0x79, 0x89, 0x42,
+	0x95, 0x60, 0x53, 0x32, 0xc1, 0x14, 0x48, 0x56,
+	0x67, 0x00, 0x80, 0x86, 0xcd, 0x80, 0x21, 0x75,
+	0xe8, 0xe2, 0x41, 0x6a, 0x5d, 0xb2, 0x12, 0x57,
+	0x1e, 0x83, 0x34, 0xa4, 0x95, 0x4e, 0x0e, 0x71,
+	0xac, 0xcb, 0x09, 0xef, 0xea, 0x4e, 0xe0, 0x4d,
+	0x44, 0xb2, 0x67, 0xd2, 0x6e, 0x78, 0x01, 0xb5,
+	0x09, 0x64, 0xa7, 0xdf, 0xe6, 0x16, 0x72, 0x6b,
+	0x19, 0xe5, 0x88, 0x8a, 0x06, 0xae, 0x0a, 0x93,
+	0xdb, 0xee, 0x0e, 0xf6, 0x52, 0x84, 0x95, 0x2b,
+	0xf8, 0xf4, 0xcd, 0x5d, 0x8b, 0x3a, 0x86, 0x87,
+	0x8e, 0x8b, 0x97, 0x65, 0xb1, 0xd6, 0x50, 0xbc,
+	0xa7, 0xf0, 0x32, 0xb5, 0x39, 0x1e, 0x10, 0x7d,
+	0x96, 0x11, 0xc1, 0xe8, 0x47, 0xfa, 0xdd, 0x24,
+	0x22, 0xb6, 0x43, 0xb2, 0x41, 0x95, 0x98, 0x1a,
+	0x3f, 0x0f, 0x9a, 0xd3, 0xc4, 0x10, 0x19, 0x85,
+	0x0a, 0x0d, 0xde, 0xb7, 0x76, 0xec, 0xe3, 0x57,
+	0x2e, 0x38, 0x4e, 0xb1, 0x2e, 0x4a, 0xaf, 0xc8,
+	0x78, 0xa7, 0xb3, 0x1e, 0xaf, 0xe0, 0xe4, 0xbb,
+	0xc8, 0x0b, 0x24, 0x04, 0x08, 0xd2, 0xbc, 0x91,
+	0xca, 0x8e, 0x4e, 0x85, 0x39, 0x76, 0x20, 0xc9,
+	0xa7, 0x47, 0x8b, 0x6a, 0xd9, 0xc8, 0xb7, 0xb0,
+	0xa5, 0xa2, 0x85, 0x48, 0x4c, 0xcb, 0x16, 0xaf,
+	0x45, 0x48, 0x00, 0xbe, 0x67, 0xef, 0x67, 0x65,
+	0xa3, 0x9d, 0x43, 0x07, 0x59, 0x88, 0x9a, 0xad,
+	0xe5, 0xad, 0x1e, 0xeb, 0xd5, 0xd4, 0xc7, 0xa4,
+	0xb9, 0x40, 0x70, 0x2c, 0xe1, 0xcb, 0x5c, 0x3f,
+	0x49, 0x6b, 0x51, 0xbf, 0xd3, 0xb7, 0xea, 0x33,
+	0x52, 0x73, 0xcf, 0x26, 0x19, 0x54, 0x1d, 0xb6,
+	0x33, 0x5d, 0x1a, 0x88, 0xdb, 0xd6, 0xfe, 0xae,
+	0xf4, 0x45, 0x67, 0x80, 0x8a, 0xfc, 0xc4, 0xbe,
+	0xfb, 0x6a, 0x4a, 0x75, 0x88, 0x35, 0x26, 0x1f,
+	0x90, 0x65, 0x26, 0x5e, 0xb8, 0x0d, 0x15, 0x9d,
+	0x70, 0x76, 0xf2, 0xfd, 0xed, 0x55, 0x71, 0x2b,
+	0xe8, 0x2d, 0xc0, 0x28, 0xee, 0x53, 0x7c, 0xa1,
+	0x3e, 0x86, 0x74, 0xa2, 0xd3, 0x9e, 0x2c, 0x70,
+	0x15, 0x3a, 0x90, 0xfd, 0x1d, 0xac, 0x81, 0x2d,
+	0xa6, 0x6a, 0xe6, 0xd7, 0x7f, 0xd9, 0x97, 0xc9,
+	0x47, 0x7c, 0x07, 0xe6, 0x35, 0x45, 0xc9, 0x1f,
+	0x08, 0xbc, 0x14, 0xdb, 0x12, 0x84, 0xc3, 0xc8,
+	0xe2, 0x86, 0xa3, 0xa2, 0x1e, 0xfb, 0x3f, 0xca,
+	0x92, 0x04, 0xe0, 0x6b, 0x29, 0xe0, 0xe0, 0x23,
+	0x51, 0x40, 0x8e, 0xec, 0xf8, 0x87, 0xa2, 0x7a,
+	0x2d, 0x8b, 0xc2, 0x62, 0x8c, 0x29, 0x82, 0x4b,
+	0x86, 0x1a, 0xa7, 0xc6, 0xaa, 0x24, 0x5f, 0x24,
+	0x03, 0x20, 0xa8, 0x3c, 0xa3, 0xcb, 0xd1, 0x60,
+	0x64, 0x7d, 0x22, 0x9b, 0x07, 0x46, 0x1e, 0xff,
+	0x43, 0xa9, 0x38, 0x34, 0x0f, 0x01, 0x00, 0x7f,
+	0xc6, 0xcb, 0x0a, 0xed, 0x73, 0xc0, 0xfb, 0x77,
+	0x80, 0x8c, 0x2c, 0x4c, 0xa5, 0x20, 0xe8, 0xcf,
+	0x37, 0xf9, 0x00, 0x12, 0xe1, 0x6c, 0xb5, 0x9a,
+	0x91, 0xbe, 0x1f, 0xaf, 0xf1, 0x8c, 0x6e, 0x09,
+	0xea, 0xcf, 0xac, 0x43, 0x6e, 0x32, 0xd0, 0xf4,
+	0x89, 0x4e, 0x42, 0xc2, 0xe7, 0x84, 0x7a, 0x66,
+	0xb5, 0x2b, 0x5c, 0x7d, 0x83, 0x4b, 0xd4, 0x3d,
+	0x81, 0x6d, 0x68, 0xb9, 0x72, 0xe5, 0xd5, 0xe5,
+	0xf5, 0x9c, 0x4d, 0x95, 0xcd, 0xcd, 0x4d, 0x9a,
+	0x4e, 0x69, 0xb9, 0x8a, 0x1e, 0x96, 0x69, 0xc0,
+	0xe0, 0x39, 0x02, 0x21, 0x1c, 0x82, 0xd9, 0x5b,
+	0xe5, 0xde, 0x34, 0xff, 0xf0, 0x15, 0xc7, 0x9a,
+	0x62, 0x83, 0xca, 0xa3, 0x70, 0x15, 0xeb, 0x8f,
+	0x73, 0x0e, 0xa9, 0x9c, 0xe9, 0xe3, 0xe7, 0xfc,
+	0xb4, 0xcb, 0xac, 0xdf, 0x61, 0x91, 0xf3, 0x4b,
+	0x87, 0xa6, 0x29, 0xea, 0x36, 0x81, 0x07, 0x3e,
+	0xae, 0x69, 0xee, 0x87, 0x2a, 0x30, 0x1c, 0x97,
+	0x96, 0x40, 0x08, 0x48, 0xcf, 0x5f, 0xfe, 0x57,
+	0x23, 0xfd, 0xb7, 0x9a, 0x69, 0xef, 0xf5, 0x6e,
+	0xc9, 0xdd, 0x95, 0x2b, 0x17, 0xd5, 0x2c, 0xad,
+	0xa4, 0x49, 0x78, 0xb1, 0xd1, 0x00, 0xe7, 0xca,
+	0xcb, 0x20, 0x9e, 0xba, 0xea, 0xc8, 0xd4, 0x9b,
+	0x84, 0xac, 0x0b, 0xf0, 0x3b, 0x2c, 0xf0, 0x95,
+	0x3b, 0x5b, 0xf8, 0xfe, 0xe5, 0xc6, 0xee, 0x7c,
+	0x9e, 0x41, 0xf0, 0xef, 0xcf, 0x4d, 0xdd, 0xe8,
+	0x63, 0x6b, 0xcf, 0xe9, 0xd2, 0x80, 0x98, 0xf9,
+	0x7d, 0x22, 0x7e, 0xfc, 0xdd, 0x50, 0x6b, 0xa3,
+	0x6d, 0x7c, 0xed, 0x35, 0xbc, 0x28, 0x64, 0x03,
+	0xe6, 0x01, 0xac, 0x7c, 0xe1, 0x9b, 0x08, 0x6f,
+	0xd8, 0xdc, 0xaf, 0xb6, 0x9d, 0x4c, 0xdf, 0xb1,
+	0xde, 0xf4, 0x90, 0x5b, 0x46, 0xee, 0x7d, 0x28,
+	0xfb, 0xaa, 0xa9, 0x69, 0x47, 0xf5, 0x52, 0x74,
+	0x97, 0x9f, 0x8b, 0xbb, 0x26, 0x8f, 0x0d, 0x89,
+	0x2f, 0xc9, 0x57, 0xac, 0x2f, 0x88, 0x12, 0xdd,
+	0x12, 0x2f, 0x75, 0x97, 0xc7, 0x7b, 0x45, 0x46,
+	0x3a, 0x52, 0x4b, 0xf6, 0x76, 0xe0, 0x99, 0xef,
+	0xbe, 0xbf, 0xed, 0x0d, 0x32, 0xed, 0xc6, 0x5e,
+	0x6a, 0xe6, 0x0e, 0x12, 0xd4, 0xce, 0xf8, 0x0c,
+	0x7b, 0x4f, 0x1d, 0x3b, 0xf8, 0xaf, 0xdd, 0xd1,
+	0x78, 0x74, 0x59, 0xc7, 0xe4, 0xbc, 0xe3, 0xdd,
+	0x4a, 0xa7, 0x77, 0xa5, 0xcd, 0x80, 0x7c, 0x6b,
+	0x19, 0x46, 0x3d, 0xbd, 0x0a, 0x75, 0x48, 0xfa,
+	0x1c, 0xee, 0x02, 0xe9, 0x79, 0x10, 0x6c, 0xb4,
+	0xb3, 0xb2, 0xbe, 0xc8, 0x5c, 0xd1, 0xa1, 0xe2,
+	0xd5, 0x0a, 0xb5, 0xf3, 0x0c, 0x3f, 0x03, 0xb9,
+	0x2f, 0x61, 0x44, 0x95, 0xe1, 0x16, 0xcb, 0xc1,
+	0xee, 0xb3, 0xb8, 0x85, 0xd6, 0x1c, 0xf4, 0xfa,
+	0x86, 0x73, 0xc5, 0xf3, 0xba, 0xb5, 0xe0, 0x95,
+	0x34, 0x95, 0x72, 0xfa, 0xa7, 0xb8, 0x50, 0xba,
+	0xfb, 0xa6, 0x3c, 0x0f, 0x3c, 0xe3, 0xaa, 0x56,
+	0x05, 0xaf, 0x08, 0xec, 0x50, 0x12, 0x73, 0x25,
+	0x29, 0x72, 0xf5, 0xf6, 0xee, 0x06, 0xe4, 0x05,
+	0x1a, 0xe1, 0x1a, 0x13, 0x3f, 0xa3, 0x55, 0x16,
+	0x12, 0x17, 0x88, 0xd2, 0xa7, 0xc1, 0xd0, 0xf2,
+	0x7d, 0x51, 0x46, 0x36, 0x2e, 0x77, 0xa8, 0x02,
+	0x67, 0xad, 0xe7, 0x63, 0xaa, 0xbf, 0xe5, 0xbf,
+	0xa1, 0xab, 0xc4, 0xf6, 0x72, 0xae, 0xdf, 0x79,
+	0x0e, 0x82, 0x47, 0xb5, 0xf4, 0x48, 0x39, 0x22,
+	0xe3, 0x0a, 0x94, 0x5e, 0x3a, 0x4b, 0xa6, 0xa7,
+	0x5c, 0xb8, 0xec, 0x3e, 0x10, 0xae, 0x94, 0x34,
+	0x2c, 0xc0, 0x4b, 0xdd, 0xca, 0x4d, 0xc9, 0x7c,
+	0xf8, 0x2e, 0x32, 0x4e, 0x00, 0x2c, 0x34, 0x71,
+	0x28, 0xad, 0xd5, 0xcb, 0x19, 0xb8, 0x1d, 0xaa,
+	0x85, 0xac, 0xec, 0x16, 0xb6, 0x1f, 0x95, 0xc5,
+	0xa9, 0x4b, 0x8a, 0xfc, 0x70, 0xb7, 0x34, 0xb0,
+	0x63, 0x55, 0xff, 0x15, 0xc2, 0x72, 0x74, 0xe0,
+	0x6d, 0x01, 0x3d, 0xf0, 0x6a, 0xab, 0x4b, 0x8a,
+	0x72, 0xdc, 0x2b, 0x0a, 0x8a, 0xf4, 0x02, 0x1b,
+	0x0b, 0x51, 0xd8, 0xf7, 0x17, 0xcf, 0x48, 0xf0,
+	0x97, 0xa0, 0xc2, 0x7a, 0xc4, 0x64, 0x59, 0x2a,
+	0xa3, 0x27, 0xbe, 0x3b, 0xf7, 0xc5, 0x6d, 0x51,
+	0x29, 0xe2, 0x68, 0x87, 0x75, 0x71, 0x72, 0xac,
+	0xc8, 0xc1, 0xc8, 0xe5, 0xf6, 0x8a, 0x27, 0x8c,
+	0x45, 0x03, 0x10, 0xf7, 0x1a, 0xff, 0x1b, 0x04,
+	0x1c, 0xaf, 0x27, 0x7a, 0x57, 0xac, 0x0f, 0x57,
+	0x2a, 0x74, 0xd0, 0x46, 0x64, 0xbf, 0xc9, 0xe8,
+	0x35, 0x6b, 0x5c, 0x79, 0x9a, 0x51, 0xeb, 0xd1,
+	0xb3, 0x1d, 0xfd, 0x2f, 0x83, 0x2e, 0x24, 0x95,
+	0x94, 0xc7, 0x9d, 0x9f, 0x5d, 0x5c, 0x8e, 0x6c,
+	0x8f, 0xfc, 0xce, 0x89, 0x67, 0x9b, 0x38, 0x4b,
+	0x0d, 0x44, 0x9a, 0xb5, 0x74, 0xbf, 0x88, 0x90,
+	0xa1, 0xf2, 0xc4, 0xd2, 0xb3, 0x07, 0xe5, 0x34,
+	0x62, 0xc0, 0xfc, 0x3f, 0xdb, 0x77, 0x8e, 0x84,
+	0x61, 0xc1, 0x15, 0xf6, 0x5f, 0x5d, 0x73, 0xbc,
+	0x0c, 0x70, 0x32, 0xeb, 0x2c, 0xd3, 0x19, 0x83,
+	0x22, 0xfa, 0x5b, 0xcc, 0x5f, 0xbf, 0xbe, 0xfc,
+	0x3c, 0x28, 0x74, 0x2d, 0x33, 0x8f, 0x74, 0xe5,
+	0xca, 0xc9, 0x84, 0x8f, 0xba, 0x48, 0x11, 0x84,
+	0x33, 0xf0, 0x7d, 0x5c, 0xad, 0x47, 0x36, 0xf7,
+	0x33, 0xb0, 0xbb, 0x44, 0x65, 0x72, 0x45, 0xd1,
+	0x40, 0x4c, 0x39, 0x8b, 0x16, 0x90, 0x74, 0xa3,
+	0xd2, 0x3c, 0xc6, 0x7a, 0xa4, 0x4f, 0x0d, 0x9a,
+	0xe1, 0xfd, 0x49, 0x82, 0xc6, 0x69, 0xf7, 0xe7,
+	0x3d, 0xeb, 0x2b, 0xbe, 0xfd, 0x1a, 0x73, 0x2c,
+	0xf3, 0xbc, 0xd6, 0xaa, 0xaa, 0x54, 0x22, 0x5c,
+	0x54, 0x92, 0x73, 0xe3, 0x79, 0x0a, 0x87, 0x20,
+	0x82, 0xdb, 0x02, 0x42, 0x81, 0xb1, 0xf7, 0x0d,
+	0xf0, 0xd8, 0x56, 0x0f, 0x74, 0x0c, 0x65, 0x7c,
+	0x8c, 0x96, 0xb9, 0x9f, 0xfa, 0xb6, 0x48, 0x66,
+	0xf1, 0xbe, 0xf8, 0x46, 0x70, 0xe5, 0x26, 0xc1,
+	0x68, 0x7f, 0x81, 0x72, 0x14, 0x2f, 0x96, 0x22,
+	0x05, 0xd1, 0xc0, 0xb8, 0x93, 0x9d, 0x02, 0x8b,
+	0xff, 0x0b, 0x2d, 0xb9, 0x01, 0xaa, 0x61, 0x09,
+	0x9d, 0x55, 0x21, 0xdd, 0xda, 0xec, 0x44, 0xce,
+	0x00, 0x98, 0xf8, 0x34, 0x86, 0x49, 0xd4, 0x72,
+	0x90, 0xfb, 0xd7, 0xb1, 0x33, 0xb9, 0xe5, 0xd3,
+	0xc0, 0x27, 0x88, 0x4b, 0x6d, 0x84, 0x34, 0x7c,
+	0x77, 0x7e, 0xcf, 0x27, 0x4d, 0x5f, 0x1d, 0xb4,
+	0xb4, 0xac, 0xcc, 0x7d, 0x83, 0xc2, 0x89, 0x3d,
+	0xeb, 0xb6, 0xa3, 0x57, 0x30, 0xbc, 0x94, 0x9f,
+	0xe9, 0x63, 0xca, 0x7d, 0xa3, 0x9d, 0x0a, 0x43,
+	0xed, 0x4a, 0xfd, 0xd3, 0x5e, 0x23, 0x97, 0x75,
+	0x28, 0x97, 0xaa, 0x0c, 0xf9, 0xa1, 0x03, 0xb1,
+	0x55, 0x82, 0xec, 0xcc, 0x91, 0x27, 0xf4, 0xcf,
+	0x63, 0x10, 0xf3, 0xd3, 0x8b, 0x5c, 0xa8, 0xc2,
+	0x58, 0x4d, 0xf5, 0x67, 0xe9, 0xe1, 0xc2, 0xf2,
+	0x11, 0x5e, 0xf2, 0xe1, 0x1c, 0xf2, 0x0c, 0x50,
+	0x71, 0x9f, 0xd1, 0x1c, 0xb8, 0x82, 0x7d, 0x3b,
+	0x23, 0x90, 0x4e, 0x08, 0xbf, 0x51, 0xa1, 0xc9,
+	0xe9, 0x90, 0x07, 0x4e, 0xb3, 0xcc, 0x72, 0xbf,
+	0x2c, 0x87, 0x18, 0x3b, 0xc7, 0x29, 0x8a, 0x3b,
+	0x0b, 0x4c, 0x55, 0x20, 0x08, 0xb0, 0xa3, 0x04,
+	0xf9, 0x6b, 0x53, 0x84, 0x4c, 0xef, 0xc1, 0xc6,
+	0xa4, 0xa9, 0xba, 0xe6, 0xb8, 0x72, 0x60, 0x6b,
+	0x2d, 0x25, 0x08, 0xc1, 0xd4, 0x4e, 0x0b, 0xcb,
+	0xe9, 0x71, 0x9b, 0x5a, 0x9a, 0x1e, 0x21, 0x9a,
+	0x0a, 0xd0, 0x52, 0x82, 0xe9, 0x31, 0x45, 0x9e,
+	0xe4, 0x85, 0x6b, 0xac, 0x8e, 0x7c, 0x73, 0x0c,
+	0x0d, 0xd6, 0x54, 0x27, 0x5a, 0xce, 0xc8, 0x07,
+	0x19, 0x84, 0x8b, 0xee, 0x0f, 0x6f, 0x8b, 0xbc,
+	0x0c, 0x1b, 0xe0, 0x08, 0x64, 0xa6, 0xe6, 0xe1,
+	0xf8, 0x56, 0x5e, 0xe8, 0x27, 0x7d, 0x26, 0xee,
+	0x20, 0x5e, 0x3d, 0x2e, 0x84, 0xdc, 0x50, 0xb0,
+	0x16, 0x3f, 0x8c, 0xec, 0xa9, 0xd3, 0x61, 0x85,
+	0x5a, 0xba, 0x02, 0x82, 0x65, 0x30, 0xdb, 0x23,
+	0x1c, 0xcb, 0xc3, 0xe6, 0x80, 0x5e, 0x4f, 0x6e,
+	0xd8, 0x3b, 0x5e, 0xce, 0x67, 0xbb, 0xdb, 0x22,
+	0xac, 0xf1, 0x32, 0x53, 0x6a, 0xd6, 0x43, 0x1a,
+	0xf0, 0x11, 0xc5, 0x0f, 0xc5, 0x12, 0xdf, 0xe6,
+	0x91, 0x8b, 0x15, 0xf4, 0x41, 0xd9, 0xe3, 0x51,
+};
+
+/* Public key */
+uint8_t mldsa_44_pubkey[] = {
+	0xcc, 0x2c, 0x93, 0xce, 0xfc, 0x0b, 0xf6, 0x74,
+	0x93, 0x28, 0x95, 0xe8, 0xc0, 0xc8, 0x83, 0xb8,
+	0xc9, 0x0c, 0x9a, 0x5c, 0x18, 0xd2, 0x79, 0x5c,
+	0xf3, 0x58, 0xd8, 0x02, 0x6c, 0x5e, 0xad, 0x79,
+	0xde, 0x77, 0x1a, 0xd3, 0x49, 0xc9, 0x12, 0xc9,
+	0xff, 0xcf, 0xa2, 0x6c, 0x1d, 0x37, 0x91, 0xa2,
+	0xf5, 0x43, 0xbc, 0xdb, 0x9e, 0xdb, 0xa5, 0xdb,
+	0xd9, 0x87, 0xc5, 0xf2, 0xf7, 0x79, 0x58, 0x4c,
+	0x08, 0x9f, 0x9c, 0xca, 0x9c, 0xef, 0xa8, 0x80,
+	0x27, 0x31, 0xf1, 0xc5, 0x0e, 0x2b, 0x6d, 0xa1,
+	0x53, 0x9e, 0x99, 0x1e, 0xc8, 0x75, 0x4a, 0x59,
+	0x27, 0x33, 0x41, 0xdd, 0x39, 0xff, 0x37, 0xdf,
+	0x5b, 0xb9, 0xe4, 0x56, 0x54, 0x28, 0x8e, 0xb1,
+	0xfe, 0xd8, 0x4e, 0x60, 0xcd, 0x22, 0xd7, 0x30,
+	0xe5, 0x73, 0xe4, 0xb1, 0x08, 0x0f, 0x0a, 0xbe,
+	0x9a, 0x44, 0xfd, 0xb1, 0xed, 0xb1, 0x8e, 0x0d,
+	0x7c, 0x3c, 0x3d, 0x04, 0x52, 0x4b, 0x93, 0xf4,
+	0xa6, 0xce, 0x8d, 0xb0, 0xe4, 0xf6, 0xb1, 0x09,
+	0xfc, 0xc3, 0x42, 0x3d, 0xff, 0x4c, 0x55, 0x3c,
+	0x73, 0x75, 0x35, 0x9d, 0xe8, 0x68, 0x42, 0x09,
+	0x14, 0x36, 0x91, 0x63, 0xfc, 0xc6, 0x23, 0x7c,
+	0x25, 0x81, 0xd5, 0xc1, 0xfe, 0xca, 0xf6, 0x71,
+	0x51, 0x8e, 0xab, 0x29, 0xa1, 0x86, 0xbb, 0x45,
+	0x43, 0x67, 0x7f, 0xdf, 0x7e, 0x92, 0xff, 0x35,
+	0x38, 0xd3, 0xea, 0x94, 0xc9, 0xa3, 0x0f, 0x46,
+	0x25, 0xa6, 0x1e, 0x00, 0x60, 0x7b, 0xc0, 0xbc,
+	0xe9, 0x5e, 0x16, 0x0e, 0x81, 0xf5, 0x4e, 0x98,
+	0xa1, 0x64, 0xb0, 0xb7, 0x02, 0xec, 0x73, 0xad,
+	0xf8, 0xc1, 0xce, 0x8b, 0x8f, 0xbd, 0x89, 0xbf,
+	0x0f, 0x42, 0x31, 0x6d, 0x75, 0x42, 0xd7, 0x59,
+	0x64, 0xad, 0x09, 0xd3, 0x7a, 0x00, 0x7b, 0xdd,
+	0x12, 0x76, 0xb0, 0x00, 0x73, 0x5b, 0xbf, 0x44,
+	0x54, 0x6e, 0x56, 0x26, 0xa5, 0x27, 0x4d, 0xff,
+	0xe5, 0x8a, 0x04, 0x73, 0xd9, 0x75, 0x8c, 0xf7,
+	0x06, 0x64, 0xfb, 0xa5, 0x00, 0x27, 0x39, 0x0e,
+	0x48, 0x8f, 0x73, 0x29, 0x61, 0x5f, 0x15, 0xf5,
+	0x08, 0x15, 0x33, 0xd1, 0x76, 0xba, 0xf3, 0x3e,
+	0x28, 0xb8, 0x57, 0xcd, 0x9d, 0x61, 0x1f, 0xca,
+	0xd7, 0xc3, 0x10, 0xdb, 0x68, 0xeb, 0xa4, 0x15,
+	0x40, 0xd8, 0xe7, 0xa0, 0xd2, 0xd1, 0xd6, 0xb1,
+	0xd3, 0x75, 0x8e, 0xc1, 0x60, 0x02, 0xb5, 0x69,
+	0xf2, 0x8c, 0xf3, 0xc6, 0x2e, 0x9d, 0xf7, 0x8d,
+	0xed, 0xb0, 0x01, 0xba, 0xb5, 0x62, 0x7e, 0x8f,
+	0x91, 0xbd, 0x73, 0xc6, 0x35, 0xf9, 0xdb, 0xea,
+	0x28, 0xce, 0x8a, 0x47, 0x74, 0x7c, 0x3d, 0x85,
+	0x4d, 0x1e, 0x11, 0x7e, 0xa2, 0xaa, 0x04, 0x30,
+	0x12, 0xce, 0xea, 0xc1, 0xc5, 0x1e, 0x62, 0x7a,
+	0x21, 0x6a, 0xd5, 0xb8, 0x3c, 0xa0, 0xd6, 0xca,
+	0xb4, 0x8d, 0xff, 0xc3, 0xfc, 0xf2, 0xf1, 0x3c,
+	0x87, 0x23, 0xef, 0x68, 0xe4, 0x37, 0x96, 0xb0,
+	0xbb, 0x78, 0xa3, 0x3a, 0xe0, 0xd0, 0x41, 0xeb,
+	0x4c, 0x80, 0x55, 0x9b, 0x66, 0x5e, 0x33, 0xea,
+	0x33, 0x35, 0x79, 0xda, 0x04, 0x81, 0x19, 0x22,
+	0xb4, 0x4c, 0x7a, 0xef, 0x51, 0x50, 0x20, 0x6c,
+	0xf8, 0xf7, 0x5f, 0x03, 0x74, 0x72, 0xda, 0x1f,
+	0xe3, 0x0b, 0x82, 0x71, 0x50, 0x3d, 0x02, 0x61,
+	0x16, 0x44, 0xeb, 0xcf, 0xe3, 0x23, 0x9d, 0xef,
+	0xec, 0xce, 0xb3, 0xd0, 0xd2, 0x19, 0xd1, 0xe0,
+	0x2e, 0x33, 0xde, 0x28, 0x4b, 0xde, 0x85, 0xc1,
+	0xb2, 0x8a, 0xa5, 0x82, 0x0c, 0xa6, 0x9f, 0x23,
+	0x53, 0xea, 0xef, 0x78, 0x60, 0x24, 0x3a, 0x40,
+	0xc0, 0xc1, 0xac, 0xc9, 0x64, 0xd4, 0x03, 0x5f,
+	0x61, 0xa5, 0xdf, 0x6f, 0x6b, 0x4e, 0xb2, 0xe7,
+	0x1a, 0xc6, 0x69, 0x69, 0xd9, 0xc6, 0x6e, 0x5d,
+	0xea, 0xd8, 0xc0, 0x29, 0xcc, 0x8f, 0x35, 0x7b,
+	0xcb, 0x48, 0x3a, 0xfd, 0xba, 0x7a, 0x90, 0xc7,
+	0x65, 0x55, 0xfc, 0x90, 0x98, 0x6c, 0x15, 0x38,
+	0x0e, 0x88, 0x6e, 0x08, 0x49, 0x85, 0xc6, 0x6d,
+	0x8f, 0x30, 0x37, 0xa1, 0x64, 0x79, 0xa1, 0x65,
+	0x2d, 0x07, 0x38, 0x3e, 0x1c, 0xa6, 0x12, 0xee,
+	0xc5, 0x16, 0x68, 0x5c, 0x93, 0x14, 0xda, 0x33,
+	0x3d, 0x74, 0x62, 0xf1, 0xcf, 0x0e, 0x81, 0x80,
+	0xda, 0xea, 0xa7, 0x08, 0xde, 0xf3, 0xdc, 0xfe,
+	0x3a, 0xf5, 0x60, 0xe9, 0x35, 0x95, 0x52, 0x6c,
+	0x7f, 0xef, 0x8b, 0xa7, 0x55, 0x3d, 0x42, 0xfd,
+	0x39, 0x24, 0xd2, 0xfb, 0x28, 0x08, 0x83, 0x2b,
+	0x44, 0xf1, 0x21, 0x73, 0x13, 0x88, 0xa7, 0xba,
+	0x2d, 0xd6, 0xe9, 0x4e, 0xcb, 0xfe, 0x18, 0xe4,
+	0xc7, 0x85, 0xf3, 0xb8, 0xab, 0xd0, 0xb9, 0xbe,
+	0x5e, 0x8a, 0x62, 0x0e, 0x61, 0xa3, 0x29, 0x1d,
+	0xef, 0x46, 0xe7, 0x70, 0x14, 0xb1, 0x9f, 0x07,
+	0xbf, 0x3f, 0x1f, 0xc8, 0x11, 0xe4, 0x2c, 0x39,
+	0x48, 0x0e, 0xcf, 0x92, 0x62, 0x4b, 0x1f, 0x0c,
+	0x2e, 0x29, 0x61, 0xef, 0x29, 0x67, 0x7c, 0x0f,
+	0xac, 0x99, 0xb2, 0x9a, 0x7d, 0xac, 0x7c, 0x54,
+	0xae, 0xed, 0x4b, 0xf5, 0x4a, 0x4b, 0xb4, 0x14,
+	0xad, 0x6d, 0xce, 0xce, 0xcc, 0x3f, 0xb8, 0x59,
+	0x71, 0x7c, 0xd4, 0x76, 0x7c, 0xe4, 0x68, 0xc6,
+	0x76, 0xa8, 0xe3, 0x03, 0x48, 0xb6, 0xe4, 0x11,
+	0x6c, 0x5f, 0xd4, 0x76, 0x80, 0xdf, 0x2c, 0x67,
+	0x00, 0x4c, 0xce, 0x22, 0x21, 0xff, 0xb0, 0x9b,
+	0xcb, 0x72, 0xd1, 0xe3, 0xa2, 0x32, 0x5c, 0x12,
+	0xda, 0x7c, 0x95, 0x5d, 0xb2, 0xae, 0x1b, 0x25,
+	0x2e, 0x5f, 0xe6, 0xff, 0x4c, 0xbf, 0x00, 0x16,
+	0xd0, 0x3c, 0xbf, 0x44, 0x92, 0x07, 0xa0, 0x0d,
+	0x13, 0xba, 0xb8, 0x62, 0x66, 0x0b, 0x14, 0x0f,
+	0x5a, 0x9d, 0x42, 0x19, 0xd7, 0xbe, 0xe3, 0x33,
+	0x53, 0xa2, 0x60, 0x2d, 0xde, 0x43, 0x85, 0x03,
+	0x96, 0x50, 0x83, 0x83, 0x25, 0x3c, 0x19, 0x20,
+	0x44, 0x5f, 0x3b, 0x5a, 0xc2, 0x90, 0xe1, 0x2d,
+	0x47, 0x53, 0x50, 0xeb, 0xf7, 0xc7, 0x46, 0x4c,
+	0xf2, 0xad, 0xb2, 0x8f, 0x03, 0x4e, 0x82, 0x5d,
+	0x0f, 0xa0, 0x3d, 0xde, 0x4d, 0x93, 0x34, 0xd0,
+	0x1a, 0xe2, 0x5d, 0xbc, 0xe5, 0x8d, 0xfb, 0x5a,
+	0xba, 0xe2, 0x24, 0xec, 0xc8, 0xd2, 0xa3, 0x91,
+	0xa2, 0xa9, 0x0e, 0x0e, 0xf5, 0xfb, 0x9f, 0xed,
+	0x69, 0x21, 0x9d, 0x00, 0x92, 0xb5, 0x94, 0x0f,
+	0x38, 0x94, 0x29, 0xf9, 0xe7, 0xaa, 0xf1, 0xf7,
+	0x20, 0x10, 0xf0, 0xeb, 0x26, 0x96, 0x5a, 0x0e,
+	0x99, 0x8d, 0x71, 0xef, 0xb2, 0xa0, 0xf3, 0x38,
+	0xce, 0xf9, 0x99, 0x6f, 0x96, 0xbb, 0xa5, 0x55,
+	0x27, 0x5c, 0xf5, 0xf8, 0x63, 0xf7, 0xf8, 0x0a,
+	0x31, 0xee, 0x01, 0xa8, 0xc9, 0x0c, 0xbd, 0x73,
+	0x62, 0x21, 0xa7, 0x1c, 0xd1, 0x62, 0xe5, 0xdd,
+	0x43, 0x95, 0x4d, 0x60, 0x11, 0x65, 0x6c, 0xfa,
+	0x67, 0x9a, 0x2f, 0x24, 0x1e, 0xbd, 0x10, 0xc4,
+	0xe5, 0x23, 0x6f, 0x02, 0x76, 0x51, 0xd6, 0xe3,
+	0xad, 0x88, 0xda, 0xc4, 0xd9, 0x6a, 0x8f, 0xf7,
+	0xd2, 0x50, 0xdf, 0x9a, 0xad, 0x21, 0xc7, 0x5b,
+	0x47, 0x83, 0xf6, 0xc8, 0xcb, 0x0a, 0xd5, 0x28,
+	0x91, 0x3f, 0x18, 0x44, 0x62, 0x81, 0xfb, 0xcf,
+	0x51, 0x5d, 0xa1, 0xf5, 0x46, 0x74, 0x0d, 0x32,
+	0x21, 0x55, 0x1b, 0x8a, 0xf3, 0xd0, 0x4f, 0x41,
+	0x86, 0xc3, 0x55, 0x0b, 0x1c, 0xd9, 0x56, 0x2f,
+	0xcf, 0xe7, 0x9f, 0x06, 0x73, 0x82, 0xc2, 0x30,
+	0x7a, 0xc2, 0x01, 0xa2, 0x1e, 0xeb, 0x5d, 0x77,
+	0x7f, 0xbe, 0xee, 0xf4, 0x8a, 0x1b, 0x3b, 0xe3,
+	0x2d, 0xd5, 0x3e, 0x3b, 0x40, 0x82, 0xd6, 0x60,
+	0x86, 0x2f, 0xe9, 0xac, 0xc3, 0x65, 0xa5, 0xa3,
+	0x8c, 0x54, 0x51, 0x1f, 0x8e, 0x89, 0x19, 0xdd,
+	0xc5, 0x4a, 0xc0, 0xa2, 0x8b, 0xe5, 0x80, 0xfd,
+	0xa1, 0xd8, 0xe9, 0x15, 0xa0, 0x94, 0xd7, 0x9e,
+	0xe2, 0xf1, 0x83, 0x52, 0xf3, 0x0e, 0x34, 0x2f,
+	0x85, 0x67, 0x49, 0x73, 0x67, 0xb9, 0xb5, 0xd5,
+	0x0c, 0x1d, 0x03, 0x8e, 0x68, 0x57, 0x8d, 0xd2,
+	0x33, 0x44, 0x94, 0x28, 0x5b, 0xfa, 0xe0, 0x2b,
+	0x80, 0xd9, 0x96, 0x85, 0x6e, 0x0a, 0x2a, 0xdd,
+	0x9b, 0x5b, 0x55, 0x5a, 0x31, 0xb6, 0xfe, 0x3e,
+	0x0a, 0x41, 0x28, 0x20, 0xa7, 0xde, 0x31, 0xbe,
+	0x73, 0xcb, 0xbc, 0xbb, 0x50, 0xf8, 0x58, 0x74,
+	0xb1, 0x6b, 0x3f, 0x9a, 0x6c, 0x5e, 0x02, 0x87,
+	0x8d, 0x19, 0xa1, 0xd3, 0x6a, 0xc2, 0x91, 0x82,
+	0x3e, 0x0c, 0x90, 0xb8, 0xa6, 0x95, 0x23, 0x4e,
+	0xb9, 0x2d, 0x4d, 0x6c, 0xfb, 0xd7, 0x5e, 0xdf,
+	0xca, 0x06, 0x9b, 0x94, 0xb7, 0xfc, 0xbc, 0xad,
+	0x39, 0x5d, 0x43, 0xcb, 0x1c, 0x7d, 0x3c, 0x95,
+	0x3f, 0xf4, 0x47, 0x04, 0x1f, 0xfc, 0x8b, 0x23,
+	0xe7, 0xcf, 0x24, 0x6f, 0x40, 0x9b, 0xa5, 0x56,
+	0xcd, 0x69, 0x9e, 0x1f, 0x5a, 0xa0, 0x3b, 0x8f,
+	0x3e, 0x1c, 0xe7, 0x42, 0xc9, 0x66, 0xee, 0x99,
+	0x13, 0xb1, 0x4f, 0x65, 0x86, 0xba, 0xf0, 0x87,
+	0x81, 0x6f, 0x44, 0x08, 0xb4, 0x18, 0xac, 0xb6,
+	0xd3, 0x96, 0x68, 0xd4, 0x88, 0x89, 0xf2, 0xa2,
+	0xd6, 0x2f, 0xfe, 0x7e, 0x49, 0xb3, 0x9c, 0xc9,
+	0xaf, 0xd9, 0x28, 0xa8, 0x96, 0xc9, 0x2d, 0x26,
+	0x5b, 0xc7, 0xef, 0x66, 0x08, 0xd2, 0x38, 0x4f,
+	0x10, 0xb3, 0x83, 0x15, 0xf6, 0x00, 0x83, 0x3f,
+	0x20, 0xfe, 0xa8, 0x44, 0x6b, 0x62, 0x3b, 0x17,
+	0x39, 0x2e, 0xec, 0x5e, 0x78, 0xbe, 0xec, 0x16,
+	0x29, 0xa6, 0x79, 0x4c, 0x08, 0x75, 0xc8, 0x78,
+	0x3e, 0xc0, 0x05, 0xe9, 0xbb, 0x47, 0x94, 0xae,
+	0xaf, 0xa5, 0xbb, 0xb8, 0x47, 0x31, 0xf7, 0xe9,
+	0xb8, 0x1e, 0x6c, 0xda, 0x26, 0xc5, 0xf3, 0x26,
+	0x89, 0xd5, 0x04, 0x23, 0x0b, 0x11, 0x84, 0x8f,
+};
+
+/* Signature */
+uint8_t mldsa_44_sign[] = {
+	0x3E, 0xDD, 0xD2, 0x34, 0x62, 0x78, 0xEC, 0x19,
+	0x9F, 0xAA, 0xEC, 0x89, 0x99, 0x78, 0x31, 0xCB,
+	0x82, 0x0B, 0xE6, 0x46, 0x8D, 0x24, 0x9A, 0xD3,
+	0x69, 0xB7, 0x01, 0x85, 0x93, 0x75, 0xD0, 0xBE,
+	0xEA, 0x1F, 0x76, 0xFB, 0xB4, 0x6D, 0xC9, 0x64,
+	0xD4, 0x44, 0x68, 0x5D, 0xAD, 0x09, 0x69, 0xFC,
+	0x31, 0x2F, 0xD1, 0xFA, 0xEF, 0xF2, 0x1D, 0x2E,
+	0xB6, 0xA5, 0xA9, 0xFD, 0x31, 0x04, 0x68, 0x1E,
+	0x0B, 0xEC, 0xF4, 0x23, 0x4C, 0x9F, 0xC9, 0xD6,
+	0x27, 0x8D, 0xE1, 0xAA, 0x29, 0x38, 0x16, 0x65,
+	0x7E, 0x38, 0x5A, 0x30, 0xFC, 0xD9, 0xBF, 0x63,
+	0x3B, 0x82, 0xFE, 0x0D, 0x68, 0xD4, 0x52, 0x55,
+	0xBE, 0x86, 0x69, 0xCF, 0x75, 0x26, 0x2C, 0xB9,
+	0x1D, 0x66, 0x39, 0x4C, 0x89, 0xAC, 0x36, 0xBF,
+	0x34, 0x27, 0xCC, 0x7E, 0x6C, 0xC5, 0xBB, 0xFB,
+	0x78, 0x03, 0x39, 0x61, 0xD8, 0x76, 0x63, 0x6E,
+	0x6B, 0x68, 0x02, 0x43, 0x44, 0x57, 0x2E, 0x39,
+	0x9E, 0x9D, 0x64, 0x77, 0x8E, 0x8B, 0x79, 0x36,
+	0xCE, 0xE6, 0xBC, 0x6D, 0x80, 0xC8, 0x04, 0x81,
+	0x2A, 0x04, 0xD4, 0xEF, 0x63, 0xE1, 0x3F, 0xC4,
+	0xC1, 0x54, 0xD5, 0xAB, 0xE4, 0xEC, 0x65, 0xB0,
+	0xF0, 0x1A, 0xB2, 0x32, 0x9A, 0xB8, 0x51, 0xD4,
+	0x43, 0xFE, 0x81, 0x4F, 0xBD, 0x5D, 0xEE, 0xDE,
+	0x24, 0xAC, 0xBC, 0x22, 0x9B, 0x80, 0xB7, 0xE8,
+	0x22, 0x4B, 0x1B, 0x23, 0x89, 0x8C, 0xFE, 0xE3,
+	0x30, 0x35, 0xA2, 0x0B, 0x4E, 0x66, 0x64, 0xFE,
+	0x57, 0x68, 0xCF, 0xF5, 0xE5, 0x11, 0xB9, 0xB6,
+	0x3A, 0x2B, 0x15, 0x0D, 0xA4, 0x11, 0xE1, 0x01,
+	0x96, 0x06, 0x5D, 0x47, 0xCC, 0x04, 0x63, 0xB3,
+	0xC7, 0xDD, 0x0F, 0x4A, 0x0A, 0x90, 0x9C, 0x0C,
+	0x61, 0x1D, 0x4C, 0x21, 0x32, 0xD6, 0xE9, 0xDD,
+	0x0F, 0x91, 0xA4, 0xD1, 0x30, 0x14, 0x1C, 0x48,
+	0xEC, 0xF4, 0x4F, 0x02, 0x7B, 0x1E, 0x25, 0x3A,
+	0x7C, 0x6B, 0x42, 0x13, 0xF7, 0xBC, 0xB5, 0x02,
+	0xA9, 0x20, 0x85, 0x21, 0x01, 0x67, 0xC3, 0xDD,
+	0x6C, 0x6D, 0xD3, 0xC9, 0x6F, 0x13, 0x75, 0xDD,
+	0x1D, 0xD7, 0xE7, 0xF3, 0x34, 0x17, 0x37, 0xFF,
+	0xE6, 0x3B, 0xB5, 0x1F, 0xEE, 0x51, 0x73, 0x6D,
+	0x9E, 0xB7, 0xE2, 0xE7, 0xA1, 0x65, 0xE4, 0x29,
+	0x8E, 0xBF, 0x66, 0xCE, 0x5E, 0xD4, 0xBA, 0x0C,
+	0x18, 0x84, 0xBE, 0xAE, 0x9A, 0x17, 0x0D, 0xAE,
+	0x55, 0x90, 0x7F, 0x72, 0x73, 0xAB, 0x9F, 0x87,
+	0xCC, 0x3D, 0xCB, 0xE4, 0x38, 0x66, 0x92, 0xEE,
+	0x6D, 0xE9, 0x0B, 0x8A, 0xE2, 0x5F, 0x68, 0x9D,
+	0x06, 0xFD, 0xF3, 0x77, 0x4B, 0x50, 0xCD, 0x0E,
+	0x2B, 0xE1, 0xD3, 0xB4, 0xF4, 0x02, 0xF5, 0x9B,
+	0x5F, 0x3E, 0x59, 0xD7, 0x57, 0x9D, 0x87, 0x80,
+	0x60, 0xEB, 0x70, 0xF5, 0x34, 0x56, 0x46, 0x5B,
+	0xBA, 0x8F, 0x90, 0xAE, 0x9F, 0x6B, 0x43, 0x8C,
+	0x51, 0x45, 0xD2, 0x16, 0x4C, 0xBA, 0x86, 0xF0,
+	0xF4, 0xD5, 0x34, 0x6A, 0x3E, 0x5F, 0xAE, 0xBE,
+	0x95, 0x40, 0xFE, 0x26, 0x4D, 0x5E, 0x60, 0x4E,
+	0xD9, 0xEB, 0x47, 0x7D, 0x43, 0x63, 0x5F, 0x4B,
+	0xB1, 0xCE, 0x7E, 0xA2, 0xF0, 0xC9, 0x30, 0x0C,
+	0xB7, 0x13, 0x43, 0xC0, 0xF8, 0x02, 0x6C, 0xD2,
+	0x5F, 0xCE, 0x25, 0xF3, 0xAE, 0xC3, 0x2D, 0xC3,
+	0x13, 0xAE, 0x49, 0x8B, 0x82, 0x82, 0x44, 0xD0,
+	0x50, 0xF8, 0x00, 0x5E, 0xAC, 0xDE, 0x4B, 0x88,
+	0xC2, 0x38, 0x5C, 0xC3, 0x65, 0xF4, 0x25, 0x63,
+	0x29, 0xC3, 0xB0, 0x7A, 0x45, 0x5D, 0x43, 0x89,
+	0xCA, 0x5A, 0x12, 0x61, 0xD8, 0x92, 0x65, 0x1B,
+	0x0F, 0xBF, 0x62, 0xB9, 0xA6, 0xF2, 0xA8, 0xA7,
+	0x06, 0xAC, 0x02, 0xA4, 0xC6, 0x25, 0xD6, 0xC5,
+	0xD2, 0xDE, 0x87, 0x88, 0x11, 0xBD, 0x7C, 0x87,
+	0x91, 0xA9, 0x91, 0x60, 0x1F, 0x0F, 0xF0, 0x24,
+	0xFE, 0xA0, 0xEB, 0xDC, 0x89, 0x68, 0x84, 0x10,
+	0xD7, 0x55, 0xC1, 0x3A, 0xCA, 0x1F, 0xFF, 0x77,
+	0x41, 0xA1, 0xDB, 0x13, 0x31, 0xEF, 0x9C, 0xA3,
+	0xA2, 0x3A, 0x37, 0x1B, 0xF9, 0x46, 0xF8, 0x51,
+	0x15, 0xB3, 0x0A, 0x12, 0x64, 0x3F, 0xE5, 0xA8,
+	0x07, 0xA2, 0x57, 0x87, 0x2A, 0x3F, 0xD2, 0x87,
+	0xDB, 0xC0, 0x33, 0xAC, 0xF5, 0x28, 0x42, 0xC5,
+	0xD4, 0x20, 0x27, 0xAE, 0x57, 0xAF, 0x6C, 0x74,
+	0x8A, 0xA0, 0x90, 0xEE, 0x34, 0xE9, 0x19, 0xB9,
+	0x0E, 0xDF, 0x4D, 0xDE, 0x77, 0x66, 0xC4, 0xBC,
+	0x99, 0x59, 0x14, 0xCB, 0x9D, 0xBF, 0xBC, 0x5F,
+	0xFF, 0x2B, 0xA7, 0xED, 0x29, 0x49, 0x13, 0x6C,
+	0x2B, 0x71, 0x58, 0xC2, 0xC4, 0x67, 0xCB, 0x6A,
+	0x18, 0x6F, 0x4E, 0x88, 0xB9, 0x76, 0xC8, 0x6B,
+	0xDC, 0x6A, 0x05, 0xA5, 0x22, 0x31, 0x15, 0xCE,
+	0x54, 0xDA, 0xE8, 0x0E, 0xED, 0xDF, 0x46, 0x90,
+	0x93, 0x9A, 0xE6, 0x2B, 0x45, 0xA4, 0x51, 0x42,
+	0x29, 0x05, 0xA9, 0xFF, 0x29, 0xBE, 0x4F, 0x6E,
+	0xE7, 0x52, 0x2C, 0x16, 0x3F, 0x95, 0x94, 0x7B,
+	0xE6, 0xE1, 0xF7, 0x9F, 0x36, 0x1F, 0xEE, 0x46,
+	0xA9, 0xE3, 0x71, 0x37, 0x08, 0xF7, 0x63, 0xAF,
+	0x16, 0xB9, 0x43, 0x86, 0xAC, 0xC7, 0x5D, 0x5B,
+	0x73, 0x38, 0x08, 0x2C, 0xC6, 0x65, 0x02, 0xC8,
+	0x70, 0x71, 0x01, 0xA7, 0xD3, 0xA6, 0xB9, 0x74,
+	0xAA, 0x71, 0x3B, 0x1B, 0xEF, 0x84, 0xA9, 0x77,
+	0x91, 0x82, 0x7F, 0xB7, 0x3D, 0x2E, 0x8B, 0xD5,
+	0x4D, 0xAD, 0x29, 0xAC, 0x51, 0x9E, 0xDB, 0xF0,
+	0x4A, 0x1D, 0x29, 0x82, 0x04, 0x9E, 0x03, 0x8C,
+	0x74, 0x66, 0x12, 0x75, 0xD0, 0x77, 0x07, 0xCC,
+	0x7E, 0x8D, 0x19, 0x2F, 0x42, 0xFA, 0xB7, 0xBD,
+	0x7E, 0x77, 0xEF, 0xF1, 0x35, 0xAF, 0x7C, 0xFF,
+	0x52, 0x5F, 0xDB, 0x03, 0x99, 0x0D, 0x89, 0x8A,
+	0x60, 0x61, 0x42, 0xC2, 0xE7, 0x33, 0x58, 0xE7,
+	0x40, 0x90, 0x46, 0x84, 0xD5, 0x4B, 0x30, 0x88,
+	0xA7, 0xBB, 0x25, 0xDE, 0x02, 0xFE, 0x57, 0x93,
+	0xFD, 0xD0, 0x6E, 0xA2, 0xFE, 0x38, 0xA3, 0x5E,
+	0x6C, 0x35, 0x06, 0xC4, 0xC6, 0x8C, 0x9C, 0x37,
+	0x3B, 0x6A, 0x1D, 0x91, 0xCB, 0x84, 0x03, 0x47,
+	0x85, 0xC7, 0x1D, 0x82, 0xEE, 0xB5, 0xF8, 0xEC,
+	0x29, 0xDE, 0x30, 0x76, 0x32, 0x08, 0x6A, 0x75,
+	0x43, 0x6A, 0xB8, 0x4C, 0x5D, 0x5A, 0x54, 0xC2,
+	0xE3, 0x58, 0x43, 0x6E, 0x90, 0xCE, 0x51, 0xEB,
+	0xE2, 0xFD, 0x68, 0xAE, 0xB3, 0xBA, 0x80, 0xB4,
+	0x03, 0x84, 0x26, 0x4E, 0xAB, 0x7B, 0x15, 0x2D,
+	0xDE, 0xB0, 0x7B, 0xF3, 0x4D, 0xFB, 0x6A, 0xFC,
+	0xE3, 0x47, 0xFC, 0x9C, 0x34, 0xC8, 0xB2, 0x10,
+	0x46, 0xCC, 0x5F, 0x0A, 0xC6, 0xEB, 0x48, 0x47,
+	0xFF, 0x73, 0x75, 0xD0, 0x7C, 0xBF, 0x44, 0xCB,
+	0xAE, 0x8A, 0x30, 0x0B, 0x3F, 0x58, 0x11, 0x51,
+	0x32, 0xD5, 0x7C, 0xCC, 0xB5, 0xDB, 0xD9, 0x21,
+	0xD0, 0x6C, 0x29, 0xE2, 0xD0, 0xE1, 0xB2, 0xC8,
+	0x06, 0x29, 0xC0, 0xC8, 0x5B, 0xB2, 0x3A, 0x66,
+	0x7A, 0x25, 0x13, 0x57, 0x80, 0x14, 0x5B, 0x31,
+	0xC4, 0x7B, 0x21, 0xB5, 0x50, 0x9C, 0x76, 0x6B,
+	0x8C, 0x16, 0xF7, 0x95, 0xA1, 0x79, 0x6B, 0xA8,
+	0x22, 0x13, 0xD5, 0x32, 0x15, 0x3E, 0xFC, 0x55,
+	0x80, 0xD2, 0x71, 0xD1, 0x59, 0x15, 0xDA, 0xFC,
+	0x55, 0x75, 0xE7, 0x7E, 0x15, 0x48, 0xD9, 0x73,
+	0x0D, 0x6A, 0x31, 0x8A, 0x1C, 0x86, 0x4A, 0x31,
+	0x57, 0x5B, 0x0A, 0x9D, 0xE4, 0x8C, 0x80, 0x7F,
+	0x0E, 0x07, 0x36, 0x38, 0x7C, 0xEA, 0x3C, 0xBD,
+	0xBD, 0xD1, 0xAA, 0xE7, 0xE4, 0x43, 0xB2, 0xFC,
+	0x26, 0x39, 0x4F, 0xCC, 0xE6, 0xB8, 0xD7, 0x90,
+	0xC3, 0x5F, 0xAA, 0xEA, 0x78, 0xC6, 0xD7, 0x58,
+	0x15, 0x7D, 0x27, 0xD0, 0x7E, 0x0F, 0x13, 0x0D,
+	0x47, 0x49, 0x28, 0x5B, 0xD7, 0xBC, 0x41, 0xB5,
+	0x66, 0x38, 0x29, 0xB4, 0x71, 0xEC, 0xA2, 0xDE,
+	0xE3, 0xE0, 0x4C, 0x27, 0xB4, 0x2C, 0xEE, 0xF1,
+	0x5F, 0x37, 0x81, 0xCE, 0x31, 0x42, 0x87, 0x44,
+	0x39, 0x7B, 0x35, 0xCF, 0xE8, 0x7D, 0x5E, 0xD7,
+	0xA3, 0x3D, 0xB9, 0x92, 0x95, 0x8C, 0x25, 0xC6,
+	0xC9, 0xBC, 0x46, 0x4E, 0x03, 0x70, 0x29, 0x4B,
+	0x79, 0xB8, 0xEF, 0x54, 0x98, 0x8B, 0x9A, 0x45,
+	0x09, 0x8C, 0x43, 0xD1, 0x9B, 0x29, 0xEA, 0xDE,
+	0xF2, 0x25, 0x10, 0xA6, 0xF9, 0x2C, 0xC8, 0x90,
+	0x49, 0xA5, 0x3C, 0xDC, 0xCE, 0xA3, 0x98, 0xF1,
+	0x4C, 0xC6, 0x3E, 0xE0, 0x21, 0x58, 0x1A, 0x39,
+	0xDA, 0x50, 0x2A, 0x6A, 0x18, 0x49, 0xC9, 0xA1,
+	0x9D, 0xF3, 0xF4, 0xFB, 0xDD, 0x6F, 0x8D, 0xF4,
+	0xFE, 0x61, 0xA0, 0xC6, 0xF5, 0x58, 0x89, 0xAE,
+	0xEC, 0xC6, 0xE0, 0x88, 0x4A, 0x07, 0x6F, 0x11,
+	0x72, 0x5A, 0x6D, 0x3E, 0x08, 0x64, 0x3E, 0x23,
+	0x7D, 0x9A, 0x74, 0xB3, 0xC3, 0xDA, 0xA7, 0x29,
+	0x0E, 0xC1, 0x37, 0xB0, 0x04, 0x42, 0x47, 0x01,
+	0x80, 0x4B, 0xC0, 0x35, 0x49, 0x19, 0xB1, 0xDB,
+	0x51, 0x51, 0x09, 0x90, 0x08, 0xB2, 0xC4, 0x5C,
+	0xA0, 0xD6, 0x6E, 0x09, 0xFF, 0xA0, 0xC6, 0x4F,
+	0x32, 0x95, 0x84, 0xBE, 0xAA, 0x4A, 0x0A, 0x36,
+	0x83, 0xD3, 0x0C, 0xB7, 0xE0, 0xD0, 0x24, 0xE9,
+	0x0A, 0x2F, 0x0F, 0xB4, 0x3A, 0x2F, 0xCE, 0x34,
+	0xE5, 0xF0, 0x67, 0x07, 0x72, 0x52, 0x24, 0xE9,
+	0x9F, 0xBF, 0xDE, 0x40, 0x95, 0xAD, 0x74, 0x41,
+	0x4A, 0x00, 0x07, 0xEB, 0x14, 0xDD, 0xC4, 0xA2,
+	0x37, 0x72, 0x83, 0xE7, 0xD6, 0x20, 0xF5, 0xC6,
+	0x86, 0x97, 0xC5, 0x64, 0x58, 0x1B, 0x57, 0x5F,
+	0x9D, 0x06, 0x1D, 0xB5, 0x2D, 0x26, 0xBA, 0xE4,
+	0x49, 0x71, 0x08, 0xBD, 0x21, 0xC4, 0xA9, 0xF3,
+	0x26, 0x7A, 0x28, 0xD6, 0x81, 0x20, 0xCD, 0x9C,
+	0xED, 0xB8, 0xDC, 0x45, 0x33, 0xC0, 0x54, 0x5C,
+	0x3A, 0xF5, 0xC5, 0x1B, 0x19, 0x10, 0xCA, 0xDF,
+	0x99, 0xD4, 0xEE, 0x25, 0xD6, 0x71, 0x24, 0x4D,
+	0xFF, 0x14, 0x85, 0x58, 0x07, 0xC8, 0x3F, 0xD6,
+	0x55, 0x1C, 0xBF, 0xF8, 0x94, 0x31, 0x04, 0x83,
+	0xEC, 0xD1, 0xF5, 0x20, 0x72, 0xC3, 0xE9, 0xB1,
+	0x8A, 0x00, 0x0B, 0x94, 0x53, 0x4C, 0x01, 0x8C,
+	0xDE, 0x80, 0x59, 0x66, 0x72, 0x2D, 0xC5, 0x78,
+	0xAC, 0x4A, 0xAD, 0x4F, 0x14, 0xC1, 0x78, 0x87,
+	0x5F, 0xDF, 0xF2, 0x95, 0xCF, 0x8F, 0x3F, 0xA6,
+	0xCC, 0xAA, 0x1E, 0xD8, 0xA8, 0x37, 0xAD, 0x5B,
+	0xA5, 0x6D, 0xBC, 0x81, 0xAC, 0xCD, 0xFD, 0x56,
+	0x9E, 0x8B, 0xB9, 0xEC, 0x7E, 0x82, 0x4E, 0x55,
+	0x05, 0xFD, 0x9F, 0xDC, 0x0A, 0xF7, 0xBD, 0x3F,
+	0xEA, 0x42, 0x9D, 0x7E, 0xAB, 0x09, 0xDF, 0x3D,
+	0xA3, 0x8C, 0x63, 0x78, 0x81, 0x8F, 0x46, 0x9F,
+	0x12, 0xB8, 0x8A, 0xA5, 0xE4, 0xE9, 0x73, 0x95,
+	0x37, 0xD3, 0x39, 0xFE, 0x9B, 0x69, 0x58, 0x05,
+	0x5B, 0x30, 0x09, 0x31, 0x8B, 0xD9, 0xDB, 0xAE,
+	0x96, 0x93, 0x96, 0xDF, 0xC0, 0x70, 0x1D, 0xFF,
+	0x5D, 0x60, 0x72, 0x5A, 0xDD, 0xC2, 0x3D, 0xCF,
+	0x13, 0xA0, 0x36, 0x38, 0xF4, 0x3A, 0x03, 0x15,
+	0x48, 0xF0, 0xB1, 0x4A, 0x12, 0x72, 0xBA, 0x6B,
+	0xE2, 0xD6, 0x4E, 0x57, 0x22, 0x87, 0x2F, 0xE7,
+	0x40, 0x1B, 0x22, 0xF3, 0x4A, 0xE7, 0xB1, 0xA4,
+	0x28, 0xC7, 0xBB, 0x17, 0x5E, 0x0C, 0x03, 0xE3,
+	0xF4, 0x67, 0x25, 0xB2, 0xBB, 0xE6, 0x4E, 0xCD,
+	0x8A, 0x39, 0xC6, 0x05, 0xB7, 0x14, 0x10, 0xF4,
+	0x36, 0xE9, 0x8A, 0xC3, 0x41, 0xD3, 0x30, 0xAD,
+	0x79, 0x56, 0xE2, 0xC3, 0x55, 0xFC, 0x05, 0x3B,
+	0xD0, 0x83, 0x31, 0xE7, 0xA1, 0x85, 0xBE, 0x6C,
+	0xAF, 0x9D, 0xA6, 0x26, 0xC4, 0x7A, 0x4B, 0xD8,
+	0x26, 0xA7, 0x59, 0xBB, 0x8D, 0x6E, 0x15, 0x96,
+	0x84, 0x08, 0x0B, 0xDF, 0x29, 0x2D, 0x74, 0xD9,
+	0xAD, 0xFE, 0xC1, 0x3A, 0x84, 0x4E, 0xCE, 0x8F,
+	0x00, 0x9A, 0x50, 0xB8, 0x6F, 0x02, 0xE6, 0xEC,
+	0xA9, 0xE6, 0x1F, 0x71, 0x6A, 0x48, 0x98, 0x61,
+	0x3B, 0xC1, 0x37, 0x5A, 0x2E, 0xF3, 0xE0, 0xD6,
+	0x11, 0x0C, 0x15, 0x39, 0x7B, 0xFB, 0x37, 0xAF,
+	0x7A, 0xCA, 0xD6, 0x10, 0xDE, 0x95, 0x6A, 0xC6,
+	0x19, 0xEC, 0x21, 0x51, 0xCE, 0xAE, 0x8F, 0x5A,
+	0xEE, 0xEF, 0xB2, 0x9C, 0xF7, 0x4F, 0x5A, 0xB4,
+	0x90, 0xED, 0xB0, 0x64, 0x59, 0x95, 0xC5, 0x32,
+	0xC1, 0x85, 0xD7, 0x7E, 0x6C, 0xC6, 0x76, 0x11,
+	0x4B, 0xB5, 0x17, 0x1D, 0xEE, 0x15, 0xFF, 0xD3,
+	0xC7, 0xBB, 0xAA, 0x3C, 0x5D, 0x4D, 0x03, 0x82,
+	0xC0, 0xC7, 0xEA, 0xD0, 0xD8, 0x1B, 0xFF, 0x3C,
+	0x1D, 0x5A, 0x3F, 0xBD, 0x81, 0x66, 0x62, 0x6E,
+	0xB3, 0xF5, 0x5F, 0xF0, 0x43, 0x90, 0x01, 0x71,
+	0xDD, 0xB6, 0x0F, 0x60, 0xCE, 0xFB, 0x17, 0x21,
+	0x5A, 0x7F, 0x0C, 0x69, 0x82, 0x9D, 0x4C, 0xF3,
+	0x30, 0x1A, 0xF7, 0x1E, 0x85, 0x1A, 0x89, 0x84,
+	0xF3, 0x4E, 0x8F, 0x15, 0x60, 0x43, 0x6D, 0x3A,
+	0x5B, 0x07, 0xC0, 0x78, 0x6A, 0x02, 0xB4, 0x98,
+	0x3D, 0xAB, 0xAC, 0x25, 0x55, 0xC8, 0x49, 0x7E,
+	0xC9, 0x04, 0x73, 0xAF, 0x0D, 0x17, 0x1A, 0xA6,
+	0xBE, 0xD8, 0x11, 0x69, 0x4F, 0x17, 0x39, 0xF3,
+	0x57, 0x53, 0x1F, 0xD5, 0x1B, 0x15, 0x89, 0x53,
+	0x54, 0xB1, 0x9F, 0xFD, 0x52, 0x92, 0xA8, 0x98,
+	0xD4, 0x7B, 0xEE, 0x43, 0xC6, 0x31, 0xDE, 0xEC,
+	0xDC, 0xE5, 0x1D, 0x90, 0x37, 0x63, 0xA1, 0xF8,
+	0x42, 0x52, 0x8A, 0x73, 0x8B, 0x3D, 0x42, 0x85,
+	0x64, 0x5C, 0xA9, 0xCC, 0xA1, 0xCD, 0xEB, 0x9E,
+	0x2A, 0xF5, 0x21, 0x9E, 0x81, 0xC6, 0x2D, 0xD7,
+	0x22, 0xC2, 0xEE, 0x47, 0x7E, 0xDA, 0x60, 0x26,
+	0xFA, 0xE9, 0xB1, 0x81, 0x01, 0x77, 0xD3, 0x42,
+	0xDD, 0x03, 0x65, 0x74, 0x2B, 0x85, 0x49, 0x9A,
+	0xA5, 0x27, 0x76, 0x49, 0xF1, 0x72, 0x5E, 0xDF,
+	0xB7, 0xAD, 0x19, 0x1A, 0x58, 0x89, 0x56, 0x5C,
+	0x61, 0x03, 0xC7, 0x42, 0x84, 0xF2, 0x9E, 0x9E,
+	0x09, 0x2A, 0x2D, 0x3B, 0xAE, 0x6A, 0x8E, 0x9A,
+	0x87, 0x70, 0x16, 0x0A, 0xF1, 0xA9, 0xEA, 0xD2,
+	0xF3, 0x2A, 0xA3, 0xB0, 0x32, 0xD3, 0x28, 0x92,
+	0x19, 0x02, 0x77, 0xB2, 0x26, 0x1B, 0xC0, 0x59,
+	0x1A, 0x67, 0x4B, 0x51, 0x04, 0x83, 0x25, 0xF6,
+	0x4E, 0xA3, 0x92, 0x55, 0xCD, 0x74, 0xF5, 0x23,
+	0x98, 0xB7, 0xB9, 0x75, 0xA6, 0xDC, 0x4E, 0xD2,
+	0x93, 0x39, 0x94, 0xA3, 0xCD, 0xF8, 0xD5, 0xA4,
+	0xA9, 0x3C, 0x97, 0xED, 0x18, 0x54, 0xBB, 0x59,
+	0x7E, 0x75, 0xE3, 0xEE, 0x5A, 0x36, 0x53, 0x3D,
+	0x02, 0xFB, 0x47, 0xE6, 0x10, 0x1D, 0xDF, 0x21,
+	0xDA, 0x44, 0x66, 0x05, 0x81, 0xC4, 0xE9, 0x3B,
+	0xD5, 0x56, 0xC5, 0xAD, 0x50, 0x7A, 0xE1, 0xAA,
+	0x91, 0x7F, 0x7C, 0x4E, 0x85, 0xCC, 0xDC, 0x4A,
+	0xBD, 0x72, 0x1F, 0x3F, 0x21, 0x93, 0x98, 0x21,
+	0xB8, 0xCC, 0x21, 0x00, 0x24, 0x13, 0xAB, 0x63,
+	0xC1, 0x31, 0xCA, 0x1C, 0x67, 0x0C, 0x0E, 0x5A,
+	0x62, 0xC3, 0x1E, 0x6D, 0x63, 0x9B, 0xDA, 0x7F,
+	0x92, 0xC4, 0x64, 0x8B, 0xC7, 0x80, 0x04, 0x05,
+	0x36, 0x06, 0xCE, 0xF7, 0x37, 0x3A, 0xA8, 0xDF,
+	0x2C, 0x61, 0x46, 0x48, 0x2A, 0x5C, 0xDC, 0xBB,
+	0x34, 0x16, 0xDA, 0x59, 0x0D, 0x5B, 0xE5, 0x08,
+	0x05, 0xAF, 0x59, 0x86, 0x34, 0x56, 0x88, 0x4F,
+	0xAF, 0xA0, 0x28, 0xC4, 0xF2, 0x97, 0xC6, 0xF4,
+	0x7C, 0xFD, 0xA4, 0x20, 0xE4, 0x20, 0x2C, 0xDA,
+	0x98, 0xAD, 0x4A, 0x96, 0x9F, 0x62, 0xBB, 0x1C,
+	0xB6, 0x28, 0xB0, 0xD0, 0xEA, 0x3B, 0xB8, 0x3C,
+	0x8D, 0x4E, 0x97, 0xEA, 0x9E, 0x63, 0xAA, 0xAA,
+	0x8D, 0x22, 0x61, 0x29, 0x1A, 0x82, 0x29, 0x86,
+	0x87, 0x62, 0xA4, 0xE4, 0xC0, 0x03, 0x93, 0x55,
+	0x7D, 0x40, 0xE9, 0x43, 0x14, 0x9C, 0xE2, 0xDA,
+	0x0A, 0x00, 0x37, 0xEA, 0x80, 0xB8, 0x31, 0x66,
+	0xAE, 0xD7, 0xF8, 0xB4, 0x24, 0xC7, 0x78, 0xDB,
+	0x23, 0x66, 0x61, 0xA5, 0x47, 0x10, 0x4A, 0xE8,
+	0x79, 0xB6, 0xBD, 0x6A, 0xB6, 0x22, 0x6C, 0x7B,
+	0x19, 0xF3, 0x80, 0x35, 0x9A, 0x15, 0x36, 0x89,
+	0x2A, 0x2C, 0xED, 0x26, 0xF1, 0x96, 0xFF, 0x30,
+	0x4D, 0x03, 0x82, 0x2C, 0x69, 0x31, 0x40, 0x40,
+	0x0C, 0xD1, 0x40, 0x3E, 0xE0, 0xB5, 0x37, 0xA8,
+	0x6D, 0x68, 0x68, 0x8F, 0x9E, 0xC5, 0x12, 0x05,
+	0xF5, 0x36, 0x85, 0x5F, 0x8A, 0x52, 0x7B, 0x60,
+	0xA2, 0xC2, 0x39, 0xAF, 0x87, 0xC8, 0xC4, 0xF2,
+	0x53, 0x1D, 0xF0, 0x84, 0x32, 0x8A, 0x04, 0x42,
+	0xBF, 0xCA, 0x1A, 0x08, 0x89, 0x71, 0xCA, 0xC8,
+	0x11, 0xA6, 0xDC, 0xED, 0x31, 0xFC, 0x41, 0xFC,
+	0x84, 0x75, 0xA5, 0x98, 0x67, 0x9E, 0xE7, 0x69,
+	0x9F, 0x3C, 0x42, 0x94, 0x69, 0xA5, 0x1D, 0xC2,
+	0x55, 0x9D, 0x2E, 0xC9, 0x13, 0x3C, 0x68, 0x94,
+	0xA9, 0x7E, 0x6A, 0xFC, 0x11, 0xE3, 0x97, 0x0D,
+	0x59, 0x8F, 0x8D, 0x05, 0x01, 0x4A, 0x74, 0xB6,
+	0x96, 0x6D, 0x1E, 0x7F, 0x63, 0xA5, 0x54, 0x39,
+	0x5A, 0x6C, 0xB9, 0x9B, 0xC3, 0x79, 0xCB, 0xD3,
+	0xC9, 0xE9, 0x37, 0x9E, 0xDC, 0x3B, 0xE2, 0xD2,
+	0xE6, 0x07, 0x77, 0xFA, 0xD5, 0xCF, 0xD6, 0x42,
+	0x45, 0x46, 0xFE, 0x06, 0x28, 0x0E, 0x4D, 0xA6,
+	0x72, 0xE6, 0x6F, 0x39, 0xCD, 0xB9, 0xBF, 0x43,
+	0xF7, 0xD9, 0x99, 0x9B, 0x46, 0xF1, 0x80, 0xBA,
+	0x07, 0x4A, 0x0A, 0xC3, 0x9F, 0xD3, 0xCB, 0xA5,
+	0x85, 0xF7, 0xEE, 0x9F, 0x6D, 0xC0, 0x52, 0xD7,
+	0x17, 0x27, 0x81, 0x92, 0x98, 0xA0, 0xBB, 0xC9,
+	0xD7, 0xE4, 0xF0, 0xF8, 0x25, 0x2C, 0x38, 0x3B,
+	0x44, 0x4E, 0x55, 0x57, 0x5F, 0x86, 0x9A, 0xA1,
+	0xB2, 0xBB, 0xBF, 0xE4, 0xF4, 0x04, 0x0D, 0x16,
+	0x34, 0x48, 0x5A, 0x68, 0x72, 0x88, 0x8B, 0x97,
+	0xA5, 0xAC, 0xBC, 0xC4, 0xC9, 0xCC, 0xF3, 0x03,
+	0x12, 0x14, 0x2C, 0x3B, 0x3E, 0x3F, 0x4D, 0x52,
+	0x79, 0x7A, 0x91, 0x96, 0xA8, 0xB3, 0xBB, 0xCC,
+	0xCF, 0xD7, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0C, 0x1D, 0x2F, 0x43,
+};
+
+/* Deterministic Signature */
+uint8_t mldsa_44_sign_dtrm[] = {
+	0xC7, 0x9B, 0x98, 0x33, 0xEA, 0xCC, 0xCC, 0x47,
+	0x51, 0x8F, 0xE1, 0xC0, 0xDA, 0x82, 0x9B, 0xAA,
+	0x74, 0x0A, 0x14, 0x25, 0x73, 0x53, 0x27, 0x7C,
+	0x4C, 0x4A, 0xD6, 0xB7, 0x7C, 0x71, 0x25, 0xD8,
+	0xC5, 0xBA, 0xA8, 0x18, 0x59, 0xC7, 0x64, 0x2E,
+	0x9A, 0x65, 0xE9, 0x63, 0x83, 0x3D, 0xB8, 0x2B,
+	0x42, 0x0A, 0x6D, 0x7D, 0xCE, 0x6A, 0xA3, 0x11,
+	0xD6, 0xB6, 0x54, 0x82, 0x36, 0x38, 0xF1, 0x84,
+	0x01, 0x3E, 0x26, 0x66, 0xC7, 0x38, 0x6F, 0x41,
+	0x4C, 0xC2, 0x42, 0xB5, 0xBF, 0xCE, 0x7B, 0x8B,
+	0xD5, 0x4F, 0x9B, 0x9F, 0x0E, 0xFE, 0x52, 0xAF,
+	0x6D, 0x39, 0xD8, 0x0A, 0x27, 0x4D, 0xDB, 0x9F,
+	0x04, 0x25, 0x8C, 0xF5, 0x89, 0x5B, 0xEB, 0xDC,
+	0x70, 0xBF, 0x23, 0x1D, 0x14, 0x73, 0x9E, 0xFC,
+	0x41, 0xA0, 0xA2, 0xA5, 0xAA, 0xAB, 0x8E, 0xCD,
+	0x5E, 0x29, 0xC5, 0x3E, 0xEC, 0x0A, 0xD9, 0x06,
+	0xEB, 0x8C, 0x18, 0x41, 0x80, 0x91, 0x5D, 0xC9,
+	0x28, 0xCE, 0xDB, 0x1C, 0x0E, 0x8F, 0xE3, 0xC0,
+	0xE5, 0xB1, 0x0A, 0x38, 0x06, 0x43, 0x36, 0x0D,
+	0xF8, 0xE6, 0x2E, 0xCB, 0xEB, 0x51, 0xC8, 0x82,
+	0xE0, 0x3B, 0xCB, 0xCE, 0x62, 0xC8, 0xE0, 0x8A,
+	0x2C, 0xE4, 0xC7, 0xD7, 0xC1, 0x8A, 0x64, 0x0D,
+	0xE8, 0x5A, 0x52, 0x83, 0x58, 0x93, 0x2A, 0x25,
+	0x92, 0x65, 0x19, 0x4F, 0x0F, 0x44, 0x1C, 0xCE,
+	0x56, 0x91, 0xB4, 0xC9, 0x8D, 0x9E, 0x6A, 0xD5,
+	0xCA, 0xE3, 0xA0, 0xE3, 0x46, 0x45, 0x0D, 0x59,
+	0x14, 0x90, 0x72, 0x67, 0xC5, 0x95, 0xAC, 0x2A,
+	0xC4, 0x70, 0xD2, 0xCA, 0x40, 0x1D, 0x62, 0x0E,
+	0x2A, 0xA4, 0x3E, 0xAC, 0x45, 0x00, 0x96, 0xA4,
+	0xF6, 0xAC, 0xEE, 0x01, 0x19, 0xEB, 0xCC, 0x8C,
+	0x62, 0xE3, 0x26, 0x59, 0xB7, 0xB9, 0xBF, 0xBB,
+	0x8D, 0x72, 0xAD, 0x1A, 0xA2, 0x8D, 0xB1, 0x1B,
+	0xC1, 0xC1, 0xD8, 0xFF, 0x03, 0xAF, 0x74, 0xDF,
+	0xC6, 0x3C, 0xCE, 0xBD, 0xA8, 0x12, 0xFA, 0xAC,
+	0x83, 0x8C, 0x7E, 0x26, 0x8E, 0x0D, 0x03, 0xF3,
+	0x02, 0x17, 0x23, 0x13, 0x25, 0x01, 0x1F, 0xB9,
+	0x3B, 0x1C, 0x3E, 0xA7, 0xD9, 0xE4, 0xE6, 0xCA,
+	0xD6, 0x0C, 0x91, 0xAC, 0xEE, 0xD4, 0x42, 0xA7,
+	0xB1, 0x62, 0x70, 0xC8, 0xC9, 0x2F, 0x0A, 0xE0,
+	0xA8, 0xC7, 0x22, 0xE5, 0x2C, 0x06, 0x1C, 0x09,
+	0x4B, 0x45, 0x25, 0x02, 0x07, 0x8A, 0x86, 0xCC,
+	0xF8, 0xF9, 0x36, 0x11, 0x67, 0x75, 0xEE, 0xD2,
+	0xD4, 0x67, 0x09, 0xFD, 0x37, 0xB4, 0x3F, 0x7B,
+	0x4A, 0x2B, 0x4E, 0x05, 0x37, 0x5E, 0xFD, 0x97,
+	0x79, 0x95, 0x13, 0x95, 0x0D, 0x75, 0x15, 0x94,
+	0x27, 0x36, 0xB3, 0x97, 0x03, 0xBE, 0x38, 0x14,
+	0xCB, 0x4D, 0x16, 0x49, 0xFF, 0x36, 0xFA, 0xED,
+	0x4D, 0x97, 0x45, 0xE4, 0xFB, 0xF9, 0x61, 0x7D,
+	0x1F, 0xCE, 0xC3, 0xBF, 0xB3, 0xEA, 0x3C, 0xBC,
+	0x13, 0x05, 0xBB, 0xAB, 0x44, 0x84, 0x80, 0x0F,
+	0xB9, 0x1F, 0x6E, 0x88, 0x27, 0x4A, 0xFA, 0x17,
+	0x83, 0x76, 0x5F, 0xC5, 0xE8, 0x85, 0xBC, 0xFF,
+	0xD8, 0x48, 0x4A, 0x9F, 0xEB, 0xC3, 0xF8, 0x41,
+	0x86, 0x4D, 0xC2, 0x75, 0x7B, 0x74, 0x71, 0x68,
+	0x9C, 0xF8, 0x05, 0x8B, 0xB7, 0xFA, 0xE0, 0xA7,
+	0xFA, 0xEC, 0x53, 0x91, 0xD0, 0xB4, 0x44, 0x7A,
+	0x42, 0xAD, 0xD2, 0x17, 0x86, 0x8F, 0x96, 0xF0,
+	0xF1, 0xD6, 0xC0, 0x26, 0x34, 0x83, 0x2E, 0x62,
+	0x0D, 0x3F, 0x13, 0x5A, 0x8C, 0xBC, 0x6D, 0x8D,
+	0x39, 0x05, 0x91, 0x10, 0x32, 0xBE, 0x17, 0x8A,
+	0xC7, 0x23, 0xBE, 0x3F, 0xC5, 0x8A, 0xE0, 0x81,
+	0xFC, 0x0D, 0x4C, 0x62, 0xE8, 0x67, 0xBA, 0x8B,
+	0xBD, 0xA5, 0xCB, 0xE9, 0x34, 0x3D, 0x8D, 0x84,
+	0x9D, 0x65, 0xBF, 0x9E, 0xC4, 0xB3, 0x16, 0x2E,
+	0x12, 0xB9, 0x1F, 0x82, 0xA1, 0x46, 0x26, 0xD5,
+	0xAB, 0x7D, 0x80, 0x4D, 0x9C, 0xD3, 0xEB, 0x77,
+	0xFB, 0x67, 0xEA, 0xEE, 0xA8, 0x7B, 0x17, 0x02,
+	0x2E, 0x6E, 0xF5, 0x11, 0x44, 0xFC, 0x31, 0x01,
+	0xCC, 0x03, 0x94, 0x0A, 0xCF, 0x8D, 0x12, 0xCD,
+	0x87, 0x66, 0x38, 0x62, 0x3C, 0xBB, 0x98, 0x2E,
+	0xC5, 0x58, 0xD0, 0xF3, 0x06, 0xBD, 0x49, 0x7E,
+	0x18, 0x7D, 0x64, 0xEF, 0x37, 0x71, 0x87, 0xD4,
+	0xE6, 0x2C, 0xCC, 0x32, 0x59, 0x65, 0x05, 0x45,
+	0xDE, 0xF3, 0x17, 0x62, 0x2C, 0x25, 0x62, 0x9C,
+	0x67, 0xBD, 0x74, 0xF1, 0x54, 0x0E, 0x0B, 0x4A,
+	0x01, 0x9F, 0x5E, 0x3B, 0x08, 0x57, 0xFA, 0x09,
+	0x99, 0x11, 0x2C, 0x3E, 0x1D, 0x2D, 0xF7, 0x91,
+	0x12, 0x14, 0xFF, 0x95, 0x6F, 0xCA, 0xBD, 0x25,
+	0xEC, 0x3C, 0x98, 0xA7, 0xAB, 0x98, 0x0E, 0xFB,
+	0x01, 0xE9, 0x5E, 0x58, 0x5A, 0x49, 0x3F, 0xB2,
+	0xC4, 0xBC, 0xF3, 0xEC, 0xCA, 0x4C, 0x54, 0x27,
+	0x66, 0x10, 0x60, 0x76, 0x5C, 0xFB, 0x9E, 0xAC,
+	0xD2, 0x09, 0x75, 0xB3, 0x2B, 0x65, 0xE7, 0x93,
+	0xAD, 0x2B, 0x08, 0x6F, 0x87, 0x73, 0x45, 0x2A,
+	0x1B, 0xB1, 0x75, 0xE7, 0x02, 0x9B, 0xCB, 0x56,
+	0x87, 0x6F, 0x66, 0x44, 0xED, 0xDC, 0x03, 0x92,
+	0xD4, 0xF1, 0x07, 0x40, 0xD6, 0x86, 0xD5, 0x98,
+	0x3D, 0x9B, 0x03, 0xD9, 0x0A, 0x58, 0x59, 0x54,
+	0x06, 0x10, 0xFD, 0x15, 0xFB, 0xE0, 0x5B, 0x81,
+	0x8D, 0x0C, 0xC0, 0xA6, 0x15, 0x94, 0x72, 0x5E,
+	0xC8, 0x4A, 0x73, 0x59, 0x63, 0xF6, 0xCD, 0x8D,
+	0xA4, 0xC2, 0xAF, 0x2E, 0xAE, 0xC1, 0x93, 0x89,
+	0x08, 0x81, 0x10, 0xEC, 0x44, 0x81, 0x33, 0x96,
+	0x88, 0xDC, 0x19, 0xDF, 0xD4, 0x2E, 0x5D, 0x52,
+	0xD7, 0x6A, 0x02, 0x64, 0x11, 0x6B, 0x24, 0xCF,
+	0x51, 0xD4, 0xC1, 0x85, 0x7D, 0xA3, 0x24, 0x6A,
+	0x05, 0x13, 0x55, 0xC3, 0x64, 0x5A, 0xDF, 0x9A,
+	0x23, 0x73, 0xEA, 0xD9, 0x48, 0x98, 0xBE, 0x1C,
+	0xBD, 0x3A, 0x5D, 0x37, 0xDC, 0x18, 0xA8, 0x39,
+	0x71, 0x67, 0xC4, 0x12, 0xF1, 0xE3, 0x53, 0x73,
+	0xF1, 0xD8, 0xC4, 0x8B, 0xB3, 0x64, 0x03, 0xDD,
+	0x6E, 0xFB, 0x4A, 0xEF, 0xA4, 0x37, 0xA8, 0xA5,
+	0x2E, 0x86, 0x40, 0x73, 0x16, 0xBA, 0x3A, 0xF5,
+	0x5E, 0x47, 0xD8, 0x13, 0x58, 0xB7, 0x73, 0xA2,
+	0xDA, 0x00, 0x9F, 0x90, 0xE4, 0xF8, 0x0B, 0xB3,
+	0x26, 0x0A, 0xD8, 0x46, 0x8A, 0x09, 0x55, 0xCB,
+	0xCB, 0xA4, 0x89, 0x84, 0xF8, 0x35, 0xF0, 0xDF,
+	0x45, 0x5B, 0x6A, 0xAF, 0xA8, 0x5F, 0xE4, 0xC2,
+	0x03, 0x9B, 0x5B, 0x11, 0x21, 0xA7, 0xDE, 0xC5,
+	0x71, 0x3D, 0x00, 0xF8, 0x6F, 0x13, 0x75, 0x4E,
+	0x7B, 0x6B, 0x32, 0x95, 0xD3, 0x77, 0x82, 0xA2,
+	0x70, 0x6A, 0x80, 0xC3, 0x0D, 0x53, 0xC4, 0x1C,
+	0xF0, 0x1C, 0x5A, 0x54, 0xA4, 0xB2, 0x7A, 0x90,
+	0x6E, 0x48, 0x39, 0x19, 0x4A, 0x70, 0x8E, 0xEB,
+	0xF2, 0x94, 0x07, 0x45, 0xC0, 0x4B, 0xC1, 0x80,
+	0xED, 0x87, 0x39, 0x6B, 0x5F, 0x7E, 0x63, 0x95,
+	0x38, 0xFB, 0xF4, 0x6E, 0x3A, 0x6A, 0x78, 0x59,
+	0x1E, 0x51, 0x45, 0x02, 0x14, 0xAC, 0xA1, 0xD1,
+	0xC8, 0x44, 0x03, 0xB6, 0x3D, 0xA4, 0xB3, 0xC1,
+	0xE0, 0x1C, 0x39, 0xA1, 0x87, 0x21, 0x7C, 0xBA,
+	0x9A, 0x92, 0xA3, 0xAF, 0x37, 0xE8, 0x27, 0xA1,
+	0xBE, 0x2D, 0x83, 0x0A, 0x46, 0xE7, 0x68, 0x44,
+	0x9D, 0xB1, 0x57, 0x33, 0x9B, 0x57, 0xE3, 0x0C,
+	0xE7, 0xDF, 0x7F, 0x15, 0xC0, 0xB5, 0x3A, 0x08,
+	0x6C, 0xEF, 0xB3, 0xD3, 0xA2, 0x3C, 0x84, 0xC8,
+	0x77, 0x46, 0xB8, 0xD0, 0x1E, 0x6D, 0x7A, 0x0B,
+	0xD7, 0x25, 0x77, 0x74, 0xF6, 0xD8, 0xF4, 0x75,
+	0x54, 0x6A, 0x91, 0x48, 0x98, 0xAC, 0x52, 0xA6,
+	0x6C, 0xBC, 0x05, 0xA4, 0x92, 0x8F, 0x52, 0xAA,
+	0x97, 0xCC, 0x23, 0xD8, 0x69, 0x01, 0xB0, 0xD2,
+	0x1F, 0x22, 0xE8, 0xD1, 0xF7, 0x89, 0x8E, 0x40,
+	0xF1, 0xD8, 0xCE, 0xB5, 0x26, 0x82, 0xBD, 0xD7,
+	0x7C, 0x88, 0xB2, 0x6F, 0x16, 0x07, 0x67, 0x51,
+	0x45, 0x6C, 0x90, 0x63, 0xBA, 0x58, 0xB6, 0x71,
+	0xB8, 0x54, 0xA8, 0x4C, 0x54, 0xB3, 0xD7, 0x2B,
+	0x9F, 0xEB, 0x1C, 0xC6, 0x9F, 0xFA, 0xD6, 0xD3,
+	0xED, 0xA0, 0x99, 0x18, 0x99, 0x23, 0xB0, 0x1A,
+	0xAA, 0x3A, 0x42, 0xCB, 0x4A, 0xFC, 0x54, 0x30,
+	0x86, 0xD0, 0xFF, 0x44, 0x62, 0xAB, 0x94, 0xBD,
+	0xA9, 0x95, 0x27, 0x22, 0xD6, 0x57, 0xE7, 0x26,
+	0x94, 0x18, 0x0C, 0xDE, 0x10, 0x44, 0xE4, 0x1A,
+	0x55, 0x15, 0x07, 0xDC, 0x33, 0xCF, 0x4D, 0x27,
+	0x9D, 0xDD, 0x19, 0xF7, 0x81, 0xD5, 0x2A, 0xFA,
+	0x52, 0xC5, 0xA3, 0xF9, 0x6A, 0x78, 0xE8, 0x95,
+	0xE5, 0x00, 0x98, 0x46, 0xD0, 0xA5, 0x55, 0x23,
+	0x0D, 0xED, 0xA3, 0x84, 0x87, 0xAF, 0xB5, 0xBC,
+	0x10, 0x8B, 0x1F, 0x0A, 0x5E, 0x08, 0x5B, 0xC8,
+	0x78, 0xBD, 0xBC, 0xB5, 0x29, 0x56, 0x3C, 0xFB,
+	0x95, 0xC7, 0xFD, 0xDD, 0xB6, 0x2A, 0x66, 0x5A,
+	0x2B, 0x86, 0xA2, 0x74, 0x33, 0x67, 0xA3, 0x48,
+	0xE7, 0xFA, 0xCB, 0x08, 0x6B, 0x9D, 0x85, 0x8E,
+	0x38, 0x14, 0xCB, 0xC2, 0xDA, 0xA7, 0x06, 0x3A,
+	0x23, 0xE6, 0x80, 0x7D, 0x01, 0xA2, 0xA4, 0x1B,
+	0x3C, 0xCF, 0x9C, 0xE8, 0x62, 0x4D, 0xF5, 0x81,
+	0x8C, 0xB9, 0x11, 0x8A, 0x12, 0x07, 0x93, 0xDD,
+	0xB9, 0x40, 0x32, 0xB4, 0x60, 0x6A, 0xC8, 0x76,
+	0x95, 0x54, 0x0A, 0x48, 0xE2, 0xFF, 0x8A, 0x3C,
+	0xA2, 0x17, 0x4A, 0xCF, 0xDF, 0x6A, 0xAF, 0xBE,
+	0x7A, 0x62, 0x7A, 0x3A, 0x60, 0x0B, 0x64, 0x2D,
+	0xF0, 0xF9, 0x9C, 0x0B, 0xB2, 0x1C, 0xFD, 0xB6,
+	0x3F, 0x86, 0x9F, 0x4A, 0xA7, 0xA3, 0x8C, 0xC1,
+	0xAD, 0xF3, 0xFA, 0x86, 0xEF, 0x3F, 0xD7, 0x86,
+	0x05, 0xF0, 0x8D, 0xA6, 0xD1, 0xFE, 0xE0, 0xB4,
+	0x12, 0xC6, 0x35, 0x88, 0xFE, 0x77, 0xDE, 0x4E,
+	0x36, 0x4C, 0x8A, 0x81, 0x62, 0xC0, 0x30, 0x95,
+	0xC9, 0x2E, 0xB5, 0xCD, 0x09, 0x8D, 0x14, 0xDF,
+	0xED, 0x2E, 0x2D, 0xCE, 0x8A, 0x94, 0x7A, 0xC7,
+	0x12, 0x51, 0x8B, 0xEF, 0x45, 0xE9, 0x7A, 0x5E,
+	0x1E, 0x51, 0x73, 0x34, 0x51, 0x2B, 0xCB, 0x45,
+	0x22, 0xE6, 0x6F, 0x62, 0x20, 0xBA, 0xD2, 0x4E,
+	0xDC, 0x1F, 0xEE, 0x25, 0xFD, 0xA5, 0xD8, 0xD6,
+	0x4A, 0x24, 0xEA, 0x5E, 0x36, 0xF5, 0x76, 0x76,
+	0x27, 0x53, 0x99, 0xA1, 0xAF, 0x9E, 0x3C, 0x2A,
+	0x4C, 0xB2, 0x26, 0x8C, 0xC4, 0x1D, 0x38, 0x0C,
+	0x3F, 0xC6, 0x34, 0xA8, 0x5B, 0x96, 0x46, 0x4B,
+	0xE4, 0x17, 0xB8, 0x91, 0xD8, 0x28, 0x43, 0x99,
+	0xD8, 0xB5, 0x1D, 0x87, 0x66, 0x29, 0xC6, 0x8E,
+	0x43, 0x07, 0xAE, 0xBC, 0x05, 0xBF, 0xE2, 0xED,
+	0xDD, 0xCD, 0xDA, 0x65, 0xC9, 0x87, 0x95, 0xB6,
+	0x4D, 0x64, 0x64, 0x23, 0x5D, 0x19, 0x9D, 0x47,
+	0xC0, 0xED, 0x36, 0x03, 0x8C, 0x1E, 0xBA, 0xDE,
+	0xB7, 0x5D, 0xB8, 0x2B, 0x10, 0x35, 0x6F, 0xCD,
+	0x8E, 0xF8, 0xFA, 0xC0, 0x95, 0x34, 0x5C, 0x6A,
+	0x49, 0xDB, 0x30, 0x4C, 0xEB, 0x61, 0x27, 0xF5,
+	0x83, 0x5B, 0xBF, 0x05, 0x1F, 0x56, 0xF0, 0x4B,
+	0x1C, 0x25, 0x29, 0xA2, 0xC5, 0xF2, 0x46, 0xF6,
+	0xE9, 0x04, 0xDB, 0x7D, 0x01, 0xDE, 0xE0, 0x76,
+	0xEC, 0xB0, 0x24, 0x61, 0x41, 0xA4, 0x53, 0x84,
+	0x90, 0x1B, 0x96, 0x72, 0x00, 0x14, 0x26, 0xED,
+	0x20, 0x31, 0x5A, 0x24, 0xC9, 0xB2, 0x2A, 0x75,
+	0xD3, 0x94, 0xC1, 0xFE, 0xCE, 0xC1, 0x57, 0xDE,
+	0x5E, 0xCD, 0xBE, 0xCB, 0x85, 0x4A, 0x6B, 0x85,
+	0x28, 0xC3, 0x7B, 0x12, 0x7F, 0x61, 0xDD, 0x22,
+	0x07, 0x37, 0xFF, 0x70, 0x7A, 0xA1, 0x56, 0xD4,
+	0x5A, 0x3A, 0x59, 0xAB, 0xC3, 0x65, 0x09, 0x0E,
+	0x3C, 0x9C, 0x52, 0x34, 0xB2, 0x5D, 0x89, 0x62,
+	0x89, 0x3E, 0x22, 0x07, 0x56, 0xA2, 0x4D, 0x95,
+	0xE8, 0x78, 0x15, 0x44, 0x6F, 0xA3, 0xB2, 0x2C,
+	0x24, 0xF8, 0xA0, 0x54, 0x9E, 0x73, 0x25, 0x0C,
+	0xB3, 0x2C, 0xFF, 0x2D, 0x9C, 0x2E, 0xE1, 0xD8,
+	0x70, 0xF1, 0xCA, 0xA4, 0xB6, 0x6E, 0xDF, 0xE5,
+	0xB4, 0x0F, 0xF7, 0x00, 0x8E, 0x4F, 0x6F, 0xBA,
+	0x0D, 0x1F, 0x82, 0xF0, 0x7D, 0xC4, 0xED, 0x1E,
+	0xB6, 0x61, 0xE2, 0x3C, 0xBF, 0x5F, 0x88, 0xE1,
+	0x37, 0x5E, 0xE7, 0x7D, 0xE2, 0x13, 0xDF, 0x9A,
+	0x59, 0x6D, 0x85, 0x87, 0x7D, 0xCD, 0x8A, 0x01,
+	0xA1, 0xA7, 0x10, 0x63, 0xB5, 0xA4, 0xC4, 0xE0,
+	0x1A, 0x45, 0x4E, 0x91, 0x07, 0x54, 0x62, 0xD6,
+	0xC2, 0x3F, 0x96, 0x40, 0xF6, 0x8B, 0x12, 0x59,
+	0xEF, 0x20, 0x9C, 0x35, 0x4E, 0x37, 0x1F, 0xAA,
+	0x9C, 0x01, 0xA5, 0x59, 0x85, 0x37, 0x9E, 0x4F,
+	0xDF, 0xFF, 0x40, 0x6E, 0xC2, 0xE6, 0xC6, 0x09,
+	0x70, 0x1C, 0xC2, 0xCD, 0x11, 0x6B, 0x84, 0xC8,
+	0xEE, 0x2B, 0xAE, 0xD5, 0x36, 0xFC, 0x83, 0x30,
+	0xDD, 0x5E, 0x13, 0x6C, 0x49, 0xDB, 0x44, 0xDD,
+	0x39, 0x58, 0xE7, 0x83, 0xD6, 0x1A, 0x5F, 0xE2,
+	0xF7, 0x82, 0xDC, 0x1E, 0x80, 0x44, 0xDB, 0x48,
+	0x62, 0x32, 0x75, 0x3E, 0x6A, 0x98, 0x1A, 0xB2,
+	0x36, 0xBF, 0xDE, 0x35, 0x6B, 0x20, 0x9F, 0x83,
+	0xB5, 0xA2, 0x1C, 0x0B, 0x99, 0x9B, 0x49, 0x43,
+	0xEB, 0x5B, 0x67, 0x03, 0x8A, 0x24, 0x45, 0x8C,
+	0x15, 0xEE, 0xD2, 0xB2, 0x35, 0xEB, 0xAF, 0x69,
+	0x0E, 0x69, 0x3B, 0x4D, 0x80, 0x9B, 0x75, 0x43,
+	0xB4, 0x40, 0x30, 0xCF, 0xD9, 0x76, 0xD4, 0x58,
+	0xAC, 0x2B, 0x10, 0xE3, 0xF3, 0x48, 0x38, 0xAA,
+	0x69, 0x18, 0x51, 0x5C, 0xD7, 0xB0, 0x9E, 0x5B,
+	0x1E, 0x18, 0xD7, 0x59, 0x67, 0x80, 0x4F, 0xCB,
+	0x40, 0x49, 0xB0, 0x27, 0xCD, 0x15, 0xF7, 0x56,
+	0x34, 0x0F, 0x5D, 0xD9, 0xC4, 0xCB, 0xF7, 0x83,
+	0x0D, 0x8B, 0xCF, 0x21, 0x13, 0x1A, 0x49, 0xE6,
+	0x21, 0x49, 0x0F, 0x67, 0xFF, 0xE6, 0xE7, 0xF4,
+	0xD7, 0x2C, 0xDA, 0xFD, 0xBD, 0x86, 0xC2, 0x40,
+	0x6E, 0xB5, 0x05, 0xFC, 0x3E, 0x88, 0xB4, 0xB1,
+	0xC1, 0x5C, 0x6D, 0x0F, 0x0F, 0x17, 0xE6, 0xE0,
+	0x96, 0x4B, 0x45, 0xBD, 0x07, 0x20, 0x00, 0x3F,
+	0xF0, 0xF2, 0xB9, 0xA1, 0x35, 0x01, 0x47, 0x81,
+	0x1F, 0xA2, 0x0A, 0x66, 0xDB, 0xD7, 0x58, 0x51,
+	0x88, 0x78, 0x24, 0x6F, 0x7E, 0x68, 0x46, 0xBD,
+	0xEB, 0x5C, 0xA9, 0xDE, 0x30, 0x34, 0x2B, 0xA3,
+	0xCF, 0x93, 0x82, 0x14, 0x3D, 0x96, 0x1E, 0xD7,
+	0x6E, 0x9A, 0x2E, 0x72, 0xD0, 0x49, 0xDB, 0x24,
+	0xA0, 0x6E, 0x8E, 0xBA, 0x4A, 0x36, 0xCB, 0xF6,
+	0x9A, 0x46, 0x24, 0xEF, 0x18, 0xA8, 0xD9, 0xD5,
+	0x93, 0xF0, 0x2B, 0xEC, 0x60, 0x0A, 0x8F, 0x1C,
+	0xE8, 0x69, 0x56, 0x14, 0x6C, 0x8E, 0x30, 0xFB,
+	0x8D, 0xCF, 0xE7, 0x92, 0x59, 0x2E, 0x32, 0xEB,
+	0xAE, 0xA3, 0x99, 0x87, 0x98, 0x49, 0x03, 0xCD,
+	0x5E, 0xBD, 0xDE, 0xB9, 0xF5, 0xD0, 0xB3, 0xB1,
+	0x65, 0xAC, 0xC7, 0x42, 0xB4, 0xCF, 0x6A, 0x00,
+	0x3E, 0x2E, 0xC1, 0x13, 0xDF, 0x5E, 0x2E, 0xEC,
+	0x30, 0x00, 0xE2, 0xAB, 0xFD, 0x74, 0x06, 0x55,
+	0x88, 0x07, 0xB0, 0xEF, 0x6D, 0x43, 0x81, 0x15,
+	0xFC, 0xF6, 0x96, 0x91, 0x3D, 0x2F, 0xFE, 0xBD,
+	0xB9, 0xC8, 0xB6, 0x81, 0x63, 0xE0, 0xA9, 0x20,
+	0x93, 0xEC, 0x4B, 0x1E, 0xB9, 0xC2, 0xD0, 0x8C,
+	0x2E, 0xCB, 0x18, 0x7D, 0x1F, 0x66, 0xA6, 0x96,
+	0xA9, 0xB8, 0x66, 0x4F, 0xCF, 0xC9, 0xDA, 0x97,
+	0xCA, 0x07, 0xF1, 0xC8, 0xFB, 0x56, 0x60, 0xA9,
+	0x25, 0xDB, 0xFC, 0x2D, 0xB6, 0x0A, 0x42, 0x6A,
+	0x7F, 0xCE, 0x70, 0x91, 0xFF, 0x3B, 0xAC, 0xAB,
+	0xF2, 0x23, 0x4E, 0x50, 0xE9, 0xE6, 0x2F, 0xCB,
+	0x98, 0xBA, 0x7D, 0xD2, 0x8A, 0xDE, 0x6E, 0x80,
+	0x0C, 0xC6, 0xEB, 0xD9, 0x64, 0xD4, 0x59, 0xD5,
+	0x75, 0x00, 0x18, 0x7F, 0xD6, 0x86, 0xC2, 0x25,
+	0x98, 0xA9, 0x28, 0x1C, 0x40, 0x46, 0xC6, 0xA5,
+	0xAF, 0x6E, 0x5D, 0x25, 0x3C, 0x77, 0xF9, 0x43,
+	0xF3, 0x20, 0xFC, 0x43, 0xA0, 0x5E, 0xF1, 0x65,
+	0x5D, 0x8B, 0x33, 0x5A, 0x94, 0xF0, 0x6F, 0xB6,
+	0xD4, 0x4A, 0x48, 0x64, 0x31, 0x73, 0x17, 0x4E,
+	0x88, 0x90, 0xA8, 0xE4, 0x7F, 0xCE, 0xD5, 0x7D,
+	0xE3, 0x84, 0x3F, 0x38, 0x71, 0x4C, 0xB1, 0x18,
+	0xAA, 0x46, 0xF2, 0xCF, 0x99, 0xF0, 0x24, 0xD7,
+	0xFD, 0xFC, 0x2C, 0x81, 0x25, 0xC1, 0x8E, 0x0B,
+	0x82, 0x4C, 0x14, 0x6C, 0x44, 0xB1, 0x78, 0x67,
+	0x14, 0x47, 0xCA, 0x70, 0x0D, 0x13, 0xD1, 0xA8,
+	0x73, 0xBC, 0x4E, 0xAA, 0x1E, 0xB7, 0x59, 0xC0,
+	0xAC, 0xE3, 0x21, 0x2B, 0x55, 0x22, 0x6A, 0x53,
+	0xA6, 0xF0, 0xE9, 0x56, 0x37, 0x3B, 0xD6, 0x1B,
+	0x2E, 0x57, 0x98, 0x4D, 0x6A, 0x7E, 0xEB, 0x2E,
+	0x9B, 0xB8, 0xE2, 0x27, 0x55, 0xE2, 0x2E, 0xFA,
+	0x3C, 0xD2, 0x7A, 0xCC, 0xDB, 0x5C, 0x45, 0x85,
+	0xA6, 0x92, 0x49, 0x79, 0x9D, 0x18, 0x20, 0x50,
+	0x7B, 0xF4, 0x0F, 0x43, 0x2F, 0x7B, 0x3E, 0x90,
+	0xEF, 0xF3, 0x29, 0x66, 0xDF, 0xD1, 0xE9, 0x44,
+	0xC6, 0x28, 0xAA, 0x48, 0x00, 0x5F, 0x12, 0xEB,
+	0xEC, 0x26, 0x7F, 0xB3, 0x83, 0xFB, 0x50, 0x5A,
+	0x5F, 0x5A, 0x8E, 0x08, 0x4B, 0xF7, 0x50, 0x10,
+	0xC8, 0x73, 0x8F, 0x9C, 0xF6, 0xCB, 0xDC, 0xEA,
+	0x78, 0x07, 0x2C, 0x59, 0xAD, 0x66, 0x48, 0xFF,
+	0x56, 0x7D, 0x99, 0xC9, 0xEA, 0x64, 0xE7, 0xD0,
+	0x46, 0x88, 0x58, 0x46, 0x93, 0x37, 0x70, 0xC1,
+	0x91, 0x40, 0x02, 0x46, 0x7F, 0x8D, 0xFE, 0x66,
+	0x07, 0x1F, 0x3B, 0x56, 0x6A, 0x6E, 0x88, 0xB2,
+	0xBB, 0xC0, 0xC8, 0xCD, 0xD9, 0xDC, 0x0A, 0x0C,
+	0x1A, 0x27, 0x35, 0x48, 0x4C, 0x5B, 0x5D, 0x90,
+	0xA0, 0xB2, 0xB4, 0xCE, 0xD6, 0xDD, 0x07, 0x13,
+	0x7C, 0x93, 0x99, 0xA2, 0xA9, 0xAC, 0xC3, 0xC8,
+	0xEF, 0x1D, 0x33, 0x3D, 0x3F, 0x42, 0x52, 0x57,
+	0x6D, 0x72, 0x87, 0x8E, 0x96, 0xA8, 0xC6, 0xC8,
+	0xD0, 0xD6, 0xE8, 0xEB, 0xF2, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0E, 0x1E, 0x29, 0x3D,
+};
+
+/* Message */
+uint8_t mldsa_44_message[] = {
+	0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
+	0x74, 0x68, 0x65, 0x20, 0x6D, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x20, 0x74, 0x6F, 0x20, 0x62,
+	0x65, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x65, 0x64,
+	0x2E, 0x0A,
+};
+
+uint8_t mldsa_44_privkey_noseed[] = {
+	0xBA, 0x71, 0xF9, 0xF6, 0x4E, 0x11, 0xBA, 0xEB,
+	0x58, 0xFA, 0x9C, 0x6F, 0xBB, 0x6E, 0x14, 0xE6,
+	0x1F, 0x18, 0x64, 0x3D, 0xAB, 0x49, 0x5B, 0x47,
+	0x53, 0x9A, 0x91, 0x66, 0xCA, 0x01, 0x98, 0x13,
+	0xC5, 0xC1, 0x61, 0x0A, 0x40, 0x77, 0x4F, 0x0E,
+	0xBA, 0x33, 0x34, 0xF8, 0xB5, 0xBE, 0x56, 0xE8,
+	0x78, 0x71, 0xB3, 0xC3, 0xA7, 0x72, 0xC0, 0x72,
+	0x0F, 0xA3, 0x76, 0x66, 0xAE, 0x17, 0x35, 0xFD,
+	0xE6, 0xBC, 0x38, 0xA1, 0xC3, 0x5F, 0x8C, 0xF0,
+	0x8E, 0x44, 0x09, 0x24, 0xC9, 0x03, 0x71, 0x97,
+	0xBB, 0x87, 0xFD, 0xC4, 0x64, 0x6B, 0x86, 0xDA,
+	0x5A, 0x05, 0x89, 0xA3, 0x26, 0xCC, 0x0C, 0x0D,
+	0x95, 0x0F, 0xF8, 0xB5, 0xA9, 0xEA, 0x41, 0x35,
+	0xEA, 0xB8, 0xA9, 0x3F, 0x80, 0xF0, 0x92, 0x7E,
+	0x12, 0x40, 0x46, 0xE2, 0x5B, 0x23, 0x66, 0xAE,
+	0xA2, 0x5A, 0x6D, 0x1D, 0x0F, 0xEF, 0x98, 0x21,
+	0x04, 0xB8, 0x09, 0xDA, 0x12, 0x48, 0xE1, 0x40,
+	0x4C, 0x11, 0x03, 0x85, 0x99, 0xB0, 0x4D, 0x61,
+	0x04, 0x0A, 0xC0, 0x34, 0x28, 0x23, 0x16, 0x80,
+	0x08, 0x12, 0x45, 0x11, 0x49, 0x0C, 0xA0, 0x96,
+	0x0D, 0xC2, 0xA8, 0x01, 0x5A, 0xA8, 0x65, 0x0B,
+	0x30, 0x25, 0xD4, 0x94, 0x44, 0x8B, 0x38, 0x8C,
+	0x10, 0x24, 0x41, 0x22, 0x40, 0x69, 0x8A, 0x04,
+	0x04, 0x0C, 0x26, 0x90, 0xE3, 0x34, 0x69, 0xE2,
+	0x24, 0x68, 0xD2, 0x44, 0x00, 0x0B, 0x84, 0x90,
+	0xD9, 0x42, 0x30, 0x21, 0x91, 0x8D, 0x09, 0x99,
+	0x64, 0x20, 0x39, 0x60, 0x82, 0x36, 0x21, 0x90,
+	0xB8, 0x4C, 0x02, 0x12, 0x6E, 0x24, 0xB9, 0x70,
+	0x84, 0x22, 0x01, 0xE1, 0xA8, 0x64, 0x44, 0x26,
+	0x0E, 0x01, 0x17, 0x0E, 0x82, 0x40, 0x6C, 0x9B,
+	0x38, 0x6D, 0x0A, 0x93, 0x50, 0x52, 0x22, 0x25,
+	0xD2, 0xB8, 0x2C, 0x1A, 0x25, 0x70, 0x90, 0x12,
+	0x22, 0xD1, 0xB2, 0x80, 0x22, 0x46, 0x52, 0x01,
+	0x34, 0x80, 0x40, 0x34, 0x21, 0x41, 0x06, 0x60,
+	0x41, 0x32, 0x82, 0x09, 0x45, 0x90, 0x52, 0x32,
+	0x29, 0x83, 0xB8, 0x44, 0x93, 0x12, 0x21, 0x0A,
+	0xC1, 0x89, 0x60, 0xB2, 0x71, 0x9C, 0x90, 0x69,
+	0x90, 0x82, 0x90, 0x89, 0x12, 0x49, 0x40, 0x40,
+	0x8A, 0x5C, 0x10, 0x48, 0x01, 0x87, 0x91, 0x03,
+	0xB0, 0x40, 0xD8, 0x44, 0x05, 0xE4, 0xB0, 0x29,
+	0x0A, 0x27, 0x90, 0x1C, 0xC9, 0x50, 0x58, 0x02,
+	0x8C, 0x0C, 0x49, 0x72, 0x49, 0x84, 0x6D, 0x19,
+	0xA7, 0x85, 0xE3, 0x00, 0x30, 0xCB, 0xB2, 0x21,
+	0xE2, 0x08, 0x10, 0x4C, 0xA6, 0x64, 0x11, 0x43,
+	0x68, 0x52, 0x94, 0x69, 0x09, 0x39, 0x32, 0x91,
+	0xA2, 0x6D, 0xCA, 0x14, 0x84, 0xA3, 0x92, 0x11,
+	0xDB, 0x94, 0x2C, 0x01, 0xC6, 0x64, 0x14, 0x24,
+	0x8C, 0x1A, 0x15, 0x31, 0x0A, 0x23, 0x0E, 0xD8,
+	0x14, 0x20, 0xA4, 0x26, 0x8D, 0x43, 0x40, 0x90,
+	0xC1, 0x42, 0x86, 0xA4, 0x10, 0x85, 0x0C, 0x32,
+	0x2D, 0xD0, 0x28, 0x60, 0x1B, 0xB5, 0x0C, 0x52,
+	0x44, 0x61, 0x21, 0x15, 0x24, 0x21, 0xC6, 0x04,
+	0xD8, 0x34, 0x31, 0xD9, 0x12, 0x71, 0xA2, 0x34,
+	0x52, 0x03, 0x30, 0x89, 0x54, 0x32, 0x10, 0x83,
+	0x94, 0x08, 0xA2, 0xA4, 0x70, 0xD2, 0x44, 0x8E,
+	0x84, 0x02, 0x8D, 0x91, 0x46, 0x62, 0x0B, 0x00,
+	0x0E, 0xA0, 0x80, 0x70, 0x22, 0xB5, 0x0D, 0x0B,
+	0xC9, 0x01, 0x00, 0x26, 0x4D, 0xE2, 0x44, 0x80,
+	0x93, 0x20, 0x65, 0xC9, 0x96, 0x8D, 0xDA, 0xA4,
+	0x4C, 0x42, 0xA8, 0x00, 0x1A, 0x27, 0x6C, 0xC3,
+	0x94, 0x4D, 0xA0, 0x30, 0x2C, 0xDA, 0xA8, 0x04,
+	0x23, 0xA3, 0x8C, 0x63, 0x04, 0x0E, 0x59, 0xC8,
+	0x00, 0x20, 0xA9, 0x6C, 0xC4, 0x06, 0x50, 0x82,
+	0x00, 0x2E, 0x5C, 0xB2, 0x44, 0x61, 0x46, 0x51,
+	0x0C, 0x18, 0x80, 0x18, 0x38, 0x82, 0x02, 0x25,
+	0x90, 0xA2, 0xB2, 0x60, 0x21, 0xA0, 0x40, 0x20,
+	0x49, 0x2A, 0x52, 0x28, 0x86, 0x93, 0xA6, 0x28,
+	0x9B, 0x94, 0x71, 0x02, 0xB9, 0x6D, 0x49, 0xA0,
+	0x2C, 0x09, 0x25, 0x28, 0x18, 0x93, 0x09, 0x10,
+	0x49, 0x4C, 0x13, 0xC9, 0x91, 0xA3, 0x88, 0x2D,
+	0x50, 0x12, 0x31, 0x63, 0xB4, 0x00, 0xA4, 0x00,
+	0x4E, 0x04, 0xB6, 0x68, 0x12, 0x14, 0x26, 0x00,
+	0x17, 0x00, 0x9B, 0x92, 0x0C, 0x51, 0xA8, 0x65,
+	0x11, 0x44, 0x8D, 0x44, 0x42, 0x69, 0x00, 0xA5,
+	0x6D, 0x04, 0xA9, 0x69, 0x43, 0x94, 0x69, 0x4C,
+	0xB8, 0x60, 0x52, 0x26, 0x2D, 0xA1, 0x32, 0x11,
+	0xCA, 0xB0, 0x11, 0x1B, 0x81, 0x90, 0x12, 0x11,
+	0x64, 0x42, 0x86, 0x89, 0x9C, 0x12, 0x51, 0xDC,
+	0xC0, 0x41, 0x13, 0x47, 0x68, 0x9B, 0x20, 0x92,
+	0xD1, 0x26, 0x91, 0x23, 0x96, 0x50, 0x13, 0xB3,
+	0x4C, 0x12, 0x45, 0x69, 0x21, 0xA1, 0x05, 0x0C,
+	0x46, 0x65, 0x99, 0x38, 0x30, 0x99, 0x26, 0x2E,
+	0x19, 0x15, 0x72, 0x11, 0x39, 0x8D, 0x89, 0x10,
+	0x92, 0x50, 0x28, 0x11, 0x48, 0xA6, 0x49, 0x52,
+	0xB6, 0x2D, 0xC9, 0x30, 0x4D, 0xD9, 0x32, 0x91,
+	0x91, 0xA6, 0x44, 0x14, 0x34, 0x0E, 0x13, 0x39,
+	0x41, 0x98, 0x06, 0x0C, 0x22, 0x25, 0x6C, 0x14,
+	0x47, 0x70, 0x21, 0xB7, 0x60, 0x23, 0x98, 0x25,
+	0xE4, 0x24, 0x6E, 0xD1, 0xB6, 0x44, 0x51, 0x44,
+	0x2C, 0x41, 0x42, 0x85, 0xE0, 0x44, 0x42, 0x89,
+	0x42, 0x42, 0xC2, 0x24, 0x2C, 0xCC, 0xC6, 0x68,
+	0x13, 0x12, 0x69, 0x98, 0x30, 0x49, 0x23, 0x28,
+	0x6A, 0x14, 0xC8, 0x11, 0x60, 0x92, 0x30, 0x11,
+	0x26, 0x52, 0x92, 0xB0, 0x00, 0x5C, 0x84, 0x2C,
+	0x4A, 0x14, 0x29, 0x0A, 0x95, 0x40, 0xE3, 0xC4,
+	0x05, 0x0C, 0xC8, 0x89, 0xA1, 0x26, 0x62, 0x44,
+	0x10, 0x04, 0x9A, 0xC8, 0x70, 0x0C, 0x93, 0x60,
+	0x90, 0xB6, 0x30, 0x12, 0x17, 0x71, 0x23, 0x18,
+	0x4E, 0xD4, 0x10, 0x85, 0x84, 0x20, 0x82, 0x5C,
+	0x14, 0x48, 0x90, 0xB2, 0x51, 0xA0, 0x18, 0x92,
+	0x93, 0x94, 0x80, 0x1A, 0x49, 0x72, 0xC0, 0x02,
+	0x06, 0xE1, 0xA6, 0x8C, 0xA1, 0x80, 0x4D, 0x4A,
+	0x26, 0x08, 0x18, 0x07, 0x62, 0x42, 0x12, 0x40,
+	0x10, 0x41, 0x64, 0x44, 0x42, 0x4E, 0x94, 0x86,
+	0x40, 0x9A, 0x84, 0x41, 0x21, 0xC5, 0x71, 0x01,
+	0x96, 0x29, 0x19, 0x40, 0x4E, 0x94, 0x36, 0x22,
+	0x24, 0xC3, 0x20, 0x22, 0x88, 0x71, 0x84, 0x20,
+	0x4C, 0x64, 0x20, 0x69, 0xDB, 0x84, 0x24, 0x24,
+	0x25, 0x46, 0x21, 0xC4, 0x71, 0x8A, 0x14, 0x64,
+	0x01, 0x20, 0x65, 0x4C, 0x84, 0x24, 0x44, 0x24,
+	0x30, 0x8A, 0x22, 0x70, 0xD3, 0x86, 0x30, 0x0B,
+	0xB4, 0x6C, 0x21, 0x23, 0x0A, 0x8B, 0xB8, 0x4D,
+	0x5C, 0xF7, 0xD7, 0xE6, 0x89, 0x30, 0x2B, 0xED,
+	0xB1, 0xC5, 0x86, 0x7E, 0x7D, 0x26, 0x9B, 0x1C,
+	0xDB, 0x07, 0xF8, 0x25, 0x64, 0x10, 0x82, 0xE1,
+	0x9A, 0x8D, 0xA2, 0xF9, 0x30, 0x77, 0xE8, 0xB1,
+	0xFC, 0x3D, 0x4E, 0x6B, 0x2D, 0x32, 0x58, 0x33,
+	0x6B, 0x4F, 0x9C, 0x64, 0x55, 0x15, 0x3A, 0xC0,
+	0x40, 0xA8, 0x47, 0xFB, 0x64, 0x7F, 0xBB, 0x6B,
+	0x55, 0x2A, 0x40, 0x00, 0x71, 0xFE, 0x17, 0x72,
+	0x48, 0x5B, 0x7A, 0x9D, 0x1F, 0x0D, 0x14, 0x7B,
+	0xF3, 0x38, 0x8C, 0x56, 0x54, 0x71, 0xE4, 0xE6,
+	0x2C, 0xC3, 0xCE, 0x0D, 0x0C, 0x0F, 0xC3, 0x60,
+	0xDF, 0x92, 0x89, 0xED, 0x99, 0x18, 0x37, 0x6B,
+	0x8B, 0x8B, 0x93, 0x14, 0x50, 0x47, 0xF8, 0xFE,
+	0xA2, 0x98, 0x60, 0x07, 0xC2, 0xAA, 0x89, 0x92,
+	0x2F, 0x69, 0xEB, 0x47, 0x5B, 0x59, 0x7B, 0x2B,
+	0xBA, 0x23, 0x7B, 0x9C, 0x84, 0x2E, 0x3F, 0xF1,
+	0xD3, 0x25, 0xE8, 0x2A, 0x1F, 0x23, 0xE9, 0x49,
+	0x89, 0xD0, 0x06, 0xBC, 0x7C, 0xE4, 0x94, 0x6F,
+	0x2E, 0x8B, 0x77, 0xE1, 0x08, 0x48, 0x46, 0x3C,
+	0x47, 0xFE, 0x7B, 0x20, 0x9E, 0x2A, 0x61, 0x7D,
+	0xDD, 0x41, 0x79, 0x6A, 0xE6, 0x14, 0x5E, 0x70,
+	0x9C, 0xDA, 0x94, 0x06, 0xF2, 0x26, 0x12, 0x57,
+	0xC2, 0x13, 0xB4, 0xB3, 0x0D, 0xA3, 0x0A, 0xC2,
+	0x5B, 0x0D, 0x06, 0xCF, 0x79, 0xA8, 0x12, 0xC5,
+	0xFC, 0xB0, 0xEF, 0x11, 0xD9, 0xFE, 0xDF, 0xE0,
+	0x99, 0x4A, 0xFE, 0x3B, 0x69, 0xB0, 0x6A, 0x29,
+	0x16, 0xCF, 0x69, 0x2B, 0x9D, 0xA7, 0x60, 0x28,
+	0xE5, 0xF3, 0xA0, 0x48, 0x79, 0xE6, 0x96, 0xD2,
+	0x1F, 0x73, 0x5C, 0x37, 0x83, 0x15, 0x36, 0x4D,
+	0xB0, 0xA4, 0xE0, 0xAB, 0x6B, 0x53, 0xD3, 0x1E,
+	0xFA, 0xF3, 0x0D, 0x65, 0xE3, 0x7A, 0x1B, 0x6A,
+	0x77, 0x04, 0x6F, 0x04, 0xC6, 0x4B, 0xA1, 0x07,
+	0x2A, 0x97, 0x80, 0xE0, 0xC5, 0x66, 0xC9, 0x43,
+	0x39, 0xA4, 0xD1, 0x9D, 0x00, 0x68, 0xC5, 0x7D,
+	0x6E, 0x6F, 0x0B, 0x51, 0x2D, 0xB7, 0x13, 0x4A,
+	0x95, 0x0E, 0xAF, 0x4F, 0x7B, 0x01, 0xA5, 0xFD,
+	0xD0, 0x65, 0xB9, 0x1B, 0xFA, 0x29, 0xE4, 0x42,
+	0x36, 0x79, 0xCD, 0xE7, 0x4B, 0xC6, 0xA8, 0xF1,
+	0xC8, 0x4C, 0x4D, 0xF7, 0x83, 0x87, 0x23, 0x1D,
+	0xC8, 0x5C, 0xE3, 0x26, 0x70, 0x44, 0x59, 0x03,
+	0xC4, 0xBE, 0xBE, 0xE3, 0xF5, 0x0C, 0x43, 0xE5,
+	0x04, 0x49, 0x49, 0x69, 0x11, 0xAA, 0x93, 0xE7,
+	0xE3, 0x95, 0x78, 0x74, 0x14, 0xD3, 0x17, 0x68,
+	0xD9, 0x91, 0x25, 0x20, 0xF8, 0x3C, 0x02, 0xFF,
+	0x01, 0x12, 0x4D, 0xCF, 0x0E, 0x12, 0x5F, 0xAF,
+	0xD5, 0xB9, 0xD7, 0xE7, 0xDD, 0xA4, 0xF5, 0xB5,
+	0x0C, 0x70, 0xAE, 0xBB, 0x85, 0x99, 0xA2, 0xE4,
+	0x47, 0x6A, 0x0D, 0xE5, 0x31, 0xB0, 0x40, 0x26,
+	0x72, 0xDF, 0x75, 0x75, 0x14, 0x2D, 0x86, 0x01,
+	0x60, 0x5C, 0x94, 0x01, 0x79, 0x23, 0xF6, 0x4A,
+	0xC5, 0x77, 0xC4, 0xBE, 0xD8, 0xD8, 0xE8, 0x9A,
+	0x74, 0xCA, 0x9F, 0x38, 0x19, 0xCB, 0xF1, 0x42,
+	0xA7, 0x2D, 0xEB, 0xE7, 0x7C, 0x4E, 0xFB, 0x71,
+	0x27, 0xE2, 0xD8, 0xC1, 0xB7, 0xBF, 0xB6, 0x42,
+	0x86, 0xC0, 0xBD, 0x52, 0x23, 0x3F, 0x43, 0xC6,
+	0x7D, 0x57, 0x17, 0xF9, 0x7A, 0xD8, 0x28, 0x54,
+	0x87, 0x3D, 0xDC, 0x7F, 0x71, 0xD6, 0x56, 0xAA,
+	0xA6, 0xEF, 0x70, 0x70, 0x60, 0xAF, 0x28, 0x0B,
+	0x9F, 0x45, 0x4B, 0x4F, 0xED, 0xB4, 0x77, 0x6E,
+	0x83, 0xB2, 0xFD, 0xBA, 0x20, 0xA4, 0x5A, 0xEF,
+	0xEB, 0x54, 0x9A, 0x1E, 0xD0, 0x38, 0x20, 0x21,
+	0x89, 0x3C, 0xA9, 0xA6, 0xE7, 0x4C, 0xCC, 0x30,
+	0xA2, 0x55, 0x39, 0x37, 0xCC, 0xEF, 0x34, 0x38,
+	0x99, 0xB5, 0x02, 0xCF, 0x46, 0xDD, 0xB8, 0xDD,
+	0x1D, 0x95, 0xFE, 0xFB, 0x60, 0xC9, 0xB2, 0x04,
+	0x69, 0xA1, 0x50, 0x3B, 0x2A, 0x68, 0x75, 0x87,
+	0x83, 0x0D, 0x33, 0xCE, 0xE9, 0xA7, 0x2D, 0x79,
+	0x8F, 0xCF, 0x4A, 0x9B, 0x45, 0x2C, 0x85, 0x49,
+	0xF5, 0x59, 0xC5, 0xD9, 0xFC, 0x6B, 0xFE, 0x08,
+	0x3F, 0x44, 0x6C, 0x2D, 0x90, 0x39, 0x81, 0xD9,
+	0xF2, 0x64, 0x92, 0x48, 0x3A, 0xB4, 0x52, 0xEA,
+	0x5B, 0xB1, 0x00, 0x8F, 0xFE, 0xAC, 0x97, 0x5D,
+	0xA0, 0x27, 0x59, 0x59, 0x3E, 0x7E, 0x06, 0x63,
+	0x61, 0x07, 0x3A, 0x83, 0xB2, 0x7B, 0x53, 0x1A,
+	0x3D, 0x0D, 0xDA, 0x51, 0x7C, 0xA9, 0x90, 0xEA,
+	0x32, 0x35, 0xD1, 0xD7, 0xB5, 0xE0, 0x9D, 0xA5,
+	0xF0, 0x2D, 0xC1, 0x52, 0x5B, 0x1D, 0xA6, 0x85,
+	0x96, 0x5B, 0x54, 0xFC, 0x2A, 0x3A, 0x73, 0xA1,
+	0x79, 0x0E, 0x0E, 0xFB, 0x69, 0xE7, 0x0A, 0x78,
+	0xFA, 0x55, 0x03, 0x44, 0xEA, 0x8C, 0x75, 0x3D,
+	0xBF, 0x18, 0x63, 0x9B, 0xAA, 0x8C, 0xB1, 0x25,
+	0x9A, 0xA7, 0x4F, 0x68, 0xF9, 0x2A, 0xBA, 0x80,
+	0x07, 0xC6, 0x18, 0xCC, 0xB6, 0xF5, 0x06, 0x9F,
+	0xF4, 0x6B, 0x97, 0x51, 0xBB, 0xFF, 0xF3, 0x7D,
+	0xF3, 0x21, 0x36, 0x0F, 0x0F, 0x5C, 0x0E, 0x7F,
+	0x56, 0x26, 0xDD, 0x12, 0x9A, 0xE3, 0xAE, 0x2A,
+	0x7C, 0x56, 0xCD, 0xB6, 0x11, 0xED, 0xA4, 0xC9,
+	0x8F, 0xEC, 0x83, 0x16, 0x3C, 0xD5, 0x11, 0x68,
+	0x78, 0xC1, 0xA9, 0x3E, 0xBA, 0xA2, 0x6D, 0xB4,
+	0x05, 0xEA, 0xF4, 0xA7, 0xAB, 0xA2, 0x77, 0x83,
+	0x7D, 0xE9, 0xA5, 0x15, 0x04, 0x70, 0x76, 0x24,
+	0xEF, 0x2E, 0x1B, 0xBB, 0xCA, 0x29, 0x24, 0x11,
+	0x16, 0x7F, 0x2E, 0x3D, 0x39, 0x0C, 0x0E, 0x51,
+	0xF8, 0x4A, 0x2F, 0x13, 0x83, 0x90, 0xE3, 0x3F,
+	0x85, 0x83, 0x5D, 0x38, 0xA9, 0x4D, 0xBB, 0xE7,
+	0x1E, 0x6C, 0x82, 0x1E, 0x86, 0xB1, 0x1F, 0xFD,
+	0x89, 0xEF, 0xF4, 0xBF, 0xE2, 0x08, 0xD6, 0x00,
+	0x5D, 0x28, 0xF7, 0x04, 0xBA, 0xEA, 0xD1, 0xF2,
+	0x5D, 0xE0, 0xEB, 0x24, 0x1B, 0x18, 0xFC, 0x7F,
+	0xA0, 0xDD, 0xD9, 0x0D, 0xC1, 0x39, 0xBE, 0x7F,
+	0xCB, 0xEB, 0x97, 0x30, 0xFA, 0xE4, 0xB5, 0xD1,
+	0x72, 0x70, 0xCE, 0x4C, 0x67, 0x0C, 0x42, 0x57,
+	0x0A, 0x9C, 0xF2, 0x5B, 0xC4, 0xFA, 0xE5, 0xCD,
+	0x31, 0xE5, 0xD5, 0x5A, 0xD0, 0x22, 0x6A, 0x94,
+	0xBE, 0x52, 0x94, 0x8C, 0x67, 0x02, 0xA9, 0x86,
+	0xA0, 0xAD, 0xBF, 0xCD, 0x3A, 0xC4, 0x82, 0xBB,
+	0x12, 0xAB, 0xBB, 0x79, 0xA2, 0xF6, 0x60, 0x28,
+	0x42, 0x15, 0x3B, 0x2F, 0x82, 0xA3, 0xB3, 0xCD,
+	0x16, 0x88, 0xE7, 0x4D, 0x36, 0x53, 0x4B, 0xFF,
+	0x8C, 0x48, 0xD3, 0xC4, 0x51, 0xEB, 0x2C, 0x5F,
+	0x98, 0xFE, 0xB9, 0xE7, 0x86, 0x4D, 0x60, 0xAF,
+	0x96, 0xE8, 0x3B, 0x21, 0x62, 0x46, 0x74, 0x82,
+	0xF0, 0x58, 0x63, 0x9C, 0x86, 0xA7, 0x85, 0xA9,
+	0xA1, 0xD4, 0xB6, 0x9B, 0xC3, 0x0E, 0x77, 0xA6,
+	0x4C, 0x3B, 0xBC, 0xD7, 0xDE, 0xB4, 0xE3, 0xD3,
+	0x0F, 0x1A, 0x67, 0x21, 0x20, 0x3D, 0x87, 0xA8,
+	0x8A, 0xB8, 0x5E, 0x02, 0x7A, 0x97, 0x42, 0xFC,
+	0x68, 0x8F, 0x0A, 0xDF, 0x15, 0x72, 0x8E, 0x59,
+	0x7E, 0x91, 0x0C, 0xFE, 0x5D, 0xF3, 0x3C, 0x56,
+	0xA1, 0x36, 0xEF, 0x39, 0xC7, 0xCA, 0x5D, 0x65,
+	0x0C, 0x2B, 0x9F, 0x90, 0x1C, 0x9B, 0x89, 0xE1,
+	0xE0, 0x93, 0x54, 0x93, 0x61, 0xF3, 0x03, 0xBE,
+	0x88, 0x39, 0xD1, 0x45, 0x4C, 0xCE, 0xB5, 0xFB,
+	0xC4, 0x43, 0x5F, 0xA0, 0xDA, 0xB5, 0x8A, 0x8F,
+	0xC2, 0x85, 0x36, 0x0E, 0xEA, 0x49, 0x1C, 0xA0,
+	0x77, 0x96, 0x1C, 0x4A, 0xAA, 0x3E, 0x96, 0xDE,
+	0x99, 0x71, 0xB9, 0x4F, 0xDF, 0xA5, 0x20, 0x7C,
+	0xCF, 0x0D, 0x9D, 0xAB, 0x2C, 0x48, 0x96, 0xF0,
+	0x7E, 0xB6, 0x77, 0x1A, 0x38, 0x3C, 0x65, 0x12,
+	0xF4, 0x1E, 0xA2, 0x8D, 0xEE, 0xE4, 0x07, 0xFD,
+	0xAE, 0x3C, 0x57, 0x4F, 0x5D, 0x41, 0x6A, 0x89,
+	0x7A, 0x27, 0xEF, 0x7C, 0xF5, 0x96, 0xF0, 0x43,
+	0x2D, 0x62, 0x4A, 0x2C, 0x4E, 0xAC, 0xE5, 0x2F,
+	0x3C, 0xBF, 0x2C, 0x63, 0x31, 0xB8, 0x0C, 0x9C,
+	0x91, 0x65, 0xBF, 0x13, 0x34, 0x24, 0x69, 0x32,
+	0x02, 0x4E, 0xC0, 0xBE, 0x44, 0xB3, 0x21, 0x36,
+	0xB4, 0xE4, 0x34, 0x27, 0x91, 0x35, 0x85, 0x03,
+	0x64, 0xC7, 0x57, 0xF1, 0xDC, 0xFA, 0x63, 0x85,
+	0xE2, 0x56, 0x33, 0x12, 0xC5, 0xF5, 0x53, 0xF0,
+	0xC8, 0x44, 0xEA, 0xBB, 0x79, 0x11, 0xCE, 0xE7,
+	0x60, 0xCA, 0xEB, 0x3E, 0x19, 0x3B, 0xF3, 0xA9,
+	0xC3, 0x81, 0x14, 0x87, 0x23, 0x9A, 0xD2, 0xE0,
+	0x14, 0x78, 0xF4, 0x6E, 0x41, 0x8A, 0x5D, 0xE5,
+	0x6B, 0x7F, 0x17, 0x55, 0xBA, 0x68, 0xF9, 0xA3,
+	0x74, 0x61, 0x3B, 0x5D, 0xE2, 0xED, 0x26, 0xC5,
+	0x80, 0xC7, 0x72, 0xDB, 0xDB, 0xFA, 0xB1, 0xF7,
+	0xE3, 0xF5, 0x7D, 0x94, 0xF8, 0x4E, 0x30, 0xDE,
+	0xB2, 0x9D, 0x70, 0xA9, 0x1D, 0xF2, 0x88, 0xFC,
+	0x43, 0xA2, 0x76, 0xDF, 0xED, 0x58, 0xE2, 0xB0,
+	0xDB, 0x53, 0x83, 0xE5, 0x32, 0xB6, 0xEE, 0xDF,
+	0xB3, 0x92, 0xE4, 0x3D, 0xC3, 0xDA, 0x72, 0x01,
+	0xA0, 0x68, 0xF5, 0x23, 0x1E, 0xE5, 0x22, 0x09,
+	0x8D, 0x68, 0x59, 0xB2, 0xD5, 0x64, 0x63, 0xA8,
+	0x91, 0x7B, 0x3C, 0x25, 0x61, 0x65, 0x79, 0x66,
+	0xDB, 0xC4, 0x78, 0x56, 0xB6, 0xFF, 0xC8, 0x2B,
+	0xCC, 0x37, 0x9F, 0xFD, 0x08, 0xB2, 0x59, 0xF3,
+	0xD9, 0xD7, 0x87, 0x3B, 0xA8, 0xFC, 0xBE, 0x4C,
+	0x94, 0x13, 0xB6, 0x01, 0x15, 0x91, 0x60, 0x70,
+	0x1D, 0xF0, 0x04, 0x70, 0xB1, 0x49, 0xBD, 0xF3,
+	0x2F, 0x4D, 0x3C, 0xFC, 0xFB, 0x9D, 0xEB, 0xC7,
+	0x72, 0x41, 0x71, 0x7D, 0x13, 0x06, 0x7A, 0xAE,
+	0xD2, 0x3C, 0x7A, 0x26, 0x51, 0x18, 0x51, 0x69,
+	0xF1, 0x26, 0x70, 0x61, 0xFB, 0x6B, 0x30, 0xE4,
+	0xFE, 0xA7, 0x3F, 0x66, 0xF4, 0xF9, 0x27, 0x56,
+	0xAC, 0x26, 0x23, 0x41, 0x8A, 0xF8, 0xB2, 0xA3,
+	0x98, 0x71, 0x1B, 0x7C, 0x68, 0x07, 0xB4, 0x34,
+	0x25, 0xE1, 0xD9, 0x9B, 0xFD, 0xCD, 0x5D, 0xF5,
+	0x31, 0x95, 0x28, 0x79, 0x06, 0xA3, 0x32, 0xF5,
+	0x99, 0x71, 0xA0, 0xC3, 0x43, 0x97, 0x5F, 0xC3,
+	0x20, 0xAD, 0x13, 0x7C, 0x9E, 0x34, 0xCE, 0x7C,
+	0xE8, 0x55, 0x20, 0xB2, 0x6C, 0xA1, 0x97, 0xA1,
+	0xFA, 0x2D, 0xF2, 0xEC, 0xD4, 0xE3, 0xFA, 0x83,
+	0x3B, 0x3B, 0xD2, 0xC2, 0x44, 0x82, 0x80, 0x42,
+	0x52, 0xCF, 0x1D, 0xF6, 0xAD, 0xC6, 0x39, 0x8F,
+	0x35, 0xE9, 0x8A, 0xB1, 0x87, 0x10, 0x40, 0x76,
+	0x80, 0xC9, 0xC1, 0xDB, 0xAC, 0x8C, 0x7E, 0xDC,
+	0x86, 0x46, 0xB9, 0x70, 0x82, 0xE2, 0xE1, 0x21,
+	0xFA, 0xA7, 0xFA, 0xC2, 0x1E, 0x4A, 0x33, 0x83,
+	0x84, 0xCB, 0x92, 0x20, 0x2C, 0x61, 0xBD, 0x12,
+	0x6C, 0x5D, 0xDD, 0x45, 0x8B, 0x32, 0x7A, 0x18,
+	0xBD, 0x71, 0x6F, 0x14, 0x2C, 0xA5, 0xCD, 0xB3,
+	0xE4, 0x9D, 0x7E, 0xB8, 0xD9, 0x62, 0xB5, 0xB8,
+	0x5A, 0x88, 0xF7, 0x99, 0xB6, 0x9A, 0x6A, 0x66,
+	0xC7, 0xBD, 0x62, 0x9F, 0x56, 0xB4, 0x3C, 0x02,
+	0x90, 0x62, 0x9B, 0x5E, 0x27, 0x4C, 0xDE, 0xC7,
+	0xA0, 0x72, 0x29, 0xE7, 0x93, 0x9A, 0x77, 0xD3,
+	0x2E, 0x8E, 0xF7, 0x30, 0xFC, 0xCE, 0xAD, 0x9C,
+	0x4E, 0x06, 0x77, 0xA8, 0x3A, 0x03, 0x30, 0xAB,
+	0x76, 0x5D, 0x33, 0x6D, 0xD2, 0xAA, 0x15, 0x5D,
+	0xCD, 0x2A, 0xC7, 0xF3, 0x15, 0x29, 0x77, 0x4F,
+	0x49, 0x36, 0xB0, 0x5D, 0x0B, 0x14, 0xB4, 0x8F,
+	0xAA, 0x1E, 0x8C, 0xD4, 0x50, 0x56, 0xE5, 0x6C,
+	0x13, 0x9B, 0x17, 0xF8, 0x90, 0x71, 0x5A, 0xD6,
+	0x3D, 0x6C, 0x4A, 0x9F, 0x2D, 0x97, 0x6C, 0x8B,
+	0x63, 0x5B, 0xDF, 0xE5, 0x86, 0x02, 0x81, 0x6F,
+	0x61, 0x2C, 0x6E, 0x4B, 0x22, 0x53, 0x67, 0xCB,
+	0x9A, 0x7B, 0xB7, 0x9C, 0x01, 0x8F, 0x1B, 0x8C,
+	0x53, 0x15, 0x18, 0x0A, 0xAD, 0xBE, 0x3A, 0xB7,
+	0x5A, 0xC3, 0x56, 0x20, 0x6F, 0xE2, 0x7C, 0x12,
+	0xDF, 0x3B, 0x56, 0x97, 0x84, 0xE3, 0xA5, 0x38,
+	0xFB, 0x05, 0x24, 0x18, 0x26, 0x6E, 0x72, 0xDB,
+	0x40, 0x0D, 0x6F, 0x32, 0xC4, 0x29, 0x7F, 0x34,
+	0xF9, 0xF1, 0xAF, 0x18, 0x6C, 0x37, 0x65, 0x65,
+	0x5F, 0x11, 0xB3, 0xE5, 0xA3, 0xC8, 0x04, 0x9B,
+	0x7D, 0xF1, 0x40, 0x11, 0xFF, 0x21, 0x5F, 0xBF,
+	0x17, 0xBF, 0x89, 0xEE, 0x97, 0x6C, 0xF0, 0xDB,
+	0xAB, 0x62, 0x70, 0x10, 0x4E, 0x7E, 0x31, 0x9D,
+	0x1F, 0x64, 0xC5, 0x9E, 0x20, 0x9E, 0x35, 0x82,
+};
+
+uint8_t mldsa_44_pubkey_noseed[] = {
+	0xBA, 0x71, 0xF9, 0xF6, 0x4E, 0x11, 0xBA, 0xEB,
+	0x58, 0xFA, 0x9C, 0x6F, 0xBB, 0x6E, 0x14, 0xE6,
+	0x1F, 0x18, 0x64, 0x3D, 0xAB, 0x49, 0x5B, 0x47,
+	0x53, 0x9A, 0x91, 0x66, 0xCA, 0x01, 0x98, 0x13,
+	0x1C, 0x44, 0xF8, 0x26, 0xBB, 0xD5, 0x6E, 0x34,
+	0xE5, 0x5D, 0xB5, 0xE5, 0xE2, 0xD7, 0x33, 0x48,
+	0x5E, 0x39, 0xEA, 0x26, 0x0F, 0xC6, 0x00, 0x0C,
+	0x5E, 0xA4, 0xBA, 0x80, 0xD3, 0x45, 0x5C, 0xDE,
+	0x53, 0xB4, 0x6F, 0x34, 0x48, 0x2A, 0xED, 0xFD,
+	0x54, 0x50, 0xFC, 0x2E, 0x1B, 0xA4, 0xF2, 0x5D,
+	0x15, 0xF9, 0xC1, 0x44, 0x24, 0x2F, 0xB3, 0x9B,
+	0xB5, 0x22, 0x87, 0x18, 0x90, 0x30, 0xC5, 0x04,
+	0x98, 0xE1, 0x71, 0x7B, 0x7C, 0x75, 0x8B, 0x19,
+	0x0A, 0x67, 0x48, 0xEA, 0x9A, 0xA3, 0xF7, 0xAC,
+	0xAA, 0xF2, 0xC7, 0xCB, 0x52, 0x6E, 0xD7, 0x17,
+	0xC9, 0xF7, 0x9A, 0xEB, 0x84, 0x21, 0x4F, 0xA5,
+	0xCD, 0x8D, 0xED, 0x92, 0xA0, 0xC3, 0xFA, 0x15,
+	0x58, 0x81, 0x0F, 0x12, 0xC7, 0x05, 0x0A, 0x36,
+	0x77, 0x08, 0xD1, 0x96, 0xCD, 0x24, 0xE5, 0xAF,
+	0x97, 0x49, 0x04, 0xAE, 0xD8, 0xE4, 0xCE, 0x88,
+	0x72, 0xE8, 0x69, 0x6B, 0x0B, 0x7B, 0xCA, 0x50,
+	0xE4, 0x52, 0xCD, 0x7D, 0x30, 0xEA, 0x9A, 0x4A,
+	0xDA, 0xC0, 0x31, 0x1D, 0x67, 0x2C, 0x6B, 0xDE,
+	0x84, 0x96, 0x24, 0x0B, 0x07, 0x43, 0x14, 0x63,
+	0x70, 0x88, 0x95, 0xCD, 0x9B, 0xAF, 0xC3, 0x16,
+	0x32, 0xD7, 0x39, 0x76, 0x49, 0x38, 0x8F, 0xDA,
+	0xFC, 0xBF, 0x7D, 0x30, 0x5A, 0x3D, 0xE9, 0xA4,
+	0x95, 0xEC, 0xA7, 0x43, 0x3A, 0x8F, 0x83, 0xBA,
+	0x0F, 0x0B, 0x25, 0xC4, 0x13, 0xC6, 0xE3, 0x9C,
+	0x96, 0xEB, 0x7D, 0x69, 0x1B, 0x34, 0xD3, 0x7C,
+	0xE3, 0x7F, 0x1E, 0xEA, 0xD1, 0xCF, 0x21, 0x7E,
+	0x25, 0xEF, 0x34, 0xEE, 0xCF, 0x3F, 0x7C, 0x60,
+	0xF8, 0x4B, 0x8E, 0xDF, 0xDD, 0xE8, 0x40, 0x5D,
+	0x4F, 0x83, 0x25, 0x76, 0xC6, 0x1E, 0xF9, 0x8E,
+	0x0A, 0x2F, 0x28, 0xDA, 0x18, 0x77, 0x00, 0x95,
+	0x39, 0x24, 0xF6, 0x86, 0xB9, 0x46, 0x14, 0x70,
+	0x5B, 0xCF, 0x53, 0xD3, 0x3F, 0xED, 0xD4, 0x34,
+	0x8E, 0xDD, 0xDB, 0xDF, 0x28, 0xB5, 0x06, 0x5E,
+	0x1F, 0x20, 0x77, 0x50, 0x43, 0xE8, 0x5C, 0xF9,
+	0x31, 0xF8, 0x29, 0x17, 0x93, 0x63, 0xA1, 0xA7,
+	0xE7, 0x40, 0x4A, 0x83, 0x8E, 0xC0, 0x00, 0x86,
+	0xB0, 0x97, 0x63, 0x86, 0xFE, 0x63, 0x7C, 0x98,
+	0x24, 0x47, 0x57, 0xE3, 0xF7, 0x69, 0xDD, 0xD4,
+	0x46, 0x74, 0x71, 0xBF, 0xAD, 0x67, 0x0F, 0x9A,
+	0x05, 0xF8, 0x24, 0x6E, 0xE5, 0x0A, 0x7B, 0x1E,
+	0xAF, 0x87, 0xFC, 0x40, 0x69, 0xC3, 0xAE, 0x2A,
+	0xA2, 0x03, 0x32, 0x58, 0x11, 0x77, 0x92, 0xF0,
+	0xBC, 0xD4, 0x9E, 0x08, 0x3F, 0xD1, 0xBC, 0x74,
+	0x96, 0xAB, 0xFF, 0x29, 0xCC, 0x94, 0xE4, 0x86,
+	0x8B, 0x21, 0x21, 0x4E, 0xD3, 0x16, 0x52, 0x53,
+	0x99, 0xA6, 0x10, 0xFB, 0xDD, 0x4A, 0x80, 0xE7,
+	0xC8, 0x07, 0x15, 0xF2, 0x95, 0x78, 0xE2, 0xA8,
+	0x4B, 0xB4, 0x0B, 0xDD, 0xDB, 0xD9, 0xF4, 0x7A,
+	0x11, 0xB6, 0xE7, 0xDA, 0x11, 0x8A, 0x1B, 0x65,
+	0x8D, 0x35, 0x9E, 0x8A, 0xEF, 0x55, 0xEB, 0x46,
+	0xB5, 0x37, 0x6B, 0x5B, 0x65, 0x59, 0x79, 0x98,
+	0x4A, 0x92, 0x2B, 0xEE, 0xBF, 0xC5, 0x9B, 0xCD,
+	0x60, 0x0D, 0x53, 0x09, 0xDC, 0xCD, 0x72, 0xDB,
+	0xF0, 0x78, 0x7D, 0xB8, 0xBA, 0x75, 0x7B, 0x53,
+	0x7C, 0x1E, 0xAF, 0xD5, 0xC0, 0xF5, 0x0E, 0xA4,
+	0xBC, 0x95, 0x83, 0x54, 0x9E, 0x28, 0x29, 0xA4,
+	0x2C, 0x28, 0xCA, 0xC2, 0x48, 0xC9, 0x6D, 0x78,
+	0x12, 0x4C, 0x47, 0x15, 0x9B, 0x18, 0xAE, 0xDD,
+	0x75, 0x4A, 0xBA, 0x17, 0xB1, 0x9D, 0x43, 0x0F,
+	0xB7, 0x8F, 0x63, 0x3E, 0xA9, 0xD2, 0x6F, 0x54,
+	0xA9, 0xBD, 0x50, 0xF8, 0xD8, 0xF6, 0xB7, 0x35,
+	0x94, 0xF8, 0x28, 0x97, 0x6E, 0x7E, 0xA0, 0x9C,
+	0x53, 0xBB, 0xB9, 0xF1, 0x1A, 0x56, 0xC9, 0x50,
+	0x7F, 0xB8, 0x9B, 0x9A, 0x5E, 0xBC, 0x03, 0x7A,
+	0x37, 0x26, 0x7A, 0x95, 0xF8, 0x5B, 0x8D, 0x64,
+	0xCA, 0x97, 0x19, 0x2B, 0x10, 0xA6, 0x6F, 0x41,
+	0x7B, 0x3F, 0x61, 0xFE, 0x9C, 0xA5, 0x71, 0x30,
+	0xA4, 0x8F, 0xD9, 0x25, 0xEA, 0xE2, 0xAB, 0x55,
+	0x02, 0xD5, 0x71, 0xC8, 0xA5, 0x19, 0x03, 0xC1,
+	0xD3, 0x98, 0xF4, 0xC1, 0xF7, 0x6A, 0x7E, 0x11,
+	0x74, 0x39, 0x76, 0xAF, 0xDB, 0xC6, 0x97, 0xF2,
+	0x30, 0x94, 0xA3, 0xCD, 0x76, 0x1F, 0xF9, 0x68,
+	0x5D, 0xE3, 0x2E, 0x09, 0xFB, 0x3C, 0x28, 0xAD,
+	0xD4, 0x53, 0x49, 0x03, 0x00, 0xBC, 0x7C, 0x89,
+	0xDC, 0x01, 0x78, 0x00, 0x96, 0x07, 0x17, 0x22,
+	0x94, 0x57, 0x75, 0xF2, 0x64, 0xE1, 0xB0, 0x62,
+	0x3B, 0xCF, 0x46, 0x19, 0xC7, 0x12, 0xC8, 0x38,
+	0x76, 0x12, 0x05, 0xD8, 0x76, 0x91, 0xB7, 0x5E,
+	0xF3, 0x60, 0x19, 0x6C, 0xBB, 0x9E, 0x9B, 0x92,
+	0xA0, 0xD4, 0xC4, 0xED, 0x62, 0x32, 0x6E, 0x50,
+	0x24, 0xD7, 0x75, 0x10, 0xB8, 0xEE, 0x2C, 0x74,
+	0x26, 0xCC, 0x22, 0xEA, 0xE2, 0x09, 0xDC, 0x9F,
+	0x13, 0xBD, 0xE6, 0xBF, 0x08, 0xF5, 0xE7, 0x18,
+	0x1B, 0xD3, 0xB4, 0x59, 0x45, 0x0B, 0x45, 0x1A,
+	0x51, 0x53, 0x9A, 0x71, 0x5C, 0x21, 0xD6, 0x7D,
+	0xD3, 0x30, 0xEB, 0x59, 0x70, 0xDB, 0x00, 0xD9,
+	0xED, 0xBF, 0xB2, 0x82, 0x2B, 0x03, 0x6F, 0xA1,
+	0x3B, 0xAF, 0xEB, 0x86, 0xD8, 0xDC, 0x78, 0x86,
+	0x6E, 0x3F, 0x8D, 0x43, 0xE5, 0x3D, 0x78, 0xCC,
+	0xA5, 0x59, 0x5A, 0x6F, 0xAF, 0x88, 0x6B, 0x5D,
+	0xC1, 0x12, 0xF1, 0xCF, 0x4A, 0xDC, 0xFA, 0x87,
+	0x58, 0x00, 0xD9, 0x0B, 0x48, 0x88, 0x3A, 0xF9,
+	0x73, 0x16, 0xFE, 0x15, 0x06, 0x87, 0x3F, 0xC1,
+	0x57, 0xE5, 0x70, 0xEA, 0xCB, 0xFD, 0x22, 0x28,
+	0x68, 0xD1, 0x42, 0x34, 0x10, 0x19, 0x66, 0xAF,
+	0xB6, 0xBF, 0x99, 0x40, 0x82, 0x92, 0x53, 0xA9,
+	0x53, 0xAD, 0xA8, 0x9F, 0xC7, 0x56, 0xB6, 0xA8,
+	0x49, 0xF7, 0x0A, 0xCB, 0x98, 0x38, 0xE6, 0x9F,
+	0xAA, 0x50, 0xBB, 0xA7, 0x5E, 0x3E, 0x89, 0xC2,
+	0xAD, 0xB5, 0x7E, 0x86, 0xD0, 0x88, 0xAB, 0x9B,
+	0x04, 0xA2, 0x8E, 0x67, 0x07, 0x09, 0x17, 0x22,
+	0x43, 0xEC, 0x5E, 0x00, 0x08, 0xA5, 0xCE, 0xAF,
+	0x3F, 0x87, 0x22, 0xF4, 0x87, 0x30, 0x25, 0x96,
+	0xFF, 0xD7, 0x55, 0xAD, 0x1B, 0x82, 0xA4, 0x9C,
+	0x34, 0xB3, 0x46, 0x95, 0x15, 0xB4, 0x6A, 0xA2,
+	0x90, 0xCD, 0x86, 0xEE, 0x38, 0xEA, 0x7A, 0x9B,
+	0xE3, 0xF1, 0x03, 0x61, 0x03, 0x35, 0xB5, 0x31,
+	0xCC, 0xA3, 0x33, 0xDD, 0xFE, 0x32, 0xB1, 0x45,
+	0x10, 0xF4, 0xB0, 0x7E, 0xF9, 0x5F, 0xC6, 0x68,
+	0x4E, 0x8C, 0x45, 0x4A, 0x92, 0xC1, 0x0D, 0xBB,
+	0x5D, 0x59, 0xC7, 0xA7, 0xC6, 0x3F, 0xB3, 0x05,
+	0xFE, 0x88, 0x19, 0x67, 0xD9, 0x9E, 0x66, 0x9E,
+	0xB6, 0x32, 0x84, 0x05, 0x82, 0x56, 0x0B, 0xB4,
+	0x03, 0x43, 0x1D, 0x40, 0xF7, 0x5A, 0x49, 0x54,
+	0x90, 0x84, 0x82, 0x27, 0x82, 0x92, 0x82, 0x1F,
+	0x4E, 0xA9, 0x1E, 0x42, 0xE7, 0x8F, 0xA4, 0x8C,
+	0xAE, 0xE3, 0xC8, 0x36, 0x14, 0x6D, 0xCF, 0xD7,
+	0x38, 0xD1, 0x17, 0xE9, 0x2E, 0x9A, 0x15, 0x13,
+	0x7D, 0x28, 0xE8, 0xE6, 0xA4, 0xB4, 0x62, 0x26,
+	0x50, 0xCB, 0x41, 0x35, 0x04, 0xCB, 0x3A, 0x33,
+	0x5D, 0x44, 0xBE, 0xEC, 0x57, 0x46, 0xC1, 0xC2,
+	0x94, 0xB1, 0xE8, 0xCB, 0x99, 0xCB, 0x60, 0x8D,
+	0x92, 0x8F, 0x8C, 0xE3, 0x56, 0x36, 0x32, 0xC5,
+	0x21, 0xF2, 0x3D, 0x13, 0xC6, 0x1A, 0x8F, 0x61,
+	0xC0, 0x1D, 0xF8, 0xC9, 0x6C, 0x73, 0x60, 0xDB,
+	0x4F, 0x3C, 0x68, 0xAA, 0x5D, 0x2F, 0xDD, 0x34,
+	0x2A, 0x62, 0xFF, 0x34, 0x59, 0xC1, 0x16, 0x38,
+	0x94, 0x21, 0xAB, 0x43, 0xE8, 0x58, 0x4C, 0x45,
+	0x88, 0x2B, 0x50, 0xE6, 0xE4, 0xE9, 0x6D, 0xB6,
+	0xF0, 0xB8, 0xFD, 0xE8, 0x90, 0xD5, 0xDB, 0xFA,
+	0xDC, 0xD8, 0x86, 0x90, 0xB4, 0x49, 0xE6, 0x42,
+	0x40, 0xDD, 0xB2, 0x02, 0x37, 0x47, 0xF3, 0x08,
+	0x36, 0x3E, 0x30, 0x1A, 0xA7, 0x77, 0x57, 0x16,
+	0x9F, 0xC6, 0x15, 0x06, 0x28, 0xD5, 0x92, 0x0B,
+	0x5A, 0xA1, 0xAB, 0x1C, 0x8C, 0xBF, 0x44, 0xCB,
+	0x00, 0xE0, 0x25, 0xD7, 0x87, 0x9D, 0x72, 0xB4,
+	0x79, 0xE3, 0xAF, 0x53, 0x11, 0xC7, 0x85, 0x72,
+	0x55, 0x90, 0xDA, 0x9C, 0x89, 0xB9, 0xFC, 0x3B,
+	0x84, 0x50, 0x76, 0x95, 0x54, 0xEB, 0x44, 0xD2,
+	0x03, 0xEB, 0xA2, 0xBB, 0xAE, 0xF9, 0xCA, 0xD2,
+	0x23, 0x70, 0x11, 0xC2, 0xEA, 0x44, 0xEF, 0xF0,
+	0x0F, 0x29, 0x9A, 0x48, 0xFF, 0xE2, 0x8C, 0xA9,
+	0x3D, 0xDF, 0x85, 0xF7, 0x66, 0x08, 0x24, 0x2E,
+	0xF8, 0xD6, 0xCC, 0x24, 0x61, 0x0A, 0x1E, 0x20,
+	0x78, 0xFC, 0xAC, 0x4F, 0x93, 0x85, 0xC3, 0x14,
+	0x90, 0x5E, 0xCA, 0xA8, 0x2E, 0x55, 0x39, 0x16,
+	0xD9, 0x4D, 0x1A, 0x7C, 0x1E, 0xC6, 0x52, 0xAA,
+	0x08, 0x89, 0x70, 0x83, 0xDA, 0xA2, 0xEB, 0xB1,
+	0x77, 0x5F, 0xBC, 0x47, 0x1A, 0xE2, 0x77, 0x77,
+	0xD7, 0x90, 0x4E, 0xA9, 0xF1, 0xB9, 0x2B, 0xCA,
+	0xC3, 0xD8, 0xA3, 0x15, 0x84, 0x26, 0x08, 0x7B,
+	0x64, 0x5B, 0x11, 0x08, 0xF0, 0xD6, 0x5F, 0xEC,
+	0x93, 0x78, 0x9C, 0x05, 0x37, 0x43, 0xCA, 0x14,
+	0xFD, 0x63, 0xD0, 0x5E, 0x98, 0xB6, 0x52, 0xDF,
+	0x2B, 0x9C, 0x2F, 0xF9, 0xCE, 0x05, 0xF1, 0x94,
+	0x07, 0x03, 0xFF, 0xB2, 0x73, 0xF8, 0x0E, 0x0E,
+	0x27, 0x32, 0xEC, 0xA9, 0x96, 0x0D, 0x98, 0x1B,
+	0x4C, 0xFD, 0x3B, 0x7B, 0xB8, 0x04, 0x5B, 0x3C,
+	0x38, 0x30, 0x54, 0x6B, 0x9D, 0xD8, 0xDB, 0x0D,
+};
+
+uint8_t mldsa_44_extmu[] = {
+	0x1B, 0x2A, 0xA5, 0xD5, 0xE3, 0xF3, 0xC1, 0xD4,
+	0x8D, 0x7C, 0xE6, 0x8F, 0xE9, 0xE3, 0xD1, 0xF5,
+	0x2E, 0x4B, 0x7C, 0xD6, 0x2A, 0xF4, 0x2E, 0xE5,
+	0x8F, 0xC3, 0xB1, 0xA4, 0xB9, 0xD1, 0x2C, 0x8B,
+	0x9E, 0x4D, 0x7A, 0xA9, 0x7C, 0xD3, 0xE6, 0x5A,
+	0xF4, 0x1B, 0x2A, 0xA5, 0xD5, 0xE3, 0xF3, 0xC1,
+	0xD4, 0x8D, 0x7C, 0xE6, 0x8F, 0xE9, 0xE3, 0xD1,
+	0xF5, 0x2E, 0x4B, 0x7C, 0xD6, 0x2A, 0xF4, 0x2E,
+};
+
+struct crypto_testsuite_mldsa_params mldsa_keygen_test_vectors[] = {
+	{
+		.name = "mldsa_44_keygen",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.seed = {
+			.data = mldsa_44_seed,
+			.length = sizeof(mldsa_44_seed),
+		},
+	},
+	{
+		.name = "mldsa_44_keygen (deterministic)",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.seed = {
+			.data = (uint8_t [32]) {0},
+			.length = 32,
+		},
+		.privkey = {
+			.data = mldsa_44_privkey_noseed,
+			.length = sizeof(mldsa_44_privkey_noseed),
+		},
+		.pubkey = {
+			.data = mldsa_44_pubkey_noseed,
+			.length = sizeof(mldsa_44_pubkey_noseed),
+		},
+	},
+};
+
+struct crypto_testsuite_mldsa_params mldsa_sign_test_vectors[] = {
+	{
+		.name = "mldsa_44_sign",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.hash = 0,
+		.seed = {
+			.data = mldsa_44_seed,
+			.length = sizeof(mldsa_44_seed),
+		},
+		.privkey = {
+			.data = mldsa_44_privkey,
+			.length = sizeof(mldsa_44_privkey),
+		},
+		.pubkey = {
+			.data = mldsa_44_pubkey,
+			.length = sizeof(mldsa_44_pubkey),
+		},
+		.message = {
+			.data = mldsa_44_message,
+			.length = sizeof(mldsa_44_message),
+		},
+		.context = {
+			.data = NULL,
+			.length = 0,
+		},
+		.mu = {
+			.data = NULL,
+			.length = 0,
+		},
+		.sign = {
+			.data = mldsa_44_sign,
+			.length = sizeof(mldsa_44_sign),
+		},
+		.sign_deterministic = false,
+	},
+	{
+		.name = "mldsa_44_sign (deterministic)",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.hash = 0,
+		.seed = {
+			.data = (uint8_t [32]) {0},
+			.length = 32,
+		},
+		.privkey = {
+			.data = mldsa_44_privkey_noseed,
+			.length = sizeof(mldsa_44_privkey_noseed),
+		},
+		.pubkey = {
+			.data = mldsa_44_pubkey_noseed,
+			.length = sizeof(mldsa_44_pubkey_noseed),
+		},
+		.message = {
+			.data = mldsa_44_message,
+			.length = sizeof(mldsa_44_message),
+		},
+		.context = {
+			.data = NULL,
+			.length = 0,
+		},
+		.mu = {
+			.data = NULL,
+			.length = 0,
+		},
+		.sign = {
+			.data = mldsa_44_sign_dtrm,
+			.length = sizeof(mldsa_44_sign_dtrm),
+		},
+		.sign_deterministic = true,
+	},
+	{
+		.name = "mldsa_44_sign (sha3_256)",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.hash = RTE_CRYPTO_AUTH_SHA3_256,
+		.seed = {
+			.data = mldsa_44_seed,
+			.length = sizeof(mldsa_44_seed),
+		},
+		.privkey = {
+			.data = mldsa_44_privkey,
+			.length = sizeof(mldsa_44_privkey),
+		},
+		.pubkey = {
+			.data = mldsa_44_pubkey,
+			.length = sizeof(mldsa_44_pubkey),
+		},
+		.message = {
+			.data = mldsa_44_message,
+			.length = sizeof(mldsa_44_message),
+		},
+		.context = {
+			.data = NULL,
+			.length = 0,
+		},
+		.mu = {
+			.data = NULL,
+			.length = 0,
+		},
+		.sign = {
+			.data = mldsa_44_sign,
+			.length = sizeof(mldsa_44_sign),
+		},
+		.sign_deterministic = false,
+	},
+	{
+		.name = "mldsa_44_sign (ext mu)",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.hash = 0,
+		.seed = {
+			.data = (uint8_t [32]) {0},
+			.length = 32,
+		},
+		.privkey = {
+			.data = mldsa_44_privkey_noseed,
+			.length = sizeof(mldsa_44_privkey_noseed),
+		},
+		.pubkey = {
+			.data = mldsa_44_pubkey_noseed,
+			.length = sizeof(mldsa_44_pubkey_noseed),
+		},
+		.mu = {
+			.data = mldsa_44_extmu,
+			.length = sizeof(mldsa_44_extmu),
+		},
+		.sign = {
+			.data = mldsa_44_sign_dtrm,
+			.length = sizeof(mldsa_44_sign_dtrm),
+		},
+		.sign_deterministic = false,
+	},
+};
+
+struct crypto_testsuite_mldsa_params mldsa_verify_test_vectors[] = {
+	{
+		.name = "mldsa_44_verify",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.pubkey = {
+			.data = mldsa_44_pubkey,
+			.length = sizeof(mldsa_44_pubkey),
+		},
+		.message = {
+			.data = mldsa_44_message,
+			.length = sizeof(mldsa_44_message),
+		},
+		.context = {
+			.data = NULL,
+			.length = 0,
+		},
+		.mu = {
+			.data = NULL,
+			.length = 0,
+		},
+		.sign = {
+			.data = mldsa_44_sign,
+			.length = sizeof(mldsa_44_sign),
+		},
+	},
+	{
+		.name = "mldsa_44_verify (deterministic)",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.pubkey = {
+			.data = mldsa_44_pubkey_noseed,
+			.length = sizeof(mldsa_44_pubkey_noseed),
+		},
+		.message = {
+			.data = mldsa_44_message,
+			.length = sizeof(mldsa_44_message),
+		},
+		.context = {
+			.data = NULL,
+			.length = 0,
+		},
+		.mu = {
+			.data = NULL,
+			.length = 0,
+		},
+		.sign = {
+			.data = mldsa_44_sign_dtrm,
+			.length = sizeof(mldsa_44_sign_dtrm),
+		},
+	}
+};
+#endif /* __TEST_CRYPTODEV_ML_DSA_TEST_VECTORS_H__ */
diff --git a/app/test/test_cryptodev_ml_kem_test_vectors.h b/app/test/test_cryptodev_ml_kem_test_vectors.h
new file mode 100644
index 0000000000..7de98ec089
--- /dev/null
+++ b/app/test/test_cryptodev_ml_kem_test_vectors.h
@@ -0,0 +1,873 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2025 Marvell.
+ */
+
+#ifndef __TEST_CRYPTODEV_ML_KEM_TEST_VECTORS_H__
+#define __TEST_CRYPTODEV_ML_KEM_TEST_VECTORS_H__
+
+#include "rte_crypto_asym.h"
+
+struct crypto_testsuite_mlkem_params {
+	const char *name;
+	enum rte_crypto_ml_kem_param_set param;
+	rte_crypto_param d;
+	rte_crypto_param z;
+	rte_crypto_param dk;
+	rte_crypto_param ek;
+	rte_crypto_param sk;
+	rte_crypto_param message;
+	rte_crypto_param cipher;
+};
+
+/* Seed */
+uint8_t mlkem_512_d[] = {
+	0x4d, 0x3f, 0xb3, 0x37, 0xd3, 0xec, 0x8f, 0x29,
+	0xf9, 0x7b, 0x0e, 0xd6, 0x5b, 0x85, 0x78, 0xc5,
+	0x31, 0x37, 0x21, 0x9a, 0x14, 0x64, 0xc6, 0x1c,
+	0xc7, 0xd7, 0x45, 0x57, 0x06, 0x5b, 0x45, 0x96,
+};
+
+uint8_t mlkem_512_z[] = {
+	0xdf, 0x29, 0x92, 0x4a, 0x81, 0x76, 0x4f, 0x4d,
+	0x5a, 0x64, 0x79, 0xf2, 0x8b, 0xc8, 0x3b, 0xc9,
+	0xf3, 0x35, 0xc7, 0x18, 0xcb, 0xb1, 0xa8, 0xd2,
+	0x24, 0xdb, 0x4d, 0x6a, 0x6a, 0xf1, 0xeb, 0xd2,
+};
+
+/* Private key */
+uint8_t mlkem_512_dk[] = {
+	0xd8, 0xc8, 0x4d, 0x74, 0x57, 0x6d, 0x43, 0x65,
+	0x84, 0xe0, 0x82, 0x87, 0x2d, 0xd0, 0x0b, 0x39,
+	0x08, 0x41, 0xc8, 0x85, 0x15, 0x26, 0xfb, 0x85,
+	0x68, 0xe1, 0x30, 0x98, 0xf0, 0xb1, 0x3d, 0xea,
+	0xa5, 0x4c, 0xc4, 0x59, 0x81, 0xfb, 0x33, 0xed,
+	0x20, 0x3a, 0x7f, 0x10, 0x82, 0x3d, 0x85, 0x18,
+	0x69, 0x56, 0x6b, 0x5b, 0x7c, 0x92, 0x0f, 0x57,
+	0x37, 0xf2, 0x93, 0x38, 0x24, 0xd3, 0x1e, 0xe1,
+	0x84, 0x16, 0x39, 0x9a, 0x0d, 0xbd, 0xba, 0x22,
+	0xaa, 0xc8, 0xa1, 0xd9, 0xd8, 0x2a, 0xc7, 0xc1,
+	0x78, 0x21, 0x01, 0x85, 0x38, 0x54, 0x39, 0x34,
+	0x25, 0x8c, 0xce, 0xda, 0xa3, 0x0c, 0x66, 0x99,
+	0x39, 0xf7, 0x63, 0xb6, 0x86, 0x80, 0xe0, 0xe4,
+	0x64, 0x2a, 0xfc, 0xc2, 0xe0, 0x71, 0x6c, 0x59,
+	0x7c, 0x9a, 0x03, 0xac, 0x6f, 0x16, 0x08, 0x64,
+	0x3d, 0x4b, 0xa5, 0x83, 0xc5, 0x34, 0x27, 0x2a,
+	0x20, 0x18, 0xb8, 0x2d, 0x28, 0x61, 0x2a, 0x94,
+	0x55, 0xc7, 0xc3, 0x93, 0x91, 0x71, 0x43, 0x7f,
+	0x74, 0xb2, 0x6b, 0x55, 0xb1, 0x9d, 0xc8, 0x08,
+	0x53, 0xda, 0xb6, 0x19, 0x46, 0x5c, 0x20, 0xea,
+	0x31, 0x31, 0xfc, 0x41, 0x02, 0xe6, 0x3c, 0x3e,
+	0xd8, 0x68, 0x6f, 0xa6, 0x66, 0x1e, 0xc7, 0xc6,
+	0x0a, 0xf8, 0x02, 0x1e, 0x1e, 0xfa, 0x9a, 0x30,
+	0x18, 0x64, 0xdc, 0x30, 0x20, 0x9a, 0xb6, 0x6e,
+	0x85, 0xe8, 0xb0, 0xb3, 0xe1, 0x24, 0x4e, 0xf0,
+	0x4a, 0x9c, 0xb3, 0x0e, 0xe0, 0xd2, 0x6a, 0x6e,
+	0xc7, 0xc3, 0x15, 0x35, 0x49, 0x77, 0x07, 0x7e,
+	0x33, 0x7c, 0x97, 0x6e, 0xeb, 0xb3, 0x7c, 0x86,
+	0xb2, 0xa0, 0xe3, 0x8a, 0x13, 0x81, 0x99, 0xc6,
+	0x75, 0x41, 0xa6, 0x2a, 0x6f, 0x16, 0xe2, 0x4e,
+	0x52, 0x14, 0x0d, 0xcb, 0x74, 0x8d, 0xb4, 0x89,
+	0xcf, 0xa8, 0x4c, 0x57, 0xaa, 0x18, 0x7d, 0xd7,
+	0x19, 0x5c, 0x11, 0x04, 0xc6, 0xe2, 0x2c, 0x09,
+	0x4d, 0x78, 0x7e, 0x9e, 0x1a, 0xa2, 0xab, 0x60,
+	0x59, 0xe4, 0x30, 0xa5, 0x6d, 0x11, 0x63, 0xf9,
+	0xb1, 0xa0, 0x98, 0xe2, 0x81, 0x34, 0xa6, 0x57,
+	0xf7, 0x18, 0x3e, 0x4c, 0x36, 0x02, 0x4d, 0xda,
+	0x6e, 0xac, 0x39, 0x6c, 0x29, 0x0b, 0x8c, 0xd7,
+	0x32, 0x8e, 0x45, 0x67, 0x36, 0x41, 0x6c, 0xab,
+	0xbb, 0x04, 0x2e, 0xae, 0xd3, 0x9f, 0xee, 0xfa,
+	0x5f, 0x4a, 0x04, 0x85, 0xf7, 0xfb, 0x97, 0x95,
+	0x78, 0xc4, 0x08, 0x39, 0xb8, 0xc5, 0x17, 0x9d,
+	0x2e, 0x6c, 0x14, 0xcd, 0xf2, 0xc1, 0xc5, 0x05,
+	0x9d, 0x34, 0x12, 0xcd, 0x86, 0xbc, 0x9e, 0x1c,
+	0xf9, 0x1c, 0x05, 0xc2, 0xc3, 0x29, 0xf2, 0x9d,
+	0xf4, 0xa9, 0xcc, 0x0d, 0x38, 0xce, 0x6f, 0xb4,
+	0x06, 0x68, 0xc0, 0xcd, 0xb2, 0xb6, 0x5d, 0xdf,
+	0x89, 0x58, 0x99, 0x70, 0xbe, 0x37, 0xa8, 0xb2,
+	0xc3, 0x6c, 0x2c, 0x13, 0x8c, 0xa7, 0x8a, 0x38,
+	0x36, 0x36, 0xe0, 0x77, 0x79, 0xf6, 0x30, 0xc5,
+	0x9c, 0x8e, 0x10, 0xc0, 0x1b, 0xb4, 0xe0, 0x74,
+	0x36, 0x6c, 0x9f, 0x80, 0x73, 0x3e, 0x57, 0x69,
+	0x5a, 0x79, 0x6a, 0x44, 0xb8, 0xe8, 0x25, 0xbe,
+	0x96, 0xae, 0xd7, 0x87, 0x30, 0x7e, 0x76, 0x8e,
+	0x1c, 0x09, 0x99, 0xd9, 0x4c, 0xb3, 0xf7, 0x45,
+	0x92, 0xfa, 0x77, 0x9e, 0x18, 0x72, 0x1a, 0x23,
+	0x9c, 0x4e, 0x5e, 0xd9, 0x22, 0x2e, 0xb0, 0x16,
+	0x9d, 0x03, 0x6a, 0x0e, 0x49, 0x94, 0x97, 0xa3,
+	0x19, 0x94, 0xa1, 0x7e, 0x9d, 0x7b, 0x87, 0xc1,
+	0x6a, 0x12, 0x42, 0xc9, 0x22, 0xbe, 0xeb, 0x38,
+	0xbe, 0xfa, 0x0b, 0xac, 0x25, 0xb9, 0x78, 0xec,
+	0x33, 0xdf, 0x86, 0xcb, 0xce, 0xe1, 0xa6, 0x69,
+	0x28, 0x39, 0xd5, 0x68, 0x73, 0xcb, 0x8a, 0xcc,
+	0x3d, 0xfa, 0x0e, 0x79, 0x71, 0x3e, 0x44, 0x19,
+	0x9a, 0xac, 0xf4, 0x43, 0xa9, 0xba, 0x10, 0x7e,
+	0x49, 0xc8, 0x8f, 0xf9, 0xac, 0xd2, 0x07, 0xb1,
+	0x4b, 0x2b, 0x15, 0x65, 0x05, 0x12, 0xc3, 0xcc,
+	0x36, 0x69, 0x17, 0x78, 0xa3, 0x00, 0x6d, 0xb7,
+	0xe9, 0x03, 0x78, 0xb3, 0x33, 0xe5, 0xcc, 0x22,
+	0xc3, 0x91, 0x8f, 0x47, 0x79, 0xaf, 0x2e, 0x19,
+	0x91, 0x05, 0xab, 0x5e, 0x3e, 0x43, 0xa4, 0x34,
+	0x0b, 0x8c, 0x89, 0x75, 0xc0, 0x08, 0x44, 0x07,
+	0xdd, 0x17, 0x83, 0xc6, 0x48, 0x09, 0x12, 0xe6,
+	0x25, 0xde, 0x99, 0x00, 0x51, 0xc1, 0x65, 0x8a,
+	0x85, 0x02, 0xa8, 0xd5, 0x72, 0x41, 0x67, 0x66,
+	0x08, 0xe9, 0x10, 0xa3, 0xa2, 0x07, 0xc8, 0x06,
+	0xc6, 0x0c, 0xc6, 0x47, 0xf7, 0x35, 0x20, 0x40,
+	0x69, 0x04, 0x3c, 0xba, 0x4b, 0xd3, 0x78, 0xa2,
+	0xa4, 0x71, 0xc7, 0x83, 0x2b, 0x69, 0xf9, 0xa2,
+	0x8b, 0xf5, 0xa6, 0x87, 0x46, 0xb3, 0x9b, 0x7a,
+	0x35, 0x97, 0x0b, 0xf4, 0x68, 0x15, 0x4a, 0x87,
+	0xeb, 0x0b, 0x2b, 0xa3, 0xba, 0xcd, 0xb3, 0x28,
+	0x80, 0x38, 0x19, 0x17, 0x1f, 0x44, 0x6f, 0x7f,
+	0x50, 0x75, 0x93, 0x00, 0x4c, 0x36, 0x07, 0x07,
+	0x11, 0xec, 0x91, 0xc4, 0x99, 0x5d, 0xf8, 0xe1,
+	0x53, 0x84, 0x01, 0xca, 0x6a, 0x64, 0x8c, 0xef,
+	0x17, 0xce, 0x81, 0xf5, 0xce, 0xaa, 0x80, 0xc1,
+	0x85, 0xc6, 0x6b, 0xe2, 0xc9, 0x43, 0xc9, 0xf5,
+	0xc3, 0x3a, 0xdb, 0xcf, 0xb9, 0x29, 0x64, 0x8d,
+	0xe7, 0x98, 0x0f, 0x8b, 0xb0, 0xd2, 0x84, 0x25,
+	0x37, 0xd1, 0x80, 0x38, 0x81, 0xb9, 0xe8, 0xb4,
+	0xa7, 0xc8, 0x3a, 0x27, 0x77, 0x9b, 0x81, 0xbb,
+	0x61, 0xae, 0x59, 0x06, 0x57, 0x40, 0x69, 0x11,
+	0xb2, 0x41, 0x68, 0x2d, 0x26, 0x62, 0x93, 0x40,
+	0x4d, 0x97, 0x1c, 0xb4, 0x63, 0x65, 0x04, 0xf8,
+	0x8c, 0x2a, 0x01, 0xb9, 0x6d, 0x3d, 0x87, 0x30,
+	0x28, 0x70, 0x80, 0x1d, 0xb2, 0x24, 0xb0, 0x5c,
+	0x90, 0x95, 0xa3, 0x6c, 0xdc, 0xa6, 0x66, 0x15,
+	0x33, 0x37, 0x8c, 0xa8, 0x9f, 0x24, 0xa3, 0x52,
+	0x21, 0x06, 0xb6, 0xaf, 0x51, 0xc0, 0x1d, 0x42,
+	0xa6, 0x55, 0x93, 0x6b, 0x4a, 0x32, 0x4e, 0xec,
+	0x46, 0xbe, 0xfa, 0x4a, 0x13, 0x5a, 0xca, 0x11,
+	0x39, 0xa1, 0x81, 0x8b, 0xc4, 0x07, 0x1b, 0x43,
+	0x1e, 0xa0, 0x5b, 0x34, 0x2d, 0x10, 0x6c, 0xdd,
+	0x3b, 0x18, 0x78, 0xe1, 0x0d, 0x5b, 0x61, 0x3d,
+	0xfd, 0x51, 0x6a, 0x78, 0x88, 0x2f, 0xa7, 0x84,
+	0xa3, 0x4f, 0x30, 0x3e, 0xb0, 0xdc, 0x96, 0xa8,
+	0xd7, 0xbb, 0x4c, 0xa6, 0x95, 0xb9, 0x27, 0x3f,
+	0x70, 0x46, 0xa3, 0xd8, 0x36, 0x22, 0x3b, 0x4b,
+	0x91, 0xa4, 0xe6, 0x31, 0x0d, 0xbb, 0x27, 0x2f,
+	0x15, 0x2c, 0xa7, 0x44, 0x19, 0xa9, 0xc1, 0xc8,
+	0xb2, 0x77, 0x1a, 0xd5, 0x14, 0x29, 0xa1, 0x76,
+	0xcc, 0x81, 0x88, 0x47, 0x3c, 0xd9, 0x9e, 0xba,
+	0x99, 0x26, 0xbb, 0xf6, 0x5e, 0xbc, 0x2a, 0x8e,
+	0xa0, 0x32, 0x32, 0x2e, 0x24, 0xa1, 0xc3, 0x07,
+	0xa5, 0xd4, 0xbb, 0x95, 0x03, 0x29, 0xb5, 0x59,
+	0x5a, 0x2b, 0x6c, 0x95, 0x15, 0xba, 0xb0, 0xaf,
+	0x27, 0xa2, 0xcb, 0xef, 0x46, 0xb6, 0xb2, 0x25,
+	0x21, 0x23, 0xf8, 0x18, 0x1c, 0xb0, 0x54, 0xad,
+	0x48, 0x38, 0xf6, 0x33, 0xa2, 0x55, 0xc8, 0x63,
+	0xce, 0x56, 0x34, 0x86, 0x6a, 0x61, 0x75, 0x75,
+	0x7f, 0x75, 0x49, 0x2a, 0x57, 0x72, 0x76, 0x3e,
+	0xa7, 0x08, 0x56, 0x28, 0x0b, 0x44, 0xa9, 0x00,
+	0xc2, 0x88, 0x28, 0x02, 0x55, 0x33, 0x55, 0x43,
+	0x97, 0x97, 0x42, 0xa4, 0xfe, 0xb1, 0x95, 0xee,
+	0x9b, 0x5d, 0xa9, 0x18, 0xc1, 0x90, 0xa5, 0x65,
+	0x20, 0x99, 0x39, 0xd2, 0xea, 0x08, 0x1c, 0xda,
+	0xa8, 0xfa, 0xa3, 0x3b, 0x56, 0xf0, 0x59, 0x17,
+	0x10, 0x0b, 0x45, 0x4a, 0x86, 0x88, 0x96, 0x49,
+	0x68, 0x98, 0x26, 0x55, 0x40, 0xb7, 0x5a, 0x29,
+	0x82, 0x93, 0xa1, 0x0e, 0x7b, 0x4b, 0xa2, 0x49,
+	0x61, 0x2b, 0xaf, 0xb4, 0x2d, 0xa1, 0xdc, 0xae,
+	0x79, 0x44, 0x66, 0x20, 0x72, 0xc5, 0x01, 0x36,
+	0x10, 0xd8, 0x81, 0x36, 0xb1, 0xea, 0xb1, 0x0d,
+	0xc2, 0x05, 0x75, 0xd8, 0xad, 0xe0, 0x73, 0xc6,
+	0x82, 0x8c, 0x7e, 0x97, 0x2b, 0x87, 0xb5, 0xc9,
+	0x1e, 0xac, 0xb0, 0x2a, 0x16, 0x20, 0x88, 0xb9,
+	0x41, 0x2f, 0xc8, 0x4b, 0xce, 0xd8, 0xc4, 0xa8,
+	0xe2, 0x68, 0x35, 0xd9, 0xd0, 0xc4, 0x7a, 0xf2,
+	0x25, 0xca, 0xb8, 0x06, 0x42, 0xcb, 0xc9, 0x8f,
+	0x0a, 0x60, 0xde, 0x19, 0xa8, 0xcb, 0x90, 0x85,
+	0x74, 0x42, 0x03, 0x89, 0xf4, 0x97, 0x8e, 0x41,
+	0xc5, 0x72, 0xe3, 0x52, 0x55, 0x81, 0x73, 0xe1,
+	0x71, 0x22, 0xa2, 0xfb, 0x8a, 0x36, 0xea, 0xb3,
+	0xc3, 0x33, 0x4f, 0x23, 0x55, 0x03, 0x1c, 0xa1,
+	0x84, 0x74, 0xe1, 0x69, 0x4d, 0xb3, 0xc2, 0x1f,
+	0xbc, 0x62, 0xeb, 0xf0, 0x50, 0x45, 0xb7, 0x83,
+	0xd3, 0x28, 0x37, 0x46, 0x35, 0x79, 0x04, 0x38,
+	0x16, 0xbd, 0x72, 0x2f, 0xbc, 0xf9, 0x7d, 0xb8,
+	0x20, 0x12, 0x87, 0xa7, 0xb0, 0x82, 0x7c, 0x3e,
+	0x4d, 0xa7, 0x18, 0x04, 0x54, 0x75, 0x19, 0x52,
+	0x61, 0x80, 0x57, 0xbe, 0x06, 0x37, 0x9c, 0xde,
+	0xb0, 0x93, 0x70, 0x54, 0x3f, 0x15, 0x83, 0xb2,
+	0xd3, 0x88, 0xa6, 0xd8, 0x56, 0x9b, 0x91, 0xf3,
+	0x00, 0x01, 0x00, 0xcd, 0xcb, 0x97, 0x16, 0x27,
+	0xc7, 0xaf, 0xb1, 0xd5, 0xba, 0x90, 0xa1, 0x24,
+	0x33, 0x26, 0x95, 0xba, 0xcb, 0x63, 0xa1, 0x56,
+	0xb0, 0x23, 0x09, 0x4e, 0xa8, 0x0a, 0x75, 0x02,
+	0xd8, 0x3b, 0xc1, 0x05, 0xa0, 0x73, 0x25, 0x26,
+	0x3e, 0xb8, 0x5b, 0xca, 0x6a, 0xae, 0x41, 0x22,
+	0xc5, 0x9d, 0x88, 0x3f, 0x37, 0x8c, 0x50, 0xcd,
+	0x09, 0x32, 0x34, 0x81, 0x98, 0xc1, 0x17, 0xa5,
+	0x62, 0x94, 0x8d, 0xcd, 0xd0, 0xc3, 0x08, 0x07,
+	0x2f, 0x8d, 0x52, 0x7b, 0xee, 0x81, 0xc5, 0x95,
+	0x2c, 0x8b, 0x46, 0x45, 0x5d, 0xf2, 0x62, 0x4d,
+	0x2e, 0x22, 0x7f, 0x0d, 0xa5, 0xc8, 0xba, 0x72,
+	0xa0, 0x8f, 0xd0, 0x21, 0x45, 0x28, 0xb9, 0xad,
+	0xac, 0x96, 0xa6, 0xc7, 0x33, 0x6d, 0xf3, 0x17,
+	0xcb, 0x7a, 0x32, 0x4e, 0x4c, 0x83, 0xa7, 0x15,
+	0x55, 0x6a, 0xca, 0xc1, 0xff, 0xd8, 0x90, 0xab,
+	0xaa, 0xa4, 0x65, 0xb0, 0x25, 0xf7, 0x47, 0x00,
+	0x2d, 0x20, 0x19, 0x23, 0xb5, 0x02, 0x39, 0x5a,
+	0x69, 0x1c, 0xc4, 0xbc, 0xa3, 0x80, 0xcc, 0x82,
+	0xd8, 0x66, 0x63, 0xc5, 0x7e, 0xa3, 0x6c, 0x2a,
+	0xb0, 0x7a, 0x02, 0xc6, 0xb3, 0xb7, 0xb0, 0x29,
+	0x3f, 0xa3, 0x99, 0xbd, 0x28, 0xf2, 0x8e, 0xd6,
+	0x7b, 0xb3, 0xd5, 0x24, 0x12, 0xb9, 0xbb, 0xa5,
+	0x68, 0xba, 0x9d, 0xe3, 0x44, 0xa3, 0xeb, 0x64,
+	0x13, 0xb8, 0x8a, 0x5e, 0x72, 0x60, 0xad, 0x95,
+	0xcb, 0x9d, 0xfb, 0x54, 0x6e, 0x0e, 0x66, 0xb5,
+	0xf4, 0x68, 0x25, 0x91, 0xc5, 0x1a, 0x4f, 0x71,
+	0x61, 0x50, 0xc8, 0xcb, 0x34, 0xc5, 0xc2, 0x84,
+	0xbc, 0x4e, 0x5f, 0x28, 0x6f, 0xbf, 0xbb, 0xc8,
+	0xb1, 0xc4, 0x4a, 0x4b, 0xb7, 0x1a, 0x00, 0xa0,
+	0x2d, 0xe9, 0x07, 0x39, 0x93, 0xe9, 0x81, 0x51,
+	0xe1, 0x34, 0x83, 0xf5, 0x82, 0x9d, 0xc7, 0x47,
+	0xf1, 0x61, 0xc8, 0x29, 0x52, 0x4d, 0x51, 0xb7,
+	0xa1, 0xeb, 0x49, 0x50, 0x6e, 0xda, 0x72, 0x5d,
+	0x69, 0x27, 0x83, 0xca, 0x4c, 0x3b, 0xd4, 0xcc,
+	0x7f, 0x26, 0x44, 0x2b, 0x76, 0x41, 0xe1, 0x50,
+	0xce, 0x0f, 0x40, 0x0d, 0x8f, 0x00, 0x6e, 0x27,
+	0x95, 0x6e, 0x92, 0x1b, 0xaf, 0xe4, 0x9b, 0x5e,
+	0x96, 0xec, 0xc7, 0xbf, 0x64, 0x77, 0x75, 0x6d,
+	0xda, 0xa8, 0x9c, 0x48, 0xf3, 0x79, 0x80, 0x4e,
+	0xed, 0x6f, 0xe0, 0x20, 0x1a, 0x2b, 0x7c, 0xa1,
+	0xac, 0x74, 0x42, 0x49, 0xd7, 0xe7, 0x7f, 0x57,
+	0x5a, 0xdb, 0x69, 0xb5, 0xe2, 0x7e, 0x81, 0x8d,
+	0xa9, 0x22, 0x5c, 0xda, 0xf3, 0xad, 0xbc, 0x3e,
+	0x0b, 0xd4, 0x9d, 0x63, 0xef, 0x40, 0x34, 0x66,
+	0x80, 0x8c, 0x2d, 0x31, 0x13, 0xdb, 0x31, 0x03,
+	0xdf, 0x29, 0x92, 0x4a, 0x81, 0x76, 0x4f, 0x4d,
+	0x5a, 0x64, 0x79, 0xf2, 0x8b, 0xc8, 0x3b, 0xc9,
+	0xf3, 0x35, 0xc7, 0x18, 0xcb, 0xb1, 0xa8, 0xd2,
+	0x24, 0xdb, 0x4d, 0x6a, 0x6a, 0xf1, 0xeb, 0xd2,
+};
+
+/* Public key */
+uint8_t mlkem_512_ek[] = {
+	0x28, 0x70, 0x80, 0x1d, 0xb2, 0x24, 0xb0, 0x5c,
+	0x90, 0x95, 0xa3, 0x6c, 0xdc, 0xa6, 0x66, 0x15,
+	0x33, 0x37, 0x8c, 0xa8, 0x9f, 0x24, 0xa3, 0x52,
+	0x21, 0x06, 0xb6, 0xaf, 0x51, 0xc0, 0x1d, 0x42,
+	0xa6, 0x55, 0x93, 0x6b, 0x4a, 0x32, 0x4e, 0xec,
+	0x46, 0xbe, 0xfa, 0x4a, 0x13, 0x5a, 0xca, 0x11,
+	0x39, 0xa1, 0x81, 0x8b, 0xc4, 0x07, 0x1b, 0x43,
+	0x1e, 0xa0, 0x5b, 0x34, 0x2d, 0x10, 0x6c, 0xdd,
+	0x3b, 0x18, 0x78, 0xe1, 0x0d, 0x5b, 0x61, 0x3d,
+	0xfd, 0x51, 0x6a, 0x78, 0x88, 0x2f, 0xa7, 0x84,
+	0xa3, 0x4f, 0x30, 0x3e, 0xb0, 0xdc, 0x96, 0xa8,
+	0xd7, 0xbb, 0x4c, 0xa6, 0x95, 0xb9, 0x27, 0x3f,
+	0x70, 0x46, 0xa3, 0xd8, 0x36, 0x22, 0x3b, 0x4b,
+	0x91, 0xa4, 0xe6, 0x31, 0x0d, 0xbb, 0x27, 0x2f,
+	0x15, 0x2c, 0xa7, 0x44, 0x19, 0xa9, 0xc1, 0xc8,
+	0xb2, 0x77, 0x1a, 0xd5, 0x14, 0x29, 0xa1, 0x76,
+	0xcc, 0x81, 0x88, 0x47, 0x3c, 0xd9, 0x9e, 0xba,
+	0x99, 0x26, 0xbb, 0xf6, 0x5e, 0xbc, 0x2a, 0x8e,
+	0xa0, 0x32, 0x32, 0x2e, 0x24, 0xa1, 0xc3, 0x07,
+	0xa5, 0xd4, 0xbb, 0x95, 0x03, 0x29, 0xb5, 0x59,
+	0x5a, 0x2b, 0x6c, 0x95, 0x15, 0xba, 0xb0, 0xaf,
+	0x27, 0xa2, 0xcb, 0xef, 0x46, 0xb6, 0xb2, 0x25,
+	0x21, 0x23, 0xf8, 0x18, 0x1c, 0xb0, 0x54, 0xad,
+	0x48, 0x38, 0xf6, 0x33, 0xa2, 0x55, 0xc8, 0x63,
+	0xce, 0x56, 0x34, 0x86, 0x6a, 0x61, 0x75, 0x75,
+	0x7f, 0x75, 0x49, 0x2a, 0x57, 0x72, 0x76, 0x3e,
+	0xa7, 0x08, 0x56, 0x28, 0x0b, 0x44, 0xa9, 0x00,
+	0xc2, 0x88, 0x28, 0x02, 0x55, 0x33, 0x55, 0x43,
+	0x97, 0x97, 0x42, 0xa4, 0xfe, 0xb1, 0x95, 0xee,
+	0x9b, 0x5d, 0xa9, 0x18, 0xc1, 0x90, 0xa5, 0x65,
+	0x20, 0x99, 0x39, 0xd2, 0xea, 0x08, 0x1c, 0xda,
+	0xa8, 0xfa, 0xa3, 0x3b, 0x56, 0xf0, 0x59, 0x17,
+	0x10, 0x0b, 0x45, 0x4a, 0x86, 0x88, 0x96, 0x49,
+	0x68, 0x98, 0x26, 0x55, 0x40, 0xb7, 0x5a, 0x29,
+	0x82, 0x93, 0xa1, 0x0e, 0x7b, 0x4b, 0xa2, 0x49,
+	0x61, 0x2b, 0xaf, 0xb4, 0x2d, 0xa1, 0xdc, 0xae,
+	0x79, 0x44, 0x66, 0x20, 0x72, 0xc5, 0x01, 0x36,
+	0x10, 0xd8, 0x81, 0x36, 0xb1, 0xea, 0xb1, 0x0d,
+	0xc2, 0x05, 0x75, 0xd8, 0xad, 0xe0, 0x73, 0xc6,
+	0x82, 0x8c, 0x7e, 0x97, 0x2b, 0x87, 0xb5, 0xc9,
+	0x1e, 0xac, 0xb0, 0x2a, 0x16, 0x20, 0x88, 0xb9,
+	0x41, 0x2f, 0xc8, 0x4b, 0xce, 0xd8, 0xc4, 0xa8,
+	0xe2, 0x68, 0x35, 0xd9, 0xd0, 0xc4, 0x7a, 0xf2,
+	0x25, 0xca, 0xb8, 0x06, 0x42, 0xcb, 0xc9, 0x8f,
+	0x0a, 0x60, 0xde, 0x19, 0xa8, 0xcb, 0x90, 0x85,
+	0x74, 0x42, 0x03, 0x89, 0xf4, 0x97, 0x8e, 0x41,
+	0xc5, 0x72, 0xe3, 0x52, 0x55, 0x81, 0x73, 0xe1,
+	0x71, 0x22, 0xa2, 0xfb, 0x8a, 0x36, 0xea, 0xb3,
+	0xc3, 0x33, 0x4f, 0x23, 0x55, 0x03, 0x1c, 0xa1,
+	0x84, 0x74, 0xe1, 0x69, 0x4d, 0xb3, 0xc2, 0x1f,
+	0xbc, 0x62, 0xeb, 0xf0, 0x50, 0x45, 0xb7, 0x83,
+	0xd3, 0x28, 0x37, 0x46, 0x35, 0x79, 0x04, 0x38,
+	0x16, 0xbd, 0x72, 0x2f, 0xbc, 0xf9, 0x7d, 0xb8,
+	0x20, 0x12, 0x87, 0xa7, 0xb0, 0x82, 0x7c, 0x3e,
+	0x4d, 0xa7, 0x18, 0x04, 0x54, 0x75, 0x19, 0x52,
+	0x61, 0x80, 0x57, 0xbe, 0x06, 0x37, 0x9c, 0xde,
+	0xb0, 0x93, 0x70, 0x54, 0x3f, 0x15, 0x83, 0xb2,
+	0xd3, 0x88, 0xa6, 0xd8, 0x56, 0x9b, 0x91, 0xf3,
+	0x00, 0x01, 0x00, 0xcd, 0xcb, 0x97, 0x16, 0x27,
+	0xc7, 0xaf, 0xb1, 0xd5, 0xba, 0x90, 0xa1, 0x24,
+	0x33, 0x26, 0x95, 0xba, 0xcb, 0x63, 0xa1, 0x56,
+	0xb0, 0x23, 0x09, 0x4e, 0xa8, 0x0a, 0x75, 0x02,
+	0xd8, 0x3b, 0xc1, 0x05, 0xa0, 0x73, 0x25, 0x26,
+	0x3e, 0xb8, 0x5b, 0xca, 0x6a, 0xae, 0x41, 0x22,
+	0xc5, 0x9d, 0x88, 0x3f, 0x37, 0x8c, 0x50, 0xcd,
+	0x09, 0x32, 0x34, 0x81, 0x98, 0xc1, 0x17, 0xa5,
+	0x62, 0x94, 0x8d, 0xcd, 0xd0, 0xc3, 0x08, 0x07,
+	0x2f, 0x8d, 0x52, 0x7b, 0xee, 0x81, 0xc5, 0x95,
+	0x2c, 0x8b, 0x46, 0x45, 0x5d, 0xf2, 0x62, 0x4d,
+	0x2e, 0x22, 0x7f, 0x0d, 0xa5, 0xc8, 0xba, 0x72,
+	0xa0, 0x8f, 0xd0, 0x21, 0x45, 0x28, 0xb9, 0xad,
+	0xac, 0x96, 0xa6, 0xc7, 0x33, 0x6d, 0xf3, 0x17,
+	0xcb, 0x7a, 0x32, 0x4e, 0x4c, 0x83, 0xa7, 0x15,
+	0x55, 0x6a, 0xca, 0xc1, 0xff, 0xd8, 0x90, 0xab,
+	0xaa, 0xa4, 0x65, 0xb0, 0x25, 0xf7, 0x47, 0x00,
+	0x2d, 0x20, 0x19, 0x23, 0xb5, 0x02, 0x39, 0x5a,
+	0x69, 0x1c, 0xc4, 0xbc, 0xa3, 0x80, 0xcc, 0x82,
+	0xd8, 0x66, 0x63, 0xc5, 0x7e, 0xa3, 0x6c, 0x2a,
+	0xb0, 0x7a, 0x02, 0xc6, 0xb3, 0xb7, 0xb0, 0x29,
+	0x3f, 0xa3, 0x99, 0xbd, 0x28, 0xf2, 0x8e, 0xd6,
+	0x7b, 0xb3, 0xd5, 0x24, 0x12, 0xb9, 0xbb, 0xa5,
+	0x68, 0xba, 0x9d, 0xe3, 0x44, 0xa3, 0xeb, 0x64,
+	0x13, 0xb8, 0x8a, 0x5e, 0x72, 0x60, 0xad, 0x95,
+	0xcb, 0x9d, 0xfb, 0x54, 0x6e, 0x0e, 0x66, 0xb5,
+	0xf4, 0x68, 0x25, 0x91, 0xc5, 0x1a, 0x4f, 0x71,
+	0x61, 0x50, 0xc8, 0xcb, 0x34, 0xc5, 0xc2, 0x84,
+	0xbc, 0x4e, 0x5f, 0x28, 0x6f, 0xbf, 0xbb, 0xc8,
+	0xb1, 0xc4, 0x4a, 0x4b, 0xb7, 0x1a, 0x00, 0xa0,
+	0x2d, 0xe9, 0x07, 0x39, 0x93, 0xe9, 0x81, 0x51,
+	0xe1, 0x34, 0x83, 0xf5, 0x82, 0x9d, 0xc7, 0x47,
+	0xf1, 0x61, 0xc8, 0x29, 0x52, 0x4d, 0x51, 0xb7,
+	0xa1, 0xeb, 0x49, 0x50, 0x6e, 0xda, 0x72, 0x5d,
+	0x69, 0x27, 0x83, 0xca, 0x4c, 0x3b, 0xd4, 0xcc,
+	0x7f, 0x26, 0x44, 0x2b, 0x76, 0x41, 0xe1, 0x50,
+	0xce, 0x0f, 0x40, 0x0d, 0x8f, 0x00, 0x6e, 0x27,
+	0x95, 0x6e, 0x92, 0x1b, 0xaf, 0xe4, 0x9b, 0x5e,
+	0x96, 0xec, 0xc7, 0xbf, 0x64, 0x77, 0x75, 0x6d,
+	0xda, 0xa8, 0x9c, 0x48, 0xf3, 0x79, 0x80, 0x4e,
+	0xed, 0x6f, 0xe0, 0x20, 0x1a, 0x2b, 0x7c, 0xa1,
+	0xac, 0x74, 0x42, 0x49, 0xd7, 0xe7, 0x7f, 0x57,
+};
+
+/* Plain text */
+uint8_t mlkem_512_message[] = {
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20,
+	0x66, 0x72, 0x6f, 0x6d, 0x20, 0x4d, 0x4c, 0x2d,
+	0x4b, 0x45, 0x4d, 0x20, 0x74, 0x65, 0x73, 0x74,
+	0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73,
+	0x2e
+};
+
+/* Cipher text */
+uint8_t mlkem_512_cipher[] = {
+	0x92, 0x98, 0x11, 0x65, 0x10, 0x78, 0xE3, 0xA4,
+	0x34, 0x94, 0xD1, 0x22, 0x56, 0xD6, 0xB1, 0xF6,
+	0xF7, 0x51, 0x2A, 0xCA, 0x8E, 0x04, 0x1D, 0x89,
+	0xBB, 0xA7, 0x84, 0xEF, 0xAA, 0x70, 0x11, 0x75,
+	0xFC, 0x48, 0xA1, 0x7E, 0x4C, 0x99, 0xBD, 0xB8,
+	0x05, 0x01, 0xA6, 0xF0, 0x0E, 0x18, 0x0D, 0x75,
+	0xF0, 0xBB, 0xBD, 0x6F, 0x28, 0xF4, 0xDC, 0x3A,
+	0x58, 0x3D, 0x83, 0x1D, 0x78, 0xF9, 0x0E, 0x06,
+	0x5C, 0x0B, 0x77, 0x4C, 0x28, 0x82, 0xE1, 0xA4,
+	0x77, 0xAD, 0x14, 0x71, 0x3D, 0x5D, 0x53, 0x41,
+	0xCE, 0x4F, 0x36, 0x32, 0x24, 0xD7, 0x09, 0xF0,
+	0xB8, 0xF2, 0x95, 0x68, 0x84, 0x5C, 0x62, 0xC3,
+	0x77, 0x9A, 0x74, 0xD3, 0x29, 0xC1, 0x88, 0x8B,
+	0xBF, 0x05, 0x73, 0x43, 0x30, 0x20, 0xB4, 0xB0,
+	0xB3, 0xE1, 0xB5, 0x91, 0xA8, 0xBD, 0x4B, 0x7F,
+	0x2E, 0x53, 0x20, 0x55, 0xDE, 0x4D, 0xDB, 0x91,
+	0x73, 0xF9, 0x2F, 0x21, 0xF6, 0xAE, 0x6D, 0xEE,
+	0x67, 0x37, 0x82, 0x11, 0xE3, 0x0A, 0x5A, 0xB8,
+	0x68, 0xC7, 0x22, 0x34, 0x2A, 0xD4, 0x37, 0xAF,
+	0x50, 0xE0, 0xDB, 0xED, 0x89, 0x6D, 0x97, 0x0C,
+	0xF6, 0x0D, 0x6D, 0x9B, 0x1D, 0x5B, 0xE1, 0xF6,
+	0x45, 0x48, 0xF0, 0x75, 0x38, 0xE0, 0x2E, 0x11,
+	0x88, 0xEC, 0x8B, 0x51, 0x47, 0x21, 0xF6, 0x6F,
+	0x13, 0x3E, 0xA4, 0x46, 0xFE, 0xB0, 0x15, 0x81,
+	0x68, 0x9C, 0x0F, 0x15, 0xCB, 0x64, 0x6D, 0x0B,
+	0x04, 0x63, 0xBA, 0x67, 0x6C, 0x86, 0xE8, 0xAC,
+	0xB3, 0xE5, 0x47, 0x88, 0x27, 0x4A, 0xBC, 0x58,
+	0x13, 0x4D, 0x6F, 0xA6, 0x2C, 0xEC, 0x83, 0xB0,
+	0x6E, 0x93, 0x7C, 0xC7, 0x6E, 0xBB, 0xBF, 0xE1,
+	0x9F, 0xD6, 0x6E, 0xD8, 0x7A, 0xC5, 0xA2, 0x4D,
+	0xA2, 0x1C, 0xDA, 0x55, 0x1E, 0xF2, 0x1C, 0x71,
+	0x3E, 0x82, 0xD7, 0x92, 0x6F, 0x89, 0x1E, 0x53,
+	0x48, 0x00, 0x9E, 0x93, 0xCB, 0xE3, 0x79, 0xB5,
+	0x87, 0xDE, 0xF7, 0x84, 0xD6, 0x25, 0x57, 0x07,
+	0x47, 0xEE, 0xDB, 0xA8, 0xC2, 0x7E, 0xE8, 0xF9,
+	0x56, 0x22, 0x34, 0xE9, 0xD0, 0xC8, 0x3F, 0xF2,
+	0xCB, 0xE7, 0x92, 0xE1, 0x03, 0xF4, 0x38, 0x88,
+	0xE4, 0xC6, 0xB2, 0x42, 0x6F, 0x08, 0x61, 0x77,
+	0x7F, 0x8A, 0xCD, 0x9D, 0x21, 0x3E, 0xE2, 0x18,
+	0x52, 0x15, 0x02, 0x62, 0x2F, 0xCA, 0xEE, 0x44,
+	0x60, 0x15, 0x6B, 0x76, 0x7D, 0x12, 0xC7, 0x0F,
+	0xA0, 0x6C, 0xA1, 0x7B, 0xAE, 0xD6, 0x40, 0x1B,
+	0x61, 0x46, 0xB4, 0x47, 0x97, 0x6C, 0xE1, 0x4C,
+	0x47, 0x35, 0x29, 0x02, 0x6D, 0x69, 0x5E, 0x32,
+	0xF7, 0x7F, 0x9C, 0xFA, 0x87, 0xD3, 0x7D, 0x33,
+	0x85, 0x53, 0xF3, 0x8F, 0x0A, 0x41, 0x3C, 0x84,
+	0x00, 0x14, 0x04, 0x63, 0xA8, 0xC3, 0xCB, 0xEB,
+	0xAF, 0xCB, 0xE1, 0x78, 0xB2, 0x30, 0xC0, 0xA6,
+	0x9D, 0x7A, 0x28, 0x0A, 0x60, 0x5F, 0x45, 0x74,
+	0x24, 0xBE, 0xD8, 0x0D, 0xCB, 0x3A, 0x1B, 0xD1,
+	0x9C, 0x2A, 0x4E, 0x9A, 0xD1, 0x27, 0xCB, 0xAB,
+	0x08, 0x72, 0x89, 0xD9, 0xBA, 0x15, 0x01, 0x92,
+	0x4F, 0xFA, 0x7A, 0xCA, 0x32, 0xD3, 0x7E, 0xB1,
+	0xEB, 0xE7, 0xDF, 0x21, 0x33, 0x4F, 0xBD, 0x5F,
+	0xCF, 0x64, 0x5D, 0x36, 0x21, 0x63, 0x34, 0x68,
+	0x90, 0x81, 0x15, 0xC7, 0xF7, 0x28, 0x46, 0x42,
+	0xC9, 0x78, 0xC0, 0xA3, 0x5F, 0xF8, 0x86, 0x01,
+	0xF4, 0x1C, 0x6A, 0x65, 0xA2, 0x0E, 0x01, 0x5B,
+	0x29, 0xF4, 0xF8, 0x9E, 0xA5, 0x5C, 0xC0, 0x4B,
+	0x74, 0x2C, 0x88, 0xA3, 0x6B, 0xC2, 0xC4, 0xDA,
+	0xEF, 0xF2, 0x02, 0xCD, 0x89, 0x0C, 0x42, 0xDA,
+	0xE6, 0xBB, 0x67, 0x51, 0x29, 0x4A, 0x32, 0x99,
+	0xAC, 0xCC, 0xDC, 0xB6, 0x35, 0x8B, 0xCC, 0xE8,
+	0x04, 0x78, 0x69, 0xA8, 0x19, 0x0E, 0xDC, 0x1E,
+	0x6C, 0xFF, 0x46, 0xDF, 0x4E, 0x7A, 0x51, 0xC5,
+	0x9F, 0x39, 0x6F, 0xC7, 0x96, 0xFE, 0x54, 0xF4,
+	0xE2, 0xD8, 0xEB, 0x5C, 0xA1, 0x28, 0x84, 0xB4,
+	0xEA, 0x34, 0xA8, 0x18, 0x86, 0x93, 0x8B, 0xE9,
+	0xA7, 0xAB, 0x5E, 0xD9, 0x1E, 0x3E, 0x89, 0x8F,
+	0x83, 0xB4, 0xEF, 0x8E, 0x21, 0x30, 0xB4, 0xAD,
+	0x07, 0xFE, 0x8A, 0x3B, 0x34, 0xAE, 0xDE, 0x5C,
+	0xCA, 0xBA, 0x9E, 0xFB, 0x1B, 0x81, 0xEC, 0xD3,
+	0x0E, 0x40, 0xED, 0x65, 0x77, 0xF3, 0xC0, 0x56,
+	0xDC, 0xD8, 0x46, 0xDB, 0x4F, 0x51, 0x4B, 0x24,
+	0x42, 0x3B, 0xC7, 0xE2, 0x32, 0xBA, 0xA7, 0xC0,
+	0xA4, 0xFA, 0x14, 0xC4, 0xB7, 0x1B, 0x84, 0x0D,
+	0xC9, 0xD1, 0x8E, 0x1C, 0x50, 0xF1, 0xBB, 0xA6,
+	0x14, 0xD4, 0x88, 0xD8, 0x6C, 0xCE, 0x44, 0x76,
+	0x3A, 0x29, 0xF8, 0x69, 0xBD, 0x5B, 0x53, 0x4B,
+	0x65, 0xB8, 0x76, 0x5F, 0xD2, 0x01, 0xE9, 0x55,
+	0x83, 0x47, 0x2C, 0xD3, 0x9B, 0xCA, 0x85, 0x75,
+	0x60, 0x14, 0x1B, 0x5D, 0x48, 0x97, 0x67, 0x18,
+	0x9F, 0x8E, 0x8C, 0x86, 0x31, 0xCF, 0x07, 0x7D,
+	0x9E, 0xEB, 0xDE, 0x06, 0x14, 0xFE, 0x00, 0x3F,
+	0x9C, 0x09, 0xDF, 0x2B, 0x99, 0x08, 0x7A, 0x4C,
+	0xD9, 0xC8, 0x3B, 0x54, 0xF0, 0x34, 0x07, 0x19,
+	0xC5, 0x4A, 0x34, 0xBF, 0xB8, 0x31, 0xBF, 0x1C,
+	0x6F, 0x5C, 0x07, 0x37, 0x76, 0xD9, 0xBD, 0x3B,
+	0xB6, 0xB6, 0x8D, 0x6A, 0x1A, 0xE6, 0xE9, 0xCB,
+	0x4D, 0xC3, 0xDC, 0x76, 0x91, 0xE7, 0x6F, 0x11,
+	0x66, 0xF7, 0x76, 0xB3, 0x40, 0xAA, 0x51, 0x09,
+	0x7C, 0xFE, 0xA2, 0x37, 0xBF, 0xC3, 0x92, 0xFA,
+	0x75, 0x44, 0x76, 0xC7, 0x54, 0xC8, 0x91, 0x89,
+	0x65, 0x84, 0x03, 0x3E, 0x46, 0x92, 0x1E, 0x67,
+	0x8D, 0x8F, 0x52, 0x0D, 0x06, 0x22, 0x18, 0xFC,
+	0x0B, 0x92, 0xCD, 0x94, 0xC2, 0x0A, 0x3F, 0x41,
+};
+
+/* Shared secret */
+uint8_t mlkem_512_sk[] = {
+	0x26, 0xCD, 0x28, 0x15, 0xEB, 0x3E, 0x16, 0x56,
+	0x84, 0x2D, 0x15, 0xAC, 0x32, 0x33, 0xDA, 0x01,
+	0x71, 0x21, 0x82, 0x1B, 0xC7, 0xE3, 0x44, 0xF9,
+	0x5E, 0x7A, 0xB9, 0x3A, 0x40, 0xAD, 0x38, 0x6A
+};
+
+uint8_t mlkem_512_dk_noseed[] = {
+	0x87, 0xCA, 0x19, 0x93, 0xB6, 0x4D, 0x89, 0x32,
+	0xAE, 0x3B, 0x22, 0x52, 0x82, 0xA1, 0xB3, 0xC1,
+	0x37, 0x65, 0xDC, 0xC1, 0x22, 0x4C, 0x43, 0x77,
+	0x33, 0x0A, 0x04, 0xEC, 0xEC, 0x0B, 0x25, 0x05,
+	0x40, 0x07, 0x53, 0x82, 0xBE, 0x37, 0x52, 0x53,
+	0x12, 0x87, 0x7D, 0x77, 0x69, 0xFD, 0x59, 0x4F,
+	0xBD, 0x16, 0x42, 0x82, 0x58, 0x9D, 0xEE, 0x5C,
+	0x0F, 0x2C, 0x14, 0x7F, 0xC6, 0x2A, 0x95, 0x42,
+	0x10, 0x3C, 0x08, 0xBC, 0xCC, 0xA0, 0x05, 0x82,
+	0xE9, 0xC5, 0x26, 0x81, 0xFA, 0xB8, 0x79, 0x78,
+	0x5B, 0x3E, 0x79, 0x49, 0x68, 0x44, 0xB3, 0x7B,
+	0xF5, 0x26, 0x62, 0x7A, 0x8A, 0x3C, 0xD8, 0x82,
+	0x1F, 0x16, 0x1D, 0x92, 0x99, 0xAC, 0xC4, 0xA9,
+	0xB9, 0x30, 0x32, 0x6B, 0x6B, 0x67, 0x3D, 0x16,
+	0x13, 0x1D, 0xF0, 0x98, 0x94, 0x42, 0x90, 0x68,
+	0xFC, 0x65, 0xA3, 0xE5, 0x16, 0x22, 0x09, 0x64,
+	0xC0, 0x7D, 0x54, 0x03, 0x47, 0x89, 0xBE, 0xAE,
+	0x61, 0x4B, 0x13, 0xA1, 0xCD, 0xAD, 0xBC, 0x20,
+	0x5E, 0x36, 0x36, 0x34, 0x41, 0x1D, 0x5B, 0x3A,
+	0x26, 0x91, 0x80, 0x75, 0xE0, 0x63, 0x9D, 0xD6,
+	0x35, 0xC9, 0x28, 0x81, 0xA4, 0x6E, 0xFB, 0x95,
+	0x01, 0x11, 0x8F, 0xCC, 0x18, 0xB3, 0x9A, 0x91,
+	0x66, 0xA6, 0x37, 0x6C, 0xEB, 0x71, 0x42, 0x29,
+	0xEC, 0x71, 0xA4, 0x99, 0x6D, 0x92, 0x97, 0x9D,
+	0x94, 0x64, 0x6E, 0xC3, 0xF0, 0x5D, 0xA5, 0x49,
+	0x8F, 0x66, 0xA5, 0x0A, 0x9A, 0xB9, 0xCF, 0x85,
+	0x20, 0xA7, 0x28, 0xE1, 0xC2, 0x10, 0x08, 0x72,
+	0x58, 0x71, 0x56, 0x3E, 0x7B, 0x47, 0x46, 0x81,
+	0x7D, 0x74, 0xFA, 0xB2, 0xB6, 0xF2, 0xA0, 0xE3,
+	0x4A, 0x0A, 0x5E, 0x95, 0x2B, 0x32, 0xF1, 0x07,
+	0x2C, 0x30, 0x5E, 0x81, 0x84, 0x58, 0xF3, 0x42,
+	0x34, 0xDB, 0xAA, 0xC4, 0x06, 0xCB, 0x63, 0x72,
+	0xFA, 0x01, 0x86, 0xE8, 0xCA, 0xD7, 0x73, 0x1D,
+	0xAC, 0xD8, 0x64, 0x60, 0x66, 0xB1, 0x19, 0xB1,
+	0x59, 0xAC, 0x78, 0x21, 0xAB, 0x9A, 0x62, 0xBF,
+	0xE8, 0x1B, 0xD1, 0xDC, 0x75, 0x08, 0xA4, 0x9E,
+	0x22, 0x54, 0xA8, 0x36, 0x68, 0x4B, 0xB7, 0x22,
+	0xA3, 0xBC, 0x04, 0x09, 0xE2, 0xE9, 0x4D, 0xCE,
+	0xF5, 0x46, 0x69, 0x1A, 0x47, 0x80, 0xB2, 0xA5,
+	0xA0, 0x24, 0xCF, 0x0D, 0x60, 0x95, 0x99, 0x33,
+	0xAD, 0x6A, 0x58, 0x7A, 0x56, 0x53, 0x86, 0x44,
+	0xA8, 0x3C, 0x1F, 0x92, 0x55, 0x3F, 0x3A, 0x3B,
+	0x5F, 0x81, 0xAA, 0x0C, 0xC4, 0x4B, 0x1A, 0xE3,
+	0x61, 0x8A, 0xD0, 0x5D, 0x29, 0x87, 0xB6, 0x7D,
+	0x1C, 0x85, 0xA5, 0x14, 0xB0, 0xDE, 0x1C, 0x8D,
+	0x5C, 0xC1, 0x5C, 0x04, 0xFC, 0x77, 0xAD, 0x03,
+	0x55, 0x96, 0xE0, 0xA7, 0x43, 0xB5, 0x95, 0x9A,
+	0xD5, 0x22, 0xEF, 0x13, 0x5F, 0x14, 0x9C, 0x0E,
+	0x7E, 0x56, 0x89, 0x37, 0x33, 0xC9, 0x00, 0x54,
+	0x7E, 0xEA, 0x32, 0x4F, 0x02, 0x85, 0xCD, 0xE5,
+	0x9C, 0x25, 0x00, 0x3B, 0xAD, 0xC2, 0x72, 0x3A,
+	0x38, 0x66, 0x95, 0xF9, 0xF4, 0x22, 0x1F, 0x50,
+	0x19, 0x20, 0x6A, 0x31, 0x03, 0xF8, 0x97, 0x91,
+	0xF0, 0x42, 0xBB, 0xC0, 0x86, 0xDE, 0x56, 0x93,
+	0xF2, 0x78, 0x9B, 0xC9, 0x98, 0x16, 0x47, 0x83,
+	0x67, 0x55, 0x92, 0x4E, 0x5A, 0xFA, 0x5D, 0x88,
+	0xF9, 0xC8, 0xEF, 0xA8, 0x21, 0x34, 0x58, 0x5F,
+	0xCA, 0xBB, 0x52, 0x98, 0xBC, 0x5C, 0xF5, 0xA7,
+	0xAE, 0xC5, 0xFC, 0x78, 0xF9, 0xA5, 0x30, 0x16,
+	0x68, 0x9D, 0x62, 0x17, 0x41, 0x7A, 0x95, 0xCF,
+	0x27, 0xB6, 0x6D, 0xAE, 0x58, 0xA7, 0x28, 0x8C,
+	0x8F, 0xC3, 0x28, 0xAC, 0x06, 0x79, 0x9D, 0x94,
+	0xC4, 0x9D, 0xED, 0xB2, 0x61, 0xF4, 0x44, 0x86,
+	0xEC, 0x12, 0xC3, 0x13, 0x97, 0xA7, 0x8B, 0x9A,
+	0x63, 0x2E, 0xF1, 0x66, 0x08, 0x84, 0x32, 0xF6,
+	0x15, 0x3B, 0x91, 0xCA, 0xCE, 0xF7, 0x40, 0x53,
+	0xA9, 0x28, 0x11, 0x63, 0xA0, 0x23, 0x2E, 0xC4,
+	0x44, 0x28, 0x05, 0x01, 0x02, 0x74, 0xCF, 0x9C,
+	0x3A, 0x1A, 0xBC, 0x93, 0x8A, 0x2C, 0xE8, 0x9A,
+	0xCA, 0xE1, 0x74, 0x62, 0x03, 0x88, 0xC7, 0x12,
+	0x20, 0x96, 0x3C, 0x4D, 0x10, 0x79, 0x28, 0x6F,
+	0x7B, 0xA8, 0x1B, 0xFB, 0x5E, 0x57, 0x17, 0xCC,
+	0x6D, 0xD0, 0x72, 0x8A, 0xB2, 0x70, 0xA3, 0x0A,
+	0x88, 0x03, 0x5B, 0x88, 0x5D, 0x35, 0x12, 0x8E,
+	0xAC, 0xC1, 0x81, 0xCA, 0xB7, 0x2B, 0xB1, 0x96,
+	0xF6, 0x35, 0xCE, 0xBB, 0x75, 0xAD, 0x0D, 0xD0,
+	0xBA, 0x4E, 0x43, 0x5B, 0x31, 0x08, 0x93, 0x32,
+	0x72, 0x63, 0x58, 0xC5, 0xA2, 0x70, 0x95, 0x12,
+	0x8F, 0xF2, 0xC1, 0x61, 0xEB, 0x22, 0xE9, 0x4A,
+	0x65, 0xA5, 0x48, 0x5D, 0x4C, 0x11, 0x78, 0x69,
+	0x0B, 0x1F, 0x39, 0x2B, 0x7F, 0x63, 0x77, 0xAD,
+	0x96, 0x6B, 0x67, 0x80, 0x90, 0x70, 0x57, 0x2B,
+	0xBC, 0x68, 0x9C, 0xAA, 0xB2, 0xD8, 0x3C, 0xBF,
+	0xD6, 0x4F, 0xC4, 0x28, 0x65, 0x74, 0x54, 0x84,
+	0x43, 0x9A, 0x1C, 0x96, 0x50, 0x02, 0x97, 0xC6,
+	0xCF, 0xB0, 0xB1, 0x1D, 0x98, 0x9A, 0x32, 0x94,
+	0x73, 0x88, 0x94, 0x78, 0x2D, 0x5F, 0x25, 0x05,
+	0x5F, 0xA6, 0x96, 0x7A, 0xC8, 0x3A, 0xDF, 0xA8,
+	0x19, 0xB2, 0x53, 0x53, 0x05, 0xF9, 0x31, 0xDC,
+	0x58, 0x6C, 0xD1, 0x3A, 0x9B, 0x47, 0x3B, 0x7D,
+	0x87, 0xE5, 0xB4, 0xB2, 0xD9, 0x96, 0x2A, 0x59,
+	0x90, 0x3C, 0xCC, 0xAD, 0xDC, 0xA2, 0x57, 0x87,
+	0x71, 0xC6, 0x7E, 0x5A, 0x49, 0x98, 0xC8, 0x94,
+	0x29, 0x30, 0x7B, 0x0E, 0x01, 0x97, 0x53, 0x18,
+	0x32, 0x50, 0x73, 0x9E, 0x14, 0x47, 0x97, 0xBD,
+	0xCC, 0x22, 0xAB, 0x02, 0x95, 0xD7, 0xC5, 0x32,
+	0xDF, 0x17, 0x84, 0x86, 0x77, 0x41, 0x6E, 0x95,
+	0x4D, 0x66, 0xF9, 0xB0, 0x9E, 0x12, 0x81, 0x53,
+	0x2A, 0x2E, 0x8F, 0x0C, 0x6A, 0xBE, 0x00, 0x37,
+	0xE7, 0xE8, 0x11, 0x90, 0x97, 0xC9, 0xEC, 0x84,
+	0x5A, 0xA0, 0x69, 0x85, 0xC0, 0x88, 0x55, 0x2C,
+	0x41, 0xB6, 0x15, 0x17, 0x36, 0x42, 0xC1, 0x02,
+	0x51, 0xC0, 0x6E, 0x91, 0xA2, 0x5C, 0x24, 0x3C,
+	0x02, 0x63, 0xB6, 0x75, 0xC7, 0x20, 0x7D, 0x58,
+	0x70, 0x1D, 0x13, 0xA5, 0x2E, 0xAB, 0x92, 0x56,
+	0x5E, 0xF1, 0xA1, 0xDE, 0xFB, 0xAE, 0xFE, 0x4C,
+	0x0B, 0x03, 0xF5, 0x04, 0x44, 0xA3, 0xBE, 0x20,
+	0xB1, 0x71, 0x31, 0x0B, 0xA3, 0xF2, 0x08, 0x52,
+	0xF3, 0xA2, 0xA1, 0x8E, 0x72, 0x29, 0x40, 0x70,
+	0x15, 0x64, 0x60, 0x52, 0xD2, 0xE7, 0x3A, 0xBE,
+	0xE3, 0x18, 0xD7, 0x55, 0x89, 0x9C, 0x78, 0x4A,
+	0x6F, 0xB5, 0xAA, 0xB1, 0x7C, 0x90, 0x2C, 0xB6,
+	0x8A, 0xFA, 0x36, 0x57, 0xB9, 0x01, 0x2E, 0x1B,
+	0xB8, 0xB6, 0xAA, 0xC2, 0x68, 0x9A, 0xA4, 0x8C,
+	0x2D, 0x42, 0x62, 0xBB, 0x29, 0x63, 0xB0, 0x6A,
+	0x24, 0x22, 0x82, 0x54, 0x1C, 0xF6, 0x14, 0x19,
+	0xD9, 0x0E, 0x2B, 0xD3, 0x66, 0xBE, 0xE7, 0xA4,
+	0x36, 0x9B, 0x72, 0x41, 0xA6, 0x6B, 0xF2, 0x64,
+	0x5D, 0x8E, 0x90, 0x4C, 0x3F, 0x7B, 0x30, 0x0C,
+	0x04, 0x1D, 0x56, 0x87, 0x39, 0x3D, 0x2C, 0xA9,
+	0x29, 0x75, 0xCB, 0xFD, 0xC0, 0x18, 0xDD, 0xC6,
+	0x0A, 0xF5, 0x62, 0x00, 0x9E, 0xB0, 0x88, 0x8E,
+	0x5A, 0x05, 0x76, 0x24, 0x6A, 0xCE, 0x74, 0x5B,
+	0xB1, 0x63, 0x40, 0x8B, 0x5A, 0x9A, 0xE3, 0xC1,
+	0x94, 0xA8, 0x5C, 0x21, 0x90, 0x7B, 0x37, 0xB1,
+	0x62, 0x8E, 0xCD, 0x9A, 0x15, 0xEC, 0x20, 0x24,
+	0x87, 0x30, 0x27, 0x34, 0x44, 0xB0, 0xA2, 0xF4,
+	0x54, 0xF9, 0xB4, 0x73, 0x0F, 0x33, 0x91, 0x50,
+	0x47, 0x6E, 0xE0, 0x70, 0x98, 0xF6, 0xBC, 0x1B,
+	0x97, 0xCC, 0x1B, 0xD3, 0xB8, 0xC1, 0xA2, 0xEB,
+	0x0E, 0x50, 0xA7, 0x82, 0xF2, 0x11, 0x5D, 0xF6,
+	0x17, 0x49, 0x6F, 0x6C, 0x6F, 0x8C, 0x09, 0xB0,
+	0x5F, 0x88, 0x8D, 0x9E, 0x93, 0x3D, 0x28, 0x77,
+	0x46, 0xC6, 0x31, 0xB3, 0x10, 0x87, 0x26, 0xB0,
+	0xC4, 0xA7, 0xC8, 0x8B, 0x09, 0xC8, 0x60, 0xAC,
+	0xD7, 0x52, 0x35, 0x70, 0xC8, 0x02, 0xBD, 0x38,
+	0x72, 0x43, 0x16, 0x2D, 0x12, 0x8C, 0xA2, 0x29,
+	0x4C, 0x83, 0x43, 0x18, 0xCC, 0x21, 0xFB, 0x14,
+	0xD2, 0xAB, 0x37, 0x3F, 0x22, 0x4E, 0x3F, 0xD4,
+	0x98, 0x43, 0x85, 0x95, 0x09, 0xF4, 0xCA, 0x1A,
+	0x1A, 0x56, 0x6C, 0x05, 0x67, 0x88, 0xA3, 0xAA,
+	0x48, 0x4A, 0xAA, 0xBD, 0xF1, 0xA0, 0x8F, 0x1B,
+	0x44, 0xC7, 0x56, 0xAB, 0x2A, 0x0C, 0x8B, 0xC5,
+	0x85, 0x1E, 0xE2, 0xEB, 0x23, 0x03, 0x4C, 0x2E,
+	0xAA, 0x5A, 0xC1, 0x5F, 0x89, 0x75, 0x1B, 0xD5,
+	0xCA, 0xE1, 0xD5, 0x90, 0x89, 0xD5, 0x00, 0x2B,
+	0xB1, 0xB3, 0xBF, 0xCA, 0x4A, 0xDE, 0x09, 0x82,
+	0xAD, 0x67, 0x83, 0xE9, 0xD3, 0x7F, 0xB3, 0xE3,
+	0x20, 0xAC, 0x98, 0x55, 0xDF, 0x66, 0x6B, 0xFD,
+	0x7C, 0x6B, 0x87, 0xA9, 0xA4, 0x6E, 0x25, 0x97,
+	0x12, 0x56, 0x11, 0x61, 0x50, 0x7E, 0x17, 0x35,
+	0x98, 0xF9, 0x88, 0xAC, 0xB6, 0xF9, 0xAB, 0x3A,
+	0x10, 0x92, 0x63, 0x24, 0x46, 0x88, 0xC7, 0x08,
+	0x78, 0x75, 0x8F, 0xF4, 0xD4, 0x31, 0x3B, 0x76,
+	0x64, 0xF0, 0xF5, 0x10, 0xE9, 0x13, 0xCA, 0x01,
+	0xC5, 0x2B, 0x3A, 0x1B, 0x46, 0x53, 0x51, 0x44,
+	0xE2, 0xDB, 0x0C, 0xAC, 0xE8, 0xA6, 0x46, 0x66,
+	0x00, 0xCF, 0x2A, 0x87, 0x83, 0x50, 0x07, 0xE1,
+	0x6A, 0xA5, 0x07, 0x80, 0x1D, 0x86, 0xB7, 0x38,
+	0x5E, 0x66, 0x9B, 0xFA, 0xF6, 0xBA, 0x1D, 0xF5,
+	0x68, 0x31, 0x63, 0xC2, 0xD5, 0x70, 0x53, 0x2F,
+	0xD7, 0x43, 0x90, 0x54, 0x64, 0x0F, 0x24, 0x4C,
+	0x52, 0x87, 0x13, 0x59, 0xD2, 0x84, 0x2F, 0xC3,
+	0x37, 0xA0, 0x60, 0x03, 0x3A, 0xF0, 0x5E, 0xAA,
+	0x00, 0x1C, 0x34, 0xFC, 0x7B, 0xD8, 0xF9, 0x10,
+	0x29, 0xE4, 0x6C, 0x29, 0x43, 0x36, 0x27, 0x64,
+	0x5D, 0x67, 0x86, 0x64, 0x21, 0xD6, 0x61, 0xAF,
+	0x25, 0x74, 0x80, 0x53, 0x2B, 0x88, 0x78, 0x50,
+	0xDC, 0x49, 0x9F, 0xFE, 0xD5, 0xB1, 0x40, 0x98,
+	0xA0, 0x33, 0x72, 0x5E, 0x82, 0x0A, 0x5B, 0xE1,
+	0x40, 0x0A, 0x0C, 0xB7, 0x03, 0x74, 0x1C, 0xA7,
+	0x4B, 0x47, 0x86, 0x73, 0xAA, 0xCF, 0x85, 0x16,
+	0x6E, 0xE8, 0xA1, 0x84, 0xDB, 0x2C, 0x58, 0x54,
+	0x9C, 0x22, 0x40, 0xB8, 0x30, 0x8C, 0x27, 0xBE,
+	0xBA, 0x40, 0xC3, 0xB9, 0xD7, 0x29, 0xED, 0xB1,
+	0x8C, 0xC2, 0x06, 0x8E, 0xCD, 0xB2, 0x7D, 0xA2,
+	0x2B, 0x2C, 0xD3, 0xE7, 0xA0, 0xBA, 0xA5, 0x30,
+	0xC5, 0x19, 0x3C, 0xD3, 0xC8, 0x6B, 0xF8, 0x6A,
+	0x44, 0xF0, 0x79, 0x9E, 0x51, 0x55, 0xB0, 0x9B,
+	0xE2, 0x50, 0x98, 0x85, 0x23, 0xB3, 0xA7, 0x31,
+	0xDD, 0x89, 0x1B, 0xC2, 0x00, 0x60, 0x11, 0xA0,
+	0x65, 0xC0, 0xAB, 0x57, 0xF1, 0xA6, 0xC1, 0x78,
+	0x89, 0x55, 0xE0, 0x13, 0x5F, 0xA5, 0xCA, 0x8F,
+	0x3E, 0x52, 0xC7, 0x5D, 0x37, 0x16, 0x97, 0x3A,
+	0x2F, 0xB2, 0x2C, 0x0E, 0xB1, 0x7C, 0x1B, 0x32,
+	0x85, 0x29, 0xD9, 0xFA, 0x76, 0x56, 0xD7, 0x4D,
+	0xEA, 0x74, 0x0D, 0x9F, 0x07, 0x97, 0x77, 0xC3,
+	0x6C, 0x17, 0xA1, 0x9C, 0x19, 0x58, 0x9E, 0x84,
+	0xD2, 0xB8, 0xE4, 0xD1, 0xBC, 0x31, 0x07, 0xCB,
+	0xD2, 0x78, 0x14, 0x22, 0x48, 0x35, 0x48, 0x44,
+	0x6C, 0x89, 0x93, 0x14, 0x77, 0x44, 0xAA, 0x9E,
+	0xC1, 0xC5, 0x93, 0xEC, 0x2D, 0x5B, 0xAA, 0xC8,
+	0x6A, 0x0A, 0xF6, 0x4A, 0x85, 0xE9, 0x09, 0xDF,
+	0x8E, 0x28, 0x16, 0x60, 0x5D, 0x20, 0xB4, 0xE3,
+	0x82, 0xB3, 0x0B, 0xBB, 0x61, 0xBF, 0x3A, 0x5F,
+	0x82, 0x1A, 0x0B, 0x5D, 0xBA, 0x9A, 0xD3, 0xE7,
+	0xE5, 0xBD, 0x1B, 0x37, 0xA7, 0x5E, 0x0F, 0x09,
+	0x29, 0x74, 0xE8, 0x46, 0xE8, 0xC3, 0x7C, 0x45,
+	0x48, 0x7D, 0x60, 0x73, 0x9F, 0x99, 0x35, 0x17,
+	0x19, 0xA5, 0x39, 0x47, 0x23, 0x26, 0x2B, 0x3B,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+uint8_t mlkem_512_ek_noseed[] = {
+	0xDF, 0x17, 0x84, 0x86, 0x77, 0x41, 0x6E, 0x95,
+	0x4D, 0x66, 0xF9, 0xB0, 0x9E, 0x12, 0x81, 0x53,
+	0x2A, 0x2E, 0x8F, 0x0C, 0x6A, 0xBE, 0x00, 0x37,
+	0xE7, 0xE8, 0x11, 0x90, 0x97, 0xC9, 0xEC, 0x84,
+	0x5A, 0xA0, 0x69, 0x85, 0xC0, 0x88, 0x55, 0x2C,
+	0x41, 0xB6, 0x15, 0x17, 0x36, 0x42, 0xC1, 0x02,
+	0x51, 0xC0, 0x6E, 0x91, 0xA2, 0x5C, 0x24, 0x3C,
+	0x02, 0x63, 0xB6, 0x75, 0xC7, 0x20, 0x7D, 0x58,
+	0x70, 0x1D, 0x13, 0xA5, 0x2E, 0xAB, 0x92, 0x56,
+	0x5E, 0xF1, 0xA1, 0xDE, 0xFB, 0xAE, 0xFE, 0x4C,
+	0x0B, 0x03, 0xF5, 0x04, 0x44, 0xA3, 0xBE, 0x20,
+	0xB1, 0x71, 0x31, 0x0B, 0xA3, 0xF2, 0x08, 0x52,
+	0xF3, 0xA2, 0xA1, 0x8E, 0x72, 0x29, 0x40, 0x70,
+	0x15, 0x64, 0x60, 0x52, 0xD2, 0xE7, 0x3A, 0xBE,
+	0xE3, 0x18, 0xD7, 0x55, 0x89, 0x9C, 0x78, 0x4A,
+	0x6F, 0xB5, 0xAA, 0xB1, 0x7C, 0x90, 0x2C, 0xB6,
+	0x8A, 0xFA, 0x36, 0x57, 0xB9, 0x01, 0x2E, 0x1B,
+	0xB8, 0xB6, 0xAA, 0xC2, 0x68, 0x9A, 0xA4, 0x8C,
+	0x2D, 0x42, 0x62, 0xBB, 0x29, 0x63, 0xB0, 0x6A,
+	0x24, 0x22, 0x82, 0x54, 0x1C, 0xF6, 0x14, 0x19,
+	0xD9, 0x0E, 0x2B, 0xD3, 0x66, 0xBE, 0xE7, 0xA4,
+	0x36, 0x9B, 0x72, 0x41, 0xA6, 0x6B, 0xF2, 0x64,
+	0x5D, 0x8E, 0x90, 0x4C, 0x3F, 0x7B, 0x30, 0x0C,
+	0x04, 0x1D, 0x56, 0x87, 0x39, 0x3D, 0x2C, 0xA9,
+	0x29, 0x75, 0xCB, 0xFD, 0xC0, 0x18, 0xDD, 0xC6,
+	0x0A, 0xF5, 0x62, 0x00, 0x9E, 0xB0, 0x88, 0x8E,
+	0x5A, 0x05, 0x76, 0x24, 0x6A, 0xCE, 0x74, 0x5B,
+	0xB1, 0x63, 0x40, 0x8B, 0x5A, 0x9A, 0xE3, 0xC1,
+	0x94, 0xA8, 0x5C, 0x21, 0x90, 0x7B, 0x37, 0xB1,
+	0x62, 0x8E, 0xCD, 0x9A, 0x15, 0xEC, 0x20, 0x24,
+	0x87, 0x30, 0x27, 0x34, 0x44, 0xB0, 0xA2, 0xF4,
+	0x54, 0xF9, 0xB4, 0x73, 0x0F, 0x33, 0x91, 0x50,
+	0x47, 0x6E, 0xE0, 0x70, 0x98, 0xF6, 0xBC, 0x1B,
+	0x97, 0xCC, 0x1B, 0xD3, 0xB8, 0xC1, 0xA2, 0xEB,
+	0x0E, 0x50, 0xA7, 0x82, 0xF2, 0x11, 0x5D, 0xF6,
+	0x17, 0x49, 0x6F, 0x6C, 0x6F, 0x8C, 0x09, 0xB0,
+	0x5F, 0x88, 0x8D, 0x9E, 0x93, 0x3D, 0x28, 0x77,
+	0x46, 0xC6, 0x31, 0xB3, 0x10, 0x87, 0x26, 0xB0,
+	0xC4, 0xA7, 0xC8, 0x8B, 0x09, 0xC8, 0x60, 0xAC,
+	0xD7, 0x52, 0x35, 0x70, 0xC8, 0x02, 0xBD, 0x38,
+	0x72, 0x43, 0x16, 0x2D, 0x12, 0x8C, 0xA2, 0x29,
+	0x4C, 0x83, 0x43, 0x18, 0xCC, 0x21, 0xFB, 0x14,
+	0xD2, 0xAB, 0x37, 0x3F, 0x22, 0x4E, 0x3F, 0xD4,
+	0x98, 0x43, 0x85, 0x95, 0x09, 0xF4, 0xCA, 0x1A,
+	0x1A, 0x56, 0x6C, 0x05, 0x67, 0x88, 0xA3, 0xAA,
+	0x48, 0x4A, 0xAA, 0xBD, 0xF1, 0xA0, 0x8F, 0x1B,
+	0x44, 0xC7, 0x56, 0xAB, 0x2A, 0x0C, 0x8B, 0xC5,
+	0x85, 0x1E, 0xE2, 0xEB, 0x23, 0x03, 0x4C, 0x2E,
+	0xAA, 0x5A, 0xC1, 0x5F, 0x89, 0x75, 0x1B, 0xD5,
+	0xCA, 0xE1, 0xD5, 0x90, 0x89, 0xD5, 0x00, 0x2B,
+	0xB1, 0xB3, 0xBF, 0xCA, 0x4A, 0xDE, 0x09, 0x82,
+	0xAD, 0x67, 0x83, 0xE9, 0xD3, 0x7F, 0xB3, 0xE3,
+	0x20, 0xAC, 0x98, 0x55, 0xDF, 0x66, 0x6B, 0xFD,
+	0x7C, 0x6B, 0x87, 0xA9, 0xA4, 0x6E, 0x25, 0x97,
+	0x12, 0x56, 0x11, 0x61, 0x50, 0x7E, 0x17, 0x35,
+	0x98, 0xF9, 0x88, 0xAC, 0xB6, 0xF9, 0xAB, 0x3A,
+	0x10, 0x92, 0x63, 0x24, 0x46, 0x88, 0xC7, 0x08,
+	0x78, 0x75, 0x8F, 0xF4, 0xD4, 0x31, 0x3B, 0x76,
+	0x64, 0xF0, 0xF5, 0x10, 0xE9, 0x13, 0xCA, 0x01,
+	0xC5, 0x2B, 0x3A, 0x1B, 0x46, 0x53, 0x51, 0x44,
+	0xE2, 0xDB, 0x0C, 0xAC, 0xE8, 0xA6, 0x46, 0x66,
+	0x00, 0xCF, 0x2A, 0x87, 0x83, 0x50, 0x07, 0xE1,
+	0x6A, 0xA5, 0x07, 0x80, 0x1D, 0x86, 0xB7, 0x38,
+	0x5E, 0x66, 0x9B, 0xFA, 0xF6, 0xBA, 0x1D, 0xF5,
+	0x68, 0x31, 0x63, 0xC2, 0xD5, 0x70, 0x53, 0x2F,
+	0xD7, 0x43, 0x90, 0x54, 0x64, 0x0F, 0x24, 0x4C,
+	0x52, 0x87, 0x13, 0x59, 0xD2, 0x84, 0x2F, 0xC3,
+	0x37, 0xA0, 0x60, 0x03, 0x3A, 0xF0, 0x5E, 0xAA,
+	0x00, 0x1C, 0x34, 0xFC, 0x7B, 0xD8, 0xF9, 0x10,
+	0x29, 0xE4, 0x6C, 0x29, 0x43, 0x36, 0x27, 0x64,
+	0x5D, 0x67, 0x86, 0x64, 0x21, 0xD6, 0x61, 0xAF,
+	0x25, 0x74, 0x80, 0x53, 0x2B, 0x88, 0x78, 0x50,
+	0xDC, 0x49, 0x9F, 0xFE, 0xD5, 0xB1, 0x40, 0x98,
+	0xA0, 0x33, 0x72, 0x5E, 0x82, 0x0A, 0x5B, 0xE1,
+	0x40, 0x0A, 0x0C, 0xB7, 0x03, 0x74, 0x1C, 0xA7,
+	0x4B, 0x47, 0x86, 0x73, 0xAA, 0xCF, 0x85, 0x16,
+	0x6E, 0xE8, 0xA1, 0x84, 0xDB, 0x2C, 0x58, 0x54,
+	0x9C, 0x22, 0x40, 0xB8, 0x30, 0x8C, 0x27, 0xBE,
+	0xBA, 0x40, 0xC3, 0xB9, 0xD7, 0x29, 0xED, 0xB1,
+	0x8C, 0xC2, 0x06, 0x8E, 0xCD, 0xB2, 0x7D, 0xA2,
+	0x2B, 0x2C, 0xD3, 0xE7, 0xA0, 0xBA, 0xA5, 0x30,
+	0xC5, 0x19, 0x3C, 0xD3, 0xC8, 0x6B, 0xF8, 0x6A,
+	0x44, 0xF0, 0x79, 0x9E, 0x51, 0x55, 0xB0, 0x9B,
+	0xE2, 0x50, 0x98, 0x85, 0x23, 0xB3, 0xA7, 0x31,
+	0xDD, 0x89, 0x1B, 0xC2, 0x00, 0x60, 0x11, 0xA0,
+	0x65, 0xC0, 0xAB, 0x57, 0xF1, 0xA6, 0xC1, 0x78,
+	0x89, 0x55, 0xE0, 0x13, 0x5F, 0xA5, 0xCA, 0x8F,
+	0x3E, 0x52, 0xC7, 0x5D, 0x37, 0x16, 0x97, 0x3A,
+	0x2F, 0xB2, 0x2C, 0x0E, 0xB1, 0x7C, 0x1B, 0x32,
+	0x85, 0x29, 0xD9, 0xFA, 0x76, 0x56, 0xD7, 0x4D,
+	0xEA, 0x74, 0x0D, 0x9F, 0x07, 0x97, 0x77, 0xC3,
+	0x6C, 0x17, 0xA1, 0x9C, 0x19, 0x58, 0x9E, 0x84,
+	0xD2, 0xB8, 0xE4, 0xD1, 0xBC, 0x31, 0x07, 0xCB,
+	0xD2, 0x78, 0x14, 0x22, 0x48, 0x35, 0x48, 0x44,
+	0x6C, 0x89, 0x93, 0x14, 0x77, 0x44, 0xAA, 0x9E,
+	0xC1, 0xC5, 0x93, 0xEC, 0x2D, 0x5B, 0xAA, 0xC8,
+	0x6A, 0x0A, 0xF6, 0x4A, 0x85, 0xE9, 0x09, 0xDF,
+	0x8E, 0x28, 0x16, 0x60, 0x5D, 0x20, 0xB4, 0xE3,
+	0x82, 0xB3, 0x0B, 0xBB, 0x61, 0xBF, 0x3A, 0x5F,
+	0x82, 0x1A, 0x0B, 0x5D, 0xBA, 0x9A, 0xD3, 0xE7,
+};
+
+struct crypto_testsuite_mlkem_params mlkem_keygen_test_vectors[] = {
+	{
+		.name = "mlkem_512_keygen",
+		.param = RTE_CRYPTO_ML_KEM_PARAM_512,
+		.d = {
+			.data = mlkem_512_d,
+			.length = sizeof(mlkem_512_d),
+		},
+		.z = {
+			.data = mlkem_512_z,
+			.length = sizeof(mlkem_512_z),
+		},
+	},
+	{
+		.name = "mlkem_512_keygen (deterministic)",
+		.param = RTE_CRYPTO_ML_KEM_PARAM_512,
+		.d = {
+			.data = (uint8_t [32]) {0},
+			.length = 32,
+		},
+		.z = {
+			.data = (uint8_t [32]) {0},
+			.length = 32,
+		},
+		.dk = {
+			.data = mlkem_512_dk_noseed,
+			.length = sizeof(mlkem_512_dk_noseed),
+		},
+		.ek = {
+			.data = mlkem_512_ek_noseed,
+			.length = sizeof(mlkem_512_ek_noseed),
+		}
+	},
+};
+
+struct crypto_testsuite_mlkem_params mlkem_encap_test_vectors[] = {
+	{
+		.name = "mlkem_512_encap",
+		.param = RTE_CRYPTO_ML_KEM_PARAM_512,
+		.dk = {
+			.data = mlkem_512_dk,
+			.length = sizeof(mlkem_512_dk),
+		},
+		.ek = {
+			.data = mlkem_512_ek,
+			.length = sizeof(mlkem_512_ek),
+		},
+		.message = {
+			.data = NULL,
+			.length = 0,
+		},
+	},
+	{
+		.name = "mlkem_512_encap (deterministic)",
+		.param = RTE_CRYPTO_ML_KEM_PARAM_512,
+		.dk = {
+			.data = mlkem_512_dk,
+			.length = sizeof(mlkem_512_dk),
+		},
+		.ek = {
+			.data = mlkem_512_ek,
+			.length = sizeof(mlkem_512_ek),
+		},
+		.message = {
+			.data = mlkem_512_message,
+			.length = 32,
+		},
+		.cipher = {
+			.data = mlkem_512_cipher,
+			.length = sizeof(mlkem_512_cipher),
+		},
+		.sk = {
+			.data = mlkem_512_sk,
+			.length = sizeof(mlkem_512_sk),
+		},
+	},
+};
+
+struct crypto_testsuite_mlkem_params mlkem_decap_test_vectors[] = {
+	{
+		.name = "mlkem_512_decap",
+		.param = RTE_CRYPTO_ML_KEM_PARAM_512,
+		.cipher = {
+			.data = mlkem_512_cipher,
+			.length = sizeof(mlkem_512_cipher),
+		},
+		.dk = {
+			.data = mlkem_512_dk,
+			.length = sizeof(mlkem_512_dk),
+		},
+		.sk = {
+			.data = mlkem_512_sk,
+			.length = sizeof(mlkem_512_sk),
+		},
+	}
+};
+
+#endif /* __TEST_CRYPTODEV_ML_KEM_TEST_VECTORS_H__ */
-- 
2.37.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* RE: [PATCH v1 0/3] cryptodev: support PQC ML algorithms
  2025-09-30 18:03 ` [PATCH v1 0/3] " Gowrishankar Muthukrishnan
                     ` (2 preceding siblings ...)
  2025-09-30 18:03   ` [PATCH v1 3/3] app/test: add ML crypto test vectors Gowrishankar Muthukrishnan
@ 2025-10-01  5:49   ` Akhil Goyal
  2025-10-01  7:37   ` [PATCH v2 " Gowrishankar Muthukrishnan
  4 siblings, 0 replies; 10+ messages in thread
From: Akhil Goyal @ 2025-10-01  5:49 UTC (permalink / raw)
  To: Gowrishankar Muthukrishnan, dev, Fan Zhang, Kai Ji
  Cc: Anoob Joseph, Gowrishankar Muthukrishnan

> Subject: [PATCH v1 0/3] cryptodev: support PQC ML algorithms
> 
> This series added support for PQC ML-KEM and ML-DSA algorithms.
> 
> Gowrishankar Muthukrishnan (3):
>   cryptodev: support PQC ML algorithms
>   crypto/openssl: add ML crypto support
>   app/test: add ML crypto test vectors
> 
>  app/test/test_cryptodev_asym.c                |  856 ++++++++
>  app/test/test_cryptodev_ml_dsa_test_vectors.h | 1856 +++++++++++++++++
>  app/test/test_cryptodev_ml_kem_test_vectors.h |  873 ++++++++
>  doc/guides/cryptodevs/features/default.ini    |    2 +
>  doc/guides/cryptodevs/features/openssl.ini    |    2 +
>  doc/guides/prog_guide/cryptodev_lib.rst       |    3 +-
>  doc/guides/rel_notes/release_25_11.rst        |   11 +
>  drivers/crypto/openssl/openssl_pmd_private.h  |   16 +
>  drivers/crypto/openssl/rte_openssl_pmd.c      |  868 ++++++++
>  drivers/crypto/openssl/rte_openssl_pmd_ops.c  |  129 ++
>  lib/cryptodev/rte_crypto_asym.h               |  306 +++
>  lib/cryptodev/rte_cryptodev.c                 |   60 +
>  lib/cryptodev/rte_cryptodev.h                 |   15 +-
>  13 files changed, 4994 insertions(+), 3 deletions(-)
>  create mode 100644 app/test/test_cryptodev_ml_dsa_test_vectors.h
>  create mode 100644 app/test/test_cryptodev_ml_kem_test_vectors.h

Please fix compilation on lower OpenSSL versions.

> 
> --
> 2.37.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2 0/3] cryptodev: support PQC ML algorithms
  2025-09-30 18:03 ` [PATCH v1 0/3] " Gowrishankar Muthukrishnan
                     ` (3 preceding siblings ...)
  2025-10-01  5:49   ` [PATCH v1 0/3] cryptodev: support PQC ML algorithms Akhil Goyal
@ 2025-10-01  7:37   ` Gowrishankar Muthukrishnan
  2025-10-01  7:37     ` [PATCH v2 1/3] " Gowrishankar Muthukrishnan
                       ` (2 more replies)
  4 siblings, 3 replies; 10+ messages in thread
From: Gowrishankar Muthukrishnan @ 2025-10-01  7:37 UTC (permalink / raw)
  To: dev, Akhil Goyal, Fan Zhang, Kai Ji; +Cc: anoobj, Gowrishankar Muthukrishnan

This series added support for PQC ML-KEM and ML-DSA algorithms.

Gowrishankar Muthukrishnan (3):
  cryptodev: support PQC ML algorithms
  crypto/openssl: add ML crypto support
  app/test: add ML crypto test vectors

 app/test/test_cryptodev_asym.c                |  856 ++++++++
 app/test/test_cryptodev_ml_dsa_test_vectors.h | 1856 +++++++++++++++++
 app/test/test_cryptodev_ml_kem_test_vectors.h |  873 ++++++++
 doc/guides/cryptodevs/features/default.ini    |    2 +
 doc/guides/cryptodevs/features/openssl.ini    |    2 +
 doc/guides/prog_guide/cryptodev_lib.rst       |    3 +-
 doc/guides/rel_notes/release_25_11.rst        |   11 +
 drivers/crypto/openssl/openssl_pmd_private.h  |   16 +
 drivers/crypto/openssl/rte_openssl_pmd.c      |  870 ++++++++
 drivers/crypto/openssl/rte_openssl_pmd_ops.c  |  131 ++
 lib/cryptodev/rte_crypto_asym.h               |  306 +++
 lib/cryptodev/rte_cryptodev.c                 |   60 +
 lib/cryptodev/rte_cryptodev.h                 |   15 +-
 13 files changed, 4998 insertions(+), 3 deletions(-)
 create mode 100644 app/test/test_cryptodev_ml_dsa_test_vectors.h
 create mode 100644 app/test/test_cryptodev_ml_kem_test_vectors.h

-- 
2.37.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2 1/3] cryptodev: support PQC ML algorithms
  2025-10-01  7:37   ` [PATCH v2 " Gowrishankar Muthukrishnan
@ 2025-10-01  7:37     ` Gowrishankar Muthukrishnan
  2025-10-01  7:37     ` [PATCH v2 2/3] crypto/openssl: add ML crypto support Gowrishankar Muthukrishnan
  2025-10-01  7:37     ` [PATCH v2 3/3] app/test: add ML crypto test vectors Gowrishankar Muthukrishnan
  2 siblings, 0 replies; 10+ messages in thread
From: Gowrishankar Muthukrishnan @ 2025-10-01  7:37 UTC (permalink / raw)
  To: dev, Akhil Goyal, Fan Zhang, Kai Ji; +Cc: anoobj, Gowrishankar Muthukrishnan

Add support for PQC ML-KEM and ML-DSA algorithms.

Signed-off-by: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
---
 doc/guides/cryptodevs/features/default.ini |   2 +
 doc/guides/prog_guide/cryptodev_lib.rst    |   3 +-
 doc/guides/rel_notes/release_25_11.rst     |  11 +
 lib/cryptodev/rte_crypto_asym.h            | 306 +++++++++++++++++++++
 lib/cryptodev/rte_cryptodev.c              |  60 ++++
 lib/cryptodev/rte_cryptodev.h              |  15 +-
 6 files changed, 394 insertions(+), 3 deletions(-)

diff --git a/doc/guides/cryptodevs/features/default.ini b/doc/guides/cryptodevs/features/default.ini
index 116ffce249..64198f013a 100644
--- a/doc/guides/cryptodevs/features/default.ini
+++ b/doc/guides/cryptodevs/features/default.ini
@@ -134,6 +134,8 @@ ECPM                    =
 ECDH                    =
 SM2                     =
 EdDSA                   =
+ML-DSA                  =
+ML-KEM                  =
 
 ;
 ; Supported Operating systems of a default crypto driver.
diff --git a/doc/guides/prog_guide/cryptodev_lib.rst b/doc/guides/prog_guide/cryptodev_lib.rst
index b54efcb74e..f0ee44eb54 100644
--- a/doc/guides/prog_guide/cryptodev_lib.rst
+++ b/doc/guides/prog_guide/cryptodev_lib.rst
@@ -928,7 +928,8 @@ Asymmetric Cryptography
 The cryptodev library currently provides support for the following asymmetric
 Crypto operations; RSA, Modular exponentiation and inversion, Diffie-Hellman and
 Elliptic Curve Diffie-Hellman public and/or private key generation and shared
-secret compute, DSA and EdDSA signature generation and verification.
+secret compute, DSA and EdDSA signature generation and verification,
+PQC ML-KEM and ML-DSA algorithms.
 
 Session and Session Management
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/guides/rel_notes/release_25_11.rst b/doc/guides/rel_notes/release_25_11.rst
index c3b94e1896..9d47f762d7 100644
--- a/doc/guides/rel_notes/release_25_11.rst
+++ b/doc/guides/rel_notes/release_25_11.rst
@@ -76,6 +76,14 @@ New Features
   * Added multi-process per port.
   * Optimized code.
 
+* **Added PQC ML-KEM and ML-DSA support.**
+
+  * Added PQC ML-KEM support with reference to FIPS203.
+  * Added PQC ML-DSA support with reference to FIPS204.
+
+* **Updated openssl crypto driver.**
+
+  * Added support for PQC ML-KEM and ML-DSA algorithms.
 
 Removed Items
 -------------
@@ -138,6 +146,9 @@ ABI Changes
 * stack: The structure ``rte_stack_lf_head`` alignment has been updated to 16 bytes
   to avoid unaligned accesses.
 
+* cryptodev: The enum ``rte_crypto_asym_xform_type``, struct ``rte_crypto_asym_xform``
+  and struct ``rte_crypto_asym_op`` are updated to include new values to support
+  ML-KEM and ML-DSA.
 
 Known Issues
 ------------
diff --git a/lib/cryptodev/rte_crypto_asym.h b/lib/cryptodev/rte_crypto_asym.h
index 9787b710e7..14a0e57467 100644
--- a/lib/cryptodev/rte_crypto_asym.h
+++ b/lib/cryptodev/rte_crypto_asym.h
@@ -37,6 +37,20 @@ rte_crypto_asym_ke_strings[];
 extern const char *
 rte_crypto_asym_op_strings[];
 
+/** PQC ML crypto op parameters size */
+extern const uint16_t
+rte_crypto_ml_kem_pubkey_size[];
+extern const uint16_t
+rte_crypto_ml_kem_privkey_size[];
+extern const uint16_t
+rte_crypto_ml_kem_cipher_size[];
+extern const uint16_t
+rte_crypto_ml_dsa_pubkey_size[];
+extern const uint16_t
+rte_crypto_ml_dsa_privkey_size[];
+extern const uint16_t
+rte_crypto_ml_dsa_sign_size[];
+
 #ifdef __cplusplus
 }
 #endif
@@ -144,6 +158,14 @@ enum rte_crypto_asym_xform_type {
 	/**< Edwards Curve Digital Signature Algorithm
 	 * Perform Signature Generation and Verification.
 	 */
+	RTE_CRYPTO_ASYM_XFORM_ML_KEM,
+	/**< Module Lattice based Key Encapsulation Mechanism
+	 * Performs Key Pair Generation, Encapsulation and Decapsulation.
+	 */
+	RTE_CRYPTO_ASYM_XFORM_ML_DSA
+	/**< Module Lattice based Digital Signature Algorithm
+	 * Performs Key Pair Generation, Signature Generation and Verification.
+	 */
 };
 
 /**
@@ -720,6 +742,282 @@ struct rte_crypto_sm2_op_param {
 	 */
 };
 
+/**
+ * PQC ML-KEM algorithms
+ *
+ * List of ML-KEM algorithms used in PQC
+ */
+enum rte_crypto_ml_kem_param_set {
+	RTE_CRYPTO_ML_KEM_PARAM_NONE,
+	RTE_CRYPTO_ML_KEM_PARAM_512,
+	RTE_CRYPTO_ML_KEM_PARAM_768,
+	RTE_CRYPTO_ML_KEM_PARAM_1024,
+};
+
+/**
+ * PQC ML-KEM op types
+ *
+ * List of ML-KEM op types in PQC
+ */
+enum rte_crypto_ml_kem_op_type {
+	RTE_CRYPTO_ML_KEM_OP_KEYGEN,
+	RTE_CRYPTO_ML_KEM_OP_KEYVER,
+	RTE_CRYPTO_ML_KEM_OP_ENCAP,
+	RTE_CRYPTO_ML_KEM_OP_DECAP,
+	RTE_CRYPTO_ML_KEM_OP_END
+};
+
+/**
+ * PQC ML-KEM transform data
+ *
+ * Structure describing ML-KEM xform params
+ */
+struct rte_crypto_ml_kem_xform {
+	enum rte_crypto_ml_kem_param_set param;
+};
+
+/**
+ * PQC ML-KEM KEYGEN op
+ *
+ * Parameters for PQC ML-KEM key generation operation
+ */
+struct rte_crypto_ml_kem_keygen_op {
+	rte_crypto_param d;
+	/**< The seed d value (of 32 bytes in length) to generate key pair.*/
+
+	rte_crypto_param z;
+	/**< The seed z value (of 32 bytes in length) to generate key pair.*/
+
+	rte_crypto_param ek;
+	/**<
+	 * Pointer to output data
+	 * - The computed encapsulation key.
+	 * - Refer `rte_crypto_ml_kem_pubkey_size` for size of buffer.
+	 */
+
+	rte_crypto_param dk;
+	/**<
+	 * Pointer to output data
+	 * - The computed decapsulation key.
+	 * - Refer `rte_crypto_ml_kem_privkey_size` for size of buffer.
+	 */
+};
+
+/**
+ * PQC ML-KEM KEYVER op
+ *
+ * Parameters for PQC ML-KEM key verification operation
+ */
+struct rte_crypto_ml_kem_keyver_op {
+	enum rte_crypto_ml_kem_op_type op;
+	/**<
+	 * Op associated with key to be verified is one of below:
+	 * - Encapsulation op
+	 * - Decapsulation op
+	 */
+
+	rte_crypto_param key;
+	/**<
+	 * KEM key to check.
+	 * - ek in case of encapsulation op.
+	 * - dk in case of decapsulation op.
+	 */
+};
+
+/**
+ * PQC ML-KEM ENCAP op
+ *
+ * Parameters for PQC ML-KEM encapsulation operation
+ */
+struct rte_crypto_ml_kem_encap_op {
+	rte_crypto_param message;
+	/**< The message (of 32 bytes in length) for randomness.*/
+
+	rte_crypto_param ek;
+	/**< The encapsulation key.*/
+
+	rte_crypto_param cipher;
+	/**<
+	 * Pointer to output data
+	 * - The computed cipher.
+	 * - Refer `rte_crypto_ml_kem_cipher_size` for size of buffer.
+	 */
+
+	rte_crypto_param sk;
+	/**<
+	 * Pointer to output data
+	 * - The computed shared secret key (32 bytes).
+	 */
+};
+
+/**
+ * PQC ML-KEM DECAP op
+ *
+ * Parameters for PQC ML-KEM decapsulation operation
+ */
+struct rte_crypto_ml_kem_decap_op {
+	rte_crypto_param cipher;
+	/**< The cipher to be decapsulated.*/
+
+	rte_crypto_param dk;
+	/**< The decapsulation key.*/
+
+	rte_crypto_param sk;
+	/**<
+	 * Pointer to output data
+	 * - The computed shared secret key (32 bytes).
+	 */
+};
+
+/**
+ * PQC ML-KEM op
+ *
+ * Parameters for PQC ML-KEM operation
+ */
+struct rte_crypto_ml_kem_op {
+	enum rte_crypto_ml_kem_op_type op;
+	union {
+		struct rte_crypto_ml_kem_keygen_op keygen;
+		struct rte_crypto_ml_kem_keyver_op keyver;
+		struct rte_crypto_ml_kem_encap_op encap;
+		struct rte_crypto_ml_kem_decap_op decap;
+	};
+};
+
+/**
+ * PQC ML-DSA algorithms
+ *
+ * List of ML-DSA algorithms used in PQC
+ */
+enum rte_crypto_ml_dsa_param_set {
+	RTE_CRYPTO_ML_DSA_PARAM_NONE,
+	RTE_CRYPTO_ML_DSA_PARAM_44,
+	RTE_CRYPTO_ML_DSA_PARAM_65,
+	RTE_CRYPTO_ML_DSA_PARAM_87,
+};
+
+/**
+ * PQC ML-DSA op types
+ *
+ * List of ML-DSA op types in PQC
+ */
+enum rte_crypto_ml_dsa_op_type {
+	RTE_CRYPTO_ML_DSA_OP_KEYGEN,
+	RTE_CRYPTO_ML_DSA_OP_SIGN,
+	RTE_CRYPTO_ML_DSA_OP_VERIFY,
+	RTE_CRYPTO_ML_DSA_OP_END
+};
+
+/**
+ * PQC ML-DSA transform data
+ *
+ * Structure describing ML-DSA xform params
+ */
+struct rte_crypto_ml_dsa_xform {
+	enum rte_crypto_ml_dsa_param_set param;
+
+	bool sign_deterministic;
+	/**< The signature generated using deterministic method. */
+
+	bool sign_prehash;
+	/**< The signature generated using prehash or pure routine. */
+};
+
+/**
+ * PQC ML-DSA KEYGEN op
+ *
+ * Parameters for PQC ML-DSA key generation operation
+ */
+struct rte_crypto_ml_dsa_keygen_op {
+	rte_crypto_param seed;
+	/**< The random seed (of 32 bytes in length) to generate key pair.*/
+
+	rte_crypto_param pubkey;
+	/**<
+	 * Pointer to output data
+	 * - The computed public key.
+	 * - Refer `rte_crypto_ml_dsa_pubkey_size` for size of buffer.
+	 */
+
+	rte_crypto_param privkey;
+	/**<
+	 * Pointer to output data
+	 * - The computed secret key.
+	 * - Refer `rte_crypto_ml_dsa_privkey_size` for size of buffer.
+	 */
+};
+
+/**
+ * PQC ML-DSA SIGGEN op
+ *
+ * Parameters for PQC ML-DSA sign operation
+ */
+struct rte_crypto_ml_dsa_siggen_op {
+	rte_crypto_param message;
+	/**< The message to generate signature.*/
+
+	rte_crypto_param mu;
+	/**< The mu to generate signature.*/
+
+	rte_crypto_param privkey;
+	/**< The secret key to generate signature.*/
+
+	rte_crypto_param seed;
+	/**< The seed to generate signature.*/
+
+	rte_crypto_param ctx;
+	/**< The context key to generate signature.*/
+
+	enum rte_crypto_auth_algorithm hash;
+	/**< Hash function to generate signature. */
+
+	rte_crypto_param sign;
+	/**<
+	 * Pointer to output data
+	 * - The computed signature.
+	 * - Refer `rte_crypto_ml_dsa_sign_size` for size of buffer.
+	 */
+};
+
+/**
+ * PQC ML-DSA SIGVER op
+ *
+ * Parameters for PQC ML-DSA verify operation
+ */
+struct rte_crypto_ml_dsa_sigver_op {
+	rte_crypto_param pubkey;
+	/**< The public key to verify signature.*/
+
+	rte_crypto_param message;
+	/**< The message used to verify signature.*/
+
+	rte_crypto_param sign;
+	/**< The signature to verify.*/
+
+	rte_crypto_param mu;
+	/**< The mu used to generate signature.*/
+
+	rte_crypto_param ctx;
+	/**< The context key to generate signature.*/
+
+	enum rte_crypto_auth_algorithm hash;
+	/**< Hash function to generate signature. */
+};
+
+/**
+ * PQC ML-DSA op
+ *
+ * Parameters for PQC ML-DSA operation
+ */
+struct rte_crypto_ml_dsa_op {
+	enum rte_crypto_ml_dsa_op_type op;
+	union {
+		struct rte_crypto_ml_dsa_keygen_op keygen;
+		struct rte_crypto_ml_dsa_siggen_op siggen;
+		struct rte_crypto_ml_dsa_sigver_op sigver;
+	};
+};
+
 /**
  * Asymmetric crypto transform data
  *
@@ -751,6 +1049,12 @@ struct rte_crypto_asym_xform {
 		/**< EC xform parameters, used by elliptic curve based
 		 * operations.
 		 */
+
+		struct rte_crypto_ml_kem_xform mlkem;
+		/**< PQC ML-KEM xform parameters */
+
+		struct rte_crypto_ml_dsa_xform mldsa;
+		/**< PQC ML-DSA xform parameters */
 	};
 };
 
@@ -778,6 +1082,8 @@ struct rte_crypto_asym_op {
 		struct rte_crypto_ecpm_op_param ecpm;
 		struct rte_crypto_sm2_op_param sm2;
 		struct rte_crypto_eddsa_op_param eddsa;
+		struct rte_crypto_ml_kem_op mlkem;
+		struct rte_crypto_ml_dsa_op mldsa;
 	};
 	uint16_t flags;
 	/**<
diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c
index bb7bab4dd5..fd40c8a64c 100644
--- a/lib/cryptodev/rte_cryptodev.c
+++ b/lib/cryptodev/rte_cryptodev.c
@@ -229,6 +229,66 @@ const char *rte_crypto_asym_ke_strings[] = {
 	[RTE_CRYPTO_ASYM_KE_PUB_KEY_VERIFY] = "pub_ec_key_verify"
 };
 
+/**
+ * Public key size used in PQC ML-KEM based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_kem_pubkey_size)
+const uint16_t rte_crypto_ml_kem_pubkey_size[] = {
+	[RTE_CRYPTO_ML_KEM_PARAM_512] = 800,
+	[RTE_CRYPTO_ML_KEM_PARAM_768] = 1184,
+	[RTE_CRYPTO_ML_KEM_PARAM_1024] = 1568,
+};
+
+/**
+ * Private key size used in PQC ML-KEM based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_kem_privkey_size)
+const uint16_t rte_crypto_ml_kem_privkey_size[] = {
+	[RTE_CRYPTO_ML_KEM_PARAM_512] = 1632,
+	[RTE_CRYPTO_ML_KEM_PARAM_768] = 2400,
+	[RTE_CRYPTO_ML_KEM_PARAM_1024] = 3168,
+};
+
+/**
+ * Cipher size used in PQC ML-KEM based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_kem_cipher_size)
+const uint16_t rte_crypto_ml_kem_cipher_size[] = {
+	[RTE_CRYPTO_ML_KEM_PARAM_512] = 768,
+	[RTE_CRYPTO_ML_KEM_PARAM_768] = 1088,
+	[RTE_CRYPTO_ML_KEM_PARAM_1024] = 1568,
+};
+
+/**
+ * Public key size used in PQC ML-DSA based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_dsa_pubkey_size)
+const uint16_t rte_crypto_ml_dsa_pubkey_size[] = {
+	[RTE_CRYPTO_ML_DSA_PARAM_44] = 1312,
+	[RTE_CRYPTO_ML_DSA_PARAM_65] = 1952,
+	[RTE_CRYPTO_ML_DSA_PARAM_87] = 2592,
+};
+
+/**
+ * Private key size used in PQC ML-DSA based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_dsa_privkey_size)
+const uint16_t rte_crypto_ml_dsa_privkey_size[] = {
+	[RTE_CRYPTO_ML_DSA_PARAM_44] = 2560,
+	[RTE_CRYPTO_ML_DSA_PARAM_65] = 4032,
+	[RTE_CRYPTO_ML_DSA_PARAM_87] = 4896,
+};
+
+/**
+ * Sign size used in PQC ML-KEM based crypto ops.
+ */
+RTE_EXPORT_SYMBOL(rte_crypto_ml_dsa_sign_size)
+const uint16_t rte_crypto_ml_dsa_sign_size[] = {
+	[RTE_CRYPTO_ML_DSA_PARAM_44] = 2420,
+	[RTE_CRYPTO_ML_DSA_PARAM_65] = 3309,
+	[RTE_CRYPTO_ML_DSA_PARAM_87] = 4627,
+};
+
 struct rte_cryptodev_sym_session_pool_private_data {
 	uint16_t sess_data_sz;
 	/**< driver session data size */
diff --git a/lib/cryptodev/rte_cryptodev.h b/lib/cryptodev/rte_cryptodev.h
index eaf0e50d37..37a6a5e49b 100644
--- a/lib/cryptodev/rte_cryptodev.h
+++ b/lib/cryptodev/rte_cryptodev.h
@@ -167,10 +167,13 @@ struct rte_cryptodev_asymmetric_xform_capability {
 	uint32_t op_types;
 	/**<
 	 * Bitmask for supported rte_crypto_asym_op_type or
+	 * rte_crypto_ml_kem_op_type or rte_crypto_ml_dsa_op_type or
 	 * rte_crypto_asym_ke_type. Which enum is used is determined
 	 * by the rte_crypto_asym_xform_type. For key exchange algorithms
-	 * like Diffie-Hellman it is rte_crypto_asym_ke_type, for others
-	 * it is rte_crypto_asym_op_type.
+	 * like Diffie-Hellman it is rte_crypto_asym_ke_type,
+	 * for ML-KEM algorithms it is rte_crypto_ml_kem_op_type,
+	 * for ML-DSA algorithms it is rte_crypto_ml_dsa_op_type,
+	 * or others it is rte_crypto_asym_op_type.
 	 */
 
 	__extension__
@@ -188,6 +191,12 @@ struct rte_cryptodev_asymmetric_xform_capability {
 
 		uint32_t op_capa[RTE_CRYPTO_ASYM_OP_LIST_END];
 		/**< Operation specific capabilities. */
+
+		uint32_t mlkem_capa[RTE_CRYPTO_ML_KEM_OP_END];
+		/**< Bitmask of supported ML-KEM parameter sets. */
+
+		uint32_t mldsa_capa[RTE_CRYPTO_ML_DSA_OP_END];
+		/**< Bitmask of supported ML-DSA parameter sets. */
 	};
 
 	uint64_t hash_algos;
@@ -577,6 +586,8 @@ rte_cryptodev_asym_get_xform_string(enum rte_crypto_asym_xform_type xform_enum);
 /**< Support inner checksum computation/verification */
 #define RTE_CRYPTODEV_FF_SECURITY_RX_INJECT		(1ULL << 28)
 /**< Support Rx injection after security processing */
+#define RTE_CRYPTODEV_FF_MLDSA_SIGN_PREHASH		(1ULL << 29)
+/**< Support Pre Hash ML-DSA Signature Generation */
 
 /**
  * Get the name of a crypto device feature flag
-- 
2.37.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2 2/3] crypto/openssl: add ML crypto support
  2025-10-01  7:37   ` [PATCH v2 " Gowrishankar Muthukrishnan
  2025-10-01  7:37     ` [PATCH v2 1/3] " Gowrishankar Muthukrishnan
@ 2025-10-01  7:37     ` Gowrishankar Muthukrishnan
  2025-10-01  7:37     ` [PATCH v2 3/3] app/test: add ML crypto test vectors Gowrishankar Muthukrishnan
  2 siblings, 0 replies; 10+ messages in thread
From: Gowrishankar Muthukrishnan @ 2025-10-01  7:37 UTC (permalink / raw)
  To: dev, Akhil Goyal, Fan Zhang, Kai Ji; +Cc: anoobj, Gowrishankar Muthukrishnan

Add ML-KEM and ML-DSA support.

Signed-off-by: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
---
v2:
 - compilation fixed for unsupported openssl versions.
---
 doc/guides/cryptodevs/features/openssl.ini   |   2 +
 drivers/crypto/openssl/openssl_pmd_private.h |  16 +
 drivers/crypto/openssl/rte_openssl_pmd.c     | 870 +++++++++++++++++++
 drivers/crypto/openssl/rte_openssl_pmd_ops.c | 131 +++
 4 files changed, 1019 insertions(+)

diff --git a/doc/guides/cryptodevs/features/openssl.ini b/doc/guides/cryptodevs/features/openssl.ini
index f0074a46f8..df6e7de316 100644
--- a/doc/guides/cryptodevs/features/openssl.ini
+++ b/doc/guides/cryptodevs/features/openssl.ini
@@ -67,6 +67,8 @@ Modular Inversion = Y
 Diffie-hellman = Y
 SM2 = Y
 EdDSA = Y
+ML-KEM = Y
+ML-DSA = Y
 
 ;
 ; Supported Operating systems of the 'openssl' crypto driver.
diff --git a/drivers/crypto/openssl/openssl_pmd_private.h b/drivers/crypto/openssl/openssl_pmd_private.h
index 4a6a088870..7f87840b84 100644
--- a/drivers/crypto/openssl/openssl_pmd_private.h
+++ b/drivers/crypto/openssl/openssl_pmd_private.h
@@ -249,6 +249,20 @@ struct __rte_cache_aligned openssl_asym_session {
 			OSSL_PARAM * params;
 #endif
 		} eddsa;
+		struct {
+			uint8_t param;
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+			EVP_PKEY_CTX * pctx;
+#endif
+		} ml_kem;
+		struct {
+			uint8_t param;
+			bool sign_prehash;
+			bool sign_deterministic;
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+			EVP_PKEY_CTX * pctx;
+#endif
+		} ml_dsa;
 	} u;
 };
 /** Set and validate OPENSSL crypto session parameters */
@@ -264,4 +278,6 @@ openssl_reset_session(struct openssl_session *sess);
 /** device specific operations function pointer structure */
 extern struct rte_cryptodev_ops *rte_openssl_pmd_ops;
 
+extern const char *ml_kem_paramset_names[];
+extern const char *ml_dsa_paramset_names[];
 #endif /* _OPENSSL_PMD_PRIVATE_H_ */
diff --git a/drivers/crypto/openssl/rte_openssl_pmd.c b/drivers/crypto/openssl/rte_openssl_pmd.c
index 5bfad92b7c..86c29bc55d 100644
--- a/drivers/crypto/openssl/rte_openssl_pmd.c
+++ b/drivers/crypto/openssl/rte_openssl_pmd.c
@@ -3255,6 +3255,7 @@ process_openssl_eddsa_op_evp(struct rte_crypto_op *cop,
 
 	return ret;
 }
+
 #else
 static int
 process_openssl_rsa_op(struct rte_crypto_op *cop,
@@ -3383,6 +3384,861 @@ process_openssl_eddsa_op(struct rte_crypto_op *cop,
 }
 #endif
 
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+static int
+mlkem_keygen_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_kem_op *op = &cop->asym->mlkem;
+	EVP_PKEY_CTX *pctx = sess->u.ml_kem.pctx;
+	OSSL_PARAM_BLD *param_bld;
+	uint8_t seed[64] = {0};
+	EVP_PKEY *pkey = NULL;
+	OSSL_PARAM *params;
+	const char *param;
+	size_t keylen = 0;
+	void *key = NULL;
+	OSSL_PARAM *p;
+
+	param = ml_kem_paramset_names[sess->u.ml_kem.param];
+	if (param == NULL) {
+		OPENSSL_LOG(ERR, "invalid ml_kem param set");
+		return -EINVAL;
+	}
+
+	memcpy(seed, op->keygen.d.data, op->keygen.d.length);
+	memcpy(seed + op->keygen.d.length,
+		op->keygen.z.data, op->keygen.z.length);
+
+	param_bld = OSSL_PARAM_BLD_new();
+	if (param_bld == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (!OSSL_PARAM_BLD_push_utf8_string(param_bld,
+			OSSL_PKEY_PARAM_GROUP_NAME,
+			param, strlen(param)) ||
+		!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_ML_KEM_SEED,
+			seed, sizeof(seed))) {
+		OSSL_PARAM_BLD_free(param_bld);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	params = OSSL_PARAM_BLD_to_param(param_bld);
+	OSSL_PARAM_BLD_free(param_bld);
+	if (params == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	if (EVP_PKEY_fromdata_init(pctx) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR, params) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	OSSL_PARAM_free(params);
+
+	if (pkey == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	/* extract public and private keys */
+	if (EVP_PKEY_todata(pkey, EVP_PKEY_KEYPAIR, &params) != 1) {
+		OPENSSL_LOG(ERR, "Failed to convert to key pairs");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_PRIV_KEY);
+	if (p == NULL) {
+		OPENSSL_LOG(ERR, "Failed to locate private key");
+		OSSL_PARAM_free(params);
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	OSSL_PARAM_get_octet_string(p, &key,
+		rte_crypto_ml_kem_pubkey_size[sess->u.ml_kem.param], &keylen);
+	memcpy(op->keygen.dk.data, key, keylen);
+	op->keygen.dk.length = keylen;
+
+	p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_PUB_KEY);
+	if (p == NULL) {
+		OPENSSL_LOG(ERR, "Failed to locate public key");
+		OSSL_PARAM_free(params);
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	OSSL_PARAM_get_octet_string(p, &key,
+		rte_crypto_ml_kem_privkey_size[sess->u.ml_kem.param], &keylen);
+	memcpy(op->keygen.ek.data, key, keylen);
+	op->keygen.ek.length = keylen;
+
+	OSSL_PARAM_free(params);
+	EVP_PKEY_free(pkey);
+	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+	return 0;
+}
+
+static int
+mlkem_encap_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_kem_op *op = &cop->asym->mlkem;
+	EVP_PKEY_CTX *pctx = sess->u.ml_kem.pctx;
+	OSSL_PARAM_BLD *param_bld;
+	EVP_PKEY_CTX *cctx = NULL;
+	EVP_PKEY *pkey = NULL;
+	OSSL_PARAM *params;
+	const char *param;
+	size_t keylen = 0;
+	size_t outlen = 0;
+	int ret = -1;
+
+	param = ml_kem_paramset_names[sess->u.ml_kem.param];
+	if (param == NULL) {
+		OPENSSL_LOG(ERR, "invalid ml_kem param set");
+		return -EINVAL;
+	}
+
+	param_bld = OSSL_PARAM_BLD_new();
+	if (param_bld == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (!OSSL_PARAM_BLD_push_utf8_string(param_bld,
+			OSSL_PKEY_PARAM_GROUP_NAME,
+			param, strlen(param)) ||
+		!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_PUB_KEY,
+			op->encap.ek.data, op->encap.ek.length)) {
+		OSSL_PARAM_BLD_free(param_bld);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	params = OSSL_PARAM_BLD_to_param(param_bld);
+	OSSL_PARAM_BLD_free(param_bld);
+	if (params == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata_init(pctx) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_PUBLIC_KEY, params) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	OSSL_PARAM_free(params);
+
+	if (pkey == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	cctx = EVP_PKEY_CTX_new_from_pkey(NULL, pkey, NULL);
+	if (cctx == NULL) {
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_encapsulate_init(cctx, NULL) != 1) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (op->encap.message.length) {
+		const OSSL_PARAM kem_params[] = {
+			OSSL_PARAM_octet_string(OSSL_KEM_PARAM_IKME,
+				(void *)op->encap.message.data, op->encap.message.length),
+			OSSL_PARAM_END
+		};
+
+		if (EVP_PKEY_encapsulate_init(cctx, kem_params) != 1) {
+			EVP_PKEY_free(pkey);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+	}
+
+	if (EVP_PKEY_encapsulate(cctx, NULL, &outlen, NULL, &keylen) != 1) {
+		OPENSSL_LOG(ERR, "Failed to determine output length");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (outlen > op->encap.cipher.length) {
+		OPENSSL_LOG(ERR, "Insufficient buffer for cipher text");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (keylen > op->encap.sk.length) {
+		OPENSSL_LOG(ERR, "Insufficient buffer for shared key");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_encapsulate(cctx, op->encap.cipher.data, &outlen,
+			op->encap.sk.data, &keylen) != 1) {
+		OPENSSL_LOG(ERR, "Failed to encapculate");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	op->encap.cipher.length = outlen;
+	op->encap.sk.length = keylen;
+
+	EVP_PKEY_CTX_free(cctx);
+	EVP_PKEY_free(pkey);
+	ret = 0;
+	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+	return ret;
+}
+
+static int
+mlkem_decap_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_kem_op *op = &cop->asym->mlkem;
+	EVP_PKEY_CTX *pctx = sess->u.ml_kem.pctx;
+	OSSL_PARAM_BLD *param_bld;
+	EVP_PKEY_CTX *cctx = NULL;
+	EVP_PKEY *pkey = NULL;
+	OSSL_PARAM *params;
+	const char *param;
+	size_t keylen = 0;
+	int ret = -1;
+
+	param = ml_kem_paramset_names[sess->u.ml_kem.param];
+	if (param == NULL) {
+		OPENSSL_LOG(ERR, "invalid ml_kem param set");
+		return -EINVAL;
+	}
+
+	param_bld = OSSL_PARAM_BLD_new();
+	if (param_bld == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (!OSSL_PARAM_BLD_push_utf8_string(param_bld,
+			OSSL_PKEY_PARAM_GROUP_NAME,
+			param, strlen(param)) ||
+		!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_PRIV_KEY,
+			op->decap.dk.data, op->decap.dk.length)) {
+		OSSL_PARAM_BLD_free(param_bld);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	params = OSSL_PARAM_BLD_to_param(param_bld);
+	OSSL_PARAM_BLD_free(param_bld);
+	if (params == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata_init(pctx) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_PRIVATE_KEY, params) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	OSSL_PARAM_free(params);
+
+	if (pkey == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	cctx = EVP_PKEY_CTX_new_from_pkey(NULL, pkey, NULL);
+	if (cctx == NULL) {
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_decapsulate_init(cctx, params) != 1) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_decapsulate(cctx, NULL, &keylen,
+		op->decap.cipher.data, op->decap.cipher.length) != 1) {
+		OPENSSL_LOG(ERR, "Failed to determine output length");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (keylen > op->decap.sk.length) {
+		OPENSSL_LOG(ERR, "Insufficient buffer for shared key");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_decapsulate(cctx, op->decap.sk.data, &keylen,
+			op->decap.cipher.data, op->decap.cipher.length) != 1) {
+		OPENSSL_LOG(ERR, "Failed to decapsulate");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	op->decap.sk.length = keylen;
+
+	EVP_PKEY_CTX_free(cctx);
+	EVP_PKEY_free(pkey);
+	ret = 0;
+	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+	return ret;
+}
+
+static int
+process_openssl_mlkem_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_kem_op *op = &cop->asym->mlkem;
+	int ret = -1;
+
+	switch (op->op) {
+	case RTE_CRYPTO_ML_KEM_OP_KEYGEN:
+		ret = mlkem_keygen_op_evp(cop, sess);
+		break;
+	case RTE_CRYPTO_ML_KEM_OP_KEYVER:
+		cop->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
+		break;
+	case RTE_CRYPTO_ML_KEM_OP_ENCAP:
+		ret = mlkem_encap_op_evp(cop, sess);
+		break;
+	case RTE_CRYPTO_ML_KEM_OP_DECAP:
+		ret = mlkem_decap_op_evp(cop, sess);
+		break;
+	default:
+		cop->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
+		break;
+	}
+
+	return ret;
+}
+
+static int
+mldsa_keygen_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_dsa_op *op = &cop->asym->mldsa;
+	EVP_PKEY_CTX *pctx = sess->u.ml_dsa.pctx;
+	OSSL_PARAM_BLD *param_bld;
+	EVP_PKEY *pkey = NULL;
+	OSSL_PARAM *params;
+	const char *param;
+	size_t keylen = 0;
+	void *key = NULL;
+	OSSL_PARAM *p;
+
+	param = ml_dsa_paramset_names[sess->u.ml_dsa.param];
+	if (param == NULL) {
+		OPENSSL_LOG(ERR, "invalid ml_dsa param set");
+		return -EINVAL;
+	}
+
+	param_bld = OSSL_PARAM_BLD_new();
+	if (param_bld == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (!OSSL_PARAM_BLD_push_utf8_string(param_bld,
+			OSSL_PKEY_PARAM_GROUP_NAME,
+			param, strlen(param)) ||
+		!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_ML_DSA_SEED,
+			op->keygen.seed.data, op->keygen.seed.length)) {
+		OSSL_PARAM_BLD_free(param_bld);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	params = OSSL_PARAM_BLD_to_param(param_bld);
+	OSSL_PARAM_BLD_free(param_bld);
+	if (params == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	if (EVP_PKEY_fromdata_init(pctx) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR, params) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+	OSSL_PARAM_free(params);
+
+	if (pkey == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	/* extract public and private keys */
+	if (EVP_PKEY_todata(pkey, EVP_PKEY_KEYPAIR, &params) != 1) {
+		OPENSSL_LOG(ERR, "Failed to convert to key pairs");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_PRIV_KEY);
+	if (p == NULL) {
+		OPENSSL_LOG(ERR, "Failed to locate private key");
+		OSSL_PARAM_free(params);
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	OSSL_PARAM_get_octet_string(p, &key,
+		rte_crypto_ml_dsa_privkey_size[sess->u.ml_dsa.param], &keylen);
+	memcpy(op->keygen.privkey.data, key, keylen);
+	op->keygen.privkey.length = keylen;
+
+	p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_PUB_KEY);
+	if (p == NULL) {
+		OPENSSL_LOG(ERR, "Failed to locate public key");
+		OSSL_PARAM_free(params);
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	OSSL_PARAM_get_octet_string(p, &key,
+		rte_crypto_ml_dsa_pubkey_size[sess->u.ml_dsa.param], &keylen);
+	memcpy(op->keygen.pubkey.data, key, keylen);
+	op->keygen.pubkey.length = keylen;
+
+	OSSL_PARAM_free(params);
+	EVP_PKEY_free(pkey);
+	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+	return 0;
+}
+
+static int
+mldsa_sign_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_dsa_op *op = &cop->asym->mldsa;
+	EVP_PKEY_CTX *pctx = sess->u.ml_dsa.pctx;
+	const EVP_MD *check_md = NULL;
+	OSSL_PARAM_BLD *param_bld;
+	EVP_PKEY_CTX *cctx = NULL;
+	EVP_PKEY *pkey = NULL;
+	EVP_SIGNATURE *sigalg;
+	OSSL_PARAM *params;
+	const char *param;
+	unsigned char *md;
+	size_t siglen = 0;
+	size_t mdlen = 0;
+	int ret = -1;
+
+	param = ml_dsa_paramset_names[sess->u.ml_dsa.param];
+	if (param == NULL) {
+		OPENSSL_LOG(ERR, "invalid ml_dsa param set");
+		return -EINVAL;
+	}
+
+	param_bld = OSSL_PARAM_BLD_new();
+	if (param_bld == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (!OSSL_PARAM_BLD_push_utf8_string(param_bld,
+			OSSL_PKEY_PARAM_GROUP_NAME,
+			param, strlen(param)) ||
+		(op->siggen.seed.length &&
+			!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_ML_DSA_SEED,
+			op->siggen.seed.data, op->siggen.seed.length)) ||
+		!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_PRIV_KEY,
+			op->siggen.privkey.data, op->siggen.privkey.length)) {
+		OSSL_PARAM_BLD_free(param_bld);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	params = OSSL_PARAM_BLD_to_param(param_bld);
+	OSSL_PARAM_BLD_free(param_bld);
+	if (params == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata_init(pctx) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_PRIVATE_KEY, params) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (pkey == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	cctx = EVP_PKEY_CTX_new_from_pkey(NULL, pkey, NULL);
+	if (cctx == NULL) {
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	sigalg = EVP_SIGNATURE_fetch(NULL, param, NULL);
+	if (sigalg == NULL) {
+		OPENSSL_LOG(ERR, "Failed to fetch signature algorithm");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_sign_message_init(cctx, sigalg, NULL) != 1) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (sess->u.ml_dsa.sign_deterministic) {
+		int deterministic = 1;
+		const OSSL_PARAM sign_params[] = {
+			OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_DETERMINISTIC, &deterministic),
+			OSSL_PARAM_END
+		};
+
+		if (EVP_PKEY_sign_message_init(cctx, sigalg, sign_params) != 1) {
+			EVP_SIGNATURE_free(sigalg);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+	}
+
+	md = op->siggen.message.data;
+	mdlen = op->siggen.message.length;
+
+	if (op->siggen.mu.length) {
+		int has_mu = 1;
+		const OSSL_PARAM sign_params[] = {
+			OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MU, &has_mu),
+			OSSL_PARAM_END
+		};
+
+		if (EVP_PKEY_sign_message_init(cctx, sigalg, sign_params) != 1) {
+			EVP_SIGNATURE_free(sigalg);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+
+		md = op->siggen.mu.data;
+		mdlen = op->siggen.mu.length;
+	} else if (op->siggen.ctx.length) {
+		int has_ctx = 1;
+		const OSSL_PARAM sign_params[] = {
+			OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING, &has_ctx),
+			OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING,
+				(void *)op->siggen.ctx.data, op->siggen.ctx.length),
+			OSSL_PARAM_END
+		};
+
+		if (EVP_PKEY_sign_message_init(cctx, sigalg, sign_params) != 1) {
+			EVP_SIGNATURE_free(sigalg);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+	}
+
+	EVP_SIGNATURE_free(sigalg);
+
+	switch (op->siggen.hash) {
+	case RTE_CRYPTO_AUTH_SHA3_224:
+		check_md = EVP_sha3_224();
+		break;
+	case RTE_CRYPTO_AUTH_SHA3_256:
+		check_md = EVP_sha3_256();
+		break;
+	case RTE_CRYPTO_AUTH_SHA3_384:
+		check_md = EVP_sha3_384();
+		break;
+	case RTE_CRYPTO_AUTH_SHA3_512:
+		check_md = EVP_sha3_512();
+		break;
+	case RTE_CRYPTO_AUTH_SHAKE_128:
+		check_md = EVP_shake128();
+		break;
+	case RTE_CRYPTO_AUTH_SHAKE_256:
+		check_md = EVP_shake256();
+		break;
+	default:
+		break;
+	}
+
+	if (op->siggen.hash != 0 && check_md == NULL) {
+		OPENSSL_LOG(ERR, "invalid hash type");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (check_md != NULL) {
+		if (EVP_PKEY_CTX_set_signature_md(cctx, check_md) != 1) {
+			OPENSSL_LOG(ERR, "Failed to set signature md");
+			EVP_PKEY_free(pkey);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+	}
+
+	if (EVP_PKEY_sign(cctx, NULL, &siglen, md, mdlen) != 1) {
+		OPENSSL_LOG(ERR, "Failed to determine output length");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (siglen > op->siggen.sign.length) {
+		OPENSSL_LOG(ERR, "Insufficient buffer for signature");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_sign(cctx, op->siggen.sign.data, &siglen, md, mdlen) != 1) {
+		OPENSSL_LOG(ERR, "Failed to sign");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	op->siggen.sign.length = siglen;
+
+	OSSL_PARAM_free(params);
+	EVP_PKEY_CTX_free(cctx);
+	EVP_PKEY_free(pkey);
+	ret = 0;
+	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+	return ret;
+}
+
+static int
+mldsa_verify_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_dsa_op *op = &cop->asym->mldsa;
+	EVP_PKEY_CTX *pctx = sess->u.ml_dsa.pctx;
+	OSSL_PARAM_BLD *param_bld;
+	EVP_PKEY_CTX *cctx = NULL;
+	EVP_PKEY *pkey = NULL;
+	EVP_SIGNATURE *sigalg;
+	OSSL_PARAM *params;
+	const char *param;
+	unsigned char *md;
+	size_t mdlen = 0;
+	int ret = -1;
+
+	param = ml_dsa_paramset_names[sess->u.ml_dsa.param];
+	if (param == NULL) {
+		OPENSSL_LOG(ERR, "invalid ml_dsa param set");
+		return -EINVAL;
+	}
+
+	param_bld = OSSL_PARAM_BLD_new();
+	if (param_bld == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (!OSSL_PARAM_BLD_push_utf8_string(param_bld,
+			OSSL_PKEY_PARAM_GROUP_NAME,
+			param, strlen(param)) ||
+		!OSSL_PARAM_BLD_push_octet_string(param_bld,
+			OSSL_PKEY_PARAM_PUB_KEY,
+			op->sigver.pubkey.data, op->sigver.pubkey.length)) {
+		OSSL_PARAM_BLD_free(param_bld);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	params = OSSL_PARAM_BLD_to_param(param_bld);
+	OSSL_PARAM_BLD_free(param_bld);
+	if (params == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata_init(pctx) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_PUBLIC_KEY, params) != 1) {
+		OSSL_PARAM_free(params);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (pkey == NULL) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	cctx = EVP_PKEY_CTX_new_from_pkey(NULL, pkey, NULL);
+	if (cctx == NULL) {
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	sigalg = EVP_SIGNATURE_fetch(NULL, param, NULL);
+	if (sigalg == NULL) {
+		OPENSSL_LOG(ERR, "Failed to fetch signature algorithm");
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	if (EVP_PKEY_verify_message_init(cctx, sigalg, NULL) != 1) {
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return -1;
+	}
+
+	md = op->sigver.message.data;
+	mdlen = op->sigver.message.length;
+
+	if (op->sigver.mu.length) {
+		int has_mu = 1;
+		const OSSL_PARAM sign_params[] = {
+			OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MU, &has_mu),
+			OSSL_PARAM_END
+		};
+
+		if (EVP_PKEY_verify_message_init(cctx, sigalg, sign_params) != 1) {
+			EVP_SIGNATURE_free(sigalg);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+
+		md = op->sigver.mu.data;
+		mdlen = op->sigver.mu.length;
+	} else if (op->sigver.ctx.length) {
+		const OSSL_PARAM sign_params[] = {
+			OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING,
+				(void *)op->sigver.ctx.data, op->sigver.ctx.length),
+			OSSL_PARAM_END
+		};
+
+		if (EVP_PKEY_verify_message_init(cctx, sigalg, sign_params) != 1) {
+			EVP_SIGNATURE_free(sigalg);
+			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+			return -1;
+		}
+	}
+
+	if (EVP_PKEY_verify(cctx, op->sigver.sign.data, op->sigver.sign.length,
+		md, mdlen) != 1) {
+		EVP_PKEY_free(pkey);
+		cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
+		return 0;
+	}
+
+	OSSL_PARAM_free(params);
+	EVP_PKEY_CTX_free(cctx);
+	EVP_PKEY_free(pkey);
+	ret = 0;
+	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
+	return ret;
+}
+
+static int
+process_openssl_mldsa_op_evp(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	struct rte_crypto_ml_dsa_op *op = &cop->asym->mldsa;
+	int ret = -1;
+
+	switch (op->op) {
+	case RTE_CRYPTO_ML_DSA_OP_KEYGEN:
+		ret = mldsa_keygen_op_evp(cop, sess);
+		break;
+	case RTE_CRYPTO_ML_DSA_OP_SIGN:
+		ret = mldsa_sign_op_evp(cop, sess);
+		break;
+	case RTE_CRYPTO_ML_DSA_OP_VERIFY:
+		ret = mldsa_verify_op_evp(cop, sess);
+		break;
+	default:
+		cop->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
+		break;
+	}
+
+	return ret;
+}
+#else
+static int
+process_openssl_mlkem_op(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	RTE_SET_USED(cop);
+	RTE_SET_USED(sess);
+	return -ENOTSUP;
+}
+
+static int
+process_openssl_mldsa_op(struct rte_crypto_op *cop,
+		struct openssl_asym_session *sess)
+{
+	RTE_SET_USED(cop);
+	RTE_SET_USED(sess);
+	return -ENOTSUP;
+}
+#endif
+
 static int
 process_asym_op(struct openssl_qp *qp, struct rte_crypto_op *op,
 		struct openssl_asym_session *sess)
@@ -3450,6 +4306,20 @@ process_asym_op(struct openssl_qp *qp, struct rte_crypto_op *op,
 		retval = process_openssl_eddsa_op_evp(op, sess);
 #else
 		retval = process_openssl_eddsa_op(op, sess);
+#endif
+		break;
+	case RTE_CRYPTO_ASYM_XFORM_ML_KEM:
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+		retval = process_openssl_mlkem_op_evp(op, sess);
+#else
+		retval = process_openssl_mlkem_op(op, sess);
+#endif
+		break;
+	case RTE_CRYPTO_ASYM_XFORM_ML_DSA:
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+		retval = process_openssl_mldsa_op_evp(op, sess);
+#else
+		retval = process_openssl_mldsa_op(op, sess);
 #endif
 		break;
 	default:
diff --git a/drivers/crypto/openssl/rte_openssl_pmd_ops.c b/drivers/crypto/openssl/rte_openssl_pmd_ops.c
index d3aa396c76..fd752cbc44 100644
--- a/drivers/crypto/openssl/rte_openssl_pmd_ops.c
+++ b/drivers/crypto/openssl/rte_openssl_pmd_ops.c
@@ -639,10 +639,79 @@ static const struct rte_cryptodev_capabilities openssl_pmd_capabilities[] = {
 		}
 		}
 	},
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+	{
+		/* ML-KEM */
+		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
+		.asym = {
+			.xform_capa = {
+				.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_KEM,
+				.op_types =
+				((1 << RTE_CRYPTO_ML_KEM_OP_KEYGEN) |
+				 (1 << RTE_CRYPTO_ML_KEM_OP_ENCAP) |
+				 (1 << RTE_CRYPTO_ML_KEM_OP_DECAP)),
+				.mlkem_capa = {
+					[RTE_CRYPTO_ML_KEM_OP_KEYGEN] =
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_512) |
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_768) |
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_1024),
+					[RTE_CRYPTO_ML_KEM_OP_ENCAP] =
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_512) |
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_768) |
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_1024),
+					[RTE_CRYPTO_ML_KEM_OP_DECAP] =
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_512) |
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_768) |
+						(1 << RTE_CRYPTO_ML_KEM_PARAM_1024)
+				}
+			}
+		}
+	},
+	{
+		/* ML-DSA */
+		.op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
+		.asym = {
+			.xform_capa = {
+				.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_DSA,
+				.op_types =
+				((1 << RTE_CRYPTO_ML_DSA_OP_KEYGEN) |
+				 (1 << RTE_CRYPTO_ML_DSA_OP_SIGN) |
+				 (1 << RTE_CRYPTO_ML_DSA_OP_VERIFY)),
+				.mldsa_capa = {
+					[RTE_CRYPTO_ML_DSA_OP_KEYGEN] =
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_44) |
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_65) |
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_87),
+					[RTE_CRYPTO_ML_DSA_OP_SIGN] =
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_44) |
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_65) |
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_87),
+					[RTE_CRYPTO_ML_DSA_OP_VERIFY] =
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_44) |
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_65) |
+						(1 << RTE_CRYPTO_ML_DSA_PARAM_87)
+				}
+			}
+		}
+	},
+#endif
 
 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
 };
 
+const char *ml_kem_paramset_names[] = {
+	NULL,
+	"ML-KEM-512",
+	"ML-KEM-768",
+	"ML-KEM-1024",
+};
+
+const char *ml_dsa_paramset_names[] = {
+	NULL,
+	"ML-DSA-44",
+	"ML-DSA-65",
+	"ML-DSA-87",
+};
 
 /** Configure device */
 static int
@@ -1573,6 +1642,58 @@ static int openssl_set_asym_session_parameters(
 #else
 		OPENSSL_LOG(WARNING, "EdDSA unsupported for OpenSSL Version < 3.3");
 		return -ENOTSUP;
+#endif
+	}
+	case RTE_CRYPTO_ASYM_XFORM_ML_KEM:
+	{
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+		const char *param;
+
+		param = ml_kem_paramset_names[xform->mlkem.param];
+		if (param == NULL) {
+			OPENSSL_LOG(ERR, "invalid ml_kem param set");
+			return -EINVAL;
+		}
+
+		asym_session->u.ml_kem.pctx = EVP_PKEY_CTX_new_from_name(NULL, param, NULL);
+		if (!asym_session->u.ml_kem.pctx) {
+			OPENSSL_LOG(ERR, "failed to allocate resources");
+			return -1;
+		}
+
+		asym_session->u.ml_kem.param = xform->mlkem.param;
+		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+		break;
+#else
+		OPENSSL_LOG(WARNING, "ML-KEM unsupported for OpenSSL Version < 3.5");
+		return -ENOTSUP;
+#endif
+	}
+	case RTE_CRYPTO_ASYM_XFORM_ML_DSA:
+	{
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+		const char *param;
+
+		param = ml_dsa_paramset_names[xform->mldsa.param];
+		if (param == NULL) {
+			OPENSSL_LOG(ERR, "invalid ml_dsa param set");
+			return -EINVAL;
+		}
+
+		asym_session->u.ml_dsa.pctx = EVP_PKEY_CTX_new_from_name(NULL, param, NULL);
+		if (!asym_session->u.ml_dsa.pctx) {
+			OPENSSL_LOG(ERR, "failed to allocate resources");
+			return -1;
+		}
+
+		asym_session->u.ml_dsa.param = xform->mldsa.param;
+		asym_session->u.ml_dsa.sign_prehash = xform->mldsa.sign_prehash;
+		asym_session->u.ml_dsa.sign_deterministic = xform->mldsa.sign_deterministic;
+		asym_session->xfrm_type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+		break;
+#else
+		OPENSSL_LOG(WARNING, "ML-DSA unsupported for OpenSSL Version < 3.5");
+		return -ENOTSUP;
 #endif
 	}
 	default:
@@ -1675,6 +1796,16 @@ static void openssl_reset_asym_session(struct openssl_asym_session *sess)
 	case RTE_CRYPTO_ASYM_XFORM_EDDSA:
 #if (OPENSSL_VERSION_NUMBER >= 0x30300000L)
 		OSSL_PARAM_free(sess->u.eddsa.params);
+#endif
+		break;
+	case RTE_CRYPTO_ASYM_XFORM_ML_KEM:
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+		EVP_PKEY_CTX_free(sess->u.ml_kem.pctx);
+#endif
+		break;
+	case RTE_CRYPTO_ASYM_XFORM_ML_DSA:
+#if (OPENSSL_VERSION_NUMBER >= 0x30500000L)
+		EVP_PKEY_CTX_free(sess->u.ml_dsa.pctx);
 #endif
 		break;
 	default:
-- 
2.37.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2 3/3] app/test: add ML crypto test vectors
  2025-10-01  7:37   ` [PATCH v2 " Gowrishankar Muthukrishnan
  2025-10-01  7:37     ` [PATCH v2 1/3] " Gowrishankar Muthukrishnan
  2025-10-01  7:37     ` [PATCH v2 2/3] crypto/openssl: add ML crypto support Gowrishankar Muthukrishnan
@ 2025-10-01  7:37     ` Gowrishankar Muthukrishnan
  2 siblings, 0 replies; 10+ messages in thread
From: Gowrishankar Muthukrishnan @ 2025-10-01  7:37 UTC (permalink / raw)
  To: dev, Akhil Goyal, Fan Zhang, Kai Ji; +Cc: anoobj, Gowrishankar Muthukrishnan

Add ML-KEM and ML-DSA test vectors.

Signed-off-by: Gowrishankar Muthukrishnan <gmuthukrishn@marvell.com>
---
 app/test/test_cryptodev_asym.c                |  856 ++++++++
 app/test/test_cryptodev_ml_dsa_test_vectors.h | 1856 +++++++++++++++++
 app/test/test_cryptodev_ml_kem_test_vectors.h |  873 ++++++++
 3 files changed, 3585 insertions(+)
 create mode 100644 app/test/test_cryptodev_ml_dsa_test_vectors.h
 create mode 100644 app/test/test_cryptodev_ml_kem_test_vectors.h

diff --git a/app/test/test_cryptodev_asym.c b/app/test/test_cryptodev_asym.c
index 20afb5e98b..942a23e3b3 100644
--- a/app/test/test_cryptodev_asym.c
+++ b/app/test/test_cryptodev_asym.c
@@ -24,6 +24,8 @@
 #include "test_cryptodev_mod_test_vectors.h"
 #include "test_cryptodev_rsa_test_vectors.h"
 #include "test_cryptodev_sm2_test_vectors.h"
+#include "test_cryptodev_ml_kem_test_vectors.h"
+#include "test_cryptodev_ml_dsa_test_vectors.h"
 #include "test_cryptodev_asym_util.h"
 #include "test.h"
 
@@ -3629,6 +3631,33 @@ static int send_one(void)
 	return TEST_SUCCESS;
 }
 
+static int send_one_no_status_check(void)
+{
+	int ticks = 0;
+
+	if (rte_cryptodev_enqueue_burst(params->valid_devs[0], 0,
+			&self->op, 1) != 1) {
+		RTE_LOG(ERR, USER1,
+			"line %u FAILED: Error sending packet for operation on device %d",
+			__LINE__, params->valid_devs[0]);
+		return TEST_FAILED;
+	}
+	while (rte_cryptodev_dequeue_burst(params->valid_devs[0], 0,
+			&self->result_op, 1) == 0) {
+		rte_delay_ms(1);
+		ticks++;
+		if (ticks >= DEQ_TIMEOUT) {
+			RTE_LOG(ERR, USER1,
+				"line %u FAILED: Cannot dequeue the crypto op on device %d",
+				__LINE__, params->valid_devs[0]);
+			return TEST_FAILED;
+		}
+	}
+	TEST_ASSERT_NOT_NULL(self->result_op,
+		"Failed to process asym crypto op");
+	return TEST_SUCCESS;
+}
+
 static int
 modular_cmpeq(const uint8_t *a, size_t a_len, const uint8_t *b, size_t b_len)
 {
@@ -3735,6 +3764,827 @@ modular_multiplicative_inverse(const void *test_data)
 	return TEST_SUCCESS;
 }
 
+static int
+mlkem_keygen(const void *test_data)
+{
+	const struct crypto_testsuite_mlkem_params *vector = test_data;
+	const uint8_t dev_id = params->valid_devs[0];
+	struct rte_crypto_asym_xform xform = {0};
+	uint8_t ek[TEST_DATA_SIZE] = {0};
+	uint8_t dk[TEST_DATA_SIZE] = {0};
+
+	xform.mlkem.param = vector->param;
+	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+	if (rte_cryptodev_asym_session_create(dev_id, &xform,
+			params->session_mpool, &self->sess) < 0) {
+		RTE_LOG(ERR, USER1, "line %u FAILED: Session creation failed",
+			__LINE__);
+		return TEST_FAILED;
+	}
+
+	rte_crypto_op_attach_asym_session(self->op, self->sess);
+	self->op->asym->mlkem.op = RTE_CRYPTO_ML_KEM_OP_KEYGEN;
+	self->op->asym->mlkem.keygen.d.data = vector->d.data;
+	self->op->asym->mlkem.keygen.d.length = vector->d.length;
+	self->op->asym->mlkem.keygen.z.data = vector->z.data;
+	self->op->asym->mlkem.keygen.z.length = vector->z.length;
+	self->op->asym->mlkem.keygen.dk.data = dk;
+	self->op->asym->mlkem.keygen.dk.length = 0;
+	self->op->asym->mlkem.keygen.ek.data = ek;
+	self->op->asym->mlkem.keygen.ek.length = 0;
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-KEM KeyGen)");
+	debug_hexdump(stdout, "Decapsulation key",
+		self->result_op->asym->mlkem.keygen.dk.data,
+		self->result_op->asym->mlkem.keygen.dk.length);
+	debug_hexdump(stdout, "Encapsulation key",
+		self->result_op->asym->mlkem.keygen.ek.data,
+		self->result_op->asym->mlkem.keygen.ek.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.keygen.dk.length,
+		rte_crypto_ml_kem_privkey_size[vector->param],
+		"Incorrect Decapsulation key length\n");
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.keygen.ek.length,
+		rte_crypto_ml_kem_pubkey_size[vector->param],
+		"Incorrect Encapsulation key length\n");
+
+	/* If the seed is all zero, keys are deterministic */
+	if (memcmp(vector->d.data, (uint8_t [32]) {0},
+			vector->d.length) == 0) {
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->dk.data,
+			self->result_op->asym->mlkem.keygen.dk.data,
+			self->result_op->asym->mlkem.keygen.dk.length,
+			"Incorrect Decapsulation key\n");
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->ek.data,
+			self->result_op->asym->mlkem.keygen.ek.data,
+			self->result_op->asym->mlkem.keygen.ek.length,
+			"Incorrect Encapsulation key\n");
+		RTE_LOG(DEBUG, USER1, "Deterministic keygen test passed\n");
+	}
+
+	rte_cryptodev_asym_session_free(dev_id, self->sess);
+	return TEST_SUCCESS;
+}
+
+static int
+mlkem_encap(const void *test_data)
+{
+	const struct crypto_testsuite_mlkem_params *vector = test_data;
+	const uint8_t dev_id = params->valid_devs[0];
+	struct rte_crypto_asym_xform xform = {0};
+	uint8_t cipher[TEST_DATA_SIZE] = {0};
+	uint8_t skcopy[TEST_DATA_SIZE] = {0};
+	uint8_t sk[TEST_DATA_SIZE] = {0};
+	size_t cipher_len;
+
+	xform.mlkem.param = vector->param;
+	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+	if (rte_cryptodev_asym_session_create(dev_id, &xform,
+			params->session_mpool, &self->sess) < 0) {
+		RTE_LOG(ERR, USER1, "line %u FAILED: Session creation failed",
+			__LINE__);
+		return TEST_FAILED;
+	}
+
+	rte_crypto_op_attach_asym_session(self->op, self->sess);
+
+	/* Encapsulate */
+	self->op->asym->mlkem.op = RTE_CRYPTO_ML_KEM_OP_ENCAP;
+	self->op->asym->mlkem.encap.message.data = vector->message.data;
+	self->op->asym->mlkem.encap.message.length = vector->message.length;
+	self->op->asym->mlkem.encap.ek.data = vector->ek.data;
+	self->op->asym->mlkem.encap.ek.length = vector->ek.length;
+	self->op->asym->mlkem.encap.cipher.data = cipher;
+	self->op->asym->mlkem.encap.cipher.length =
+		rte_crypto_ml_kem_cipher_size[vector->param];
+	self->op->asym->mlkem.encap.sk.data = sk;
+	self->op->asym->mlkem.encap.sk.length = 32;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-KEM Encap)");
+	debug_hexdump(stdout, "Cipher",
+		self->result_op->asym->mlkem.encap.cipher.data,
+		self->result_op->asym->mlkem.encap.cipher.length);
+	debug_hexdump(stdout, "Shared secret from encap",
+		self->result_op->asym->mlkem.encap.sk.data,
+		self->result_op->asym->mlkem.encap.sk.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.encap.cipher.length,
+		rte_crypto_ml_kem_cipher_size[vector->param],
+		"Incorrect Cipher length\n");
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.encap.sk.length, 32,
+		"Incorrect Shared key length\n");
+
+	/* If random message is set, cipher and shared secret are deterministic */
+	if (vector->message.length != 0) {
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->cipher.data,
+			self->result_op->asym->mlkem.encap.cipher.data,
+			self->result_op->asym->mlkem.encap.cipher.length,
+			"Incorrect Cipher\n");
+
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->sk.data,
+			self->result_op->asym->mlkem.encap.sk.data,
+			self->result_op->asym->mlkem.encap.sk.length,
+			"Incorrect Shared secret\n");
+		RTE_LOG(DEBUG, USER1, "Deterministic encap test passed\n");
+	}
+
+	/* Decapsulate and verify */
+	cipher_len = self->result_op->asym->mlkem.encap.cipher.length;
+	memcpy(skcopy, self->result_op->asym->mlkem.encap.sk.data,
+		self->result_op->asym->mlkem.encap.sk.length);
+	memset(sk, 0, sizeof(sk));
+
+	self->op->asym->mlkem.op = RTE_CRYPTO_ML_KEM_OP_DECAP;
+	self->op->asym->mlkem.decap.dk.data = vector->dk.data;
+	self->op->asym->mlkem.decap.dk.length = vector->dk.length;
+	self->op->asym->mlkem.decap.cipher.data = cipher;
+	self->op->asym->mlkem.decap.cipher.length = cipher_len;
+	self->op->asym->mlkem.decap.sk.data = sk;
+	self->op->asym->mlkem.decap.sk.length = 32;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-KEM Decap)");
+
+	debug_hexdump(stdout, "Shared secret from decap",
+		self->result_op->asym->mlkem.decap.sk.data,
+		self->result_op->asym->mlkem.decap.sk.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.decap.sk.length, 32,
+		"Incorrect Shared secret length\n");
+	TEST_ASSERT_BUFFERS_ARE_EQUAL(self->result_op->asym->mlkem.decap.sk.data,
+		skcopy, self->result_op->asym->mlkem.decap.sk.length,
+		"Incorrect Shared secret\n");
+
+	/* Negative test */
+	cipher[0] ^= 0x01;
+	memset(sk, 0, sizeof(sk));
+
+	self->op->asym->mlkem.op = RTE_CRYPTO_ML_KEM_OP_DECAP;
+	self->op->asym->mlkem.decap.dk.data = vector->dk.data;
+	self->op->asym->mlkem.decap.dk.length = vector->dk.length;
+	self->op->asym->mlkem.decap.cipher.data = cipher;
+	self->op->asym->mlkem.decap.cipher.length = cipher_len;
+	self->op->asym->mlkem.decap.sk.data = sk;
+	self->op->asym->mlkem.decap.sk.length = 32;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-KEM Decap)");
+
+	debug_hexdump(stdout, "Shared secret from negative test",
+		self->result_op->asym->mlkem.decap.sk.data,
+		self->result_op->asym->mlkem.decap.sk.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.decap.sk.length, 32,
+		"Incorrect Shared secret length\n");
+
+	if (!memcmp(self->result_op->asym->mlkem.decap.sk.data, skcopy, 32)) {
+		rte_cryptodev_asym_session_free(dev_id, self->sess);
+		return TEST_FAILED;
+	}
+
+	rte_cryptodev_asym_session_free(dev_id, self->sess);
+	return TEST_SUCCESS;
+}
+
+static int
+mlkem_decap(const void *test_data)
+{
+	const struct crypto_testsuite_mlkem_params *vector = test_data;
+	const uint8_t dev_id = params->valid_devs[0];
+	struct rte_crypto_asym_xform xform = {0};
+	uint8_t cipher[TEST_DATA_SIZE] = {0};
+	uint8_t sk[TEST_DATA_SIZE] = {0};
+	size_t cipher_len;
+
+	xform.mlkem.param = vector->param;
+	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+	if (rte_cryptodev_asym_session_create(dev_id, &xform,
+			params->session_mpool, &self->sess) < 0) {
+		RTE_LOG(ERR, USER1, "line %u FAILED: Session creation failed",
+			__LINE__);
+		return TEST_FAILED;
+	}
+
+	rte_crypto_op_attach_asym_session(self->op, self->sess);
+
+	/* Decapsulate and verify */
+	self->op->asym->mlkem.op = RTE_CRYPTO_ML_KEM_OP_DECAP;
+	self->op->asym->mlkem.decap.dk.data = vector->dk.data;
+	self->op->asym->mlkem.decap.dk.length = vector->dk.length;
+	self->op->asym->mlkem.decap.cipher.data = vector->cipher.data;
+	self->op->asym->mlkem.decap.cipher.length = vector->cipher.length;
+	self->op->asym->mlkem.decap.sk.data = sk;
+	self->op->asym->mlkem.decap.sk.length = 32;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-KEM Decap)");
+
+	debug_hexdump(stdout, "Shared secret from decap",
+		self->result_op->asym->mlkem.decap.sk.data,
+		self->result_op->asym->mlkem.decap.sk.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.decap.sk.length, 32,
+		"Incorrect Shared secret length\n");
+	TEST_ASSERT_BUFFERS_ARE_EQUAL(self->result_op->asym->mlkem.decap.sk.data,
+		vector->sk.data, vector->sk.length,
+		"Incorrect Shared secret\n");
+
+	/* Negative test */
+	memcpy(cipher, vector->cipher.data, vector->cipher.length);
+	cipher_len = vector->cipher.length;
+	cipher[0] ^= 0x01;
+	memset(sk, 0, sizeof(sk));
+
+	self->op->asym->mlkem.op = RTE_CRYPTO_ML_KEM_OP_DECAP;
+	self->op->asym->mlkem.decap.dk.data = vector->dk.data;
+	self->op->asym->mlkem.decap.dk.length = vector->dk.length;
+	self->op->asym->mlkem.decap.cipher.data = cipher;
+	self->op->asym->mlkem.decap.cipher.length = cipher_len;
+	self->op->asym->mlkem.decap.sk.data = sk;
+	self->op->asym->mlkem.decap.sk.length = 32;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-KEM Decap)");
+
+	debug_hexdump(stdout, "Shared secret from negative test",
+		self->result_op->asym->mlkem.decap.sk.data,
+		self->result_op->asym->mlkem.decap.sk.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mlkem.decap.sk.length, 32,
+		"Incorrect Shared secret length\n");
+
+	if (!memcmp(self->result_op->asym->mlkem.decap.sk.data,
+		vector->sk.data, vector->sk.length)) {
+		rte_cryptodev_asym_session_free(dev_id, self->sess);
+		return TEST_FAILED;
+	}
+
+	rte_cryptodev_asym_session_free(dev_id, self->sess);
+	return TEST_SUCCESS;
+}
+
+static int
+mldsa_keygen(const void *test_data)
+{
+	const struct crypto_testsuite_mldsa_params *vector = test_data;
+	const uint8_t dev_id = params->valid_devs[0];
+	struct rte_crypto_asym_xform xform = {0};
+	uint8_t privkey[TEST_DATA_SIZE] = {0};
+	uint8_t pubkey[TEST_DATA_SIZE] = {0};
+
+	xform.mldsa.param = vector->param;
+	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+	if (rte_cryptodev_asym_session_create(dev_id, &xform,
+			params->session_mpool, &self->sess) < 0) {
+		RTE_LOG(ERR, USER1, "line %u FAILED: Session creation failed",
+			__LINE__);
+		return TEST_FAILED;
+	}
+
+	rte_crypto_op_attach_asym_session(self->op, self->sess);
+	self->op->asym->mldsa.op = RTE_CRYPTO_ML_DSA_OP_KEYGEN;
+	self->op->asym->mldsa.keygen.seed.data = vector->seed.data;
+	self->op->asym->mldsa.keygen.seed.length = vector->seed.length;
+	self->op->asym->mldsa.keygen.privkey.data = privkey;
+	self->op->asym->mldsa.keygen.privkey.length = 0;
+	self->op->asym->mldsa.keygen.pubkey.data = pubkey;
+	self->op->asym->mldsa.keygen.pubkey.length = 0;
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-DSA KeyGen)");
+
+	debug_hexdump(stdout, "Private key",
+		self->result_op->asym->mldsa.keygen.privkey.data,
+		self->result_op->asym->mldsa.keygen.privkey.length);
+	debug_hexdump(stdout, "Public key",
+		self->result_op->asym->mldsa.keygen.pubkey.data,
+		self->result_op->asym->mldsa.keygen.pubkey.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mldsa.keygen.privkey.length,
+		rte_crypto_ml_dsa_privkey_size[vector->param],
+		"Incorrect Private key length\n");
+	TEST_ASSERT_EQUAL(self->result_op->asym->mldsa.keygen.pubkey.length,
+		rte_crypto_ml_dsa_pubkey_size[vector->param],
+		"Incorrect Public key length\n");
+
+	/* If the seed is all zero, keys are deterministic */
+	if (memcmp(vector->seed.data, (uint8_t [32]) {0},
+			vector->seed.length) == 0) {
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->privkey.data,
+			self->result_op->asym->mldsa.keygen.privkey.data,
+			self->result_op->asym->mldsa.keygen.privkey.length,
+			"Incorrect Private key\n");
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->pubkey.data,
+			self->result_op->asym->mldsa.keygen.pubkey.data,
+			self->result_op->asym->mldsa.keygen.pubkey.length,
+			"Incorrect Public key\n");
+		RTE_LOG(DEBUG, USER1, "Deterministic keygen test passed\n");
+	}
+
+	rte_cryptodev_asym_session_free(dev_id, self->sess);
+	return TEST_SUCCESS;
+}
+
+static int
+mldsa_sign(const void *test_data)
+{
+	const struct crypto_testsuite_mldsa_params *vector = test_data;
+	const uint8_t dev_id = params->valid_devs[0];
+	struct rte_crypto_asym_xform xform = {0};
+	struct rte_cryptodev_info dev_info;
+	uint8_t sign[TEST_DATA_SIZE] = {0};
+	size_t sign_len;
+
+	xform.mldsa.param = vector->param;
+	xform.mldsa.sign_deterministic = vector->sign_deterministic;
+	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+
+	rte_cryptodev_info_get(dev_id, &dev_info);
+
+	/* Check if prehash is supported */
+	if (vector->hash) {
+		if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MLDSA_SIGN_PREHASH)) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support prehash in ML-DSA signature generation. Test skipped\n");
+			return TEST_SKIPPED;
+		}
+	}
+
+	if (rte_cryptodev_asym_session_create(dev_id, &xform,
+			params->session_mpool, &self->sess) < 0) {
+		RTE_LOG(ERR, USER1, "line %u FAILED: Session creation failed",
+			__LINE__);
+		return TEST_FAILED;
+	}
+
+	rte_crypto_op_attach_asym_session(self->op, self->sess);
+
+	/* Sign */
+	self->op->asym->mldsa.op = RTE_CRYPTO_ML_DSA_OP_SIGN;
+	self->op->asym->mldsa.siggen.seed.data = vector->seed.data;
+	self->op->asym->mldsa.siggen.seed.length = vector->seed.length;
+	self->op->asym->mldsa.siggen.privkey.data = vector->privkey.data;
+	self->op->asym->mldsa.siggen.privkey.length = vector->privkey.length;
+	self->op->asym->mldsa.siggen.message.data = vector->message.data;
+	self->op->asym->mldsa.siggen.message.length = vector->message.length;
+	self->op->asym->mldsa.siggen.ctx.data = vector->context.data;
+	self->op->asym->mldsa.siggen.ctx.length = vector->context.length;
+	self->op->asym->mldsa.siggen.mu.data = vector->mu.data;
+	self->op->asym->mldsa.siggen.mu.length = vector->mu.length;
+	self->op->asym->mldsa.siggen.sign.data = sign;
+	self->op->asym->mldsa.siggen.sign.length =
+		rte_crypto_ml_dsa_sign_size[vector->param];
+	self->op->asym->mldsa.siggen.hash = vector->hash;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-DSA Sign)");
+
+	debug_hexdump(stdout, "Signature",
+		self->result_op->asym->mldsa.siggen.sign.data,
+		self->result_op->asym->mldsa.siggen.sign.length);
+
+	/* Verify the result with the test vector */
+	TEST_ASSERT_EQUAL(self->result_op->asym->mldsa.siggen.sign.length,
+		rte_crypto_ml_dsa_sign_size[vector->param],
+		"Incorrect Signature length\n");
+
+	/* Verify signature if it is deterministic */
+	if (vector->sign_deterministic) {
+		TEST_ASSERT_BUFFERS_ARE_EQUAL(vector->sign.data,
+			self->result_op->asym->mldsa.siggen.sign.data,
+			self->result_op->asym->mldsa.siggen.sign.length,
+			"Incorrect Signature\n");
+		RTE_LOG(DEBUG, USER1, "Deterministic signature test passed\n");
+	}
+
+	/* Verify the signature */
+	sign_len = self->result_op->asym->mldsa.siggen.sign.length;
+
+	self->op->asym->mldsa.op = RTE_CRYPTO_ML_DSA_OP_VERIFY;
+	self->op->asym->mldsa.sigver.message.data = vector->message.data;
+	self->op->asym->mldsa.sigver.message.length = vector->message.length;
+	self->op->asym->mldsa.sigver.ctx.data = vector->context.data;
+	self->op->asym->mldsa.sigver.ctx.length = vector->context.length;
+	self->op->asym->mldsa.sigver.mu.data = vector->mu.data;
+	self->op->asym->mldsa.sigver.mu.length = vector->mu.length;
+	self->op->asym->mldsa.sigver.pubkey.data = vector->pubkey.data;
+	self->op->asym->mldsa.sigver.pubkey.length = vector->pubkey.length;
+	self->op->asym->mldsa.sigver.sign.data = sign;
+	self->op->asym->mldsa.sigver.sign.length = sign_len;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-DSA Verify)");
+
+	/* Verify the result */
+	TEST_ASSERT_EQUAL(self->result_op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
+		"Failed to verify the signature");
+
+	/* Negative test */
+	sign[0] ^= 0x01;
+
+	self->op->asym->mldsa.op = RTE_CRYPTO_ML_DSA_OP_VERIFY;
+	self->op->asym->mldsa.sigver.message.data = vector->message.data;
+	self->op->asym->mldsa.sigver.message.length = vector->message.length;
+	self->op->asym->mldsa.sigver.ctx.data = vector->context.data;
+	self->op->asym->mldsa.sigver.ctx.length = vector->context.length;
+	self->op->asym->mldsa.sigver.mu.data = vector->mu.data;
+	self->op->asym->mldsa.sigver.mu.length = vector->mu.length;
+	self->op->asym->mldsa.sigver.pubkey.data = vector->pubkey.data;
+	self->op->asym->mldsa.sigver.pubkey.length = vector->pubkey.length;
+	self->op->asym->mldsa.sigver.sign.data = sign;
+	self->op->asym->mldsa.sigver.sign.length = sign_len;
+
+	TEST_ASSERT_SUCCESS(send_one_no_status_check(),
+		"Failed to process crypto op (ML-DSA Verify)");
+
+	/* Verify the result */
+	if (self->result_op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) {
+		rte_cryptodev_asym_session_free(dev_id, self->sess);
+		return TEST_FAILED;
+	}
+
+	rte_cryptodev_asym_session_free(dev_id, self->sess);
+	return TEST_SUCCESS;
+}
+
+static int
+mldsa_verify(const void *test_data)
+{
+	const struct crypto_testsuite_mldsa_params *vector = test_data;
+	const uint8_t dev_id = params->valid_devs[0];
+	struct rte_crypto_asym_xform xform = {0};
+	uint8_t sign[TEST_DATA_SIZE] = {0};
+	size_t sign_len;
+
+	xform.mldsa.param = vector->param;
+	xform.mldsa.sign_deterministic = vector->sign_deterministic;
+	xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+	if (rte_cryptodev_asym_session_create(dev_id, &xform,
+			params->session_mpool, &self->sess) < 0) {
+		RTE_LOG(ERR, USER1, "line %u FAILED: Session creation failed",
+			__LINE__);
+		return TEST_FAILED;
+	}
+
+	rte_crypto_op_attach_asym_session(self->op, self->sess);
+
+	/* Verify the signature */
+	self->op->asym->mldsa.op = RTE_CRYPTO_ML_DSA_OP_VERIFY;
+	self->op->asym->mldsa.sigver.message.data = vector->message.data;
+	self->op->asym->mldsa.sigver.message.length = vector->message.length;
+	self->op->asym->mldsa.sigver.ctx.data = vector->context.data;
+	self->op->asym->mldsa.sigver.ctx.length = vector->context.length;
+	self->op->asym->mldsa.sigver.mu.data = vector->mu.data;
+	self->op->asym->mldsa.sigver.mu.length = vector->mu.length;
+	self->op->asym->mldsa.sigver.pubkey.data = vector->pubkey.data;
+	self->op->asym->mldsa.sigver.pubkey.length = vector->pubkey.length;
+	self->op->asym->mldsa.sigver.sign.data = vector->sign.data;
+	self->op->asym->mldsa.sigver.sign.length = vector->sign.length;
+
+	TEST_ASSERT_SUCCESS(send_one(),
+		"Failed to process crypto op (ML-DSA Verify)");
+
+	/* Verify the result */
+	TEST_ASSERT_EQUAL(self->result_op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
+		"Failed to verify the signature");
+
+	/* Negative test */
+	memcpy(sign, vector->sign.data, vector->sign.length);
+	sign_len = vector->sign.length;
+	sign[0] ^= 0x01;
+
+	self->op->asym->mldsa.op = RTE_CRYPTO_ML_DSA_OP_VERIFY;
+	self->op->asym->mldsa.sigver.message.data = vector->message.data;
+	self->op->asym->mldsa.sigver.message.length = vector->message.length;
+	self->op->asym->mldsa.sigver.ctx.data = vector->context.data;
+	self->op->asym->mldsa.sigver.ctx.length = vector->context.length;
+	self->op->asym->mldsa.sigver.mu.data = vector->mu.data;
+	self->op->asym->mldsa.sigver.mu.length = vector->mu.length;
+	self->op->asym->mldsa.sigver.pubkey.data = vector->pubkey.data;
+	self->op->asym->mldsa.sigver.pubkey.length = vector->pubkey.length;
+	self->op->asym->mldsa.sigver.sign.data = sign;
+	self->op->asym->mldsa.sigver.sign.length = sign_len;
+
+	TEST_ASSERT_SUCCESS(send_one_no_status_check(),
+		"Failed to process crypto op (ML-DSA Verify)");
+
+	/* Verify the result */
+	if (self->result_op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) {
+		rte_cryptodev_asym_session_free(dev_id, self->sess);
+		return TEST_FAILED;
+	}
+
+	rte_cryptodev_asym_session_free(dev_id, self->sess);
+	return TEST_SUCCESS;
+}
+
+static int
+test_mlkem_keygen(void)
+{
+	struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+	const struct rte_cryptodev_asymmetric_xform_capability *capa;
+	struct rte_cryptodev_asym_capability_idx idx;
+	uint8_t dev_id = ts_params->valid_devs[0];
+	int overall_status = TEST_SUCCESS;
+	int ret;
+
+	/* Check if ML-KEM is supported */
+	idx.type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+	capa = rte_cryptodev_asym_capability_get(dev_id, &idx);
+	if (capa == NULL) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-KEM. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	if (!(capa->op_types & (1 <<  RTE_CRYPTO_ML_KEM_OP_KEYGEN))) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-KEM keygen operation. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	for (uint8_t i = 0; i < RTE_DIM(mlkem_keygen_test_vectors); i++) {
+		if (!(capa->mlkem_capa[RTE_CRYPTO_ML_KEM_OP_KEYGEN] &
+			(1 << mlkem_keygen_test_vectors[i].param))) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support ML-KEM param %u. TestCase %s skipped\n",
+				mlkem_keygen_test_vectors[i].param,
+				mlkem_keygen_test_vectors[i].name);
+			printf("  %u) TestCase %s: skipped\n", i,
+				mlkem_keygen_test_vectors[i].name);
+			continue;
+		}
+		ret = mlkem_keygen(&mlkem_keygen_test_vectors[i]);
+		if (ret == TEST_SUCCESS || ret == TEST_SKIPPED) {
+			printf("  %u) TestCase %s: %s\n", i, mlkem_keygen_test_vectors[i].name,
+				(ret == TEST_SKIPPED) ? "skipped" : "passed");
+				continue;
+		}
+
+		printf("  %u) TestCase %s: failed\n", i, mlkem_keygen_test_vectors[i].name);
+		overall_status = TEST_FAILED;
+	}
+
+	return overall_status;
+}
+
+static int
+test_mlkem_encap(void)
+{
+	struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+	const struct rte_cryptodev_asymmetric_xform_capability *capa;
+	struct rte_cryptodev_asym_capability_idx idx;
+	uint8_t dev_id = ts_params->valid_devs[0];
+	int overall_status = TEST_SUCCESS;
+	int ret;
+
+	/* Check if ML-KEM is supported */
+	idx.type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+	capa = rte_cryptodev_asym_capability_get(dev_id, &idx);
+	if (capa == NULL) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-KEM. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	if (!(capa->op_types & (1 <<  RTE_CRYPTO_ML_KEM_OP_ENCAP))) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-KEM encap operation. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	for (uint8_t i = 0; i < RTE_DIM(mlkem_encap_test_vectors); i++) {
+		if (!(capa->mlkem_capa[RTE_CRYPTO_ML_KEM_OP_ENCAP] &
+			(1 << mlkem_encap_test_vectors[i].param))) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support ML-KEM param %u. TestCase %s skipped\n",
+				mlkem_encap_test_vectors[i].param,
+				mlkem_encap_test_vectors[i].name);
+			printf("  %u) TestCase %s: skipped\n", i,
+				mlkem_encap_test_vectors[i].name);
+			continue;
+		}
+		ret = mlkem_encap(&mlkem_encap_test_vectors[i]);
+		if (ret == TEST_SUCCESS || ret == TEST_SKIPPED) {
+			printf("  %u) TestCase %s: %s\n", i, mlkem_encap_test_vectors[i].name,
+				(ret == TEST_SKIPPED) ? "skipped" : "passed");
+				continue;
+		}
+
+		printf("  %u) TestCase %s: failed\n", i, mlkem_encap_test_vectors[i].name);
+		overall_status = TEST_FAILED;
+	}
+
+	return overall_status;
+}
+
+static int
+test_mlkem_decap(void)
+{
+	struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+	const struct rte_cryptodev_asymmetric_xform_capability *capa;
+	struct rte_cryptodev_asym_capability_idx idx;
+	uint8_t dev_id = ts_params->valid_devs[0];
+	int overall_status = TEST_SUCCESS;
+	int ret;
+
+	/* Check if ML-KEM is supported */
+	idx.type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+	capa = rte_cryptodev_asym_capability_get(dev_id, &idx);
+	if (capa == NULL) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-KEM. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	if (!(capa->op_types & (1 <<  RTE_CRYPTO_ML_KEM_OP_DECAP))) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-KEM decap operation. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	for (uint8_t i = 0; i < RTE_DIM(mlkem_decap_test_vectors); i++) {
+		if (!(capa->mlkem_capa[RTE_CRYPTO_ML_KEM_OP_DECAP] &
+			(1 << mlkem_decap_test_vectors[i].param))) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support ML-KEM param %u. TestCase %s skipped\n",
+				mlkem_decap_test_vectors[i].param,
+				mlkem_decap_test_vectors[i].name);
+			printf("  %u) TestCase %s: skipped\n", i,
+				mlkem_decap_test_vectors[i].name);
+			continue;
+		}
+		ret = mlkem_decap(&mlkem_decap_test_vectors[i]);
+		if (ret == TEST_SUCCESS || ret == TEST_SKIPPED) {
+			printf("  %u) TestCase %s: %s\n", i, mlkem_decap_test_vectors[i].name,
+				(ret == TEST_SKIPPED) ? "skipped" : "passed");
+				continue;
+		}
+
+		printf("  %u) TestCase %s: failed\n", i, mlkem_decap_test_vectors[i].name);
+		overall_status = TEST_FAILED;
+	}
+
+	return overall_status;
+}
+
+static int
+test_mldsa_keygen(void)
+{
+	struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+	const struct rte_cryptodev_asymmetric_xform_capability *capa;
+	struct rte_cryptodev_asym_capability_idx idx;
+	uint8_t dev_id = ts_params->valid_devs[0];
+	int overall_status = TEST_SUCCESS;
+	int ret;
+
+	/* Check if ML-DSA is supported */
+	idx.type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+	capa = rte_cryptodev_asym_capability_get(dev_id, &idx);
+	if (capa == NULL) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-DSA. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	if (!(capa->op_types & (1 <<  RTE_CRYPTO_ML_DSA_OP_KEYGEN))) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-DSA keygen operation. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	for (uint8_t i = 0; i < RTE_DIM(mldsa_keygen_test_vectors); i++) {
+		if (!(capa->mldsa_capa[RTE_CRYPTO_ML_DSA_OP_KEYGEN] &
+			(1 << mldsa_keygen_test_vectors[i].param))) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support ML-DSA param %u. TestCase %s skipped\n",
+				mldsa_keygen_test_vectors[i].param,
+				mldsa_keygen_test_vectors[i].name);
+			printf("  %u) TestCase %s: skipped\n", i,
+				mldsa_keygen_test_vectors[i].name);
+			continue;
+		}
+		ret = mldsa_keygen(&mldsa_keygen_test_vectors[i]);
+		if (ret == TEST_SUCCESS || ret == TEST_SKIPPED) {
+			printf("  %u) TestCase %s: %s\n", i, mldsa_keygen_test_vectors[i].name,
+				(ret == TEST_SKIPPED) ? "skipped" : "passed");
+				continue;
+		}
+
+		printf("  %u) TestCase %s: failed\n", i, mldsa_keygen_test_vectors[i].name);
+		overall_status = TEST_FAILED;
+	}
+
+	return overall_status;
+}
+
+static int
+test_mldsa_sign(void)
+{
+	struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+	const struct rte_cryptodev_asymmetric_xform_capability *capa;
+	struct rte_cryptodev_asym_capability_idx idx;
+	uint8_t dev_id = ts_params->valid_devs[0];
+	int overall_status = TEST_SUCCESS;
+	int ret;
+
+	/* Check if ML-DSA is supported */
+	idx.type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+	capa = rte_cryptodev_asym_capability_get(dev_id, &idx);
+	if (capa == NULL) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-DSA. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	if (!(capa->op_types & (1 <<  RTE_CRYPTO_ML_DSA_OP_SIGN))) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-DSA sign operation. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	for (uint8_t i = 0; i < RTE_DIM(mldsa_sign_test_vectors); i++) {
+		if (!(capa->mldsa_capa[RTE_CRYPTO_ML_DSA_OP_SIGN] &
+			(1 << mldsa_sign_test_vectors[i].param))) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support ML-DSA param %u. TestCase %s skipped\n",
+				mldsa_sign_test_vectors[i].param,
+				mldsa_sign_test_vectors[i].name);
+			printf("  %u) TestCase %s: skipped\n", i,
+				mldsa_sign_test_vectors[i].name);
+			continue;
+		}
+		ret = mldsa_sign(&mldsa_sign_test_vectors[i]);
+		if (ret == TEST_SUCCESS || ret == TEST_SKIPPED) {
+			printf("  %u) TestCase %s: %s\n", i, mldsa_sign_test_vectors[i].name,
+				(ret == TEST_SKIPPED) ? "skipped" : "passed");
+				continue;
+		}
+
+		printf("  %u) TestCase %s: failed\n", i, mldsa_sign_test_vectors[i].name);
+		overall_status = TEST_FAILED;
+	}
+
+	return overall_status;
+}
+
+static int
+test_mldsa_verify(void)
+{
+	struct crypto_testsuite_params_asym *ts_params = &testsuite_params;
+	const struct rte_cryptodev_asymmetric_xform_capability *capa;
+	struct rte_cryptodev_asym_capability_idx idx;
+	uint8_t dev_id = ts_params->valid_devs[0];
+	int overall_status = TEST_SUCCESS;
+	int ret;
+
+	/* Check if ML-DSA is supported */
+	idx.type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+	capa = rte_cryptodev_asym_capability_get(dev_id, &idx);
+	if (capa == NULL) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-DSA. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	if (!(capa->op_types & (1 <<  RTE_CRYPTO_ML_DSA_OP_VERIFY))) {
+		RTE_LOG(DEBUG, USER1,
+			"Device doesn't support ML-DSA verify operation. Test skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	for (uint8_t i = 0; i < RTE_DIM(mldsa_verify_test_vectors); i++) {
+		if (!(capa->mldsa_capa[RTE_CRYPTO_ML_DSA_OP_VERIFY] &
+			(1 << mldsa_verify_test_vectors[i].param))) {
+			RTE_LOG(DEBUG, USER1,
+				"Device doesn't support ML-DSA param %u. TestCase %s skipped\n",
+				mldsa_verify_test_vectors[i].param,
+				mldsa_verify_test_vectors[i].name);
+			printf("  %u) TestCase %s: skipped\n", i,
+				mldsa_verify_test_vectors[i].name);
+			continue;
+		}
+		ret = mldsa_verify(&mldsa_verify_test_vectors[i]);
+		if (ret == TEST_SUCCESS || ret == TEST_SKIPPED) {
+			printf("  %u) TestCase %s: %s\n", i, mldsa_verify_test_vectors[i].name,
+				(ret == TEST_SKIPPED) ? "skipped" : "passed");
+				continue;
+		}
+
+		printf("  %u) TestCase %s: failed\n", i, mldsa_verify_test_vectors[i].name);
+		overall_status = TEST_FAILED;
+	}
+
+	return overall_status;
+}
+
 #define SET_RSA_PARAM(arg, vector, coef) \
 	uint8_t coef[TEST_DATA_SIZE] = { }; \
 	memcpy(coef, vector->coef.data, vector->coef.len); \
@@ -3987,6 +4837,12 @@ static struct unit_test_suite cryptodev_openssl_asym_testsuite  = {
 			ut_setup_asym, ut_teardown_asym,
 			modular_exponentiation, &modex_group_test_cases[7]),
 		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_eddsa_sign_verify_all_curve),
+		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_mlkem_keygen),
+		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_mlkem_encap),
+		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_mlkem_decap),
+		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_mldsa_keygen),
+		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_mldsa_sign),
+		TEST_CASE_ST(ut_setup_asym, ut_teardown_asym, test_mldsa_verify),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
 };
diff --git a/app/test/test_cryptodev_ml_dsa_test_vectors.h b/app/test/test_cryptodev_ml_dsa_test_vectors.h
new file mode 100644
index 0000000000..7dfaca5f90
--- /dev/null
+++ b/app/test/test_cryptodev_ml_dsa_test_vectors.h
@@ -0,0 +1,1856 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2025 Marvell.
+ */
+
+#ifndef __TEST_CRYPTODEV_ML_DSA_TEST_VECTORS_H__
+#define __TEST_CRYPTODEV_ML_DSA_TEST_VECTORS_H__
+
+#include "rte_crypto_asym.h"
+
+struct crypto_testsuite_mldsa_params {
+	const char *name;
+	enum rte_crypto_ml_dsa_param_set param;
+	enum rte_crypto_auth_algorithm hash;
+	rte_crypto_param seed;
+	rte_crypto_param privkey;
+	rte_crypto_param pubkey;
+	rte_crypto_param message;
+	rte_crypto_param context;
+	rte_crypto_param mu;
+	rte_crypto_param sign;
+	bool sign_deterministic;
+};
+
+/* Seed */
+uint8_t mldsa_44_seed[] = {
+	0xf4, 0x41, 0xc9, 0x62, 0x17, 0x32, 0x2c, 0xbc,
+	0xcf, 0x05, 0xf7, 0x5b, 0xd5, 0xfb, 0x0a, 0x0a,
+	0x78, 0xbf, 0xad, 0xab, 0x89, 0x6e, 0x88, 0xdb,
+	0xb4, 0x08, 0x90, 0xe0, 0x16, 0x9b, 0xb6, 0x66,
+};
+
+/* Private key */
+uint8_t mldsa_44_privkey[] = {
+	0xcc, 0x2c, 0x93, 0xce, 0xfc, 0x0b, 0xf6, 0x74,
+	0x93, 0x28, 0x95, 0xe8, 0xc0, 0xc8, 0x83, 0xb8,
+	0xc9, 0x0c, 0x9a, 0x5c, 0x18, 0xd2, 0x79, 0x5c,
+	0xf3, 0x58, 0xd8, 0x02, 0x6c, 0x5e, 0xad, 0x79,
+	0xc1, 0xae, 0x0a, 0x97, 0x90, 0x41, 0x10, 0x32,
+	0x59, 0x46, 0x12, 0x27, 0x0a, 0xa3, 0xc7, 0xf0,
+	0x74, 0x54, 0x3d, 0xb2, 0x24, 0xc2, 0xa2, 0xec,
+	0xaf, 0x31, 0xa0, 0xf4, 0x78, 0x97, 0x7c, 0x6a,
+	0xdc, 0x91, 0x87, 0x60, 0x01, 0xa9, 0x19, 0x2d,
+	0x0d, 0xca, 0xb4, 0x14, 0x9d, 0x41, 0xe3, 0x18,
+	0x4b, 0x99, 0x31, 0xfa, 0xf4, 0xfa, 0xc4, 0x75,
+	0x93, 0x87, 0xc7, 0x7a, 0x8f, 0x0e, 0xc6, 0xb2,
+	0xfa, 0xf6, 0x48, 0x84, 0x17, 0x42, 0x01, 0xcb,
+	0xd2, 0x55, 0x40, 0x2f, 0x23, 0x21, 0x91, 0x11,
+	0x40, 0x00, 0xdc, 0x91, 0x3d, 0xf5, 0x96, 0xdb,
+	0xb3, 0x6d, 0xd5, 0xf4, 0xc5, 0x11, 0x96, 0x8f,
+	0x13, 0x25, 0x4a, 0x24, 0xb3, 0x90, 0x9b, 0x16,
+	0x30, 0x20, 0x96, 0x10, 0x10, 0x97, 0x6c, 0xd0,
+	0x26, 0x26, 0x61, 0x84, 0x85, 0x1b, 0xb2, 0x81,
+	0x5c, 0x10, 0x88, 0x48, 0xc8, 0x8d, 0x1c, 0x42,
+	0x61, 0x19, 0x32, 0x04, 0x81, 0xa6, 0x89, 0x98,
+	0x42, 0x62, 0x14, 0xa3, 0x90, 0xc8, 0xc2, 0x4c,
+	0x41, 0x04, 0x2c, 0x5b, 0x26, 0x2a, 0xd1, 0x30,
+	0x12, 0x18, 0x40, 0x71, 0x08, 0x98, 0x70, 0x60,
+	0x40, 0x09, 0x4a, 0x44, 0x0a, 0x24, 0x43, 0x92,
+	0x04, 0x20, 0x06, 0x80, 0xa2, 0x01, 0x18, 0x47,
+	0x12, 0x23, 0xc7, 0x6c, 0x50, 0x32, 0x61, 0xda,
+	0x26, 0x40, 0x84, 0x98, 0x90, 0xd3, 0x04, 0x66,
+	0x52, 0xb8, 0x70, 0x99, 0x02, 0x6c, 0x64, 0xb2,
+	0x00, 0x1b, 0x35, 0x90, 0x23, 0x00, 0x92, 0x01,
+	0x02, 0x20, 0x12, 0x89, 0x25, 0x62, 0xa6, 0x4d,
+	0x1b, 0x29, 0x08, 0x08, 0x46, 0x72, 0xa1, 0x18,
+	0x11, 0x03, 0x80, 0x60, 0xd4, 0x38, 0x80, 0x64,
+	0x36, 0x4e, 0x23, 0x30, 0x8e, 0x23, 0x81, 0x60,
+	0xd1, 0x84, 0x89, 0xe2, 0xa8, 0x2d, 0x80, 0x92,
+	0x61, 0x8a, 0x22, 0x28, 0x0a, 0xc9, 0x50, 0xe3,
+	0x96, 0x40, 0x84, 0xa0, 0x0d, 0xd8, 0xc2, 0x2c,
+	0xd1, 0x30, 0x10, 0x18, 0xa0, 0x48, 0xe2, 0xb2,
+	0x04, 0x00, 0xa8, 0x29, 0x19, 0x42, 0x68, 0xa3,
+	0xa2, 0x71, 0xd9, 0xc0, 0x45, 0xa2, 0xc6, 0x4c,
+	0x51, 0x36, 0x71, 0xc1, 0x40, 0x02, 0x08, 0x12,
+	0x72, 0x90, 0x04, 0x2e, 0x80, 0x30, 0x24, 0x8b,
+	0x90, 0x44, 0x82, 0x82, 0x68, 0xa2, 0x84, 0x2d,
+	0x08, 0x00, 0x61, 0x23, 0x82, 0x48, 0x00, 0x33,
+	0x29, 0x58, 0x48, 0x86, 0x01, 0x01, 0x21, 0x62,
+	0xa8, 0x91, 0xe3, 0x10, 0x6c, 0x58, 0x24, 0x09,
+	0x0c, 0x14, 0x02, 0x63, 0x22, 0x20, 0x12, 0x48,
+	0x70, 0x81, 0x26, 0x6e, 0x00, 0x86, 0x31, 0x1a,
+	0x22, 0x65, 0x40, 0x38, 0x00, 0x02, 0x47, 0x09,
+	0xc9, 0x82, 0x8c, 0x82, 0xa0, 0x2c, 0xd3, 0x04,
+	0x45, 0x50, 0xb0, 0x28, 0xd0, 0x10, 0x8d, 0x1c,
+	0x10, 0x52, 0x4b, 0x00, 0x66, 0xc8, 0xc0, 0x08,
+	0x9a, 0xa8, 0x2d, 0xd4, 0x02, 0x8a, 0x1b, 0x35,
+	0x65, 0x04, 0xc7, 0x28, 0x84, 0x38, 0x50, 0x18,
+	0x20, 0x4a, 0x91, 0x18, 0x8c, 0x9b, 0x20, 0x09,
+	0x94, 0x08, 0x71, 0x64, 0x06, 0x25, 0x20, 0x23,
+	0x09, 0xd8, 0x82, 0x68, 0x5a, 0xa6, 0x31, 0x63,
+	0x36, 0x32, 0x5c, 0x12, 0x62, 0xdb, 0x32, 0x6e,
+	0x14, 0x93, 0x68, 0x9a, 0x34, 0x80, 0x83, 0x44,
+	0x4a, 0x18, 0x13, 0x49, 0x43, 0xb8, 0x0d, 0xda,
+	0x92, 0x41, 0x42, 0xb8, 0x84, 0x52, 0x94, 0x91,
+	0x04, 0x05, 0x4d, 0xa2, 0x38, 0x64, 0x01, 0x19,
+	0x05, 0x18, 0xa2, 0x4d, 0x90, 0x34, 0x26, 0x91,
+	0x30, 0x68, 0x1c, 0x14, 0x44, 0x4b, 0x18, 0x22,
+	0x12, 0x90, 0x91, 0x42, 0x96, 0x91, 0x19, 0x48,
+	0x4c, 0x24, 0x46, 0x80, 0xc3, 0xb8, 0x8c, 0x1c,
+	0x80, 0x8d, 0x18, 0x45, 0x88, 0xd8, 0x94, 0x4c,
+	0x13, 0x02, 0x65, 0xd3, 0x22, 0x29, 0x49, 0x04,
+	0x82, 0x04, 0xc2, 0x40, 0x04, 0x34, 0x21, 0xe1,
+	0x34, 0x46, 0x20, 0x90, 0x44, 0x93, 0x14, 0x44,
+	0xdb, 0xc0, 0x4d, 0x1b, 0xa2, 0x24, 0x5a, 0x24,
+	0x68, 0x10, 0x46, 0x66, 0x11, 0x43, 0x29, 0xd0,
+	0x90, 0x0d, 0x49, 0x12, 0x4c, 0xc1, 0x96, 0x2c,
+	0xdb, 0x22, 0x65, 0xe4, 0x16, 0x24, 0xd1, 0x24,
+	0x26, 0x53, 0xb8, 0x45, 0x8a, 0xb4, 0x11, 0x04,
+	0x96, 0x28, 0x80, 0x22, 0x8e, 0xd1, 0x10, 0x05,
+	0x44, 0x44, 0x8a, 0x5c, 0xb4, 0x50, 0xdc, 0x10,
+	0x02, 0xc1, 0xa2, 0x4c, 0x11, 0x05, 0x2c, 0x21,
+	0x39, 0x6a, 0x64, 0x36, 0x01, 0x09, 0xc3, 0x0c,
+	0x9a, 0x24, 0x52, 0x92, 0x20, 0x0a, 0xd2, 0xa8,
+	0x49, 0x99, 0xc6, 0x8d, 0x50, 0x26, 0x62, 0x09,
+	0x42, 0x05, 0x5b, 0xc0, 0x41, 0xd0, 0x22, 0x25,
+	0x09, 0xb4, 0x2d, 0x98, 0xa2, 0x24, 0x12, 0x84,
+	0x0d, 0xca, 0x98, 0x11, 0x22, 0x80, 0x21, 0x1b,
+	0x00, 0x44, 0x84, 0xc6, 0x89, 0x92, 0x48, 0x42,
+	0x50, 0xc8, 0x60, 0x24, 0x15, 0x69, 0xa2, 0x48,
+	0x06, 0xc4, 0xb0, 0x24, 0x63, 0x14, 0x40, 0x12,
+	0xc4, 0x61, 0x82, 0x30, 0x60, 0x88, 0x96, 0x89,
+	0xc9, 0xc0, 0x89, 0x12, 0x36, 0x82, 0x8c, 0xc0,
+	0x09, 0xc0, 0x88, 0x91, 0xdb, 0x10, 0x64, 0x08,
+	0x36, 0x71, 0x94, 0x10, 0x46, 0x20, 0x83, 0x10,
+	0x13, 0x13, 0x4c, 0x08, 0x28, 0x45, 0x24, 0xb9,
+	0x64, 0x09, 0xb0, 0x48, 0x1c, 0x25, 0x50, 0x23,
+	0x40, 0x90, 0xe0, 0x96, 0x50, 0x9a, 0x38, 0x41,
+	0xcc, 0xb2, 0x2c, 0xdb, 0x04, 0x66, 0x61, 0x48,
+	0x30, 0x02, 0x34, 0x4e, 0xd1, 0xc2, 0x85, 0xc9,
+	0x06, 0x41, 0x19, 0x30, 0x69, 0xc8, 0x94, 0x68,
+	0x1c, 0x83, 0x70, 0x03, 0x10, 0x4d, 0xc2, 0x16,
+	0x4e, 0x64, 0x92, 0x30, 0x60, 0x16, 0x84, 0xa2,
+	0xa8, 0x90, 0xa4, 0x38, 0x11, 0x0a, 0x88, 0x05,
+	0x10, 0x93, 0x88, 0x43, 0x06, 0x10, 0x18, 0x10,
+	0x70, 0x03, 0x28, 0x42, 0x89, 0x28, 0x8d, 0x8a,
+	0xa8, 0x09, 0x94, 0x42, 0x85, 0xa3, 0x10, 0x61,
+	0x0c, 0x45, 0x50, 0x04, 0x31, 0x4c, 0xd1, 0x10,
+	0x12, 0x8b, 0x96, 0x05, 0x03, 0xa0, 0x89, 0x21,
+	0xc4, 0x4d, 0x61, 0xc8, 0x61, 0x09, 0x99, 0x10,
+	0x59, 0x96, 0x49, 0x00, 0x89, 0x08, 0x23, 0x00,
+	0x10, 0xcc, 0xa4, 0x61, 0x01, 0x25, 0x80, 0x21,
+	0x31, 0x09, 0x13, 0x28, 0x0d, 0x1c, 0x05, 0x85,
+	0x62, 0x92, 0x44, 0x09, 0x10, 0x8a, 0x5a, 0xa6,
+	0x20, 0x89, 0xb0, 0x20, 0x0c, 0xb3, 0x01, 0xc9,
+	0x26, 0x61, 0x0b, 0x34, 0x6a, 0x8b, 0x44, 0x0e,
+	0xf2, 0x47, 0x18, 0xf8, 0x4a, 0xfa, 0x45, 0x60,
+	0x87, 0xeb, 0x0f, 0xff, 0x75, 0xa6, 0xba, 0x18,
+	0x9a, 0x7d, 0x37, 0xc4, 0xc7, 0x7e, 0x1a, 0xc9,
+	0x0d, 0x06, 0x53, 0xca, 0xf0, 0x2c, 0xe9, 0xe9,
+	0x4b, 0x5f, 0x8b, 0xbc, 0x77, 0xc6, 0x71, 0x68,
+	0x4f, 0x8c, 0x3b, 0x30, 0x59, 0x91, 0xf0, 0xb5,
+	0x6d, 0xa6, 0x28, 0x2c, 0xd4, 0x0a, 0x00, 0x27,
+	0x6a, 0x39, 0x17, 0x88, 0xa9, 0x93, 0xbb, 0x6e,
+	0xda, 0x3e, 0x4b, 0xb7, 0x1b, 0x6a, 0xb2, 0xe2,
+	0xc4, 0x6f, 0x21, 0x78, 0x74, 0xff, 0xa2, 0x02,
+	0x65, 0x68, 0xa4, 0xce, 0xb4, 0xfe, 0x0c, 0x18,
+	0x59, 0xb9, 0xc8, 0x33, 0x41, 0x27, 0xa1, 0x4b,
+	0xcf, 0xe9, 0xa9, 0xd7, 0x2d, 0xf9, 0xcd, 0xc6,
+	0xde, 0x4e, 0x1d, 0x7d, 0x07, 0xf4, 0xda, 0xed,
+	0x89, 0xa1, 0xef, 0xbc, 0xec, 0x1b, 0xc3, 0x07,
+	0xfd, 0xf5, 0x96, 0xa3, 0x6c, 0x70, 0xc8, 0xb9,
+	0x9f, 0x46, 0x0a, 0xad, 0x46, 0x01, 0xa1, 0x92,
+	0x7c, 0xd1, 0x12, 0x78, 0x89, 0x89, 0x98, 0x68,
+	0x9e, 0xdd, 0xd9, 0x7b, 0x9f, 0x2b, 0x29, 0xc1,
+	0x0e, 0x29, 0xb0, 0x44, 0x7c, 0x22, 0xd7, 0x67,
+	0x47, 0x91, 0xf0, 0xf8, 0x56, 0x79, 0x89, 0x42,
+	0x95, 0x60, 0x53, 0x32, 0xc1, 0x14, 0x48, 0x56,
+	0x67, 0x00, 0x80, 0x86, 0xcd, 0x80, 0x21, 0x75,
+	0xe8, 0xe2, 0x41, 0x6a, 0x5d, 0xb2, 0x12, 0x57,
+	0x1e, 0x83, 0x34, 0xa4, 0x95, 0x4e, 0x0e, 0x71,
+	0xac, 0xcb, 0x09, 0xef, 0xea, 0x4e, 0xe0, 0x4d,
+	0x44, 0xb2, 0x67, 0xd2, 0x6e, 0x78, 0x01, 0xb5,
+	0x09, 0x64, 0xa7, 0xdf, 0xe6, 0x16, 0x72, 0x6b,
+	0x19, 0xe5, 0x88, 0x8a, 0x06, 0xae, 0x0a, 0x93,
+	0xdb, 0xee, 0x0e, 0xf6, 0x52, 0x84, 0x95, 0x2b,
+	0xf8, 0xf4, 0xcd, 0x5d, 0x8b, 0x3a, 0x86, 0x87,
+	0x8e, 0x8b, 0x97, 0x65, 0xb1, 0xd6, 0x50, 0xbc,
+	0xa7, 0xf0, 0x32, 0xb5, 0x39, 0x1e, 0x10, 0x7d,
+	0x96, 0x11, 0xc1, 0xe8, 0x47, 0xfa, 0xdd, 0x24,
+	0x22, 0xb6, 0x43, 0xb2, 0x41, 0x95, 0x98, 0x1a,
+	0x3f, 0x0f, 0x9a, 0xd3, 0xc4, 0x10, 0x19, 0x85,
+	0x0a, 0x0d, 0xde, 0xb7, 0x76, 0xec, 0xe3, 0x57,
+	0x2e, 0x38, 0x4e, 0xb1, 0x2e, 0x4a, 0xaf, 0xc8,
+	0x78, 0xa7, 0xb3, 0x1e, 0xaf, 0xe0, 0xe4, 0xbb,
+	0xc8, 0x0b, 0x24, 0x04, 0x08, 0xd2, 0xbc, 0x91,
+	0xca, 0x8e, 0x4e, 0x85, 0x39, 0x76, 0x20, 0xc9,
+	0xa7, 0x47, 0x8b, 0x6a, 0xd9, 0xc8, 0xb7, 0xb0,
+	0xa5, 0xa2, 0x85, 0x48, 0x4c, 0xcb, 0x16, 0xaf,
+	0x45, 0x48, 0x00, 0xbe, 0x67, 0xef, 0x67, 0x65,
+	0xa3, 0x9d, 0x43, 0x07, 0x59, 0x88, 0x9a, 0xad,
+	0xe5, 0xad, 0x1e, 0xeb, 0xd5, 0xd4, 0xc7, 0xa4,
+	0xb9, 0x40, 0x70, 0x2c, 0xe1, 0xcb, 0x5c, 0x3f,
+	0x49, 0x6b, 0x51, 0xbf, 0xd3, 0xb7, 0xea, 0x33,
+	0x52, 0x73, 0xcf, 0x26, 0x19, 0x54, 0x1d, 0xb6,
+	0x33, 0x5d, 0x1a, 0x88, 0xdb, 0xd6, 0xfe, 0xae,
+	0xf4, 0x45, 0x67, 0x80, 0x8a, 0xfc, 0xc4, 0xbe,
+	0xfb, 0x6a, 0x4a, 0x75, 0x88, 0x35, 0x26, 0x1f,
+	0x90, 0x65, 0x26, 0x5e, 0xb8, 0x0d, 0x15, 0x9d,
+	0x70, 0x76, 0xf2, 0xfd, 0xed, 0x55, 0x71, 0x2b,
+	0xe8, 0x2d, 0xc0, 0x28, 0xee, 0x53, 0x7c, 0xa1,
+	0x3e, 0x86, 0x74, 0xa2, 0xd3, 0x9e, 0x2c, 0x70,
+	0x15, 0x3a, 0x90, 0xfd, 0x1d, 0xac, 0x81, 0x2d,
+	0xa6, 0x6a, 0xe6, 0xd7, 0x7f, 0xd9, 0x97, 0xc9,
+	0x47, 0x7c, 0x07, 0xe6, 0x35, 0x45, 0xc9, 0x1f,
+	0x08, 0xbc, 0x14, 0xdb, 0x12, 0x84, 0xc3, 0xc8,
+	0xe2, 0x86, 0xa3, 0xa2, 0x1e, 0xfb, 0x3f, 0xca,
+	0x92, 0x04, 0xe0, 0x6b, 0x29, 0xe0, 0xe0, 0x23,
+	0x51, 0x40, 0x8e, 0xec, 0xf8, 0x87, 0xa2, 0x7a,
+	0x2d, 0x8b, 0xc2, 0x62, 0x8c, 0x29, 0x82, 0x4b,
+	0x86, 0x1a, 0xa7, 0xc6, 0xaa, 0x24, 0x5f, 0x24,
+	0x03, 0x20, 0xa8, 0x3c, 0xa3, 0xcb, 0xd1, 0x60,
+	0x64, 0x7d, 0x22, 0x9b, 0x07, 0x46, 0x1e, 0xff,
+	0x43, 0xa9, 0x38, 0x34, 0x0f, 0x01, 0x00, 0x7f,
+	0xc6, 0xcb, 0x0a, 0xed, 0x73, 0xc0, 0xfb, 0x77,
+	0x80, 0x8c, 0x2c, 0x4c, 0xa5, 0x20, 0xe8, 0xcf,
+	0x37, 0xf9, 0x00, 0x12, 0xe1, 0x6c, 0xb5, 0x9a,
+	0x91, 0xbe, 0x1f, 0xaf, 0xf1, 0x8c, 0x6e, 0x09,
+	0xea, 0xcf, 0xac, 0x43, 0x6e, 0x32, 0xd0, 0xf4,
+	0x89, 0x4e, 0x42, 0xc2, 0xe7, 0x84, 0x7a, 0x66,
+	0xb5, 0x2b, 0x5c, 0x7d, 0x83, 0x4b, 0xd4, 0x3d,
+	0x81, 0x6d, 0x68, 0xb9, 0x72, 0xe5, 0xd5, 0xe5,
+	0xf5, 0x9c, 0x4d, 0x95, 0xcd, 0xcd, 0x4d, 0x9a,
+	0x4e, 0x69, 0xb9, 0x8a, 0x1e, 0x96, 0x69, 0xc0,
+	0xe0, 0x39, 0x02, 0x21, 0x1c, 0x82, 0xd9, 0x5b,
+	0xe5, 0xde, 0x34, 0xff, 0xf0, 0x15, 0xc7, 0x9a,
+	0x62, 0x83, 0xca, 0xa3, 0x70, 0x15, 0xeb, 0x8f,
+	0x73, 0x0e, 0xa9, 0x9c, 0xe9, 0xe3, 0xe7, 0xfc,
+	0xb4, 0xcb, 0xac, 0xdf, 0x61, 0x91, 0xf3, 0x4b,
+	0x87, 0xa6, 0x29, 0xea, 0x36, 0x81, 0x07, 0x3e,
+	0xae, 0x69, 0xee, 0x87, 0x2a, 0x30, 0x1c, 0x97,
+	0x96, 0x40, 0x08, 0x48, 0xcf, 0x5f, 0xfe, 0x57,
+	0x23, 0xfd, 0xb7, 0x9a, 0x69, 0xef, 0xf5, 0x6e,
+	0xc9, 0xdd, 0x95, 0x2b, 0x17, 0xd5, 0x2c, 0xad,
+	0xa4, 0x49, 0x78, 0xb1, 0xd1, 0x00, 0xe7, 0xca,
+	0xcb, 0x20, 0x9e, 0xba, 0xea, 0xc8, 0xd4, 0x9b,
+	0x84, 0xac, 0x0b, 0xf0, 0x3b, 0x2c, 0xf0, 0x95,
+	0x3b, 0x5b, 0xf8, 0xfe, 0xe5, 0xc6, 0xee, 0x7c,
+	0x9e, 0x41, 0xf0, 0xef, 0xcf, 0x4d, 0xdd, 0xe8,
+	0x63, 0x6b, 0xcf, 0xe9, 0xd2, 0x80, 0x98, 0xf9,
+	0x7d, 0x22, 0x7e, 0xfc, 0xdd, 0x50, 0x6b, 0xa3,
+	0x6d, 0x7c, 0xed, 0x35, 0xbc, 0x28, 0x64, 0x03,
+	0xe6, 0x01, 0xac, 0x7c, 0xe1, 0x9b, 0x08, 0x6f,
+	0xd8, 0xdc, 0xaf, 0xb6, 0x9d, 0x4c, 0xdf, 0xb1,
+	0xde, 0xf4, 0x90, 0x5b, 0x46, 0xee, 0x7d, 0x28,
+	0xfb, 0xaa, 0xa9, 0x69, 0x47, 0xf5, 0x52, 0x74,
+	0x97, 0x9f, 0x8b, 0xbb, 0x26, 0x8f, 0x0d, 0x89,
+	0x2f, 0xc9, 0x57, 0xac, 0x2f, 0x88, 0x12, 0xdd,
+	0x12, 0x2f, 0x75, 0x97, 0xc7, 0x7b, 0x45, 0x46,
+	0x3a, 0x52, 0x4b, 0xf6, 0x76, 0xe0, 0x99, 0xef,
+	0xbe, 0xbf, 0xed, 0x0d, 0x32, 0xed, 0xc6, 0x5e,
+	0x6a, 0xe6, 0x0e, 0x12, 0xd4, 0xce, 0xf8, 0x0c,
+	0x7b, 0x4f, 0x1d, 0x3b, 0xf8, 0xaf, 0xdd, 0xd1,
+	0x78, 0x74, 0x59, 0xc7, 0xe4, 0xbc, 0xe3, 0xdd,
+	0x4a, 0xa7, 0x77, 0xa5, 0xcd, 0x80, 0x7c, 0x6b,
+	0x19, 0x46, 0x3d, 0xbd, 0x0a, 0x75, 0x48, 0xfa,
+	0x1c, 0xee, 0x02, 0xe9, 0x79, 0x10, 0x6c, 0xb4,
+	0xb3, 0xb2, 0xbe, 0xc8, 0x5c, 0xd1, 0xa1, 0xe2,
+	0xd5, 0x0a, 0xb5, 0xf3, 0x0c, 0x3f, 0x03, 0xb9,
+	0x2f, 0x61, 0x44, 0x95, 0xe1, 0x16, 0xcb, 0xc1,
+	0xee, 0xb3, 0xb8, 0x85, 0xd6, 0x1c, 0xf4, 0xfa,
+	0x86, 0x73, 0xc5, 0xf3, 0xba, 0xb5, 0xe0, 0x95,
+	0x34, 0x95, 0x72, 0xfa, 0xa7, 0xb8, 0x50, 0xba,
+	0xfb, 0xa6, 0x3c, 0x0f, 0x3c, 0xe3, 0xaa, 0x56,
+	0x05, 0xaf, 0x08, 0xec, 0x50, 0x12, 0x73, 0x25,
+	0x29, 0x72, 0xf5, 0xf6, 0xee, 0x06, 0xe4, 0x05,
+	0x1a, 0xe1, 0x1a, 0x13, 0x3f, 0xa3, 0x55, 0x16,
+	0x12, 0x17, 0x88, 0xd2, 0xa7, 0xc1, 0xd0, 0xf2,
+	0x7d, 0x51, 0x46, 0x36, 0x2e, 0x77, 0xa8, 0x02,
+	0x67, 0xad, 0xe7, 0x63, 0xaa, 0xbf, 0xe5, 0xbf,
+	0xa1, 0xab, 0xc4, 0xf6, 0x72, 0xae, 0xdf, 0x79,
+	0x0e, 0x82, 0x47, 0xb5, 0xf4, 0x48, 0x39, 0x22,
+	0xe3, 0x0a, 0x94, 0x5e, 0x3a, 0x4b, 0xa6, 0xa7,
+	0x5c, 0xb8, 0xec, 0x3e, 0x10, 0xae, 0x94, 0x34,
+	0x2c, 0xc0, 0x4b, 0xdd, 0xca, 0x4d, 0xc9, 0x7c,
+	0xf8, 0x2e, 0x32, 0x4e, 0x00, 0x2c, 0x34, 0x71,
+	0x28, 0xad, 0xd5, 0xcb, 0x19, 0xb8, 0x1d, 0xaa,
+	0x85, 0xac, 0xec, 0x16, 0xb6, 0x1f, 0x95, 0xc5,
+	0xa9, 0x4b, 0x8a, 0xfc, 0x70, 0xb7, 0x34, 0xb0,
+	0x63, 0x55, 0xff, 0x15, 0xc2, 0x72, 0x74, 0xe0,
+	0x6d, 0x01, 0x3d, 0xf0, 0x6a, 0xab, 0x4b, 0x8a,
+	0x72, 0xdc, 0x2b, 0x0a, 0x8a, 0xf4, 0x02, 0x1b,
+	0x0b, 0x51, 0xd8, 0xf7, 0x17, 0xcf, 0x48, 0xf0,
+	0x97, 0xa0, 0xc2, 0x7a, 0xc4, 0x64, 0x59, 0x2a,
+	0xa3, 0x27, 0xbe, 0x3b, 0xf7, 0xc5, 0x6d, 0x51,
+	0x29, 0xe2, 0x68, 0x87, 0x75, 0x71, 0x72, 0xac,
+	0xc8, 0xc1, 0xc8, 0xe5, 0xf6, 0x8a, 0x27, 0x8c,
+	0x45, 0x03, 0x10, 0xf7, 0x1a, 0xff, 0x1b, 0x04,
+	0x1c, 0xaf, 0x27, 0x7a, 0x57, 0xac, 0x0f, 0x57,
+	0x2a, 0x74, 0xd0, 0x46, 0x64, 0xbf, 0xc9, 0xe8,
+	0x35, 0x6b, 0x5c, 0x79, 0x9a, 0x51, 0xeb, 0xd1,
+	0xb3, 0x1d, 0xfd, 0x2f, 0x83, 0x2e, 0x24, 0x95,
+	0x94, 0xc7, 0x9d, 0x9f, 0x5d, 0x5c, 0x8e, 0x6c,
+	0x8f, 0xfc, 0xce, 0x89, 0x67, 0x9b, 0x38, 0x4b,
+	0x0d, 0x44, 0x9a, 0xb5, 0x74, 0xbf, 0x88, 0x90,
+	0xa1, 0xf2, 0xc4, 0xd2, 0xb3, 0x07, 0xe5, 0x34,
+	0x62, 0xc0, 0xfc, 0x3f, 0xdb, 0x77, 0x8e, 0x84,
+	0x61, 0xc1, 0x15, 0xf6, 0x5f, 0x5d, 0x73, 0xbc,
+	0x0c, 0x70, 0x32, 0xeb, 0x2c, 0xd3, 0x19, 0x83,
+	0x22, 0xfa, 0x5b, 0xcc, 0x5f, 0xbf, 0xbe, 0xfc,
+	0x3c, 0x28, 0x74, 0x2d, 0x33, 0x8f, 0x74, 0xe5,
+	0xca, 0xc9, 0x84, 0x8f, 0xba, 0x48, 0x11, 0x84,
+	0x33, 0xf0, 0x7d, 0x5c, 0xad, 0x47, 0x36, 0xf7,
+	0x33, 0xb0, 0xbb, 0x44, 0x65, 0x72, 0x45, 0xd1,
+	0x40, 0x4c, 0x39, 0x8b, 0x16, 0x90, 0x74, 0xa3,
+	0xd2, 0x3c, 0xc6, 0x7a, 0xa4, 0x4f, 0x0d, 0x9a,
+	0xe1, 0xfd, 0x49, 0x82, 0xc6, 0x69, 0xf7, 0xe7,
+	0x3d, 0xeb, 0x2b, 0xbe, 0xfd, 0x1a, 0x73, 0x2c,
+	0xf3, 0xbc, 0xd6, 0xaa, 0xaa, 0x54, 0x22, 0x5c,
+	0x54, 0x92, 0x73, 0xe3, 0x79, 0x0a, 0x87, 0x20,
+	0x82, 0xdb, 0x02, 0x42, 0x81, 0xb1, 0xf7, 0x0d,
+	0xf0, 0xd8, 0x56, 0x0f, 0x74, 0x0c, 0x65, 0x7c,
+	0x8c, 0x96, 0xb9, 0x9f, 0xfa, 0xb6, 0x48, 0x66,
+	0xf1, 0xbe, 0xf8, 0x46, 0x70, 0xe5, 0x26, 0xc1,
+	0x68, 0x7f, 0x81, 0x72, 0x14, 0x2f, 0x96, 0x22,
+	0x05, 0xd1, 0xc0, 0xb8, 0x93, 0x9d, 0x02, 0x8b,
+	0xff, 0x0b, 0x2d, 0xb9, 0x01, 0xaa, 0x61, 0x09,
+	0x9d, 0x55, 0x21, 0xdd, 0xda, 0xec, 0x44, 0xce,
+	0x00, 0x98, 0xf8, 0x34, 0x86, 0x49, 0xd4, 0x72,
+	0x90, 0xfb, 0xd7, 0xb1, 0x33, 0xb9, 0xe5, 0xd3,
+	0xc0, 0x27, 0x88, 0x4b, 0x6d, 0x84, 0x34, 0x7c,
+	0x77, 0x7e, 0xcf, 0x27, 0x4d, 0x5f, 0x1d, 0xb4,
+	0xb4, 0xac, 0xcc, 0x7d, 0x83, 0xc2, 0x89, 0x3d,
+	0xeb, 0xb6, 0xa3, 0x57, 0x30, 0xbc, 0x94, 0x9f,
+	0xe9, 0x63, 0xca, 0x7d, 0xa3, 0x9d, 0x0a, 0x43,
+	0xed, 0x4a, 0xfd, 0xd3, 0x5e, 0x23, 0x97, 0x75,
+	0x28, 0x97, 0xaa, 0x0c, 0xf9, 0xa1, 0x03, 0xb1,
+	0x55, 0x82, 0xec, 0xcc, 0x91, 0x27, 0xf4, 0xcf,
+	0x63, 0x10, 0xf3, 0xd3, 0x8b, 0x5c, 0xa8, 0xc2,
+	0x58, 0x4d, 0xf5, 0x67, 0xe9, 0xe1, 0xc2, 0xf2,
+	0x11, 0x5e, 0xf2, 0xe1, 0x1c, 0xf2, 0x0c, 0x50,
+	0x71, 0x9f, 0xd1, 0x1c, 0xb8, 0x82, 0x7d, 0x3b,
+	0x23, 0x90, 0x4e, 0x08, 0xbf, 0x51, 0xa1, 0xc9,
+	0xe9, 0x90, 0x07, 0x4e, 0xb3, 0xcc, 0x72, 0xbf,
+	0x2c, 0x87, 0x18, 0x3b, 0xc7, 0x29, 0x8a, 0x3b,
+	0x0b, 0x4c, 0x55, 0x20, 0x08, 0xb0, 0xa3, 0x04,
+	0xf9, 0x6b, 0x53, 0x84, 0x4c, 0xef, 0xc1, 0xc6,
+	0xa4, 0xa9, 0xba, 0xe6, 0xb8, 0x72, 0x60, 0x6b,
+	0x2d, 0x25, 0x08, 0xc1, 0xd4, 0x4e, 0x0b, 0xcb,
+	0xe9, 0x71, 0x9b, 0x5a, 0x9a, 0x1e, 0x21, 0x9a,
+	0x0a, 0xd0, 0x52, 0x82, 0xe9, 0x31, 0x45, 0x9e,
+	0xe4, 0x85, 0x6b, 0xac, 0x8e, 0x7c, 0x73, 0x0c,
+	0x0d, 0xd6, 0x54, 0x27, 0x5a, 0xce, 0xc8, 0x07,
+	0x19, 0x84, 0x8b, 0xee, 0x0f, 0x6f, 0x8b, 0xbc,
+	0x0c, 0x1b, 0xe0, 0x08, 0x64, 0xa6, 0xe6, 0xe1,
+	0xf8, 0x56, 0x5e, 0xe8, 0x27, 0x7d, 0x26, 0xee,
+	0x20, 0x5e, 0x3d, 0x2e, 0x84, 0xdc, 0x50, 0xb0,
+	0x16, 0x3f, 0x8c, 0xec, 0xa9, 0xd3, 0x61, 0x85,
+	0x5a, 0xba, 0x02, 0x82, 0x65, 0x30, 0xdb, 0x23,
+	0x1c, 0xcb, 0xc3, 0xe6, 0x80, 0x5e, 0x4f, 0x6e,
+	0xd8, 0x3b, 0x5e, 0xce, 0x67, 0xbb, 0xdb, 0x22,
+	0xac, 0xf1, 0x32, 0x53, 0x6a, 0xd6, 0x43, 0x1a,
+	0xf0, 0x11, 0xc5, 0x0f, 0xc5, 0x12, 0xdf, 0xe6,
+	0x91, 0x8b, 0x15, 0xf4, 0x41, 0xd9, 0xe3, 0x51,
+};
+
+/* Public key */
+uint8_t mldsa_44_pubkey[] = {
+	0xcc, 0x2c, 0x93, 0xce, 0xfc, 0x0b, 0xf6, 0x74,
+	0x93, 0x28, 0x95, 0xe8, 0xc0, 0xc8, 0x83, 0xb8,
+	0xc9, 0x0c, 0x9a, 0x5c, 0x18, 0xd2, 0x79, 0x5c,
+	0xf3, 0x58, 0xd8, 0x02, 0x6c, 0x5e, 0xad, 0x79,
+	0xde, 0x77, 0x1a, 0xd3, 0x49, 0xc9, 0x12, 0xc9,
+	0xff, 0xcf, 0xa2, 0x6c, 0x1d, 0x37, 0x91, 0xa2,
+	0xf5, 0x43, 0xbc, 0xdb, 0x9e, 0xdb, 0xa5, 0xdb,
+	0xd9, 0x87, 0xc5, 0xf2, 0xf7, 0x79, 0x58, 0x4c,
+	0x08, 0x9f, 0x9c, 0xca, 0x9c, 0xef, 0xa8, 0x80,
+	0x27, 0x31, 0xf1, 0xc5, 0x0e, 0x2b, 0x6d, 0xa1,
+	0x53, 0x9e, 0x99, 0x1e, 0xc8, 0x75, 0x4a, 0x59,
+	0x27, 0x33, 0x41, 0xdd, 0x39, 0xff, 0x37, 0xdf,
+	0x5b, 0xb9, 0xe4, 0x56, 0x54, 0x28, 0x8e, 0xb1,
+	0xfe, 0xd8, 0x4e, 0x60, 0xcd, 0x22, 0xd7, 0x30,
+	0xe5, 0x73, 0xe4, 0xb1, 0x08, 0x0f, 0x0a, 0xbe,
+	0x9a, 0x44, 0xfd, 0xb1, 0xed, 0xb1, 0x8e, 0x0d,
+	0x7c, 0x3c, 0x3d, 0x04, 0x52, 0x4b, 0x93, 0xf4,
+	0xa6, 0xce, 0x8d, 0xb0, 0xe4, 0xf6, 0xb1, 0x09,
+	0xfc, 0xc3, 0x42, 0x3d, 0xff, 0x4c, 0x55, 0x3c,
+	0x73, 0x75, 0x35, 0x9d, 0xe8, 0x68, 0x42, 0x09,
+	0x14, 0x36, 0x91, 0x63, 0xfc, 0xc6, 0x23, 0x7c,
+	0x25, 0x81, 0xd5, 0xc1, 0xfe, 0xca, 0xf6, 0x71,
+	0x51, 0x8e, 0xab, 0x29, 0xa1, 0x86, 0xbb, 0x45,
+	0x43, 0x67, 0x7f, 0xdf, 0x7e, 0x92, 0xff, 0x35,
+	0x38, 0xd3, 0xea, 0x94, 0xc9, 0xa3, 0x0f, 0x46,
+	0x25, 0xa6, 0x1e, 0x00, 0x60, 0x7b, 0xc0, 0xbc,
+	0xe9, 0x5e, 0x16, 0x0e, 0x81, 0xf5, 0x4e, 0x98,
+	0xa1, 0x64, 0xb0, 0xb7, 0x02, 0xec, 0x73, 0xad,
+	0xf8, 0xc1, 0xce, 0x8b, 0x8f, 0xbd, 0x89, 0xbf,
+	0x0f, 0x42, 0x31, 0x6d, 0x75, 0x42, 0xd7, 0x59,
+	0x64, 0xad, 0x09, 0xd3, 0x7a, 0x00, 0x7b, 0xdd,
+	0x12, 0x76, 0xb0, 0x00, 0x73, 0x5b, 0xbf, 0x44,
+	0x54, 0x6e, 0x56, 0x26, 0xa5, 0x27, 0x4d, 0xff,
+	0xe5, 0x8a, 0x04, 0x73, 0xd9, 0x75, 0x8c, 0xf7,
+	0x06, 0x64, 0xfb, 0xa5, 0x00, 0x27, 0x39, 0x0e,
+	0x48, 0x8f, 0x73, 0x29, 0x61, 0x5f, 0x15, 0xf5,
+	0x08, 0x15, 0x33, 0xd1, 0x76, 0xba, 0xf3, 0x3e,
+	0x28, 0xb8, 0x57, 0xcd, 0x9d, 0x61, 0x1f, 0xca,
+	0xd7, 0xc3, 0x10, 0xdb, 0x68, 0xeb, 0xa4, 0x15,
+	0x40, 0xd8, 0xe7, 0xa0, 0xd2, 0xd1, 0xd6, 0xb1,
+	0xd3, 0x75, 0x8e, 0xc1, 0x60, 0x02, 0xb5, 0x69,
+	0xf2, 0x8c, 0xf3, 0xc6, 0x2e, 0x9d, 0xf7, 0x8d,
+	0xed, 0xb0, 0x01, 0xba, 0xb5, 0x62, 0x7e, 0x8f,
+	0x91, 0xbd, 0x73, 0xc6, 0x35, 0xf9, 0xdb, 0xea,
+	0x28, 0xce, 0x8a, 0x47, 0x74, 0x7c, 0x3d, 0x85,
+	0x4d, 0x1e, 0x11, 0x7e, 0xa2, 0xaa, 0x04, 0x30,
+	0x12, 0xce, 0xea, 0xc1, 0xc5, 0x1e, 0x62, 0x7a,
+	0x21, 0x6a, 0xd5, 0xb8, 0x3c, 0xa0, 0xd6, 0xca,
+	0xb4, 0x8d, 0xff, 0xc3, 0xfc, 0xf2, 0xf1, 0x3c,
+	0x87, 0x23, 0xef, 0x68, 0xe4, 0x37, 0x96, 0xb0,
+	0xbb, 0x78, 0xa3, 0x3a, 0xe0, 0xd0, 0x41, 0xeb,
+	0x4c, 0x80, 0x55, 0x9b, 0x66, 0x5e, 0x33, 0xea,
+	0x33, 0x35, 0x79, 0xda, 0x04, 0x81, 0x19, 0x22,
+	0xb4, 0x4c, 0x7a, 0xef, 0x51, 0x50, 0x20, 0x6c,
+	0xf8, 0xf7, 0x5f, 0x03, 0x74, 0x72, 0xda, 0x1f,
+	0xe3, 0x0b, 0x82, 0x71, 0x50, 0x3d, 0x02, 0x61,
+	0x16, 0x44, 0xeb, 0xcf, 0xe3, 0x23, 0x9d, 0xef,
+	0xec, 0xce, 0xb3, 0xd0, 0xd2, 0x19, 0xd1, 0xe0,
+	0x2e, 0x33, 0xde, 0x28, 0x4b, 0xde, 0x85, 0xc1,
+	0xb2, 0x8a, 0xa5, 0x82, 0x0c, 0xa6, 0x9f, 0x23,
+	0x53, 0xea, 0xef, 0x78, 0x60, 0x24, 0x3a, 0x40,
+	0xc0, 0xc1, 0xac, 0xc9, 0x64, 0xd4, 0x03, 0x5f,
+	0x61, 0xa5, 0xdf, 0x6f, 0x6b, 0x4e, 0xb2, 0xe7,
+	0x1a, 0xc6, 0x69, 0x69, 0xd9, 0xc6, 0x6e, 0x5d,
+	0xea, 0xd8, 0xc0, 0x29, 0xcc, 0x8f, 0x35, 0x7b,
+	0xcb, 0x48, 0x3a, 0xfd, 0xba, 0x7a, 0x90, 0xc7,
+	0x65, 0x55, 0xfc, 0x90, 0x98, 0x6c, 0x15, 0x38,
+	0x0e, 0x88, 0x6e, 0x08, 0x49, 0x85, 0xc6, 0x6d,
+	0x8f, 0x30, 0x37, 0xa1, 0x64, 0x79, 0xa1, 0x65,
+	0x2d, 0x07, 0x38, 0x3e, 0x1c, 0xa6, 0x12, 0xee,
+	0xc5, 0x16, 0x68, 0x5c, 0x93, 0x14, 0xda, 0x33,
+	0x3d, 0x74, 0x62, 0xf1, 0xcf, 0x0e, 0x81, 0x80,
+	0xda, 0xea, 0xa7, 0x08, 0xde, 0xf3, 0xdc, 0xfe,
+	0x3a, 0xf5, 0x60, 0xe9, 0x35, 0x95, 0x52, 0x6c,
+	0x7f, 0xef, 0x8b, 0xa7, 0x55, 0x3d, 0x42, 0xfd,
+	0x39, 0x24, 0xd2, 0xfb, 0x28, 0x08, 0x83, 0x2b,
+	0x44, 0xf1, 0x21, 0x73, 0x13, 0x88, 0xa7, 0xba,
+	0x2d, 0xd6, 0xe9, 0x4e, 0xcb, 0xfe, 0x18, 0xe4,
+	0xc7, 0x85, 0xf3, 0xb8, 0xab, 0xd0, 0xb9, 0xbe,
+	0x5e, 0x8a, 0x62, 0x0e, 0x61, 0xa3, 0x29, 0x1d,
+	0xef, 0x46, 0xe7, 0x70, 0x14, 0xb1, 0x9f, 0x07,
+	0xbf, 0x3f, 0x1f, 0xc8, 0x11, 0xe4, 0x2c, 0x39,
+	0x48, 0x0e, 0xcf, 0x92, 0x62, 0x4b, 0x1f, 0x0c,
+	0x2e, 0x29, 0x61, 0xef, 0x29, 0x67, 0x7c, 0x0f,
+	0xac, 0x99, 0xb2, 0x9a, 0x7d, 0xac, 0x7c, 0x54,
+	0xae, 0xed, 0x4b, 0xf5, 0x4a, 0x4b, 0xb4, 0x14,
+	0xad, 0x6d, 0xce, 0xce, 0xcc, 0x3f, 0xb8, 0x59,
+	0x71, 0x7c, 0xd4, 0x76, 0x7c, 0xe4, 0x68, 0xc6,
+	0x76, 0xa8, 0xe3, 0x03, 0x48, 0xb6, 0xe4, 0x11,
+	0x6c, 0x5f, 0xd4, 0x76, 0x80, 0xdf, 0x2c, 0x67,
+	0x00, 0x4c, 0xce, 0x22, 0x21, 0xff, 0xb0, 0x9b,
+	0xcb, 0x72, 0xd1, 0xe3, 0xa2, 0x32, 0x5c, 0x12,
+	0xda, 0x7c, 0x95, 0x5d, 0xb2, 0xae, 0x1b, 0x25,
+	0x2e, 0x5f, 0xe6, 0xff, 0x4c, 0xbf, 0x00, 0x16,
+	0xd0, 0x3c, 0xbf, 0x44, 0x92, 0x07, 0xa0, 0x0d,
+	0x13, 0xba, 0xb8, 0x62, 0x66, 0x0b, 0x14, 0x0f,
+	0x5a, 0x9d, 0x42, 0x19, 0xd7, 0xbe, 0xe3, 0x33,
+	0x53, 0xa2, 0x60, 0x2d, 0xde, 0x43, 0x85, 0x03,
+	0x96, 0x50, 0x83, 0x83, 0x25, 0x3c, 0x19, 0x20,
+	0x44, 0x5f, 0x3b, 0x5a, 0xc2, 0x90, 0xe1, 0x2d,
+	0x47, 0x53, 0x50, 0xeb, 0xf7, 0xc7, 0x46, 0x4c,
+	0xf2, 0xad, 0xb2, 0x8f, 0x03, 0x4e, 0x82, 0x5d,
+	0x0f, 0xa0, 0x3d, 0xde, 0x4d, 0x93, 0x34, 0xd0,
+	0x1a, 0xe2, 0x5d, 0xbc, 0xe5, 0x8d, 0xfb, 0x5a,
+	0xba, 0xe2, 0x24, 0xec, 0xc8, 0xd2, 0xa3, 0x91,
+	0xa2, 0xa9, 0x0e, 0x0e, 0xf5, 0xfb, 0x9f, 0xed,
+	0x69, 0x21, 0x9d, 0x00, 0x92, 0xb5, 0x94, 0x0f,
+	0x38, 0x94, 0x29, 0xf9, 0xe7, 0xaa, 0xf1, 0xf7,
+	0x20, 0x10, 0xf0, 0xeb, 0x26, 0x96, 0x5a, 0x0e,
+	0x99, 0x8d, 0x71, 0xef, 0xb2, 0xa0, 0xf3, 0x38,
+	0xce, 0xf9, 0x99, 0x6f, 0x96, 0xbb, 0xa5, 0x55,
+	0x27, 0x5c, 0xf5, 0xf8, 0x63, 0xf7, 0xf8, 0x0a,
+	0x31, 0xee, 0x01, 0xa8, 0xc9, 0x0c, 0xbd, 0x73,
+	0x62, 0x21, 0xa7, 0x1c, 0xd1, 0x62, 0xe5, 0xdd,
+	0x43, 0x95, 0x4d, 0x60, 0x11, 0x65, 0x6c, 0xfa,
+	0x67, 0x9a, 0x2f, 0x24, 0x1e, 0xbd, 0x10, 0xc4,
+	0xe5, 0x23, 0x6f, 0x02, 0x76, 0x51, 0xd6, 0xe3,
+	0xad, 0x88, 0xda, 0xc4, 0xd9, 0x6a, 0x8f, 0xf7,
+	0xd2, 0x50, 0xdf, 0x9a, 0xad, 0x21, 0xc7, 0x5b,
+	0x47, 0x83, 0xf6, 0xc8, 0xcb, 0x0a, 0xd5, 0x28,
+	0x91, 0x3f, 0x18, 0x44, 0x62, 0x81, 0xfb, 0xcf,
+	0x51, 0x5d, 0xa1, 0xf5, 0x46, 0x74, 0x0d, 0x32,
+	0x21, 0x55, 0x1b, 0x8a, 0xf3, 0xd0, 0x4f, 0x41,
+	0x86, 0xc3, 0x55, 0x0b, 0x1c, 0xd9, 0x56, 0x2f,
+	0xcf, 0xe7, 0x9f, 0x06, 0x73, 0x82, 0xc2, 0x30,
+	0x7a, 0xc2, 0x01, 0xa2, 0x1e, 0xeb, 0x5d, 0x77,
+	0x7f, 0xbe, 0xee, 0xf4, 0x8a, 0x1b, 0x3b, 0xe3,
+	0x2d, 0xd5, 0x3e, 0x3b, 0x40, 0x82, 0xd6, 0x60,
+	0x86, 0x2f, 0xe9, 0xac, 0xc3, 0x65, 0xa5, 0xa3,
+	0x8c, 0x54, 0x51, 0x1f, 0x8e, 0x89, 0x19, 0xdd,
+	0xc5, 0x4a, 0xc0, 0xa2, 0x8b, 0xe5, 0x80, 0xfd,
+	0xa1, 0xd8, 0xe9, 0x15, 0xa0, 0x94, 0xd7, 0x9e,
+	0xe2, 0xf1, 0x83, 0x52, 0xf3, 0x0e, 0x34, 0x2f,
+	0x85, 0x67, 0x49, 0x73, 0x67, 0xb9, 0xb5, 0xd5,
+	0x0c, 0x1d, 0x03, 0x8e, 0x68, 0x57, 0x8d, 0xd2,
+	0x33, 0x44, 0x94, 0x28, 0x5b, 0xfa, 0xe0, 0x2b,
+	0x80, 0xd9, 0x96, 0x85, 0x6e, 0x0a, 0x2a, 0xdd,
+	0x9b, 0x5b, 0x55, 0x5a, 0x31, 0xb6, 0xfe, 0x3e,
+	0x0a, 0x41, 0x28, 0x20, 0xa7, 0xde, 0x31, 0xbe,
+	0x73, 0xcb, 0xbc, 0xbb, 0x50, 0xf8, 0x58, 0x74,
+	0xb1, 0x6b, 0x3f, 0x9a, 0x6c, 0x5e, 0x02, 0x87,
+	0x8d, 0x19, 0xa1, 0xd3, 0x6a, 0xc2, 0x91, 0x82,
+	0x3e, 0x0c, 0x90, 0xb8, 0xa6, 0x95, 0x23, 0x4e,
+	0xb9, 0x2d, 0x4d, 0x6c, 0xfb, 0xd7, 0x5e, 0xdf,
+	0xca, 0x06, 0x9b, 0x94, 0xb7, 0xfc, 0xbc, 0xad,
+	0x39, 0x5d, 0x43, 0xcb, 0x1c, 0x7d, 0x3c, 0x95,
+	0x3f, 0xf4, 0x47, 0x04, 0x1f, 0xfc, 0x8b, 0x23,
+	0xe7, 0xcf, 0x24, 0x6f, 0x40, 0x9b, 0xa5, 0x56,
+	0xcd, 0x69, 0x9e, 0x1f, 0x5a, 0xa0, 0x3b, 0x8f,
+	0x3e, 0x1c, 0xe7, 0x42, 0xc9, 0x66, 0xee, 0x99,
+	0x13, 0xb1, 0x4f, 0x65, 0x86, 0xba, 0xf0, 0x87,
+	0x81, 0x6f, 0x44, 0x08, 0xb4, 0x18, 0xac, 0xb6,
+	0xd3, 0x96, 0x68, 0xd4, 0x88, 0x89, 0xf2, 0xa2,
+	0xd6, 0x2f, 0xfe, 0x7e, 0x49, 0xb3, 0x9c, 0xc9,
+	0xaf, 0xd9, 0x28, 0xa8, 0x96, 0xc9, 0x2d, 0x26,
+	0x5b, 0xc7, 0xef, 0x66, 0x08, 0xd2, 0x38, 0x4f,
+	0x10, 0xb3, 0x83, 0x15, 0xf6, 0x00, 0x83, 0x3f,
+	0x20, 0xfe, 0xa8, 0x44, 0x6b, 0x62, 0x3b, 0x17,
+	0x39, 0x2e, 0xec, 0x5e, 0x78, 0xbe, 0xec, 0x16,
+	0x29, 0xa6, 0x79, 0x4c, 0x08, 0x75, 0xc8, 0x78,
+	0x3e, 0xc0, 0x05, 0xe9, 0xbb, 0x47, 0x94, 0xae,
+	0xaf, 0xa5, 0xbb, 0xb8, 0x47, 0x31, 0xf7, 0xe9,
+	0xb8, 0x1e, 0x6c, 0xda, 0x26, 0xc5, 0xf3, 0x26,
+	0x89, 0xd5, 0x04, 0x23, 0x0b, 0x11, 0x84, 0x8f,
+};
+
+/* Signature */
+uint8_t mldsa_44_sign[] = {
+	0x3E, 0xDD, 0xD2, 0x34, 0x62, 0x78, 0xEC, 0x19,
+	0x9F, 0xAA, 0xEC, 0x89, 0x99, 0x78, 0x31, 0xCB,
+	0x82, 0x0B, 0xE6, 0x46, 0x8D, 0x24, 0x9A, 0xD3,
+	0x69, 0xB7, 0x01, 0x85, 0x93, 0x75, 0xD0, 0xBE,
+	0xEA, 0x1F, 0x76, 0xFB, 0xB4, 0x6D, 0xC9, 0x64,
+	0xD4, 0x44, 0x68, 0x5D, 0xAD, 0x09, 0x69, 0xFC,
+	0x31, 0x2F, 0xD1, 0xFA, 0xEF, 0xF2, 0x1D, 0x2E,
+	0xB6, 0xA5, 0xA9, 0xFD, 0x31, 0x04, 0x68, 0x1E,
+	0x0B, 0xEC, 0xF4, 0x23, 0x4C, 0x9F, 0xC9, 0xD6,
+	0x27, 0x8D, 0xE1, 0xAA, 0x29, 0x38, 0x16, 0x65,
+	0x7E, 0x38, 0x5A, 0x30, 0xFC, 0xD9, 0xBF, 0x63,
+	0x3B, 0x82, 0xFE, 0x0D, 0x68, 0xD4, 0x52, 0x55,
+	0xBE, 0x86, 0x69, 0xCF, 0x75, 0x26, 0x2C, 0xB9,
+	0x1D, 0x66, 0x39, 0x4C, 0x89, 0xAC, 0x36, 0xBF,
+	0x34, 0x27, 0xCC, 0x7E, 0x6C, 0xC5, 0xBB, 0xFB,
+	0x78, 0x03, 0x39, 0x61, 0xD8, 0x76, 0x63, 0x6E,
+	0x6B, 0x68, 0x02, 0x43, 0x44, 0x57, 0x2E, 0x39,
+	0x9E, 0x9D, 0x64, 0x77, 0x8E, 0x8B, 0x79, 0x36,
+	0xCE, 0xE6, 0xBC, 0x6D, 0x80, 0xC8, 0x04, 0x81,
+	0x2A, 0x04, 0xD4, 0xEF, 0x63, 0xE1, 0x3F, 0xC4,
+	0xC1, 0x54, 0xD5, 0xAB, 0xE4, 0xEC, 0x65, 0xB0,
+	0xF0, 0x1A, 0xB2, 0x32, 0x9A, 0xB8, 0x51, 0xD4,
+	0x43, 0xFE, 0x81, 0x4F, 0xBD, 0x5D, 0xEE, 0xDE,
+	0x24, 0xAC, 0xBC, 0x22, 0x9B, 0x80, 0xB7, 0xE8,
+	0x22, 0x4B, 0x1B, 0x23, 0x89, 0x8C, 0xFE, 0xE3,
+	0x30, 0x35, 0xA2, 0x0B, 0x4E, 0x66, 0x64, 0xFE,
+	0x57, 0x68, 0xCF, 0xF5, 0xE5, 0x11, 0xB9, 0xB6,
+	0x3A, 0x2B, 0x15, 0x0D, 0xA4, 0x11, 0xE1, 0x01,
+	0x96, 0x06, 0x5D, 0x47, 0xCC, 0x04, 0x63, 0xB3,
+	0xC7, 0xDD, 0x0F, 0x4A, 0x0A, 0x90, 0x9C, 0x0C,
+	0x61, 0x1D, 0x4C, 0x21, 0x32, 0xD6, 0xE9, 0xDD,
+	0x0F, 0x91, 0xA4, 0xD1, 0x30, 0x14, 0x1C, 0x48,
+	0xEC, 0xF4, 0x4F, 0x02, 0x7B, 0x1E, 0x25, 0x3A,
+	0x7C, 0x6B, 0x42, 0x13, 0xF7, 0xBC, 0xB5, 0x02,
+	0xA9, 0x20, 0x85, 0x21, 0x01, 0x67, 0xC3, 0xDD,
+	0x6C, 0x6D, 0xD3, 0xC9, 0x6F, 0x13, 0x75, 0xDD,
+	0x1D, 0xD7, 0xE7, 0xF3, 0x34, 0x17, 0x37, 0xFF,
+	0xE6, 0x3B, 0xB5, 0x1F, 0xEE, 0x51, 0x73, 0x6D,
+	0x9E, 0xB7, 0xE2, 0xE7, 0xA1, 0x65, 0xE4, 0x29,
+	0x8E, 0xBF, 0x66, 0xCE, 0x5E, 0xD4, 0xBA, 0x0C,
+	0x18, 0x84, 0xBE, 0xAE, 0x9A, 0x17, 0x0D, 0xAE,
+	0x55, 0x90, 0x7F, 0x72, 0x73, 0xAB, 0x9F, 0x87,
+	0xCC, 0x3D, 0xCB, 0xE4, 0x38, 0x66, 0x92, 0xEE,
+	0x6D, 0xE9, 0x0B, 0x8A, 0xE2, 0x5F, 0x68, 0x9D,
+	0x06, 0xFD, 0xF3, 0x77, 0x4B, 0x50, 0xCD, 0x0E,
+	0x2B, 0xE1, 0xD3, 0xB4, 0xF4, 0x02, 0xF5, 0x9B,
+	0x5F, 0x3E, 0x59, 0xD7, 0x57, 0x9D, 0x87, 0x80,
+	0x60, 0xEB, 0x70, 0xF5, 0x34, 0x56, 0x46, 0x5B,
+	0xBA, 0x8F, 0x90, 0xAE, 0x9F, 0x6B, 0x43, 0x8C,
+	0x51, 0x45, 0xD2, 0x16, 0x4C, 0xBA, 0x86, 0xF0,
+	0xF4, 0xD5, 0x34, 0x6A, 0x3E, 0x5F, 0xAE, 0xBE,
+	0x95, 0x40, 0xFE, 0x26, 0x4D, 0x5E, 0x60, 0x4E,
+	0xD9, 0xEB, 0x47, 0x7D, 0x43, 0x63, 0x5F, 0x4B,
+	0xB1, 0xCE, 0x7E, 0xA2, 0xF0, 0xC9, 0x30, 0x0C,
+	0xB7, 0x13, 0x43, 0xC0, 0xF8, 0x02, 0x6C, 0xD2,
+	0x5F, 0xCE, 0x25, 0xF3, 0xAE, 0xC3, 0x2D, 0xC3,
+	0x13, 0xAE, 0x49, 0x8B, 0x82, 0x82, 0x44, 0xD0,
+	0x50, 0xF8, 0x00, 0x5E, 0xAC, 0xDE, 0x4B, 0x88,
+	0xC2, 0x38, 0x5C, 0xC3, 0x65, 0xF4, 0x25, 0x63,
+	0x29, 0xC3, 0xB0, 0x7A, 0x45, 0x5D, 0x43, 0x89,
+	0xCA, 0x5A, 0x12, 0x61, 0xD8, 0x92, 0x65, 0x1B,
+	0x0F, 0xBF, 0x62, 0xB9, 0xA6, 0xF2, 0xA8, 0xA7,
+	0x06, 0xAC, 0x02, 0xA4, 0xC6, 0x25, 0xD6, 0xC5,
+	0xD2, 0xDE, 0x87, 0x88, 0x11, 0xBD, 0x7C, 0x87,
+	0x91, 0xA9, 0x91, 0x60, 0x1F, 0x0F, 0xF0, 0x24,
+	0xFE, 0xA0, 0xEB, 0xDC, 0x89, 0x68, 0x84, 0x10,
+	0xD7, 0x55, 0xC1, 0x3A, 0xCA, 0x1F, 0xFF, 0x77,
+	0x41, 0xA1, 0xDB, 0x13, 0x31, 0xEF, 0x9C, 0xA3,
+	0xA2, 0x3A, 0x37, 0x1B, 0xF9, 0x46, 0xF8, 0x51,
+	0x15, 0xB3, 0x0A, 0x12, 0x64, 0x3F, 0xE5, 0xA8,
+	0x07, 0xA2, 0x57, 0x87, 0x2A, 0x3F, 0xD2, 0x87,
+	0xDB, 0xC0, 0x33, 0xAC, 0xF5, 0x28, 0x42, 0xC5,
+	0xD4, 0x20, 0x27, 0xAE, 0x57, 0xAF, 0x6C, 0x74,
+	0x8A, 0xA0, 0x90, 0xEE, 0x34, 0xE9, 0x19, 0xB9,
+	0x0E, 0xDF, 0x4D, 0xDE, 0x77, 0x66, 0xC4, 0xBC,
+	0x99, 0x59, 0x14, 0xCB, 0x9D, 0xBF, 0xBC, 0x5F,
+	0xFF, 0x2B, 0xA7, 0xED, 0x29, 0x49, 0x13, 0x6C,
+	0x2B, 0x71, 0x58, 0xC2, 0xC4, 0x67, 0xCB, 0x6A,
+	0x18, 0x6F, 0x4E, 0x88, 0xB9, 0x76, 0xC8, 0x6B,
+	0xDC, 0x6A, 0x05, 0xA5, 0x22, 0x31, 0x15, 0xCE,
+	0x54, 0xDA, 0xE8, 0x0E, 0xED, 0xDF, 0x46, 0x90,
+	0x93, 0x9A, 0xE6, 0x2B, 0x45, 0xA4, 0x51, 0x42,
+	0x29, 0x05, 0xA9, 0xFF, 0x29, 0xBE, 0x4F, 0x6E,
+	0xE7, 0x52, 0x2C, 0x16, 0x3F, 0x95, 0x94, 0x7B,
+	0xE6, 0xE1, 0xF7, 0x9F, 0x36, 0x1F, 0xEE, 0x46,
+	0xA9, 0xE3, 0x71, 0x37, 0x08, 0xF7, 0x63, 0xAF,
+	0x16, 0xB9, 0x43, 0x86, 0xAC, 0xC7, 0x5D, 0x5B,
+	0x73, 0x38, 0x08, 0x2C, 0xC6, 0x65, 0x02, 0xC8,
+	0x70, 0x71, 0x01, 0xA7, 0xD3, 0xA6, 0xB9, 0x74,
+	0xAA, 0x71, 0x3B, 0x1B, 0xEF, 0x84, 0xA9, 0x77,
+	0x91, 0x82, 0x7F, 0xB7, 0x3D, 0x2E, 0x8B, 0xD5,
+	0x4D, 0xAD, 0x29, 0xAC, 0x51, 0x9E, 0xDB, 0xF0,
+	0x4A, 0x1D, 0x29, 0x82, 0x04, 0x9E, 0x03, 0x8C,
+	0x74, 0x66, 0x12, 0x75, 0xD0, 0x77, 0x07, 0xCC,
+	0x7E, 0x8D, 0x19, 0x2F, 0x42, 0xFA, 0xB7, 0xBD,
+	0x7E, 0x77, 0xEF, 0xF1, 0x35, 0xAF, 0x7C, 0xFF,
+	0x52, 0x5F, 0xDB, 0x03, 0x99, 0x0D, 0x89, 0x8A,
+	0x60, 0x61, 0x42, 0xC2, 0xE7, 0x33, 0x58, 0xE7,
+	0x40, 0x90, 0x46, 0x84, 0xD5, 0x4B, 0x30, 0x88,
+	0xA7, 0xBB, 0x25, 0xDE, 0x02, 0xFE, 0x57, 0x93,
+	0xFD, 0xD0, 0x6E, 0xA2, 0xFE, 0x38, 0xA3, 0x5E,
+	0x6C, 0x35, 0x06, 0xC4, 0xC6, 0x8C, 0x9C, 0x37,
+	0x3B, 0x6A, 0x1D, 0x91, 0xCB, 0x84, 0x03, 0x47,
+	0x85, 0xC7, 0x1D, 0x82, 0xEE, 0xB5, 0xF8, 0xEC,
+	0x29, 0xDE, 0x30, 0x76, 0x32, 0x08, 0x6A, 0x75,
+	0x43, 0x6A, 0xB8, 0x4C, 0x5D, 0x5A, 0x54, 0xC2,
+	0xE3, 0x58, 0x43, 0x6E, 0x90, 0xCE, 0x51, 0xEB,
+	0xE2, 0xFD, 0x68, 0xAE, 0xB3, 0xBA, 0x80, 0xB4,
+	0x03, 0x84, 0x26, 0x4E, 0xAB, 0x7B, 0x15, 0x2D,
+	0xDE, 0xB0, 0x7B, 0xF3, 0x4D, 0xFB, 0x6A, 0xFC,
+	0xE3, 0x47, 0xFC, 0x9C, 0x34, 0xC8, 0xB2, 0x10,
+	0x46, 0xCC, 0x5F, 0x0A, 0xC6, 0xEB, 0x48, 0x47,
+	0xFF, 0x73, 0x75, 0xD0, 0x7C, 0xBF, 0x44, 0xCB,
+	0xAE, 0x8A, 0x30, 0x0B, 0x3F, 0x58, 0x11, 0x51,
+	0x32, 0xD5, 0x7C, 0xCC, 0xB5, 0xDB, 0xD9, 0x21,
+	0xD0, 0x6C, 0x29, 0xE2, 0xD0, 0xE1, 0xB2, 0xC8,
+	0x06, 0x29, 0xC0, 0xC8, 0x5B, 0xB2, 0x3A, 0x66,
+	0x7A, 0x25, 0x13, 0x57, 0x80, 0x14, 0x5B, 0x31,
+	0xC4, 0x7B, 0x21, 0xB5, 0x50, 0x9C, 0x76, 0x6B,
+	0x8C, 0x16, 0xF7, 0x95, 0xA1, 0x79, 0x6B, 0xA8,
+	0x22, 0x13, 0xD5, 0x32, 0x15, 0x3E, 0xFC, 0x55,
+	0x80, 0xD2, 0x71, 0xD1, 0x59, 0x15, 0xDA, 0xFC,
+	0x55, 0x75, 0xE7, 0x7E, 0x15, 0x48, 0xD9, 0x73,
+	0x0D, 0x6A, 0x31, 0x8A, 0x1C, 0x86, 0x4A, 0x31,
+	0x57, 0x5B, 0x0A, 0x9D, 0xE4, 0x8C, 0x80, 0x7F,
+	0x0E, 0x07, 0x36, 0x38, 0x7C, 0xEA, 0x3C, 0xBD,
+	0xBD, 0xD1, 0xAA, 0xE7, 0xE4, 0x43, 0xB2, 0xFC,
+	0x26, 0x39, 0x4F, 0xCC, 0xE6, 0xB8, 0xD7, 0x90,
+	0xC3, 0x5F, 0xAA, 0xEA, 0x78, 0xC6, 0xD7, 0x58,
+	0x15, 0x7D, 0x27, 0xD0, 0x7E, 0x0F, 0x13, 0x0D,
+	0x47, 0x49, 0x28, 0x5B, 0xD7, 0xBC, 0x41, 0xB5,
+	0x66, 0x38, 0x29, 0xB4, 0x71, 0xEC, 0xA2, 0xDE,
+	0xE3, 0xE0, 0x4C, 0x27, 0xB4, 0x2C, 0xEE, 0xF1,
+	0x5F, 0x37, 0x81, 0xCE, 0x31, 0x42, 0x87, 0x44,
+	0x39, 0x7B, 0x35, 0xCF, 0xE8, 0x7D, 0x5E, 0xD7,
+	0xA3, 0x3D, 0xB9, 0x92, 0x95, 0x8C, 0x25, 0xC6,
+	0xC9, 0xBC, 0x46, 0x4E, 0x03, 0x70, 0x29, 0x4B,
+	0x79, 0xB8, 0xEF, 0x54, 0x98, 0x8B, 0x9A, 0x45,
+	0x09, 0x8C, 0x43, 0xD1, 0x9B, 0x29, 0xEA, 0xDE,
+	0xF2, 0x25, 0x10, 0xA6, 0xF9, 0x2C, 0xC8, 0x90,
+	0x49, 0xA5, 0x3C, 0xDC, 0xCE, 0xA3, 0x98, 0xF1,
+	0x4C, 0xC6, 0x3E, 0xE0, 0x21, 0x58, 0x1A, 0x39,
+	0xDA, 0x50, 0x2A, 0x6A, 0x18, 0x49, 0xC9, 0xA1,
+	0x9D, 0xF3, 0xF4, 0xFB, 0xDD, 0x6F, 0x8D, 0xF4,
+	0xFE, 0x61, 0xA0, 0xC6, 0xF5, 0x58, 0x89, 0xAE,
+	0xEC, 0xC6, 0xE0, 0x88, 0x4A, 0x07, 0x6F, 0x11,
+	0x72, 0x5A, 0x6D, 0x3E, 0x08, 0x64, 0x3E, 0x23,
+	0x7D, 0x9A, 0x74, 0xB3, 0xC3, 0xDA, 0xA7, 0x29,
+	0x0E, 0xC1, 0x37, 0xB0, 0x04, 0x42, 0x47, 0x01,
+	0x80, 0x4B, 0xC0, 0x35, 0x49, 0x19, 0xB1, 0xDB,
+	0x51, 0x51, 0x09, 0x90, 0x08, 0xB2, 0xC4, 0x5C,
+	0xA0, 0xD6, 0x6E, 0x09, 0xFF, 0xA0, 0xC6, 0x4F,
+	0x32, 0x95, 0x84, 0xBE, 0xAA, 0x4A, 0x0A, 0x36,
+	0x83, 0xD3, 0x0C, 0xB7, 0xE0, 0xD0, 0x24, 0xE9,
+	0x0A, 0x2F, 0x0F, 0xB4, 0x3A, 0x2F, 0xCE, 0x34,
+	0xE5, 0xF0, 0x67, 0x07, 0x72, 0x52, 0x24, 0xE9,
+	0x9F, 0xBF, 0xDE, 0x40, 0x95, 0xAD, 0x74, 0x41,
+	0x4A, 0x00, 0x07, 0xEB, 0x14, 0xDD, 0xC4, 0xA2,
+	0x37, 0x72, 0x83, 0xE7, 0xD6, 0x20, 0xF5, 0xC6,
+	0x86, 0x97, 0xC5, 0x64, 0x58, 0x1B, 0x57, 0x5F,
+	0x9D, 0x06, 0x1D, 0xB5, 0x2D, 0x26, 0xBA, 0xE4,
+	0x49, 0x71, 0x08, 0xBD, 0x21, 0xC4, 0xA9, 0xF3,
+	0x26, 0x7A, 0x28, 0xD6, 0x81, 0x20, 0xCD, 0x9C,
+	0xED, 0xB8, 0xDC, 0x45, 0x33, 0xC0, 0x54, 0x5C,
+	0x3A, 0xF5, 0xC5, 0x1B, 0x19, 0x10, 0xCA, 0xDF,
+	0x99, 0xD4, 0xEE, 0x25, 0xD6, 0x71, 0x24, 0x4D,
+	0xFF, 0x14, 0x85, 0x58, 0x07, 0xC8, 0x3F, 0xD6,
+	0x55, 0x1C, 0xBF, 0xF8, 0x94, 0x31, 0x04, 0x83,
+	0xEC, 0xD1, 0xF5, 0x20, 0x72, 0xC3, 0xE9, 0xB1,
+	0x8A, 0x00, 0x0B, 0x94, 0x53, 0x4C, 0x01, 0x8C,
+	0xDE, 0x80, 0x59, 0x66, 0x72, 0x2D, 0xC5, 0x78,
+	0xAC, 0x4A, 0xAD, 0x4F, 0x14, 0xC1, 0x78, 0x87,
+	0x5F, 0xDF, 0xF2, 0x95, 0xCF, 0x8F, 0x3F, 0xA6,
+	0xCC, 0xAA, 0x1E, 0xD8, 0xA8, 0x37, 0xAD, 0x5B,
+	0xA5, 0x6D, 0xBC, 0x81, 0xAC, 0xCD, 0xFD, 0x56,
+	0x9E, 0x8B, 0xB9, 0xEC, 0x7E, 0x82, 0x4E, 0x55,
+	0x05, 0xFD, 0x9F, 0xDC, 0x0A, 0xF7, 0xBD, 0x3F,
+	0xEA, 0x42, 0x9D, 0x7E, 0xAB, 0x09, 0xDF, 0x3D,
+	0xA3, 0x8C, 0x63, 0x78, 0x81, 0x8F, 0x46, 0x9F,
+	0x12, 0xB8, 0x8A, 0xA5, 0xE4, 0xE9, 0x73, 0x95,
+	0x37, 0xD3, 0x39, 0xFE, 0x9B, 0x69, 0x58, 0x05,
+	0x5B, 0x30, 0x09, 0x31, 0x8B, 0xD9, 0xDB, 0xAE,
+	0x96, 0x93, 0x96, 0xDF, 0xC0, 0x70, 0x1D, 0xFF,
+	0x5D, 0x60, 0x72, 0x5A, 0xDD, 0xC2, 0x3D, 0xCF,
+	0x13, 0xA0, 0x36, 0x38, 0xF4, 0x3A, 0x03, 0x15,
+	0x48, 0xF0, 0xB1, 0x4A, 0x12, 0x72, 0xBA, 0x6B,
+	0xE2, 0xD6, 0x4E, 0x57, 0x22, 0x87, 0x2F, 0xE7,
+	0x40, 0x1B, 0x22, 0xF3, 0x4A, 0xE7, 0xB1, 0xA4,
+	0x28, 0xC7, 0xBB, 0x17, 0x5E, 0x0C, 0x03, 0xE3,
+	0xF4, 0x67, 0x25, 0xB2, 0xBB, 0xE6, 0x4E, 0xCD,
+	0x8A, 0x39, 0xC6, 0x05, 0xB7, 0x14, 0x10, 0xF4,
+	0x36, 0xE9, 0x8A, 0xC3, 0x41, 0xD3, 0x30, 0xAD,
+	0x79, 0x56, 0xE2, 0xC3, 0x55, 0xFC, 0x05, 0x3B,
+	0xD0, 0x83, 0x31, 0xE7, 0xA1, 0x85, 0xBE, 0x6C,
+	0xAF, 0x9D, 0xA6, 0x26, 0xC4, 0x7A, 0x4B, 0xD8,
+	0x26, 0xA7, 0x59, 0xBB, 0x8D, 0x6E, 0x15, 0x96,
+	0x84, 0x08, 0x0B, 0xDF, 0x29, 0x2D, 0x74, 0xD9,
+	0xAD, 0xFE, 0xC1, 0x3A, 0x84, 0x4E, 0xCE, 0x8F,
+	0x00, 0x9A, 0x50, 0xB8, 0x6F, 0x02, 0xE6, 0xEC,
+	0xA9, 0xE6, 0x1F, 0x71, 0x6A, 0x48, 0x98, 0x61,
+	0x3B, 0xC1, 0x37, 0x5A, 0x2E, 0xF3, 0xE0, 0xD6,
+	0x11, 0x0C, 0x15, 0x39, 0x7B, 0xFB, 0x37, 0xAF,
+	0x7A, 0xCA, 0xD6, 0x10, 0xDE, 0x95, 0x6A, 0xC6,
+	0x19, 0xEC, 0x21, 0x51, 0xCE, 0xAE, 0x8F, 0x5A,
+	0xEE, 0xEF, 0xB2, 0x9C, 0xF7, 0x4F, 0x5A, 0xB4,
+	0x90, 0xED, 0xB0, 0x64, 0x59, 0x95, 0xC5, 0x32,
+	0xC1, 0x85, 0xD7, 0x7E, 0x6C, 0xC6, 0x76, 0x11,
+	0x4B, 0xB5, 0x17, 0x1D, 0xEE, 0x15, 0xFF, 0xD3,
+	0xC7, 0xBB, 0xAA, 0x3C, 0x5D, 0x4D, 0x03, 0x82,
+	0xC0, 0xC7, 0xEA, 0xD0, 0xD8, 0x1B, 0xFF, 0x3C,
+	0x1D, 0x5A, 0x3F, 0xBD, 0x81, 0x66, 0x62, 0x6E,
+	0xB3, 0xF5, 0x5F, 0xF0, 0x43, 0x90, 0x01, 0x71,
+	0xDD, 0xB6, 0x0F, 0x60, 0xCE, 0xFB, 0x17, 0x21,
+	0x5A, 0x7F, 0x0C, 0x69, 0x82, 0x9D, 0x4C, 0xF3,
+	0x30, 0x1A, 0xF7, 0x1E, 0x85, 0x1A, 0x89, 0x84,
+	0xF3, 0x4E, 0x8F, 0x15, 0x60, 0x43, 0x6D, 0x3A,
+	0x5B, 0x07, 0xC0, 0x78, 0x6A, 0x02, 0xB4, 0x98,
+	0x3D, 0xAB, 0xAC, 0x25, 0x55, 0xC8, 0x49, 0x7E,
+	0xC9, 0x04, 0x73, 0xAF, 0x0D, 0x17, 0x1A, 0xA6,
+	0xBE, 0xD8, 0x11, 0x69, 0x4F, 0x17, 0x39, 0xF3,
+	0x57, 0x53, 0x1F, 0xD5, 0x1B, 0x15, 0x89, 0x53,
+	0x54, 0xB1, 0x9F, 0xFD, 0x52, 0x92, 0xA8, 0x98,
+	0xD4, 0x7B, 0xEE, 0x43, 0xC6, 0x31, 0xDE, 0xEC,
+	0xDC, 0xE5, 0x1D, 0x90, 0x37, 0x63, 0xA1, 0xF8,
+	0x42, 0x52, 0x8A, 0x73, 0x8B, 0x3D, 0x42, 0x85,
+	0x64, 0x5C, 0xA9, 0xCC, 0xA1, 0xCD, 0xEB, 0x9E,
+	0x2A, 0xF5, 0x21, 0x9E, 0x81, 0xC6, 0x2D, 0xD7,
+	0x22, 0xC2, 0xEE, 0x47, 0x7E, 0xDA, 0x60, 0x26,
+	0xFA, 0xE9, 0xB1, 0x81, 0x01, 0x77, 0xD3, 0x42,
+	0xDD, 0x03, 0x65, 0x74, 0x2B, 0x85, 0x49, 0x9A,
+	0xA5, 0x27, 0x76, 0x49, 0xF1, 0x72, 0x5E, 0xDF,
+	0xB7, 0xAD, 0x19, 0x1A, 0x58, 0x89, 0x56, 0x5C,
+	0x61, 0x03, 0xC7, 0x42, 0x84, 0xF2, 0x9E, 0x9E,
+	0x09, 0x2A, 0x2D, 0x3B, 0xAE, 0x6A, 0x8E, 0x9A,
+	0x87, 0x70, 0x16, 0x0A, 0xF1, 0xA9, 0xEA, 0xD2,
+	0xF3, 0x2A, 0xA3, 0xB0, 0x32, 0xD3, 0x28, 0x92,
+	0x19, 0x02, 0x77, 0xB2, 0x26, 0x1B, 0xC0, 0x59,
+	0x1A, 0x67, 0x4B, 0x51, 0x04, 0x83, 0x25, 0xF6,
+	0x4E, 0xA3, 0x92, 0x55, 0xCD, 0x74, 0xF5, 0x23,
+	0x98, 0xB7, 0xB9, 0x75, 0xA6, 0xDC, 0x4E, 0xD2,
+	0x93, 0x39, 0x94, 0xA3, 0xCD, 0xF8, 0xD5, 0xA4,
+	0xA9, 0x3C, 0x97, 0xED, 0x18, 0x54, 0xBB, 0x59,
+	0x7E, 0x75, 0xE3, 0xEE, 0x5A, 0x36, 0x53, 0x3D,
+	0x02, 0xFB, 0x47, 0xE6, 0x10, 0x1D, 0xDF, 0x21,
+	0xDA, 0x44, 0x66, 0x05, 0x81, 0xC4, 0xE9, 0x3B,
+	0xD5, 0x56, 0xC5, 0xAD, 0x50, 0x7A, 0xE1, 0xAA,
+	0x91, 0x7F, 0x7C, 0x4E, 0x85, 0xCC, 0xDC, 0x4A,
+	0xBD, 0x72, 0x1F, 0x3F, 0x21, 0x93, 0x98, 0x21,
+	0xB8, 0xCC, 0x21, 0x00, 0x24, 0x13, 0xAB, 0x63,
+	0xC1, 0x31, 0xCA, 0x1C, 0x67, 0x0C, 0x0E, 0x5A,
+	0x62, 0xC3, 0x1E, 0x6D, 0x63, 0x9B, 0xDA, 0x7F,
+	0x92, 0xC4, 0x64, 0x8B, 0xC7, 0x80, 0x04, 0x05,
+	0x36, 0x06, 0xCE, 0xF7, 0x37, 0x3A, 0xA8, 0xDF,
+	0x2C, 0x61, 0x46, 0x48, 0x2A, 0x5C, 0xDC, 0xBB,
+	0x34, 0x16, 0xDA, 0x59, 0x0D, 0x5B, 0xE5, 0x08,
+	0x05, 0xAF, 0x59, 0x86, 0x34, 0x56, 0x88, 0x4F,
+	0xAF, 0xA0, 0x28, 0xC4, 0xF2, 0x97, 0xC6, 0xF4,
+	0x7C, 0xFD, 0xA4, 0x20, 0xE4, 0x20, 0x2C, 0xDA,
+	0x98, 0xAD, 0x4A, 0x96, 0x9F, 0x62, 0xBB, 0x1C,
+	0xB6, 0x28, 0xB0, 0xD0, 0xEA, 0x3B, 0xB8, 0x3C,
+	0x8D, 0x4E, 0x97, 0xEA, 0x9E, 0x63, 0xAA, 0xAA,
+	0x8D, 0x22, 0x61, 0x29, 0x1A, 0x82, 0x29, 0x86,
+	0x87, 0x62, 0xA4, 0xE4, 0xC0, 0x03, 0x93, 0x55,
+	0x7D, 0x40, 0xE9, 0x43, 0x14, 0x9C, 0xE2, 0xDA,
+	0x0A, 0x00, 0x37, 0xEA, 0x80, 0xB8, 0x31, 0x66,
+	0xAE, 0xD7, 0xF8, 0xB4, 0x24, 0xC7, 0x78, 0xDB,
+	0x23, 0x66, 0x61, 0xA5, 0x47, 0x10, 0x4A, 0xE8,
+	0x79, 0xB6, 0xBD, 0x6A, 0xB6, 0x22, 0x6C, 0x7B,
+	0x19, 0xF3, 0x80, 0x35, 0x9A, 0x15, 0x36, 0x89,
+	0x2A, 0x2C, 0xED, 0x26, 0xF1, 0x96, 0xFF, 0x30,
+	0x4D, 0x03, 0x82, 0x2C, 0x69, 0x31, 0x40, 0x40,
+	0x0C, 0xD1, 0x40, 0x3E, 0xE0, 0xB5, 0x37, 0xA8,
+	0x6D, 0x68, 0x68, 0x8F, 0x9E, 0xC5, 0x12, 0x05,
+	0xF5, 0x36, 0x85, 0x5F, 0x8A, 0x52, 0x7B, 0x60,
+	0xA2, 0xC2, 0x39, 0xAF, 0x87, 0xC8, 0xC4, 0xF2,
+	0x53, 0x1D, 0xF0, 0x84, 0x32, 0x8A, 0x04, 0x42,
+	0xBF, 0xCA, 0x1A, 0x08, 0x89, 0x71, 0xCA, 0xC8,
+	0x11, 0xA6, 0xDC, 0xED, 0x31, 0xFC, 0x41, 0xFC,
+	0x84, 0x75, 0xA5, 0x98, 0x67, 0x9E, 0xE7, 0x69,
+	0x9F, 0x3C, 0x42, 0x94, 0x69, 0xA5, 0x1D, 0xC2,
+	0x55, 0x9D, 0x2E, 0xC9, 0x13, 0x3C, 0x68, 0x94,
+	0xA9, 0x7E, 0x6A, 0xFC, 0x11, 0xE3, 0x97, 0x0D,
+	0x59, 0x8F, 0x8D, 0x05, 0x01, 0x4A, 0x74, 0xB6,
+	0x96, 0x6D, 0x1E, 0x7F, 0x63, 0xA5, 0x54, 0x39,
+	0x5A, 0x6C, 0xB9, 0x9B, 0xC3, 0x79, 0xCB, 0xD3,
+	0xC9, 0xE9, 0x37, 0x9E, 0xDC, 0x3B, 0xE2, 0xD2,
+	0xE6, 0x07, 0x77, 0xFA, 0xD5, 0xCF, 0xD6, 0x42,
+	0x45, 0x46, 0xFE, 0x06, 0x28, 0x0E, 0x4D, 0xA6,
+	0x72, 0xE6, 0x6F, 0x39, 0xCD, 0xB9, 0xBF, 0x43,
+	0xF7, 0xD9, 0x99, 0x9B, 0x46, 0xF1, 0x80, 0xBA,
+	0x07, 0x4A, 0x0A, 0xC3, 0x9F, 0xD3, 0xCB, 0xA5,
+	0x85, 0xF7, 0xEE, 0x9F, 0x6D, 0xC0, 0x52, 0xD7,
+	0x17, 0x27, 0x81, 0x92, 0x98, 0xA0, 0xBB, 0xC9,
+	0xD7, 0xE4, 0xF0, 0xF8, 0x25, 0x2C, 0x38, 0x3B,
+	0x44, 0x4E, 0x55, 0x57, 0x5F, 0x86, 0x9A, 0xA1,
+	0xB2, 0xBB, 0xBF, 0xE4, 0xF4, 0x04, 0x0D, 0x16,
+	0x34, 0x48, 0x5A, 0x68, 0x72, 0x88, 0x8B, 0x97,
+	0xA5, 0xAC, 0xBC, 0xC4, 0xC9, 0xCC, 0xF3, 0x03,
+	0x12, 0x14, 0x2C, 0x3B, 0x3E, 0x3F, 0x4D, 0x52,
+	0x79, 0x7A, 0x91, 0x96, 0xA8, 0xB3, 0xBB, 0xCC,
+	0xCF, 0xD7, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0C, 0x1D, 0x2F, 0x43,
+};
+
+/* Deterministic Signature */
+uint8_t mldsa_44_sign_dtrm[] = {
+	0xC7, 0x9B, 0x98, 0x33, 0xEA, 0xCC, 0xCC, 0x47,
+	0x51, 0x8F, 0xE1, 0xC0, 0xDA, 0x82, 0x9B, 0xAA,
+	0x74, 0x0A, 0x14, 0x25, 0x73, 0x53, 0x27, 0x7C,
+	0x4C, 0x4A, 0xD6, 0xB7, 0x7C, 0x71, 0x25, 0xD8,
+	0xC5, 0xBA, 0xA8, 0x18, 0x59, 0xC7, 0x64, 0x2E,
+	0x9A, 0x65, 0xE9, 0x63, 0x83, 0x3D, 0xB8, 0x2B,
+	0x42, 0x0A, 0x6D, 0x7D, 0xCE, 0x6A, 0xA3, 0x11,
+	0xD6, 0xB6, 0x54, 0x82, 0x36, 0x38, 0xF1, 0x84,
+	0x01, 0x3E, 0x26, 0x66, 0xC7, 0x38, 0x6F, 0x41,
+	0x4C, 0xC2, 0x42, 0xB5, 0xBF, 0xCE, 0x7B, 0x8B,
+	0xD5, 0x4F, 0x9B, 0x9F, 0x0E, 0xFE, 0x52, 0xAF,
+	0x6D, 0x39, 0xD8, 0x0A, 0x27, 0x4D, 0xDB, 0x9F,
+	0x04, 0x25, 0x8C, 0xF5, 0x89, 0x5B, 0xEB, 0xDC,
+	0x70, 0xBF, 0x23, 0x1D, 0x14, 0x73, 0x9E, 0xFC,
+	0x41, 0xA0, 0xA2, 0xA5, 0xAA, 0xAB, 0x8E, 0xCD,
+	0x5E, 0x29, 0xC5, 0x3E, 0xEC, 0x0A, 0xD9, 0x06,
+	0xEB, 0x8C, 0x18, 0x41, 0x80, 0x91, 0x5D, 0xC9,
+	0x28, 0xCE, 0xDB, 0x1C, 0x0E, 0x8F, 0xE3, 0xC0,
+	0xE5, 0xB1, 0x0A, 0x38, 0x06, 0x43, 0x36, 0x0D,
+	0xF8, 0xE6, 0x2E, 0xCB, 0xEB, 0x51, 0xC8, 0x82,
+	0xE0, 0x3B, 0xCB, 0xCE, 0x62, 0xC8, 0xE0, 0x8A,
+	0x2C, 0xE4, 0xC7, 0xD7, 0xC1, 0x8A, 0x64, 0x0D,
+	0xE8, 0x5A, 0x52, 0x83, 0x58, 0x93, 0x2A, 0x25,
+	0x92, 0x65, 0x19, 0x4F, 0x0F, 0x44, 0x1C, 0xCE,
+	0x56, 0x91, 0xB4, 0xC9, 0x8D, 0x9E, 0x6A, 0xD5,
+	0xCA, 0xE3, 0xA0, 0xE3, 0x46, 0x45, 0x0D, 0x59,
+	0x14, 0x90, 0x72, 0x67, 0xC5, 0x95, 0xAC, 0x2A,
+	0xC4, 0x70, 0xD2, 0xCA, 0x40, 0x1D, 0x62, 0x0E,
+	0x2A, 0xA4, 0x3E, 0xAC, 0x45, 0x00, 0x96, 0xA4,
+	0xF6, 0xAC, 0xEE, 0x01, 0x19, 0xEB, 0xCC, 0x8C,
+	0x62, 0xE3, 0x26, 0x59, 0xB7, 0xB9, 0xBF, 0xBB,
+	0x8D, 0x72, 0xAD, 0x1A, 0xA2, 0x8D, 0xB1, 0x1B,
+	0xC1, 0xC1, 0xD8, 0xFF, 0x03, 0xAF, 0x74, 0xDF,
+	0xC6, 0x3C, 0xCE, 0xBD, 0xA8, 0x12, 0xFA, 0xAC,
+	0x83, 0x8C, 0x7E, 0x26, 0x8E, 0x0D, 0x03, 0xF3,
+	0x02, 0x17, 0x23, 0x13, 0x25, 0x01, 0x1F, 0xB9,
+	0x3B, 0x1C, 0x3E, 0xA7, 0xD9, 0xE4, 0xE6, 0xCA,
+	0xD6, 0x0C, 0x91, 0xAC, 0xEE, 0xD4, 0x42, 0xA7,
+	0xB1, 0x62, 0x70, 0xC8, 0xC9, 0x2F, 0x0A, 0xE0,
+	0xA8, 0xC7, 0x22, 0xE5, 0x2C, 0x06, 0x1C, 0x09,
+	0x4B, 0x45, 0x25, 0x02, 0x07, 0x8A, 0x86, 0xCC,
+	0xF8, 0xF9, 0x36, 0x11, 0x67, 0x75, 0xEE, 0xD2,
+	0xD4, 0x67, 0x09, 0xFD, 0x37, 0xB4, 0x3F, 0x7B,
+	0x4A, 0x2B, 0x4E, 0x05, 0x37, 0x5E, 0xFD, 0x97,
+	0x79, 0x95, 0x13, 0x95, 0x0D, 0x75, 0x15, 0x94,
+	0x27, 0x36, 0xB3, 0x97, 0x03, 0xBE, 0x38, 0x14,
+	0xCB, 0x4D, 0x16, 0x49, 0xFF, 0x36, 0xFA, 0xED,
+	0x4D, 0x97, 0x45, 0xE4, 0xFB, 0xF9, 0x61, 0x7D,
+	0x1F, 0xCE, 0xC3, 0xBF, 0xB3, 0xEA, 0x3C, 0xBC,
+	0x13, 0x05, 0xBB, 0xAB, 0x44, 0x84, 0x80, 0x0F,
+	0xB9, 0x1F, 0x6E, 0x88, 0x27, 0x4A, 0xFA, 0x17,
+	0x83, 0x76, 0x5F, 0xC5, 0xE8, 0x85, 0xBC, 0xFF,
+	0xD8, 0x48, 0x4A, 0x9F, 0xEB, 0xC3, 0xF8, 0x41,
+	0x86, 0x4D, 0xC2, 0x75, 0x7B, 0x74, 0x71, 0x68,
+	0x9C, 0xF8, 0x05, 0x8B, 0xB7, 0xFA, 0xE0, 0xA7,
+	0xFA, 0xEC, 0x53, 0x91, 0xD0, 0xB4, 0x44, 0x7A,
+	0x42, 0xAD, 0xD2, 0x17, 0x86, 0x8F, 0x96, 0xF0,
+	0xF1, 0xD6, 0xC0, 0x26, 0x34, 0x83, 0x2E, 0x62,
+	0x0D, 0x3F, 0x13, 0x5A, 0x8C, 0xBC, 0x6D, 0x8D,
+	0x39, 0x05, 0x91, 0x10, 0x32, 0xBE, 0x17, 0x8A,
+	0xC7, 0x23, 0xBE, 0x3F, 0xC5, 0x8A, 0xE0, 0x81,
+	0xFC, 0x0D, 0x4C, 0x62, 0xE8, 0x67, 0xBA, 0x8B,
+	0xBD, 0xA5, 0xCB, 0xE9, 0x34, 0x3D, 0x8D, 0x84,
+	0x9D, 0x65, 0xBF, 0x9E, 0xC4, 0xB3, 0x16, 0x2E,
+	0x12, 0xB9, 0x1F, 0x82, 0xA1, 0x46, 0x26, 0xD5,
+	0xAB, 0x7D, 0x80, 0x4D, 0x9C, 0xD3, 0xEB, 0x77,
+	0xFB, 0x67, 0xEA, 0xEE, 0xA8, 0x7B, 0x17, 0x02,
+	0x2E, 0x6E, 0xF5, 0x11, 0x44, 0xFC, 0x31, 0x01,
+	0xCC, 0x03, 0x94, 0x0A, 0xCF, 0x8D, 0x12, 0xCD,
+	0x87, 0x66, 0x38, 0x62, 0x3C, 0xBB, 0x98, 0x2E,
+	0xC5, 0x58, 0xD0, 0xF3, 0x06, 0xBD, 0x49, 0x7E,
+	0x18, 0x7D, 0x64, 0xEF, 0x37, 0x71, 0x87, 0xD4,
+	0xE6, 0x2C, 0xCC, 0x32, 0x59, 0x65, 0x05, 0x45,
+	0xDE, 0xF3, 0x17, 0x62, 0x2C, 0x25, 0x62, 0x9C,
+	0x67, 0xBD, 0x74, 0xF1, 0x54, 0x0E, 0x0B, 0x4A,
+	0x01, 0x9F, 0x5E, 0x3B, 0x08, 0x57, 0xFA, 0x09,
+	0x99, 0x11, 0x2C, 0x3E, 0x1D, 0x2D, 0xF7, 0x91,
+	0x12, 0x14, 0xFF, 0x95, 0x6F, 0xCA, 0xBD, 0x25,
+	0xEC, 0x3C, 0x98, 0xA7, 0xAB, 0x98, 0x0E, 0xFB,
+	0x01, 0xE9, 0x5E, 0x58, 0x5A, 0x49, 0x3F, 0xB2,
+	0xC4, 0xBC, 0xF3, 0xEC, 0xCA, 0x4C, 0x54, 0x27,
+	0x66, 0x10, 0x60, 0x76, 0x5C, 0xFB, 0x9E, 0xAC,
+	0xD2, 0x09, 0x75, 0xB3, 0x2B, 0x65, 0xE7, 0x93,
+	0xAD, 0x2B, 0x08, 0x6F, 0x87, 0x73, 0x45, 0x2A,
+	0x1B, 0xB1, 0x75, 0xE7, 0x02, 0x9B, 0xCB, 0x56,
+	0x87, 0x6F, 0x66, 0x44, 0xED, 0xDC, 0x03, 0x92,
+	0xD4, 0xF1, 0x07, 0x40, 0xD6, 0x86, 0xD5, 0x98,
+	0x3D, 0x9B, 0x03, 0xD9, 0x0A, 0x58, 0x59, 0x54,
+	0x06, 0x10, 0xFD, 0x15, 0xFB, 0xE0, 0x5B, 0x81,
+	0x8D, 0x0C, 0xC0, 0xA6, 0x15, 0x94, 0x72, 0x5E,
+	0xC8, 0x4A, 0x73, 0x59, 0x63, 0xF6, 0xCD, 0x8D,
+	0xA4, 0xC2, 0xAF, 0x2E, 0xAE, 0xC1, 0x93, 0x89,
+	0x08, 0x81, 0x10, 0xEC, 0x44, 0x81, 0x33, 0x96,
+	0x88, 0xDC, 0x19, 0xDF, 0xD4, 0x2E, 0x5D, 0x52,
+	0xD7, 0x6A, 0x02, 0x64, 0x11, 0x6B, 0x24, 0xCF,
+	0x51, 0xD4, 0xC1, 0x85, 0x7D, 0xA3, 0x24, 0x6A,
+	0x05, 0x13, 0x55, 0xC3, 0x64, 0x5A, 0xDF, 0x9A,
+	0x23, 0x73, 0xEA, 0xD9, 0x48, 0x98, 0xBE, 0x1C,
+	0xBD, 0x3A, 0x5D, 0x37, 0xDC, 0x18, 0xA8, 0x39,
+	0x71, 0x67, 0xC4, 0x12, 0xF1, 0xE3, 0x53, 0x73,
+	0xF1, 0xD8, 0xC4, 0x8B, 0xB3, 0x64, 0x03, 0xDD,
+	0x6E, 0xFB, 0x4A, 0xEF, 0xA4, 0x37, 0xA8, 0xA5,
+	0x2E, 0x86, 0x40, 0x73, 0x16, 0xBA, 0x3A, 0xF5,
+	0x5E, 0x47, 0xD8, 0x13, 0x58, 0xB7, 0x73, 0xA2,
+	0xDA, 0x00, 0x9F, 0x90, 0xE4, 0xF8, 0x0B, 0xB3,
+	0x26, 0x0A, 0xD8, 0x46, 0x8A, 0x09, 0x55, 0xCB,
+	0xCB, 0xA4, 0x89, 0x84, 0xF8, 0x35, 0xF0, 0xDF,
+	0x45, 0x5B, 0x6A, 0xAF, 0xA8, 0x5F, 0xE4, 0xC2,
+	0x03, 0x9B, 0x5B, 0x11, 0x21, 0xA7, 0xDE, 0xC5,
+	0x71, 0x3D, 0x00, 0xF8, 0x6F, 0x13, 0x75, 0x4E,
+	0x7B, 0x6B, 0x32, 0x95, 0xD3, 0x77, 0x82, 0xA2,
+	0x70, 0x6A, 0x80, 0xC3, 0x0D, 0x53, 0xC4, 0x1C,
+	0xF0, 0x1C, 0x5A, 0x54, 0xA4, 0xB2, 0x7A, 0x90,
+	0x6E, 0x48, 0x39, 0x19, 0x4A, 0x70, 0x8E, 0xEB,
+	0xF2, 0x94, 0x07, 0x45, 0xC0, 0x4B, 0xC1, 0x80,
+	0xED, 0x87, 0x39, 0x6B, 0x5F, 0x7E, 0x63, 0x95,
+	0x38, 0xFB, 0xF4, 0x6E, 0x3A, 0x6A, 0x78, 0x59,
+	0x1E, 0x51, 0x45, 0x02, 0x14, 0xAC, 0xA1, 0xD1,
+	0xC8, 0x44, 0x03, 0xB6, 0x3D, 0xA4, 0xB3, 0xC1,
+	0xE0, 0x1C, 0x39, 0xA1, 0x87, 0x21, 0x7C, 0xBA,
+	0x9A, 0x92, 0xA3, 0xAF, 0x37, 0xE8, 0x27, 0xA1,
+	0xBE, 0x2D, 0x83, 0x0A, 0x46, 0xE7, 0x68, 0x44,
+	0x9D, 0xB1, 0x57, 0x33, 0x9B, 0x57, 0xE3, 0x0C,
+	0xE7, 0xDF, 0x7F, 0x15, 0xC0, 0xB5, 0x3A, 0x08,
+	0x6C, 0xEF, 0xB3, 0xD3, 0xA2, 0x3C, 0x84, 0xC8,
+	0x77, 0x46, 0xB8, 0xD0, 0x1E, 0x6D, 0x7A, 0x0B,
+	0xD7, 0x25, 0x77, 0x74, 0xF6, 0xD8, 0xF4, 0x75,
+	0x54, 0x6A, 0x91, 0x48, 0x98, 0xAC, 0x52, 0xA6,
+	0x6C, 0xBC, 0x05, 0xA4, 0x92, 0x8F, 0x52, 0xAA,
+	0x97, 0xCC, 0x23, 0xD8, 0x69, 0x01, 0xB0, 0xD2,
+	0x1F, 0x22, 0xE8, 0xD1, 0xF7, 0x89, 0x8E, 0x40,
+	0xF1, 0xD8, 0xCE, 0xB5, 0x26, 0x82, 0xBD, 0xD7,
+	0x7C, 0x88, 0xB2, 0x6F, 0x16, 0x07, 0x67, 0x51,
+	0x45, 0x6C, 0x90, 0x63, 0xBA, 0x58, 0xB6, 0x71,
+	0xB8, 0x54, 0xA8, 0x4C, 0x54, 0xB3, 0xD7, 0x2B,
+	0x9F, 0xEB, 0x1C, 0xC6, 0x9F, 0xFA, 0xD6, 0xD3,
+	0xED, 0xA0, 0x99, 0x18, 0x99, 0x23, 0xB0, 0x1A,
+	0xAA, 0x3A, 0x42, 0xCB, 0x4A, 0xFC, 0x54, 0x30,
+	0x86, 0xD0, 0xFF, 0x44, 0x62, 0xAB, 0x94, 0xBD,
+	0xA9, 0x95, 0x27, 0x22, 0xD6, 0x57, 0xE7, 0x26,
+	0x94, 0x18, 0x0C, 0xDE, 0x10, 0x44, 0xE4, 0x1A,
+	0x55, 0x15, 0x07, 0xDC, 0x33, 0xCF, 0x4D, 0x27,
+	0x9D, 0xDD, 0x19, 0xF7, 0x81, 0xD5, 0x2A, 0xFA,
+	0x52, 0xC5, 0xA3, 0xF9, 0x6A, 0x78, 0xE8, 0x95,
+	0xE5, 0x00, 0x98, 0x46, 0xD0, 0xA5, 0x55, 0x23,
+	0x0D, 0xED, 0xA3, 0x84, 0x87, 0xAF, 0xB5, 0xBC,
+	0x10, 0x8B, 0x1F, 0x0A, 0x5E, 0x08, 0x5B, 0xC8,
+	0x78, 0xBD, 0xBC, 0xB5, 0x29, 0x56, 0x3C, 0xFB,
+	0x95, 0xC7, 0xFD, 0xDD, 0xB6, 0x2A, 0x66, 0x5A,
+	0x2B, 0x86, 0xA2, 0x74, 0x33, 0x67, 0xA3, 0x48,
+	0xE7, 0xFA, 0xCB, 0x08, 0x6B, 0x9D, 0x85, 0x8E,
+	0x38, 0x14, 0xCB, 0xC2, 0xDA, 0xA7, 0x06, 0x3A,
+	0x23, 0xE6, 0x80, 0x7D, 0x01, 0xA2, 0xA4, 0x1B,
+	0x3C, 0xCF, 0x9C, 0xE8, 0x62, 0x4D, 0xF5, 0x81,
+	0x8C, 0xB9, 0x11, 0x8A, 0x12, 0x07, 0x93, 0xDD,
+	0xB9, 0x40, 0x32, 0xB4, 0x60, 0x6A, 0xC8, 0x76,
+	0x95, 0x54, 0x0A, 0x48, 0xE2, 0xFF, 0x8A, 0x3C,
+	0xA2, 0x17, 0x4A, 0xCF, 0xDF, 0x6A, 0xAF, 0xBE,
+	0x7A, 0x62, 0x7A, 0x3A, 0x60, 0x0B, 0x64, 0x2D,
+	0xF0, 0xF9, 0x9C, 0x0B, 0xB2, 0x1C, 0xFD, 0xB6,
+	0x3F, 0x86, 0x9F, 0x4A, 0xA7, 0xA3, 0x8C, 0xC1,
+	0xAD, 0xF3, 0xFA, 0x86, 0xEF, 0x3F, 0xD7, 0x86,
+	0x05, 0xF0, 0x8D, 0xA6, 0xD1, 0xFE, 0xE0, 0xB4,
+	0x12, 0xC6, 0x35, 0x88, 0xFE, 0x77, 0xDE, 0x4E,
+	0x36, 0x4C, 0x8A, 0x81, 0x62, 0xC0, 0x30, 0x95,
+	0xC9, 0x2E, 0xB5, 0xCD, 0x09, 0x8D, 0x14, 0xDF,
+	0xED, 0x2E, 0x2D, 0xCE, 0x8A, 0x94, 0x7A, 0xC7,
+	0x12, 0x51, 0x8B, 0xEF, 0x45, 0xE9, 0x7A, 0x5E,
+	0x1E, 0x51, 0x73, 0x34, 0x51, 0x2B, 0xCB, 0x45,
+	0x22, 0xE6, 0x6F, 0x62, 0x20, 0xBA, 0xD2, 0x4E,
+	0xDC, 0x1F, 0xEE, 0x25, 0xFD, 0xA5, 0xD8, 0xD6,
+	0x4A, 0x24, 0xEA, 0x5E, 0x36, 0xF5, 0x76, 0x76,
+	0x27, 0x53, 0x99, 0xA1, 0xAF, 0x9E, 0x3C, 0x2A,
+	0x4C, 0xB2, 0x26, 0x8C, 0xC4, 0x1D, 0x38, 0x0C,
+	0x3F, 0xC6, 0x34, 0xA8, 0x5B, 0x96, 0x46, 0x4B,
+	0xE4, 0x17, 0xB8, 0x91, 0xD8, 0x28, 0x43, 0x99,
+	0xD8, 0xB5, 0x1D, 0x87, 0x66, 0x29, 0xC6, 0x8E,
+	0x43, 0x07, 0xAE, 0xBC, 0x05, 0xBF, 0xE2, 0xED,
+	0xDD, 0xCD, 0xDA, 0x65, 0xC9, 0x87, 0x95, 0xB6,
+	0x4D, 0x64, 0x64, 0x23, 0x5D, 0x19, 0x9D, 0x47,
+	0xC0, 0xED, 0x36, 0x03, 0x8C, 0x1E, 0xBA, 0xDE,
+	0xB7, 0x5D, 0xB8, 0x2B, 0x10, 0x35, 0x6F, 0xCD,
+	0x8E, 0xF8, 0xFA, 0xC0, 0x95, 0x34, 0x5C, 0x6A,
+	0x49, 0xDB, 0x30, 0x4C, 0xEB, 0x61, 0x27, 0xF5,
+	0x83, 0x5B, 0xBF, 0x05, 0x1F, 0x56, 0xF0, 0x4B,
+	0x1C, 0x25, 0x29, 0xA2, 0xC5, 0xF2, 0x46, 0xF6,
+	0xE9, 0x04, 0xDB, 0x7D, 0x01, 0xDE, 0xE0, 0x76,
+	0xEC, 0xB0, 0x24, 0x61, 0x41, 0xA4, 0x53, 0x84,
+	0x90, 0x1B, 0x96, 0x72, 0x00, 0x14, 0x26, 0xED,
+	0x20, 0x31, 0x5A, 0x24, 0xC9, 0xB2, 0x2A, 0x75,
+	0xD3, 0x94, 0xC1, 0xFE, 0xCE, 0xC1, 0x57, 0xDE,
+	0x5E, 0xCD, 0xBE, 0xCB, 0x85, 0x4A, 0x6B, 0x85,
+	0x28, 0xC3, 0x7B, 0x12, 0x7F, 0x61, 0xDD, 0x22,
+	0x07, 0x37, 0xFF, 0x70, 0x7A, 0xA1, 0x56, 0xD4,
+	0x5A, 0x3A, 0x59, 0xAB, 0xC3, 0x65, 0x09, 0x0E,
+	0x3C, 0x9C, 0x52, 0x34, 0xB2, 0x5D, 0x89, 0x62,
+	0x89, 0x3E, 0x22, 0x07, 0x56, 0xA2, 0x4D, 0x95,
+	0xE8, 0x78, 0x15, 0x44, 0x6F, 0xA3, 0xB2, 0x2C,
+	0x24, 0xF8, 0xA0, 0x54, 0x9E, 0x73, 0x25, 0x0C,
+	0xB3, 0x2C, 0xFF, 0x2D, 0x9C, 0x2E, 0xE1, 0xD8,
+	0x70, 0xF1, 0xCA, 0xA4, 0xB6, 0x6E, 0xDF, 0xE5,
+	0xB4, 0x0F, 0xF7, 0x00, 0x8E, 0x4F, 0x6F, 0xBA,
+	0x0D, 0x1F, 0x82, 0xF0, 0x7D, 0xC4, 0xED, 0x1E,
+	0xB6, 0x61, 0xE2, 0x3C, 0xBF, 0x5F, 0x88, 0xE1,
+	0x37, 0x5E, 0xE7, 0x7D, 0xE2, 0x13, 0xDF, 0x9A,
+	0x59, 0x6D, 0x85, 0x87, 0x7D, 0xCD, 0x8A, 0x01,
+	0xA1, 0xA7, 0x10, 0x63, 0xB5, 0xA4, 0xC4, 0xE0,
+	0x1A, 0x45, 0x4E, 0x91, 0x07, 0x54, 0x62, 0xD6,
+	0xC2, 0x3F, 0x96, 0x40, 0xF6, 0x8B, 0x12, 0x59,
+	0xEF, 0x20, 0x9C, 0x35, 0x4E, 0x37, 0x1F, 0xAA,
+	0x9C, 0x01, 0xA5, 0x59, 0x85, 0x37, 0x9E, 0x4F,
+	0xDF, 0xFF, 0x40, 0x6E, 0xC2, 0xE6, 0xC6, 0x09,
+	0x70, 0x1C, 0xC2, 0xCD, 0x11, 0x6B, 0x84, 0xC8,
+	0xEE, 0x2B, 0xAE, 0xD5, 0x36, 0xFC, 0x83, 0x30,
+	0xDD, 0x5E, 0x13, 0x6C, 0x49, 0xDB, 0x44, 0xDD,
+	0x39, 0x58, 0xE7, 0x83, 0xD6, 0x1A, 0x5F, 0xE2,
+	0xF7, 0x82, 0xDC, 0x1E, 0x80, 0x44, 0xDB, 0x48,
+	0x62, 0x32, 0x75, 0x3E, 0x6A, 0x98, 0x1A, 0xB2,
+	0x36, 0xBF, 0xDE, 0x35, 0x6B, 0x20, 0x9F, 0x83,
+	0xB5, 0xA2, 0x1C, 0x0B, 0x99, 0x9B, 0x49, 0x43,
+	0xEB, 0x5B, 0x67, 0x03, 0x8A, 0x24, 0x45, 0x8C,
+	0x15, 0xEE, 0xD2, 0xB2, 0x35, 0xEB, 0xAF, 0x69,
+	0x0E, 0x69, 0x3B, 0x4D, 0x80, 0x9B, 0x75, 0x43,
+	0xB4, 0x40, 0x30, 0xCF, 0xD9, 0x76, 0xD4, 0x58,
+	0xAC, 0x2B, 0x10, 0xE3, 0xF3, 0x48, 0x38, 0xAA,
+	0x69, 0x18, 0x51, 0x5C, 0xD7, 0xB0, 0x9E, 0x5B,
+	0x1E, 0x18, 0xD7, 0x59, 0x67, 0x80, 0x4F, 0xCB,
+	0x40, 0x49, 0xB0, 0x27, 0xCD, 0x15, 0xF7, 0x56,
+	0x34, 0x0F, 0x5D, 0xD9, 0xC4, 0xCB, 0xF7, 0x83,
+	0x0D, 0x8B, 0xCF, 0x21, 0x13, 0x1A, 0x49, 0xE6,
+	0x21, 0x49, 0x0F, 0x67, 0xFF, 0xE6, 0xE7, 0xF4,
+	0xD7, 0x2C, 0xDA, 0xFD, 0xBD, 0x86, 0xC2, 0x40,
+	0x6E, 0xB5, 0x05, 0xFC, 0x3E, 0x88, 0xB4, 0xB1,
+	0xC1, 0x5C, 0x6D, 0x0F, 0x0F, 0x17, 0xE6, 0xE0,
+	0x96, 0x4B, 0x45, 0xBD, 0x07, 0x20, 0x00, 0x3F,
+	0xF0, 0xF2, 0xB9, 0xA1, 0x35, 0x01, 0x47, 0x81,
+	0x1F, 0xA2, 0x0A, 0x66, 0xDB, 0xD7, 0x58, 0x51,
+	0x88, 0x78, 0x24, 0x6F, 0x7E, 0x68, 0x46, 0xBD,
+	0xEB, 0x5C, 0xA9, 0xDE, 0x30, 0x34, 0x2B, 0xA3,
+	0xCF, 0x93, 0x82, 0x14, 0x3D, 0x96, 0x1E, 0xD7,
+	0x6E, 0x9A, 0x2E, 0x72, 0xD0, 0x49, 0xDB, 0x24,
+	0xA0, 0x6E, 0x8E, 0xBA, 0x4A, 0x36, 0xCB, 0xF6,
+	0x9A, 0x46, 0x24, 0xEF, 0x18, 0xA8, 0xD9, 0xD5,
+	0x93, 0xF0, 0x2B, 0xEC, 0x60, 0x0A, 0x8F, 0x1C,
+	0xE8, 0x69, 0x56, 0x14, 0x6C, 0x8E, 0x30, 0xFB,
+	0x8D, 0xCF, 0xE7, 0x92, 0x59, 0x2E, 0x32, 0xEB,
+	0xAE, 0xA3, 0x99, 0x87, 0x98, 0x49, 0x03, 0xCD,
+	0x5E, 0xBD, 0xDE, 0xB9, 0xF5, 0xD0, 0xB3, 0xB1,
+	0x65, 0xAC, 0xC7, 0x42, 0xB4, 0xCF, 0x6A, 0x00,
+	0x3E, 0x2E, 0xC1, 0x13, 0xDF, 0x5E, 0x2E, 0xEC,
+	0x30, 0x00, 0xE2, 0xAB, 0xFD, 0x74, 0x06, 0x55,
+	0x88, 0x07, 0xB0, 0xEF, 0x6D, 0x43, 0x81, 0x15,
+	0xFC, 0xF6, 0x96, 0x91, 0x3D, 0x2F, 0xFE, 0xBD,
+	0xB9, 0xC8, 0xB6, 0x81, 0x63, 0xE0, 0xA9, 0x20,
+	0x93, 0xEC, 0x4B, 0x1E, 0xB9, 0xC2, 0xD0, 0x8C,
+	0x2E, 0xCB, 0x18, 0x7D, 0x1F, 0x66, 0xA6, 0x96,
+	0xA9, 0xB8, 0x66, 0x4F, 0xCF, 0xC9, 0xDA, 0x97,
+	0xCA, 0x07, 0xF1, 0xC8, 0xFB, 0x56, 0x60, 0xA9,
+	0x25, 0xDB, 0xFC, 0x2D, 0xB6, 0x0A, 0x42, 0x6A,
+	0x7F, 0xCE, 0x70, 0x91, 0xFF, 0x3B, 0xAC, 0xAB,
+	0xF2, 0x23, 0x4E, 0x50, 0xE9, 0xE6, 0x2F, 0xCB,
+	0x98, 0xBA, 0x7D, 0xD2, 0x8A, 0xDE, 0x6E, 0x80,
+	0x0C, 0xC6, 0xEB, 0xD9, 0x64, 0xD4, 0x59, 0xD5,
+	0x75, 0x00, 0x18, 0x7F, 0xD6, 0x86, 0xC2, 0x25,
+	0x98, 0xA9, 0x28, 0x1C, 0x40, 0x46, 0xC6, 0xA5,
+	0xAF, 0x6E, 0x5D, 0x25, 0x3C, 0x77, 0xF9, 0x43,
+	0xF3, 0x20, 0xFC, 0x43, 0xA0, 0x5E, 0xF1, 0x65,
+	0x5D, 0x8B, 0x33, 0x5A, 0x94, 0xF0, 0x6F, 0xB6,
+	0xD4, 0x4A, 0x48, 0x64, 0x31, 0x73, 0x17, 0x4E,
+	0x88, 0x90, 0xA8, 0xE4, 0x7F, 0xCE, 0xD5, 0x7D,
+	0xE3, 0x84, 0x3F, 0x38, 0x71, 0x4C, 0xB1, 0x18,
+	0xAA, 0x46, 0xF2, 0xCF, 0x99, 0xF0, 0x24, 0xD7,
+	0xFD, 0xFC, 0x2C, 0x81, 0x25, 0xC1, 0x8E, 0x0B,
+	0x82, 0x4C, 0x14, 0x6C, 0x44, 0xB1, 0x78, 0x67,
+	0x14, 0x47, 0xCA, 0x70, 0x0D, 0x13, 0xD1, 0xA8,
+	0x73, 0xBC, 0x4E, 0xAA, 0x1E, 0xB7, 0x59, 0xC0,
+	0xAC, 0xE3, 0x21, 0x2B, 0x55, 0x22, 0x6A, 0x53,
+	0xA6, 0xF0, 0xE9, 0x56, 0x37, 0x3B, 0xD6, 0x1B,
+	0x2E, 0x57, 0x98, 0x4D, 0x6A, 0x7E, 0xEB, 0x2E,
+	0x9B, 0xB8, 0xE2, 0x27, 0x55, 0xE2, 0x2E, 0xFA,
+	0x3C, 0xD2, 0x7A, 0xCC, 0xDB, 0x5C, 0x45, 0x85,
+	0xA6, 0x92, 0x49, 0x79, 0x9D, 0x18, 0x20, 0x50,
+	0x7B, 0xF4, 0x0F, 0x43, 0x2F, 0x7B, 0x3E, 0x90,
+	0xEF, 0xF3, 0x29, 0x66, 0xDF, 0xD1, 0xE9, 0x44,
+	0xC6, 0x28, 0xAA, 0x48, 0x00, 0x5F, 0x12, 0xEB,
+	0xEC, 0x26, 0x7F, 0xB3, 0x83, 0xFB, 0x50, 0x5A,
+	0x5F, 0x5A, 0x8E, 0x08, 0x4B, 0xF7, 0x50, 0x10,
+	0xC8, 0x73, 0x8F, 0x9C, 0xF6, 0xCB, 0xDC, 0xEA,
+	0x78, 0x07, 0x2C, 0x59, 0xAD, 0x66, 0x48, 0xFF,
+	0x56, 0x7D, 0x99, 0xC9, 0xEA, 0x64, 0xE7, 0xD0,
+	0x46, 0x88, 0x58, 0x46, 0x93, 0x37, 0x70, 0xC1,
+	0x91, 0x40, 0x02, 0x46, 0x7F, 0x8D, 0xFE, 0x66,
+	0x07, 0x1F, 0x3B, 0x56, 0x6A, 0x6E, 0x88, 0xB2,
+	0xBB, 0xC0, 0xC8, 0xCD, 0xD9, 0xDC, 0x0A, 0x0C,
+	0x1A, 0x27, 0x35, 0x48, 0x4C, 0x5B, 0x5D, 0x90,
+	0xA0, 0xB2, 0xB4, 0xCE, 0xD6, 0xDD, 0x07, 0x13,
+	0x7C, 0x93, 0x99, 0xA2, 0xA9, 0xAC, 0xC3, 0xC8,
+	0xEF, 0x1D, 0x33, 0x3D, 0x3F, 0x42, 0x52, 0x57,
+	0x6D, 0x72, 0x87, 0x8E, 0x96, 0xA8, 0xC6, 0xC8,
+	0xD0, 0xD6, 0xE8, 0xEB, 0xF2, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0E, 0x1E, 0x29, 0x3D,
+};
+
+/* Message */
+uint8_t mldsa_44_message[] = {
+	0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
+	0x74, 0x68, 0x65, 0x20, 0x6D, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x20, 0x74, 0x6F, 0x20, 0x62,
+	0x65, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x65, 0x64,
+	0x2E, 0x0A,
+};
+
+uint8_t mldsa_44_privkey_noseed[] = {
+	0xBA, 0x71, 0xF9, 0xF6, 0x4E, 0x11, 0xBA, 0xEB,
+	0x58, 0xFA, 0x9C, 0x6F, 0xBB, 0x6E, 0x14, 0xE6,
+	0x1F, 0x18, 0x64, 0x3D, 0xAB, 0x49, 0x5B, 0x47,
+	0x53, 0x9A, 0x91, 0x66, 0xCA, 0x01, 0x98, 0x13,
+	0xC5, 0xC1, 0x61, 0x0A, 0x40, 0x77, 0x4F, 0x0E,
+	0xBA, 0x33, 0x34, 0xF8, 0xB5, 0xBE, 0x56, 0xE8,
+	0x78, 0x71, 0xB3, 0xC3, 0xA7, 0x72, 0xC0, 0x72,
+	0x0F, 0xA3, 0x76, 0x66, 0xAE, 0x17, 0x35, 0xFD,
+	0xE6, 0xBC, 0x38, 0xA1, 0xC3, 0x5F, 0x8C, 0xF0,
+	0x8E, 0x44, 0x09, 0x24, 0xC9, 0x03, 0x71, 0x97,
+	0xBB, 0x87, 0xFD, 0xC4, 0x64, 0x6B, 0x86, 0xDA,
+	0x5A, 0x05, 0x89, 0xA3, 0x26, 0xCC, 0x0C, 0x0D,
+	0x95, 0x0F, 0xF8, 0xB5, 0xA9, 0xEA, 0x41, 0x35,
+	0xEA, 0xB8, 0xA9, 0x3F, 0x80, 0xF0, 0x92, 0x7E,
+	0x12, 0x40, 0x46, 0xE2, 0x5B, 0x23, 0x66, 0xAE,
+	0xA2, 0x5A, 0x6D, 0x1D, 0x0F, 0xEF, 0x98, 0x21,
+	0x04, 0xB8, 0x09, 0xDA, 0x12, 0x48, 0xE1, 0x40,
+	0x4C, 0x11, 0x03, 0x85, 0x99, 0xB0, 0x4D, 0x61,
+	0x04, 0x0A, 0xC0, 0x34, 0x28, 0x23, 0x16, 0x80,
+	0x08, 0x12, 0x45, 0x11, 0x49, 0x0C, 0xA0, 0x96,
+	0x0D, 0xC2, 0xA8, 0x01, 0x5A, 0xA8, 0x65, 0x0B,
+	0x30, 0x25, 0xD4, 0x94, 0x44, 0x8B, 0x38, 0x8C,
+	0x10, 0x24, 0x41, 0x22, 0x40, 0x69, 0x8A, 0x04,
+	0x04, 0x0C, 0x26, 0x90, 0xE3, 0x34, 0x69, 0xE2,
+	0x24, 0x68, 0xD2, 0x44, 0x00, 0x0B, 0x84, 0x90,
+	0xD9, 0x42, 0x30, 0x21, 0x91, 0x8D, 0x09, 0x99,
+	0x64, 0x20, 0x39, 0x60, 0x82, 0x36, 0x21, 0x90,
+	0xB8, 0x4C, 0x02, 0x12, 0x6E, 0x24, 0xB9, 0x70,
+	0x84, 0x22, 0x01, 0xE1, 0xA8, 0x64, 0x44, 0x26,
+	0x0E, 0x01, 0x17, 0x0E, 0x82, 0x40, 0x6C, 0x9B,
+	0x38, 0x6D, 0x0A, 0x93, 0x50, 0x52, 0x22, 0x25,
+	0xD2, 0xB8, 0x2C, 0x1A, 0x25, 0x70, 0x90, 0x12,
+	0x22, 0xD1, 0xB2, 0x80, 0x22, 0x46, 0x52, 0x01,
+	0x34, 0x80, 0x40, 0x34, 0x21, 0x41, 0x06, 0x60,
+	0x41, 0x32, 0x82, 0x09, 0x45, 0x90, 0x52, 0x32,
+	0x29, 0x83, 0xB8, 0x44, 0x93, 0x12, 0x21, 0x0A,
+	0xC1, 0x89, 0x60, 0xB2, 0x71, 0x9C, 0x90, 0x69,
+	0x90, 0x82, 0x90, 0x89, 0x12, 0x49, 0x40, 0x40,
+	0x8A, 0x5C, 0x10, 0x48, 0x01, 0x87, 0x91, 0x03,
+	0xB0, 0x40, 0xD8, 0x44, 0x05, 0xE4, 0xB0, 0x29,
+	0x0A, 0x27, 0x90, 0x1C, 0xC9, 0x50, 0x58, 0x02,
+	0x8C, 0x0C, 0x49, 0x72, 0x49, 0x84, 0x6D, 0x19,
+	0xA7, 0x85, 0xE3, 0x00, 0x30, 0xCB, 0xB2, 0x21,
+	0xE2, 0x08, 0x10, 0x4C, 0xA6, 0x64, 0x11, 0x43,
+	0x68, 0x52, 0x94, 0x69, 0x09, 0x39, 0x32, 0x91,
+	0xA2, 0x6D, 0xCA, 0x14, 0x84, 0xA3, 0x92, 0x11,
+	0xDB, 0x94, 0x2C, 0x01, 0xC6, 0x64, 0x14, 0x24,
+	0x8C, 0x1A, 0x15, 0x31, 0x0A, 0x23, 0x0E, 0xD8,
+	0x14, 0x20, 0xA4, 0x26, 0x8D, 0x43, 0x40, 0x90,
+	0xC1, 0x42, 0x86, 0xA4, 0x10, 0x85, 0x0C, 0x32,
+	0x2D, 0xD0, 0x28, 0x60, 0x1B, 0xB5, 0x0C, 0x52,
+	0x44, 0x61, 0x21, 0x15, 0x24, 0x21, 0xC6, 0x04,
+	0xD8, 0x34, 0x31, 0xD9, 0x12, 0x71, 0xA2, 0x34,
+	0x52, 0x03, 0x30, 0x89, 0x54, 0x32, 0x10, 0x83,
+	0x94, 0x08, 0xA2, 0xA4, 0x70, 0xD2, 0x44, 0x8E,
+	0x84, 0x02, 0x8D, 0x91, 0x46, 0x62, 0x0B, 0x00,
+	0x0E, 0xA0, 0x80, 0x70, 0x22, 0xB5, 0x0D, 0x0B,
+	0xC9, 0x01, 0x00, 0x26, 0x4D, 0xE2, 0x44, 0x80,
+	0x93, 0x20, 0x65, 0xC9, 0x96, 0x8D, 0xDA, 0xA4,
+	0x4C, 0x42, 0xA8, 0x00, 0x1A, 0x27, 0x6C, 0xC3,
+	0x94, 0x4D, 0xA0, 0x30, 0x2C, 0xDA, 0xA8, 0x04,
+	0x23, 0xA3, 0x8C, 0x63, 0x04, 0x0E, 0x59, 0xC8,
+	0x00, 0x20, 0xA9, 0x6C, 0xC4, 0x06, 0x50, 0x82,
+	0x00, 0x2E, 0x5C, 0xB2, 0x44, 0x61, 0x46, 0x51,
+	0x0C, 0x18, 0x80, 0x18, 0x38, 0x82, 0x02, 0x25,
+	0x90, 0xA2, 0xB2, 0x60, 0x21, 0xA0, 0x40, 0x20,
+	0x49, 0x2A, 0x52, 0x28, 0x86, 0x93, 0xA6, 0x28,
+	0x9B, 0x94, 0x71, 0x02, 0xB9, 0x6D, 0x49, 0xA0,
+	0x2C, 0x09, 0x25, 0x28, 0x18, 0x93, 0x09, 0x10,
+	0x49, 0x4C, 0x13, 0xC9, 0x91, 0xA3, 0x88, 0x2D,
+	0x50, 0x12, 0x31, 0x63, 0xB4, 0x00, 0xA4, 0x00,
+	0x4E, 0x04, 0xB6, 0x68, 0x12, 0x14, 0x26, 0x00,
+	0x17, 0x00, 0x9B, 0x92, 0x0C, 0x51, 0xA8, 0x65,
+	0x11, 0x44, 0x8D, 0x44, 0x42, 0x69, 0x00, 0xA5,
+	0x6D, 0x04, 0xA9, 0x69, 0x43, 0x94, 0x69, 0x4C,
+	0xB8, 0x60, 0x52, 0x26, 0x2D, 0xA1, 0x32, 0x11,
+	0xCA, 0xB0, 0x11, 0x1B, 0x81, 0x90, 0x12, 0x11,
+	0x64, 0x42, 0x86, 0x89, 0x9C, 0x12, 0x51, 0xDC,
+	0xC0, 0x41, 0x13, 0x47, 0x68, 0x9B, 0x20, 0x92,
+	0xD1, 0x26, 0x91, 0x23, 0x96, 0x50, 0x13, 0xB3,
+	0x4C, 0x12, 0x45, 0x69, 0x21, 0xA1, 0x05, 0x0C,
+	0x46, 0x65, 0x99, 0x38, 0x30, 0x99, 0x26, 0x2E,
+	0x19, 0x15, 0x72, 0x11, 0x39, 0x8D, 0x89, 0x10,
+	0x92, 0x50, 0x28, 0x11, 0x48, 0xA6, 0x49, 0x52,
+	0xB6, 0x2D, 0xC9, 0x30, 0x4D, 0xD9, 0x32, 0x91,
+	0x91, 0xA6, 0x44, 0x14, 0x34, 0x0E, 0x13, 0x39,
+	0x41, 0x98, 0x06, 0x0C, 0x22, 0x25, 0x6C, 0x14,
+	0x47, 0x70, 0x21, 0xB7, 0x60, 0x23, 0x98, 0x25,
+	0xE4, 0x24, 0x6E, 0xD1, 0xB6, 0x44, 0x51, 0x44,
+	0x2C, 0x41, 0x42, 0x85, 0xE0, 0x44, 0x42, 0x89,
+	0x42, 0x42, 0xC2, 0x24, 0x2C, 0xCC, 0xC6, 0x68,
+	0x13, 0x12, 0x69, 0x98, 0x30, 0x49, 0x23, 0x28,
+	0x6A, 0x14, 0xC8, 0x11, 0x60, 0x92, 0x30, 0x11,
+	0x26, 0x52, 0x92, 0xB0, 0x00, 0x5C, 0x84, 0x2C,
+	0x4A, 0x14, 0x29, 0x0A, 0x95, 0x40, 0xE3, 0xC4,
+	0x05, 0x0C, 0xC8, 0x89, 0xA1, 0x26, 0x62, 0x44,
+	0x10, 0x04, 0x9A, 0xC8, 0x70, 0x0C, 0x93, 0x60,
+	0x90, 0xB6, 0x30, 0x12, 0x17, 0x71, 0x23, 0x18,
+	0x4E, 0xD4, 0x10, 0x85, 0x84, 0x20, 0x82, 0x5C,
+	0x14, 0x48, 0x90, 0xB2, 0x51, 0xA0, 0x18, 0x92,
+	0x93, 0x94, 0x80, 0x1A, 0x49, 0x72, 0xC0, 0x02,
+	0x06, 0xE1, 0xA6, 0x8C, 0xA1, 0x80, 0x4D, 0x4A,
+	0x26, 0x08, 0x18, 0x07, 0x62, 0x42, 0x12, 0x40,
+	0x10, 0x41, 0x64, 0x44, 0x42, 0x4E, 0x94, 0x86,
+	0x40, 0x9A, 0x84, 0x41, 0x21, 0xC5, 0x71, 0x01,
+	0x96, 0x29, 0x19, 0x40, 0x4E, 0x94, 0x36, 0x22,
+	0x24, 0xC3, 0x20, 0x22, 0x88, 0x71, 0x84, 0x20,
+	0x4C, 0x64, 0x20, 0x69, 0xDB, 0x84, 0x24, 0x24,
+	0x25, 0x46, 0x21, 0xC4, 0x71, 0x8A, 0x14, 0x64,
+	0x01, 0x20, 0x65, 0x4C, 0x84, 0x24, 0x44, 0x24,
+	0x30, 0x8A, 0x22, 0x70, 0xD3, 0x86, 0x30, 0x0B,
+	0xB4, 0x6C, 0x21, 0x23, 0x0A, 0x8B, 0xB8, 0x4D,
+	0x5C, 0xF7, 0xD7, 0xE6, 0x89, 0x30, 0x2B, 0xED,
+	0xB1, 0xC5, 0x86, 0x7E, 0x7D, 0x26, 0x9B, 0x1C,
+	0xDB, 0x07, 0xF8, 0x25, 0x64, 0x10, 0x82, 0xE1,
+	0x9A, 0x8D, 0xA2, 0xF9, 0x30, 0x77, 0xE8, 0xB1,
+	0xFC, 0x3D, 0x4E, 0x6B, 0x2D, 0x32, 0x58, 0x33,
+	0x6B, 0x4F, 0x9C, 0x64, 0x55, 0x15, 0x3A, 0xC0,
+	0x40, 0xA8, 0x47, 0xFB, 0x64, 0x7F, 0xBB, 0x6B,
+	0x55, 0x2A, 0x40, 0x00, 0x71, 0xFE, 0x17, 0x72,
+	0x48, 0x5B, 0x7A, 0x9D, 0x1F, 0x0D, 0x14, 0x7B,
+	0xF3, 0x38, 0x8C, 0x56, 0x54, 0x71, 0xE4, 0xE6,
+	0x2C, 0xC3, 0xCE, 0x0D, 0x0C, 0x0F, 0xC3, 0x60,
+	0xDF, 0x92, 0x89, 0xED, 0x99, 0x18, 0x37, 0x6B,
+	0x8B, 0x8B, 0x93, 0x14, 0x50, 0x47, 0xF8, 0xFE,
+	0xA2, 0x98, 0x60, 0x07, 0xC2, 0xAA, 0x89, 0x92,
+	0x2F, 0x69, 0xEB, 0x47, 0x5B, 0x59, 0x7B, 0x2B,
+	0xBA, 0x23, 0x7B, 0x9C, 0x84, 0x2E, 0x3F, 0xF1,
+	0xD3, 0x25, 0xE8, 0x2A, 0x1F, 0x23, 0xE9, 0x49,
+	0x89, 0xD0, 0x06, 0xBC, 0x7C, 0xE4, 0x94, 0x6F,
+	0x2E, 0x8B, 0x77, 0xE1, 0x08, 0x48, 0x46, 0x3C,
+	0x47, 0xFE, 0x7B, 0x20, 0x9E, 0x2A, 0x61, 0x7D,
+	0xDD, 0x41, 0x79, 0x6A, 0xE6, 0x14, 0x5E, 0x70,
+	0x9C, 0xDA, 0x94, 0x06, 0xF2, 0x26, 0x12, 0x57,
+	0xC2, 0x13, 0xB4, 0xB3, 0x0D, 0xA3, 0x0A, 0xC2,
+	0x5B, 0x0D, 0x06, 0xCF, 0x79, 0xA8, 0x12, 0xC5,
+	0xFC, 0xB0, 0xEF, 0x11, 0xD9, 0xFE, 0xDF, 0xE0,
+	0x99, 0x4A, 0xFE, 0x3B, 0x69, 0xB0, 0x6A, 0x29,
+	0x16, 0xCF, 0x69, 0x2B, 0x9D, 0xA7, 0x60, 0x28,
+	0xE5, 0xF3, 0xA0, 0x48, 0x79, 0xE6, 0x96, 0xD2,
+	0x1F, 0x73, 0x5C, 0x37, 0x83, 0x15, 0x36, 0x4D,
+	0xB0, 0xA4, 0xE0, 0xAB, 0x6B, 0x53, 0xD3, 0x1E,
+	0xFA, 0xF3, 0x0D, 0x65, 0xE3, 0x7A, 0x1B, 0x6A,
+	0x77, 0x04, 0x6F, 0x04, 0xC6, 0x4B, 0xA1, 0x07,
+	0x2A, 0x97, 0x80, 0xE0, 0xC5, 0x66, 0xC9, 0x43,
+	0x39, 0xA4, 0xD1, 0x9D, 0x00, 0x68, 0xC5, 0x7D,
+	0x6E, 0x6F, 0x0B, 0x51, 0x2D, 0xB7, 0x13, 0x4A,
+	0x95, 0x0E, 0xAF, 0x4F, 0x7B, 0x01, 0xA5, 0xFD,
+	0xD0, 0x65, 0xB9, 0x1B, 0xFA, 0x29, 0xE4, 0x42,
+	0x36, 0x79, 0xCD, 0xE7, 0x4B, 0xC6, 0xA8, 0xF1,
+	0xC8, 0x4C, 0x4D, 0xF7, 0x83, 0x87, 0x23, 0x1D,
+	0xC8, 0x5C, 0xE3, 0x26, 0x70, 0x44, 0x59, 0x03,
+	0xC4, 0xBE, 0xBE, 0xE3, 0xF5, 0x0C, 0x43, 0xE5,
+	0x04, 0x49, 0x49, 0x69, 0x11, 0xAA, 0x93, 0xE7,
+	0xE3, 0x95, 0x78, 0x74, 0x14, 0xD3, 0x17, 0x68,
+	0xD9, 0x91, 0x25, 0x20, 0xF8, 0x3C, 0x02, 0xFF,
+	0x01, 0x12, 0x4D, 0xCF, 0x0E, 0x12, 0x5F, 0xAF,
+	0xD5, 0xB9, 0xD7, 0xE7, 0xDD, 0xA4, 0xF5, 0xB5,
+	0x0C, 0x70, 0xAE, 0xBB, 0x85, 0x99, 0xA2, 0xE4,
+	0x47, 0x6A, 0x0D, 0xE5, 0x31, 0xB0, 0x40, 0x26,
+	0x72, 0xDF, 0x75, 0x75, 0x14, 0x2D, 0x86, 0x01,
+	0x60, 0x5C, 0x94, 0x01, 0x79, 0x23, 0xF6, 0x4A,
+	0xC5, 0x77, 0xC4, 0xBE, 0xD8, 0xD8, 0xE8, 0x9A,
+	0x74, 0xCA, 0x9F, 0x38, 0x19, 0xCB, 0xF1, 0x42,
+	0xA7, 0x2D, 0xEB, 0xE7, 0x7C, 0x4E, 0xFB, 0x71,
+	0x27, 0xE2, 0xD8, 0xC1, 0xB7, 0xBF, 0xB6, 0x42,
+	0x86, 0xC0, 0xBD, 0x52, 0x23, 0x3F, 0x43, 0xC6,
+	0x7D, 0x57, 0x17, 0xF9, 0x7A, 0xD8, 0x28, 0x54,
+	0x87, 0x3D, 0xDC, 0x7F, 0x71, 0xD6, 0x56, 0xAA,
+	0xA6, 0xEF, 0x70, 0x70, 0x60, 0xAF, 0x28, 0x0B,
+	0x9F, 0x45, 0x4B, 0x4F, 0xED, 0xB4, 0x77, 0x6E,
+	0x83, 0xB2, 0xFD, 0xBA, 0x20, 0xA4, 0x5A, 0xEF,
+	0xEB, 0x54, 0x9A, 0x1E, 0xD0, 0x38, 0x20, 0x21,
+	0x89, 0x3C, 0xA9, 0xA6, 0xE7, 0x4C, 0xCC, 0x30,
+	0xA2, 0x55, 0x39, 0x37, 0xCC, 0xEF, 0x34, 0x38,
+	0x99, 0xB5, 0x02, 0xCF, 0x46, 0xDD, 0xB8, 0xDD,
+	0x1D, 0x95, 0xFE, 0xFB, 0x60, 0xC9, 0xB2, 0x04,
+	0x69, 0xA1, 0x50, 0x3B, 0x2A, 0x68, 0x75, 0x87,
+	0x83, 0x0D, 0x33, 0xCE, 0xE9, 0xA7, 0x2D, 0x79,
+	0x8F, 0xCF, 0x4A, 0x9B, 0x45, 0x2C, 0x85, 0x49,
+	0xF5, 0x59, 0xC5, 0xD9, 0xFC, 0x6B, 0xFE, 0x08,
+	0x3F, 0x44, 0x6C, 0x2D, 0x90, 0x39, 0x81, 0xD9,
+	0xF2, 0x64, 0x92, 0x48, 0x3A, 0xB4, 0x52, 0xEA,
+	0x5B, 0xB1, 0x00, 0x8F, 0xFE, 0xAC, 0x97, 0x5D,
+	0xA0, 0x27, 0x59, 0x59, 0x3E, 0x7E, 0x06, 0x63,
+	0x61, 0x07, 0x3A, 0x83, 0xB2, 0x7B, 0x53, 0x1A,
+	0x3D, 0x0D, 0xDA, 0x51, 0x7C, 0xA9, 0x90, 0xEA,
+	0x32, 0x35, 0xD1, 0xD7, 0xB5, 0xE0, 0x9D, 0xA5,
+	0xF0, 0x2D, 0xC1, 0x52, 0x5B, 0x1D, 0xA6, 0x85,
+	0x96, 0x5B, 0x54, 0xFC, 0x2A, 0x3A, 0x73, 0xA1,
+	0x79, 0x0E, 0x0E, 0xFB, 0x69, 0xE7, 0x0A, 0x78,
+	0xFA, 0x55, 0x03, 0x44, 0xEA, 0x8C, 0x75, 0x3D,
+	0xBF, 0x18, 0x63, 0x9B, 0xAA, 0x8C, 0xB1, 0x25,
+	0x9A, 0xA7, 0x4F, 0x68, 0xF9, 0x2A, 0xBA, 0x80,
+	0x07, 0xC6, 0x18, 0xCC, 0xB6, 0xF5, 0x06, 0x9F,
+	0xF4, 0x6B, 0x97, 0x51, 0xBB, 0xFF, 0xF3, 0x7D,
+	0xF3, 0x21, 0x36, 0x0F, 0x0F, 0x5C, 0x0E, 0x7F,
+	0x56, 0x26, 0xDD, 0x12, 0x9A, 0xE3, 0xAE, 0x2A,
+	0x7C, 0x56, 0xCD, 0xB6, 0x11, 0xED, 0xA4, 0xC9,
+	0x8F, 0xEC, 0x83, 0x16, 0x3C, 0xD5, 0x11, 0x68,
+	0x78, 0xC1, 0xA9, 0x3E, 0xBA, 0xA2, 0x6D, 0xB4,
+	0x05, 0xEA, 0xF4, 0xA7, 0xAB, 0xA2, 0x77, 0x83,
+	0x7D, 0xE9, 0xA5, 0x15, 0x04, 0x70, 0x76, 0x24,
+	0xEF, 0x2E, 0x1B, 0xBB, 0xCA, 0x29, 0x24, 0x11,
+	0x16, 0x7F, 0x2E, 0x3D, 0x39, 0x0C, 0x0E, 0x51,
+	0xF8, 0x4A, 0x2F, 0x13, 0x83, 0x90, 0xE3, 0x3F,
+	0x85, 0x83, 0x5D, 0x38, 0xA9, 0x4D, 0xBB, 0xE7,
+	0x1E, 0x6C, 0x82, 0x1E, 0x86, 0xB1, 0x1F, 0xFD,
+	0x89, 0xEF, 0xF4, 0xBF, 0xE2, 0x08, 0xD6, 0x00,
+	0x5D, 0x28, 0xF7, 0x04, 0xBA, 0xEA, 0xD1, 0xF2,
+	0x5D, 0xE0, 0xEB, 0x24, 0x1B, 0x18, 0xFC, 0x7F,
+	0xA0, 0xDD, 0xD9, 0x0D, 0xC1, 0x39, 0xBE, 0x7F,
+	0xCB, 0xEB, 0x97, 0x30, 0xFA, 0xE4, 0xB5, 0xD1,
+	0x72, 0x70, 0xCE, 0x4C, 0x67, 0x0C, 0x42, 0x57,
+	0x0A, 0x9C, 0xF2, 0x5B, 0xC4, 0xFA, 0xE5, 0xCD,
+	0x31, 0xE5, 0xD5, 0x5A, 0xD0, 0x22, 0x6A, 0x94,
+	0xBE, 0x52, 0x94, 0x8C, 0x67, 0x02, 0xA9, 0x86,
+	0xA0, 0xAD, 0xBF, 0xCD, 0x3A, 0xC4, 0x82, 0xBB,
+	0x12, 0xAB, 0xBB, 0x79, 0xA2, 0xF6, 0x60, 0x28,
+	0x42, 0x15, 0x3B, 0x2F, 0x82, 0xA3, 0xB3, 0xCD,
+	0x16, 0x88, 0xE7, 0x4D, 0x36, 0x53, 0x4B, 0xFF,
+	0x8C, 0x48, 0xD3, 0xC4, 0x51, 0xEB, 0x2C, 0x5F,
+	0x98, 0xFE, 0xB9, 0xE7, 0x86, 0x4D, 0x60, 0xAF,
+	0x96, 0xE8, 0x3B, 0x21, 0x62, 0x46, 0x74, 0x82,
+	0xF0, 0x58, 0x63, 0x9C, 0x86, 0xA7, 0x85, 0xA9,
+	0xA1, 0xD4, 0xB6, 0x9B, 0xC3, 0x0E, 0x77, 0xA6,
+	0x4C, 0x3B, 0xBC, 0xD7, 0xDE, 0xB4, 0xE3, 0xD3,
+	0x0F, 0x1A, 0x67, 0x21, 0x20, 0x3D, 0x87, 0xA8,
+	0x8A, 0xB8, 0x5E, 0x02, 0x7A, 0x97, 0x42, 0xFC,
+	0x68, 0x8F, 0x0A, 0xDF, 0x15, 0x72, 0x8E, 0x59,
+	0x7E, 0x91, 0x0C, 0xFE, 0x5D, 0xF3, 0x3C, 0x56,
+	0xA1, 0x36, 0xEF, 0x39, 0xC7, 0xCA, 0x5D, 0x65,
+	0x0C, 0x2B, 0x9F, 0x90, 0x1C, 0x9B, 0x89, 0xE1,
+	0xE0, 0x93, 0x54, 0x93, 0x61, 0xF3, 0x03, 0xBE,
+	0x88, 0x39, 0xD1, 0x45, 0x4C, 0xCE, 0xB5, 0xFB,
+	0xC4, 0x43, 0x5F, 0xA0, 0xDA, 0xB5, 0x8A, 0x8F,
+	0xC2, 0x85, 0x36, 0x0E, 0xEA, 0x49, 0x1C, 0xA0,
+	0x77, 0x96, 0x1C, 0x4A, 0xAA, 0x3E, 0x96, 0xDE,
+	0x99, 0x71, 0xB9, 0x4F, 0xDF, 0xA5, 0x20, 0x7C,
+	0xCF, 0x0D, 0x9D, 0xAB, 0x2C, 0x48, 0x96, 0xF0,
+	0x7E, 0xB6, 0x77, 0x1A, 0x38, 0x3C, 0x65, 0x12,
+	0xF4, 0x1E, 0xA2, 0x8D, 0xEE, 0xE4, 0x07, 0xFD,
+	0xAE, 0x3C, 0x57, 0x4F, 0x5D, 0x41, 0x6A, 0x89,
+	0x7A, 0x27, 0xEF, 0x7C, 0xF5, 0x96, 0xF0, 0x43,
+	0x2D, 0x62, 0x4A, 0x2C, 0x4E, 0xAC, 0xE5, 0x2F,
+	0x3C, 0xBF, 0x2C, 0x63, 0x31, 0xB8, 0x0C, 0x9C,
+	0x91, 0x65, 0xBF, 0x13, 0x34, 0x24, 0x69, 0x32,
+	0x02, 0x4E, 0xC0, 0xBE, 0x44, 0xB3, 0x21, 0x36,
+	0xB4, 0xE4, 0x34, 0x27, 0x91, 0x35, 0x85, 0x03,
+	0x64, 0xC7, 0x57, 0xF1, 0xDC, 0xFA, 0x63, 0x85,
+	0xE2, 0x56, 0x33, 0x12, 0xC5, 0xF5, 0x53, 0xF0,
+	0xC8, 0x44, 0xEA, 0xBB, 0x79, 0x11, 0xCE, 0xE7,
+	0x60, 0xCA, 0xEB, 0x3E, 0x19, 0x3B, 0xF3, 0xA9,
+	0xC3, 0x81, 0x14, 0x87, 0x23, 0x9A, 0xD2, 0xE0,
+	0x14, 0x78, 0xF4, 0x6E, 0x41, 0x8A, 0x5D, 0xE5,
+	0x6B, 0x7F, 0x17, 0x55, 0xBA, 0x68, 0xF9, 0xA3,
+	0x74, 0x61, 0x3B, 0x5D, 0xE2, 0xED, 0x26, 0xC5,
+	0x80, 0xC7, 0x72, 0xDB, 0xDB, 0xFA, 0xB1, 0xF7,
+	0xE3, 0xF5, 0x7D, 0x94, 0xF8, 0x4E, 0x30, 0xDE,
+	0xB2, 0x9D, 0x70, 0xA9, 0x1D, 0xF2, 0x88, 0xFC,
+	0x43, 0xA2, 0x76, 0xDF, 0xED, 0x58, 0xE2, 0xB0,
+	0xDB, 0x53, 0x83, 0xE5, 0x32, 0xB6, 0xEE, 0xDF,
+	0xB3, 0x92, 0xE4, 0x3D, 0xC3, 0xDA, 0x72, 0x01,
+	0xA0, 0x68, 0xF5, 0x23, 0x1E, 0xE5, 0x22, 0x09,
+	0x8D, 0x68, 0x59, 0xB2, 0xD5, 0x64, 0x63, 0xA8,
+	0x91, 0x7B, 0x3C, 0x25, 0x61, 0x65, 0x79, 0x66,
+	0xDB, 0xC4, 0x78, 0x56, 0xB6, 0xFF, 0xC8, 0x2B,
+	0xCC, 0x37, 0x9F, 0xFD, 0x08, 0xB2, 0x59, 0xF3,
+	0xD9, 0xD7, 0x87, 0x3B, 0xA8, 0xFC, 0xBE, 0x4C,
+	0x94, 0x13, 0xB6, 0x01, 0x15, 0x91, 0x60, 0x70,
+	0x1D, 0xF0, 0x04, 0x70, 0xB1, 0x49, 0xBD, 0xF3,
+	0x2F, 0x4D, 0x3C, 0xFC, 0xFB, 0x9D, 0xEB, 0xC7,
+	0x72, 0x41, 0x71, 0x7D, 0x13, 0x06, 0x7A, 0xAE,
+	0xD2, 0x3C, 0x7A, 0x26, 0x51, 0x18, 0x51, 0x69,
+	0xF1, 0x26, 0x70, 0x61, 0xFB, 0x6B, 0x30, 0xE4,
+	0xFE, 0xA7, 0x3F, 0x66, 0xF4, 0xF9, 0x27, 0x56,
+	0xAC, 0x26, 0x23, 0x41, 0x8A, 0xF8, 0xB2, 0xA3,
+	0x98, 0x71, 0x1B, 0x7C, 0x68, 0x07, 0xB4, 0x34,
+	0x25, 0xE1, 0xD9, 0x9B, 0xFD, 0xCD, 0x5D, 0xF5,
+	0x31, 0x95, 0x28, 0x79, 0x06, 0xA3, 0x32, 0xF5,
+	0x99, 0x71, 0xA0, 0xC3, 0x43, 0x97, 0x5F, 0xC3,
+	0x20, 0xAD, 0x13, 0x7C, 0x9E, 0x34, 0xCE, 0x7C,
+	0xE8, 0x55, 0x20, 0xB2, 0x6C, 0xA1, 0x97, 0xA1,
+	0xFA, 0x2D, 0xF2, 0xEC, 0xD4, 0xE3, 0xFA, 0x83,
+	0x3B, 0x3B, 0xD2, 0xC2, 0x44, 0x82, 0x80, 0x42,
+	0x52, 0xCF, 0x1D, 0xF6, 0xAD, 0xC6, 0x39, 0x8F,
+	0x35, 0xE9, 0x8A, 0xB1, 0x87, 0x10, 0x40, 0x76,
+	0x80, 0xC9, 0xC1, 0xDB, 0xAC, 0x8C, 0x7E, 0xDC,
+	0x86, 0x46, 0xB9, 0x70, 0x82, 0xE2, 0xE1, 0x21,
+	0xFA, 0xA7, 0xFA, 0xC2, 0x1E, 0x4A, 0x33, 0x83,
+	0x84, 0xCB, 0x92, 0x20, 0x2C, 0x61, 0xBD, 0x12,
+	0x6C, 0x5D, 0xDD, 0x45, 0x8B, 0x32, 0x7A, 0x18,
+	0xBD, 0x71, 0x6F, 0x14, 0x2C, 0xA5, 0xCD, 0xB3,
+	0xE4, 0x9D, 0x7E, 0xB8, 0xD9, 0x62, 0xB5, 0xB8,
+	0x5A, 0x88, 0xF7, 0x99, 0xB6, 0x9A, 0x6A, 0x66,
+	0xC7, 0xBD, 0x62, 0x9F, 0x56, 0xB4, 0x3C, 0x02,
+	0x90, 0x62, 0x9B, 0x5E, 0x27, 0x4C, 0xDE, 0xC7,
+	0xA0, 0x72, 0x29, 0xE7, 0x93, 0x9A, 0x77, 0xD3,
+	0x2E, 0x8E, 0xF7, 0x30, 0xFC, 0xCE, 0xAD, 0x9C,
+	0x4E, 0x06, 0x77, 0xA8, 0x3A, 0x03, 0x30, 0xAB,
+	0x76, 0x5D, 0x33, 0x6D, 0xD2, 0xAA, 0x15, 0x5D,
+	0xCD, 0x2A, 0xC7, 0xF3, 0x15, 0x29, 0x77, 0x4F,
+	0x49, 0x36, 0xB0, 0x5D, 0x0B, 0x14, 0xB4, 0x8F,
+	0xAA, 0x1E, 0x8C, 0xD4, 0x50, 0x56, 0xE5, 0x6C,
+	0x13, 0x9B, 0x17, 0xF8, 0x90, 0x71, 0x5A, 0xD6,
+	0x3D, 0x6C, 0x4A, 0x9F, 0x2D, 0x97, 0x6C, 0x8B,
+	0x63, 0x5B, 0xDF, 0xE5, 0x86, 0x02, 0x81, 0x6F,
+	0x61, 0x2C, 0x6E, 0x4B, 0x22, 0x53, 0x67, 0xCB,
+	0x9A, 0x7B, 0xB7, 0x9C, 0x01, 0x8F, 0x1B, 0x8C,
+	0x53, 0x15, 0x18, 0x0A, 0xAD, 0xBE, 0x3A, 0xB7,
+	0x5A, 0xC3, 0x56, 0x20, 0x6F, 0xE2, 0x7C, 0x12,
+	0xDF, 0x3B, 0x56, 0x97, 0x84, 0xE3, 0xA5, 0x38,
+	0xFB, 0x05, 0x24, 0x18, 0x26, 0x6E, 0x72, 0xDB,
+	0x40, 0x0D, 0x6F, 0x32, 0xC4, 0x29, 0x7F, 0x34,
+	0xF9, 0xF1, 0xAF, 0x18, 0x6C, 0x37, 0x65, 0x65,
+	0x5F, 0x11, 0xB3, 0xE5, 0xA3, 0xC8, 0x04, 0x9B,
+	0x7D, 0xF1, 0x40, 0x11, 0xFF, 0x21, 0x5F, 0xBF,
+	0x17, 0xBF, 0x89, 0xEE, 0x97, 0x6C, 0xF0, 0xDB,
+	0xAB, 0x62, 0x70, 0x10, 0x4E, 0x7E, 0x31, 0x9D,
+	0x1F, 0x64, 0xC5, 0x9E, 0x20, 0x9E, 0x35, 0x82,
+};
+
+uint8_t mldsa_44_pubkey_noseed[] = {
+	0xBA, 0x71, 0xF9, 0xF6, 0x4E, 0x11, 0xBA, 0xEB,
+	0x58, 0xFA, 0x9C, 0x6F, 0xBB, 0x6E, 0x14, 0xE6,
+	0x1F, 0x18, 0x64, 0x3D, 0xAB, 0x49, 0x5B, 0x47,
+	0x53, 0x9A, 0x91, 0x66, 0xCA, 0x01, 0x98, 0x13,
+	0x1C, 0x44, 0xF8, 0x26, 0xBB, 0xD5, 0x6E, 0x34,
+	0xE5, 0x5D, 0xB5, 0xE5, 0xE2, 0xD7, 0x33, 0x48,
+	0x5E, 0x39, 0xEA, 0x26, 0x0F, 0xC6, 0x00, 0x0C,
+	0x5E, 0xA4, 0xBA, 0x80, 0xD3, 0x45, 0x5C, 0xDE,
+	0x53, 0xB4, 0x6F, 0x34, 0x48, 0x2A, 0xED, 0xFD,
+	0x54, 0x50, 0xFC, 0x2E, 0x1B, 0xA4, 0xF2, 0x5D,
+	0x15, 0xF9, 0xC1, 0x44, 0x24, 0x2F, 0xB3, 0x9B,
+	0xB5, 0x22, 0x87, 0x18, 0x90, 0x30, 0xC5, 0x04,
+	0x98, 0xE1, 0x71, 0x7B, 0x7C, 0x75, 0x8B, 0x19,
+	0x0A, 0x67, 0x48, 0xEA, 0x9A, 0xA3, 0xF7, 0xAC,
+	0xAA, 0xF2, 0xC7, 0xCB, 0x52, 0x6E, 0xD7, 0x17,
+	0xC9, 0xF7, 0x9A, 0xEB, 0x84, 0x21, 0x4F, 0xA5,
+	0xCD, 0x8D, 0xED, 0x92, 0xA0, 0xC3, 0xFA, 0x15,
+	0x58, 0x81, 0x0F, 0x12, 0xC7, 0x05, 0x0A, 0x36,
+	0x77, 0x08, 0xD1, 0x96, 0xCD, 0x24, 0xE5, 0xAF,
+	0x97, 0x49, 0x04, 0xAE, 0xD8, 0xE4, 0xCE, 0x88,
+	0x72, 0xE8, 0x69, 0x6B, 0x0B, 0x7B, 0xCA, 0x50,
+	0xE4, 0x52, 0xCD, 0x7D, 0x30, 0xEA, 0x9A, 0x4A,
+	0xDA, 0xC0, 0x31, 0x1D, 0x67, 0x2C, 0x6B, 0xDE,
+	0x84, 0x96, 0x24, 0x0B, 0x07, 0x43, 0x14, 0x63,
+	0x70, 0x88, 0x95, 0xCD, 0x9B, 0xAF, 0xC3, 0x16,
+	0x32, 0xD7, 0x39, 0x76, 0x49, 0x38, 0x8F, 0xDA,
+	0xFC, 0xBF, 0x7D, 0x30, 0x5A, 0x3D, 0xE9, 0xA4,
+	0x95, 0xEC, 0xA7, 0x43, 0x3A, 0x8F, 0x83, 0xBA,
+	0x0F, 0x0B, 0x25, 0xC4, 0x13, 0xC6, 0xE3, 0x9C,
+	0x96, 0xEB, 0x7D, 0x69, 0x1B, 0x34, 0xD3, 0x7C,
+	0xE3, 0x7F, 0x1E, 0xEA, 0xD1, 0xCF, 0x21, 0x7E,
+	0x25, 0xEF, 0x34, 0xEE, 0xCF, 0x3F, 0x7C, 0x60,
+	0xF8, 0x4B, 0x8E, 0xDF, 0xDD, 0xE8, 0x40, 0x5D,
+	0x4F, 0x83, 0x25, 0x76, 0xC6, 0x1E, 0xF9, 0x8E,
+	0x0A, 0x2F, 0x28, 0xDA, 0x18, 0x77, 0x00, 0x95,
+	0x39, 0x24, 0xF6, 0x86, 0xB9, 0x46, 0x14, 0x70,
+	0x5B, 0xCF, 0x53, 0xD3, 0x3F, 0xED, 0xD4, 0x34,
+	0x8E, 0xDD, 0xDB, 0xDF, 0x28, 0xB5, 0x06, 0x5E,
+	0x1F, 0x20, 0x77, 0x50, 0x43, 0xE8, 0x5C, 0xF9,
+	0x31, 0xF8, 0x29, 0x17, 0x93, 0x63, 0xA1, 0xA7,
+	0xE7, 0x40, 0x4A, 0x83, 0x8E, 0xC0, 0x00, 0x86,
+	0xB0, 0x97, 0x63, 0x86, 0xFE, 0x63, 0x7C, 0x98,
+	0x24, 0x47, 0x57, 0xE3, 0xF7, 0x69, 0xDD, 0xD4,
+	0x46, 0x74, 0x71, 0xBF, 0xAD, 0x67, 0x0F, 0x9A,
+	0x05, 0xF8, 0x24, 0x6E, 0xE5, 0x0A, 0x7B, 0x1E,
+	0xAF, 0x87, 0xFC, 0x40, 0x69, 0xC3, 0xAE, 0x2A,
+	0xA2, 0x03, 0x32, 0x58, 0x11, 0x77, 0x92, 0xF0,
+	0xBC, 0xD4, 0x9E, 0x08, 0x3F, 0xD1, 0xBC, 0x74,
+	0x96, 0xAB, 0xFF, 0x29, 0xCC, 0x94, 0xE4, 0x86,
+	0x8B, 0x21, 0x21, 0x4E, 0xD3, 0x16, 0x52, 0x53,
+	0x99, 0xA6, 0x10, 0xFB, 0xDD, 0x4A, 0x80, 0xE7,
+	0xC8, 0x07, 0x15, 0xF2, 0x95, 0x78, 0xE2, 0xA8,
+	0x4B, 0xB4, 0x0B, 0xDD, 0xDB, 0xD9, 0xF4, 0x7A,
+	0x11, 0xB6, 0xE7, 0xDA, 0x11, 0x8A, 0x1B, 0x65,
+	0x8D, 0x35, 0x9E, 0x8A, 0xEF, 0x55, 0xEB, 0x46,
+	0xB5, 0x37, 0x6B, 0x5B, 0x65, 0x59, 0x79, 0x98,
+	0x4A, 0x92, 0x2B, 0xEE, 0xBF, 0xC5, 0x9B, 0xCD,
+	0x60, 0x0D, 0x53, 0x09, 0xDC, 0xCD, 0x72, 0xDB,
+	0xF0, 0x78, 0x7D, 0xB8, 0xBA, 0x75, 0x7B, 0x53,
+	0x7C, 0x1E, 0xAF, 0xD5, 0xC0, 0xF5, 0x0E, 0xA4,
+	0xBC, 0x95, 0x83, 0x54, 0x9E, 0x28, 0x29, 0xA4,
+	0x2C, 0x28, 0xCA, 0xC2, 0x48, 0xC9, 0x6D, 0x78,
+	0x12, 0x4C, 0x47, 0x15, 0x9B, 0x18, 0xAE, 0xDD,
+	0x75, 0x4A, 0xBA, 0x17, 0xB1, 0x9D, 0x43, 0x0F,
+	0xB7, 0x8F, 0x63, 0x3E, 0xA9, 0xD2, 0x6F, 0x54,
+	0xA9, 0xBD, 0x50, 0xF8, 0xD8, 0xF6, 0xB7, 0x35,
+	0x94, 0xF8, 0x28, 0x97, 0x6E, 0x7E, 0xA0, 0x9C,
+	0x53, 0xBB, 0xB9, 0xF1, 0x1A, 0x56, 0xC9, 0x50,
+	0x7F, 0xB8, 0x9B, 0x9A, 0x5E, 0xBC, 0x03, 0x7A,
+	0x37, 0x26, 0x7A, 0x95, 0xF8, 0x5B, 0x8D, 0x64,
+	0xCA, 0x97, 0x19, 0x2B, 0x10, 0xA6, 0x6F, 0x41,
+	0x7B, 0x3F, 0x61, 0xFE, 0x9C, 0xA5, 0x71, 0x30,
+	0xA4, 0x8F, 0xD9, 0x25, 0xEA, 0xE2, 0xAB, 0x55,
+	0x02, 0xD5, 0x71, 0xC8, 0xA5, 0x19, 0x03, 0xC1,
+	0xD3, 0x98, 0xF4, 0xC1, 0xF7, 0x6A, 0x7E, 0x11,
+	0x74, 0x39, 0x76, 0xAF, 0xDB, 0xC6, 0x97, 0xF2,
+	0x30, 0x94, 0xA3, 0xCD, 0x76, 0x1F, 0xF9, 0x68,
+	0x5D, 0xE3, 0x2E, 0x09, 0xFB, 0x3C, 0x28, 0xAD,
+	0xD4, 0x53, 0x49, 0x03, 0x00, 0xBC, 0x7C, 0x89,
+	0xDC, 0x01, 0x78, 0x00, 0x96, 0x07, 0x17, 0x22,
+	0x94, 0x57, 0x75, 0xF2, 0x64, 0xE1, 0xB0, 0x62,
+	0x3B, 0xCF, 0x46, 0x19, 0xC7, 0x12, 0xC8, 0x38,
+	0x76, 0x12, 0x05, 0xD8, 0x76, 0x91, 0xB7, 0x5E,
+	0xF3, 0x60, 0x19, 0x6C, 0xBB, 0x9E, 0x9B, 0x92,
+	0xA0, 0xD4, 0xC4, 0xED, 0x62, 0x32, 0x6E, 0x50,
+	0x24, 0xD7, 0x75, 0x10, 0xB8, 0xEE, 0x2C, 0x74,
+	0x26, 0xCC, 0x22, 0xEA, 0xE2, 0x09, 0xDC, 0x9F,
+	0x13, 0xBD, 0xE6, 0xBF, 0x08, 0xF5, 0xE7, 0x18,
+	0x1B, 0xD3, 0xB4, 0x59, 0x45, 0x0B, 0x45, 0x1A,
+	0x51, 0x53, 0x9A, 0x71, 0x5C, 0x21, 0xD6, 0x7D,
+	0xD3, 0x30, 0xEB, 0x59, 0x70, 0xDB, 0x00, 0xD9,
+	0xED, 0xBF, 0xB2, 0x82, 0x2B, 0x03, 0x6F, 0xA1,
+	0x3B, 0xAF, 0xEB, 0x86, 0xD8, 0xDC, 0x78, 0x86,
+	0x6E, 0x3F, 0x8D, 0x43, 0xE5, 0x3D, 0x78, 0xCC,
+	0xA5, 0x59, 0x5A, 0x6F, 0xAF, 0x88, 0x6B, 0x5D,
+	0xC1, 0x12, 0xF1, 0xCF, 0x4A, 0xDC, 0xFA, 0x87,
+	0x58, 0x00, 0xD9, 0x0B, 0x48, 0x88, 0x3A, 0xF9,
+	0x73, 0x16, 0xFE, 0x15, 0x06, 0x87, 0x3F, 0xC1,
+	0x57, 0xE5, 0x70, 0xEA, 0xCB, 0xFD, 0x22, 0x28,
+	0x68, 0xD1, 0x42, 0x34, 0x10, 0x19, 0x66, 0xAF,
+	0xB6, 0xBF, 0x99, 0x40, 0x82, 0x92, 0x53, 0xA9,
+	0x53, 0xAD, 0xA8, 0x9F, 0xC7, 0x56, 0xB6, 0xA8,
+	0x49, 0xF7, 0x0A, 0xCB, 0x98, 0x38, 0xE6, 0x9F,
+	0xAA, 0x50, 0xBB, 0xA7, 0x5E, 0x3E, 0x89, 0xC2,
+	0xAD, 0xB5, 0x7E, 0x86, 0xD0, 0x88, 0xAB, 0x9B,
+	0x04, 0xA2, 0x8E, 0x67, 0x07, 0x09, 0x17, 0x22,
+	0x43, 0xEC, 0x5E, 0x00, 0x08, 0xA5, 0xCE, 0xAF,
+	0x3F, 0x87, 0x22, 0xF4, 0x87, 0x30, 0x25, 0x96,
+	0xFF, 0xD7, 0x55, 0xAD, 0x1B, 0x82, 0xA4, 0x9C,
+	0x34, 0xB3, 0x46, 0x95, 0x15, 0xB4, 0x6A, 0xA2,
+	0x90, 0xCD, 0x86, 0xEE, 0x38, 0xEA, 0x7A, 0x9B,
+	0xE3, 0xF1, 0x03, 0x61, 0x03, 0x35, 0xB5, 0x31,
+	0xCC, 0xA3, 0x33, 0xDD, 0xFE, 0x32, 0xB1, 0x45,
+	0x10, 0xF4, 0xB0, 0x7E, 0xF9, 0x5F, 0xC6, 0x68,
+	0x4E, 0x8C, 0x45, 0x4A, 0x92, 0xC1, 0x0D, 0xBB,
+	0x5D, 0x59, 0xC7, 0xA7, 0xC6, 0x3F, 0xB3, 0x05,
+	0xFE, 0x88, 0x19, 0x67, 0xD9, 0x9E, 0x66, 0x9E,
+	0xB6, 0x32, 0x84, 0x05, 0x82, 0x56, 0x0B, 0xB4,
+	0x03, 0x43, 0x1D, 0x40, 0xF7, 0x5A, 0x49, 0x54,
+	0x90, 0x84, 0x82, 0x27, 0x82, 0x92, 0x82, 0x1F,
+	0x4E, 0xA9, 0x1E, 0x42, 0xE7, 0x8F, 0xA4, 0x8C,
+	0xAE, 0xE3, 0xC8, 0x36, 0x14, 0x6D, 0xCF, 0xD7,
+	0x38, 0xD1, 0x17, 0xE9, 0x2E, 0x9A, 0x15, 0x13,
+	0x7D, 0x28, 0xE8, 0xE6, 0xA4, 0xB4, 0x62, 0x26,
+	0x50, 0xCB, 0x41, 0x35, 0x04, 0xCB, 0x3A, 0x33,
+	0x5D, 0x44, 0xBE, 0xEC, 0x57, 0x46, 0xC1, 0xC2,
+	0x94, 0xB1, 0xE8, 0xCB, 0x99, 0xCB, 0x60, 0x8D,
+	0x92, 0x8F, 0x8C, 0xE3, 0x56, 0x36, 0x32, 0xC5,
+	0x21, 0xF2, 0x3D, 0x13, 0xC6, 0x1A, 0x8F, 0x61,
+	0xC0, 0x1D, 0xF8, 0xC9, 0x6C, 0x73, 0x60, 0xDB,
+	0x4F, 0x3C, 0x68, 0xAA, 0x5D, 0x2F, 0xDD, 0x34,
+	0x2A, 0x62, 0xFF, 0x34, 0x59, 0xC1, 0x16, 0x38,
+	0x94, 0x21, 0xAB, 0x43, 0xE8, 0x58, 0x4C, 0x45,
+	0x88, 0x2B, 0x50, 0xE6, 0xE4, 0xE9, 0x6D, 0xB6,
+	0xF0, 0xB8, 0xFD, 0xE8, 0x90, 0xD5, 0xDB, 0xFA,
+	0xDC, 0xD8, 0x86, 0x90, 0xB4, 0x49, 0xE6, 0x42,
+	0x40, 0xDD, 0xB2, 0x02, 0x37, 0x47, 0xF3, 0x08,
+	0x36, 0x3E, 0x30, 0x1A, 0xA7, 0x77, 0x57, 0x16,
+	0x9F, 0xC6, 0x15, 0x06, 0x28, 0xD5, 0x92, 0x0B,
+	0x5A, 0xA1, 0xAB, 0x1C, 0x8C, 0xBF, 0x44, 0xCB,
+	0x00, 0xE0, 0x25, 0xD7, 0x87, 0x9D, 0x72, 0xB4,
+	0x79, 0xE3, 0xAF, 0x53, 0x11, 0xC7, 0x85, 0x72,
+	0x55, 0x90, 0xDA, 0x9C, 0x89, 0xB9, 0xFC, 0x3B,
+	0x84, 0x50, 0x76, 0x95, 0x54, 0xEB, 0x44, 0xD2,
+	0x03, 0xEB, 0xA2, 0xBB, 0xAE, 0xF9, 0xCA, 0xD2,
+	0x23, 0x70, 0x11, 0xC2, 0xEA, 0x44, 0xEF, 0xF0,
+	0x0F, 0x29, 0x9A, 0x48, 0xFF, 0xE2, 0x8C, 0xA9,
+	0x3D, 0xDF, 0x85, 0xF7, 0x66, 0x08, 0x24, 0x2E,
+	0xF8, 0xD6, 0xCC, 0x24, 0x61, 0x0A, 0x1E, 0x20,
+	0x78, 0xFC, 0xAC, 0x4F, 0x93, 0x85, 0xC3, 0x14,
+	0x90, 0x5E, 0xCA, 0xA8, 0x2E, 0x55, 0x39, 0x16,
+	0xD9, 0x4D, 0x1A, 0x7C, 0x1E, 0xC6, 0x52, 0xAA,
+	0x08, 0x89, 0x70, 0x83, 0xDA, 0xA2, 0xEB, 0xB1,
+	0x77, 0x5F, 0xBC, 0x47, 0x1A, 0xE2, 0x77, 0x77,
+	0xD7, 0x90, 0x4E, 0xA9, 0xF1, 0xB9, 0x2B, 0xCA,
+	0xC3, 0xD8, 0xA3, 0x15, 0x84, 0x26, 0x08, 0x7B,
+	0x64, 0x5B, 0x11, 0x08, 0xF0, 0xD6, 0x5F, 0xEC,
+	0x93, 0x78, 0x9C, 0x05, 0x37, 0x43, 0xCA, 0x14,
+	0xFD, 0x63, 0xD0, 0x5E, 0x98, 0xB6, 0x52, 0xDF,
+	0x2B, 0x9C, 0x2F, 0xF9, 0xCE, 0x05, 0xF1, 0x94,
+	0x07, 0x03, 0xFF, 0xB2, 0x73, 0xF8, 0x0E, 0x0E,
+	0x27, 0x32, 0xEC, 0xA9, 0x96, 0x0D, 0x98, 0x1B,
+	0x4C, 0xFD, 0x3B, 0x7B, 0xB8, 0x04, 0x5B, 0x3C,
+	0x38, 0x30, 0x54, 0x6B, 0x9D, 0xD8, 0xDB, 0x0D,
+};
+
+uint8_t mldsa_44_extmu[] = {
+	0x1B, 0x2A, 0xA5, 0xD5, 0xE3, 0xF3, 0xC1, 0xD4,
+	0x8D, 0x7C, 0xE6, 0x8F, 0xE9, 0xE3, 0xD1, 0xF5,
+	0x2E, 0x4B, 0x7C, 0xD6, 0x2A, 0xF4, 0x2E, 0xE5,
+	0x8F, 0xC3, 0xB1, 0xA4, 0xB9, 0xD1, 0x2C, 0x8B,
+	0x9E, 0x4D, 0x7A, 0xA9, 0x7C, 0xD3, 0xE6, 0x5A,
+	0xF4, 0x1B, 0x2A, 0xA5, 0xD5, 0xE3, 0xF3, 0xC1,
+	0xD4, 0x8D, 0x7C, 0xE6, 0x8F, 0xE9, 0xE3, 0xD1,
+	0xF5, 0x2E, 0x4B, 0x7C, 0xD6, 0x2A, 0xF4, 0x2E,
+};
+
+struct crypto_testsuite_mldsa_params mldsa_keygen_test_vectors[] = {
+	{
+		.name = "mldsa_44_keygen",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.seed = {
+			.data = mldsa_44_seed,
+			.length = sizeof(mldsa_44_seed),
+		},
+	},
+	{
+		.name = "mldsa_44_keygen (deterministic)",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.seed = {
+			.data = (uint8_t [32]) {0},
+			.length = 32,
+		},
+		.privkey = {
+			.data = mldsa_44_privkey_noseed,
+			.length = sizeof(mldsa_44_privkey_noseed),
+		},
+		.pubkey = {
+			.data = mldsa_44_pubkey_noseed,
+			.length = sizeof(mldsa_44_pubkey_noseed),
+		},
+	},
+};
+
+struct crypto_testsuite_mldsa_params mldsa_sign_test_vectors[] = {
+	{
+		.name = "mldsa_44_sign",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.hash = 0,
+		.seed = {
+			.data = mldsa_44_seed,
+			.length = sizeof(mldsa_44_seed),
+		},
+		.privkey = {
+			.data = mldsa_44_privkey,
+			.length = sizeof(mldsa_44_privkey),
+		},
+		.pubkey = {
+			.data = mldsa_44_pubkey,
+			.length = sizeof(mldsa_44_pubkey),
+		},
+		.message = {
+			.data = mldsa_44_message,
+			.length = sizeof(mldsa_44_message),
+		},
+		.context = {
+			.data = NULL,
+			.length = 0,
+		},
+		.mu = {
+			.data = NULL,
+			.length = 0,
+		},
+		.sign = {
+			.data = mldsa_44_sign,
+			.length = sizeof(mldsa_44_sign),
+		},
+		.sign_deterministic = false,
+	},
+	{
+		.name = "mldsa_44_sign (deterministic)",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.hash = 0,
+		.seed = {
+			.data = (uint8_t [32]) {0},
+			.length = 32,
+		},
+		.privkey = {
+			.data = mldsa_44_privkey_noseed,
+			.length = sizeof(mldsa_44_privkey_noseed),
+		},
+		.pubkey = {
+			.data = mldsa_44_pubkey_noseed,
+			.length = sizeof(mldsa_44_pubkey_noseed),
+		},
+		.message = {
+			.data = mldsa_44_message,
+			.length = sizeof(mldsa_44_message),
+		},
+		.context = {
+			.data = NULL,
+			.length = 0,
+		},
+		.mu = {
+			.data = NULL,
+			.length = 0,
+		},
+		.sign = {
+			.data = mldsa_44_sign_dtrm,
+			.length = sizeof(mldsa_44_sign_dtrm),
+		},
+		.sign_deterministic = true,
+	},
+	{
+		.name = "mldsa_44_sign (sha3_256)",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.hash = RTE_CRYPTO_AUTH_SHA3_256,
+		.seed = {
+			.data = mldsa_44_seed,
+			.length = sizeof(mldsa_44_seed),
+		},
+		.privkey = {
+			.data = mldsa_44_privkey,
+			.length = sizeof(mldsa_44_privkey),
+		},
+		.pubkey = {
+			.data = mldsa_44_pubkey,
+			.length = sizeof(mldsa_44_pubkey),
+		},
+		.message = {
+			.data = mldsa_44_message,
+			.length = sizeof(mldsa_44_message),
+		},
+		.context = {
+			.data = NULL,
+			.length = 0,
+		},
+		.mu = {
+			.data = NULL,
+			.length = 0,
+		},
+		.sign = {
+			.data = mldsa_44_sign,
+			.length = sizeof(mldsa_44_sign),
+		},
+		.sign_deterministic = false,
+	},
+	{
+		.name = "mldsa_44_sign (ext mu)",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.hash = 0,
+		.seed = {
+			.data = (uint8_t [32]) {0},
+			.length = 32,
+		},
+		.privkey = {
+			.data = mldsa_44_privkey_noseed,
+			.length = sizeof(mldsa_44_privkey_noseed),
+		},
+		.pubkey = {
+			.data = mldsa_44_pubkey_noseed,
+			.length = sizeof(mldsa_44_pubkey_noseed),
+		},
+		.mu = {
+			.data = mldsa_44_extmu,
+			.length = sizeof(mldsa_44_extmu),
+		},
+		.sign = {
+			.data = mldsa_44_sign_dtrm,
+			.length = sizeof(mldsa_44_sign_dtrm),
+		},
+		.sign_deterministic = false,
+	},
+};
+
+struct crypto_testsuite_mldsa_params mldsa_verify_test_vectors[] = {
+	{
+		.name = "mldsa_44_verify",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.pubkey = {
+			.data = mldsa_44_pubkey,
+			.length = sizeof(mldsa_44_pubkey),
+		},
+		.message = {
+			.data = mldsa_44_message,
+			.length = sizeof(mldsa_44_message),
+		},
+		.context = {
+			.data = NULL,
+			.length = 0,
+		},
+		.mu = {
+			.data = NULL,
+			.length = 0,
+		},
+		.sign = {
+			.data = mldsa_44_sign,
+			.length = sizeof(mldsa_44_sign),
+		},
+	},
+	{
+		.name = "mldsa_44_verify (deterministic)",
+		.param = RTE_CRYPTO_ML_DSA_PARAM_44,
+		.pubkey = {
+			.data = mldsa_44_pubkey_noseed,
+			.length = sizeof(mldsa_44_pubkey_noseed),
+		},
+		.message = {
+			.data = mldsa_44_message,
+			.length = sizeof(mldsa_44_message),
+		},
+		.context = {
+			.data = NULL,
+			.length = 0,
+		},
+		.mu = {
+			.data = NULL,
+			.length = 0,
+		},
+		.sign = {
+			.data = mldsa_44_sign_dtrm,
+			.length = sizeof(mldsa_44_sign_dtrm),
+		},
+	}
+};
+#endif /* __TEST_CRYPTODEV_ML_DSA_TEST_VECTORS_H__ */
diff --git a/app/test/test_cryptodev_ml_kem_test_vectors.h b/app/test/test_cryptodev_ml_kem_test_vectors.h
new file mode 100644
index 0000000000..7de98ec089
--- /dev/null
+++ b/app/test/test_cryptodev_ml_kem_test_vectors.h
@@ -0,0 +1,873 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2025 Marvell.
+ */
+
+#ifndef __TEST_CRYPTODEV_ML_KEM_TEST_VECTORS_H__
+#define __TEST_CRYPTODEV_ML_KEM_TEST_VECTORS_H__
+
+#include "rte_crypto_asym.h"
+
+struct crypto_testsuite_mlkem_params {
+	const char *name;
+	enum rte_crypto_ml_kem_param_set param;
+	rte_crypto_param d;
+	rte_crypto_param z;
+	rte_crypto_param dk;
+	rte_crypto_param ek;
+	rte_crypto_param sk;
+	rte_crypto_param message;
+	rte_crypto_param cipher;
+};
+
+/* Seed */
+uint8_t mlkem_512_d[] = {
+	0x4d, 0x3f, 0xb3, 0x37, 0xd3, 0xec, 0x8f, 0x29,
+	0xf9, 0x7b, 0x0e, 0xd6, 0x5b, 0x85, 0x78, 0xc5,
+	0x31, 0x37, 0x21, 0x9a, 0x14, 0x64, 0xc6, 0x1c,
+	0xc7, 0xd7, 0x45, 0x57, 0x06, 0x5b, 0x45, 0x96,
+};
+
+uint8_t mlkem_512_z[] = {
+	0xdf, 0x29, 0x92, 0x4a, 0x81, 0x76, 0x4f, 0x4d,
+	0x5a, 0x64, 0x79, 0xf2, 0x8b, 0xc8, 0x3b, 0xc9,
+	0xf3, 0x35, 0xc7, 0x18, 0xcb, 0xb1, 0xa8, 0xd2,
+	0x24, 0xdb, 0x4d, 0x6a, 0x6a, 0xf1, 0xeb, 0xd2,
+};
+
+/* Private key */
+uint8_t mlkem_512_dk[] = {
+	0xd8, 0xc8, 0x4d, 0x74, 0x57, 0x6d, 0x43, 0x65,
+	0x84, 0xe0, 0x82, 0x87, 0x2d, 0xd0, 0x0b, 0x39,
+	0x08, 0x41, 0xc8, 0x85, 0x15, 0x26, 0xfb, 0x85,
+	0x68, 0xe1, 0x30, 0x98, 0xf0, 0xb1, 0x3d, 0xea,
+	0xa5, 0x4c, 0xc4, 0x59, 0x81, 0xfb, 0x33, 0xed,
+	0x20, 0x3a, 0x7f, 0x10, 0x82, 0x3d, 0x85, 0x18,
+	0x69, 0x56, 0x6b, 0x5b, 0x7c, 0x92, 0x0f, 0x57,
+	0x37, 0xf2, 0x93, 0x38, 0x24, 0xd3, 0x1e, 0xe1,
+	0x84, 0x16, 0x39, 0x9a, 0x0d, 0xbd, 0xba, 0x22,
+	0xaa, 0xc8, 0xa1, 0xd9, 0xd8, 0x2a, 0xc7, 0xc1,
+	0x78, 0x21, 0x01, 0x85, 0x38, 0x54, 0x39, 0x34,
+	0x25, 0x8c, 0xce, 0xda, 0xa3, 0x0c, 0x66, 0x99,
+	0x39, 0xf7, 0x63, 0xb6, 0x86, 0x80, 0xe0, 0xe4,
+	0x64, 0x2a, 0xfc, 0xc2, 0xe0, 0x71, 0x6c, 0x59,
+	0x7c, 0x9a, 0x03, 0xac, 0x6f, 0x16, 0x08, 0x64,
+	0x3d, 0x4b, 0xa5, 0x83, 0xc5, 0x34, 0x27, 0x2a,
+	0x20, 0x18, 0xb8, 0x2d, 0x28, 0x61, 0x2a, 0x94,
+	0x55, 0xc7, 0xc3, 0x93, 0x91, 0x71, 0x43, 0x7f,
+	0x74, 0xb2, 0x6b, 0x55, 0xb1, 0x9d, 0xc8, 0x08,
+	0x53, 0xda, 0xb6, 0x19, 0x46, 0x5c, 0x20, 0xea,
+	0x31, 0x31, 0xfc, 0x41, 0x02, 0xe6, 0x3c, 0x3e,
+	0xd8, 0x68, 0x6f, 0xa6, 0x66, 0x1e, 0xc7, 0xc6,
+	0x0a, 0xf8, 0x02, 0x1e, 0x1e, 0xfa, 0x9a, 0x30,
+	0x18, 0x64, 0xdc, 0x30, 0x20, 0x9a, 0xb6, 0x6e,
+	0x85, 0xe8, 0xb0, 0xb3, 0xe1, 0x24, 0x4e, 0xf0,
+	0x4a, 0x9c, 0xb3, 0x0e, 0xe0, 0xd2, 0x6a, 0x6e,
+	0xc7, 0xc3, 0x15, 0x35, 0x49, 0x77, 0x07, 0x7e,
+	0x33, 0x7c, 0x97, 0x6e, 0xeb, 0xb3, 0x7c, 0x86,
+	0xb2, 0xa0, 0xe3, 0x8a, 0x13, 0x81, 0x99, 0xc6,
+	0x75, 0x41, 0xa6, 0x2a, 0x6f, 0x16, 0xe2, 0x4e,
+	0x52, 0x14, 0x0d, 0xcb, 0x74, 0x8d, 0xb4, 0x89,
+	0xcf, 0xa8, 0x4c, 0x57, 0xaa, 0x18, 0x7d, 0xd7,
+	0x19, 0x5c, 0x11, 0x04, 0xc6, 0xe2, 0x2c, 0x09,
+	0x4d, 0x78, 0x7e, 0x9e, 0x1a, 0xa2, 0xab, 0x60,
+	0x59, 0xe4, 0x30, 0xa5, 0x6d, 0x11, 0x63, 0xf9,
+	0xb1, 0xa0, 0x98, 0xe2, 0x81, 0x34, 0xa6, 0x57,
+	0xf7, 0x18, 0x3e, 0x4c, 0x36, 0x02, 0x4d, 0xda,
+	0x6e, 0xac, 0x39, 0x6c, 0x29, 0x0b, 0x8c, 0xd7,
+	0x32, 0x8e, 0x45, 0x67, 0x36, 0x41, 0x6c, 0xab,
+	0xbb, 0x04, 0x2e, 0xae, 0xd3, 0x9f, 0xee, 0xfa,
+	0x5f, 0x4a, 0x04, 0x85, 0xf7, 0xfb, 0x97, 0x95,
+	0x78, 0xc4, 0x08, 0x39, 0xb8, 0xc5, 0x17, 0x9d,
+	0x2e, 0x6c, 0x14, 0xcd, 0xf2, 0xc1, 0xc5, 0x05,
+	0x9d, 0x34, 0x12, 0xcd, 0x86, 0xbc, 0x9e, 0x1c,
+	0xf9, 0x1c, 0x05, 0xc2, 0xc3, 0x29, 0xf2, 0x9d,
+	0xf4, 0xa9, 0xcc, 0x0d, 0x38, 0xce, 0x6f, 0xb4,
+	0x06, 0x68, 0xc0, 0xcd, 0xb2, 0xb6, 0x5d, 0xdf,
+	0x89, 0x58, 0x99, 0x70, 0xbe, 0x37, 0xa8, 0xb2,
+	0xc3, 0x6c, 0x2c, 0x13, 0x8c, 0xa7, 0x8a, 0x38,
+	0x36, 0x36, 0xe0, 0x77, 0x79, 0xf6, 0x30, 0xc5,
+	0x9c, 0x8e, 0x10, 0xc0, 0x1b, 0xb4, 0xe0, 0x74,
+	0x36, 0x6c, 0x9f, 0x80, 0x73, 0x3e, 0x57, 0x69,
+	0x5a, 0x79, 0x6a, 0x44, 0xb8, 0xe8, 0x25, 0xbe,
+	0x96, 0xae, 0xd7, 0x87, 0x30, 0x7e, 0x76, 0x8e,
+	0x1c, 0x09, 0x99, 0xd9, 0x4c, 0xb3, 0xf7, 0x45,
+	0x92, 0xfa, 0x77, 0x9e, 0x18, 0x72, 0x1a, 0x23,
+	0x9c, 0x4e, 0x5e, 0xd9, 0x22, 0x2e, 0xb0, 0x16,
+	0x9d, 0x03, 0x6a, 0x0e, 0x49, 0x94, 0x97, 0xa3,
+	0x19, 0x94, 0xa1, 0x7e, 0x9d, 0x7b, 0x87, 0xc1,
+	0x6a, 0x12, 0x42, 0xc9, 0x22, 0xbe, 0xeb, 0x38,
+	0xbe, 0xfa, 0x0b, 0xac, 0x25, 0xb9, 0x78, 0xec,
+	0x33, 0xdf, 0x86, 0xcb, 0xce, 0xe1, 0xa6, 0x69,
+	0x28, 0x39, 0xd5, 0x68, 0x73, 0xcb, 0x8a, 0xcc,
+	0x3d, 0xfa, 0x0e, 0x79, 0x71, 0x3e, 0x44, 0x19,
+	0x9a, 0xac, 0xf4, 0x43, 0xa9, 0xba, 0x10, 0x7e,
+	0x49, 0xc8, 0x8f, 0xf9, 0xac, 0xd2, 0x07, 0xb1,
+	0x4b, 0x2b, 0x15, 0x65, 0x05, 0x12, 0xc3, 0xcc,
+	0x36, 0x69, 0x17, 0x78, 0xa3, 0x00, 0x6d, 0xb7,
+	0xe9, 0x03, 0x78, 0xb3, 0x33, 0xe5, 0xcc, 0x22,
+	0xc3, 0x91, 0x8f, 0x47, 0x79, 0xaf, 0x2e, 0x19,
+	0x91, 0x05, 0xab, 0x5e, 0x3e, 0x43, 0xa4, 0x34,
+	0x0b, 0x8c, 0x89, 0x75, 0xc0, 0x08, 0x44, 0x07,
+	0xdd, 0x17, 0x83, 0xc6, 0x48, 0x09, 0x12, 0xe6,
+	0x25, 0xde, 0x99, 0x00, 0x51, 0xc1, 0x65, 0x8a,
+	0x85, 0x02, 0xa8, 0xd5, 0x72, 0x41, 0x67, 0x66,
+	0x08, 0xe9, 0x10, 0xa3, 0xa2, 0x07, 0xc8, 0x06,
+	0xc6, 0x0c, 0xc6, 0x47, 0xf7, 0x35, 0x20, 0x40,
+	0x69, 0x04, 0x3c, 0xba, 0x4b, 0xd3, 0x78, 0xa2,
+	0xa4, 0x71, 0xc7, 0x83, 0x2b, 0x69, 0xf9, 0xa2,
+	0x8b, 0xf5, 0xa6, 0x87, 0x46, 0xb3, 0x9b, 0x7a,
+	0x35, 0x97, 0x0b, 0xf4, 0x68, 0x15, 0x4a, 0x87,
+	0xeb, 0x0b, 0x2b, 0xa3, 0xba, 0xcd, 0xb3, 0x28,
+	0x80, 0x38, 0x19, 0x17, 0x1f, 0x44, 0x6f, 0x7f,
+	0x50, 0x75, 0x93, 0x00, 0x4c, 0x36, 0x07, 0x07,
+	0x11, 0xec, 0x91, 0xc4, 0x99, 0x5d, 0xf8, 0xe1,
+	0x53, 0x84, 0x01, 0xca, 0x6a, 0x64, 0x8c, 0xef,
+	0x17, 0xce, 0x81, 0xf5, 0xce, 0xaa, 0x80, 0xc1,
+	0x85, 0xc6, 0x6b, 0xe2, 0xc9, 0x43, 0xc9, 0xf5,
+	0xc3, 0x3a, 0xdb, 0xcf, 0xb9, 0x29, 0x64, 0x8d,
+	0xe7, 0x98, 0x0f, 0x8b, 0xb0, 0xd2, 0x84, 0x25,
+	0x37, 0xd1, 0x80, 0x38, 0x81, 0xb9, 0xe8, 0xb4,
+	0xa7, 0xc8, 0x3a, 0x27, 0x77, 0x9b, 0x81, 0xbb,
+	0x61, 0xae, 0x59, 0x06, 0x57, 0x40, 0x69, 0x11,
+	0xb2, 0x41, 0x68, 0x2d, 0x26, 0x62, 0x93, 0x40,
+	0x4d, 0x97, 0x1c, 0xb4, 0x63, 0x65, 0x04, 0xf8,
+	0x8c, 0x2a, 0x01, 0xb9, 0x6d, 0x3d, 0x87, 0x30,
+	0x28, 0x70, 0x80, 0x1d, 0xb2, 0x24, 0xb0, 0x5c,
+	0x90, 0x95, 0xa3, 0x6c, 0xdc, 0xa6, 0x66, 0x15,
+	0x33, 0x37, 0x8c, 0xa8, 0x9f, 0x24, 0xa3, 0x52,
+	0x21, 0x06, 0xb6, 0xaf, 0x51, 0xc0, 0x1d, 0x42,
+	0xa6, 0x55, 0x93, 0x6b, 0x4a, 0x32, 0x4e, 0xec,
+	0x46, 0xbe, 0xfa, 0x4a, 0x13, 0x5a, 0xca, 0x11,
+	0x39, 0xa1, 0x81, 0x8b, 0xc4, 0x07, 0x1b, 0x43,
+	0x1e, 0xa0, 0x5b, 0x34, 0x2d, 0x10, 0x6c, 0xdd,
+	0x3b, 0x18, 0x78, 0xe1, 0x0d, 0x5b, 0x61, 0x3d,
+	0xfd, 0x51, 0x6a, 0x78, 0x88, 0x2f, 0xa7, 0x84,
+	0xa3, 0x4f, 0x30, 0x3e, 0xb0, 0xdc, 0x96, 0xa8,
+	0xd7, 0xbb, 0x4c, 0xa6, 0x95, 0xb9, 0x27, 0x3f,
+	0x70, 0x46, 0xa3, 0xd8, 0x36, 0x22, 0x3b, 0x4b,
+	0x91, 0xa4, 0xe6, 0x31, 0x0d, 0xbb, 0x27, 0x2f,
+	0x15, 0x2c, 0xa7, 0x44, 0x19, 0xa9, 0xc1, 0xc8,
+	0xb2, 0x77, 0x1a, 0xd5, 0x14, 0x29, 0xa1, 0x76,
+	0xcc, 0x81, 0x88, 0x47, 0x3c, 0xd9, 0x9e, 0xba,
+	0x99, 0x26, 0xbb, 0xf6, 0x5e, 0xbc, 0x2a, 0x8e,
+	0xa0, 0x32, 0x32, 0x2e, 0x24, 0xa1, 0xc3, 0x07,
+	0xa5, 0xd4, 0xbb, 0x95, 0x03, 0x29, 0xb5, 0x59,
+	0x5a, 0x2b, 0x6c, 0x95, 0x15, 0xba, 0xb0, 0xaf,
+	0x27, 0xa2, 0xcb, 0xef, 0x46, 0xb6, 0xb2, 0x25,
+	0x21, 0x23, 0xf8, 0x18, 0x1c, 0xb0, 0x54, 0xad,
+	0x48, 0x38, 0xf6, 0x33, 0xa2, 0x55, 0xc8, 0x63,
+	0xce, 0x56, 0x34, 0x86, 0x6a, 0x61, 0x75, 0x75,
+	0x7f, 0x75, 0x49, 0x2a, 0x57, 0x72, 0x76, 0x3e,
+	0xa7, 0x08, 0x56, 0x28, 0x0b, 0x44, 0xa9, 0x00,
+	0xc2, 0x88, 0x28, 0x02, 0x55, 0x33, 0x55, 0x43,
+	0x97, 0x97, 0x42, 0xa4, 0xfe, 0xb1, 0x95, 0xee,
+	0x9b, 0x5d, 0xa9, 0x18, 0xc1, 0x90, 0xa5, 0x65,
+	0x20, 0x99, 0x39, 0xd2, 0xea, 0x08, 0x1c, 0xda,
+	0xa8, 0xfa, 0xa3, 0x3b, 0x56, 0xf0, 0x59, 0x17,
+	0x10, 0x0b, 0x45, 0x4a, 0x86, 0x88, 0x96, 0x49,
+	0x68, 0x98, 0x26, 0x55, 0x40, 0xb7, 0x5a, 0x29,
+	0x82, 0x93, 0xa1, 0x0e, 0x7b, 0x4b, 0xa2, 0x49,
+	0x61, 0x2b, 0xaf, 0xb4, 0x2d, 0xa1, 0xdc, 0xae,
+	0x79, 0x44, 0x66, 0x20, 0x72, 0xc5, 0x01, 0x36,
+	0x10, 0xd8, 0x81, 0x36, 0xb1, 0xea, 0xb1, 0x0d,
+	0xc2, 0x05, 0x75, 0xd8, 0xad, 0xe0, 0x73, 0xc6,
+	0x82, 0x8c, 0x7e, 0x97, 0x2b, 0x87, 0xb5, 0xc9,
+	0x1e, 0xac, 0xb0, 0x2a, 0x16, 0x20, 0x88, 0xb9,
+	0x41, 0x2f, 0xc8, 0x4b, 0xce, 0xd8, 0xc4, 0xa8,
+	0xe2, 0x68, 0x35, 0xd9, 0xd0, 0xc4, 0x7a, 0xf2,
+	0x25, 0xca, 0xb8, 0x06, 0x42, 0xcb, 0xc9, 0x8f,
+	0x0a, 0x60, 0xde, 0x19, 0xa8, 0xcb, 0x90, 0x85,
+	0x74, 0x42, 0x03, 0x89, 0xf4, 0x97, 0x8e, 0x41,
+	0xc5, 0x72, 0xe3, 0x52, 0x55, 0x81, 0x73, 0xe1,
+	0x71, 0x22, 0xa2, 0xfb, 0x8a, 0x36, 0xea, 0xb3,
+	0xc3, 0x33, 0x4f, 0x23, 0x55, 0x03, 0x1c, 0xa1,
+	0x84, 0x74, 0xe1, 0x69, 0x4d, 0xb3, 0xc2, 0x1f,
+	0xbc, 0x62, 0xeb, 0xf0, 0x50, 0x45, 0xb7, 0x83,
+	0xd3, 0x28, 0x37, 0x46, 0x35, 0x79, 0x04, 0x38,
+	0x16, 0xbd, 0x72, 0x2f, 0xbc, 0xf9, 0x7d, 0xb8,
+	0x20, 0x12, 0x87, 0xa7, 0xb0, 0x82, 0x7c, 0x3e,
+	0x4d, 0xa7, 0x18, 0x04, 0x54, 0x75, 0x19, 0x52,
+	0x61, 0x80, 0x57, 0xbe, 0x06, 0x37, 0x9c, 0xde,
+	0xb0, 0x93, 0x70, 0x54, 0x3f, 0x15, 0x83, 0xb2,
+	0xd3, 0x88, 0xa6, 0xd8, 0x56, 0x9b, 0x91, 0xf3,
+	0x00, 0x01, 0x00, 0xcd, 0xcb, 0x97, 0x16, 0x27,
+	0xc7, 0xaf, 0xb1, 0xd5, 0xba, 0x90, 0xa1, 0x24,
+	0x33, 0x26, 0x95, 0xba, 0xcb, 0x63, 0xa1, 0x56,
+	0xb0, 0x23, 0x09, 0x4e, 0xa8, 0x0a, 0x75, 0x02,
+	0xd8, 0x3b, 0xc1, 0x05, 0xa0, 0x73, 0x25, 0x26,
+	0x3e, 0xb8, 0x5b, 0xca, 0x6a, 0xae, 0x41, 0x22,
+	0xc5, 0x9d, 0x88, 0x3f, 0x37, 0x8c, 0x50, 0xcd,
+	0x09, 0x32, 0x34, 0x81, 0x98, 0xc1, 0x17, 0xa5,
+	0x62, 0x94, 0x8d, 0xcd, 0xd0, 0xc3, 0x08, 0x07,
+	0x2f, 0x8d, 0x52, 0x7b, 0xee, 0x81, 0xc5, 0x95,
+	0x2c, 0x8b, 0x46, 0x45, 0x5d, 0xf2, 0x62, 0x4d,
+	0x2e, 0x22, 0x7f, 0x0d, 0xa5, 0xc8, 0xba, 0x72,
+	0xa0, 0x8f, 0xd0, 0x21, 0x45, 0x28, 0xb9, 0xad,
+	0xac, 0x96, 0xa6, 0xc7, 0x33, 0x6d, 0xf3, 0x17,
+	0xcb, 0x7a, 0x32, 0x4e, 0x4c, 0x83, 0xa7, 0x15,
+	0x55, 0x6a, 0xca, 0xc1, 0xff, 0xd8, 0x90, 0xab,
+	0xaa, 0xa4, 0x65, 0xb0, 0x25, 0xf7, 0x47, 0x00,
+	0x2d, 0x20, 0x19, 0x23, 0xb5, 0x02, 0x39, 0x5a,
+	0x69, 0x1c, 0xc4, 0xbc, 0xa3, 0x80, 0xcc, 0x82,
+	0xd8, 0x66, 0x63, 0xc5, 0x7e, 0xa3, 0x6c, 0x2a,
+	0xb0, 0x7a, 0x02, 0xc6, 0xb3, 0xb7, 0xb0, 0x29,
+	0x3f, 0xa3, 0x99, 0xbd, 0x28, 0xf2, 0x8e, 0xd6,
+	0x7b, 0xb3, 0xd5, 0x24, 0x12, 0xb9, 0xbb, 0xa5,
+	0x68, 0xba, 0x9d, 0xe3, 0x44, 0xa3, 0xeb, 0x64,
+	0x13, 0xb8, 0x8a, 0x5e, 0x72, 0x60, 0xad, 0x95,
+	0xcb, 0x9d, 0xfb, 0x54, 0x6e, 0x0e, 0x66, 0xb5,
+	0xf4, 0x68, 0x25, 0x91, 0xc5, 0x1a, 0x4f, 0x71,
+	0x61, 0x50, 0xc8, 0xcb, 0x34, 0xc5, 0xc2, 0x84,
+	0xbc, 0x4e, 0x5f, 0x28, 0x6f, 0xbf, 0xbb, 0xc8,
+	0xb1, 0xc4, 0x4a, 0x4b, 0xb7, 0x1a, 0x00, 0xa0,
+	0x2d, 0xe9, 0x07, 0x39, 0x93, 0xe9, 0x81, 0x51,
+	0xe1, 0x34, 0x83, 0xf5, 0x82, 0x9d, 0xc7, 0x47,
+	0xf1, 0x61, 0xc8, 0x29, 0x52, 0x4d, 0x51, 0xb7,
+	0xa1, 0xeb, 0x49, 0x50, 0x6e, 0xda, 0x72, 0x5d,
+	0x69, 0x27, 0x83, 0xca, 0x4c, 0x3b, 0xd4, 0xcc,
+	0x7f, 0x26, 0x44, 0x2b, 0x76, 0x41, 0xe1, 0x50,
+	0xce, 0x0f, 0x40, 0x0d, 0x8f, 0x00, 0x6e, 0x27,
+	0x95, 0x6e, 0x92, 0x1b, 0xaf, 0xe4, 0x9b, 0x5e,
+	0x96, 0xec, 0xc7, 0xbf, 0x64, 0x77, 0x75, 0x6d,
+	0xda, 0xa8, 0x9c, 0x48, 0xf3, 0x79, 0x80, 0x4e,
+	0xed, 0x6f, 0xe0, 0x20, 0x1a, 0x2b, 0x7c, 0xa1,
+	0xac, 0x74, 0x42, 0x49, 0xd7, 0xe7, 0x7f, 0x57,
+	0x5a, 0xdb, 0x69, 0xb5, 0xe2, 0x7e, 0x81, 0x8d,
+	0xa9, 0x22, 0x5c, 0xda, 0xf3, 0xad, 0xbc, 0x3e,
+	0x0b, 0xd4, 0x9d, 0x63, 0xef, 0x40, 0x34, 0x66,
+	0x80, 0x8c, 0x2d, 0x31, 0x13, 0xdb, 0x31, 0x03,
+	0xdf, 0x29, 0x92, 0x4a, 0x81, 0x76, 0x4f, 0x4d,
+	0x5a, 0x64, 0x79, 0xf2, 0x8b, 0xc8, 0x3b, 0xc9,
+	0xf3, 0x35, 0xc7, 0x18, 0xcb, 0xb1, 0xa8, 0xd2,
+	0x24, 0xdb, 0x4d, 0x6a, 0x6a, 0xf1, 0xeb, 0xd2,
+};
+
+/* Public key */
+uint8_t mlkem_512_ek[] = {
+	0x28, 0x70, 0x80, 0x1d, 0xb2, 0x24, 0xb0, 0x5c,
+	0x90, 0x95, 0xa3, 0x6c, 0xdc, 0xa6, 0x66, 0x15,
+	0x33, 0x37, 0x8c, 0xa8, 0x9f, 0x24, 0xa3, 0x52,
+	0x21, 0x06, 0xb6, 0xaf, 0x51, 0xc0, 0x1d, 0x42,
+	0xa6, 0x55, 0x93, 0x6b, 0x4a, 0x32, 0x4e, 0xec,
+	0x46, 0xbe, 0xfa, 0x4a, 0x13, 0x5a, 0xca, 0x11,
+	0x39, 0xa1, 0x81, 0x8b, 0xc4, 0x07, 0x1b, 0x43,
+	0x1e, 0xa0, 0x5b, 0x34, 0x2d, 0x10, 0x6c, 0xdd,
+	0x3b, 0x18, 0x78, 0xe1, 0x0d, 0x5b, 0x61, 0x3d,
+	0xfd, 0x51, 0x6a, 0x78, 0x88, 0x2f, 0xa7, 0x84,
+	0xa3, 0x4f, 0x30, 0x3e, 0xb0, 0xdc, 0x96, 0xa8,
+	0xd7, 0xbb, 0x4c, 0xa6, 0x95, 0xb9, 0x27, 0x3f,
+	0x70, 0x46, 0xa3, 0xd8, 0x36, 0x22, 0x3b, 0x4b,
+	0x91, 0xa4, 0xe6, 0x31, 0x0d, 0xbb, 0x27, 0x2f,
+	0x15, 0x2c, 0xa7, 0x44, 0x19, 0xa9, 0xc1, 0xc8,
+	0xb2, 0x77, 0x1a, 0xd5, 0x14, 0x29, 0xa1, 0x76,
+	0xcc, 0x81, 0x88, 0x47, 0x3c, 0xd9, 0x9e, 0xba,
+	0x99, 0x26, 0xbb, 0xf6, 0x5e, 0xbc, 0x2a, 0x8e,
+	0xa0, 0x32, 0x32, 0x2e, 0x24, 0xa1, 0xc3, 0x07,
+	0xa5, 0xd4, 0xbb, 0x95, 0x03, 0x29, 0xb5, 0x59,
+	0x5a, 0x2b, 0x6c, 0x95, 0x15, 0xba, 0xb0, 0xaf,
+	0x27, 0xa2, 0xcb, 0xef, 0x46, 0xb6, 0xb2, 0x25,
+	0x21, 0x23, 0xf8, 0x18, 0x1c, 0xb0, 0x54, 0xad,
+	0x48, 0x38, 0xf6, 0x33, 0xa2, 0x55, 0xc8, 0x63,
+	0xce, 0x56, 0x34, 0x86, 0x6a, 0x61, 0x75, 0x75,
+	0x7f, 0x75, 0x49, 0x2a, 0x57, 0x72, 0x76, 0x3e,
+	0xa7, 0x08, 0x56, 0x28, 0x0b, 0x44, 0xa9, 0x00,
+	0xc2, 0x88, 0x28, 0x02, 0x55, 0x33, 0x55, 0x43,
+	0x97, 0x97, 0x42, 0xa4, 0xfe, 0xb1, 0x95, 0xee,
+	0x9b, 0x5d, 0xa9, 0x18, 0xc1, 0x90, 0xa5, 0x65,
+	0x20, 0x99, 0x39, 0xd2, 0xea, 0x08, 0x1c, 0xda,
+	0xa8, 0xfa, 0xa3, 0x3b, 0x56, 0xf0, 0x59, 0x17,
+	0x10, 0x0b, 0x45, 0x4a, 0x86, 0x88, 0x96, 0x49,
+	0x68, 0x98, 0x26, 0x55, 0x40, 0xb7, 0x5a, 0x29,
+	0x82, 0x93, 0xa1, 0x0e, 0x7b, 0x4b, 0xa2, 0x49,
+	0x61, 0x2b, 0xaf, 0xb4, 0x2d, 0xa1, 0xdc, 0xae,
+	0x79, 0x44, 0x66, 0x20, 0x72, 0xc5, 0x01, 0x36,
+	0x10, 0xd8, 0x81, 0x36, 0xb1, 0xea, 0xb1, 0x0d,
+	0xc2, 0x05, 0x75, 0xd8, 0xad, 0xe0, 0x73, 0xc6,
+	0x82, 0x8c, 0x7e, 0x97, 0x2b, 0x87, 0xb5, 0xc9,
+	0x1e, 0xac, 0xb0, 0x2a, 0x16, 0x20, 0x88, 0xb9,
+	0x41, 0x2f, 0xc8, 0x4b, 0xce, 0xd8, 0xc4, 0xa8,
+	0xe2, 0x68, 0x35, 0xd9, 0xd0, 0xc4, 0x7a, 0xf2,
+	0x25, 0xca, 0xb8, 0x06, 0x42, 0xcb, 0xc9, 0x8f,
+	0x0a, 0x60, 0xde, 0x19, 0xa8, 0xcb, 0x90, 0x85,
+	0x74, 0x42, 0x03, 0x89, 0xf4, 0x97, 0x8e, 0x41,
+	0xc5, 0x72, 0xe3, 0x52, 0x55, 0x81, 0x73, 0xe1,
+	0x71, 0x22, 0xa2, 0xfb, 0x8a, 0x36, 0xea, 0xb3,
+	0xc3, 0x33, 0x4f, 0x23, 0x55, 0x03, 0x1c, 0xa1,
+	0x84, 0x74, 0xe1, 0x69, 0x4d, 0xb3, 0xc2, 0x1f,
+	0xbc, 0x62, 0xeb, 0xf0, 0x50, 0x45, 0xb7, 0x83,
+	0xd3, 0x28, 0x37, 0x46, 0x35, 0x79, 0x04, 0x38,
+	0x16, 0xbd, 0x72, 0x2f, 0xbc, 0xf9, 0x7d, 0xb8,
+	0x20, 0x12, 0x87, 0xa7, 0xb0, 0x82, 0x7c, 0x3e,
+	0x4d, 0xa7, 0x18, 0x04, 0x54, 0x75, 0x19, 0x52,
+	0x61, 0x80, 0x57, 0xbe, 0x06, 0x37, 0x9c, 0xde,
+	0xb0, 0x93, 0x70, 0x54, 0x3f, 0x15, 0x83, 0xb2,
+	0xd3, 0x88, 0xa6, 0xd8, 0x56, 0x9b, 0x91, 0xf3,
+	0x00, 0x01, 0x00, 0xcd, 0xcb, 0x97, 0x16, 0x27,
+	0xc7, 0xaf, 0xb1, 0xd5, 0xba, 0x90, 0xa1, 0x24,
+	0x33, 0x26, 0x95, 0xba, 0xcb, 0x63, 0xa1, 0x56,
+	0xb0, 0x23, 0x09, 0x4e, 0xa8, 0x0a, 0x75, 0x02,
+	0xd8, 0x3b, 0xc1, 0x05, 0xa0, 0x73, 0x25, 0x26,
+	0x3e, 0xb8, 0x5b, 0xca, 0x6a, 0xae, 0x41, 0x22,
+	0xc5, 0x9d, 0x88, 0x3f, 0x37, 0x8c, 0x50, 0xcd,
+	0x09, 0x32, 0x34, 0x81, 0x98, 0xc1, 0x17, 0xa5,
+	0x62, 0x94, 0x8d, 0xcd, 0xd0, 0xc3, 0x08, 0x07,
+	0x2f, 0x8d, 0x52, 0x7b, 0xee, 0x81, 0xc5, 0x95,
+	0x2c, 0x8b, 0x46, 0x45, 0x5d, 0xf2, 0x62, 0x4d,
+	0x2e, 0x22, 0x7f, 0x0d, 0xa5, 0xc8, 0xba, 0x72,
+	0xa0, 0x8f, 0xd0, 0x21, 0x45, 0x28, 0xb9, 0xad,
+	0xac, 0x96, 0xa6, 0xc7, 0x33, 0x6d, 0xf3, 0x17,
+	0xcb, 0x7a, 0x32, 0x4e, 0x4c, 0x83, 0xa7, 0x15,
+	0x55, 0x6a, 0xca, 0xc1, 0xff, 0xd8, 0x90, 0xab,
+	0xaa, 0xa4, 0x65, 0xb0, 0x25, 0xf7, 0x47, 0x00,
+	0x2d, 0x20, 0x19, 0x23, 0xb5, 0x02, 0x39, 0x5a,
+	0x69, 0x1c, 0xc4, 0xbc, 0xa3, 0x80, 0xcc, 0x82,
+	0xd8, 0x66, 0x63, 0xc5, 0x7e, 0xa3, 0x6c, 0x2a,
+	0xb0, 0x7a, 0x02, 0xc6, 0xb3, 0xb7, 0xb0, 0x29,
+	0x3f, 0xa3, 0x99, 0xbd, 0x28, 0xf2, 0x8e, 0xd6,
+	0x7b, 0xb3, 0xd5, 0x24, 0x12, 0xb9, 0xbb, 0xa5,
+	0x68, 0xba, 0x9d, 0xe3, 0x44, 0xa3, 0xeb, 0x64,
+	0x13, 0xb8, 0x8a, 0x5e, 0x72, 0x60, 0xad, 0x95,
+	0xcb, 0x9d, 0xfb, 0x54, 0x6e, 0x0e, 0x66, 0xb5,
+	0xf4, 0x68, 0x25, 0x91, 0xc5, 0x1a, 0x4f, 0x71,
+	0x61, 0x50, 0xc8, 0xcb, 0x34, 0xc5, 0xc2, 0x84,
+	0xbc, 0x4e, 0x5f, 0x28, 0x6f, 0xbf, 0xbb, 0xc8,
+	0xb1, 0xc4, 0x4a, 0x4b, 0xb7, 0x1a, 0x00, 0xa0,
+	0x2d, 0xe9, 0x07, 0x39, 0x93, 0xe9, 0x81, 0x51,
+	0xe1, 0x34, 0x83, 0xf5, 0x82, 0x9d, 0xc7, 0x47,
+	0xf1, 0x61, 0xc8, 0x29, 0x52, 0x4d, 0x51, 0xb7,
+	0xa1, 0xeb, 0x49, 0x50, 0x6e, 0xda, 0x72, 0x5d,
+	0x69, 0x27, 0x83, 0xca, 0x4c, 0x3b, 0xd4, 0xcc,
+	0x7f, 0x26, 0x44, 0x2b, 0x76, 0x41, 0xe1, 0x50,
+	0xce, 0x0f, 0x40, 0x0d, 0x8f, 0x00, 0x6e, 0x27,
+	0x95, 0x6e, 0x92, 0x1b, 0xaf, 0xe4, 0x9b, 0x5e,
+	0x96, 0xec, 0xc7, 0xbf, 0x64, 0x77, 0x75, 0x6d,
+	0xda, 0xa8, 0x9c, 0x48, 0xf3, 0x79, 0x80, 0x4e,
+	0xed, 0x6f, 0xe0, 0x20, 0x1a, 0x2b, 0x7c, 0xa1,
+	0xac, 0x74, 0x42, 0x49, 0xd7, 0xe7, 0x7f, 0x57,
+};
+
+/* Plain text */
+uint8_t mlkem_512_message[] = {
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20,
+	0x66, 0x72, 0x6f, 0x6d, 0x20, 0x4d, 0x4c, 0x2d,
+	0x4b, 0x45, 0x4d, 0x20, 0x74, 0x65, 0x73, 0x74,
+	0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73,
+	0x2e
+};
+
+/* Cipher text */
+uint8_t mlkem_512_cipher[] = {
+	0x92, 0x98, 0x11, 0x65, 0x10, 0x78, 0xE3, 0xA4,
+	0x34, 0x94, 0xD1, 0x22, 0x56, 0xD6, 0xB1, 0xF6,
+	0xF7, 0x51, 0x2A, 0xCA, 0x8E, 0x04, 0x1D, 0x89,
+	0xBB, 0xA7, 0x84, 0xEF, 0xAA, 0x70, 0x11, 0x75,
+	0xFC, 0x48, 0xA1, 0x7E, 0x4C, 0x99, 0xBD, 0xB8,
+	0x05, 0x01, 0xA6, 0xF0, 0x0E, 0x18, 0x0D, 0x75,
+	0xF0, 0xBB, 0xBD, 0x6F, 0x28, 0xF4, 0xDC, 0x3A,
+	0x58, 0x3D, 0x83, 0x1D, 0x78, 0xF9, 0x0E, 0x06,
+	0x5C, 0x0B, 0x77, 0x4C, 0x28, 0x82, 0xE1, 0xA4,
+	0x77, 0xAD, 0x14, 0x71, 0x3D, 0x5D, 0x53, 0x41,
+	0xCE, 0x4F, 0x36, 0x32, 0x24, 0xD7, 0x09, 0xF0,
+	0xB8, 0xF2, 0x95, 0x68, 0x84, 0x5C, 0x62, 0xC3,
+	0x77, 0x9A, 0x74, 0xD3, 0x29, 0xC1, 0x88, 0x8B,
+	0xBF, 0x05, 0x73, 0x43, 0x30, 0x20, 0xB4, 0xB0,
+	0xB3, 0xE1, 0xB5, 0x91, 0xA8, 0xBD, 0x4B, 0x7F,
+	0x2E, 0x53, 0x20, 0x55, 0xDE, 0x4D, 0xDB, 0x91,
+	0x73, 0xF9, 0x2F, 0x21, 0xF6, 0xAE, 0x6D, 0xEE,
+	0x67, 0x37, 0x82, 0x11, 0xE3, 0x0A, 0x5A, 0xB8,
+	0x68, 0xC7, 0x22, 0x34, 0x2A, 0xD4, 0x37, 0xAF,
+	0x50, 0xE0, 0xDB, 0xED, 0x89, 0x6D, 0x97, 0x0C,
+	0xF6, 0x0D, 0x6D, 0x9B, 0x1D, 0x5B, 0xE1, 0xF6,
+	0x45, 0x48, 0xF0, 0x75, 0x38, 0xE0, 0x2E, 0x11,
+	0x88, 0xEC, 0x8B, 0x51, 0x47, 0x21, 0xF6, 0x6F,
+	0x13, 0x3E, 0xA4, 0x46, 0xFE, 0xB0, 0x15, 0x81,
+	0x68, 0x9C, 0x0F, 0x15, 0xCB, 0x64, 0x6D, 0x0B,
+	0x04, 0x63, 0xBA, 0x67, 0x6C, 0x86, 0xE8, 0xAC,
+	0xB3, 0xE5, 0x47, 0x88, 0x27, 0x4A, 0xBC, 0x58,
+	0x13, 0x4D, 0x6F, 0xA6, 0x2C, 0xEC, 0x83, 0xB0,
+	0x6E, 0x93, 0x7C, 0xC7, 0x6E, 0xBB, 0xBF, 0xE1,
+	0x9F, 0xD6, 0x6E, 0xD8, 0x7A, 0xC5, 0xA2, 0x4D,
+	0xA2, 0x1C, 0xDA, 0x55, 0x1E, 0xF2, 0x1C, 0x71,
+	0x3E, 0x82, 0xD7, 0x92, 0x6F, 0x89, 0x1E, 0x53,
+	0x48, 0x00, 0x9E, 0x93, 0xCB, 0xE3, 0x79, 0xB5,
+	0x87, 0xDE, 0xF7, 0x84, 0xD6, 0x25, 0x57, 0x07,
+	0x47, 0xEE, 0xDB, 0xA8, 0xC2, 0x7E, 0xE8, 0xF9,
+	0x56, 0x22, 0x34, 0xE9, 0xD0, 0xC8, 0x3F, 0xF2,
+	0xCB, 0xE7, 0x92, 0xE1, 0x03, 0xF4, 0x38, 0x88,
+	0xE4, 0xC6, 0xB2, 0x42, 0x6F, 0x08, 0x61, 0x77,
+	0x7F, 0x8A, 0xCD, 0x9D, 0x21, 0x3E, 0xE2, 0x18,
+	0x52, 0x15, 0x02, 0x62, 0x2F, 0xCA, 0xEE, 0x44,
+	0x60, 0x15, 0x6B, 0x76, 0x7D, 0x12, 0xC7, 0x0F,
+	0xA0, 0x6C, 0xA1, 0x7B, 0xAE, 0xD6, 0x40, 0x1B,
+	0x61, 0x46, 0xB4, 0x47, 0x97, 0x6C, 0xE1, 0x4C,
+	0x47, 0x35, 0x29, 0x02, 0x6D, 0x69, 0x5E, 0x32,
+	0xF7, 0x7F, 0x9C, 0xFA, 0x87, 0xD3, 0x7D, 0x33,
+	0x85, 0x53, 0xF3, 0x8F, 0x0A, 0x41, 0x3C, 0x84,
+	0x00, 0x14, 0x04, 0x63, 0xA8, 0xC3, 0xCB, 0xEB,
+	0xAF, 0xCB, 0xE1, 0x78, 0xB2, 0x30, 0xC0, 0xA6,
+	0x9D, 0x7A, 0x28, 0x0A, 0x60, 0x5F, 0x45, 0x74,
+	0x24, 0xBE, 0xD8, 0x0D, 0xCB, 0x3A, 0x1B, 0xD1,
+	0x9C, 0x2A, 0x4E, 0x9A, 0xD1, 0x27, 0xCB, 0xAB,
+	0x08, 0x72, 0x89, 0xD9, 0xBA, 0x15, 0x01, 0x92,
+	0x4F, 0xFA, 0x7A, 0xCA, 0x32, 0xD3, 0x7E, 0xB1,
+	0xEB, 0xE7, 0xDF, 0x21, 0x33, 0x4F, 0xBD, 0x5F,
+	0xCF, 0x64, 0x5D, 0x36, 0x21, 0x63, 0x34, 0x68,
+	0x90, 0x81, 0x15, 0xC7, 0xF7, 0x28, 0x46, 0x42,
+	0xC9, 0x78, 0xC0, 0xA3, 0x5F, 0xF8, 0x86, 0x01,
+	0xF4, 0x1C, 0x6A, 0x65, 0xA2, 0x0E, 0x01, 0x5B,
+	0x29, 0xF4, 0xF8, 0x9E, 0xA5, 0x5C, 0xC0, 0x4B,
+	0x74, 0x2C, 0x88, 0xA3, 0x6B, 0xC2, 0xC4, 0xDA,
+	0xEF, 0xF2, 0x02, 0xCD, 0x89, 0x0C, 0x42, 0xDA,
+	0xE6, 0xBB, 0x67, 0x51, 0x29, 0x4A, 0x32, 0x99,
+	0xAC, 0xCC, 0xDC, 0xB6, 0x35, 0x8B, 0xCC, 0xE8,
+	0x04, 0x78, 0x69, 0xA8, 0x19, 0x0E, 0xDC, 0x1E,
+	0x6C, 0xFF, 0x46, 0xDF, 0x4E, 0x7A, 0x51, 0xC5,
+	0x9F, 0x39, 0x6F, 0xC7, 0x96, 0xFE, 0x54, 0xF4,
+	0xE2, 0xD8, 0xEB, 0x5C, 0xA1, 0x28, 0x84, 0xB4,
+	0xEA, 0x34, 0xA8, 0x18, 0x86, 0x93, 0x8B, 0xE9,
+	0xA7, 0xAB, 0x5E, 0xD9, 0x1E, 0x3E, 0x89, 0x8F,
+	0x83, 0xB4, 0xEF, 0x8E, 0x21, 0x30, 0xB4, 0xAD,
+	0x07, 0xFE, 0x8A, 0x3B, 0x34, 0xAE, 0xDE, 0x5C,
+	0xCA, 0xBA, 0x9E, 0xFB, 0x1B, 0x81, 0xEC, 0xD3,
+	0x0E, 0x40, 0xED, 0x65, 0x77, 0xF3, 0xC0, 0x56,
+	0xDC, 0xD8, 0x46, 0xDB, 0x4F, 0x51, 0x4B, 0x24,
+	0x42, 0x3B, 0xC7, 0xE2, 0x32, 0xBA, 0xA7, 0xC0,
+	0xA4, 0xFA, 0x14, 0xC4, 0xB7, 0x1B, 0x84, 0x0D,
+	0xC9, 0xD1, 0x8E, 0x1C, 0x50, 0xF1, 0xBB, 0xA6,
+	0x14, 0xD4, 0x88, 0xD8, 0x6C, 0xCE, 0x44, 0x76,
+	0x3A, 0x29, 0xF8, 0x69, 0xBD, 0x5B, 0x53, 0x4B,
+	0x65, 0xB8, 0x76, 0x5F, 0xD2, 0x01, 0xE9, 0x55,
+	0x83, 0x47, 0x2C, 0xD3, 0x9B, 0xCA, 0x85, 0x75,
+	0x60, 0x14, 0x1B, 0x5D, 0x48, 0x97, 0x67, 0x18,
+	0x9F, 0x8E, 0x8C, 0x86, 0x31, 0xCF, 0x07, 0x7D,
+	0x9E, 0xEB, 0xDE, 0x06, 0x14, 0xFE, 0x00, 0x3F,
+	0x9C, 0x09, 0xDF, 0x2B, 0x99, 0x08, 0x7A, 0x4C,
+	0xD9, 0xC8, 0x3B, 0x54, 0xF0, 0x34, 0x07, 0x19,
+	0xC5, 0x4A, 0x34, 0xBF, 0xB8, 0x31, 0xBF, 0x1C,
+	0x6F, 0x5C, 0x07, 0x37, 0x76, 0xD9, 0xBD, 0x3B,
+	0xB6, 0xB6, 0x8D, 0x6A, 0x1A, 0xE6, 0xE9, 0xCB,
+	0x4D, 0xC3, 0xDC, 0x76, 0x91, 0xE7, 0x6F, 0x11,
+	0x66, 0xF7, 0x76, 0xB3, 0x40, 0xAA, 0x51, 0x09,
+	0x7C, 0xFE, 0xA2, 0x37, 0xBF, 0xC3, 0x92, 0xFA,
+	0x75, 0x44, 0x76, 0xC7, 0x54, 0xC8, 0x91, 0x89,
+	0x65, 0x84, 0x03, 0x3E, 0x46, 0x92, 0x1E, 0x67,
+	0x8D, 0x8F, 0x52, 0x0D, 0x06, 0x22, 0x18, 0xFC,
+	0x0B, 0x92, 0xCD, 0x94, 0xC2, 0x0A, 0x3F, 0x41,
+};
+
+/* Shared secret */
+uint8_t mlkem_512_sk[] = {
+	0x26, 0xCD, 0x28, 0x15, 0xEB, 0x3E, 0x16, 0x56,
+	0x84, 0x2D, 0x15, 0xAC, 0x32, 0x33, 0xDA, 0x01,
+	0x71, 0x21, 0x82, 0x1B, 0xC7, 0xE3, 0x44, 0xF9,
+	0x5E, 0x7A, 0xB9, 0x3A, 0x40, 0xAD, 0x38, 0x6A
+};
+
+uint8_t mlkem_512_dk_noseed[] = {
+	0x87, 0xCA, 0x19, 0x93, 0xB6, 0x4D, 0x89, 0x32,
+	0xAE, 0x3B, 0x22, 0x52, 0x82, 0xA1, 0xB3, 0xC1,
+	0x37, 0x65, 0xDC, 0xC1, 0x22, 0x4C, 0x43, 0x77,
+	0x33, 0x0A, 0x04, 0xEC, 0xEC, 0x0B, 0x25, 0x05,
+	0x40, 0x07, 0x53, 0x82, 0xBE, 0x37, 0x52, 0x53,
+	0x12, 0x87, 0x7D, 0x77, 0x69, 0xFD, 0x59, 0x4F,
+	0xBD, 0x16, 0x42, 0x82, 0x58, 0x9D, 0xEE, 0x5C,
+	0x0F, 0x2C, 0x14, 0x7F, 0xC6, 0x2A, 0x95, 0x42,
+	0x10, 0x3C, 0x08, 0xBC, 0xCC, 0xA0, 0x05, 0x82,
+	0xE9, 0xC5, 0x26, 0x81, 0xFA, 0xB8, 0x79, 0x78,
+	0x5B, 0x3E, 0x79, 0x49, 0x68, 0x44, 0xB3, 0x7B,
+	0xF5, 0x26, 0x62, 0x7A, 0x8A, 0x3C, 0xD8, 0x82,
+	0x1F, 0x16, 0x1D, 0x92, 0x99, 0xAC, 0xC4, 0xA9,
+	0xB9, 0x30, 0x32, 0x6B, 0x6B, 0x67, 0x3D, 0x16,
+	0x13, 0x1D, 0xF0, 0x98, 0x94, 0x42, 0x90, 0x68,
+	0xFC, 0x65, 0xA3, 0xE5, 0x16, 0x22, 0x09, 0x64,
+	0xC0, 0x7D, 0x54, 0x03, 0x47, 0x89, 0xBE, 0xAE,
+	0x61, 0x4B, 0x13, 0xA1, 0xCD, 0xAD, 0xBC, 0x20,
+	0x5E, 0x36, 0x36, 0x34, 0x41, 0x1D, 0x5B, 0x3A,
+	0x26, 0x91, 0x80, 0x75, 0xE0, 0x63, 0x9D, 0xD6,
+	0x35, 0xC9, 0x28, 0x81, 0xA4, 0x6E, 0xFB, 0x95,
+	0x01, 0x11, 0x8F, 0xCC, 0x18, 0xB3, 0x9A, 0x91,
+	0x66, 0xA6, 0x37, 0x6C, 0xEB, 0x71, 0x42, 0x29,
+	0xEC, 0x71, 0xA4, 0x99, 0x6D, 0x92, 0x97, 0x9D,
+	0x94, 0x64, 0x6E, 0xC3, 0xF0, 0x5D, 0xA5, 0x49,
+	0x8F, 0x66, 0xA5, 0x0A, 0x9A, 0xB9, 0xCF, 0x85,
+	0x20, 0xA7, 0x28, 0xE1, 0xC2, 0x10, 0x08, 0x72,
+	0x58, 0x71, 0x56, 0x3E, 0x7B, 0x47, 0x46, 0x81,
+	0x7D, 0x74, 0xFA, 0xB2, 0xB6, 0xF2, 0xA0, 0xE3,
+	0x4A, 0x0A, 0x5E, 0x95, 0x2B, 0x32, 0xF1, 0x07,
+	0x2C, 0x30, 0x5E, 0x81, 0x84, 0x58, 0xF3, 0x42,
+	0x34, 0xDB, 0xAA, 0xC4, 0x06, 0xCB, 0x63, 0x72,
+	0xFA, 0x01, 0x86, 0xE8, 0xCA, 0xD7, 0x73, 0x1D,
+	0xAC, 0xD8, 0x64, 0x60, 0x66, 0xB1, 0x19, 0xB1,
+	0x59, 0xAC, 0x78, 0x21, 0xAB, 0x9A, 0x62, 0xBF,
+	0xE8, 0x1B, 0xD1, 0xDC, 0x75, 0x08, 0xA4, 0x9E,
+	0x22, 0x54, 0xA8, 0x36, 0x68, 0x4B, 0xB7, 0x22,
+	0xA3, 0xBC, 0x04, 0x09, 0xE2, 0xE9, 0x4D, 0xCE,
+	0xF5, 0x46, 0x69, 0x1A, 0x47, 0x80, 0xB2, 0xA5,
+	0xA0, 0x24, 0xCF, 0x0D, 0x60, 0x95, 0x99, 0x33,
+	0xAD, 0x6A, 0x58, 0x7A, 0x56, 0x53, 0x86, 0x44,
+	0xA8, 0x3C, 0x1F, 0x92, 0x55, 0x3F, 0x3A, 0x3B,
+	0x5F, 0x81, 0xAA, 0x0C, 0xC4, 0x4B, 0x1A, 0xE3,
+	0x61, 0x8A, 0xD0, 0x5D, 0x29, 0x87, 0xB6, 0x7D,
+	0x1C, 0x85, 0xA5, 0x14, 0xB0, 0xDE, 0x1C, 0x8D,
+	0x5C, 0xC1, 0x5C, 0x04, 0xFC, 0x77, 0xAD, 0x03,
+	0x55, 0x96, 0xE0, 0xA7, 0x43, 0xB5, 0x95, 0x9A,
+	0xD5, 0x22, 0xEF, 0x13, 0x5F, 0x14, 0x9C, 0x0E,
+	0x7E, 0x56, 0x89, 0x37, 0x33, 0xC9, 0x00, 0x54,
+	0x7E, 0xEA, 0x32, 0x4F, 0x02, 0x85, 0xCD, 0xE5,
+	0x9C, 0x25, 0x00, 0x3B, 0xAD, 0xC2, 0x72, 0x3A,
+	0x38, 0x66, 0x95, 0xF9, 0xF4, 0x22, 0x1F, 0x50,
+	0x19, 0x20, 0x6A, 0x31, 0x03, 0xF8, 0x97, 0x91,
+	0xF0, 0x42, 0xBB, 0xC0, 0x86, 0xDE, 0x56, 0x93,
+	0xF2, 0x78, 0x9B, 0xC9, 0x98, 0x16, 0x47, 0x83,
+	0x67, 0x55, 0x92, 0x4E, 0x5A, 0xFA, 0x5D, 0x88,
+	0xF9, 0xC8, 0xEF, 0xA8, 0x21, 0x34, 0x58, 0x5F,
+	0xCA, 0xBB, 0x52, 0x98, 0xBC, 0x5C, 0xF5, 0xA7,
+	0xAE, 0xC5, 0xFC, 0x78, 0xF9, 0xA5, 0x30, 0x16,
+	0x68, 0x9D, 0x62, 0x17, 0x41, 0x7A, 0x95, 0xCF,
+	0x27, 0xB6, 0x6D, 0xAE, 0x58, 0xA7, 0x28, 0x8C,
+	0x8F, 0xC3, 0x28, 0xAC, 0x06, 0x79, 0x9D, 0x94,
+	0xC4, 0x9D, 0xED, 0xB2, 0x61, 0xF4, 0x44, 0x86,
+	0xEC, 0x12, 0xC3, 0x13, 0x97, 0xA7, 0x8B, 0x9A,
+	0x63, 0x2E, 0xF1, 0x66, 0x08, 0x84, 0x32, 0xF6,
+	0x15, 0x3B, 0x91, 0xCA, 0xCE, 0xF7, 0x40, 0x53,
+	0xA9, 0x28, 0x11, 0x63, 0xA0, 0x23, 0x2E, 0xC4,
+	0x44, 0x28, 0x05, 0x01, 0x02, 0x74, 0xCF, 0x9C,
+	0x3A, 0x1A, 0xBC, 0x93, 0x8A, 0x2C, 0xE8, 0x9A,
+	0xCA, 0xE1, 0x74, 0x62, 0x03, 0x88, 0xC7, 0x12,
+	0x20, 0x96, 0x3C, 0x4D, 0x10, 0x79, 0x28, 0x6F,
+	0x7B, 0xA8, 0x1B, 0xFB, 0x5E, 0x57, 0x17, 0xCC,
+	0x6D, 0xD0, 0x72, 0x8A, 0xB2, 0x70, 0xA3, 0x0A,
+	0x88, 0x03, 0x5B, 0x88, 0x5D, 0x35, 0x12, 0x8E,
+	0xAC, 0xC1, 0x81, 0xCA, 0xB7, 0x2B, 0xB1, 0x96,
+	0xF6, 0x35, 0xCE, 0xBB, 0x75, 0xAD, 0x0D, 0xD0,
+	0xBA, 0x4E, 0x43, 0x5B, 0x31, 0x08, 0x93, 0x32,
+	0x72, 0x63, 0x58, 0xC5, 0xA2, 0x70, 0x95, 0x12,
+	0x8F, 0xF2, 0xC1, 0x61, 0xEB, 0x22, 0xE9, 0x4A,
+	0x65, 0xA5, 0x48, 0x5D, 0x4C, 0x11, 0x78, 0x69,
+	0x0B, 0x1F, 0x39, 0x2B, 0x7F, 0x63, 0x77, 0xAD,
+	0x96, 0x6B, 0x67, 0x80, 0x90, 0x70, 0x57, 0x2B,
+	0xBC, 0x68, 0x9C, 0xAA, 0xB2, 0xD8, 0x3C, 0xBF,
+	0xD6, 0x4F, 0xC4, 0x28, 0x65, 0x74, 0x54, 0x84,
+	0x43, 0x9A, 0x1C, 0x96, 0x50, 0x02, 0x97, 0xC6,
+	0xCF, 0xB0, 0xB1, 0x1D, 0x98, 0x9A, 0x32, 0x94,
+	0x73, 0x88, 0x94, 0x78, 0x2D, 0x5F, 0x25, 0x05,
+	0x5F, 0xA6, 0x96, 0x7A, 0xC8, 0x3A, 0xDF, 0xA8,
+	0x19, 0xB2, 0x53, 0x53, 0x05, 0xF9, 0x31, 0xDC,
+	0x58, 0x6C, 0xD1, 0x3A, 0x9B, 0x47, 0x3B, 0x7D,
+	0x87, 0xE5, 0xB4, 0xB2, 0xD9, 0x96, 0x2A, 0x59,
+	0x90, 0x3C, 0xCC, 0xAD, 0xDC, 0xA2, 0x57, 0x87,
+	0x71, 0xC6, 0x7E, 0x5A, 0x49, 0x98, 0xC8, 0x94,
+	0x29, 0x30, 0x7B, 0x0E, 0x01, 0x97, 0x53, 0x18,
+	0x32, 0x50, 0x73, 0x9E, 0x14, 0x47, 0x97, 0xBD,
+	0xCC, 0x22, 0xAB, 0x02, 0x95, 0xD7, 0xC5, 0x32,
+	0xDF, 0x17, 0x84, 0x86, 0x77, 0x41, 0x6E, 0x95,
+	0x4D, 0x66, 0xF9, 0xB0, 0x9E, 0x12, 0x81, 0x53,
+	0x2A, 0x2E, 0x8F, 0x0C, 0x6A, 0xBE, 0x00, 0x37,
+	0xE7, 0xE8, 0x11, 0x90, 0x97, 0xC9, 0xEC, 0x84,
+	0x5A, 0xA0, 0x69, 0x85, 0xC0, 0x88, 0x55, 0x2C,
+	0x41, 0xB6, 0x15, 0x17, 0x36, 0x42, 0xC1, 0x02,
+	0x51, 0xC0, 0x6E, 0x91, 0xA2, 0x5C, 0x24, 0x3C,
+	0x02, 0x63, 0xB6, 0x75, 0xC7, 0x20, 0x7D, 0x58,
+	0x70, 0x1D, 0x13, 0xA5, 0x2E, 0xAB, 0x92, 0x56,
+	0x5E, 0xF1, 0xA1, 0xDE, 0xFB, 0xAE, 0xFE, 0x4C,
+	0x0B, 0x03, 0xF5, 0x04, 0x44, 0xA3, 0xBE, 0x20,
+	0xB1, 0x71, 0x31, 0x0B, 0xA3, 0xF2, 0x08, 0x52,
+	0xF3, 0xA2, 0xA1, 0x8E, 0x72, 0x29, 0x40, 0x70,
+	0x15, 0x64, 0x60, 0x52, 0xD2, 0xE7, 0x3A, 0xBE,
+	0xE3, 0x18, 0xD7, 0x55, 0x89, 0x9C, 0x78, 0x4A,
+	0x6F, 0xB5, 0xAA, 0xB1, 0x7C, 0x90, 0x2C, 0xB6,
+	0x8A, 0xFA, 0x36, 0x57, 0xB9, 0x01, 0x2E, 0x1B,
+	0xB8, 0xB6, 0xAA, 0xC2, 0x68, 0x9A, 0xA4, 0x8C,
+	0x2D, 0x42, 0x62, 0xBB, 0x29, 0x63, 0xB0, 0x6A,
+	0x24, 0x22, 0x82, 0x54, 0x1C, 0xF6, 0x14, 0x19,
+	0xD9, 0x0E, 0x2B, 0xD3, 0x66, 0xBE, 0xE7, 0xA4,
+	0x36, 0x9B, 0x72, 0x41, 0xA6, 0x6B, 0xF2, 0x64,
+	0x5D, 0x8E, 0x90, 0x4C, 0x3F, 0x7B, 0x30, 0x0C,
+	0x04, 0x1D, 0x56, 0x87, 0x39, 0x3D, 0x2C, 0xA9,
+	0x29, 0x75, 0xCB, 0xFD, 0xC0, 0x18, 0xDD, 0xC6,
+	0x0A, 0xF5, 0x62, 0x00, 0x9E, 0xB0, 0x88, 0x8E,
+	0x5A, 0x05, 0x76, 0x24, 0x6A, 0xCE, 0x74, 0x5B,
+	0xB1, 0x63, 0x40, 0x8B, 0x5A, 0x9A, 0xE3, 0xC1,
+	0x94, 0xA8, 0x5C, 0x21, 0x90, 0x7B, 0x37, 0xB1,
+	0x62, 0x8E, 0xCD, 0x9A, 0x15, 0xEC, 0x20, 0x24,
+	0x87, 0x30, 0x27, 0x34, 0x44, 0xB0, 0xA2, 0xF4,
+	0x54, 0xF9, 0xB4, 0x73, 0x0F, 0x33, 0x91, 0x50,
+	0x47, 0x6E, 0xE0, 0x70, 0x98, 0xF6, 0xBC, 0x1B,
+	0x97, 0xCC, 0x1B, 0xD3, 0xB8, 0xC1, 0xA2, 0xEB,
+	0x0E, 0x50, 0xA7, 0x82, 0xF2, 0x11, 0x5D, 0xF6,
+	0x17, 0x49, 0x6F, 0x6C, 0x6F, 0x8C, 0x09, 0xB0,
+	0x5F, 0x88, 0x8D, 0x9E, 0x93, 0x3D, 0x28, 0x77,
+	0x46, 0xC6, 0x31, 0xB3, 0x10, 0x87, 0x26, 0xB0,
+	0xC4, 0xA7, 0xC8, 0x8B, 0x09, 0xC8, 0x60, 0xAC,
+	0xD7, 0x52, 0x35, 0x70, 0xC8, 0x02, 0xBD, 0x38,
+	0x72, 0x43, 0x16, 0x2D, 0x12, 0x8C, 0xA2, 0x29,
+	0x4C, 0x83, 0x43, 0x18, 0xCC, 0x21, 0xFB, 0x14,
+	0xD2, 0xAB, 0x37, 0x3F, 0x22, 0x4E, 0x3F, 0xD4,
+	0x98, 0x43, 0x85, 0x95, 0x09, 0xF4, 0xCA, 0x1A,
+	0x1A, 0x56, 0x6C, 0x05, 0x67, 0x88, 0xA3, 0xAA,
+	0x48, 0x4A, 0xAA, 0xBD, 0xF1, 0xA0, 0x8F, 0x1B,
+	0x44, 0xC7, 0x56, 0xAB, 0x2A, 0x0C, 0x8B, 0xC5,
+	0x85, 0x1E, 0xE2, 0xEB, 0x23, 0x03, 0x4C, 0x2E,
+	0xAA, 0x5A, 0xC1, 0x5F, 0x89, 0x75, 0x1B, 0xD5,
+	0xCA, 0xE1, 0xD5, 0x90, 0x89, 0xD5, 0x00, 0x2B,
+	0xB1, 0xB3, 0xBF, 0xCA, 0x4A, 0xDE, 0x09, 0x82,
+	0xAD, 0x67, 0x83, 0xE9, 0xD3, 0x7F, 0xB3, 0xE3,
+	0x20, 0xAC, 0x98, 0x55, 0xDF, 0x66, 0x6B, 0xFD,
+	0x7C, 0x6B, 0x87, 0xA9, 0xA4, 0x6E, 0x25, 0x97,
+	0x12, 0x56, 0x11, 0x61, 0x50, 0x7E, 0x17, 0x35,
+	0x98, 0xF9, 0x88, 0xAC, 0xB6, 0xF9, 0xAB, 0x3A,
+	0x10, 0x92, 0x63, 0x24, 0x46, 0x88, 0xC7, 0x08,
+	0x78, 0x75, 0x8F, 0xF4, 0xD4, 0x31, 0x3B, 0x76,
+	0x64, 0xF0, 0xF5, 0x10, 0xE9, 0x13, 0xCA, 0x01,
+	0xC5, 0x2B, 0x3A, 0x1B, 0x46, 0x53, 0x51, 0x44,
+	0xE2, 0xDB, 0x0C, 0xAC, 0xE8, 0xA6, 0x46, 0x66,
+	0x00, 0xCF, 0x2A, 0x87, 0x83, 0x50, 0x07, 0xE1,
+	0x6A, 0xA5, 0x07, 0x80, 0x1D, 0x86, 0xB7, 0x38,
+	0x5E, 0x66, 0x9B, 0xFA, 0xF6, 0xBA, 0x1D, 0xF5,
+	0x68, 0x31, 0x63, 0xC2, 0xD5, 0x70, 0x53, 0x2F,
+	0xD7, 0x43, 0x90, 0x54, 0x64, 0x0F, 0x24, 0x4C,
+	0x52, 0x87, 0x13, 0x59, 0xD2, 0x84, 0x2F, 0xC3,
+	0x37, 0xA0, 0x60, 0x03, 0x3A, 0xF0, 0x5E, 0xAA,
+	0x00, 0x1C, 0x34, 0xFC, 0x7B, 0xD8, 0xF9, 0x10,
+	0x29, 0xE4, 0x6C, 0x29, 0x43, 0x36, 0x27, 0x64,
+	0x5D, 0x67, 0x86, 0x64, 0x21, 0xD6, 0x61, 0xAF,
+	0x25, 0x74, 0x80, 0x53, 0x2B, 0x88, 0x78, 0x50,
+	0xDC, 0x49, 0x9F, 0xFE, 0xD5, 0xB1, 0x40, 0x98,
+	0xA0, 0x33, 0x72, 0x5E, 0x82, 0x0A, 0x5B, 0xE1,
+	0x40, 0x0A, 0x0C, 0xB7, 0x03, 0x74, 0x1C, 0xA7,
+	0x4B, 0x47, 0x86, 0x73, 0xAA, 0xCF, 0x85, 0x16,
+	0x6E, 0xE8, 0xA1, 0x84, 0xDB, 0x2C, 0x58, 0x54,
+	0x9C, 0x22, 0x40, 0xB8, 0x30, 0x8C, 0x27, 0xBE,
+	0xBA, 0x40, 0xC3, 0xB9, 0xD7, 0x29, 0xED, 0xB1,
+	0x8C, 0xC2, 0x06, 0x8E, 0xCD, 0xB2, 0x7D, 0xA2,
+	0x2B, 0x2C, 0xD3, 0xE7, 0xA0, 0xBA, 0xA5, 0x30,
+	0xC5, 0x19, 0x3C, 0xD3, 0xC8, 0x6B, 0xF8, 0x6A,
+	0x44, 0xF0, 0x79, 0x9E, 0x51, 0x55, 0xB0, 0x9B,
+	0xE2, 0x50, 0x98, 0x85, 0x23, 0xB3, 0xA7, 0x31,
+	0xDD, 0x89, 0x1B, 0xC2, 0x00, 0x60, 0x11, 0xA0,
+	0x65, 0xC0, 0xAB, 0x57, 0xF1, 0xA6, 0xC1, 0x78,
+	0x89, 0x55, 0xE0, 0x13, 0x5F, 0xA5, 0xCA, 0x8F,
+	0x3E, 0x52, 0xC7, 0x5D, 0x37, 0x16, 0x97, 0x3A,
+	0x2F, 0xB2, 0x2C, 0x0E, 0xB1, 0x7C, 0x1B, 0x32,
+	0x85, 0x29, 0xD9, 0xFA, 0x76, 0x56, 0xD7, 0x4D,
+	0xEA, 0x74, 0x0D, 0x9F, 0x07, 0x97, 0x77, 0xC3,
+	0x6C, 0x17, 0xA1, 0x9C, 0x19, 0x58, 0x9E, 0x84,
+	0xD2, 0xB8, 0xE4, 0xD1, 0xBC, 0x31, 0x07, 0xCB,
+	0xD2, 0x78, 0x14, 0x22, 0x48, 0x35, 0x48, 0x44,
+	0x6C, 0x89, 0x93, 0x14, 0x77, 0x44, 0xAA, 0x9E,
+	0xC1, 0xC5, 0x93, 0xEC, 0x2D, 0x5B, 0xAA, 0xC8,
+	0x6A, 0x0A, 0xF6, 0x4A, 0x85, 0xE9, 0x09, 0xDF,
+	0x8E, 0x28, 0x16, 0x60, 0x5D, 0x20, 0xB4, 0xE3,
+	0x82, 0xB3, 0x0B, 0xBB, 0x61, 0xBF, 0x3A, 0x5F,
+	0x82, 0x1A, 0x0B, 0x5D, 0xBA, 0x9A, 0xD3, 0xE7,
+	0xE5, 0xBD, 0x1B, 0x37, 0xA7, 0x5E, 0x0F, 0x09,
+	0x29, 0x74, 0xE8, 0x46, 0xE8, 0xC3, 0x7C, 0x45,
+	0x48, 0x7D, 0x60, 0x73, 0x9F, 0x99, 0x35, 0x17,
+	0x19, 0xA5, 0x39, 0x47, 0x23, 0x26, 0x2B, 0x3B,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+uint8_t mlkem_512_ek_noseed[] = {
+	0xDF, 0x17, 0x84, 0x86, 0x77, 0x41, 0x6E, 0x95,
+	0x4D, 0x66, 0xF9, 0xB0, 0x9E, 0x12, 0x81, 0x53,
+	0x2A, 0x2E, 0x8F, 0x0C, 0x6A, 0xBE, 0x00, 0x37,
+	0xE7, 0xE8, 0x11, 0x90, 0x97, 0xC9, 0xEC, 0x84,
+	0x5A, 0xA0, 0x69, 0x85, 0xC0, 0x88, 0x55, 0x2C,
+	0x41, 0xB6, 0x15, 0x17, 0x36, 0x42, 0xC1, 0x02,
+	0x51, 0xC0, 0x6E, 0x91, 0xA2, 0x5C, 0x24, 0x3C,
+	0x02, 0x63, 0xB6, 0x75, 0xC7, 0x20, 0x7D, 0x58,
+	0x70, 0x1D, 0x13, 0xA5, 0x2E, 0xAB, 0x92, 0x56,
+	0x5E, 0xF1, 0xA1, 0xDE, 0xFB, 0xAE, 0xFE, 0x4C,
+	0x0B, 0x03, 0xF5, 0x04, 0x44, 0xA3, 0xBE, 0x20,
+	0xB1, 0x71, 0x31, 0x0B, 0xA3, 0xF2, 0x08, 0x52,
+	0xF3, 0xA2, 0xA1, 0x8E, 0x72, 0x29, 0x40, 0x70,
+	0x15, 0x64, 0x60, 0x52, 0xD2, 0xE7, 0x3A, 0xBE,
+	0xE3, 0x18, 0xD7, 0x55, 0x89, 0x9C, 0x78, 0x4A,
+	0x6F, 0xB5, 0xAA, 0xB1, 0x7C, 0x90, 0x2C, 0xB6,
+	0x8A, 0xFA, 0x36, 0x57, 0xB9, 0x01, 0x2E, 0x1B,
+	0xB8, 0xB6, 0xAA, 0xC2, 0x68, 0x9A, 0xA4, 0x8C,
+	0x2D, 0x42, 0x62, 0xBB, 0x29, 0x63, 0xB0, 0x6A,
+	0x24, 0x22, 0x82, 0x54, 0x1C, 0xF6, 0x14, 0x19,
+	0xD9, 0x0E, 0x2B, 0xD3, 0x66, 0xBE, 0xE7, 0xA4,
+	0x36, 0x9B, 0x72, 0x41, 0xA6, 0x6B, 0xF2, 0x64,
+	0x5D, 0x8E, 0x90, 0x4C, 0x3F, 0x7B, 0x30, 0x0C,
+	0x04, 0x1D, 0x56, 0x87, 0x39, 0x3D, 0x2C, 0xA9,
+	0x29, 0x75, 0xCB, 0xFD, 0xC0, 0x18, 0xDD, 0xC6,
+	0x0A, 0xF5, 0x62, 0x00, 0x9E, 0xB0, 0x88, 0x8E,
+	0x5A, 0x05, 0x76, 0x24, 0x6A, 0xCE, 0x74, 0x5B,
+	0xB1, 0x63, 0x40, 0x8B, 0x5A, 0x9A, 0xE3, 0xC1,
+	0x94, 0xA8, 0x5C, 0x21, 0x90, 0x7B, 0x37, 0xB1,
+	0x62, 0x8E, 0xCD, 0x9A, 0x15, 0xEC, 0x20, 0x24,
+	0x87, 0x30, 0x27, 0x34, 0x44, 0xB0, 0xA2, 0xF4,
+	0x54, 0xF9, 0xB4, 0x73, 0x0F, 0x33, 0x91, 0x50,
+	0x47, 0x6E, 0xE0, 0x70, 0x98, 0xF6, 0xBC, 0x1B,
+	0x97, 0xCC, 0x1B, 0xD3, 0xB8, 0xC1, 0xA2, 0xEB,
+	0x0E, 0x50, 0xA7, 0x82, 0xF2, 0x11, 0x5D, 0xF6,
+	0x17, 0x49, 0x6F, 0x6C, 0x6F, 0x8C, 0x09, 0xB0,
+	0x5F, 0x88, 0x8D, 0x9E, 0x93, 0x3D, 0x28, 0x77,
+	0x46, 0xC6, 0x31, 0xB3, 0x10, 0x87, 0x26, 0xB0,
+	0xC4, 0xA7, 0xC8, 0x8B, 0x09, 0xC8, 0x60, 0xAC,
+	0xD7, 0x52, 0x35, 0x70, 0xC8, 0x02, 0xBD, 0x38,
+	0x72, 0x43, 0x16, 0x2D, 0x12, 0x8C, 0xA2, 0x29,
+	0x4C, 0x83, 0x43, 0x18, 0xCC, 0x21, 0xFB, 0x14,
+	0xD2, 0xAB, 0x37, 0x3F, 0x22, 0x4E, 0x3F, 0xD4,
+	0x98, 0x43, 0x85, 0x95, 0x09, 0xF4, 0xCA, 0x1A,
+	0x1A, 0x56, 0x6C, 0x05, 0x67, 0x88, 0xA3, 0xAA,
+	0x48, 0x4A, 0xAA, 0xBD, 0xF1, 0xA0, 0x8F, 0x1B,
+	0x44, 0xC7, 0x56, 0xAB, 0x2A, 0x0C, 0x8B, 0xC5,
+	0x85, 0x1E, 0xE2, 0xEB, 0x23, 0x03, 0x4C, 0x2E,
+	0xAA, 0x5A, 0xC1, 0x5F, 0x89, 0x75, 0x1B, 0xD5,
+	0xCA, 0xE1, 0xD5, 0x90, 0x89, 0xD5, 0x00, 0x2B,
+	0xB1, 0xB3, 0xBF, 0xCA, 0x4A, 0xDE, 0x09, 0x82,
+	0xAD, 0x67, 0x83, 0xE9, 0xD3, 0x7F, 0xB3, 0xE3,
+	0x20, 0xAC, 0x98, 0x55, 0xDF, 0x66, 0x6B, 0xFD,
+	0x7C, 0x6B, 0x87, 0xA9, 0xA4, 0x6E, 0x25, 0x97,
+	0x12, 0x56, 0x11, 0x61, 0x50, 0x7E, 0x17, 0x35,
+	0x98, 0xF9, 0x88, 0xAC, 0xB6, 0xF9, 0xAB, 0x3A,
+	0x10, 0x92, 0x63, 0x24, 0x46, 0x88, 0xC7, 0x08,
+	0x78, 0x75, 0x8F, 0xF4, 0xD4, 0x31, 0x3B, 0x76,
+	0x64, 0xF0, 0xF5, 0x10, 0xE9, 0x13, 0xCA, 0x01,
+	0xC5, 0x2B, 0x3A, 0x1B, 0x46, 0x53, 0x51, 0x44,
+	0xE2, 0xDB, 0x0C, 0xAC, 0xE8, 0xA6, 0x46, 0x66,
+	0x00, 0xCF, 0x2A, 0x87, 0x83, 0x50, 0x07, 0xE1,
+	0x6A, 0xA5, 0x07, 0x80, 0x1D, 0x86, 0xB7, 0x38,
+	0x5E, 0x66, 0x9B, 0xFA, 0xF6, 0xBA, 0x1D, 0xF5,
+	0x68, 0x31, 0x63, 0xC2, 0xD5, 0x70, 0x53, 0x2F,
+	0xD7, 0x43, 0x90, 0x54, 0x64, 0x0F, 0x24, 0x4C,
+	0x52, 0x87, 0x13, 0x59, 0xD2, 0x84, 0x2F, 0xC3,
+	0x37, 0xA0, 0x60, 0x03, 0x3A, 0xF0, 0x5E, 0xAA,
+	0x00, 0x1C, 0x34, 0xFC, 0x7B, 0xD8, 0xF9, 0x10,
+	0x29, 0xE4, 0x6C, 0x29, 0x43, 0x36, 0x27, 0x64,
+	0x5D, 0x67, 0x86, 0x64, 0x21, 0xD6, 0x61, 0xAF,
+	0x25, 0x74, 0x80, 0x53, 0x2B, 0x88, 0x78, 0x50,
+	0xDC, 0x49, 0x9F, 0xFE, 0xD5, 0xB1, 0x40, 0x98,
+	0xA0, 0x33, 0x72, 0x5E, 0x82, 0x0A, 0x5B, 0xE1,
+	0x40, 0x0A, 0x0C, 0xB7, 0x03, 0x74, 0x1C, 0xA7,
+	0x4B, 0x47, 0x86, 0x73, 0xAA, 0xCF, 0x85, 0x16,
+	0x6E, 0xE8, 0xA1, 0x84, 0xDB, 0x2C, 0x58, 0x54,
+	0x9C, 0x22, 0x40, 0xB8, 0x30, 0x8C, 0x27, 0xBE,
+	0xBA, 0x40, 0xC3, 0xB9, 0xD7, 0x29, 0xED, 0xB1,
+	0x8C, 0xC2, 0x06, 0x8E, 0xCD, 0xB2, 0x7D, 0xA2,
+	0x2B, 0x2C, 0xD3, 0xE7, 0xA0, 0xBA, 0xA5, 0x30,
+	0xC5, 0x19, 0x3C, 0xD3, 0xC8, 0x6B, 0xF8, 0x6A,
+	0x44, 0xF0, 0x79, 0x9E, 0x51, 0x55, 0xB0, 0x9B,
+	0xE2, 0x50, 0x98, 0x85, 0x23, 0xB3, 0xA7, 0x31,
+	0xDD, 0x89, 0x1B, 0xC2, 0x00, 0x60, 0x11, 0xA0,
+	0x65, 0xC0, 0xAB, 0x57, 0xF1, 0xA6, 0xC1, 0x78,
+	0x89, 0x55, 0xE0, 0x13, 0x5F, 0xA5, 0xCA, 0x8F,
+	0x3E, 0x52, 0xC7, 0x5D, 0x37, 0x16, 0x97, 0x3A,
+	0x2F, 0xB2, 0x2C, 0x0E, 0xB1, 0x7C, 0x1B, 0x32,
+	0x85, 0x29, 0xD9, 0xFA, 0x76, 0x56, 0xD7, 0x4D,
+	0xEA, 0x74, 0x0D, 0x9F, 0x07, 0x97, 0x77, 0xC3,
+	0x6C, 0x17, 0xA1, 0x9C, 0x19, 0x58, 0x9E, 0x84,
+	0xD2, 0xB8, 0xE4, 0xD1, 0xBC, 0x31, 0x07, 0xCB,
+	0xD2, 0x78, 0x14, 0x22, 0x48, 0x35, 0x48, 0x44,
+	0x6C, 0x89, 0x93, 0x14, 0x77, 0x44, 0xAA, 0x9E,
+	0xC1, 0xC5, 0x93, 0xEC, 0x2D, 0x5B, 0xAA, 0xC8,
+	0x6A, 0x0A, 0xF6, 0x4A, 0x85, 0xE9, 0x09, 0xDF,
+	0x8E, 0x28, 0x16, 0x60, 0x5D, 0x20, 0xB4, 0xE3,
+	0x82, 0xB3, 0x0B, 0xBB, 0x61, 0xBF, 0x3A, 0x5F,
+	0x82, 0x1A, 0x0B, 0x5D, 0xBA, 0x9A, 0xD3, 0xE7,
+};
+
+struct crypto_testsuite_mlkem_params mlkem_keygen_test_vectors[] = {
+	{
+		.name = "mlkem_512_keygen",
+		.param = RTE_CRYPTO_ML_KEM_PARAM_512,
+		.d = {
+			.data = mlkem_512_d,
+			.length = sizeof(mlkem_512_d),
+		},
+		.z = {
+			.data = mlkem_512_z,
+			.length = sizeof(mlkem_512_z),
+		},
+	},
+	{
+		.name = "mlkem_512_keygen (deterministic)",
+		.param = RTE_CRYPTO_ML_KEM_PARAM_512,
+		.d = {
+			.data = (uint8_t [32]) {0},
+			.length = 32,
+		},
+		.z = {
+			.data = (uint8_t [32]) {0},
+			.length = 32,
+		},
+		.dk = {
+			.data = mlkem_512_dk_noseed,
+			.length = sizeof(mlkem_512_dk_noseed),
+		},
+		.ek = {
+			.data = mlkem_512_ek_noseed,
+			.length = sizeof(mlkem_512_ek_noseed),
+		}
+	},
+};
+
+struct crypto_testsuite_mlkem_params mlkem_encap_test_vectors[] = {
+	{
+		.name = "mlkem_512_encap",
+		.param = RTE_CRYPTO_ML_KEM_PARAM_512,
+		.dk = {
+			.data = mlkem_512_dk,
+			.length = sizeof(mlkem_512_dk),
+		},
+		.ek = {
+			.data = mlkem_512_ek,
+			.length = sizeof(mlkem_512_ek),
+		},
+		.message = {
+			.data = NULL,
+			.length = 0,
+		},
+	},
+	{
+		.name = "mlkem_512_encap (deterministic)",
+		.param = RTE_CRYPTO_ML_KEM_PARAM_512,
+		.dk = {
+			.data = mlkem_512_dk,
+			.length = sizeof(mlkem_512_dk),
+		},
+		.ek = {
+			.data = mlkem_512_ek,
+			.length = sizeof(mlkem_512_ek),
+		},
+		.message = {
+			.data = mlkem_512_message,
+			.length = 32,
+		},
+		.cipher = {
+			.data = mlkem_512_cipher,
+			.length = sizeof(mlkem_512_cipher),
+		},
+		.sk = {
+			.data = mlkem_512_sk,
+			.length = sizeof(mlkem_512_sk),
+		},
+	},
+};
+
+struct crypto_testsuite_mlkem_params mlkem_decap_test_vectors[] = {
+	{
+		.name = "mlkem_512_decap",
+		.param = RTE_CRYPTO_ML_KEM_PARAM_512,
+		.cipher = {
+			.data = mlkem_512_cipher,
+			.length = sizeof(mlkem_512_cipher),
+		},
+		.dk = {
+			.data = mlkem_512_dk,
+			.length = sizeof(mlkem_512_dk),
+		},
+		.sk = {
+			.data = mlkem_512_sk,
+			.length = sizeof(mlkem_512_sk),
+		},
+	}
+};
+
+#endif /* __TEST_CRYPTODEV_ML_KEM_TEST_VECTORS_H__ */
-- 
2.37.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2025-10-01  7:38 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-08-28  7:06 [RFC] cryptodev: support PQC ML algorithms Gowrishankar Muthukrishnan
2025-09-30 18:03 ` [PATCH v1 0/3] " Gowrishankar Muthukrishnan
2025-09-30 18:03   ` [PATCH v1 1/3] " Gowrishankar Muthukrishnan
2025-09-30 18:03   ` [PATCH v1 2/3] crypto/openssl: add ML crypto support Gowrishankar Muthukrishnan
2025-09-30 18:03   ` [PATCH v1 3/3] app/test: add ML crypto test vectors Gowrishankar Muthukrishnan
2025-10-01  5:49   ` [PATCH v1 0/3] cryptodev: support PQC ML algorithms Akhil Goyal
2025-10-01  7:37   ` [PATCH v2 " Gowrishankar Muthukrishnan
2025-10-01  7:37     ` [PATCH v2 1/3] " Gowrishankar Muthukrishnan
2025-10-01  7:37     ` [PATCH v2 2/3] crypto/openssl: add ML crypto support Gowrishankar Muthukrishnan
2025-10-01  7:37     ` [PATCH v2 3/3] app/test: add ML crypto test vectors Gowrishankar Muthukrishnan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).