#!/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] " >&2 echo >&2 echo "Jitterentropy-specific options:" >&2 echo " -c : jitterentropy block count [default: 1024]" >&2 echo " -i : times to repeat tests [default: 10]" >&2 echo " -s : jitterentropy block size [default: 64]" >&2 echo " : (this replaces the '-s ' 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[@]}"