packages feed

crypton-2.1.8: cbits/mldsa/mldsa_native_config.h

/*
 * Copyright (c) The mldsa-native project authors
 * SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT
 */

/* References
 * ==========
 *
 * - [FIPS140_3_IG]
 *   Implementation Guidance for FIPS 140-3 and the Cryptographic Module
 *   Validation Program
 *   National Institute of Standards and Technology
 *   https://csrc.nist.gov/projects/cryptographic-module-validation-program/fips-140-3-ig-announcements
 *
 * - [FIPS204]
 *   FIPS 204 Module-Lattice-Based Digital Signature Standard
 *   National Institute of Standards and Technology
 *   https://csrc.nist.gov/pubs/fips/204/final
 *
 * - [FIPS204_UPDATES]
 *   FIPS 204 Potential Updates (Errata)
 *   National Institute of Standards and Technology
 *   https://csrc.nist.gov/files/pubs/fips/204/final/docs/fips-204-potential-updates.xlsx
 */

#ifndef MLD_CONFIG_H
#define MLD_CONFIG_H

/**
 * MLD_CONFIG_PARAMETER_SET
 *
 * Specifies the parameter set for ML-DSA
 * - MLD_CONFIG_PARAMETER_SET=44 corresponds to ML-DSA-44
 * - MLD_CONFIG_PARAMETER_SET=65 corresponds to ML-DSA-65
 * - MLD_CONFIG_PARAMETER_SET=87 corresponds to ML-DSA-87
 *
 * If you want to support multiple parameter sets, build the
 * library multiple times and set MLD_CONFIG_MULTILEVEL_BUILD.
 * See MLD_CONFIG_MULTILEVEL_BUILD for how to do this while
 * minimizing code duplication.
 *
 * This can also be set using CFLAGS.
 */
#ifndef MLD_CONFIG_PARAMETER_SET
#define MLD_CONFIG_PARAMETER_SET \
  44 /* Change this for different security strengths */
#endif

/**
 * MLD_CONFIG_FILE
 *
 * If defined, this is a header that will be included instead
 * of the default configuration file mldsa/mldsa_native_config.h.
 *
 * When you need to build mldsa-native in multiple configurations,
 * using varying MLD_CONFIG_FILE can be more convenient
 * than configuring everything through CFLAGS.
 *
 * To use, MLD_CONFIG_FILE _must_ be defined prior
 * to the inclusion of any mldsa-native headers. For example,
 * it can be set by passing `-DMLD_CONFIG_FILE="..."`
 * on the command line.
 */
/* #define MLD_CONFIG_FILE "mldsa_native_config.h" */

/**
 * MLD_CONFIG_NAMESPACE_PREFIX
 *
 * The prefix to use to namespace global symbols from mldsa/.
 *
 * In a multi-level build, level-dependent symbols will
 * additionally be prefixed with the parameter set (44/65/87).
 *
 * This can also be set using CFLAGS.
 */
#if !defined(MLD_CONFIG_NAMESPACE_PREFIX)
#define MLD_CONFIG_NAMESPACE_PREFIX MLD_DEFAULT_NAMESPACE_PREFIX
#endif

/**
 * MLD_CONFIG_MULTILEVEL_BUILD
 *
 * Set this if the build is part of a multi-level build supporting
 * multiple parameter sets.
 *
 * If you need only a single parameter set, keep this unset.
 *
 * To build mldsa-native with support for all parameter sets,
 * build it three times -- once per parameter set -- and set the
 * option MLD_CONFIG_MULTILEVEL_WITH_SHARED for exactly one of
 * them, and MLD_CONFIG_MULTILEVEL_NO_SHARED for the others.
 * MLD_CONFIG_MULTILEVEL_BUILD should be set for all of them.
 *
 * See examples/multilevel_build for an example.
 *
 * This can also be set using CFLAGS.
 */
/* #define MLD_CONFIG_MULTILEVEL_BUILD */

/**
 * MLD_CONFIG_EXTERNAL_API_QUALIFIER
 *
 * If set, this option provides an additional function
 * qualifier to be added to declarations of mldsa-native's
 * public API.
 *
 * The primary use case for this option are single-CU builds
 * where the public API exposed by mldsa-native is wrapped by
 * another API in the consuming application. In this case,
 * even mldsa-native's public API can be marked `static`.
 */
/* #define MLD_CONFIG_EXTERNAL_API_QUALIFIER */

/**
 * MLD_CONFIG_NO_KEYPAIR_API
 *
 * By default, mldsa-native includes support for generating key
 * pairs. If you don't need this, set MLD_CONFIG_NO_KEYPAIR_API
 * to exclude keypair, keypair_internal,
 * pk_from_sk, and all internal APIs only needed by
 * those functions.
 */
/* #define MLD_CONFIG_NO_KEYPAIR_API */

/**
 * MLD_CONFIG_NO_SIGN_API
 *
 * By default, mldsa-native includes support for creating
 * signatures. If you don't need this, set MLD_CONFIG_NO_SIGN_API
 * to exclude signature,
 * signature_extmu, signature_internal,
 * signature_pre_hash_internal,
 * signature_pre_hash_shake256, and all internal APIs
 * only needed by those functions.
 */
/* #define MLD_CONFIG_NO_SIGN_API */

/**
 * MLD_CONFIG_NO_VERIFY_API
 *
 * By default, mldsa-native includes support for verifying
 * signatures. If you don't need this, set
 * MLD_CONFIG_NO_VERIFY_API to exclude verify,
 * verify_extmu, verify_internal,
 * verify_pre_hash_internal,
 * verify_pre_hash_shake256, and all internal APIs
 * only needed by those functions.
 */
/* #define MLD_CONFIG_NO_VERIFY_API */

/**
 * MLD_CONFIG_CORE_API_ONLY
 *
 * Set this to remove all public APIs except
 * keypair_internal, signature_internal,
 * and verify_internal.
 */
/* #define MLD_CONFIG_CORE_API_ONLY */

/**
 * MLD_CONFIG_NO_RANDOMIZED_API
 *
 * If this option is set, mldsa-native will be built without the
 * randomized API functions (keypair,
 * signature, and signature_extmu).
 * This allows users to build mldsa-native without providing a
 * randombytes() implementation if they only need the
 * internal deterministic API
 * (keypair_internal, signature_internal).
 *
 * @note This option is incompatible with MLD_CONFIG_KEYGEN_PCT
 * as the current PCT implementation requires
 * signature().
 */
/* #define MLD_CONFIG_NO_RANDOMIZED_API */

/**
 * MLD_CONFIG_CONSTANTS_ONLY
 *
 * If you only need the size constants (MLDSA_PUBLICKEYBYTES, etc.)
 * but no function declarations, set MLD_CONFIG_CONSTANTS_ONLY.
 *
 * This only affects the public header mldsa_native.h, not
 * the implementation.
 */
/* #define MLD_CONFIG_CONSTANTS_ONLY */
/******************************************************************************
 *
 * Build-only configuration options
 *
 * The remaining configurations are build-options only.
 * They do not affect the API described in mldsa_native.h.
 *
 *****************************************************************************/
#if defined(MLD_BUILD_INTERNAL)

/**
 * MLD_CONFIG_MULTILEVEL_WITH_SHARED
 *
 * This is for multi-level builds of mldsa-native only. If you
 * need only a single parameter set, keep this unset.
 *
 * If this is set, all MLD_CONFIG_PARAMETER_SET-independent
 * code will be included in the build, including code needed only
 * for other parameter sets.
 *
 * Example: mld_polyw1_pack_88 is only needed for
 * MLD_CONFIG_PARAMETER_SET == 44. Yet, if this option is set for a
 * build with MLD_CONFIG_PARAMETER_SET == 65/87, it would be included.
 *
 * To build mldsa-native with support for all parameter sets,
 * build it three times -- once per parameter set -- and set the
 * option MLD_CONFIG_MULTILEVEL_WITH_SHARED for exactly one of
 * them, and MLD_CONFIG_MULTILEVEL_NO_SHARED for the others.
 * MLD_CONFIG_MULTILEVEL_BUILD should be set for all of them.
 *
 * See examples/multilevel_build for an example.
 *
 * This can also be set using CFLAGS.
 */
/* #define MLD_CONFIG_MULTILEVEL_WITH_SHARED */

/**
 * MLD_CONFIG_MULTILEVEL_NO_SHARED
 *
 * This is for multi-level builds of mldsa-native only. If you
 * need only a single parameter set, keep this unset.
 *
 * If this is set, no MLD_CONFIG_PARAMETER_SET-independent code
 * will be included in the build.
 *
 * To build mldsa-native with support for all parameter sets,
 * build it three times -- once per parameter set -- and set the
 * option MLD_CONFIG_MULTILEVEL_WITH_SHARED for exactly one of
 * them, and MLD_CONFIG_MULTILEVEL_NO_SHARED for the others.
 * MLD_CONFIG_MULTILEVEL_BUILD should be set for all of them.
 *
 * See examples/multilevel_build for an example.
 *
 * This can also be set using CFLAGS.
 */
/* #define MLD_CONFIG_MULTILEVEL_NO_SHARED */

/**
 * MLD_CONFIG_MONOBUILD_KEEP_SHARED_HEADERS
 *
 * This is only relevant for single compilation unit (SCU)
 * builds of mldsa-native. In this case, it determines whether
 * directives defined in parameter-set-independent headers should
 * be #undef'ined or not at the end of the SCU file. This is
 * needed in multilevel builds.
 *
 * See examples/multilevel_build_native for an example.
 *
 * This can also be set using CFLAGS.
 */
/* #define MLD_CONFIG_MONOBUILD_KEEP_SHARED_HEADERS */

/**
 * MLD_CONFIG_USE_NATIVE_BACKEND_ARITH
 *
 * Determines whether a native arithmetic backend should be used.
 *
 * The arithmetic backend covers performance-critical functions
 * such as the number-theoretic transform (NTT).
 *
 * If this option is unset, the C backend will be used.
 *
 * If this option is set, the arithmetic backend to be used is
 * determined by MLD_CONFIG_ARITH_BACKEND_FILE: If the latter is
 * unset, the default backend for your target architecture
 * will be used. If set, it must be the name of a backend metadata
 * file.
 *
 * This can also be set using CFLAGS.
 */
#if !defined(MLD_CONFIG_USE_NATIVE_BACKEND_ARITH)
/* #define MLD_CONFIG_USE_NATIVE_BACKEND_ARITH */
#endif

/**
 * MLD_CONFIG_ARITH_BACKEND_FILE
 *
 * The arithmetic backend to use.
 *
 * If MLD_CONFIG_USE_NATIVE_BACKEND_ARITH is unset, this option
 * is ignored.
 *
 * If MLD_CONFIG_USE_NATIVE_BACKEND_ARITH is set, this option must
 * either be undefined or the filename of an arithmetic backend.
 * If unset, the default backend will be used.
 *
 * This can be set using CFLAGS.
 */
#if defined(MLD_CONFIG_USE_NATIVE_BACKEND_ARITH) && \
    !defined(MLD_CONFIG_ARITH_BACKEND_FILE)
#define MLD_CONFIG_ARITH_BACKEND_FILE "native/meta.h"
#endif

/**
 * MLD_CONFIG_USE_NATIVE_BACKEND_FIPS202
 *
 * Determines whether a native FIPS202 backend should be used.
 *
 * The FIPS202 backend covers 1x/2x/4x-fold Keccak-f1600, which is
 * the performance bottleneck of SHA3 and SHAKE.
 *
 * If this option is unset, the C backend will be used.
 *
 * If this option is set, the FIPS202 backend to be used is
 * determined by MLD_CONFIG_FIPS202_BACKEND_FILE: If the latter is
 * unset, the default backend for your target architecture
 * will be used. If set, it must be the name of a backend metadata
 * file.
 *
 * This can also be set using CFLAGS.
 */
#if !defined(MLD_CONFIG_USE_NATIVE_BACKEND_FIPS202)
/* #define MLD_CONFIG_USE_NATIVE_BACKEND_FIPS202 */
#endif

/**
 * MLD_CONFIG_FIPS202_BACKEND_FILE
 *
 * The FIPS-202 backend to use.
 *
 * If MLD_CONFIG_USE_NATIVE_BACKEND_FIPS202 is set, this option
 * must either be undefined or the filename of a FIPS202 backend.
 * If unset, the default backend will be used.
 *
 * This can be set using CFLAGS.
 */
#if defined(MLD_CONFIG_USE_NATIVE_BACKEND_FIPS202) && \
    !defined(MLD_CONFIG_FIPS202_BACKEND_FILE)
#define MLD_CONFIG_FIPS202_BACKEND_FILE "fips202/native/auto.h"
#endif

/**
 * MLD_CONFIG_FIPS202_CUSTOM_HEADER
 *
 * Custom header to use for FIPS-202
 *
 * This should only be set if you intend to use a custom
 * FIPS-202 implementation, different from the one shipped
 * with mldsa-native.
 *
 * If set, it must be the name of a file serving as the
 * replacement for mldsa/src/fips202/fips202.h, and exposing
 * the same API (see FIPS202.md).
 */
/* #define MLD_CONFIG_FIPS202_CUSTOM_HEADER "SOME_FILE.h" */

/**
 * MLD_CONFIG_FIPS202X4_CUSTOM_HEADER
 *
 * Custom header to use for FIPS-202-X4
 *
 * This should only be set if you intend to use a custom
 * FIPS-202 implementation, different from the one shipped
 * with mldsa-native.
 *
 * If set, it must be the name of a file serving as the
 * replacement for mldsa/src/fips202/fips202x4.h, and exposing
 * the same API (see FIPS202.md).
 */
/* #define MLD_CONFIG_FIPS202X4_CUSTOM_HEADER "SOME_FILE.h" */

/**
 * MLD_CONFIG_CUSTOM_ZEROIZE
 *
 * In compliance with @[FIPS204, Section 3.6.3], mldsa-native zeroizes
 * intermediate buffers before returning from function calls. By default,
 * those buffers are allocated from the stack; if MLD_CONFIG_CUSTOM_ALLOC_FREE
 * is set, they are (mostly -- few exceptions remain at present) allocated from
 * the configured custom allocator.
 *
 * mldsa-native also zeroizes caller-owned output buffers as needed to uphold
 * the API convention that outputs be either unmodified or zeroized upon
 * failure.
 *
 * Set this option and define `mld_zeroize` if you want to use a custom
 * method to zeroize intermediate and output buffers.
 *
 * The default implementation uses SecureZeroMemory on Windows and a
 * memset + compiler barrier otherwise. If neither of those is available on
 * the target platform, compilation will fail, and you will need to use
 * MLD_CONFIG_CUSTOM_ZEROIZE to provide a custom implementation of
 * `mld_zeroize()`.
 *
 * @warning
 *   The zeroization conducted by mldsa-native reduces the likelihood of data
 *   leaking on the stack or custom allocators, but it does not eliminate it.
 *   For example, the C standard makes no guarantee about where a compiler
 *   allocates local structures and whether/where it makes copies of them.
 *   Also, in addition to entire structures, there may also be potentially
 *   exploitable leakage of individual values on the stack. If you need
 *   bullet-proof zeroization of the stack, you need to consider additional
 *   measures instead of what this feature provides. In this case, you can
 *   set mld_zeroize to a no-op. Note that in this case you are also responsible
 *   for zeroizing output buffers upon failure.
 */
/* #define MLD_CONFIG_CUSTOM_ZEROIZE
   #if !defined(__ASSEMBLER__)
   #include <stdint.h>
   #include "src/src.h"
   static MLD_INLINE void mld_zeroize(void *ptr, size_t len)
   {
       ... your implementation ...
   }
   #endif
*/

/**
 * MLD_CONFIG_CUSTOM_RANDOMBYTES
 *
 * mldsa-native does not provide a secure randombytes
 * implementation. Such an implementation has to be provided by
 * the consumer.
 *
 * If this option is not set, mldsa-native expects a function
 * int randombytes(uint8_t *out, size_t outlen).
 *
 * Set this option and define `mld_randombytes` if you want to
 * use a custom method to sample randombytes with a different name
 * or signature.
 */
/* #define MLD_CONFIG_CUSTOM_RANDOMBYTES
   #if !defined(__ASSEMBLER__)
   #include <stdint.h>
   #include "src/src.h"
   static MLD_INLINE int mld_randombytes(uint8_t *ptr, size_t len)
   {
       ... your implementation ...
       return 0;
   }
   #endif
*/

/**
 * MLD_CONFIG_CUSTOM_CAPABILITY_FUNC
 *
 * mldsa-native backends may rely on specific hardware features.
 * Those backends will only be included in an mldsa-native build
 * if support for the respective features is enabled at
 * compile-time. However, when building for a heterogeneous set
 * of CPUs to run the resulting binary/library on, feature
 * detection at _runtime_ is needed to decide whether a backend
 * can be used or not.
 *
 * Set this option and define `mld_sys_check_capability` if you
 * want to use a custom method to dispatch between implementations.
 *
 * Return value 1 indicates that a capability is supported.
 * Return value 0 indicates that a capability is not supported.
 *
 * If this option is not set, mldsa-native uses compile-time
 * feature detection only to decide which backend to use.
 *
 * If you compile mldsa-native on a system with different
 * capabilities than the system that the resulting binary/library
 * will be run on, you must use this option.
 */
/* #define MLD_CONFIG_CUSTOM_CAPABILITY_FUNC
   static MLD_INLINE int mld_sys_check_capability(mld_sys_cap cap)
   {
       ... your implementation ...
   }
*/

/**
 * MLD_CONFIG_CUSTOM_ALLOC_FREE
 *
 * Set this option and define `MLD_CUSTOM_ALLOC` and
 * `MLD_CUSTOM_FREE` if you want to use custom allocation for
 * large local structures or buffers.
 *
 * By default, all buffers/structures are allocated on the stack.
 * If this option is set, most of them will be allocated via
 * MLD_CUSTOM_ALLOC.
 *
 * Parameters to MLD_CUSTOM_ALLOC:
 * - T* v: Target pointer to declare.
 * - T: Type of structure to be allocated
 * - N: Number of elements to be allocated.
 *
 * Parameters to MLD_CUSTOM_FREE:
 * - T* v: Target pointer to free. May be NULL.
 * - T: Type of structure to be freed.
 * - N: Number of elements to be freed.
 *
 * @warning This option is experimental. Its scope, configuration and
 *          function/macro signatures may change at any time. We expect a
 *          stable API in a future version.
 *
 * @note Even if this option is set, some allocations further down
 * the call stack will still be made from the stack. Those will
 * likely be added to the scope of this option in the future.
 *
 * @note MLD_CUSTOM_ALLOC need not guarantee a successful
 * allocation nor include error handling. Upon failure, the
 * target pointer should simply be set to NULL. The calling
 * code will handle this case and invoke MLD_CUSTOM_FREE.
 */
/* #define MLD_CONFIG_CUSTOM_ALLOC_FREE
   #if !defined(__ASSEMBLER__)
   #include <stdlib.h>
   #define MLD_CUSTOM_ALLOC(v, T, N)                              \
     T* (v) = (T *)aligned_alloc(MLD_DEFAULT_ALIGN,               \
                                 MLD_ALIGN_UP(sizeof(T) * (N)))
   #define MLD_CUSTOM_FREE(v, T, N) free(v)
   #endif
*/

/**
 * MLD_CONFIG_CUSTOM_MEMCPY
 *
 * Set this option and define `mld_memcpy` if you want to
 * use a custom method to copy memory instead of the standard
 * library memcpy function.
 *
 * The custom implementation must have the same signature and
 * behavior as the standard memcpy function:
 * void *mld_memcpy(void *dest, const void *src, size_t n)
 */
/* #define MLD_CONFIG_CUSTOM_MEMCPY
   #if !defined(__ASSEMBLER__)
   #include <stdint.h>
   #include "src/src.h"
   static MLD_INLINE void *mld_memcpy(void *dest, const void *src, size_t n)
   {
       ... your implementation ...
   }
   #endif
*/

/**
 * MLD_CONFIG_CUSTOM_MEMSET
 *
 * Set this option and define `mld_memset` if you want to
 * use a custom method to set memory instead of the standard
 * library memset function.
 *
 * The custom implementation must have the same signature and
 * behavior as the standard memset function:
 * void *mld_memset(void *s, int c, size_t n)
 */
/* #define MLD_CONFIG_CUSTOM_MEMSET
   #if !defined(__ASSEMBLER__)
   #include <stdint.h>
   #include "src/src.h"
   static MLD_INLINE void *mld_memset(void *s, int c, size_t n)
   {
       ... your implementation ...
   }
   #endif
*/

/**
 * MLD_CONFIG_INTERNAL_API_QUALIFIER
 *
 * If set, this option provides an additional qualifier
 * to be added to declarations of internal API functions and data.
 *
 * The primary use case for this option are single-CU builds,
 * in which case this option can be set to `static`.
 */
/* #define MLD_CONFIG_INTERNAL_API_QUALIFIER */

/**
 * MLD_CONFIG_CT_TESTING_ENABLED
 *
 * If set, mldsa-native annotates data as secret / public using
 * valgrind's annotations VALGRIND_MAKE_MEM_UNDEFINED and
 * VALGRIND_MAKE_MEM_DEFINED, enabling various checks for secret-
 * dependent control flow of variable time execution (depending
 * on the exact version of valgrind installed).
 */
/* #define MLD_CONFIG_CT_TESTING_ENABLED */

/**
 * MLD_CONFIG_NO_ASM
 *
 * If this option is set, mldsa-native will be built without
 * use of native code or inline assembly.
 *
 * By default, inline assembly is used to implement value barriers.
 * Without inline assembly, mldsa-native will use a global volatile
 * 'opt blocker' instead; see ct.h.
 *
 * Inline assembly is also used to implement a secure zeroization
 * function on non-Windows platforms. If this option is set and
 * the target platform is not Windows, you MUST set
 * MLD_CONFIG_CUSTOM_ZEROIZE and provide a custom zeroization
 * function.
 *
 * If this option is set, MLD_CONFIG_USE_NATIVE_BACKEND_FIPS202 and
 * MLD_CONFIG_USE_NATIVE_BACKEND_ARITH will be ignored, and no
 * native backends will be used.
 */
/* #define MLD_CONFIG_NO_ASM */

/**
 * MLD_CONFIG_NO_ASM_VALUE_BARRIER
 *
 * If this option is set, mldsa-native will be built without
 * use of native code or inline assembly for value barriers.
 *
 * By default, inline assembly (if available) is used to implement
 * value barriers.
 * Without inline assembly, mldsa-native will use a global volatile
 * 'opt blocker' instead; see ct.h.
 */
/* #define MLD_CONFIG_NO_ASM_VALUE_BARRIER */

/**
 * MLD_CONFIG_KEYGEN_PCT
 *
 * Compliance with @[FIPS140_3_IG, p.87] requires a
 * Pairwise Consistency Test (PCT) to be carried out on a freshly
 * generated keypair before it can be exported.
 *
 * Set this option if such a check should be implemented.
 * In this case, keypair_internal and
 * keypair will return MLD_ERR_PCT_FAIL if the
 * PCT failed.
 *
 * @note This feature will drastically lower the performance of
 * key generation.
 *
 * @note This option is incompatible with MLD_CONFIG_NO_SIGN_API
 * and MLD_CONFIG_NO_VERIFY_API as the current PCT implementation
 * requires signature() and verify().
 */
/* #define MLD_CONFIG_KEYGEN_PCT */

/**
 * MLD_CONFIG_KEYGEN_PCT_BREAKAGE_TEST
 *
 * If this option is set, the user must provide a runtime
 * function `static inline int mld_break_pct() { ... }` to
 * indicate whether the PCT should be made fail.
 *
 * This option only has an effect if MLD_CONFIG_KEYGEN_PCT is set.
 */
/* #define MLD_CONFIG_KEYGEN_PCT_BREAKAGE_TEST
   #if !defined(__ASSEMBLER__)
   #include "src/src.h"
   static MLD_INLINE int mld_break_pct(void)
   {
       ... return 0/1 depending on whether PCT should be broken ...
   }
   #endif
*/

/**
 * MLD_CONFIG_MAX_SIGNING_ATTEMPTS
 *
 * Upper bound on the number of rejection-sampling iterations
 * performed by ML-DSA signing (@[FIPS204, Algorithm 7]).
 *
 * If a valid signature is not produced within this many
 * attempts, signing returns MLD_ERR_SIGN_ATTEMPTS_EXHAUSTED.
 * This is useful in timing-sensitive environments that
 * require a deterministic worst-case bound on signing time.
 *
 * For FIPS 204 compliance, this value MUST be at least 821,
 * cf. @[FIPS204, Appendix C] and @[FIPS204_UPDATES], which is
 * chosen so that the signing failure rate is < 2^{-256}.
 *
 * Default: Largest possible value before internal counters
 * would overflow. This is larger than the FIPS204 bound.
 *
 * In particular, in the default configuration, the signing
 * failure rate is < 2^{-256}.
 */
/* #define MLD_CONFIG_MAX_SIGNING_ATTEMPTS 821 */

/**
 * MLD_CONFIG_SERIAL_FIPS202_ONLY
 *
 * Set this to use a FIPS202 implementation with global state
 * that supports only one active Keccak computation at a time
 * (e.g. some hardware accelerators).
 *
 * If this option is set, ML-DSA will use FIPS202 operations
 * serially, ensuring that only one SHAKE context is active
 * at any given time.
 *
 * This allows offloading Keccak computations to a hardware
 * accelerator that holds only a single Keccak state locally,
 * rather than requiring support for multiple concurrent
 * Keccak states.
 *
 * @note Depending on the target CPU, this may reduce
 * performance when using software FIPS202 implementations.
 * Only enable this when you have to.
 */
/* #define MLD_CONFIG_SERIAL_FIPS202_ONLY */

/**
 * MLD_CONFIG_CONTEXT_PARAMETER
 *
 * Set this to add a caller-supplied context parameter to the public API
 * functions, which is then forwarded unchanged to the custom callbacks
 * (allocation, and signing hooks below).
 *
 * When this option is set, every public API function gains a trailing
 * parameter
 *
 *   MLD_CONFIG_CONTEXT_PARAMETER_TYPE context
 *
 * as its last argument; its type is configured via
 * MLD_CONFIG_CONTEXT_PARAMETER_TYPE (see below). mldsa-native treats this
 * value as opaque: it never dereferences it and only passes it on to the
 * configurable hook macros. It is meant to carry per-caller state -- e.g. a
 * pointer to a memory pool for the allocation hooks, or the resume state for
 * the signing hooks -- into those hooks.
 *
 * When this option is unset (the default), no extra parameter is added and
 * the hook macros never receive a context argument.
 *
 * The hooks that receive the context are the allocation hooks (see
 * MLD_CONFIG_CUSTOM_ALLOC_FREE) and the signing hooks (see
 * MLD_CONFIG_SIGN_HOOK_RESUME / _ATTEMPT / _FINISH); each is documented with
 * its own option below.
 */
/* #define MLD_CONFIG_CONTEXT_PARAMETER */

/**
 * MLD_CONFIG_CONTEXT_PARAMETER_TYPE
 *
 * Set this to define the type of the context parameter added by
 * MLD_CONFIG_CONTEXT_PARAMETER. It can be any C type usable as a function
 * parameter, e.g. `void *` or a pointer to a caller-defined struct such as
 * `struct my_ctx *`.
 *
 * This option must be defined if and only if MLD_CONFIG_CONTEXT_PARAMETER is
 * defined; defining one without the other is a compile-time error.
 */
/* #define MLD_CONFIG_CONTEXT_PARAMETER_TYPE void* */

/**
 * Signing hooks: MLD_CONFIG_SIGN_HOOK_RESUME / _ATTEMPT / _FINISH
 *
 * Three optional, independent hooks into the ML-DSA signing rejection-sampling
 * loop. Each is enabled by defining the matching option, in which case the
 * integration must provide the corresponding function. If a hook needs
 * per-operation state, enable MLD_CONFIG_CONTEXT_PARAMETER; the context is then
 * appended as the last argument.
 *
 * @warning This feature is experimental. Its scope, configuration and
 *          function signatures may change at any time, including after v2.
 *
 * Enabling any of the hooks requires MLD_CONFIG_NO_RANDOMIZED_API (restricting
 * the public API to deterministic operations). This is because the restartable
 * signing as enabled by the signing hooks only produces the uninterrupted
 * signature when the randomness is fixed across calls. A logging-only use
 * (attempt always returns 0; resume/finish merely observe) would be safe with
 * the randomized API too, but for now the requirement is imposed uniformly on
 * all three hooks.
 *
 * Note: Randomized signing is a shim wrapper around deterministic signing, and
 * all helper functions you need to build it are exposed publicly. Thus, if you
 * need a restartable, randomized signing operation, you can build your own by
 * replicating the logic and adding the RNG seed to the restart context. In this
 * case, please also consider letting the mldsa-native maintainers know of your
 * need for randomized, restartable signing, so the feature can be appropriately
 * prioritized.
 *
 * - MLD_CONFIG_SIGN_HOOK_ATTEMPT: int mld_sign_hook_attempt(attempt[, ctxt])
 *   Called before each attempt. Returns 0 to proceed, or non-zero to pause:
 *   signing then returns MLD_ERR_SIGNING_PAUSED with `attempt` as the resume
 *   point (needs MLD_CONFIG_SIGN_HOOK_RESUME to resume; otherwise just aborts).
 *   Always returning 0 makes it a logging/benchmarking hook.
 *
 * - MLD_CONFIG_SIGN_HOOK_RESUME: uint16_t mld_sign_hook_resume([ctxt])
 *   Returns the attempt to resume from (0 for a fresh operation), i.e. the one
 *   recorded when a previous call paused.
 *
 * - MLD_CONFIG_SIGN_HOOK_FINISH: void mld_sign_hook_finish(attempt[, ctxt])
 *   Called on success with the succeeding attempt. Observe-only.
 *
 * When an option is unset, the hook is a no-op (resume to 0, attempt proceeds),
 * i.e. ordinary one-shot signing.
 *
 * Independent of MLD_CONFIG_MAX_SIGNING_ATTEMPTS, which is a static upper bound
 * on the number of signing attempts.
 *
 * See test/src/test_sign_hook.c for a worked example using all three.
 */
/* #define MLD_CONFIG_SIGN_HOOK_RESUME
   #define MLD_CONFIG_SIGN_HOOK_ATTEMPT
   #define MLD_CONFIG_SIGN_HOOK_FINISH
   #if !defined(__ASSEMBLER__)
   #include <stdint.h>
   #include "src/sys.h"
   static MLD_INLINE uint16_t mld_sign_hook_resume(void)
   {
       ... return the attempt to resume from ...
   }
   static MLD_INLINE int mld_sign_hook_attempt(uint16_t attempt)
   {
       ... return non-zero to pause here; for resume, store attempt ...
       return 0;
   }
   static MLD_INLINE void mld_sign_hook_finish(uint16_t attempt)
   {
       ... mark the operation complete (attempt = successful attempt) ...
   }
   #endif
*/

/**
 * MLD_CONFIG_REDUCE_RAM
 *
 * Set this to reduce RAM usage. This trades memory for performance.
 *
 * For expected memory usage, see the MLD_TOTAL_ALLOC_* constants defined in
 * mldsa_native.h.
 *
 * This option is useful for embedded systems with tight RAM constraints but
 * relaxed performance requirements.
 *
 */
/* #define MLD_CONFIG_REDUCE_RAM */

/*************************  Config internals  ********************************/

#endif /* MLD_BUILD_INTERNAL */

/* Default namespace
 *
 * Don't change this. If you need a different namespace, re-define
 * MLD_CONFIG_NAMESPACE_PREFIX above instead, and remove the following.
 *
 * The default MLDSA namespace is
 *
 *   PQCP_MLDSA_NATIVE_MLDSA<LEVEL>_
 *
 * e.g., PQCP_MLDSA_NATIVE_MLDSA44_
 */

#if defined(MLD_CONFIG_MULTILEVEL_BUILD)
/* In a multi-level build the parameter set is appended by the namespacing
 * machinery, so the default prefix must not embed it. */
#define MLD_DEFAULT_NAMESPACE_PREFIX PQCP_MLDSA_NATIVE_MLDSA
#elif MLD_CONFIG_PARAMETER_SET == 44
#define MLD_DEFAULT_NAMESPACE_PREFIX PQCP_MLDSA_NATIVE_MLDSA44
#elif MLD_CONFIG_PARAMETER_SET == 65
#define MLD_DEFAULT_NAMESPACE_PREFIX PQCP_MLDSA_NATIVE_MLDSA65
#elif MLD_CONFIG_PARAMETER_SET == 87
#define MLD_DEFAULT_NAMESPACE_PREFIX PQCP_MLDSA_NATIVE_MLDSA87
#endif

#endif /* !MLD_CONFIG_H */