|  | #!/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[@]}" |