DPDK-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH] common/mlx5: add ConnectX-10 NVLink-C2C device ID
From: Raslan Darawsheh @ 2026-06-24  9:35 UTC (permalink / raw)
  To: dev
  Cc: Dariusz Sosnowski, Viacheslav Ovsiienko, Bing Zhao, Ori Kam,
	Suanming Mou, Matan Azrad
In-Reply-To: <20260622080149.11394-1-rasland@nvidia.com>

Hi,


On 22/06/2026 11:01 AM, Raslan Darawsheh wrote:
> This adds the ConnectX-10 NVLink-C2C device ID to the list of
> NVIDIA devices that run the mlx5 drivers.
> The device is still in development stage.
> 
> Signed-off-by: Raslan Darawsheh <rasland@nvidia.com>

Patch applied to next-net-mlx,

Kindest regards
Raslan Darawsheh


^ permalink raw reply

* Re: [PATCH] net/mlx5: fix double free in vectorized Rx recovery
From: Raslan Darawsheh @ 2026-06-24  9:35 UTC (permalink / raw)
  To: Borys Tsyrulnikov, Thomas Monjalon, Dariusz Sosnowski,
	Viacheslav Ovsiienko, Bing Zhao, Ori Kam, Suanming Mou,
	Matan Azrad, Alexander Kozyrev
  Cc: dev, stable
In-Reply-To: <20260617134301.798213-1-tsyrulnikov.borys@gmail.com>

Hi,


On 17/06/2026 4:43 PM, Borys Tsyrulnikov wrote:
> During Rx queue error recovery, the vectorized path in
> mlx5_rx_err_handle() reallocates an mbuf for every queue element. When
> rte_mbuf_raw_alloc() fails (for example, the mempool is exhausted), the
> rollback loop frees the mbufs allocated so far, but masks the element
> ring index with "& elts_n" instead of "& (elts_n - 1)".
> 
> elts_n is a power-of-two element count, so "x & elts_n" isolates a
> single bit and can only evaluate to 0 or elts_n, regardless of the loop
> counter. The rollback therefore never frees the mbufs just allocated in
> this pass (they are leaked); instead it repeatedly frees elts[0], a live
> mbuf still posted to the NIC (use-after-free / double free), and
> elts[elts_n], the fake_mbuf padding entry used by the vector datapath.
> 
> Mask with the existing e_mask (elts_n - 1), as already done in the
> matching forward allocation loop just above.
> 
> Fixes: 0f20acbf5eda ("net/mlx5: implement vectorized MPRQ burst")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Borys Tsyrulnikov <tsyrulnikov.borys@gmail.com>

Patch applied to next-net-mlx,

Kindest regards
Raslan Darawsheh


^ permalink raw reply

* Re: [PATCH] examples: use strlcpy and strlcat
From: Radu Nicolau @ 2026-06-24  9:21 UTC (permalink / raw)
  To: Bruce Richardson, dev
  Cc: stable, Cristian Dumitrescu, Akhil Goyal, Fan Zhang,
	Anatoly Burakov, Sivaprasad Tummala, Jasvinder Singh,
	Sergio Gonzalez Monroy, Ferruh Yigit, Pablo de Lara,
	Declan Doherty, Alan Carew
In-Reply-To: <20260623154109.722441-1-bruce.richardson@intel.com>


On 23-Jun-26 4:41 PM, Bruce Richardson wrote:
> Replace strncpy and other unbounded string functions, e.g. strcpy,
> strcat, with the safer alternatives strlcpy and strlcat, so that we can
> guarantee null termination of strings.
>
> Fixes: 4bbf8e30aa5e ("examples/ip_pipeline: add CLI interface")
> Fixes: 5f657a7fbe86 ("examples/pipeline: add message passing mechanism")
> Fixes: 83f58a7b7b0a ("examples/pipeline: add commands for direct registers")
> Fixes: 0d547ed03717 ("examples/ipsec-secgw: support configuration file")
> Fixes: 63e8c07c7245 ("examples/ipsec-secgw: fix configuration parsing")
> Fixes: 41e97c2ea9e6 ("examples/l2fwd-crypto: extend crypto information")
> Fixes: e8ae9b662506 ("examples/vm_power: channel manager and monitor in host")
> Cc: stable@dpdk.org
>
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> ---

Acked-by: Radu Nicolau <radu.nicolau@intel.com>



^ permalink raw reply

* RE: [PATCH v4 4/7] bpf/arm64: fix offset type to allow a negative jump
From: Marat Khalili @ 2026-06-24  8:43 UTC (permalink / raw)
  To: Stephen Hemminger, dev@dpdk.org
  Cc: Christophe Fontaine, stable@dpdk.org, Wathsala Vithanage,
	Konstantin Ananyev, Jerin Jacob
In-Reply-To: <20260623232522.257208-5-stephen@networkplumber.org>

> -----Original Message-----
> From: Stephen Hemminger <stephen@networkplumber.org>
> Sent: Wednesday 24 June 2026 00:23
> To: dev@dpdk.org
> Cc: Christophe Fontaine <cfontain@redhat.com>; stable@dpdk.org; Stephen Hemminger
> <stephen@networkplumber.org>; Wathsala Vithanage <wathsala.vithanage@arm.com>; Konstantin Ananyev
> <konstantin.ananyev@huawei.com>; Marat Khalili <marat.khalili@huawei.com>; Jerin Jacob
> <jerinj@marvell.com>
> Subject: [PATCH v4 4/7] bpf/arm64: fix offset type to allow a negative jump
> 
> From: Christophe Fontaine <cfontain@redhat.com>
> 
> The DPDK BPF JIT standalone test test_ld_mbuf1 fails on arm64.
> It does:
> 	r6 = r1                    // mbuf
> 	r0 = *(u8 *)pkt[0]         // BPF_ABS
> 	if ((r0 & 0xf0) == 0x40)
> 		goto parse
> 	r0 = 0
> 	exit                       // epilogue E0
> parse:
> 	r0 = *(u8 *)pkt[r0 + 3]    // BPF_IND
> 	...
> 	exit
> 
> emit_return_zero_if_src_zero() returns 0 by branching to a function
> epilogue. The target maybe a previous epilogue so branch
> might be backwards; therefore the offset needs to be negative.
> 
> The offset was stored in a uint16_t, so a negative value wrapped to a
> large positive number; emit_b() then branched past the end of the
> program and faulted at run time.
> 
> Fixes: 111e2a747a4f ("bpf/arm: add basic arithmetic operations")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Christophe Fontaine <cfontain@redhat.com>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
>  lib/bpf/bpf_jit_arm64.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/bpf/bpf_jit_arm64.c b/lib/bpf/bpf_jit_arm64.c
> index ba7ae4d680..776d7c8e97 100644
> --- a/lib/bpf/bpf_jit_arm64.c
> +++ b/lib/bpf/bpf_jit_arm64.c
> @@ -957,10 +957,12 @@ static void
>  emit_return_zero_if_src_zero(struct a64_jit_ctx *ctx, bool is64, uint8_t src)
>  {
>  	uint8_t r0 = ebpf_to_a64_reg(ctx, EBPF_REG_0);
> -	uint16_t jump_to_epilogue;
> +	int32_t jump_to_epilogue;
> 
>  	emit_cbnz(ctx, is64, src, 3);
>  	emit_mov_imm(ctx, is64, r0, 0);
> +
> +	/* maybe backwards branch to earlier epilogue */
>  	jump_to_epilogue = (ctx->program_start + ctx->program_sz) - ctx->idx;
>  	emit_b(ctx, jump_to_epilogue);
>  }
> --
> 2.53.0

Acked-by: Marat Khalili <marat.khalili@huawei.com>

^ permalink raw reply

* RE: [PATCH v4 7/7] test/bpf: check that bpf_convert can be JIT'd
From: Marat Khalili @ 2026-06-24  8:39 UTC (permalink / raw)
  To: Stephen Hemminger, dev@dpdk.org; +Cc: Konstantin Ananyev
In-Reply-To: <20260623232522.257208-8-stephen@networkplumber.org>

> -----Original Message-----
> From: Stephen Hemminger <stephen@networkplumber.org>
> Sent: Wednesday 24 June 2026 00:23
> To: dev@dpdk.org
> Cc: Stephen Hemminger <stephen@networkplumber.org>; Konstantin Ananyev <konstantin.ananyev@huawei.com>;
> Marat Khalili <marat.khalili@huawei.com>
> Subject: [PATCH v4 7/7] test/bpf: check that bpf_convert can be JIT'd
> 
> Run each converted filter through both the interpreter and the JIT and
> check they agree, catching JIT miscompiles.
> 
> test_bpf_filter and test_bpf_match did nearly the same thing: compile,
> load and run a filter against the dummy packet. Combine them into
> test_bpf_match, which now builds the packet itself and returns whether
> the filter matched. Callers run it for both load methods.
> 
> The dummy packet is a UDP packet to a fixed destination MAC, source
> and destination ports, so the filter results are deterministic. None
> of the sample filters should match it, so assert that; a convert or
> JIT bug that flips a result is then caught. The destination MAC and
> source port are chosen so the negative ethernet and port filters do
> not match, and "port not 53 and not arp" is dropped as it matches
> any non-ARP packet that lacks port 53.
> 
> Reduce log output to make it easier to match which expression might be
> causing issues.
> 
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>

Acked-by: Marat Khalili <marat.khalili@huawei.com>


^ permalink raw reply

* [PATCH v3 2/2] app/crypto-perf: support ML DSA
From: Pratik Senapati @ 2026-06-24  7:02 UTC (permalink / raw)
  To: dev; +Cc: gakhil, kai.ji
In-Reply-To: <20260624070250.1509369-1-psenapati@marvell.com>

Add ML-DSA44 support to test-crypto-perf.

Signed-off-by: Pratik Senapati <psenapati@marvell.com>
---
 app/test-crypto-perf/cperf_ops.c             |   70 +
 app/test-crypto-perf/cperf_options.h         |    2 +
 app/test-crypto-perf/cperf_options_parsing.c |   20 +-
 app/test-crypto-perf/cperf_test_common.c     |    3 +-
 app/test-crypto-perf/cperf_test_vectors.c    | 1661 ++++++++++++++++++
 app/test-crypto-perf/cperf_test_vectors.h    |   37 +
 app/test-crypto-perf/main.c                  |   17 +
 doc/guides/tools/cryptoperf.rst              |    1 +
 8 files changed, 1809 insertions(+), 2 deletions(-)

diff --git a/app/test-crypto-perf/cperf_ops.c b/app/test-crypto-perf/cperf_ops.c
index c30ffc3476..873fa3b59f 100644
--- a/app/test-crypto-perf/cperf_ops.c
+++ b/app/test-crypto-perf/cperf_ops.c
@@ -251,6 +251,58 @@ cperf_set_ops_asym_mlkem(struct rte_crypto_op **ops,
 	}
 }
 
+static void
+cperf_set_ops_asym_mldsa(struct rte_crypto_op **ops,
+		uint32_t src_buf_offset __rte_unused,
+		uint32_t dst_buf_offset __rte_unused, uint16_t nb_ops,
+		void *sess,
+		const struct cperf_options *options,
+		const struct cperf_test_vector *test_vector __rte_unused,
+		uint16_t iv_offset __rte_unused,
+		uint32_t *imix_idx __rte_unused,
+		uint64_t *tsc_start __rte_unused)
+{
+	uint16_t i;
+
+	for (i = 0; i < nb_ops; i++) {
+		struct rte_crypto_asym_op *asym_op = ops[i]->asym;
+
+		ops[i]->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
+		rte_crypto_op_attach_asym_session(ops[i], sess);
+
+		if (options->asym_op_type == RTE_CRYPTO_ASYM_OP_SIGN) {
+			asym_op->mldsa.op = RTE_CRYPTO_ML_DSA_OP_SIGN;
+			asym_op->mldsa.siggen.privkey.data = options->mldsa_data->privkey.data;
+			asym_op->mldsa.siggen.privkey.length = options->mldsa_data->privkey.length;
+			asym_op->mldsa.siggen.message.data = options->mldsa_data->message.data;
+			asym_op->mldsa.siggen.message.length = options->mldsa_data->message.length;
+			asym_op->mldsa.siggen.sign.data = options->mldsa_data->sign.data;
+			asym_op->mldsa.siggen.sign.length = options->mldsa_data->sign.length;
+			asym_op->mldsa.siggen.ctx.data = options->mldsa_data->ctx.data;
+			asym_op->mldsa.siggen.ctx.length = options->mldsa_data->ctx.length;
+			asym_op->mldsa.siggen.seed.data = options->mldsa_data->seed.data;
+			asym_op->mldsa.siggen.seed.length = options->mldsa_data->seed.length;
+			asym_op->mldsa.siggen.mu.data = options->mldsa_data->mu.data;
+			asym_op->mldsa.siggen.mu.length = options->mldsa_data->mu.length;
+			asym_op->mldsa.siggen.hash = options->mldsa_data->hash;
+		} else if (options->asym_op_type == RTE_CRYPTO_ASYM_OP_VERIFY) {
+			asym_op->mldsa.op = RTE_CRYPTO_ML_DSA_OP_VERIFY;
+			asym_op->mldsa.sigver.pubkey.data = options->mldsa_data->pubkey.data;
+			asym_op->mldsa.sigver.pubkey.length = options->mldsa_data->pubkey.length;
+			asym_op->mldsa.sigver.message.data = options->mldsa_data->message.data;
+			asym_op->mldsa.sigver.message.length = options->mldsa_data->message.length;
+			asym_op->mldsa.sigver.sign.data = options->mldsa_data->sign.data;
+			asym_op->mldsa.sigver.sign.length = options->mldsa_data->sign.length;
+			asym_op->mldsa.sigver.ctx.data = options->mldsa_data->ctx.data;
+			asym_op->mldsa.sigver.ctx.length = options->mldsa_data->ctx.length;
+			asym_op->mldsa.sigver.mu.data = options->mldsa_data->mu.data;
+			asym_op->mldsa.sigver.mu.length = options->mldsa_data->mu.length;
+			asym_op->mldsa.sigver.hash = options->mldsa_data->hash;
+		} else {
+			rte_panic("Unsupported ML-DSA operation type %d\n", options->asym_op_type);
+		}
+	}
+}
 
 #ifdef RTE_LIB_SECURITY
 static void
@@ -1269,6 +1321,21 @@ cperf_create_session(struct rte_mempool *sess_mp,
 
 		return asym_sess;
 	}
+	if (options->op_type == CPERF_ASYM_MLDSA44) {
+		xform.next = NULL;
+		xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+		xform.mldsa.type = RTE_CRYPTO_ML_DSA_44;
+		xform.mldsa.sign_deterministic =
+		   options->mldsa_data->sign_deterministic;
+		xform.mldsa.sign_prehash = false;
+
+		ret = rte_cryptodev_asym_session_create(dev_id, &xform, sess_mp, &asym_sess);
+		if (ret < 0 || asym_sess == NULL) {
+			RTE_LOG(ERR, USER1, "ML-DSA Asym session create failed\n");
+			return NULL;
+		}
+		return asym_sess;
+	}
 
 	if (options->op_type == CPERF_ASYM_MLKEM512) {
 		xform.next = NULL;
@@ -1600,6 +1667,9 @@ cperf_get_op_functions(const struct cperf_options *options,
 	case CPERF_ASYM_SM2:
 		op_fns->populate_ops = cperf_set_ops_asym_sm2;
 		break;
+	case CPERF_ASYM_MLDSA44:
+		op_fns->populate_ops = cperf_set_ops_asym_mldsa;
+		break;
 	case CPERF_ASYM_MLKEM512:
 		op_fns->populate_ops = cperf_set_ops_asym_mlkem;
 		break;
diff --git a/app/test-crypto-perf/cperf_options.h b/app/test-crypto-perf/cperf_options.h
index 98b8eeec3e..d8ceca2424 100644
--- a/app/test-crypto-perf/cperf_options.h
+++ b/app/test-crypto-perf/cperf_options.h
@@ -101,6 +101,7 @@ enum cperf_op_type {
 	CPERF_ASYM_SECP521R1,
 	CPERF_ASYM_ED25519,
 	CPERF_ASYM_SM2,
+	CPERF_ASYM_MLDSA44,
 	CPERF_ASYM_MLKEM512,
 	CPERF_TLS,
 };
@@ -189,6 +190,7 @@ struct cperf_options {
 	struct cperf_eddsa_test_data *eddsa_data;
 	struct cperf_sm2_test_data *sm2_data;
 	struct cperf_mlkem_test_data *mlkem_data;
+	struct cperf_mldsa_test_data *mldsa_data;
 	enum rte_crypto_asym_op_type asym_op_type;
 	enum rte_crypto_auth_algorithm asym_hash_alg;
 	struct cperf_rsa_test_data *rsa_data;
diff --git a/app/test-crypto-perf/cperf_options_parsing.c b/app/test-crypto-perf/cperf_options_parsing.c
index 34afa938c8..44c2a7173a 100644
--- a/app/test-crypto-perf/cperf_options_parsing.c
+++ b/app/test-crypto-perf/cperf_options_parsing.c
@@ -41,7 +41,7 @@ usage(char *progname)
 		" --optype cipher-only / auth-only / cipher-then-auth / auth-then-cipher /\n"
 		"        aead / pdcp / docsis / ipsec / modex / rsa / secp192r1 /\n"
 		"        secp224r1 / secp256r1 / secp384r1 / secp521r1 / eddsa / sm2 /\n"
-		"        mlkem_512 /\n"
+		"        mlkem_512 / mldsa_44 /\n"
 		"        tls-record : set operation type\n"
 		" --sessionless: enable session-less crypto operations\n"
 		" --shared-session: share 1 session across all queue pairs on crypto device\n"
@@ -560,6 +560,10 @@ parse_op_type(struct cperf_options *opts, const char *arg)
 			cperf_op_type_strs[CPERF_ASYM_SM2],
 			CPERF_ASYM_SM2
 		},
+		{
+			cperf_op_type_strs[CPERF_ASYM_MLDSA44],
+			CPERF_ASYM_MLDSA44
+		},
 		{
 			cperf_op_type_strs[CPERF_ASYM_MLKEM512],
 			CPERF_ASYM_MLKEM512
@@ -1180,6 +1184,7 @@ cperf_options_default(struct cperf_options *opts)
 	opts->eddsa_data = &ed25519_perf_data;
 	opts->sm2_data = &sm2_perf_data;
 	opts->mlkem_data = &mlkem_encap_perf_data[0];
+	opts->mldsa_data = &mldsa_sign_perf_data[0];
 	opts->asym_op_type = RTE_CRYPTO_ASYM_OP_ENCRYPT;
 }
 
@@ -1709,6 +1714,17 @@ cperf_options_check(struct cperf_options *options)
 	}
 #endif
 
+	if (options->op_type == CPERF_ASYM_MLDSA44) {
+		if (options->asym_op_type == RTE_CRYPTO_ASYM_OP_SIGN)
+			options->mldsa_data = &mldsa_sign_perf_data[0];
+		else if (options->asym_op_type == RTE_CRYPTO_ASYM_OP_VERIFY)
+			options->mldsa_data = &mldsa_verify_perf_data[0];
+		else {
+			RTE_LOG(ERR, USER1, "ML-DSA only supports sign and verify operations\n");
+			return -EINVAL;
+		}
+	}
+
 	return 0;
 }
 
@@ -1759,6 +1775,8 @@ cperf_options_dump(struct cperf_options *opts)
 				   rte_crypto_asym_op_strings[opts->asym_op_type]);
 		if (opts->op_type == CPERF_ASYM_RSA)
 			printf("# rsa test name: %s\n", opts->rsa_data->name);
+		if (opts->op_type == CPERF_ASYM_MLDSA44)
+			printf("# mldsa test name: %s\n", opts->mldsa_data->name);
 		if (opts->op_type == CPERF_ASYM_MLKEM512)
 			printf("# mlkem test name: %s\n", opts->mlkem_data->name);
 	}
diff --git a/app/test-crypto-perf/cperf_test_common.c b/app/test-crypto-perf/cperf_test_common.c
index 383d4bd940..0bcaa6dfd8 100644
--- a/app/test-crypto-perf/cperf_test_common.c
+++ b/app/test-crypto-perf/cperf_test_common.c
@@ -314,7 +314,8 @@ cperf_is_asym_test(const struct cperf_options *options)
 	    options->op_type == CPERF_ASYM_SECP521R1 ||
 	    options->op_type == CPERF_ASYM_ED25519 ||
 	    options->op_type == CPERF_ASYM_SM2 ||
-		options->op_type == CPERF_ASYM_MLKEM512)
+		options->op_type == CPERF_ASYM_MLKEM512 ||
+		options->op_type == CPERF_ASYM_MLDSA44)
 		return true;
 
 	return false;
diff --git a/app/test-crypto-perf/cperf_test_vectors.c b/app/test-crypto-perf/cperf_test_vectors.c
index 6e2435b004..a3b050af11 100644
--- a/app/test-crypto-perf/cperf_test_vectors.c
+++ b/app/test-crypto-perf/cperf_test_vectors.c
@@ -3934,6 +3934,1624 @@ uint8_t mlkem_512_sk[] = {
 	0x5E, 0x7A, 0xB9, 0x3A, 0x40, 0xAD, 0x38, 0x6A
 };
 
+uint8_t mldsa_44_seed[] = {
+	0xf4, 0x41, 0xc9, 0x62, 0x17, 0x32, 0x2c, 0xbc,
+	0xcf, 0x05, 0xf7, 0x5b, 0xd5, 0xfb, 0x0a, 0x0a,
+	0x78, 0xbf, 0xad, 0xab, 0x89, 0x6e, 0x88, 0xdb,
+	0xb4, 0x08, 0x90, 0xe0, 0x16, 0x9b, 0xb6, 0x66,
+};
+
+uint8_t mldsa_44_privkey[] = {
+	0xcc, 0x2c, 0x93, 0xce, 0xfc, 0x0b, 0xf6, 0x74,
+	0x93, 0x28, 0x95, 0xe8, 0xc0, 0xc8, 0x83, 0xb8,
+	0xc9, 0x0c, 0x9a, 0x5c, 0x18, 0xd2, 0x79, 0x5c,
+	0xf3, 0x58, 0xd8, 0x02, 0x6c, 0x5e, 0xad, 0x79,
+	0xc1, 0xae, 0x0a, 0x97, 0x90, 0x41, 0x10, 0x32,
+	0x59, 0x46, 0x12, 0x27, 0x0a, 0xa3, 0xc7, 0xf0,
+	0x74, 0x54, 0x3d, 0xb2, 0x24, 0xc2, 0xa2, 0xec,
+	0xaf, 0x31, 0xa0, 0xf4, 0x78, 0x97, 0x7c, 0x6a,
+	0xdc, 0x91, 0x87, 0x60, 0x01, 0xa9, 0x19, 0x2d,
+	0x0d, 0xca, 0xb4, 0x14, 0x9d, 0x41, 0xe3, 0x18,
+	0x4b, 0x99, 0x31, 0xfa, 0xf4, 0xfa, 0xc4, 0x75,
+	0x93, 0x87, 0xc7, 0x7a, 0x8f, 0x0e, 0xc6, 0xb2,
+	0xfa, 0xf6, 0x48, 0x84, 0x17, 0x42, 0x01, 0xcb,
+	0xd2, 0x55, 0x40, 0x2f, 0x23, 0x21, 0x91, 0x11,
+	0x40, 0x00, 0xdc, 0x91, 0x3d, 0xf5, 0x96, 0xdb,
+	0xb3, 0x6d, 0xd5, 0xf4, 0xc5, 0x11, 0x96, 0x8f,
+	0x13, 0x25, 0x4a, 0x24, 0xb3, 0x90, 0x9b, 0x16,
+	0x30, 0x20, 0x96, 0x10, 0x10, 0x97, 0x6c, 0xd0,
+	0x26, 0x26, 0x61, 0x84, 0x85, 0x1b, 0xb2, 0x81,
+	0x5c, 0x10, 0x88, 0x48, 0xc8, 0x8d, 0x1c, 0x42,
+	0x61, 0x19, 0x32, 0x04, 0x81, 0xa6, 0x89, 0x98,
+	0x42, 0x62, 0x14, 0xa3, 0x90, 0xc8, 0xc2, 0x4c,
+	0x41, 0x04, 0x2c, 0x5b, 0x26, 0x2a, 0xd1, 0x30,
+	0x12, 0x18, 0x40, 0x71, 0x08, 0x98, 0x70, 0x60,
+	0x40, 0x09, 0x4a, 0x44, 0x0a, 0x24, 0x43, 0x92,
+	0x04, 0x20, 0x06, 0x80, 0xa2, 0x01, 0x18, 0x47,
+	0x12, 0x23, 0xc7, 0x6c, 0x50, 0x32, 0x61, 0xda,
+	0x26, 0x40, 0x84, 0x98, 0x90, 0xd3, 0x04, 0x66,
+	0x52, 0xb8, 0x70, 0x99, 0x02, 0x6c, 0x64, 0xb2,
+	0x00, 0x1b, 0x35, 0x90, 0x23, 0x00, 0x92, 0x01,
+	0x02, 0x20, 0x12, 0x89, 0x25, 0x62, 0xa6, 0x4d,
+	0x1b, 0x29, 0x08, 0x08, 0x46, 0x72, 0xa1, 0x18,
+	0x11, 0x03, 0x80, 0x60, 0xd4, 0x38, 0x80, 0x64,
+	0x36, 0x4e, 0x23, 0x30, 0x8e, 0x23, 0x81, 0x60,
+	0xd1, 0x84, 0x89, 0xe2, 0xa8, 0x2d, 0x80, 0x92,
+	0x61, 0x8a, 0x22, 0x28, 0x0a, 0xc9, 0x50, 0xe3,
+	0x96, 0x40, 0x84, 0xa0, 0x0d, 0xd8, 0xc2, 0x2c,
+	0xd1, 0x30, 0x10, 0x18, 0xa0, 0x48, 0xe2, 0xb2,
+	0x04, 0x00, 0xa8, 0x29, 0x19, 0x42, 0x68, 0xa3,
+	0xa2, 0x71, 0xd9, 0xc0, 0x45, 0xa2, 0xc6, 0x4c,
+	0x51, 0x36, 0x71, 0xc1, 0x40, 0x02, 0x08, 0x12,
+	0x72, 0x90, 0x04, 0x2e, 0x80, 0x30, 0x24, 0x8b,
+	0x90, 0x44, 0x82, 0x82, 0x68, 0xa2, 0x84, 0x2d,
+	0x08, 0x00, 0x61, 0x23, 0x82, 0x48, 0x00, 0x33,
+	0x29, 0x58, 0x48, 0x86, 0x01, 0x01, 0x21, 0x62,
+	0xa8, 0x91, 0xe3, 0x10, 0x6c, 0x58, 0x24, 0x09,
+	0x0c, 0x14, 0x02, 0x63, 0x22, 0x20, 0x12, 0x48,
+	0x70, 0x81, 0x26, 0x6e, 0x00, 0x86, 0x31, 0x1a,
+	0x22, 0x65, 0x40, 0x38, 0x00, 0x02, 0x47, 0x09,
+	0xc9, 0x82, 0x8c, 0x82, 0xa0, 0x2c, 0xd3, 0x04,
+	0x45, 0x50, 0xb0, 0x28, 0xd0, 0x10, 0x8d, 0x1c,
+	0x10, 0x52, 0x4b, 0x00, 0x66, 0xc8, 0xc0, 0x08,
+	0x9a, 0xa8, 0x2d, 0xd4, 0x02, 0x8a, 0x1b, 0x35,
+	0x65, 0x04, 0xc7, 0x28, 0x84, 0x38, 0x50, 0x18,
+	0x20, 0x4a, 0x91, 0x18, 0x8c, 0x9b, 0x20, 0x09,
+	0x94, 0x08, 0x71, 0x64, 0x06, 0x25, 0x20, 0x23,
+	0x09, 0xd8, 0x82, 0x68, 0x5a, 0xa6, 0x31, 0x63,
+	0x36, 0x32, 0x5c, 0x12, 0x62, 0xdb, 0x32, 0x6e,
+	0x14, 0x93, 0x68, 0x9a, 0x34, 0x80, 0x83, 0x44,
+	0x4a, 0x18, 0x13, 0x49, 0x43, 0xb8, 0x0d, 0xda,
+	0x92, 0x41, 0x42, 0xb8, 0x84, 0x52, 0x94, 0x91,
+	0x04, 0x05, 0x4d, 0xa2, 0x38, 0x64, 0x01, 0x19,
+	0x05, 0x18, 0xa2, 0x4d, 0x90, 0x34, 0x26, 0x91,
+	0x30, 0x68, 0x1c, 0x14, 0x44, 0x4b, 0x18, 0x22,
+	0x12, 0x90, 0x91, 0x42, 0x96, 0x91, 0x19, 0x48,
+	0x4c, 0x24, 0x46, 0x80, 0xc3, 0xb8, 0x8c, 0x1c,
+	0x80, 0x8d, 0x18, 0x45, 0x88, 0xd8, 0x94, 0x4c,
+	0x13, 0x02, 0x65, 0xd3, 0x22, 0x29, 0x49, 0x04,
+	0x82, 0x04, 0xc2, 0x40, 0x04, 0x34, 0x21, 0xe1,
+	0x34, 0x46, 0x20, 0x90, 0x44, 0x93, 0x14, 0x44,
+	0xdb, 0xc0, 0x4d, 0x1b, 0xa2, 0x24, 0x5a, 0x24,
+	0x68, 0x10, 0x46, 0x66, 0x11, 0x43, 0x29, 0xd0,
+	0x90, 0x0d, 0x49, 0x12, 0x4c, 0xc1, 0x96, 0x2c,
+	0xdb, 0x22, 0x65, 0xe4, 0x16, 0x24, 0xd1, 0x24,
+	0x26, 0x53, 0xb8, 0x45, 0x8a, 0xb4, 0x11, 0x04,
+	0x96, 0x28, 0x80, 0x22, 0x8e, 0xd1, 0x10, 0x05,
+	0x44, 0x44, 0x8a, 0x5c, 0xb4, 0x50, 0xdc, 0x10,
+	0x02, 0xc1, 0xa2, 0x4c, 0x11, 0x05, 0x2c, 0x21,
+	0x39, 0x6a, 0x64, 0x36, 0x01, 0x09, 0xc3, 0x0c,
+	0x9a, 0x24, 0x52, 0x92, 0x20, 0x0a, 0xd2, 0xa8,
+	0x49, 0x99, 0xc6, 0x8d, 0x50, 0x26, 0x62, 0x09,
+	0x42, 0x05, 0x5b, 0xc0, 0x41, 0xd0, 0x22, 0x25,
+	0x09, 0xb4, 0x2d, 0x98, 0xa2, 0x24, 0x12, 0x84,
+	0x0d, 0xca, 0x98, 0x11, 0x22, 0x80, 0x21, 0x1b,
+	0x00, 0x44, 0x84, 0xc6, 0x89, 0x92, 0x48, 0x42,
+	0x50, 0xc8, 0x60, 0x24, 0x15, 0x69, 0xa2, 0x48,
+	0x06, 0xc4, 0xb0, 0x24, 0x63, 0x14, 0x40, 0x12,
+	0xc4, 0x61, 0x82, 0x30, 0x60, 0x88, 0x96, 0x89,
+	0xc9, 0xc0, 0x89, 0x12, 0x36, 0x82, 0x8c, 0xc0,
+	0x09, 0xc0, 0x88, 0x91, 0xdb, 0x10, 0x64, 0x08,
+	0x36, 0x71, 0x94, 0x10, 0x46, 0x20, 0x83, 0x10,
+	0x13, 0x13, 0x4c, 0x08, 0x28, 0x45, 0x24, 0xb9,
+	0x64, 0x09, 0xb0, 0x48, 0x1c, 0x25, 0x50, 0x23,
+	0x40, 0x90, 0xe0, 0x96, 0x50, 0x9a, 0x38, 0x41,
+	0xcc, 0xb2, 0x2c, 0xdb, 0x04, 0x66, 0x61, 0x48,
+	0x30, 0x02, 0x34, 0x4e, 0xd1, 0xc2, 0x85, 0xc9,
+	0x06, 0x41, 0x19, 0x30, 0x69, 0xc8, 0x94, 0x68,
+	0x1c, 0x83, 0x70, 0x03, 0x10, 0x4d, 0xc2, 0x16,
+	0x4e, 0x64, 0x92, 0x30, 0x60, 0x16, 0x84, 0xa2,
+	0xa8, 0x90, 0xa4, 0x38, 0x11, 0x0a, 0x88, 0x05,
+	0x10, 0x93, 0x88, 0x43, 0x06, 0x10, 0x18, 0x10,
+	0x70, 0x03, 0x28, 0x42, 0x89, 0x28, 0x8d, 0x8a,
+	0xa8, 0x09, 0x94, 0x42, 0x85, 0xa3, 0x10, 0x61,
+	0x0c, 0x45, 0x50, 0x04, 0x31, 0x4c, 0xd1, 0x10,
+	0x12, 0x8b, 0x96, 0x05, 0x03, 0xa0, 0x89, 0x21,
+	0xc4, 0x4d, 0x61, 0xc8, 0x61, 0x09, 0x99, 0x10,
+	0x59, 0x96, 0x49, 0x00, 0x89, 0x08, 0x23, 0x00,
+	0x10, 0xcc, 0xa4, 0x61, 0x01, 0x25, 0x80, 0x21,
+	0x31, 0x09, 0x13, 0x28, 0x0d, 0x1c, 0x05, 0x85,
+	0x62, 0x92, 0x44, 0x09, 0x10, 0x8a, 0x5a, 0xa6,
+	0x20, 0x89, 0xb0, 0x20, 0x0c, 0xb3, 0x01, 0xc9,
+	0x26, 0x61, 0x0b, 0x34, 0x6a, 0x8b, 0x44, 0x0e,
+	0xf2, 0x47, 0x18, 0xf8, 0x4a, 0xfa, 0x45, 0x60,
+	0x87, 0xeb, 0x0f, 0xff, 0x75, 0xa6, 0xba, 0x18,
+	0x9a, 0x7d, 0x37, 0xc4, 0xc7, 0x7e, 0x1a, 0xc9,
+	0x0d, 0x06, 0x53, 0xca, 0xf0, 0x2c, 0xe9, 0xe9,
+	0x4b, 0x5f, 0x8b, 0xbc, 0x77, 0xc6, 0x71, 0x68,
+	0x4f, 0x8c, 0x3b, 0x30, 0x59, 0x91, 0xf0, 0xb5,
+	0x6d, 0xa6, 0x28, 0x2c, 0xd4, 0x0a, 0x00, 0x27,
+	0x6a, 0x39, 0x17, 0x88, 0xa9, 0x93, 0xbb, 0x6e,
+	0xda, 0x3e, 0x4b, 0xb7, 0x1b, 0x6a, 0xb2, 0xe2,
+	0xc4, 0x6f, 0x21, 0x78, 0x74, 0xff, 0xa2, 0x02,
+	0x65, 0x68, 0xa4, 0xce, 0xb4, 0xfe, 0x0c, 0x18,
+	0x59, 0xb9, 0xc8, 0x33, 0x41, 0x27, 0xa1, 0x4b,
+	0xcf, 0xe9, 0xa9, 0xd7, 0x2d, 0xf9, 0xcd, 0xc6,
+	0xde, 0x4e, 0x1d, 0x7d, 0x07, 0xf4, 0xda, 0xed,
+	0x89, 0xa1, 0xef, 0xbc, 0xec, 0x1b, 0xc3, 0x07,
+	0xfd, 0xf5, 0x96, 0xa3, 0x6c, 0x70, 0xc8, 0xb9,
+	0x9f, 0x46, 0x0a, 0xad, 0x46, 0x01, 0xa1, 0x92,
+	0x7c, 0xd1, 0x12, 0x78, 0x89, 0x89, 0x98, 0x68,
+	0x9e, 0xdd, 0xd9, 0x7b, 0x9f, 0x2b, 0x29, 0xc1,
+	0x0e, 0x29, 0xb0, 0x44, 0x7c, 0x22, 0xd7, 0x67,
+	0x47, 0x91, 0xf0, 0xf8, 0x56, 0x79, 0x89, 0x42,
+	0x95, 0x60, 0x53, 0x32, 0xc1, 0x14, 0x48, 0x56,
+	0x67, 0x00, 0x80, 0x86, 0xcd, 0x80, 0x21, 0x75,
+	0xe8, 0xe2, 0x41, 0x6a, 0x5d, 0xb2, 0x12, 0x57,
+	0x1e, 0x83, 0x34, 0xa4, 0x95, 0x4e, 0x0e, 0x71,
+	0xac, 0xcb, 0x09, 0xef, 0xea, 0x4e, 0xe0, 0x4d,
+	0x44, 0xb2, 0x67, 0xd2, 0x6e, 0x78, 0x01, 0xb5,
+	0x09, 0x64, 0xa7, 0xdf, 0xe6, 0x16, 0x72, 0x6b,
+	0x19, 0xe5, 0x88, 0x8a, 0x06, 0xae, 0x0a, 0x93,
+	0xdb, 0xee, 0x0e, 0xf6, 0x52, 0x84, 0x95, 0x2b,
+	0xf8, 0xf4, 0xcd, 0x5d, 0x8b, 0x3a, 0x86, 0x87,
+	0x8e, 0x8b, 0x97, 0x65, 0xb1, 0xd6, 0x50, 0xbc,
+	0xa7, 0xf0, 0x32, 0xb5, 0x39, 0x1e, 0x10, 0x7d,
+	0x96, 0x11, 0xc1, 0xe8, 0x47, 0xfa, 0xdd, 0x24,
+	0x22, 0xb6, 0x43, 0xb2, 0x41, 0x95, 0x98, 0x1a,
+	0x3f, 0x0f, 0x9a, 0xd3, 0xc4, 0x10, 0x19, 0x85,
+	0x0a, 0x0d, 0xde, 0xb7, 0x76, 0xec, 0xe3, 0x57,
+	0x2e, 0x38, 0x4e, 0xb1, 0x2e, 0x4a, 0xaf, 0xc8,
+	0x78, 0xa7, 0xb3, 0x1e, 0xaf, 0xe0, 0xe4, 0xbb,
+	0xc8, 0x0b, 0x24, 0x04, 0x08, 0xd2, 0xbc, 0x91,
+	0xca, 0x8e, 0x4e, 0x85, 0x39, 0x76, 0x20, 0xc9,
+	0xa7, 0x47, 0x8b, 0x6a, 0xd9, 0xc8, 0xb7, 0xb0,
+	0xa5, 0xa2, 0x85, 0x48, 0x4c, 0xcb, 0x16, 0xaf,
+	0x45, 0x48, 0x00, 0xbe, 0x67, 0xef, 0x67, 0x65,
+	0xa3, 0x9d, 0x43, 0x07, 0x59, 0x88, 0x9a, 0xad,
+	0xe5, 0xad, 0x1e, 0xeb, 0xd5, 0xd4, 0xc7, 0xa4,
+	0xb9, 0x40, 0x70, 0x2c, 0xe1, 0xcb, 0x5c, 0x3f,
+	0x49, 0x6b, 0x51, 0xbf, 0xd3, 0xb7, 0xea, 0x33,
+	0x52, 0x73, 0xcf, 0x26, 0x19, 0x54, 0x1d, 0xb6,
+	0x33, 0x5d, 0x1a, 0x88, 0xdb, 0xd6, 0xfe, 0xae,
+	0xf4, 0x45, 0x67, 0x80, 0x8a, 0xfc, 0xc4, 0xbe,
+	0xfb, 0x6a, 0x4a, 0x75, 0x88, 0x35, 0x26, 0x1f,
+	0x90, 0x65, 0x26, 0x5e, 0xb8, 0x0d, 0x15, 0x9d,
+	0x70, 0x76, 0xf2, 0xfd, 0xed, 0x55, 0x71, 0x2b,
+	0xe8, 0x2d, 0xc0, 0x28, 0xee, 0x53, 0x7c, 0xa1,
+	0x3e, 0x86, 0x74, 0xa2, 0xd3, 0x9e, 0x2c, 0x70,
+	0x15, 0x3a, 0x90, 0xfd, 0x1d, 0xac, 0x81, 0x2d,
+	0xa6, 0x6a, 0xe6, 0xd7, 0x7f, 0xd9, 0x97, 0xc9,
+	0x47, 0x7c, 0x07, 0xe6, 0x35, 0x45, 0xc9, 0x1f,
+	0x08, 0xbc, 0x14, 0xdb, 0x12, 0x84, 0xc3, 0xc8,
+	0xe2, 0x86, 0xa3, 0xa2, 0x1e, 0xfb, 0x3f, 0xca,
+	0x92, 0x04, 0xe0, 0x6b, 0x29, 0xe0, 0xe0, 0x23,
+	0x51, 0x40, 0x8e, 0xec, 0xf8, 0x87, 0xa2, 0x7a,
+	0x2d, 0x8b, 0xc2, 0x62, 0x8c, 0x29, 0x82, 0x4b,
+	0x86, 0x1a, 0xa7, 0xc6, 0xaa, 0x24, 0x5f, 0x24,
+	0x03, 0x20, 0xa8, 0x3c, 0xa3, 0xcb, 0xd1, 0x60,
+	0x64, 0x7d, 0x22, 0x9b, 0x07, 0x46, 0x1e, 0xff,
+	0x43, 0xa9, 0x38, 0x34, 0x0f, 0x01, 0x00, 0x7f,
+	0xc6, 0xcb, 0x0a, 0xed, 0x73, 0xc0, 0xfb, 0x77,
+	0x80, 0x8c, 0x2c, 0x4c, 0xa5, 0x20, 0xe8, 0xcf,
+	0x37, 0xf9, 0x00, 0x12, 0xe1, 0x6c, 0xb5, 0x9a,
+	0x91, 0xbe, 0x1f, 0xaf, 0xf1, 0x8c, 0x6e, 0x09,
+	0xea, 0xcf, 0xac, 0x43, 0x6e, 0x32, 0xd0, 0xf4,
+	0x89, 0x4e, 0x42, 0xc2, 0xe7, 0x84, 0x7a, 0x66,
+	0xb5, 0x2b, 0x5c, 0x7d, 0x83, 0x4b, 0xd4, 0x3d,
+	0x81, 0x6d, 0x68, 0xb9, 0x72, 0xe5, 0xd5, 0xe5,
+	0xf5, 0x9c, 0x4d, 0x95, 0xcd, 0xcd, 0x4d, 0x9a,
+	0x4e, 0x69, 0xb9, 0x8a, 0x1e, 0x96, 0x69, 0xc0,
+	0xe0, 0x39, 0x02, 0x21, 0x1c, 0x82, 0xd9, 0x5b,
+	0xe5, 0xde, 0x34, 0xff, 0xf0, 0x15, 0xc7, 0x9a,
+	0x62, 0x83, 0xca, 0xa3, 0x70, 0x15, 0xeb, 0x8f,
+	0x73, 0x0e, 0xa9, 0x9c, 0xe9, 0xe3, 0xe7, 0xfc,
+	0xb4, 0xcb, 0xac, 0xdf, 0x61, 0x91, 0xf3, 0x4b,
+	0x87, 0xa6, 0x29, 0xea, 0x36, 0x81, 0x07, 0x3e,
+	0xae, 0x69, 0xee, 0x87, 0x2a, 0x30, 0x1c, 0x97,
+	0x96, 0x40, 0x08, 0x48, 0xcf, 0x5f, 0xfe, 0x57,
+	0x23, 0xfd, 0xb7, 0x9a, 0x69, 0xef, 0xf5, 0x6e,
+	0xc9, 0xdd, 0x95, 0x2b, 0x17, 0xd5, 0x2c, 0xad,
+	0xa4, 0x49, 0x78, 0xb1, 0xd1, 0x00, 0xe7, 0xca,
+	0xcb, 0x20, 0x9e, 0xba, 0xea, 0xc8, 0xd4, 0x9b,
+	0x84, 0xac, 0x0b, 0xf0, 0x3b, 0x2c, 0xf0, 0x95,
+	0x3b, 0x5b, 0xf8, 0xfe, 0xe5, 0xc6, 0xee, 0x7c,
+	0x9e, 0x41, 0xf0, 0xef, 0xcf, 0x4d, 0xdd, 0xe8,
+	0x63, 0x6b, 0xcf, 0xe9, 0xd2, 0x80, 0x98, 0xf9,
+	0x7d, 0x22, 0x7e, 0xfc, 0xdd, 0x50, 0x6b, 0xa3,
+	0x6d, 0x7c, 0xed, 0x35, 0xbc, 0x28, 0x64, 0x03,
+	0xe6, 0x01, 0xac, 0x7c, 0xe1, 0x9b, 0x08, 0x6f,
+	0xd8, 0xdc, 0xaf, 0xb6, 0x9d, 0x4c, 0xdf, 0xb1,
+	0xde, 0xf4, 0x90, 0x5b, 0x46, 0xee, 0x7d, 0x28,
+	0xfb, 0xaa, 0xa9, 0x69, 0x47, 0xf5, 0x52, 0x74,
+	0x97, 0x9f, 0x8b, 0xbb, 0x26, 0x8f, 0x0d, 0x89,
+	0x2f, 0xc9, 0x57, 0xac, 0x2f, 0x88, 0x12, 0xdd,
+	0x12, 0x2f, 0x75, 0x97, 0xc7, 0x7b, 0x45, 0x46,
+	0x3a, 0x52, 0x4b, 0xf6, 0x76, 0xe0, 0x99, 0xef,
+	0xbe, 0xbf, 0xed, 0x0d, 0x32, 0xed, 0xc6, 0x5e,
+	0x6a, 0xe6, 0x0e, 0x12, 0xd4, 0xce, 0xf8, 0x0c,
+	0x7b, 0x4f, 0x1d, 0x3b, 0xf8, 0xaf, 0xdd, 0xd1,
+	0x78, 0x74, 0x59, 0xc7, 0xe4, 0xbc, 0xe3, 0xdd,
+	0x4a, 0xa7, 0x77, 0xa5, 0xcd, 0x80, 0x7c, 0x6b,
+	0x19, 0x46, 0x3d, 0xbd, 0x0a, 0x75, 0x48, 0xfa,
+	0x1c, 0xee, 0x02, 0xe9, 0x79, 0x10, 0x6c, 0xb4,
+	0xb3, 0xb2, 0xbe, 0xc8, 0x5c, 0xd1, 0xa1, 0xe2,
+	0xd5, 0x0a, 0xb5, 0xf3, 0x0c, 0x3f, 0x03, 0xb9,
+	0x2f, 0x61, 0x44, 0x95, 0xe1, 0x16, 0xcb, 0xc1,
+	0xee, 0xb3, 0xb8, 0x85, 0xd6, 0x1c, 0xf4, 0xfa,
+	0x86, 0x73, 0xc5, 0xf3, 0xba, 0xb5, 0xe0, 0x95,
+	0x34, 0x95, 0x72, 0xfa, 0xa7, 0xb8, 0x50, 0xba,
+	0xfb, 0xa6, 0x3c, 0x0f, 0x3c, 0xe3, 0xaa, 0x56,
+	0x05, 0xaf, 0x08, 0xec, 0x50, 0x12, 0x73, 0x25,
+	0x29, 0x72, 0xf5, 0xf6, 0xee, 0x06, 0xe4, 0x05,
+	0x1a, 0xe1, 0x1a, 0x13, 0x3f, 0xa3, 0x55, 0x16,
+	0x12, 0x17, 0x88, 0xd2, 0xa7, 0xc1, 0xd0, 0xf2,
+	0x7d, 0x51, 0x46, 0x36, 0x2e, 0x77, 0xa8, 0x02,
+	0x67, 0xad, 0xe7, 0x63, 0xaa, 0xbf, 0xe5, 0xbf,
+	0xa1, 0xab, 0xc4, 0xf6, 0x72, 0xae, 0xdf, 0x79,
+	0x0e, 0x82, 0x47, 0xb5, 0xf4, 0x48, 0x39, 0x22,
+	0xe3, 0x0a, 0x94, 0x5e, 0x3a, 0x4b, 0xa6, 0xa7,
+	0x5c, 0xb8, 0xec, 0x3e, 0x10, 0xae, 0x94, 0x34,
+	0x2c, 0xc0, 0x4b, 0xdd, 0xca, 0x4d, 0xc9, 0x7c,
+	0xf8, 0x2e, 0x32, 0x4e, 0x00, 0x2c, 0x34, 0x71,
+	0x28, 0xad, 0xd5, 0xcb, 0x19, 0xb8, 0x1d, 0xaa,
+	0x85, 0xac, 0xec, 0x16, 0xb6, 0x1f, 0x95, 0xc5,
+	0xa9, 0x4b, 0x8a, 0xfc, 0x70, 0xb7, 0x34, 0xb0,
+	0x63, 0x55, 0xff, 0x15, 0xc2, 0x72, 0x74, 0xe0,
+	0x6d, 0x01, 0x3d, 0xf0, 0x6a, 0xab, 0x4b, 0x8a,
+	0x72, 0xdc, 0x2b, 0x0a, 0x8a, 0xf4, 0x02, 0x1b,
+	0x0b, 0x51, 0xd8, 0xf7, 0x17, 0xcf, 0x48, 0xf0,
+	0x97, 0xa0, 0xc2, 0x7a, 0xc4, 0x64, 0x59, 0x2a,
+	0xa3, 0x27, 0xbe, 0x3b, 0xf7, 0xc5, 0x6d, 0x51,
+	0x29, 0xe2, 0x68, 0x87, 0x75, 0x71, 0x72, 0xac,
+	0xc8, 0xc1, 0xc8, 0xe5, 0xf6, 0x8a, 0x27, 0x8c,
+	0x45, 0x03, 0x10, 0xf7, 0x1a, 0xff, 0x1b, 0x04,
+	0x1c, 0xaf, 0x27, 0x7a, 0x57, 0xac, 0x0f, 0x57,
+	0x2a, 0x74, 0xd0, 0x46, 0x64, 0xbf, 0xc9, 0xe8,
+	0x35, 0x6b, 0x5c, 0x79, 0x9a, 0x51, 0xeb, 0xd1,
+	0xb3, 0x1d, 0xfd, 0x2f, 0x83, 0x2e, 0x24, 0x95,
+	0x94, 0xc7, 0x9d, 0x9f, 0x5d, 0x5c, 0x8e, 0x6c,
+	0x8f, 0xfc, 0xce, 0x89, 0x67, 0x9b, 0x38, 0x4b,
+	0x0d, 0x44, 0x9a, 0xb5, 0x74, 0xbf, 0x88, 0x90,
+	0xa1, 0xf2, 0xc4, 0xd2, 0xb3, 0x07, 0xe5, 0x34,
+	0x62, 0xc0, 0xfc, 0x3f, 0xdb, 0x77, 0x8e, 0x84,
+	0x61, 0xc1, 0x15, 0xf6, 0x5f, 0x5d, 0x73, 0xbc,
+	0x0c, 0x70, 0x32, 0xeb, 0x2c, 0xd3, 0x19, 0x83,
+	0x22, 0xfa, 0x5b, 0xcc, 0x5f, 0xbf, 0xbe, 0xfc,
+	0x3c, 0x28, 0x74, 0x2d, 0x33, 0x8f, 0x74, 0xe5,
+	0xca, 0xc9, 0x84, 0x8f, 0xba, 0x48, 0x11, 0x84,
+	0x33, 0xf0, 0x7d, 0x5c, 0xad, 0x47, 0x36, 0xf7,
+	0x33, 0xb0, 0xbb, 0x44, 0x65, 0x72, 0x45, 0xd1,
+	0x40, 0x4c, 0x39, 0x8b, 0x16, 0x90, 0x74, 0xa3,
+	0xd2, 0x3c, 0xc6, 0x7a, 0xa4, 0x4f, 0x0d, 0x9a,
+	0xe1, 0xfd, 0x49, 0x82, 0xc6, 0x69, 0xf7, 0xe7,
+	0x3d, 0xeb, 0x2b, 0xbe, 0xfd, 0x1a, 0x73, 0x2c,
+	0xf3, 0xbc, 0xd6, 0xaa, 0xaa, 0x54, 0x22, 0x5c,
+	0x54, 0x92, 0x73, 0xe3, 0x79, 0x0a, 0x87, 0x20,
+	0x82, 0xdb, 0x02, 0x42, 0x81, 0xb1, 0xf7, 0x0d,
+	0xf0, 0xd8, 0x56, 0x0f, 0x74, 0x0c, 0x65, 0x7c,
+	0x8c, 0x96, 0xb9, 0x9f, 0xfa, 0xb6, 0x48, 0x66,
+	0xf1, 0xbe, 0xf8, 0x46, 0x70, 0xe5, 0x26, 0xc1,
+	0x68, 0x7f, 0x81, 0x72, 0x14, 0x2f, 0x96, 0x22,
+	0x05, 0xd1, 0xc0, 0xb8, 0x93, 0x9d, 0x02, 0x8b,
+	0xff, 0x0b, 0x2d, 0xb9, 0x01, 0xaa, 0x61, 0x09,
+	0x9d, 0x55, 0x21, 0xdd, 0xda, 0xec, 0x44, 0xce,
+	0x00, 0x98, 0xf8, 0x34, 0x86, 0x49, 0xd4, 0x72,
+	0x90, 0xfb, 0xd7, 0xb1, 0x33, 0xb9, 0xe5, 0xd3,
+	0xc0, 0x27, 0x88, 0x4b, 0x6d, 0x84, 0x34, 0x7c,
+	0x77, 0x7e, 0xcf, 0x27, 0x4d, 0x5f, 0x1d, 0xb4,
+	0xb4, 0xac, 0xcc, 0x7d, 0x83, 0xc2, 0x89, 0x3d,
+	0xeb, 0xb6, 0xa3, 0x57, 0x30, 0xbc, 0x94, 0x9f,
+	0xe9, 0x63, 0xca, 0x7d, 0xa3, 0x9d, 0x0a, 0x43,
+	0xed, 0x4a, 0xfd, 0xd3, 0x5e, 0x23, 0x97, 0x75,
+	0x28, 0x97, 0xaa, 0x0c, 0xf9, 0xa1, 0x03, 0xb1,
+	0x55, 0x82, 0xec, 0xcc, 0x91, 0x27, 0xf4, 0xcf,
+	0x63, 0x10, 0xf3, 0xd3, 0x8b, 0x5c, 0xa8, 0xc2,
+	0x58, 0x4d, 0xf5, 0x67, 0xe9, 0xe1, 0xc2, 0xf2,
+	0x11, 0x5e, 0xf2, 0xe1, 0x1c, 0xf2, 0x0c, 0x50,
+	0x71, 0x9f, 0xd1, 0x1c, 0xb8, 0x82, 0x7d, 0x3b,
+	0x23, 0x90, 0x4e, 0x08, 0xbf, 0x51, 0xa1, 0xc9,
+	0xe9, 0x90, 0x07, 0x4e, 0xb3, 0xcc, 0x72, 0xbf,
+	0x2c, 0x87, 0x18, 0x3b, 0xc7, 0x29, 0x8a, 0x3b,
+	0x0b, 0x4c, 0x55, 0x20, 0x08, 0xb0, 0xa3, 0x04,
+	0xf9, 0x6b, 0x53, 0x84, 0x4c, 0xef, 0xc1, 0xc6,
+	0xa4, 0xa9, 0xba, 0xe6, 0xb8, 0x72, 0x60, 0x6b,
+	0x2d, 0x25, 0x08, 0xc1, 0xd4, 0x4e, 0x0b, 0xcb,
+	0xe9, 0x71, 0x9b, 0x5a, 0x9a, 0x1e, 0x21, 0x9a,
+	0x0a, 0xd0, 0x52, 0x82, 0xe9, 0x31, 0x45, 0x9e,
+	0xe4, 0x85, 0x6b, 0xac, 0x8e, 0x7c, 0x73, 0x0c,
+	0x0d, 0xd6, 0x54, 0x27, 0x5a, 0xce, 0xc8, 0x07,
+	0x19, 0x84, 0x8b, 0xee, 0x0f, 0x6f, 0x8b, 0xbc,
+	0x0c, 0x1b, 0xe0, 0x08, 0x64, 0xa6, 0xe6, 0xe1,
+	0xf8, 0x56, 0x5e, 0xe8, 0x27, 0x7d, 0x26, 0xee,
+	0x20, 0x5e, 0x3d, 0x2e, 0x84, 0xdc, 0x50, 0xb0,
+	0x16, 0x3f, 0x8c, 0xec, 0xa9, 0xd3, 0x61, 0x85,
+	0x5a, 0xba, 0x02, 0x82, 0x65, 0x30, 0xdb, 0x23,
+	0x1c, 0xcb, 0xc3, 0xe6, 0x80, 0x5e, 0x4f, 0x6e,
+	0xd8, 0x3b, 0x5e, 0xce, 0x67, 0xbb, 0xdb, 0x22,
+	0xac, 0xf1, 0x32, 0x53, 0x6a, 0xd6, 0x43, 0x1a,
+	0xf0, 0x11, 0xc5, 0x0f, 0xc5, 0x12, 0xdf, 0xe6,
+	0x91, 0x8b, 0x15, 0xf4, 0x41, 0xd9, 0xe3, 0x51,
+};
+
+uint8_t mldsa_44_pubkey[] = {
+	0xcc, 0x2c, 0x93, 0xce, 0xfc, 0x0b, 0xf6, 0x74,
+	0x93, 0x28, 0x95, 0xe8, 0xc0, 0xc8, 0x83, 0xb8,
+	0xc9, 0x0c, 0x9a, 0x5c, 0x18, 0xd2, 0x79, 0x5c,
+	0xf3, 0x58, 0xd8, 0x02, 0x6c, 0x5e, 0xad, 0x79,
+	0xde, 0x77, 0x1a, 0xd3, 0x49, 0xc9, 0x12, 0xc9,
+	0xff, 0xcf, 0xa2, 0x6c, 0x1d, 0x37, 0x91, 0xa2,
+	0xf5, 0x43, 0xbc, 0xdb, 0x9e, 0xdb, 0xa5, 0xdb,
+	0xd9, 0x87, 0xc5, 0xf2, 0xf7, 0x79, 0x58, 0x4c,
+	0x08, 0x9f, 0x9c, 0xca, 0x9c, 0xef, 0xa8, 0x80,
+	0x27, 0x31, 0xf1, 0xc5, 0x0e, 0x2b, 0x6d, 0xa1,
+	0x53, 0x9e, 0x99, 0x1e, 0xc8, 0x75, 0x4a, 0x59,
+	0x27, 0x33, 0x41, 0xdd, 0x39, 0xff, 0x37, 0xdf,
+	0x5b, 0xb9, 0xe4, 0x56, 0x54, 0x28, 0x8e, 0xb1,
+	0xfe, 0xd8, 0x4e, 0x60, 0xcd, 0x22, 0xd7, 0x30,
+	0xe5, 0x73, 0xe4, 0xb1, 0x08, 0x0f, 0x0a, 0xbe,
+	0x9a, 0x44, 0xfd, 0xb1, 0xed, 0xb1, 0x8e, 0x0d,
+	0x7c, 0x3c, 0x3d, 0x04, 0x52, 0x4b, 0x93, 0xf4,
+	0xa6, 0xce, 0x8d, 0xb0, 0xe4, 0xf6, 0xb1, 0x09,
+	0xfc, 0xc3, 0x42, 0x3d, 0xff, 0x4c, 0x55, 0x3c,
+	0x73, 0x75, 0x35, 0x9d, 0xe8, 0x68, 0x42, 0x09,
+	0x14, 0x36, 0x91, 0x63, 0xfc, 0xc6, 0x23, 0x7c,
+	0x25, 0x81, 0xd5, 0xc1, 0xfe, 0xca, 0xf6, 0x71,
+	0x51, 0x8e, 0xab, 0x29, 0xa1, 0x86, 0xbb, 0x45,
+	0x43, 0x67, 0x7f, 0xdf, 0x7e, 0x92, 0xff, 0x35,
+	0x38, 0xd3, 0xea, 0x94, 0xc9, 0xa3, 0x0f, 0x46,
+	0x25, 0xa6, 0x1e, 0x00, 0x60, 0x7b, 0xc0, 0xbc,
+	0xe9, 0x5e, 0x16, 0x0e, 0x81, 0xf5, 0x4e, 0x98,
+	0xa1, 0x64, 0xb0, 0xb7, 0x02, 0xec, 0x73, 0xad,
+	0xf8, 0xc1, 0xce, 0x8b, 0x8f, 0xbd, 0x89, 0xbf,
+	0x0f, 0x42, 0x31, 0x6d, 0x75, 0x42, 0xd7, 0x59,
+	0x64, 0xad, 0x09, 0xd3, 0x7a, 0x00, 0x7b, 0xdd,
+	0x12, 0x76, 0xb0, 0x00, 0x73, 0x5b, 0xbf, 0x44,
+	0x54, 0x6e, 0x56, 0x26, 0xa5, 0x27, 0x4d, 0xff,
+	0xe5, 0x8a, 0x04, 0x73, 0xd9, 0x75, 0x8c, 0xf7,
+	0x06, 0x64, 0xfb, 0xa5, 0x00, 0x27, 0x39, 0x0e,
+	0x48, 0x8f, 0x73, 0x29, 0x61, 0x5f, 0x15, 0xf5,
+	0x08, 0x15, 0x33, 0xd1, 0x76, 0xba, 0xf3, 0x3e,
+	0x28, 0xb8, 0x57, 0xcd, 0x9d, 0x61, 0x1f, 0xca,
+	0xd7, 0xc3, 0x10, 0xdb, 0x68, 0xeb, 0xa4, 0x15,
+	0x40, 0xd8, 0xe7, 0xa0, 0xd2, 0xd1, 0xd6, 0xb1,
+	0xd3, 0x75, 0x8e, 0xc1, 0x60, 0x02, 0xb5, 0x69,
+	0xf2, 0x8c, 0xf3, 0xc6, 0x2e, 0x9d, 0xf7, 0x8d,
+	0xed, 0xb0, 0x01, 0xba, 0xb5, 0x62, 0x7e, 0x8f,
+	0x91, 0xbd, 0x73, 0xc6, 0x35, 0xf9, 0xdb, 0xea,
+	0x28, 0xce, 0x8a, 0x47, 0x74, 0x7c, 0x3d, 0x85,
+	0x4d, 0x1e, 0x11, 0x7e, 0xa2, 0xaa, 0x04, 0x30,
+	0x12, 0xce, 0xea, 0xc1, 0xc5, 0x1e, 0x62, 0x7a,
+	0x21, 0x6a, 0xd5, 0xb8, 0x3c, 0xa0, 0xd6, 0xca,
+	0xb4, 0x8d, 0xff, 0xc3, 0xfc, 0xf2, 0xf1, 0x3c,
+	0x87, 0x23, 0xef, 0x68, 0xe4, 0x37, 0x96, 0xb0,
+	0xbb, 0x78, 0xa3, 0x3a, 0xe0, 0xd0, 0x41, 0xeb,
+	0x4c, 0x80, 0x55, 0x9b, 0x66, 0x5e, 0x33, 0xea,
+	0x33, 0x35, 0x79, 0xda, 0x04, 0x81, 0x19, 0x22,
+	0xb4, 0x4c, 0x7a, 0xef, 0x51, 0x50, 0x20, 0x6c,
+	0xf8, 0xf7, 0x5f, 0x03, 0x74, 0x72, 0xda, 0x1f,
+	0xe3, 0x0b, 0x82, 0x71, 0x50, 0x3d, 0x02, 0x61,
+	0x16, 0x44, 0xeb, 0xcf, 0xe3, 0x23, 0x9d, 0xef,
+	0xec, 0xce, 0xb3, 0xd0, 0xd2, 0x19, 0xd1, 0xe0,
+	0x2e, 0x33, 0xde, 0x28, 0x4b, 0xde, 0x85, 0xc1,
+	0xb2, 0x8a, 0xa5, 0x82, 0x0c, 0xa6, 0x9f, 0x23,
+	0x53, 0xea, 0xef, 0x78, 0x60, 0x24, 0x3a, 0x40,
+	0xc0, 0xc1, 0xac, 0xc9, 0x64, 0xd4, 0x03, 0x5f,
+	0x61, 0xa5, 0xdf, 0x6f, 0x6b, 0x4e, 0xb2, 0xe7,
+	0x1a, 0xc6, 0x69, 0x69, 0xd9, 0xc6, 0x6e, 0x5d,
+	0xea, 0xd8, 0xc0, 0x29, 0xcc, 0x8f, 0x35, 0x7b,
+	0xcb, 0x48, 0x3a, 0xfd, 0xba, 0x7a, 0x90, 0xc7,
+	0x65, 0x55, 0xfc, 0x90, 0x98, 0x6c, 0x15, 0x38,
+	0x0e, 0x88, 0x6e, 0x08, 0x49, 0x85, 0xc6, 0x6d,
+	0x8f, 0x30, 0x37, 0xa1, 0x64, 0x79, 0xa1, 0x65,
+	0x2d, 0x07, 0x38, 0x3e, 0x1c, 0xa6, 0x12, 0xee,
+	0xc5, 0x16, 0x68, 0x5c, 0x93, 0x14, 0xda, 0x33,
+	0x3d, 0x74, 0x62, 0xf1, 0xcf, 0x0e, 0x81, 0x80,
+	0xda, 0xea, 0xa7, 0x08, 0xde, 0xf3, 0xdc, 0xfe,
+	0x3a, 0xf5, 0x60, 0xe9, 0x35, 0x95, 0x52, 0x6c,
+	0x7f, 0xef, 0x8b, 0xa7, 0x55, 0x3d, 0x42, 0xfd,
+	0x39, 0x24, 0xd2, 0xfb, 0x28, 0x08, 0x83, 0x2b,
+	0x44, 0xf1, 0x21, 0x73, 0x13, 0x88, 0xa7, 0xba,
+	0x2d, 0xd6, 0xe9, 0x4e, 0xcb, 0xfe, 0x18, 0xe4,
+	0xc7, 0x85, 0xf3, 0xb8, 0xab, 0xd0, 0xb9, 0xbe,
+	0x5e, 0x8a, 0x62, 0x0e, 0x61, 0xa3, 0x29, 0x1d,
+	0xef, 0x46, 0xe7, 0x70, 0x14, 0xb1, 0x9f, 0x07,
+	0xbf, 0x3f, 0x1f, 0xc8, 0x11, 0xe4, 0x2c, 0x39,
+	0x48, 0x0e, 0xcf, 0x92, 0x62, 0x4b, 0x1f, 0x0c,
+	0x2e, 0x29, 0x61, 0xef, 0x29, 0x67, 0x7c, 0x0f,
+	0xac, 0x99, 0xb2, 0x9a, 0x7d, 0xac, 0x7c, 0x54,
+	0xae, 0xed, 0x4b, 0xf5, 0x4a, 0x4b, 0xb4, 0x14,
+	0xad, 0x6d, 0xce, 0xce, 0xcc, 0x3f, 0xb8, 0x59,
+	0x71, 0x7c, 0xd4, 0x76, 0x7c, 0xe4, 0x68, 0xc6,
+	0x76, 0xa8, 0xe3, 0x03, 0x48, 0xb6, 0xe4, 0x11,
+	0x6c, 0x5f, 0xd4, 0x76, 0x80, 0xdf, 0x2c, 0x67,
+	0x00, 0x4c, 0xce, 0x22, 0x21, 0xff, 0xb0, 0x9b,
+	0xcb, 0x72, 0xd1, 0xe3, 0xa2, 0x32, 0x5c, 0x12,
+	0xda, 0x7c, 0x95, 0x5d, 0xb2, 0xae, 0x1b, 0x25,
+	0x2e, 0x5f, 0xe6, 0xff, 0x4c, 0xbf, 0x00, 0x16,
+	0xd0, 0x3c, 0xbf, 0x44, 0x92, 0x07, 0xa0, 0x0d,
+	0x13, 0xba, 0xb8, 0x62, 0x66, 0x0b, 0x14, 0x0f,
+	0x5a, 0x9d, 0x42, 0x19, 0xd7, 0xbe, 0xe3, 0x33,
+	0x53, 0xa2, 0x60, 0x2d, 0xde, 0x43, 0x85, 0x03,
+	0x96, 0x50, 0x83, 0x83, 0x25, 0x3c, 0x19, 0x20,
+	0x44, 0x5f, 0x3b, 0x5a, 0xc2, 0x90, 0xe1, 0x2d,
+	0x47, 0x53, 0x50, 0xeb, 0xf7, 0xc7, 0x46, 0x4c,
+	0xf2, 0xad, 0xb2, 0x8f, 0x03, 0x4e, 0x82, 0x5d,
+	0x0f, 0xa0, 0x3d, 0xde, 0x4d, 0x93, 0x34, 0xd0,
+	0x1a, 0xe2, 0x5d, 0xbc, 0xe5, 0x8d, 0xfb, 0x5a,
+	0xba, 0xe2, 0x24, 0xec, 0xc8, 0xd2, 0xa3, 0x91,
+	0xa2, 0xa9, 0x0e, 0x0e, 0xf5, 0xfb, 0x9f, 0xed,
+	0x69, 0x21, 0x9d, 0x00, 0x92, 0xb5, 0x94, 0x0f,
+	0x38, 0x94, 0x29, 0xf9, 0xe7, 0xaa, 0xf1, 0xf7,
+	0x20, 0x10, 0xf0, 0xeb, 0x26, 0x96, 0x5a, 0x0e,
+	0x99, 0x8d, 0x71, 0xef, 0xb2, 0xa0, 0xf3, 0x38,
+	0xce, 0xf9, 0x99, 0x6f, 0x96, 0xbb, 0xa5, 0x55,
+	0x27, 0x5c, 0xf5, 0xf8, 0x63, 0xf7, 0xf8, 0x0a,
+	0x31, 0xee, 0x01, 0xa8, 0xc9, 0x0c, 0xbd, 0x73,
+	0x62, 0x21, 0xa7, 0x1c, 0xd1, 0x62, 0xe5, 0xdd,
+	0x43, 0x95, 0x4d, 0x60, 0x11, 0x65, 0x6c, 0xfa,
+	0x67, 0x9a, 0x2f, 0x24, 0x1e, 0xbd, 0x10, 0xc4,
+	0xe5, 0x23, 0x6f, 0x02, 0x76, 0x51, 0xd6, 0xe3,
+	0xad, 0x88, 0xda, 0xc4, 0xd9, 0x6a, 0x8f, 0xf7,
+	0xd2, 0x50, 0xdf, 0x9a, 0xad, 0x21, 0xc7, 0x5b,
+	0x47, 0x83, 0xf6, 0xc8, 0xcb, 0x0a, 0xd5, 0x28,
+	0x91, 0x3f, 0x18, 0x44, 0x62, 0x81, 0xfb, 0xcf,
+	0x51, 0x5d, 0xa1, 0xf5, 0x46, 0x74, 0x0d, 0x32,
+	0x21, 0x55, 0x1b, 0x8a, 0xf3, 0xd0, 0x4f, 0x41,
+	0x86, 0xc3, 0x55, 0x0b, 0x1c, 0xd9, 0x56, 0x2f,
+	0xcf, 0xe7, 0x9f, 0x06, 0x73, 0x82, 0xc2, 0x30,
+	0x7a, 0xc2, 0x01, 0xa2, 0x1e, 0xeb, 0x5d, 0x77,
+	0x7f, 0xbe, 0xee, 0xf4, 0x8a, 0x1b, 0x3b, 0xe3,
+	0x2d, 0xd5, 0x3e, 0x3b, 0x40, 0x82, 0xd6, 0x60,
+	0x86, 0x2f, 0xe9, 0xac, 0xc3, 0x65, 0xa5, 0xa3,
+	0x8c, 0x54, 0x51, 0x1f, 0x8e, 0x89, 0x19, 0xdd,
+	0xc5, 0x4a, 0xc0, 0xa2, 0x8b, 0xe5, 0x80, 0xfd,
+	0xa1, 0xd8, 0xe9, 0x15, 0xa0, 0x94, 0xd7, 0x9e,
+	0xe2, 0xf1, 0x83, 0x52, 0xf3, 0x0e, 0x34, 0x2f,
+	0x85, 0x67, 0x49, 0x73, 0x67, 0xb9, 0xb5, 0xd5,
+	0x0c, 0x1d, 0x03, 0x8e, 0x68, 0x57, 0x8d, 0xd2,
+	0x33, 0x44, 0x94, 0x28, 0x5b, 0xfa, 0xe0, 0x2b,
+	0x80, 0xd9, 0x96, 0x85, 0x6e, 0x0a, 0x2a, 0xdd,
+	0x9b, 0x5b, 0x55, 0x5a, 0x31, 0xb6, 0xfe, 0x3e,
+	0x0a, 0x41, 0x28, 0x20, 0xa7, 0xde, 0x31, 0xbe,
+	0x73, 0xcb, 0xbc, 0xbb, 0x50, 0xf8, 0x58, 0x74,
+	0xb1, 0x6b, 0x3f, 0x9a, 0x6c, 0x5e, 0x02, 0x87,
+	0x8d, 0x19, 0xa1, 0xd3, 0x6a, 0xc2, 0x91, 0x82,
+	0x3e, 0x0c, 0x90, 0xb8, 0xa6, 0x95, 0x23, 0x4e,
+	0xb9, 0x2d, 0x4d, 0x6c, 0xfb, 0xd7, 0x5e, 0xdf,
+	0xca, 0x06, 0x9b, 0x94, 0xb7, 0xfc, 0xbc, 0xad,
+	0x39, 0x5d, 0x43, 0xcb, 0x1c, 0x7d, 0x3c, 0x95,
+	0x3f, 0xf4, 0x47, 0x04, 0x1f, 0xfc, 0x8b, 0x23,
+	0xe7, 0xcf, 0x24, 0x6f, 0x40, 0x9b, 0xa5, 0x56,
+	0xcd, 0x69, 0x9e, 0x1f, 0x5a, 0xa0, 0x3b, 0x8f,
+	0x3e, 0x1c, 0xe7, 0x42, 0xc9, 0x66, 0xee, 0x99,
+	0x13, 0xb1, 0x4f, 0x65, 0x86, 0xba, 0xf0, 0x87,
+	0x81, 0x6f, 0x44, 0x08, 0xb4, 0x18, 0xac, 0xb6,
+	0xd3, 0x96, 0x68, 0xd4, 0x88, 0x89, 0xf2, 0xa2,
+	0xd6, 0x2f, 0xfe, 0x7e, 0x49, 0xb3, 0x9c, 0xc9,
+	0xaf, 0xd9, 0x28, 0xa8, 0x96, 0xc9, 0x2d, 0x26,
+	0x5b, 0xc7, 0xef, 0x66, 0x08, 0xd2, 0x38, 0x4f,
+	0x10, 0xb3, 0x83, 0x15, 0xf6, 0x00, 0x83, 0x3f,
+	0x20, 0xfe, 0xa8, 0x44, 0x6b, 0x62, 0x3b, 0x17,
+	0x39, 0x2e, 0xec, 0x5e, 0x78, 0xbe, 0xec, 0x16,
+	0x29, 0xa6, 0x79, 0x4c, 0x08, 0x75, 0xc8, 0x78,
+	0x3e, 0xc0, 0x05, 0xe9, 0xbb, 0x47, 0x94, 0xae,
+	0xaf, 0xa5, 0xbb, 0xb8, 0x47, 0x31, 0xf7, 0xe9,
+	0xb8, 0x1e, 0x6c, 0xda, 0x26, 0xc5, 0xf3, 0x26,
+	0x89, 0xd5, 0x04, 0x23, 0x0b, 0x11, 0x84, 0x8f,
+};
+
+uint8_t mldsa_44_sign[] = {
+	0x3E, 0xDD, 0xD2, 0x34, 0x62, 0x78, 0xEC, 0x19,
+	0x9F, 0xAA, 0xEC, 0x89, 0x99, 0x78, 0x31, 0xCB,
+	0x82, 0x0B, 0xE6, 0x46, 0x8D, 0x24, 0x9A, 0xD3,
+	0x69, 0xB7, 0x01, 0x85, 0x93, 0x75, 0xD0, 0xBE,
+	0xEA, 0x1F, 0x76, 0xFB, 0xB4, 0x6D, 0xC9, 0x64,
+	0xD4, 0x44, 0x68, 0x5D, 0xAD, 0x09, 0x69, 0xFC,
+	0x31, 0x2F, 0xD1, 0xFA, 0xEF, 0xF2, 0x1D, 0x2E,
+	0xB6, 0xA5, 0xA9, 0xFD, 0x31, 0x04, 0x68, 0x1E,
+	0x0B, 0xEC, 0xF4, 0x23, 0x4C, 0x9F, 0xC9, 0xD6,
+	0x27, 0x8D, 0xE1, 0xAA, 0x29, 0x38, 0x16, 0x65,
+	0x7E, 0x38, 0x5A, 0x30, 0xFC, 0xD9, 0xBF, 0x63,
+	0x3B, 0x82, 0xFE, 0x0D, 0x68, 0xD4, 0x52, 0x55,
+	0xBE, 0x86, 0x69, 0xCF, 0x75, 0x26, 0x2C, 0xB9,
+	0x1D, 0x66, 0x39, 0x4C, 0x89, 0xAC, 0x36, 0xBF,
+	0x34, 0x27, 0xCC, 0x7E, 0x6C, 0xC5, 0xBB, 0xFB,
+	0x78, 0x03, 0x39, 0x61, 0xD8, 0x76, 0x63, 0x6E,
+	0x6B, 0x68, 0x02, 0x43, 0x44, 0x57, 0x2E, 0x39,
+	0x9E, 0x9D, 0x64, 0x77, 0x8E, 0x8B, 0x79, 0x36,
+	0xCE, 0xE6, 0xBC, 0x6D, 0x80, 0xC8, 0x04, 0x81,
+	0x2A, 0x04, 0xD4, 0xEF, 0x63, 0xE1, 0x3F, 0xC4,
+	0xC1, 0x54, 0xD5, 0xAB, 0xE4, 0xEC, 0x65, 0xB0,
+	0xF0, 0x1A, 0xB2, 0x32, 0x9A, 0xB8, 0x51, 0xD4,
+	0x43, 0xFE, 0x81, 0x4F, 0xBD, 0x5D, 0xEE, 0xDE,
+	0x24, 0xAC, 0xBC, 0x22, 0x9B, 0x80, 0xB7, 0xE8,
+	0x22, 0x4B, 0x1B, 0x23, 0x89, 0x8C, 0xFE, 0xE3,
+	0x30, 0x35, 0xA2, 0x0B, 0x4E, 0x66, 0x64, 0xFE,
+	0x57, 0x68, 0xCF, 0xF5, 0xE5, 0x11, 0xB9, 0xB6,
+	0x3A, 0x2B, 0x15, 0x0D, 0xA4, 0x11, 0xE1, 0x01,
+	0x96, 0x06, 0x5D, 0x47, 0xCC, 0x04, 0x63, 0xB3,
+	0xC7, 0xDD, 0x0F, 0x4A, 0x0A, 0x90, 0x9C, 0x0C,
+	0x61, 0x1D, 0x4C, 0x21, 0x32, 0xD6, 0xE9, 0xDD,
+	0x0F, 0x91, 0xA4, 0xD1, 0x30, 0x14, 0x1C, 0x48,
+	0xEC, 0xF4, 0x4F, 0x02, 0x7B, 0x1E, 0x25, 0x3A,
+	0x7C, 0x6B, 0x42, 0x13, 0xF7, 0xBC, 0xB5, 0x02,
+	0xA9, 0x20, 0x85, 0x21, 0x01, 0x67, 0xC3, 0xDD,
+	0x6C, 0x6D, 0xD3, 0xC9, 0x6F, 0x13, 0x75, 0xDD,
+	0x1D, 0xD7, 0xE7, 0xF3, 0x34, 0x17, 0x37, 0xFF,
+	0xE6, 0x3B, 0xB5, 0x1F, 0xEE, 0x51, 0x73, 0x6D,
+	0x9E, 0xB7, 0xE2, 0xE7, 0xA1, 0x65, 0xE4, 0x29,
+	0x8E, 0xBF, 0x66, 0xCE, 0x5E, 0xD4, 0xBA, 0x0C,
+	0x18, 0x84, 0xBE, 0xAE, 0x9A, 0x17, 0x0D, 0xAE,
+	0x55, 0x90, 0x7F, 0x72, 0x73, 0xAB, 0x9F, 0x87,
+	0xCC, 0x3D, 0xCB, 0xE4, 0x38, 0x66, 0x92, 0xEE,
+	0x6D, 0xE9, 0x0B, 0x8A, 0xE2, 0x5F, 0x68, 0x9D,
+	0x06, 0xFD, 0xF3, 0x77, 0x4B, 0x50, 0xCD, 0x0E,
+	0x2B, 0xE1, 0xD3, 0xB4, 0xF4, 0x02, 0xF5, 0x9B,
+	0x5F, 0x3E, 0x59, 0xD7, 0x57, 0x9D, 0x87, 0x80,
+	0x60, 0xEB, 0x70, 0xF5, 0x34, 0x56, 0x46, 0x5B,
+	0xBA, 0x8F, 0x90, 0xAE, 0x9F, 0x6B, 0x43, 0x8C,
+	0x51, 0x45, 0xD2, 0x16, 0x4C, 0xBA, 0x86, 0xF0,
+	0xF4, 0xD5, 0x34, 0x6A, 0x3E, 0x5F, 0xAE, 0xBE,
+	0x95, 0x40, 0xFE, 0x26, 0x4D, 0x5E, 0x60, 0x4E,
+	0xD9, 0xEB, 0x47, 0x7D, 0x43, 0x63, 0x5F, 0x4B,
+	0xB1, 0xCE, 0x7E, 0xA2, 0xF0, 0xC9, 0x30, 0x0C,
+	0xB7, 0x13, 0x43, 0xC0, 0xF8, 0x02, 0x6C, 0xD2,
+	0x5F, 0xCE, 0x25, 0xF3, 0xAE, 0xC3, 0x2D, 0xC3,
+	0x13, 0xAE, 0x49, 0x8B, 0x82, 0x82, 0x44, 0xD0,
+	0x50, 0xF8, 0x00, 0x5E, 0xAC, 0xDE, 0x4B, 0x88,
+	0xC2, 0x38, 0x5C, 0xC3, 0x65, 0xF4, 0x25, 0x63,
+	0x29, 0xC3, 0xB0, 0x7A, 0x45, 0x5D, 0x43, 0x89,
+	0xCA, 0x5A, 0x12, 0x61, 0xD8, 0x92, 0x65, 0x1B,
+	0x0F, 0xBF, 0x62, 0xB9, 0xA6, 0xF2, 0xA8, 0xA7,
+	0x06, 0xAC, 0x02, 0xA4, 0xC6, 0x25, 0xD6, 0xC5,
+	0xD2, 0xDE, 0x87, 0x88, 0x11, 0xBD, 0x7C, 0x87,
+	0x91, 0xA9, 0x91, 0x60, 0x1F, 0x0F, 0xF0, 0x24,
+	0xFE, 0xA0, 0xEB, 0xDC, 0x89, 0x68, 0x84, 0x10,
+	0xD7, 0x55, 0xC1, 0x3A, 0xCA, 0x1F, 0xFF, 0x77,
+	0x41, 0xA1, 0xDB, 0x13, 0x31, 0xEF, 0x9C, 0xA3,
+	0xA2, 0x3A, 0x37, 0x1B, 0xF9, 0x46, 0xF8, 0x51,
+	0x15, 0xB3, 0x0A, 0x12, 0x64, 0x3F, 0xE5, 0xA8,
+	0x07, 0xA2, 0x57, 0x87, 0x2A, 0x3F, 0xD2, 0x87,
+	0xDB, 0xC0, 0x33, 0xAC, 0xF5, 0x28, 0x42, 0xC5,
+	0xD4, 0x20, 0x27, 0xAE, 0x57, 0xAF, 0x6C, 0x74,
+	0x8A, 0xA0, 0x90, 0xEE, 0x34, 0xE9, 0x19, 0xB9,
+	0x0E, 0xDF, 0x4D, 0xDE, 0x77, 0x66, 0xC4, 0xBC,
+	0x99, 0x59, 0x14, 0xCB, 0x9D, 0xBF, 0xBC, 0x5F,
+	0xFF, 0x2B, 0xA7, 0xED, 0x29, 0x49, 0x13, 0x6C,
+	0x2B, 0x71, 0x58, 0xC2, 0xC4, 0x67, 0xCB, 0x6A,
+	0x18, 0x6F, 0x4E, 0x88, 0xB9, 0x76, 0xC8, 0x6B,
+	0xDC, 0x6A, 0x05, 0xA5, 0x22, 0x31, 0x15, 0xCE,
+	0x54, 0xDA, 0xE8, 0x0E, 0xED, 0xDF, 0x46, 0x90,
+	0x93, 0x9A, 0xE6, 0x2B, 0x45, 0xA4, 0x51, 0x42,
+	0x29, 0x05, 0xA9, 0xFF, 0x29, 0xBE, 0x4F, 0x6E,
+	0xE7, 0x52, 0x2C, 0x16, 0x3F, 0x95, 0x94, 0x7B,
+	0xE6, 0xE1, 0xF7, 0x9F, 0x36, 0x1F, 0xEE, 0x46,
+	0xA9, 0xE3, 0x71, 0x37, 0x08, 0xF7, 0x63, 0xAF,
+	0x16, 0xB9, 0x43, 0x86, 0xAC, 0xC7, 0x5D, 0x5B,
+	0x73, 0x38, 0x08, 0x2C, 0xC6, 0x65, 0x02, 0xC8,
+	0x70, 0x71, 0x01, 0xA7, 0xD3, 0xA6, 0xB9, 0x74,
+	0xAA, 0x71, 0x3B, 0x1B, 0xEF, 0x84, 0xA9, 0x77,
+	0x91, 0x82, 0x7F, 0xB7, 0x3D, 0x2E, 0x8B, 0xD5,
+	0x4D, 0xAD, 0x29, 0xAC, 0x51, 0x9E, 0xDB, 0xF0,
+	0x4A, 0x1D, 0x29, 0x82, 0x04, 0x9E, 0x03, 0x8C,
+	0x74, 0x66, 0x12, 0x75, 0xD0, 0x77, 0x07, 0xCC,
+	0x7E, 0x8D, 0x19, 0x2F, 0x42, 0xFA, 0xB7, 0xBD,
+	0x7E, 0x77, 0xEF, 0xF1, 0x35, 0xAF, 0x7C, 0xFF,
+	0x52, 0x5F, 0xDB, 0x03, 0x99, 0x0D, 0x89, 0x8A,
+	0x60, 0x61, 0x42, 0xC2, 0xE7, 0x33, 0x58, 0xE7,
+	0x40, 0x90, 0x46, 0x84, 0xD5, 0x4B, 0x30, 0x88,
+	0xA7, 0xBB, 0x25, 0xDE, 0x02, 0xFE, 0x57, 0x93,
+	0xFD, 0xD0, 0x6E, 0xA2, 0xFE, 0x38, 0xA3, 0x5E,
+	0x6C, 0x35, 0x06, 0xC4, 0xC6, 0x8C, 0x9C, 0x37,
+	0x3B, 0x6A, 0x1D, 0x91, 0xCB, 0x84, 0x03, 0x47,
+	0x85, 0xC7, 0x1D, 0x82, 0xEE, 0xB5, 0xF8, 0xEC,
+	0x29, 0xDE, 0x30, 0x76, 0x32, 0x08, 0x6A, 0x75,
+	0x43, 0x6A, 0xB8, 0x4C, 0x5D, 0x5A, 0x54, 0xC2,
+	0xE3, 0x58, 0x43, 0x6E, 0x90, 0xCE, 0x51, 0xEB,
+	0xE2, 0xFD, 0x68, 0xAE, 0xB3, 0xBA, 0x80, 0xB4,
+	0x03, 0x84, 0x26, 0x4E, 0xAB, 0x7B, 0x15, 0x2D,
+	0xDE, 0xB0, 0x7B, 0xF3, 0x4D, 0xFB, 0x6A, 0xFC,
+	0xE3, 0x47, 0xFC, 0x9C, 0x34, 0xC8, 0xB2, 0x10,
+	0x46, 0xCC, 0x5F, 0x0A, 0xC6, 0xEB, 0x48, 0x47,
+	0xFF, 0x73, 0x75, 0xD0, 0x7C, 0xBF, 0x44, 0xCB,
+	0xAE, 0x8A, 0x30, 0x0B, 0x3F, 0x58, 0x11, 0x51,
+	0x32, 0xD5, 0x7C, 0xCC, 0xB5, 0xDB, 0xD9, 0x21,
+	0xD0, 0x6C, 0x29, 0xE2, 0xD0, 0xE1, 0xB2, 0xC8,
+	0x06, 0x29, 0xC0, 0xC8, 0x5B, 0xB2, 0x3A, 0x66,
+	0x7A, 0x25, 0x13, 0x57, 0x80, 0x14, 0x5B, 0x31,
+	0xC4, 0x7B, 0x21, 0xB5, 0x50, 0x9C, 0x76, 0x6B,
+	0x8C, 0x16, 0xF7, 0x95, 0xA1, 0x79, 0x6B, 0xA8,
+	0x22, 0x13, 0xD5, 0x32, 0x15, 0x3E, 0xFC, 0x55,
+	0x80, 0xD2, 0x71, 0xD1, 0x59, 0x15, 0xDA, 0xFC,
+	0x55, 0x75, 0xE7, 0x7E, 0x15, 0x48, 0xD9, 0x73,
+	0x0D, 0x6A, 0x31, 0x8A, 0x1C, 0x86, 0x4A, 0x31,
+	0x57, 0x5B, 0x0A, 0x9D, 0xE4, 0x8C, 0x80, 0x7F,
+	0x0E, 0x07, 0x36, 0x38, 0x7C, 0xEA, 0x3C, 0xBD,
+	0xBD, 0xD1, 0xAA, 0xE7, 0xE4, 0x43, 0xB2, 0xFC,
+	0x26, 0x39, 0x4F, 0xCC, 0xE6, 0xB8, 0xD7, 0x90,
+	0xC3, 0x5F, 0xAA, 0xEA, 0x78, 0xC6, 0xD7, 0x58,
+	0x15, 0x7D, 0x27, 0xD0, 0x7E, 0x0F, 0x13, 0x0D,
+	0x47, 0x49, 0x28, 0x5B, 0xD7, 0xBC, 0x41, 0xB5,
+	0x66, 0x38, 0x29, 0xB4, 0x71, 0xEC, 0xA2, 0xDE,
+	0xE3, 0xE0, 0x4C, 0x27, 0xB4, 0x2C, 0xEE, 0xF1,
+	0x5F, 0x37, 0x81, 0xCE, 0x31, 0x42, 0x87, 0x44,
+	0x39, 0x7B, 0x35, 0xCF, 0xE8, 0x7D, 0x5E, 0xD7,
+	0xA3, 0x3D, 0xB9, 0x92, 0x95, 0x8C, 0x25, 0xC6,
+	0xC9, 0xBC, 0x46, 0x4E, 0x03, 0x70, 0x29, 0x4B,
+	0x79, 0xB8, 0xEF, 0x54, 0x98, 0x8B, 0x9A, 0x45,
+	0x09, 0x8C, 0x43, 0xD1, 0x9B, 0x29, 0xEA, 0xDE,
+	0xF2, 0x25, 0x10, 0xA6, 0xF9, 0x2C, 0xC8, 0x90,
+	0x49, 0xA5, 0x3C, 0xDC, 0xCE, 0xA3, 0x98, 0xF1,
+	0x4C, 0xC6, 0x3E, 0xE0, 0x21, 0x58, 0x1A, 0x39,
+	0xDA, 0x50, 0x2A, 0x6A, 0x18, 0x49, 0xC9, 0xA1,
+	0x9D, 0xF3, 0xF4, 0xFB, 0xDD, 0x6F, 0x8D, 0xF4,
+	0xFE, 0x61, 0xA0, 0xC6, 0xF5, 0x58, 0x89, 0xAE,
+	0xEC, 0xC6, 0xE0, 0x88, 0x4A, 0x07, 0x6F, 0x11,
+	0x72, 0x5A, 0x6D, 0x3E, 0x08, 0x64, 0x3E, 0x23,
+	0x7D, 0x9A, 0x74, 0xB3, 0xC3, 0xDA, 0xA7, 0x29,
+	0x0E, 0xC1, 0x37, 0xB0, 0x04, 0x42, 0x47, 0x01,
+	0x80, 0x4B, 0xC0, 0x35, 0x49, 0x19, 0xB1, 0xDB,
+	0x51, 0x51, 0x09, 0x90, 0x08, 0xB2, 0xC4, 0x5C,
+	0xA0, 0xD6, 0x6E, 0x09, 0xFF, 0xA0, 0xC6, 0x4F,
+	0x32, 0x95, 0x84, 0xBE, 0xAA, 0x4A, 0x0A, 0x36,
+	0x83, 0xD3, 0x0C, 0xB7, 0xE0, 0xD0, 0x24, 0xE9,
+	0x0A, 0x2F, 0x0F, 0xB4, 0x3A, 0x2F, 0xCE, 0x34,
+	0xE5, 0xF0, 0x67, 0x07, 0x72, 0x52, 0x24, 0xE9,
+	0x9F, 0xBF, 0xDE, 0x40, 0x95, 0xAD, 0x74, 0x41,
+	0x4A, 0x00, 0x07, 0xEB, 0x14, 0xDD, 0xC4, 0xA2,
+	0x37, 0x72, 0x83, 0xE7, 0xD6, 0x20, 0xF5, 0xC6,
+	0x86, 0x97, 0xC5, 0x64, 0x58, 0x1B, 0x57, 0x5F,
+	0x9D, 0x06, 0x1D, 0xB5, 0x2D, 0x26, 0xBA, 0xE4,
+	0x49, 0x71, 0x08, 0xBD, 0x21, 0xC4, 0xA9, 0xF3,
+	0x26, 0x7A, 0x28, 0xD6, 0x81, 0x20, 0xCD, 0x9C,
+	0xED, 0xB8, 0xDC, 0x45, 0x33, 0xC0, 0x54, 0x5C,
+	0x3A, 0xF5, 0xC5, 0x1B, 0x19, 0x10, 0xCA, 0xDF,
+	0x99, 0xD4, 0xEE, 0x25, 0xD6, 0x71, 0x24, 0x4D,
+	0xFF, 0x14, 0x85, 0x58, 0x07, 0xC8, 0x3F, 0xD6,
+	0x55, 0x1C, 0xBF, 0xF8, 0x94, 0x31, 0x04, 0x83,
+	0xEC, 0xD1, 0xF5, 0x20, 0x72, 0xC3, 0xE9, 0xB1,
+	0x8A, 0x00, 0x0B, 0x94, 0x53, 0x4C, 0x01, 0x8C,
+	0xDE, 0x80, 0x59, 0x66, 0x72, 0x2D, 0xC5, 0x78,
+	0xAC, 0x4A, 0xAD, 0x4F, 0x14, 0xC1, 0x78, 0x87,
+	0x5F, 0xDF, 0xF2, 0x95, 0xCF, 0x8F, 0x3F, 0xA6,
+	0xCC, 0xAA, 0x1E, 0xD8, 0xA8, 0x37, 0xAD, 0x5B,
+	0xA5, 0x6D, 0xBC, 0x81, 0xAC, 0xCD, 0xFD, 0x56,
+	0x9E, 0x8B, 0xB9, 0xEC, 0x7E, 0x82, 0x4E, 0x55,
+	0x05, 0xFD, 0x9F, 0xDC, 0x0A, 0xF7, 0xBD, 0x3F,
+	0xEA, 0x42, 0x9D, 0x7E, 0xAB, 0x09, 0xDF, 0x3D,
+	0xA3, 0x8C, 0x63, 0x78, 0x81, 0x8F, 0x46, 0x9F,
+	0x12, 0xB8, 0x8A, 0xA5, 0xE4, 0xE9, 0x73, 0x95,
+	0x37, 0xD3, 0x39, 0xFE, 0x9B, 0x69, 0x58, 0x05,
+	0x5B, 0x30, 0x09, 0x31, 0x8B, 0xD9, 0xDB, 0xAE,
+	0x96, 0x93, 0x96, 0xDF, 0xC0, 0x70, 0x1D, 0xFF,
+	0x5D, 0x60, 0x72, 0x5A, 0xDD, 0xC2, 0x3D, 0xCF,
+	0x13, 0xA0, 0x36, 0x38, 0xF4, 0x3A, 0x03, 0x15,
+	0x48, 0xF0, 0xB1, 0x4A, 0x12, 0x72, 0xBA, 0x6B,
+	0xE2, 0xD6, 0x4E, 0x57, 0x22, 0x87, 0x2F, 0xE7,
+	0x40, 0x1B, 0x22, 0xF3, 0x4A, 0xE7, 0xB1, 0xA4,
+	0x28, 0xC7, 0xBB, 0x17, 0x5E, 0x0C, 0x03, 0xE3,
+	0xF4, 0x67, 0x25, 0xB2, 0xBB, 0xE6, 0x4E, 0xCD,
+	0x8A, 0x39, 0xC6, 0x05, 0xB7, 0x14, 0x10, 0xF4,
+	0x36, 0xE9, 0x8A, 0xC3, 0x41, 0xD3, 0x30, 0xAD,
+	0x79, 0x56, 0xE2, 0xC3, 0x55, 0xFC, 0x05, 0x3B,
+	0xD0, 0x83, 0x31, 0xE7, 0xA1, 0x85, 0xBE, 0x6C,
+	0xAF, 0x9D, 0xA6, 0x26, 0xC4, 0x7A, 0x4B, 0xD8,
+	0x26, 0xA7, 0x59, 0xBB, 0x8D, 0x6E, 0x15, 0x96,
+	0x84, 0x08, 0x0B, 0xDF, 0x29, 0x2D, 0x74, 0xD9,
+	0xAD, 0xFE, 0xC1, 0x3A, 0x84, 0x4E, 0xCE, 0x8F,
+	0x00, 0x9A, 0x50, 0xB8, 0x6F, 0x02, 0xE6, 0xEC,
+	0xA9, 0xE6, 0x1F, 0x71, 0x6A, 0x48, 0x98, 0x61,
+	0x3B, 0xC1, 0x37, 0x5A, 0x2E, 0xF3, 0xE0, 0xD6,
+	0x11, 0x0C, 0x15, 0x39, 0x7B, 0xFB, 0x37, 0xAF,
+	0x7A, 0xCA, 0xD6, 0x10, 0xDE, 0x95, 0x6A, 0xC6,
+	0x19, 0xEC, 0x21, 0x51, 0xCE, 0xAE, 0x8F, 0x5A,
+	0xEE, 0xEF, 0xB2, 0x9C, 0xF7, 0x4F, 0x5A, 0xB4,
+	0x90, 0xED, 0xB0, 0x64, 0x59, 0x95, 0xC5, 0x32,
+	0xC1, 0x85, 0xD7, 0x7E, 0x6C, 0xC6, 0x76, 0x11,
+	0x4B, 0xB5, 0x17, 0x1D, 0xEE, 0x15, 0xFF, 0xD3,
+	0xC7, 0xBB, 0xAA, 0x3C, 0x5D, 0x4D, 0x03, 0x82,
+	0xC0, 0xC7, 0xEA, 0xD0, 0xD8, 0x1B, 0xFF, 0x3C,
+	0x1D, 0x5A, 0x3F, 0xBD, 0x81, 0x66, 0x62, 0x6E,
+	0xB3, 0xF5, 0x5F, 0xF0, 0x43, 0x90, 0x01, 0x71,
+	0xDD, 0xB6, 0x0F, 0x60, 0xCE, 0xFB, 0x17, 0x21,
+	0x5A, 0x7F, 0x0C, 0x69, 0x82, 0x9D, 0x4C, 0xF3,
+	0x30, 0x1A, 0xF7, 0x1E, 0x85, 0x1A, 0x89, 0x84,
+	0xF3, 0x4E, 0x8F, 0x15, 0x60, 0x43, 0x6D, 0x3A,
+	0x5B, 0x07, 0xC0, 0x78, 0x6A, 0x02, 0xB4, 0x98,
+	0x3D, 0xAB, 0xAC, 0x25, 0x55, 0xC8, 0x49, 0x7E,
+	0xC9, 0x04, 0x73, 0xAF, 0x0D, 0x17, 0x1A, 0xA6,
+	0xBE, 0xD8, 0x11, 0x69, 0x4F, 0x17, 0x39, 0xF3,
+	0x57, 0x53, 0x1F, 0xD5, 0x1B, 0x15, 0x89, 0x53,
+	0x54, 0xB1, 0x9F, 0xFD, 0x52, 0x92, 0xA8, 0x98,
+	0xD4, 0x7B, 0xEE, 0x43, 0xC6, 0x31, 0xDE, 0xEC,
+	0xDC, 0xE5, 0x1D, 0x90, 0x37, 0x63, 0xA1, 0xF8,
+	0x42, 0x52, 0x8A, 0x73, 0x8B, 0x3D, 0x42, 0x85,
+	0x64, 0x5C, 0xA9, 0xCC, 0xA1, 0xCD, 0xEB, 0x9E,
+	0x2A, 0xF5, 0x21, 0x9E, 0x81, 0xC6, 0x2D, 0xD7,
+	0x22, 0xC2, 0xEE, 0x47, 0x7E, 0xDA, 0x60, 0x26,
+	0xFA, 0xE9, 0xB1, 0x81, 0x01, 0x77, 0xD3, 0x42,
+	0xDD, 0x03, 0x65, 0x74, 0x2B, 0x85, 0x49, 0x9A,
+	0xA5, 0x27, 0x76, 0x49, 0xF1, 0x72, 0x5E, 0xDF,
+	0xB7, 0xAD, 0x19, 0x1A, 0x58, 0x89, 0x56, 0x5C,
+	0x61, 0x03, 0xC7, 0x42, 0x84, 0xF2, 0x9E, 0x9E,
+	0x09, 0x2A, 0x2D, 0x3B, 0xAE, 0x6A, 0x8E, 0x9A,
+	0x87, 0x70, 0x16, 0x0A, 0xF1, 0xA9, 0xEA, 0xD2,
+	0xF3, 0x2A, 0xA3, 0xB0, 0x32, 0xD3, 0x28, 0x92,
+	0x19, 0x02, 0x77, 0xB2, 0x26, 0x1B, 0xC0, 0x59,
+	0x1A, 0x67, 0x4B, 0x51, 0x04, 0x83, 0x25, 0xF6,
+	0x4E, 0xA3, 0x92, 0x55, 0xCD, 0x74, 0xF5, 0x23,
+	0x98, 0xB7, 0xB9, 0x75, 0xA6, 0xDC, 0x4E, 0xD2,
+	0x93, 0x39, 0x94, 0xA3, 0xCD, 0xF8, 0xD5, 0xA4,
+	0xA9, 0x3C, 0x97, 0xED, 0x18, 0x54, 0xBB, 0x59,
+	0x7E, 0x75, 0xE3, 0xEE, 0x5A, 0x36, 0x53, 0x3D,
+	0x02, 0xFB, 0x47, 0xE6, 0x10, 0x1D, 0xDF, 0x21,
+	0xDA, 0x44, 0x66, 0x05, 0x81, 0xC4, 0xE9, 0x3B,
+	0xD5, 0x56, 0xC5, 0xAD, 0x50, 0x7A, 0xE1, 0xAA,
+	0x91, 0x7F, 0x7C, 0x4E, 0x85, 0xCC, 0xDC, 0x4A,
+	0xBD, 0x72, 0x1F, 0x3F, 0x21, 0x93, 0x98, 0x21,
+	0xB8, 0xCC, 0x21, 0x00, 0x24, 0x13, 0xAB, 0x63,
+	0xC1, 0x31, 0xCA, 0x1C, 0x67, 0x0C, 0x0E, 0x5A,
+	0x62, 0xC3, 0x1E, 0x6D, 0x63, 0x9B, 0xDA, 0x7F,
+	0x92, 0xC4, 0x64, 0x8B, 0xC7, 0x80, 0x04, 0x05,
+	0x36, 0x06, 0xCE, 0xF7, 0x37, 0x3A, 0xA8, 0xDF,
+	0x2C, 0x61, 0x46, 0x48, 0x2A, 0x5C, 0xDC, 0xBB,
+	0x34, 0x16, 0xDA, 0x59, 0x0D, 0x5B, 0xE5, 0x08,
+	0x05, 0xAF, 0x59, 0x86, 0x34, 0x56, 0x88, 0x4F,
+	0xAF, 0xA0, 0x28, 0xC4, 0xF2, 0x97, 0xC6, 0xF4,
+	0x7C, 0xFD, 0xA4, 0x20, 0xE4, 0x20, 0x2C, 0xDA,
+	0x98, 0xAD, 0x4A, 0x96, 0x9F, 0x62, 0xBB, 0x1C,
+	0xB6, 0x28, 0xB0, 0xD0, 0xEA, 0x3B, 0xB8, 0x3C,
+	0x8D, 0x4E, 0x97, 0xEA, 0x9E, 0x63, 0xAA, 0xAA,
+	0x8D, 0x22, 0x61, 0x29, 0x1A, 0x82, 0x29, 0x86,
+	0x87, 0x62, 0xA4, 0xE4, 0xC0, 0x03, 0x93, 0x55,
+	0x7D, 0x40, 0xE9, 0x43, 0x14, 0x9C, 0xE2, 0xDA,
+	0x0A, 0x00, 0x37, 0xEA, 0x80, 0xB8, 0x31, 0x66,
+	0xAE, 0xD7, 0xF8, 0xB4, 0x24, 0xC7, 0x78, 0xDB,
+	0x23, 0x66, 0x61, 0xA5, 0x47, 0x10, 0x4A, 0xE8,
+	0x79, 0xB6, 0xBD, 0x6A, 0xB6, 0x22, 0x6C, 0x7B,
+	0x19, 0xF3, 0x80, 0x35, 0x9A, 0x15, 0x36, 0x89,
+	0x2A, 0x2C, 0xED, 0x26, 0xF1, 0x96, 0xFF, 0x30,
+	0x4D, 0x03, 0x82, 0x2C, 0x69, 0x31, 0x40, 0x40,
+	0x0C, 0xD1, 0x40, 0x3E, 0xE0, 0xB5, 0x37, 0xA8,
+	0x6D, 0x68, 0x68, 0x8F, 0x9E, 0xC5, 0x12, 0x05,
+	0xF5, 0x36, 0x85, 0x5F, 0x8A, 0x52, 0x7B, 0x60,
+	0xA2, 0xC2, 0x39, 0xAF, 0x87, 0xC8, 0xC4, 0xF2,
+	0x53, 0x1D, 0xF0, 0x84, 0x32, 0x8A, 0x04, 0x42,
+	0xBF, 0xCA, 0x1A, 0x08, 0x89, 0x71, 0xCA, 0xC8,
+	0x11, 0xA6, 0xDC, 0xED, 0x31, 0xFC, 0x41, 0xFC,
+	0x84, 0x75, 0xA5, 0x98, 0x67, 0x9E, 0xE7, 0x69,
+	0x9F, 0x3C, 0x42, 0x94, 0x69, 0xA5, 0x1D, 0xC2,
+	0x55, 0x9D, 0x2E, 0xC9, 0x13, 0x3C, 0x68, 0x94,
+	0xA9, 0x7E, 0x6A, 0xFC, 0x11, 0xE3, 0x97, 0x0D,
+	0x59, 0x8F, 0x8D, 0x05, 0x01, 0x4A, 0x74, 0xB6,
+	0x96, 0x6D, 0x1E, 0x7F, 0x63, 0xA5, 0x54, 0x39,
+	0x5A, 0x6C, 0xB9, 0x9B, 0xC3, 0x79, 0xCB, 0xD3,
+	0xC9, 0xE9, 0x37, 0x9E, 0xDC, 0x3B, 0xE2, 0xD2,
+	0xE6, 0x07, 0x77, 0xFA, 0xD5, 0xCF, 0xD6, 0x42,
+	0x45, 0x46, 0xFE, 0x06, 0x28, 0x0E, 0x4D, 0xA6,
+	0x72, 0xE6, 0x6F, 0x39, 0xCD, 0xB9, 0xBF, 0x43,
+	0xF7, 0xD9, 0x99, 0x9B, 0x46, 0xF1, 0x80, 0xBA,
+	0x07, 0x4A, 0x0A, 0xC3, 0x9F, 0xD3, 0xCB, 0xA5,
+	0x85, 0xF7, 0xEE, 0x9F, 0x6D, 0xC0, 0x52, 0xD7,
+	0x17, 0x27, 0x81, 0x92, 0x98, 0xA0, 0xBB, 0xC9,
+	0xD7, 0xE4, 0xF0, 0xF8, 0x25, 0x2C, 0x38, 0x3B,
+	0x44, 0x4E, 0x55, 0x57, 0x5F, 0x86, 0x9A, 0xA1,
+	0xB2, 0xBB, 0xBF, 0xE4, 0xF4, 0x04, 0x0D, 0x16,
+	0x34, 0x48, 0x5A, 0x68, 0x72, 0x88, 0x8B, 0x97,
+	0xA5, 0xAC, 0xBC, 0xC4, 0xC9, 0xCC, 0xF3, 0x03,
+	0x12, 0x14, 0x2C, 0x3B, 0x3E, 0x3F, 0x4D, 0x52,
+	0x79, 0x7A, 0x91, 0x96, 0xA8, 0xB3, 0xBB, 0xCC,
+	0xCF, 0xD7, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0C, 0x1D, 0x2F, 0x43,
+};
+
+uint8_t mldsa_44_sign_dtrm[] = {
+	0xC7, 0x9B, 0x98, 0x33, 0xEA, 0xCC, 0xCC, 0x47,
+	0x51, 0x8F, 0xE1, 0xC0, 0xDA, 0x82, 0x9B, 0xAA,
+	0x74, 0x0A, 0x14, 0x25, 0x73, 0x53, 0x27, 0x7C,
+	0x4C, 0x4A, 0xD6, 0xB7, 0x7C, 0x71, 0x25, 0xD8,
+	0xC5, 0xBA, 0xA8, 0x18, 0x59, 0xC7, 0x64, 0x2E,
+	0x9A, 0x65, 0xE9, 0x63, 0x83, 0x3D, 0xB8, 0x2B,
+	0x42, 0x0A, 0x6D, 0x7D, 0xCE, 0x6A, 0xA3, 0x11,
+	0xD6, 0xB6, 0x54, 0x82, 0x36, 0x38, 0xF1, 0x84,
+	0x01, 0x3E, 0x26, 0x66, 0xC7, 0x38, 0x6F, 0x41,
+	0x4C, 0xC2, 0x42, 0xB5, 0xBF, 0xCE, 0x7B, 0x8B,
+	0xD5, 0x4F, 0x9B, 0x9F, 0x0E, 0xFE, 0x52, 0xAF,
+	0x6D, 0x39, 0xD8, 0x0A, 0x27, 0x4D, 0xDB, 0x9F,
+	0x04, 0x25, 0x8C, 0xF5, 0x89, 0x5B, 0xEB, 0xDC,
+	0x70, 0xBF, 0x23, 0x1D, 0x14, 0x73, 0x9E, 0xFC,
+	0x41, 0xA0, 0xA2, 0xA5, 0xAA, 0xAB, 0x8E, 0xCD,
+	0x5E, 0x29, 0xC5, 0x3E, 0xEC, 0x0A, 0xD9, 0x06,
+	0xEB, 0x8C, 0x18, 0x41, 0x80, 0x91, 0x5D, 0xC9,
+	0x28, 0xCE, 0xDB, 0x1C, 0x0E, 0x8F, 0xE3, 0xC0,
+	0xE5, 0xB1, 0x0A, 0x38, 0x06, 0x43, 0x36, 0x0D,
+	0xF8, 0xE6, 0x2E, 0xCB, 0xEB, 0x51, 0xC8, 0x82,
+	0xE0, 0x3B, 0xCB, 0xCE, 0x62, 0xC8, 0xE0, 0x8A,
+	0x2C, 0xE4, 0xC7, 0xD7, 0xC1, 0x8A, 0x64, 0x0D,
+	0xE8, 0x5A, 0x52, 0x83, 0x58, 0x93, 0x2A, 0x25,
+	0x92, 0x65, 0x19, 0x4F, 0x0F, 0x44, 0x1C, 0xCE,
+	0x56, 0x91, 0xB4, 0xC9, 0x8D, 0x9E, 0x6A, 0xD5,
+	0xCA, 0xE3, 0xA0, 0xE3, 0x46, 0x45, 0x0D, 0x59,
+	0x14, 0x90, 0x72, 0x67, 0xC5, 0x95, 0xAC, 0x2A,
+	0xC4, 0x70, 0xD2, 0xCA, 0x40, 0x1D, 0x62, 0x0E,
+	0x2A, 0xA4, 0x3E, 0xAC, 0x45, 0x00, 0x96, 0xA4,
+	0xF6, 0xAC, 0xEE, 0x01, 0x19, 0xEB, 0xCC, 0x8C,
+	0x62, 0xE3, 0x26, 0x59, 0xB7, 0xB9, 0xBF, 0xBB,
+	0x8D, 0x72, 0xAD, 0x1A, 0xA2, 0x8D, 0xB1, 0x1B,
+	0xC1, 0xC1, 0xD8, 0xFF, 0x03, 0xAF, 0x74, 0xDF,
+	0xC6, 0x3C, 0xCE, 0xBD, 0xA8, 0x12, 0xFA, 0xAC,
+	0x83, 0x8C, 0x7E, 0x26, 0x8E, 0x0D, 0x03, 0xF3,
+	0x02, 0x17, 0x23, 0x13, 0x25, 0x01, 0x1F, 0xB9,
+	0x3B, 0x1C, 0x3E, 0xA7, 0xD9, 0xE4, 0xE6, 0xCA,
+	0xD6, 0x0C, 0x91, 0xAC, 0xEE, 0xD4, 0x42, 0xA7,
+	0xB1, 0x62, 0x70, 0xC8, 0xC9, 0x2F, 0x0A, 0xE0,
+	0xA8, 0xC7, 0x22, 0xE5, 0x2C, 0x06, 0x1C, 0x09,
+	0x4B, 0x45, 0x25, 0x02, 0x07, 0x8A, 0x86, 0xCC,
+	0xF8, 0xF9, 0x36, 0x11, 0x67, 0x75, 0xEE, 0xD2,
+	0xD4, 0x67, 0x09, 0xFD, 0x37, 0xB4, 0x3F, 0x7B,
+	0x4A, 0x2B, 0x4E, 0x05, 0x37, 0x5E, 0xFD, 0x97,
+	0x79, 0x95, 0x13, 0x95, 0x0D, 0x75, 0x15, 0x94,
+	0x27, 0x36, 0xB3, 0x97, 0x03, 0xBE, 0x38, 0x14,
+	0xCB, 0x4D, 0x16, 0x49, 0xFF, 0x36, 0xFA, 0xED,
+	0x4D, 0x97, 0x45, 0xE4, 0xFB, 0xF9, 0x61, 0x7D,
+	0x1F, 0xCE, 0xC3, 0xBF, 0xB3, 0xEA, 0x3C, 0xBC,
+	0x13, 0x05, 0xBB, 0xAB, 0x44, 0x84, 0x80, 0x0F,
+	0xB9, 0x1F, 0x6E, 0x88, 0x27, 0x4A, 0xFA, 0x17,
+	0x83, 0x76, 0x5F, 0xC5, 0xE8, 0x85, 0xBC, 0xFF,
+	0xD8, 0x48, 0x4A, 0x9F, 0xEB, 0xC3, 0xF8, 0x41,
+	0x86, 0x4D, 0xC2, 0x75, 0x7B, 0x74, 0x71, 0x68,
+	0x9C, 0xF8, 0x05, 0x8B, 0xB7, 0xFA, 0xE0, 0xA7,
+	0xFA, 0xEC, 0x53, 0x91, 0xD0, 0xB4, 0x44, 0x7A,
+	0x42, 0xAD, 0xD2, 0x17, 0x86, 0x8F, 0x96, 0xF0,
+	0xF1, 0xD6, 0xC0, 0x26, 0x34, 0x83, 0x2E, 0x62,
+	0x0D, 0x3F, 0x13, 0x5A, 0x8C, 0xBC, 0x6D, 0x8D,
+	0x39, 0x05, 0x91, 0x10, 0x32, 0xBE, 0x17, 0x8A,
+	0xC7, 0x23, 0xBE, 0x3F, 0xC5, 0x8A, 0xE0, 0x81,
+	0xFC, 0x0D, 0x4C, 0x62, 0xE8, 0x67, 0xBA, 0x8B,
+	0xBD, 0xA5, 0xCB, 0xE9, 0x34, 0x3D, 0x8D, 0x84,
+	0x9D, 0x65, 0xBF, 0x9E, 0xC4, 0xB3, 0x16, 0x2E,
+	0x12, 0xB9, 0x1F, 0x82, 0xA1, 0x46, 0x26, 0xD5,
+	0xAB, 0x7D, 0x80, 0x4D, 0x9C, 0xD3, 0xEB, 0x77,
+	0xFB, 0x67, 0xEA, 0xEE, 0xA8, 0x7B, 0x17, 0x02,
+	0x2E, 0x6E, 0xF5, 0x11, 0x44, 0xFC, 0x31, 0x01,
+	0xCC, 0x03, 0x94, 0x0A, 0xCF, 0x8D, 0x12, 0xCD,
+	0x87, 0x66, 0x38, 0x62, 0x3C, 0xBB, 0x98, 0x2E,
+	0xC5, 0x58, 0xD0, 0xF3, 0x06, 0xBD, 0x49, 0x7E,
+	0x18, 0x7D, 0x64, 0xEF, 0x37, 0x71, 0x87, 0xD4,
+	0xE6, 0x2C, 0xCC, 0x32, 0x59, 0x65, 0x05, 0x45,
+	0xDE, 0xF3, 0x17, 0x62, 0x2C, 0x25, 0x62, 0x9C,
+	0x67, 0xBD, 0x74, 0xF1, 0x54, 0x0E, 0x0B, 0x4A,
+	0x01, 0x9F, 0x5E, 0x3B, 0x08, 0x57, 0xFA, 0x09,
+	0x99, 0x11, 0x2C, 0x3E, 0x1D, 0x2D, 0xF7, 0x91,
+	0x12, 0x14, 0xFF, 0x95, 0x6F, 0xCA, 0xBD, 0x25,
+	0xEC, 0x3C, 0x98, 0xA7, 0xAB, 0x98, 0x0E, 0xFB,
+	0x01, 0xE9, 0x5E, 0x58, 0x5A, 0x49, 0x3F, 0xB2,
+	0xC4, 0xBC, 0xF3, 0xEC, 0xCA, 0x4C, 0x54, 0x27,
+	0x66, 0x10, 0x60, 0x76, 0x5C, 0xFB, 0x9E, 0xAC,
+	0xD2, 0x09, 0x75, 0xB3, 0x2B, 0x65, 0xE7, 0x93,
+	0xAD, 0x2B, 0x08, 0x6F, 0x87, 0x73, 0x45, 0x2A,
+	0x1B, 0xB1, 0x75, 0xE7, 0x02, 0x9B, 0xCB, 0x56,
+	0x87, 0x6F, 0x66, 0x44, 0xED, 0xDC, 0x03, 0x92,
+	0xD4, 0xF1, 0x07, 0x40, 0xD6, 0x86, 0xD5, 0x98,
+	0x3D, 0x9B, 0x03, 0xD9, 0x0A, 0x58, 0x59, 0x54,
+	0x06, 0x10, 0xFD, 0x15, 0xFB, 0xE0, 0x5B, 0x81,
+	0x8D, 0x0C, 0xC0, 0xA6, 0x15, 0x94, 0x72, 0x5E,
+	0xC8, 0x4A, 0x73, 0x59, 0x63, 0xF6, 0xCD, 0x8D,
+	0xA4, 0xC2, 0xAF, 0x2E, 0xAE, 0xC1, 0x93, 0x89,
+	0x08, 0x81, 0x10, 0xEC, 0x44, 0x81, 0x33, 0x96,
+	0x88, 0xDC, 0x19, 0xDF, 0xD4, 0x2E, 0x5D, 0x52,
+	0xD7, 0x6A, 0x02, 0x64, 0x11, 0x6B, 0x24, 0xCF,
+	0x51, 0xD4, 0xC1, 0x85, 0x7D, 0xA3, 0x24, 0x6A,
+	0x05, 0x13, 0x55, 0xC3, 0x64, 0x5A, 0xDF, 0x9A,
+	0x23, 0x73, 0xEA, 0xD9, 0x48, 0x98, 0xBE, 0x1C,
+	0xBD, 0x3A, 0x5D, 0x37, 0xDC, 0x18, 0xA8, 0x39,
+	0x71, 0x67, 0xC4, 0x12, 0xF1, 0xE3, 0x53, 0x73,
+	0xF1, 0xD8, 0xC4, 0x8B, 0xB3, 0x64, 0x03, 0xDD,
+	0x6E, 0xFB, 0x4A, 0xEF, 0xA4, 0x37, 0xA8, 0xA5,
+	0x2E, 0x86, 0x40, 0x73, 0x16, 0xBA, 0x3A, 0xF5,
+	0x5E, 0x47, 0xD8, 0x13, 0x58, 0xB7, 0x73, 0xA2,
+	0xDA, 0x00, 0x9F, 0x90, 0xE4, 0xF8, 0x0B, 0xB3,
+	0x26, 0x0A, 0xD8, 0x46, 0x8A, 0x09, 0x55, 0xCB,
+	0xCB, 0xA4, 0x89, 0x84, 0xF8, 0x35, 0xF0, 0xDF,
+	0x45, 0x5B, 0x6A, 0xAF, 0xA8, 0x5F, 0xE4, 0xC2,
+	0x03, 0x9B, 0x5B, 0x11, 0x21, 0xA7, 0xDE, 0xC5,
+	0x71, 0x3D, 0x00, 0xF8, 0x6F, 0x13, 0x75, 0x4E,
+	0x7B, 0x6B, 0x32, 0x95, 0xD3, 0x77, 0x82, 0xA2,
+	0x70, 0x6A, 0x80, 0xC3, 0x0D, 0x53, 0xC4, 0x1C,
+	0xF0, 0x1C, 0x5A, 0x54, 0xA4, 0xB2, 0x7A, 0x90,
+	0x6E, 0x48, 0x39, 0x19, 0x4A, 0x70, 0x8E, 0xEB,
+	0xF2, 0x94, 0x07, 0x45, 0xC0, 0x4B, 0xC1, 0x80,
+	0xED, 0x87, 0x39, 0x6B, 0x5F, 0x7E, 0x63, 0x95,
+	0x38, 0xFB, 0xF4, 0x6E, 0x3A, 0x6A, 0x78, 0x59,
+	0x1E, 0x51, 0x45, 0x02, 0x14, 0xAC, 0xA1, 0xD1,
+	0xC8, 0x44, 0x03, 0xB6, 0x3D, 0xA4, 0xB3, 0xC1,
+	0xE0, 0x1C, 0x39, 0xA1, 0x87, 0x21, 0x7C, 0xBA,
+	0x9A, 0x92, 0xA3, 0xAF, 0x37, 0xE8, 0x27, 0xA1,
+	0xBE, 0x2D, 0x83, 0x0A, 0x46, 0xE7, 0x68, 0x44,
+	0x9D, 0xB1, 0x57, 0x33, 0x9B, 0x57, 0xE3, 0x0C,
+	0xE7, 0xDF, 0x7F, 0x15, 0xC0, 0xB5, 0x3A, 0x08,
+	0x6C, 0xEF, 0xB3, 0xD3, 0xA2, 0x3C, 0x84, 0xC8,
+	0x77, 0x46, 0xB8, 0xD0, 0x1E, 0x6D, 0x7A, 0x0B,
+	0xD7, 0x25, 0x77, 0x74, 0xF6, 0xD8, 0xF4, 0x75,
+	0x54, 0x6A, 0x91, 0x48, 0x98, 0xAC, 0x52, 0xA6,
+	0x6C, 0xBC, 0x05, 0xA4, 0x92, 0x8F, 0x52, 0xAA,
+	0x97, 0xCC, 0x23, 0xD8, 0x69, 0x01, 0xB0, 0xD2,
+	0x1F, 0x22, 0xE8, 0xD1, 0xF7, 0x89, 0x8E, 0x40,
+	0xF1, 0xD8, 0xCE, 0xB5, 0x26, 0x82, 0xBD, 0xD7,
+	0x7C, 0x88, 0xB2, 0x6F, 0x16, 0x07, 0x67, 0x51,
+	0x45, 0x6C, 0x90, 0x63, 0xBA, 0x58, 0xB6, 0x71,
+	0xB8, 0x54, 0xA8, 0x4C, 0x54, 0xB3, 0xD7, 0x2B,
+	0x9F, 0xEB, 0x1C, 0xC6, 0x9F, 0xFA, 0xD6, 0xD3,
+	0xED, 0xA0, 0x99, 0x18, 0x99, 0x23, 0xB0, 0x1A,
+	0xAA, 0x3A, 0x42, 0xCB, 0x4A, 0xFC, 0x54, 0x30,
+	0x86, 0xD0, 0xFF, 0x44, 0x62, 0xAB, 0x94, 0xBD,
+	0xA9, 0x95, 0x27, 0x22, 0xD6, 0x57, 0xE7, 0x26,
+	0x94, 0x18, 0x0C, 0xDE, 0x10, 0x44, 0xE4, 0x1A,
+	0x55, 0x15, 0x07, 0xDC, 0x33, 0xCF, 0x4D, 0x27,
+	0x9D, 0xDD, 0x19, 0xF7, 0x81, 0xD5, 0x2A, 0xFA,
+	0x52, 0xC5, 0xA3, 0xF9, 0x6A, 0x78, 0xE8, 0x95,
+	0xE5, 0x00, 0x98, 0x46, 0xD0, 0xA5, 0x55, 0x23,
+	0x0D, 0xED, 0xA3, 0x84, 0x87, 0xAF, 0xB5, 0xBC,
+	0x10, 0x8B, 0x1F, 0x0A, 0x5E, 0x08, 0x5B, 0xC8,
+	0x78, 0xBD, 0xBC, 0xB5, 0x29, 0x56, 0x3C, 0xFB,
+	0x95, 0xC7, 0xFD, 0xDD, 0xB6, 0x2A, 0x66, 0x5A,
+	0x2B, 0x86, 0xA2, 0x74, 0x33, 0x67, 0xA3, 0x48,
+	0xE7, 0xFA, 0xCB, 0x08, 0x6B, 0x9D, 0x85, 0x8E,
+	0x38, 0x14, 0xCB, 0xC2, 0xDA, 0xA7, 0x06, 0x3A,
+	0x23, 0xE6, 0x80, 0x7D, 0x01, 0xA2, 0xA4, 0x1B,
+	0x3C, 0xCF, 0x9C, 0xE8, 0x62, 0x4D, 0xF5, 0x81,
+	0x8C, 0xB9, 0x11, 0x8A, 0x12, 0x07, 0x93, 0xDD,
+	0xB9, 0x40, 0x32, 0xB4, 0x60, 0x6A, 0xC8, 0x76,
+	0x95, 0x54, 0x0A, 0x48, 0xE2, 0xFF, 0x8A, 0x3C,
+	0xA2, 0x17, 0x4A, 0xCF, 0xDF, 0x6A, 0xAF, 0xBE,
+	0x7A, 0x62, 0x7A, 0x3A, 0x60, 0x0B, 0x64, 0x2D,
+	0xF0, 0xF9, 0x9C, 0x0B, 0xB2, 0x1C, 0xFD, 0xB6,
+	0x3F, 0x86, 0x9F, 0x4A, 0xA7, 0xA3, 0x8C, 0xC1,
+	0xAD, 0xF3, 0xFA, 0x86, 0xEF, 0x3F, 0xD7, 0x86,
+	0x05, 0xF0, 0x8D, 0xA6, 0xD1, 0xFE, 0xE0, 0xB4,
+	0x12, 0xC6, 0x35, 0x88, 0xFE, 0x77, 0xDE, 0x4E,
+	0x36, 0x4C, 0x8A, 0x81, 0x62, 0xC0, 0x30, 0x95,
+	0xC9, 0x2E, 0xB5, 0xCD, 0x09, 0x8D, 0x14, 0xDF,
+	0xED, 0x2E, 0x2D, 0xCE, 0x8A, 0x94, 0x7A, 0xC7,
+	0x12, 0x51, 0x8B, 0xEF, 0x45, 0xE9, 0x7A, 0x5E,
+	0x1E, 0x51, 0x73, 0x34, 0x51, 0x2B, 0xCB, 0x45,
+	0x22, 0xE6, 0x6F, 0x62, 0x20, 0xBA, 0xD2, 0x4E,
+	0xDC, 0x1F, 0xEE, 0x25, 0xFD, 0xA5, 0xD8, 0xD6,
+	0x4A, 0x24, 0xEA, 0x5E, 0x36, 0xF5, 0x76, 0x76,
+	0x27, 0x53, 0x99, 0xA1, 0xAF, 0x9E, 0x3C, 0x2A,
+	0x4C, 0xB2, 0x26, 0x8C, 0xC4, 0x1D, 0x38, 0x0C,
+	0x3F, 0xC6, 0x34, 0xA8, 0x5B, 0x96, 0x46, 0x4B,
+	0xE4, 0x17, 0xB8, 0x91, 0xD8, 0x28, 0x43, 0x99,
+	0xD8, 0xB5, 0x1D, 0x87, 0x66, 0x29, 0xC6, 0x8E,
+	0x43, 0x07, 0xAE, 0xBC, 0x05, 0xBF, 0xE2, 0xED,
+	0xDD, 0xCD, 0xDA, 0x65, 0xC9, 0x87, 0x95, 0xB6,
+	0x4D, 0x64, 0x64, 0x23, 0x5D, 0x19, 0x9D, 0x47,
+	0xC0, 0xED, 0x36, 0x03, 0x8C, 0x1E, 0xBA, 0xDE,
+	0xB7, 0x5D, 0xB8, 0x2B, 0x10, 0x35, 0x6F, 0xCD,
+	0x8E, 0xF8, 0xFA, 0xC0, 0x95, 0x34, 0x5C, 0x6A,
+	0x49, 0xDB, 0x30, 0x4C, 0xEB, 0x61, 0x27, 0xF5,
+	0x83, 0x5B, 0xBF, 0x05, 0x1F, 0x56, 0xF0, 0x4B,
+	0x1C, 0x25, 0x29, 0xA2, 0xC5, 0xF2, 0x46, 0xF6,
+	0xE9, 0x04, 0xDB, 0x7D, 0x01, 0xDE, 0xE0, 0x76,
+	0xEC, 0xB0, 0x24, 0x61, 0x41, 0xA4, 0x53, 0x84,
+	0x90, 0x1B, 0x96, 0x72, 0x00, 0x14, 0x26, 0xED,
+	0x20, 0x31, 0x5A, 0x24, 0xC9, 0xB2, 0x2A, 0x75,
+	0xD3, 0x94, 0xC1, 0xFE, 0xCE, 0xC1, 0x57, 0xDE,
+	0x5E, 0xCD, 0xBE, 0xCB, 0x85, 0x4A, 0x6B, 0x85,
+	0x28, 0xC3, 0x7B, 0x12, 0x7F, 0x61, 0xDD, 0x22,
+	0x07, 0x37, 0xFF, 0x70, 0x7A, 0xA1, 0x56, 0xD4,
+	0x5A, 0x3A, 0x59, 0xAB, 0xC3, 0x65, 0x09, 0x0E,
+	0x3C, 0x9C, 0x52, 0x34, 0xB2, 0x5D, 0x89, 0x62,
+	0x89, 0x3E, 0x22, 0x07, 0x56, 0xA2, 0x4D, 0x95,
+	0xE8, 0x78, 0x15, 0x44, 0x6F, 0xA3, 0xB2, 0x2C,
+	0x24, 0xF8, 0xA0, 0x54, 0x9E, 0x73, 0x25, 0x0C,
+	0xB3, 0x2C, 0xFF, 0x2D, 0x9C, 0x2E, 0xE1, 0xD8,
+	0x70, 0xF1, 0xCA, 0xA4, 0xB6, 0x6E, 0xDF, 0xE5,
+	0xB4, 0x0F, 0xF7, 0x00, 0x8E, 0x4F, 0x6F, 0xBA,
+	0x0D, 0x1F, 0x82, 0xF0, 0x7D, 0xC4, 0xED, 0x1E,
+	0xB6, 0x61, 0xE2, 0x3C, 0xBF, 0x5F, 0x88, 0xE1,
+	0x37, 0x5E, 0xE7, 0x7D, 0xE2, 0x13, 0xDF, 0x9A,
+	0x59, 0x6D, 0x85, 0x87, 0x7D, 0xCD, 0x8A, 0x01,
+	0xA1, 0xA7, 0x10, 0x63, 0xB5, 0xA4, 0xC4, 0xE0,
+	0x1A, 0x45, 0x4E, 0x91, 0x07, 0x54, 0x62, 0xD6,
+	0xC2, 0x3F, 0x96, 0x40, 0xF6, 0x8B, 0x12, 0x59,
+	0xEF, 0x20, 0x9C, 0x35, 0x4E, 0x37, 0x1F, 0xAA,
+	0x9C, 0x01, 0xA5, 0x59, 0x85, 0x37, 0x9E, 0x4F,
+	0xDF, 0xFF, 0x40, 0x6E, 0xC2, 0xE6, 0xC6, 0x09,
+	0x70, 0x1C, 0xC2, 0xCD, 0x11, 0x6B, 0x84, 0xC8,
+	0xEE, 0x2B, 0xAE, 0xD5, 0x36, 0xFC, 0x83, 0x30,
+	0xDD, 0x5E, 0x13, 0x6C, 0x49, 0xDB, 0x44, 0xDD,
+	0x39, 0x58, 0xE7, 0x83, 0xD6, 0x1A, 0x5F, 0xE2,
+	0xF7, 0x82, 0xDC, 0x1E, 0x80, 0x44, 0xDB, 0x48,
+	0x62, 0x32, 0x75, 0x3E, 0x6A, 0x98, 0x1A, 0xB2,
+	0x36, 0xBF, 0xDE, 0x35, 0x6B, 0x20, 0x9F, 0x83,
+	0xB5, 0xA2, 0x1C, 0x0B, 0x99, 0x9B, 0x49, 0x43,
+	0xEB, 0x5B, 0x67, 0x03, 0x8A, 0x24, 0x45, 0x8C,
+	0x15, 0xEE, 0xD2, 0xB2, 0x35, 0xEB, 0xAF, 0x69,
+	0x0E, 0x69, 0x3B, 0x4D, 0x80, 0x9B, 0x75, 0x43,
+	0xB4, 0x40, 0x30, 0xCF, 0xD9, 0x76, 0xD4, 0x58,
+	0xAC, 0x2B, 0x10, 0xE3, 0xF3, 0x48, 0x38, 0xAA,
+	0x69, 0x18, 0x51, 0x5C, 0xD7, 0xB0, 0x9E, 0x5B,
+	0x1E, 0x18, 0xD7, 0x59, 0x67, 0x80, 0x4F, 0xCB,
+	0x40, 0x49, 0xB0, 0x27, 0xCD, 0x15, 0xF7, 0x56,
+	0x34, 0x0F, 0x5D, 0xD9, 0xC4, 0xCB, 0xF7, 0x83,
+	0x0D, 0x8B, 0xCF, 0x21, 0x13, 0x1A, 0x49, 0xE6,
+	0x21, 0x49, 0x0F, 0x67, 0xFF, 0xE6, 0xE7, 0xF4,
+	0xD7, 0x2C, 0xDA, 0xFD, 0xBD, 0x86, 0xC2, 0x40,
+	0x6E, 0xB5, 0x05, 0xFC, 0x3E, 0x88, 0xB4, 0xB1,
+	0xC1, 0x5C, 0x6D, 0x0F, 0x0F, 0x17, 0xE6, 0xE0,
+	0x96, 0x4B, 0x45, 0xBD, 0x07, 0x20, 0x00, 0x3F,
+	0xF0, 0xF2, 0xB9, 0xA1, 0x35, 0x01, 0x47, 0x81,
+	0x1F, 0xA2, 0x0A, 0x66, 0xDB, 0xD7, 0x58, 0x51,
+	0x88, 0x78, 0x24, 0x6F, 0x7E, 0x68, 0x46, 0xBD,
+	0xEB, 0x5C, 0xA9, 0xDE, 0x30, 0x34, 0x2B, 0xA3,
+	0xCF, 0x93, 0x82, 0x14, 0x3D, 0x96, 0x1E, 0xD7,
+	0x6E, 0x9A, 0x2E, 0x72, 0xD0, 0x49, 0xDB, 0x24,
+	0xA0, 0x6E, 0x8E, 0xBA, 0x4A, 0x36, 0xCB, 0xF6,
+	0x9A, 0x46, 0x24, 0xEF, 0x18, 0xA8, 0xD9, 0xD5,
+	0x93, 0xF0, 0x2B, 0xEC, 0x60, 0x0A, 0x8F, 0x1C,
+	0xE8, 0x69, 0x56, 0x14, 0x6C, 0x8E, 0x30, 0xFB,
+	0x8D, 0xCF, 0xE7, 0x92, 0x59, 0x2E, 0x32, 0xEB,
+	0xAE, 0xA3, 0x99, 0x87, 0x98, 0x49, 0x03, 0xCD,
+	0x5E, 0xBD, 0xDE, 0xB9, 0xF5, 0xD0, 0xB3, 0xB1,
+	0x65, 0xAC, 0xC7, 0x42, 0xB4, 0xCF, 0x6A, 0x00,
+	0x3E, 0x2E, 0xC1, 0x13, 0xDF, 0x5E, 0x2E, 0xEC,
+	0x30, 0x00, 0xE2, 0xAB, 0xFD, 0x74, 0x06, 0x55,
+	0x88, 0x07, 0xB0, 0xEF, 0x6D, 0x43, 0x81, 0x15,
+	0xFC, 0xF6, 0x96, 0x91, 0x3D, 0x2F, 0xFE, 0xBD,
+	0xB9, 0xC8, 0xB6, 0x81, 0x63, 0xE0, 0xA9, 0x20,
+	0x93, 0xEC, 0x4B, 0x1E, 0xB9, 0xC2, 0xD0, 0x8C,
+	0x2E, 0xCB, 0x18, 0x7D, 0x1F, 0x66, 0xA6, 0x96,
+	0xA9, 0xB8, 0x66, 0x4F, 0xCF, 0xC9, 0xDA, 0x97,
+	0xCA, 0x07, 0xF1, 0xC8, 0xFB, 0x56, 0x60, 0xA9,
+	0x25, 0xDB, 0xFC, 0x2D, 0xB6, 0x0A, 0x42, 0x6A,
+	0x7F, 0xCE, 0x70, 0x91, 0xFF, 0x3B, 0xAC, 0xAB,
+	0xF2, 0x23, 0x4E, 0x50, 0xE9, 0xE6, 0x2F, 0xCB,
+	0x98, 0xBA, 0x7D, 0xD2, 0x8A, 0xDE, 0x6E, 0x80,
+	0x0C, 0xC6, 0xEB, 0xD9, 0x64, 0xD4, 0x59, 0xD5,
+	0x75, 0x00, 0x18, 0x7F, 0xD6, 0x86, 0xC2, 0x25,
+	0x98, 0xA9, 0x28, 0x1C, 0x40, 0x46, 0xC6, 0xA5,
+	0xAF, 0x6E, 0x5D, 0x25, 0x3C, 0x77, 0xF9, 0x43,
+	0xF3, 0x20, 0xFC, 0x43, 0xA0, 0x5E, 0xF1, 0x65,
+	0x5D, 0x8B, 0x33, 0x5A, 0x94, 0xF0, 0x6F, 0xB6,
+	0xD4, 0x4A, 0x48, 0x64, 0x31, 0x73, 0x17, 0x4E,
+	0x88, 0x90, 0xA8, 0xE4, 0x7F, 0xCE, 0xD5, 0x7D,
+	0xE3, 0x84, 0x3F, 0x38, 0x71, 0x4C, 0xB1, 0x18,
+	0xAA, 0x46, 0xF2, 0xCF, 0x99, 0xF0, 0x24, 0xD7,
+	0xFD, 0xFC, 0x2C, 0x81, 0x25, 0xC1, 0x8E, 0x0B,
+	0x82, 0x4C, 0x14, 0x6C, 0x44, 0xB1, 0x78, 0x67,
+	0x14, 0x47, 0xCA, 0x70, 0x0D, 0x13, 0xD1, 0xA8,
+	0x73, 0xBC, 0x4E, 0xAA, 0x1E, 0xB7, 0x59, 0xC0,
+	0xAC, 0xE3, 0x21, 0x2B, 0x55, 0x22, 0x6A, 0x53,
+	0xA6, 0xF0, 0xE9, 0x56, 0x37, 0x3B, 0xD6, 0x1B,
+	0x2E, 0x57, 0x98, 0x4D, 0x6A, 0x7E, 0xEB, 0x2E,
+	0x9B, 0xB8, 0xE2, 0x27, 0x55, 0xE2, 0x2E, 0xFA,
+	0x3C, 0xD2, 0x7A, 0xCC, 0xDB, 0x5C, 0x45, 0x85,
+	0xA6, 0x92, 0x49, 0x79, 0x9D, 0x18, 0x20, 0x50,
+	0x7B, 0xF4, 0x0F, 0x43, 0x2F, 0x7B, 0x3E, 0x90,
+	0xEF, 0xF3, 0x29, 0x66, 0xDF, 0xD1, 0xE9, 0x44,
+	0xC6, 0x28, 0xAA, 0x48, 0x00, 0x5F, 0x12, 0xEB,
+	0xEC, 0x26, 0x7F, 0xB3, 0x83, 0xFB, 0x50, 0x5A,
+	0x5F, 0x5A, 0x8E, 0x08, 0x4B, 0xF7, 0x50, 0x10,
+	0xC8, 0x73, 0x8F, 0x9C, 0xF6, 0xCB, 0xDC, 0xEA,
+	0x78, 0x07, 0x2C, 0x59, 0xAD, 0x66, 0x48, 0xFF,
+	0x56, 0x7D, 0x99, 0xC9, 0xEA, 0x64, 0xE7, 0xD0,
+	0x46, 0x88, 0x58, 0x46, 0x93, 0x37, 0x70, 0xC1,
+	0x91, 0x40, 0x02, 0x46, 0x7F, 0x8D, 0xFE, 0x66,
+	0x07, 0x1F, 0x3B, 0x56, 0x6A, 0x6E, 0x88, 0xB2,
+	0xBB, 0xC0, 0xC8, 0xCD, 0xD9, 0xDC, 0x0A, 0x0C,
+	0x1A, 0x27, 0x35, 0x48, 0x4C, 0x5B, 0x5D, 0x90,
+	0xA0, 0xB2, 0xB4, 0xCE, 0xD6, 0xDD, 0x07, 0x13,
+	0x7C, 0x93, 0x99, 0xA2, 0xA9, 0xAC, 0xC3, 0xC8,
+	0xEF, 0x1D, 0x33, 0x3D, 0x3F, 0x42, 0x52, 0x57,
+	0x6D, 0x72, 0x87, 0x8E, 0x96, 0xA8, 0xC6, 0xC8,
+	0xD0, 0xD6, 0xE8, 0xEB, 0xF2, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x0E, 0x1E, 0x29, 0x3D,
+};
+
+uint8_t mldsa_44_message[] = {
+	0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
+	0x74, 0x68, 0x65, 0x20, 0x6D, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x20, 0x74, 0x6F, 0x20, 0x62,
+	0x65, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x65, 0x64,
+	0x2E, 0x0A,
+};
+
+uint8_t mldsa_44_privkey_noseed[] = {
+	0xBA, 0x71, 0xF9, 0xF6, 0x4E, 0x11, 0xBA, 0xEB,
+	0x58, 0xFA, 0x9C, 0x6F, 0xBB, 0x6E, 0x14, 0xE6,
+	0x1F, 0x18, 0x64, 0x3D, 0xAB, 0x49, 0x5B, 0x47,
+	0x53, 0x9A, 0x91, 0x66, 0xCA, 0x01, 0x98, 0x13,
+	0xC5, 0xC1, 0x61, 0x0A, 0x40, 0x77, 0x4F, 0x0E,
+	0xBA, 0x33, 0x34, 0xF8, 0xB5, 0xBE, 0x56, 0xE8,
+	0x78, 0x71, 0xB3, 0xC3, 0xA7, 0x72, 0xC0, 0x72,
+	0x0F, 0xA3, 0x76, 0x66, 0xAE, 0x17, 0x35, 0xFD,
+	0xE6, 0xBC, 0x38, 0xA1, 0xC3, 0x5F, 0x8C, 0xF0,
+	0x8E, 0x44, 0x09, 0x24, 0xC9, 0x03, 0x71, 0x97,
+	0xBB, 0x87, 0xFD, 0xC4, 0x64, 0x6B, 0x86, 0xDA,
+	0x5A, 0x05, 0x89, 0xA3, 0x26, 0xCC, 0x0C, 0x0D,
+	0x95, 0x0F, 0xF8, 0xB5, 0xA9, 0xEA, 0x41, 0x35,
+	0xEA, 0xB8, 0xA9, 0x3F, 0x80, 0xF0, 0x92, 0x7E,
+	0x12, 0x40, 0x46, 0xE2, 0x5B, 0x23, 0x66, 0xAE,
+	0xA2, 0x5A, 0x6D, 0x1D, 0x0F, 0xEF, 0x98, 0x21,
+	0x04, 0xB8, 0x09, 0xDA, 0x12, 0x48, 0xE1, 0x40,
+	0x4C, 0x11, 0x03, 0x85, 0x99, 0xB0, 0x4D, 0x61,
+	0x04, 0x0A, 0xC0, 0x34, 0x28, 0x23, 0x16, 0x80,
+	0x08, 0x12, 0x45, 0x11, 0x49, 0x0C, 0xA0, 0x96,
+	0x0D, 0xC2, 0xA8, 0x01, 0x5A, 0xA8, 0x65, 0x0B,
+	0x30, 0x25, 0xD4, 0x94, 0x44, 0x8B, 0x38, 0x8C,
+	0x10, 0x24, 0x41, 0x22, 0x40, 0x69, 0x8A, 0x04,
+	0x04, 0x0C, 0x26, 0x90, 0xE3, 0x34, 0x69, 0xE2,
+	0x24, 0x68, 0xD2, 0x44, 0x00, 0x0B, 0x84, 0x90,
+	0xD9, 0x42, 0x30, 0x21, 0x91, 0x8D, 0x09, 0x99,
+	0x64, 0x20, 0x39, 0x60, 0x82, 0x36, 0x21, 0x90,
+	0xB8, 0x4C, 0x02, 0x12, 0x6E, 0x24, 0xB9, 0x70,
+	0x84, 0x22, 0x01, 0xE1, 0xA8, 0x64, 0x44, 0x26,
+	0x0E, 0x01, 0x17, 0x0E, 0x82, 0x40, 0x6C, 0x9B,
+	0x38, 0x6D, 0x0A, 0x93, 0x50, 0x52, 0x22, 0x25,
+	0xD2, 0xB8, 0x2C, 0x1A, 0x25, 0x70, 0x90, 0x12,
+	0x22, 0xD1, 0xB2, 0x80, 0x22, 0x46, 0x52, 0x01,
+	0x34, 0x80, 0x40, 0x34, 0x21, 0x41, 0x06, 0x60,
+	0x41, 0x32, 0x82, 0x09, 0x45, 0x90, 0x52, 0x32,
+	0x29, 0x83, 0xB8, 0x44, 0x93, 0x12, 0x21, 0x0A,
+	0xC1, 0x89, 0x60, 0xB2, 0x71, 0x9C, 0x90, 0x69,
+	0x90, 0x82, 0x90, 0x89, 0x12, 0x49, 0x40, 0x40,
+	0x8A, 0x5C, 0x10, 0x48, 0x01, 0x87, 0x91, 0x03,
+	0xB0, 0x40, 0xD8, 0x44, 0x05, 0xE4, 0xB0, 0x29,
+	0x0A, 0x27, 0x90, 0x1C, 0xC9, 0x50, 0x58, 0x02,
+	0x8C, 0x0C, 0x49, 0x72, 0x49, 0x84, 0x6D, 0x19,
+	0xA7, 0x85, 0xE3, 0x00, 0x30, 0xCB, 0xB2, 0x21,
+	0xE2, 0x08, 0x10, 0x4C, 0xA6, 0x64, 0x11, 0x43,
+	0x68, 0x52, 0x94, 0x69, 0x09, 0x39, 0x32, 0x91,
+	0xA2, 0x6D, 0xCA, 0x14, 0x84, 0xA3, 0x92, 0x11,
+	0xDB, 0x94, 0x2C, 0x01, 0xC6, 0x64, 0x14, 0x24,
+	0x8C, 0x1A, 0x15, 0x31, 0x0A, 0x23, 0x0E, 0xD8,
+	0x14, 0x20, 0xA4, 0x26, 0x8D, 0x43, 0x40, 0x90,
+	0xC1, 0x42, 0x86, 0xA4, 0x10, 0x85, 0x0C, 0x32,
+	0x2D, 0xD0, 0x28, 0x60, 0x1B, 0xB5, 0x0C, 0x52,
+	0x44, 0x61, 0x21, 0x15, 0x24, 0x21, 0xC6, 0x04,
+	0xD8, 0x34, 0x31, 0xD9, 0x12, 0x71, 0xA2, 0x34,
+	0x52, 0x03, 0x30, 0x89, 0x54, 0x32, 0x10, 0x83,
+	0x94, 0x08, 0xA2, 0xA4, 0x70, 0xD2, 0x44, 0x8E,
+	0x84, 0x02, 0x8D, 0x91, 0x46, 0x62, 0x0B, 0x00,
+	0x0E, 0xA0, 0x80, 0x70, 0x22, 0xB5, 0x0D, 0x0B,
+	0xC9, 0x01, 0x00, 0x26, 0x4D, 0xE2, 0x44, 0x80,
+	0x93, 0x20, 0x65, 0xC9, 0x96, 0x8D, 0xDA, 0xA4,
+	0x4C, 0x42, 0xA8, 0x00, 0x1A, 0x27, 0x6C, 0xC3,
+	0x94, 0x4D, 0xA0, 0x30, 0x2C, 0xDA, 0xA8, 0x04,
+	0x23, 0xA3, 0x8C, 0x63, 0x04, 0x0E, 0x59, 0xC8,
+	0x00, 0x20, 0xA9, 0x6C, 0xC4, 0x06, 0x50, 0x82,
+	0x00, 0x2E, 0x5C, 0xB2, 0x44, 0x61, 0x46, 0x51,
+	0x0C, 0x18, 0x80, 0x18, 0x38, 0x82, 0x02, 0x25,
+	0x90, 0xA2, 0xB2, 0x60, 0x21, 0xA0, 0x40, 0x20,
+	0x49, 0x2A, 0x52, 0x28, 0x86, 0x93, 0xA6, 0x28,
+	0x9B, 0x94, 0x71, 0x02, 0xB9, 0x6D, 0x49, 0xA0,
+	0x2C, 0x09, 0x25, 0x28, 0x18, 0x93, 0x09, 0x10,
+	0x49, 0x4C, 0x13, 0xC9, 0x91, 0xA3, 0x88, 0x2D,
+	0x50, 0x12, 0x31, 0x63, 0xB4, 0x00, 0xA4, 0x00,
+	0x4E, 0x04, 0xB6, 0x68, 0x12, 0x14, 0x26, 0x00,
+	0x17, 0x00, 0x9B, 0x92, 0x0C, 0x51, 0xA8, 0x65,
+	0x11, 0x44, 0x8D, 0x44, 0x42, 0x69, 0x00, 0xA5,
+	0x6D, 0x04, 0xA9, 0x69, 0x43, 0x94, 0x69, 0x4C,
+	0xB8, 0x60, 0x52, 0x26, 0x2D, 0xA1, 0x32, 0x11,
+	0xCA, 0xB0, 0x11, 0x1B, 0x81, 0x90, 0x12, 0x11,
+	0x64, 0x42, 0x86, 0x89, 0x9C, 0x12, 0x51, 0xDC,
+	0xC0, 0x41, 0x13, 0x47, 0x68, 0x9B, 0x20, 0x92,
+	0xD1, 0x26, 0x91, 0x23, 0x96, 0x50, 0x13, 0xB3,
+	0x4C, 0x12, 0x45, 0x69, 0x21, 0xA1, 0x05, 0x0C,
+	0x46, 0x65, 0x99, 0x38, 0x30, 0x99, 0x26, 0x2E,
+	0x19, 0x15, 0x72, 0x11, 0x39, 0x8D, 0x89, 0x10,
+	0x92, 0x50, 0x28, 0x11, 0x48, 0xA6, 0x49, 0x52,
+	0xB6, 0x2D, 0xC9, 0x30, 0x4D, 0xD9, 0x32, 0x91,
+	0x91, 0xA6, 0x44, 0x14, 0x34, 0x0E, 0x13, 0x39,
+	0x41, 0x98, 0x06, 0x0C, 0x22, 0x25, 0x6C, 0x14,
+	0x47, 0x70, 0x21, 0xB7, 0x60, 0x23, 0x98, 0x25,
+	0xE4, 0x24, 0x6E, 0xD1, 0xB6, 0x44, 0x51, 0x44,
+	0x2C, 0x41, 0x42, 0x85, 0xE0, 0x44, 0x42, 0x89,
+	0x42, 0x42, 0xC2, 0x24, 0x2C, 0xCC, 0xC6, 0x68,
+	0x13, 0x12, 0x69, 0x98, 0x30, 0x49, 0x23, 0x28,
+	0x6A, 0x14, 0xC8, 0x11, 0x60, 0x92, 0x30, 0x11,
+	0x26, 0x52, 0x92, 0xB0, 0x00, 0x5C, 0x84, 0x2C,
+	0x4A, 0x14, 0x29, 0x0A, 0x95, 0x40, 0xE3, 0xC4,
+	0x05, 0x0C, 0xC8, 0x89, 0xA1, 0x26, 0x62, 0x44,
+	0x10, 0x04, 0x9A, 0xC8, 0x70, 0x0C, 0x93, 0x60,
+	0x90, 0xB6, 0x30, 0x12, 0x17, 0x71, 0x23, 0x18,
+	0x4E, 0xD4, 0x10, 0x85, 0x84, 0x20, 0x82, 0x5C,
+	0x14, 0x48, 0x90, 0xB2, 0x51, 0xA0, 0x18, 0x92,
+	0x93, 0x94, 0x80, 0x1A, 0x49, 0x72, 0xC0, 0x02,
+	0x06, 0xE1, 0xA6, 0x8C, 0xA1, 0x80, 0x4D, 0x4A,
+	0x26, 0x08, 0x18, 0x07, 0x62, 0x42, 0x12, 0x40,
+	0x10, 0x41, 0x64, 0x44, 0x42, 0x4E, 0x94, 0x86,
+	0x40, 0x9A, 0x84, 0x41, 0x21, 0xC5, 0x71, 0x01,
+	0x96, 0x29, 0x19, 0x40, 0x4E, 0x94, 0x36, 0x22,
+	0x24, 0xC3, 0x20, 0x22, 0x88, 0x71, 0x84, 0x20,
+	0x4C, 0x64, 0x20, 0x69, 0xDB, 0x84, 0x24, 0x24,
+	0x25, 0x46, 0x21, 0xC4, 0x71, 0x8A, 0x14, 0x64,
+	0x01, 0x20, 0x65, 0x4C, 0x84, 0x24, 0x44, 0x24,
+	0x30, 0x8A, 0x22, 0x70, 0xD3, 0x86, 0x30, 0x0B,
+	0xB4, 0x6C, 0x21, 0x23, 0x0A, 0x8B, 0xB8, 0x4D,
+	0x5C, 0xF7, 0xD7, 0xE6, 0x89, 0x30, 0x2B, 0xED,
+	0xB1, 0xC5, 0x86, 0x7E, 0x7D, 0x26, 0x9B, 0x1C,
+	0xDB, 0x07, 0xF8, 0x25, 0x64, 0x10, 0x82, 0xE1,
+	0x9A, 0x8D, 0xA2, 0xF9, 0x30, 0x77, 0xE8, 0xB1,
+	0xFC, 0x3D, 0x4E, 0x6B, 0x2D, 0x32, 0x58, 0x33,
+	0x6B, 0x4F, 0x9C, 0x64, 0x55, 0x15, 0x3A, 0xC0,
+	0x40, 0xA8, 0x47, 0xFB, 0x64, 0x7F, 0xBB, 0x6B,
+	0x55, 0x2A, 0x40, 0x00, 0x71, 0xFE, 0x17, 0x72,
+	0x48, 0x5B, 0x7A, 0x9D, 0x1F, 0x0D, 0x14, 0x7B,
+	0xF3, 0x38, 0x8C, 0x56, 0x54, 0x71, 0xE4, 0xE6,
+	0x2C, 0xC3, 0xCE, 0x0D, 0x0C, 0x0F, 0xC3, 0x60,
+	0xDF, 0x92, 0x89, 0xED, 0x99, 0x18, 0x37, 0x6B,
+	0x8B, 0x8B, 0x93, 0x14, 0x50, 0x47, 0xF8, 0xFE,
+	0xA2, 0x98, 0x60, 0x07, 0xC2, 0xAA, 0x89, 0x92,
+	0x2F, 0x69, 0xEB, 0x47, 0x5B, 0x59, 0x7B, 0x2B,
+	0xBA, 0x23, 0x7B, 0x9C, 0x84, 0x2E, 0x3F, 0xF1,
+	0xD3, 0x25, 0xE8, 0x2A, 0x1F, 0x23, 0xE9, 0x49,
+	0x89, 0xD0, 0x06, 0xBC, 0x7C, 0xE4, 0x94, 0x6F,
+	0x2E, 0x8B, 0x77, 0xE1, 0x08, 0x48, 0x46, 0x3C,
+	0x47, 0xFE, 0x7B, 0x20, 0x9E, 0x2A, 0x61, 0x7D,
+	0xDD, 0x41, 0x79, 0x6A, 0xE6, 0x14, 0x5E, 0x70,
+	0x9C, 0xDA, 0x94, 0x06, 0xF2, 0x26, 0x12, 0x57,
+	0xC2, 0x13, 0xB4, 0xB3, 0x0D, 0xA3, 0x0A, 0xC2,
+	0x5B, 0x0D, 0x06, 0xCF, 0x79, 0xA8, 0x12, 0xC5,
+	0xFC, 0xB0, 0xEF, 0x11, 0xD9, 0xFE, 0xDF, 0xE0,
+	0x99, 0x4A, 0xFE, 0x3B, 0x69, 0xB0, 0x6A, 0x29,
+	0x16, 0xCF, 0x69, 0x2B, 0x9D, 0xA7, 0x60, 0x28,
+	0xE5, 0xF3, 0xA0, 0x48, 0x79, 0xE6, 0x96, 0xD2,
+	0x1F, 0x73, 0x5C, 0x37, 0x83, 0x15, 0x36, 0x4D,
+	0xB0, 0xA4, 0xE0, 0xAB, 0x6B, 0x53, 0xD3, 0x1E,
+	0xFA, 0xF3, 0x0D, 0x65, 0xE3, 0x7A, 0x1B, 0x6A,
+	0x77, 0x04, 0x6F, 0x04, 0xC6, 0x4B, 0xA1, 0x07,
+	0x2A, 0x97, 0x80, 0xE0, 0xC5, 0x66, 0xC9, 0x43,
+	0x39, 0xA4, 0xD1, 0x9D, 0x00, 0x68, 0xC5, 0x7D,
+	0x6E, 0x6F, 0x0B, 0x51, 0x2D, 0xB7, 0x13, 0x4A,
+	0x95, 0x0E, 0xAF, 0x4F, 0x7B, 0x01, 0xA5, 0xFD,
+	0xD0, 0x65, 0xB9, 0x1B, 0xFA, 0x29, 0xE4, 0x42,
+	0x36, 0x79, 0xCD, 0xE7, 0x4B, 0xC6, 0xA8, 0xF1,
+	0xC8, 0x4C, 0x4D, 0xF7, 0x83, 0x87, 0x23, 0x1D,
+	0xC8, 0x5C, 0xE3, 0x26, 0x70, 0x44, 0x59, 0x03,
+	0xC4, 0xBE, 0xBE, 0xE3, 0xF5, 0x0C, 0x43, 0xE5,
+	0x04, 0x49, 0x49, 0x69, 0x11, 0xAA, 0x93, 0xE7,
+	0xE3, 0x95, 0x78, 0x74, 0x14, 0xD3, 0x17, 0x68,
+	0xD9, 0x91, 0x25, 0x20, 0xF8, 0x3C, 0x02, 0xFF,
+	0x01, 0x12, 0x4D, 0xCF, 0x0E, 0x12, 0x5F, 0xAF,
+	0xD5, 0xB9, 0xD7, 0xE7, 0xDD, 0xA4, 0xF5, 0xB5,
+	0x0C, 0x70, 0xAE, 0xBB, 0x85, 0x99, 0xA2, 0xE4,
+	0x47, 0x6A, 0x0D, 0xE5, 0x31, 0xB0, 0x40, 0x26,
+	0x72, 0xDF, 0x75, 0x75, 0x14, 0x2D, 0x86, 0x01,
+	0x60, 0x5C, 0x94, 0x01, 0x79, 0x23, 0xF6, 0x4A,
+	0xC5, 0x77, 0xC4, 0xBE, 0xD8, 0xD8, 0xE8, 0x9A,
+	0x74, 0xCA, 0x9F, 0x38, 0x19, 0xCB, 0xF1, 0x42,
+	0xA7, 0x2D, 0xEB, 0xE7, 0x7C, 0x4E, 0xFB, 0x71,
+	0x27, 0xE2, 0xD8, 0xC1, 0xB7, 0xBF, 0xB6, 0x42,
+	0x86, 0xC0, 0xBD, 0x52, 0x23, 0x3F, 0x43, 0xC6,
+	0x7D, 0x57, 0x17, 0xF9, 0x7A, 0xD8, 0x28, 0x54,
+	0x87, 0x3D, 0xDC, 0x7F, 0x71, 0xD6, 0x56, 0xAA,
+	0xA6, 0xEF, 0x70, 0x70, 0x60, 0xAF, 0x28, 0x0B,
+	0x9F, 0x45, 0x4B, 0x4F, 0xED, 0xB4, 0x77, 0x6E,
+	0x83, 0xB2, 0xFD, 0xBA, 0x20, 0xA4, 0x5A, 0xEF,
+	0xEB, 0x54, 0x9A, 0x1E, 0xD0, 0x38, 0x20, 0x21,
+	0x89, 0x3C, 0xA9, 0xA6, 0xE7, 0x4C, 0xCC, 0x30,
+	0xA2, 0x55, 0x39, 0x37, 0xCC, 0xEF, 0x34, 0x38,
+	0x99, 0xB5, 0x02, 0xCF, 0x46, 0xDD, 0xB8, 0xDD,
+	0x1D, 0x95, 0xFE, 0xFB, 0x60, 0xC9, 0xB2, 0x04,
+	0x69, 0xA1, 0x50, 0x3B, 0x2A, 0x68, 0x75, 0x87,
+	0x83, 0x0D, 0x33, 0xCE, 0xE9, 0xA7, 0x2D, 0x79,
+	0x8F, 0xCF, 0x4A, 0x9B, 0x45, 0x2C, 0x85, 0x49,
+	0xF5, 0x59, 0xC5, 0xD9, 0xFC, 0x6B, 0xFE, 0x08,
+	0x3F, 0x44, 0x6C, 0x2D, 0x90, 0x39, 0x81, 0xD9,
+	0xF2, 0x64, 0x92, 0x48, 0x3A, 0xB4, 0x52, 0xEA,
+	0x5B, 0xB1, 0x00, 0x8F, 0xFE, 0xAC, 0x97, 0x5D,
+	0xA0, 0x27, 0x59, 0x59, 0x3E, 0x7E, 0x06, 0x63,
+	0x61, 0x07, 0x3A, 0x83, 0xB2, 0x7B, 0x53, 0x1A,
+	0x3D, 0x0D, 0xDA, 0x51, 0x7C, 0xA9, 0x90, 0xEA,
+	0x32, 0x35, 0xD1, 0xD7, 0xB5, 0xE0, 0x9D, 0xA5,
+	0xF0, 0x2D, 0xC1, 0x52, 0x5B, 0x1D, 0xA6, 0x85,
+	0x96, 0x5B, 0x54, 0xFC, 0x2A, 0x3A, 0x73, 0xA1,
+	0x79, 0x0E, 0x0E, 0xFB, 0x69, 0xE7, 0x0A, 0x78,
+	0xFA, 0x55, 0x03, 0x44, 0xEA, 0x8C, 0x75, 0x3D,
+	0xBF, 0x18, 0x63, 0x9B, 0xAA, 0x8C, 0xB1, 0x25,
+	0x9A, 0xA7, 0x4F, 0x68, 0xF9, 0x2A, 0xBA, 0x80,
+	0x07, 0xC6, 0x18, 0xCC, 0xB6, 0xF5, 0x06, 0x9F,
+	0xF4, 0x6B, 0x97, 0x51, 0xBB, 0xFF, 0xF3, 0x7D,
+	0xF3, 0x21, 0x36, 0x0F, 0x0F, 0x5C, 0x0E, 0x7F,
+	0x56, 0x26, 0xDD, 0x12, 0x9A, 0xE3, 0xAE, 0x2A,
+	0x7C, 0x56, 0xCD, 0xB6, 0x11, 0xED, 0xA4, 0xC9,
+	0x8F, 0xEC, 0x83, 0x16, 0x3C, 0xD5, 0x11, 0x68,
+	0x78, 0xC1, 0xA9, 0x3E, 0xBA, 0xA2, 0x6D, 0xB4,
+	0x05, 0xEA, 0xF4, 0xA7, 0xAB, 0xA2, 0x77, 0x83,
+	0x7D, 0xE9, 0xA5, 0x15, 0x04, 0x70, 0x76, 0x24,
+	0xEF, 0x2E, 0x1B, 0xBB, 0xCA, 0x29, 0x24, 0x11,
+	0x16, 0x7F, 0x2E, 0x3D, 0x39, 0x0C, 0x0E, 0x51,
+	0xF8, 0x4A, 0x2F, 0x13, 0x83, 0x90, 0xE3, 0x3F,
+	0x85, 0x83, 0x5D, 0x38, 0xA9, 0x4D, 0xBB, 0xE7,
+	0x1E, 0x6C, 0x82, 0x1E, 0x86, 0xB1, 0x1F, 0xFD,
+	0x89, 0xEF, 0xF4, 0xBF, 0xE2, 0x08, 0xD6, 0x00,
+	0x5D, 0x28, 0xF7, 0x04, 0xBA, 0xEA, 0xD1, 0xF2,
+	0x5D, 0xE0, 0xEB, 0x24, 0x1B, 0x18, 0xFC, 0x7F,
+	0xA0, 0xDD, 0xD9, 0x0D, 0xC1, 0x39, 0xBE, 0x7F,
+	0xCB, 0xEB, 0x97, 0x30, 0xFA, 0xE4, 0xB5, 0xD1,
+	0x72, 0x70, 0xCE, 0x4C, 0x67, 0x0C, 0x42, 0x57,
+	0x0A, 0x9C, 0xF2, 0x5B, 0xC4, 0xFA, 0xE5, 0xCD,
+	0x31, 0xE5, 0xD5, 0x5A, 0xD0, 0x22, 0x6A, 0x94,
+	0xBE, 0x52, 0x94, 0x8C, 0x67, 0x02, 0xA9, 0x86,
+	0xA0, 0xAD, 0xBF, 0xCD, 0x3A, 0xC4, 0x82, 0xBB,
+	0x12, 0xAB, 0xBB, 0x79, 0xA2, 0xF6, 0x60, 0x28,
+	0x42, 0x15, 0x3B, 0x2F, 0x82, 0xA3, 0xB3, 0xCD,
+	0x16, 0x88, 0xE7, 0x4D, 0x36, 0x53, 0x4B, 0xFF,
+	0x8C, 0x48, 0xD3, 0xC4, 0x51, 0xEB, 0x2C, 0x5F,
+	0x98, 0xFE, 0xB9, 0xE7, 0x86, 0x4D, 0x60, 0xAF,
+	0x96, 0xE8, 0x3B, 0x21, 0x62, 0x46, 0x74, 0x82,
+	0xF0, 0x58, 0x63, 0x9C, 0x86, 0xA7, 0x85, 0xA9,
+	0xA1, 0xD4, 0xB6, 0x9B, 0xC3, 0x0E, 0x77, 0xA6,
+	0x4C, 0x3B, 0xBC, 0xD7, 0xDE, 0xB4, 0xE3, 0xD3,
+	0x0F, 0x1A, 0x67, 0x21, 0x20, 0x3D, 0x87, 0xA8,
+	0x8A, 0xB8, 0x5E, 0x02, 0x7A, 0x97, 0x42, 0xFC,
+	0x68, 0x8F, 0x0A, 0xDF, 0x15, 0x72, 0x8E, 0x59,
+	0x7E, 0x91, 0x0C, 0xFE, 0x5D, 0xF3, 0x3C, 0x56,
+	0xA1, 0x36, 0xEF, 0x39, 0xC7, 0xCA, 0x5D, 0x65,
+	0x0C, 0x2B, 0x9F, 0x90, 0x1C, 0x9B, 0x89, 0xE1,
+	0xE0, 0x93, 0x54, 0x93, 0x61, 0xF3, 0x03, 0xBE,
+	0x88, 0x39, 0xD1, 0x45, 0x4C, 0xCE, 0xB5, 0xFB,
+	0xC4, 0x43, 0x5F, 0xA0, 0xDA, 0xB5, 0x8A, 0x8F,
+	0xC2, 0x85, 0x36, 0x0E, 0xEA, 0x49, 0x1C, 0xA0,
+	0x77, 0x96, 0x1C, 0x4A, 0xAA, 0x3E, 0x96, 0xDE,
+	0x99, 0x71, 0xB9, 0x4F, 0xDF, 0xA5, 0x20, 0x7C,
+	0xCF, 0x0D, 0x9D, 0xAB, 0x2C, 0x48, 0x96, 0xF0,
+	0x7E, 0xB6, 0x77, 0x1A, 0x38, 0x3C, 0x65, 0x12,
+	0xF4, 0x1E, 0xA2, 0x8D, 0xEE, 0xE4, 0x07, 0xFD,
+	0xAE, 0x3C, 0x57, 0x4F, 0x5D, 0x41, 0x6A, 0x89,
+	0x7A, 0x27, 0xEF, 0x7C, 0xF5, 0x96, 0xF0, 0x43,
+	0x2D, 0x62, 0x4A, 0x2C, 0x4E, 0xAC, 0xE5, 0x2F,
+	0x3C, 0xBF, 0x2C, 0x63, 0x31, 0xB8, 0x0C, 0x9C,
+	0x91, 0x65, 0xBF, 0x13, 0x34, 0x24, 0x69, 0x32,
+	0x02, 0x4E, 0xC0, 0xBE, 0x44, 0xB3, 0x21, 0x36,
+	0xB4, 0xE4, 0x34, 0x27, 0x91, 0x35, 0x85, 0x03,
+	0x64, 0xC7, 0x57, 0xF1, 0xDC, 0xFA, 0x63, 0x85,
+	0xE2, 0x56, 0x33, 0x12, 0xC5, 0xF5, 0x53, 0xF0,
+	0xC8, 0x44, 0xEA, 0xBB, 0x79, 0x11, 0xCE, 0xE7,
+	0x60, 0xCA, 0xEB, 0x3E, 0x19, 0x3B, 0xF3, 0xA9,
+	0xC3, 0x81, 0x14, 0x87, 0x23, 0x9A, 0xD2, 0xE0,
+	0x14, 0x78, 0xF4, 0x6E, 0x41, 0x8A, 0x5D, 0xE5,
+	0x6B, 0x7F, 0x17, 0x55, 0xBA, 0x68, 0xF9, 0xA3,
+	0x74, 0x61, 0x3B, 0x5D, 0xE2, 0xED, 0x26, 0xC5,
+	0x80, 0xC7, 0x72, 0xDB, 0xDB, 0xFA, 0xB1, 0xF7,
+	0xE3, 0xF5, 0x7D, 0x94, 0xF8, 0x4E, 0x30, 0xDE,
+	0xB2, 0x9D, 0x70, 0xA9, 0x1D, 0xF2, 0x88, 0xFC,
+	0x43, 0xA2, 0x76, 0xDF, 0xED, 0x58, 0xE2, 0xB0,
+	0xDB, 0x53, 0x83, 0xE5, 0x32, 0xB6, 0xEE, 0xDF,
+	0xB3, 0x92, 0xE4, 0x3D, 0xC3, 0xDA, 0x72, 0x01,
+	0xA0, 0x68, 0xF5, 0x23, 0x1E, 0xE5, 0x22, 0x09,
+	0x8D, 0x68, 0x59, 0xB2, 0xD5, 0x64, 0x63, 0xA8,
+	0x91, 0x7B, 0x3C, 0x25, 0x61, 0x65, 0x79, 0x66,
+	0xDB, 0xC4, 0x78, 0x56, 0xB6, 0xFF, 0xC8, 0x2B,
+	0xCC, 0x37, 0x9F, 0xFD, 0x08, 0xB2, 0x59, 0xF3,
+	0xD9, 0xD7, 0x87, 0x3B, 0xA8, 0xFC, 0xBE, 0x4C,
+	0x94, 0x13, 0xB6, 0x01, 0x15, 0x91, 0x60, 0x70,
+	0x1D, 0xF0, 0x04, 0x70, 0xB1, 0x49, 0xBD, 0xF3,
+	0x2F, 0x4D, 0x3C, 0xFC, 0xFB, 0x9D, 0xEB, 0xC7,
+	0x72, 0x41, 0x71, 0x7D, 0x13, 0x06, 0x7A, 0xAE,
+	0xD2, 0x3C, 0x7A, 0x26, 0x51, 0x18, 0x51, 0x69,
+	0xF1, 0x26, 0x70, 0x61, 0xFB, 0x6B, 0x30, 0xE4,
+	0xFE, 0xA7, 0x3F, 0x66, 0xF4, 0xF9, 0x27, 0x56,
+	0xAC, 0x26, 0x23, 0x41, 0x8A, 0xF8, 0xB2, 0xA3,
+	0x98, 0x71, 0x1B, 0x7C, 0x68, 0x07, 0xB4, 0x34,
+	0x25, 0xE1, 0xD9, 0x9B, 0xFD, 0xCD, 0x5D, 0xF5,
+	0x31, 0x95, 0x28, 0x79, 0x06, 0xA3, 0x32, 0xF5,
+	0x99, 0x71, 0xA0, 0xC3, 0x43, 0x97, 0x5F, 0xC3,
+	0x20, 0xAD, 0x13, 0x7C, 0x9E, 0x34, 0xCE, 0x7C,
+	0xE8, 0x55, 0x20, 0xB2, 0x6C, 0xA1, 0x97, 0xA1,
+	0xFA, 0x2D, 0xF2, 0xEC, 0xD4, 0xE3, 0xFA, 0x83,
+	0x3B, 0x3B, 0xD2, 0xC2, 0x44, 0x82, 0x80, 0x42,
+	0x52, 0xCF, 0x1D, 0xF6, 0xAD, 0xC6, 0x39, 0x8F,
+	0x35, 0xE9, 0x8A, 0xB1, 0x87, 0x10, 0x40, 0x76,
+	0x80, 0xC9, 0xC1, 0xDB, 0xAC, 0x8C, 0x7E, 0xDC,
+	0x86, 0x46, 0xB9, 0x70, 0x82, 0xE2, 0xE1, 0x21,
+	0xFA, 0xA7, 0xFA, 0xC2, 0x1E, 0x4A, 0x33, 0x83,
+	0x84, 0xCB, 0x92, 0x20, 0x2C, 0x61, 0xBD, 0x12,
+	0x6C, 0x5D, 0xDD, 0x45, 0x8B, 0x32, 0x7A, 0x18,
+	0xBD, 0x71, 0x6F, 0x14, 0x2C, 0xA5, 0xCD, 0xB3,
+	0xE4, 0x9D, 0x7E, 0xB8, 0xD9, 0x62, 0xB5, 0xB8,
+	0x5A, 0x88, 0xF7, 0x99, 0xB6, 0x9A, 0x6A, 0x66,
+	0xC7, 0xBD, 0x62, 0x9F, 0x56, 0xB4, 0x3C, 0x02,
+	0x90, 0x62, 0x9B, 0x5E, 0x27, 0x4C, 0xDE, 0xC7,
+	0xA0, 0x72, 0x29, 0xE7, 0x93, 0x9A, 0x77, 0xD3,
+	0x2E, 0x8E, 0xF7, 0x30, 0xFC, 0xCE, 0xAD, 0x9C,
+	0x4E, 0x06, 0x77, 0xA8, 0x3A, 0x03, 0x30, 0xAB,
+	0x76, 0x5D, 0x33, 0x6D, 0xD2, 0xAA, 0x15, 0x5D,
+	0xCD, 0x2A, 0xC7, 0xF3, 0x15, 0x29, 0x77, 0x4F,
+	0x49, 0x36, 0xB0, 0x5D, 0x0B, 0x14, 0xB4, 0x8F,
+	0xAA, 0x1E, 0x8C, 0xD4, 0x50, 0x56, 0xE5, 0x6C,
+	0x13, 0x9B, 0x17, 0xF8, 0x90, 0x71, 0x5A, 0xD6,
+	0x3D, 0x6C, 0x4A, 0x9F, 0x2D, 0x97, 0x6C, 0x8B,
+	0x63, 0x5B, 0xDF, 0xE5, 0x86, 0x02, 0x81, 0x6F,
+	0x61, 0x2C, 0x6E, 0x4B, 0x22, 0x53, 0x67, 0xCB,
+	0x9A, 0x7B, 0xB7, 0x9C, 0x01, 0x8F, 0x1B, 0x8C,
+	0x53, 0x15, 0x18, 0x0A, 0xAD, 0xBE, 0x3A, 0xB7,
+	0x5A, 0xC3, 0x56, 0x20, 0x6F, 0xE2, 0x7C, 0x12,
+	0xDF, 0x3B, 0x56, 0x97, 0x84, 0xE3, 0xA5, 0x38,
+	0xFB, 0x05, 0x24, 0x18, 0x26, 0x6E, 0x72, 0xDB,
+	0x40, 0x0D, 0x6F, 0x32, 0xC4, 0x29, 0x7F, 0x34,
+	0xF9, 0xF1, 0xAF, 0x18, 0x6C, 0x37, 0x65, 0x65,
+	0x5F, 0x11, 0xB3, 0xE5, 0xA3, 0xC8, 0x04, 0x9B,
+	0x7D, 0xF1, 0x40, 0x11, 0xFF, 0x21, 0x5F, 0xBF,
+	0x17, 0xBF, 0x89, 0xEE, 0x97, 0x6C, 0xF0, 0xDB,
+	0xAB, 0x62, 0x70, 0x10, 0x4E, 0x7E, 0x31, 0x9D,
+	0x1F, 0x64, 0xC5, 0x9E, 0x20, 0x9E, 0x35, 0x82,
+};
+
+uint8_t mldsa_44_pubkey_noseed[] = {
+	0xBA, 0x71, 0xF9, 0xF6, 0x4E, 0x11, 0xBA, 0xEB,
+	0x58, 0xFA, 0x9C, 0x6F, 0xBB, 0x6E, 0x14, 0xE6,
+	0x1F, 0x18, 0x64, 0x3D, 0xAB, 0x49, 0x5B, 0x47,
+	0x53, 0x9A, 0x91, 0x66, 0xCA, 0x01, 0x98, 0x13,
+	0x1C, 0x44, 0xF8, 0x26, 0xBB, 0xD5, 0x6E, 0x34,
+	0xE5, 0x5D, 0xB5, 0xE5, 0xE2, 0xD7, 0x33, 0x48,
+	0x5E, 0x39, 0xEA, 0x26, 0x0F, 0xC6, 0x00, 0x0C,
+	0x5E, 0xA4, 0xBA, 0x80, 0xD3, 0x45, 0x5C, 0xDE,
+	0x53, 0xB4, 0x6F, 0x34, 0x48, 0x2A, 0xED, 0xFD,
+	0x54, 0x50, 0xFC, 0x2E, 0x1B, 0xA4, 0xF2, 0x5D,
+	0x15, 0xF9, 0xC1, 0x44, 0x24, 0x2F, 0xB3, 0x9B,
+	0xB5, 0x22, 0x87, 0x18, 0x90, 0x30, 0xC5, 0x04,
+	0x98, 0xE1, 0x71, 0x7B, 0x7C, 0x75, 0x8B, 0x19,
+	0x0A, 0x67, 0x48, 0xEA, 0x9A, 0xA3, 0xF7, 0xAC,
+	0xAA, 0xF2, 0xC7, 0xCB, 0x52, 0x6E, 0xD7, 0x17,
+	0xC9, 0xF7, 0x9A, 0xEB, 0x84, 0x21, 0x4F, 0xA5,
+	0xCD, 0x8D, 0xED, 0x92, 0xA0, 0xC3, 0xFA, 0x15,
+	0x58, 0x81, 0x0F, 0x12, 0xC7, 0x05, 0x0A, 0x36,
+	0x77, 0x08, 0xD1, 0x96, 0xCD, 0x24, 0xE5, 0xAF,
+	0x97, 0x49, 0x04, 0xAE, 0xD8, 0xE4, 0xCE, 0x88,
+	0x72, 0xE8, 0x69, 0x6B, 0x0B, 0x7B, 0xCA, 0x50,
+	0xE4, 0x52, 0xCD, 0x7D, 0x30, 0xEA, 0x9A, 0x4A,
+	0xDA, 0xC0, 0x31, 0x1D, 0x67, 0x2C, 0x6B, 0xDE,
+	0x84, 0x96, 0x24, 0x0B, 0x07, 0x43, 0x14, 0x63,
+	0x70, 0x88, 0x95, 0xCD, 0x9B, 0xAF, 0xC3, 0x16,
+	0x32, 0xD7, 0x39, 0x76, 0x49, 0x38, 0x8F, 0xDA,
+	0xFC, 0xBF, 0x7D, 0x30, 0x5A, 0x3D, 0xE9, 0xA4,
+	0x95, 0xEC, 0xA7, 0x43, 0x3A, 0x8F, 0x83, 0xBA,
+	0x0F, 0x0B, 0x25, 0xC4, 0x13, 0xC6, 0xE3, 0x9C,
+	0x96, 0xEB, 0x7D, 0x69, 0x1B, 0x34, 0xD3, 0x7C,
+	0xE3, 0x7F, 0x1E, 0xEA, 0xD1, 0xCF, 0x21, 0x7E,
+	0x25, 0xEF, 0x34, 0xEE, 0xCF, 0x3F, 0x7C, 0x60,
+	0xF8, 0x4B, 0x8E, 0xDF, 0xDD, 0xE8, 0x40, 0x5D,
+	0x4F, 0x83, 0x25, 0x76, 0xC6, 0x1E, 0xF9, 0x8E,
+	0x0A, 0x2F, 0x28, 0xDA, 0x18, 0x77, 0x00, 0x95,
+	0x39, 0x24, 0xF6, 0x86, 0xB9, 0x46, 0x14, 0x70,
+	0x5B, 0xCF, 0x53, 0xD3, 0x3F, 0xED, 0xD4, 0x34,
+	0x8E, 0xDD, 0xDB, 0xDF, 0x28, 0xB5, 0x06, 0x5E,
+	0x1F, 0x20, 0x77, 0x50, 0x43, 0xE8, 0x5C, 0xF9,
+	0x31, 0xF8, 0x29, 0x17, 0x93, 0x63, 0xA1, 0xA7,
+	0xE7, 0x40, 0x4A, 0x83, 0x8E, 0xC0, 0x00, 0x86,
+	0xB0, 0x97, 0x63, 0x86, 0xFE, 0x63, 0x7C, 0x98,
+	0x24, 0x47, 0x57, 0xE3, 0xF7, 0x69, 0xDD, 0xD4,
+	0x46, 0x74, 0x71, 0xBF, 0xAD, 0x67, 0x0F, 0x9A,
+	0x05, 0xF8, 0x24, 0x6E, 0xE5, 0x0A, 0x7B, 0x1E,
+	0xAF, 0x87, 0xFC, 0x40, 0x69, 0xC3, 0xAE, 0x2A,
+	0xA2, 0x03, 0x32, 0x58, 0x11, 0x77, 0x92, 0xF0,
+	0xBC, 0xD4, 0x9E, 0x08, 0x3F, 0xD1, 0xBC, 0x74,
+	0x96, 0xAB, 0xFF, 0x29, 0xCC, 0x94, 0xE4, 0x86,
+	0x8B, 0x21, 0x21, 0x4E, 0xD3, 0x16, 0x52, 0x53,
+	0x99, 0xA6, 0x10, 0xFB, 0xDD, 0x4A, 0x80, 0xE7,
+	0xC8, 0x07, 0x15, 0xF2, 0x95, 0x78, 0xE2, 0xA8,
+	0x4B, 0xB4, 0x0B, 0xDD, 0xDB, 0xD9, 0xF4, 0x7A,
+	0x11, 0xB6, 0xE7, 0xDA, 0x11, 0x8A, 0x1B, 0x65,
+	0x8D, 0x35, 0x9E, 0x8A, 0xEF, 0x55, 0xEB, 0x46,
+	0xB5, 0x37, 0x6B, 0x5B, 0x65, 0x59, 0x79, 0x98,
+	0x4A, 0x92, 0x2B, 0xEE, 0xBF, 0xC5, 0x9B, 0xCD,
+	0x60, 0x0D, 0x53, 0x09, 0xDC, 0xCD, 0x72, 0xDB,
+	0xF0, 0x78, 0x7D, 0xB8, 0xBA, 0x75, 0x7B, 0x53,
+	0x7C, 0x1E, 0xAF, 0xD5, 0xC0, 0xF5, 0x0E, 0xA4,
+	0xBC, 0x95, 0x83, 0x54, 0x9E, 0x28, 0x29, 0xA4,
+	0x2C, 0x28, 0xCA, 0xC2, 0x48, 0xC9, 0x6D, 0x78,
+	0x12, 0x4C, 0x47, 0x15, 0x9B, 0x18, 0xAE, 0xDD,
+	0x75, 0x4A, 0xBA, 0x17, 0xB1, 0x9D, 0x43, 0x0F,
+	0xB7, 0x8F, 0x63, 0x3E, 0xA9, 0xD2, 0x6F, 0x54,
+	0xA9, 0xBD, 0x50, 0xF8, 0xD8, 0xF6, 0xB7, 0x35,
+	0x94, 0xF8, 0x28, 0x97, 0x6E, 0x7E, 0xA0, 0x9C,
+	0x53, 0xBB, 0xB9, 0xF1, 0x1A, 0x56, 0xC9, 0x50,
+	0x7F, 0xB8, 0x9B, 0x9A, 0x5E, 0xBC, 0x03, 0x7A,
+	0x37, 0x26, 0x7A, 0x95, 0xF8, 0x5B, 0x8D, 0x64,
+	0xCA, 0x97, 0x19, 0x2B, 0x10, 0xA6, 0x6F, 0x41,
+	0x7B, 0x3F, 0x61, 0xFE, 0x9C, 0xA5, 0x71, 0x30,
+	0xA4, 0x8F, 0xD9, 0x25, 0xEA, 0xE2, 0xAB, 0x55,
+	0x02, 0xD5, 0x71, 0xC8, 0xA5, 0x19, 0x03, 0xC1,
+	0xD3, 0x98, 0xF4, 0xC1, 0xF7, 0x6A, 0x7E, 0x11,
+	0x74, 0x39, 0x76, 0xAF, 0xDB, 0xC6, 0x97, 0xF2,
+	0x30, 0x94, 0xA3, 0xCD, 0x76, 0x1F, 0xF9, 0x68,
+	0x5D, 0xE3, 0x2E, 0x09, 0xFB, 0x3C, 0x28, 0xAD,
+	0xD4, 0x53, 0x49, 0x03, 0x00, 0xBC, 0x7C, 0x89,
+	0xDC, 0x01, 0x78, 0x00, 0x96, 0x07, 0x17, 0x22,
+	0x94, 0x57, 0x75, 0xF2, 0x64, 0xE1, 0xB0, 0x62,
+	0x3B, 0xCF, 0x46, 0x19, 0xC7, 0x12, 0xC8, 0x38,
+	0x76, 0x12, 0x05, 0xD8, 0x76, 0x91, 0xB7, 0x5E,
+	0xF3, 0x60, 0x19, 0x6C, 0xBB, 0x9E, 0x9B, 0x92,
+	0xA0, 0xD4, 0xC4, 0xED, 0x62, 0x32, 0x6E, 0x50,
+	0x24, 0xD7, 0x75, 0x10, 0xB8, 0xEE, 0x2C, 0x74,
+	0x26, 0xCC, 0x22, 0xEA, 0xE2, 0x09, 0xDC, 0x9F,
+	0x13, 0xBD, 0xE6, 0xBF, 0x08, 0xF5, 0xE7, 0x18,
+	0x1B, 0xD3, 0xB4, 0x59, 0x45, 0x0B, 0x45, 0x1A,
+	0x51, 0x53, 0x9A, 0x71, 0x5C, 0x21, 0xD6, 0x7D,
+	0xD3, 0x30, 0xEB, 0x59, 0x70, 0xDB, 0x00, 0xD9,
+	0xED, 0xBF, 0xB2, 0x82, 0x2B, 0x03, 0x6F, 0xA1,
+	0x3B, 0xAF, 0xEB, 0x86, 0xD8, 0xDC, 0x78, 0x86,
+	0x6E, 0x3F, 0x8D, 0x43, 0xE5, 0x3D, 0x78, 0xCC,
+	0xA5, 0x59, 0x5A, 0x6F, 0xAF, 0x88, 0x6B, 0x5D,
+	0xC1, 0x12, 0xF1, 0xCF, 0x4A, 0xDC, 0xFA, 0x87,
+	0x58, 0x00, 0xD9, 0x0B, 0x48, 0x88, 0x3A, 0xF9,
+	0x73, 0x16, 0xFE, 0x15, 0x06, 0x87, 0x3F, 0xC1,
+	0x57, 0xE5, 0x70, 0xEA, 0xCB, 0xFD, 0x22, 0x28,
+	0x68, 0xD1, 0x42, 0x34, 0x10, 0x19, 0x66, 0xAF,
+	0xB6, 0xBF, 0x99, 0x40, 0x82, 0x92, 0x53, 0xA9,
+	0x53, 0xAD, 0xA8, 0x9F, 0xC7, 0x56, 0xB6, 0xA8,
+	0x49, 0xF7, 0x0A, 0xCB, 0x98, 0x38, 0xE6, 0x9F,
+	0xAA, 0x50, 0xBB, 0xA7, 0x5E, 0x3E, 0x89, 0xC2,
+	0xAD, 0xB5, 0x7E, 0x86, 0xD0, 0x88, 0xAB, 0x9B,
+	0x04, 0xA2, 0x8E, 0x67, 0x07, 0x09, 0x17, 0x22,
+	0x43, 0xEC, 0x5E, 0x00, 0x08, 0xA5, 0xCE, 0xAF,
+	0x3F, 0x87, 0x22, 0xF4, 0x87, 0x30, 0x25, 0x96,
+	0xFF, 0xD7, 0x55, 0xAD, 0x1B, 0x82, 0xA4, 0x9C,
+	0x34, 0xB3, 0x46, 0x95, 0x15, 0xB4, 0x6A, 0xA2,
+	0x90, 0xCD, 0x86, 0xEE, 0x38, 0xEA, 0x7A, 0x9B,
+	0xE3, 0xF1, 0x03, 0x61, 0x03, 0x35, 0xB5, 0x31,
+	0xCC, 0xA3, 0x33, 0xDD, 0xFE, 0x32, 0xB1, 0x45,
+	0x10, 0xF4, 0xB0, 0x7E, 0xF9, 0x5F, 0xC6, 0x68,
+	0x4E, 0x8C, 0x45, 0x4A, 0x92, 0xC1, 0x0D, 0xBB,
+	0x5D, 0x59, 0xC7, 0xA7, 0xC6, 0x3F, 0xB3, 0x05,
+	0xFE, 0x88, 0x19, 0x67, 0xD9, 0x9E, 0x66, 0x9E,
+	0xB6, 0x32, 0x84, 0x05, 0x82, 0x56, 0x0B, 0xB4,
+	0x03, 0x43, 0x1D, 0x40, 0xF7, 0x5A, 0x49, 0x54,
+	0x90, 0x84, 0x82, 0x27, 0x82, 0x92, 0x82, 0x1F,
+	0x4E, 0xA9, 0x1E, 0x42, 0xE7, 0x8F, 0xA4, 0x8C,
+	0xAE, 0xE3, 0xC8, 0x36, 0x14, 0x6D, 0xCF, 0xD7,
+	0x38, 0xD1, 0x17, 0xE9, 0x2E, 0x9A, 0x15, 0x13,
+	0x7D, 0x28, 0xE8, 0xE6, 0xA4, 0xB4, 0x62, 0x26,
+	0x50, 0xCB, 0x41, 0x35, 0x04, 0xCB, 0x3A, 0x33,
+	0x5D, 0x44, 0xBE, 0xEC, 0x57, 0x46, 0xC1, 0xC2,
+	0x94, 0xB1, 0xE8, 0xCB, 0x99, 0xCB, 0x60, 0x8D,
+	0x92, 0x8F, 0x8C, 0xE3, 0x56, 0x36, 0x32, 0xC5,
+	0x21, 0xF2, 0x3D, 0x13, 0xC6, 0x1A, 0x8F, 0x61,
+	0xC0, 0x1D, 0xF8, 0xC9, 0x6C, 0x73, 0x60, 0xDB,
+	0x4F, 0x3C, 0x68, 0xAA, 0x5D, 0x2F, 0xDD, 0x34,
+	0x2A, 0x62, 0xFF, 0x34, 0x59, 0xC1, 0x16, 0x38,
+	0x94, 0x21, 0xAB, 0x43, 0xE8, 0x58, 0x4C, 0x45,
+	0x88, 0x2B, 0x50, 0xE6, 0xE4, 0xE9, 0x6D, 0xB6,
+	0xF0, 0xB8, 0xFD, 0xE8, 0x90, 0xD5, 0xDB, 0xFA,
+	0xDC, 0xD8, 0x86, 0x90, 0xB4, 0x49, 0xE6, 0x42,
+	0x40, 0xDD, 0xB2, 0x02, 0x37, 0x47, 0xF3, 0x08,
+	0x36, 0x3E, 0x30, 0x1A, 0xA7, 0x77, 0x57, 0x16,
+	0x9F, 0xC6, 0x15, 0x06, 0x28, 0xD5, 0x92, 0x0B,
+	0x5A, 0xA1, 0xAB, 0x1C, 0x8C, 0xBF, 0x44, 0xCB,
+	0x00, 0xE0, 0x25, 0xD7, 0x87, 0x9D, 0x72, 0xB4,
+	0x79, 0xE3, 0xAF, 0x53, 0x11, 0xC7, 0x85, 0x72,
+	0x55, 0x90, 0xDA, 0x9C, 0x89, 0xB9, 0xFC, 0x3B,
+	0x84, 0x50, 0x76, 0x95, 0x54, 0xEB, 0x44, 0xD2,
+	0x03, 0xEB, 0xA2, 0xBB, 0xAE, 0xF9, 0xCA, 0xD2,
+	0x23, 0x70, 0x11, 0xC2, 0xEA, 0x44, 0xEF, 0xF0,
+	0x0F, 0x29, 0x9A, 0x48, 0xFF, 0xE2, 0x8C, 0xA9,
+	0x3D, 0xDF, 0x85, 0xF7, 0x66, 0x08, 0x24, 0x2E,
+	0xF8, 0xD6, 0xCC, 0x24, 0x61, 0x0A, 0x1E, 0x20,
+	0x78, 0xFC, 0xAC, 0x4F, 0x93, 0x85, 0xC3, 0x14,
+	0x90, 0x5E, 0xCA, 0xA8, 0x2E, 0x55, 0x39, 0x16,
+	0xD9, 0x4D, 0x1A, 0x7C, 0x1E, 0xC6, 0x52, 0xAA,
+	0x08, 0x89, 0x70, 0x83, 0xDA, 0xA2, 0xEB, 0xB1,
+	0x77, 0x5F, 0xBC, 0x47, 0x1A, 0xE2, 0x77, 0x77,
+	0xD7, 0x90, 0x4E, 0xA9, 0xF1, 0xB9, 0x2B, 0xCA,
+	0xC3, 0xD8, 0xA3, 0x15, 0x84, 0x26, 0x08, 0x7B,
+	0x64, 0x5B, 0x11, 0x08, 0xF0, 0xD6, 0x5F, 0xEC,
+	0x93, 0x78, 0x9C, 0x05, 0x37, 0x43, 0xCA, 0x14,
+	0xFD, 0x63, 0xD0, 0x5E, 0x98, 0xB6, 0x52, 0xDF,
+	0x2B, 0x9C, 0x2F, 0xF9, 0xCE, 0x05, 0xF1, 0x94,
+	0x07, 0x03, 0xFF, 0xB2, 0x73, 0xF8, 0x0E, 0x0E,
+	0x27, 0x32, 0xEC, 0xA9, 0x96, 0x0D, 0x98, 0x1B,
+	0x4C, 0xFD, 0x3B, 0x7B, 0xB8, 0x04, 0x5B, 0x3C,
+	0x38, 0x30, 0x54, 0x6B, 0x9D, 0xD8, 0xDB, 0x0D,
+};
+
+uint8_t mldsa_44_extmu[] = {
+	0x1B, 0x2A, 0xA5, 0xD5, 0xE3, 0xF3, 0xC1, 0xD4,
+	0x8D, 0x7C, 0xE6, 0x8F, 0xE9, 0xE3, 0xD1, 0xF5,
+	0x2E, 0x4B, 0x7C, 0xD6, 0x2A, 0xF4, 0x2E, 0xE5,
+	0x8F, 0xC3, 0xB1, 0xA4, 0xB9, 0xD1, 0x2C, 0x8B,
+	0x9E, 0x4D, 0x7A, 0xA9, 0x7C, 0xD3, 0xE6, 0x5A,
+	0xF4, 0x1B, 0x2A, 0xA5, 0xD5, 0xE3, 0xF3, 0xC1,
+	0xD4, 0x8D, 0x7C, 0xE6, 0x8F, 0xE9, 0xE3, 0xD1,
+	0xF5, 0x2E, 0x4B, 0x7C, 0xD6, 0x2A, 0xF4, 0x2E,
+};
+
 struct
 cperf_rsa_test_data rsa_qt_perf_data[4] = {
 	{
@@ -4292,6 +5910,49 @@ struct cperf_mlkem_test_data  mlkem_decap_perf_data[] = {
 	}
 };
 
+struct cperf_mldsa_test_data mldsa_sign_perf_data[] = {
+	{
+		.name = "mldsa_44_sign (deterministic)",
+		.type = RTE_CRYPTO_ML_DSA_44,
+		.privkey = {
+			.data = mldsa_44_privkey_noseed,
+			.length = sizeof(mldsa_44_privkey_noseed),
+		},
+		.pubkey = {
+			.data = mldsa_44_pubkey_noseed,
+			.length = sizeof(mldsa_44_pubkey_noseed),
+		},
+		.message = {
+			.data = mldsa_44_message,
+			.length = sizeof(mldsa_44_message),
+		},
+		.sign = {
+			.data = mldsa_44_sign_dtrm,
+			.length = sizeof(mldsa_44_sign_dtrm),
+		},
+		.sign_deterministic = true,
+	},
+};
+
+struct cperf_mldsa_test_data mldsa_verify_perf_data[] = {
+	{
+		.name = "mldsa_44_verify",
+		.type = RTE_CRYPTO_ML_DSA_44,
+		.pubkey = {
+			.data = mldsa_44_pubkey_noseed,
+			.length = sizeof(mldsa_44_pubkey_noseed),
+		},
+		.message = {
+			.data = mldsa_44_message,
+			.length = sizeof(mldsa_44_message),
+		},
+		.sign = {
+			.data = mldsa_44_sign_dtrm,
+			.length = sizeof(mldsa_44_sign_dtrm),
+		},
+	},
+};
+
 struct cperf_test_vector*
 cperf_test_vector_get_dummy(struct cperf_options *options)
 {
diff --git a/app/test-crypto-perf/cperf_test_vectors.h b/app/test-crypto-perf/cperf_test_vectors.h
index e498196ae3..6b4b4f22b4 100644
--- a/app/test-crypto-perf/cperf_test_vectors.h
+++ b/app/test-crypto-perf/cperf_test_vectors.h
@@ -188,6 +188,41 @@ struct cperf_sm2_test_data {
 	int curve;
 };
 
+struct cperf_mldsa_test_data {
+	const char *name;
+	enum rte_crypto_ml_dsa_type type;
+	struct {
+		uint8_t *data;
+		uint32_t length;
+	} privkey;
+	struct {
+		uint8_t *data;
+		uint32_t length;
+	} pubkey;
+	struct {
+		uint8_t *data;
+		uint32_t length;
+	} message;
+	struct {
+		uint8_t *data;
+		uint32_t length;
+	} sign;
+	struct {
+		uint8_t *data;
+		uint32_t length;
+	} ctx;
+	struct {
+		uint8_t *data;
+		uint32_t length;
+	} seed;
+	struct {
+		uint8_t *data;
+		uint32_t length;
+	} mu;
+	enum rte_crypto_auth_algorithm hash;
+	bool sign_deterministic;
+};
+
 struct cperf_test_vector*
 cperf_test_vector_get_dummy(struct cperf_options *options);
 
@@ -215,5 +250,7 @@ extern struct cperf_rsa_test_data rsa_qt_perf_data[4];
 extern struct cperf_rsa_plaintext rsa_plaintext;
 extern struct cperf_mlkem_test_data mlkem_encap_perf_data[];
 extern struct cperf_mlkem_test_data mlkem_decap_perf_data[];
+extern struct cperf_mldsa_test_data mldsa_sign_perf_data[];
+extern struct cperf_mldsa_test_data mldsa_verify_perf_data[];
 
 #endif
diff --git a/app/test-crypto-perf/main.c b/app/test-crypto-perf/main.c
index 2e228201ab..c4d844d225 100644
--- a/app/test-crypto-perf/main.c
+++ b/app/test-crypto-perf/main.c
@@ -55,6 +55,7 @@ const char *cperf_op_type_strs[] = {
 	[CPERF_ASYM_SM2] = "sm2",
 	[CPERF_TLS] = "tls-record",
 	[CPERF_ASYM_MLKEM512] = "mlkem_512",
+	[CPERF_ASYM_MLDSA44] = "mldsa_44",
 };
 
 const char *cperf_rsa_priv_keytype_strs[] = {
@@ -247,6 +248,7 @@ cperf_initialize_cryptodev(struct cperf_options *opts, uint8_t *enabled_cdevs)
 		case CPERF_ASYM_SM2:
 		case CPERF_ASYM_RSA:
 		case CPERF_ASYM_MLKEM512:
+		case CPERF_ASYM_MLDSA44:
 		case CPERF_ASYM_MODEX:
 			conf.ff_disable |= (RTE_CRYPTODEV_FF_SECURITY |
 					    RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO);
@@ -516,6 +518,21 @@ cperf_verify_devices_capabilities(struct cperf_options *opts,
 				opts->sm2_data->sign_s.length = sm2_perf_data.sign_s.length;
 			}
 		}
+		if (opts->op_type == CPERF_ASYM_MLDSA44) {
+			asym_cap_idx.type = RTE_CRYPTO_ASYM_XFORM_ML_DSA;
+			asym_capability = rte_cryptodev_asym_capability_get(cdev_id, &asym_cap_idx);
+			if (asym_capability == NULL)
+				return -1;
+
+			if (opts->asym_op_type == RTE_CRYPTO_ASYM_OP_SIGN)
+				opts->mldsa_data = &mldsa_sign_perf_data[0];
+			else if (opts->asym_op_type == RTE_CRYPTO_ASYM_OP_VERIFY)
+				opts->mldsa_data = &mldsa_verify_perf_data[0];
+			else {
+				RTE_LOG(ERR, USER1, "Unsupported MLDSA operation type\n");
+				return -ENOTSUP;
+			}
+		}
 
 		if (opts->op_type == CPERF_ASYM_MLKEM512) {
 			asym_cap_idx.type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
diff --git a/doc/guides/tools/cryptoperf.rst b/doc/guides/tools/cryptoperf.rst
index 13f9db66f4..7a7ee5c884 100644
--- a/doc/guides/tools/cryptoperf.rst
+++ b/doc/guides/tools/cryptoperf.rst
@@ -184,6 +184,7 @@ The following are the application command-line options:
            rsa
            sm2
            mlkem_512
+           mldsa_44
            ipsec
            tls-record
 
-- 
2.43.0


^ permalink raw reply related

* [PATCH v3 1/2] app/crypto-perf: support ML KEM
From: Pratik Senapati @ 2026-06-24  7:02 UTC (permalink / raw)
  To: dev; +Cc: gakhil, kai.ji
In-Reply-To: <20260609055315.1539233-1-psenapati@marvell.com>

Add ML-KEM512 support to test-crypto-perf.

Signed-off-by: Pratik Senapati <psenapati@marvell.com>
---
 app/test-crypto-perf/cperf_ops.c             |  61 +++
 app/test-crypto-perf/cperf_options.h         |   2 +
 app/test-crypto-perf/cperf_options_parsing.c |  20 +
 app/test-crypto-perf/cperf_test_common.c     |   3 +-
 app/test-crypto-perf/cperf_test_vectors.c    | 470 +++++++++++++++++++
 app/test-crypto-perf/cperf_test_vectors.h    |  27 ++
 app/test-crypto-perf/main.c                  |  21 +-
 doc/guides/tools/cryptoperf.rst              |   1 +
 8 files changed, 603 insertions(+), 2 deletions(-)

diff --git a/app/test-crypto-perf/cperf_ops.c b/app/test-crypto-perf/cperf_ops.c
index 9297b4a3d3..c30ffc3476 100644
--- a/app/test-crypto-perf/cperf_ops.c
+++ b/app/test-crypto-perf/cperf_ops.c
@@ -208,6 +208,49 @@ cperf_set_ops_asym_sm2(struct rte_crypto_op **ops,
 	}
 }
 
+static void
+cperf_set_ops_asym_mlkem(struct rte_crypto_op **ops,
+		uint32_t src_buf_offset __rte_unused,
+		uint32_t dst_buf_offset __rte_unused, uint16_t nb_ops,
+		void *sess,
+		const struct cperf_options *options,
+		const struct cperf_test_vector *test_vector __rte_unused,
+		uint16_t iv_offset __rte_unused,
+		uint32_t *imix_idx __rte_unused,
+		uint64_t *tsc_start __rte_unused)
+{
+	uint16_t i;
+
+	for (i = 0; i < nb_ops; i++) {
+		struct rte_crypto_asym_op *asym_op = ops[i]->asym;
+
+		ops[i]->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
+		rte_crypto_op_attach_asym_session(ops[i], sess);
+
+		if (options->asym_op_type == RTE_CRYPTO_ASYM_OP_ENCRYPT) {
+			asym_op->mlkem.op = RTE_CRYPTO_ML_KEM_OP_ENCAP;
+			asym_op->mlkem.encap.ek.data = options->mlkem_data->ek.data;
+			asym_op->mlkem.encap.ek.length = options->mlkem_data->ek.length;
+			asym_op->mlkem.encap.cipher.data = options->mlkem_data->cipher.data;
+			asym_op->mlkem.encap.cipher.length = options->mlkem_data->cipher.length;
+			asym_op->mlkem.encap.sk.data = options->mlkem_data->sk.data;
+			asym_op->mlkem.encap.sk.length = options->mlkem_data->sk.length;
+			asym_op->mlkem.encap.message.data = options->mlkem_data->message.data;
+			asym_op->mlkem.encap.message.length = options->mlkem_data->message.length;
+		} else if (options->asym_op_type == RTE_CRYPTO_ASYM_OP_DECRYPT) {
+			asym_op->mlkem.op = RTE_CRYPTO_ML_KEM_OP_DECAP;
+			asym_op->mlkem.decap.dk.data = options->mlkem_data->dk.data;
+			asym_op->mlkem.decap.dk.length = options->mlkem_data->dk.length;
+			asym_op->mlkem.decap.cipher.data = options->mlkem_data->cipher.data;
+			asym_op->mlkem.decap.cipher.length = options->mlkem_data->cipher.length;
+			asym_op->mlkem.decap.sk.data = options->mlkem_data->sk.data;
+			asym_op->mlkem.decap.sk.length = options->mlkem_data->sk.length;
+		} else {
+			rte_panic("Unsupported ML-KEM operation type %d\n", options->asym_op_type);
+		}
+	}
+}
+
 
 #ifdef RTE_LIB_SECURITY
 static void
@@ -1226,6 +1269,21 @@ cperf_create_session(struct rte_mempool *sess_mp,
 
 		return asym_sess;
 	}
+
+	if (options->op_type == CPERF_ASYM_MLKEM512) {
+		xform.next = NULL;
+		xform.xform_type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+		xform.mlkem.type = RTE_CRYPTO_ML_KEM_512;
+
+		ret = rte_cryptodev_asym_session_create(dev_id, &xform, sess_mp, &asym_sess);
+		if (ret < 0 || asym_sess == NULL) {
+			RTE_LOG(ERR, USER1, "ML-KEM Asym session create failed\n");
+			return NULL;
+		}
+		return asym_sess;
+	}
+
+
 #ifdef RTE_LIB_SECURITY
 	/*
 	 * security only
@@ -1542,6 +1600,9 @@ cperf_get_op_functions(const struct cperf_options *options,
 	case CPERF_ASYM_SM2:
 		op_fns->populate_ops = cperf_set_ops_asym_sm2;
 		break;
+	case CPERF_ASYM_MLKEM512:
+		op_fns->populate_ops = cperf_set_ops_asym_mlkem;
+		break;
 #ifdef RTE_LIB_SECURITY
 	case CPERF_PDCP:
 	case CPERF_DOCSIS:
diff --git a/app/test-crypto-perf/cperf_options.h b/app/test-crypto-perf/cperf_options.h
index 428e8cb4f1..98b8eeec3e 100644
--- a/app/test-crypto-perf/cperf_options.h
+++ b/app/test-crypto-perf/cperf_options.h
@@ -101,6 +101,7 @@ enum cperf_op_type {
 	CPERF_ASYM_SECP521R1,
 	CPERF_ASYM_ED25519,
 	CPERF_ASYM_SM2,
+	CPERF_ASYM_MLKEM512,
 	CPERF_TLS,
 };
 
@@ -187,6 +188,7 @@ struct cperf_options {
 	struct cperf_ecdsa_test_data *secp521r1_data;
 	struct cperf_eddsa_test_data *eddsa_data;
 	struct cperf_sm2_test_data *sm2_data;
+	struct cperf_mlkem_test_data *mlkem_data;
 	enum rte_crypto_asym_op_type asym_op_type;
 	enum rte_crypto_auth_algorithm asym_hash_alg;
 	struct cperf_rsa_test_data *rsa_data;
diff --git a/app/test-crypto-perf/cperf_options_parsing.c b/app/test-crypto-perf/cperf_options_parsing.c
index 14e731586b..34afa938c8 100644
--- a/app/test-crypto-perf/cperf_options_parsing.c
+++ b/app/test-crypto-perf/cperf_options_parsing.c
@@ -41,6 +41,7 @@ usage(char *progname)
 		" --optype cipher-only / auth-only / cipher-then-auth / auth-then-cipher /\n"
 		"        aead / pdcp / docsis / ipsec / modex / rsa / secp192r1 /\n"
 		"        secp224r1 / secp256r1 / secp384r1 / secp521r1 / eddsa / sm2 /\n"
+		"        mlkem_512 /\n"
 		"        tls-record : set operation type\n"
 		" --sessionless: enable session-less crypto operations\n"
 		" --shared-session: share 1 session across all queue pairs on crypto device\n"
@@ -559,6 +560,10 @@ parse_op_type(struct cperf_options *opts, const char *arg)
 			cperf_op_type_strs[CPERF_ASYM_SM2],
 			CPERF_ASYM_SM2
 		},
+		{
+			cperf_op_type_strs[CPERF_ASYM_MLKEM512],
+			CPERF_ASYM_MLKEM512
+		},
 		{
 			cperf_op_type_strs[CPERF_TLS],
 			CPERF_TLS
@@ -1174,6 +1179,7 @@ cperf_options_default(struct cperf_options *opts)
 	opts->secp521r1_data = &secp521r1_perf_data;
 	opts->eddsa_data = &ed25519_perf_data;
 	opts->sm2_data = &sm2_perf_data;
+	opts->mlkem_data = &mlkem_encap_perf_data[0];
 	opts->asym_op_type = RTE_CRYPTO_ASYM_OP_ENCRYPT;
 }
 
@@ -1669,6 +1675,18 @@ cperf_options_check(struct cperf_options *options)
 		}
 	}
 
+	if (options->op_type == CPERF_ASYM_MLKEM512) {
+		if (options->asym_op_type == RTE_CRYPTO_ASYM_OP_ENCRYPT)
+			options->mlkem_data = &mlkem_encap_perf_data[0];
+		else if (options->asym_op_type == RTE_CRYPTO_ASYM_OP_DECRYPT)
+			options->mlkem_data = &mlkem_decap_perf_data[0];
+		else {
+			RTE_LOG(ERR, USER1,
+				"ML-KEM operations only support encrypt (encapsulate) and decrypt (decapsulate)\n");
+			return -EINVAL;
+		}
+	}
+
 #ifdef RTE_LIB_SECURITY
 	if (options->op_type == CPERF_DOCSIS) {
 		if (check_docsis_buffer_length(options) < 0)
@@ -1741,6 +1759,8 @@ cperf_options_dump(struct cperf_options *opts)
 				   rte_crypto_asym_op_strings[opts->asym_op_type]);
 		if (opts->op_type == CPERF_ASYM_RSA)
 			printf("# rsa test name: %s\n", opts->rsa_data->name);
+		if (opts->op_type == CPERF_ASYM_MLKEM512)
+			printf("# mlkem test name: %s\n", opts->mlkem_data->name);
 	}
 	printf("# sessionless: %s\n", opts->sessionless ? "yes" : "no");
 	printf("# shared session: %s\n", opts->shared_session ? "yes" : "no");
diff --git a/app/test-crypto-perf/cperf_test_common.c b/app/test-crypto-perf/cperf_test_common.c
index caf429b4d9..383d4bd940 100644
--- a/app/test-crypto-perf/cperf_test_common.c
+++ b/app/test-crypto-perf/cperf_test_common.c
@@ -313,7 +313,8 @@ cperf_is_asym_test(const struct cperf_options *options)
 	    options->op_type == CPERF_ASYM_SECP384R1 ||
 	    options->op_type == CPERF_ASYM_SECP521R1 ||
 	    options->op_type == CPERF_ASYM_ED25519 ||
-	    options->op_type == CPERF_ASYM_SM2)
+	    options->op_type == CPERF_ASYM_SM2 ||
+		options->op_type == CPERF_ASYM_MLKEM512)
 		return true;
 
 	return false;
diff --git a/app/test-crypto-perf/cperf_test_vectors.c b/app/test-crypto-perf/cperf_test_vectors.c
index f4f856ff69..6e2435b004 100644
--- a/app/test-crypto-perf/cperf_test_vectors.c
+++ b/app/test-crypto-perf/cperf_test_vectors.c
@@ -3510,6 +3510,430 @@ uint8_t rsa_8192_cipher[] = {
 	0xab, 0x45, 0xa7, 0x55, 0xf5, 0xc1, 0x33, 0x3e,
 };
 
+uint8_t mlkem_512_dk[] = {
+	0xd8, 0xc8, 0x4d, 0x74, 0x57, 0x6d, 0x43, 0x65,
+	0x84, 0xe0, 0x82, 0x87, 0x2d, 0xd0, 0x0b, 0x39,
+	0x08, 0x41, 0xc8, 0x85, 0x15, 0x26, 0xfb, 0x85,
+	0x68, 0xe1, 0x30, 0x98, 0xf0, 0xb1, 0x3d, 0xea,
+	0xa5, 0x4c, 0xc4, 0x59, 0x81, 0xfb, 0x33, 0xed,
+	0x20, 0x3a, 0x7f, 0x10, 0x82, 0x3d, 0x85, 0x18,
+	0x69, 0x56, 0x6b, 0x5b, 0x7c, 0x92, 0x0f, 0x57,
+	0x37, 0xf2, 0x93, 0x38, 0x24, 0xd3, 0x1e, 0xe1,
+	0x84, 0x16, 0x39, 0x9a, 0x0d, 0xbd, 0xba, 0x22,
+	0xaa, 0xc8, 0xa1, 0xd9, 0xd8, 0x2a, 0xc7, 0xc1,
+	0x78, 0x21, 0x01, 0x85, 0x38, 0x54, 0x39, 0x34,
+	0x25, 0x8c, 0xce, 0xda, 0xa3, 0x0c, 0x66, 0x99,
+	0x39, 0xf7, 0x63, 0xb6, 0x86, 0x80, 0xe0, 0xe4,
+	0x64, 0x2a, 0xfc, 0xc2, 0xe0, 0x71, 0x6c, 0x59,
+	0x7c, 0x9a, 0x03, 0xac, 0x6f, 0x16, 0x08, 0x64,
+	0x3d, 0x4b, 0xa5, 0x83, 0xc5, 0x34, 0x27, 0x2a,
+	0x20, 0x18, 0xb8, 0x2d, 0x28, 0x61, 0x2a, 0x94,
+	0x55, 0xc7, 0xc3, 0x93, 0x91, 0x71, 0x43, 0x7f,
+	0x74, 0xb2, 0x6b, 0x55, 0xb1, 0x9d, 0xc8, 0x08,
+	0x53, 0xda, 0xb6, 0x19, 0x46, 0x5c, 0x20, 0xea,
+	0x31, 0x31, 0xfc, 0x41, 0x02, 0xe6, 0x3c, 0x3e,
+	0xd8, 0x68, 0x6f, 0xa6, 0x66, 0x1e, 0xc7, 0xc6,
+	0x0a, 0xf8, 0x02, 0x1e, 0x1e, 0xfa, 0x9a, 0x30,
+	0x18, 0x64, 0xdc, 0x30, 0x20, 0x9a, 0xb6, 0x6e,
+	0x85, 0xe8, 0xb0, 0xb3, 0xe1, 0x24, 0x4e, 0xf0,
+	0x4a, 0x9c, 0xb3, 0x0e, 0xe0, 0xd2, 0x6a, 0x6e,
+	0xc7, 0xc3, 0x15, 0x35, 0x49, 0x77, 0x07, 0x7e,
+	0x33, 0x7c, 0x97, 0x6e, 0xeb, 0xb3, 0x7c, 0x86,
+	0xb2, 0xa0, 0xe3, 0x8a, 0x13, 0x81, 0x99, 0xc6,
+	0x75, 0x41, 0xa6, 0x2a, 0x6f, 0x16, 0xe2, 0x4e,
+	0x52, 0x14, 0x0d, 0xcb, 0x74, 0x8d, 0xb4, 0x89,
+	0xcf, 0xa8, 0x4c, 0x57, 0xaa, 0x18, 0x7d, 0xd7,
+	0x19, 0x5c, 0x11, 0x04, 0xc6, 0xe2, 0x2c, 0x09,
+	0x4d, 0x78, 0x7e, 0x9e, 0x1a, 0xa2, 0xab, 0x60,
+	0x59, 0xe4, 0x30, 0xa5, 0x6d, 0x11, 0x63, 0xf9,
+	0xb1, 0xa0, 0x98, 0xe2, 0x81, 0x34, 0xa6, 0x57,
+	0xf7, 0x18, 0x3e, 0x4c, 0x36, 0x02, 0x4d, 0xda,
+	0x6e, 0xac, 0x39, 0x6c, 0x29, 0x0b, 0x8c, 0xd7,
+	0x32, 0x8e, 0x45, 0x67, 0x36, 0x41, 0x6c, 0xab,
+	0xbb, 0x04, 0x2e, 0xae, 0xd3, 0x9f, 0xee, 0xfa,
+	0x5f, 0x4a, 0x04, 0x85, 0xf7, 0xfb, 0x97, 0x95,
+	0x78, 0xc4, 0x08, 0x39, 0xb8, 0xc5, 0x17, 0x9d,
+	0x2e, 0x6c, 0x14, 0xcd, 0xf2, 0xc1, 0xc5, 0x05,
+	0x9d, 0x34, 0x12, 0xcd, 0x86, 0xbc, 0x9e, 0x1c,
+	0xf9, 0x1c, 0x05, 0xc2, 0xc3, 0x29, 0xf2, 0x9d,
+	0xf4, 0xa9, 0xcc, 0x0d, 0x38, 0xce, 0x6f, 0xb4,
+	0x06, 0x68, 0xc0, 0xcd, 0xb2, 0xb6, 0x5d, 0xdf,
+	0x89, 0x58, 0x99, 0x70, 0xbe, 0x37, 0xa8, 0xb2,
+	0xc3, 0x6c, 0x2c, 0x13, 0x8c, 0xa7, 0x8a, 0x38,
+	0x36, 0x36, 0xe0, 0x77, 0x79, 0xf6, 0x30, 0xc5,
+	0x9c, 0x8e, 0x10, 0xc0, 0x1b, 0xb4, 0xe0, 0x74,
+	0x36, 0x6c, 0x9f, 0x80, 0x73, 0x3e, 0x57, 0x69,
+	0x5a, 0x79, 0x6a, 0x44, 0xb8, 0xe8, 0x25, 0xbe,
+	0x96, 0xae, 0xd7, 0x87, 0x30, 0x7e, 0x76, 0x8e,
+	0x1c, 0x09, 0x99, 0xd9, 0x4c, 0xb3, 0xf7, 0x45,
+	0x92, 0xfa, 0x77, 0x9e, 0x18, 0x72, 0x1a, 0x23,
+	0x9c, 0x4e, 0x5e, 0xd9, 0x22, 0x2e, 0xb0, 0x16,
+	0x9d, 0x03, 0x6a, 0x0e, 0x49, 0x94, 0x97, 0xa3,
+	0x19, 0x94, 0xa1, 0x7e, 0x9d, 0x7b, 0x87, 0xc1,
+	0x6a, 0x12, 0x42, 0xc9, 0x22, 0xbe, 0xeb, 0x38,
+	0xbe, 0xfa, 0x0b, 0xac, 0x25, 0xb9, 0x78, 0xec,
+	0x33, 0xdf, 0x86, 0xcb, 0xce, 0xe1, 0xa6, 0x69,
+	0x28, 0x39, 0xd5, 0x68, 0x73, 0xcb, 0x8a, 0xcc,
+	0x3d, 0xfa, 0x0e, 0x79, 0x71, 0x3e, 0x44, 0x19,
+	0x9a, 0xac, 0xf4, 0x43, 0xa9, 0xba, 0x10, 0x7e,
+	0x49, 0xc8, 0x8f, 0xf9, 0xac, 0xd2, 0x07, 0xb1,
+	0x4b, 0x2b, 0x15, 0x65, 0x05, 0x12, 0xc3, 0xcc,
+	0x36, 0x69, 0x17, 0x78, 0xa3, 0x00, 0x6d, 0xb7,
+	0xe9, 0x03, 0x78, 0xb3, 0x33, 0xe5, 0xcc, 0x22,
+	0xc3, 0x91, 0x8f, 0x47, 0x79, 0xaf, 0x2e, 0x19,
+	0x91, 0x05, 0xab, 0x5e, 0x3e, 0x43, 0xa4, 0x34,
+	0x0b, 0x8c, 0x89, 0x75, 0xc0, 0x08, 0x44, 0x07,
+	0xdd, 0x17, 0x83, 0xc6, 0x48, 0x09, 0x12, 0xe6,
+	0x25, 0xde, 0x99, 0x00, 0x51, 0xc1, 0x65, 0x8a,
+	0x85, 0x02, 0xa8, 0xd5, 0x72, 0x41, 0x67, 0x66,
+	0x08, 0xe9, 0x10, 0xa3, 0xa2, 0x07, 0xc8, 0x06,
+	0xc6, 0x0c, 0xc6, 0x47, 0xf7, 0x35, 0x20, 0x40,
+	0x69, 0x04, 0x3c, 0xba, 0x4b, 0xd3, 0x78, 0xa2,
+	0xa4, 0x71, 0xc7, 0x83, 0x2b, 0x69, 0xf9, 0xa2,
+	0x8b, 0xf5, 0xa6, 0x87, 0x46, 0xb3, 0x9b, 0x7a,
+	0x35, 0x97, 0x0b, 0xf4, 0x68, 0x15, 0x4a, 0x87,
+	0xeb, 0x0b, 0x2b, 0xa3, 0xba, 0xcd, 0xb3, 0x28,
+	0x80, 0x38, 0x19, 0x17, 0x1f, 0x44, 0x6f, 0x7f,
+	0x50, 0x75, 0x93, 0x00, 0x4c, 0x36, 0x07, 0x07,
+	0x11, 0xec, 0x91, 0xc4, 0x99, 0x5d, 0xf8, 0xe1,
+	0x53, 0x84, 0x01, 0xca, 0x6a, 0x64, 0x8c, 0xef,
+	0x17, 0xce, 0x81, 0xf5, 0xce, 0xaa, 0x80, 0xc1,
+	0x85, 0xc6, 0x6b, 0xe2, 0xc9, 0x43, 0xc9, 0xf5,
+	0xc3, 0x3a, 0xdb, 0xcf, 0xb9, 0x29, 0x64, 0x8d,
+	0xe7, 0x98, 0x0f, 0x8b, 0xb0, 0xd2, 0x84, 0x25,
+	0x37, 0xd1, 0x80, 0x38, 0x81, 0xb9, 0xe8, 0xb4,
+	0xa7, 0xc8, 0x3a, 0x27, 0x77, 0x9b, 0x81, 0xbb,
+	0x61, 0xae, 0x59, 0x06, 0x57, 0x40, 0x69, 0x11,
+	0xb2, 0x41, 0x68, 0x2d, 0x26, 0x62, 0x93, 0x40,
+	0x4d, 0x97, 0x1c, 0xb4, 0x63, 0x65, 0x04, 0xf8,
+	0x8c, 0x2a, 0x01, 0xb9, 0x6d, 0x3d, 0x87, 0x30,
+	0x28, 0x70, 0x80, 0x1d, 0xb2, 0x24, 0xb0, 0x5c,
+	0x90, 0x95, 0xa3, 0x6c, 0xdc, 0xa6, 0x66, 0x15,
+	0x33, 0x37, 0x8c, 0xa8, 0x9f, 0x24, 0xa3, 0x52,
+	0x21, 0x06, 0xb6, 0xaf, 0x51, 0xc0, 0x1d, 0x42,
+	0xa6, 0x55, 0x93, 0x6b, 0x4a, 0x32, 0x4e, 0xec,
+	0x46, 0xbe, 0xfa, 0x4a, 0x13, 0x5a, 0xca, 0x11,
+	0x39, 0xa1, 0x81, 0x8b, 0xc4, 0x07, 0x1b, 0x43,
+	0x1e, 0xa0, 0x5b, 0x34, 0x2d, 0x10, 0x6c, 0xdd,
+	0x3b, 0x18, 0x78, 0xe1, 0x0d, 0x5b, 0x61, 0x3d,
+	0xfd, 0x51, 0x6a, 0x78, 0x88, 0x2f, 0xa7, 0x84,
+	0xa3, 0x4f, 0x30, 0x3e, 0xb0, 0xdc, 0x96, 0xa8,
+	0xd7, 0xbb, 0x4c, 0xa6, 0x95, 0xb9, 0x27, 0x3f,
+	0x70, 0x46, 0xa3, 0xd8, 0x36, 0x22, 0x3b, 0x4b,
+	0x91, 0xa4, 0xe6, 0x31, 0x0d, 0xbb, 0x27, 0x2f,
+	0x15, 0x2c, 0xa7, 0x44, 0x19, 0xa9, 0xc1, 0xc8,
+	0xb2, 0x77, 0x1a, 0xd5, 0x14, 0x29, 0xa1, 0x76,
+	0xcc, 0x81, 0x88, 0x47, 0x3c, 0xd9, 0x9e, 0xba,
+	0x99, 0x26, 0xbb, 0xf6, 0x5e, 0xbc, 0x2a, 0x8e,
+	0xa0, 0x32, 0x32, 0x2e, 0x24, 0xa1, 0xc3, 0x07,
+	0xa5, 0xd4, 0xbb, 0x95, 0x03, 0x29, 0xb5, 0x59,
+	0x5a, 0x2b, 0x6c, 0x95, 0x15, 0xba, 0xb0, 0xaf,
+	0x27, 0xa2, 0xcb, 0xef, 0x46, 0xb6, 0xb2, 0x25,
+	0x21, 0x23, 0xf8, 0x18, 0x1c, 0xb0, 0x54, 0xad,
+	0x48, 0x38, 0xf6, 0x33, 0xa2, 0x55, 0xc8, 0x63,
+	0xce, 0x56, 0x34, 0x86, 0x6a, 0x61, 0x75, 0x75,
+	0x7f, 0x75, 0x49, 0x2a, 0x57, 0x72, 0x76, 0x3e,
+	0xa7, 0x08, 0x56, 0x28, 0x0b, 0x44, 0xa9, 0x00,
+	0xc2, 0x88, 0x28, 0x02, 0x55, 0x33, 0x55, 0x43,
+	0x97, 0x97, 0x42, 0xa4, 0xfe, 0xb1, 0x95, 0xee,
+	0x9b, 0x5d, 0xa9, 0x18, 0xc1, 0x90, 0xa5, 0x65,
+	0x20, 0x99, 0x39, 0xd2, 0xea, 0x08, 0x1c, 0xda,
+	0xa8, 0xfa, 0xa3, 0x3b, 0x56, 0xf0, 0x59, 0x17,
+	0x10, 0x0b, 0x45, 0x4a, 0x86, 0x88, 0x96, 0x49,
+	0x68, 0x98, 0x26, 0x55, 0x40, 0xb7, 0x5a, 0x29,
+	0x82, 0x93, 0xa1, 0x0e, 0x7b, 0x4b, 0xa2, 0x49,
+	0x61, 0x2b, 0xaf, 0xb4, 0x2d, 0xa1, 0xdc, 0xae,
+	0x79, 0x44, 0x66, 0x20, 0x72, 0xc5, 0x01, 0x36,
+	0x10, 0xd8, 0x81, 0x36, 0xb1, 0xea, 0xb1, 0x0d,
+	0xc2, 0x05, 0x75, 0xd8, 0xad, 0xe0, 0x73, 0xc6,
+	0x82, 0x8c, 0x7e, 0x97, 0x2b, 0x87, 0xb5, 0xc9,
+	0x1e, 0xac, 0xb0, 0x2a, 0x16, 0x20, 0x88, 0xb9,
+	0x41, 0x2f, 0xc8, 0x4b, 0xce, 0xd8, 0xc4, 0xa8,
+	0xe2, 0x68, 0x35, 0xd9, 0xd0, 0xc4, 0x7a, 0xf2,
+	0x25, 0xca, 0xb8, 0x06, 0x42, 0xcb, 0xc9, 0x8f,
+	0x0a, 0x60, 0xde, 0x19, 0xa8, 0xcb, 0x90, 0x85,
+	0x74, 0x42, 0x03, 0x89, 0xf4, 0x97, 0x8e, 0x41,
+	0xc5, 0x72, 0xe3, 0x52, 0x55, 0x81, 0x73, 0xe1,
+	0x71, 0x22, 0xa2, 0xfb, 0x8a, 0x36, 0xea, 0xb3,
+	0xc3, 0x33, 0x4f, 0x23, 0x55, 0x03, 0x1c, 0xa1,
+	0x84, 0x74, 0xe1, 0x69, 0x4d, 0xb3, 0xc2, 0x1f,
+	0xbc, 0x62, 0xeb, 0xf0, 0x50, 0x45, 0xb7, 0x83,
+	0xd3, 0x28, 0x37, 0x46, 0x35, 0x79, 0x04, 0x38,
+	0x16, 0xbd, 0x72, 0x2f, 0xbc, 0xf9, 0x7d, 0xb8,
+	0x20, 0x12, 0x87, 0xa7, 0xb0, 0x82, 0x7c, 0x3e,
+	0x4d, 0xa7, 0x18, 0x04, 0x54, 0x75, 0x19, 0x52,
+	0x61, 0x80, 0x57, 0xbe, 0x06, 0x37, 0x9c, 0xde,
+	0xb0, 0x93, 0x70, 0x54, 0x3f, 0x15, 0x83, 0xb2,
+	0xd3, 0x88, 0xa6, 0xd8, 0x56, 0x9b, 0x91, 0xf3,
+	0x00, 0x01, 0x00, 0xcd, 0xcb, 0x97, 0x16, 0x27,
+	0xc7, 0xaf, 0xb1, 0xd5, 0xba, 0x90, 0xa1, 0x24,
+	0x33, 0x26, 0x95, 0xba, 0xcb, 0x63, 0xa1, 0x56,
+	0xb0, 0x23, 0x09, 0x4e, 0xa8, 0x0a, 0x75, 0x02,
+	0xd8, 0x3b, 0xc1, 0x05, 0xa0, 0x73, 0x25, 0x26,
+	0x3e, 0xb8, 0x5b, 0xca, 0x6a, 0xae, 0x41, 0x22,
+	0xc5, 0x9d, 0x88, 0x3f, 0x37, 0x8c, 0x50, 0xcd,
+	0x09, 0x32, 0x34, 0x81, 0x98, 0xc1, 0x17, 0xa5,
+	0x62, 0x94, 0x8d, 0xcd, 0xd0, 0xc3, 0x08, 0x07,
+	0x2f, 0x8d, 0x52, 0x7b, 0xee, 0x81, 0xc5, 0x95,
+	0x2c, 0x8b, 0x46, 0x45, 0x5d, 0xf2, 0x62, 0x4d,
+	0x2e, 0x22, 0x7f, 0x0d, 0xa5, 0xc8, 0xba, 0x72,
+	0xa0, 0x8f, 0xd0, 0x21, 0x45, 0x28, 0xb9, 0xad,
+	0xac, 0x96, 0xa6, 0xc7, 0x33, 0x6d, 0xf3, 0x17,
+	0xcb, 0x7a, 0x32, 0x4e, 0x4c, 0x83, 0xa7, 0x15,
+	0x55, 0x6a, 0xca, 0xc1, 0xff, 0xd8, 0x90, 0xab,
+	0xaa, 0xa4, 0x65, 0xb0, 0x25, 0xf7, 0x47, 0x00,
+	0x2d, 0x20, 0x19, 0x23, 0xb5, 0x02, 0x39, 0x5a,
+	0x69, 0x1c, 0xc4, 0xbc, 0xa3, 0x80, 0xcc, 0x82,
+	0xd8, 0x66, 0x63, 0xc5, 0x7e, 0xa3, 0x6c, 0x2a,
+	0xb0, 0x7a, 0x02, 0xc6, 0xb3, 0xb7, 0xb0, 0x29,
+	0x3f, 0xa3, 0x99, 0xbd, 0x28, 0xf2, 0x8e, 0xd6,
+	0x7b, 0xb3, 0xd5, 0x24, 0x12, 0xb9, 0xbb, 0xa5,
+	0x68, 0xba, 0x9d, 0xe3, 0x44, 0xa3, 0xeb, 0x64,
+	0x13, 0xb8, 0x8a, 0x5e, 0x72, 0x60, 0xad, 0x95,
+	0xcb, 0x9d, 0xfb, 0x54, 0x6e, 0x0e, 0x66, 0xb5,
+	0xf4, 0x68, 0x25, 0x91, 0xc5, 0x1a, 0x4f, 0x71,
+	0x61, 0x50, 0xc8, 0xcb, 0x34, 0xc5, 0xc2, 0x84,
+	0xbc, 0x4e, 0x5f, 0x28, 0x6f, 0xbf, 0xbb, 0xc8,
+	0xb1, 0xc4, 0x4a, 0x4b, 0xb7, 0x1a, 0x00, 0xa0,
+	0x2d, 0xe9, 0x07, 0x39, 0x93, 0xe9, 0x81, 0x51,
+	0xe1, 0x34, 0x83, 0xf5, 0x82, 0x9d, 0xc7, 0x47,
+	0xf1, 0x61, 0xc8, 0x29, 0x52, 0x4d, 0x51, 0xb7,
+	0xa1, 0xeb, 0x49, 0x50, 0x6e, 0xda, 0x72, 0x5d,
+	0x69, 0x27, 0x83, 0xca, 0x4c, 0x3b, 0xd4, 0xcc,
+	0x7f, 0x26, 0x44, 0x2b, 0x76, 0x41, 0xe1, 0x50,
+	0xce, 0x0f, 0x40, 0x0d, 0x8f, 0x00, 0x6e, 0x27,
+	0x95, 0x6e, 0x92, 0x1b, 0xaf, 0xe4, 0x9b, 0x5e,
+	0x96, 0xec, 0xc7, 0xbf, 0x64, 0x77, 0x75, 0x6d,
+	0xda, 0xa8, 0x9c, 0x48, 0xf3, 0x79, 0x80, 0x4e,
+	0xed, 0x6f, 0xe0, 0x20, 0x1a, 0x2b, 0x7c, 0xa1,
+	0xac, 0x74, 0x42, 0x49, 0xd7, 0xe7, 0x7f, 0x57,
+	0x5a, 0xdb, 0x69, 0xb5, 0xe2, 0x7e, 0x81, 0x8d,
+	0xa9, 0x22, 0x5c, 0xda, 0xf3, 0xad, 0xbc, 0x3e,
+	0x0b, 0xd4, 0x9d, 0x63, 0xef, 0x40, 0x34, 0x66,
+	0x80, 0x8c, 0x2d, 0x31, 0x13, 0xdb, 0x31, 0x03,
+	0xdf, 0x29, 0x92, 0x4a, 0x81, 0x76, 0x4f, 0x4d,
+	0x5a, 0x64, 0x79, 0xf2, 0x8b, 0xc8, 0x3b, 0xc9,
+	0xf3, 0x35, 0xc7, 0x18, 0xcb, 0xb1, 0xa8, 0xd2,
+	0x24, 0xdb, 0x4d, 0x6a, 0x6a, 0xf1, 0xeb, 0xd2,
+};
+
+uint8_t mlkem_512_ek[] = {
+	0x28, 0x70, 0x80, 0x1d, 0xb2, 0x24, 0xb0, 0x5c,
+	0x90, 0x95, 0xa3, 0x6c, 0xdc, 0xa6, 0x66, 0x15,
+	0x33, 0x37, 0x8c, 0xa8, 0x9f, 0x24, 0xa3, 0x52,
+	0x21, 0x06, 0xb6, 0xaf, 0x51, 0xc0, 0x1d, 0x42,
+	0xa6, 0x55, 0x93, 0x6b, 0x4a, 0x32, 0x4e, 0xec,
+	0x46, 0xbe, 0xfa, 0x4a, 0x13, 0x5a, 0xca, 0x11,
+	0x39, 0xa1, 0x81, 0x8b, 0xc4, 0x07, 0x1b, 0x43,
+	0x1e, 0xa0, 0x5b, 0x34, 0x2d, 0x10, 0x6c, 0xdd,
+	0x3b, 0x18, 0x78, 0xe1, 0x0d, 0x5b, 0x61, 0x3d,
+	0xfd, 0x51, 0x6a, 0x78, 0x88, 0x2f, 0xa7, 0x84,
+	0xa3, 0x4f, 0x30, 0x3e, 0xb0, 0xdc, 0x96, 0xa8,
+	0xd7, 0xbb, 0x4c, 0xa6, 0x95, 0xb9, 0x27, 0x3f,
+	0x70, 0x46, 0xa3, 0xd8, 0x36, 0x22, 0x3b, 0x4b,
+	0x91, 0xa4, 0xe6, 0x31, 0x0d, 0xbb, 0x27, 0x2f,
+	0x15, 0x2c, 0xa7, 0x44, 0x19, 0xa9, 0xc1, 0xc8,
+	0xb2, 0x77, 0x1a, 0xd5, 0x14, 0x29, 0xa1, 0x76,
+	0xcc, 0x81, 0x88, 0x47, 0x3c, 0xd9, 0x9e, 0xba,
+	0x99, 0x26, 0xbb, 0xf6, 0x5e, 0xbc, 0x2a, 0x8e,
+	0xa0, 0x32, 0x32, 0x2e, 0x24, 0xa1, 0xc3, 0x07,
+	0xa5, 0xd4, 0xbb, 0x95, 0x03, 0x29, 0xb5, 0x59,
+	0x5a, 0x2b, 0x6c, 0x95, 0x15, 0xba, 0xb0, 0xaf,
+	0x27, 0xa2, 0xcb, 0xef, 0x46, 0xb6, 0xb2, 0x25,
+	0x21, 0x23, 0xf8, 0x18, 0x1c, 0xb0, 0x54, 0xad,
+	0x48, 0x38, 0xf6, 0x33, 0xa2, 0x55, 0xc8, 0x63,
+	0xce, 0x56, 0x34, 0x86, 0x6a, 0x61, 0x75, 0x75,
+	0x7f, 0x75, 0x49, 0x2a, 0x57, 0x72, 0x76, 0x3e,
+	0xa7, 0x08, 0x56, 0x28, 0x0b, 0x44, 0xa9, 0x00,
+	0xc2, 0x88, 0x28, 0x02, 0x55, 0x33, 0x55, 0x43,
+	0x97, 0x97, 0x42, 0xa4, 0xfe, 0xb1, 0x95, 0xee,
+	0x9b, 0x5d, 0xa9, 0x18, 0xc1, 0x90, 0xa5, 0x65,
+	0x20, 0x99, 0x39, 0xd2, 0xea, 0x08, 0x1c, 0xda,
+	0xa8, 0xfa, 0xa3, 0x3b, 0x56, 0xf0, 0x59, 0x17,
+	0x10, 0x0b, 0x45, 0x4a, 0x86, 0x88, 0x96, 0x49,
+	0x68, 0x98, 0x26, 0x55, 0x40, 0xb7, 0x5a, 0x29,
+	0x82, 0x93, 0xa1, 0x0e, 0x7b, 0x4b, 0xa2, 0x49,
+	0x61, 0x2b, 0xaf, 0xb4, 0x2d, 0xa1, 0xdc, 0xae,
+	0x79, 0x44, 0x66, 0x20, 0x72, 0xc5, 0x01, 0x36,
+	0x10, 0xd8, 0x81, 0x36, 0xb1, 0xea, 0xb1, 0x0d,
+	0xc2, 0x05, 0x75, 0xd8, 0xad, 0xe0, 0x73, 0xc6,
+	0x82, 0x8c, 0x7e, 0x97, 0x2b, 0x87, 0xb5, 0xc9,
+	0x1e, 0xac, 0xb0, 0x2a, 0x16, 0x20, 0x88, 0xb9,
+	0x41, 0x2f, 0xc8, 0x4b, 0xce, 0xd8, 0xc4, 0xa8,
+	0xe2, 0x68, 0x35, 0xd9, 0xd0, 0xc4, 0x7a, 0xf2,
+	0x25, 0xca, 0xb8, 0x06, 0x42, 0xcb, 0xc9, 0x8f,
+	0x0a, 0x60, 0xde, 0x19, 0xa8, 0xcb, 0x90, 0x85,
+	0x74, 0x42, 0x03, 0x89, 0xf4, 0x97, 0x8e, 0x41,
+	0xc5, 0x72, 0xe3, 0x52, 0x55, 0x81, 0x73, 0xe1,
+	0x71, 0x22, 0xa2, 0xfb, 0x8a, 0x36, 0xea, 0xb3,
+	0xc3, 0x33, 0x4f, 0x23, 0x55, 0x03, 0x1c, 0xa1,
+	0x84, 0x74, 0xe1, 0x69, 0x4d, 0xb3, 0xc2, 0x1f,
+	0xbc, 0x62, 0xeb, 0xf0, 0x50, 0x45, 0xb7, 0x83,
+	0xd3, 0x28, 0x37, 0x46, 0x35, 0x79, 0x04, 0x38,
+	0x16, 0xbd, 0x72, 0x2f, 0xbc, 0xf9, 0x7d, 0xb8,
+	0x20, 0x12, 0x87, 0xa7, 0xb0, 0x82, 0x7c, 0x3e,
+	0x4d, 0xa7, 0x18, 0x04, 0x54, 0x75, 0x19, 0x52,
+	0x61, 0x80, 0x57, 0xbe, 0x06, 0x37, 0x9c, 0xde,
+	0xb0, 0x93, 0x70, 0x54, 0x3f, 0x15, 0x83, 0xb2,
+	0xd3, 0x88, 0xa6, 0xd8, 0x56, 0x9b, 0x91, 0xf3,
+	0x00, 0x01, 0x00, 0xcd, 0xcb, 0x97, 0x16, 0x27,
+	0xc7, 0xaf, 0xb1, 0xd5, 0xba, 0x90, 0xa1, 0x24,
+	0x33, 0x26, 0x95, 0xba, 0xcb, 0x63, 0xa1, 0x56,
+	0xb0, 0x23, 0x09, 0x4e, 0xa8, 0x0a, 0x75, 0x02,
+	0xd8, 0x3b, 0xc1, 0x05, 0xa0, 0x73, 0x25, 0x26,
+	0x3e, 0xb8, 0x5b, 0xca, 0x6a, 0xae, 0x41, 0x22,
+	0xc5, 0x9d, 0x88, 0x3f, 0x37, 0x8c, 0x50, 0xcd,
+	0x09, 0x32, 0x34, 0x81, 0x98, 0xc1, 0x17, 0xa5,
+	0x62, 0x94, 0x8d, 0xcd, 0xd0, 0xc3, 0x08, 0x07,
+	0x2f, 0x8d, 0x52, 0x7b, 0xee, 0x81, 0xc5, 0x95,
+	0x2c, 0x8b, 0x46, 0x45, 0x5d, 0xf2, 0x62, 0x4d,
+	0x2e, 0x22, 0x7f, 0x0d, 0xa5, 0xc8, 0xba, 0x72,
+	0xa0, 0x8f, 0xd0, 0x21, 0x45, 0x28, 0xb9, 0xad,
+	0xac, 0x96, 0xa6, 0xc7, 0x33, 0x6d, 0xf3, 0x17,
+	0xcb, 0x7a, 0x32, 0x4e, 0x4c, 0x83, 0xa7, 0x15,
+	0x55, 0x6a, 0xca, 0xc1, 0xff, 0xd8, 0x90, 0xab,
+	0xaa, 0xa4, 0x65, 0xb0, 0x25, 0xf7, 0x47, 0x00,
+	0x2d, 0x20, 0x19, 0x23, 0xb5, 0x02, 0x39, 0x5a,
+	0x69, 0x1c, 0xc4, 0xbc, 0xa3, 0x80, 0xcc, 0x82,
+	0xd8, 0x66, 0x63, 0xc5, 0x7e, 0xa3, 0x6c, 0x2a,
+	0xb0, 0x7a, 0x02, 0xc6, 0xb3, 0xb7, 0xb0, 0x29,
+	0x3f, 0xa3, 0x99, 0xbd, 0x28, 0xf2, 0x8e, 0xd6,
+	0x7b, 0xb3, 0xd5, 0x24, 0x12, 0xb9, 0xbb, 0xa5,
+	0x68, 0xba, 0x9d, 0xe3, 0x44, 0xa3, 0xeb, 0x64,
+	0x13, 0xb8, 0x8a, 0x5e, 0x72, 0x60, 0xad, 0x95,
+	0xcb, 0x9d, 0xfb, 0x54, 0x6e, 0x0e, 0x66, 0xb5,
+	0xf4, 0x68, 0x25, 0x91, 0xc5, 0x1a, 0x4f, 0x71,
+	0x61, 0x50, 0xc8, 0xcb, 0x34, 0xc5, 0xc2, 0x84,
+	0xbc, 0x4e, 0x5f, 0x28, 0x6f, 0xbf, 0xbb, 0xc8,
+	0xb1, 0xc4, 0x4a, 0x4b, 0xb7, 0x1a, 0x00, 0xa0,
+	0x2d, 0xe9, 0x07, 0x39, 0x93, 0xe9, 0x81, 0x51,
+	0xe1, 0x34, 0x83, 0xf5, 0x82, 0x9d, 0xc7, 0x47,
+	0xf1, 0x61, 0xc8, 0x29, 0x52, 0x4d, 0x51, 0xb7,
+	0xa1, 0xeb, 0x49, 0x50, 0x6e, 0xda, 0x72, 0x5d,
+	0x69, 0x27, 0x83, 0xca, 0x4c, 0x3b, 0xd4, 0xcc,
+	0x7f, 0x26, 0x44, 0x2b, 0x76, 0x41, 0xe1, 0x50,
+	0xce, 0x0f, 0x40, 0x0d, 0x8f, 0x00, 0x6e, 0x27,
+	0x95, 0x6e, 0x92, 0x1b, 0xaf, 0xe4, 0x9b, 0x5e,
+	0x96, 0xec, 0xc7, 0xbf, 0x64, 0x77, 0x75, 0x6d,
+	0xda, 0xa8, 0x9c, 0x48, 0xf3, 0x79, 0x80, 0x4e,
+	0xed, 0x6f, 0xe0, 0x20, 0x1a, 0x2b, 0x7c, 0xa1,
+	0xac, 0x74, 0x42, 0x49, 0xd7, 0xe7, 0x7f, 0x57,
+};
+
+uint8_t mlkem_512_message[] = {
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20,
+	0x66, 0x72, 0x6f, 0x6d, 0x20, 0x4d, 0x4c, 0x2d,
+	0x4b, 0x45, 0x4d, 0x20, 0x74, 0x65, 0x73, 0x74,
+	0x20, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73,
+	0x2e
+};
+
+uint8_t mlkem_512_cipher[] = {
+	0x92, 0x98, 0x11, 0x65, 0x10, 0x78, 0xE3, 0xA4,
+	0x34, 0x94, 0xD1, 0x22, 0x56, 0xD6, 0xB1, 0xF6,
+	0xF7, 0x51, 0x2A, 0xCA, 0x8E, 0x04, 0x1D, 0x89,
+	0xBB, 0xA7, 0x84, 0xEF, 0xAA, 0x70, 0x11, 0x75,
+	0xFC, 0x48, 0xA1, 0x7E, 0x4C, 0x99, 0xBD, 0xB8,
+	0x05, 0x01, 0xA6, 0xF0, 0x0E, 0x18, 0x0D, 0x75,
+	0xF0, 0xBB, 0xBD, 0x6F, 0x28, 0xF4, 0xDC, 0x3A,
+	0x58, 0x3D, 0x83, 0x1D, 0x78, 0xF9, 0x0E, 0x06,
+	0x5C, 0x0B, 0x77, 0x4C, 0x28, 0x82, 0xE1, 0xA4,
+	0x77, 0xAD, 0x14, 0x71, 0x3D, 0x5D, 0x53, 0x41,
+	0xCE, 0x4F, 0x36, 0x32, 0x24, 0xD7, 0x09, 0xF0,
+	0xB8, 0xF2, 0x95, 0x68, 0x84, 0x5C, 0x62, 0xC3,
+	0x77, 0x9A, 0x74, 0xD3, 0x29, 0xC1, 0x88, 0x8B,
+	0xBF, 0x05, 0x73, 0x43, 0x30, 0x20, 0xB4, 0xB0,
+	0xB3, 0xE1, 0xB5, 0x91, 0xA8, 0xBD, 0x4B, 0x7F,
+	0x2E, 0x53, 0x20, 0x55, 0xDE, 0x4D, 0xDB, 0x91,
+	0x73, 0xF9, 0x2F, 0x21, 0xF6, 0xAE, 0x6D, 0xEE,
+	0x67, 0x37, 0x82, 0x11, 0xE3, 0x0A, 0x5A, 0xB8,
+	0x68, 0xC7, 0x22, 0x34, 0x2A, 0xD4, 0x37, 0xAF,
+	0x50, 0xE0, 0xDB, 0xED, 0x89, 0x6D, 0x97, 0x0C,
+	0xF6, 0x0D, 0x6D, 0x9B, 0x1D, 0x5B, 0xE1, 0xF6,
+	0x45, 0x48, 0xF0, 0x75, 0x38, 0xE0, 0x2E, 0x11,
+	0x88, 0xEC, 0x8B, 0x51, 0x47, 0x21, 0xF6, 0x6F,
+	0x13, 0x3E, 0xA4, 0x46, 0xFE, 0xB0, 0x15, 0x81,
+	0x68, 0x9C, 0x0F, 0x15, 0xCB, 0x64, 0x6D, 0x0B,
+	0x04, 0x63, 0xBA, 0x67, 0x6C, 0x86, 0xE8, 0xAC,
+	0xB3, 0xE5, 0x47, 0x88, 0x27, 0x4A, 0xBC, 0x58,
+	0x13, 0x4D, 0x6F, 0xA6, 0x2C, 0xEC, 0x83, 0xB0,
+	0x6E, 0x93, 0x7C, 0xC7, 0x6E, 0xBB, 0xBF, 0xE1,
+	0x9F, 0xD6, 0x6E, 0xD8, 0x7A, 0xC5, 0xA2, 0x4D,
+	0xA2, 0x1C, 0xDA, 0x55, 0x1E, 0xF2, 0x1C, 0x71,
+	0x3E, 0x82, 0xD7, 0x92, 0x6F, 0x89, 0x1E, 0x53,
+	0x48, 0x00, 0x9E, 0x93, 0xCB, 0xE3, 0x79, 0xB5,
+	0x87, 0xDE, 0xF7, 0x84, 0xD6, 0x25, 0x57, 0x07,
+	0x47, 0xEE, 0xDB, 0xA8, 0xC2, 0x7E, 0xE8, 0xF9,
+	0x56, 0x22, 0x34, 0xE9, 0xD0, 0xC8, 0x3F, 0xF2,
+	0xCB, 0xE7, 0x92, 0xE1, 0x03, 0xF4, 0x38, 0x88,
+	0xE4, 0xC6, 0xB2, 0x42, 0x6F, 0x08, 0x61, 0x77,
+	0x7F, 0x8A, 0xCD, 0x9D, 0x21, 0x3E, 0xE2, 0x18,
+	0x52, 0x15, 0x02, 0x62, 0x2F, 0xCA, 0xEE, 0x44,
+	0x60, 0x15, 0x6B, 0x76, 0x7D, 0x12, 0xC7, 0x0F,
+	0xA0, 0x6C, 0xA1, 0x7B, 0xAE, 0xD6, 0x40, 0x1B,
+	0x61, 0x46, 0xB4, 0x47, 0x97, 0x6C, 0xE1, 0x4C,
+	0x47, 0x35, 0x29, 0x02, 0x6D, 0x69, 0x5E, 0x32,
+	0xF7, 0x7F, 0x9C, 0xFA, 0x87, 0xD3, 0x7D, 0x33,
+	0x85, 0x53, 0xF3, 0x8F, 0x0A, 0x41, 0x3C, 0x84,
+	0x00, 0x14, 0x04, 0x63, 0xA8, 0xC3, 0xCB, 0xEB,
+	0xAF, 0xCB, 0xE1, 0x78, 0xB2, 0x30, 0xC0, 0xA6,
+	0x9D, 0x7A, 0x28, 0x0A, 0x60, 0x5F, 0x45, 0x74,
+	0x24, 0xBE, 0xD8, 0x0D, 0xCB, 0x3A, 0x1B, 0xD1,
+	0x9C, 0x2A, 0x4E, 0x9A, 0xD1, 0x27, 0xCB, 0xAB,
+	0x08, 0x72, 0x89, 0xD9, 0xBA, 0x15, 0x01, 0x92,
+	0x4F, 0xFA, 0x7A, 0xCA, 0x32, 0xD3, 0x7E, 0xB1,
+	0xEB, 0xE7, 0xDF, 0x21, 0x33, 0x4F, 0xBD, 0x5F,
+	0xCF, 0x64, 0x5D, 0x36, 0x21, 0x63, 0x34, 0x68,
+	0x90, 0x81, 0x15, 0xC7, 0xF7, 0x28, 0x46, 0x42,
+	0xC9, 0x78, 0xC0, 0xA3, 0x5F, 0xF8, 0x86, 0x01,
+	0xF4, 0x1C, 0x6A, 0x65, 0xA2, 0x0E, 0x01, 0x5B,
+	0x29, 0xF4, 0xF8, 0x9E, 0xA5, 0x5C, 0xC0, 0x4B,
+	0x74, 0x2C, 0x88, 0xA3, 0x6B, 0xC2, 0xC4, 0xDA,
+	0xEF, 0xF2, 0x02, 0xCD, 0x89, 0x0C, 0x42, 0xDA,
+	0xE6, 0xBB, 0x67, 0x51, 0x29, 0x4A, 0x32, 0x99,
+	0xAC, 0xCC, 0xDC, 0xB6, 0x35, 0x8B, 0xCC, 0xE8,
+	0x04, 0x78, 0x69, 0xA8, 0x19, 0x0E, 0xDC, 0x1E,
+	0x6C, 0xFF, 0x46, 0xDF, 0x4E, 0x7A, 0x51, 0xC5,
+	0x9F, 0x39, 0x6F, 0xC7, 0x96, 0xFE, 0x54, 0xF4,
+	0xE2, 0xD8, 0xEB, 0x5C, 0xA1, 0x28, 0x84, 0xB4,
+	0xEA, 0x34, 0xA8, 0x18, 0x86, 0x93, 0x8B, 0xE9,
+	0xA7, 0xAB, 0x5E, 0xD9, 0x1E, 0x3E, 0x89, 0x8F,
+	0x83, 0xB4, 0xEF, 0x8E, 0x21, 0x30, 0xB4, 0xAD,
+	0x07, 0xFE, 0x8A, 0x3B, 0x34, 0xAE, 0xDE, 0x5C,
+	0xCA, 0xBA, 0x9E, 0xFB, 0x1B, 0x81, 0xEC, 0xD3,
+	0x0E, 0x40, 0xED, 0x65, 0x77, 0xF3, 0xC0, 0x56,
+	0xDC, 0xD8, 0x46, 0xDB, 0x4F, 0x51, 0x4B, 0x24,
+	0x42, 0x3B, 0xC7, 0xE2, 0x32, 0xBA, 0xA7, 0xC0,
+	0xA4, 0xFA, 0x14, 0xC4, 0xB7, 0x1B, 0x84, 0x0D,
+	0xC9, 0xD1, 0x8E, 0x1C, 0x50, 0xF1, 0xBB, 0xA6,
+	0x14, 0xD4, 0x88, 0xD8, 0x6C, 0xCE, 0x44, 0x76,
+	0x3A, 0x29, 0xF8, 0x69, 0xBD, 0x5B, 0x53, 0x4B,
+	0x65, 0xB8, 0x76, 0x5F, 0xD2, 0x01, 0xE9, 0x55,
+	0x83, 0x47, 0x2C, 0xD3, 0x9B, 0xCA, 0x85, 0x75,
+	0x60, 0x14, 0x1B, 0x5D, 0x48, 0x97, 0x67, 0x18,
+	0x9F, 0x8E, 0x8C, 0x86, 0x31, 0xCF, 0x07, 0x7D,
+	0x9E, 0xEB, 0xDE, 0x06, 0x14, 0xFE, 0x00, 0x3F,
+	0x9C, 0x09, 0xDF, 0x2B, 0x99, 0x08, 0x7A, 0x4C,
+	0xD9, 0xC8, 0x3B, 0x54, 0xF0, 0x34, 0x07, 0x19,
+	0xC5, 0x4A, 0x34, 0xBF, 0xB8, 0x31, 0xBF, 0x1C,
+	0x6F, 0x5C, 0x07, 0x37, 0x76, 0xD9, 0xBD, 0x3B,
+	0xB6, 0xB6, 0x8D, 0x6A, 0x1A, 0xE6, 0xE9, 0xCB,
+	0x4D, 0xC3, 0xDC, 0x76, 0x91, 0xE7, 0x6F, 0x11,
+	0x66, 0xF7, 0x76, 0xB3, 0x40, 0xAA, 0x51, 0x09,
+	0x7C, 0xFE, 0xA2, 0x37, 0xBF, 0xC3, 0x92, 0xFA,
+	0x75, 0x44, 0x76, 0xC7, 0x54, 0xC8, 0x91, 0x89,
+	0x65, 0x84, 0x03, 0x3E, 0x46, 0x92, 0x1E, 0x67,
+	0x8D, 0x8F, 0x52, 0x0D, 0x06, 0x22, 0x18, 0xFC,
+	0x0B, 0x92, 0xCD, 0x94, 0xC2, 0x0A, 0x3F, 0x41,
+};
+
+uint8_t mlkem_512_sk[] = {
+	0x26, 0xCD, 0x28, 0x15, 0xEB, 0x3E, 0x16, 0x56,
+	0x84, 0x2D, 0x15, 0xAC, 0x32, 0x33, 0xDA, 0x01,
+	0x71, 0x21, 0x82, 0x1B, 0xC7, 0xE3, 0x44, 0xF9,
+	0x5E, 0x7A, 0xB9, 0x3A, 0x40, 0xAD, 0x38, 0x6A
+};
+
 struct
 cperf_rsa_test_data rsa_qt_perf_data[4] = {
 	{
@@ -3822,6 +4246,52 @@ cperf_rsa_test_data rsa_pub_perf_data[4] = {
 	}
 };
 
+struct cperf_mlkem_test_data mlkem_encap_perf_data[] = {
+	{
+		.name = "mlkem_512_encap (deterministic)",
+		.type = RTE_CRYPTO_ML_KEM_512,
+		.dk = {
+			.data = mlkem_512_dk,
+			.length = sizeof(mlkem_512_dk),
+		},
+		.ek = {
+			.data = mlkem_512_ek,
+			.length = sizeof(mlkem_512_ek),
+		},
+		.message = {
+			.data = mlkem_512_message,
+			.length = 32,
+		},
+		.cipher = {
+			.data = mlkem_512_cipher,
+			.length = sizeof(mlkem_512_cipher),
+		},
+		.sk = {
+			.data = mlkem_512_sk,
+			.length = sizeof(mlkem_512_sk),
+		},
+	},
+};
+
+struct cperf_mlkem_test_data  mlkem_decap_perf_data[] = {
+	{
+		.name = "mlkem_512_decap",
+		.type = RTE_CRYPTO_ML_KEM_512,
+		.cipher = {
+			.data = mlkem_512_cipher,
+			.length = sizeof(mlkem_512_cipher),
+		},
+		.dk = {
+			.data = mlkem_512_dk,
+			.length = sizeof(mlkem_512_dk),
+		},
+		.sk = {
+			.data = mlkem_512_sk,
+			.length = sizeof(mlkem_512_sk),
+		},
+	}
+};
+
 struct cperf_test_vector*
 cperf_test_vector_get_dummy(struct cperf_options *options)
 {
diff --git a/app/test-crypto-perf/cperf_test_vectors.h b/app/test-crypto-perf/cperf_test_vectors.h
index d6f18268c4..e498196ae3 100644
--- a/app/test-crypto-perf/cperf_test_vectors.h
+++ b/app/test-crypto-perf/cperf_test_vectors.h
@@ -107,6 +107,31 @@ struct cperf_modex_test_data {
 	} result;
 };
 
+struct cperf_mlkem_test_data {
+	const char *name;
+	enum rte_crypto_ml_kem_type type;
+	struct {
+		uint8_t *data;
+		uint32_t length;
+	} dk;
+	struct {
+		uint8_t *data;
+		uint32_t length;
+	} ek;
+	struct {
+		uint8_t *data;
+		uint32_t length;
+	} message;
+	struct {
+		uint8_t *data;
+		uint32_t length;
+	} cipher;
+	struct {
+		uint8_t *data;
+		uint32_t length;
+	} sk;
+};
+
 #define TEST_DATA_SIZE 4096
 struct cperf_rsa_plaintext {
 	uint8_t data[TEST_DATA_SIZE];
@@ -188,5 +213,7 @@ extern struct cperf_rsa_test_data rsa_pub_perf_data[4];
 extern struct cperf_rsa_test_data rsa_exp_perf_data[4];
 extern struct cperf_rsa_test_data rsa_qt_perf_data[4];
 extern struct cperf_rsa_plaintext rsa_plaintext;
+extern struct cperf_mlkem_test_data mlkem_encap_perf_data[];
+extern struct cperf_mlkem_test_data mlkem_decap_perf_data[];
 
 #endif
diff --git a/app/test-crypto-perf/main.c b/app/test-crypto-perf/main.c
index f63e892413..2e228201ab 100644
--- a/app/test-crypto-perf/main.c
+++ b/app/test-crypto-perf/main.c
@@ -53,7 +53,8 @@ const char *cperf_op_type_strs[] = {
 	[CPERF_ASYM_SECP521R1] = "ecdsa_p521r1",
 	[CPERF_ASYM_ED25519] = "eddsa_25519",
 	[CPERF_ASYM_SM2] = "sm2",
-	[CPERF_TLS] = "tls-record"
+	[CPERF_TLS] = "tls-record",
+	[CPERF_ASYM_MLKEM512] = "mlkem_512",
 };
 
 const char *cperf_rsa_priv_keytype_strs[] = {
@@ -245,6 +246,7 @@ cperf_initialize_cryptodev(struct cperf_options *opts, uint8_t *enabled_cdevs)
 		case CPERF_ASYM_ED25519:
 		case CPERF_ASYM_SM2:
 		case CPERF_ASYM_RSA:
+		case CPERF_ASYM_MLKEM512:
 		case CPERF_ASYM_MODEX:
 			conf.ff_disable |= (RTE_CRYPTODEV_FF_SECURITY |
 					    RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO);
@@ -515,6 +517,23 @@ cperf_verify_devices_capabilities(struct cperf_options *opts,
 			}
 		}
 
+		if (opts->op_type == CPERF_ASYM_MLKEM512) {
+			asym_cap_idx.type = RTE_CRYPTO_ASYM_XFORM_ML_KEM;
+			asym_capability = rte_cryptodev_asym_capability_get(cdev_id, &asym_cap_idx);
+			if (asym_capability == NULL)
+				return -1;
+
+			if (opts->asym_op_type == RTE_CRYPTO_ASYM_OP_ENCRYPT)
+				opts->mlkem_data = &mlkem_encap_perf_data[0];
+			else if (opts->asym_op_type == RTE_CRYPTO_ASYM_OP_DECRYPT)
+				opts->mlkem_data = &mlkem_decap_perf_data[0];
+			else {
+				RTE_LOG(ERR, USER1, "Unsupported MLKEM operation type\n");
+				return -ENOTSUP;
+			}
+
+		}
+
 		if (opts->op_type == CPERF_AUTH_ONLY ||
 				opts->op_type == CPERF_CIPHER_THEN_AUTH ||
 				opts->op_type == CPERF_AUTH_THEN_CIPHER) {
diff --git a/doc/guides/tools/cryptoperf.rst b/doc/guides/tools/cryptoperf.rst
index d7ee468e17..13f9db66f4 100644
--- a/doc/guides/tools/cryptoperf.rst
+++ b/doc/guides/tools/cryptoperf.rst
@@ -183,6 +183,7 @@ The following are the application command-line options:
            eddsa_25519
            rsa
            sm2
+           mlkem_512
            ipsec
            tls-record
 
-- 
2.43.0


^ permalink raw reply related

* RE: [PATCH v5] graph: add optional profiling stats
From: Morten Brørup @ 2026-06-24  7:59 UTC (permalink / raw)
  To: saeed bishara, Pavan Nikhilesh, Stephen Hemminger,
	Wathsala Vithanage, Bruce Richardson, thomas
  Cc: Jerin Jacob, dev, Jerin Jacob, Kiran Kumar K, Nithin Dabilpuram,
	Zhirun Yan
In-Reply-To: <CAHfVqdXW_=8Gn_hy7zYSztAngy=Un2HJ4d+8Ds-EyaqpjM=WHQ@mail.gmail.com>

+Pavan Nikhilesh, +Stephen Hemminger, +Wathsala Vithanage, +Bruce Richardson, +Thomas Monjalon

> From: saeed bishara [mailto:saeed.bishara.os@gmail.com]
> Sent: Tuesday, 23 June 2026 16.11
> 
> > > also, instead of adding cacheline for this profiling data, can we
> > > share with line 1 that used solely for xstats?
> >
> > This profiling data is 4 indexes * 2 values * 8-byte fields, so one
> cache line in itself.
> make sense.
> btw, the default value of RTE_GRAPH_BURST_SIZE is 256, I suspect that
> real applications will enforce smaller burst when pulling from input
> devices (e.g. 32). Do you expect such cases to change
> RTE_GRAPH_BURST_SIZE?

Excellent question! I don't know.
They should. E.g. an application optimized for latency should certainly not process bursts of 256 objects.

IMO, the root problem is the lack of a unified burst size across DPDK, which causes every library to be designed with its own optimal burst size.
E.g. the Mbuf library uses 64 (for rte_pktmbuf_free_bulk()), and the Graph library uses 256.

There has been an attempt at introducing a unified burst size [1] for DPDK, but it met a lot of resistance, so it still needs to be refined before we can reach a conclusion.
The drivers supposedly can report an "optimal" burst size at run-time, which the application can then use. But the application is unable to configure its internal burst sizes if one driver reports 64 and another reports 32.
I'm strongly in favor of a build time constant, used across DPDK. The default value should work reasonably well across drivers and libraries.
And if an application wants to optimize for performance (either throughput or latency), the developer should experiment to find the optimal value.
Furthermore, designing for a build time constant max burst size throughout DPDK might provide performance benefits in itself, as the compiler can optimize for this.

[1]: https://inbox.dpdk.org/dev/KdOygM96Qb6d6ADK1-AcnA@monjalon.net/

Now, back to your question...
As a workaround, I can sample Graph node performance data for 32 objects, instead of sampling for RTE_GRAPH_BURST_SIZE / 2.


^ permalink raw reply

* RE: [PATCH v4 3/7] test/bpf: add test for large shift
From: Marat Khalili @ 2026-06-24  7:59 UTC (permalink / raw)
  To: Stephen Hemminger, dev@dpdk.org; +Cc: Konstantin Ananyev
In-Reply-To: <20260623232522.257208-4-stephen@networkplumber.org>



> -----Original Message-----
> From: Stephen Hemminger <stephen@networkplumber.org>
> Sent: Wednesday 24 June 2026 00:23
> To: dev@dpdk.org
> Cc: Stephen Hemminger <stephen@networkplumber.org>; Konstantin Ananyev <konstantin.ananyev@huawei.com>;
> Marat Khalili <marat.khalili@huawei.com>
> Subject: [PATCH v4 3/7] test/bpf: add test for large shift
> 
> The JIT compiler had issues with immediate values on shift instructions
> so add a new test to cover that case.
> 
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
>  app/test/test_bpf.c | 66 +++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 66 insertions(+)
> 
> diff --git a/app/test/test_bpf.c b/app/test/test_bpf.c
> index 232e9e2a98..b54e36910b 100644
> --- a/app/test/test_bpf.c
> +++ b/app/test/test_bpf.c
> @@ -2005,6 +2005,58 @@ test_div1_check(uint64_t rc, const void *arg)
>  	return cmp_res(__func__, 0, rc, dve.out, dvt->out, sizeof(dve.out));
>  }
> 
> +/*
> + * Shift by an immediate that doesn't fit in a signed byte: the C1 shift
> + * group takes a fixed 1-byte immediate, but imm_size() returns 4 for
> + * counts >= 128, so the x86 JIT emits 3 stray bytes and desyncs the
> + * instruction stream. The shift results are discarded (a count >= 64 is
> + * UB in the interpreter); the test returns a known constant, which the
> + * corrupted stream fails to produce.
> + */
> +static const struct ebpf_insn test_shift_big_imm_prog[] = {
> +	{
> +		.code = (BPF_ALU | EBPF_MOV | BPF_K),
> +		.dst_reg = EBPF_REG_2,
> +		.imm = 0x1,
> +	},
> +	{
> +		.code = (EBPF_ALU64 | BPF_LSH | BPF_K),
> +		.dst_reg = EBPF_REG_2,
> +		.imm = 137,
> +	},
> +	{
> +		.code = (EBPF_ALU64 | BPF_RSH | BPF_K),
> +		.dst_reg = EBPF_REG_2,
> +		.imm = 200,
> +	},
> +	{
> +		.code = (EBPF_ALU64 | EBPF_ARSH | BPF_K),
> +		.dst_reg = EBPF_REG_2,
> +		.imm = 255,
> +	},
> +	/* known result; a desynced stream won't reproduce it */
> +	{
> +		.code = (BPF_ALU | EBPF_MOV | BPF_K),
> +		.dst_reg = EBPF_REG_0,
> +		.imm = 0x55,
> +	},
> +	{
> +		.code = (BPF_JMP | EBPF_EXIT),
> +	},
> +};

// snip the rest

Thanks a lot for adding this test. Can we use the shift results though, instead
of discarding them, maybe as another test case? If the interpreter is unable to
reproduce them or triggers sanitizer it needs to be fixed as well. (Apologies
for this scope creep but I hope we get to the bottom of it eventually.)

^ permalink raw reply

* Re: [PATCH 00/17] drivers: replace strncpy with strlcpy
From: Bruce Richardson @ 2026-06-24  7:49 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev
In-Reply-To: <20260623103309.50529876@phoenix.local>

On Tue, Jun 23, 2026 at 10:33:09AM -0700, Stephen Hemminger wrote:
> On Tue, 23 Jun 2026 17:51:30 +0100
> Bruce Richardson <bruce.richardson@intel.com> wrote:
> 
> > Many uses of strncpy in DPDK drivers can be directly replaced by
> > a call to strlcpy instead, which is safer in that it always null-
> > terminates the string. This AI assisted patchset makes those
> > simple replacements, adjusting lengths as appropriate.
> > 
> > After this set, there are still a number of drivers with strncpy calls
> > in them, but those are not simple strncpy->strlcpy replacements, so
> > left for later rework.
> 
> Maybe a coccinelle script?

Don't think it's worth it.

a) All trivial replacements are already done by this set and the other
patches I've posted.
b) AI does a better job of handling this anyway, since it's able to
properly analyse the context and spot cases of using a length parameter one
short when calling strncpy, or when code is improved by using sizeof() as
the length parameter.

What probably is needed in scripting though, is a checkpatch check for new
strncpy additions. Are you still working on that python replacement?

/Bruce

^ permalink raw reply

* Re: [PATCH] doc: move firmware instructions in mlx5 guide
From: Raslan Darawsheh @ 2026-06-24  7:24 UTC (permalink / raw)
  To: Thomas Monjalon, dev
  Cc: Dariusz Sosnowski, Viacheslav Ovsiienko, Bing Zhao, Ori Kam,
	Suanming Mou, Matan Azrad
In-Reply-To: <20260608120531.1037367-1-thomas@monjalon.net>

Hi,


On 08/06/2026 3:05 PM, Thomas Monjalon wrote:
> Having firmware update instructions before firmware config
> looks simpler to find than in compilation prerequisites.
> 
> A link is also added after listing minimum firmware versions.
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>

Patch applied to next-net-mlx,

Kindest regards
Raslan Darawsheh


^ permalink raw reply

* Re: [PATCH v6] net/mlx5: fix counter TAILQ race between free and query callback
From: Raslan Darawsheh @ 2026-06-24  7:17 UTC (permalink / raw)
  To: Linhu Li, dev; +Cc: stable, dsosnowski
In-Reply-To: <20260618091450.19204-1-lilinhu618@gmail.com>

Hi,


On 18/06/2026 12:14 PM, Linhu Li wrote:
> flow_dv_counter_free() inserts counters into
> pool->counters[pool->query_gen] under pool->csl. Meanwhile,
> mlx5_flow_async_pool_query_handle() moves counters from
> pool->counters[query_gen ^ 1] to the global free list via
> TAILQ_CONCAT while holding only cmng->csl, not pool->csl.
> 
> The comment in flow_dv_counter_free() claims the lock is not needed
> because the query callback and the release function operate on
> different lists. That holds only if the free path always observes
> the up-to-date query_gen. It can be violated:
> 
> 1. A counter free thread (non-PMD, e.g. OVS offload thread) reads
>     pool->query_gen == 0 and is about to insert into counters[0].
> 2. The free thread is preempted by the OS scheduler; it is a regular
>     pthread, not pinned to a core.
> 3. The eal-intr-thread alarm fires: query_gen++ (now 1) and the async
>     query is sent.
> 4. Hardware completes the query and the callback runs TAILQ_CONCAT on
>     counters[0] (= query_gen ^ 1).
> 5. The free thread resumes and runs TAILQ_INSERT_TAIL on counters[0]
>     concurrently with step 4 on another core.
> 
> Because the two paths take different locks, TAILQ_INSERT_TAIL and
> TAILQ_CONCAT run concurrently on the same list with no synchronization
> and corrupt it: the pool-local list ends up with a NULL head but a
> dangling tqh_last, and the global free list tail no longer points to
> the real tail. The just-freed counter and every counter inserted
> afterwards become unreachable and are leaked.
> 
> Non-PMD threads can be preempted for hundreds of microseconds under
> CPU pressure, which is well within the async query round-trip time,
> so the window is reachable in practice.
> 
> Fix it by taking pool->csl in the query completion callback before
> operating on pool->counters[query_gen], serializing the CONCAT with
> any concurrent INSERT. The lock is taken once per pool per query
> completion in the eal-intr-thread context, not on the datapath, so
> the cost is negligible. Lock order is pool->csl then cmng->csl,
> matching all other sites.
> 
> Also handle the error path: previously the counters accumulated in
> pool->counters[query_gen] were abandoned when a query failed. Move
> them back to the global free list to avoid a leak on persistent
> query failures.
> 
> Additionally, fix a second independent race in flow_dv_counter_free():
> TAILQ_INSERT_TAIL is passed &pool->counters[pool->query_gen] directly,
> but the macro evaluates its head argument multiple times. Since
> pool->query_gen is a volatile bit-field, if mlx5_flow_query_alarm()
> increments query_gen between two evaluations of the macro, the same
> insertion can operate on two different lists: the earlier steps update
> counters[0] while the later steps update counters[1], leaving both
> lists with inconsistent metadata and leaking the counter. Fix by
> caching pool->query_gen into a local variable before calling the macro.
> 
> Fixes: ac79183dc6f7 ("net/mlx5: optimize free counter lookup")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Linhu Li <lilinhu618@gmail.com>
> Acked-by: Dariusz Sosnowski <dsosnowski@nvidia.com>

Patch applied to next-net-mlx,

Kindest regards
Raslan Darawsheh


^ permalink raw reply

* Re: [PATCH v3] drivers: update relaxed ordering policy for mlx5 mkeys
From: Raslan Darawsheh @ 2026-06-24  7:15 UTC (permalink / raw)
  To: Maayan Kashani, dev
  Cc: Viacheslav Ovsiienko, Dariusz Sosnowski, Bing Zhao, Ori Kam,
	Suanming Mou, Matan Azrad
In-Reply-To: <20260622075410.38103-1-mkashani@nvidia.com>

Hi,


On 22/06/2026 10:54 AM, Maayan Kashani wrote:
> New adapters expose additional ordering capabilities.
> Query the new caps and apply them when creating DevX mkeys via
> mlx5_devx_mkey_attr_set_ordering(), which sets PCI relaxed ordering
> and RAW=RO when relaxed order is supported.
> Use this helper on Windows (still gated by Haswell/Broadwell) and for
> Linux wrapped mkeys and crypto/regex/vdpa indirect mkeys when
> relaxed order only flag is set.
> Linux wrapped mkeys continue to use the legacy Haswell/Broadwell rule for
> IBV_ACCESS_RELAXED_ORDERING on the verbs MR.
> Upcoming FW will requires setting the correct ordering attributes,
> otherwise it fails to create the memory key.
> 
> Signed-off-by: Maayan Kashani <mkashani@nvidia.com>
> Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>

Patch applied to next-net-mlx,

Kindest regards
Raslan Darawsheh


^ permalink raw reply

* Re: [PATCH v3 04/11] bus/pci: fix mapping leak in bus cleanup
From: David Marchand @ 2026-06-24  6:51 UTC (permalink / raw)
  To: fengchengwen
  Cc: dev, thomas, stephen, bruce.richardson, longli, hemant.agrawal,
	stable, Chenbo Xia, Nipun Gupta, Morten Brørup, Kevin Laatz
In-Reply-To: <c4c30773-40ad-4eca-a369-926886e17ab1@huawei.com>

Hello Chengwen,

Thanks for the reviews!

On Wed, 24 Jun 2026 at 03:24, fengchengwen <fengchengwen@huawei.com> wrote:
>
> On 6/23/2026 6:54 PM, David Marchand wrote:
> > When calling this bus cleanup, PCI resources were not unmapped.
> >
> > Fixes: 1cab1a40ea9b ("bus: cleanup devices on shutdown")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
> > ---
> >  drivers/bus/pci/pci_common.c | 4 ++++
> >  1 file changed, 4 insertions(+)
> >
> > diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c
> > index fd18b8772b..791e9a7b49 100644
> > --- a/drivers/bus/pci/pci_common.c
> > +++ b/drivers/bus/pci/pci_common.c
> > @@ -344,6 +344,10 @@ pci_cleanup(void)
> >                       rte_errno = errno;
> >                       error = -1;
> >               }
> > +
> > +             if (drv->drv_flags & RTE_PCI_DRV_NEED_MAPPING)
> > +                     rte_pci_unmap_device(dev);
>
> rte_pci_unmap_device() also invoked in some drivers remove callback, e.g.
>   eth_virtio_pci_uninit()
>   ifcvf_pci_remove()
>   ...
>
> In this case it may doulbe-free

$ git grep -l rte_pci_unmap_device drivers :^drivers/bus/pci | cut -d
/ -f 2,3 | sort -u
net/nbl
net/virtio
net/xsc
vdpa/ifc
vdpa/nfp
vdpa/sfc

Those drivers do not set RTE_PCI_DRV_NEED_MAPPING and have their own
logic when it comes to mapping/unmapping resources.

$ for drv in $(git grep -l rte_pci_unmap_device drivers
:^drivers/bus/pci | cut -d / -f 2,3 | sort -u); do git grep -l
RTE_PCI_DRV_NEED_MAPPING drivers/$drv; done
drivers/vdpa/nfp/nfp_vdpa.c

I suspect calling rte_pci_unmap_device twice will end up with some
error before a double free.
Worth a fix on vdpa/nfp regardless, I'll work on it quickly.

Thanks again!


-- 
David Marchand


^ permalink raw reply

* Re: [PATCH v2] app/dma_perf: skip case if worker maps to main lcore
From: fengchengwen @ 2026-06-24  6:09 UTC (permalink / raw)
  To: Rupesh Chiluka, dev; +Cc: honest.jiang, gakhil, anoobj, ktejasree, stable
In-Reply-To: <20260624054254.3367097-1-rchiluka@marvell.com>

Acked-by: Chengwen Feng <fengchengwen@huawei.com>

On 6/24/2026 1:42 PM, Rupesh Chiluka wrote:
> When a configured worker lcore is same as EAL main lcore, the main
> thread calls `rte_eal_remote_launch()` on itself and then waits for
> `worker_info.ready_flag`. The worker function cannot run on the main
> lcore while the main thread is blocked in that loop, and the test hangs.
> 
> Reject such cases early in the `run_test()`.
> 
> Fixes: 623dc9364dc6 ("app/dma-perf: introduce DMA performance test")
> CC: stable@dpdk.org
> 
> Signed-off-by: Rupesh Chiluka <rchiluka@marvell.com>


^ permalink raw reply

* Re: [PATCH v2] examples/l3fwd: dynamic NUMA-aware alloc lcore_conf
From: fengchengwen @ 2026-06-24  6:05 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: thomas, dev
In-Reply-To: <20260623212621.1027df00@phoenix.local>

On 6/24/2026 12:26 PM, Stephen Hemminger wrote:
> On Wed, 24 Jun 2026 11:23:57 +0800
> Chengwen Feng <fengchengwen@huawei.com> wrote:
> 
>> -extern struct lcore_conf lcore_conf[RTE_MAX_LCORE];
>> +extern struct lcore_conf *lcore_conf[RTE_MAX_LCORE];
>>  
> 
> Since almost no systems have that many cores. Why not allocate it dynamically
> based on rte_lcore_count at runtime?

I understand that the original implementation did this for
simplicity (e.g., it can quickly index to the conf based on
lcore-id).

In my patch, I still keep the array, but the elements are
changed to pointers, and only elements corresponding to
actually valid lcores are allocated.


^ permalink raw reply

* [PATCH v2] app/dma_perf: skip case if worker maps to main lcore
From: Rupesh Chiluka @ 2026-06-24  5:42 UTC (permalink / raw)
  To: dev
  Cc: honest.jiang, fengchengwen, gakhil, anoobj, ktejasree,
	Rupesh Chiluka, stable
In-Reply-To: <20260624045417.3294252-1-rchiluka@marvell.com>

When a configured worker lcore is same as EAL main lcore, the main
thread calls `rte_eal_remote_launch()` on itself and then waits for
`worker_info.ready_flag`. The worker function cannot run on the main
lcore while the main thread is blocked in that loop, and the test hangs.

Reject such cases early in the `run_test()`.

Fixes: 623dc9364dc6 ("app/dma-perf: introduce DMA performance test")
CC: stable@dpdk.org

Signed-off-by: Rupesh Chiluka <rchiluka@marvell.com>
---
 app/test-dma-perf/main.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/app/test-dma-perf/main.c b/app/test-dma-perf/main.c
index 4249dcfd3d..2809e5417c 100644
--- a/app/test-dma-perf/main.c
+++ b/app/test-dma-perf/main.c
@@ -110,6 +110,7 @@ static void
 run_test(uint32_t case_id, struct test_configure *case_cfg)
 {
 	uint32_t nb_lcores = rte_lcore_count();
+	uint32_t main_lcore = rte_get_main_lcore();
 	struct test_configure_entry *mem_size = &case_cfg->mem_size;
 	struct test_configure_entry *buf_size = &case_cfg->buf_size;
 	struct test_configure_entry *ring_size = &case_cfg->ring_size;
@@ -122,6 +123,14 @@ run_test(uint32_t case_id, struct test_configure *case_cfg)
 		return;
 	}
 
+	for (uint32_t i = 0; i < case_cfg->num_worker; i++) {
+		if (case_cfg->dma_config[i].lcore_dma_map.lcore == main_lcore) {
+			printf("Case %u: worker %u cannot run on the EAL main lcore (%u).\n",
+			       case_id, i, main_lcore);
+			return;
+		}
+	}
+
 	printf("Number of used lcores: %u.\n", nb_lcores);
 
 	if (mem_size->incr != 0)
-- 
2.48.1


^ permalink raw reply related

* [PATCH] app/dma_perf: skip case if worker maps to main lcore
From: Rupesh Chiluka @ 2026-06-24  4:54 UTC (permalink / raw)
  To: dev; +Cc: Rupesh Chiluka, stable
In-Reply-To: <20260623045841.2602104-1-rchiluka@marvell.com>

When a configured worker lcore is same as EAL main lcore, the main
thread calls `rte_eal_remote_launch()` on itself and then waits for
`worker_info.ready_flag`. The worker function cannot run on the main
lcore while the main thread is blocked in that loop, and the test hangs.

Reject such cases early in the `run_test()`.

Fixes: 623dc9364dc6 ("app/dma-perf: introduce DMA performance test")
CC: stable@dpdk.org

Signed-off-by: Rupesh Chiluka <rchiluka@marvell.com>
---
 app/test-dma-perf/main.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/app/test-dma-perf/main.c b/app/test-dma-perf/main.c
index 4249dcfd3d..a22434c558 100644
--- a/app/test-dma-perf/main.c
+++ b/app/test-dma-perf/main.c
@@ -109,7 +109,9 @@ run_test_case(struct test_configure *case_cfg)
 static void
 run_test(uint32_t case_id, struct test_configure *case_cfg)
 {
+	uint32_t worker_lcore;
 	uint32_t nb_lcores = rte_lcore_count();
+	uint32_t main_lcore = rte_get_main_lcore();
 	struct test_configure_entry *mem_size = &case_cfg->mem_size;
 	struct test_configure_entry *buf_size = &case_cfg->buf_size;
 	struct test_configure_entry *ring_size = &case_cfg->ring_size;
@@ -122,6 +124,15 @@ run_test(uint32_t case_id, struct test_configure *case_cfg)
 		return;
 	}
 
+	for (uint32_t i = 0; i < case_cfg->num_worker; i++) {
+		worker_lcore = case_cfg->dma_config[i].lcore_dma_map.lcore;
+		if (worker_lcore == main_lcore) {
+			printf("Case %u: worker %u (lcore %u) cannot run on the EAL main lcore (%u).\n",
+			       case_id, i, worker_lcore, main_lcore);
+			return;
+		}
+	}
+
 	printf("Number of used lcores: %u.\n", nb_lcores);
 
 	if (mem_size->incr != 0)
-- 
2.48.1


^ permalink raw reply related

* Re: [PATCH v2] examples/l3fwd: dynamic NUMA-aware alloc lcore_conf
From: Stephen Hemminger @ 2026-06-24  4:26 UTC (permalink / raw)
  To: Chengwen Feng; +Cc: thomas, dev
In-Reply-To: <20260624032357.2153-1-fengchengwen@huawei.com>

On Wed, 24 Jun 2026 11:23:57 +0800
Chengwen Feng <fengchengwen@huawei.com> wrote:

> -extern struct lcore_conf lcore_conf[RTE_MAX_LCORE];
> +extern struct lcore_conf *lcore_conf[RTE_MAX_LCORE];
>  

Since almost no systems have that many cores. Why not allocate it dynamically
based on rte_lcore_count at runtime?

^ permalink raw reply

* Re: [PATCH] app/dma_perf: skip case if worker maps to main lcore
From: Stephen Hemminger @ 2026-06-24  4:24 UTC (permalink / raw)
  To: fengchengwen
  Cc: Bruce Richardson, Rupesh Chiluka, Cheng Jiang, dev, gakhil,
	anoobj, ktejasree
In-Reply-To: <2b53ac05-892d-4c1e-8c8e-56d13ec402ad@huawei.com>

On Wed, 24 Jun 2026 08:57:56 +0800
fengchengwen <fengchengwen@huawei.com> wrote:

> >>  
> >> +	for (uint32_t i = 0; i < case_cfg->num_worker; i++) {  
> 
> Please define the variables in front of function impl.

No longer required in DPDK coding style.

^ permalink raw reply

* [PATCH v2] examples/l3fwd: dynamic NUMA-aware alloc lcore_conf
From: Chengwen Feng @ 2026-06-24  3:23 UTC (permalink / raw)
  To: thomas, stephen; +Cc: dev
In-Reply-To: <20260623032301.17570-1-fengchengwen@huawei.com>

Currently lcore_conf is a global static array. When multiple
ports/lcores are distributed across different NUMA nodes, datapath
suffers from severe cross-NUMA memory access penalty.

On Kunpeng platform, sizeof(struct lcore_conf) reaches 133760 bytes.
Such a huge per-lcore structure significantly amplifies cross-NUMA
overhead in multi-port multi-NUMA deployment scenarios.

This commit refactors lcore_conf to pointer array and implements
per-lcore NUMA-aware hugepage allocation, allocating each lcore's
configuration on its local socket to eliminate remote memory access.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>

---
v2: Fix AI review comment: add cleanup when init lcore-conf fail

---
 examples/l3fwd/l3fwd.h     |  2 +-
 examples/l3fwd/l3fwd_acl.c |  2 +-
 examples/l3fwd/l3fwd_em.c  |  8 +++---
 examples/l3fwd/l3fwd_fib.c |  6 ++---
 examples/l3fwd/l3fwd_lpm.c |  8 +++---
 examples/l3fwd/main.c      | 52 +++++++++++++++++++++++++++++++-------
 6 files changed, 56 insertions(+), 22 deletions(-)

diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
index 349fc37c79..20c457ee7f 100644
--- a/examples/l3fwd/l3fwd.h
+++ b/examples/l3fwd/l3fwd.h
@@ -104,7 +104,7 @@ extern uint32_t hash_entry_number;
 
 extern xmm_t val_eth[RTE_MAX_ETHPORTS];
 
-extern struct lcore_conf lcore_conf[RTE_MAX_LCORE];
+extern struct lcore_conf *lcore_conf[RTE_MAX_LCORE];
 
 extern struct parm_cfg parm_config;
 
diff --git a/examples/l3fwd/l3fwd_acl.c b/examples/l3fwd/l3fwd_acl.c
index 4ee3411d2a..0605f6feb9 100644
--- a/examples/l3fwd/l3fwd_acl.c
+++ b/examples/l3fwd/l3fwd_acl.c
@@ -1090,7 +1090,7 @@ acl_main_loop(__rte_unused void *dummy)
 
 	prev_tsc = 0;
 	lcore_id = rte_lcore_id();
-	qconf = &lcore_conf[lcore_id];
+	qconf = lcore_conf[lcore_id];
 	socketid = rte_lcore_to_socket_id(lcore_id);
 
 	if (qconf->n_rx_queue == 0) {
diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c
index d8748a0edd..9aa23759d3 100644
--- a/examples/l3fwd/l3fwd_em.c
+++ b/examples/l3fwd/l3fwd_em.c
@@ -597,7 +597,7 @@ em_main_loop(__rte_unused void *dummy)
 		US_PER_S * BURST_TX_DRAIN_US;
 
 	lcore_id = rte_lcore_id();
-	qconf = &lcore_conf[lcore_id];
+	qconf = lcore_conf[lcore_id];
 
 	const uint16_t n_rx_q = qconf->n_rx_queue;
 	const uint16_t n_tx_p = qconf->n_tx_port;
@@ -685,7 +685,7 @@ em_event_loop_single(struct l3fwd_event_resources *evt_rsrc,
 		return;
 
 	lcore_id = rte_lcore_id();
-	lconf = &lcore_conf[lcore_id];
+	lconf = lcore_conf[lcore_id];
 
 	RTE_LOG(INFO, L3FWD, "entering %s on lcore %u\n", __func__, lcore_id);
 	while (!force_quit) {
@@ -747,7 +747,7 @@ em_event_loop_burst(struct l3fwd_event_resources *evt_rsrc,
 
 	lcore_id = rte_lcore_id();
 
-	lconf = &lcore_conf[lcore_id];
+	lconf = lcore_conf[lcore_id];
 
 	RTE_LOG(INFO, L3FWD, "entering %s on lcore %u\n", __func__, lcore_id);
 
@@ -877,7 +877,7 @@ em_event_loop_vector(struct l3fwd_event_resources *evt_rsrc,
 	if (dst_ports == NULL)
 		return;
 	lcore_id = rte_lcore_id();
-	lconf = &lcore_conf[lcore_id];
+	lconf = lcore_conf[lcore_id];
 
 	RTE_LOG(INFO, L3FWD, "entering %s on lcore %u\n", __func__, lcore_id);
 
diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c
index 4fc6bf90d5..32c8847130 100644
--- a/examples/l3fwd/l3fwd_fib.c
+++ b/examples/l3fwd/l3fwd_fib.c
@@ -192,7 +192,7 @@ fib_main_loop(__rte_unused void *dummy)
 			US_PER_S * BURST_TX_DRAIN_US;
 
 	lcore_id = rte_lcore_id();
-	qconf = &lcore_conf[lcore_id];
+	qconf = lcore_conf[lcore_id];
 
 	const uint16_t n_rx_q = qconf->n_rx_queue;
 	const uint16_t n_tx_p = qconf->n_tx_port;
@@ -282,7 +282,7 @@ fib_event_loop(struct l3fwd_event_resources *evt_rsrc,
 
 	lcore_id = rte_lcore_id();
 
-	lconf = &lcore_conf[lcore_id];
+	lconf = lcore_conf[lcore_id];
 
 	RTE_LOG(INFO, L3FWD, "entering %s on lcore %u\n", __func__, lcore_id);
 
@@ -446,7 +446,7 @@ fib_process_event_vector(struct rte_event_vector *vec, uint8_t *type_arr,
 	uint16_t nh;
 	int i;
 
-	lconf = &lcore_conf[rte_lcore_id()];
+	lconf = lcore_conf[rte_lcore_id()];
 
 	/* Reset counters. */
 	ipv4_cnt = 0;
diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c
index 2d2651e750..77701503f7 100644
--- a/examples/l3fwd/l3fwd_lpm.c
+++ b/examples/l3fwd/l3fwd_lpm.c
@@ -154,7 +154,7 @@ lpm_main_loop(__rte_unused void *dummy)
 		US_PER_S * BURST_TX_DRAIN_US;
 
 	lcore_id = rte_lcore_id();
-	qconf = &lcore_conf[lcore_id];
+	qconf = lcore_conf[lcore_id];
 
 	const uint16_t n_rx_q = qconf->n_rx_queue;
 	const uint16_t n_tx_p = qconf->n_tx_port;
@@ -270,7 +270,7 @@ lpm_event_loop_single(struct l3fwd_event_resources *evt_rsrc,
 		return;
 
 	lcore_id = rte_lcore_id();
-	lconf = &lcore_conf[lcore_id];
+	lconf = lcore_conf[lcore_id];
 
 	RTE_LOG(INFO, L3FWD, "entering %s on lcore %u\n", __func__, lcore_id);
 	while (!force_quit) {
@@ -324,7 +324,7 @@ lpm_event_loop_burst(struct l3fwd_event_resources *evt_rsrc,
 
 	lcore_id = rte_lcore_id();
 
-	lconf = &lcore_conf[lcore_id];
+	lconf = lcore_conf[lcore_id];
 
 	RTE_LOG(INFO, L3FWD, "entering %s on lcore %u\n", __func__, lcore_id);
 
@@ -468,7 +468,7 @@ lpm_event_loop_vector(struct l3fwd_event_resources *evt_rsrc,
 		return;
 
 	lcore_id = rte_lcore_id();
-	lconf = &lcore_conf[lcore_id];
+	lconf = lcore_conf[lcore_id];
 	dst_port_list =
 		rte_zmalloc("", sizeof(uint16_t) * evt_rsrc->vector_size,
 			    RTE_CACHE_LINE_SIZE);
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index df035b508c..af863407d0 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -96,7 +96,7 @@ uint32_t enabled_port_mask;
 /* Used only in exact match mode. */
 bool ipv6_enabled; /**< ipv6 is false by default. */
 
-struct lcore_conf lcore_conf[RTE_MAX_LCORE];
+struct lcore_conf *lcore_conf[RTE_MAX_LCORE];
 
 struct parm_cfg parm_config;
 
@@ -368,17 +368,17 @@ init_lcore_rx_queues(void)
 
 	for (i = 0; i < nb_lcore_params; ++i) {
 		lcore = lcore_params[i].lcore_id;
-		nb_rx_queue = lcore_conf[lcore].n_rx_queue;
+		nb_rx_queue = lcore_conf[lcore]->n_rx_queue;
 		if (nb_rx_queue >= MAX_RX_QUEUE_PER_LCORE) {
 			printf("error: too many queues (%u) for lcore: %u\n",
 				(unsigned int)nb_rx_queue + 1, lcore);
 			return -1;
 		} else {
-			lcore_conf[lcore].rx_queue_list[nb_rx_queue].port_id =
+			lcore_conf[lcore]->rx_queue_list[nb_rx_queue].port_id =
 				lcore_params[i].port_id;
-			lcore_conf[lcore].rx_queue_list[nb_rx_queue].queue_id =
+			lcore_conf[lcore]->rx_queue_list[nb_rx_queue].queue_id =
 				lcore_params[i].queue_id;
-			lcore_conf[lcore].n_rx_queue++;
+			lcore_conf[lcore]->n_rx_queue++;
 		}
 	}
 	return 0;
@@ -1118,6 +1118,36 @@ print_ethaddr(const char *name, const struct rte_ether_addr *eth_addr)
 	printf("%s%s", name, buf);
 }
 
+static int
+init_lcore_conf(void)
+{
+	unsigned int lcore_id;
+	int socketid;
+
+	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
+		if (rte_lcore_is_enabled(lcore_id) == 0)
+			continue;
+
+		socketid = rte_lcore_to_socket_id(lcore_id);
+		lcore_conf[lcore_id] = rte_zmalloc_socket(NULL, sizeof(struct lcore_conf),
+							  RTE_CACHE_LINE_SIZE, socketid);
+		if (lcore_conf[lcore_id] == NULL)
+			goto cleanup;
+	}
+
+	return 0;
+
+cleanup:
+	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
+		if (lcore_conf[lcore_id] != NULL) {
+			rte_free(lcore_conf[lcore_id]);
+			lcore_conf[lcore_id] = NULL;
+		}
+	}
+
+	return -ENOMEM;
+}
+
 int
 init_mem(uint16_t portid, unsigned int nb_mbuf)
 {
@@ -1189,7 +1219,7 @@ init_mem(uint16_t portid, unsigned int nb_mbuf)
 		}
 #endif
 
-		qconf = &lcore_conf[lcore_id];
+		qconf = lcore_conf[lcore_id];
 		qconf->ipv4_lookup_struct =
 			l3fwd_lkp.get_ipv4_lookup_struct(socketid);
 		qconf->ipv6_lookup_struct =
@@ -1492,7 +1522,7 @@ l3fwd_poll_resource_setup(void)
 					"rte_eth_tx_queue_setup: err=%d, "
 					"port=%d\n", ret, portid);
 
-			qconf = &lcore_conf[lcore_id];
+			qconf = lcore_conf[lcore_id];
 			qconf->tx_queue_id[portid] = queueid;
 			queueid++;
 
@@ -1505,7 +1535,7 @@ l3fwd_poll_resource_setup(void)
 	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
 		if (rte_lcore_is_enabled(lcore_id) == 0)
 			continue;
-		qconf = &lcore_conf[lcore_id];
+		qconf = lcore_conf[lcore_id];
 		printf("\nInitializing rx queues on lcore %u ... ", lcore_id );
 		fflush(stdout);
 		/* init RX queues */
@@ -1667,6 +1697,10 @@ main(int argc, char **argv)
 	argc -= ret;
 	argv += ret;
 
+	ret = init_lcore_conf();
+	if (ret)
+		rte_exit(EXIT_FAILURE, "Init lcore conf failed!\n");
+
 	force_quit = false;
 	signal(SIGINT, signal_handler);
 	signal(SIGTERM, signal_handler);
@@ -1749,7 +1783,7 @@ main(int argc, char **argv)
 	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
 		if (rte_lcore_is_enabled(lcore_id) == 0)
 			continue;
-		qconf = &lcore_conf[lcore_id];
+		qconf = lcore_conf[lcore_id];
 		for (queue = 0; queue < qconf->n_rx_queue; ++queue) {
 			portid = qconf->rx_queue_list[queue].port_id;
 			queueid = qconf->rx_queue_list[queue].queue_id;
-- 
2.17.1


^ permalink raw reply related

* [PATCH v6 23/23] net/sxe2: update sxe2 feature matrix docs
From: liujie5 @ 2026-06-24  2:02 UTC (permalink / raw)
  To: stephen; +Cc: dev, Jie Liu
In-Reply-To: <20260622092731.3092201-1-liujie5@linkdatatechnology.com>

From: Jie Liu <liujie5@linkdatatechnology.com>

Update the sxe2.ini feature sheet to accurately reflect the recently
implemented hardware capabilities in the sxe2 PMD.

Signed-off-by: Jie Liu <liujie5@linkdatatechnology.com>
---
 doc/guides/nics/features/sxe2.ini |  56 ++++++++++++
 doc/guides/nics/sxe2.rst          | 147 ++++++++++++++++++++++++++++++
 2 files changed, 203 insertions(+)

diff --git a/doc/guides/nics/features/sxe2.ini b/doc/guides/nics/features/sxe2.ini
index 09ba2f558c..3c1e6a8a39 100644
--- a/doc/guides/nics/features/sxe2.ini
+++ b/doc/guides/nics/features/sxe2.ini
@@ -7,17 +7,73 @@
 ; is selected.
 ;
 [Features]
+Speed capabilities   = Y
+Link status          = Y
+Link status event    = Y
+Rx interrupt         = Y
 Fast mbuf free       = P
 Free Tx mbuf on demand = Y
 Burst mode info      = Y
 Queue start/stop     = Y
+Power mgmt address monitor = Y
 Buffer split on Rx   = P
 Scattered Rx         = Y
+Traffic manager      = Y
 CRC offload          = Y
+VLAN offload         = Y
+QinQ offload         = P
 L3 checksum offload  = Y
 L4 checksum offload  = Y
+Timestamp offload    = P
+Inner L3 checksum    = P
+Inner L4 checksum    = P
 Rx descriptor status = Y
 Tx descriptor status = Y
+MTU update           = Y
+TSO                  = P
+Promiscuous mode     = Y
+Allmulticast mode    = Y
+Unicast MAC filter   = Y
+RSS hash             = Y
+RSS key update       = Y
+RSS reta update      = Y
+VLAN filter          = Y
+Inline crypto        = Y
+Packet type parsing  = Y
+Timesync             = Y
+Basic stats          = Y
+Extended stats       = Y
+FW version           = Y
+Module EEPROM dump   = Y
+Multiprocess aware   = Y
 Linux                = Y
 x86-32               = Y
 x86-64               = Y
+
+[rte_flow items]
+eth                  = P
+geneve               = Y
+gre                  = Y
+gtpu                 = Y
+ipv4                 = Y
+ipv6                 = Y
+ipv6_frag_ext        = Y
+nvgre                = Y
+sctp                 = Y
+tcp                  = Y
+udp                  = Y
+vlan                 = P
+vxlan                = Y
+vxlan_gpe            = Y
+
+[rte_flow actions]
+count                = Y
+drop                 = Y
+mark                 = Y
+passthru             = Y
+port_representor     = Y
+queue                = Y
+represented_port     = Y
+rss                  = Y
+send_to_kernel       = Y
+port_id              = Y
diff --git a/doc/guides/nics/sxe2.rst b/doc/guides/nics/sxe2.rst
index 539072b076..6cf1b825a1 100644
--- a/doc/guides/nics/sxe2.rst
+++ b/doc/guides/nics/sxe2.rst
@@ -35,3 +35,150 @@ preventing unauthorized access to random physical memory.
 This capability allows the PMD to coexist with kernel network interfaces
 which remain functional, although they stop receiving unicast packets
 as long as they share the same MAC address.
+
+Configuration
+-------------
+
+Runtime Configuration
+~~~~~~~~~~~~~~~~~~~~~
+
+- ``Traffic Management Scheduling Levels``
+
+  The DPDK Traffic Management (rte_tm) APIs can be used to configure the Tx scheduler on the NIC.
+  The ``sched-layer-mode`` parameter can be used to set the number of scheduling levels
+  in the transmit scheduling hierarchy.
+  The provided value must be between 0 and 3.
+  If the value provided is greater than the number of levels supported by the HW,
+  the driver will use the hardware maximum value.
+
+- ``fnav-stat-type`` parameter [int]
+
+  This parameter controls the Fnav flow engine statistics type used
+  for flow rule hit counting (via ``rte_flow_query``).
+
+  - 1: Only count the number of packets.
+  - 2: Only count the number of bytes.
+  - 3: Count both packets and bytes (default).
+
+  Default value is 3 (count both packets and bytes).
+
+- ``drv-sw-stats`` parameter [int]
+
+  This parameter controls whether per-packet software statistics
+  (SW stats) are collected in the Rx data path.
+
+  Hardware packet statistic counters may be inaccurate for certain
+  packet types due to hardware design limitations.
+  When accuracy of Rx packet classification statistics is critical,
+  enabling this parameter allows the driver to accumulate statistics
+  in software as packets are received, providing an alternative
+  statistical path that bypasses hardware counter inaccuracies.
+
+  - 0: Disable software statistics collection (default).
+    The basic port statistics (``ipackets``, ``ibytes``) are reported
+    from the hardware counters.
+  - 1: Enable software statistics collection.
+    Per-packet software statistics are accumulated for unicast,
+    multicast, broadcast, and dropped packets in the Rx data path.
+
+  When enabled, the following extended statistics (xstats) are available:
+  ``rx_sw_unicast_packets``, ``rx_sw_multicast_packets``,
+  ``rx_sw_broadcast_packets``, ``rx_sw_drop_packets``,
+  and ``rx_sw_drop_bytes``.
+
+- ``no-sched-mode`` parameter [int]
+
+  This parameter enables non-scheduling mode (no-sched mode).
+  When enabled, the transmit path bypasses the hardware scheduling module
+  and packets are sent directly out through the port.
+  This results in lower transmit latency and higher throughput,
+  but Traffic Management (rte_tm) APIs are not supported in this mode.
+
+  - 0: Disable non-scheduling mode (default).
+    The transmit path goes through the hardware scheduling hierarchy.
+    Traffic Management (rte_tm) APIs can be used to configure the Tx scheduler.
+  - 1: Enable non-scheduling mode.
+    The transmit path bypasses the hardware scheduling module.
+    Packets are sent directly from the port at full speed without scheduling.
+    Traffic Management (rte_tm) APIs are not available in this mode.
+
+- ``rx-low-latency`` parameter [int]
+
+  This parameter controls the interrupt throttling (ITR) interval
+  for Rx queue interrupts.
+
+  When enabled, the driver sets a shorter interrupt coalescing timeout
+  (``SXE2_ITR_INTERVAL_LOW``, approximately 1 μs),
+  reducing the time between packet arrival and interrupt delivery to the CPU.
+  This lowers receive latency at the cost of increased CPU interrupt rate.
+
+  When disabled (default), the driver uses the normal interrupt throttling
+  interval (``SXE2_ITR_INTERVAL_NORMAL``, approximately 20 μs),
+  which reduces the CPU interrupt rate at the expense of higher receive latency.
+
+  - 0: Disable Rx low latency (default).
+    Normal interrupt throttling interval (~20 μs) is used.
+  - 1: Enable Rx low latency.
+    Low interrupt throttling interval (~1 μs) is used
+    for reduced receive latency.
+
+- ``function-flow-direct`` parameter [int]
+
+  This parameter controls whether flow rules from different functional units
+  (DPDK vs kernel driver) are isolated or combined when both drivers
+  control the same physical port.
+
+  When the DPDK PMD and the kernel network driver coexist on the same port,
+  flow rules may originate from either driver.
+  This parameter determines how the source VSI (Virtual Switch Interface)
+  of each flow rule is handled during hardware programming.
+
+  - 0 (default): Isolate flow rules between DPDK and kernel.
+    When ``flow_isolated`` is enabled (``rte_flow_isolate()`` called),
+    kernel-side flow rules take priority and DPDK-side flow rules are suppressed.
+    When ``flow_isolated`` is disabled, DPDK-side flow rules take priority
+    and kernel-side flow rules are suppressed.
+    Only one functional unit's flows are active at a time.
+
+  - 1: Allow direct flow rules from both DPDK and kernel simultaneously.
+    Both DPDK and kernel source VSIs are preserved in the hardware flow table.
+    Flow rules from both sides are programmed without isolation.
+
+  This option only applies to FNAV and ACL flow engine types
+  and does not apply to PF bond devices.
+
+Extended Statistics (xstats)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The PMD provides the following extended statistics (xstats) for detailed
+monitoring of receive-side packet classification and software-level accounting.
+The software statistics path is provided as a workaround for hardware
+counter inaccuracies on certain packet types --- it accumulates per-packet
+statistics directly in the Rx data path, ensuring that unicast, multicast,
+broadcast, and drop counts reflect the actual packets processed by the driver.
+
+Receive Software Statistics
+  These counters are collected in the Rx data path when ``drv-sw-stats=1``
+  is configured (see the ``drv-sw-stats`` devarg above).
+  When ``drv-sw-stats`` is disabled (default), these xstats report zero.
+
+  - ``rx_sw_unicast_packets``: Number of unicast packets received.
+  - ``rx_sw_multicast_packets``: Number of multicast packets received.
+  - ``rx_sw_broadcast_packets``: Number of broadcast packets received.
+  - ``rx_sw_drop_packets``: Number of packets dropped in the Rx data path.
+  - ``rx_sw_drop_bytes``: Number of bytes dropped in the Rx data path.
+
+  When ``drv-sw-stats`` is enabled, the basic counters ``ipackets`` and
+  ``ibytes`` (from ``rte_eth_stats``) also reflect the software-accumulated
+  packet and byte counts. Otherwise, they are reported from hardware counters.
+
+Fnav Flow Engine Statistics
+  The Fnav flow engine statistics type is controlled by the ``fnav-stat-type``
+  devarg (see above). Depending on the configuration:
+
+  - ``fnav-stat-type=1``: Only packet count is available.
+  - ``fnav-stat-type=2``: Only byte count is available.
+  - ``fnav-stat-type=3`` (default): Both packet and byte counts are available.
+
+  Flow query results (via ``rte_flow_query``) expose these per-flow counters
+  through the query API, not via xstats.
-- 
2.52.0


^ permalink raw reply related

* [PATCH v6 19/23] net/sxe2: implement private dump info
From: liujie5 @ 2026-06-24  2:02 UTC (permalink / raw)
  To: stephen; +Cc: dev, Jie Liu
In-Reply-To: <20260622092731.3092201-1-liujie5@linkdatatechnology.com>

From: Jie Liu <liujie5@linkdatatechnology.com>

This patch implements the 'eth_dev_priv_dump' ops for the sxe2 PMD.
This interface allows applications to dump driver-specific internal
state and configuration information to a file stream.

The output includes:
- capabilities.
- device base info.
- device args info.
- device filter info.
- reprenstor info.

Signed-off-by: Jie Liu <liujie5@linkdatatechnology.com>
---
 drivers/net/sxe2/meson.build        |   1 +
 drivers/net/sxe2/sxe2_dump.c        | 287 ++++++++++++++++++++++++++++
 drivers/net/sxe2/sxe2_dump.h        |  12 ++
 drivers/net/sxe2/sxe2_ethdev.c      |   3 +
 drivers/net/sxe2/sxe2_ethdev_repr.c |   3 +
 5 files changed, 306 insertions(+)
 create mode 100644 drivers/net/sxe2/sxe2_dump.c
 create mode 100644 drivers/net/sxe2/sxe2_dump.h

diff --git a/drivers/net/sxe2/meson.build b/drivers/net/sxe2/meson.build
index 65286299aa..d653d071a9 100644
--- a/drivers/net/sxe2/meson.build
+++ b/drivers/net/sxe2/meson.build
@@ -77,4 +77,5 @@ sources += files(
         'sxe2_flow_parse_action.c',
         'sxe2_flow_parse_pattern.c',
         'sxe2_flow_parse_engine.c',
+        'sxe2_dump.c',
 )
diff --git a/drivers/net/sxe2/sxe2_dump.c b/drivers/net/sxe2/sxe2_dump.c
new file mode 100644
index 0000000000..d43473e083
--- /dev/null
+++ b/drivers/net/sxe2/sxe2_dump.c
@@ -0,0 +1,287 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (C), 2025, Wuxi Stars Micro System Technologies Co., Ltd.
+ */
+
+#include <rte_malloc.h>
+#include <arpa/inet.h>
+
+#include "sxe2_common_log.h"
+#include "sxe2_ethdev.h"
+#include "sxe2_dump.h"
+#include "sxe2_stats.h"
+
+static void
+sxe2_dump_dev_feature_capability(FILE *file, struct rte_eth_dev *dev)
+{
+	uint32_t i;
+	struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
+	const struct {
+		uint32_t cap_bit;
+		const char *name;
+	} caps_name[] = {
+		{SXE2_DEV_CAPS_OFFLOAD_L2, "L2"},
+		{SXE2_DEV_CAPS_OFFLOAD_VLAN, "VLAN"},
+		{SXE2_DEV_CAPS_OFFLOAD_IPSEC, "IPSEC"},
+		{SXE2_DEV_CAPS_OFFLOAD_RSS, "RSS"},
+		{SXE2_DEV_CAPS_OFFLOAD_FNAV, "FNAV"},
+		{SXE2_DEV_CAPS_OFFLOAD_TM, "TM"},
+		{SXE2_DEV_CAPS_OFFLOAD_PTP, "PTP"},
+	};
+	if (adapter->is_dev_repr)
+		goto l_end;
+
+	fprintf(file, "  - Dev Capability:\n");
+	for (i = 0; i < RTE_DIM(caps_name); i++) {
+		fprintf(file, "\t  -- support %s: %s\n", caps_name[i].name,
+			(adapter->cap_flags & caps_name[i].cap_bit) ? "Yes" :
+									 "No");
+	}
+l_end:
+	return;
+}
+
+static void
+sxe2_dump_device_basic_info(FILE *file, struct rte_eth_dev *dev)
+{
+	struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
+
+	fprintf(file,
+		"  - Device Base Info:\n"
+		"\t  -- name: %s\n"
+		"\t  -- pf_idx: %u port_idx: %u\n"
+		"\t  -- tx_mode_flags: 0x%x rx_mode_flags: 0x%x\n"
+		"\t  -- flow_isolate_cfg: 0x%x flow_isolated: 0x%x\n"
+		"\t  -- dev_type: 0x%x is_switchdev: 0x%x\n"
+		"\t  -- is_dev_repr: 0x%x dev_port_id: 0x%x\n"
+		"\t  -- dev_flags: 0x%x\n"
+		"\t  -- intr_conf lsc: %u rxq: %u rmv: %u\n",
+		dev->data->name,
+		adapter->pf_idx, adapter->port_idx,
+		adapter->tx_mode_flags, adapter->rx_mode_flags,
+		adapter->flow_isolate_cfg, adapter->flow_isolated,
+		adapter->dev_type, adapter->switchdev_info.is_switchdev,
+		adapter->is_dev_repr, adapter->dev_port_id,
+		dev->data->dev_flags,
+		dev->data->dev_conf.intr_conf.lsc,
+		dev->data->dev_conf.intr_conf.rxq,
+		dev->data->dev_conf.intr_conf.rmv);
+}
+
+static void
+sxe2_dump_dev_args_info(FILE *file, struct rte_eth_dev *dev)
+{
+	struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
+
+	if (adapter->is_dev_repr)
+		goto l_end;
+
+	fprintf(file,
+		"  - Device Args Info:\n"
+		"\t  -- no_sched_mode: %s\n"
+		"\t  -- flow-duplicate-pattern: %u\n"
+		"\t  -- fnav-stat-type: %u\n"
+		"\t  -- sched_layer_mode: %u\n"
+		"\t  -- rx_low_latency: %s\n"
+		"\t  -- function-flow-direct: %s\n",
+		adapter->devargs.no_sched_mode ? "On" : "Off",
+		adapter->devargs.flow_dup_pattern_mode,
+		adapter->devargs.fnav_stat_type,
+		adapter->devargs.sched_layer_mode,
+		adapter->devargs.rx_low_latency ? "On" : "Off",
+		adapter->devargs.func_flow_direct_en ? "On" : "Off");
+l_end:
+	return;
+}
+
+static void sxe2_dump_filter_info(FILE *file, struct rte_eth_dev *dev)
+{
+	struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
+	struct sxe2_mac_filter *mac_entry;
+	struct sxe2_mac_filter *next_mac_entry;
+	struct sxe2_vlan_filter *vlan_entry;
+	struct sxe2_vlan_filter *next_vlan_entry;
+
+	if (adapter->is_dev_repr)
+		goto l_end;
+
+	fprintf(file,
+		"  - Device Filter Info:\n"
+		"\t  -- cur_promisc:0x%x hw_promisc:0x%x\n"
+		"\t  -- unicast_num: %u multicast_num: %u\n"
+		"\t  -- vlan_num: %u filter_on: %u hw_filter_on: %u\n"
+		"\t  -- vlan max_cnt: %u cnt: %u\n"
+		"\t  -- tpid: 0x%x vid: 0x%x\n"
+		"\t  -- vlan_outer_insert: 0x%x vlan_outer_strip: 0x%x\n"
+		"\t  -- vlan_inner_insert: 0x%x vlan_inner_strip: 0x%x\n",
+		adapter->filter_ctxt.cur_promisc_flags,
+		adapter->filter_ctxt.hw_promisc_flags,
+		adapter->filter_ctxt.uc_num,
+		adapter->filter_ctxt.mc_num,
+		adapter->filter_ctxt.vlan_num,
+		adapter->filter_ctxt.vlan_info.filter_on,
+		adapter->filter_ctxt.vlan_info.hw_filter_on,
+		adapter->filter_ctxt.vlan_info.max_cnt,
+		adapter->filter_ctxt.vlan_info.cnt,
+		adapter->filter_ctxt.vlan_info.tpid,
+		adapter->filter_ctxt.vlan_info.vid,
+		adapter->filter_ctxt.vlan_info.outer_insert,
+		adapter->filter_ctxt.vlan_info.outer_strip,
+		adapter->filter_ctxt.vlan_info.inner_insert,
+		adapter->filter_ctxt.vlan_info.inner_strip);
+
+	if (adapter->filter_ctxt.uc_num > 0) {
+		fprintf(file,
+			"\t  -- Unicast entry:\n");
+		RTE_TAILQ_FOREACH_SAFE(mac_entry, &adapter->filter_ctxt.uc_list, next,
+				       next_mac_entry) {
+			fprintf(file,
+				"\t  -- addr: %02x:%02x:%02x:%02x:%02x:%02x hw status:%u "
+				"default:%u\n",
+				mac_entry->mac_addr.addr_bytes[0],
+				mac_entry->mac_addr.addr_bytes[1],
+				mac_entry->mac_addr.addr_bytes[2],
+				mac_entry->mac_addr.addr_bytes[3],
+				mac_entry->mac_addr.addr_bytes[4],
+				mac_entry->mac_addr.addr_bytes[5],
+				mac_entry->hw_config,
+				mac_entry->default_config);
+		}
+	}
+
+	if (adapter->filter_ctxt.mc_num > 0) {
+		fprintf(file,
+			"\t  -- Multicast entry:\n");
+		RTE_TAILQ_FOREACH_SAFE(mac_entry, &adapter->filter_ctxt.mc_list,
+				       next, next_mac_entry) {
+			fprintf(file,
+				"\t  -- addr: %02x:%02x:%02x:%02x:%02x:%02x "
+				"hw status:%u default:%u\n",
+				mac_entry->mac_addr.addr_bytes[0],
+				mac_entry->mac_addr.addr_bytes[1],
+				mac_entry->mac_addr.addr_bytes[2],
+				mac_entry->mac_addr.addr_bytes[3],
+				mac_entry->mac_addr.addr_bytes[4],
+				mac_entry->mac_addr.addr_bytes[5],
+				mac_entry->hw_config,
+				mac_entry->default_config);
+		}
+	}
+
+	if (adapter->filter_ctxt.vlan_num > 0) {
+		fprintf(file,
+			"\t  -- Vlan entry:\n");
+		RTE_TAILQ_FOREACH_SAFE(vlan_entry, &adapter->filter_ctxt.vlan_list,
+			next, next_vlan_entry) {
+			fprintf(file,
+				"\t  -- vlan tpid:0x%04x vid:0x%04x prio:%d "
+				"hw status:%u default:%u\n",
+				vlan_entry->vlan_info.tpid,
+				vlan_entry->vlan_info.vid,
+				vlan_entry->vlan_info.prio,
+				vlan_entry->hw_config,
+				vlan_entry->default_config);
+		}
+	}
+l_end:
+	return;
+}
+
+static const char *sxe2_vsi_id_str(uint16_t vsi_id, char *buf, size_t len)
+{
+	if (vsi_id == SXE2_INVALID_VSI_ID)
+		return "NA";
+
+	snprintf(buf, len, "%u", vsi_id);
+	return buf;
+}
+
+static void
+sxe2_dump_switchdev_info(FILE *file, struct rte_eth_dev *dev)
+{
+	struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
+	uint32_t idx;
+	char k_vsi_buf[16];
+	char u_vsi_buf[16];
+
+	if (adapter->is_dev_repr && adapter->repr_priv_data) {
+		fprintf(file,
+			"  - Reprenstor Info:\n"
+			"\t  -- repr_id: %u\n"
+			"\t  -- repr_q_id: %u\n"
+			"\t  -- repr_pf_id: %u\n"
+			"\t  -- repr_vf_id: %u\n"
+			"\t  -- repr_vf_vsi_id: %u\n"
+			"\t  -- repr_vf_k_vsi_id: %s\n"
+			"\t  -- repr_vf_u_vsi_id: %s\n",
+			adapter->repr_priv_data->repr_id,
+			adapter->repr_priv_data->repr_q_id,
+			adapter->repr_priv_data->repr_pf_id,
+			adapter->repr_priv_data->repr_vf_id,
+			adapter->repr_priv_data->repr_vf_vsi_id,
+			sxe2_vsi_id_str(adapter->repr_priv_data->repr_vf_k_vsi_id,
+					k_vsi_buf, sizeof(k_vsi_buf)),
+			sxe2_vsi_id_str(adapter->repr_priv_data->repr_vf_u_vsi_id,
+					u_vsi_buf, sizeof(u_vsi_buf)));
+		goto l_end;
+	}
+	if (adapter->switchdev_info.is_switchdev) {
+		fprintf(file,
+			"  - Switchdev Info:\n"
+			"\t  -- primary:0x%x\n"
+			"\t  -- representor: 0x%x\n"
+			"\t  -- port_name_type: 0x%x\n"
+			"\t  -- nb_vf: %u nb_repr_vf: %u\n",
+			adapter->switchdev_info.primary,
+			adapter->switchdev_info.representor,
+			adapter->switchdev_info.port_name_type,
+			adapter->repr_ctxt.nb_vf,
+			adapter->repr_ctxt.nb_repr_vf);
+		if (adapter->repr_ctxt.nb_vf > 0) {
+			fprintf(file,
+				"\t  -- vf entry:\n");
+			for (idx = 0; idx < adapter->repr_ctxt.nb_vf; idx++) {
+				fprintf(file,
+					"\t  -- func_id:%u vsi_type:%u kernel_vsi_id:%u dpdk_vsi_id:%u\n",
+					adapter->repr_ctxt.repr_vf_id[idx].func_id,
+					adapter->repr_ctxt.repr_vf_id[idx].vsi_type,
+					adapter->repr_ctxt.repr_vf_id[idx].kernel_vsi_id,
+					adapter->repr_ctxt.repr_vf_id[idx].dpdk_vsi_id);
+			}
+		}
+	}
+
+l_end:
+	return;
+}
+
+int32_t sxe2_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file)
+{
+	char *buf = NULL;
+	size_t size = 0;
+	FILE *str;
+	int32_t ret = -1;
+
+	str = open_memstream(&buf, &size);
+	if (!str) {
+		PMD_LOG_ERR(DRV, "fopen fail.");
+		goto l_end;
+	}
+
+	sxe2_dump_dev_feature_capability(str, dev);
+	sxe2_dump_device_basic_info(str, dev);
+	sxe2_dump_dev_args_info(str, dev);
+	sxe2_dump_filter_info(str, dev);
+	sxe2_dump_switchdev_info(str, dev);
+
+	(void)fflush(str);
+
+	(void)fwrite(buf, 1, size, file);
+	(void)fflush(file);
+
+	ret = 0;
+
+	(void)fclose(str);
+	free(buf);
+l_end:
+	return ret;
+}
diff --git a/drivers/net/sxe2/sxe2_dump.h b/drivers/net/sxe2/sxe2_dump.h
new file mode 100644
index 0000000000..05d6db9b3d
--- /dev/null
+++ b/drivers/net/sxe2/sxe2_dump.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (C), 2025, Wuxi Stars Micro System Technologies Co., Ltd.
+ */
+
+#ifndef __SXE2_DUMP_H__
+#define __SXE2_DUMP_H__
+
+#include <ethdev_driver.h>
+
+int32_t sxe2_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file);
+
+#endif /* __SXE2_DUMP_H__ */
diff --git a/drivers/net/sxe2/sxe2_ethdev.c b/drivers/net/sxe2/sxe2_ethdev.c
index e881cc2af6..6267f0499d 100644
--- a/drivers/net/sxe2/sxe2_ethdev.c
+++ b/drivers/net/sxe2/sxe2_ethdev.c
@@ -37,6 +37,7 @@
 #include "sxe2_host_regs.h"
 #include "sxe2_switchdev.h"
 #include "sxe2_ioctl_chnl_func.h"
+#include "sxe2_dump.h"
 #include "sxe2_ethdev_repr.h"
 #include "sxe2vf_regs.h"
 #include "sxe2_switchdev.h"
@@ -193,6 +194,8 @@ static const struct eth_dev_ops sxe2_eth_dev_ops = {
 
 	.get_module_info            = sxe2_get_module_info,
 	.get_module_eeprom          = sxe2_get_module_eeprom,
+
+	.eth_dev_priv_dump          = sxe2_eth_dev_priv_dump,
 };
 
 static int32_t sxe2_dev_configure(struct rte_eth_dev *dev)
diff --git a/drivers/net/sxe2/sxe2_ethdev_repr.c b/drivers/net/sxe2/sxe2_ethdev_repr.c
index 15b839bb74..f32318b731 100644
--- a/drivers/net/sxe2/sxe2_ethdev_repr.c
+++ b/drivers/net/sxe2/sxe2_ethdev_repr.c
@@ -11,6 +11,7 @@
 #include "sxe2_txrx.h"
 #include "sxe2_switchdev.h"
 #include "sxe2_mp.h"
+#include "sxe2_dump.h"
 #include "sxe2_stats.h"
 #include "sxe2_flow.h"
 
@@ -236,6 +237,8 @@ static const struct eth_dev_ops sxe2_switchdev_repr_dev_ops = {
 	.allmulticast_enable        = sxe2_repr_allmulti_enable,
 	.allmulticast_disable       = sxe2_repr_allmulti_disable,
 
+	.eth_dev_priv_dump          = sxe2_eth_dev_priv_dump,
+
 	.stats_get                  = sxe2_stats_info_get,
 	.stats_reset                = sxe2_stats_info_reset,
 	.xstats_get                 = sxe2_xstats_info_get,
-- 
2.52.0


^ permalink raw reply related

* [PATCH v6 17/23] common/sxe2: add shared SFP module definitions
From: liujie5 @ 2026-06-24  2:02 UTC (permalink / raw)
  To: stephen; +Cc: dev, Jie Liu
In-Reply-To: <20260622092731.3092201-1-liujie5@linkdatatechnology.com>

From: Jie Liu <liujie5@linkdatatechnology.com>

This patch adds a new shared header file 'sxe2_msg.h' which
contains definitions for SFP/SFP+ modules. This file is shared across
Firmware, Kernel driver, and DPDK PMD to ensure consistent protocol
handling.

The header includes:
- SFP EEPROM memory map offsets.
- Module type encoding definitions.

By using this shared header, the PMD can correctly identify module
capabilities and report diagnostic information in a way that is
consistent with the underlying firmware logic.

Signed-off-by: Jie Liu <liujie5@linkdatatechnology.com>
---
 drivers/common/sxe2/sxe2_msg.h | 118 +++++++++++++++++++++++++++++++++
 1 file changed, 118 insertions(+)
 create mode 100644 drivers/common/sxe2/sxe2_msg.h

diff --git a/drivers/common/sxe2/sxe2_msg.h b/drivers/common/sxe2/sxe2_msg.h
new file mode 100644
index 0000000000..f08944f7c9
--- /dev/null
+++ b/drivers/common/sxe2/sxe2_msg.h
@@ -0,0 +1,118 @@
+
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (C), 2025, Wuxi Stars Micro System Technologies Co., Ltd.
+ */
+
+#ifndef __SXE2_MSG_H__
+#define __SXE2_MSG_H__
+
+enum sfp_type_identifier {
+	SXE2_SFP_TYPE_UNKNOWN       = 0x00,
+	SXE2_SFP_TYPE_SFP          = 0x03,
+
+	SXE2_SFP_TYPE_QSFP_PLUS    = 0x0D,
+	SXE2_SFP_TYPE_QSFP28       = 0x11,
+
+	SXE2_SFP_TYPE_MAX          = 0xFF,
+};
+
+#ifndef SFP_DEFINE
+#define SFP_DEFINE
+
+#define SXE2_SFP_EEP_WR            0x1
+#define SXE2_SFP_EEP_QSFP          0x1
+
+enum sfp_bus_addr {
+	SXE2_SFP_EEP_I2C_ADDR0 = 0xA0,
+	SXE2_SFP_EEP_I2C_ADDR1 = 0xA2,
+	SXE2_SFP_EEP_I2C_ADDR_NR = 0xFFFF,
+};
+
+struct sxe2_sfp_req {
+	uint8_t is_wr;
+	uint8_t is_qsfp;
+	uint16_t bus_addr;
+	uint16_t page_cnt;
+	uint16_t offset;
+	uint16_t data_len;
+	uint16_t rvd;
+	uint8_t data[];
+};
+
+struct sxe2_sfp_resp {
+	uint8_t is_wr;
+	uint8_t is_qsfp;
+	uint16_t data_len;
+	uint8_t data[];
+};
+
+enum sfp_page_cnt {
+	SXE2_SFP_EEP_PAGE_CNT0     = 0,
+	SXE2_SFP_EEP_PAGE_CNT1,
+	SXE2_SFP_EEP_PAGE_CNT2,
+	SXE2_SFP_EEP_PAGE_CNT3,
+	SXE2_SFP_EEP_PAGE_CNT20    = 20,
+	SXE2_SFP_EEP_PAGE_CNT21    = 21,
+
+	SXE2_SFP_EEP_PAGE_CNT_NR   = 0xFFFF,
+};
+
+#define SXE2_SFP_E2P_I2C_7BIT_ADDR0             (SXE2_SFP_EEP_I2C_ADDR0 >> 1)
+#define SXE2_SFP_E2P_I2C_7BIT_ADDR1             (SXE2_SFP_EEP_I2C_ADDR1 >> 1)
+
+#define SXE2_QSFP_PAGE_OFST_START  128
+#define SXE2_SFP_EEP_OFST_MAX      255
+#define SXE2_SFP_EEP_LEN_MAX       256
+#endif
+
+#ifndef FW_STATE_DEFINE
+#define FW_STATE_DEFINE
+
+#define SXE2_FW_STATUS_MAIN_SHIF       (16)
+#define SXE2_FW_STATUS_MAIN_MASK       (0xFF0000)
+#define SXE2_FW_STATUS_SUB_MASK        (0xFFFF)
+
+enum Sxe2FwStateMain {
+	SXE2_FW_STATE_MAIN_UNDEFINED       = 0x00,
+	SXE2_FW_STATE_MAIN_INIT            = 0x10000,
+	SXE2_FW_STATE_MAIN_RUN             = 0x20000,
+	SXE2_FW_STATE_MAIN_ABNOMAL         = 0x30000,
+};
+
+enum Sxe2FwState {
+	SXE2_FW_START_STATE_UNDEFINED = SXE2_FW_STATE_MAIN_UNDEFINED,
+	SXE2_FW_START_STATE_INIT_BASE = (SXE2_FW_STATE_MAIN_INIT + 0x1),
+	SXE2_FW_START_STATE_SCAN_DEVICE = (SXE2_FW_STATE_MAIN_INIT + 0x20),
+	SXE2_FW_START_STATE_FINISHED = (SXE2_FW_STATE_MAIN_RUN + 0x0),
+	SXE2_FW_START_STATE_UPGRADE = (SXE2_FW_STATE_MAIN_RUN + 0x1),
+	SXE2_FW_START_STATE_SYNC = (SXE2_FW_STATE_MAIN_RUN + 0x2),
+	SXE2_FW_RUNNING_STATE_ABNOMAL = (SXE2_FW_STATE_MAIN_ABNOMAL + 0x1),
+	SXE2_FW_RUNNING_STATE_ABNOMAL_CORE1 = (SXE2_FW_STATE_MAIN_ABNOMAL + 0x2),
+	SXE2_FW_RUNNING_STATE_ABNOMAL_HEART = (SXE2_FW_STATE_MAIN_ABNOMAL + 0x3),
+	SXE2_FW_START_STATE_MASK = (SXE2_FW_STATUS_MAIN_MASK | SXE2_FW_STATUS_SUB_MASK),
+};
+#endif
+
+#ifndef LED_DEFINE
+#define LED_DEFINE
+
+enum sxe2_led_mode {
+	SXE2_IDENTIFY_LED_BLINK_ON   = 0,
+	SXE2_IDENTIFY_LED_BLINK_OFF,
+	SXE2_IDENTIFY_LED_ON,
+	SXE2_IDENTIFY_LED_OFF,
+	SXE2_IDENTIFY_LED_RESET,
+};
+
+
+typedef struct sxe2_led_ctrl {
+	uint32_t mode;
+	uint32_t duration;
+} sxe2_led_ctrl_s;
+
+typedef struct sxe2_led_ctrl_resp {
+	uint32_t ack;
+} sxe2_led_ctrl_resp_s;
+#endif
+
+#endif /* __SXE2_MSG_H__ */
-- 
2.52.0


^ permalink raw reply related

* [PATCH v6 22/23] net/sxe2: add private devargs parsing
From: liujie5 @ 2026-06-24  2:02 UTC (permalink / raw)
  To: stephen; +Cc: dev, Jie Liu
In-Reply-To: <20260622092731.3092201-1-liujie5@linkdatatechnology.com>

From: Jie Liu <liujie5@linkdatatechnology.com>

Introduce runtime private device arguments (devargs) support for the
sxe2 PMD. This allows users to customize driver behavior at startup
without recompiling the source code.

The parameters are parsed using the standard 'rte_kvargs' library during
the PCI/vdev probing phase. Documentation for these parameters is also
updated.

Signed-off-by: Jie Liu <liujie5@linkdatatechnology.com>
---
 drivers/net/sxe2/sxe2_cmd_chnl.c |  21 +++
 drivers/net/sxe2/sxe2_cmd_chnl.h |   3 +
 drivers/net/sxe2/sxe2_drv_cmd.h  |  17 +++
 drivers/net/sxe2/sxe2_dump.c     |  17 ++-
 drivers/net/sxe2/sxe2_ethdev.c   | 223 +++++++++++++++++++++++++++++++
 drivers/net/sxe2/sxe2_ethdev.h   |   6 +
 drivers/net/sxe2/sxe2_flow.c     |   9 +-
 drivers/net/sxe2/sxe2_irq.c      |  30 +++++
 drivers/net/sxe2/sxe2_rx.c       |  12 ++
 9 files changed, 333 insertions(+), 5 deletions(-)

diff --git a/drivers/net/sxe2/sxe2_cmd_chnl.c b/drivers/net/sxe2/sxe2_cmd_chnl.c
index 43e8c59487..b09989fe50 100644
--- a/drivers/net/sxe2/sxe2_cmd_chnl.c
+++ b/drivers/net/sxe2/sxe2_cmd_chnl.c
@@ -99,6 +99,27 @@ int32_t sxe2_drv_dev_info_get(struct sxe2_adapter *adapter,
 	return ret;
 }
 
+int32_t sxe2_drv_fc_state_get(struct sxe2_adapter *adapter,
+			      struct sxe2_drv_vsi_fc_get_resp *dev_fc_state_resp)
+{
+	int32_t ret = 0;
+	struct sxe2_common_device *cdev = adapter->cdev;
+	struct sxe2_drv_cmd_params param = {0};
+	struct sxe2_drv_vsi_fc_get_req req = {0};
+
+	req.vsi_id = adapter->vsi_ctxt.main_vsi->vsi_id;
+	sxe2_drv_cmd_params_fill(adapter, &param, SXE2_DRV_CMD_VSI_FC_GET,
+				&req, sizeof(req),
+				dev_fc_state_resp,
+				sizeof(*dev_fc_state_resp));
+	ret = sxe2_drv_cmd_exec(cdev, &param);
+	if (ret) {
+		PMD_DEV_LOG_ERR(adapter, DRV, "get fc state failed, ret=%d", ret);
+		ret = -EIO;
+	}
+	return ret;
+}
+
 int32_t sxe2_drv_dev_fw_info_get(struct sxe2_adapter *adapter,
 				struct sxe2_drv_dev_fw_info_resp *dev_fw_info_resp)
 {
diff --git a/drivers/net/sxe2/sxe2_cmd_chnl.h b/drivers/net/sxe2/sxe2_cmd_chnl.h
index 988d4b458b..d63caad526 100644
--- a/drivers/net/sxe2/sxe2_cmd_chnl.h
+++ b/drivers/net/sxe2/sxe2_cmd_chnl.h
@@ -99,6 +99,9 @@ int32_t sxe2_drv_vsi_stats_reset(struct sxe2_adapter *adapter);
 int32_t sxe2_drv_queue_info_get_update(struct sxe2_adapter *adapter,
 				       struct eth_queue_stats *qstats);
 
+int32_t sxe2_drv_fc_state_get(struct sxe2_adapter *adapter,
+			      struct sxe2_drv_vsi_fc_get_resp *dev_fc_state_resp);
+
 int32_t sxe2_drv_rxq_mapping_set(struct rte_eth_dev *eth_dev, uint16_t queue_id, uint8_t pool_idx);
 
 int32_t sxe2_drv_txq_mapping_set(struct rte_eth_dev *eth_dev, uint16_t queue_id, uint8_t pool_idx);
diff --git a/drivers/net/sxe2/sxe2_drv_cmd.h b/drivers/net/sxe2/sxe2_drv_cmd.h
index 3fabf351af..03ef3b315d 100644
--- a/drivers/net/sxe2/sxe2_drv_cmd.h
+++ b/drivers/net/sxe2/sxe2_drv_cmd.h
@@ -651,6 +651,23 @@ struct __rte_aligned(4) __rte_packed_begin sxe2_drv_sfp_resp {
 	uint8_t data[];
 } __rte_packed_end;
 
+enum sxe2_fc_type {
+	SXE2_FC_T_DIS = 0,
+	SXE2_FC_T_LFC,
+	SXE2_FC_T_PFC,
+	SXE2_FC_T_UNKNOWN = 255,
+};
+
+struct __rte_aligned(4) __rte_packed_begin sxe2_drv_vsi_fc_get_req {
+	uint16_t vsi_id;
+	uint8_t rsv[2];
+} __rte_packed_end;
+
+struct __rte_aligned(4) __rte_packed_begin sxe2_drv_vsi_fc_get_resp {
+	uint8_t fc_enable;
+	uint8_t rsv[3];
+} __rte_packed_end;
+
 enum sxe2_drv_cmd_module {
 	SXE2_DRV_CMD_MODULE_HANDSHAKE = 0,
 	SXE2_DRV_CMD_MODULE_DEV = 1,
diff --git a/drivers/net/sxe2/sxe2_dump.c b/drivers/net/sxe2/sxe2_dump.c
index d43473e083..e9cc47a966 100644
--- a/drivers/net/sxe2/sxe2_dump.c
+++ b/drivers/net/sxe2/sxe2_dump.c
@@ -78,13 +78,11 @@ sxe2_dump_dev_args_info(FILE *file, struct rte_eth_dev *dev)
 	fprintf(file,
 		"  - Device Args Info:\n"
 		"\t  -- no_sched_mode: %s\n"
-		"\t  -- flow-duplicate-pattern: %u\n"
 		"\t  -- fnav-stat-type: %u\n"
 		"\t  -- sched_layer_mode: %u\n"
 		"\t  -- rx_low_latency: %s\n"
 		"\t  -- function-flow-direct: %s\n",
 		adapter->devargs.no_sched_mode ? "On" : "Off",
-		adapter->devargs.flow_dup_pattern_mode,
 		adapter->devargs.fnav_stat_type,
 		adapter->devargs.sched_layer_mode,
 		adapter->devargs.rx_low_latency ? "On" : "Off",
@@ -186,6 +184,20 @@ static void sxe2_dump_filter_info(FILE *file, struct rte_eth_dev *dev)
 	return;
 }
 
+static void sxe2_dump_fc_state(FILE *file, struct rte_eth_dev *dev)
+{
+	struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
+
+	if (!(adapter->cap_flags & SXE2_DEV_CAPS_OFFLOAD_FC_STATE))
+		goto l_end;
+
+	fprintf(file, " -- fc state:\n"
+		"\t  -- curr_state: %u\n",
+		adapter->fc_state_ctx.curr_state);
+l_end:
+	return;
+}
+
 static const char *sxe2_vsi_id_str(uint16_t vsi_id, char *buf, size_t len)
 {
 	if (vsi_id == SXE2_INVALID_VSI_ID)
@@ -272,6 +284,7 @@ int32_t sxe2_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file)
 	sxe2_dump_dev_args_info(str, dev);
 	sxe2_dump_filter_info(str, dev);
 	sxe2_dump_switchdev_info(str, dev);
+	sxe2_dump_fc_state(str, dev);
 
 	(void)fflush(str);
 
diff --git a/drivers/net/sxe2/sxe2_ethdev.c b/drivers/net/sxe2/sxe2_ethdev.c
index 6267f0499d..b24d2f1839 100644
--- a/drivers/net/sxe2/sxe2_ethdev.c
+++ b/drivers/net/sxe2/sxe2_ethdev.c
@@ -67,6 +67,12 @@ static const struct rte_pci_id pci_id_sxe2_tbl[] = {
 	{ RTE_PCI_DEVICE(SXE2_PCI_VENDOR_ID_206F, SXE2_PCI_DEVICE_ID_VF_1)},
 	{ .vendor_id = 0, },
 };
+#define SXE2_TXSCH_NODE_ADJ_LVL_MAX  3
+#define SXE2_DEVARG_FUNC_FLOW_DIRCT "function-flow-direct"
+#define SXE2_DEVARG_FNAV_STAT_TYPE "fnav-stat-type"
+#define SXE2_DEVARG_NO_SCHED_MODE "no-sched-mode"
+#define SXE2_DEVARG_SCHED_LAYER_MODE "sched-layer-mode"
+#define SXE2_DEVARG_RX_LOW_LATENCY "rx-low-latency"
 
 static struct sxe2_pci_map_addr_info sxe2_net_map_addr_info_pf[SXE2_PCI_MAP_RES_MAX_COUNT] = {
 	[SXE2_PCI_MAP_RES_INVALID] = {.addr_base = 0,
@@ -963,6 +969,121 @@ sxe2_buffer_split_supported_hdr_ptypes_get(struct rte_eth_dev *dev __rte_unused,
 	return ptypes;
 }
 
+static int32_t sxe2_parse_fnav_stat_type(const char *key, const char *value, void *args)
+{
+	int32_t ret = -EINVAL;
+	uint8_t *num = (uint8_t *)args;
+	unsigned long fnav_stat_type;
+	char *endptr = NULL;
+
+	if (value == NULL || args == NULL) {
+		ret = 0;
+		goto l_end;
+	}
+	errno = 0;
+	fnav_stat_type = strtoul(value, &endptr, 10);
+	if (errno != 0 || endptr == value || *endptr != '\0') {
+		PMD_LOG_WARN(INIT, "%s: \"%s\" is not a valid int value.",
+			key, value);
+		goto l_end;
+	}
+	if (fnav_stat_type > SXE2_FNAV_STAT_ENA_ALL ||
+		fnav_stat_type == SXE2_FNAV_STAT_ENA_NONE) {
+		PMD_LOG_ERR(INIT, "%s: \"%s\" out of range [1-3].",
+			key, value);
+		goto l_end;
+	}
+	*num = (uint8_t)fnav_stat_type;
+	ret = 0;
+l_end:
+	return ret;
+}
+static int32_t sxe2_parse_sched_layer_mode(const char *key, const char *value, void *args)
+{
+	int32_t ret = -EINVAL;
+	uint8_t *num = (uint8_t *)args;
+	unsigned long sched_layer_mode;
+	char *endptr = NULL;
+
+	if (value == NULL || args == NULL) {
+		ret = 0;
+		goto l_end;
+	}
+	errno = 0;
+	sched_layer_mode = strtoul(value, &endptr, 10);
+	if (errno != 0 || endptr == value || *endptr != '\0') {
+		PMD_LOG_WARN(INIT, "%s: \"%s\" is not a valid int value.",
+			key, value);
+		goto l_end;
+	}
+	if (sched_layer_mode > SXE2_TXSCH_NODE_ADJ_LVL_MAX) {
+		PMD_LOG_ERR(INIT, "%s: \"%s\" > 3.",
+			key, value);
+		goto l_end;
+	}
+	*num = (uint8_t)sched_layer_mode;
+	ret = 0;
+l_end:
+	return ret;
+}
+static int32_t sxe2_parse_no_sched_mode(const char *key, const char *value, void *args)
+{
+	int32_t ret = -EINVAL;
+	uint8_t *num = (uint8_t *)args;
+	unsigned long no_sched_mode;
+	char *endptr = NULL;
+
+	if (value == NULL || args == NULL) {
+		ret = 0;
+		goto l_end;
+	}
+	errno = 0;
+	no_sched_mode = strtoul(value, &endptr, 10);
+	if (errno != 0 || endptr == value || *endptr != '\0') {
+		PMD_LOG_WARN(INIT, "%s: \"%s\" is not a valid int value.",
+			key, value);
+		goto l_end;
+	}
+	if (no_sched_mode != 1) {
+		PMD_LOG_ERR(INIT, "%s: \"%s\" != 1.",
+			key, value);
+		goto l_end;
+	}
+	*num = (uint8_t)no_sched_mode;
+	ret = 0;
+l_end:
+	return ret;
+}
+
+static int32_t sxe2_parse_bool(const char *key, const char *value, void *args)
+{
+	int32_t ret = -EINVAL;
+	uint8_t *num = (uint8_t *)args;
+	unsigned long bool_val;
+	char *endptr = NULL;
+
+	if (value == NULL || args == NULL) {
+		ret = 0;
+		goto l_end;
+	}
+	errno = 0;
+	bool_val = strtoul(value, &endptr, 10);
+	if (errno != 0 || endptr == value || *endptr != '\0') {
+		PMD_LOG_WARN(INIT, "%s: \"%s\" is not a valid int value.",
+			key, value);
+		goto l_end;
+	}
+	if (bool_val != 0 && bool_val != 1) {
+		PMD_LOG_ERR(INIT, "%s: \"%s\" out of range [0|1].",
+			key, value);
+		goto l_end;
+	}
+	*num = (uint8_t)bool_val;
+	ret = 0;
+l_end:
+	return ret;
+}
+
 struct sxe2_pci_map_bar_info *sxe2_dev_get_bar_info(struct sxe2_adapter *adapter,
 						    enum sxe2_pci_map_resource res_type)
 {
@@ -1030,6 +1151,56 @@ void *sxe2_pci_map_addr_get(struct sxe2_adapter *adapter,
 	return addr;
 }
 
+static int32_t sxe2_args_parse(struct rte_eth_dev *dev, struct sxe2_dev_kvargs_info *kvargs)
+{
+	struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
+	int32_t ret = 0;
+	PMD_INIT_FUNC_TRACE();
+
+	if (kvargs == NULL)
+		goto l_end;
+	ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_FNAV_STAT_TYPE,
+				 &sxe2_parse_fnav_stat_type,
+				 &adapter->devargs.fnav_stat_type);
+	if (ret) {
+		PMD_DEV_LOG_ERR(adapter, INIT, "Failed to parse fnav stat type, ret:%d", ret);
+		goto l_end;
+	}
+
+	ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_NO_SCHED_MODE,
+				 &sxe2_parse_no_sched_mode,
+				 &adapter->devargs.no_sched_mode);
+	if (ret) {
+		PMD_DEV_LOG_ERR(adapter, INIT, "Failed to parse no sched mode, ret:%d", ret);
+		goto l_end;
+	}
+	ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_SCHED_LAYER_MODE,
+				 &sxe2_parse_sched_layer_mode,
+				 &adapter->devargs.sched_layer_mode);
+	if (ret) {
+		PMD_DEV_LOG_ERR(adapter, INIT, "Failed to parse sched layer mode, ret:%d", ret);
+		goto l_end;
+	}
+
+	ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_FUNC_FLOW_DIRCT,
+				 &sxe2_parse_bool,
+				 &adapter->devargs.func_flow_direct_en);
+	if (ret) {
+		PMD_DEV_LOG_ERR(adapter, INIT, "Failed to parse function flow rule enable,"
+				"ret:%d", ret);
+		goto l_end;
+	}
+	ret = sxe2_kvargs_process(kvargs, SXE2_DEVARG_RX_LOW_LATENCY,
+				 &sxe2_parse_bool,
+				 &adapter->devargs.rx_low_latency);
+	if (ret) {
+		PMD_DEV_LOG_ERR(adapter, INIT, "Failed to parse rx low latency, ret:%d", ret);
+		goto l_end;
+	}
+l_end:
+	return ret;
+}
+
 static int32_t sxe2_eth_init(struct rte_eth_dev *dev)
 {
 	int32_t ret = 0;
@@ -1582,6 +1753,37 @@ void sxe2_dev_pci_map_uinit(struct rte_eth_dev *dev)
 	adapter->dev_info.dev_data = NULL;
 }
 
+static int32_t sxe2_fc_state_init(struct rte_eth_dev *dev)
+{
+	struct sxe2_adapter *adapter =
+		SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
+	struct sxe2_drv_vsi_fc_get_resp fc_resp = {0};
+	int32_t ret;
+
+	if (!(adapter->cap_flags & SXE2_DEV_CAPS_OFFLOAD_FC_STATE)) {
+		adapter->fc_state_ctx.cfg_state = 0;
+		adapter->fc_state_ctx.curr_state = 0;
+		ret = 0;
+		goto l_end;
+	}
+	ret = sxe2_drv_fc_state_get(adapter, &fc_resp);
+	if (ret) {
+		PMD_LOG_ERR(INIT, "Failed to get fc state, ret=[%d]", ret);
+		goto l_end;
+	}
+	adapter->fc_state_ctx.cfg_state = fc_resp.fc_enable;
+	adapter->fc_state_ctx.curr_state = 0;
+l_end:
+	return ret;
+}
+static void sxe2_fc_state_uinit(struct rte_eth_dev *dev)
+{
+	struct sxe2_adapter *adapter =
+		SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
+	adapter->fc_state_ctx.cfg_state = 0;
+	adapter->fc_state_ctx.curr_state = 0;
+}
+
 uint32_t sxe2_sched_mode_get(struct sxe2_adapter *adapter)
 {
 	uint32_t ret_mode = SXE2_SCHED_MODE_INVALID;
@@ -1664,6 +1866,12 @@ static int32_t sxe2_dev_init(struct rte_eth_dev *dev,
 		goto l_end;
 	}
 
+	ret = sxe2_args_parse(dev, kvargs);
+	if (ret) {
+		PMD_LOG_ERR(INIT, "Failed to parse devargs, ret=%d", ret);
+		goto l_end;
+	}
+
 	ret = sxe2_hw_init(dev);
 	if (ret) {
 		PMD_LOG_ERR(INIT, "Failed to initialize hw, ret=[%d]", ret);
@@ -1730,6 +1938,12 @@ static int32_t sxe2_dev_init(struct rte_eth_dev *dev,
 		goto init_flow_err;
 	}
 
+	ret = sxe2_fc_state_init(dev);
+	if (ret) {
+		PMD_LOG_ERR(INIT, "Failed to init fc state, ret=%d", ret);
+		goto init_fc_state_err;
+	}
+
 	ret = sxe2_sched_init(dev);
 	if (ret) {
 		PMD_LOG_ERR(INIT, "Failed to init sched, ret=%d", ret);
@@ -1753,6 +1967,8 @@ static int32_t sxe2_dev_init(struct rte_eth_dev *dev,
 init_xstats_err:
 	(void)sxe2_sched_uinit(dev);
 init_sched_err:
+	sxe2_fc_state_uinit(dev);
+init_fc_state_err:
 	(void)sxe2_flow_uninit(dev);
 init_flow_err:
 init_rss_err:
@@ -1798,6 +2014,7 @@ static int32_t sxe2_dev_close(struct rte_eth_dev *dev)
 	sxe2_eth_uinit(dev);
 	sxe2_dev_pci_map_uinit(dev);
 	sxe2_free_repr_info(dev);
+	sxe2_fc_state_uinit(dev);
 
 l_end:
 	return 0;
@@ -2103,6 +2320,12 @@ RTE_INIT(rte_sxe2_pmd_init)
 RTE_PMD_EXPORT_NAME(net_sxe2);
 RTE_PMD_REGISTER_PCI_TABLE(net_sxe2, pci_id_sxe2_tbl);
 RTE_PMD_REGISTER_KMOD_DEP(net_sxe2, "* sxe2");
+RTE_PMD_REGISTER_PARAM_STRING(net_sxe2,
+	"function-flow-direct=<0|1> "
+	"fnav-stat-type=<1|2|3> "
+	"no-sched-mode=<0|1> "
+	"sched-layer-mode=<0-3> "
+	"rx-low-latency=<0|1>");
 
 RTE_LOG_REGISTER_SUFFIX(sxe2_log_init, init, NOTICE);
 RTE_LOG_REGISTER_SUFFIX(sxe2_log_driver, driver, NOTICE);
diff --git a/drivers/net/sxe2/sxe2_ethdev.h b/drivers/net/sxe2/sxe2_ethdev.h
index a68b95c0d0..c54e8a435e 100644
--- a/drivers/net/sxe2/sxe2_ethdev.h
+++ b/drivers/net/sxe2/sxe2_ethdev.h
@@ -310,6 +310,11 @@ struct sxe2_filter_context {
 	bool cur_l2_config;
 };
 
+struct sxe2_fc_state_ctxt {
+	uint8_t curr_state;
+	uint8_t cfg_state;
+};
+
 struct sxe2_adapter {
 	struct sxe2_common_device      *cdev;
 	struct sxe2_dev_info            dev_info;
@@ -331,6 +336,7 @@ struct sxe2_adapter {
 	struct sxe2_security_ctx      security_ctx;
 	struct sxe2_repr_context      repr_ctxt;
 	struct sxe2_switchdev_info    switchdev_info;
+	struct sxe2_fc_state_ctxt     fc_state_ctx;
 	bool                          rule_started;
 	bool                          flow_isolated;
 	bool                          flow_isolate_cfg;
diff --git a/drivers/net/sxe2/sxe2_flow.c b/drivers/net/sxe2/sxe2_flow.c
index 187ad95166..5b26f44640 100644
--- a/drivers/net/sxe2/sxe2_flow.c
+++ b/drivers/net/sxe2/sxe2_flow.c
@@ -759,6 +759,7 @@ static int32_t sxe2_flow_validate_with_flow(struct rte_eth_dev *dev,
 					const struct rte_flow_action actions[],
 					struct rte_flow_error *error)
 {
+	struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
 	int32_t ret = 0;
 	struct sxe2_flow *flow = NULL;
 
@@ -801,9 +802,11 @@ static int32_t sxe2_flow_validate_with_flow(struct rte_eth_dev *dev,
 
 	ret = sxe2_flow_check_flow_list_duplicate(dev, flow_list);
 	if (ret != 0) {
-		rte_flow_error_set(error, EEXIST, RTE_FLOW_ERROR_TYPE_ITEM,
-				NULL, "Duplicate flow.");
-		PMD_LOG_ERR(DRV, "Duplicate flow.");
+		rte_flow_error_set(error, EEXIST, RTE_FLOW_ERROR_TYPE_ITEM, NULL,
+				   adapter->devargs.flow_dup_pattern_mode ?
+				   "Duplicate flow pattern." :
+				   "Duplicate flow pattern is not allowed.");
+		PMD_LOG_ERR(DRV, "Duplicate flow pattern.");
 		goto l_end;
 	}
 l_end:
diff --git a/drivers/net/sxe2/sxe2_irq.c b/drivers/net/sxe2/sxe2_irq.c
index d8e0b19463..3306504761 100644
--- a/drivers/net/sxe2/sxe2_irq.c
+++ b/drivers/net/sxe2/sxe2_irq.c
@@ -10,6 +10,7 @@
 #include <rte_alarm.h>
 #include <fcntl.h>
 #include <rte_stdatomic.h>
+#include <rte_common.h>
 
 #include "sxe2_ethdev.h"
 #include "sxe2_irq.h"
@@ -47,6 +48,31 @@ static struct sxe2_event_handler event_handler = {
 
 static RTE_ATOMIC(uint32_t)event_thread_run;
 
+static int32_t sxe2_fc_state_callback(struct rte_eth_dev *dev)
+{
+	struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
+	struct sxe2_drv_vsi_fc_get_resp fc_resp = {0};
+	int32_t ret;
+
+	if (!(adapter->cap_flags & SXE2_DEV_CAPS_OFFLOAD_FC_STATE)) {
+		ret = 0;
+		goto l_end;
+	}
+	ret = sxe2_drv_fc_state_get(adapter, &fc_resp);
+	if (ret) {
+		PMD_LOG_ERR(INIT, "Failed to get fc state, ret=[%d]", ret);
+		goto l_end;
+	}
+	adapter->fc_state_ctx.cfg_state = fc_resp.fc_enable;
+	if (dev->data->dev_started) {
+		PMD_LOG_NOTICE(DRV, "Interrupt event: FC status changed."
+			       "cfg_state:%u curr_state:%u",
+				adapter->fc_state_ctx.cfg_state,
+				adapter->fc_state_ctx.curr_state);
+	}
+l_end:
+	return ret;
+}
 
 static void sxe2_event_irq_common_handler(struct sxe2_adapter *adapter, uint64_t oicr)
 {
@@ -68,6 +94,10 @@ static void sxe2_event_irq_common_handler(struct sxe2_adapter *adapter, uint64_t
 		PMD_DEV_LOG_INFO(adapter, DRV, "event notify legacy");
 		(void)sxe2_switchdev_notify_callback(adapter, false);
 	}
+	if (oicr & RTE_BIT32(SXE2_COM_FC_ST_CHANGE)) {
+		PMD_DEV_LOG_INFO(adapter, DRV, "fc event notify legacy");
+		(void)sxe2_fc_state_callback(dev);
+	}
 }
 
 static uint32_t sxe2_event_intr_handle(void *param __rte_unused)
diff --git a/drivers/net/sxe2/sxe2_rx.c b/drivers/net/sxe2/sxe2_rx.c
index 820d4f0620..d700c60083 100644
--- a/drivers/net/sxe2/sxe2_rx.c
+++ b/drivers/net/sxe2/sxe2_rx.c
@@ -467,12 +467,24 @@ int32_t __rte_cold sxe2_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queu
 int32_t __rte_cold sxe2_rxqs_all_start(struct rte_eth_dev *dev)
 {
 	struct rte_eth_dev_data *data = dev->data;
+	struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
+	struct sxe2_drv_vsi_fc_get_resp fc_resp = {0};
 	struct sxe2_rx_queue *rxq;
 	uint16_t nb_rxq;
 	uint16_t nb_started_rxq;
 	int32_t ret;
 	PMD_INIT_FUNC_TRACE();
 
+	if (adapter->cap_flags & SXE2_DEV_CAPS_OFFLOAD_FC_STATE) {
+		ret = sxe2_drv_fc_state_get(adapter, &fc_resp);
+		if (ret) {
+			PMD_LOG_ERR(RX, "Failed to get fc state, ret=[%d]", ret);
+			goto l_end;
+		}
+		adapter->fc_state_ctx.cfg_state = fc_resp.fc_enable;
+		adapter->fc_state_ctx.curr_state = adapter->fc_state_ctx.cfg_state;
+	}
+
 	for (nb_rxq = 0; nb_rxq < data->nb_rx_queues; nb_rxq++) {
 		rxq = dev->data->rx_queues[nb_rxq];
 		if (!rxq || rxq->rx_deferred_start)
-- 
2.52.0


^ permalink raw reply related


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