61 const uint8_t *s,
size_t slen);
90 struct lc_hash_ctx hash_ctx;
93#define LC_CSHAKE_STATE_SIZE(x) (LC_HASH_STATE_SIZE(x))
94#define LC_CSHAKE_STATE_SIZE_REINIT(x) (2 * LC_HASH_STATE_SIZE(x))
95#define LC_CSHAKE_CTX_SIZE(x) \
96 (LC_CSHAKE_STATE_SIZE(x) + sizeof(struct lc_cshake_ctx))
97#define LC_CSHAKE_CTX_SIZE_REINIT(x) \
98 (LC_CSHAKE_STATE_SIZE_REINIT(x) + sizeof(struct lc_cshake_ctx))
100#define _LC_CSHAKE_SET_CTX(name, hashname, ctx, offset) \
101 _LC_HASH_SET_CTX((&name->hash_ctx), hashname, ctx, offset); \
102 name->shadow_ctx = NULL
104#define LC_CSHAKE_SET_CTX(name, hashname) \
105 _LC_CSHAKE_SET_CTX(name, hashname, name, sizeof(struct lc_cshake_ctx))
107#define _LC_CSHAKE_SET_CTX_REINIT(name, hashname, ctx, offset) \
108 _LC_HASH_SET_CTX((&name->hash_ctx), hashname, ctx, offset); \
109 name->shadow_ctx = (uint8_t *)((uint8_t *)ctx + offset + \
110 LC_HASH_STATE_SIZE(hashname))
112#define LC_CSHAKE_SET_CTX_REINIT(name, hashname) \
113 _LC_CSHAKE_SET_CTX_REINIT(name, hashname, name, \
114 sizeof(struct lc_cshake_ctx))
132 size_t nlen,
const uint8_t *s,
size_t slen);
183 struct lc_cshake_ctx **cshake_ctx, uint32_t flags);
193#define LC_CSHAKE_FLAGS_SUPPORT_REINIT (1 << 0)
210 struct lc_hash_ctx *hash_ctx;
215 hash_ctx = &cshake_ctx->hash_ctx;
216 hash = hash_ctx->hash;
220 cshake_ctx->shadow_ctx ?
221 LC_CSHAKE_STATE_SIZE_REINIT(hash) :
222 LC_CSHAKE_STATE_SIZE(hash));
235#define LC_CSHAKE_CTX_ON_STACK(name, hashname) \
236 _Pragma("GCC diagnostic push") \
237 _Pragma("GCC diagnostic ignored \"-Wvla\"") _Pragma( \
238 "GCC diagnostic ignored \"-Wdeclaration-after-statement\"") \
239 LC_ALIGNED_BUFFER(name##_ctx_buf, \
240 LC_CSHAKE_CTX_SIZE(hashname), \
241 LC_HASH_COMMON_ALIGNMENT); \
242 struct lc_cshake_ctx *name = (struct lc_cshake_ctx *)name##_ctx_buf; \
243 LC_CSHAKE_SET_CTX(name, hashname); \
244 lc_cshake_ctx_zero(name); \
245 _Pragma("GCC diagnostic pop")
258#define LC_CSHAKE_CTX_ON_STACK_REINIT(name, hashname) \
259 _Pragma("GCC diagnostic push") \
260 _Pragma("GCC diagnostic ignored \"-Wvla\"") _Pragma( \
261 "GCC diagnostic ignored \"-Wdeclaration-after-statement\"") \
262 LC_ALIGNED_BUFFER(name##_ctx_buf, \
263 LC_CSHAKE_CTX_SIZE_REINIT(hashname), \
264 LC_HASH_COMMON_ALIGNMENT); \
265 struct lc_cshake_ctx *name = (struct lc_cshake_ctx *)name##_ctx_buf; \
266 LC_CSHAKE_SET_CTX_REINIT(name, hashname); \
267 lc_cshake_ctx_zero(name); \
268 _Pragma("GCC diagnostic pop")
static void lc_hash_set_digestsize(struct lc_hash_ctx *hash_ctx, size_t digestsize)
Set the size of the message digest - this call is intended for SHAKE.
void lc_hash(const struct lc_hash *hash, const uint8_t *in, size_t inlen, uint8_t *digest)
Calculate message digest - one-shot.
static void lc_hash_final(struct lc_hash_ctx *hash_ctx, uint8_t *digest)
Calculate message digest.
void lc_cshake_ctx_update(struct lc_cshake_ctx *cshake_ctx, const uint8_t *in, size_t inlen)
Update CSHAKE.
int lc_cshake_ctx_alloc(const struct lc_hash *hash, struct lc_cshake_ctx **cshake_ctx, uint32_t flags)
Allocate CSHAKE context on heap.
void lc_cshake_ctx_final(struct lc_cshake_ctx *cshake_ctx, uint8_t *out, size_t outlen)
Generate a cSHAKE message digest from a given state.
void lc_cshake_ctx_zero_free(struct lc_cshake_ctx *cshake_ctx)
Zeroize and free CSHAKE context.
static void lc_cshake_ctx_zero(struct lc_cshake_ctx *cshake_ctx)
Zeroize CSHAKE context allocated with either LC_CSHAKE_CTX_ON_STACK or lc_cshake_alloc.
void lc_cshake_init(struct lc_hash_ctx *ctx, const uint8_t *n, size_t nlen, const uint8_t *s, size_t slen)
Initialize the hash state following the cSHAKE specification.
void lc_cshake_ctx_reinit(struct lc_cshake_ctx *cshake_ctx)
Re-initialize CSHAKE context after a cshake_final operation.
void lc_cshake_ctx_init(struct lc_cshake_ctx *cshake_ctx, const uint8_t *n, size_t nlen, const uint8_t *s, size_t slen)
Initialize the hash state with re-init support following the cSHAKE specification.
static void lc_cshake_final(struct lc_hash_ctx *ctx, uint8_t *out, size_t outlen)
Generate a cSHAKE message digest from a given state.
static void lc_memset_secure(void *s, int c, size_t n)