aboutsummaryrefslogtreecommitdiff
/*
 * 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();
	}
}