prng improvement
This commit is contained in:
parent
79c9a6582b
commit
acf2f69a21
83
prng.c
83
prng.c
|
@ -10,46 +10,47 @@
|
|||
* rndCore is expanded to 512 bits for more security.
|
||||
*
|
||||
* \verbatim
|
||||
* ####################################################################################
|
||||
* # #
|
||||
* # +---------------------------+ #
|
||||
* # | | #
|
||||
* # V | #
|
||||
* # (concat) | #
|
||||
* +---------------+ # o---------o (xor)+---------+ o---------o o---------o # +--------------+
|
||||
* | entropy Block | -----> | sha-256 | --(offset)-< | rndCore | ---> | sha-256 | --+-> | sha-256 | -----> | random Block |
|
||||
* +---------------+ # o---------o (xor)+---------+ o---------o | o---------o # +--------------+
|
||||
* # (xor) (xor) | #
|
||||
* # ^ ^ | #
|
||||
* # \ / | #
|
||||
* # (offset)---------------------+ #
|
||||
* # #
|
||||
* ####################################################################################
|
||||
* ################################################################################################
|
||||
* # #
|
||||
* # +---------------------------+ #
|
||||
* # | | +---+ #
|
||||
* # V | | | #
|
||||
* # (concat) | | V #
|
||||
* +---------------+ # o---------o (xor)+---------+ o---------o | o----o o---------o # +--------------+
|
||||
* | entropy Block | -----> | sha-256 | --(offset)-< | rndCore | ---> | sha-256 | --+--+-| +1 |---> | sha-256 | -----> | random Block |
|
||||
* +---------------+ # o---------o (xor)+---------+ o---------o | o----o o---------o # +--------------+
|
||||
* # (xor) (xor) | #
|
||||
* # ^ ^ | #
|
||||
* # \ / | #
|
||||
* # (offset)---------------------+ #
|
||||
* # #
|
||||
* ################################################################################################
|
||||
* \endverbatim
|
||||
*/
|
||||
|
||||
/* \verbatim
|
||||
* ####################################################################################
|
||||
* # #
|
||||
* # +---------------------------+ #
|
||||
* # | | #
|
||||
* # V | #
|
||||
* # (concat) | #
|
||||
* +---------------+ # o---------o (xor)+---------+ o---------o o---------o # +--------------+
|
||||
* | entropy Block | -----> | sha-256 | --(offset)-< | rndCore | ---> | sha-256 | --+-> | sha-256 | -----> | random Block |
|
||||
* +---------------+ # o---------o (xor)+---------+ o---------o | o---------o # +--------------+
|
||||
* # (xor) (xor) | #
|
||||
* # ^ ^ | #
|
||||
* # \ / | #
|
||||
* # (offset)---------------------+ #
|
||||
* # #
|
||||
* ####################################################################################
|
||||
* ################################################################################################
|
||||
* # #
|
||||
* # +---------------------------+ #
|
||||
* # | | +---+ #
|
||||
* # V | | | #
|
||||
* # (concat) | | V #
|
||||
* +---------------+ # o---------o (xor)+---------+ o---------o | o----o o---------o # +--------------+
|
||||
* | entropy Block | -----> | sha-256 | --(offset)-< | rndCore | ---> | sha-256 | --+--+-| +1 |---> | sha-256 | -----> | random Block |
|
||||
* +---------------+ # o---------o (xor)+---------+ o---------o | o----o o---------o # +--------------+
|
||||
* # (xor) (xor) | #
|
||||
* # ^ ^ | #
|
||||
* # \ / | #
|
||||
* # (offset)---------------------+ #
|
||||
* # #
|
||||
* ################################################################################################
|
||||
* \endverbatim
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include "sha256.h"
|
||||
#include "prng.h"
|
||||
|
||||
/**
|
||||
* \brief secret entropy pool.
|
||||
|
@ -78,7 +79,7 @@ void addEntropy(unsigned length, void* data){
|
|||
sha256_nextBlock(&s, rndCore);
|
||||
while (length>=512){
|
||||
sha256_nextBlock(&s, data);
|
||||
data += 512/8;
|
||||
data = (uint8_t*)data+ 512/8;
|
||||
length -= 512;
|
||||
}
|
||||
sha256_lastBlock(&s, data, length);
|
||||
|
@ -106,6 +107,7 @@ void getRandomBlock(uint32_t *b){
|
|||
}
|
||||
offset ^= 8; /* hehe */
|
||||
memcpy(b, s.h, 32); /* back up first hash in b */
|
||||
((uint8_t*)b)[*b&31]++; /* the important increment step */
|
||||
sha256_init(&s);
|
||||
sha256_lastBlock(&s, b, 256);
|
||||
memcpy(b, s.h, 32);
|
||||
|
@ -127,5 +129,24 @@ uint8_t getRandomByte(void){
|
|||
}
|
||||
return block[i++];
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/**
|
||||
* \brief This function fills the given bock with length random bytes
|
||||
* @return a random byte
|
||||
*/
|
||||
|
||||
void fillBlockRandom(void* block, unsigned length){
|
||||
while(length>RANDOMBLOCK_SIZE){
|
||||
getRandomBlock(block);
|
||||
block += RANDOMBLOCK_SIZE;
|
||||
length -= RANDOMBLOCK_SIZE;
|
||||
}
|
||||
while(length){
|
||||
*((uint8_t*)block) = getRandomByte();
|
||||
++block; --length;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
5
prng.h
5
prng.h
|
@ -13,10 +13,13 @@
|
|||
/*
|
||||
* length in bits
|
||||
*/
|
||||
#define RANDOMBLOCK_SIZE 32 /* bytes */
|
||||
|
||||
void addEntropy(unsigned length, void* data);
|
||||
void getRandomBlock(uint32_t* b);
|
||||
/* this does some simple buffering */
|
||||
uint8_t getRandomByte(void);
|
||||
|
||||
|
||||
void fillBlockRandom(void* block, unsigned length);
|
||||
|
||||
#endif /*PRNG_H_*/
|
||||
|
|
Loading…
Reference in New Issue