#!/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] " >&2 echo >&2 echo "Jitterentropy-specific options:" >&2 echo " -i : times to repeat tests [default: ]" >&2 echo " --ll-seq ' ... '" >&2 echo " --ml-seq ' ... '" >&2 echo " --bs-seq ' ... '" >&2 echo " --bc-seq ' ... '" >&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[@]}"