1*8617a60dSAndroid Build Coastguard Worker#!/bin/bash 2*8617a60dSAndroid Build Coastguard Worker 3*8617a60dSAndroid Build Coastguard Worker# Copyright 2014 The ChromiumOS Authors 4*8617a60dSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 5*8617a60dSAndroid Build Coastguard Worker# found in the LICENSE file. 6*8617a60dSAndroid Build Coastguard Worker# 7*8617a60dSAndroid Build Coastguard Worker# End-to-end test for vboot2 kernel verification 8*8617a60dSAndroid Build Coastguard Worker 9*8617a60dSAndroid Build Coastguard Worker# Load common constants and variables. 10*8617a60dSAndroid Build Coastguard Worker. "$(dirname "$0")/common.sh" 11*8617a60dSAndroid Build Coastguard Worker 12*8617a60dSAndroid Build Coastguard Workerset -e 13*8617a60dSAndroid Build Coastguard Worker 14*8617a60dSAndroid Build Coastguard WorkerCGPT=${BIN_DIR}/cgpt 15*8617a60dSAndroid Build Coastguard Worker 16*8617a60dSAndroid Build Coastguard Workerecho 'Creating test kernel' 17*8617a60dSAndroid Build Coastguard Worker 18*8617a60dSAndroid Build Coastguard Worker# Run tests in a dedicated directory for easy cleanup or debugging. 19*8617a60dSAndroid Build Coastguard WorkerDIR="${TEST_DIR}/load_kernel_test_dir" 20*8617a60dSAndroid Build Coastguard Worker[ -d "$DIR" ] || mkdir -p "$DIR" 21*8617a60dSAndroid Build Coastguard Workerecho "Testing kernel verification in $DIR" 22*8617a60dSAndroid Build Coastguard Workercd "$DIR" 23*8617a60dSAndroid Build Coastguard Worker 24*8617a60dSAndroid Build Coastguard Worker# Dummy kernel data 25*8617a60dSAndroid Build Coastguard Workerecho "hi there" > "dummy_config.txt" 26*8617a60dSAndroid Build Coastguard Workerdd if=/dev/urandom bs=16384 count=1 of="dummy_bootloader.bin" 27*8617a60dSAndroid Build Coastguard Workerdd if=/dev/urandom bs=32768 count=1 of="dummy_kernel.bin" 28*8617a60dSAndroid Build Coastguard Worker 29*8617a60dSAndroid Build Coastguard Worker# Pack kernel data key using original vboot utilities. 30*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" vbutil_key --pack datakey.test \ 31*8617a60dSAndroid Build Coastguard Worker --key "${TESTKEY_DIR}/key_rsa2048.keyb" --algorithm 4 32*8617a60dSAndroid Build Coastguard Worker 33*8617a60dSAndroid Build Coastguard Worker# Keyblock with kernel data key is signed by kernel subkey 34*8617a60dSAndroid Build Coastguard Worker# Flags=21 means dev=0 rec=0 minios=0 35*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" vbutil_keyblock --pack keyblock.test \ 36*8617a60dSAndroid Build Coastguard Worker --datapubkey datakey.test \ 37*8617a60dSAndroid Build Coastguard Worker --flags 21 \ 38*8617a60dSAndroid Build Coastguard Worker --signprivate "${SCRIPT_DIR}/devkeys/kernel_subkey.vbprivk" 39*8617a60dSAndroid Build Coastguard Worker 40*8617a60dSAndroid Build Coastguard Worker# Kernel preamble is signed with the kernel data key 41*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" vbutil_kernel \ 42*8617a60dSAndroid Build Coastguard Worker --pack "kernel.test" \ 43*8617a60dSAndroid Build Coastguard Worker --keyblock "keyblock.test" \ 44*8617a60dSAndroid Build Coastguard Worker --signprivate "${TESTKEY_DIR}/key_rsa2048.sha256.vbprivk" \ 45*8617a60dSAndroid Build Coastguard Worker --version 1 \ 46*8617a60dSAndroid Build Coastguard Worker --arch arm \ 47*8617a60dSAndroid Build Coastguard Worker --vmlinuz "dummy_kernel.bin" \ 48*8617a60dSAndroid Build Coastguard Worker --config "dummy_config.txt" 49*8617a60dSAndroid Build Coastguard Worker 50*8617a60dSAndroid Build Coastguard Workerecho 'Verifying test kernel' 51*8617a60dSAndroid Build Coastguard Worker 52*8617a60dSAndroid Build Coastguard Worker# Verify the kernel 53*8617a60dSAndroid Build Coastguard Worker"${FUTILITY}" vbutil_kernel \ 54*8617a60dSAndroid Build Coastguard Worker --verify "kernel.test" \ 55*8617a60dSAndroid Build Coastguard Worker --signpubkey "${SCRIPT_DIR}/devkeys/kernel_subkey.vbpubk" 56*8617a60dSAndroid Build Coastguard Worker 57*8617a60dSAndroid Build Coastguard Workerhappy 'Kernel verification succeeded' 58*8617a60dSAndroid Build Coastguard Worker 59*8617a60dSAndroid Build Coastguard Worker# Now create a dummy disk image 60*8617a60dSAndroid Build Coastguard Workerecho 'Creating test disk image' 61*8617a60dSAndroid Build Coastguard Workerdd if=/dev/zero of=disk.test bs=1024 count=1024 62*8617a60dSAndroid Build Coastguard Worker${CGPT} create disk.test 63*8617a60dSAndroid Build Coastguard Worker${CGPT} add -i 1 -S 1 -P 1 -b 64 -s 960 -t kernel -l kernelA disk.test 64*8617a60dSAndroid Build Coastguard Worker${CGPT} show disk.test 65*8617a60dSAndroid Build Coastguard Worker 66*8617a60dSAndroid Build Coastguard Worker# And insert the kernel into it 67*8617a60dSAndroid Build Coastguard Workerdd if=kernel.test of=disk.test bs=512 seek=64 conv=notrunc 68*8617a60dSAndroid Build Coastguard Worker 69*8617a60dSAndroid Build Coastguard Worker# And verify it using futility 70*8617a60dSAndroid Build Coastguard Workerecho 'Verifying test disk image' 71*8617a60dSAndroid Build Coastguard Worker"${BUILD_RUN}/tests/verify_kernel" disk.test \ 72*8617a60dSAndroid Build Coastguard Worker "${SCRIPT_DIR}/devkeys/kernel_subkey.vbpubk" 73*8617a60dSAndroid Build Coastguard Worker 74*8617a60dSAndroid Build Coastguard Workerhappy 'Image verification succeeded' 75