1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 09:58:01 +00:00
putty-source/unix/uxgen.c
Simon Tatham 025599ec99 Unix PuTTYgen: switch to /dev/urandom by default.
The general wisdom these days - in particular as given by the Linux
urandom(4) man page - seems to be that there's no need to use the
blocking /dev/random any more unless you're running at very early boot
time when the system random pool is at serious risk of not having any
entropy in it at all.

In case of non-Linux systems that don't think /dev/urandom is a
standard name, I fall back to /dev/random if /dev/urandom can't be
found.
2018-06-03 15:15:51 +01:00

65 lines
1.3 KiB
C

/*
* uxgen.c: Unix implementation of get_heavy_noise() from cmdgen.c.
*/
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include "putty.h"
char *get_random_data(int len, const char *device)
{
char *buf = snewn(len, char);
int fd;
int ngot, ret;
if (!device) {
static const char *const default_devices[] = {
"/dev/urandom", "/dev/random"
};
size_t i;
for (i = 0; i < lenof(default_devices); i++) {
if (access(default_devices[i], R_OK) == 0) {
device = default_devices[i];
break;
}
}
if (!device) {
sfree(buf);
fprintf(stderr, "puttygen: cannot find a readable "
"random number source; use --random-device\n");
return NULL;
}
}
fd = open(device, O_RDONLY);
if (fd < 0) {
sfree(buf);
fprintf(stderr, "puttygen: %s: open: %s\n",
device, strerror(errno));
return NULL;
}
ngot = 0;
while (ngot < len) {
ret = read(fd, buf+ngot, len-ngot);
if (ret < 0) {
close(fd);
sfree(buf);
fprintf(stderr, "puttygen: %s: read: %s\n",
device, strerror(errno));
return NULL;
}
ngot += ret;
}
close(fd);
return buf;
}