#!/bin/bash -eux # Copyright (c) 2014 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. me=${0##*/} TMP="$me.tmp" # Work in scratch directory cd "$OUTDIR" DEVKEYS=${SRCDIR}/tests/devkeys echo "hi there" > ${TMP}.config.txt echo "hello boys" > ${TMP}.config2.txt dd if=/dev/urandom bs=512 count=1 of=${TMP}.bootloader.bin dd if=/dev/urandom bs=512 count=1 of=${TMP}.bootloader2.bin dd if=/dev/urandom bs=1M count=16 of=${TMP}.kern_partition # default padding padding=49152 try_arch () { local arch=$1 echo -n "${arch}: 1 " 1>&3 # pack it up the old way ${FUTILITY} --debug vbutil_kernel \ --pack ${TMP}.blob1.${arch} \ --keyblock ${DEVKEYS}/recovery_kernel.keyblock \ --signprivate ${DEVKEYS}/recovery_kernel_data_key.vbprivk \ --version 1 \ --config ${TMP}.config.txt \ --bootloader ${TMP}.bootloader.bin \ --vmlinuz ${SCRIPTDIR}/data/vmlinuz-${arch}.bin \ --arch ${arch} \ --pad ${padding} \ --kloadaddr 0x11000 # verify the old way ${FUTILITY} vbutil_kernel --verify ${TMP}.blob1.${arch} \ --pad ${padding} \ --signpubkey ${DEVKEYS}/recovery_key.vbpubk > ${TMP}.verify1 # pack it up the new way ${FUTILITY} --debug sign \ --keyblock ${DEVKEYS}/recovery_kernel.keyblock \ --signprivate ${DEVKEYS}/recovery_kernel_data_key.vbprivk \ --version 1 \ --config ${TMP}.config.txt \ --bootloader ${TMP}.bootloader.bin \ --vmlinuz ${SCRIPTDIR}/data/vmlinuz-${arch}.bin \ --arch ${arch} \ --pad ${padding} \ --kloadaddr 0x11000 \ --outfile ${TMP}.blob2.${arch} ${FUTILITY} vbutil_kernel --verify ${TMP}.blob2.${arch} \ --pad ${padding} \ --signpubkey ${DEVKEYS}/recovery_key.vbpubk > ${TMP}.verify2 # they should be identical cmp ${TMP}.blob1.${arch} ${TMP}.blob2.${arch} diff ${TMP}.verify1 ${TMP}.verify2 echo -n "2 " 1>&3 # repack it the old way ${FUTILITY} --debug vbutil_kernel \ --repack ${TMP}.blob3.${arch} \ --oldblob ${TMP}.blob1.${arch} \ --signprivate ${DEVKEYS}/kernel_data_key.vbprivk \ --keyblock ${DEVKEYS}/kernel.keyblock \ --version 2 \ --pad ${padding} \ --config ${TMP}.config2.txt \ --bootloader ${TMP}.bootloader2.bin # verify the old way ${FUTILITY} vbutil_kernel --verify ${TMP}.blob3.${arch} \ --pad ${padding} \ --signpubkey ${DEVKEYS}/kernel_subkey.vbpubk > ${TMP}.verify3 # repack it the new way ${FUTILITY} --debug sign \ --signprivate ${DEVKEYS}/kernel_data_key.vbprivk \ --keyblock ${DEVKEYS}/kernel.keyblock \ --version 2 \ --pad ${padding} \ --config ${TMP}.config2.txt \ --bootloader ${TMP}.bootloader2.bin \ ${TMP}.blob2.${arch} \ ${TMP}.blob4.${arch} ${FUTILITY} vbutil_kernel --verify ${TMP}.blob4.${arch} \ --pad ${padding} \ --signpubkey ${DEVKEYS}/kernel_subkey.vbpubk > ${TMP}.verify4 # they should be identical cmp ${TMP}.blob3.${arch} ${TMP}.blob4.${arch} diff ${TMP}.verify3 ${TMP}.verify4 echo -n "3 " 1>&3 # repack it the new way, in-place cp ${TMP}.blob2.${arch} ${TMP}.blob5.${arch} ${FUTILITY} --debug sign \ --signprivate ${DEVKEYS}/kernel_data_key.vbprivk \ --keyblock ${DEVKEYS}/kernel.keyblock \ --version 2 \ --pad ${padding} \ --config ${TMP}.config2.txt \ --bootloader ${TMP}.bootloader2.bin \ ${TMP}.blob5.${arch} ${FUTILITY} vbutil_kernel --verify ${TMP}.blob5.${arch} \ --pad ${padding} \ --signpubkey ${DEVKEYS}/kernel_subkey.vbpubk > ${TMP}.verify5 # they should be identical cmp ${TMP}.blob3.${arch} ${TMP}.blob5.${arch} diff ${TMP}.verify3 ${TMP}.verify5 # and now just the vblocks... echo -n "4 " 1>&3 # pack the old way ${FUTILITY} vbutil_kernel \ --pack ${TMP}.blob1.${arch}.vb1 \ --vblockonly \ --keyblock ${DEVKEYS}/recovery_kernel.keyblock \ --signprivate ${DEVKEYS}/recovery_kernel_data_key.vbprivk \ --version 1 \ --config ${TMP}.config.txt \ --bootloader ${TMP}.bootloader.bin \ --vmlinuz ${SCRIPTDIR}/data/vmlinuz-${arch}.bin \ --arch ${arch} \ --pad ${padding} \ --kloadaddr 0x11000 # compare this new vblock with the one from the full pack dd bs=${padding} count=1 if=${TMP}.blob1.${arch} of=${TMP}.blob1.${arch}.vb0 cmp ${TMP}.blob1.${arch}.vb0 ${TMP}.blob1.${arch}.vb1 # pack the new way ${FUTILITY} --debug sign \ --keyblock ${DEVKEYS}/recovery_kernel.keyblock \ --signprivate ${DEVKEYS}/recovery_kernel_data_key.vbprivk \ --version 1 \ --config ${TMP}.config.txt \ --bootloader ${TMP}.bootloader.bin \ --vmlinuz ${SCRIPTDIR}/data/vmlinuz-${arch}.bin \ --arch ${arch} \ --pad ${padding} \ --kloadaddr 0x11000 \ --vblockonly \ ${TMP}.blob2.${arch}.vb1 # compare this new vblock with the one from the full pack dd bs=${padding} count=1 if=${TMP}.blob2.${arch} of=${TMP}.blob2.${arch}.vb0 cmp ${TMP}.blob2.${arch}.vb0 ${TMP}.blob2.${arch}.vb1 echo -n "5 " 1>&3 # now repack the old way, again emitting just the vblock ${FUTILITY} vbutil_kernel \ --repack ${TMP}.blob3.${arch}.vb1 \ --vblockonly \ --oldblob ${TMP}.blob1.${arch} \ --signprivate ${DEVKEYS}/kernel_data_key.vbprivk \ --keyblock ${DEVKEYS}/kernel.keyblock \ --version 2 \ --pad ${padding} \ --config ${TMP}.config2.txt \ --bootloader ${TMP}.bootloader2.bin # compare the full repacked vblock with the new repacked vblock dd bs=${padding} count=1 if=${TMP}.blob3.${arch} of=${TMP}.blob3.${arch}.vb0 cmp ${TMP}.blob3.${arch}.vb0 ${TMP}.blob3.${arch}.vb1 # extract just the kernel blob dd bs=${padding} skip=1 if=${TMP}.blob3.${arch} of=${TMP}.blob3.${arch}.kb0 # and verify it using the new vblock (no way to do that with vbutil_kernel) ${FUTILITY} --debug verify \ --pad ${padding} \ --publickey ${DEVKEYS}/kernel_subkey.vbpubk \ --fv ${TMP}.blob3.${arch}.kb0 \ ${TMP}.blob3.${arch}.vb1 > ${TMP}.verify3v # repack the new way ${FUTILITY} --debug sign \ --signprivate ${DEVKEYS}/kernel_data_key.vbprivk \ --keyblock ${DEVKEYS}/kernel.keyblock \ --version 2 \ --config ${TMP}.config2.txt \ --bootloader ${TMP}.bootloader2.bin \ --pad ${padding} \ --vblockonly \ ${TMP}.blob2.${arch} \ ${TMP}.blob4.${arch}.vb1 \ # compare the full repacked vblock with the new repacked vblock dd bs=${padding} count=1 if=${TMP}.blob4.${arch} of=${TMP}.blob4.${arch}.vb0 cmp ${TMP}.blob4.${arch}.vb0 ${TMP}.blob4.${arch}.vb1 # extract just the kernel blob dd bs=${padding} skip=1 if=${TMP}.blob4.${arch} of=${TMP}.blob4.${arch}.kb0 # and verify it using the new vblock (no way to do that with vbutil_kernel) ${FUTILITY} --debug verify \ --pad ${padding} \ --publickey ${DEVKEYS}/kernel_subkey.vbpubk \ --fv ${TMP}.blob4.${arch}.kb0 \ ${TMP}.blob4.${arch}.vb1 > ${TMP}.verify4v echo -n "6 " 1>&3 # Now lets repack some kernel partitions, not just blobs. cp ${TMP}.kern_partition ${TMP}.part1.${arch} dd if=${TMP}.blob1.${arch} of=${TMP}.part1.${arch} conv=notrunc # Make sure the partitions verify ${FUTILITY} vbutil_kernel --verify ${TMP}.part1.${arch} \ --pad ${padding} \ --signpubkey ${DEVKEYS}/recovery_key.vbpubk > ${TMP}.verify6 # The partition should verify the same way as the blob diff ${TMP}.verify1 ${TMP}.verify6 # repack it the old way ${FUTILITY} --debug vbutil_kernel \ --repack ${TMP}.part6.${arch} \ --oldblob ${TMP}.part1.${arch} \ --signprivate ${DEVKEYS}/kernel_data_key.vbprivk \ --keyblock ${DEVKEYS}/kernel.keyblock \ --version 2 \ --pad ${padding} \ --config ${TMP}.config2.txt \ --bootloader ${TMP}.bootloader2.bin # verify the old way ${FUTILITY} vbutil_kernel --verify ${TMP}.part6.${arch} \ --pad ${padding} \ --signpubkey ${DEVKEYS}/kernel_subkey.vbpubk > ${TMP}.verify6.old # this "partition" should actually be the same as the old-way blob cmp ${TMP}.blob3.${arch} ${TMP}.part6.${arch} # repack it the new way, in-place cp ${TMP}.part1.${arch} ${TMP}.part6.${arch}.new1 ${FUTILITY} --debug sign \ --signprivate ${DEVKEYS}/kernel_data_key.vbprivk \ --keyblock ${DEVKEYS}/kernel.keyblock \ --version 2 \ --pad ${padding} \ --config ${TMP}.config2.txt \ --bootloader ${TMP}.bootloader2.bin \ ${TMP}.part6.${arch}.new1 ${FUTILITY} vbutil_kernel --verify ${TMP}.part6.${arch}.new1 \ --pad ${padding} \ --signpubkey ${DEVKEYS}/kernel_subkey.vbpubk > ${TMP}.verify6.new1 # The verification should be indentical diff ${TMP}.verify6.old ${TMP}.verify6.new1 # But the content should only match up to the size of the kernel blob, since # we're modifying an entire partition in-place. blobsize=$(stat -c '%s' ${TMP}.part6.${arch}) cmp -n ${blobsize} ${TMP}.part6.${arch} ${TMP}.part6.${arch}.new1 # The rest of the partition should be unchanged. cmp -i ${blobsize} ${TMP}.part1.${arch} ${TMP}.part6.${arch}.new1 # repack it the new way, from input to output cp ${TMP}.part1.${arch} ${TMP}.part1.${arch}.in ${FUTILITY} --debug sign \ --signprivate ${DEVKEYS}/kernel_data_key.vbprivk \ --keyblock ${DEVKEYS}/kernel.keyblock \ --version 2 \ --pad ${padding} \ --config ${TMP}.config2.txt \ --bootloader ${TMP}.bootloader2.bin \ ${TMP}.part1.${arch}.in \ ${TMP}.part6.${arch}.new2 ${FUTILITY} vbutil_kernel --verify ${TMP}.part6.${arch}.new2 \ --pad ${padding} \ --signpubkey ${DEVKEYS}/kernel_subkey.vbpubk > ${TMP}.verify6.new2 # The input file should not have changed (just being sure). cmp ${TMP}.part1.${arch} ${TMP}.part1.${arch}.in # The verification should be indentical diff ${TMP}.verify6.old ${TMP}.verify6.new2 # And creating a new output file should only emit a blob's worth cmp ${TMP}.part6.${arch} ${TMP}.part6.${arch}.new2 # Note: We specifically do not test repacking with a different --kloadaddr, # because the old way has a bug and does not update params->cmd_line_ptr to # point at the new on-disk location. Apparently (and not surprisingly), no # one has ever done that. } try_arch amd64 try_arch arm # cleanup rm -rf ${TMP}* exit 0