* run tests.
*/
#define get_random_data get_random_data_diagnostic
-char *get_random_data(int len)
+char *get_random_data(int len, const char *device)
{
char *buf = snewn(len, char);
memset(buf, 'x', len);
" specify file containing old key passphrase\n"
" --new-passphrase file\n"
" specify file containing new key passphrase\n"
+ " --random-device device\n"
+ " specify device to read entropy from (e.g. /dev/urandom)\n"
);
}
char *old_passphrase = NULL, *new_passphrase = NULL;
int load_encrypted;
progfn_t progressfn = is_interactive() ? progress_update : no_progress;
+ const char *random_device = NULL;
/* ------------------------------------------------------------------
* Parse the command line to figure out what we've been asked to do.
if (!new_passphrase)
errs = TRUE;
}
+ } else if (!strcmp(opt, "-random-device")) {
+ if (!val && argc > 1)
+ --argc, val = *++argv;
+ if (!val) {
+ errs = TRUE;
+ fprintf(stderr, "puttygen: option `-%s'"
+ " expects an argument\n", opt);
+ } else {
+ random_device = val;
+ }
} else {
errs = TRUE;
fprintf(stderr,
strftime(default_comment, 30, "rsa-key-%Y%m%d", &tm);
random_ref();
- entropy = get_random_data(bits / 8);
+ entropy = get_random_data(bits / 8, random_device);
if (!entropy) {
fprintf(stderr, "puttygen: failed to collect entropy, "
"could not generate key\n");
int filename_serialise(const Filename *f, void *data);
Filename *filename_deserialise(void *data, int maxsize, int *used);
char *get_username(void); /* return value needs freeing */
-char *get_random_data(int bytes); /* used in cmdgen.c */
+char *get_random_data(int bytes, const char *device); /* used in cmdgen.c */
char filename_char_sanitise(char c); /* rewrite special pathname chars */
/*
*/
#include <stdio.h>
+#include <errno.h>
+
#include <fcntl.h>
#include <unistd.h>
#include "putty.h"
-char *get_random_data(int len)
+char *get_random_data(int len, const char *device)
{
char *buf = snewn(len, char);
int fd;
int ngot, ret;
- fd = open("/dev/random", O_RDONLY);
+ if (!device)
+ device = "/dev/random";
+
+ fd = open(device, O_RDONLY);
if (fd < 0) {
sfree(buf);
- perror("puttygen: unable to open /dev/random");
+ fprintf(stderr, "puttygen: %s: open: %s\n",
+ device, strerror(errno));
return NULL;
}
if (ret < 0) {
close(fd);
sfree(buf);
- perror("puttygen: unable to read /dev/random");
+ fprintf(stderr, "puttygen: %s: read: %s\n",
+ device, strerror(errno));
return NULL;
}
ngot += ret;