Opened 6 years ago

Last modified 2 years ago

#14937 closed bug

Tiny chunks of entropy from /dev/urandom — at Initial Version

Reported by: kallisti5 Owned by: nobody
Priority: normal Milestone: R1/beta4
Component: Drivers Version: R1/Development
Keywords: urandom Cc:
Blocked By: Blocking:
Platform: All

Description

/dev/urandom on Haiku seems to only offer up small 16 byte chunks of entropy. This behaviour differs from other platforms.

#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <inttypes.h>

int
main() {
        int len = 128;
        int ret = 0;

        uint8_t key[len];

        int fd = open("/dev/urandom", O_RDONLY);
        if (fd < 0) {
                fprintf(stderr, "Unable to open /dev/urandom!");
                return fd;
        }

        int attempts = 0;
        while (ret < len) {
                ssize_t remaining = len - ret;
                ssize_t got = read(fd, key + ret, remaining);

                fprintf(stdout, "Attempt %d: Got %d, giving %d total!\n", attempts, got, ret);
                ret += got;
                if (attempts > 512) {
                        fprintf(stderr, "Unable to get enough entropy from /dev/urandom!");
                        close(fd);
                        return -1;
                }
                attempts++;
        }
        close(fd);
        return ret;
}

Result on Haiku:

~> ./a.out 
Attempt 0: Got 8, giving 0 total!
Attempt 1: Got 16, giving 8 total!
Attempt 2: Got 16, giving 24 total!
Attempt 3: Got 16, giving 40 total!
Attempt 4: Got 16, giving 56 total!
Attempt 5: Got 16, giving 72 total!
Attempt 6: Got 16, giving 88 total!
Attempt 7: Got 16, giving 104 total!
Attempt 8: Got 8, giving 120 total!

Result on Linux:

$ ./a.out 
Attempt 0: Got 128, giving 0 total!
$ ./a.out 
Attempt 0: Got 128, giving 0 total!
$ ./a.out 
Attempt 0: Got 128, giving 0 total!
$ ./a.out 
Attempt 0: Got 128, giving 0 total!
$ ./a.out 
Attempt 0: Got 128, giving 0 total!
$ ./a.out 
Attempt 0: Got 128, giving 0 total!
$ ./a.out 
Attempt 0: Got 128, giving 0 total!

Change History (0)

Note: See TracTickets for help on using tickets.