17db96d56Sopenharmony_ci// sha3.h
27db96d56Sopenharmony_ci// 19-Nov-11  Markku-Juhani O. Saarinen <mjos@iki.fi>
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci#ifndef SHA3_H
57db96d56Sopenharmony_ci#define SHA3_H
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci#include <stddef.h>
87db96d56Sopenharmony_ci#include <stdint.h>
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci#ifndef KECCAKF_ROUNDS
117db96d56Sopenharmony_ci#define KECCAKF_ROUNDS 24
127db96d56Sopenharmony_ci#endif
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci#ifndef ROTL64
157db96d56Sopenharmony_ci#define ROTL64(x, y) (((x) << (y)) | ((x) >> (64 - (y))))
167db96d56Sopenharmony_ci#endif
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci// state context
197db96d56Sopenharmony_citypedef struct {
207db96d56Sopenharmony_ci    union {                                 // state:
217db96d56Sopenharmony_ci        uint8_t b[200];                     // 8-bit bytes
227db96d56Sopenharmony_ci        uint64_t q[25];                     // 64-bit words
237db96d56Sopenharmony_ci    } st;
247db96d56Sopenharmony_ci    int pt, rsiz, mdlen;                    // these don't overflow
257db96d56Sopenharmony_ci} sha3_ctx_t;
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci// Compression function.
287db96d56Sopenharmony_cistatic void sha3_keccakf(uint64_t st[25]);
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci// OpenSSL - like interfece
317db96d56Sopenharmony_cistatic int sha3_init(sha3_ctx_t *c, int mdlen);    // mdlen = hash output in bytes
327db96d56Sopenharmony_cistatic int sha3_update(sha3_ctx_t *c, const void *data, size_t len);
337db96d56Sopenharmony_cistatic int sha3_final(void *md, sha3_ctx_t *c);    // digest goes to md
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci// compute a sha3 hash (md) of given byte length from "in"
367db96d56Sopenharmony_ci#if 0
377db96d56Sopenharmony_cistatic void *sha3(const void *in, size_t inlen, void *md, int mdlen);
387db96d56Sopenharmony_ci#endif
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci// SHAKE128 and SHAKE256 extensible-output functions
417db96d56Sopenharmony_ci#define shake128_init(c) sha3_init(c, 16)
427db96d56Sopenharmony_ci#define shake256_init(c) sha3_init(c, 32)
437db96d56Sopenharmony_ci#define shake_update sha3_update
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_cistatic void shake_xof(sha3_ctx_t *c);
467db96d56Sopenharmony_cistatic void shake_out(sha3_ctx_t *c, void *out, size_t len);
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci#endif
497db96d56Sopenharmony_ci
50