198184Sgordon#!/bin/sh
298184Sgordon#
398184Sgordon# $FreeBSD$
498184Sgordon#
598184Sgordon
698184Sgordon# PROVIDE: initrandom
7208307Sdougb# REQUIRE: dumpon ddb
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
32178423Sru		if [ -w /dev/random ]; then
33178423Sru			if checkyesno harvest_interrupt; then
34220153Semaste				${SYSCTL} kern.random.sys.harvest.interrupt=1 >/dev/null
35128060Smarkm				echo -n ' interrupts'
36178423Sru			else
37220153Semaste				${SYSCTL} kern.random.sys.harvest.interrupt=0 >/dev/null
38128060Smarkm			fi
3998184Sgordon
40178423Sru			if checkyesno harvest_ethernet; then
41220153Semaste				${SYSCTL} kern.random.sys.harvest.ethernet=1 >/dev/null
42128060Smarkm				echo -n ' ethernet'
43178423Sru			else
44220153Semaste				${SYSCTL} kern.random.sys.harvest.ethernet=0 >/dev/null
45128060Smarkm			fi
4698184Sgordon
47178423Sru			if checkyesno harvest_p_to_p; then
48220153Semaste				${SYSCTL} kern.random.sys.harvest.point_to_point=1 >/dev/null
49128060Smarkm				echo -n ' point_to_point'
50178423Sru			else
51220153Semaste				${SYSCTL} kern.random.sys.harvest.point_to_point=0 >/dev/null
52128060Smarkm			fi
5398184Sgordon		fi
54128060Smarkm
55128060Smarkm		# XXX temporary until we can improve the entropy
56128060Smarkm		# harvesting rate.
57128060Smarkm		# Entropy below is not great, but better than nothing.
58128060Smarkm		# This unblocks the generator at startup
59169924Srse		( ps -fauxww; sysctl -a; date; df -ib; dmesg; ps -fauxww ) \
60128060Smarkm		    | dd of=/dev/random bs=8k 2>/dev/null
61128060Smarkm		cat /bin/ls | dd of=/dev/random bs=8k 2>/dev/null
62128060Smarkm
63128060Smarkm		# First pass at reseeding /dev/random.
64128060Smarkm		#
65128060Smarkm		case ${entropy_file} in
66128060Smarkm		[Nn][Oo] | '')
67128060Smarkm			;;
68128060Smarkm		*)
69128060Smarkm			if [ -w /dev/random ]; then
70128060Smarkm				feed_dev_random "${entropy_file}"
71128060Smarkm			fi
72128060Smarkm			;;
73128060Smarkm		esac
74128060Smarkm
75128060Smarkm		echo -n ' kickstart'
7698184Sgordon	fi
7798184Sgordon
7898184Sgordon	echo '.'
7998184Sgordon}
8098184Sgordon
8198184Sgordonload_rc_config random
8298184Sgordonrun_rc_command "$1"
83