1#!/bin/sh
2### BEGIN INIT INFO
3# Provides:          urandom
4# Required-Start:    $local_fs mountvirtfs
5# Required-Stop:     $local_fs
6# Default-Start:     S
7# Default-Stop:      0 6
8# Short-Description: Save and restore the random seed
9# Description:       Save the random seed on shutdown and restore it on boot,
10#                    to ensure that the seed isn't predicable on startup
11#                    (because the boot process is predictable)
12### END INIT INFO
13
14test -c /dev/urandom || exit 0
15
16RANDOM_SEED_FILE=/var/lib/urandom/random-seed
17
18. /etc/default/rcS
19[ -f /etc/default/urandom ] && . /etc/default/urandom
20
21case "$1" in
22	start|"")
23		test "$VERBOSE" != no && echo "Initializing random number generator..."
24		# Load and then save 512 bytes, which is the size of the entropy
25		# pool. Also load the current date, in case the seed file is
26		# empty.
27		( date +%s.%N; [ -f "$RANDOM_SEED_FILE" ] && cat "$RANDOM_SEED_FILE" ) \
28			>/dev/urandom
29		rm -f "$RANDOM_SEED_FILE"
30		umask 077
31		dd if=/dev/urandom of=$RANDOM_SEED_FILE count=1 \
32			>/dev/null 2>&1 || echo "urandom start: failed."
33		umask 022
34		;;
35	stop)
36		# Carry a random seed from shut-down to start-up;
37		# see documentation in linux/drivers/char/random.c
38		test "$VERBOSE" != no && echo "Saving random seed..."
39		umask 077
40		dd if=/dev/urandom of=$RANDOM_SEED_FILE count=1 \
41			>/dev/null 2>&1 || echo "urandom stop: failed."
42		;;
43	*)
44		echo "Usage: urandom {start|stop}" >&2
45		exit 1
46		;;
47esac
48
49exit 0
50