/*
* RELIC is an Efficient LIbrary for Cryptography
* Copyright (c) 2009 RELIC Authors
*
* This file is part of RELIC. RELIC is legal property of its developers,
* whose names are not listed here. Please refer to the COPYRIGHT file
* for contact information.
*
* RELIC is free software; you can redistribute it and/or modify it under the
* terms of the version 2.1 (or later) of the GNU Lesser General Public License
* as published by the Free Software Foundation; or version 2.0 of the Apache
* License as published by the Apache Software Foundation. See the LICENSE files
* for more details.
*
* RELIC is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the LICENSE files for more details.
*
* You should have received a copy of the GNU Lesser General Public or the
* Apache License along with RELIC. If not, see
* or .
*/
/**
* @defgroup rand Pseudo-random number generators.
*/
/**
* @file
*
* Interface of the module for pseudo-random number generation.
*
* @ingroup rand
*/
#ifndef RLC_RAND_H
#define RLC_RAND_H
#include "relic_rand.h"
/*============================================================================*/
/* Constant definitions */
/*============================================================================*/
/**
* Size of the PRNG internal state in bytes.
*/
#if RAND == HASHD
#if MD_MAP == SH224 || MD_MAP == SH256 || MD_MAP == BLAKE2S_160 || MD_MAP == BLAKE2S_256
#define RLC_RAND_SIZE (1 + 2*440/8)
#elif MD_MAP == SH384 || MD_MAP == SH512
#define RLC_RAND_SIZE (1 + 2*888/8)
#endif
#elif RAND == UDEV
#define RLC_RAND_SIZE (sizeof(int))
#elif RAND == CALL
#define RLC_RAND_SIZE (sizeof(void (*)(uint8_t *, int)))
#elif RAND == RDRND
#define RLC_RAND_SIZE 0
#endif
/**
* Minimum size of the PRNG seed.
*/
#define RLC_RAND_SEED 64
/*============================================================================*/
/* Function prototypes */
/*============================================================================*/
/**
* Initializes the pseudo-random number generator.
*/
void rand_init(void);
/**
* Finishes the pseudo-random number generator.
*/
void rand_clean(void);
#if RAND != CALL
/**
* Sets the initial state of the pseudo-random number generator.
*
* @param[in] buf - the buffer that represents the initial state.
* @param[in] size - the number of bytes.
* @throw ERR_NO_VALID - if the entropy length is too small or too large.
*/
void rand_seed(uint8_t *buf, int size);
#else
/**
* Sets the initial state of the pseudo-random number generator as a function
* pointer.
*
* @param[in] callback - the callback to call.
* @param[in] arg - the argument for the callback.
*/
void rand_seed(void (*callback)(uint8_t *, int, void *), void *arg);
#endif
/**
* Gathers pseudo-random bytes from the pseudo-random number generator.
*
* @param[out] buf - the buffer to write.
* @param[in] size - the number of bytes to gather.
* @throw ERR_NO_VALID - if the required length is too large.
* @throw ERR_NO_READ - it the pseudo-random number generator cannot
* generate the specified number of bytes.
*/
void rand_bytes(uint8_t *buf, int size);
#endif /* !RLC_RAND_H */