Require platform TRNG to provide requested output length or error. (#1650)

This commit is contained in:
Jonathan Hui
2017-04-25 09:22:53 -07:00
committed by GitHub
parent adbef3b820
commit 115b52e6c4
10 changed files with 56 additions and 69 deletions
+2 -4
View File
@@ -430,14 +430,14 @@ uint32_t otPlatRandomGet()
return (uint32_t)RtlRandomEx(&Counter.LowPart);
}
ThreadError otPlatRandomSecureGet(uint16_t aInputLength, uint8_t *aOutput, uint16_t *aOutputLength)
ThreadError otPlatRandomGetTrue(uint8_t *aOutput, uint16_t aOutputLength)
{
// Just use the system-preferred random number generator algorithm
NTSTATUS status =
BCryptGenRandom(
NULL,
aOutput,
(ULONG)aInputLength,
(ULONG)aOutputLength,
BCRYPT_USE_SYSTEM_PREFERRED_RNG
);
NT_ASSERT(NT_SUCCESS(status));
@@ -447,8 +447,6 @@ ThreadError otPlatRandomSecureGet(uint16_t aInputLength, uint8_t *aOutput, uint1
return kThreadError_Failed;
}
*aOutputLength = aInputLength;
return kThreadError_None;
}
+6 -11
View File
@@ -39,7 +39,7 @@
#include <utils/code_utils.h>
#include "platform-cc2538.h"
static void generateRandom(uint16_t aInputLength, uint8_t *aOutput, uint16_t *aOutputLength)
static void generateRandom(uint8_t *aOutput, uint16_t aOutputLength)
{
HWREG(SOC_ADC_ADCCON1) &= ~(SOC_ADC_ADCCON1_RCTRL1 | SOC_ADC_ADCCON1_RCTRL0);
HWREG(SYS_CTRL_RCGCRFC) = SYS_CTRL_RCGCRFC_RFC0;
@@ -51,7 +51,7 @@ static void generateRandom(uint16_t aInputLength, uint8_t *aOutput, uint16_t *aO
while (!HWREG(RFCORE_XREG_RSSISTAT) & RFCORE_XREG_RSSISTAT_RSSI_VALID);
for (uint16_t index = 0; index < aInputLength; index++)
for (uint16_t index = 0; index < aOutputLength; index++)
{
aOutput[index] = 0;
@@ -63,11 +63,6 @@ static void generateRandom(uint16_t aInputLength, uint8_t *aOutput, uint16_t *aO
}
HWREG(RFCORE_SFR_RFST) = RFCORE_SFR_RFST_INSTR_RFOFF;
if (aOutputLength)
{
*aOutputLength = aInputLength;
}
}
void cc2538RandomInit(void)
@@ -76,7 +71,7 @@ void cc2538RandomInit(void)
while (seed == 0x0000 || seed == 0x8003)
{
generateRandom(sizeof(seed), (uint8_t *)&seed, 0);
generateRandom((uint8_t *)&seed, sizeof(seed));
}
HWREG(SOC_ADC_RNDL) = (seed >> 8) & 0xff;
@@ -96,12 +91,12 @@ uint32_t otPlatRandomGet(void)
return random;
}
ThreadError otPlatRandomSecureGet(uint16_t aInputLength, uint8_t *aOutput, uint16_t *aOutputLength)
ThreadError otPlatRandomGetTrue(uint8_t *aOutput, uint16_t aOutputLength)
{
ThreadError error = kThreadError_None;
uint8_t channel = 0;
otEXPECT_ACTION(aOutput && aOutputLength, error = kThreadError_InvalidArgs);
otEXPECT_ACTION(aOutput, error = kThreadError_InvalidArgs);
if (otPlatRadioIsEnabled(sInstance))
{
@@ -110,7 +105,7 @@ ThreadError otPlatRandomSecureGet(uint16_t aInputLength, uint8_t *aOutput, uint1
otPlatRadioDisable(sInstance);
}
generateRandom(aInputLength, aOutput, aOutputLength);
generateRandom(aOutput, aOutputLength);
if (channel)
{
+11 -9
View File
@@ -85,7 +85,7 @@ uint32_t otPlatRandomGet(void)
* @return indication of error
* @retval 0 no error occured
*/
static int TRNGPoll(unsigned char *aOutput, size_t aLen, size_t *oLen)
static int TRNGPoll(unsigned char *aOutput, size_t aLen)
{
size_t length = 0;
union
@@ -113,7 +113,6 @@ static int TRNGPoll(unsigned char *aOutput, size_t aLen, size_t *oLen)
aOutput[length] = buffer.u8[length % 8];
length++;
*oLen = length;
}
return 0;
@@ -123,18 +122,16 @@ static int TRNGPoll(unsigned char *aOutput, size_t aLen, size_t *oLen)
/**
* Function documented in platform/random.h
*/
ThreadError otPlatRandomSecureGet(uint16_t aInputLength, uint8_t *aOutput, uint16_t *aOutputLength)
ThreadError otPlatRandomGetTrue(uint8_t *aOutput, uint16_t aOutputLength)
{
ThreadError error = kThreadError_None;
size_t temp_size;
size_t length = aInputLength;
size_t length = aOutputLength;
otEXPECT_ACTION(aOutput && aOutputLength, error = kThreadError_InvalidArgs);
otEXPECT_ACTION(aOutput, error = kThreadError_InvalidArgs);
otEXPECT_ACTION(TRNGPoll((unsigned char *)aOutput, length, &temp_size) != 0, error = kThreadError_Failed);
otEXPECT_ACTION(TRNGPoll((unsigned char *)aOutput, length) != 0, error = kThreadError_Failed);
exit:
*aOutputLength = temp_size;
return error;
}
@@ -145,6 +142,11 @@ exit:
*/
int mbedtls_hardware_poll(void *data, unsigned char *aOutput, size_t aLen, size_t *oLen)
{
ThreadError error;
(void)data;
return TRNGPoll(aOutput, aLen, oLen);
error = TRNGPoll(aOutput, aLen);
*oLen = aLen;
return error;
}
+2 -4
View File
@@ -93,15 +93,13 @@ uint32_t otPlatRandomGet(void)
return mlcg;
}
ThreadError otPlatRandomSecureGet(uint16_t aInputLength, uint8_t *aOutput, uint16_t *aOutputLength)
ThreadError otPlatRandomGetTrue(uint8_t *aOutput, uint16_t aOutputLength)
{
for (uint16_t length = 0; length < aInputLength; length++)
for (uint16_t length = 0; length < aOutputLength; length++)
{
aOutput[length] = (uint8_t)otPlatRandomGet();
}
*aOutputLength = aInputLength;
return kThreadError_None;
}
+3 -5
View File
@@ -90,19 +90,17 @@ uint32_t otPlatRandomGet(void)
return random;
}
ThreadError otPlatRandomSecureGet(uint16_t aInputLength, uint8_t *aOutput, uint16_t *aOutputLength)
ThreadError otPlatRandomGetTrue(uint8_t *aOutput, uint16_t *aOutputLength)
{
ThreadError error = kThreadError_None;
otEXPECT_ACTION(aOutput && aOutputLength, error = kThreadError_InvalidArgs);
otEXPECT_ACTION(aOutput, error = kThreadError_InvalidArgs);
for (uint16_t length = 0; length < aInputLength; length++)
for (uint16_t length = 0; length < aOutputLength; length++)
{
aOutput[length] = (uint8_t)otPlatRandomGet();
}
*aOutputLength = aInputLength;
exit:
return error;
}
+4 -6
View File
@@ -150,18 +150,18 @@ uint32_t otPlatRandomGet(void)
return (uint32_t)rand();
}
ThreadError otPlatRandomSecureGet(uint16_t aInputLength, uint8_t *aOutput, uint16_t *aOutputLength)
ThreadError otPlatRandomGetTrue(uint8_t *aOutput, uint16_t aOutputLength)
{
ThreadError error = kThreadError_None;
otEXPECT_ACTION(aOutput && aOutputLength, error = kThreadError_InvalidArgs);
otEXPECT_ACTION(aOutput, error = kThreadError_InvalidArgs);
otEXPECT_ACTION(!bufferIsEmpty(), error = kThreadError_Failed);
uint16_t copyLength = (uint16_t)bufferCount();
if (copyLength > aInputLength)
if (copyLength > aOutputLength)
{
copyLength = aInputLength;
copyLength = aOutputLength;
}
for (uint32_t i = 0; i < copyLength; i++)
@@ -169,8 +169,6 @@ ThreadError otPlatRandomSecureGet(uint16_t aInputLength, uint8_t *aOutput, uint1
aOutput[i] = bufferGet();
}
*aOutputLength = copyLength;
generatorStart();
exit:
+5 -12
View File
@@ -49,9 +49,8 @@ void platformRandomInit(void)
#if __SANITIZE_ADDRESS__ == 0
ThreadError error;
uint16_t length;
error = otPlatRandomSecureGet(sizeof(sState), (uint8_t *)&sState, &length);
error = otPlatRandomGetTrue((uint8_t *)&sState, sizeof(sState));
assert(error == kThreadError_None);
#else // __SANITIZE_ADDRESS__
@@ -84,7 +83,7 @@ uint32_t otPlatRandomGet(void)
return mlcg;
}
ThreadError otPlatRandomSecureGet(uint16_t aInputLength, uint8_t *aOutput, uint16_t *aOutputLength)
ThreadError otPlatRandomGetTrue(uint8_t *aOutput, uint16_t aOutputLength)
{
ThreadError error = kThreadError_None;
@@ -93,17 +92,13 @@ ThreadError otPlatRandomSecureGet(uint16_t aInputLength, uint8_t *aOutput, uint1
FILE *file = NULL;
size_t readLength;
*aOutputLength = 0;
otEXPECT_ACTION(aOutput && aOutputLength, error = kThreadError_InvalidArgs);
file = fopen("/dev/urandom", "rb");
otEXPECT_ACTION(file != NULL, error = kThreadError_Failed);
readLength = fread(aOutput, 1, aInputLength, file);
otEXPECT_ACTION(readLength == aInputLength, error = kThreadError_Failed);
*aOutputLength = aInputLength;
readLength = fread(aOutput, 1, aOutputLength, file);
otEXPECT_ACTION(readLength == aOutputLength, error = kThreadError_Failed);
exit:
@@ -124,13 +119,11 @@ exit:
*/
otEXPECT_ACTION(aOutput && aOutputLength, error = kThreadError_InvalidArgs);
for (uint16_t length = 0; length < aInputLength; length++)
for (uint16_t length = 0; length < aOutputLength; length++)
{
aOutput[length] = (uint8_t)otPlatRandomGet();
}
*aOutputLength = aInputLength;
exit:
#endif // __SANITIZE_ADDRESS__