mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-11 02:58:02 -06:00
Implement function RandgetBytesFull that enables generating random bytes of any length.
This commit is contained in:
@@ -339,7 +339,16 @@ BOOL RandpeekBytes (unsigned char *buf, int len)
|
|||||||
/* Get len random bytes from the pool (max. RNG_POOL_SIZE bytes per a single call) */
|
/* Get len random bytes from the pool (max. RNG_POOL_SIZE bytes per a single call) */
|
||||||
BOOL RandgetBytes (unsigned char *buf, int len, BOOL forceSlowPoll)
|
BOOL RandgetBytes (unsigned char *buf, int len, BOOL forceSlowPoll)
|
||||||
{
|
{
|
||||||
int i;
|
return RandgetBytesFull (buf, len, forceSlowPoll, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get len random bytes from the pool.
|
||||||
|
* If allowAnyLength is FALSE, then len must be less or equal to RNG_POOL_SIZE
|
||||||
|
* If allowAnyLength is TRUE, then len can have any positive value
|
||||||
|
*/
|
||||||
|
BOOL RandgetBytesFull ( unsigned char *buf , int len, BOOL forceSlowPoll , BOOL allowAnyLength)
|
||||||
|
{
|
||||||
|
int i, looplen;
|
||||||
BOOL ret = TRUE;
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
if (!bRandDidInit || HashFunction == 0)
|
if (!bRandDidInit || HashFunction == 0)
|
||||||
@@ -359,7 +368,7 @@ BOOL RandgetBytes (unsigned char *buf, int len, BOOL forceSlowPoll)
|
|||||||
ret = FALSE;
|
ret = FALSE;
|
||||||
|
|
||||||
/* There's never more than RNG_POOL_SIZE worth of randomess */
|
/* There's never more than RNG_POOL_SIZE worth of randomess */
|
||||||
if (len > RNG_POOL_SIZE)
|
if ( (!allowAnyLength) && (len > RNG_POOL_SIZE))
|
||||||
{
|
{
|
||||||
Error ("ERR_NOT_ENOUGH_RANDOM_DATA");
|
Error ("ERR_NOT_ENOUGH_RANDOM_DATA");
|
||||||
len = RNG_POOL_SIZE;
|
len = RNG_POOL_SIZE;
|
||||||
@@ -367,29 +376,46 @@ BOOL RandgetBytes (unsigned char *buf, int len, BOOL forceSlowPoll)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Requested number of bytes is copied from pool to output buffer,
|
while (len > 0)
|
||||||
// pool is rehashed, and output buffer is XORed with new data from pool
|
|
||||||
for (i = 0; i < len; i++)
|
|
||||||
{
|
{
|
||||||
buf[i] = pRandPool[randPoolReadIndex++];
|
if (len > RNG_POOL_SIZE)
|
||||||
if (randPoolReadIndex == RNG_POOL_SIZE) randPoolReadIndex = 0;
|
{
|
||||||
}
|
looplen = RNG_POOL_SIZE;
|
||||||
|
len -= RNG_POOL_SIZE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
looplen = len;
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Invert the pool */
|
// this loop number of bytes is copied from pool to output buffer,
|
||||||
for (i = 0; i < RNG_POOL_SIZE / 4; i++)
|
// pool is rehashed, and output buffer is XORed with new data from pool
|
||||||
{
|
for (i = 0; i < looplen; i++)
|
||||||
((unsigned __int32 *) pRandPool)[i] = ~((unsigned __int32 *) pRandPool)[i];
|
{
|
||||||
}
|
buf[i] = pRandPool[randPoolReadIndex++];
|
||||||
|
if (randPoolReadIndex == RNG_POOL_SIZE) randPoolReadIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Mix the pool
|
/* Invert the pool */
|
||||||
if (!FastPoll ())
|
for (i = 0; i < RNG_POOL_SIZE / 4; i++)
|
||||||
ret = FALSE;
|
{
|
||||||
|
((unsigned __int32 *) pRandPool)[i] = ~((unsigned __int32 *) pRandPool)[i];
|
||||||
|
}
|
||||||
|
|
||||||
// XOR the current pool content into the output buffer to prevent pool state leaks
|
// Mix the pool
|
||||||
for (i = 0; i < len; i++)
|
if (!FastPoll ())
|
||||||
{
|
ret = FALSE;
|
||||||
buf[i] ^= pRandPool[randPoolReadIndex++];
|
|
||||||
if (randPoolReadIndex == RNG_POOL_SIZE) randPoolReadIndex = 0;
|
// XOR the current pool content into the output buffer to prevent pool state leaks
|
||||||
|
for (i = 0; i < looplen; i++)
|
||||||
|
{
|
||||||
|
buf[i] ^= pRandPool[randPoolReadIndex++];
|
||||||
|
if (randPoolReadIndex == RNG_POOL_SIZE) randPoolReadIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// increment the pointer for the next loop
|
||||||
|
buf += looplen;
|
||||||
}
|
}
|
||||||
|
|
||||||
LeaveCriticalSection (&critRandProt);
|
LeaveCriticalSection (&critRandProt);
|
||||||
|
|||||||
@@ -44,8 +44,16 @@ void RandaddBuf ( void *buf , int len );
|
|||||||
BOOL FastPoll ( void );
|
BOOL FastPoll ( void );
|
||||||
BOOL SlowPoll ( void );
|
BOOL SlowPoll ( void );
|
||||||
BOOL RandpeekBytes ( unsigned char *buf , int len );
|
BOOL RandpeekBytes ( unsigned char *buf , int len );
|
||||||
|
|
||||||
|
/* Get len random bytes from the pool (max. RNG_POOL_SIZE bytes per a single call) */
|
||||||
BOOL RandgetBytes ( unsigned char *buf , int len, BOOL forceSlowPoll );
|
BOOL RandgetBytes ( unsigned char *buf , int len, BOOL forceSlowPoll );
|
||||||
|
|
||||||
|
/* Get len random bytes from the pool.
|
||||||
|
* If allowAnyLength is FALSE, then len must be less or equal to RNG_POOL_SIZE
|
||||||
|
* If allowAnyLength is TRUE, then len can have any positive value
|
||||||
|
*/
|
||||||
|
BOOL RandgetBytesFull ( unsigned char *buf , int len, BOOL forceSlowPoll , BOOL allowAnyLength);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
extern BOOL volatile bFastPollEnabled;
|
extern BOOL volatile bFastPollEnabled;
|
||||||
|
|||||||
Reference in New Issue
Block a user