1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
/*
* 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();
}
}
|