blob: f6e1640517fde80b8f3135a51ba4d33b5708f38d [file] [log] [blame]
#!/bin/bash
# Copyright 2017 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT
# Test the tunable configuration parameters for jitterentropy.
#
# The parameters in question are LFSR loop count (kernel.jitterentropy.ll), memory access loop count
# (kernel.jitterentropy.ml), memory block size (kernel.jitterentropy.bs), and memory block count
# (kernel.jitterentropy.bc). See docs/jitterentropy/config-tuning.md for more information.
set -e -u
CDPATH=
ZIRCONDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../../.." && pwd )"
# Print help message and exit
function HELP {
echo "$0 [options] <output-dir>" >&2
echo >&2
echo "Jitterentropy-specific options:" >&2
echo " -i <iters> : times to repeat tests [default: ]" >&2
echo " --ll-seq '<N1> <N2> ... <Nk>'" >&2
echo " --ml-seq '<N1> <N2> ... <Nk>'" >&2
echo " --bs-seq '<N1> <N2> ... <Nk>'" >&2
echo " --bc-seq '<N1> <N2> ... <Nk>'" >&2
echo " : sequence of values to use for jitterentropy parameters" >&2
echo " : Default (for each one): '1'" >&2
echo " : Note: the argument should be a single string, with several" >&2
echo " : space-separated numbers in it. In bash, use quotes, e.g." >&2
echo " : $0 \\" >&2
echo " : --ll-seq '1 2 3 4' --ml-seq '1 4 16 256' \\" >&2
echo " : --bs-seq '64' --bc-seq '512'" >&2
echo " : That command will test 16 configurations, with 'll' and" >&2
echo " : 'ml' varying, and 'bs' and 'bc' help constant." >&2
echo >&2
"$ZIRCONDIR"/scripts/entropy-test/repeat-boot-test -h -h
exit 1
}
function VERIFY_SEQ {
if [[ $# -eq 0 ]]; then
echo "empty sequence not allowed" >&2
HELP
fi
for val in "$@"; do
if ! grep '^[0-9]\+$' >/dev/null 2>&1 <<<"$val"; then
echo "invalid value '$val' in sequence" >&2
HELP
fi
done
}
ITERS=10
LL_SEQ=(1)
ML_SEQ=(1)
BS_SEQ=(1)
BC_SEQ=(1)
PASSTHROUGH_ARGS=()
# separate out our options from the repeat-boot-test options
while [[ $# -gt 0 ]]; do
case "$1" in
-h)
HELP
;;
-i)
if [[ $# -lt 2 ]]; then echo "-i missing iters" >&2; HELP; fi
ITERS="$2"
shift 2
;;
--ll-seq)
if [[ $# -lt 2 ]]; then echo "--ll-seq missing seq" >&2; HELP; fi
read -ra LL_SEQ <<<"$2"
VERIFY_SEQ "${LL_SEQ[@]+"${LL_SEQ[@]}"}"
shift 2
;;
--ml-seq)
if [[ $# -lt 2 ]]; then echo "--ml-seq missing seq" >&2; HELP; fi
read -ra ML_SEQ <<<"$2"
VERIFY_SEQ "${ML_SEQ[@]+"${ML_SEQ[@]}"}"
shift 2
;;
--bs-seq)
if [[ $# -lt 2 ]]; then echo "--bs-seq missing seq" >&2; HELP; fi
read -ra BS_SEQ <<<"$2"
VERIFY_SEQ "${BS_SEQ[@]+"${BS_SEQ[@]}"}"
shift 2
;;
--bc-seq)
if [[ $# -lt 2 ]]; then echo "--bc-seq missing seq" >&2; HELP; fi
read -ra BC_SEQ <<<"$2"
VERIFY_SEQ "${BC_SEQ[@]+"${BC_SEQ[@]}"}"
shift 2
;;
*)
PASSTHROUGH_ARGS+=("$1")
shift
;;
esac
done
BASE_CMDLINE="kernel.jitterentropy.raw=true"
# build the cmdlines
readarray -t CMDLINES < <(
for ((i = 0; i < ITERS; i++)); do
for ll in "${LL_SEQ[@]}"; do for ml in "${ML_SEQ[@]}"; do
for bs in "${BS_SEQ[@]}"; do for bc in "${BC_SEQ[@]}"; do
CMDLINE="$BASE_CMDLINE"
CMDLINE+=" kernel.jitterentropy.ll=$ll kernel.jitterentropy.ml=$ml"
CMDLINE+=" kernel.jitterentropy.bs=$bs kernel.jitterentropy.bc=$bc"
echo "$CMDLINE"
done; done
done
)
# run the tests
# The unholy incantation around PASSTHOROUGH_ARGS comes from here:
# https://stackoverflow.com/a/7577209
# TL;DR: In bash, an array is only considered 'set' if it has at least one item. Without the
# nonsense below, if PASSTHROUGH_ARGS is empty (which is legitimate!), then `set -u` will throw.
"$ZIRCONDIR"/scripts/entropy-test/repeat-boot-test \
"${PASSTHROUGH_ARGS[@]+"${PASSTHROUGH_ARGS[@]}"}" \
-s "jitterentropy" -- "${CMDLINES[@]}"