20#ifndef _LC_CHACHA20_DRNG_H
21#define _LC_CHACHA20_DRNG_H
23#include "ext_headers.h"
31struct lc_chacha20_drng_ctx {
32 struct lc_sym_ctx cc20;
35#define LC_CC20_DRNG_STATE_SIZE (LC_SYM_STATE_SIZE(lc_chacha20))
36#define LC_CC20_DRNG_CTX_SIZE \
37 (LC_CC20_DRNG_STATE_SIZE + sizeof(struct lc_chacha20_drng_ctx))
39#define _LC_CC20_DRNG_SET_CTX(name, ctx, offset) \
40 _LC_SYM_SET_CTX((&name->cc20), lc_chacha20, ctx, offset)
42#define LC_CC20_DRNG_SET_CTX(name) \
43 _LC_CC20_DRNG_SET_CTX(name, name, sizeof(struct lc_chacha20_drng_ctx))
54 struct lc_sym_ctx *sym_ctx = &cc20_ctx->cc20;
57 sizeof(
struct lc_chacha20_drng_ctx),
58 0, LC_CC20_DRNG_STATE_SIZE);
69#define LC_CC20_DRNG_CTX_ON_STACK(name) \
70 _Pragma("GCC diagnostic push") \
71 _Pragma("GCC diagnostic ignored \"-Wvla\"") _Pragma( \
72 "GCC diagnostic ignored \"-Wdeclaration-after-statement\"") \
73 LC_ALIGNED_SYM_BUFFER(name##_ctx_buf, lc_chacha20, \
74 LC_CC20_DRNG_CTX_SIZE); \
75 struct lc_chacha20_drng_ctx *name = \
76 (struct lc_chacha20_drng_ctx *)name##_ctx_buf; \
77 LC_CC20_DRNG_SET_CTX(name); \
78 lc_cc20_drng_zero(name); \
79 _Pragma("GCC diagnostic pop")
120 uint8_t *outbuf,
size_t outbuflen);
133 const uint8_t *inbuf,
size_t inbuflen);
static void lc_sym_init(struct lc_sym_ctx *ctx)
Initialize symmetric context.
void lc_cc20_drng_seed(struct lc_chacha20_drng_ctx *cc20_ctx, const uint8_t *inbuf, size_t inbuflen)
Reseed the ChaCha20 DRNG.
int lc_cc20_drng_alloc(struct lc_chacha20_drng_ctx **cc20_ctx)
Allocation of a ChaCha20 DRNG context.
void lc_cc20_drng_generate(struct lc_chacha20_drng_ctx *cc20_ctx, uint8_t *outbuf, size_t outbuflen)
Obtain random numbers.
static void lc_cc20_drng_zero(struct lc_chacha20_drng_ctx *cc20_ctx)
Zeroize ChaCha20 DRNG context allocated with either LC_CC20_DRNG_CTX_ON_STACK or lc_cc20_drng_alloc.
void lc_cc20_drng_zero_free(struct lc_chacha20_drng_ctx *cc20_ctx)
Zeroize and free ChaCha20 DRNG context.
static void lc_memset_secure(void *s, int c, size_t n)