blob: 14d0ed41406c1d41d6e345edf76ddf67d26141d1 [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 "basic configuration" parameters for jitterentropy.
#
# The parameters in question are pseudorandom loop counts and data processing. For more details, see
# docs/jitterentropy/config-basic.md.
#
# This script tests two axes:
# loop counts: { pseudorandom, max, min}
# data processing: { on, off}
#
# The loop counts axis is reflected in the values of 'kernel.jitterentropy.ml' and
# 'kernel.jitterentropy.ll'. For pseudorandom, both are set to 0. For max, both are set to the
# maximum values that pseudorandom can output, namely 'ml = 128' and 'll = 16'. For min, both are
# set to the minimum values that pseudorandom can output, namely 'ml = 1' and 'll = 1'.
#
# The data processing axis is reflected in the value of 'kernel.jitterentropy.raw'. When data
# processing is on, 'raw = false' and when data processing is off, 'raw = true'.
#
# This script requires an output directory, passed as the first (and only) non-option command line
# argument. There are also a number of options, described in the HELP function below.
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 " -c <count> : jitterentropy block count [default: 1024]" >&2
echo " -i <iters> : times to repeat tests [default: 10]" >&2
echo " -s <size> : jitterentropy block size [default: 64]" >&2
echo " : (this replaces the '-s <source>' option below; this" >&2
echo " : script always uses jitterentropy as its source)" >&2
echo >&2
"$ZIRCONDIR"/scripts/entropy-test/repeat-boot-test -h -h
exit 1
}
BLOCK_COUNT=1024
BLOCK_SIZE=64
ITERS=10
PASSTHROUGH_ARGS=()
# separate out our options from the repeat-boot-test options
while [[ $# -gt 0 ]]; do
case "$1" in
-c)
if [[ $# -lt 2 ]]; then echo "-c missing count" >&2; HELP; fi
BLOCK_COUNT="$2"
shift 2
;;
-h)
HELP
;;
-i)
if [[ $# -lt 2 ]]; then echo "-i missing iters" >&2; HELP; fi
ITERS="$2"
shift 2
;;
-s)
if [[ $# -lt 2 ]]; then echo "-s missing size" >&2; HELP; fi
BLOCK_SIZE="$2"
shift 2
;;
*)
PASSTHROUGH_ARGS+=("$1")
shift
;;
esac
done
BASE_CMDLINE="kernel.jitterentropy.bc=$BLOCK_COUNT kernel.jitterentropy.bs=$BLOCK_SIZE"
AXIS_1=(
"kernel.jitterentropy.ml=0 kernel.jitterentropy.ll=0"
"kernel.jitterentropy.ml=128 kernel.jitterentropy.ll=16"
"kernel.jitterentropy.ml=1 kernel.jitterentropy.ll=1"
)
AXIS_2=(
"kernel.jitterentropy.raw=true"
"kernel.jitterentropy.raw=false"
)
# build the cmdlines
readarray -t CMDLINES < <(
for ((i = 0; i < ITERS; i++)); do
for v1 in "${AXIS_1[@]}"; do for v2 in "${AXIS_2[@]}"; do
CMDLINE="$BASE_CMDLINE $v1 $v2"
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[@]}"