initrandom revision 240108
1#!/bin/sh
2#
3# $FreeBSD: head/etc/rc.d/initrandom 240108 2012-09-04 21:47:09Z obrien $
4#
5
6# PROVIDE: initrandom
7# REQUIRE: dumpon ddb
8# BEFORE: disks
9# KEYWORD: nojail
10
11. /etc/rc.subr
12
13name="initrandom"
14start_cmd="initrandom_start"
15stop_cmd=":"
16
17feed_dev_random()
18{
19	if [ -f "${1}" -a -r "${1}" -a -s "${1}" ]; then
20		cat "${1}" | dd of=/dev/random bs=8k 2>/dev/null
21	fi
22}
23
24better_than_nothing()
25{
26	# XXX temporary until we can improve the entropy
27	# harvesting rate.
28	# Entropy below is not great, but better than nothing.
29	# This unblocks the generator at startup
30	# Note: commands are ordered to cause the most variance across reboots.
31	( kenv; dmesg; df -ib; ps -fauxww; date; sysctl -a ) \
32	    | dd of=/dev/random bs=8k 2>/dev/null
33	/sbin/sha256 -q `sysctl -n kern.bootfile` \
34	    | dd of=/dev/random bs=8k 2>/dev/null
35}
36
37initrandom_start()
38{
39	soft_random_generator=`sysctl kern.random 2>/dev/null`
40
41	echo -n 'Entropy harvesting:'
42
43	if [ \! -z "${soft_random_generator}" ] ; then
44
45		if [ -w /dev/random ]; then
46			if checkyesno harvest_interrupt; then
47				${SYSCTL} kern.random.sys.harvest.interrupt=1 >/dev/null
48				echo -n ' interrupts'
49			else
50				${SYSCTL} kern.random.sys.harvest.interrupt=0 >/dev/null
51			fi
52
53			if checkyesno harvest_ethernet; then
54				${SYSCTL} kern.random.sys.harvest.ethernet=1 >/dev/null
55				echo -n ' ethernet'
56			else
57				${SYSCTL} kern.random.sys.harvest.ethernet=0 >/dev/null
58			fi
59
60			if checkyesno harvest_p_to_p; then
61				${SYSCTL} kern.random.sys.harvest.point_to_point=1 >/dev/null
62				echo -n ' point_to_point'
63			else
64				${SYSCTL} kern.random.sys.harvest.point_to_point=0 >/dev/null
65			fi
66		fi
67
68		# First pass at reseeding /dev/random.
69		#
70		case ${entropy_file} in
71		[Nn][Oo] | '')
72			;;
73		*)
74			if [ -w /dev/random ]; then
75				feed_dev_random "${entropy_file}"
76			fi
77			;;
78		esac
79
80		better_than_nothing
81
82		echo -n ' kickstart'
83	fi
84
85	echo '.'
86}
87
88load_rc_config random
89run_rc_command "$1"
90