Bill Richardson | bde0696 | 2012-03-15 10:00:41 -0700 | [diff] [blame] | 1 | #!/bin/bash -u |
| 2 | # |
| 3 | # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| 4 | # Use of this source code is governed by a BSD-style license that can be |
| 5 | # found in the LICENSE file. |
| 6 | # |
| 7 | # Quick test of vbutil_kernel args, to make sure we can pack and unpack |
| 8 | # less-than-full-sized components. |
| 9 | # |
| 10 | |
| 11 | # Load common constants and variables for tests. |
| 12 | . "$(dirname "$0")/common.sh" |
| 13 | |
| 14 | # directories |
Bill Richardson | 72e344d | 2012-03-19 12:47:18 -0700 | [diff] [blame] | 15 | DEVKEYS="${ROOT_DIR}/tests/devkeys" |
Bill Richardson | bde0696 | 2012-03-15 10:00:41 -0700 | [diff] [blame] | 16 | DATA_DIR="${SCRIPT_DIR}/preamble_tests/data" |
| 17 | TMPDIR="${TEST_DIR}/vbutil_kernel_arg_tests_dir" |
| 18 | [ -d "${TMPDIR}" ] || mkdir -p "${TMPDIR}" |
| 19 | |
| 20 | # Arbitrarily chosen keys and config file. |
| 21 | KEYBLOCK="${DATA_DIR}/kb_0_0.keyblock" |
| 22 | SIGNPRIVATE="${DATA_DIR}/data_0.vbprivk" |
| 23 | SIGNPUBLIC="${DATA_DIR}/root_0.vbpubk" |
| 24 | CONFIG="${DATA_DIR}/dummy_config.txt" |
| 25 | |
| 26 | # Create some big and little files for the kernel and bootloader |
| 27 | BIG="${TMPDIR}/big.bin" |
| 28 | dd if=/dev/urandom bs=32768 count=1 of="${BIG}" 2>/dev/null |
| 29 | SMALL="${TMPDIR}/small.bin" |
| 30 | dd if=/dev/urandom bs=16 count=1 of="${SMALL}" 2>/dev/null |
| 31 | |
| 32 | declare -a KERN_VALS |
| 33 | declare -a BOOT_VALS |
| 34 | KERN_VALS=("--vmlinuz=${BIG}" "--vmlinuz=${SMALL}") |
| 35 | BOOT_VALS=("--bootloader=${BIG}" "--bootloader=${SMALL}") |
| 36 | |
| 37 | tests=0 |
| 38 | errs=0 |
| 39 | |
| 40 | # Pack a bunch of stuff |
| 41 | k=0 |
| 42 | while [ "$k" -lt "${#KERN_VALS[*]}" ]; do |
| 43 | b=0 |
| 44 | while [ "$b" -lt "${#BOOT_VALS[*]}" ]; do |
| 45 | echo -n "pack kern_${k}_${b}.vblock ... " |
| 46 | : $(( tests++ )) |
Bill Richardson | a1d9fe6 | 2014-09-05 12:52:27 -0700 | [diff] [blame] | 47 | "${FUTILITY}" vbutil_kernel \ |
| 48 | --pack "${TMPDIR}/kern_${k}_${b}.vblock" \ |
Bill Richardson | bde0696 | 2012-03-15 10:00:41 -0700 | [diff] [blame] | 49 | --keyblock "${KEYBLOCK}" \ |
| 50 | --signprivate "${SIGNPRIVATE}" \ |
| 51 | --version 1 \ |
| 52 | --arch arm \ |
| 53 | --config "${CONFIG}" \ |
| 54 | "${KERN_VALS[$k]}" \ |
| 55 | "${BOOT_VALS[$k]}" >/dev/null |
| 56 | if [ "$?" -ne 0 ]; then |
| 57 | echo -e "${COL_RED}FAILED${COL_STOP}" |
| 58 | : $(( errs++ )) |
| 59 | else |
| 60 | echo -e "${COL_GREEN}PASSED${COL_STOP}" |
| 61 | fi |
| 62 | : $(( b++ )) |
| 63 | done |
| 64 | : $(( k++ )) |
| 65 | done |
| 66 | |
| 67 | # Now unpack it |
| 68 | for v in ${TMPDIR}/kern_*.vblock; do |
| 69 | : $(( tests++ )) |
| 70 | vv=$(basename "$v") |
| 71 | echo -n "verify $vv ... " |
Bill Richardson | a1d9fe6 | 2014-09-05 12:52:27 -0700 | [diff] [blame] | 72 | "${FUTILITY}" vbutil_kernel --verify "$v" >/dev/null |
Bill Richardson | bde0696 | 2012-03-15 10:00:41 -0700 | [diff] [blame] | 73 | if [ "$?" -ne 0 ]; then |
| 74 | echo -e "${COL_RED}FAILED${COL_STOP}" |
| 75 | : $(( errs++ )) |
| 76 | else |
| 77 | echo -e "${COL_GREEN}PASSED${COL_STOP}" |
| 78 | fi |
| 79 | : $(( tests++ )) |
| 80 | echo -n "verify $vv signed ... " |
Bill Richardson | a1d9fe6 | 2014-09-05 12:52:27 -0700 | [diff] [blame] | 81 | "${FUTILITY}" vbutil_kernel --verify "$v" \ |
Bill Richardson | bde0696 | 2012-03-15 10:00:41 -0700 | [diff] [blame] | 82 | --signpubkey "${SIGNPUBLIC}" >/dev/null |
| 83 | if [ "$?" -ne 0 ]; then |
| 84 | echo -e "${COL_RED}FAILED${COL_STOP}" |
| 85 | : $(( errs++ )) |
| 86 | else |
| 87 | echo -e "${COL_GREEN}PASSED${COL_STOP}" |
| 88 | fi |
| 89 | done |
| 90 | |
Bill Richardson | 72e344d | 2012-03-19 12:47:18 -0700 | [diff] [blame] | 91 | |
| 92 | |
| 93 | # Test repacking a USB image for the SSD, the way the installer does. |
| 94 | |
| 95 | set -e |
| 96 | # Pack for USB |
| 97 | USB_KERN="${TMPDIR}/usb_kern.bin" |
| 98 | USB_KEYBLOCK="${DEVKEYS}/recovery_kernel.keyblock" |
| 99 | USB_SIGNPRIVATE="${DEVKEYS}/recovery_kernel_data_key.vbprivk" |
| 100 | USB_SIGNPUBKEY="${DEVKEYS}/recovery_key.vbpubk" |
| 101 | echo -n "pack USB kernel ... " |
| 102 | : $(( tests++ )) |
Bill Richardson | a1d9fe6 | 2014-09-05 12:52:27 -0700 | [diff] [blame] | 103 | "${FUTILITY}" vbutil_kernel \ |
Bill Richardson | 72e344d | 2012-03-19 12:47:18 -0700 | [diff] [blame] | 104 | --pack "${USB_KERN}" \ |
| 105 | --keyblock "${USB_KEYBLOCK}" \ |
| 106 | --signprivate "${USB_SIGNPRIVATE}" \ |
| 107 | --version 1 \ |
| 108 | --config "${CONFIG}" \ |
| 109 | --bootloader "${BIG}" \ |
| 110 | --vmlinuz "${BIG}" \ |
| 111 | --arch arm |
| 112 | if [ "$?" -ne 0 ]; then |
| 113 | echo -e "${COL_RED}FAILED${COL_STOP}" |
| 114 | : $(( errs++ )) |
| 115 | else |
| 116 | echo -e "${COL_GREEN}PASSED${COL_STOP}" |
| 117 | fi |
| 118 | |
| 119 | # And verify it. |
| 120 | echo -n "verify USB kernel ... " |
| 121 | : $(( tests++ )) |
Bill Richardson | a1d9fe6 | 2014-09-05 12:52:27 -0700 | [diff] [blame] | 122 | "${FUTILITY}" vbutil_kernel \ |
Bill Richardson | 72e344d | 2012-03-19 12:47:18 -0700 | [diff] [blame] | 123 | --verify "${USB_KERN}" \ |
| 124 | --signpubkey "${USB_SIGNPUBKEY}" >/dev/null |
| 125 | if [ "$?" -ne 0 ]; then |
| 126 | echo -e "${COL_RED}FAILED${COL_STOP}" |
| 127 | : $(( errs++ )) |
| 128 | else |
| 129 | echo -e "${COL_GREEN}PASSED${COL_STOP}" |
| 130 | fi |
| 131 | |
| 132 | # Now we re-sign the same image using the normal keys. This is the kernel |
| 133 | # image that is put on the hard disk by the installer. Note: To save space on |
| 134 | # the USB image, we're only emitting the new verfication block, and the |
| 135 | # installer just replaces that part of the hard disk's kernel partition. |
| 136 | SSD_KERN="${TMPDIR}/ssd_kern.bin" |
| 137 | SSD_KEYBLOCK="${DEVKEYS}/kernel.keyblock" |
| 138 | SSD_SIGNPRIVATE="${DEVKEYS}/kernel_data_key.vbprivk" |
| 139 | SSD_SIGNPUBKEY="${DEVKEYS}/kernel_subkey.vbpubk" |
| 140 | echo -n "repack to SSD kernel ... " |
| 141 | : $(( tests++ )) |
Bill Richardson | a1d9fe6 | 2014-09-05 12:52:27 -0700 | [diff] [blame] | 142 | "${FUTILITY}" vbutil_kernel \ |
Bill Richardson | 72e344d | 2012-03-19 12:47:18 -0700 | [diff] [blame] | 143 | --repack "${SSD_KERN}" \ |
| 144 | --vblockonly \ |
| 145 | --keyblock "${SSD_KEYBLOCK}" \ |
| 146 | --signprivate "${SSD_SIGNPRIVATE}" \ |
| 147 | --oldblob "${TMPDIR}/usb_kern.bin" >/dev/null |
| 148 | if [ "$?" -ne 0 ]; then |
| 149 | echo -e "${COL_RED}FAILED${COL_STOP}" |
| 150 | : $(( errs++ )) |
| 151 | else |
| 152 | echo -e "${COL_GREEN}PASSED${COL_STOP}" |
| 153 | fi |
| 154 | |
| 155 | # To verify it, we have to replace the vblock from the original image. |
| 156 | tempfile="${TMPDIR}/foo.bin" |
| 157 | cat "${SSD_KERN}" > "$tempfile" |
| 158 | dd if="${USB_KERN}" bs=65536 skip=1 >> $tempfile 2>/dev/null |
| 159 | |
| 160 | echo -n "verify SSD kernel ... " |
| 161 | : $(( tests++ )) |
Bill Richardson | a1d9fe6 | 2014-09-05 12:52:27 -0700 | [diff] [blame] | 162 | "${FUTILITY}" vbutil_kernel \ |
Bill Richardson | 72e344d | 2012-03-19 12:47:18 -0700 | [diff] [blame] | 163 | --verify "$tempfile" \ |
| 164 | --signpubkey "${SSD_SIGNPUBKEY}" >/dev/null |
| 165 | if [ "$?" -ne 0 ]; then |
| 166 | echo -e "${COL_RED}FAILED${COL_STOP}" |
| 167 | : $(( errs++ )) |
| 168 | else |
| 169 | echo -e "${COL_GREEN}PASSED${COL_STOP}" |
| 170 | fi |
| 171 | |
| 172 | # Finally make sure that the kernel command line stays good. |
| 173 | orig=$(cat "${CONFIG}" | tr '\012' ' ') |
Bill Richardson | a1d9fe6 | 2014-09-05 12:52:27 -0700 | [diff] [blame] | 174 | packed=$("${FUTILITY}" dump_kernel_config "${USB_KERN}") |
Bill Richardson | 72e344d | 2012-03-19 12:47:18 -0700 | [diff] [blame] | 175 | echo -n "check USB kernel config ..." |
| 176 | : $(( tests++ )) |
| 177 | if [ "$orig" != "$packed" ]; then |
| 178 | echo -e "${COL_RED}FAILED${COL_STOP}" |
| 179 | : $(( errs++ )) |
| 180 | else |
| 181 | echo -e "${COL_GREEN}PASSED${COL_STOP}" |
| 182 | fi |
| 183 | |
Bill Richardson | a1d9fe6 | 2014-09-05 12:52:27 -0700 | [diff] [blame] | 184 | repacked=$("${FUTILITY}" dump_kernel_config "${tempfile}") |
Bill Richardson | 72e344d | 2012-03-19 12:47:18 -0700 | [diff] [blame] | 185 | echo -n "check SSD kernel config ..." |
| 186 | : $(( tests++ )) |
| 187 | if [ "$orig" != "$packed" ]; then |
| 188 | echo -e "${COL_RED}FAILED${COL_STOP}" |
| 189 | : $(( errs++ )) |
| 190 | else |
| 191 | echo -e "${COL_GREEN}PASSED${COL_STOP}" |
| 192 | fi |
| 193 | |
Bill Richardson | bde0696 | 2012-03-15 10:00:41 -0700 | [diff] [blame] | 194 | # Summary |
| 195 | ME=$(basename "$0") |
| 196 | if [ "$errs" -ne 0 ]; then |
| 197 | echo -e "${COL_RED}${ME}: ${errs}/${tests} tests failed${COL_STOP}" |
| 198 | exit 1 |
| 199 | fi |
| 200 | happy "${ME}: All ${tests} tests passed" |
| 201 | exit 0 |