RNGs' get_bytes and allocate_bytes return boolean
This commit is contained in:
committed by
Martin Willi
parent
605985d122
commit
39e807728e
@@ -1,4 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright (C) 2012 Tobias Brunner
|
||||||
* Copyright (C) 2008 Martin Willi
|
* Copyright (C) 2008 Martin Willi
|
||||||
* Hochschule fuer Technik Rapperswil
|
* Hochschule fuer Technik Rapperswil
|
||||||
*
|
*
|
||||||
@@ -53,16 +54,20 @@ struct rng_t {
|
|||||||
*
|
*
|
||||||
* @param len number of bytes to get
|
* @param len number of bytes to get
|
||||||
* @param buffer pointer where the generated bytes will be written
|
* @param buffer pointer where the generated bytes will be written
|
||||||
|
* @return TRUE if bytes successfully written
|
||||||
*/
|
*/
|
||||||
void (*get_bytes) (rng_t *this, size_t len, u_int8_t *buffer);
|
__attribute__((warn_unused_result))
|
||||||
|
bool (*get_bytes) (rng_t *this, size_t len, u_int8_t *buffer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates random bytes and allocate space for them.
|
* Generates random bytes and allocate space for them.
|
||||||
*
|
*
|
||||||
* @param len number of bytes to get
|
* @param len number of bytes to get
|
||||||
* @param chunk chunk which will hold generated bytes
|
* @param chunk chunk which will hold generated bytes
|
||||||
|
* @return TRUE if allocation succeeded
|
||||||
*/
|
*/
|
||||||
void (*allocate_bytes) (rng_t *this, size_t len, chunk_t *chunk);
|
__attribute__((warn_unused_result))
|
||||||
|
bool (*allocate_bytes) (rng_t *this, size_t len, chunk_t *chunk);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroys a rng object.
|
* Destroys a rng object.
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ struct private_gcrypt_rng_t {
|
|||||||
rng_quality_t quality;
|
rng_quality_t quality;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(rng_t, get_bytes, void,
|
METHOD(rng_t, get_bytes, bool,
|
||||||
private_gcrypt_rng_t *this, size_t bytes, u_int8_t *buffer)
|
private_gcrypt_rng_t *this, size_t bytes, u_int8_t *buffer)
|
||||||
{
|
{
|
||||||
switch (this->quality)
|
switch (this->quality)
|
||||||
@@ -50,13 +50,15 @@ METHOD(rng_t, get_bytes, void,
|
|||||||
gcry_randomize(buffer, bytes, GCRY_VERY_STRONG_RANDOM);
|
gcry_randomize(buffer, bytes, GCRY_VERY_STRONG_RANDOM);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(rng_t, allocate_bytes, void,
|
METHOD(rng_t, allocate_bytes, bool,
|
||||||
private_gcrypt_rng_t *this, size_t bytes, chunk_t *chunk)
|
private_gcrypt_rng_t *this, size_t bytes, chunk_t *chunk)
|
||||||
{
|
{
|
||||||
*chunk = chunk_alloc(bytes);
|
*chunk = chunk_alloc(bytes);
|
||||||
get_bytes(this, chunk->len, chunk->ptr);
|
get_bytes(this, chunk->len, chunk->ptr);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(rng_t, destroy, void,
|
METHOD(rng_t, destroy, void,
|
||||||
|
|||||||
@@ -44,10 +44,10 @@ struct private_openssl_rng_t {
|
|||||||
rng_quality_t quality;
|
rng_quality_t quality;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(rng_t, get_bytes, void,
|
METHOD(rng_t, get_bytes, bool,
|
||||||
private_openssl_rng_t *this, size_t bytes, u_int8_t *buffer)
|
private_openssl_rng_t *this, size_t bytes, u_int8_t *buffer)
|
||||||
{
|
{
|
||||||
u_int32_t ret=0;
|
u_int32_t ret;
|
||||||
|
|
||||||
if (this->quality == RNG_STRONG)
|
if (this->quality == RNG_STRONG)
|
||||||
{
|
{
|
||||||
@@ -57,18 +57,19 @@ METHOD(rng_t, get_bytes, void,
|
|||||||
{
|
{
|
||||||
ret = RAND_pseudo_bytes((char*)buffer, bytes);
|
ret = RAND_pseudo_bytes((char*)buffer, bytes);
|
||||||
}
|
}
|
||||||
|
return ret != 0;
|
||||||
if (ret == 0)
|
|
||||||
{
|
|
||||||
DBG1(DBG_LIB, "getting randomness from openssl failed.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(rng_t, allocate_bytes, void,
|
METHOD(rng_t, allocate_bytes, bool,
|
||||||
private_openssl_rng_t *this, size_t bytes, chunk_t *chunk)
|
private_openssl_rng_t *this, size_t bytes, chunk_t *chunk)
|
||||||
{
|
{
|
||||||
*chunk = chunk_alloc(bytes);
|
*chunk = chunk_alloc(bytes);
|
||||||
get_bytes(this, chunk->len, chunk->ptr);
|
if (!get_bytes(this, chunk->len, chunk->ptr))
|
||||||
|
{
|
||||||
|
chunk_free(chunk);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(rng_t, destroy, void,
|
METHOD(rng_t, destroy, void,
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ static void rng(char *buf, int len, int quality)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(rng_t, allocate_bytes, void,
|
METHOD(rng_t, allocate_bytes, bool,
|
||||||
private_padlock_rng_t *this, size_t bytes, chunk_t *chunk)
|
private_padlock_rng_t *this, size_t bytes, chunk_t *chunk)
|
||||||
{
|
{
|
||||||
chunk->len = bytes;
|
chunk->len = bytes;
|
||||||
@@ -77,9 +77,10 @@ METHOD(rng_t, allocate_bytes, void,
|
|||||||
chunk->ptr = malloc(bytes + 7);
|
chunk->ptr = malloc(bytes + 7);
|
||||||
|
|
||||||
rng(chunk->ptr, chunk->len, this->quality);
|
rng(chunk->ptr, chunk->len, this->quality);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(rng_t, get_bytes, void,
|
METHOD(rng_t, get_bytes, bool,
|
||||||
private_padlock_rng_t *this, size_t bytes, u_int8_t *buffer)
|
private_padlock_rng_t *this, size_t bytes, u_int8_t *buffer)
|
||||||
{
|
{
|
||||||
chunk_t chunk;
|
chunk_t chunk;
|
||||||
@@ -88,6 +89,7 @@ METHOD(rng_t, get_bytes, void,
|
|||||||
allocate_bytes(this, bytes, &chunk);
|
allocate_bytes(this, bytes, &chunk);
|
||||||
memcpy(buffer, chunk.ptr, bytes);
|
memcpy(buffer, chunk.ptr, bytes);
|
||||||
chunk_clear(&chunk);
|
chunk_clear(&chunk);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(rng_t, destroy, void,
|
METHOD(rng_t, destroy, void,
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ struct private_pkcs11_rng_t {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(rng_t, get_bytes, void,
|
METHOD(rng_t, get_bytes, bool,
|
||||||
private_pkcs11_rng_t *this, size_t bytes, u_int8_t *buffer)
|
private_pkcs11_rng_t *this, size_t bytes, u_int8_t *buffer)
|
||||||
{
|
{
|
||||||
CK_RV rv;
|
CK_RV rv;
|
||||||
@@ -51,15 +51,21 @@ METHOD(rng_t, get_bytes, void,
|
|||||||
if (rv != CKR_OK)
|
if (rv != CKR_OK)
|
||||||
{
|
{
|
||||||
DBG1(DBG_CFG, "C_GenerateRandom() failed: %N", ck_rv_names, rv);
|
DBG1(DBG_CFG, "C_GenerateRandom() failed: %N", ck_rv_names, rv);
|
||||||
abort();
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(rng_t, allocate_bytes, void,
|
METHOD(rng_t, allocate_bytes, bool,
|
||||||
private_pkcs11_rng_t *this, size_t bytes, chunk_t *chunk)
|
private_pkcs11_rng_t *this, size_t bytes, chunk_t *chunk)
|
||||||
{
|
{
|
||||||
*chunk = chunk_alloc(bytes);
|
*chunk = chunk_alloc(bytes);
|
||||||
get_bytes(this, chunk->len, chunk->ptr);
|
if (!get_bytes(this, chunk->len, chunk->ptr))
|
||||||
|
{
|
||||||
|
chunk_clear(chunk);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(rng_t, destroy, void,
|
METHOD(rng_t, destroy, void,
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ struct private_random_rng_t {
|
|||||||
int fd;
|
int fd;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(rng_t, get_bytes, void,
|
METHOD(rng_t, get_bytes, bool,
|
||||||
private_random_rng_t *this, size_t bytes, u_int8_t *buffer)
|
private_random_rng_t *this, size_t bytes, u_int8_t *buffer)
|
||||||
{
|
{
|
||||||
size_t done;
|
size_t done;
|
||||||
@@ -59,13 +59,15 @@ METHOD(rng_t, get_bytes, void,
|
|||||||
}
|
}
|
||||||
done += got;
|
done += got;
|
||||||
}
|
}
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(rng_t, allocate_bytes, void,
|
METHOD(rng_t, allocate_bytes, bool,
|
||||||
private_random_rng_t *this, size_t bytes, chunk_t *chunk)
|
private_random_rng_t *this, size_t bytes, chunk_t *chunk)
|
||||||
{
|
{
|
||||||
*chunk = chunk_alloc(bytes);
|
*chunk = chunk_alloc(bytes);
|
||||||
get_bytes(this, chunk->len, chunk->ptr);
|
get_bytes(this, chunk->len, chunk->ptr);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(rng_t, destroy, void,
|
METHOD(rng_t, destroy, void,
|
||||||
|
|||||||
Reference in New Issue
Block a user