#! /bin/sh ### BEGIN INIT INFO # Provides: urandom # Required-Start: $local_fs $time # Required-Stop: $local_fs # Default-Start: S # Default-Stop: 0 6 # Short-Description: Save and restore random seed between restarts. # Description: This script saves the random seed between restarts. # It is called from the boot, halt and reboot scripts. ### END INIT INFO ## Assumption 1: We assume $SAVEDFILE is a file (or a symlink ## to a file) that resides on a non-volatile medium that persists ## across reboots. ## Case 1a: Ideally, it is readable and writeable. Its is unshared, ## i.e. its contents are unique to this machine. It is protected so ## that its contents are not known to attackers. ## Case 1b: Less than ideally, it is read-only. Its contents are ## unique to this machine and not known to attackers. global SAVEDFILE := '/var/lib/urandom/random-seed' test -c /dev/urandom || exit 0 global PATH := '/sbin:/bin' if ! global POOLBYTES := $( ($(cat /proc/sys/kernel/random/poolsize 2>/dev/null) + 7) / 8 ) { global POOLBYTES := '512' } source /lib/init/vars.sh source /lib/lsb/init-functions proc do_status { if test -f $SAVEDFILE { return 0 } else { return 4 } } matchstr $1 { start|"" { test $VERBOSE = no || log_action_begin_msg "Initializing random number generator" # Seed the RNG with date and time. # This is helpful in the less-than-ideal case where $SAVEDFILE # is read-only. # The value of this is greatly reduced if $SAVEDFILE is missing, # or its contents are shared machine-to-machine or known to # attackers (since they might well know at what time this # machine booted up). shell { date +%s.%N # Load and then save $POOLBYTES bytes, # which is the size of the entropy pool if test -f $SAVEDFILE { cat $SAVEDFILE } # Redirect output of subshell (not individual commands) # to cope with a misfeature in the FreeBSD (not Linux) # /dev/random, where every superuser write/close causes # an explicit reseed of the yarrow. } >/dev/urandom # Write a new seed into $SAVEDFILE because re-using a seed # compromises security. Each time we re-seed, we want the # seed to be as different as possible. # Write it now, in case the machine crashes without doing # an orderly shutdown. # The write will fail if $SAVEDFILE is read-only, but it # doesn't hurt to try. umask 077 dd if=/dev/urandom of=$SAVEDFILE bs=$POOLBYTES count=1 >/dev/null !2 > !1 global ES := $Status umask 022 test $VERBOSE = no || log_action_end_msg $ES } stop { # Carry a random seed from shut-down to start-up; # Write it on shutdown, in case the one written at startup # has been lost, snooped, or otherwise compromised. # see documentation in linux/drivers/char/random.c test $VERBOSE = no || log_action_begin_msg "Saving random seed" umask 077 dd if=/dev/urandom of=$SAVEDFILE bs=$POOLBYTES count=1 >/dev/null !2 > !1 global ES := $Status test $VERBOSE = no || log_action_end_msg $ES } status { do_status exit $Status } restart|reload|force-reload { echo "Error: argument '$1' not supported" > !2 exit 3 } * { echo "Usage: urandom start|stop" > !2 exit 3 } } :