blob: a4b185d570f4f2715cdb4455ee5c19d5c702e78b [file] [log] [blame]
#!/bin/bash -u
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
if [ -z "$*" ]; then
cat <<EOF 1>&2
Usage: vbutil_what_keys IMAGE [IMAGE...]
Given a ChromiumOS disk (or BIOS) image, try to figure out how it's signed.
Note that this does not verify the signature, it just reports which keyblock
was used to create the signature.
EOF
exit 1
fi
# We'll look up the known kernel.keyblock and recovery_kernel.keyblock sha1sums
# right here. Obtain them by running this script on images you know have been
# signed correctly (since the keys themselves are inside the HSM).
#
# e78ce746a037837155388a1096212ded04fb86eb recovery dev-key
# d6170aa480136f1f29cf339a5ab1b960585fa444 normal dev-key
#
# 20f3e8b77da6577706c91feefb203f98ee20d479 recovery ZGB MP
# 7b7ae8652775ad7305f565161b3acc00fcc8ea22 normal ZGB MP
#
# 03172b08f0b99172c73d947f51e8ca23d418bcbf recovery Alex MP
# af24e46b6c3805869616e71c002c9a2a847ad266 normal Alex MP
#
# f6fadd7e31eebf4bcc4eb8d2dd512e3a2313627f recovery Cr-48 MP
# a1454fcecb98a6f33b38638564bdfc20161a7b04 normal Cr-48 MP
#
# de11a604715a920d7371ceefda75a5b1b062443f recovery Tegra2-Kaen PVT
# 5c626cd8a684e470e74d3ceaf518aae745fe15dc normal Tegra2-Kaen PVT
#
# cb45bc04a932e4bcac41b44d31afd9516ca0fe24 recovery Lumpy PVT
# fa55cba16857a49270fb1561f87343c00959eb19 normal Lumpy PVT
#
# 057a03c1526a1be7f42d29095c5a583231a75b35 recovery Stumpy PVT
# 04dd63e835c979b57f87fd74e99af68e0cd39ad7 normal Stumpy PVT
#
# 6f6d6df4e328633904990cf8c60baa18b8cf6fc7 recovery Stumpy MP
# de0b76af3caa55a8e7aa34c805e4248ad03b18e7 normal Stumpy MP
# And here are values for BIOS components.
#
# The default H2C HWIDs are fixed for each platform
# {97A1FBD6-FDE1-4FC5-BB81-286608B90FCE} Alex H2C
# {9D799111-A88A-439E-9E1F-FBBB41B00A9A} Cr-48 H2C
# {24B107F2-BA6A-4EBD-8CDD-E768438CE0F0} Stumpy H2C
# {FA42644C-CF3A-4692-A9D3-1A667CB232E9} ZGB H2C
# The first line is the recovery key, the second is the root key
#
# c14bd720b70d97394257e3e826bd8f43de48d4ed dev-key
# b11d74edd286c144e1135b49e7f0bc20cf041f10 dev-key
#
# 5c5776bf7574e5601c25042e0748b6844cfdd1dc Alex MP
# 00f77be2a0c013343db84fc6259da09e558b8318 Alex MP
#
# ebcac421fbf411bee99ee90672a3add17f5a967b Lumpy PVT
# c9fc61f331b34e00a148e657bde5fb6b0b576c0a Lumpy PVT
#
# 5d0d163b824cab5ae4f23fb2cc012e2a4124f4fe Cr-48 MP
# 541f467a7d8747f55ae9087ee4e34155f5ee3cd7 Cr-48 MP
#
# 8540f56f87d91c5403704c960c1f385705201e20 Stumpy PVT
# 06939c65797eadfe6be1b3343a2e339800a34108 Stumpy PVT
#
# 9bd99a594c45b6739899a17ec29ac2289ee75463 ZGB MP
# 9f59876c7f7dc881f02d934786c6b7c2c17dcaac ZGB MP
#
# 37e7bad73449f782f280b1668fed48d1132137fa Stumpy MP
# 4ec4ba0a746b37b1c6286ab807c2a5b1e7ab4ab0 Stumpy MP
set -o pipefail
TMPFILE=$(mktemp /tmp/keyblock_XXXXXXXXX)
trap "rm -f $TMPFILE" EXIT
dofile() {
file="$1"
size=$(stat -c %s "$file")
if [ -f "$file" ] && [ "$size" -le 8388608 ]; then
echo "BIOS: $file"
hwid=$(gbb_utility --hwid "$file" | sed -e 's/^.*: *//') || continue;
match1=$(grep "$hwid" "$0" 2>/dev/null | sed -e 's/^# //')
gbb_utility --recoverykey="$TMPFILE" "$file" >/dev/null
recoverykey=$(vbutil_key --unpack "$TMPFILE" | grep sha1sum | \
sed -e 's/^.*: *//')
match2=$(grep "$recoverykey" "$0" 2>/dev/null | sed -e 's/^# //')
gbb_utility --rootkey="$TMPFILE" "$file" >/dev/null
rootkey=$(vbutil_key --unpack "$TMPFILE" | grep sha1sum | \
sed -e 's/^.*: *//')
match3=$(grep "$rootkey" "$0" 2>/dev/null | sed -e 's/^# //')
echo " hwid: ${match1:-$hwid}"
echo " recovery key: ${match2:-$recoverykey}"
echo " root key: ${match3:-$rootkey}"
else
echo "IMAGE: $file"
for pnum in $(cgpt find -n -t kernel "$file" 2>/dev/null); do
psize=$(cgpt show -s -i "$pnum" "$file")
if [ "$psize" -ge 128 ]; then
pstart=$(cgpt show -b -i "$pnum" "$file")
dd if="$file" of="$TMPFILE" bs=512 count=128 skip="$pstart" 2>/dev/null
psum=$(vbutil_keyblock --unpack "$TMPFILE" 2>/dev/null | \
grep sha1sum | sed -e 's/^.*: *//')
if [ -n "$psum" ]; then
match=$(grep "$psum" "$0" 2>/dev/null | sed -e 's/^# //')
flags=$(vbutil_keyblock --unpack "$TMPFILE" 2>/dev/null | \
grep Flags: | sed -e 's/^.*:[ 0-9]*//')
else
match=""
psum="--invalid--"
flags=""
fi
echo " part $pnum: ${match:-$psum} ($flags)"
fi
done
fi
}
for file in "$@"; do
dofile $file
done