32#define LC_DRBG_HASH_STATELEN 111
33#define LC_DRBG_HASH_BLOCKLEN 64
35struct lc_drbg_hash_state {
36 struct lc_hash_ctx hash_ctx;
37 uint8_t hash_state[LC_SHA512_STATE_SIZE + LC_HASH_COMMON_ALIGNMENT];
38 uint8_t V[LC_DRBG_HASH_STATELEN];
39 uint8_t C[LC_DRBG_HASH_STATELEN];
40 uint8_t scratchpad[LC_DRBG_HASH_STATELEN + LC_DRBG_HASH_BLOCKLEN];
45 unsigned int seeded : 1;
48#define LC_DRBG_HASH_STATE_SIZE (sizeof(struct lc_drbg_hash_state))
49#define LC_DRBG_HASH_CTX_SIZE \
50 ((unsigned long)(LC_DRBG_HASH_STATE_SIZE + sizeof(struct lc_rng)))
52#define _LC_DRBG_HASH_SET_CTX(name, ctx, offset) \
53 LC_SHA512_CTX((&(name)->hash_ctx)); \
54 (name)->reseed_ctr = 0; \
57#define LC_DRBG_HASH_SET_CTX(name) \
58 _LC_DRBG_HASH_SET_CTX(name, name, sizeof(struct lc_drbg_hash_state))
60extern const struct lc_rng *lc_hash_drbg;
62#define LC_DRBG_HASH_RNG_CTX(name) \
63 LC_RNG_CTX((name), lc_hash_drbg); \
64 LC_DRBG_HASH_SET_CTX((struct lc_drbg_hash_state *)name->rng_state); \
75#define LC_DRBG_HASH_CTX_ON_STACK(name) \
76 _Pragma("GCC diagnostic push") _Pragma( \
77 "GCC diagnostic ignored \"-Wdeclaration-after-statement\"") \
78 LC_ALIGNED_BUFFER(name##_ctx_buf, LC_DRBG_HASH_CTX_SIZE, \
79 LC_HASH_COMMON_ALIGNMENT); \
80 struct lc_rng_ctx *name = (struct lc_rng_ctx *)name##_ctx_buf; \
81 LC_DRBG_HASH_RNG_CTX(name); \
82 _Pragma("GCC diagnostic pop")
int lc_drbg_hash_healthcheck_sanity(struct lc_rng_ctx *drbg)
Tests as defined in 11.3.2 in addition to the cipher tests: testing of the error handling.
int lc_drbg_hash_alloc(struct lc_rng_ctx **drbg)
Allocate Hash DRBG context on heap.