Encrypt Firmware
#!/bin/bash
echo "Build FlashImage from BCT/Bootloader"
# Change these 3 variables
BCT=<yourBCT>
Bootloader=<yourBootloader>
key=<yourKey>
cp $BCT tmp_bct.bin
cp $Bootloader tmp_bootloader.bin
###############################################################################
########### BOOTLOADER ########################################################
###############################################################################
#pad bootloader to be 16Byte aligned
bootloaderLength=$(stat --printf="%s" tmp_bootloader.bin)
while [ $((bootloaderLength%16)) -ne 0 ]; do
echo -n -e \\x00 >> tmp_bootloader.bin
bootloaderLength=$(stat --printf="%s" tmp_bootloader.bin)
done
# encrypt bootloader
echo "test"
openssl aes-128-cbc -e -K $key -iv 00000000000000000000000000000000 -nopad -nosalt -in tmp_bootloader.bin -out tmp_bootloader_enc.bin #-nopad
echo "test"
# calc bootloader hash of encrypted bootloader
bootloaderHash=$(openssl dgst -mac cmac -macopt cipher:aes-128-cbc -macopt hexkey:$key tmp_bootloader_enc.bin | cut -d' ' -f2)
# get length of encrypted bootloader
bootloaderLength=$(stat --printf="%s" tmp_bootloader_enc.bin)
# set bootloader load address
bootloaderLoadAddress=0x80108000
# set bootloader entry point
bootloaderEntryPoint=0x80108000
# Swap endianess of Length, LoadAddress, EntryPoint
v=$(printf "%08x" $bootloaderLength)
bootloaderLength=${v:6:2}${v:4:2}${v:2:2}${v:0:2}
v=$(printf "%08x" $bootloaderLoadAddress)
bootloaderLoadAddress=${v:6:2}${v:4:2}${v:2:2}${v:0:2}
v=$(printf "%08x" $bootloaderEntryPoint)
bootloaderEntryPoint=${v:6:2}${v:4:2}${v:2:2}${v:0:2}
# add bootloader data to BCT
echo $bootloaderLoadAddress | xxd -r -p | dd conv=notrunc of=tmp_bct.bin seek=3940 bs=1
echo $bootloaderEntryPoint | xxd -r -p | dd conv=notrunc of=tmp_bct.bin seek=3944 bs=1
echo $bootloaderHash | xxd -r -p | dd conv=notrunc of=tmp_bct.bin seek=3952 bs=1
echo $bootloaderLength | xxd -r -p | dd conv=notrunc of=tmp_bct.bin seek=3936 bs=1
#create bootloader block
dd if=/dev/zero of=tmp_bootloader_block.bin bs=1 count=520192
#put bootloader in block
dd conv=notrunc if=tmp_bootloader_enc.bin of=tmp_bootloader_block.bin bs=1
###############################################################################
########### BCT ###############################################################
###############################################################################
# remove HASH from BCT
dd if=tmp_bct.bin of=tmp_bct_trimmed.bin bs=1 skip=16
# encrypt BCT
openssl aes-128-cbc -e -K $key -iv 00000000000000000000000000000000 -nopad -nosalt -in tmp_bct_trimmed.bin -out tmp_bct_trimmed_enc.bin
# hash encrypted BCT
BCT_hash=$(openssl dgst -mac cmac -macopt cipher:aes-128-cbc -macopt hexkey:$key tmp_bct_trimmed_enc.bin | cut -d' ' -f2)
#create BCT_block image
dd if=/dev/zero of=tmp_bct_block.bin bs=1 count=8192
#put hash in Image
echo $BCT_hash | xxd -r -p | dd conv=notrunc of=tmp_bct_block.bin seek=0 bs=1
#put BCT in Image
dd conv=notrunc if=tmp_bct_trimmed_enc.bin of=tmp_bct_block.bin seek=16 bs=1
###############################################################################
########### Flash Image########################################################
###############################################################################
# create spi flash image with ones/zeros
dd if=/dev/zero bs=512 count=8192 | tr '\000' '\377' > flashImage.bin # to proof that dumped image is same as generated
#dd if=/dev/zero of=flashImage.bin bs=512 count=8192 # for flashing
#put BCT_Block in image
dd conv=notrunc if=tmp_bct_block.bin of=flashImage.bin seek=0 bs=1
#put Bootloader_block in image
dd conv=notrunc if=tmp_bootloader_block.bin of=flashImage.bin seek=1048576 bs=1
###############################################################################
########### Remove Tmp files ##################################################
###############################################################################
rm tmp_*.bin
Last updated