20#ifndef LC_XDRBG_DRNG_H
21#define LC_XDRBG_DRNG_H
23#if defined __has_include
24#if __has_include("lc_ascon_hash.h")
26#define LC_XDRBG_ASCON_ENABLED
28#if __has_include("lc_sha3.h")
30#define LC_XDRBG_SHAKE_ENABLED
33#error "Compiler misses __has_include"
43#define LC_XDRBG_DRNG_INITIALLY_SEEDED 0x8
44#define LC_XDRBG_DRNG_KEYSIZE_MASK 0x7
46enum lc_xdrbg_status_keysize {
47 lc_xdrbg_keysize_undefined,
48 lc_xdrbg_keysize_xdrbg128,
49 lc_xdrbg_keysize_xdrbg256,
50 lc_xdrbg_keysize_xdrbg512
53struct lc_xdrbg_drng_state {
66#define LC_XDRBG_DRNG_CTX_ON_STACK(name, ctxsize) \
67 _Pragma("GCC diagnostic push") _Pragma( \
68 "GCC diagnostic ignored \"-Wdeclaration-after-statement\"") \
69 LC_ALIGNED_BUFFER(name##_ctx_buf, ctxsize, \
70 LC_HASH_COMMON_ALIGNMENT); \
71 struct lc_rng_ctx *name = (struct lc_rng_ctx *)name##_ctx_buf; \
72 _Pragma("GCC diagnostic pop")
77#ifdef LC_XDRBG_SHAKE_ENABLED
80extern const struct lc_rng *lc_xdrbg256_drng;
81extern const struct lc_rng *lc_xdrbg512_drng;
83#define LC_XDRBG256_DRNG_KEYSIZE 64
89#define LC_XDRBG256_DRNG_MAX_CHUNK \
90 (LC_SHAKE_256_SIZE_BLOCK * 3 - LC_XDRBG256_DRNG_KEYSIZE)
91#define LC_XDRBG256_DRNG_STATE_SIZE \
92 (sizeof(struct lc_xdrbg_drng_state) + LC_XDRBG256_DRNG_KEYSIZE)
93#define LC_XDRBG256_DRNG_CTX_SIZE \
94 (sizeof(struct lc_rng) + LC_XDRBG256_DRNG_STATE_SIZE)
96#define LC_XDRBG256_RNG_CTX(name) \
97 LC_RNG_CTX(name, lc_xdrbg256_drng); \
98 struct lc_xdrbg_drng_state *__name = name->rng_state; \
99 __name->status = lc_xdrbg_keysize_xdrbg256; \
100 __name->xof = lc_shake256; \
101 __name->chunksize = LC_XDRBG256_DRNG_MAX_CHUNK; \
102 lc_xdrbg256_drng->zero(name->rng_state);
120#define LC_XDRBG256_DRNG_CTX_ON_STACK(name) \
121 LC_XDRBG_DRNG_CTX_ON_STACK(name, LC_XDRBG256_DRNG_CTX_SIZE); \
122 LC_XDRBG256_RNG_CTX(name)
137int lc_xdrbg256_drng_alloc(
struct lc_rng_ctx **state);
140#define LC_XDRBG512_DRNG_KEYSIZE 128
150#define LC_XDRBG512_DRNG_MAX_CHUNK \
151 (LC_SHAKE_512_SIZE_BLOCK * 6 - LC_XDRBG512_DRNG_KEYSIZE)
152#define LC_XDRBG512_DRNG_STATE_SIZE \
153 (sizeof(struct lc_xdrbg_drng_state) + LC_XDRBG512_DRNG_KEYSIZE)
154#define LC_XDRBG512_DRNG_CTX_SIZE \
155 (sizeof(struct lc_rng) + LC_XDRBG512_DRNG_STATE_SIZE)
157#define LC_XDRBG512_RNG_CTX(name) \
158 LC_RNG_CTX(name, lc_xdrbg512_drng); \
159 struct lc_xdrbg_drng_state *__name = name->rng_state; \
160 __name->status = lc_xdrbg_keysize_xdrbg512; \
161 __name->xof = lc_shake512; \
162 __name->chunksize = LC_XDRBG512_DRNG_MAX_CHUNK; \
163 lc_xdrbg512_drng->zero(name->rng_state);
181#define LC_XDRBG512_DRNG_CTX_ON_STACK(name) \
182 LC_XDRBG_DRNG_CTX_ON_STACK(name, LC_XDRBG512_DRNG_CTX_SIZE); \
183 LC_XDRBG512_RNG_CTX(name)
198int lc_xdrbg512_drng_alloc(
struct lc_rng_ctx **state);
204#ifdef LC_XDRBG_ASCON_ENABLED
207extern const struct lc_rng *lc_xdrbg128_drng;
209#define LC_XDRBG128_DRNG_KEYSIZE 32
216#define LC_XDRBG128_DRNG_MAX_CHUNK (LC_ASCON_HASH_RATE * 32)
217#define LC_XDRBG128_DRNG_STATE_SIZE \
218 (sizeof(struct lc_xdrbg_drng_state) + LC_XDRBG128_DRNG_KEYSIZE)
219#define LC_XDRBG128_DRNG_CTX_SIZE \
220 (sizeof(struct lc_rng) + LC_XDRBG128_DRNG_STATE_SIZE)
222#define LC_XDRBG128_RNG_CTX(name) \
223 LC_RNG_CTX(name, lc_xdrbg128_drng); \
224 struct lc_xdrbg_drng_state *__name = name->rng_state; \
225 __name->status = lc_xdrbg_keysize_xdrbg128; \
226 __name->xof = lc_ascon_xof; \
227 __name->chunksize = LC_XDRBG128_DRNG_MAX_CHUNK; \
228 lc_xdrbg128_drng->zero(name->rng_state);
247#define LC_XDRBG128_DRNG_CTX_ON_STACK(name) \
248 LC_XDRBG_DRNG_CTX_ON_STACK(name, LC_XDRBG128_DRNG_CTX_SIZE); \
249 LC_XDRBG128_RNG_CTX(name)
264int lc_xdrbg128_drng_alloc(
struct lc_rng_ctx **state);
int lc_hash(const struct lc_hash *hash, const uint8_t *in, size_t inlen, uint8_t *digest)
Calculate message digest - one-shot.