Tor 0.4.9.2-alpha-dev
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
siphash_rng.c
1/* Copyright (c) 2020 tevador <tevador@gmail.com> */
2/* See LICENSE for licensing information */
3
4#include "siphash_rng.h"
5
6void hashx_siphash_rng_init(siphash_rng* gen, const siphash_state* state) {
7 gen->keys = *state;
8 gen->counter = 0;
9 gen->count8 = 0;
10 gen->count32 = 0;
11}
12
13uint8_t hashx_siphash_rng_u8(siphash_rng* gen) {
14 if (gen->count8 == 0) {
15 gen->buffer8 = hashx_siphash13_ctr(gen->counter, &gen->keys);
16 gen->counter++;
17 gen->count8 = sizeof(gen->buffer8);
18#ifdef HASHX_RNG_CALLBACK
19 if (gen->callback) {
20 gen->callback(&gen->buffer8, gen->callback_user_data);
21 }
22#endif
23 }
24 gen->count8--;
25 return gen->buffer8 >> (gen->count8 * 8);
26}
27
28uint32_t hashx_siphash_rng_u32(siphash_rng* gen) {
29 if (gen->count32 == 0) {
30 gen->buffer32 = hashx_siphash13_ctr(gen->counter, &gen->keys);
31 gen->counter++;
32 gen->count32 = sizeof(gen->buffer32) / sizeof(uint32_t);
33#ifdef HASHX_RNG_CALLBACK
34 if (gen->callback) {
35 gen->callback(&gen->buffer32, gen->callback_user_data);
36 }
37#endif
38 }
39 gen->count32--;
40 return (uint32_t)(gen->buffer32 >> (gen->count32 * 32));
41}