initrandom revision 136224
198184Sgordon#!/bin/sh
298184Sgordon#
398184Sgordon# $FreeBSD: head/etc/rc.d/initrandom 136224 2004-10-07 13:55:26Z mtm $
498184Sgordon#
598184Sgordon
698184Sgordon# PROVIDE: initrandom
798184Sgordon# REQUIRE: initdiskless
898184Sgordon# BEFORE: disks
9136224Smtm# KEYWORD: nojail
1098184Sgordon
1198184Sgordon. /etc/rc.subr
1298184Sgordon
1398184Sgordonname="initrandom"
1498184Sgordonstart_cmd="initrandom_start"
1598184Sgordonstop_cmd=":"
1698184Sgordon
1798184Sgordonfeed_dev_random()
1898184Sgordon{
1998184Sgordon	if [ -f "${1}" -a -r "${1}" -a -s "${1}" ]; then
2098184Sgordon		cat "${1}" | dd of=/dev/random bs=8k 2>/dev/null
2198184Sgordon	fi
2298184Sgordon}
2398184Sgordon
2498184Sgordoninitrandom_start()
2598184Sgordon{
26128060Smarkm	soft_random_generator=`sysctl kern.random 2>/dev/null`
27128060Smarkm
2898184Sgordon	echo -n 'Entropy harvesting:'
2998184Sgordon
30128060Smarkm	if [ \! -z "${soft_random_generator}" ] ; then
31128060Smarkm
32128060Smarkm		if checkyesno harvest_interrupt; then
33128060Smarkm			if [ -w /dev/random ]; then
34128060Smarkm				${SYSCTL_W} kern.random.sys.harvest.interrupt=1 >/dev/null
35128060Smarkm				echo -n ' interrupts'
36128060Smarkm			fi
3798184Sgordon		fi
3898184Sgordon
39128060Smarkm		if checkyesno harvest_ethernet; then
40128060Smarkm			if [ -w /dev/random ]; then
41128060Smarkm				${SYSCTL_W} kern.random.sys.harvest.ethernet=1 >/dev/null
42128060Smarkm				echo -n ' ethernet'
43128060Smarkm			fi
4498184Sgordon		fi
4598184Sgordon
46128060Smarkm		if checkyesno harvest_p_to_p; then
47128060Smarkm			if [ -w /dev/random ]; then
48128060Smarkm			${SYSCTL_W} kern.random.sys.harvest.point_to_point=1 >/dev/null
49128060Smarkm				echo -n ' point_to_point'
50128060Smarkm			fi
5198184Sgordon		fi
52128060Smarkm
53128060Smarkm		# XXX temporary until we can improve the entropy
54128060Smarkm		# harvesting rate.
55128060Smarkm		# Entropy below is not great, but better than nothing.
56128060Smarkm		# This unblocks the generator at startup
57128060Smarkm		( ps -fauxww; sysctl -a; date; df -ib; dmesg; ps -fauxww; ) \
58128060Smarkm		    | dd of=/dev/random bs=8k 2>/dev/null
59128060Smarkm		cat /bin/ls | dd of=/dev/random bs=8k 2>/dev/null
60128060Smarkm
61128060Smarkm		# First pass at reseeding /dev/random.
62128060Smarkm		#
63128060Smarkm		case ${entropy_file} in
64128060Smarkm		[Nn][Oo] | '')
65128060Smarkm			;;
66128060Smarkm		*)
67128060Smarkm			if [ -w /dev/random ]; then
68128060Smarkm				feed_dev_random "${entropy_file}"
69128060Smarkm			fi
70128060Smarkm			;;
71128060Smarkm		esac
72128060Smarkm
73128060Smarkm		echo -n ' kickstart'
7498184Sgordon	fi
7598184Sgordon
7698184Sgordon	echo '.'
7798184Sgordon}
7898184Sgordon
7998184Sgordonload_rc_config random
8098184Sgordonrun_rc_command "$1"
81