OLD | NEW |
1 #!/bin/sh | 1 #!/bin/sh |
2 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 2 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 # | 5 # |
6 | 6 |
7 TMPDIR=/tmp/debug_vboot | 7 LOGFILE=noisy.log |
8 BIOS=bios.rom | 8 |
9 # FIXME: support ARM | 9 die() { |
10 HD_KERN_A=/dev/sda2 | 10 echo "$*" 1>&2 |
11 HD_KERN_B=/dev/sda4 | 11 exit 1 |
12 tmp=$(rootdev -s -d)2 | 12 } |
13 if [ "$tmp" != "$HD_KERN_A" ]; then | 13 |
14 USB_KERN_A="$tmp" | 14 info() { |
| 15 echo "$@" |
| 16 echo "#" "$@" >> "$LOGFILE" |
| 17 } |
| 18 |
| 19 infon() { |
| 20 echo -n "$@" |
| 21 echo "#" "$@" >> "$LOGFILE" |
| 22 } |
| 23 |
| 24 log() { |
| 25 echo "+" "$@" >> "$LOGFILE" |
| 26 "$@" >> "$LOGFILE" 2>&1 |
| 27 } |
| 28 |
| 29 logdie() { |
| 30 echo "+" "$@" >> "$LOGFILE" |
| 31 "$@" >> "$LOGFILE" 2>&1 |
| 32 die "$@" |
| 33 } |
| 34 |
| 35 result() { |
| 36 if [ "$?" = "0" ]; then |
| 37 info "OK" |
| 38 else |
| 39 info "FAILED" |
| 40 fi |
| 41 } |
| 42 |
| 43 # Optional directory name containing "bios.rom" and "*kern*.blob" files. If not |
| 44 # provided, we'll attempt to extract them ourselves. |
| 45 if [ -d "$1" ]; then |
| 46 TMPDIR="$1" |
| 47 [ -d ${TMPDIR} ] || die "${TMPDIR} doesn't exist" |
| 48 USE_EXISTING=yes |
| 49 else |
| 50 TMPDIR=/tmp/debug_vboot |
| 51 [ -d ${TMPDIR} ] || mkdir -p ${TMPDIR} |
15 fi | 52 fi |
16 | 53 |
| 54 cd ${TMPDIR} |
| 55 echo "$0 $*" > "$LOGFILE" |
| 56 log date |
| 57 echo "Saving verbose log as $(pwd)/$LOGFILE" |
17 | 58 |
18 [ -d ${TMPDIR} ] || mkdir -p ${TMPDIR} | 59 BIOS=bios.rom |
19 cd ${TMPDIR} | |
20 | 60 |
21 echo "INFO: extracting BIOS image from flash" | 61 # Find BIOS and kernel images |
22 flashrom -r ${BIOS} | 62 if [ -n "$USE_EXISTING" ]; then |
| 63 info "Using images in $(pwd)/" |
| 64 else |
| 65 info "Extracting BIOS image from flash..." |
| 66 log flashrom -r ${BIOS} |
23 | 67 |
24 echo "INFO: extracting kernel images from drives" | 68 # FIXME: support ARM |
25 dd if=${HD_KERN_A} of=hd_kern_a.blob | 69 HD_KERN_A=/dev/sda2 |
26 dd if=${HD_KERN_B} of=hd_kern_b.blob | 70 HD_KERN_B=/dev/sda4 |
27 if [ -n "$USB_KERN_A" ]; then | 71 tmp=$(rootdev -s -d)2 |
28 dd if=${USB_KERN_A} of=usb_kern_a.blob | 72 if [ "$tmp" != "$HD_KERN_A" ]; then |
| 73 USB_KERN_A="$tmp" |
| 74 fi |
| 75 |
| 76 info "Extracting kernel images from drives..." |
| 77 log dd if=${HD_KERN_A} of=hd_kern_a.blob |
| 78 log dd if=${HD_KERN_B} of=hd_kern_b.blob |
| 79 if [ -n "$USB_KERN_A" ]; then |
| 80 log dd if=${USB_KERN_A} of=usb_kern_a.blob |
| 81 fi |
29 fi | 82 fi |
30 | 83 |
31 echo "INFO: extracting BIOS components" | 84 # Make sure we have something to work on |
32 dump_fmap -x ${BIOS} || echo "FAILED" | 85 [ -f "$BIOS" ] || logdie "no BIOS image found" |
| 86 ls *kern*.blob >/dev/null 2>&1 || logdie "no kernel images found" |
33 | 87 |
34 echo "INFO: pulling root and recovery keys from GBB" | 88 info "Extracting BIOS components..." |
35 gbb_utility -g --rootkey rootkey.vbpubk --recoverykey recoverykey.vbpubk \ | 89 log dump_fmap -x ${BIOS} || logdie "Unable to extract BIOS components" |
36 GBB_Area || echo "FAILED" | |
37 echo "INFO: display root key" | |
38 vbutil_key --unpack rootkey.vbpubk | |
39 echo "INFO: display recovery key" | |
40 vbutil_key --unpack recoverykey.vbpubk | |
41 | 90 |
42 echo "TEST: verify firmware A with root key" | 91 info "Pulling root and recovery keys from GBB..." |
43 vbutil_firmware --verify Firmware_A_Key --signpubkey rootkey.vbpubk \ | 92 log gbb_utility -g --rootkey rootkey.vbpubk --recoverykey recoverykey.vbpubk \ |
44 --fv Firmware_A_Data --kernelkey kernel_subkey_a.vbpubk || echo "FAILED" | 93 GBB_Area || logdie "Unable to extract keys from GBB" |
45 echo "TEST: verify firmware B with root key" | 94 log vbutil_key --unpack rootkey.vbpubk |
46 vbutil_firmware --verify Firmware_B_Key --signpubkey rootkey.vbpubk \ | 95 log vbutil_key --unpack recoverykey.vbpubk |
47 --fv Firmware_B_Data --kernelkey kernel_subkey_b.vbpubk || echo "FAILED" | |
48 | 96 |
49 echo "TEST: verify HD kernel A with firmware A key" | 97 infon "Verify firmware A with root key... " |
50 vbutil_kernel --verify hd_kern_a.blob --signpubkey kernel_subkey_a.vbpubk \ | 98 log vbutil_firmware --verify Firmware_A_Key --signpubkey rootkey.vbpubk \ |
51 || echo "FAILED" | 99 --fv Firmware_A_Data --kernelkey kernel_subkey_a.vbpubk ; result |
52 echo "TEST: verify HD kernel B with firmware A key" | 100 infon "Verify firmware B with root key... " |
53 vbutil_kernel --verify hd_kern_b.blob --signpubkey kernel_subkey_a.vbpubk \ | 101 log vbutil_firmware --verify Firmware_B_Key --signpubkey rootkey.vbpubk \ |
54 || echo "FAILED" | 102 --fv Firmware_B_Data --kernelkey kernel_subkey_b.vbpubk ; result |
55 | 103 |
56 echo "TEST: verify HD kernel A with firmware B key" | 104 for key in kernel_subkey_a.vbpubk kernel_subkey_b.vbpubk; do |
57 vbutil_kernel --verify hd_kern_a.blob --signpubkey kernel_subkey_b.vbpubk \ | 105 infon "Test $key... " |
58 || echo "FAILED" | 106 log vbutil_key --unpack $key ; result |
59 echo "TEST: verify HD kernel B with firmware B key" | 107 done |
60 vbutil_kernel --verify hd_kern_b.blob --signpubkey kernel_subkey_b.vbpubk \ | |
61 || echo "FAILED" | |
62 | 108 |
63 if [ -n "$USB_KERN_A" ]; then | 109 for keyblock in *kern*.blob; do |
64 echo "TEST: verify USB kernel A with recovery key" | 110 infon "Test $keyblock... " |
65 vbutil_kernel --verify usb_kern_a.blob --signpubkey recoverykey.vbpubk \ | 111 log vbutil_keyblock --unpack $keyblock ; result |
66 || echo "FAILED" | 112 done |
67 fi | 113 |
| 114 # Test each kernel with each key |
| 115 for key in kernel_subkey_a.vbpubk kernel_subkey_b.vbpubk recoverykey.vbpubk; do |
| 116 for kern in *kern*.blob; do |
| 117 infon "Verify $kern with $key... " |
| 118 log vbutil_kernel --verify $kern --signpubkey $key ; result |
| 119 done |
| 120 done |
OLD | NEW |