xref: /freebsd-13.1/libexec/rc/rc.d/random (revision 26c49788)
10696600cSBjoern A. Zeeb#!/bin/sh
20696600cSBjoern A. Zeeb#
30696600cSBjoern A. Zeeb# $FreeBSD$
40696600cSBjoern A. Zeeb#
50696600cSBjoern A. Zeeb
60696600cSBjoern A. Zeeb# PROVIDE: random
70696600cSBjoern A. Zeeb# REQUIRE: FILESYSTEMS
80696600cSBjoern A. Zeeb# BEFORE: netif
90696600cSBjoern A. Zeeb# KEYWORD: nojail shutdown
100696600cSBjoern A. Zeeb
110696600cSBjoern A. Zeeb. /etc/rc.subr
120696600cSBjoern A. Zeeb
130696600cSBjoern A. Zeebname="random"
140696600cSBjoern A. Zeebdesc="Harvest and save entropy for random device"
150696600cSBjoern A. Zeebstart_cmd="random_start"
160696600cSBjoern A. Zeebstop_cmd="random_stop"
170696600cSBjoern A. Zeeb
180696600cSBjoern A. Zeebextra_commands="saveseed"
190696600cSBjoern A. Zeebsaveseed_cmd="${name}_stop"
200696600cSBjoern A. Zeeb
210696600cSBjoern A. Zeebsave_dev_random()
220696600cSBjoern A. Zeeb{
230696600cSBjoern A. Zeeb	oumask=`umask`
240696600cSBjoern A. Zeeb	umask 077
250696600cSBjoern A. Zeeb	for f ; do
260696600cSBjoern A. Zeeb		debug "saving entropy to $f"
270696600cSBjoern A. Zeeb		dd if=/dev/random of="$f" bs=4096 count=1 status=none &&
28*26c49788SConrad Meyer			( chflags nodump "$f" 2>/dev/null || : ) &&
29c849485dSConrad Meyer			chmod 600 "$f" &&
30c849485dSConrad Meyer			fsync "$f" "$(dirname "$f")"
310696600cSBjoern A. Zeeb	done
320696600cSBjoern A. Zeeb	umask ${oumask}
330696600cSBjoern A. Zeeb}
340696600cSBjoern A. Zeeb
350696600cSBjoern A. Zeebfeed_dev_random()
360696600cSBjoern A. Zeeb{
370696600cSBjoern A. Zeeb	for f ; do
380696600cSBjoern A. Zeeb		if [ -f "$f" -a -r "$f" -a -s "$f" ] ; then
390696600cSBjoern A. Zeeb			if dd if="$f" of=/dev/random bs=4096 2>/dev/null ; then
400696600cSBjoern A. Zeeb				debug "entropy read from $f"
410696600cSBjoern A. Zeeb				rm -f "$f"
420696600cSBjoern A. Zeeb			fi
430696600cSBjoern A. Zeeb		fi
440696600cSBjoern A. Zeeb	done
450696600cSBjoern A. Zeeb}
460696600cSBjoern A. Zeeb
470696600cSBjoern A. Zeebrandom_start()
480696600cSBjoern A. Zeeb{
490696600cSBjoern A. Zeeb
500696600cSBjoern A. Zeeb	if [ ${harvest_mask} -gt 0 ]; then
510696600cSBjoern A. Zeeb		echo -n 'Setting up harvesting: '
520696600cSBjoern A. Zeeb		${SYSCTL} kern.random.harvest.mask=${harvest_mask} > /dev/null
530696600cSBjoern A. Zeeb		${SYSCTL_N} kern.random.harvest.mask_symbolic
540696600cSBjoern A. Zeeb	fi
550696600cSBjoern A. Zeeb
560696600cSBjoern A. Zeeb	echo -n 'Feeding entropy: '
570696600cSBjoern A. Zeeb
580696600cSBjoern A. Zeeb	if [ ! -w /dev/random ] ; then
590696600cSBjoern A. Zeeb		warn "/dev/random is not writeable"
600696600cSBjoern A. Zeeb		return 1
610696600cSBjoern A. Zeeb	fi
620696600cSBjoern A. Zeeb
630696600cSBjoern A. Zeeb	# Reseed /dev/random with previously stored entropy.
640696600cSBjoern A. Zeeb	case ${entropy_dir:=/var/db/entropy} in
650696600cSBjoern A. Zeeb	[Nn][Oo])
660696600cSBjoern A. Zeeb		;;
670696600cSBjoern A. Zeeb	*)
680696600cSBjoern A. Zeeb		if [ -d "${entropy_dir}" ] ; then
690696600cSBjoern A. Zeeb			feed_dev_random "${entropy_dir}"/*
700696600cSBjoern A. Zeeb		fi
710696600cSBjoern A. Zeeb		;;
720696600cSBjoern A. Zeeb	esac
730696600cSBjoern A. Zeeb
740696600cSBjoern A. Zeeb	case ${entropy_file:=/entropy} in
750696600cSBjoern A. Zeeb	[Nn][Oo])
760696600cSBjoern A. Zeeb		;;
770696600cSBjoern A. Zeeb	*)
780696600cSBjoern A. Zeeb		feed_dev_random "${entropy_file}" /var/db/entropy-file
790696600cSBjoern A. Zeeb		save_dev_random "${entropy_file}"
800696600cSBjoern A. Zeeb		;;
810696600cSBjoern A. Zeeb	esac
820696600cSBjoern A. Zeeb
830696600cSBjoern A. Zeeb	case ${entropy_boot_file:=/boot/entropy} in
840696600cSBjoern A. Zeeb	[Nn][Oo])
850696600cSBjoern A. Zeeb		;;
860696600cSBjoern A. Zeeb	*)
870696600cSBjoern A. Zeeb		save_dev_random "${entropy_boot_file}"
880696600cSBjoern A. Zeeb		;;
890696600cSBjoern A. Zeeb	esac
900696600cSBjoern A. Zeeb
910696600cSBjoern A. Zeeb	echo '.'
920696600cSBjoern A. Zeeb}
930696600cSBjoern A. Zeeb
940696600cSBjoern A. Zeebrandom_stop()
950696600cSBjoern A. Zeeb{
960696600cSBjoern A. Zeeb	# Write some entropy so when the machine reboots /dev/random
970696600cSBjoern A. Zeeb	# can be reseeded
980696600cSBjoern A. Zeeb	#
990696600cSBjoern A. Zeeb	case ${entropy_file:=/entropy} in
1000696600cSBjoern A. Zeeb	[Nn][Oo])
1010696600cSBjoern A. Zeeb		;;
1020696600cSBjoern A. Zeeb	*)
1030696600cSBjoern A. Zeeb		echo -n 'Writing entropy file: '
1040696600cSBjoern A. Zeeb		rm -f ${entropy_file} 2> /dev/null
1050696600cSBjoern A. Zeeb		oumask=`umask`
1060696600cSBjoern A. Zeeb		umask 077
1070696600cSBjoern A. Zeeb		if touch ${entropy_file} 2> /dev/null; then
1080696600cSBjoern A. Zeeb			entropy_file_confirmed="${entropy_file}"
1090696600cSBjoern A. Zeeb		else
1100696600cSBjoern A. Zeeb			# Try this as a reasonable alternative for read-only
1110696600cSBjoern A. Zeeb			# roots, diskless workstations, etc.
1120696600cSBjoern A. Zeeb			rm -f /var/db/entropy-file 2> /dev/null
1130696600cSBjoern A. Zeeb			if touch /var/db/entropy-file 2> /dev/null; then
1140696600cSBjoern A. Zeeb				entropy_file_confirmed=/var/db/entropy-file
1150696600cSBjoern A. Zeeb			fi
1160696600cSBjoern A. Zeeb		fi
1170696600cSBjoern A. Zeeb		case ${entropy_file_confirmed} in
1180696600cSBjoern A. Zeeb		'')
1190696600cSBjoern A. Zeeb			warn 'write failed (read-only fs?)'
1200696600cSBjoern A. Zeeb			;;
1210696600cSBjoern A. Zeeb		*)
122*26c49788SConrad Meyer			save_dev_random "${entropy_file_confirmed}"
1230696600cSBjoern A. Zeeb			echo '.'
1240696600cSBjoern A. Zeeb			;;
1250696600cSBjoern A. Zeeb		esac
1260696600cSBjoern A. Zeeb		umask ${oumask}
1270696600cSBjoern A. Zeeb		;;
1280696600cSBjoern A. Zeeb	esac
1290696600cSBjoern A. Zeeb	case ${entropy_boot_file:=/boot/entropy} in
1300696600cSBjoern A. Zeeb	[Nn][Oo])
1310696600cSBjoern A. Zeeb		;;
1320696600cSBjoern A. Zeeb	*)
1330696600cSBjoern A. Zeeb		echo -n 'Writing early boot entropy file: '
1340696600cSBjoern A. Zeeb		rm -f ${entropy_boot_file} 2> /dev/null
1350696600cSBjoern A. Zeeb		oumask=`umask`
1360696600cSBjoern A. Zeeb		umask 077
1370696600cSBjoern A. Zeeb		if touch ${entropy_boot_file} 2> /dev/null; then
1380696600cSBjoern A. Zeeb			entropy_boot_file_confirmed="${entropy_boot_file}"
1390696600cSBjoern A. Zeeb		fi
1400696600cSBjoern A. Zeeb		case ${entropy_boot_file_confirmed} in
1410696600cSBjoern A. Zeeb		'')
1420696600cSBjoern A. Zeeb			warn 'write failed (read-only fs?)'
1430696600cSBjoern A. Zeeb			;;
1440696600cSBjoern A. Zeeb		*)
145*26c49788SConrad Meyer			save_dev_random "${entropy_boot_file_confirmed}"
1460696600cSBjoern A. Zeeb			echo '.'
1470696600cSBjoern A. Zeeb			;;
1480696600cSBjoern A. Zeeb		esac
1490696600cSBjoern A. Zeeb		umask ${oumask}
1500696600cSBjoern A. Zeeb		;;
1510696600cSBjoern A. Zeeb	esac
1520696600cSBjoern A. Zeeb}
1530696600cSBjoern A. Zeeb
1540696600cSBjoern A. Zeebload_rc_config $name
1550696600cSBjoern A. Zeebrun_rc_command "$1"
156