#!/bin/bash
#
# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms and conditions of the GNU General Public License,
# version 2, as published by the Free Software Foundation.
#
# This program is distributed in the hope it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
# See file CREDITS for list of people who contributed to this
# project.
#
Usage ()
{
cat << EOF
Usage: ./sign.sh
Where,
soc: tegra124, tegra210
boot_image: image generated by cbootimage,
priv_key: rsa key file in .pem format.
EOF
exit 1;
}
set -e
soc=$1 # tegra124, tegra210
if [[ "${soc}" = tegra124 ]]; then
bl_block_offset=16384; # emmc: 16384, spi_flash: 32768: default: emmc
bct_signed_offset=1712;
bct_signed_length=6480;
elif [[ "${soc}" = tegra210 ]]; then
bl_block_offset=32768; # emmc: 16384, spi_flash: 32768: default: spi
bct_signed_offset=1296;
bct_signed_length=8944;
else
echo "Error: Invalid target device: soc = $soc";
Usage;
fi;
bct_length=$(($bct_signed_offset + $bct_signed_length));
# more error check
if [ $# -lt 3 ]; then
echo "Error: Missing parameter(s)";
Usage;
fi;
#
# In case to add more parameters in the future, we keep the last two as
# IMAGE_FILE and KEY_FILE
#
argv=($@);
IMAGE_FILE=${argv[$#-2]};
KEY_FILE=${argv[$#-1]};
TARGET_IMAGE=$IMAGE_FILE
CONFIG_FILE=config.tmp
CBOOTIMAGE=../src/cbootimage
BCT_DUMP=../src/bct_dump
OBJCOPY=objcopy
OPENSSL=openssl
DD=dd
RM=rm
MV=mv
XXD=xxd
CUT=cut
echo "Sign ${soc} ${IMAGE_FILE} with key ${KEY_FILE}"
echo "Get bl length "
BL_LENGTH=`$BCT_DUMP $IMAGE_FILE | grep "Bootloader\[0\].Length"\
| awk -F ' ' '{print $4}' | awk -F ';' '{print $1}'`
echo "Extract bootloader to $IMAGE_FILE.bl.tosig, length $BL_LENGTH"
$DD bs=1 skip=${bl_block_offset} if=$IMAGE_FILE of=$IMAGE_FILE.bl.tosig \
count=$BL_LENGTH
echo "Calculate rsa signature for bootloader and save to $IMAGE_FILE.bl.sig"
$OPENSSL dgst -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 \
-sign $KEY_FILE -out $IMAGE_FILE.bl.sig $IMAGE_FILE.bl.tosig
echo "Update bootloader's rsa signature, aes hash and bct's aes hash"
echo "RsaPssSigBlFile = $IMAGE_FILE.bl.sig;" > $CONFIG_FILE
echo "RehashBl;" >> $CONFIG_FILE
$CBOOTIMAGE -s ${soc} -u $CONFIG_FILE $IMAGE_FILE $IMAGE_FILE.tmp
echo "Extract the part of bct which needs to be rsa signed"
$DD bs=1 if=$IMAGE_FILE.tmp of=$IMAGE_FILE.bct.tosig skip=${bct_signed_offset} \
count=${bct_signed_length}
echo "Calculate rsa signature for bct and save to $IMAGE_FILE.bct.sig"
$OPENSSL dgst -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 \
-sign $KEY_FILE -out $IMAGE_FILE.bct.sig $IMAGE_FILE.bct.tosig
echo "Create public key modulus from key file $KEY_FILE and save to $KEY_FILE.mod"
$OPENSSL rsa -in $KEY_FILE -noout -modulus -out $KEY_FILE.mod
# remove prefix
$CUT -d= -f2 < $KEY_FILE.mod > $KEY_FILE.mod.tmp
# convert from hexdecimal to binary
$XXD -r -p -l 256 $KEY_FILE.mod.tmp $KEY_FILE.mod.bin
echo "Update bct's rsa signature and modulus"
echo "RsaPssSigBctFile = $IMAGE_FILE.bct.sig;" > $CONFIG_FILE
echo "RsaKeyModulusFile = $KEY_FILE.mod.bin;" >> $CONFIG_FILE
echo ""
$CBOOTIMAGE -s ${soc} -u $CONFIG_FILE $IMAGE_FILE.tmp $TARGET_IMAGE
echo ""
$DD bs=1 if=$TARGET_IMAGE of=${soc}.bct count=${bct_length}
echo ""
echo "Signed bct ${soc}.bct has been successfully generated!";
#echo "Get rid of all temporary files: *.sig, *.tosig, *.tmp, *.mod, *.mod.bin"
$RM -f *.sig *.tosig *.tmp *.mod *.mod.bin