Skip to content

Commit 3dc3329

Browse files
nvlsianpuc1728p9
authored andcommitted
[NRF5840] change: trng_get_bytes returns at last one random byte.
1 parent 8edac29 commit 3dc3329

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

targets/TARGET_NORDIC/TARGET_NRF5/trng_api.c

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,29 +42,47 @@
4242

4343
void trng_init(trng_t *obj)
4444
{
45+
(void) obj;
46+
4547
(void)nrf_drv_rng_init(NULL);
4648
}
4749

4850
void trng_free(trng_t *obj)
4951
{
52+
(void) obj;
53+
5054
nrf_drv_rng_uninit();
5155
}
5256

57+
/* Get random data from NRF5x TRNG peripheral.
58+
*
59+
* This implementation returns num of random bytes in range <1, length>.
60+
* For parameters description see trng_api.h file.
61+
*/
5362
int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length)
5463
{
55-
#ifdef NRF_RNG_NON_BLOCKING
5664
uint8_t bytes_available;
57-
65+
66+
(void) obj;
67+
5868
nrf_drv_rng_bytes_available(&bytes_available);
59-
60-
if ((bytes_available < length) || (nrf_drv_rng_rand(output, length) == NRF_ERROR_NOT_FOUND)) {
61-
*output_length = 0;
62-
return -1;
63-
}
64-
#endif
65-
nrf_drv_rng_block_rand(output, length);
6669

67-
*output_length = length;
70+
if (bytes_available == 0) {
71+
nrf_drv_rng_block_rand(output, 1);
72+
*output_length = 1;
73+
} else {
74+
75+
if (bytes_available > length) {
76+
bytes_available = length;
77+
}
78+
79+
if (nrf_drv_rng_rand(output, bytes_available) != NRF_SUCCESS) {
80+
*output_length = 0;
81+
return -1;
82+
} else {
83+
*output_length = bytes_available;
84+
}
85+
}
6886

6987
return 0;
7088
}

0 commit comments

Comments
 (0)