// Generated by tool/gen/fn/generate.py; do not edit.
// schema_sha256=787c413dea5e27098bec8d4778942ded65ed94c4cfffda39e20fac88581b05f1
// FIPS 204 Algorithms 4/5 framing and NIST CSOR hashAlgs OIDs.
// No live C++ GPU prehash donor exists. Existing signing core is unchanged.
// Digest computation, secret execution and security qualification are separate.
import shake;
uint mldsa_prehash_bytes(uint algorithm) {
switch (algorithm) {
case 1u: return 32u;
case 2u: return 48u;
case 3u: return 64u;
case 4u: return 28u;
case 5u: return 28u;
case 6u: return 32u;
case 7u: return 28u;
case 8u: return 32u;
case 9u: return 48u;
case 10u: return 64u;
case 11u: return 32u;
case 12u: return 64u;
default: return 0u;
}
}
// Absorb the shared HashML-DSA M' framing after tr. Ranges, algorithm and
// exact digest length must already be checked by the signing/verifying caller.
void mldsa_absorb_prehash_header(inout PqcShake256 sponge,
RWByteAddressBuffer contexts, uint context_base, uint context_length,
uint algorithm) {
pqc_shake256_absorb_byte(sponge, 1u);
pqc_shake256_absorb_byte(sponge, context_length);
pqc_shake256_absorb_buffer(sponge, contexts, context_base, context_length);
uint prefix[10] = {6u, 9u, 96u, 134u, 72u, 1u, 101u, 3u, 4u, 2u};
for (uint i = 0u; i < 10u; ++i) pqc_shake256_absorb_byte(sponge, prefix[i]);
pqc_shake256_absorb_byte(sponge, algorithm);
}
void mldsa_absorb_prehash_framing(inout PqcShake256 sponge,
RWByteAddressBuffer digests, uint digest_base, uint digest_length,
RWByteAddressBuffer contexts, uint context_base, uint context_length,
uint algorithm) {
mldsa_absorb_prehash_header(sponge, contexts, context_base, context_length, algorithm);
pqc_shake256_absorb_buffer(sponge, digests, digest_base, digest_length);
}