@@ -93,8 +93,7 @@ static char * __attribute__((malloc)) double_sha256_password(const char *passwor
93
93
94
94
bool get_secure_randomness (uint8_t * buffer , const size_t length )
95
95
{
96
- ssize_t result ;
97
-
96
+ ssize_t result = -1 ;
98
97
// First try to get randomness in non-blocking mode and print a warning when not enough entropy is available right now
99
98
do {
100
99
result = getrandom (buffer , length , GRND_NONBLOCK );
@@ -103,32 +102,49 @@ bool get_secure_randomness(uint8_t *buffer, const size_t length)
103
102
// If not enough entropy is available right now, try again in blocking mode
104
103
if (result < 0 && errno == EAGAIN )
105
104
{
106
- log_warn ("getrandom() failed in get_secure_randomness(): Not enough entropy available right now, retrying in blocking mode" );
105
+ log_warn ("Not enough entropy available right now for generating secure randomness , retrying in blocking mode" );
107
106
// Sleep for 1 second to give the kernel some time to gather entropy
108
107
sleepms (1000 );
109
108
}
110
109
else
111
110
{
112
111
// If the first try was successful, return the result
113
112
if (result >= 0 )
114
- return true ;
113
+ goto random_success ;
115
114
}
116
115
do {
117
116
result = getrandom (buffer , length , 0 );
118
117
} while (result < 0 && errno == EINTR );
119
118
120
- if (result < 0 )
119
+ if (result < 0 )
121
120
{
122
- const int err = errno ;
123
- log_err ("getrandom() failed in get_secure_randomness(): %s" , strerror (errno ));
124
- errno = err ;
125
- return false;
121
+ log_warn ("Getting secure randomness failed (%s), trying /dev/urandom" , strerror (errno ));
122
+ result = getrandom_fallback (buffer , length , 0 );
123
+ if (result < 0 || result < (ssize_t )length )
124
+ {
125
+ log_warn ("Fallback failed, trying internal DRBG generator" );
126
+ result = drbg_random (buffer , length );
127
+ if (result < 0 )
128
+ {
129
+ // Warning will be printed by drbg_random()
130
+ return false;
131
+ }
132
+
133
+ log_info ("Internal DRBG generator successfully used" );
134
+ }
135
+ else
136
+ log_info ("Fallback to /dev/urandom successful" );
126
137
}
127
- else if ((size_t )result != length )
138
+
139
+ // Check if enough bytes were generated
140
+ if (result != (ssize_t )length )
128
141
{
129
- log_err ("getrandom() failed in get_secure_randomness(): Not enough bytes generated (%zu != %zu)" , ( size_t ) result , length );
142
+ log_err ("Randomness generator failed: not enough bytes generated (%zd != %zu)" , result , length );
130
143
return false;
131
144
}
145
+
146
+ random_success :
147
+ log_debug (DEBUG_ANY , "Generated %zd bytes of secure randomness" , result );
132
148
return true;
133
149
}
134
150
0 commit comments