// Generated by tool/gen/fn/generate.py; do not edit.
// schema_sha256=787c413dea5e27098bec8d4778942ded65ed94c4cfffda39e20fac88581b05f1
// Private FIPS 204 adapter; no live C++ GPU keygen donor exists.
// Existing vector-proven formulas are unchanged; secret spills remain unqualified.
import attributes;
import mldsa_keygen;
struct PushConstants {
uint seed_index;
uint private_index;
uint public_index;
uint parameter_set;
};
[[vk::push_constant]] PushConstants push;
[[vk::binding(0, 0)]] RWByteAddressBuffer storage_buffers[];
[kernel_name("ml_dsa_keygen")]
[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;
if (parameter != 44u && parameter != 65u && parameter != 87u) return;
uint public_len = parameter == 44u ? 1312u : parameter == 65u ? 1952u : parameter == 87u ? 2592u : 0u;
uint private_len = parameter == 44u ? 2560u : parameter == 65u ? 4032u : parameter == 87u ? 4896u : 0u;
uint seed_size, private_size, public_size;
storage_buffers[push.seed_index].GetDimensions(seed_size);
storage_buffers[push.private_index].GetDimensions(private_size);
storage_buffers[push.public_index].GetDimensions(public_size);
if (seed_size != 32u || private_size != private_len || public_size != public_len) return;
uint seed[32], public_key[2592], private_key[4896];
for (uint i = 0u; i < 2592u; ++i) public_key[i] = 0u;
for (uint i = 0u; i < 4896u; ++i) private_key[i] = 0u;
for (uint i = 0u; i < 32u; ++i) {
uint word = storage_buffers[push.seed_index].Load(i & ~3u);
seed[i] = (word >> (8u * (i & 3u))) & 255u;
}
mldsa_keygen_internal(parameter, seed, public_key, private_key);
for (uint i = 0u; i < public_len; i += 4u)
storage_buffers[push.public_index].Store(i, public_key[i] | (public_key[i+1u] << 8u) | (public_key[i+2u] << 16u) | (public_key[i+3u] << 24u));
for (uint i = 0u; i < private_len; i += 4u)
storage_buffers[push.private_index].Store(i, private_key[i] | (private_key[i+1u] << 8u) | (private_key[i+2u] << 16u) | (private_key[i+3u] << 24u));
}