1 1.1.4.2 yamt #!/bin/sh 2 1.1.4.2 yamt # 3 1.1.4.5 yamt # $NetBSD: random_seed,v 1.1.4.5 2013/01/23 00:04:31 yamt Exp $ 4 1.1.4.2 yamt # 5 1.1.4.2 yamt 6 1.1.4.2 yamt # PROVIDE: random_seed 7 1.1.4.2 yamt # REQUIRE: mountcritlocal 8 1.1.4.2 yamt # BEFORE: securelevel 9 1.1.4.4 yamt # BEFORE: bootconf 10 1.1.4.2 yamt # KEYWORD: shutdown 11 1.1.4.4 yamt # 12 1.1.4.4 yamt # The "BEFORE: securelevel" is a real dependency, in that 13 1.1.4.4 yamt # this script won't work if run after the securelevel is changed. 14 1.1.4.4 yamt # 15 1.1.4.4 yamt # The "BEFORE: bootconf" is intended to cause this to 16 1.1.4.5 yamt # be the first script that runs after mountcritlocal. 17 1.1.4.2 yamt 18 1.1.4.2 yamt $_rc_subr_loaded . /etc/rc.subr 19 1.1.4.2 yamt 20 1.1.4.2 yamt name="random_seed" 21 1.1.4.2 yamt rcvar=$name 22 1.1.4.2 yamt start_cmd="random_load" 23 1.1.4.2 yamt stop_cmd="random_save" 24 1.1.4.2 yamt 25 1.1.4.5 yamt random_file="${random_file:-/var/db/entropy-file}" 26 1.1.4.5 yamt 27 1.1.4.5 yamt message() 28 1.1.4.5 yamt { 29 1.1.4.5 yamt echo "${name}: ${random_file}: $@" 1>&2 30 1.1.4.5 yamt } 31 1.1.4.5 yamt 32 1.1.4.5 yamt getfstype() { 33 1.1.4.5 yamt df -G "$1" | while read line; do 34 1.1.4.5 yamt set -- $line 35 1.1.4.5 yamt if [ "$2" = "fstype" ]; then 36 1.1.4.5 yamt echo "$1" 37 1.1.4.5 yamt return 38 1.1.4.5 yamt fi 39 1.1.4.5 yamt done 40 1.1.4.5 yamt } 41 1.1.4.2 yamt 42 1.1.4.2 yamt fs_safe() 43 1.1.4.2 yamt { 44 1.1.4.2 yamt # 45 1.1.4.2 yamt # Enforce that the file's on a local filesystem. 46 1.1.4.2 yamt # Include only the types we can actually write. 47 1.1.4.2 yamt # 48 1.1.4.5 yamt fstype="$(getfstype "$1")" 49 1.1.4.5 yamt case "${fstype}" in 50 1.1.4.5 yamt ffs|lfs|ext2fs|msdos|v7fs) 51 1.1.4.2 yamt return 0 52 1.1.4.2 yamt ;; 53 1.1.4.5 yamt *) 54 1.1.4.5 yamt message "Bad filesystem type ${fstype}" 55 1.1.4.5 yamt return 1 56 1.1.4.2 yamt ;; 57 1.1.4.5 yamt esac 58 1.1.4.2 yamt } 59 1.1.4.2 yamt 60 1.1.4.2 yamt random_load() 61 1.1.4.2 yamt { 62 1.1.4.5 yamt if [ ! -f "${random_file}" ]; then 63 1.1.4.5 yamt message "Not present" 64 1.1.4.5 yamt return 65 1.1.4.5 yamt fi 66 1.1.4.2 yamt 67 1.1.4.5 yamt if ! fs_safe "$(dirname "${random_file}")"; then 68 1.1.4.5 yamt return 1 69 1.1.4.5 yamt fi 70 1.1.4.2 yamt 71 1.1.4.5 yamt set -- $(ls -ldn "${random_file}") 72 1.1.4.5 yamt st_mode="$1" # should be "-rw-------" 73 1.1.4.5 yamt st_uid="$3" # should be "0" for root 74 1.1.4.5 yamt 75 1.1.4.5 yamt # The file must be owned by root, 76 1.1.4.5 yamt if [ "$st_uid" != "0" ]; then 77 1.1.4.5 yamt message "Bad owner ${st_uid}" 78 1.1.4.5 yamt return 1 79 1.1.4.5 yamt fi 80 1.1.4.5 yamt # and root read/write only. 81 1.1.4.5 yamt if [ "$st_mode" != "-rw-------" ]; then 82 1.1.4.5 yamt message "Bad mode ${st_mode}" 83 1.1.4.5 yamt return 1 84 1.1.4.5 yamt fi 85 1.1.4.2 yamt 86 1.1.4.5 yamt if rndctl -L "${random_file}"; then 87 1.1.4.5 yamt echo "Loaded entropy from ${random_file}." 88 1.1.4.2 yamt fi 89 1.1.4.2 yamt } 90 1.1.4.2 yamt 91 1.1.4.2 yamt random_save() 92 1.1.4.2 yamt { 93 1.1.4.5 yamt oum="$(umask)" 94 1.1.4.2 yamt umask 077 95 1.1.4.2 yamt 96 1.1.4.5 yamt rm -Pf "${random_file}" 97 1.1.4.2 yamt 98 1.1.4.5 yamt if ! fs_safe "$(dirname "${random_file}")"; then 99 1.1.4.5 yamt umask "${oum}" 100 1.1.4.2 yamt return 1 101 1.1.4.2 yamt fi 102 1.1.4.2 yamt 103 1.1.4.5 yamt if rndctl -S "${random_file}"; then 104 1.1.4.5 yamt echo "Saved entropy to ${random_file}." 105 1.1.4.2 yamt fi 106 1.1.4.5 yamt umask "${oum}" 107 1.1.4.2 yamt } 108 1.1.4.2 yamt 109 1.1.4.2 yamt 110 1.1.4.5 yamt load_rc_config "${name}" 111 1.1.4.2 yamt run_rc_command "$1" 112