Date: Tue, 24 Nov 1998 08:05:01 +1100 From: Peter Jeremy <peter.jeremy@auss2.alcatel.com.au> To: joelh@gnu.org Cc: hackers@FreeBSD.ORG Subject: /dev/random usage Message-ID: <98Nov24.080435est.40327@border.alcanet.com.au>
next in thread | raw e-mail | index | archive | help
Joel Ray Holveck <joelh@gnu.org> wrote:
>Speaking of such things, what are some apps that use /dev/random, or
>at least have hooks to use a random device?
Going thru the 3.0-RELEASE source tree, the following programs all use
srandomdev(3) - which gives you a pseudo-random sequence starting from
a random point within the sequence: games/adventure, games/arithmetic,
games/atc, games/backgammon, games/battlestar, games/bs,
games/canfield, games/cribbage, games/fish, games/fortune, games/hack,
games/hangman, games/larn, games/mille, games/phantasia, games/quiz,
games/rain, games/random, games/robots, games/rogue, games/sail,
games/snake, games/trek, games/worm, games/wump, sbin/fsirand,
sbin/newfs, usr.bin/jot, usr.bin/passwd, usr.sbin/ppp, usr.sbin/pw
Also arc4random(3) uses /dev/urandom for seeding it - and arc4random(3)
is used by mktemp(3).
Modifying an application to use /dev/random is not that difficult:
1) If pseudo-random numbers starting from a fairly random point within
the sequence are adequate, and the application already uses random(3),
just add a call to srandomdev(3) in place of srandom(3).
2) For a slightly better random starting point, it would be possible to
rewrite srandomdev(3) to use /dev/random, waiting until sufficient
key information became available. Having read the comments in the
random(4) code, this is unlikely to provide any benefit over 1) above.
3) For truely random numbers, roll your own random(3) (or rand(3) or
drand48(3) etc - the main differences are the type and range of the
return value) implementation that uses /dev/random:
long random()
{
static int rand_fd = -1;
int wanted;
long rnd;
if (rand_fd < 0 &&
(rand_fd = open("/dev/random", O_RDONLY)) < 0)
{
perror("Failed to open /dev/random");
abort();
}
wanted = sizeof(rnd);
do {
int len;
len = read(rand_fd, ((char *)&rnd) + sizeof(rnd) - wanted, wanted);
if (len < 0) {
perror("read /dev/random failed");
abort();
}
wanted -= len;
if (wanted > 0)
sleep(1); /* adjust as appropriate */
else
return (rnd & 0x7fffffffL);
} while (1);
}
Peter
--
Peter Jeremy (VK2PJ) peter.jeremy@alcatel.com.au
Alcatel Australia Limited
41 Mandible St Phone: +61 2 9690 5019
ALEXANDRIA NSW 2015 Fax: +61 2 9690 5247
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?98Nov24.080435est.40327>
