diff -up rng-tools-3/rngd.8.in.ignorefail rng-tools-3/rngd.8.in
--- rng-tools-3/rngd.8.in.ignorefail 2012-01-12 15:14:06.181307658 +0100
+++ rng-tools-3/rngd.8.in 2012-01-12 15:14:06.237306958 +0100
@@ -9,6 +9,7 @@ rngd \- Check and feed random data from
.B rngd
[\fB\-b\fR, \fB\-\-background\fR]
[\fB\-f\fR, \fB\-\-foreground\fR]
+[\fB\-i\fR, \fB\-\-ignorefail\fR]
[\fB\-o\fR, \fB\-\-random-device=\fIfile\fR]
[\fB\-r\fR, \fB\-\-rng-device=\fIfile\fR]
[\fB\-s\fR, \fB\-\-random-step=\fInnn\fR]
@@ -45,6 +46,9 @@ Become a daemon (default)
\fB\-f\fR, \fB\-\-foreground\fR
Do not fork and become a daemon
.TP
+\fB\-i\fR, \fB\-\-ignorefail\fR
+Ignore repeated fips failures
+.TP
\fB\-o\fI file\fR, \fB\-\-random-device=\fIfile\fR
Kernel device used for random number output
(default: /dev/random)
diff -up rng-tools-3/rngd.c.ignorefail rng-tools-3/rngd.c
--- rng-tools-3/rngd.c.ignorefail 2012-01-12 15:14:06.194307494 +0100
+++ rng-tools-3/rngd.c 2012-01-12 15:15:36.204182216 +0100
@@ -58,6 +58,7 @@
/* Background/daemon mode */
int am_daemon; /* Nonzero if we went daemon */
+int ignorefail; /*Nonzero if we ignore MAX_RNG_FAILURES */
/* Command line arguments and processing */
const char *argp_program_version =
@@ -75,6 +76,8 @@ static char doc[] =
static struct argp_option options[] = {
{ "foreground", 'f', 0, 0, "Do not fork and become a daemon" },
+ { "ignorefail", 'i', 0, 0, "Ignore repeated fips failures" },
+
{ "background", 'b', 0, 0, "Become a daemon (default)" },
{ "random-device", 'o', "file", 0,
@@ -103,6 +106,7 @@ static struct arguments default_argument
.random_step = 64,
.fill_watermark = 2048,
.daemon = 1,
+ .ignorefail = 0,
.enable_tpm = 1,
};
struct arguments *arguments = &default_arguments;
@@ -148,6 +152,9 @@ static error_t parse_opt (int key, char
case 'b':
arguments->daemon = 1;
break;
+ case 'i':
+ arguments->ignorefail = 1;
+ break;
case 's':
if (sscanf(arg, "%i", &arguments->random_step) == 0)
argp_usage(state);
@@ -230,7 +237,7 @@ static void do_loop(int random_step, dou
continue; /* succeeded, work done */
iter->failures++;
- if (iter->failures == MAX_RNG_FAILURES) {
+ if (iter->failures == MAX_RNG_FAILURES && (!ignorefail)) {
message(LOG_DAEMON|LOG_ERR,
"too many FIPS failures, disabling entropy source\n");
iter->disabled = true;
@@ -281,6 +288,9 @@ int main(int argc, char **argv)
openlog("rngd", 0, LOG_DAEMON);
}
+ if (arguments->ignorefail)
+ ignorefail = 1;
+
do_loop(arguments->random_step,
arguments->poll_timeout ? : -1.0);
diff -up rng-tools-3/rngd.h.ignorefail rng-tools-3/rngd.h
--- rng-tools-3/rngd.h.ignorefail 2012-01-12 15:14:06.195307482 +0100
+++ rng-tools-3/rngd.h 2012-01-12 15:14:06.237306958 +0100
@@ -46,6 +46,7 @@ struct arguments {
double poll_timeout;
int daemon;
+ int ignorefail;
int enable_tpm;
};
extern struct arguments *arguments;