Leancrypto 0.12.0
Post-Quantum Cryptographic Library
Loading...
Searching...
No Matches
lc_chacha20_drng.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016 - 2024, Stephan Mueller <smueller@chronox.de>
3 *
4 * License: see COPYING file in root directory
5 *
6 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
7 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
8 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
9 * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
10 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
11 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
12 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
13 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
14 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
15 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
16 * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
17 * DAMAGE.
18 */
19
20#ifndef _LC_CHACHA20_DRNG_H
21#define _LC_CHACHA20_DRNG_H
22
23#include "ext_headers.h"
24#include "lc_chacha20.h"
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
31struct lc_chacha20_drng_ctx {
32 struct lc_sym_ctx cc20;
33};
34
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))
38
39#define _LC_CC20_DRNG_SET_CTX(name, ctx, offset) \
40 _LC_SYM_SET_CTX((&name->cc20), lc_chacha20, ctx, offset)
41
42#define LC_CC20_DRNG_SET_CTX(name) \
43 _LC_CC20_DRNG_SET_CTX(name, name, sizeof(struct lc_chacha20_drng_ctx))
45
52static inline void lc_cc20_drng_zero(struct lc_chacha20_drng_ctx *cc20_ctx)
53{
54 struct lc_sym_ctx *sym_ctx = &cc20_ctx->cc20;
55
56 lc_memset_secure((uint8_t *)cc20_ctx +
57 sizeof(struct lc_chacha20_drng_ctx),
58 0, LC_CC20_DRNG_STATE_SIZE);
59 lc_sym_init(sym_ctx);
60}
61
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")
80
94int lc_cc20_drng_alloc(struct lc_chacha20_drng_ctx **cc20_ctx);
95
101void lc_cc20_drng_zero_free(struct lc_chacha20_drng_ctx *cc20_ctx);
102
119void lc_cc20_drng_generate(struct lc_chacha20_drng_ctx *cc20_ctx,
120 uint8_t *outbuf, size_t outbuflen);
121
132void lc_cc20_drng_seed(struct lc_chacha20_drng_ctx *cc20_ctx,
133 const uint8_t *inbuf, size_t inbuflen);
134
135#ifdef __cplusplus
136}
137#endif
138
139#endif /* _LC_CHACHA20_DRNG_H */
static void lc_sym_init(struct lc_sym_ctx *ctx)
Initialize symmetric context.
Definition lc_sym.h:118
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)