/* * SPDX-License-Identifier: CC0-1.0 * * Copyright (C) 2025 W. Kosior <koszko@koszko.org> */ #include <stdio.h> #include <gcrypt.h> #include "pqcrypto_prng_seeded.h" void prng_seeded_state_init(prng_seeded_state_t state, void const * seed, size_t seed_len) { state[0].seed = seed; state[0].seed_len = seed_len; state[0].iterator = 0; } void prng_seeded_state_clear(prng_seeded_state_t state) { (void) state; } void prng_seeded(void * buf, size_t buf_len, void * state) { struct prng_seeded_state * state_ = state; char pseudo_salt[9]; if (state_->iterator > 99999999UL) abort(); sprintf(pseudo_salt, "%08lu", state_->iterator++); if (gcry_kdf_derive(state_->seed, state_->seed_len, GCRY_KDF_SALTED_S2K, GCRY_MD_SHA256, pseudo_salt, 8, 1, buf_len, buf)) { fprintf(stderr, "Failed to derive %zu pseudorandom bytes.\n", buf_len); abort(); } }