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