tag:blogger.com,1999:blog-1625673575821156689.post1403961069870536114..comments2024-03-17T08:55:39.039+01:00Comments on nmav's Blog: A brief look at the Linux-kernel random generator interfacesNikos Mavrogiannopouloshttp://www.blogger.com/profile/17554156755141404866noreply@blogger.comBlogger1125tag:blogger.com,1999:blog-1625673575821156689.post-51849218879266604722018-10-01T12:29:00.982+02:002018-10-01T12:29:00.982+02:00I modified your routine so it works properly, you ...I modified your routine so it works properly, you assume the user will set the correct flags and you dont test for EAGAIN<br />static int safe_getrandom(void *buf, size_t buflen, unsigned int flags)<br />{<br />ssize_t left = buflen;<br />ssize_t ret;<br />uint8_t *p = buf;<br /><br /> while(left > 0) {<br /> ret = getrandom(p, left, flags|GRND_RANDOM); // GRND_RANDOM so it wont block<br /> if(ret == -1) {<br /> if((errno != EINTR) && (errno != EAGAIN))<br /> return ret;<br /> }<br /> if(ret > 0) {<br /> left -= ret;<br /> p += ret;<br /> }<br /> } // end while<br /><br />return buflen;<br />}<br /><br />From the getrandom man page:<br />GRND_NONBLOCK<br /> By default, when reading from the random source, getrandom() blocks if no random bytes are available, and when reading from the urandom source, it blocks if the entropy pool has not yet been initialized.<br /> If the GRND_NONBLOCK flag is set, then getrandom() does not block in these cases, but instead immediately returns -1 with errno set to EAGAIN.<br />Anonymoushttps://www.blogger.com/profile/11830943756756591871noreply@blogger.com