From e0f25b3ce4979fe511d1fd05f255de9fe92689ab Mon Sep 17 00:00:00 2001 From: Anders Sonmark Date: Mon, 9 Feb 2026 16:46:13 +0100 Subject: [PATCH 01/11] fips202: Don't build Keccak-f1600x2/x4 unless used When building with MLD_CONFIG_SERIAL_FIPS202_ONLY or MLD_CONFIG_REDUCE_RAM, Keccak-f1600x2/x4 is not used and can be skipped. Signed-off-by: Anders Sonmark --- dev/fips202/aarch64/auto.h | 3 +++ mldsa/src/fips202/keccakf1600.c | 2 ++ mldsa/src/fips202/keccakf1600.h | 2 ++ mldsa/src/fips202/native/aarch64/auto.h | 3 +++ 4 files changed, 10 insertions(+) diff --git a/dev/fips202/aarch64/auto.h b/dev/fips202/aarch64/auto.h index 7432fa566..77ca273a6 100644 --- a/dev/fips202/aarch64/auto.h +++ b/dev/fips202/aarch64/auto.h @@ -37,6 +37,7 @@ #include "x1_scalar.h" #endif +#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) && !defined(MLD_CONFIG_REDUCE_RAM) /* * Keccak-f1600x2/x4 * @@ -68,4 +69,6 @@ #endif /* !__ARM_FEATURE_SHA3 */ +#endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY && !MLD_CONFIG_REDUCE_RAM */ + #endif /* !MLD_DEV_FIPS202_AARCH64_AUTO_H */ diff --git a/mldsa/src/fips202/keccakf1600.c b/mldsa/src/fips202/keccakf1600.c index bda3da9a4..e2139be8b 100644 --- a/mldsa/src/fips202/keccakf1600.c +++ b/mldsa/src/fips202/keccakf1600.c @@ -84,6 +84,7 @@ void mld_keccakf1600_xor_bytes(uint64_t *state, const unsigned char *data, #endif /* !MLD_SYS_LITTLE_ENDIAN */ } +#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) MLD_INTERNAL_API void mld_keccakf1600x4_extract_bytes(uint64_t *state, unsigned char *data0, unsigned char *data1, unsigned char *data2, @@ -131,6 +132,7 @@ void mld_keccakf1600x4_permute(uint64_t *state) mld_keccakf1600_permute(state + MLD_KECCAK_LANES * 2); mld_keccakf1600_permute(state + MLD_KECCAK_LANES * 3); } +#endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY */ static const uint64_t mld_KeccakF_RoundConstants[MLD_KECCAK_NROUNDS] = { (uint64_t)0x0000000000000001ULL, (uint64_t)0x0000000000008082ULL, diff --git a/mldsa/src/fips202/keccakf1600.h b/mldsa/src/fips202/keccakf1600.h index c226804a3..35752943a 100644 --- a/mldsa/src/fips202/keccakf1600.h +++ b/mldsa/src/fips202/keccakf1600.h @@ -43,6 +43,7 @@ __contract__( assigns(memory_slice(state, sizeof(uint64_t) * MLD_KECCAK_LANES)) ); +#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) #define mld_keccakf1600x4_extract_bytes \ MLD_NAMESPACE(keccakf1600x4_extract_bytes) MLD_INTERNAL_API @@ -93,6 +94,7 @@ __contract__( requires(memory_no_alias(state, sizeof(uint64_t) * MLD_KECCAK_LANES * MLD_KECCAK_WAY)) assigns(memory_slice(state, sizeof(uint64_t) * MLD_KECCAK_LANES * MLD_KECCAK_WAY)) ); +#endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY */ #define mld_keccakf1600_permute MLD_NAMESPACE(keccakf1600_permute) MLD_INTERNAL_API diff --git a/mldsa/src/fips202/native/aarch64/auto.h b/mldsa/src/fips202/native/aarch64/auto.h index 4375cc197..5da037a15 100644 --- a/mldsa/src/fips202/native/aarch64/auto.h +++ b/mldsa/src/fips202/native/aarch64/auto.h @@ -37,6 +37,7 @@ #include "x1_scalar.h" #endif +#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) && !defined(MLD_CONFIG_REDUCE_RAM) /* * Keccak-f1600x2/x4 * @@ -68,4 +69,6 @@ #endif /* !__ARM_FEATURE_SHA3 */ +#endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY && !MLD_CONFIG_REDUCE_RAM */ + #endif /* !MLD_FIPS202_NATIVE_AARCH64_AUTO_H */ From e70615224c72e9d0bc141101ae80ab06f9a99fc5 Mon Sep 17 00:00:00 2001 From: Anders Sonmark Date: Thu, 19 Mar 2026 09:44:36 +0100 Subject: [PATCH 02/11] aarch64/src/polyz_unpack_table.c: Disable unused tables Only one table is used for each parameter set, so add conditions to remove the unused table from non-shared builds. Signed-off-by: Anders Sonmark --- dev/aarch64_clean/src/arith_native_aarch64.h | 5 +++++ dev/aarch64_clean/src/polyz_unpack_table.c | 5 +++++ dev/aarch64_opt/src/arith_native_aarch64.h | 5 +++++ dev/aarch64_opt/src/polyz_unpack_table.c | 5 +++++ mldsa/src/native/aarch64/src/arith_native_aarch64.h | 5 +++++ mldsa/src/native/aarch64/src/polyz_unpack_table.c | 5 +++++ 6 files changed, 30 insertions(+) diff --git a/dev/aarch64_clean/src/arith_native_aarch64.h b/dev/aarch64_clean/src/arith_native_aarch64.h index 9737b70e4..f372b3020 100644 --- a/dev/aarch64_clean/src/arith_native_aarch64.h +++ b/dev/aarch64_clean/src/arith_native_aarch64.h @@ -29,10 +29,15 @@ extern const uint8_t mld_rej_uniform_table[]; #define mld_rej_uniform_eta_table MLD_NAMESPACE(rej_uniform_eta_table) extern const uint8_t mld_rej_uniform_eta_table[]; +#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 #define mld_polyz_unpack_17_indices MLD_NAMESPACE(polyz_unpack_17_indices) extern const uint8_t mld_polyz_unpack_17_indices[]; +#endif +#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ + (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) #define mld_polyz_unpack_19_indices MLD_NAMESPACE(polyz_unpack_19_indices) extern const uint8_t mld_polyz_unpack_19_indices[]; +#endif /* diff --git a/dev/aarch64_clean/src/polyz_unpack_table.c b/dev/aarch64_clean/src/polyz_unpack_table.c index 1fb8ff400..393b11102 100644 --- a/dev/aarch64_clean/src/polyz_unpack_table.c +++ b/dev/aarch64_clean/src/polyz_unpack_table.c @@ -19,19 +19,24 @@ /* Table of indices used for tbl instructions in polyz_unpack_{17,19}. * See autogen for details. */ +#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 MLD_ALIGN const uint8_t mld_polyz_unpack_17_indices[] = { 0, 1, 2, 255, 2, 3, 4, 255, 4, 5, 6, 255, 6, 7, 8, 255, 9, 10, 11, 255, 11, 12, 13, 255, 13, 14, 15, 255, 15, 16, 17, 255, 2, 3, 4, 255, 4, 5, 6, 255, 6, 7, 8, 255, 8, 9, 10, 255, 11, 12, 13, 255, 13, 14, 15, 255, 15, 16, 17, 255, 17, 18, 19, 255, }; +#endif +#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ + (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_ALIGN const uint8_t mld_polyz_unpack_19_indices[] = { 0, 1, 2, 255, 2, 3, 4, 255, 5, 6, 7, 255, 7, 8, 9, 255, 10, 11, 12, 255, 12, 13, 14, 255, 15, 16, 17, 255, 17, 18, 19, 255, 4, 5, 6, 255, 6, 7, 8, 255, 9, 10, 11, 255, 11, 12, 13, 255, 14, 15, 16, 255, 16, 17, 18, 255, 19, 20, 21, 255, 21, 22, 23, 255, }; +#endif #else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ diff --git a/dev/aarch64_opt/src/arith_native_aarch64.h b/dev/aarch64_opt/src/arith_native_aarch64.h index 9737b70e4..f372b3020 100644 --- a/dev/aarch64_opt/src/arith_native_aarch64.h +++ b/dev/aarch64_opt/src/arith_native_aarch64.h @@ -29,10 +29,15 @@ extern const uint8_t mld_rej_uniform_table[]; #define mld_rej_uniform_eta_table MLD_NAMESPACE(rej_uniform_eta_table) extern const uint8_t mld_rej_uniform_eta_table[]; +#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 #define mld_polyz_unpack_17_indices MLD_NAMESPACE(polyz_unpack_17_indices) extern const uint8_t mld_polyz_unpack_17_indices[]; +#endif +#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ + (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) #define mld_polyz_unpack_19_indices MLD_NAMESPACE(polyz_unpack_19_indices) extern const uint8_t mld_polyz_unpack_19_indices[]; +#endif /* diff --git a/dev/aarch64_opt/src/polyz_unpack_table.c b/dev/aarch64_opt/src/polyz_unpack_table.c index 1fb8ff400..393b11102 100644 --- a/dev/aarch64_opt/src/polyz_unpack_table.c +++ b/dev/aarch64_opt/src/polyz_unpack_table.c @@ -19,19 +19,24 @@ /* Table of indices used for tbl instructions in polyz_unpack_{17,19}. * See autogen for details. */ +#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 MLD_ALIGN const uint8_t mld_polyz_unpack_17_indices[] = { 0, 1, 2, 255, 2, 3, 4, 255, 4, 5, 6, 255, 6, 7, 8, 255, 9, 10, 11, 255, 11, 12, 13, 255, 13, 14, 15, 255, 15, 16, 17, 255, 2, 3, 4, 255, 4, 5, 6, 255, 6, 7, 8, 255, 8, 9, 10, 255, 11, 12, 13, 255, 13, 14, 15, 255, 15, 16, 17, 255, 17, 18, 19, 255, }; +#endif +#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ + (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_ALIGN const uint8_t mld_polyz_unpack_19_indices[] = { 0, 1, 2, 255, 2, 3, 4, 255, 5, 6, 7, 255, 7, 8, 9, 255, 10, 11, 12, 255, 12, 13, 14, 255, 15, 16, 17, 255, 17, 18, 19, 255, 4, 5, 6, 255, 6, 7, 8, 255, 9, 10, 11, 255, 11, 12, 13, 255, 14, 15, 16, 255, 16, 17, 18, 255, 19, 20, 21, 255, 21, 22, 23, 255, }; +#endif #else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ diff --git a/mldsa/src/native/aarch64/src/arith_native_aarch64.h b/mldsa/src/native/aarch64/src/arith_native_aarch64.h index 9737b70e4..f372b3020 100644 --- a/mldsa/src/native/aarch64/src/arith_native_aarch64.h +++ b/mldsa/src/native/aarch64/src/arith_native_aarch64.h @@ -29,10 +29,15 @@ extern const uint8_t mld_rej_uniform_table[]; #define mld_rej_uniform_eta_table MLD_NAMESPACE(rej_uniform_eta_table) extern const uint8_t mld_rej_uniform_eta_table[]; +#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 #define mld_polyz_unpack_17_indices MLD_NAMESPACE(polyz_unpack_17_indices) extern const uint8_t mld_polyz_unpack_17_indices[]; +#endif +#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ + (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) #define mld_polyz_unpack_19_indices MLD_NAMESPACE(polyz_unpack_19_indices) extern const uint8_t mld_polyz_unpack_19_indices[]; +#endif /* diff --git a/mldsa/src/native/aarch64/src/polyz_unpack_table.c b/mldsa/src/native/aarch64/src/polyz_unpack_table.c index 1fb8ff400..393b11102 100644 --- a/mldsa/src/native/aarch64/src/polyz_unpack_table.c +++ b/mldsa/src/native/aarch64/src/polyz_unpack_table.c @@ -19,19 +19,24 @@ /* Table of indices used for tbl instructions in polyz_unpack_{17,19}. * See autogen for details. */ +#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 MLD_ALIGN const uint8_t mld_polyz_unpack_17_indices[] = { 0, 1, 2, 255, 2, 3, 4, 255, 4, 5, 6, 255, 6, 7, 8, 255, 9, 10, 11, 255, 11, 12, 13, 255, 13, 14, 15, 255, 15, 16, 17, 255, 2, 3, 4, 255, 4, 5, 6, 255, 6, 7, 8, 255, 8, 9, 10, 255, 11, 12, 13, 255, 13, 14, 15, 255, 15, 16, 17, 255, 17, 18, 19, 255, }; +#endif +#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ + (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_ALIGN const uint8_t mld_polyz_unpack_19_indices[] = { 0, 1, 2, 255, 2, 3, 4, 255, 5, 6, 7, 255, 7, 8, 9, 255, 10, 11, 12, 255, 12, 13, 14, 255, 15, 16, 17, 255, 17, 18, 19, 255, 4, 5, 6, 255, 6, 7, 8, 255, 9, 10, 11, 255, 11, 12, 13, 255, 14, 15, 16, 255, 16, 17, 18, 255, 19, 20, 21, 255, 21, 22, 23, 255, }; +#endif #else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ From f6a63e0c8bef3fca5efd5e6ec2cc40bf691b3dc8 Mon Sep 17 00:00:00 2001 From: Anders Sonmark Date: Mon, 9 Feb 2026 16:57:19 +0100 Subject: [PATCH 03/11] Add config to disable key generation API Make it possible to exclude key generation when not needed, together with all internal functions not needed for signature creation or verification. Signed-off-by: Anders Sonmark --- dev/aarch64_clean/meta.h | 2 ++ dev/aarch64_clean/src/arith_native_aarch64.h | 4 ++++ dev/aarch64_clean/src/rej_uniform_eta2_asm.S | 4 +++- dev/aarch64_clean/src/rej_uniform_eta4_asm.S | 4 +++- dev/aarch64_clean/src/rej_uniform_eta_table.c | 9 ++++++--- dev/aarch64_opt/meta.h | 2 ++ dev/aarch64_opt/src/arith_native_aarch64.h | 4 ++++ dev/aarch64_opt/src/rej_uniform_eta2_asm.S | 4 +++- dev/aarch64_opt/src/rej_uniform_eta4_asm.S | 4 +++- dev/aarch64_opt/src/rej_uniform_eta_table.c | 9 ++++++--- dev/x86_64/meta.h | 2 ++ dev/x86_64/src/arith_native_x86_64.h | 2 ++ dev/x86_64/src/rej_uniform_eta2_avx2.c | 10 ++++++---- dev/x86_64/src/rej_uniform_eta4_avx2.c | 10 ++++++---- .../mldsa_native/mldsa_native_config.h | 12 ++++++++++++ .../basic_lowram/mldsa_native/mldsa_native_config.h | 12 ++++++++++++ .../mldsa_native/mldsa_native_config.h | 12 ++++++++++++ .../mldsa_native/mldsa_native_config.h | 12 ++++++++++++ .../mldsa_native/mldsa_native_config.h | 12 ++++++++++++ .../mldsa_native/mldsa_native_config.h | 12 ++++++++++++ .../mldsa_native/mldsa_native_config.h | 12 ++++++++++++ .../mldsa_native/mldsa_native_config.h | 12 ++++++++++++ .../mldsa_native/mldsa_native_config.h | 12 ++++++++++++ .../mldsa_native/mldsa_native_config.h | 12 ++++++++++++ .../mldsa_native/mldsa_native_config.h | 12 ++++++++++++ mldsa/mldsa_native.h | 4 ++++ mldsa/mldsa_native_config.h | 12 ++++++++++++ mldsa/src/native/aarch64/meta.h | 2 ++ mldsa/src/native/aarch64/src/arith_native_aarch64.h | 4 ++++ mldsa/src/native/aarch64/src/rej_uniform_eta2_asm.S | 4 +++- mldsa/src/native/aarch64/src/rej_uniform_eta4_asm.S | 4 +++- mldsa/src/native/aarch64/src/rej_uniform_eta_table.c | 9 ++++++--- mldsa/src/native/api.h | 2 ++ mldsa/src/native/x86_64/meta.h | 2 ++ mldsa/src/native/x86_64/src/arith_native_x86_64.h | 2 ++ mldsa/src/native/x86_64/src/rej_uniform_eta2_avx2.c | 10 ++++++---- mldsa/src/native/x86_64/src/rej_uniform_eta4_avx2.c | 10 ++++++---- mldsa/src/packing.c | 4 ++++ mldsa/src/packing.h | 2 ++ mldsa/src/poly.c | 6 ++++++ mldsa/src/poly.h | 6 ++++++ mldsa/src/poly_kl.c | 4 ++++ mldsa/src/poly_kl.h | 4 ++++ mldsa/src/polyvec.c | 4 ++++ mldsa/src/polyvec.h | 4 ++++ mldsa/src/sign.c | 4 ++++ mldsa/src/sign.h | 3 +++ proofs/cbmc/mldsa_native_config_cbmc.h | 12 ++++++++++++ test/configs/break_pct_config.h | 12 ++++++++++++ test/configs/custom_memcpy_config.h | 12 ++++++++++++ test/configs/custom_memset_config.h | 12 ++++++++++++ test/configs/custom_native_capability_config_0.h | 12 ++++++++++++ test/configs/custom_native_capability_config_1.h | 12 ++++++++++++ .../custom_native_capability_config_CPUID_AVX2.h | 12 ++++++++++++ ...custom_native_capability_config_ID_AA64PFR1_EL1.h | 12 ++++++++++++ test/configs/custom_randombytes_config.h | 12 ++++++++++++ test/configs/custom_stdlib_config.h | 12 ++++++++++++ test/configs/custom_zeroize_config.h | 12 ++++++++++++ test/configs/no_asm_config.h | 12 ++++++++++++ test/configs/serial_fips202_config.h | 12 ++++++++++++ test/configs/test_alloc_config.h | 12 ++++++++++++ 61 files changed, 445 insertions(+), 31 deletions(-) diff --git a/dev/aarch64_clean/meta.h b/dev/aarch64_clean/meta.h index 2923b8c55..8543ab5ab 100644 --- a/dev/aarch64_clean/meta.h +++ b/dev/aarch64_clean/meta.h @@ -66,6 +66,7 @@ static MLD_INLINE int mld_rej_uniform_native(int32_t *r, unsigned len, return (int)mld_rej_uniform_asm(r, buf, buflen, mld_rej_uniform_table); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 2 MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_rej_uniform_eta2_native(int32_t *r, unsigned len, @@ -119,6 +120,7 @@ static MLD_INLINE int mld_rej_uniform_eta4_native(int32_t *r, unsigned len, return (int)outlen; } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4 */ +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) diff --git a/dev/aarch64_clean/src/arith_native_aarch64.h b/dev/aarch64_clean/src/arith_native_aarch64.h index f372b3020..88f277f04 100644 --- a/dev/aarch64_clean/src/arith_native_aarch64.h +++ b/dev/aarch64_clean/src/arith_native_aarch64.h @@ -26,8 +26,10 @@ extern const int32_t mld_aarch64_intt_zetas_layer123456[]; #define mld_rej_uniform_table MLD_NAMESPACE(rej_uniform_table) extern const uint8_t mld_rej_uniform_table[]; +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_rej_uniform_eta_table MLD_NAMESPACE(rej_uniform_eta_table) extern const uint8_t mld_rej_uniform_eta_table[]; +#endif #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 #define mld_polyz_unpack_17_indices MLD_NAMESPACE(polyz_unpack_17_indices) @@ -65,6 +67,7 @@ MLD_MUST_CHECK_RETURN_VALUE uint64_t mld_rej_uniform_asm(int32_t *r, const uint8_t *buf, unsigned buflen, const uint8_t *table); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_rej_uniform_eta2_asm MLD_NAMESPACE(rej_uniform_eta2_asm) MLD_MUST_CHECK_RETURN_VALUE uint64_t mld_rej_uniform_eta2_asm(int32_t *r, const uint8_t *buf, @@ -74,6 +77,7 @@ uint64_t mld_rej_uniform_eta2_asm(int32_t *r, const uint8_t *buf, MLD_MUST_CHECK_RETURN_VALUE uint64_t mld_rej_uniform_eta4_asm(int32_t *r, const uint8_t *buf, unsigned buflen, const uint8_t *table); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #define mld_poly_decompose_32_asm MLD_NAMESPACE(poly_decompose_32_asm) void mld_poly_decompose_32_asm(int32_t *a1, int32_t *a0); diff --git a/dev/aarch64_clean/src/rej_uniform_eta2_asm.S b/dev/aarch64_clean/src/rej_uniform_eta2_asm.S index c7c84b1ca..687c04bf4 100644 --- a/dev/aarch64_clean/src/rej_uniform_eta2_asm.S +++ b/dev/aarch64_clean/src/rej_uniform_eta2_asm.S @@ -6,6 +6,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_AARCH64) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 2) /* simpasm: header-end */ @@ -335,5 +336,6 @@ rej_uniform_eta2_final_copy: #undef MLD_STACK_SIZE /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 2) */ diff --git a/dev/aarch64_clean/src/rej_uniform_eta4_asm.S b/dev/aarch64_clean/src/rej_uniform_eta4_asm.S index 9ade1938f..158bf6cd4 100644 --- a/dev/aarch64_clean/src/rej_uniform_eta4_asm.S +++ b/dev/aarch64_clean/src/rej_uniform_eta4_asm.S @@ -6,6 +6,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_AARCH64) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 4) /* simpasm: header-end */ @@ -312,5 +313,6 @@ rej_uniform_eta4_final_copy: #undef MLD_STACK_SIZE /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4) */ diff --git a/dev/aarch64_clean/src/rej_uniform_eta_table.c b/dev/aarch64_clean/src/rej_uniform_eta_table.c index 13ce6df66..395e99cc0 100644 --- a/dev/aarch64_clean/src/rej_uniform_eta_table.c +++ b/dev/aarch64_clean/src/rej_uniform_eta_table.c @@ -11,7 +11,8 @@ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) #include "arith_native_aarch64.h" @@ -536,8 +537,10 @@ MLD_ALIGN const uint8_t mld_rej_uniform_eta_table[] = { 8, 9, 10, 11, 12, 13, 14, 15 /* 255 */, }; -#else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ +#else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED */ MLD_EMPTY_CU(aarch64_rej_uniform_eta_table) -#endif /* !(MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED) */ +#endif /* !(MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED) */ diff --git a/dev/aarch64_opt/meta.h b/dev/aarch64_opt/meta.h index 2923b8c55..8543ab5ab 100644 --- a/dev/aarch64_opt/meta.h +++ b/dev/aarch64_opt/meta.h @@ -66,6 +66,7 @@ static MLD_INLINE int mld_rej_uniform_native(int32_t *r, unsigned len, return (int)mld_rej_uniform_asm(r, buf, buflen, mld_rej_uniform_table); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 2 MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_rej_uniform_eta2_native(int32_t *r, unsigned len, @@ -119,6 +120,7 @@ static MLD_INLINE int mld_rej_uniform_eta4_native(int32_t *r, unsigned len, return (int)outlen; } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4 */ +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) diff --git a/dev/aarch64_opt/src/arith_native_aarch64.h b/dev/aarch64_opt/src/arith_native_aarch64.h index f372b3020..88f277f04 100644 --- a/dev/aarch64_opt/src/arith_native_aarch64.h +++ b/dev/aarch64_opt/src/arith_native_aarch64.h @@ -26,8 +26,10 @@ extern const int32_t mld_aarch64_intt_zetas_layer123456[]; #define mld_rej_uniform_table MLD_NAMESPACE(rej_uniform_table) extern const uint8_t mld_rej_uniform_table[]; +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_rej_uniform_eta_table MLD_NAMESPACE(rej_uniform_eta_table) extern const uint8_t mld_rej_uniform_eta_table[]; +#endif #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 #define mld_polyz_unpack_17_indices MLD_NAMESPACE(polyz_unpack_17_indices) @@ -65,6 +67,7 @@ MLD_MUST_CHECK_RETURN_VALUE uint64_t mld_rej_uniform_asm(int32_t *r, const uint8_t *buf, unsigned buflen, const uint8_t *table); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_rej_uniform_eta2_asm MLD_NAMESPACE(rej_uniform_eta2_asm) MLD_MUST_CHECK_RETURN_VALUE uint64_t mld_rej_uniform_eta2_asm(int32_t *r, const uint8_t *buf, @@ -74,6 +77,7 @@ uint64_t mld_rej_uniform_eta2_asm(int32_t *r, const uint8_t *buf, MLD_MUST_CHECK_RETURN_VALUE uint64_t mld_rej_uniform_eta4_asm(int32_t *r, const uint8_t *buf, unsigned buflen, const uint8_t *table); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #define mld_poly_decompose_32_asm MLD_NAMESPACE(poly_decompose_32_asm) void mld_poly_decompose_32_asm(int32_t *a1, int32_t *a0); diff --git a/dev/aarch64_opt/src/rej_uniform_eta2_asm.S b/dev/aarch64_opt/src/rej_uniform_eta2_asm.S index c7c84b1ca..687c04bf4 100644 --- a/dev/aarch64_opt/src/rej_uniform_eta2_asm.S +++ b/dev/aarch64_opt/src/rej_uniform_eta2_asm.S @@ -6,6 +6,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_AARCH64) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 2) /* simpasm: header-end */ @@ -335,5 +336,6 @@ rej_uniform_eta2_final_copy: #undef MLD_STACK_SIZE /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 2) */ diff --git a/dev/aarch64_opt/src/rej_uniform_eta4_asm.S b/dev/aarch64_opt/src/rej_uniform_eta4_asm.S index 9ade1938f..158bf6cd4 100644 --- a/dev/aarch64_opt/src/rej_uniform_eta4_asm.S +++ b/dev/aarch64_opt/src/rej_uniform_eta4_asm.S @@ -6,6 +6,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_AARCH64) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 4) /* simpasm: header-end */ @@ -312,5 +313,6 @@ rej_uniform_eta4_final_copy: #undef MLD_STACK_SIZE /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4) */ diff --git a/dev/aarch64_opt/src/rej_uniform_eta_table.c b/dev/aarch64_opt/src/rej_uniform_eta_table.c index 13ce6df66..395e99cc0 100644 --- a/dev/aarch64_opt/src/rej_uniform_eta_table.c +++ b/dev/aarch64_opt/src/rej_uniform_eta_table.c @@ -11,7 +11,8 @@ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) #include "arith_native_aarch64.h" @@ -536,8 +537,10 @@ MLD_ALIGN const uint8_t mld_rej_uniform_eta_table[] = { 8, 9, 10, 11, 12, 13, 14, 15 /* 255 */, }; -#else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ +#else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED */ MLD_EMPTY_CU(aarch64_rej_uniform_eta_table) -#endif /* !(MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED) */ +#endif /* !(MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED) */ diff --git a/dev/x86_64/meta.h b/dev/x86_64/meta.h index 9e45b661e..2a6b2447d 100644 --- a/dev/x86_64/meta.h +++ b/dev/x86_64/meta.h @@ -83,6 +83,7 @@ static MLD_INLINE int mld_rej_uniform_native(int32_t *r, unsigned len, return (int)mld_rej_uniform_avx2(r, buf); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 2 MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_rej_uniform_eta2_native(int32_t *r, unsigned len, @@ -140,6 +141,7 @@ static MLD_INLINE int mld_rej_uniform_eta4_native(int32_t *r, unsigned len, return (int)outlen; } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4 */ +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) diff --git a/dev/x86_64/src/arith_native_x86_64.h b/dev/x86_64/src/arith_native_x86_64.h index 956a6e541..62c18813e 100644 --- a/dev/x86_64/src/arith_native_x86_64.h +++ b/dev/x86_64/src/arith_native_x86_64.h @@ -67,6 +67,7 @@ MLD_MUST_CHECK_RETURN_VALUE unsigned mld_rej_uniform_avx2(int32_t *r, const uint8_t buf[MLD_AVX2_REJ_UNIFORM_BUFLEN]); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_rej_uniform_eta2_avx2 MLD_NAMESPACE(mld_rej_uniform_eta2_avx2) MLD_MUST_CHECK_RETURN_VALUE unsigned mld_rej_uniform_eta2_avx2( @@ -76,6 +77,7 @@ unsigned mld_rej_uniform_eta2_avx2( MLD_MUST_CHECK_RETURN_VALUE unsigned mld_rej_uniform_eta4_avx2( int32_t *r, const uint8_t buf[MLD_AVX2_REJ_UNIFORM_ETA4_BUFLEN]); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #define mld_poly_decompose_32_avx2 MLD_NAMESPACE(mld_poly_decompose_32_avx2) void mld_poly_decompose_32_avx2(int32_t *a1, int32_t *a0); diff --git a/dev/x86_64/src/rej_uniform_eta2_avx2.c b/dev/x86_64/src/rej_uniform_eta2_avx2.c index b763d403b..dac73995b 100644 --- a/dev/x86_64/src/rej_uniform_eta2_avx2.c +++ b/dev/x86_64/src/rej_uniform_eta2_avx2.c @@ -20,6 +20,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 2) @@ -141,13 +142,14 @@ unsigned int mld_rej_uniform_eta2_avx2( return ctr; } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 2) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 2) */ MLD_EMPTY_CU(avx2_rej_uniform_eta2) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ - !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 2)) */ /* To facilitate single-compilation-unit (SCU) builds, undefine all macros. diff --git a/dev/x86_64/src/rej_uniform_eta4_avx2.c b/dev/x86_64/src/rej_uniform_eta4_avx2.c index 9ae716437..6f41486d2 100644 --- a/dev/x86_64/src/rej_uniform_eta4_avx2.c +++ b/dev/x86_64/src/rej_uniform_eta4_avx2.c @@ -20,6 +20,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 4) @@ -125,13 +126,14 @@ unsigned int mld_rej_uniform_eta4_avx2( return ctr; } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4) */ MLD_EMPTY_CU(avx2_rej_uniform_eta4) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ - !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4)) */ /* To facilitate single-compilation-unit (SCU) builds, undefine all macros. diff --git a/examples/basic_deterministic/mldsa_native/mldsa_native_config.h b/examples/basic_deterministic/mldsa_native/mldsa_native_config.h index a17df9b47..945b325f7 100644 --- a/examples/basic_deterministic/mldsa_native/mldsa_native_config.h +++ b/examples/basic_deterministic/mldsa_native/mldsa_native_config.h @@ -127,6 +127,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/basic_lowram/mldsa_native/mldsa_native_config.h b/examples/basic_lowram/mldsa_native/mldsa_native_config.h index c2993903f..8789f23de 100644 --- a/examples/basic_lowram/mldsa_native/mldsa_native_config.h +++ b/examples/basic_lowram/mldsa_native/mldsa_native_config.h @@ -126,6 +126,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h b/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h index ab4bed70d..3ee1ec05e 100644 --- a/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h +++ b/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h @@ -127,6 +127,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h b/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h index 05b726a43..8dd5e9a1c 100644 --- a/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h +++ b/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h @@ -128,6 +128,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/custom_backend/mldsa_native/mldsa_native_config.h b/examples/custom_backend/mldsa_native/mldsa_native_config.h index 1ca99a0f2..1182a9fd1 100644 --- a/examples/custom_backend/mldsa_native/mldsa_native_config.h +++ b/examples/custom_backend/mldsa_native/mldsa_native_config.h @@ -129,6 +129,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build/mldsa_native/mldsa_native_config.h b/examples/monolithic_build/mldsa_native/mldsa_native_config.h index a8ccf0dc5..bd4da7067 100644 --- a/examples/monolithic_build/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build/mldsa_native/mldsa_native_config.h @@ -126,6 +126,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h b/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h index 1f5f2ba64..ef939b8d6 100644 --- a/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h @@ -128,6 +128,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h b/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h index 80052d3f1..c4d140922 100644 --- a/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h @@ -132,6 +132,18 @@ *****************************************************************************/ #define MLD_CONFIG_EXTERNAL_API_QUALIFIER static +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h b/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h index cd9c692c9..ae589df76 100644 --- a/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h @@ -126,6 +126,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/multilevel_build/mldsa_native/mldsa_native_config.h b/examples/multilevel_build/mldsa_native/mldsa_native_config.h index 39a100819..ef07d6528 100644 --- a/examples/multilevel_build/mldsa_native/mldsa_native_config.h +++ b/examples/multilevel_build/mldsa_native/mldsa_native_config.h @@ -127,6 +127,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h b/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h index 71b8161b5..844f768fa 100644 --- a/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h +++ b/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h @@ -129,6 +129,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/mldsa/mldsa_native.h b/mldsa/mldsa_native.h index fd150a9df..87867164a 100644 --- a/mldsa/mldsa_native.h +++ b/mldsa/mldsa_native.h @@ -205,6 +205,7 @@ extern "C" { #endif +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) /************************************************* * Name: crypto_sign_keypair_internal * @@ -276,6 +277,7 @@ int MLD_API_NAMESPACE(keypair)( MLD_CONFIG_CONTEXT_PARAMETER_TYPE context #endif ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ /************************************************* * Name: crypto_sign_signature_internal @@ -815,6 +817,7 @@ size_t MLD_API_NAMESPACE(prepare_domain_separation_prefix)( uint8_t prefix[MLD_DOMAIN_SEPARATION_MAX_BYTES], const uint8_t *ph, size_t phlen, const uint8_t *ctx, size_t ctxlen, int hashalg); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) /************************************************* * Name: crypto_sign_pk_from_sk * @@ -850,6 +853,7 @@ int MLD_API_NAMESPACE(pk_from_sk)( MLD_CONFIG_CONTEXT_PARAMETER_TYPE context #endif ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #ifdef __cplusplus } diff --git a/mldsa/mldsa_native_config.h b/mldsa/mldsa_native_config.h index 25dc88771..fd171c93f 100644 --- a/mldsa/mldsa_native_config.h +++ b/mldsa/mldsa_native_config.h @@ -111,6 +111,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/mldsa/src/native/aarch64/meta.h b/mldsa/src/native/aarch64/meta.h index 2923b8c55..8543ab5ab 100644 --- a/mldsa/src/native/aarch64/meta.h +++ b/mldsa/src/native/aarch64/meta.h @@ -66,6 +66,7 @@ static MLD_INLINE int mld_rej_uniform_native(int32_t *r, unsigned len, return (int)mld_rej_uniform_asm(r, buf, buflen, mld_rej_uniform_table); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 2 MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_rej_uniform_eta2_native(int32_t *r, unsigned len, @@ -119,6 +120,7 @@ static MLD_INLINE int mld_rej_uniform_eta4_native(int32_t *r, unsigned len, return (int)outlen; } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4 */ +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) diff --git a/mldsa/src/native/aarch64/src/arith_native_aarch64.h b/mldsa/src/native/aarch64/src/arith_native_aarch64.h index f372b3020..88f277f04 100644 --- a/mldsa/src/native/aarch64/src/arith_native_aarch64.h +++ b/mldsa/src/native/aarch64/src/arith_native_aarch64.h @@ -26,8 +26,10 @@ extern const int32_t mld_aarch64_intt_zetas_layer123456[]; #define mld_rej_uniform_table MLD_NAMESPACE(rej_uniform_table) extern const uint8_t mld_rej_uniform_table[]; +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_rej_uniform_eta_table MLD_NAMESPACE(rej_uniform_eta_table) extern const uint8_t mld_rej_uniform_eta_table[]; +#endif #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 #define mld_polyz_unpack_17_indices MLD_NAMESPACE(polyz_unpack_17_indices) @@ -65,6 +67,7 @@ MLD_MUST_CHECK_RETURN_VALUE uint64_t mld_rej_uniform_asm(int32_t *r, const uint8_t *buf, unsigned buflen, const uint8_t *table); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_rej_uniform_eta2_asm MLD_NAMESPACE(rej_uniform_eta2_asm) MLD_MUST_CHECK_RETURN_VALUE uint64_t mld_rej_uniform_eta2_asm(int32_t *r, const uint8_t *buf, @@ -74,6 +77,7 @@ uint64_t mld_rej_uniform_eta2_asm(int32_t *r, const uint8_t *buf, MLD_MUST_CHECK_RETURN_VALUE uint64_t mld_rej_uniform_eta4_asm(int32_t *r, const uint8_t *buf, unsigned buflen, const uint8_t *table); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #define mld_poly_decompose_32_asm MLD_NAMESPACE(poly_decompose_32_asm) void mld_poly_decompose_32_asm(int32_t *a1, int32_t *a0); diff --git a/mldsa/src/native/aarch64/src/rej_uniform_eta2_asm.S b/mldsa/src/native/aarch64/src/rej_uniform_eta2_asm.S index eecfb2d6e..f8e1793a8 100644 --- a/mldsa/src/native/aarch64/src/rej_uniform_eta2_asm.S +++ b/mldsa/src/native/aarch64/src/rej_uniform_eta2_asm.S @@ -6,6 +6,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_AARCH64) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 2) @@ -131,5 +132,6 @@ Lrej_uniform_eta2_final_copy: MLD_ASM_FN_SIZE(rej_uniform_eta2_asm) -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 2) */ diff --git a/mldsa/src/native/aarch64/src/rej_uniform_eta4_asm.S b/mldsa/src/native/aarch64/src/rej_uniform_eta4_asm.S index caa89e273..e9206a41a 100644 --- a/mldsa/src/native/aarch64/src/rej_uniform_eta4_asm.S +++ b/mldsa/src/native/aarch64/src/rej_uniform_eta4_asm.S @@ -6,6 +6,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_AARCH64) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 4) @@ -124,5 +125,6 @@ Lrej_uniform_eta4_final_copy: MLD_ASM_FN_SIZE(rej_uniform_eta4_asm) -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4) */ diff --git a/mldsa/src/native/aarch64/src/rej_uniform_eta_table.c b/mldsa/src/native/aarch64/src/rej_uniform_eta_table.c index 13ce6df66..395e99cc0 100644 --- a/mldsa/src/native/aarch64/src/rej_uniform_eta_table.c +++ b/mldsa/src/native/aarch64/src/rej_uniform_eta_table.c @@ -11,7 +11,8 @@ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) #include "arith_native_aarch64.h" @@ -536,8 +537,10 @@ MLD_ALIGN const uint8_t mld_rej_uniform_eta_table[] = { 8, 9, 10, 11, 12, 13, 14, 15 /* 255 */, }; -#else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ +#else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED */ MLD_EMPTY_CU(aarch64_rej_uniform_eta_table) -#endif /* !(MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED) */ +#endif /* !(MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED) */ diff --git a/mldsa/src/native/api.h b/mldsa/src/native/api.h index f7faf5b45..0a41534b1 100644 --- a/mldsa/src/native/api.h +++ b/mldsa/src/native/api.h @@ -193,6 +193,7 @@ __contract__( ); #endif /* MLD_USE_NATIVE_REJ_UNIFORM */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #if defined(MLD_USE_NATIVE_REJ_UNIFORM_ETA2) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 2 /************************************************* @@ -262,6 +263,7 @@ __contract__( ); #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4 */ #endif /* MLD_USE_NATIVE_REJ_UNIFORM_ETA4 */ +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #if defined(MLD_USE_NATIVE_POLY_DECOMPOSE_32) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ diff --git a/mldsa/src/native/x86_64/meta.h b/mldsa/src/native/x86_64/meta.h index 9e45b661e..2a6b2447d 100644 --- a/mldsa/src/native/x86_64/meta.h +++ b/mldsa/src/native/x86_64/meta.h @@ -83,6 +83,7 @@ static MLD_INLINE int mld_rej_uniform_native(int32_t *r, unsigned len, return (int)mld_rej_uniform_avx2(r, buf); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 2 MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_rej_uniform_eta2_native(int32_t *r, unsigned len, @@ -140,6 +141,7 @@ static MLD_INLINE int mld_rej_uniform_eta4_native(int32_t *r, unsigned len, return (int)outlen; } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4 */ +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) diff --git a/mldsa/src/native/x86_64/src/arith_native_x86_64.h b/mldsa/src/native/x86_64/src/arith_native_x86_64.h index 956a6e541..62c18813e 100644 --- a/mldsa/src/native/x86_64/src/arith_native_x86_64.h +++ b/mldsa/src/native/x86_64/src/arith_native_x86_64.h @@ -67,6 +67,7 @@ MLD_MUST_CHECK_RETURN_VALUE unsigned mld_rej_uniform_avx2(int32_t *r, const uint8_t buf[MLD_AVX2_REJ_UNIFORM_BUFLEN]); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_rej_uniform_eta2_avx2 MLD_NAMESPACE(mld_rej_uniform_eta2_avx2) MLD_MUST_CHECK_RETURN_VALUE unsigned mld_rej_uniform_eta2_avx2( @@ -76,6 +77,7 @@ unsigned mld_rej_uniform_eta2_avx2( MLD_MUST_CHECK_RETURN_VALUE unsigned mld_rej_uniform_eta4_avx2( int32_t *r, const uint8_t buf[MLD_AVX2_REJ_UNIFORM_ETA4_BUFLEN]); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #define mld_poly_decompose_32_avx2 MLD_NAMESPACE(mld_poly_decompose_32_avx2) void mld_poly_decompose_32_avx2(int32_t *a1, int32_t *a0); diff --git a/mldsa/src/native/x86_64/src/rej_uniform_eta2_avx2.c b/mldsa/src/native/x86_64/src/rej_uniform_eta2_avx2.c index b763d403b..dac73995b 100644 --- a/mldsa/src/native/x86_64/src/rej_uniform_eta2_avx2.c +++ b/mldsa/src/native/x86_64/src/rej_uniform_eta2_avx2.c @@ -20,6 +20,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 2) @@ -141,13 +142,14 @@ unsigned int mld_rej_uniform_eta2_avx2( return ctr; } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 2) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 2) */ MLD_EMPTY_CU(avx2_rej_uniform_eta2) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ - !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 2)) */ /* To facilitate single-compilation-unit (SCU) builds, undefine all macros. diff --git a/mldsa/src/native/x86_64/src/rej_uniform_eta4_avx2.c b/mldsa/src/native/x86_64/src/rej_uniform_eta4_avx2.c index 9ae716437..6f41486d2 100644 --- a/mldsa/src/native/x86_64/src/rej_uniform_eta4_avx2.c +++ b/mldsa/src/native/x86_64/src/rej_uniform_eta4_avx2.c @@ -20,6 +20,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + !defined(MLD_CONFIG_NO_KEYPAIR_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_ETA == 4) @@ -125,13 +126,14 @@ unsigned int mld_rej_uniform_eta4_avx2( return ctr; } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4) */ MLD_EMPTY_CU(avx2_rej_uniform_eta4) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ - !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_KEYPAIR_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4)) */ /* To facilitate single-compilation-unit (SCU) builds, undefine all macros. diff --git a/mldsa/src/packing.c b/mldsa/src/packing.c index 7add516ce..c14e541aa 100644 --- a/mldsa/src/packing.c +++ b/mldsa/src/packing.c @@ -16,6 +16,7 @@ #define mld_unpack_hints MLD_ADD_PARAM_SET(mld_unpack_hints) /* End of parameter set namespacing */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API void mld_pack_pk(uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES], const uint8_t rho[MLDSA_SEEDBYTES], const mld_polyveck *t1) @@ -34,6 +35,7 @@ void mld_pack_pk(uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES], &t1->vec[i]); } } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ MLD_INTERNAL_API void mld_unpack_pk(uint8_t rho[MLDSA_SEEDBYTES], mld_polyveck *t1, @@ -50,6 +52,7 @@ void mld_unpack_pk(uint8_t rho[MLDSA_SEEDBYTES], mld_polyveck *t1, } } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API void mld_pack_sk(uint8_t sk[MLDSA_CRYPTO_SECRETKEYBYTES], const uint8_t rho[MLDSA_SEEDBYTES], @@ -74,6 +77,7 @@ void mld_pack_sk(uint8_t sk[MLDSA_CRYPTO_SECRETKEYBYTES], mld_polyveck_pack_t0(sk, t0); } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ MLD_INTERNAL_API void mld_unpack_sk(uint8_t rho[MLDSA_SEEDBYTES], uint8_t tr[MLDSA_TRBYTES], diff --git a/mldsa/src/packing.h b/mldsa/src/packing.h index 576577277..ad86fd661 100644 --- a/mldsa/src/packing.h +++ b/mldsa/src/packing.h @@ -7,6 +7,7 @@ #include "polyvec.h" +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_pack_pk MLD_NAMESPACE_KL(pack_pk) /************************************************* * Name: mld_pack_pk @@ -66,6 +67,7 @@ __contract__( array_abs_bound(s2->vec[k2].coeffs, 0, MLDSA_N, MLDSA_ETA + 1))) assigns(memory_slice(sk, MLDSA_CRYPTO_SECRETKEYBYTES)) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #define mld_pack_sig_c_h MLD_NAMESPACE_KL(pack_sig_c_h) diff --git a/mldsa/src/poly.c b/mldsa/src/poly.c index b7609fc37..d430e79e5 100644 --- a/mldsa/src/poly.c +++ b/mldsa/src/poly.c @@ -498,6 +498,7 @@ void mld_poly_pointwise_montgomery(mld_poly *c, const mld_poly *a, mld_poly_pointwise_montgomery_c(c, a, b); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API void mld_poly_power2round(mld_poly *a1, mld_poly *a0, const mld_poly *a) { @@ -520,6 +521,7 @@ void mld_poly_power2round(mld_poly *a1, mld_poly *a0, const mld_poly *a) (MLD_2_POW_D / 2) + 1); mld_assert_bound(a1->coeffs, MLDSA_N, 0, ((MLDSA_Q - 1) / MLD_2_POW_D) + 1); } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #ifndef MLD_POLY_UNIFORM_NBLOCKS #define MLD_POLY_UNIFORM_NBLOCKS \ @@ -737,6 +739,7 @@ void mld_poly_uniform_4x(mld_poly *vec0, mld_poly *vec1, mld_poly *vec2, #endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY && !MLD_CONFIG_REDUCE_RAM */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API void mld_polyt1_pack(uint8_t r[MLDSA_POLYT1_PACKEDBYTES], const mld_poly *a) { @@ -761,6 +764,7 @@ void mld_polyt1_pack(uint8_t r[MLDSA_POLYT1_PACKEDBYTES], const mld_poly *a) r[5 * i + 4] = (uint8_t)((a->coeffs[4 * i + 3] >> 2) & 0xFF); } } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ MLD_INTERNAL_API void mld_polyt1_unpack(mld_poly *r, const uint8_t a[MLDSA_POLYT1_PACKEDBYTES]) @@ -786,6 +790,7 @@ void mld_polyt1_unpack(mld_poly *r, const uint8_t a[MLDSA_POLYT1_PACKEDBYTES]) mld_assert_bound(r->coeffs, MLDSA_N, 0, 1 << 10); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API void mld_polyt0_pack(uint8_t r[MLDSA_POLYT0_PACKEDBYTES], const mld_poly *a) { @@ -833,6 +838,7 @@ void mld_polyt0_pack(uint8_t r[MLDSA_POLYT0_PACKEDBYTES], const mld_poly *a) r[13 * i + 12] = (uint8_t)((t[7] >> 5) & 0xFF); } } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ MLD_INTERNAL_API void mld_polyt0_unpack(mld_poly *r, const uint8_t a[MLDSA_POLYT0_PACKEDBYTES]) diff --git a/mldsa/src/poly.h b/mldsa/src/poly.h index 17f54f980..be1fcc1c3 100644 --- a/mldsa/src/poly.h +++ b/mldsa/src/poly.h @@ -193,6 +193,7 @@ __contract__( ensures(array_abs_bound(c->coeffs, 0, MLDSA_N, MLDSA_Q)) ); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_poly_power2round MLD_NAMESPACE(poly_power2round) /************************************************* * Name: mld_poly_power2round @@ -220,6 +221,7 @@ __contract__( ensures(array_bound(a0->coeffs, 0, MLDSA_N, -(MLD_2_POW_D/2)+1, (MLD_2_POW_D/2)+1)) ensures(array_bound(a1->coeffs, 0, MLDSA_N, 0, ((MLDSA_Q - 1) / MLD_2_POW_D) + 1)) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #define mld_poly_uniform MLD_NAMESPACE(poly_uniform) /************************************************* @@ -278,6 +280,7 @@ __contract__( ); #endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY && !MLD_CONFIG_REDUCE_RAM */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_polyt1_pack MLD_NAMESPACE(polyt1_pack) /************************************************* * Name: mld_polyt1_pack @@ -297,6 +300,7 @@ __contract__( requires(array_bound(a->coeffs, 0, MLDSA_N, 0, 1 << 10)) assigns(memory_slice(r, MLDSA_POLYT1_PACKEDBYTES)) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #define mld_polyt1_unpack MLD_NAMESPACE(polyt1_unpack) /************************************************* @@ -317,6 +321,7 @@ __contract__( ensures(array_bound(r->coeffs, 0, MLDSA_N, 0, 1 << 10)) ); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_polyt0_pack MLD_NAMESPACE(polyt0_pack) /************************************************* * Name: mld_polyt0_pack @@ -336,6 +341,7 @@ __contract__( requires(array_bound(a->coeffs, 0, MLDSA_N, -(1<<(MLDSA_D-1)) + 1, (1<<(MLDSA_D-1)) + 1)) assigns(memory_slice(r, MLDSA_POLYT0_PACKEDBYTES)) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #define mld_polyt0_unpack MLD_NAMESPACE(polyt0_unpack) diff --git a/mldsa/src/poly_kl.c b/mldsa/src/poly_kl.c index 84ae53a7e..eb9654b78 100644 --- a/mldsa/src/poly_kl.c +++ b/mldsa/src/poly_kl.c @@ -182,6 +182,7 @@ void mld_poly_use_hint(mld_poly *b, const mld_poly *a, const mld_poly *h) mld_poly_use_hint_c(b, a, h); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) /************************************************* * Name: mld_rej_eta * @@ -485,6 +486,7 @@ void mld_poly_uniform_eta(mld_poly *r, const uint8_t seed[MLDSA_CRHBYTES], mld_zeroize(extseed, sizeof(extseed)); } #endif /* MLD_CONFIG_SERIAL_FIPS202_ONLY */ +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #define MLD_POLY_UNIFORM_GAMMA1_NBLOCKS \ ((MLDSA_POLYZ_PACKEDBYTES + MLD_STREAM256_BLOCKBYTES - 1) / \ @@ -655,6 +657,7 @@ void mld_poly_challenge(mld_poly *c, const uint8_t seed[MLDSA_CTILDEBYTES]) mld_zeroize(&signs, sizeof(signs)); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API void mld_polyeta_pack(uint8_t r[MLDSA_POLYETA_PACKEDBYTES], const mld_poly *a) { @@ -702,6 +705,7 @@ void mld_polyeta_pack(uint8_t r[MLDSA_POLYETA_PACKEDBYTES], const mld_poly *a) #error "Invalid value of MLDSA_ETA" #endif /* MLDSA_ETA != 2 && MLDSA_ETA != 4 */ } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ void mld_polyeta_unpack(mld_poly *r, const uint8_t a[MLDSA_POLYETA_PACKEDBYTES]) { diff --git a/mldsa/src/poly_kl.h b/mldsa/src/poly_kl.h index a7c71707d..06dbcca1d 100644 --- a/mldsa/src/poly_kl.h +++ b/mldsa/src/poly_kl.h @@ -93,6 +93,7 @@ __contract__( ensures(array_bound(b->coeffs, 0, MLDSA_N, 0, (MLDSA_Q-1)/(2*MLDSA_GAMMA2))) ); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) #define mld_poly_uniform_eta_4x MLD_NAMESPACE_KL(poly_uniform_eta_4x) /************************************************* @@ -159,6 +160,7 @@ __contract__( ensures(array_abs_bound(r->coeffs, 0, MLDSA_N, MLDSA_ETA + 1)) ); #endif /* MLD_CONFIG_SERIAL_FIPS202_ONLY */ +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #if MLD_CONFIG_PARAMETER_SET == 65 || defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) #define mld_poly_uniform_gamma1 MLD_NAMESPACE_KL(poly_uniform_gamma1) @@ -244,6 +246,7 @@ __contract__( ensures(array_bound(c->coeffs, 0, MLDSA_N, -1, 2)) ); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_polyeta_pack MLD_NAMESPACE_KL(polyeta_pack) /************************************************* * Name: mld_polyeta_pack @@ -262,6 +265,7 @@ __contract__( requires(array_abs_bound(a->coeffs, 0, MLDSA_N, MLDSA_ETA + 1)) assigns(memory_slice(r, MLDSA_POLYETA_PACKEDBYTES)) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ /* * polyeta_unpack produces coefficients in [-MLDSA_ETA,MLDSA_ETA] for diff --git a/mldsa/src/polyvec.c b/mldsa/src/polyvec.c index 10d0d76c2..3617bbcb1 100644 --- a/mldsa/src/polyvec.c +++ b/mldsa/src/polyvec.c @@ -644,6 +644,7 @@ uint32_t mld_polyveck_chknorm(const mld_polyveck *v, int32_t bound) return t; } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API void mld_polyveck_power2round(mld_polyveck *v1, mld_polyveck *v0, const mld_polyveck *v) @@ -668,6 +669,7 @@ void mld_polyveck_power2round(mld_polyveck *v1, mld_polyveck *v0, mld_assert_bound_2d(v1->vec, MLDSA_K, MLDSA_N, 0, ((MLDSA_Q - 1) / MLD_2_POW_D) + 1); } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ MLD_INTERNAL_API void mld_polyveck_decompose(mld_polyveck *v1, mld_polyveck *v0) @@ -762,6 +764,7 @@ void mld_polyveck_pack_w1(uint8_t r[MLDSA_K * MLDSA_POLYW1_PACKEDBYTES], } } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API void mld_polyveck_pack_eta(uint8_t r[MLDSA_K * MLDSA_POLYETA_PACKEDBYTES], const mld_polyveck *p) @@ -813,6 +816,7 @@ void mld_polyveck_pack_t0(uint8_t r[MLDSA_K * MLDSA_POLYT0_PACKEDBYTES], mld_polyt0_pack(&r[i * MLDSA_POLYT0_PACKEDBYTES], &p->vec[i]); } } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ MLD_INTERNAL_API void mld_polyvecl_unpack_eta( diff --git a/mldsa/src/polyvec.h b/mldsa/src/polyvec.h index 043ac1ad7..a39c17e98 100644 --- a/mldsa/src/polyvec.h +++ b/mldsa/src/polyvec.h @@ -348,6 +348,7 @@ __contract__( ensures((return_value == 0) == forall(k1, 0, MLDSA_K, array_abs_bound(v->vec[k1].coeffs, 0, MLDSA_N, B))) ); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_polyveck_power2round MLD_NAMESPACE_KL(polyveck_power2round) /************************************************* * Name: mld_polyveck_power2round @@ -376,6 +377,7 @@ __contract__( ensures(forall(k1, 0, MLDSA_K, array_bound(v0->vec[k1].coeffs, 0, MLDSA_N, -(MLD_2_POW_D/2)+1, (MLD_2_POW_D/2)+1))) ensures(forall(k2, 0, MLDSA_K, array_bound(v1->vec[k2].coeffs, 0, MLDSA_N, 0, ((MLDSA_Q - 1) / MLD_2_POW_D) + 1))) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #define mld_polyveck_decompose MLD_NAMESPACE_KL(polyveck_decompose) /************************************************* @@ -488,6 +490,7 @@ __contract__( assigns(memory_slice(r, MLDSA_K * MLDSA_POLYW1_PACKEDBYTES)) ); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_polyveck_pack_eta MLD_NAMESPACE_KL(polyveck_pack_eta) /************************************************* * Name: mld_polyveck_pack_eta @@ -553,6 +556,7 @@ __contract__( array_bound(p->vec[k0].coeffs, 0, MLDSA_N, -(1<<(MLDSA_D-1)) + 1, (1<<(MLDSA_D-1)) + 1))) assigns(memory_slice(r, MLDSA_K * MLDSA_POLYT0_PACKEDBYTES)) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #define mld_polyvecl_unpack_eta MLD_NAMESPACE_KL(polyvecl_unpack_eta) /************************************************* diff --git a/mldsa/src/sign.c b/mldsa/src/sign.c index c307e7187..27b65932e 100644 --- a/mldsa/src/sign.c +++ b/mldsa/src/sign.c @@ -54,6 +54,7 @@ /* End of parameter set namespacing */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) static int mld_check_pct(uint8_t const pk[MLDSA_CRYPTO_PUBLICKEYBYTES], uint8_t const sk[MLDSA_CRYPTO_SECRETKEYBYTES], MLD_CONFIG_CONTEXT_PARAMETER_TYPE context) @@ -384,6 +385,7 @@ int mld_sign_keypair(uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES], return ret; } #endif /* !MLD_CONFIG_NO_RANDOMIZED_API */ +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ /************************************************* * Name: mld_H @@ -1422,6 +1424,7 @@ size_t mld_prepare_domain_separation_prefix( return 2 + ctxlen + MLD_PRE_HASH_OID_LEN + phlen; } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_EXTERNAL_API int mld_sign_pk_from_sk(uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES], const uint8_t sk[MLDSA_CRYPTO_SECRETKEYBYTES], @@ -1496,6 +1499,7 @@ int mld_sign_pk_from_sk(uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES], return ret; } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ /* To facilitate single-compilation-unit (SCU) builds, undefine all macros. * Don't modify by hand -- this is auto-generated by scripts/autogen. */ diff --git a/mldsa/src/sign.h b/mldsa/src/sign.h index ba8c9f5bd..2ff820fba 100644 --- a/mldsa/src/sign.h +++ b/mldsa/src/sign.h @@ -766,6 +766,7 @@ __contract__( ensures(return_value <= MLD_DOMAIN_SEPARATION_MAX_BYTES) ); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) /************************************************* * Name: mld_sign_pk_from_sk * @@ -803,4 +804,6 @@ __contract__( assigns(memory_slice(pk, MLDSA_CRYPTO_PUBLICKEYBYTES)) ensures(return_value == 0 || return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ + #endif /* !MLD_SIGN_H */ diff --git a/proofs/cbmc/mldsa_native_config_cbmc.h b/proofs/cbmc/mldsa_native_config_cbmc.h index 6267361d7..e358aa8dc 100644 --- a/proofs/cbmc/mldsa_native_config_cbmc.h +++ b/proofs/cbmc/mldsa_native_config_cbmc.h @@ -125,6 +125,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/break_pct_config.h b/test/configs/break_pct_config.h index e2e1014af..4cd106d72 100644 --- a/test/configs/break_pct_config.h +++ b/test/configs/break_pct_config.h @@ -127,6 +127,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_memcpy_config.h b/test/configs/custom_memcpy_config.h index d9065a3e6..a46728f33 100644 --- a/test/configs/custom_memcpy_config.h +++ b/test/configs/custom_memcpy_config.h @@ -126,6 +126,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_memset_config.h b/test/configs/custom_memset_config.h index b2c931139..0c842f047 100644 --- a/test/configs/custom_memset_config.h +++ b/test/configs/custom_memset_config.h @@ -126,6 +126,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_0.h b/test/configs/custom_native_capability_config_0.h index 1d08a7df6..20a2a1925 100644 --- a/test/configs/custom_native_capability_config_0.h +++ b/test/configs/custom_native_capability_config_0.h @@ -127,6 +127,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_1.h b/test/configs/custom_native_capability_config_1.h index 475e3bc7e..0f303720d 100644 --- a/test/configs/custom_native_capability_config_1.h +++ b/test/configs/custom_native_capability_config_1.h @@ -127,6 +127,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_CPUID_AVX2.h b/test/configs/custom_native_capability_config_CPUID_AVX2.h index bd040208a..31055cf96 100644 --- a/test/configs/custom_native_capability_config_CPUID_AVX2.h +++ b/test/configs/custom_native_capability_config_CPUID_AVX2.h @@ -127,6 +127,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h b/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h index dfc2c437a..7bf929b9e 100644 --- a/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h +++ b/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h @@ -127,6 +127,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_randombytes_config.h b/test/configs/custom_randombytes_config.h index fb87ed4c9..61b1f3164 100644 --- a/test/configs/custom_randombytes_config.h +++ b/test/configs/custom_randombytes_config.h @@ -126,6 +126,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_stdlib_config.h b/test/configs/custom_stdlib_config.h index 36c8eaf9d..5031374cf 100644 --- a/test/configs/custom_stdlib_config.h +++ b/test/configs/custom_stdlib_config.h @@ -127,6 +127,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_zeroize_config.h b/test/configs/custom_zeroize_config.h index 3102fd8ba..634d9643b 100644 --- a/test/configs/custom_zeroize_config.h +++ b/test/configs/custom_zeroize_config.h @@ -126,6 +126,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/no_asm_config.h b/test/configs/no_asm_config.h index 8127b4c3a..804d1f2ab 100644 --- a/test/configs/no_asm_config.h +++ b/test/configs/no_asm_config.h @@ -127,6 +127,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/serial_fips202_config.h b/test/configs/serial_fips202_config.h index 918575d2b..d640a6484 100644 --- a/test/configs/serial_fips202_config.h +++ b/test/configs/serial_fips202_config.h @@ -126,6 +126,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/test_alloc_config.h b/test/configs/test_alloc_config.h index 44e9cad80..14d6d851d 100644 --- a/test/configs/test_alloc_config.h +++ b/test/configs/test_alloc_config.h @@ -129,6 +129,18 @@ *****************************************************************************/ /* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_KEYPAIR_API + * + * Description: By default, mldsa-native includes support for generating key + * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API + * to exclude crypto_sign_keypair, crypto_sign_keypair_internal, + * crypto_sign_pk_from_sk, and all internal APIs only needed by + * those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_KEYPAIR_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * From 410a8ec600d08c5832143019af612440338ec8e1 Mon Sep 17 00:00:00 2001 From: Anders Sonmark Date: Mon, 9 Feb 2026 17:11:12 +0100 Subject: [PATCH 04/11] Add config to disable signature creation API Make it possible to exclude signature creation when not needed, together with all internal functions not needed for key generation or signature verification. Signed-off-by: Anders Sonmark --- dev/aarch64_clean/meta.h | 2 ++ dev/aarch64_clean/src/arith_native_aarch64.h | 2 ++ dev/aarch64_clean/src/poly_decompose_32_asm.S | 5 +++-- dev/aarch64_clean/src/poly_decompose_88_asm.S | 5 +++-- dev/aarch64_opt/meta.h | 2 ++ dev/aarch64_opt/src/arith_native_aarch64.h | 2 ++ dev/aarch64_opt/src/poly_decompose_32_asm.S | 5 +++-- dev/aarch64_opt/src/poly_decompose_88_asm.S | 5 +++-- dev/x86_64/meta.h | 3 ++- dev/x86_64/src/arith_native_x86_64.h | 2 ++ dev/x86_64/src/poly_decompose_32_avx2.c | 10 ++++++---- dev/x86_64/src/poly_decompose_88_avx2.c | 10 ++++++---- .../mldsa_native/mldsa_native_config.h | 14 ++++++++++++++ .../mldsa_native/mldsa_native_config.h | 14 ++++++++++++++ .../mldsa_native/mldsa_native_config.h | 14 ++++++++++++++ .../mldsa_native/mldsa_native_config.h | 14 ++++++++++++++ .../mldsa_native/mldsa_native_config.h | 14 ++++++++++++++ .../mldsa_native/mldsa_native_config.h | 14 ++++++++++++++ .../mldsa_native/mldsa_native_config.h | 14 ++++++++++++++ .../mldsa_native/mldsa_native_config.h | 14 ++++++++++++++ .../mldsa_native/mldsa_native_config.h | 14 ++++++++++++++ .../mldsa_native/mldsa_native_config.h | 14 ++++++++++++++ .../mldsa_native/mldsa_native_config.h | 14 ++++++++++++++ mldsa/mldsa_native.h | 6 ++++++ mldsa/mldsa_native_config.h | 15 +++++++++++++++ mldsa/src/native/aarch64/meta.h | 2 ++ .../src/native/aarch64/src/arith_native_aarch64.h | 2 ++ .../native/aarch64/src/poly_decompose_32_asm.S | 5 +++-- .../native/aarch64/src/poly_decompose_88_asm.S | 5 +++-- mldsa/src/native/api.h | 2 ++ mldsa/src/native/x86_64/meta.h | 3 ++- mldsa/src/native/x86_64/src/arith_native_x86_64.h | 2 ++ .../native/x86_64/src/poly_decompose_32_avx2.c | 10 ++++++---- .../native/x86_64/src/poly_decompose_88_avx2.c | 10 ++++++---- mldsa/src/packing.c | 2 ++ mldsa/src/packing.h | 3 ++- mldsa/src/poly_kl.c | 7 ++++++- mldsa/src/poly_kl.h | 7 ++++++- mldsa/src/polyvec.c | 4 ++++ mldsa/src/polyvec.h | 4 ++++ mldsa/src/sign.c | 7 ++++++- mldsa/src/sign.h | 8 ++++++++ proofs/cbmc/mldsa_native_config_cbmc.h | 14 ++++++++++++++ test/configs/break_pct_config.h | 14 ++++++++++++++ test/configs/custom_memcpy_config.h | 14 ++++++++++++++ test/configs/custom_memset_config.h | 14 ++++++++++++++ test/configs/custom_native_capability_config_0.h | 14 ++++++++++++++ test/configs/custom_native_capability_config_1.h | 14 ++++++++++++++ .../custom_native_capability_config_CPUID_AVX2.h | 14 ++++++++++++++ ...tom_native_capability_config_ID_AA64PFR1_EL1.h | 14 ++++++++++++++ test/configs/custom_randombytes_config.h | 14 ++++++++++++++ test/configs/custom_stdlib_config.h | 14 ++++++++++++++ test/configs/custom_zeroize_config.h | 14 ++++++++++++++ test/configs/no_asm_config.h | 14 ++++++++++++++ test/configs/serial_fips202_config.h | 14 ++++++++++++++ test/configs/test_alloc_config.h | 14 ++++++++++++++ 56 files changed, 473 insertions(+), 34 deletions(-) diff --git a/dev/aarch64_clean/meta.h b/dev/aarch64_clean/meta.h index 8543ab5ab..a5a56b140 100644 --- a/dev/aarch64_clean/meta.h +++ b/dev/aarch64_clean/meta.h @@ -122,6 +122,7 @@ static MLD_INLINE int mld_rej_uniform_eta4_native(int32_t *r, unsigned len, #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4 */ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_MUST_CHECK_RETURN_VALUE @@ -142,6 +143,7 @@ static MLD_INLINE int mld_poly_decompose_88_native(int32_t *a1, int32_t *a0) } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ */ +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_poly_caddq_native(int32_t a[MLDSA_N]) diff --git a/dev/aarch64_clean/src/arith_native_aarch64.h b/dev/aarch64_clean/src/arith_native_aarch64.h index 88f277f04..c17864251 100644 --- a/dev/aarch64_clean/src/arith_native_aarch64.h +++ b/dev/aarch64_clean/src/arith_native_aarch64.h @@ -79,11 +79,13 @@ uint64_t mld_rej_uniform_eta4_asm(int32_t *r, const uint8_t *buf, unsigned buflen, const uint8_t *table); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #define mld_poly_decompose_32_asm MLD_NAMESPACE(poly_decompose_32_asm) void mld_poly_decompose_32_asm(int32_t *a1, int32_t *a0); #define mld_poly_decompose_88_asm MLD_NAMESPACE(poly_decompose_88_asm) void mld_poly_decompose_88_asm(int32_t *a1, int32_t *a0); +#endif /* !MLD_CONFIG_NO_SIGN_API */ #define mld_poly_caddq_asm MLD_NAMESPACE(poly_caddq_asm) void mld_poly_caddq_asm(int32_t *a) diff --git a/dev/aarch64_clean/src/poly_decompose_32_asm.S b/dev/aarch64_clean/src/poly_decompose_32_asm.S index 15b50a751..70bbd1dd9 100644 --- a/dev/aarch64_clean/src/poly_decompose_32_asm.S +++ b/dev/aarch64_clean/src/poly_decompose_32_asm.S @@ -4,7 +4,7 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_NO_SIGN_API) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) /* simpasm: header-end */ @@ -137,6 +137,7 @@ poly_decompose_32_loop: .unreq gamma2_2x .unreq barrett_const /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_SIGN_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87) */ diff --git a/dev/aarch64_clean/src/poly_decompose_88_asm.S b/dev/aarch64_clean/src/poly_decompose_88_asm.S index a1167705b..90576b5aa 100644 --- a/dev/aarch64_clean/src/poly_decompose_88_asm.S +++ b/dev/aarch64_clean/src/poly_decompose_88_asm.S @@ -4,7 +4,7 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_NO_SIGN_API) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44) /* simpasm: header-end */ @@ -135,6 +135,7 @@ poly_decompose_88_loop: .unreq gamma2_2x .unreq barrett_const /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_SIGN_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ */ diff --git a/dev/aarch64_opt/meta.h b/dev/aarch64_opt/meta.h index 8543ab5ab..a5a56b140 100644 --- a/dev/aarch64_opt/meta.h +++ b/dev/aarch64_opt/meta.h @@ -122,6 +122,7 @@ static MLD_INLINE int mld_rej_uniform_eta4_native(int32_t *r, unsigned len, #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4 */ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_MUST_CHECK_RETURN_VALUE @@ -142,6 +143,7 @@ static MLD_INLINE int mld_poly_decompose_88_native(int32_t *a1, int32_t *a0) } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ */ +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_poly_caddq_native(int32_t a[MLDSA_N]) diff --git a/dev/aarch64_opt/src/arith_native_aarch64.h b/dev/aarch64_opt/src/arith_native_aarch64.h index 88f277f04..c17864251 100644 --- a/dev/aarch64_opt/src/arith_native_aarch64.h +++ b/dev/aarch64_opt/src/arith_native_aarch64.h @@ -79,11 +79,13 @@ uint64_t mld_rej_uniform_eta4_asm(int32_t *r, const uint8_t *buf, unsigned buflen, const uint8_t *table); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #define mld_poly_decompose_32_asm MLD_NAMESPACE(poly_decompose_32_asm) void mld_poly_decompose_32_asm(int32_t *a1, int32_t *a0); #define mld_poly_decompose_88_asm MLD_NAMESPACE(poly_decompose_88_asm) void mld_poly_decompose_88_asm(int32_t *a1, int32_t *a0); +#endif /* !MLD_CONFIG_NO_SIGN_API */ #define mld_poly_caddq_asm MLD_NAMESPACE(poly_caddq_asm) void mld_poly_caddq_asm(int32_t *a) diff --git a/dev/aarch64_opt/src/poly_decompose_32_asm.S b/dev/aarch64_opt/src/poly_decompose_32_asm.S index 1f5b16ebd..18c0a4d54 100644 --- a/dev/aarch64_opt/src/poly_decompose_32_asm.S +++ b/dev/aarch64_opt/src/poly_decompose_32_asm.S @@ -4,7 +4,7 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_NO_SIGN_API) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) /* simpasm: header-end */ @@ -108,6 +108,7 @@ poly_decompose_32_loop: .unreq gamma2_2x .unreq barrett_const /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_SIGN_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87) */ diff --git a/dev/aarch64_opt/src/poly_decompose_88_asm.S b/dev/aarch64_opt/src/poly_decompose_88_asm.S index ef569d445..bb92ca823 100644 --- a/dev/aarch64_opt/src/poly_decompose_88_asm.S +++ b/dev/aarch64_opt/src/poly_decompose_88_asm.S @@ -4,7 +4,7 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_NO_SIGN_API) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44) /* simpasm: header-end */ @@ -106,6 +106,7 @@ poly_decompose_88_loop: .unreq gamma2_2x .unreq barrett_const /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_SIGN_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ */ diff --git a/dev/x86_64/meta.h b/dev/x86_64/meta.h index 2a6b2447d..7e966cc55 100644 --- a/dev/x86_64/meta.h +++ b/dev/x86_64/meta.h @@ -143,6 +143,7 @@ static MLD_INLINE int mld_rej_uniform_eta4_native(int32_t *r, unsigned len, #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4 */ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_MUST_CHECK_RETURN_VALUE @@ -171,7 +172,7 @@ static MLD_INLINE int mld_poly_decompose_88_native(int32_t *a1, int32_t *a0) } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ */ - +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_poly_caddq_native(int32_t a[MLDSA_N]) diff --git a/dev/x86_64/src/arith_native_x86_64.h b/dev/x86_64/src/arith_native_x86_64.h index 62c18813e..68b7ad32c 100644 --- a/dev/x86_64/src/arith_native_x86_64.h +++ b/dev/x86_64/src/arith_native_x86_64.h @@ -79,11 +79,13 @@ unsigned mld_rej_uniform_eta4_avx2( int32_t *r, const uint8_t buf[MLD_AVX2_REJ_UNIFORM_ETA4_BUFLEN]); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #define mld_poly_decompose_32_avx2 MLD_NAMESPACE(mld_poly_decompose_32_avx2) void mld_poly_decompose_32_avx2(int32_t *a1, int32_t *a0); #define mld_poly_decompose_88_avx2 MLD_NAMESPACE(mld_poly_decompose_88_avx2) void mld_poly_decompose_88_avx2(int32_t *a1, int32_t *a0); +#endif /* !MLD_CONFIG_NO_SIGN_API */ #define mld_poly_caddq_avx2 MLD_NAMESPACE(poly_caddq_avx2) void mld_poly_caddq_avx2(int32_t *r); diff --git a/dev/x86_64/src/poly_decompose_32_avx2.c b/dev/x86_64/src/poly_decompose_32_avx2.c index 4bc584b1b..c97d0c729 100644 --- a/dev/x86_64/src/poly_decompose_32_avx2.c +++ b/dev/x86_64/src/poly_decompose_32_avx2.c @@ -24,6 +24,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + !defined(MLD_CONFIG_NO_SIGN_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) @@ -143,13 +144,14 @@ void mld_poly_decompose_32_avx2(int32_t *a1, int32_t *a0) } } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ - 65 || MLD_CONFIG_PARAMETER_SET == 87) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_SIGN_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ + || MLD_CONFIG_PARAMETER_SET == 87) */ MLD_EMPTY_CU(avx2_poly_decompose_32) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_SIGN_API && \ !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87)) */ diff --git a/dev/x86_64/src/poly_decompose_88_avx2.c b/dev/x86_64/src/poly_decompose_88_avx2.c index edb9114c8..d6a28d2d1 100644 --- a/dev/x86_64/src/poly_decompose_88_avx2.c +++ b/dev/x86_64/src/poly_decompose_88_avx2.c @@ -24,6 +24,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + !defined(MLD_CONFIG_NO_SIGN_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ MLD_CONFIG_PARAMETER_SET == 44) @@ -143,13 +144,14 @@ void mld_poly_decompose_88_avx2(int32_t *a1, int32_t *a0) _mm256_store_si256((__m256i *)&a0[8 * i], f0); } } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ - 44) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_SIGN_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ + */ MLD_EMPTY_CU(avx2_poly_decompose_88) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_SIGN_API && \ !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ 44)) */ diff --git a/examples/basic_deterministic/mldsa_native/mldsa_native_config.h b/examples/basic_deterministic/mldsa_native/mldsa_native_config.h index 945b325f7..299f6369c 100644 --- a/examples/basic_deterministic/mldsa_native/mldsa_native_config.h +++ b/examples/basic_deterministic/mldsa_native/mldsa_native_config.h @@ -139,6 +139,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/basic_lowram/mldsa_native/mldsa_native_config.h b/examples/basic_lowram/mldsa_native/mldsa_native_config.h index 8789f23de..6b050feb4 100644 --- a/examples/basic_lowram/mldsa_native/mldsa_native_config.h +++ b/examples/basic_lowram/mldsa_native/mldsa_native_config.h @@ -138,6 +138,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h b/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h index 3ee1ec05e..40f901f12 100644 --- a/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h +++ b/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h @@ -139,6 +139,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h b/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h index 8dd5e9a1c..cbd84aec9 100644 --- a/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h +++ b/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h @@ -140,6 +140,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/custom_backend/mldsa_native/mldsa_native_config.h b/examples/custom_backend/mldsa_native/mldsa_native_config.h index 1182a9fd1..66242cacf 100644 --- a/examples/custom_backend/mldsa_native/mldsa_native_config.h +++ b/examples/custom_backend/mldsa_native/mldsa_native_config.h @@ -141,6 +141,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build/mldsa_native/mldsa_native_config.h b/examples/monolithic_build/mldsa_native/mldsa_native_config.h index bd4da7067..9b9d8f8c5 100644 --- a/examples/monolithic_build/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build/mldsa_native/mldsa_native_config.h @@ -138,6 +138,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h b/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h index ef939b8d6..bc78e8441 100644 --- a/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h @@ -140,6 +140,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h b/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h index c4d140922..ee4d91876 100644 --- a/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h @@ -144,6 +144,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h b/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h index ae589df76..42a6fd9f6 100644 --- a/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h @@ -138,6 +138,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/multilevel_build/mldsa_native/mldsa_native_config.h b/examples/multilevel_build/mldsa_native/mldsa_native_config.h index ef07d6528..8532943cc 100644 --- a/examples/multilevel_build/mldsa_native/mldsa_native_config.h +++ b/examples/multilevel_build/mldsa_native/mldsa_native_config.h @@ -139,6 +139,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h b/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h index 844f768fa..9e7362dad 100644 --- a/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h +++ b/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h @@ -141,6 +141,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/mldsa/mldsa_native.h b/mldsa/mldsa_native.h index 87867164a..7b6e1a345 100644 --- a/mldsa/mldsa_native.h +++ b/mldsa/mldsa_native.h @@ -279,6 +279,7 @@ int MLD_API_NAMESPACE(keypair)( ); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* * Name: crypto_sign_signature_internal * @@ -440,6 +441,7 @@ int MLD_API_NAMESPACE(sign)( MLD_CONFIG_CONTEXT_PARAMETER_TYPE context #endif ); +#endif /* !MLD_CONFIG_NO_SIGN_API */ /************************************************* * Name: crypto_sign_verify_internal @@ -601,6 +603,7 @@ int MLD_API_NAMESPACE(open)( #define MLD_PREHASH_SHAKE_128 11 #define MLD_PREHASH_SHAKE_256 12 +#if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* * Name: crypto_sign_signature_pre_hash_internal * @@ -649,6 +652,7 @@ int MLD_API_NAMESPACE(signature_pre_hash_internal)( MLD_CONFIG_CONTEXT_PARAMETER_TYPE context #endif ); +#endif /* !MLD_CONFIG_NO_SIGN_API */ /************************************************* * Name: crypto_sign_verify_pre_hash_internal @@ -694,6 +698,7 @@ int MLD_API_NAMESPACE(verify_pre_hash_internal)( #endif ); +#if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* * Name: crypto_sign_signature_pre_hash_shake256 * @@ -733,6 +738,7 @@ int MLD_API_NAMESPACE(signature_pre_hash_shake256)( MLD_CONFIG_CONTEXT_PARAMETER_TYPE context #endif ); +#endif /* !MLD_CONFIG_NO_SIGN_API */ /************************************************* * Name: crypto_sign_verify_pre_hash_shake256 diff --git a/mldsa/mldsa_native_config.h b/mldsa/mldsa_native_config.h index fd171c93f..c7bc41c18 100644 --- a/mldsa/mldsa_native_config.h +++ b/mldsa/mldsa_native_config.h @@ -123,6 +123,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/mldsa/src/native/aarch64/meta.h b/mldsa/src/native/aarch64/meta.h index 8543ab5ab..a5a56b140 100644 --- a/mldsa/src/native/aarch64/meta.h +++ b/mldsa/src/native/aarch64/meta.h @@ -122,6 +122,7 @@ static MLD_INLINE int mld_rej_uniform_eta4_native(int32_t *r, unsigned len, #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4 */ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_MUST_CHECK_RETURN_VALUE @@ -142,6 +143,7 @@ static MLD_INLINE int mld_poly_decompose_88_native(int32_t *a1, int32_t *a0) } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ */ +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_poly_caddq_native(int32_t a[MLDSA_N]) diff --git a/mldsa/src/native/aarch64/src/arith_native_aarch64.h b/mldsa/src/native/aarch64/src/arith_native_aarch64.h index 88f277f04..c17864251 100644 --- a/mldsa/src/native/aarch64/src/arith_native_aarch64.h +++ b/mldsa/src/native/aarch64/src/arith_native_aarch64.h @@ -79,11 +79,13 @@ uint64_t mld_rej_uniform_eta4_asm(int32_t *r, const uint8_t *buf, unsigned buflen, const uint8_t *table); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #define mld_poly_decompose_32_asm MLD_NAMESPACE(poly_decompose_32_asm) void mld_poly_decompose_32_asm(int32_t *a1, int32_t *a0); #define mld_poly_decompose_88_asm MLD_NAMESPACE(poly_decompose_88_asm) void mld_poly_decompose_88_asm(int32_t *a1, int32_t *a0); +#endif /* !MLD_CONFIG_NO_SIGN_API */ #define mld_poly_caddq_asm MLD_NAMESPACE(poly_caddq_asm) void mld_poly_caddq_asm(int32_t *a) diff --git a/mldsa/src/native/aarch64/src/poly_decompose_32_asm.S b/mldsa/src/native/aarch64/src/poly_decompose_32_asm.S index 64c0c3c94..4dd4a6b60 100644 --- a/mldsa/src/native/aarch64/src/poly_decompose_32_asm.S +++ b/mldsa/src/native/aarch64/src/poly_decompose_32_asm.S @@ -4,7 +4,7 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_NO_SIGN_API) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) /* @@ -80,6 +80,7 @@ Lpoly_decompose_32_loop: MLD_ASM_FN_SIZE(poly_decompose_32_asm) -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_SIGN_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87) */ diff --git a/mldsa/src/native/aarch64/src/poly_decompose_88_asm.S b/mldsa/src/native/aarch64/src/poly_decompose_88_asm.S index 60fc06a6c..51c2bf6e0 100644 --- a/mldsa/src/native/aarch64/src/poly_decompose_88_asm.S +++ b/mldsa/src/native/aarch64/src/poly_decompose_88_asm.S @@ -4,7 +4,7 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_NO_SIGN_API) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44) /* @@ -80,6 +80,7 @@ Lpoly_decompose_88_loop: MLD_ASM_FN_SIZE(poly_decompose_88_asm) -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_SIGN_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ */ diff --git a/mldsa/src/native/api.h b/mldsa/src/native/api.h index 0a41534b1..6c83f200b 100644 --- a/mldsa/src/native/api.h +++ b/mldsa/src/native/api.h @@ -265,6 +265,7 @@ __contract__( #endif /* MLD_USE_NATIVE_REJ_UNIFORM_ETA4 */ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #if defined(MLD_USE_NATIVE_POLY_DECOMPOSE_32) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) @@ -337,6 +338,7 @@ __contract__( #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ */ #endif /* MLD_USE_NATIVE_POLY_DECOMPOSE_88 */ +#endif /* !MLD_CONFIG_NO_SIGN_API */ #if defined(MLD_USE_NATIVE_POLY_CADDQ) /************************************************* diff --git a/mldsa/src/native/x86_64/meta.h b/mldsa/src/native/x86_64/meta.h index 2a6b2447d..7e966cc55 100644 --- a/mldsa/src/native/x86_64/meta.h +++ b/mldsa/src/native/x86_64/meta.h @@ -143,6 +143,7 @@ static MLD_INLINE int mld_rej_uniform_eta4_native(int32_t *r, unsigned len, #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLDSA_ETA == 4 */ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_MUST_CHECK_RETURN_VALUE @@ -171,7 +172,7 @@ static MLD_INLINE int mld_poly_decompose_88_native(int32_t *a1, int32_t *a0) } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ */ - +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_poly_caddq_native(int32_t a[MLDSA_N]) diff --git a/mldsa/src/native/x86_64/src/arith_native_x86_64.h b/mldsa/src/native/x86_64/src/arith_native_x86_64.h index 62c18813e..68b7ad32c 100644 --- a/mldsa/src/native/x86_64/src/arith_native_x86_64.h +++ b/mldsa/src/native/x86_64/src/arith_native_x86_64.h @@ -79,11 +79,13 @@ unsigned mld_rej_uniform_eta4_avx2( int32_t *r, const uint8_t buf[MLD_AVX2_REJ_UNIFORM_ETA4_BUFLEN]); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #define mld_poly_decompose_32_avx2 MLD_NAMESPACE(mld_poly_decompose_32_avx2) void mld_poly_decompose_32_avx2(int32_t *a1, int32_t *a0); #define mld_poly_decompose_88_avx2 MLD_NAMESPACE(mld_poly_decompose_88_avx2) void mld_poly_decompose_88_avx2(int32_t *a1, int32_t *a0); +#endif /* !MLD_CONFIG_NO_SIGN_API */ #define mld_poly_caddq_avx2 MLD_NAMESPACE(poly_caddq_avx2) void mld_poly_caddq_avx2(int32_t *r); diff --git a/mldsa/src/native/x86_64/src/poly_decompose_32_avx2.c b/mldsa/src/native/x86_64/src/poly_decompose_32_avx2.c index 4bc584b1b..c97d0c729 100644 --- a/mldsa/src/native/x86_64/src/poly_decompose_32_avx2.c +++ b/mldsa/src/native/x86_64/src/poly_decompose_32_avx2.c @@ -24,6 +24,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + !defined(MLD_CONFIG_NO_SIGN_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) @@ -143,13 +144,14 @@ void mld_poly_decompose_32_avx2(int32_t *a1, int32_t *a0) } } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ - 65 || MLD_CONFIG_PARAMETER_SET == 87) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_SIGN_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ + || MLD_CONFIG_PARAMETER_SET == 87) */ MLD_EMPTY_CU(avx2_poly_decompose_32) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_SIGN_API && \ !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87)) */ diff --git a/mldsa/src/native/x86_64/src/poly_decompose_88_avx2.c b/mldsa/src/native/x86_64/src/poly_decompose_88_avx2.c index edb9114c8..d6a28d2d1 100644 --- a/mldsa/src/native/x86_64/src/poly_decompose_88_avx2.c +++ b/mldsa/src/native/x86_64/src/poly_decompose_88_avx2.c @@ -24,6 +24,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + !defined(MLD_CONFIG_NO_SIGN_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ MLD_CONFIG_PARAMETER_SET == 44) @@ -143,13 +144,14 @@ void mld_poly_decompose_88_avx2(int32_t *a1, int32_t *a0) _mm256_store_si256((__m256i *)&a0[8 * i], f0); } } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ - 44) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_SIGN_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ + */ MLD_EMPTY_CU(avx2_poly_decompose_88) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_SIGN_API && \ !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ 44)) */ diff --git a/mldsa/src/packing.c b/mldsa/src/packing.c index c14e541aa..cc09171d0 100644 --- a/mldsa/src/packing.c +++ b/mldsa/src/packing.c @@ -103,6 +103,7 @@ void mld_unpack_sk(uint8_t rho[MLDSA_SEEDBYTES], uint8_t tr[MLDSA_TRBYTES], mld_polyveck_unpack_t0(t0, sk); } +#if !defined(MLD_CONFIG_NO_SIGN_API) MLD_INTERNAL_API void mld_pack_sig_c_h(uint8_t sig[MLDSA_CRYPTO_BYTES], const uint8_t c[MLDSA_CTILDEBYTES], const mld_polyveck *h, @@ -183,6 +184,7 @@ void mld_pack_sig_z(uint8_t sig[MLDSA_CRYPTO_BYTES], const mld_poly *zi, sig += i * MLDSA_POLYZ_PACKEDBYTES; mld_polyz_pack(sig, zi); } +#endif /* !MLD_CONFIG_NO_SIGN_API */ /************************************************* * Name: mld_unpack_hints diff --git a/mldsa/src/packing.h b/mldsa/src/packing.h index ad86fd661..328af8269 100644 --- a/mldsa/src/packing.h +++ b/mldsa/src/packing.h @@ -69,7 +69,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ - +#if !defined(MLD_CONFIG_NO_SIGN_API) #define mld_pack_sig_c_h MLD_NAMESPACE_KL(pack_sig_c_h) /************************************************* * Name: mld_pack_sig_c_h @@ -125,6 +125,7 @@ __contract__( requires(array_bound(zi->coeffs, 0, MLDSA_N, -(MLDSA_GAMMA1 - 1), MLDSA_GAMMA1 + 1)) assigns(memory_slice(sig, MLDSA_CRYPTO_BYTES)) ); +#endif /* !MLD_CONFIG_NO_SIGN_API */ #define mld_unpack_pk MLD_NAMESPACE_KL(unpack_pk) /************************************************* diff --git a/mldsa/src/poly_kl.c b/mldsa/src/poly_kl.c index eb9654b78..9a21a6675 100644 --- a/mldsa/src/poly_kl.c +++ b/mldsa/src/poly_kl.c @@ -37,6 +37,7 @@ /* End of parameter set namespacing */ +#if !defined(MLD_CONFIG_NO_SIGN_API) MLD_STATIC_TESTABLE void mld_poly_decompose_c(mld_poly *a1, mld_poly *a0) __contract__( @@ -123,6 +124,7 @@ unsigned int mld_poly_make_hint(mld_poly *h, const mld_poly *a0, mld_assert_bound(h->coeffs, MLDSA_N, 0, 2); return s; } +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_STATIC_TESTABLE void mld_poly_use_hint_c(mld_poly *b, const mld_poly *a, const mld_poly *h) @@ -488,6 +490,7 @@ void mld_poly_uniform_eta(mld_poly *r, const uint8_t seed[MLDSA_CRHBYTES], #endif /* MLD_CONFIG_SERIAL_FIPS202_ONLY */ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #define MLD_POLY_UNIFORM_GAMMA1_NBLOCKS \ ((MLDSA_POLYZ_PACKEDBYTES + MLD_STREAM256_BLOCKBYTES - 1) / \ MLD_STREAM256_BLOCKBYTES) @@ -573,6 +576,7 @@ void mld_poly_uniform_gamma1_4x(mld_poly *r0, mld_poly *r1, mld_poly *r2, mld_zeroize(extseed, sizeof(extseed)); } #endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY */ +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_INTERNAL_API void mld_poly_challenge(mld_poly *c, const uint8_t seed[MLDSA_CTILDEBYTES]) @@ -756,7 +760,7 @@ void mld_polyeta_unpack(mld_poly *r, const uint8_t a[MLDSA_POLYETA_PACKEDBYTES]) MLDSA_ETA + 1); } - +#if !defined(MLD_CONFIG_NO_SIGN_API) MLD_INTERNAL_API void mld_polyz_pack(uint8_t r[MLDSA_POLYZ_PACKEDBYTES], const mld_poly *a) { @@ -809,6 +813,7 @@ void mld_polyz_pack(uint8_t r[MLDSA_POLYZ_PACKEDBYTES], const mld_poly *a) } #endif /* MLD_CONFIG_PARAMETER_SET != 44 */ } +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_STATIC_TESTABLE void mld_polyz_unpack_c( mld_poly *r, const uint8_t a[MLDSA_POLYZ_PACKEDBYTES]) diff --git a/mldsa/src/poly_kl.h b/mldsa/src/poly_kl.h index 06dbcca1d..44b7361c2 100644 --- a/mldsa/src/poly_kl.h +++ b/mldsa/src/poly_kl.h @@ -9,6 +9,7 @@ #include "common.h" #include "poly.h" +#if !defined(MLD_CONFIG_NO_SIGN_API) #define mld_poly_decompose MLD_NAMESPACE_KL(poly_decompose) /************************************************* * Name: mld_poly_decompose @@ -69,6 +70,7 @@ __contract__( ensures(return_value <= MLDSA_N) ensures(array_bound(h->coeffs, 0, MLDSA_N, 0, 2)) ); +#endif /* !MLD_CONFIG_NO_SIGN_API */ #define mld_poly_use_hint MLD_NAMESPACE_KL(poly_use_hint) /************************************************* @@ -162,6 +164,7 @@ __contract__( #endif /* MLD_CONFIG_SERIAL_FIPS202_ONLY */ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #if MLD_CONFIG_PARAMETER_SET == 65 || defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) #define mld_poly_uniform_gamma1 MLD_NAMESPACE_KL(poly_uniform_gamma1) /************************************************* @@ -223,6 +226,7 @@ __contract__( ensures(array_bound(r3->coeffs, 0, MLDSA_N, -(MLDSA_GAMMA1 - 1), MLDSA_GAMMA1 + 1)) ); #endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY */ +#endif /* !MLD_CONFIG_NO_SIGN_API */ #define mld_poly_challenge MLD_NAMESPACE_KL(poly_challenge) /************************************************* @@ -301,6 +305,7 @@ __contract__( ensures(array_bound(r->coeffs, 0, MLDSA_N, MLD_POLYETA_UNPACK_LOWER_BOUND, MLDSA_ETA + 1)) ); +#if !defined(MLD_CONFIG_NO_SIGN_API) #define mld_polyz_pack MLD_NAMESPACE_KL(polyz_pack) /************************************************* * Name: mld_polyz_pack @@ -320,7 +325,7 @@ __contract__( requires(array_bound(a->coeffs, 0, MLDSA_N, -(MLDSA_GAMMA1 - 1), MLDSA_GAMMA1 + 1)) assigns(memory_slice(r, MLDSA_POLYZ_PACKEDBYTES)) ); - +#endif /* !MLD_CONFIG_NO_SIGN_API */ #define mld_polyz_unpack MLD_NAMESPACE_KL(polyz_unpack) /************************************************* diff --git a/mldsa/src/polyvec.c b/mldsa/src/polyvec.c index 3617bbcb1..f332b7c17 100644 --- a/mldsa/src/polyvec.c +++ b/mldsa/src/polyvec.c @@ -249,6 +249,7 @@ void mld_polyvec_matrix_pointwise_montgomery(mld_polyveck *t, mld_polymat *mat, /**************************************************************/ /************ Vectors of polynomials of length MLDSA_L **************/ /**************************************************************/ +#if !defined(MLD_CONFIG_NO_SIGN_API) MLD_INTERNAL_API void mld_polyvecl_uniform_gamma1(mld_polyvecl *v, const uint8_t seed[MLDSA_CRHBYTES], @@ -291,6 +292,7 @@ void mld_polyvecl_uniform_gamma1(mld_polyvecl *v, mld_assert_bound_2d(v->vec, MLDSA_L, MLDSA_N, -(MLDSA_GAMMA1 - 1), MLDSA_GAMMA1 + 1); } +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_INTERNAL_API void mld_polyvecl_ntt(mld_polyvecl *v) @@ -671,6 +673,7 @@ void mld_polyveck_power2round(mld_polyveck *v1, mld_polyveck *v0, } #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) MLD_INTERNAL_API void mld_polyveck_decompose(mld_polyveck *v1, mld_polyveck *v0) { @@ -719,6 +722,7 @@ unsigned int mld_polyveck_make_hint(mld_polyveck *h, const mld_polyveck *v0, mld_assert_bound_2d(h->vec, MLDSA_K, MLDSA_N, 0, 2); return s; } +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_INTERNAL_API void mld_polyveck_use_hint(mld_polyveck *w, const mld_polyveck *u, diff --git a/mldsa/src/polyvec.h b/mldsa/src/polyvec.h index a39c17e98..3f683128c 100644 --- a/mldsa/src/polyvec.h +++ b/mldsa/src/polyvec.h @@ -26,6 +26,7 @@ typedef struct } mld_polyvecl; +#if !defined(MLD_CONFIG_NO_SIGN_API) #define mld_polyvecl_uniform_gamma1 MLD_NAMESPACE_KL(polyvecl_uniform_gamma1) /************************************************* * Name: mld_polyvecl_uniform_gamma1 @@ -51,6 +52,7 @@ __contract__( ensures(forall(k0, 0, MLDSA_L, array_bound(v->vec[k0].coeffs, 0, MLDSA_N, -(MLDSA_GAMMA1 - 1), MLDSA_GAMMA1 + 1))) ); +#endif /* !MLD_CONFIG_NO_SIGN_API */ #define mld_polyvecl_ntt MLD_NAMESPACE_KL(polyvecl_ntt) /************************************************* @@ -379,6 +381,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) #define mld_polyveck_decompose MLD_NAMESPACE_KL(polyveck_decompose) /************************************************* * Name: mld_polyveck_decompose @@ -439,6 +442,7 @@ __contract__( ensures(return_value <= MLDSA_N * MLDSA_K) ensures(forall(k1, 0, MLDSA_K, array_bound(h->vec[k1].coeffs, 0, MLDSA_N, 0, 2))) ); +#endif /* !MLD_CONFIG_NO_SIGN_API */ #define mld_polyveck_use_hint MLD_NAMESPACE_KL(polyveck_use_hint) /************************************************* diff --git a/mldsa/src/sign.c b/mldsa/src/sign.c index 27b65932e..cfacd26e3 100644 --- a/mldsa/src/sign.c +++ b/mldsa/src/sign.c @@ -443,6 +443,7 @@ __contract__( mld_zeroize(&state, sizeof(state)); } +#if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* * Name: mld_compute_pack_z * @@ -973,6 +974,7 @@ int mld_sign(uint8_t *sm, size_t *smlen, const uint8_t *m, size_t mlen, return ret; } #endif /* !MLD_CONFIG_NO_RANDOMIZED_API */ +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_MUST_CHECK_RETURN_VALUE MLD_EXTERNAL_API @@ -1187,7 +1189,7 @@ int mld_sign_open(uint8_t *m, size_t *mlen, const uint8_t *sm, size_t smlen, return ret; } - +#if !defined(MLD_CONFIG_NO_SIGN_API) MLD_MUST_CHECK_RETURN_VALUE MLD_EXTERNAL_API int mld_sign_signature_pre_hash_internal( @@ -1228,6 +1230,7 @@ int mld_sign_signature_pre_hash_internal( mld_zeroize(pre, sizeof(pre)); return ret; } +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_MUST_CHECK_RETURN_VALUE MLD_EXTERNAL_API @@ -1258,6 +1261,7 @@ int mld_sign_verify_pre_hash_internal( return ret; } +#if !defined(MLD_CONFIG_NO_SIGN_API) MLD_MUST_CHECK_RETURN_VALUE MLD_EXTERNAL_API int mld_sign_signature_pre_hash_shake256( @@ -1277,6 +1281,7 @@ int mld_sign_signature_pre_hash_shake256( mld_zeroize(ph, sizeof(ph)); return ret; } +#endif /* !MLD_CONFIG_NO_SIGN_API */ MLD_MUST_CHECK_RETURN_VALUE MLD_EXTERNAL_API diff --git a/mldsa/src/sign.h b/mldsa/src/sign.h index 2ff820fba..2221b4140 100644 --- a/mldsa/src/sign.h +++ b/mldsa/src/sign.h @@ -88,6 +88,7 @@ #define MLD_PREHASH_SHAKE_128 11 #define MLD_PREHASH_SHAKE_256 12 +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) /************************************************* * Name: mld_sign_keypair_internal * @@ -158,7 +159,9 @@ __contract__( ensures(return_value == 0 || return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY || return_value == MLD_ERR_RNG_FAIL) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* * Name: mld_sign_signature_internal * @@ -351,6 +354,7 @@ __contract__( || return_value == MLD_ERR_OUT_OF_MEMORY || return_value == MLD_ERR_RNG_FAIL)) ); +#endif /* !MLD_CONFIG_NO_SIGN_API */ /************************************************* * Name: mld_sign_verify_internal @@ -511,6 +515,7 @@ __contract__( ensures(return_value == 0 || return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY) ); +#if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* * Name: mld_sign_signature_pre_hash_internal * @@ -567,6 +572,7 @@ __contract__( ensures((return_value == 0 && *siglen == MLDSA_CRYPTO_BYTES) || ((return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY) && *siglen == 0)) ); +#endif /* !MLD_CONFIG_NO_SIGN_API */ /************************************************* * Name: mld_sign_verify_pre_hash_internal @@ -617,6 +623,7 @@ __contract__( ensures(return_value == 0 || return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY) ); +#if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* * Name: mld_sign_signature_pre_hash_shake256 * @@ -665,6 +672,7 @@ __contract__( ensures((return_value == 0 && *siglen == MLDSA_CRYPTO_BYTES) || ((return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY) && *siglen == 0)) ); +#endif /* !MLD_CONFIG_NO_SIGN_API */ /************************************************* * Name: mld_sign_verify_pre_hash_shake256 diff --git a/proofs/cbmc/mldsa_native_config_cbmc.h b/proofs/cbmc/mldsa_native_config_cbmc.h index e358aa8dc..ccc981ea4 100644 --- a/proofs/cbmc/mldsa_native_config_cbmc.h +++ b/proofs/cbmc/mldsa_native_config_cbmc.h @@ -137,6 +137,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/break_pct_config.h b/test/configs/break_pct_config.h index 4cd106d72..9ac2caa4d 100644 --- a/test/configs/break_pct_config.h +++ b/test/configs/break_pct_config.h @@ -139,6 +139,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_memcpy_config.h b/test/configs/custom_memcpy_config.h index a46728f33..dc79c07d7 100644 --- a/test/configs/custom_memcpy_config.h +++ b/test/configs/custom_memcpy_config.h @@ -138,6 +138,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_memset_config.h b/test/configs/custom_memset_config.h index 0c842f047..5931a4926 100644 --- a/test/configs/custom_memset_config.h +++ b/test/configs/custom_memset_config.h @@ -138,6 +138,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_0.h b/test/configs/custom_native_capability_config_0.h index 20a2a1925..2e3894e7b 100644 --- a/test/configs/custom_native_capability_config_0.h +++ b/test/configs/custom_native_capability_config_0.h @@ -139,6 +139,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_1.h b/test/configs/custom_native_capability_config_1.h index 0f303720d..cddf2327d 100644 --- a/test/configs/custom_native_capability_config_1.h +++ b/test/configs/custom_native_capability_config_1.h @@ -139,6 +139,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_CPUID_AVX2.h b/test/configs/custom_native_capability_config_CPUID_AVX2.h index 31055cf96..d35471a29 100644 --- a/test/configs/custom_native_capability_config_CPUID_AVX2.h +++ b/test/configs/custom_native_capability_config_CPUID_AVX2.h @@ -139,6 +139,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h b/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h index 7bf929b9e..4c5718a16 100644 --- a/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h +++ b/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h @@ -139,6 +139,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_randombytes_config.h b/test/configs/custom_randombytes_config.h index 61b1f3164..d2bda1f45 100644 --- a/test/configs/custom_randombytes_config.h +++ b/test/configs/custom_randombytes_config.h @@ -138,6 +138,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_stdlib_config.h b/test/configs/custom_stdlib_config.h index 5031374cf..b55b62462 100644 --- a/test/configs/custom_stdlib_config.h +++ b/test/configs/custom_stdlib_config.h @@ -139,6 +139,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_zeroize_config.h b/test/configs/custom_zeroize_config.h index 634d9643b..4e205f7b7 100644 --- a/test/configs/custom_zeroize_config.h +++ b/test/configs/custom_zeroize_config.h @@ -138,6 +138,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/no_asm_config.h b/test/configs/no_asm_config.h index 804d1f2ab..68f4e7926 100644 --- a/test/configs/no_asm_config.h +++ b/test/configs/no_asm_config.h @@ -139,6 +139,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/serial_fips202_config.h b/test/configs/serial_fips202_config.h index d640a6484..d2bf09178 100644 --- a/test/configs/serial_fips202_config.h +++ b/test/configs/serial_fips202_config.h @@ -138,6 +138,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/test_alloc_config.h b/test/configs/test_alloc_config.h index 14d6d851d..c6cd8aaea 100644 --- a/test/configs/test_alloc_config.h +++ b/test/configs/test_alloc_config.h @@ -141,6 +141,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_KEYPAIR_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_SIGN_API + * + * Description: By default, mldsa-native includes support for creating + * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API + * to exclude crypto_sign, crypto_sign_signature, + * crypto_sign_signature_extmu, crypto_sign_signature_internal, + * crypto_sign_signature_pre_hash_internal, + * crypto_sign_signature_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_SIGN_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * From e8c5dda26ea1a079c936b5df049f5f1df7495a7c Mon Sep 17 00:00:00 2001 From: Anders Sonmark Date: Mon, 9 Feb 2026 17:23:37 +0100 Subject: [PATCH 05/11] Add config to disable signature verification API Make it possible to exclude signature verification when not needed, together with all internal functions not needed for key generation or signature creation. Signed-off-by: Anders Sonmark --- dev/aarch64_clean/meta.h | 2 ++ dev/aarch64_clean/src/arith_native_aarch64.h | 2 ++ dev/aarch64_clean/src/poly_use_hint_32_asm.S | 5 +++-- dev/aarch64_clean/src/poly_use_hint_88_asm.S | 5 +++-- dev/aarch64_opt/meta.h | 2 ++ dev/aarch64_opt/src/arith_native_aarch64.h | 2 ++ dev/aarch64_opt/src/poly_use_hint_32_asm.S | 5 +++-- dev/aarch64_opt/src/poly_use_hint_88_asm.S | 5 +++-- dev/x86_64/meta.h | 3 ++- dev/x86_64/src/arith_native_x86_64.h | 2 ++ dev/x86_64/src/poly_use_hint_32_avx2.c | 10 ++++++---- dev/x86_64/src/poly_use_hint_88_avx2.c | 14 ++++++++------ .../mldsa_native/mldsa_native_config.h | 15 +++++++++++++++ .../mldsa_native/mldsa_native_config.h | 15 +++++++++++++++ .../mldsa_native/mldsa_native_config.h | 15 +++++++++++++++ .../mldsa_native/mldsa_native_config.h | 15 +++++++++++++++ .../mldsa_native/mldsa_native_config.h | 15 +++++++++++++++ .../mldsa_native/mldsa_native_config.h | 15 +++++++++++++++ .../mldsa_native/mldsa_native_config.h | 15 +++++++++++++++ .../mldsa_native/mldsa_native_config.h | 15 +++++++++++++++ .../mldsa_native/mldsa_native_config.h | 15 +++++++++++++++ .../mldsa_native/mldsa_native_config.h | 15 +++++++++++++++ .../mldsa_native/mldsa_native_config.h | 15 +++++++++++++++ mldsa/mldsa_native.h | 6 ++++++ mldsa/mldsa_native_config.h | 14 ++++++++++++++ mldsa/src/native/aarch64/meta.h | 2 ++ .../src/native/aarch64/src/arith_native_aarch64.h | 2 ++ .../src/native/aarch64/src/poly_use_hint_32_asm.S | 5 +++-- .../src/native/aarch64/src/poly_use_hint_88_asm.S | 5 +++-- mldsa/src/native/api.h | 2 ++ mldsa/src/native/x86_64/meta.h | 3 ++- mldsa/src/native/x86_64/src/arith_native_x86_64.h | 2 ++ .../src/native/x86_64/src/poly_use_hint_32_avx2.c | 10 ++++++---- .../src/native/x86_64/src/poly_use_hint_88_avx2.c | 14 ++++++++------ mldsa/src/packing.c | 6 ++++++ mldsa/src/packing.h | 6 +++++- mldsa/src/poly.c | 5 ++++- mldsa/src/poly.h | 4 ++++ mldsa/src/poly_kl.c | 2 ++ mldsa/src/poly_kl.h | 2 ++ mldsa/src/polyvec.c | 6 ++++++ mldsa/src/polyvec.h | 6 ++++++ mldsa/src/sign.c | 7 ++++++- mldsa/src/sign.h | 6 ++++++ proofs/cbmc/mldsa_native_config_cbmc.h | 15 +++++++++++++++ test/configs/break_pct_config.h | 15 +++++++++++++++ test/configs/custom_memcpy_config.h | 15 +++++++++++++++ test/configs/custom_memset_config.h | 15 +++++++++++++++ test/configs/custom_native_capability_config_0.h | 15 +++++++++++++++ test/configs/custom_native_capability_config_1.h | 15 +++++++++++++++ .../custom_native_capability_config_CPUID_AVX2.h | 15 +++++++++++++++ ...tom_native_capability_config_ID_AA64PFR1_EL1.h | 15 +++++++++++++++ test/configs/custom_randombytes_config.h | 15 +++++++++++++++ test/configs/custom_stdlib_config.h | 15 +++++++++++++++ test/configs/custom_zeroize_config.h | 15 +++++++++++++++ test/configs/no_asm_config.h | 15 +++++++++++++++ test/configs/serial_fips202_config.h | 15 +++++++++++++++ test/configs/test_alloc_config.h | 15 +++++++++++++++ 58 files changed, 510 insertions(+), 37 deletions(-) diff --git a/dev/aarch64_clean/meta.h b/dev/aarch64_clean/meta.h index a5a56b140..deab50ef0 100644 --- a/dev/aarch64_clean/meta.h +++ b/dev/aarch64_clean/meta.h @@ -152,6 +152,7 @@ static MLD_INLINE int mld_poly_caddq_native(int32_t a[MLDSA_N]) return MLD_NATIVE_FUNC_SUCCESS; } +#if !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_MUST_CHECK_RETURN_VALUE @@ -174,6 +175,7 @@ static MLD_INLINE int mld_poly_use_hint_88_native(int32_t *b, const int32_t *a, } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ */ +#endif /* !MLD_CONFIG_NO_VERIFY_API */ MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_poly_chknorm_native(const int32_t *a, int32_t B) diff --git a/dev/aarch64_clean/src/arith_native_aarch64.h b/dev/aarch64_clean/src/arith_native_aarch64.h index c17864251..fd961edcb 100644 --- a/dev/aarch64_clean/src/arith_native_aarch64.h +++ b/dev/aarch64_clean/src/arith_native_aarch64.h @@ -98,11 +98,13 @@ __contract__( ensures(array_bound(a, 0, MLDSA_N, 0, MLDSA_Q)) ); +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_poly_use_hint_32_asm MLD_NAMESPACE(poly_use_hint_32_asm) void mld_poly_use_hint_32_asm(int32_t *b, const int32_t *a, const int32_t *h); #define mld_poly_use_hint_88_asm MLD_NAMESPACE(poly_use_hint_88_asm) void mld_poly_use_hint_88_asm(int32_t *b, const int32_t *a, const int32_t *h); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #define mld_poly_chknorm_asm MLD_NAMESPACE(poly_chknorm_asm) MLD_MUST_CHECK_RETURN_VALUE diff --git a/dev/aarch64_clean/src/poly_use_hint_32_asm.S b/dev/aarch64_clean/src/poly_use_hint_32_asm.S index a218335b4..d5d5d5894 100644 --- a/dev/aarch64_clean/src/poly_use_hint_32_asm.S +++ b/dev/aarch64_clean/src/poly_use_hint_32_asm.S @@ -4,7 +4,7 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_NO_VERIFY_API) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) /* simpasm: header-end */ @@ -120,6 +120,7 @@ poly_use_hint_32_loop: .unreq barrett_const .unreq mask_15 /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_VERIFY_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87) */ diff --git a/dev/aarch64_clean/src/poly_use_hint_88_asm.S b/dev/aarch64_clean/src/poly_use_hint_88_asm.S index 9d530832f..93c37b06b 100644 --- a/dev/aarch64_clean/src/poly_use_hint_88_asm.S +++ b/dev/aarch64_clean/src/poly_use_hint_88_asm.S @@ -4,7 +4,7 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_NO_VERIFY_API) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44) /* simpasm: header-end */ @@ -122,6 +122,7 @@ poly_use_hint_88_loop: .unreq barrett_const .unreq const_43 /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_VERIFY_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ */ diff --git a/dev/aarch64_opt/meta.h b/dev/aarch64_opt/meta.h index a5a56b140..deab50ef0 100644 --- a/dev/aarch64_opt/meta.h +++ b/dev/aarch64_opt/meta.h @@ -152,6 +152,7 @@ static MLD_INLINE int mld_poly_caddq_native(int32_t a[MLDSA_N]) return MLD_NATIVE_FUNC_SUCCESS; } +#if !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_MUST_CHECK_RETURN_VALUE @@ -174,6 +175,7 @@ static MLD_INLINE int mld_poly_use_hint_88_native(int32_t *b, const int32_t *a, } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ */ +#endif /* !MLD_CONFIG_NO_VERIFY_API */ MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_poly_chknorm_native(const int32_t *a, int32_t B) diff --git a/dev/aarch64_opt/src/arith_native_aarch64.h b/dev/aarch64_opt/src/arith_native_aarch64.h index c17864251..fd961edcb 100644 --- a/dev/aarch64_opt/src/arith_native_aarch64.h +++ b/dev/aarch64_opt/src/arith_native_aarch64.h @@ -98,11 +98,13 @@ __contract__( ensures(array_bound(a, 0, MLDSA_N, 0, MLDSA_Q)) ); +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_poly_use_hint_32_asm MLD_NAMESPACE(poly_use_hint_32_asm) void mld_poly_use_hint_32_asm(int32_t *b, const int32_t *a, const int32_t *h); #define mld_poly_use_hint_88_asm MLD_NAMESPACE(poly_use_hint_88_asm) void mld_poly_use_hint_88_asm(int32_t *b, const int32_t *a, const int32_t *h); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #define mld_poly_chknorm_asm MLD_NAMESPACE(poly_chknorm_asm) MLD_MUST_CHECK_RETURN_VALUE diff --git a/dev/aarch64_opt/src/poly_use_hint_32_asm.S b/dev/aarch64_opt/src/poly_use_hint_32_asm.S index a218335b4..d5d5d5894 100644 --- a/dev/aarch64_opt/src/poly_use_hint_32_asm.S +++ b/dev/aarch64_opt/src/poly_use_hint_32_asm.S @@ -4,7 +4,7 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_NO_VERIFY_API) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) /* simpasm: header-end */ @@ -120,6 +120,7 @@ poly_use_hint_32_loop: .unreq barrett_const .unreq mask_15 /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_VERIFY_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87) */ diff --git a/dev/aarch64_opt/src/poly_use_hint_88_asm.S b/dev/aarch64_opt/src/poly_use_hint_88_asm.S index 9d530832f..93c37b06b 100644 --- a/dev/aarch64_opt/src/poly_use_hint_88_asm.S +++ b/dev/aarch64_opt/src/poly_use_hint_88_asm.S @@ -4,7 +4,7 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_NO_VERIFY_API) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44) /* simpasm: header-end */ @@ -122,6 +122,7 @@ poly_use_hint_88_loop: .unreq barrett_const .unreq const_43 /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_VERIFY_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ */ diff --git a/dev/x86_64/meta.h b/dev/x86_64/meta.h index 7e966cc55..177419ec3 100644 --- a/dev/x86_64/meta.h +++ b/dev/x86_64/meta.h @@ -185,6 +185,7 @@ static MLD_INLINE int mld_poly_caddq_native(int32_t a[MLDSA_N]) return MLD_NATIVE_FUNC_SUCCESS; } +#if !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_MUST_CHECK_RETURN_VALUE @@ -215,7 +216,7 @@ static MLD_INLINE int mld_poly_use_hint_88_native(int32_t *b, const int32_t *a, } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ */ - +#endif /* !MLD_CONFIG_NO_VERIFY_API */ MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_poly_chknorm_native(const int32_t *a, int32_t B) diff --git a/dev/x86_64/src/arith_native_x86_64.h b/dev/x86_64/src/arith_native_x86_64.h index 68b7ad32c..fc2cd43a1 100644 --- a/dev/x86_64/src/arith_native_x86_64.h +++ b/dev/x86_64/src/arith_native_x86_64.h @@ -90,11 +90,13 @@ void mld_poly_decompose_88_avx2(int32_t *a1, int32_t *a0); #define mld_poly_caddq_avx2 MLD_NAMESPACE(poly_caddq_avx2) void mld_poly_caddq_avx2(int32_t *r); +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_poly_use_hint_32_avx2 MLD_NAMESPACE(mld_poly_use_hint_32_avx2) void mld_poly_use_hint_32_avx2(int32_t *b, const int32_t *a, const int32_t *h); #define mld_poly_use_hint_88_avx2 MLD_NAMESPACE(mld_poly_use_hint_88_avx2) void mld_poly_use_hint_88_avx2(int32_t *b, const int32_t *a, const int32_t *h); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #define mld_poly_chknorm_avx2 MLD_NAMESPACE(mld_poly_chknorm_avx2) MLD_MUST_CHECK_RETURN_VALUE diff --git a/dev/x86_64/src/poly_use_hint_32_avx2.c b/dev/x86_64/src/poly_use_hint_32_avx2.c index 9a5c866bb..f38e13ef1 100644 --- a/dev/x86_64/src/poly_use_hint_32_avx2.c +++ b/dev/x86_64/src/poly_use_hint_32_avx2.c @@ -20,6 +20,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + !defined(MLD_CONFIG_NO_VERIFY_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) @@ -86,13 +87,14 @@ void mld_poly_use_hint_32_avx2(int32_t *b, const int32_t *a, } } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ - 65 || MLD_CONFIG_PARAMETER_SET == 87) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_VERIFY_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ + || MLD_CONFIG_PARAMETER_SET == 87) */ MLD_EMPTY_CU(avx2_poly_use_hint_32) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_VERIFY_API && \ !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87)) */ diff --git a/dev/x86_64/src/poly_use_hint_88_avx2.c b/dev/x86_64/src/poly_use_hint_88_avx2.c index 32fa2e6c6..01c17bb54 100644 --- a/dev/x86_64/src/poly_use_hint_88_avx2.c +++ b/dev/x86_64/src/poly_use_hint_88_avx2.c @@ -20,6 +20,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + !defined(MLD_CONFIG_NO_VERIFY_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ MLD_CONFIG_PARAMETER_SET == 44) @@ -88,15 +89,16 @@ void mld_poly_use_hint_88_avx2(int32_t *b, const int32_t *a, } } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ - 44) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_VERIFY_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ + */ MLD_EMPTY_CU(avx2_poly_use_hint_88) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ - !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ - (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_VERIFY_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ 44)) */ /* To facilitate single-compilation-unit (SCU) builds, undefine all macros. diff --git a/examples/basic_deterministic/mldsa_native/mldsa_native_config.h b/examples/basic_deterministic/mldsa_native/mldsa_native_config.h index 299f6369c..da1971e0a 100644 --- a/examples/basic_deterministic/mldsa_native/mldsa_native_config.h +++ b/examples/basic_deterministic/mldsa_native/mldsa_native_config.h @@ -153,6 +153,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/basic_lowram/mldsa_native/mldsa_native_config.h b/examples/basic_lowram/mldsa_native/mldsa_native_config.h index 6b050feb4..455c511b1 100644 --- a/examples/basic_lowram/mldsa_native/mldsa_native_config.h +++ b/examples/basic_lowram/mldsa_native/mldsa_native_config.h @@ -152,6 +152,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h b/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h index 40f901f12..615902429 100644 --- a/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h +++ b/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h @@ -153,6 +153,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h b/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h index cbd84aec9..aff480dfd 100644 --- a/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h +++ b/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h @@ -154,6 +154,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/custom_backend/mldsa_native/mldsa_native_config.h b/examples/custom_backend/mldsa_native/mldsa_native_config.h index 66242cacf..b12f3dee7 100644 --- a/examples/custom_backend/mldsa_native/mldsa_native_config.h +++ b/examples/custom_backend/mldsa_native/mldsa_native_config.h @@ -155,6 +155,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build/mldsa_native/mldsa_native_config.h b/examples/monolithic_build/mldsa_native/mldsa_native_config.h index 9b9d8f8c5..923da4f83 100644 --- a/examples/monolithic_build/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build/mldsa_native/mldsa_native_config.h @@ -152,6 +152,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h b/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h index bc78e8441..a243bb192 100644 --- a/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h @@ -154,6 +154,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h b/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h index ee4d91876..85d59a9b0 100644 --- a/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h @@ -158,6 +158,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h b/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h index 42a6fd9f6..55f957e07 100644 --- a/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h @@ -152,6 +152,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/multilevel_build/mldsa_native/mldsa_native_config.h b/examples/multilevel_build/mldsa_native/mldsa_native_config.h index 8532943cc..7271b39d8 100644 --- a/examples/multilevel_build/mldsa_native/mldsa_native_config.h +++ b/examples/multilevel_build/mldsa_native/mldsa_native_config.h @@ -153,6 +153,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h b/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h index 9e7362dad..de0b076e5 100644 --- a/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h +++ b/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h @@ -155,6 +155,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/mldsa/mldsa_native.h b/mldsa/mldsa_native.h index 7b6e1a345..2ad34fdf2 100644 --- a/mldsa/mldsa_native.h +++ b/mldsa/mldsa_native.h @@ -443,6 +443,7 @@ int MLD_API_NAMESPACE(sign)( ); #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) /************************************************* * Name: crypto_sign_verify_internal * @@ -585,6 +586,7 @@ int MLD_API_NAMESPACE(open)( MLD_CONFIG_CONTEXT_PARAMETER_TYPE context #endif ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ /************************************************* * Hash algorithm constants for domain separation @@ -654,6 +656,7 @@ int MLD_API_NAMESPACE(signature_pre_hash_internal)( ); #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) /************************************************* * Name: crypto_sign_verify_pre_hash_internal * @@ -697,6 +700,7 @@ int MLD_API_NAMESPACE(verify_pre_hash_internal)( MLD_CONFIG_CONTEXT_PARAMETER_TYPE context #endif ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* @@ -740,6 +744,7 @@ int MLD_API_NAMESPACE(signature_pre_hash_shake256)( ); #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) /************************************************* * Name: crypto_sign_verify_pre_hash_shake256 * @@ -775,6 +780,7 @@ int MLD_API_NAMESPACE(verify_pre_hash_shake256)( MLD_CONFIG_CONTEXT_PARAMETER_TYPE context #endif ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ /* Maximum formatted domain separation message length */ #define MLD_DOMAIN_SEPARATION_MAX_BYTES (2 + 255 + 11 + 64) diff --git a/mldsa/mldsa_native_config.h b/mldsa/mldsa_native_config.h index c7bc41c18..d1e080d3e 100644 --- a/mldsa/mldsa_native_config.h +++ b/mldsa/mldsa_native_config.h @@ -137,6 +137,20 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API diff --git a/mldsa/src/native/aarch64/meta.h b/mldsa/src/native/aarch64/meta.h index a5a56b140..deab50ef0 100644 --- a/mldsa/src/native/aarch64/meta.h +++ b/mldsa/src/native/aarch64/meta.h @@ -152,6 +152,7 @@ static MLD_INLINE int mld_poly_caddq_native(int32_t a[MLDSA_N]) return MLD_NATIVE_FUNC_SUCCESS; } +#if !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_MUST_CHECK_RETURN_VALUE @@ -174,6 +175,7 @@ static MLD_INLINE int mld_poly_use_hint_88_native(int32_t *b, const int32_t *a, } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ */ +#endif /* !MLD_CONFIG_NO_VERIFY_API */ MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_poly_chknorm_native(const int32_t *a, int32_t B) diff --git a/mldsa/src/native/aarch64/src/arith_native_aarch64.h b/mldsa/src/native/aarch64/src/arith_native_aarch64.h index c17864251..fd961edcb 100644 --- a/mldsa/src/native/aarch64/src/arith_native_aarch64.h +++ b/mldsa/src/native/aarch64/src/arith_native_aarch64.h @@ -98,11 +98,13 @@ __contract__( ensures(array_bound(a, 0, MLDSA_N, 0, MLDSA_Q)) ); +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_poly_use_hint_32_asm MLD_NAMESPACE(poly_use_hint_32_asm) void mld_poly_use_hint_32_asm(int32_t *b, const int32_t *a, const int32_t *h); #define mld_poly_use_hint_88_asm MLD_NAMESPACE(poly_use_hint_88_asm) void mld_poly_use_hint_88_asm(int32_t *b, const int32_t *a, const int32_t *h); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #define mld_poly_chknorm_asm MLD_NAMESPACE(poly_chknorm_asm) MLD_MUST_CHECK_RETURN_VALUE diff --git a/mldsa/src/native/aarch64/src/poly_use_hint_32_asm.S b/mldsa/src/native/aarch64/src/poly_use_hint_32_asm.S index e772c1c17..e7c03ad00 100644 --- a/mldsa/src/native/aarch64/src/poly_use_hint_32_asm.S +++ b/mldsa/src/native/aarch64/src/poly_use_hint_32_asm.S @@ -4,7 +4,7 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_NO_VERIFY_API) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) /* @@ -97,6 +97,7 @@ Lpoly_use_hint_32_loop: MLD_ASM_FN_SIZE(poly_use_hint_32_asm) -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_VERIFY_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87) */ diff --git a/mldsa/src/native/aarch64/src/poly_use_hint_88_asm.S b/mldsa/src/native/aarch64/src/poly_use_hint_88_asm.S index a2429c8da..af9e0f786 100644 --- a/mldsa/src/native/aarch64/src/poly_use_hint_88_asm.S +++ b/mldsa/src/native/aarch64/src/poly_use_hint_88_asm.S @@ -4,7 +4,7 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_NO_VERIFY_API) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44) /* @@ -105,6 +105,7 @@ Lpoly_use_hint_88_loop: MLD_ASM_FN_SIZE(poly_use_hint_88_asm) -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_VERIFY_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ */ diff --git a/mldsa/src/native/api.h b/mldsa/src/native/api.h index 6c83f200b..8f4def1a3 100644 --- a/mldsa/src/native/api.h +++ b/mldsa/src/native/api.h @@ -362,6 +362,7 @@ __contract__( ); #endif /* MLD_USE_NATIVE_POLY_CADDQ */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_USE_NATIVE_POLY_USE_HINT_32) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) @@ -424,6 +425,7 @@ __contract__( #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ */ #endif /* MLD_USE_NATIVE_POLY_USE_HINT_88 */ +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #if defined(MLD_USE_NATIVE_POLY_CHKNORM) /************************************************* diff --git a/mldsa/src/native/x86_64/meta.h b/mldsa/src/native/x86_64/meta.h index 7e966cc55..177419ec3 100644 --- a/mldsa/src/native/x86_64/meta.h +++ b/mldsa/src/native/x86_64/meta.h @@ -185,6 +185,7 @@ static MLD_INLINE int mld_poly_caddq_native(int32_t a[MLDSA_N]) return MLD_NATIVE_FUNC_SUCCESS; } +#if !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) MLD_MUST_CHECK_RETURN_VALUE @@ -215,7 +216,7 @@ static MLD_INLINE int mld_poly_use_hint_88_native(int32_t *b, const int32_t *a, } #endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ */ - +#endif /* !MLD_CONFIG_NO_VERIFY_API */ MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_poly_chknorm_native(const int32_t *a, int32_t B) diff --git a/mldsa/src/native/x86_64/src/arith_native_x86_64.h b/mldsa/src/native/x86_64/src/arith_native_x86_64.h index 68b7ad32c..fc2cd43a1 100644 --- a/mldsa/src/native/x86_64/src/arith_native_x86_64.h +++ b/mldsa/src/native/x86_64/src/arith_native_x86_64.h @@ -90,11 +90,13 @@ void mld_poly_decompose_88_avx2(int32_t *a1, int32_t *a0); #define mld_poly_caddq_avx2 MLD_NAMESPACE(poly_caddq_avx2) void mld_poly_caddq_avx2(int32_t *r); +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_poly_use_hint_32_avx2 MLD_NAMESPACE(mld_poly_use_hint_32_avx2) void mld_poly_use_hint_32_avx2(int32_t *b, const int32_t *a, const int32_t *h); #define mld_poly_use_hint_88_avx2 MLD_NAMESPACE(mld_poly_use_hint_88_avx2) void mld_poly_use_hint_88_avx2(int32_t *b, const int32_t *a, const int32_t *h); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #define mld_poly_chknorm_avx2 MLD_NAMESPACE(mld_poly_chknorm_avx2) MLD_MUST_CHECK_RETURN_VALUE diff --git a/mldsa/src/native/x86_64/src/poly_use_hint_32_avx2.c b/mldsa/src/native/x86_64/src/poly_use_hint_32_avx2.c index 9a5c866bb..f38e13ef1 100644 --- a/mldsa/src/native/x86_64/src/poly_use_hint_32_avx2.c +++ b/mldsa/src/native/x86_64/src/poly_use_hint_32_avx2.c @@ -20,6 +20,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + !defined(MLD_CONFIG_NO_VERIFY_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) @@ -86,13 +87,14 @@ void mld_poly_use_hint_32_avx2(int32_t *b, const int32_t *a, } } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ - 65 || MLD_CONFIG_PARAMETER_SET == 87) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_VERIFY_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ + || MLD_CONFIG_PARAMETER_SET == 87) */ MLD_EMPTY_CU(avx2_poly_use_hint_32) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_VERIFY_API && \ !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87)) */ diff --git a/mldsa/src/native/x86_64/src/poly_use_hint_88_avx2.c b/mldsa/src/native/x86_64/src/poly_use_hint_88_avx2.c index 32fa2e6c6..01c17bb54 100644 --- a/mldsa/src/native/x86_64/src/poly_use_hint_88_avx2.c +++ b/mldsa/src/native/x86_64/src/poly_use_hint_88_avx2.c @@ -20,6 +20,7 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + !defined(MLD_CONFIG_NO_VERIFY_API) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ MLD_CONFIG_PARAMETER_SET == 44) @@ -88,15 +89,16 @@ void mld_poly_use_hint_88_avx2(int32_t *b, const int32_t *a, } } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ - 44) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_VERIFY_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ + */ MLD_EMPTY_CU(avx2_poly_use_hint_88) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ - !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ - (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_NO_VERIFY_API && \ + !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ 44)) */ /* To facilitate single-compilation-unit (SCU) builds, undefine all macros. diff --git a/mldsa/src/packing.c b/mldsa/src/packing.c index cc09171d0..7ec1e2f9f 100644 --- a/mldsa/src/packing.c +++ b/mldsa/src/packing.c @@ -37,6 +37,7 @@ void mld_pack_pk(uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES], } #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API void mld_unpack_pk(uint8_t rho[MLDSA_SEEDBYTES], mld_polyveck *t1, const uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES]) @@ -51,6 +52,7 @@ void mld_unpack_pk(uint8_t rho[MLDSA_SEEDBYTES], mld_polyveck *t1, mld_polyt1_unpack(&t1->vec[i], pk + i * MLDSA_POLYT1_PACKEDBYTES); } } +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API @@ -186,6 +188,7 @@ void mld_pack_sig_z(uint8_t sig[MLDSA_CRYPTO_BYTES], const mld_poly *zi, } #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) /************************************************* * Name: mld_unpack_hints * @@ -280,7 +283,9 @@ __contract__( return 0; } +#endif /* !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API int mld_unpack_sig(uint8_t c[MLDSA_CTILDEBYTES], mld_polyvecl *z, mld_polyveck *h, const uint8_t sig[MLDSA_CRYPTO_BYTES]) @@ -293,6 +298,7 @@ int mld_unpack_sig(uint8_t c[MLDSA_CTILDEBYTES], mld_polyvecl *z, return mld_unpack_hints(h, sig); } +#endif /* !MLD_CONFIG_NO_VERIFY_API */ /* To facilitate single-compilation-unit (SCU) builds, undefine all macros. * Don't modify by hand -- this is auto-generated by scripts/autogen. */ diff --git a/mldsa/src/packing.h b/mldsa/src/packing.h index 328af8269..11736b9ea 100644 --- a/mldsa/src/packing.h +++ b/mldsa/src/packing.h @@ -127,6 +127,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_unpack_pk MLD_NAMESPACE_KL(unpack_pk) /************************************************* * Name: mld_unpack_pk @@ -149,7 +150,7 @@ __contract__( ensures(forall(k0, 0, MLDSA_K, array_bound(t1->vec[k0].coeffs, 0, MLDSA_N, 0, 1 << 10))) ); - +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #define mld_unpack_sk MLD_NAMESPACE_KL(unpack_sk) /************************************************* @@ -192,6 +193,7 @@ __contract__( array_bound(s2->vec[k2].coeffs, 0, MLDSA_N, MLD_POLYETA_UNPACK_LOWER_BOUND, MLDSA_ETA + 1))) ); +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_unpack_sig MLD_NAMESPACE_KL(unpack_sig) /************************************************* * Name: mld_unpack_sig @@ -224,4 +226,6 @@ __contract__( array_bound(h->vec[k1].coeffs, 0, MLDSA_N, 0, 2))) ensures(return_value >= 0 && return_value <= 1) ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ + #endif /* !MLD_PACKING_H */ diff --git a/mldsa/src/poly.c b/mldsa/src/poly.c index d430e79e5..10de2dffb 100644 --- a/mldsa/src/poly.c +++ b/mldsa/src/poly.c @@ -135,6 +135,7 @@ void mld_poly_sub(mld_poly *r, const mld_poly *b) mld_assert_bound(r->coeffs, MLDSA_N, INT32_MIN, MLD_REDUCE32_DOMAIN_MAX); } +#if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API void mld_poly_shiftl(mld_poly *a) { @@ -155,7 +156,7 @@ void mld_poly_shiftl(mld_poly *a) } mld_assert_bound(a->coeffs, MLDSA_N, 0, MLDSA_Q); } - +#endif /* !MLD_CONFIG_NO_VERIFY_API */ static MLD_INLINE int32_t mld_fqmul(int32_t a, int32_t b) __contract__( @@ -766,6 +767,7 @@ void mld_polyt1_pack(uint8_t r[MLDSA_POLYT1_PACKEDBYTES], const mld_poly *a) } #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API void mld_polyt1_unpack(mld_poly *r, const uint8_t a[MLDSA_POLYT1_PACKEDBYTES]) { @@ -789,6 +791,7 @@ void mld_polyt1_unpack(mld_poly *r, const uint8_t a[MLDSA_POLYT1_PACKEDBYTES]) mld_assert_bound(r->coeffs, MLDSA_N, 0, 1 << 10); } +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API diff --git a/mldsa/src/poly.h b/mldsa/src/poly.h index be1fcc1c3..df9cfab9d 100644 --- a/mldsa/src/poly.h +++ b/mldsa/src/poly.h @@ -111,6 +111,7 @@ __contract__( ensures(array_bound(r->coeffs, 0, MLDSA_N, INT32_MIN, MLD_REDUCE32_DOMAIN_MAX)) ); +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_poly_shiftl MLD_NAMESPACE(poly_shiftl) /************************************************* * Name: mld_poly_shiftl @@ -128,6 +129,7 @@ __contract__( assigns(memory_slice(a, sizeof(mld_poly))) ensures(array_bound(a->coeffs, 0, MLDSA_N, 0, MLDSA_Q)) ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #define mld_poly_ntt MLD_NAMESPACE(poly_ntt) /************************************************* @@ -302,6 +304,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyt1_unpack MLD_NAMESPACE(polyt1_unpack) /************************************************* * Name: mld_polyt1_unpack @@ -320,6 +323,7 @@ __contract__( assigns(memory_slice(r, sizeof(mld_poly))) ensures(array_bound(r->coeffs, 0, MLDSA_N, 0, 1 << 10)) ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_polyt0_pack MLD_NAMESPACE(polyt0_pack) diff --git a/mldsa/src/poly_kl.c b/mldsa/src/poly_kl.c index 9a21a6675..be670e1e1 100644 --- a/mldsa/src/poly_kl.c +++ b/mldsa/src/poly_kl.c @@ -126,6 +126,7 @@ unsigned int mld_poly_make_hint(mld_poly *h, const mld_poly *a0, } #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_STATIC_TESTABLE void mld_poly_use_hint_c(mld_poly *b, const mld_poly *a, const mld_poly *h) __contract__( @@ -183,6 +184,7 @@ void mld_poly_use_hint(mld_poly *b, const mld_poly *a, const mld_poly *h) 65 || MLD_CONFIG_PARAMETER_SET == 87) */ mld_poly_use_hint_c(b, a, h); } +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) /************************************************* diff --git a/mldsa/src/poly_kl.h b/mldsa/src/poly_kl.h index 44b7361c2..9f0a3d99b 100644 --- a/mldsa/src/poly_kl.h +++ b/mldsa/src/poly_kl.h @@ -72,6 +72,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_poly_use_hint MLD_NAMESPACE_KL(poly_use_hint) /************************************************* * Name: mld_poly_use_hint @@ -94,6 +95,7 @@ __contract__( assigns(memory_slice(b, sizeof(mld_poly))) ensures(array_bound(b->coeffs, 0, MLDSA_N, 0, (MLDSA_Q-1)/(2*MLDSA_GAMMA2))) ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) #if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) diff --git a/mldsa/src/polyvec.c b/mldsa/src/polyvec.c index f332b7c17..d2ecc1dfd 100644 --- a/mldsa/src/polyvec.c +++ b/mldsa/src/polyvec.c @@ -539,6 +539,7 @@ void mld_polyveck_sub(mld_polyveck *u, const mld_polyveck *v) MLD_REDUCE32_DOMAIN_MAX); } +#if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API void mld_polyveck_shiftl(mld_polyveck *v) { @@ -560,6 +561,7 @@ void mld_polyveck_shiftl(mld_polyveck *v) mld_assert_bound_2d(v->vec, MLDSA_K, MLDSA_N, 0, MLDSA_Q); } +#endif /* !MLD_CONFIG_NO_VERIFY_API */ MLD_INTERNAL_API void mld_polyveck_ntt(mld_polyveck *v) @@ -724,6 +726,7 @@ unsigned int mld_polyveck_make_hint(mld_polyveck *h, const mld_polyveck *v0, } #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API void mld_polyveck_use_hint(mld_polyveck *w, const mld_polyveck *u, const mld_polyveck *h) @@ -748,6 +751,7 @@ void mld_polyveck_use_hint(mld_polyveck *w, const mld_polyveck *u, mld_assert_bound_2d(w->vec, MLDSA_K, MLDSA_N, 0, (MLDSA_Q - 1) / (2 * MLDSA_GAMMA2)); } +#endif /* !MLD_CONFIG_NO_VERIFY_API */ MLD_INTERNAL_API void mld_polyveck_pack_w1(uint8_t r[MLDSA_K * MLDSA_POLYW1_PACKEDBYTES], @@ -836,6 +840,7 @@ void mld_polyvecl_unpack_eta( MLDSA_ETA + 1); } +#if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API void mld_polyvecl_unpack_z(mld_polyvecl *z, const uint8_t r[MLDSA_L * MLDSA_POLYZ_PACKEDBYTES]) @@ -849,6 +854,7 @@ void mld_polyvecl_unpack_z(mld_polyvecl *z, mld_assert_bound_2d(z->vec, MLDSA_L, MLDSA_N, -(MLDSA_GAMMA1 - 1), MLDSA_GAMMA1 + 1); } +#endif /* !MLD_CONFIG_NO_VERIFY_API */ MLD_INTERNAL_API void mld_polyveck_unpack_eta( diff --git a/mldsa/src/polyvec.h b/mldsa/src/polyvec.h index 3f683128c..3a557244f 100644 --- a/mldsa/src/polyvec.h +++ b/mldsa/src/polyvec.h @@ -242,6 +242,7 @@ __contract__( array_bound(u->vec[k0].coeffs, 0, MLDSA_N, INT32_MIN, MLD_REDUCE32_DOMAIN_MAX))) ); +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyveck_shiftl MLD_NAMESPACE_KL(polyveck_shiftl) /************************************************* * Name: mld_polyveck_shiftl @@ -260,6 +261,7 @@ __contract__( assigns(memory_slice(v, sizeof(mld_polyveck))) ensures(forall(k1, 0, MLDSA_K, array_bound(v->vec[k1].coeffs, 0, MLDSA_N, 0, MLDSA_Q))) ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #define mld_polyveck_ntt MLD_NAMESPACE_KL(polyveck_ntt) /************************************************* @@ -444,6 +446,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyveck_use_hint MLD_NAMESPACE_KL(polyveck_use_hint) /************************************************* * Name: mld_polyveck_use_hint @@ -470,6 +473,7 @@ __contract__( ensures(forall(k2, 0, MLDSA_K, array_bound(w->vec[k2].coeffs, 0, MLDSA_N, 0, (MLDSA_Q-1)/(2*MLDSA_GAMMA2)))) ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #define mld_polyveck_pack_w1 MLD_NAMESPACE_KL(polyveck_pack_w1) /************************************************* @@ -584,6 +588,7 @@ __contract__( array_bound(p->vec[k1].coeffs, 0, MLDSA_N, MLD_POLYETA_UNPACK_LOWER_BOUND, MLDSA_ETA + 1))) ); +#if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyvecl_unpack_z MLD_NAMESPACE_KL(polyvecl_unpack_z) /************************************************* * Name: mld_polyvecl_unpack_z @@ -605,6 +610,7 @@ __contract__( ensures(forall(k1, 0, MLDSA_L, array_bound(z->vec[k1].coeffs, 0, MLDSA_N, -(MLDSA_GAMMA1 - 1), MLDSA_GAMMA1 + 1))) ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #define mld_polyveck_unpack_eta MLD_NAMESPACE_KL(polyveck_unpack_eta) /************************************************* diff --git a/mldsa/src/sign.c b/mldsa/src/sign.c index cfacd26e3..8cc756fb5 100644 --- a/mldsa/src/sign.c +++ b/mldsa/src/sign.c @@ -976,6 +976,7 @@ int mld_sign(uint8_t *sm, size_t *smlen, const uint8_t *m, size_t mlen, #endif /* !MLD_CONFIG_NO_RANDOMIZED_API */ #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_MUST_CHECK_RETURN_VALUE MLD_EXTERNAL_API int mld_sign_verify_internal(const uint8_t *sig, size_t siglen, @@ -1188,6 +1189,7 @@ int mld_sign_open(uint8_t *m, size_t *mlen, const uint8_t *sm, size_t smlen, return ret; } +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) MLD_MUST_CHECK_RETURN_VALUE @@ -1232,6 +1234,7 @@ int mld_sign_signature_pre_hash_internal( } #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_MUST_CHECK_RETURN_VALUE MLD_EXTERNAL_API int mld_sign_verify_pre_hash_internal( @@ -1260,6 +1263,7 @@ int mld_sign_verify_pre_hash_internal( mld_zeroize(pre, sizeof(pre)); return ret; } +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) MLD_MUST_CHECK_RETURN_VALUE @@ -1283,6 +1287,7 @@ int mld_sign_signature_pre_hash_shake256( } #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_MUST_CHECK_RETURN_VALUE MLD_EXTERNAL_API int mld_sign_verify_pre_hash_shake256( @@ -1301,7 +1306,7 @@ int mld_sign_verify_pre_hash_shake256( mld_zeroize(ph, sizeof(ph)); return ret; } - +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #define MLD_PRE_HASH_OID_LEN 11 diff --git a/mldsa/src/sign.h b/mldsa/src/sign.h index 2221b4140..897f4d3cd 100644 --- a/mldsa/src/sign.h +++ b/mldsa/src/sign.h @@ -356,6 +356,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) /************************************************* * Name: mld_sign_verify_internal * @@ -514,6 +515,7 @@ __contract__( assigns(memory_slice(mlen, sizeof(size_t))) ensures(return_value == 0 || return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY) ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* @@ -574,6 +576,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) /************************************************* * Name: mld_sign_verify_pre_hash_internal * @@ -622,6 +625,7 @@ __contract__( requires(memory_no_alias(pk, MLDSA_CRYPTO_PUBLICKEYBYTES)) ensures(return_value == 0 || return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY) ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* @@ -674,6 +678,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_VERIFY_API) /************************************************* * Name: mld_sign_verify_pre_hash_shake256 * @@ -715,6 +720,7 @@ __contract__( requires(memory_no_alias(pk, MLDSA_CRYPTO_PUBLICKEYBYTES)) ensures(return_value == 0 || return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY) ); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ /* Maximum formatted domain separation message length: * - Pure ML-DSA: 0x00 || ctxlen || ctx (max 255) diff --git a/proofs/cbmc/mldsa_native_config_cbmc.h b/proofs/cbmc/mldsa_native_config_cbmc.h index ccc981ea4..319cc9bc4 100644 --- a/proofs/cbmc/mldsa_native_config_cbmc.h +++ b/proofs/cbmc/mldsa_native_config_cbmc.h @@ -151,6 +151,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/break_pct_config.h b/test/configs/break_pct_config.h index 9ac2caa4d..eec06f3ab 100644 --- a/test/configs/break_pct_config.h +++ b/test/configs/break_pct_config.h @@ -153,6 +153,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_memcpy_config.h b/test/configs/custom_memcpy_config.h index dc79c07d7..e7c92ef1b 100644 --- a/test/configs/custom_memcpy_config.h +++ b/test/configs/custom_memcpy_config.h @@ -152,6 +152,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_memset_config.h b/test/configs/custom_memset_config.h index 5931a4926..3fff3376c 100644 --- a/test/configs/custom_memset_config.h +++ b/test/configs/custom_memset_config.h @@ -152,6 +152,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_0.h b/test/configs/custom_native_capability_config_0.h index 2e3894e7b..afecbdddc 100644 --- a/test/configs/custom_native_capability_config_0.h +++ b/test/configs/custom_native_capability_config_0.h @@ -153,6 +153,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_1.h b/test/configs/custom_native_capability_config_1.h index cddf2327d..8d78d8747 100644 --- a/test/configs/custom_native_capability_config_1.h +++ b/test/configs/custom_native_capability_config_1.h @@ -153,6 +153,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_CPUID_AVX2.h b/test/configs/custom_native_capability_config_CPUID_AVX2.h index d35471a29..c020e5dee 100644 --- a/test/configs/custom_native_capability_config_CPUID_AVX2.h +++ b/test/configs/custom_native_capability_config_CPUID_AVX2.h @@ -153,6 +153,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h b/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h index 4c5718a16..77b1c6fce 100644 --- a/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h +++ b/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h @@ -153,6 +153,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_randombytes_config.h b/test/configs/custom_randombytes_config.h index d2bda1f45..bd62966cb 100644 --- a/test/configs/custom_randombytes_config.h +++ b/test/configs/custom_randombytes_config.h @@ -152,6 +152,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_stdlib_config.h b/test/configs/custom_stdlib_config.h index b55b62462..78b67eec8 100644 --- a/test/configs/custom_stdlib_config.h +++ b/test/configs/custom_stdlib_config.h @@ -153,6 +153,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_zeroize_config.h b/test/configs/custom_zeroize_config.h index 4e205f7b7..2b02f025a 100644 --- a/test/configs/custom_zeroize_config.h +++ b/test/configs/custom_zeroize_config.h @@ -152,6 +152,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/no_asm_config.h b/test/configs/no_asm_config.h index 68f4e7926..5326e3ed2 100644 --- a/test/configs/no_asm_config.h +++ b/test/configs/no_asm_config.h @@ -153,6 +153,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/serial_fips202_config.h b/test/configs/serial_fips202_config.h index d2bf09178..a4bcb107d 100644 --- a/test/configs/serial_fips202_config.h +++ b/test/configs/serial_fips202_config.h @@ -152,6 +152,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/test_alloc_config.h b/test/configs/test_alloc_config.h index c6cd8aaea..8ea713fc8 100644 --- a/test/configs/test_alloc_config.h +++ b/test/configs/test_alloc_config.h @@ -155,6 +155,21 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_SIGN_API */ +/****************************************************************************** + * Name: MLD_CONFIG_NO_VERIFY_API + * + * Description: By default, mldsa-native includes support for verifying + * signatures. If you don't need this, set + * MLD_CONFIG_NO_VERIFY_API to exclude crypto_sign_open, + * crypto_sign_verify, crypto_sign_verify_extmu, + * crypto_sign_verify_internal, + * crypto_sign_verify_pre_hash_internal, + * crypto_sign_verify_pre_hash_shake256, and all internal APIs + * only needed by those functions. + * + *****************************************************************************/ +/* #define MLD_CONFIG_NO_VERIFY_API */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * From e01a051ba5620f7350ac6b3c7e33183c53718b68 Mon Sep 17 00:00:00 2001 From: Anders Sonmark Date: Mon, 9 Feb 2026 17:37:20 +0100 Subject: [PATCH 06/11] Disable functions not used for key generation Make it possible to exclude code only used for signature creation or verification. Signed-off-by: Anders Sonmark --- dev/aarch64_clean/meta.h | 2 ++ dev/aarch64_clean/src/arith_native_aarch64.h | 4 ++++ dev/aarch64_clean/src/pointwise_montgomery.S | 7 +++++-- dev/aarch64_clean/src/polyz_unpack_17_asm.S | 7 +++++-- dev/aarch64_clean/src/polyz_unpack_19_asm.S | 7 +++++-- dev/aarch64_clean/src/polyz_unpack_table.c | 2 ++ dev/aarch64_opt/meta.h | 2 ++ dev/aarch64_opt/src/arith_native_aarch64.h | 4 ++++ dev/aarch64_opt/src/pointwise_montgomery.S | 7 +++++-- dev/aarch64_opt/src/polyz_unpack_17_asm.S | 7 +++++-- dev/aarch64_opt/src/polyz_unpack_19_asm.S | 7 +++++-- dev/aarch64_opt/src/polyz_unpack_table.c | 2 ++ dev/x86_64/meta.h | 2 ++ dev/x86_64/src/arith_native_x86_64.h | 2 ++ dev/x86_64/src/polyz_unpack_17_avx2.c | 13 ++++++++----- dev/x86_64/src/polyz_unpack_19_avx2.c | 13 ++++++++----- mldsa/src/native/aarch64/meta.h | 2 ++ mldsa/src/native/aarch64/src/arith_native_aarch64.h | 4 ++++ mldsa/src/native/aarch64/src/pointwise_montgomery.S | 7 +++++-- mldsa/src/native/aarch64/src/polyz_unpack_17_asm.S | 7 +++++-- mldsa/src/native/aarch64/src/polyz_unpack_19_asm.S | 7 +++++-- mldsa/src/native/aarch64/src/polyz_unpack_table.c | 2 ++ mldsa/src/native/api.h | 2 ++ mldsa/src/native/x86_64/meta.h | 2 ++ mldsa/src/native/x86_64/src/arith_native_x86_64.h | 2 ++ mldsa/src/native/x86_64/src/polyz_unpack_17_avx2.c | 13 ++++++++----- mldsa/src/native/x86_64/src/polyz_unpack_19_avx2.c | 13 ++++++++----- mldsa/src/poly.c | 4 ++++ mldsa/src/poly.h | 4 ++++ mldsa/src/poly_kl.c | 4 ++++ mldsa/src/poly_kl.h | 4 ++++ mldsa/src/polyvec.c | 8 ++++++++ mldsa/src/polyvec.h | 8 ++++++++ mldsa/src/sign.c | 4 ++++ mldsa/src/sign.h | 2 ++ 35 files changed, 149 insertions(+), 38 deletions(-) diff --git a/dev/aarch64_clean/meta.h b/dev/aarch64_clean/meta.h index deab50ef0..688ba4c14 100644 --- a/dev/aarch64_clean/meta.h +++ b/dev/aarch64_clean/meta.h @@ -183,6 +183,7 @@ static MLD_INLINE int mld_poly_chknorm_native(const int32_t *a, int32_t B) return mld_poly_chknorm_asm(a, B); } +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_polyz_unpack_17_native(int32_t *r, const uint8_t *buf) @@ -212,6 +213,7 @@ static MLD_INLINE int mld_poly_pointwise_montgomery_native( mld_poly_pointwise_montgomery_asm(out, in0, in1); return MLD_NATIVE_FUNC_SUCCESS; } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_L == 4 MLD_MUST_CHECK_RETURN_VALUE diff --git a/dev/aarch64_clean/src/arith_native_aarch64.h b/dev/aarch64_clean/src/arith_native_aarch64.h index fd961edcb..17e10ae99 100644 --- a/dev/aarch64_clean/src/arith_native_aarch64.h +++ b/dev/aarch64_clean/src/arith_native_aarch64.h @@ -31,6 +31,7 @@ extern const uint8_t mld_rej_uniform_table[]; extern const uint8_t mld_rej_uniform_eta_table[]; #endif +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 #define mld_polyz_unpack_17_indices MLD_NAMESPACE(polyz_unpack_17_indices) extern const uint8_t mld_polyz_unpack_17_indices[]; @@ -40,6 +41,7 @@ extern const uint8_t mld_polyz_unpack_17_indices[]; #define mld_polyz_unpack_19_indices MLD_NAMESPACE(polyz_unpack_19_indices) extern const uint8_t mld_polyz_unpack_19_indices[]; #endif +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ /* @@ -119,6 +121,7 @@ __contract__( ensures((return_value == 0) == array_abs_bound(a, 0, MLDSA_N, B)) ); +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyz_unpack_17_asm MLD_NAMESPACE(polyz_unpack_17_asm) void mld_polyz_unpack_17_asm(int32_t *r, const uint8_t *buf, const uint8_t *indices); @@ -131,6 +134,7 @@ void mld_polyz_unpack_19_asm(int32_t *r, const uint8_t *buf, MLD_NAMESPACE(poly_pointwise_montgomery_asm) void mld_poly_pointwise_montgomery_asm(int32_t *, const int32_t *, const int32_t *); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #define mld_polyvecl_pointwise_acc_montgomery_l4_asm \ MLD_NAMESPACE(polyvecl_pointwise_acc_montgomery_l4_asm) diff --git a/dev/aarch64_clean/src/pointwise_montgomery.S b/dev/aarch64_clean/src/pointwise_montgomery.S index e6dc6b317..e300687b0 100644 --- a/dev/aarch64_clean/src/pointwise_montgomery.S +++ b/dev/aarch64_clean/src/pointwise_montgomery.S @@ -3,7 +3,9 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) +#if defined(MLD_ARITH_BACKEND_AARCH64) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API)) && \ + !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) /* simpasm: header-end */ .macro montgomery_reduce_long res, inl, inh @@ -164,4 +166,5 @@ poly_pointwise_montgomery_loop_start: .unreq q_c_3 /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ +#endif /* MLD_ARITH_BACKEND_AARCH64 && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ diff --git a/dev/aarch64_clean/src/polyz_unpack_17_asm.S b/dev/aarch64_clean/src/polyz_unpack_17_asm.S index 569ef51da..32b289648 100644 --- a/dev/aarch64_clean/src/polyz_unpack_17_asm.S +++ b/dev/aarch64_clean/src/polyz_unpack_17_asm.S @@ -5,7 +5,9 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API)) && \ + !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44) /* simpasm: header-end */ @@ -101,6 +103,7 @@ polyz_unpack_17_loop: .unreq mask .unreq gamma1 /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ */ diff --git a/dev/aarch64_clean/src/polyz_unpack_19_asm.S b/dev/aarch64_clean/src/polyz_unpack_19_asm.S index ac6b4b420..65754d655 100644 --- a/dev/aarch64_clean/src/polyz_unpack_19_asm.S +++ b/dev/aarch64_clean/src/polyz_unpack_19_asm.S @@ -5,7 +5,9 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API)) && \ + !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) /* simpasm: header-end */ @@ -98,6 +100,7 @@ polyz_unpack_19_loop: .unreq mask .unreq gamma1 /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87) */ diff --git a/dev/aarch64_clean/src/polyz_unpack_table.c b/dev/aarch64_clean/src/polyz_unpack_table.c index 393b11102..5a6daa011 100644 --- a/dev/aarch64_clean/src/polyz_unpack_table.c +++ b/dev/aarch64_clean/src/polyz_unpack_table.c @@ -16,6 +16,7 @@ #include "arith_native_aarch64.h" +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) /* Table of indices used for tbl instructions in polyz_unpack_{17,19}. * See autogen for details. */ @@ -37,6 +38,7 @@ MLD_ALIGN const uint8_t mld_polyz_unpack_19_indices[] = { 14, 15, 16, 255, 16, 17, 18, 255, 19, 20, 21, 255, 21, 22, 23, 255, }; #endif +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ diff --git a/dev/aarch64_opt/meta.h b/dev/aarch64_opt/meta.h index deab50ef0..688ba4c14 100644 --- a/dev/aarch64_opt/meta.h +++ b/dev/aarch64_opt/meta.h @@ -183,6 +183,7 @@ static MLD_INLINE int mld_poly_chknorm_native(const int32_t *a, int32_t B) return mld_poly_chknorm_asm(a, B); } +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_polyz_unpack_17_native(int32_t *r, const uint8_t *buf) @@ -212,6 +213,7 @@ static MLD_INLINE int mld_poly_pointwise_montgomery_native( mld_poly_pointwise_montgomery_asm(out, in0, in1); return MLD_NATIVE_FUNC_SUCCESS; } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_L == 4 MLD_MUST_CHECK_RETURN_VALUE diff --git a/dev/aarch64_opt/src/arith_native_aarch64.h b/dev/aarch64_opt/src/arith_native_aarch64.h index fd961edcb..17e10ae99 100644 --- a/dev/aarch64_opt/src/arith_native_aarch64.h +++ b/dev/aarch64_opt/src/arith_native_aarch64.h @@ -31,6 +31,7 @@ extern const uint8_t mld_rej_uniform_table[]; extern const uint8_t mld_rej_uniform_eta_table[]; #endif +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 #define mld_polyz_unpack_17_indices MLD_NAMESPACE(polyz_unpack_17_indices) extern const uint8_t mld_polyz_unpack_17_indices[]; @@ -40,6 +41,7 @@ extern const uint8_t mld_polyz_unpack_17_indices[]; #define mld_polyz_unpack_19_indices MLD_NAMESPACE(polyz_unpack_19_indices) extern const uint8_t mld_polyz_unpack_19_indices[]; #endif +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ /* @@ -119,6 +121,7 @@ __contract__( ensures((return_value == 0) == array_abs_bound(a, 0, MLDSA_N, B)) ); +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyz_unpack_17_asm MLD_NAMESPACE(polyz_unpack_17_asm) void mld_polyz_unpack_17_asm(int32_t *r, const uint8_t *buf, const uint8_t *indices); @@ -131,6 +134,7 @@ void mld_polyz_unpack_19_asm(int32_t *r, const uint8_t *buf, MLD_NAMESPACE(poly_pointwise_montgomery_asm) void mld_poly_pointwise_montgomery_asm(int32_t *, const int32_t *, const int32_t *); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #define mld_polyvecl_pointwise_acc_montgomery_l4_asm \ MLD_NAMESPACE(polyvecl_pointwise_acc_montgomery_l4_asm) diff --git a/dev/aarch64_opt/src/pointwise_montgomery.S b/dev/aarch64_opt/src/pointwise_montgomery.S index e6dc6b317..e300687b0 100644 --- a/dev/aarch64_opt/src/pointwise_montgomery.S +++ b/dev/aarch64_opt/src/pointwise_montgomery.S @@ -3,7 +3,9 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) +#if defined(MLD_ARITH_BACKEND_AARCH64) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API)) && \ + !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) /* simpasm: header-end */ .macro montgomery_reduce_long res, inl, inh @@ -164,4 +166,5 @@ poly_pointwise_montgomery_loop_start: .unreq q_c_3 /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ +#endif /* MLD_ARITH_BACKEND_AARCH64 && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ diff --git a/dev/aarch64_opt/src/polyz_unpack_17_asm.S b/dev/aarch64_opt/src/polyz_unpack_17_asm.S index 569ef51da..32b289648 100644 --- a/dev/aarch64_opt/src/polyz_unpack_17_asm.S +++ b/dev/aarch64_opt/src/polyz_unpack_17_asm.S @@ -5,7 +5,9 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API)) && \ + !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44) /* simpasm: header-end */ @@ -101,6 +103,7 @@ polyz_unpack_17_loop: .unreq mask .unreq gamma1 /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ */ diff --git a/dev/aarch64_opt/src/polyz_unpack_19_asm.S b/dev/aarch64_opt/src/polyz_unpack_19_asm.S index ac6b4b420..65754d655 100644 --- a/dev/aarch64_opt/src/polyz_unpack_19_asm.S +++ b/dev/aarch64_opt/src/polyz_unpack_19_asm.S @@ -5,7 +5,9 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API)) && \ + !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) /* simpasm: header-end */ @@ -98,6 +100,7 @@ polyz_unpack_19_loop: .unreq mask .unreq gamma1 /* simpasm: footer-start */ -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87) */ diff --git a/dev/aarch64_opt/src/polyz_unpack_table.c b/dev/aarch64_opt/src/polyz_unpack_table.c index 393b11102..5a6daa011 100644 --- a/dev/aarch64_opt/src/polyz_unpack_table.c +++ b/dev/aarch64_opt/src/polyz_unpack_table.c @@ -16,6 +16,7 @@ #include "arith_native_aarch64.h" +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) /* Table of indices used for tbl instructions in polyz_unpack_{17,19}. * See autogen for details. */ @@ -37,6 +38,7 @@ MLD_ALIGN const uint8_t mld_polyz_unpack_19_indices[] = { 14, 15, 16, 255, 16, 17, 18, 255, 19, 20, 21, 255, 21, 22, 23, 255, }; #endif +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ diff --git a/dev/x86_64/meta.h b/dev/x86_64/meta.h index 177419ec3..c9a533a5e 100644 --- a/dev/x86_64/meta.h +++ b/dev/x86_64/meta.h @@ -228,6 +228,7 @@ static MLD_INLINE int mld_poly_chknorm_native(const int32_t *a, int32_t B) return mld_poly_chknorm_avx2(a, B); } +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_polyz_unpack_17_native(int32_t *r, const uint8_t *a) @@ -268,6 +269,7 @@ static MLD_INLINE int mld_poly_pointwise_montgomery_native( mld_pointwise_avx2(c, a, b, mld_qdata); return MLD_NATIVE_FUNC_SUCCESS; } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_L == 4 MLD_MUST_CHECK_RETURN_VALUE diff --git a/dev/x86_64/src/arith_native_x86_64.h b/dev/x86_64/src/arith_native_x86_64.h index fc2cd43a1..e4172ee93 100644 --- a/dev/x86_64/src/arith_native_x86_64.h +++ b/dev/x86_64/src/arith_native_x86_64.h @@ -102,11 +102,13 @@ void mld_poly_use_hint_88_avx2(int32_t *b, const int32_t *a, const int32_t *h); MLD_MUST_CHECK_RETURN_VALUE int mld_poly_chknorm_avx2(const int32_t *a, int32_t B); +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyz_unpack_17_avx2 MLD_NAMESPACE(mld_polyz_unpack_17_avx2) void mld_polyz_unpack_17_avx2(int32_t *r, const uint8_t *a); #define mld_polyz_unpack_19_avx2 MLD_NAMESPACE(mld_polyz_unpack_19_avx2) void mld_polyz_unpack_19_avx2(int32_t *r, const uint8_t *a); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #define mld_pointwise_avx2 MLD_NAMESPACE(pointwise_avx2) void mld_pointwise_avx2(int32_t *c, const int32_t *a, const int32_t *b, diff --git a/dev/x86_64/src/polyz_unpack_17_avx2.c b/dev/x86_64/src/polyz_unpack_17_avx2.c index 9e8dd9158..ac98bf64f 100644 --- a/dev/x86_64/src/polyz_unpack_17_avx2.c +++ b/dev/x86_64/src/polyz_unpack_17_avx2.c @@ -20,6 +20,8 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || \ + !defined(MLD_CONFIG_NO_VERIFY_API)) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ MLD_CONFIG_PARAMETER_SET == 44) @@ -79,13 +81,14 @@ void mld_polyz_unpack_17_avx2(int32_t *r, const uint8_t *a) _mm256_store_si256((__m256i *)&r[8 * i], f); } } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ - 44) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ + */ MLD_EMPTY_CU(avx2_polyz_unpack_17) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ - !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ 44)) */ diff --git a/dev/x86_64/src/polyz_unpack_19_avx2.c b/dev/x86_64/src/polyz_unpack_19_avx2.c index a5cc1b641..fe5c3895b 100644 --- a/dev/x86_64/src/polyz_unpack_19_avx2.c +++ b/dev/x86_64/src/polyz_unpack_19_avx2.c @@ -20,6 +20,8 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || \ + !defined(MLD_CONFIG_NO_VERIFY_API)) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) @@ -81,13 +83,14 @@ void mld_polyz_unpack_19_avx2(int32_t *r, const uint8_t *a) } } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ - 65 || MLD_CONFIG_PARAMETER_SET == 87) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ + || MLD_CONFIG_PARAMETER_SET == 87) */ MLD_EMPTY_CU(avx2_polyz_unpack_19) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ - !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87)) */ diff --git a/mldsa/src/native/aarch64/meta.h b/mldsa/src/native/aarch64/meta.h index deab50ef0..688ba4c14 100644 --- a/mldsa/src/native/aarch64/meta.h +++ b/mldsa/src/native/aarch64/meta.h @@ -183,6 +183,7 @@ static MLD_INLINE int mld_poly_chknorm_native(const int32_t *a, int32_t B) return mld_poly_chknorm_asm(a, B); } +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_polyz_unpack_17_native(int32_t *r, const uint8_t *buf) @@ -212,6 +213,7 @@ static MLD_INLINE int mld_poly_pointwise_montgomery_native( mld_poly_pointwise_montgomery_asm(out, in0, in1); return MLD_NATIVE_FUNC_SUCCESS; } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_L == 4 MLD_MUST_CHECK_RETURN_VALUE diff --git a/mldsa/src/native/aarch64/src/arith_native_aarch64.h b/mldsa/src/native/aarch64/src/arith_native_aarch64.h index fd961edcb..17e10ae99 100644 --- a/mldsa/src/native/aarch64/src/arith_native_aarch64.h +++ b/mldsa/src/native/aarch64/src/arith_native_aarch64.h @@ -31,6 +31,7 @@ extern const uint8_t mld_rej_uniform_table[]; extern const uint8_t mld_rej_uniform_eta_table[]; #endif +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 #define mld_polyz_unpack_17_indices MLD_NAMESPACE(polyz_unpack_17_indices) extern const uint8_t mld_polyz_unpack_17_indices[]; @@ -40,6 +41,7 @@ extern const uint8_t mld_polyz_unpack_17_indices[]; #define mld_polyz_unpack_19_indices MLD_NAMESPACE(polyz_unpack_19_indices) extern const uint8_t mld_polyz_unpack_19_indices[]; #endif +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ /* @@ -119,6 +121,7 @@ __contract__( ensures((return_value == 0) == array_abs_bound(a, 0, MLDSA_N, B)) ); +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyz_unpack_17_asm MLD_NAMESPACE(polyz_unpack_17_asm) void mld_polyz_unpack_17_asm(int32_t *r, const uint8_t *buf, const uint8_t *indices); @@ -131,6 +134,7 @@ void mld_polyz_unpack_19_asm(int32_t *r, const uint8_t *buf, MLD_NAMESPACE(poly_pointwise_montgomery_asm) void mld_poly_pointwise_montgomery_asm(int32_t *, const int32_t *, const int32_t *); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #define mld_polyvecl_pointwise_acc_montgomery_l4_asm \ MLD_NAMESPACE(polyvecl_pointwise_acc_montgomery_l4_asm) diff --git a/mldsa/src/native/aarch64/src/pointwise_montgomery.S b/mldsa/src/native/aarch64/src/pointwise_montgomery.S index 6ed2f9ebb..4dddd7a0e 100644 --- a/mldsa/src/native/aarch64/src/pointwise_montgomery.S +++ b/mldsa/src/native/aarch64/src/pointwise_montgomery.S @@ -3,7 +3,9 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) +#if defined(MLD_ARITH_BACKEND_AARCH64) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API)) && \ + !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) /* * WARNING: This file is auto-derived from the mldsa-native source file @@ -76,4 +78,5 @@ Lpoly_pointwise_montgomery_loop_start: MLD_ASM_FN_SIZE(poly_pointwise_montgomery_asm) -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ +#endif /* MLD_ARITH_BACKEND_AARCH64 && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ diff --git a/mldsa/src/native/aarch64/src/polyz_unpack_17_asm.S b/mldsa/src/native/aarch64/src/polyz_unpack_17_asm.S index c677c4866..3d18cdeea 100644 --- a/mldsa/src/native/aarch64/src/polyz_unpack_17_asm.S +++ b/mldsa/src/native/aarch64/src/polyz_unpack_17_asm.S @@ -5,7 +5,9 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API)) && \ + !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44) /* @@ -66,6 +68,7 @@ Lpolyz_unpack_17_loop: MLD_ASM_FN_SIZE(polyz_unpack_17_asm) -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ */ diff --git a/mldsa/src/native/aarch64/src/polyz_unpack_19_asm.S b/mldsa/src/native/aarch64/src/polyz_unpack_19_asm.S index 271a1643c..3620d11c4 100644 --- a/mldsa/src/native/aarch64/src/polyz_unpack_19_asm.S +++ b/mldsa/src/native/aarch64/src/polyz_unpack_19_asm.S @@ -5,7 +5,9 @@ */ #include "../../../common.h" -#if defined(MLD_ARITH_BACKEND_AARCH64) && !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ +#if defined(MLD_ARITH_BACKEND_AARCH64) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API)) && \ + !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) /* @@ -63,6 +65,7 @@ Lpolyz_unpack_19_loop: MLD_ASM_FN_SIZE(polyz_unpack_19_asm) -#endif /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* MLD_ARITH_BACKEND_AARCH64 && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87) */ diff --git a/mldsa/src/native/aarch64/src/polyz_unpack_table.c b/mldsa/src/native/aarch64/src/polyz_unpack_table.c index 393b11102..5a6daa011 100644 --- a/mldsa/src/native/aarch64/src/polyz_unpack_table.c +++ b/mldsa/src/native/aarch64/src/polyz_unpack_table.c @@ -16,6 +16,7 @@ #include "arith_native_aarch64.h" +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) /* Table of indices used for tbl instructions in polyz_unpack_{17,19}. * See autogen for details. */ @@ -37,6 +38,7 @@ MLD_ALIGN const uint8_t mld_polyz_unpack_19_indices[] = { 14, 15, 16, 255, 16, 17, 18, 255, 19, 20, 21, 255, 21, 22, 23, 255, }; #endif +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ diff --git a/mldsa/src/native/api.h b/mldsa/src/native/api.h index 8f4def1a3..351b42408 100644 --- a/mldsa/src/native/api.h +++ b/mldsa/src/native/api.h @@ -459,6 +459,7 @@ __contract__( ); #endif /* MLD_USE_NATIVE_POLY_CHKNORM */ +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_USE_NATIVE_POLYZ_UNPACK_17) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 /************************************************* @@ -543,6 +544,7 @@ __contract__( ensures((return_value == MLD_NATIVE_FUNC_FALLBACK) ==> array_unchanged(c, MLDSA_N)) ); #endif /* MLD_USE_NATIVE_POINTWISE_MONTGOMERY */ +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if defined(MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L4) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_L == 4 diff --git a/mldsa/src/native/x86_64/meta.h b/mldsa/src/native/x86_64/meta.h index 177419ec3..c9a533a5e 100644 --- a/mldsa/src/native/x86_64/meta.h +++ b/mldsa/src/native/x86_64/meta.h @@ -228,6 +228,7 @@ static MLD_INLINE int mld_poly_chknorm_native(const int32_t *a, int32_t B) return mld_poly_chknorm_avx2(a, B); } +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44 MLD_MUST_CHECK_RETURN_VALUE static MLD_INLINE int mld_polyz_unpack_17_native(int32_t *r, const uint8_t *a) @@ -268,6 +269,7 @@ static MLD_INLINE int mld_poly_pointwise_montgomery_native( mld_pointwise_avx2(c, a, b, mld_qdata); return MLD_NATIVE_FUNC_SUCCESS; } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLDSA_L == 4 MLD_MUST_CHECK_RETURN_VALUE diff --git a/mldsa/src/native/x86_64/src/arith_native_x86_64.h b/mldsa/src/native/x86_64/src/arith_native_x86_64.h index fc2cd43a1..e4172ee93 100644 --- a/mldsa/src/native/x86_64/src/arith_native_x86_64.h +++ b/mldsa/src/native/x86_64/src/arith_native_x86_64.h @@ -102,11 +102,13 @@ void mld_poly_use_hint_88_avx2(int32_t *b, const int32_t *a, const int32_t *h); MLD_MUST_CHECK_RETURN_VALUE int mld_poly_chknorm_avx2(const int32_t *a, int32_t B); +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyz_unpack_17_avx2 MLD_NAMESPACE(mld_polyz_unpack_17_avx2) void mld_polyz_unpack_17_avx2(int32_t *r, const uint8_t *a); #define mld_polyz_unpack_19_avx2 MLD_NAMESPACE(mld_polyz_unpack_19_avx2) void mld_polyz_unpack_19_avx2(int32_t *r, const uint8_t *a); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #define mld_pointwise_avx2 MLD_NAMESPACE(pointwise_avx2) void mld_pointwise_avx2(int32_t *c, const int32_t *a, const int32_t *b, diff --git a/mldsa/src/native/x86_64/src/polyz_unpack_17_avx2.c b/mldsa/src/native/x86_64/src/polyz_unpack_17_avx2.c index 9e8dd9158..ac98bf64f 100644 --- a/mldsa/src/native/x86_64/src/polyz_unpack_17_avx2.c +++ b/mldsa/src/native/x86_64/src/polyz_unpack_17_avx2.c @@ -20,6 +20,8 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || \ + !defined(MLD_CONFIG_NO_VERIFY_API)) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ MLD_CONFIG_PARAMETER_SET == 44) @@ -79,13 +81,14 @@ void mld_polyz_unpack_17_avx2(int32_t *r, const uint8_t *a) _mm256_store_si256((__m256i *)&r[8 * i], f); } } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ - 44) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44) \ + */ MLD_EMPTY_CU(avx2_polyz_unpack_17) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ - !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ 44)) */ diff --git a/mldsa/src/native/x86_64/src/polyz_unpack_19_avx2.c b/mldsa/src/native/x86_64/src/polyz_unpack_19_avx2.c index a5cc1b641..fe5c3895b 100644 --- a/mldsa/src/native/x86_64/src/polyz_unpack_19_avx2.c +++ b/mldsa/src/native/x86_64/src/polyz_unpack_19_avx2.c @@ -20,6 +20,8 @@ #include "../../../common.h" #if defined(MLD_ARITH_BACKEND_X86_64_DEFAULT) && \ + (!defined(MLD_CONFIG_NO_SIGN_API) || \ + !defined(MLD_CONFIG_NO_VERIFY_API)) && \ !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED) && \ (defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)) @@ -81,13 +83,14 @@ void mld_polyz_unpack_19_avx2(int32_t *r, const uint8_t *a) } } -#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \ - && (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == \ - 65 || MLD_CONFIG_PARAMETER_SET == 87) */ +#else /* MLD_ARITH_BACKEND_X86_64_DEFAULT && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ + (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ + || MLD_CONFIG_PARAMETER_SET == 87) */ MLD_EMPTY_CU(avx2_polyz_unpack_19) -#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && \ - !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ +#endif /* !(MLD_ARITH_BACKEND_X86_64_DEFAULT && (!MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_NO_VERIFY_API) && !MLD_CONFIG_MULTILEVEL_NO_SHARED && \ (MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ || MLD_CONFIG_PARAMETER_SET == 87)) */ diff --git a/mldsa/src/poly.c b/mldsa/src/poly.c index 10de2dffb..d852a0d6d 100644 --- a/mldsa/src/poly.c +++ b/mldsa/src/poly.c @@ -112,6 +112,7 @@ void mld_poly_add(mld_poly *r, const mld_poly *b) } } +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) /* Reference: We use destructive version (output=first input) to avoid * reasoning about aliasing in the CBMC specification */ MLD_INTERNAL_API @@ -134,6 +135,7 @@ void mld_poly_sub(mld_poly *r, const mld_poly *b) mld_assert_bound(r->coeffs, MLDSA_N, INT32_MIN, MLD_REDUCE32_DOMAIN_MAX); } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API @@ -452,6 +454,7 @@ void mld_poly_invntt_tomont(mld_poly *a) mld_poly_invntt_tomont_c(a); } +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) MLD_STATIC_TESTABLE void mld_poly_pointwise_montgomery_c(mld_poly *c, const mld_poly *a, const mld_poly *b) @@ -498,6 +501,7 @@ void mld_poly_pointwise_montgomery(mld_poly *c, const mld_poly *a, #endif /* MLD_USE_NATIVE_POINTWISE_MONTGOMERY */ mld_poly_pointwise_montgomery_c(c, a, b); } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API diff --git a/mldsa/src/poly.h b/mldsa/src/poly.h index df9cfab9d..04aae1bbd 100644 --- a/mldsa/src/poly.h +++ b/mldsa/src/poly.h @@ -85,6 +85,7 @@ __contract__( ensures(forall(k4, 0, MLDSA_N, r->coeffs[k4] >= INT32_MIN)) ); +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_poly_sub MLD_NAMESPACE(poly_sub) /************************************************* * Name: mld_poly_sub @@ -110,6 +111,7 @@ __contract__( assigns(memory_slice(r, sizeof(mld_poly))) ensures(array_bound(r->coeffs, 0, MLDSA_N, INT32_MIN, MLD_REDUCE32_DOMAIN_MAX)) ); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_poly_shiftl MLD_NAMESPACE(poly_shiftl) @@ -170,6 +172,7 @@ __contract__( ensures(array_abs_bound(a->coeffs, 0, MLDSA_N, MLD_INTT_BOUND)) ); +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_poly_pointwise_montgomery MLD_NAMESPACE(poly_pointwise_montgomery) /************************************************* * Name: mld_poly_pointwise_montgomery @@ -194,6 +197,7 @@ __contract__( assigns(memory_slice(c, sizeof(mld_poly))) ensures(array_abs_bound(c->coeffs, 0, MLDSA_N, MLDSA_Q)) ); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_poly_power2round MLD_NAMESPACE(poly_power2round) diff --git a/mldsa/src/poly_kl.c b/mldsa/src/poly_kl.c index be670e1e1..e4a4be758 100644 --- a/mldsa/src/poly_kl.c +++ b/mldsa/src/poly_kl.c @@ -580,6 +580,7 @@ void mld_poly_uniform_gamma1_4x(mld_poly *r0, mld_poly *r1, mld_poly *r2, #endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY */ #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API void mld_poly_challenge(mld_poly *c, const uint8_t seed[MLDSA_CTILDEBYTES]) { @@ -662,6 +663,7 @@ void mld_poly_challenge(mld_poly *c, const uint8_t seed[MLDSA_CTILDEBYTES]) mld_zeroize(buf, sizeof(buf)); mld_zeroize(&signs, sizeof(signs)); } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API @@ -817,6 +819,7 @@ void mld_polyz_pack(uint8_t r[MLDSA_POLYZ_PACKEDBYTES], const mld_poly *a) } #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) MLD_STATIC_TESTABLE void mld_polyz_unpack_c( mld_poly *r, const uint8_t a[MLDSA_POLYZ_PACKEDBYTES]) __contract__( @@ -942,6 +945,7 @@ void mld_polyw1_pack(uint8_t r[MLDSA_POLYW1_PACKEDBYTES], const mld_poly *a) } #endif /* MLD_CONFIG_PARAMETER_SET != 44 */ } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ /* To facilitate single-compilation-unit (SCU) builds, undefine all macros. */ diff --git a/mldsa/src/poly_kl.h b/mldsa/src/poly_kl.h index 9f0a3d99b..ec449accb 100644 --- a/mldsa/src/poly_kl.h +++ b/mldsa/src/poly_kl.h @@ -230,6 +230,7 @@ __contract__( #endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY */ #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_poly_challenge MLD_NAMESPACE_KL(poly_challenge) /************************************************* * Name: mld_poly_challenge @@ -251,6 +252,7 @@ __contract__( /* All coefficients of c are -1, 0 or +1 */ ensures(array_bound(c->coeffs, 0, MLDSA_N, -1, 2)) ); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_polyeta_pack MLD_NAMESPACE_KL(polyeta_pack) @@ -329,6 +331,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_SIGN_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyz_unpack MLD_NAMESPACE_KL(polyz_unpack) /************************************************* * Name: mld_polyz_unpack @@ -367,5 +370,6 @@ __contract__( requires(array_bound(a->coeffs, 0, MLDSA_N, 0, (MLDSA_Q-1)/(2*MLDSA_GAMMA2))) assigns(memory_slice(r, MLDSA_POLYW1_PACKEDBYTES)) ); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #endif /* !MLD_POLY_KL_H */ diff --git a/mldsa/src/polyvec.c b/mldsa/src/polyvec.c index d2ecc1dfd..3ac59e92c 100644 --- a/mldsa/src/polyvec.c +++ b/mldsa/src/polyvec.c @@ -515,6 +515,7 @@ void mld_polyveck_add(mld_polyveck *u, const mld_polyveck *v) MLD_REDUCE32_DOMAIN_MAX); } +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API void mld_polyveck_sub(mld_polyveck *u, const mld_polyveck *v) { @@ -538,6 +539,7 @@ void mld_polyveck_sub(mld_polyveck *u, const mld_polyveck *v) mld_assert_bound_2d(u->vec, MLDSA_K, MLDSA_N, INT32_MIN, MLD_REDUCE32_DOMAIN_MAX); } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API @@ -563,6 +565,7 @@ void mld_polyveck_shiftl(mld_polyveck *v) } #endif /* !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API void mld_polyveck_ntt(mld_polyveck *v) { @@ -581,6 +584,7 @@ void mld_polyveck_ntt(mld_polyveck *v) } mld_assert_abs_bound_2d(v->vec, MLDSA_K, MLDSA_N, MLD_NTT_BOUND); } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ MLD_INTERNAL_API void mld_polyveck_invntt_tomont(mld_polyveck *v) @@ -602,6 +606,7 @@ void mld_polyveck_invntt_tomont(mld_polyveck *v) mld_assert_abs_bound_2d(v->vec, MLDSA_K, MLDSA_N, MLD_INTT_BOUND); } +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API void mld_polyveck_pointwise_poly_montgomery(mld_polyveck *r, const mld_poly *a, const mld_polyveck *v) @@ -621,6 +626,7 @@ void mld_polyveck_pointwise_poly_montgomery(mld_polyveck *r, const mld_poly *a, } mld_assert_abs_bound_2d(r->vec, MLDSA_K, MLDSA_N, MLDSA_Q); } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ MLD_INTERNAL_API uint32_t mld_polyveck_chknorm(const mld_polyveck *v, int32_t bound) @@ -753,6 +759,7 @@ void mld_polyveck_use_hint(mld_polyveck *w, const mld_polyveck *u, } #endif /* !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API void mld_polyveck_pack_w1(uint8_t r[MLDSA_K * MLDSA_POLYW1_PACKEDBYTES], const mld_polyveck *w1) @@ -771,6 +778,7 @@ void mld_polyveck_pack_w1(uint8_t r[MLDSA_K * MLDSA_POLYW1_PACKEDBYTES], mld_polyw1_pack(&r[i * MLDSA_POLYW1_PACKEDBYTES], &w1->vec[i]); } } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API diff --git a/mldsa/src/polyvec.h b/mldsa/src/polyvec.h index 3a557244f..11d63ae12 100644 --- a/mldsa/src/polyvec.h +++ b/mldsa/src/polyvec.h @@ -219,6 +219,7 @@ __contract__( array_bound(u->vec[q2].coeffs, 0, MLDSA_N, INT32_MIN, MLD_REDUCE32_DOMAIN_MAX))) ); +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyveck_sub MLD_NAMESPACE_KL(polyveck_sub) /************************************************* * Name: mld_polyveck_sub @@ -241,6 +242,7 @@ __contract__( ensures(forall(k0, 0, MLDSA_K, array_bound(u->vec[k0].coeffs, 0, MLDSA_N, INT32_MIN, MLD_REDUCE32_DOMAIN_MAX))) ); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyveck_shiftl MLD_NAMESPACE_KL(polyveck_shiftl) @@ -263,6 +265,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyveck_ntt MLD_NAMESPACE_KL(polyveck_ntt) /************************************************* * Name: mld_polyveck_ntt @@ -280,6 +283,7 @@ __contract__( assigns(memory_slice(v, sizeof(mld_polyveck))) ensures(forall(k1, 0, MLDSA_K, array_abs_bound(v->vec[k1].coeffs, 0, MLDSA_N, MLD_NTT_BOUND))) ); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #define mld_polyveck_invntt_tomont MLD_NAMESPACE_KL(polyveck_invntt_tomont) /************************************************* @@ -300,6 +304,7 @@ __contract__( ensures(forall(k1, 0, MLDSA_K, array_abs_bound(v->vec[k1].coeffs, 0, MLDSA_N, MLD_INTT_BOUND))) ); +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyveck_pointwise_poly_montgomery \ MLD_NAMESPACE_KL(polyveck_pointwise_poly_montgomery) /************************************************* @@ -325,6 +330,7 @@ __contract__( assigns(memory_slice(r, sizeof(mld_polyveck))) ensures(forall(k1, 0, MLDSA_K, array_abs_bound(r->vec[k1].coeffs, 0, MLDSA_N, MLDSA_Q))) ); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #define mld_polyveck_chknorm MLD_NAMESPACE_KL(polyveck_chknorm) /************************************************* @@ -475,6 +481,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyveck_pack_w1 MLD_NAMESPACE_KL(polyveck_pack_w1) /************************************************* * Name: mld_polyveck_pack_w1 @@ -497,6 +504,7 @@ __contract__( array_bound(w1->vec[k1].coeffs, 0, MLDSA_N, 0, (MLDSA_Q-1)/(2*MLDSA_GAMMA2)))) assigns(memory_slice(r, MLDSA_K * MLDSA_POLYW1_PACKEDBYTES)) ); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_polyveck_pack_eta MLD_NAMESPACE_KL(polyveck_pack_eta) diff --git a/mldsa/src/sign.c b/mldsa/src/sign.c index 8cc756fb5..ae821baa3 100644 --- a/mldsa/src/sign.c +++ b/mldsa/src/sign.c @@ -387,6 +387,7 @@ int mld_sign_keypair(uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES], #endif /* !MLD_CONFIG_NO_RANDOMIZED_API */ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) /************************************************* * Name: mld_H * @@ -442,6 +443,7 @@ __contract__( /* @[FIPS204, Section 3.6.3] Destruction of intermediate values. */ mld_zeroize(&state, sizeof(state)); } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* @@ -1308,6 +1310,7 @@ int mld_sign_verify_pre_hash_shake256( } #endif /* !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define MLD_PRE_HASH_OID_LEN 11 /************************************************* @@ -1433,6 +1436,7 @@ size_t mld_prepare_domain_separation_prefix( mld_memcpy(prefix + 2 + ctxlen + MLD_PRE_HASH_OID_LEN, ph, phlen); return 2 + ctxlen + MLD_PRE_HASH_OID_LEN + phlen; } +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_EXTERNAL_API diff --git a/mldsa/src/sign.h b/mldsa/src/sign.h index 897f4d3cd..bcaa38abc 100644 --- a/mldsa/src/sign.h +++ b/mldsa/src/sign.h @@ -722,6 +722,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) /* Maximum formatted domain separation message length: * - Pure ML-DSA: 0x00 || ctxlen || ctx (max 255) * - HashML-DSA: 0x01 || ctxlen || ctx (max 255) || oid (11) || ph (max 64) */ @@ -779,6 +780,7 @@ __contract__( assigns(memory_slice(prefix, MLD_DOMAIN_SEPARATION_MAX_BYTES)) ensures(return_value <= MLD_DOMAIN_SEPARATION_MAX_BYTES) ); +#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) /************************************************* From 44cc3e24c02d703b66d8ca92ba6672eeef0a77a8 Mon Sep 17 00:00:00 2001 From: Anders Sonmark Date: Mon, 9 Feb 2026 17:40:26 +0100 Subject: [PATCH 07/11] Disable functions not used for signature creation Make it possible to exclude code only used for key generation or verification. Signed-off-by: Anders Sonmark --- mldsa/src/polyvec.c | 2 ++ mldsa/src/polyvec.h | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mldsa/src/polyvec.c b/mldsa/src/polyvec.c index 3ac59e92c..80f234ce8 100644 --- a/mldsa/src/polyvec.c +++ b/mldsa/src/polyvec.c @@ -420,6 +420,7 @@ void mld_polyvecl_pointwise_acc_montgomery(mld_poly *w, const mld_polyvecl *u, mld_polyvecl_pointwise_acc_montgomery_c(w, u, v); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API uint32_t mld_polyvecl_chknorm(const mld_polyvecl *v, int32_t bound) { @@ -444,6 +445,7 @@ uint32_t mld_polyvecl_chknorm(const mld_polyvecl *v, int32_t bound) } return t; } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_VERIFY_API */ /**************************************************************/ /************ Vectors of polynomials of length MLDSA_K **************/ diff --git a/mldsa/src/polyvec.h b/mldsa/src/polyvec.h index 11d63ae12..dba667797 100644 --- a/mldsa/src/polyvec.h +++ b/mldsa/src/polyvec.h @@ -110,7 +110,7 @@ __contract__( ensures(array_abs_bound(w->coeffs, 0, MLDSA_N, MLDSA_Q)) ); - +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyvecl_chknorm MLD_NAMESPACE_KL(polyvecl_chknorm) /************************************************* * Name: mld_polyvecl_chknorm @@ -135,6 +135,7 @@ __contract__( ensures(return_value == 0 || return_value == 0xFFFFFFFF) ensures((return_value == 0) == forall(k1, 0, MLDSA_L, array_abs_bound(v->vec[k1].coeffs, 0, MLDSA_N, B))) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_VERIFY_API */ /* Vectors of polynomials of length MLDSA_K */ typedef struct From a2cb8212139a2f2dfdfa01cd30ecf477b15a046e Mon Sep 17 00:00:00 2001 From: Anders Sonmark Date: Mon, 9 Feb 2026 17:43:15 +0100 Subject: [PATCH 08/11] Disable functions not used for signature verification Make it possible to exclude code only used for key generation or signature creation. Signed-off-by: Anders Sonmark --- mldsa/src/fips202/fips202x4.c | 6 ++++++ mldsa/src/fips202/fips202x4.h | 2 ++ mldsa/src/fips202/keccakf1600.c | 5 +++-- mldsa/src/fips202/keccakf1600.h | 7 +++++-- mldsa/src/packing.c | 2 ++ mldsa/src/packing.h | 2 ++ mldsa/src/poly.c | 4 ++++ mldsa/src/poly.h | 5 ++++- mldsa/src/poly_kl.c | 2 ++ mldsa/src/poly_kl.h | 2 ++ mldsa/src/polyvec.c | 8 ++++++++ mldsa/src/polyvec.h | 8 ++++++++ 12 files changed, 48 insertions(+), 5 deletions(-) diff --git a/mldsa/src/fips202/fips202x4.c b/mldsa/src/fips202/fips202x4.c index 5b98e4a00..74a6ebbf2 100644 --- a/mldsa/src/fips202/fips202x4.c +++ b/mldsa/src/fips202/fips202x4.c @@ -22,6 +22,8 @@ #include "fips202x4.h" #include "keccakf1600.h" +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) || \ + !defined(MLD_CONFIG_REDUCE_RAM) static void mld_keccak_absorb_once_x4(uint64_t *s, uint32_t r, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, const uint8_t *in3, @@ -119,6 +121,8 @@ __contract__( nblocks--; } } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_REDUCE_RAM */ #if !defined(MLD_CONFIG_REDUCE_RAM) MLD_INTERNAL_API @@ -150,6 +154,7 @@ void mld_shake128x4_release(mld_shake128x4ctx *state) } #endif /* !MLD_CONFIG_REDUCE_RAM */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) MLD_INTERNAL_API void mld_shake256x4_absorb_once(mld_shake256x4ctx *state, const uint8_t *in0, const uint8_t *in1, const uint8_t *in2, @@ -177,6 +182,7 @@ void mld_shake256x4_release(mld_shake256x4ctx *state) /* @[FIPS204, Section 3.6.3] Destruction of intermediate values. */ mld_zeroize(state, sizeof(mld_shake256x4ctx)); } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #endif /* !MLD_CONFIG_MULTILEVEL_NO_SHARED && !MLD_CONFIG_SERIAL_FIPS202_ONLY \ */ diff --git a/mldsa/src/fips202/fips202x4.h b/mldsa/src/fips202/fips202x4.h index 91a1a927b..0b524a8fd 100644 --- a/mldsa/src/fips202/fips202x4.h +++ b/mldsa/src/fips202/fips202x4.h @@ -71,6 +71,7 @@ MLD_INTERNAL_API void mld_shake128x4_release(mld_shake128x4ctx *state); #endif /* !MLD_CONFIG_REDUCE_RAM */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) #define mld_shake256x4_absorb_once MLD_NAMESPACE(shake256x4_absorb_once) MLD_INTERNAL_API void mld_shake256x4_absorb_once(mld_shake256x4ctx *state, const uint8_t *in0, @@ -112,6 +113,7 @@ void mld_shake256x4_init(mld_shake256x4ctx *state); #define mld_shake256x4_release MLD_NAMESPACE(shake256x4_release) MLD_INTERNAL_API void mld_shake256x4_release(mld_shake256x4ctx *state); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY */ #endif /* !MLD_FIPS202_FIPS202X4_H */ diff --git a/mldsa/src/fips202/keccakf1600.c b/mldsa/src/fips202/keccakf1600.c index e2139be8b..527d91c58 100644 --- a/mldsa/src/fips202/keccakf1600.c +++ b/mldsa/src/fips202/keccakf1600.c @@ -84,7 +84,7 @@ void mld_keccakf1600_xor_bytes(uint64_t *state, const unsigned char *data, #endif /* !MLD_SYS_LITTLE_ENDIAN */ } -#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) +#if (!defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_REDUCE_RAM)) && !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) MLD_INTERNAL_API void mld_keccakf1600x4_extract_bytes(uint64_t *state, unsigned char *data0, unsigned char *data1, unsigned char *data2, @@ -132,7 +132,8 @@ void mld_keccakf1600x4_permute(uint64_t *state) mld_keccakf1600_permute(state + MLD_KECCAK_LANES * 2); mld_keccakf1600_permute(state + MLD_KECCAK_LANES * 3); } -#endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY */ +#endif /* (!MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_REDUCE_RAM) && !MLD_CONFIG_SERIAL_FIPS202_ONLY */ static const uint64_t mld_KeccakF_RoundConstants[MLD_KECCAK_NROUNDS] = { (uint64_t)0x0000000000000001ULL, (uint64_t)0x0000000000008082ULL, diff --git a/mldsa/src/fips202/keccakf1600.h b/mldsa/src/fips202/keccakf1600.h index 35752943a..8b6621d23 100644 --- a/mldsa/src/fips202/keccakf1600.h +++ b/mldsa/src/fips202/keccakf1600.h @@ -43,7 +43,9 @@ __contract__( assigns(memory_slice(state, sizeof(uint64_t) * MLD_KECCAK_LANES)) ); -#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) +#if (!defined(MLD_CONFIG_NO_KEYPAIR_API) || \ + !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_REDUCE_RAM)) && \ + !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) #define mld_keccakf1600x4_extract_bytes \ MLD_NAMESPACE(keccakf1600x4_extract_bytes) MLD_INTERNAL_API @@ -94,7 +96,8 @@ __contract__( requires(memory_no_alias(state, sizeof(uint64_t) * MLD_KECCAK_LANES * MLD_KECCAK_WAY)) assigns(memory_slice(state, sizeof(uint64_t) * MLD_KECCAK_LANES * MLD_KECCAK_WAY)) ); -#endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY */ +#endif /* (!MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API || \ + !MLD_CONFIG_REDUCE_RAM) && !MLD_CONFIG_SERIAL_FIPS202_ONLY */ #define mld_keccakf1600_permute MLD_NAMESPACE(keccakf1600_permute) MLD_INTERNAL_API diff --git a/mldsa/src/packing.c b/mldsa/src/packing.c index 7ec1e2f9f..698374e03 100644 --- a/mldsa/src/packing.c +++ b/mldsa/src/packing.c @@ -81,6 +81,7 @@ void mld_pack_sk(uint8_t sk[MLDSA_CRYPTO_SECRETKEYBYTES], } #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) MLD_INTERNAL_API void mld_unpack_sk(uint8_t rho[MLDSA_SEEDBYTES], uint8_t tr[MLDSA_TRBYTES], uint8_t key[MLDSA_SEEDBYTES], mld_polyveck *t0, @@ -104,6 +105,7 @@ void mld_unpack_sk(uint8_t rho[MLDSA_SEEDBYTES], uint8_t tr[MLDSA_TRBYTES], mld_polyveck_unpack_t0(t0, sk); } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) MLD_INTERNAL_API diff --git a/mldsa/src/packing.h b/mldsa/src/packing.h index 11736b9ea..24bcdcefa 100644 --- a/mldsa/src/packing.h +++ b/mldsa/src/packing.h @@ -152,6 +152,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) #define mld_unpack_sk MLD_NAMESPACE_KL(unpack_sk) /************************************************* * Name: mld_unpack_sk @@ -192,6 +193,7 @@ __contract__( ensures(forall(k2, 0, MLDSA_K, array_bound(s2->vec[k2].coeffs, 0, MLDSA_N, MLD_POLYETA_UNPACK_LOWER_BOUND, MLDSA_ETA + 1))) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_unpack_sig MLD_NAMESPACE_KL(unpack_sig) diff --git a/mldsa/src/poly.c b/mldsa/src/poly.c index d852a0d6d..4188c256e 100644 --- a/mldsa/src/poly.c +++ b/mldsa/src/poly.c @@ -91,6 +91,7 @@ void mld_poly_caddq(mld_poly *a) mld_poly_caddq_c(a); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) /* Reference: We use destructive version (output=first input) to avoid * reasoning about aliasing in the CBMC specification */ MLD_INTERNAL_API @@ -111,6 +112,7 @@ void mld_poly_add(mld_poly *r, const mld_poly *b) r->coeffs[i] = r->coeffs[i] + b->coeffs[i]; } } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) /* Reference: We use destructive version (output=first input) to avoid @@ -847,6 +849,7 @@ void mld_polyt0_pack(uint8_t r[MLDSA_POLYT0_PACKEDBYTES], const mld_poly *a) } #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) MLD_INTERNAL_API void mld_polyt0_unpack(mld_poly *r, const uint8_t a[MLDSA_POLYT0_PACKEDBYTES]) { @@ -907,6 +910,7 @@ void mld_polyt0_unpack(mld_poly *r, const uint8_t a[MLDSA_POLYT0_PACKEDBYTES]) mld_assert_bound(r->coeffs, MLDSA_N, -(1 << (MLDSA_D - 1)) + 1, (1 << (MLDSA_D - 1)) + 1); } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ MLD_STATIC_TESTABLE uint32_t mld_poly_chknorm_c(const mld_poly *a, int32_t B) __contract__( diff --git a/mldsa/src/poly.h b/mldsa/src/poly.h index 04aae1bbd..533903228 100644 --- a/mldsa/src/poly.h +++ b/mldsa/src/poly.h @@ -57,6 +57,7 @@ __contract__( ensures(array_bound(a->coeffs, 0, MLDSA_N, 0, MLDSA_Q)) ); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) #define mld_poly_add MLD_NAMESPACE(poly_add) /************************************************* * Name: mld_poly_add @@ -84,6 +85,7 @@ __contract__( ensures(forall(k3, 0, MLDSA_N, r->coeffs[k3] < MLD_REDUCE32_DOMAIN_MAX)) ensures(forall(k4, 0, MLDSA_N, r->coeffs[k4] >= INT32_MIN)) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_poly_sub MLD_NAMESPACE(poly_sub) @@ -351,7 +353,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ - +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) #define mld_polyt0_unpack MLD_NAMESPACE(polyt0_unpack) /************************************************* * Name: mld_polyt0_unpack @@ -370,6 +372,7 @@ __contract__( assigns(memory_slice(r, sizeof(mld_poly))) ensures(array_bound(r->coeffs, 0, MLDSA_N, -(1<<(MLDSA_D-1)) + 1, (1<<(MLDSA_D-1)) + 1)) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #define mld_poly_chknorm MLD_NAMESPACE(poly_chknorm) /************************************************* diff --git a/mldsa/src/poly_kl.c b/mldsa/src/poly_kl.c index e4a4be758..dcc759836 100644 --- a/mldsa/src/poly_kl.c +++ b/mldsa/src/poly_kl.c @@ -715,6 +715,7 @@ void mld_polyeta_pack(uint8_t r[MLDSA_POLYETA_PACKEDBYTES], const mld_poly *a) } #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) void mld_polyeta_unpack(mld_poly *r, const uint8_t a[MLDSA_POLYETA_PACKEDBYTES]) { unsigned int i; @@ -763,6 +764,7 @@ void mld_polyeta_unpack(mld_poly *r, const uint8_t a[MLDSA_POLYETA_PACKEDBYTES]) mld_assert_bound(r->coeffs, MLDSA_N, MLD_POLYETA_UNPACK_LOWER_BOUND, MLDSA_ETA + 1); } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) MLD_INTERNAL_API diff --git a/mldsa/src/poly_kl.h b/mldsa/src/poly_kl.h index ec449accb..19c24ee2e 100644 --- a/mldsa/src/poly_kl.h +++ b/mldsa/src/poly_kl.h @@ -275,6 +275,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) /* * polyeta_unpack produces coefficients in [-MLDSA_ETA,MLDSA_ETA] for * well-formed inputs (i.e., those produced by polyeta_pack). @@ -308,6 +309,7 @@ __contract__( assigns(memory_slice(r, sizeof(mld_poly))) ensures(array_bound(r->coeffs, 0, MLDSA_N, MLD_POLYETA_UNPACK_LOWER_BOUND, MLDSA_ETA + 1)) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) #define mld_polyz_pack MLD_NAMESPACE_KL(polyz_pack) diff --git a/mldsa/src/polyvec.c b/mldsa/src/polyvec.c index 80f234ce8..042bd7c6f 100644 --- a/mldsa/src/polyvec.c +++ b/mldsa/src/polyvec.c @@ -494,6 +494,7 @@ void mld_polyveck_caddq(mld_polyveck *v) mld_assert_bound_2d(v->vec, MLDSA_K, MLDSA_N, 0, MLDSA_Q); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) /* Reference: We use destructive version (output=first input) to avoid * reasoning about aliasing in the CBMC specification */ MLD_INTERNAL_API @@ -516,6 +517,7 @@ void mld_polyveck_add(mld_polyveck *u, const mld_polyveck *v) mld_assert_bound_2d(u->vec, MLDSA_K, MLDSA_N, INT32_MIN, MLD_REDUCE32_DOMAIN_MAX); } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API @@ -630,6 +632,7 @@ void mld_polyveck_pointwise_poly_montgomery(mld_polyveck *r, const mld_poly *a, } #endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) MLD_INTERNAL_API uint32_t mld_polyveck_chknorm(const mld_polyveck *v, int32_t bound) { @@ -655,6 +658,7 @@ uint32_t mld_polyveck_chknorm(const mld_polyveck *v, int32_t bound) return t; } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) MLD_INTERNAL_API @@ -836,6 +840,7 @@ void mld_polyveck_pack_t0(uint8_t r[MLDSA_K * MLDSA_POLYT0_PACKEDBYTES], } #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) MLD_INTERNAL_API void mld_polyvecl_unpack_eta( mld_polyvecl *p, const uint8_t r[MLDSA_L * MLDSA_POLYETA_PACKEDBYTES]) @@ -849,6 +854,7 @@ void mld_polyvecl_unpack_eta( mld_assert_bound_2d(p->vec, MLDSA_L, MLDSA_N, MLD_POLYETA_UNPACK_LOWER_BOUND, MLDSA_ETA + 1); } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_VERIFY_API) MLD_INTERNAL_API @@ -866,6 +872,7 @@ void mld_polyvecl_unpack_z(mld_polyvecl *z, } #endif /* !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) MLD_INTERNAL_API void mld_polyveck_unpack_eta( mld_polyveck *p, const uint8_t r[MLDSA_K * MLDSA_POLYETA_PACKEDBYTES]) @@ -893,6 +900,7 @@ void mld_polyveck_unpack_t0(mld_polyveck *p, mld_assert_bound_2d(p->vec, MLDSA_K, MLDSA_N, -(1 << (MLDSA_D - 1)) + 1, (1 << (MLDSA_D - 1)) + 1); } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ /* To facilitate single-compilation-unit (SCU) builds, undefine all macros. * Don't modify by hand -- this is auto-generated by scripts/autogen. */ diff --git a/mldsa/src/polyvec.h b/mldsa/src/polyvec.h index dba667797..01a9c9a06 100644 --- a/mldsa/src/polyvec.h +++ b/mldsa/src/polyvec.h @@ -195,6 +195,7 @@ __contract__( array_bound(v->vec[k1].coeffs, 0, MLDSA_N, 0, MLDSA_Q))) ); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) #define mld_polyveck_add MLD_NAMESPACE_KL(polyveck_add) /************************************************* * Name: mld_polyveck_add @@ -219,6 +220,7 @@ __contract__( ensures(forall(q2, 0, MLDSA_K, array_bound(u->vec[q2].coeffs, 0, MLDSA_N, INT32_MIN, MLD_REDUCE32_DOMAIN_MAX))) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyveck_sub MLD_NAMESPACE_KL(polyveck_sub) @@ -333,6 +335,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) #define mld_polyveck_chknorm MLD_NAMESPACE_KL(polyveck_chknorm) /************************************************* * Name: mld_polyveck_chknorm @@ -358,6 +361,7 @@ __contract__( ensures(return_value == 0 || return_value == 0xFFFFFFFF) ensures((return_value == 0) == forall(k1, 0, MLDSA_K, array_abs_bound(v->vec[k1].coeffs, 0, MLDSA_N, B))) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_KEYPAIR_API) #define mld_polyveck_power2round MLD_NAMESPACE_KL(polyveck_power2round) @@ -575,6 +579,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) #define mld_polyvecl_unpack_eta MLD_NAMESPACE_KL(polyvecl_unpack_eta) /************************************************* * Name: mld_polyvecl_unpack_eta @@ -596,6 +601,7 @@ __contract__( ensures(forall(k1, 0, MLDSA_L, array_bound(p->vec[k1].coeffs, 0, MLDSA_N, MLD_POLYETA_UNPACK_LOWER_BOUND, MLDSA_ETA + 1))) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_VERIFY_API) #define mld_polyvecl_unpack_z MLD_NAMESPACE_KL(polyvecl_unpack_z) @@ -621,6 +627,7 @@ __contract__( ); #endif /* !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_NO_SIGN_API) #define mld_polyveck_unpack_eta MLD_NAMESPACE_KL(polyveck_unpack_eta) /************************************************* * Name: mld_polyveck_unpack_eta @@ -664,6 +671,7 @@ __contract__( ensures(forall(k1, 0, MLDSA_K, array_bound(p->vec[k1].coeffs, 0, MLDSA_N, -(1<<(MLDSA_D-1)) + 1, (1<<(MLDSA_D-1)) + 1))) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_NO_SIGN_API */ #define mld_polymat_get_row MLD_NAMESPACE_KL(polymat_get_row) /************************************************* From 6e73e211e823ac6e2e33adc84d55dac5320d5cac Mon Sep 17 00:00:00 2001 From: Anders Sonmark Date: Tue, 10 Feb 2026 08:35:30 +0100 Subject: [PATCH 09/11] Add config to use only the internal API Make it possible to exclude the wrapper APIs if not needed and build only the internal API functions. Signed-off-by: Anders Sonmark --- .../mldsa_native/mldsa_native_config.h | 10 ++++++++++ .../basic_lowram/mldsa_native/mldsa_native_config.h | 10 ++++++++++ .../mldsa_native/mldsa_native_config.h | 10 ++++++++++ .../mldsa_native/mldsa_native_config.h | 10 ++++++++++ .../custom_backend/mldsa_native/mldsa_native_config.h | 10 ++++++++++ .../mldsa_native/mldsa_native_config.h | 10 ++++++++++ .../mldsa_native/mldsa_native_config.h | 10 ++++++++++ .../mldsa_native/mldsa_native_config.h | 10 ++++++++++ .../mldsa_native/mldsa_native_config.h | 10 ++++++++++ .../mldsa_native/mldsa_native_config.h | 10 ++++++++++ .../mldsa_native/mldsa_native_config.h | 10 ++++++++++ mldsa/mldsa_native.h | 10 ++++++++++ mldsa/mldsa_native_config.h | 10 ++++++++++ mldsa/src/fips202/fips202.c | 2 ++ mldsa/src/fips202/fips202.h | 3 +++ mldsa/src/sign.c | 8 ++++++++ mldsa/src/sign.h | 8 ++++++++ proofs/cbmc/mldsa_native_config_cbmc.h | 10 ++++++++++ test/configs/break_pct_config.h | 10 ++++++++++ test/configs/custom_memcpy_config.h | 10 ++++++++++ test/configs/custom_memset_config.h | 10 ++++++++++ test/configs/custom_native_capability_config_0.h | 10 ++++++++++ test/configs/custom_native_capability_config_1.h | 10 ++++++++++ .../custom_native_capability_config_CPUID_AVX2.h | 10 ++++++++++ .../custom_native_capability_config_ID_AA64PFR1_EL1.h | 10 ++++++++++ test/configs/custom_randombytes_config.h | 10 ++++++++++ test/configs/custom_stdlib_config.h | 10 ++++++++++ test/configs/custom_zeroize_config.h | 10 ++++++++++ test/configs/no_asm_config.h | 10 ++++++++++ test/configs/serial_fips202_config.h | 10 ++++++++++ test/configs/test_alloc_config.h | 10 ++++++++++ 31 files changed, 291 insertions(+) diff --git a/examples/basic_deterministic/mldsa_native/mldsa_native_config.h b/examples/basic_deterministic/mldsa_native/mldsa_native_config.h index da1971e0a..9c67475d8 100644 --- a/examples/basic_deterministic/mldsa_native/mldsa_native_config.h +++ b/examples/basic_deterministic/mldsa_native/mldsa_native_config.h @@ -168,6 +168,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/basic_lowram/mldsa_native/mldsa_native_config.h b/examples/basic_lowram/mldsa_native/mldsa_native_config.h index 455c511b1..629dacf62 100644 --- a/examples/basic_lowram/mldsa_native/mldsa_native_config.h +++ b/examples/basic_lowram/mldsa_native/mldsa_native_config.h @@ -167,6 +167,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h b/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h index 615902429..1c5517319 100644 --- a/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h +++ b/examples/bring_your_own_fips202/mldsa_native/mldsa_native_config.h @@ -168,6 +168,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h b/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h index aff480dfd..0168b5228 100644 --- a/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h +++ b/examples/bring_your_own_fips202_static/mldsa_native/mldsa_native_config.h @@ -169,6 +169,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/custom_backend/mldsa_native/mldsa_native_config.h b/examples/custom_backend/mldsa_native/mldsa_native_config.h index b12f3dee7..621890eee 100644 --- a/examples/custom_backend/mldsa_native/mldsa_native_config.h +++ b/examples/custom_backend/mldsa_native/mldsa_native_config.h @@ -170,6 +170,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build/mldsa_native/mldsa_native_config.h b/examples/monolithic_build/mldsa_native/mldsa_native_config.h index 923da4f83..565d10fc8 100644 --- a/examples/monolithic_build/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build/mldsa_native/mldsa_native_config.h @@ -167,6 +167,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h b/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h index a243bb192..a6113ebc1 100644 --- a/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build_multilevel/mldsa_native/mldsa_native_config.h @@ -169,6 +169,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h b/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h index 85d59a9b0..9a4b69f28 100644 --- a/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build_multilevel_native/mldsa_native/mldsa_native_config.h @@ -173,6 +173,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h b/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h index 55f957e07..6b552156e 100644 --- a/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h +++ b/examples/monolithic_build_native/mldsa_native/mldsa_native_config.h @@ -167,6 +167,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/multilevel_build/mldsa_native/mldsa_native_config.h b/examples/multilevel_build/mldsa_native/mldsa_native_config.h index 7271b39d8..5faca3840 100644 --- a/examples/multilevel_build/mldsa_native/mldsa_native_config.h +++ b/examples/multilevel_build/mldsa_native/mldsa_native_config.h @@ -168,6 +168,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h b/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h index de0b076e5..30bf3e292 100644 --- a/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h +++ b/examples/multilevel_build_native/mldsa_native/mldsa_native_config.h @@ -170,6 +170,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/mldsa/mldsa_native.h b/mldsa/mldsa_native.h index 2ad34fdf2..770781945 100644 --- a/mldsa/mldsa_native.h +++ b/mldsa/mldsa_native.h @@ -244,6 +244,7 @@ int MLD_API_NAMESPACE(keypair_internal)( #endif ); +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) /************************************************* * Name: crypto_sign_keypair * @@ -277,6 +278,7 @@ int MLD_API_NAMESPACE(keypair)( MLD_CONFIG_CONTEXT_PARAMETER_TYPE context #endif ); +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) @@ -326,6 +328,7 @@ int MLD_API_NAMESPACE(signature_internal)( #endif ); +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) /************************************************* * Name: crypto_sign_signature * @@ -441,6 +444,7 @@ int MLD_API_NAMESPACE(sign)( MLD_CONFIG_CONTEXT_PARAMETER_TYPE context #endif ); +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ #endif /* !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_VERIFY_API) @@ -482,6 +486,7 @@ int MLD_API_NAMESPACE(verify_internal)( #endif ); +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) /************************************************* * Name: crypto_sign_verify * @@ -586,6 +591,7 @@ int MLD_API_NAMESPACE(open)( MLD_CONFIG_CONTEXT_PARAMETER_TYPE context #endif ); +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ #endif /* !MLD_CONFIG_NO_VERIFY_API */ /************************************************* @@ -605,6 +611,7 @@ int MLD_API_NAMESPACE(open)( #define MLD_PREHASH_SHAKE_128 11 #define MLD_PREHASH_SHAKE_256 12 +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) #if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* * Name: crypto_sign_signature_pre_hash_internal @@ -781,10 +788,12 @@ int MLD_API_NAMESPACE(verify_pre_hash_shake256)( #endif ); #endif /* !MLD_CONFIG_NO_VERIFY_API */ +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ /* Maximum formatted domain separation message length */ #define MLD_DOMAIN_SEPARATION_MAX_BYTES (2 + 255 + 11 + 64) +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) /************************************************* * Name: mld_prepare_domain_separation_prefix * @@ -866,6 +875,7 @@ int MLD_API_NAMESPACE(pk_from_sk)( #endif ); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ #ifdef __cplusplus } diff --git a/mldsa/mldsa_native_config.h b/mldsa/mldsa_native_config.h index d1e080d3e..df405e32b 100644 --- a/mldsa/mldsa_native_config.h +++ b/mldsa/mldsa_native_config.h @@ -152,6 +152,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/mldsa/src/fips202/fips202.c b/mldsa/src/fips202/fips202.c index 78a1a41a3..1523f0868 100644 --- a/mldsa/src/fips202/fips202.c +++ b/mldsa/src/fips202/fips202.c @@ -262,6 +262,7 @@ void mld_shake256_release(mld_shake256ctx *state) mld_zeroize(state, sizeof(mld_shake256ctx)); } +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || !defined(MLD_CONFIG_INTERNAL_API_ONLY) MLD_INTERNAL_API void mld_shake256(uint8_t *out, size_t outlen, const uint8_t *in, size_t inlen) { @@ -273,5 +274,6 @@ void mld_shake256(uint8_t *out, size_t outlen, const uint8_t *in, size_t inlen) mld_shake256_squeeze(out, outlen, &state); mld_shake256_release(&state); } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_INTERNAL_API_ONLY */ #endif /* !MLD_CONFIG_MULTILEVEL_NO_SHARED */ diff --git a/mldsa/src/fips202/fips202.h b/mldsa/src/fips202/fips202.h index 3f0c8f6ce..c0e42663c 100644 --- a/mldsa/src/fips202/fips202.h +++ b/mldsa/src/fips202/fips202.h @@ -220,6 +220,8 @@ __contract__( assigns(memory_slice(state, sizeof(mld_shake256ctx))) ); +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) || \ + !defined(MLD_CONFIG_INTERNAL_API_ONLY) #define mld_shake256 MLD_NAMESPACE(shake256) /************************************************* * Name: mld_shake256 @@ -240,5 +242,6 @@ __contract__( requires(memory_no_alias(out, outlen)) assigns(memory_slice(out, outlen)) ); +#endif /* !MLD_CONFIG_NO_KEYPAIR_API || !MLD_CONFIG_INTERNAL_API_ONLY */ #endif /* !MLD_FIPS202_FIPS202_H */ diff --git a/mldsa/src/sign.c b/mldsa/src/sign.c index ae821baa3..593a1b685 100644 --- a/mldsa/src/sign.c +++ b/mldsa/src/sign.c @@ -362,6 +362,7 @@ int mld_sign_keypair_internal(uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES], return mld_check_pct(pk, sk, context); } +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) #if !defined(MLD_CONFIG_NO_RANDOMIZED_API) MLD_MUST_CHECK_RETURN_VALUE MLD_EXTERNAL_API @@ -385,6 +386,7 @@ int mld_sign_keypair(uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES], return ret; } #endif /* !MLD_CONFIG_NO_RANDOMIZED_API */ +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API) @@ -856,6 +858,7 @@ int mld_sign_signature_internal(uint8_t sig[MLDSA_CRYPTO_BYTES], size_t *siglen, return ret; } +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) #if !defined(MLD_CONFIG_NO_RANDOMIZED_API) MLD_MUST_CHECK_RETURN_VALUE MLD_EXTERNAL_API @@ -976,6 +979,7 @@ int mld_sign(uint8_t *sm, size_t *smlen, const uint8_t *m, size_t mlen, return ret; } #endif /* !MLD_CONFIG_NO_RANDOMIZED_API */ +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ #endif /* !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_VERIFY_API) @@ -1107,6 +1111,7 @@ int mld_sign_verify_internal(const uint8_t *sig, size_t siglen, return ret; } +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) MLD_MUST_CHECK_RETURN_VALUE MLD_EXTERNAL_API int mld_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, @@ -1191,8 +1196,10 @@ int mld_sign_open(uint8_t *m, size_t *mlen, const uint8_t *sm, size_t smlen, return ret; } +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ #endif /* !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) #if !defined(MLD_CONFIG_NO_SIGN_API) MLD_MUST_CHECK_RETURN_VALUE MLD_EXTERNAL_API @@ -1514,6 +1521,7 @@ int mld_sign_pk_from_sk(uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES], return ret; } #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ /* To facilitate single-compilation-unit (SCU) builds, undefine all macros. * Don't modify by hand -- this is auto-generated by scripts/autogen. */ diff --git a/mldsa/src/sign.h b/mldsa/src/sign.h index bcaa38abc..27901944a 100644 --- a/mldsa/src/sign.h +++ b/mldsa/src/sign.h @@ -126,6 +126,7 @@ __contract__( return_value == MLD_ERR_OUT_OF_MEMORY || return_value == MLD_ERR_RNG_FAIL) ); +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) /************************************************* * Name: mld_sign_keypair * @@ -159,6 +160,7 @@ __contract__( ensures(return_value == 0 || return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY || return_value == MLD_ERR_RNG_FAIL) ); +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ #if !defined(MLD_CONFIG_NO_SIGN_API) @@ -220,6 +222,7 @@ __contract__( ensures(return_value != 0 ==> *siglen == 0) ); +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) /************************************************* * Name: mld_sign_signature * @@ -354,6 +357,7 @@ __contract__( || return_value == MLD_ERR_OUT_OF_MEMORY || return_value == MLD_ERR_RNG_FAIL)) ); +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ #endif /* !MLD_CONFIG_NO_SIGN_API */ #if !defined(MLD_CONFIG_NO_VERIFY_API) @@ -401,6 +405,7 @@ __contract__( ensures(return_value == 0 || return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY) ); +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) /************************************************* * Name: mld_sign_verify * @@ -515,8 +520,10 @@ __contract__( assigns(memory_slice(mlen, sizeof(size_t))) ensures(return_value == 0 || return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY) ); +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ #endif /* !MLD_CONFIG_NO_VERIFY_API */ +#if !defined(MLD_CONFIG_INTERNAL_API_ONLY) #if !defined(MLD_CONFIG_NO_SIGN_API) /************************************************* * Name: mld_sign_signature_pre_hash_internal @@ -821,5 +828,6 @@ __contract__( ensures(return_value == 0 || return_value == MLD_ERR_FAIL || return_value == MLD_ERR_OUT_OF_MEMORY) ); #endif /* !MLD_CONFIG_NO_KEYPAIR_API */ +#endif /* !MLD_CONFIG_INTERNAL_API_ONLY */ #endif /* !MLD_SIGN_H */ diff --git a/proofs/cbmc/mldsa_native_config_cbmc.h b/proofs/cbmc/mldsa_native_config_cbmc.h index 319cc9bc4..27642fa6c 100644 --- a/proofs/cbmc/mldsa_native_config_cbmc.h +++ b/proofs/cbmc/mldsa_native_config_cbmc.h @@ -166,6 +166,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/break_pct_config.h b/test/configs/break_pct_config.h index eec06f3ab..2b4b81a6f 100644 --- a/test/configs/break_pct_config.h +++ b/test/configs/break_pct_config.h @@ -168,6 +168,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_memcpy_config.h b/test/configs/custom_memcpy_config.h index e7c92ef1b..adcef5e84 100644 --- a/test/configs/custom_memcpy_config.h +++ b/test/configs/custom_memcpy_config.h @@ -167,6 +167,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_memset_config.h b/test/configs/custom_memset_config.h index 3fff3376c..01c8ca3bc 100644 --- a/test/configs/custom_memset_config.h +++ b/test/configs/custom_memset_config.h @@ -167,6 +167,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_0.h b/test/configs/custom_native_capability_config_0.h index afecbdddc..575295392 100644 --- a/test/configs/custom_native_capability_config_0.h +++ b/test/configs/custom_native_capability_config_0.h @@ -168,6 +168,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_1.h b/test/configs/custom_native_capability_config_1.h index 8d78d8747..c9d66254d 100644 --- a/test/configs/custom_native_capability_config_1.h +++ b/test/configs/custom_native_capability_config_1.h @@ -168,6 +168,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_CPUID_AVX2.h b/test/configs/custom_native_capability_config_CPUID_AVX2.h index c020e5dee..89144f699 100644 --- a/test/configs/custom_native_capability_config_CPUID_AVX2.h +++ b/test/configs/custom_native_capability_config_CPUID_AVX2.h @@ -168,6 +168,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h b/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h index 77b1c6fce..051bc83ef 100644 --- a/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h +++ b/test/configs/custom_native_capability_config_ID_AA64PFR1_EL1.h @@ -168,6 +168,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_randombytes_config.h b/test/configs/custom_randombytes_config.h index bd62966cb..8a556a16c 100644 --- a/test/configs/custom_randombytes_config.h +++ b/test/configs/custom_randombytes_config.h @@ -167,6 +167,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_stdlib_config.h b/test/configs/custom_stdlib_config.h index 78b67eec8..87e359a17 100644 --- a/test/configs/custom_stdlib_config.h +++ b/test/configs/custom_stdlib_config.h @@ -168,6 +168,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/custom_zeroize_config.h b/test/configs/custom_zeroize_config.h index 2b02f025a..9b6c62b04 100644 --- a/test/configs/custom_zeroize_config.h +++ b/test/configs/custom_zeroize_config.h @@ -167,6 +167,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/no_asm_config.h b/test/configs/no_asm_config.h index 5326e3ed2..068da470e 100644 --- a/test/configs/no_asm_config.h +++ b/test/configs/no_asm_config.h @@ -168,6 +168,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/serial_fips202_config.h b/test/configs/serial_fips202_config.h index a4bcb107d..5fcc32866 100644 --- a/test/configs/serial_fips202_config.h +++ b/test/configs/serial_fips202_config.h @@ -167,6 +167,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * diff --git a/test/configs/test_alloc_config.h b/test/configs/test_alloc_config.h index 8ea713fc8..7b6099891 100644 --- a/test/configs/test_alloc_config.h +++ b/test/configs/test_alloc_config.h @@ -170,6 +170,16 @@ *****************************************************************************/ /* #define MLD_CONFIG_NO_VERIFY_API */ +/****************************************************************************** + * Name: MLD_CONFIG_INTERNAL_API_ONLY + * + * Description: Set this to remove all public APIs except + * crypto_sign_keypair_internal, crypto_sign_signature_internal, + * and crypto_sign_verify_internal. + * + *****************************************************************************/ +/* #define MLD_CONFIG_INTERNAL_API_ONLY */ + /****************************************************************************** * Name: MLD_CONFIG_NO_RANDOMIZED_API * From 7e22dd8c67703cb1bfeb6bf8e44a28d9e76d9907 Mon Sep 17 00:00:00 2001 From: "Matthias J. Kannwischer" Date: Tue, 17 Mar 2026 14:44:25 +0800 Subject: [PATCH 10/11] Add disabled_apis_native example with native backends Same as disabled_apis but with native arithmetic and FIPS-202 backends enabled, testing four disabled API combinations across all three parameter sets. Signed-off-by: Matthias J. Kannwischer --- .github/actions/config-variations/action.yml | 4 +- Makefile | 4 +- examples/README.md | 16 + examples/disabled_apis/.gitignore | 3 + examples/disabled_apis/Makefile | 113 + examples/disabled_apis/README.md | 29 + examples/disabled_apis/auto.mk | 1 + .../disabled_apis/expected_test_vectors.h | 2360 +++++++++++++++++ examples/disabled_apis/main.c | 91 + examples/disabled_apis/mldsa_native | 1 + examples/disabled_apis/test_only_rng | 1 + examples/disabled_apis_native/.gitignore | 3 + examples/disabled_apis_native/Makefile | 118 + examples/disabled_apis_native/README.md | 14 + examples/disabled_apis_native/auto.mk | 1 + .../expected_test_vectors.h | 1 + examples/disabled_apis_native/main.c | 1 + examples/disabled_apis_native/mldsa_native | 1 + examples/disabled_apis_native/test_only_rng | 1 + scripts/tests | 20 + 20 files changed, 2780 insertions(+), 3 deletions(-) create mode 100644 examples/disabled_apis/.gitignore create mode 100644 examples/disabled_apis/Makefile create mode 100644 examples/disabled_apis/README.md create mode 120000 examples/disabled_apis/auto.mk create mode 100644 examples/disabled_apis/expected_test_vectors.h create mode 100644 examples/disabled_apis/main.c create mode 120000 examples/disabled_apis/mldsa_native create mode 120000 examples/disabled_apis/test_only_rng create mode 100644 examples/disabled_apis_native/.gitignore create mode 100644 examples/disabled_apis_native/Makefile create mode 100644 examples/disabled_apis_native/README.md create mode 120000 examples/disabled_apis_native/auto.mk create mode 120000 examples/disabled_apis_native/expected_test_vectors.h create mode 120000 examples/disabled_apis_native/main.c create mode 120000 examples/disabled_apis_native/mldsa_native create mode 120000 examples/disabled_apis_native/test_only_rng diff --git a/.github/actions/config-variations/action.yml b/.github/actions/config-variations/action.yml index 661b6db44..7ddb5926f 100644 --- a/.github/actions/config-variations/action.yml +++ b/.github/actions/config-variations/action.yml @@ -31,7 +31,7 @@ runs: acvp: true opt: ${{ inputs.opt }} examples: true - extra_args: "--exclude-example basic_deterministic" + extra_args: "--exclude-example basic_deterministic --exclude-example disabled_apis --exclude-example disabled_apis_native" - name: "REDUCE_RAM" if: ${{ inputs.tests == 'all' || contains(inputs.tests, 'reduce-ram') }} uses: ./.github/actions/multi-functest @@ -60,7 +60,7 @@ runs: alloc: true opt: ${{ inputs.opt }} examples: true - extra_args: "--exclude-example basic_deterministic" + extra_args: "--exclude-example basic_deterministic --exclude-example disabled_apis --exclude-example disabled_apis_native" - name: "PCT enabled + broken" if: ${{ inputs.tests == 'all' || contains(inputs.tests, 'pct-enabled-broken') }} shell: bash diff --git a/Makefile b/Makefile index cb88f9b79..7752483aa 100644 --- a/Makefile +++ b/Makefile @@ -278,7 +278,9 @@ EXAMPLE_DIRS := \ examples/monolithic_build_multilevel \ examples/monolithic_build_multilevel_native \ examples/multilevel_build \ - examples/multilevel_build_native + examples/multilevel_build_native \ + examples/disabled_apis \ + examples/disabled_apis_native EXAMPLE_CLEAN_TARGETS := $(EXAMPLE_DIRS:%=clean-%) diff --git a/examples/README.md b/examples/README.md index 61fac1119..1c0fd0a8b 100644 --- a/examples/README.md +++ b/examples/README.md @@ -47,6 +47,11 @@ custom FIPS-202 backend. See [monolithic_build](monolithic_build) for an example of how to build mldsa-native (with C backend) from a single auto-generated compilation unit. +## Monobuild (with native code) + +See [monolithic_build_native](monolithic_build_native) for an example of how to build mldsa-native from a single +auto-generated compilation unit, while also linking in assembly from the native backends. + ## Multi-level monobuild (C only) See [monolithic_build_multilevel](monolithic_build_multilevel) for an example of how to build all security levels of @@ -57,3 +62,14 @@ mldsa-native (with C backend) inside a single compilation unit, sharing the leve See [monolithic_build_multilevel_native](monolithic_build_multilevel_native) for an example of how to build all security levels of mldsa-native inside a single compilation unit, sharing the level-independent code, while also linking in assembly from the native backends. + +## Disabled APIs (C only) + +See [disabled_apis](disabled_apis) for an example of building mldsa-native with individual APIs disabled +(`MLD_CONFIG_NO_KEYPAIR_API`, `MLD_CONFIG_NO_SIGN_API`, `MLD_CONFIG_NO_VERIFY_API`). +Tests all four disabled API combinations across all three parameter sets. + +## Disabled APIs (with native code) + +See [disabled_apis_native](disabled_apis_native) for the same as above, but with native arithmetic and +FIPS-202 backends enabled. diff --git a/examples/disabled_apis/.gitignore b/examples/disabled_apis/.gitignore new file mode 100644 index 000000000..eb98a94f1 --- /dev/null +++ b/examples/disabled_apis/.gitignore @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT + +build diff --git a/examples/disabled_apis/Makefile b/examples/disabled_apis/Makefile new file mode 100644 index 000000000..2de4a7bcc --- /dev/null +++ b/examples/disabled_apis/Makefile @@ -0,0 +1,113 @@ +# Copyright (c) The mlkem-native project authors +# Copyright (c) The mldsa-native project authors +# SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT + +.PHONY: build run clean +.DEFAULT_GOAL := all + +CC ?= gcc + +# Adjust CFLAGS if needed +CFLAGS := \ + -Wall \ + -Wextra \ + -Werror=unused-result \ + -Wpedantic \ + -Werror \ + -Wmissing-prototypes \ + -Wshadow \ + -Wpointer-arith \ + -Wredundant-decls \ + -Wconversion \ + -Wsign-conversion \ + -Wno-long-long \ + -Wno-unknown-pragmas \ + -Wno-unused-command-line-argument \ + -O3 \ + -fomit-frame-pointer \ + -std=c99 \ + -pedantic \ + -MMD \ + $(CFLAGS) + +AUTO ?= 1 +include auto.mk + +# Append cross-prefix for cross compilation +ifeq (,$(findstring $(CROSS_PREFIX),$(CC))) +CC := $(CROSS_PREFIX)$(CC) +endif + +MLD_SOURCE=$(wildcard \ + mldsa_native/src/*.c \ + mldsa_native/src/**/*.c \ + mldsa_native/src/**/**/*.c \ + mldsa_native/src/**/**/**/*.c) + +INC=-Imldsa_native +RNG_SOURCE=$(wildcard test_only_rng/*.c) +ALL_SOURCE=$(MLD_SOURCE) $(RNG_SOURCE) main.c + +BUILD_DIR=build + +CFLAGS += -DMLD_CONFIG_NAMESPACE_PREFIX=mldsa + +# Disabled API flags +KEYGEN_ONLY_FLAGS = -DMLD_CONFIG_NO_SIGN_API -DMLD_CONFIG_NO_VERIFY_API +SIGN_ONLY_FLAGS = -DMLD_CONFIG_NO_KEYPAIR_API -DMLD_CONFIG_NO_VERIFY_API +VERIFY_ONLY_FLAGS = -DMLD_CONFIG_NO_KEYPAIR_API -DMLD_CONFIG_NO_SIGN_API +SIGN_VERIFY_FLAGS = -DMLD_CONFIG_NO_KEYPAIR_API + +# Per-target CFLAGS for each combination +$(BUILD_DIR)/test_keygen_only_44: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44 $(KEYGEN_ONLY_FLAGS) +$(BUILD_DIR)/test_keygen_only_65: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65 $(KEYGEN_ONLY_FLAGS) +$(BUILD_DIR)/test_keygen_only_87: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87 $(KEYGEN_ONLY_FLAGS) +$(BUILD_DIR)/test_sign_only_44: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44 $(SIGN_ONLY_FLAGS) +$(BUILD_DIR)/test_sign_only_65: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65 $(SIGN_ONLY_FLAGS) +$(BUILD_DIR)/test_sign_only_87: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87 $(SIGN_ONLY_FLAGS) +$(BUILD_DIR)/test_verify_only_44: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44 $(VERIFY_ONLY_FLAGS) +$(BUILD_DIR)/test_verify_only_65: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65 $(VERIFY_ONLY_FLAGS) +$(BUILD_DIR)/test_verify_only_87: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87 $(VERIFY_ONLY_FLAGS) +$(BUILD_DIR)/test_sign_verify_44: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44 $(SIGN_VERIFY_FLAGS) +$(BUILD_DIR)/test_sign_verify_65: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65 $(SIGN_VERIFY_FLAGS) +$(BUILD_DIR)/test_sign_verify_87: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87 $(SIGN_VERIFY_FLAGS) + +ALL_BINARIES = \ + $(BUILD_DIR)/test_keygen_only_44 \ + $(BUILD_DIR)/test_keygen_only_65 \ + $(BUILD_DIR)/test_keygen_only_87 \ + $(BUILD_DIR)/test_sign_only_44 \ + $(BUILD_DIR)/test_sign_only_65 \ + $(BUILD_DIR)/test_sign_only_87 \ + $(BUILD_DIR)/test_verify_only_44 \ + $(BUILD_DIR)/test_verify_only_65 \ + $(BUILD_DIR)/test_verify_only_87 \ + $(BUILD_DIR)/test_sign_verify_44 \ + $(BUILD_DIR)/test_sign_verify_65 \ + $(BUILD_DIR)/test_sign_verify_87 + +$(ALL_BINARIES): $(ALL_SOURCE) + echo "$@" + mkdir -p $(BUILD_DIR) + $(CC) $(CFLAGS) $(INC) $^ -o $@ + +all: build + +build: $(ALL_BINARIES) + +run: $(ALL_BINARIES) + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_keygen_only_44 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_keygen_only_65 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_keygen_only_87 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_sign_only_44 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_sign_only_65 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_sign_only_87 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_verify_only_44 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_verify_only_65 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_verify_only_87 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_sign_verify_44 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_sign_verify_65 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_sign_verify_87 + +clean: + rm -rf $(BUILD_DIR) diff --git a/examples/disabled_apis/README.md b/examples/disabled_apis/README.md new file mode 100644 index 000000000..286bf1fea --- /dev/null +++ b/examples/disabled_apis/README.md @@ -0,0 +1,29 @@ +[//]: # (SPDX-License-Identifier: CC-BY-4.0) + +# Disabled APIs + +This directory tests building mldsa-native with individual APIs disabled +via `MLD_CONFIG_NO_KEYPAIR_API`, `MLD_CONFIG_NO_SIGN_API`, and +`MLD_CONFIG_NO_VERIFY_API`. + +## Use Case + +Use these configuration options when you only need a subset of ML-DSA +functionality and want to minimize code size. + +## What is tested + +For each parameter set (44, 65, 87), the following configurations are +built and tested: + +- **keygen_only**: `MLD_CONFIG_NO_SIGN_API` + `MLD_CONFIG_NO_VERIFY_API` +- **sign_only**: `MLD_CONFIG_NO_KEYPAIR_API` + `MLD_CONFIG_NO_VERIFY_API` +- **verify_only**: `MLD_CONFIG_NO_KEYPAIR_API` + `MLD_CONFIG_NO_SIGN_API` +- **sign_verify**: `MLD_CONFIG_NO_KEYPAIR_API` + +## Usage + +```bash +make build # Build all 12 variants +make run # Run all 12 variants +``` diff --git a/examples/disabled_apis/auto.mk b/examples/disabled_apis/auto.mk new file mode 120000 index 000000000..ce5c161cb --- /dev/null +++ b/examples/disabled_apis/auto.mk @@ -0,0 +1 @@ +../../test/mk/auto.mk \ No newline at end of file diff --git a/examples/disabled_apis/expected_test_vectors.h b/examples/disabled_apis/expected_test_vectors.h new file mode 100644 index 000000000..b5e619e01 --- /dev/null +++ b/examples/disabled_apis/expected_test_vectors.h @@ -0,0 +1,2360 @@ +/* + * Copyright (c) The mldsa-native project authors + * SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT + */ + +/* + * Expected test vectors generated using the deterministic RNG from + * test_only_rng/notrandombytes with the same message, context, and + * RNG state as in the basic example. + */ + +#ifndef EXPECTED_TEST_VECTORS_H +#define EXPECTED_TEST_VECTORS_H + +#include + +#if MLD_CONFIG_PARAMETER_SET == 44 +const uint8_t expected_pk[] = { + 0xe1, 0xae, 0xd9, 0xfe, 0x3c, 0x2c, 0xb5, 0x70, 0xd1, 0x82, 0x51, 0x08, + 0x12, 0x3c, 0x36, 0x39, 0xb5, 0xe3, 0x73, 0xf6, 0x5f, 0x8c, 0xed, 0x56, + 0x26, 0x15, 0xc7, 0xe1, 0xea, 0x48, 0xce, 0x8e, 0xcb, 0x58, 0xb2, 0xe7, + 0x6b, 0x3b, 0x41, 0x26, 0xee, 0x2a, 0x06, 0x1b, 0x47, 0x09, 0xe7, 0x43, + 0x28, 0x4e, 0xbd, 0xbf, 0xdf, 0x7b, 0x8b, 0x0d, 0xe6, 0x9b, 0xb2, 0x68, + 0x2c, 0xf6, 0xd7, 0x51, 0x26, 0x05, 0x2f, 0x86, 0xb9, 0x7c, 0xfa, 0xa0, + 0x76, 0x97, 0x6d, 0xee, 0x97, 0xf1, 0x15, 0xed, 0x1e, 0x51, 0xe2, 0x23, + 0x43, 0xa0, 0x25, 0x41, 0x96, 0xd8, 0x47, 0x6f, 0xc5, 0xbd, 0xff, 0xc5, + 0x9b, 0xb8, 0x2a, 0x9d, 0xff, 0x43, 0x2c, 0x89, 0x6c, 0x2a, 0x92, 0xf5, + 0xe0, 0xa9, 0xb0, 0xfd, 0x8a, 0xc4, 0xb7, 0x1f, 0xc5, 0x8b, 0x61, 0xec, + 0x38, 0xf6, 0xca, 0x49, 0x16, 0x29, 0xa1, 0xab, 0x74, 0x01, 0xcb, 0x6d, + 0xa6, 0x53, 0x64, 0x76, 0x79, 0x6f, 0x06, 0xb7, 0xea, 0xf8, 0xa7, 0x49, + 0x78, 0x97, 0xae, 0x4b, 0xc7, 0x4f, 0x91, 0x10, 0x37, 0x7f, 0x67, 0x11, + 0xe9, 0x71, 0xa3, 0xb5, 0xa7, 0x6c, 0x3f, 0xda, 0x73, 0xb6, 0x11, 0x55, + 0x1c, 0xcd, 0xfc, 0xe3, 0x0f, 0xb4, 0xe1, 0x90, 0x88, 0xc0, 0xb1, 0xbf, + 0xbe, 0xaa, 0x59, 0x3a, 0x9d, 0x0e, 0x4d, 0xe7, 0xa1, 0x5a, 0x3b, 0x49, + 0x9a, 0x48, 0x87, 0xfa, 0xec, 0x94, 0x5f, 0x86, 0x7a, 0x20, 0x89, 0x55, + 0x43, 0x69, 0x14, 0xf2, 0xb2, 0x95, 0x73, 0xb0, 0xda, 0xfa, 0xfe, 0x57, + 0xe2, 0xa0, 0x02, 0xbc, 0x15, 0x56, 0xc3, 0xf6, 0xc3, 0xf8, 0xe9, 0x11, + 0xed, 0x14, 0x03, 0xb0, 0xfa, 0x85, 0x92, 0x9e, 0x46, 0x01, 0xeb, 0x8e, + 0x9f, 0xcd, 0xad, 0x71, 0x72, 0x83, 0x2c, 0x4a, 0xf5, 0xe6, 0x8a, 0xcc, + 0x66, 0x68, 0x79, 0x7d, 0x5d, 0x91, 0xb3, 0xd9, 0x2c, 0xd8, 0x92, 0x1c, + 0x0d, 0xeb, 0x53, 0xfe, 0x90, 0x4a, 0x08, 0x1f, 0xf2, 0xa9, 0xdd, 0xb7, + 0xf2, 0xcf, 0x0d, 0x28, 0xb5, 0x0a, 0xe3, 0xf7, 0x22, 0xb3, 0x7f, 0x3c, + 0x3e, 0x55, 0x31, 0xe5, 0xd0, 0x61, 0x02, 0xcd, 0x3c, 0x7a, 0x06, 0xcf, + 0xce, 0xed, 0x1e, 0xf8, 0xd7, 0x15, 0x77, 0x38, 0x41, 0xa8, 0x5d, 0xcf, + 0x32, 0x51, 0x27, 0xa3, 0x3c, 0xba, 0x53, 0x1b, 0x46, 0xc9, 0x40, 0xa2, + 0x04, 0x95, 0xee, 0xf0, 0x4e, 0x6f, 0x1c, 0xe3, 0x61, 0x33, 0xa7, 0x9e, + 0x01, 0xfe, 0x98, 0xa9, 0x7a, 0x87, 0xf3, 0x0b, 0x66, 0x0b, 0x68, 0xee, + 0x9f, 0xfa, 0x15, 0xc7, 0xf8, 0x70, 0xb1, 0x7e, 0x4f, 0x9a, 0xf7, 0x2c, + 0xab, 0x37, 0x0b, 0xcd, 0x88, 0xe0, 0x87, 0x13, 0x80, 0x22, 0x50, 0x05, + 0xa4, 0xb6, 0x44, 0xfc, 0x9a, 0xef, 0xfb, 0xb3, 0x4f, 0x71, 0xeb, 0x7c, + 0x4e, 0x07, 0xc8, 0x4b, 0xb9, 0xba, 0x73, 0x5a, 0x6c, 0x65, 0xdb, 0x69, + 0x72, 0x7a, 0xdf, 0x27, 0x44, 0x9f, 0x86, 0xe1, 0xdc, 0x01, 0xd1, 0xc9, + 0x43, 0x27, 0x34, 0xc8, 0x9f, 0x0b, 0xae, 0x1d, 0x3e, 0x43, 0xfe, 0x27, + 0x8d, 0xf4, 0xd0, 0x8b, 0xe6, 0xf4, 0x8e, 0x90, 0x05, 0xe7, 0x31, 0x50, + 0x3f, 0x7a, 0x39, 0x8c, 0x1a, 0xd3, 0x76, 0x51, 0x36, 0x45, 0x10, 0x9f, + 0x89, 0x8b, 0x04, 0xcf, 0xe7, 0xde, 0x5e, 0xb7, 0xcf, 0x25, 0x19, 0xdc, + 0x19, 0xaf, 0xe3, 0x3c, 0x0c, 0x8f, 0x55, 0x71, 0x73, 0x6d, 0x5f, 0x4e, + 0xb5, 0x0e, 0x09, 0x68, 0x21, 0x40, 0x41, 0x52, 0x8f, 0xb8, 0xfa, 0x1f, + 0xa0, 0x17, 0xc2, 0x7e, 0x75, 0x3c, 0xbf, 0xcf, 0x08, 0x41, 0x1f, 0x6b, + 0x8d, 0xcc, 0xb4, 0x71, 0xc6, 0x4a, 0xfe, 0xee, 0xb6, 0xcc, 0x4c, 0x56, + 0x91, 0x95, 0x2b, 0xac, 0x46, 0x71, 0xab, 0x60, 0xe8, 0xdb, 0xb7, 0x00, + 0x92, 0x4a, 0xcd, 0x62, 0x05, 0x46, 0x19, 0x55, 0xd0, 0xec, 0xbb, 0x79, + 0x20, 0x77, 0x41, 0xc7, 0x39, 0x90, 0x87, 0x45, 0x17, 0xbd, 0xa1, 0xb2, + 0x43, 0xfb, 0x92, 0xd4, 0xa9, 0xb8, 0x47, 0x4d, 0xa5, 0x66, 0x90, 0xa7, + 0x21, 0x3c, 0x34, 0x96, 0x9e, 0x7b, 0xc6, 0x9e, 0x51, 0x9d, 0x40, 0x7f, + 0x38, 0xb6, 0x36, 0x9b, 0x1d, 0x77, 0x68, 0x48, 0xae, 0x10, 0xc5, 0x13, + 0xf0, 0xaf, 0x9d, 0xa0, 0x71, 0x5b, 0x7b, 0xbb, 0x39, 0xd6, 0xe6, 0x5b, + 0xe5, 0x91, 0x20, 0x2c, 0x0a, 0xea, 0x74, 0x28, 0xe0, 0xeb, 0x0a, 0x86, + 0xad, 0xd7, 0x3a, 0xce, 0x7d, 0xdb, 0x31, 0x59, 0xae, 0xc3, 0x48, 0x9f, + 0xae, 0x5a, 0x79, 0x1e, 0x97, 0x0f, 0x45, 0x86, 0xd6, 0x71, 0x4b, 0x72, + 0xc7, 0x51, 0x84, 0xf1, 0x0d, 0x9b, 0x40, 0xc5, 0x55, 0xbf, 0x56, 0xe8, + 0x6c, 0xbe, 0x0a, 0x98, 0xb5, 0x87, 0x55, 0xa4, 0x51, 0x1b, 0xa2, 0x4b, + 0xa7, 0xa8, 0x7f, 0xdf, 0xb7, 0x35, 0x90, 0xcd, 0x65, 0x73, 0x30, 0x59, + 0x6d, 0xc5, 0x4f, 0x45, 0xeb, 0x10, 0x8e, 0x22, 0x72, 0x34, 0x4a, 0xa8, + 0x03, 0xb5, 0x3f, 0x62, 0x16, 0x2e, 0xa8, 0xd5, 0xf4, 0x95, 0x58, 0x03, + 0x4a, 0xb5, 0x60, 0x42, 0x18, 0x95, 0x2a, 0xbd, 0xd3, 0x46, 0xdc, 0x2b, + 0x0c, 0xea, 0xf9, 0x74, 0x86, 0xdf, 0x8b, 0xb9, 0x0e, 0x8c, 0x18, 0xea, + 0xd6, 0x06, 0x49, 0x96, 0xf3, 0x46, 0x51, 0xb5, 0xc1, 0xf1, 0x4a, 0x62, + 0x25, 0x71, 0x4d, 0x2c, 0x73, 0x33, 0x6f, 0x57, 0xf7, 0xbf, 0x9d, 0xdd, + 0x80, 0x6b, 0xb8, 0x85, 0x77, 0x6f, 0x4b, 0x36, 0xcd, 0xbf, 0x21, 0x78, + 0x40, 0x72, 0xc9, 0xfb, 0x71, 0x39, 0x8c, 0x90, 0xe1, 0x2a, 0x6f, 0x2d, + 0xa8, 0xe8, 0xa1, 0x65, 0x2a, 0x49, 0xe5, 0xfb, 0x19, 0x11, 0xd6, 0x96, + 0x9f, 0xe8, 0x49, 0x27, 0xb7, 0x9e, 0x77, 0x68, 0x0d, 0x79, 0xab, 0x1d, + 0x22, 0x51, 0xee, 0xa6, 0x2f, 0x9b, 0x85, 0xf0, 0xe9, 0x85, 0x7e, 0x90, + 0xf9, 0x18, 0x02, 0xc3, 0xc1, 0xa2, 0x84, 0x8a, 0xcd, 0x95, 0xa2, 0x52, + 0x86, 0x71, 0x02, 0xc2, 0x09, 0x5a, 0x9c, 0x52, 0xfb, 0x34, 0x00, 0x05, + 0xdd, 0x83, 0x24, 0xb8, 0x30, 0x8f, 0xf0, 0x7c, 0xd8, 0x19, 0x81, 0x56, + 0x53, 0xa6, 0x4e, 0xa0, 0x92, 0x2a, 0xa8, 0xc5, 0x55, 0xe3, 0xc8, 0xa3, + 0x44, 0xaf, 0x0a, 0x69, 0x02, 0x46, 0x73, 0xfd, 0xdd, 0xe5, 0xbb, 0x11, + 0x7e, 0xc9, 0x9e, 0x3a, 0x1f, 0x27, 0x44, 0x1f, 0xb4, 0x30, 0xde, 0xa1, + 0x33, 0xf1, 0xe9, 0x74, 0x2a, 0xb2, 0x8c, 0xae, 0xb8, 0x7f, 0xb8, 0x52, + 0x56, 0x04, 0x85, 0x80, 0x54, 0xe4, 0x0d, 0xfc, 0xe6, 0x39, 0xde, 0x47, + 0x5b, 0x03, 0xba, 0xd6, 0xa4, 0xee, 0xd0, 0xcf, 0x7a, 0xd1, 0x75, 0xad, + 0xf8, 0xca, 0xac, 0x2e, 0x6d, 0x74, 0x89, 0x7c, 0x36, 0x87, 0x6a, 0x13, + 0xa6, 0x6f, 0xee, 0x84, 0x87, 0x97, 0xfc, 0x06, 0x2f, 0x82, 0x89, 0x47, + 0xa6, 0x07, 0xf7, 0xb6, 0x10, 0x96, 0x2e, 0xc5, 0x68, 0x6d, 0xf7, 0x86, + 0x93, 0x60, 0x96, 0xf6, 0x19, 0x77, 0xab, 0x17, 0x38, 0xf3, 0xea, 0x15, + 0x31, 0xac, 0xe7, 0x20, 0xaf, 0x5c, 0x55, 0x07, 0x25, 0x5a, 0xfc, 0x4d, + 0x7c, 0x00, 0x53, 0x09, 0x8b, 0x00, 0x50, 0x90, 0x50, 0xa1, 0x90, 0xcb, + 0x57, 0x00, 0xca, 0x19, 0xd0, 0xf6, 0xa3, 0x81, 0xd3, 0x48, 0xf1, 0xd3, + 0xb5, 0xe1, 0xaa, 0x96, 0xd8, 0xde, 0x32, 0x99, 0x98, 0x32, 0xa2, 0x9e, + 0x26, 0xbe, 0xaa, 0x7d, 0xb7, 0x75, 0xd8, 0x3d, 0xb4, 0x12, 0x27, 0x06, + 0x8d, 0xfb, 0xde, 0x60, 0xc0, 0x87, 0xcb, 0x0c, 0xf7, 0x2e, 0x80, 0x5c, + 0xc9, 0x5d, 0xdb, 0xbe, 0x57, 0x97, 0xf9, 0x69, 0x67, 0xa0, 0xdb, 0x96, + 0xe1, 0x2d, 0xa1, 0x9a, 0xc9, 0x92, 0x32, 0x2e, 0xcf, 0x24, 0x0b, 0xd1, + 0x13, 0xa3, 0xe1, 0x1a, 0xcc, 0x97, 0x24, 0x98, 0x62, 0xaa, 0xb1, 0x09, + 0x90, 0xc5, 0x5d, 0x6f, 0xdc, 0x9a, 0x95, 0xc0, 0x2b, 0x61, 0x0a, 0x11, + 0xa7, 0x8f, 0x69, 0x75, 0x93, 0x62, 0xf7, 0xd1, 0xb4, 0x60, 0xd5, 0x9c, + 0x49, 0x4b, 0x6d, 0x94, 0x50, 0xee, 0x14, 0xe4, 0x4f, 0xac, 0x37, 0xbf, + 0x82, 0xac, 0xb0, 0x51, 0xd2, 0x7d, 0x20, 0xad, 0xef, 0xe4, 0x81, 0x19, + 0x98, 0x28, 0xf7, 0x44, 0xf8, 0x41, 0x68, 0xfa, 0x54, 0x0a, 0x55, 0xa6, + 0xcf, 0xcd, 0x29, 0x7d, 0xc9, 0x0a, 0xa7, 0x44, 0x2b, 0xf0, 0x0b, 0xbe, + 0x80, 0x36, 0x60, 0xe2, 0x13, 0x42, 0xd0, 0x7f, 0x6a, 0xf9, 0xc5, 0x10, + 0x5a, 0x3c, 0x7e, 0x28, 0xe2, 0xf6, 0x4b, 0x1f, 0x10, 0x4c, 0x13, 0x47, + 0xcb, 0x18, 0x0c, 0x0e, 0xba, 0xd7, 0x70, 0x81, 0x80, 0xd5, 0x58, 0xe5, + 0xc7, 0xaf, 0x2a, 0x67, 0x33, 0x0d, 0xd1, 0xe1, 0x82, 0xe1, 0x62, 0x6a, + 0xc1, 0xcf, 0xc9, 0x26, 0x21, 0x56, 0x3c, 0xaa, 0x6f, 0xe5, 0xc3, 0x94, + 0x72, 0x55, 0x8e, 0xc8, 0x0b, 0xbc, 0x0b, 0x88, 0x4f, 0xd8, 0x1e, 0x09, + 0xa5, 0x7d, 0xe4, 0x38, 0xa7, 0x59, 0x04, 0x98, 0xe3, 0x7c, 0x49, 0x77, + 0x21, 0x0b, 0xe6, 0x81, 0x60, 0xc1, 0xfe, 0x02, 0xd8, 0x13, 0xd9, 0xbd, + 0x8a, 0x28, 0xfd, 0x14, 0xc6, 0xc9, 0x2b, 0x2c, 0x20, 0x5a, 0x0a, 0x8b, + 0x70, 0x62, 0x88, 0x64, 0x0a, 0x84, 0xfa, 0x3d, 0x1d, 0xfd, 0x85, 0x5b, + 0x6f, 0xc6, 0x9f, 0xca, 0xa4, 0xa2, 0x73, 0xed, 0x66, 0x9b, 0x3d, 0x6d, + 0x8e, 0xc6, 0x5f, 0x0e, 0x27, 0x46, 0x5e, 0xc8, 0x3f, 0xaf, 0x31, 0xad, + 0x21, 0x80, 0x02, 0x23, 0xc8, 0x4f, 0x9b, 0xfe, 0xc8, 0xc3, 0x1e, 0x47, + 0xc4, 0x65, 0x61, 0x7f, 0xa3, 0x79, 0x31, 0x12, 0x3c, 0xee, 0x14, 0xf1, + 0x96, 0x1e, 0xc2, 0x5d, 0x2c, 0x91, 0x9e, 0xb0, 0xb7, 0x0a, 0x31, 0xa4, + 0x80, 0xbd, 0xd3, 0x75, +}; + +const uint8_t expected_sk[] = { + 0xe1, 0xae, 0xd9, 0xfe, 0x3c, 0x2c, 0xb5, 0x70, 0xd1, 0x82, 0x51, 0x08, + 0x12, 0x3c, 0x36, 0x39, 0xb5, 0xe3, 0x73, 0xf6, 0x5f, 0x8c, 0xed, 0x56, + 0x26, 0x15, 0xc7, 0xe1, 0xea, 0x48, 0xce, 0x8e, 0xdc, 0x0e, 0xb3, 0x14, + 0x4c, 0x75, 0xb6, 0x5a, 0x54, 0x78, 0x67, 0xaa, 0x07, 0x18, 0x6c, 0xba, + 0x72, 0x59, 0x9c, 0x8d, 0x8c, 0x90, 0xf3, 0x1b, 0x15, 0x84, 0xb8, 0x17, + 0xef, 0x02, 0x12, 0x26, 0x29, 0x6c, 0xca, 0x62, 0x24, 0x81, 0x5e, 0xa4, + 0xa4, 0x02, 0x0b, 0xa8, 0x4f, 0xfc, 0x34, 0x9d, 0x30, 0xe9, 0x6a, 0xd2, + 0xc9, 0x20, 0x1a, 0x14, 0xcd, 0xf1, 0x17, 0xbe, 0x63, 0x52, 0x77, 0x3f, + 0x4c, 0x12, 0x0e, 0x07, 0x1a, 0x39, 0xff, 0xbb, 0xb8, 0x83, 0xa9, 0xf4, + 0x80, 0x7a, 0x46, 0x9c, 0xfb, 0xaf, 0xad, 0x27, 0xa0, 0x06, 0x6f, 0x11, + 0xc1, 0xe1, 0x0e, 0x16, 0x0f, 0xf2, 0x36, 0xf1, 0x1b, 0x91, 0x08, 0x4b, + 0x36, 0x85, 0x18, 0xc4, 0x31, 0x1b, 0x29, 0x64, 0x04, 0x27, 0x6e, 0x19, + 0x14, 0x62, 0x04, 0x49, 0x92, 0xe0, 0x84, 0x41, 0x0b, 0x92, 0x29, 0xe1, + 0x28, 0x2d, 0x93, 0xb6, 0x09, 0x23, 0xa5, 0x30, 0x89, 0x82, 0x80, 0x00, + 0x24, 0x44, 0x18, 0x30, 0x70, 0x00, 0x27, 0x90, 0xca, 0x28, 0x4a, 0x88, + 0x12, 0x41, 0x5b, 0xb8, 0x68, 0x12, 0x06, 0x6a, 0x18, 0x37, 0x01, 0x01, + 0x06, 0x25, 0xda, 0x16, 0x85, 0x08, 0x05, 0x32, 0x81, 0x20, 0x8c, 0x61, + 0x14, 0x4e, 0xc0, 0xc0, 0x8c, 0xc9, 0x32, 0x30, 0x11, 0x27, 0x2a, 0x23, + 0xb8, 0x90, 0x88, 0x90, 0x20, 0x14, 0x32, 0x89, 0x13, 0xa3, 0x44, 0x14, + 0x27, 0x62, 0x0c, 0xb4, 0x0c, 0x50, 0xa0, 0x45, 0x41, 0x42, 0x4c, 0x19, + 0x11, 0x22, 0x1a, 0xb4, 0x71, 0xa0, 0x30, 0x32, 0x44, 0x42, 0x44, 0xa2, + 0x42, 0x32, 0xe3, 0x94, 0x51, 0x63, 0xa4, 0x08, 0x54, 0x12, 0x88, 0x5b, + 0x00, 0x71, 0x10, 0x42, 0x62, 0x52, 0x10, 0x68, 0xd3, 0xc6, 0x81, 0x92, + 0x02, 0x64, 0xdb, 0x22, 0x89, 0xcc, 0x90, 0x70, 0x82, 0x18, 0x0d, 0x8a, + 0x04, 0x6e, 0x12, 0x35, 0x60, 0x1c, 0x04, 0x12, 0x02, 0x05, 0x62, 0xc3, + 0x20, 0x42, 0xdb, 0x20, 0x84, 0x12, 0xb9, 0x05, 0xa3, 0x16, 0x42, 0x09, + 0x08, 0x05, 0x89, 0x44, 0x2c, 0x20, 0x89, 0x69, 0x22, 0xa8, 0x10, 0x08, + 0x93, 0x85, 0x9a, 0x42, 0x4a, 0x21, 0x89, 0x60, 0xd1, 0x48, 0x4c, 0x13, + 0x46, 0x11, 0x8c, 0x40, 0x85, 0x0b, 0x14, 0x46, 0x09, 0x25, 0x2d, 0xcc, + 0x32, 0x80, 0x4b, 0x32, 0x66, 0x50, 0xb4, 0x2c, 0xc8, 0xa2, 0x30, 0x24, + 0x06, 0x61, 0xa1, 0x98, 0x65, 0xe3, 0x86, 0x28, 0xa1, 0x22, 0x49, 0x19, + 0xa7, 0x40, 0x49, 0x10, 0x41, 0x4a, 0x44, 0x02, 0x03, 0x42, 0x08, 0x4b, + 0x46, 0x80, 0x1a, 0x13, 0x52, 0x00, 0xa5, 0x24, 0x80, 0x34, 0x8e, 0x8b, + 0x82, 0x08, 0x92, 0x86, 0x4c, 0x23, 0x40, 0x6a, 0x09, 0x94, 0x25, 0x24, + 0x19, 0x28, 0x04, 0xb1, 0x00, 0x51, 0xa2, 0x6d, 0xe0, 0x36, 0x08, 0x12, + 0x09, 0x69, 0x43, 0x42, 0x4e, 0x91, 0x84, 0x91, 0xca, 0x48, 0x64, 0x0a, + 0xb6, 0x24, 0xe2, 0x42, 0x4d, 0x08, 0xa8, 0x09, 0x01, 0x86, 0x50, 0x00, + 0x18, 0x29, 0x1c, 0x82, 0x09, 0x13, 0xa7, 0x81, 0x60, 0xc8, 0x0d, 0x43, + 0x14, 0x40, 0xe0, 0xc8, 0x51, 0xc0, 0x96, 0x51, 0x5b, 0x34, 0x4d, 0xd3, + 0x84, 0x0c, 0x02, 0x22, 0x8a, 0xcb, 0xc0, 0x2d, 0x21, 0x26, 0x50, 0x92, + 0x00, 0x20, 0x1a, 0x36, 0x44, 0xa0, 0x36, 0x84, 0xe3, 0xb2, 0x21, 0x24, + 0x25, 0x65, 0xc8, 0x34, 0x82, 0x0c, 0x49, 0x8d, 0x03, 0xa0, 0x6d, 0x20, + 0x05, 0x32, 0x91, 0x36, 0x29, 0x1b, 0x33, 0x91, 0x13, 0x92, 0x40, 0x04, + 0x32, 0x10, 0x1b, 0x97, 0x29, 0x0a, 0x90, 0x40, 0x99, 0x22, 0x12, 0x9c, + 0xa8, 0x91, 0xcc, 0xa8, 0x69, 0x02, 0x16, 0x60, 0x14, 0x16, 0x40, 0x81, + 0x10, 0x12, 0x00, 0x35, 0x68, 0xe1, 0xa6, 0x20, 0x1a, 0xa2, 0x40, 0xd1, + 0x36, 0x46, 0xd0, 0x30, 0x10, 0x0c, 0x92, 0x91, 0x21, 0x07, 0x66, 0x5b, + 0x82, 0x50, 0x60, 0x10, 0x61, 0x21, 0x17, 0x61, 0x59, 0x10, 0x02, 0x00, + 0x96, 0x2c, 0x5c, 0x86, 0x0d, 0x0b, 0x90, 0x09, 0xdb, 0x20, 0x26, 0xc1, + 0x94, 0x80, 0x18, 0xc7, 0x65, 0x03, 0x16, 0x22, 0x1a, 0x36, 0x70, 0x49, + 0x14, 0x2c, 0xe4, 0xc6, 0x64, 0x81, 0x84, 0x81, 0xa1, 0x86, 0x68, 0x14, + 0x89, 0x44, 0x9c, 0x94, 0x80, 0xd4, 0x98, 0x4c, 0x12, 0xc0, 0x64, 0x21, + 0x34, 0x69, 0x44, 0x12, 0x51, 0x82, 0x88, 0x29, 0x93, 0x16, 0x20, 0x59, + 0x10, 0x61, 0xd8, 0x04, 0x0d, 0xa0, 0x92, 0x91, 0x9c, 0x34, 0x2a, 0x03, + 0xc9, 0x8d, 0x84, 0x14, 0x0c, 0x44, 0xc8, 0x21, 0x52, 0x80, 0x88, 0x48, + 0x18, 0x12, 0x61, 0x42, 0x08, 0xd3, 0x32, 0x46, 0x04, 0x13, 0x6c, 0xda, + 0xb4, 0x6d, 0x9c, 0xc0, 0x49, 0x1b, 0x28, 0x52, 0x10, 0x48, 0x66, 0x90, + 0xc2, 0x90, 0x51, 0x46, 0x41, 0x4a, 0x80, 0x49, 0xc8, 0xb0, 0x0d, 0x0b, + 0x34, 0x91, 0x62, 0x34, 0x05, 0x12, 0xb8, 0x25, 0x23, 0x88, 0x0d, 0x43, + 0x28, 0x88, 0x8b, 0xa8, 0x51, 0xd9, 0x08, 0x81, 0x02, 0xa2, 0x91, 0xd8, + 0x30, 0x00, 0xd9, 0x10, 0x86, 0x14, 0x09, 0x2a, 0x51, 0x38, 0x6a, 0x9b, + 0x12, 0x60, 0x61, 0x06, 0x0d, 0x1c, 0xc0, 0x21, 0x64, 0x20, 0x4c, 0x54, + 0x46, 0x48, 0x9b, 0xb6, 0x10, 0x61, 0xc4, 0x60, 0xe3, 0x04, 0x91, 0xdc, + 0x26, 0x4c, 0xa4, 0xa2, 0x49, 0x90, 0x98, 0x8c, 0x11, 0x44, 0x65, 0x1c, + 0xa7, 0x89, 0x02, 0x19, 0x71, 0xcb, 0x34, 0x51, 0x88, 0xb8, 0x04, 0xdc, + 0x18, 0x81, 0xd4, 0x00, 0x4c, 0x88, 0xb2, 0x09, 0x1a, 0xa9, 0x2d, 0xe2, + 0x38, 0x29, 0x91, 0xc2, 0x40, 0x00, 0x93, 0x10, 0xc2, 0x40, 0x20, 0xe1, + 0xa6, 0x70, 0x24, 0x18, 0x2a, 0x21, 0x26, 0x82, 0x48, 0x28, 0x91, 0xc4, + 0xa2, 0x01, 0x5a, 0x82, 0x88, 0x08, 0x84, 0x48, 0x88, 0xc6, 0x49, 0x00, + 0x20, 0x52, 0x64, 0x34, 0x06, 0xd4, 0x40, 0x26, 0xdc, 0x02, 0x51, 0x21, + 0x90, 0x0d, 0x1c, 0x87, 0x41, 0xc3, 0x08, 0x50, 0x18, 0x20, 0x11, 0x21, + 0x14, 0x49, 0x09, 0x01, 0x64, 0x20, 0x98, 0x80, 0x12, 0xb5, 0x8c, 0x90, + 0x38, 0x06, 0xc1, 0xa8, 0x81, 0x81, 0x16, 0x41, 0xe3, 0xb8, 0x49, 0x43, + 0x30, 0x72, 0x22, 0x24, 0x20, 0x20, 0x48, 0x05, 0x0a, 0x19, 0x89, 0xc2, + 0xc8, 0x50, 0xdb, 0x90, 0x28, 0x58, 0x34, 0x61, 0x5e, 0x21, 0xa6, 0x23, + 0x17, 0x51, 0xcf, 0xb5, 0xdf, 0xae, 0xf7, 0x2a, 0xb6, 0xbe, 0x6c, 0x54, + 0x1e, 0xfe, 0xb6, 0x31, 0x4e, 0xea, 0xd7, 0x4b, 0x09, 0x06, 0xc5, 0x9d, + 0x8d, 0xb1, 0x59, 0x17, 0xb1, 0x7b, 0x5a, 0x80, 0x23, 0x65, 0x6a, 0x97, + 0x8f, 0xf1, 0x23, 0xf9, 0x61, 0xff, 0xde, 0x8a, 0xaa, 0x62, 0x51, 0xea, + 0x16, 0x7d, 0x4a, 0x72, 0x38, 0x76, 0x47, 0xfd, 0x47, 0x32, 0xdb, 0x05, + 0x24, 0xd2, 0xf9, 0x6b, 0x8e, 0x58, 0x0e, 0x7b, 0x63, 0xca, 0x6e, 0xc5, + 0x22, 0x75, 0xf3, 0x22, 0x6b, 0x53, 0xb6, 0x4e, 0x19, 0x63, 0x78, 0xfa, + 0xb4, 0x76, 0x70, 0xda, 0x5a, 0x37, 0x49, 0xd5, 0x8c, 0xff, 0x7e, 0x19, + 0x38, 0x93, 0x51, 0xb1, 0xf4, 0x4d, 0x9f, 0xfc, 0x72, 0xaf, 0xd4, 0xfa, + 0x57, 0xcf, 0x17, 0x72, 0x72, 0xd4, 0xb7, 0x40, 0x5b, 0x42, 0x49, 0x15, + 0xa6, 0xe5, 0x6b, 0x94, 0x8f, 0x1f, 0x61, 0xc5, 0xc2, 0x0a, 0x25, 0x12, + 0xf7, 0x46, 0x40, 0x63, 0xb6, 0x84, 0x04, 0x09, 0x05, 0x0b, 0xd9, 0x3e, + 0x07, 0xc9, 0x13, 0x0d, 0x5f, 0x25, 0x55, 0x50, 0xe0, 0x9a, 0x7e, 0xb6, + 0x5e, 0x31, 0x30, 0xaa, 0x85, 0x29, 0x93, 0x8b, 0xe4, 0xe4, 0x91, 0x61, + 0x1c, 0x80, 0x11, 0x89, 0x67, 0x76, 0xec, 0xc9, 0x25, 0x3a, 0xeb, 0x1a, + 0x20, 0xe8, 0xcd, 0xc4, 0xe9, 0xf9, 0x75, 0x2e, 0xa3, 0x59, 0xa5, 0xe9, + 0xc7, 0x9b, 0x17, 0x03, 0x78, 0x4a, 0x22, 0xd3, 0x0d, 0x96, 0xee, 0xa9, + 0x85, 0x12, 0x2c, 0xda, 0x5e, 0x05, 0x63, 0x1c, 0x34, 0x78, 0x21, 0x12, + 0x6f, 0xd1, 0x0e, 0x85, 0x04, 0xd5, 0xff, 0xe5, 0xc9, 0xb1, 0x80, 0xa8, + 0x7a, 0x9b, 0x6a, 0xe4, 0x42, 0xaa, 0xfd, 0x4b, 0x3d, 0xa6, 0xd3, 0x3d, + 0x05, 0x8d, 0x0e, 0x1e, 0x4a, 0x78, 0x65, 0x47, 0x91, 0x00, 0xb8, 0xdc, + 0xe8, 0xcb, 0x36, 0xea, 0x7d, 0xc8, 0xf4, 0xb1, 0x46, 0x08, 0x3d, 0xe4, + 0x8b, 0x0f, 0x32, 0xf1, 0x77, 0xfa, 0xbf, 0x06, 0xb8, 0x02, 0xa2, 0xab, + 0x1d, 0x66, 0x15, 0x74, 0xee, 0xd3, 0x83, 0x18, 0xf1, 0xc4, 0x68, 0xcf, + 0x50, 0x33, 0x84, 0x2c, 0x69, 0x68, 0x9a, 0x45, 0xc7, 0x27, 0x49, 0xd6, + 0xff, 0x0e, 0x09, 0x5c, 0xa5, 0x90, 0x12, 0xe5, 0x80, 0x8f, 0x3f, 0x5e, + 0x70, 0xff, 0xc5, 0x90, 0xf4, 0xcd, 0x9a, 0xe4, 0x85, 0x07, 0x9d, 0xcd, + 0xcc, 0x7f, 0xd1, 0xa1, 0xb1, 0xb1, 0x7b, 0x23, 0x1c, 0xfe, 0xc2, 0xc9, + 0x73, 0xd4, 0x9c, 0x81, 0xfb, 0xc5, 0x1e, 0xd7, 0x97, 0xfb, 0xc9, 0x46, + 0x76, 0x81, 0x33, 0xa2, 0x53, 0x5a, 0x19, 0x72, 0x7c, 0x90, 0x26, 0x02, + 0x38, 0x48, 0x7b, 0x94, 0x14, 0x22, 0x30, 0xf9, 0xa5, 0x03, 0x01, 0x74, + 0x1f, 0xc1, 0xd9, 0x09, 0x9c, 0xd2, 0x48, 0xd9, 0xc3, 0xab, 0x2b, 0xfd, + 0x1b, 0xd6, 0xa6, 0x5f, 0x54, 0x8b, 0x16, 0x83, 0x39, 0xf8, 0x9d, 0x6d, + 0xe9, 0x89, 0x5f, 0xd2, 0xf2, 0x3b, 0xf6, 0x78, 0xca, 0x3b, 0x71, 0x40, + 0x3d, 0x97, 0xd7, 0xca, 0xfd, 0x40, 0x79, 0xc1, 0x72, 0xc9, 0xac, 0x93, + 0x09, 0x48, 0x2e, 0x71, 0x73, 0xfc, 0x5c, 0x04, 0x80, 0xc7, 0x90, 0x4c, + 0x23, 0xa1, 0xf7, 0xe0, 0x3f, 0x21, 0x6a, 0xee, 0xa8, 0xec, 0xda, 0x9e, + 0x8e, 0x5e, 0xa7, 0x87, 0xc8, 0xb1, 0x43, 0x1c, 0xde, 0xd0, 0x0d, 0xdb, + 0x8a, 0x0b, 0x97, 0xb1, 0x5a, 0xce, 0x7f, 0xdb, 0xea, 0x3f, 0x06, 0x40, + 0xcb, 0x28, 0xb5, 0xcc, 0xd6, 0xc8, 0xd6, 0x03, 0xf9, 0x6a, 0x68, 0x75, + 0xa2, 0xde, 0x06, 0xba, 0x80, 0x9e, 0xfe, 0x25, 0x0a, 0x87, 0x38, 0x2b, + 0x0d, 0xf9, 0x89, 0x87, 0x4f, 0x5b, 0x3b, 0x90, 0xe3, 0x9e, 0x02, 0x61, + 0xeb, 0x78, 0xf8, 0x54, 0x9c, 0x0b, 0x53, 0x41, 0x48, 0x90, 0x8f, 0x71, + 0xd1, 0x6e, 0xf2, 0x5b, 0x5f, 0xdd, 0xf3, 0xb7, 0x21, 0xda, 0xdd, 0x3a, + 0x85, 0x4b, 0x20, 0x5b, 0xcf, 0x45, 0x40, 0x0f, 0x79, 0xcd, 0x9a, 0xbc, + 0x19, 0x5d, 0x16, 0xab, 0xf0, 0xd2, 0x42, 0x20, 0x3a, 0x61, 0xa0, 0x59, + 0x58, 0x3b, 0xb8, 0xf1, 0x65, 0x92, 0x98, 0x13, 0x0c, 0x26, 0x95, 0x05, + 0x71, 0xb3, 0xae, 0xd8, 0xab, 0x35, 0x17, 0x19, 0x8d, 0x17, 0xb4, 0xc0, + 0x81, 0x36, 0x76, 0x4f, 0xc4, 0xce, 0x4b, 0x4f, 0x53, 0xc1, 0x97, 0x23, + 0x6b, 0xf7, 0x5d, 0x2b, 0x69, 0x64, 0xbf, 0x85, 0xb0, 0x9f, 0x56, 0x20, + 0x99, 0x96, 0xbe, 0x04, 0x3b, 0xaa, 0x37, 0x3f, 0xc7, 0x1d, 0x7d, 0xfc, + 0x4e, 0x42, 0x78, 0xc1, 0x09, 0xa8, 0x81, 0x13, 0xfc, 0x9a, 0xfc, 0x73, + 0xa6, 0xbf, 0x2d, 0x0e, 0x4c, 0x72, 0xd3, 0xac, 0xbf, 0x66, 0xea, 0xd7, + 0xf9, 0xb0, 0x67, 0x10, 0x75, 0x60, 0x56, 0x1f, 0x9d, 0x91, 0xc6, 0x71, + 0x94, 0xb6, 0xfc, 0xe3, 0x93, 0xf8, 0xa8, 0xc3, 0x69, 0x8e, 0x55, 0xc2, + 0x0a, 0xbf, 0x8e, 0x66, 0x4a, 0x30, 0x70, 0xd2, 0xbe, 0xdf, 0x9a, 0xc9, + 0x07, 0x83, 0xe0, 0xc8, 0xbe, 0x09, 0xa1, 0x65, 0xae, 0x07, 0xc4, 0x63, + 0xfe, 0x88, 0x60, 0x48, 0xc2, 0x3a, 0x2f, 0x47, 0x86, 0x2d, 0x93, 0x2c, + 0x04, 0xd1, 0xd4, 0x2d, 0x98, 0xc8, 0x7f, 0xfb, 0x9a, 0xc9, 0x1e, 0xcb, + 0xba, 0x42, 0x48, 0xfb, 0x90, 0x59, 0x77, 0xc3, 0x0f, 0x8d, 0x7d, 0x46, + 0x8f, 0xbb, 0xa3, 0x0f, 0x90, 0x90, 0x10, 0x37, 0x96, 0x46, 0x3b, 0x91, + 0xe7, 0x8d, 0xe1, 0xea, 0x45, 0x78, 0xb1, 0xff, 0xb5, 0xe6, 0xf6, 0xf0, + 0xa3, 0x12, 0xa1, 0x4f, 0x7a, 0xc8, 0x6e, 0x8f, 0xe9, 0x50, 0x18, 0x5a, + 0x55, 0x91, 0x6f, 0xf6, 0xaf, 0x2e, 0x2a, 0xb8, 0xf8, 0x5b, 0xf8, 0x3f, + 0x70, 0xb0, 0x68, 0x14, 0x4c, 0x2b, 0xa2, 0x3e, 0x75, 0x74, 0xae, 0x14, + 0x1d, 0x0f, 0x17, 0xce, 0x26, 0xa7, 0xab, 0x2f, 0x2f, 0x8a, 0xb8, 0x09, + 0x38, 0xd0, 0xbe, 0xed, 0x70, 0x3b, 0xc5, 0x24, 0xc5, 0x3d, 0x56, 0x8a, + 0x5c, 0x08, 0xdb, 0xe8, 0x37, 0x68, 0xe5, 0xea, 0xaf, 0x9d, 0x0b, 0x8f, + 0x8f, 0x0e, 0x02, 0xa3, 0xbe, 0x0f, 0xc2, 0x9a, 0x9d, 0xe1, 0x97, 0x46, + 0xc2, 0xd8, 0xa4, 0xef, 0x99, 0x8b, 0x45, 0x67, 0xbd, 0xd8, 0xc1, 0xb8, + 0x93, 0x8e, 0x9a, 0xe3, 0x73, 0x62, 0x1f, 0x33, 0x83, 0x7b, 0xc5, 0x0f, + 0x56, 0xc1, 0x4f, 0x10, 0x0e, 0x73, 0x7f, 0x5b, 0x70, 0x0e, 0xd6, 0xc0, + 0xc1, 0xc0, 0x29, 0xe1, 0xd3, 0xa2, 0x63, 0xb5, 0x8a, 0x8e, 0x64, 0x31, + 0x0b, 0x1a, 0xf1, 0x87, 0xef, 0xda, 0x2e, 0x2e, 0xc0, 0x1f, 0x47, 0x4b, + 0xf7, 0xce, 0xe0, 0x21, 0x2f, 0x73, 0x04, 0xe6, 0xc4, 0xd6, 0x62, 0x55, + 0xbc, 0xd8, 0xc5, 0x36, 0x77, 0xce, 0x29, 0x35, 0x15, 0x81, 0x53, 0xd5, + 0xc6, 0x3a, 0x4b, 0x76, 0x21, 0x3a, 0xe7, 0x5e, 0xa3, 0xac, 0xb4, 0xfd, + 0xdb, 0x90, 0xa0, 0x75, 0x32, 0x49, 0x41, 0xcc, 0x75, 0x2e, 0x54, 0x2b, + 0xeb, 0xb6, 0xd6, 0xbe, 0xb4, 0xb0, 0x32, 0x71, 0x62, 0x29, 0xef, 0xd9, + 0x7f, 0x4c, 0xc4, 0x47, 0x95, 0x3d, 0xf5, 0x9e, 0x4c, 0x06, 0x3b, 0xfc, + 0xcc, 0x58, 0xdf, 0x6f, 0xf6, 0x46, 0xf7, 0x2a, 0xaf, 0xcd, 0x43, 0xd2, + 0x60, 0x7f, 0x98, 0x6c, 0x9b, 0x9d, 0xc1, 0xc3, 0x85, 0x56, 0x6a, 0x2b, + 0x97, 0x5b, 0x7b, 0x73, 0xab, 0xa6, 0x54, 0x7c, 0x4b, 0x0c, 0x13, 0xb6, + 0x1c, 0x0e, 0x89, 0x9f, 0xef, 0xff, 0x0d, 0xd2, 0x91, 0x94, 0xf6, 0xf4, + 0x74, 0x3d, 0x74, 0x50, 0xb5, 0x24, 0x00, 0x81, 0x09, 0x8d, 0x0e, 0x6e, + 0x8b, 0x37, 0x47, 0xe6, 0x0d, 0xa9, 0xc5, 0xa2, 0x0e, 0x24, 0xf4, 0xa8, + 0x9b, 0x74, 0x3b, 0x26, 0xec, 0xde, 0x94, 0x2f, 0x31, 0xe2, 0x1e, 0xd0, + 0x87, 0xce, 0xe4, 0x3f, 0xba, 0x93, 0x01, 0x23, 0x9e, 0xc7, 0x4d, 0xd4, + 0x64, 0x15, 0x6c, 0x66, 0xa7, 0x65, 0x1d, 0x7e, 0x0a, 0xe3, 0x5e, 0xb8, + 0x42, 0x70, 0x70, 0x76, 0x92, 0xff, 0xaf, 0xe9, 0xd3, 0x69, 0x26, 0xf2, + 0x23, 0x8f, 0xee, 0xda, 0x73, 0x6a, 0xac, 0x0a, 0xe6, 0x3a, 0x15, 0x16, + 0xdb, 0xef, 0x17, 0x7d, 0x14, 0x3a, 0x44, 0x8a, 0x1c, 0x13, 0x76, 0xd4, + 0x0f, 0x3a, 0x32, 0x04, 0x65, 0xab, 0x4b, 0xd0, 0x99, 0xbb, 0x63, 0x83, + 0x7d, 0xf2, 0xbc, 0xa8, 0x60, 0x55, 0x8d, 0x2d, 0x81, 0x02, 0x01, 0x35, + 0x1c, 0xa9, 0xf9, 0xf5, 0x6d, 0x96, 0x85, 0x54, 0x10, 0xf7, 0xa1, 0xf2, + 0x1f, 0x53, 0x16, 0x06, 0x2e, 0x34, 0x8a, 0x31, 0x66, 0x3a, 0xc0, 0xcc, + 0xcc, 0x67, 0x0d, 0xee, 0x60, 0x4c, 0xf9, 0xe2, 0x19, 0x3d, 0x4d, 0x1a, + 0xec, 0x9c, 0x41, 0x9a, 0x6a, 0x5c, 0x1f, 0xbd, 0xaa, 0x5d, 0x0f, 0x1c, + 0x79, 0xf5, 0xc1, 0xaf, 0xf5, 0xb6, 0xcf, 0xfe, 0xe1, 0x9c, 0xf9, 0xf1, + 0xf4, 0x0e, 0x10, 0xbc, 0xc6, 0x03, 0xee, 0x96, 0xfc, 0x0c, 0x38, 0xae, + 0x24, 0x21, 0x73, 0x85, 0xba, 0xf7, 0xf0, 0xa8, 0xff, 0xbe, 0xae, 0xd3, + 0x0c, 0xdd, 0xa8, 0xdd, 0x91, 0x57, 0x28, 0x25, 0xd3, 0x41, 0x14, 0xe2, + 0x80, 0x15, 0x84, 0xe3, 0x85, 0xd2, 0x06, 0x81, 0x02, 0x99, 0xfe, 0x96, + 0x07, 0xd9, 0x44, 0x9e, 0x26, 0xed, 0x0d, 0xde, 0x8c, 0xc7, 0x8d, 0x11, + 0xfc, 0xc1, 0x50, 0x01, 0xaf, 0xd5, 0x2e, 0xd0, 0x75, 0x7a, 0x5f, 0x48, + 0x25, 0x26, 0x5f, 0x10, 0x3c, 0x42, 0x49, 0xb1, 0x16, 0x87, 0x36, 0xd3, + 0xd6, 0x7a, 0x02, 0xd1, 0x97, 0xd0, 0x08, 0x80, 0x23, 0xdf, 0x12, 0xa0, + 0xf7, 0x0d, 0x08, 0x26, 0x56, 0x35, 0x44, 0x2b, 0xd6, 0xd5, 0xa3, 0x77, + 0xa5, 0x8c, 0xa7, 0x21, 0x02, 0xc5, 0x86, 0x10, 0x15, 0x50, 0x31, 0x8f, + 0xb8, 0x41, 0x65, 0xef, 0xca, 0xe4, 0xfa, 0x13, 0x07, 0x53, 0x51, 0x12, + 0x75, 0xf8, 0x42, 0xd6, 0x07, 0x43, 0x41, 0xe0, 0xeb, 0x5b, 0xaf, 0x88, + 0xc7, 0x49, 0x0a, 0xbf, 0x54, 0x04, 0x81, 0x0d, 0xc8, 0xe8, 0x11, 0x9e, + 0xfa, 0xb9, 0x75, 0x17, 0x54, 0x7a, 0x56, 0xba, 0x27, 0x28, 0x7b, 0x66, + 0x80, 0xde, 0xad, 0x97, 0xe3, 0xda, 0x56, 0x13, 0x3a, 0x36, 0xad, 0xe7, + 0xb0, 0xe4, 0x1a, 0xcb, 0xfd, 0x20, 0x3f, 0xd8, 0x47, 0xb2, 0x8f, 0xa3, + 0x4b, 0x3e, 0xe7, 0x9e, 0x15, 0x08, 0x34, 0xc9, 0xd9, 0x79, 0x10, 0x5a, + 0x13, 0x1f, 0xcc, 0x37, 0xe7, 0x29, 0x95, 0xc7, 0xf8, 0xbd, 0xe2, 0x36, + 0x17, 0x43, 0x88, 0xf0, 0x1c, 0x5d, 0x8d, 0x1a, 0x27, 0x66, 0x03, 0x93, + 0x50, 0x33, 0xec, 0x04, 0x58, 0x22, 0x24, 0x91, 0x23, 0x50, 0xcd, 0x3a, + 0x82, 0x6b, 0xd9, 0x0e, 0x8e, 0x65, 0x8e, 0x09, 0x38, 0x57, 0x0e, 0xd3, + 0x84, 0x58, 0xb5, 0x98, 0xb0, 0x1f, 0x0b, 0xa1, 0xfd, 0xdf, 0x03, 0x8a, + 0x4e, 0xfe, 0xe5, 0x61, 0xcd, 0xb5, 0x08, 0xb3, 0x88, 0xf6, 0xd8, 0x2c, + 0x6b, 0xe1, 0x92, 0xcc, 0x60, 0x22, 0x72, 0x1e, 0xe3, 0x7c, 0x33, 0x21, + 0x01, 0x68, 0x41, 0xb1, 0x92, 0xc6, 0x7f, 0xe9, 0x1d, 0xa8, 0xb0, 0x60, + 0xf5, 0xe7, 0xd5, 0xd9, 0x72, 0x50, 0x45, 0x5e, 0x75, 0xb6, 0x68, 0x02, + 0x15, 0xbf, 0xf1, 0x1f, 0x6d, 0xe7, 0x11, 0xdb, 0x7e, 0x54, 0x10, 0x92, + 0x21, 0x21, 0x8e, 0x71, 0x85, 0xb4, 0x3f, 0x06, 0xb5, 0x3d, 0xef, 0x59, + 0xb7, 0x61, 0x24, 0xc4, 0x5e, 0xcd, 0x4a, 0x23, 0x18, 0x0a, 0xff, 0x01, + 0x54, 0xab, 0xe9, 0x4a, 0x57, 0x99, 0x5f, 0xd9, 0xfc, 0xfc, 0x5c, 0xda, + 0x89, 0xc1, 0xd1, 0x75, 0xe5, 0x63, 0xd8, 0x0c, 0xc4, 0x94, 0x30, 0x00, + 0xf3, 0x19, 0x23, 0x7a, 0xee, 0x11, 0xae, 0xab, 0x6a, 0x6d, 0xc6, 0x7d, + 0x9f, 0x1c, 0x2d, 0x44, 0x9e, 0x3d, 0xe3, 0x6b, 0x50, 0xc3, 0x89, 0x88, + 0x9c, 0xfb, 0x11, 0x42, 0x1a, 0x94, 0x43, 0x28, 0xc8, 0xc2, 0x5a, 0x32, + 0x5e, 0x5e, 0xfb, 0xb7, 0x69, 0x37, 0x0b, 0x54, 0x4c, 0x1b, 0x65, 0xef, + 0xae, 0xe4, 0xfa, 0xc0, 0x26, 0xe1, 0x10, 0xf9, 0xda, 0xca, 0x14, 0xf3, + 0x82, 0xdf, 0x63, 0xdf, 0x9c, 0x50, 0xb0, 0xe8, 0x54, 0xab, 0xaa, 0x75, + 0xc0, 0x6e, 0x0b, 0x39, 0x2b, 0x5c, 0x40, 0xa4, 0x45, 0x31, 0xbf, 0x4f, + 0x7c, 0x63, 0xd0, 0xed, 0x86, 0x25, 0x6c, 0x4e, 0xd6, 0x51, 0x86, 0xe7, + 0x38, 0x9e, 0xdc, 0x05, +}; + +const uint8_t expected_sig[] = { + 0x27, 0x5e, 0xbe, 0x2d, 0x23, 0x1a, 0x76, 0xc5, 0xd9, 0x77, 0xcb, 0x62, + 0x25, 0x04, 0xdb, 0x23, 0x31, 0xa9, 0xa8, 0xcd, 0xbc, 0xde, 0xf2, 0x20, + 0xfd, 0xa7, 0xb5, 0xf5, 0x59, 0xae, 0xe6, 0xdd, 0x62, 0xfa, 0x34, 0x96, + 0x4f, 0x1d, 0xcd, 0x84, 0x82, 0xee, 0xc1, 0x74, 0x96, 0x3d, 0x98, 0xd9, + 0x42, 0x9d, 0xd0, 0x77, 0x9c, 0xf9, 0x9e, 0x0e, 0xa7, 0xcb, 0x70, 0xeb, + 0xe7, 0xcd, 0xce, 0x8c, 0xdc, 0x37, 0x15, 0x95, 0x0e, 0x24, 0x70, 0x4f, + 0x33, 0x6e, 0x4f, 0xad, 0xed, 0x4d, 0xf3, 0xe5, 0x38, 0xc1, 0xcd, 0xbb, + 0xde, 0xf1, 0xd2, 0x0d, 0xd6, 0x6b, 0xa3, 0x68, 0x92, 0x4c, 0x4b, 0x4f, + 0x89, 0xa0, 0xa8, 0xc8, 0x36, 0x93, 0x91, 0x17, 0xe7, 0x16, 0xed, 0xcb, + 0xdc, 0xf6, 0x28, 0x13, 0x32, 0x60, 0x14, 0xe0, 0x28, 0x7a, 0x69, 0x05, + 0x1d, 0xf7, 0x3b, 0xdf, 0x18, 0x0c, 0xaf, 0xba, 0x46, 0xf1, 0x5e, 0xd4, + 0xd3, 0xd0, 0x8e, 0x9a, 0xe2, 0xac, 0xdd, 0x0e, 0x5f, 0xb1, 0x69, 0xe2, + 0x74, 0x77, 0x2e, 0x52, 0xf9, 0x11, 0x3d, 0xd8, 0xe5, 0x36, 0x6f, 0x7d, + 0x7d, 0xde, 0x7c, 0xa7, 0x1d, 0x37, 0xdf, 0x6d, 0x5e, 0xea, 0xc8, 0xc0, + 0x72, 0x3f, 0x79, 0xbd, 0x0b, 0x6d, 0x7f, 0x9a, 0x15, 0x90, 0xda, 0xc1, + 0xae, 0xce, 0xf3, 0x44, 0x35, 0x5e, 0x83, 0x86, 0x7e, 0x89, 0x18, 0xa7, + 0x97, 0x8e, 0x87, 0x7c, 0x15, 0xd2, 0xd2, 0x7e, 0xf2, 0xc8, 0x29, 0x4f, + 0x70, 0x0f, 0xa6, 0xd4, 0x76, 0xe8, 0xdd, 0x7d, 0x7a, 0x2d, 0xfe, 0x0a, + 0x0c, 0x5c, 0xb1, 0xef, 0xec, 0x1a, 0x32, 0xca, 0x87, 0xff, 0x6b, 0xb1, + 0xa0, 0xe1, 0x2e, 0x01, 0x52, 0xb2, 0xb8, 0x74, 0x34, 0xb3, 0xfb, 0x15, + 0x0f, 0x17, 0xca, 0x74, 0xc1, 0xc1, 0x61, 0x86, 0x40, 0x38, 0x58, 0xba, + 0x82, 0x26, 0x66, 0x33, 0xa4, 0x52, 0xf3, 0xb5, 0x36, 0x60, 0xd8, 0x5a, + 0x8d, 0x9d, 0x28, 0x18, 0x3a, 0x68, 0x34, 0x2a, 0xa2, 0xe2, 0xb5, 0x39, + 0xed, 0x7d, 0xe5, 0xbe, 0x46, 0xb9, 0x04, 0x0c, 0xf3, 0xef, 0x88, 0x6e, + 0x9d, 0x6f, 0x23, 0xe2, 0x44, 0xe5, 0x2e, 0x3a, 0x7a, 0x1d, 0x49, 0x0f, + 0xdd, 0xcd, 0xd6, 0x4e, 0x0d, 0x0b, 0xc3, 0x35, 0xf2, 0xd1, 0x5d, 0x73, + 0x5d, 0x07, 0xca, 0x5c, 0xbd, 0x14, 0xec, 0x57, 0xb3, 0xbd, 0x37, 0xe7, + 0xdf, 0x06, 0x7d, 0xe0, 0x58, 0x4a, 0xcf, 0x7a, 0xc5, 0xa7, 0x24, 0x62, + 0x6f, 0x09, 0x75, 0x69, 0x74, 0x7f, 0xdf, 0xc8, 0x69, 0x5c, 0x20, 0x10, + 0x3a, 0xe8, 0x01, 0x12, 0xa3, 0xfb, 0xda, 0x4c, 0x3a, 0x0d, 0x3c, 0x3e, + 0x26, 0xe0, 0xa6, 0x7f, 0xb2, 0x6b, 0x0b, 0x68, 0x0a, 0x68, 0x86, 0xb1, + 0xfa, 0x61, 0x3a, 0xe8, 0x77, 0xdc, 0x42, 0xf7, 0xf4, 0x39, 0x9a, 0x40, + 0x58, 0x71, 0xc7, 0x0f, 0xf4, 0x0e, 0xc5, 0x1e, 0xe0, 0x28, 0x45, 0x7d, + 0xba, 0x84, 0xe4, 0x34, 0x69, 0xf9, 0xa5, 0x8a, 0x80, 0x43, 0xc0, 0x8d, + 0x04, 0x33, 0x43, 0xb8, 0xd7, 0x5d, 0x93, 0xed, 0x0f, 0x31, 0x6a, 0x4d, + 0xbf, 0xb7, 0x44, 0x41, 0x1b, 0xd4, 0xac, 0x9d, 0x83, 0x66, 0x08, 0x92, + 0xad, 0x3c, 0x0e, 0x1a, 0xe8, 0xd4, 0xe1, 0x5c, 0x63, 0xcf, 0x27, 0x48, + 0x5a, 0x8f, 0xc5, 0x6f, 0x83, 0x6b, 0x6f, 0xe8, 0xda, 0x1f, 0xba, 0xe9, + 0x7e, 0x11, 0xab, 0x8b, 0x4e, 0xc1, 0x9e, 0x23, 0x69, 0x1f, 0x42, 0x40, + 0xad, 0xbb, 0xfb, 0x4f, 0xe2, 0x50, 0xc9, 0x46, 0xe7, 0x15, 0x15, 0xf8, + 0x61, 0x09, 0x2a, 0x0b, 0x37, 0x43, 0xd4, 0x98, 0x5f, 0xc8, 0x4d, 0x06, + 0xe7, 0x0c, 0x3f, 0x83, 0x59, 0xd5, 0xcd, 0x2d, 0xde, 0x1e, 0x3a, 0x87, + 0x4e, 0xf7, 0x0a, 0x3c, 0x84, 0x72, 0x47, 0x11, 0x02, 0x6c, 0xe8, 0x93, + 0xcd, 0x24, 0xe9, 0x23, 0x86, 0x78, 0x53, 0xe0, 0xc6, 0x2f, 0xba, 0xa7, + 0xed, 0xaf, 0xba, 0x42, 0x80, 0x0d, 0xe6, 0xae, 0xda, 0xed, 0xbc, 0x65, + 0x21, 0x6d, 0x13, 0x90, 0x61, 0xb4, 0x05, 0x7b, 0x07, 0x86, 0xd7, 0x89, + 0x30, 0x9c, 0xc1, 0x9a, 0x41, 0x4d, 0xe8, 0x2b, 0x35, 0x21, 0x3a, 0x8a, + 0x60, 0x83, 0x1a, 0x97, 0x10, 0x98, 0xb6, 0xe1, 0x6b, 0xb5, 0xb1, 0xa1, + 0x36, 0x34, 0x60, 0x1b, 0x96, 0x5d, 0x1f, 0x2a, 0xd8, 0xf2, 0x94, 0xdd, + 0x58, 0x3d, 0x0f, 0xbe, 0x9d, 0xfc, 0xf5, 0x24, 0xb1, 0xd2, 0xc3, 0x36, + 0xef, 0xdb, 0x8e, 0x97, 0x3c, 0x9a, 0x4f, 0x48, 0xe3, 0x84, 0x91, 0xd8, + 0x39, 0x91, 0xf6, 0x55, 0xeb, 0x62, 0x51, 0x3d, 0x8f, 0x55, 0x60, 0x5e, + 0x00, 0xe0, 0xd2, 0xc7, 0x66, 0x51, 0xf1, 0xe2, 0xb7, 0x43, 0xc3, 0xe6, + 0x12, 0x9a, 0xe5, 0x84, 0xe0, 0x10, 0x76, 0xc7, 0x75, 0x6e, 0xa6, 0xee, + 0x11, 0xe4, 0xaf, 0xbd, 0x8a, 0x4f, 0x1d, 0x05, 0x29, 0x4f, 0xce, 0xa5, + 0x73, 0x92, 0x57, 0x7e, 0x0d, 0x11, 0xbc, 0xf8, 0x74, 0x4d, 0xf7, 0xb9, + 0x40, 0x0d, 0x5a, 0xa1, 0x19, 0x76, 0x4a, 0xae, 0x21, 0x16, 0xd4, 0x3f, + 0x76, 0xbf, 0x27, 0xbd, 0x2f, 0xe4, 0x25, 0x21, 0x00, 0x4e, 0xcc, 0x7c, + 0xc6, 0x57, 0xa4, 0xbf, 0xf1, 0x56, 0x90, 0xe0, 0xa4, 0xa3, 0xee, 0xcf, + 0x43, 0x4f, 0xda, 0x77, 0x47, 0x51, 0x79, 0x6a, 0x29, 0xb4, 0x2c, 0xdf, + 0xca, 0x47, 0xcb, 0xb8, 0x82, 0x7e, 0x44, 0x62, 0x9b, 0x8f, 0x61, 0x7b, + 0x3a, 0x93, 0x82, 0x1f, 0x69, 0xb7, 0xb1, 0xa6, 0x2c, 0xe1, 0xb2, 0x65, + 0xa0, 0x6d, 0x6f, 0xe4, 0x79, 0xd8, 0x30, 0xe0, 0xee, 0xd8, 0x83, 0x01, + 0xb2, 0x1f, 0x5c, 0x90, 0x44, 0x86, 0x48, 0x11, 0xf9, 0x11, 0xff, 0xea, + 0x45, 0x43, 0xae, 0x8a, 0x6b, 0x99, 0xf2, 0x1f, 0x02, 0x51, 0x4a, 0x35, + 0x02, 0x34, 0xd3, 0xe8, 0xda, 0xb1, 0x4b, 0xe3, 0xa5, 0x60, 0xce, 0x67, + 0xe3, 0x62, 0x59, 0xfc, 0x00, 0x0a, 0xe2, 0xfe, 0x7b, 0x1e, 0xe6, 0xf5, + 0x75, 0x19, 0x9b, 0x5e, 0xcb, 0xe6, 0xf5, 0x80, 0x9e, 0x3c, 0xb8, 0x54, + 0xd6, 0x0b, 0xfd, 0x48, 0xe0, 0xfa, 0x82, 0x2b, 0x5b, 0x26, 0xf9, 0x49, + 0xaf, 0xbe, 0x9c, 0x78, 0x73, 0xce, 0xc5, 0x65, 0xe2, 0x94, 0x2b, 0xd9, + 0xd0, 0x27, 0x3a, 0x66, 0x3e, 0xe2, 0xe0, 0x10, 0x79, 0x3d, 0xde, 0xc8, + 0x47, 0xdb, 0x1e, 0xc3, 0xe7, 0x51, 0xae, 0x59, 0xeb, 0x38, 0x66, 0x63, + 0x40, 0x8f, 0xbe, 0x1e, 0xb2, 0x2b, 0xeb, 0x64, 0x5f, 0xdd, 0x24, 0xc4, + 0x5a, 0x25, 0x59, 0xa2, 0xda, 0x4f, 0xdf, 0xf8, 0xb0, 0xb0, 0xf7, 0xcd, + 0x1f, 0x14, 0xcd, 0x09, 0x48, 0x70, 0x27, 0x1b, 0xde, 0xc4, 0xf0, 0xf3, + 0x56, 0x97, 0x8a, 0xb7, 0xf4, 0x19, 0x76, 0xe3, 0x9a, 0x33, 0x55, 0xfe, + 0x93, 0x68, 0xca, 0x1f, 0x3d, 0x44, 0x86, 0x39, 0x5d, 0x84, 0x58, 0x50, + 0xf2, 0xf1, 0xea, 0x4a, 0x5c, 0x1c, 0x74, 0xf0, 0x4b, 0xa5, 0x9c, 0x30, + 0xa0, 0x14, 0x1a, 0x80, 0xe0, 0xde, 0x3e, 0xae, 0x7f, 0x10, 0x18, 0x4a, + 0x1e, 0x9e, 0x6b, 0x75, 0x1a, 0xca, 0x08, 0x4e, 0x61, 0x72, 0x43, 0x9b, + 0x18, 0x4d, 0x2c, 0xd8, 0xb4, 0xc9, 0xea, 0x00, 0xb0, 0xdf, 0x1b, 0xcb, + 0x03, 0xc3, 0x7a, 0x27, 0xff, 0x41, 0x9d, 0xf9, 0xfd, 0xb3, 0x0c, 0xc0, + 0x48, 0x5d, 0x7c, 0xae, 0x5a, 0x72, 0x69, 0x93, 0x68, 0xe1, 0x9e, 0x9f, + 0x1f, 0x5c, 0x0a, 0x60, 0x90, 0x1a, 0x8e, 0x5a, 0x30, 0xd4, 0x2c, 0xbd, + 0xe1, 0x20, 0x51, 0xbc, 0x1c, 0x50, 0xb5, 0xf7, 0x42, 0x23, 0x35, 0x0f, + 0x92, 0xe2, 0xbb, 0x2a, 0x04, 0xa7, 0xde, 0x2e, 0x25, 0xfa, 0xed, 0x20, + 0x83, 0x9c, 0xd4, 0x56, 0xe0, 0x4d, 0x8d, 0x79, 0xa5, 0xa0, 0x6f, 0x49, + 0x62, 0x82, 0x9a, 0xa7, 0x4e, 0x54, 0x95, 0x0a, 0xc6, 0x5e, 0x27, 0x65, + 0x6d, 0x11, 0x2b, 0x35, 0x72, 0x34, 0x48, 0xd2, 0xe4, 0x9e, 0x07, 0x7d, + 0x03, 0x27, 0x15, 0x93, 0x55, 0x5c, 0x32, 0x43, 0xdb, 0x34, 0x8d, 0xbd, + 0x8d, 0x88, 0xa5, 0x24, 0x07, 0x93, 0x89, 0x37, 0xb9, 0x17, 0x15, 0xad, + 0xc7, 0x68, 0x86, 0x63, 0x0f, 0x10, 0x53, 0x8f, 0x40, 0xd3, 0x7b, 0x22, + 0x2b, 0x1a, 0x4c, 0xcb, 0x4f, 0x51, 0xf1, 0x3b, 0x19, 0xb8, 0x42, 0x53, + 0xaf, 0xf6, 0xb9, 0x57, 0x7f, 0xba, 0x8d, 0xb8, 0xb7, 0x3b, 0xe3, 0xc5, + 0xab, 0x4a, 0x26, 0x21, 0x6e, 0xce, 0x27, 0xb8, 0xc3, 0x99, 0x56, 0x14, + 0xdd, 0x5b, 0x61, 0x82, 0xbf, 0xd3, 0xc8, 0x76, 0xee, 0x22, 0xaf, 0x21, + 0x21, 0x1d, 0x4e, 0x33, 0xb5, 0x43, 0x3a, 0xfb, 0x91, 0xa0, 0xaa, 0xe3, + 0x10, 0x4a, 0x50, 0x42, 0xd4, 0x5f, 0x92, 0x0e, 0x71, 0x60, 0x4f, 0xaa, + 0xef, 0x66, 0x45, 0xfe, 0xf7, 0xc8, 0xb0, 0x73, 0x75, 0x91, 0x0b, 0x86, + 0x40, 0xa5, 0x02, 0x28, 0xf7, 0xe0, 0x1f, 0x5d, 0xe6, 0xe3, 0xa4, 0x57, + 0xbd, 0x29, 0xaa, 0x53, 0xae, 0x35, 0x30, 0x78, 0x73, 0xd6, 0xb7, 0x01, + 0x9d, 0x13, 0x50, 0xf6, 0x39, 0xa2, 0x3e, 0x03, 0x04, 0xaa, 0x6d, 0xcf, + 0x6b, 0xff, 0x9a, 0xbe, 0x3e, 0x0a, 0xd4, 0x20, 0xce, 0x42, 0x1f, 0xca, + 0x2f, 0xd3, 0x2c, 0xd1, 0xf4, 0xd2, 0x50, 0xd3, 0xa2, 0xc1, 0x1e, 0x87, + 0xbf, 0xeb, 0xb8, 0xa8, 0xd4, 0x1c, 0x96, 0xb8, 0x8e, 0xbe, 0x35, 0x5f, + 0x08, 0x28, 0x20, 0x2b, 0xdc, 0xa4, 0xf5, 0xf6, 0xde, 0xca, 0x1e, 0xcb, + 0x93, 0x3b, 0x64, 0x79, 0x00, 0x3c, 0x8d, 0xbb, 0x5c, 0x7a, 0x40, 0x14, + 0x58, 0x12, 0xa4, 0xf7, 0x6e, 0x51, 0xfb, 0xe7, 0x6f, 0x49, 0x5b, 0xc2, + 0xc9, 0x05, 0x38, 0x9c, 0x08, 0x78, 0x71, 0x27, 0x2b, 0xf5, 0xbf, 0xd6, + 0x38, 0xaa, 0x45, 0xe1, 0xe1, 0x4c, 0xfb, 0xfd, 0xb7, 0xe6, 0xcf, 0xad, + 0x9e, 0x56, 0xaf, 0x12, 0x12, 0x98, 0xe6, 0x38, 0xaa, 0xee, 0xdb, 0x9e, + 0xca, 0xe1, 0x79, 0x6d, 0x44, 0xfb, 0x19, 0x50, 0x92, 0x00, 0x06, 0x2c, + 0x24, 0x71, 0x6c, 0x34, 0x45, 0xac, 0xf9, 0x82, 0x66, 0xa8, 0x63, 0x80, + 0xa8, 0x5b, 0x21, 0x3c, 0x36, 0x71, 0x93, 0x40, 0x7b, 0xff, 0xa2, 0xd0, + 0x72, 0xb4, 0x66, 0xfa, 0xfc, 0xa0, 0xee, 0xca, 0x15, 0x73, 0x52, 0xe7, + 0x9d, 0x11, 0xd3, 0xbc, 0xab, 0x37, 0x31, 0x0e, 0xaf, 0xdc, 0x05, 0x30, + 0x79, 0x8c, 0x25, 0x75, 0x5c, 0x60, 0xc7, 0x9a, 0xfc, 0x88, 0xea, 0xe6, + 0x09, 0x9f, 0xd1, 0x4f, 0x13, 0xf4, 0x41, 0x54, 0x5b, 0x7a, 0xe4, 0x49, + 0x3c, 0x0f, 0x15, 0xe9, 0xa4, 0x85, 0xb2, 0x92, 0x07, 0xea, 0xea, 0x7c, + 0xc1, 0x6d, 0xa9, 0x03, 0xb3, 0x31, 0xce, 0x1e, 0x82, 0xca, 0x9e, 0x3c, + 0x88, 0x88, 0xc1, 0x04, 0x5f, 0xbe, 0xd5, 0x94, 0x0d, 0x67, 0x98, 0x27, + 0xd0, 0x0f, 0x43, 0xf3, 0xb3, 0xfc, 0xff, 0x24, 0xa2, 0x1e, 0x17, 0x06, + 0xb0, 0x52, 0x16, 0x7c, 0xd8, 0x49, 0x74, 0x51, 0xcf, 0x2d, 0x36, 0x16, + 0xb0, 0x88, 0xb2, 0x2b, 0x1d, 0x72, 0x70, 0xab, 0xe2, 0xf6, 0x5f, 0xa5, + 0x2d, 0x4e, 0xd1, 0x42, 0x3c, 0x83, 0x84, 0xb2, 0x56, 0xeb, 0x8d, 0xce, + 0x33, 0x46, 0xdb, 0x3d, 0x4f, 0x97, 0xea, 0x37, 0x5e, 0x0d, 0xd7, 0x4c, + 0x9a, 0x7e, 0xc9, 0x0e, 0x69, 0x4d, 0x97, 0x15, 0x1e, 0x09, 0xbe, 0x7e, + 0xff, 0xe8, 0xf5, 0xab, 0xe9, 0xe7, 0xed, 0x4b, 0x41, 0xa5, 0xf2, 0x2a, + 0x24, 0x48, 0x8b, 0x72, 0x4b, 0x9d, 0xcf, 0x45, 0xdb, 0xc0, 0xaf, 0xa8, + 0x0f, 0x0f, 0x67, 0x37, 0xd3, 0x8b, 0xe1, 0x67, 0x90, 0xd8, 0x1c, 0x58, + 0x36, 0x46, 0x51, 0x52, 0xea, 0xb4, 0x75, 0xb1, 0xcd, 0xc5, 0x39, 0x16, + 0xe0, 0xec, 0x16, 0xf7, 0xf8, 0x0f, 0x5d, 0x13, 0x84, 0x62, 0x34, 0x86, + 0x42, 0x05, 0xa8, 0x08, 0x84, 0xa9, 0x77, 0x12, 0xc1, 0x56, 0xdd, 0x28, + 0xde, 0x39, 0x33, 0x21, 0x3d, 0xbd, 0x94, 0xce, 0xe4, 0xb3, 0x17, 0x9b, + 0x09, 0x20, 0xf0, 0x25, 0xce, 0x00, 0x34, 0x8e, 0x12, 0x94, 0x74, 0x0b, + 0x16, 0xa1, 0x60, 0x76, 0x24, 0xf0, 0xbf, 0xe3, 0x3a, 0x83, 0x8f, 0x40, + 0x47, 0x2e, 0x1c, 0xd5, 0x35, 0x25, 0x87, 0xb3, 0x11, 0xdc, 0x98, 0xb0, + 0xa6, 0x5f, 0x6a, 0x05, 0x1d, 0x06, 0x8d, 0xe8, 0xb0, 0x98, 0xf0, 0x43, + 0x29, 0x84, 0xe4, 0xef, 0x34, 0x67, 0x74, 0x64, 0xe8, 0xb8, 0xf0, 0xd4, + 0x9e, 0xc1, 0x3f, 0x5f, 0xeb, 0xe0, 0x9b, 0x37, 0xf8, 0x75, 0x46, 0x47, + 0xa5, 0x3e, 0x42, 0x20, 0x50, 0xc4, 0x5d, 0xf3, 0xdf, 0x4e, 0xf8, 0x0e, + 0x1e, 0x15, 0x10, 0x3e, 0xf1, 0x68, 0xad, 0x87, 0xad, 0xe5, 0x45, 0x5e, + 0x22, 0xba, 0x2e, 0x51, 0xa0, 0xbf, 0xdc, 0x87, 0xca, 0xe4, 0x1f, 0x2f, + 0x2c, 0xae, 0xa9, 0x14, 0xd7, 0xdd, 0x01, 0xa8, 0x4f, 0x43, 0xcb, 0x84, + 0x92, 0xbf, 0xf9, 0x3d, 0xf0, 0x6b, 0x19, 0x43, 0xb0, 0xdf, 0xff, 0x94, + 0x76, 0xe2, 0x84, 0xf9, 0x31, 0x88, 0x7e, 0xc6, 0x87, 0x58, 0xbe, 0x5d, + 0x8b, 0xf8, 0xb5, 0xdc, 0x95, 0x16, 0x5f, 0xa1, 0x2c, 0xe8, 0x53, 0x36, + 0x64, 0xf5, 0x5d, 0xa0, 0x74, 0x12, 0x78, 0x59, 0x73, 0x69, 0x5a, 0x2b, + 0x36, 0x4a, 0xff, 0x5b, 0xef, 0x49, 0x2c, 0xb2, 0x9e, 0x59, 0xf0, 0x39, + 0x56, 0xe1, 0xd0, 0x1a, 0x05, 0xb2, 0x7c, 0xd1, 0x40, 0x09, 0xdf, 0x00, + 0xc9, 0x15, 0x53, 0xa2, 0xda, 0x84, 0xb5, 0x85, 0x05, 0x76, 0xa6, 0x1b, + 0xcb, 0x06, 0xb2, 0xc8, 0xa0, 0xc5, 0x23, 0x8f, 0xb0, 0xe8, 0xf5, 0xd9, + 0xd0, 0x19, 0x29, 0xfe, 0x2d, 0x9a, 0x57, 0x76, 0x5f, 0xf2, 0xef, 0x71, + 0x16, 0xee, 0x28, 0x7b, 0xe4, 0x48, 0xeb, 0xda, 0xe0, 0xd5, 0xbc, 0x0e, + 0x46, 0x6b, 0x06, 0x5d, 0xe5, 0x91, 0x2d, 0xcb, 0xc4, 0x53, 0xa6, 0x16, + 0xd5, 0xe7, 0xd8, 0xf1, 0xdd, 0x4f, 0xbb, 0xcc, 0x55, 0x67, 0x19, 0x98, + 0x94, 0x95, 0x5e, 0xd6, 0xf5, 0xf7, 0xe8, 0x6a, 0xf7, 0x20, 0x86, 0x3a, + 0x43, 0xbf, 0xe9, 0xec, 0x6b, 0x33, 0x49, 0x19, 0x43, 0xfb, 0xeb, 0x3f, + 0xf4, 0x9d, 0x29, 0x66, 0xb9, 0x6e, 0xb5, 0x15, 0x4b, 0x8d, 0x3c, 0x3c, + 0xfa, 0xf2, 0x87, 0xba, 0x61, 0x11, 0x40, 0xe6, 0xb4, 0x6f, 0xf5, 0xe1, + 0x24, 0x32, 0x69, 0x3e, 0xff, 0xf7, 0xbc, 0xee, 0x82, 0xf2, 0x9e, 0x6d, + 0x3f, 0x6c, 0xcc, 0x0f, 0x4f, 0xc3, 0xf1, 0xdb, 0x1e, 0x81, 0xd7, 0x9b, + 0x22, 0xa8, 0xa7, 0x36, 0x6d, 0xa9, 0x6f, 0x46, 0x1a, 0xa7, 0xff, 0x00, + 0x4b, 0xd8, 0xab, 0xe7, 0x50, 0x3b, 0xe9, 0xc0, 0x57, 0xec, 0x8d, 0x0c, + 0xa0, 0xee, 0x8c, 0x2a, 0x74, 0xf2, 0x94, 0xf9, 0x0c, 0x20, 0x14, 0xd9, + 0xad, 0x0d, 0x4e, 0xac, 0x35, 0x44, 0x59, 0x28, 0x24, 0x31, 0x32, 0xaa, + 0x6d, 0xc2, 0x13, 0xb9, 0xee, 0x75, 0x0c, 0x5f, 0x39, 0xef, 0x31, 0xca, + 0x28, 0x48, 0x56, 0x59, 0xfb, 0xa8, 0xd8, 0x2b, 0x70, 0x61, 0x22, 0x43, + 0x43, 0xb9, 0x60, 0x44, 0xeb, 0xf8, 0x98, 0x87, 0x25, 0x84, 0xa2, 0xaa, + 0x37, 0xd4, 0xb8, 0xd6, 0x3d, 0xa3, 0xa1, 0x4a, 0x81, 0xc2, 0xa9, 0xea, + 0xa2, 0xd6, 0x63, 0x76, 0x50, 0xeb, 0xcd, 0x19, 0x40, 0xb1, 0x7c, 0xf6, + 0xc1, 0x44, 0x01, 0x25, 0xe0, 0xdd, 0xb8, 0x39, 0xef, 0x46, 0x3d, 0x50, + 0x33, 0xed, 0xb1, 0x63, 0x65, 0xd7, 0x50, 0xe7, 0x95, 0xba, 0xab, 0xa7, + 0x14, 0xe5, 0x60, 0xcb, 0x81, 0x6e, 0x88, 0x3c, 0x06, 0x6e, 0x7d, 0x8e, + 0xe7, 0xbb, 0xa5, 0xc2, 0xbd, 0xae, 0x46, 0x8f, 0x43, 0x04, 0x29, 0xe6, + 0x17, 0x38, 0x05, 0x2d, 0x97, 0x93, 0x5b, 0xf9, 0xef, 0x4d, 0x2e, 0x75, + 0x6c, 0x69, 0xba, 0x08, 0xf2, 0x21, 0x1e, 0x21, 0xe6, 0x8a, 0x5b, 0x8c, + 0xd4, 0x8e, 0xde, 0x64, 0x9b, 0x9d, 0x54, 0x58, 0x65, 0x3e, 0xdd, 0x8a, + 0x1e, 0x81, 0x4e, 0x45, 0xe8, 0xfb, 0x20, 0xc3, 0x3a, 0xf0, 0x50, 0x1e, + 0x8a, 0x18, 0xea, 0x2b, 0xf5, 0xe1, 0xa6, 0xb6, 0xc8, 0xa0, 0x02, 0x3d, + 0x6e, 0xfa, 0x0b, 0x51, 0x95, 0x4e, 0x4c, 0x11, 0xb0, 0xc4, 0x62, 0x58, + 0xa6, 0x9c, 0x13, 0x4e, 0xbe, 0xc9, 0x29, 0x93, 0x29, 0x15, 0x5f, 0xaf, + 0x0e, 0xc3, 0xb3, 0x26, 0x3f, 0xdc, 0x4c, 0x33, 0xb8, 0x4b, 0x11, 0xae, + 0x1f, 0xd7, 0x05, 0x39, 0xcf, 0xfe, 0xc3, 0x6d, 0xf0, 0xc0, 0x77, 0x02, + 0xb8, 0x9b, 0x3d, 0x1b, 0x3d, 0x72, 0xfe, 0x7e, 0x18, 0x60, 0x9b, 0xc4, + 0x8b, 0xac, 0x25, 0x6d, 0x3b, 0x80, 0x34, 0xbc, 0x51, 0xaf, 0xf6, 0xff, + 0x66, 0x98, 0x86, 0x6e, 0x9e, 0x9a, 0xfe, 0x6d, 0x21, 0x4d, 0xf1, 0x58, + 0x3e, 0x3e, 0x43, 0xe3, 0x7e, 0x40, 0xb0, 0xb3, 0xd8, 0x12, 0xa5, 0xce, + 0x09, 0x41, 0x8c, 0x1d, 0x73, 0xcd, 0xfc, 0x63, 0xed, 0xeb, 0x08, 0x1e, + 0x34, 0xfb, 0xed, 0x75, 0xb7, 0x86, 0x84, 0x7c, 0x80, 0xe9, 0xe4, 0xa3, + 0x1c, 0x4a, 0x0d, 0x11, 0x16, 0x24, 0xb2, 0xb1, 0x99, 0xe5, 0xe3, 0x2e, + 0x2f, 0x70, 0xcd, 0x1e, 0x35, 0x14, 0x79, 0xba, 0xa2, 0x51, 0x7a, 0x29, + 0x5c, 0x75, 0x8f, 0xdd, 0x22, 0xdf, 0xb2, 0x64, 0xd9, 0x95, 0x11, 0x33, + 0x97, 0xee, 0x69, 0x42, 0x01, 0x96, 0x98, 0x1b, 0x43, 0xc2, 0xec, 0xf9, + 0xb0, 0xdb, 0x69, 0x34, 0xab, 0x98, 0x1b, 0xb2, 0x04, 0x05, 0x14, 0x1d, + 0x25, 0x2f, 0x32, 0x41, 0x50, 0x51, 0x55, 0x62, 0x6d, 0x78, 0x7f, 0x8b, + 0xbb, 0xc2, 0xcd, 0xcf, 0xe4, 0xed, 0x04, 0x1f, 0x25, 0x30, 0x43, 0x64, + 0x69, 0x7c, 0x87, 0xa3, 0xa9, 0xb1, 0xc1, 0xd1, 0xdc, 0x01, 0x10, 0x1d, + 0x27, 0x3f, 0x5c, 0x5d, 0x75, 0x82, 0x9b, 0xaa, 0xb3, 0xe8, 0x0c, 0x11, + 0x1f, 0x24, 0x38, 0x41, 0x45, 0x54, 0x5f, 0x69, 0x85, 0x8d, 0x93, 0x9e, + 0xc5, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x16, 0x25, 0x32, 0x42, +}; + +#elif MLD_CONFIG_PARAMETER_SET == 65 +const uint8_t expected_pk[] = { + 0xb9, 0x28, 0xd6, 0x32, 0xf8, 0x1a, 0x59, 0xe2, 0x63, 0xcb, 0x7b, 0x31, + 0xe0, 0x93, 0x2e, 0xb5, 0xf4, 0x62, 0x4f, 0xb1, 0x61, 0x7b, 0xba, 0x47, + 0x61, 0xa7, 0x28, 0x9b, 0x31, 0x25, 0x31, 0x7e, 0xbe, 0x38, 0xa7, 0x36, + 0x48, 0x3d, 0xe3, 0xcf, 0x8d, 0x42, 0xba, 0x0e, 0x1d, 0x65, 0x11, 0xc5, + 0x49, 0xa0, 0x0d, 0x7e, 0xb0, 0xde, 0xa7, 0x39, 0xed, 0x8e, 0x3b, 0x67, + 0xaa, 0xf4, 0x49, 0x91, 0x72, 0x21, 0xfd, 0x6a, 0x1f, 0xda, 0xa1, 0x18, + 0x00, 0xe5, 0xd2, 0x96, 0xf9, 0x72, 0x28, 0xae, 0xfa, 0x26, 0x1a, 0x58, + 0x52, 0x5c, 0x43, 0xb1, 0x6a, 0x8c, 0xf2, 0x0d, 0xb8, 0x0f, 0x7b, 0x7f, + 0xf4, 0x4b, 0x9a, 0x5f, 0xab, 0x0b, 0xf2, 0x80, 0xb9, 0x25, 0x5f, 0xd3, + 0x6b, 0xc9, 0xf0, 0x12, 0x73, 0x13, 0x2c, 0xdc, 0x7d, 0x58, 0xe0, 0x3a, + 0x58, 0xd6, 0xab, 0x1e, 0x23, 0x69, 0xd0, 0x1b, 0xe7, 0x00, 0x6f, 0xca, + 0x81, 0x0d, 0x5d, 0x73, 0x7e, 0x1d, 0xed, 0x3a, 0x62, 0x7f, 0x32, 0x6d, + 0xaa, 0x55, 0x9a, 0x43, 0x86, 0xff, 0xd2, 0x5e, 0x9e, 0x98, 0xb1, 0x12, + 0x18, 0xde, 0x38, 0x7a, 0x3d, 0x95, 0xa0, 0x4d, 0x6b, 0xba, 0xf3, 0xdd, + 0x67, 0x0a, 0x0c, 0xf8, 0x9d, 0xc9, 0x26, 0x3c, 0x7d, 0x08, 0x79, 0x21, + 0x02, 0xb9, 0x18, 0x5f, 0x80, 0xa1, 0x36, 0x07, 0x05, 0xc3, 0xc0, 0x84, + 0xf2, 0xad, 0x94, 0x48, 0xf8, 0x9b, 0x56, 0x2a, 0xc8, 0xd3, 0xe1, 0x0c, + 0x95, 0xe7, 0xc6, 0xd7, 0x8a, 0x31, 0xb4, 0x5e, 0x59, 0x0c, 0xf6, 0x00, + 0x7d, 0x8b, 0x7d, 0x88, 0x11, 0xf0, 0xb0, 0x0e, 0xb9, 0x3e, 0x09, 0x1f, + 0xb6, 0x52, 0xf7, 0x11, 0xf8, 0xb6, 0xf1, 0x66, 0x52, 0xde, 0x14, 0x5a, + 0x9f, 0x9a, 0x76, 0x92, 0xb7, 0xc1, 0x85, 0x4f, 0x15, 0xba, 0xe1, 0x95, + 0x42, 0x1e, 0xd4, 0x48, 0x91, 0xe7, 0x64, 0x4a, 0x8c, 0x17, 0xd4, 0xfe, + 0xeb, 0xe3, 0x30, 0x7f, 0x6f, 0xfe, 0x54, 0xc5, 0x93, 0xf2, 0xa9, 0x5b, + 0xdd, 0xcb, 0xbb, 0xd6, 0xe9, 0x1f, 0xe8, 0xdf, 0x04, 0x13, 0x6c, 0xec, + 0x59, 0xae, 0xe5, 0xb7, 0x04, 0xd5, 0x10, 0x81, 0x71, 0x87, 0x9d, 0xb7, + 0x53, 0x50, 0x8f, 0x08, 0x3a, 0x54, 0xa8, 0x10, 0xaf, 0x47, 0x03, 0xcf, + 0xb3, 0xc6, 0xe8, 0xa8, 0x7f, 0xeb, 0xcc, 0x9c, 0x3a, 0xf2, 0x62, 0x6f, + 0x13, 0xd6, 0x14, 0xee, 0x74, 0x72, 0x78, 0x95, 0x22, 0xc5, 0xc3, 0x2c, + 0x45, 0xb4, 0xb6, 0x03, 0xb5, 0x8c, 0x59, 0xec, 0xe6, 0xcc, 0x4e, 0xe0, + 0x48, 0xf5, 0x80, 0xb6, 0x38, 0x30, 0xe0, 0xfb, 0xd5, 0x53, 0x4e, 0x43, + 0x5b, 0xfa, 0x20, 0x8b, 0xc1, 0x56, 0xf2, 0x56, 0x95, 0x3c, 0xba, 0x39, + 0xdd, 0xc9, 0x26, 0xe3, 0xa8, 0x98, 0x07, 0xa9, 0x46, 0x10, 0xb4, 0xd3, + 0xea, 0xcf, 0x01, 0x8e, 0x8e, 0x3f, 0xc8, 0xcc, 0xe9, 0x04, 0x5d, 0x29, + 0x9a, 0x0b, 0x13, 0x0a, 0x61, 0xfd, 0xbd, 0x12, 0x53, 0x3d, 0xd8, 0x72, + 0xd3, 0x0d, 0x2f, 0x4a, 0x28, 0x94, 0x83, 0x1f, 0x87, 0xab, 0x70, 0x04, + 0xef, 0xee, 0x6f, 0x78, 0xc5, 0x63, 0x43, 0x6d, 0xd6, 0x59, 0xf1, 0xed, + 0x1f, 0xf2, 0x6c, 0x96, 0xf4, 0xe0, 0x54, 0x54, 0x61, 0x57, 0xf6, 0x47, + 0x8a, 0x8c, 0x7a, 0x0c, 0x47, 0xa3, 0xc3, 0xa6, 0xa0, 0x12, 0xc0, 0x7b, + 0x74, 0xbd, 0x1d, 0x98, 0xf3, 0xa5, 0x71, 0xe3, 0x01, 0x91, 0x9d, 0x58, + 0x77, 0xc0, 0x2a, 0x18, 0xa6, 0x17, 0xfe, 0x7f, 0x6c, 0x5e, 0x18, 0xc8, + 0x0f, 0xeb, 0xe8, 0x0e, 0x56, 0x50, 0x70, 0xed, 0x5a, 0x98, 0xc7, 0x02, + 0x0a, 0x5f, 0x91, 0xd4, 0xc0, 0xd0, 0x2c, 0x3c, 0xc4, 0x34, 0x5e, 0x47, + 0xa9, 0xa2, 0x1b, 0x35, 0x94, 0x97, 0x76, 0xc9, 0x3c, 0x63, 0xba, 0x5c, + 0x9b, 0x1f, 0x8d, 0x52, 0xd3, 0xd4, 0xaa, 0xba, 0x03, 0xf9, 0x94, 0xbc, + 0xef, 0xeb, 0xdc, 0xa5, 0xaa, 0x4b, 0x7e, 0xaf, 0x74, 0xbf, 0x4d, 0x08, + 0xff, 0x3c, 0x9d, 0x01, 0xa7, 0x91, 0xf6, 0x78, 0x4c, 0x60, 0x2f, 0xfb, + 0xaf, 0x9d, 0x10, 0x4b, 0xf4, 0x51, 0x81, 0x9b, 0x45, 0x6e, 0x86, 0xef, + 0x5b, 0xe6, 0xb0, 0xd8, 0xb9, 0xed, 0xf9, 0x54, 0x7d, 0x93, 0x96, 0x1d, + 0x73, 0x2c, 0x99, 0x1c, 0x4a, 0x8e, 0x1e, 0xc3, 0xa8, 0xde, 0xbe, 0xe3, + 0x3d, 0x64, 0x2f, 0x79, 0x76, 0x14, 0xc2, 0x4b, 0x34, 0x14, 0xf6, 0xbf, + 0xb8, 0x53, 0x0a, 0x31, 0x15, 0x8b, 0x92, 0x45, 0xdf, 0x63, 0x02, 0xf1, + 0x6b, 0xca, 0xdb, 0x5c, 0x88, 0x48, 0xda, 0x3d, 0x60, 0xc1, 0x64, 0x99, + 0xa7, 0x65, 0x90, 0x2d, 0x86, 0x1a, 0x8a, 0xff, 0x48, 0x67, 0xac, 0x52, + 0x09, 0xbc, 0x17, 0xf5, 0x60, 0x52, 0xf8, 0x29, 0x10, 0x44, 0x01, 0x44, + 0x2c, 0x7e, 0xc2, 0x64, 0xeb, 0x4f, 0x79, 0x02, 0x93, 0x76, 0x39, 0x8b, + 0xb1, 0x52, 0xdf, 0x19, 0xcd, 0x63, 0x37, 0xcf, 0xd5, 0x31, 0xf5, 0xfb, + 0x84, 0x0c, 0xaf, 0x54, 0x4b, 0xb0, 0x57, 0x9d, 0xb6, 0xe4, 0x25, 0x1d, + 0x69, 0xf4, 0x6e, 0x1b, 0xa4, 0xeb, 0x64, 0x8b, 0x01, 0x9c, 0xfe, 0xea, + 0x0d, 0xe4, 0x63, 0x39, 0x98, 0x50, 0x0f, 0xfa, 0x68, 0x09, 0xdf, 0x9f, + 0x6f, 0x21, 0x20, 0x5b, 0xbb, 0x99, 0xc5, 0x7d, 0xb2, 0x66, 0xaa, 0xdf, + 0xa2, 0xb8, 0x6d, 0x11, 0xd7, 0xff, 0x60, 0xe7, 0xbe, 0x3b, 0xb1, 0x06, + 0xd0, 0x1c, 0xa1, 0x63, 0x52, 0x75, 0x7e, 0x51, 0x0a, 0xf7, 0x1b, 0x4d, + 0x5c, 0x1d, 0x53, 0x85, 0xff, 0xa1, 0x81, 0x7d, 0xf7, 0x29, 0xa6, 0x63, + 0x7a, 0xfc, 0x3a, 0x49, 0x51, 0x5d, 0x10, 0xb7, 0x2c, 0x73, 0xa2, 0xec, + 0xa8, 0x4c, 0x7f, 0xa6, 0x19, 0xbc, 0x5c, 0x47, 0xd5, 0xb2, 0xad, 0x13, + 0x4c, 0x4d, 0xe6, 0x18, 0xd0, 0x15, 0x84, 0x20, 0xaa, 0xb2, 0xf9, 0xcb, + 0x59, 0x62, 0xe9, 0xff, 0x05, 0xda, 0x9b, 0x83, 0xcb, 0xa1, 0x94, 0x5b, + 0xe4, 0x60, 0x0b, 0x57, 0x9b, 0x0c, 0xcb, 0xdd, 0xb5, 0x9e, 0xdc, 0xb1, + 0xb1, 0x80, 0x5d, 0xdb, 0x7f, 0x1f, 0x7f, 0xab, 0xb5, 0xbe, 0x42, 0x85, + 0x30, 0x9d, 0xf7, 0x7e, 0xd3, 0x6f, 0xbf, 0x6c, 0xad, 0x00, 0xcf, 0x9e, + 0x58, 0x8a, 0xf4, 0x02, 0x86, 0x40, 0x75, 0x52, 0xa5, 0x98, 0x39, 0x2d, + 0xee, 0x52, 0x09, 0x5e, 0x4f, 0xab, 0xde, 0x9a, 0x77, 0x07, 0x05, 0x6a, + 0x7c, 0x17, 0x09, 0x3d, 0xcd, 0x8b, 0x49, 0xb4, 0x22, 0xd3, 0xec, 0xa8, + 0xf2, 0xc0, 0xd2, 0x5d, 0x6e, 0x69, 0x1d, 0xfb, 0x6d, 0xc0, 0x8e, 0x6f, + 0xf5, 0xfa, 0xe4, 0xca, 0x6c, 0x02, 0x1c, 0x7f, 0x36, 0xf9, 0x4a, 0x29, + 0x0d, 0x22, 0x8d, 0x27, 0x2c, 0xa2, 0xbc, 0x9e, 0xff, 0x1b, 0xca, 0x9d, + 0x53, 0x93, 0x73, 0x6b, 0x18, 0xb8, 0xd6, 0x29, 0x7b, 0x44, 0x57, 0x84, + 0x3d, 0xf2, 0x9d, 0x39, 0xe2, 0x0d, 0xa2, 0x96, 0x0f, 0x1d, 0xb1, 0x56, + 0x51, 0x95, 0x54, 0x1c, 0xb8, 0x8a, 0xf8, 0xb4, 0xa6, 0xda, 0xf6, 0xd2, + 0x72, 0xbb, 0xcf, 0x07, 0x58, 0xed, 0x38, 0x0b, 0xd6, 0x97, 0xe6, 0xa6, + 0x58, 0xd1, 0x8e, 0x6f, 0x6f, 0x55, 0x37, 0xe2, 0xff, 0x54, 0xf2, 0x75, + 0x90, 0x04, 0x2f, 0x64, 0x47, 0x05, 0xb8, 0x5d, 0xb4, 0x6b, 0x2c, 0x1e, + 0x35, 0xd8, 0xef, 0x31, 0x8f, 0x5d, 0x88, 0xb9, 0x94, 0xcd, 0x22, 0x43, + 0xe1, 0xbe, 0xe4, 0x2c, 0xdb, 0xa4, 0x7e, 0xae, 0x8b, 0xaa, 0xf0, 0x3a, + 0x47, 0x9c, 0x24, 0x6f, 0x01, 0x13, 0xf2, 0x79, 0xdc, 0x35, 0x74, 0xfb, + 0x34, 0x69, 0x1a, 0x72, 0x3d, 0xae, 0x34, 0x0a, 0x6d, 0xeb, 0x79, 0xd0, + 0xaa, 0x22, 0x80, 0xfe, 0x53, 0x09, 0xcb, 0xb8, 0x7c, 0xa2, 0x60, 0xb0, + 0x0d, 0x8b, 0x7f, 0xec, 0x3e, 0x5e, 0xd8, 0x58, 0x64, 0x59, 0x5c, 0xeb, + 0xaa, 0xbf, 0x00, 0x71, 0xd9, 0x0a, 0x50, 0xae, 0xd4, 0x75, 0x89, 0x04, + 0x44, 0x62, 0x2b, 0x2f, 0x6a, 0x84, 0x8d, 0xe9, 0x1a, 0xa5, 0xf9, 0x6f, + 0xfa, 0xe9, 0x1d, 0xe7, 0xa4, 0x62, 0xcd, 0xcc, 0x07, 0x0b, 0xbc, 0x53, + 0xb9, 0xb3, 0x19, 0x66, 0x28, 0x29, 0x76, 0xdb, 0x50, 0xf8, 0x4f, 0x63, + 0xca, 0xa2, 0x33, 0xf9, 0x70, 0xd7, 0xd2, 0x0a, 0xe9, 0x83, 0x75, 0x97, + 0x83, 0x7e, 0xa6, 0x75, 0x72, 0x95, 0x90, 0xb8, 0xfc, 0xd6, 0x6e, 0x30, + 0x0a, 0x52, 0x49, 0x60, 0xab, 0xa3, 0x81, 0xa3, 0x2d, 0x7a, 0xcc, 0x90, + 0x29, 0x61, 0xa2, 0xb8, 0x76, 0x30, 0xf8, 0x2f, 0xe2, 0xba, 0xef, 0x40, + 0xe3, 0xec, 0xcd, 0x9e, 0x03, 0x55, 0x5e, 0xdf, 0xaa, 0xc7, 0xe1, 0x29, + 0x3b, 0x21, 0x3e, 0x8d, 0xc8, 0xe6, 0x67, 0xb2, 0xf2, 0xbd, 0x82, 0xa9, + 0x0e, 0x6b, 0x76, 0x1c, 0xf2, 0x81, 0x93, 0x61, 0x1a, 0x4c, 0x52, 0x99, + 0x00, 0x3c, 0xd9, 0x8f, 0x62, 0xfc, 0x00, 0xa5, 0xd9, 0xa9, 0xd0, 0x61, + 0x31, 0x86, 0x04, 0x05, 0xae, 0xaa, 0x7d, 0x55, 0x6c, 0x89, 0xf7, 0xa3, + 0xe4, 0x9d, 0x57, 0x29, 0xf3, 0x29, 0x73, 0x9f, 0xe6, 0xc0, 0x7c, 0x0a, + 0x84, 0x1a, 0x4b, 0xf6, 0xa5, 0x86, 0x3c, 0xea, 0x4f, 0x05, 0x20, 0x66, + 0x87, 0x23, 0x7c, 0xca, 0x68, 0x5b, 0xb5, 0x77, 0x38, 0xc8, 0xae, 0xd1, + 0x81, 0x55, 0xd1, 0x03, 0xa6, 0x6f, 0x2e, 0x25, 0x8f, 0x07, 0xbf, 0x38, + 0xb0, 0x89, 0x47, 0xc8, 0xdc, 0x44, 0x8e, 0x9f, 0xd6, 0xba, 0xda, 0xd5, + 0xe7, 0x6c, 0x80, 0x40, 0x9c, 0x39, 0x76, 0x90, 0xb1, 0x1a, 0x3a, 0x8e, + 0x30, 0x73, 0x0c, 0x03, 0x78, 0x59, 0x8e, 0xd8, 0x08, 0x82, 0x1a, 0x32, + 0xc5, 0xc3, 0x6d, 0x83, 0xf9, 0x55, 0xe1, 0x96, 0x11, 0xdf, 0x5b, 0x26, + 0xe7, 0x59, 0x7f, 0x82, 0x9d, 0x79, 0x2f, 0x35, 0x8a, 0xd0, 0xbc, 0x09, + 0x70, 0x58, 0x06, 0x73, 0x10, 0xa9, 0x40, 0x7d, 0x3c, 0x83, 0x3f, 0x39, + 0x54, 0x4b, 0x6e, 0x2b, 0x27, 0x82, 0xe4, 0x0f, 0xa5, 0x15, 0x59, 0xfe, + 0x57, 0xc7, 0x0c, 0xa5, 0x51, 0xf0, 0x6d, 0x73, 0x40, 0xfd, 0xca, 0x00, + 0x76, 0x37, 0x41, 0xba, 0x01, 0x3d, 0xb6, 0x35, 0xf5, 0x00, 0xd1, 0x2a, + 0x58, 0x1a, 0xbb, 0x16, 0xf2, 0x37, 0xaa, 0x52, 0x05, 0x39, 0x1a, 0xb5, + 0xa7, 0x97, 0x3b, 0xfe, 0xc3, 0xd3, 0x48, 0xed, 0x49, 0xf0, 0xa0, 0x5d, + 0x36, 0x0f, 0xf6, 0xfb, 0x1d, 0xc0, 0x1e, 0x5e, 0xb3, 0x46, 0xa7, 0xc3, + 0x9b, 0xbb, 0xfd, 0x40, 0x91, 0x7c, 0xe5, 0xa8, 0xe3, 0x17, 0x90, 0xf5, + 0xac, 0xe4, 0xe4, 0x21, 0xed, 0x96, 0x98, 0x63, 0x41, 0xb2, 0x98, 0x37, + 0x30, 0xef, 0x88, 0x15, 0xd0, 0x3e, 0x43, 0x0a, 0xe1, 0xbf, 0xe1, 0xe4, + 0x29, 0x8f, 0xc9, 0xdf, 0x2d, 0xe3, 0x08, 0xfd, 0xcd, 0x7c, 0xc0, 0x5d, + 0x09, 0x47, 0x8e, 0xc7, 0xed, 0xfb, 0x85, 0x55, 0xba, 0xfd, 0x3a, 0x6b, + 0x96, 0x0f, 0x06, 0x91, 0x93, 0x2b, 0xc6, 0x42, 0x92, 0xe7, 0xf3, 0xd6, + 0xeb, 0x3a, 0x2a, 0x9f, 0x96, 0x89, 0x63, 0x71, 0xd6, 0x44, 0xd1, 0xe4, + 0x13, 0xae, 0x8c, 0x44, 0x16, 0xa0, 0xc1, 0x29, 0x61, 0x00, 0x27, 0x06, + 0x8f, 0x25, 0x1f, 0x3d, 0x01, 0x02, 0x4c, 0xeb, 0x5f, 0x43, 0x7d, 0x9a, + 0x7d, 0x6c, 0x76, 0xda, 0x8d, 0x10, 0xc8, 0x85, 0x25, 0x9a, 0xe9, 0x36, + 0xe5, 0xfa, 0x3d, 0x89, 0xb4, 0x07, 0x73, 0xfd, 0x45, 0x03, 0x15, 0x42, + 0x4e, 0x86, 0x6b, 0x25, 0x35, 0x63, 0x5f, 0x46, 0x97, 0xfe, 0x84, 0x14, + 0x48, 0x43, 0xb6, 0x3f, 0xfb, 0xbd, 0x36, 0xf8, 0xa6, 0xec, 0x53, 0x51, + 0xf4, 0xc8, 0x1e, 0x21, 0xfa, 0x42, 0x22, 0x6a, 0x47, 0xfb, 0xc7, 0x0d, + 0xe3, 0x05, 0x66, 0xc9, 0xb1, 0xf1, 0x47, 0xc2, 0x8d, 0xc6, 0x40, 0xdf, + 0xa9, 0x5d, 0xb3, 0x24, 0x10, 0xc5, 0x3b, 0xf2, 0x9d, 0xb4, 0x52, 0x59, + 0x61, 0xf6, 0x31, 0x9d, 0x67, 0xd5, 0x1e, 0x33, 0x3b, 0xd9, 0xe3, 0x24, + 0x1a, 0x63, 0x24, 0x59, 0x73, 0x7c, 0xb8, 0x67, 0xa1, 0x43, 0x44, 0x7c, + 0x03, 0x25, 0x3d, 0x13, 0x80, 0x2d, 0x3e, 0xa2, 0xab, 0x17, 0x99, 0x30, + 0x91, 0xe0, 0x0e, 0xab, 0x57, 0xe1, 0x2f, 0x7d, 0x29, 0x4d, 0x9a, 0xb0, + 0xda, 0x3f, 0x1f, 0x03, 0x0f, 0x11, 0x5f, 0x04, 0x03, 0xd2, 0x95, 0x05, + 0xb3, 0xc8, 0xb2, 0xfc, 0x9b, 0x62, 0x80, 0x58, 0x79, 0x46, 0x41, 0xf2, + 0x9e, 0xe8, 0x3d, 0x5e, 0x1d, 0x60, 0xbe, 0xf8, 0x3f, 0x65, 0x27, 0x4b, + 0xd0, 0x3d, 0x4d, 0x84, 0x34, 0x1a, 0x06, 0x25, 0x15, 0x6f, 0x50, 0x65, + 0x99, 0xb5, 0xde, 0xb4, 0xe2, 0xfc, 0x64, 0x79, 0x1b, 0x3e, 0xd5, 0xf9, + 0x99, 0xcc, 0x32, 0x2a, 0xb0, 0xcd, 0xd7, 0x1e, 0x63, 0xa0, 0xac, 0xf0, + 0x29, 0x9e, 0xe3, 0x46, 0x15, 0xa3, 0xc3, 0x30, 0xd3, 0x8b, 0x8e, 0xd9, + 0x2b, 0x8b, 0x37, 0xb1, 0x46, 0x3b, 0x86, 0x51, 0x58, 0x4d, 0x9c, 0xd4, + 0xc9, 0x2a, 0x9a, 0x38, 0x9c, 0x98, 0x01, 0xb4, 0xb8, 0xad, 0xd5, 0x18, + 0x6c, 0x6c, 0x42, 0x5d, 0x1d, 0xeb, 0x28, 0xc7, 0x61, 0xa6, 0xd5, 0x0d, + 0x93, 0x8b, 0x3d, 0x2e, 0xc6, 0xb0, 0x22, 0x5d, 0x37, 0x5b, 0x70, 0x83, + 0x58, 0x13, 0x1f, 0x5e, 0xd5, 0x67, 0x2e, 0x76, 0x3d, 0xd3, 0x2a, 0xd5, + 0x60, 0x01, 0x10, 0x22, 0x37, 0xa9, 0xc6, 0xdc, 0x78, 0x7e, 0x12, 0xbd, + 0x53, 0xe6, 0xd2, 0xa7, 0x72, 0xba, 0x85, 0x6e, 0x5f, 0x91, 0x51, 0x63, + 0x85, 0x43, 0xe9, 0x44, 0xd2, 0xf7, 0x2a, 0x16, 0x22, 0x69, 0xb1, 0x25, + 0x54, 0x9c, 0x98, 0x7c, 0x6b, 0xf2, 0x4a, 0x32, 0x14, 0x1f, 0x8c, 0xfb, + 0x97, 0xf3, 0x3c, 0xaa, 0x7c, 0x47, 0x03, 0x28, 0x7e, 0xc7, 0xf4, 0xca, + 0xcc, 0x36, 0xe5, 0xb7, 0x61, 0xf9, 0x93, 0x27, 0xde, 0x9a, 0xd7, 0x4f, + 0xa3, 0x2e, 0xc1, 0xbc, 0xf3, 0x4c, 0xf8, 0x4a, 0x95, 0x05, 0x33, 0xc2, + 0x1e, 0x20, 0xd4, 0x19, 0x14, 0x87, 0x8d, 0xe0, 0xf7, 0x63, 0x3e, 0xb3, + 0x33, 0x31, 0x9d, 0xa6, 0x50, 0x0e, 0x37, 0x64, 0x3a, 0x32, 0xb2, 0x8c, + 0x18, 0xa2, 0x0d, 0xbd, 0x1c, 0x18, 0x67, 0x91, 0x35, 0x23, 0x46, 0x12, + 0x30, 0x71, 0xbd, 0x5c, 0x5c, 0x16, 0x17, 0xef, 0x62, 0x4a, 0xea, 0x50, + 0xe3, 0x02, 0x2e, 0x99, 0x26, 0x15, 0x79, 0x53, 0x1a, 0x0b, 0x0d, 0x2e, + 0xf5, 0xfa, 0x0f, 0xb2, 0x90, 0xcd, 0x6f, 0xf6, 0x32, 0x29, 0x6f, 0x31, + 0x8f, 0x31, 0x1e, 0x99, 0x43, 0xeb, 0x73, 0xea, +}; + +const uint8_t expected_sk[] = { + 0xb9, 0x28, 0xd6, 0x32, 0xf8, 0x1a, 0x59, 0xe2, 0x63, 0xcb, 0x7b, 0x31, + 0xe0, 0x93, 0x2e, 0xb5, 0xf4, 0x62, 0x4f, 0xb1, 0x61, 0x7b, 0xba, 0x47, + 0x61, 0xa7, 0x28, 0x9b, 0x31, 0x25, 0x31, 0x7e, 0x0d, 0xca, 0xf5, 0x78, + 0x04, 0x9a, 0x77, 0xa1, 0x01, 0x12, 0x31, 0x28, 0x90, 0xf8, 0x39, 0xb6, + 0xe9, 0xcf, 0x5b, 0x33, 0xb6, 0x76, 0x82, 0x7f, 0xe0, 0xab, 0xe3, 0x5e, + 0xc0, 0x37, 0xab, 0xce, 0x7e, 0x94, 0x0d, 0x4f, 0xd2, 0x1a, 0x8d, 0x81, + 0x8e, 0xe7, 0xe4, 0x83, 0x96, 0x7e, 0x27, 0xb1, 0x9e, 0x90, 0x5b, 0x46, + 0x8f, 0xd6, 0x3b, 0x43, 0x5e, 0xe9, 0xe5, 0x35, 0xfc, 0xdd, 0xce, 0x8d, + 0xeb, 0x16, 0xfb, 0x23, 0xd2, 0x67, 0x4b, 0x2d, 0xba, 0xf1, 0x6e, 0xe4, + 0xf9, 0x39, 0xd4, 0xa8, 0x91, 0xd0, 0x9d, 0x5e, 0x71, 0xcd, 0x3a, 0x6a, + 0x6b, 0x1b, 0xa7, 0x7a, 0xf4, 0x90, 0x4a, 0xff, 0x05, 0x84, 0x76, 0x82, + 0x62, 0x24, 0x65, 0x73, 0x53, 0x40, 0x18, 0x21, 0x07, 0x37, 0x75, 0x71, + 0x82, 0x04, 0x62, 0x48, 0x54, 0x85, 0x73, 0x27, 0x21, 0x47, 0x15, 0x02, + 0x10, 0x60, 0x54, 0x83, 0x40, 0x41, 0x17, 0x12, 0x77, 0x80, 0x53, 0x24, + 0x64, 0x52, 0x87, 0x60, 0x57, 0x41, 0x44, 0x33, 0x57, 0x43, 0x00, 0x83, + 0x44, 0x15, 0x50, 0x70, 0x26, 0x13, 0x51, 0x65, 0x18, 0x85, 0x41, 0x27, + 0x34, 0x27, 0x74, 0x74, 0x04, 0x34, 0x18, 0x52, 0x48, 0x08, 0x15, 0x56, + 0x16, 0x42, 0x78, 0x31, 0x60, 0x71, 0x26, 0x07, 0x67, 0x51, 0x20, 0x02, + 0x41, 0x48, 0x58, 0x78, 0x56, 0x34, 0x08, 0x76, 0x65, 0x76, 0x11, 0x06, + 0x23, 0x48, 0x30, 0x41, 0x48, 0x10, 0x81, 0x60, 0x88, 0x10, 0x23, 0x66, + 0x02, 0x72, 0x80, 0x67, 0x13, 0x06, 0x03, 0x42, 0x87, 0x32, 0x27, 0x53, + 0x35, 0x56, 0x56, 0x54, 0x37, 0x60, 0x82, 0x71, 0x86, 0x53, 0x04, 0x87, + 0x26, 0x11, 0x14, 0x54, 0x24, 0x75, 0x51, 0x01, 0x73, 0x32, 0x71, 0x20, + 0x75, 0x02, 0x73, 0x86, 0x56, 0x43, 0x10, 0x84, 0x68, 0x66, 0x33, 0x64, + 0x63, 0x73, 0x64, 0x44, 0x83, 0x75, 0x36, 0x48, 0x51, 0x17, 0x33, 0x76, + 0x43, 0x85, 0x42, 0x26, 0x55, 0x37, 0x40, 0x30, 0x20, 0x67, 0x40, 0x60, + 0x84, 0x70, 0x27, 0x77, 0x25, 0x11, 0x35, 0x57, 0x24, 0x23, 0x20, 0x13, + 0x27, 0x31, 0x37, 0x63, 0x80, 0x26, 0x87, 0x22, 0x05, 0x84, 0x42, 0x78, + 0x61, 0x34, 0x48, 0x66, 0x27, 0x30, 0x27, 0x36, 0x46, 0x30, 0x57, 0x86, + 0x11, 0x28, 0x78, 0x65, 0x30, 0x47, 0x72, 0x42, 0x63, 0x75, 0x84, 0x76, + 0x32, 0x06, 0x64, 0x45, 0x27, 0x70, 0x12, 0x52, 0x14, 0x55, 0x33, 0x22, + 0x21, 0x23, 0x71, 0x18, 0x82, 0x64, 0x02, 0x40, 0x68, 0x04, 0x88, 0x48, + 0x70, 0x55, 0x11, 0x25, 0x00, 0x32, 0x75, 0x50, 0x70, 0x22, 0x02, 0x72, + 0x26, 0x06, 0x62, 0x81, 0x77, 0x70, 0x84, 0x14, 0x08, 0x52, 0x72, 0x21, + 0x56, 0x61, 0x82, 0x48, 0x62, 0x70, 0x61, 0x13, 0x43, 0x87, 0x71, 0x75, + 0x78, 0x10, 0x82, 0x41, 0x32, 0x55, 0x45, 0x25, 0x01, 0x47, 0x74, 0x03, + 0x60, 0x67, 0x83, 0x26, 0x26, 0x77, 0x78, 0x31, 0x81, 0x04, 0x45, 0x18, + 0x34, 0x64, 0x26, 0x84, 0x41, 0x17, 0x73, 0x57, 0x76, 0x55, 0x16, 0x60, + 0x52, 0x02, 0x33, 0x60, 0x01, 0x81, 0x68, 0x36, 0x17, 0x80, 0x31, 0x17, + 0x84, 0x62, 0x28, 0x67, 0x55, 0x42, 0x22, 0x86, 0x26, 0x72, 0x08, 0x64, + 0x58, 0x74, 0x10, 0x40, 0x37, 0x14, 0x70, 0x22, 0x22, 0x32, 0x24, 0x42, + 0x75, 0x75, 0x08, 0x86, 0x11, 0x68, 0x03, 0x55, 0x83, 0x04, 0x62, 0x02, + 0x36, 0x50, 0x18, 0x65, 0x20, 0x33, 0x01, 0x87, 0x28, 0x32, 0x73, 0x38, + 0x10, 0x66, 0x16, 0x65, 0x83, 0x82, 0x25, 0x54, 0x46, 0x51, 0x08, 0x46, + 0x51, 0x84, 0x08, 0x78, 0x70, 0x00, 0x44, 0x13, 0x30, 0x00, 0x37, 0x70, + 0x36, 0x41, 0x33, 0x16, 0x31, 0x17, 0x65, 0x82, 0x08, 0x24, 0x25, 0x45, + 0x60, 0x43, 0x44, 0x07, 0x64, 0x61, 0x63, 0x45, 0x18, 0x12, 0x43, 0x32, + 0x34, 0x48, 0x48, 0x15, 0x88, 0x83, 0x74, 0x74, 0x61, 0x82, 0x84, 0x68, + 0x52, 0x56, 0x05, 0x86, 0x56, 0x77, 0x10, 0x27, 0x55, 0x64, 0x34, 0x16, + 0x44, 0x88, 0x38, 0x56, 0x53, 0x21, 0x38, 0x86, 0x08, 0x12, 0x12, 0x31, + 0x83, 0x55, 0x78, 0x64, 0x83, 0x47, 0x16, 0x41, 0x25, 0x01, 0x84, 0x88, + 0x64, 0x40, 0x21, 0x06, 0x57, 0x64, 0x32, 0x64, 0x40, 0x33, 0x36, 0x42, + 0x24, 0x44, 0x58, 0x04, 0x82, 0x47, 0x53, 0x22, 0x00, 0x48, 0x07, 0x24, + 0x62, 0x46, 0x51, 0x40, 0x38, 0x24, 0x58, 0x36, 0x37, 0x30, 0x86, 0x78, + 0x03, 0x07, 0x63, 0x01, 0x25, 0x15, 0x72, 0x47, 0x61, 0x68, 0x75, 0x17, + 0x82, 0x21, 0x83, 0x65, 0x76, 0x83, 0x02, 0x64, 0x32, 0x55, 0x54, 0x74, + 0x10, 0x38, 0x47, 0x77, 0x61, 0x17, 0x62, 0x82, 0x37, 0x15, 0x22, 0x66, + 0x32, 0x38, 0x13, 0x20, 0x14, 0x50, 0x83, 0x41, 0x70, 0x45, 0x37, 0x36, + 0x08, 0x68, 0x14, 0x77, 0x11, 0x34, 0x10, 0x00, 0x47, 0x71, 0x54, 0x60, + 0x87, 0x27, 0x74, 0x84, 0x74, 0x31, 0x00, 0x62, 0x45, 0x68, 0x25, 0x50, + 0x34, 0x31, 0x73, 0x74, 0x45, 0x51, 0x83, 0x02, 0x04, 0x56, 0x46, 0x31, + 0x57, 0x53, 0x36, 0x86, 0x10, 0x60, 0x73, 0x34, 0x27, 0x24, 0x25, 0x60, + 0x48, 0x73, 0x13, 0x75, 0x65, 0x75, 0x33, 0x72, 0x18, 0x16, 0x82, 0x47, + 0x68, 0x15, 0x58, 0x70, 0x77, 0x33, 0x12, 0x17, 0x11, 0x38, 0x84, 0x44, + 0x73, 0x88, 0x83, 0x61, 0x10, 0x88, 0x21, 0x76, 0x86, 0x38, 0x87, 0x77, + 0x26, 0x80, 0x08, 0x36, 0x25, 0x45, 0x52, 0x30, 0x27, 0x68, 0x11, 0x71, + 0x32, 0x68, 0x42, 0x30, 0x31, 0x52, 0x37, 0x16, 0x04, 0x51, 0x12, 0x57, + 0x25, 0x41, 0x17, 0x14, 0x11, 0x07, 0x11, 0x28, 0x60, 0x17, 0x04, 0x14, + 0x76, 0x87, 0x23, 0x51, 0x88, 0x41, 0x21, 0x33, 0x78, 0x48, 0x75, 0x43, + 0x78, 0x73, 0x86, 0x47, 0x53, 0x24, 0x23, 0x55, 0x06, 0x46, 0x42, 0x03, + 0x52, 0x42, 0x12, 0x77, 0x80, 0x24, 0x32, 0x20, 0x68, 0x21, 0x58, 0x53, + 0x14, 0x24, 0x44, 0x67, 0x47, 0x74, 0x76, 0x02, 0x77, 0x41, 0x41, 0x00, + 0x40, 0x02, 0x81, 0x24, 0x51, 0x66, 0x27, 0x05, 0x31, 0x08, 0x17, 0x45, + 0x37, 0x53, 0x02, 0x21, 0x04, 0x06, 0x84, 0x11, 0x07, 0x86, 0x73, 0x50, + 0x78, 0x40, 0x57, 0x87, 0x02, 0x02, 0x00, 0x43, 0x43, 0x81, 0x20, 0x57, + 0x07, 0x31, 0x47, 0x78, 0x86, 0x70, 0x67, 0x18, 0x22, 0x57, 0x85, 0x52, + 0x46, 0x17, 0x22, 0x35, 0x71, 0x88, 0x65, 0x86, 0x50, 0x17, 0x58, 0x22, + 0x12, 0x65, 0x85, 0x01, 0x81, 0x34, 0x03, 0x26, 0x83, 0x42, 0x53, 0x15, + 0x44, 0x12, 0x87, 0x83, 0x73, 0x41, 0x15, 0x08, 0x65, 0x43, 0x88, 0x67, + 0x06, 0x20, 0x55, 0x00, 0x30, 0x44, 0x18, 0x21, 0x65, 0x22, 0x46, 0x36, + 0x15, 0x54, 0x18, 0x63, 0x84, 0x28, 0x26, 0x77, 0x87, 0x03, 0x67, 0x13, + 0x62, 0x24, 0x37, 0x02, 0x56, 0x84, 0x10, 0x83, 0x32, 0x63, 0x57, 0x62, + 0x41, 0x88, 0x07, 0x88, 0x64, 0x65, 0x77, 0x77, 0x32, 0x67, 0x62, 0x42, + 0x02, 0x03, 0x22, 0x06, 0x20, 0x48, 0x41, 0x16, 0x08, 0x60, 0x88, 0x46, + 0x80, 0x78, 0x45, 0x34, 0x78, 0x62, 0x03, 0x83, 0x41, 0x20, 0x78, 0x62, + 0x85, 0x83, 0x31, 0x54, 0x87, 0x56, 0x01, 0x30, 0x38, 0x31, 0x40, 0x55, + 0x27, 0x11, 0x70, 0x40, 0x21, 0x64, 0x23, 0x67, 0x83, 0x44, 0x37, 0x80, + 0x03, 0x76, 0x62, 0x43, 0x05, 0x03, 0x37, 0x70, 0x48, 0x22, 0x60, 0x45, + 0x54, 0x15, 0x13, 0x85, 0x62, 0x72, 0x21, 0x05, 0x68, 0x02, 0x46, 0x57, + 0x65, 0x57, 0x43, 0x72, 0x77, 0x07, 0x24, 0x64, 0x00, 0x17, 0x12, 0x10, + 0x20, 0x00, 0x86, 0x26, 0x63, 0x56, 0x15, 0x02, 0x46, 0x81, 0x31, 0x63, + 0x58, 0x88, 0x61, 0x22, 0x18, 0x08, 0x45, 0x23, 0x07, 0x86, 0x57, 0x77, + 0x31, 0x30, 0x22, 0x05, 0x14, 0x30, 0x38, 0x04, 0x46, 0x56, 0x01, 0x04, + 0x77, 0x50, 0x76, 0x23, 0x07, 0x70, 0x02, 0x54, 0x77, 0x77, 0x35, 0x66, + 0x31, 0x32, 0x63, 0x86, 0x55, 0x26, 0x74, 0x05, 0x18, 0x22, 0x81, 0x11, + 0x01, 0x34, 0x68, 0x04, 0x43, 0x06, 0x75, 0x68, 0x72, 0x03, 0x47, 0x30, + 0x84, 0x67, 0x11, 0x46, 0x31, 0x47, 0x84, 0x31, 0x28, 0x46, 0x27, 0x18, + 0x24, 0x62, 0x35, 0x22, 0x51, 0x23, 0x83, 0x25, 0x02, 0x24, 0x04, 0x67, + 0x57, 0x73, 0x07, 0x25, 0x80, 0x36, 0x32, 0x58, 0x57, 0x26, 0x76, 0x30, + 0x74, 0x73, 0x07, 0x15, 0x03, 0x76, 0x51, 0x85, 0x18, 0x62, 0x25, 0x25, + 0x81, 0x55, 0x45, 0x04, 0x05, 0x34, 0x45, 0x83, 0x36, 0x17, 0x22, 0x75, + 0x18, 0x07, 0x65, 0x53, 0x24, 0x43, 0x35, 0x30, 0x74, 0x44, 0x72, 0x73, + 0x36, 0x12, 0x74, 0x82, 0x45, 0x16, 0x14, 0x16, 0x55, 0x04, 0x80, 0x88, + 0x21, 0x58, 0x40, 0x58, 0x47, 0x14, 0x51, 0x65, 0x78, 0x12, 0x35, 0x21, + 0x56, 0x60, 0x53, 0x46, 0x42, 0x80, 0x73, 0x80, 0x51, 0x88, 0x25, 0x77, + 0x30, 0x71, 0x72, 0x81, 0x04, 0x58, 0x54, 0x32, 0x56, 0x61, 0x54, 0x53, + 0x21, 0x83, 0x00, 0x34, 0x17, 0x74, 0x56, 0x07, 0x05, 0x24, 0x85, 0x10, + 0x50, 0x73, 0x62, 0x11, 0x64, 0x31, 0x23, 0x72, 0x74, 0x03, 0x46, 0x32, + 0x62, 0x63, 0x45, 0x81, 0x73, 0x66, 0x74, 0x56, 0x01, 0x18, 0x42, 0x48, + 0x35, 0x23, 0x70, 0x05, 0x16, 0x48, 0x01, 0x51, 0x14, 0x53, 0x33, 0x30, + 0x82, 0x77, 0x22, 0x12, 0x50, 0x86, 0x27, 0x35, 0x60, 0x84, 0x80, 0x52, + 0x88, 0x71, 0x56, 0x58, 0x83, 0x87, 0x86, 0x24, 0x36, 0x21, 0x57, 0x33, + 0x46, 0x36, 0x62, 0x75, 0x23, 0x80, 0x10, 0x70, 0x28, 0x47, 0x12, 0x44, + 0x02, 0x28, 0x73, 0x50, 0x21, 0x16, 0x12, 0x34, 0x53, 0x00, 0x12, 0x47, + 0x50, 0x56, 0x54, 0x50, 0x41, 0x63, 0x62, 0x65, 0x21, 0x34, 0x53, 0x17, + 0x35, 0x03, 0x45, 0x60, 0x75, 0x48, 0x10, 0x82, 0x73, 0x76, 0x71, 0x81, + 0x33, 0x56, 0x14, 0x50, 0x33, 0x30, 0x04, 0x15, 0x36, 0x04, 0x66, 0x18, + 0x70, 0x64, 0x07, 0x70, 0x06, 0x48, 0x20, 0x83, 0x08, 0x58, 0x08, 0x06, + 0x23, 0x37, 0x03, 0x48, 0x77, 0x32, 0x11, 0x84, 0x03, 0x32, 0x33, 0x67, + 0x62, 0x54, 0x08, 0x36, 0x85, 0x38, 0x87, 0x82, 0x43, 0x14, 0x56, 0x11, + 0x18, 0x22, 0x48, 0x37, 0x07, 0x88, 0x52, 0x44, 0x10, 0x33, 0x38, 0x60, + 0x12, 0x20, 0x63, 0x32, 0x70, 0x08, 0x06, 0x41, 0x46, 0x05, 0x07, 0x12, + 0x73, 0x73, 0x33, 0x00, 0x07, 0x17, 0x38, 0x36, 0x82, 0x55, 0x44, 0x63, + 0x10, 0x47, 0x35, 0x35, 0x60, 0x54, 0x46, 0x03, 0x83, 0x13, 0x26, 0x45, + 0x71, 0x64, 0x65, 0x31, 0x08, 0x10, 0x82, 0x25, 0x62, 0x02, 0x15, 0x42, + 0x67, 0x71, 0x48, 0x68, 0x58, 0x04, 0x14, 0x35, 0x23, 0x04, 0x03, 0x11, + 0x61, 0x34, 0x70, 0x31, 0x41, 0x56, 0x64, 0x80, 0x78, 0x22, 0x43, 0x57, + 0x46, 0x82, 0x35, 0x47, 0x54, 0x74, 0x33, 0x30, 0x70, 0x70, 0x72, 0x25, + 0x86, 0xc2, 0xac, 0x3a, 0x70, 0x5e, 0x01, 0x15, 0x4c, 0x92, 0xdd, 0x7a, + 0xfa, 0xe4, 0xd2, 0x09, 0xe3, 0x63, 0x03, 0x8f, 0x69, 0xfe, 0xe3, 0xc4, + 0xb3, 0xc9, 0xea, 0x36, 0x79, 0xb3, 0x52, 0x2e, 0xfd, 0x9c, 0x6d, 0x26, + 0x25, 0x25, 0x1b, 0x6b, 0x3f, 0xdc, 0xe4, 0x63, 0x25, 0x3b, 0xa5, 0x51, + 0x4f, 0x3c, 0x80, 0x21, 0x36, 0xad, 0x7a, 0x0f, 0x19, 0xaf, 0xd5, 0x08, + 0x41, 0x58, 0x95, 0xf3, 0xce, 0x25, 0x5c, 0xed, 0x8b, 0x03, 0xfa, 0xdc, + 0x24, 0x86, 0x91, 0x12, 0x19, 0xf2, 0xa6, 0x62, 0x6d, 0x77, 0x82, 0x6f, + 0x86, 0x8e, 0xde, 0x24, 0xe8, 0xb9, 0xd7, 0x23, 0x63, 0xb8, 0x60, 0xb1, + 0xda, 0x29, 0x07, 0x40, 0x3c, 0xb1, 0xb2, 0x5e, 0x0e, 0xb3, 0x3c, 0xc8, + 0x96, 0x8c, 0xee, 0xd3, 0xd7, 0x95, 0x5c, 0x84, 0xca, 0xeb, 0x87, 0x44, + 0x37, 0xba, 0xd1, 0xde, 0x4f, 0x9a, 0x33, 0x4f, 0x2e, 0x60, 0x52, 0xef, + 0x5a, 0x29, 0xda, 0x1c, 0x33, 0x2a, 0x03, 0x61, 0xc7, 0x70, 0x43, 0xc4, + 0x3f, 0x47, 0xc7, 0x81, 0xc5, 0x78, 0xb5, 0x79, 0x5d, 0xbb, 0x5f, 0x6b, + 0xaf, 0x97, 0x46, 0xcc, 0x5b, 0x6a, 0xed, 0xd0, 0x36, 0xe5, 0xd7, 0xd1, + 0x13, 0xc7, 0x13, 0xb6, 0x8c, 0x5e, 0x95, 0xf7, 0x40, 0xbf, 0xaf, 0x65, + 0x45, 0x2c, 0x98, 0x19, 0xc1, 0x78, 0xbc, 0x79, 0x80, 0x34, 0x11, 0x17, + 0x31, 0x0c, 0x2c, 0x20, 0x2f, 0xa7, 0x35, 0xd3, 0x1a, 0x58, 0x0f, 0x2d, + 0x5a, 0xd4, 0x71, 0x3f, 0xb5, 0x85, 0x49, 0xb2, 0x86, 0x4a, 0x0e, 0x5b, + 0x1e, 0xc8, 0x58, 0x12, 0xbb, 0x63, 0xdb, 0x37, 0xa7, 0x97, 0x9b, 0xd9, + 0x8a, 0x36, 0x6e, 0x07, 0x66, 0xb7, 0xae, 0x2e, 0x96, 0x48, 0xee, 0x00, + 0x0e, 0xed, 0x38, 0xc8, 0x76, 0x0d, 0xcb, 0x08, 0x76, 0x8b, 0x1a, 0x4f, + 0x83, 0x9d, 0x49, 0x7f, 0x0e, 0x0e, 0xfa, 0x35, 0x85, 0x35, 0xc4, 0xfb, + 0x45, 0xe0, 0xe0, 0xbd, 0xa6, 0x0d, 0xd7, 0xdc, 0x10, 0x9b, 0x88, 0xc9, + 0xc0, 0xdb, 0x48, 0x41, 0x7a, 0xb2, 0xf3, 0x35, 0x92, 0xf8, 0x9f, 0x4e, + 0x05, 0xa3, 0x6d, 0x9a, 0xaf, 0xe8, 0x77, 0x25, 0x79, 0xba, 0x87, 0x02, + 0xb7, 0x1d, 0x9a, 0xaa, 0x9e, 0x8e, 0x5e, 0x16, 0x5e, 0x0c, 0xf7, 0xbb, + 0x59, 0x6f, 0x8a, 0xc8, 0x46, 0x5a, 0xbb, 0x79, 0xe3, 0x64, 0x63, 0x8e, + 0x96, 0x54, 0x02, 0x0b, 0x11, 0xbf, 0xc0, 0xb5, 0x84, 0xb1, 0xca, 0x32, + 0x47, 0x34, 0x9b, 0xf7, 0x76, 0x15, 0x78, 0x00, 0xfd, 0x42, 0x2a, 0x2c, + 0xfb, 0x6b, 0x3f, 0x70, 0xa8, 0x9e, 0x51, 0x99, 0x9e, 0x29, 0xf3, 0x15, + 0xa7, 0x79, 0x11, 0xbb, 0x3c, 0x95, 0xe2, 0x55, 0xe9, 0xf4, 0xca, 0x97, + 0x28, 0x0d, 0x14, 0x1c, 0xbc, 0xee, 0xae, 0xd7, 0x20, 0x3b, 0x82, 0x4f, + 0xb5, 0x60, 0xe7, 0x49, 0xc1, 0x4b, 0xd0, 0x0e, 0x0d, 0xfc, 0x64, 0x24, + 0x63, 0x45, 0x78, 0x79, 0x16, 0x5b, 0x5b, 0xfe, 0x6a, 0x78, 0xe2, 0xc3, + 0x18, 0xbd, 0x89, 0x1d, 0xe6, 0x88, 0xa9, 0xb4, 0xfc, 0x2d, 0xb6, 0x7f, + 0xde, 0x17, 0xe0, 0xb2, 0x60, 0xa7, 0x77, 0xab, 0xaa, 0xfb, 0x67, 0x4b, + 0xb7, 0xa7, 0x69, 0x9b, 0x11, 0xf7, 0xb2, 0x0c, 0xcf, 0xd3, 0xb2, 0x5e, + 0x04, 0x79, 0x55, 0x15, 0x59, 0xc2, 0x61, 0x15, 0x14, 0xce, 0xd0, 0xb3, + 0x85, 0xb8, 0x31, 0xe0, 0xbb, 0xec, 0xa3, 0xd3, 0x1b, 0x37, 0x12, 0xa1, + 0x86, 0xa4, 0x10, 0x5f, 0x7c, 0x98, 0x6c, 0xa7, 0x3f, 0xf9, 0xe0, 0xbc, + 0x14, 0x38, 0x9f, 0x2c, 0xe8, 0x9b, 0xa8, 0x37, 0x8f, 0x93, 0x48, 0x57, + 0x60, 0x3b, 0x80, 0x26, 0x15, 0xc3, 0x4a, 0x21, 0x40, 0x91, 0xd8, 0x30, + 0x85, 0x8f, 0x19, 0xbc, 0x5e, 0xe7, 0x8a, 0x26, 0xe4, 0xf6, 0x7d, 0xfa, + 0x3b, 0x28, 0xc6, 0x29, 0x77, 0xae, 0x79, 0xe2, 0x2b, 0x8e, 0x34, 0x6e, + 0xd0, 0xa7, 0xea, 0x87, 0x6e, 0x95, 0xf8, 0x7e, 0x07, 0xd6, 0xba, 0x44, + 0xf2, 0xc2, 0x0b, 0x8f, 0x78, 0xe7, 0x79, 0x47, 0xb5, 0xf1, 0xe6, 0xf9, + 0x43, 0x0a, 0x22, 0x2f, 0x5f, 0x09, 0xd1, 0xd0, 0xe4, 0x28, 0xad, 0x62, + 0x52, 0x44, 0x60, 0xb7, 0xaa, 0x10, 0x4d, 0xa6, 0x9c, 0xda, 0x9a, 0x5f, + 0x4e, 0x82, 0xad, 0x62, 0xc3, 0x35, 0xa2, 0xb6, 0xd4, 0x9d, 0x4d, 0xa2, + 0xae, 0x2e, 0x04, 0xae, 0x74, 0xa8, 0x0d, 0x26, 0xc0, 0x7a, 0xb0, 0x99, + 0x90, 0x15, 0x04, 0xcf, 0xf2, 0x12, 0x96, 0x44, 0xff, 0x30, 0x03, 0x33, + 0xba, 0xf2, 0x90, 0xa3, 0xc5, 0x79, 0x32, 0x3c, 0x92, 0x9d, 0x52, 0x22, + 0xc4, 0x2b, 0xdb, 0x2e, 0x0e, 0x05, 0x3b, 0x33, 0xdc, 0xdc, 0xd7, 0xea, + 0x2a, 0x0c, 0x22, 0x9f, 0xfc, 0x1f, 0x16, 0x84, 0x1a, 0xc0, 0x5a, 0xc9, + 0xaa, 0x9f, 0x42, 0xec, 0xee, 0x01, 0x3e, 0x95, 0x65, 0xec, 0x89, 0x28, + 0x2e, 0x85, 0x0d, 0x7d, 0x12, 0xea, 0xa2, 0x38, 0x1c, 0x2f, 0x5f, 0x8f, + 0xe6, 0xae, 0x9d, 0xa5, 0x1d, 0x9c, 0x5e, 0x2d, 0x50, 0x82, 0x82, 0x8b, + 0xe2, 0x31, 0xc5, 0xa2, 0xe6, 0x9e, 0xe6, 0xa7, 0x8b, 0xc8, 0xc1, 0x15, + 0x43, 0xfc, 0x41, 0xfc, 0x23, 0x17, 0x34, 0x90, 0x2a, 0xf1, 0x07, 0xb6, + 0x11, 0xd5, 0x5a, 0x74, 0xd0, 0x3a, 0x17, 0xbd, 0x2d, 0xf5, 0x51, 0xac, + 0xdf, 0x8c, 0xfe, 0xd6, 0x4d, 0x2a, 0xee, 0x82, 0x37, 0x08, 0xf7, 0xd1, + 0x72, 0x5e, 0xa2, 0x89, 0xcd, 0xf0, 0x88, 0x8b, 0xb8, 0x98, 0x9e, 0x24, + 0x04, 0x9c, 0x76, 0xb5, 0xf6, 0x8e, 0x06, 0x0e, 0x94, 0x1c, 0xb5, 0x8e, + 0xd0, 0x79, 0xac, 0xc4, 0x27, 0x57, 0x38, 0x83, 0x79, 0xd0, 0x54, 0xc7, + 0xe8, 0x45, 0x61, 0x19, 0x4b, 0x28, 0xaa, 0x29, 0x87, 0x1f, 0x1b, 0x83, + 0x66, 0xd1, 0x2d, 0x01, 0xd2, 0x11, 0x4b, 0xe5, 0xf6, 0x22, 0x25, 0xb8, + 0xfc, 0xbe, 0x4e, 0x9d, 0x19, 0xc3, 0xe6, 0x87, 0x14, 0xb0, 0x7d, 0xbe, + 0xf1, 0x78, 0x38, 0xeb, 0xa9, 0xcc, 0x94, 0x74, 0xa2, 0xb8, 0x4c, 0x68, + 0x11, 0x3f, 0xd3, 0x37, 0x0c, 0xb3, 0x41, 0xe5, 0xcb, 0xd7, 0x2e, 0xc6, + 0x85, 0xf3, 0x4b, 0x39, 0xe6, 0x4d, 0x9a, 0x07, 0x30, 0xc3, 0x81, 0xb7, + 0x81, 0x66, 0xe5, 0x59, 0x09, 0xd1, 0x8f, 0x06, 0xa9, 0xe6, 0x03, 0xb6, + 0x6a, 0x6b, 0xc9, 0x1d, 0xbe, 0xed, 0x41, 0x1f, 0xe3, 0xd0, 0xd3, 0xf1, + 0x1e, 0xc3, 0xa4, 0xa4, 0x36, 0x6c, 0xa4, 0xb6, 0x53, 0xd6, 0x09, 0xc8, + 0x24, 0x17, 0xa7, 0x89, 0x61, 0x16, 0x3c, 0x77, 0x47, 0xed, 0xdd, 0xb2, + 0x3e, 0xd0, 0x27, 0x6f, 0xe6, 0x7e, 0xb0, 0x40, 0xb4, 0xde, 0xb3, 0xd3, + 0x20, 0x34, 0x20, 0xa7, 0xdf, 0xa8, 0x85, 0xbb, 0x41, 0x02, 0xc4, 0x30, + 0xfe, 0xab, 0x61, 0x9f, 0x8e, 0x0d, 0x55, 0xcf, 0xf9, 0xd6, 0x1c, 0xc2, + 0xb3, 0x03, 0xe4, 0x3e, 0xf2, 0x53, 0x6c, 0xdf, 0x70, 0x1c, 0x53, 0x8e, + 0x9c, 0xe9, 0x31, 0x76, 0x76, 0x3a, 0xbc, 0x43, 0x83, 0x20, 0xeb, 0xf6, + 0xe3, 0x23, 0xbd, 0x79, 0xfe, 0xd1, 0x44, 0x4d, 0x6b, 0xeb, 0x5d, 0xf9, + 0x34, 0x09, 0x42, 0xe4, 0xff, 0xba, 0xe4, 0x42, 0xba, 0x6d, 0xc7, 0xd2, + 0xb9, 0x68, 0x8d, 0x12, 0xc2, 0x28, 0xca, 0xff, 0xac, 0x90, 0x12, 0xc4, + 0x0d, 0x97, 0x26, 0xd0, 0xe5, 0x42, 0x96, 0xb9, 0xf1, 0x64, 0x62, 0x04, + 0xee, 0xba, 0x70, 0xc2, 0xeb, 0x75, 0xa1, 0xdd, 0x00, 0x11, 0xd5, 0xf6, + 0x61, 0x7d, 0x1d, 0x54, 0x01, 0x46, 0x45, 0x3c, 0x97, 0xd4, 0x1f, 0x42, + 0x49, 0x91, 0x93, 0x22, 0xe4, 0xd3, 0x58, 0xd6, 0x52, 0x49, 0x0a, 0x88, + 0x13, 0x62, 0x52, 0x0a, 0x1a, 0x5d, 0xb9, 0x98, 0x41, 0x3e, 0xc7, 0x71, + 0x08, 0x1d, 0x24, 0x3a, 0x17, 0xfb, 0xc0, 0xf4, 0x91, 0xb8, 0x02, 0x56, + 0x58, 0x72, 0x2f, 0xaa, 0xf1, 0xb7, 0xd6, 0x0e, 0x8f, 0x06, 0x0e, 0xe6, + 0xbb, 0xde, 0xa1, 0x19, 0x1c, 0xb0, 0x4a, 0xf9, 0xc5, 0x17, 0x85, 0xd6, + 0x83, 0xd0, 0xd5, 0xd5, 0xb7, 0xd4, 0x2e, 0xa3, 0xac, 0xc4, 0xcc, 0xf0, + 0xc2, 0x54, 0xa1, 0x4a, 0xea, 0xa5, 0xed, 0xc4, 0x0c, 0x04, 0x7e, 0xcc, + 0x34, 0x73, 0xf5, 0xfc, 0x20, 0xd0, 0xaf, 0x85, 0xbf, 0x4c, 0xd1, 0xec, + 0x9e, 0x75, 0x74, 0x27, 0xa8, 0x11, 0x05, 0xd2, 0xd7, 0xf1, 0x28, 0x79, + 0x0c, 0xcf, 0xe0, 0xe6, 0xec, 0xf6, 0x3e, 0xd9, 0xde, 0xf1, 0x34, 0x36, + 0x03, 0x61, 0x13, 0xf2, 0x64, 0x44, 0x37, 0x17, 0x89, 0x27, 0x30, 0x9c, + 0x38, 0xf4, 0x55, 0xb8, 0xd9, 0x6e, 0x7a, 0x59, 0x20, 0xa7, 0xea, 0x05, + 0xb4, 0x42, 0x44, 0x45, 0xa8, 0x96, 0xfa, 0x47, 0x99, 0xaa, 0x39, 0x71, + 0xe3, 0x53, 0x89, 0x19, 0xc9, 0xdb, 0x04, 0x5e, 0x62, 0x02, 0x3c, 0x7e, + 0x3f, 0x1f, 0x94, 0x37, 0x6b, 0xc8, 0x59, 0x35, 0x55, 0x20, 0x23, 0x66, + 0xec, 0xb9, 0xbc, 0x17, 0x35, 0xa7, 0x6f, 0xe2, 0x4b, 0xab, 0xe5, 0x6e, + 0x83, 0x18, 0x38, 0xff, 0xc4, 0xb5, 0xb6, 0x35, 0xb1, 0x2a, 0xbd, 0x35, + 0xdb, 0xfe, 0xc7, 0xd1, 0xb0, 0xd6, 0x6e, 0x8c, 0xf9, 0x13, 0x72, 0x46, + 0x8d, 0x85, 0x67, 0x9c, 0xa7, 0xf7, 0x81, 0x0a, 0x09, 0x8a, 0xfe, 0xdc, + 0x15, 0x1c, 0x27, 0x14, 0x4a, 0x10, 0xed, 0xac, 0xf8, 0x52, 0x54, 0x77, + 0x39, 0x7d, 0x09, 0xce, 0x6b, 0x9d, 0xd4, 0xa0, 0xef, 0x33, 0x1d, 0x51, + 0xdd, 0xe9, 0x71, 0x45, 0x3f, 0x24, 0xf9, 0xb7, 0x49, 0x99, 0x2d, 0x7a, + 0x8d, 0xc9, 0x9f, 0xd2, 0xf3, 0xb5, 0xae, 0x1c, 0xc6, 0x00, 0x29, 0xe8, + 0xcb, 0xfe, 0xe9, 0x73, 0x27, 0xbc, 0x1f, 0xef, 0xb5, 0xc6, 0xe8, 0x9c, + 0xc9, 0x7e, 0x30, 0x1b, 0xd7, 0xfa, 0x85, 0x2e, 0x27, 0x0a, 0x75, 0x5a, + 0x24, 0x4c, 0x84, 0x54, 0x6c, 0x75, 0x68, 0x88, 0xaa, 0x13, 0xda, 0x8b, + 0xbe, 0x52, 0xb4, 0x21, 0xa8, 0x8f, 0x39, 0x8c, 0xdc, 0x0f, 0x9d, 0xcd, + 0x8b, 0x1b, 0x34, 0x0b, 0x7e, 0x8c, 0xca, 0x1e, 0xae, 0x63, 0xa4, 0x71, + 0xc7, 0x4a, 0x2f, 0x37, 0x06, 0x09, 0xad, 0x23, 0xa4, 0x99, 0x8c, 0x24, + 0x69, 0x42, 0x94, 0xb7, 0x63, 0x53, 0x3a, 0xbf, 0xa2, 0xda, 0x3a, 0x9d, + 0x32, 0x8e, 0x26, 0x06, 0x86, 0x44, 0x8b, 0x6f, 0xb4, 0x48, 0x85, 0x83, + 0x29, 0x1d, 0x32, 0xa7, 0x64, 0xd7, 0xb0, 0x6a, 0x08, 0x57, 0x97, 0xbc, + 0xd0, 0xd5, 0x7c, 0xe6, 0xa6, 0xd7, 0x36, 0x22, 0xed, 0x55, 0x1a, 0x4d, + 0xfd, 0xb7, 0x7e, 0x28, 0xcf, 0x66, 0x40, 0x0b, 0xc5, 0x2d, 0x0d, 0xa3, + 0x9d, 0x89, 0x9e, 0x5d, 0x7b, 0xfc, 0xf4, 0x3b, 0x1f, 0x3b, 0x9f, 0xc0, + 0xe0, 0xb5, 0x9a, 0x08, 0xa5, 0x36, 0x64, 0xb3, 0x6c, 0xb1, 0x74, 0xe0, + 0xdb, 0x1c, 0xc8, 0xac, 0xf3, 0x44, 0x4c, 0x08, 0x6e, 0x98, 0x37, 0x8c, + 0x1b, 0xa6, 0xa3, 0x5b, 0xbf, 0xa3, 0x82, 0xfe, 0x66, 0xc5, 0x0b, 0xb9, + 0x98, 0x2e, 0xd3, 0x0a, 0x26, 0x88, 0xb8, 0x11, 0xa9, 0x04, 0x2c, 0xa5, + 0x35, 0xca, 0x9c, 0xec, 0x7e, 0x19, 0xcd, 0x11, 0x43, 0x6d, 0x1a, 0x61, + 0xa0, 0x31, 0x0b, 0x6b, 0x15, 0x20, 0x0b, 0xfc, 0xaf, 0x37, 0x99, 0xa9, + 0x1c, 0x58, 0xd1, 0xa2, 0xf5, 0x4b, 0x28, 0x8b, 0x70, 0x2b, 0xa0, 0x9d, + 0xac, 0x42, 0x38, 0x10, 0x60, 0x4a, 0xf0, 0x46, 0xe2, 0xde, 0x67, 0xa5, + 0xad, 0x33, 0x9f, 0xda, 0x29, 0x59, 0xe9, 0xd3, 0xfb, 0x0f, 0xa6, 0xb2, + 0xc7, 0xa5, 0x63, 0x23, 0x72, 0xf1, 0x6d, 0x10, 0x01, 0xd5, 0x94, 0x90, + 0xb5, 0x5c, 0x74, 0x0f, 0xc4, 0xc7, 0x1b, 0x1f, 0xb4, 0x1a, 0x94, 0x1a, + 0xab, 0xed, 0xa5, 0x31, 0x0e, 0xdd, 0xed, 0x55, 0xb3, 0x28, 0x36, 0x55, + 0x51, 0x91, 0x41, 0xb0, 0x30, 0xaf, 0x78, 0xe4, 0xc5, 0xfa, 0xb8, 0xf3, + 0xb1, 0x49, 0x61, 0xf9, 0x13, 0xea, 0xe2, 0x0c, 0x9a, 0x04, 0x30, 0x25, + 0x3c, 0xe3, 0x16, 0x3d, 0x7c, 0xb3, 0x7e, 0xcd, 0xd4, 0xec, 0xd8, 0x31, + 0x1a, 0x79, 0xdc, 0x75, 0xc6, 0x11, 0x51, 0x4d, 0xf8, 0x57, 0x7d, 0x56, + 0x2c, 0xdc, 0xee, 0xd4, 0x39, 0x89, 0x74, 0xbd, 0x02, 0xe3, 0xd4, 0xd8, + 0x25, 0x57, 0x46, 0xa4, 0xad, 0x4d, 0x49, 0x93, 0x48, 0x56, 0xcd, 0x4b, + 0x94, 0xd5, 0x21, 0x68, 0x52, 0xd0, 0x9a, 0x2b, 0xee, 0x54, 0x5e, 0x6a, + 0x90, 0x01, 0x40, 0x6b, 0x48, 0x75, 0xf1, 0xab, 0x77, 0x6b, 0x2d, 0x0c, + 0xed, 0x57, 0x78, 0x9a, 0x5f, 0xdc, 0x3b, 0x7d, 0xc1, 0xcc, 0x9b, 0xd1, + 0xf8, 0x44, 0x32, 0x82, 0xf8, 0xc5, 0x41, 0xbb, 0x84, 0xcb, 0x78, 0xf0, + 0x02, 0x0f, 0x94, 0x07, 0xfd, 0xa9, 0x7b, 0xdf, 0x9f, 0x2c, 0xdf, 0xfe, + 0x59, 0x4a, 0x68, 0x6d, 0x21, 0xc5, 0x76, 0x9e, 0xda, 0x57, 0x21, 0xce, + 0xec, 0x65, 0xf0, 0xe7, 0xfc, 0x7f, 0x70, 0xec, 0xb8, 0x98, 0x4c, 0x58, + 0x5c, 0x64, 0xe8, 0x4a, 0x1f, 0xdc, 0x5e, 0x9c, 0x46, 0xf8, 0xde, 0x03, + 0x84, 0xf4, 0x73, 0x0c, 0x96, 0x06, 0xfd, 0xcf, 0x5e, 0x64, 0x39, 0x7c, + 0x12, 0xd8, 0x4d, 0xfe, 0xfb, 0x21, 0x0e, 0xa8, 0x99, 0xca, 0x35, 0xaa, + 0x4e, 0x7e, 0x3e, 0x53, 0x5f, 0x59, 0xd5, 0xf9, 0xb4, 0xdc, 0xaf, 0x4c, + 0xfb, 0x6b, 0xf3, 0x6b, 0x42, 0xb9, 0xd5, 0x6e, 0xa3, 0x29, 0x33, 0x51, + 0xe6, 0x98, 0xac, 0x21, 0x82, 0x60, 0x3e, 0xd3, 0x03, 0x0e, 0xe8, 0x26, + 0xf4, 0x91, 0x51, 0x53, 0x6c, 0x08, 0xad, 0x35, 0x46, 0x73, 0x14, 0x2d, + 0xfd, 0x16, 0xac, 0xdf, 0xc1, 0x0e, 0x6c, 0x91, 0xb5, 0x38, 0x8e, 0x7b, + 0x5b, 0xc8, 0x7a, 0xdd, 0x87, 0xaf, 0x47, 0x59, 0xdd, 0x7b, 0x10, 0xfa, + 0x5f, 0x1a, 0x39, 0xb7, 0xa3, 0x7e, 0x58, 0xfa, 0x6b, 0x3a, 0xc1, 0x8d, + 0x81, 0x84, 0x75, 0x2a, 0x0d, 0xcd, 0xc6, 0xb7, 0x56, 0x26, 0xba, 0x4e, + 0x5c, 0x95, 0x37, 0xdb, 0x0c, 0x74, 0x43, 0x1d, 0xdb, 0xa1, 0xb2, 0x4b, + 0x7b, 0xd5, 0xc9, 0x43, 0x03, 0xff, 0xc2, 0xea, 0x5d, 0xe8, 0xaf, 0xa7, + 0xdf, 0x6f, 0x48, 0x4f, 0xa5, 0x22, 0x19, 0x73, 0x5b, 0x95, 0xc5, 0x56, + 0x86, 0x01, 0xc9, 0x19, 0xf1, 0x97, 0x76, 0xd2, 0x26, 0x88, 0x97, 0xd8, + 0x6d, 0x2f, 0x7b, 0x0a, 0xc7, 0xab, 0x24, 0x7e, 0x2f, 0x98, 0x38, 0x23, + 0x0f, 0x11, 0xb8, 0x3d, 0x40, 0x0f, 0x79, 0xf3, 0xb0, 0x27, 0x2f, 0x36, + 0x31, 0x1c, 0x42, 0x92, 0xc8, 0x5e, 0x6a, 0x18, 0xaa, 0x26, 0x67, 0xa8, + 0xbc, 0xe8, 0xa0, 0xe4, 0xe4, 0x03, 0x57, 0xc5, 0x7e, 0xdc, 0x71, 0x83, + 0xd8, 0xa3, 0x5c, 0x3d, 0x68, 0xa4, 0x18, 0x73, 0x09, 0x26, 0x04, 0x2a, + 0x27, 0x8d, 0x3a, 0x59, 0xb6, 0x6e, 0x67, 0x1c, 0x5c, 0xf0, 0x86, 0x77, + 0x45, 0xeb, 0xbc, 0xc8, 0xd2, 0x10, 0x4b, 0xd8, 0xec, 0x14, 0x37, 0x3a, + 0x84, 0x8d, 0x3c, 0x2f, 0x81, 0x2b, 0x0a, 0xca, 0x58, 0xf4, 0xaf, 0xed, + 0xf5, 0x27, 0x4c, 0x4f, 0xe8, 0xb0, 0x88, 0x86, 0xb4, 0x9e, 0xec, 0xd8, + 0x09, 0xc0, 0xa8, 0x3e, 0x70, 0x60, 0x06, 0xe8, 0x59, 0x4f, 0x00, 0x21, + 0x24, 0xb8, 0xb4, 0x82, 0xb1, 0xc0, 0x44, 0xda, 0x37, 0x0b, 0xd1, 0x27, + 0x12, 0xdf, 0x98, 0x91, 0xa9, 0x9d, 0x12, 0x8f, 0x3e, 0x0d, 0xa8, 0x09, + 0x79, 0x74, 0x69, 0xc2, 0x81, 0x0d, 0x4a, 0xc1, 0xe7, 0x23, 0x10, 0xb0, + 0x3a, 0x97, 0x73, 0xb1, 0xe3, 0xf5, 0xfb, 0x88, 0x62, 0x73, 0xbc, 0xc4, + 0xea, 0x08, 0x12, 0xd3, 0xa3, 0xe6, 0x03, 0x99, 0xd2, 0x28, 0xf6, 0x5c, + 0xb7, 0x11, 0x5c, 0xec, 0xa8, 0xf5, 0x17, 0x8a, 0x91, 0x32, 0x25, 0xcd, + 0xb0, 0xb5, 0x68, 0xb3, 0x9d, 0x53, 0x87, 0xe4, 0x31, 0xba, 0x19, 0xd7, + 0x52, 0xb2, 0x98, 0x17, 0x01, 0xd3, 0x23, 0x56, 0x05, 0x8a, 0x5b, 0xb2, + 0x37, 0x9b, 0x57, 0x80, 0xa9, 0x74, 0xfe, 0x7a, 0xc2, 0xbf, 0x0d, 0x98, + 0xfc, 0xcb, 0xe6, 0x2b, 0x6e, 0x3f, 0x36, 0x1a, 0xc7, 0x92, 0xfd, 0x1a, + 0x6a, 0x4b, 0x55, 0x81, 0xac, 0xf4, 0x1e, 0xad, 0x32, 0xc3, 0x4d, 0xa6, + 0xdb, 0x27, 0x69, 0x6f, 0xf0, 0x78, 0x34, 0xab, 0xa1, 0xdf, 0x4d, 0x59, + 0x55, 0x08, 0x26, 0x80, 0xa5, 0x51, 0x75, 0x39, 0x6f, 0x9d, 0x59, 0xc6, + 0xb9, 0xd4, 0x23, 0x61, 0xc5, 0x81, 0xfe, 0xd1, 0x18, 0xca, 0xeb, 0xf7, + 0x0f, 0xa7, 0x84, 0x93, 0xb9, 0x1e, 0x4b, 0x07, 0xcf, 0x38, 0x5b, 0x17, + 0x42, 0x96, 0x3f, 0xd7, 0x9e, 0x7c, 0xfe, 0x24, 0x50, 0x89, 0x83, 0x4a, + 0x87, 0x70, 0xd3, 0x13, 0xb0, 0x67, 0xe8, 0x9b, 0x38, 0x04, 0x46, 0x5b, + 0x8a, 0x72, 0xc9, 0x19, 0x3e, 0xad, 0xfe, 0x1b, 0xcc, 0x72, 0xb8, 0x95, + 0x0f, 0xdc, 0x4b, 0x11, 0xdf, 0x73, 0xd4, 0x84, 0x0c, 0xf5, 0x5b, 0x49, + 0xb7, 0xfd, 0xef, 0x57, 0x76, 0xc1, 0x89, 0xb3, 0xc7, 0x8b, 0xd9, 0xc5, + 0x19, 0x0b, 0x45, 0x99, 0x55, 0xe4, 0xba, 0x8f, 0xdf, 0xdc, 0x8c, 0x2f, + 0xaa, 0xbc, 0xe4, 0x4f, 0x15, 0xb3, 0x8b, 0xfd, 0x13, 0x59, 0x62, 0x1e, + 0x34, 0x04, 0x9c, 0xea, 0xfc, 0xf6, 0xc9, 0x69, 0xc6, 0x9d, 0x59, 0x53, + 0xde, 0xb5, 0x70, 0x78, 0x9c, 0x61, 0xf9, 0x2d, 0x98, 0x57, 0xbc, 0x24, + 0x53, 0x77, 0x61, 0x33, 0x4a, 0x03, 0x59, 0xf9, 0x6e, 0x08, 0x97, 0x83, + 0x30, 0xb8, 0x26, 0x5f, 0xf4, 0x04, 0x85, 0x76, 0x7e, 0xfc, 0x3c, 0x26, + 0x86, 0x10, 0x3a, 0x15, 0x71, 0xdc, 0xeb, 0x17, 0x35, 0x2c, 0x14, 0xa1, + 0xd6, 0x5d, 0x32, 0x21, 0xd5, 0xb2, 0xfa, 0x9e, 0x5c, 0xfa, 0x52, 0x22, + 0x54, 0xb8, 0xfe, 0xbb, 0x85, 0x6c, 0xe0, 0xab, 0xb8, 0xf3, 0xfa, 0x2d, + 0x7d, 0x6a, 0x1c, 0xe5, 0x80, 0x5a, 0x37, 0x36, 0x3e, 0xaa, 0xd7, 0x0a, + 0xf9, 0x68, 0x36, 0x69, 0x53, 0x08, 0x8e, 0x05, 0x75, 0x73, 0x17, 0xbb, + 0x23, 0xea, 0x62, 0x56, 0x25, 0xab, 0xa4, 0xf0, 0x76, 0xb7, 0xd4, 0xd9, + 0x31, 0xf3, 0xa9, 0x43, 0x03, 0xa4, 0x29, 0xb5, 0x04, 0x78, 0x45, 0x76, + 0x45, 0xcc, 0x0c, 0xb9, 0x92, 0x0c, 0x66, 0xc9, 0xb7, 0xce, 0x5c, 0x9d, + 0x79, 0x1b, 0xc7, 0xbb, 0x7b, 0x8e, 0x1d, 0x2c, 0x42, 0xba, 0x47, 0xd7, + 0x3a, 0xfe, 0xb3, 0x40, 0x1a, 0xa9, 0xca, 0xaa, 0xc9, 0x2e, 0x9c, 0xb5, + 0xe4, 0xed, 0x02, 0x1f, 0x77, 0x3f, 0x3d, 0x52, 0xc3, 0x78, 0xb9, 0x9b, + 0xbe, 0x7f, 0x8b, 0x90, 0x83, 0x30, 0x1e, 0x54, 0xf1, 0xda, 0x9a, 0x9d, +}; + +const uint8_t expected_sig[] = { + 0x8b, 0x6f, 0x79, 0x00, 0xcc, 0x79, 0x57, 0xee, 0x16, 0x86, 0x87, 0xd5, + 0xcf, 0xb6, 0x90, 0x2c, 0xc6, 0x30, 0xeb, 0x8d, 0x39, 0xae, 0x9b, 0xf1, + 0x66, 0xe0, 0xd6, 0x93, 0xa5, 0x4e, 0x26, 0x9b, 0x96, 0x8f, 0xd1, 0x46, + 0x97, 0xbe, 0x71, 0x1c, 0xf3, 0xa5, 0xe5, 0xae, 0x8d, 0x4b, 0xf2, 0xe6, + 0x48, 0x8f, 0xe9, 0x5e, 0x07, 0xef, 0xe4, 0xbb, 0x39, 0xc1, 0xc9, 0x3c, + 0xc3, 0x0b, 0xfb, 0x2a, 0x29, 0x06, 0xfe, 0x01, 0xcb, 0x63, 0x83, 0x10, + 0xa8, 0xc8, 0xa0, 0x29, 0xa5, 0x80, 0xeb, 0xbd, 0xa9, 0xd9, 0x0b, 0x61, + 0xbc, 0xce, 0x11, 0x55, 0x66, 0x12, 0xc7, 0x5b, 0xd2, 0x7a, 0x5a, 0xc8, + 0xab, 0xab, 0xbf, 0x3a, 0x1f, 0x96, 0x1a, 0x70, 0xcb, 0x41, 0x5f, 0xc8, + 0xb7, 0x09, 0x22, 0x98, 0x9b, 0xb8, 0xf7, 0x2d, 0x49, 0x65, 0x1d, 0x09, + 0x8b, 0x70, 0xb5, 0x42, 0xc9, 0x89, 0x5b, 0x74, 0xb4, 0x28, 0x82, 0x01, + 0x53, 0x12, 0x3e, 0x23, 0xf6, 0x54, 0xf8, 0x51, 0x12, 0x4b, 0x02, 0x3a, + 0x7e, 0xb6, 0x1f, 0xac, 0xa0, 0xe6, 0x6f, 0xf8, 0x61, 0x82, 0xe4, 0xfb, + 0x96, 0x2a, 0xd2, 0xaf, 0x3c, 0xea, 0x6e, 0xdc, 0x18, 0x8a, 0x5d, 0x90, + 0xda, 0xa2, 0x5d, 0xa7, 0x8f, 0x5b, 0x50, 0x46, 0xaf, 0x8c, 0x17, 0x6a, + 0x4c, 0x39, 0xfc, 0x31, 0x4c, 0x4b, 0xc2, 0x57, 0x66, 0x61, 0x98, 0xbf, + 0xe6, 0xfb, 0x54, 0x96, 0xd3, 0x70, 0xb8, 0xaf, 0xcd, 0x8b, 0xcc, 0x00, + 0x07, 0x92, 0x15, 0xc2, 0xbb, 0x48, 0xbb, 0xc6, 0xb7, 0xb5, 0x58, 0x8c, + 0xfc, 0xf0, 0xda, 0x6a, 0x0d, 0xf7, 0x1d, 0x7d, 0xc6, 0x27, 0x26, 0x1a, + 0x99, 0xc5, 0x2f, 0xf8, 0x97, 0x65, 0x43, 0x86, 0xd6, 0x25, 0x23, 0x2b, + 0x06, 0x8f, 0x12, 0xa1, 0xae, 0xbb, 0x58, 0x34, 0x25, 0xec, 0x5b, 0x68, + 0xa4, 0xe1, 0x03, 0xfc, 0x26, 0xa2, 0xd6, 0x2b, 0x61, 0x10, 0x47, 0xbd, + 0x16, 0xe5, 0xca, 0x4a, 0xce, 0xed, 0x89, 0x09, 0x1a, 0xed, 0x22, 0xc1, + 0xca, 0x44, 0xe3, 0xef, 0x72, 0x34, 0xab, 0xab, 0x61, 0x5c, 0x9f, 0x5f, + 0xb5, 0xf5, 0xe8, 0x2d, 0x89, 0xea, 0x4b, 0x40, 0x65, 0x57, 0x8b, 0xa2, + 0x95, 0x40, 0x9c, 0x72, 0xc0, 0x46, 0x69, 0x45, 0x06, 0xf6, 0x07, 0x5b, + 0x2d, 0xa5, 0x46, 0xca, 0x5d, 0xfb, 0x40, 0xb7, 0x48, 0x59, 0x5b, 0xe2, + 0x1b, 0x38, 0xb2, 0x15, 0x75, 0x66, 0x67, 0x58, 0x00, 0x3f, 0xde, 0x8a, + 0x63, 0x13, 0x34, 0x6a, 0x30, 0xca, 0xb4, 0xd5, 0x3e, 0xe0, 0x6d, 0x14, + 0xb8, 0x9a, 0x48, 0xef, 0xfd, 0xbd, 0x6d, 0x20, 0x11, 0x4d, 0x25, 0xe5, + 0xab, 0x15, 0x8d, 0xe5, 0x91, 0xbc, 0xc6, 0x69, 0x8a, 0xf8, 0xab, 0x3a, + 0x82, 0xae, 0xc5, 0x03, 0x2c, 0xcf, 0x54, 0xdc, 0xcd, 0xe8, 0x49, 0x53, + 0xb5, 0xd8, 0xc2, 0x24, 0xf8, 0x8c, 0x38, 0x8f, 0xe3, 0xfe, 0x3a, 0x18, + 0x15, 0xa8, 0xda, 0x77, 0xc8, 0x81, 0x72, 0xc6, 0xc1, 0x60, 0xa3, 0x73, + 0x65, 0x68, 0x5c, 0xf3, 0x1d, 0x8d, 0x61, 0x21, 0x65, 0xfb, 0x45, 0xc4, + 0x4c, 0x31, 0x88, 0x25, 0x0d, 0x52, 0x75, 0x3b, 0xec, 0x54, 0xe0, 0xb1, + 0x9c, 0x7c, 0xdf, 0xe3, 0x3b, 0x77, 0x31, 0x33, 0xd7, 0x25, 0x99, 0xff, + 0xc5, 0x40, 0x1e, 0x85, 0x09, 0xfd, 0x2d, 0x24, 0x4a, 0x92, 0xe7, 0x77, + 0x48, 0xa5, 0x46, 0xf4, 0x8e, 0xa3, 0x6b, 0x24, 0xe4, 0x6b, 0x31, 0xf6, + 0xe0, 0x16, 0x49, 0x9b, 0x9f, 0xa3, 0x1a, 0x5c, 0x05, 0x5e, 0x81, 0x62, + 0xc8, 0x14, 0x52, 0xb4, 0x21, 0xfd, 0x76, 0x6d, 0x88, 0xe9, 0x3b, 0x0b, + 0x75, 0x27, 0x92, 0x47, 0x5a, 0x58, 0x08, 0x26, 0xa7, 0xa2, 0x48, 0x1c, + 0x14, 0x3e, 0x5e, 0xdf, 0x81, 0x83, 0x83, 0x3e, 0xc6, 0x72, 0x27, 0xc4, + 0x6a, 0x46, 0x2b, 0xf2, 0x8d, 0x42, 0x11, 0xb9, 0x15, 0xd7, 0xf0, 0x20, + 0x29, 0x53, 0xba, 0xf0, 0x6e, 0x41, 0x3d, 0xee, 0x19, 0xf2, 0x43, 0xf3, + 0x6d, 0x00, 0xe2, 0x43, 0x77, 0xb9, 0xa9, 0x78, 0x34, 0x48, 0x3c, 0x1a, + 0x8b, 0xbd, 0xa1, 0xe5, 0x90, 0x59, 0x5b, 0xd6, 0x1e, 0x22, 0xdf, 0xb2, + 0xa7, 0x96, 0x7d, 0x55, 0x86, 0x66, 0x95, 0xb7, 0x06, 0xe7, 0x60, 0x2a, + 0x01, 0x48, 0x3f, 0xd4, 0xa7, 0xd4, 0xc2, 0x38, 0xa4, 0x10, 0x8e, 0x4f, + 0x97, 0xad, 0xa3, 0xb9, 0xe2, 0xaa, 0x13, 0xb1, 0x16, 0x89, 0x3d, 0x74, + 0x60, 0x94, 0x8c, 0xc3, 0xe6, 0x5f, 0xcf, 0xdc, 0x58, 0x17, 0x98, 0x27, + 0x86, 0xae, 0x2a, 0x0d, 0xe8, 0x33, 0x79, 0xc8, 0xc8, 0x5b, 0x59, 0xb0, + 0xba, 0xac, 0xd3, 0x6e, 0x2d, 0x7b, 0x0b, 0x9a, 0xb5, 0xfd, 0x58, 0x42, + 0xeb, 0x80, 0xf4, 0x6b, 0x9a, 0x2f, 0x19, 0x43, 0x75, 0xb4, 0xcb, 0xc9, + 0xd5, 0x28, 0xf5, 0xb9, 0x67, 0x82, 0xb4, 0xed, 0x8c, 0x3f, 0x3d, 0x6b, + 0x6d, 0x1b, 0x80, 0x13, 0x5c, 0x7b, 0x2e, 0xfa, 0xa0, 0x32, 0xba, 0xb5, + 0x46, 0xd6, 0xe7, 0x90, 0xe9, 0xd1, 0x91, 0xa0, 0xaa, 0x26, 0x35, 0xa2, + 0x0d, 0x98, 0x44, 0x11, 0xae, 0xf9, 0xc5, 0x12, 0x4d, 0x1a, 0x7c, 0x53, + 0xea, 0xf6, 0x05, 0x8d, 0x3a, 0x74, 0x92, 0xc9, 0x65, 0xeb, 0x6f, 0xb5, + 0xb4, 0xd2, 0xcd, 0x5c, 0xec, 0xaf, 0x95, 0xcb, 0xb4, 0x3c, 0x22, 0xca, + 0x1c, 0x06, 0x85, 0x16, 0x96, 0x24, 0x8c, 0x6c, 0x80, 0xf8, 0xb3, 0xa7, + 0x87, 0x77, 0xeb, 0x09, 0x71, 0xc8, 0x95, 0xfb, 0x5e, 0xe5, 0x6f, 0x78, + 0xf9, 0x60, 0xf9, 0x9e, 0x58, 0x7b, 0xbd, 0x47, 0xdd, 0x48, 0x2e, 0x56, + 0xcd, 0x63, 0x72, 0xc9, 0x4b, 0x65, 0x2d, 0x41, 0xe8, 0x81, 0x19, 0x33, + 0x4b, 0xf6, 0x02, 0xc6, 0xcb, 0x2e, 0xdf, 0x3d, 0xc8, 0xdd, 0x2f, 0x0f, + 0x09, 0x67, 0xf0, 0xaa, 0x3c, 0x51, 0xdc, 0x8d, 0xc6, 0xc3, 0xb2, 0x3b, + 0x15, 0x85, 0xcb, 0xeb, 0x62, 0xef, 0xa3, 0xf9, 0x94, 0xf4, 0x35, 0x9c, + 0x59, 0xcc, 0xc2, 0x68, 0xb4, 0xde, 0x02, 0x75, 0x8e, 0xf5, 0x33, 0xca, + 0xd5, 0xc5, 0x24, 0xae, 0xf6, 0xde, 0x2b, 0x01, 0xf4, 0x56, 0xb9, 0xa5, + 0xa7, 0xe0, 0x64, 0x2e, 0xba, 0x1d, 0x53, 0x54, 0x46, 0xcf, 0x64, 0x16, + 0x12, 0xe2, 0xa6, 0xcc, 0x18, 0xb4, 0x77, 0x8b, 0x19, 0x50, 0x43, 0x96, + 0xc8, 0x5d, 0xc3, 0x58, 0xf0, 0xfd, 0x5e, 0x13, 0xa9, 0x10, 0x67, 0xdf, + 0x25, 0xdb, 0xaf, 0x38, 0x5f, 0xbd, 0x35, 0xc1, 0x49, 0x44, 0xe8, 0x1f, + 0x12, 0xa4, 0x7c, 0x28, 0xa3, 0xd6, 0x0d, 0x6f, 0x44, 0xa9, 0x5f, 0xfc, + 0x9f, 0xfa, 0x11, 0x62, 0x87, 0x5b, 0x0e, 0x91, 0xd4, 0xb6, 0xd3, 0x71, + 0xc2, 0x77, 0x19, 0xf6, 0x7c, 0x11, 0x30, 0x5e, 0x5c, 0xd3, 0x1e, 0x90, + 0x05, 0x31, 0x63, 0xbb, 0xef, 0x85, 0xe0, 0x27, 0x94, 0x80, 0xcb, 0x33, + 0xbc, 0x5e, 0x45, 0x87, 0x62, 0xdf, 0xd4, 0x12, 0x2f, 0xf5, 0x41, 0x15, + 0x03, 0x0c, 0x80, 0xe8, 0xe2, 0x06, 0xde, 0x4b, 0x46, 0x70, 0x94, 0xd2, + 0x0d, 0x85, 0x72, 0x27, 0xe5, 0x6c, 0xeb, 0xd2, 0x78, 0x0b, 0x38, 0x40, + 0xe8, 0xdb, 0x47, 0x5c, 0xba, 0xd0, 0x21, 0x33, 0x8f, 0xb8, 0xc0, 0x66, + 0x1e, 0xd1, 0xb0, 0x94, 0xa3, 0x39, 0xc7, 0x87, 0xaf, 0x97, 0x98, 0xce, + 0x6d, 0x03, 0x1a, 0xdb, 0x52, 0x96, 0x0b, 0x9d, 0x5b, 0xf8, 0xa3, 0xf4, + 0x41, 0x95, 0x72, 0xad, 0x0e, 0x98, 0x61, 0x7f, 0xf3, 0x8f, 0x23, 0xeb, + 0xc0, 0xdf, 0xd7, 0x70, 0x26, 0x8c, 0xb3, 0xb3, 0xf0, 0xa2, 0x8a, 0x39, + 0xdd, 0x61, 0xb4, 0x53, 0xe0, 0x2a, 0x6f, 0x91, 0x34, 0x9c, 0x76, 0xf6, + 0x52, 0x93, 0xe6, 0x39, 0xb7, 0x54, 0x07, 0x46, 0x82, 0x2d, 0x05, 0x6d, + 0x9a, 0x00, 0x53, 0x65, 0x68, 0x93, 0x91, 0x00, 0xda, 0xe0, 0x93, 0x34, + 0x60, 0xb1, 0x93, 0x0b, 0x64, 0xa8, 0x12, 0xd2, 0x51, 0x3c, 0xdb, 0xb0, + 0x4c, 0x39, 0x4e, 0xce, 0xbd, 0xf0, 0x65, 0x12, 0x8a, 0xd4, 0x80, 0x7d, + 0x82, 0x85, 0xe4, 0x92, 0xc2, 0x77, 0x1e, 0xcf, 0xd9, 0xab, 0x0f, 0x9b, + 0x32, 0x2e, 0x3f, 0xe1, 0x0e, 0x87, 0x1c, 0x87, 0x34, 0xe7, 0x93, 0x16, + 0x95, 0x09, 0x7d, 0x24, 0xa8, 0xb5, 0xe0, 0x9f, 0x23, 0x87, 0x5c, 0x0b, + 0x31, 0x4a, 0x2f, 0xe2, 0x5c, 0x82, 0x49, 0x51, 0xe4, 0x93, 0xcb, 0x05, + 0x23, 0x4f, 0x8a, 0x83, 0x88, 0xfb, 0x89, 0xb0, 0x08, 0xd6, 0x64, 0xad, + 0x51, 0x84, 0x40, 0x29, 0xb1, 0xca, 0x74, 0x26, 0x29, 0x5a, 0x61, 0x01, + 0x2e, 0xa0, 0xeb, 0xeb, 0x02, 0xb5, 0xff, 0xd8, 0x20, 0x6a, 0x5e, 0x8d, + 0x17, 0x1e, 0xa3, 0xd7, 0x2f, 0x20, 0x0b, 0x93, 0x17, 0x24, 0xf7, 0x90, + 0x7b, 0xc6, 0xba, 0xd8, 0xf9, 0xe9, 0x0a, 0x2a, 0x7a, 0x81, 0x23, 0x81, + 0x03, 0x6f, 0x1e, 0x0d, 0x87, 0x83, 0xd1, 0xcf, 0x92, 0x2f, 0x19, 0x82, + 0x4e, 0x6c, 0x0a, 0x02, 0xb6, 0x70, 0xbc, 0xe1, 0x58, 0xe7, 0x16, 0xdb, + 0x2f, 0x74, 0x9f, 0xe1, 0xc2, 0x1e, 0x64, 0xc6, 0x48, 0x08, 0xee, 0xea, + 0x52, 0x9a, 0xce, 0x2c, 0xc5, 0x0c, 0x7a, 0x63, 0xf1, 0x6a, 0xbd, 0x2c, + 0x8b, 0xd5, 0x4a, 0xfa, 0x1e, 0xab, 0x9a, 0x5b, 0x25, 0xb8, 0xfa, 0x0a, + 0xe9, 0x68, 0x80, 0x6f, 0x80, 0x57, 0x10, 0x54, 0xb8, 0xa2, 0x16, 0xbd, + 0xfe, 0xf7, 0xea, 0x01, 0xc7, 0x94, 0x5a, 0x95, 0xe3, 0x61, 0xa5, 0x49, + 0x84, 0xf5, 0x79, 0x78, 0xb5, 0x0a, 0x96, 0xca, 0x01, 0x1b, 0xd0, 0x0b, + 0x51, 0x30, 0xd3, 0x48, 0xfc, 0x4d, 0x50, 0x71, 0x09, 0x73, 0xea, 0x37, + 0xcd, 0x9d, 0x3d, 0xde, 0x30, 0x56, 0x21, 0xf0, 0xef, 0x84, 0xad, 0x27, + 0xe1, 0x83, 0xdb, 0xfb, 0xcd, 0x11, 0xb2, 0xbd, 0x30, 0x67, 0x8a, 0x88, + 0x09, 0x0e, 0x9d, 0x96, 0x09, 0xba, 0xda, 0x9d, 0xf0, 0xe9, 0xb4, 0xa6, + 0x7a, 0x04, 0xf9, 0x4b, 0xb8, 0x51, 0xa9, 0x99, 0xf3, 0xbb, 0x77, 0x95, + 0x0a, 0xa1, 0xa6, 0xa1, 0x24, 0xfc, 0xcc, 0x45, 0xe8, 0x83, 0xc8, 0x6f, + 0x48, 0xad, 0x9a, 0x73, 0xd0, 0xe0, 0x57, 0x7d, 0xe4, 0x78, 0x65, 0xef, + 0xae, 0xc2, 0xfe, 0x7a, 0x56, 0xaf, 0x03, 0x71, 0x2b, 0xe6, 0xa1, 0x7e, + 0xe5, 0x12, 0xf8, 0xc3, 0x75, 0xc7, 0x22, 0x5f, 0x1b, 0x52, 0x90, 0xe5, + 0xdf, 0xba, 0x9d, 0xe2, 0x68, 0xe0, 0xb3, 0x7a, 0x9e, 0x14, 0xff, 0xb5, + 0x0a, 0x80, 0x20, 0x49, 0x88, 0xe9, 0x9c, 0xe4, 0xb5, 0xaf, 0x7e, 0x51, + 0xec, 0xe7, 0xfc, 0x64, 0x65, 0x21, 0x10, 0xc6, 0x1f, 0x7f, 0x93, 0x7d, + 0xd8, 0xf5, 0xd0, 0x98, 0x94, 0x44, 0xf8, 0x49, 0x6a, 0x51, 0x0a, 0x54, + 0xf4, 0x9f, 0xee, 0x3c, 0x56, 0xbf, 0x4c, 0xe4, 0xde, 0x1c, 0x9b, 0x11, + 0x7e, 0x9a, 0x71, 0x11, 0x80, 0x33, 0xd5, 0xb0, 0x9b, 0xef, 0x67, 0x29, + 0xa4, 0x7d, 0x70, 0x31, 0x3f, 0x8b, 0x2e, 0x4a, 0x0f, 0x2c, 0x91, 0x3d, + 0x3e, 0x3d, 0x8c, 0x0a, 0x2b, 0xf1, 0xdd, 0xbf, 0x61, 0xe6, 0xa3, 0xef, + 0x6d, 0x82, 0xc8, 0xb7, 0x5e, 0x2b, 0x83, 0xc9, 0x4e, 0xa0, 0x85, 0x7f, + 0x01, 0x5a, 0xca, 0x6e, 0x90, 0xfa, 0x7e, 0x82, 0x4d, 0x35, 0x7e, 0xe0, + 0x26, 0x40, 0xf4, 0xa6, 0xae, 0xc3, 0x89, 0xf3, 0xca, 0x55, 0x2c, 0xb5, + 0x29, 0x05, 0x94, 0x45, 0xa7, 0x45, 0xf3, 0x3d, 0xbb, 0x53, 0x5e, 0xca, + 0x7c, 0x84, 0x8f, 0x72, 0x98, 0x93, 0x90, 0x1f, 0x56, 0x72, 0xdb, 0xbd, + 0xa9, 0xeb, 0xf9, 0xe9, 0xce, 0xb1, 0x41, 0xc3, 0xaa, 0xa0, 0xc4, 0x74, + 0x23, 0xc1, 0xeb, 0x7d, 0x41, 0xcd, 0xa4, 0x62, 0xec, 0xfc, 0x9a, 0xa4, + 0x16, 0xec, 0x67, 0x41, 0x89, 0xf0, 0x0e, 0xf3, 0xd1, 0xa2, 0x2f, 0xba, + 0x5d, 0x93, 0x36, 0x46, 0xf5, 0x52, 0x64, 0x91, 0xe7, 0x40, 0x91, 0x20, + 0xa1, 0xc9, 0xaa, 0x4c, 0x79, 0xc4, 0xbb, 0x67, 0x79, 0xad, 0x43, 0xab, + 0xba, 0xde, 0xfc, 0xf1, 0x74, 0x81, 0x33, 0xc0, 0x3f, 0x39, 0xd1, 0xd1, + 0xdf, 0xc0, 0x53, 0x33, 0xb2, 0x92, 0x37, 0xe6, 0x86, 0x2a, 0xe4, 0xe1, + 0x7c, 0x98, 0xf7, 0xdb, 0x5c, 0xa9, 0xff, 0x8d, 0x9c, 0xab, 0xe2, 0xf2, + 0xd5, 0xb1, 0x42, 0xa9, 0xf4, 0x97, 0x80, 0xcd, 0xde, 0x25, 0x2e, 0x87, + 0x92, 0xdd, 0xcf, 0xed, 0x67, 0x93, 0x8c, 0x5a, 0x1d, 0xee, 0xcf, 0x9d, + 0x50, 0x8f, 0xa7, 0xe3, 0x5c, 0xa3, 0x68, 0x78, 0x24, 0xeb, 0x60, 0xa3, + 0x8b, 0x36, 0xbb, 0xcb, 0x46, 0xee, 0x77, 0xfb, 0xf8, 0x69, 0x24, 0xd1, + 0xfa, 0xad, 0x76, 0x76, 0x5e, 0x54, 0xe5, 0xb6, 0x36, 0xc6, 0xdd, 0xa9, + 0x6c, 0x44, 0x15, 0xf7, 0x0a, 0xf8, 0xbb, 0xba, 0xec, 0x35, 0xff, 0xc9, + 0xd6, 0x5d, 0xf5, 0x73, 0x4a, 0x15, 0x8f, 0x7b, 0x6e, 0xf4, 0xa0, 0x6d, + 0x10, 0xbb, 0x67, 0x0c, 0xb4, 0x69, 0xad, 0xb6, 0x40, 0xf7, 0x5f, 0x37, + 0x28, 0xc4, 0x08, 0x49, 0xd0, 0x16, 0x70, 0x80, 0xea, 0x55, 0x66, 0x07, + 0xc8, 0x03, 0x1b, 0xf6, 0xd3, 0x03, 0x04, 0x74, 0xe0, 0x50, 0x3f, 0xd2, + 0x53, 0x92, 0xa0, 0x9d, 0x59, 0xc9, 0x74, 0xf2, 0x7e, 0x3b, 0x33, 0x02, + 0x10, 0x0b, 0x39, 0xf7, 0x4f, 0x6b, 0x58, 0xb2, 0x1a, 0xda, 0x65, 0x44, + 0xd1, 0x7c, 0x3f, 0xd7, 0xe3, 0xac, 0xe2, 0x1f, 0x38, 0xc1, 0x6a, 0xb0, + 0xdc, 0xc3, 0x9c, 0x7b, 0x11, 0x3c, 0x05, 0x21, 0x96, 0x76, 0x98, 0x76, + 0x82, 0xc1, 0x54, 0xdf, 0xdc, 0x8f, 0x4c, 0xd2, 0x63, 0x04, 0x06, 0x77, + 0x36, 0xe6, 0x2e, 0xd1, 0x00, 0x28, 0x42, 0x7c, 0x4a, 0x27, 0x90, 0x46, + 0xc9, 0xce, 0x33, 0x1c, 0xae, 0xda, 0x79, 0x64, 0x7f, 0x52, 0x3f, 0x58, + 0x11, 0x76, 0x4a, 0xb6, 0x72, 0xd8, 0x76, 0xae, 0xfd, 0x5c, 0x57, 0x69, + 0x76, 0x91, 0x84, 0x21, 0xc4, 0x9b, 0xd8, 0xa2, 0xff, 0x93, 0x02, 0x77, + 0x61, 0x57, 0x96, 0x7b, 0x8e, 0xfc, 0xf2, 0x6c, 0x11, 0x2b, 0x5e, 0x88, + 0x5c, 0x17, 0x1d, 0x12, 0x79, 0x3a, 0x78, 0xb6, 0x9d, 0x70, 0xfa, 0xd4, + 0xc1, 0x5c, 0x90, 0x0e, 0x0a, 0xd1, 0x3c, 0x7d, 0xcf, 0xee, 0x8a, 0xb2, + 0xb2, 0x4d, 0xce, 0x89, 0x32, 0xa9, 0x6c, 0x56, 0x57, 0x85, 0xb1, 0xbf, + 0x18, 0x1d, 0xc6, 0xe1, 0x17, 0xc5, 0x92, 0x42, 0x99, 0xf9, 0x9f, 0x04, + 0xec, 0x38, 0xf8, 0xa0, 0xd2, 0xab, 0xe6, 0x13, 0x4d, 0x9c, 0x18, 0x86, + 0x3e, 0x18, 0x73, 0x2c, 0xac, 0xe0, 0xb9, 0xf9, 0x87, 0x74, 0xb8, 0xd7, + 0x47, 0x6e, 0x42, 0xfc, 0x29, 0xa0, 0x1f, 0x56, 0x68, 0xb6, 0x23, 0x96, + 0xa2, 0x8d, 0x54, 0x81, 0x0f, 0x60, 0xb9, 0xde, 0x93, 0xfc, 0xfd, 0xde, + 0xbe, 0xb3, 0xb5, 0x87, 0xec, 0x9f, 0x17, 0xc2, 0x77, 0x6e, 0xa0, 0x62, + 0xdb, 0x66, 0xba, 0xc5, 0x05, 0x12, 0x46, 0x5d, 0x3c, 0x23, 0x29, 0x68, + 0xe5, 0x31, 0xe3, 0x15, 0xec, 0xac, 0x15, 0x9a, 0xbf, 0x42, 0x65, 0x80, + 0x45, 0x9c, 0x1d, 0xc2, 0x0e, 0x18, 0x47, 0x40, 0x44, 0xc1, 0x55, 0x24, + 0x5a, 0x35, 0xad, 0x59, 0xd2, 0xc6, 0xc3, 0x68, 0x58, 0xbd, 0x6f, 0xcf, + 0x5d, 0xb1, 0x9b, 0x0c, 0x92, 0x39, 0x22, 0x49, 0x66, 0x2e, 0x03, 0x7b, + 0x75, 0x5c, 0x6c, 0xde, 0x37, 0x54, 0xa9, 0x07, 0x2f, 0x7e, 0xc1, 0x3e, + 0x3b, 0xab, 0xd2, 0xa9, 0xfa, 0xc7, 0x6b, 0xd5, 0x14, 0x08, 0x35, 0x89, + 0x0b, 0x31, 0x18, 0x54, 0x7d, 0x6b, 0x53, 0x80, 0x6e, 0x32, 0x9b, 0xff, + 0x61, 0x7f, 0x36, 0xe5, 0x28, 0x40, 0xbc, 0xc7, 0x19, 0xb3, 0xae, 0xfa, + 0x95, 0xa8, 0xae, 0xd2, 0x97, 0x72, 0xc6, 0x91, 0x36, 0x3a, 0xa6, 0xec, + 0x4a, 0x41, 0x63, 0x6b, 0x28, 0xef, 0x5a, 0xa1, 0xdb, 0xf2, 0xd9, 0xfd, + 0x61, 0x72, 0xa4, 0xd2, 0x9e, 0xf7, 0x47, 0xf4, 0x4e, 0xea, 0x2a, 0xa5, + 0x35, 0xe1, 0x77, 0x3a, 0x53, 0x28, 0xa6, 0x55, 0x48, 0x0c, 0x1e, 0x44, + 0xfc, 0xc1, 0x31, 0x5a, 0x00, 0xcd, 0x29, 0xc1, 0x5c, 0xca, 0x2a, 0x07, + 0x01, 0x63, 0xac, 0xb3, 0xfb, 0xf6, 0x0b, 0xac, 0xfd, 0xe8, 0x7b, 0xed, + 0xf9, 0x3d, 0x9a, 0xbc, 0x67, 0x28, 0x1c, 0xd9, 0x3f, 0x97, 0x28, 0x4a, + 0xe7, 0xd0, 0x08, 0xe9, 0x3e, 0xa0, 0xcb, 0x0f, 0xe0, 0x3f, 0x1b, 0x80, + 0x43, 0x74, 0xd9, 0x9d, 0x0b, 0x22, 0x81, 0xf7, 0xec, 0x71, 0x2a, 0x29, + 0x9e, 0x5d, 0x1e, 0x8d, 0xf4, 0x22, 0x95, 0x78, 0x86, 0xcb, 0xf0, 0x9d, + 0xe7, 0x6a, 0x66, 0x7e, 0x28, 0xb5, 0x47, 0xb6, 0xdc, 0x0d, 0x03, 0x3c, + 0x09, 0x58, 0x76, 0x93, 0x39, 0xb2, 0xd3, 0x75, 0xb4, 0x51, 0x55, 0x84, + 0x30, 0x24, 0x0a, 0x76, 0xf4, 0x97, 0xe7, 0x0f, 0x5a, 0x67, 0xee, 0xf4, + 0xc7, 0x69, 0x8d, 0xf2, 0x32, 0x29, 0x5c, 0x33, 0x82, 0x5f, 0x6c, 0x47, + 0xd0, 0xe2, 0xbd, 0x62, 0xd6, 0x4c, 0x6d, 0x0d, 0xba, 0x87, 0xd3, 0x43, + 0x7e, 0x2d, 0xa6, 0x14, 0x09, 0x4f, 0x3b, 0xc3, 0x04, 0x14, 0xe5, 0x65, + 0xe9, 0x3b, 0x6a, 0xca, 0xb5, 0x96, 0x84, 0x3f, 0x53, 0x49, 0x22, 0x45, + 0x91, 0xff, 0xf9, 0x26, 0x75, 0x0d, 0x9c, 0xa7, 0x00, 0xf4, 0x65, 0xc4, + 0x60, 0x72, 0xab, 0xeb, 0xf8, 0xa8, 0x72, 0xfe, 0xd8, 0xde, 0x93, 0x67, + 0xcb, 0x09, 0xcc, 0xa0, 0xce, 0x9f, 0x67, 0x63, 0x26, 0xfa, 0x7f, 0x89, + 0xaa, 0x3e, 0x6d, 0xb2, 0x90, 0xd7, 0xef, 0x3e, 0x2a, 0x66, 0x26, 0x33, + 0xe6, 0x26, 0xc1, 0x58, 0xf8, 0x91, 0xea, 0x2f, 0xd0, 0x84, 0x21, 0x41, + 0x93, 0xa6, 0x36, 0x40, 0xb5, 0x4c, 0xac, 0x21, 0x88, 0x37, 0x47, 0x8a, + 0xb8, 0xf3, 0x33, 0x73, 0x12, 0xd7, 0x5a, 0x55, 0xf9, 0xd1, 0x1e, 0x75, + 0xa4, 0x66, 0x68, 0x3f, 0xf7, 0xb2, 0xc4, 0x5d, 0x1b, 0xb1, 0x61, 0x0f, + 0xaf, 0x4b, 0x9b, 0x20, 0x2b, 0x05, 0x68, 0x1c, 0x6c, 0x97, 0x8d, 0xb8, + 0x7b, 0x96, 0xda, 0xe0, 0x67, 0x15, 0x4c, 0x51, 0x71, 0x0d, 0xd3, 0x7b, + 0xde, 0xaa, 0xd3, 0x58, 0xf5, 0xc9, 0x62, 0x0a, 0xc2, 0x33, 0x1f, 0xf3, + 0xc3, 0x30, 0xb5, 0x64, 0xd1, 0x59, 0x41, 0x0e, 0xae, 0xaa, 0x0d, 0xdf, + 0x9f, 0x5d, 0x3f, 0x15, 0x0d, 0x46, 0x7a, 0x6d, 0x2e, 0x29, 0x1b, 0xc0, + 0xd3, 0x11, 0x10, 0x5d, 0xdc, 0x6a, 0x35, 0x8c, 0x43, 0xc8, 0x9f, 0x05, + 0x80, 0xdc, 0x25, 0x24, 0x37, 0x70, 0x7e, 0x1c, 0xe9, 0x85, 0x5a, 0xef, + 0x83, 0x3a, 0x55, 0x68, 0x83, 0x17, 0xf4, 0xc7, 0xae, 0xe4, 0x84, 0xc9, + 0x64, 0x5d, 0x2f, 0xb6, 0xca, 0x10, 0x95, 0xb8, 0xd6, 0x80, 0xfd, 0x05, + 0xa5, 0x06, 0x32, 0x34, 0x91, 0x01, 0xd2, 0x02, 0x90, 0xe1, 0xf7, 0x89, + 0x8a, 0xee, 0x18, 0x04, 0x93, 0xd9, 0xb4, 0x63, 0x4b, 0xf7, 0x7a, 0x9c, + 0x1b, 0x4b, 0xf9, 0x31, 0x32, 0xd9, 0xf2, 0x55, 0x4e, 0xc1, 0x02, 0xce, + 0x77, 0x38, 0x36, 0x29, 0xb8, 0x54, 0x8c, 0xc2, 0x27, 0x5f, 0xd9, 0xae, + 0x3e, 0x1e, 0xcd, 0xe9, 0x07, 0x90, 0x4c, 0xe0, 0xda, 0x16, 0x6e, 0xdf, + 0xde, 0x3a, 0x61, 0x89, 0x9f, 0x79, 0xd0, 0xd4, 0x66, 0x95, 0xad, 0xe4, + 0x11, 0x7d, 0xa1, 0xae, 0xec, 0x3e, 0x6e, 0x20, 0x5a, 0xd0, 0x28, 0x0e, + 0x55, 0xec, 0xcf, 0x34, 0xec, 0xb7, 0xfc, 0xa4, 0xb3, 0x8f, 0x56, 0x13, + 0x50, 0xcc, 0x15, 0x10, 0x74, 0x40, 0x72, 0x42, 0x20, 0x22, 0xb3, 0xaf, + 0xf3, 0x68, 0xba, 0x95, 0x45, 0xcb, 0xef, 0x92, 0xd5, 0x14, 0x4c, 0x1f, + 0xe3, 0xc1, 0xa6, 0x03, 0x4e, 0x05, 0xd2, 0x1a, 0xee, 0xd2, 0x48, 0x44, + 0x2e, 0x50, 0x3b, 0x86, 0xc8, 0x6a, 0xc8, 0x4c, 0xca, 0x2a, 0xb6, 0xf7, + 0x3c, 0xaf, 0xdc, 0x62, 0xb1, 0x49, 0x13, 0xfe, 0xe7, 0x32, 0xea, 0x78, + 0xfa, 0xba, 0xcf, 0x15, 0x47, 0x58, 0xdc, 0x19, 0x73, 0x1d, 0xff, 0xbd, + 0xcc, 0x27, 0xf6, 0xfc, 0x66, 0x68, 0xa7, 0x29, 0xaf, 0x2b, 0x25, 0x0c, + 0x15, 0x47, 0xff, 0xc1, 0x00, 0x9d, 0xfa, 0x58, 0x9c, 0xaa, 0xf9, 0xcc, + 0x4c, 0x51, 0x1d, 0xda, 0xf3, 0x3c, 0x10, 0xd0, 0x3b, 0x59, 0x30, 0x02, + 0x68, 0x29, 0x1c, 0xa7, 0x22, 0xea, 0x81, 0xd3, 0x29, 0x71, 0x39, 0xe8, + 0x72, 0x7f, 0x7d, 0x94, 0x0a, 0x64, 0x2c, 0xe6, 0x55, 0xfb, 0x90, 0x78, + 0x7e, 0x6c, 0x3e, 0xfe, 0x57, 0x14, 0x61, 0xef, 0xe2, 0x63, 0x57, 0x6c, + 0x13, 0x97, 0x27, 0x2b, 0x38, 0x44, 0xab, 0x74, 0x76, 0x11, 0xa6, 0x60, + 0xad, 0x8e, 0xad, 0xe5, 0xa5, 0xa1, 0x66, 0xc5, 0xe1, 0x4d, 0x27, 0xa0, + 0x79, 0x7a, 0x09, 0xe6, 0xf0, 0x28, 0x3f, 0xcb, 0xc6, 0xf8, 0x94, 0xc0, + 0xf1, 0x13, 0xbe, 0x62, 0x6a, 0x52, 0x75, 0x52, 0xd3, 0x82, 0x31, 0xbd, + 0x15, 0xf2, 0xe8, 0x2e, 0xb1, 0x62, 0x03, 0x1e, 0xe2, 0xb3, 0xec, 0xbc, + 0x3c, 0x12, 0xca, 0x62, 0x4e, 0xc2, 0x3a, 0x51, 0x1c, 0xdf, 0xa2, 0x84, + 0x88, 0xe5, 0x7e, 0xd7, 0x5d, 0xd7, 0xbf, 0xf2, 0x7d, 0xbd, 0x9a, 0x90, + 0x63, 0xfd, 0x8a, 0x84, 0x2b, 0x9d, 0x89, 0x27, 0x63, 0x4c, 0x0a, 0xe3, + 0x70, 0x94, 0x7b, 0xe6, 0xb3, 0xd7, 0xcb, 0xcb, 0x8a, 0xeb, 0x6b, 0x53, + 0x34, 0x2f, 0x62, 0x44, 0x2d, 0x73, 0x63, 0x8a, 0xf4, 0xa2, 0x01, 0xd7, + 0x12, 0xb6, 0x8d, 0x8c, 0x4b, 0x73, 0x2b, 0x44, 0x50, 0x49, 0x6f, 0x01, + 0xac, 0xc5, 0x15, 0x37, 0x6c, 0xde, 0xd4, 0x02, 0xb1, 0x12, 0x80, 0x73, + 0xb2, 0x52, 0x0e, 0xe0, 0xb5, 0x75, 0xc9, 0x48, 0xcf, 0x18, 0x5c, 0xcc, + 0xaf, 0x58, 0xa2, 0x3e, 0x28, 0xe4, 0xab, 0xde, 0xea, 0x2a, 0xcf, 0x58, + 0x22, 0xc4, 0x68, 0xea, 0x9b, 0x7b, 0x90, 0xc5, 0xdc, 0x1c, 0x37, 0xd1, + 0x8a, 0x4f, 0xe7, 0x24, 0x23, 0x39, 0xb9, 0x62, 0xb8, 0x41, 0x13, 0x7b, + 0xe2, 0x1e, 0x0d, 0x4e, 0x38, 0x11, 0xa3, 0xb9, 0x10, 0xbb, 0x10, 0x6f, + 0x40, 0x9f, 0x50, 0x05, 0xc7, 0x0e, 0xb9, 0x9e, 0xab, 0x7c, 0x3c, 0x78, + 0xce, 0x54, 0xbf, 0xbf, 0x40, 0x36, 0x76, 0xbc, 0x4b, 0x64, 0x32, 0xca, + 0x0e, 0x2d, 0x91, 0x87, 0xd5, 0x00, 0x19, 0xbf, 0x12, 0xd0, 0x35, 0x7c, + 0xa1, 0xe5, 0xcf, 0x7a, 0x2d, 0x08, 0x62, 0xed, 0x34, 0x61, 0xe3, 0xda, + 0x2c, 0xcc, 0x1b, 0xf8, 0x12, 0xfe, 0xfd, 0x19, 0xa2, 0xc3, 0x70, 0xfd, + 0x4f, 0x5b, 0x5d, 0x20, 0xd2, 0xe1, 0xc5, 0xac, 0xe7, 0xa1, 0x84, 0x00, + 0xbd, 0x46, 0x81, 0xfd, 0x54, 0x69, 0xed, 0x1a, 0x7a, 0x32, 0xbb, 0x75, + 0x22, 0x76, 0x6d, 0x34, 0x24, 0xcc, 0xe6, 0xbe, 0x78, 0x5a, 0x75, 0x6c, + 0xbc, 0x62, 0xb8, 0x14, 0xf7, 0x13, 0x73, 0xc2, 0xdc, 0xb6, 0xfa, 0xfb, + 0x97, 0xfe, 0x27, 0x7b, 0x33, 0xb8, 0xeb, 0x20, 0xd2, 0x0f, 0x4f, 0xed, + 0xd1, 0xd0, 0x63, 0xf7, 0xc5, 0x8e, 0xec, 0xcc, 0xd2, 0x31, 0x38, 0x35, + 0x65, 0x33, 0x5c, 0x63, 0x85, 0xf7, 0x3d, 0xc3, 0x62, 0x26, 0x52, 0x0a, + 0x67, 0xda, 0x87, 0x1f, 0x9e, 0x47, 0xec, 0x6b, 0xf5, 0x74, 0x1a, 0xc5, + 0xa7, 0xa0, 0x0f, 0xdd, 0xc5, 0x42, 0xf4, 0xda, 0x41, 0x1a, 0x48, 0xa9, + 0xbe, 0x4f, 0xb6, 0x28, 0x17, 0xe9, 0xf5, 0xd7, 0x00, 0xb3, 0xfe, 0x05, + 0x4e, 0xa7, 0xdf, 0x65, 0x7a, 0xb8, 0x4f, 0xe0, 0xfe, 0x58, 0x9e, 0xba, + 0x45, 0x11, 0xba, 0xc2, 0xdb, 0x97, 0x97, 0xa4, 0xbc, 0x18, 0x21, 0x1b, + 0xad, 0x82, 0xef, 0xb1, 0x5f, 0x2f, 0x25, 0x9d, 0xca, 0x52, 0xa5, 0x6d, + 0x8c, 0xab, 0x07, 0x2b, 0x7b, 0x6a, 0x77, 0x9d, 0xdf, 0xfb, 0xae, 0x6e, + 0x49, 0x18, 0x25, 0x4a, 0xf2, 0x7d, 0xa0, 0x32, 0xc8, 0x53, 0x10, 0xc3, + 0xf2, 0xef, 0xf3, 0xe7, 0x79, 0xd7, 0x6a, 0x0e, 0x61, 0xff, 0x89, 0xc9, + 0x42, 0xe8, 0x6e, 0x4f, 0x78, 0xe1, 0x5f, 0xcd, 0x7a, 0xf6, 0x27, 0x72, + 0x67, 0xea, 0x0b, 0xa6, 0xcc, 0x34, 0xb7, 0x8f, 0x92, 0x3c, 0x95, 0xb9, + 0x0a, 0x5d, 0x49, 0x2e, 0xb7, 0x7d, 0x31, 0x9c, 0x79, 0x61, 0x95, 0x9c, + 0x60, 0x56, 0x8d, 0x35, 0x00, 0xc5, 0x8b, 0xe6, 0x02, 0x0f, 0x26, 0x39, + 0x7b, 0x93, 0x94, 0xb1, 0xcd, 0xde, 0xed, 0xfa, 0x2a, 0x4b, 0x63, 0xa8, + 0x1b, 0x31, 0x43, 0x5e, 0x69, 0x7c, 0xd6, 0x15, 0x35, 0x9c, 0xa2, 0xd7, + 0xdf, 0x0e, 0x1a, 0x20, 0x50, 0xf5, 0x02, 0x21, 0x30, 0x35, 0x3c, 0x60, + 0x71, 0xad, 0xd0, 0xe3, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x10, 0x17, 0x1d, 0x22, 0x2d, +}; + +#elif MLD_CONFIG_PARAMETER_SET == 87 +const uint8_t expected_pk[] = { + 0xb4, 0x32, 0xa7, 0x61, 0x06, 0x53, 0x60, 0x1e, 0x6c, 0xa4, 0x96, 0xdc, + 0x35, 0x4c, 0x99, 0x93, 0x20, 0xed, 0x4d, 0x1b, 0x20, 0x89, 0x75, 0x0c, + 0x8f, 0x64, 0x0f, 0x6a, 0x13, 0x46, 0x4f, 0xda, 0x78, 0x66, 0x0d, 0xa5, + 0x27, 0x7b, 0xbc, 0x9c, 0xda, 0xbb, 0x43, 0xcd, 0x38, 0x43, 0xa1, 0xbd, + 0x53, 0x46, 0xd5, 0x0f, 0x59, 0x1e, 0xcd, 0x77, 0x83, 0x7e, 0xb3, 0xbc, + 0x50, 0xfa, 0xeb, 0x8e, 0xb2, 0x02, 0x80, 0x7b, 0x1e, 0x52, 0xe7, 0xe2, + 0x90, 0xac, 0xdb, 0xaa, 0xe6, 0x10, 0x27, 0xc9, 0x1c, 0xc7, 0x62, 0xb2, + 0x00, 0xd2, 0x82, 0x28, 0x8b, 0xd5, 0x9c, 0x52, 0x41, 0x75, 0x3c, 0x1f, + 0xcd, 0x01, 0xc4, 0x6a, 0xd9, 0xd0, 0xfe, 0x19, 0xeb, 0xcb, 0x73, 0xbb, + 0x9b, 0xb4, 0xf6, 0xc6, 0x1c, 0x79, 0x0a, 0xfa, 0x95, 0xaf, 0xb9, 0xeb, + 0x1c, 0x0c, 0xa5, 0x16, 0xdd, 0x79, 0x78, 0xf6, 0x20, 0x37, 0xce, 0xd4, + 0x49, 0xa6, 0x11, 0x6d, 0xa1, 0xe6, 0x14, 0xe8, 0xc3, 0xb5, 0xf4, 0x96, + 0xc3, 0xcd, 0x2d, 0x2d, 0x18, 0x70, 0xe6, 0x08, 0xf4, 0xfa, 0xfd, 0x99, + 0x3e, 0xed, 0x3f, 0xf1, 0x20, 0x56, 0xa1, 0x3e, 0xc6, 0xf3, 0x57, 0x64, + 0xf8, 0x67, 0xcb, 0x15, 0xe6, 0xeb, 0xfd, 0x65, 0x4a, 0x66, 0x5d, 0x4e, + 0x2d, 0x2c, 0x6a, 0x80, 0x4f, 0x1c, 0xa0, 0xcc, 0x10, 0x1b, 0xb3, 0x35, + 0xe4, 0xfd, 0x1b, 0xf3, 0x0b, 0xc7, 0xf3, 0x3c, 0x54, 0x8b, 0x66, 0x98, + 0x5e, 0x55, 0xc8, 0xac, 0xca, 0xc3, 0x47, 0x5f, 0x4f, 0xf5, 0x57, 0x42, + 0x23, 0xec, 0x4e, 0x79, 0xcc, 0x78, 0x8c, 0x60, 0xd1, 0x3e, 0x22, 0xf2, + 0x41, 0x53, 0xcc, 0x31, 0xa3, 0xc4, 0xfc, 0x8e, 0xd7, 0xcd, 0x63, 0x9c, + 0x5e, 0xa8, 0x5a, 0x14, 0x29, 0x17, 0xf9, 0x63, 0x28, 0x4e, 0xf1, 0xb9, + 0x32, 0x2f, 0x0d, 0x28, 0x8e, 0x32, 0x7f, 0x72, 0x72, 0x79, 0xe3, 0xcc, + 0xbc, 0x51, 0xf1, 0x6d, 0x12, 0x60, 0x24, 0x70, 0x6d, 0xfb, 0x91, 0x8a, + 0xd1, 0xc9, 0xe5, 0x7a, 0x0d, 0x43, 0x5a, 0xc7, 0xd8, 0xea, 0x1e, 0x73, + 0xbd, 0x3a, 0xfb, 0x1e, 0x27, 0x70, 0x1d, 0x97, 0x9b, 0x44, 0x76, 0x98, + 0x5e, 0x51, 0x84, 0x86, 0xfb, 0x11, 0x8c, 0xfd, 0xf3, 0xe2, 0xc7, 0xf0, + 0xc9, 0x5f, 0x99, 0x62, 0x15, 0x8a, 0x83, 0xfd, 0xdc, 0xe9, 0x3a, 0xda, + 0xfc, 0x8f, 0xe7, 0x65, 0x81, 0x40, 0x80, 0xa9, 0xd2, 0xd7, 0xdf, 0xe4, + 0x33, 0xfe, 0x5e, 0x8c, 0x26, 0x75, 0x64, 0x27, 0x31, 0xf5, 0x6f, 0x7c, + 0x8a, 0x9b, 0x49, 0x74, 0x43, 0x82, 0xfc, 0xe0, 0xbb, 0x19, 0x1d, 0xcd, + 0x76, 0x19, 0xa3, 0xe1, 0xbe, 0x53, 0x02, 0x96, 0x88, 0xbd, 0xe8, 0x75, + 0x7b, 0x24, 0x34, 0x59, 0x9b, 0xf0, 0x31, 0x09, 0x73, 0x24, 0xf4, 0x32, + 0xe1, 0xf9, 0x57, 0x27, 0x1f, 0x81, 0xf0, 0x62, 0xd9, 0x79, 0x18, 0x21, + 0xfa, 0x15, 0x47, 0xe0, 0xca, 0xbe, 0x96, 0x81, 0x3f, 0x92, 0x38, 0x65, + 0x00, 0x47, 0x0c, 0xfa, 0xcf, 0xf0, 0xec, 0x36, 0x2b, 0xba, 0x1b, 0x8b, + 0xb5, 0x52, 0xc1, 0x5f, 0xcf, 0x5d, 0x4c, 0xf0, 0x80, 0x5e, 0xd9, 0x11, + 0x92, 0x07, 0xba, 0x26, 0x14, 0x33, 0xac, 0x66, 0x7f, 0x16, 0x97, 0xe5, + 0xd4, 0x3d, 0x6e, 0xa7, 0x52, 0x58, 0xec, 0xe4, 0xe4, 0x83, 0xa3, 0x26, + 0xa3, 0xa2, 0x8e, 0xa3, 0x4c, 0x74, 0x96, 0xb7, 0x6a, 0x84, 0x15, 0x31, + 0xc1, 0x3a, 0x97, 0xf8, 0xd0, 0xb6, 0xf4, 0x62, 0x02, 0x68, 0x05, 0xf3, + 0x81, 0x59, 0x2d, 0x9d, 0x28, 0x29, 0x13, 0xa0, 0x81, 0x53, 0x08, 0xdd, + 0xa0, 0x8d, 0x7b, 0x63, 0xc9, 0x8e, 0xff, 0xf7, 0x36, 0xf2, 0xf3, 0x6b, + 0x91, 0x3c, 0xae, 0xbf, 0x42, 0xc2, 0xc3, 0xec, 0x0c, 0x93, 0x06, 0x74, + 0x4f, 0x5f, 0x48, 0x26, 0xaf, 0x24, 0xda, 0xf7, 0x84, 0xc3, 0x3a, 0xb3, + 0x26, 0xf7, 0xed, 0x69, 0xd2, 0xcb, 0x46, 0x03, 0x8b, 0xd3, 0x3d, 0x2c, + 0xe8, 0xa0, 0xbd, 0x87, 0x62, 0xba, 0xb8, 0xb7, 0x92, 0xc4, 0xe4, 0x7a, + 0x13, 0x32, 0x73, 0x09, 0x93, 0xb9, 0xa0, 0x58, 0xd4, 0xa4, 0x7b, 0x0a, + 0x57, 0x5a, 0xcb, 0x06, 0xd3, 0xc0, 0x1f, 0x8c, 0xdd, 0x5c, 0xd5, 0x9f, + 0xe2, 0xbd, 0x63, 0x1d, 0x11, 0x6a, 0x6d, 0xa4, 0x31, 0xb6, 0x6b, 0x78, + 0x13, 0x97, 0xc8, 0x89, 0x3e, 0x37, 0x75, 0x02, 0x8b, 0xff, 0x8e, 0x82, + 0xe1, 0x51, 0x36, 0xb0, 0xcd, 0xc8, 0x95, 0x2e, 0x5c, 0x1d, 0xb0, 0x7b, + 0xb8, 0x8c, 0x9f, 0x6d, 0x3e, 0x3b, 0xa9, 0x35, 0x94, 0x59, 0xe7, 0x50, + 0xc5, 0x16, 0x2e, 0xea, 0x91, 0xed, 0x73, 0x76, 0xa7, 0xaf, 0x3a, 0x26, + 0xd6, 0xc4, 0x26, 0x5d, 0xed, 0x42, 0x84, 0xf5, 0x97, 0x5f, 0xf9, 0xa1, + 0xd8, 0xc8, 0x5a, 0xa9, 0xc6, 0x76, 0x82, 0x8e, 0x2c, 0x39, 0x4a, 0x9f, + 0x73, 0x2a, 0xd4, 0x00, 0x04, 0xd2, 0x50, 0xb5, 0x88, 0x74, 0x29, 0xd3, + 0xe8, 0x92, 0x3a, 0x6b, 0x04, 0x27, 0xe0, 0xa7, 0xdf, 0xc9, 0x41, 0x13, + 0x31, 0x21, 0xcc, 0xc3, 0xb7, 0x23, 0x20, 0xde, 0xc5, 0xff, 0xf6, 0x78, + 0x9c, 0x32, 0x7c, 0x09, 0x5a, 0xd3, 0x99, 0xbf, 0x6c, 0x2d, 0xd0, 0x96, + 0xa1, 0xfa, 0x20, 0x53, 0xff, 0xb9, 0x65, 0x50, 0xa7, 0x99, 0x2b, 0x9f, + 0xb2, 0x03, 0xcb, 0xca, 0x3b, 0x00, 0x04, 0x86, 0xe1, 0x11, 0x46, 0x90, + 0x39, 0x3c, 0xae, 0xd7, 0x81, 0x4a, 0x60, 0xbd, 0x94, 0x5b, 0x0b, 0xe4, + 0xd3, 0x34, 0xdc, 0x91, 0xfd, 0x84, 0x9a, 0xea, 0x6b, 0xb8, 0x00, 0x8a, + 0x74, 0x88, 0xc0, 0x37, 0x3c, 0x1d, 0xc2, 0xbe, 0xc0, 0x90, 0x4a, 0xaf, + 0x50, 0x32, 0x42, 0x54, 0xdf, 0x61, 0x04, 0x64, 0x90, 0xba, 0xa7, 0xce, + 0x47, 0x85, 0x1d, 0x12, 0xd6, 0xab, 0xd1, 0x83, 0x80, 0x3a, 0x5c, 0x4a, + 0x48, 0x34, 0x52, 0xf1, 0xd8, 0xfe, 0x0d, 0x55, 0xa6, 0xe8, 0x5a, 0xf7, + 0xd2, 0x04, 0x66, 0x47, 0xff, 0x69, 0xcd, 0x6b, 0xc5, 0x99, 0x80, 0x31, + 0x21, 0xc8, 0xbf, 0xdf, 0x0c, 0x0e, 0x7a, 0xd9, 0x76, 0x70, 0x0d, 0xa4, + 0x2e, 0x91, 0x2e, 0x4c, 0x86, 0x75, 0xb6, 0x10, 0x3a, 0xf0, 0x0c, 0x11, + 0x6e, 0x44, 0xdf, 0x1b, 0x6c, 0xc2, 0x88, 0xbd, 0x9e, 0x95, 0x92, 0x85, + 0x9b, 0x5a, 0x52, 0x1f, 0x5b, 0x9c, 0xcb, 0xb0, 0x8b, 0xa6, 0x15, 0x4d, + 0xa7, 0xe5, 0xe3, 0x80, 0xda, 0x01, 0x1c, 0x93, 0xc9, 0x5b, 0x4f, 0x42, + 0x2c, 0x55, 0xfb, 0x2a, 0x93, 0xa5, 0x96, 0xb7, 0x58, 0x1e, 0xe3, 0x48, + 0x12, 0x5d, 0xb2, 0xb2, 0x99, 0xfd, 0xfb, 0x36, 0xe3, 0xbd, 0xe6, 0xe8, + 0xd1, 0x5d, 0xbd, 0x80, 0x10, 0x4b, 0xd3, 0x3a, 0xdd, 0xfc, 0xeb, 0xc8, + 0x03, 0x6d, 0x8f, 0xe5, 0xd9, 0xc4, 0x89, 0x58, 0x63, 0xb7, 0x4e, 0xa2, + 0x3e, 0xf9, 0xcb, 0x83, 0xfa, 0x4e, 0xea, 0xfd, 0x5b, 0x18, 0x7d, 0xdd, + 0x36, 0x65, 0xab, 0xa8, 0x58, 0x99, 0x8a, 0x51, 0xff, 0x7a, 0xa0, 0xdb, + 0xc9, 0x70, 0x7a, 0x58, 0x65, 0xf0, 0x48, 0x92, 0x2c, 0x2e, 0xa4, 0xae, + 0xb8, 0x5d, 0x51, 0x52, 0x89, 0x9b, 0x6c, 0x05, 0x99, 0x16, 0xbe, 0xbc, + 0xd7, 0x82, 0x70, 0xad, 0xd6, 0x41, 0x25, 0x0b, 0xfb, 0xbf, 0x1a, 0x4c, + 0x83, 0xf9, 0x47, 0xf7, 0xf4, 0xf5, 0x10, 0x54, 0x2c, 0x9c, 0xbf, 0xb0, + 0xab, 0x24, 0x51, 0xec, 0xd1, 0x38, 0x59, 0x95, 0xa8, 0x8d, 0x3d, 0xc6, + 0x5b, 0x41, 0xc6, 0x26, 0xb1, 0xe4, 0x22, 0x87, 0xf7, 0x73, 0xa9, 0x80, + 0x2b, 0xa9, 0xf0, 0x3e, 0xd3, 0xae, 0x1c, 0xe7, 0x6e, 0x1e, 0x24, 0xdf, + 0xba, 0x4c, 0xe2, 0xc6, 0x81, 0xc1, 0x50, 0xde, 0xa9, 0xfc, 0xa0, 0x9a, + 0xc7, 0x6c, 0x64, 0xfd, 0xa6, 0x3a, 0x83, 0x01, 0x4a, 0xae, 0x33, 0x99, + 0x91, 0xdc, 0x63, 0xee, 0x23, 0xab, 0x6f, 0x95, 0xd4, 0xb4, 0xd5, 0x03, + 0x5a, 0xc1, 0x2a, 0x3b, 0x64, 0xb8, 0x86, 0xde, 0x5e, 0xa4, 0xa1, 0xa1, + 0x54, 0xa4, 0x36, 0x7e, 0xb0, 0x2d, 0x43, 0xe7, 0xa4, 0x27, 0xbe, 0x59, + 0x80, 0xcc, 0x80, 0x4c, 0xbd, 0x9b, 0xbf, 0x67, 0x5a, 0x91, 0x34, 0xd1, + 0x99, 0xd6, 0xa7, 0x21, 0xf8, 0x95, 0x4f, 0x76, 0x46, 0x03, 0x2d, 0xc0, + 0x5a, 0x9b, 0x45, 0x2f, 0x38, 0x2d, 0x5b, 0xac, 0xd7, 0x46, 0xd6, 0x0a, + 0xfd, 0xae, 0x40, 0x79, 0xb4, 0x8f, 0x72, 0xb6, 0xf8, 0x20, 0x47, 0x1f, + 0x39, 0x93, 0x6e, 0x85, 0x1c, 0xd9, 0x3f, 0x4e, 0x72, 0xeb, 0x71, 0xb4, + 0xa6, 0x49, 0x8d, 0xe0, 0x38, 0x93, 0x29, 0xfe, 0x90, 0x82, 0xfb, 0x71, + 0xf3, 0x57, 0x04, 0x09, 0x8f, 0x53, 0x26, 0xb7, 0x23, 0xde, 0x5c, 0xc3, + 0xc6, 0xcd, 0xd1, 0x7f, 0xfe, 0xf0, 0x74, 0x45, 0x7e, 0x82, 0x5d, 0x0b, + 0x1d, 0xc6, 0xaa, 0xe4, 0xcd, 0x99, 0x24, 0x22, 0x17, 0x8f, 0xd6, 0x28, + 0x1c, 0xa6, 0x34, 0xdb, 0x6f, 0xf3, 0x81, 0x55, 0x80, 0x30, 0x87, 0x9f, + 0xdc, 0xdd, 0x0b, 0x2f, 0x84, 0xe1, 0x66, 0xe3, 0xbc, 0x66, 0xcd, 0xc1, + 0xe1, 0x3a, 0x35, 0x1a, 0x10, 0xd8, 0xe3, 0x33, 0xa2, 0x7a, 0x1d, 0x14, + 0x7f, 0x61, 0x38, 0x22, 0x9d, 0xad, 0xe4, 0x93, 0x9c, 0xd8, 0x57, 0xd4, + 0xa5, 0x77, 0x8e, 0x75, 0x85, 0x79, 0x90, 0xf7, 0x9e, 0xeb, 0xce, 0x90, + 0x91, 0x0f, 0x43, 0x5f, 0x44, 0x06, 0xd9, 0x55, 0xf0, 0xdd, 0xff, 0x51, + 0x90, 0x9c, 0x7f, 0xba, 0x86, 0xa9, 0x62, 0x21, 0x0d, 0x25, 0xef, 0xa9, + 0xdf, 0x49, 0x48, 0xf1, 0xb2, 0xcc, 0x1e, 0xce, 0x73, 0xca, 0x71, 0xc0, + 0xd9, 0x88, 0x19, 0x16, 0xf9, 0x31, 0xd4, 0xb5, 0xaa, 0x6a, 0xfc, 0x8c, + 0x11, 0xbf, 0xfb, 0xef, 0x9e, 0x18, 0x6b, 0x42, 0xeb, 0x79, 0xcd, 0x3a, + 0x08, 0x76, 0x7f, 0xc3, 0xc7, 0xb0, 0x42, 0x8c, 0x75, 0x4b, 0x77, 0x01, + 0x1e, 0x1e, 0x6d, 0x5b, 0x03, 0x98, 0x9b, 0xf6, 0xd4, 0x7c, 0x9c, 0xb9, + 0xb5, 0xba, 0x6d, 0xf7, 0xae, 0x95, 0xa6, 0x6d, 0x71, 0x86, 0x53, 0x47, + 0xb7, 0x51, 0x27, 0xaa, 0xbb, 0x7a, 0xe7, 0x4c, 0xd5, 0x2f, 0x21, 0x33, + 0x2d, 0xf7, 0x43, 0x12, 0xf0, 0x27, 0x4b, 0xd7, 0xd1, 0x3d, 0x2c, 0x50, + 0x96, 0x42, 0x63, 0x52, 0xf9, 0x71, 0xa3, 0x44, 0xea, 0x87, 0x86, 0x70, + 0xef, 0xe4, 0xee, 0xdf, 0x65, 0xa9, 0xcf, 0x9d, 0x49, 0xc0, 0xd9, 0x41, + 0x83, 0x58, 0x64, 0x86, 0xb1, 0x06, 0x46, 0xc4, 0x99, 0x0a, 0x13, 0xd0, + 0xa3, 0x4b, 0xd0, 0xe0, 0xd1, 0xfe, 0xf8, 0xd0, 0x49, 0xdb, 0x0c, 0x7b, + 0x81, 0x1f, 0x7a, 0x50, 0x69, 0xcb, 0x19, 0xdc, 0xe6, 0xff, 0xa7, 0x6d, + 0x9b, 0x48, 0x50, 0x6c, 0xc3, 0x99, 0xa0, 0xa0, 0x6d, 0x03, 0xea, 0x9d, + 0x60, 0x1d, 0x70, 0x29, 0x93, 0xac, 0x92, 0x00, 0x5c, 0xee, 0x2b, 0x6e, + 0x9c, 0xf4, 0x27, 0x00, 0xd2, 0xd2, 0x90, 0x44, 0x82, 0xa2, 0xb1, 0xa4, + 0xa6, 0x69, 0x5d, 0x04, 0x0f, 0x85, 0xef, 0xa6, 0xfa, 0xc5, 0x37, 0x7f, + 0x29, 0x3a, 0xec, 0x26, 0x04, 0x71, 0xc2, 0x53, 0xc8, 0x0d, 0x8e, 0xc1, + 0x97, 0xb7, 0x99, 0x0e, 0xa0, 0xca, 0x35, 0x56, 0xac, 0xf6, 0x71, 0xa4, + 0xa6, 0xba, 0x49, 0xd6, 0x38, 0x89, 0x3d, 0xcb, 0x70, 0x68, 0x2a, 0xb8, + 0xb0, 0x2f, 0x83, 0xc9, 0x96, 0x22, 0x43, 0x16, 0xd2, 0x19, 0xee, 0x4a, + 0xe8, 0xdd, 0xe8, 0x77, 0x7c, 0x21, 0x92, 0x84, 0xfc, 0x3a, 0xa6, 0x5f, + 0xec, 0x89, 0xfe, 0x70, 0x9c, 0x5a, 0xbb, 0x99, 0xa8, 0xb1, 0xdc, 0xd5, + 0x79, 0x73, 0x86, 0xe1, 0x17, 0x5c, 0xc8, 0xbe, 0xda, 0x88, 0x47, 0xb1, + 0xcb, 0x78, 0xa5, 0xfd, 0x90, 0xce, 0x19, 0x47, 0x49, 0x6e, 0x87, 0x92, + 0x00, 0x3c, 0xb0, 0x9e, 0x79, 0x92, 0x95, 0x09, 0x48, 0xf8, 0x11, 0x34, + 0x11, 0x5d, 0x7e, 0xdb, 0x5e, 0xda, 0xc0, 0xcc, 0xcb, 0xe3, 0x21, 0xec, + 0x47, 0x3d, 0xf2, 0xbe, 0xb3, 0x39, 0xb3, 0xd0, 0x27, 0x18, 0x00, 0x31, + 0xfa, 0xaf, 0x06, 0x8e, 0xe4, 0x28, 0x9c, 0x45, 0xad, 0x62, 0x77, 0xc9, + 0xc1, 0x4e, 0xe0, 0xa2, 0xe3, 0xb5, 0x58, 0x82, 0x7d, 0xeb, 0x0c, 0xfa, + 0xd0, 0x50, 0xea, 0x1f, 0xce, 0xa1, 0x3e, 0x93, 0xd8, 0x69, 0x9f, 0x5c, + 0x69, 0x36, 0x10, 0x0e, 0x3d, 0x88, 0x63, 0x06, 0xf4, 0xc5, 0x33, 0x46, + 0x10, 0x65, 0x63, 0xb3, 0x8d, 0x13, 0x3d, 0x47, 0x22, 0x51, 0xae, 0xf1, + 0x39, 0x68, 0x35, 0xe9, 0x3b, 0x73, 0x6d, 0xa4, 0xfb, 0x13, 0x56, 0xf0, + 0xcf, 0xc3, 0x47, 0x73, 0x9e, 0x98, 0x51, 0x1b, 0x94, 0x26, 0xed, 0x2d, + 0xdb, 0x66, 0xd8, 0x5a, 0x39, 0x2f, 0xa8, 0x27, 0xa5, 0xcd, 0xbd, 0x34, + 0x11, 0x7a, 0xf0, 0xf0, 0xaf, 0xf6, 0x70, 0x86, 0x50, 0x5b, 0x71, 0x69, + 0x1d, 0x82, 0x71, 0x65, 0xc5, 0xc4, 0x9a, 0x4e, 0x9b, 0xea, 0xa1, 0x82, + 0x04, 0x79, 0xb6, 0xeb, 0xde, 0xc5, 0x9e, 0x50, 0xb7, 0xf1, 0x04, 0x40, + 0x08, 0xad, 0x75, 0x6e, 0x18, 0x91, 0x1b, 0xe5, 0x61, 0xcb, 0x77, 0x6c, + 0xa4, 0xaa, 0xdc, 0x0c, 0x4c, 0x91, 0x96, 0xf2, 0x10, 0x6d, 0x2b, 0x0e, + 0x4e, 0x93, 0x14, 0xd2, 0x0b, 0x1d, 0xa3, 0x80, 0x81, 0x26, 0xde, 0x2e, + 0x48, 0x65, 0x86, 0xd3, 0xa7, 0xe2, 0xea, 0x43, 0x6a, 0x3d, 0x46, 0x14, + 0x95, 0x36, 0x0b, 0x21, 0x1e, 0x57, 0x6e, 0x71, 0xbf, 0x9a, 0x70, 0xde, + 0xe8, 0xf8, 0xc4, 0xd4, 0x0c, 0x50, 0x39, 0x9f, 0x97, 0x0b, 0x2d, 0x25, + 0x69, 0x3e, 0x43, 0xfb, 0x56, 0xeb, 0x07, 0xee, 0x9a, 0x76, 0x73, 0xc9, + 0xe0, 0x10, 0x00, 0x06, 0x5e, 0x12, 0x48, 0xdc, 0x90, 0x26, 0x91, 0x54, + 0xe8, 0x12, 0x58, 0x0c, 0x86, 0x1c, 0x7e, 0x33, 0xbf, 0xcc, 0x62, 0x2b, + 0x2b, 0x81, 0x8a, 0x2a, 0xfd, 0xc4, 0x55, 0x91, 0x8a, 0xe9, 0x62, 0x5b, + 0x86, 0xea, 0x63, 0x39, 0x82, 0xb5, 0xf9, 0x8d, 0xda, 0x6f, 0xd9, 0x48, + 0xf5, 0x43, 0x51, 0x2c, 0xe1, 0xde, 0x3f, 0x66, 0x2c, 0xab, 0x02, 0x9d, + 0x29, 0x5c, 0xc8, 0xf8, 0xd8, 0x39, 0x81, 0x8a, 0x82, 0x54, 0x52, 0xb6, + 0x6d, 0x74, 0xbd, 0x15, 0x60, 0x81, 0x41, 0x19, 0xbf, 0xc6, 0xbb, 0x78, + 0x2a, 0x15, 0x76, 0xf2, 0xd2, 0x90, 0xc7, 0x8a, 0x32, 0x18, 0x66, 0x51, + 0xef, 0xb2, 0x28, 0xd8, 0x8f, 0x9d, 0xa7, 0x6b, 0x80, 0x15, 0xea, 0x4e, + 0x60, 0x23, 0x1a, 0x53, 0x46, 0x72, 0xce, 0x4c, 0x61, 0x6f, 0xcc, 0x2e, + 0xdb, 0x21, 0x0d, 0x50, 0x94, 0x29, 0x2a, 0x3d, 0xf3, 0x92, 0x07, 0xdf, + 0x53, 0x81, 0xfc, 0x01, 0xb2, 0x14, 0xe2, 0x8a, 0xc3, 0x6a, 0x46, 0xe4, + 0x23, 0xd9, 0xf9, 0xae, 0x7a, 0xd9, 0x4c, 0xc5, 0x30, 0x8b, 0xcb, 0x3b, + 0xd1, 0x20, 0xed, 0x48, 0x1b, 0x0a, 0x10, 0xe4, 0xdf, 0x02, 0xb7, 0xc8, + 0x87, 0x7c, 0x72, 0x7b, 0x0e, 0x41, 0x77, 0x67, 0x6e, 0xa6, 0x4f, 0x7e, + 0xaf, 0xeb, 0x0c, 0x12, 0xb9, 0x4c, 0x10, 0x24, 0xc7, 0x96, 0x8d, 0x99, + 0xf6, 0xb2, 0x07, 0x1a, 0x75, 0x31, 0x69, 0xaf, 0xdd, 0xe9, 0x7d, 0x5f, + 0x54, 0x78, 0x44, 0x79, 0xa9, 0x7c, 0x4c, 0x86, 0xda, 0x2f, 0x8c, 0x8f, + 0xb4, 0x36, 0x13, 0xeb, 0xd6, 0xff, 0x53, 0x96, 0xd6, 0x1d, 0xda, 0x69, + 0x1d, 0x8d, 0x3a, 0x20, 0x41, 0xee, 0x8b, 0xba, 0x85, 0x30, 0x8f, 0x57, + 0x85, 0xd7, 0x38, 0x4f, 0xf2, 0x96, 0xa5, 0x72, 0xd4, 0x81, 0x6c, 0x79, + 0xdb, 0x86, 0x5d, 0xeb, 0x2c, 0xb7, 0x4e, 0x0a, 0xfd, 0x9c, 0xef, 0x23, + 0xda, 0x9f, 0xd5, 0x43, 0x51, 0xbc, 0x8c, 0x6c, 0x31, 0x06, 0xf9, 0x1d, + 0x6e, 0x56, 0x40, 0x13, 0x3a, 0x9a, 0x44, 0xa8, 0x55, 0x4a, 0x40, 0xe4, + 0x50, 0x4a, 0xab, 0x29, 0x3e, 0xa5, 0xc4, 0x1b, 0x7f, 0xd0, 0x7b, 0x4d, + 0x18, 0xd5, 0x2f, 0x5f, 0x8c, 0x82, 0x2a, 0x7c, 0x03, 0x3b, 0x22, 0x69, + 0xa7, 0xf1, 0x6e, 0xb2, 0xa0, 0x3f, 0xcc, 0x94, 0x4f, 0x70, 0x98, 0x41, + 0xa3, 0x35, 0x15, 0x6d, 0x44, 0xee, 0xa4, 0x6a, 0x7c, 0x91, 0x64, 0x66, + 0x89, 0x9f, 0x77, 0xdb, 0x1a, 0x22, 0x6d, 0xec, 0xb4, 0xfc, 0x69, 0x04, + 0x09, 0x0a, 0x79, 0x55, 0xd4, 0x87, 0xe9, 0x6a, 0xbc, 0x68, 0xd2, 0x07, + 0x78, 0x9d, 0x58, 0x5c, 0xdd, 0xd6, 0x19, 0x82, 0xa2, 0xf1, 0xbd, 0xf6, + 0x16, 0x2b, 0x49, 0x18, 0xe7, 0xc8, 0x5d, 0xe6, 0xe1, 0x08, 0xe2, 0x74, + 0x45, 0x00, 0xc0, 0xdb, 0x0a, 0x08, 0x15, 0x39, 0xd9, 0xc1, 0x3e, 0x98, + 0x09, 0x42, 0x19, 0xb4, 0x6f, 0xbe, 0xe4, 0x4e, 0x72, 0x69, 0xc4, 0xb5, + 0xd0, 0xda, 0xd6, 0x76, 0x5e, 0x55, 0xf1, 0x33, 0x58, 0x5e, 0x87, 0xfd, + 0x86, 0xf0, 0x8b, 0xdf, 0xea, 0xf7, 0x89, 0x0e, 0x3b, 0xeb, 0x56, 0x66, + 0x46, 0x26, 0x7a, 0x07, 0xc5, 0xc8, 0x9d, 0xba, 0x99, 0x4e, 0x89, 0xf7, + 0xf9, 0xaa, 0x9d, 0x42, 0xea, 0xf3, 0x9c, 0x5a, 0x86, 0xc0, 0xa8, 0xa3, + 0x61, 0x42, 0x7f, 0x3c, 0xe6, 0x15, 0x49, 0x75, 0xd3, 0xb1, 0xbd, 0x07, + 0xa0, 0x27, 0xd6, 0x66, 0x85, 0x81, 0xe3, 0x3e, 0x9f, 0x58, 0x3c, 0x00, + 0x11, 0x65, 0x10, 0x1c, 0x4a, 0xf1, 0x63, 0x4c, 0xca, 0x41, 0x15, 0x9f, + 0xca, 0x52, 0x92, 0x9c, 0xfa, 0x87, 0x09, 0xe6, 0x8e, 0x27, 0x66, 0x38, + 0x68, 0x6d, 0x89, 0xa5, 0xd9, 0x20, 0x9b, 0x0a, 0x02, 0x83, 0xe1, 0xe9, + 0x7d, 0x9b, 0x30, 0xdd, 0xac, 0x4e, 0xd0, 0x16, 0x2a, 0x22, 0x3c, 0x2b, + 0xd3, 0xab, 0xd1, 0x9c, 0xad, 0x86, 0x23, 0xc2, 0x62, 0x52, 0x5e, 0x8d, + 0xd7, 0xa0, 0x1b, 0x77, 0x6e, 0x15, 0x94, 0xbc, 0x92, 0x5e, 0xf1, 0x8b, + 0x75, 0x9f, 0xf3, 0xdf, 0x1f, 0xd0, 0x26, 0x9e, 0x4d, 0xe1, 0x20, 0x87, + 0x75, 0xa9, 0xc2, 0xc2, 0x45, 0x26, 0x35, 0x72, 0xb8, 0xe0, 0xbb, 0x29, + 0x5f, 0x8c, 0x7c, 0x52, 0x02, 0xef, 0x29, 0x4c, 0x2d, 0xe1, 0x3a, 0xf7, + 0x3e, 0xf8, 0x7d, 0xcd, 0x88, 0xf7, 0x25, 0x9f, 0x70, 0x56, 0xa2, 0xcb, + 0xb5, 0x0d, 0xd0, 0x01, 0xf1, 0x0b, 0x01, 0x77, 0x65, 0x53, 0x14, 0x71, + 0xf0, 0x53, 0xc5, 0x08, 0x70, 0xe2, 0xfb, 0xc7, 0x28, 0x11, 0xd5, 0x19, + 0xcf, 0xd5, 0x99, 0xe5, 0x21, 0xde, 0x61, 0x3a, 0x9d, 0x7a, 0xe8, 0x90, + 0x9d, 0xde, 0xc3, 0xf1, 0x2b, 0x86, 0x94, 0xce, 0xa1, 0x4c, 0xea, 0xe0, + 0xb8, 0x02, 0x05, 0xb4, 0xca, 0x70, 0xb3, 0xac, 0xff, 0x3c, 0xa4, 0xf4, + 0xb6, 0x5d, 0xa3, 0x9a, 0xab, 0x95, 0x00, 0xeb, 0xb8, 0x39, 0xf1, 0x36, + 0xe1, 0xc7, 0x4d, 0xc6, 0x39, 0x1a, 0xa2, 0x74, 0xe3, 0xf0, 0x3d, 0xee, + 0x0c, 0x19, 0x48, 0x7a, 0x61, 0x54, 0xee, 0xc9, 0x1e, 0x5a, 0xc6, 0x82, + 0x1f, 0x9d, 0xd8, 0xda, 0x5d, 0x3a, 0x76, 0xff, 0xee, 0xe8, 0x90, 0x5a, + 0xf7, 0x66, 0xca, 0xd7, 0x95, 0x40, 0xdf, 0x11, 0x36, 0x40, 0x61, 0x56, + 0xbc, 0x46, 0x10, 0x45, 0x22, 0x5e, 0x03, 0x0e, 0x01, 0xe8, 0xb4, 0x69, + 0x0b, 0x37, 0x89, 0x85, 0xfe, 0x55, 0x51, 0x3b, 0xd0, 0x0c, 0x81, 0xde, + 0x96, 0x4d, 0x82, 0xe9, 0x04, 0x4f, 0x81, 0xa9, 0xed, 0xd5, 0x4b, 0x95, +}; + +const uint8_t expected_sk[] = { + 0xb4, 0x32, 0xa7, 0x61, 0x06, 0x53, 0x60, 0x1e, 0x6c, 0xa4, 0x96, 0xdc, + 0x35, 0x4c, 0x99, 0x93, 0x20, 0xed, 0x4d, 0x1b, 0x20, 0x89, 0x75, 0x0c, + 0x8f, 0x64, 0x0f, 0x6a, 0x13, 0x46, 0x4f, 0xda, 0xb9, 0xa7, 0xf3, 0x6e, + 0xea, 0x34, 0x28, 0x91, 0x0c, 0x2c, 0xda, 0xe3, 0x8f, 0xe7, 0xe6, 0xcd, + 0xbe, 0xe6, 0x2a, 0xb1, 0xeb, 0x51, 0x3d, 0x69, 0x51, 0xab, 0xbd, 0x71, + 0x4b, 0xc5, 0x05, 0x80, 0x16, 0xd8, 0xfc, 0xd6, 0x9f, 0xa4, 0x2d, 0x6f, + 0xe5, 0xf6, 0x80, 0xe4, 0x1e, 0x50, 0x84, 0xe1, 0xda, 0x76, 0x21, 0xbe, + 0xa3, 0xef, 0xa6, 0x81, 0x4b, 0x77, 0x6a, 0x3f, 0x1d, 0x1a, 0x8f, 0x8a, + 0x22, 0x3f, 0xe2, 0x5a, 0xdc, 0xc6, 0x0a, 0x63, 0x76, 0x49, 0xc6, 0x12, + 0xe3, 0x4b, 0x36, 0xc4, 0xb0, 0xb0, 0x22, 0x90, 0xf2, 0x80, 0xf1, 0xd8, + 0xc1, 0x74, 0x6e, 0x9b, 0x34, 0x5e, 0xab, 0x0a, 0x04, 0x11, 0x6d, 0x19, + 0x95, 0x4c, 0x04, 0xc4, 0x89, 0x22, 0x97, 0x24, 0x21, 0x14, 0x41, 0x91, + 0x22, 0x2d, 0x1c, 0x09, 0x2d, 0x10, 0x34, 0x4a, 0x60, 0xc4, 0x24, 0x9b, + 0xb0, 0x45, 0xdb, 0x98, 0x84, 0x44, 0x84, 0x68, 0xc9, 0x06, 0x31, 0x22, + 0xa6, 0x61, 0x51, 0x10, 0x65, 0xdb, 0x06, 0x62, 0x14, 0xa1, 0x8c, 0xe0, + 0xc8, 0x20, 0x98, 0x96, 0x85, 0x60, 0x14, 0x0d, 0x22, 0x99, 0x84, 0x09, + 0x23, 0x22, 0xa1, 0x44, 0x2a, 0x14, 0xc7, 0x48, 0x02, 0x47, 0x8e, 0x5b, + 0x84, 0x6d, 0xc8, 0x36, 0x2a, 0x22, 0xa1, 0x8c, 0x24, 0x20, 0x20, 0x01, + 0x13, 0x46, 0x4a, 0x82, 0x11, 0x54, 0xb8, 0x49, 0x9a, 0x86, 0x84, 0x08, + 0xb7, 0x85, 0x12, 0x37, 0x00, 0x04, 0x38, 0x85, 0x09, 0x46, 0x21, 0xdc, + 0xa8, 0x49, 0x81, 0x84, 0x6d, 0x42, 0xa0, 0x70, 0x4c, 0x82, 0x81, 0xa0, + 0x14, 0x66, 0x02, 0x81, 0x41, 0xd8, 0x28, 0x65, 0x88, 0xb8, 0x21, 0xdb, + 0x16, 0x2d, 0x1c, 0x41, 0x26, 0xd8, 0xa0, 0x2d, 0x04, 0x10, 0x48, 0x51, + 0x38, 0x4a, 0x4c, 0x04, 0x52, 0x19, 0x43, 0x72, 0x22, 0x30, 0x50, 0x4c, + 0x14, 0x08, 0xe2, 0x96, 0x89, 0x0c, 0xa1, 0x84, 0x0c, 0x46, 0x46, 0x03, + 0x46, 0x72, 0x20, 0x82, 0x30, 0xe2, 0x18, 0x45, 0xc0, 0x42, 0x01, 0xda, + 0x22, 0x86, 0x1b, 0x23, 0x90, 0x50, 0x32, 0x6c, 0x8a, 0x88, 0x80, 0xd1, + 0xc2, 0x2c, 0x9b, 0x96, 0x44, 0xd4, 0x00, 0x20, 0x21, 0x44, 0x80, 0xd8, + 0xb8, 0x61, 0x08, 0x43, 0x44, 0x20, 0x25, 0x4e, 0x09, 0x10, 0x8a, 0x81, + 0x46, 0x2c, 0x0c, 0x80, 0x89, 0x80, 0x84, 0x84, 0x81, 0x08, 0x48, 0x11, + 0x82, 0x29, 0x5b, 0x44, 0x82, 0x61, 0x48, 0x28, 0x02, 0xa1, 0x04, 0xc1, + 0x44, 0x25, 0x03, 0x12, 0x92, 0x0c, 0x29, 0x24, 0x64, 0x10, 0x0c, 0x19, + 0x42, 0x45, 0x12, 0x83, 0x20, 0x01, 0x06, 0x89, 0x60, 0x14, 0x11, 0x90, + 0x88, 0x45, 0x83, 0xa4, 0x80, 0xd0, 0x88, 0x50, 0x14, 0x36, 0x2d, 0x81, + 0xc8, 0x71, 0x0a, 0x13, 0x46, 0x4c, 0x94, 0x89, 0xdb, 0x86, 0x40, 0xd8, + 0x08, 0x01, 0x91, 0x40, 0x90, 0x19, 0x83, 0x25, 0xa3, 0x36, 0x40, 0x4b, + 0x18, 0x28, 0x92, 0x36, 0x20, 0xa2, 0x02, 0x61, 0xd4, 0x92, 0x21, 0xd3, + 0x26, 0x24, 0x04, 0x35, 0x69, 0x08, 0x29, 0x51, 0x01, 0x02, 0x91, 0x23, + 0x93, 0x64, 0xe0, 0xc6, 0x51, 0xda, 0x28, 0x42, 0x24, 0x30, 0x0d, 0xca, + 0xa0, 0x4d, 0xe2, 0x08, 0x00, 0x81, 0x24, 0x4e, 0x11, 0x25, 0x2a, 0x53, + 0x28, 0x51, 0x00, 0x24, 0x20, 0x90, 0x04, 0x4e, 0x23, 0x94, 0x80, 0x49, + 0xb6, 0x89, 0x00, 0x97, 0x6c, 0x41, 0xc4, 0x0c, 0x4a, 0x84, 0x10, 0xc0, + 0x44, 0x60, 0x01, 0x00, 0x26, 0xd3, 0x92, 0x4d, 0x9b, 0x36, 0x6c, 0x0c, + 0x06, 0x0c, 0x08, 0x24, 0x8d, 0xdc, 0x30, 0x0d, 0xa0, 0x14, 0x65, 0x0c, + 0x32, 0x68, 0x88, 0x42, 0x28, 0x92, 0x26, 0x0e, 0x03, 0x41, 0x80, 0x60, + 0xa0, 0x30, 0xd8, 0xc0, 0x49, 0xd8, 0x92, 0x70, 0x08, 0x18, 0x6e, 0x0b, + 0x04, 0x86, 0x91, 0x38, 0x6c, 0xd2, 0x06, 0x61, 0x09, 0x09, 0x69, 0xca, + 0x18, 0x42, 0x09, 0x31, 0x70, 0x10, 0x27, 0x22, 0x20, 0x12, 0x45, 0x01, + 0x39, 0x51, 0x09, 0x32, 0x72, 0x60, 0x14, 0x64, 0xa4, 0x82, 0x04, 0x93, + 0x96, 0x64, 0xa2, 0x24, 0x2a, 0xdb, 0x36, 0x40, 0x42, 0x24, 0x68, 0x9a, + 0xc8, 0x64, 0x09, 0x94, 0x24, 0x0a, 0x30, 0x0e, 0x09, 0x32, 0x21, 0x8b, + 0x38, 0x12, 0xd1, 0x08, 0x4c, 0x53, 0x98, 0x0c, 0x02, 0x06, 0x90, 0x4a, + 0x86, 0x81, 0x89, 0xc8, 0x4c, 0x09, 0x49, 0x40, 0x63, 0x20, 0x28, 0x84, + 0x28, 0x92, 0xd4, 0x06, 0x28, 0x91, 0xa2, 0x20, 0xcb, 0x10, 0x0a, 0xcb, + 0xa2, 0x2d, 0x1a, 0x07, 0x10, 0xe1, 0x94, 0x04, 0x04, 0xa4, 0x89, 0xe2, + 0xc6, 0x89, 0x4a, 0x16, 0x2d, 0xda, 0x12, 0x2e, 0x21, 0x87, 0x0d, 0x1a, + 0x04, 0x2a, 0x1c, 0x06, 0x4d, 0xca, 0x44, 0x6c, 0x8c, 0x22, 0x49, 0x0c, + 0x17, 0x22, 0x58, 0x96, 0x08, 0xe2, 0x40, 0x92, 0x18, 0x45, 0x20, 0x23, + 0x06, 0x26, 0x11, 0xb0, 0x44, 0x82, 0x28, 0x80, 0x40, 0x30, 0x4e, 0x58, + 0x00, 0x01, 0x63, 0x38, 0x0a, 0x23, 0x85, 0x61, 0x09, 0xb2, 0x70, 0x08, + 0xb5, 0x71, 0x03, 0x08, 0x81, 0x51, 0x00, 0x49, 0x12, 0x92, 0x71, 0x4c, + 0x22, 0x31, 0x5a, 0x40, 0x52, 0x04, 0x94, 0x4c, 0x0b, 0x43, 0x0a, 0x18, + 0x07, 0x41, 0x01, 0x20, 0x26, 0x9b, 0x48, 0x8a, 0x58, 0x10, 0x02, 0x19, + 0xa7, 0x0c, 0x5a, 0x86, 0x89, 0x82, 0x44, 0x2e, 0x23, 0x07, 0x65, 0x5a, + 0x48, 0x6d, 0x1a, 0x30, 0x4a, 0x50, 0xa8, 0x80, 0x21, 0xa0, 0x70, 0x02, + 0xc8, 0x8c, 0x09, 0x36, 0x31, 0xd9, 0x82, 0x20, 0xda, 0xb0, 0x30, 0x1b, + 0x06, 0x4d, 0x20, 0xb8, 0x6c, 0x10, 0xc0, 0x68, 0x1b, 0x43, 0x10, 0x19, + 0xb6, 0x88, 0xe0, 0x14, 0x6d, 0x13, 0x19, 0x51, 0x1b, 0xc0, 0x49, 0xd2, + 0x36, 0x02, 0x08, 0x93, 0x41, 0xe4, 0x02, 0x22, 0xd9, 0x32, 0x22, 0xc2, + 0x18, 0x44, 0x14, 0xa9, 0x69, 0x0b, 0xa0, 0x88, 0x60, 0x84, 0x51, 0x94, + 0x16, 0x29, 0xa1, 0x10, 0x42, 0x03, 0x85, 0x31, 0x22, 0x24, 0x00, 0x08, + 0xb4, 0x88, 0xc2, 0xb2, 0x71, 0x11, 0xb3, 0x31, 0xda, 0x80, 0x40, 0x24, + 0x23, 0x4e, 0x4a, 0x32, 0x70, 0x13, 0x37, 0x06, 0xda, 0x00, 0x25, 0x41, + 0x44, 0x4c, 0x63, 0x10, 0x81, 0xd8, 0x32, 0x72, 0x4c, 0xa0, 0x8d, 0xa2, + 0x30, 0x48, 0xc4, 0x80, 0x29, 0xc8, 0x96, 0x6d, 0x0a, 0xa9, 0x90, 0x08, + 0xa1, 0x8c, 0x84, 0x24, 0x2e, 0x21, 0x13, 0x21, 0x9b, 0xa2, 0x44, 0x8c, + 0xa2, 0x04, 0x18, 0xc9, 0x50, 0x5c, 0x36, 0x70, 0x4c, 0x44, 0x52, 0x90, + 0x10, 0x45, 0x84, 0x14, 0x09, 0x63, 0x00, 0x85, 0x03, 0x15, 0x4c, 0xd4, + 0xc2, 0x28, 0x89, 0x28, 0x71, 0xdb, 0x14, 0x45, 0x01, 0x11, 0x2d, 0xd2, + 0x08, 0x62, 0x22, 0x33, 0x89, 0x13, 0xc0, 0x65, 0x53, 0x82, 0x69, 0x10, + 0x81, 0x50, 0x92, 0xb6, 0x4c, 0x62, 0xc8, 0x40, 0x59, 0x32, 0x41, 0x91, + 0x24, 0x6a, 0xd0, 0x94, 0x01, 0x83, 0x20, 0x52, 0x92, 0x06, 0x0d, 0x09, + 0x08, 0x02, 0x24, 0xb1, 0x8d, 0x0c, 0x49, 0x40, 0x08, 0x17, 0x60, 0x1b, + 0x36, 0x84, 0xc0, 0xc6, 0x0d, 0xa0, 0x84, 0x70, 0x91, 0x08, 0x24, 0x53, + 0xb4, 0x29, 0x61, 0xb2, 0x00, 0x20, 0x19, 0x8c, 0xc8, 0x06, 0x08, 0xe3, + 0xb8, 0x45, 0xc4, 0x16, 0x21, 0xc8, 0xb4, 0x88, 0x51, 0x42, 0x09, 0x80, + 0x02, 0x84, 0xc3, 0x84, 0x24, 0x53, 0x00, 0x66, 0x23, 0x20, 0x80, 0x42, + 0x04, 0x61, 0xda, 0x26, 0x81, 0x04, 0x05, 0x01, 0xc8, 0x34, 0x6d, 0xd2, + 0x84, 0x84, 0x59, 0xa4, 0x49, 0x5b, 0xb0, 0x00, 0x04, 0x20, 0x21, 0x5c, + 0xb8, 0x41, 0xd8, 0x00, 0x31, 0x13, 0x24, 0x4e, 0x83, 0x12, 0x4e, 0x1b, + 0x95, 0x80, 0x49, 0x22, 0x01, 0x82, 0x80, 0x65, 0xca, 0x46, 0x8a, 0x41, + 0xa8, 0x4d, 0x98, 0x00, 0x41, 0xc3, 0x96, 0x28, 0x93, 0xb0, 0x8c, 0x00, + 0xb5, 0x30, 0x10, 0x49, 0x0d, 0x60, 0x14, 0x01, 0xd1, 0x96, 0x41, 0xa4, + 0x84, 0x70, 0xca, 0x12, 0x0a, 0xd0, 0x98, 0x08, 0x20, 0x08, 0x88, 0x1b, + 0x20, 0x6d, 0x13, 0x15, 0x46, 0x40, 0x28, 0x20, 0xdc, 0xb6, 0x0d, 0x82, + 0x06, 0x86, 0x92, 0x02, 0x41, 0x00, 0x31, 0x49, 0xc3, 0x44, 0x6c, 0x54, + 0x88, 0x71, 0x92, 0x46, 0x6c, 0x09, 0x41, 0x6e, 0xa3, 0xc4, 0x60, 0x01, + 0x29, 0x00, 0x1b, 0xa8, 0x8d, 0x10, 0x04, 0x85, 0x08, 0x88, 0x90, 0x9a, + 0x02, 0x46, 0x98, 0x10, 0x12, 0x1b, 0x47, 0x40, 0x23, 0x32, 0x26, 0x8a, + 0x94, 0x65, 0x01, 0x88, 0x44, 0x22, 0xc2, 0x88, 0x98, 0x48, 0x85, 0x83, + 0x40, 0x09, 0x40, 0x98, 0x50, 0x19, 0x00, 0x51, 0x24, 0x17, 0x01, 0xd2, + 0x38, 0x91, 0x04, 0xa5, 0x6d, 0x84, 0x86, 0x6d, 0xc3, 0x02, 0x89, 0x03, + 0x06, 0x31, 0x11, 0x45, 0x0d, 0x13, 0x11, 0x21, 0x84, 0x14, 0x40, 0xd8, + 0xa6, 0x65, 0x04, 0x26, 0x46, 0x62, 0xb0, 0x0d, 0x1c, 0xa4, 0x24, 0x51, + 0x08, 0x12, 0x0c, 0x48, 0x29, 0xc4, 0xc0, 0x2c, 0x8c, 0xa8, 0x05, 0x5a, + 0xa6, 0x60, 0x44, 0x00, 0x08, 0x62, 0x20, 0x71, 0x81, 0x26, 0x85, 0x93, + 0x36, 0x04, 0x1b, 0x93, 0x30, 0x81, 0x38, 0x2a, 0xe3, 0x32, 0x48, 0x83, + 0x36, 0x89, 0x22, 0x88, 0x48, 0x99, 0xc2, 0x0d, 0xe4, 0x44, 0x2a, 0x93, + 0x34, 0x2e, 0x18, 0x45, 0x05, 0x1b, 0x84, 0x0d, 0x01, 0xc1, 0x25, 0x0c, + 0xb9, 0x6d, 0x49, 0x12, 0x0d, 0x1c, 0x14, 0x10, 0x0c, 0xb4, 0x4c, 0x12, + 0xc0, 0x24, 0xd8, 0x28, 0x49, 0xe1, 0x00, 0x2d, 0x00, 0xb7, 0x69, 0x1b, + 0xa3, 0x25, 0x01, 0x01, 0x85, 0x1b, 0x07, 0x88, 0x52, 0x38, 0x88, 0x13, + 0x85, 0x08, 0xe1, 0x86, 0x28, 0x4c, 0x46, 0x88, 0x4b, 0x96, 0x4d, 0x64, + 0xa0, 0x91, 0x43, 0x04, 0x2c, 0x92, 0x14, 0x62, 0x04, 0xa2, 0x8c, 0x98, + 0x06, 0x8d, 0x10, 0x40, 0x8d, 0x63, 0x06, 0x04, 0x22, 0x03, 0x49, 0x02, + 0x38, 0x6c, 0x12, 0x49, 0x4e, 0x12, 0x08, 0x70, 0x08, 0x85, 0x44, 0xa2, + 0x04, 0x71, 0x98, 0x94, 0x69, 0xa4, 0x20, 0x21, 0xe0, 0x02, 0x66, 0xa4, + 0xa4, 0x85, 0x11, 0xc6, 0x70, 0x1b, 0x97, 0x69, 0x93, 0x04, 0x2a, 0x23, + 0x40, 0x0c, 0x08, 0xc2, 0x70, 0x91, 0xc4, 0x01, 0xe2, 0x24, 0x44, 0xd8, + 0x00, 0x31, 0x11, 0x27, 0x02, 0x12, 0x42, 0x86, 0x23, 0xc8, 0x00, 0x4c, + 0x04, 0x24, 0x9b, 0x40, 0x71, 0x50, 0x00, 0x04, 0x20, 0xb2, 0x04, 0x1a, + 0x09, 0x2e, 0x43, 0x02, 0x0d, 0x42, 0x22, 0x64, 0xc9, 0xb8, 0x8d, 0x08, + 0x35, 0x72, 0x93, 0x20, 0x08, 0x01, 0x82, 0x84, 0x88, 0xb2, 0x85, 0x58, + 0x46, 0x10, 0x64, 0x04, 0x22, 0xd0, 0x16, 0x00, 0x93, 0x80, 0x24, 0xdc, + 0x00, 0x06, 0x0c, 0x14, 0x31, 0x23, 0x48, 0x88, 0x63, 0x88, 0x21, 0x91, + 0x12, 0x8e, 0x0a, 0x88, 0x60, 0x21, 0x88, 0x8d, 0x11, 0x86, 0x81, 0x88, + 0x10, 0x0a, 0x1c, 0xb8, 0x0c, 0x19, 0x39, 0x42, 0x08, 0x83, 0x50, 0x84, + 0x28, 0x51, 0xd0, 0x04, 0x0c, 0x98, 0x48, 0x00, 0x52, 0x38, 0x72, 0xe3, + 0x38, 0x42, 0xe4, 0x32, 0x48, 0xcc, 0x80, 0x88, 0x24, 0x83, 0x88, 0x83, + 0xb6, 0x31, 0x19, 0xc5, 0x30, 0x80, 0x12, 0x24, 0xd4, 0x82, 0x89, 0x94, + 0x24, 0x81, 0x10, 0x11, 0x8c, 0xe0, 0xc4, 0x60, 0xf4, 0xcd, 0x7d, 0x38, + 0x0c, 0x7f, 0x3d, 0x43, 0x61, 0xfa, 0x04, 0x79, 0x7d, 0x53, 0x56, 0xb7, + 0xe5, 0x8d, 0x91, 0xb7, 0x42, 0x43, 0x97, 0xe6, 0xcb, 0x45, 0x17, 0x89, + 0xa8, 0x41, 0xd6, 0xed, 0xe4, 0xfb, 0x1d, 0x0f, 0x16, 0xef, 0x70, 0x9c, + 0xf7, 0xb3, 0x98, 0x43, 0xa7, 0x9c, 0xea, 0x2c, 0x6e, 0xd9, 0x9b, 0x85, + 0x7e, 0x20, 0x6f, 0x11, 0xdd, 0xd9, 0x96, 0xa8, 0xdb, 0xc3, 0xcf, 0x6c, + 0xc6, 0xa3, 0xc0, 0x50, 0x3b, 0x82, 0x5d, 0x3b, 0xb6, 0x8f, 0x91, 0xb3, + 0x0c, 0x97, 0x55, 0xa2, 0x8a, 0x18, 0x93, 0xd4, 0x74, 0xb6, 0x05, 0x32, + 0x92, 0xbf, 0xe0, 0x73, 0x92, 0x46, 0x35, 0xea, 0x93, 0x97, 0x99, 0x87, + 0xea, 0x37, 0xfb, 0x4c, 0x57, 0xf3, 0xf3, 0xaa, 0xa5, 0x1b, 0xaa, 0x93, + 0x5a, 0xf0, 0x65, 0x25, 0xcd, 0x23, 0x62, 0xbb, 0x45, 0x46, 0x25, 0xf4, + 0xee, 0x50, 0x05, 0xda, 0x05, 0xf2, 0xc1, 0xb9, 0x46, 0x09, 0xb1, 0xda, + 0x7f, 0xdf, 0x6a, 0xea, 0x9a, 0x4e, 0xe8, 0xa3, 0x3e, 0x5b, 0xd6, 0x4c, + 0x83, 0x4e, 0x85, 0x35, 0x05, 0x82, 0xda, 0xae, 0x4c, 0x41, 0x9e, 0x56, + 0x68, 0x24, 0x58, 0x0e, 0x8c, 0x36, 0x8b, 0x18, 0xe7, 0xd1, 0x2e, 0x99, + 0x91, 0x11, 0x46, 0xf3, 0x9b, 0x82, 0x66, 0x3f, 0xd2, 0xb6, 0xf8, 0xc6, + 0x1d, 0x4f, 0x54, 0xe0, 0xef, 0x38, 0x31, 0x42, 0x5e, 0x3c, 0x02, 0xea, + 0xad, 0xb3, 0xf5, 0x63, 0x99, 0xb7, 0xb7, 0xce, 0xd2, 0x96, 0x98, 0x20, + 0x41, 0xe3, 0x25, 0x9e, 0x3f, 0x6a, 0x56, 0x7f, 0x6e, 0x2a, 0x21, 0x14, + 0xb0, 0x08, 0x6d, 0x03, 0x41, 0xa6, 0x3e, 0xd7, 0x21, 0x2f, 0xf6, 0x27, + 0xb0, 0xc9, 0x90, 0xe3, 0xd5, 0x70, 0xfe, 0x5e, 0x5d, 0x47, 0x65, 0x5b, + 0x8f, 0x1c, 0xee, 0xc4, 0x4c, 0x5a, 0x59, 0x0a, 0x65, 0x07, 0xdd, 0x4c, + 0xf5, 0xf1, 0xe6, 0x91, 0xa8, 0xfd, 0x74, 0xbb, 0xc7, 0x5f, 0xe8, 0x82, + 0x31, 0x10, 0x1c, 0x57, 0xb5, 0x3c, 0xda, 0x31, 0x32, 0x6e, 0x66, 0xe4, + 0xef, 0x97, 0xde, 0x8a, 0xf2, 0x5f, 0x07, 0x3d, 0x5a, 0x00, 0xc1, 0x06, + 0x31, 0x1c, 0x2e, 0xd1, 0xf7, 0x46, 0x2e, 0x96, 0xc5, 0x76, 0x92, 0xed, + 0x38, 0x26, 0xe9, 0x25, 0x5a, 0x9e, 0xc5, 0x2f, 0x48, 0x36, 0x8b, 0xce, + 0xc3, 0x1a, 0x65, 0xb8, 0x16, 0xd5, 0x5e, 0x48, 0xe2, 0x35, 0x48, 0xa3, + 0x54, 0x53, 0xb4, 0xa1, 0xa1, 0x0a, 0xde, 0xd4, 0x06, 0xb6, 0x59, 0x12, + 0xb4, 0x4b, 0x23, 0x7a, 0x90, 0xa3, 0x42, 0x14, 0x3a, 0x8a, 0x14, 0xb7, + 0x3b, 0x86, 0xef, 0x4c, 0xf5, 0x3a, 0x95, 0x50, 0x97, 0x8e, 0xe2, 0xb3, + 0x35, 0x4e, 0x6b, 0x66, 0xc8, 0x71, 0x43, 0x33, 0xc1, 0xef, 0xe3, 0xa4, + 0x59, 0x74, 0x14, 0x16, 0x33, 0x60, 0xdc, 0x37, 0xa2, 0xac, 0xf9, 0x7a, + 0x65, 0x7b, 0x86, 0x66, 0x75, 0xb6, 0x9d, 0xd9, 0x4f, 0xe4, 0x4b, 0xb7, + 0xef, 0x6f, 0xa9, 0x42, 0x96, 0xa9, 0x5b, 0xf4, 0xaa, 0x22, 0x3c, 0xe8, + 0x59, 0xc0, 0xac, 0xc1, 0xbd, 0x8f, 0x40, 0x87, 0x50, 0x4d, 0x35, 0x44, + 0xb7, 0xf4, 0x60, 0xce, 0x7b, 0x8c, 0xf4, 0x47, 0xb7, 0x64, 0x17, 0x84, + 0x89, 0xcf, 0x66, 0x5a, 0x22, 0xcd, 0xf4, 0xf0, 0x4b, 0x4b, 0x47, 0xf1, + 0x38, 0x74, 0x75, 0x23, 0x91, 0x00, 0x83, 0x3e, 0x9d, 0xfd, 0xbe, 0xda, + 0x18, 0x98, 0x78, 0xcd, 0x3a, 0x5d, 0x5d, 0xb8, 0xbc, 0x54, 0xf9, 0xcd, + 0xe2, 0x13, 0x8e, 0x15, 0x2b, 0xb6, 0x9a, 0xcf, 0xb7, 0xcf, 0xce, 0x4e, + 0x5f, 0x01, 0x77, 0x2c, 0xe0, 0xe7, 0x0c, 0x30, 0x58, 0x0e, 0x76, 0xec, + 0xae, 0x9b, 0x51, 0x56, 0x1c, 0xa6, 0xd4, 0x3f, 0x62, 0xa9, 0x1a, 0x7c, + 0x06, 0x42, 0x49, 0xef, 0x69, 0x44, 0x91, 0x67, 0xee, 0xe1, 0x26, 0x13, + 0xb6, 0x7b, 0x63, 0xee, 0x28, 0xed, 0x98, 0x13, 0x7f, 0xf7, 0x4e, 0x86, + 0xad, 0x34, 0x38, 0x9c, 0x0f, 0xfd, 0xd6, 0xc2, 0xce, 0x9b, 0x80, 0x02, + 0x80, 0xa9, 0x77, 0xdd, 0x1e, 0xdc, 0x77, 0xff, 0x0f, 0xe4, 0xcc, 0x44, + 0x53, 0x3c, 0x4c, 0x62, 0xca, 0x41, 0xb2, 0xb4, 0xab, 0x0e, 0xda, 0x53, + 0xca, 0x94, 0xfe, 0x2a, 0x9d, 0x81, 0xfa, 0x77, 0xcf, 0xa8, 0xdc, 0xb4, + 0xc9, 0x6a, 0xec, 0x5a, 0x9b, 0xb3, 0x90, 0xe3, 0x45, 0xb2, 0x3c, 0x1f, + 0xa5, 0x87, 0x1c, 0xb7, 0xe7, 0x6f, 0xf7, 0x9d, 0x20, 0x11, 0x82, 0x83, + 0xe4, 0xb2, 0x49, 0x30, 0x49, 0x16, 0x4c, 0x64, 0x11, 0x92, 0x4f, 0x39, + 0xc1, 0xe4, 0xd4, 0x7f, 0x5d, 0xdc, 0x7b, 0x6d, 0x58, 0x1c, 0x05, 0x10, + 0x06, 0x85, 0x0a, 0xe4, 0x98, 0xd5, 0x0f, 0xa3, 0xd1, 0xfa, 0x97, 0xe3, + 0xff, 0xb3, 0x73, 0xf1, 0x55, 0x8a, 0x68, 0xc2, 0xb4, 0x08, 0x92, 0x39, + 0x92, 0xf0, 0x18, 0xfd, 0x1f, 0x97, 0xf7, 0xda, 0x3a, 0x2a, 0xe5, 0x5e, + 0x43, 0x09, 0xb0, 0xd0, 0x8c, 0x62, 0x4b, 0xc4, 0xb1, 0xda, 0x62, 0x01, + 0x04, 0x34, 0x05, 0xec, 0x32, 0x4c, 0xff, 0x39, 0xee, 0x27, 0x9f, 0x8b, + 0x71, 0x34, 0x77, 0xc8, 0xc3, 0x36, 0x7d, 0x63, 0x82, 0x20, 0x58, 0xfc, + 0x9f, 0xfd, 0x44, 0x02, 0x1f, 0x95, 0x69, 0xd9, 0xde, 0xd3, 0xfe, 0xa4, + 0x38, 0xb0, 0xdf, 0xae, 0xc6, 0x02, 0x70, 0xf8, 0x15, 0x99, 0x6d, 0x6f, + 0x52, 0xee, 0xe5, 0x5f, 0xf4, 0x37, 0xbd, 0xed, 0xd0, 0xad, 0x00, 0xa6, + 0x12, 0xce, 0xf4, 0x45, 0x4e, 0x39, 0x97, 0xf4, 0xce, 0x03, 0x94, 0x61, + 0x4b, 0xae, 0x68, 0x56, 0x53, 0xe7, 0x69, 0x4b, 0xd4, 0xb9, 0xa8, 0x88, + 0x33, 0x28, 0x04, 0x3a, 0x86, 0x05, 0x2f, 0x3e, 0x63, 0xf8, 0x11, 0x67, + 0xb4, 0xbc, 0x57, 0xbc, 0xd4, 0x78, 0xd4, 0x9d, 0x62, 0x11, 0xed, 0x20, + 0x23, 0x24, 0x7b, 0xa5, 0x3c, 0x84, 0xcf, 0x63, 0x83, 0x49, 0xf9, 0xdb, + 0x03, 0x53, 0x56, 0x39, 0x94, 0x8a, 0x56, 0xf3, 0x9a, 0x9a, 0x92, 0x75, + 0x9d, 0x62, 0x16, 0x44, 0x4e, 0x8f, 0x2f, 0x06, 0x51, 0x2c, 0x05, 0x4f, + 0x30, 0xd4, 0x94, 0x22, 0x49, 0xd1, 0xc9, 0xec, 0x49, 0x54, 0x7d, 0xee, + 0x2f, 0xfa, 0x53, 0x5a, 0x78, 0x4d, 0xfc, 0xee, 0x49, 0x35, 0x44, 0x48, + 0x0f, 0x18, 0xe9, 0x17, 0xb7, 0x5b, 0x16, 0x4a, 0xf5, 0x75, 0x33, 0x07, + 0x0a, 0xa4, 0xb6, 0xf5, 0x27, 0x00, 0xbf, 0x58, 0x02, 0x36, 0xc8, 0xc6, + 0x65, 0x3e, 0x75, 0x0c, 0xae, 0x54, 0x35, 0xc2, 0x3d, 0x27, 0x9b, 0x12, + 0x3f, 0x48, 0x21, 0x06, 0x39, 0x5d, 0xb8, 0xf5, 0xdd, 0xcc, 0x03, 0x12, + 0x42, 0xe7, 0xa0, 0x7e, 0xe4, 0xe8, 0x93, 0xf4, 0xb6, 0x47, 0x2c, 0x63, + 0x4b, 0xac, 0x70, 0xca, 0x11, 0x9d, 0x6e, 0x0f, 0x80, 0x8f, 0x9f, 0xb1, + 0x23, 0x61, 0x5d, 0xf6, 0x69, 0x87, 0x59, 0x1f, 0xa6, 0x15, 0x39, 0x40, + 0x33, 0xdf, 0xbc, 0x50, 0x5f, 0x19, 0x7e, 0x03, 0x9c, 0x8f, 0xe0, 0xae, + 0x97, 0x36, 0xf1, 0xb8, 0xa8, 0x9b, 0xff, 0x5f, 0x47, 0x2a, 0x5c, 0xe9, + 0x0f, 0x07, 0x8e, 0xc8, 0xe6, 0xa4, 0x1c, 0x81, 0x6c, 0xc5, 0x80, 0x19, + 0xcc, 0xbf, 0x20, 0x43, 0xee, 0x97, 0x93, 0x30, 0x0c, 0x2c, 0x90, 0x52, + 0x2c, 0x8b, 0xa2, 0x89, 0x95, 0x5a, 0xa4, 0xb6, 0x67, 0xa5, 0xee, 0x88, + 0x6b, 0xb7, 0xe3, 0x3e, 0x7d, 0xac, 0x48, 0x39, 0x71, 0x63, 0xd7, 0x83, + 0xea, 0xc2, 0xeb, 0x1e, 0x5a, 0x83, 0xc0, 0xbd, 0x33, 0x90, 0x43, 0x38, + 0x2e, 0x34, 0x3c, 0x6c, 0xfb, 0x5b, 0xf9, 0xf7, 0x9d, 0x80, 0x15, 0xf8, + 0x02, 0x0c, 0x0c, 0x59, 0xa3, 0xbb, 0x68, 0xf4, 0xcb, 0xe1, 0x07, 0x43, + 0x0b, 0x4a, 0x52, 0x79, 0x20, 0x36, 0x10, 0x29, 0xa7, 0xd1, 0x7e, 0x10, + 0x85, 0xfc, 0x39, 0x62, 0x1a, 0x1c, 0x7b, 0xbd, 0x30, 0xa0, 0x74, 0x1b, + 0x44, 0xb9, 0x95, 0xe3, 0x9a, 0x81, 0xac, 0x92, 0xf3, 0x77, 0x69, 0xa0, + 0xbf, 0x02, 0x68, 0x24, 0x9e, 0x60, 0x4e, 0xf9, 0xc2, 0xd5, 0x1d, 0xda, + 0xc0, 0x7e, 0xe6, 0x85, 0xec, 0x53, 0x17, 0xdb, 0x9f, 0x96, 0x82, 0x16, + 0x7d, 0x6e, 0x62, 0xe2, 0x91, 0x2f, 0x6e, 0xd6, 0x94, 0x00, 0x97, 0x11, + 0x7a, 0xb9, 0x6d, 0x9e, 0x7b, 0xb9, 0xd1, 0x5e, 0x86, 0x3e, 0x93, 0xa2, + 0x37, 0x52, 0x56, 0x40, 0x09, 0x7a, 0xab, 0x18, 0xd9, 0x8a, 0x26, 0x98, + 0x58, 0x75, 0xd9, 0xdf, 0x1d, 0xce, 0x74, 0x14, 0x39, 0x07, 0x37, 0x43, + 0x61, 0x87, 0x80, 0x7a, 0xf2, 0x7b, 0x66, 0x77, 0x37, 0x56, 0x3c, 0x09, + 0x59, 0x5c, 0xf3, 0x4c, 0xc7, 0xf3, 0x4e, 0x2e, 0xa3, 0xf6, 0x63, 0x42, + 0x7b, 0x8c, 0x1e, 0x2e, 0x88, 0xe1, 0xd9, 0xe1, 0x82, 0x3e, 0x00, 0x3d, + 0x49, 0xf1, 0x83, 0x6a, 0x2b, 0x23, 0x5c, 0x7e, 0x67, 0x95, 0xd5, 0xbb, + 0x79, 0x02, 0x14, 0xa9, 0x14, 0xb9, 0x96, 0x93, 0x7d, 0x66, 0xcc, 0x29, + 0x48, 0x85, 0x7f, 0x6a, 0x0e, 0xef, 0xd0, 0xee, 0x08, 0x8a, 0xf4, 0x26, + 0xac, 0xed, 0xaa, 0x08, 0xa5, 0x8d, 0xa8, 0x67, 0x0f, 0x6a, 0xf9, 0x55, + 0x06, 0x54, 0xe6, 0x1c, 0xf3, 0xb1, 0xf4, 0xa3, 0x82, 0x5e, 0x33, 0x6c, + 0xec, 0x27, 0xb9, 0xaf, 0x38, 0x60, 0xbe, 0x3b, 0x14, 0x1e, 0xc1, 0xfb, + 0x3d, 0x33, 0xb3, 0x2f, 0xef, 0x59, 0xfd, 0xc3, 0xc6, 0x90, 0x37, 0x78, + 0xa1, 0xb5, 0x62, 0x0e, 0x99, 0xe6, 0x4d, 0x1f, 0x69, 0x23, 0x7b, 0xbc, + 0xab, 0xfd, 0x74, 0xc9, 0x94, 0x75, 0x82, 0xb0, 0x4c, 0xb4, 0x03, 0x21, + 0x91, 0x77, 0x41, 0xb1, 0x38, 0x2f, 0xb2, 0xaf, 0x1d, 0x65, 0xde, 0xd2, + 0xe2, 0xc9, 0x26, 0x26, 0x34, 0x8d, 0xa7, 0xe3, 0xd8, 0x6b, 0xcd, 0x30, + 0x21, 0x5d, 0x17, 0x33, 0xd6, 0xf7, 0x12, 0x7a, 0x3d, 0x74, 0x69, 0x7e, + 0xd3, 0xd0, 0x15, 0xda, 0xff, 0x57, 0xa9, 0xd4, 0xd7, 0x49, 0xe5, 0x67, + 0xeb, 0x82, 0x22, 0x0d, 0x6d, 0xc9, 0x3f, 0x81, 0x96, 0xc0, 0x28, 0xfa, + 0xcb, 0xb5, 0x02, 0xc1, 0xa5, 0x90, 0xa8, 0x94, 0x63, 0x23, 0x1e, 0xa2, + 0x50, 0xa2, 0x43, 0x87, 0x91, 0xa7, 0xd7, 0x97, 0x11, 0x60, 0xf7, 0xb3, + 0xaf, 0x29, 0xc8, 0xcc, 0xe9, 0x63, 0xc1, 0x5b, 0x37, 0xca, 0xfa, 0x7a, + 0x0f, 0xf7, 0xf3, 0x34, 0x2f, 0x72, 0x3f, 0x3d, 0xab, 0x88, 0x68, 0xef, + 0x7c, 0x9c, 0xf1, 0x6a, 0xe9, 0x00, 0xb2, 0x9e, 0xfd, 0x01, 0xf0, 0xf5, + 0xb7, 0x54, 0x08, 0xa8, 0xac, 0x3c, 0xa1, 0x92, 0x55, 0x55, 0xeb, 0x67, + 0x16, 0xbc, 0x26, 0xe1, 0x96, 0x23, 0xd0, 0xe0, 0x4b, 0x9c, 0x52, 0x74, + 0x90, 0x27, 0xe4, 0xc8, 0x59, 0x8e, 0xf1, 0xf5, 0x30, 0x30, 0xdc, 0x94, + 0xc4, 0x00, 0x32, 0xac, 0x0d, 0x96, 0x46, 0x90, 0xd7, 0xfc, 0x1a, 0x3c, + 0x4b, 0x85, 0x35, 0x88, 0x56, 0xef, 0x59, 0x14, 0x11, 0x44, 0x25, 0x99, + 0x23, 0x8c, 0xa0, 0x5e, 0xde, 0x0f, 0xe1, 0x79, 0x2f, 0x29, 0xa5, 0x19, + 0xa1, 0xbc, 0xf8, 0x20, 0x57, 0x01, 0xb0, 0x8c, 0x57, 0x0c, 0x45, 0xf2, + 0xca, 0x8f, 0x48, 0x58, 0xeb, 0xb8, 0x36, 0xa2, 0x1e, 0xd5, 0x4e, 0x7c, + 0x46, 0x4f, 0x34, 0x8c, 0xd3, 0x51, 0x64, 0xd9, 0x5e, 0x1e, 0x6e, 0x06, + 0xb6, 0x31, 0xf7, 0x2e, 0xb7, 0xe3, 0x8d, 0x30, 0x88, 0x7c, 0xe0, 0xde, + 0xb9, 0x34, 0x36, 0xf4, 0x24, 0x3f, 0x3b, 0xb3, 0x9d, 0x92, 0x91, 0x7d, + 0x53, 0xbc, 0x25, 0xca, 0x30, 0xa6, 0x52, 0xbd, 0xf9, 0xc9, 0x8b, 0x71, + 0x4a, 0x53, 0x48, 0x00, 0x7d, 0xe6, 0x43, 0x39, 0xe1, 0xe2, 0xe3, 0x6c, + 0x92, 0x1b, 0x53, 0xcb, 0x5f, 0x98, 0xa3, 0xc6, 0x1c, 0x51, 0xc9, 0x69, + 0xc6, 0x15, 0x2f, 0x2a, 0xd5, 0x52, 0x93, 0x53, 0xb8, 0x20, 0xa0, 0x1b, + 0xc3, 0x11, 0x54, 0x38, 0x81, 0x5b, 0x13, 0xb2, 0x32, 0xb4, 0x83, 0xd0, + 0xb5, 0xcf, 0x40, 0xa7, 0x98, 0xb8, 0x6f, 0x30, 0x03, 0xe1, 0xd1, 0x8b, + 0xc1, 0x8a, 0x54, 0x65, 0x02, 0x7e, 0x55, 0x24, 0x28, 0x4d, 0xea, 0x29, + 0x48, 0x9b, 0x8b, 0xd5, 0x02, 0x24, 0xe8, 0xeb, 0xe9, 0xd0, 0x1b, 0x8b, + 0x8a, 0x0a, 0x75, 0x52, 0xf5, 0x64, 0xd7, 0x72, 0x1b, 0x37, 0x59, 0x4b, + 0xe8, 0x06, 0x9c, 0x54, 0x8c, 0x65, 0x9e, 0xb7, 0x08, 0xb1, 0xd2, 0xa0, + 0xe6, 0x44, 0x1c, 0x06, 0x42, 0x40, 0xec, 0x2c, 0xf0, 0x5a, 0xd8, 0xbb, + 0x2d, 0x09, 0x08, 0x5a, 0x92, 0x26, 0x0c, 0xc6, 0xe3, 0x2a, 0xdb, 0xd7, + 0x27, 0xea, 0x5a, 0x53, 0x00, 0xec, 0x53, 0x2d, 0xdc, 0x54, 0x4f, 0x76, + 0xaa, 0x88, 0xe9, 0x26, 0x37, 0x3c, 0xf7, 0x9c, 0x19, 0x86, 0x50, 0x1c, + 0xcb, 0x9d, 0xcd, 0x3a, 0xfa, 0x47, 0x40, 0x36, 0xe1, 0x4d, 0x97, 0xc1, + 0x2a, 0x12, 0x28, 0x9f, 0x89, 0x15, 0x48, 0x3c, 0xc9, 0xcf, 0x3c, 0xdc, + 0x55, 0x73, 0x37, 0x15, 0x70, 0x6b, 0x25, 0x89, 0xe0, 0x23, 0x13, 0x44, + 0xab, 0x10, 0xaa, 0x30, 0x0e, 0x5e, 0x1c, 0x54, 0x21, 0x3b, 0xbf, 0xad, + 0x0a, 0xa7, 0x3f, 0xb1, 0x5c, 0xa2, 0x09, 0xb1, 0xe6, 0x1d, 0x6a, 0x17, + 0xe4, 0x3c, 0x42, 0x49, 0xa9, 0xe0, 0x0d, 0x1c, 0x91, 0x62, 0x51, 0x84, + 0x3a, 0xea, 0x05, 0x56, 0xeb, 0x7a, 0xec, 0xe2, 0xbd, 0x2d, 0x63, 0x89, + 0x4a, 0x9b, 0x3d, 0xbf, 0x46, 0x93, 0x85, 0xad, 0xd4, 0xb7, 0xc5, 0x99, + 0x43, 0xb1, 0xfc, 0x4d, 0xdc, 0xb2, 0xab, 0x6a, 0x86, 0xfd, 0x7b, 0x03, + 0xe8, 0x2b, 0x88, 0x33, 0x0a, 0xe2, 0x39, 0x80, 0x0d, 0xd4, 0x33, 0x1a, + 0xf9, 0x3c, 0x34, 0xa6, 0xb3, 0x40, 0xae, 0x1c, 0x29, 0x26, 0xe5, 0xae, + 0x2f, 0x04, 0xe8, 0xb8, 0xd5, 0xf6, 0x64, 0x15, 0x27, 0x0d, 0xd9, 0x01, + 0x25, 0x8d, 0x53, 0x06, 0xef, 0x38, 0x91, 0x44, 0x7c, 0xbd, 0x84, 0x3e, + 0xe8, 0xfe, 0x17, 0x57, 0xcf, 0xc6, 0xf1, 0x47, 0x28, 0x67, 0xbe, 0x4d, + 0x29, 0x0d, 0xaa, 0xd4, 0x52, 0x2e, 0x9c, 0x04, 0x88, 0x8a, 0x08, 0x73, + 0xad, 0x0a, 0x05, 0x9f, 0x93, 0xd0, 0xc7, 0x31, 0x31, 0x04, 0x5e, 0x74, + 0x13, 0x8b, 0x88, 0x69, 0x25, 0x5b, 0xfe, 0x33, 0x9d, 0xb5, 0x6d, 0xf5, + 0x93, 0x87, 0x1d, 0x63, 0x37, 0x54, 0x08, 0xfd, 0x8f, 0x72, 0xca, 0x58, + 0xf3, 0x88, 0x6d, 0xd5, 0xb1, 0x68, 0x80, 0xde, 0xca, 0x80, 0x94, 0xb7, + 0xbc, 0x14, 0x44, 0x48, 0x0a, 0x7c, 0xd3, 0xd5, 0x78, 0x6a, 0xfa, 0x44, + 0xce, 0xae, 0x65, 0x05, 0x2c, 0x89, 0xcb, 0xc5, 0x34, 0xad, 0x27, 0x9f, + 0xcb, 0x57, 0x21, 0x1d, 0xd2, 0x92, 0xcc, 0xa2, 0x4b, 0xe5, 0x80, 0x0f, + 0x77, 0x3b, 0xc9, 0x34, 0x69, 0x4a, 0x7d, 0x97, 0x32, 0x57, 0xc1, 0x5e, + 0x1d, 0x39, 0x8a, 0x5a, 0x4b, 0x77, 0x00, 0x27, 0xb6, 0xef, 0x7e, 0xab, + 0x64, 0x57, 0x41, 0xfb, 0x94, 0x63, 0xf0, 0xfc, 0x4c, 0xc7, 0x92, 0xc5, + 0xe7, 0x3e, 0x83, 0xf1, 0x85, 0x4a, 0x5b, 0xbc, 0x33, 0x06, 0x3a, 0x36, + 0x5c, 0xb6, 0x20, 0x59, 0xdb, 0xec, 0x6a, 0x10, 0x33, 0xb4, 0x19, 0x4b, + 0x51, 0xe3, 0xbf, 0xdb, 0x26, 0x14, 0x5d, 0xa3, 0x4b, 0x51, 0x77, 0x17, + 0x24, 0xaf, 0xd1, 0x9c, 0x9d, 0x2e, 0x90, 0x56, 0x14, 0x40, 0x0e, 0x3b, + 0xea, 0x79, 0xa2, 0x02, 0xdf, 0xd8, 0x23, 0xde, 0xe1, 0x6f, 0x8b, 0xb5, + 0xe6, 0x69, 0x90, 0x94, 0x7d, 0x9e, 0x7f, 0xc5, 0x26, 0x89, 0xe2, 0x24, + 0x0f, 0x70, 0x06, 0x4d, 0x4e, 0x67, 0xed, 0xfe, 0xa0, 0x69, 0xc2, 0x81, + 0x08, 0xe3, 0x3c, 0x5e, 0x58, 0x14, 0xee, 0x96, 0x09, 0xf6, 0x85, 0xba, + 0x1f, 0xc5, 0xc3, 0x5d, 0xb6, 0xda, 0xed, 0x5a, 0xd3, 0xba, 0x19, 0xc4, + 0xb7, 0x78, 0x45, 0x4a, 0xd5, 0x1e, 0x2b, 0x3e, 0x60, 0xf8, 0xa3, 0xdc, + 0x87, 0xe4, 0x02, 0x98, 0x6a, 0x7d, 0x8a, 0xe1, 0x33, 0xf2, 0x95, 0xbf, + 0x72, 0x7e, 0xc4, 0xd2, 0xd7, 0x21, 0x72, 0x63, 0x98, 0xb7, 0x3f, 0x50, + 0x36, 0xef, 0x32, 0xc0, 0x1d, 0x29, 0xd0, 0x70, 0xed, 0xf4, 0x19, 0xbf, + 0xcd, 0xd0, 0x65, 0x84, 0xab, 0xc9, 0x04, 0x51, 0x44, 0xbb, 0x2e, 0x0b, + 0x1b, 0x42, 0x42, 0x81, 0x75, 0x28, 0x53, 0xf5, 0x69, 0x4e, 0x4b, 0xbe, + 0x47, 0xfc, 0x05, 0x32, 0xdb, 0x0c, 0xee, 0xf3, 0x36, 0x32, 0xb2, 0xbe, + 0xa2, 0xc9, 0xbf, 0x48, 0x7a, 0xba, 0xce, 0x66, 0x32, 0xff, 0x46, 0xcc, + 0xe1, 0x40, 0x50, 0xb0, 0xdb, 0xf9, 0xd1, 0x56, 0xd4, 0x79, 0x20, 0x98, + 0x51, 0x13, 0x1c, 0x28, 0xf1, 0xa9, 0x79, 0xb5, 0x93, 0x25, 0x12, 0x44, + 0xba, 0x7e, 0xf1, 0x7f, 0x9e, 0x44, 0xf3, 0x19, 0x9d, 0x8e, 0x70, 0x10, + 0x91, 0x08, 0x48, 0x95, 0x6f, 0xd3, 0xff, 0xb5, 0xac, 0x0c, 0x2b, 0xfe, + 0xa8, 0x3a, 0x2e, 0x02, 0xf9, 0xbb, 0x0a, 0x93, 0x7e, 0xd6, 0xd5, 0x58, + 0x15, 0x11, 0x8f, 0x90, 0x6b, 0xaa, 0x8e, 0x4e, 0x02, 0xd5, 0xfe, 0x05, + 0xc3, 0x97, 0x84, 0x15, 0x2b, 0x11, 0x00, 0x06, 0x01, 0x0e, 0xf7, 0x18, + 0x55, 0xb5, 0xf5, 0x5e, 0x5b, 0xb8, 0xf6, 0xb5, 0x80, 0x38, 0xd0, 0x52, + 0x97, 0x44, 0x31, 0xe1, 0x60, 0x3f, 0xd2, 0x3e, 0x1b, 0x8f, 0x0f, 0x27, + 0xf1, 0xba, 0x48, 0x3c, 0xc8, 0x92, 0xf1, 0x67, 0x05, 0x4d, 0xf9, 0x28, + 0x35, 0xda, 0x5e, 0x83, 0x2f, 0xe8, 0x9b, 0x71, 0xac, 0xd9, 0xc2, 0x97, + 0x0d, 0x52, 0x63, 0xbb, 0xc7, 0x43, 0x35, 0x4d, 0x9f, 0xb6, 0x4a, 0x9c, + 0x08, 0xd2, 0x14, 0xfb, 0x00, 0x2e, 0xdd, 0x5a, 0xfc, 0x55, 0xa7, 0x8d, + 0xcd, 0xc6, 0x39, 0x2a, 0xf2, 0x55, 0x8e, 0x0a, 0x2d, 0x0f, 0x8a, 0x12, + 0x02, 0xe1, 0x0a, 0x72, 0xdc, 0xd5, 0x74, 0x82, 0xff, 0xc1, 0xb3, 0x57, + 0x7b, 0xcd, 0xa6, 0x12, 0x2a, 0x30, 0x32, 0x8b, 0xba, 0xd6, 0x24, 0x85, + 0x7d, 0x11, 0x5d, 0x18, 0xd2, 0x01, 0x44, 0xb4, 0x8a, 0x96, 0xc6, 0x7a, + 0x6f, 0x13, 0xe7, 0x82, 0xb2, 0x5b, 0xd3, 0x11, 0x0d, 0x23, 0xf4, 0xb3, + 0xb5, 0x69, 0x4d, 0x0a, 0xfa, 0x35, 0xec, 0xb4, 0x7f, 0xb7, 0x3c, 0x06, + 0x13, 0x81, 0x27, 0x35, 0xf8, 0x0b, 0x21, 0xb4, 0x79, 0x3e, 0xf0, 0x97, + 0xb4, 0xf6, 0x3e, 0xe4, 0x63, 0x66, 0x4a, 0x86, 0xe0, 0x78, 0x68, 0x3a, + 0x0c, 0x11, 0x98, 0xd9, 0xe2, 0x37, 0x3c, 0xde, 0x1a, 0x88, 0x45, 0x2c, + 0xae, 0xd1, 0xbb, 0x98, 0xb0, 0x0d, 0x60, 0x11, 0xde, 0x42, 0x27, 0x75, + 0x3b, 0x9a, 0x84, 0x82, 0xba, 0xeb, 0xd5, 0xe2, 0x54, 0x22, 0xc7, 0x2c, + 0xc6, 0x07, 0x05, 0x8b, 0x54, 0xe4, 0x5e, 0xdc, 0x85, 0xb6, 0xfa, 0xe2, + 0x36, 0xd7, 0x99, 0x1a, 0xc4, 0x8b, 0xe9, 0x8f, 0xee, 0xeb, 0x49, 0x1e, + 0x63, 0x4e, 0xdf, 0x98, 0x2a, 0xb7, 0xd5, 0x31, 0x0f, 0x40, 0x7f, 0xb3, + 0xa8, 0xa3, 0xe2, 0x51, 0xa2, 0x2d, 0xa7, 0x53, 0xd3, 0x16, 0x6f, 0xa7, + 0xa6, 0xa6, 0x6e, 0x9a, 0x99, 0x02, 0xfe, 0x7e, 0x02, 0x41, 0x59, 0x0f, + 0x21, 0x81, 0x46, 0x72, 0x0d, 0xa5, 0xf6, 0x2f, 0x15, 0xc8, 0x57, 0x07, + 0x98, 0xf5, 0x68, 0x13, 0xe1, 0x3a, 0xba, 0xe3, 0x06, 0x81, 0xbf, 0x55, + 0xaf, 0x70, 0xab, 0xac, 0x59, 0xa4, 0xeb, 0x36, 0x84, 0xb9, 0x39, 0xaf, + 0x49, 0x32, 0xaf, 0x8f, 0x32, 0xf4, 0x58, 0x37, 0x10, 0x3d, 0xdb, 0xc3, + 0xb1, 0xce, 0x56, 0x39, 0xfc, 0x34, 0xe9, 0x0c, 0x42, 0xf9, 0xa0, 0xbc, + 0x22, 0x28, 0x83, 0x72, 0xc5, 0xf0, 0x4b, 0x9a, 0xb0, 0x1e, 0x84, 0x93, + 0x3d, 0x9d, 0xcb, 0x36, 0x94, 0xd5, 0x16, 0xca, 0x70, 0x7d, 0x33, 0xda, + 0x12, 0xdc, 0x1b, 0x73, 0x6c, 0x0f, 0xef, 0x7e, 0x1f, 0x12, 0x83, 0x6d, + 0x80, 0x01, 0xb6, 0x00, 0x3b, 0xbb, 0x78, 0x6c, 0x64, 0x99, 0xb9, 0x4c, + 0xf3, 0x16, 0x88, 0x0b, 0x7b, 0x84, 0x2a, 0x8e, 0x39, 0x8c, 0xe7, 0x2d, + 0x0a, 0x25, 0xd7, 0x17, 0x95, 0xac, 0xcb, 0xb8, 0x89, 0xab, 0xe2, 0x18, + 0x66, 0xaf, 0x8c, 0x6e, 0x07, 0x6e, 0xfb, 0x27, 0x3a, 0x81, 0x0e, 0x58, + 0xd1, 0x8b, 0xb0, 0x80, 0x1d, 0x89, 0x8e, 0xfe, 0xe3, 0x8b, 0x9e, 0x34, + 0x51, 0xca, 0x9a, 0x05, 0xce, 0xb9, 0xc5, 0xd9, 0x66, 0xf6, 0x9c, 0x70, + 0x75, 0x41, 0xa0, 0xee, 0x5a, 0xa7, 0x84, 0xce, 0xea, 0x64, 0x0e, 0x6f, + 0x28, 0x8c, 0x06, 0xae, 0x3e, 0x00, 0x50, 0x00, 0x29, 0xfc, 0x63, 0xa1, + 0x04, 0x27, 0xf0, 0xe7, 0x04, 0x06, 0x78, 0x25, 0xee, 0xd6, 0xf1, 0x76, + 0x6d, 0x3a, 0x61, 0x47, 0x9c, 0xd2, 0x1b, 0xc6, 0xe9, 0x31, 0xf8, 0xae, + 0xa2, 0xd0, 0xa5, 0x25, 0x99, 0x9b, 0xca, 0x91, 0xfc, 0xcb, 0x79, 0x16, + 0xf1, 0x77, 0x92, 0xde, 0xad, 0xc6, 0xff, 0xed, 0xbc, 0x82, 0x4b, 0x77, + 0xe9, 0x73, 0x91, 0x4d, 0x71, 0xc6, 0x30, 0x3a, 0x6b, 0x60, 0xf9, 0x24, + 0xdf, 0x34, 0x66, 0x07, 0x4e, 0xa6, 0xb7, 0x4b, 0xb2, 0xaa, 0x6c, 0x05, + 0xfd, 0x87, 0x5b, 0x07, 0x06, 0x67, 0x98, 0x59, 0x87, 0xaf, 0x6c, 0x16, + 0x11, 0x8e, 0x77, 0x09, 0x29, 0x67, 0x70, 0x7c, 0x52, 0x7a, 0x2f, 0xdf, + 0x38, 0x95, 0xe9, 0x10, 0x29, 0x94, 0xe4, 0x80, 0xa3, 0x0c, 0xed, 0x17, + 0xec, 0x07, 0x61, 0x89, 0xc6, 0x95, 0x89, 0x69, 0xf5, 0x16, 0x78, 0x72, + 0xb3, 0x61, 0x84, 0xe6, 0x56, 0xd7, 0xad, 0x3f, 0xb6, 0x0b, 0x2a, 0x53, + 0xcd, 0xe1, 0xc1, 0xf2, 0x6f, 0xb4, 0x86, 0x22, 0xf8, 0x47, 0x93, 0xdf, + 0x5e, 0xba, 0x5d, 0xe3, 0x9c, 0xd4, 0xaa, 0xc1, 0x1e, 0xe9, 0x72, 0xe1, + 0xb3, 0xcc, 0x91, 0xa7, 0xa4, 0xea, 0xa3, 0x9c, 0x8c, 0x76, 0xe4, 0xa6, + 0x4c, 0xa8, 0xcc, 0xde, 0xd8, 0x6b, 0x23, 0x7a, 0xea, 0x43, 0xd9, 0xad, + 0x2f, 0x9b, 0x54, 0x30, 0xe7, 0x7c, 0x05, 0x05, 0x11, 0x6d, 0x2e, 0x0b, + 0xd7, 0xea, 0x84, 0x23, 0x1e, 0x30, 0xe5, 0x44, 0xe9, 0x1c, 0x6e, 0x28, + 0x2e, 0x4c, 0x8a, 0xce, 0x6c, 0x60, 0xbb, 0xe0, 0x30, 0x1f, 0xc0, 0x83, + 0x91, 0x7f, 0x62, 0xf6, 0x7c, 0x6d, 0x66, 0x7a, 0x1c, 0xc2, 0x97, 0x01, + 0x5f, 0x92, 0x30, 0x08, 0x34, 0x78, 0x36, 0xe3, 0x12, 0x7e, 0xfe, 0xe1, + 0x21, 0x74, 0xa7, 0x36, 0x34, 0xd3, 0x64, 0x72, 0x89, 0x64, 0xea, 0x3b, + 0x65, 0xb1, 0xcf, 0xa2, 0x72, 0xaf, 0x3e, 0x6c, 0x04, 0x43, 0x49, 0x6f, + 0xfb, 0x5c, 0xc6, 0x61, 0xa7, 0xdb, 0xf9, 0xf3, 0xee, 0x62, 0x33, 0x40, + 0x6c, 0x2b, 0x87, 0xb3, 0x81, 0x5b, 0x17, 0xa1, 0xd0, 0x31, 0x0c, 0xb7, + 0x15, 0xb3, 0x5f, 0xc8, 0xc3, 0x88, 0x7b, 0x76, 0x6a, 0x9b, 0xc0, 0x03, + 0xd6, 0x9a, 0x38, 0x7c, 0x0a, 0x85, 0x72, 0x92, 0x55, 0x52, 0xfb, 0x33, + 0x06, 0xa3, 0x25, 0x8a, 0x97, 0x43, 0xdb, 0x17, 0x90, 0x36, 0x02, 0x3a, + 0x72, 0x44, 0xd5, 0xd5, 0xf9, 0x3a, 0x18, 0xba, 0x9e, 0x1b, 0xc3, 0xa9, + 0xb9, 0x3b, 0x46, 0x06, 0x01, 0xab, 0x40, 0x64, 0x9f, 0x42, 0xda, 0xa9, + 0xf3, 0x18, 0x67, 0x33, 0xbd, 0xbd, 0x43, 0xd5, 0x70, 0x8a, 0xd5, 0xcb, + 0x76, 0xf2, 0xd1, 0x07, 0xac, 0xc4, 0xe5, 0x5e, 0xb9, 0x49, 0xa0, 0x28, + 0xe0, 0xae, 0xa7, 0x1e, 0xad, 0xee, 0x27, 0xb9, 0x98, 0xd5, 0xa2, 0xa1, + 0xe5, 0x9b, 0xa1, 0x84, 0xa8, 0x30, 0x44, 0x18, 0x52, 0xfd, 0xf3, 0xa5, + 0xa8, 0xcc, 0x26, 0x70, 0x56, 0x41, 0xe9, 0x18, 0x59, 0x21, 0x7f, 0x0c, + 0x06, 0x5f, 0x3a, 0x8a, 0x2c, 0x8a, 0x9f, 0x8d, 0x76, 0x59, 0x12, 0x7b, + 0x4f, 0x9e, 0x6f, 0x3a, 0xad, 0x49, 0xe7, 0xe7, 0x15, 0x2c, 0xf4, 0xfd, + 0x70, 0xde, 0x4a, 0x71, 0xd4, 0x96, 0x51, 0x63, 0x23, 0x53, 0x14, 0x8b, + 0x5e, 0x35, 0xa1, 0x77, 0x80, 0xa0, 0x94, 0xe9, 0x23, 0x81, 0xbc, 0x9a, + 0x48, 0x43, 0x24, 0x03, 0xd0, 0xa8, 0xd7, 0x8d, 0x3d, 0xa5, 0xd4, 0x8c, + 0x8b, 0x51, 0x84, 0x51, 0x54, 0x80, 0x70, 0x19, 0xc8, 0xfe, 0x80, 0x34, + 0x8b, 0x5b, 0xc8, 0x51, 0x31, 0x2b, 0x7e, 0x4d, 0x57, 0xf9, 0x66, 0xe9, + 0x17, 0x7e, 0xbe, 0x7b, 0xae, 0x11, 0xd5, 0xb2, 0xca, 0xf6, 0xa1, 0x66, + 0x94, 0x41, 0x23, 0xee, 0x55, 0xd4, 0x3a, 0xbf, 0x71, 0x58, 0x37, 0x75, + 0x06, 0xcb, 0x57, 0x4d, 0x4f, 0x5f, 0x63, 0x72, 0xa3, 0x83, 0x8b, 0x4d, + 0x61, 0x78, 0xa7, 0x24, 0xe7, 0xd9, 0x14, 0xd8, 0x61, 0xd5, 0xf2, 0xec, + 0x69, 0x46, 0x56, 0x1f, 0x44, 0x91, 0xa9, 0x6e, 0xc8, 0x9e, 0x17, 0xa1, + 0xaf, 0x68, 0x48, 0x15, 0xe5, 0xea, 0x01, 0xeb, 0x7c, 0x4e, 0x36, 0xd1, + 0x45, 0xe8, 0xba, 0x54, 0xa6, 0x61, 0x2d, 0xa1, 0x13, 0xa9, 0x4c, 0x6d, +}; + +const uint8_t expected_sig[] = { + 0xdf, 0xe6, 0xe1, 0xa5, 0x20, 0xc1, 0xac, 0x98, 0x55, 0x2c, 0xf2, 0x13, + 0x65, 0x42, 0xe2, 0xb0, 0x77, 0x5f, 0x15, 0x00, 0x8f, 0x14, 0x48, 0xa1, + 0xe3, 0xee, 0x81, 0x35, 0x15, 0x34, 0xad, 0x6e, 0x60, 0x85, 0x00, 0xf8, + 0x18, 0x53, 0x0d, 0xa0, 0xc5, 0x41, 0xc4, 0x48, 0x09, 0x1b, 0x34, 0x0c, + 0x0e, 0xcf, 0xc6, 0x3d, 0x38, 0x78, 0x8b, 0x69, 0xe5, 0x6f, 0x4d, 0x43, + 0xfa, 0xa6, 0x75, 0x26, 0x8a, 0x75, 0x97, 0x10, 0x6a, 0x1f, 0x3c, 0xa6, + 0x94, 0xa9, 0x93, 0x8f, 0xe5, 0x62, 0xbf, 0x94, 0xe4, 0xd0, 0x0d, 0x11, + 0x4d, 0x03, 0xe2, 0xd8, 0xdf, 0x68, 0xb7, 0x87, 0x62, 0xc9, 0xdc, 0xc9, + 0x36, 0x4f, 0xcc, 0xd1, 0xa4, 0xae, 0x7e, 0xa4, 0xb9, 0xaf, 0xaf, 0xf0, + 0x8a, 0xe6, 0xff, 0x83, 0xe7, 0x54, 0x22, 0x6e, 0x3f, 0x2e, 0xa0, 0x4f, + 0xa8, 0x31, 0x53, 0xf3, 0x62, 0xeb, 0x04, 0xfa, 0xd1, 0x57, 0x39, 0x43, + 0xf9, 0xe0, 0x31, 0x12, 0x45, 0x09, 0x8b, 0x9e, 0x1e, 0x7a, 0x2b, 0x85, + 0xee, 0xdd, 0xe8, 0x1e, 0xd7, 0xc0, 0x17, 0xb4, 0xd2, 0xdc, 0x36, 0xa9, + 0xe4, 0x49, 0x88, 0xbf, 0x71, 0x43, 0x9d, 0x3e, 0xd2, 0x10, 0xe7, 0x82, + 0xb5, 0xfe, 0xdd, 0x42, 0xc8, 0x1b, 0x11, 0xf6, 0x52, 0x23, 0x98, 0x83, + 0x48, 0xec, 0xec, 0x70, 0x8b, 0xe7, 0x49, 0x9a, 0xd7, 0xd9, 0x7b, 0x47, + 0x4e, 0xe2, 0x5e, 0x17, 0x1a, 0xa0, 0x0e, 0x60, 0x85, 0x3a, 0x30, 0x8c, + 0x1c, 0x26, 0xb4, 0xe1, 0xb5, 0x2b, 0x48, 0xf4, 0xb8, 0x93, 0x2f, 0x79, + 0x3a, 0x1e, 0xb6, 0x3b, 0x07, 0x3b, 0x1e, 0x15, 0xd7, 0x85, 0x5e, 0xd4, + 0x06, 0x0e, 0xcd, 0x6a, 0x93, 0x3a, 0x93, 0x29, 0x6a, 0xbe, 0x68, 0x8a, + 0xb6, 0xb8, 0xfa, 0xc5, 0x63, 0x48, 0x98, 0x10, 0x6d, 0xd9, 0xd3, 0x5b, + 0x29, 0x5f, 0x93, 0x90, 0x08, 0x1c, 0x1a, 0x15, 0x7b, 0x0a, 0x59, 0x9d, + 0x64, 0x24, 0x45, 0xb6, 0xd3, 0x7b, 0xc1, 0x5d, 0x74, 0x1f, 0x0b, 0x8e, + 0x18, 0xf2, 0x92, 0x8e, 0xd4, 0x7f, 0x72, 0x5c, 0x98, 0x1f, 0x8b, 0xa5, + 0xb8, 0xf4, 0x7e, 0x12, 0x6a, 0x93, 0xb9, 0xb5, 0xf1, 0xda, 0x97, 0x75, + 0x4f, 0x56, 0x80, 0x88, 0x64, 0x2b, 0xe0, 0x59, 0xcd, 0x5e, 0x91, 0x64, + 0x9c, 0x0c, 0xa8, 0xdd, 0xac, 0xcb, 0xf3, 0x48, 0x3b, 0x5c, 0xc4, 0xc5, + 0xb9, 0x9a, 0x0b, 0x8e, 0x5d, 0x9a, 0xd5, 0xb7, 0xf0, 0xd4, 0x07, 0x48, + 0xb9, 0x63, 0x02, 0x87, 0x8d, 0xae, 0x7e, 0x03, 0x33, 0x4f, 0x86, 0x15, + 0x1b, 0x3b, 0xdf, 0xda, 0xce, 0xd3, 0x1e, 0xc0, 0x76, 0xb5, 0x1c, 0xdd, + 0xb8, 0x32, 0x87, 0x7d, 0x59, 0x18, 0x72, 0x0c, 0xde, 0x8f, 0x63, 0x2d, + 0x38, 0xf2, 0xe9, 0xc2, 0x81, 0xed, 0xfa, 0x2d, 0x61, 0xef, 0x48, 0xdb, + 0xa2, 0xeb, 0xfe, 0x52, 0x31, 0x1e, 0x21, 0x0a, 0x08, 0xf6, 0x02, 0xd3, + 0xc0, 0x32, 0x3b, 0x6b, 0x2f, 0x64, 0xc4, 0xb3, 0x4b, 0xfe, 0x69, 0x78, + 0xbf, 0x20, 0x62, 0x07, 0x77, 0xdf, 0x2c, 0x18, 0x53, 0x61, 0x8e, 0x05, + 0x01, 0x86, 0xab, 0xab, 0xec, 0x18, 0x8c, 0x15, 0x63, 0x1f, 0xe9, 0x99, + 0xb2, 0x35, 0x77, 0xe1, 0x58, 0xf1, 0xa9, 0x4d, 0x1a, 0xb9, 0x8c, 0x30, + 0x63, 0x6f, 0x9e, 0x7d, 0x4e, 0xcf, 0xb5, 0x6c, 0xf3, 0xe4, 0xdc, 0xab, + 0xf9, 0xae, 0x58, 0xf8, 0x1d, 0x08, 0x7b, 0x73, 0x82, 0x58, 0xc8, 0x67, + 0x48, 0x1a, 0x5e, 0x3d, 0xdb, 0xac, 0x1b, 0x1b, 0xef, 0xeb, 0xa4, 0xe5, + 0x67, 0x48, 0x76, 0xd1, 0x96, 0x4f, 0x6c, 0x7d, 0x06, 0x8c, 0x02, 0x86, + 0x95, 0x83, 0xb6, 0x9b, 0x5e, 0x9a, 0xb5, 0x85, 0xc0, 0x4f, 0x13, 0x1c, + 0x32, 0xf8, 0x29, 0xdf, 0x47, 0x85, 0xdb, 0xe4, 0x37, 0xdc, 0xd8, 0x04, + 0x18, 0xdd, 0xca, 0x97, 0xdd, 0x67, 0x13, 0xbe, 0x74, 0x95, 0xdc, 0xd0, + 0xcc, 0xe6, 0xb5, 0xa5, 0x12, 0x9b, 0x23, 0x4f, 0x41, 0x8c, 0xcc, 0x95, + 0xf4, 0xb0, 0x5f, 0x2a, 0xc4, 0xbf, 0x88, 0xda, 0x55, 0xcb, 0x13, 0x93, + 0x22, 0x60, 0x51, 0x43, 0xc7, 0x9a, 0x2c, 0xfa, 0xb2, 0x59, 0xc1, 0xe6, + 0x8a, 0xa4, 0xb8, 0xfb, 0xd3, 0x31, 0x1d, 0xc7, 0x88, 0xdc, 0xbc, 0xe9, + 0xba, 0xe7, 0xdc, 0xe3, 0xdd, 0x90, 0x96, 0xb4, 0xb4, 0x0a, 0xc1, 0x07, + 0x31, 0x3f, 0xdb, 0xc5, 0x4d, 0x73, 0x58, 0x86, 0x15, 0x37, 0x07, 0x86, + 0x03, 0x17, 0x16, 0x18, 0x15, 0xb9, 0x26, 0x35, 0x8a, 0x43, 0x22, 0xae, + 0x21, 0x52, 0x05, 0x4e, 0x5c, 0x3f, 0x3e, 0xb9, 0x2a, 0x19, 0x13, 0xfd, + 0x31, 0x47, 0x6a, 0x74, 0xaa, 0xb9, 0xc6, 0x2c, 0x13, 0x8c, 0x21, 0xc4, + 0x8d, 0x00, 0xf4, 0x24, 0xf2, 0xb7, 0xd3, 0x13, 0xad, 0x29, 0x5e, 0x50, + 0x0b, 0x0e, 0x9f, 0x9a, 0xb7, 0xf6, 0x9e, 0xba, 0x12, 0x23, 0x84, 0x8c, + 0xbe, 0x2c, 0x14, 0x1e, 0xe6, 0x79, 0x15, 0x20, 0x2d, 0x32, 0x08, 0xd8, + 0x1c, 0x87, 0x1b, 0xa8, 0xc0, 0xbb, 0x85, 0xa9, 0x71, 0x30, 0x5e, 0x39, + 0x48, 0x87, 0xdc, 0x3d, 0x03, 0x29, 0x19, 0xd1, 0xd4, 0x21, 0x3a, 0x53, + 0x2d, 0x5e, 0x78, 0xff, 0x94, 0x4b, 0x91, 0xa6, 0xb5, 0xe5, 0x42, 0x56, + 0x67, 0x6a, 0x0e, 0xf3, 0x2d, 0x6a, 0x4e, 0xd7, 0x3a, 0x81, 0xb1, 0x4d, + 0x0b, 0x66, 0x5f, 0x43, 0x28, 0x7c, 0x75, 0x8b, 0x2b, 0x99, 0x24, 0xc2, + 0x5e, 0x8c, 0x22, 0xf0, 0xd5, 0xb3, 0xfc, 0x86, 0x62, 0xf3, 0xd2, 0x6c, + 0xa7, 0x48, 0x04, 0x44, 0x5d, 0x93, 0x74, 0x37, 0x16, 0x2c, 0x19, 0x12, + 0x57, 0x49, 0xef, 0xd5, 0xd6, 0x92, 0xdc, 0x51, 0xf8, 0x55, 0x3a, 0xc0, + 0x0b, 0xdf, 0x41, 0xb5, 0x01, 0x59, 0x7e, 0x85, 0x65, 0xdb, 0x44, 0xbd, + 0x04, 0x96, 0x1a, 0xd4, 0x6e, 0x22, 0x54, 0x92, 0xdb, 0xc7, 0xc5, 0x3a, + 0xdf, 0x0c, 0xf4, 0x1b, 0xdc, 0x14, 0xf6, 0x91, 0x9c, 0xbe, 0xf8, 0x8e, + 0x70, 0xd1, 0x3a, 0x0e, 0x58, 0xe6, 0xb9, 0xd3, 0xaa, 0xa2, 0x70, 0xba, + 0xdd, 0x16, 0x13, 0x19, 0xd1, 0x96, 0x78, 0x04, 0x2f, 0xd7, 0x38, 0x8c, + 0x35, 0x1f, 0xfc, 0x58, 0xa4, 0x4c, 0xa9, 0x9a, 0xae, 0x13, 0x3b, 0xc1, + 0x20, 0x4b, 0x66, 0x0f, 0x72, 0x42, 0x0a, 0x53, 0x84, 0x54, 0x71, 0x06, + 0xdb, 0x85, 0x8f, 0x40, 0xa6, 0x09, 0xf7, 0x24, 0xc4, 0x35, 0xf7, 0x1d, + 0xd4, 0x3d, 0x54, 0x75, 0xaf, 0xc4, 0x78, 0x0f, 0xce, 0xe0, 0x0c, 0x90, + 0x0f, 0xd5, 0x2e, 0x61, 0xf7, 0x58, 0xaa, 0xf0, 0xc7, 0x37, 0x5a, 0x59, + 0x1f, 0x8a, 0x03, 0x98, 0x43, 0xb7, 0x27, 0x78, 0x4e, 0x44, 0x5a, 0xb5, + 0x29, 0xf5, 0xab, 0x9e, 0xb7, 0x2a, 0xc4, 0xa3, 0x03, 0x00, 0xe3, 0x28, + 0x57, 0xc9, 0x2a, 0x98, 0xb8, 0xa1, 0x45, 0x1d, 0xfa, 0x6e, 0xb3, 0x0d, + 0x42, 0x5a, 0xb6, 0xb1, 0x0e, 0x5c, 0xbe, 0x82, 0xe2, 0x36, 0x40, 0x4b, + 0x05, 0x28, 0xd9, 0xbc, 0x27, 0xd6, 0x77, 0x00, 0xc9, 0x29, 0x6a, 0xd6, + 0x19, 0x8f, 0x8d, 0xda, 0xe1, 0xc3, 0x8b, 0x69, 0x71, 0xd0, 0xf7, 0xc8, + 0x33, 0xef, 0xe6, 0x23, 0x6b, 0xcb, 0x00, 0x56, 0x0a, 0x9b, 0x9d, 0x60, + 0x3a, 0xd3, 0xad, 0xd9, 0x5c, 0x6a, 0x7d, 0xab, 0x35, 0x71, 0x93, 0xc5, + 0xf2, 0x6a, 0x38, 0x0e, 0xfb, 0xd9, 0x9b, 0xa5, 0xda, 0x52, 0x45, 0xef, + 0x93, 0x94, 0x5b, 0x08, 0x8c, 0x07, 0xab, 0x2e, 0x99, 0x88, 0x77, 0xb5, + 0x15, 0x66, 0x7f, 0x0e, 0xfa, 0xb0, 0x29, 0xe4, 0x88, 0xd9, 0xdd, 0x22, + 0xaf, 0x7a, 0x4e, 0xb5, 0xd0, 0x62, 0x85, 0x27, 0x33, 0xf1, 0xb7, 0x34, + 0xb1, 0xe6, 0xda, 0x9f, 0x3c, 0xfe, 0xf5, 0xd4, 0xef, 0x56, 0x48, 0x93, + 0x7a, 0x54, 0xa2, 0x7f, 0x07, 0xea, 0x31, 0xb8, 0x8b, 0xca, 0xb9, 0xdb, + 0x1e, 0x2b, 0xb5, 0x16, 0xe6, 0x0e, 0xd9, 0x3f, 0x7c, 0xf0, 0xc2, 0x3e, + 0x57, 0x64, 0x60, 0x97, 0xfb, 0xdf, 0x8c, 0x3e, 0x56, 0x22, 0x92, 0x2a, + 0xb2, 0x21, 0x00, 0x0a, 0x75, 0x89, 0x68, 0xe7, 0x51, 0xa3, 0x63, 0x05, + 0xe1, 0x6f, 0x1e, 0x1e, 0x80, 0xa2, 0x4b, 0x5d, 0xb7, 0xf4, 0xb7, 0x45, + 0x85, 0x00, 0x84, 0x6e, 0xbe, 0x0b, 0x67, 0xbf, 0x21, 0x06, 0x5a, 0x56, + 0x79, 0xe9, 0x6b, 0x0e, 0x72, 0x19, 0x2d, 0x09, 0x78, 0xd5, 0x5e, 0xc2, + 0x32, 0xee, 0x29, 0xd4, 0x7a, 0x65, 0xc7, 0xfe, 0x16, 0x86, 0xd2, 0x29, + 0x71, 0xe5, 0x91, 0x0e, 0x3e, 0x86, 0xd5, 0x00, 0xc4, 0xfc, 0xd9, 0xae, + 0xd3, 0x7c, 0x13, 0xfd, 0x62, 0xce, 0x0c, 0xb2, 0xe5, 0x1f, 0x6d, 0xed, + 0x55, 0x6f, 0xc1, 0xaa, 0xa1, 0x74, 0x59, 0x46, 0x83, 0xd5, 0x5d, 0x71, + 0x17, 0x13, 0x1d, 0x0b, 0x25, 0xfb, 0x0a, 0xcd, 0x67, 0xfe, 0x57, 0x93, + 0xc2, 0x71, 0x55, 0x6c, 0x68, 0xfa, 0x40, 0xdb, 0xdd, 0xce, 0xd5, 0x5c, + 0xce, 0x0a, 0x1d, 0xfa, 0x19, 0x30, 0xe2, 0x2b, 0x63, 0x98, 0x16, 0x2c, + 0x67, 0x69, 0x55, 0xe5, 0xc1, 0x6c, 0x6e, 0xb7, 0x92, 0x6a, 0xbb, 0x10, + 0xd3, 0x13, 0x2e, 0x73, 0x91, 0x74, 0xcb, 0x9f, 0x5c, 0x7f, 0x5c, 0x48, + 0x58, 0x36, 0x13, 0x47, 0xf7, 0x49, 0xae, 0x90, 0x15, 0x53, 0xb5, 0xe6, + 0x37, 0xfb, 0x81, 0x47, 0xb4, 0x69, 0x84, 0xca, 0x95, 0xab, 0x19, 0x2a, + 0x28, 0xc2, 0x8a, 0xf1, 0xcd, 0xf9, 0x3e, 0xd3, 0xaf, 0xe1, 0x75, 0xf7, + 0x94, 0x74, 0x1c, 0xf5, 0x32, 0xcf, 0x70, 0xbd, 0x69, 0xcc, 0xa8, 0x3c, + 0xca, 0x59, 0x53, 0xfa, 0xcb, 0xe7, 0xb6, 0x36, 0x70, 0xea, 0xe2, 0x84, + 0xfa, 0x5e, 0xbd, 0xd7, 0x59, 0x3d, 0x21, 0xc6, 0x9f, 0x5c, 0x1f, 0xa6, + 0xa9, 0xf1, 0xd3, 0x26, 0x9e, 0xff, 0xbc, 0x81, 0xfe, 0xbe, 0xee, 0x64, + 0xd9, 0x63, 0x94, 0x4b, 0x15, 0xd8, 0x95, 0xaa, 0xec, 0x10, 0xc9, 0xe2, + 0xe1, 0x05, 0x37, 0x64, 0xc4, 0xb0, 0x2e, 0xa5, 0x0e, 0x4c, 0x2d, 0x03, + 0x53, 0xf1, 0x93, 0x77, 0x9d, 0x46, 0x14, 0x67, 0x48, 0x5f, 0xad, 0x1b, + 0xdc, 0xb9, 0x74, 0xa2, 0x6c, 0xfc, 0xd2, 0xa0, 0x1f, 0x43, 0x89, 0x15, + 0xc5, 0x0c, 0xb0, 0x9e, 0x1e, 0xc2, 0xd6, 0x44, 0xd9, 0x6e, 0xfc, 0xb4, + 0x9c, 0x95, 0x90, 0xcd, 0xc3, 0x17, 0x1c, 0x6a, 0xce, 0x03, 0x56, 0x9f, + 0xe7, 0xcd, 0x7e, 0xe7, 0xa2, 0x0c, 0x2b, 0x0d, 0x59, 0xb0, 0xc9, 0x4c, + 0x6e, 0x33, 0x6d, 0x43, 0xc4, 0x3a, 0x10, 0x24, 0x03, 0x3e, 0x09, 0xb6, + 0x86, 0x13, 0xba, 0x18, 0x19, 0xd3, 0xff, 0xeb, 0xa5, 0x25, 0x8f, 0x6f, + 0xc8, 0xe6, 0x96, 0xa4, 0xd2, 0x66, 0x40, 0x81, 0x79, 0xe8, 0x39, 0x18, + 0x41, 0x02, 0x66, 0x5c, 0x30, 0x5f, 0x58, 0x9d, 0x35, 0x16, 0xc6, 0x96, + 0xa8, 0x68, 0xbc, 0x09, 0x83, 0x17, 0x2c, 0x5f, 0x5e, 0xd0, 0x1d, 0xb0, + 0x48, 0x5e, 0xcf, 0x91, 0x16, 0x4d, 0xa0, 0xba, 0xbc, 0x61, 0xa8, 0x3f, + 0x30, 0x09, 0xbb, 0xa3, 0x12, 0xcd, 0xdc, 0x29, 0xf7, 0xb0, 0xad, 0x05, + 0x17, 0xd6, 0xd3, 0x16, 0xfb, 0xe5, 0x99, 0xf4, 0x71, 0x62, 0xa3, 0x45, + 0x45, 0xc7, 0x9b, 0xaa, 0x45, 0xd3, 0x35, 0xfe, 0xfb, 0x63, 0xaf, 0xe7, + 0x85, 0x31, 0xc9, 0x66, 0x26, 0xa9, 0xda, 0x8c, 0xc6, 0xf6, 0xd5, 0xdf, + 0xb1, 0xa9, 0xf1, 0xb6, 0x3d, 0x92, 0xae, 0x4d, 0xbc, 0x74, 0x7d, 0x76, + 0x5a, 0x59, 0x8c, 0x87, 0xff, 0x95, 0x2f, 0x67, 0x37, 0x30, 0x1a, 0xc1, + 0x23, 0x2e, 0x0c, 0xaa, 0x80, 0x1c, 0xf3, 0xa3, 0x74, 0x94, 0xb2, 0xda, + 0x1a, 0xb8, 0x46, 0xec, 0x30, 0x76, 0xf4, 0xdf, 0xfb, 0x00, 0xb3, 0x6f, + 0x86, 0xc1, 0xc5, 0x3a, 0x5d, 0x11, 0x14, 0x87, 0xeb, 0x30, 0xd8, 0x33, + 0x18, 0x00, 0x01, 0x76, 0x43, 0x82, 0xcd, 0x1c, 0x36, 0x54, 0xd2, 0x64, + 0x5b, 0xfb, 0x93, 0xca, 0x20, 0x1d, 0xa3, 0x20, 0x99, 0xc3, 0x8e, 0x5c, + 0x82, 0xfc, 0x56, 0x07, 0x41, 0x4b, 0x4f, 0x54, 0xc7, 0xb5, 0xe8, 0x6d, + 0x7e, 0xd8, 0x8a, 0x56, 0xb4, 0x76, 0x1e, 0xd3, 0x82, 0x97, 0xdd, 0x2b, + 0xd9, 0x80, 0xb7, 0xb6, 0xeb, 0x3d, 0xe5, 0xe0, 0x20, 0x27, 0x8c, 0xf0, + 0xd6, 0x14, 0xc7, 0xcd, 0x79, 0xbc, 0xa0, 0x21, 0x85, 0xc3, 0x02, 0xae, + 0x73, 0xc4, 0x0a, 0x39, 0x1a, 0x98, 0x61, 0xc3, 0x86, 0xd8, 0x97, 0x67, + 0x87, 0xe9, 0x56, 0x0b, 0x61, 0xa6, 0x7e, 0x07, 0xfb, 0x0a, 0x8b, 0xd1, + 0x90, 0xbd, 0x39, 0x22, 0xdb, 0xc2, 0x7f, 0xaa, 0x79, 0xb7, 0x39, 0x09, + 0xc1, 0x69, 0xdb, 0xe2, 0x7f, 0xec, 0xde, 0x80, 0x7a, 0x6c, 0xde, 0x76, + 0xa4, 0xe8, 0xe0, 0x8d, 0x71, 0xfa, 0x62, 0xf0, 0x2e, 0x7b, 0xf4, 0xce, + 0x65, 0x18, 0x42, 0xde, 0x92, 0x1b, 0xdc, 0xc9, 0xa7, 0x8d, 0xa5, 0x91, + 0x0f, 0xa5, 0x1b, 0x89, 0xcf, 0x29, 0x10, 0x1d, 0x94, 0x78, 0x1b, 0xea, + 0x79, 0x35, 0x62, 0xd4, 0x29, 0xe6, 0x59, 0x8c, 0xc1, 0xd2, 0xf3, 0x32, + 0x71, 0x09, 0xce, 0x51, 0xd7, 0x14, 0x29, 0x92, 0xbf, 0xdf, 0x9a, 0x69, + 0xda, 0x61, 0x03, 0x0f, 0xa2, 0x0a, 0xab, 0x57, 0x1c, 0xca, 0xab, 0x42, + 0x63, 0x63, 0x1e, 0x35, 0x5d, 0x8d, 0xba, 0x6f, 0x4b, 0x6b, 0x5e, 0x7c, + 0xc0, 0x1e, 0xb7, 0xf4, 0x65, 0xbd, 0x13, 0x1c, 0xf2, 0xa9, 0x73, 0x38, + 0xc3, 0x47, 0xc9, 0x32, 0xf0, 0x30, 0x57, 0x05, 0x42, 0x52, 0xac, 0x72, + 0xee, 0x9f, 0x4e, 0x21, 0xbf, 0x38, 0x19, 0x6d, 0x48, 0xec, 0x97, 0xcb, + 0x70, 0x9e, 0xee, 0xb3, 0xa1, 0xaa, 0xa6, 0x7e, 0xe9, 0x16, 0xdf, 0xcd, + 0x1c, 0x56, 0xcf, 0xf0, 0x9f, 0x4d, 0xd1, 0x8c, 0x14, 0x50, 0x5d, 0x23, + 0x96, 0xe0, 0x1f, 0x61, 0x79, 0xbf, 0x44, 0xfd, 0xa2, 0x31, 0xf7, 0x4c, + 0x0c, 0x8d, 0x8c, 0x1b, 0xbf, 0x8d, 0x45, 0xbf, 0x0b, 0xd8, 0xfb, 0x6f, + 0xff, 0x15, 0xc0, 0x44, 0x7c, 0xb9, 0xb8, 0xf9, 0xef, 0x0d, 0x79, 0x11, + 0x3b, 0x79, 0xd2, 0x52, 0x89, 0x5a, 0xcd, 0x0f, 0x10, 0x92, 0x42, 0xfe, + 0xcf, 0x0a, 0x11, 0x8a, 0x8a, 0xda, 0xee, 0xc8, 0x6b, 0xd9, 0xab, 0xec, + 0xb4, 0x25, 0x6f, 0x8d, 0x68, 0x26, 0xe8, 0xdd, 0xf5, 0xa4, 0xe8, 0x65, + 0x37, 0x03, 0xb0, 0xad, 0x73, 0x3b, 0x4d, 0x74, 0x57, 0x7f, 0x0f, 0x6c, + 0xb0, 0x5d, 0x59, 0x80, 0x13, 0xa1, 0x6c, 0xb0, 0xed, 0x26, 0xec, 0x79, + 0x50, 0x5f, 0x5c, 0xb7, 0xa6, 0xae, 0xe8, 0x0a, 0x6d, 0x55, 0x9a, 0x7f, + 0x59, 0x23, 0xa3, 0x7e, 0x84, 0x7b, 0x3b, 0xfc, 0xde, 0xe1, 0xd9, 0x7c, + 0xd6, 0x87, 0xb3, 0x0e, 0xdb, 0xc1, 0x8c, 0x5e, 0x77, 0xb7, 0x23, 0xd7, + 0x14, 0xd4, 0x23, 0xb4, 0xac, 0x45, 0xbf, 0xfe, 0x40, 0x20, 0x4d, 0x91, + 0x20, 0x94, 0xbd, 0x58, 0xb1, 0x99, 0x69, 0xaf, 0x31, 0x68, 0xbd, 0x61, + 0x5e, 0x87, 0x81, 0x54, 0x4e, 0x2d, 0x03, 0xc2, 0xe2, 0xcd, 0xdc, 0x59, + 0xe5, 0x35, 0xcf, 0xb8, 0xfc, 0x65, 0xed, 0x46, 0xb3, 0x92, 0xe7, 0xf8, + 0x3a, 0x32, 0xaa, 0x0e, 0x5a, 0x82, 0x58, 0x4e, 0x77, 0xd8, 0x33, 0xc9, + 0xb0, 0x3e, 0xad, 0xa5, 0x92, 0xe9, 0xa9, 0x8c, 0x00, 0x72, 0x8f, 0xdc, + 0x77, 0x9d, 0x5c, 0x97, 0xd6, 0x58, 0x20, 0x1e, 0xf4, 0x55, 0x2d, 0xc0, + 0x30, 0xf0, 0x66, 0xda, 0x2d, 0x11, 0xac, 0xd4, 0x2d, 0xd5, 0x25, 0x42, + 0x1d, 0xce, 0x49, 0xb5, 0x95, 0x79, 0x9b, 0x6c, 0x65, 0xe0, 0x8a, 0xc5, + 0x9f, 0x75, 0xe3, 0xe6, 0xf8, 0xa6, 0x88, 0xd6, 0x93, 0x70, 0x4f, 0x89, + 0x94, 0x74, 0xbd, 0xef, 0xc2, 0x1a, 0x55, 0x74, 0x37, 0x44, 0x85, 0x1e, + 0xa9, 0xbb, 0x3f, 0x15, 0xc7, 0x84, 0x80, 0xa5, 0xab, 0xc3, 0x91, 0x8e, + 0xd6, 0x32, 0x46, 0x0d, 0xfa, 0xd1, 0x19, 0xd1, 0xfc, 0x02, 0xe2, 0x20, + 0xa6, 0xa9, 0xf7, 0xf4, 0xcc, 0x5b, 0x54, 0x4f, 0x4a, 0x73, 0x35, 0xda, + 0xf0, 0x31, 0x81, 0x1a, 0x82, 0xe7, 0xd4, 0xc8, 0xb4, 0x1d, 0x70, 0xa9, + 0x5d, 0x67, 0xb9, 0x7d, 0x4b, 0xcd, 0xa4, 0x81, 0xf9, 0xb2, 0x38, 0x07, + 0x16, 0xd5, 0x28, 0x82, 0xb9, 0x76, 0x5b, 0xa1, 0x09, 0x7a, 0xe7, 0x2a, + 0xcf, 0xc0, 0x3d, 0x2a, 0x42, 0x9a, 0xf3, 0xc8, 0x64, 0x15, 0x7c, 0x94, + 0xd0, 0x97, 0xee, 0x34, 0xb6, 0xf0, 0xb2, 0xba, 0x7e, 0xb2, 0xbb, 0x4e, + 0xbf, 0x88, 0xd0, 0x6b, 0xc5, 0x9c, 0xb9, 0xf2, 0x7d, 0xbf, 0x5d, 0x87, + 0xbc, 0x36, 0x4a, 0xd1, 0x1b, 0x6f, 0x40, 0x09, 0xba, 0x26, 0x51, 0xd6, + 0xc0, 0xaf, 0x27, 0xce, 0x27, 0x8d, 0x93, 0xa8, 0x6c, 0x91, 0xe7, 0x91, + 0x42, 0xc0, 0x68, 0x36, 0x5b, 0xd5, 0x56, 0x4c, 0xe2, 0x77, 0xc3, 0xac, + 0x56, 0xe3, 0x1c, 0xc2, 0xf9, 0x78, 0x02, 0x39, 0x7d, 0xed, 0x18, 0x2a, + 0x01, 0x48, 0xe6, 0xf6, 0x7e, 0x34, 0x50, 0xf4, 0x57, 0x56, 0x93, 0xdb, + 0x85, 0x1b, 0x1e, 0x1a, 0x6f, 0x3e, 0x07, 0x3c, 0xad, 0x3f, 0x8d, 0x75, + 0x53, 0xc3, 0x20, 0x72, 0x93, 0x28, 0xd2, 0x86, 0xc8, 0xa5, 0x90, 0xf2, + 0x5f, 0x13, 0xd5, 0xa5, 0xbe, 0x88, 0x9e, 0x9a, 0x57, 0x2c, 0x53, 0x3f, + 0x11, 0x25, 0x00, 0x00, 0x4a, 0x16, 0x8d, 0xd3, 0x3f, 0x2d, 0x3d, 0x88, + 0xbb, 0x4c, 0x4f, 0x9a, 0xb9, 0x97, 0x5f, 0xed, 0x71, 0xa9, 0x68, 0xd9, + 0x4a, 0x14, 0x24, 0xc7, 0xbe, 0xff, 0x85, 0x57, 0xa3, 0x21, 0xe3, 0x21, + 0x79, 0x1f, 0xd0, 0xbb, 0xb7, 0x73, 0xde, 0x60, 0x02, 0x4b, 0x8f, 0x7d, + 0xb3, 0xb3, 0x8a, 0xda, 0x4c, 0xf4, 0xb8, 0xf1, 0x31, 0xff, 0x32, 0x7b, + 0xd8, 0xfa, 0xb1, 0xcb, 0xb4, 0x58, 0xf5, 0xc8, 0x64, 0xdf, 0xfe, 0x3d, + 0x89, 0x52, 0x5c, 0x52, 0x95, 0xf3, 0xba, 0x0d, 0x1d, 0x2c, 0xc4, 0xf7, + 0x3c, 0x3b, 0x6f, 0x8e, 0xc7, 0xab, 0xad, 0x3d, 0x3d, 0x95, 0x9b, 0xc7, + 0x71, 0x36, 0xae, 0x08, 0xc3, 0x08, 0x79, 0xfa, 0x24, 0xee, 0xd9, 0xf9, + 0x63, 0xc7, 0xd9, 0x16, 0x19, 0x8e, 0x0d, 0xaf, 0x52, 0x87, 0x86, 0x7d, + 0xec, 0xe5, 0xea, 0x5a, 0xda, 0x86, 0x9d, 0x0e, 0x50, 0x53, 0x8c, 0x24, + 0xa8, 0x69, 0xc4, 0xf3, 0x85, 0x7b, 0x34, 0x67, 0x19, 0x35, 0xec, 0xd4, + 0xd4, 0x50, 0xe0, 0xe6, 0xe9, 0x29, 0x5b, 0x92, 0xee, 0xba, 0xa9, 0xef, + 0xf6, 0x35, 0x23, 0x8b, 0xdb, 0x48, 0x32, 0x25, 0x41, 0xf3, 0x55, 0x12, + 0x33, 0xc3, 0x6c, 0xed, 0x32, 0xe1, 0x64, 0x7a, 0x8d, 0xa2, 0x19, 0x5a, + 0x26, 0xf2, 0x83, 0xf1, 0xe4, 0x27, 0xdb, 0x67, 0xc3, 0x89, 0x37, 0xea, + 0x78, 0x19, 0xc6, 0xa3, 0x82, 0x84, 0x1c, 0xf3, 0x2b, 0xbe, 0xde, 0xba, + 0xe7, 0x60, 0x2e, 0xf5, 0x4e, 0xb6, 0x73, 0x29, 0xac, 0xc7, 0x55, 0xab, + 0x21, 0xe9, 0x95, 0x78, 0xd5, 0x8e, 0x27, 0xdc, 0x92, 0x5f, 0xc0, 0xcb, + 0xee, 0x66, 0x09, 0x0a, 0xfc, 0x94, 0x43, 0x44, 0x50, 0x35, 0x57, 0xf8, + 0x08, 0xf9, 0x97, 0xa2, 0x0e, 0xde, 0x81, 0xe1, 0xd1, 0xa0, 0x41, 0xfe, + 0xe6, 0x08, 0x6c, 0x98, 0x8c, 0x81, 0x46, 0x0e, 0xf9, 0x9a, 0x54, 0xfe, + 0xc3, 0x91, 0xe3, 0xd4, 0x46, 0xca, 0x52, 0xa2, 0x73, 0x9e, 0x4d, 0xa7, + 0xfd, 0xa1, 0x8e, 0x43, 0x28, 0xf5, 0xa3, 0xa2, 0x62, 0x20, 0x53, 0x62, + 0x05, 0x49, 0xba, 0x06, 0xe2, 0xeb, 0xba, 0xfb, 0x8e, 0xa0, 0x22, 0xc7, + 0xf9, 0xcc, 0x7f, 0x8b, 0xa8, 0x5d, 0x55, 0xd2, 0x24, 0xff, 0xdd, 0x2c, + 0xc1, 0xd0, 0x3d, 0xe4, 0x79, 0xea, 0xba, 0x62, 0xe5, 0xa2, 0x62, 0xf4, + 0x1f, 0xec, 0xb0, 0x07, 0xf2, 0x0d, 0x32, 0x84, 0x86, 0x81, 0x3d, 0x95, + 0xc1, 0x64, 0xfe, 0x9a, 0x3d, 0x8f, 0x4b, 0x6d, 0xfb, 0x0d, 0x42, 0xcf, + 0xbf, 0xdb, 0x51, 0xb2, 0x16, 0xa2, 0x35, 0xaa, 0xe7, 0x31, 0x54, 0xc2, + 0x87, 0xc6, 0xa5, 0x30, 0x71, 0x64, 0x65, 0xff, 0x41, 0x20, 0xb0, 0x83, + 0xdb, 0xb7, 0x95, 0xce, 0xd7, 0xcc, 0x7a, 0x77, 0xad, 0xb8, 0xb7, 0x4c, + 0xfc, 0x11, 0x05, 0x2b, 0xc4, 0xd4, 0xb6, 0x8b, 0xae, 0x13, 0xa5, 0x40, + 0x18, 0x6e, 0x0d, 0xe3, 0xc6, 0xb0, 0x81, 0x46, 0x46, 0x7e, 0x52, 0x0b, + 0x85, 0x4d, 0x98, 0xd9, 0x42, 0xdf, 0xde, 0x45, 0xc1, 0x5a, 0x33, 0x12, + 0x46, 0x26, 0xb3, 0x6f, 0xf2, 0x8b, 0x37, 0x6b, 0xfd, 0x08, 0xf4, 0x46, + 0x86, 0x89, 0x63, 0x63, 0x21, 0xe5, 0xa9, 0xb7, 0xd0, 0x09, 0x17, 0x52, + 0xee, 0xea, 0xdf, 0x97, 0xb7, 0x73, 0x2e, 0x54, 0x2c, 0x7b, 0x70, 0xd3, + 0xda, 0x26, 0x57, 0x1f, 0xb0, 0x19, 0xd9, 0x91, 0x18, 0x69, 0x75, 0x42, + 0x63, 0xcf, 0x6c, 0x8c, 0x98, 0x5e, 0x17, 0x99, 0x7e, 0x1d, 0xdc, 0x67, + 0x6d, 0x99, 0xd9, 0x02, 0x6e, 0x73, 0x90, 0x5a, 0x4f, 0x0a, 0xb4, 0x48, + 0xfb, 0xc5, 0xbd, 0xd2, 0x10, 0x05, 0xa6, 0x12, 0x68, 0x36, 0x28, 0x51, + 0x60, 0x1c, 0xa1, 0xe9, 0x90, 0x54, 0xa5, 0x53, 0xc3, 0x48, 0x9e, 0xd8, + 0x42, 0x52, 0x85, 0x0e, 0xff, 0xfe, 0xbf, 0xad, 0x3a, 0xa4, 0x57, 0x09, + 0x13, 0x38, 0x64, 0x15, 0x7c, 0xfd, 0xed, 0x91, 0x76, 0x44, 0x20, 0x84, + 0xd9, 0x90, 0xab, 0xfe, 0xfd, 0xd6, 0xab, 0xf1, 0xb3, 0x25, 0x21, 0x3d, + 0x97, 0x72, 0xb2, 0x95, 0xc5, 0x22, 0x80, 0xd9, 0x4a, 0x49, 0x9d, 0x99, + 0xc2, 0x4a, 0x9a, 0x59, 0xb3, 0x71, 0x75, 0x5b, 0xf9, 0x89, 0x7a, 0xdd, + 0xa9, 0xb3, 0xc3, 0xeb, 0x42, 0x91, 0xe2, 0x97, 0x30, 0x40, 0x48, 0x68, + 0x19, 0x3b, 0xf5, 0x7b, 0x4e, 0x33, 0x4b, 0x0c, 0xf3, 0xed, 0xda, 0x76, + 0x3f, 0xb0, 0x4b, 0x53, 0x85, 0x04, 0x33, 0x07, 0x53, 0xd8, 0x55, 0xa2, + 0xfb, 0x30, 0x2c, 0x66, 0xbd, 0x21, 0xf8, 0xfa, 0x20, 0x14, 0x9a, 0x0d, + 0x7f, 0xc9, 0x2f, 0x5b, 0x34, 0x29, 0x09, 0x16, 0xb5, 0x0a, 0x8d, 0xdf, + 0xa2, 0x84, 0x9a, 0xae, 0xe6, 0xa0, 0x50, 0x80, 0x31, 0x04, 0xd3, 0x0c, + 0x8f, 0xd1, 0x8a, 0xfd, 0xb4, 0xa5, 0xae, 0xf5, 0x3c, 0x62, 0xae, 0x45, + 0x70, 0xbb, 0x54, 0x62, 0xc8, 0x50, 0x71, 0x42, 0x85, 0xf6, 0x6f, 0xa0, + 0xf0, 0x10, 0x8a, 0x09, 0xbd, 0x71, 0x78, 0xa6, 0x5e, 0xe4, 0x03, 0x8f, + 0x3b, 0xd0, 0x5c, 0x37, 0x55, 0x1a, 0xc8, 0x57, 0x26, 0x62, 0x6c, 0xc4, + 0x67, 0x71, 0x9d, 0x97, 0xc0, 0xea, 0x35, 0x3e, 0x12, 0xd0, 0x2b, 0xc2, + 0x8f, 0x9e, 0xa6, 0x41, 0x48, 0x33, 0x83, 0x38, 0x37, 0x7e, 0xd4, 0xe3, + 0xee, 0x94, 0x8b, 0x81, 0xa4, 0x60, 0xdd, 0xdd, 0xc1, 0x8a, 0x7b, 0xda, + 0xa8, 0x46, 0xb8, 0x42, 0x3a, 0x25, 0xd6, 0x81, 0x89, 0x29, 0x21, 0xc2, + 0x0c, 0x5b, 0xfd, 0x3e, 0x8c, 0x65, 0x91, 0x52, 0xb3, 0x74, 0x1f, 0xd1, + 0x49, 0x7e, 0x1d, 0x59, 0x58, 0x96, 0xb5, 0xee, 0x32, 0xa4, 0xa8, 0x07, + 0x7c, 0xd1, 0x5b, 0x4b, 0xf8, 0x43, 0x5a, 0xa5, 0xcc, 0x60, 0xcc, 0x08, + 0x6a, 0x3c, 0x41, 0x66, 0x99, 0xe3, 0xa8, 0xe0, 0xb8, 0x87, 0xfc, 0x92, + 0xc0, 0x79, 0xc5, 0x3f, 0xd6, 0xc6, 0x8c, 0x01, 0xf4, 0xa5, 0x05, 0xad, + 0x51, 0xed, 0x04, 0xd7, 0x55, 0xc0, 0x73, 0x05, 0x0e, 0x73, 0xe5, 0x39, + 0x45, 0x5b, 0x95, 0x4a, 0x34, 0x07, 0x99, 0xdf, 0x4c, 0x35, 0xf5, 0x0c, + 0x27, 0x6d, 0xd1, 0x45, 0xf1, 0xfd, 0x24, 0xb7, 0xfe, 0xea, 0x11, 0x5d, + 0xa2, 0xc5, 0xa6, 0x81, 0x37, 0x1d, 0xc2, 0x31, 0x31, 0xfc, 0xe0, 0xf4, + 0xd7, 0xe9, 0x98, 0x8b, 0xe3, 0x70, 0x51, 0x62, 0xc8, 0x61, 0x6d, 0xec, + 0x75, 0x56, 0x71, 0xae, 0x88, 0xe0, 0x80, 0xf5, 0xb7, 0x85, 0x10, 0xb7, + 0x3d, 0x16, 0x78, 0x5f, 0x72, 0xab, 0x8f, 0x63, 0xc6, 0xd5, 0xa8, 0xc9, + 0x9c, 0xef, 0x8d, 0x9a, 0xc5, 0x4f, 0x63, 0xad, 0xc0, 0xf3, 0x1f, 0x69, + 0x0e, 0xce, 0x29, 0x92, 0xc1, 0x3b, 0xb0, 0xc5, 0xed, 0x0a, 0x7b, 0x92, + 0xd0, 0x4c, 0x9c, 0x82, 0xb0, 0x51, 0xf6, 0x33, 0x61, 0x3b, 0x76, 0x48, + 0x38, 0xf4, 0x7c, 0xaa, 0x52, 0x87, 0x15, 0x1a, 0xbe, 0xb8, 0xdc, 0x9b, + 0x16, 0xd2, 0x07, 0xf7, 0xf9, 0x74, 0xe0, 0xaf, 0x0e, 0x29, 0x05, 0xec, + 0x6c, 0x0e, 0x3b, 0xa7, 0xe7, 0xa4, 0xfc, 0xa4, 0xef, 0x57, 0x16, 0x7f, + 0x13, 0xbd, 0x8c, 0x42, 0x02, 0x55, 0x70, 0x56, 0xa5, 0xa9, 0x01, 0x29, + 0x12, 0x7d, 0x80, 0x46, 0x18, 0x8e, 0x39, 0x3f, 0x44, 0x55, 0xec, 0xef, + 0x60, 0x58, 0x7d, 0xce, 0x64, 0x8e, 0x9c, 0xea, 0xe4, 0x73, 0xd1, 0x48, + 0x9c, 0x3f, 0x92, 0xa0, 0x9a, 0x76, 0xa5, 0x5a, 0x13, 0x1f, 0x10, 0xb9, + 0xb7, 0xb1, 0xde, 0x49, 0x22, 0x58, 0xf4, 0x43, 0x5f, 0x03, 0x43, 0xc3, + 0x6c, 0xbf, 0x82, 0xaf, 0x88, 0x39, 0xfd, 0xb2, 0x28, 0x9b, 0x47, 0x3f, + 0x83, 0x3d, 0xd9, 0x7c, 0xf0, 0xc9, 0xc5, 0xa2, 0xb4, 0xd6, 0x0d, 0x59, + 0x51, 0x27, 0x60, 0x10, 0x5e, 0xbb, 0x18, 0xa6, 0x42, 0x4a, 0x9d, 0xc4, + 0x16, 0x0e, 0xb6, 0x57, 0x23, 0x03, 0x24, 0x27, 0xdc, 0x20, 0x56, 0x30, + 0x8b, 0x0f, 0xb6, 0xb7, 0x73, 0xf5, 0x36, 0x3e, 0xf6, 0x7a, 0x71, 0xa5, + 0x57, 0xcc, 0x6d, 0xc6, 0xf3, 0xdc, 0x35, 0xfb, 0x95, 0xf7, 0xa7, 0xd7, + 0x56, 0x38, 0xd4, 0x15, 0xe2, 0xd5, 0x6f, 0x70, 0x30, 0xc8, 0x7d, 0x8a, + 0x87, 0xe6, 0xd1, 0xe0, 0x50, 0x62, 0xde, 0xfa, 0x29, 0x40, 0x97, 0xa0, + 0x54, 0x63, 0x31, 0xd3, 0x08, 0x87, 0x0a, 0xdc, 0x6e, 0x5e, 0xab, 0x8d, + 0x16, 0xaf, 0x6e, 0x8b, 0x1a, 0x77, 0xf6, 0xd4, 0xe0, 0xbf, 0x59, 0xab, + 0xc7, 0xb0, 0x45, 0x18, 0xaa, 0xe6, 0x65, 0x6f, 0x7d, 0x13, 0xb2, 0xbf, + 0xb3, 0x66, 0x72, 0xfa, 0xfd, 0xee, 0xad, 0x07, 0x56, 0x51, 0x6a, 0xe2, + 0xff, 0xb2, 0xaf, 0x4d, 0xd1, 0xf2, 0x77, 0x35, 0x5e, 0x90, 0xcd, 0xe7, + 0xa8, 0x32, 0x4d, 0x9f, 0xbd, 0xa8, 0xce, 0xab, 0xf1, 0x49, 0x98, 0xb5, + 0x23, 0x5c, 0x62, 0x2d, 0x43, 0x31, 0x80, 0x87, 0xc2, 0xa8, 0xf5, 0xb9, + 0xb6, 0xae, 0x7f, 0x37, 0x13, 0xb8, 0x6b, 0x73, 0xf3, 0x56, 0x38, 0xa7, + 0x9b, 0x97, 0x69, 0x37, 0x00, 0xdc, 0xff, 0xfe, 0x58, 0xc9, 0x12, 0x47, + 0x75, 0x98, 0x1f, 0xad, 0xd8, 0xb5, 0xc8, 0x47, 0x4f, 0xd0, 0x72, 0x63, + 0x54, 0x25, 0x6c, 0x88, 0xc9, 0x9f, 0x3c, 0x82, 0xe0, 0xdd, 0x4c, 0xff, + 0x8e, 0xaf, 0x8f, 0x8e, 0xea, 0x84, 0x3f, 0x73, 0xdd, 0x9e, 0x18, 0x73, + 0x47, 0x70, 0xc7, 0xc7, 0x99, 0x65, 0xcf, 0xf3, 0xb6, 0x24, 0xed, 0x97, + 0x8f, 0xcd, 0x93, 0x1e, 0xff, 0x6e, 0x9c, 0xf1, 0x30, 0x14, 0x1a, 0x27, + 0x59, 0x6a, 0x0e, 0xf3, 0xe4, 0xfa, 0x1d, 0x65, 0xb5, 0x53, 0xe4, 0xab, + 0xb1, 0x3e, 0xe1, 0x91, 0xf4, 0x6d, 0x99, 0xca, 0x7d, 0x03, 0x08, 0x50, + 0xea, 0xa9, 0x39, 0x7f, 0x6d, 0xe7, 0x43, 0xfb, 0x64, 0xcc, 0x4b, 0x9e, + 0xa0, 0x26, 0xe4, 0x0e, 0xff, 0xb7, 0x11, 0x0a, 0x29, 0x50, 0x90, 0xd7, + 0x4d, 0x62, 0x9a, 0x4a, 0x23, 0xb7, 0xd3, 0x53, 0xde, 0x3a, 0xd1, 0xba, + 0xd3, 0x10, 0x59, 0xc6, 0xc5, 0x5e, 0xac, 0xf9, 0x61, 0x74, 0x54, 0xf4, + 0x27, 0x9f, 0x9a, 0x61, 0x13, 0xdc, 0xe5, 0x96, 0xe3, 0x95, 0x0d, 0xcc, + 0xbd, 0x81, 0x74, 0x79, 0x73, 0xef, 0x2e, 0x0b, 0x0f, 0x91, 0x65, 0x3c, + 0x26, 0x7c, 0x47, 0x10, 0x31, 0x0b, 0xfb, 0x41, 0x0c, 0xc2, 0xa8, 0xc4, + 0x0e, 0xbd, 0x0a, 0x8c, 0xa4, 0x80, 0x45, 0x57, 0x62, 0x0b, 0x4d, 0x44, + 0x5e, 0x59, 0x77, 0xfd, 0x3d, 0xf3, 0xd7, 0x92, 0x49, 0xc1, 0xcb, 0x8a, + 0x54, 0x56, 0x3b, 0xde, 0xcf, 0x16, 0x9a, 0x65, 0xbe, 0xac, 0x64, 0xe1, + 0xd4, 0xd4, 0x1e, 0xac, 0x6b, 0x4a, 0xad, 0xc4, 0x33, 0xac, 0xcb, 0x83, + 0xf4, 0x4d, 0xe8, 0xb6, 0xd7, 0x23, 0xd7, 0x71, 0x25, 0xa2, 0x25, 0x3d, + 0x7e, 0xf0, 0x3b, 0x7f, 0x61, 0x11, 0x56, 0xd4, 0x83, 0xc8, 0xc0, 0x29, + 0x38, 0x10, 0x73, 0xad, 0x6a, 0xb7, 0xb9, 0xd2, 0x2e, 0x9f, 0xae, 0x16, + 0x5e, 0xa6, 0x13, 0x1c, 0xc2, 0x17, 0x73, 0x43, 0x03, 0xdd, 0xa6, 0xaf, + 0x9a, 0x17, 0x31, 0xb8, 0x86, 0x97, 0xc2, 0xd6, 0xe6, 0xed, 0xd4, 0xe1, + 0x7d, 0xb9, 0xa6, 0x96, 0xc1, 0x4b, 0xcb, 0x11, 0x1e, 0xe1, 0xe0, 0xd2, + 0x28, 0x69, 0x68, 0x3b, 0x21, 0x17, 0x63, 0x0c, 0xc0, 0x49, 0x30, 0x22, + 0x3a, 0x59, 0x72, 0xe6, 0x47, 0xb4, 0xdc, 0xa8, 0x29, 0x1c, 0x89, 0xa6, + 0x3a, 0x77, 0x99, 0xea, 0x46, 0xce, 0x38, 0xda, 0x31, 0x88, 0xad, 0xe7, + 0x26, 0xce, 0xc6, 0x56, 0x04, 0x30, 0xfa, 0x01, 0xac, 0xbb, 0xe2, 0xb8, + 0x23, 0xe4, 0x9d, 0x4f, 0x77, 0x02, 0x00, 0x28, 0xf1, 0xe0, 0x19, 0x3f, + 0x22, 0x4f, 0x22, 0x69, 0x87, 0xc0, 0x4e, 0x26, 0x33, 0xfe, 0x6c, 0x70, + 0x56, 0x3b, 0x60, 0x5f, 0xfb, 0xf8, 0x43, 0xcf, 0x3f, 0xb9, 0xcb, 0x80, + 0x22, 0xbb, 0x0a, 0xa8, 0x1c, 0x3e, 0x7e, 0x4d, 0x42, 0x60, 0x5c, 0x8e, + 0xfa, 0x42, 0xb3, 0x95, 0xe7, 0x92, 0x6b, 0xec, 0x7a, 0x95, 0x88, 0x98, + 0xe3, 0xf9, 0x0d, 0xe5, 0x08, 0xf1, 0x26, 0x96, 0x2a, 0x81, 0x2b, 0x7c, + 0x0d, 0x12, 0xa0, 0x7f, 0x7b, 0x39, 0xf6, 0xcc, 0x1b, 0x2d, 0x2c, 0xe9, + 0x5b, 0x02, 0x9b, 0x5c, 0x94, 0x51, 0x13, 0xe8, 0xa0, 0x19, 0xce, 0xde, + 0x07, 0x1b, 0xda, 0x39, 0x14, 0xb5, 0x8b, 0xcf, 0x79, 0x3e, 0x2b, 0xb8, + 0x75, 0xab, 0x81, 0xee, 0x5e, 0x08, 0x33, 0xc3, 0x49, 0x5b, 0x4a, 0x9c, + 0x74, 0x34, 0xde, 0x08, 0x61, 0x03, 0x38, 0xe3, 0xd8, 0xff, 0xc5, 0xc0, + 0xb5, 0x40, 0xd5, 0x26, 0x57, 0x85, 0xf1, 0xb7, 0x77, 0xb6, 0x36, 0xe0, + 0x8d, 0x43, 0x3a, 0xef, 0xfe, 0x0f, 0xf7, 0xee, 0x67, 0x6c, 0x7b, 0xd1, + 0x83, 0xf6, 0x10, 0xda, 0x67, 0x04, 0x3a, 0x27, 0xd8, 0x3a, 0xcb, 0x9d, + 0x4c, 0xa6, 0x9a, 0xc7, 0xea, 0x07, 0xc6, 0x76, 0x79, 0x1b, 0x23, 0x4a, + 0x68, 0x2f, 0x14, 0x84, 0x42, 0x79, 0xe8, 0x1f, 0xf2, 0xe6, 0xac, 0x72, + 0xb0, 0xb0, 0xb6, 0x39, 0x95, 0x40, 0xa4, 0x6e, 0x54, 0x2e, 0xb7, 0xb5, + 0x13, 0x70, 0x48, 0x0d, 0x27, 0xed, 0x2c, 0xa2, 0x64, 0x53, 0xb4, 0x04, + 0x84, 0xab, 0xd8, 0xea, 0x2a, 0x8c, 0xac, 0x5b, 0x1d, 0xb8, 0xb2, 0xbe, + 0x55, 0x2b, 0x4a, 0x47, 0xfc, 0xe0, 0x15, 0x78, 0xb6, 0xd6, 0xff, 0x20, + 0xa8, 0x8a, 0xec, 0x8b, 0x30, 0xef, 0xc5, 0xc6, 0xec, 0xa0, 0xdf, 0xd3, + 0xc4, 0x2b, 0x4a, 0xdf, 0xef, 0x5c, 0x46, 0xb3, 0x31, 0xc7, 0x5f, 0x8f, + 0x1e, 0x99, 0x76, 0x81, 0x71, 0x61, 0xdb, 0xc3, 0xc4, 0x0f, 0x66, 0x7b, + 0xd7, 0x44, 0xc7, 0x8d, 0x12, 0x38, 0x71, 0x7c, 0xd8, 0x41, 0xf6, 0x8a, + 0xb9, 0xba, 0xd2, 0x1f, 0xa1, 0x27, 0x64, 0x67, 0x51, 0xb2, 0xaf, 0xea, + 0x02, 0x95, 0x79, 0x20, 0x0a, 0xc8, 0xaa, 0x03, 0x11, 0xb6, 0x8b, 0x7d, + 0x86, 0xb7, 0xef, 0x5e, 0x3f, 0x0b, 0x91, 0x47, 0xf0, 0x43, 0xb4, 0x54, + 0x1d, 0x16, 0x66, 0xe9, 0x63, 0x1a, 0x55, 0xaf, 0x34, 0xad, 0x11, 0x68, + 0x4d, 0x36, 0xb7, 0x0c, 0x6d, 0x4d, 0xed, 0xba, 0x14, 0xe8, 0xf6, 0xe2, + 0x15, 0x64, 0xb6, 0x15, 0x28, 0xbf, 0xd2, 0x4d, 0xb6, 0x6f, 0xca, 0x5f, + 0x81, 0x1b, 0xf0, 0x31, 0xf5, 0xd3, 0xe0, 0x06, 0xc7, 0xf3, 0x0c, 0x18, + 0x91, 0x45, 0x22, 0xa2, 0x30, 0x48, 0x82, 0xeb, 0x42, 0xfc, 0x8f, 0x2a, + 0xa3, 0x1a, 0x8d, 0x84, 0x28, 0x20, 0x16, 0x95, 0xd9, 0x66, 0x67, 0x2b, + 0xef, 0xc6, 0x6e, 0x56, 0x1c, 0x62, 0x74, 0x16, 0x5c, 0x3e, 0x17, 0xd0, + 0xb7, 0xdd, 0x70, 0xb6, 0x0e, 0x79, 0x46, 0xc5, 0x4e, 0x72, 0x46, 0x69, + 0xf5, 0xa1, 0x1c, 0x7b, 0xd5, 0x67, 0x5c, 0xb3, 0x46, 0x4d, 0x18, 0x31, + 0x47, 0x42, 0x20, 0xe6, 0x12, 0x84, 0x4e, 0x16, 0x0f, 0x4a, 0xd0, 0xc4, + 0x91, 0xa3, 0xbd, 0x91, 0xcd, 0x86, 0x4c, 0xcd, 0x4b, 0x2e, 0x62, 0x84, + 0xea, 0x19, 0x2d, 0x21, 0x1a, 0x64, 0xc4, 0xd2, 0x24, 0x92, 0x96, 0x04, + 0x66, 0xb5, 0x4a, 0xe4, 0xa9, 0xd6, 0xaf, 0x12, 0x9b, 0xb5, 0x59, 0xe0, + 0x5c, 0x84, 0x84, 0x7c, 0x68, 0x99, 0xd8, 0x23, 0xa2, 0x15, 0xa7, 0x82, + 0xa5, 0x66, 0x95, 0x8f, 0xfe, 0x57, 0xc1, 0x12, 0x6c, 0x89, 0xe5, 0x5b, + 0x5d, 0x64, 0xdb, 0x81, 0x4f, 0x77, 0x3c, 0xc8, 0x52, 0x4e, 0x2a, 0xd6, + 0x74, 0x3c, 0x4b, 0x11, 0xfc, 0xc1, 0x7c, 0x01, 0xba, 0x0f, 0x0f, 0x57, + 0x8a, 0xbe, 0x5b, 0x16, 0x88, 0x96, 0xe6, 0xe9, 0x60, 0xcf, 0x66, 0xe9, + 0xe6, 0x07, 0xb0, 0x0b, 0xa3, 0xa0, 0xad, 0xdf, 0x70, 0xd4, 0xcb, 0x2e, + 0x33, 0x2f, 0xe5, 0xf2, 0x1e, 0x0d, 0x74, 0x7a, 0xf9, 0x4a, 0x0f, 0x32, + 0xb4, 0xa1, 0xc9, 0xf5, 0x3f, 0x0a, 0x06, 0xf9, 0x67, 0x45, 0x9c, 0xd9, + 0x58, 0xd4, 0x0e, 0x72, 0x55, 0x47, 0x49, 0x9b, 0xab, 0x9c, 0x66, 0xe7, + 0x4d, 0x9a, 0x02, 0x1b, 0x41, 0xad, 0xe5, 0x8c, 0x7f, 0xa1, 0xdc, 0xad, + 0xcd, 0x74, 0xda, 0x9f, 0xfa, 0x87, 0x32, 0xc1, 0x07, 0x8e, 0x9b, 0xef, + 0x28, 0x2f, 0x17, 0x6d, 0xdb, 0x84, 0x4b, 0xa8, 0x7d, 0x31, 0xa8, 0x32, + 0xe4, 0x9a, 0x1e, 0x0e, 0xef, 0x68, 0xf4, 0xac, 0x03, 0x6c, 0x68, 0xcc, + 0x28, 0xbb, 0xfb, 0x21, 0xb8, 0x11, 0xd7, 0xf9, 0xe8, 0x24, 0x37, 0xdf, + 0xe0, 0xb2, 0xef, 0xd6, 0xec, 0xdf, 0xcf, 0xf5, 0x50, 0x19, 0xa3, 0xa9, + 0x1b, 0x01, 0x2e, 0x94, 0x42, 0xb0, 0x14, 0x5d, 0x0e, 0x37, 0x46, 0x4a, + 0x52, 0x53, 0x60, 0x6b, 0x89, 0xc9, 0xca, 0xed, 0x0a, 0x0c, 0x18, 0x33, + 0x3c, 0x40, 0x42, 0x76, 0x7a, 0x7d, 0xb6, 0x10, 0x29, 0x3e, 0x42, 0x75, + 0xa6, 0xbf, 0xcb, 0xd3, 0xdc, 0xe1, 0x00, 0x05, 0x08, 0x25, 0x67, 0x6c, + 0x72, 0xde, 0x26, 0x72, 0x88, 0xbe, 0xfa, 0x05, 0x57, 0x77, 0x78, 0x83, + 0xce, 0xd5, 0x44, 0x49, 0x8b, 0xab, 0xbc, 0xca, 0xd3, 0x1c, 0x34, 0x4a, + 0xaa, 0xc7, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x17, 0x22, 0x2a, 0x2f, 0x36, 0x3d, 0x43, +}; + +#endif /* MLD_CONFIG_PARAMETER_SET == 87 */ + +#endif /* !EXPECTED_TEST_VECTORS_H */ diff --git a/examples/disabled_apis/main.c b/examples/disabled_apis/main.c new file mode 100644 index 000000000..28247a4ee --- /dev/null +++ b/examples/disabled_apis/main.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) The mlkem-native project authors + * Copyright (c) The mldsa-native project authors + * SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT + */ + +#include +#include +#include + +#include +#include "expected_test_vectors.h" + +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) +#include "test_only_rng/notrandombytes.h" +#endif + +#define CHECK(x) \ + do \ + { \ + int rc; \ + rc = (x); \ + if (!rc) \ + { \ + fprintf(stderr, "ERROR (%s,%d)\n", __FILE__, __LINE__); \ + return 1; \ + } \ + } while (0) + +#define TEST_MSG \ + "This is a test message for ML-DSA digital signature algorithm!" +#define TEST_MSG_LEN (sizeof(TEST_MSG) - 1) + +#define TEST_CTX "test_context_123" +#define TEST_CTX_LEN (sizeof(TEST_CTX) - 1) + +int main(void) +{ +#if !defined(MLD_CONFIG_NO_KEYPAIR_API) + { + uint8_t pk[CRYPTO_PUBLICKEYBYTES]; + uint8_t sk[CRYPTO_SECRETKEYBYTES]; + + randombytes_reset(); + + printf("Generating keypair... "); + CHECK(crypto_sign_keypair(pk, sk) == 0); + printf("DONE\n"); + + printf("Checking keypair against expected values... "); + CHECK(memcmp(pk, expected_pk, CRYPTO_PUBLICKEYBYTES) == 0); + CHECK(memcmp(sk, expected_sk, CRYPTO_SECRETKEYBYTES) == 0); + printf("DONE\n"); + } +#endif /* !MLD_CONFIG_NO_KEYPAIR_API */ + +#if !defined(MLD_CONFIG_NO_SIGN_API) + { + uint8_t sig[CRYPTO_BYTES]; + size_t siglen; + + printf("Signing message... "); + CHECK(crypto_sign_signature(sig, &siglen, (const uint8_t *)TEST_MSG, + TEST_MSG_LEN, (const uint8_t *)TEST_CTX, + TEST_CTX_LEN, expected_sk) == 0); + printf("DONE\n"); + +#if !defined(MLD_CONFIG_NO_VERIFY_API) + printf("Verifying generated signature... "); + CHECK(crypto_sign_verify(sig, siglen, (const uint8_t *)TEST_MSG, + TEST_MSG_LEN, (const uint8_t *)TEST_CTX, + TEST_CTX_LEN, expected_pk) == 0); + printf("DONE\n"); +#endif /* !MLD_CONFIG_NO_VERIFY_API */ + } +#endif /* !MLD_CONFIG_NO_SIGN_API */ + +#if !defined(MLD_CONFIG_NO_VERIFY_API) + { + printf("Verifying expected signature... "); + CHECK(crypto_sign_verify(expected_sig, sizeof(expected_sig), + (const uint8_t *)TEST_MSG, TEST_MSG_LEN, + (const uint8_t *)TEST_CTX, TEST_CTX_LEN, + expected_pk) == 0); + printf("DONE\n"); + } +#endif /* !MLD_CONFIG_NO_VERIFY_API */ + + printf("All tests passed!\n"); + return 0; +} diff --git a/examples/disabled_apis/mldsa_native b/examples/disabled_apis/mldsa_native new file mode 120000 index 000000000..ac02e87eb --- /dev/null +++ b/examples/disabled_apis/mldsa_native @@ -0,0 +1 @@ +../basic/mldsa_native \ No newline at end of file diff --git a/examples/disabled_apis/test_only_rng b/examples/disabled_apis/test_only_rng new file mode 120000 index 000000000..440411ebf --- /dev/null +++ b/examples/disabled_apis/test_only_rng @@ -0,0 +1 @@ +../basic/test_only_rng \ No newline at end of file diff --git a/examples/disabled_apis_native/.gitignore b/examples/disabled_apis_native/.gitignore new file mode 100644 index 000000000..eb98a94f1 --- /dev/null +++ b/examples/disabled_apis_native/.gitignore @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT + +build diff --git a/examples/disabled_apis_native/Makefile b/examples/disabled_apis_native/Makefile new file mode 100644 index 000000000..233af8d53 --- /dev/null +++ b/examples/disabled_apis_native/Makefile @@ -0,0 +1,118 @@ +# Copyright (c) The mlkem-native project authors +# Copyright (c) The mldsa-native project authors +# SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT + +.PHONY: build run clean +.DEFAULT_GOAL := all + +CC ?= gcc + +# Adjust CFLAGS if needed +CFLAGS := \ + -Wall \ + -Wextra \ + -Werror=unused-result \ + -Wpedantic \ + -Werror \ + -Wmissing-prototypes \ + -Wshadow \ + -Wpointer-arith \ + -Wredundant-decls \ + -Wconversion \ + -Wsign-conversion \ + -Wno-long-long \ + -Wno-unknown-pragmas \ + -Wno-unused-command-line-argument \ + -O3 \ + -fomit-frame-pointer \ + -std=c99 \ + -pedantic \ + -MMD \ + $(CFLAGS) + +AUTO ?= 1 +include auto.mk + +# Append cross-prefix for cross compilation +ifeq (,$(findstring $(CROSS_PREFIX),$(CC))) +CC := $(CROSS_PREFIX)$(CC) +endif + +MLD_SOURCE=$(wildcard \ + mldsa_native/src/*.c \ + mldsa_native/src/**/*.c \ + mldsa_native/src/**/**/*.c \ + mldsa_native/src/**/**/**/*.c \ + mldsa_native/src/**/**/**/**/*.c \ + mldsa_native/src/**/**/**/*.S \ + mldsa_native/src/**/**/**/**/*.S) + +INC=-Imldsa_native +RNG_SOURCE=$(wildcard test_only_rng/*.c) +ALL_SOURCE=$(MLD_SOURCE) $(RNG_SOURCE) main.c + +BUILD_DIR=build + +CFLAGS += -DMLD_CONFIG_NAMESPACE_PREFIX=mldsa +CFLAGS += -DMLD_CONFIG_USE_NATIVE_BACKEND_ARITH +CFLAGS += -DMLD_CONFIG_USE_NATIVE_BACKEND_FIPS202 + +# Disabled API flags +KEYGEN_ONLY_FLAGS = -DMLD_CONFIG_NO_SIGN_API -DMLD_CONFIG_NO_VERIFY_API +SIGN_ONLY_FLAGS = -DMLD_CONFIG_NO_KEYPAIR_API -DMLD_CONFIG_NO_VERIFY_API +VERIFY_ONLY_FLAGS = -DMLD_CONFIG_NO_KEYPAIR_API -DMLD_CONFIG_NO_SIGN_API +SIGN_VERIFY_FLAGS = -DMLD_CONFIG_NO_KEYPAIR_API + +# Per-target CFLAGS for each combination +$(BUILD_DIR)/test_keygen_only_44: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44 $(KEYGEN_ONLY_FLAGS) +$(BUILD_DIR)/test_keygen_only_65: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65 $(KEYGEN_ONLY_FLAGS) +$(BUILD_DIR)/test_keygen_only_87: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87 $(KEYGEN_ONLY_FLAGS) +$(BUILD_DIR)/test_sign_only_44: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44 $(SIGN_ONLY_FLAGS) +$(BUILD_DIR)/test_sign_only_65: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65 $(SIGN_ONLY_FLAGS) +$(BUILD_DIR)/test_sign_only_87: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87 $(SIGN_ONLY_FLAGS) +$(BUILD_DIR)/test_verify_only_44: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44 $(VERIFY_ONLY_FLAGS) +$(BUILD_DIR)/test_verify_only_65: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65 $(VERIFY_ONLY_FLAGS) +$(BUILD_DIR)/test_verify_only_87: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87 $(VERIFY_ONLY_FLAGS) +$(BUILD_DIR)/test_sign_verify_44: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44 $(SIGN_VERIFY_FLAGS) +$(BUILD_DIR)/test_sign_verify_65: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65 $(SIGN_VERIFY_FLAGS) +$(BUILD_DIR)/test_sign_verify_87: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87 $(SIGN_VERIFY_FLAGS) + +ALL_BINARIES = \ + $(BUILD_DIR)/test_keygen_only_44 \ + $(BUILD_DIR)/test_keygen_only_65 \ + $(BUILD_DIR)/test_keygen_only_87 \ + $(BUILD_DIR)/test_sign_only_44 \ + $(BUILD_DIR)/test_sign_only_65 \ + $(BUILD_DIR)/test_sign_only_87 \ + $(BUILD_DIR)/test_verify_only_44 \ + $(BUILD_DIR)/test_verify_only_65 \ + $(BUILD_DIR)/test_verify_only_87 \ + $(BUILD_DIR)/test_sign_verify_44 \ + $(BUILD_DIR)/test_sign_verify_65 \ + $(BUILD_DIR)/test_sign_verify_87 + +$(ALL_BINARIES): $(ALL_SOURCE) + echo "$@" + mkdir -p $(BUILD_DIR) + $(CC) $(CFLAGS) $(INC) $^ -o $@ + +all: build + +build: $(ALL_BINARIES) + +run: $(ALL_BINARIES) + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_keygen_only_44 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_keygen_only_65 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_keygen_only_87 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_sign_only_44 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_sign_only_65 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_sign_only_87 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_verify_only_44 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_verify_only_65 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_verify_only_87 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_sign_verify_44 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_sign_verify_65 + $(EXEC_WRAPPER) ./$(BUILD_DIR)/test_sign_verify_87 + +clean: + rm -rf $(BUILD_DIR) diff --git a/examples/disabled_apis_native/README.md b/examples/disabled_apis_native/README.md new file mode 100644 index 000000000..8e97c5a02 --- /dev/null +++ b/examples/disabled_apis_native/README.md @@ -0,0 +1,14 @@ +[//]: # (SPDX-License-Identifier: CC-BY-4.0) + +# Disabled APIs (Native Backends) + +Same as [disabled_apis](../disabled_apis), but with native arithmetic +and FIPS-202 backends enabled (`MLD_CONFIG_USE_NATIVE_BACKEND_ARITH`, +`MLD_CONFIG_USE_NATIVE_BACKEND_FIPS202`). + +## Usage + +```bash +make build # Build all 12 variants +make run # Run all 12 variants +``` diff --git a/examples/disabled_apis_native/auto.mk b/examples/disabled_apis_native/auto.mk new file mode 120000 index 000000000..ce5c161cb --- /dev/null +++ b/examples/disabled_apis_native/auto.mk @@ -0,0 +1 @@ +../../test/mk/auto.mk \ No newline at end of file diff --git a/examples/disabled_apis_native/expected_test_vectors.h b/examples/disabled_apis_native/expected_test_vectors.h new file mode 120000 index 000000000..dadc3e0d1 --- /dev/null +++ b/examples/disabled_apis_native/expected_test_vectors.h @@ -0,0 +1 @@ +../disabled_apis/expected_test_vectors.h \ No newline at end of file diff --git a/examples/disabled_apis_native/main.c b/examples/disabled_apis_native/main.c new file mode 120000 index 000000000..e33fe0713 --- /dev/null +++ b/examples/disabled_apis_native/main.c @@ -0,0 +1 @@ +../disabled_apis/main.c \ No newline at end of file diff --git a/examples/disabled_apis_native/mldsa_native b/examples/disabled_apis_native/mldsa_native new file mode 120000 index 000000000..ac02e87eb --- /dev/null +++ b/examples/disabled_apis_native/mldsa_native @@ -0,0 +1 @@ +../basic/mldsa_native \ No newline at end of file diff --git a/examples/disabled_apis_native/test_only_rng b/examples/disabled_apis_native/test_only_rng new file mode 120000 index 000000000..440411ebf --- /dev/null +++ b/examples/disabled_apis_native/test_only_rng @@ -0,0 +1 @@ +../basic/test_only_rng \ No newline at end of file diff --git a/scripts/tests b/scripts/tests index 56b2c86c3..8e09a643c 100755 --- a/scripts/tests +++ b/scripts/tests @@ -215,6 +215,8 @@ class TEST_TYPES(Enum): ALLOC = 20 BASIC_LOWRAM = 21 RNG_FAIL = 22 + DISABLED_APIS = 23 + DISABLED_APIS_NATIVE = 24 def is_benchmark(self): return self in [TEST_TYPES.BENCH, TEST_TYPES.BENCH_COMPONENTS] @@ -237,6 +239,8 @@ class TEST_TYPES(Enum): TEST_TYPES.MULTILEVEL_BUILD_NATIVE, TEST_TYPES.BASIC_DETERMINISTIC, TEST_TYPES.BASIC_LOWRAM, + TEST_TYPES.DISABLED_APIS, + TEST_TYPES.DISABLED_APIS_NATIVE, ] @staticmethod @@ -276,6 +280,10 @@ class TEST_TYPES(Enum): return "Example (mldsa-native as code package without randombytes() implementation)" if self == TEST_TYPES.BASIC_LOWRAM: return "Example (mldsa-native with reduced RAM usage)" + if self == TEST_TYPES.DISABLED_APIS: + return "Example (disabled APIs)" + if self == TEST_TYPES.DISABLED_APIS_NATIVE: + return "Example (disabled APIs, native)" if self == TEST_TYPES.MONOLITHIC_BUILD: return "Example (monobuild)" if self == TEST_TYPES.MONOLITHIC_BUILD_NATIVE: @@ -322,6 +330,10 @@ class TEST_TYPES(Enum): return "examples/multilevel_build" if self == TEST_TYPES.MULTILEVEL_BUILD_NATIVE: return "examples/multilevel_build_native" + if self == TEST_TYPES.DISABLED_APIS: + return "examples/disabled_apis" + if self == TEST_TYPES.DISABLED_APIS_NATIVE: + return "examples/disabled_apis_native" return "" def make_target(self): @@ -361,6 +373,10 @@ class TEST_TYPES(Enum): return "" if self == TEST_TYPES.MULTILEVEL_BUILD_NATIVE: return "" + if self == TEST_TYPES.DISABLED_APIS: + return "" + if self == TEST_TYPES.DISABLED_APIS_NATIVE: + return "" if self == TEST_TYPES.SIZE: return "size" if self == TEST_TYPES.UNIT: @@ -1230,6 +1246,8 @@ def cli(): "monolithic_build_multilevel_native", "multilevel_build", "multilevel_build_native", + "disabled_apis", + "disabled_apis_native", ], action="append", default=[], @@ -1311,6 +1329,8 @@ def cli(): "monolithic_build_multilevel_native", "multilevel_build", "multilevel_build_native", + "disabled_apis", + "disabled_apis_native", ], action="append", ) From 8c53a946fa9730816927aa85036f718e854981e2 Mon Sep 17 00:00:00 2001 From: "Matthias J. Kannwischer" Date: Sat, 21 Mar 2026 09:53:39 +0800 Subject: [PATCH 11/11] Autogen: Preserve NO_XXX_API config guards in generated table files Signed-off-by: Matthias J. Kannwischer --- dev/aarch64_clean/src/polyz_unpack_table.c | 7 ++++-- dev/aarch64_opt/src/polyz_unpack_table.c | 7 ++++-- .../native/aarch64/src/polyz_unpack_table.c | 7 ++++-- scripts/autogen | 25 ++++++++++++++++--- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/dev/aarch64_clean/src/polyz_unpack_table.c b/dev/aarch64_clean/src/polyz_unpack_table.c index 5a6daa011..3d482285c 100644 --- a/dev/aarch64_clean/src/polyz_unpack_table.c +++ b/dev/aarch64_clean/src/polyz_unpack_table.c @@ -27,7 +27,8 @@ MLD_ALIGN const uint8_t mld_polyz_unpack_17_indices[] = { 2, 3, 4, 255, 4, 5, 6, 255, 6, 7, 8, 255, 8, 9, 10, 255, 11, 12, 13, 255, 13, 14, 15, 255, 15, 16, 17, 255, 17, 18, 19, 255, }; -#endif +#endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ + */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) @@ -37,7 +38,9 @@ MLD_ALIGN const uint8_t mld_polyz_unpack_19_indices[] = { 4, 5, 6, 255, 6, 7, 8, 255, 9, 10, 11, 255, 11, 12, 13, 255, 14, 15, 16, 255, 16, 17, 18, 255, 19, 20, 21, 255, 21, 22, 23, 255, }; -#endif +#endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ + || MLD_CONFIG_PARAMETER_SET == 87 */ + #endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ diff --git a/dev/aarch64_opt/src/polyz_unpack_table.c b/dev/aarch64_opt/src/polyz_unpack_table.c index 5a6daa011..3d482285c 100644 --- a/dev/aarch64_opt/src/polyz_unpack_table.c +++ b/dev/aarch64_opt/src/polyz_unpack_table.c @@ -27,7 +27,8 @@ MLD_ALIGN const uint8_t mld_polyz_unpack_17_indices[] = { 2, 3, 4, 255, 4, 5, 6, 255, 6, 7, 8, 255, 8, 9, 10, 255, 11, 12, 13, 255, 13, 14, 15, 255, 15, 16, 17, 255, 17, 18, 19, 255, }; -#endif +#endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ + */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) @@ -37,7 +38,9 @@ MLD_ALIGN const uint8_t mld_polyz_unpack_19_indices[] = { 4, 5, 6, 255, 6, 7, 8, 255, 9, 10, 11, 255, 11, 12, 13, 255, 14, 15, 16, 255, 16, 17, 18, 255, 19, 20, 21, 255, 21, 22, 23, 255, }; -#endif +#endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ + || MLD_CONFIG_PARAMETER_SET == 87 */ + #endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ diff --git a/mldsa/src/native/aarch64/src/polyz_unpack_table.c b/mldsa/src/native/aarch64/src/polyz_unpack_table.c index 5a6daa011..3d482285c 100644 --- a/mldsa/src/native/aarch64/src/polyz_unpack_table.c +++ b/mldsa/src/native/aarch64/src/polyz_unpack_table.c @@ -27,7 +27,8 @@ MLD_ALIGN const uint8_t mld_polyz_unpack_17_indices[] = { 2, 3, 4, 255, 4, 5, 6, 255, 6, 7, 8, 255, 8, 9, 10, 255, 11, 12, 13, 255, 13, 14, 15, 255, 15, 16, 17, 255, 17, 18, 19, 255, }; -#endif +#endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 44 \ + */ #if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \ (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87) @@ -37,7 +38,9 @@ MLD_ALIGN const uint8_t mld_polyz_unpack_19_indices[] = { 4, 5, 6, 255, 6, 7, 8, 255, 9, 10, 11, 255, 11, 12, 13, 255, 14, 15, 16, 255, 16, 17, 18, 255, 19, 20, 21, 255, 21, 22, 23, 255, }; -#endif +#endif /* MLD_CONFIG_MULTILEVEL_WITH_SHARED || MLD_CONFIG_PARAMETER_SET == 65 \ + || MLD_CONFIG_PARAMETER_SET == 87 */ + #endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */ #else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */ diff --git a/scripts/autogen b/scripts/autogen index bd0e0b83c..194199980 100755 --- a/scripts/autogen +++ b/scripts/autogen @@ -988,7 +988,8 @@ def gen_aarch64_rej_uniform_eta_table(): yield from gen_header() yield '#include "../../../common.h"' yield "" - yield "#if defined(MLD_ARITH_BACKEND_AARCH64) && \\" + yield "#if defined(MLD_ARITH_BACKEND_AARCH64) && \\" + yield " !defined(MLD_CONFIG_NO_KEYPAIR_API) && \\" yield " !defined(MLD_CONFIG_MULTILEVEL_NO_SHARED)" yield "" yield '#include "arith_native_aarch64.h"' @@ -1003,11 +1004,15 @@ def gen_aarch64_rej_uniform_eta_table(): yield ",".join(map(str, idxs)) + f" /* {i} */," yield "};" yield "" - yield "#else" + yield ("#else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \\") + yield " !MLD_CONFIG_MULTILEVEL_NO_SHARED */" yield "" yield "MLD_EMPTY_CU(aarch64_rej_uniform_eta_table)" yield "" - yield "#endif" + yield ( + "#endif /* !(MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_NO_KEYPAIR_API && \\" + ) + yield " !MLD_CONFIG_MULTILEVEL_NO_SHARED) */" yield "" update_file("dev/aarch64_opt/src/rej_uniform_eta_table.c", "\n".join(gen())) @@ -1089,6 +1094,15 @@ def gen_aarch64_polyz_unpack_indices(bit_width): def gen_aarch64_polyz_unpack_table(): + # Map gamma1_bits to parameter set guards + param_set_guards = { + 17: "#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || MLD_CONFIG_PARAMETER_SET == 44", + 19: ( + "#if defined(MLD_CONFIG_MULTILEVEL_WITH_SHARED) || \\\n" + " (MLD_CONFIG_PARAMETER_SET == 65 || MLD_CONFIG_PARAMETER_SET == 87)" + ), + } + def format_row(vals): return ", ".join(f"{v:>3}" for v in vals) + "," @@ -1101,17 +1115,22 @@ def gen_aarch64_polyz_unpack_table(): yield "" yield '#include "arith_native_aarch64.h"' yield "" + yield "#if !defined(MLD_CONFIG_NO_SIGN_API) || !defined(MLD_CONFIG_NO_VERIFY_API)" yield "/* Table of indices used for tbl instructions in polyz_unpack_{17,19}." yield " * See autogen for details. */" yield "" for gamma1_bits in [17, 19]: bit_width = gamma1_bits + 1 indices = list(gen_aarch64_polyz_unpack_indices(bit_width)) + yield param_set_guards[gamma1_bits] yield f"MLD_ALIGN const uint8_t mld_polyz_unpack_{gamma1_bits}_indices[] = {{" for row_start in range(0, len(indices), 16): yield " " + format_row(indices[row_start : row_start + 16]) yield "};" + yield "#endif" yield "" + yield "#endif /* !MLD_CONFIG_NO_SIGN_API || !MLD_CONFIG_NO_VERIFY_API */" + yield "" yield "#else /* MLD_ARITH_BACKEND_AARCH64 && !MLD_CONFIG_MULTILEVEL_NO_SHARED */" yield "" yield "MLD_EMPTY_CU(aarch64_polyz_unpack_table)"