2019-03-17 11:41:21 +01:00
# include <string.h>
# include "tfe.h"
# include "tfprng.h"
2019-03-21 10:47:59 +01:00
struct tfng_prng_data {
struct tfnge_stream tfe ;
2019-03-17 11:41:21 +01:00
short init ;
} ;
2019-03-21 10:47:59 +01:00
struct tfng_prng_data tfng_prng_sdata ;
2019-03-17 11:41:21 +01:00
2019-03-21 10:47:59 +01:00
size_t tfng_prng_datasize ( void )
2019-03-17 11:41:21 +01:00
{
2019-03-21 10:47:59 +01:00
return sizeof ( struct tfng_prng_data ) ;
2019-03-17 11:41:21 +01:00
}
2019-03-21 10:47:59 +01:00
void tfng_prng_seedkey_r ( void * sdata , const void * skey )
2019-03-17 11:41:21 +01:00
{
2019-03-21 10:47:59 +01:00
TFNG_UNIT_TYPE k [ TFNG_NR_KEY_UNITS ] ;
struct tfng_prng_data * rprng = sdata ;
2019-03-17 11:41:21 +01:00
2019-03-21 10:47:59 +01:00
memset ( rprng , 0 , tfng_prng_datasize ( ) ) ;
2019-03-17 11:41:21 +01:00
if ( ! skey ) return ;
2019-03-21 10:47:59 +01:00
memcpy ( k , skey , TFNG_KEY_SIZE ) ;
tfnge_init ( & rprng - > tfe , k ) ;
2019-03-17 11:41:21 +01:00
rprng - > init = 1 ;
2019-03-21 10:47:59 +01:00
memset ( k , 0 , TFNG_KEY_SIZE ) ;
2019-03-17 11:41:21 +01:00
}
2019-03-21 10:47:59 +01:00
void tfng_prng_seedkey ( const void * skey )
2019-03-17 11:41:21 +01:00
{
2019-03-21 10:47:59 +01:00
tfng_prng_seedkey_r ( & tfng_prng_sdata , skey ) ;
2019-03-17 11:41:21 +01:00
}
2019-03-21 10:47:59 +01:00
void tfng_prng_genrandom_r ( void * sdata , void * result , size_t need )
2019-03-17 11:41:21 +01:00
{
2019-03-21 10:47:59 +01:00
struct tfng_prng_data * rprng = sdata ;
2019-03-17 11:41:21 +01:00
memset ( result , 0 , need ) ;
2019-03-21 10:47:59 +01:00
tfnge_emit ( result , need , & rprng - > tfe ) ;
2019-03-17 11:41:21 +01:00
}
2019-03-21 10:47:59 +01:00
void tfng_prng_genrandom ( void * result , size_t need )
2019-03-17 11:41:21 +01:00
{
2019-03-21 10:47:59 +01:00
tfng_prng_genrandom_r ( & tfng_prng_sdata , result , need ) ;
2019-03-17 11:41:21 +01:00
}
2019-03-21 10:47:59 +01:00
void tfng_prng_seed_r ( void * sdata , TFNG_UNIT_TYPE seed )
2019-03-17 11:41:21 +01:00
{
2019-03-21 10:47:59 +01:00
TFNG_UNIT_TYPE k [ TFNG_NR_KEY_UNITS ] ;
struct tfng_prng_data * rprng = sdata ;
2019-03-17 11:41:21 +01:00
size_t x ;
2019-03-21 10:47:59 +01:00
memset ( rprng , 0 , tfng_prng_datasize ( ) ) ;
for ( x = 0 ; x < TFNG_NR_KEY_UNITS ; x + + ) k [ x ] = seed ;
tfnge_init ( & rprng - > tfe , k ) ;
2019-03-17 11:41:21 +01:00
rprng - > init = 1 ;
2019-03-21 10:47:59 +01:00
memset ( k , 0 , TFNG_KEY_SIZE ) ;
2019-03-17 11:41:21 +01:00
}
2019-03-21 10:47:59 +01:00
void tfng_prng_seed ( TFNG_UNIT_TYPE seed )
2019-03-17 11:41:21 +01:00
{
2019-03-21 10:47:59 +01:00
tfng_prng_seed_r ( & tfng_prng_sdata , seed ) ;
2019-03-17 11:41:21 +01:00
}
2019-03-21 10:47:59 +01:00
TFNG_UNIT_TYPE tfng_prng_random_r ( void * sdata )
2019-03-17 11:41:21 +01:00
{
2019-03-21 10:47:59 +01:00
struct tfng_prng_data * rprng = sdata ;
TFNG_UNIT_TYPE r ;
2019-03-17 11:41:21 +01:00
if ( ! rprng - > init ) return 0 ;
2019-03-21 10:47:59 +01:00
tfnge_emit ( & r , sizeof ( r ) , & rprng - > tfe ) ;
2019-03-17 11:41:21 +01:00
return r ;
}
2019-03-21 10:47:59 +01:00
TFNG_UNIT_TYPE tfng_prng_random ( void )
2019-03-17 11:41:21 +01:00
{
2019-03-21 10:47:59 +01:00
return tfng_prng_random_r ( & tfng_prng_sdata ) ;
2019-03-17 11:41:21 +01:00
}
2019-03-21 10:47:59 +01:00
TFNG_UNIT_TYPE tfng_prng_range_r ( void * sdata , TFNG_UNIT_TYPE s , TFNG_UNIT_TYPE d )
2019-03-17 11:41:21 +01:00
{
2019-03-21 10:47:59 +01:00
TFNG_UNIT_TYPE c = tfng_prng_random_r ( sdata ) ;
2019-03-17 11:41:21 +01:00
if ( d < = s ) return s ;
2019-04-09 13:14:17 +02:00
return TFNG_PRNG_RANGE ( c , TFNG_UNIT_TYPE , s , d ) ;
2019-03-17 11:41:21 +01:00
}
2019-03-21 10:47:59 +01:00
TFNG_UNIT_TYPE tfng_prng_range ( TFNG_UNIT_TYPE s , TFNG_UNIT_TYPE d )
2019-03-17 11:41:21 +01:00
{
2019-03-21 10:47:59 +01:00
return tfng_prng_range_r ( & tfng_prng_sdata , s , d ) ;
2019-03-17 11:41:21 +01:00
}