Linux Modules
 help / color / mirror / Atom feed
* [PATCH v8 5/9] crypto: Add ML-DSA-65 pure rejection test vectors as a kunit test
From: David Howells @ 2025-11-14 13:04 UTC (permalink / raw)
  To: Herbert Xu
  Cc: David Howells, Eric Biggers, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Jason A . Donenfeld, Ard Biesheuvel,
	Stephan Mueller, Lukas Wunner, Ignat Korchagin, linux-crypto,
	keyrings, linux-modules, linux-kernel
In-Reply-To: <20251114130417.1756230-1-dhowells@redhat.com>

Add the "Pure rejection tests" from Stephan Mueller's Leancrypto
implementation of ML-DSA/Dilithium 65 to the kernel as a kunit test.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Stephan Mueller <smueller@chronox.de>
cc: Eric Biggers <ebiggers@kernel.org>
cc: Jason A. Donenfeld <Jason@zx2c4.com>
cc: Ard Biesheuvel <ardb@kernel.org>
cc: Herbert Xu <herbert@gondor.apana.org.au>
cc: linux-crypto@vger.kernel.org
---
 lib/crypto/tests/mldsa_kunit.c                |   15 +
 .../tests/mldsa_pure_rejection_vectors_65.h   | 4741 +++++++++++++++++
 2 files changed, 4756 insertions(+)
 create mode 100644 lib/crypto/tests/mldsa_pure_rejection_vectors_65.h

diff --git a/lib/crypto/tests/mldsa_kunit.c b/lib/crypto/tests/mldsa_kunit.c
index 33ef92d8adbc..13b2e4f7585e 100644
--- a/lib/crypto/tests/mldsa_kunit.c
+++ b/lib/crypto/tests/mldsa_kunit.c
@@ -35,6 +35,9 @@ struct dilithium_testvector {
 static const struct dilithium_testvector dilithium44_testvectors[] = {
 #include "mldsa_pure_rejection_vectors_44.h"
 };
+static const struct dilithium_testvector dilithium65_testvectors[] = {
+#include "mldsa_pure_rejection_vectors_65.h"
+};
 
 static void dilithium_sigver_test_one(struct kunit *test, int index,
 				      const struct dilithium_testvector *tc)
@@ -60,8 +63,20 @@ static void dilithium44_kunit_test(struct kunit *test)
 	KUNIT_SUCCEED(test);
 }
 
+static void dilithium65_kunit_test(struct kunit *test)
+{
+	const struct dilithium_testvector *tc = dilithium65_testvectors;
+	int count = ARRAY_SIZE(dilithium65_testvectors);
+
+	for (int index = 0; index < count; index++)
+		dilithium_sigver_test_one(test, index, &tc[index]);
+
+	KUNIT_SUCCEED(test);
+}
+
 static struct kunit_case __refdata mldsa_kunit_cases[] = {
 	KUNIT_CASE(dilithium44_kunit_test),
+	KUNIT_CASE(dilithium65_kunit_test),
 	{}
 };
 
diff --git a/lib/crypto/tests/mldsa_pure_rejection_vectors_65.h b/lib/crypto/tests/mldsa_pure_rejection_vectors_65.h
new file mode 100644
index 000000000000..ed552ed6868f
--- /dev/null
+++ b/lib/crypto/tests/mldsa_pure_rejection_vectors_65.h
@@ -0,0 +1,4741 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+	{
+		.what = "pure rejection vector",
+		.algo = "ml-dsa65",
+		.pk_len = DILITHIUM65_PUBLICKEYBYTES,
+		.pk = (const u8[DILITHIUM65_PUBLICKEYBYTES]){
+			0x9f, 0x55, 0x1e, 0x7f, 0x9c, 0x08, 0xb2, 0x83,
+			0xfd, 0x5b, 0xa2, 0xac, 0x4f, 0x26, 0xc2, 0xf5,
+			0x06, 0x05, 0x96, 0x08, 0x24, 0xad, 0xec, 0xe4,
+			0x99, 0xcc, 0x6c, 0xbd, 0x55, 0x37, 0x15, 0x94,
+			0xab, 0x31, 0x9e, 0x56, 0xe5, 0xe4, 0x55, 0xec,
+			0x4d, 0x49, 0x5b, 0x5a, 0x7a, 0xe8, 0xc3, 0x4a,
+			0x08, 0x44, 0x4a, 0xc2, 0x2d, 0xe4, 0x61, 0x33,
+			0x90, 0x20, 0x71, 0x45, 0xa5, 0x45, 0xd0, 0x83,
+			0x2b, 0x32, 0x6c, 0xa7, 0x9e, 0x76, 0xcd, 0xfb,
+			0x58, 0x15, 0x9e, 0x74, 0x0d, 0x67, 0x57, 0xb1,
+			0x06, 0x5b, 0x5d, 0xd5, 0x1c, 0xbb, 0x95, 0x40,
+			0x1c, 0x71, 0x31, 0x03, 0xef, 0xff, 0x04, 0x6b,
+			0xdd, 0xa2, 0xf0, 0x32, 0x00, 0x72, 0xbc, 0x87,
+			0xb6, 0x2c, 0x1f, 0x90, 0x7f, 0x92, 0xa0, 0xb2,
+			0x04, 0xdd, 0xa9, 0xaf, 0x7f, 0x01, 0x28, 0x4c,
+			0xb2, 0x57, 0x2d, 0x56, 0x93, 0xd0, 0xc7, 0x54,
+			0x02, 0x90, 0x57, 0x70, 0x23, 0x57, 0xe8, 0xe7,
+			0x33, 0x32, 0x98, 0xfc, 0x9b, 0x8e, 0x6e, 0x7b,
+			0xaa, 0x5d, 0xb5, 0x4e, 0xe0, 0x5d, 0x97, 0xa3,
+			0xea, 0x43, 0x7e, 0xb3, 0xa4, 0x8c, 0xcf, 0xdc,
+			0xc0, 0x51, 0xa7, 0x99, 0x45, 0x3d, 0x3c, 0xa0,
+			0xba, 0xc5, 0xff, 0xe1, 0x89, 0xb3, 0x7d, 0xc3,
+			0xdc, 0xe2, 0x23, 0x81, 0xff, 0xa9, 0xc7, 0x93,
+			0xc6, 0x67, 0xad, 0x94, 0xcf, 0xeb, 0x91, 0x78,
+			0x15, 0x25, 0xf7, 0xf5, 0x06, 0x08, 0x2f, 0x0c,
+			0xee, 0x0b, 0x6a, 0x06, 0x59, 0xe0, 0x1f, 0x2e,
+			0x5a, 0x12, 0x06, 0xf5, 0xf4, 0x8e, 0x75, 0x57,
+			0xa9, 0x33, 0x23, 0x0f, 0xc2, 0x6f, 0x02, 0xf8,
+			0x68, 0x0f, 0x62, 0x02, 0x81, 0xfe, 0x03, 0x7c,
+			0xaf, 0xd7, 0x42, 0x5b, 0xcc, 0xe7, 0x2b, 0xea,
+			0x49, 0xab, 0x03, 0x6d, 0x0a, 0x02, 0xae, 0x47,
+			0x79, 0xce, 0xfd, 0x18, 0x76, 0x07, 0x9e, 0xa6,
+			0xbf, 0x7e, 0x8d, 0x73, 0xf9, 0x44, 0xeb, 0x8c,
+			0xc5, 0x59, 0xb7, 0x19, 0xf6, 0x73, 0x53, 0x42,
+			0x2a, 0x55, 0x7b, 0xb4, 0x56, 0x49, 0x08, 0x9e,
+			0x9a, 0x65, 0x60, 0x70, 0x1d, 0xbd, 0xc6, 0x85,
+			0x29, 0xde, 0xfe, 0x44, 0xae, 0xdf, 0x25, 0xfd,
+			0x5b, 0x74, 0x6c, 0x96, 0xe6, 0x81, 0x37, 0x80,
+			0xe0, 0x9e, 0xf3, 0x75, 0x63, 0xb4, 0xc9, 0x2f,
+			0x71, 0xe6, 0xeb, 0xdf, 0xaf, 0x7e, 0xff, 0x9e,
+			0xe0, 0xbf, 0xca, 0xca, 0x11, 0xed, 0xc6, 0x04,
+			0xd8, 0x49, 0x13, 0x2c, 0x63, 0xf1, 0xb3, 0x17,
+			0x74, 0xd9, 0x50, 0x3f, 0xb9, 0x29, 0x0e, 0x48,
+			0xa7, 0xf0, 0xdc, 0x78, 0x18, 0x0e, 0x9f, 0xb7,
+			0xde, 0x36, 0x79, 0x67, 0xa4, 0x23, 0x08, 0xe7,
+			0x62, 0xe8, 0xa4, 0xe5, 0xcf, 0xff, 0x35, 0x55,
+			0x36, 0x2e, 0x3a, 0xe4, 0x45, 0x6a, 0x80, 0xf2,
+			0xca, 0xe7, 0x40, 0x79, 0x14, 0xc4, 0x62, 0x38,
+			0xbb, 0xd0, 0x4e, 0x6c, 0xb5, 0x85, 0x42, 0x3f,
+			0x35, 0xf7, 0xd7, 0x54, 0xb8, 0x2b, 0x8b, 0xd5,
+			0x6f, 0x16, 0x61, 0x27, 0x23, 0xac, 0xdb, 0xea,
+			0x9b, 0x3b, 0x99, 0xcd, 0x79, 0xe6, 0x12, 0x09,
+			0x99, 0x09, 0xa4, 0xe1, 0x88, 0x25, 0x00, 0x9e,
+			0x60, 0x16, 0x63, 0xd7, 0x42, 0x9b, 0xcc, 0x36,
+			0x9a, 0x8d, 0xa3, 0x75, 0x36, 0xa1, 0xa8, 0xfc,
+			0xa2, 0xfe, 0x29, 0x26, 0x4c, 0x93, 0x21, 0x44,
+			0x6b, 0x1c, 0xba, 0xbd, 0xef, 0xff, 0x6d, 0x1f,
+			0x2b, 0x6c, 0x66, 0x81, 0x9a, 0x3a, 0x1d, 0x0b,
+			0xd7, 0x24, 0xd4, 0xb8, 0x93, 0xb5, 0x22, 0xf9,
+			0xd2, 0xf4, 0xa5, 0x05, 0x78, 0x38, 0xae, 0x58,
+			0xf6, 0x50, 0x8f, 0x47, 0x1d, 0xf3, 0xfb, 0x0d,
+			0x04, 0x14, 0xd1, 0xd6, 0xd8, 0x2e, 0xf2, 0xbd,
+			0xf5, 0x71, 0x86, 0x4c, 0xdd, 0x61, 0x24, 0x18,
+			0x5b, 0x54, 0xf5, 0xcd, 0x99, 0x89, 0x01, 0x8e,
+			0xd1, 0x19, 0x52, 0xbc, 0x45, 0xed, 0x0e, 0xec,
+			0x72, 0x2f, 0x5a, 0xe7, 0xdf, 0x36, 0x1c, 0x57,
+			0x9f, 0xb2, 0x8b, 0xf2, 0x78, 0x1b, 0x3e, 0xc5,
+			0x48, 0x1f, 0x27, 0x04, 0x76, 0x10, 0x44, 0xee,
+			0x5c, 0x68, 0x8f, 0xca, 0xd7, 0x31, 0xfc, 0x5c,
+			0x40, 0x03, 0x2e, 0xbd, 0x1d, 0x59, 0x13, 0x57,
+			0xbc, 0x33, 0xc6, 0xa1, 0xa3, 0xe5, 0x55, 0x79,
+			0x9b, 0x7e, 0x49, 0xbb, 0x23, 0x96, 0xc3, 0x1c,
+			0xfe, 0x66, 0xeb, 0x5b, 0x5f, 0xe5, 0x03, 0xc9,
+			0xa4, 0xac, 0x4d, 0xc4, 0x50, 0xbb, 0xd3, 0xc1,
+			0x91, 0x48, 0xe0, 0x93, 0x92, 0x2a, 0xdb, 0x41,
+			0x37, 0x98, 0xbc, 0xa2, 0x7a, 0x09, 0x92, 0x0b,
+			0x1c, 0xe6, 0x4b, 0x1e, 0x8e, 0x78, 0x81, 0x74,
+			0x7d, 0x6b, 0x71, 0xd5, 0xe7, 0x0e, 0x7b, 0xc2,
+			0x74, 0x5d, 0x89, 0xf1, 0xfa, 0x59, 0xaa, 0xf7,
+			0x86, 0x66, 0x7e, 0xc2, 0x9c, 0xf4, 0xd5, 0x8d,
+			0xc0, 0xb7, 0xb7, 0xa2, 0xd5, 0xcd, 0x51, 0xc3,
+			0x7d, 0xa9, 0x5e, 0x46, 0xba, 0x06, 0xa3, 0x4d,
+			0x60, 0xd6, 0x68, 0xc6, 0xf9, 0x63, 0x88, 0x17,
+			0x5c, 0x20, 0xe1, 0xc4, 0x0f, 0x3f, 0xc1, 0xa9,
+			0xa7, 0x3e, 0x39, 0xef, 0x2f, 0xaf, 0xc4, 0x69,
+			0x29, 0xe3, 0xd4, 0x8d, 0xe0, 0x0e, 0x88, 0xc2,
+			0x93, 0x43, 0xfb, 0x28, 0xcf, 0x5d, 0x85, 0x50,
+			0xf7, 0xeb, 0x42, 0xf5, 0x87, 0xde, 0xa5, 0x65,
+			0xef, 0x43, 0x0c, 0x57, 0x76, 0x09, 0xf4, 0x5f,
+			0xde, 0x81, 0x0a, 0xd9, 0x59, 0x41, 0xa4, 0x6a,
+			0xb7, 0x05, 0xc7, 0xa5, 0xfe, 0x49, 0xd5, 0x9b,
+			0x57, 0x13, 0x14, 0x66, 0xe2, 0xb9, 0xcc, 0x09,
+			0x35, 0xd4, 0xb0, 0xe0, 0xd1, 0x0d, 0x7e, 0x50,
+			0x48, 0x45, 0x21, 0x00, 0x67, 0xb2, 0xad, 0xa7,
+			0x46, 0xe2, 0x6f, 0x70, 0xe5, 0x3c, 0x88, 0x04,
+			0xaa, 0x21, 0xde, 0x03, 0xb6, 0x6f, 0xfe, 0x43,
+			0x51, 0xdc, 0x2e, 0x5c, 0x6c, 0x77, 0x8f, 0x8e,
+			0x9d, 0x1a, 0x5b, 0x35, 0xc5, 0xe4, 0x48, 0x82,
+			0x17, 0x4b, 0xf0, 0xea, 0xc9, 0x0e, 0xd2, 0x8f,
+			0xcd, 0xd5, 0x01, 0xbd, 0x7f, 0x0f, 0xf5, 0xae,
+			0x92, 0x28, 0x1e, 0x2c, 0xf4, 0xe9, 0x03, 0xf7,
+			0x0a, 0xeb, 0x84, 0x18, 0xa1, 0x37, 0x38, 0x8a,
+			0x11, 0xa2, 0x5d, 0x8c, 0xf6, 0xe4, 0x3f, 0x5b,
+			0x87, 0x07, 0x6b, 0xb4, 0x07, 0xe0, 0x8f, 0x30,
+			0xc4, 0xfa, 0x27, 0xae, 0xfc, 0x02, 0xd1, 0x21,
+			0x5c, 0xbc, 0x0b, 0x93, 0x6e, 0x7e, 0xf9, 0x6b,
+			0x80, 0x7a, 0x25, 0x84, 0x20, 0xf1, 0x6a, 0xfa,
+			0x75, 0xed, 0x57, 0x61, 0x62, 0xa7, 0xf6, 0x5b,
+			0xe1, 0xb0, 0x38, 0xc8, 0xe9, 0x6d, 0x3f, 0xef,
+			0x1e, 0x99, 0x0b, 0xb7, 0xc8, 0x9f, 0x76, 0x5c,
+			0x04, 0x1f, 0x02, 0x92, 0x00, 0xa7, 0x38, 0x3d,
+			0x00, 0x3b, 0xa7, 0xbc, 0x39, 0x6e, 0xab, 0xf5,
+			0x10, 0xa8, 0xba, 0xd6, 0x28, 0x6b, 0x0e, 0x00,
+			0x48, 0xf9, 0x3b, 0x5c, 0xde, 0x59, 0x93, 0x46,
+			0xd6, 0x61, 0x52, 0x81, 0x71, 0x0f, 0x0e, 0x61,
+			0xac, 0xc6, 0x7f, 0x15, 0x93, 0xa7, 0xc1, 0x16,
+			0xb5, 0xef, 0x85, 0xd1, 0xa7, 0x61, 0xc2, 0x85,
+			0x1d, 0x61, 0xc6, 0xae, 0xb3, 0x9e, 0x8d, 0x23,
+			0xa3, 0xc8, 0xd5, 0xf2, 0xc7, 0x1b, 0x7e, 0xef,
+			0xd2, 0xdf, 0x25, 0xaf, 0x4e, 0x81, 0x15, 0x59,
+			0xe5, 0x36, 0xb1, 0xf1, 0xd5, 0xda, 0x58, 0xd8,
+			0xd9, 0x0d, 0x6d, 0xc9, 0x25, 0xb5, 0xe8, 0x1d,
+			0x3b, 0xca, 0x2d, 0xab, 0xf2, 0xe2, 0xe9, 0x55,
+			0xd7, 0xf4, 0xc7, 0xd0, 0x57, 0x7a, 0x86, 0x15,
+			0x0a, 0x5a, 0x8b, 0xd7, 0x3f, 0x66, 0x0f, 0x80,
+			0xb4, 0xe0, 0x5c, 0x33, 0xed, 0xaf, 0x1b, 0x3b,
+			0x6d, 0x1c, 0xd9, 0x8c, 0xb5, 0x96, 0xa3, 0xfb,
+			0xcf, 0xcc, 0x97, 0x1c, 0xae, 0x06, 0x19, 0x41,
+			0x61, 0xf8, 0x97, 0x6b, 0x82, 0x5e, 0x1c, 0xbf,
+			0x6f, 0x43, 0x3d, 0xe5, 0x00, 0xf5, 0xfe, 0x66,
+			0x48, 0x26, 0x31, 0xa1, 0x72, 0x67, 0x6e, 0xd4,
+			0x5b, 0x6f, 0x66, 0xde, 0x70, 0x8b, 0x2b, 0xc3,
+			0xa2, 0x30, 0xe9, 0x55, 0xc8, 0xff, 0xf8, 0xd0,
+			0xdd, 0xa9, 0x21, 0x85, 0x6e, 0x6c, 0x82, 0x66,
+			0xcc, 0x52, 0xf0, 0x9e, 0x1e, 0xb5, 0x3a, 0xff,
+			0x4c, 0xf3, 0xae, 0x02, 0xc3, 0x4b, 0x76, 0x25,
+			0xbd, 0xb0, 0x21, 0x54, 0x61, 0xda, 0x16, 0xd3,
+			0x23, 0x86, 0x41, 0xa1, 0x4c, 0x59, 0x15, 0x95,
+			0x65, 0x85, 0xb6, 0x8e, 0xa6, 0x37, 0xc0, 0xa2,
+			0x71, 0x1d, 0x67, 0x44, 0x7b, 0xe5, 0x4c, 0x4f,
+			0xb6, 0x2c, 0x46, 0xf7, 0x29, 0xa5, 0xf2, 0xd3,
+			0x51, 0x19, 0x91, 0x4d, 0xa7, 0xb5, 0x05, 0xb9,
+			0x6e, 0x61, 0x6e, 0xf8, 0xc0, 0x01, 0xe5, 0x41,
+			0x0a, 0x89, 0x64, 0x77, 0xf2, 0xc8, 0x63, 0x2d,
+			0x9d, 0x27, 0x7f, 0x47, 0x30, 0x39, 0xdf, 0xb6,
+			0x6e, 0x4f, 0x00, 0x3f, 0x15, 0xc6, 0xaf, 0x62,
+			0xdf, 0x3f, 0x47, 0xe8, 0x42, 0x90, 0x77, 0x23,
+			0x7a, 0xaa, 0x99, 0x53, 0x03, 0x63, 0x60, 0x59,
+			0x07, 0x52, 0x3c, 0xb5, 0x67, 0x59, 0xfe, 0x08,
+			0xe6, 0x43, 0x0f, 0x3b, 0x08, 0x7c, 0xc7, 0x07,
+			0x3c, 0xfa, 0x65, 0xea, 0x69, 0x51, 0x41, 0x31,
+			0xb3, 0x05, 0x69, 0xba, 0x2c, 0xbf, 0x89, 0x25,
+			0x9e, 0xfe, 0x07, 0x13, 0x78, 0x0e, 0x16, 0x54,
+			0xdf, 0x23, 0xdf, 0x10, 0x69, 0x79, 0xd0, 0x33,
+			0xd7, 0x21, 0x8b, 0xc8, 0x2a, 0xd0, 0x74, 0x0a,
+			0xfa, 0xb1, 0x6f, 0xa3, 0xcb, 0x1d, 0xca, 0x4f,
+			0x00, 0x46, 0x6c, 0x42, 0x09, 0xe0, 0x30, 0x89,
+			0x08, 0x33, 0x9b, 0x7b, 0x7b, 0x0f, 0x69, 0x5c,
+			0x0d, 0x34, 0x91, 0xfc, 0xfe, 0x22, 0x82, 0x02,
+			0xcd, 0xfa, 0x97, 0xe8, 0x28, 0x1d, 0xbc, 0x13,
+			0x0b, 0xfd, 0x47, 0xa1, 0x7e, 0xa2, 0x86, 0x4d,
+			0x6f, 0x12, 0x51, 0x35, 0x7d, 0x76, 0x8a, 0x58,
+			0x05, 0xb6, 0x39, 0xa1, 0x2f, 0xd7, 0xda, 0xaf,
+			0x00, 0xa0, 0x1a, 0x94, 0xd8, 0x23, 0x34, 0x99,
+			0x5c, 0xaf, 0xcc, 0x15, 0x4b, 0x56, 0xb2, 0xd2,
+			0x81, 0x07, 0xd3, 0xf3, 0x47, 0xa2, 0x45, 0x93,
+			0xcb, 0xae, 0xa7, 0x6b, 0x3f, 0xf9, 0xea, 0xfc,
+			0x0e, 0x64, 0xf2, 0x93, 0x7f, 0x24, 0x22, 0x73,
+			0x86, 0xc7, 0x2d, 0x75, 0x9b, 0x41, 0x8b, 0xfb,
+			0x3b, 0x26, 0x2a, 0xe5, 0x0b, 0xd4, 0x00, 0xe3,
+			0x2c, 0x69, 0x49, 0x62, 0x6c, 0x13, 0x58, 0x6e,
+			0xac, 0x43, 0xe5, 0x2b, 0x3b, 0x88, 0xdc, 0xd4,
+			0x41, 0xe8, 0xee, 0x4e, 0xc3, 0x28, 0x91, 0x17,
+			0x9a, 0x5a, 0xdb, 0x80, 0x8b, 0x4d, 0x64, 0xcc,
+			0xbe, 0x66, 0xa4, 0x62, 0xfb, 0x13, 0x44, 0x10,
+			0xd9, 0xe4, 0xd5, 0xa5, 0xae, 0x9e, 0x42, 0x50,
+			0xfc, 0x78, 0xad, 0xfa, 0xc4, 0xd0, 0x5a, 0x60,
+			0x9b, 0x45, 0x2b, 0x61, 0x5c, 0x57, 0xb5, 0x92,
+			0x28, 0xe9, 0xf5, 0x35, 0x67, 0xc1, 0x5e, 0xa8,
+			0x1c, 0x99, 0x36, 0x38, 0xb8, 0x5c, 0xff, 0x3d,
+			0xa0, 0xfc, 0xb0, 0xbc, 0x3d, 0x2c, 0xb4, 0x36,
+			0x17, 0xb4, 0x6d, 0xb5, 0x39, 0x45, 0xa9, 0x2a,
+			0x6b, 0xa2, 0x24, 0x44, 0x30, 0xab, 0x2c, 0x82,
+			0x36, 0xdc, 0xd6, 0x36, 0x5d, 0x0a, 0xdc, 0xee,
+			0x0f, 0x2b, 0x28, 0x99, 0xdc, 0x67, 0x0d, 0xea,
+			0x6e, 0x42, 0xb9, 0x45, 0x7f, 0xd2, 0x96, 0x1e,
+			0x60, 0x42, 0xeb, 0x1e, 0x5f, 0x8e, 0xa9, 0xdc,
+			0xd3, 0x8a, 0xd6, 0xbd, 0x4e, 0x1f, 0x42, 0x75,
+			0x1d, 0xe2, 0xc6, 0x11, 0xc9, 0x80, 0x1f, 0xfe,
+			0x99, 0x52, 0x4d, 0x7b, 0x35, 0xf7, 0xb7, 0xc3,
+			0xee, 0xd6, 0x94, 0xf5, 0x74, 0xa0, 0x69, 0xcd,
+			0x1f, 0x2b, 0xd0, 0x87, 0xf7, 0x8c, 0x69, 0xc5,
+			0x96, 0x70, 0x91, 0xe8, 0x3d, 0xd2, 0xcc, 0xf1,
+			0x4c, 0xcd, 0xe2, 0x14, 0x00, 0x10, 0x4a, 0xd9,
+			0x6a, 0x5d, 0x65, 0x2c, 0x4b, 0x79, 0x0c, 0xc4,
+			0x78, 0x5e, 0xc8, 0xc5, 0x37, 0x74, 0x6d, 0x50,
+			0x5c, 0x34, 0x1f, 0xe0, 0xf4, 0xe3, 0xe1, 0x86,
+			0x68, 0xb1, 0xea, 0x70, 0xf0, 0xae, 0xe4, 0x59,
+			0xa1, 0x08, 0x7e, 0x35, 0xa3, 0x16, 0xd2, 0xb0,
+			0xa3, 0xd4, 0xb0, 0x74, 0x8c, 0x05, 0x79, 0x73,
+			0xfb, 0xe6, 0x65, 0x96, 0x15, 0x07, 0xd5, 0xaf,
+			0x88, 0x9e, 0x6b, 0xf0, 0xbb, 0x3f, 0xe6, 0xd1,
+			0x6a, 0xe7, 0xc9, 0xae, 0xd9, 0xb0, 0x16, 0x1c,
+			0x40, 0xeb, 0xdb, 0xc1, 0xbf, 0x83, 0xdb, 0x8a,
+			0x4f, 0x96, 0xca, 0xd7, 0x22, 0x06, 0x87, 0x08,
+			0x9d, 0x65, 0x2f, 0xd9, 0x8e, 0x95, 0x6c, 0xcc,
+			0xbf, 0x76, 0x2a, 0xea, 0x5c, 0x8e, 0x5b, 0x17,
+			0x0f, 0x75, 0x7b, 0xfa, 0xf9, 0xfb, 0xaa, 0x92,
+			0xc7, 0x7e, 0x63, 0x63, 0x54, 0xa4, 0xff, 0xf6,
+			0xc0, 0xc0, 0xf5, 0x70, 0xd8, 0xe3, 0xa4, 0x79,
+			0x16, 0xf0, 0x6f, 0x90, 0x5e, 0xb7, 0xab, 0x6f,
+			0xab, 0x75, 0x3b, 0xe1, 0x4c, 0xa8, 0x0b, 0x72,
+			0x5f, 0x5f, 0x11, 0x22, 0x36, 0x71, 0x20, 0xd3,
+			0x5b, 0x5e, 0x07, 0x06, 0x76, 0x1a, 0xcc, 0x5e,
+			0x7c, 0x97, 0x7d, 0xb2, 0x6b, 0xf8, 0x39, 0x89,
+			0x37, 0xb6, 0x6d, 0xea, 0x74, 0x57, 0x28, 0xd7,
+			0x0e, 0x9b, 0xeb, 0x28, 0x88, 0x90, 0xfd, 0x2d,
+			0x16, 0x21, 0x74, 0x26, 0xc5, 0xb8, 0x44, 0xad,
+			0x9f, 0x97, 0xf9, 0x65, 0x36, 0xd8, 0x00, 0x59,
+			0x17, 0x49, 0xf9, 0xc7, 0xb3, 0x84, 0xb9, 0xe2,
+			0x95, 0xe0, 0xd1, 0x7f, 0x5f, 0xaa, 0xd7, 0xfd,
+			0x6a, 0x6a, 0x83, 0x14, 0x46, 0x1d, 0x12, 0x8d,
+			0x09, 0xc3, 0xa5, 0xca, 0x72, 0xa3, 0x25, 0x65,
+			0xb6, 0x40, 0x25, 0x04, 0x51, 0xab, 0x22, 0xeb,
+			0xd7, 0x69, 0xc9, 0x22, 0x9c, 0xa0, 0x19, 0x5c,
+			0x1a, 0xfd, 0x41, 0x8f, 0x98, 0xc5, 0x71, 0xb8,
+			0x6f, 0x76, 0xae, 0xfa, 0x9b, 0x03, 0xab, 0x43,
+			0x81, 0x3b, 0x66, 0xae, 0xf0, 0xd2, 0xb7, 0xee,
+			0x9a, 0xe3, 0xae, 0x45, 0xc1, 0x86, 0xb0, 0xce,
+			0x9e, 0x2b, 0xec, 0xb8, 0xcf, 0xca, 0x0e, 0x8c,
+			0x33, 0xfa, 0xa7, 0xef, 0xf7, 0xfc, 0xa1, 0x41,
+			0x49, 0xd3, 0x6d, 0xb5, 0x58, 0xe4, 0x0e, 0x24,
+			0xd2, 0x8a, 0x74, 0xc9, 0x56, 0x2e, 0x53, 0xc7,
+			0x7a, 0x38, 0x0f, 0x4b, 0xd9, 0xf9, 0x2f, 0xfa,
+			0x7d, 0xee, 0x14, 0x18, 0xce, 0x75, 0x42, 0x6c,
+			0x03, 0x34, 0xce, 0x80, 0xec, 0xf2, 0x05, 0xf0,
+			0xdf, 0xcd, 0xf8, 0xdb, 0x26, 0x7d, 0xb6, 0x3d,
+			0x28, 0x24, 0x7e, 0x7e, 0x39, 0x9f, 0xa6, 0xc6,
+			0xeb, 0x2a, 0xc8, 0x17, 0x94, 0xa9, 0x89, 0xf5,
+			0xdf, 0xcb, 0x77, 0xfd, 0xc9, 0x9e, 0x68, 0x98,
+			0x7d, 0x04, 0x50, 0x3c, 0x64, 0x1d, 0x66, 0xb0,
+			0x97, 0x06, 0xb6, 0x08, 0x5b, 0xe4, 0x17, 0x44,
+			0xd6, 0x94, 0x39, 0x6b, 0x03, 0x2c, 0xcb, 0x5a,
+			0x8d, 0x86, 0x08, 0x23, 0x4f, 0x95, 0xa8, 0x1a,
+			},
+		.msg_len = 64,
+		.msg = (const u8[64]){
+			0x1a, 0x84, 0x21, 0x0d, 0x35, 0x7a, 0x88, 0xc8,
+			0x6a, 0x11, 0xe3, 0x15, 0x24, 0xec, 0x0d, 0x2e,
+			0x76, 0xb9, 0xcf, 0x2b, 0x04, 0x25, 0x16, 0xae,
+			0x62, 0x42, 0xa0, 0x20, 0x68, 0x25, 0x3e, 0xb4,
+			0x75, 0xa7, 0x1d, 0x64, 0xc3, 0xd1, 0x08, 0x07,
+			0x67, 0xb6, 0xf7, 0x76, 0x76, 0xf6, 0xd6, 0x62,
+			0x66, 0x04, 0x89, 0x0c, 0x8f, 0x07, 0xac, 0xc8,
+			0x51, 0x77, 0xd9, 0x47, 0x5e, 0xb5, 0x22, 0x20,
+			},
+		.sig_len = DILITHIUM65_CRYPTO_BYTES,
+		.sig = (const u8[DILITHIUM65_CRYPTO_BYTES]){
+			0xda, 0xcf, 0x8d, 0x67, 0x59, 0x60, 0x6c, 0x39,
+			0x2d, 0x89, 0xb6, 0xa1, 0xf3, 0x8c, 0x70, 0xcf,
+			0x25, 0x86, 0x21, 0xa1, 0x9f, 0x20, 0x9e, 0xf5,
+			0xd2, 0xdd, 0xbd, 0x99, 0xfa, 0xe4, 0xab, 0x77,
+			0x31, 0x65, 0x18, 0xa1, 0xd1, 0x3f, 0x21, 0x70,
+			0x36, 0xe1, 0xf9, 0x5c, 0x28, 0xb6, 0x7d, 0x34,
+			0xae, 0x66, 0xc9, 0x1c, 0x8e, 0xc6, 0xf9, 0x45,
+			0x8c, 0xa9, 0xb2, 0xfb, 0x0f, 0x5b, 0xb8, 0xf9,
+			0xf5, 0xe2, 0x37, 0x79, 0x12, 0xda, 0xa7, 0x72,
+			0x9e, 0x0d, 0xf8, 0x88, 0x5b, 0x34, 0x49, 0x6c,
+			0xed, 0xa3, 0x7f, 0x86, 0xd3, 0xd9, 0x2f, 0x44,
+			0x08, 0x0d, 0xb7, 0xdb, 0x4a, 0xce, 0x02, 0x14,
+			0x02, 0xd6, 0x40, 0x75, 0xe3, 0xc0, 0x97, 0xfc,
+			0x6c, 0x6a, 0x88, 0x29, 0x0c, 0xe2, 0x3a, 0x2b,
+			0x28, 0x82, 0x8f, 0x27, 0x09, 0x69, 0x91, 0xc6,
+			0xc3, 0xb7, 0x07, 0x61, 0x86, 0x8d, 0x89, 0x8a,
+			0xd5, 0x00, 0x3b, 0x4b, 0xfc, 0x6f, 0xb3, 0x3f,
+			0x4c, 0x93, 0x31, 0xfc, 0x88, 0x53, 0x26, 0xea,
+			0xe5, 0x3a, 0xfc, 0xc1, 0x59, 0x16, 0xf0, 0xb7,
+			0xac, 0xde, 0x1e, 0xd8, 0x74, 0x85, 0x72, 0xd9,
+			0xbb, 0xbe, 0x76, 0x32, 0x25, 0x9d, 0x21, 0xbc,
+			0xfd, 0x8d, 0x32, 0xfe, 0xae, 0x24, 0xe5, 0x4a,
+			0xcc, 0x5d, 0x15, 0x23, 0xd3, 0x57, 0xe7, 0xa9,
+			0x2c, 0x31, 0xd7, 0xc5, 0x6b, 0x70, 0x6c, 0x22,
+			0x5a, 0x13, 0x1f, 0x76, 0x13, 0x78, 0x6f, 0xac,
+			0x42, 0x4c, 0x46, 0x81, 0xa2, 0x20, 0x91, 0x30,
+			0xed, 0xcb, 0x90, 0xfe, 0x3c, 0xa3, 0xc7, 0xb4,
+			0x1f, 0x21, 0x1d, 0x98, 0x74, 0x6a, 0x3e, 0xc8,
+			0xcc, 0xd2, 0x68, 0x87, 0x69, 0xa9, 0xdf, 0x50,
+			0xd5, 0x0a, 0x8e, 0x10, 0x54, 0xab, 0xea, 0x65,
+			0x2a, 0x52, 0xd7, 0x22, 0xae, 0x2f, 0x1e, 0xc3,
+			0x16, 0x58, 0x20, 0x18, 0x6d, 0x35, 0x46, 0x31,
+			0x43, 0x5d, 0x62, 0xfb, 0xb1, 0x47, 0x32, 0xfa,
+			0x14, 0xcc, 0x51, 0xa3, 0xcd, 0x99, 0x4f, 0x97,
+			0x0f, 0xca, 0x24, 0x93, 0x17, 0xea, 0xa3, 0xf3,
+			0x1f, 0xbe, 0xb5, 0xa3, 0xac, 0x80, 0xcc, 0x20,
+			0x3b, 0xa6, 0xd3, 0x32, 0x72, 0x4e, 0xd9, 0x25,
+			0xf9, 0xc2, 0x24, 0x15, 0xbd, 0x1e, 0x1e, 0x41,
+			0x8c, 0x18, 0x8c, 0x58, 0xe8, 0x75, 0x20, 0xff,
+			0xa3, 0xf4, 0xd4, 0xab, 0x75, 0x78, 0x4e, 0xbb,
+			0x7c, 0x94, 0x93, 0x28, 0x5b, 0x07, 0x3a, 0x3c,
+			0xc9, 0xf1, 0x55, 0x3e, 0x33, 0xed, 0xf8, 0x72,
+			0x55, 0xab, 0x5a, 0xea, 0xbe, 0x65, 0xfa, 0x81,
+			0x50, 0xc0, 0x9d, 0x2d, 0xfb, 0x04, 0x25, 0x7c,
+			0xb9, 0xee, 0xe2, 0xa3, 0x00, 0x44, 0xd3, 0x9d,
+			0xee, 0x4f, 0x80, 0x77, 0xfb, 0x26, 0x6b, 0x07,
+			0xd0, 0xff, 0x82, 0x39, 0x0e, 0x2b, 0x47, 0xa3,
+			0xe7, 0x3e, 0xc5, 0x4e, 0x15, 0x8a, 0x48, 0x28,
+			0xfb, 0xf7, 0xa4, 0x86, 0xfb, 0x77, 0x60, 0xcd,
+			0xc5, 0x68, 0x96, 0xd7, 0x4c, 0x3c, 0xf2, 0x51,
+			0x71, 0x79, 0x2e, 0x2e, 0x57, 0x10, 0xa7, 0xfc,
+			0xd1, 0xd4, 0x61, 0x71, 0x81, 0x85, 0x74, 0x09,
+			0x7d, 0x80, 0xd0, 0xc2, 0xe9, 0xff, 0xb7, 0x88,
+			0x53, 0x74, 0x1e, 0xb0, 0xca, 0x65, 0x48, 0x8e,
+			0xdb, 0x59, 0x3a, 0xcb, 0x80, 0xeb, 0xfd, 0xd2,
+			0xc9, 0x38, 0x43, 0xae, 0x76, 0xf2, 0xbb, 0x51,
+			0xb2, 0xcb, 0xe6, 0x85, 0x31, 0xb5, 0x62, 0xd4,
+			0x5e, 0x48, 0x08, 0xf1, 0x40, 0x5b, 0x16, 0x83,
+			0x5e, 0xa5, 0x9c, 0x6b, 0x91, 0x49, 0x44, 0xff,
+			0x3b, 0xa9, 0x2b, 0xf3, 0x06, 0x33, 0x9e, 0x6e,
+			0x3c, 0x66, 0x7e, 0x27, 0xa2, 0x59, 0x7b, 0xe3,
+			0xb6, 0xb4, 0x28, 0xeb, 0x93, 0x35, 0x87, 0xac,
+			0x0e, 0x0b, 0x7e, 0xbc, 0x35, 0x28, 0x72, 0x1f,
+			0x26, 0x59, 0xd0, 0x1f, 0x63, 0xe4, 0x86, 0x5d,
+			0x70, 0xf3, 0xa8, 0xa4, 0xb8, 0xcd, 0xb3, 0xf8,
+			0x8d, 0xaa, 0x41, 0xd2, 0xcc, 0x0b, 0x15, 0x66,
+			0x22, 0x83, 0x92, 0xe3, 0x0b, 0xf9, 0xea, 0xa0,
+			0x33, 0xa1, 0x4e, 0x92, 0xae, 0x81, 0x95, 0xa4,
+			0x58, 0x3f, 0xa9, 0x15, 0x52, 0xf9, 0xda, 0xb7,
+			0x10, 0x8d, 0xc6, 0xab, 0x77, 0xe9, 0xbe, 0xad,
+			0xc9, 0x3a, 0x6a, 0x8d, 0x92, 0x6c, 0x69, 0xff,
+			0x31, 0x49, 0x25, 0x04, 0xc8, 0x93, 0x6f, 0xc8,
+			0xe7, 0x60, 0x7a, 0x76, 0xb5, 0xc1, 0x07, 0xef,
+			0xa3, 0x39, 0xa6, 0xf2, 0x36, 0x04, 0xde, 0x3c,
+			0x4a, 0x4e, 0x96, 0xbd, 0x64, 0x26, 0x80, 0x01,
+			0x88, 0x47, 0xd2, 0xa4, 0x46, 0xcd, 0xe1, 0x30,
+			0x7f, 0xa3, 0x00, 0x11, 0x38, 0x55, 0xfa, 0xeb,
+			0x10, 0xeb, 0xa0, 0x65, 0x04, 0x09, 0xc8, 0xde,
+			0x9c, 0x73, 0xba, 0x0c, 0xbd, 0xd3, 0xa5, 0x84,
+			0x5e, 0xb9, 0x3b, 0xd4, 0x94, 0xbd, 0xa6, 0x53,
+			0xbe, 0x93, 0x69, 0x3e, 0xaa, 0x32, 0x31, 0x06,
+			0xc8, 0x1b, 0x4a, 0x48, 0xb5, 0x17, 0x85, 0xbf,
+			0x72, 0xec, 0xf5, 0x29, 0x8a, 0xd8, 0xeb, 0x99,
+			0x8b, 0x74, 0x84, 0x57, 0x8c, 0xe1, 0x85, 0x94,
+			0xa0, 0xbc, 0x7a, 0x14, 0xf0, 0xf4, 0x8b, 0x25,
+			0x37, 0x43, 0xa1, 0x34, 0x09, 0x71, 0xca, 0x5c,
+			0x9f, 0x08, 0x38, 0xd9, 0x9c, 0x0c, 0x0e, 0xcb,
+			0xe4, 0xad, 0x4b, 0x2a, 0x89, 0x67, 0xf8, 0x29,
+			0x6c, 0x69, 0x0e, 0x5d, 0xca, 0xfa, 0xa6, 0x6b,
+			0x0e, 0xb5, 0x94, 0x17, 0x71, 0xf0, 0xc9, 0xcd,
+			0x02, 0x1d, 0xa5, 0xd5, 0xc6, 0xa7, 0xbc, 0x5f,
+			0x6e, 0x67, 0x43, 0x68, 0xce, 0xac, 0x54, 0x81,
+			0x2a, 0x25, 0x22, 0x52, 0x35, 0xad, 0x7b, 0xd5,
+			0x06, 0x8c, 0x00, 0xfb, 0xca, 0xc4, 0x0a, 0x49,
+			0x1e, 0xc8, 0xeb, 0x77, 0xc1, 0x63, 0x23, 0x96,
+			0xbd, 0x35, 0xfa, 0x13, 0xae, 0xbf, 0x1d, 0x1e,
+			0x69, 0x8d, 0xb3, 0xe3, 0x07, 0xde, 0x4e, 0xd0,
+			0x12, 0xa9, 0xc3, 0x36, 0x30, 0x46, 0xef, 0x92,
+			0x76, 0x17, 0x8f, 0x10, 0xe7, 0xba, 0x99, 0x4b,
+			0xdf, 0xad, 0xb8, 0x11, 0x80, 0xdf, 0xe7, 0xfd,
+			0x80, 0x64, 0xf7, 0x2a, 0xac, 0x60, 0x2a, 0x54,
+			0x8f, 0x4f, 0xaf, 0xaf, 0x60, 0xf9, 0x67, 0x20,
+			0x80, 0x53, 0x5c, 0xb6, 0x81, 0xa6, 0x2a, 0x74,
+			0x2d, 0xc5, 0x74, 0x2a, 0x95, 0x26, 0x13, 0x17,
+			0x01, 0xdd, 0x31, 0xac, 0x5a, 0x05, 0xda, 0xde,
+			0xba, 0xf6, 0x37, 0x13, 0x8d, 0xe4, 0xa8, 0x93,
+			0x46, 0x9e, 0xa9, 0x82, 0x24, 0x7e, 0xc8, 0xda,
+			0x63, 0x89, 0xcd, 0x33, 0xc9, 0xf7, 0xf9, 0x71,
+			0x35, 0xe6, 0xa5, 0x5f, 0x6b, 0x3b, 0xbb, 0x0c,
+			0xe0, 0xa4, 0x0b, 0xe3, 0x29, 0xc0, 0xae, 0x8e,
+			0xce, 0x03, 0x09, 0x73, 0x0e, 0x1e, 0x9c, 0xe9,
+			0x59, 0xb6, 0x8b, 0x78, 0x67, 0x32, 0x8b, 0xf1,
+			0x93, 0xcc, 0x72, 0x1b, 0x6f, 0xa2, 0xf1, 0x04,
+			0x9c, 0xfa, 0x98, 0x02, 0xca, 0xdf, 0x35, 0x3c,
+			0x38, 0xac, 0xa8, 0xdb, 0x90, 0xae, 0xaa, 0xf9,
+			0x70, 0xfb, 0xed, 0xbd, 0xa6, 0x25, 0x14, 0x58,
+			0x09, 0x8a, 0x36, 0xaf, 0x41, 0x09, 0x19, 0xcb,
+			0xd3, 0x25, 0x5d, 0x0e, 0xe6, 0x20, 0x14, 0x71,
+			0x24, 0x79, 0x19, 0x55, 0xaf, 0x51, 0x5b, 0xa4,
+			0xc0, 0x93, 0x9e, 0xdd, 0x88, 0x31, 0x13, 0x96,
+			0xbf, 0xca, 0x0a, 0xd7, 0xbc, 0xc4, 0x00, 0xa1,
+			0x10, 0x2d, 0x92, 0x79, 0xf9, 0x14, 0xdb, 0xd2,
+			0xba, 0x74, 0xfa, 0xa8, 0xe5, 0x40, 0x14, 0xc2,
+			0x56, 0x3c, 0x7f, 0x50, 0x07, 0x60, 0x86, 0x93,
+			0x51, 0x2e, 0xf9, 0x70, 0x61, 0x70, 0x0e, 0xa4,
+			0x87, 0x75, 0xcc, 0x6c, 0x72, 0xb7, 0x68, 0x23,
+			0xb7, 0x3d, 0x76, 0xaf, 0x96, 0x9b, 0x4a, 0xe5,
+			0x12, 0x28, 0x4a, 0x8f, 0x79, 0x34, 0xff, 0xec,
+			0x92, 0xeb, 0x6b, 0xaf, 0xc9, 0xbd, 0xc1, 0x77,
+			0x07, 0xd0, 0xfa, 0x55, 0x57, 0x10, 0x0c, 0xad,
+			0x29, 0x2a, 0x79, 0xd6, 0x09, 0x9e, 0x7d, 0x18,
+			0xd4, 0xd6, 0xdd, 0x72, 0x1a, 0x8f, 0x24, 0x11,
+			0x70, 0xd2, 0x52, 0x36, 0x0f, 0x38, 0x79, 0x38,
+			0x4a, 0x02, 0x4f, 0x73, 0x2a, 0xaa, 0x6a, 0xb5,
+			0x0c, 0x72, 0x32, 0x85, 0x21, 0x76, 0x1a, 0x8a,
+			0x7d, 0x51, 0x0e, 0xf1, 0xf9, 0x19, 0xfa, 0x6b,
+			0x9b, 0x22, 0x71, 0x8c, 0x13, 0xcc, 0xba, 0x7d,
+			0xee, 0xd8, 0x34, 0xf6, 0x85, 0x60, 0xe1, 0xe4,
+			0x59, 0x6e, 0x32, 0x60, 0xd9, 0xfa, 0xb7, 0x56,
+			0x54, 0x25, 0xd1, 0x73, 0x6a, 0xf2, 0xa0, 0xc7,
+			0xa0, 0x67, 0x10, 0x89, 0x9c, 0x27, 0x5f, 0x7f,
+			0x2e, 0x5a, 0x29, 0x70, 0x7a, 0x7b, 0xaf, 0x21,
+			0xd0, 0xf4, 0x06, 0xb9, 0x2d, 0xf1, 0xb8, 0x32,
+			0xed, 0xc5, 0xc9, 0xac, 0x2f, 0x54, 0x0a, 0xf9,
+			0x08, 0x39, 0x39, 0x7d, 0x1d, 0xaf, 0xb4, 0x5f,
+			0x4d, 0x75, 0xc3, 0xe8, 0x52, 0x3a, 0x47, 0x72,
+			0x2c, 0xa9, 0x2d, 0xcb, 0x74, 0x06, 0xfe, 0x69,
+			0xd3, 0xf3, 0x1a, 0xb2, 0xd3, 0x01, 0xed, 0x6c,
+			0xc1, 0xca, 0x4f, 0xaf, 0x11, 0x9b, 0xa2, 0x27,
+			0x2a, 0x59, 0x56, 0x58, 0xdf, 0x79, 0x8b, 0xc9,
+			0x87, 0xe9, 0x58, 0x81, 0x48, 0xc6, 0xb6, 0x7d,
+			0x60, 0x54, 0x87, 0x9c, 0x61, 0xbb, 0x4b, 0xbb,
+			0x61, 0xac, 0x0a, 0x5a, 0x66, 0x7e, 0x70, 0x8b,
+			0xfd, 0x92, 0x76, 0x4a, 0xa9, 0xa5, 0xc3, 0xf4,
+			0xf2, 0x93, 0x48, 0xc4, 0xf3, 0x91, 0x2b, 0x60,
+			0x04, 0x0e, 0xb0, 0x6b, 0x60, 0x5e, 0xf0, 0xf1,
+			0x54, 0x41, 0x56, 0xdc, 0x25, 0x57, 0xc3, 0xb6,
+			0x0b, 0x5e, 0x15, 0xb5, 0x2a, 0x36, 0x4f, 0xe7,
+			0x1d, 0x70, 0xa8, 0xa7, 0xec, 0xd6, 0x74, 0xba,
+			0xa4, 0x79, 0x83, 0x7c, 0x9e, 0x1a, 0x5d, 0x32,
+			0xc8, 0xcb, 0x41, 0xca, 0x04, 0xec, 0x0b, 0x18,
+			0x54, 0xe1, 0x67, 0xbf, 0xa8, 0x7a, 0xc3, 0x0f,
+			0x27, 0x2a, 0xaf, 0x2a, 0x41, 0x19, 0x1f, 0xe8,
+			0xa2, 0xe8, 0xfa, 0xfc, 0x88, 0x41, 0x46, 0xc3,
+			0x1c, 0x44, 0xe5, 0xee, 0x47, 0xec, 0xfe, 0xbf,
+			0xb8, 0x29, 0x2e, 0xae, 0x47, 0x0a, 0x42, 0x69,
+			0x8a, 0x9a, 0x94, 0x97, 0x9e, 0xf5, 0xb6, 0x37,
+			0x1c, 0x10, 0xc2, 0x99, 0xa8, 0xe9, 0x9e, 0x0e,
+			0x6e, 0xb5, 0xbe, 0xba, 0x1f, 0x77, 0xa6, 0x35,
+			0x02, 0x1e, 0x8c, 0xe6, 0x02, 0x53, 0xe2, 0x9a,
+			0xdd, 0x09, 0x6e, 0x9b, 0x7a, 0x36, 0x4f, 0x38,
+			0x8d, 0x4c, 0xa4, 0xb4, 0xff, 0x90, 0x76, 0x0d,
+			0x11, 0x7d, 0xe1, 0xe9, 0x7f, 0x2a, 0x4a, 0x80,
+			0xe0, 0xd8, 0x3c, 0x23, 0xd2, 0xa5, 0xe5, 0x39,
+			0x77, 0xbf, 0x3d, 0x71, 0x0d, 0x45, 0xbb, 0x39,
+			0x66, 0x1a, 0x4d, 0x59, 0xb7, 0xd0, 0x0a, 0xee,
+			0x87, 0xee, 0x1f, 0xcf, 0x6f, 0xc2, 0x50, 0xb1,
+			0xa5, 0x4c, 0xee, 0x40, 0x69, 0xd7, 0x36, 0x38,
+			0x14, 0xcd, 0x6a, 0x9a, 0x90, 0x40, 0xad, 0x76,
+			0xf1, 0xa6, 0xd4, 0x3c, 0x75, 0x10, 0xba, 0xcb,
+			0xab, 0x22, 0x28, 0x5f, 0x0c, 0xe0, 0xee, 0xf4,
+			0xfd, 0x61, 0x52, 0x0a, 0x59, 0xfe, 0x61, 0xc5,
+			0x40, 0xf9, 0x91, 0x8e, 0x36, 0x29, 0x63, 0x6c,
+			0x6e, 0x45, 0xa5, 0x42, 0xe3, 0x36, 0x90, 0xe7,
+			0x90, 0x9f, 0x58, 0xbb, 0xf9, 0x1b, 0xee, 0x2c,
+			0xbb, 0x3a, 0xfd, 0x3d, 0xbe, 0x3d, 0x45, 0xf0,
+			0xc2, 0x18, 0xaa, 0x46, 0x10, 0x23, 0xe9, 0x63,
+			0xba, 0x7f, 0xc2, 0xe1, 0xf4, 0x05, 0xdd, 0x4a,
+			0x7c, 0xa8, 0xab, 0xa9, 0xbd, 0x6f, 0xdf, 0x48,
+			0x59, 0x11, 0xd4, 0xba, 0x75, 0xb6, 0x22, 0xd4,
+			0xd7, 0x35, 0x6f, 0x27, 0x70, 0xc7, 0x3d, 0x90,
+			0x06, 0x39, 0x2a, 0x16, 0xd0, 0x8b, 0xd7, 0xfb,
+			0x5e, 0x85, 0x2e, 0xb0, 0xd8, 0xc7, 0xdb, 0xe5,
+			0x24, 0x3a, 0x6e, 0xc4, 0x5e, 0xd4, 0x22, 0x25,
+			0x14, 0xee, 0xa5, 0x30, 0x8b, 0xd6, 0x27, 0x61,
+			0x33, 0x13, 0x46, 0x0b, 0x26, 0x45, 0xa6, 0xb4,
+			0xfa, 0x8d, 0xa3, 0xf2, 0x27, 0xd2, 0xc5, 0x04,
+			0xaa, 0x96, 0xa4, 0x55, 0xfa, 0x40, 0xf1, 0xfc,
+			0x66, 0x33, 0x9e, 0x4b, 0x39, 0x75, 0xae, 0x7f,
+			0x52, 0x87, 0x7b, 0x8a, 0xf9, 0x7d, 0x5f, 0x8a,
+			0x7e, 0xf7, 0xfe, 0xc4, 0x7f, 0xf4, 0xf6, 0x9a,
+			0x86, 0x78, 0x21, 0x02, 0x94, 0x9e, 0x50, 0x2d,
+			0xdc, 0xd6, 0xa5, 0x53, 0xf1, 0xef, 0x06, 0xe8,
+			0xb5, 0x46, 0x81, 0xcc, 0x91, 0x4f, 0x37, 0xee,
+			0x27, 0xcb, 0x91, 0xad, 0xff, 0x1d, 0xd1, 0x00,
+			0xa8, 0x96, 0x22, 0xaa, 0x63, 0x23, 0x2a, 0x7a,
+			0x75, 0x6f, 0xe9, 0x2d, 0x26, 0xde, 0x11, 0x97,
+			0x4b, 0x17, 0x3f, 0xde, 0x51, 0x1a, 0x22, 0xed,
+			0x38, 0x6f, 0x3e, 0x7a, 0xd0, 0xd6, 0x60, 0x06,
+			0x7e, 0x3f, 0xa4, 0x29, 0xfa, 0x18, 0x91, 0xda,
+			0x73, 0x38, 0xe3, 0xe3, 0xb5, 0xc0, 0x5b, 0x4e,
+			0xe8, 0x94, 0xea, 0x45, 0x6e, 0x5b, 0x50, 0xaa,
+			0x38, 0xb6, 0x6f, 0xdb, 0x90, 0x1b, 0x3b, 0x82,
+			0xbb, 0x0d, 0x38, 0xe3, 0xca, 0xd9, 0xf1, 0x2e,
+			0x27, 0x4c, 0x2c, 0x5a, 0x42, 0xdf, 0x44, 0xc8,
+			0x07, 0xe4, 0x95, 0xb5, 0xec, 0x91, 0x34, 0x1c,
+			0x9a, 0x0c, 0x50, 0x1a, 0xce, 0x67, 0xe4, 0x4b,
+			0x87, 0x61, 0x43, 0x95, 0x95, 0xb8, 0x8a, 0xf4,
+			0xc9, 0x92, 0x33, 0x33, 0xe3, 0xfe, 0x98, 0x2a,
+			0xae, 0x8e, 0xf2, 0x6b, 0x13, 0x7c, 0xe4, 0x44,
+			0x40, 0x66, 0xea, 0x0c, 0xe4, 0xdb, 0x16, 0x65,
+			0xa8, 0x8b, 0x37, 0x08, 0xec, 0x1e, 0xfc, 0xa6,
+			0xd0, 0x9b, 0x9e, 0x0a, 0xd2, 0xe3, 0xcf, 0x5d,
+			0xb2, 0xaf, 0x8e, 0x05, 0x7d, 0x8d, 0x84, 0xbc,
+			0x9f, 0xb1, 0xe6, 0x6a, 0x2e, 0x4b, 0x6d, 0x64,
+			0x91, 0x17, 0x9d, 0xb5, 0x35, 0x15, 0x02, 0xe9,
+			0x1b, 0x85, 0xc1, 0x89, 0xc2, 0x5a, 0x32, 0x3a,
+			0x80, 0x78, 0x5e, 0xcc, 0x50, 0x26, 0xf5, 0x11,
+			0x01, 0x79, 0xf3, 0xaf, 0xb6, 0x40, 0x00, 0x73,
+			0x8f, 0xeb, 0x5a, 0xd1, 0x26, 0x00, 0xe2, 0xa3,
+			0xcd, 0xfd, 0xaa, 0x15, 0x5b, 0x98, 0x2a, 0x76,
+			0x41, 0x07, 0xc2, 0xde, 0xb6, 0x71, 0xe7, 0xc3,
+			0xe9, 0x92, 0xb3, 0xd8, 0xfe, 0xaf, 0x12, 0x61,
+			0x86, 0x5b, 0x6e, 0x74, 0x45, 0x7b, 0x9b, 0x6f,
+			0x1a, 0x13, 0x84, 0xf6, 0x31, 0x5f, 0x5b, 0x6c,
+			0xde, 0x47, 0xb8, 0x73, 0x32, 0xc7, 0x94, 0x92,
+			0xa5, 0xc3, 0x65, 0xdf, 0x96, 0x6c, 0xfd, 0xb7,
+			0x80, 0xfb, 0x47, 0xba, 0x6e, 0x43, 0xb3, 0x7e,
+			0x86, 0xc9, 0x97, 0x45, 0xde, 0x3f, 0x3a, 0xf6,
+			0xb0, 0x9e, 0x9a, 0xcb, 0xfd, 0xf2, 0x5c, 0xba,
+			0x6e, 0x3f, 0xed, 0xfa, 0x74, 0x84, 0xe2, 0xb1,
+			0xae, 0x66, 0x57, 0x0b, 0x96, 0x6c, 0x77, 0xe4,
+			0x8a, 0x67, 0x97, 0xc7, 0xe0, 0x44, 0xb2, 0x83,
+			0x2d, 0x3c, 0x2e, 0x01, 0x19, 0x2e, 0x4c, 0x74,
+			0xe1, 0x35, 0x73, 0xeb, 0x85, 0x63, 0x8c, 0x3a,
+			0xb8, 0xbc, 0x25, 0x6a, 0x8d, 0xaf, 0xd2, 0xfb,
+			0xef, 0xd3, 0x12, 0x93, 0x0b, 0x39, 0xfa, 0x66,
+			0xbe, 0x3b, 0xfd, 0x6c, 0x0b, 0xbb, 0xb2, 0x5a,
+			0x78, 0xa1, 0xcf, 0x8c, 0x7d, 0x60, 0x55, 0xeb,
+			0x33, 0x4e, 0x8e, 0xf9, 0x19, 0x4d, 0x42, 0xd4,
+			0xf8, 0xd8, 0xba, 0xad, 0x0a, 0x6e, 0x62, 0xd4,
+			0xe1, 0x6a, 0xcc, 0xea, 0x09, 0x91, 0x8e, 0x62,
+			0xc9, 0x1e, 0x9e, 0x48, 0xaa, 0xde, 0xf7, 0xa2,
+			0x5a, 0xcb, 0x83, 0x20, 0xe8, 0xf5, 0xd1, 0xfe,
+			0x9d, 0x18, 0x2f, 0xd6, 0xf8, 0x97, 0x17, 0xce,
+			0xc2, 0x05, 0x08, 0xef, 0x61, 0x70, 0x9d, 0x95,
+			0x79, 0x59, 0x4c, 0x06, 0x24, 0x3d, 0x24, 0x69,
+			0xff, 0x46, 0xda, 0xbc, 0x71, 0x7a, 0x74, 0x93,
+			0x58, 0xf5, 0xc8, 0x91, 0xfb, 0x66, 0xed, 0x78,
+			0x8f, 0xf8, 0x28, 0xa8, 0x1d, 0xa5, 0x3a, 0x13,
+			0x76, 0xc2, 0xcc, 0xba, 0xb9, 0x56, 0x29, 0x74,
+			0xd6, 0x14, 0x75, 0x58, 0xe6, 0x2e, 0x79, 0x6e,
+			0x9d, 0x41, 0x94, 0x8a, 0xcf, 0xf1, 0xb1, 0xe0,
+			0x36, 0xe5, 0x89, 0x9a, 0x95, 0xa1, 0x11, 0xd1,
+			0xbe, 0x45, 0xe4, 0xb3, 0xb0, 0x62, 0x32, 0x1d,
+			0xba, 0xe0, 0xde, 0x57, 0x81, 0x0e, 0x01, 0x9b,
+			0x52, 0x3d, 0xd5, 0xde, 0x3b, 0x3a, 0xdd, 0x8f,
+			0xe3, 0x2e, 0xce, 0x1e, 0x89, 0x4d, 0x81, 0xf0,
+			0xf6, 0x20, 0x63, 0x7a, 0x4c, 0xbb, 0x66, 0xe0,
+			0xbe, 0x2b, 0xee, 0xd0, 0x3b, 0x60, 0x1e, 0x65,
+			0xd1, 0x2c, 0x7c, 0x5c, 0x6c, 0x16, 0x5b, 0x90,
+			0xc8, 0x05, 0x10, 0xf2, 0xde, 0x33, 0x90, 0x35,
+			0x69, 0x24, 0x3f, 0xc1, 0x8f, 0x1e, 0x4a, 0x60,
+			0xf1, 0x03, 0x65, 0x46, 0x40, 0x76, 0xe9, 0x83,
+			0x97, 0xda, 0x0b, 0xb8, 0x22, 0xfa, 0x55, 0x99,
+			0xfd, 0x18, 0x24, 0xd2, 0x66, 0xb0, 0x7b, 0x70,
+			0x56, 0x93, 0xad, 0x09, 0x95, 0x8e, 0x1f, 0x2f,
+			0xe8, 0x12, 0x55, 0xd4, 0x1f, 0xde, 0x09, 0x85,
+			0x05, 0xd1, 0xd5, 0x10, 0x2c, 0x8c, 0x6b, 0x53,
+			0x28, 0xce, 0x06, 0xc5, 0x52, 0x0f, 0xfa, 0x09,
+			0x09, 0x23, 0x1b, 0xe3, 0xbf, 0xb1, 0x89, 0x72,
+			0x26, 0x0d, 0xa6, 0xbb, 0x7d, 0x9e, 0xdc, 0xf8,
+			0xf5, 0x0b, 0x8c, 0xe0, 0xbc, 0x97, 0x3b, 0x72,
+			0xdd, 0xf5, 0x9d, 0xc5, 0xb6, 0x37, 0x2c, 0x76,
+			0x5b, 0x58, 0x67, 0xdb, 0xed, 0x3b, 0x6e, 0xe5,
+			0xe5, 0x6d, 0x6f, 0x0d, 0x7e, 0xff, 0xa9, 0x57,
+			0x4a, 0x84, 0x85, 0x82, 0xac, 0x00, 0x50, 0xa3,
+			0x4f, 0x87, 0xfe, 0x2a, 0x40, 0x52, 0x54, 0x81,
+			0x69, 0x42, 0x0b, 0x0c, 0xd7, 0x18, 0x98, 0x01,
+			0x8c, 0x5a, 0xa2, 0xf4, 0xe8, 0x61, 0xd1, 0x38,
+			0xfd, 0x0f, 0x63, 0x75, 0xd3, 0x4b, 0x1d, 0xdc,
+			0xdf, 0xb2, 0xeb, 0x94, 0x97, 0x5c, 0x2a, 0xb4,
+			0x12, 0x5c, 0x49, 0x2b, 0xfc, 0xd0, 0x8d, 0xfb,
+			0xe7, 0xb3, 0xcb, 0x0f, 0x3c, 0x2e, 0x04, 0x36,
+			0xa8, 0x03, 0xc9, 0xd7, 0x11, 0x2d, 0x2a, 0x93,
+			0xff, 0xda, 0x26, 0xb0, 0x54, 0x7e, 0xaf, 0x30,
+			0x7d, 0xce, 0x46, 0x8a, 0x3d, 0x7c, 0xa4, 0x7a,
+			0x2c, 0xfa, 0xba, 0xa1, 0xc9, 0x41, 0xd3, 0xb8,
+			0x84, 0x03, 0x78, 0xdd, 0xe9, 0x57, 0x19, 0x62,
+			0x62, 0xff, 0x5b, 0x3b, 0x48, 0x62, 0x0e, 0xee,
+			0x19, 0xb0, 0x32, 0x6e, 0x6a, 0x07, 0xd8, 0x4e,
+			0x25, 0x76, 0xa7, 0xe3, 0x98, 0xa1, 0x6f, 0xb6,
+			0x99, 0x32, 0x67, 0x7d, 0x46, 0x42, 0x4a, 0x82,
+			0xd1, 0x29, 0x1b, 0x87, 0xeb, 0x4b, 0x9e, 0xdf,
+			0x69, 0x75, 0xbd, 0x4f, 0xd3, 0xde, 0xc9, 0x83,
+			0xe6, 0xd6, 0xea, 0x03, 0x81, 0x12, 0xf3, 0x5d,
+			0x99, 0xf1, 0xb1, 0xd9, 0x3e, 0xbe, 0xf3, 0xa8,
+			0xdc, 0xb6, 0xf8, 0x4b, 0x9e, 0x26, 0x3f, 0xf0,
+			0x7c, 0xb3, 0xf4, 0xca, 0x00, 0x6c, 0x6c, 0xe5,
+			0x43, 0xa1, 0xfd, 0x3a, 0xf8, 0x8e, 0xe3, 0x9f,
+			0x88, 0xc5, 0x44, 0xfd, 0x24, 0x69, 0x76, 0xd5,
+			0xcb, 0xdc, 0x9d, 0x12, 0xf3, 0x13, 0x7e, 0xe7,
+			0xc3, 0xa8, 0x6a, 0xb2, 0xe0, 0xb3, 0x1d, 0xab,
+			0x3b, 0xc9, 0x77, 0x3d, 0x0f, 0xc3, 0xbe, 0x4b,
+			0x8b, 0x28, 0xbd, 0x7c, 0xe6, 0xb2, 0x06, 0x1f,
+			0xf9, 0x8f, 0x16, 0x62, 0xbf, 0xc7, 0x55, 0x73,
+			0xd4, 0xf1, 0x5a, 0x95, 0x80, 0xa3, 0x4e, 0xaa,
+			0x60, 0x17, 0x3c, 0xc9, 0x5e, 0xd4, 0x0c, 0x56,
+			0x7a, 0x77, 0x8e, 0x7f, 0x67, 0x08, 0x2f, 0xd9,
+			0x21, 0x19, 0xfd, 0x86, 0x8c, 0x23, 0x8d, 0xf6,
+			0x92, 0x1f, 0x36, 0x2c, 0x7c, 0x83, 0xbd, 0x2f,
+			0x6c, 0x63, 0x7c, 0xb7, 0x93, 0x74, 0x1b, 0xc2,
+			0x95, 0x34, 0x26, 0x1e, 0x07, 0x87, 0x3a, 0xb6,
+			0xe2, 0x39, 0x71, 0x9b, 0x20, 0xcd, 0x63, 0xf0,
+			0xbf, 0x48, 0xb5, 0x0e, 0x49, 0x86, 0x50, 0x80,
+			0xbd, 0xd6, 0x0e, 0xab, 0xd5, 0x69, 0x1b, 0xa4,
+			0xb3, 0x63, 0x3c, 0x8f, 0xcb, 0x42, 0xdb, 0xd7,
+			0x1a, 0xf4, 0xdf, 0x9e, 0x25, 0xfc, 0xd4, 0x00,
+			0xcb, 0xec, 0x57, 0x69, 0x30, 0x15, 0x4d, 0x7a,
+			0x69, 0x28, 0x2f, 0x2b, 0x34, 0x26, 0xd1, 0xe7,
+			0x01, 0x42, 0x5e, 0x02, 0xe2, 0x75, 0xe8, 0x52,
+			0x8a, 0xb4, 0x71, 0xfa, 0xc3, 0x3d, 0xe6, 0xac,
+			0xeb, 0xf3, 0x93, 0xe0, 0x37, 0xcd, 0x66, 0x92,
+			0x66, 0x2c, 0xfe, 0x4b, 0xd6, 0x3c, 0xf1, 0x57,
+			0xe5, 0xcf, 0xf5, 0xd0, 0xdb, 0x0e, 0x1f, 0x82,
+			0x65, 0x3b, 0xab, 0x69, 0x42, 0x53, 0x7d, 0xa4,
+			0x7c, 0xb7, 0x86, 0xeb, 0x23, 0x45, 0xa8, 0x4a,
+			0x73, 0xfc, 0x38, 0xc6, 0xe5, 0x2c, 0xab, 0x80,
+			0xfb, 0x23, 0xb2, 0x0c, 0x53, 0x28, 0x21, 0x37,
+			0x54, 0x9c, 0x72, 0x51, 0x0f, 0x44, 0x50, 0xd3,
+			0xe1, 0xd5, 0xb2, 0x27, 0x83, 0xb6, 0xe9, 0x4d,
+			0x64, 0x5c, 0x17, 0x0f, 0xe0, 0x13, 0xe4, 0x26,
+			0x6b, 0xd0, 0xd8, 0x25, 0xe3, 0x69, 0x6a, 0x95,
+			0x3f, 0x4a, 0x4e, 0xa0, 0x58, 0xbc, 0x28, 0x47,
+			0x8b, 0x68, 0xe4, 0x41, 0x90, 0x46, 0x1b, 0x84,
+			0xa0, 0x7b, 0x46, 0x46, 0x03, 0xee, 0x21, 0x0d,
+			0x34, 0xed, 0xff, 0x15, 0x57, 0x06, 0xdf, 0x71,
+			0x09, 0xb2, 0x66, 0x0d, 0x6e, 0xcc, 0xa5, 0x0c,
+			0xaf, 0x3f, 0x24, 0x8f, 0xd1, 0xc8, 0x44, 0x86,
+			0xaf, 0xbf, 0xeb, 0x2f, 0xb9, 0xee, 0xa7, 0xcf,
+			0xe4, 0xe8, 0xec, 0x47, 0x09, 0xd8, 0x95, 0x9e,
+			0x3c, 0xda, 0x92, 0x41, 0x61, 0xf5, 0xc3, 0xec,
+			0x00, 0xe4, 0xa3, 0x0d, 0x4a, 0xb3, 0xf6, 0x82,
+			0x05, 0x38, 0x70, 0x6a, 0xd1, 0x28, 0x2c, 0xb3,
+			0xc6, 0xbb, 0x38, 0xb3, 0x06, 0x7f, 0xd6, 0x4c,
+			0xe7, 0xfb, 0xef, 0x0d, 0x52, 0x66, 0xbe, 0xd8,
+			0xa6, 0x6f, 0xe8, 0xd9, 0x42, 0x4f, 0xad, 0xe8,
+			0xe8, 0x6c, 0xf9, 0xe9, 0x42, 0xd9, 0x66, 0x6e,
+			0xec, 0xfe, 0xf5, 0x91, 0xbf, 0x0a, 0x98, 0xd8,
+			0x7b, 0x23, 0x12, 0xa6, 0x04, 0xa8, 0xb3, 0x61,
+			0x13, 0x65, 0xc0, 0xe2, 0x82, 0xb9, 0xb2, 0x38,
+			0x07, 0x06, 0xca, 0x64, 0x6c, 0x23, 0x93, 0x60,
+			0x1d, 0x4d, 0x38, 0x5e, 0x8e, 0x90, 0x16, 0x4a,
+			0xfd, 0xb3, 0xcd, 0x84, 0x9c, 0xa5, 0xfa, 0x73,
+			0x2d, 0xcb, 0x87, 0x31, 0x3d, 0xf8, 0xfc, 0xeb,
+			0xa7, 0x56, 0x2f, 0x5b, 0x95, 0x9a, 0xc6, 0x82,
+			0x29, 0x86, 0x47, 0xe2, 0xc2, 0x84, 0x01, 0xaf,
+			0xc8, 0x0b, 0x2d, 0xfb, 0x34, 0xba, 0x5d, 0x9d,
+			0xd1, 0x85, 0xd5, 0x1e, 0x63, 0xcb, 0x3c, 0xa8,
+			0xfa, 0x79, 0xef, 0x12, 0xa6, 0xb5, 0xdb, 0xc5,
+			0x1d, 0x6a, 0xa7, 0x54, 0x58, 0x0c, 0xbe, 0x61,
+			0xe5, 0x96, 0x7f, 0x4a, 0x3b, 0x59, 0x32, 0x2d,
+			0x06, 0x44, 0x83, 0x5c, 0xad, 0xe9, 0xfe, 0x7c,
+			0xd7, 0x5b, 0x34, 0xa1, 0xa3, 0xad, 0x9a, 0xbf,
+			0xd5, 0x30, 0xf0, 0x22, 0xfc, 0x94, 0x7f, 0xd4,
+			0xa4, 0xca, 0x88, 0x31, 0xe7, 0xf2, 0x89, 0x2d,
+			0xda, 0xe6, 0x91, 0xa6, 0x27, 0x22, 0x74, 0x9f,
+			0xc6, 0x72, 0x4f, 0xf6, 0xa9, 0xfe, 0x7a, 0xf0,
+			0xa8, 0x6b, 0x6c, 0x9f, 0xe9, 0x2a, 0x9b, 0x23,
+			0x9e, 0xb8, 0x2b, 0x29, 0x65, 0xa7, 0x5d, 0xbd,
+			0x10, 0xe4, 0x56, 0x02, 0x94, 0xdd, 0xd1, 0xab,
+			0x9b, 0x82, 0x2d, 0x8d, 0xf6, 0xd3, 0x65, 0x63,
+			0x4a, 0xc4, 0x86, 0x61, 0x37, 0x9f, 0xdb, 0x4b,
+			0x34, 0x20, 0x0a, 0xca, 0x45, 0x6c, 0x06, 0xc4,
+			0x9c, 0x74, 0x4d, 0x83, 0x6a, 0x8d, 0xad, 0xc6,
+			0x61, 0x3a, 0x8d, 0xde, 0x6c, 0xf9, 0x8e, 0x33,
+			0xa2, 0xee, 0x99, 0xc7, 0xe4, 0x52, 0xb2, 0x44,
+			0x6f, 0x2f, 0x0f, 0x41, 0xa9, 0x1a, 0xd3, 0x96,
+			0x42, 0xc6, 0x49, 0x12, 0x6a, 0xf0, 0x29, 0xa9,
+			0x0c, 0x9c, 0x50, 0x5d, 0x1d, 0xd1, 0x42, 0x7e,
+			0x6f, 0x36, 0x48, 0x0f, 0x58, 0x14, 0x94, 0xc0,
+			0x10, 0x1e, 0xe0, 0xb2, 0xdd, 0xba, 0x57, 0x91,
+			0x4d, 0xd5, 0xdc, 0xa6, 0x4c, 0x68, 0x00, 0x6c,
+			0xb3, 0x5d, 0x32, 0x13, 0xbe, 0xa8, 0xc3, 0xfb,
+			0xd4, 0x19, 0x40, 0xf5, 0x6f, 0x63, 0xa1, 0x07,
+			0xbf, 0xa2, 0x8b, 0xfc, 0xfe, 0xf8, 0xa1, 0x33,
+			0x70, 0x07, 0x6d, 0xc5, 0x72, 0xa0, 0x39, 0xd6,
+			0xd7, 0x76, 0x6c, 0xfa, 0x1f, 0x04, 0xd6, 0x23,
+			0xbf, 0x66, 0x78, 0x92, 0x00, 0x11, 0x8a, 0x75,
+			0x67, 0x44, 0xa6, 0x7c, 0xd0, 0x14, 0xe6, 0xd0,
+			0x31, 0x6d, 0xdb, 0xc5, 0xb1, 0xa7, 0x99, 0xc3,
+			0xaf, 0x18, 0x7a, 0x26, 0x46, 0xad, 0x6d, 0x0c,
+			0xb6, 0xb5, 0xad, 0xc1, 0xcf, 0x60, 0x99, 0xf5,
+			0x9f, 0x88, 0xaf, 0x0e, 0x37, 0x15, 0xf9, 0x2b,
+			0x1a, 0x5f, 0xfb, 0xc9, 0xf8, 0xd4, 0xf0, 0x97,
+			0xd2, 0x91, 0xf4, 0x94, 0xa2, 0xd3, 0x3b, 0x8b,
+			0x0c, 0x22, 0xa0, 0xac, 0xb3, 0xb5, 0xdf, 0xf2,
+			0x27, 0x38, 0x47, 0x53, 0x5b, 0x6e, 0x8f, 0x98,
+			0x9e, 0xad, 0xb6, 0xf5, 0x0e, 0x17, 0x20, 0x35,
+			0x54, 0x6b, 0x73, 0xa6, 0x64, 0x65, 0xac, 0xb8,
+			0xc1, 0xd3, 0xf7, 0x07, 0x82, 0x93, 0x9d, 0xcb,
+			0xcc, 0xe9, 0x0c, 0x51, 0x52, 0x85, 0x8b, 0x95,
+			0xa6, 0xb1, 0xce, 0xdc, 0xfa, 0x00, 0x00, 0x08,
+			0x14, 0x1c, 0x23, 0x2a, 0x35, },
+	}, {
+		.what = "pure rejection vector",
+		.algo = "ml-dsa65",
+		.pk_len = DILITHIUM65_PUBLICKEYBYTES,
+		.pk = (const u8[DILITHIUM65_PUBLICKEYBYTES]){
+			0x51, 0xbc, 0x81, 0x7c, 0x36, 0x6a, 0x18, 0xc5,
+			0x5e, 0xb6, 0x89, 0xf9, 0xf2, 0xaf, 0xba, 0x61,
+			0x34, 0x2b, 0x1e, 0xe1, 0xae, 0xb1, 0xa2, 0x6f,
+			0x5a, 0x6b, 0x6e, 0xc6, 0x01, 0x23, 0x2a, 0x47,
+			0xd8, 0x3a, 0xec, 0x87, 0x93, 0x62, 0x3b, 0x4b,
+			0xcf, 0x37, 0x7c, 0x9a, 0x95, 0xff, 0xf1, 0xc1,
+			0x2b, 0xfc, 0x2f, 0x53, 0xbd, 0x90, 0x93, 0x3d,
+			0xc4, 0xb8, 0x43, 0xeb, 0xd9, 0x0d, 0x74, 0x4c,
+			0xca, 0x65, 0x02, 0x8c, 0x2c, 0x60, 0xc6, 0x11,
+			0xe5, 0xbe, 0xcd, 0xea, 0x0e, 0xc0, 0x4f, 0x82,
+			0x1f, 0xad, 0xa5, 0x65, 0xd9, 0xc9, 0x69, 0xa3,
+			0x23, 0xb7, 0x12, 0xb5, 0xc3, 0x9e, 0x78, 0x68,
+			0x5b, 0x6b, 0x21, 0x59, 0x5b, 0x49, 0x02, 0xfb,
+			0xda, 0x35, 0x8c, 0x8c, 0x74, 0x41, 0x8b, 0x46,
+			0xdc, 0x7b, 0xd8, 0x1e, 0x03, 0x47, 0x96, 0xc2,
+			0x96, 0xdc, 0x56, 0x0f, 0x86, 0xed, 0x95, 0xee,
+			0xf0, 0x27, 0xed, 0x82, 0x9d, 0x32, 0x72, 0x13,
+			0x49, 0x76, 0xf4, 0xc3, 0x04, 0xca, 0x4c, 0x16,
+			0x22, 0xf1, 0xab, 0x00, 0x8f, 0x15, 0x5a, 0xf7,
+			0x72, 0xf0, 0x79, 0x5a, 0x46, 0x57, 0xc8, 0x2f,
+			0xa2, 0x1f, 0x34, 0x6d, 0x20, 0x28, 0x14, 0x1d,
+			0x2e, 0x14, 0x31, 0x9b, 0x58, 0xac, 0x25, 0x0f,
+			0x91, 0x6f, 0xd6, 0xd7, 0xca, 0x34, 0x06, 0x32,
+			0x24, 0x5d, 0x65, 0x65, 0x50, 0x90, 0x4f, 0x11,
+			0x5a, 0xee, 0x36, 0xc7, 0x72, 0x34, 0xbb, 0x9d,
+			0xe9, 0xd5, 0xf2, 0x84, 0xa9, 0xa7, 0x04, 0xd5,
+			0x2d, 0xb0, 0x8b, 0x78, 0x0b, 0x87, 0x86, 0xa0,
+			0xff, 0x07, 0x1f, 0x61, 0x08, 0xdb, 0x41, 0x22,
+			0x3e, 0xe3, 0x97, 0x4b, 0x13, 0x70, 0x8e, 0x8a,
+			0x96, 0x04, 0xae, 0x73, 0x3d, 0x43, 0x5b, 0x86,
+			0x9f, 0xa7, 0xba, 0xa6, 0xaf, 0x5c, 0x94, 0xfd,
+			0xcb, 0xc3, 0x77, 0xc8, 0x5f, 0xe3, 0x33, 0x1f,
+			0x8b, 0x5a, 0xb1, 0x20, 0xc7, 0x96, 0xd5, 0xb3,
+			0xc2, 0xb7, 0xa6, 0x59, 0x0b, 0x13, 0x2f, 0xca,
+			0xe5, 0xb6, 0x17, 0x40, 0xa7, 0xba, 0xa3, 0xe0,
+			0x80, 0xdc, 0xf4, 0xe7, 0x9b, 0xd3, 0x53, 0xc5,
+			0xe4, 0x08, 0xa3, 0x72, 0xd3, 0x65, 0xf3, 0xd3,
+			0xdd, 0x72, 0xe8, 0x5c, 0xdd, 0xed, 0x11, 0x20,
+			0x84, 0xf9, 0x54, 0x9e, 0xce, 0xcb, 0x30, 0x81,
+			0xa1, 0xf1, 0x05, 0x16, 0xb0, 0x69, 0x57, 0x4d,
+			0xd5, 0x24, 0xd2, 0x8d, 0xd6, 0x46, 0x8e, 0x96,
+			0xb5, 0x4b, 0xcc, 0x80, 0x2f, 0x37, 0x2a, 0x7a,
+			0x2e, 0x4a, 0x94, 0x5d, 0x6a, 0x40, 0x95, 0x48,
+			0xc3, 0x34, 0x9c, 0xac, 0xe5, 0xcd, 0x91, 0xd9,
+			0x34, 0x51, 0x01, 0x67, 0x56, 0xfe, 0x9b, 0x16,
+			0x64, 0x1e, 0xed, 0x42, 0xc9, 0xc6, 0xa3, 0xf9,
+			0xd6, 0x7b, 0xf8, 0x36, 0xad, 0x1c, 0xd0, 0x10,
+			0x9c, 0x07, 0xe8, 0xb2, 0x2f, 0x86, 0xcd, 0xe7,
+			0x1d, 0xa3, 0xb8, 0x45, 0xca, 0x3b, 0x53, 0x79,
+			0xc9, 0x25, 0x73, 0x8f, 0x83, 0x75, 0x62, 0x90,
+			0x6a, 0x70, 0x8c, 0xf3, 0xed, 0x0b, 0x95, 0x37,
+			0xe4, 0xb2, 0xae, 0x5f, 0xa1, 0xd7, 0x0b, 0x10,
+			0xfe, 0xda, 0x49, 0xe2, 0x2e, 0x03, 0x08, 0x55,
+			0xed, 0x7c, 0x42, 0x3e, 0xd7, 0xc2, 0x96, 0x87,
+			0x65, 0x67, 0x7e, 0x46, 0x48, 0x74, 0x89, 0xdc,
+			0x3c, 0x91, 0x72, 0x14, 0x7a, 0x4f, 0xac, 0x47,
+			0xe5, 0x9f, 0x7d, 0x9f, 0xe6, 0xf7, 0xf8, 0x5d,
+			0xd7, 0x36, 0xe9, 0xe1, 0x2d, 0x64, 0x77, 0xd3,
+			0x53, 0x99, 0x45, 0xdd, 0xbf, 0x2e, 0xb5, 0x61,
+			0xe1, 0x56, 0xce, 0x51, 0x2e, 0x10, 0x1f, 0xef,
+			0xd8, 0x76, 0xc3, 0x1a, 0x2f, 0x06, 0x85, 0xb7,
+			0x89, 0x31, 0xbd, 0x31, 0x75, 0x90, 0x22, 0xba,
+			0x52, 0x5e, 0x10, 0xb0, 0x22, 0x39, 0x64, 0xa3,
+			0x22, 0x2e, 0x88, 0x0b, 0xc1, 0x33, 0xd3, 0xa3,
+			0xef, 0x7f, 0xca, 0x7e, 0x07, 0xc8, 0xe6, 0x64,
+			0xd8, 0x53, 0x83, 0x28, 0x2a, 0x10, 0x3a, 0x77,
+			0x85, 0x22, 0xdb, 0x61, 0xd8, 0x49, 0x20, 0x76,
+			0x97, 0x0d, 0xf7, 0x07, 0x2c, 0x9a, 0xbf, 0x66,
+			0x04, 0x49, 0x50, 0xb6, 0x70, 0xb5, 0x17, 0x95,
+			0xef, 0xe6, 0x9d, 0x7a, 0xdd, 0xed, 0x6b, 0x22,
+			0x5e, 0x89, 0x65, 0x72, 0xf1, 0xf6, 0x86, 0xcb,
+			0x76, 0x84, 0x7d, 0x22, 0x3b, 0x5c, 0x84, 0x48,
+			0x48, 0x7a, 0x00, 0x83, 0x03, 0x97, 0x01, 0x47,
+			0x46, 0x8f, 0x2a, 0x40, 0x61, 0xd6, 0x32, 0xd8,
+			0x3d, 0x59, 0x10, 0x78, 0xaf, 0x22, 0x33, 0xe5,
+			0x44, 0x63, 0x78, 0x5d, 0x56, 0x01, 0x24, 0x59,
+			0x19, 0x8d, 0x52, 0xb4, 0xc3, 0x7b, 0x97, 0x5f,
+			0x61, 0xcb, 0x48, 0x78, 0xa6, 0x7c, 0x1d, 0x06,
+			0xb2, 0x4b, 0xdf, 0x7a, 0x31, 0xa9, 0xb2, 0x53,
+			0xe5, 0x3e, 0x3e, 0xfe, 0xbf, 0x71, 0x18, 0x69,
+			0x86, 0x4c, 0xf5, 0x30, 0x89, 0xaa, 0xa8, 0x6c,
+			0x78, 0x64, 0xc8, 0x33, 0x3b, 0x2d, 0x63, 0xbd,
+			0x24, 0x30, 0xfa, 0x8a, 0x3c, 0xd7, 0x82, 0xa5,
+			0x31, 0x84, 0x96, 0x1b, 0xb3, 0x3b, 0x7b, 0x9e,
+			0x80, 0xef, 0xbb, 0xaf, 0x1e, 0x88, 0xa3, 0x75,
+			0x0d, 0x73, 0xbf, 0xf4, 0x36, 0x42, 0x2a, 0x98,
+			0xda, 0x7d, 0x9b, 0xab, 0x15, 0x26, 0xe4, 0x0b,
+			0x0c, 0x95, 0xaf, 0x8b, 0x8d, 0x8d, 0x67, 0x5b,
+			0x1f, 0x42, 0xce, 0xb0, 0x47, 0x94, 0x94, 0x57,
+			0x15, 0xba, 0xa4, 0x82, 0x5d, 0xc4, 0x71, 0x6b,
+			0xeb, 0xc6, 0xdf, 0x22, 0xef, 0xd8, 0x89, 0xd8,
+			0xfb, 0xc5, 0xce, 0xf2, 0xf3, 0x94, 0x64, 0xe1,
+			0xc1, 0x17, 0x2d, 0x3e, 0xa5, 0xb6, 0xf5, 0x65,
+			0xf6, 0xb3, 0xeb, 0xa9, 0x5d, 0xfa, 0x3e, 0xff,
+			0x1c, 0xbb, 0x52, 0xd8, 0x80, 0x09, 0x1c, 0x18,
+			0x25, 0x57, 0x4b, 0x4b, 0x30, 0xfe, 0xb2, 0xe5,
+			0x03, 0x87, 0x6f, 0x6c, 0x2b, 0x83, 0x5a, 0xf3,
+			0x37, 0x72, 0x11, 0xe4, 0xfd, 0x76, 0x1e, 0x28,
+			0xe6, 0x65, 0x12, 0x4e, 0xb8, 0xcd, 0x90, 0xba,
+			0xdf, 0x6e, 0x4e, 0xc9, 0x4b, 0xf5, 0x7c, 0x9f,
+			0xb3, 0xe6, 0xab, 0xd5, 0xcd, 0x26, 0xe4, 0x74,
+			0x65, 0xe7, 0x84, 0x9c, 0x28, 0x7a, 0x6f, 0x1f,
+			0x6c, 0xbe, 0xcc, 0xa7, 0xf3, 0x2e, 0x56, 0x92,
+			0x88, 0xfb, 0x99, 0x1f, 0xed, 0xed, 0xf0, 0xc1,
+			0x1a, 0x75, 0x13, 0x47, 0x0c, 0x88, 0x3c, 0x99,
+			0x72, 0x02, 0x36, 0x40, 0x48, 0x26, 0x31, 0xc4,
+			0xa0, 0x80, 0x79, 0x40, 0x1f, 0xfb, 0xff, 0xab,
+			0x7f, 0xe6, 0x45, 0x71, 0xed, 0x8e, 0x12, 0x1b,
+			0x4c, 0x4f, 0xa1, 0xd1, 0xc8, 0x94, 0xa4, 0xe8,
+			0x2a, 0x76, 0xe3, 0x19, 0x52, 0xad, 0x4e, 0x4c,
+			0x97, 0xf7, 0xc8, 0x67, 0x90, 0x49, 0x36, 0x0b,
+			0x54, 0xf5, 0xe0, 0xce, 0x25, 0x27, 0x9c, 0xa6,
+			0x9c, 0x2d, 0xd5, 0xaa, 0x58, 0x19, 0x14, 0x62,
+			0x19, 0x9d, 0xe6, 0x54, 0xda, 0x47, 0x0b, 0x24,
+			0xf1, 0xb5, 0xe0, 0x55, 0xaf, 0x5d, 0x30, 0x93,
+			0x1c, 0x95, 0xda, 0xa5, 0x94, 0xf9, 0x3d, 0xa7,
+			0x40, 0x92, 0xcd, 0x18, 0xa7, 0x3f, 0x3f, 0xa5,
+			0x9e, 0xe2, 0x01, 0xe0, 0xae, 0xd1, 0xe8, 0xdb,
+			0xc2, 0x79, 0x7a, 0x6e, 0x5b, 0xd4, 0x1d, 0x68,
+			0x39, 0xd8, 0xea, 0xa1, 0x4b, 0x95, 0xb4, 0xed,
+			0x94, 0x96, 0x37, 0x5f, 0xb4, 0x3d, 0x97, 0x4a,
+			0x77, 0x51, 0xf8, 0x57, 0x74, 0xc8, 0xe2, 0x62,
+			0x17, 0x53, 0x23, 0x0e, 0x47, 0x6c, 0xd5, 0x4a,
+			0x87, 0x7d, 0xe8, 0x97, 0x0b, 0x23, 0x24, 0x80,
+			0x6b, 0x56, 0x04, 0x5e, 0xbf, 0x0d, 0x22, 0x18,
+			0xac, 0xc8, 0xbc, 0xe0, 0xfa, 0x57, 0x80, 0xa7,
+			0x99, 0xca, 0xdc, 0xe9, 0xe6, 0x8a, 0x11, 0x7c,
+			0x99, 0x41, 0xb8, 0x76, 0xe7, 0x91, 0x72, 0x85,
+			0x97, 0xe7, 0xd3, 0x8e, 0xee, 0x16, 0x3c, 0x47,
+			0x9c, 0xef, 0x02, 0x61, 0x18, 0x71, 0x9b, 0xf8,
+			0xae, 0x55, 0x89, 0x5d, 0x4a, 0xcd, 0x5b, 0x9c,
+			0x0b, 0x97, 0xef, 0x5c, 0xbc, 0xad, 0x72, 0xf9,
+			0x4f, 0xfe, 0xa3, 0x13, 0xd6, 0x0f, 0x5d, 0x3a,
+			0x87, 0x46, 0xf3, 0x40, 0x37, 0xd0, 0x99, 0xfe,
+			0xa5, 0xc7, 0x1d, 0xb4, 0x95, 0xb0, 0x55, 0x3a,
+			0x47, 0x66, 0x0a, 0xc8, 0x4e, 0xe0, 0xcb, 0xc5,
+			0x80, 0x6d, 0x34, 0x91, 0x39, 0xc1, 0x71, 0xb9,
+			0x54, 0x5e, 0xb4, 0xfd, 0x6c, 0x54, 0xc3, 0x9c,
+			0xde, 0x83, 0xb4, 0x5d, 0x4b, 0xa9, 0x1c, 0x25,
+			0x0e, 0x8e, 0x51, 0x3e, 0xa5, 0x59, 0x5f, 0x20,
+			0x5b, 0x43, 0xf8, 0xa4, 0x7d, 0x7f, 0x0c, 0xb2,
+			0x87, 0x2b, 0xf1, 0xdc, 0xf2, 0xd5, 0x2b, 0x19,
+			0x4d, 0x60, 0x18, 0x25, 0x4b, 0x31, 0xa5, 0x08,
+			0x6b, 0x4d, 0x0e, 0xec, 0x0a, 0x65, 0x31, 0xc5,
+			0x1a, 0xf3, 0x4d, 0x16, 0xed, 0x24, 0x89, 0xeb,
+			0xfe, 0xe2, 0x7c, 0xb1, 0x64, 0xc7, 0x10, 0x2e,
+			0x27, 0x44, 0x7e, 0xb3, 0x60, 0x88, 0x5d, 0x0a,
+			0xb0, 0x1c, 0x62, 0xda, 0x94, 0x63, 0xfe, 0xf3,
+			0x82, 0x32, 0xc3, 0x44, 0x56, 0x46, 0x8f, 0xc4,
+			0x81, 0x86, 0xf2, 0x89, 0x19, 0x6f, 0xfc, 0x09,
+			0x57, 0x56, 0xba, 0xcb, 0xbf, 0x0d, 0xf0, 0x4b,
+			0x2f, 0x63, 0x6f, 0x18, 0x22, 0x5f, 0xa7, 0x86,
+			0x5b, 0x0d, 0x1e, 0x05, 0xf5, 0x33, 0x0b, 0xbe,
+			0x62, 0xc7, 0xe0, 0xdf, 0xb0, 0x17, 0xec, 0x68,
+			0x0f, 0x2c, 0x77, 0x68, 0x6c, 0xad, 0xdb, 0xdd,
+			0x36, 0xab, 0x8c, 0xd7, 0xd0, 0xa9, 0xff, 0x4c,
+			0x7c, 0x53, 0x18, 0x25, 0x8c, 0x6d, 0xec, 0x4d,
+			0x81, 0xce, 0x00, 0x56, 0xda, 0x23, 0x8d, 0xea,
+			0xbf, 0x68, 0x04, 0x16, 0xff, 0x6b, 0xc1, 0x61,
+			0xfb, 0x80, 0x79, 0x81, 0x65, 0xec, 0x99, 0xfd,
+			0xb2, 0xba, 0x41, 0x11, 0xf5, 0xbd, 0x79, 0xcc,
+			0x37, 0x5f, 0xa6, 0xde, 0x29, 0x16, 0x3f, 0x2e,
+			0x93, 0xd0, 0x5d, 0xad, 0xff, 0x67, 0x05, 0x70,
+			0x65, 0xa1, 0x3d, 0xb1, 0xe0, 0x46, 0x87, 0x62,
+			0x4f, 0xf7, 0xec, 0x51, 0x60, 0x5f, 0x83, 0x68,
+			0x3a, 0xd8, 0x89, 0x90, 0x1e, 0x12, 0x8b, 0xfa,
+			0x3d, 0xb9, 0x8b, 0xff, 0x91, 0xe9, 0xa7, 0x6f,
+			0x2e, 0x04, 0xfd, 0xd8, 0xeb, 0x58, 0x90, 0x68,
+			0x6d, 0xdb, 0x2f, 0xeb, 0x34, 0x9b, 0x3a, 0xb9,
+			0x07, 0xba, 0xa0, 0x71, 0xcc, 0xc4, 0xe2, 0xc3,
+			0xf1, 0x8d, 0xd0, 0x6e, 0x79, 0xf5, 0x8d, 0xda,
+			0x51, 0x57, 0xe8, 0x9d, 0x2c, 0xe1, 0x81, 0xf7,
+			0x1e, 0x30, 0x28, 0x5d, 0x09, 0x85, 0x25, 0x2d,
+			0x44, 0x18, 0xef, 0x1c, 0x3a, 0x5d, 0x84, 0x2b,
+			0xbe, 0x5c, 0x78, 0x90, 0x4c, 0xfe, 0x9a, 0x3d,
+			0x1d, 0x3c, 0xac, 0x05, 0x9a, 0xca, 0x8a, 0x17,
+			0x53, 0x61, 0xd7, 0x97, 0x6b, 0xab, 0xec, 0xff,
+			0xe5, 0x2c, 0x0f, 0xe7, 0x34, 0x57, 0x17, 0x40,
+			0xeb, 0xed, 0x8f, 0xe4, 0x72, 0xd0, 0xbe, 0xb1,
+			0xbe, 0xd3, 0x09, 0x3d, 0x4d, 0xf4, 0xdd, 0x5f,
+			0x95, 0x98, 0x54, 0x85, 0x72, 0x50, 0x99, 0xec,
+			0x63, 0xba, 0x18, 0xa0, 0x1e, 0x81, 0x45, 0x4c,
+			0x8e, 0xd3, 0x67, 0x90, 0xa2, 0xd6, 0x45, 0x5e,
+			0x30, 0x68, 0xa0, 0x16, 0x0f, 0x90, 0xbb, 0x04,
+			0x85, 0x5e, 0x90, 0xf7, 0x1b, 0x52, 0xaf, 0x55,
+			0x47, 0xcf, 0x75, 0x11, 0x73, 0xc4, 0xec, 0x4f,
+			0x0f, 0x44, 0x4d, 0xd3, 0x92, 0xdf, 0x5d, 0x9d,
+			0x12, 0x38, 0x72, 0x38, 0xaa, 0x06, 0xf2, 0x45,
+			0xf5, 0xa8, 0xdd, 0x8f, 0xd2, 0x7a, 0x96, 0x0f,
+			0x3f, 0xca, 0xa3, 0x79, 0xe2, 0xed, 0x12, 0x62,
+			0x62, 0x7a, 0x01, 0x7a, 0xa0, 0xc5, 0x31, 0x1f,
+			0x49, 0x2b, 0x87, 0x49, 0xd6, 0x90, 0xfd, 0xfc,
+			0xdc, 0xac, 0x4c, 0x15, 0x1a, 0xe1, 0x66, 0xf2,
+			0xfa, 0xe9, 0x58, 0x6d, 0x57, 0x24, 0x90, 0x78,
+			0x7a, 0x05, 0x73, 0x9f, 0x96, 0x30, 0x5b, 0xa8,
+			0x69, 0x18, 0xa2, 0x24, 0x5c, 0xf2, 0xc3, 0xb0,
+			0x8d, 0xa6, 0x71, 0x28, 0x46, 0x94, 0x33, 0x0a,
+			0x95, 0xd9, 0x32, 0xc9, 0x93, 0x7f, 0xa4, 0xee,
+			0x8e, 0x3f, 0x21, 0x1b, 0xa2, 0xfe, 0x09, 0x03,
+			0xe0, 0x63, 0xb0, 0xbe, 0xa8, 0x19, 0x16, 0xd1,
+			0x38, 0x81, 0xdf, 0x9b, 0x89, 0x47, 0x00, 0x7f,
+			0xaa, 0xe9, 0xb7, 0x51, 0xab, 0x27, 0x4c, 0xdd,
+			0x50, 0xf0, 0x45, 0xaf, 0x26, 0x4c, 0xe3, 0x33,
+			0x79, 0x43, 0x87, 0x59, 0xbf, 0x6e, 0x38, 0xdb,
+			0x28, 0x3b, 0x99, 0x12, 0xc2, 0x3a, 0xca, 0x6f,
+			0x9d, 0x99, 0x10, 0x4d, 0x0c, 0xdf, 0xc3, 0xc3,
+			0x4f, 0xb0, 0xe5, 0x62, 0xd1, 0xca, 0x27, 0x14,
+			0xc7, 0xf5, 0x65, 0x86, 0x69, 0x92, 0x59, 0xf3,
+			0xd9, 0x51, 0x67, 0x45, 0x5f, 0x33, 0xc8, 0xd9,
+			0x41, 0xe5, 0x45, 0x5d, 0x80, 0x58, 0x6d, 0x9a,
+			0xf7, 0xa9, 0xc9, 0xb1, 0x36, 0x3b, 0xd2, 0xb0,
+			0x25, 0xdb, 0x58, 0x5c, 0x77, 0x7a, 0xb0, 0x51,
+			0x2f, 0xb5, 0xa3, 0xdc, 0x1a, 0xfd, 0x48, 0x76,
+			0x89, 0x5f, 0x25, 0x00, 0xe6, 0x89, 0x6a, 0xf7,
+			0x95, 0xfd, 0x13, 0x6b, 0xe9, 0xdf, 0x28, 0x8c,
+			0x73, 0x2c, 0x08, 0x67, 0x8f, 0x3f, 0x0f, 0x92,
+			0xb0, 0xb6, 0x73, 0xb9, 0xca, 0xa6, 0x55, 0xe8,
+			0x5e, 0xc5, 0xb0, 0x68, 0xbd, 0x96, 0x6b, 0xab,
+			0x43, 0x29, 0xcb, 0x28, 0xc4, 0x03, 0xf5, 0x6f,
+			0xef, 0x74, 0x7b, 0x50, 0xb8, 0x2f, 0xac, 0x61,
+			0xad, 0xe9, 0x90, 0x7f, 0x78, 0xcd, 0xa1, 0xed,
+			0x9e, 0x64, 0xf2, 0x95, 0x5f, 0x05, 0xae, 0xe5,
+			0x57, 0x77, 0x31, 0x05, 0x75, 0xdc, 0xaa, 0x30,
+			0x43, 0x12, 0x5f, 0x5b, 0xcb, 0x78, 0x31, 0x6e,
+			0xd0, 0x92, 0x60, 0x61, 0xdb, 0x60, 0xe4, 0xe5,
+			0xce, 0x35, 0x8f, 0x0c, 0xb3, 0xc1, 0xb9, 0x4f,
+			0xe5, 0xc6, 0xf2, 0x5e, 0xcc, 0xf4, 0xf8, 0x9b,
+			0x49, 0xa9, 0xed, 0xc8, 0xcb, 0x73, 0x4d, 0xc6,
+			0x63, 0xad, 0xb1, 0xdb, 0x65, 0xa9, 0x8e, 0x81,
+			0x26, 0x16, 0x7e, 0x7b, 0x46, 0xcc, 0xb2, 0x21,
+			0x45, 0x1e, 0xce, 0x77, 0x01, 0x7c, 0x88, 0x10,
+			0xfe, 0x9d, 0x7e, 0x63, 0xe0, 0x36, 0x0b, 0xcf,
+			0x24, 0x06, 0x21, 0x34, 0x4f, 0x98, 0x38, 0x90,
+			0xdc, 0xe1, 0x03, 0x25, 0x32, 0xcf, 0x72, 0xb8,
+			0xd0, 0x48, 0xf8, 0x9b, 0xaa, 0xde, 0xc5, 0xfc,
+			0x9d, 0xa6, 0x1c, 0xcb, 0x8e, 0xaa, 0x1b, 0x87,
+			0xd4, 0x22, 0x3d, 0x47, 0x5e, 0x60, 0xc3, 0xa4,
+			0xc5, 0xf6, 0x5e, 0x88, 0xf1, 0x15, 0xcf, 0x42,
+			0x3d, 0xd3, 0x47, 0x24, 0x11, 0x32, 0x74, 0x98,
+			0xda, 0x9b, 0x23, 0x79, 0x20, 0xf1, 0xd8, 0x0c,
+			0x59, 0x8f, 0x61, 0x22, 0xda, 0x16, 0x60, 0xa0,
+			0x4d, 0x46, 0x30, 0x09, 0x59, 0xf5, 0xe1, 0xee,
+			0xe6, 0x72, 0x3a, 0xc2, 0x86, 0xa1, 0x17, 0x36,
+			0x21, 0x91, 0xff, 0x55, 0x9c, 0x73, 0xdf, 0xd8,
+			},
+		.msg_len = 64,
+		.msg = (const u8[64]){
+			0x67, 0x9b, 0x88, 0xb9, 0xc3, 0x30, 0x50, 0x56,
+			0x3f, 0x8c, 0x56, 0xfc, 0x3a, 0x65, 0x9e, 0x59,
+			0xc8, 0xcc, 0xb2, 0xe7, 0xa9, 0x1b, 0x5b, 0xf6,
+			0xbc, 0xef, 0xee, 0xac, 0x24, 0xca, 0x97, 0xa4,
+			0xb4, 0xfe, 0xcd, 0x0a, 0x7e, 0x90, 0x3d, 0x73,
+			0xc8, 0xfa, 0xd6, 0xc7, 0xaa, 0x94, 0x97, 0x2b,
+			0x0c, 0x7f, 0x38, 0xd3, 0x28, 0xea, 0x7c, 0xf6,
+			0x30, 0x55, 0x8a, 0x37, 0xc3, 0x3d, 0x38, 0x2e,
+			},
+		.sig_len = DILITHIUM65_CRYPTO_BYTES,
+		.sig = (const u8[DILITHIUM65_CRYPTO_BYTES]){
+			0xbe, 0xa1, 0x82, 0x06, 0xcd, 0x1f, 0xc3, 0x9c,
+			0x02, 0x01, 0x40, 0x4a, 0xfe, 0x12, 0xc2, 0xe4,
+			0x5a, 0x4b, 0xa0, 0x7b, 0xdb, 0x88, 0x6b, 0x60,
+			0x78, 0x82, 0xa6, 0x91, 0x2b, 0x11, 0x55, 0xd2,
+			0x44, 0x54, 0x7d, 0x5f, 0x18, 0xc5, 0xf6, 0xe7,
+			0x68, 0xf2, 0x2b, 0x6c, 0x97, 0xe5, 0x09, 0x54,
+			0xa3, 0x81, 0x41, 0x0c, 0xd4, 0x9a, 0x74, 0xa1,
+			0x97, 0xb2, 0xc3, 0xde, 0x26, 0xa6, 0xda, 0x03,
+			0xdc, 0xa6, 0x60, 0x96, 0xc4, 0x01, 0xf4, 0x0a,
+			0xe8, 0x22, 0xfb, 0x67, 0xdb, 0xa3, 0x2e, 0x0f,
+			0x79, 0xf7, 0x81, 0xb9, 0x1d, 0xbe, 0xb0, 0x80,
+			0x84, 0x6e, 0x2d, 0xa4, 0xba, 0x8b, 0xc2, 0xb1,
+			0x60, 0x78, 0xe1, 0xd9, 0xf4, 0x19, 0xd5, 0x25,
+			0x34, 0x22, 0xc9, 0x18, 0x08, 0xdf, 0x59, 0x66,
+			0x38, 0x87, 0xed, 0x5d, 0xe1, 0x0d, 0xba, 0x76,
+			0xbe, 0x02, 0x5c, 0x70, 0xcb, 0xfa, 0xa1, 0x72,
+			0x65, 0x91, 0xce, 0x4b, 0x72, 0x1b, 0x66, 0x83,
+			0x06, 0x0f, 0x14, 0x71, 0x95, 0xdc, 0x19, 0xde,
+			0x73, 0x84, 0xa2, 0x07, 0xa6, 0xc4, 0x1d, 0x32,
+			0xb0, 0x6e, 0xae, 0x3f, 0xf1, 0xce, 0x08, 0x30,
+			0xc6, 0xaa, 0xef, 0x6f, 0xee, 0xfc, 0x31, 0xf9,
+			0xd5, 0xc3, 0x03, 0xbe, 0xec, 0x37, 0xa9, 0x7e,
+			0x9f, 0x99, 0xcb, 0xe5, 0xd0, 0xea, 0x11, 0x33,
+			0x7f, 0xae, 0xe8, 0x3e, 0x70, 0x2f, 0x41, 0x50,
+			0xe5, 0xd4, 0xb5, 0xe6, 0x2b, 0xc0, 0x17, 0xf6,
+			0x79, 0x7c, 0xdc, 0x59, 0xf6, 0x34, 0xef, 0xcb,
+			0x90, 0x7e, 0x80, 0xb6, 0xf9, 0x90, 0xa9, 0x3f,
+			0xd4, 0xde, 0x9d, 0x87, 0x7f, 0xbe, 0x22, 0xe1,
+			0x80, 0x97, 0xfa, 0x4c, 0x09, 0x6e, 0x0a, 0xe5,
+			0x55, 0xf5, 0xe2, 0xe0, 0x71, 0x17, 0xb9, 0x3d,
+			0x0b, 0x8d, 0x4a, 0x79, 0xaf, 0xe9, 0xf8, 0x31,
+			0xb6, 0x79, 0x34, 0x15, 0x7b, 0x22, 0xe0, 0x6a,
+			0xeb, 0xc7, 0xc2, 0x98, 0x11, 0x6a, 0x6e, 0xf7,
+			0xef, 0x14, 0x72, 0x20, 0xf9, 0x5c, 0x0c, 0x04,
+			0x40, 0x45, 0x54, 0x20, 0x52, 0xe5, 0xed, 0x25,
+			0x57, 0x3b, 0x9e, 0x65, 0x82, 0xd4, 0x1a, 0x16,
+			0x7a, 0x7d, 0x9e, 0x7e, 0xcc, 0xa9, 0xb0, 0xf9,
+			0xc1, 0x23, 0x9e, 0x3b, 0xde, 0x85, 0x20, 0x54,
+			0x31, 0x3e, 0x70, 0xe7, 0x56, 0x7b, 0xc2, 0x83,
+			0x0e, 0xfd, 0x25, 0x48, 0x1d, 0x95, 0x38, 0x92,
+			0x48, 0xf2, 0xbe, 0x60, 0xa2, 0x5d, 0x7b, 0x9a,
+			0x23, 0x0a, 0xf7, 0xf8, 0xc4, 0xd4, 0x88, 0x96,
+			0x9b, 0x53, 0xb2, 0x96, 0x8a, 0x23, 0xfb, 0xe0,
+			0x9a, 0x25, 0x1c, 0x18, 0x4b, 0xb2, 0xa1, 0x82,
+			0x14, 0x41, 0xdd, 0xd2, 0x86, 0xbf, 0x3e, 0xbb,
+			0x83, 0xf9, 0x62, 0xba, 0xe2, 0x07, 0xcd, 0x55,
+			0xfc, 0xd3, 0x2a, 0xec, 0x6f, 0x87, 0x86, 0xfe,
+			0xc4, 0x6d, 0x61, 0xd9, 0x7c, 0xe3, 0x02, 0x0c,
+			0x1f, 0x85, 0xa3, 0xd7, 0x19, 0xda, 0xf7, 0xeb,
+			0xda, 0x6a, 0x27, 0x82, 0xb9, 0xf6, 0xd5, 0xe8,
+			0x5a, 0x2e, 0x49, 0x59, 0x91, 0xda, 0x6c, 0x05,
+			0x65, 0x5e, 0xfd, 0x85, 0xdb, 0x6d, 0x58, 0x9c,
+			0xdd, 0x25, 0xa8, 0x63, 0x3a, 0xe7, 0x62, 0xa1,
+			0x46, 0x69, 0x44, 0x61, 0x4e, 0x1a, 0x8b, 0x30,
+			0x08, 0xa9, 0xcc, 0x0f, 0x34, 0x34, 0x9a, 0xb4,
+			0x63, 0x09, 0x0d, 0x30, 0x60, 0x11, 0x62, 0xff,
+			0x49, 0x56, 0xe3, 0xca, 0x0a, 0x57, 0xb4, 0x2b,
+			0x37, 0xbb, 0x5b, 0x5f, 0x7f, 0x07, 0xf6, 0x1b,
+			0x32, 0xf8, 0xfb, 0x5b, 0xda, 0x4a, 0x29, 0xdf,
+			0x5e, 0x4e, 0xe9, 0xe0, 0x35, 0x92, 0x44, 0xa6,
+			0x39, 0x53, 0x13, 0x39, 0xb5, 0x34, 0x58, 0x3b,
+			0xec, 0x7c, 0x64, 0xcb, 0x0c, 0x11, 0x79, 0x2d,
+			0xef, 0xd6, 0x76, 0x3c, 0x76, 0x01, 0x5f, 0xa2,
+			0x95, 0xce, 0xb8, 0x11, 0x9a, 0xc8, 0x68, 0x36,
+			0x0f, 0x1d, 0xe4, 0xf4, 0x95, 0x97, 0x36, 0x82,
+			0x89, 0x46, 0x55, 0xfc, 0xa6, 0x9d, 0xcc, 0x0a,
+			0x66, 0xcc, 0x6f, 0xd6, 0xa3, 0xcd, 0x1d, 0xd2,
+			0xaa, 0xa0, 0x87, 0xe6, 0xbf, 0xde, 0xa3, 0x6f,
+			0x09, 0xfd, 0xa2, 0x5f, 0xb0, 0x63, 0xe5, 0xb2,
+			0x20, 0x51, 0x44, 0xfe, 0x22, 0xc4, 0x9c, 0xac,
+			0xc7, 0x50, 0x2c, 0x72, 0x18, 0xf9, 0x5d, 0xef,
+			0x14, 0x90, 0xb1, 0x72, 0xc9, 0xb2, 0x5b, 0x4d,
+			0xa0, 0x8c, 0x72, 0x83, 0xa3, 0x92, 0x68, 0x7d,
+			0xad, 0x16, 0x79, 0x49, 0x4a, 0xae, 0xbb, 0xbb,
+			0xb4, 0x67, 0x18, 0xb9, 0x50, 0x35, 0x75, 0x60,
+			0x9f, 0x98, 0xde, 0xe6, 0x67, 0x41, 0xcf, 0x6a,
+			0xc8, 0x3c, 0x3c, 0x62, 0xef, 0x0a, 0x3a, 0xd3,
+			0x01, 0xf1, 0x74, 0xfa, 0x7a, 0x5c, 0x83, 0x2f,
+			0x6e, 0x54, 0xf3, 0xd2, 0xe5, 0xc8, 0xe5, 0x79,
+			0xef, 0xcb, 0x39, 0xc3, 0x54, 0xbc, 0x38, 0x34,
+			0xc3, 0x91, 0x6b, 0xb5, 0xc2, 0xdc, 0x52, 0xc1,
+			0x4e, 0xd4, 0xf5, 0x31, 0x04, 0xbc, 0xbb, 0x3c,
+			0x9c, 0x88, 0x15, 0x8e, 0x97, 0x8e, 0x6c, 0xaa,
+			0xe1, 0x57, 0xf5, 0xaa, 0xb6, 0xc3, 0xd8, 0xf7,
+			0xe5, 0x80, 0xe3, 0x6b, 0x35, 0x9e, 0x21, 0x49,
+			0xb2, 0x0a, 0x0e, 0x2b, 0x7f, 0xc8, 0x3c, 0x92,
+			0xab, 0xe0, 0x56, 0x88, 0x64, 0xdc, 0x00, 0x6c,
+			0xb8, 0x9b, 0x6b, 0xec, 0x5a, 0x59, 0x05, 0xd9,
+			0x7e, 0xe7, 0x91, 0xf6, 0xe5, 0xa2, 0xe3, 0x0b,
+			0x7b, 0x3b, 0x22, 0x43, 0x33, 0xc1, 0x9a, 0x3e,
+			0xdc, 0x41, 0xb2, 0x62, 0x75, 0x24, 0xce, 0xba,
+			0xf6, 0x5a, 0xda, 0x52, 0xf3, 0x66, 0x5a, 0x89,
+			0x8b, 0xea, 0x0a, 0xdd, 0xb4, 0xc3, 0xfe, 0xbc,
+			0x52, 0x01, 0xb6, 0x72, 0xdc, 0xf7, 0xb1, 0x50,
+			0xfc, 0xce, 0xdd, 0xba, 0xd4, 0xe9, 0xd0, 0x3f,
+			0x9e, 0xca, 0xc2, 0x33, 0xa6, 0xe3, 0xc1, 0x4d,
+			0x03, 0xba, 0xb8, 0xc7, 0x0b, 0xf2, 0xd0, 0x5a,
+			0x3e, 0x28, 0x2b, 0x3d, 0xde, 0x26, 0x33, 0x86,
+			0xce, 0x0e, 0x9c, 0x7d, 0xcc, 0x18, 0x09, 0x47,
+			0x37, 0xd6, 0x7b, 0x52, 0xe0, 0x2b, 0x6e, 0x8e,
+			0xd0, 0x52, 0x07, 0x63, 0x62, 0xec, 0x92, 0x9f,
+			0xe4, 0xd0, 0xda, 0xea, 0x4e, 0x31, 0xc8, 0xfa,
+			0x5e, 0xec, 0xcd, 0x13, 0x9f, 0x09, 0xd8, 0xb8,
+			0x1e, 0x46, 0x25, 0x8c, 0x47, 0x0f, 0xdf, 0x19,
+			0x58, 0x57, 0x1c, 0xe3, 0x06, 0xf9, 0x87, 0x9c,
+			0x91, 0x7c, 0xb1, 0x9c, 0xc8, 0xad, 0xd6, 0x0d,
+			0xa3, 0x2e, 0x20, 0x04, 0xf3, 0xb2, 0xd0, 0x48,
+			0x0d, 0x13, 0xc4, 0xeb, 0x87, 0xec, 0x29, 0x17,
+			0x7f, 0xa6, 0x5a, 0x56, 0xae, 0x4c, 0xcd, 0xb5,
+			0xb0, 0x19, 0x93, 0xdb, 0xb2, 0x55, 0x4a, 0x3c,
+			0xd7, 0x1f, 0x86, 0x19, 0x8d, 0x7c, 0x9b, 0xb5,
+			0x24, 0x89, 0xda, 0xf7, 0xc4, 0x67, 0x1b, 0x80,
+			0x16, 0x1e, 0x30, 0x4f, 0x9e, 0xb7, 0x12, 0x58,
+			0x54, 0xda, 0xaf, 0x78, 0xe9, 0x6e, 0x7c, 0x98,
+			0x0d, 0x3a, 0x41, 0xcf, 0xcc, 0xbc, 0x4c, 0x9f,
+			0x1a, 0xf6, 0xd8, 0x6f, 0x61, 0x55, 0xdd, 0x00,
+			0x64, 0xf3, 0x71, 0x2b, 0x55, 0x8f, 0xd4, 0xed,
+			0xb1, 0x57, 0x8b, 0x39, 0x3e, 0x0d, 0xf5, 0x56,
+			0x5f, 0x47, 0x5d, 0x8d, 0x6c, 0x8b, 0x33, 0x44,
+			0xaf, 0x3e, 0x7c, 0x95, 0x4c, 0x45, 0x31, 0x12,
+			0x4f, 0x94, 0x47, 0xc9, 0x57, 0x4b, 0x6d, 0x05,
+			0xb9, 0x8d, 0x30, 0x54, 0x2a, 0xfd, 0x44, 0x40,
+			0xd6, 0x59, 0xab, 0x5c, 0x5d, 0x6f, 0xbb, 0xab,
+			0x4a, 0xff, 0x28, 0x60, 0xef, 0x49, 0x4b, 0x4d,
+			0x3c, 0x21, 0x5a, 0xb1, 0x56, 0x48, 0x3d, 0x60,
+			0x50, 0x83, 0x57, 0x98, 0xe8, 0x3a, 0x7f, 0xd4,
+			0xe2, 0x17, 0x82, 0xcb, 0xd6, 0x34, 0xf4, 0x57,
+			0x31, 0x1c, 0xc6, 0xc8, 0x00, 0x8d, 0x7f, 0xb0,
+			0x78, 0x47, 0x61, 0xf1, 0xd5, 0xec, 0x3b, 0x5b,
+			0x83, 0x91, 0x30, 0x58, 0x8f, 0x94, 0xc2, 0xf0,
+			0xa8, 0x61, 0xd1, 0xfa, 0x95, 0x89, 0x6c, 0x21,
+			0x76, 0xd8, 0x52, 0xf1, 0xdf, 0x85, 0xc3, 0xe6,
+			0x4f, 0x6f, 0x9f, 0xee, 0x48, 0x11, 0xbd, 0x4f,
+			0xff, 0xa9, 0xec, 0x8b, 0xf0, 0x4f, 0x67, 0x05,
+			0xb0, 0x13, 0x11, 0x39, 0x7e, 0x7c, 0xc5, 0x99,
+			0xa6, 0x73, 0x20, 0xff, 0x4b, 0x01, 0xc7, 0xc1,
+			0xf6, 0x7c, 0x0a, 0x02, 0x57, 0x0b, 0xe3, 0x75,
+			0xcc, 0x1b, 0x7a, 0xca, 0x33, 0x92, 0xdc, 0x5b,
+			0xa1, 0x9e, 0xdd, 0x9e, 0xfd, 0x38, 0xc7, 0xa1,
+			0x27, 0x81, 0xf5, 0xb4, 0x80, 0xf8, 0x0d, 0xfc,
+			0xbd, 0x2d, 0x43, 0xe0, 0x28, 0xec, 0xc4, 0x04,
+			0x00, 0x58, 0x76, 0x28, 0xb7, 0x78, 0x6c, 0xc7,
+			0x01, 0x16, 0x53, 0x47, 0xe0, 0x15, 0xe0, 0xc3,
+			0xe3, 0x34, 0x75, 0xec, 0xfb, 0x32, 0x10, 0x8f,
+			0xd5, 0x0e, 0xf7, 0xfa, 0x02, 0x1e, 0xc9, 0x14,
+			0x3b, 0x4f, 0x1d, 0xc5, 0x96, 0xac, 0x75, 0x78,
+			0x69, 0x94, 0x82, 0xd8, 0x7f, 0x10, 0xe6, 0x50,
+			0x5d, 0xef, 0x07, 0xcb, 0x64, 0x73, 0xf6, 0x34,
+			0x35, 0x22, 0x94, 0x78, 0xf0, 0x5d, 0xd7, 0x37,
+			0x74, 0xbf, 0x54, 0x3f, 0x3a, 0x6d, 0xd6, 0x6b,
+			0x1a, 0x77, 0x29, 0xee, 0x1b, 0x63, 0x54, 0xc3,
+			0x2d, 0x72, 0xf1, 0xbc, 0xc1, 0x0a, 0xe5, 0xbd,
+			0xf8, 0x1f, 0x15, 0x05, 0x8b, 0x06, 0x1e, 0x6c,
+			0xc7, 0x59, 0x48, 0xf5, 0x02, 0x39, 0x38, 0x3e,
+			0x98, 0x75, 0x65, 0xc1, 0x88, 0x32, 0xa4, 0x29,
+			0xfb, 0x2a, 0xbb, 0xfd, 0x51, 0x7e, 0x11, 0x52,
+			0x08, 0xc4, 0x0b, 0xb2, 0xba, 0xe8, 0x57, 0x6a,
+			0x2a, 0xf7, 0x41, 0x62, 0xf2, 0x40, 0xbf, 0xdc,
+			0x7d, 0x6e, 0x1c, 0xd4, 0x49, 0x20, 0x84, 0x98,
+			0x23, 0xb0, 0x3c, 0x79, 0xe8, 0x7d, 0xee, 0xc5,
+			0xb5, 0x72, 0xb1, 0xbd, 0x9b, 0x77, 0x9a, 0x40,
+			0xc2, 0xd8, 0x16, 0x56, 0x89, 0x80, 0x21, 0x43,
+			0x01, 0xbc, 0x70, 0x5b, 0x32, 0x4b, 0x3f, 0xaf,
+			0x5e, 0x49, 0x24, 0x63, 0x59, 0xa5, 0x18, 0x66,
+			0x47, 0x9c, 0x14, 0x94, 0x44, 0xab, 0x5d, 0x62,
+			0xb8, 0x86, 0x61, 0x13, 0xd3, 0x41, 0x69, 0xee,
+			0x16, 0x60, 0x48, 0xec, 0xd8, 0xaf, 0x6e, 0x83,
+			0x4b, 0x59, 0x73, 0x5c, 0xa5, 0xe5, 0xf3, 0x98,
+			0xbf, 0x7b, 0xdc, 0x51, 0xfa, 0x64, 0xab, 0x8d,
+			0x99, 0x5b, 0x29, 0x63, 0x5b, 0x3f, 0x8a, 0xaa,
+			0xca, 0xd3, 0x24, 0x76, 0x2a, 0xe8, 0xbb, 0xfc,
+			0x46, 0xc2, 0x93, 0xc5, 0xa7, 0xf0, 0x9d, 0x7d,
+			0x4c, 0x77, 0x4e, 0xfd, 0xe0, 0xad, 0x25, 0xff,
+			0x70, 0x94, 0xcb, 0x64, 0xe4, 0x4e, 0x57, 0x59,
+			0xd8, 0xc4, 0x2a, 0x8f, 0xb3, 0x95, 0xc2, 0xc4,
+			0x74, 0x0b, 0x35, 0x3c, 0x0f, 0xd3, 0x65, 0x77,
+			0x6d, 0x51, 0x4d, 0x83, 0xa8, 0x9c, 0x7a, 0xde,
+			0x8b, 0x3e, 0xda, 0x50, 0xf8, 0x3d, 0x96, 0xc9,
+			0xa8, 0x1c, 0xc1, 0xd2, 0xa7, 0x03, 0x66, 0xb9,
+			0x50, 0x20, 0xfc, 0xfc, 0xe2, 0x61, 0xff, 0x53,
+			0x3c, 0xc0, 0xae, 0xa5, 0xdd, 0x51, 0xed, 0x55,
+			0x89, 0x14, 0xb6, 0x9f, 0x86, 0xd3, 0xd4, 0xb1,
+			0x67, 0xc6, 0xd7, 0xeb, 0x59, 0xf3, 0x6a, 0x2c,
+			0x6c, 0x9a, 0x39, 0x0b, 0x92, 0x2a, 0x40, 0x14,
+			0xa2, 0xd1, 0x05, 0x2d, 0x58, 0x86, 0x6d, 0x74,
+			0xd9, 0x5c, 0x09, 0xcf, 0xb5, 0x3c, 0x91, 0x73,
+			0x56, 0x05, 0xbb, 0x6d, 0x23, 0x8b, 0xf2, 0xa4,
+			0x7b, 0x83, 0xc8, 0x7c, 0x92, 0x14, 0x32, 0xb9,
+			0x1b, 0xfe, 0x28, 0xb9, 0x1f, 0xcf, 0x4b, 0x58,
+			0x98, 0x0e, 0x30, 0xd1, 0xe5, 0x51, 0xb1, 0x51,
+			0x75, 0xdf, 0x3f, 0x3f, 0x39, 0xd0, 0xc5, 0xc8,
+			0x58, 0x6e, 0x5b, 0xf8, 0x10, 0x04, 0xa4, 0x58,
+			0xd4, 0xbf, 0x4e, 0x36, 0x3e, 0xb5, 0x11, 0xb1,
+			0x62, 0x57, 0xd2, 0xbb, 0xf7, 0x1e, 0xf1, 0xdc,
+			0x23, 0x8d, 0xb4, 0x5c, 0xef, 0xba, 0x3b, 0x83,
+			0xe3, 0xbf, 0xa4, 0xbc, 0x71, 0x15, 0xe8, 0xde,
+			0x05, 0x13, 0x10, 0xde, 0xec, 0xf7, 0x37, 0xfa,
+			0xec, 0x1b, 0x89, 0x6f, 0x3d, 0x10, 0xfa, 0x2a,
+			0xe2, 0x1c, 0x4a, 0x4a, 0xe8, 0x12, 0x36, 0x11,
+			0x99, 0x56, 0xd2, 0xd1, 0xf2, 0xc7, 0x98, 0xcd,
+			0xb1, 0xfd, 0xbb, 0xc0, 0x2e, 0xa0, 0x05, 0x2c,
+			0xe5, 0x6d, 0x1c, 0x25, 0x7d, 0x97, 0xa9, 0x29,
+			0x19, 0x92, 0xaf, 0x52, 0x5b, 0xd9, 0x05, 0x68,
+			0xae, 0x30, 0xb7, 0x38, 0x07, 0xcd, 0xc6, 0xd5,
+			0x24, 0x61, 0xc8, 0x6e, 0x26, 0x92, 0xcc, 0x34,
+			0x68, 0x52, 0x91, 0x5e, 0x5f, 0xc8, 0x67, 0x7f,
+			0xe5, 0x02, 0x35, 0x1e, 0xf3, 0x1f, 0xcc, 0x1e,
+			0x2b, 0x07, 0xbe, 0x20, 0x00, 0x5f, 0x06, 0x3e,
+			0xc4, 0x5e, 0x75, 0xc0, 0xd1, 0x04, 0x03, 0xa1,
+			0x52, 0x87, 0x77, 0x0d, 0x4a, 0xf0, 0x9a, 0xd1,
+			0x3e, 0x67, 0x59, 0x8e, 0x9e, 0x86, 0xc2, 0x89,
+			0xb8, 0xdb, 0x07, 0xca, 0xd8, 0xcb, 0x23, 0x57,
+			0x38, 0xc5, 0x22, 0x1d, 0xea, 0x44, 0xfe, 0xb1,
+			0xe2, 0xe5, 0x69, 0xd5, 0x59, 0x3b, 0x82, 0x6c,
+			0xcb, 0x02, 0x5b, 0x28, 0xe0, 0xa4, 0x02, 0x61,
+			0x8c, 0x4a, 0x23, 0x45, 0x4a, 0x61, 0xe1, 0x45,
+			0x44, 0xcd, 0x9f, 0xad, 0x5f, 0xc8, 0x1b, 0x7b,
+			0x8e, 0x39, 0x20, 0xbb, 0xc6, 0x3b, 0x76, 0x85,
+			0x56, 0xb6, 0xd2, 0xa0, 0x8f, 0x1e, 0xfa, 0xe3,
+			0xcf, 0x32, 0x42, 0x32, 0x19, 0x05, 0xdc, 0x56,
+			0x8f, 0xe3, 0x4e, 0xd9, 0x0c, 0x07, 0x54, 0x8d,
+			0x65, 0xdc, 0x08, 0x59, 0xfd, 0x9a, 0x1b, 0x1e,
+			0xf3, 0xdc, 0x32, 0x64, 0xaf, 0x17, 0xc4, 0x2c,
+			0x7e, 0x72, 0x5f, 0x3e, 0x46, 0xb7, 0xdd, 0x40,
+			0x49, 0x5b, 0x9c, 0x32, 0x92, 0x1c, 0x6c, 0x9d,
+			0x58, 0x79, 0xc2, 0xb8, 0x20, 0xbb, 0x39, 0xd9,
+			0x86, 0x7c, 0x06, 0xf3, 0x5b, 0xcb, 0x0f, 0xd0,
+			0x2d, 0x7c, 0x2e, 0x05, 0x34, 0xfc, 0xa1, 0x1f,
+			0x66, 0xba, 0x17, 0xdb, 0x3d, 0x3d, 0x2f, 0x7e,
+			0x25, 0x20, 0xa7, 0xb9, 0xd1, 0x2f, 0xea, 0x06,
+			0x33, 0x5d, 0x69, 0xe8, 0xb9, 0x05, 0x72, 0x85,
+			0x7a, 0x09, 0x99, 0x5a, 0x17, 0x57, 0x1d, 0xd7,
+			0xb1, 0xe4, 0x7e, 0x8e, 0x7a, 0x9c, 0xdf, 0xcf,
+			0x4d, 0x09, 0x53, 0x4c, 0x84, 0x57, 0xc9, 0x7b,
+			0x7f, 0x66, 0x77, 0xa6, 0xc0, 0xc9, 0x3a, 0xb1,
+			0x1f, 0xe4, 0xfc, 0x8e, 0xdd, 0x7c, 0x50, 0xe4,
+			0xdb, 0xf9, 0x35, 0x8e, 0x43, 0x3e, 0x38, 0xb1,
+			0x1b, 0x6f, 0xde, 0xab, 0xcc, 0xb4, 0x5b, 0xec,
+			0x42, 0x10, 0xc6, 0x3a, 0xd4, 0xa6, 0xc4, 0x98,
+			0xe8, 0x81, 0x30, 0x58, 0x03, 0xc6, 0xea, 0xc9,
+			0xee, 0x45, 0x1b, 0x84, 0x3d, 0x80, 0x06, 0x7f,
+			0xdf, 0x8a, 0x8c, 0xac, 0xc1, 0x33, 0x98, 0xd4,
+			0x2a, 0xdc, 0xa9, 0xe0, 0xd7, 0xd8, 0x3a, 0x4f,
+			0xd7, 0xb6, 0x5c, 0x1c, 0x4b, 0x06, 0x3e, 0x01,
+			0x62, 0xfc, 0x50, 0x64, 0xe7, 0x04, 0x59, 0x1c,
+			0x9c, 0x92, 0x81, 0xb8, 0x1f, 0x4b, 0x7e, 0xba,
+			0xfc, 0x7b, 0x2d, 0x67, 0x56, 0xfc, 0xbd, 0x41,
+			0xa9, 0xbd, 0x90, 0x25, 0xc0, 0x60, 0x0f, 0xe6,
+			0x3b, 0xcf, 0x42, 0xf2, 0xdd, 0xab, 0xd5, 0xe1,
+			0xf0, 0xbb, 0x88, 0x50, 0xf0, 0xde, 0x26, 0x91,
+			0xa7, 0x93, 0xfb, 0xe7, 0xea, 0x75, 0xf0, 0x2a,
+			0x5b, 0x97, 0xd3, 0xe2, 0x61, 0x0e, 0x4b, 0xba,
+			0x99, 0x97, 0xba, 0xbe, 0x0c, 0x86, 0x89, 0x27,
+			0x7e, 0xd4, 0xc7, 0x2d, 0xdf, 0x4b, 0x0d, 0x5c,
+			0xa9, 0x64, 0x77, 0xaf, 0xfe, 0x63, 0xc8, 0x9b,
+			0x1f, 0xfb, 0xf0, 0x86, 0xd7, 0x58, 0x7f, 0xbb,
+			0x4b, 0x07, 0x16, 0x85, 0x09, 0x3c, 0x93, 0x9a,
+			0x2d, 0x3b, 0xfe, 0xd6, 0xb0, 0x30, 0xd1, 0x0b,
+			0x87, 0xb2, 0xc6, 0xf4, 0x23, 0x36, 0x08, 0x04,
+			0xf3, 0x2d, 0x44, 0x6b, 0xbd, 0x65, 0x64, 0x14,
+			0xd2, 0x08, 0x41, 0xa9, 0xf4, 0x53, 0xd3, 0xe8,
+			0x01, 0xaa, 0xcc, 0xf6, 0xa4, 0x74, 0x53, 0x87,
+			0x84, 0x84, 0xe4, 0x49, 0xc6, 0xf8, 0xed, 0xa9,
+			0x0d, 0xdf, 0x06, 0x03, 0xbf, 0x55, 0x46, 0xa5,
+			0xb7, 0x1b, 0x24, 0xaa, 0xf2, 0x01, 0x8e, 0x25,
+			0x66, 0xe4, 0xad, 0x19, 0x89, 0x86, 0x0f, 0xf9,
+			0x5f, 0x5b, 0x78, 0x7b, 0xf2, 0xdb, 0xfd, 0x1e,
+			0xbf, 0xcb, 0x9a, 0xa4, 0x38, 0x38, 0x14, 0x91,
+			0x68, 0xda, 0x17, 0x93, 0x24, 0x42, 0xdf, 0x94,
+			0x77, 0x75, 0xb5, 0xe3, 0x05, 0x29, 0xc9, 0xfa,
+			0x31, 0x63, 0x87, 0x2d, 0x9d, 0x8d, 0xe5, 0x81,
+			0xaf, 0x0c, 0xc5, 0x25, 0xdc, 0xf4, 0xcf, 0x69,
+			0x7a, 0xe1, 0x6d, 0x26, 0x7a, 0xc6, 0xdd, 0x54,
+			0x01, 0xb3, 0x21, 0x57, 0x5b, 0xaf, 0x83, 0xa1,
+			0x15, 0x38, 0xbf, 0x02, 0x78, 0xc2, 0x8d, 0xc6,
+			0xed, 0xb1, 0xd3, 0x97, 0x97, 0xae, 0xf3, 0x90,
+			0x6a, 0xed, 0x1f, 0xb5, 0x52, 0x06, 0x58, 0xf4,
+			0x16, 0xe7, 0xde, 0x6e, 0xfc, 0x12, 0x1a, 0x8f,
+			0x72, 0xbd, 0xed, 0x13, 0x81, 0x57, 0x66, 0xf2,
+			0x1e, 0x29, 0xa0, 0x37, 0xfd, 0xa9, 0x3b, 0xec,
+			0xde, 0xb1, 0x8d, 0xb7, 0x16, 0xf6, 0xc4, 0x8b,
+			0x09, 0x32, 0xdd, 0x49, 0x0e, 0x8b, 0xbc, 0xc3,
+			0xa6, 0xd3, 0x9b, 0x8c, 0xe7, 0x1b, 0xb0, 0x71,
+			0xb9, 0x5d, 0x83, 0x59, 0xca, 0x28, 0x50, 0x70,
+			0xa1, 0x95, 0x12, 0xe9, 0xf5, 0x5d, 0x74, 0x5b,
+			0xd7, 0x55, 0xb9, 0xc4, 0xf6, 0x89, 0x19, 0x2c,
+			0x8e, 0x4a, 0x86, 0x8a, 0x4d, 0x05, 0x05, 0x85,
+			0x57, 0xc8, 0x9b, 0xf1, 0x35, 0xe0, 0xd3, 0x00,
+			0x46, 0xe6, 0x02, 0xed, 0x1e, 0xdb, 0x46, 0xb7,
+			0x22, 0xa4, 0x4b, 0xa4, 0xbd, 0x69, 0xd0, 0x89,
+			0xd6, 0x97, 0x37, 0x6c, 0xd8, 0x5e, 0x60, 0xe1,
+			0xfe, 0x4e, 0x79, 0xa9, 0x27, 0x8f, 0xf1, 0x79,
+			0xc6, 0x2b, 0x64, 0x84, 0xc0, 0x1b, 0x08, 0xe7,
+			0x83, 0xdb, 0xc0, 0x76, 0x18, 0xf3, 0x5f, 0x68,
+			0xa5, 0x67, 0x56, 0x9f, 0x38, 0x13, 0x52, 0xf0,
+			0xe3, 0x80, 0xbd, 0x85, 0x0d, 0x89, 0x1c, 0x4a,
+			0x5b, 0x29, 0x51, 0x44, 0x9c, 0xbe, 0x7d, 0x74,
+			0xb3, 0x14, 0xae, 0x1b, 0x1c, 0x33, 0x47, 0x2c,
+			0xaa, 0xdd, 0xff, 0x6f, 0xf1, 0x69, 0xf5, 0xb1,
+			0x44, 0x56, 0x4d, 0xc3, 0xb7, 0x6f, 0x29, 0xa7,
+			0x99, 0x49, 0xce, 0xa4, 0x52, 0x36, 0xa7, 0x4e,
+			0xb3, 0xad, 0x46, 0x8a, 0xa8, 0xf2, 0x8f, 0x0b,
+			0xbd, 0xd7, 0x1d, 0x79, 0x76, 0x8e, 0x0a, 0x63,
+			0xf2, 0x71, 0x90, 0xc9, 0xa2, 0x32, 0x1a, 0x05,
+			0xa5, 0x5d, 0x57, 0xb2, 0xba, 0x20, 0x10, 0x66,
+			0xac, 0x1c, 0xde, 0x4d, 0x12, 0xfc, 0xb3, 0x85,
+			0xe3, 0x12, 0xb4, 0x27, 0x8f, 0xa4, 0xc9, 0x59,
+			0x44, 0x4f, 0xdc, 0x3a, 0x74, 0x95, 0x44, 0xa5,
+			0xb1, 0x74, 0x6b, 0xbb, 0x42, 0xd8, 0x2e, 0x27,
+			0x2e, 0xc1, 0x23, 0xa3, 0x5c, 0x09, 0x1d, 0xbf,
+			0x81, 0x57, 0xa2, 0x86, 0x9d, 0xcc, 0xd9, 0x39,
+			0x76, 0x29, 0xdd, 0xde, 0x19, 0xff, 0xe8, 0x65,
+			0x70, 0xa2, 0x00, 0xd8, 0x0e, 0x50, 0xc9, 0xf7,
+			0x36, 0x19, 0x66, 0x54, 0x61, 0x9b, 0x60, 0x4d,
+			0xe0, 0xac, 0xf4, 0x8f, 0x67, 0x96, 0x27, 0x62,
+			0x4c, 0xa1, 0xfa, 0x80, 0xb5, 0x43, 0x6c, 0x61,
+			0x77, 0x07, 0x47, 0xc4, 0x6b, 0xcc, 0x23, 0x13,
+			0x9f, 0x98, 0xf7, 0x34, 0x84, 0x06, 0x3c, 0x31,
+			0xfb, 0xb5, 0x9c, 0x44, 0x51, 0xa0, 0xe7, 0x78,
+			0x7c, 0x86, 0x11, 0x55, 0xd7, 0xd8, 0x30, 0x43,
+			0x58, 0xaf, 0x9e, 0x26, 0x8c, 0x12, 0x5f, 0xce,
+			0xa7, 0xe7, 0x53, 0x3d, 0xaa, 0xf7, 0x0d, 0xf5,
+			0x9b, 0x91, 0xba, 0xac, 0xec, 0x4a, 0xb9, 0xaf,
+			0x94, 0x34, 0xb3, 0x8c, 0xf0, 0xf2, 0xce, 0x14,
+			0x2b, 0xc5, 0x35, 0x25, 0x2b, 0xcb, 0xbf, 0x5e,
+			0x91, 0x48, 0xf7, 0x01, 0x42, 0x5d, 0x17, 0x89,
+			0xeb, 0xea, 0x75, 0x5b, 0x44, 0x73, 0xa6, 0xeb,
+			0x1b, 0x8d, 0xb5, 0x95, 0xed, 0xca, 0xf3, 0x5f,
+			0xf8, 0x80, 0xc4, 0xc7, 0x2d, 0xf3, 0xf0, 0x86,
+			0x8f, 0x88, 0x6c, 0x67, 0xea, 0xd0, 0x38, 0x7a,
+			0x1b, 0x7e, 0x9e, 0xf6, 0x5f, 0x56, 0x4f, 0x94,
+			0xf2, 0xf8, 0xbb, 0x96, 0xb1, 0x9e, 0x0f, 0x90,
+			0x92, 0xe5, 0x5d, 0x16, 0xea, 0x2e, 0xab, 0x0b,
+			0x4c, 0x9b, 0x40, 0xa0, 0x35, 0x12, 0x7b, 0x88,
+			0xa6, 0xbe, 0x1d, 0x05, 0x51, 0x79, 0xe1, 0xae,
+			0x06, 0x42, 0xe7, 0xe8, 0xed, 0x36, 0xcb, 0x5f,
+			0xff, 0x05, 0x3a, 0xc3, 0x80, 0x51, 0x51, 0x14,
+			0xe0, 0x6f, 0x0d, 0x8f, 0x3a, 0xa3, 0xd0, 0x99,
+			0xb0, 0xc9, 0x02, 0x42, 0xd8, 0x26, 0xbe, 0x51,
+			0xee, 0x42, 0x7d, 0x73, 0xc2, 0xc5, 0x0b, 0xb9,
+			0x03, 0x26, 0x8e, 0xac, 0x65, 0x41, 0xbf, 0xaa,
+			0xf4, 0x34, 0xfe, 0xe1, 0xf3, 0xdb, 0x3c, 0x0b,
+			0x5c, 0x72, 0x2c, 0x0b, 0x6c, 0x83, 0x9c, 0xa4,
+			0x8f, 0xac, 0x15, 0x76, 0x23, 0xf3, 0x5b, 0xa9,
+			0x25, 0x71, 0xe1, 0x7d, 0x85, 0x41, 0xd0, 0xc8,
+			0x48, 0x93, 0x7b, 0xa0, 0x59, 0x02, 0xb9, 0xe9,
+			0x6f, 0x8c, 0xda, 0xa9, 0x0d, 0x0c, 0x95, 0x33,
+			0xfe, 0x13, 0xc0, 0xdc, 0xad, 0x36, 0xe1, 0xd0,
+			0x91, 0x4c, 0xe4, 0xa8, 0x2f, 0xf5, 0xd1, 0x66,
+			0x8a, 0x2c, 0x5d, 0xcc, 0xfb, 0xb2, 0xa9, 0x1a,
+			0x2b, 0x04, 0x9b, 0x83, 0x72, 0xb2, 0xd6, 0x43,
+			0x53, 0xcd, 0x28, 0x7f, 0x8a, 0x95, 0xb5, 0x93,
+			0x54, 0xf7, 0xcc, 0x95, 0xca, 0x8a, 0xec, 0xb2,
+			0x49, 0x46, 0x11, 0xc6, 0x4e, 0x60, 0xe5, 0xcd,
+			0x42, 0x29, 0xdf, 0x14, 0x47, 0x42, 0x6d, 0xd9,
+			0x46, 0xcb, 0x07, 0xd9, 0xf9, 0x3d, 0xa6, 0x60,
+			0x71, 0x80, 0xbb, 0xe8, 0xfd, 0x73, 0x22, 0x1a,
+			0x67, 0x5f, 0x16, 0x95, 0x81, 0x74, 0x03, 0xbe,
+			0xd7, 0x20, 0x27, 0xaf, 0xd3, 0x48, 0x62, 0x20,
+			0xca, 0x0b, 0xff, 0xd5, 0x41, 0xa5, 0xd4, 0xa9,
+			0x22, 0x51, 0x68, 0x67, 0xe3, 0x5d, 0xc1, 0x70,
+			0xc2, 0x5f, 0x79, 0xf9, 0x27, 0x4d, 0x96, 0x92,
+			0xd4, 0xd9, 0x03, 0xef, 0x50, 0xd0, 0x99, 0x69,
+			0x78, 0xe2, 0xec, 0x7d, 0x09, 0x6b, 0x96, 0xfd,
+			0x62, 0x61, 0xf4, 0xb8, 0x86, 0x09, 0xa5, 0xcf,
+			0x41, 0x67, 0x6e, 0xbe, 0x3c, 0x3f, 0xb6, 0x58,
+			0xe2, 0xe7, 0x97, 0xda, 0xde, 0x2c, 0x82, 0x12,
+			0xee, 0x44, 0xd2, 0x87, 0x91, 0x11, 0x46, 0xaf,
+			0x16, 0xf7, 0xc0, 0x8e, 0x7d, 0x71, 0x03, 0xd6,
+			0x76, 0x5c, 0x0d, 0x28, 0x16, 0x03, 0xbd, 0xc0,
+			0x7a, 0xc0, 0x44, 0x3a, 0xf0, 0xc7, 0x75, 0xc8,
+			0xad, 0x28, 0x5c, 0xd7, 0x18, 0x53, 0x5f, 0xcf,
+			0xe2, 0x72, 0x7d, 0xa6, 0xb6, 0x09, 0xf6, 0x2d,
+			0xc0, 0xaa, 0x25, 0x35, 0x2f, 0xa3, 0xbe, 0x9e,
+			0x91, 0x68, 0x57, 0xa8, 0x69, 0xa5, 0x45, 0x43,
+			0xdb, 0x58, 0xc8, 0xee, 0x05, 0x62, 0x1d, 0x7b,
+			0x0d, 0x66, 0x83, 0x44, 0x26, 0x0c, 0xdf, 0x8b,
+			0x6e, 0x72, 0x60, 0x2f, 0xd6, 0x77, 0x5d, 0x62,
+			0xc0, 0x56, 0xe3, 0x18, 0x0a, 0x85, 0x79, 0x43,
+			0x9f, 0x5c, 0x2d, 0x42, 0xd2, 0x47, 0xb2, 0xa7,
+			0x48, 0x5e, 0x29, 0x95, 0x1a, 0xd7, 0x0c, 0x65,
+			0xcd, 0x8d, 0xd9, 0xfb, 0x7d, 0xad, 0x3e, 0x93,
+			0x1c, 0x18, 0x5c, 0xaf, 0x9b, 0x24, 0x63, 0xe3,
+			0xc9, 0x90, 0x5e, 0x45, 0x51, 0x35, 0x59, 0x44,
+			0x35, 0x6b, 0xe4, 0xb1, 0x89, 0xcc, 0xc7, 0xd3,
+			0x54, 0x62, 0xa2, 0x1a, 0xc0, 0x60, 0x57, 0x9e,
+			0x70, 0x85, 0x42, 0xbe, 0x2b, 0x44, 0xe9, 0xfe,
+			0x0c, 0xa2, 0xd7, 0x49, 0xc3, 0x50, 0xd3, 0x3f,
+			0x0a, 0xa4, 0xbd, 0xf6, 0x01, 0x9b, 0x5a, 0x1f,
+			0xdf, 0xe6, 0x3f, 0x56, 0xa0, 0xc8, 0x14, 0xff,
+			0xd1, 0xd5, 0x8d, 0xab, 0x7d, 0x20, 0x82, 0x12,
+			0xe6, 0x75, 0x4e, 0xc4, 0x21, 0xd7, 0x14, 0x74,
+			0xa0, 0xb4, 0x46, 0x07, 0xd4, 0xb8, 0xc2, 0x40,
+			0xf2, 0x99, 0x33, 0xfe, 0x60, 0xe1, 0x6a, 0x69,
+			0xf2, 0x35, 0xda, 0x95, 0x57, 0x7b, 0x30, 0xe3,
+			0x34, 0x09, 0xe2, 0xf5, 0x57, 0xd7, 0x3e, 0x19,
+			0x23, 0x1c, 0x86, 0xf9, 0x9e, 0xe6, 0xb3, 0x0d,
+			0x04, 0x37, 0x1e, 0x26, 0x9f, 0xd9, 0xf6, 0xd0,
+			0x8d, 0x85, 0xa6, 0xa3, 0x27, 0x94, 0x82, 0x2b,
+			0x1f, 0x4a, 0x5f, 0xe7, 0xfb, 0x16, 0xa6, 0xab,
+			0xf9, 0x62, 0x96, 0xb9, 0x48, 0x70, 0x9a, 0xd8,
+			0x10, 0xac, 0xae, 0xc4, 0x39, 0x48, 0xfb, 0x79,
+			0x91, 0x56, 0x4c, 0x26, 0x48, 0x73, 0x90, 0x00,
+			0xf9, 0x15, 0x1b, 0x59, 0x14, 0x0b, 0x11, 0x62,
+			0xf7, 0x42, 0xc6, 0x08, 0xd6, 0xb3, 0xc2, 0x68,
+			0xd0, 0x39, 0x17, 0x6c, 0x27, 0x21, 0x53, 0xb5,
+			0x21, 0x4d, 0x85, 0x87, 0xda, 0x1b, 0x2e, 0x67,
+			0x77, 0xb7, 0xbb, 0xfc, 0x1d, 0x50, 0x8c, 0x9f,
+			0x2e, 0xae, 0xda, 0x35, 0x42, 0x56, 0x59, 0x9c,
+			0xc0, 0x04, 0x12, 0x36, 0x7e, 0x8f, 0x99, 0xb1,
+			0xe6, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
+			0x0c, 0x10, 0x13, 0x19, 0x22, },
+	}, {
+		.what = "pure rejection vector",
+		.algo = "ml-dsa65",
+		.pk_len = DILITHIUM65_PUBLICKEYBYTES,
+		.pk = (const u8[DILITHIUM65_PUBLICKEYBYTES]){
+			0xef, 0x23, 0x61, 0xd2, 0x13, 0x8e, 0xaf, 0x16,
+			0xdf, 0x67, 0x8a, 0x3e, 0xe8, 0x05, 0x1d, 0x36,
+			0xda, 0x1b, 0xb5, 0x12, 0xfd, 0xe1, 0x0d, 0x87,
+			0x63, 0x31, 0xf1, 0xff, 0xb5, 0x66, 0x63, 0x9e,
+			0x14, 0x7a, 0x48, 0x84, 0xd9, 0x35, 0x40, 0x0a,
+			0x4c, 0x15, 0x07, 0xce, 0x20, 0x68, 0x6b, 0xfb,
+			0x23, 0x2e, 0xf6, 0x40, 0xcd, 0xb6, 0x2c, 0xb3,
+			0xa0, 0x3b, 0x95, 0x13, 0xb3, 0x21, 0x4d, 0xca,
+			0xee, 0x8a, 0x3e, 0x6b, 0xb1, 0x65, 0x44, 0x7e,
+			0xac, 0x91, 0x7d, 0xcd, 0xda, 0x9f, 0xa8, 0xce,
+			0x91, 0x99, 0x2a, 0x13, 0xb9, 0xf0, 0xed, 0xd9,
+			0x00, 0x52, 0x54, 0x09, 0xde, 0xeb, 0x79, 0x41,
+			0xc3, 0x15, 0x66, 0x8b, 0x0b, 0xf3, 0x89, 0x56,
+			0x7c, 0xaa, 0xf2, 0x36, 0x16, 0x6e, 0xc5, 0x1d,
+			0x61, 0x78, 0xbb, 0x4e, 0x8d, 0x49, 0xf5, 0x6c,
+			0x7c, 0x7b, 0xe9, 0x5a, 0x58, 0xe5, 0x5d, 0x37,
+			0x23, 0x1c, 0x68, 0xb2, 0x18, 0x09, 0x1c, 0xd0,
+			0xbf, 0x7f, 0x0b, 0x39, 0xb9, 0x83, 0x15, 0xc7,
+			0x80, 0xd0, 0xed, 0xdb, 0xec, 0xed, 0x36, 0x7d,
+			0x8f, 0x5b, 0xdf, 0xa2, 0x02, 0xf7, 0x4f, 0x61,
+			0x42, 0xc2, 0xb7, 0xce, 0xe4, 0x36, 0xbb, 0x5a,
+			0x37, 0x97, 0x57, 0x4e, 0xa1, 0x03, 0x71, 0x8a,
+			0x4c, 0x69, 0x26, 0x3c, 0x4c, 0xc9, 0xfc, 0xaf,
+			0x8d, 0x0e, 0x65, 0x89, 0xef, 0xab, 0x73, 0x5c,
+			0x50, 0xed, 0x1e, 0xd6, 0x7f, 0x65, 0x85, 0xe1,
+			0xac, 0x01, 0xed, 0x59, 0xad, 0x4a, 0x80, 0xb4,
+			0x71, 0xd0, 0xea, 0x80, 0xdd, 0x37, 0xfe, 0xa8,
+			0x96, 0x0d, 0xab, 0x02, 0x42, 0x56, 0xdc, 0x3f,
+			0x9b, 0x00, 0x4e, 0x6c, 0xbb, 0x7a, 0xd1, 0x17,
+			0x40, 0x11, 0xed, 0x92, 0xc0, 0x6c, 0xfa, 0xdb,
+			0x01, 0x5b, 0x74, 0x72, 0x9d, 0xa3, 0x5b, 0x23,
+			0x86, 0x20, 0x20, 0xc5, 0x04, 0x5e, 0xbd, 0x69,
+			0xba, 0x19, 0x67, 0x41, 0x07, 0x50, 0xd0, 0x3f,
+			0x32, 0xcf, 0xce, 0x51, 0xc1, 0x9a, 0x1e, 0xa6,
+			0x99, 0x23, 0x5a, 0xf6, 0x24, 0x6d, 0xb7, 0xd8,
+			0xd9, 0x12, 0x84, 0x5e, 0x3e, 0x05, 0xc4, 0xe4,
+			0x0b, 0x52, 0x7a, 0x0f, 0xd0, 0x38, 0x69, 0x31,
+			0x02, 0xc2, 0xfb, 0x06, 0x8f, 0xbb, 0x1b, 0xb7,
+			0x96, 0x21, 0xdf, 0x45, 0xdc, 0x8c, 0x1a, 0x16,
+			0xb5, 0xa2, 0x07, 0x68, 0xdb, 0x09, 0xf3, 0xe8,
+			0x78, 0x89, 0x0f, 0x6c, 0x1a, 0x0b, 0x5e, 0xb5,
+			0xb8, 0x07, 0xb0, 0x14, 0x2a, 0x50, 0xae, 0x4c,
+			0xe4, 0x8b, 0xbc, 0x5f, 0x52, 0x4d, 0x1f, 0xe8,
+			0x77, 0xc4, 0x8c, 0x46, 0xe8, 0x81, 0x3b, 0x6a,
+			0x60, 0xcc, 0x82, 0xcd, 0x04, 0x22, 0x38, 0x77,
+			0x3f, 0x95, 0x95, 0x55, 0x55, 0xa9, 0x4a, 0x65,
+			0x8d, 0x92, 0x8b, 0x61, 0xbc, 0xae, 0xe0, 0x16,
+			0x49, 0x8c, 0x08, 0x4f, 0xb0, 0x70, 0x76, 0xcc,
+			0xec, 0xee, 0x4a, 0x5e, 0x4b, 0x2b, 0x53, 0x03,
+			0xc3, 0x67, 0xf6, 0x4f, 0x2f, 0xd3, 0x8c, 0x18,
+			0xf0, 0x74, 0x26, 0xd7, 0x57, 0xef, 0x39, 0x6f,
+			0x13, 0x07, 0x1c, 0xfd, 0x98, 0x97, 0x61, 0x08,
+			0xbc, 0x24, 0xd3, 0xd6, 0x43, 0x2e, 0x6b, 0x06,
+			0x7a, 0x27, 0x2a, 0x94, 0xfc, 0x21, 0x83, 0xc6,
+			0xd6, 0xe6, 0x52, 0xd1, 0x62, 0x48, 0x0e, 0x93,
+			0x06, 0x08, 0xb6, 0x41, 0x4c, 0x76, 0x78, 0x98,
+			0x2b, 0xb8, 0x68, 0x81, 0x36, 0xb6, 0x12, 0x3c,
+			0x47, 0xae, 0x54, 0xb9, 0xa1, 0xca, 0x9e, 0x6e,
+			0x54, 0x64, 0x91, 0x4a, 0x4f, 0xd8, 0xee, 0xb4,
+			0xdb, 0x80, 0xc4, 0xa7, 0x49, 0x62, 0xdf, 0xb3,
+			0xc4, 0xd7, 0xf4, 0xbf, 0xab, 0xe8, 0xcb, 0xb9,
+			0xc4, 0x70, 0xf2, 0xbf, 0x77, 0xac, 0xe7, 0xdb,
+			0x09, 0xd7, 0x9e, 0x1f, 0x00, 0x5a, 0x2b, 0xb1,
+			0xfb, 0x89, 0x2e, 0x14, 0xe1, 0x2a, 0xf2, 0xae,
+			0x11, 0x44, 0xa6, 0xa2, 0x31, 0x2e, 0x60, 0xb2,
+			0x3e, 0xb0, 0x10, 0x2f, 0x18, 0x17, 0xff, 0x32,
+			0xf1, 0xc9, 0x21, 0xb8, 0xf3, 0x50, 0xf3, 0x3d,
+			0xb0, 0xf3, 0xeb, 0xd1, 0x10, 0x21, 0x53, 0x9a,
+			0xbd, 0xf2, 0x18, 0x4d, 0xfb, 0x1e, 0xab, 0x2e,
+			0xb6, 0x9b, 0xf6, 0x7c, 0xd4, 0xfc, 0x1e, 0xbe,
+			0xee, 0xae, 0x57, 0xee, 0xde, 0xd2, 0xb1, 0x06,
+			0x3c, 0xcc, 0x36, 0x10, 0xc1, 0xc9, 0xc1, 0x47,
+			0x15, 0x4f, 0x1b, 0x10, 0x0f, 0xaf, 0xc3, 0x7b,
+			0x25, 0x2d, 0xe5, 0x9a, 0x6e, 0xef, 0xf1, 0xa9,
+			0x25, 0xe6, 0xf3, 0x28, 0x82, 0x73, 0x4b, 0x44,
+			0x56, 0x30, 0x9b, 0xe0, 0xfb, 0xfc, 0x5c, 0x84,
+			0xd8, 0xe7, 0xf3, 0x0d, 0x43, 0x8b, 0xdc, 0xae,
+			0x97, 0xeb, 0x45, 0x9f, 0x0e, 0xb7, 0x58, 0x65,
+			0x86, 0x9e, 0x24, 0x2f, 0xd7, 0x4f, 0x21, 0x9c,
+			0x67, 0x76, 0x91, 0x27, 0xed, 0x9f, 0xa3, 0xa6,
+			0x15, 0x5e, 0xa8, 0x13, 0x58, 0x53, 0x1c, 0x7c,
+			0x24, 0x85, 0xbf, 0xea, 0xba, 0x01, 0xd5, 0xf3,
+			0x29, 0xa4, 0xd0, 0x34, 0x04, 0x67, 0xf8, 0xb2,
+			0xd0, 0x2c, 0x08, 0xd3, 0xb4, 0x6b, 0x42, 0xec,
+			0xd0, 0x1e, 0x2e, 0x02, 0xcc, 0xeb, 0xa6, 0x9f,
+			0x2b, 0x3a, 0x1b, 0x45, 0x83, 0x53, 0xeb, 0xb1,
+			0x8f, 0x51, 0x3d, 0xee, 0xf3, 0x5f, 0x05, 0x10,
+			0xfa, 0x15, 0x15, 0x3f, 0x0a, 0x7b, 0xfe, 0xf4,
+			0x11, 0x72, 0xc1, 0xe9, 0x99, 0x15, 0x25, 0x74,
+			0xf9, 0xe0, 0x14, 0xc6, 0x2b, 0x49, 0x4b, 0x1b,
+			0xa2, 0x42, 0x75, 0xd6, 0x0f, 0x3e, 0xc6, 0x74,
+			0xbb, 0x44, 0x1f, 0xc4, 0x09, 0x8b, 0x91, 0x9e,
+			0x55, 0x5d, 0x4b, 0xaa, 0xe8, 0x16, 0x33, 0x6d,
+			0x3d, 0xe5, 0x5d, 0x94, 0xb7, 0x66, 0x5a, 0xf6,
+			0x4e, 0x5b, 0x04, 0x16, 0x7b, 0xd3, 0x31, 0x3d,
+			0x7a, 0x98, 0xb6, 0x93, 0x69, 0x40, 0x42, 0x1c,
+			0xcd, 0x07, 0xc9, 0x80, 0xb0, 0xd4, 0xce, 0x70,
+			0x98, 0x19, 0xad, 0x3d, 0xd1, 0x7b, 0xad, 0x8d,
+			0x01, 0x4b, 0x26, 0x12, 0x5b, 0xbc, 0x83, 0xbf,
+			0xc5, 0x4d, 0xf1, 0xf7, 0xaf, 0xaf, 0xdf, 0xc7,
+			0x3c, 0x8a, 0x6c, 0x65, 0xd0, 0x0c, 0x2e, 0x6b,
+			0x77, 0xd2, 0xb7, 0x2e, 0xd4, 0xe5, 0xf6, 0x90,
+			0xd3, 0x3b, 0xd4, 0xee, 0xe0, 0x10, 0x65, 0x81,
+			0x28, 0x24, 0x77, 0xd6, 0x87, 0x94, 0x87, 0x80,
+			0xe0, 0xf1, 0x43, 0x7b, 0xc0, 0x9e, 0xa9, 0x74,
+			0xfe, 0xa2, 0xf2, 0x85, 0x47, 0x64, 0xe1, 0x31,
+			0xe0, 0x5a, 0x99, 0x67, 0x77, 0x82, 0x4e, 0x01,
+			0x56, 0xac, 0x28, 0x6d, 0xb8, 0x92, 0x57, 0x7b,
+			0x86, 0xb2, 0x78, 0x2d, 0x98, 0x9b, 0x8f, 0x59,
+			0xfa, 0xe2, 0x46, 0x91, 0xfe, 0x64, 0xa3, 0x2e,
+			0xa4, 0x4c, 0xca, 0xdc, 0x29, 0xb2, 0xb7, 0x4a,
+			0x91, 0x95, 0x08, 0x7b, 0x7e, 0x45, 0x7a, 0x37,
+			0xc7, 0x67, 0xcf, 0x59, 0x63, 0x78, 0xa1, 0x85,
+			0x35, 0xa6, 0x35, 0x15, 0x91, 0x9b, 0x31, 0x3f,
+			0x66, 0x23, 0x01, 0x29, 0x9b, 0x04, 0x54, 0x01,
+			0x5c, 0x1f, 0x47, 0x51, 0x90, 0x6c, 0x16, 0x56,
+			0xe9, 0x76, 0x4e, 0x89, 0x91, 0x13, 0xa0, 0x2b,
+			0xcf, 0x33, 0x95, 0xac, 0x83, 0x42, 0x16, 0x1c,
+			0xc5, 0xda, 0x1b, 0xe2, 0x60, 0xc6, 0x31, 0x97,
+			0x28, 0x2a, 0x40, 0x92, 0x02, 0x65, 0x06, 0x3c,
+			0xe9, 0x06, 0x3a, 0xa6, 0xc2, 0x3e, 0x6b, 0x22,
+			0x4b, 0x99, 0x04, 0x9d, 0x01, 0x5a, 0x88, 0x25,
+			0x6f, 0xa5, 0x9a, 0xc4, 0x86, 0x5e, 0x37, 0xcd,
+			0x86, 0x0e, 0x19, 0xb6, 0xcb, 0xa8, 0xf1, 0x46,
+			0xf9, 0x0d, 0x8c, 0x76, 0x74, 0xf6, 0x71, 0x93,
+			0x5b, 0x2a, 0xec, 0xe2, 0xc5, 0x05, 0x42, 0x2b,
+			0x67, 0xb7, 0x8d, 0xb6, 0x9e, 0x14, 0x09, 0xd7,
+			0x1d, 0x91, 0xa6, 0x03, 0x90, 0x0e, 0x68, 0xcc,
+			0xf2, 0x35, 0x31, 0xed, 0x0b, 0xc1, 0xaf, 0x41,
+			0x7a, 0x6e, 0xc9, 0x9b, 0xa0, 0x24, 0x6d, 0xe7,
+			0xbe, 0x89, 0x0f, 0x52, 0xbc, 0xe6, 0x4d, 0xa6,
+			0x73, 0xc5, 0x54, 0x60, 0xd1, 0xbe, 0xf1, 0x61,
+			0x03, 0x73, 0x46, 0x71, 0x3e, 0x18, 0x16, 0x07,
+			0xd0, 0x01, 0xed, 0x53, 0xd8, 0x95, 0x4e, 0xf9,
+			0x23, 0xae, 0xfc, 0xd7, 0xd3, 0x7d, 0x7e, 0xf2,
+			0x99, 0x31, 0x99, 0xda, 0xe8, 0xb8, 0x19, 0x12,
+			0xf4, 0x48, 0x5f, 0xfd, 0x90, 0x29, 0x82, 0x1d,
+			0x48, 0xab, 0xe6, 0x05, 0xfa, 0x94, 0x45, 0x04,
+			0x4c, 0x4d, 0x44, 0xde, 0x51, 0xc4, 0xf7, 0x79,
+			0x4b, 0xe1, 0xd5, 0xd1, 0x86, 0x1a, 0xc3, 0x53,
+			0xfa, 0xe7, 0x1b, 0x0f, 0x3e, 0x4a, 0x26, 0x09,
+			0xa2, 0xa0, 0x8d, 0xc7, 0x2b, 0x20, 0xa1, 0x16,
+			0x7b, 0xd3, 0xa5, 0xb9, 0xd9, 0x7a, 0x21, 0x12,
+			0x36, 0xf3, 0xc6, 0xa4, 0x7f, 0x4a, 0x92, 0xf0,
+			0xdb, 0xdc, 0x4c, 0x81, 0xf1, 0x2f, 0x41, 0xb3,
+			0xed, 0x0c, 0x08, 0xf8, 0x5d, 0x23, 0x8c, 0x41,
+			0x7a, 0xf1, 0x51, 0xb7, 0x72, 0x81, 0xa3, 0x0b,
+			0xf8, 0xab, 0x05, 0x44, 0xb2, 0xb1, 0x01, 0x64,
+			0xdd, 0x9f, 0x6b, 0x27, 0x55, 0xd2, 0xa6, 0x56,
+			0xcd, 0x76, 0xf0, 0x77, 0x05, 0x4d, 0x08, 0xc4,
+			0x46, 0xc4, 0x83, 0xa3, 0x27, 0x24, 0x79, 0x8d,
+			0xd9, 0x3f, 0x5b, 0xd3, 0xaa, 0x7a, 0x6e, 0x04,
+			0xb2, 0x8c, 0xe7, 0xe6, 0xce, 0xa8, 0x55, 0xc9,
+			0x12, 0x7e, 0xd1, 0x78, 0x2e, 0xed, 0xbf, 0x04,
+			0x1b, 0x73, 0x21, 0x66, 0xa7, 0xf4, 0x07, 0xe1,
+			0x74, 0x2e, 0x22, 0x00, 0xd5, 0x8e, 0x84, 0x89,
+			0x60, 0x60, 0x4f, 0xda, 0xfb, 0x9a, 0xda, 0xd8,
+			0x45, 0x41, 0x95, 0x77, 0x22, 0x89, 0x10, 0x9b,
+			0xb0, 0x64, 0xc3, 0x0a, 0x1c, 0x61, 0x4a, 0xdb,
+			0x84, 0xca, 0x19, 0x47, 0x9e, 0x82, 0xbe, 0x56,
+			0x22, 0xe3, 0xf5, 0xc7, 0x91, 0x6e, 0x67, 0x26,
+			0x04, 0xa4, 0x31, 0x5b, 0xf7, 0x2f, 0x6a, 0x01,
+			0xad, 0xd4, 0x7c, 0x4e, 0x74, 0xa6, 0x87, 0x23,
+			0x31, 0x37, 0x08, 0xd2, 0x2c, 0x0d, 0x94, 0x1c,
+			0x96, 0x52, 0xe0, 0x56, 0x23, 0x23, 0x31, 0x59,
+			0x8c, 0xaf, 0x48, 0xe6, 0x07, 0x8e, 0x0d, 0x6c,
+			0x09, 0x0b, 0xf2, 0xad, 0x33, 0x14, 0xcd, 0x91,
+			0xe7, 0x48, 0xc9, 0x45, 0xcf, 0xad, 0xac, 0xe1,
+			0x0a, 0x5b, 0x81, 0x7a, 0xc9, 0x9a, 0xb5, 0x98,
+			0x3d, 0xad, 0xb2, 0x1c, 0x79, 0xa9, 0x5f, 0xbb,
+			0x2b, 0x4e, 0x53, 0x2f, 0xff, 0x8f, 0x9e, 0xb1,
+			0x46, 0x07, 0x1c, 0x48, 0x16, 0xb6, 0xdd, 0x7b,
+			0x6a, 0x32, 0xb5, 0x46, 0xfe, 0xb8, 0x51, 0x3f,
+			0xfc, 0xfc, 0x24, 0x1a, 0xe8, 0x29, 0x05, 0x81,
+			0x31, 0xc2, 0x2a, 0x09, 0x1d, 0xfb, 0xc9, 0x7c,
+			0x6c, 0x23, 0x18, 0xa5, 0x2f, 0x69, 0xca, 0xfb,
+			0xd6, 0xb0, 0x29, 0xd3, 0xe6, 0x18, 0xb6, 0x2b,
+			0x38, 0x23, 0x15, 0x75, 0xc6, 0x37, 0x2a, 0xa4,
+			0x24, 0x38, 0x84, 0x54, 0xbc, 0xa4, 0x29, 0x4d,
+			0x2a, 0x04, 0x45, 0x05, 0xc2, 0x10, 0x03, 0x69,
+			0xc7, 0x27, 0x5c, 0x49, 0xcf, 0xc0, 0x7d, 0xbb,
+			0x09, 0xa9, 0x0b, 0x6e, 0xea, 0x80, 0xb2, 0x0e,
+			0x60, 0x98, 0x1f, 0xf3, 0x27, 0x8c, 0x17, 0x23,
+			0x50, 0x98, 0xae, 0x1a, 0x7c, 0xbf, 0x48, 0xdd,
+			0x8b, 0x77, 0x62, 0x23, 0xcd, 0x34, 0x17, 0x39,
+			0x96, 0x23, 0x47, 0x08, 0x12, 0xb7, 0x8e, 0x74,
+			0xce, 0x4f, 0xf9, 0x26, 0x25, 0x57, 0xa4, 0x28,
+			0x36, 0x8e, 0xac, 0x98, 0x13, 0x0f, 0xe3, 0x5f,
+			0x24, 0x15, 0x9f, 0xee, 0xb5, 0xfa, 0x8e, 0x39,
+			0xcc, 0xaf, 0x14, 0x04, 0x51, 0xd0, 0x1f, 0xea,
+			0x2f, 0xd3, 0xc8, 0xe4, 0xd4, 0xe9, 0xfe, 0x68,
+			0xe6, 0xe5, 0x96, 0x78, 0x95, 0xaa, 0x9a, 0x62,
+			0x11, 0x76, 0x06, 0x1f, 0x07, 0xec, 0xdb, 0xe2,
+			0x89, 0x73, 0x3c, 0xe7, 0xc6, 0xda, 0x7d, 0x79,
+			0x22, 0x58, 0x65, 0x8a, 0xaf, 0xbf, 0xd7, 0xb2,
+			0x3e, 0x8b, 0x08, 0x34, 0x8b, 0x0e, 0x85, 0x58,
+			0x0b, 0xb1, 0x05, 0x7a, 0x11, 0x41, 0x55, 0x75,
+			0x6c, 0x1c, 0xb7, 0x59, 0x7c, 0x80, 0x02, 0xae,
+			0xa8, 0xea, 0xda, 0xe2, 0xfd, 0x60, 0xc5, 0x98,
+			0xc5, 0x53, 0xb4, 0xf6, 0x9f, 0x21, 0x7a, 0x29,
+			0xe0, 0x48, 0x59, 0xed, 0xc9, 0x96, 0x1e, 0xbe,
+			0x59, 0xeb, 0x7e, 0x1f, 0x11, 0x23, 0x2a, 0x05,
+			0x09, 0x9d, 0x9d, 0x6f, 0xef, 0xa1, 0xf1, 0xd1,
+			0xce, 0x3b, 0x86, 0xd3, 0xa7, 0x46, 0xae, 0x35,
+			0x1d, 0x88, 0x7d, 0x69, 0x1a, 0x75, 0xc3, 0x13,
+			0x4c, 0x39, 0xed, 0x89, 0x56, 0x74, 0xc8, 0x0a,
+			0xd6, 0x5d, 0x9d, 0x7b, 0x65, 0x85, 0x95, 0xa2,
+			0x4a, 0xdc, 0x6b, 0xb1, 0x44, 0xda, 0x05, 0x1b,
+			0x7e, 0x61, 0x28, 0x36, 0x4f, 0xcd, 0xc4, 0x00,
+			0x30, 0x8c, 0x0c, 0xb6, 0x36, 0xfb, 0x5d, 0xf2,
+			0x1b, 0x3e, 0x88, 0x2c, 0x10, 0xaf, 0xd0, 0x07,
+			0x85, 0xd1, 0xd7, 0x81, 0xd0, 0xb7, 0xb4, 0xf1,
+			0xe4, 0x3c, 0xb1, 0xcf, 0x13, 0x58, 0xc6, 0x94,
+			0x10, 0xc2, 0x66, 0xd9, 0xda, 0x4c, 0x88, 0x56,
+			0xf5, 0xe6, 0x1b, 0x6a, 0xb7, 0x0a, 0xb6, 0xec,
+			0x09, 0x2e, 0x12, 0x7d, 0x96, 0x7c, 0x75, 0x3b,
+			0x7c, 0x71, 0x92, 0xa2, 0xa1, 0xab, 0x10, 0xc7,
+			0x2d, 0x18, 0xfb, 0x52, 0x8a, 0x87, 0x7e, 0x76,
+			0xc2, 0xe0, 0x4f, 0x24, 0x5a, 0xd8, 0x04, 0xf5,
+			0xcb, 0xf1, 0x42, 0x4b, 0xd8, 0xb0, 0x98, 0x18,
+			0x48, 0xe7, 0x44, 0xba, 0xb7, 0x0d, 0xf6, 0xb7,
+			0xd0, 0x1a, 0x67, 0x82, 0xfc, 0xa0, 0x70, 0x5e,
+			0x13, 0xce, 0xf5, 0x13, 0xf9, 0x66, 0x59, 0xd8,
+			0xa9, 0xfa, 0x40, 0x16, 0xb1, 0xef, 0x09, 0x18,
+			0xa6, 0xa6, 0xee, 0xda, 0x2d, 0xfa, 0x57, 0x3b,
+			0xda, 0x92, 0x1c, 0xd7, 0x01, 0xa2, 0xca, 0x3d,
+			0xe9, 0x06, 0xa6, 0x0b, 0xd3, 0x52, 0xd3, 0x8c,
+			0xc8, 0xff, 0x0a, 0x92, 0x56, 0x41, 0x98, 0xd1,
+			0xaa, 0xc9, 0x6f, 0x96, 0xe8, 0xec, 0x68, 0xc0,
+			0x91, 0x7c, 0x0b, 0xd5, 0xc1, 0x25, 0x45, 0x2b,
+			0x84, 0x28, 0xa4, 0x46, 0x78, 0x58, 0xa1, 0xbf,
+			0x52, 0xd0, 0x48, 0xc4, 0xfc, 0x37, 0xf2, 0x41,
+			0x23, 0x14, 0x37, 0x32, 0x01, 0x2e, 0xbc, 0xe1,
+			0xa1, 0x30, 0x13, 0x26, 0x40, 0x23, 0x80, 0x7c,
+			0x92, 0x80, 0x06, 0x83, 0x6e, 0xb7, 0x25, 0x67,
+			0x41, 0x01, 0x34, 0x4a, 0x8e, 0x8a, 0xb0, 0x81,
+			0x47, 0xbb, 0x52, 0x61, 0x04, 0x6a, 0x8f, 0x1b,
+			0xac, 0x84, 0xfd, 0x59, 0x48, 0xfe, 0xdf, 0x49,
+			0x96, 0xfb, 0x21, 0x4b, 0x5d, 0xf4, 0x5e, 0x40,
+			0x85, 0x1f, 0x23, 0x05, 0x90, 0x69, 0xdc, 0x57,
+			0x78, 0x65, 0x7f, 0x1d, 0x3c, 0xfa, 0x8e, 0x59,
+			0xde, 0xa4, 0xf9, 0x38, 0xc5, 0x5f, 0xa1, 0x8e,
+			0xff, 0x58, 0x2e, 0x29, 0x59, 0x4a, 0x47, 0x52,
+			0xa7, 0xaa, 0xda, 0xeb, 0xdd, 0x76, 0x0a, 0x0e,
+			},
+		.msg_len = 64,
+		.msg = (const u8[64]){
+			0x67, 0x6f, 0x8e, 0xb2, 0xcd, 0xfd, 0x17, 0xfb,
+			0xdb, 0xbc, 0x03, 0xa0, 0xe9, 0xfd, 0x3e, 0x7a,
+			0x94, 0xea, 0x50, 0xd5, 0x1c, 0xfb, 0xec, 0x7a,
+			0x3e, 0xe0, 0xde, 0x78, 0x58, 0xe8, 0x31, 0x8a,
+			0x8a, 0x07, 0x6f, 0xd6, 0xb0, 0xad, 0x10, 0xaa,
+			0xac, 0x1d, 0x6d, 0xcc, 0xea, 0x45, 0xba, 0x40,
+			0xb4, 0x2c, 0x4d, 0x31, 0x85, 0x86, 0xb7, 0x4d,
+			0x64, 0xa1, 0xa6, 0xef, 0x18, 0x77, 0xd0, 0xf0,
+			},
+		.sig_len = DILITHIUM65_CRYPTO_BYTES,
+		.sig = (const u8[DILITHIUM65_CRYPTO_BYTES]){
+			0x0c, 0x79, 0x06, 0x52, 0x49, 0x9c, 0x28, 0x59,
+			0xcd, 0x66, 0x15, 0x4e, 0xe9, 0x6d, 0x6d, 0x25,
+			0x57, 0x32, 0x31, 0x59, 0xa7, 0xf8, 0xe1, 0x6c,
+			0xbb, 0xa0, 0xdf, 0x01, 0x3f, 0xfa, 0xe0, 0x9a,
+			0xa9, 0x28, 0x0e, 0x83, 0x13, 0x91, 0x5f, 0x30,
+			0xa9, 0x71, 0xd5, 0x7e, 0x77, 0xf1, 0x7e, 0xe4,
+			0xb1, 0x30, 0x14, 0x8d, 0x5b, 0x0b, 0x59, 0xe0,
+			0x17, 0xe3, 0x97, 0xa6, 0x60, 0x9c, 0x66, 0xf4,
+			0xdb, 0x20, 0xf1, 0xc7, 0x1b, 0x64, 0x02, 0x6f,
+			0x4e, 0x6b, 0xcc, 0xa6, 0xf7, 0x99, 0x61, 0xd2,
+			0x2f, 0x70, 0x4b, 0x24, 0x3e, 0x35, 0x04, 0xe6,
+			0xf1, 0xf3, 0x97, 0x86, 0xb3, 0xe8, 0x2c, 0x00,
+			0xaf, 0xb6, 0x11, 0xb0, 0x6c, 0x2e, 0x56, 0x10,
+			0xf0, 0x30, 0x94, 0x1d, 0x1a, 0x4f, 0xd3, 0xed,
+			0x94, 0x0e, 0x9c, 0xd8, 0xeb, 0xd3, 0x26, 0x5c,
+			0x77, 0x51, 0x2e, 0x47, 0xc3, 0xcf, 0x7e, 0x94,
+			0xcd, 0x47, 0x48, 0x90, 0xee, 0x51, 0x4d, 0xf1,
+			0xce, 0xc5, 0xe2, 0x41, 0x61, 0xbf, 0x8a, 0xb8,
+			0x47, 0x2d, 0x0f, 0xff, 0x9b, 0x1b, 0x1b, 0xaf,
+			0xc0, 0x54, 0x1e, 0x41, 0xce, 0x28, 0xc7, 0x0a,
+			0xe6, 0x0a, 0xa2, 0x1a, 0x86, 0xe8, 0x6c, 0x6d,
+			0xec, 0xb6, 0xf8, 0x5f, 0x52, 0x5a, 0x14, 0xc6,
+			0x96, 0xe3, 0xc0, 0xe7, 0x41, 0x37, 0x02, 0x3d,
+			0x38, 0xe8, 0x16, 0x09, 0x88, 0xe2, 0xa9, 0x28,
+			0x28, 0x68, 0x14, 0x07, 0xd9, 0xb6, 0x36, 0xce,
+			0x2a, 0xc1, 0xf1, 0xc4, 0x08, 0x54, 0x38, 0xc0,
+			0x77, 0x9f, 0x7c, 0x63, 0xde, 0x3f, 0x0c, 0xbc,
+			0xd2, 0xef, 0xeb, 0xf4, 0x9e, 0x8e, 0xb0, 0x9c,
+			0x5a, 0xa1, 0xcb, 0x62, 0x4c, 0x0e, 0x1c, 0xe5,
+			0xdb, 0x23, 0x85, 0xde, 0xf8, 0x21, 0x1e, 0x2d,
+			0xcc, 0x9f, 0x1f, 0xb3, 0xe7, 0x27, 0x8a, 0x5a,
+			0xfc, 0x02, 0xe2, 0x72, 0x71, 0x30, 0x01, 0x71,
+			0xd0, 0x3e, 0x90, 0xaf, 0x5d, 0x9d, 0x38, 0xa8,
+			0xc4, 0xfc, 0xa1, 0x3a, 0xfb, 0xf7, 0x69, 0x26,
+			0x5c, 0x13, 0xb4, 0x2c, 0x5b, 0x31, 0xcd, 0x8c,
+			0x26, 0x99, 0xed, 0x62, 0x5b, 0x39, 0x8e, 0x59,
+			0xb1, 0xe5, 0xf5, 0xdc, 0x36, 0xe8, 0x87, 0x0a,
+			0xe4, 0x82, 0x60, 0x48, 0x70, 0xb1, 0x08, 0x68,
+			0xf4, 0xeb, 0x86, 0x28, 0x45, 0xfc, 0x5a, 0x60,
+			0x3f, 0x5e, 0x82, 0xc0, 0x3b, 0x18, 0xd2, 0x0e,
+			0xa8, 0xf2, 0xb0, 0x07, 0xf4, 0xbd, 0xab, 0x23,
+			0x0c, 0x4e, 0xe0, 0xae, 0x38, 0xe6, 0x93, 0x4f,
+			0x58, 0xcd, 0x0b, 0x67, 0xe5, 0xb3, 0xdd, 0x81,
+			0x33, 0x9e, 0xdc, 0xd5, 0xc0, 0x1a, 0xde, 0x22,
+			0x02, 0xf9, 0x3e, 0xd6, 0x53, 0x39, 0x79, 0xc8,
+			0x9f, 0x8a, 0xc5, 0xc9, 0xb0, 0x2a, 0xcb, 0x73,
+			0x86, 0xd1, 0xc1, 0xa7, 0x90, 0xe9, 0xc2, 0x37,
+			0x3f, 0x9f, 0x5a, 0x09, 0xd5, 0x99, 0x4b, 0xd6,
+			0x37, 0x3b, 0xa5, 0x78, 0x97, 0xaf, 0xa9, 0x37,
+			0xe4, 0x3a, 0x64, 0x46, 0x6b, 0x6b, 0xd4, 0x11,
+			0x2e, 0x24, 0x98, 0xd6, 0x15, 0x36, 0x77, 0x64,
+			0x27, 0x84, 0x67, 0x84, 0x12, 0xa6, 0x93, 0x0d,
+			0x53, 0x05, 0xff, 0x52, 0x54, 0x4b, 0x22, 0xab,
+			0x28, 0xcd, 0x37, 0x05, 0x0b, 0x65, 0x97, 0xd0,
+			0x74, 0xaa, 0xa6, 0x16, 0x5c, 0x89, 0x55, 0x08,
+			0xbd, 0xf4, 0x77, 0x68, 0xab, 0x5c, 0x7d, 0xc4,
+			0x58, 0x46, 0x15, 0x6e, 0x7f, 0x94, 0xf2, 0xd9,
+			0x4f, 0xe9, 0x75, 0x83, 0x01, 0xca, 0xc2, 0x8d,
+			0x30, 0x63, 0x3a, 0xda, 0x27, 0x16, 0x3b, 0x9d,
+			0x45, 0x04, 0x64, 0xe0, 0x76, 0xec, 0x6e, 0x4f,
+			0x76, 0x88, 0x21, 0xe3, 0x73, 0xa8, 0x0a, 0xe3,
+			0x72, 0xd0, 0x73, 0x41, 0xba, 0x06, 0x79, 0x90,
+			0xf5, 0x5c, 0xb6, 0x23, 0x57, 0xca, 0x62, 0xca,
+			0x0a, 0xe9, 0xd4, 0x20, 0x16, 0xe7, 0xc3, 0x2c,
+			0x92, 0x4c, 0x3a, 0x14, 0xe3, 0x9a, 0x67, 0x80,
+			0x14, 0x41, 0x80, 0x1b, 0xe2, 0x8b, 0x00, 0xa0,
+			0xb6, 0xc3, 0x78, 0x58, 0xf0, 0x29, 0xa9, 0x0f,
+			0x2e, 0x1b, 0x17, 0x3b, 0x07, 0x70, 0xc0, 0x41,
+			0x39, 0x06, 0x67, 0x91, 0x60, 0x3a, 0x43, 0xc9,
+			0x1e, 0x1d, 0x39, 0xe8, 0xde, 0xc1, 0x62, 0x58,
+			0xf6, 0x63, 0xf5, 0xed, 0x83, 0x5e, 0x15, 0xf1,
+			0x41, 0xcf, 0x8c, 0x71, 0x64, 0xf6, 0x76, 0xbb,
+			0xb6, 0xb4, 0x8e, 0x2a, 0x95, 0x5c, 0x0b, 0xe4,
+			0x92, 0x79, 0x56, 0x69, 0xd9, 0x2b, 0x71, 0x61,
+			0xa7, 0x1b, 0x48, 0x07, 0x2d, 0xb6, 0x3a, 0x0b,
+			0xf9, 0xc2, 0xc1, 0x6f, 0x69, 0x5c, 0x47, 0xa8,
+			0x99, 0x20, 0x05, 0xd5, 0x54, 0x32, 0xdb, 0xbc,
+			0x88, 0xb1, 0xa3, 0x10, 0x85, 0xf7, 0x98, 0xbd,
+			0x89, 0xa9, 0xf0, 0x6c, 0x7e, 0xe7, 0xda, 0x56,
+			0xc1, 0x61, 0x50, 0x79, 0x79, 0x71, 0xb5, 0x83,
+			0xd5, 0x2a, 0xd2, 0xd6, 0x41, 0x31, 0x1e, 0x8a,
+			0x1f, 0x3d, 0xad, 0xf9, 0xb8, 0x5e, 0x7a, 0x80,
+			0xc7, 0x9d, 0x07, 0x14, 0xe5, 0xde, 0x28, 0x39,
+			0x17, 0x2c, 0xed, 0x2b, 0x5f, 0xe5, 0x3d, 0x3e,
+			0x54, 0x4f, 0x0d, 0x9c, 0xa1, 0x83, 0xd7, 0xaf,
+			0x7a, 0x39, 0xf1, 0xaa, 0xa7, 0x5d, 0xd9, 0x2a,
+			0x7c, 0xbe, 0x4f, 0xb4, 0xb8, 0x85, 0xcf, 0xbf,
+			0x0e, 0x42, 0x90, 0x90, 0x48, 0xc5, 0x96, 0x26,
+			0xbb, 0x7e, 0x94, 0x90, 0x25, 0x3b, 0x25, 0xb9,
+			0xa9, 0xa1, 0xed, 0x18, 0xfa, 0x9a, 0x46, 0xe4,
+			0xca, 0x3d, 0x27, 0xc4, 0x7e, 0x9f, 0x3e, 0xdc,
+			0x6f, 0x5f, 0x71, 0x6e, 0xc0, 0x41, 0x55, 0x38,
+			0x9c, 0x9c, 0x28, 0x85, 0xe3, 0xf0, 0xc4, 0xea,
+			0xc7, 0x7f, 0x7c, 0x66, 0x22, 0x89, 0xea, 0xc3,
+			0xfa, 0x5a, 0x09, 0x70, 0x1b, 0xc5, 0x30, 0xd5,
+			0x71, 0x08, 0x5b, 0x3f, 0x60, 0xa2, 0x75, 0x80,
+			0x84, 0x70, 0x14, 0xde, 0x9b, 0x46, 0xbd, 0x53,
+			0x98, 0x67, 0xcc, 0x55, 0x4b, 0xed, 0x18, 0x5f,
+			0xd6, 0x07, 0x17, 0xcb, 0xcf, 0xde, 0x2a, 0x37,
+			0x37, 0x07, 0x5b, 0xa9, 0x88, 0x0c, 0xa2, 0xb9,
+			0xf3, 0xe5, 0x3a, 0x7c, 0xa3, 0x09, 0xeb, 0xf6,
+			0xab, 0x42, 0x57, 0xf9, 0xc4, 0xab, 0x0a, 0x97,
+			0xea, 0x96, 0x4c, 0x58, 0xe9, 0xe4, 0x8f, 0xcc,
+			0x35, 0x7f, 0x01, 0x0f, 0x5c, 0x7e, 0xaa, 0x0a,
+			0x0c, 0xf2, 0x3c, 0x3e, 0x5c, 0x4f, 0xb6, 0x1f,
+			0x08, 0xd7, 0x0a, 0x68, 0xef, 0xf4, 0x95, 0xa5,
+			0x59, 0xd6, 0x41, 0xee, 0x31, 0xab, 0x28, 0xd1,
+			0x3a, 0xc7, 0xc4, 0xb1, 0x5f, 0xf6, 0x10, 0xef,
+			0x59, 0xda, 0x48, 0x7b, 0x9d, 0x50, 0x4b, 0xb9,
+			0xe0, 0x90, 0x9d, 0xf9, 0x2f, 0x4e, 0x55, 0xe8,
+			0x49, 0xfc, 0x40, 0xa5, 0x33, 0x86, 0xf8, 0x32,
+			0x16, 0x60, 0x83, 0x1c, 0x6b, 0x7f, 0xe4, 0xf1,
+			0xa1, 0x84, 0x1d, 0x21, 0xbb, 0xca, 0x2d, 0x1a,
+			0x3f, 0x7a, 0xd4, 0x8a, 0xcb, 0x7e, 0x3c, 0x3c,
+			0xe6, 0x86, 0x8d, 0x08, 0x2f, 0x71, 0x45, 0x46,
+			0xeb, 0xd6, 0x4e, 0xf5, 0xf8, 0x46, 0xf3, 0x25,
+			0x8e, 0x6b, 0x29, 0x92, 0xa4, 0x47, 0x46, 0xe2,
+			0x72, 0xf2, 0x22, 0x64, 0x9a, 0xd1, 0xd7, 0x83,
+			0x99, 0x44, 0x1f, 0xe6, 0x48, 0xd5, 0xfc, 0xc7,
+			0x7c, 0xb4, 0x3d, 0x3c, 0x21, 0x5d, 0x0a, 0xea,
+			0xec, 0x16, 0xf7, 0xb3, 0xef, 0x0f, 0x4a, 0xa6,
+			0x91, 0x4d, 0x7e, 0xb1, 0x01, 0x3b, 0xff, 0x94,
+			0xb8, 0xd5, 0x91, 0x39, 0x4b, 0x2b, 0x8b, 0x0b,
+			0x19, 0x94, 0x64, 0xd7, 0x27, 0x11, 0x71, 0xfc,
+			0xc3, 0x80, 0x97, 0x0e, 0x7a, 0x36, 0x31, 0xad,
+			0x43, 0x3a, 0x9f, 0xdb, 0x5b, 0x70, 0x29, 0x10,
+			0xf3, 0x1a, 0x7a, 0x6e, 0x13, 0x7d, 0x64, 0x36,
+			0x95, 0x15, 0x80, 0x15, 0xf5, 0x94, 0xbb, 0xc3,
+			0xfa, 0x72, 0x7e, 0x93, 0x68, 0xb2, 0x55, 0xaf,
+			0xff, 0x27, 0xeb, 0xa3, 0x0c, 0x27, 0x3a, 0xd1,
+			0x00, 0xff, 0x97, 0xe6, 0xff, 0x96, 0x29, 0xce,
+			0xd9, 0xba, 0x4d, 0xe4, 0xc2, 0x69, 0x81, 0x04,
+			0x6a, 0x0c, 0x89, 0xbf, 0x0e, 0x22, 0xb9, 0x0c,
+			0x77, 0x7e, 0xf5, 0x46, 0xc5, 0x53, 0xe3, 0x16,
+			0xc4, 0x0c, 0x72, 0xfa, 0x56, 0x9f, 0x2e, 0xf5,
+			0xab, 0xa0, 0xeb, 0xa1, 0x8f, 0xce, 0xf0, 0x6b,
+			0x10, 0xbd, 0x59, 0x7e, 0x54, 0x1c, 0x6e, 0xd3,
+			0x2f, 0x80, 0x4e, 0x9d, 0xf3, 0x47, 0xb2, 0xac,
+			0x42, 0x70, 0xac, 0xa8, 0x8d, 0x4c, 0xba, 0x8f,
+			0x1a, 0x07, 0x68, 0xbe, 0x3c, 0xd9, 0x74, 0x61,
+			0x74, 0x34, 0xcc, 0x7a, 0x63, 0x74, 0xd0, 0x09,
+			0x21, 0xed, 0x2a, 0x93, 0x0a, 0x74, 0xab, 0xac,
+			0xeb, 0xa9, 0xd9, 0xe6, 0x22, 0xa9, 0x1c, 0x24,
+			0x23, 0xd4, 0x87, 0x88, 0x78, 0x86, 0x35, 0xb2,
+			0xc6, 0x98, 0x2e, 0x0b, 0xa2, 0x07, 0xac, 0x87,
+			0x01, 0xfa, 0xa3, 0x54, 0xa6, 0x09, 0xb0, 0x2f,
+			0xe1, 0x57, 0x3d, 0x61, 0x6b, 0x2d, 0x82, 0x07,
+			0x2e, 0x6e, 0x14, 0x0d, 0x23, 0xa6, 0x14, 0x56,
+			0xc9, 0x3f, 0x65, 0x0d, 0x4f, 0x07, 0xac, 0x22,
+			0xd7, 0xc9, 0x29, 0xc6, 0x9b, 0x85, 0x55, 0x2f,
+			0xa4, 0x02, 0xfa, 0x2c, 0x3a, 0xea, 0xde, 0xb4,
+			0x89, 0x93, 0xc6, 0xa2, 0x4a, 0x13, 0x07, 0x57,
+			0x07, 0xb1, 0x6d, 0x7d, 0x80, 0x6c, 0x51, 0x9d,
+			0xec, 0x91, 0xdf, 0xbc, 0xcb, 0x3b, 0x17, 0xad,
+			0xcf, 0x64, 0x46, 0x6b, 0xf8, 0x79, 0x73, 0x05,
+			0x1e, 0x9e, 0x75, 0x6c, 0xa0, 0x3c, 0x64, 0x12,
+			0x1f, 0x3e, 0x09, 0x36, 0x2e, 0xe9, 0x4c, 0xc2,
+			0x29, 0x3c, 0xf2, 0x21, 0x24, 0x89, 0x98, 0x79,
+			0xa2, 0x12, 0x33, 0x22, 0x8f, 0x7f, 0x3a, 0x34,
+			0x1b, 0x3a, 0x69, 0x70, 0x40, 0x50, 0x02, 0x56,
+			0xb0, 0x68, 0xed, 0x4d, 0x36, 0x40, 0x87, 0xd5,
+			0x2d, 0xe9, 0x74, 0x41, 0x35, 0xd0, 0x56, 0x45,
+			0xb7, 0x59, 0xe1, 0x0c, 0x0b, 0x73, 0x9e, 0xb7,
+			0x59, 0x1a, 0xd0, 0xbe, 0x7e, 0xca, 0x24, 0x12,
+			0x94, 0x67, 0x5a, 0x28, 0xe0, 0x29, 0x50, 0x0e,
+			0xca, 0x1b, 0x8a, 0xcd, 0x56, 0xe8, 0xa1, 0xb9,
+			0x5c, 0xb0, 0x9a, 0x36, 0x0e, 0xf9, 0x5e, 0x4f,
+			0x6b, 0xde, 0x03, 0x18, 0x77, 0x41, 0x98, 0x0f,
+			0x6e, 0x03, 0x74, 0x8f, 0xd6, 0x38, 0x3c, 0xdc,
+			0xe9, 0xc0, 0x5c, 0x92, 0x48, 0xa8, 0x46, 0x29,
+			0x1c, 0xab, 0x76, 0x55, 0x21, 0x56, 0x10, 0x16,
+			0x14, 0x8b, 0x80, 0x3b, 0xc8, 0x15, 0xf0, 0xb5,
+			0x3b, 0xfe, 0xb5, 0x56, 0x8b, 0x45, 0x73, 0xf4,
+			0x23, 0xf0, 0x68, 0xdd, 0x4e, 0x27, 0xfc, 0xac,
+			0xf5, 0x81, 0x05, 0xd8, 0x89, 0x24, 0xba, 0xb9,
+			0xcf, 0xd6, 0x06, 0xb4, 0xfd, 0x12, 0x00, 0xca,
+			0x18, 0x44, 0xb4, 0x90, 0xcf, 0xc8, 0xb0, 0x6d,
+			0xcb, 0x72, 0xa3, 0xcd, 0x2e, 0x54, 0x56, 0x86,
+			0x4b, 0xd3, 0x3a, 0x96, 0x23, 0x4c, 0xd1, 0xf9,
+			0x1c, 0xa9, 0x9c, 0x37, 0xe4, 0x04, 0x04, 0x72,
+			0x7f, 0x71, 0xdf, 0xfd, 0x47, 0x86, 0x9b, 0x37,
+			0x69, 0x1c, 0xc9, 0xa9, 0x51, 0x13, 0xd7, 0xcf,
+			0xc5, 0xc3, 0x08, 0x9b, 0x3b, 0x94, 0xed, 0xfd,
+			0x06, 0x75, 0xb7, 0x39, 0x86, 0x98, 0x6d, 0x84,
+			0x38, 0x45, 0x39, 0xd1, 0x97, 0xef, 0x1f, 0x2e,
+			0x50, 0xb5, 0xf2, 0xe0, 0x72, 0xfd, 0x72, 0xd8,
+			0xf9, 0x83, 0xa6, 0x16, 0x83, 0xbf, 0x87, 0x12,
+			0x2c, 0x47, 0x82, 0xac, 0x59, 0x68, 0x61, 0xe6,
+			0xa1, 0x00, 0xc2, 0x5a, 0x4b, 0xf0, 0xac, 0x79,
+			0x33, 0x42, 0x8b, 0x9b, 0x81, 0x9e, 0x44, 0xd5,
+			0x21, 0x94, 0xf8, 0xbd, 0xb6, 0xe0, 0xe8, 0x80,
+			0x87, 0x4d, 0x76, 0xad, 0x08, 0x40, 0xb4, 0x4c,
+			0x8a, 0x32, 0x58, 0xed, 0x7c, 0x46, 0xb5, 0x54,
+			0xa8, 0x30, 0xf5, 0xe8, 0x98, 0xed, 0xf9, 0x36,
+			0x8c, 0x21, 0x9f, 0x1f, 0xc4, 0x50, 0x4c, 0xe8,
+			0x99, 0xfb, 0x15, 0xb5, 0x60, 0xaa, 0xde, 0xec,
+			0xfa, 0x1b, 0x40, 0xd5, 0x7f, 0xda, 0xed, 0xef,
+			0xc6, 0xe0, 0x1b, 0xf1, 0x80, 0x38, 0x00, 0xe7,
+			0x44, 0x2d, 0x89, 0xa0, 0x12, 0x9d, 0x26, 0xbb,
+			0x33, 0x6e, 0xdd, 0xd1, 0xb3, 0xb5, 0x8f, 0x39,
+			0x8e, 0xc3, 0x1f, 0x68, 0x37, 0xb6, 0x09, 0x55,
+			0x35, 0x3d, 0x60, 0xfa, 0x71, 0x1a, 0x3f, 0x77,
+			0xe5, 0xcc, 0xd0, 0x56, 0x9c, 0x73, 0x06, 0xcd,
+			0xf9, 0xab, 0x4e, 0xb8, 0x99, 0x2a, 0xdc, 0x5e,
+			0xe7, 0x83, 0xe5, 0x35, 0x34, 0x9f, 0xc8, 0x30,
+			0x37, 0xb4, 0x01, 0xc2, 0xb3, 0xc4, 0x1a, 0x7f,
+			0x01, 0x1f, 0x3a, 0xbf, 0x39, 0x83, 0xad, 0xc2,
+			0x9e, 0x4d, 0xae, 0x0f, 0x46, 0x0e, 0x2e, 0x89,
+			0xe8, 0xdb, 0x4d, 0x3f, 0x2c, 0xb0, 0x62, 0x1e,
+			0x8b, 0xda, 0x21, 0x2d, 0xff, 0x7d, 0x26, 0xa4,
+			0x83, 0x8b, 0xa0, 0x46, 0xdb, 0x56, 0x91, 0xbe,
+			0x00, 0x4c, 0xc5, 0x31, 0x46, 0xf5, 0x68, 0x42,
+			0x91, 0x69, 0xe6, 0xf3, 0x84, 0xce, 0x20, 0xb1,
+			0xfd, 0xbf, 0x58, 0x9e, 0xf9, 0x30, 0x5c, 0xf5,
+			0xc7, 0xdf, 0xe1, 0x20, 0x9f, 0x3c, 0xdd, 0x25,
+			0xd8, 0xf8, 0xb2, 0x59, 0x54, 0x25, 0x20, 0x9d,
+			0x38, 0xf1, 0xbe, 0x0e, 0x5a, 0x30, 0xd4, 0x44,
+			0x3d, 0xb5, 0x75, 0xae, 0xb0, 0xbb, 0x1a, 0x8b,
+			0x4c, 0xe6, 0x05, 0x1c, 0xa7, 0x47, 0x01, 0xb2,
+			0x45, 0x5c, 0x39, 0x77, 0xc7, 0x80, 0x3b, 0xc6,
+			0xe7, 0x3e, 0xe7, 0xd0, 0x10, 0x96, 0x81, 0x1b,
+			0x67, 0xda, 0xf7, 0x87, 0xf4, 0x49, 0xd0, 0xe2,
+			0x21, 0x33, 0x9f, 0xdf, 0x56, 0x68, 0x03, 0x69,
+			0xa7, 0x35, 0x30, 0x0f, 0xfb, 0x68, 0x91, 0xe2,
+			0x20, 0x85, 0x90, 0x56, 0x73, 0x3c, 0x1a, 0xa6,
+			0xae, 0x71, 0x84, 0xe5, 0x73, 0x8a, 0x3a, 0x30,
+			0x1d, 0xee, 0x96, 0x25, 0xa4, 0xa6, 0xde, 0x69,
+			0x7b, 0xfb, 0xf4, 0x7f, 0xc6, 0xea, 0x65, 0x29,
+			0x4a, 0xce, 0xf9, 0xb5, 0x23, 0x85, 0x16, 0x29,
+			0xcd, 0x7c, 0xf1, 0x95, 0xaf, 0x5e, 0xb9, 0xbf,
+			0xb0, 0x22, 0x92, 0xfe, 0x9e, 0xca, 0x16, 0x52,
+			0x04, 0x77, 0x37, 0x78, 0x3d, 0xed, 0x9c, 0x28,
+			0x0b, 0xaa, 0x04, 0x9f, 0xe2, 0x2c, 0x5d, 0xfc,
+			0x5c, 0xde, 0x39, 0x57, 0x75, 0x1c, 0x0e, 0x10,
+			0x26, 0x9a, 0xf2, 0x40, 0x92, 0xcd, 0x10, 0x96,
+			0xcc, 0x5d, 0x84, 0x11, 0xae, 0x05, 0x21, 0x5b,
+			0x36, 0xd0, 0x51, 0x40, 0x06, 0x8d, 0x47, 0xb1,
+			0xcc, 0x82, 0xde, 0xf6, 0x14, 0x24, 0x9b, 0xc4,
+			0xbf, 0x4f, 0x8d, 0x53, 0x48, 0x0b, 0xee, 0x14,
+			0x6f, 0x8e, 0x1d, 0x09, 0x74, 0x25, 0xd9, 0x28,
+			0xe0, 0x1f, 0x5d, 0x24, 0x34, 0x06, 0x94, 0x65,
+			0xd4, 0x93, 0x1b, 0xcd, 0x36, 0xbc, 0x9e, 0xc5,
+			0x37, 0x57, 0x52, 0xda, 0xcc, 0x72, 0x58, 0x5b,
+			0x5c, 0x7a, 0x99, 0x08, 0xe5, 0x28, 0x44, 0x1a,
+			0xff, 0x8e, 0xad, 0xc9, 0x0c, 0x53, 0x64, 0xcc,
+			0xcc, 0xc5, 0x9f, 0x83, 0x1e, 0x32, 0x26, 0x53,
+			0xbb, 0x7e, 0xf1, 0xab, 0x73, 0xfb, 0x47, 0x7d,
+			0x7a, 0xb7, 0x8e, 0x10, 0xbc, 0x3b, 0x39, 0x9a,
+			0x7f, 0x9a, 0x2c, 0x01, 0xa4, 0x9e, 0x70, 0xac,
+			0x4d, 0x15, 0x00, 0x78, 0x67, 0xfc, 0xca, 0x2a,
+			0xf9, 0x40, 0xbc, 0xbb, 0x12, 0x55, 0x35, 0xa3,
+			0xce, 0x17, 0x72, 0xfe, 0xfd, 0x37, 0x58, 0xdb,
+			0x8c, 0x4f, 0xe9, 0x46, 0x67, 0x7d, 0xe8, 0x10,
+			0x83, 0x86, 0xd8, 0x46, 0xf6, 0x73, 0x28, 0xdd,
+			0xbd, 0x35, 0xfc, 0xbc, 0x92, 0x19, 0x51, 0x24,
+			0xbe, 0x0c, 0x82, 0xb3, 0xaa, 0x91, 0xa3, 0x2b,
+			0xd6, 0x62, 0xa6, 0x6e, 0xe5, 0xdc, 0x37, 0xfb,
+			0x29, 0x93, 0x60, 0xbc, 0x4f, 0x7e, 0x4c, 0x89,
+			0xa1, 0x58, 0xed, 0x77, 0xef, 0x1e, 0x0f, 0x54,
+			0x4a, 0x8b, 0x36, 0x22, 0x29, 0x8a, 0x30, 0xe3,
+			0x26, 0x2c, 0x9e, 0x13, 0x01, 0x5e, 0x53, 0x44,
+			0xe4, 0xe3, 0x95, 0xa4, 0xc1, 0x9b, 0xe5, 0x26,
+			0x9b, 0x97, 0x4a, 0x5e, 0xbf, 0x07, 0x3e, 0x49,
+			0x2e, 0x6d, 0xf2, 0x13, 0xde, 0xf3, 0xbf, 0x44,
+			0x1e, 0xfc, 0x6b, 0x92, 0x25, 0xe2, 0x84, 0xd4,
+			0x55, 0x0d, 0x36, 0x6c, 0x03, 0x8b, 0x24, 0x6b,
+			0x75, 0x8d, 0x15, 0x33, 0xeb, 0xcd, 0x09, 0xaa,
+			0x27, 0x2c, 0x37, 0x37, 0xd9, 0xea, 0x8b, 0x4b,
+			0x0b, 0x8b, 0xa2, 0x3b, 0xbe, 0xb5, 0xad, 0xaa,
+			0x13, 0xda, 0x70, 0x81, 0x8a, 0x1c, 0xe6, 0x38,
+			0xaf, 0x2a, 0xce, 0x38, 0xc8, 0x14, 0xf0, 0xc7,
+			0x4a, 0x09, 0x4d, 0xbb, 0x12, 0xca, 0x78, 0xc1,
+			0x87, 0x8c, 0x76, 0x36, 0xb8, 0x13, 0xd9, 0xe6,
+			0xe2, 0x8b, 0x95, 0x81, 0x08, 0xf7, 0xa4, 0x7d,
+			0xae, 0x8d, 0xa9, 0x77, 0x0f, 0x56, 0x96, 0x57,
+			0x61, 0x76, 0x1a, 0xb3, 0x5a, 0x8f, 0x59, 0xd4,
+			0xa6, 0xa7, 0xb4, 0x33, 0xc4, 0x4b, 0x46, 0x68,
+			0xe6, 0xed, 0x0d, 0x5c, 0xe6, 0x96, 0xb2, 0x72,
+			0x48, 0x3c, 0x89, 0x15, 0xe8, 0x0f, 0xeb, 0x6b,
+			0x72, 0xdd, 0xcc, 0x01, 0x75, 0xea, 0x0c, 0xf0,
+			0xe4, 0x82, 0xda, 0x53, 0xb3, 0x0c, 0x41, 0xe4,
+			0x87, 0x82, 0x7d, 0x88, 0xee, 0x98, 0x03, 0xad,
+			0xf5, 0x5e, 0xbb, 0x5e, 0x70, 0x98, 0x59, 0x2f,
+			0xec, 0x79, 0xfe, 0x03, 0xd5, 0x29, 0x85, 0x48,
+			0x86, 0x1b, 0x4e, 0xe2, 0x02, 0xdb, 0xba, 0xa6,
+			0x15, 0x87, 0x69, 0x70, 0xbb, 0x69, 0x9f, 0x92,
+			0xfc, 0x56, 0xc0, 0x35, 0xfa, 0xbf, 0xee, 0xa3,
+			0x34, 0x7e, 0xa6, 0xa0, 0x89, 0xf1, 0x38, 0x99,
+			0x59, 0xb0, 0x5d, 0x1c, 0x1e, 0x7c, 0x2b, 0x35,
+			0x14, 0xfa, 0xd0, 0x91, 0xe8, 0xd4, 0xed, 0x4c,
+			0x4c, 0x84, 0x8b, 0xe1, 0x34, 0xa7, 0xdd, 0x0c,
+			0x34, 0xde, 0xc2, 0xae, 0x1c, 0x05, 0xf4, 0x80,
+			0xe0, 0xf8, 0x80, 0x95, 0x21, 0x0c, 0x17, 0x22,
+			0xc6, 0xd7, 0xee, 0x00, 0x83, 0x5e, 0xf9, 0x0a,
+			0x1c, 0x5c, 0x91, 0xdc, 0x21, 0x67, 0x68, 0x9e,
+			0x70, 0xac, 0x37, 0x13, 0xd2, 0x49, 0x1a, 0x71,
+			0x63, 0xc3, 0x0f, 0x38, 0x7d, 0x5f, 0x1d, 0xe1,
+			0xb0, 0x9a, 0x77, 0x14, 0x0f, 0x14, 0x2e, 0xd5,
+			0x65, 0x55, 0x36, 0xae, 0xf6, 0x96, 0xa4, 0x85,
+			0x30, 0x0b, 0x24, 0x87, 0x40, 0x4d, 0x74, 0xb7,
+			0xcb, 0x04, 0xa5, 0x14, 0xfa, 0x9c, 0xb6, 0x9a,
+			0x11, 0xe0, 0xac, 0xb0, 0x13, 0x32, 0x32, 0x33,
+			0x3e, 0xb0, 0x95, 0xac, 0x64, 0xac, 0x59, 0xab,
+			0x96, 0xea, 0x1e, 0x2f, 0x3c, 0xcc, 0xed, 0x54,
+			0x1f, 0x40, 0xb9, 0xa4, 0xd7, 0xe3, 0x0b, 0xef,
+			0x04, 0xcb, 0xaa, 0x03, 0x2b, 0x02, 0x20, 0x8e,
+			0x7e, 0x3e, 0xbf, 0x66, 0x09, 0x31, 0x18, 0x9f,
+			0x4b, 0x77, 0x27, 0x51, 0xb2, 0xc9, 0xf1, 0xe4,
+			0xf1, 0xaf, 0xaf, 0xd4, 0x87, 0x05, 0xed, 0x8d,
+			0x60, 0x72, 0x36, 0x9e, 0x05, 0xc3, 0x3e, 0xcf,
+			0xa5, 0x23, 0x8b, 0xb7, 0x7e, 0xcd, 0xdb, 0x2c,
+			0xde, 0xbc, 0xeb, 0x67, 0x6e, 0x2c, 0x59, 0x4d,
+			0x7f, 0x4a, 0xd8, 0x4e, 0x69, 0xff, 0xea, 0xb4,
+			0x00, 0xc6, 0x2b, 0x31, 0x26, 0x9e, 0x35, 0x7a,
+			0xc5, 0x86, 0x02, 0x98, 0xdb, 0xf7, 0xc5, 0x96,
+			0xd2, 0x2e, 0x2a, 0xc5, 0x04, 0xc0, 0x9c, 0xb3,
+			0x07, 0x86, 0x77, 0x7c, 0x7f, 0x82, 0x97, 0x87,
+			0x64, 0xf9, 0xb5, 0x70, 0x39, 0x3c, 0x39, 0x2b,
+			0xfe, 0xa7, 0x24, 0xdd, 0x5f, 0xf0, 0x25, 0xe0,
+			0x74, 0x69, 0x35, 0x22, 0x9a, 0xaf, 0xa4, 0x80,
+			0x77, 0x75, 0x7f, 0x5e, 0xbd, 0xbf, 0xb9, 0x06,
+			0x0a, 0x68, 0xd1, 0x2e, 0x8b, 0xc8, 0xa2, 0x76,
+			0x68, 0xa5, 0x94, 0xb7, 0xda, 0x41, 0xd1, 0xa4,
+			0xfe, 0x86, 0xe4, 0x86, 0xb6, 0xfc, 0x70, 0x81,
+			0x37, 0x10, 0x7b, 0x9b, 0xf2, 0x07, 0x33, 0x60,
+			0x56, 0x74, 0xbf, 0xc4, 0x66, 0x16, 0xe5, 0xe3,
+			0xed, 0x13, 0x72, 0x2b, 0x01, 0x04, 0x13, 0x74,
+			0x22, 0xe9, 0xd3, 0x14, 0xd5, 0xd9, 0xa1, 0x66,
+			0xb9, 0xb7, 0x0d, 0x30, 0x09, 0xa8, 0xf6, 0xf7,
+			0xe8, 0xa8, 0xe8, 0x8b, 0x1e, 0x61, 0xa9, 0xdd,
+			0x11, 0x55, 0xb2, 0x48, 0xd1, 0xb3, 0xa4, 0x97,
+			0xab, 0xe9, 0x43, 0x0b, 0x46, 0x10, 0xd0, 0xac,
+			0x88, 0xe4, 0xcd, 0xa3, 0x67, 0x45, 0xbb, 0xc8,
+			0x5e, 0x23, 0x2a, 0x09, 0xf5, 0x6f, 0x55, 0x22,
+			0xc2, 0x7a, 0x23, 0xc3, 0x36, 0x28, 0x52, 0xa9,
+			0xe9, 0x59, 0xca, 0x04, 0x9c, 0xf7, 0x36, 0x49,
+			0x6b, 0xef, 0x07, 0xd0, 0x0c, 0xf3, 0xba, 0x28,
+			0x24, 0x3f, 0x19, 0xdc, 0xd3, 0x84, 0xba, 0xbf,
+			0x6b, 0x73, 0xef, 0x0b, 0x4d, 0xfe, 0x80, 0x43,
+			0xbe, 0x5b, 0x6c, 0xf6, 0x8e, 0x94, 0x04, 0x7d,
+			0x49, 0x72, 0xa1, 0x83, 0x27, 0x7e, 0x20, 0x20,
+			0xcf, 0xb1, 0x04, 0x87, 0xd2, 0x6d, 0x01, 0x14,
+			0xa5, 0x17, 0x31, 0x61, 0x4e, 0xf7, 0xf3, 0xde,
+			0x42, 0x98, 0xa4, 0x9a, 0x3b, 0xa6, 0xd1, 0xfe,
+			0x47, 0x84, 0xf9, 0xbf, 0x44, 0x95, 0xcf, 0xa1,
+			0x3c, 0xa4, 0x1a, 0x42, 0x96, 0x0b, 0x6d, 0x94,
+			0x70, 0xb4, 0xbc, 0xc8, 0x4b, 0x4b, 0x23, 0xd4,
+			0x95, 0xe2, 0x1e, 0x70, 0x1c, 0xe7, 0x15, 0xf2,
+			0xc8, 0x17, 0x01, 0xa0, 0x10, 0x03, 0xfe, 0x03,
+			0x80, 0xb3, 0xda, 0x43, 0x6b, 0x13, 0xab, 0x3a,
+			0xb6, 0x27, 0x94, 0x52, 0xfc, 0x51, 0xe1, 0x04,
+			0x18, 0xff, 0xd4, 0x62, 0xd4, 0x62, 0x8f, 0x04,
+			0xa0, 0x41, 0x10, 0xa3, 0x3e, 0x1f, 0xb1, 0x5c,
+			0x9d, 0xb2, 0x6f, 0x1e, 0x8f, 0x76, 0x8d, 0xbd,
+			0xff, 0x7d, 0xc5, 0x48, 0xee, 0xef, 0x6d, 0x82,
+			0xc1, 0x6a, 0xcc, 0xa8, 0xbd, 0x05, 0x7e, 0x7c,
+			0x1f, 0x95, 0x39, 0xde, 0xa8, 0x19, 0x47, 0x45,
+			0xd7, 0x4a, 0x43, 0x52, 0x3e, 0x1b, 0x86, 0xee,
+			0x2f, 0x1e, 0x7e, 0x3c, 0xf1, 0x27, 0xe9, 0x35,
+			0x00, 0x6b, 0xf8, 0x56, 0x1f, 0xae, 0x18, 0xe3,
+			0x40, 0x1f, 0x7c, 0x95, 0x83, 0x55, 0xe7, 0x78,
+			0x98, 0x86, 0x8a, 0x96, 0xb8, 0x87, 0x88, 0x04,
+			0x9f, 0x4d, 0x62, 0x40, 0xc7, 0xcf, 0xfa, 0x90,
+			0xdf, 0xeb, 0x60, 0xbe, 0xdc, 0x99, 0xdf, 0xae,
+			0x4b, 0x96, 0xfc, 0xd6, 0xaf, 0x8c, 0xcb, 0x1b,
+			0x38, 0xbc, 0xa3, 0x48, 0xce, 0xd3, 0xa9, 0xd7,
+			0xec, 0x1d, 0xbc, 0x22, 0xd9, 0x34, 0xdf, 0xcb,
+			0x62, 0x95, 0xe2, 0x32, 0x7d, 0xd3, 0x01, 0x61,
+			0x46, 0x9f, 0x2e, 0x26, 0x4b, 0x79, 0xf1, 0x39,
+			0xf6, 0x22, 0xad, 0xcf, 0xb1, 0x5a, 0x57, 0xf1,
+			0xca, 0x95, 0xc7, 0x20, 0xab, 0x1a, 0xad, 0xf4,
+			0xdd, 0x96, 0x0b, 0xb1, 0xae, 0xb6, 0x45, 0xad,
+			0x26, 0x2a, 0xbd, 0x17, 0x5e, 0x27, 0x12, 0x6f,
+			0x43, 0x43, 0x0a, 0x84, 0x68, 0xb0, 0x11, 0x74,
+			0xe3, 0xbe, 0xb2, 0x2c, 0xb2, 0xa2, 0xf4, 0xcf,
+			0xd4, 0x0d, 0xd0, 0x21, 0x84, 0x56, 0xc5, 0xbf,
+			0xf0, 0x76, 0xb4, 0x44, 0x29, 0xf4, 0x25, 0x5e,
+			0x9b, 0x31, 0x56, 0x7a, 0xb9, 0xe2, 0x6b, 0x6c,
+			0x7c, 0x7e, 0x03, 0xb6, 0x23, 0xe2, 0xc9, 0xb6,
+			0xca, 0xbc, 0xbb, 0x0c, 0x07, 0x4c, 0x2a, 0xea,
+			0x0d, 0xb9, 0x55, 0x4f, 0x68, 0xc0, 0x58, 0x2a,
+			0xcd, 0xe6, 0xb8, 0x17, 0x6d, 0x1f, 0xb3, 0x31,
+			0x28, 0xd3, 0x20, 0x47, 0x54, 0x85, 0x64, 0x13,
+			0xfc, 0x99, 0x61, 0x36, 0xc1, 0xb2, 0x9c, 0x68,
+			0x4e, 0x5d, 0xdc, 0x0f, 0xdb, 0x68, 0xa9, 0xa9,
+			0xc3, 0xbf, 0xd3, 0xbc, 0x03, 0x7a, 0x6e, 0x6c,
+			0x3b, 0xa6, 0xf7, 0xc0, 0xb1, 0x64, 0xe3, 0x12,
+			0x6d, 0x0c, 0x1f, 0x9e, 0x74, 0x1c, 0xab, 0x15,
+			0x0f, 0x4c, 0xbd, 0xfa, 0x0b, 0x39, 0x9c, 0x9c,
+			0xb0, 0x50, 0x78, 0x03, 0x8b, 0x25, 0xfb, 0x66,
+			0xdd, 0x50, 0xe7, 0x0a, 0xba, 0x2f, 0x2d, 0x93,
+			0x1e, 0xa5, 0xaf, 0xd8, 0xcc, 0x9c, 0x13, 0x64,
+			0xef, 0xae, 0x23, 0xdc, 0x44, 0xc8, 0x7e, 0x17,
+			0x93, 0x37, 0x8d, 0xcb, 0xc7, 0x8c, 0x30, 0x0a,
+			0x3a, 0x08, 0x35, 0x5b, 0xb3, 0xc9, 0x45, 0x17,
+			0xfb, 0x80, 0x27, 0x7c, 0xc7, 0xc2, 0x57, 0x7c,
+			0xac, 0x73, 0xc8, 0x5f, 0xd0, 0xcc, 0xe9, 0x5c,
+			0x55, 0xe2, 0x63, 0x25, 0xaf, 0x89, 0x96, 0x81,
+			0x5b, 0x4d, 0x0d, 0xa6, 0x65, 0x2f, 0xd4, 0x3a,
+			0x9b, 0xb7, 0x09, 0xad, 0x47, 0xe3, 0xf7, 0x15,
+			0x41, 0xc0, 0xcf, 0xec, 0x9d, 0xd4, 0xac, 0x57,
+			0xfd, 0xd6, 0x91, 0xbe, 0x30, 0x52, 0x2b, 0x86,
+			0xdf, 0x54, 0x4b, 0x95, 0x45, 0x76, 0x87, 0x3d,
+			0x56, 0x47, 0x2b, 0xfe, 0x6b, 0x6d, 0x9a, 0x3e,
+			0x72, 0xfb, 0x22, 0x8b, 0x3d, 0x92, 0x1d, 0x62,
+			0x77, 0x6e, 0x91, 0xd4, 0x37, 0x5c, 0x97, 0x0e,
+			0x07, 0x4c, 0x5c, 0x74, 0xdb, 0x05, 0x5e, 0x9f,
+			0xe1, 0xf0, 0x1a, 0x24, 0x67, 0x8f, 0x0f, 0x20,
+			0xe9, 0x3e, 0x45, 0x5a, 0x6a, 0xb5, 0xb9, 0xee,
+			0xf4, 0x1d, 0x80, 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, 0x05,
+			0x0a, 0x0e, 0x11, 0x19, 0x1b, },
+	}, {
+		.what = "pure rejection vector",
+		.algo = "ml-dsa65",
+		.pk_len = DILITHIUM65_PUBLICKEYBYTES,
+		.pk = (const u8[DILITHIUM65_PUBLICKEYBYTES]){
+			0x54, 0xa5, 0x5c, 0x8e, 0x72, 0x11, 0xf9, 0x67,
+			0x89, 0x19, 0x57, 0x17, 0xa9, 0x03, 0x7b, 0xc6,
+			0xd9, 0xaf, 0x99, 0x14, 0xe8, 0x8f, 0xd4, 0xa7,
+			0xcd, 0x17, 0x8c, 0x67, 0x5f, 0x45, 0x62, 0xc1,
+			0xdd, 0xd0, 0x6d, 0x7d, 0xd0, 0xfd, 0x74, 0x98,
+			0x35, 0x93, 0x95, 0x9c, 0xfb, 0x2f, 0x0c, 0xb9,
+			0xcf, 0x05, 0x28, 0x47, 0x22, 0xe8, 0x2b, 0x17,
+			0xfa, 0x42, 0x60, 0x67, 0x13, 0x2f, 0x9b, 0x03,
+			0xce, 0xce, 0x62, 0x41, 0x12, 0xbe, 0x8d, 0xbb,
+			0xf9, 0x53, 0x25, 0xca, 0x10, 0xf8, 0x73, 0xa6,
+			0x52, 0x32, 0x7a, 0x06, 0xb2, 0x4d, 0x58, 0x0c,
+			0x68, 0xfc, 0x02, 0xf1, 0x93, 0xb4, 0xca, 0x45,
+			0xab, 0xf5, 0xc4, 0xab, 0x93, 0x6c, 0x1b, 0x24,
+			0xd0, 0xeb, 0xe6, 0xb3, 0x90, 0x5e, 0xf4, 0xe7,
+			0x60, 0xdd, 0x90, 0x1e, 0xdf, 0x77, 0xf5, 0x8a,
+			0x4a, 0xf5, 0xc8, 0x7a, 0xc0, 0x04, 0xc4, 0x07,
+			0x76, 0xae, 0x14, 0x47, 0xe1, 0xec, 0x4f, 0x76,
+			0xa5, 0xae, 0x9a, 0xac, 0x73, 0x83, 0x4a, 0xbb,
+			0xa8, 0x58, 0x1a, 0x54, 0xd1, 0xdf, 0xaf, 0x5b,
+			0xd1, 0x21, 0x81, 0x4d, 0xa1, 0x40, 0xd1, 0xe3,
+			0xd2, 0x35, 0x5d, 0x9b, 0x1f, 0x37, 0x77, 0xd6,
+			0xa4, 0xb6, 0x1a, 0x9a, 0xd4, 0xdc, 0xe9, 0x00,
+			0x47, 0xf5, 0x69, 0x27, 0xd4, 0x0b, 0x22, 0x4d,
+			0x8e, 0x2f, 0xfb, 0x7f, 0xdd, 0xe9, 0xe9, 0xb3,
+			0xde, 0xae, 0x7d, 0x8a, 0x8b, 0xe1, 0xc8, 0x1f,
+			0x50, 0x21, 0xb7, 0x32, 0x7a, 0x5a, 0x08, 0x02,
+			0xaf, 0x07, 0x98, 0xb3, 0xd9, 0xc5, 0x96, 0xab,
+			0xfe, 0xff, 0xa9, 0xb8, 0x54, 0x02, 0x42, 0x68,
+			0x68, 0xba, 0x89, 0x3a, 0x12, 0x31, 0xd3, 0x95,
+			0xf6, 0x7a, 0xae, 0xda, 0x0d, 0x08, 0x0d, 0xb3,
+			0x4e, 0xde, 0x9c, 0x3b, 0x6d, 0x1e, 0x94, 0x2a,
+			0x7a, 0x46, 0x8e, 0x26, 0xe4, 0xde, 0xd1, 0x81,
+			0xc6, 0x81, 0x4e, 0x38, 0x77, 0x36, 0xf7, 0x38,
+			0xed, 0xf6, 0xd0, 0x44, 0x1c, 0x6d, 0x1a, 0xa0,
+			0xc4, 0xf5, 0x21, 0x71, 0xbd, 0xf3, 0xa2, 0x9b,
+			0xa9, 0x13, 0x8c, 0x8f, 0x60, 0x99, 0x2d, 0x86,
+			0xc1, 0xe0, 0xf4, 0x4d, 0x75, 0x6e, 0x14, 0xe1,
+			0x5f, 0x12, 0xb9, 0xe6, 0xd2, 0xda, 0xa9, 0x4e,
+			0xc7, 0x97, 0x86, 0xd2, 0x77, 0x32, 0x67, 0xe1,
+			0x8f, 0x23, 0xb8, 0xd3, 0x70, 0x8f, 0x87, 0x2b,
+			0xa2, 0xf1, 0x31, 0x1d, 0x50, 0x09, 0xf3, 0xa3,
+			0x0f, 0x19, 0x9f, 0xde, 0xe7, 0xfb, 0x2e, 0x4a,
+			0x9c, 0x63, 0x4c, 0x56, 0x98, 0x87, 0x0a, 0x05,
+			0x00, 0xfb, 0xe7, 0x22, 0x75, 0x42, 0xca, 0xd6,
+			0x45, 0x35, 0x77, 0x80, 0x22, 0xf2, 0x75, 0x18,
+			0xee, 0xb1, 0x36, 0xdc, 0xbe, 0x0a, 0x11, 0x11,
+			0xae, 0x94, 0xaa, 0xec, 0x56, 0xbb, 0x72, 0x47,
+			0xcb, 0xc5, 0xa2, 0x8e, 0x3d, 0x3f, 0x34, 0x83,
+			0x55, 0xc1, 0x39, 0x40, 0xb7, 0xb0, 0x37, 0x21,
+			0xe1, 0xc4, 0x0c, 0x80, 0x98, 0xeb, 0x3d, 0x9b,
+			0xc3, 0x74, 0x8d, 0x9f, 0x58, 0x9d, 0x03, 0xab,
+			0x3d, 0x6c, 0xe0, 0xf6, 0x13, 0x31, 0x6c, 0x00,
+			0x65, 0xda, 0x8e, 0x84, 0x14, 0x4f, 0x44, 0x75,
+			0xa8, 0x1d, 0xb9, 0xdd, 0xe6, 0x39, 0xc9, 0x36,
+			0x89, 0x19, 0x5a, 0xfd, 0x87, 0x00, 0xad, 0xa7,
+			0x0b, 0xb9, 0x22, 0x6f, 0x35, 0x88, 0xf5, 0x7a,
+			0x9b, 0x69, 0x6e, 0xf4, 0x5b, 0xc8, 0x6f, 0xdc,
+			0x13, 0xa1, 0x28, 0xf8, 0x1d, 0x7c, 0x8a, 0x7a,
+			0xe6, 0x04, 0xe8, 0x0b, 0xf5, 0x10, 0x90, 0x48,
+			0xc7, 0xe6, 0x20, 0xc1, 0x2c, 0xab, 0x46, 0x9d,
+			0x1d, 0x54, 0x6e, 0x37, 0x89, 0xd2, 0x25, 0x18,
+			0x3f, 0x82, 0x5c, 0x68, 0x31, 0x0b, 0x39, 0xe1,
+			0xfc, 0xfb, 0x72, 0x50, 0x4c, 0xc5, 0xca, 0x45,
+			0x7b, 0x7c, 0x87, 0x2f, 0x42, 0xdc, 0xd6, 0xdc,
+			0x00, 0x45, 0x06, 0x44, 0xec, 0xda, 0x55, 0x32,
+			0x03, 0xf9, 0x1d, 0x9c, 0x51, 0x28, 0x49, 0x42,
+			0xc7, 0x98, 0x74, 0xe2, 0x33, 0x14, 0xcc, 0x32,
+			0x4d, 0xfa, 0x0a, 0x99, 0xa8, 0x9a, 0x74, 0xfb,
+			0xee, 0x3e, 0x22, 0xda, 0x5f, 0x0e, 0x85, 0x63,
+			0x46, 0xd4, 0x44, 0x31, 0x3d, 0x66, 0x99, 0x89,
+			0xb0, 0xed, 0xd7, 0x9d, 0x9f, 0x23, 0x96, 0xc4,
+			0x9a, 0xed, 0x5b, 0x13, 0x6a, 0x3b, 0xea, 0x23,
+			0xbc, 0x8c, 0x1b, 0x31, 0xd2, 0x64, 0xcc, 0x99,
+			0x2e, 0x36, 0x1b, 0x1a, 0xed, 0xbe, 0xc0, 0x1d,
+			0xa4, 0x77, 0xfc, 0x9b, 0x19, 0x24, 0x62, 0x29,
+			0xbd, 0xaa, 0xb2, 0x7f, 0xd0, 0x47, 0xb8, 0x00,
+			0x77, 0xe5, 0xda, 0x50, 0x7c, 0x89, 0x1d, 0xf9,
+			0x65, 0xec, 0xa5, 0x94, 0xe9, 0x3e, 0x00, 0x2a,
+			0x3b, 0x1e, 0x91, 0x8b, 0x54, 0x0f, 0x67, 0xad,
+			0x30, 0xdf, 0x67, 0xc8, 0x86, 0xb1, 0x80, 0x52,
+			0xbd, 0x14, 0x0c, 0x36, 0x73, 0xf7, 0xe0, 0x25,
+			0x97, 0x62, 0xbc, 0x28, 0xa1, 0x62, 0xbe, 0xb1,
+			0xde, 0x65, 0x14, 0xb7, 0x16, 0xc6, 0x5b, 0xad,
+			0xb2, 0xae, 0x90, 0x93, 0x4f, 0xd1, 0x3f, 0x5d,
+			0xae, 0x7b, 0x6c, 0x1e, 0x0e, 0x77, 0x20, 0x0f,
+			0xfb, 0xd3, 0x2b, 0x98, 0x14, 0x22, 0x7f, 0x25,
+			0x51, 0x07, 0x97, 0xc4, 0x7e, 0x9a, 0x14, 0x8f,
+			0x99, 0x51, 0xb8, 0x9d, 0xf4, 0xbe, 0xb0, 0x3e,
+			0x86, 0x6f, 0x38, 0x19, 0x50, 0xc6, 0xe6, 0xa8,
+			0xa4, 0xd8, 0x67, 0xc7, 0x1f, 0x19, 0xca, 0xc8,
+			0x3c, 0xe9, 0xa2, 0x5e, 0xde, 0x0c, 0x0c, 0xa1,
+			0x97, 0xc0, 0xa6, 0xc5, 0x35, 0x5a, 0xf7, 0x9b,
+			0xb7, 0x1b, 0xec, 0x0c, 0x22, 0x74, 0xbb, 0xf1,
+			0x78, 0xa9, 0x1c, 0xbf, 0xf4, 0xa2, 0xed, 0xe9,
+			0x56, 0x74, 0x12, 0x77, 0xe6, 0x13, 0xbd, 0xa6,
+			0x28, 0xd3, 0x94, 0x83, 0x4f, 0x2f, 0x09, 0xec,
+			0x21, 0xee, 0xd2, 0x43, 0xb8, 0x27, 0x21, 0xd7,
+			0x9d, 0x26, 0xc6, 0xca, 0xf0, 0x21, 0x33, 0xb1,
+			0x66, 0x80, 0x62, 0xaf, 0x29, 0x97, 0x0b, 0xb9,
+			0x09, 0xdf, 0x53, 0x72, 0x48, 0x57, 0x3f, 0xe4,
+			0xbf, 0x85, 0xef, 0x17, 0xc8, 0x21, 0x15, 0x0a,
+			0x6e, 0x29, 0xae, 0xbe, 0x43, 0x6a, 0xd1, 0x1f,
+			0xff, 0xca, 0xbf, 0x24, 0x34, 0x03, 0x14, 0xdf,
+			0x6f, 0xc0, 0x00, 0xd4, 0x33, 0x41, 0x2f, 0xf5,
+			0x38, 0x2a, 0x07, 0x64, 0x47, 0x59, 0xe0, 0x45,
+			0x79, 0xbb, 0x25, 0x3f, 0xff, 0x21, 0x21, 0xa1,
+			0xe1, 0x06, 0xa9, 0x1d, 0x7e, 0xf9, 0xde, 0x17,
+			0x29, 0x82, 0x7b, 0x13, 0x71, 0xa7, 0xaa, 0xb9,
+			0x58, 0x3e, 0x5a, 0x1b, 0xcd, 0x80, 0xc0, 0x02,
+			0xd2, 0x8a, 0x3b, 0xd7, 0xe0, 0x8b, 0x44, 0x19,
+			0x01, 0x41, 0xf7, 0x11, 0xd4, 0x66, 0xfc, 0x01,
+			0x10, 0x0c, 0x74, 0x20, 0x38, 0xe8, 0x00, 0x37,
+			0xf5, 0xd4, 0xa1, 0xa3, 0x4e, 0xd4, 0xbd, 0x0d,
+			0xaa, 0x7f, 0x54, 0x1c, 0xfa, 0x33, 0x66, 0xd6,
+			0xc2, 0x8d, 0x2e, 0xeb, 0x52, 0x6b, 0x65, 0x10,
+			0x8a, 0xab, 0x15, 0xa5, 0xf2, 0x4c, 0x73, 0xf3,
+			0x00, 0x99, 0x49, 0xee, 0x5a, 0xe7, 0xab, 0x52,
+			0x0f, 0x0a, 0xed, 0xfb, 0x93, 0x45, 0xc9, 0xf9,
+			0x36, 0x5c, 0x5b, 0x6a, 0x1f, 0x1c, 0x46, 0xde,
+			0x0b, 0x6f, 0x40, 0xd6, 0x1c, 0xec, 0x11, 0x47,
+			0x63, 0xe5, 0xbd, 0x47, 0xda, 0xe8, 0x3d, 0xff,
+			0x8b, 0x8d, 0x3d, 0x0c, 0x0f, 0x3a, 0x9c, 0xef,
+			0xec, 0x49, 0xed, 0x90, 0x1a, 0x21, 0x3f, 0xc6,
+			0xab, 0x13, 0x87, 0x96, 0x24, 0x8c, 0x57, 0x60,
+			0x81, 0x02, 0x56, 0xc8, 0xae, 0x95, 0x9b, 0x5d,
+			0x6f, 0x96, 0xf0, 0x26, 0x0d, 0x32, 0x97, 0x9f,
+			0xdb, 0xf8, 0x20, 0x8f, 0x32, 0xfc, 0x31, 0x90,
+			0x2d, 0x0a, 0x38, 0xfc, 0x4f, 0x46, 0xfa, 0xf3,
+			0x6e, 0x60, 0x9f, 0xb1, 0x68, 0x78, 0xac, 0xc8,
+			0x53, 0x07, 0x1e, 0xc6, 0xe7, 0x31, 0xa3, 0x92,
+			0xb1, 0x29, 0x7b, 0x7a, 0x33, 0x07, 0x78, 0xec,
+			0x51, 0x2b, 0xf5, 0xf3, 0x4d, 0x09, 0x18, 0x21,
+			0x91, 0x3c, 0x85, 0x03, 0xe0, 0x0f, 0x76, 0xb8,
+			0x6f, 0xe4, 0x81, 0x94, 0xc6, 0x32, 0x55, 0xb8,
+			0xbf, 0x5c, 0xfe, 0x57, 0x4e, 0xf1, 0x5c, 0x2d,
+			0x6e, 0x6d, 0x22, 0xa8, 0xa9, 0x55, 0x49, 0x7d,
+			0xda, 0x89, 0x7b, 0xc5, 0xfc, 0xf4, 0xae, 0xec,
+			0x91, 0x69, 0x92, 0xaf, 0x26, 0x1c, 0x64, 0x88,
+			0x23, 0xeb, 0x2f, 0x2a, 0x5f, 0x0b, 0xd1, 0x51,
+			0x5f, 0x4a, 0x8f, 0x2f, 0x22, 0x3b, 0x79, 0x2a,
+			0xf6, 0x00, 0xd5, 0xf5, 0x4c, 0xbf, 0x3f, 0xd3,
+			0x94, 0xeb, 0x1e, 0x86, 0xed, 0x45, 0x93, 0x51,
+			0xf7, 0x42, 0x2d, 0x89, 0x40, 0x4a, 0x30, 0xf7,
+			0x32, 0x3f, 0xa6, 0x6f, 0x7a, 0xa8, 0xd2, 0xdf,
+			0x79, 0x3b, 0x76, 0x19, 0x36, 0x1a, 0xf3, 0x3f,
+			0x39, 0x14, 0x4a, 0xc3, 0x64, 0xfb, 0x51, 0x3f,
+			0x8c, 0xc6, 0x15, 0xee, 0x41, 0x3b, 0xd4, 0xc1,
+			0x3d, 0x0f, 0x0c, 0x74, 0xd6, 0x3f, 0xac, 0x12,
+			0x9c, 0xf6, 0x44, 0x2e, 0x5f, 0x54, 0xd2, 0xdb,
+			0xc8, 0xb1, 0x24, 0xbf, 0xe3, 0x9b, 0x00, 0x64,
+			0x4e, 0x34, 0x37, 0xde, 0x7d, 0x43, 0xbf, 0xb4,
+			0x85, 0x5d, 0x50, 0x55, 0xcc, 0x8f, 0xf8, 0x9a,
+			0xf2, 0x97, 0xd7, 0xb8, 0xc1, 0xd4, 0x8f, 0xd8,
+			0xf6, 0xe0, 0x79, 0x5f, 0xc1, 0xc1, 0xf4, 0x5e,
+			0xd7, 0x74, 0xe9, 0x13, 0xd8, 0x4d, 0x44, 0x9e,
+			0x4a, 0xe1, 0x29, 0x67, 0xe2, 0x38, 0x27, 0xbf,
+			0xf1, 0x4c, 0x34, 0x7b, 0xf7, 0xcd, 0xe3, 0x6c,
+			0xd2, 0x49, 0x18, 0x09, 0x4a, 0x9b, 0x56, 0xd6,
+			0xd0, 0xb8, 0x0a, 0x35, 0xa0, 0x6b, 0xee, 0x71,
+			0x92, 0xd6, 0x87, 0x4b, 0x54, 0x0b, 0x35, 0x8b,
+			0x86, 0x82, 0x17, 0x11, 0xa8, 0x3d, 0x58, 0x04,
+			0x48, 0xc4, 0xf7, 0x4b, 0x96, 0x97, 0x0e, 0x68,
+			0xdb, 0x54, 0x30, 0xea, 0x39, 0x58, 0x3f, 0x64,
+			0xfd, 0x35, 0x7a, 0x07, 0x48, 0xbf, 0xdd, 0xad,
+			0x99, 0x72, 0xef, 0x90, 0x93, 0x58, 0xb4, 0xe8,
+			0x6a, 0x72, 0xcf, 0x7a, 0x03, 0xf0, 0xfa, 0x74,
+			0xc5, 0xc3, 0xc8, 0xe4, 0x08, 0xba, 0xed, 0x1f,
+			0xb4, 0xd4, 0x00, 0x12, 0x18, 0xaf, 0x37, 0x78,
+			0x45, 0x8c, 0x8e, 0xae, 0x1c, 0x6e, 0x90, 0xf5,
+			0x13, 0x8c, 0xcc, 0x3d, 0x40, 0x63, 0xa3, 0xc1,
+			0x8f, 0xe1, 0xc7, 0x47, 0xd7, 0x9c, 0xde, 0x14,
+			0x1b, 0x8f, 0xca, 0x0b, 0xd7, 0xd3, 0x9a, 0x05,
+			0x81, 0x37, 0x61, 0xaa, 0x37, 0xee, 0x67, 0xbf,
+			0xef, 0x17, 0x01, 0x99, 0x6f, 0xc4, 0xd8, 0x9b,
+			0x92, 0x76, 0x9b, 0x23, 0xe9, 0xba, 0x6d, 0xa2,
+			0xfc, 0x4b, 0xe4, 0x3b, 0xa8, 0x64, 0xb7, 0x45,
+			0x49, 0xe5, 0x3b, 0x20, 0x77, 0x80, 0x08, 0x94,
+			0x9e, 0x70, 0xc8, 0x1b, 0x7a, 0x21, 0x59, 0x11,
+			0x20, 0x43, 0x80, 0xf5, 0xcf, 0x0d, 0x70, 0x63,
+			0x92, 0x4e, 0x4e, 0xd5, 0x58, 0xb1, 0x97, 0xaa,
+			0x2e, 0x26, 0xbb, 0xb3, 0x15, 0x02, 0x87, 0x53,
+			0xd1, 0xd9, 0x3d, 0x95, 0xa1, 0xed, 0x3a, 0x67,
+			0xe4, 0xa0, 0x53, 0xeb, 0x6b, 0x7d, 0x8d, 0x80,
+			0x77, 0xb7, 0x38, 0xd3, 0x96, 0xd5, 0x97, 0x7c,
+			0xd6, 0x33, 0x15, 0x78, 0xc5, 0x38, 0x27, 0x8b,
+			0xbd, 0x4a, 0x5d, 0xdc, 0x31, 0xbb, 0x2d, 0xe6,
+			0x24, 0x6a, 0xcb, 0x33, 0x4c, 0x58, 0xb2, 0x52,
+			0xe9, 0xc1, 0xb6, 0x21, 0xca, 0xc1, 0x07, 0xcf,
+			0x62, 0xdd, 0xc4, 0x5d, 0x7c, 0x6d, 0xce, 0xbb,
+			0xd6, 0xcc, 0x89, 0x6a, 0x4e, 0x2c, 0xe0, 0xcb,
+			0x9e, 0xc9, 0x9c, 0xd5, 0x14, 0xd3, 0xc5, 0xb4,
+			0xbc, 0x48, 0x33, 0x6e, 0x10, 0x00, 0xeb, 0x1a,
+			0x91, 0xea, 0x9e, 0xe0, 0x37, 0xf9, 0xc3, 0x9a,
+			0x4d, 0x1a, 0x5c, 0x99, 0xd1, 0x6c, 0x3e, 0x38,
+			0x40, 0x61, 0x8e, 0x66, 0x04, 0x09, 0xc3, 0x66,
+			0x13, 0xb7, 0x1b, 0xa4, 0x4a, 0x73, 0xb9, 0x11,
+			0x53, 0x2e, 0x19, 0xaa, 0x41, 0xa4, 0xf4, 0x89,
+			0x22, 0xc0, 0x0c, 0xec, 0x8f, 0xfd, 0x6a, 0xe3,
+			0x6c, 0x03, 0xe6, 0x01, 0xb5, 0xcd, 0x92, 0x89,
+			0x8a, 0x6f, 0xca, 0xf2, 0x28, 0x03, 0xac, 0xd1,
+			0x00, 0xe4, 0x98, 0x56, 0x4a, 0xd5, 0x60, 0x78,
+			0x6d, 0x00, 0xaa, 0x87, 0xbc, 0x42, 0x49, 0xd7,
+			0xfe, 0x0c, 0xa4, 0xa6, 0xaa, 0x96, 0x7e, 0xe3,
+			0xd5, 0x71, 0xb9, 0x2b, 0xb7, 0x10, 0x7d, 0xf7,
+			0x34, 0xd4, 0x2f, 0x2b, 0xb3, 0x6d, 0xe2, 0x2a,
+			0xaa, 0xb6, 0xba, 0x42, 0x94, 0xf4, 0xfa, 0xc3,
+			0xa7, 0x55, 0x2c, 0xcd, 0xba, 0xc7, 0xfe, 0x12,
+			0x6e, 0x16, 0x29, 0xa7, 0x04, 0x8f, 0xca, 0x84,
+			0xee, 0xce, 0xa4, 0xaa, 0x62, 0x10, 0xb5, 0x6d,
+			0x23, 0x61, 0x78, 0xc9, 0xca, 0x8e, 0x23, 0xbb,
+			0x7d, 0xd8, 0x57, 0x32, 0xe6, 0xd8, 0x4b, 0x87,
+			0xa6, 0x70, 0xac, 0x53, 0x6f, 0x82, 0xad, 0x7d,
+			0x89, 0xc6, 0x51, 0xc9, 0x6f, 0xf2, 0x70, 0x07,
+			0x4d, 0xa8, 0x16, 0xfd, 0x31, 0x7f, 0x0e, 0x3d,
+			0x62, 0x03, 0x13, 0xaf, 0x1e, 0x61, 0x2a, 0xdf,
+			0xc0, 0x8b, 0x68, 0xe1, 0x74, 0xd3, 0xeb, 0x3b,
+			0x51, 0x36, 0x27, 0x90, 0x9e, 0x64, 0x29, 0x66,
+			0x01, 0xae, 0x4d, 0x07, 0xca, 0xcd, 0xa1, 0x54,
+			0x31, 0x0b, 0x32, 0x68, 0x67, 0x4e, 0xac, 0xd1,
+			0x05, 0x35, 0x4e, 0x1b, 0x9c, 0xd9, 0xd0, 0xb1,
+			0x45, 0x15, 0x3f, 0xde, 0xa9, 0xa3, 0xd1, 0xa3,
+			0x81, 0x64, 0xab, 0x2b, 0x15, 0x6a, 0xb8, 0x5b,
+			0x77, 0xd2, 0x96, 0xe8, 0x1c, 0x1a, 0x8b, 0xda,
+			0x94, 0x29, 0x4c, 0x73, 0x30, 0x7a, 0x12, 0xdc,
+			0xfd, 0xd4, 0xb4, 0x4c, 0x0b, 0xcb, 0x9f, 0x21,
+			0x28, 0x86, 0xb7, 0x7c, 0xa0, 0xf6, 0x81, 0xe3,
+			0x4d, 0x70, 0x9e, 0xb0, 0xbf, 0xa7, 0x55, 0x23,
+			0x99, 0xc2, 0x29, 0x74, 0x9e, 0x4f, 0x9f, 0x12,
+			0xeb, 0x0c, 0xa6, 0xd7, 0x60, 0x04, 0x99, 0xa3,
+			0x82, 0x9a, 0xcc, 0x0d, 0xe5, 0x9a, 0xd3, 0xec,
+			0x84, 0x1d, 0x7a, 0x6c, 0x76, 0xf8, 0x05, 0x3d,
+			0x94, 0x70, 0xbb, 0xae, 0x87, 0x2d, 0x25, 0xba,
+			0xe5, 0x38, 0x60, 0x85, 0x2c, 0x83, 0x22, 0xa0,
+			0xf7, 0xec, 0x56, 0xa9, 0x39, 0x48, 0x77, 0x42,
+			0x65, 0xba, 0x57, 0xf6, 0xa9, 0x99, 0x7b, 0xb8,
+			0xa0, 0x03, 0xca, 0x5c, 0x06, 0x6c, 0xae, 0x8a,
+			0xa1, 0xbc, 0x9a, 0xb4, 0x15, 0x35, 0xf1, 0x8f,
+			0x6a, 0x76, 0x1d, 0xe7, 0x09, 0xfa, 0xa7, 0x42,
+			0x94, 0x5e, 0x4e, 0xc6, 0xd2, 0x24, 0xd2, 0xa9,
+			0xe3, 0x16, 0x7f, 0xd6, 0xbf, 0x06, 0x98, 0x0f,
+			0x8b, 0x61, 0xd8, 0xd1, 0x6d, 0xa9, 0xc3, 0xb7,
+			0x54, 0x34, 0x26, 0x7a, 0x6d, 0xa2, 0x04, 0x7e,
+			0xe8, 0x98, 0x47, 0x4a, 0x4b, 0x15, 0xc0, 0xaa,
+			0x24, 0x8c, 0xbd, 0xfd, 0x6a, 0x53, 0x06, 0x2a,
+			},
+		.msg_len = 64,
+		.msg = (const u8[64]){
+			0x7e, 0x0b, 0xd4, 0x8d, 0x8a, 0x62, 0x74, 0xc7,
+			0xe6, 0x2f, 0x31, 0xd8, 0x09, 0x11, 0xba, 0x1d,
+			0x6e, 0xc8, 0xe5, 0xac, 0x5f, 0x11, 0xd2, 0xf1,
+			0x75, 0x22, 0xd3, 0x45, 0x14, 0x0b, 0x6b, 0x25,
+			0xf4, 0xbf, 0x8d, 0x0d, 0x94, 0xf2, 0xa6, 0x0d,
+			0x2c, 0x24, 0x5a, 0xb5, 0x83, 0x2d, 0x12, 0xd4,
+			0xe1, 0xf5, 0xa4, 0x01, 0xb2, 0x8a, 0x18, 0xfd,
+			0x49, 0x29, 0x9f, 0x3c, 0x37, 0xb6, 0xbf, 0x0a,
+			},
+		.sig_len = DILITHIUM65_CRYPTO_BYTES,
+		.sig = (const u8[DILITHIUM65_CRYPTO_BYTES]){
+			0xff, 0x81, 0xe9, 0xbe, 0xa3, 0x89, 0x9d, 0x73,
+			0xdf, 0x13, 0xd3, 0xcf, 0xba, 0x36, 0xe8, 0xa1,
+			0xf9, 0x52, 0x5f, 0x33, 0xd8, 0xfd, 0xc5, 0xb0,
+			0x7a, 0x5a, 0xff, 0x65, 0x1d, 0x84, 0x31, 0x3c,
+			0x53, 0xe2, 0xc8, 0x9c, 0xf4, 0xef, 0x15, 0x3b,
+			0xd0, 0x4d, 0x90, 0x2f, 0x5c, 0x8d, 0x0e, 0x03,
+			0xd6, 0x50, 0xb3, 0xb5, 0x20, 0xa2, 0x57, 0xcc,
+			0x48, 0x6f, 0xc9, 0x49, 0x29, 0x2d, 0xc9, 0x53,
+			0x05, 0x91, 0x08, 0x56, 0x9a, 0x25, 0xb2, 0x43,
+			0x3e, 0x9c, 0x38, 0x75, 0x84, 0xc1, 0x04, 0xdf,
+			0xd5, 0x36, 0x5d, 0x7b, 0x9c, 0x85, 0x3f, 0xd3,
+			0x52, 0xef, 0xb2, 0x3a, 0xa6, 0x3c, 0xa0, 0x64,
+			0xb9, 0xe0, 0x69, 0x89, 0xf4, 0xc7, 0x56, 0x6e,
+			0x21, 0xfd, 0x99, 0x39, 0x1b, 0x08, 0xd4, 0xb4,
+			0xed, 0x5d, 0x8c, 0xf1, 0x27, 0x3f, 0x0c, 0x60,
+			0x74, 0x63, 0x6d, 0xb8, 0xbf, 0xb4, 0xaa, 0xfd,
+			0x92, 0xe5, 0x9a, 0xfa, 0xed, 0xf0, 0x9f, 0x1c,
+			0x8b, 0x73, 0xfe, 0x6d, 0xff, 0xb9, 0xc0, 0xb7,
+			0xba, 0x3d, 0x0e, 0xbc, 0x4e, 0x4b, 0xd4, 0xdb,
+			0x1e, 0x9c, 0xe7, 0xb1, 0xc6, 0xe7, 0x78, 0x22,
+			0xe1, 0x0a, 0x01, 0xcb, 0x34, 0x93, 0xf2, 0x42,
+			0xa8, 0x50, 0xaf, 0x46, 0xa2, 0x7c, 0xc6, 0xe2,
+			0xea, 0xfd, 0x6d, 0x71, 0x8d, 0xaf, 0x28, 0x56,
+			0x37, 0xf8, 0x1a, 0x4e, 0xd7, 0xf0, 0xff, 0xf5,
+			0xd9, 0xec, 0xe4, 0x7d, 0xa0, 0xed, 0x36, 0x1d,
+			0x6f, 0xde, 0x94, 0x6d, 0x6d, 0xee, 0xa4, 0xfd,
+			0xb6, 0xc3, 0x89, 0xa3, 0x82, 0xd5, 0x12, 0x5c,
+			0xcd, 0x54, 0x1d, 0x68, 0x95, 0xe5, 0x38, 0x35,
+			0x81, 0xfb, 0xa7, 0x20, 0xe6, 0x26, 0x2f, 0xfd,
+			0x36, 0xc6, 0x23, 0xf5, 0xe0, 0x36, 0xbd, 0xdd,
+			0xc7, 0xf2, 0x9b, 0x94, 0x00, 0x87, 0xca, 0xf0,
+			0x64, 0x03, 0x6c, 0xc8, 0xa3, 0xc0, 0x3e, 0x0c,
+			0x71, 0x21, 0x70, 0x9a, 0x4e, 0xe6, 0x18, 0x27,
+			0x24, 0x5a, 0xbc, 0x18, 0xe6, 0x15, 0xe8, 0x5b,
+			0x44, 0xac, 0x31, 0x38, 0xe4, 0xfa, 0xe3, 0x8e,
+			0xc8, 0x7b, 0x2c, 0x56, 0x8b, 0x10, 0xad, 0xad,
+			0x6d, 0xf3, 0xad, 0x12, 0x01, 0xbe, 0x6b, 0x5b,
+			0x95, 0x5f, 0xfe, 0xdc, 0xc8, 0x0d, 0x8b, 0x97,
+			0x0e, 0x3c, 0xda, 0x8f, 0xbf, 0x5d, 0x9a, 0x33,
+			0x46, 0x83, 0x89, 0xed, 0xb2, 0x87, 0xb7, 0x11,
+			0xb9, 0x07, 0xd3, 0x69, 0xc9, 0x1e, 0x92, 0x92,
+			0x6a, 0x4d, 0x2b, 0xfe, 0xd8, 0x2c, 0x2b, 0xf9,
+			0x59, 0x81, 0x7a, 0xff, 0xf7, 0x3f, 0x27, 0x39,
+			0x43, 0x03, 0xcf, 0x68, 0xc2, 0x37, 0x65, 0x83,
+			0x87, 0x06, 0xc7, 0xb1, 0x42, 0x7c, 0x7c, 0xe1,
+			0x78, 0x1c, 0xdb, 0xaf, 0x33, 0xb1, 0x35, 0xc6,
+			0xff, 0x94, 0xc2, 0x93, 0x29, 0x1a, 0x3c, 0xc5,
+			0xf1, 0xd1, 0xda, 0x0f, 0x1b, 0xae, 0x1f, 0xf6,
+			0x2b, 0xa0, 0x68, 0x4f, 0x02, 0xeb, 0x2a, 0xe8,
+			0xa4, 0xfa, 0x30, 0x92, 0x0c, 0x36, 0x0c, 0xaa,
+			0xef, 0x0c, 0x78, 0x40, 0x96, 0xcc, 0xbb, 0x65,
+			0xba, 0x84, 0x42, 0x7e, 0x97, 0xf4, 0x07, 0x67,
+			0x00, 0x80, 0x9a, 0x27, 0xfd, 0x8f, 0x18, 0x83,
+			0xad, 0x0d, 0x40, 0x30, 0xd7, 0x62, 0x9d, 0xf3,
+			0xc6, 0x43, 0xd5, 0x92, 0x9e, 0x26, 0xf5, 0xfb,
+			0xda, 0xed, 0x8e, 0x2c, 0x71, 0xea, 0x78, 0xbf,
+			0xd7, 0xe3, 0x86, 0xc3, 0x9a, 0xda, 0x89, 0x86,
+			0x98, 0x41, 0xb7, 0x9e, 0x4a, 0x2e, 0xb0, 0x80,
+			0x00, 0xff, 0x68, 0xbf, 0x86, 0x3f, 0x8b, 0x1c,
+			0x11, 0xe4, 0x5f, 0xf6, 0xb0, 0x70, 0xf9, 0xb9,
+			0x2e, 0xe9, 0x21, 0xe0, 0x40, 0xef, 0xf8, 0xe3,
+			0x65, 0x45, 0x18, 0xf7, 0x92, 0x21, 0x3b, 0xc7,
+			0xe9, 0x6d, 0xb4, 0x2d, 0x01, 0xf9, 0xec, 0x33,
+			0x0d, 0xa7, 0x19, 0x8f, 0xf5, 0x0d, 0x49, 0xa5,
+			0x45, 0xb6, 0x92, 0x90, 0x4b, 0xe5, 0x12, 0x6c,
+			0x1a, 0xf3, 0x51, 0x06, 0x29, 0x2e, 0xd1, 0xfe,
+			0xbf, 0xe1, 0x67, 0x2c, 0x98, 0x45, 0x8a, 0x38,
+			0xd0, 0x50, 0x6f, 0xa8, 0x81, 0xf2, 0x27, 0xb4,
+			0x9f, 0x15, 0x14, 0x12, 0x98, 0x1c, 0x93, 0x64,
+			0xf8, 0x01, 0x91, 0x37, 0x31, 0xb3, 0x04, 0x0a,
+			0xc4, 0x7b, 0x84, 0x03, 0x2c, 0xbf, 0x90, 0xd7,
+			0x7c, 0xa3, 0xcf, 0x1d, 0x6a, 0x7c, 0x9c, 0x35,
+			0x9b, 0xf1, 0x95, 0x2c, 0x02, 0x55, 0x24, 0xb7,
+			0x23, 0x87, 0x3b, 0xf6, 0x9f, 0xfd, 0x04, 0xfe,
+			0xad, 0x40, 0xe0, 0x95, 0xf7, 0xcc, 0x8b, 0xae,
+			0x53, 0x7b, 0x16, 0x9f, 0x47, 0xad, 0x29, 0x66,
+			0xd2, 0x37, 0x0f, 0x54, 0x4f, 0x7d, 0xb0, 0x04,
+			0x45, 0xed, 0x52, 0xe5, 0xdb, 0x1a, 0xb4, 0x26,
+			0x40, 0x62, 0x62, 0x4f, 0xf4, 0x92, 0x55, 0xf9,
+			0x78, 0xd9, 0xdd, 0xdb, 0x42, 0x40, 0x5a, 0x5e,
+			0xe5, 0xe0, 0x71, 0x7b, 0xd1, 0x96, 0x57, 0x47,
+			0x7e, 0x79, 0x80, 0xee, 0xe4, 0xdc, 0xac, 0xcd,
+			0xb1, 0xbf, 0x28, 0xd8, 0x13, 0xec, 0xdf, 0x71,
+			0x13, 0x88, 0xf1, 0xb7, 0x9f, 0x6b, 0xb2, 0xd0,
+			0xf2, 0x0d, 0xfa, 0x75, 0xa3, 0xa9, 0xa2, 0x6f,
+			0x1d, 0x4b, 0xe4, 0xd8, 0x8b, 0x08, 0x7a, 0x84,
+			0xa8, 0x82, 0xf6, 0x09, 0xf0, 0x30, 0xa1, 0xb9,
+			0xe4, 0x03, 0xe4, 0xf8, 0xeb, 0xcf, 0x6c, 0xb5,
+			0xe4, 0xc0, 0x4b, 0xb4, 0xf4, 0x30, 0x3b, 0xa6,
+			0xc8, 0x5b, 0x29, 0x84, 0xde, 0xc7, 0xa8, 0x32,
+			0xe8, 0xee, 0x2e, 0x8b, 0x85, 0x2b, 0x9f, 0xfd,
+			0x65, 0x5e, 0x6d, 0xf1, 0x89, 0x7a, 0x45, 0x08,
+			0xc1, 0x1d, 0xfe, 0xa4, 0x88, 0x7f, 0x77, 0xae,
+			0xa6, 0x28, 0x70, 0x3d, 0x6b, 0xb8, 0x8d, 0x7a,
+			0xee, 0x40, 0x9f, 0x05, 0xb0, 0xf1, 0x2c, 0x59,
+			0x79, 0x7c, 0xa9, 0x3f, 0x6e, 0xca, 0x96, 0x9e,
+			0xdf, 0x6d, 0xd8, 0x8c, 0xa3, 0x33, 0x16, 0xea,
+			0x0e, 0xae, 0x06, 0x51, 0x13, 0xf9, 0x08, 0x44,
+			0x32, 0xcc, 0xef, 0x5a, 0x2b, 0x09, 0x87, 0x85,
+			0xa2, 0xfb, 0xb3, 0xb4, 0xcb, 0xf2, 0xdb, 0x51,
+			0x59, 0x02, 0x87, 0x5f, 0x8e, 0xe6, 0x65, 0xe3,
+			0x37, 0x4f, 0x53, 0x16, 0xc3, 0x78, 0x4e, 0xba,
+			0x23, 0xef, 0x58, 0xfd, 0x90, 0x3c, 0xe6, 0xfb,
+			0xe0, 0x79, 0xbb, 0xc6, 0x48, 0x18, 0x79, 0xce,
+			0xf8, 0x0e, 0x10, 0xbc, 0x63, 0x1d, 0x77, 0xcd,
+			0x18, 0xd9, 0xe9, 0x8c, 0x15, 0x8a, 0x8f, 0x86,
+			0x1d, 0x86, 0x48, 0xd0, 0x53, 0x05, 0x69, 0x5a,
+			0x29, 0xb3, 0x11, 0xc8, 0x1e, 0x0c, 0x4c, 0xfa,
+			0x7d, 0x13, 0x12, 0x93, 0x01, 0xcf, 0x9f, 0xb2,
+			0x5d, 0xc0, 0xe6, 0x73, 0x8b, 0xf8, 0x39, 0xbd,
+			0xfe, 0xf4, 0x57, 0xd8, 0x38, 0xbe, 0x9e, 0x0b,
+			0x1d, 0xea, 0x1e, 0x18, 0x64, 0xb3, 0x74, 0x5c,
+			0x0f, 0x02, 0x51, 0x89, 0x7e, 0x7f, 0x4a, 0xcc,
+			0xff, 0xb1, 0xf6, 0x1b, 0x69, 0xb0, 0xdd, 0x1c,
+			0x31, 0x9e, 0xc4, 0x6e, 0x70, 0xd2, 0xad, 0x22,
+			0x7b, 0x80, 0xc5, 0xe0, 0xc2, 0x07, 0xd5, 0x02,
+			0x04, 0xb7, 0x15, 0x63, 0xb5, 0x55, 0x6e, 0x35,
+			0x3c, 0x48, 0xab, 0x29, 0xef, 0x1c, 0xe5, 0x64,
+			0x93, 0xab, 0x62, 0xb2, 0xd6, 0x7b, 0x1e, 0xe1,
+			0x6d, 0xd5, 0xe2, 0x6e, 0xaf, 0x9f, 0x59, 0x7d,
+			0xab, 0xef, 0xd4, 0xbd, 0x17, 0x13, 0xea, 0xb7,
+			0x43, 0xde, 0x90, 0x0f, 0x85, 0x31, 0x1b, 0x9f,
+			0xf5, 0x09, 0x96, 0x88, 0x99, 0xbc, 0x96, 0xc9,
+			0x58, 0x0d, 0x77, 0x33, 0xd2, 0x99, 0x55, 0xe6,
+			0xac, 0xe5, 0xa4, 0x53, 0x26, 0x23, 0xd0, 0xab,
+			0x0c, 0x05, 0xfc, 0xb4, 0xc0, 0x68, 0x7e, 0x99,
+			0x42, 0x76, 0x1d, 0x68, 0xf1, 0xb4, 0x70, 0xc3,
+			0xd5, 0xb4, 0x0f, 0xee, 0x4b, 0xb4, 0x95, 0x2f,
+			0x62, 0x64, 0x08, 0x20, 0x4e, 0xa5, 0xd1, 0xcb,
+			0x92, 0x61, 0x5c, 0xc7, 0x39, 0xfb, 0x21, 0x25,
+			0x01, 0x53, 0x11, 0xa2, 0x4a, 0x02, 0xcb, 0xae,
+			0x91, 0x90, 0xdb, 0xcb, 0x0b, 0x7b, 0x04, 0xcb,
+			0x41, 0x23, 0x4c, 0x89, 0x10, 0xb1, 0xa6, 0x5d,
+			0xd6, 0xba, 0x9f, 0xc6, 0x87, 0x08, 0xb9, 0x85,
+			0xb2, 0x97, 0x66, 0xe6, 0x97, 0xb2, 0xcc, 0xbd,
+			0x99, 0x7d, 0x48, 0xfe, 0xc3, 0x65, 0xa2, 0x13,
+			0x61, 0xce, 0x6a, 0xd4, 0x6b, 0x75, 0x38, 0x5a,
+			0xd2, 0xab, 0xff, 0xe6, 0xcb, 0x0f, 0xa6, 0x35,
+			0xc8, 0xfe, 0x08, 0x3f, 0x56, 0xac, 0xbd, 0x37,
+			0x20, 0xde, 0x1e, 0xc7, 0x44, 0xd3, 0xc3, 0x26,
+			0xeb, 0x2a, 0xb8, 0x3a, 0xb4, 0x24, 0x00, 0x77,
+			0x72, 0x00, 0xc7, 0x26, 0xfc, 0x2c, 0xd3, 0x35,
+			0xb0, 0x7c, 0x75, 0xe8, 0x4d, 0xec, 0xdc, 0xaf,
+			0xf1, 0x99, 0x81, 0x40, 0x05, 0x59, 0x23, 0x19,
+			0xa2, 0x4c, 0x1a, 0xf0, 0x59, 0x8e, 0xd6, 0x16,
+			0x61, 0x88, 0x09, 0x2b, 0x7e, 0x51, 0x0b, 0xcf,
+			0x5a, 0x6c, 0xca, 0x13, 0x87, 0x18, 0x16, 0x64,
+			0x51, 0xe4, 0x2a, 0x0f, 0xc0, 0x94, 0x1b, 0x74,
+			0xe9, 0x20, 0xbb, 0x4b, 0x13, 0xb1, 0xd3, 0xea,
+			0xf9, 0xcf, 0x56, 0x66, 0x5f, 0x2c, 0x98, 0x6e,
+			0x5d, 0x4b, 0x9c, 0x06, 0x0f, 0xd5, 0xdb, 0x84,
+			0xeb, 0x63, 0xb0, 0xa7, 0x15, 0xb3, 0x88, 0xf3,
+			0x2b, 0xf2, 0x5b, 0x09, 0x4a, 0xde, 0x17, 0xcc,
+			0x6b, 0x60, 0xe6, 0xfd, 0xc6, 0xaa, 0xa3, 0xb3,
+			0x6d, 0x1b, 0xdf, 0x2d, 0x03, 0xe5, 0xb3, 0x62,
+			0xae, 0x1f, 0x89, 0x8a, 0xc0, 0x21, 0x99, 0xb1,
+			0xce, 0x35, 0x6e, 0xdd, 0x15, 0x6a, 0x1e, 0xe6,
+			0x9a, 0x9f, 0x81, 0x68, 0xc2, 0xb3, 0x43, 0x33,
+			0x5d, 0xb3, 0x2f, 0x53, 0xfe, 0x26, 0x31, 0x7a,
+			0xf7, 0xda, 0xf5, 0x41, 0xd5, 0x13, 0x21, 0x9e,
+			0xb5, 0x0a, 0x61, 0xcf, 0xbe, 0xbf, 0x4c, 0x0a,
+			0xc5, 0xaa, 0xf1, 0x25, 0x6f, 0xd3, 0xee, 0xeb,
+			0x15, 0x92, 0xfb, 0x47, 0x8b, 0xe4, 0xc2, 0x3d,
+			0xf6, 0xfb, 0xa3, 0xdf, 0x6a, 0xcc, 0x87, 0x87,
+			0xfa, 0x0f, 0x32, 0xcb, 0xfe, 0x99, 0xe4, 0xc9,
+			0xf2, 0x93, 0x12, 0x11, 0xcd, 0xe7, 0x8c, 0x07,
+			0x1d, 0xc7, 0x31, 0x40, 0x04, 0x12, 0xf4, 0xb3,
+			0x05, 0x9d, 0x0e, 0x2e, 0x5a, 0x4c, 0xc8, 0x31,
+			0x35, 0xe4, 0xc5, 0x93, 0xc0, 0xe9, 0x26, 0x95,
+			0x7f, 0x9b, 0xe9, 0x9b, 0x50, 0x88, 0x7b, 0x75,
+			0x3b, 0x5c, 0x11, 0x53, 0xcd, 0x6d, 0x8d, 0x0d,
+			0x31, 0x18, 0x10, 0xcd, 0x9d, 0x06, 0xe3, 0x8f,
+			0xd3, 0x04, 0xa1, 0x8e, 0x7f, 0x4c, 0x31, 0xc9,
+			0xd0, 0x56, 0xb7, 0xf4, 0xdf, 0xef, 0x45, 0xd2,
+			0xba, 0xa8, 0x8a, 0x6d, 0xf5, 0xa0, 0x48, 0x58,
+			0xb5, 0xeb, 0x80, 0x41, 0xfb, 0x8b, 0xc1, 0xf5,
+			0x9e, 0x99, 0x7a, 0x02, 0x32, 0x90, 0x7b, 0xc6,
+			0xb7, 0x4d, 0xaf, 0xc1, 0x30, 0xfc, 0xb5, 0x79,
+			0xf0, 0xea, 0xd0, 0x9f, 0xc8, 0xb4, 0xb2, 0xb6,
+			0x8a, 0x69, 0x29, 0xcc, 0x81, 0x46, 0x47, 0xca,
+			0x92, 0x9b, 0xfb, 0x26, 0xa6, 0xae, 0x07, 0xdc,
+			0x24, 0x2d, 0xba, 0x63, 0x8f, 0x43, 0x31, 0x45,
+			0xcc, 0x91, 0x07, 0x15, 0x9f, 0x4a, 0x85, 0x76,
+			0x37, 0xc0, 0xc4, 0x04, 0x54, 0xc6, 0xce, 0x4f,
+			0x8d, 0xce, 0xa8, 0xe6, 0x67, 0x3f, 0xaa, 0xe4,
+			0x12, 0x48, 0x92, 0xec, 0x83, 0xf4, 0xe4, 0x6a,
+			0x94, 0x85, 0x23, 0xfb, 0x0b, 0xc9, 0x40, 0x57,
+			0xb3, 0x5c, 0x92, 0x17, 0xe5, 0x30, 0x35, 0xe1,
+			0x5f, 0x98, 0xb5, 0x28, 0x12, 0xce, 0x03, 0xfc,
+			0x9e, 0xe6, 0xef, 0x07, 0xf7, 0x72, 0x52, 0xc5,
+			0x56, 0xed, 0x80, 0xbd, 0x48, 0xba, 0xec, 0x9d,
+			0x12, 0xff, 0x6b, 0x56, 0x32, 0x26, 0x3e, 0xa8,
+			0x11, 0x58, 0xd9, 0x84, 0x7b, 0x26, 0x37, 0xff,
+			0xfe, 0xb5, 0x38, 0x3a, 0x99, 0xe1, 0xc1, 0x65,
+			0x8e, 0xe6, 0x03, 0xdf, 0x68, 0x3b, 0xf8, 0x5c,
+			0x8c, 0x41, 0xe4, 0x0f, 0x46, 0x12, 0xaa, 0xa3,
+			0xfd, 0xe5, 0x0e, 0x48, 0x70, 0x7d, 0x97, 0x37,
+			0xa4, 0x5a, 0x56, 0x76, 0x35, 0xff, 0xca, 0xb7,
+			0xf4, 0xbf, 0xb4, 0x53, 0x8f, 0x3e, 0xa8, 0xd6,
+			0xb5, 0x0f, 0xe8, 0x1a, 0x07, 0x8e, 0xeb, 0x79,
+			0x30, 0x68, 0xbf, 0xd3, 0x20, 0x2f, 0x43, 0x9d,
+			0x8f, 0x0f, 0xd3, 0x77, 0x83, 0x18, 0x00, 0x2b,
+			0xa2, 0xc8, 0xe7, 0xdf, 0x53, 0x3b, 0xf3, 0x73,
+			0x09, 0x83, 0x14, 0x35, 0xda, 0xe9, 0x53, 0x5e,
+			0x6e, 0x0d, 0xf4, 0xd3, 0xc1, 0xd5, 0x11, 0x2f,
+			0x68, 0xb3, 0x52, 0x61, 0xd3, 0x0b, 0x17, 0xf5,
+			0x0a, 0x89, 0xa0, 0x16, 0x17, 0x0c, 0xfe, 0x0f,
+			0x01, 0x0c, 0x1f, 0x94, 0xe2, 0xb0, 0x20, 0x72,
+			0xe2, 0xc3, 0x1d, 0x22, 0xa7, 0x69, 0x6d, 0x6e,
+			0x12, 0xe9, 0xc3, 0x8e, 0xea, 0x84, 0x37, 0xa4,
+			0xd2, 0xdf, 0x9e, 0xc0, 0xeb, 0xc2, 0xd2, 0x78,
+			0xeb, 0xfa, 0x8e, 0x71, 0x7a, 0xb9, 0xdf, 0x98,
+			0x33, 0xf0, 0x6d, 0xd8, 0xcf, 0xb9, 0x55, 0xd9,
+			0x37, 0xa7, 0x97, 0x97, 0xb7, 0x7f, 0xcf, 0x88,
+			0x33, 0xda, 0xf3, 0xb8, 0xd9, 0x7f, 0x2f, 0xe1,
+			0x19, 0xe7, 0xf1, 0xb8, 0xb1, 0xaa, 0x96, 0x34,
+			0xde, 0x3b, 0x1e, 0x7c, 0xfb, 0xfc, 0xc2, 0x36,
+			0xe7, 0xca, 0xf4, 0xa3, 0x10, 0x18, 0x74, 0xdb,
+			0x85, 0xe9, 0xe0, 0xfd, 0x0e, 0x13, 0x9c, 0x54,
+			0x93, 0x2d, 0x08, 0x34, 0x76, 0xf2, 0x4f, 0xb8,
+			0x7b, 0xb5, 0xc6, 0xee, 0xf3, 0x03, 0xb9, 0xd1,
+			0x9f, 0xf8, 0xd0, 0x36, 0x58, 0xee, 0xf1, 0x12,
+			0x40, 0x85, 0x01, 0x02, 0x84, 0x95, 0xdc, 0x62,
+			0xe4, 0xe2, 0xd3, 0x5c, 0x2b, 0xab, 0x93, 0xcd,
+			0x82, 0x93, 0x2d, 0xe8, 0x7b, 0x89, 0x61, 0xbf,
+			0xf9, 0xc9, 0x5a, 0xb1, 0x28, 0x99, 0xa6, 0x15,
+			0x77, 0x61, 0x64, 0xab, 0xd5, 0xc4, 0x91, 0xb4,
+			0x37, 0x91, 0xbc, 0xfa, 0xd9, 0xe7, 0xed, 0x7d,
+			0x6d, 0x1a, 0xdf, 0x9a, 0xb0, 0xe1, 0x6f, 0xf3,
+			0x4c, 0x2a, 0x3c, 0x42, 0xd0, 0xde, 0x1c, 0x32,
+			0x83, 0xbb, 0xa7, 0xdc, 0x09, 0x4c, 0x76, 0xad,
+			0xe3, 0x13, 0x1f, 0xab, 0x2e, 0x3b, 0x04, 0x17,
+			0x72, 0xcd, 0xd8, 0xc4, 0x73, 0x61, 0x65, 0xec,
+			0x38, 0x72, 0xd5, 0x30, 0x74, 0x91, 0xba, 0x2b,
+			0x9c, 0xe0, 0xeb, 0x63, 0x2a, 0x59, 0xab, 0x0b,
+			0x74, 0x96, 0xc1, 0x0b, 0x73, 0xed, 0x73, 0x27,
+			0x7d, 0x6f, 0x0d, 0x82, 0x11, 0xda, 0x6d, 0x7a,
+			0xce, 0xea, 0xf7, 0xbf, 0xad, 0x16, 0x07, 0x2c,
+			0xb1, 0x07, 0x73, 0x82, 0xc6, 0x88, 0x77, 0xcf,
+			0x7c, 0x64, 0x64, 0xc5, 0xba, 0xca, 0x94, 0xe6,
+			0x79, 0x39, 0x84, 0xf2, 0x3f, 0xc8, 0x7a, 0x7b,
+			0x0e, 0x25, 0xf7, 0xe9, 0xaf, 0xdb, 0x95, 0x76,
+			0xc8, 0x97, 0x85, 0xe7, 0xb6, 0xf7, 0x03, 0x19,
+			0x0c, 0x10, 0xf7, 0xca, 0x2c, 0xc2, 0xcb, 0x4d,
+			0x98, 0x2b, 0x88, 0x89, 0x23, 0x3b, 0x21, 0x55,
+			0xc9, 0xf3, 0xfe, 0x98, 0x9b, 0xf4, 0x88, 0x5e,
+			0xbb, 0x03, 0xf8, 0x44, 0x3a, 0xd7, 0x58, 0xa7,
+			0xde, 0xec, 0x97, 0x0d, 0xc2, 0xe0, 0x11, 0xf1,
+			0x86, 0x2b, 0x1d, 0xe2, 0x59, 0x2a, 0x86, 0xe5,
+			0x8f, 0x58, 0xd2, 0x37, 0x87, 0x43, 0x1d, 0xeb,
+			0xe5, 0x3a, 0xbe, 0xeb, 0x54, 0x81, 0xf3, 0x24,
+			0xc9, 0xb6, 0x6e, 0xd5, 0xb8, 0x50, 0x22, 0xc8,
+			0x0f, 0x02, 0x1a, 0x6e, 0x77, 0x4d, 0x21, 0x6d,
+			0x4c, 0x43, 0x75, 0x62, 0x32, 0xe6, 0x2a, 0x23,
+			0xe9, 0x07, 0x87, 0xca, 0x85, 0x52, 0x02, 0xd9,
+			0x41, 0x01, 0x39, 0x44, 0x2e, 0x87, 0xbc, 0xfa,
+			0x02, 0x29, 0xb6, 0x46, 0xb5, 0x00, 0xb5, 0x0c,
+			0x08, 0x61, 0x66, 0xd9, 0xf0, 0x45, 0x19, 0xc2,
+			0xac, 0x84, 0x81, 0x5a, 0x17, 0x5c, 0x4e, 0x0c,
+			0x7e, 0xa2, 0xd3, 0x1d, 0xd7, 0xc4, 0xa3, 0x7b,
+			0x51, 0x2b, 0x61, 0x15, 0x14, 0xa9, 0x6c, 0x33,
+			0x30, 0x1b, 0x27, 0xc4, 0xd0, 0x57, 0xda, 0x3d,
+			0x85, 0x87, 0xa0, 0xb4, 0x0d, 0x80, 0xc1, 0x8e,
+			0x95, 0x23, 0x35, 0xa9, 0xde, 0xa7, 0x6c, 0x8b,
+			0x7c, 0xb5, 0xd3, 0xd5, 0x08, 0x05, 0x80, 0x98,
+			0xfa, 0x65, 0xef, 0x98, 0xb5, 0x22, 0x7c, 0x30,
+			0xf6, 0xf0, 0x5e, 0x1c, 0x53, 0x5e, 0x30, 0x4c,
+			0x4c, 0xf8, 0x3a, 0xd4, 0x46, 0x61, 0x88, 0xb0,
+			0x22, 0x65, 0xa8, 0xc4, 0x10, 0xbd, 0xf9, 0x27,
+			0x39, 0xec, 0x36, 0xe5, 0xe4, 0x19, 0x68, 0x1b,
+			0x4b, 0xb5, 0xd3, 0x47, 0x9b, 0x72, 0x6c, 0xa0,
+			0x6c, 0x2e, 0xf4, 0xe3, 0xef, 0x99, 0xb9, 0x86,
+			0x71, 0x7a, 0x87, 0xa9, 0x36, 0xb3, 0x2e, 0xa3,
+			0xad, 0xe3, 0xb6, 0x8d, 0xc8, 0x1b, 0xc0, 0x3e,
+			0x82, 0xec, 0xeb, 0xe8, 0x8f, 0xf8, 0x61, 0xed,
+			0x7a, 0xe2, 0xd9, 0x6e, 0x87, 0x0e, 0xcf, 0x83,
+			0x08, 0x2c, 0xf7, 0x0c, 0x51, 0x5e, 0x06, 0xca,
+			0x22, 0xa2, 0x04, 0x5d, 0x31, 0xb5, 0x6d, 0xb5,
+			0x2a, 0xed, 0xf9, 0xb7, 0x24, 0xb6, 0x9e, 0xa1,
+			0xe2, 0xed, 0x56, 0x29, 0x1f, 0x5e, 0x56, 0xb1,
+			0xf6, 0xe2, 0x61, 0x95, 0xdf, 0xdd, 0xe7, 0x6e,
+			0x33, 0x1b, 0x38, 0xdd, 0xbb, 0x5c, 0x6c, 0x42,
+			0x52, 0x9e, 0x21, 0x20, 0x9e, 0x5b, 0xd5, 0x2b,
+			0x22, 0x4a, 0x85, 0xd0, 0x09, 0x7c, 0x47, 0x4b,
+			0xdd, 0xe5, 0xd7, 0x26, 0x55, 0x86, 0x98, 0x76,
+			0x37, 0xdf, 0x43, 0x7f, 0x3a, 0x54, 0xbc, 0x61,
+			0xef, 0x26, 0xfe, 0xc0, 0xe6, 0xc3, 0xc9, 0xca,
+			0xd1, 0x46, 0xdf, 0x53, 0xd3, 0xb6, 0xbf, 0x37,
+			0x58, 0x8e, 0x2e, 0x02, 0xa4, 0xfc, 0x82, 0xef,
+			0x96, 0xfc, 0x07, 0x7a, 0x0f, 0x91, 0xe3, 0xbf,
+			0x32, 0x8a, 0xc8, 0xee, 0xf1, 0x6d, 0xac, 0xd4,
+			0x3e, 0x58, 0xa9, 0x26, 0x29, 0x8a, 0xdd, 0x5a,
+			0x7c, 0xdd, 0xc1, 0x6a, 0x04, 0x52, 0x04, 0x69,
+			0x09, 0x53, 0xe1, 0xb2, 0x48, 0x6e, 0xd7, 0x96,
+			0xa4, 0x1b, 0xcf, 0xf0, 0x75, 0x11, 0xe0, 0xa3,
+			0xca, 0x5d, 0xd9, 0x9a, 0xa7, 0xee, 0xc5, 0x13,
+			0x41, 0x2b, 0x3b, 0xed, 0xca, 0xec, 0xc6, 0x7b,
+			0x0a, 0x72, 0x56, 0x1a, 0x47, 0x19, 0xc1, 0xf5,
+			0x36, 0x37, 0xab, 0x23, 0x8e, 0xed, 0xdc, 0x3d,
+			0xf6, 0xc9, 0xb1, 0x17, 0x36, 0xd6, 0xba, 0x63,
+			0x62, 0x7e, 0xbd, 0x83, 0xfa, 0xbe, 0x36, 0x26,
+			0x3e, 0xb3, 0xec, 0x59, 0xbd, 0xaf, 0xd3, 0x9e,
+			0x38, 0xca, 0x62, 0x04, 0x95, 0x77, 0x5c, 0xf4,
+			0xb4, 0x2a, 0x4c, 0xcb, 0x91, 0x83, 0xe8, 0xcf,
+			0x04, 0x6c, 0x0a, 0x02, 0x41, 0x18, 0x5d, 0x75,
+			0xf1, 0xa5, 0x11, 0x38, 0x0e, 0x65, 0x83, 0x76,
+			0x83, 0xa5, 0xf3, 0xd7, 0xd1, 0x81, 0xf6, 0xf8,
+			0x51, 0xb0, 0xd7, 0x5d, 0x88, 0x3e, 0xe9, 0xcf,
+			0xcd, 0xe0, 0x8a, 0x1c, 0x00, 0xb7, 0x40, 0x3d,
+			0x55, 0x67, 0xbd, 0x3a, 0x93, 0x16, 0x58, 0xb5,
+			0xe0, 0xaa, 0xe3, 0x66, 0x33, 0xe2, 0x25, 0x78,
+			0x5c, 0xec, 0x02, 0xd1, 0x7b, 0x2e, 0xea, 0xd0,
+			0x4e, 0xe7, 0x5a, 0xc5, 0xc6, 0x15, 0xe5, 0xfe,
+			0xad, 0x46, 0x72, 0xd0, 0x57, 0x68, 0x8d, 0x63,
+			0xcb, 0x8a, 0x0a, 0x76, 0xa0, 0xd0, 0x71, 0xa1,
+			0x49, 0xc6, 0xb8, 0x20, 0x4c, 0x65, 0xee, 0x60,
+			0x1c, 0xeb, 0x2a, 0x94, 0xe9, 0x51, 0x13, 0x17,
+			0xcc, 0x37, 0xaf, 0x05, 0x4e, 0x0c, 0x97, 0xb9,
+			0x6e, 0xae, 0x84, 0x05, 0x44, 0x1f, 0x02, 0xc3,
+			0x94, 0x2b, 0xfa, 0x8e, 0xe5, 0xb0, 0x5e, 0x4d,
+			0xf8, 0xc0, 0x6b, 0xa5, 0x88, 0x08, 0xc3, 0x39,
+			0x7a, 0x06, 0xc0, 0x70, 0xe4, 0xa5, 0x75, 0xa6,
+			0xaf, 0x6f, 0x72, 0xc6, 0x01, 0x64, 0xee, 0xf0,
+			0xa0, 0xd5, 0x29, 0x2c, 0x98, 0x1e, 0xf9, 0x9a,
+			0xfe, 0x26, 0x14, 0xb9, 0xe0, 0x20, 0x07, 0xf9,
+			0x79, 0x5a, 0x24, 0xce, 0xe9, 0xe0, 0x24, 0xd6,
+			0xc4, 0x66, 0x79, 0x0f, 0x33, 0x83, 0x5f, 0x65,
+			0x3e, 0xf8, 0xb3, 0x9c, 0x25, 0x6e, 0xe9, 0x58,
+			0x1e, 0x6c, 0xae, 0x97, 0x2d, 0xb0, 0x20, 0x5f,
+			0x5b, 0x00, 0x68, 0x2e, 0x5c, 0x02, 0x3d, 0x97,
+			0x03, 0x83, 0xb7, 0xae, 0xc5, 0x50, 0x70, 0x7b,
+			0xc9, 0x57, 0xa8, 0x8e, 0xc7, 0x89, 0x46, 0xa8,
+			0xf4, 0x69, 0x12, 0x82, 0x62, 0x0d, 0x11, 0xe6,
+			0x00, 0xc8, 0xd0, 0xdc, 0xe6, 0x0d, 0xb2, 0xa8,
+			0x4c, 0xbd, 0xe2, 0x51, 0x07, 0x79, 0x61, 0x50,
+			0xa7, 0xb0, 0x08, 0x3c, 0xd3, 0x77, 0xdb, 0x20,
+			0xf8, 0x26, 0x81, 0x60, 0xfa, 0xd8, 0xeb, 0x66,
+			0x36, 0xce, 0x6c, 0x18, 0x2e, 0xaf, 0x97, 0xa4,
+			0xa6, 0x10, 0x06, 0x30, 0x71, 0xee, 0x59, 0x6e,
+			0x0c, 0x70, 0x0f, 0x0e, 0x64, 0xf9, 0x8a, 0x54,
+			0x66, 0xa8, 0x53, 0xaa, 0x0c, 0x7c, 0xf8, 0xda,
+			0x63, 0xd8, 0x0d, 0x04, 0xff, 0xfd, 0xbb, 0x61,
+			0x88, 0x65, 0x14, 0xd7, 0x7a, 0x9a, 0x90, 0xdd,
+			0x04, 0xe6, 0xf6, 0x15, 0xf8, 0xef, 0xf4, 0x26,
+			0x5c, 0xdb, 0x20, 0x5a, 0x65, 0x25, 0x4b, 0x55,
+			0xb6, 0x7a, 0x91, 0x9c, 0xb0, 0x24, 0x28, 0x35,
+			0xaa, 0xea, 0x02, 0xcc, 0x87, 0x4a, 0x06, 0xd3,
+			0xc6, 0x59, 0xd3, 0xfe, 0x35, 0xe6, 0x49, 0xf6,
+			0x99, 0x14, 0x99, 0x50, 0xd9, 0x25, 0xc3, 0x01,
+			0x47, 0xcd, 0xbc, 0x06, 0x9a, 0xb8, 0x8e, 0x79,
+			0xe9, 0xeb, 0xa6, 0x3c, 0x12, 0xf7, 0xca, 0xda,
+			0x28, 0x22, 0x85, 0x13, 0xe9, 0x3f, 0x37, 0xc5,
+			0x9c, 0x04, 0x54, 0xab, 0x49, 0x73, 0xe7, 0xb4,
+			0xd1, 0xf4, 0x22, 0x85, 0x88, 0xb2, 0xdd, 0xb0,
+			0x2d, 0xfa, 0xcb, 0xa8, 0xd2, 0xc4, 0x22, 0xda,
+			0xb7, 0x9f, 0xf4, 0x8c, 0xf4, 0xac, 0xd6, 0xef,
+			0x81, 0x46, 0x68, 0x61, 0x2b, 0xef, 0xab, 0xc3,
+			0x9b, 0x99, 0xb0, 0x05, 0x4e, 0xce, 0x92, 0x76,
+			0x0c, 0xb3, 0x6f, 0xe6, 0x6b, 0xd8, 0xb0, 0x8f,
+			0x0a, 0x23, 0xff, 0x82, 0x91, 0xa0, 0x5f, 0x15,
+			0xc6, 0xf9, 0x6e, 0x6a, 0x82, 0x58, 0xbf, 0xbd,
+			0xb0, 0x37, 0x18, 0xd8, 0xe5, 0x1a, 0x7d, 0x60,
+			0x1a, 0xc3, 0x91, 0xa5, 0xa5, 0x2b, 0x21, 0x71,
+			0x7b, 0xa7, 0x4f, 0xb0, 0xfd, 0x7f, 0x6b, 0xaa,
+			0x4d, 0xc1, 0x47, 0xf9, 0x9f, 0x41, 0xbe, 0x94,
+			0x7c, 0x45, 0x02, 0xb1, 0xb5, 0x01, 0xb2, 0xd3,
+			0xaf, 0xcd, 0x98, 0x80, 0x26, 0x9b, 0x6d, 0x87,
+			0xd4, 0xe7, 0x6f, 0x34, 0x49, 0x33, 0x4f, 0x62,
+			0x06, 0x99, 0x02, 0x82, 0x66, 0x45, 0xaa, 0x9a,
+			0x8c, 0x1c, 0x37, 0x1d, 0xfe, 0x32, 0x0f, 0x74,
+			0x0f, 0x51, 0x3a, 0x55, 0x9b, 0xcb, 0x9d, 0xb7,
+			0x64, 0x49, 0xe9, 0xe9, 0x74, 0xaf, 0x40, 0xde,
+			0x0b, 0x8b, 0xb4, 0x8f, 0x6e, 0x3d, 0x4e, 0x04,
+			0xd7, 0x1e, 0xb9, 0xee, 0xd1, 0x7e, 0xa9, 0x65,
+			0x80, 0x2a, 0xb1, 0x85, 0xec, 0xaa, 0x67, 0x3b,
+			0x07, 0x5c, 0xdb, 0x49, 0xd1, 0xbb, 0x4b, 0x56,
+			0x3b, 0x3e, 0x48, 0xbf, 0x82, 0xd0, 0x1a, 0xd6,
+			0x43, 0xe2, 0xf1, 0x56, 0x32, 0xc1, 0xad, 0x02,
+			0xf3, 0xac, 0x5d, 0x5b, 0x30, 0x18, 0xcf, 0x17,
+			0x47, 0x72, 0x36, 0x2c, 0x23, 0xed, 0x0f, 0x23,
+			0xa4, 0xb5, 0x6f, 0x95, 0x6a, 0xde, 0x62, 0xd8,
+			0xeb, 0x33, 0xb0, 0x50, 0x2b, 0x50, 0xcf, 0xab,
+			0x5d, 0x0b, 0x43, 0x09, 0x55, 0xb8, 0xe7, 0xba,
+			0xb4, 0xa1, 0xae, 0x74, 0x0a, 0x96, 0x15, 0xf8,
+			0xe5, 0x67, 0xd0, 0x90, 0xeb, 0x31, 0x65, 0xe9,
+			0x5c, 0x9f, 0x84, 0x96, 0xb4, 0x09, 0xad, 0xc1,
+			0x61, 0x85, 0x32, 0xe5, 0xcd, 0xfc, 0x3e, 0xf5,
+			0xde, 0xe4, 0x37, 0xa4, 0x58, 0xc6, 0xfa, 0xea,
+			0xba, 0x4c, 0x93, 0x73, 0xfd, 0x3a, 0x33, 0x9e,
+			0x13, 0x36, 0xfd, 0x36, 0x0c, 0x17, 0xc8, 0x78,
+			0xee, 0x18, 0xc3, 0x1c, 0xb5, 0x43, 0x04, 0xb5,
+			0xa2, 0x45, 0xbd, 0xf6, 0x7e, 0x26, 0xce, 0xa5,
+			0x46, 0xc7, 0x3f, 0x9d, 0x80, 0x24, 0x41, 0x45,
+			0xd2, 0xa3, 0xec, 0x2d, 0x92, 0xbc, 0x77, 0xd2,
+			0x45, 0xc9, 0x7e, 0x89, 0xc7, 0x40, 0xfd, 0xe9,
+			0x59, 0x02, 0x28, 0x8c, 0x73, 0x6f, 0xeb, 0x1a,
+			0x6a, 0x4e, 0x79, 0x23, 0x92, 0xed, 0xc9, 0x56,
+			0x25, 0xb3, 0x13, 0x76, 0x3c, 0xee, 0x7f, 0x14,
+			0x2f, 0xa1, 0x8f, 0x28, 0x3d, 0xbe, 0x7f, 0xbe,
+			0x1a, 0x10, 0xa7, 0x68, 0xf9, 0x5d, 0x48, 0x71,
+			0xaa, 0x1e, 0x42, 0x91, 0x3c, 0x47, 0xb6, 0xf5,
+			0x48, 0x1d, 0x8f, 0xa8, 0x8a, 0x9e, 0xa4, 0xea,
+			0x4b, 0xcb, 0xea, 0x96, 0xe6, 0x67, 0xa4, 0xf9,
+			0x3c, 0xba, 0x7a, 0x5a, 0x9e, 0x5e, 0xee, 0x11,
+			0xdd, 0xaa, 0xda, 0xa2, 0xf2, 0xf9, 0xa6, 0x5b,
+			0xbd, 0x62, 0x23, 0x2b, 0x7c, 0x7f, 0x23, 0xec,
+			0x1a, 0x2c, 0x49, 0x52, 0xa0, 0xd6, 0x08, 0x12,
+			0x22, 0x2d, 0x3e, 0x3f, 0x90, 0x99, 0xbf, 0xf2,
+			0x40, 0x54, 0x73, 0x7c, 0xe5, 0xf7, 0x1f, 0x43,
+			0x92, 0xaf, 0xb3, 0xd7, 0x3d, 0x53, 0x62, 0x68,
+			0x79, 0xea, 0x50, 0x7e, 0x82, 0x83, 0xa8, 0xae,
+			0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+			0x10, 0x16, 0x1c, 0x22, 0x29, },
+	}, {
+		.what = "pure rejection vector",
+		.algo = "ml-dsa65",
+		.pk_len = DILITHIUM65_PUBLICKEYBYTES,
+		.pk = (const u8[DILITHIUM65_PUBLICKEYBYTES]){
+			0xe8, 0xd0, 0x2e, 0x36, 0x7d, 0x73, 0x4e, 0xc4,
+			0x1c, 0xf6, 0xda, 0x86, 0x13, 0xcf, 0xfd, 0x49,
+			0xcd, 0x53, 0xd2, 0x13, 0x5f, 0xfa, 0x28, 0xf0,
+			0x49, 0x2d, 0x0c, 0x20, 0x21, 0x02, 0xdc, 0x87,
+			0x87, 0x9c, 0x19, 0xe8, 0x97, 0x51, 0x5a, 0x02,
+			0x30, 0x57, 0x9c, 0x68, 0xc0, 0x56, 0x0d, 0x2c,
+			0x75, 0x36, 0xa4, 0x4d, 0x76, 0x6e, 0x60, 0xb8,
+			0x6a, 0x0a, 0x2a, 0xb7, 0x8d, 0x6f, 0x44, 0x0e,
+			0xd1, 0xdb, 0xd5, 0x63, 0x87, 0xa4, 0xc2, 0xcb,
+			0x7b, 0x46, 0x28, 0x4e, 0xd9, 0xf7, 0x9d, 0x8e,
+			0xc4, 0xc0, 0x61, 0x93, 0x2d, 0xa1, 0xf8, 0x56,
+			0x10, 0xdf, 0xbb, 0x7a, 0xac, 0x79, 0x9a, 0x2f,
+			0xd3, 0xe7, 0x2f, 0xd1, 0x1c, 0xee, 0xa9, 0xe2,
+			0x82, 0x45, 0x9e, 0x8a, 0x6b, 0x91, 0xcd, 0x91,
+			0x3c, 0xcd, 0x73, 0x85, 0x83, 0x60, 0x57, 0x4e,
+			0x86, 0x59, 0x5f, 0x5b, 0xa7, 0xf9, 0x00, 0x2b,
+			0xba, 0x4e, 0x4c, 0xc6, 0x0e, 0x7d, 0x1b, 0xef,
+			0x11, 0x23, 0x1b, 0x48, 0x4f, 0xba, 0x5a, 0x40,
+			0xb2, 0xea, 0x86, 0xcf, 0xc0, 0xb2, 0x69, 0x19,
+			0x43, 0x75, 0x95, 0x5b, 0x7f, 0xd7, 0x12, 0x39,
+			0xcd, 0xf5, 0x92, 0xad, 0xda, 0xc9, 0xc1, 0x4b,
+			0xde, 0xcb, 0x99, 0xbf, 0xa8, 0x19, 0x5b, 0x68,
+			0x0d, 0xd1, 0x11, 0xa9, 0x39, 0x0f, 0xb4, 0x00,
+			0xa0, 0xf3, 0xd8, 0x51, 0xd0, 0x4d, 0xfe, 0x07,
+			0xe4, 0x10, 0x76, 0x24, 0xf5, 0xec, 0x1a, 0xd5,
+			0xad, 0x52, 0x13, 0xe7, 0x39, 0xfb, 0x53, 0x0f,
+			0x62, 0xff, 0xfd, 0xa0, 0xd4, 0x9b, 0xb2, 0x53,
+			0xce, 0xfa, 0xcd, 0x7a, 0xce, 0x8e, 0x65, 0xf1,
+			0xcf, 0x9c, 0x97, 0x64, 0xd8, 0x37, 0xfe, 0xa5,
+			0xa8, 0x46, 0xdf, 0xba, 0xc6, 0xdb, 0x35, 0xc0,
+			0xf4, 0x0b, 0x3b, 0xa7, 0xdd, 0x75, 0x7a, 0x06,
+			0x78, 0x53, 0x95, 0xd3, 0x96, 0x89, 0x53, 0x4d,
+			0x2c, 0xc6, 0xcf, 0xfa, 0xab, 0x1d, 0xb9, 0x2e,
+			0x79, 0x25, 0xe4, 0x30, 0x1d, 0x75, 0x8f, 0x5a,
+			0x93, 0x86, 0xd0, 0x2b, 0xb3, 0x0a, 0x7d, 0xec,
+			0x46, 0xde, 0x32, 0x3b, 0x61, 0xea, 0xae, 0x93,
+			0x94, 0xa3, 0xd2, 0x38, 0xc9, 0x0f, 0x34, 0x5a,
+			0xed, 0x84, 0x31, 0xcf, 0x78, 0x9a, 0xcd, 0xf8,
+			0xf3, 0x98, 0xf2, 0x4e, 0x89, 0xa2, 0xbb, 0x7b,
+			0xdb, 0x1c, 0xa5, 0xcc, 0x37, 0x4a, 0x28, 0xaf,
+			0xdc, 0xe7, 0x1c, 0x3c, 0x65, 0x7d, 0xad, 0xb2,
+			0xa1, 0x1e, 0x07, 0x22, 0x66, 0x48, 0x89, 0x14,
+			0x0c, 0x0e, 0xba, 0xef, 0x54, 0xbc, 0xb5, 0xcb,
+			0xa5, 0x2b, 0x3b, 0x59, 0x9e, 0x7c, 0xc9, 0x01,
+			0xa8, 0xcb, 0xf4, 0x34, 0x01, 0x33, 0x7d, 0x61,
+			0x12, 0x49, 0x63, 0x8b, 0xba, 0x81, 0xf2, 0xd9,
+			0x2b, 0x94, 0xdf, 0xbb, 0xe2, 0x7c, 0x22, 0x92,
+			0xd3, 0x49, 0xd6, 0x84, 0x28, 0x50, 0x8e, 0xf0,
+			0x1d, 0x5a, 0x69, 0xd9, 0x7a, 0xc1, 0x29, 0x83,
+			0x89, 0x0e, 0xfc, 0xd0, 0xb0, 0xf1, 0x1d, 0xb6,
+			0x92, 0xa4, 0xbb, 0x38, 0x2e, 0x57, 0x44, 0x11,
+			0xba, 0x5c, 0x9e, 0xba, 0x56, 0x27, 0xa2, 0xf4,
+			0xb5, 0xe6, 0x29, 0x19, 0x05, 0x3b, 0xb1, 0x4e,
+			0x42, 0x37, 0x7c, 0x3c, 0xde, 0x7d, 0x57, 0x27,
+			0x15, 0x63, 0xf6, 0x9f, 0xa6, 0xdd, 0x6c, 0xfb,
+			0xde, 0x86, 0xa3, 0x40, 0xbf, 0xf0, 0x37, 0xcf,
+			0x8a, 0x65, 0x5c, 0x95, 0xdb, 0x0c, 0x9d, 0xf7,
+			0x8d, 0x8f, 0xe1, 0x21, 0x9b, 0x5e, 0x99, 0xba,
+			0xb0, 0x95, 0x71, 0x4c, 0x83, 0x0b, 0x53, 0x21,
+			0xee, 0x17, 0x3f, 0x9e, 0xf7, 0x88, 0x29, 0x68,
+			0x22, 0x8f, 0xd2, 0x68, 0x47, 0x8c, 0x4d, 0x6e,
+			0xf8, 0x4d, 0xc2, 0x6d, 0xcd, 0x46, 0x99, 0x4c,
+			0x97, 0xe7, 0x57, 0x39, 0xfb, 0x80, 0x49, 0x4a,
+			0x44, 0x8d, 0x54, 0x2e, 0x8e, 0x22, 0x24, 0x3f,
+			0x98, 0x64, 0x34, 0x1d, 0x49, 0xa9, 0xe1, 0x2a,
+			0x64, 0x40, 0xde, 0x06, 0x9b, 0xf6, 0x3f, 0x9d,
+			0x34, 0x5b, 0x39, 0x54, 0x45, 0x08, 0x78, 0x88,
+			0xd7, 0x1c, 0x72, 0xe0, 0xe3, 0x0d, 0x12, 0x4e,
+			0x11, 0x2c, 0xe2, 0xe4, 0xa8, 0x53, 0xd1, 0x6a,
+			0x81, 0x71, 0x80, 0x8a, 0xde, 0x47, 0x62, 0x22,
+			0x54, 0x8a, 0x87, 0xf8, 0x31, 0xb9, 0x3e, 0x38,
+			0x9e, 0xfc, 0xc0, 0xc7, 0x67, 0x5c, 0x1f, 0xa0,
+			0xff, 0xc1, 0x43, 0xa2, 0xc6, 0x8e, 0xfd, 0xde,
+			0x0b, 0xde, 0xb3, 0xd8, 0xb4, 0xd2, 0xfd, 0xc6,
+			0x9c, 0x81, 0xe9, 0x00, 0xc0, 0x46, 0x98, 0x09,
+			0xdb, 0x73, 0xfe, 0x97, 0xd1, 0x4d, 0xff, 0x3a,
+			0xbf, 0xd4, 0xd7, 0x2b, 0x4f, 0x90, 0xf6, 0xd5,
+			0x12, 0x49, 0xbc, 0xb9, 0xab, 0x8f, 0x44, 0xf1,
+			0xaa, 0xef, 0x6b, 0x6f, 0x68, 0x05, 0x96, 0x1c,
+			0x09, 0x83, 0x3c, 0x76, 0xa9, 0xe4, 0x22, 0x00,
+			0x9c, 0x76, 0xa6, 0x9d, 0xe5, 0xdb, 0xb5, 0x91,
+			0xa2, 0x67, 0x8c, 0xb6, 0xda, 0xb0, 0xe2, 0xb5,
+			0x80, 0x42, 0x23, 0x3a, 0x8d, 0xca, 0x8f, 0x77,
+			0xf3, 0x13, 0x18, 0x4f, 0xc7, 0x68, 0xaf, 0x5e,
+			0x68, 0x04, 0xc7, 0x6b, 0xa9, 0x88, 0x03, 0x3d,
+			0xb4, 0x0f, 0x2d, 0x60, 0x0d, 0x5b, 0xa4, 0x03,
+			0xd8, 0x97, 0x1a, 0x38, 0x24, 0x05, 0x1b, 0x6a,
+			0xd8, 0x25, 0x34, 0xe4, 0x53, 0xab, 0x80, 0xcc,
+			0x71, 0x17, 0x82, 0x3f, 0xa8, 0x67, 0xb8, 0x84,
+			0xde, 0xab, 0x2f, 0xf7, 0x5d, 0x63, 0xba, 0xd6,
+			0x1b, 0x94, 0xae, 0x06, 0x93, 0xea, 0x7e, 0xc6,
+			0x7c, 0x22, 0x6d, 0xaa, 0xc6, 0xf2, 0xee, 0x38,
+			0x1b, 0x24, 0x7e, 0x6e, 0x7d, 0xcf, 0x68, 0xcd,
+			0x30, 0xb1, 0x8e, 0x42, 0x8b, 0xd8, 0x97, 0xb2,
+			0xfb, 0x03, 0x99, 0x07, 0xf6, 0x13, 0x0e, 0xda,
+			0x3f, 0x50, 0x4b, 0x94, 0x7f, 0x41, 0x63, 0x1d,
+			0xa6, 0xcc, 0x8e, 0xff, 0xf7, 0x7d, 0x05, 0x1f,
+			0x73, 0x7e, 0xaf, 0xbc, 0x14, 0xdd, 0x3c, 0x61,
+			0xbd, 0x96, 0xa1, 0x12, 0xd5, 0xb0, 0xc2, 0xeb,
+			0x27, 0x3b, 0x97, 0x0d, 0xc6, 0x78, 0xfa, 0x97,
+			0x63, 0xee, 0xce, 0xfe, 0xe2, 0x33, 0x66, 0x36,
+			0xd6, 0x41, 0x52, 0xfa, 0xd1, 0x6a, 0xb3, 0x62,
+			0x01, 0x07, 0xd8, 0x12, 0xc3, 0xc0, 0xe3, 0xd7,
+			0x40, 0x86, 0xe3, 0x13, 0xa1, 0x11, 0xc6, 0x05,
+			0xe3, 0x84, 0xa3, 0x76, 0xa2, 0x0c, 0x60, 0xca,
+			0x42, 0xbe, 0x0c, 0x3d, 0x04, 0x91, 0xe3, 0xc2,
+			0xd3, 0xbd, 0x0c, 0xd3, 0x0d, 0x24, 0x7b, 0x5f,
+			0x19, 0xe4, 0x79, 0x59, 0xf1, 0x47, 0x1a, 0xd4,
+			0x4c, 0xc6, 0x23, 0x5e, 0x4f, 0x3e, 0x54, 0x0d,
+			0x06, 0x70, 0xb4, 0x50, 0x7e, 0xe8, 0xfb, 0x78,
+			0x5c, 0x09, 0x26, 0x1a, 0x3f, 0xf7, 0x24, 0x70,
+			0x9c, 0x54, 0xc7, 0xdd, 0x27, 0x5f, 0x11, 0x75,
+			0x96, 0x5c, 0xad, 0xfe, 0x5f, 0x7c, 0x42, 0x4f,
+			0x3d, 0xa7, 0x1e, 0x6f, 0x7e, 0x6f, 0xdc, 0xd7,
+			0xad, 0x0f, 0xf9, 0x6f, 0xb1, 0xfd, 0xca, 0xdf,
+			0xcf, 0x59, 0xe4, 0x86, 0x69, 0x37, 0x34, 0xaa,
+			0xc8, 0xe2, 0xca, 0x3b, 0xcc, 0x48, 0x86, 0xe3,
+			0xee, 0xea, 0x25, 0x54, 0x94, 0x1b, 0x30, 0xbd,
+			0x39, 0xb0, 0xe3, 0x41, 0xa5, 0xab, 0x03, 0x7b,
+			0x12, 0xfb, 0x1f, 0x6e, 0x4e, 0xaa, 0xf5, 0x41,
+			0xa0, 0x5c, 0xa2, 0xaa, 0xc4, 0x6b, 0xc9, 0xa6,
+			0xca, 0x61, 0x78, 0xcb, 0xcd, 0x2a, 0x47, 0x31,
+			0xf8, 0x8a, 0x90, 0x4f, 0x88, 0xb3, 0x3e, 0x4d,
+			0x6b, 0x75, 0x74, 0x4d, 0x00, 0x7c, 0xc8, 0x29,
+			0x9b, 0xe9, 0xf7, 0x6f, 0xec, 0xa3, 0xf0, 0x43,
+			0x10, 0x05, 0x88, 0xee, 0x3a, 0x5f, 0x96, 0x31,
+			0xfa, 0xe3, 0xca, 0x31, 0x38, 0x48, 0x9b, 0x9d,
+			0xe9, 0x4e, 0x5f, 0x45, 0xc1, 0xc0, 0x70, 0x70,
+			0xec, 0x1b, 0x95, 0x77, 0x14, 0xda, 0xe2, 0xf1,
+			0x0c, 0xba, 0xf5, 0x38, 0xc5, 0x0e, 0x07, 0xbe,
+			0x54, 0x1f, 0x70, 0x22, 0x79, 0x88, 0xc8, 0x4b,
+			0xd7, 0xae, 0x5b, 0x5a, 0x15, 0xbc, 0xa5, 0x1c,
+			0x5d, 0xee, 0xcf, 0x9a, 0xa2, 0xde, 0x79, 0x77,
+			0x40, 0xb3, 0x32, 0xd5, 0x31, 0x50, 0x91, 0x30,
+			0x56, 0xbc, 0x26, 0xa2, 0x50, 0x44, 0x1d, 0xdc,
+			0xa8, 0x5c, 0xbf, 0x7b, 0x19, 0xfb, 0x0f, 0xc3,
+			0x78, 0x12, 0x29, 0xbe, 0xc0, 0x74, 0xd5, 0xc2,
+			0xac, 0xce, 0xf9, 0x34, 0xb3, 0x6d, 0x9b, 0xfd,
+			0x55, 0x10, 0x3d, 0xa5, 0x05, 0xee, 0x03, 0x52,
+			0xc8, 0x05, 0xd0, 0x22, 0xc0, 0xee, 0x7a, 0x19,
+			0x17, 0x19, 0x28, 0x01, 0xfc, 0x08, 0x04, 0x27,
+			0x62, 0x61, 0xf8, 0xc3, 0x91, 0x68, 0xd9, 0xb6,
+			0x9d, 0x9f, 0xa4, 0x40, 0xd2, 0x5d, 0xfe, 0xb5,
+			0xae, 0x94, 0xee, 0x07, 0x52, 0x59, 0xf6, 0x63,
+			0x23, 0xb9, 0xf0, 0xc9, 0xd3, 0x55, 0xca, 0xbc,
+			0xfa, 0x80, 0x5f, 0x96, 0x5b, 0x5e, 0x64, 0x0e,
+			0x1c, 0x47, 0x56, 0xc6, 0xee, 0x75, 0x7c, 0x90,
+			0xd4, 0x2f, 0x97, 0xce, 0x85, 0x9a, 0x84, 0x37,
+			0xb6, 0x0d, 0x79, 0x65, 0x3f, 0xb5, 0xa3, 0xe8,
+			0xff, 0xac, 0xeb, 0x2b, 0x11, 0x40, 0xb3, 0xb3,
+			0x9c, 0xf6, 0x0e, 0xde, 0xb1, 0x76, 0x63, 0x84,
+			0xd3, 0x29, 0x52, 0x69, 0x6a, 0x3a, 0xc0, 0x7f,
+			0x81, 0xf0, 0x87, 0xc6, 0x92, 0xd3, 0x5f, 0xb1,
+			0x48, 0x92, 0x98, 0x25, 0xc0, 0x43, 0x19, 0x1c,
+			0x68, 0xf1, 0x2a, 0x5b, 0xfb, 0x3c, 0xd3, 0xc6,
+			0x19, 0x7b, 0x9e, 0x66, 0xe0, 0xbe, 0x74, 0x57,
+			0x35, 0x6e, 0x6e, 0xf9, 0x03, 0x76, 0x7c, 0x1c,
+			0xce, 0x44, 0x5f, 0x6d, 0xd5, 0xea, 0x8f, 0x4a,
+			0x0c, 0x85, 0x3b, 0xa2, 0xf7, 0x51, 0x27, 0x41,
+			0x95, 0x5d, 0x00, 0x06, 0x44, 0x9f, 0x98, 0x61,
+			0x7b, 0x48, 0x36, 0xa5, 0xb4, 0xb6, 0x0f, 0x27,
+			0x1a, 0xac, 0x63, 0x24, 0xf6, 0x46, 0x51, 0xc5,
+			0x44, 0xba, 0x39, 0x71, 0x69, 0x33, 0x20, 0x1f,
+			0xc3, 0x50, 0xbe, 0xc3, 0xd3, 0x55, 0x59, 0x43,
+			0xc9, 0x4e, 0x68, 0xdf, 0x1d, 0xca, 0x0b, 0xe2,
+			0x11, 0x61, 0x01, 0xe2, 0x5a, 0xd5, 0xed, 0x6b,
+			0xbf, 0x76, 0x02, 0x88, 0x9e, 0xf0, 0x1c, 0x57,
+			0x1c, 0xb0, 0x99, 0x89, 0x4d, 0xd9, 0xcf, 0x10,
+			0x49, 0x9b, 0x26, 0x0f, 0xfb, 0xf8, 0x10, 0x6c,
+			0x3f, 0x41, 0x78, 0x0d, 0xa3, 0xdc, 0x5d, 0x18,
+			0xe7, 0x3c, 0xa8, 0x4f, 0x70, 0xf7, 0x82, 0xef,
+			0x15, 0xcf, 0x5c, 0x00, 0x15, 0x41, 0x38, 0x56,
+			0x3c, 0x4c, 0x2e, 0xbc, 0xb1, 0x34, 0x35, 0xce,
+			0x18, 0xc4, 0xa2, 0xb4, 0xea, 0xc2, 0xac, 0x0e,
+			0x63, 0x23, 0x20, 0xa1, 0x72, 0x19, 0x6a, 0x21,
+			0x75, 0xcd, 0xab, 0xcc, 0xdb, 0x92, 0xc9, 0x55,
+			0x1c, 0x60, 0xcc, 0xcd, 0xa1, 0x33, 0x28, 0x4a,
+			0x83, 0x79, 0x14, 0x0a, 0x79, 0x40, 0x15, 0x4b,
+			0x13, 0x1b, 0x50, 0x95, 0x4b, 0x78, 0x0f, 0x9d,
+			0x56, 0x18, 0xa1, 0x4e, 0x5f, 0x82, 0x85, 0x2f,
+			0xa0, 0x54, 0x11, 0xad, 0x58, 0xe0, 0x2d, 0x37,
+			0x87, 0x2c, 0xec, 0x35, 0xe2, 0xa4, 0xf1, 0x53,
+			0x31, 0xbb, 0xa9, 0xd4, 0x86, 0x2f, 0x80, 0xe9,
+			0x03, 0x1e, 0xe4, 0x72, 0x98, 0x1a, 0x98, 0x83,
+			0xf4, 0x27, 0x64, 0xf5, 0xc7, 0x8c, 0x9e, 0xec,
+			0x22, 0xe4, 0x37, 0x6a, 0xef, 0x3e, 0x7f, 0x11,
+			0x0e, 0xdd, 0x32, 0xf9, 0xf5, 0x43, 0x21, 0x27,
+			0x7d, 0x6d, 0xa3, 0xe8, 0x75, 0xf4, 0x06, 0x9e,
+			0xda, 0x53, 0x49, 0x07, 0x87, 0x91, 0xbe, 0xe9,
+			0xf2, 0xae, 0xa3, 0x26, 0x1a, 0xc2, 0x35, 0x07,
+			0x21, 0x9b, 0x60, 0x56, 0xfb, 0xce, 0xf8, 0x9f,
+			0x8b, 0x46, 0xef, 0x2d, 0x24, 0x70, 0x12, 0xb2,
+			0x9d, 0x3c, 0x6b, 0xed, 0xa4, 0xe4, 0x74, 0x98,
+			0xc0, 0xd2, 0x49, 0xea, 0x52, 0x91, 0x47, 0x5d,
+			0x60, 0xf5, 0x5c, 0x81, 0x86, 0xe6, 0x70, 0xcb,
+			0x6c, 0xe4, 0xa3, 0x0d, 0x1f, 0xe7, 0xd0, 0x90,
+			0xb0, 0xe7, 0x8a, 0xa6, 0x87, 0x96, 0xaa, 0xd2,
+			0xf4, 0x3b, 0xaa, 0x3b, 0xfc, 0xf3, 0x29, 0xdd,
+			0xd3, 0xce, 0x4c, 0xfa, 0x52, 0x7a, 0xef, 0xf0,
+			0x27, 0x16, 0x15, 0x23, 0x9b, 0x40, 0x01, 0x4c,
+			0x66, 0x80, 0xc1, 0xdd, 0x00, 0x31, 0xfa, 0x23,
+			0xa2, 0x24, 0x72, 0xa7, 0xd2, 0x50, 0xf4, 0x26,
+			0x83, 0x31, 0xd1, 0x7d, 0xeb, 0xef, 0x4f, 0x1d,
+			0xa5, 0xf4, 0xde, 0x8e, 0x45, 0x48, 0x3c, 0x62,
+			0xde, 0x86, 0x40, 0x1b, 0xbe, 0xd1, 0xa4, 0xb7,
+			0xa7, 0x5b, 0x6d, 0xe9, 0x26, 0x68, 0x0d, 0xc8,
+			0x22, 0xa8, 0x62, 0x90, 0x33, 0xce, 0x9d, 0xaf,
+			0x58, 0x6b, 0x4d, 0x14, 0x5b, 0x09, 0xfb, 0xfc,
+			0x14, 0xc8, 0xa8, 0xbf, 0xb9, 0x4c, 0xc3, 0x7d,
+			0x0c, 0x89, 0x2d, 0x37, 0xca, 0x65, 0x12, 0x83,
+			0xb4, 0x6c, 0x08, 0x46, 0x28, 0x86, 0x07, 0x2c,
+			0x37, 0x1a, 0xaf, 0xf4, 0xfc, 0x6d, 0x71, 0x4c,
+			0xbd, 0x1f, 0xec, 0xe0, 0x2a, 0xbd, 0x11, 0xdd,
+			0x41, 0xff, 0x85, 0xe0, 0x18, 0xf0, 0x5c, 0x54,
+			0x29, 0x98, 0x24, 0xb0, 0x3d, 0x93, 0xc0, 0xe9,
+			0x7f, 0x42, 0x22, 0x08, 0x5c, 0x61, 0xc8, 0x00,
+			0x66, 0xa9, 0x1f, 0x20, 0xf1, 0xa7, 0xf4, 0x4d,
+			0x91, 0xb9, 0xbe, 0xdb, 0x98, 0x42, 0xfc, 0xfb,
+			0xe8, 0x23, 0xdc, 0x2a, 0x93, 0x4c, 0xdf, 0xd2,
+			0x12, 0x14, 0x56, 0xe7, 0x13, 0x23, 0xf3, 0x5f,
+			0x3c, 0x3f, 0xa4, 0x09, 0x0a, 0x3f, 0xe1, 0x86,
+			0x87, 0x7f, 0x7a, 0xbd, 0xda, 0x97, 0x1b, 0x71,
+			0x1d, 0xd6, 0x9e, 0xe0, 0x13, 0x72, 0x8b, 0x5a,
+			0x62, 0x1c, 0xb1, 0x6e, 0xbb, 0x58, 0xac, 0x6e,
+			0x0c, 0x0f, 0xe7, 0x56, 0xb0, 0xeb, 0x38, 0x23,
+			0x9c, 0xd9, 0x3b, 0x09, 0xf1, 0xd4, 0xb0, 0xef,
+			0x79, 0xb1, 0x2d, 0xf1, 0x53, 0xc7, 0xe1, 0xc5,
+			0xb0, 0x6e, 0x82, 0x70, 0x56, 0xd2, 0x99, 0x0c,
+			0x5d, 0x65, 0x7f, 0x6d, 0xb1, 0x41, 0x8b, 0xb1,
+			0xa5, 0x8d, 0x02, 0xf4, 0x5a, 0x9d, 0x48, 0x10,
+			0x11, 0xa4, 0xc8, 0x11, 0x5a, 0xfb, 0x68, 0x58,
+			0x9d, 0xef, 0x13, 0xdd, 0x61, 0x63, 0x14, 0xba,
+			0x4d, 0xd8, 0x05, 0x0e, 0x13, 0xe8, 0x60, 0xf3,
+			0x2b, 0x44, 0xea, 0x3f, 0x37, 0x6b, 0x10, 0x32,
+			0x16, 0x3c, 0xbf, 0xf1, 0x4a, 0xf3, 0x4d, 0xe1,
+			0x6c, 0xcf, 0xb0, 0xbe, 0xc1, 0x67, 0xf8, 0x6d,
+			0xcd, 0xda, 0x1e, 0x32, 0x0b, 0xc0, 0x92, 0x7b,
+			0x65, 0xf3, 0x22, 0x1a, 0xb7, 0xbe, 0xaf, 0xeb,
+			0xf1, 0x83, 0x84, 0x9c, 0x6e, 0xc6, 0xd8, 0x22,
+			0xb0, 0xbb, 0x74, 0x9f, 0xe8, 0x53, 0x50, 0x75,
+			0xf4, 0x0a, 0xfc, 0x89, 0x70, 0x0b, 0xc4, 0x4e,
+			0x2b, 0x0b, 0xce, 0xbc, 0x31, 0xe7, 0xb6, 0x41,
+			0x8c, 0xcb, 0x7d, 0x92, 0x13, 0x01, 0xf0, 0x1f,
+			0x2f, 0x54, 0xb3, 0xa8, 0x78, 0xb5, 0x49, 0xb1,
+			},
+		.msg_len = 64,
+		.msg = (const u8[64]){
+			0x54, 0x5e, 0x06, 0xb5, 0x8a, 0xf2, 0x75, 0x69,
+			0x99, 0x4a, 0x48, 0x31, 0x65, 0x6e, 0xd1, 0x74,
+			0x71, 0x15, 0x24, 0x9f, 0x88, 0x74, 0xec, 0x97,
+			0x99, 0x29, 0x41, 0x37, 0xea, 0xff, 0x40, 0xf5,
+			0xe8, 0x1e, 0x4c, 0x13, 0x4f, 0x30, 0x6c, 0x5a,
+			0x3d, 0x45, 0x06, 0x9f, 0xf1, 0x45, 0x7e, 0xd9,
+			0xac, 0x30, 0x4b, 0x05, 0x41, 0xf1, 0x40, 0xd4,
+			0x32, 0xcb, 0x1d, 0x0b, 0x9a, 0x1d, 0x83, 0xb2,
+			},
+		.sig_len = DILITHIUM65_CRYPTO_BYTES,
+		.sig = (const u8[DILITHIUM65_CRYPTO_BYTES]){
+			0x70, 0x83, 0xff, 0x2b, 0xe7, 0x9f, 0x04, 0x25,
+			0xa4, 0xd2, 0xeb, 0x78, 0x1f, 0x60, 0x16, 0xc2,
+			0xa5, 0x65, 0x3c, 0x2f, 0x6f, 0x0f, 0xbb, 0x07,
+			0x9b, 0xe5, 0x13, 0xe2, 0xaa, 0x3f, 0x7a, 0xa9,
+			0xfc, 0xc7, 0x5a, 0x5d, 0xb6, 0x86, 0xd7, 0xdd,
+			0xb6, 0x26, 0xac, 0xb3, 0x43, 0x54, 0x35, 0x5d,
+			0x8f, 0x3f, 0xd3, 0xc5, 0xf3, 0x2b, 0x7b, 0xc1,
+			0xf8, 0x47, 0x67, 0x33, 0x25, 0x59, 0x8d, 0x19,
+			0x5e, 0xd8, 0xb1, 0x9f, 0x07, 0x47, 0xc8, 0x48,
+			0x88, 0x68, 0x75, 0x2c, 0x58, 0xd2, 0xc0, 0xc9,
+			0x4a, 0x5c, 0xc1, 0x4e, 0xa2, 0xa1, 0x2d, 0x1f,
+			0x1f, 0xa4, 0x7f, 0x64, 0x73, 0x11, 0xe2, 0xac,
+			0xb4, 0xf1, 0x90, 0xcb, 0xbf, 0xac, 0x3c, 0x76,
+			0x4d, 0x7f, 0x4c, 0x3a, 0x75, 0x3c, 0xa9, 0x41,
+			0xf2, 0xee, 0x5c, 0x38, 0x5c, 0xaa, 0x54, 0x83,
+			0x46, 0xb1, 0x42, 0xf5, 0xc0, 0x85, 0xea, 0xcd,
+			0x49, 0x81, 0xc1, 0x51, 0x3e, 0x01, 0x03, 0xe3,
+			0x33, 0x3f, 0x93, 0xc3, 0x8b, 0xb6, 0x62, 0xe6,
+			0x8b, 0x54, 0xc5, 0xee, 0x49, 0x4d, 0x63, 0x52,
+			0xa5, 0xd7, 0x51, 0x7a, 0x41, 0x87, 0x71, 0xdc,
+			0x87, 0xce, 0xbe, 0x6e, 0xc1, 0xf4, 0xf2, 0x48,
+			0x3e, 0x16, 0xab, 0x7c, 0xd8, 0xd6, 0x26, 0x8f,
+			0x2a, 0x90, 0x6b, 0x9f, 0x01, 0x0f, 0x2d, 0xdb,
+			0x5f, 0x41, 0x18, 0x6d, 0x59, 0x27, 0xa1, 0x3d,
+			0xe8, 0x7e, 0x56, 0x82, 0x32, 0x1c, 0x44, 0x2f,
+			0x6d, 0x6a, 0x62, 0x5e, 0xbf, 0x4c, 0x72, 0x2d,
+			0xaa, 0x03, 0x49, 0xd9, 0xda, 0xcb, 0x21, 0xc0,
+			0xa0, 0x95, 0x6f, 0xc9, 0x6c, 0x4f, 0x86, 0x1c,
+			0x77, 0x41, 0x0d, 0xd6, 0xd7, 0xac, 0x6e, 0x05,
+			0xbc, 0x94, 0x24, 0x6c, 0xd0, 0x91, 0x68, 0xfd,
+			0xfc, 0x61, 0x83, 0x46, 0x9c, 0xb0, 0xbb, 0x6a,
+			0x6e, 0xc6, 0xf1, 0x71, 0x44, 0xc5, 0x05, 0x87,
+			0x99, 0x16, 0x0c, 0xc3, 0xf9, 0x69, 0xc5, 0xb5,
+			0x53, 0x60, 0x5c, 0x0c, 0x7e, 0xff, 0x84, 0x1f,
+			0xc5, 0xea, 0x15, 0x1d, 0xea, 0xa0, 0xe3, 0x64,
+			0x58, 0x81, 0x67, 0xa2, 0x7c, 0x37, 0x17, 0x7d,
+			0xaf, 0x75, 0xbb, 0x22, 0x9b, 0x55, 0x7b, 0x34,
+			0x83, 0x8d, 0x52, 0xf6, 0xf7, 0x7d, 0x29, 0xc6,
+			0x68, 0x71, 0xf3, 0x5c, 0x23, 0x6e, 0x6c, 0x13,
+			0xf3, 0x07, 0x52, 0x49, 0x54, 0xde, 0x89, 0x5a,
+			0x58, 0x9e, 0xa4, 0x87, 0xd4, 0x9b, 0xb1, 0x5b,
+			0x44, 0xc0, 0xc9, 0x7c, 0x33, 0x90, 0x9c, 0x11,
+			0x52, 0x67, 0x51, 0xe8, 0x31, 0x99, 0x6d, 0x49,
+			0x93, 0xf4, 0xc7, 0x93, 0xca, 0x5b, 0x39, 0x2a,
+			0xae, 0x47, 0x94, 0x8a, 0xf5, 0x07, 0xe2, 0x21,
+			0x1e, 0xcc, 0xdd, 0x7a, 0x0d, 0xa1, 0x30, 0xda,
+			0x9c, 0xb6, 0x2b, 0x8c, 0x2f, 0xe6, 0xa6, 0xea,
+			0xe9, 0x11, 0x03, 0x05, 0x1c, 0x17, 0x71, 0xaa,
+			0x26, 0x3c, 0x26, 0x7c, 0xce, 0xe1, 0x4c, 0x96,
+			0xf7, 0xba, 0xa5, 0x56, 0x17, 0x07, 0x30, 0xca,
+			0x8a, 0x24, 0xdd, 0x2c, 0xeb, 0xbf, 0x3f, 0x41,
+			0xe5, 0xdf, 0xd5, 0xfe, 0x57, 0x6e, 0xd6, 0x2b,
+			0xc5, 0x4a, 0x4e, 0xb3, 0xe2, 0x71, 0xce, 0x76,
+			0x8a, 0x6f, 0xdb, 0xe6, 0x04, 0xf6, 0xe1, 0xe1,
+			0xaa, 0x5b, 0x22, 0x76, 0xde, 0x77, 0xae, 0x0c,
+			0x5d, 0xe0, 0xd1, 0x98, 0xd3, 0xf5, 0xd0, 0x03,
+			0x29, 0x53, 0xd3, 0xe6, 0x9a, 0xcd, 0x3e, 0xd3,
+			0x4a, 0x7e, 0x82, 0x1b, 0x4f, 0xdf, 0x0c, 0x73,
+			0x54, 0xee, 0x4d, 0x1f, 0xb2, 0xef, 0x89, 0xb5,
+			0xd8, 0x60, 0xa8, 0x60, 0x23, 0x6d, 0x5c, 0xbe,
+			0xf6, 0xa5, 0x39, 0xbb, 0x38, 0xff, 0x29, 0xfe,
+			0x6b, 0xed, 0xca, 0xbe, 0xf9, 0x48, 0xef, 0xf0,
+			0xb1, 0xb6, 0x3a, 0x38, 0xa3, 0x09, 0x48, 0x6a,
+			0xb4, 0x66, 0x25, 0xcc, 0xeb, 0xbd, 0x5e, 0x22,
+			0xf5, 0xc8, 0xe5, 0x81, 0xc2, 0xfd, 0x45, 0x2a,
+			0x2d, 0x62, 0x0d, 0x6f, 0xcd, 0x18, 0x86, 0x45,
+			0xb4, 0x94, 0x96, 0x48, 0xa8, 0x42, 0x14, 0xb7,
+			0xc2, 0x3d, 0x21, 0x02, 0xc2, 0xec, 0x53, 0xcb,
+			0x76, 0xab, 0x3c, 0x56, 0x55, 0x8c, 0xa6, 0x1f,
+			0x6a, 0xf5, 0x61, 0xbf, 0xc2, 0x72, 0x28, 0xb6,
+			0xce, 0x38, 0x7c, 0xb4, 0xbe, 0x71, 0x0b, 0x4d,
+			0x0a, 0x0e, 0x13, 0x33, 0x2e, 0x97, 0x3a, 0x2b,
+			0x9f, 0x7e, 0x92, 0xf6, 0x11, 0x93, 0xf6, 0x30,
+			0x1a, 0x9d, 0x2b, 0x89, 0x7c, 0x61, 0x24, 0x7b,
+			0x0f, 0xa6, 0xd7, 0x78, 0x59, 0xd3, 0x12, 0xe8,
+			0x73, 0x1d, 0xb5, 0x54, 0x89, 0xcf, 0x4b, 0x2c,
+			0xe6, 0xa8, 0x10, 0x08, 0xe2, 0x28, 0x93, 0xa0,
+			0xa8, 0x7a, 0x16, 0xdc, 0x41, 0x54, 0x49, 0x83,
+			0xd9, 0x3e, 0x42, 0xf9, 0x34, 0x00, 0xcd, 0x22,
+			0xdb, 0xec, 0x96, 0xa7, 0xbb, 0xd0, 0x6e, 0x17,
+			0xa2, 0x1c, 0x00, 0xf5, 0xd8, 0x0d, 0x04, 0xf8,
+			0x71, 0x9c, 0x66, 0x26, 0xe9, 0xbc, 0x33, 0xdb,
+			0x3f, 0x99, 0xd4, 0x37, 0x9c, 0xfa, 0x98, 0x2b,
+			0xc9, 0x34, 0x14, 0xd2, 0x4d, 0x36, 0x27, 0x4a,
+			0xf8, 0x05, 0xfb, 0x86, 0xfb, 0xd8, 0x48, 0xf2,
+			0x00, 0x55, 0x4c, 0xe0, 0x8c, 0x17, 0xb8, 0xfc,
+			0x26, 0x37, 0x82, 0x89, 0x32, 0xcc, 0x5b, 0xf9,
+			0xdb, 0x8c, 0xe8, 0x56, 0x64, 0x53, 0x9b, 0xeb,
+			0xb2, 0xdd, 0xc0, 0x3f, 0x82, 0x63, 0xaf, 0x75,
+			0x51, 0xfc, 0xa2, 0xd8, 0x73, 0x5f, 0xf9, 0x3e,
+			0xc3, 0x4a, 0x62, 0x1d, 0x72, 0x45, 0x87, 0xc2,
+			0x56, 0x2f, 0x84, 0x80, 0x91, 0x26, 0xcc, 0x3d,
+			0xb6, 0x2a, 0x23, 0xd0, 0x44, 0x54, 0xaa, 0x57,
+			0x70, 0x2c, 0xe6, 0xa0, 0x52, 0x72, 0x22, 0xad,
+			0x72, 0xa1, 0x8c, 0x76, 0x25, 0x94, 0x9e, 0xad,
+			0x04, 0x3c, 0x2b, 0x91, 0x04, 0xd7, 0xd7, 0xd2,
+			0x52, 0xcb, 0x2b, 0x47, 0x0c, 0x72, 0xa6, 0x76,
+			0x60, 0xf2, 0xdf, 0x3a, 0xa5, 0xb5, 0x26, 0x70,
+			0xd8, 0x5c, 0xd4, 0xce, 0x8a, 0xd5, 0x20, 0x9d,
+			0x88, 0x92, 0xac, 0x88, 0x70, 0x03, 0x3c, 0x75,
+			0x65, 0x1c, 0xd6, 0xba, 0x4f, 0x60, 0xa5, 0x43,
+			0xa6, 0x56, 0x02, 0x46, 0xe0, 0x62, 0xfe, 0xde,
+			0x2d, 0xe1, 0x2c, 0x9a, 0xfc, 0x17, 0xa1, 0x6d,
+			0x17, 0xa1, 0x1e, 0xd5, 0x0a, 0x9c, 0xa1, 0x6e,
+			0x7d, 0x6d, 0x30, 0x2f, 0x31, 0xcf, 0xe5, 0xd0,
+			0x9a, 0xae, 0xc0, 0x8e, 0x95, 0xea, 0xe8, 0xef,
+			0xd1, 0x56, 0x1d, 0xe4, 0x7f, 0x93, 0x89, 0xab,
+			0x05, 0x29, 0x08, 0xd5, 0x05, 0x67, 0x6a, 0xf3,
+			0x7a, 0x81, 0x01, 0x2e, 0xca, 0xe7, 0xc1, 0xd2,
+			0xf9, 0x20, 0xcf, 0xcd, 0xb7, 0xc1, 0x83, 0x7d,
+			0xdb, 0x12, 0x2b, 0x4a, 0x76, 0xef, 0xd3, 0x40,
+			0xa5, 0xb4, 0xca, 0x18, 0xde, 0xbd, 0xb8, 0x4d,
+			0xb8, 0x77, 0xb4, 0xb6, 0x06, 0x50, 0xc4, 0x15,
+			0x5f, 0x08, 0x5a, 0x19, 0x21, 0xdf, 0x3b, 0xa9,
+			0x07, 0xe9, 0x2c, 0xa3, 0x86, 0xfd, 0x94, 0xba,
+			0x77, 0x54, 0x65, 0xc1, 0x19, 0x27, 0xcc, 0x51,
+			0xa6, 0x27, 0x1b, 0x24, 0x10, 0x44, 0x07, 0x64,
+			0xc3, 0xd5, 0xfe, 0x97, 0xcd, 0xa6, 0x78, 0x89,
+			0xa4, 0x49, 0xde, 0xa7, 0xaa, 0x2a, 0x9e, 0x38,
+			0x3e, 0xfe, 0x15, 0x20, 0x0f, 0x0a, 0x4f, 0x2e,
+			0xcb, 0xab, 0xfd, 0xe6, 0x54, 0x6c, 0x77, 0x0a,
+			0xad, 0x7a, 0x45, 0x86, 0xf9, 0xb7, 0xfe, 0x7c,
+			0xe9, 0x51, 0x9e, 0x9e, 0x2b, 0x05, 0xff, 0x38,
+			0xf1, 0x44, 0x3a, 0x20, 0x41, 0xdd, 0xad, 0x9c,
+			0x5b, 0x06, 0xfe, 0x33, 0xfe, 0x19, 0x0a, 0x0d,
+			0x6a, 0x9c, 0x6f, 0x69, 0xbb, 0x36, 0x82, 0xa7,
+			0x8f, 0xe9, 0x57, 0x6b, 0xe6, 0x8a, 0xad, 0xe7,
+			0xbb, 0x12, 0xed, 0xd0, 0xc5, 0x29, 0xad, 0xc8,
+			0x32, 0xa5, 0x90, 0x21, 0xce, 0x37, 0x26, 0x84,
+			0x14, 0xd8, 0xa2, 0x4d, 0x0a, 0xba, 0x16, 0xae,
+			0x20, 0x1d, 0xa6, 0x5c, 0x07, 0xcd, 0x05, 0x7b,
+			0x83, 0xe8, 0x42, 0xf6, 0xf6, 0x9c, 0x80, 0xa7,
+			0xa1, 0x45, 0xd1, 0x09, 0x4c, 0x0b, 0x9e, 0x1e,
+			0xf8, 0x3a, 0xe8, 0x62, 0x95, 0x7b, 0xfa, 0x71,
+			0x3d, 0x07, 0x95, 0xdc, 0x13, 0x8e, 0xb1, 0x55,
+			0xf1, 0xc5, 0x31, 0x2f, 0xf9, 0x60, 0x35, 0x7d,
+			0x49, 0xef, 0x24, 0xc1, 0x6c, 0x4b, 0x97, 0xd8,
+			0xaf, 0x83, 0x43, 0x99, 0x77, 0x37, 0xf5, 0x01,
+			0x22, 0x47, 0xa0, 0x9b, 0xa1, 0x66, 0xc0, 0x92,
+			0xc9, 0x83, 0xb2, 0x97, 0xc1, 0xc5, 0xc2, 0x64,
+			0x8a, 0x3a, 0xdb, 0x3d, 0x85, 0xdf, 0x79, 0xf4,
+			0x29, 0xd0, 0x31, 0x51, 0xc1, 0x3b, 0xde, 0xa8,
+			0xad, 0xb7, 0x52, 0x14, 0xbd, 0x1a, 0xe6, 0xae,
+			0x2d, 0x1a, 0x60, 0x99, 0x37, 0xd3, 0x02, 0x81,
+			0x29, 0x39, 0xd8, 0xf8, 0xf0, 0xab, 0x53, 0x45,
+			0x87, 0x41, 0x83, 0x85, 0x29, 0xc1, 0xea, 0xc6,
+			0x73, 0x06, 0xe9, 0x67, 0x08, 0xcf, 0x10, 0x2a,
+			0xd0, 0xe8, 0x18, 0xd1, 0x13, 0x0e, 0xa7, 0xd2,
+			0xcb, 0xd7, 0x15, 0x86, 0x4c, 0x8c, 0x3f, 0x5b,
+			0x55, 0x46, 0x02, 0xbc, 0x42, 0xd4, 0x15, 0x01,
+			0xdf, 0xbd, 0x62, 0x79, 0xc6, 0x1d, 0x0c, 0xbf,
+			0x76, 0x58, 0x86, 0x41, 0x03, 0xb9, 0x5a, 0xf7,
+			0xde, 0xa5, 0xcb, 0x46, 0x04, 0x1a, 0x00, 0x52,
+			0xc8, 0x6c, 0x7f, 0xbd, 0xb7, 0x2b, 0xfd, 0xda,
+			0x9e, 0x98, 0xe0, 0x92, 0x99, 0xbb, 0x4f, 0xf1,
+			0x05, 0x49, 0x6c, 0xc4, 0x7d, 0xe6, 0x4b, 0x28,
+			0x8c, 0x44, 0x11, 0x31, 0x42, 0x0f, 0xba, 0x13,
+			0x1e, 0x5f, 0x12, 0xeb, 0xbf, 0x03, 0x0d, 0x9f,
+			0xfe, 0x2e, 0x35, 0x50, 0x54, 0xe5, 0xb9, 0xfb,
+			0x1f, 0xa9, 0xf0, 0xd1, 0xc5, 0x16, 0x5c, 0x89,
+			0x59, 0x62, 0x34, 0xe1, 0x8c, 0x7b, 0x7c, 0x77,
+			0x11, 0x6a, 0x4d, 0x77, 0xf1, 0xcc, 0x61, 0xde,
+			0x6b, 0xa0, 0x4b, 0x50, 0x01, 0xcc, 0xba, 0x8a,
+			0x6f, 0xc7, 0x6d, 0xdb, 0x04, 0x74, 0x52, 0xe9,
+			0xbb, 0x1f, 0xe0, 0xcb, 0x18, 0x62, 0x42, 0xfb,
+			0xa5, 0xaf, 0x6f, 0x65, 0x14, 0x01, 0xea, 0x01,
+			0x1d, 0xd4, 0xa1, 0x98, 0x44, 0x91, 0x19, 0x9e,
+			0xe3, 0x45, 0x1d, 0x95, 0x5b, 0xb1, 0x88, 0xf7,
+			0x12, 0xf1, 0xf7, 0xc5, 0x1f, 0x50, 0x19, 0x0b,
+			0x29, 0x9b, 0x9e, 0xce, 0x18, 0xd5, 0xdf, 0xa1,
+			0x5d, 0xe0, 0x70, 0x8e, 0x82, 0x75, 0xfa, 0x8d,
+			0x7d, 0x5f, 0x60, 0x7d, 0xb5, 0xf3, 0xa0, 0xe4,
+			0x0c, 0x69, 0xc3, 0x83, 0x5f, 0x49, 0xe4, 0x9f,
+			0xde, 0xdb, 0x93, 0x44, 0x43, 0xf7, 0xaa, 0x11,
+			0x8c, 0x46, 0xa8, 0x32, 0x1a, 0x93, 0xc9, 0xe6,
+			0xb8, 0x4e, 0xe9, 0x5c, 0x93, 0x99, 0xb7, 0x40,
+			0xf6, 0x8f, 0x56, 0xbd, 0x3f, 0x33, 0x63, 0x3d,
+			0x21, 0x61, 0xec, 0x83, 0xf5, 0xb4, 0x97, 0x74,
+			0x63, 0x13, 0x9a, 0x4e, 0x5b, 0xf8, 0x67, 0xd3,
+			0x04, 0xca, 0xff, 0x69, 0xfa, 0x9d, 0x43, 0xa8,
+			0xb9, 0x3a, 0xda, 0xe1, 0x40, 0x8f, 0x05, 0x57,
+			0xc6, 0xc5, 0x78, 0x73, 0xfe, 0xae, 0x93, 0xa9,
+			0x65, 0xc0, 0xf3, 0x2b, 0x1e, 0x66, 0x0c, 0x19,
+			0x35, 0x78, 0xfa, 0xbc, 0x91, 0xa9, 0xa6, 0xf2,
+			0xaf, 0x6b, 0x93, 0xd0, 0x6c, 0xd2, 0xd8, 0x0d,
+			0xe6, 0x61, 0x5d, 0x44, 0x9e, 0x94, 0xac, 0x9e,
+			0x19, 0xad, 0xfa, 0xe2, 0xc3, 0xa3, 0x46, 0x30,
+			0xf2, 0xb8, 0x90, 0xe7, 0x1b, 0xc6, 0x4b, 0xbb,
+			0xe6, 0xf3, 0x47, 0x54, 0x4d, 0x4c, 0xe4, 0xbc,
+			0xf8, 0x69, 0x90, 0x39, 0xab, 0x03, 0x43, 0xf4,
+			0x64, 0x55, 0x9b, 0xec, 0x95, 0x8b, 0x13, 0x03,
+			0xdf, 0x58, 0x5e, 0x2c, 0xf8, 0x53, 0xe5, 0x42,
+			0x9c, 0x5f, 0x9d, 0x36, 0x4b, 0xad, 0x5f, 0x2c,
+			0xc4, 0x2b, 0x07, 0x43, 0xc4, 0xa3, 0x91, 0xf1,
+			0xf4, 0xf6, 0x3a, 0xef, 0xe7, 0x0b, 0x43, 0xc5,
+			0xc5, 0xef, 0x3f, 0xf7, 0x29, 0xf2, 0x74, 0xae,
+			0x47, 0x0c, 0x7f, 0x6a, 0x75, 0x56, 0x48, 0x06,
+			0x56, 0x4e, 0x73, 0x14, 0x91, 0xd7, 0x27, 0x2b,
+			0x64, 0xe1, 0xd3, 0x68, 0x84, 0x9d, 0x56, 0xc6,
+			0xac, 0xa9, 0xf7, 0x8f, 0x2e, 0xa2, 0x12, 0x48,
+			0xad, 0x28, 0xa7, 0x1a, 0x58, 0x44, 0xcc, 0x69,
+			0xa8, 0x42, 0x32, 0x79, 0xd7, 0x77, 0xee, 0xeb,
+			0x97, 0x13, 0x82, 0x4d, 0xac, 0xb0, 0x08, 0x64,
+			0x34, 0x59, 0xfa, 0xe8, 0x48, 0x12, 0x11, 0x93,
+			0x8d, 0x7d, 0x94, 0x9f, 0x14, 0xd0, 0x06, 0x62,
+			0x4b, 0x51, 0x74, 0x5d, 0x7b, 0x1c, 0x70, 0x68,
+			0x82, 0xab, 0xf2, 0x41, 0xdc, 0xc9, 0x19, 0x64,
+			0x71, 0xa0, 0xcf, 0xd0, 0x16, 0x46, 0x9a, 0x93,
+			0x40, 0x87, 0xa3, 0x7e, 0x1a, 0x19, 0x25, 0x6b,
+			0xe1, 0x72, 0xd4, 0x4a, 0xf2, 0x8a, 0xdf, 0x96,
+			0x9d, 0xfc, 0xb2, 0xe1, 0x53, 0xd1, 0x31, 0x3e,
+			0xeb, 0xd0, 0xdf, 0xde, 0x3f, 0xb1, 0xc3, 0x92,
+			0xdb, 0xd1, 0x7e, 0x0f, 0x4b, 0xac, 0x09, 0x28,
+			0xa4, 0xaf, 0x3c, 0x74, 0x67, 0x19, 0xf0, 0xe5,
+			0xe6, 0x44, 0x3e, 0x47, 0x44, 0x51, 0x31, 0x9e,
+			0xda, 0x3e, 0x4b, 0xd8, 0xd1, 0xba, 0x93, 0x6f,
+			0x62, 0x59, 0xdc, 0x25, 0x35, 0x2c, 0x0c, 0xa6,
+			0xca, 0x28, 0x0a, 0xd5, 0x4c, 0x96, 0x72, 0xd9,
+			0x89, 0xbd, 0xd1, 0x49, 0x70, 0xe1, 0xc6, 0xe7,
+			0x7f, 0xf8, 0x45, 0x39, 0xe3, 0xa5, 0x9d, 0xd2,
+			0xae, 0xf7, 0xd6, 0x19, 0x57, 0x17, 0x57, 0x76,
+			0x31, 0x29, 0xdf, 0x3b, 0xa9, 0x89, 0x72, 0xb0,
+			0x45, 0xea, 0xc9, 0xcf, 0x6d, 0x8e, 0xf7, 0xf1,
+			0x94, 0x98, 0x6a, 0x8b, 0xf7, 0x83, 0xe9, 0xa9,
+			0xda, 0x34, 0xf1, 0x58, 0x90, 0xe5, 0xaf, 0x98,
+			0x42, 0x72, 0xe4, 0x87, 0xff, 0x5d, 0xb6, 0x26,
+			0x35, 0x40, 0x3b, 0xe6, 0x8f, 0xc8, 0x43, 0xe2,
+			0xe7, 0xf9, 0x35, 0x03, 0x27, 0xdb, 0xfc, 0xc1,
+			0x2b, 0x8b, 0xed, 0x3c, 0xaa, 0x1a, 0xb5, 0xc9,
+			0x98, 0xea, 0x58, 0x5c, 0x12, 0x27, 0xc8, 0x6d,
+			0xc8, 0xea, 0x40, 0x01, 0x5c, 0x28, 0x3e, 0x2d,
+			0x4a, 0x98, 0x03, 0x0b, 0xfb, 0xc1, 0x04, 0x0e,
+			0x15, 0x55, 0x5d, 0x9c, 0x19, 0x2d, 0x7d, 0x85,
+			0x0b, 0x33, 0x22, 0x93, 0x11, 0x07, 0x22, 0x66,
+			0x76, 0x3e, 0x49, 0x5d, 0xdf, 0xb7, 0x3e, 0x49,
+			0x3a, 0x27, 0x4b, 0xdd, 0x4d, 0x71, 0xe7, 0x75,
+			0x69, 0xc4, 0xfc, 0x59, 0x26, 0xdf, 0xa8, 0x59,
+			0x9f, 0xff, 0x86, 0xed, 0x25, 0x89, 0x51, 0xae,
+			0x42, 0x62, 0x41, 0x08, 0x42, 0x1f, 0x20, 0x0a,
+			0x0e, 0x50, 0x56, 0xb5, 0x54, 0xb8, 0xd7, 0x59,
+			0xe1, 0x3a, 0x57, 0x63, 0x45, 0x2d, 0xcd, 0x3f,
+			0x10, 0xb8, 0xfd, 0xd8, 0xb0, 0xd4, 0xe4, 0x90,
+			0x96, 0x9a, 0x5b, 0x8d, 0x1e, 0x6c, 0x6f, 0x7d,
+			0x78, 0x2b, 0x13, 0x51, 0xfd, 0xbc, 0x9e, 0xc2,
+			0x05, 0x2a, 0x08, 0xa2, 0x4d, 0x5c, 0x81, 0xec,
+			0xdd, 0x15, 0xba, 0xa1, 0x27, 0x60, 0xa0, 0x92,
+			0x34, 0x6a, 0x33, 0x7c, 0xf2, 0x6f, 0xdc, 0xce,
+			0x5d, 0x20, 0x27, 0x32, 0xcd, 0xa2, 0x71, 0x46,
+			0xc5, 0x1c, 0x90, 0xd1, 0x56, 0x4b, 0xe7, 0xe8,
+			0x3f, 0x08, 0x91, 0x2f, 0x3c, 0x01, 0x9d, 0x15,
+			0x50, 0x2c, 0x9b, 0x6e, 0xfb, 0xc5, 0x75, 0x3b,
+			0xdc, 0x90, 0x9e, 0xf0, 0x8e, 0x15, 0x3c, 0x33,
+			0x0f, 0x52, 0x53, 0x4f, 0x0f, 0xdc, 0x63, 0xc6,
+			0xa7, 0x0d, 0x99, 0x76, 0xef, 0x8c, 0x34, 0x13,
+			0x3d, 0xdf, 0xc3, 0x5b, 0xea, 0x70, 0x7b, 0x67,
+			0x90, 0xed, 0xfb, 0x3c, 0x3d, 0xf9, 0x71, 0x62,
+			0xae, 0x45, 0x00, 0xb1, 0x22, 0x45, 0x23, 0xd7,
+			0x5e, 0xdf, 0xfb, 0xb3, 0x55, 0x37, 0x5c, 0x40,
+			0xda, 0x83, 0xc1, 0x0f, 0x75, 0x39, 0xc3, 0xd0,
+			0x9e, 0x49, 0xa7, 0x2b, 0xf5, 0xc1, 0x56, 0xc1,
+			0x9a, 0x90, 0x94, 0x81, 0x9b, 0xd6, 0x97, 0x43,
+			0x96, 0x5b, 0x37, 0xf5, 0x70, 0x75, 0x82, 0xbc,
+			0x55, 0xe6, 0x90, 0xc7, 0x98, 0x93, 0x0f, 0xfb,
+			0xde, 0x8c, 0xc8, 0x72, 0x93, 0xb5, 0xdb, 0xc6,
+			0xef, 0x34, 0xf9, 0xcd, 0x17, 0x73, 0xc8, 0xb5,
+			0xba, 0x75, 0x70, 0xd5, 0x41, 0xb3, 0xac, 0x60,
+			0x3f, 0xa5, 0x27, 0xcf, 0x0a, 0x17, 0x6d, 0x8f,
+			0xcd, 0xf7, 0x33, 0x29, 0xf6, 0x37, 0xdd, 0x81,
+			0x71, 0x75, 0xb2, 0x71, 0x95, 0x28, 0x36, 0x76,
+			0x7d, 0xb0, 0xaa, 0x19, 0xa9, 0xfb, 0xb6, 0xd2,
+			0xec, 0xf6, 0x13, 0xaf, 0x40, 0x8a, 0x23, 0x89,
+			0x2f, 0x8f, 0xe0, 0x83, 0xcd, 0xa7, 0x3d, 0x0a,
+			0xeb, 0x64, 0x07, 0xcc, 0x2a, 0x2d, 0xe7, 0x1f,
+			0x77, 0x65, 0x3b, 0xf1, 0xb7, 0xfb, 0x31, 0x32,
+			0xa3, 0x2b, 0xf5, 0xb2, 0x5c, 0x6b, 0xf7, 0x64,
+			0xaa, 0xd5, 0xe7, 0x14, 0x32, 0xbf, 0x3c, 0xec,
+			0xe0, 0x63, 0xb4, 0x9c, 0x44, 0xed, 0x4b, 0x96,
+			0x03, 0xc0, 0x8c, 0x99, 0x62, 0xcb, 0xe1, 0xd5,
+			0xa3, 0x16, 0x5f, 0x95, 0x78, 0x4a, 0x98, 0x19,
+			0x4b, 0x4e, 0x74, 0x92, 0x12, 0x41, 0x4f, 0xd0,
+			0xf3, 0x4b, 0x24, 0x68, 0xd3, 0xcb, 0xda, 0x35,
+			0x61, 0xda, 0x6f, 0xa6, 0x80, 0x93, 0x82, 0xd0,
+			0xd3, 0x11, 0x9a, 0xb4, 0xbf, 0xb8, 0x8f, 0x68,
+			0x84, 0x7b, 0x27, 0x96, 0xce, 0x7c, 0x11, 0x06,
+			0x44, 0x2b, 0x6e, 0x39, 0x37, 0x36, 0x55, 0xe6,
+			0x21, 0x44, 0x63, 0xce, 0x80, 0x0f, 0xdc, 0xad,
+			0xef, 0xc9, 0x30, 0x05, 0x3a, 0x40, 0x1f, 0x8e,
+			0x5b, 0x79, 0x41, 0xcd, 0x6a, 0x57, 0xd0, 0xf2,
+			0xee, 0x65, 0xdf, 0xb0, 0xac, 0x89, 0xd9, 0x4b,
+			0xe5, 0xf2, 0xce, 0x85, 0xdf, 0x80, 0x7f, 0x9b,
+			0x86, 0xd4, 0x00, 0x7a, 0x3e, 0xfa, 0xcd, 0xbd,
+			0xe2, 0xcb, 0xa2, 0x5f, 0x1d, 0x04, 0xa2, 0x1e,
+			0xf5, 0xc7, 0x07, 0x5b, 0x17, 0xd3, 0xfb, 0xd1,
+			0x95, 0x8e, 0xe3, 0x6e, 0xbc, 0xff, 0xd4, 0xe0,
+			0x97, 0xd6, 0x8c, 0xab, 0x11, 0x1e, 0x53, 0x16,
+			0x40, 0x0a, 0x06, 0x23, 0x50, 0x15, 0x82, 0x87,
+			0x19, 0xcf, 0xee, 0x44, 0x5b, 0x3c, 0x60, 0x78,
+			0xe7, 0xcd, 0x13, 0xf6, 0x03, 0x9f, 0x23, 0xa0,
+			0x74, 0x0b, 0x4c, 0xfe, 0x7f, 0x21, 0xa4, 0x11,
+			0xf9, 0x62, 0xeb, 0xe3, 0xe3, 0x5d, 0x5a, 0x7b,
+			0x54, 0xc5, 0x10, 0x5c, 0x42, 0x2a, 0x10, 0x7e,
+			0x82, 0x3c, 0x9a, 0x8f, 0xa1, 0x75, 0xac, 0x4c,
+			0xe7, 0x2b, 0xfc, 0xd7, 0xd0, 0x7b, 0x05, 0x42,
+			0xc6, 0xa3, 0x8e, 0x9b, 0x68, 0xfd, 0x45, 0x4e,
+			0xec, 0x25, 0x01, 0x0e, 0x45, 0x26, 0x31, 0x5a,
+			0x7b, 0x8b, 0xe1, 0x69, 0xd0, 0x80, 0xc9, 0xb8,
+			0xd0, 0xc2, 0x6c, 0xb6, 0x76, 0xff, 0x1f, 0xa8,
+			0x26, 0xed, 0x51, 0xa6, 0xde, 0x93, 0x18, 0x8c,
+			0x21, 0xf1, 0x58, 0x9d, 0x58, 0xfd, 0xaa, 0x95,
+			0x98, 0xbd, 0x4c, 0xe6, 0xe8, 0xa6, 0x0a, 0x2d,
+			0x9e, 0x0e, 0x1b, 0x58, 0x72, 0xe6, 0xe4, 0xdd,
+			0x38, 0x69, 0x8e, 0x87, 0x05, 0x41, 0x40, 0xd6,
+			0x63, 0xab, 0xef, 0x52, 0x39, 0x5e, 0x13, 0xc2,
+			0x5a, 0x70, 0x27, 0x17, 0xb7, 0x3f, 0x93, 0x85,
+			0x0d, 0x7c, 0x20, 0x7c, 0xc3, 0xdb, 0xfe, 0x8e,
+			0x33, 0x11, 0x2c, 0x6e, 0x73, 0xb0, 0x6b, 0xfb,
+			0xa8, 0x87, 0xaa, 0x1b, 0x07, 0xfd, 0x43, 0x7e,
+			0x87, 0xe8, 0xb9, 0xca, 0x44, 0x8c, 0xc2, 0x01,
+			0xfa, 0xa6, 0x9a, 0x48, 0x44, 0xd7, 0x60, 0x1c,
+			0x62, 0x5b, 0xa0, 0xe9, 0xaf, 0xf5, 0x1f, 0xad,
+			0xa7, 0x2d, 0x68, 0xbc, 0xcb, 0x24, 0xa2, 0x5d,
+			0x5d, 0x87, 0x0a, 0x9b, 0xae, 0x77, 0x73, 0xf8,
+			0x7b, 0x91, 0x31, 0x23, 0x29, 0xd4, 0x1f, 0xb7,
+			0xf1, 0xfb, 0x75, 0x84, 0x09, 0xd6, 0xc2, 0x7d,
+			0x11, 0x8b, 0x69, 0xae, 0xdc, 0x83, 0xb7, 0xb4,
+			0xbd, 0xc3, 0x97, 0x59, 0xac, 0xf5, 0x25, 0x6d,
+			0xd1, 0x00, 0x6a, 0xb8, 0xf3, 0xf6, 0x7e, 0x62,
+			0x29, 0x56, 0xe3, 0x5b, 0xa2, 0x5b, 0xb1, 0x66,
+			0xb6, 0x6f, 0x2f, 0x6c, 0xdc, 0xf2, 0x7d, 0x6a,
+			0x96, 0x45, 0x8a, 0x88, 0x0d, 0x47, 0x65, 0xe3,
+			0x53, 0xb0, 0x54, 0x3b, 0xa2, 0xd9, 0xe5, 0x4b,
+			0x1d, 0xde, 0xf4, 0xac, 0xbf, 0xb5, 0x2f, 0xcc,
+			0x68, 0x06, 0x77, 0x14, 0xfb, 0x95, 0x69, 0x65,
+			0x77, 0xf4, 0xa6, 0xa0, 0x5c, 0x45, 0x18, 0xc3,
+			0x10, 0x74, 0x22, 0x4a, 0xe3, 0x78, 0xce, 0x75,
+			0x82, 0xf6, 0x89, 0x85, 0x11, 0x60, 0x8e, 0xa8,
+			0x80, 0x39, 0x7b, 0xd2, 0xde, 0xe6, 0x4d, 0x92,
+			0xdc, 0xbf, 0x1e, 0x78, 0x58, 0xde, 0xfc, 0xe7,
+			0x0f, 0x16, 0x6d, 0xbd, 0xa6, 0x61, 0x98, 0x8b,
+			0x2b, 0xd3, 0xeb, 0xa7, 0x5a, 0xb6, 0x94, 0x8b,
+			0xdf, 0xf8, 0x65, 0x4f, 0x4d, 0xd2, 0x43, 0xdb,
+			0x16, 0x44, 0x08, 0xc7, 0x58, 0xca, 0x50, 0xdd,
+			0x0d, 0xe3, 0xc6, 0x96, 0x8c, 0x02, 0xb5, 0xcc,
+			0x0c, 0x5b, 0x28, 0x95, 0x03, 0x00, 0x13, 0xa7,
+			0x9a, 0x65, 0xad, 0xdd, 0x11, 0x18, 0x99, 0x2f,
+			0xd4, 0x45, 0x38, 0x4e, 0x37, 0x82, 0x29, 0x70,
+			0x6a, 0x3b, 0xaf, 0x9a, 0x89, 0x66, 0x79, 0x57,
+			0xfe, 0x73, 0x71, 0x56, 0x92, 0xc9, 0x76, 0x02,
+			0x63, 0x1e, 0xa8, 0x24, 0x1a, 0xeb, 0x9e, 0xac,
+			0x0a, 0xd8, 0x86, 0x5c, 0x75, 0xb1, 0x05, 0x9c,
+			0xd3, 0x4f, 0x4b, 0x90, 0x76, 0xb3, 0xf1, 0x91,
+			0x76, 0xb4, 0x77, 0xee, 0x4c, 0x10, 0x49, 0x20,
+			0xc8, 0x9f, 0x80, 0xd0, 0xbd, 0x78, 0xa8, 0xc9,
+			0x92, 0x6c, 0x66, 0x77, 0x1a, 0xe2, 0x62, 0x0c,
+			0x71, 0x32, 0xd9, 0xf9, 0x83, 0x8b, 0x3c, 0xbd,
+			0x22, 0xb6, 0xf9, 0xe8, 0x72, 0xf4, 0xab, 0x17,
+			0x50, 0x92, 0xf2, 0xf6, 0x8c, 0x6c, 0x09, 0x03,
+			0x68, 0xfc, 0x6a, 0x31, 0x9f, 0x62, 0xeb, 0x4b,
+			0xb5, 0x4a, 0xfa, 0xd9, 0xe3, 0x9e, 0xfb, 0x90,
+			0xa4, 0x52, 0xe4, 0x43, 0xb3, 0x2d, 0x82, 0x66,
+			0x85, 0x45, 0x00, 0x51, 0x3f, 0x36, 0x08, 0x37,
+			0x1e, 0x72, 0xa1, 0xf3, 0x1c, 0x86, 0xdf, 0xd9,
+			0x49, 0x64, 0xa3, 0xf4, 0x46, 0x86, 0xae, 0x62,
+			0x3a, 0x26, 0x7b, 0x22, 0xfb, 0xef, 0x06, 0xb5,
+			0x2d, 0x86, 0xc6, 0xd4, 0x71, 0x76, 0x8c, 0xfd,
+			0xf8, 0x9f, 0x2d, 0xe2, 0xf5, 0x1c, 0x01, 0x98,
+			0xd9, 0xfb, 0xbd, 0xd1, 0xd6, 0x28, 0xc9, 0xe8,
+			0x7c, 0x2c, 0x19, 0xfa, 0x7e, 0x68, 0x0d, 0x92,
+			0x84, 0x0f, 0xb2, 0xca, 0xbb, 0x44, 0x9c, 0xf2,
+			0xd6, 0x6f, 0xa8, 0x00, 0xe9, 0xac, 0x54, 0x93,
+			0x59, 0x17, 0x48, 0x35, 0xba, 0xfb, 0x13, 0x1b,
+			0x78, 0x47, 0x08, 0x9b, 0x22, 0x66, 0xbf, 0x6a,
+			0xef, 0xfb, 0xd5, 0xe9, 0x59, 0xe6, 0x41, 0xd9,
+			0x62, 0x3b, 0xfa, 0x48, 0x1a, 0x18, 0xf7, 0x20,
+			0x64, 0x34, 0xbc, 0xa6, 0x60, 0x2b, 0xbf, 0xad,
+			0x84, 0x8c, 0x9c, 0x79, 0xb7, 0x99, 0xc4, 0xd0,
+			0xf7, 0xe7, 0x30, 0x86, 0xe7, 0xc7, 0x41, 0xcb,
+			0x25, 0x47, 0x47, 0x5a, 0x94, 0x3d, 0x6d, 0x18,
+			0x72, 0xdb, 0xdd, 0x0f, 0x07, 0xd3, 0x4c, 0x3e,
+			0x30, 0x36, 0xa8, 0x81, 0x02, 0xe0, 0x55, 0xc2,
+			0xbc, 0x06, 0xc9, 0x78, 0x82, 0xd4, 0xc8, 0x99,
+			0x77, 0x0b, 0x5d, 0xd4, 0x6c, 0x56, 0x08, 0x1c,
+			0x80, 0x5d, 0x80, 0x30, 0x7b, 0x82, 0xa1, 0x38,
+			0xf8, 0x96, 0xdf, 0xc2, 0xd9, 0xe8, 0x76, 0xc6,
+			0xa9, 0x62, 0xa8, 0x7e, 0xc2, 0x5a, 0x03, 0x66,
+			0xc0, 0x22, 0x20, 0x81, 0xd9, 0xec, 0x62, 0x1d,
+			0x06, 0x58, 0x88, 0x23, 0xfb, 0x84, 0x32, 0x99,
+			0x1e, 0x2d, 0xd2, 0xe2, 0xed, 0x4f, 0x85, 0xbb,
+			0x36, 0xfc, 0x98, 0x34, 0xa7, 0x44, 0x30, 0x29,
+			0x53, 0xbe, 0x24, 0x40, 0x87, 0xc9, 0xd5, 0xbf,
+			0x1a, 0xe4, 0x35, 0x19, 0x66, 0x70, 0x3b, 0xc6,
+			0x3c, 0x2a, 0x12, 0x11, 0xbf, 0xa3, 0x59, 0x58,
+			0x07, 0x1a, 0xdc, 0x94, 0x04, 0xf2, 0xbc, 0xd7,
+			0xf4, 0xeb, 0x07, 0xbb, 0x1a, 0x64, 0x76, 0xd4,
+			0xa1, 0x4a, 0xbe, 0xca, 0xbf, 0x7d, 0xba, 0xa4,
+			0x16, 0x24, 0xf3, 0xc2, 0x66, 0xa2, 0x03, 0xc9,
+			0x59, 0xaa, 0xd1, 0x5b, 0xa7, 0xd5, 0x52, 0x7b,
+			0x50, 0x72, 0x97, 0xa7, 0x74, 0x0c, 0xc6, 0xde,
+			0xe5, 0x7c, 0xc6, 0x48, 0x2d, 0x68, 0x26, 0x38,
+			0x2d, 0x08, 0x3c, 0xf5, 0x1d, 0xcb, 0x45, 0x06,
+			0x5b, 0xaa, 0xe0, 0x87, 0x0c, 0x45, 0xd3, 0x5a,
+			0xe4, 0xab, 0x22, 0xa4, 0xe5, 0x38, 0xda, 0xbf,
+			0x89, 0x4b, 0x39, 0xa0, 0x65, 0xe1, 0x7f, 0xcb,
+			0x82, 0xd1, 0xb8, 0xe4, 0x66, 0xdf, 0xeb, 0x8c,
+			0xbb, 0xa5, 0x2a, 0x4d, 0x85, 0x3a, 0xef, 0xab,
+			0x66, 0x13, 0x55, 0xa9, 0x9b, 0x2f, 0xb6, 0x7e,
+			0x03, 0x3e, 0x45, 0x63, 0xda, 0x25, 0x39, 0x3f,
+			0x8a, 0x8d, 0x9a, 0xd6, 0x01, 0x64, 0x7f, 0x93,
+			0x9c, 0xa3, 0xb6, 0x06, 0x18, 0x3b, 0x43, 0x5b,
+			0x76, 0x7b, 0xb8, 0xb9, 0xf4, 0x38, 0x3d, 0x3e,
+			0x4e, 0x51, 0x66, 0x9a, 0xb3, 0xc3, 0x05, 0xa2,
+			0xbc, 0xca, 0xce, 0xff, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
+			0x0c, 0x13, 0x1d, 0x26, 0x2c, },
+	}, {
+		.what = "pure rejection vector",
+		.algo = "ml-dsa65",
+		.pk_len = DILITHIUM65_PUBLICKEYBYTES,
+		.pk = (const u8[DILITHIUM65_PUBLICKEYBYTES]){
+			0xba, 0x4a, 0xf9, 0x35, 0xb4, 0x45, 0x33, 0x86,
+			0xd2, 0xb6, 0xc1, 0x3a, 0x55, 0x85, 0xc1, 0xff,
+			0xca, 0xe0, 0x0e, 0x26, 0x01, 0x6b, 0x1d, 0x88,
+			0x7d, 0x67, 0x6c, 0xa8, 0xac, 0x6d, 0x90, 0xdb,
+			0x60, 0xf2, 0x21, 0xe8, 0x24, 0x95, 0x8c, 0x0d,
+			0x16, 0x41, 0x46, 0x59, 0x08, 0x24, 0xbe, 0x15,
+			0x50, 0x63, 0xf6, 0xe2, 0x2a, 0x36, 0xf4, 0x55,
+			0x2e, 0xb0, 0xab, 0x5b, 0xe0, 0xc0, 0x82, 0x98,
+			0xe3, 0x2f, 0x40, 0x99, 0x4e, 0x8f, 0x1c, 0x08,
+			0x0c, 0xfc, 0x6b, 0x32, 0xbb, 0x5a, 0x28, 0xd1,
+			0xdd, 0xab, 0xc4, 0xf5, 0x04, 0x01, 0x68, 0x26,
+			0x02, 0xb9, 0x76, 0x87, 0x32, 0xed, 0xfc, 0x4c,
+			0x5e, 0x4c, 0xa0, 0x87, 0x87, 0xdb, 0x58, 0x95,
+			0x11, 0x5c, 0x38, 0x42, 0x17, 0xed, 0x16, 0xe2,
+			0xaf, 0x4e, 0x91, 0x4c, 0x3e, 0xe0, 0x57, 0x24,
+			0x60, 0x19, 0x67, 0x39, 0xb9, 0x45, 0x2e, 0x9e,
+			0x20, 0xeb, 0x66, 0x0b, 0xd9, 0xd3, 0x70, 0x82,
+			0x1f, 0xf9, 0xff, 0xe1, 0x5e, 0x1b, 0x83, 0x4d,
+			0x12, 0x3e, 0xe8, 0xdc, 0x33, 0xec, 0x11, 0x3e,
+			0x2b, 0x37, 0x4f, 0xaf, 0x2a, 0x3d, 0x18, 0x63,
+			0x14, 0x8a, 0x8e, 0xfd, 0xd4, 0x75, 0x0a, 0x12,
+			0xb3, 0x02, 0x3f, 0x64, 0x36, 0xfa, 0x4e, 0x9a,
+			0xed, 0x95, 0x37, 0x3c, 0x0d, 0x21, 0x7c, 0xd3,
+			0x90, 0x44, 0xc9, 0xfb, 0x19, 0x19, 0x98, 0xd8,
+			0x5a, 0xe0, 0x74, 0xad, 0x0e, 0xa6, 0xda, 0x2f,
+			0x09, 0xba, 0xe2, 0x77, 0x54, 0xa8, 0xbc, 0xe8,
+			0x13, 0xb2, 0xc3, 0x46, 0x45, 0x9b, 0xc3, 0x08,
+			0x73, 0xf1, 0x53, 0x82, 0xfd, 0x81, 0xca, 0x3e,
+			0xe2, 0x09, 0xa1, 0x73, 0x27, 0x94, 0xd5, 0x76,
+			0xf2, 0xe8, 0x09, 0x0d, 0xaf, 0xe5, 0x4c, 0xa9,
+			0xa3, 0x13, 0x9a, 0xe6, 0xd2, 0x04, 0x87, 0x3d,
+			0x5e, 0x34, 0x65, 0xbf, 0xdc, 0x4b, 0x4b, 0xf5,
+			0xab, 0x28, 0x44, 0x28, 0x76, 0x4a, 0xe4, 0xd2,
+			0x71, 0x03, 0xd3, 0xc2, 0x97, 0x29, 0x19, 0xcf,
+			0xfd, 0x16, 0xad, 0x52, 0x07, 0x50, 0x65, 0x07,
+			0xc6, 0x7e, 0x69, 0x0d, 0xec, 0x26, 0x81, 0x13,
+			0xbf, 0x7c, 0x5e, 0x8a, 0xf0, 0xee, 0xbd, 0x97,
+			0xe5, 0xce, 0x3d, 0x17, 0x9f, 0x38, 0xcf, 0x30,
+			0xe2, 0xf9, 0xd9, 0xc5, 0x1f, 0xf5, 0x20, 0x81,
+			0x79, 0x10, 0x9b, 0xee, 0x8f, 0xed, 0x0c, 0x9b,
+			0x96, 0x87, 0x89, 0x4d, 0xc5, 0x01, 0x19, 0x38,
+			0x11, 0x11, 0x36, 0x71, 0x0f, 0x9f, 0x0f, 0xfb,
+			0x9b, 0x1e, 0xf1, 0x26, 0x3b, 0x10, 0x43, 0xe9,
+			0x4f, 0x14, 0xef, 0xef, 0x34, 0xfc, 0x59, 0xfe,
+			0x82, 0x9e, 0xaa, 0x31, 0x6d, 0x0b, 0xae, 0xb6,
+			0x9e, 0xef, 0xe2, 0xcc, 0x19, 0x27, 0xf0, 0xe9,
+			0xf5, 0xab, 0x03, 0xeb, 0x1f, 0xef, 0x42, 0x75,
+			0x5d, 0xf2, 0x9f, 0x7f, 0xdd, 0xf8, 0x07, 0x45,
+			0x27, 0x8b, 0x6e, 0xb8, 0x25, 0x86, 0xc7, 0xe8,
+			0x4e, 0x1e, 0x60, 0x08, 0xf9, 0x90, 0x9e, 0xf2,
+			0xad, 0xca, 0xdf, 0x56, 0x4f, 0xf6, 0x0a, 0xc3,
+			0x53, 0x2c, 0xf9, 0x2c, 0xdd, 0xd6, 0xf2, 0x9d,
+			0x6d, 0x33, 0x61, 0x2e, 0xb0, 0x3f, 0x16, 0xa0,
+			0x18, 0x8e, 0xcb, 0x33, 0x32, 0x0f, 0x51, 0x6d,
+			0xfe, 0x8a, 0x07, 0x0d, 0x06, 0x42, 0x66, 0x6d,
+			0x67, 0x36, 0xb7, 0x8c, 0x26, 0x27, 0x90, 0xd8,
+			0xe8, 0xd9, 0xc1, 0x97, 0x0f, 0xe3, 0x73, 0x0d,
+			0xa8, 0x47, 0xa8, 0xea, 0x46, 0x8e, 0x52, 0x12,
+			0x2a, 0x67, 0xeb, 0x90, 0xb7, 0x78, 0x47, 0x0c,
+			0x78, 0x22, 0xed, 0xe0, 0xac, 0xdd, 0x9b, 0x2b,
+			0xf1, 0x4c, 0x7d, 0xfb, 0x7f, 0x33, 0xc9, 0xcd,
+			0x73, 0x6d, 0x65, 0x7a, 0xe9, 0xf8, 0xdc, 0xd0,
+			0x09, 0x49, 0x1d, 0x03, 0xed, 0x24, 0xa4, 0xdd,
+			0x0f, 0x68, 0xff, 0x08, 0xe8, 0x01, 0x43, 0xf9,
+			0x42, 0x59, 0x21, 0xf0, 0x21, 0xc5, 0x1b, 0xc4,
+			0x84, 0x8b, 0x5f, 0x6c, 0x31, 0xe7, 0x44, 0x92,
+			0x42, 0xe0, 0xc5, 0x4c, 0x01, 0x05, 0x87, 0xb8,
+			0xda, 0xad, 0x57, 0xb8, 0xb8, 0x55, 0xf5, 0x44,
+			0xac, 0xea, 0xd3, 0xd1, 0x46, 0xe2, 0x89, 0xe2,
+			0x7c, 0x16, 0x25, 0x9a, 0xca, 0x9a, 0xdb, 0x10,
+			0xf1, 0x73, 0x6e, 0xef, 0xca, 0x71, 0x86, 0xeb,
+			0xe3, 0xd6, 0x95, 0xc0, 0xc0, 0x9b, 0xb5, 0x47,
+			0x12, 0x75, 0x27, 0x7c, 0x65, 0xfe, 0x5d, 0x62,
+			0xaa, 0x55, 0x47, 0x8a, 0x9b, 0xbf, 0x18, 0xcb,
+			0x52, 0x57, 0x5e, 0x2c, 0xda, 0xd1, 0x49, 0x1f,
+			0x8f, 0x75, 0x6a, 0x38, 0x75, 0x7a, 0x82, 0x41,
+			0x46, 0x1c, 0xd4, 0xf3, 0xdb, 0xf8, 0x4a, 0x0c,
+			0x55, 0x21, 0x87, 0xfc, 0xf4, 0x71, 0x0a, 0x3d,
+			0x07, 0xea, 0x79, 0x18, 0x89, 0xdd, 0x97, 0x9f,
+			0x52, 0x30, 0x78, 0xb0, 0x54, 0x7f, 0xfc, 0x6c,
+			0x8c, 0x4f, 0xc9, 0xbd, 0x22, 0x00, 0xef, 0xd8,
+			0x27, 0x26, 0xb3, 0x5f, 0x60, 0x14, 0xad, 0x69,
+			0x46, 0x84, 0xdc, 0x38, 0xbd, 0xfb, 0x4e, 0x46,
+			0xec, 0xa6, 0x90, 0x25, 0xe5, 0x31, 0xff, 0xd5,
+			0xce, 0x74, 0x1f, 0xca, 0xae, 0x4b, 0x5a, 0x2f,
+			0x53, 0x13, 0xd7, 0x6f, 0x32, 0x25, 0x57, 0xb1,
+			0x88, 0x0b, 0x9c, 0xad, 0x54, 0x00, 0xcd, 0x2c,
+			0xec, 0x5d, 0x46, 0x4c, 0xbc, 0x93, 0x5b, 0xb1,
+			0xde, 0xf3, 0x05, 0x96, 0x60, 0x4a, 0xd1, 0xa9,
+			0x52, 0xd5, 0xfd, 0x0a, 0xd0, 0x84, 0x06, 0x91,
+			0x00, 0xf9, 0xf4, 0x47, 0x1c, 0xc8, 0x46, 0x99,
+			0xcb, 0x25, 0x23, 0x64, 0x9c, 0xa2, 0x79, 0xe3,
+			0x04, 0xe9, 0x90, 0x83, 0xb6, 0xe6, 0x3f, 0xac,
+			0x1a, 0x46, 0xa3, 0x9b, 0x07, 0xeb, 0xbd, 0xf8,
+			0x3d, 0xc0, 0xd1, 0x2c, 0x35, 0x29, 0x58, 0xf9,
+			0x24, 0x49, 0xef, 0xff, 0x33, 0x84, 0x21, 0xb0,
+			0x71, 0x67, 0x4a, 0xb8, 0xa6, 0x81, 0x9f, 0xe8,
+			0x1a, 0x27, 0xf6, 0x8e, 0xfa, 0xda, 0xda, 0x0a,
+			0xdf, 0xd8, 0x96, 0x9e, 0xd2, 0x09, 0x82, 0x09,
+			0x5b, 0x39, 0xcd, 0x92, 0x24, 0xf8, 0xea, 0x60,
+			0x7c, 0x84, 0x51, 0x62, 0x00, 0xc1, 0xc9, 0x29,
+			0x75, 0xa5, 0x53, 0x5c, 0x19, 0xe1, 0xdd, 0x21,
+			0xd8, 0x9a, 0xa5, 0x42, 0x85, 0xd6, 0x03, 0x92,
+			0x13, 0x68, 0x09, 0x11, 0xae, 0x60, 0xb4, 0x61,
+			0xf5, 0xf0, 0x72, 0xc6, 0xb8, 0x02, 0x1e, 0xb6,
+			0xa1, 0xd5, 0x52, 0xfa, 0xde, 0xf9, 0x41, 0xc3,
+			0x45, 0xb9, 0xe1, 0x1b, 0xa8, 0xb9, 0xff, 0xff,
+			0x05, 0x38, 0xef, 0x61, 0x97, 0x87, 0x18, 0x4f,
+			0x65, 0x77, 0xef, 0x70, 0xfe, 0x14, 0x21, 0xd6,
+			0x1a, 0x39, 0x92, 0xbf, 0x66, 0xfa, 0xb8, 0xf4,
+			0x3d, 0xba, 0x86, 0x92, 0x13, 0xfe, 0x43, 0x4f,
+			0x92, 0xc0, 0x3d, 0x17, 0x47, 0x19, 0xe6, 0xfc,
+			0xa0, 0x6e, 0x6b, 0x6a, 0xb3, 0x44, 0x03, 0x3b,
+			0x43, 0xe3, 0x4c, 0x9a, 0x0f, 0xb9, 0xbe, 0x71,
+			0xc4, 0x87, 0x0c, 0xdb, 0xa3, 0x87, 0xf6, 0x33,
+			0x35, 0x12, 0xa1, 0x78, 0xda, 0x9b, 0x46, 0x9f,
+			0x1b, 0x3a, 0x61, 0x49, 0x60, 0xab, 0x72, 0x88,
+			0x43, 0x82, 0xe5, 0x2d, 0xc9, 0xa9, 0x13, 0xb2,
+			0xd6, 0x01, 0xf1, 0xa9, 0xd3, 0x33, 0xca, 0xcd,
+			0x03, 0x1b, 0x2c, 0x8b, 0x42, 0xb7, 0x4d, 0xba,
+			0x6c, 0x03, 0xc9, 0x64, 0x8f, 0xe0, 0xd0, 0x4f,
+			0xa4, 0x0c, 0xad, 0x8a, 0x49, 0x45, 0x95, 0x9d,
+			0xcb, 0x50, 0x30, 0x82, 0x01, 0x9c, 0xf2, 0x71,
+			0xfd, 0xf3, 0x71, 0xfb, 0xe6, 0xa2, 0x2e, 0xd2,
+			0xe4, 0x69, 0x2e, 0x66, 0x48, 0x86, 0xd1, 0x49,
+			0xf7, 0xa8, 0x31, 0x61, 0xa7, 0xe0, 0xfd, 0x09,
+			0xa8, 0x04, 0x6c, 0x2f, 0xdf, 0xdd, 0x15, 0x21,
+			0xd9, 0x4f, 0xaa, 0x7e, 0x29, 0xd8, 0x54, 0x6b,
+			0xf1, 0x12, 0x96, 0x52, 0x73, 0x23, 0xbd, 0x63,
+			0xaa, 0xb0, 0xb5, 0x6c, 0x6b, 0x21, 0x00, 0xa0,
+			0xc8, 0x13, 0xd4, 0xe1, 0xab, 0x0b, 0xf9, 0x79,
+			0xe8, 0x53, 0x2b, 0x1f, 0x57, 0xc4, 0x4d, 0x7d,
+			0x85, 0x30, 0xb4, 0x6a, 0x04, 0x2b, 0x56, 0x21,
+			0xd5, 0xd1, 0x3d, 0x86, 0xf0, 0x53, 0xbe, 0x89,
+			0x00, 0xdc, 0x84, 0x3e, 0x4b, 0x65, 0xb2, 0x30,
+			0x24, 0xa3, 0x57, 0x42, 0x77, 0x33, 0x5d, 0xc7,
+			0x8c, 0xa7, 0x89, 0xf2, 0xa8, 0x2c, 0x0c, 0xf5,
+			0x15, 0xd4, 0xe6, 0x89, 0x69, 0x9b, 0xb0, 0x9b,
+			0x72, 0xd7, 0x1c, 0xc0, 0xaf, 0x35, 0x31, 0x0d,
+			0xee, 0x92, 0x7b, 0x90, 0x32, 0x3a, 0x93, 0x0a,
+			0xd1, 0x73, 0x39, 0x37, 0x4f, 0xd0, 0x7d, 0x9f,
+			0x40, 0x2e, 0x86, 0xff, 0xb5, 0xf6, 0x02, 0x32,
+			0x39, 0x0a, 0x1f, 0x1a, 0x4e, 0xcc, 0xf2, 0xae,
+			0x74, 0x46, 0x76, 0xc7, 0xef, 0xff, 0xf2, 0xf7,
+			0x05, 0x30, 0xc4, 0xa6, 0x84, 0x0f, 0x8d, 0x4b,
+			0xfd, 0x63, 0x84, 0x82, 0x3f, 0xdb, 0x2f, 0x9c,
+			0x58, 0x81, 0xc5, 0x5c, 0x92, 0x5a, 0x3d, 0x6b,
+			0xf1, 0x26, 0xc6, 0xc4, 0xaa, 0x10, 0x99, 0x63,
+			0xe5, 0x66, 0xf7, 0x14, 0xfc, 0xed, 0x51, 0xce,
+			0x0e, 0x59, 0x83, 0xd6, 0xc7, 0x9a, 0xe4, 0xeb,
+			0x8a, 0x5e, 0x84, 0xd1, 0x51, 0xd9, 0xc4, 0x34,
+			0xe7, 0x21, 0x68, 0x34, 0x04, 0xb4, 0x9b, 0x4f,
+			0x8b, 0xa6, 0xd6, 0x19, 0x83, 0x68, 0xd4, 0x12,
+			0xac, 0xf9, 0xad, 0xb2, 0x4f, 0x42, 0x7d, 0xe2,
+			0x57, 0x00, 0x94, 0xf8, 0xdb, 0xeb, 0xe9, 0xcb,
+			0xb2, 0x24, 0x61, 0x28, 0x99, 0x80, 0x06, 0x50,
+			0x20, 0x87, 0xd9, 0x71, 0xc6, 0xcb, 0x11, 0x8c,
+			0x3f, 0x41, 0xdb, 0x17, 0xa6, 0xd0, 0x3c, 0x42,
+			0xbe, 0x31, 0x83, 0xe8, 0x3e, 0x09, 0x1d, 0xb3,
+			0x42, 0x51, 0xcf, 0x8e, 0x13, 0xc0, 0xed, 0x0f,
+			0x73, 0x13, 0x3c, 0x19, 0x99, 0xd7, 0xe4, 0x61,
+			0x13, 0x23, 0x8f, 0x77, 0x20, 0xcc, 0x4b, 0xf1,
+			0x0c, 0xc2, 0xc6, 0xef, 0xad, 0x1f, 0x29, 0xa6,
+			0x34, 0x73, 0xc5, 0x12, 0x5a, 0x7c, 0x6b, 0x2f,
+			0x69, 0x4d, 0xb5, 0x75, 0xf6, 0x67, 0xb5, 0x06,
+			0x2c, 0xed, 0x32, 0xd1, 0x78, 0xd4, 0x9a, 0xdb,
+			0x47, 0x40, 0xe7, 0xa9, 0x8b, 0xd6, 0x8a, 0xd2,
+			0xf1, 0x70, 0xe3, 0xa8, 0xe1, 0x66, 0xa0, 0xe7,
+			0x18, 0x65, 0x5f, 0xe7, 0x0c, 0xf9, 0xd7, 0x90,
+			0x28, 0xf0, 0x5e, 0x9c, 0x80, 0x69, 0xac, 0x2b,
+			0x65, 0x09, 0xe6, 0xde, 0x32, 0xf1, 0x5e, 0xa3,
+			0x6d, 0xb0, 0x49, 0xe0, 0x45, 0xcf, 0xaa, 0xd2,
+			0x06, 0x6b, 0x97, 0x5c, 0xb7, 0xb3, 0x40, 0x3c,
+			0xb8, 0x86, 0x5f, 0x21, 0x82, 0xf4, 0x01, 0x24,
+			0x11, 0xa9, 0x35, 0x37, 0x09, 0x66, 0xa6, 0x1f,
+			0x85, 0xc5, 0x7a, 0xb9, 0xf9, 0xfe, 0x1c, 0x47,
+			0x47, 0xfe, 0xa2, 0x9b, 0x65, 0xd4, 0x68, 0xe3,
+			0x32, 0x23, 0x84, 0x2c, 0x17, 0x8e, 0x24, 0x2e,
+			0x1e, 0xd3, 0xbb, 0xd1, 0x3a, 0x8b, 0xe8, 0x08,
+			0xf0, 0x0c, 0x78, 0xdc, 0x51, 0xf0, 0x6a, 0xdd,
+			0xa4, 0xf9, 0x89, 0x07, 0x06, 0xf5, 0x10, 0xd2,
+			0x6b, 0x4a, 0xfd, 0x38, 0xb0, 0x72, 0xe4, 0xb1,
+			0xd2, 0x92, 0x96, 0xe6, 0xc9, 0xae, 0xab, 0xee,
+			0x5d, 0x64, 0xa0, 0x60, 0xf5, 0x48, 0x0a, 0xab,
+			0x59, 0x68, 0xc7, 0x3c, 0x0c, 0x56, 0xad, 0x6d,
+			0xc3, 0x2c, 0xed, 0xcf, 0x5d, 0xbd, 0xd7, 0xf3,
+			0x7d, 0x8d, 0x6a, 0x8d, 0x28, 0xbc, 0x4f, 0x0c,
+			0xab, 0x06, 0xc6, 0x32, 0xe6, 0x8a, 0xba, 0xa8,
+			0xba, 0x2a, 0x5d, 0xc7, 0xbf, 0xc8, 0xf5, 0x69,
+			0x7b, 0x37, 0x38, 0xe8, 0x4d, 0xf6, 0xb8, 0xe3,
+			0x94, 0x84, 0xba, 0x76, 0x3a, 0x2c, 0xa4, 0x06,
+			0xdd, 0xbd, 0xbc, 0x2b, 0x26, 0x8f, 0x92, 0x7a,
+			0x7e, 0xa4, 0x3a, 0xb1, 0xf6, 0x5f, 0x38, 0x85,
+			0xd3, 0xf6, 0x95, 0x6d, 0xb9, 0x1d, 0xe8, 0x5f,
+			0xda, 0x22, 0x22, 0xcc, 0x1f, 0x5e, 0x79, 0xd9,
+			0xab, 0x03, 0x5c, 0xb9, 0x16, 0xcd, 0x3c, 0x16,
+			0xcd, 0x2e, 0x49, 0xe3, 0x94, 0x58, 0x05, 0x2c,
+			0xd7, 0x6c, 0x10, 0xd6, 0x40, 0x4f, 0xa4, 0x7c,
+			0xec, 0xac, 0x2b, 0xb2, 0xef, 0x39, 0x2e, 0x6b,
+			0x01, 0x6d, 0x13, 0x07, 0x46, 0x31, 0xe6, 0xf7,
+			0x33, 0xdd, 0x5b, 0x58, 0x62, 0x84, 0xc2, 0xdf,
+			0xf0, 0x83, 0xcb, 0xa3, 0x87, 0xdb, 0x31, 0x70,
+			0x48, 0x8c, 0xd0, 0xcf, 0xa8, 0x94, 0x21, 0x6a,
+			0xe6, 0xb9, 0x18, 0xdb, 0x3a, 0x44, 0x79, 0x92,
+			0x6d, 0xec, 0x25, 0xa9, 0xde, 0x32, 0xa2, 0x70,
+			0x0a, 0x65, 0x96, 0x35, 0x7f, 0xde, 0xe5, 0xc4,
+			0x80, 0xb8, 0x78, 0x4b, 0x95, 0xff, 0xf6, 0xe7,
+			0x2f, 0x44, 0x52, 0x49, 0x98, 0x1c, 0x8a, 0xe2,
+			0x76, 0x62, 0x28, 0x96, 0x87, 0xde, 0xce, 0xef,
+			0x43, 0xf8, 0x04, 0x2f, 0xdf, 0x4a, 0x04, 0xfd,
+			0xb3, 0x83, 0xcd, 0xd4, 0x60, 0xa8, 0xcc, 0x94,
+			0x0d, 0x30, 0xe7, 0x79, 0xfd, 0x93, 0xe0, 0x1e,
+			0xc9, 0xd6, 0x34, 0x3a, 0x1f, 0x52, 0x50, 0x14,
+			0xc9, 0x97, 0xc0, 0xad, 0x78, 0xa2, 0x47, 0xcc,
+			0x7c, 0xb2, 0xb6, 0x17, 0xee, 0x37, 0xcc, 0x9a,
+			0x14, 0xc2, 0x27, 0xf8, 0xf9, 0x28, 0x5e, 0xfb,
+			0x44, 0xf7, 0xe0, 0x75, 0x19, 0xb7, 0x0f, 0x96,
+			0xb2, 0xef, 0x51, 0xac, 0x2e, 0x50, 0xbb, 0x93,
+			0x44, 0x69, 0xcc, 0x1c, 0xa5, 0xc5, 0xa2, 0x39,
+			0xa3, 0x00, 0x5e, 0x72, 0x20, 0x77, 0x1d, 0x6c,
+			0x46, 0x41, 0xe6, 0x89, 0x70, 0x2d, 0xfd, 0x4c,
+			0xe5, 0xc4, 0xce, 0xbf, 0x94, 0x01, 0xbd, 0x34,
+			0xd2, 0x9d, 0xea, 0xe7, 0x75, 0xcf, 0x3b, 0x0a,
+			0xf2, 0x58, 0x7b, 0x6a, 0x16, 0xef, 0x98, 0xae,
+			0x52, 0x57, 0xd5, 0x4a, 0x4d, 0xc1, 0xb3, 0xb9,
+			0x17, 0x96, 0x1d, 0xa8, 0xe0, 0x91, 0x07, 0xea,
+			0x50, 0xc1, 0x00, 0x0a, 0xa0, 0xa5, 0x5e, 0x45,
+			0x5a, 0xe4, 0xa8, 0x96, 0xc7, 0x8a, 0x70, 0xea,
+			0x88, 0x8d, 0x25, 0xef, 0xec, 0xd8, 0x88, 0x81,
+			0xa7, 0xa3, 0xbc, 0x5a, 0x4f, 0xc1, 0x7a, 0x91,
+			0x41, 0x8c, 0x01, 0xdf, 0x30, 0xda, 0x29, 0x5d,
+			0xdb, 0x46, 0xe3, 0x23, 0x61, 0x61, 0x91, 0x76,
+			0x42, 0xce, 0xb7, 0xdb, 0xe1, 0xb3, 0x9b, 0xbc,
+			0x74, 0x05, 0x03, 0x07, 0x97, 0xaf, 0x27, 0x3a,
+			0x82, 0x2a, 0xcc, 0x8d, 0x01, 0xae, 0x79, 0x0b,
+			0x8c, 0xdc, 0x24, 0x81, 0x3c, 0xe1, 0xbf, 0xc3,
+			0x89, 0xad, 0x6d, 0x8f, 0x22, 0xd6, 0x11, 0x77,
+			0xc4, 0xf7, 0x2f, 0x51, 0xe0, 0x00, 0x5c, 0x80,
+			0x76, 0x97, 0x0c, 0xd9, 0xd4, 0x98, 0xd6, 0x34,
+			0x42, 0x9c, 0xd6, 0x48, 0x62, 0x05, 0x81, 0x10,
+			0x86, 0x6e, 0xd5, 0x84, 0x29, 0x87, 0xf0, 0x43,
+			0x09, 0x13, 0x0f, 0x81, 0x1b, 0x60, 0xfc, 0xac,
+			0x99, 0x90, 0xea, 0xa1, 0x54, 0x84, 0x3b, 0x4e,
+			0xa6, 0xe4, 0xf6, 0xf9, 0xa6, 0x7d, 0x7c, 0xfe,
+			},
+		.msg_len = 64,
+		.msg = (const u8[64]){
+			0x16, 0x02, 0xe1, 0xd5, 0xb2, 0x06, 0x9b, 0x7c,
+			0x7c, 0x48, 0xd3, 0x12, 0x2a, 0xc3, 0xa0, 0x1f,
+			0x88, 0xef, 0xfa, 0x08, 0x15, 0x37, 0xcd, 0x04,
+			0x1d, 0x13, 0x67, 0x03, 0x94, 0xa5, 0x78, 0x2c,
+			0xfb, 0xb6, 0xd6, 0x62, 0x59, 0x47, 0x1c, 0x7a,
+			0xba, 0xf2, 0x88, 0x3c, 0x45, 0x93, 0xa8, 0x8d,
+			0x3d, 0x8d, 0x4b, 0x09, 0x6d, 0x66, 0x9a, 0x6a,
+			0xee, 0xec, 0x6e, 0x31, 0x42, 0xff, 0xcf, 0x38,
+			},
+		.sig_len = DILITHIUM65_CRYPTO_BYTES,
+		.sig = (const u8[DILITHIUM65_CRYPTO_BYTES]){
+			0x3d, 0x5e, 0x39, 0x2c, 0xd1, 0x70, 0x40, 0x56,
+			0x81, 0x94, 0x18, 0xae, 0x2d, 0xc8, 0x5e, 0x56,
+			0x69, 0x3b, 0x55, 0xcd, 0x09, 0xf2, 0x8f, 0xf6,
+			0xdc, 0xff, 0x95, 0xd2, 0x9c, 0xff, 0x3a, 0xd8,
+			0xcc, 0x3e, 0x2f, 0x77, 0x25, 0xb8, 0xd1, 0x50,
+			0xc3, 0x96, 0x5b, 0x78, 0xb3, 0x25, 0x7c, 0x53,
+			0x58, 0xb9, 0x3a, 0x56, 0x4b, 0xeb, 0x31, 0x7c,
+			0x8f, 0xd4, 0xc8, 0xd2, 0x9e, 0xe7, 0xe5, 0x0d,
+			0x33, 0xff, 0xf2, 0xb8, 0x78, 0xf0, 0x6c, 0xa4,
+			0xb4, 0xec, 0xe9, 0xc8, 0x93, 0xcd, 0xc0, 0xde,
+			0x85, 0xcf, 0x2d, 0x07, 0xdd, 0xee, 0xd7, 0xff,
+			0x23, 0xb7, 0x13, 0x96, 0x63, 0xbf, 0x18, 0xce,
+			0x84, 0x4f, 0x68, 0x88, 0xc0, 0x65, 0x97, 0x1e,
+			0x6e, 0x95, 0xff, 0xbe, 0xed, 0xaa, 0x93, 0xa3,
+			0x8e, 0xd0, 0x14, 0xbc, 0x6f, 0x11, 0x66, 0x69,
+			0x75, 0x90, 0x4f, 0x81, 0xbf, 0xa2, 0x64, 0x39,
+			0x78, 0x56, 0x9a, 0xa9, 0x92, 0xe6, 0x56, 0x2a,
+			0xa1, 0x15, 0xf9, 0xdc, 0xc9, 0x0d, 0xf5, 0x7a,
+			0x70, 0x82, 0x2c, 0x9d, 0xde, 0x73, 0x2e, 0x0c,
+			0xc9, 0x2a, 0x41, 0x64, 0xee, 0x4c, 0xe7, 0xb8,
+			0xc6, 0x76, 0xab, 0xb0, 0xab, 0xec, 0x11, 0x7f,
+			0x19, 0xdf, 0x49, 0x6e, 0x7e, 0x35, 0x47, 0x3f,
+			0x16, 0x08, 0x75, 0x30, 0x18, 0x1f, 0x55, 0x96,
+			0x46, 0xb7, 0x31, 0x54, 0xa8, 0x8f, 0xa8, 0x61,
+			0xc4, 0x45, 0xec, 0x54, 0x09, 0xe1, 0x52, 0xf7,
+			0x71, 0x29, 0x11, 0xb8, 0xea, 0x81, 0xd9, 0x55,
+			0x03, 0xea, 0x73, 0x4a, 0x3b, 0x55, 0x23, 0x0e,
+			0x65, 0x85, 0xed, 0x8f, 0x76, 0xda, 0x73, 0x50,
+			0x69, 0x44, 0xa4, 0xae, 0x0c, 0x6c, 0x4e, 0x3a,
+			0x70, 0x7b, 0x8c, 0xee, 0xef, 0x6c, 0x9a, 0x6b,
+			0xca, 0x96, 0x4e, 0x77, 0x8a, 0x02, 0xa0, 0x28,
+			0x6c, 0xab, 0x4b, 0xe1, 0x5e, 0x88, 0x4b, 0x47,
+			0x9a, 0x9b, 0x8c, 0x93, 0xa9, 0x78, 0x38, 0xff,
+			0x42, 0x36, 0xe8, 0xd9, 0xcc, 0x9f, 0xf4, 0x34,
+			0xa7, 0xb4, 0x2d, 0xe0, 0x2c, 0xd6, 0x2a, 0xf8,
+			0x48, 0xe8, 0xbb, 0x0b, 0x82, 0xa7, 0xb8, 0xc2,
+			0x51, 0xdc, 0x29, 0x3c, 0x76, 0x16, 0x81, 0xdd,
+			0xfa, 0x15, 0x7c, 0xc3, 0xd5, 0xd2, 0x8f, 0xde,
+			0xcd, 0x40, 0x14, 0x65, 0x21, 0x79, 0x9c, 0x71,
+			0x81, 0xf6, 0x37, 0x2b, 0x75, 0xf7, 0x33, 0xb4,
+			0x98, 0xe9, 0x02, 0xa7, 0xb5, 0xd7, 0xa4, 0xbe,
+			0xeb, 0x98, 0xbb, 0x5a, 0x37, 0x69, 0x5e, 0xb6,
+			0x11, 0x5c, 0xef, 0xef, 0xf8, 0x2e, 0xb0, 0x1d,
+			0x3f, 0xc6, 0x4a, 0xe6, 0x1a, 0x9a, 0xcd, 0xe9,
+			0x89, 0x93, 0x3f, 0xbd, 0x89, 0xeb, 0x7f, 0xbb,
+			0x9a, 0x8d, 0x8e, 0xd6, 0x5a, 0xe9, 0x45, 0xfd,
+			0xf1, 0x20, 0x56, 0x5c, 0x60, 0x89, 0x60, 0x79,
+			0xaa, 0x96, 0x70, 0xa6, 0xf8, 0xf3, 0xd5, 0x79,
+			0xf4, 0x3d, 0xfb, 0xe0, 0xa3, 0x3b, 0x17, 0x14,
+			0xf7, 0xe8, 0x21, 0x20, 0x02, 0xf3, 0x9d, 0x09,
+			0x5b, 0xc3, 0xb4, 0xe8, 0x47, 0x6e, 0xab, 0xc9,
+			0xd1, 0x8c, 0xba, 0x58, 0x45, 0x2a, 0x38, 0x9b,
+			0xdb, 0xb9, 0xf7, 0x67, 0x9d, 0x44, 0x5b, 0x95,
+			0xdd, 0x13, 0x1a, 0x27, 0x1b, 0xf7, 0xfb, 0x6b,
+			0xb7, 0x53, 0x44, 0x23, 0x06, 0x69, 0x55, 0x05,
+			0x82, 0xd2, 0xcf, 0x04, 0xe2, 0x85, 0x3d, 0x5c,
+			0xdf, 0xfd, 0xcb, 0xa3, 0x74, 0x51, 0x1a, 0x93,
+			0xc2, 0x64, 0x22, 0xae, 0x7c, 0x85, 0x09, 0xca,
+			0xb2, 0xe2, 0x9f, 0xaf, 0xde, 0x69, 0xc8, 0x44,
+			0xdf, 0x78, 0x49, 0x01, 0x3d, 0xbf, 0x99, 0x29,
+			0x81, 0x31, 0x54, 0x03, 0x99, 0x2f, 0x14, 0x75,
+			0x02, 0x8a, 0x77, 0x71, 0x3d, 0xb7, 0x6c, 0x12,
+			0x26, 0x08, 0x9a, 0x59, 0x59, 0xc0, 0x77, 0xd0,
+			0xc1, 0x63, 0xb9, 0x41, 0xf8, 0x90, 0x02, 0xdb,
+			0x0e, 0x00, 0xa9, 0xa7, 0xfd, 0xa7, 0x31, 0x2e,
+			0x14, 0xee, 0xd8, 0x69, 0x0a, 0x60, 0x01, 0xca,
+			0x11, 0x91, 0x1a, 0xd1, 0x40, 0x03, 0x2f, 0x43,
+			0xaf, 0x09, 0xe7, 0x65, 0x47, 0x6e, 0x14, 0xff,
+			0x36, 0xdc, 0x1d, 0xd8, 0xaf, 0x5e, 0xff, 0x47,
+			0x4f, 0x2c, 0x81, 0x7c, 0xa5, 0x1e, 0x3a, 0x31,
+			0xce, 0xea, 0x2b, 0x5a, 0x42, 0x06, 0x0b, 0x3c,
+			0xc1, 0x12, 0x0e, 0x14, 0xcc, 0xc7, 0x45, 0xe5,
+			0x44, 0x96, 0x41, 0x23, 0x1e, 0x31, 0xa1, 0xd3,
+			0xfc, 0x54, 0x47, 0x3a, 0xa6, 0xbe, 0x7b, 0x00,
+			0x23, 0x28, 0x32, 0x7d, 0x76, 0xfb, 0x98, 0xad,
+			0xbc, 0x96, 0x57, 0xdf, 0xfe, 0x28, 0xdd, 0x16,
+			0x95, 0xd2, 0x8f, 0x1f, 0x74, 0x02, 0x05, 0xd2,
+			0x9f, 0x83, 0xf0, 0xf4, 0xc1, 0xd6, 0x31, 0x3d,
+			0x03, 0xe6, 0xec, 0xc7, 0x53, 0xba, 0x21, 0x18,
+			0x88, 0x61, 0x00, 0x98, 0x74, 0x25, 0xde, 0x75,
+			0xc1, 0xd9, 0xf7, 0x36, 0xa2, 0xbd, 0x1d, 0xe3,
+			0xe2, 0x0b, 0xb1, 0xf6, 0xeb, 0xea, 0x03, 0x5c,
+			0xfd, 0x98, 0x97, 0xdd, 0x7e, 0x9f, 0xcf, 0x8f,
+			0x76, 0x37, 0xc1, 0x1f, 0xbd, 0x69, 0x77, 0x9c,
+			0xd9, 0xa9, 0xc6, 0xf1, 0x25, 0xbe, 0x85, 0xde,
+			0x3c, 0x08, 0xda, 0x88, 0xeb, 0xcd, 0xcb, 0x91,
+			0xb1, 0x83, 0x79, 0xa8, 0x9b, 0x1f, 0xd8, 0x5d,
+			0x06, 0xee, 0x16, 0x63, 0xc4, 0x4c, 0xdb, 0xc3,
+			0x9c, 0x49, 0x9e, 0xb8, 0x90, 0x4f, 0x0c, 0x59,
+			0x34, 0xe0, 0x6d, 0x8d, 0x91, 0x24, 0x9b, 0x7d,
+			0xa3, 0xa4, 0xb9, 0xa5, 0xc9, 0x77, 0x0b, 0x9c,
+			0x6e, 0xfa, 0x76, 0x43, 0x8b, 0x41, 0x88, 0x6d,
+			0x5e, 0x74, 0x64, 0x6c, 0xd8, 0x4e, 0xe0, 0x78,
+			0x9d, 0x52, 0x85, 0xd7, 0x8a, 0x90, 0xec, 0xe8,
+			0x55, 0x54, 0x8e, 0x99, 0xc0, 0xa3, 0xad, 0x31,
+			0x26, 0x9a, 0x29, 0x2a, 0xef, 0xf2, 0xac, 0x9e,
+			0x84, 0xd8, 0x9d, 0xcf, 0x9e, 0x36, 0xd0, 0x3d,
+			0xcd, 0x69, 0x1f, 0x49, 0x91, 0xc3, 0xea, 0xd5,
+			0xd4, 0xde, 0x70, 0x67, 0xe9, 0x92, 0x90, 0xd3,
+			0x41, 0x76, 0xc2, 0xf6, 0x78, 0xcf, 0x3d, 0x9c,
+			0xac, 0xdf, 0x47, 0xd3, 0x80, 0x4f, 0x03, 0xa4,
+			0x04, 0x70, 0x9a, 0xd8, 0x96, 0xc2, 0x28, 0xd9,
+			0x4b, 0xe4, 0xc6, 0x2b, 0x91, 0x1b, 0x96, 0xe8,
+			0x29, 0x87, 0xcc, 0x82, 0x2e, 0xbb, 0xb0, 0xd6,
+			0x3a, 0xc0, 0xa8, 0xbc, 0xf8, 0x28, 0x75, 0x1f,
+			0xf8, 0x99, 0x12, 0xb5, 0x85, 0xa0, 0x15, 0x6c,
+			0x89, 0x24, 0x97, 0xec, 0x8d, 0x4f, 0xcc, 0x95,
+			0x8a, 0x81, 0x9c, 0xb8, 0x3d, 0x15, 0x16, 0x7b,
+			0x3c, 0x30, 0x9a, 0xba, 0x00, 0xfa, 0x37, 0x8c,
+			0x6c, 0x89, 0x07, 0x6c, 0x68, 0x67, 0xea, 0x7e,
+			0xa3, 0x66, 0x82, 0x96, 0x92, 0x63, 0x92, 0x3a,
+			0x50, 0xc7, 0xe2, 0xb0, 0xd5, 0x76, 0xda, 0xa3,
+			0xa0, 0xa3, 0x28, 0x35, 0x68, 0x11, 0xe9, 0xcb,
+			0xdd, 0xa2, 0xbe, 0x56, 0x83, 0xa1, 0x90, 0x17,
+			0x6d, 0x16, 0x0f, 0x67, 0xfa, 0xd8, 0xef, 0x69,
+			0x97, 0xdc, 0xbd, 0xaa, 0x66, 0xcd, 0x8e, 0x4b,
+			0x8d, 0x5e, 0x7c, 0xb2, 0x13, 0x22, 0x09, 0xce,
+			0x93, 0x7e, 0x01, 0xa1, 0x2b, 0x0c, 0x94, 0x68,
+			0x1e, 0xa4, 0x64, 0x8f, 0x8f, 0x75, 0x9b, 0xa6,
+			0x0f, 0x6e, 0x52, 0x09, 0x3b, 0x56, 0x97, 0x25,
+			0x2c, 0x94, 0x0c, 0xc2, 0xdb, 0x37, 0x0e, 0x9b,
+			0xac, 0x57, 0x49, 0x36, 0xd5, 0x13, 0x18, 0xd9,
+			0xf4, 0x76, 0xf6, 0x2b, 0xaf, 0x07, 0xd0, 0x0d,
+			0x94, 0xc9, 0xf9, 0x0c, 0xd5, 0x7f, 0x76, 0xe1,
+			0x88, 0xc6, 0xce, 0xdb, 0x98, 0x2b, 0x18, 0xa8,
+			0x42, 0x8f, 0x74, 0x9e, 0x51, 0x00, 0xf8, 0x06,
+			0x06, 0x2d, 0xcc, 0x89, 0xb4, 0xec, 0x53, 0xba,
+			0xee, 0x4b, 0x42, 0x8d, 0x6f, 0x7c, 0xca, 0x35,
+			0xb9, 0x53, 0xc0, 0x65, 0xb0, 0x86, 0x97, 0xbd,
+			0xf6, 0x33, 0x54, 0x16, 0xfb, 0x92, 0x61, 0x60,
+			0xf0, 0xfd, 0x90, 0x13, 0xa6, 0xb8, 0x94, 0x35,
+			0x6a, 0xd7, 0x0b, 0xe4, 0x37, 0x1e, 0x12, 0x44,
+			0x1b, 0xb3, 0xda, 0x65, 0x08, 0x1c, 0x22, 0x3a,
+			0x0e, 0x72, 0x7e, 0xec, 0x57, 0x4d, 0x8d, 0x1f,
+			0x7d, 0xb8, 0xf8, 0x37, 0x67, 0x93, 0xc2, 0x9a,
+			0xac, 0x17, 0xd3, 0xfe, 0x10, 0x7c, 0xe9, 0xcb,
+			0x3e, 0x79, 0xba, 0x0e, 0x61, 0xe7, 0x6b, 0xb2,
+			0x97, 0x6f, 0xe1, 0x37, 0x8c, 0x45, 0x50, 0xd7,
+			0x0f, 0x26, 0x5c, 0xee, 0xa4, 0xf3, 0x90, 0xe2,
+			0x72, 0xf6, 0x4b, 0x5e, 0x6c, 0x44, 0x90, 0x2b,
+			0xbd, 0x7e, 0x25, 0xaf, 0xfc, 0xc4, 0xe7, 0xb4,
+			0x25, 0xac, 0x68, 0x01, 0x72, 0x38, 0x31, 0xfe,
+			0x02, 0x29, 0xaf, 0x90, 0x68, 0x2f, 0xbf, 0xe8,
+			0xc4, 0x81, 0x77, 0xc2, 0xe0, 0xd3, 0xe9, 0x5b,
+			0xb8, 0x21, 0xbf, 0xb2, 0xe5, 0x4f, 0x14, 0xcd,
+			0x93, 0xee, 0x0e, 0x8a, 0x24, 0x9e, 0x95, 0x01,
+			0x5b, 0x76, 0xc7, 0x9f, 0x04, 0xdb, 0x6e, 0x00,
+			0xbe, 0x5a, 0xe0, 0x77, 0xde, 0xa5, 0xe4, 0x16,
+			0xec, 0xbb, 0xc7, 0xd7, 0xd2, 0xd4, 0x65, 0xc2,
+			0xc1, 0xa3, 0x36, 0x7e, 0x8a, 0x40, 0xb8, 0x7f,
+			0xb3, 0x5c, 0x17, 0x2e, 0xcd, 0xeb, 0xf8, 0x8b,
+			0x0c, 0x01, 0xf8, 0x3d, 0x33, 0x6b, 0x81, 0x9e,
+			0x19, 0x89, 0x22, 0x41, 0x88, 0x32, 0x1a, 0xa7,
+			0x14, 0xbc, 0x4a, 0x45, 0xca, 0x06, 0x9c, 0xe4,
+			0x72, 0x64, 0x74, 0xcc, 0x29, 0xeb, 0x06, 0x1e,
+			0xe2, 0x74, 0x82, 0xd5, 0xc6, 0x3c, 0x11, 0xe1,
+			0xa6, 0x91, 0x78, 0xe4, 0xef, 0xd1, 0xd3, 0xc0,
+			0xbf, 0xdc, 0x08, 0xa8, 0xdb, 0x45, 0xb6, 0x8e,
+			0x32, 0x69, 0x37, 0xbc, 0x26, 0xdf, 0xb0, 0x57,
+			0xa5, 0x11, 0xa7, 0x06, 0x5b, 0x4c, 0xe0, 0xda,
+			0x62, 0x8b, 0xe0, 0x29, 0x16, 0x4e, 0x69, 0x80,
+			0xe5, 0x40, 0x15, 0xb6, 0xda, 0xcd, 0xf4, 0xcc,
+			0x40, 0xd5, 0x8d, 0x4d, 0x18, 0x33, 0x67, 0xd9,
+			0xf8, 0xc5, 0x5d, 0x7a, 0xae, 0xb1, 0xe3, 0xa4,
+			0x3d, 0x46, 0x7d, 0x53, 0xf1, 0xb9, 0x3b, 0x0e,
+			0xa2, 0xa8, 0x89, 0x14, 0x82, 0x3f, 0x3a, 0x8d,
+			0xda, 0x95, 0xfd, 0x96, 0x5b, 0x4a, 0xa5, 0xab,
+			0x48, 0xa9, 0x27, 0x19, 0xb6, 0x67, 0xdd, 0xcd,
+			0x04, 0xb1, 0x88, 0xb6, 0x41, 0xba, 0x85, 0xa2,
+			0x8e, 0x30, 0x4c, 0x71, 0x07, 0xf6, 0x72, 0x58,
+			0x4c, 0x7f, 0x98, 0xfa, 0xd7, 0x02, 0xb8, 0xe8,
+			0x10, 0xaf, 0xca, 0xc4, 0xc7, 0x77, 0x50, 0x70,
+			0xf3, 0xc6, 0x76, 0xae, 0xc3, 0xc1, 0xa4, 0x67,
+			0xd2, 0xef, 0xd4, 0x99, 0xc5, 0xf5, 0x0a, 0x99,
+			0x1b, 0x01, 0xd6, 0xa2, 0xb9, 0xb4, 0x82, 0x33,
+			0x97, 0x00, 0x68, 0xf9, 0x66, 0xa5, 0x83, 0xd9,
+			0x57, 0x1f, 0x1a, 0xdd, 0xc3, 0x00, 0x32, 0xd4,
+			0x2c, 0xbe, 0x85, 0x5d, 0xbf, 0x37, 0xef, 0x7b,
+			0xe1, 0x44, 0x27, 0xa3, 0xa2, 0x67, 0x86, 0xed,
+			0x17, 0x2a, 0xc1, 0x06, 0x9a, 0x99, 0x97, 0xfb,
+			0x12, 0x6f, 0xe0, 0x62, 0x70, 0xe5, 0x7c, 0x8c,
+			0xc8, 0x1d, 0x30, 0x94, 0xbc, 0x94, 0xef, 0x19,
+			0x6b, 0x07, 0xb4, 0x6a, 0xe3, 0x24, 0x56, 0x0b,
+			0x6f, 0xbb, 0x4f, 0x8f, 0xb8, 0x22, 0x9e, 0xaf,
+			0xef, 0x0d, 0x3c, 0x40, 0x31, 0xfa, 0xc2, 0x60,
+			0xfa, 0x9e, 0xea, 0xef, 0x61, 0x88, 0x4c, 0x0c,
+			0xba, 0xcb, 0xa8, 0x90, 0x6d, 0xd5, 0xef, 0x95,
+			0xaa, 0x4d, 0x85, 0x64, 0x1a, 0x64, 0xac, 0x91,
+			0x58, 0x08, 0xee, 0x37, 0xce, 0x3c, 0x4a, 0xe7,
+			0x25, 0x54, 0x57, 0xa5, 0x59, 0xab, 0xdf, 0x24,
+			0x9f, 0x89, 0x15, 0x1d, 0x9c, 0xce, 0x7b, 0xe7,
+			0xb6, 0xc9, 0xc7, 0x4b, 0xfc, 0x5c, 0x25, 0xa2,
+			0xba, 0x2e, 0x3e, 0x19, 0x82, 0x20, 0x57, 0x52,
+			0xa0, 0x3f, 0x93, 0xce, 0x20, 0x85, 0xf0, 0x4e,
+			0x0d, 0x4b, 0x53, 0xb7, 0x6b, 0x66, 0x1a, 0xae,
+			0x45, 0x47, 0xdf, 0xbc, 0x39, 0x83, 0x8a, 0xe4,
+			0xdb, 0x97, 0x72, 0xcb, 0x83, 0xbf, 0x8e, 0x47,
+			0x55, 0xbf, 0x1a, 0x5b, 0x66, 0xe4, 0x76, 0xc7,
+			0xb4, 0xf1, 0xc6, 0x3e, 0x84, 0x5d, 0x74, 0x6d,
+			0x7b, 0xab, 0x80, 0x89, 0xda, 0x8d, 0x4a, 0x1e,
+			0x5c, 0x31, 0xc2, 0x26, 0xce, 0x69, 0x29, 0xc3,
+			0x87, 0xe1, 0x3b, 0x1c, 0x42, 0xff, 0xef, 0x8c,
+			0x4d, 0x5c, 0x52, 0xac, 0x6e, 0x60, 0x49, 0xb6,
+			0xe1, 0x09, 0x12, 0xa7, 0xd0, 0x19, 0x0c, 0x5d,
+			0x8b, 0xf2, 0xfe, 0x3b, 0x40, 0xf2, 0xaa, 0x4b,
+			0x71, 0xc0, 0xf4, 0xe3, 0x7e, 0x83, 0xf9, 0xfb,
+			0x00, 0x23, 0x33, 0x84, 0x0c, 0x88, 0x52, 0x30,
+			0x3b, 0x29, 0x6d, 0x95, 0x86, 0xf5, 0x67, 0xfe,
+			0x84, 0x26, 0x56, 0x57, 0x50, 0x7f, 0x1a, 0x8b,
+			0x53, 0xfa, 0xf6, 0x64, 0xa2, 0x57, 0xc2, 0x69,
+			0xa2, 0x18, 0xd1, 0xc1, 0xab, 0xfc, 0xb9, 0x8e,
+			0x21, 0x20, 0x0b, 0x4d, 0xff, 0xf7, 0x28, 0x0b,
+			0xf8, 0xd5, 0x7d, 0xe7, 0xbf, 0x15, 0x0e, 0x58,
+			0x2b, 0xdd, 0xe0, 0xec, 0x9f, 0x25, 0x02, 0xf7,
+			0x43, 0x69, 0x66, 0x79, 0x0b, 0x89, 0xcb, 0x72,
+			0x03, 0x48, 0xdf, 0xe2, 0xcc, 0x93, 0x47, 0x5f,
+			0x61, 0x34, 0x41, 0xcb, 0x23, 0x88, 0xca, 0xcb,
+			0xc3, 0x72, 0xe3, 0x28, 0xdf, 0x73, 0x63, 0x06,
+			0x1c, 0x82, 0x7d, 0x5b, 0x8b, 0x63, 0x09, 0x11,
+			0x03, 0x59, 0xc6, 0xac, 0x18, 0x8a, 0xa1, 0x66,
+			0x2d, 0x26, 0xd9, 0x95, 0x3f, 0x7d, 0x82, 0x59,
+			0xdf, 0x36, 0xb5, 0x8d, 0x5e, 0x59, 0xec, 0x9a,
+			0xee, 0x25, 0x8d, 0x3e, 0x3c, 0x62, 0x6f, 0xc8,
+			0x0a, 0x19, 0x4c, 0xa7, 0x1b, 0xf8, 0xcd, 0x08,
+			0x7e, 0xf1, 0xf2, 0xf1, 0x76, 0x15, 0x4c, 0xf8,
+			0x1e, 0xb6, 0x58, 0xac, 0xe7, 0x86, 0xd2, 0xac,
+			0x36, 0x38, 0xb0, 0x60, 0x08, 0x8a, 0x4a, 0x42,
+			0xcc, 0xf8, 0x03, 0x0a, 0xf6, 0xa9, 0xa9, 0x38,
+			0x63, 0xb9, 0x68, 0x69, 0xd3, 0x21, 0x6c, 0x19,
+			0x00, 0x93, 0x46, 0xd5, 0x6e, 0x4b, 0x5c, 0x69,
+			0xa9, 0x74, 0xf3, 0xb8, 0xec, 0x14, 0x29, 0x8c,
+			0x25, 0x2d, 0xf2, 0x2f, 0x2a, 0x1c, 0xcc, 0x57,
+			0x76, 0x74, 0x8e, 0x6a, 0xcf, 0x93, 0x62, 0x93,
+			0x24, 0x03, 0x24, 0x09, 0xa3, 0xa5, 0x1a, 0x95,
+			0x99, 0xe5, 0x52, 0x82, 0x1d, 0x22, 0x65, 0x30,
+			0x47, 0x27, 0x0e, 0xf9, 0xe4, 0xce, 0xb8, 0xad,
+			0x34, 0x61, 0x21, 0x77, 0xf5, 0x17, 0xcb, 0x70,
+			0xa9, 0x72, 0x22, 0x49, 0x16, 0x4c, 0xb4, 0x35,
+			0x76, 0x97, 0x99, 0x66, 0xff, 0x2e, 0x81, 0x46,
+			0xbe, 0x56, 0xad, 0x70, 0xf2, 0x9a, 0x44, 0xe8,
+			0x3a, 0x2d, 0x6c, 0xbb, 0x89, 0x28, 0x76, 0x49,
+			0x25, 0xf6, 0x49, 0x8b, 0x67, 0xe7, 0xb4, 0xed,
+			0x28, 0x21, 0x0c, 0xb0, 0xe9, 0x23, 0xc6, 0xd1,
+			0x29, 0x5c, 0xe4, 0xc4, 0x97, 0xc6, 0x04, 0xc3,
+			0xd8, 0x6c, 0xb6, 0x73, 0x13, 0x20, 0x0c, 0x98,
+			0xde, 0x28, 0xe0, 0x74, 0x75, 0x58, 0xff, 0x67,
+			0xe8, 0x6d, 0x03, 0x41, 0xb4, 0xe3, 0xda, 0xe4,
+			0xc7, 0x54, 0x66, 0x8c, 0x02, 0x8c, 0x10, 0xbe,
+			0x6c, 0xac, 0x92, 0xe9, 0x73, 0x57, 0x89, 0xc6,
+			0x8d, 0xa0, 0x61, 0xe3, 0x5c, 0x30, 0x92, 0xa8,
+			0xc3, 0xf7, 0xb3, 0xf2, 0x86, 0xd3, 0xae, 0x5d,
+			0x91, 0xba, 0x06, 0x51, 0x54, 0xd9, 0x83, 0xf5,
+			0xd9, 0x9b, 0xd9, 0x8b, 0x73, 0xbf, 0x9a, 0x94,
+			0x45, 0x39, 0xc4, 0x3a, 0x35, 0xea, 0xf9, 0x25,
+			0x7d, 0x6a, 0xee, 0x78, 0xa7, 0x50, 0x50, 0x1d,
+			0x7e, 0xaf, 0x09, 0xf1, 0x86, 0xae, 0x93, 0x69,
+			0xd5, 0x41, 0x1e, 0x87, 0xc3, 0x41, 0xb8, 0xc5,
+			0x4f, 0x2d, 0x90, 0x4f, 0xa8, 0xe6, 0xbc, 0xc6,
+			0xbf, 0x59, 0x32, 0x97, 0xc7, 0x30, 0x2d, 0xea,
+			0xdd, 0x25, 0x5a, 0x1e, 0x38, 0x93, 0x58, 0x12,
+			0x2f, 0x98, 0x31, 0x30, 0xa8, 0xfa, 0x35, 0x61,
+			0x11, 0x63, 0x4c, 0xf8, 0x72, 0x3f, 0xaf, 0xd5,
+			0xa7, 0xf3, 0x92, 0x35, 0xb5, 0x17, 0x15, 0x3d,
+			0x78, 0x4a, 0x47, 0xf7, 0xfa, 0xa2, 0xff, 0x36,
+			0x61, 0x5b, 0x18, 0x77, 0xf0, 0xd5, 0x76, 0xee,
+			0x2b, 0x8a, 0x18, 0xe3, 0x54, 0xb3, 0x1f, 0x29,
+			0x0e, 0xa7, 0x3d, 0x75, 0x5b, 0x2b, 0x68, 0x13,
+			0x89, 0xb3, 0xc7, 0x42, 0x13, 0x3d, 0x72, 0x6c,
+			0xb5, 0xc9, 0x0b, 0xea, 0xbe, 0xc2, 0x0e, 0x44,
+			0xcd, 0x22, 0x63, 0x01, 0xd0, 0x1c, 0x93, 0x82,
+			0x3f, 0x7b, 0xa9, 0x72, 0xd5, 0x90, 0xe6, 0xac,
+			0x9c, 0x3d, 0x56, 0x3a, 0x8d, 0x0e, 0xd6, 0x8e,
+			0x8e, 0x52, 0xd0, 0x81, 0x15, 0xca, 0xf2, 0x09,
+			0xc0, 0xfe, 0x94, 0x1d, 0x22, 0x55, 0x11, 0xb5,
+			0x2c, 0x48, 0x22, 0xa2, 0x60, 0xf2, 0xc2, 0xa2,
+			0x0b, 0x0c, 0x4b, 0xac, 0xbf, 0x40, 0x6e, 0xfd,
+			0x97, 0x10, 0xcb, 0x04, 0x3b, 0xc4, 0x5f, 0x7c,
+			0x6c, 0xf2, 0xb5, 0x48, 0xb8, 0xfa, 0x5f, 0x32,
+			0xe4, 0xef, 0xc9, 0xad, 0x2d, 0xb5, 0xac, 0xc5,
+			0xee, 0xf7, 0xb2, 0x81, 0xa7, 0xe9, 0x9c, 0xf9,
+			0xc9, 0xd1, 0x14, 0xc0, 0xa9, 0x1e, 0xd8, 0x50,
+			0x44, 0x8a, 0x02, 0xf2, 0xad, 0x6d, 0xe4, 0xa1,
+			0x7e, 0x88, 0xd3, 0x2d, 0xad, 0x75, 0x17, 0x35,
+			0xe6, 0x8a, 0xf5, 0xd7, 0x35, 0x1a, 0xb4, 0x13,
+			0x36, 0x8a, 0x0f, 0xa3, 0x99, 0x57, 0x7f, 0x85,
+			0x99, 0x6c, 0xae, 0xc5, 0xe7, 0x85, 0xff, 0xb5,
+			0xb0, 0xad, 0x87, 0x03, 0x41, 0x11, 0xc5, 0x16,
+			0x2d, 0x95, 0x1d, 0x26, 0xaf, 0x43, 0xa6, 0x76,
+			0xae, 0x17, 0xca, 0x10, 0x65, 0x64, 0xc6, 0x43,
+			0x4a, 0x2c, 0x7b, 0x55, 0xde, 0x3d, 0x93, 0xc5,
+			0x46, 0x17, 0xc1, 0xc2, 0xd7, 0xcb, 0xec, 0xc7,
+			0x8e, 0xce, 0x0c, 0x65, 0x27, 0x0d, 0x0e, 0xaf,
+			0x76, 0x65, 0xea, 0xcd, 0xe9, 0x39, 0xe3, 0xd4,
+			0xbc, 0x6f, 0xc3, 0x87, 0xca, 0x9c, 0x4c, 0xc9,
+			0xbb, 0x38, 0xa8, 0xc7, 0xea, 0xc0, 0xcf, 0x9b,
+			0x33, 0xfd, 0xfe, 0x50, 0x1b, 0x86, 0xeb, 0x1f,
+			0x75, 0xb0, 0x61, 0xd9, 0xb4, 0xfc, 0xb2, 0x5a,
+			0x2f, 0xcb, 0x11, 0xd0, 0x2a, 0xa2, 0x7b, 0x4b,
+			0x65, 0x0c, 0x2f, 0x43, 0xea, 0xe2, 0x4d, 0xd4,
+			0x11, 0xf9, 0x94, 0x24, 0xbd, 0x89, 0x1a, 0xb9,
+			0x86, 0x81, 0xca, 0x39, 0x66, 0xc3, 0xdb, 0x7a,
+			0x72, 0xd8, 0xe2, 0x5e, 0x80, 0xf9, 0x19, 0x0b,
+			0x7c, 0xb3, 0xfe, 0xeb, 0x81, 0x93, 0x7e, 0x54,
+			0xd1, 0xdd, 0x0d, 0x74, 0x43, 0x8b, 0x0d, 0x11,
+			0xd4, 0xe8, 0x32, 0xf1, 0xf4, 0x02, 0xcc, 0xac,
+			0x2f, 0x1e, 0xd7, 0x68, 0xf1, 0x30, 0xbd, 0xe2,
+			0x58, 0xf4, 0x97, 0xe5, 0x0f, 0xb6, 0x38, 0xd1,
+			0xa3, 0x49, 0x4b, 0x0e, 0x4e, 0x88, 0x3f, 0x2b,
+			0x0e, 0xb6, 0x96, 0xc9, 0x14, 0xb5, 0x8d, 0xd3,
+			0xc8, 0xaa, 0xe0, 0x2c, 0x11, 0x83, 0x09, 0x9b,
+			0xfe, 0x91, 0x5f, 0xfc, 0xc5, 0x01, 0x36, 0x20,
+			0x44, 0x89, 0x5d, 0x2a, 0x40, 0x62, 0xd3, 0x0d,
+			0x2a, 0x2d, 0x05, 0xca, 0xce, 0xf1, 0x25, 0x79,
+			0x5d, 0x8b, 0xe8, 0x54, 0x97, 0x9a, 0x2a, 0x7d,
+			0x0d, 0x38, 0x2e, 0x37, 0xf1, 0xf8, 0xe9, 0xf3,
+			0x11, 0xe9, 0x94, 0x31, 0x2a, 0x7b, 0x9f, 0xa7,
+			0xfe, 0x9b, 0x3f, 0x04, 0xf0, 0x22, 0xec, 0xc7,
+			0x6c, 0x6e, 0x6f, 0x1f, 0x8b, 0xb7, 0xd0, 0xdc,
+			0xec, 0xe5, 0xbd, 0xe0, 0x3e, 0x18, 0x20, 0x2a,
+			0x55, 0xe7, 0xf4, 0xcb, 0xaf, 0x48, 0x39, 0x36,
+			0x4d, 0xa2, 0xac, 0x41, 0x32, 0x12, 0x7b, 0x29,
+			0xdc, 0x28, 0x3d, 0x05, 0xa7, 0x32, 0xbe, 0x67,
+			0x03, 0x26, 0x4f, 0x5a, 0x3f, 0x4b, 0xf4, 0xf4,
+			0x17, 0x67, 0xb9, 0x21, 0x18, 0x36, 0xf7, 0x63,
+			0xa7, 0x7e, 0x4f, 0x5f, 0x43, 0x83, 0x6f, 0x70,
+			0x01, 0xec, 0x0c, 0x15, 0x28, 0x14, 0x49, 0xc3,
+			0xf8, 0xa1, 0xa0, 0xed, 0x04, 0x59, 0x22, 0xbd,
+			0xdc, 0x8b, 0xe2, 0x7e, 0x43, 0xf3, 0x46, 0x7b,
+			0x5c, 0xa7, 0x91, 0xf7, 0xb0, 0xd4, 0x6d, 0x81,
+			0x23, 0x46, 0xdc, 0x3a, 0x23, 0x99, 0x3f, 0x02,
+			0xce, 0x4f, 0x9a, 0xfc, 0x50, 0x6d, 0x2c, 0x80,
+			0xf0, 0xc6, 0x5e, 0x60, 0x48, 0x7b, 0x40, 0x0b,
+			0xca, 0x1e, 0xef, 0x36, 0xf0, 0xfa, 0x5d, 0xcd,
+			0x83, 0x8d, 0x53, 0xb8, 0xa8, 0x6c, 0x5f, 0x68,
+			0xcc, 0xb7, 0x77, 0x05, 0xaa, 0x02, 0xec, 0x32,
+			0x8b, 0xe9, 0xb5, 0xdf, 0xd1, 0xab, 0x03, 0x90,
+			0xec, 0x5d, 0x0c, 0xea, 0xf5, 0xa4, 0xc7, 0x48,
+			0xbf, 0x54, 0xc0, 0xb6, 0xaf, 0x3a, 0x3c, 0xe9,
+			0xcb, 0x87, 0xde, 0x75, 0xf2, 0xbb, 0x12, 0x6c,
+			0xdf, 0x62, 0x36, 0xca, 0x27, 0x6c, 0x6e, 0xfd,
+			0x8e, 0xad, 0xf0, 0x38, 0x22, 0x61, 0xbf, 0xbd,
+			0x14, 0x4d, 0x17, 0xf1, 0xb6, 0x16, 0x12, 0xce,
+			0x43, 0x3b, 0xc8, 0x35, 0x7b, 0x09, 0x7d, 0x3f,
+			0x8e, 0xdd, 0xdd, 0x89, 0x0d, 0x55, 0xec, 0xad,
+			0x79, 0x50, 0xfb, 0x08, 0x53, 0x9d, 0x08, 0x2d,
+			0xb3, 0x4b, 0xd7, 0x2a, 0xbf, 0xb5, 0xa2, 0xa4,
+			0x6f, 0x9c, 0x04, 0x41, 0xe3, 0xe4, 0xaf, 0xc3,
+			0xec, 0xcf, 0xa0, 0xc0, 0x06, 0xc2, 0x3e, 0x24,
+			0x95, 0x37, 0x11, 0xaf, 0x98, 0xa7, 0x98, 0x22,
+			0x68, 0x00, 0xe7, 0x66, 0xf4, 0xf2, 0x56, 0x6b,
+			0x6b, 0x6b, 0x6c, 0x7c, 0x58, 0x00, 0xa4, 0x69,
+			0xe3, 0xd5, 0x65, 0x88, 0x04, 0xc6, 0xd6, 0x10,
+			0xb3, 0x6e, 0xdf, 0x16, 0xb3, 0x5f, 0x40, 0x38,
+			0xf3, 0x68, 0x61, 0xd8, 0x97, 0x4b, 0x0f, 0x6a,
+			0xc0, 0x47, 0x4f, 0xeb, 0xd3, 0xda, 0x16, 0xdf,
+			0xf5, 0x4e, 0xc1, 0x0e, 0xcf, 0x27, 0xf2, 0x3d,
+			0x35, 0xfc, 0x70, 0xfd, 0x52, 0xb8, 0x56, 0xcf,
+			0x8b, 0x14, 0x30, 0x17, 0x2e, 0x1e, 0x65, 0x0e,
+			0xc9, 0x3d, 0x52, 0xcf, 0xef, 0x4b, 0x94, 0xa0,
+			0x80, 0x3e, 0x7e, 0x55, 0xaf, 0x06, 0x8a, 0x13,
+			0xef, 0x34, 0x11, 0x95, 0xf8, 0x6f, 0x6b, 0xde,
+			0xc6, 0x75, 0x17, 0x10, 0x5e, 0x73, 0x14, 0x14,
+			0x7b, 0xad, 0xa0, 0xe6, 0x52, 0xce, 0xfd, 0xf1,
+			0x20, 0x42, 0x22, 0x98, 0x00, 0x5c, 0x5a, 0xa1,
+			0x47, 0x5e, 0xa3, 0x59, 0x16, 0x43, 0x45, 0x8d,
+			0xa5, 0x3b, 0x25, 0x65, 0xdc, 0xeb, 0xb7, 0xbf,
+			0x03, 0x77, 0xf7, 0xca, 0x7f, 0x6e, 0xd0, 0x8c,
+			0xf5, 0xf9, 0x8e, 0x87, 0x71, 0x9d, 0x82, 0xc5,
+			0x5e, 0x97, 0x12, 0x3d, 0x6e, 0x95, 0xca, 0xe2,
+			0xdf, 0x87, 0xa3, 0x05, 0x7f, 0x72, 0x88, 0xc2,
+			0xbd, 0xfa, 0x44, 0xde, 0x86, 0x67, 0xed, 0xbf,
+			0x53, 0x98, 0xd5, 0xb6, 0x01, 0xc1, 0x75, 0x58,
+			0x6f, 0x16, 0x0d, 0x78, 0x8f, 0x8d, 0x95, 0x95,
+			0x44, 0x46, 0x6d, 0x93, 0xfb, 0xfa, 0x59, 0xd6,
+			0x9d, 0x9b, 0x02, 0x1e, 0xf7, 0xdb, 0xfd, 0x0f,
+			0x48, 0xa5, 0xaa, 0x76, 0xc3, 0xfd, 0xd3, 0x4d,
+			0x0f, 0x70, 0x2e, 0x01, 0x1a, 0x55, 0xe8, 0x25,
+			0xed, 0x73, 0xe8, 0x44, 0xee, 0x32, 0x1f, 0xfc,
+			0x7e, 0xd5, 0xc4, 0x17, 0x42, 0x59, 0x34, 0xac,
+			0x44, 0x68, 0x4b, 0x64, 0x6e, 0xc2, 0xec, 0x5a,
+			0x16, 0x11, 0xe8, 0xc0, 0x06, 0x03, 0xcf, 0xc9,
+			0x90, 0xe9, 0x6e, 0xae, 0xe7, 0x62, 0x5c, 0x08,
+			0x39, 0x59, 0xf8, 0xc3, 0x83, 0xa1, 0xde, 0xcd,
+			0xc9, 0x65, 0x83, 0x1c, 0x80, 0x3e, 0x98, 0x05,
+			0xe1, 0x0f, 0x4e, 0x0f, 0xf8, 0x62, 0x51, 0x42,
+			0x01, 0xd0, 0x86, 0x17, 0xc2, 0x44, 0xef, 0x01,
+			0xfd, 0xe5, 0x6c, 0x6a, 0x04, 0xd1, 0x2d, 0x38,
+			0x49, 0xf0, 0xe3, 0xd6, 0x2e, 0x0b, 0xe0, 0xe4,
+			0xd9, 0x1b, 0xb3, 0xc6, 0x6a, 0x3e, 0x2d, 0x7c,
+			0xc2, 0x86, 0x20, 0x46, 0x1d, 0xef, 0x14, 0xe9,
+			0xea, 0x8e, 0x9c, 0x45, 0xd0, 0x3f, 0x80, 0x0b,
+			0x24, 0x5f, 0x1c, 0xa4, 0x3b, 0xdb, 0xbf, 0xa2,
+			0x6c, 0xeb, 0x7f, 0x3c, 0x5d, 0x23, 0x08, 0x6c,
+			0x21, 0xc5, 0xba, 0xc0, 0x98, 0xd2, 0x46, 0x5a,
+			0x32, 0x52, 0x58, 0x3f, 0x23, 0xfd, 0xeb, 0x89,
+			0x3e, 0x12, 0x9a, 0xa6, 0x8e, 0x17, 0x01, 0xa1,
+			0x0f, 0x26, 0x1a, 0x4a, 0x16, 0x0e, 0x29, 0x55,
+			0xb3, 0xb6, 0x85, 0xd9, 0x38, 0x42, 0x70, 0x8d,
+			0x0a, 0xd5, 0x9e, 0x3c, 0xf7, 0x1d, 0x40, 0x45,
+			0x39, 0x6c, 0x4c, 0x78, 0xc4, 0xe7, 0x7c, 0x1c,
+			0x35, 0x0a, 0x1f, 0xc7, 0x2a, 0x5a, 0x7b, 0x37,
+			0xf6, 0xa2, 0x97, 0x1f, 0x93, 0xa2, 0x9f, 0x8e,
+			0xf4, 0xd2, 0xd3, 0x94, 0x9e, 0x33, 0xa4, 0xf8,
+			0x79, 0x79, 0xab, 0xd0, 0x03, 0x16, 0x6b, 0xd8,
+			0x06, 0xac, 0x0c, 0x20, 0x28, 0xff, 0x98, 0xa1,
+			0xa1, 0x9b, 0x0f, 0x73, 0x31, 0xdd, 0x32, 0xee,
+			0x0d, 0x4a, 0x73, 0x4e, 0xf9, 0x35, 0x3d, 0x5b,
+			0x9e, 0xbe, 0xde, 0xe3, 0xed, 0x20, 0x2d, 0x53,
+			0x83, 0x86, 0xd6, 0xde, 0x17, 0x60, 0x62, 0x65,
+			0x76, 0x8e, 0xa9, 0xaa, 0xb6, 0xcf, 0xde, 0xe3,
+			0xec, 0xfd, 0x43, 0x5a, 0x97, 0xa2, 0xcc, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+			0x05, 0x0d, 0x14, 0x22, 0x27, },
+	}, {
+		.what = "pure rejection vector",
+		.algo = "ml-dsa65",
+		.pk_len = DILITHIUM65_PUBLICKEYBYTES,
+		.pk = (const u8[DILITHIUM65_PUBLICKEYBYTES]){
+			0x25, 0x5b, 0x8f, 0x59, 0xb9, 0x03, 0xe7, 0x6d,
+			0x1b, 0x3d, 0xa3, 0x94, 0xea, 0x35, 0x79, 0x55,
+			0x3f, 0xed, 0x5c, 0xfc, 0x93, 0x5d, 0x95, 0x30,
+			0x2c, 0x68, 0xee, 0xc5, 0x24, 0x7e, 0xec, 0xb9,
+			0x70, 0xf5, 0xd9, 0x76, 0xbb, 0x65, 0x90, 0xef,
+			0xcf, 0xf1, 0xb4, 0x69, 0xae, 0xf0, 0xcd, 0xbd,
+			0xf0, 0x2f, 0x69, 0xda, 0xec, 0xf7, 0x6a, 0x36,
+			0xba, 0x86, 0xf6, 0x22, 0xa5, 0x9d, 0x49, 0x02,
+			0xc2, 0x34, 0xd5, 0xdc, 0x0f, 0xa2, 0x44, 0x0d,
+			0x37, 0x21, 0x29, 0xa5, 0x88, 0xd9, 0x19, 0xdd,
+			0x2f, 0x6e, 0x39, 0x37, 0xe5, 0x53, 0x03, 0x22,
+			0xc4, 0xde, 0xd6, 0xe9, 0xa8, 0x36, 0x28, 0xa2,
+			0x13, 0x9f, 0x76, 0x8f, 0x2d, 0xc2, 0xe7, 0x3f,
+			0x3a, 0x48, 0x07, 0x17, 0x4d, 0x39, 0xfd, 0x7b,
+			0xa4, 0x85, 0x55, 0x6a, 0x0c, 0xfd, 0xcb, 0x3e,
+			0xab, 0x95, 0x1a, 0x7d, 0xda, 0xf9, 0x75, 0xc9,
+			0x43, 0x86, 0xba, 0xf8, 0xae, 0xae, 0xee, 0x27,
+			0x1e, 0x08, 0x0e, 0x8d, 0x55, 0xaa, 0xc6, 0x96,
+			0xe3, 0xa2, 0x40, 0x7b, 0x8f, 0xe3, 0x59, 0x46,
+			0xa9, 0x3a, 0x38, 0xa6, 0x01, 0x8f, 0xae, 0xdb,
+			0xa3, 0x3b, 0x09, 0xb2, 0x6b, 0x05, 0x18, 0x13,
+			0xf5, 0xd8, 0xca, 0x51, 0x2b, 0xb5, 0x28, 0x36,
+			0xe2, 0xa6, 0x53, 0x52, 0x41, 0x47, 0xd7, 0x4a,
+			0xa1, 0x1a, 0x1d, 0x91, 0x8b, 0x61, 0x86, 0x7e,
+			0x22, 0x76, 0xcb, 0x30, 0x6c, 0x67, 0xb3, 0x8e,
+			0x2e, 0xaf, 0x93, 0xe2, 0x3b, 0x0a, 0xd4, 0x22,
+			0xc7, 0xa5, 0xbc, 0x4c, 0xec, 0xd3, 0x38, 0x86,
+			0x22, 0x78, 0xdf, 0xa1, 0xa7, 0x2b, 0x80, 0xfa,
+			0x43, 0xd5, 0x47, 0xb9, 0x6a, 0xaf, 0xc6, 0x7e,
+			0x9a, 0x2d, 0xb8, 0x17, 0x58, 0x2f, 0xfd, 0x77,
+			0x37, 0x18, 0xf3, 0x9f, 0x84, 0xca, 0x6e, 0x00,
+			0x4b, 0xba, 0xa5, 0xe7, 0x0f, 0x87, 0x86, 0x31,
+			0xe9, 0xd1, 0x41, 0x53, 0x28, 0x8f, 0x2f, 0x46,
+			0x96, 0x0b, 0x6d, 0x3e, 0x6d, 0x20, 0x4c, 0xb0,
+			0x43, 0x74, 0x44, 0xdd, 0xe9, 0x33, 0x94, 0x1c,
+			0x3b, 0x69, 0x49, 0x15, 0x36, 0xbd, 0x6c, 0xb7,
+			0x0d, 0xb5, 0xf5, 0xfb, 0x23, 0x19, 0x0e, 0x6a,
+			0x45, 0x65, 0x1c, 0xa7, 0x66, 0x48, 0xb5, 0xa2,
+			0x52, 0x91, 0x43, 0x7b, 0x20, 0x21, 0x5e, 0x16,
+			0xc2, 0xba, 0x78, 0xfa, 0xd3, 0x88, 0xb8, 0x64,
+			0x08, 0x17, 0x89, 0x9c, 0x4f, 0xfa, 0xb9, 0xfe,
+			0x3e, 0x39, 0x6a, 0x28, 0xd2, 0x28, 0x95, 0xab,
+			0x54, 0xde, 0xfb, 0x76, 0x32, 0x96, 0xb3, 0xbb,
+			0x9f, 0xef, 0x0b, 0x6b, 0xe8, 0xd7, 0x17, 0x4d,
+			0x5e, 0x9b, 0x25, 0x3f, 0x3e, 0x6a, 0x93, 0xa1,
+			0xe9, 0x09, 0xc2, 0x34, 0x8e, 0x2f, 0xe9, 0x19,
+			0x69, 0xc2, 0xcb, 0x5c, 0x29, 0x8d, 0x4d, 0x81,
+			0x01, 0xff, 0xde, 0x02, 0x7d, 0xeb, 0xc2, 0x6e,
+			0x15, 0x78, 0xe8, 0x10, 0x0a, 0x1a, 0x91, 0x96,
+			0x56, 0x24, 0x35, 0x74, 0x3d, 0x02, 0x50, 0x13,
+			0xd8, 0x1b, 0x94, 0xcd, 0xc8, 0x60, 0xc8, 0x6f,
+			0x28, 0x77, 0x3b, 0x76, 0x86, 0xa0, 0x39, 0xaa,
+			0x3a, 0x3e, 0x15, 0x47, 0xa0, 0x3b, 0xc3, 0xec,
+			0xe2, 0x15, 0x84, 0xba, 0xdf, 0x1d, 0x42, 0x5b,
+			0xcd, 0x97, 0x51, 0x92, 0x15, 0x64, 0xd7, 0x5c,
+			0xe2, 0xe2, 0x60, 0xe9, 0xbe, 0xdc, 0x1c, 0x12,
+			0x62, 0x15, 0x6b, 0xe6, 0xf1, 0x23, 0xb8, 0x81,
+			0x87, 0x15, 0xf4, 0x9a, 0x35, 0xd7, 0x18, 0x64,
+			0x92, 0xc4, 0xec, 0xcf, 0x5c, 0xd4, 0xf7, 0x6a,
+			0xf9, 0xe6, 0x7e, 0x71, 0x3d, 0x3e, 0xd0, 0x17,
+			0x72, 0x28, 0xd3, 0x22, 0x97, 0x14, 0x5d, 0x90,
+			0xca, 0x0b, 0x4f, 0x2c, 0x18, 0xc0, 0x45, 0x39,
+			0x87, 0x4f, 0xd9, 0x74, 0xef, 0x9f, 0xc7, 0xc7,
+			0x59, 0x04, 0x62, 0x31, 0xcc, 0x37, 0x78, 0x76,
+			0xdd, 0xc6, 0x9b, 0xff, 0xf7, 0x77, 0x87, 0x6a,
+			0xfb, 0x7b, 0xb0, 0xdf, 0x64, 0x75, 0xdb, 0xee,
+			0x2b, 0x45, 0x45, 0x45, 0x5b, 0xed, 0x89, 0xd9,
+			0xfe, 0x71, 0xc6, 0xd5, 0xc7, 0x75, 0xe7, 0x2f,
+			0x4e, 0x5b, 0xa2, 0xcf, 0x07, 0xbe, 0x4b, 0x5e,
+			0x3a, 0x76, 0x9b, 0x59, 0x8f, 0x1e, 0xac, 0x21,
+			0xf8, 0x90, 0x57, 0x3e, 0x25, 0x4b, 0x8c, 0x9d,
+			0x4f, 0xe8, 0x14, 0xfd, 0xcb, 0xaa, 0x86, 0x6a,
+			0x0c, 0x5c, 0x20, 0xa1, 0x03, 0xe4, 0x69, 0x84,
+			0xb1, 0x38, 0x16, 0x92, 0xd8, 0xd3, 0x68, 0x7e,
+			0x8e, 0x85, 0x25, 0x83, 0x38, 0x3a, 0xe2, 0x3d,
+			0x76, 0x31, 0xbf, 0x4d, 0x74, 0xc0, 0xa6, 0xa2,
+			0xeb, 0xaa, 0x8e, 0x70, 0xa6, 0x6f, 0x67, 0xd4,
+			0xb4, 0x81, 0xd6, 0xbc, 0xe6, 0xda, 0xa2, 0xd1,
+			0x93, 0xc6, 0xf6, 0x54, 0x05, 0x4c, 0x51, 0x1e,
+			0x97, 0xc9, 0x82, 0x9f, 0x45, 0x6d, 0x67, 0x17,
+			0xc0, 0x6c, 0xb0, 0x7a, 0x83, 0xeb, 0xdc, 0xb0,
+			0xf0, 0x09, 0x4f, 0xed, 0xbc, 0xe0, 0xf8, 0x26,
+			0xf4, 0xe3, 0x2a, 0xdb, 0xef, 0xcc, 0xf1, 0x3f,
+			0x71, 0xc1, 0x07, 0x3f, 0x19, 0x8a, 0xe5, 0xb3,
+			0x33, 0x7c, 0x7a, 0xa4, 0x89, 0x57, 0x46, 0x17,
+			0x5d, 0x2c, 0x91, 0xc3, 0xac, 0x34, 0x49, 0x14,
+			0x73, 0x7c, 0x01, 0x32, 0xf2, 0x20, 0x11, 0x18,
+			0x95, 0xc2, 0x36, 0x63, 0x61, 0xd6, 0xba, 0x65,
+			0x62, 0x9a, 0xcc, 0xed, 0x03, 0x8a, 0xd0, 0x88,
+			0xb2, 0x3e, 0xdc, 0x82, 0xd0, 0x29, 0xd2, 0xd3,
+			0xcb, 0x5b, 0x96, 0xa1, 0x34, 0xde, 0xd2, 0x64,
+			0xc7, 0x40, 0xcb, 0x1f, 0xd6, 0x63, 0xe8, 0x52,
+			0xd7, 0xbd, 0x42, 0xdc, 0x0d, 0x1c, 0x98, 0xa5,
+			0x03, 0x73, 0x96, 0xae, 0x1c, 0xa4, 0x7c, 0x45,
+			0x4b, 0x03, 0x7f, 0xe3, 0x10, 0xe0, 0xa4, 0x10,
+			0x9f, 0x2d, 0x3b, 0x1f, 0x75, 0x00, 0x90, 0xf0,
+			0x4a, 0x49, 0x68, 0xbf, 0xa5, 0xf2, 0x79, 0xa4,
+			0xaf, 0x08, 0xb0, 0xbf, 0xed, 0x0c, 0x5e, 0xf2,
+			0x6c, 0xfb, 0xcf, 0x7d, 0xcd, 0xbf, 0xf2, 0x8d,
+			0x51, 0x32, 0xd2, 0x18, 0xfb, 0xfb, 0x8c, 0xf4,
+			0x6e, 0x99, 0x43, 0x46, 0x51, 0x0f, 0x0b, 0x99,
+			0xd4, 0x9f, 0x01, 0xf3, 0x14, 0xb5, 0xdc, 0xad,
+			0x41, 0x6f, 0x23, 0x90, 0x44, 0xab, 0x30, 0x97,
+			0xf7, 0x43, 0xd2, 0x7c, 0x60, 0xbc, 0x5b, 0x9b,
+			0x8a, 0x28, 0x59, 0x34, 0xd3, 0x3e, 0xb9, 0x68,
+			0x7e, 0x9a, 0x2e, 0xe0, 0x5f, 0x5b, 0x3c, 0xe5,
+			0x91, 0x02, 0xe1, 0xdd, 0x29, 0x62, 0x1e, 0x14,
+			0x2c, 0x01, 0xe5, 0x4f, 0x18, 0x04, 0x9e, 0x0f,
+			0xb0, 0x60, 0x7a, 0x70, 0x1c, 0x8c, 0x45, 0xa1,
+			0x1b, 0xb7, 0x42, 0x6b, 0xb6, 0x79, 0xb6, 0x1a,
+			0x26, 0x6f, 0xdb, 0x7e, 0xd6, 0xfa, 0xbe, 0x18,
+			0xf1, 0xd1, 0x81, 0xab, 0x8d, 0x92, 0x3d, 0x65,
+			0x30, 0x48, 0x7a, 0x5b, 0x95, 0x2f, 0x98, 0xe3,
+			0x75, 0x29, 0x26, 0xd0, 0x9d, 0x6f, 0x45, 0x28,
+			0x93, 0x1c, 0xbd, 0x8c, 0x5c, 0x8d, 0x52, 0xac,
+			0xc3, 0xaa, 0x48, 0x85, 0xfc, 0x08, 0x15, 0x7e,
+			0x98, 0xfb, 0xce, 0x40, 0x33, 0x16, 0xfa, 0xca,
+			0x63, 0xfb, 0x21, 0xcf, 0x6c, 0xab, 0x7f, 0xf8,
+			0xb3, 0x57, 0xab, 0x84, 0x23, 0x0b, 0x4c, 0x90,
+			0x2b, 0x29, 0xe3, 0xa3, 0x9b, 0x04, 0x54, 0xda,
+			0xd2, 0x34, 0x11, 0xdd, 0xf3, 0x31, 0x68, 0x17,
+			0xd0, 0x5a, 0xc5, 0xe4, 0xf6, 0x70, 0xeb, 0xfa,
+			0xc9, 0xd3, 0xa6, 0x6e, 0x26, 0x41, 0x2c, 0x9b,
+			0x21, 0xbd, 0x83, 0xd6, 0x71, 0xf1, 0x1b, 0x6d,
+			0x3b, 0xe9, 0x39, 0xac, 0x8b, 0xbd, 0x2f, 0xb4,
+			0xe3, 0xc9, 0xfb, 0xe1, 0x71, 0xd2, 0xee, 0x7b,
+			0x4e, 0x40, 0xde, 0xde, 0xaf, 0x9f, 0xff, 0xfe,
+			0x37, 0xd8, 0x5f, 0xbc, 0x6c, 0xc6, 0xc5, 0x21,
+			0xd6, 0x05, 0xc9, 0x23, 0x55, 0xb3, 0x33, 0xe1,
+			0x06, 0xf6, 0xff, 0xa9, 0x8d, 0x04, 0xec, 0x6f,
+			0xb2, 0x64, 0x01, 0x09, 0x40, 0xaf, 0x83, 0xc4,
+			0xd5, 0x73, 0xbd, 0xb8, 0xe1, 0xe7, 0xb9, 0x5e,
+			0x3c, 0x57, 0x1f, 0xa2, 0xe6, 0xb0, 0x79, 0x49,
+			0x14, 0x49, 0x69, 0xcf, 0x6e, 0x77, 0x05, 0xeb,
+			0xf8, 0x4c, 0x92, 0xf3, 0xda, 0x08, 0xf8, 0xdb,
+			0x44, 0x48, 0x73, 0xbf, 0xf0, 0xa9, 0x88, 0x49,
+			0x07, 0x8f, 0x3a, 0x6b, 0x13, 0x2c, 0xd2, 0x24,
+			0xc1, 0x6a, 0x1f, 0x25, 0x70, 0x7d, 0x29, 0xc5,
+			0x32, 0x84, 0x4a, 0xc4, 0xe6, 0x9c, 0x46, 0xa8,
+			0x99, 0x3b, 0x2d, 0x80, 0x5f, 0x20, 0xaa, 0x3c,
+			0x60, 0x52, 0x7f, 0x67, 0x9e, 0x87, 0xb9, 0x7b,
+			0x57, 0xa5, 0x97, 0xbb, 0x70, 0x29, 0x9f, 0x5c,
+			0xd5, 0x76, 0xd2, 0x99, 0xab, 0x9e, 0xb9, 0xbd,
+			0x67, 0x8a, 0xda, 0x91, 0x9e, 0xea, 0xdf, 0x64,
+			0x09, 0x08, 0x4d, 0xad, 0xb7, 0x8f, 0x5a, 0x15,
+			0x27, 0xaf, 0xc2, 0xf7, 0xeb, 0xf4, 0x39, 0x42,
+			0xdc, 0xe5, 0x6a, 0x5e, 0xcc, 0xe6, 0x77, 0x4e,
+			0x0b, 0x20, 0x48, 0x1d, 0x65, 0x4d, 0xd1, 0xe1,
+			0x01, 0x85, 0x52, 0x32, 0x7d, 0x51, 0x2f, 0x0e,
+			0x00, 0xe3, 0x40, 0x70, 0x26, 0x46, 0xa6, 0xbf,
+			0xc8, 0x85, 0x0d, 0xac, 0x9f, 0x8d, 0x79, 0x9c,
+			0x6f, 0x58, 0x96, 0xe9, 0xe5, 0xb2, 0xff, 0x4a,
+			0xde, 0x91, 0x0b, 0x3d, 0x85, 0x69, 0xa7, 0xa8,
+			0x1a, 0xa8, 0x21, 0x3e, 0x8d, 0xf8, 0xba, 0x5a,
+			0xc6, 0xd7, 0x3a, 0xcb, 0x04, 0x0e, 0xdf, 0x36,
+			0xeb, 0xbc, 0xca, 0x59, 0x24, 0x48, 0xe7, 0xec,
+			0x14, 0x7c, 0x7d, 0xb7, 0x26, 0x98, 0x1a, 0x85,
+			0xc1, 0x6c, 0x90, 0x9f, 0x4b, 0x90, 0x7c, 0x6d,
+			0xa6, 0xba, 0x58, 0xb9, 0xa3, 0x7f, 0x7f, 0x88,
+			0xce, 0xb4, 0x40, 0x73, 0xa7, 0x72, 0x3a, 0xbc,
+			0xea, 0x99, 0xef, 0x04, 0xbd, 0x08, 0xc5, 0x0d,
+			0x6e, 0x68, 0x2f, 0x33, 0x05, 0x5b, 0xeb, 0x6a,
+			0xeb, 0x80, 0x30, 0xf0, 0x7d, 0xad, 0x7b, 0x80,
+			0x7c, 0xb9, 0x13, 0x0c, 0x08, 0x74, 0x5b, 0x7c,
+			0xec, 0x8a, 0xdb, 0xe8, 0xe0, 0xea, 0x70, 0xa4,
+			0x9e, 0x88, 0x06, 0xd4, 0xde, 0x8e, 0xb8, 0x93,
+			0xa3, 0x89, 0x2c, 0xe5, 0x07, 0xbb, 0x81, 0x88,
+			0x7f, 0x9e, 0x1d, 0xb2, 0x8e, 0x8d, 0x59, 0xae,
+			0xe4, 0xcf, 0x2d, 0x2f, 0xdf, 0x52, 0xad, 0x7c,
+			0xe8, 0x73, 0x0f, 0xee, 0xcc, 0xa0, 0x67, 0x88,
+			0x61, 0xc0, 0xcc, 0x06, 0xe0, 0x48, 0xee, 0x93,
+			0xf6, 0x56, 0xbe, 0x8a, 0x23, 0x1b, 0x86, 0x7c,
+			0x9a, 0xaa, 0x57, 0x83, 0x03, 0x6c, 0x5c, 0x08,
+			0xb2, 0xea, 0x1b, 0x98, 0xa5, 0x4d, 0xb3, 0x6b,
+			0x27, 0x52, 0xff, 0xbd, 0xb7, 0x53, 0x14, 0x8d,
+			0xd1, 0x06, 0xfc, 0xdc, 0x08, 0x59, 0x7b, 0x74,
+			0xbf, 0xb4, 0x39, 0x8b, 0x4a, 0x00, 0xdf, 0xe6,
+			0x88, 0x00, 0x36, 0x4d, 0xb0, 0x1a, 0x40, 0x13,
+			0x45, 0xe8, 0x38, 0x40, 0x49, 0x0c, 0x7a, 0x57,
+			0xca, 0x35, 0x66, 0xcf, 0xc7, 0xbe, 0x43, 0x4b,
+			0xe9, 0x35, 0x49, 0xfc, 0x08, 0x04, 0xac, 0x00,
+			0x39, 0x1f, 0x45, 0xd7, 0x87, 0x1f, 0x57, 0xec,
+			0xd4, 0x0b, 0xaa, 0x70, 0x90, 0xdd, 0x90, 0xd2,
+			0x65, 0xc4, 0xc0, 0x78, 0x96, 0xed, 0x81, 0xb1,
+			0x33, 0xea, 0xe5, 0x28, 0xa4, 0x96, 0x14, 0xe3,
+			0x55, 0x41, 0xc5, 0xbe, 0xef, 0xb3, 0x15, 0xcb,
+			0xec, 0xf5, 0xd5, 0x9c, 0x30, 0x96, 0x90, 0x51,
+			0x47, 0x71, 0x34, 0xce, 0x0b, 0xb1, 0x3f, 0xdd,
+			0x0f, 0x8f, 0xa8, 0xe1, 0xea, 0x64, 0x03, 0xdf,
+			0x04, 0xed, 0x32, 0xd6, 0xdd, 0x0b, 0xf1, 0xeb,
+			0x92, 0x7e, 0x12, 0xba, 0x15, 0x6f, 0x66, 0xe3,
+			0x5f, 0xa8, 0xb7, 0x29, 0x0b, 0x23, 0x1b, 0x8f,
+			0x44, 0x75, 0x92, 0xd6, 0xb3, 0x02, 0x1f, 0xe0,
+			0xb9, 0x98, 0xf9, 0xfa, 0xe5, 0x98, 0xb4, 0xae,
+			0xa8, 0x17, 0xbd, 0xbe, 0xb1, 0x52, 0x87, 0x5c,
+			0x3a, 0x20, 0x39, 0x1b, 0x8d, 0xc4, 0x9d, 0x7e,
+			0x05, 0x18, 0xf5, 0x3d, 0xda, 0x47, 0x0d, 0xd2,
+			0xfd, 0xcd, 0x00, 0x83, 0x6e, 0xdc, 0x00, 0x81,
+			0x9b, 0x8e, 0x85, 0x3f, 0x95, 0xb3, 0x6b, 0x5a,
+			0x2b, 0x21, 0xbf, 0xb5, 0xcf, 0xc7, 0x4d, 0xa4,
+			0x74, 0x84, 0xab, 0xc2, 0xbb, 0xa3, 0x61, 0x7f,
+			0xe4, 0x70, 0x68, 0x83, 0x2a, 0x9f, 0x67, 0x33,
+			0xe8, 0x2e, 0x5c, 0xef, 0xc3, 0x28, 0x5d, 0xd1,
+			0xf3, 0x15, 0x1d, 0x2d, 0x85, 0xd7, 0xeb, 0x47,
+			0xf3, 0x25, 0x76, 0x7a, 0xd5, 0xb7, 0x6c, 0xab,
+			0x09, 0xd1, 0xad, 0xe5, 0xe3, 0xcc, 0x78, 0xe7,
+			0x91, 0xd1, 0x60, 0x26, 0xce, 0xf4, 0x9f, 0xc9,
+			0x93, 0x30, 0x5e, 0x59, 0xef, 0x83, 0x29, 0xa3,
+			0x6e, 0x61, 0x10, 0x35, 0x18, 0x22, 0xd0, 0xec,
+			0x73, 0x71, 0xbd, 0xbd, 0x86, 0xd5, 0xbd, 0xc6,
+			0x46, 0x73, 0x19, 0x5c, 0x73, 0xa9, 0x7c, 0xde,
+			0x09, 0xe2, 0xeb, 0x23, 0x67, 0x55, 0xfa, 0xc1,
+			0x87, 0xcd, 0x77, 0xf8, 0x83, 0xdd, 0xca, 0xbc,
+			0x15, 0xa4, 0x5c, 0x0c, 0x9d, 0x71, 0x1a, 0xea,
+			0x65, 0x65, 0x9c, 0xef, 0xd8, 0x99, 0x4b, 0xe4,
+			0xea, 0x8d, 0xca, 0x70, 0x62, 0x33, 0x65, 0x13,
+			0xed, 0xbe, 0x9b, 0x3a, 0x23, 0x10, 0x58, 0x65,
+			0x6b, 0x6d, 0x0d, 0x3c, 0x7b, 0x54, 0xf5, 0x63,
+			0x2b, 0xb9, 0xd7, 0xac, 0x5f, 0x43, 0x05, 0x53,
+			0xe4, 0x6c, 0xff, 0xb0, 0x20, 0xab, 0xff, 0xf1,
+			0x24, 0x94, 0x87, 0xab, 0x8a, 0xec, 0x86, 0xfe,
+			0x2c, 0x4f, 0xd2, 0x89, 0x0e, 0xe0, 0x76, 0xe9,
+			0x73, 0x64, 0xda, 0x2d, 0xcd, 0x33, 0xe1, 0xa6,
+			0x9e, 0xd0, 0xc3, 0x90, 0xfd, 0x22, 0x55, 0x73,
+			0x3b, 0xd6, 0xd3, 0x29, 0xc5, 0x84, 0xb3, 0x84,
+			0xfb, 0x60, 0x98, 0x1d, 0x65, 0x2a, 0x9d, 0x1e,
+			0xf7, 0x5a, 0x67, 0x25, 0x5d, 0xe6, 0x02, 0x17,
+			0x8c, 0x7e, 0x64, 0x17, 0x44, 0xef, 0x19, 0xbe,
+			0xda, 0xd9, 0x83, 0x94, 0x2b, 0x4c, 0xa3, 0x3c,
+			0xfa, 0x00, 0x6f, 0xef, 0x98, 0xdf, 0x0d, 0x13,
+			0x08, 0x7a, 0xeb, 0x2d, 0xa7, 0x6d, 0x0d, 0x4f,
+			0x17, 0x2e, 0x08, 0x59, 0xa2, 0x96, 0x13, 0xa2,
+			0x5d, 0x97, 0xc3, 0x62, 0xc6, 0xd0, 0x31, 0x28,
+			0x86, 0x75, 0x08, 0x0f, 0x77, 0x36, 0xba, 0xea,
+			0x8c, 0x34, 0x83, 0xa2, 0x35, 0x7b, 0xda, 0x1b,
+			0x70, 0xe7, 0xc0, 0xdb, 0x03, 0x07, 0x97, 0x91,
+			0xa9, 0x68, 0x93, 0x89, 0x8d, 0x54, 0x6f, 0x19,
+			0xf9, 0xe0, 0xe7, 0x19, 0xef, 0x4a, 0xda, 0x80,
+			0x5a, 0x64, 0x11, 0x33, 0xdd, 0x59, 0x37, 0x7d,
+			0x81, 0xf6, 0x76, 0xbe, 0x9e, 0x3a, 0x49, 0x4e,
+			0xc4, 0xb6, 0xc5, 0x25, 0x74, 0x5e, 0x1e, 0x8c,
+			0x9b, 0xf8, 0x8f, 0x58, 0xfc, 0xb3, 0x6b, 0x4e,
+			0xea, 0xc4, 0x26, 0xea, 0xd9, 0xbf, 0xe1, 0x4a,
+			0xaf, 0x50, 0x91, 0x4f, 0xae, 0xd9, 0x29, 0x67,
+			},
+		.msg_len = 64,
+		.msg = (const u8[64]){
+			0x86, 0x8d, 0xae, 0x88, 0x78, 0x21, 0xba, 0x42,
+			0xe2, 0xb1, 0x14, 0xf5, 0x44, 0xea, 0x64, 0x75,
+			0xe7, 0xca, 0xdd, 0xf1, 0x57, 0xd3, 0x8a, 0x45,
+			0xed, 0x97, 0x20, 0x55, 0xd3, 0xd3, 0xfa, 0x9c,
+			0x5b, 0x79, 0x0b, 0xb4, 0x50, 0x53, 0x77, 0xd1,
+			0xb4, 0xaa, 0x20, 0xf3, 0xd1, 0xf0, 0x4e, 0x20,
+			0xb4, 0x4b, 0x5f, 0xa8, 0xd6, 0xbc, 0xdc, 0x06,
+			0xb6, 0xcc, 0xfe, 0x00, 0x7f, 0xa0, 0x76, 0x7b,
+			},
+		.sig_len = DILITHIUM65_CRYPTO_BYTES,
+		.sig = (const u8[DILITHIUM65_CRYPTO_BYTES]){
+			0x9a, 0x88, 0x40, 0x11, 0x8c, 0xf3, 0x42, 0xf0,
+			0xa5, 0xd6, 0xcb, 0x40, 0xf7, 0x2a, 0xab, 0xac,
+			0x0c, 0x61, 0x19, 0x89, 0x07, 0x56, 0x10, 0x75,
+			0xed, 0xed, 0x7b, 0xef, 0xf1, 0xeb, 0x5c, 0x9c,
+			0x51, 0x5b, 0x2d, 0x03, 0x6a, 0xc7, 0x90, 0xaa,
+			0x71, 0x70, 0x16, 0xfd, 0x63, 0xbc, 0x37, 0x05,
+			0x83, 0x30, 0x63, 0xf2, 0xf8, 0x70, 0x53, 0x1c,
+			0x27, 0xc6, 0x8f, 0x49, 0x47, 0x31, 0xa1, 0xc9,
+			0x3b, 0x7e, 0x84, 0x96, 0xb7, 0x96, 0x13, 0x80,
+			0xab, 0xd1, 0x35, 0x27, 0x27, 0x1c, 0xbf, 0x9b,
+			0xef, 0x0c, 0x90, 0xb6, 0x49, 0xb6, 0x7c, 0x84,
+			0xe1, 0xf3, 0xad, 0x7c, 0xab, 0x16, 0xe9, 0x8a,
+			0xea, 0xed, 0xbc, 0x0d, 0x59, 0x72, 0x5a, 0xf6,
+			0x77, 0xdc, 0x75, 0x24, 0xf8, 0x3d, 0xb0, 0x74,
+			0xad, 0x58, 0x3b, 0xaf, 0xd3, 0xa5, 0x09, 0xa5,
+			0x9e, 0xc8, 0xf1, 0xef, 0x6d, 0x52, 0x02, 0xb1,
+			0x1f, 0x5d, 0xb2, 0x42, 0xfc, 0x92, 0xe6, 0xdb,
+			0x24, 0x4d, 0xc8, 0xa5, 0x05, 0x3d, 0xb5, 0x3a,
+			0x4f, 0xab, 0xed, 0xc7, 0xd9, 0x0c, 0x48, 0x3f,
+			0x36, 0xcd, 0x2a, 0x71, 0xbd, 0x28, 0x86, 0xbc,
+			0x1c, 0x42, 0x13, 0xab, 0xf9, 0xa3, 0xfb, 0x36,
+			0xd7, 0xd7, 0xf4, 0x11, 0xaa, 0xb4, 0x7e, 0xe6,
+			0x5d, 0x62, 0x16, 0x91, 0x79, 0x3b, 0x92, 0xde,
+			0x87, 0x41, 0x54, 0x94, 0xb2, 0x4b, 0x0e, 0x72,
+			0xdf, 0x35, 0xd1, 0x05, 0x4e, 0xad, 0xcd, 0xaa,
+			0x9f, 0x90, 0x42, 0x55, 0xf0, 0x33, 0x1e, 0x89,
+			0x36, 0x96, 0x6a, 0x3c, 0x37, 0xed, 0x35, 0x1f,
+			0x8e, 0x30, 0xbb, 0xdb, 0xae, 0xf5, 0x04, 0x5d,
+			0x0f, 0x9b, 0x93, 0xc1, 0x40, 0x58, 0x86, 0x3b,
+			0xe9, 0xe7, 0x14, 0x29, 0x67, 0xdc, 0x3f, 0x86,
+			0xec, 0x9c, 0x23, 0x38, 0x2c, 0x62, 0xd3, 0x69,
+			0xf1, 0xec, 0xac, 0x8b, 0x32, 0xa5, 0x33, 0x77,
+			0x9b, 0x2e, 0xc7, 0xcc, 0x55, 0x48, 0x20, 0x25,
+			0x39, 0x6c, 0x80, 0x2e, 0x87, 0x5f, 0xc5, 0x17,
+			0x28, 0x78, 0x4e, 0xb0, 0xd5, 0x9c, 0x5f, 0x1a,
+			0x82, 0xe0, 0x6f, 0xa3, 0x8a, 0x87, 0x78, 0x57,
+			0x4b, 0x35, 0xc0, 0x4f, 0x15, 0x24, 0x2a, 0x57,
+			0xaa, 0x1c, 0xd0, 0xe6, 0xe7, 0xed, 0x8f, 0x9e,
+			0xca, 0xe2, 0x8c, 0x11, 0x8c, 0x07, 0xf5, 0x6c,
+			0x83, 0xd0, 0x17, 0x3c, 0xb4, 0x0e, 0xe9, 0xae,
+			0xdb, 0xa2, 0xc8, 0x8a, 0xce, 0x76, 0x81, 0x94,
+			0x2f, 0x40, 0x29, 0xdf, 0x7c, 0x6d, 0xac, 0x8a,
+			0x52, 0xc1, 0xd1, 0xde, 0x30, 0x9b, 0x47, 0xff,
+			0x50, 0xa1, 0x1e, 0x44, 0x5b, 0xc3, 0xce, 0xc4,
+			0x96, 0xbd, 0xe7, 0x15, 0xac, 0xd3, 0x06, 0x8e,
+			0xcd, 0x51, 0x0e, 0x9a, 0xc0, 0xc6, 0xc6, 0xcb,
+			0xc3, 0x35, 0xd0, 0xb1, 0x06, 0xaf, 0x6a, 0x75,
+			0xab, 0xc0, 0xa1, 0x0f, 0xb9, 0xb6, 0xbd, 0x47,
+			0x85, 0x33, 0x80, 0x9f, 0xa2, 0xf4, 0xff, 0x25,
+			0xd1, 0x8e, 0x2f, 0x68, 0x87, 0x50, 0x98, 0xea,
+			0x0d, 0x9f, 0x81, 0x7d, 0xd1, 0xa8, 0xd6, 0x7b,
+			0x4f, 0x18, 0x34, 0xd0, 0xe0, 0xe8, 0x18, 0x39,
+			0x01, 0xbe, 0xaa, 0x94, 0xeb, 0xe3, 0x6d, 0xa4,
+			0x22, 0xc4, 0x92, 0x97, 0x51, 0xb5, 0x65, 0xe2,
+			0x3a, 0x39, 0x1c, 0x80, 0x3c, 0x3f, 0x18, 0x4c,
+			0x4f, 0xda, 0xd8, 0xa5, 0x77, 0xda, 0xc2, 0xe6,
+			0xe8, 0x5f, 0xa5, 0x1c, 0xb4, 0x9c, 0x8c, 0x96,
+			0x78, 0xdf, 0xed, 0xb5, 0xb0, 0x06, 0x69, 0x7a,
+			0x23, 0xd5, 0x1a, 0xdd, 0xce, 0x2e, 0x61, 0x15,
+			0x28, 0x09, 0xd2, 0x5c, 0xb0, 0xef, 0x2b, 0x41,
+			0x89, 0x6b, 0x83, 0x69, 0xdb, 0x23, 0xcd, 0x18,
+			0xa2, 0x77, 0x40, 0x67, 0xa4, 0x7d, 0xf2, 0x55,
+			0xcf, 0x1d, 0xaa, 0x89, 0x08, 0x38, 0xfa, 0x42,
+			0x69, 0x28, 0x3f, 0x05, 0xe2, 0x5e, 0xaa, 0x2f,
+			0x46, 0x83, 0x4a, 0x12, 0x89, 0x8e, 0x0d, 0x33,
+			0x40, 0x88, 0x5a, 0x4f, 0x2d, 0x5d, 0xdf, 0xbc,
+			0x23, 0xc3, 0x82, 0xff, 0x2b, 0xa4, 0xa4, 0xe4,
+			0x16, 0x8a, 0xb2, 0xf0, 0x68, 0x9b, 0x34, 0x95,
+			0x2b, 0x5b, 0xb1, 0x42, 0x06, 0xb8, 0x33, 0x93,
+			0x36, 0x5b, 0xf7, 0x7c, 0x30, 0xab, 0xb1, 0x8b,
+			0x52, 0xe8, 0x8d, 0x9b, 0xcf, 0x4a, 0x1e, 0x95,
+			0x9d, 0x8c, 0x40, 0x54, 0x5b, 0x57, 0x1b, 0xcc,
+			0xca, 0xcf, 0xfb, 0x44, 0x6e, 0xfa, 0x45, 0x13,
+			0xc8, 0xd0, 0x0f, 0xe3, 0x89, 0xd8, 0x43, 0x30,
+			0xd2, 0x2a, 0x79, 0x33, 0x34, 0xbc, 0xd2, 0xd1,
+			0x6a, 0xc3, 0x66, 0xb1, 0x4c, 0xdc, 0xc7, 0x64,
+			0x84, 0xf9, 0x05, 0x61, 0x43, 0x64, 0xf5, 0xd0,
+			0x8a, 0x32, 0x30, 0xec, 0x90, 0xb2, 0xf9, 0xd7,
+			0x53, 0x62, 0x8b, 0x71, 0xbf, 0xd6, 0xa2, 0xf6,
+			0x59, 0x60, 0xc6, 0x67, 0x82, 0xef, 0x1d, 0x59,
+			0x0d, 0xa1, 0xa4, 0x7e, 0x9d, 0x6b, 0x95, 0x74,
+			0xf0, 0x3d, 0x3a, 0xe8, 0xc8, 0xf4, 0x83, 0xb0,
+			0xef, 0x3a, 0xb3, 0x56, 0x61, 0x7f, 0xa3, 0xe9,
+			0x2b, 0x17, 0x74, 0x4e, 0xeb, 0xbe, 0xb2, 0x7a,
+			0xca, 0xd3, 0xe4, 0x67, 0xa8, 0x62, 0x11, 0xf0,
+			0x31, 0x72, 0x87, 0x52, 0xeb, 0xfd, 0x32, 0xb5,
+			0xe1, 0xff, 0x84, 0xfb, 0x81, 0xf7, 0x78, 0xef,
+			0x0d, 0xbd, 0x03, 0xcf, 0xd6, 0xa0, 0x80, 0xb4,
+			0x04, 0x2b, 0x8a, 0xd7, 0x4f, 0x86, 0x60, 0x16,
+			0x9b, 0x41, 0xa0, 0x85, 0xce, 0xd5, 0xc9, 0x26,
+			0xd5, 0xf8, 0xa2, 0x67, 0x6b, 0xa5, 0xb5, 0x8d,
+			0x14, 0x61, 0xae, 0x42, 0xbc, 0x6a, 0xb0, 0x66,
+			0x07, 0x8a, 0xbb, 0xa9, 0xd2, 0xce, 0x48, 0x12,
+			0x5c, 0xe2, 0x60, 0x3d, 0x2f, 0xd0, 0x48, 0x3b,
+			0xe8, 0xf1, 0xc1, 0xd6, 0x11, 0x84, 0xef, 0x6b,
+			0xbe, 0x8a, 0x28, 0x56, 0xb5, 0xae, 0x7a, 0x41,
+			0xeb, 0x70, 0x2c, 0x46, 0x2f, 0x37, 0xe1, 0x9d,
+			0xe9, 0x3c, 0xa4, 0x9c, 0xd2, 0x71, 0xb4, 0x1a,
+			0xcf, 0xf0, 0xbe, 0x58, 0xe1, 0xf4, 0x14, 0xcd,
+			0xb1, 0x25, 0xfd, 0x54, 0x60, 0x40, 0xfe, 0xa2,
+			0xf8, 0xab, 0x09, 0xd0, 0xca, 0x45, 0x98, 0xe6,
+			0xff, 0x73, 0x9a, 0x6c, 0x3a, 0x5f, 0x3d, 0xef,
+			0xc6, 0x19, 0x0f, 0x2e, 0x7e, 0x7e, 0xa8, 0x44,
+			0xe4, 0x57, 0xd9, 0x7f, 0x3e, 0x44, 0x1d, 0x1b,
+			0x8f, 0xeb, 0x99, 0xb9, 0x1b, 0x00, 0xde, 0xcb,
+			0x98, 0xc9, 0x5c, 0xc5, 0x87, 0x0e, 0xdc, 0xaa,
+			0xb5, 0x67, 0x63, 0x08, 0x05, 0x7a, 0xab, 0xf2,
+			0x7a, 0x81, 0x8b, 0xb0, 0xd6, 0x3c, 0xa0, 0xd5,
+			0x6d, 0xc9, 0xa0, 0xf7, 0xa7, 0xdf, 0xa6, 0x6c,
+			0x83, 0x8f, 0xea, 0xb5, 0x1f, 0x21, 0x46, 0xb8,
+			0xf4, 0xd0, 0x8b, 0x79, 0x56, 0x2f, 0x3a, 0x45,
+			0x0d, 0x2f, 0xfb, 0xbd, 0x96, 0x23, 0xbd, 0xc7,
+			0x51, 0xf6, 0x4a, 0xb9, 0xe6, 0x40, 0x23, 0x66,
+			0x48, 0x0c, 0x61, 0x95, 0x07, 0x7b, 0x4b, 0x95,
+			0x12, 0x72, 0x82, 0x00, 0xb6, 0x52, 0xb9, 0x63,
+			0xf6, 0xf5, 0xb4, 0xdb, 0x06, 0xdd, 0x9a, 0x1a,
+			0xac, 0x96, 0xb9, 0x0c, 0xcc, 0x40, 0x3a, 0xc0,
+			0x94, 0x3d, 0x4c, 0xab, 0xcd, 0x83, 0xc7, 0x9f,
+			0x1c, 0x3d, 0x9a, 0x4e, 0x9e, 0xd5, 0x63, 0x79,
+			0xed, 0xd3, 0xe4, 0x02, 0xa6, 0x0d, 0xdb, 0x6a,
+			0x8b, 0xf5, 0x34, 0x71, 0x08, 0xb3, 0xc4, 0x4e,
+			0xa0, 0xaf, 0xd1, 0xcf, 0xb1, 0x57, 0x72, 0x8a,
+			0xf7, 0x1f, 0x76, 0x98, 0xe5, 0xfc, 0x44, 0x53,
+			0xd5, 0xa1, 0xb0, 0x79, 0x35, 0x69, 0x8a, 0x5e,
+			0x33, 0xd7, 0x04, 0x45, 0xc5, 0xe0, 0x16, 0x99,
+			0x6a, 0x85, 0x69, 0xec, 0xff, 0xb0, 0x7b, 0x32,
+			0x98, 0x26, 0xbb, 0xae, 0xae, 0xb6, 0xd4, 0xc6,
+			0x48, 0x10, 0x77, 0x42, 0x95, 0x4d, 0x08, 0x70,
+			0xdf, 0x78, 0x0c, 0x40, 0x3a, 0xd6, 0xc3, 0xf9,
+			0x4a, 0x17, 0xf5, 0xdd, 0x39, 0xec, 0xf3, 0x0c,
+			0x8c, 0x30, 0x6c, 0xd7, 0x4c, 0x54, 0x81, 0x22,
+			0x99, 0xb7, 0xf3, 0xc9, 0xae, 0x45, 0x99, 0x92,
+			0x87, 0xf5, 0x50, 0x04, 0xa5, 0x48, 0x76, 0xbb,
+			0xca, 0xf3, 0xe1, 0x5a, 0x93, 0xf4, 0x49, 0x54,
+			0xf1, 0x95, 0x06, 0xe6, 0xb0, 0x19, 0xf6, 0x08,
+			0x4d, 0x7b, 0x7d, 0x6f, 0xdc, 0x8f, 0x3a, 0x7d,
+			0xc0, 0x0e, 0xa4, 0xef, 0x36, 0x66, 0x9a, 0x9d,
+			0x75, 0xe8, 0x48, 0x08, 0xfa, 0x8a, 0x58, 0x51,
+			0xc0, 0x6f, 0x85, 0x23, 0x45, 0x7f, 0x75, 0xd6,
+			0xca, 0xc6, 0x18, 0x20, 0x46, 0x5e, 0x3f, 0x1a,
+			0x44, 0x0e, 0xf1, 0x77, 0x5f, 0xdd, 0xff, 0xa9,
+			0x90, 0x3f, 0x64, 0x14, 0xee, 0x5e, 0x6c, 0xf9,
+			0x04, 0x2b, 0xbc, 0xd5, 0xad, 0x80, 0x44, 0xc5,
+			0x64, 0x81, 0x9c, 0xbf, 0x4b, 0x84, 0x6b, 0xff,
+			0x42, 0x2a, 0xca, 0xdb, 0x77, 0x0c, 0xcb, 0x96,
+			0x1a, 0xa7, 0xfb, 0xa1, 0x25, 0x34, 0x25, 0x43,
+			0x9b, 0x0f, 0x08, 0x48, 0xc0, 0x9f, 0xe8, 0xb3,
+			0x1d, 0x49, 0x12, 0x12, 0xdd, 0xa1, 0xea, 0x67,
+			0xbf, 0x4b, 0x13, 0x6a, 0x48, 0xc2, 0x72, 0x3d,
+			0x25, 0xc9, 0x1e, 0x29, 0x0d, 0xf9, 0x9f, 0x1a,
+			0xfa, 0x2f, 0x17, 0x2e, 0x99, 0xc7, 0x2c, 0x88,
+			0xf1, 0x42, 0x80, 0x97, 0xfb, 0x9f, 0xd3, 0x50,
+			0xf9, 0xe9, 0x3f, 0xb4, 0x5a, 0xcb, 0xc8, 0x4d,
+			0xf8, 0x16, 0xd0, 0x50, 0x71, 0xbc, 0xc0, 0x00,
+			0xeb, 0xbf, 0x27, 0x20, 0x45, 0x40, 0x33, 0xb0,
+			0xdf, 0x8a, 0x56, 0xb0, 0x5a, 0xb8, 0x7c, 0xbe,
+			0x2c, 0xb2, 0xd4, 0xd6, 0x03, 0x98, 0x74, 0x7e,
+			0xac, 0xba, 0x46, 0x4b, 0x7b, 0x5a, 0x31, 0x2f,
+			0xfc, 0x34, 0xdc, 0x1a, 0x9f, 0x99, 0x81, 0xee,
+			0x6f, 0x19, 0xb1, 0x88, 0xfd, 0x4c, 0x88, 0x3b,
+			0x8d, 0xfd, 0xb8, 0x3f, 0xbd, 0xb4, 0xba, 0x52,
+			0x34, 0x75, 0x29, 0x2b, 0x79, 0x7d, 0x62, 0x80,
+			0xaf, 0x61, 0x67, 0x72, 0x06, 0x0a, 0x50, 0xfd,
+			0xd7, 0xd5, 0xed, 0x97, 0x6f, 0x0d, 0x94, 0x8a,
+			0x91, 0xac, 0xaa, 0xd2, 0x2a, 0x2f, 0xe9, 0x79,
+			0x47, 0xc3, 0x1f, 0xcf, 0xcb, 0x6b, 0xc4, 0xd3,
+			0x9c, 0x9d, 0xf2, 0x9b, 0xac, 0x8a, 0xbe, 0xd3,
+			0x28, 0x56, 0xb6, 0xaa, 0xd0, 0x83, 0x62, 0x8f,
+			0xea, 0xbd, 0x8f, 0x52, 0x4d, 0xd4, 0x88, 0x2c,
+			0x2c, 0x8d, 0x09, 0x8c, 0xb4, 0xeb, 0xe8, 0x3c,
+			0x0c, 0xc1, 0x9c, 0xa8, 0x70, 0x63, 0xe4, 0xaa,
+			0x21, 0x80, 0xf9, 0x2b, 0xaf, 0x2a, 0xdd, 0xf0,
+			0xe1, 0x04, 0x05, 0xe2, 0x8c, 0x12, 0x78, 0xed,
+			0x57, 0x46, 0x16, 0xcc, 0xb8, 0xbb, 0x36, 0x54,
+			0x66, 0xb6, 0x22, 0x81, 0x88, 0xfc, 0x42, 0x92,
+			0xca, 0xd5, 0xeb, 0x66, 0x13, 0x7a, 0xd1, 0x33,
+			0xc4, 0xcd, 0xfb, 0xe0, 0x8b, 0xc4, 0x90, 0x9f,
+			0xc5, 0xb9, 0xff, 0xb9, 0xbb, 0x41, 0x72, 0x2e,
+			0x7d, 0xcc, 0x91, 0x76, 0x1b, 0xdd, 0x40, 0xf3,
+			0xd3, 0xef, 0x80, 0xfb, 0xee, 0x60, 0x33, 0xad,
+			0x89, 0x64, 0xae, 0x30, 0x41, 0xe0, 0x93, 0x6c,
+			0x52, 0xe1, 0x13, 0x8d, 0xb9, 0x22, 0x25, 0x0d,
+			0xbb, 0x6a, 0x9a, 0x91, 0xf3, 0xe8, 0x2c, 0x96,
+			0xd5, 0xf7, 0xa9, 0x54, 0x86, 0xbf, 0xb0, 0x8b,
+			0xf3, 0x6d, 0x9a, 0x9c, 0x5d, 0xbd, 0x82, 0x1f,
+			0xdc, 0x73, 0xb6, 0xa0, 0xe5, 0x9e, 0x4d, 0x7d,
+			0xb4, 0x4d, 0xbf, 0xe6, 0xed, 0xc5, 0xd4, 0x58,
+			0x48, 0x93, 0xe9, 0x9a, 0x8d, 0x09, 0xd4, 0xfa,
+			0x6a, 0xfe, 0x5c, 0x2a, 0x11, 0x46, 0x71, 0x61,
+			0xbc, 0x4f, 0x48, 0x23, 0x8c, 0x12, 0x67, 0xf2,
+			0x29, 0x25, 0x93, 0x1f, 0xb5, 0x7b, 0x15, 0x39,
+			0xad, 0x58, 0xb5, 0x10, 0xbe, 0xc6, 0xe3, 0x2d,
+			0x71, 0xaf, 0xcd, 0xa0, 0x68, 0xd7, 0x8b, 0x71,
+			0x48, 0x9f, 0x3d, 0x8a, 0x0a, 0x8e, 0xb7, 0xc7,
+			0x1a, 0xbd, 0x5e, 0x66, 0x1d, 0x03, 0x61, 0xf4,
+			0xd1, 0xc2, 0xf1, 0xaf, 0x50, 0x93, 0x44, 0x74,
+			0x4c, 0x6e, 0x83, 0x9b, 0xa6, 0x19, 0x1a, 0x2e,
+			0xa3, 0xa5, 0xef, 0x0c, 0xc6, 0x71, 0x49, 0x0d,
+			0x56, 0xe6, 0xd4, 0x7b, 0x16, 0x8f, 0xe4, 0x5b,
+			0x78, 0x75, 0x7a, 0xe0, 0x4f, 0xe8, 0x40, 0x97,
+			0x9a, 0xc5, 0x95, 0x74, 0x29, 0xda, 0xfa, 0x32,
+			0xfb, 0x9e, 0xfa, 0x78, 0x90, 0x76, 0xb0, 0x1c,
+			0xcd, 0xa9, 0x67, 0x92, 0x58, 0xf2, 0xcf, 0xc6,
+			0x9b, 0xaf, 0x2e, 0xfd, 0x6f, 0x1f, 0x13, 0xbc,
+			0x18, 0xd4, 0xdb, 0x1b, 0x8d, 0xcf, 0x38, 0xd7,
+			0xc9, 0x52, 0xd2, 0x33, 0xe2, 0xf1, 0xe2, 0x7c,
+			0x98, 0x7f, 0xfe, 0x44, 0xe7, 0x1d, 0xe3, 0x23,
+			0x95, 0xf1, 0x6d, 0xe9, 0xf9, 0x72, 0x3f, 0x8c,
+			0xb7, 0xdb, 0x2e, 0xb7, 0x4e, 0x33, 0xd0, 0x87,
+			0x78, 0x30, 0xb9, 0x41, 0xcf, 0x92, 0x8d, 0xbc,
+			0xe6, 0x4e, 0x7f, 0x52, 0x5f, 0x45, 0x4c, 0x44,
+			0x2b, 0xd2, 0xa4, 0x3c, 0xb0, 0x20, 0x88, 0xf2,
+			0x59, 0xfc, 0xfb, 0x1f, 0xaf, 0x3e, 0x80, 0xa7,
+			0xb7, 0x12, 0x0a, 0x5b, 0xc8, 0x0d, 0x17, 0x98,
+			0x25, 0x36, 0x01, 0x4b, 0xd8, 0x03, 0x7b, 0x84,
+			0xc5, 0x75, 0xa9, 0x16, 0x90, 0xc8, 0x5a, 0x25,
+			0xed, 0xf8, 0x5b, 0x89, 0x54, 0x2d, 0xbd, 0x46,
+			0xf6, 0xc2, 0xf1, 0x39, 0xdc, 0x29, 0x11, 0x37,
+			0x84, 0xc5, 0x91, 0xd2, 0x4c, 0xf6, 0x27, 0x94,
+			0x4a, 0xdc, 0x82, 0xc5, 0x95, 0xd5, 0xc3, 0x41,
+			0xad, 0x1c, 0xcd, 0xeb, 0xfe, 0x6f, 0x16, 0xef,
+			0x5e, 0x65, 0x1d, 0x7a, 0xa0, 0xc9, 0xed, 0xa9,
+			0xcd, 0x31, 0xec, 0x64, 0x74, 0xb3, 0x25, 0x6d,
+			0xb3, 0xea, 0x0f, 0xa7, 0xf5, 0x7d, 0x88, 0xe9,
+			0xc3, 0x37, 0x29, 0x88, 0xcf, 0x05, 0x7d, 0xee,
+			0xc0, 0x2a, 0x30, 0x5f, 0x9f, 0xf9, 0xa6, 0x6b,
+			0xa7, 0x6a, 0x3d, 0xe8, 0xfa, 0x3c, 0xe1, 0x45,
+			0x57, 0x4f, 0x27, 0xb6, 0x28, 0x60, 0xc0, 0xad,
+			0x3d, 0x54, 0x07, 0x53, 0x81, 0x10, 0x64, 0xad,
+			0x22, 0x61, 0x4b, 0xbf, 0xe6, 0xe7, 0x10, 0xe4,
+			0xe7, 0x46, 0x58, 0x0e, 0x40, 0x53, 0x5d, 0x96,
+			0x51, 0xf8, 0x9f, 0xa6, 0xfa, 0xa0, 0xe3, 0xc2,
+			0xa5, 0x36, 0x4c, 0x7a, 0x71, 0x53, 0xa9, 0x36,
+			0xf6, 0xf2, 0xa3, 0xba, 0x60, 0x7b, 0x5b, 0x11,
+			0xd2, 0x39, 0x20, 0xeb, 0x09, 0x68, 0x4a, 0x1b,
+			0xe4, 0x31, 0xa5, 0xc9, 0xc9, 0xe5, 0xf4, 0x47,
+			0x5e, 0x26, 0x30, 0xf1, 0x83, 0x39, 0xa5, 0x4c,
+			0xa0, 0x72, 0x68, 0x8f, 0x4b, 0xd6, 0x64, 0x4c,
+			0xf5, 0x34, 0x74, 0x3d, 0x0c, 0x76, 0x10, 0xf4,
+			0x84, 0x5c, 0x9c, 0xbe, 0xe8, 0xe6, 0x24, 0x19,
+			0x4e, 0x34, 0x0a, 0x7a, 0x5d, 0x37, 0xae, 0xec,
+			0x2e, 0xf6, 0x05, 0x4a, 0x13, 0xf0, 0xc3, 0xb1,
+			0xd0, 0x41, 0xde, 0x5b, 0xcf, 0x86, 0xcc, 0xfc,
+			0xda, 0xa9, 0x31, 0x26, 0x09, 0xc3, 0x85, 0xe8,
+			0xd1, 0xa1, 0x39, 0x29, 0x73, 0xa9, 0xa7, 0x26,
+			0xda, 0x93, 0x4b, 0x1c, 0x41, 0xaf, 0x82, 0x9c,
+			0xa6, 0x05, 0x85, 0x93, 0x13, 0x60, 0x78, 0x54,
+			0x26, 0x11, 0x22, 0xc3, 0x4a, 0xde, 0x20, 0x54,
+			0xf4, 0x56, 0xc8, 0xc1, 0x09, 0x47, 0xfb, 0x47,
+			0x3e, 0x5c, 0x4c, 0x6e, 0xab, 0x9e, 0x22, 0x67,
+			0x4a, 0x80, 0xd7, 0x54, 0x8d, 0xdd, 0x57, 0x89,
+			0x77, 0xba, 0x96, 0x84, 0x73, 0x6d, 0x29, 0xa5,
+			0x73, 0x24, 0x3a, 0x54, 0x61, 0x5e, 0x80, 0xf7,
+			0x65, 0x41, 0x56, 0x32, 0x57, 0xb4, 0xb8, 0x22,
+			0x91, 0xef, 0xfd, 0x66, 0x12, 0x61, 0x84, 0xd9,
+			0x7d, 0x14, 0xa9, 0xd0, 0xf3, 0x82, 0xec, 0xf0,
+			0x91, 0x79, 0x70, 0xaa, 0xe3, 0x08, 0x5f, 0xc8,
+			0x3e, 0xc3, 0x4f, 0x51, 0xb3, 0x1c, 0x55, 0x34,
+			0xea, 0x8c, 0x9b, 0x70, 0xd5, 0xae, 0x95, 0xd8,
+			0xf5, 0x73, 0x47, 0x9d, 0xbf, 0x7f, 0xab, 0xe1,
+			0x2a, 0x26, 0x4c, 0x0c, 0x1b, 0xab, 0x09, 0xae,
+			0x14, 0x14, 0x96, 0x7c, 0x61, 0xc0, 0xd1, 0x3f,
+			0xe0, 0x6c, 0x29, 0x7a, 0x13, 0x82, 0x3a, 0x10,
+			0xca, 0x79, 0xa1, 0x69, 0xb5, 0xe4, 0x12, 0x8f,
+			0x88, 0x91, 0x89, 0x4c, 0x49, 0xbb, 0x21, 0xba,
+			0xca, 0xd0, 0x38, 0xf2, 0x91, 0xed, 0x49, 0x6a,
+			0x59, 0xa7, 0x74, 0x87, 0xa1, 0x6e, 0x47, 0x18,
+			0x2d, 0xbe, 0xcf, 0x41, 0x3a, 0x07, 0x9e, 0xb8,
+			0x2b, 0xf9, 0x93, 0xd6, 0xd1, 0x06, 0xa6, 0xa4,
+			0x3f, 0xef, 0x1e, 0xba, 0x3f, 0xf7, 0x3d, 0xe2,
+			0x3d, 0xf9, 0xa9, 0x20, 0xa5, 0x81, 0x2a, 0x3f,
+			0xb3, 0xbd, 0xdd, 0xae, 0x3f, 0xb5, 0xf7, 0xdd,
+			0x47, 0x9c, 0x57, 0x2d, 0xa9, 0xd1, 0x5d, 0x61,
+			0xaa, 0xd6, 0xca, 0x32, 0x35, 0x68, 0x69, 0xdb,
+			0xed, 0xb4, 0xd8, 0x2e, 0xc8, 0x41, 0x7e, 0x79,
+			0xad, 0xd0, 0xca, 0x2b, 0xa3, 0x2c, 0x9d, 0x16,
+			0x13, 0x79, 0x8c, 0x30, 0x01, 0xf4, 0x33, 0x48,
+			0x4a, 0x09, 0xa3, 0xaa, 0xd1, 0x75, 0xfc, 0xc7,
+			0xac, 0x43, 0xc1, 0xd7, 0xcf, 0x90, 0x91, 0x90,
+			0x24, 0x5a, 0x8b, 0xfd, 0xff, 0x1a, 0x8e, 0xa0,
+			0x25, 0xb7, 0x28, 0x8c, 0x21, 0x96, 0x25, 0x12,
+			0xe3, 0x9a, 0x19, 0xe4, 0x1a, 0x50, 0x2c, 0x9b,
+			0x48, 0x3b, 0xc9, 0x82, 0xc9, 0x29, 0xdc, 0x4d,
+			0x0c, 0xb6, 0x5d, 0x2e, 0xc1, 0xc8, 0x5a, 0xdd,
+			0x39, 0x97, 0x4c, 0xce, 0xea, 0x33, 0x95, 0xa5,
+			0x86, 0x5e, 0x1b, 0x21, 0xf1, 0x73, 0x58, 0xe7,
+			0x28, 0x13, 0xca, 0x9d, 0xd9, 0x7a, 0xe8, 0x94,
+			0x56, 0xd3, 0x35, 0xfe, 0x18, 0x4a, 0x91, 0x6e,
+			0x99, 0x83, 0xac, 0x9f, 0x99, 0x0b, 0xbd, 0xf3,
+			0xbf, 0x0e, 0x3d, 0xf6, 0xcd, 0x9f, 0xfc, 0x80,
+			0x9d, 0x72, 0x7f, 0x60, 0xd2, 0xf6, 0x1e, 0xa6,
+			0x0f, 0xeb, 0xa7, 0xee, 0xe3, 0x8d, 0x56, 0xf8,
+			0x20, 0x76, 0xcf, 0x7e, 0xf9, 0x5d, 0x06, 0x08,
+			0xe0, 0xcb, 0xf0, 0x89, 0xfc, 0x39, 0x54, 0x60,
+			0x4f, 0x92, 0xfd, 0x04, 0xab, 0xa6, 0x6e, 0x63,
+			0x44, 0xab, 0xc3, 0x70, 0x1b, 0x57, 0x01, 0x79,
+			0x88, 0x5e, 0xc0, 0x25, 0xc8, 0xe1, 0x03, 0xdd,
+			0x0f, 0x61, 0x2b, 0x50, 0x13, 0x84, 0x02, 0x79,
+			0x3a, 0x89, 0x16, 0x08, 0x34, 0x3e, 0x76, 0xf7,
+			0x4f, 0xbc, 0x9e, 0xfb, 0xb5, 0x81, 0xc4, 0xda,
+			0x95, 0x8b, 0x33, 0x92, 0x49, 0x86, 0x02, 0x44,
+			0x8d, 0x60, 0x74, 0x77, 0x5c, 0x6d, 0xcc, 0x0d,
+			0x67, 0xbe, 0x6e, 0x4a, 0xd9, 0x8c, 0xdd, 0x09,
+			0x7d, 0x90, 0x15, 0x2b, 0x6f, 0x7a, 0xca, 0x2d,
+			0x91, 0x74, 0x08, 0xd5, 0x38, 0xb4, 0xcb, 0xd3,
+			0xd5, 0x66, 0x2b, 0x2c, 0x98, 0xd1, 0x1f, 0x40,
+			0x06, 0x94, 0x83, 0x3c, 0xe4, 0x95, 0x59, 0x8c,
+			0xcb, 0x5d, 0x1f, 0x2f, 0xd1, 0x28, 0x26, 0xd5,
+			0x41, 0x42, 0x89, 0x60, 0xdc, 0xfb, 0xba, 0x40,
+			0x99, 0xe8, 0xa1, 0x99, 0xd4, 0x97, 0x05, 0xf1,
+			0xf4, 0x68, 0xa7, 0x95, 0x9b, 0x46, 0xbe, 0x3a,
+			0xa2, 0x38, 0x81, 0x1d, 0x3f, 0xa3, 0x39, 0x20,
+			0xa1, 0x1a, 0x3c, 0x59, 0x1d, 0x34, 0x77, 0xd0,
+			0x8b, 0xb9, 0x49, 0x7d, 0xba, 0x8f, 0x97, 0x27,
+			0x1c, 0xbe, 0xf5, 0x9b, 0x4b, 0x88, 0x87, 0x1b,
+			0xd8, 0xbe, 0x6e, 0x41, 0xd3, 0x54, 0x9a, 0xe3,
+			0x52, 0x05, 0xe2, 0x01, 0x18, 0x31, 0xd2, 0xe2,
+			0x2e, 0xdd, 0x85, 0xd3, 0x2c, 0xe0, 0x07, 0xed,
+			0xa8, 0x0e, 0xc3, 0x0d, 0x83, 0x01, 0xa6, 0xcd,
+			0x0d, 0x50, 0xde, 0xb6, 0x6b, 0xf7, 0x59, 0x3f,
+			0xb7, 0x26, 0x4f, 0x55, 0x4d, 0xd8, 0x34, 0x39,
+			0xef, 0x47, 0x7d, 0x6c, 0x8c, 0x2e, 0xfb, 0x67,
+			0x49, 0x61, 0x5b, 0x33, 0x9d, 0xe2, 0x94, 0xb7,
+			0x76, 0x80, 0x1f, 0xed, 0x73, 0xc7, 0xf6, 0xab,
+			0xc0, 0x77, 0x59, 0x10, 0x49, 0xe6, 0x59, 0x09,
+			0xf6, 0xb0, 0x07, 0x09, 0x87, 0x54, 0xe5, 0x0b,
+			0x0e, 0x73, 0x2b, 0xed, 0xba, 0xcf, 0xb1, 0xc5,
+			0xa0, 0xf3, 0x24, 0x9a, 0xc2, 0x56, 0x70, 0xf3,
+			0xb6, 0x92, 0xab, 0x91, 0x3a, 0x54, 0x8a, 0x5b,
+			0x9e, 0x93, 0x3f, 0x12, 0x22, 0xa5, 0xa5, 0x52,
+			0xb3, 0xbf, 0x83, 0x58, 0x96, 0x90, 0x93, 0xd1,
+			0x9f, 0xaf, 0x0a, 0x22, 0x04, 0x6f, 0x23, 0xa3,
+			0x3d, 0x65, 0x98, 0xd4, 0xbd, 0x61, 0xe3, 0xd8,
+			0x44, 0x6b, 0xc7, 0xe9, 0xcc, 0x8f, 0xbb, 0x55,
+			0x8f, 0x33, 0xce, 0xfe, 0x76, 0xff, 0x42, 0x6d,
+			0xe4, 0xfa, 0xca, 0x87, 0x99, 0x5b, 0x68, 0x93,
+			0xff, 0x0f, 0xba, 0xd7, 0x6d, 0x1d, 0x17, 0xd8,
+			0x9e, 0xd2, 0x69, 0x70, 0x25, 0x4f, 0x3a, 0xa8,
+			0xd0, 0x0d, 0xea, 0xdd, 0x0f, 0xc5, 0xa3, 0x13,
+			0x72, 0xb8, 0x5a, 0x91, 0xb6, 0x47, 0xf3, 0xd4,
+			0x4a, 0xf8, 0xa1, 0xe9, 0xa7, 0x11, 0xc0, 0xba,
+			0xc5, 0x1d, 0xbb, 0xcf, 0x98, 0x19, 0x56, 0x7c,
+			0xde, 0xe4, 0x01, 0xbc, 0x0b, 0xe0, 0x3b, 0x43,
+			0xb2, 0x7d, 0x8c, 0x67, 0x1c, 0x2d, 0xdf, 0xb2,
+			0xf8, 0xcc, 0x7b, 0xdd, 0x45, 0x6c, 0x6f, 0xfb,
+			0x6d, 0xaf, 0xc6, 0x20, 0xaa, 0x25, 0xb7, 0xf9,
+			0x94, 0x48, 0xaf, 0x45, 0x96, 0x2a, 0x78, 0x78,
+			0x62, 0x8a, 0x23, 0xb5, 0x7d, 0x37, 0x98, 0xfd,
+			0x5d, 0x96, 0x50, 0x2f, 0x2c, 0x4b, 0x45, 0xa3,
+			0xf1, 0xaa, 0x2d, 0x92, 0x6d, 0xa8, 0xd1, 0x6b,
+			0x41, 0x53, 0x37, 0xff, 0x06, 0xfd, 0x8f, 0x57,
+			0xe9, 0x30, 0x05, 0x52, 0x64, 0xa9, 0x91, 0x8a,
+			0x33, 0xec, 0x62, 0xcd, 0x61, 0xae, 0x3c, 0x32,
+			0x57, 0x3e, 0xe4, 0x86, 0xdf, 0xb8, 0x0e, 0x7b,
+			0x07, 0x2c, 0xaf, 0x9f, 0xcc, 0x15, 0xe0, 0x67,
+			0x65, 0xab, 0x85, 0x86, 0x7e, 0x00, 0x6a, 0x2f,
+			0x62, 0x52, 0xfa, 0x2f, 0x37, 0x8d, 0x38, 0x55,
+			0x40, 0x9d, 0x6c, 0x01, 0x7c, 0x0b, 0x93, 0x20,
+			0x60, 0x69, 0x9d, 0x6e, 0xc9, 0x4d, 0xe5, 0x62,
+			0x4b, 0x94, 0xe4, 0x05, 0x26, 0x46, 0x37, 0xd8,
+			0x3f, 0xd7, 0x16, 0x35, 0x45, 0x88, 0x4c, 0xad,
+			0x6a, 0xa6, 0xb2, 0x1b, 0x63, 0x9a, 0x3e, 0xfc,
+			0x69, 0xdd, 0xbb, 0x5b, 0xf4, 0xf3, 0xa1, 0x8c,
+			0xba, 0xd5, 0xef, 0x6a, 0xf0, 0x97, 0x2f, 0x20,
+			0x79, 0xdf, 0x11, 0x2c, 0x75, 0xab, 0x0d, 0x22,
+			0xaa, 0x6e, 0x8a, 0x59, 0x5e, 0x0c, 0x88, 0xe5,
+			0x1c, 0x4b, 0x6e, 0x1a, 0x5c, 0xa8, 0xe7, 0x36,
+			0xc9, 0x6a, 0x49, 0x85, 0xe0, 0x06, 0xa8, 0xaa,
+			0xed, 0x87, 0x29, 0x28, 0x0a, 0x40, 0xce, 0xdb,
+			0x78, 0xc6, 0x65, 0x26, 0x4d, 0x13, 0xdb, 0x89,
+			0xf9, 0x04, 0xdd, 0x58, 0x92, 0x8c, 0x5f, 0xad,
+			0x02, 0xee, 0xe9, 0xaa, 0x97, 0x6b, 0xf8, 0x77,
+			0x15, 0x7c, 0xb4, 0xa8, 0x30, 0x12, 0x8e, 0xbb,
+			0x4e, 0xc2, 0x19, 0x14, 0x0e, 0x0c, 0xc9, 0x5d,
+			0xc4, 0x47, 0x30, 0xe4, 0x85, 0x71, 0x98, 0x52,
+			0x53, 0x55, 0x6c, 0x11, 0x8b, 0xbd, 0x12, 0x77,
+			0xe9, 0x84, 0xd2, 0x5b, 0x17, 0x90, 0x24, 0xae,
+			0x7c, 0xc8, 0xf9, 0xdf, 0xd0, 0x98, 0xe6, 0x6c,
+			0xe8, 0xac, 0xeb, 0x53, 0x1b, 0x58, 0x97, 0xa0,
+			0xc4, 0x4c, 0xfb, 0x47, 0xb6, 0x1d, 0x7a, 0x59,
+			0x42, 0x28, 0xb4, 0xdb, 0x87, 0x84, 0x93, 0xde,
+			0x18, 0xd8, 0xe3, 0x4e, 0xe6, 0xcf, 0xe0, 0x7e,
+			0x09, 0xe1, 0x82, 0x40, 0x5d, 0x51, 0x80, 0x75,
+			0x50, 0x88, 0xef, 0x99, 0xbd, 0x41, 0xd3, 0x8e,
+			0xe9, 0x96, 0xdd, 0x97, 0x55, 0xe0, 0xbc, 0x5d,
+			0xba, 0xda, 0x0b, 0x15, 0xb3, 0x98, 0x86, 0x99,
+			0xd7, 0xba, 0xaf, 0x5d, 0xb7, 0x84, 0xe3, 0xde,
+			0x47, 0xca, 0xff, 0xc8, 0x14, 0xbe, 0x1a, 0xc5,
+			0xd9, 0x8a, 0xcb, 0xd6, 0x0b, 0xe5, 0x9d, 0xe8,
+			0xf9, 0x5e, 0x78, 0xec, 0xa6, 0xbd, 0x72, 0xd7,
+			0xc0, 0x33, 0xf7, 0xfa, 0xc1, 0x33, 0x3a, 0x9b,
+			0x11, 0xd8, 0x02, 0x8c, 0xd0, 0xe8, 0x37, 0xb8,
+			0x25, 0xe3, 0x97, 0x24, 0x2e, 0x29, 0x41, 0x83,
+			0xee, 0x4a, 0x22, 0x00, 0x7c, 0xc1, 0x4c, 0xf5,
+			0xe5, 0xac, 0xf7, 0x6b, 0xa9, 0x93, 0x76, 0x37,
+			0x52, 0x9b, 0xfe, 0xb9, 0x2f, 0xe9, 0xc9, 0xe2,
+			0xaa, 0xcc, 0x72, 0x7a, 0xab, 0xd4, 0x23, 0x0b,
+			0x0c, 0xc9, 0x63, 0x4c, 0x02, 0x3e, 0x38, 0x58,
+			0x4e, 0xea, 0xdc, 0xeb, 0xbd, 0x7c, 0xb7, 0xfd,
+			0xf8, 0x99, 0x2b, 0x0b, 0x72, 0x8b, 0x44, 0x6d,
+			0x3b, 0xe8, 0x97, 0xf2, 0xa1, 0xbf, 0x4e, 0x93,
+			0xf0, 0x64, 0x16, 0x4d, 0x39, 0xf8, 0x72, 0xe7,
+			0x73, 0x2e, 0xbc, 0x08, 0x0f, 0x42, 0x7e, 0x30,
+			0xb8, 0xbf, 0x75, 0xed, 0x00, 0x50, 0x9f, 0x81,
+			0x13, 0x3b, 0xc9, 0x33, 0x4d, 0xf9, 0x7e, 0x8b,
+			0x5c, 0xd8, 0x7c, 0xe4, 0x0d, 0x95, 0x63, 0x28,
+			0x59, 0x68, 0x97, 0x02, 0x0c, 0x1e, 0x57, 0xa6,
+			0x0b, 0x24, 0x3e, 0x70, 0x8e, 0x94, 0x9a, 0xd4,
+			0x43, 0xb1, 0xb6, 0xcd, 0xf8, 0xff, 0x35, 0x46,
+			0x6c, 0x77, 0xb6, 0xbe, 0xc8, 0x7b, 0xb0, 0xc1,
+			0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+			0x08, 0x10, 0x16, 0x1d, 0x21, },
+	},


^ permalink raw reply related

* [PATCH v8 4/9] crypto: Add ML-DSA-44 pure rejection test vectors as a kunit test
From: David Howells @ 2025-11-14 13:04 UTC (permalink / raw)
  To: Herbert Xu
  Cc: David Howells, Eric Biggers, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Jason A . Donenfeld, Ard Biesheuvel,
	Stephan Mueller, Lukas Wunner, Ignat Korchagin, linux-crypto,
	keyrings, linux-modules, linux-kernel
In-Reply-To: <20251114130417.1756230-1-dhowells@redhat.com>

Add the "Pure rejection tests" from Stephan Mueller's Leancrypto
implementation of ML-DSA/Dilithium 44 to the kernel as a kunit test.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Stephan Mueller <smueller@chronox.de>
cc: Eric Biggers <ebiggers@kernel.org>
cc: Jason A. Donenfeld <Jason@zx2c4.com>
cc: Ard Biesheuvel <ardb@kernel.org>
cc: Herbert Xu <herbert@gondor.apana.org.au>
cc: linux-crypto@vger.kernel.org
---
 lib/crypto/tests/Kconfig                      |  10 +
 lib/crypto/tests/Makefile                     |   1 +
 lib/crypto/tests/mldsa_kunit.c                |  73 +++
 .../tests/mldsa_pure_rejection_vectors_44.h   | 489 ++++++++++++++++++
 4 files changed, 573 insertions(+)
 create mode 100644 lib/crypto/tests/mldsa_kunit.c
 create mode 100644 lib/crypto/tests/mldsa_pure_rejection_vectors_44.h

diff --git a/lib/crypto/tests/Kconfig b/lib/crypto/tests/Kconfig
index 61d435c450bb..17b66dd6037d 100644
--- a/lib/crypto/tests/Kconfig
+++ b/lib/crypto/tests/Kconfig
@@ -101,6 +101,16 @@ config CRYPTO_LIB_SHA3_KUNIT_TEST
 	  including SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128 and
 	  SHAKE256.
 
+config CRYPTO_LIB_MLDSA_KUNIT_TEST
+	tristate "KUnit tests for ML-DSA"
+	depends on KUNIT
+	select CRYPTO_LIB_MLDSA
+	select CRYPTO
+	default KUNIT_ALL_TESTS
+	help
+	  This options enables the KUnit tests for ML-DSA (Dilithium)
+	  asymmetric key algorithm.
+
 config CRYPTO_LIB_BENCHMARK_VISIBLE
 	bool
 
diff --git a/lib/crypto/tests/Makefile b/lib/crypto/tests/Makefile
index 5109a0651925..2d9f6bc6ba88 100644
--- a/lib/crypto/tests/Makefile
+++ b/lib/crypto/tests/Makefile
@@ -10,3 +10,4 @@ obj-$(CONFIG_CRYPTO_LIB_SHA1_KUNIT_TEST) += sha1_kunit.o
 obj-$(CONFIG_CRYPTO_LIB_SHA256_KUNIT_TEST) += sha224_kunit.o sha256_kunit.o
 obj-$(CONFIG_CRYPTO_LIB_SHA512_KUNIT_TEST) += sha384_kunit.o sha512_kunit.o
 obj-$(CONFIG_CRYPTO_LIB_SHA3_KUNIT_TEST) += sha3_kunit.o
+obj-$(CONFIG_CRYPTO_LIB_MLDSA_KUNIT_TEST) += mldsa_kunit.o
diff --git a/lib/crypto/tests/mldsa_kunit.c b/lib/crypto/tests/mldsa_kunit.c
new file mode 100644
index 000000000000..33ef92d8adbc
--- /dev/null
+++ b/lib/crypto/tests/mldsa_kunit.c
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2025 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/module.h>
+#include <crypto/mldsa.h>
+#include <kunit/test.h>
+#include "../mldsa/dilithium.h"
+
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_DESCRIPTION("Leancrypto ML-DSA (Dilithium) tests");
+MODULE_AUTHOR("David Howells <dhowells@redhat.com>");
+
+struct dilithium_testvector {
+	u16		pk_len;
+	u16		msg_len;
+	u16		sig_len;
+	const char	*what;
+	const char	*algo;
+	const u8	*pk;
+	const u8	*sig;
+	const u8	*msg;
+};
+
+/*
+ * Use rejection test vector which will cover all rejection code paths
+ * as generated with the dilithium_edge_case_tester.
+ *
+ * For FIPS 140: The test vectors cover the requirements of IG 10.3.A.
+ */
+static const struct dilithium_testvector dilithium44_testvectors[] = {
+#include "mldsa_pure_rejection_vectors_44.h"
+};
+
+static void dilithium_sigver_test_one(struct kunit *test, int index,
+				      const struct dilithium_testvector *tc)
+{
+	int ret;
+
+	ret = mldsa_verify(MLDSA_UNKNOWN,
+			   tc->pk, tc->pk_len,
+			   tc->msg, tc->msg_len,
+			   tc->sig, tc->sig_len);
+	KUNIT_ASSERT_EQ_MSG(test, ret, 0, "Verify failed");
+}
+
+static void dilithium44_kunit_test(struct kunit *test)
+{
+	const struct dilithium_testvector *tc = dilithium44_testvectors;
+	int count = ARRAY_SIZE(dilithium44_testvectors);
+
+	for (int index = 0; index < count; index++) {
+		dilithium_sigver_test_one(test, index, &tc[index]);
+	}
+
+	KUNIT_SUCCEED(test);
+}
+
+static struct kunit_case __refdata mldsa_kunit_cases[] = {
+	KUNIT_CASE(dilithium44_kunit_test),
+	{}
+};
+
+static struct kunit_suite mldsa_kunit_suite = {
+	.name		= "mldsa",
+	.test_cases	= mldsa_kunit_cases,
+};
+
+kunit_test_suites(&mldsa_kunit_suite);
diff --git a/lib/crypto/tests/mldsa_pure_rejection_vectors_44.h b/lib/crypto/tests/mldsa_pure_rejection_vectors_44.h
new file mode 100644
index 000000000000..e452cad32194
--- /dev/null
+++ b/lib/crypto/tests/mldsa_pure_rejection_vectors_44.h
@@ -0,0 +1,489 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+	{
+		.what = "pure rejection vector",
+		.algo = "ml-dsa44",
+		.pk_len = DILITHIUM44_PUBLICKEYBYTES,
+		.pk = (const u8[DILITHIUM44_PUBLICKEYBYTES]){
+			0x8f, 0x61, 0x67, 0xa9, 0x7c, 0x61, 0xc2, 0xf2,
+			0x87, 0xe2, 0x28, 0xf8, 0x44, 0x80, 0x6f, 0xb0,
+			0x10, 0xc1, 0x14, 0xf6, 0x88, 0x42, 0x76, 0xbe,
+			0x05, 0xd2, 0x56, 0xa0, 0xb7, 0x46, 0xcf, 0xc5,
+			0x76, 0x0a, 0x52, 0xfe, 0xa3, 0x3c, 0x05, 0x6e,
+			0xd5, 0xd3, 0xbd, 0x80, 0x03, 0x29, 0x25, 0x96,
+			0xdf, 0xa9, 0x5b, 0x12, 0x42, 0x89, 0x6e, 0x03,
+			0x2c, 0x42, 0x64, 0xee, 0xc7, 0xf7, 0x55, 0xfe,
+			0xfd, 0x15, 0x74, 0xee, 0x2d, 0xb3, 0xbf, 0xf2,
+			0x24, 0xe7, 0x35, 0x45, 0x77, 0x67, 0x44, 0xd2,
+			0x0c, 0x43, 0xfc, 0x7b, 0x47, 0x56, 0xad, 0xc5,
+			0xe7, 0x37, 0x49, 0x21, 0x12, 0x57, 0x7f, 0xca,
+			0x7f, 0x5d, 0xac, 0x62, 0x5b, 0x8d, 0xbf, 0xdb,
+			0x64, 0xac, 0x12, 0x1d, 0x7f, 0x7a, 0x2f, 0xa0,
+			0x2c, 0xfe, 0x95, 0x4b, 0x78, 0xdb, 0xf0, 0x98,
+			0x97, 0x70, 0x62, 0xfc, 0x64, 0x4a, 0x1b, 0xbc,
+			0x30, 0x1b, 0x51, 0x13, 0x47, 0x6e, 0x83, 0xd2,
+			0xa2, 0xcf, 0x39, 0xba, 0xd3, 0x00, 0x62, 0x7c,
+			0x5b, 0xe6, 0x14, 0x55, 0xd5, 0xfc, 0xbf, 0x15,
+			0x65, 0xd7, 0x1f, 0xbb, 0xf6, 0x2b, 0x46, 0x38,
+			0x1e, 0xf3, 0x8f, 0x0d, 0x57, 0x8a, 0x41, 0xfb,
+			0x47, 0x19, 0xe1, 0x79, 0xca, 0x98, 0x1a, 0x73,
+			0x4d, 0x8a, 0xc0, 0xa1, 0xa7, 0x4a, 0x28, 0x4a,
+			0x92, 0x6c, 0x77, 0x4f, 0x18, 0xe1, 0xce, 0x11,
+			0x14, 0xd5, 0xf6, 0xc0, 0xa8, 0x1e, 0x26, 0x25,
+			0xe4, 0x30, 0xb2, 0x6f, 0x89, 0x6e, 0xc6, 0x44,
+			0x1a, 0xd3, 0xca, 0xe1, 0x05, 0x0d, 0x61, 0x80,
+			0xd7, 0xbc, 0x56, 0x0a, 0x57, 0x9f, 0x16, 0x40,
+			0x84, 0x1e, 0xc0, 0x5e, 0xcd, 0xb6, 0xc8, 0x5d,
+			0x87, 0xd6, 0xee, 0xcb, 0x21, 0x2f, 0x22, 0x9a,
+			0x7e, 0xea, 0x2e, 0xf5, 0x87, 0xf0, 0x44, 0x10,
+			0x3d, 0x42, 0x6d, 0x3f, 0x4f, 0xa0, 0x21, 0x8e,
+			0x40, 0x75, 0x3b, 0xaa, 0xd4, 0xd9, 0x37, 0x0a,
+			0x35, 0x5b, 0xba, 0xbd, 0x11, 0x17, 0x7b, 0x7e,
+			0xfc, 0xb1, 0x1c, 0x5c, 0x71, 0xce, 0xde, 0xa5,
+			0xec, 0xd6, 0x8b, 0x50, 0x64, 0x02, 0xca, 0x84,
+			0x26, 0xfe, 0x03, 0x9e, 0xaf, 0x13, 0x05, 0x1c,
+			0x85, 0x32, 0x92, 0x85, 0x84, 0x83, 0xb6, 0x76,
+			0x27, 0xa7, 0xd8, 0x0c, 0xa4, 0xb5, 0x65, 0x7a,
+			0xbf, 0x2e, 0x64, 0xce, 0x82, 0x0d, 0x27, 0xd3,
+			0x2c, 0x9d, 0xb5, 0xa5, 0x51, 0xe3, 0xab, 0xbd,
+			0xe2, 0xe0, 0x64, 0x71, 0x0f, 0x99, 0x09, 0x6a,
+			0x40, 0x9d, 0x8c, 0x6d, 0x63, 0x70, 0x42, 0xe2,
+			0xa8, 0x5c, 0x71, 0xd2, 0x88, 0x10, 0xbc, 0x3b,
+			0x9d, 0xc8, 0x3a, 0x8a, 0xf3, 0x81, 0x0a, 0x0e,
+			0xd8, 0xf6, 0x13, 0x90, 0xc2, 0xda, 0x4c, 0x4f,
+			0x6f, 0x1f, 0x61, 0x0d, 0x46, 0xac, 0x5c, 0x4a,
+			0xcc, 0x23, 0xfb, 0xf2, 0xf8, 0x9f, 0x48, 0x1f,
+			0xaf, 0x24, 0xb4, 0xc7, 0xcb, 0x6f, 0x80, 0x74,
+			0xa3, 0xdb, 0xa8, 0x61, 0x12, 0x60, 0x08, 0x56,
+			0x85, 0x47, 0x05, 0x32, 0x93, 0x43, 0x9b, 0xa6,
+			0xf6, 0x56, 0x3b, 0xab, 0x93, 0x28, 0x19, 0xda,
+			0xad, 0xb5, 0xaa, 0x2e, 0x83, 0x3d, 0x37, 0x0e,
+			0x83, 0xf2, 0xfe, 0xdd, 0xe8, 0xd9, 0x53, 0x36,
+			0x3b, 0x5d, 0x8e, 0x24, 0xa9, 0x3a, 0x8f, 0x85,
+			0x4b, 0x50, 0xf7, 0x61, 0x0f, 0x20, 0x92, 0x09,
+			0x1f, 0xe4, 0x24, 0x98, 0x9f, 0xa4, 0x52, 0x12,
+			0x2a, 0xae, 0x6f, 0xd6, 0x0d, 0xb5, 0x22, 0x72,
+			0x83, 0xfb, 0x4f, 0xef, 0xa6, 0x55, 0x9a, 0x14,
+			0xab, 0x82, 0x89, 0x1f, 0xf2, 0x0b, 0x14, 0x76,
+			0xb7, 0xf7, 0x14, 0xdd, 0xd6, 0xc1, 0xe8, 0xb2,
+			0x99, 0x23, 0x28, 0xe8, 0xa4, 0x69, 0x18, 0xf6,
+			0x3e, 0xb1, 0xff, 0xde, 0xf2, 0x2c, 0x7c, 0x73,
+			0x93, 0x32, 0x52, 0x06, 0xeb, 0x59, 0xb2, 0x8f,
+			0x2f, 0x1d, 0x6a, 0x85, 0x74, 0xd3, 0xe5, 0xa1,
+			0x95, 0xe4, 0x96, 0x1e, 0x75, 0x16, 0xe4, 0x5c,
+			0x40, 0xf0, 0x20, 0xb1, 0x10, 0xe7, 0x2a, 0x70,
+			0x41, 0xac, 0x49, 0x40, 0x55, 0xef, 0xd1, 0x58,
+			0x24, 0x6a, 0xa6, 0x20, 0xdc, 0x23, 0xdc, 0x66,
+			0x45, 0x4f, 0x6a, 0x52, 0x3c, 0x61, 0xc8, 0xfb,
+			0x28, 0x1e, 0x8c, 0x3f, 0xfc, 0xc7, 0x73, 0x2f,
+			0xf1, 0xe2, 0x31, 0xee, 0xa0, 0x5f, 0x12, 0x3f,
+			0x94, 0xe5, 0x26, 0xc0, 0x62, 0xcc, 0x67, 0x8f,
+			0x5d, 0xfd, 0x3d, 0x8f, 0x16, 0xae, 0x4e, 0x04,
+			0x54, 0x5b, 0x02, 0x66, 0x00, 0x70, 0xe5, 0xcc,
+			0xb9, 0x51, 0x8c, 0x1a, 0x5d, 0xf0, 0xfe, 0x7d,
+			0x1b, 0x2f, 0x0a, 0x48, 0x94, 0xda, 0x4b, 0xb3,
+			0x05, 0x75, 0x3b, 0x25, 0xda, 0xf2, 0x12, 0x47,
+			0xe2, 0xd7, 0xbb, 0xe7, 0x05, 0xa2, 0x4e, 0xaf,
+			0x2f, 0x29, 0x6c, 0xbd, 0x80, 0x82, 0xdf, 0xbb,
+			0x4b, 0x9d, 0x29, 0x9b, 0xef, 0xff, 0x17, 0x2a,
+			0xa7, 0x2f, 0x4a, 0x2e, 0xbf, 0x29, 0x38, 0xcb,
+			0x94, 0x9c, 0x10, 0x87, 0x69, 0x57, 0x7d, 0xd7,
+			0xcf, 0xc1, 0x57, 0x0f, 0xc2, 0x9c, 0x3b, 0x1e,
+			0xbc, 0x55, 0x08, 0xb1, 0x50, 0xb0, 0x28, 0x79,
+			0x1d, 0xd9, 0x2f, 0xa5, 0x12, 0xcc, 0xa7, 0x5b,
+			0xcb, 0x67, 0x57, 0x13, 0x4a, 0xb3, 0xd5, 0x34,
+			0xea, 0xd9, 0x6b, 0x15, 0x17, 0x1f, 0xe7, 0x52,
+			0x2a, 0x11, 0xdf, 0xab, 0x3a, 0x8d, 0x1b, 0xaa,
+			0xfa, 0x54, 0xf0, 0x20, 0x94, 0x40, 0x2d, 0x3e,
+			0xf2, 0xa2, 0x8b, 0xbb, 0x86, 0xce, 0x29, 0x87,
+			0xb1, 0xfa, 0x27, 0xf2, 0x5a, 0x79, 0xc2, 0xf8,
+			0xe9, 0xf2, 0x7c, 0x5a, 0xcd, 0x45, 0x8e, 0x8b,
+			0xba, 0xad, 0x13, 0x52, 0x79, 0xd5, 0x0f, 0x59,
+			0xfb, 0x07, 0x15, 0x1f, 0xb3, 0xe6, 0xc8, 0x66,
+			0xf7, 0x37, 0x19, 0xd8, 0x33, 0xdd, 0xc1, 0xb3,
+			0x96, 0x4b, 0x28, 0x43, 0xf8, 0x5e, 0xc7, 0xe8,
+			0x81, 0x6e, 0xd0, 0xb2, 0x5a, 0x3d, 0xf1, 0x68,
+			0x8f, 0xf0, 0xf5, 0x1a, 0x6d, 0xc3, 0xaa, 0x5b,
+			0x72, 0x27, 0xbd, 0xd6, 0x7c, 0x9b, 0xbf, 0x89,
+			0x6a, 0x09, 0xf0, 0x48, 0xf0, 0x8c, 0x27, 0x69,
+			0x28, 0xf3, 0x5f, 0x53, 0xe3, 0x4d, 0x60, 0x4a,
+			0xb8, 0xc5, 0xf9, 0x85, 0x07, 0x3e, 0xfb, 0xd7,
+			0x21, 0x69, 0xd5, 0xec, 0x18, 0x68, 0xb6, 0x55,
+			0x15, 0xac, 0x2e, 0x0f, 0x5c, 0x2e, 0x9e, 0x12,
+			0x10, 0x5e, 0xc6, 0xb3, 0xcd, 0xe6, 0x3a, 0x2f,
+			0x43, 0xf6, 0x75, 0x31, 0x3c, 0x90, 0x34, 0x1c,
+			0x3d, 0x45, 0xaa, 0x8e, 0x08, 0xcf, 0x58, 0x67,
+			0x34, 0xd4, 0x24, 0xb8, 0x20, 0x69, 0xfe, 0xf0,
+			0x33, 0xe9, 0x3e, 0xbd, 0xe5, 0x18, 0x9f, 0x66,
+			0xc9, 0x0d, 0x6f, 0x47, 0x99, 0xf7, 0x0c, 0xdd,
+			0xad, 0x8c, 0x6b, 0x80, 0xed, 0x19, 0x61, 0x8a,
+			0xba, 0x62, 0x2f, 0xcc, 0x0e, 0x47, 0xe0, 0xc6,
+			0x1f, 0x2f, 0x44, 0x40, 0x17, 0xb6, 0x89, 0xc6,
+			0xf5, 0xc2, 0x97, 0x89, 0x38, 0x6c, 0x8e, 0x2c,
+			0x46, 0x0b, 0x6e, 0x01, 0x47, 0xd3, 0x2f, 0x58,
+			0xf8, 0xc7, 0x3b, 0x49, 0xb2, 0x35, 0x9f, 0x67,
+			0xc9, 0x6c, 0xde, 0x30, 0x3b, 0x50, 0x19, 0x65,
+			0xbb, 0x73, 0xa1, 0x47, 0x01, 0x6a, 0x3d, 0xe3,
+			0x85, 0x4d, 0xd0, 0x72, 0x0d, 0xbc, 0x81, 0x52,
+			0xe8, 0x1a, 0x8b, 0x85, 0x4c, 0x6f, 0x0e, 0xfc,
+			0x59, 0x84, 0x7a, 0xf2, 0x28, 0x3e, 0x02, 0xcb,
+			0xe2, 0x4a, 0xbf, 0xac, 0x22, 0x34, 0x86, 0xe4,
+			0x7d, 0x6b, 0xa3, 0x52, 0xac, 0xff, 0xe5, 0xbe,
+			0x0c, 0x8d, 0xf5, 0xd8, 0xfd, 0x5a, 0x3d, 0xad,
+			0x0d, 0xc0, 0x02, 0xd0, 0x58, 0x8e, 0x7c, 0x50,
+			0x7c, 0x09, 0xc0, 0xdb, 0xd7, 0xdf, 0xe0, 0xb2,
+			0x6f, 0xb2, 0x79, 0x0d, 0xc1, 0xa0, 0xb1, 0x7e,
+			0xe3, 0x0d, 0xfc, 0x93, 0x43, 0x8c, 0x86, 0x68,
+			0xa6, 0x51, 0x93, 0x42, 0xb7, 0xcd, 0x13, 0x56,
+			0x6e, 0xdc, 0x63, 0x51, 0x23, 0xcf, 0x29, 0xc5,
+			0x5a, 0x66, 0x43, 0x80, 0xfe, 0x28, 0x15, 0x71,
+			0x52, 0x87, 0xe2, 0x18, 0x10, 0xad, 0x94, 0x47,
+			0x2f, 0xe3, 0x5d, 0x7a, 0x02, 0x6d, 0x31, 0x58,
+			0xae, 0x2f, 0x96, 0x53, 0x1b, 0x6c, 0x0e, 0x25,
+			0xea, 0x41, 0xd3, 0x29, 0x27, 0x22, 0x24, 0x8d,
+			0x1d, 0x8e, 0xd1, 0x33, 0x76, 0x67, 0x7d, 0x9d,
+			0xd9, 0xa7, 0x3e, 0x61, 0xd0, 0xad, 0x93, 0xb9,
+			0xdf, 0x87, 0x3a, 0x7b, 0x89, 0xc7, 0x1d, 0x91,
+			0xec, 0x43, 0xa4, 0xdc, 0x02, 0x88, 0x2e, 0xaa,
+			0xb2, 0x58, 0xa5, 0xd3, 0x68, 0x9c, 0x9f, 0x60,
+			0x12, 0xc8, 0x7e, 0x7d, 0x40, 0x80, 0xfd, 0xb4,
+			0xbf, 0x56, 0xf4, 0x01, 0x39, 0x3d, 0xa0, 0x34,
+			0x48, 0x79, 0x75, 0xe2, 0x0f, 0x60, 0x09, 0x42,
+			0x11, 0x6f, 0xa5, 0x31, 0x46, 0xb7, 0x03, 0xc8,
+			0x61, 0x53, 0x39, 0x1e, 0xf4, 0x99, 0x36, 0x7d,
+			0xc0, 0x87, 0xda, 0x63, 0x71, 0x9b, 0x29, 0x7b,
+			0x4e, 0x6f, 0x09, 0xa2, 0x2c, 0xa5, 0xc2, 0xb9,
+			0xe7, 0xe0, 0x56, 0x8b, 0x1d, 0xbb, 0xcc, 0x34,
+			0x8c, 0xbc, 0xb6, 0x0a, 0xc9, 0xfa, 0x4a, 0x31,
+			0x63, 0x0d, 0x30, 0xff, 0x59, 0x3d, 0x8c, 0x4d,
+			0x74, 0x28, 0xf4, 0xe9, 0x97, 0x43, 0x05, 0x3a,
+			0x33, 0x51, 0x51, 0xe4, 0x0e, 0x33, 0xae, 0x2c,
+			0xda, 0x28, 0x83, 0x93, 0x4e, 0xfe, 0x37, 0x1d,
+			0x6c, 0x25, 0x1e, 0x24, 0xbc, 0x3a, 0x5c, 0x68,
+			0xac, 0x54, 0x3a, 0x47, 0x74, 0x35, 0xff, 0x37,
+			0x80, 0x12, 0x30, 0xd7, 0x31, 0x2a, 0x49, 0x51,
+			0x2d, 0x4f, 0xd2, 0x9c, 0xca, 0x55, 0x87, 0xd0,
+			0x41, 0x86, 0xc7, 0xf2, 0xda, 0xf8, 0x4b, 0x08,
+			0x23, 0xb3, 0x00, 0xb7, 0xb6, 0x4f, 0x2e, 0xaf,
+			0xb8, 0x8e, 0xb1, 0x44, 0xe1, 0xed, 0x67, 0xf8,
+			0x80, 0xa7, 0x04, 0xa0, 0x66, 0xe6, 0xb5, 0x69,
+			0xca, 0x95, 0x71, 0xc8, 0x0d, 0x3d, 0xf6, 0x77,
+			0xfd, 0x2c, 0x95, 0xed, 0xe5, 0x22, 0x43, 0xd9,
+		},
+		.msg_len = 64,
+		.msg = (const u8[64]){
+			0x6d, 0xb3, 0x8e, 0x80, 0xaf, 0x5f, 0x19, 0xd9,
+			0xb0, 0xcf, 0xad, 0x58, 0xc7, 0x27, 0xae, 0x12,
+			0x4e, 0x7d, 0xa3, 0x1a, 0xe3, 0x85, 0xc6, 0xaa,
+			0xf6, 0xa1, 0x9a, 0xb1, 0xe9, 0xe0, 0xfe, 0x89,
+			0x1e, 0xc5, 0x6f, 0x10, 0x18, 0x24, 0xab, 0xa8,
+			0x6d, 0x03, 0xd0, 0x3d, 0xc3, 0xff, 0x67, 0xe7,
+			0x3a, 0x95, 0x94, 0xc8, 0x49, 0x51, 0x8f, 0xa0,
+			0x65, 0xcb, 0x20, 0x29, 0x2a, 0x6d, 0xf7, 0xf2,
+		},
+		.sig_len = DILITHIUM44_CRYPTO_BYTES,
+		.sig = (const u8[DILITHIUM44_CRYPTO_BYTES]){
+			0x5e, 0x05, 0x37, 0xe2, 0xc1, 0x20, 0xce, 0x7b,
+			0x8a, 0xdf, 0xf2, 0x22, 0x61, 0x17, 0x58, 0xaa,
+			0x3c, 0xe4, 0x82, 0x9c, 0x0e, 0xb6, 0x1f, 0xb4,
+			0x98, 0x0f, 0xba, 0x8e, 0x51, 0x15, 0x67, 0x76,
+			0x0b, 0x98, 0x63, 0xda, 0x17, 0xd3, 0xbb, 0xbe,
+			0x16, 0x29, 0x71, 0xab, 0xba, 0x99, 0xed, 0x3f,
+			0xd4, 0xc2, 0x16, 0x71, 0xb6, 0x21, 0x87, 0x48,
+			0xaa, 0xb5, 0x39, 0x5e, 0xfb, 0x5d, 0x68, 0x3b,
+			0xd3, 0x60, 0xf4, 0x5b, 0x85, 0x2a, 0x5b, 0xb5,
+			0xce, 0x6e, 0xf3, 0x39, 0xc3, 0xbe, 0x96, 0xa7,
+			0x61, 0xc9, 0xbf, 0xdf, 0x33, 0x1d, 0xec, 0xb9,
+			0x2b, 0x7a, 0x05, 0xce, 0x1e, 0xd9, 0x46, 0x70,
+			0xca, 0x54, 0xbf, 0xdc, 0x46, 0x9e, 0x2f, 0x29,
+			0x18, 0x57, 0x96, 0x84, 0xac, 0xe9, 0xd7, 0x74,
+			0xeb, 0x8e, 0x6b, 0xec, 0x46, 0x9a, 0x2a, 0xfa,
+			0xde, 0x80, 0x09, 0x53, 0xd9, 0xeb, 0x9d, 0xf7,
+			0xaa, 0xe2, 0xe5, 0xdc, 0xc3, 0xd9, 0x70, 0xe5,
+			0x8b, 0xa8, 0xba, 0x2b, 0x41, 0x72, 0x92, 0x25,
+			0xaf, 0xd9, 0xb4, 0x5a, 0x53, 0xb7, 0xcc, 0x1d,
+			0x69, 0xf1, 0x53, 0x5b, 0x52, 0x38, 0xbc, 0x47,
+			0x24, 0x8c, 0x1d, 0x28, 0x5d, 0x5c, 0x1c, 0xc9,
+			0x9d, 0xea, 0x1c, 0xb1, 0xb3, 0x49, 0x68, 0xd5,
+			0xad, 0xdc, 0x47, 0x58, 0x6d, 0x38, 0x33, 0xe7,
+			0x9b, 0xaa, 0x89, 0xb1, 0x96, 0x0b, 0xcb, 0xc4,
+			0x24, 0x73, 0xf2, 0xe7, 0xb6, 0xca, 0x74, 0x55,
+			0x1b, 0xb5, 0xb7, 0x9e, 0x2e, 0xe3, 0x3a, 0x32,
+			0x5d, 0x1d, 0x6e, 0x15, 0xe6, 0xb8, 0xfb, 0xce,
+			0x57, 0x81, 0x15, 0xb5, 0xcf, 0x67, 0x2b, 0x55,
+			0x4c, 0x85, 0x6f, 0x28, 0xa6, 0xbb, 0xb4, 0x28,
+			0x76, 0x91, 0xa4, 0x29, 0xa1, 0x50, 0x7c, 0xed,
+			0x9a, 0xfc, 0xe4, 0xbc, 0xd7, 0x28, 0x62, 0x28,
+			0x61, 0x4d, 0x8d, 0x8c, 0x5a, 0x5e, 0x4d, 0x1d,
+			0x5e, 0x73, 0xcc, 0x0b, 0x9d, 0x56, 0x73, 0xc7,
+			0xf2, 0x26, 0xf7, 0x7e, 0x61, 0xa4, 0x86, 0xf5,
+			0x1c, 0xd1, 0x00, 0xd0, 0x31, 0xc5, 0x03, 0x17,
+			0x1c, 0xec, 0x04, 0xe5, 0xc7, 0x13, 0xb6, 0x81,
+			0x78, 0x3d, 0x27, 0x87, 0x36, 0xf3, 0x2a, 0x59,
+			0x96, 0xeb, 0x44, 0xfd, 0xb9, 0x95, 0xb7, 0x76,
+			0xb1, 0x08, 0xc4, 0x98, 0xb1, 0x08, 0x36, 0x2a,
+			0x63, 0x72, 0x4f, 0xef, 0x47, 0xfc, 0x84, 0x09,
+			0x18, 0x60, 0xb7, 0x8a, 0xff, 0xae, 0x32, 0x3c,
+			0x79, 0xdf, 0xd6, 0x24, 0xbe, 0x9c, 0x38, 0x68,
+			0x92, 0xde, 0x81, 0x80, 0x22, 0x06, 0xf2, 0xe4,
+			0xde, 0x75, 0x4e, 0xd6, 0x36, 0x93, 0x44, 0xd1,
+			0xa4, 0x2e, 0x2e, 0x05, 0x87, 0xbd, 0xf7, 0xc5,
+			0xc8, 0x1c, 0x7b, 0x00, 0xe8, 0x11, 0x7f, 0xc2,
+			0x39, 0x4b, 0x7b, 0x97, 0x11, 0x92, 0x6c, 0xff,
+			0x89, 0x7f, 0x26, 0x89, 0x4f, 0x38, 0xfd, 0xdd,
+			0x08, 0xa7, 0xce, 0x6f, 0xe8, 0x57, 0x9b, 0x46,
+			0xe5, 0xdb, 0x72, 0x03, 0x1e, 0x7d, 0xb0, 0x77,
+			0xb9, 0xcc, 0xdb, 0x6c, 0xa7, 0xd8, 0x30, 0x34,
+			0xad, 0xa7, 0xe4, 0x63, 0xf0, 0x19, 0x0e, 0x5d,
+			0x3b, 0xe0, 0xff, 0x40, 0x1c, 0xa5, 0xb3, 0xb9,
+			0x87, 0x6e, 0x2c, 0xf3, 0x5f, 0xcd, 0x54, 0x2a,
+			0xc0, 0x6e, 0x2b, 0xd9, 0x2d, 0xcc, 0xd5, 0x68,
+			0x95, 0x4a, 0x4a, 0x84, 0x60, 0x54, 0xee, 0xa0,
+			0x21, 0x9e, 0x8d, 0x20, 0xcb, 0xe8, 0xc5, 0x5a,
+			0xba, 0xe2, 0xaa, 0x6e, 0x1c, 0xb1, 0xdf, 0x18,
+			0x9f, 0x94, 0xc7, 0x77, 0x5a, 0x2c, 0x0e, 0x05,
+			0xaa, 0x2a, 0x54, 0x58, 0x6c, 0xb3, 0x2e, 0x2f,
+			0xa4, 0x6e, 0x98, 0xbb, 0x6f, 0x41, 0x6d, 0xbd,
+			0x71, 0x95, 0xe4, 0xbc, 0x13, 0x37, 0x99, 0x0d,
+			0xac, 0x27, 0x69, 0xb9, 0x0b, 0x14, 0x5f, 0x6e,
+			0xd2, 0x2b, 0xe2, 0x0c, 0xc6, 0xbc, 0x10, 0x11,
+			0x47, 0xb7, 0x37, 0x2c, 0x0e, 0x88, 0xcd, 0xbb,
+			0xf7, 0x28, 0xd6, 0x4a, 0x9d, 0xff, 0x3c, 0x2f,
+			0x7d, 0x2b, 0xe8, 0xe8, 0x9e, 0xae, 0x7b, 0xe6,
+			0x2a, 0xb3, 0x4e, 0x20, 0xcc, 0xf1, 0x81, 0x8e,
+			0xed, 0x6d, 0xe2, 0x99, 0xf5, 0xb5, 0x1a, 0x30,
+			0x95, 0x52, 0x34, 0xf5, 0x3f, 0xc3, 0x31, 0xd6,
+			0xbe, 0xa2, 0xc8, 0xdc, 0xe4, 0x1c, 0xf6, 0x0f,
+			0x4d, 0x0b, 0x89, 0x8e, 0x66, 0x93, 0x88, 0xb8,
+			0xad, 0xbc, 0xdc, 0x96, 0x01, 0x9f, 0x16, 0x70,
+			0xf5, 0x4f, 0xa4, 0x0e, 0x0f, 0xc3, 0xf6, 0x9c,
+			0xe1, 0xa1, 0xe3, 0xec, 0x9d, 0x09, 0xcd, 0x90,
+			0x52, 0x26, 0x09, 0xd9, 0x9c, 0xde, 0xbd, 0xdf,
+			0xbb, 0xf4, 0x50, 0xd1, 0x89, 0x68, 0xf6, 0x86,
+			0x53, 0x33, 0x5a, 0xf6, 0x54, 0xb5, 0x7c, 0xe1,
+			0xd7, 0x8d, 0xb8, 0x58, 0xf5, 0xda, 0x14, 0xc8,
+			0x35, 0x1c, 0xcf, 0x44, 0x62, 0xbc, 0xd7, 0xe3,
+			0xd8, 0x32, 0xcf, 0x16, 0xf5, 0x2f, 0x55, 0x23,
+			0xc0, 0x1b, 0xc4, 0xe3, 0x28, 0xc8, 0xc8, 0x97,
+			0x70, 0x8b, 0x06, 0x98, 0xfb, 0xf6, 0x33, 0x6b,
+			0x86, 0x1c, 0xdb, 0x2a, 0x3c, 0x08, 0x08, 0x57,
+			0xd3, 0x4a, 0xf8, 0x22, 0x26, 0x78, 0x65, 0x5f,
+			0xa6, 0xf8, 0x9f, 0x22, 0x76, 0x62, 0xb0, 0x08,
+			0x68, 0x70, 0xea, 0x72, 0x57, 0x6b, 0xe7, 0xf7,
+			0xc6, 0x12, 0x9a, 0x49, 0x50, 0xa9, 0xa5, 0x6c,
+			0xe7, 0xda, 0xb4, 0xbf, 0xb6, 0xbf, 0x4f, 0xdf,
+			0x9e, 0x9b, 0xb4, 0xb3, 0x8d, 0x1a, 0x12, 0x16,
+			0x68, 0xd2, 0x63, 0xae, 0x92, 0x77, 0x1f, 0x03,
+			0xa5, 0xed, 0x58, 0x3b, 0xe9, 0x0b, 0xfe, 0xfc,
+			0xae, 0x53, 0x0b, 0x5f, 0x13, 0xf2, 0xd2, 0xe2,
+			0x0b, 0xec, 0x75, 0x85, 0x68, 0x0c, 0x57, 0xde,
+			0x1b, 0x6d, 0x78, 0x0b, 0x19, 0x66, 0xa8, 0xf5,
+			0x45, 0x72, 0x2b, 0x01, 0x06, 0xf6, 0xd1, 0x47,
+			0x21, 0x24, 0x07, 0xf7, 0x71, 0x03, 0xbc, 0xb0,
+			0x7c, 0x5b, 0x5c, 0x24, 0xff, 0x74, 0x47, 0x62,
+			0x81, 0xc3, 0x0b, 0x31, 0x76, 0x90, 0x5b, 0xef,
+			0x95, 0xa8, 0xa7, 0x02, 0xa1, 0xbf, 0xe1, 0xf4,
+			0x16, 0x06, 0x8a, 0x97, 0x39, 0x35, 0xcf, 0xf3,
+			0xa7, 0x4a, 0x43, 0xba, 0x05, 0x95, 0x7d, 0x73,
+			0x76, 0x7a, 0x53, 0xef, 0xf8, 0x4e, 0xcb, 0x04,
+			0x70, 0x4c, 0xee, 0xff, 0x82, 0xbd, 0xcd, 0xc1,
+			0xbe, 0x3d, 0x83, 0x71, 0x03, 0xf0, 0xc0, 0x2b,
+			0x98, 0xf9, 0x60, 0x54, 0x02, 0x7d, 0xa6, 0x41,
+			0xcc, 0xa3, 0xd7, 0x8d, 0xfd, 0xce, 0x28, 0xae,
+			0x0f, 0x48, 0x17, 0x2a, 0xaf, 0xe9, 0xb9, 0x4a,
+			0x8a, 0x22, 0xd2, 0x4d, 0xd3, 0x1b, 0xa3, 0x39,
+			0x88, 0x8a, 0x8f, 0x5b, 0x44, 0x97, 0xb9, 0x04,
+			0x1b, 0x58, 0x67, 0x74, 0x2f, 0x07, 0x7a, 0x52,
+			0xa9, 0x9d, 0xa4, 0x41, 0x28, 0xf2, 0x35, 0xca,
+			0x68, 0x4e, 0x4a, 0x3a, 0x66, 0xb9, 0x88, 0x2e,
+			0x65, 0x1d, 0x47, 0x04, 0xed, 0xdb, 0xe1, 0x40,
+			0x12, 0x06, 0x13, 0x62, 0x28, 0x3d, 0x0b, 0x35,
+			0x06, 0xc6, 0x2b, 0xb3, 0x71, 0x3c, 0xfa, 0x77,
+			0xec, 0x47, 0x93, 0x78, 0x36, 0x25, 0x19, 0xd7,
+			0x70, 0x30, 0x8a, 0x4c, 0x94, 0xdc, 0x3e, 0xeb,
+			0x61, 0x25, 0xbc, 0xa0, 0x27, 0xd9, 0x17, 0xa5,
+			0x19, 0x4f, 0xf4, 0x93, 0x32, 0x56, 0x9a, 0x0b,
+			0x77, 0xb4, 0x55, 0x1b, 0x8f, 0x9e, 0x69, 0x5b,
+			0xe2, 0x6d, 0x70, 0x15, 0x79, 0x5c, 0xf6, 0xb6,
+			0x04, 0xa2, 0x01, 0x37, 0x74, 0x20, 0xb8, 0x62,
+			0xf6, 0x37, 0x3c, 0xab, 0xca, 0x71, 0xa5, 0x8a,
+			0x56, 0x5d, 0x6a, 0x4a, 0x61, 0x2e, 0xb8, 0x62,
+			0x7d, 0x47, 0x34, 0x7d, 0xcd, 0x4d, 0x70, 0x23,
+			0xf5, 0xaa, 0xd1, 0xa5, 0xf0, 0x4c, 0x38, 0xc3,
+			0x98, 0x79, 0x4c, 0x0b, 0x6b, 0xcc, 0xe7, 0xd7,
+			0x09, 0xae, 0x23, 0x9b, 0x2f, 0xde, 0x70, 0xc6,
+			0xad, 0x0f, 0x66, 0xb5, 0x78, 0x6b, 0x0b, 0xb0,
+			0x2e, 0x94, 0xf2, 0xa8, 0x8b, 0x74, 0xf0, 0x03,
+			0x47, 0xd8, 0xec, 0xe8, 0x1f, 0xa3, 0x7b, 0x38,
+			0x9e, 0x0e, 0xc0, 0x47, 0xd2, 0x0f, 0x8e, 0x7f,
+			0xb1, 0x83, 0xd3, 0x86, 0x79, 0x3c, 0xa1, 0xae,
+			0xc4, 0xaf, 0xae, 0x9d, 0x83, 0xc0, 0xd1, 0x2b,
+			0x2b, 0xda, 0x50, 0x8c, 0xea, 0x41, 0x97, 0x9b,
+			0x0f, 0x15, 0xc2, 0xe2, 0x8f, 0x39, 0x0b, 0x92,
+			0xdd, 0xde, 0x52, 0x62, 0x74, 0xdc, 0xda, 0x11,
+			0x87, 0x4d, 0xa9, 0x4a, 0xc5, 0x2f, 0xae, 0xaf,
+			0xc1, 0xc3, 0x05, 0xfa, 0x38, 0xcc, 0x5c, 0xb1,
+			0x9f, 0xe0, 0x82, 0x90, 0xb3, 0xd5, 0xdc, 0xf4,
+			0x55, 0xdb, 0xea, 0x94, 0x06, 0x7c, 0x2c, 0x82,
+			0x78, 0xeb, 0xa5, 0x01, 0xf0, 0x3d, 0x4b, 0x87,
+			0xdd, 0xd5, 0x91, 0x4f, 0xf3, 0xa7, 0xdf, 0xa1,
+			0xd8, 0x31, 0xde, 0x05, 0x99, 0x67, 0x3d, 0xa4,
+			0x6b, 0x19, 0xa3, 0xe8, 0x55, 0xb7, 0xf5, 0xc3,
+			0x63, 0x5e, 0xd4, 0x38, 0xf9, 0x24, 0x64, 0x7d,
+			0x17, 0xc1, 0x07, 0xbe, 0x39, 0x54, 0x1b, 0x44,
+			0xe5, 0xc6, 0x3c, 0x02, 0xb1, 0x6f, 0xff, 0x8c,
+			0xcb, 0x79, 0xe2, 0xec, 0x4d, 0x01, 0xfa, 0x7f,
+			0x88, 0x1d, 0xc3, 0x4c, 0x6a, 0xfb, 0x0b, 0xc6,
+			0x57, 0xc3, 0xd8, 0x24, 0x47, 0x41, 0xbd, 0x27,
+			0xc4, 0xd4, 0x49, 0xfb, 0x52, 0xe6, 0x77, 0x5f,
+			0x0a, 0xdf, 0xea, 0xd5, 0xd3, 0x22, 0xc3, 0x53,
+			0x16, 0xf3, 0x1b, 0x7b, 0x09, 0xd7, 0x10, 0x0e,
+			0x23, 0xae, 0x16, 0x8a, 0x93, 0xcb, 0xc9, 0xb7,
+			0xb8, 0xff, 0xd2, 0x50, 0x1f, 0x25, 0xa7, 0x71,
+			0x8f, 0x3f, 0xc0, 0xe1, 0x37, 0x10, 0x0b, 0x43,
+			0x6e, 0x2b, 0x16, 0x59, 0x8f, 0x77, 0x77, 0x6b,
+			0x77, 0xce, 0x76, 0x6b, 0x37, 0x81, 0xaf, 0x83,
+			0x42, 0x92, 0x93, 0xe5, 0x39, 0xca, 0xd2, 0x20,
+			0x2e, 0xcf, 0x24, 0x26, 0x4c, 0x51, 0x1c, 0x58,
+			0xc5, 0x8d, 0x05, 0x11, 0xdf, 0xae, 0x51, 0x38,
+			0xde, 0xab, 0x4e, 0x04, 0xc8, 0x24, 0x24, 0x0d,
+			0xd5, 0x9c, 0x5b, 0x2b, 0xe6, 0x0d, 0x83, 0x95,
+			0xcd, 0x1c, 0x89, 0xa1, 0xaf, 0x67, 0x47, 0xfb,
+			0x08, 0x02, 0xf8, 0x8b, 0x63, 0x05, 0x73, 0x20,
+			0x64, 0xd7, 0x52, 0x15, 0xa4, 0x5d, 0x63, 0x73,
+			0x73, 0x12, 0x0b, 0xdd, 0xfe, 0x9f, 0xb7, 0xe8,
+			0xa8, 0x94, 0x3a, 0x86, 0xff, 0xcf, 0x7d, 0x24,
+			0xbd, 0xb9, 0xea, 0x68, 0x23, 0xf4, 0x07, 0xc3,
+			0xfe, 0x63, 0xd0, 0xab, 0x65, 0x8a, 0xf0, 0x6d,
+			0x81, 0x8c, 0xc8, 0x0e, 0xc6, 0x6b, 0xdd, 0x2e,
+			0x65, 0x9b, 0x17, 0xcf, 0x82, 0x69, 0x46, 0xba,
+			0x62, 0x5d, 0x31, 0x33, 0x60, 0x18, 0x94, 0xa5,
+			0x77, 0x24, 0xc6, 0x45, 0xe5, 0xb3, 0xd5, 0x12,
+			0x10, 0xc9, 0x22, 0x98, 0xf9, 0xca, 0x20, 0x89,
+			0x79, 0x04, 0x08, 0xf5, 0x1c, 0xf8, 0x50, 0x8c,
+			0x25, 0xaa, 0x90, 0x90, 0x44, 0xbc, 0xfb, 0x5d,
+			0x3f, 0xf8, 0x38, 0x64, 0xca, 0x8d, 0xff, 0x17,
+			0xce, 0x70, 0x51, 0x90, 0x75, 0x6b, 0x7d, 0x64,
+			0x43, 0x56, 0xcd, 0xf8, 0x85, 0x93, 0x65, 0x09,
+			0x81, 0x30, 0x76, 0x79, 0xcc, 0xdf, 0x9c, 0x6d,
+			0xff, 0x89, 0x38, 0x60, 0xbf, 0x07, 0xcb, 0x2f,
+			0xc9, 0x87, 0xd7, 0xac, 0x74, 0x19, 0x57, 0x90,
+			0x5e, 0x69, 0x61, 0xf6, 0xca, 0xea, 0x45, 0x6b,
+			0xe2, 0xfe, 0x2c, 0xff, 0x1b, 0x23, 0x15, 0x52,
+			0xdd, 0x57, 0xfe, 0x1d, 0x10, 0xea, 0x0f, 0xce,
+			0x98, 0xe7, 0x47, 0x27, 0xec, 0x36, 0xe5, 0x68,
+			0x17, 0xcf, 0xdc, 0xb9, 0xef, 0x6a, 0xbc, 0xec,
+			0x78, 0x08, 0x64, 0x06, 0xe1, 0x1c, 0xc6, 0x87,
+			0xd6, 0x0a, 0xb1, 0x81, 0xc6, 0xb6, 0xf8, 0x8b,
+			0xe3, 0x19, 0x8c, 0xce, 0x46, 0x40, 0xc5, 0xc2,
+			0xae, 0x50, 0x26, 0x4a, 0x90, 0x91, 0x8d, 0xfe,
+			0x6b, 0x7d, 0x0a, 0x54, 0x4a, 0x4b, 0x48, 0x74,
+			0x4a, 0x37, 0x21, 0x7f, 0xdd, 0x87, 0xa3, 0x1e,
+			0xac, 0xcd, 0xf5, 0x9e, 0x75, 0xa2, 0x52, 0x63,
+			0x76, 0xca, 0x9e, 0x02, 0xeb, 0xe6, 0xa6, 0x73,
+			0xad, 0xea, 0xe8, 0x3e, 0x6f, 0x44, 0xed, 0xe8,
+			0x01, 0x29, 0x19, 0x6a, 0x20, 0x35, 0xa7, 0xf0,
+			0xf1, 0xaf, 0xc0, 0x3b, 0xb1, 0xd5, 0xe4, 0xfb,
+			0xf7, 0xd7, 0x2f, 0x33, 0x6c, 0x73, 0xfd, 0xe5,
+			0x5c, 0x63, 0xf6, 0x1c, 0x06, 0x13, 0xaf, 0xc1,
+			0x80, 0x55, 0x07, 0xae, 0x8c, 0x13, 0x74, 0xf6,
+			0xe0, 0x54, 0x15, 0xd8, 0xe0, 0xa5, 0x03, 0xcf,
+			0x22, 0xbe, 0x18, 0xef, 0x26, 0xad, 0x9c, 0x9d,
+			0x51, 0xb1, 0x3b, 0x37, 0x03, 0xbf, 0xf0, 0xc5,
+			0xcb, 0x6c, 0x5d, 0x30, 0xa9, 0x5a, 0x10, 0x90,
+			0xfa, 0xb4, 0xd4, 0x0e, 0x6b, 0x4a, 0x0a, 0x6c,
+			0x9d, 0x2e, 0x69, 0xe8, 0xec, 0x69, 0xe2, 0x50,
+			0xab, 0x2f, 0xdc, 0xff, 0xaf, 0xac, 0x65, 0xe7,
+			0xf0, 0xc1, 0x6f, 0x7c, 0x2d, 0xa1, 0xeb, 0x97,
+			0x90, 0x7c, 0x1e, 0xa8, 0x53, 0x1b, 0x87, 0xc5,
+			0xa9, 0xa1, 0xcf, 0x86, 0x7e, 0x11, 0xf8, 0xd6,
+			0x14, 0xda, 0x19, 0x81, 0x19, 0xb4, 0x45, 0x1c,
+			0x7c, 0xb9, 0x96, 0xa2, 0xac, 0x79, 0x24, 0x94,
+			0x7c, 0xb2, 0x1e, 0x83, 0xea, 0xc4, 0xb9, 0xd2,
+			0x0d, 0x4c, 0x55, 0x3d, 0x15, 0x7b, 0x65, 0xd8,
+			0xff, 0x03, 0x5d, 0xed, 0x3c, 0x94, 0x76, 0x19,
+			0x40, 0x3b, 0xcc, 0x45, 0xbe, 0x91, 0x19, 0x8c,
+			0x75, 0xe5, 0xd2, 0xbe, 0x67, 0x40, 0xb1, 0x67,
+			0x8e, 0x2a, 0x34, 0xd5, 0x99, 0xee, 0xd9, 0x4f,
+			0x89, 0x7c, 0xf0, 0xd6, 0x93, 0x59, 0x4b, 0x3a,
+			0x8d, 0xe6, 0xbd, 0xde, 0xce, 0xef, 0x8b, 0x3c,
+			0xe3, 0xf7, 0x06, 0x33, 0x27, 0x8d, 0xd9, 0x22,
+			0x1a, 0x65, 0x40, 0xfc, 0x69, 0x1b, 0x7d, 0xf0,
+			0xed, 0xe4, 0xe0, 0x7f, 0x6d, 0x23, 0xed, 0x11,
+			0xd1, 0x07, 0xb0, 0x2f, 0x8a, 0xbf, 0x51, 0x37,
+			0x22, 0x04, 0xed, 0x93, 0xea, 0x1d, 0x0b, 0x30,
+			0x15, 0x89, 0x22, 0x7a, 0x45, 0x56, 0x99, 0xc6,
+			0xac, 0xd6, 0xce, 0x61, 0xea, 0xb2, 0x59, 0xe8,
+			0xb5, 0xfc, 0x87, 0xa7, 0xfe, 0x09, 0xa2, 0x0d,
+			0x5e, 0xbe, 0xb9, 0xd4, 0x9a, 0x1b, 0x60, 0xda,
+			0xb9, 0x32, 0xf1, 0x30, 0x3e, 0xb2, 0x45, 0x6d,
+			0x55, 0x0c, 0x2c, 0x4b, 0x9a, 0xc0, 0xbb, 0x8e,
+			0xac, 0x9c, 0x95, 0x5f, 0x08, 0x88, 0xa0, 0x53,
+			0x05, 0x75, 0x8d, 0x9e, 0x9d, 0x3f, 0x0f, 0xdd,
+			0x50, 0x0d, 0xf8, 0x11, 0xbd, 0xf9, 0xfb, 0x22,
+			0x5c, 0x7b, 0x9e, 0x7c, 0x8e, 0x2f, 0x0e, 0xdb,
+			0xb8, 0x1d, 0x0c, 0x5e, 0x82, 0xf3, 0x8e, 0xec,
+			0x32, 0x1c, 0x59, 0x73, 0xa5, 0xf3, 0x5b, 0x47,
+			0x00, 0x64, 0x89, 0x68, 0x3b, 0xaf, 0xe8, 0xe2,
+			0x9b, 0xa6, 0xac, 0x2c, 0xf9, 0x2b, 0x92, 0xf3,
+			0xf0, 0x5b, 0xcc, 0x75, 0x22, 0xd5, 0xf4, 0x2b,
+			0x06, 0x96, 0xc8, 0x50, 0xee, 0xac, 0x62, 0x16,
+			0x45, 0x9e, 0xbc, 0xcc, 0x8f, 0x5a, 0x66, 0xc6,
+			0x30, 0x7c, 0xe0, 0x22, 0xcc, 0xb9, 0xda, 0x0b,
+			0x0a, 0xbd, 0x2a, 0x2e, 0x46, 0x7d, 0xb6, 0x86,
+			0x70, 0xa3, 0x16, 0x49, 0x85, 0x28, 0x7b, 0xe9,
+			0x00, 0x6b, 0xfa, 0x06, 0xb0, 0xeb, 0xbd, 0x67,
+			0x28, 0x6f, 0x27, 0xd7, 0x9c, 0x7f, 0xda, 0xec,
+			0xf4, 0x7e, 0x55, 0xe1, 0x0c, 0x29, 0x61, 0x7a,
+			0xf5, 0xb6, 0xb8, 0xa5, 0xef, 0x36, 0x6a, 0xad,
+			0x59, 0x22, 0xbd, 0x3d, 0xad, 0x86, 0xe7, 0x4c,
+			0x69, 0x26, 0x0f, 0xbf, 0x67, 0xad, 0x65, 0x32,
+			0xbd, 0x21, 0xd6, 0x59, 0x6b, 0xe3, 0xda, 0xc1,
+			0x6f, 0x82, 0x41, 0x2c, 0xaa, 0xe4, 0x8c, 0xfc,
+			0x7c, 0x61, 0x28, 0x51, 0x52, 0x3d, 0xf1, 0x84,
+			0xb5, 0x0b, 0xfd, 0x1f, 0x2a, 0x06, 0x2e, 0x30,
+			0xed, 0x63, 0x43, 0xc9, 0x83, 0x97, 0xb1, 0xd4,
+			0x80, 0x6f, 0x2c, 0x50, 0xec, 0x20, 0x95, 0x42,
+			0xa0, 0x34, 0x94, 0x1a, 0xa9, 0x5e, 0x5b, 0x59,
+			0xe3, 0x39, 0xac, 0xbd, 0x2f, 0x77, 0x36, 0x59,
+			0x9c, 0xc3, 0x3c, 0x66, 0x87, 0xf5, 0x81, 0x4b,
+			0xb0, 0x10, 0x4a, 0xe6, 0x46, 0xe7, 0xce, 0x93,
+			0x7b, 0x24, 0x6b, 0x2e, 0xc1, 0xe5, 0xaf, 0x4b,
+			0x71, 0x22, 0xad, 0x88, 0xda, 0x55, 0xcb, 0xe0,
+			0x73, 0xd1, 0x65, 0x7d, 0xa5, 0x7f, 0x36, 0xbc,
+			0x42, 0xc2, 0x78, 0x9f, 0x88, 0xe8, 0xdb, 0xff,
+			0x8a, 0x5a, 0x80, 0x34, 0x3a, 0x23, 0x4c, 0x8a,
+			0x81, 0xff, 0xbd, 0xb7, 0x88, 0xd0, 0x73, 0x07,
+			0x8a, 0x4e, 0xa7, 0x4a, 0x61, 0x0f, 0x1f, 0x1c,
+			0xe7, 0x34, 0x37, 0x1c, 0x53, 0x90, 0x3b, 0xa4,
+			0x32, 0x6c, 0x6d, 0xe8, 0x00, 0xde, 0xe0, 0x0c,
+			0x5e, 0x06, 0xef, 0xb8, 0x48, 0x2e, 0xb3, 0xda,
+			0xac, 0x92, 0x4d, 0x0d, 0x95, 0x75, 0x44, 0x01,
+			0x6f, 0x97, 0xc3, 0x29, 0x76, 0x33, 0x36, 0x9a,
+			0xae, 0xfb, 0x1b, 0x43, 0xe5, 0xb1, 0x54, 0x3a,
+			0x9c, 0x76, 0x7f, 0x76, 0x83, 0xc9, 0x9c, 0xd6,
+			0x56, 0x59, 0x83, 0xa9, 0xde, 0xd7, 0xb0, 0xf3,
+			0x34, 0x11, 0x31, 0x06, 0x8e, 0xe9, 0xd4, 0x79,
+			0xd5, 0x3d, 0x31, 0x6b, 0x59, 0xe9, 0x54, 0x69,
+			0x12, 0xfd, 0x44, 0x59, 0x4e, 0x1b, 0x3b, 0xb4,
+			0x12, 0xe9, 0xfb, 0xb0, 0xb4, 0x84, 0xb9, 0x7d,
+			0xea, 0x4f, 0xd1, 0x5f, 0xd0, 0x3e, 0xce, 0xef,
+			0x5c, 0xf7, 0xea, 0x55, 0xa0, 0x8f, 0xa8, 0xa7,
+			0x98, 0xe7, 0xa1, 0x6b, 0x3f, 0xba, 0x5a, 0x32,
+			0x4b, 0xfa, 0x31, 0xb6, 0x63, 0x86, 0x19, 0x00,
+			0xa2, 0x6d, 0x7d, 0x15, 0x56, 0x05, 0x68, 0xa3,
+			0xe0, 0xf3, 0xd4, 0x82, 0xcf, 0xeb, 0xd4, 0x1c,
+			0xd0, 0xb6, 0x14, 0x5e, 0x9e, 0x6b, 0xed, 0x7a,
+			0x02, 0x1a, 0xcd, 0x09, 0xdc, 0x26, 0x98, 0x50,
+			0x11, 0x34, 0x39, 0x50, 0x5a, 0x70, 0x79, 0x85,
+			0xca, 0xd2, 0xf2, 0x0c, 0x0d, 0x12, 0x1f, 0x2e,
+			0x41, 0x46, 0x51, 0x72, 0x75, 0x78, 0x8c, 0xa4,
+			0xaf, 0xba, 0xca, 0xd3, 0xdf, 0xea, 0xf8, 0x09,
+			0x0b, 0x36, 0x45, 0x4f, 0x77, 0x83, 0xae, 0xbc,
+			0xc5, 0xce, 0xe1, 0xf6, 0x1d, 0x1e, 0x38, 0x56,
+			0x9c, 0x9f, 0xb1, 0xbd, 0xda, 0xe7, 0xf0, 0xf4,
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x0b, 0x1f, 0x2c, 0x38,
+		},
+	},


^ permalink raw reply related

* [PATCH v8 3/9] mldsa: Add a simpler API
From: David Howells @ 2025-11-14 13:04 UTC (permalink / raw)
  To: Herbert Xu
  Cc: David Howells, Eric Biggers, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Jason A . Donenfeld, Ard Biesheuvel,
	Stephan Mueller, Lukas Wunner, Ignat Korchagin, linux-crypto,
	keyrings, linux-modules, linux-kernel
In-Reply-To: <20251114130417.1756230-1-dhowells@redhat.com>

Add a simpler ML-DSA API to hide all the details of packing/unpacking keys
and signatures.

Signed-off-by: David Howells <dhowells@redhat.com>
---
 Documentation/crypto/index.rst  |   1 +
 Documentation/crypto/mldsa.rst  | 111 +++++++++++++++++++
 include/crypto/mldsa.h          |  34 ++++++
 lib/crypto/mldsa/Makefile       |   3 +-
 lib/crypto/mldsa/crypto_mldsa.c |   4 +-
 lib/crypto/mldsa/mldsa_api.c    | 186 ++++++++++++++++++++++++++++++++
 6 files changed, 335 insertions(+), 4 deletions(-)
 create mode 100644 Documentation/crypto/mldsa.rst
 create mode 100644 include/crypto/mldsa.h
 create mode 100644 lib/crypto/mldsa/mldsa_api.c

diff --git a/Documentation/crypto/index.rst b/Documentation/crypto/index.rst
index 4ee667c446f9..4498fc92bfc5 100644
--- a/Documentation/crypto/index.rst
+++ b/Documentation/crypto/index.rst
@@ -28,3 +28,4 @@ for cryptographic use cases, as well as programming examples.
    device_drivers/index
    krb5
    sha3
+   mldsa
diff --git a/Documentation/crypto/mldsa.rst b/Documentation/crypto/mldsa.rst
new file mode 100644
index 000000000000..3dcf9c0f1203
--- /dev/null
+++ b/Documentation/crypto/mldsa.rst
@@ -0,0 +1,111 @@
+.. SPDX-License-Identifier: GPL-2.0-or-later
+
+===========================
+ML-DSA Algorithm Collection
+===========================
+
+.. contents::
+
+   - Overview
+   - Library API
+   - References
+   - API Function Reference
+
+
+Overview
+========
+
+The ML-DSA algorithm, as specified in NIST FIPS-204 [1]_, is a "Post Quantum"
+asymmetric cipher/public key algorithm.  It has digestion of the message to be
+signed built in to the algorithm, though options exist to do that separately
+(those aren't supported in the API presented here, however).  The algorithm
+used to digest the message in this implementation is SHAKE256, though in theory
+other algorithms can be used too.
+
+This implementation only supports signature verification and does not support
+keypair generation or signing.
+
+Three strengths are provided:
+
+ - ML-DSA 44
+ - ML-DSA 65
+ - ML-DSA 87
+
+This document describes the ML-DSA library API.
+
+The algorithms are also available through the crypto_sig API, though
+`-EOPNOTSUPP` will be returned if any of the API functions involved in signing
+a message are invoked.
+
+
+Library API
+===========
+
+To use this::
+
+	#include <crypto/mldsa.h>
+
+must be included.
+
+To perform single-step verification of a signature, the following function can
+be used::
+
+	int mldsa_verify(enum mldsa_type type,
+			 const void *pk, size_t pk_len,
+			 const uint8_t *data, size_t data_len,
+			 const void *sig, size_t sig_len);
+
+This takes an optional key type, public key, signature and the complete message
+as a single buffer.  The type should be one of::
+
+	MLDSA_UNKNOWN
+	MLDSA_44
+	MLDSA_65
+	MLDSA_87
+
+It returns `-EINVAL` if the specified type (if known), the public key type and
+signature type don't all match.  It return `-EBADMSG` if the computed signature
+doesn't match the supplied one.
+
+If, however, the message to be verified is split into multiple fragments, then
+the multi-step API must be used.  Firstly, a context must be allocated::
+
+	struct mldsa_ctx *mldsa_ctx_alloc(enum mldsa_type type);
+
+this is type-specific as the size of the allocated state may vary by type.
+Then data can be added to the internal hash::
+
+	int mldsa_verify_update(struct mldsa_ctx *ctx,
+				const void *data, size_t data_len);
+
+And finally the signature verification can be performed::
+
+	int mldsa_verify_final(struct mldsa_ctx *ctx,
+			       const void *pk, size_t pk_len,
+			       const void *sig, size_t sig_len);
+
+This returns `-EINVAL` if the specified type (if known), the public key type
+and signature type don't all match.  It return `-EBADMSG` if the computed
+signature doesn't match the supplied one.
+
+The context can be reset and used again (provided it's for a key of the same
+type)::
+
+	void mldsa_ctx_zeroize(struct mldsa_ctx *ctx);
+
+And finally, it can be freed::
+
+	void mldsa_ctx_free(struct mldsa_ctx *ctx);
+
+
+References
+==========
+
+.. [1] https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf
+
+
+API Function Reference
+======================
+
+.. kernel-doc:: include/crypto/mldsa.h
+.. kernel-doc:: lib/crypto/mldsa/mldsa_api.c
diff --git a/include/crypto/mldsa.h b/include/crypto/mldsa.h
new file mode 100644
index 000000000000..e7aac97ac6fd
--- /dev/null
+++ b/include/crypto/mldsa.h
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/* Simple API for ML-DSA.
+ *
+ * Copyright (C) 2025 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * See also Documentation/crypto/mldsa.rst
+ */
+
+#ifndef _CRYPTO_MLDSA_H
+#define _CRYPTO_MLDSA_H
+
+struct mldsa_ctx;
+
+enum mldsa_type {
+	MLDSA_UNKNOWN,	/* Unknown key type */
+	MLDSA_87,	/* ML-DSA 87 */
+	MLDSA_65,	/* ML-DSA 65 */
+	MLDSA_44,	/* ML-DSA 44 */
+};
+
+int mldsa_verify(enum mldsa_type type,
+		 const void *pk, size_t pk_len,
+		 const uint8_t *data, size_t data_len,
+		 const void *sig, size_t sig_len);
+struct mldsa_ctx *mldsa_ctx_alloc(enum mldsa_type type);
+int mldsa_verify_update(struct mldsa_ctx *ctx, const void *data, size_t data_len);
+int mldsa_verify_final(struct mldsa_ctx *ctx,
+		       const void *pk, size_t pk_len,
+		       const void *sig, size_t sig_len);
+void mldsa_ctx_zeroize(struct mldsa_ctx *ctx);
+void mldsa_ctx_free(struct mldsa_ctx *ctx);
+
+#endif /* _CRYPTO_MLDSA_H */
diff --git a/lib/crypto/mldsa/Makefile b/lib/crypto/mldsa/Makefile
index e24bc2b57b8d..75e260615d4a 100644
--- a/lib/crypto/mldsa/Makefile
+++ b/lib/crypto/mldsa/Makefile
@@ -4,7 +4,8 @@ mldsa-y += \
 	signature_domain_separation.o \
 	dilithium_api.o \
 	dilithium_zetas.o \
-	dilithium_signature_helper.o
+	dilithium_signature_helper.o \
+	mldsa_api.o
 
 mldsa-$(CONFIG_CRYPTO_LIB_MLDSA_87) += dilithium_87.o
 mldsa-$(CONFIG_CRYPTO_LIB_MLDSA_65) += dilithium_65.o
diff --git a/lib/crypto/mldsa/crypto_mldsa.c b/lib/crypto/mldsa/crypto_mldsa.c
index 26cafeae6f0f..91350a828d94 100644
--- a/lib/crypto/mldsa/crypto_mldsa.c
+++ b/lib/crypto/mldsa/crypto_mldsa.c
@@ -28,9 +28,7 @@ enum dilithium_kernel_key_type {
 };
 
 struct dilithium_kernel_ctx {
-	union {
-		struct dilithium_pk pk;
-	};
+	struct dilithium_pk pk;
 	enum dilithium_kernel_key_type key_type;
 };
 
diff --git a/lib/crypto/mldsa/mldsa_api.c b/lib/crypto/mldsa/mldsa_api.c
new file mode 100644
index 000000000000..6925c5b0d6ee
--- /dev/null
+++ b/lib/crypto/mldsa/mldsa_api.c
@@ -0,0 +1,186 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Simple API for ML-DSA.
+ *
+ * Copyright (C) 2025 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * See also Documentation/crypto/mldsa.rst
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <crypto/mldsa.h>
+#include "dilithium.h"
+
+struct mldsa_ctx {
+	struct dilithium_pk pk;
+	struct dilithium_sig sig;
+	struct dilithium_ctx *dilithium;
+	enum dilithium_type type;
+};
+
+/**
+ * mldsa_verify - All-in-one ML-DSA signature verification
+ * @type: Type of ML-DSA key
+ * @pk: Pointer to public key
+ * @pk_len: Length of public key
+ * @data: Pointer to signed data
+ * @data_len: Length of signed data
+ * @sig: Pointer to signature
+ * @sig_len: Length of signature
+ *
+ * Perform all the steps needed to verify an ML-DSA signature in one go.  Only
+ * one data buffer may be provided.  For multifragment messages, the
+ * alloc/update/final interface must be used instead.
+ *
+ * Return: 0 if signature could be verified correctly, -EBADMSG when signature
+ * cannot be verified and < 0 on other errors.
+ */
+int mldsa_verify(enum mldsa_type type,
+		 const void *pk, size_t pk_len,
+		 const uint8_t *data, size_t data_len,
+		 const void *sig, size_t sig_len)
+{
+	struct mldsa_ctx *ctx;
+	int ret;
+
+	BUILD_BUG_ON((int)MLDSA_UNKNOWN != DILITHIUM_UNKNOWN ||
+		     (int)MLDSA_44 != DILITHIUM_44 ||
+		     (int)MLDSA_65 != DILITHIUM_65 ||
+		     (int)MLDSA_87 != DILITHIUM_87);
+
+	ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
+	if (!ctx)
+		return -ENOMEM;
+
+	ret = dilithium_pk_load(&ctx->pk, pk, pk_len);
+	if (ret < 0)
+		goto out;
+	ret = dilithium_sig_load(&ctx->sig, sig, sig_len);
+	if (ret < 0)
+		goto out;
+
+	ret = -EINVAL;
+	if (type != MLDSA_UNKNOWN && (int)type != ctx->pk.dilithium_type)
+		goto out;
+
+	ret = dilithium_verify(&ctx->sig, data, data_len, &ctx->pk);
+out:
+	kfree_sensitive(ctx);
+	return ret;
+}
+EXPORT_SYMBOL(mldsa_verify);
+
+/**
+ * mldsa_ctx_alloc - Allocate ML-DSA context
+ * @type: The type of ML-DSA involved.
+ *
+ * Return: Pointer to the allocated context or error code on failure.
+ *
+ * Context: Process context.  May sleep to allocate memory.
+ */
+struct mldsa_ctx *mldsa_ctx_alloc(enum mldsa_type type)
+{
+	struct mldsa_ctx *ctx;
+
+	if (type == MLDSA_UNKNOWN)
+		return ERR_PTR(-EINVAL);
+
+	ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
+	if (!ctx)
+		return ERR_PTR(-ENOMEM);
+
+	ctx->type = (int)type;
+	ctx->dilithium = dilithium_ctx_alloc_ahat(ctx->type);
+	if (!ctx->dilithium) {
+		kfree(ctx);
+		return ERR_PTR(-ENOMEM);
+	}
+
+	return ctx;
+}
+EXPORT_SYMBOL(mldsa_ctx_alloc);
+
+/**
+ * mldsa_verify_update - Add more data to an already initialized context
+ * @ctx: Pointer to an allocated ML-DSA context
+ * @data: Pointer to signed data
+ * @data_len: Length of signed data
+ *
+ * Add more signed data to the state in an allocated context.  This can be use
+ * to provide data that is split into multiple fragments.
+ *
+ * Return: 0 (success) or < 0 on error
+ *
+ * Context: Process context.  May sleep to allocate memory.
+ */
+int mldsa_verify_update(struct mldsa_ctx *ctx, const void *data, size_t data_len)
+{
+	return dilithium_verify_update(ctx->dilithium, data, data_len);
+}
+EXPORT_SYMBOL(mldsa_verify_update);
+
+/**
+ * mldsa_verify_final - Perform signature verification
+ * @ctx: Pointer to an allocated and updated ML-DSA context
+ * @pk: Pointer to public key
+ * @pk_len: Length of public key
+ * @sig: Pointer to signature
+ * @sig_len: Length of signature
+ *
+ * Finalise the state in the ML-DSA context and verify the signature.  The
+ * caller must have allocated it and updated it with all the pieces of data.
+ * Note that this does not free the context, but does reset it.
+ *
+ * Return: 0 if signature could be verified correctly, -EBADMSG when the
+ * signature cannot be verified and < 0 on other errors.
+ *
+ * Context: Process context.  May sleep to allocate memory.
+ */
+int mldsa_verify_final(struct mldsa_ctx *ctx,
+		       const void *pk, size_t pk_len,
+		       const void *sig, size_t sig_len)
+{
+	int ret;
+
+	ret = dilithium_pk_load(&ctx->pk, pk, pk_len);
+	if (ret < 0)
+		return ret;
+	ret = dilithium_sig_load(&ctx->sig, sig, sig_len);
+	if (ret < 0)
+		return ret;
+	if (ctx->type != ctx->pk.dilithium_type)
+		return -EINVAL;
+
+	ret = dilithium_verify_final(&ctx->sig, ctx->dilithium, &ctx->pk);
+	dilithium_ctx_zero(ctx->dilithium);
+	return ret;
+}
+EXPORT_SYMBOL(mldsa_verify_final);
+
+/**
+ * mldsa_ctx_zeroize - Resets an ML-DSA context
+ * @ctx: Context pointer
+ *
+ * Context: Any context.
+ */
+void mldsa_ctx_zeroize(struct mldsa_ctx *ctx)
+{
+	dilithium_ctx_zero(ctx->dilithium);
+	memset(&ctx->pk, 0, sizeof(ctx->pk));
+	memset(&ctx->sig, 0, sizeof(ctx->sig));
+}
+EXPORT_SYMBOL(mldsa_ctx_zeroize);
+
+/**
+ * mldsa_ctx_free - Clears and frees an ML-DSA context.
+ * @ctx: Context pointer
+ *
+ * Context: Any context.
+ */
+void mldsa_ctx_free(struct mldsa_ctx *ctx)
+{
+	dilithium_ctx_zero_free(ctx->dilithium);
+	kfree(ctx);
+}
+EXPORT_SYMBOL(mldsa_ctx_free);


^ permalink raw reply related

* [PATCH v8 2/9] crypto: Add ML-DSA/Dilithium verify support
From: David Howells @ 2025-11-14 13:04 UTC (permalink / raw)
  To: Herbert Xu
  Cc: David Howells, Eric Biggers, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Jason A . Donenfeld, Ard Biesheuvel,
	Stephan Mueller, Lukas Wunner, Ignat Korchagin, linux-crypto,
	keyrings, linux-modules, linux-kernel
In-Reply-To: <20251114130417.1756230-1-dhowells@redhat.com>

Port the signature verification code from Stephan Mueller's Leancrypto
implementation of ML-DSA/Dilithium to the kernel.  The keypair generation
and signature generation is not included and nor is composite signature
support to reduce code footprint size.

Apologies to Stephan, but I've stripped out a bunch of macros to do return
checking and suchlike and removed a bunch of "lc_" prefixes from the code.

Composite signature support is mostly removed and none of the arch-specific
code from Leancrypto has been included for the moment, so this is pure C.

The interface to this code is through the crypto_sig API as the PKCS#7 code
wants to use that rather than calling it directly.  As such, I've placed it
in crypto/ rather than lib/crypto/.  Only the verification hooks are
implemented; the signing hooks return an error.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Stephan Mueller <smueller@chronox.de>
cc: Eric Biggers <ebiggers@kernel.org>
cc: Jason A. Donenfeld <Jason@zx2c4.com>
cc: Ard Biesheuvel <ardb@kernel.org>
cc: Herbert Xu <herbert@gondor.apana.org.au>
cc: linux-crypto@vger.kernel.org
---
 lib/crypto/Kconfig                            |   1 +
 lib/crypto/Makefile                           |   2 +
 lib/crypto/mldsa/Kconfig                      |  28 +
 lib/crypto/mldsa/Makefile                     |  14 +
 lib/crypto/mldsa/crypto_mldsa.c               | 334 +++++++++++
 lib/crypto/mldsa/dilithium.h                  | 545 ++++++++++++++++++
 lib/crypto/mldsa/dilithium_44.c               |  33 ++
 lib/crypto/mldsa/dilithium_44.h               | 282 +++++++++
 lib/crypto/mldsa/dilithium_65.c               |  33 ++
 lib/crypto/mldsa/dilithium_65.h               | 282 +++++++++
 lib/crypto/mldsa/dilithium_87.c               |  33 ++
 lib/crypto/mldsa/dilithium_87.h               | 282 +++++++++
 lib/crypto/mldsa/dilithium_api.c              | 429 ++++++++++++++
 lib/crypto/mldsa/dilithium_debug.h            |  49 ++
 lib/crypto/mldsa/dilithium_ntt.c              |  89 +++
 lib/crypto/mldsa/dilithium_ntt.h              |  35 ++
 lib/crypto/mldsa/dilithium_pack.h             | 119 ++++
 lib/crypto/mldsa/dilithium_poly.c             | 377 ++++++++++++
 lib/crypto/mldsa/dilithium_poly.h             | 181 ++++++
 lib/crypto/mldsa/dilithium_poly_c.h           | 141 +++++
 lib/crypto/mldsa/dilithium_poly_common.h      |  35 ++
 lib/crypto/mldsa/dilithium_polyvec.h          | 343 +++++++++++
 lib/crypto/mldsa/dilithium_polyvec_c.h        |  81 +++
 lib/crypto/mldsa/dilithium_reduce.h           |  85 +++
 lib/crypto/mldsa/dilithium_rounding.c         | 128 ++++
 lib/crypto/mldsa/dilithium_service_helpers.h  |  99 ++++
 lib/crypto/mldsa/dilithium_signature_c.c      | 102 ++++
 lib/crypto/mldsa/dilithium_signature_c.h      |  37 ++
 lib/crypto/mldsa/dilithium_signature_helper.c |  79 +++
 lib/crypto/mldsa/dilithium_signature_impl.h   | 370 ++++++++++++
 lib/crypto/mldsa/dilithium_type.h             | 102 ++++
 lib/crypto/mldsa/dilithium_zetas.c            |  67 +++
 .../mldsa/signature_domain_separation.c       | 203 +++++++
 .../mldsa/signature_domain_separation.h       |  30 +
 34 files changed, 5050 insertions(+)
 create mode 100644 lib/crypto/mldsa/Kconfig
 create mode 100644 lib/crypto/mldsa/Makefile
 create mode 100644 lib/crypto/mldsa/crypto_mldsa.c
 create mode 100644 lib/crypto/mldsa/dilithium.h
 create mode 100644 lib/crypto/mldsa/dilithium_44.c
 create mode 100644 lib/crypto/mldsa/dilithium_44.h
 create mode 100644 lib/crypto/mldsa/dilithium_65.c
 create mode 100644 lib/crypto/mldsa/dilithium_65.h
 create mode 100644 lib/crypto/mldsa/dilithium_87.c
 create mode 100644 lib/crypto/mldsa/dilithium_87.h
 create mode 100644 lib/crypto/mldsa/dilithium_api.c
 create mode 100644 lib/crypto/mldsa/dilithium_debug.h
 create mode 100644 lib/crypto/mldsa/dilithium_ntt.c
 create mode 100644 lib/crypto/mldsa/dilithium_ntt.h
 create mode 100644 lib/crypto/mldsa/dilithium_pack.h
 create mode 100644 lib/crypto/mldsa/dilithium_poly.c
 create mode 100644 lib/crypto/mldsa/dilithium_poly.h
 create mode 100644 lib/crypto/mldsa/dilithium_poly_c.h
 create mode 100644 lib/crypto/mldsa/dilithium_poly_common.h
 create mode 100644 lib/crypto/mldsa/dilithium_polyvec.h
 create mode 100644 lib/crypto/mldsa/dilithium_polyvec_c.h
 create mode 100644 lib/crypto/mldsa/dilithium_reduce.h
 create mode 100644 lib/crypto/mldsa/dilithium_rounding.c
 create mode 100644 lib/crypto/mldsa/dilithium_service_helpers.h
 create mode 100644 lib/crypto/mldsa/dilithium_signature_c.c
 create mode 100644 lib/crypto/mldsa/dilithium_signature_c.h
 create mode 100644 lib/crypto/mldsa/dilithium_signature_helper.c
 create mode 100644 lib/crypto/mldsa/dilithium_signature_impl.h
 create mode 100644 lib/crypto/mldsa/dilithium_type.h
 create mode 100644 lib/crypto/mldsa/dilithium_zetas.c
 create mode 100644 lib/crypto/mldsa/signature_domain_separation.c
 create mode 100644 lib/crypto/mldsa/signature_domain_separation.h

diff --git a/lib/crypto/Kconfig b/lib/crypto/Kconfig
index 9d04b3771ce2..8189ff8997be 100644
--- a/lib/crypto/Kconfig
+++ b/lib/crypto/Kconfig
@@ -223,6 +223,7 @@ config CRYPTO_LIB_SHA3_ARCH
 config CRYPTO_LIB_SM3
 	tristate
 
+source "lib/crypto/mldsa/Kconfig"
 source "lib/crypto/tests/Kconfig"
 
 endmenu
diff --git a/lib/crypto/Makefile b/lib/crypto/Makefile
index 6580991f8e12..37918c7fd2f6 100644
--- a/lib/crypto/Makefile
+++ b/lib/crypto/Makefile
@@ -305,6 +305,8 @@ obj-$(CONFIG_CRYPTO_SELFTESTS_FULL)		+= simd.o
 obj-$(CONFIG_CRYPTO_LIB_SM3)			+= libsm3.o
 libsm3-y					:= sm3.o
 
+obj-$(CONFIG_CRYPTO_LIB_MLDSA) += mldsa/
+
 # clean-files must be defined unconditionally
 clean-files += arm/sha256-core.S arm/sha512-core.S
 clean-files += arm64/sha256-core.S arm64/sha512-core.S
diff --git a/lib/crypto/mldsa/Kconfig b/lib/crypto/mldsa/Kconfig
new file mode 100644
index 000000000000..04d095da0e22
--- /dev/null
+++ b/lib/crypto/mldsa/Kconfig
@@ -0,0 +1,28 @@
+# SPDX-License-Identifier: GPL-2.0
+menuconfig CRYPTO_LIB_MLDSA
+	tristate "ML-DSA algorithm"
+	select CRYPTO_LIB_SHA3
+	help
+	  Enable this to provide the ML-DSA (Dilithium) post-quantum crypto
+	  (PQC) algorithm.  It acts as an asymmetric cipher, but it wants to do
+	  the digestion step that usually precedes such itself, and so has
+	  digest functions in its API.  In theory, an external digestor can be
+	  used, but that is not fully supported here.
+
+	  Note that composite signature support is not currently implemented.
+
+	  Three different strengths of key are supported and each has its own
+	  separate API as most of the code gets duplicated for each strength.
+
+if CRYPTO_LIB_MLDSA
+
+config CRYPTO_LIB_MLDSA_44
+	bool "Enable ML-DSA-44 support"
+
+config CRYPTO_LIB_MLDSA_65
+	bool "Enable ML-DSA-65 support"
+
+config CRYPTO_LIB_MLDSA_87
+	bool "Enable ML-DSA-87 support"
+
+endif
diff --git a/lib/crypto/mldsa/Makefile b/lib/crypto/mldsa/Makefile
new file mode 100644
index 000000000000..e24bc2b57b8d
--- /dev/null
+++ b/lib/crypto/mldsa/Makefile
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: GPL-2.0
+
+mldsa-y += \
+	signature_domain_separation.o \
+	dilithium_api.o \
+	dilithium_zetas.o \
+	dilithium_signature_helper.o
+
+mldsa-$(CONFIG_CRYPTO_LIB_MLDSA_87) += dilithium_87.o
+mldsa-$(CONFIG_CRYPTO_LIB_MLDSA_65) += dilithium_65.o
+mldsa-$(CONFIG_CRYPTO_LIB_MLDSA_44) += dilithium_44.o
+mldsa-$(CONFIG_CRYPTO) += crypto_mldsa.o
+
+obj-$(CONFIG_CRYPTO_LIB_MLDSA) += mldsa.o
diff --git a/lib/crypto/mldsa/crypto_mldsa.c b/lib/crypto/mldsa/crypto_mldsa.c
new file mode 100644
index 000000000000..26cafeae6f0f
--- /dev/null
+++ b/lib/crypto/mldsa/crypto_mldsa.c
@@ -0,0 +1,334 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
+/*
+ * Copyright (C) 2024 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <crypto/internal/sig.h>
+#include "dilithium.h"
+
+enum dilithium_kernel_key_type {
+	dilithium_kernel_key_unset = 0,
+	/* dilithium_kernel_key_sk = 1, */
+	dilithium_kernel_key_pk = 2,
+};
+
+struct dilithium_kernel_ctx {
+	union {
+		struct dilithium_pk pk;
+	};
+	enum dilithium_kernel_key_type key_type;
+};
+
+/* src -> message */
+/* dst -> signature */
+static int dilithium_kernel_sign(struct crypto_sig *tfm, const void *src,
+				 unsigned int slen, void *dst,
+				 unsigned int dlen)
+{
+	return -EOPNOTSUPP;
+}
+
+/* src -> signature */
+/* msg -> message */
+static int dilithium_kernel_verify(struct crypto_sig *tfm, const void *src,
+				   unsigned int slen, const void *msg,
+				   unsigned int msg_len)
+{
+	struct dilithium_kernel_ctx *ctx = crypto_sig_ctx(tfm);
+	struct dilithium_sig *sig;
+	size_t sig_len;
+	enum dilithium_type type;
+	int ret;
+
+	if (unlikely(ctx->key_type != dilithium_kernel_key_pk))
+		return -EINVAL;
+
+	type = dilithium_pk_type(&ctx->pk);
+	sig_len = dilithium_sig_size(type);
+	if (slen < sig_len)
+		return -EINVAL;
+
+	sig = kmalloc(sizeof(struct dilithium_sig), GFP_KERNEL);
+	if (!sig)
+		return -ENOMEM;
+
+	ret = dilithium_sig_load(sig, src, sig_len);
+	if (ret)
+		goto out;
+
+	ret = dilithium_verify(sig, msg, msg_len, &ctx->pk);
+
+out:
+	kfree_sensitive(sig);
+	return ret;
+}
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+static unsigned int dilithium_kernel_87_key_size(struct crypto_sig *tfm)
+{
+	struct dilithium_kernel_ctx *ctx = crypto_sig_ctx(tfm);
+
+	switch (ctx->key_type) {
+	case dilithium_kernel_key_unset:
+	case dilithium_kernel_key_pk:
+	default:
+		return sizeof(struct dilithium_87_pk);
+	}
+}
+#endif
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+static unsigned int dilithium_kernel_65_key_size(struct crypto_sig *tfm)
+{
+	struct dilithium_kernel_ctx *ctx = crypto_sig_ctx(tfm);
+
+	switch (ctx->key_type) {
+	case dilithium_kernel_key_unset:
+	case dilithium_kernel_key_pk:
+	default:
+		return sizeof(struct dilithium_65_pk);
+	}
+}
+#endif
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+static unsigned int dilithium_kernel_44_key_size(struct crypto_sig *tfm)
+{
+	struct dilithium_kernel_ctx *ctx = crypto_sig_ctx(tfm);
+
+	switch (ctx->key_type) {
+	case dilithium_kernel_key_unset:
+	case dilithium_kernel_key_pk:
+	default:
+		return sizeof(struct dilithium_44_pk);
+	}
+}
+#endif
+
+static int dilithium_kernel_set_pub_key_int(struct crypto_sig *tfm,
+					    const void *key,
+					    unsigned int keylen,
+					    enum dilithium_type type)
+{
+	struct dilithium_kernel_ctx *ctx = crypto_sig_ctx(tfm);
+	int ret;
+
+	ctx->key_type = dilithium_kernel_key_unset;
+
+	ret = dilithium_pk_load(&ctx->pk, key, keylen);
+	if (!ret) {
+		if (dilithium_pk_type(&ctx->pk) != type)
+			ret = -EOPNOTSUPP;
+		else
+			ctx->key_type = dilithium_kernel_key_pk;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+static int dilithium_kernel_44_set_pub_key(struct crypto_sig *tfm,
+					   const void *key,
+					   unsigned int keylen)
+{
+	return dilithium_kernel_set_pub_key_int(tfm, key, keylen, DILITHIUM_44);
+}
+#endif
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+static int dilithium_kernel_65_set_pub_key(struct crypto_sig *tfm,
+					   const void *key,
+					   unsigned int keylen)
+{
+	return dilithium_kernel_set_pub_key_int(tfm, key, keylen, DILITHIUM_65);
+}
+#endif
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+static int dilithium_kernel_87_set_pub_key(struct crypto_sig *tfm,
+					   const void *key,
+					   unsigned int keylen)
+{
+	return dilithium_kernel_set_pub_key_int(tfm, key, keylen, DILITHIUM_87);
+}
+#endif
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+static int dilithium_kernel_44_set_priv_key(struct crypto_sig *tfm,
+					    const void *key,
+					    unsigned int keylen)
+{
+	return -EOPNOTSUPP;
+}
+#endif
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+static int dilithium_kernel_65_set_priv_key(struct crypto_sig *tfm,
+					    const void *key,
+					    unsigned int keylen)
+{
+	return -EOPNOTSUPP;
+}
+#endif
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+static int dilithium_kernel_87_set_priv_key(struct crypto_sig *tfm,
+					    const void *key,
+					    unsigned int keylen)
+{
+	return -EOPNOTSUPP;
+}
+#endif
+
+static unsigned int dilithium_kernel_max_size(struct crypto_sig *tfm)
+{
+	struct dilithium_kernel_ctx *ctx = crypto_sig_ctx(tfm);
+	enum dilithium_type type;
+
+	switch (ctx->key_type) {
+	case dilithium_kernel_key_pk:
+		type = dilithium_pk_type(&ctx->pk);
+		/* When PK is set, this is a safety valve, result is boolean */
+		return dilithium_sig_size(type);
+	default:
+		return 0;
+	}
+}
+
+static int dilithium_kernel_alg_init(struct crypto_sig *tfm)
+{
+	return 0;
+}
+
+static void dilithium_kernel_alg_exit(struct crypto_sig *tfm)
+{
+	struct dilithium_kernel_ctx *ctx = crypto_sig_ctx(tfm);
+
+	ctx->key_type = dilithium_kernel_key_unset;
+}
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+static struct sig_alg dilithium_kernel_87 = {
+	.sign			= dilithium_kernel_sign,
+	.verify			= dilithium_kernel_verify,
+	.set_pub_key		= dilithium_kernel_87_set_pub_key,
+	.set_priv_key		= dilithium_kernel_87_set_priv_key,
+	.key_size		= dilithium_kernel_87_key_size,
+	.max_size		= dilithium_kernel_max_size,
+	.init			= dilithium_kernel_alg_init,
+	.exit			= dilithium_kernel_alg_exit,
+	.base.cra_name		= "mldsa87",
+	.base.cra_driver_name	= "mldsa87-leancrypto",
+	.base.cra_ctxsize	= sizeof(struct dilithium_kernel_ctx),
+	.base.cra_module	= THIS_MODULE,
+	.base.cra_priority	= 5000,
+};
+#endif
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+static struct sig_alg dilithium_kernel_65 = {
+	.sign			= dilithium_kernel_sign,
+	.verify			= dilithium_kernel_verify,
+	.set_pub_key		= dilithium_kernel_65_set_pub_key,
+	.set_priv_key		= dilithium_kernel_65_set_priv_key,
+	.key_size		= dilithium_kernel_65_key_size,
+	.max_size		= dilithium_kernel_max_size,
+	.init			= dilithium_kernel_alg_init,
+	.exit			= dilithium_kernel_alg_exit,
+	.base.cra_name		= "mldsa65",
+	.base.cra_driver_name	= "mldsa65-leancrypto",
+	.base.cra_ctxsize	= sizeof(struct dilithium_kernel_ctx),
+	.base.cra_module	= THIS_MODULE,
+	.base.cra_priority	= 5000,
+};
+#endif
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+static struct sig_alg dilithium_kernel_44 = {
+	.sign			= dilithium_kernel_sign,
+	.verify			= dilithium_kernel_verify,
+	.set_pub_key		= dilithium_kernel_44_set_pub_key,
+	.set_priv_key		= dilithium_kernel_44_set_priv_key,
+	.key_size		= dilithium_kernel_44_key_size,
+	.max_size		= dilithium_kernel_max_size,
+	.init			= dilithium_kernel_alg_init,
+	.exit			= dilithium_kernel_alg_exit,
+	.base.cra_name		= "mldsa44",
+	.base.cra_driver_name	= "mldsa44-leancrypto",
+	.base.cra_ctxsize	= sizeof(struct dilithium_kernel_ctx),
+	.base.cra_module	= THIS_MODULE,
+	.base.cra_priority	= 5000,
+};
+#endif
+
+static int __init dilithium_init(void)
+{
+	int ret;
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+	ret = crypto_register_sig(&dilithium_kernel_44);
+	if (ret < 0)
+		goto error_44;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+	ret = crypto_register_sig(&dilithium_kernel_65);
+	if (ret < 0)
+		goto error_65;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+	ret = crypto_register_sig(&dilithium_kernel_87);
+	if (ret < 0)
+		goto error_87;
+#endif
+	return 0;
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+error_87:
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+	crypto_unregister_sig(&dilithium_kernel_65);
+error_65:
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+	crypto_unregister_sig(&dilithium_kernel_44);
+error_44:
+#endif
+	pr_err("Failed to register (%d)\n", ret);
+	return ret;
+}
+module_init(dilithium_init);
+
+static void dilithium_exit(void)
+{
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+	crypto_unregister_sig(&dilithium_kernel_87);
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+	crypto_unregister_sig(&dilithium_kernel_65);
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+	crypto_unregister_sig(&dilithium_kernel_44);
+#endif
+}
+module_exit(dilithium_exit);
+
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_DESCRIPTION("Leancrypto ML-DSA/Dilithium");
+MODULE_AUTHOR("Stephan Mueller <smueller@chronox.de>");
+MODULE_ALIAS_CRYPTO("mldsa44");
+MODULE_ALIAS_CRYPTO("mldsa65");
+MODULE_ALIAS_CRYPTO("mldsa87");
diff --git a/lib/crypto/mldsa/dilithium.h b/lib/crypto/mldsa/dilithium.h
new file mode 100644
index 000000000000..13461f2baa32
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium.h
@@ -0,0 +1,545 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#ifndef DILITHIUM_H
+#define DILITHIUM_H
+
+#undef pr_fmt
+#define pr_fmt(fmt) "ML-DSA: " fmt
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <crypto/sha2.h>
+#include <crypto/sha3.h>
+#include <crypto/hash.h>
+#include <crypto/rng.h>
+
+#define DILITHIUM_SEEDBYTES 32
+#define DILITHIUM_CRHBYTES 64
+#define DILITHIUM_TRBYTES 64
+#define DILITHIUM_RNDBYTES 32
+#define DILITHIUM_N 256
+#define DILITHIUM_Q 8380417
+#define DILITHIUM_D 13
+#define DILITHIUM_ROOT_OF_UNITY 1753
+
+extern const int32_t dilithium_zetas[DILITHIUM_N];
+
+struct dilithium_ctx {
+	/*
+	 * @brief Hash context used internally to the library - it should not
+	 * be touched by the user
+	 */
+	struct shake_ctx dilithium_hash_ctx;
+
+	/*
+	 * @brief length of the user context (allowed range between 0 and 255
+	 * bytes)
+	 *
+	 * \note Use \p dilithium_ctx_userctx or
+	 * \p dilithium_ed25519_ctx_userctx to set this value.
+	 */
+	size_t userctxlen;
+
+	/*
+	 * @brief buffer with a caller-specified context string
+	 *
+	 * \note Use \p dilithium_ctx_userctx or
+	 * \p dilithium_ed25519_ctx_userctx to set this value.
+	 */
+	const uint8_t *userctx;
+
+	/*
+	 * @brief Pointer to the AHat buffer. This can be provided by the caller
+	 * or it must be NULL otherwise.
+	 *
+	 * \note Use \p DILITHIUM_CTX_ON_STACK_AHAT to provide memory for
+	 * storing AHat in the caller context and thus make the signature
+	 * operation much faster starting with the 2nd use of the key (pair).
+	 */
+	void *ahat;
+	unsigned short ahat_size;
+
+	/*
+	 * @brief Pointer to the external mu.
+	 *
+	 * If set, the signature operation will use the provided mu instead of
+	 * the message. In this case, the message pointer to the signature
+	 * generation or verification can be NULL.
+	 */
+	const uint8_t *external_mu;
+	size_t external_mu_len;
+
+	/*
+	 * @brief NIST category required for composite signatures
+	 *
+	 * The domain separation logic depends on the selection of the right
+	 * OID for the "Domain" data.
+	 */
+	unsigned int nist_category;
+
+	/*
+	 * @brief When set to true, only the ML-DSA.Sign_internal or
+	 * ML-DSA.Verify_internal are performed (see FIPS 204 chapter 6).
+	 * Otherwise the ML-DSA.Sign / ML-DSA.Verify (see FIPS chapter 5) is
+	 * applied.
+	 *
+	 * \note Use \p dilithium_ctx_internal or
+	 * \p dilithium_ed25519_ctx_internal to set this value.
+	 *
+	 * \warning Only set this value to true if you exactly know what you are
+	 * doing!.
+	 */
+	bool ml_dsa_internal:1;
+
+	/*
+	 * @brief Was aHat already filled? This is used and set internally.
+	 */
+	bool ahat_expanded:1;
+} __aligned(CRYPTO_MINALIGN);
+
+static inline void dilithium_hash_init(struct dilithium_ctx *ctx)
+{
+	shake256_init(&ctx->dilithium_hash_ctx);
+}
+
+static inline bool dilithium_hash_check_blocksize(const struct dilithium_ctx *ctx, size_t bsize)
+{
+	return bsize == SHAKE256_BLOCK_SIZE;
+}
+
+static inline bool dilithium_hash_check_digestsize(const struct dilithium_ctx *ctx, size_t dsize)
+{
+	return true;
+}
+
+static inline void dilithium_hash_clear(struct dilithium_ctx *ctx)
+{
+	shake_zeroize_ctx(&ctx->dilithium_hash_ctx);
+}
+
+static inline void dilithium_hash_update(struct dilithium_ctx *ctx,
+					 const u8 *in, size_t in_size)
+{
+	shake_update(&ctx->dilithium_hash_ctx, in, in_size);
+}
+
+static inline void dilithium_hash_finup(struct dilithium_ctx *ctx,
+					const u8 *in, size_t in_size,
+					u8 *out, size_t out_size)
+{
+	shake_update(&ctx->dilithium_hash_ctx, in, in_size);
+	shake_squeeze(&ctx->dilithium_hash_ctx, out, out_size);
+	shake_zeroize_ctx(&ctx->dilithium_hash_ctx);
+}
+
+static inline void dilithium_hash_final(struct dilithium_ctx *ctx, u8 *out, size_t out_size)
+{
+	shake_squeeze(&ctx->dilithium_hash_ctx, out, out_size);
+	shake_zeroize_ctx(&ctx->dilithium_hash_ctx);
+}
+
+#include "dilithium_87.h"
+#include "dilithium_65.h"
+#include "dilithium_44.h"
+
+enum dilithium_type {
+	DILITHIUM_UNKNOWN,	/* Unknown key type */
+	DILITHIUM_87,		/* Dilithium 87 */
+	DILITHIUM_65,		/* Dilithium 65 */
+	DILITHIUM_44,		/* Dilithium 44 */
+};
+
+/* @defgroup Dilithium ML-DSA / CRYSTALS-Dilithium Signature Mechanism
+ *
+ * \note Although the API uses the term "dilithium", the implementation complies
+ * with FIPS 204. Thus the terms Dilithium and ML-DSA are used interchangeably.
+ *
+ * Dilithium API concept
+ *
+ * The Dilithium API is accessible via the following header files with the
+ * mentioned purpose.
+ *
+ * * dilithium.h: This API is the generic API allowing the caller to select
+ *   which Dilithium type (Dilithium 87, 65 or 44) are to be used. The selection
+ *   is made either with the flag specified during key generation or by matching
+ *   the size of the imported data with the different dilithium_*_load API
+ *   calls. All remaining APIs take the information about the Dilithium type
+ *   from the provided input data.
+ *
+ *   This header file only provides inline functions which selectively call
+ *   the API provided with the header files below.
+ *
+ * * dilithium_87.h: Direct access to Dilithium 87.
+ *
+ * * dilithium_65.h: Direct access to Dilithium 65.
+ *
+ * * dilithium_44.h: Direct access to Dilithium 44.
+ *
+ * To support the stream mode of the Dilithium signature operation, a
+ * context structure is required. This context structure can be allocated either
+ * on the stack or heap with \p DILITHIUM_CTX_ON_STACK or
+ * \p dilithium_ctx_alloc. The context should be zeroized
+ * and freed (only for heap) with \p dilithium_ctx_zero or
+ * \p dilithium_ctx_zero_free.
+ */
+
+/*
+ * @brief Dilithium public key
+ */
+struct dilithium_pk {
+	enum dilithium_type dilithium_type;
+	union {
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+		struct dilithium_87_pk pk_87;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+		struct dilithium_65_pk pk_65;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+		struct dilithium_44_pk pk_44;
+#endif
+	} key;
+};
+
+/*
+ * @brief Dilithium signature
+ */
+struct dilithium_sig {
+	enum dilithium_type dilithium_type;
+	union {
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+		struct dilithium_87_sig sig_87;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+		struct dilithium_65_sig sig_65;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+		struct dilithium_44_sig sig_44;
+#endif
+	} sig;
+};
+
+/**
+ * dilithium_ctx_alloc - Allocate ML-DSA context
+ * @ctx: Dilithium context pointer
+ *
+ * Return: Pointer to the allocated context or error code on failure.
+ *
+ * Context: Process context.  May sleep to allocate memory.
+ */
+struct dilithium_ctx *dilithium_ctx_alloc(void);
+
+/**
+ * dilithium_ctx_alloc_ahat - Allocate ML-DSA context with key representation
+ * @ctx: Dilithium context pointer
+ *
+ * Return: Pointer to the allocated context or error code on failure.
+ *
+ * Context: Process context.  May sleep to allocate memory.
+ */
+struct dilithium_ctx *dilithium_ctx_alloc_ahat(enum dilithium_type type);
+
+/**
+ * dilithium_ctx_zero_free - Zeroizes and frees Dilithium
+ * @ctx: Dilithium context pointer
+ *
+ * Context: Any context.
+ */
+void dilithium_ctx_zero_free(struct dilithium_ctx *ctx);
+
+/**
+ * dilithium_ctx_zero - Zeroizes Dilithium context
+ * @ctx: Dilithium context pointer
+ *
+ * Context: Any context.
+ */
+void dilithium_ctx_zero(struct dilithium_ctx *ctx);
+
+/**
+ * dilithium_ctx_internal - Mark ML-DSA context internal
+ * @ctx: Dilithium context pointer
+ *
+ * Mark the Dilithium context to execute ML-DSA.Sign_internal or
+ * ML-DSA.Verify_internal.
+ *
+ * Context: Any context.
+ */
+void dilithium_ctx_internal(struct dilithium_ctx *ctx);
+
+/**
+ * dilithium_ctx_userctx - Specify user context
+ * @ctx: Dilithium context
+ * @userctx: User context string
+ * @userctxlen: Length of the user context string
+ *
+ * Specify the optional user context string to be applied with the
+ * ML-DSA/Dilithium signature operation.  The pointer given in @userctx is
+ * retained without copying the string, so the caller must not free it until
+ * the context is cleared or verification is complete.
+ *
+ * Context: Any context.
+ */
+void dilithium_ctx_userctx(struct dilithium_ctx *ctx,
+			   const uint8_t *userctx, size_t userctxlen);
+
+/**
+ * dilithium_ctx_external_mu - Specify the optional external mu
+ * @ctx: Dilithium context
+ * @external_mu: User context string
+ * @external_mu_len: Length of the user context string
+ *
+ * If the external mu is specified, the signature generation and verification
+ * APIs do not require a message.  In this case, the message buffer can be set
+ * to NULL.  The pointer given in @external_mu is retained without copying the
+ * mu data, so the caller must not free it until the context is cleared or
+ * verification is complete.
+ *
+ * If both a message and an external mu are provided, the external mu takes
+ * precedence.
+ *
+ * Context: Any context.
+ */
+void dilithium_ctx_external_mu(struct dilithium_ctx *ctx,
+			       const uint8_t *external_mu,
+			       size_t external_mu_len);
+
+/**
+ * dilithium_ctx_drop_ahat - Invalidate expanded key
+ * @ctx: Dilithium context
+ *
+ * Invalidate the expanded key that potentially is stored in the context.
+ *
+ * This call can be executed on a context irrespective it was allocated with
+ * space for the expanded representation or not.  Thus, the caller does not
+ * need to track whether the context supports the expanded key.
+ *
+ * Context: Any context.
+ */
+void dilithium_ctx_drop_ahat(struct dilithium_ctx *ctx);
+
+/**
+ * dilithium_pk_type - Obtain Dilithium type from public key
+ * @pk: Public key to query
+ *
+ * Return: Key type
+ *
+ * Context: Any context.
+ */
+enum dilithium_type dilithium_pk_type(const struct dilithium_pk *pk);
+
+/**
+ * dilithium_sig_type - Obtain Dilithium type from signature
+ * @sig: Signature to query
+ *
+ * Return: Key type
+ *
+ * Context: Any context.
+ */
+enum dilithium_type dilithium_sig_type(const struct dilithium_sig *sig);
+
+/**
+ * dilithium_pk_size - Return the size of the Dilithium public key.
+ * @dilithium_type: Dilithium type for which the size is requested
+ *
+ * Return: Size of public key
+ *
+ * Context: Any context.
+ */
+unsigned int dilithium_pk_size(enum dilithium_type dilithium_type);
+
+/**
+ * dilithium_sig_size - Return the size of the Dilithium signature.
+ * @dilithium_type: Dilithium type for which the size is requested
+ *
+ * Return: Size of signature
+ *
+ * Context: Any context.
+ */
+unsigned int dilithium_sig_size(enum dilithium_type dilithium_type);
+
+/**
+ * dilithium_pk_load - Load Dilithium public key
+ * @pk: Secret key to be filled (the caller must have allocated it)
+ * @src_key: Buffer that holds the key to be imported
+ * @src_key_len: Length of key in buffer
+ *
+ * Load a Dilithium public key provided with a buffer into the Leancrypto data
+ * structure.
+ *
+ * Return: 0 on success or < 0 on error
+ *
+ * Context: Any context.
+ */
+int dilithium_pk_load(struct dilithium_pk *pk, const uint8_t *src_key,
+		      size_t src_key_len);
+
+/**
+ * dilithium_sig_load - Load Dilithium signature
+ * @sig: Signature to be filled (the caller must have it allocated)
+ * @src_sig: Buffer that holds the signature to be imported
+ * @src_sig_len: Length of signature in buffer
+ *
+ * Load a Dilithium signature provided with a buffer into the Leancrypto data
+ * structure.
+ *
+ * Return: 0 on success or < 0 on error
+ *
+ * Context: Any context.
+ */
+int dilithium_sig_load(struct dilithium_sig *sig, const uint8_t *src_sig,
+		       size_t src_sig_len);
+
+/**
+ * dilithium_pk_ptr - Query Dilithium key
+ * @dilithium_key: Where to return Dilithium key pointer
+ * @dilithium_key_len: Where to return length of the key
+ * @pk: Dilithium public key from which the references are obtained
+ *
+ * Obtain a reference to the Dilithium key and its length from the key buffer.
+ *
+ * Only pointer references into the Leancrypto data structure are returned.
+ * Any modification of that buffer will modify the Leancrypto key too.
+ *
+ * Return: 0 on success, in which case @dilithium_key and @dilithium_key_len
+ * will have been updated, or != 0 on error
+ *
+ * Context: Any context.
+ */
+int dilithium_pk_ptr(uint8_t **dilithium_key, size_t *dilithium_key_len,
+		     struct dilithium_pk *pk);
+
+/**
+ * dilithium_sig_ptr - Query Dilithium signature
+ * @dilithium_sig: Where to return Dilithium signature pointer
+ * @dilithium_sig_len: Where to return length of the signature
+ * @sig: Dilithium signature from which the references are obtained
+ *
+ * @Obtain the reference to the Dilithium signature and its length
+ *
+ * Only pointer references into the Leancrypto data structure are returned.
+ * Any modification of that buffer will modify the Leancrypto signature too.
+ *
+ * Return: 0 on success, in which case @dilithium_sig and @dilithium_sig_len
+ * will have been updated, or != 0 on error
+ *
+ * Context: Any context.
+ */
+int dilithium_sig_ptr(uint8_t **dilithium_sig, size_t *dilithium_sig_len,
+		      struct dilithium_sig *sig);
+
+/**
+ * dilithium_verify - All-in-one ML-DSA signature verification
+ * @sig: Pointer to input signature
+ * @m: Pointer to message
+ * @mlen: Length of message
+ * @pk: Pointer to bit-packed public key
+ *
+ * Perform all the steps needed to verify an ML-DSA signature in one go.  Only
+ * one message buffer may be provided.  For multifragment messages, the
+ * init/update/final interface must be used instead.
+ *
+ * Return: 0 if signature could be verified correctly and -EBADMSG when
+ * signature cannot be verified, < 0 on other errors
+ */
+int dilithium_verify(const struct dilithium_sig *sig, const uint8_t *m,
+		     size_t mlen, const struct dilithium_pk *pk);
+
+/**
+ * dilithium_verify_ctx - ML-DSA signature verification in context
+ * @sig: Pointer to input signature
+ * @ctx: Pointer to an allocated Dilithium context
+ * @m: Pointer to message
+ * @mlen: Length of message
+ * @pk: Pointer to bit-packed public key
+ *
+ * Take an arbitrary context buffer provided by the caller and hash it together
+ * with the message to form the message digest to be verified.
+ *
+ * Return: 0 if signature could be verified correctly and -EBADMSG when
+ * signature cannot be verified, < 0 on other errors
+ */
+int dilithium_verify_ctx(const struct dilithium_sig *sig,
+			 struct dilithium_ctx *ctx, const uint8_t *m,
+			 size_t mlen, const struct dilithium_pk *pk);
+
+/**
+ * dilithium_verify_init - Initialize a signature verification operation
+ * @ctx: Pointer to an allocated Dilithium context
+ * @pk: Pointer to bit-packed public key
+ *
+ * Initialise a signature verification context so that a multi-fragment message
+ * can be verified.
+ *
+ * Return: 0 (success) or < 0 on error; -EOPNOTSUPP is returned if an
+ * unsupported strength or digest algorithm is required..
+ *
+ * Context: Process context.  May sleep to allocate memory.
+ */
+int dilithium_verify_init(struct dilithium_ctx *ctx,
+			  const struct dilithium_pk *pk);
+
+/**
+ * dilithium_verify_update - Add more data to an already initialized context
+ * @ctx: Pointer to an allocated Dilithium context
+ * @m: Pointer to message fragment to be signed
+ * @mlen: Length of message fragment
+ *
+ * Add more data to the state in a context that has already been initialized.
+ * This can be use to provide a message that is in multiple fragments to the
+ * algorithm.
+ *
+ * Return: 0 (success) or < 0 on error
+ *
+ * Context: Process context.  May sleep to allocate memory.
+ */
+int dilithium_verify_update(struct dilithium_ctx *ctx, const uint8_t *m,
+			    size_t mlen);
+
+/**
+ * dilithium_verify_final - Perform signature verification
+ * @sig: Pointer to signature to be verified
+ * @ctx: Pointer to an allocated and updated Dilithium context
+ * @pk: Pointer to bit-packed public key
+ *
+ * Finalise the state in the Dilithium context and verify the signature.  The
+ * caller must have initialised it and updated it with all the pieces of data.
+ *
+ * Return: 0 if signature could be verified correctly and -EBADMSG when
+ * signature cannot be verified, < 0 on other errors
+ *
+ * Context: Process context.  May sleep to allocate memory.
+ */
+int dilithium_verify_final(const struct dilithium_sig *sig,
+			   struct dilithium_ctx *ctx,
+			   const struct dilithium_pk *pk);
+
+/* No valgrind */
+#define poison(addr, len)
+#define unpoison(addr, len)
+#define is_poisoned(addr, len)
+
+#endif /* DILITHIUM_H */
diff --git a/lib/crypto/mldsa/dilithium_44.c b/lib/crypto/mldsa/dilithium_44.c
new file mode 100644
index 000000000000..1aea716016f0
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_44.c
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+#define DILITHIUM_TYPE_44
+#include "dilithium.h"
+
+#define DILITHIUM_TYPE			"44"
+#define DILITHIUM_MODE			2
+#define DILITHIUM_NIST_CATEGORY		DILITHIUM44_NIST_CATEGORY
+#define DILITHIUM_LAMBDA		DILITHIUM44_LAMBDA
+#define DILITHIUM_K			DILITHIUM44_K
+#define DILITHIUM_L			DILITHIUM44_L
+#define DILITHIUM_ETA			DILITHIUM44_ETA
+#define DILITHIUM_TAU			DILITHIUM44_TAU
+#define DILITHIUM_BETA			DILITHIUM44_BETA
+#define DILITHIUM_GAMMA1		DILITHIUM44_GAMMA1
+#define DILITHIUM_GAMMA2		DILITHIUM44_GAMMA2
+#define DILITHIUM_OMEGA			DILITHIUM44_OMEGA
+
+#define DILITHIUM_CTILDE_BYTES		DILITHIUM44_CTILDE_BYTES
+#define DILITHIUM_POLYT1_PACKEDBYTES	DILITHIUM44_POLYT1_PACKEDBYTES
+#define DILITHIUM_POLYT0_PACKEDBYTES	DILITHIUM44_POLYT0_PACKEDBYTES
+#define DILITHIUM_POLYVECH_PACKEDBYTES	DILITHIUM44_POLYVECH_PACKEDBYTES
+#define DILITHIUM_POLYZ_PACKEDBYTES	DILITHIUM44_POLYZ_PACKEDBYTES
+#define DILITHIUM_POLYW1_PACKEDBYTES	DILITHIUM44_POLYW1_PACKEDBYTES
+#define DILITHIUM_POLYETA_PACKEDBYTES	DILITHIUM44_POLYETA_PACKEDBYTES
+
+#define DILITHIUM_PUBLICKEYBYTES	DILITHIUM44_PUBLICKEYBYTES
+#define DILITHIUM_SECRETKEYBYTES	DILITHIUM44_SECRETKEYBYTES
+#define DILITHIUM_CRYPTO_BYTES		DILITHIUM44_CRYPTO_BYTES
+
+#include "dilithium_ntt.c"
+#include "dilithium_poly.c"
+#include "dilithium_rounding.c"
+#include "dilithium_signature_c.c"
diff --git a/lib/crypto/mldsa/dilithium_44.h b/lib/crypto/mldsa/dilithium_44.h
new file mode 100644
index 000000000000..8f3223a5476d
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_44.h
@@ -0,0 +1,282 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#ifndef DILITHIUM_44_H
+#define DILITHIUM_44_H
+
+/*
+ * Dilithium Security Levels
+ * 2 -> 192 bits of security strength
+ * 3 -> 225 bits of security strength
+ * 5 -> 257 bits of security strength
+ */
+
+/* DILITHIUM_MODE 2 */
+#define DILITHIUM44_NIST_CATEGORY 1
+#define DILITHIUM44_LAMBDA 128
+#define DILITHIUM44_K 4
+#define DILITHIUM44_L 4
+#define DILITHIUM44_ETA 2
+#define DILITHIUM44_TAU 39
+#define DILITHIUM44_BETA 78
+#define DILITHIUM44_GAMMA1 (1 << 17)
+#define DILITHIUM44_GAMMA2 ((DILITHIUM_Q - 1) / 88)
+#define DILITHIUM44_OMEGA 80
+
+#define DILITHIUM44_CTILDE_BYTES (DILITHIUM44_LAMBDA * 2 / 8)
+#define DILITHIUM44_POLYT1_PACKEDBYTES 320
+#define DILITHIUM44_POLYT0_PACKEDBYTES 416
+#define DILITHIUM44_POLYVECH_PACKEDBYTES (DILITHIUM44_OMEGA + DILITHIUM44_K)
+
+#if DILITHIUM44_GAMMA1 == (1 << 17)
+#define DILITHIUM44_POLYZ_PACKEDBYTES 576
+#elif DILITHIUM44_GAMMA1 == (1 << 19)
+#define DILITHIUM44_POLYZ_PACKEDBYTES 640
+#endif
+
+#if DILITHIUM44_GAMMA2 == (DILITHIUM_Q - 1) / 88
+#define DILITHIUM44_POLYW1_PACKEDBYTES 192
+#elif DILITHIUM44_GAMMA2 == (DILITHIUM_Q - 1) / 32
+#define DILITHIUM44_POLYW1_PACKEDBYTES 128
+#endif
+
+#if DILITHIUM44_ETA == 2
+#define DILITHIUM44_POLYETA_PACKEDBYTES 96
+#elif DILITHIUM44_ETA == 4
+#define DILITHIUM44_POLYETA_PACKEDBYTES 128
+#endif
+
+/*
+ * Sizes of the different Dilithium buffer types.
+ *
+ * WARNING: Do not use these defines in your code. If you need the sizes of
+ * the different variable sizes, use sizeof of the different variable structs or
+ * use the different *_size functions documented below to retrieve the data size
+ * of a particular Dilithium component.
+ */
+#define DILITHIUM44_PUBLICKEYBYTES					\
+	(DILITHIUM_SEEDBYTES +						\
+	 DILITHIUM44_K * DILITHIUM44_POLYT1_PACKEDBYTES)
+#define DILITHIUM44_SECRETKEYBYTES					\
+	(2 * DILITHIUM_SEEDBYTES + DILITHIUM_TRBYTES +			\
+	 DILITHIUM44_L * DILITHIUM44_POLYETA_PACKEDBYTES +		\
+	 DILITHIUM44_K * DILITHIUM44_POLYETA_PACKEDBYTES +		\
+	 DILITHIUM44_K * DILITHIUM44_POLYT0_PACKEDBYTES)
+
+#define DILITHIUM44_CRYPTO_BYTES					\
+	(DILITHIUM44_CTILDE_BYTES +					\
+	 DILITHIUM44_L * DILITHIUM44_POLYZ_PACKEDBYTES +		\
+	 DILITHIUM44_POLYVECH_PACKEDBYTES)
+
+#ifndef __ASSEMBLER__
+/*
+ * @brief Dilithium secret key
+ */
+struct dilithium_44_sk {
+	uint8_t sk[DILITHIUM44_SECRETKEYBYTES];
+};
+
+/*
+ * @brief Dilithium public key
+ */
+struct dilithium_44_pk {
+	uint8_t pk[DILITHIUM44_PUBLICKEYBYTES];
+};
+
+/*
+ * @brief Dilithium signature
+ */
+struct dilithium_44_sig {
+	uint8_t sig[DILITHIUM44_CRYPTO_BYTES];
+};
+
+/*
+ * The alignment is based on largest alignment of a polyvecl typedef - this is
+ * the AVX2 definition.
+ */
+#define DILITHIUM_AHAT_ALIGNMENT (32)
+
+/* Size of the AHat matrix for ML-DSA 87 */
+#define DILITHIUM_44_AHAT_SIZE                                              \
+	(256 * sizeof(int32_t) * DILITHIUM44_K * DILITHIUM44_L)
+
+/*
+ * @brief Zeroize Dilithium context allocated with
+ *	  DILITHIUM_CTX_ON_STACK dilithium_ed25519_alloc
+ *
+ * @param [in] ctx Dilithium context to be zeroized
+ */
+static inline void dilithium_44_ctx_zero(struct dilithium_ctx *ctx)
+{
+	if (!ctx)
+		return;
+	dilithium_hash_clear(ctx);
+	if (ctx->ahat) {
+		memzero_explicit(ctx->ahat, ctx->ahat_size);
+		ctx->ahat_expanded = 0;
+	}
+}
+
+/*
+ * @brief Allocate Dilithium stream context on heap
+ *
+ * @param [out] ctx Allocated Dilithium stream context
+ *
+ * @return: 0 on success, < 0 on error
+ */
+struct dilithium_ctx *dilithium_44_ctx_alloc(void);
+
+/*
+ * @brief Allocate Dilithium stream context on heap including additional
+ * parameter relevant for the signature operation.
+ *
+ * \note See \p DILITHIUM_44_CTX_ON_STACK_AHAT for details.
+ *
+ * @param [out] ctx Allocated Dilithium stream context
+ *
+ * @return: 0 on success, < 0 on error
+ */
+struct dilithium_ctx *dilithium_44_ctx_alloc_ahat(void);
+
+/*
+ * @brief Zeroize and free Dilithium stream context
+ *
+ * @param [in] ctx Dilithium stream context to be zeroized and freed
+ */
+void dilithium_44_ctx_zero_free(struct dilithium_ctx *ctx);
+
+/*
+ * @brief Return the size of the Dilithium secret key.
+ */
+static inline unsigned int dilithium_44_sk_size(void)
+{
+	return sizeof_field(struct dilithium_44_sk, sk);
+}
+
+/*
+ * @brief Return the size of the Dilithium public key.
+ */
+static inline unsigned int dilithium_44_pk_size(void)
+{
+	return sizeof_field(struct dilithium_44_pk, pk);
+}
+
+/*
+ * @brief Return the size of the Dilithium signature.
+ */
+static inline unsigned int dilithium_44_sig_size(void)
+{
+	return sizeof_field(struct dilithium_44_sig, sig);
+}
+
+/*
+ * @brief Verifies ML-DSA signature in one shot
+ *
+ * @param [in] sig pointer to input signature
+ * @param [in] m pointer to message
+ * @param [in] mlen length of message
+ * @param [in] pk pointer to bit-packed public key
+ *
+ * @return 0 if signature could be verified correctly and -EBADMSG when
+ * signature cannot be verified, < 0 on other errors
+ */
+int dilithium_44_verify(const struct dilithium_44_sig *sig, const uint8_t *m,
+			size_t mlen, const struct dilithium_44_pk *pk);
+
+/*
+ * @brief Verifies signature with Dilithium context in one shot
+ *
+ * This API allows the caller to provide an arbitrary context buffer which
+ * is hashed together with the message to form the message digest to be signed.
+ *
+ * @param [in] sig pointer to input signature
+ * @param [in] ctx reference to the allocated Dilithium context handle
+ * @param [in] m pointer to message
+ * @param [in] mlen length of message
+ * @param [in] pk pointer to bit-packed public key
+ *
+ * @return 0 if signature could be verified correctly and -EBADMSG when
+ * signature cannot be verified, < 0 on other errors
+ */
+int dilithium_44_verify_ctx(const struct dilithium_44_sig *sig,
+				struct dilithium_ctx *ctx,
+				const uint8_t *m, size_t mlen,
+				const struct dilithium_44_pk *pk);
+
+/*
+ * @brief Initializes a signature verification operation
+ *
+ * This call is intended to support messages that are located in non-contiguous
+ * places and even becomes available at different times. This call is to be
+ * used together with the dilithium_verify_update and
+ * dilithium_verify_final.
+ *
+ * @param [in,out] ctx pointer to an allocated Dilithium context
+ * @param [in] pk pointer to bit-packed public key
+ *
+ * @return 0 (success) or < 0 on error; -EOPNOTSUPP is returned if a different
+ *	   hash than lc_shake256 is used.
+ */
+int dilithium_44_verify_init(struct dilithium_ctx *ctx,
+			     const struct dilithium_44_pk *pk);
+
+/*
+ * @brief Add more data to an already initialized signature state
+ *
+ * This call is intended to support messages that are located in non-contiguous
+ * places and even becomes available at different times. This call is to be
+ * used together with the dilithium_verify_init and
+ * dilithium_verify_final.
+ *
+ * @param [in,out] ctx pointer to Dilithium context that was initialized with
+ *			    dilithium_sign_init
+ * @param [in] m pointer to message to be signed
+ * @param [in] mlen length of message
+ *
+ * @return 0 (success) or < 0 on error
+ */
+int dilithium_44_verify_update(struct dilithium_ctx *ctx, const uint8_t *m,
+			       size_t mlen);
+
+/*
+ * @brief Verifies signature
+ *
+ * @param [in] sig pointer to output signature
+ * @param [in] ctx pointer to Dilithium context that was initialized with
+ *			dilithium_sign_init and filled with
+ *			dilithium_sign_update
+ * @param [in] pk pointer to bit-packed public key
+ *
+ * @return 0 if signature could be verified correctly and -EBADMSG when
+ * signature cannot be verified, < 0 on other errors
+ */
+int dilithium_44_verify_final(const struct dilithium_44_sig *sig,
+			      struct dilithium_ctx *ctx,
+			      const struct dilithium_44_pk *pk);
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* DILITHIUM_44_H */
diff --git a/lib/crypto/mldsa/dilithium_65.c b/lib/crypto/mldsa/dilithium_65.c
new file mode 100644
index 000000000000..08f3a8e71228
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_65.c
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+#define DILITHIUM_TYPE_65
+#include "dilithium.h"
+
+#define DILITHIUM_TYPE			"65"
+#define DILITHIUM_MODE			3
+#define DILITHIUM_NIST_CATEGORY		DILITHIUM65_NIST_CATEGORY
+#define DILITHIUM_LAMBDA		DILITHIUM65_LAMBDA
+#define DILITHIUM_K			DILITHIUM65_K
+#define DILITHIUM_L			DILITHIUM65_L
+#define DILITHIUM_ETA			DILITHIUM65_ETA
+#define DILITHIUM_TAU			DILITHIUM65_TAU
+#define DILITHIUM_BETA			DILITHIUM65_BETA
+#define DILITHIUM_GAMMA1		DILITHIUM65_GAMMA1
+#define DILITHIUM_GAMMA2		DILITHIUM65_GAMMA2
+#define DILITHIUM_OMEGA			DILITHIUM65_OMEGA
+
+#define DILITHIUM_CTILDE_BYTES		DILITHIUM65_CTILDE_BYTES
+#define DILITHIUM_POLYT1_PACKEDBYTES	DILITHIUM65_POLYT1_PACKEDBYTES
+#define DILITHIUM_POLYT0_PACKEDBYTES	DILITHIUM65_POLYT0_PACKEDBYTES
+#define DILITHIUM_POLYVECH_PACKEDBYTES	DILITHIUM65_POLYVECH_PACKEDBYTES
+#define DILITHIUM_POLYZ_PACKEDBYTES	DILITHIUM65_POLYZ_PACKEDBYTES
+#define DILITHIUM_POLYW1_PACKEDBYTES	DILITHIUM65_POLYW1_PACKEDBYTES
+#define DILITHIUM_POLYETA_PACKEDBYTES	DILITHIUM65_POLYETA_PACKEDBYTES
+
+#define DILITHIUM_PUBLICKEYBYTES	DILITHIUM65_PUBLICKEYBYTES
+#define DILITHIUM_SECRETKEYBYTES	DILITHIUM65_SECRETKEYBYTES
+#define DILITHIUM_CRYPTO_BYTES		DILITHIUM65_CRYPTO_BYTES
+
+#include "dilithium_ntt.c"
+#include "dilithium_poly.c"
+#include "dilithium_rounding.c"
+#include "dilithium_signature_c.c"
diff --git a/lib/crypto/mldsa/dilithium_65.h b/lib/crypto/mldsa/dilithium_65.h
new file mode 100644
index 000000000000..faaa11a2b2e6
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_65.h
@@ -0,0 +1,282 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#ifndef DILITHIUM_65_H
+#define DILITHIUM_65_H
+
+/*
+ * Dilithium Security Levels
+ * 2 -> 192 bits of security strength
+ * 3 -> 225 bits of security strength
+ * 5 -> 257 bits of security strength
+ */
+
+/* DILITHIUM_MODE 3 */
+#define DILITHIUM65_NIST_CATEGORY 3
+#define DILITHIUM65_LAMBDA 192
+#define DILITHIUM65_K 6
+#define DILITHIUM65_L 5
+#define DILITHIUM65_ETA 4
+#define DILITHIUM65_TAU 49
+#define DILITHIUM65_BETA 196
+#define DILITHIUM65_GAMMA1 (1 << 19)
+#define DILITHIUM65_GAMMA2 ((DILITHIUM_Q - 1) / 32)
+#define DILITHIUM65_OMEGA 55
+
+#define DILITHIUM65_CTILDE_BYTES (DILITHIUM65_LAMBDA * 2 / 8)
+#define DILITHIUM65_POLYT1_PACKEDBYTES 320
+#define DILITHIUM65_POLYT0_PACKEDBYTES 416
+#define DILITHIUM65_POLYVECH_PACKEDBYTES (DILITHIUM65_OMEGA + DILITHIUM65_K)
+
+#if DILITHIUM65_GAMMA1 == (1 << 17)
+#define DILITHIUM65_POLYZ_PACKEDBYTES 576
+#elif DILITHIUM65_GAMMA1 == (1 << 19)
+#define DILITHIUM65_POLYZ_PACKEDBYTES 640
+#endif
+
+#if DILITHIUM65_GAMMA2 == (DILITHIUM_Q - 1) / 88
+#define DILITHIUM65_POLYW1_PACKEDBYTES 192
+#elif DILITHIUM65_GAMMA2 == (DILITHIUM_Q - 1) / 32
+#define DILITHIUM65_POLYW1_PACKEDBYTES 128
+#endif
+
+#if DILITHIUM65_ETA == 2
+#define DILITHIUM65_POLYETA_PACKEDBYTES 96
+#elif DILITHIUM65_ETA == 4
+#define DILITHIUM65_POLYETA_PACKEDBYTES 128
+#endif
+
+/*
+ * Sizes of the different Dilithium buffer types.
+ *
+ * WARNING: Do not use these defines in your code. If you need the sizes of
+ * the different variable sizes, use sizeof of the different variable structs or
+ * use the different *_size functions documented below to retrieve the data size
+ * of a particular Dilithium component.
+ */
+#define DILITHIUM65_PUBLICKEYBYTES			\
+	(DILITHIUM_SEEDBYTES +				\
+	 DILITHIUM65_K * DILITHIUM65_POLYT1_PACKEDBYTES)
+#define DILITHIUM65_SECRETKEYBYTES			\
+	(2 * DILITHIUM_SEEDBYTES + DILITHIUM_TRBYTES +	\
+	 DILITHIUM65_L * DILITHIUM65_POLYETA_PACKEDBYTES +	\
+	 DILITHIUM65_K * DILITHIUM65_POLYETA_PACKEDBYTES +	\
+	 DILITHIUM65_K * DILITHIUM65_POLYT0_PACKEDBYTES)
+
+#define DILITHIUM65_CRYPTO_BYTES				\
+	(DILITHIUM65_CTILDE_BYTES +			\
+	 DILITHIUM65_L * DILITHIUM65_POLYZ_PACKEDBYTES +	\
+	 DILITHIUM65_POLYVECH_PACKEDBYTES)
+
+#ifndef __ASSEMBLER__
+/*
+ * @brief Dilithium secret key
+ */
+struct dilithium_65_sk {
+	uint8_t sk[DILITHIUM65_SECRETKEYBYTES];
+};
+
+/*
+ * @brief Dilithium public key
+ */
+struct dilithium_65_pk {
+	uint8_t pk[DILITHIUM65_PUBLICKEYBYTES];
+};
+
+/*
+ * @brief Dilithium signature
+ */
+struct dilithium_65_sig {
+	uint8_t sig[DILITHIUM65_CRYPTO_BYTES];
+};
+
+/*
+ * The alignment is based on largest alignment of a polyvecl typedef - this is
+ * the AVX2 definition.
+ */
+#define DILITHIUM_AHAT_ALIGNMENT (32)
+
+/* Size of the AHat matrix for ML-DSA 87 */
+#define DILITHIUM_65_AHAT_SIZE					\
+	(256 * sizeof(int32_t) * DILITHIUM65_K * DILITHIUM65_L)
+
+/*
+ * @brief Zeroize Dilithium context allocated with
+ *	  DILITHIUM_CTX_ON_STACK dilithium_ed25519_alloc
+ *
+ * @param [in] ctx Dilithium context to be zeroized
+ */
+static inline void dilithium_65_ctx_zero(struct dilithium_ctx *ctx)
+{
+	if (!ctx)
+		return;
+	dilithium_hash_clear(ctx);
+	if (ctx->ahat) {
+		memzero_explicit(ctx->ahat, ctx->ahat_size);
+		ctx->ahat_expanded = 0;
+	}
+}
+
+/*
+ * @brief Allocate Dilithium stream context on heap
+ *
+ * @param [out] ctx Allocated Dilithium stream context
+ *
+ * @return: 0 on success, < 0 on error
+ */
+struct dilithium_ctx *dilithium_65_ctx_alloc(void);
+
+/*
+ * @brief Allocate Dilithium stream context on heap including additional
+ * parameter relevant for the signature operation.
+ *
+ * \note See \p DILITHIUM_65_CTX_ON_STACK_AHAT for details.
+ *
+ * @param [out] ctx Allocated Dilithium stream context
+ *
+ * @return: 0 on success, < 0 on error
+ */
+struct dilithium_ctx *dilithium_65_ctx_alloc_ahat(void);
+
+/*
+ * @brief Zeroize and free Dilithium stream context
+ *
+ * @param [in] ctx Dilithium stream context to be zeroized and freed
+ */
+void dilithium_65_ctx_zero_free(struct dilithium_ctx *ctx);
+
+/*
+ * @brief Return the size of the Dilithium secret key.
+ */
+static inline unsigned int dilithium_65_sk_size(void)
+{
+	return sizeof_field(struct dilithium_65_sk, sk);
+}
+
+/*
+ * @brief Return the size of the Dilithium public key.
+ */
+static inline unsigned int dilithium_65_pk_size(void)
+{
+	return sizeof_field(struct dilithium_65_pk, pk);
+}
+
+/*
+ * @brief Return the size of the Dilithium signature.
+ */
+static inline unsigned int dilithium_65_sig_size(void)
+{
+	return sizeof_field(struct dilithium_65_sig, sig);
+}
+
+/*
+ * @brief Verifies ML-DSA signature in one shot
+ *
+ * @param [in] sig pointer to input signature
+ * @param [in] m pointer to message
+ * @param [in] mlen length of message
+ * @param [in] pk pointer to bit-packed public key
+ *
+ * @return 0 if signature could be verified correctly and -EBADMSG when
+ * signature cannot be verified, < 0 on other errors
+ */
+int dilithium_65_verify(const struct dilithium_65_sig *sig, const uint8_t *m,
+			size_t mlen, const struct dilithium_65_pk *pk);
+
+/*
+ * @brief Verifies signature with Dilithium context in one shot
+ *
+ * This API allows the caller to provide an arbitrary context buffer which
+ * is hashed together with the message to form the message digest to be signed.
+ *
+ * @param [in] sig pointer to input signature
+ * @param [in] ctx reference to the allocated Dilithium context handle
+ * @param [in] m pointer to message
+ * @param [in] mlen length of message
+ * @param [in] pk pointer to bit-packed public key
+ *
+ * @return 0 if signature could be verified correctly and -EBADMSG when
+ * signature cannot be verified, < 0 on other errors
+ */
+int dilithium_65_verify_ctx(const struct dilithium_65_sig *sig,
+			    struct dilithium_ctx *ctx,
+			    const uint8_t *m, size_t mlen,
+			    const struct dilithium_65_pk *pk);
+
+/*
+ * @brief Initializes a signature verification operation
+ *
+ * This call is intended to support messages that are located in non-contiguous
+ * places and even becomes available at different times. This call is to be
+ * used together with the dilithium_verify_update and
+ * dilithium_verify_final.
+ *
+ * @param [in,out] ctx pointer to an allocated Dilithium context
+ * @param [in] pk pointer to bit-packed public key
+ *
+ * @return 0 (success) or < 0 on error; -EOPNOTSUPP is returned if a different
+ *	   hash than lc_shake256 is used.
+ */
+int dilithium_65_verify_init(struct dilithium_ctx *ctx,
+			     const struct dilithium_65_pk *pk);
+
+/*
+ * @brief Add more data to an already initialized signature state
+ *
+ * This call is intended to support messages that are located in non-contiguous
+ * places and even becomes available at different times. This call is to be
+ * used together with the dilithium_verify_init and
+ * dilithium_verify_final.
+ *
+ * @param [in,out] ctx pointer to Dilithium context that was initialized with
+ *			    dilithium_sign_init
+ * @param [in] m pointer to message to be signed
+ * @param [in] mlen length of message
+ *
+ * @return 0 (success) or < 0 on error
+ */
+int dilithium_65_verify_update(struct dilithium_ctx *ctx, const uint8_t *m,
+			       size_t mlen);
+
+/*
+ * @brief Verifies signature
+ *
+ * @param [in] sig pointer to output signature
+ * @param [in] ctx pointer to Dilithium context that was initialized with
+ *			dilithium_sign_init and filled with
+ *			dilithium_sign_update
+ * @param [in] pk pointer to bit-packed public key
+ *
+ * @return 0 if signature could be verified correctly and -EBADMSG when
+ * signature cannot be verified, < 0 on other errors
+ */
+int dilithium_65_verify_final(const struct dilithium_65_sig *sig,
+			      struct dilithium_ctx *ctx,
+			      const struct dilithium_65_pk *pk);
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* DILITHIUM_65_H */
diff --git a/lib/crypto/mldsa/dilithium_87.c b/lib/crypto/mldsa/dilithium_87.c
new file mode 100644
index 000000000000..fcc3e0229ed9
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_87.c
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+#define DILITHIUM_TYPE_87
+#include "dilithium.h"
+
+#define DILITHIUM_TYPE			"87"
+#define DILITHIUM_MODE			5
+#define DILITHIUM_NIST_CATEGORY		DILITHIUM87_NIST_CATEGORY
+#define DILITHIUM_LAMBDA		DILITHIUM87_LAMBDA
+#define DILITHIUM_K			DILITHIUM87_K
+#define DILITHIUM_L			DILITHIUM87_L
+#define DILITHIUM_ETA			DILITHIUM87_ETA
+#define DILITHIUM_TAU			DILITHIUM87_TAU
+#define DILITHIUM_BETA			DILITHIUM87_BETA
+#define DILITHIUM_GAMMA1		DILITHIUM87_GAMMA1
+#define DILITHIUM_GAMMA2		DILITHIUM87_GAMMA2
+#define DILITHIUM_OMEGA			DILITHIUM87_OMEGA
+
+#define DILITHIUM_CTILDE_BYTES		DILITHIUM87_CTILDE_BYTES
+#define DILITHIUM_POLYT1_PACKEDBYTES	DILITHIUM87_POLYT1_PACKEDBYTES
+#define DILITHIUM_POLYT0_PACKEDBYTES	DILITHIUM87_POLYT0_PACKEDBYTES
+#define DILITHIUM_POLYVECH_PACKEDBYTES	DILITHIUM87_POLYVECH_PACKEDBYTES
+#define DILITHIUM_POLYZ_PACKEDBYTES	DILITHIUM87_POLYZ_PACKEDBYTES
+#define DILITHIUM_POLYW1_PACKEDBYTES	DILITHIUM87_POLYW1_PACKEDBYTES
+#define DILITHIUM_POLYETA_PACKEDBYTES	DILITHIUM87_POLYETA_PACKEDBYTES
+
+#define DILITHIUM_PUBLICKEYBYTES	DILITHIUM87_PUBLICKEYBYTES
+#define DILITHIUM_SECRETKEYBYTES	DILITHIUM87_SECRETKEYBYTES
+#define DILITHIUM_CRYPTO_BYTES		DILITHIUM87_CRYPTO_BYTES
+
+#include "dilithium_ntt.c"
+#include "dilithium_poly.c"
+#include "dilithium_rounding.c"
+#include "dilithium_signature_c.c"
diff --git a/lib/crypto/mldsa/dilithium_87.h b/lib/crypto/mldsa/dilithium_87.h
new file mode 100644
index 000000000000..d2de502360a4
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_87.h
@@ -0,0 +1,282 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#ifndef DILITHIUM_87_H
+#define DILITHIUM_87_H
+
+/*
+ * Dilithium Security Levels
+ * 2 -> 192 bits of security strength
+ * 3 -> 225 bits of security strength
+ * 5 -> 257 bits of security strength
+ */
+
+/* DILITHIUM_MODE 5 */
+#define DILITHIUM87_NIST_CATEGORY 5
+#define DILITHIUM87_LAMBDA 256
+#define DILITHIUM87_K 8
+#define DILITHIUM87_L 7
+#define DILITHIUM87_ETA 2
+#define DILITHIUM87_TAU 60
+#define DILITHIUM87_BETA 120
+#define DILITHIUM87_GAMMA1 (1 << 19)
+#define DILITHIUM87_GAMMA2 ((DILITHIUM_Q - 1) / 32)
+#define DILITHIUM87_OMEGA 75
+
+#define DILITHIUM87_CTILDE_BYTES (DILITHIUM87_LAMBDA * 2 / 8)
+#define DILITHIUM87_POLYT1_PACKEDBYTES 320
+#define DILITHIUM87_POLYT0_PACKEDBYTES 416
+#define DILITHIUM87_POLYVECH_PACKEDBYTES (DILITHIUM87_OMEGA + DILITHIUM87_K)
+
+#if DILITHIUM87_GAMMA1 == (1 << 17)
+#define DILITHIUM87_POLYZ_PACKEDBYTES 576
+#elif DILITHIUM87_GAMMA1 == (1 << 19)
+#define DILITHIUM87_POLYZ_PACKEDBYTES 640
+#endif
+
+#if DILITHIUM87_GAMMA2 == (DILITHIUM_Q - 1) / 88
+#define DILITHIUM87_POLYW1_PACKEDBYTES 192
+#elif DILITHIUM87_GAMMA2 == (DILITHIUM_Q - 1) / 32
+#define DILITHIUM87_POLYW1_PACKEDBYTES 128
+#endif
+
+#if DILITHIUM87_ETA == 2
+#define DILITHIUM87_POLYETA_PACKEDBYTES 96
+#elif DILITHIUM87_ETA == 4
+#define DILITHIUM87_POLYETA_PACKEDBYTES 128
+#endif
+
+/*
+ * Sizes of the different Dilithium buffer types.
+ *
+ * WARNING: Do not use these defines in your code. If you need the sizes of
+ * the different variable sizes, use sizeof of the different variable structs or
+ * use the different *_size functions documented below to retrieve the data size
+ * of a particular Dilithium component.
+ */
+#define DILITHIUM87_PUBLICKEYBYTES			\
+	(DILITHIUM_SEEDBYTES +				\
+	 DILITHIUM87_K * DILITHIUM87_POLYT1_PACKEDBYTES)
+#define DILITHIUM87_SECRETKEYBYTES			\
+	(2 * DILITHIUM_SEEDBYTES + DILITHIUM_TRBYTES +	\
+	 DILITHIUM87_L * DILITHIUM87_POLYETA_PACKEDBYTES +	\
+	 DILITHIUM87_K * DILITHIUM87_POLYETA_PACKEDBYTES +	\
+	 DILITHIUM87_K * DILITHIUM87_POLYT0_PACKEDBYTES)
+
+#define DILITHIUM87_CRYPTO_BYTES				\
+	(DILITHIUM87_CTILDE_BYTES +			\
+	 DILITHIUM87_L * DILITHIUM87_POLYZ_PACKEDBYTES +	\
+	 DILITHIUM87_POLYVECH_PACKEDBYTES)
+
+#ifndef __ASSEMBLER__
+/*
+ * @brief Dilithium secret key
+ */
+struct dilithium_87_sk {
+	uint8_t sk[DILITHIUM87_SECRETKEYBYTES];
+};
+
+/*
+ * @brief Dilithium public key
+ */
+struct dilithium_87_pk {
+	uint8_t pk[DILITHIUM87_PUBLICKEYBYTES];
+};
+
+/*
+ * @brief Dilithium signature
+ */
+struct dilithium_87_sig {
+	uint8_t sig[DILITHIUM87_CRYPTO_BYTES];
+};
+
+/*
+ * The alignment is based on largest alignment of a polyvecl typedef - this is
+ * the AVX2 definition.
+ */
+#define DILITHIUM_AHAT_ALIGNMENT (32)
+
+/* Size of the AHat matrix for ML-DSA 87 */
+#define DILITHIUM_87_AHAT_SIZE					\
+	(256 * sizeof(int32_t) * DILITHIUM87_K * DILITHIUM87_L)
+
+/*
+ * @brief Zeroize Dilithium context allocated with
+ *	  DILITHIUM87_CTX_ON_STACK dilithium_ed25519_alloc
+ *
+ * @param [in] ctx Dilithium context to be zeroized
+ */
+static inline void dilithium_87_ctx_zero(struct dilithium_ctx *ctx)
+{
+	if (!ctx)
+		return;
+	dilithium_hash_clear(ctx);
+	if (ctx->ahat) {
+		memzero_explicit(ctx->ahat, ctx->ahat_size);
+		ctx->ahat_expanded = 0;
+	}
+}
+
+/*
+ * @brief Allocate Dilithium stream context on heap
+ *
+ * @param [out] ctx Allocated Dilithium stream context
+ *
+ * @return: 0 on success, < 0 on error
+ */
+struct dilithium_ctx *dilithium_87_ctx_alloc(void);
+
+/*
+ * @brief Allocate Dilithium stream context on heap including additional
+ * parameter relevant for the signature operation.
+ *
+ * \note See \p DILITHIUM_87_CTX_ON_STACK_AHAT for details.
+ *
+ * @param [out] ctx Allocated Dilithium stream context
+ *
+ * @return: 0 on success, < 0 on error
+ */
+struct dilithium_ctx *dilithium_87_ctx_alloc_ahat(void);
+
+/*
+ * @brief Zeroize and free Dilithium stream context
+ *
+ * @param [in] ctx Dilithium stream context to be zeroized and freed
+ */
+void dilithium_87_ctx_zero_free(struct dilithium_ctx *ctx);
+
+/*
+ * @brief Return the size of the Dilithium secret key.
+ */
+static inline unsigned int dilithium_87_sk_size(void)
+{
+	return sizeof_field(struct dilithium_87_sk, sk);
+}
+
+/*
+ * @brief Return the size of the Dilithium public key.
+ */
+static inline unsigned int dilithium_87_pk_size(void)
+{
+	return sizeof_field(struct dilithium_87_pk, pk);
+}
+
+/*
+ * @brief Return the size of the Dilithium signature.
+ */
+static inline unsigned int dilithium_87_sig_size(void)
+{
+	return sizeof_field(struct dilithium_87_sig, sig);
+}
+
+/*
+ * @brief Verifies ML-DSA signature in one shot
+ *
+ * @param [in] sig pointer to input signature
+ * @param [in] m pointer to message
+ * @param [in] mlen length of message
+ * @param [in] pk pointer to bit-packed public key
+ *
+ * @return 0 if signature could be verified correctly and -EBADMSG when
+ * signature cannot be verified, < 0 on other errors
+ */
+int dilithium_87_verify(const struct dilithium_87_sig *sig, const uint8_t *m,
+			size_t mlen, const struct dilithium_87_pk *pk);
+
+/*
+ * @brief Verifies signature with Dilithium context in one shot
+ *
+ * This API allows the caller to provide an arbitrary context buffer which
+ * is hashed together with the message to form the message digest to be signed.
+ *
+ * @param [in] sig pointer to input signature
+ * @param [in] ctx reference to the allocated Dilithium context handle
+ * @param [in] m pointer to message
+ * @param [in] mlen length of message
+ * @param [in] pk pointer to bit-packed public key
+ *
+ * @return 0 if signature could be verified correctly and -EBADMSG when
+ * signature cannot be verified, < 0 on other errors
+ */
+int dilithium_87_verify_ctx(const struct dilithium_87_sig *sig,
+			    struct dilithium_ctx *ctx,
+			    const uint8_t *m, size_t mlen,
+			    const struct dilithium_87_pk *pk);
+
+/*
+ * @brief Initializes a signature verification operation
+ *
+ * This call is intended to support messages that are located in non-contiguous
+ * places and even becomes available at different times. This call is to be
+ * used together with the dilithium_verify_update and
+ * dilithium_verify_final.
+ *
+ * @param [in,out] ctx pointer to an allocated Dilithium context
+ * @param [in] pk pointer to bit-packed public key
+ *
+ * @return 0 (success) or < 0 on error; -EOPNOTSUPP is returned if a different
+ *	   hash than lc_shake256 is used.
+ */
+int dilithium_87_verify_init(struct dilithium_ctx *ctx,
+			     const struct dilithium_87_pk *pk);
+
+/*
+ * @brief Add more data to an already initialized signature state
+ *
+ * This call is intended to support messages that are located in non-contiguous
+ * places and even becomes available at different times. This call is to be
+ * used together with the dilithium_verify_init and
+ * dilithium_verify_final.
+ *
+ * @param [in,out] ctx pointer to Dilithium context that was initialized with
+ *			    dilithium_sign_init
+ * @param [in] m pointer to message to be signed
+ * @param [in] mlen length of message
+ *
+ * @return 0 (success) or < 0 on error
+ */
+int dilithium_87_verify_update(struct dilithium_ctx *ctx, const uint8_t *m,
+			       size_t mlen);
+
+/*
+ * @brief Verifies signature
+ *
+ * @param [in] sig pointer to output signature
+ * @param [in] ctx pointer to Dilithium context that was initialized with
+ *			dilithium_sign_init and filled with
+ *			dilithium_sign_update
+ * @param [in] pk pointer to bit-packed public key
+ *
+ * @return 0 if signature could be verified correctly and -EBADMSG when
+ * signature cannot be verified, < 0 on other errors
+ */
+int dilithium_87_verify_final(const struct dilithium_87_sig *sig,
+			      struct dilithium_ctx *ctx,
+			      const struct dilithium_87_pk *pk);
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* DILITHIUM_87_H */
diff --git a/lib/crypto/mldsa/dilithium_api.c b/lib/crypto/mldsa/dilithium_api.c
new file mode 100644
index 000000000000..456e9e9c145d
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_api.c
@@ -0,0 +1,429 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#ifndef DILITHIUM_API_H
+#define DILITHIUM_API_H
+
+#include "dilithium.h"
+
+void dilithium_ctx_zero(struct dilithium_ctx *ctx)
+{
+	if (!ctx)
+		return;
+
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+	dilithium_87_ctx_zero(ctx);
+#elif defined(CONFIG_CRYPTO_LIB_MLDSA_65)
+	dilithium_65_ctx_zero(ctx);
+#elif defined(CONFIG_CRYPTO_LIB_MLDSA_44)
+	dilithium_44_ctx_zero(ctx);
+#endif
+}
+
+void dilithium_ctx_internal(struct dilithium_ctx *ctx)
+{
+	if (ctx)
+		ctx->ml_dsa_internal = true;
+}
+
+void dilithium_ctx_userctx(struct dilithium_ctx *ctx, const uint8_t *userctx,
+			   size_t userctxlen)
+{
+	if (ctx) {
+		ctx->userctx = userctx;
+		ctx->userctxlen = userctxlen;
+	}
+}
+
+void dilithium_ctx_external_mu(struct dilithium_ctx *ctx, const uint8_t *external_mu,
+			       size_t external_mu_len)
+{
+	if (ctx) {
+		ctx->external_mu = external_mu;
+		ctx->external_mu_len = external_mu_len;
+	}
+}
+
+void dilithium_ctx_drop_ahat(struct dilithium_ctx *ctx)
+{
+	if (ctx)
+		ctx->ahat_expanded = 0;
+}
+
+enum dilithium_type dilithium_pk_type(const struct dilithium_pk *pk)
+{
+	if (!pk)
+		return DILITHIUM_UNKNOWN;
+	return pk->dilithium_type;
+}
+
+enum dilithium_type dilithium_sig_type(const struct dilithium_sig *sig)
+{
+	if (!sig)
+		return DILITHIUM_UNKNOWN;
+	return sig->dilithium_type;
+}
+
+unsigned int dilithium_pk_size(enum dilithium_type dilithium_type)
+{
+	switch (dilithium_type) {
+	case DILITHIUM_87:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+		return sizeof_field(struct dilithium_pk, key.pk_87);
+#else
+		return 0;
+#endif
+	case DILITHIUM_65:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+		return sizeof_field(struct dilithium_pk, key.pk_65);
+#else
+		return 0;
+#endif
+	case DILITHIUM_44:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+		return sizeof_field(struct dilithium_pk, key.pk_44);
+#else
+		return 0;
+#endif
+	case DILITHIUM_UNKNOWN:
+	default:
+		return 0;
+	}
+}
+
+unsigned int dilithium_sig_size(enum dilithium_type dilithium_type)
+{
+	switch (dilithium_type) {
+	case DILITHIUM_87:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+		return sizeof_field(struct dilithium_sig, sig.sig_87);
+#else
+		return 0;
+#endif
+	case DILITHIUM_65:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+		return sizeof_field(struct dilithium_sig, sig.sig_65);
+#else
+		return 0;
+#endif
+	case DILITHIUM_44:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+		return sizeof_field(struct dilithium_sig, sig.sig_44);
+#else
+		return 0;
+#endif
+	case DILITHIUM_UNKNOWN:
+	default:
+		return 0;
+	}
+}
+
+int dilithium_pk_load(struct dilithium_pk *pk,
+		      const uint8_t *src_key, size_t src_key_len)
+{
+	if (!pk || !src_key || src_key_len == 0) {
+		return -EINVAL;
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+	} else if (src_key_len == dilithium_pk_size(DILITHIUM_87)) {
+		struct dilithium_87_pk *_pk = &pk->key.pk_87;
+
+		memcpy(_pk->pk, src_key, src_key_len);
+		pk->dilithium_type = DILITHIUM_87;
+		return 0;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+	} else if (src_key_len == dilithium_pk_size(DILITHIUM_65)) {
+		struct dilithium_65_pk *_pk = &pk->key.pk_65;
+
+		memcpy(_pk->pk, src_key, src_key_len);
+		pk->dilithium_type = DILITHIUM_65;
+		return 0;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+	} else if (src_key_len == dilithium_pk_size(DILITHIUM_44)) {
+		struct dilithium_44_pk *_pk = &pk->key.pk_44;
+
+		memcpy(_pk->pk, src_key, src_key_len);
+		pk->dilithium_type = DILITHIUM_44;
+		return 0;
+#endif
+	} else {
+		return -EINVAL;
+	}
+}
+
+int dilithium_sig_load(struct dilithium_sig *sig,
+		       const uint8_t *src_sig, size_t src_sig_len)
+{
+	if (!sig || !src_sig || src_sig_len == 0) {
+		return -EINVAL;
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+	} else if (src_sig_len == dilithium_sig_size(DILITHIUM_87)) {
+		struct dilithium_87_sig *_sig = &sig->sig.sig_87;
+
+		memcpy(_sig->sig, src_sig, src_sig_len);
+		sig->dilithium_type = DILITHIUM_87;
+		return 0;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+	} else if (src_sig_len == dilithium_sig_size(DILITHIUM_65)) {
+		struct dilithium_65_sig *_sig = &sig->sig.sig_65;
+
+		memcpy(_sig->sig, src_sig, src_sig_len);
+		sig->dilithium_type = DILITHIUM_65;
+		return 0;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+	} else if (src_sig_len == dilithium_sig_size(DILITHIUM_44)) {
+		struct dilithium_44_sig *_sig = &sig->sig.sig_44;
+
+		memcpy(_sig->sig, src_sig, src_sig_len);
+		sig->dilithium_type = DILITHIUM_44;
+		return 0;
+#endif
+	} else {
+		return -EINVAL;
+	}
+}
+
+int dilithium_pk_ptr(uint8_t **dilithium_key,
+		     size_t *dilithium_key_len, struct dilithium_pk *pk)
+{
+	if (!pk || !dilithium_key || !dilithium_key_len) {
+		return -EINVAL;
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+	} else if (pk->dilithium_type == DILITHIUM_87) {
+		struct dilithium_87_pk *_pk = &pk->key.pk_87;
+
+		*dilithium_key = _pk->pk;
+		*dilithium_key_len = dilithium_pk_size(pk->dilithium_type);
+		return 0;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+	} else if (pk->dilithium_type == DILITHIUM_65) {
+		struct dilithium_65_pk *_pk = &pk->key.pk_65;
+
+		*dilithium_key = _pk->pk;
+		*dilithium_key_len = dilithium_pk_size(pk->dilithium_type);
+		return 0;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+	} else if (pk->dilithium_type == DILITHIUM_44) {
+		struct dilithium_44_pk *_pk = &pk->key.pk_44;
+
+		*dilithium_key = _pk->pk;
+		*dilithium_key_len = dilithium_pk_size(pk->dilithium_type);
+		return 0;
+#endif
+	} else {
+		return -EINVAL;
+	}
+}
+
+int dilithium_sig_ptr(uint8_t **dilithium_sig,
+		      size_t *dilithium_sig_len, struct dilithium_sig *sig)
+{
+	if (!sig || !dilithium_sig || !dilithium_sig_len) {
+		return -EINVAL;
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+	} else if (sig->dilithium_type == DILITHIUM_87) {
+		struct dilithium_87_sig *_sig = &sig->sig.sig_87;
+
+		*dilithium_sig = _sig->sig;
+		*dilithium_sig_len = dilithium_sig_size(sig->dilithium_type);
+		return 0;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+	} else if (sig->dilithium_type == DILITHIUM_65) {
+		struct dilithium_65_sig *_sig = &sig->sig.sig_65;
+
+		*dilithium_sig = _sig->sig;
+		*dilithium_sig_len = dilithium_sig_size(sig->dilithium_type);
+		return 0;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+	} else if (sig->dilithium_type == DILITHIUM_44) {
+		struct dilithium_44_sig *_sig = &sig->sig.sig_44;
+
+		*dilithium_sig = _sig->sig;
+		*dilithium_sig_len = dilithium_sig_size(sig->dilithium_type);
+		return 0;
+#endif
+	} else {
+		return -EINVAL;
+	}
+}
+
+int dilithium_verify(const struct dilithium_sig *sig, const uint8_t *m,
+		     size_t mlen, const struct dilithium_pk *pk)
+{
+	if (!pk || !sig || sig->dilithium_type != pk->dilithium_type)
+		return -EINVAL;
+
+	switch (pk->dilithium_type) {
+	case DILITHIUM_87:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+		return dilithium_87_verify(&sig->sig.sig_87, m, mlen,
+					   &pk->key.pk_87);
+#else
+		return -EOPNOTSUPP;
+#endif
+	case DILITHIUM_65:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+		return dilithium_65_verify(&sig->sig.sig_65, m, mlen,
+					   &pk->key.pk_65);
+#else
+		return -EOPNOTSUPP;
+#endif
+	case DILITHIUM_44:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+		return dilithium_44_verify(&sig->sig.sig_44, m, mlen,
+					   &pk->key.pk_44);
+#else
+		return -EOPNOTSUPP;
+#endif
+	case DILITHIUM_UNKNOWN:
+	default:
+		return -EOPNOTSUPP;
+	}
+}
+
+int dilithium_verify_ctx(const struct dilithium_sig *sig,
+			 struct dilithium_ctx *ctx, const uint8_t *m,
+			 size_t mlen, const struct dilithium_pk *pk)
+{
+	if (!pk || !sig || sig->dilithium_type != pk->dilithium_type)
+		return -EINVAL;
+
+	switch (pk->dilithium_type) {
+	case DILITHIUM_87:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+		return dilithium_87_verify_ctx(&sig->sig.sig_87, ctx, m,
+					       mlen, &pk->key.pk_87);
+#else
+		return -EOPNOTSUPP;
+#endif
+	case DILITHIUM_65:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+		return dilithium_65_verify_ctx(&sig->sig.sig_65, ctx, m,
+					       mlen, &pk->key.pk_65);
+#else
+		return -EOPNOTSUPP;
+#endif
+	case DILITHIUM_44:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+		return dilithium_44_verify_ctx(&sig->sig.sig_44, ctx, m,
+					       mlen, &pk->key.pk_44);
+#else
+		return -EOPNOTSUPP;
+#endif
+	case DILITHIUM_UNKNOWN:
+	default:
+		return -EOPNOTSUPP;
+	}
+}
+
+int dilithium_verify_init(struct dilithium_ctx *ctx,
+			  const struct dilithium_pk *pk)
+{
+	if (!pk)
+		return -EINVAL;
+
+	switch (pk->dilithium_type) {
+	case DILITHIUM_87:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+		return dilithium_87_verify_init(ctx, &pk->key.pk_87);
+#else
+		return -EOPNOTSUPP;
+#endif
+	case DILITHIUM_65:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+		return dilithium_65_verify_init(ctx, &pk->key.pk_65);
+#else
+		return -EOPNOTSUPP;
+#endif
+	case DILITHIUM_44:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+		return dilithium_44_verify_init(ctx, &pk->key.pk_44);
+#else
+		return -EOPNOTSUPP;
+#endif
+	case DILITHIUM_UNKNOWN:
+	default:
+		return -EOPNOTSUPP;
+	}
+}
+
+int dilithium_verify_update(struct dilithium_ctx *ctx, const uint8_t *m,
+			    size_t mlen)
+{
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+	return dilithium_87_verify_update(ctx, m, mlen);
+#elif defined(CONFIG_CRYPTO_LIB_MLDSA_65)
+	return dilithium_65_verify_update(ctx, m, mlen);
+#elif defined(CONFIG_CRYPTO_LIB_MLDSA_44)
+	return dilithium_44_verify_update(ctx, m, mlen);
+#else
+	return -EOPNOTSUPP;
+#endif
+}
+
+int dilithium_verify_final(const struct dilithium_sig *sig,
+			   struct dilithium_ctx *ctx,
+			   const struct dilithium_pk *pk)
+{
+	if (!pk || !sig || sig->dilithium_type != pk->dilithium_type)
+		return -EINVAL;
+
+	switch (pk->dilithium_type) {
+	case DILITHIUM_87:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+		return dilithium_87_verify_final(&sig->sig.sig_87, ctx,
+						 &pk->key.pk_87);
+#else
+		return -EOPNOTSUPP;
+#endif
+	case DILITHIUM_65:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+		return dilithium_65_verify_final(&sig->sig.sig_65, ctx,
+						 &pk->key.pk_65);
+#else
+		return -EOPNOTSUPP;
+#endif
+	case DILITHIUM_44:
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+		return dilithium_44_verify_final(&sig->sig.sig_44, ctx,
+						 &pk->key.pk_44);
+#else
+		return -EOPNOTSUPP;
+#endif
+	case DILITHIUM_UNKNOWN:
+	default:
+		return -EOPNOTSUPP;
+	}
+}
+
+#endif /* DILITHIUM_API_H */
diff --git a/lib/crypto/mldsa/dilithium_debug.h b/lib/crypto/mldsa/dilithium_debug.h
new file mode 100644
index 000000000000..599a435633ae
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_debug.h
@@ -0,0 +1,49 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2023 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+#ifndef DILITHIUM_DEBUG_H
+#define DILITHIUM_DEBUG_H
+
+#include "dilithium_type.h"
+
+static inline void dilithium_print_buffer(const uint8_t *buffer,
+					  const size_t bufferlen,
+					  const char *explanation)
+{
+}
+
+static inline void dilithium_print_polyvecl_k(polyvecl mat[DILITHIUM_K],
+					      const char *explanation)
+{
+}
+
+static inline void dilithium_print_polyvecl(polyvecl *polyvec,
+					    const char *explanation)
+{
+}
+
+static inline void dilithium_print_polyveck(polyveck *polyvec,
+					    const char *explanation)
+{
+}
+
+static inline void dilithium_print_poly(poly *vec, const char *explanation)
+{
+}
+
+#endif /* DILITHIUM_DEBUG_H */
diff --git a/lib/crypto/mldsa/dilithium_ntt.c b/lib/crypto/mldsa/dilithium_ntt.c
new file mode 100644
index 000000000000..b2834a2dd501
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_ntt.c
@@ -0,0 +1,89 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#include "dilithium_ntt.h"
+#include "dilithium_reduce.h"
+
+/*
+ * @brief ntt - Forward NTT, in-place. No modular reduction is performed after
+ *		additions or subtractions. Output vector is in bitreversed
+ *		order.
+ *
+ * @param [in,out] p input/output coefficient array
+ */
+void ntt(int32_t a[DILITHIUM_N])
+{
+	unsigned int len, start, j, k;
+	int32_t zeta, t;
+
+	k = 0;
+
+	for (len = 128; len > 0; len >>= 1) {
+		for (start = 0; start < DILITHIUM_N; start = j + len) {
+			zeta = dilithium_zetas[++k];
+			for (j = start; j < start + len; ++j) {
+				t = montgomery_reduce((int64_t)zeta *
+						      a[j + len]);
+				a[j + len] = a[j] - t;
+				a[j] = a[j] + t;
+			}
+		}
+	}
+}
+
+/*
+ * @brief invntt_tomont - Inverse NTT and multiplication by Montgomery factor
+ *			  2^32. In-place. No modular reductions after additions
+ *			  or subtractions; input coefficients need to be smaller
+ *			  than Q in absolute value. Output coefficient are
+ *			  smaller than Q in absolute value.
+ *
+ * @param [in,out] p input/output coefficient array
+ */
+void invntt_tomont(int32_t a[DILITHIUM_N])
+{
+	unsigned int start, len, j, k;
+	int32_t t, zeta;
+	const int32_t f = 41978; // mont^2/256
+
+	k = 256;
+
+	for (len = 1; len < DILITHIUM_N; len <<= 1) {
+		for (start = 0; start < DILITHIUM_N; start = j + len) {
+			zeta = -dilithium_zetas[--k];
+			for (j = start; j < start + len; ++j) {
+				t = a[j];
+				a[j] = t + a[j + len];
+				a[j + len] = t - a[j + len];
+				a[j + len] = montgomery_reduce((int64_t)zeta *
+							       a[j + len]);
+			}
+		}
+	}
+
+	for (j = 0; j < DILITHIUM_N; ++j)
+		a[j] = montgomery_reduce((int64_t)f * a[j]);
+}
diff --git a/lib/crypto/mldsa/dilithium_ntt.h b/lib/crypto/mldsa/dilithium_ntt.h
new file mode 100644
index 000000000000..5dfea3a936cd
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_ntt.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#ifndef DILITHIUM_NTT_H
+#define DILITHIUM_NTT_H
+
+#include "dilithium_type.h"
+
+void ntt(int32_t a[DILITHIUM_N]);
+void invntt_tomont(int32_t a[DILITHIUM_N]);
+
+#endif /* DILITHIUM_NTT_H */
diff --git a/lib/crypto/mldsa/dilithium_pack.h b/lib/crypto/mldsa/dilithium_pack.h
new file mode 100644
index 000000000000..5db65014b405
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_pack.h
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#ifndef DILITHIUM_PACK_H
+#define DILITHIUM_PACK_H
+
+/*******************************************************************************
+ * Pack / Unpack public key
+ ******************************************************************************/
+
+static inline void unpack_pk_rho(uint8_t rho[DILITHIUM_SEEDBYTES],
+				 const struct dilithium_pk *pk)
+{
+	memcpy(rho, pk->pk, DILITHIUM_SEEDBYTES);
+}
+
+static inline void unpack_pk_t1(polyveck *t1, const struct dilithium_pk *pk)
+{
+	unsigned int i;
+	const uint8_t *pubkey = pk->pk + DILITHIUM_SEEDBYTES;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		polyt1_unpack(&t1->vec[i],
+			      pubkey + i * DILITHIUM_POLYT1_PACKEDBYTES);
+}
+
+/*
+ * @brief unpack_sig_z - Unpack z part of signature sig = (c, z, h).
+ *
+ * NOTE: The c value is not unpacked as it can be used right from the signature.
+ *	 To access it, a caller simply needs to use the first
+ *	 DILITHIUM_CTILDE_BYTES of the signature.
+ *
+ * @param [out] z pointer to output vector z
+ * @param [in] sig signature
+ */
+static inline void unpack_sig_z(polyvecl *z, const struct dilithium_sig *sig)
+{
+	unsigned int i;
+	/* Skip c */
+	const uint8_t *signature = sig->sig + DILITHIUM_CTILDE_BYTES;
+
+	for (i = 0; i < DILITHIUM_L; ++i)
+		polyz_unpack(&z->vec[i],
+			     signature + i * DILITHIUM_POLYZ_PACKEDBYTES);
+}
+
+/*
+ * @brief unpack_sig - Unpack h value of signature sig = (c, z, h).
+ *
+ * NOTE: The c value is not unpacked as it can be used right from the signature.
+ *	 To access it, a caller simply needs to use the first
+ *	 DILITHIUM_CTILDE_BYTES of the signature.
+ *
+ * @param [out] h pointer to output hint vector h
+ * @param [in] sig signature
+ *
+ * @return 1 in case of malformed signature; otherwise 0.
+ */
+static inline int unpack_sig_h(polyveck *h, const struct dilithium_sig *sig)
+{
+	unsigned int i, j, k;
+	/* Skip c */
+	const uint8_t *signature =
+		sig->sig + DILITHIUM_CTILDE_BYTES +
+		DILITHIUM_L * DILITHIUM_POLYZ_PACKEDBYTES;
+
+	/* Decode h */
+	k = 0;
+	for (i = 0; i < DILITHIUM_K; ++i) {
+		for (j = 0; j < DILITHIUM_N; ++j)
+			h->vec[i].coeffs[j] = 0;
+
+		if (signature[DILITHIUM_OMEGA + i] < k ||
+		    signature[DILITHIUM_OMEGA + i] > DILITHIUM_OMEGA)
+			return 1;
+
+		for (j = k; j < signature[DILITHIUM_OMEGA + i]; ++j) {
+			/* Coefficients are ordered for strong unforgeability */
+			if (j > k && signature[j] <= signature[j - 1])
+				return 1;
+			h->vec[i].coeffs[signature[j]] = 1;
+		}
+
+		k = signature[DILITHIUM_OMEGA + i];
+	}
+
+	/* Extra indices are zero for strong unforgeability */
+	for (j = k; j < DILITHIUM_OMEGA; ++j)
+		if (signature[j])
+			return 1;
+
+	return 0;
+}
+
+#endif /* DILITHIUM_PACK_H */
diff --git a/lib/crypto/mldsa/dilithium_poly.c b/lib/crypto/mldsa/dilithium_poly.c
new file mode 100644
index 000000000000..c5c3394ab08c
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_poly.c
@@ -0,0 +1,377 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#include "dilithium_poly.h"
+#include "dilithium_poly_common.h"
+#include "dilithium_service_helpers.h"
+
+/*
+ * @brief poly_chknorm - Check infinity norm of polynomial against given bound.
+ *			 Assumes input coefficients were reduced by reduce32().
+ *
+ * @param [in] a pointer to polynomial
+ * @param [in] B norm bound
+ *
+ * @return 0 if norm is strictly smaller than B <= (Q-1)/8 and 1 otherwise.
+ */
+int poly_chknorm(const poly *a, int32_t B)
+{
+	unsigned int i;
+	int32_t t;
+
+	if (B > (DILITHIUM_Q - 1) / 8)
+		return 1;
+
+	/*
+	 * It is ok to leak which coefficient violates the bound since
+	 * the probability for each coefficient *is independent of secret
+	 * data but we must not leak the sign of the centralized representative.
+	 */
+	for (i = 0; i < DILITHIUM_N; ++i) {
+		/* Absolute value */
+		t = a->coeffs[i] >> 31;
+		t = a->coeffs[i] - (t & 2 * a->coeffs[i]);
+
+		if (t >= B)
+			return 1;
+	}
+
+	return 0;
+}
+
+/*
+ * @brief poly_uniform - Sample polynomial with uniformly random coefficients
+ *			 in [0,Q-1] by performing rejection sampling on the
+ *			 output stream of SHAKE128(seed|nonce).
+ *
+ * @param [out] a pointer to output polynomial
+ * @param [in] seed byte array with seed of length DILITHIUM_SEEDBYTES
+ * @param [in] nonce 2-byte nonce
+ */
+void poly_uniform(poly *a, const uint8_t seed[DILITHIUM_SEEDBYTES],
+		  __le16 nonce, void *ws_buf)
+{
+	struct shake_ctx hash_ctx;
+	unsigned int i, ctr, off;
+	unsigned int buflen = POLY_UNIFORM_NBLOCKS * SHAKE128_BLOCK_SIZE;
+	uint8_t *buf = ws_buf;
+
+	shake128_init(&hash_ctx);
+	shake_update(&hash_ctx, seed, DILITHIUM_SEEDBYTES);
+	shake_update(&hash_ctx, (uint8_t *)&nonce, sizeof(nonce));
+	shake_squeeze(&hash_ctx, buf, buflen);
+
+	ctr = rej_uniform(a->coeffs, DILITHIUM_N, buf, buflen);
+
+	while (ctr < DILITHIUM_N) {
+		off = buflen % 3;
+		for (i = 0; i < off; ++i)
+			buf[i] = buf[buflen - off + i];
+
+		shake_squeeze(&hash_ctx, buf + off, SHAKE128_BLOCK_SIZE);
+		buflen = DILITHIUM_SEEDBYTES + off;
+		ctr += rej_uniform(a->coeffs + ctr, DILITHIUM_N - ctr, buf,
+				   buflen);
+	}
+
+	shake_zeroize_ctx(&hash_ctx);
+}
+
+/*
+ * @brief poly_uniform_gamma1 - Sample polynomial with uniformly random
+ *				coefficients in [-(GAMMA1 - 1), GAMMA1] by
+ *				unpacking output stream of
+ *				SHAKE256(seed|nonce).
+ *
+ * @param [out] a pointer to output polynomial
+ * @param [in] seed: byte array with seed of length DILITHIUM_CRHBYTES
+ * @param nonce 16-bit nonce
+ */
+void poly_uniform_gamma1(poly *a, const uint8_t seed[DILITHIUM_CRHBYTES],
+			 uint16_t nonce, void *ws_buf)
+{
+	struct shake_ctx hash_ctx;
+
+	shake256_init(&hash_ctx);
+	shake_update(&hash_ctx, seed, DILITHIUM_CRHBYTES);
+	shake_update(&hash_ctx, (uint8_t *)&nonce, sizeof(nonce));
+	shake_squeeze(&hash_ctx, ws_buf, POLY_UNIFORM_GAMMA1_BYTES);
+	shake_zeroize_ctx(&hash_ctx);
+
+	polyz_unpack(a, ws_buf);
+}
+
+/*
+ * @brief poly_challenge - Implementation of H. Samples polynomial with TAU
+ *			   nonzero coefficients in {-1,1} using the output
+ *			   stream of SHAKE256(seed).
+ *
+ * @param [out] c pointer to output polynomial
+ * @param [in] mu byte array containing seed of length DILITHIUM_CTILDE_BYTES
+ */
+void poly_challenge(poly *c, const uint8_t seed[DILITHIUM_CTILDE_BYTES],
+		    void *ws_buf)
+{
+	struct shake_ctx hash_ctx;
+	unsigned int i, b, pos;
+	uint64_t signs;
+	uint8_t *buf = ws_buf;
+
+	shake256_init(&hash_ctx);
+	shake_update(&hash_ctx, seed, DILITHIUM_CTILDE_BYTES);
+	shake_squeeze(&hash_ctx, buf, POLY_CHALLENGE_BYTES);
+
+	signs = 0;
+	for (i = 0; i < 8; ++i)
+		signs |= (uint64_t)buf[i] << 8 * i;
+	pos = 8;
+
+	for (i = 0; i < DILITHIUM_N; ++i)
+		c->coeffs[i] = 0;
+
+	for (i = DILITHIUM_N - DILITHIUM_TAU; i < DILITHIUM_N; ++i) {
+		do {
+			if (pos >= SHAKE256_BLOCK_SIZE) {
+				shake_squeeze(&hash_ctx, buf, POLY_CHALLENGE_BYTES);
+				pos = 0;
+			}
+
+			b = buf[pos++];
+		} while (b > i);
+
+		c->coeffs[i] = c->coeffs[b];
+		c->coeffs[b] = 1 - (int32_t)(2 * (signs & 1));
+		signs >>= 1;
+	}
+
+	shake_zeroize_ctx(&hash_ctx);
+}
+
+/*
+ * @brief polyeta_unpack - Unpack polynomial with coefficients in [-ETA,ETA].
+ *
+ * @param [out] r pointer to output polynomial
+ * @param [in] a byte array with bit-packed polynomial
+ */
+void polyeta_unpack(poly *r, const uint8_t *a)
+{
+	unsigned int i;
+
+#if DILITHIUM_ETA == 2
+	for (i = 0; i < DILITHIUM_N / 8; ++i) {
+		r->coeffs[8 * i + 0] = (a[3 * i + 0] >> 0) & 7;
+		r->coeffs[8 * i + 1] = (a[3 * i + 0] >> 3) & 7;
+		r->coeffs[8 * i + 2] =
+			((a[3 * i + 0] >> 6) | (a[3 * i + 1] << 2)) & 7;
+		r->coeffs[8 * i + 3] = (a[3 * i + 1] >> 1) & 7;
+		r->coeffs[8 * i + 4] = (a[3 * i + 1] >> 4) & 7;
+		r->coeffs[8 * i + 5] =
+			((a[3 * i + 1] >> 7) | (a[3 * i + 2] << 1)) & 7;
+		r->coeffs[8 * i + 6] = (a[3 * i + 2] >> 2) & 7;
+		r->coeffs[8 * i + 7] = (a[3 * i + 2] >> 5) & 7;
+
+		r->coeffs[8 * i + 0] = DILITHIUM_ETA - r->coeffs[8 * i + 0];
+		r->coeffs[8 * i + 1] = DILITHIUM_ETA - r->coeffs[8 * i + 1];
+		r->coeffs[8 * i + 2] = DILITHIUM_ETA - r->coeffs[8 * i + 2];
+		r->coeffs[8 * i + 3] = DILITHIUM_ETA - r->coeffs[8 * i + 3];
+		r->coeffs[8 * i + 4] = DILITHIUM_ETA - r->coeffs[8 * i + 4];
+		r->coeffs[8 * i + 5] = DILITHIUM_ETA - r->coeffs[8 * i + 5];
+		r->coeffs[8 * i + 6] = DILITHIUM_ETA - r->coeffs[8 * i + 6];
+		r->coeffs[8 * i + 7] = DILITHIUM_ETA - r->coeffs[8 * i + 7];
+	}
+#elif DILITHIUM_ETA == 4
+	for (i = 0; i < DILITHIUM_N / 2; ++i) {
+		r->coeffs[2 * i + 0] = a[i] & 0x0F;
+		r->coeffs[2 * i + 1] = a[i] >> 4;
+		r->coeffs[2 * i + 0] = DILITHIUM_ETA - r->coeffs[2 * i + 0];
+		r->coeffs[2 * i + 1] = DILITHIUM_ETA - r->coeffs[2 * i + 1];
+	}
+#else
+#error "Undefined DILITHIUM_ETA"
+#endif
+}
+
+/*
+ * @brief polyt0_unpack - Unpack polynomial t0 with coefficients in
+ *			  ]-2^{D-1}, 2^{D-1}].
+ *
+ * @param [out] r pointer to output polynomial
+ * @param [in] a byte array with bit-packed polynomial
+ */
+void polyt0_unpack(poly *r, const uint8_t *a)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_N / 8; ++i) {
+		r->coeffs[8 * i + 0] = a[13 * i + 0];
+		r->coeffs[8 * i + 0] |= (int32_t)a[13 * i + 1] << 8;
+		r->coeffs[8 * i + 0] &= 0x1FFF;
+
+		r->coeffs[8 * i + 1] = a[13 * i + 1] >> 5;
+		r->coeffs[8 * i + 1] |= (int32_t)a[13 * i + 2] << 3;
+		r->coeffs[8 * i + 1] |= (int32_t)a[13 * i + 3] << 11;
+		r->coeffs[8 * i + 1] &= 0x1FFF;
+
+		r->coeffs[8 * i + 2] = a[13 * i + 3] >> 2;
+		r->coeffs[8 * i + 2] |= (int32_t)a[13 * i + 4] << 6;
+		r->coeffs[8 * i + 2] &= 0x1FFF;
+
+		r->coeffs[8 * i + 3] = a[13 * i + 4] >> 7;
+		r->coeffs[8 * i + 3] |= (int32_t)a[13 * i + 5] << 1;
+		r->coeffs[8 * i + 3] |= (int32_t)a[13 * i + 6] << 9;
+		r->coeffs[8 * i + 3] &= 0x1FFF;
+
+		r->coeffs[8 * i + 4] = a[13 * i + 6] >> 4;
+		r->coeffs[8 * i + 4] |= (int32_t)a[13 * i + 7] << 4;
+		r->coeffs[8 * i + 4] |= (int32_t)a[13 * i + 8] << 12;
+		r->coeffs[8 * i + 4] &= 0x1FFF;
+
+		r->coeffs[8 * i + 5] = a[13 * i + 8] >> 1;
+		r->coeffs[8 * i + 5] |= (int32_t)a[13 * i + 9] << 7;
+		r->coeffs[8 * i + 5] &= 0x1FFF;
+
+		r->coeffs[8 * i + 6] = a[13 * i + 9] >> 6;
+		r->coeffs[8 * i + 6] |= (int32_t)a[13 * i + 10] << 2;
+		r->coeffs[8 * i + 6] |= (int32_t)a[13 * i + 11] << 10;
+		r->coeffs[8 * i + 6] &= 0x1FFF;
+
+		r->coeffs[8 * i + 7] = a[13 * i + 11] >> 3;
+		r->coeffs[8 * i + 7] |= (int32_t)a[13 * i + 12] << 5;
+		r->coeffs[8 * i + 7] &= 0x1FFF;
+
+		r->coeffs[8 * i + 0] =
+			(1 << (DILITHIUM_D - 1)) - r->coeffs[8 * i + 0];
+		r->coeffs[8 * i + 1] =
+			(1 << (DILITHIUM_D - 1)) - r->coeffs[8 * i + 1];
+		r->coeffs[8 * i + 2] =
+			(1 << (DILITHIUM_D - 1)) - r->coeffs[8 * i + 2];
+		r->coeffs[8 * i + 3] =
+			(1 << (DILITHIUM_D - 1)) - r->coeffs[8 * i + 3];
+		r->coeffs[8 * i + 4] =
+			(1 << (DILITHIUM_D - 1)) - r->coeffs[8 * i + 4];
+		r->coeffs[8 * i + 5] =
+			(1 << (DILITHIUM_D - 1)) - r->coeffs[8 * i + 5];
+		r->coeffs[8 * i + 6] =
+			(1 << (DILITHIUM_D - 1)) - r->coeffs[8 * i + 6];
+		r->coeffs[8 * i + 7] =
+			(1 << (DILITHIUM_D - 1)) - r->coeffs[8 * i + 7];
+	}
+}
+
+/*
+ * @brief polyz_unpack - Unpack polynomial z with coefficients
+ *			 in [-(GAMMA1 - 1), GAMMA1].
+ *
+ * @param [out] r pointer to output polynomial
+ * @param [in] a byte array with bit-packed polynomial
+ */
+void polyz_unpack(poly *r, const uint8_t *a)
+{
+	unsigned int i;
+
+#if DILITHIUM_GAMMA1 == (1 << 17)
+	for (i = 0; i < DILITHIUM_N / 4; ++i) {
+		r->coeffs[4 * i + 0] = a[9 * i + 0];
+		r->coeffs[4 * i + 0] |= (int32_t)a[9 * i + 1] << 8;
+		r->coeffs[4 * i + 0] |= (int32_t)a[9 * i + 2] << 16;
+		r->coeffs[4 * i + 0] &= 0x3FFFF;
+
+		r->coeffs[4 * i + 1] = a[9 * i + 2] >> 2;
+		r->coeffs[4 * i + 1] |= (int32_t)a[9 * i + 3] << 6;
+		r->coeffs[4 * i + 1] |= (int32_t)a[9 * i + 4] << 14;
+		r->coeffs[4 * i + 1] &= 0x3FFFF;
+
+		r->coeffs[4 * i + 2] = a[9 * i + 4] >> 4;
+		r->coeffs[4 * i + 2] |= (int32_t)a[9 * i + 5] << 4;
+		r->coeffs[4 * i + 2] |= (int32_t)a[9 * i + 6] << 12;
+		r->coeffs[4 * i + 2] &= 0x3FFFF;
+
+		r->coeffs[4 * i + 3] = a[9 * i + 6] >> 6;
+		r->coeffs[4 * i + 3] |= (int32_t)a[9 * i + 7] << 2;
+		r->coeffs[4 * i + 3] |= (int32_t)a[9 * i + 8] << 10;
+		r->coeffs[4 * i + 3] &= 0x3FFFF;
+
+		r->coeffs[4 * i + 0] =
+			DILITHIUM_GAMMA1 - r->coeffs[4 * i + 0];
+		r->coeffs[4 * i + 1] =
+			DILITHIUM_GAMMA1 - r->coeffs[4 * i + 1];
+		r->coeffs[4 * i + 2] =
+			DILITHIUM_GAMMA1 - r->coeffs[4 * i + 2];
+		r->coeffs[4 * i + 3] =
+			DILITHIUM_GAMMA1 - r->coeffs[4 * i + 3];
+	}
+#elif DILITHIUM_GAMMA1 == (1 << 19)
+	for (i = 0; i < DILITHIUM_N / 2; ++i) {
+		r->coeffs[2 * i + 0] = a[5 * i + 0];
+		r->coeffs[2 * i + 0] |= (int32_t)a[5 * i + 1] << 8;
+		r->coeffs[2 * i + 0] |= (int32_t)a[5 * i + 2] << 16;
+		r->coeffs[2 * i + 0] &= 0xFFFFF;
+
+		r->coeffs[2 * i + 1] = a[5 * i + 2] >> 4;
+		r->coeffs[2 * i + 1] |= (int32_t)a[5 * i + 3] << 4;
+		r->coeffs[2 * i + 1] |= (int32_t)a[5 * i + 4] << 12;
+		r->coeffs[2 * i + 1] &= 0xFFFFF;
+
+		r->coeffs[2 * i + 0] =
+			DILITHIUM_GAMMA1 - r->coeffs[2 * i + 0];
+		r->coeffs[2 * i + 1] =
+			DILITHIUM_GAMMA1 - r->coeffs[2 * i + 1];
+	}
+#else
+#error "Undefined Gamma"
+#endif
+}
+
+/*
+ * @brief polyw1_pack - Bit-pack polynomial w1 with coefficients in [0,15] or
+ *			[0,43]. Input coefficients are assumed to be standard
+ *			representatives.
+ *
+ * @param [out] r pointer to output byte array with at least
+ *		  DILITHIUM_POLYW1_PACKEDBYTES bytes
+ * @param [in] a pointer to input polynomial
+ */
+void polyw1_pack(uint8_t *r, const poly *a)
+{
+	unsigned int i;
+
+#if DILITHIUM_GAMMA2 == (DILITHIUM_Q - 1) / 88
+	for (i = 0; i < DILITHIUM_N / 4; ++i) {
+		r[3 * i + 0] = (uint8_t)(a->coeffs[4 * i + 0]);
+		r[3 * i + 0] |= (uint8_t)(a->coeffs[4 * i + 1] << 6);
+		r[3 * i + 1] = (uint8_t)(a->coeffs[4 * i + 1] >> 2);
+		r[3 * i + 1] |= (uint8_t)(a->coeffs[4 * i + 2] << 4);
+		r[3 * i + 2] = (uint8_t)(a->coeffs[4 * i + 2] >> 4);
+		r[3 * i + 2] |= (uint8_t)(a->coeffs[4 * i + 3] << 2);
+	}
+#elif DILITHIUM_GAMMA2 == (DILITHIUM_Q - 1) / 32
+	for (i = 0; i < DILITHIUM_N / 2; ++i)
+		r[i] = (uint8_t)(a->coeffs[2 * i + 0] |
+				 (a->coeffs[2 * i + 1] << 4));
+#else
+#error "Undefined Gamma"
+#endif
+}
diff --git a/lib/crypto/mldsa/dilithium_poly.h b/lib/crypto/mldsa/dilithium_poly.h
new file mode 100644
index 000000000000..4f2b0d89cf62
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_poly.h
@@ -0,0 +1,181 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#ifndef DILITHIUM_POLY_H
+#define DILITHIUM_POLY_H
+
+#include "dilithium_type.h"
+#include "dilithium_reduce.h"
+
+typedef struct {
+	int32_t coeffs[DILITHIUM_N];
+} poly;
+
+/*
+ * @brief poly_add - Add polynomials. No modular reduction is performed.
+ *
+ * @param [out] c pointer to output polynomial
+ * @param [in] a pointer to first summand
+ * @param [in] b pointer to second summand
+ */
+static inline void poly_add(poly *c, const poly *a, const poly *b)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_N; ++i)
+		c->coeffs[i] = a->coeffs[i] + b->coeffs[i];
+}
+
+/*
+ * @brief poly_sub - Subtract polynomials. No modular reduction is
+ *		     performed.
+ *
+ * @param [out] c pointer to output polynomial
+ * @param [in] a pointer to first input polynomial
+ * @param [in] b pointer to second input polynomial to be subtraced from first
+ *		 input polynomial
+ */
+static inline void poly_sub(poly *c, const poly *a, const poly *b)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_N; ++i)
+		c->coeffs[i] = a->coeffs[i] - b->coeffs[i];
+}
+
+/*
+ * @brief poly_shiftl - Multiply polynomial by 2^D without modular reduction.
+ *			Assumes input coefficients to be less than 2^{31-D} in
+ *			absolute value.
+ *
+ * @param [in,out] a pointer to input/output polynomial
+ */
+static inline void poly_shiftl(poly *a)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_N; ++i)
+		a->coeffs[i] <<= DILITHIUM_D;
+}
+
+/*
+ * @brief poly_decompose - For all coefficients c of the input polynomial,
+ *			   compute high and low bits c0, c1 such
+ *			   c mod Q = c1*ALPHA + c0 with
+ *			   -ALPHA/2 < c0 <= ALPHA/2 except c1 = (Q-1)/ALPHA
+ *			   where we set c1 = 0 and
+ *			   -ALPHA/2 <= c0 = c mod Q - Q < 0.
+ *			   Assumes coefficients to be standard representatives.
+ *
+ * @param [out] a1 pointer to output polynomial with coefficients c1
+ * @param [out] a0 pointer to output polynomial with coefficients c0
+ * @param [in] a pointer to input polynomial
+ */
+static inline void poly_decompose(poly *a1, poly *a0, const poly *a)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_N; ++i)
+		a1->coeffs[i] = decompose(&a0->coeffs[i], a->coeffs[i]);
+}
+
+/*
+ * @brief poly_make_hint - Compute hint polynomial. The coefficients of which
+ *			   indicate whether the low bits of the corresponding
+ *			   coefficient of the input polynomial overflow into the
+ *			   high bits.
+ *
+ * @param [out] h pointer to output hint polynomial
+ * @param [in] a0 pointer to low part of input polynomial
+ * @param [in] a1 pointer to high part of input polynomial
+ *
+ * @return number of 1 bits.
+ */
+static inline unsigned int poly_make_hint(poly *h, const poly *a0,
+					  const poly *a1)
+{
+	unsigned int i, s = 0;
+
+	for (i = 0; i < DILITHIUM_N; ++i) {
+		h->coeffs[i] = make_hint(a0->coeffs[i], a1->coeffs[i]);
+		s += (unsigned int)h->coeffs[i];
+	}
+
+	return s;
+}
+
+/*
+ * @brief poly_use_hint - Use hint polynomial to correct the high bits of a
+ *			  polynomial.
+ *
+ * @param [out] b pointer to output polynomial with corrected high bits
+ * @param [in] a pointer to input polynomial
+ * @param [in] h pointer to input hint polynomial
+ */
+static inline void poly_use_hint(poly *b, const poly *a, const poly *h)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_N; ++i)
+		b->coeffs[i] = use_hint(a->coeffs[i], h->coeffs[i]);
+}
+
+int poly_chknorm(const poly *a, int32_t B);
+
+#define POLY_UNIFORM_NBLOCKS                                                   \
+	((768 + SHAKE128_BLOCK_SIZE - 1) / SHAKE128_BLOCK_SIZE)
+void poly_uniform(poly *a, const uint8_t seed[DILITHIUM_SEEDBYTES],
+		  __le16 nonce, void *ws_buf);
+
+#if DILITHIUM_ETA == 2
+#define POLY_UNIFORM_ETA_NBLOCKS                                               \
+	((136 + SHAKE256_BLOCK_SIZE - 1) / SHAKE256_BLOCK_SIZE)
+#elif DILITHIUM_ETA == 4
+#define POLY_UNIFORM_ETA_NBLOCKS                                               \
+	((227 + SHAKE256_BLOCK_SIZE - 1) / SHAKE256_BLOCK_SIZE)
+#else
+#error "Undefined DILITHIUM_ETA"
+#endif
+#define POLY_UNIFORM_ETA_BYTES POLY_UNIFORM_ETA_NBLOCKS *SHAKE256_BLOCK_SIZE
+#define POLY_UNIFORM_GAMMA1_NBLOCKS                                            \
+	((DILITHIUM_POLYZ_PACKEDBYTES + SHAKE256_BLOCK_SIZE - 1) /      \
+	 SHAKE256_BLOCK_SIZE)
+#define POLY_UNIFORM_GAMMA1_BYTES                                              \
+	POLY_UNIFORM_GAMMA1_NBLOCKS *SHAKE256_BLOCK_SIZE
+
+#define POLY_CHALLENGE_BYTES SHAKE256_BLOCK_SIZE
+void poly_challenge(poly *c, const uint8_t seed[DILITHIUM_CTILDE_BYTES],
+		    void *ws_buf);
+
+void polyeta_unpack(poly *r, const uint8_t *a);
+
+void polyt0_unpack(poly *r, const uint8_t *a);
+
+void polyz_unpack(poly *r, const uint8_t *a);
+
+void polyw1_pack(uint8_t *r, const poly *a);
+
+#endif /* DILITHIUM_POLY_H */
diff --git a/lib/crypto/mldsa/dilithium_poly_c.h b/lib/crypto/mldsa/dilithium_poly_c.h
new file mode 100644
index 000000000000..5e9bb27a854a
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_poly_c.h
@@ -0,0 +1,141 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2023 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+#ifndef DILITHIUM_POLY_C_H
+#define DILITHIUM_POLY_C_H
+
+#include "dilithium_ntt.h"
+
+/*
+ * @brief poly_reduce - Inplace reduction of all coefficients of polynomial to
+ *			representative in [-6283009,6283007].
+ *
+ * @param [in,out] a pointer to input/output polynomial
+ */
+static inline void poly_reduce(poly *a)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_N; ++i)
+		a->coeffs[i] = reduce32(a->coeffs[i]);
+}
+
+/*
+ * @brief poly_caddq - For all coefficients of in/out polynomial add Q if
+ *		       coefficient is negative.
+ *
+ * @param [in,out] a pointer to input/output polynomial
+ */
+static inline void poly_caddq(poly *a)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_N; ++i)
+		a->coeffs[i] = caddq(a->coeffs[i]);
+}
+
+/*
+ * @brief poly_pointwise_montgomery - Pointwise multiplication of polynomials in
+ *				      NTT domain representation and
+ *				      multiplication of resulting polynomial
+ *				      by 2^{-32}.
+ *
+ * @param [out] c pointer to output polynomial
+ * @param [in] a pointer to first input polynomial
+ * @param [in] b pointer to second input polynomial
+ */
+static inline void poly_pointwise_montgomery(poly *c, const poly *a,
+					     const poly *b)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_N; ++i)
+		c->coeffs[i] =
+			montgomery_reduce((int64_t)a->coeffs[i] * b->coeffs[i]);
+}
+
+/*
+ * @brief poly_power2round - For all coefficients c of the input polynomial,
+ *			     compute c0, c1 such that c mod Q = c1*2^D + c0
+ *			     with -2^{D-1} < c0 <= 2^{D-1}. Assumes coefficients
+ *			     to be standard representatives.
+ *
+ * @param [out] a1 pointer to output polynomial with coefficients c1
+ * @param [out] a0 pointer to output polynomial with coefficients c0
+ * @param [in] a pointer to input polynomial
+ */
+static inline void poly_power2round(poly *a1, poly *a0, const poly *a)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_N; ++i)
+		a1->coeffs[i] = power2round(&a0->coeffs[i], a->coeffs[i]);
+}
+
+/*
+ * @brief polyt1_unpack - Unpack polynomial t1 with 10-bit coefficients.
+ *			  Output coefficients are standard representatives.
+ *
+ * @param [out] r pointer to output polynomial
+ * @param [in] a byte array with bit-packed polynomial
+ */
+static inline void polyt1_unpack(poly *r, const uint8_t *a)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_N / 4; ++i) {
+		r->coeffs[4 * i + 0] =
+			((a[5 * i + 0] >> 0) | ((uint32_t)a[5 * i + 1] << 8)) &
+			0x3FF;
+		r->coeffs[4 * i + 1] =
+			((a[5 * i + 1] >> 2) | ((uint32_t)a[5 * i + 2] << 6)) &
+			0x3FF;
+		r->coeffs[4 * i + 2] =
+			((a[5 * i + 2] >> 4) | ((uint32_t)a[5 * i + 3] << 4)) &
+			0x3FF;
+		r->coeffs[4 * i + 3] =
+			((a[5 * i + 3] >> 6) | ((uint32_t)a[5 * i + 4] << 2)) &
+			0x3FF;
+	}
+}
+
+/*
+ * @brief poly_ntt - Inplace forward NTT. Coefficients can grow by
+ *		     8*Q in absolute value.
+ *
+ * @param [in,out] a pointer to input/output polynomial
+ */
+static inline void poly_ntt(poly *a)
+{
+	ntt(a->coeffs);
+}
+
+/*
+ * @brief poly_invntt_tomont - Inplace inverse NTT and multiplication by 2^{32}.
+ *			       Input coefficients need to be less than Q in
+ *			       absolute value and output coefficients are again
+ *			       bounded by Q.
+ *
+ * @param [in,out] a pointer to input/output polynomial
+ */
+static inline void poly_invntt_tomont(poly *a)
+{
+	invntt_tomont(a->coeffs);
+}
+
+#endif /* DILITHIUM_POLY_C_H */
diff --git a/lib/crypto/mldsa/dilithium_poly_common.h b/lib/crypto/mldsa/dilithium_poly_common.h
new file mode 100644
index 000000000000..7c7cef28b545
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_poly_common.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#ifndef DILITHIUM_POLY_COMMON_H
+#define DILITHIUM_POLY_COMMON_H
+
+#include "dilithium_type.h"
+
+void poly_uniform_gamma1(poly *a, const uint8_t seed[DILITHIUM_CRHBYTES],
+			 uint16_t nonce, void *ws_buf);
+
+#endif /* DILITHIUM_POLY_COMMON_H */
diff --git a/lib/crypto/mldsa/dilithium_polyvec.h b/lib/crypto/mldsa/dilithium_polyvec.h
new file mode 100644
index 000000000000..47eb60758850
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_polyvec.h
@@ -0,0 +1,343 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#ifndef DILITHIUM_POLYVEC_H
+#define DILITHIUM_POLYVEC_H
+
+#include "dilithium_type.h"
+#include "dilithium_poly.h"
+
+typedef struct {
+	poly vec[DILITHIUM_L];
+} polyvecl;
+
+/* Vectors of polynomials of length K */
+typedef struct {
+	poly vec[DILITHIUM_K];
+} polyveck;
+
+/**************************************************************/
+/************ Vectors of polynomials of length L **************/
+/**************************************************************/
+
+static inline void polyvecl_reduce(polyvecl *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_L; ++i)
+		poly_reduce(&v->vec[i]);
+}
+
+/*
+ * @brief polyvecl_add - Add vectors of polynomials of length L.
+ *			 No modular reduction is performed.
+ *
+ * @param [out] w pointer to output vector
+ * @param [in] u pointer to first summand
+ * @param [in] v pointer to second summand
+ */
+static inline void polyvecl_add(polyvecl *w, const polyvecl *u,
+				const polyvecl *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_L; ++i)
+		poly_add(&w->vec[i], &u->vec[i], &v->vec[i]);
+}
+
+/*
+ * @brief polyvecl_ntt - Forward NTT of all polynomials in vector of length L.
+ *			 Output coefficients can be up to 16*Q larger than input
+ *			 coefficients.
+ *
+ * @param [in,out] v pointer to input/output vector
+ */
+static inline void polyvecl_ntt(polyvecl *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_L; ++i)
+		poly_ntt(&v->vec[i]);
+}
+
+static inline void polyvecl_invntt_tomont(polyvecl *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_L; ++i)
+		poly_invntt_tomont(&v->vec[i]);
+}
+
+static inline void polyvecl_pointwise_poly_montgomery(polyvecl *r,
+						      const poly *a,
+						      const polyvecl *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_L; ++i)
+		poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]);
+}
+
+/*
+ * @brief polyvecl_chknorm - Check infinity norm of polynomials in vector of
+ *			     length L. Assumes input polyvecl to be reduced by
+ *			     polyvecl_reduce().
+ *
+ * @param [in] v pointer to vector
+ * @param [in] bound norm bound
+ *
+ * @return 0 if norm of all polynomials is strictly smaller than B <= (Q-1)/8
+ * and 1 otherwise.
+ */
+static inline int polyvecl_chknorm(const polyvecl *v, int32_t bound)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_L; ++i)
+		if (poly_chknorm(&v->vec[i], bound))
+			return 1;
+
+	return 0;
+}
+
+/**************************************************************/
+/************ Vectors of polynomials of length K **************/
+/**************************************************************/
+
+/*
+ * @brief polyveck_reduce - Reduce coefficients of polynomials in vector of
+ *			    length DILITHIUM_K to representatives in
+ *			    [-6283009,6283007].
+ *
+ * @param [in,out] v pointer to input/output vector
+ */
+static inline void polyveck_reduce(polyveck *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		poly_reduce(&v->vec[i]);
+}
+
+/*
+ * @brief polyveck_caddq - For all coefficients of polynomials in vector of
+ * 			   length DILITHIUM_K add DILITHIUM_Q if
+ *			   coefficient is negative.
+ *
+ * @param [in,out] v pointer to input/output vector
+ */
+static inline void polyveck_caddq(polyveck *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		poly_caddq(&v->vec[i]);
+}
+
+/*
+ * @brief polyveck_add - Add vectors of polynomials of length DILITHIUM_K.
+ *			 No modular reduction is performed.
+ *
+ * @param [out] w pointer to output vector
+ * @param [in] u pointer to first summand
+ * @param [in] v pointer to second summand
+ */
+static inline void polyveck_add(polyveck *w, const polyveck *u,
+				const polyveck *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		poly_add(&w->vec[i], &u->vec[i], &v->vec[i]);
+}
+
+/*
+ * @brief olyveck_sub - Subtract vectors of polynomials of length
+ *			DILITHIUM_K. No modular reduction is performed.
+ *
+ * @param [out] w pointer to output vector
+ * @param [in] u pointer to first input vector
+ * @param [in] v pointer to second input vector to be subtracted from first
+ *		 input vector
+ */
+static inline void polyveck_sub(polyveck *w, const polyveck *u,
+				const polyveck *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		poly_sub(&w->vec[i], &u->vec[i], &v->vec[i]);
+}
+
+/*
+ * @brief polyveck_shiftl - Multiply vector of polynomials of Length K by
+ *			    2^D without modular reduction. Assumes input
+ *			    coefficients to be less than 2^{31-D}.
+ *
+ * @param [in,out] v pointer to input/output vector
+ */
+static inline void polyveck_shiftl(polyveck *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		poly_shiftl(&v->vec[i]);
+}
+
+/*
+ * @brief polyveck_ntt - Forward NTT of all polynomials in vector of length K.
+ *			 Output coefficients can be up to 16*Q larger than input
+ *			 coefficients.
+ *
+ * @param [in,out] v pointer to input/output vector
+ */
+static inline void polyveck_ntt(polyveck *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		poly_ntt(&v->vec[i]);
+}
+
+/*
+ * @brief polyveck_invntt_tomont - Inverse NTT and multiplication by 2^{32} of
+ *				   polynomials in vector of length K. Input
+ *				   coefficients need to be less than 2*Q.
+ *
+ * @param [in,out] v pointer to input/output vector
+ */
+static inline void polyveck_invntt_tomont(polyveck *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		poly_invntt_tomont(&v->vec[i]);
+}
+
+static inline void polyveck_pointwise_poly_montgomery(polyveck *r,
+						      const poly *a,
+						      const polyveck *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		poly_pointwise_montgomery(&r->vec[i], a, &v->vec[i]);
+}
+
+/*
+ * @brief polyveck_chknorm - Check infinity norm of polynomials in vector of
+ *			     length K. Assumes input polyveck to be reduced by
+ *			     polyveck_reduce().
+ *
+ * @param [in] v pointer to vector
+ * @param [in] bound norm bound
+ *
+ * @return 0 if norm of all polynomials are strictly smaller than B <= (Q-1)/8
+ * and 1 otherwise.
+ */
+static inline int polyveck_chknorm(const polyveck *v, int32_t bound)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		if (poly_chknorm(&v->vec[i], bound))
+			return 1;
+
+	return 0;
+}
+
+/*
+ * @brief polyveck_decompose - For all coefficients a of polynomials in vector
+ *			       of length K, compute high and low bits a0, a1
+ *			       such a mod^+ Q = a1*ALPHA + a0 with
+ *			       -ALPHA/2 < a0 <= ALPHA/2 except a1 = (Q-1)/ALPHA
+ *			       where we set a1 = 0 and
+ *			       -ALPHA/2 <= a0 = a mod Q - Q < 0. Assumes
+ *			       coefficients to be standard representatives.
+ *
+ * @param [out] v1 pointer to output vector of polynomials with coefficients a1
+ * @param [in] v0 pointer to output vector of polynomials with coefficients a0
+ * @param [in] v pointer to input vector
+ */
+static inline void polyveck_decompose(polyveck *v1, polyveck *v0,
+				      const polyveck *v)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		poly_decompose(&v1->vec[i], &v0->vec[i], &v->vec[i]);
+}
+
+/*
+ * @brief polyveck_make_hint - Compute hint vector.
+ *
+ * @param [out] h pointer to output vector
+ * @param [in] v0 pointer to low part of input vector
+ * @param [in] v1 pointer to high part of input vector
+ *
+ * @return number of 1 bits.
+ */
+static inline unsigned int polyveck_make_hint(polyveck *h, const polyveck *v0,
+					      const polyveck *v1)
+{
+	unsigned int i, s = 0;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		s += poly_make_hint(&h->vec[i], &v0->vec[i], &v1->vec[i]);
+
+	return s;
+}
+
+/*
+ * @brief polyveck_use_hint - Use hint vector to correct the high bits of input
+ *			      vector.
+ *
+ * @param [out] w pointer to output vector of polynomials with corrected high
+ *		  bits
+ * @param [in] u pointer to input vector
+ * @param [in] h pointer to input hint vector
+ */
+static inline void polyveck_use_hint(polyveck *w, const polyveck *u,
+				     const polyveck *h)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		poly_use_hint(&w->vec[i], &u->vec[i], &h->vec[i]);
+}
+
+static inline void
+polyveck_pack_w1(uint8_t r[DILITHIUM_K * DILITHIUM_POLYW1_PACKEDBYTES],
+		 const polyveck *w1)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		polyw1_pack(&r[i * DILITHIUM_POLYW1_PACKEDBYTES],
+			    &w1->vec[i]);
+}
+
+#endif /* DILITHIUM_POLYVEC_H */
diff --git a/lib/crypto/mldsa/dilithium_polyvec_c.h b/lib/crypto/mldsa/dilithium_polyvec_c.h
new file mode 100644
index 000000000000..29e6dc3880dc
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_polyvec_c.h
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2023 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+#ifndef DILITHIUM_POLYVEC_C_H
+#define DILITHIUM_POLYVEC_C_H
+
+/*
+ * @brief expand_mat - Implementation of ExpandA. Generates matrix A with
+ *		       uniformly random coefficients a_{i,j} by performing
+ *		       rejection sampling on the output stream of
+ *		       SHAKE128(rho|j|i).
+ *
+ * @param [out] mat output matrix
+ * @param [in] rho byte array containing seed rho
+ */
+static inline void
+polyvec_matrix_expand(polyvecl mat[DILITHIUM_K],
+		      const uint8_t rho[DILITHIUM_SEEDBYTES], void *ws_buf)
+{
+	unsigned int i, j;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		for (j = 0; j < DILITHIUM_L; ++j)
+			poly_uniform(
+				&mat[i].vec[j], rho,
+				cpu_to_le16((uint16_t)(i << 8) + (uint16_t)j),
+				ws_buf);
+}
+
+/*
+ * @brief polyvecl_pointwise_acc_montgomery -
+ *	  Pointwise multiply vectors of polynomials of length L, multiply
+ *	  resulting vector by 2^{-32} and add (accumulate) polynomials
+ *	  in it. Input/output vectors are in NTT domain representation.
+ *
+ * @param [out] w output polynomial
+ * @param [in] u pointer to first input vector
+ * @param [in] v pointer to second input vector
+ */
+static inline void polyvecl_pointwise_acc_montgomery(poly *w, const polyvecl *u,
+						     const polyvecl *v,
+						     void *ws_buf)
+{
+	unsigned int i;
+	poly *t = ws_buf;
+
+	poly_pointwise_montgomery(w, &u->vec[0], &v->vec[0]);
+	for (i = 1; i < DILITHIUM_L; ++i) {
+		poly_pointwise_montgomery(t, &u->vec[i], &v->vec[i]);
+		poly_add(w, w, t);
+	}
+}
+
+static inline void
+polyvec_matrix_pointwise_montgomery(polyveck *t,
+				    const polyvecl mat[DILITHIUM_K],
+				    const polyvecl *v, void *ws_buf)
+{
+	unsigned int i;
+
+	for (i = 0; i < DILITHIUM_K; ++i)
+		polyvecl_pointwise_acc_montgomery(&t->vec[i], &mat[i], v,
+						  ws_buf);
+}
+
+#endif /* DILITHIUM_POLYVEC_C_H */
diff --git a/lib/crypto/mldsa/dilithium_reduce.h b/lib/crypto/mldsa/dilithium_reduce.h
new file mode 100644
index 000000000000..96f637c5d6cb
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_reduce.h
@@ -0,0 +1,85 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#ifndef DILITHIUM_REDUCE_H
+#define DILITHIUM_REDUCE_H
+
+#include "dilithium_type.h"
+
+#define MONT -4186625 // 2^32 % Q
+#define QINV 58728449 // q^(-1) mod 2^32
+
+/*
+ * @brief montgomery_reduce - For finite field element a with
+ *			     -2^{31}Q <= a <= Q*2^31,
+ *			     compute r \equiv a*2^{-32} (mod Q) such that
+ *			     -Q < r < Q.
+ *
+ * @param [in] a finite field element
+ *
+ * @return r
+ */
+static inline int32_t montgomery_reduce(int64_t a)
+{
+	int32_t t;
+
+	t = (int32_t)a * QINV;
+	t = (int32_t)((a - (int64_t)t * DILITHIUM_Q) >> 32);
+	return t;
+}
+
+/*
+ * @brief reduce32 - For finite field element a with a <= 2^{31} - 2^{22} - 1,
+ *		     compute r \equiv a (mod Q) such that
+ *		     -6283009 <= r <= 6283007.
+ *
+ * @param [in] a finite field element
+ *
+ * @return r
+ */
+static inline int32_t reduce32(int32_t a)
+{
+	int32_t t;
+
+	t = (a + (1 << 22)) >> 23;
+	t = a - t * DILITHIUM_Q;
+	return t;
+}
+
+/*
+ * @brief caddq - Add Q if input coefficient is negative.
+ *
+ * @param [in] a finite field element
+ *
+ * @return r
+ */
+static inline int32_t caddq(int32_t a)
+{
+	a += (a >> 31) & DILITHIUM_Q;
+	return a;
+}
+
+#endif /* DILITHIUM_REDUCE_H */
diff --git a/lib/crypto/mldsa/dilithium_rounding.c b/lib/crypto/mldsa/dilithium_rounding.c
new file mode 100644
index 000000000000..bead365e4ea8
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_rounding.c
@@ -0,0 +1,128 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#include "dilithium.h"
+
+/*
+ * @brief power2round - For finite field element a, compute a0, a1 such that
+ *			a mod^+ Q = a1*2^D + a0 with -2^{D-1} < a0 <= 2^{D-1}.
+ *			Assumes a to be standard representative.
+ *
+ * @param [in] a input element
+ * @param [out] a0 pointer to output element a0
+ *
+ * @return a1.
+ */
+int32_t power2round(int32_t *a0, int32_t a)
+{
+	int32_t a1;
+
+	a1 = (a + (1 << (DILITHIUM_D - 1)) - 1) >> DILITHIUM_D;
+	*a0 = a - (a1 << DILITHIUM_D);
+	return a1;
+}
+
+/*
+ * @brief decompose - For finite field element a, compute high and low bits a0,
+ *		      a1 such that a mod^+ Q = a1*ALPHA + a0 with
+ *		      -ALPHA/2 < a0 <= ALPHA/2 except if a1 = (Q-1)/ALPHA where
+ *		      we set a1 = 0 and -ALPHA/2 <= a0 = a mod^+ Q - Q < 0.
+ *		      Assumes a to be standard representative.
+ *
+ * @param [in] a input element
+ * @param [out] a0 pointer to output element a0
+ *
+ * @return a1.
+ */
+int32_t decompose(int32_t *a0, int32_t a)
+{
+	int32_t a1;
+
+	a1 = (a + 127) >> 7;
+#if DILITHIUM_GAMMA2 == (DILITHIUM_Q - 1) / 32
+	a1 = (a1 * 1025 + (1 << 21)) >> 22;
+	a1 &= 15;
+#elif DILITHIUM_GAMMA2 == (DILITHIUM_Q - 1) / 88
+	a1 = (a1 * 11275 + (1 << 23)) >> 24;
+	a1 ^= ((43 - a1) >> 31) & a1;
+#else
+#error "Uknown GAMMA2"
+#endif
+
+	*a0 = a - a1 * 2 * DILITHIUM_GAMMA2;
+	*a0 -= (((DILITHIUM_Q - 1) / 2 - *a0) >> 31) & DILITHIUM_Q;
+
+	return a1;
+}
+
+/*
+ * @brief make_hint - Compute hint bit indicating whether the low bits of the
+ *		      input element overflow into the high bits.
+ *
+ * @param  a0 [in] low bits of input element
+ * @param  a1 [in] high bits of input element
+ *
+ * @return 1 if overflow.
+ */
+int32_t make_hint(int32_t a0, int32_t a1)
+{
+	if (a0 > DILITHIUM_GAMMA2 || a0 < -DILITHIUM_GAMMA2 ||
+	    (a0 == -DILITHIUM_GAMMA2 && a1 != 0))
+		return 1;
+
+	return 0;
+}
+
+/*
+ * @brief use_hint - Correct high bits according to hint.
+ *
+ * @param [in] a input element
+ * @param [in] hint hint bit
+ *
+ * @return corrected high bits.
+ */
+int32_t use_hint(int32_t a, int32_t hint)
+{
+	int32_t a0, a1;
+
+	a1 = decompose(&a0, a);
+	if (hint == 0)
+		return a1;
+
+#if DILITHIUM_GAMMA2 == (DILITHIUM_Q - 1) / 32
+	if (a0 > 0)
+		return (a1 + 1) & 15;
+	else
+		return (a1 - 1) & 15;
+#elif DILITHIUM_GAMMA2 == (DILITHIUM_Q - 1) / 88
+	if (a0 > 0)
+		return (a1 == 43) ? 0 : a1 + 1;
+	else
+		return (a1 == 0) ? 43 : a1 - 1;
+#else
+#error "Uknown GAMMA2"
+#endif
+}
diff --git a/lib/crypto/mldsa/dilithium_service_helpers.h b/lib/crypto/mldsa/dilithium_service_helpers.h
new file mode 100644
index 000000000000..1bc33498c59d
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_service_helpers.h
@@ -0,0 +1,99 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+#ifndef DILITHIUM_SERVICE_HELPERS_H
+#define DILITHIUM_SERVICE_HELPERS_H
+
+/*
+ * @brief rej_uniform - Sample uniformly random coefficients in [0, Q-1] by
+ *			performing rejection sampling on array of random bytes.
+ *
+ * @param [out] a pointer to output array (allocated)
+ * @param [in] len number of coefficients to be sampled
+ * @param [in] buf array of random bytes
+ * @param [in] buflen length of array of random bytes
+ *
+ * @return number of sampled coefficients. Can be smaller than len if not enough
+ * random bytes were given.
+ */
+static inline unsigned int rej_uniform(int32_t *a, unsigned int len,
+				       const uint8_t *buf, unsigned int buflen)
+{
+	unsigned int ctr, pos;
+	uint32_t t;
+
+	ctr = pos = 0;
+	while (ctr < len && pos + 3 <= buflen) {
+		t = buf[pos++];
+		t |= (uint32_t)buf[pos++] << 8;
+		t |= (uint32_t)buf[pos++] << 16;
+		t &= 0x7FFFFF;
+
+		if (t < DILITHIUM_Q)
+			a[ctr++] = (int32_t)t;
+	}
+
+	return ctr;
+}
+
+/*
+ * @brief rej_eta - Sample uniformly random coefficients in [-ETA, ETA] by
+ *		    performing rejection sampling on array of random bytes.
+ *
+ * @param [out] a pointer to output array (allocated)
+ * @param [in] len number of coefficients to be sampled
+ * @param [in] buf array of random bytes
+ * @param [in] buflen length of array of random bytes
+ *
+ * @return number of sampled coefficients. Can be smaller than len if not enough
+ * random bytes were given.
+ */
+static inline unsigned int rej_eta(int32_t *a, unsigned int len,
+				   const uint8_t *buf, unsigned int buflen)
+{
+	unsigned int ctr, pos;
+	int32_t t0, t1;
+
+	ctr = pos = 0;
+	while (ctr < len && pos < buflen) {
+		t0 = buf[pos] & 0x0F;
+		t1 = buf[pos++] >> 4;
+
+#if DILITHIUM_ETA == 2
+		if (t0 < 15) {
+			t0 = t0 - (205 * t0 >> 10) * 5;
+			a[ctr++] = 2 - t0;
+		}
+		if (t1 < 15 && ctr < len) {
+			t1 = t1 - (205 * t1 >> 10) * 5;
+			a[ctr++] = 2 - t1;
+		}
+#elif DILITHIUM_ETA == 4
+		if (t0 < 9)
+			a[ctr++] = 4 - t0;
+		if (t1 < 9 && ctr < len)
+			a[ctr++] = 4 - t1;
+#else
+#error "Undefined DILITHIUM_ETA"
+#endif
+	}
+
+	return ctr;
+}
+
+#endif /* DILITHIUM_SERVICE_HELPERS_H */
diff --git a/lib/crypto/mldsa/dilithium_signature_c.c b/lib/crypto/mldsa/dilithium_signature_c.c
new file mode 100644
index 000000000000..b18c0469dd14
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_signature_c.c
@@ -0,0 +1,102 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#include "dilithium_signature_c.h"
+
+/* We need once the buffer size to handle the hashing */
+#define LC_POLY_UNIFOR_BUF_SIZE_MULTIPLIER 1
+
+#include "dilithium_poly.h"
+#include "dilithium_poly_common.h"
+#include "dilithium_poly_c.h"
+#include "dilithium_polyvec.h"
+#include "dilithium_polyvec_c.h"
+#include "dilithium_pack.h"
+#include "dilithium_signature_impl.h"
+
+int dilithium_verify_c(const struct dilithium_sig *sig, const uint8_t *m,
+		       size_t mlen, const struct dilithium_pk *pk)
+{
+	return dilithium_verify_impl(sig, m, mlen, pk);
+}
+
+int dilithium_verify_ctx_c(const struct dilithium_sig *sig,
+			   struct dilithium_ctx *ctx, const uint8_t *m,
+			   size_t mlen, const struct dilithium_pk *pk)
+{
+	return dilithium_verify_ctx_impl(sig, ctx, m, mlen, pk);
+}
+
+int dilithium_verify_init_c(struct dilithium_ctx *ctx,
+			    const struct dilithium_pk *pk)
+{
+	return dilithium_verify_init_impl(ctx, pk);
+}
+
+int dilithium_verify_update_c(struct dilithium_ctx *ctx, const uint8_t *m,
+			      size_t mlen)
+{
+	return dilithium_verify_update_impl(ctx, m, mlen);
+}
+
+int dilithium_verify_final_c(const struct dilithium_sig *sig,
+			     struct dilithium_ctx *ctx,
+			     const struct dilithium_pk *pk)
+{
+	return dilithium_verify_final_impl(sig, ctx, pk);
+}
+
+int dilithium_verify(const struct dilithium_sig *sig, const uint8_t *m,
+		       size_t mlen, const struct dilithium_pk *pk)
+{
+	return dilithium_verify_c(sig, m, mlen, pk);
+}
+
+int dilithium_verify_ctx(const struct dilithium_sig *sig,
+			   struct dilithium_ctx *ctx, const uint8_t *m,
+			   size_t mlen, const struct dilithium_pk *pk)
+{
+	return dilithium_verify_ctx_c(sig, ctx, m, mlen, pk);
+}
+
+int dilithium_verify_init(struct dilithium_ctx *ctx,
+			    const struct dilithium_pk *pk)
+{
+	return dilithium_verify_init_c(ctx, pk);
+}
+
+int dilithium_verify_update(struct dilithium_ctx *ctx, const uint8_t *m,
+			      size_t mlen)
+{
+	return dilithium_verify_update_c(ctx, m, mlen);
+}
+
+int dilithium_verify_final(const struct dilithium_sig *sig,
+			     struct dilithium_ctx *ctx,
+			     const struct dilithium_pk *pk)
+{
+	return dilithium_verify_final_c(sig, ctx, pk);
+}
diff --git a/lib/crypto/mldsa/dilithium_signature_c.h b/lib/crypto/mldsa/dilithium_signature_c.h
new file mode 100644
index 000000000000..d1e694e4c8d3
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_signature_c.h
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+#ifndef DILITHIUM_SIGNATURE_C_H
+#define DILITHIUM_SIGNATURE_C_H
+
+#include "dilithium_type.h"
+
+int dilithium_verify_c(const struct dilithium_sig *sig, const uint8_t *m,
+		       size_t mlen, const struct dilithium_pk *pk);
+int dilithium_verify_ctx_c(const struct dilithium_sig *sig,
+			   struct dilithium_ctx *ctx, const uint8_t *m,
+			   size_t mlen, const struct dilithium_pk *pk);
+int dilithium_verify_init_c(struct dilithium_ctx *ctx,
+			    const struct dilithium_pk *pk);
+int dilithium_verify_update_c(struct dilithium_ctx *ctx, const uint8_t *m,
+			      size_t mlen);
+int dilithium_verify_final_c(const struct dilithium_sig *sig,
+			     struct dilithium_ctx *ctx,
+			     const struct dilithium_pk *pk);
+
+#endif /* DILITHIUM_SIGNATURE_C_H */
diff --git a/lib/crypto/mldsa/dilithium_signature_helper.c b/lib/crypto/mldsa/dilithium_signature_helper.c
new file mode 100644
index 000000000000..82dc9018b3e6
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_signature_helper.c
@@ -0,0 +1,79 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2024 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+#include "dilithium_type.h"
+
+#define cround(x) round_up((x), umax(DILITHIUM_AHAT_ALIGNMENT, CRYPTO_MINALIGN))
+
+struct dilithium_ctx *dilithium_ctx_alloc(void)
+{
+	struct dilithium_ctx *ctx;
+
+	ctx = kzalloc(cround(sizeof(struct dilithium_ctx)),
+		      GFP_KERNEL);
+	if (!ctx)
+		return ERR_PTR(-ENOMEM);
+
+	return ctx;
+}
+
+struct dilithium_ctx *dilithium_ctx_alloc_ahat(enum dilithium_type type)
+{
+	struct dilithium_ctx *ctx;
+	size_t ahat_size;
+	void *p;
+
+	switch (type) {
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_44
+	case DILITHIUM_44:
+		ahat_size = DILITHIUM_44_AHAT_SIZE;
+		break;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_65
+	case DILITHIUM_65:
+		ahat_size = DILITHIUM_65_AHAT_SIZE;
+		break;
+#endif
+#ifdef CONFIG_CRYPTO_LIB_MLDSA_87
+	case DILITHIUM_87:
+		ahat_size = DILITHIUM_87_AHAT_SIZE;
+		break;
+#endif
+	default:
+		WARN_ON(1);
+		return ERR_PTR(-EINVAL);
+	}
+
+	p = kzalloc(cround(sizeof(struct dilithium_ctx)) +
+		    cround(ahat_size),
+		    GFP_KERNEL);
+	if (!p)
+		return ERR_PTR(-ENOMEM);
+
+	ctx = p;
+	p += cround(sizeof(struct dilithium_ctx));
+	ctx->ahat = p;
+	ctx->ahat_size = ahat_size;
+	p += cround(ahat_size);
+	return ctx;
+}
+
+void dilithium_ctx_zero_free(struct dilithium_ctx *ctx)
+{
+	kfree_sensitive(ctx);
+}
diff --git a/lib/crypto/mldsa/dilithium_signature_impl.h b/lib/crypto/mldsa/dilithium_signature_impl.h
new file mode 100644
index 000000000000..36c8541effd2
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_signature_impl.h
@@ -0,0 +1,370 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#ifndef DILITHIUM_SIGNATURE_IMPL_H
+#define DILITHIUM_SIGNATURE_IMPL_H
+
+#include "dilithium.h"
+#include "dilithium_type.h"
+#include "dilithium_debug.h"
+#include "dilithium_pack.h"
+#include "signature_domain_separation.h"
+
+#define _WS_POLY_UNIFORM_BUF_SIZE                                              \
+	(POLY_UNIFORM_NBLOCKS * SHAKE128_BLOCK_SIZE + 2)
+
+#ifndef LC_POLY_UNIFOR_BUF_SIZE_MULTIPLIER
+#error "LC_POLY_UNIFOR_BUF_SIZE_MULTIPLIER is not defined"
+#endif
+
+#define WS_POLY_UNIFORM_BUF_SIZE                                               \
+	(_WS_POLY_UNIFORM_BUF_SIZE * LC_POLY_UNIFOR_BUF_SIZE_MULTIPLIER)
+
+static int dilithium_verify_internal_ahat(const struct dilithium_sig *sig,
+					  const struct dilithium_pk *pk,
+					  struct dilithium_ctx *ctx)
+{
+	struct workspace_verify {
+		union {
+			poly cp;
+		} matrix;
+		polyveck w1;
+		union {
+			polyveck t1, h;
+			polyvecl z;
+			uint8_t mu[DILITHIUM_CRHBYTES];
+			union {
+				uint8_t coeffs[round_up(DILITHIUM_CTILDE_BYTES, 8)];
+			} __aligned(8) c2;
+		} buf;
+
+		union {
+			poly polyvecl_pointwise_acc_montgomery_buf;
+			uint8_t buf[DILITHIUM_K *
+				    DILITHIUM_POLYW1_PACKEDBYTES];
+			uint8_t poly_challenge_buf[POLY_CHALLENGE_BYTES];
+		} tmp;
+	};
+	struct workspace_verify *ws __free(kfree_sensitive) = NULL;
+	/* The first bytes of the signature is c~ and thus contains c1. */
+	const uint8_t *c1 = sig->sig;
+	const polyvecl *mat = ctx->ahat;
+	int ret = 0;
+
+	ws = kzalloc(sizeof(*ws), GFP_KERNEL);
+	if (!ws)
+		return -ENOMEM;
+
+	/* AHat must be present at this time */
+	if (!mat) {
+		ret = -EINVAL;
+		goto out;
+	}
+
+	unpack_sig_z(&ws->buf.z, sig);
+	if (polyvecl_chknorm(&ws->buf.z,
+			     DILITHIUM_GAMMA1 - DILITHIUM_BETA)) {
+		ret = -EINVAL;
+		goto out;
+	}
+
+	polyvecl_ntt(&ws->buf.z);
+	polyvec_matrix_pointwise_montgomery(
+		&ws->w1, mat, &ws->buf.z,
+		&ws->tmp.polyvecl_pointwise_acc_montgomery_buf);
+
+	/* Matrix-vector multiplication; compute Az - c2^dt1 */
+	poly_challenge(&ws->matrix.cp, c1, ws->tmp.poly_challenge_buf);
+	poly_ntt(&ws->matrix.cp);
+
+	unpack_pk_t1(&ws->buf.t1, pk);
+	polyveck_shiftl(&ws->buf.t1);
+	polyveck_ntt(&ws->buf.t1);
+	polyveck_pointwise_poly_montgomery(&ws->buf.t1, &ws->matrix.cp,
+					   &ws->buf.t1);
+
+	polyveck_sub(&ws->w1, &ws->w1, &ws->buf.t1);
+	polyveck_reduce(&ws->w1);
+	polyveck_invntt_tomont(&ws->w1);
+
+	/* Reconstruct w1 */
+	polyveck_caddq(&ws->w1);
+	dilithium_print_polyveck(&ws->w1,
+				 "Sigver - W K x N matrix before hint:");
+
+	if (unpack_sig_h(&ws->buf.h, sig))
+		return -EINVAL;
+	dilithium_print_polyveck(&ws->buf.h, "Siggen - H K x N matrix:");
+
+	polyveck_use_hint(&ws->w1, &ws->w1, &ws->buf.h);
+	dilithium_print_polyveck(&ws->w1,
+				 "Sigver - W K x N matrix after hint:");
+	polyveck_pack_w1(ws->tmp.buf, &ws->w1);
+	dilithium_print_buffer(ws->tmp.buf,
+			       DILITHIUM_K * DILITHIUM_POLYW1_PACKEDBYTES,
+			       "Sigver - W after w1Encode");
+
+	if (ctx->external_mu) {
+		if (ctx->external_mu_len != DILITHIUM_CRHBYTES)
+			return -EINVAL;
+
+		/* Call random oracle and verify challenge */
+		dilithium_hash_init(ctx);
+		dilithium_hash_update(ctx, ctx->external_mu, DILITHIUM_CRHBYTES);
+	} else {
+		dilithium_hash_final(ctx, ws->buf.mu, DILITHIUM_CRHBYTES);
+
+		/* Call random oracle and verify challenge */
+		dilithium_hash_init(ctx);
+		dilithium_hash_update(ctx, ws->buf.mu, DILITHIUM_CRHBYTES);
+	}
+
+	dilithium_hash_finup(ctx,
+			     ws->tmp.buf, DILITHIUM_K * DILITHIUM_POLYW1_PACKEDBYTES,
+			     ws->buf.c2.coeffs, DILITHIUM_CTILDE_BYTES);
+
+	/* Signature verification operation */
+	if (memcmp(c1, ws->buf.c2.coeffs, DILITHIUM_CTILDE_BYTES) != 0)
+		ret = -EBADMSG;
+
+out:
+	return ret;
+}
+
+static int
+dilithium_verify_internal_noahat(const struct dilithium_sig *sig,
+				 const struct dilithium_pk *pk,
+				 struct dilithium_ctx *ctx)
+{
+	struct workspace_verify {
+		polyvecl mat[DILITHIUM_K];
+		uint8_t poly_uniform_buf[WS_POLY_UNIFORM_BUF_SIZE];
+	};
+	struct workspace_verify *ws __free(kfree_sensitive) = NULL;
+	/* The first bytes of the key is rho. */
+	const uint8_t *rho = pk->pk;
+	int ret = 0;
+
+	ws = kzalloc(sizeof(*ws), GFP_KERNEL);
+	if (!ws)
+		return -ENOMEM;
+
+	polyvec_matrix_expand(ws->mat, rho, ws->poly_uniform_buf);
+
+	/* Temporarily set the pointer */
+	ctx->ahat = ws->mat;
+
+	ret = dilithium_verify_internal_ahat(sig, pk, ctx);
+
+	ctx->ahat = NULL;
+	return ret;
+}
+
+static int dilithium_pk_expand_impl(const struct dilithium_pk *pk,
+				    struct dilithium_ctx *ctx)
+{
+	struct workspace_verify {
+		uint8_t poly_uniform_buf[WS_POLY_UNIFORM_BUF_SIZE];
+	};
+	struct workspace_verify *ws __free(kfree_sensitive) = NULL;
+	/* The first bytes of the key is rho. */
+	const uint8_t *rho = pk->pk;
+	polyvecl *mat = ctx->ahat;
+	int ret = 0;
+
+	ws = kzalloc(sizeof(*ws), GFP_KERNEL);
+	if (!ws)
+		return -ENOMEM;
+
+	/*
+	 * Runtime sanity check ensures that the allocated context has
+	 * sufficient size (e.g. not that caller used, say,
+	 * DILITHIUM_44_CTX_ON_STACK_AHAT with a ML-DSA 65 or 87 key)
+	 */
+#if DILITHIUM_MODE == 2
+	if (ctx->ahat_size < DILITHIUM_44_AHAT_SIZE) {
+		ret = -EOVERFLOW;
+		goto out;
+	}
+#elif DILITHIUM_MODE == 3
+	if (ctx->ahat_size < DILITHIUM_65_AHAT_SIZE) {
+		ret = -EOVERFLOW;
+		goto out;
+	}
+#elif DILITHIUM_MODE == 5
+	if (ctx->ahat_size < DILITHIUM_87_AHAT_SIZE) {
+		ret = -EOVERFLOW;
+		goto out;
+	}
+#else
+#error "Undefined DILITHIUM_MODE"
+#endif
+
+	polyvec_matrix_expand(mat, rho, ws->poly_uniform_buf);
+	ctx->ahat_expanded = 1;
+
+out:
+	return ret;
+}
+
+static int dilithium_verify_internal(const struct dilithium_sig *sig,
+				     const struct dilithium_pk *pk,
+				     struct dilithium_ctx *ctx)
+{
+	int ret;
+
+	if (!ctx->ahat)
+		return dilithium_verify_internal_noahat(sig, pk, ctx);
+
+	if (!ctx->ahat_expanded) {
+		ret = dilithium_pk_expand_impl(pk, ctx);
+		if (ret < 0)
+			goto out;
+	}
+
+	ret = dilithium_verify_internal_ahat(sig, pk, ctx);
+
+out:
+	return ret;
+}
+
+static int dilithium_verify_ctx_impl(const struct dilithium_sig *sig,
+				     struct dilithium_ctx *ctx,
+				     const uint8_t *m, size_t mlen,
+				     const struct dilithium_pk *pk)
+{
+	uint8_t tr[DILITHIUM_TRBYTES];
+	int ret = 0;
+
+	if (!sig || !pk || !ctx)
+		return -EINVAL;
+
+	/* Either the message or the external mu must be provided */
+	if (!m && !ctx->external_mu)
+		return -EINVAL;
+
+	/* Make sure that ->mu is large enough for ->tr */
+	BUILD_BUG_ON(DILITHIUM_TRBYTES > DILITHIUM_CRHBYTES);
+
+	/* Compute CRH(H(rho, t1), msg) */
+	shake256(pk->pk, DILITHIUM_PUBLICKEYBYTES, tr,
+		 DILITHIUM_TRBYTES);
+
+	if (m) {
+		dilithium_hash_init(ctx);
+		dilithium_hash_update(ctx, tr, DILITHIUM_TRBYTES);
+		ret = signature_domain_separation(
+			&ctx->dilithium_hash_ctx, ctx->ml_dsa_internal,
+			ctx->userctx, ctx->userctxlen,
+			m, mlen,
+			DILITHIUM_NIST_CATEGORY);
+		if (ret < 0)
+			goto out;
+	}
+
+	ret = dilithium_verify_internal(sig, pk, ctx);
+
+out:
+	memzero_explicit(tr, sizeof(tr));
+	return ret;
+}
+
+static int dilithium_verify_impl(const struct dilithium_sig *sig,
+				 const uint8_t *m, size_t mlen,
+				 const struct dilithium_pk *pk)
+{
+	struct dilithium_ctx *ctx;
+	int ret;
+
+	ctx = dilithium_ctx_alloc();
+	if (IS_ERR(ctx))
+		return PTR_ERR(ctx);
+
+	ret = dilithium_verify_ctx_impl(sig, ctx, m, mlen, pk);
+
+	dilithium_ctx_zero_free(ctx);
+	return ret;
+}
+
+static int dilithium_verify_init_impl(struct dilithium_ctx *ctx,
+				      const struct dilithium_pk *pk)
+{
+	uint8_t mu[DILITHIUM_TRBYTES];
+
+	/* rng_ctx is allowed to be NULL as handled below */
+	if (!ctx || !pk)
+		return -EINVAL;
+
+	/* Require the use of SHAKE256 */
+	if (!dilithium_hash_check_blocksize(ctx, SHAKE256_BLOCK_SIZE))
+		return -EOPNOTSUPP;
+
+	/* Compute CRH(H(rho, t1), msg) */
+	shake256(pk->pk, DILITHIUM_PUBLICKEYBYTES, mu,
+		 DILITHIUM_TRBYTES);
+
+	dilithium_hash_init(ctx);
+	dilithium_hash_update(ctx, mu, DILITHIUM_TRBYTES);
+	memzero_explicit(mu, sizeof(mu));
+
+	return signature_domain_separation(
+		&ctx->dilithium_hash_ctx, ctx->ml_dsa_internal,
+		ctx->userctx, ctx->userctxlen,
+		NULL, 0,
+		DILITHIUM_NIST_CATEGORY);
+}
+
+static int dilithium_verify_update_impl(struct dilithium_ctx *ctx,
+					const uint8_t *m, size_t mlen)
+{
+	if (!ctx || !m)
+		return -EINVAL;
+
+	/* Compute CRH(H(rho, t1), msg) */
+	dilithium_hash_update(ctx, m, mlen);
+
+	return 0;
+}
+
+static int dilithium_verify_final_impl(const struct dilithium_sig *sig,
+				       struct dilithium_ctx *ctx,
+				       const struct dilithium_pk *pk)
+{
+	int ret = 0;
+
+	if (!sig || !ctx || !pk) {
+		ret = -EINVAL;
+		goto out;
+	}
+
+	ret = dilithium_verify_internal(sig, pk, ctx);
+
+out:
+	dilithium_ctx_zero(ctx);
+	return ret;
+}
+
+#endif /* DILITHIUM_SIGNATURE_IMPL_H */
diff --git a/lib/crypto/mldsa/dilithium_type.h b/lib/crypto/mldsa/dilithium_type.h
new file mode 100644
index 000000000000..5238a9e6debf
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_type.h
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2024 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+#ifndef DILITHIUM_TYPE_H
+#define DILITHIUM_TYPE_H
+
+#include "dilithium.h"
+
+/*
+ * This define replaces all symbol names accordingly to allow double compilation
+ * of the same code base.
+ *
+ * Due to the replacement operation, this header file must be included as the
+ * first header file in the entire stack.
+ *
+ * This file can easily be replaced with dilithium.h to achieve the common
+ * functionality without symbol duplication. But in this case, only the
+ * Dilithium security strength is compiled defined in dilithium.h. Duplicate
+ * compilation different sizes would not be possible.
+ */
+#ifdef DILITHIUM_TYPE_65
+#define DILITHIUM_F(name) dilithium_65_##name
+#define dilithium_pk dilithium_65_pk
+#define dilithium_sig dilithium_65_sig
+
+#include "dilithium_65.h"
+
+#elif defined DILITHIUM_TYPE_44
+#define DILITHIUM_F(name) dilithium_44_##name
+#define dilithium_pk dilithium_44_pk
+#define dilithium_sig dilithium_44_sig
+
+#include "dilithium_44.h"
+
+#else
+#define DILITHIUM_F(name) dilithium_87_##name
+#define dilithium_pk dilithium_87_pk
+#define dilithium_sig dilithium_87_sig
+
+#include "dilithium_87.h"
+
+#endif
+
+/*
+ * The following defines simply allow duplicate compilation of the
+ * respective functions.
+ */
+#define dilithium_verify DILITHIUM_F(verify)
+#define dilithium_verify_ctx DILITHIUM_F(verify_ctx)
+#define dilithium_verify_init DILITHIUM_F(verify_init)
+#define dilithium_verify_update DILITHIUM_F(verify_update)
+#define dilithium_verify_final DILITHIUM_F(verify_final)
+
+#define dilithium_verify_c DILITHIUM_F(verify_c)
+#define dilithium_verify_ctx_c DILITHIUM_F(verify_ctx_c)
+#define dilithium_verify_init_c DILITHIUM_F(verify_init_c)
+#define dilithium_verify_update_c DILITHIUM_F(verify_update_c)
+#define dilithium_verify_final_c DILITHIUM_F(verify_final_c)
+
+#define ntt DILITHIUM_F(ntt)
+#define invntt_tomont DILITHIUM_F(invntt_tomont)
+#define poly_chknorm DILITHIUM_F(poly_chknorm)
+#define poly_uniform DILITHIUM_F(poly_uniform)
+#define poly_uniform_gamma1 DILITHIUM_F(poly_uniform_gamma1)
+#define polyz_unpack DILITHIUM_F(polyz_unpack)
+#define poly_challenge DILITHIUM_F(poly_challenge)
+#define polyeta_unpack DILITHIUM_F(polyeta_unpack)
+#define polyt0_unpack DILITHIUM_F(polyt0_unpack)
+#define polyw1_pack DILITHIUM_F(polyw1_pack)
+#define power2round DILITHIUM_F(power2round)
+#define decompose DILITHIUM_F(decompose)
+#define make_hint DILITHIUM_F(make_hint)
+#define use_hint DILITHIUM_F(use_hint)
+
+#define dilithium_print_buffer DILITHIUM_F(print_buffer)
+#define dilithium_print_polyvecl_k DILITHIUM_F(print_polyvecl_k)
+#define dilithium_print_polyvecl DILITHIUM_F(print_polyvecl)
+#define dilithium_print_polyveck DILITHIUM_F(print_polyveck)
+#define dilithium_print_poly DILITHIUM_F(print_poly)
+
+/* Rounding */
+int32_t power2round(int32_t *a0, int32_t a);
+int32_t decompose(int32_t *a0, int32_t a);
+int32_t make_hint(int32_t a0, int32_t a1);
+int32_t use_hint(int32_t a, int32_t hint);
+
+#endif /* DILITHIUM_TYPE_H */
diff --git a/lib/crypto/mldsa/dilithium_zetas.c b/lib/crypto/mldsa/dilithium_zetas.c
new file mode 100644
index 000000000000..f0e9203f35dd
--- /dev/null
+++ b/lib/crypto/mldsa/dilithium_zetas.c
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2022 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+/*
+ * This code is derived in parts from the code distribution provided with
+ * https://github.com/pq-crystals/dilithium
+ *
+ * That code is released under Public Domain
+ * (https://creativecommons.org/share-your-work/public-domain/cc0/);
+ * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
+ */
+
+#include "dilithium.h"
+
+const int32_t dilithium_zetas[DILITHIUM_N] = {
+	0,	  25847,    -2608894, -518909,	237124,	  -777960,  -876248,
+	466468,	  1826347,  2353451,  -359251,	-2091905, 3119733,  -2884855,
+	3111497,  2680103,  2725464,  1024112,	-1079900, 3585928,  -549488,
+	-1119584, 2619752,  -2108549, -2118186, -3859737, -1399561, -3277672,
+	1757237,  -19422,   4010497,  280005,	2706023,  95776,    3077325,
+	3530437,  -1661693, -3592148, -2537516, 3915439,  -3861115, -3043716,
+	3574422,  -2867647, 3539968,  -300467,	2348700,  -539299,  -1699267,
+	-1643818, 3505694,  -3821735, 3507263,	-2140649, -1600420, 3699596,
+	811944,	  531354,   954230,   3881043,	3900724,  -2556880, 2071892,
+	-2797779, -3930395, -1528703, -3677745, -3041255, -1452451, 3475950,
+	2176455,  -1585221, -1257611, 1939314,	-4083598, -1000202, -3190144,
+	-3157330, -3632928, 126922,   3412210,	-983419,  2147896,  2715295,
+	-2967645, -3693493, -411027,  -2477047, -671102,  -1228525, -22981,
+	-1308169, -381987,  1349076,  1852771,	-1430430, -3343383, 264944,
+	508951,	  3097992,  44288,    -1100098, 904516,	  3958618,  -3724342,
+	-8578,	  1653064,  -3249728, 2389356,	-210977,  759969,   -1316856,
+	189548,	  -3553272, 3159746,  -1851402, -2409325, -177440,  1315589,
+	1341330,  1285669,  -1584928, -812732,	-1439742, -3019102, -3881060,
+	-3628969, 3839961,  2091667,  3407706,	2316500,  3817976,  -3342478,
+	2244091,  -2446433, -3562462, 266997,	2434439,  -1235728, 3513181,
+	-3520352, -3759364, -1197226, -3193378, 900702,	  1859098,  909542,
+	819034,	  495491,   -1613174, -43260,	-522500,  -655327,  -3122442,
+	2031748,  3207046,  -3556995, -525098,	-768622,  -3595838, 342297,
+	286988,	  -2437823, 4108315,  3437287,	-3342277, 1735879,  203044,
+	2842341,  2691481,  -2590150, 1265009,	4055324,  1247620,  2486353,
+	1595974,  -3767016, 1250494,  2635921,	-3548272, -2994039, 1869119,
+	1903435,  -1050970, -1333058, 1237275,	-3318210, -1430225, -451100,
+	1312455,  3306115,  -1962642, -1279661, 1917081,  -2546312, -1374803,
+	1500165,  777191,   2235880,  3406031,	-542412,  -2831860, -1671176,
+	-1846953, -2584293, -3724270, 594136,	-3776993, -2013608, 2432395,
+	2454455,  -164721,  1957272,  3369112,	185531,	  -1207385, -3183426,
+	162844,	  1616392,  3014001,  810149,	1652634,  -3694233, -1799107,
+	-3038916, 3523897,  3866901,  269760,	2213111,  -975884,  1717735,
+	472078,	  -426683,  1723600,  -1803090, 1910376,  -1667432, -1104333,
+	-260646,  -3833893, -2939036, -2235985, -420899,  -2286327, 183443,
+	-976891,  1612842,  -3545687, -554416,	3919660,  -48306,   -1362209,
+	3937738,  1400424,  -846154,  1976782
+};
diff --git a/lib/crypto/mldsa/signature_domain_separation.c b/lib/crypto/mldsa/signature_domain_separation.c
new file mode 100644
index 000000000000..3073f1d71ee8
--- /dev/null
+++ b/lib/crypto/mldsa/signature_domain_separation.c
@@ -0,0 +1,203 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2024 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+#include "signature_domain_separation.h"
+
+static const char *signature_prehash_type;
+
+/* RFC4055 2.16.840.1.101.3.4.2.1 */
+static const uint8_t sha256_oid_der[] __maybe_unused = { 0x06, 0x09, 0x60, 0x86,
+							 0x48, 0x01, 0x65, 0x03,
+							 0x04, 0x02, 0x01 };
+/* RFC4055 2.16.840.1.101.3.4.2.2 */
+static const uint8_t sha384_oid_der[] __maybe_unused = { 0x06, 0x09, 0x60, 0x86,
+							 0x48, 0x01, 0x65, 0x03,
+							 0x04, 0x02, 0x02 };
+/* RFC4055 2.16.840.1.101.3.4.2.3 */
+static const uint8_t sha512_oid_der[] __maybe_unused = { 0x06, 0x09, 0x60, 0x86,
+							 0x48, 0x01, 0x65, 0x03,
+							 0x04, 0x02, 0x03 };
+
+/*
+ * https://lamps-wg.github.io/draft-composite-sigs/draft-ietf-lamps-pq-composite-sigs.html
+ */
+static const uint8_t sha3_256_oid_der[] __maybe_unused = {
+	0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x08
+};
+static const uint8_t sha3_384_oid_der[] __maybe_unused = {
+	0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x09
+};
+static const uint8_t sha3_512_oid_der[] __maybe_unused = {
+	0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0a
+};
+
+/* RFC8692 2.16.840.1.101.3.4.2.11 */
+static const uint8_t shake128_oid_der[] __maybe_unused = {
+	0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0B
+};
+
+/* RFC8692 2.16.840.1.101.3.4.2.11 */
+static const uint8_t shake256_oid_der[] __maybe_unused = {
+	0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0C
+};
+
+static int signature_ph_oids(struct shake_ctx *hash_ctx, size_t mlen,
+			     unsigned int nist_category)
+{
+	/* If no hash is supplied, we have no HashML-DSA */
+	if (!signature_prehash_type)
+		return 0;
+
+	/*
+	 * The signature init/update/final operation will not work with the
+	 * check of mlen, as only when _final is invoked, the message length
+	 * is known.
+	 *
+	 * As defined in FIPS 204, section 5.4 requires
+	 * "... the digest that is signed needs to be generated using an
+	 * approved hash function or XOF (e.g., from FIPS 180 or FIPS 202) that
+	 * provides at least λ bits of classical security strength against both
+	 * collision and second preimage attacks ... Obtaining at least λ bits
+	 * of classical security strength against collision attacks requires
+	 * that the digest to be signed be at least 2λ bits in length."
+	 * This requirement implies in the following definitions.
+	 */
+	switch (nist_category) {
+	case 1:
+		if (strcmp(signature_prehash_type, "sha256") == 0) {
+			// if (mlen != LC_SHA256_SIZE_DIGEST)
+			// 	return -EOPNOTSUPP;
+			shake_update(hash_ctx, sha256_oid_der,
+				     sizeof(sha256_oid_der));
+			return 0;
+		}
+		if (strcmp(signature_prehash_type, "sha3-256") == 0) {
+			// if (mlen != LC_SHA3_256_SIZE_DIGEST)
+			// 	return -EOPNOTSUPP;
+			shake_update(hash_ctx, sha3_256_oid_der,
+				     sizeof(sha3_256_oid_der));
+			return 0;
+		}
+		if (strcmp(signature_prehash_type, "shake128") == 0) {
+			/* FIPS 204 section 5.4.1 */
+			// if (mlen != 32)
+			// 	return -EOPNOTSUPP;
+			shake_update(hash_ctx, shake128_oid_der,
+				     sizeof(shake128_oid_der));
+			return 0;
+		}
+		/* FALLTHROUGH - Dilithium44 allows the following, too */
+		fallthrough;
+	case 3:
+		if (strcmp(signature_prehash_type, "sha3-384") == 0) {
+			// if (mlen != LC_SHA3_384_SIZE_DIGEST)
+			// 	return -EOPNOTSUPP;
+			shake_update(hash_ctx, sha3_384_oid_der,
+				     sizeof(sha3_384_oid_der));
+			return 0;
+		}
+		if (strcmp(signature_prehash_type, "sha384") == 0) {
+			// if (mlen != LC_SHA384_SIZE_DIGEST)
+			// 	return -EOPNOTSUPP;
+			shake_update(hash_ctx, sha384_oid_der,
+				     sizeof(sha384_oid_der));
+			return 0;
+		}
+		/* FALLTHROUGH - Dilithium[44|65] allows the following, too  */
+		fallthrough;
+	case 5:
+		if (strcmp(signature_prehash_type, "sha512") == 0) {
+			// if (mlen != LC_SHA512_SIZE_DIGEST)
+			// 	return -EOPNOTSUPP;
+			shake_update(hash_ctx, sha512_oid_der,
+				     sizeof(sha512_oid_der));
+			return 0;
+		}
+		if (strcmp(signature_prehash_type, "sha3-512") == 0) {
+			// if (mlen != LC_SHA3_512_SIZE_DIGEST)
+			// 	return -EOPNOTSUPP;
+			shake_update(hash_ctx, sha3_512_oid_der,
+				     sizeof(sha3_512_oid_der));
+			return 0;
+		} else if (strcmp(signature_prehash_type, "shake256") == 0) {
+			/* FIPS 204 section 5.4.1 */
+			/*
+			 * TODO: mlen must be >= 64 to comply with the
+			 * aforementioned requirement - unfortunately we can
+			 * only check mlen at the end of the signature
+			 * operation - shall this be implemented?
+			 */
+			// if (mlen != 64)
+			// 	return -EOPNOTSUPP;
+			shake_update(hash_ctx, shake256_oid_der,
+				     sizeof(shake256_oid_der));
+			return 0;
+		}
+		break;
+	default:
+		break;
+	}
+
+	return -EOPNOTSUPP;
+}
+
+/* FIPS 204 pre-hash ML-DSA domain separation, but without original message */
+static int standalone_signature_domain_separation(
+	struct shake_ctx *hash_ctx, const uint8_t *userctx,
+	size_t userctxlen, size_t mlen, unsigned int nist_category)
+{
+	uint8_t domainseparation[2];
+
+	domainseparation[0] = signature_prehash_type ? 1 : 0;
+	domainseparation[1] = (uint8_t)userctxlen;
+
+	shake_update(hash_ctx, domainseparation, sizeof(domainseparation));
+	shake_update(hash_ctx, userctx, userctxlen);
+
+	return signature_ph_oids(hash_ctx, mlen, nist_category);
+}
+
+/*
+ * Domain separation as required by:
+ *
+ * FIPS 204 pre-hash ML-DSA: no randomiser
+ * Composite ML-DSA draft 5: with randomizer
+ */
+int signature_domain_separation(struct shake_ctx *hash_ctx,
+				unsigned int ml_dsa_internal,
+				const uint8_t *userctx, size_t userctxlen,
+				const uint8_t *m, size_t mlen,
+				unsigned int nist_category)
+{
+	int ret = 0;
+
+	/* The internal operation skips the domain separation code */
+	if (ml_dsa_internal)
+		goto out;
+
+	if (userctxlen > 255)
+		return -EINVAL;
+
+	ret = standalone_signature_domain_separation(hash_ctx,
+						     userctx, userctxlen,
+						     mlen, nist_category);
+
+out:
+	shake_update(hash_ctx, m, mlen);
+	return ret;
+}
diff --git a/lib/crypto/mldsa/signature_domain_separation.h b/lib/crypto/mldsa/signature_domain_separation.h
new file mode 100644
index 000000000000..070c8b4ec371
--- /dev/null
+++ b/lib/crypto/mldsa/signature_domain_separation.h
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2024 - 2025, Stephan Mueller <smueller@chronox.de>
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+ * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+#ifndef SIGNATURE_DOMAIN_SEPARATION_H
+#define SIGNATURE_DOMAIN_SEPARATION_H
+
+#include "dilithium.h"
+
+int signature_domain_separation(struct shake_ctx *hash_ctx,
+				unsigned int ml_dsa_internal,
+				const uint8_t *userctx, size_t userctxlen,
+				const uint8_t *m, size_t mlen,
+				unsigned int nist_category);
+
+#endif /* SIGNATURE_DOMAIN_SEPARATION_H */


^ permalink raw reply related

* [PATCH v8 1/9] crypto: Add support for shake256 through crypto_shash
From: David Howells @ 2025-11-14 13:04 UTC (permalink / raw)
  To: Herbert Xu
  Cc: David Howells, Eric Biggers, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Jason A . Donenfeld, Ard Biesheuvel,
	Stephan Mueller, Lukas Wunner, Ignat Korchagin, linux-crypto,
	keyrings, linux-modules, linux-kernel
In-Reply-To: <20251114130417.1756230-1-dhowells@redhat.com>

Add shake256 support to the SHA-3 crypto_sig module so that ML-DSA can use
it.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Stephan Mueller <smueller@chronox.de>
cc: Eric Biggers <ebiggers@kernel.org>
cc: Jason A. Donenfeld <Jason@zx2c4.com>
cc: Ard Biesheuvel <ardb@kernel.org>
cc: Herbert Xu <herbert@gondor.apana.org.au>
cc: linux-crypto@vger.kernel.org
---
 crypto/sha3.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/crypto/sha3.c b/crypto/sha3.c
index 8f364979ec89..be1d18baee8d 100644
--- a/crypto/sha3.c
+++ b/crypto/sha3.c
@@ -9,6 +9,7 @@
 #include <linux/module.h>
 
 #define SHA3_CTX(desc) ((struct sha3_ctx *)shash_desc_ctx(desc))
+#define SHAKE_CTX(desc) ((struct shake_ctx *)shash_desc_ctx(desc))
 
 static int crypto_sha3_224_init(struct shash_desc *desc)
 {
@@ -87,6 +88,36 @@ static int crypto_sha3_import_core(struct shash_desc *desc, const void *in)
 	return 0;
 }
 
+static int crypto_shake256_init(struct shash_desc *desc)
+{
+	shake256_init(SHAKE_CTX(desc));
+	return 0;
+}
+
+static int crypto_shake_update(struct shash_desc *desc, const u8 *data,
+			      unsigned int len)
+{
+	shake_update(SHAKE_CTX(desc), data, len);
+	return 0;
+}
+
+static int crypto_shake_final(struct shash_desc *desc, u8 *out)
+{
+	const struct shash_alg *alg = crypto_shash_alg(desc->tfm);
+
+	shake_squeeze(SHAKE_CTX(desc), out, alg->digestsize);
+	return 0;
+}
+
+static int crypto_shake256_digest(struct shash_desc *desc,
+				  const u8 *data, unsigned int len, u8 *out)
+{
+	const struct shash_alg *alg = crypto_shash_alg(desc->tfm);
+
+	shake256(data, len, out, alg->digestsize);
+	return 0;
+}
+
 static struct shash_alg algs[] = { {
 	.digestsize		= SHA3_224_DIGEST_SIZE,
 	.init			= crypto_sha3_224_init,
@@ -139,6 +170,17 @@ static struct shash_alg algs[] = { {
 	.base.cra_driver_name	= "sha3-512-lib",
 	.base.cra_blocksize	= SHA3_512_BLOCK_SIZE,
 	.base.cra_module	= THIS_MODULE,
+}, {
+	.digestsize		= SHAKE256_DEFAULT_SIZE,
+	.init			= crypto_shake256_init,
+	.update			= crypto_shake_update,
+	.final			= crypto_shake_final,
+	.digest			= crypto_shake256_digest,
+	.descsize		= sizeof(struct shake_ctx),
+	.base.cra_name		= "shake256",
+	.base.cra_driver_name	= "shake256-lib",
+	.base.cra_blocksize	= SHAKE256_BLOCK_SIZE,
+	.base.cra_module	= THIS_MODULE,
 } };
 
 static int __init crypto_sha3_mod_init(void)


^ permalink raw reply related

* [PATCH v8 0/9] lib/crypto: Add ML-DSA signing
From: David Howells @ 2025-11-14 13:04 UTC (permalink / raw)
  To: Herbert Xu
  Cc: David Howells, Eric Biggers, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Jason A . Donenfeld, Ard Biesheuvel,
	Stephan Mueller, Lukas Wunner, Ignat Korchagin, linux-crypto,
	keyrings, linux-modules, linux-kernel

Hi Herbert, Eric, et al.,

Building on the SHA-3 lib-crypto patches now in Eric's tree, here's a set of
patches does the following:

 (1) Add SHAKE-256 crypto_sig support, generating 32-byte fixed output.  The
     XOF features aren't available through this.  SHAKE-128 crypto_sig support
     isn't required for ML-DSA, so I haven't implemented that at this time.

 (2) Add ML-DSA signature verification code, extracted from Stephan
     Mueller's Leancrypto project.  The primary interface is intended to be
     through crypto_sig.

 (3) Add a simplified ML-DSA API for direct lib-crypto access.  Possibly
     this should be conditional as the main access (from PKCS#7/X.509) is
     going to be through crypto_sig.

 (4) Add a kunit test in three instalments (due to size) to add some
     testing for the three different levels of ML-DSA (44, 65 and 87).

 (5) Modify PKCS#7 support to allow kernel module signatures to carry
     authenticatedAttributes as OpenSSL refuses to let them be opted out of
     for ML-DSA (CMS_NOATTR).  This adds an extra digest calculation to the
     process.

 (6) Modify PKCS#7 to pass the authenticatedAttributes directly to the
     ML-DSA algorithm rather than passing over a digest as is done with RSA
     as ML-DSA wants to do its own hashing and will add other stuff into
     the hash.  We could use hashML-DSA or an external mu instead, but they
     aren't standardised for CMS yet.

 (7) Add support to the PKCS#7 and X.509 parsers for ML-DSA.

 (8) Modify sign-file to handle OpenSSL not permitting CMS_NOATTR with
     ML-DSA.

 (9) Allow SHA-3 algorithms, including SHAKE256, to be used for the message
     digest and add ML-DSA to the choice of algorithm with which to sign.

With that, ML-DSA signing appears to work.

This is based on Eric's libcrypto-next branch.

The patches can also be found here:

	https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git/log/?h=keys-pqc

David

Changes
=======
ver #8)
 - Moved the ML-DSA code to lib/crypto/mldsa/.
 - Renamed some bits from ml-dsa to mldsa.
 - Created a simplified API and placed that in include/crypto/mldsa.h.
 - Made the testing code use the simplified API.
 - Fixed a warning about implicitly casting between uint16_t and __le16.

ver #7)
 - Rebased on Eric's tree as that now contains all the necessary SHA-3
   infrastructure and drop the SHA-3 patches from here.
 - Added a minimal patch to provide shake256 support for crypto_sig.
 - Got rid of the memory allocation wrappers.
 - Removed the ML-DSA keypair generation code and the signing code, leaving
   only the signature verification code.
 - Removed the secret key handling code.
 - Removed the secret keys from the kunit tests and the signing testing.
 - Removed some unused bits from the ML-DSA code.
 - Downgraded the kdoc comments to ordinary comments, but keep the markup
   for easier comparison to Leancrypto.

ver #6)
 - Added a patch to make the jitterentropy RNG use lib/sha3.
 - Added back the crypto/sha3_generic changes.
 - Added ML-DSA implementation (still needs more cleanup).
 - Added kunit test for ML-DSA.
 - Modified PKCS#7 to accommodate ML-DSA.
 - Modified PKCS#7 and X.509 to allow ML-DSA to be specified and used.
 - Modified sign-file to not use CMS_NOATTR with ML-DSA.
 - Allowed SHA3 and SHAKE* algorithms for module signing default.
 - Allowed ML-DSA-{44,65,87} to be selected as the module signing default.

ver #5)
 - Fix gen-hash-testvecs.py to correctly handle algo names that contain a
   dash.
 - Fix gen-hash-testvecs.py to not generate HMAC for SHA3-* or SHAKE* as
   these don't currently have HMAC variants implemented.
 - Fix algo names to be correct.
 - Fix kunit module description as it now tests all SHA3 variants.

ver #4)
 - Fix a couple of arm64 build problems.
 - Doc fixes:
   - Fix the description of the algorithm to be closer to the NIST spec's
     terminology.
   - Don't talk of finialising the context for XOFs.
   - Don't say "Return: None".
   - Declare the "Context" to be "Any context" and make no mention of the
     fact that it might use the FPU.
   - Change "initialise" to "initialize".
   - Don't warn that the context is relatively large for stack use.
 - Use size_t for size parameters/variables.
 - Make the module_exit unconditional.
 - Dropped the crypto/ dir-affecting patches for the moment.

ver #3)
 - Renamed conflicting arm64 functions.
 - Made a separate wrapper API for each algorithm in the family.
 - Removed sha3_init(), sha3_reinit() and sha3_final().
 - Removed sha3_ctx::digest_size.
 - Renamed sha3_ctx::partial to sha3_ctx::absorb_offset.
 - Refer to the output of SHAKE* as "output" not "digest".
 - Moved the Iota transform into the one-round function.
 - Made sha3_update() warn if called after sha3_squeeze().
 - Simplified the module-load test to not do update after squeeze.
 - Added Return: and Context: kdoc statements and expanded the kdoc
   headers.
 - Added an API description document.
 - Overhauled the kunit tests.
   - Only have one kunit test.
   - Only call the general hash tester on one algo.
   - Add separate simple cursory checks for the other algos.
   - Add resqueezing tests.
   - Add some NIST example tests.
 - Changed crypto/sha3_generic to use this
 - Added SHAKE128/256 to crypto/sha3_generic and crypto/testmgr
 - Folded struct sha3_state into struct sha3_ctx.

ver #2)
  - Simplify the endianness handling.
  - Rename sha3_final() to sha3_squeeze() and don't clear the context at the
    end as it's permitted to continue calling sha3_final() to extract
    continuations of the digest (needed by ML-DSA).
  - Don't reapply the end marker to the hash state in continuation
    sha3_squeeze() unless sha3_update() gets called again (needed by
    ML-DSA).
  - Give sha3_squeeze() the amount of digest to produce as a parameter
    rather than using ctx->digest_size and don't return the amount digested.
  - Reimplement sha3_final() as a wrapper around sha3_squeeze() that
    extracts ctx->digest_size amount of digest and then zeroes out the
    context.  The latter is necessary to avoid upsetting
    hash-test-template.h.
  - Provide a sha3_reinit() function to clear the state, but to leave the
    parameters that indicate the hash properties unaffected, allowing for
    reuse.
  - Provide a sha3_set_digestsize() function to change the size of the
    digest to be extracted by sha3_final().  sha3_squeeze() takes a
    parameter for this instead.
  - Don't pass the digest size as a parameter to shake128/256_init() but
    rather default to 128/256 bits as per the function name.
  - Provide a sha3_clear() function to zero out the context.

David Howells (9):
  crypto: Add support for shake256 through crypto_shash
  crypto: Add ML-DSA/Dilithium verify support
  mldsa: Add a simpler API
  crypto: Add ML-DSA-44 pure rejection test vectors as a kunit test
  crypto: Add ML-DSA-65 pure rejection test vectors as a kunit test
  crypto: Add ML-DSA-87 pure rejection test vectors as a kunit test
  pkcs7: Allow the signing algo to calculate the digest itself
  pkcs7, x509: Add ML-DSA support
  modsign: Enable ML-DSA module signing

 Documentation/admin-guide/module-signing.rst  |   15 +-
 Documentation/crypto/index.rst                |    1 +
 Documentation/crypto/mldsa.rst                |  111 +
 certs/Kconfig                                 |   24 +
 certs/Makefile                                |    3 +
 crypto/asymmetric_keys/pkcs7_parser.c         |   19 +-
 crypto/asymmetric_keys/pkcs7_verify.c         |   52 +-
 crypto/asymmetric_keys/public_key.c           |    7 +
 crypto/asymmetric_keys/x509_cert_parser.c     |   24 +
 crypto/sha3.c                                 |   42 +
 include/crypto/mldsa.h                        |   34 +
 include/crypto/public_key.h                   |    1 +
 include/linux/oid_registry.h                  |    5 +
 kernel/module/Kconfig                         |    5 +
 lib/crypto/Kconfig                            |    1 +
 lib/crypto/Makefile                           |    2 +
 lib/crypto/mldsa/Kconfig                      |   28 +
 lib/crypto/mldsa/Makefile                     |   15 +
 lib/crypto/mldsa/crypto_mldsa.c               |  332 +
 lib/crypto/mldsa/dilithium.h                  |  545 ++
 lib/crypto/mldsa/dilithium_44.c               |   33 +
 lib/crypto/mldsa/dilithium_44.h               |  282 +
 lib/crypto/mldsa/dilithium_65.c               |   33 +
 lib/crypto/mldsa/dilithium_65.h               |  282 +
 lib/crypto/mldsa/dilithium_87.c               |   33 +
 lib/crypto/mldsa/dilithium_87.h               |  282 +
 lib/crypto/mldsa/dilithium_api.c              |  429 ++
 lib/crypto/mldsa/dilithium_debug.h            |   49 +
 lib/crypto/mldsa/dilithium_ntt.c              |   89 +
 lib/crypto/mldsa/dilithium_ntt.h              |   35 +
 lib/crypto/mldsa/dilithium_pack.h             |  119 +
 lib/crypto/mldsa/dilithium_poly.c             |  377 +
 lib/crypto/mldsa/dilithium_poly.h             |  181 +
 lib/crypto/mldsa/dilithium_poly_c.h           |  141 +
 lib/crypto/mldsa/dilithium_poly_common.h      |   35 +
 lib/crypto/mldsa/dilithium_polyvec.h          |  343 +
 lib/crypto/mldsa/dilithium_polyvec_c.h        |   81 +
 lib/crypto/mldsa/dilithium_reduce.h           |   85 +
 lib/crypto/mldsa/dilithium_rounding.c         |  128 +
 lib/crypto/mldsa/dilithium_service_helpers.h  |   99 +
 lib/crypto/mldsa/dilithium_signature_c.c      |  102 +
 lib/crypto/mldsa/dilithium_signature_c.h      |   37 +
 lib/crypto/mldsa/dilithium_signature_helper.c |   79 +
 lib/crypto/mldsa/dilithium_signature_impl.h   |  370 +
 lib/crypto/mldsa/dilithium_type.h             |  102 +
 lib/crypto/mldsa/dilithium_zetas.c            |   67 +
 lib/crypto/mldsa/mldsa_api.c                  |  186 +
 .../mldsa/signature_domain_separation.c       |  203 +
 .../mldsa/signature_domain_separation.h       |   30 +
 lib/crypto/tests/Kconfig                      |   10 +
 lib/crypto/tests/Makefile                     |    1 +
 lib/crypto/tests/mldsa_kunit.c                |  103 +
 .../tests/mldsa_pure_rejection_vectors_44.h   |  489 ++
 .../tests/mldsa_pure_rejection_vectors_65.h   | 4741 ++++++++++++
 .../tests/mldsa_pure_rejection_vectors_87.h   | 6456 +++++++++++++++++
 scripts/sign-file.c                           |   26 +-
 56 files changed, 17368 insertions(+), 36 deletions(-)
 create mode 100644 Documentation/crypto/mldsa.rst
 create mode 100644 include/crypto/mldsa.h
 create mode 100644 lib/crypto/mldsa/Kconfig
 create mode 100644 lib/crypto/mldsa/Makefile
 create mode 100644 lib/crypto/mldsa/crypto_mldsa.c
 create mode 100644 lib/crypto/mldsa/dilithium.h
 create mode 100644 lib/crypto/mldsa/dilithium_44.c
 create mode 100644 lib/crypto/mldsa/dilithium_44.h
 create mode 100644 lib/crypto/mldsa/dilithium_65.c
 create mode 100644 lib/crypto/mldsa/dilithium_65.h
 create mode 100644 lib/crypto/mldsa/dilithium_87.c
 create mode 100644 lib/crypto/mldsa/dilithium_87.h
 create mode 100644 lib/crypto/mldsa/dilithium_api.c
 create mode 100644 lib/crypto/mldsa/dilithium_debug.h
 create mode 100644 lib/crypto/mldsa/dilithium_ntt.c
 create mode 100644 lib/crypto/mldsa/dilithium_ntt.h
 create mode 100644 lib/crypto/mldsa/dilithium_pack.h
 create mode 100644 lib/crypto/mldsa/dilithium_poly.c
 create mode 100644 lib/crypto/mldsa/dilithium_poly.h
 create mode 100644 lib/crypto/mldsa/dilithium_poly_c.h
 create mode 100644 lib/crypto/mldsa/dilithium_poly_common.h
 create mode 100644 lib/crypto/mldsa/dilithium_polyvec.h
 create mode 100644 lib/crypto/mldsa/dilithium_polyvec_c.h
 create mode 100644 lib/crypto/mldsa/dilithium_reduce.h
 create mode 100644 lib/crypto/mldsa/dilithium_rounding.c
 create mode 100644 lib/crypto/mldsa/dilithium_service_helpers.h
 create mode 100644 lib/crypto/mldsa/dilithium_signature_c.c
 create mode 100644 lib/crypto/mldsa/dilithium_signature_c.h
 create mode 100644 lib/crypto/mldsa/dilithium_signature_helper.c
 create mode 100644 lib/crypto/mldsa/dilithium_signature_impl.h
 create mode 100644 lib/crypto/mldsa/dilithium_type.h
 create mode 100644 lib/crypto/mldsa/dilithium_zetas.c
 create mode 100644 lib/crypto/mldsa/mldsa_api.c
 create mode 100644 lib/crypto/mldsa/signature_domain_separation.c
 create mode 100644 lib/crypto/mldsa/signature_domain_separation.h
 create mode 100644 lib/crypto/tests/mldsa_kunit.c
 create mode 100644 lib/crypto/tests/mldsa_pure_rejection_vectors_44.h
 create mode 100644 lib/crypto/tests/mldsa_pure_rejection_vectors_65.h
 create mode 100644 lib/crypto/tests/mldsa_pure_rejection_vectors_87.h


^ permalink raw reply

* Re: [PATCH v2] lsm,ima: new LSM hook security_kernel_module_read_file to access decompressed kernel module
From: Coiby Xu @ 2025-11-13  4:06 UTC (permalink / raw)
  To: Mimi Zohar
  Cc: Paul Moore, linux-integrity, linux-security-module, Karel Srot,
	James Morris, Serge E. Hallyn, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Roberto Sassu, Dmitry Kasatkin,
	Eric Snowberg, open list, open list:MODULE SUPPORT
In-Reply-To: <0dfec96bf98b1c18d51bf40f4329c3ede48a9f32.camel@linux.ibm.com>

On Fri, Nov 07, 2025 at 02:28:13PM -0500, Mimi Zohar wrote:
>On Thu, 2025-11-06 at 17:15 -0500, Mimi Zohar wrote:
>> On Thu, 2025-11-06 at 21:29 +0800, Coiby Xu wrote:
>> > On Wed, Nov 05, 2025 at 03:47:25PM -0500, Mimi Zohar wrote:
>> > > On Wed, 2025-11-05 at 08:18 +0800, Coiby Xu wrote:
>> > [...]
>> > >
>> > > Hi Coiby,
>> > >
>> > > Based on the conversation with Paul, there is no reason to remove the existing
>> > > security_kernel_post_read_file() call.
>> > >
>> > > The changes are similar to the 2nd link, but a bit different.
>> > > - Define a single enumeration named READING_MODULE_COMPRESSED.
>> > >
>> > > - In module/main.c add a new security_kernel_post_read_file() call immediately
>> > > after decompressing the kernel module.  Like a previous version of this patch,
>> > > call kernel_read_file() with either READING_MODULE or READING_MODULE_COMPRESSED
>> > > based on MODULE_INIT_COMPRESSED_FILE.
>> > >
>> > > - In ima_post_read_file() defer verifying the signature when the enumeration is
>> > > READING_MODULE_COMPRESSED.  (No need for a new function ima_read_kernel_module.)
>> >
>> > Hi Mimi,
>> >
>> > Thanks for summarizing your conversation with Paul! I can confirm Paul's
>> > approach works
>> > https://github.com/coiby/linux/tree/in_kernel_decompression_ima_no_lsm_hook_paul
>> >
>> > While testing the patch today, I realized there is another
>> > issue/challenge introduced by in-kernel module decompression. IMA
>> > appraisal is to verify the digest of compressed kernel module but
>> > currently the passed buffer is uncompressed module. When IMA uses
>> > uncompressed module data to calculate the digest, xattr signature
>> > verification will fail. If we always make IMA read the original kernel
>> > module data again to calculate the digest, does it look like a
>> > quick-and-dirty fix? If we can assume people won't load kernel module so
>> > often, the performance impact is negligible. Otherwise we may have to
>> > introduce a new LSM hook so IMA can access uncompressed and original
>> > module data one time.
>>
>> ima_collect_measurement() stores the file hash info in the iint and uses that
>> information to verify the signature as stored in the security xattr.
>> Decompressing the kernel module shouldn't affect the xattr signature
>> verification.
>
>In the case when the compressed kernel module hasn't previously been measured or
>appraised before loading the kernel module, we need to "collect" the file data
>hash on READING_MODULE_COMPRESSED, but defer appraising/measuring it.
>
>An alternative to your suggestion of re-reading the original kernel module data
>to calculate the digest or defining a new hook, would be to define "collect" as
>a new "action" and pass the kernel_read_file_id enumeration to
>process_measurement().  IMA_COLLECTED already exists.  Only IMA_COLLECT would
>need to be defined.  The new collect "action" should be limited to
>func=MODULE_CHECK.
>
>The downside of this alternative is that it requires a new collect rule:
>collect func=MODULE_CHECK mask=MAY_READ uid=0
>appraise func=MODULE_CHECK appraise_type=imasig|modsig

Thank for suggesting an alternative! I've implemented the idea in
https://github.com/coiby/linux/tree/in_kernel_decompression_ima_collect

Note besides a new collect rule, another change is needed. Currently,
process_measurement only accepts enum ima_hooks thus it can't tell if
it's READING_MODULE_COMPRESSED so to only do collect action. So I
create a fake MODULE_COMPRESSED_CHECK func.

And for the idea of re-reading the original kernel module data, it has
been implemented in 
https://github.com/coiby/linux/tree/in_kernel_decompression_ima_no_lsm_hook_paul

Both branches have applied your requested three changes including
respecting the 80 char line limit. Additionally, I made a change to the
IPE LSM because of the new READING_MODULE_COMPRESSED kernel_read_file_id
enumerate.

After comparing the two implementations, personally I prefer re-reading
the original kernel module data because the change is smaller and it's
more user-friendly. But if there are other reasons I don't know, I'll
post the patches of the new collect action approach to the mailing list.


-- 
Best regards,
Coiby


^ permalink raw reply

* Re: [PATCH v2 5/7] kallsyms/bpf: Rename __bpf_address_lookup() to bpf_address_lookup()
From: Alexei Starovoitov @ 2025-11-13  2:50 UTC (permalink / raw)
  To: Petr Mladek
  Cc: Petr Pavlu, Steven Rostedt, Alexei Starovoitov, Andrew Morton,
	Kees Cook, Aaron Tomlin, Daniel Borkmann, John Fastabend,
	Masami Hiramatsu, Mark Rutland, Luis Chamberlain, Daniel Gomez,
	Sami Tolvanen, LKML, bpf, linux-modules, linux-trace-kernel
In-Reply-To: <20251112142003.182062-6-pmladek@suse.com>

On Wed, Nov 12, 2025 at 6:21 AM Petr Mladek <pmladek@suse.com> wrote:
>
> bpf_address_lookup() has been used only in kallsyms_lookup_buildid().
> It was supposed to set @modname and @modbuildid when the symbol was
> in a module.
>
> But it always just cleared @modname because BPF symbols were never in
> a module. And it did not clear @modbuildid because the pointer was
> not passed.
>
> The wrapper is not longer needed. Both @modname and @modbuildid

is no longer

> are newly always initialized to NULL in kallsyms_lookup_buildid().

are now?

> Remove the wrapper and rename __bpf_address_lookup() to
> bpf_address_lookup() because this variant is used everywhere.
>
> Fixes: 9294523e3768 ("module: add printk formats to add module build ID to stacktraces")
> Signed-off-by: Petr Mladek <pmladek@suse.com>

other than typos in the commit log it lgtm.

Acked-by: Alexei Starovoitov <ast@kernel.org>

^ permalink raw reply

* Re: [PATCH 2/2] sign-file: Remove support for signing with PKCS#7
From: James Bottomley @ 2025-11-12 15:58 UTC (permalink / raw)
  To: David Howells
  Cc: Petr Pavlu, David Woodhouse, Luis Chamberlain, Daniel Gomez,
	Sami Tolvanen, Aaron Tomlin, keyrings, linux-modules,
	linux-kernel
In-Reply-To: <1235767.1762962760@warthog.procyon.org.uk>

On Wed, 2025-11-12 at 15:52 +0000, David Howells wrote:
> James Bottomley <James.Bottomley@HansenPartnership.com> wrote:
> 
> > > We're looking at moving to ML-DSA, and the CMS support there is
> > > slightly dodgy at the moment, so we need to hold off a bit on
> > > this change.
> > 
> > How will removing PKCS7_sign, which can only do sha1 signatures
> > affect that? Is the dodginess that the PKCS7_... API is better than
> > CMS_... for PQS at the moment?  In which case we could pretty much
> > do a rip and replace of the CMS_ API if necessary, but that would
> > be a completely separate patch.
> 
> OpenSSL-3.5.1's ML-DSA support isn't completely right - in particular
> CMS_NOATTR is not currently supported.  I believe there is a fix in
> the works there, but I doubt it has made it to all the distributions
> yet.

I get that PQC in openssl-3.5 is highly experimental, but that merely
means we tell people not to use it for a while.  However, what I don't
see is how this impacts PKCS7_sign removal.  The CMS API can do a sha1
signature if that's what people want and keeping the PKCS7_sign API
won't prevent anyone with openssl-3.5 installed from trying a PQ
signature. 

>   I'm only asking that we hold off a cycle; that will probably
> suffice.

Right but why?  Is your thought that we'll have to change the CMS_ code
slightly and this might conflict?

Regards,

James


^ permalink raw reply

* Re: [PATCH 2/2] sign-file: Remove support for signing with PKCS#7
From: David Howells @ 2025-11-12 15:52 UTC (permalink / raw)
  To: James Bottomley
  Cc: dhowells, Petr Pavlu, David Woodhouse, Luis Chamberlain,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, keyrings,
	linux-modules, linux-kernel
In-Reply-To: <0b18e4cd726c6d986e969a78bff0aaaf6affd3a0.camel@HansenPartnership.com>

James Bottomley <James.Bottomley@HansenPartnership.com> wrote:

> > We're looking at moving to ML-DSA, and the CMS support there is
> > slightly dodgy at the moment, so we need to hold off a bit on this
> > change.
> 
> How will removing PKCS7_sign, which can only do sha1 signatures affect
> that? Is the dodginess that the PKCS7_... API is better than CMS_...
> for PQS at the moment?  In which case we could pretty much do a rip and
> replace of the CMS_ API if necessary, but that would be a completely
> separate patch.

OpenSSL-3.5.1's ML-DSA support isn't completely right - in particular
CMS_NOATTR is not currently supported.  I believe there is a fix in the works
there, but I doubt it has made it to all the distributions yet.  I'm only
asking that we hold off a cycle; that will probably suffice.

David


^ permalink raw reply

* Re: [PATCH 2/2] sign-file: Remove support for signing with PKCS#7
From: James Bottomley @ 2025-11-12 15:47 UTC (permalink / raw)
  To: David Howells, Petr Pavlu
  Cc: David Woodhouse, Luis Chamberlain, Daniel Gomez, Sami Tolvanen,
	Aaron Tomlin, keyrings, linux-modules, linux-kernel
In-Reply-To: <1234920.1762961817@warthog.procyon.org.uk>

On Wed, 2025-11-12 at 15:36 +0000, David Howells wrote:
> Petr Pavlu <petr.pavlu@suse.com> wrote:
> 
> > In practice, since distributions now typically sign modules with
> > SHA-2, for which sign-file already required CMS API support,
> > removing the USE_PKCS7 code shouldn't cause any issues.
> 
> We're looking at moving to ML-DSA, and the CMS support there is
> slightly dodgy at the moment, so we need to hold off a bit on this
> change.

How will removing PKCS7_sign, which can only do sha1 signatures affect
that? Is the dodginess that the PKCS7_... API is better than CMS_...
for PQS at the moment?  In which case we could pretty much do a rip and
replace of the CMS_ API if necessary, but that would be a completely
separate patch.

Regards,

James


^ permalink raw reply

* Re: [PATCH 2/2] sign-file: Remove support for signing with PKCS#7
From: David Howells @ 2025-11-12 15:36 UTC (permalink / raw)
  To: Petr Pavlu
  Cc: dhowells, James Bottomley, David Woodhouse, Luis Chamberlain,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, keyrings,
	linux-modules, linux-kernel
In-Reply-To: <e624c242-b297-4bb7-a76a-cbb18b027472@suse.com>

Petr Pavlu <petr.pavlu@suse.com> wrote:

> In practice, since distributions now typically sign modules with SHA-2, for
> which sign-file already required CMS API support, removing the USE_PKCS7
> code shouldn't cause any issues.

We're looking at moving to ML-DSA, and the CMS support there is slightly dodgy
at the moment, so we need to hold off a bit on this change.

Patch 1, removing the option to sign with SHA-1 from the kernel is fine, but
doesn't stop things that are signed with SHA-1 from being verified.

David


^ permalink raw reply

* Re: [PATCH 2/2] sign-file: Remove support for signing with PKCS#7
From: James Bottomley @ 2025-11-12 15:05 UTC (permalink / raw)
  To: Petr Pavlu
  Cc: David Howells, David Woodhouse, Luis Chamberlain, Daniel Gomez,
	Sami Tolvanen, Aaron Tomlin, keyrings, linux-modules,
	linux-kernel
In-Reply-To: <e624c242-b297-4bb7-a76a-cbb18b027472@suse.com>

On Wed, 2025-11-12 at 14:51 +0100, Petr Pavlu wrote:
> On 11/11/25 5:53 PM, James Bottomley wrote:
> > On Tue, 2025-11-11 at 16:48 +0100, Petr Pavlu wrote:
> > > The PKCS#7 code in sign-file allows for signing only with SHA-1.
> > > Since SHA-1 support for module signing has been removed, drop
> > > PKCS#7 support in favor of using only CMS.
> > 
> > The change log is a bit alarmist.  CMS really *is* PKCS7 and most
> > literature will refer to CMS as PKCS7.  What you're really
> > deprecating is the use of the PKCS7_sign() API which can only
> > produce SHA-1 Signatures ... openssl is fully capable of producing
> > any hash PKCS7 signatures using a different PKCS7_... API set but
> > the CMS_... API is newer.
> > 
> > The point being the module signature type is still set to
> > PKEY_ID_PKCS7 so it doesn't square with the commit log saying "drop
> > PKCS#7 support". What you really mean is only use the openssl
> > CMS_... API for producing PKCS7 signatures.
> 
> Ok, I plan to update the description to the following in v2:
> 
> sign-file: Use only the OpenSSL CMS API for signing
> 
> The USE_PKCS7 code in sign-file utilizes PKCS7_sign(), which allows
> signing only with SHA-1. Since SHA-1 support for module signing has
> been removed, drop the use of the OpenSSL PKCS7 API by the tool in
> favor of using only the newer CMS API.

Much better, thanks!

Regards,

James


^ permalink raw reply

* Re: [PATCH v7 2/8] crypto: Add ML-DSA/Dilithium verify support
From: David Howells @ 2025-11-12 14:55 UTC (permalink / raw)
  To: Eric Biggers
  Cc: dhowells, Herbert Xu, Luis Chamberlain, Petr Pavlu, Daniel Gomez,
	Sami Tolvanen, Jason A . Donenfeld, Ard Biesheuvel,
	Stephan Mueller, Lukas Wunner, Ignat Korchagin, linux-crypto,
	keyrings, linux-modules, linux-kernel
In-Reply-To: <20251106192016.GA3318@quark>

Eric Biggers <ebiggers@kernel.org> wrote:

> As I mentioned before
> (https://lore.kernel.org/linux-crypto/20250613170456.GA1284@sol/), this
> code should go in lib/crypto/.  There seems to be a clean API in
> crypto/ml_dsa/dilithium.h already.  Just make that the library API.

It's not that simple, as it turns out.  Various of the API structures are
dependent on the strength-specific #include magic stuff.
dilithium_{44,65,87}.h (or parts thereof) are used in the generation of those
structs.

Now, I can move all that stuff into one header file in include/crypto/, but
it's exposing a lot of the internals.

It also requires the caller to do some of the work in expanding the public key
and signature into those API structs, so it's probably better to wrap the
dilithium.h API to a simpler one with just init, update, fini and all-in-one
functions and have the crypto_sig interface call those (the helper functions
are pretty much the wrappers I need anyway).

David


^ permalink raw reply

* [PATCH v2 7/7] kallsyms: Prevent module removal when printing module name and buildid
From: Petr Mladek @ 2025-11-12 14:20 UTC (permalink / raw)
  To: Petr Pavlu, Steven Rostedt, Alexei Starovoitov, Andrew Morton,
	Kees Cook
  Cc: Aaron Tomlin, Daniel Borkmann, John Fastabend, Masami Hiramatsu,
	Mark Rutland, Luis Chamberlain, Daniel Gomez, Sami Tolvanen,
	linux-kernel, bpf, linux-modules, linux-trace-kernel, Petr Mladek
In-Reply-To: <20251112142003.182062-1-pmladek@suse.com>

kallsyms_lookup_buildid() copies the symbol name into the given buffer
so that it can be safely read anytime later. But it just copies pointers
to mod->name and mod->build_id which might get reused after the related
struct module gets removed.

The lifetime of struct module is synchronized using RCU. Take the rcu
read lock for the entire __sprint_symbol().

Reviewed-by: Aaron Tomlin <atomlin@atomlin.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
 kernel/kallsyms.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index 5bc1646f8639..202d39f5493a 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -471,6 +471,9 @@ static int __sprint_symbol(char *buffer, unsigned long address,
 	unsigned long offset, size;
 	int len;
 
+	/* Prevent module removal until modname and modbuildid are printed */
+	guard(rcu)();
+
 	address += symbol_offset;
 	len = kallsyms_lookup_buildid(address, &size, &offset, &modname, &buildid,
 				       buffer);
-- 
2.51.1


^ permalink raw reply related

* [PATCH v2 6/7] kallsyms/ftrace: Set module buildid in ftrace_mod_address_lookup()
From: Petr Mladek @ 2025-11-12 14:20 UTC (permalink / raw)
  To: Petr Pavlu, Steven Rostedt, Alexei Starovoitov, Andrew Morton,
	Kees Cook
  Cc: Aaron Tomlin, Daniel Borkmann, John Fastabend, Masami Hiramatsu,
	Mark Rutland, Luis Chamberlain, Daniel Gomez, Sami Tolvanen,
	linux-kernel, bpf, linux-modules, linux-trace-kernel, Petr Mladek
In-Reply-To: <20251112142003.182062-1-pmladek@suse.com>

__sprint_symbol() might access an invalid pointer when
kallsyms_lookup_buildid() returns a symbol found by
ftrace_mod_address_lookup().

The ftrace lookup function must set both @modname and @modbuildid
the same way as module_address_lookup().

Fixes: 9294523e3768 ("module: add printk formats to add module build ID to stacktraces")
Reviewed-by: Aaron Tomlin <atomlin@atomlin.com>
Acked-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
 include/linux/ftrace.h | 6 ++++--
 kernel/kallsyms.c      | 4 ++--
 kernel/trace/ftrace.c  | 5 ++++-
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index 7ded7df6e9b5..a003cf1b32d0 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -87,11 +87,13 @@ struct ftrace_hash;
 	defined(CONFIG_DYNAMIC_FTRACE)
 int
 ftrace_mod_address_lookup(unsigned long addr, unsigned long *size,
-		   unsigned long *off, char **modname, char *sym);
+			  unsigned long *off, char **modname,
+			  const unsigned char **modbuildid, char *sym);
 #else
 static inline int
 ftrace_mod_address_lookup(unsigned long addr, unsigned long *size,
-		   unsigned long *off, char **modname, char *sym)
+			  unsigned long *off, char **modname,
+			  const unsigned char **modbuildid, char *sym)
 {
 	return 0;
 }
diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index 97b92fc8871d..5bc1646f8639 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -386,8 +386,8 @@ static int kallsyms_lookup_buildid(unsigned long addr,
 		ret = bpf_address_lookup(addr, symbolsize, offset, namebuf);
 
 	if (!ret)
-		ret = ftrace_mod_address_lookup(addr, symbolsize,
-						offset, modname, namebuf);
+		ret = ftrace_mod_address_lookup(addr, symbolsize, offset,
+						modname, modbuildid, namebuf);
 
 	return ret;
 }
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 42bd2ba68a82..11f5096fb60c 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -7678,7 +7678,8 @@ ftrace_func_address_lookup(struct ftrace_mod_map *mod_map,
 
 int
 ftrace_mod_address_lookup(unsigned long addr, unsigned long *size,
-		   unsigned long *off, char **modname, char *sym)
+			  unsigned long *off, char **modname,
+			  const unsigned char **modbuildid, char *sym)
 {
 	struct ftrace_mod_map *mod_map;
 	int ret = 0;
@@ -7690,6 +7691,8 @@ ftrace_mod_address_lookup(unsigned long addr, unsigned long *size,
 		if (ret) {
 			if (modname)
 				*modname = mod_map->mod->name;
+			if (modbuildid)
+				*modbuildid = module_buildid(mod_map->mod);
 			break;
 		}
 	}
-- 
2.51.1


^ permalink raw reply related

* [PATCH v2 5/7] kallsyms/bpf: Rename __bpf_address_lookup() to bpf_address_lookup()
From: Petr Mladek @ 2025-11-12 14:20 UTC (permalink / raw)
  To: Petr Pavlu, Steven Rostedt, Alexei Starovoitov, Andrew Morton,
	Kees Cook
  Cc: Aaron Tomlin, Daniel Borkmann, John Fastabend, Masami Hiramatsu,
	Mark Rutland, Luis Chamberlain, Daniel Gomez, Sami Tolvanen,
	linux-kernel, bpf, linux-modules, linux-trace-kernel, Petr Mladek
In-Reply-To: <20251112142003.182062-1-pmladek@suse.com>

bpf_address_lookup() has been used only in kallsyms_lookup_buildid().
It was supposed to set @modname and @modbuildid when the symbol was
in a module.

But it always just cleared @modname because BPF symbols were never in
a module. And it did not clear @modbuildid because the pointer was
not passed.

The wrapper is not longer needed. Both @modname and @modbuildid
are newly always initialized to NULL in kallsyms_lookup_buildid().

Remove the wrapper and rename __bpf_address_lookup() to
bpf_address_lookup() because this variant is used everywhere.

Fixes: 9294523e3768 ("module: add printk formats to add module build ID to stacktraces")
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
 arch/arm64/net/bpf_jit_comp.c   |  2 +-
 arch/powerpc/net/bpf_jit_comp.c |  2 +-
 include/linux/filter.h          | 26 ++++----------------------
 kernel/bpf/core.c               |  4 ++--
 kernel/kallsyms.c               |  5 ++---
 5 files changed, 10 insertions(+), 29 deletions(-)

diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c
index 0c9a50a1e73e..17e6a041ea4d 100644
--- a/arch/arm64/net/bpf_jit_comp.c
+++ b/arch/arm64/net/bpf_jit_comp.c
@@ -2939,7 +2939,7 @@ int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type poke_type,
 	u64 plt_target = 0ULL;
 	bool poking_bpf_entry;
 
-	if (!__bpf_address_lookup((unsigned long)ip, &size, &offset, namebuf))
+	if (!bpf_address_lookup((unsigned long)ip, &size, &offset, namebuf))
 		/* Only poking bpf text is supported. Since kernel function
 		 * entry is set up by ftrace, we reply on ftrace to poke kernel
 		 * functions.
diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c
index 88ad5ba7b87f..21f7f26a5e2f 100644
--- a/arch/powerpc/net/bpf_jit_comp.c
+++ b/arch/powerpc/net/bpf_jit_comp.c
@@ -1122,7 +1122,7 @@ int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type poke_type,
 	branch_flags = poke_type == BPF_MOD_CALL ? BRANCH_SET_LINK : 0;
 
 	/* We currently only support poking bpf programs */
-	if (!__bpf_address_lookup(bpf_func, &size, &offset, name)) {
+	if (!bpf_address_lookup(bpf_func, &size, &offset, name)) {
 		pr_err("%s (0x%lx): kernel/modules are not supported\n", __func__, bpf_func);
 		return -EOPNOTSUPP;
 	}
diff --git a/include/linux/filter.h b/include/linux/filter.h
index f5c859b8131a..d500338af6e0 100644
--- a/include/linux/filter.h
+++ b/include/linux/filter.h
@@ -1353,24 +1353,13 @@ static inline bool bpf_jit_kallsyms_enabled(void)
 	return false;
 }
 
-int __bpf_address_lookup(unsigned long addr, unsigned long *size,
-				 unsigned long *off, char *sym);
+int bpf_address_lookup(unsigned long addr, unsigned long *size,
+		       unsigned long *off, char *sym);
 bool is_bpf_text_address(unsigned long addr);
 int bpf_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
 		    char *sym);
 struct bpf_prog *bpf_prog_ksym_find(unsigned long addr);
 
-static inline int
-bpf_address_lookup(unsigned long addr, unsigned long *size,
-		   unsigned long *off, char **modname, char *sym)
-{
-	int ret = __bpf_address_lookup(addr, size, off, sym);
-
-	if (ret && modname)
-		*modname = NULL;
-	return ret;
-}
-
 void bpf_prog_kallsyms_add(struct bpf_prog *fp);
 void bpf_prog_kallsyms_del(struct bpf_prog *fp);
 
@@ -1409,8 +1398,8 @@ static inline bool bpf_jit_kallsyms_enabled(void)
 }
 
 static inline int
-__bpf_address_lookup(unsigned long addr, unsigned long *size,
-		     unsigned long *off, char *sym)
+bpf_address_lookup(unsigned long addr, unsigned long *size,
+		   unsigned long *off, char *sym)
 {
 	return 0;
 }
@@ -1431,13 +1420,6 @@ static inline struct bpf_prog *bpf_prog_ksym_find(unsigned long addr)
 	return NULL;
 }
 
-static inline int
-bpf_address_lookup(unsigned long addr, unsigned long *size,
-		   unsigned long *off, char **modname, char *sym)
-{
-	return 0;
-}
-
 static inline void bpf_prog_kallsyms_add(struct bpf_prog *fp)
 {
 }
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index d595fe512498..c2278f392e93 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -713,8 +713,8 @@ static struct bpf_ksym *bpf_ksym_find(unsigned long addr)
 	return n ? container_of(n, struct bpf_ksym, tnode) : NULL;
 }
 
-int __bpf_address_lookup(unsigned long addr, unsigned long *size,
-				 unsigned long *off, char *sym)
+int bpf_address_lookup(unsigned long addr, unsigned long *size,
+		       unsigned long *off, char *sym)
 {
 	struct bpf_ksym *ksym;
 	int ret = 0;
diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index f25b122397ce..97b92fc8871d 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -342,7 +342,7 @@ int kallsyms_lookup_size_offset(unsigned long addr, unsigned long *symbolsize,
 		return 1;
 	}
 	return !!module_address_lookup(addr, symbolsize, offset, NULL, NULL, namebuf) ||
-	       !!__bpf_address_lookup(addr, symbolsize, offset, namebuf);
+	       !!bpf_address_lookup(addr, symbolsize, offset, namebuf);
 }
 
 static int kallsyms_lookup_buildid(unsigned long addr,
@@ -383,8 +383,7 @@ static int kallsyms_lookup_buildid(unsigned long addr,
 	ret = module_address_lookup(addr, symbolsize, offset,
 				    modname, modbuildid, namebuf);
 	if (!ret)
-		ret = bpf_address_lookup(addr, symbolsize,
-					 offset, modname, namebuf);
+		ret = bpf_address_lookup(addr, symbolsize, offset, namebuf);
 
 	if (!ret)
 		ret = ftrace_mod_address_lookup(addr, symbolsize,
-- 
2.51.1


^ permalink raw reply related

* [PATCH v2 4/7] kallsyms: Cleanup code for appending the module buildid
From: Petr Mladek @ 2025-11-12 14:20 UTC (permalink / raw)
  To: Petr Pavlu, Steven Rostedt, Alexei Starovoitov, Andrew Morton,
	Kees Cook
  Cc: Aaron Tomlin, Daniel Borkmann, John Fastabend, Masami Hiramatsu,
	Mark Rutland, Luis Chamberlain, Daniel Gomez, Sami Tolvanen,
	linux-kernel, bpf, linux-modules, linux-trace-kernel, Petr Mladek
In-Reply-To: <20251112142003.182062-1-pmladek@suse.com>

Put the code for appending the optional "buildid" into a helper
function, It makes __sprint_symbol() better readable.

Also print a warning when the "modname" is set and the "buildid" isn't.
It might catch a situation when some lookup function in
kallsyms_lookup_buildid() does not handle the "buildid".

Use pr_*_once() to avoid an infinite recursion when the function
is called from printk(). The recursion is rather theoretical but
better be on the safe side.

Signed-off-by: Petr Mladek <pmladek@suse.com>
---
 kernel/kallsyms.c | 42 +++++++++++++++++++++++++++++++++---------
 1 file changed, 33 insertions(+), 9 deletions(-)

diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index ffb64eaa0505..f25b122397ce 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -432,6 +432,37 @@ int lookup_symbol_name(unsigned long addr, char *symname)
 	return lookup_module_symbol_name(addr, symname);
 }
 
+#ifdef CONFIG_STACKTRACE_BUILD_ID
+
+static int append_buildid(char *buffer,  const char *modname,
+			  const unsigned char *buildid)
+{
+	if (!modname)
+		return 0;
+
+	if (!buildid) {
+		pr_warn_once("Undefined buildid for the module %s\n", modname);
+		return 0;
+	}
+
+	/* build ID should match length of sprintf */
+#ifdef CONFIG_MODULES
+	static_assert(sizeof(typeof_member(struct module, build_id)) == 20);
+#endif
+
+	return sprintf(buffer, " %20phN", buildid);
+}
+
+#else /* CONFIG_STACKTRACE_BUILD_ID */
+
+static int append_buildid(char *buffer,   const char *modname,
+			  const unsigned char *buildid)
+{
+	return 0;
+}
+
+#endif /* CONFIG_STACKTRACE_BUILD_ID */
+
 /* Look up a kernel symbol and return it in a text buffer. */
 static int __sprint_symbol(char *buffer, unsigned long address,
 			   int symbol_offset, int add_offset, int add_buildid)
@@ -454,15 +485,8 @@ static int __sprint_symbol(char *buffer, unsigned long address,
 
 	if (modname) {
 		len += sprintf(buffer + len, " [%s", modname);
-#if IS_ENABLED(CONFIG_STACKTRACE_BUILD_ID)
-		if (add_buildid && buildid) {
-			/* build ID should match length of sprintf */
-#if IS_ENABLED(CONFIG_MODULES)
-			static_assert(sizeof(typeof_member(struct module, build_id)) == 20);
-#endif
-			len += sprintf(buffer + len, " %20phN", buildid);
-		}
-#endif
+		if (add_buildid)
+			len += append_buildid(buffer + len, modname, buildid);
 		len += sprintf(buffer + len, "]");
 	}
 
-- 
2.51.1


^ permalink raw reply related

* [PATCH v2 3/7] module: Add helper function for reading module_buildid()
From: Petr Mladek @ 2025-11-12 14:19 UTC (permalink / raw)
  To: Petr Pavlu, Steven Rostedt, Alexei Starovoitov, Andrew Morton,
	Kees Cook
  Cc: Aaron Tomlin, Daniel Borkmann, John Fastabend, Masami Hiramatsu,
	Mark Rutland, Luis Chamberlain, Daniel Gomez, Sami Tolvanen,
	linux-kernel, bpf, linux-modules, linux-trace-kernel, Petr Mladek,
	Daniel Gomez
In-Reply-To: <20251112142003.182062-1-pmladek@suse.com>

Add a helper function for reading the optional "build_id" member
of struct module. It is going to be used also in
ftrace_mod_address_lookup().

Use "#ifdef" instead of "#if IS_ENABLED()" to match the declaration
of the optional field in struct module.

Reviewed-by: Daniel Gomez <da.gomez@samsung.com>
Reviewed-by: Petr Pavlu <petr.pavlu@suse.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
 include/linux/module.h   | 9 +++++++++
 kernel/module/kallsyms.c | 9 ++-------
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/include/linux/module.h b/include/linux/module.h
index e135cc79acee..4decae2b1675 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -747,6 +747,15 @@ static inline void __module_get(struct module *module)
 	__mod ? __mod->name : "kernel";		\
 })
 
+static inline const unsigned char *module_buildid(struct module *mod)
+{
+#ifdef CONFIG_STACKTRACE_BUILD_ID
+	return mod->build_id;
+#else
+	return NULL;
+#endif
+}
+
 /* Dereference module function descriptor */
 void *dereference_module_function_descriptor(struct module *mod, void *ptr);
 
diff --git a/kernel/module/kallsyms.c b/kernel/module/kallsyms.c
index 00a60796327c..0fc11e45df9b 100644
--- a/kernel/module/kallsyms.c
+++ b/kernel/module/kallsyms.c
@@ -334,13 +334,8 @@ int module_address_lookup(unsigned long addr,
 	if (mod) {
 		if (modname)
 			*modname = mod->name;
-		if (modbuildid) {
-#if IS_ENABLED(CONFIG_STACKTRACE_BUILD_ID)
-			*modbuildid = mod->build_id;
-#else
-			*modbuildid = NULL;
-#endif
-		}
+		if (modbuildid)
+			*modbuildid = module_buildid(mod);
 
 		sym = find_kallsyms_symbol(mod, addr, size, offset);
 
-- 
2.51.1


^ permalink raw reply related

* [PATCH v2 2/7] kallsyms: Clean up modname and modbuildid initialization in kallsyms_lookup_buildid()
From: Petr Mladek @ 2025-11-12 14:19 UTC (permalink / raw)
  To: Petr Pavlu, Steven Rostedt, Alexei Starovoitov, Andrew Morton,
	Kees Cook
  Cc: Aaron Tomlin, Daniel Borkmann, John Fastabend, Masami Hiramatsu,
	Mark Rutland, Luis Chamberlain, Daniel Gomez, Sami Tolvanen,
	linux-kernel, bpf, linux-modules, linux-trace-kernel, Petr Mladek
In-Reply-To: <20251112142003.182062-1-pmladek@suse.com>

The @modname and @modbuildid optional return parameters are set only
when the symbol is in a module.

Always initialize them so that they do not need to be cleared when
the module is not in a module. It simplifies the logic and makes
the code even slightly more safe.

Note that bpf_address_lookup() function will get updated in a separate
patch.

Signed-off-by: Petr Mladek <pmladek@suse.com>
---
 kernel/kallsyms.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index e08c1e57fc0d..ffb64eaa0505 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -359,6 +359,14 @@ static int kallsyms_lookup_buildid(unsigned long addr,
 	 * or empty string.
 	 */
 	namebuf[0] = 0;
+	/*
+	 * Initialize the module-related return values. They are not set
+	 * when the symbol is in vmlinux or it is a bpf address.
+	 */
+	if (modname)
+		*modname = NULL;
+	if (modbuildid)
+		*modbuildid = NULL;
 
 	if (is_ksym_addr(addr)) {
 		unsigned long pos;
@@ -367,10 +375,6 @@ static int kallsyms_lookup_buildid(unsigned long addr,
 		/* Grab name */
 		kallsyms_expand_symbol(get_symbol_offset(pos),
 				       namebuf, KSYM_NAME_LEN);
-		if (modname)
-			*modname = NULL;
-		if (modbuildid)
-			*modbuildid = NULL;
 
 		return strlen(namebuf);
 	}
-- 
2.51.1


^ permalink raw reply related

* [PATCH v2 1/7] kallsyms: Clean up @namebuf initialization in kallsyms_lookup_buildid()
From: Petr Mladek @ 2025-11-12 14:19 UTC (permalink / raw)
  To: Petr Pavlu, Steven Rostedt, Alexei Starovoitov, Andrew Morton,
	Kees Cook
  Cc: Aaron Tomlin, Daniel Borkmann, John Fastabend, Masami Hiramatsu,
	Mark Rutland, Luis Chamberlain, Daniel Gomez, Sami Tolvanen,
	linux-kernel, bpf, linux-modules, linux-trace-kernel, Petr Mladek
In-Reply-To: <20251112142003.182062-1-pmladek@suse.com>

The function kallsyms_lookup_buildid() initializes the given @namebuf
by clearing the first and the last byte. It is not clear why.

The 1st byte makes sense because some callers ignore the return code
and expect that the buffer contains a valid string, for example:

  - function_stat_show()
    - kallsyms_lookup()
      - kallsyms_lookup_buildid()

The initialization of the last byte does not make much sense because it
can later be overwritten. Fortunately, it seems that all called
functions behave correctly:

  -  kallsyms_expand_symbol() explicitly adds the trailing '\0'
     at the end of the function.

  - All *__address_lookup() functions either use the safe strscpy()
    or they do not touch the buffer at all.

Document the reason for clearing the first byte. And remove the useless
initialization of the last byte.

Reviewed-by: Aaron Tomlin <atomlin@atomlin.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
 kernel/kallsyms.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index 1e7635864124..e08c1e57fc0d 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -352,7 +352,12 @@ static int kallsyms_lookup_buildid(unsigned long addr,
 {
 	int ret;
 
-	namebuf[KSYM_NAME_LEN - 1] = 0;
+	/*
+	 * kallsyms_lookus() returns pointer to namebuf on success and
+	 * NULL on error. But some callers ignore the return value.
+	 * Instead they expect @namebuf filled either with valid
+	 * or empty string.
+	 */
 	namebuf[0] = 0;
 
 	if (is_ksym_addr(addr)) {
-- 
2.51.1


^ permalink raw reply related

* [PATCH v2 0/7] kallsyms: Prevent invalid access when showing module buildid
From: Petr Mladek @ 2025-11-12 14:19 UTC (permalink / raw)
  To: Petr Pavlu, Steven Rostedt, Alexei Starovoitov, Andrew Morton,
	Kees Cook
  Cc: Aaron Tomlin, Daniel Borkmann, John Fastabend, Masami Hiramatsu,
	Mark Rutland, Luis Chamberlain, Daniel Gomez, Sami Tolvanen,
	linux-kernel, bpf, linux-modules, linux-trace-kernel, Petr Mladek

This patchset is cleaning up kallsyms code related to module buildid.
It is fixing an invalid access when printing backtraces, see [v1] for
more details:

  + 1st..4th patches are preparatory.

  + 5th and 6th patches are fixing bpf and ftrace related APIs.

  + 7th patch prevents a potential race.


Changes against [v1]:

  + Added existing Reviewed-by tags.

  + Shuffled patches to update the kallsyms_lookup_buildid() initialization
    code 1st.

  + Initialized also *modname and *modbuildid in kallsyms_lookup_buildid().

  + Renamed __bpf_address_lookup() to bpf_address_lookup() and used it
    in kallsyms_lookup_buildid(). Did this instead of passing @modbuildid
    parameter just to clear it.


[v1] https://lore.kernel.org/r/20251105142319.1139183-1-pmladek@suse.com


Petr Mladek (7):
  kallsyms: Clean up @namebuf initialization in
    kallsyms_lookup_buildid()
  kallsyms: Clean up modname and modbuildid initialization in
    kallsyms_lookup_buildid()
  module: Add helper function for reading module_buildid()
  kallsyms: Cleanup code for appending the module buildid
  kallsyms/bpf: Rename __bpf_address_lookup() to bpf_address_lookup()
  kallsyms/ftrace: Set module buildid in ftrace_mod_address_lookup()
  kallsyms: Prevent module removal when printing module name and buildid

 arch/arm64/net/bpf_jit_comp.c   |  2 +-
 arch/powerpc/net/bpf_jit_comp.c |  2 +-
 include/linux/filter.h          | 26 ++----------
 include/linux/ftrace.h          |  6 ++-
 include/linux/module.h          |  9 ++++
 kernel/bpf/core.c               |  4 +-
 kernel/kallsyms.c               | 73 ++++++++++++++++++++++++---------
 kernel/module/kallsyms.c        |  9 +---
 kernel/trace/ftrace.c           |  5 ++-
 9 files changed, 81 insertions(+), 55 deletions(-)

-- 
2.51.1


^ permalink raw reply

* Re: [PATCH 2/2] sign-file: Remove support for signing with PKCS#7
From: Petr Pavlu @ 2025-11-12 13:51 UTC (permalink / raw)
  To: James Bottomley
  Cc: David Howells, David Woodhouse, Luis Chamberlain, Daniel Gomez,
	Sami Tolvanen, Aaron Tomlin, keyrings, linux-modules,
	linux-kernel
In-Reply-To: <922480ff44bda3b6ecfda1ae780c659644560f94.camel@HansenPartnership.com>

On 11/11/25 5:53 PM, James Bottomley wrote:
> On Tue, 2025-11-11 at 16:48 +0100, Petr Pavlu wrote:
>> The PKCS#7 code in sign-file allows for signing only with SHA-1.
>> Since SHA-1 support for module signing has been removed, drop PKCS#7
>> support in favor of using only CMS.
> 
> The change log is a bit alarmist.  CMS really *is* PKCS7 and most
> literature will refer to CMS as PKCS7.  What you're really deprecating
> is the use of the PKCS7_sign() API which can only produce SHA-1
> Signatures ... openssl is fully capable of producing any hash PKCS7
> signatures using a different PKCS7_... API set but the CMS_... API is
> newer.
> 
> The point being the module signature type is still set to PKEY_ID_PKCS7
> so it doesn't square with the commit log saying "drop PKCS#7 support".
> What you really mean is only use the openssl CMS_... API for producing
> PKCS7 signatures.

Ok, I plan to update the description to the following in v2:

sign-file: Use only the OpenSSL CMS API for signing

The USE_PKCS7 code in sign-file utilizes PKCS7_sign(), which allows signing
only with SHA-1. Since SHA-1 support for module signing has been removed,
drop the use of the OpenSSL PKCS7 API by the tool in favor of using only
the newer CMS API.

The use of the PKCS7 API is selected by the following:

 #if defined(LIBRESSL_VERSION_NUMBER) || \
 	OPENSSL_VERSION_NUMBER < 0x10000000L || \
 	defined(OPENSSL_NO_CMS)
 #define USE_PKCS7
 #endif

Looking at the individual ifdefs:

* LIBRESSL_VERSION_NUMBER: LibreSSL added the CMS API implementation from
  OpenSSL in 3.1.0, making the ifdef no longer relevant. This version was
  released on April 8, 2020.

* OPENSSL_VERSION_NUMBER < 0x10000000L: OpenSSL 1.0.0 was released on March
  29, 2010. Supporting earlier versions should no longer be necessary. The
  file Documentation/process/changes.rst already states that at least
  version 1.0.0 is required to build the kernel.

* OPENSSL_NO_CMS: OpenSSL can be configured with "no-cms" to disable CMS
  support. In this case, sign-file will no longer be usable. The CMS API
  support is now required.

In practice, since distributions now typically sign modules with SHA-2, for
which sign-file already required CMS API support, removing the USE_PKCS7
code shouldn't cause any issues.

-- 
Thanks,
Petr

^ permalink raw reply

* Re: [PATCH 1/2] module: Remove SHA-1 support for module signing
From: Aaron Tomlin @ 2025-11-11 22:37 UTC (permalink / raw)
  To: Petr Pavlu
  Cc: David Howells, David Woodhouse, Luis Chamberlain, Daniel Gomez,
	Sami Tolvanen, keyrings, linux-modules, linux-kernel
In-Reply-To: <20251111154923.978181-2-petr.pavlu@suse.com>

On Tue, Nov 11, 2025 at 04:48:31PM +0100, Petr Pavlu wrote:
> SHA-1 is considered deprecated and insecure due to vulnerabilities that can
> lead to hash collisions. Most distributions have already been using SHA-2
> for module signing because of this. The default was also changed last year
> from SHA-1 to SHA-512 in commit f3b93547b91a ("module: sign with sha512
> instead of sha1 by default"). This was not reported to cause any issues.
> Therefore, it now seems to be a good time to remove SHA-1 support for
> module signing.
> 
> Commit 16ab7cb5825f ("crypto: pkcs7 - remove sha1 support") previously
> removed support for reading PKCS#7/CMS signed with SHA-1, along with the
> ability to use SHA-1 for module signing. This change broke iwd and was
> subsequently completely reverted in commit 203a6763ab69 ("Revert "crypto:
> pkcs7 - remove sha1 support""). However, dropping only the support for
> using SHA-1 for module signing is unrelated and can still be done
> separately.
> 
> Note that this change only removes support for new modules to be SHA-1
> signed, but already signed modules can still be loaded.
> 
> Signed-off-by: Petr Pavlu <petr.pavlu@suse.com>
> ---
>  kernel/module/Kconfig | 5 -----
>  1 file changed, 5 deletions(-)
> 
> diff --git a/kernel/module/Kconfig b/kernel/module/Kconfig
> index 2a1beebf1d37..be74917802ad 100644
> --- a/kernel/module/Kconfig
> +++ b/kernel/module/Kconfig
> @@ -299,10 +299,6 @@ choice
>  	  possible to load a signed module containing the algorithm to check
>  	  the signature on that module.
>  
> -config MODULE_SIG_SHA1
> -	bool "SHA-1"
> -	select CRYPTO_SHA1
> -
>  config MODULE_SIG_SHA256
>  	bool "SHA-256"
>  	select CRYPTO_SHA256
> @@ -332,7 +328,6 @@ endchoice
>  config MODULE_SIG_HASH
>  	string
>  	depends on MODULE_SIG || IMA_APPRAISE_MODSIG
> -	default "sha1" if MODULE_SIG_SHA1
>  	default "sha256" if MODULE_SIG_SHA256
>  	default "sha384" if MODULE_SIG_SHA384
>  	default "sha512" if MODULE_SIG_SHA512
> -- 
> 2.51.1
> 

Agreed.

Reviewed-by: Aaron Tomlin <atomlin@atomlin.com>

-- 
Aaron Tomlin

^ permalink raw reply

* Re: Only rust/bindings.o build fail on rust-1.91.0
From: Sami Tolvanen @ 2025-11-11 21:52 UTC (permalink / raw)
  To: Miguel Ojeda
  Cc: Haiyue Wang, rust-for-linux, Miguel Ojeda, linux-modules,
	Linux Kbuild mailing list
In-Reply-To: <CANiq72n09yx9ZjOtOb3-3rPfpPLKaJZ2fs_Bmpbz28Y8U05snA@mail.gmail.com>

Hi Miguel,

On Tue, Nov 11, 2025 at 1:41 PM Miguel Ojeda
<miguel.ojeda.sandonis@gmail.com> wrote:
>
> On Sat, Nov 8, 2025 at 6:08 AM Miguel Ojeda
> <miguel.ojeda.sandonis@gmail.com> wrote:
> >
> > Exactly, that is what I was suggesting in the other thread about
> > editing the `cmd` command or directly teaching `genkallksyms` to
> > auto-skip, but I didn't know if there was a reason you didn't do that
> > originally instead of having (some of) the `skip_*` lines in the
> > `Makefile`.
> >
> > If not, then I assume we could already remove some of those lines,
> > e.g. the one for `ffi.o` (no need to do it on the fix, of course,
> > better to keep it minimal, but just to confirm there is no hidden
> > reason there).
>
> For (cross-)reference: I sent "v2" of the fix, essentially taking your
> patch and my commit log and putting them together -- please let me
> know if this is with you!
>
>     https://lore.kernel.org/rust-for-linux/20251110131913.1789896-1-ojeda@kernel.org/

Yes, that looks good to me. Thanks for picking this up!

Sami

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox