xref: /OK3568_Linux_fs/buildroot/package/urandom-scripts/S20urandom (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1#! /bin/sh
2#
3# Preserve the random seed between reboots. See urandom(4).
4#
5
6# Quietly do nothing if /dev/urandom does not exist
7[ -c /dev/urandom ] || exit 0
8
9URANDOM_SEED="/var/lib/random-seed"
10
11# shellcheck source=/dev/null
12[ -r "/etc/default/urandom" ] && . "/etc/default/urandom"
13
14if pool_bits=$(cat /proc/sys/kernel/random/poolsize 2> /dev/null); then
15	pool_size=$((pool_bits/8))
16else
17	pool_size=512
18fi
19
20check_file_size() {
21	[ -f "$URANDOM_SEED" ] || return 1
22	# Try to read two blocks but exactly one will be read if the file has
23	# the correct size.
24	size=$(dd if="$URANDOM_SEED" bs="$pool_size" count=2 2> /dev/null | wc -c)
25	test "$size" -eq "$pool_size"
26}
27
28init_rng() {
29	if check_file_size; then
30		printf 'Initializing random number generator: '
31		dd if="$URANDOM_SEED" bs="$pool_size" of=/dev/urandom count=1 2> /dev/null
32		status=$?
33		if [ "$status" -eq 0 ]; then
34			echo "OK"
35		else
36			echo "FAIL"
37		fi
38		return "$status"
39	fi
40}
41
42save_random_seed() {
43	printf 'Saving random seed: '
44	if touch "$URANDOM_SEED" 2> /dev/null; then
45		old_umask=$(umask)
46		umask 077
47		dd if=/dev/urandom of="$URANDOM_SEED" bs="$pool_size" count=1 2> /dev/null
48		status=$?
49		umask "$old_umask"
50		if [ "$status" -eq 0 ]; then
51			echo "OK"
52		else
53			echo "FAIL"
54		fi
55	else
56		status=$?
57		echo "SKIP (read-only file system detected)"
58	fi
59	return "$status"
60}
61
62case "$1" in
63	start|restart|reload)
64		# Carry a random seed from start-up to start-up
65		# Load and then save the whole entropy pool
66		init_rng && save_random_seed;;
67	stop)
68		# Carry a random seed from shut-down to start-up
69		# Save the whole entropy pool
70		save_random_seed;;
71	*)
72		echo "Usage: $0 {start|stop|restart|reload}"
73		exit 1
74esac
75