#!/bin/bash # # pvattest-info - get additional information from an attestation measurement # # Sample: # ./pvattest-info attestresp.bin # # Copyright IBM Corp. 2022 # # s390-tools is free software; you can redistribute it and/or modify # it under the terms of the MIT license. See LICENSE for details. set -o pipefail set -o nounset set -e XDUMP='od -A x -t x2z -v --endian=big' usage() { cat <<-EOF Usage: $(basename "$0") FILE Prints config UID and additional data if available. EOF } function check_is_pvattest_binary() { local input="$1" local size local version size=$(wc -c <"$input") if [ "$size" -lt 64 ]; then echo "ERROR: Input file is too small." >&2 exit 1 fi ${XDUMP} --read-bytes 16 -- "${input}" 2>/dev/null | grep -q pvattest || { echo "ERROR: ${input} does not contain a pvattest binary output." >&2 && exit 1; } size=$(${XDUMP} --skip-bytes 12 --read-bytes 4 -- "${input}" 2>/dev/null | awk 'NR==1 {print "0x" $2 $3}') if [ $((size)) -lt 64 ]; then echo "ERROR: ${input} does not contain a pvattest binary output." >&2 exit 1 fi version=$(${XDUMP} --skip-bytes 8 --read-bytes 4 -- "$input" 2>/dev/null) echo "$version" | grep -q "0000 0100" || { echo -n "WARNING: unknown hdr version " >&2 && echo "$version" | awk '{print "0x" $2 $3}'>&2 ; } } function print_entry() { local file_off="$1" local text="$2" local input="$3" local size local off size=$(${XDUMP} --skip-bytes $((file_off)) --read-bytes 4 -- "${input}" 2>/dev/null | awk 'NR==1 {print "0x" $2 $3}') off=$(${XDUMP} --skip-bytes $((file_off + 4)) --read-bytes 4 -- "${input}" 2>/dev/null | awk 'NR==1 {print "0x" $2 $3}') if [[ $size != "0x00000000" ]] || [[ $off != "0x00000000" ]]; then echo "${text}:" od -A n -w$((size)) -t x8 --skip-bytes $((off)) --read-bytes $((size)) -- "${input}" 2>/dev/null |\ sed -e 's/\s//g' fi } function require_command() { local cmd="$1" command -v "$cmd" >/dev/null 2>&1 || \ { echo >&2 "ERROR: $cmd required but not installed."; exit 1; } } require_command awk require_command wc require_command od if [ $# -eq 0 ]; then echo "ERROR: Input not set. Use '$(basename "$0") [FILE]' to specify the Input file" >&2 exit 1 fi input="$1" [ -e "$input" ] || { echo "ERROR: File '$1' not found" >&2 && exit 1; } check_is_pvattest_binary "$input" print_entry 0x38 "Config UID" "$input" print_entry 0x28 "Additional Data" "$input"