oarust 0.8.6

GPU-first semantic computing engine written in Rust
// Generated by tool/gen/fn/generate.py; do not edit.
// schema_sha256=787c413dea5e27098bec8d4778942ded65ed94c4cfffda39e20fac88581b05f1
// Private FIPS 204 hashed message/context adapter; no live C++ GPU signing donor exists.
// Formula unchanged. Function-local secret spills remain unqualified.
import attributes;
import mldsa_prehash;
import mldsa_prehash_layout;
import mldsa_sign_workspace_layout;
struct PushConstants {
	uint seed_index;
	uint private_index;
	uint message_index;
	uint context_index;
	uint signature_index;
	uint status_index;
	uint workspace_index;
	uint parameter_set;
	uint message_length;
	uint context_length;
	uint algorithm;
};
[[vk::push_constant]] PushConstants push;
[[vk::binding(0, 0)]] RWByteAddressBuffer storage_buffers[];
[kernel_name("ml_dsa_sign_hash_message")]
[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, message_size, context_size, sig_size, status_size;
	storage_buffers[push.seed_index].GetDimensions(seed_size);
	storage_buffers[push.private_index].GetDimensions(key_size);

	storage_buffers[push.message_index].GetDimensions(message_size);
	storage_buffers[push.context_index].GetDimensions(context_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 || mldsa_prehash_bytes(push.algorithm) == 0u || push.message_length > 0xfffffffcu || push.context_length > 255u
		|| message_size != max(4u, (push.message_length + 3u) & ~3u)
		|| context_size != max(4u, (push.context_length + 3u) & ~3u)
		|| sig_size != ((sig_len + 3u) & ~3u) || status_size != 4u || workspace_size != MLDSA_SIGN_CACHE_BYTES) return;
	uint key[4896], rnd[32], 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;

	uint attempts;
	bool success = mldsa_sign_hash_message_buffer(parameter, key, rnd,
		storage_buffers[push.message_index], 0u, push.message_length,
		storage_buffers[push.context_index], 0u, push.context_length,
		push.algorithm, 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);
}