Move common code of demo scripts into a library
The new file programs/demo_common.sh contains initialization code, utility functions and cleanup code meant to be used by all demo scripts written in sh. Initial features: * msg: Display a message. * run, run_bad: Run a command, visibly. * $root_dir, $programs_dir: location of the mbedtls source tree. * $files_to_clean: files that are cleaned up on exit. Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
This commit is contained in:
parent
2fcf04f468
commit
d1b5f6f609
2 changed files with 98 additions and 31 deletions
89
programs/demo_common.sh
Normal file
89
programs/demo_common.sh
Normal file
|
@ -0,0 +1,89 @@
|
|||
## Common shell functions used by demo scripts programs/*/*.sh.
|
||||
|
||||
## How to write a demo script
|
||||
## ==========================
|
||||
##
|
||||
## Include this file near the top of each demo script:
|
||||
## . "${0%/*}/../demo_common.sh"
|
||||
##
|
||||
## As the last thing in the script, call the cleanup function.
|
||||
##
|
||||
## You can use the functions and variables described below.
|
||||
|
||||
set -e -u
|
||||
|
||||
## $root_dir is the root directory of the Mbed TLS source tree.
|
||||
root_dir="${0%/*}"
|
||||
n=4 # limit the search depth
|
||||
while ! [ -d "$root_dir/programs" ] || ! [ -d "$root_dir/library" ]; do
|
||||
if [ $n -eq 0 ]; then
|
||||
echo >&2 "This doesn't seem to be an Mbed TLS source tree."
|
||||
exit 125
|
||||
fi
|
||||
n=$((n - 1))
|
||||
case $root_dir in
|
||||
.) root_dir="..";;
|
||||
..|?*/..) root_dir="$root_dir/..";;
|
||||
?*/*) root_dir="${root_dir%/*}";;
|
||||
/*) root_dir="/";;
|
||||
*) root_dir=".";;
|
||||
esac
|
||||
done
|
||||
|
||||
## $programs_dir is the directory containing the sample programs.
|
||||
programs_dir="$root_dir/programs"
|
||||
|
||||
## msg LINE...
|
||||
## msg <TEXT_ORIGIN
|
||||
## Display an informational message.
|
||||
msg () {
|
||||
if [ $# -eq 0 ]; then
|
||||
sed 's/^/# /'
|
||||
else
|
||||
for x in "$@"; do
|
||||
echo "# $x"
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
## run "Message" COMMAND ARGUMENT...
|
||||
## Display the message, then run COMMAND with the specified arguments.
|
||||
run () {
|
||||
echo
|
||||
echo "# $1"
|
||||
shift
|
||||
echo "+ $*"
|
||||
"$@"
|
||||
}
|
||||
|
||||
## Like '!', but stop on failure with 'set -e'
|
||||
not () {
|
||||
if "$@"; then false; fi
|
||||
}
|
||||
|
||||
## run_bad "Message" COMMAND ARGUMENT...
|
||||
## Like run, but the command is expected to fail.
|
||||
run_bad () {
|
||||
echo
|
||||
echo "$1 This must fail."
|
||||
shift
|
||||
echo "+ ! $*"
|
||||
not "$@"
|
||||
}
|
||||
|
||||
## Add the names of files to clean up to this whitespace-separated variable.
|
||||
## The file names must not contain whitespace characters.
|
||||
files_to_clean=
|
||||
|
||||
|
||||
|
||||
################################################################
|
||||
## End of the public interfaces. Code beyond this point is not
|
||||
## meant to be called directly from a demo script.
|
||||
|
||||
cleanup () {
|
||||
rm -f -- $files_to_clean
|
||||
}
|
||||
trap 'cleanup; trap - HUP; kill -HUP $$' HUP
|
||||
trap 'cleanup; trap - INT; kill -INT $$' INT
|
||||
trap 'cleanup; trap - TERM; kill -TERM $$' TERM
|
|
@ -15,36 +15,15 @@
|
|||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
set -e -u
|
||||
. "${0%/*}/../demo_common.sh"
|
||||
|
||||
program_name="key_ladder_demo"
|
||||
program="${0%/*}/$program_name"
|
||||
files_to_clean=
|
||||
msg <<'EOF'
|
||||
This script demonstrates the use of the PSA cryptography interface to
|
||||
create a master key, derive a key from it and use that key to wrap
|
||||
the derived key using an AEAD algorithm.
|
||||
EOF
|
||||
|
||||
if [ ! -e "$program" ]; then
|
||||
# Look for programs in the current directory and the directories above it
|
||||
for dir in "." ".." "../.."; do
|
||||
program="$dir/programs/psa/$program_name"
|
||||
if [ -e "$program" ]; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ ! -e "$program" ]; then
|
||||
echo "Could not find $program_name executable"
|
||||
|
||||
echo "If building out-of-tree, this script must be run" \
|
||||
"from the project build directory."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
run () {
|
||||
echo
|
||||
echo "# $1"
|
||||
shift
|
||||
echo "+ $*"
|
||||
"$@"
|
||||
}
|
||||
program="${0%/*}"/key_ladder_demo
|
||||
|
||||
if [ -e master.key ]; then
|
||||
echo "# Reusing the existing master.key file."
|
||||
|
@ -68,7 +47,7 @@ run "Compare the unwrapped data with the original input." \
|
|||
cmp input.txt hello_world.txt
|
||||
|
||||
files_to_clean="$files_to_clean hellow_orld.txt"
|
||||
! run "Derive a different key and attempt to unwrap the data. This must fail." \
|
||||
run_bad "Derive a different key and attempt to unwrap the data. This must fail." \
|
||||
"$program" unwrap master=master.key input=hello_world.wrap output=hellow_orld.txt label=hellow label=orld
|
||||
|
||||
files_to_clean="$files_to_clean hello.key"
|
||||
|
@ -79,5 +58,4 @@ run "Check that we get the same key by unwrapping data made by the other key." \
|
|||
"$program" unwrap master=hello.key label=world \
|
||||
input=hello_world.wrap output=hello_world.txt
|
||||
|
||||
# Cleanup
|
||||
rm -f $files_to_clean
|
||||
cleanup
|
||||
|
|
Loading…
Reference in a new issue