diff --git a/BIBLIOGRAPHY.md b/BIBLIOGRAPHY.md index 91d7a9a23..26618c785 100644 --- a/BIBLIOGRAPHY.md +++ b/BIBLIOGRAPHY.md @@ -344,6 +344,8 @@ source code and documentation. * Referenced from: - [examples/basic/test_only_rng/notrandombytes.c](examples/basic/test_only_rng/notrandombytes.c) - [examples/basic/test_only_rng/notrandombytes.h](examples/basic/test_only_rng/notrandombytes.h) + - [examples/basic_rng_failure/test_only_rng/notrandombytes.c](examples/basic_rng_failure/test_only_rng/notrandombytes.c) + - [examples/basic_rng_failure/test_only_rng/notrandombytes.h](examples/basic_rng_failure/test_only_rng/notrandombytes.h) - [examples/bring_your_own_fips202/test_only_rng/notrandombytes.c](examples/bring_your_own_fips202/test_only_rng/notrandombytes.c) - [examples/bring_your_own_fips202/test_only_rng/notrandombytes.h](examples/bring_your_own_fips202/test_only_rng/notrandombytes.h) - [examples/bring_your_own_fips202_static/test_only_rng/notrandombytes.c](examples/bring_your_own_fips202_static/test_only_rng/notrandombytes.c) diff --git a/examples/basic/test_only_rng/notrandombytes.c b/examples/basic/test_only_rng/notrandombytes.c index c069a6a26..63d74baab 100644 --- a/examples/basic/test_only_rng/notrandombytes.c +++ b/examples/basic/test_only_rng/notrandombytes.c @@ -87,7 +87,7 @@ static void surf(void) } } -void randombytes(uint8_t *buf, size_t n) +int randombytes(uint8_t *buf, size_t n) { while (n > 0) { @@ -110,4 +110,5 @@ void randombytes(uint8_t *buf, size_t n) ++buf; --n; } + return 0; } diff --git a/examples/basic/test_only_rng/notrandombytes.h b/examples/basic/test_only_rng/notrandombytes.h index b2a464372..6cd07572f 100644 --- a/examples/basic/test_only_rng/notrandombytes.h +++ b/examples/basic/test_only_rng/notrandombytes.h @@ -30,6 +30,6 @@ */ void randombytes_reset(void); -void randombytes(uint8_t *buf, size_t n); +int randombytes(uint8_t *buf, size_t n); #endif /* !NOTRANDOMBYTES_H */ diff --git a/examples/basic_deterministic/mldsa_native/custom_no_randomized_config.h b/examples/basic_deterministic/mldsa_native/custom_no_randomized_config.h index 1622a4526..3ef45b194 100644 --- a/examples/basic_deterministic/mldsa_native/custom_no_randomized_config.h +++ b/examples/basic_deterministic/mldsa_native/custom_no_randomized_config.h @@ -343,7 +343,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -354,9 +355,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/examples/basic_rng_failure/Makefile b/examples/basic_rng_failure/Makefile new file mode 100644 index 000000000..e51566645 --- /dev/null +++ b/examples/basic_rng_failure/Makefile @@ -0,0 +1,119 @@ +# 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) + +# If you want to use the native backends, the compiler needs to know about +# the target architecture. Here, we import the default host detection from +# mldsa-native's tests, but you can write your own or specialize accordingly. +AUTO ?= 1 +include auto.mk + +# The following only concerns the cross-compilation tests. +# You can likely ignore the following for your application. +# +# Append cross-prefix for cross compilation +# When called from the root Makefile, CROSS_PREFIX has already been added here +ifeq (,$(findstring $(CROSS_PREFIX),$(CC))) +CC := $(CROSS_PREFIX)$(CC) +endif + +# Part A: +# +# mldsa-native source and header files +# +# If you are not concerned about minimizing for a specific backend, +# you can just include _all_ source files into your build. +# +# In this example, we compile the individual mldsa-native source files directly. +# Alternatively, you can compile the 'monobuild' source file mldsa_native.c. +# See examples/monolithic_build for that. +MLD_SOURCE=$(wildcard \ + mldsa_native/mldsa/src/*.c \ + mldsa_native/mldsa/src/**/*.c \ + mldsa_native/mldsa/src/**/**/*.c \ + mldsa_native/mldsa/src/**/**/**/*.c) + +INC=-Imldsa_native/mldsa/ + +# Part B: +# +# Random number generator +# +# !!! WARNING !!! +# +# The randombytes() implementation used here is for TESTING ONLY. +# You MUST NOT use this implementation outside of testing. +# +# !!! WARNING !!! +RNG_SOURCE=$(wildcard test_only_rng/*.c) + +# Part C: +# +# Your application source code +APP_SOURCE=$(wildcard *.c) + +ALL_SOURCE=$(MLD_SOURCE) $(RNG_SOURCE) $(APP_SOURCE) + +BUILD_DIR=build +BIN=test_binary + +# +# Configuration adjustments +# + +# Pick prefix +CFLAGS += -DMLD_CONFIG_NAMESPACE_PREFIX=mldsa + +BINARY_NAME_FULL_44=$(BUILD_DIR)/$(BIN)44 +BINARY_NAME_FULL_65=$(BUILD_DIR)/$(BIN)65 +BINARY_NAME_FULL_87=$(BUILD_DIR)/$(BIN)87 +BINARIES_FULL=$(BINARY_NAME_FULL_44) $(BINARY_NAME_FULL_65) $(BINARY_NAME_FULL_87) + +$(BINARY_NAME_FULL_44): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44 +$(BINARY_NAME_FULL_65): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65 +$(BINARY_NAME_FULL_87): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87 + +$(BINARIES_FULL): $(ALL_SOURCE) + echo "$@" + mkdir -p $(BUILD_DIR) + $(CC) $(CFLAGS) $(INC) $^ -o $@ + +all: build + +build: $(BINARIES_FULL) + +run: $(BINARIES_FULL) + $(EXEC_WRAPPER) ./$(BINARY_NAME_FULL_44) + $(EXEC_WRAPPER) ./$(BINARY_NAME_FULL_65) + $(EXEC_WRAPPER) ./$(BINARY_NAME_FULL_87) + +clean: + rm -rf $(BUILD_DIR) diff --git a/examples/basic_rng_failure/README.md b/examples/basic_rng_failure/README.md new file mode 100644 index 000000000..213860e64 --- /dev/null +++ b/examples/basic_rng_failure/README.md @@ -0,0 +1,52 @@ +[//]: # (SPDX-License-Identifier: CC-BY-4.0) + +# Building mldsa-native + +This directory contains a minimal example for how to build mldsa-native and +intentionally force failures in the `randombytes` provider so that you can +exercise the library’s error paths. + +## Components + +An application using mldsa-native as-is needs to include the following components: + +1. mldsa-native source tree, including [`mldsa/src/`](../../mldsa/src) and [`mldsa/src/fips202/`](../../mldsa/src/fips202). +2. A secure pseudo random number generator, implementing [`randombytes.h`](../../mldsa/src/randombytes.h). +3. The application source code + +**WARNING:** The `randombytes()` implementation used here is for TESTING ONLY. You MUST NOT use this implementation +outside of testing. In this example it is also designed so tests can force +it to fail after a configurable number of calls. + +## Usage + +Build this example with `make build`, run with `make run`. + +The test binary executes three scenarios for each security level: + +1. Force the first `randombytes` invocation (during key generation) to fail and + check that `crypto_sign_keypair`. +2. Allow key generation, then fail the second `randombytes` invocation (during + signing) and confirm `crypto_sign_signature`. +3. Disable failure injection (negative index) and exercise the full + sign/verify flow, ensuring the expected deterministic signature is produced. + +## What this example demonstrates + +This basic example shows how to use the ML-DSA (Module-Lattice-Based Digital Signature Algorithm) for: + +1. **Key Generation**: Generate a public/private key pair +2. **Signing**: Sign a message with a private key and optional context +3. **Signature Verification**: Verify a signature using the public key +4. **Signed Messages**: Create and open signed messages (signature + message combined) + +The example demonstrates both the detached signature API (`crypto_sign_signature`/`crypto_sign_verify`) and the combined signature API (`crypto_sign`/`crypto_sign_open`). + +## Parameter Sets + +ML-DSA supports three parameter sets: +- **ML-DSA-44** +- **ML-DSA-65** +- **ML-DSA-87** + +The example builds and runs all three parameter sets to demonstrate the different security levels and their corresponding key/signature sizes. diff --git a/examples/basic_rng_failure/auto.mk b/examples/basic_rng_failure/auto.mk new file mode 120000 index 000000000..ce5c161cb --- /dev/null +++ b/examples/basic_rng_failure/auto.mk @@ -0,0 +1 @@ +../../test/mk/auto.mk \ No newline at end of file diff --git a/examples/basic_rng_failure/expected_signatures.h b/examples/basic_rng_failure/expected_signatures.h new file mode 100644 index 000000000..dc714dae4 --- /dev/null +++ b/examples/basic_rng_failure/expected_signatures.h @@ -0,0 +1,890 @@ +/* + * Copyright (c) The mldsa-native project authors + * SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT + */ + +#ifndef EXPECTED_SIGNATURES_H +#define EXPECTED_SIGNATURES_H + +#include + +/* Expected deterministic signatures for each parameter set + * These are generated using the same test message, context, and deterministic + * RNG as used in the basic example. + * + * The PCT modifies the PRNG state, so the KAT tests don't work. + * We run KAT tests only for disabled PCT. */ +#if !defined(MLD_CONFIG_KEYGEN_PCT) +#if MLD_CONFIG_API_PARAMETER_SET == 44 +const uint8_t expected_signature[] = { + 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_API_PARAMETER_SET == 65 +const uint8_t expected_signature[] = { + 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_API_PARAMETER_SET == 87 +const uint8_t expected_signature[] = { + 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_API_PARAMETER_SET == 87 */ +#endif /* !MLD_CONFIG_KEYGEN_PCT */ +#endif /* !EXPECTED_SIGNATURES_H */ diff --git a/examples/basic_rng_failure/main.c b/examples/basic_rng_failure/main.c new file mode 100644 index 000000000..c7dedfe05 --- /dev/null +++ b/examples/basic_rng_failure/main.c @@ -0,0 +1,185 @@ +/* + * Copyright (c) The mldsa-native project authors + * SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT + */ + +#include +#include +#include +#include + +/* Import public mldsa-native API + * + * This requires specifying the parameter set and namespace prefix + * used for the build. + */ +#define MLD_CONFIG_API_PARAMETER_SET MLD_CONFIG_PARAMETER_SET +#define MLD_CONFIG_API_NAMESPACE_PREFIX mldsa +#include +#include "expected_signatures.h" +#include "test_only_rng/notrandombytes.h" + +int test_failures(int fail_at_call); + +#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) +{ + test_failures(0); // Fails first call + test_failures(1); // Fails second call + test_failures(-101); // No failure + return 0; +} + +int test_failures(int fail_at_call) +{ + const char test_msg[] = TEST_MSG; + const char test_ctx[] = TEST_CTX; + + uint8_t pk[CRYPTO_PUBLICKEYBYTES]; + uint8_t sk[CRYPTO_SECRETKEYBYTES]; + uint8_t sig[CRYPTO_BYTES]; + uint8_t sm[TEST_MSG_LEN + CRYPTO_BYTES]; /* signed message buffer */ + uint8_t m2[TEST_MSG_LEN + CRYPTO_BYTES]; /* recovered message buffer */ + size_t siglen; + size_t smlen; + size_t mlen; + + /* WARNING: Test-only + * Normally, you would want to seed a PRNG with trustworthy entropy here. */ + randombytes_reset(); + + printf("ML-DSA-%d Basic Example\n", MLD_CONFIG_PARAMETER_SET); + printf("======================\n\n"); + + printf("Message: %s\n", test_msg); + printf("Context: %s\n\n", test_ctx); + + + int call_idx = 0; + int expected; + + printf("Generating keypair ... "); + randombytes_force_failure(fail_at_call); + expected = (call_idx == fail_at_call) ? -1 : 0; + if (expected == -1) + { + CHECK(crypto_sign_keypair(pk, sk) == -1); + printf("FAILED as expected\n\n"); + return 0; + } + CHECK(crypto_sign_keypair(pk, sk) == 0); + call_idx++; + printf("DONE\n"); + + printf("Signing message... "); + expected = (call_idx == fail_at_call) ? -1 : 0; + if (expected == -1) + { + CHECK(crypto_sign_signature(sig, &siglen, (const uint8_t *)test_msg, + TEST_MSG_LEN, (const uint8_t *)test_ctx, + TEST_CTX_LEN, sk) == -1); + printf("FAILED as expected\n\n"); + return 0; + } + CHECK(crypto_sign_signature(sig, &siglen, (const uint8_t *)test_msg, + TEST_MSG_LEN, (const uint8_t *)test_ctx, + TEST_CTX_LEN, sk) == 0); + call_idx++; + printf("DONE\n"); + + printf("Verifying signature... "); + expected = (call_idx == fail_at_call) ? -1 : 0; + if (expected == -1) + { + CHECK(crypto_sign_verify(sig, siglen, (const uint8_t *)test_msg, + TEST_MSG_LEN, (const uint8_t *)test_ctx, + TEST_CTX_LEN, pk) == -1); + printf("FAILED as expected\n\n"); + return 0; + } + CHECK(crypto_sign_verify(sig, siglen, (const uint8_t *)test_msg, TEST_MSG_LEN, + (const uint8_t *)test_ctx, TEST_CTX_LEN, pk) == 0); + call_idx++; + printf("DONE\n"); + + printf("Creating signed message... "); + expected = (call_idx == fail_at_call) ? -1 : 0; + if (expected == -1) + { + CHECK(crypto_sign(sm, &smlen, (const uint8_t *)test_msg, TEST_MSG_LEN, + (const uint8_t *)test_ctx, TEST_CTX_LEN, sk) == -1); + printf("FAILED as expected\n\n"); + return 0; + } + CHECK(crypto_sign(sm, &smlen, (const uint8_t *)test_msg, TEST_MSG_LEN, + (const uint8_t *)test_ctx, TEST_CTX_LEN, sk) == 0); + call_idx++; + printf("DONE\n"); + + printf("Opening signed message... "); + expected = (call_idx == fail_at_call) ? -1 : 0; + if (expected == -1) + { + CHECK(crypto_sign_open(m2, &mlen, sm, smlen, (const uint8_t *)test_ctx, + TEST_CTX_LEN, pk) == -1); + printf("FAILED as expected\n\n"); + return 0; + } + CHECK(crypto_sign_open(m2, &mlen, sm, smlen, (const uint8_t *)test_ctx, + TEST_CTX_LEN, pk) == 0); + call_idx++; + printf("DONE\n"); + + printf("Compare messages... "); + CHECK(mlen == TEST_MSG_LEN); + CHECK(memcmp(test_msg, m2, TEST_MSG_LEN) == 0); + printf("DONE\n\n"); + + printf("Results:\n"); + printf("--------\n"); + printf("Public key size: %d bytes\n", CRYPTO_PUBLICKEYBYTES); + printf("Secret key size: %d bytes\n", CRYPTO_SECRETKEYBYTES); + printf("Signature size: %d bytes\n", CRYPTO_BYTES); + printf("Message length: %lu bytes\n", (unsigned long)TEST_MSG_LEN); + printf("Signature length: %lu bytes\n", (unsigned long)siglen); + printf("Signed msg length: %lu bytes\n", (unsigned long)smlen); + +#if !defined(MLD_CONFIG_KEYGEN_PCT) + /* Check against expected signature to make sure that + * we integrated the library correctly */ + printf("Checking deterministic signature... "); + { + /* Compare the generated signature directly against the expected signature + */ + CHECK(siglen == sizeof(expected_signature)); + CHECK(memcmp(sig, expected_signature, siglen) == 0); + } + printf("DONE\n"); +#else /* !MLD_CONFIG_KEYGEN_PCT */ + printf( + "[WARNING] Skipping KAT test since PCT is enabled and modifies PRNG\n"); +#endif /* MLD_CONFIG_KEYGEN_PCT */ + + printf("Signature verification completed successfully!\n"); + + printf("\nAll tests passed! ML-DSA signature verification successful.\n"); + return 0; +} diff --git a/examples/basic_rng_failure/mldsa_native/mldsa b/examples/basic_rng_failure/mldsa_native/mldsa new file mode 120000 index 000000000..10da1bec2 --- /dev/null +++ b/examples/basic_rng_failure/mldsa_native/mldsa @@ -0,0 +1 @@ +../../../mldsa \ No newline at end of file diff --git a/examples/basic_rng_failure/test_only_rng/notrandombytes.c b/examples/basic_rng_failure/test_only_rng/notrandombytes.c new file mode 100644 index 000000000..1724cf403 --- /dev/null +++ b/examples/basic_rng_failure/test_only_rng/notrandombytes.c @@ -0,0 +1,139 @@ +/* + * Copyright (c) The mlkem-native project authors + * Copyright (c) The mldsa-native project authors + * SPDX-License-Identifier: LicenseRef-PD-hp OR CC0-1.0 OR 0BSD OR MIT-0 OR MIT + */ + +/* References + * ========== + * + * - [surf] + * SURF: Simple Unpredictable Random Function + * Daniel J. Bernstein + * https://cr.yp.to/papers.html#surf + */ + +/* Based on @[surf]. */ + +/** + * WARNING + * + * The randombytes() implementation in this file is for TESTING ONLY. + * You MUST NOT use this implementation outside of testing. + * + */ + +#include +#include +#include + +#include "notrandombytes.h" + +static uint32_t seed[32] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, + 2, 3, 8, 4, 6, 2, 6, 4, 3, 3, 8, 3, 2, 7, 9, 5}; +static uint32_t in[12]; +static uint32_t out[8]; +static int32_t outleft = 0; +static int fail_after = -1; +static size_t call_index = 0; + +void randombytes_reset(void) +{ + memset(in, 0, sizeof(in)); + memset(out, 0, sizeof(out)); + outleft = 0; + call_index = 0; + fail_after = -1; +} + +void randombytes_force_failure(int call_idx) +{ + call_index = 0; + if (call_idx < 0) + { + fail_after = -1; + } + else + { + fail_after = call_idx; + } +} + +#define ROTATE(x, b) (((x) << (b)) | ((x) >> (32 - (b)))) +#define MUSH(i, b) x = t[i] += (((x ^ seed[i]) + sum) ^ ROTATE(x, b)); + +static void surf(void) +{ + uint32_t t[12]; + uint32_t x; + uint32_t sum = 0; + int32_t r; + int32_t i; + int32_t loop; + + for (i = 0; i < 12; ++i) + { + t[i] = in[i] ^ seed[12 + i]; + } + for (i = 0; i < 8; ++i) + { + out[i] = seed[24 + i]; + } + x = t[11]; + for (loop = 0; loop < 2; ++loop) + { + for (r = 0; r < 16; ++r) + { + sum += 0x9e3779b9; + MUSH(0, 5) + MUSH(1, 7) + MUSH(2, 9) + MUSH(3, 13) + MUSH(4, 5) + MUSH(5, 7) + MUSH(6, 9) + MUSH(7, 13) + MUSH(8, 5) + MUSH(9, 7) + MUSH(10, 9) + MUSH(11, 13) + } + for (i = 0; i < 8; ++i) + { + out[i] ^= t[i + 4]; + } + } +} + +int randombytes(uint8_t *buf, size_t n) +{ + if (fail_after >= 0 && call_index == (size_t)fail_after) + { + fail_after = -1; + call_index++; + return -1; + } + call_index++; + while (n > 0) + { + if (!outleft) + { + if (!++in[0]) + { + if (!++in[1]) + { + if (!++in[2]) + { + ++in[3]; + } + } + } + surf(); + outleft = 8; + } + *buf = (uint8_t)out[--outleft]; + ++buf; + --n; + } + return 0; +} diff --git a/examples/basic_rng_failure/test_only_rng/notrandombytes.h b/examples/basic_rng_failure/test_only_rng/notrandombytes.h new file mode 100644 index 000000000..813c5dad6 --- /dev/null +++ b/examples/basic_rng_failure/test_only_rng/notrandombytes.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) The mlkem-native project authors + * Copyright (c) The mldsa-native project authors + * SPDX-License-Identifier: LicenseRef-PD-hp OR CC0-1.0 OR 0BSD OR MIT-0 OR MI + */ + +/* References + * ========== + * + * - [surf] + * SURF: Simple Unpredictable Random Function + * Daniel J. Bernstein + * https://cr.yp.to/papers.html#surf + */ + +/* Based on @[surf]. */ + +#ifndef NOTRANDOMBYTES_H +#define NOTRANDOMBYTES_H + +#include +#include + +/** + * WARNING + * + * The randombytes() implementation in this file is for TESTING ONLY. + * You MUST NOT use this implementation outside of testing. + * + */ + +void randombytes_reset(void); +void randombytes_force_failure(int call_idx); +int randombytes(uint8_t *buf, size_t n); + +#endif /* !NOTRANDOMBYTES_H */ diff --git a/examples/bring_your_own_fips202/test_only_rng/notrandombytes.c b/examples/bring_your_own_fips202/test_only_rng/notrandombytes.c index c069a6a26..63d74baab 100644 --- a/examples/bring_your_own_fips202/test_only_rng/notrandombytes.c +++ b/examples/bring_your_own_fips202/test_only_rng/notrandombytes.c @@ -87,7 +87,7 @@ static void surf(void) } } -void randombytes(uint8_t *buf, size_t n) +int randombytes(uint8_t *buf, size_t n) { while (n > 0) { @@ -110,4 +110,5 @@ void randombytes(uint8_t *buf, size_t n) ++buf; --n; } + return 0; } diff --git a/examples/bring_your_own_fips202/test_only_rng/notrandombytes.h b/examples/bring_your_own_fips202/test_only_rng/notrandombytes.h index b2a464372..6cd07572f 100644 --- a/examples/bring_your_own_fips202/test_only_rng/notrandombytes.h +++ b/examples/bring_your_own_fips202/test_only_rng/notrandombytes.h @@ -30,6 +30,6 @@ */ void randombytes_reset(void); -void randombytes(uint8_t *buf, size_t n); +int randombytes(uint8_t *buf, size_t n); #endif /* !NOTRANDOMBYTES_H */ diff --git a/examples/bring_your_own_fips202_static/test_only_rng/notrandombytes.c b/examples/bring_your_own_fips202_static/test_only_rng/notrandombytes.c index c069a6a26..63d74baab 100644 --- a/examples/bring_your_own_fips202_static/test_only_rng/notrandombytes.c +++ b/examples/bring_your_own_fips202_static/test_only_rng/notrandombytes.c @@ -87,7 +87,7 @@ static void surf(void) } } -void randombytes(uint8_t *buf, size_t n) +int randombytes(uint8_t *buf, size_t n) { while (n > 0) { @@ -110,4 +110,5 @@ void randombytes(uint8_t *buf, size_t n) ++buf; --n; } + return 0; } diff --git a/examples/bring_your_own_fips202_static/test_only_rng/notrandombytes.h b/examples/bring_your_own_fips202_static/test_only_rng/notrandombytes.h index b2a464372..6cd07572f 100644 --- a/examples/bring_your_own_fips202_static/test_only_rng/notrandombytes.h +++ b/examples/bring_your_own_fips202_static/test_only_rng/notrandombytes.h @@ -30,6 +30,6 @@ */ void randombytes_reset(void); -void randombytes(uint8_t *buf, size_t n); +int randombytes(uint8_t *buf, size_t n); #endif /* !NOTRANDOMBYTES_H */ diff --git a/examples/monolithic_build/config_44.h b/examples/monolithic_build/config_44.h index f07b330a6..2af3f043e 100644 --- a/examples/monolithic_build/config_44.h +++ b/examples/monolithic_build/config_44.h @@ -341,7 +341,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -352,9 +353,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/examples/monolithic_build/config_65.h b/examples/monolithic_build/config_65.h index e22a74509..f0a0a608a 100644 --- a/examples/monolithic_build/config_65.h +++ b/examples/monolithic_build/config_65.h @@ -341,7 +341,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -352,9 +353,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/examples/monolithic_build/config_87.h b/examples/monolithic_build/config_87.h index 2fa64c3c5..638ab435a 100644 --- a/examples/monolithic_build/config_87.h +++ b/examples/monolithic_build/config_87.h @@ -341,7 +341,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -352,9 +353,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/examples/monolithic_build_multilevel/multilevel_config.h b/examples/monolithic_build_multilevel/multilevel_config.h index 3d1f94fea..d67d2755c 100644 --- a/examples/monolithic_build_multilevel/multilevel_config.h +++ b/examples/monolithic_build_multilevel/multilevel_config.h @@ -342,7 +342,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -353,9 +354,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/examples/monolithic_build_multilevel_native/multilevel_config.h b/examples/monolithic_build_multilevel_native/multilevel_config.h index 037f026d8..6af036630 100644 --- a/examples/monolithic_build_multilevel_native/multilevel_config.h +++ b/examples/monolithic_build_multilevel_native/multilevel_config.h @@ -342,7 +342,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -360,9 +361,9 @@ #include #include "sys.h" #include "test_only_rng/notrandombytes.h" -static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) +static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { - randombytes(ptr, len); + return randombytes(ptr, len); } #endif /* !__ASSEMBLER__ */ diff --git a/examples/monolithic_build_native/config_44.h b/examples/monolithic_build_native/config_44.h index a5f933a56..7c51b9d60 100644 --- a/examples/monolithic_build_native/config_44.h +++ b/examples/monolithic_build_native/config_44.h @@ -339,7 +339,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -350,9 +351,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/examples/monolithic_build_native/config_65.h b/examples/monolithic_build_native/config_65.h index af93757a2..f8a416bdb 100644 --- a/examples/monolithic_build_native/config_65.h +++ b/examples/monolithic_build_native/config_65.h @@ -339,7 +339,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -350,9 +351,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/examples/monolithic_build_native/config_87.h b/examples/monolithic_build_native/config_87.h index b588c5899..268e25d43 100644 --- a/examples/monolithic_build_native/config_87.h +++ b/examples/monolithic_build_native/config_87.h @@ -339,7 +339,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -350,9 +351,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/integration/liboqs/config_aarch64.h b/integration/liboqs/config_aarch64.h index 4092bd0ab..101846da9 100644 --- a/integration/liboqs/config_aarch64.h +++ b/integration/liboqs/config_aarch64.h @@ -162,7 +162,7 @@ * consumer. * * If this option is not set, mlkem-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). * * Set this option and define `mlk_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -174,9 +174,10 @@ #include #include #include "../../mldsa/src/sys.h" -static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) +static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { OQS_randombytes(ptr, len); + return 0; } #endif /* !__ASSEMBLER__ */ diff --git a/integration/liboqs/config_c.h b/integration/liboqs/config_c.h index e68375c0a..eff850f4a 100644 --- a/integration/liboqs/config_c.h +++ b/integration/liboqs/config_c.h @@ -166,7 +166,7 @@ * consumer. * * If this option is not set, mlkem-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). * * Set this option and define `mlk_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -178,9 +178,10 @@ #include #include #include "../../mldsa/src/sys.h" -static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) +static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { OQS_randombytes(ptr, len); + return 0; } #endif /* !__ASSEMBLER__ */ diff --git a/integration/liboqs/config_x86_64.h b/integration/liboqs/config_x86_64.h index 40b3f2f5f..14737d449 100644 --- a/integration/liboqs/config_x86_64.h +++ b/integration/liboqs/config_x86_64.h @@ -164,7 +164,7 @@ * consumer. * * If this option is not set, mlkem-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). * * Set this option and define `mlk_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -176,9 +176,10 @@ #include #include #include "../../mldsa/src/sys.h" -static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) +static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { OQS_randombytes(ptr, len); + return 0; } #endif /* !__ASSEMBLER__ */ diff --git a/mldsa/src/config.h b/mldsa/src/config.h index 9e48023db..382abf035 100644 --- a/mldsa/src/config.h +++ b/mldsa/src/config.h @@ -327,7 +327,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -338,9 +339,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/mldsa/src/randombytes.h b/mldsa/src/randombytes.h index 801bcbaa9..889c15bff 100644 --- a/mldsa/src/randombytes.h +++ b/mldsa/src/randombytes.h @@ -13,12 +13,12 @@ #if !defined(MLD_CONFIG_NO_RANDOMIZED_API) #if !defined(MLD_CONFIG_CUSTOM_RANDOMBYTES) -void randombytes(uint8_t *out, size_t outlen); -static MLD_INLINE void mld_randombytes(uint8_t *out, size_t outlen) +int randombytes(uint8_t *out, size_t outlen); +static MLD_INLINE int mld_randombytes(uint8_t *out, size_t outlen) __contract__( requires(memory_no_alias(out, outlen)) assigns(memory_slice(out, outlen)) -) { randombytes(out, outlen); } +) { return randombytes(out, outlen); } #endif /* !MLD_CONFIG_CUSTOM_RANDOMBYTES */ #endif /* !MLD_CONFIG_NO_RANDOMIZED_API */ #endif /* !MLD_RANDOMBYTES_H */ diff --git a/mldsa/src/sign.c b/mldsa/src/sign.c index 86e318fb6..577c25d49 100644 --- a/mldsa/src/sign.c +++ b/mldsa/src/sign.c @@ -321,7 +321,10 @@ int crypto_sign_keypair(uint8_t pk[CRYPTO_PUBLICKEYBYTES], { MLD_ALIGN uint8_t seed[MLDSA_SEEDBYTES]; int result; - mld_randombytes(seed, MLDSA_SEEDBYTES); + if (mld_randombytes(seed, MLDSA_SEEDBYTES) != 0) + { + return -1; + } MLD_CT_TESTING_SECRET(seed, sizeof(seed)); result = crypto_sign_keypair_internal(pk, sk, seed); @@ -709,7 +712,11 @@ int crypto_sign_signature(uint8_t sig[CRYPTO_BYTES], size_t *siglen, /* Randomized variant of ML-DSA. If you need the deterministic variant, * call crypto_sign_signature_internal directly with all-zero rnd. */ - mld_randombytes(rnd, MLDSA_RNDBYTES); + if (mld_randombytes(rnd, MLDSA_RNDBYTES) != 0) + { + *siglen = 0; + return -1; + } MLD_CT_TESTING_SECRET(rnd, sizeof(rnd)); result = crypto_sign_signature_internal(sig, siglen, m, mlen, pre, pre_len, @@ -736,7 +743,11 @@ int crypto_sign_signature_extmu(uint8_t sig[CRYPTO_BYTES], size_t *siglen, /* Randomized variant of ML-DSA. If you need the deterministic variant, * call crypto_sign_signature_internal directly with all-zero rnd. */ - mld_randombytes(rnd, MLDSA_RNDBYTES); + if (mld_randombytes(rnd, MLDSA_RNDBYTES) != 0) + { + *siglen = 0; + return -1; + } MLD_CT_TESTING_SECRET(rnd, sizeof(rnd)); result = crypto_sign_signature_internal(sig, siglen, mu, MLDSA_CRHBYTES, NULL, diff --git a/test/bench_components_mldsa.c b/test/bench_components_mldsa.c index b6dc9e8e7..17fdc25c7 100644 --- a/test/bench_components_mldsa.c +++ b/test/bench_components_mldsa.c @@ -18,32 +18,44 @@ #define NITERATIONS 300 #define NTESTS 20 +#define CHECK(x) \ + do \ + { \ + int rc; \ + rc = (x); \ + if (!rc) \ + { \ + fprintf(stderr, "ERROR (%s,%d)\n", __FILE__, __LINE__); \ + return 1; \ + } \ + } while (0) + static int cmp_uint64_t(const void *a, const void *b) { return (int)((*((const uint64_t *)a)) - (*((const uint64_t *)b))); } -#define BENCH(txt, code) \ - for (i = 0; i < NTESTS; i++) \ - { \ - mld_randombytes((uint8_t *)data0, sizeof(data0)); \ - mld_randombytes((uint8_t *)&polyvecl_a, sizeof(polyvecl_a)); \ - mld_randombytes((uint8_t *)&polyvecl_b, sizeof(polyvecl_b)); \ - mld_randombytes((uint8_t *)&polymat, sizeof(polymat)); \ - for (j = 0; j < NWARMUP; j++) \ - { \ - code; \ - } \ - \ - t0 = get_cyclecounter(); \ - for (j = 0; j < NITERATIONS; j++) \ - { \ - code; \ - } \ - t1 = get_cyclecounter(); \ - (cyc)[i] = t1 - t0; \ - } \ - qsort((cyc), NTESTS, sizeof(uint64_t), cmp_uint64_t); \ +#define BENCH(txt, code) \ + for (i = 0; i < NTESTS; i++) \ + { \ + CHECK(mld_randombytes((uint8_t *)data0, sizeof(data0)) == 0); \ + CHECK(mld_randombytes((uint8_t *)&polyvecl_a, sizeof(polyvecl_a)) == 0); \ + CHECK(mld_randombytes((uint8_t *)&polyvecl_b, sizeof(polyvecl_b)) == 0); \ + CHECK(mld_randombytes((uint8_t *)&polymat, sizeof(polymat)) == 0); \ + for (j = 0; j < NWARMUP; j++) \ + { \ + code; \ + } \ + \ + t0 = get_cyclecounter(); \ + for (j = 0; j < NITERATIONS; j++) \ + { \ + code; \ + } \ + t1 = get_cyclecounter(); \ + (cyc)[i] = t1 - t0; \ + } \ + qsort((cyc), NTESTS, sizeof(uint64_t), cmp_uint64_t); \ printf(txt " cycles=%" PRIu64 "\n", (cyc)[NTESTS >> 1] / NITERATIONS); static int bench(void) diff --git a/test/bench_mldsa.c b/test/bench_mldsa.c index e97e343ba..31cdb16c6 100644 --- a/test/bench_mldsa.c +++ b/test/bench_mldsa.c @@ -91,8 +91,8 @@ static int bench(void) for (i = 0; i < NTESTS; i++) { int ret = 0; - mld_randombytes(kg_rand, sizeof(kg_rand)); - mld_randombytes(sig_rand, sizeof(sig_rand)); + CHECK(mld_randombytes(kg_rand, sizeof(kg_rand)) == 0); + CHECK(mld_randombytes(sig_rand, sizeof(sig_rand)) == 0); /* Key-pair generation */ @@ -111,8 +111,8 @@ static int bench(void) /* Signing */ - mld_randombytes(ctx, CTXLEN); - mld_randombytes(m, MLEN); + CHECK(mld_randombytes(ctx, CTXLEN) == 0); + CHECK(mld_randombytes(m, MLEN) == 0); pre[0] = 0; pre[1] = CTXLEN; diff --git a/test/break_pct_config.h b/test/break_pct_config.h index 9b60a055f..7ff297645 100644 --- a/test/break_pct_config.h +++ b/test/break_pct_config.h @@ -343,7 +343,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -354,9 +355,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/test/configs.yml b/test/configs.yml index 45b5660e9..51ffe1a79 100644 --- a/test/configs.yml +++ b/test/configs.yml @@ -38,9 +38,9 @@ configs: #include #include "../mldsa/src/sys.h" #include "notrandombytes/notrandombytes.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { - randombytes(ptr, len); + return randombytes(ptr, len); } #endif /* !__ASSEMBLER__ */ @@ -373,9 +373,9 @@ configs: #include #include "sys.h" #include "test_only_rng/notrandombytes.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { - randombytes(ptr, len); + return randombytes(ptr, len); } #endif /* !__ASSEMBLER__ */ diff --git a/test/custom_memcpy_config.h b/test/custom_memcpy_config.h index 54f11a515..8fd4cc33b 100644 --- a/test/custom_memcpy_config.h +++ b/test/custom_memcpy_config.h @@ -350,7 +350,8 @@ static MLD_INLINE void *mld_memcpy(void *dest, const void *src, size_t n) * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -361,9 +362,10 @@ static MLD_INLINE void *mld_memcpy(void *dest, const void *src, size_t n) #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/test/custom_memset_config.h b/test/custom_memset_config.h index 2b0de7ea4..84d7c0cdd 100644 --- a/test/custom_memset_config.h +++ b/test/custom_memset_config.h @@ -349,7 +349,8 @@ static MLD_INLINE void *mld_memset(void *s, int c, size_t n) * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -360,9 +361,10 @@ static MLD_INLINE void *mld_memset(void *s, int c, size_t n) #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/test/custom_native_capability_config_0.h b/test/custom_native_capability_config_0.h index 90179dce5..706009d79 100644 --- a/test/custom_native_capability_config_0.h +++ b/test/custom_native_capability_config_0.h @@ -343,7 +343,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -354,9 +355,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/test/custom_native_capability_config_1.h b/test/custom_native_capability_config_1.h index 233d64f3c..f642e2ad9 100644 --- a/test/custom_native_capability_config_1.h +++ b/test/custom_native_capability_config_1.h @@ -343,7 +343,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -354,9 +355,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/test/custom_native_capability_config_CPUID_AVX2.h b/test/custom_native_capability_config_CPUID_AVX2.h index 41cd8a823..6139a2e1a 100644 --- a/test/custom_native_capability_config_CPUID_AVX2.h +++ b/test/custom_native_capability_config_CPUID_AVX2.h @@ -343,7 +343,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -354,9 +355,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/test/custom_native_capability_config_ID_AA64PFR1_EL1.h b/test/custom_native_capability_config_ID_AA64PFR1_EL1.h index a1393e090..190f2bf1b 100644 --- a/test/custom_native_capability_config_ID_AA64PFR1_EL1.h +++ b/test/custom_native_capability_config_ID_AA64PFR1_EL1.h @@ -343,7 +343,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -354,9 +355,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/test/custom_randombytes_config.h b/test/custom_randombytes_config.h index 061263549..ca6740d9d 100644 --- a/test/custom_randombytes_config.h +++ b/test/custom_randombytes_config.h @@ -342,7 +342,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -354,9 +355,9 @@ #include #include "../mldsa/src/sys.h" #include "notrandombytes/notrandombytes.h" -static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) +static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { - randombytes(ptr, len); + return randombytes(ptr, len); } #endif /* !__ASSEMBLER__ */ diff --git a/test/custom_stdlib_config.h b/test/custom_stdlib_config.h index c1d0e90ab..9c0f96220 100644 --- a/test/custom_stdlib_config.h +++ b/test/custom_stdlib_config.h @@ -358,7 +358,8 @@ static MLD_INLINE void *mld_memset(void *s, int c, size_t n) * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -369,9 +370,10 @@ static MLD_INLINE void *mld_memset(void *s, int c, size_t n) #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/test/custom_zeroize_config.h b/test/custom_zeroize_config.h index 850e2afd2..504e7f295 100644 --- a/test/custom_zeroize_config.h +++ b/test/custom_zeroize_config.h @@ -343,7 +343,8 @@ static MLD_INLINE void mld_zeroize_native(void *ptr, size_t len) * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -354,9 +355,10 @@ static MLD_INLINE void mld_zeroize_native(void *ptr, size_t len) #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/test/no_asm_config.h b/test/no_asm_config.h index 5f28a4a25..24f4be14f 100644 --- a/test/no_asm_config.h +++ b/test/no_asm_config.h @@ -344,7 +344,8 @@ static MLD_INLINE void mld_zeroize_native(void *ptr, size_t len) * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -355,9 +356,10 @@ static MLD_INLINE void mld_zeroize_native(void *ptr, size_t len) #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/test/notrandombytes/notrandombytes.c b/test/notrandombytes/notrandombytes.c index e8bfc8037..ef5a423a9 100644 --- a/test/notrandombytes/notrandombytes.c +++ b/test/notrandombytes/notrandombytes.c @@ -90,7 +90,7 @@ static void surf(void) } } -void randombytes(uint8_t *buf, size_t n) +int randombytes(uint8_t *buf, size_t n) { #ifdef ENABLE_CT_TESTING uint8_t *buf_orig = buf; @@ -126,4 +126,5 @@ void randombytes(uint8_t *buf, size_t n) */ VALGRIND_MAKE_MEM_UNDEFINED(buf_orig, n_orig); #endif /* ENABLE_CT_TESTING */ + return 0; } diff --git a/test/notrandombytes/notrandombytes.h b/test/notrandombytes/notrandombytes.h index e330b36c5..bdf978792 100644 --- a/test/notrandombytes/notrandombytes.h +++ b/test/notrandombytes/notrandombytes.h @@ -29,6 +29,6 @@ */ void randombytes_reset(void); -void randombytes(uint8_t *buf, size_t n); +int randombytes(uint8_t *buf, size_t n); #endif /* !NOTRANDOMBYTES_H */ diff --git a/test/serial_fips202_config.h b/test/serial_fips202_config.h index 7df4b0e64..3093d00f0 100644 --- a/test/serial_fips202_config.h +++ b/test/serial_fips202_config.h @@ -342,7 +342,8 @@ * consumer. * * If this option is not set, mldsa-native expects a function - * void randombytes(uint8_t *out, size_t outlen). + * int randombytes(uint8_t *out, size_t outlen). + * This function should return 0 on success, non-zero on failure. * * Set this option and define `mld_randombytes` if you want to * use a custom method to sample randombytes with a different name @@ -353,9 +354,10 @@ #if !defined(__ASSEMBLER__) #include #include "sys.h" - static MLD_INLINE void mld_randombytes(uint8_t *ptr, size_t len) + static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len) { ... your implementation ... + return 0; // 0 on success, non-zero on failure } #endif */ diff --git a/test/test_mldsa.c b/test/test_mldsa.c index 25ccdba3c..7848f275a 100644 --- a/test/test_mldsa.c +++ b/test/test_mldsa.c @@ -40,9 +40,9 @@ static int test_sign_core(uint8_t pk[CRYPTO_PUBLICKEYBYTES], CHECK(crypto_sign_keypair(pk, sk) == 0); - randombytes(ctx, CTXLEN); + CHECK(randombytes(ctx, CTXLEN) == 0); MLD_CT_TESTING_SECRET(ctx, CTXLEN); - randombytes(m, MLEN); + CHECK(randombytes(m, MLEN) == 0); MLD_CT_TESTING_SECRET(m, MLEN); CHECK(crypto_sign(sm, &smlen, m, MLEN, ctx, CTXLEN, sk) == 0); @@ -114,7 +114,7 @@ static int test_sign_extmu(void) size_t siglen; CHECK(crypto_sign_keypair(pk, sk) == 0); - randombytes(mu, MLDSA_CRHBYTES); + CHECK(randombytes(mu, MLDSA_CRHBYTES) == 0); MLD_CT_TESTING_SECRET(mu, sizeof(mu)); CHECK(crypto_sign_signature_extmu(sig, &siglen, mu, sk) == 0); @@ -136,11 +136,11 @@ static int test_sign_pre_hash(void) CHECK(crypto_sign_keypair(pk, sk) == 0); - randombytes(ctx, CTXLEN); + CHECK(randombytes(ctx, CTXLEN) == 0); MLD_CT_TESTING_SECRET(ctx, sizeof(ctx)); - randombytes(m, MLEN); + CHECK(randombytes(m, MLEN) == 0); MLD_CT_TESTING_SECRET(m, sizeof(m)); - randombytes(rnd, MLDSA_RNDBYTES); + CHECK(randombytes(rnd, MLDSA_RNDBYTES) == 0); MLD_CT_TESTING_SECRET(rnd, sizeof(rnd)); CHECK(crypto_sign_signature_pre_hash_shake256(sig, &siglen, m, MLEN, ctx, @@ -225,15 +225,15 @@ static int test_wrong_pk(void) size_t i; CHECK(crypto_sign_keypair(pk, sk) == 0); - randombytes(ctx, CTXLEN); + CHECK(randombytes(ctx, CTXLEN) == 0); MLD_CT_TESTING_SECRET(ctx, sizeof(ctx)); - randombytes(m, MLEN); + CHECK(randombytes(m, MLEN) == 0); MLD_CT_TESTING_SECRET(m, sizeof(m)); CHECK(crypto_sign(sm, &smlen, m, MLEN, ctx, CTXLEN, sk) == 0); /* flip bit in public key */ - randombytes((uint8_t *)&idx, sizeof(size_t)); + CHECK(randombytes((uint8_t *)&idx, sizeof(size_t)) == 0); idx %= CRYPTO_PUBLICKEYBYTES; pk[idx] ^= 1; @@ -276,15 +276,15 @@ static int test_wrong_sig(void) size_t i; CHECK(crypto_sign_keypair(pk, sk) == 0); - randombytes(ctx, CTXLEN); + CHECK(randombytes(ctx, CTXLEN) == 0); MLD_CT_TESTING_SECRET(ctx, sizeof(ctx)); - randombytes(m, MLEN); + CHECK(randombytes(m, MLEN) == 0); MLD_CT_TESTING_SECRET(m, sizeof(m)); CHECK(crypto_sign(sm, &smlen, m, MLEN, ctx, CTXLEN, sk) == 0); /* flip bit in signed message */ - randombytes((uint8_t *)&idx, sizeof(size_t)); + CHECK(randombytes((uint8_t *)&idx, sizeof(size_t)) == 0); idx %= MLEN + CRYPTO_BYTES; sm[idx] ^= 1; @@ -328,15 +328,15 @@ static int test_wrong_ctx(void) size_t i; CHECK(crypto_sign_keypair(pk, sk) == 0); - randombytes(ctx, CTXLEN); + CHECK(randombytes(ctx, CTXLEN) == 0); MLD_CT_TESTING_SECRET(ctx, sizeof(ctx)); - randombytes(m, MLEN); + CHECK(randombytes(m, MLEN) == 0); MLD_CT_TESTING_SECRET(m, sizeof(m)); CHECK(crypto_sign(sm, &smlen, m, MLEN, ctx, CTXLEN, sk) == 0); /* flip bit in ctx */ - randombytes((uint8_t *)&idx, sizeof(size_t)); + CHECK(randombytes((uint8_t *)&idx, sizeof(size_t)) == 0); idx %= CTXLEN; ctx[idx] ^= 1;