// Generated by tool/gen/fn/generate.py; do not edit.
// schema_sha256=787c413dea5e27098bec8d4778942ded65ed94c4cfffda39e20fac88581b05f1
// Private FIPS 204 internal-mu adapter; no live C++ GPU signing donor exists.
// Formula unchanged. Function-local secret spills remain unqualified.
import attributes;
import mldsa_sign;
import mldsa_sign_workspace_layout;
struct PushConstants {
uint seed_index;
uint private_index;
uint mu_index;
uint signature_index;
uint status_index;
uint workspace_index;
uint parameter_set;
};
[[vk::push_constant]] PushConstants push;
[[vk::binding(0, 0)]] RWByteAddressBuffer storage_buffers[];
[kernel_name("ml_dsa_sign")]
[domain("cryptography")]
[variant("generic")]
[dtype("u8")]
[status("experimental")]
[shader("compute")]
[numthreads(1, 1, 1)]
void main(uint3 tid : SV_DispatchThreadID) {
if (any(tid != uint3(0u, 0u, 0u))) return;
uint parameter = push.parameter_set;
uint key_len = parameter == 44u ? 2560u : parameter == 65u ? 4032u : parameter == 87u ? 4896u : 0u;
uint sig_len = parameter == 44u ? 2420u : parameter == 65u ? 3309u : parameter == 87u ? 4627u : 0u;
uint seed_size, key_size, mu_size, sig_size, status_size;
storage_buffers[push.seed_index].GetDimensions(seed_size);
storage_buffers[push.private_index].GetDimensions(key_size);
storage_buffers[push.mu_index].GetDimensions(mu_size);
storage_buffers[push.signature_index].GetDimensions(sig_size);
storage_buffers[push.status_index].GetDimensions(status_size);
uint workspace_size;
storage_buffers[push.workspace_index].GetDimensions(workspace_size);
if (key_len == 0u || seed_size != 32u || key_size != key_len || mu_size != 64u
|| sig_size != ((sig_len + 3u) & ~3u) || status_size != 4u || workspace_size != MLDSA_SIGN_CACHE_BYTES) return;
uint key[4896], rnd[32], mu[64], signature[4627];
for (uint i = 0u; i < 4896u; ++i) key[i] = 0u;
for (uint i = 0u; i < 4627u; ++i) signature[i] = 0u;
for (uint i = 0u; i < key_len; ++i)
key[i] = (storage_buffers[push.private_index].Load(i & ~3u) >> (8u * (i & 3u))) & 255u;
for (uint i = 0u; i < 32u; ++i)
rnd[i] = (storage_buffers[push.seed_index].Load(i & ~3u) >> (8u * (i & 3u))) & 255u;
for (uint i = 0u; i < 64u; ++i)
mu[i] = (storage_buffers[push.mu_index].Load(i & ~3u) >> (8u * (i & 3u))) & 255u;
uint attempts;
bool success = mldsa_sign_mu_buffer(parameter, key, mu, rnd, storage_buffers[push.workspace_index], 0u, signature, attempts);
// Always overwrite the complete public output, including aligned padding.
// Failure exposes no partial signature and never exposes rejection counts.
for (uint i = 0u; i < sig_size; i += 4u) {
uint word = 0u;
for (uint j = 0u; j < 4u; ++j)
if (success && i + j < sig_len) word |= signature[i + j] << (8u * j);
storage_buffers[push.signature_index].Store(i, word);
}
storage_buffers[push.status_index].Store(0u, success ? 1u : 0u);
}