#ifndef _UTILS_PRNG_H_
#define _UTILS_PRNG_H_
#include <stdint.h>
#include "config.h"
#include "params.h"
#include "utils_randombytes.h"
#define AES128CTR_KEYLEN 16
#define AES128CTR_NONCELEN 16
#define AES128_BLOCKSIZE 16
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _UTILS_PQM4_
#define RNG_OUTPUTLEN 32
#include "aes.h"
#ifdef _4ROUND_AES_
#include "aes4-publicinputs.h"
#else
#include "aes-publicinputs.h"
#endif
typedef struct {
unsigned used;
uint32_t ctr;
unsigned char buf[RNG_OUTPUTLEN];
#ifdef _4ROUND_AES_
aes128_4rounds_ctx_publicinputs ctx;
#else
aes128ctx_publicinputs ctx;
#endif
} prng_publicinputs_t;
#elif defined(_UTILS_AESNI_)
#define RNG_OUTPUTLEN 64
#include "x86aesni.h"
typedef struct {
unsigned used;
uint32_t ctr;
unsigned char buf[RNG_OUTPUTLEN];
unsigned key_offset; #ifdef _4ROUND_AES_
unsigned char key[_AES128_4R_ROUNDKEY_BYTE + 16];
#else
unsigned char key[_AES128_ROUNDKEY_BYTE + 16];
#endif
} prng_publicinputs_t;
#elif defined(_UTILS_NEONAES_)
#define RNG_OUTPUTLEN 64
#include "aes_neonaes.h"
typedef struct {
unsigned used;
uint32_t ctr;
unsigned char buf[RNG_OUTPUTLEN];
#ifdef _4ROUND_AES_
unsigned char key[5 * 16];
#else
unsigned char key[11 * 16];
#endif
} prng_publicinputs_t;
#elif defined(_UTILS_NEONBSAES_)
#define RNG_OUTPUTLEN 128
typedef struct {
unsigned used;
uint32_t ctr;
unsigned char buf[RNG_OUTPUTLEN];
#ifdef _4ROUND_AES_
uint32_t key[ 40 ];
#else
uint32_t key[ 88 ];
#endif
} prng_publicinputs_t;
#elif defined(_UTILS_OQS_)
#define RNG_OUTPUTLEN 16
typedef struct {
unsigned used;
uint32_t ctr;
unsigned char buf[RNG_OUTPUTLEN];
void *ctx;
} prng_publicinputs_t;
#else
#define RNG_OUTPUTLEN 64
typedef struct {
unsigned used;
uint32_t ctr;
unsigned char buf[RNG_OUTPUTLEN];
#ifdef _4ROUND_AES_
uint32_t key[40];
#else
uint32_t key[88];
#endif
} prng_publicinputs_t;
#endif
#define prng_set_publicinputs PQOV_NAMESPACE(prng_set_publicinputs)
int prng_set_publicinputs(prng_publicinputs_t *ctx, const unsigned char prng_seed[16]);
#define prng_gen_publicinputs PQOV_NAMESPACE(prng_gen_publicinputs)
int prng_gen_publicinputs(prng_publicinputs_t *ctx, unsigned char *out, unsigned long outlen);
#define prng_skip_publicinputs PQOV_NAMESPACE(prng_skip_publicinputs)
void prng_skip_publicinputs(prng_publicinputs_t *ctx, unsigned long outlen);
#define prng_release_publicinputs PQOV_NAMESPACE(prng_release_publicinputs)
void prng_release_publicinputs(prng_publicinputs_t *ctx);
#ifdef __cplusplus
}
#endif
#endif