188d46662SJoseph Chen#!/bin/bash 288d46662SJoseph Chen# 388d46662SJoseph Chen# Copyright (c) 2024 Rockchip Electronics Co., Ltd 488d46662SJoseph Chen# 588d46662SJoseph Chen# SPDX-License-Identifier: GPL-2.0 688d46662SJoseph Chen# 788d46662SJoseph Chenset -e 888d46662SJoseph Chen 988d46662SJoseph ChenSIGN_DIR=".fit_sign" 1088d46662SJoseph ChenSIGN_OUTPUT="${SIGN_DIR}/output" 1188d46662SJoseph ChenUNPACK_UBOOT="${SIGN_DIR}/unpack_uboot" 1288d46662SJoseph ChenUNPACK_LOADER="${SIGN_DIR}/unpack_loader" 1388d46662SJoseph ChenTOOLS=$(cd `dirname $0`; pwd) 1488d46662SJoseph Chen# tools 1588d46662SJoseph ChenTOOL_MKIMAGE=${TOOLS}/mkimage 1688d46662SJoseph ChenTOOL_FIT_UNPACK=${TOOLS}/fit-unpack.sh 1788d46662SJoseph ChenTOOL_FIT_CHECK_SIGN=${TOOLS}/fit_check_sign 1888d46662SJoseph ChenTOOL_RK_SIGN=${TOOLS}/rk_sign_tool 1988d46662SJoseph ChenTOOL_BOOT_MERGER=${TOOLS}/boot_merger 2088d46662SJoseph Chen# offset 2188d46662SJoseph ChenOFFS_DATA=0x1200 2288d46662SJoseph Chen# placeholder address 2388d46662SJoseph ChenFDT_ADDR_PLACEHOLDER="0xffffff00" 2488d46662SJoseph ChenKERNEL_ADDR_PLACEHOLDER="0xffffff01" 2588d46662SJoseph ChenRAMDISK_ADDR_PLACEHOLDER="0xffffff02" 2688d46662SJoseph Chen# key 2788d46662SJoseph ChenSIGNATURE_KEY_NODE="/signature/key-dev" 2888d46662SJoseph Chen# dtb 2988d46662SJoseph ChenSPL_DTB="${UNPACK_LOADER}/u-boot-spl.dtb" 3088d46662SJoseph ChenUBOOT_DTB="${UNPACK_UBOOT}/fdt" 3188d46662SJoseph ChenUBOOT_DTB_ORIG="${UNPACK_UBOOT}/fdt_orig" 3288d46662SJoseph Chen# uboot 3388d46662SJoseph ChenITS_UBOOT="${UNPACK_UBOOT}/image.its" 3488d46662SJoseph ChenITB_UBOOT="${UNPACK_UBOOT}/image.itb" 3588d46662SJoseph ChenIMG_UBOOT="${SIGN_OUTPUT}/uboot.img" 3688d46662SJoseph Chen# rollback & version 3788d46662SJoseph Chendeclare -A ROLLBACK_PARAMS 3888d46662SJoseph Chendeclare -A VERSION_PARAMS 3988d46662SJoseph Chen 4088d46662SJoseph Chen# All required tools: 4188d46662SJoseph Chen# 4288d46662SJoseph Chen# ├── boot_merger 4388d46662SJoseph Chen# ├── fit_check_sign 4488d46662SJoseph Chen# ├── fit-unpack.sh 4588d46662SJoseph Chen# ├── mkimage 4688d46662SJoseph Chen# ├── rk_sign_tool 4788d46662SJoseph Chen# └── setting.ini 4888d46662SJoseph Chen 4988d46662SJoseph Chenfunction filt_val() 5088d46662SJoseph Chen{ 5188d46662SJoseph Chen sed -n "/${1}=/s/${1}=//p" $2 | tr -d '\r' | tr -d '"' 5288d46662SJoseph Chen} 5388d46662SJoseph Chen 5488d46662SJoseph Chenfunction help() 5588d46662SJoseph Chen{ 5688d46662SJoseph Chen echo 5788d46662SJoseph Chen echo "Usage:" 5888d46662SJoseph Chen echo " $0 [args]" 5988d46662SJoseph Chen echo 6088d46662SJoseph Chen echo "Args:" 6188d46662SJoseph Chen echo " --key-dir <dir> | Mandatory" 6288d46662SJoseph Chen echo " --src-dir <dir> | Mandatory" 6388d46662SJoseph Chen echo " --out-dir <dir> | Mandatory" 6488d46662SJoseph Chen echo " --burn-key-hash | Optional" 6588d46662SJoseph Chen echo " --rollback-index <image1 n1> <image2 n2> ... | Optional" 6688d46662SJoseph Chen echo " --version <image1 n1> <image2 n2> ... | Optional" 6788d46662SJoseph Chen echo "" 6888d46662SJoseph Chen echo "Example:" 6988d46662SJoseph Chen echo " $0 --key-dir keys/ --src-dir src/ --out-dir output/ --version uboot.img 1 boot.img 3 --rollback-index uboot.img 3 boot.img 5" 7088d46662SJoseph Chen echo 7188d46662SJoseph Chen} 7288d46662SJoseph Chen 7388d46662SJoseph Chenfunction arg_check_decimal() 7488d46662SJoseph Chen{ 7588d46662SJoseph Chen if [ -z $1 ]; then 7688d46662SJoseph Chen help 7788d46662SJoseph Chen exit 1 7888d46662SJoseph Chen fi 7988d46662SJoseph Chen 8088d46662SJoseph Chen DECIMAL=`echo $1 |sed 's/[0-9]//g'` 8188d46662SJoseph Chen if [ ! -z ${DECIMAL} ]; then 8288d46662SJoseph Chen echo "ERROR: $1 is not decimal integer" 8388d46662SJoseph Chen help 8488d46662SJoseph Chen exit 1 8588d46662SJoseph Chen fi 8688d46662SJoseph Chen} 8788d46662SJoseph Chen 8888d46662SJoseph Chenfunction process_args() 8988d46662SJoseph Chen{ 9088d46662SJoseph Chen while [ $# -gt 0 ]; do 9188d46662SJoseph Chen case $1 in 9288d46662SJoseph Chen --key-dir) 9388d46662SJoseph Chen ARG_KEY_DIR=$2 9488d46662SJoseph Chen RSA_PRI_KEY="${ARG_KEY_DIR}/dev.key" 9588d46662SJoseph Chen RSA_PUB_KEY="${ARG_KEY_DIR}/dev.pubkey" 9688d46662SJoseph Chen RSA_CRT_KEY="${ARG_KEY_DIR}/dev.crt" 9788d46662SJoseph Chen check_dir_exist $2 9888d46662SJoseph Chen check_rsa_keys $2 9988d46662SJoseph Chen shift 2 10088d46662SJoseph Chen ;; 10188d46662SJoseph Chen --src-dir) 10288d46662SJoseph Chen ARG_SRC_DIR=$2 10388d46662SJoseph Chen check_dir_exist $2 10488d46662SJoseph Chen SIGN_CFG_DIR="${ARG_SRC_DIR}/fit_signcfg/" 10588d46662SJoseph Chen SIGN_CONFIG="${ARG_SRC_DIR}/fit_signcfg/sign.readonly_config" 10688d46662SJoseph Chen shift 2 10788d46662SJoseph Chen ;; 10888d46662SJoseph Chen --out-dir) 10988d46662SJoseph Chen ARG_OUTPUT_DIR=$2 11088d46662SJoseph Chen check_dir_exist $2 11188d46662SJoseph Chen shift 2 11288d46662SJoseph Chen ;; 11388d46662SJoseph Chen --rollback-index) 11488d46662SJoseph Chen shift 1 11588d46662SJoseph Chen for arg in "$@"; do 11688d46662SJoseph Chen FILE_NAME="${1%.img}" 11788d46662SJoseph Chen arg_check_decimal $2 11888d46662SJoseph Chen ROLLBACK_PARAMS["${FILE_NAME}"]="$2" 11988d46662SJoseph Chen if [[ $3 == *"--"* || -z $3 ]]; then 12088d46662SJoseph Chen shift 2 12188d46662SJoseph Chen break; 12288d46662SJoseph Chen fi 12388d46662SJoseph Chen shift 2 12488d46662SJoseph Chen done 12588d46662SJoseph Chen ;; 12688d46662SJoseph Chen --version) 12788d46662SJoseph Chen shift 1 12888d46662SJoseph Chen for arg in "$@"; do 12988d46662SJoseph Chen FILE_NAME="${1%.img}" 13088d46662SJoseph Chen arg_check_decimal $2 13188d46662SJoseph Chen VERSION_PARAMS["${FILE_NAME}"]="$2" 13288d46662SJoseph Chen if [[ $3 == *"--"* || -z $3 ]]; then 13388d46662SJoseph Chen shift 2 13488d46662SJoseph Chen break; 13588d46662SJoseph Chen fi 13688d46662SJoseph Chen shift 2 13788d46662SJoseph Chen done 13888d46662SJoseph Chen ;; 13988d46662SJoseph Chen --burn-key-hash) 14088d46662SJoseph Chen ARG_BURN_KEY_HASH="y" 14188d46662SJoseph Chen shift 1 14288d46662SJoseph Chen ;; 14388d46662SJoseph Chen *) 14488d46662SJoseph Chen help 14588d46662SJoseph Chen exit 1 14688d46662SJoseph Chen ;; 14788d46662SJoseph Chen esac 14888d46662SJoseph Chen done 14988d46662SJoseph Chen 15088d46662SJoseph Chen if [ -z "${ARG_KEY_DIR}" ] || [ -z "${ARG_SRC_DIR}" ] || [ -z "${ARG_OUTPUT_DIR}" ]; then 15188d46662SJoseph Chen help 15288d46662SJoseph Chen exit 1 15388d46662SJoseph Chen fi 15488d46662SJoseph Chen} 15588d46662SJoseph Chen 15688d46662SJoseph Chenfunction check_dir_exist() 15788d46662SJoseph Chen{ 15888d46662SJoseph Chen if [ ! -d $1 ]; then 15988d46662SJoseph Chen echo "ERROR: No $1 directory" 16088d46662SJoseph Chen exit 1 16188d46662SJoseph Chen fi 16288d46662SJoseph Chen} 16388d46662SJoseph Chen 16488d46662SJoseph Chenfunction check_file_exist() 16588d46662SJoseph Chen{ 16688d46662SJoseph Chen if [ ! -f $1 ]; then 16788d46662SJoseph Chen echo "ERROR: No $1" 16888d46662SJoseph Chen exit 1 16988d46662SJoseph Chen fi 17088d46662SJoseph Chen} 17188d46662SJoseph Chen 17288d46662SJoseph Chenfunction check_its() 17388d46662SJoseph Chen{ 17488d46662SJoseph Chen cat $1 | while read LINE 17588d46662SJoseph Chen do 17688d46662SJoseph Chen FILE=`echo ${LINE} | sed -n "/incbin/p" | awk -F '"' '{ printf $2 }' | tr -d ' '` 17788d46662SJoseph Chen if [ ! -f ${FILE} ]; then 17888d46662SJoseph Chen echo "ERROR: ${FILE} not exist" 17988d46662SJoseph Chen exit 1 18088d46662SJoseph Chen fi 18188d46662SJoseph Chen done 18288d46662SJoseph Chen} 18388d46662SJoseph Chen 18488d46662SJoseph Chenfunction check_rsa_algo() 18588d46662SJoseph Chen{ 18688d46662SJoseph Chen if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' ${SIGN_CONFIG} ; then 18788d46662SJoseph Chen RSA_ALGO="rsa4096" 18888d46662SJoseph Chen else 18988d46662SJoseph Chen RSA_ALGO="rsa2048" 19088d46662SJoseph Chen fi 19188d46662SJoseph Chen 19288d46662SJoseph Chen if ! grep -q ${RSA_ALGO} $1 ; then 19388d46662SJoseph Chen echo "ERROR: Wrong rsa 'algo' in its file. It should be ${RSA_ALGO}." 19488d46662SJoseph Chen exit 1 19588d46662SJoseph Chen fi 19688d46662SJoseph Chen} 19788d46662SJoseph Chen 19888d46662SJoseph Chenfunction check_rsa_keys() 19988d46662SJoseph Chen{ 20088d46662SJoseph Chen if [ ! -f ${RSA_PRI_KEY} ]; then 20188d46662SJoseph Chen echo "ERROR: No ${RSA_PRI_KEY} " 20288d46662SJoseph Chen exit 1 20388d46662SJoseph Chen elif [ ! -f ${RSA_PUB_KEY} ]; then 20488d46662SJoseph Chen echo "ERROR: No ${RSA_PUB_KEY} " 20588d46662SJoseph Chen exit 1 20688d46662SJoseph Chen elif [ ! -f ${RSA_CRT_KEY} ]; then 20788d46662SJoseph Chen echo "ERROR: No ${RSA_CRT_KEY} " 20888d46662SJoseph Chen exit 1 20988d46662SJoseph Chen fi 21088d46662SJoseph Chen} 21188d46662SJoseph Chen 21288d46662SJoseph Chenfunction sign_loader() 21388d46662SJoseph Chen{ 21488d46662SJoseph Chen echo 21588d46662SJoseph Chen echo "==================== sign loader ====================" 21688d46662SJoseph Chen cp ${INI_PATH} ${UNPACK_LOADER}/ 21788d46662SJoseph Chen INI_PATH=`find ${UNPACK_LOADER}/ -name 'MINIALL.ini'` 21888d46662SJoseph Chen sed -i "s|PATH=|PATH=${SIGN_OUTPUT}\/|g" ${INI_PATH} 21988d46662SJoseph Chen 22088d46662SJoseph Chen # code471 22188d46662SJoseph Chen DDR=`grep "Path1=bin/[^ ]*_ddr_" ${INI_PATH} | tr -d ' '` 22288d46662SJoseph Chen if [ ! -z ${DDR} ]; then 22388d46662SJoseph Chen DDR=${DDR/*=/} 22488d46662SJoseph Chen NEW_DDR=`find ${UNPACK_LOADER}/ -name '*ddr*bin' | head -n 1` 22588d46662SJoseph Chen echo "${DDR} ${NEW_DDR}" 22688d46662SJoseph Chen sed -i "s|${DDR}|${NEW_DDR}|g" ${INI_PATH} 22788d46662SJoseph Chen fi 22888d46662SJoseph Chen # code472 22988d46662SJoseph Chen USBPLUG=`grep "Path1=bin/[^ ]*_usbplug_" ${INI_PATH} | tr -d ' '` 23088d46662SJoseph Chen if [ ! -z ${USBPLUG} ]; then 23188d46662SJoseph Chen USBPLUG=${USBPLUG/*=/} 23288d46662SJoseph Chen NEW_USBPLUG=`find ${UNPACK_LOADER}/ -name '*usbplug*bin' | head -n 1` 23388d46662SJoseph Chen echo "${USBPLUG} ${NEW_USBPLUG}" 23488d46662SJoseph Chen sed -i "s|${USBPLUG}|${NEW_USBPLUG}|g" ${INI_PATH} 23588d46662SJoseph Chen fi 23688d46662SJoseph Chen # FlashData 23788d46662SJoseph Chen FlashData=`grep "FlashData=bin/[^ ]*_ddr_" ${INI_PATH} | tr -d ' '` 23888d46662SJoseph Chen if [ ! -z ${FlashData} ]; then 23988d46662SJoseph Chen FlashData=${FlashData/*=/} 24088d46662SJoseph Chen NEW_FlashData=`find ${UNPACK_LOADER}/ -name '*FlashData*bin' | head -n 1` 24188d46662SJoseph Chen echo "${FlashData} ${NEW_FlashData}" 24288d46662SJoseph Chen sed -i "s|${FlashData}|${NEW_FlashData}|g" ${INI_PATH} 24388d46662SJoseph Chen fi 24488d46662SJoseph Chen # FlashBoot 24588d46662SJoseph Chen FlashBoot=`grep "FlashBoot=bin/[^ ]*_spl_" ${INI_PATH} | tr -d ' '` 24688d46662SJoseph Chen if [ ! -z ${FlashBoot} ]; then 24788d46662SJoseph Chen FlashBoot=${FlashBoot/*=/} 24888d46662SJoseph Chen NEW_FlashBoot=`find ${UNPACK_LOADER}/ -name '*FlashBoot*bin' | head -n 1` 24988d46662SJoseph Chen echo "${FlashBoot} ${NEW_FlashBoot}" 25088d46662SJoseph Chen sed -i "s|${FlashBoot}|${NEW_FlashBoot}|g" ${INI_PATH} 25188d46662SJoseph Chen fi 25288d46662SJoseph Chen # FlashBoost 25388d46662SJoseph Chen FlashBoost=`grep "FlashBoost=bin/[^ ]*_boost_" ${INI_PATH} | tr -d ' '` 25488d46662SJoseph Chen if [ ! -z ${FlashBoost} ]; then 25588d46662SJoseph Chen FlashBoost=${FlashBoost/*=/} 25688d46662SJoseph Chen NEW_FlashBoot=`find ${UNPACK_LOADER}/ -name '*FlashBoost*bin' | head -n 1` 25788d46662SJoseph Chen echo "${FlashBoost} ${NEW_FlashBoot}" 25888d46662SJoseph Chen sed -i "s|${FlashBoost}|${NEW_FlashBoot}|g" ${INI_PATH} 25988d46662SJoseph Chen fi 26088d46662SJoseph Chen 26188d46662SJoseph Chen ${TOOL_BOOT_MERGER} ${INI_PATH} 26288d46662SJoseph Chen 26388d46662SJoseph Chen # chip name 26488d46662SJoseph Chen CHIP_PATTERN='^CONFIG_ROCKCHIP_[R,P][X,V,K][0-9ESXB]{1,5}' 26588d46662SJoseph Chen RKCHIP=`egrep -o ${CHIP_PATTERN} ${SIGN_CONFIG}` 26688d46662SJoseph Chen RKCHIP=${RKCHIP##*_} 26788d46662SJoseph Chen CHIP_NAME=`filt_val "CONFIG_CHIP_NAME" ${SIGN_CONFIG}` 26888d46662SJoseph Chen if [ -z "${CHIP_NAME}" ]; then 26988d46662SJoseph Chen CHIP_NAME=${RKCHIP} 27088d46662SJoseph Chen fi 27188d46662SJoseph Chen 27288d46662SJoseph Chen # sign 27388d46662SJoseph Chen ${TOOL_RK_SIGN} cc --chip ${CHIP_NAME: 2: 6} 27488d46662SJoseph Chen ${TOOL_RK_SIGN} lk --key ${RSA_PRI_KEY} --pubkey ${RSA_PUB_KEY} 27588d46662SJoseph Chen if ls ${SIGN_OUTPUT}/*loader*.bin >/dev/null 2>&1 ; then 27688d46662SJoseph Chen ${TOOL_RK_SIGN} sl --loader ${SIGN_OUTPUT}/*loader*.bin 277*8385bc16SXuhui Lin elif ls ${SIGN_OUTPUT}/MiniLoaderAll.bin >/dev/null 2>&1 ; then 278*8385bc16SXuhui Lin ${TOOL_RK_SIGN} sl --loader ${SIGN_OUTPUT}/MiniLoaderAll.bin 27988d46662SJoseph Chen fi 28088d46662SJoseph Chen if ls ${SIGN_OUTPUT}/*download*.bin >/dev/null 2>&1 ; then 28188d46662SJoseph Chen ${TOOL_RK_SIGN} sl --loader ${SIGN_OUTPUT}/*download*.bin 28288d46662SJoseph Chen fi 28388d46662SJoseph Chen if ls ${SIGN_OUTPUT}/*idblock*.img >/dev/null 2>&1 ; then 28488d46662SJoseph Chen ${TOOL_RK_SIGN} sb --idb ${SIGN_OUTPUT}/*idblock*.img 28588d46662SJoseph Chen fi 28688d46662SJoseph Chen} 28788d46662SJoseph Chen 28888d46662SJoseph Chenfunction sign_uboot() 28988d46662SJoseph Chen{ 29088d46662SJoseph Chen ARG_ROLLBACK_IDX_UBOOT=${ROLLBACK_PARAMS["uboot"]:-0} 29188d46662SJoseph Chen ARG_VER_UBOOT=${VERSION_PARAMS["uboot"]:-0} 29288d46662SJoseph Chen 29388d46662SJoseph Chen echo 29488d46662SJoseph Chen echo "==================== sign uboot.img: version=${ARG_VER_UBOOT}, rollback-index=${ARG_ROLLBACK_IDX_UBOOT} ====================" 29588d46662SJoseph Chen if ! grep -q '^CONFIG_SPL_FIT_SIGNATURE=y' ${SIGN_CONFIG} ; then 29688d46662SJoseph Chen echo "ERROR: CONFIG_SPL_FIT_SIGNATURE is disabled" 29788d46662SJoseph Chen exit 1 29888d46662SJoseph Chen fi 29988d46662SJoseph Chen # spl dtb 30088d46662SJoseph Chen FlashBoot=`find ${UNPACK_LOADER}/ -name '*FlashBoot*bin' | head -n 1` 30188d46662SJoseph Chen TOTALSIZE=`fdtdump -s ${FlashBoot} | grep totalsize | awk '{ print $4 }' | tr -d "()"` 30288d46662SJoseph Chen OFFSET=`fdtdump -s ${FlashBoot} | head -1 | awk -F ":" '{ print $2 }' | sed "s/ found fdt at offset //g" | tr -d " "` 30388d46662SJoseph Chen if [ -z ${OFFSET} ]; then 30488d46662SJoseph Chen echo "ERROR: invalid ${FlashBoot} , unable to find fdt blob" 30588d46662SJoseph Chen fi 30688d46662SJoseph Chen OFFSET=`printf %d ${OFFSET} ` # hex -> dec 30788d46662SJoseph Chen 30888d46662SJoseph Chen dd if=${FlashBoot} of=${SPL_DTB} bs=1 skip=${OFFSET} count=${TOTALSIZE} >/dev/null 2>&1 30988d46662SJoseph Chen 31088d46662SJoseph Chen # rollback-index 31188d46662SJoseph Chen if grep -q '^CONFIG_SPL_FIT_ROLLBACK_PROTECT=y' ${SIGN_CONFIG} ; then 31288d46662SJoseph Chen ARG_SPL_ROLLBACK_PROTECT="y" 31388d46662SJoseph Chen if [ ${ARG_ROLLBACK_IDX_UBOOT} -eq 0 ]; then 31488d46662SJoseph Chen echo "ERROR: No arg \"--rollback-index uboot.img <n>\"" 31588d46662SJoseph Chen exit 1 31688d46662SJoseph Chen fi 31788d46662SJoseph Chen fi 31888d46662SJoseph Chen 31988d46662SJoseph Chen if [ "${ARG_SPL_ROLLBACK_PROTECT}" == "y" ]; then 32088d46662SJoseph Chen VERSION=`grep 'rollback-index' ${ITS_UBOOT} | awk -F '=' '{ printf $2 }' | tr -d ' '` 32188d46662SJoseph Chen sed -i "s/rollback-index = ${VERSION}/rollback-index = <${ARG_ROLLBACK_IDX_UBOOT}>;/g" ${ITS_UBOOT} 32288d46662SJoseph Chen fi 32388d46662SJoseph Chen 32488d46662SJoseph Chen if ! fdtget -l ${UBOOT_DTB} /signature >/dev/null 2>&1 ; then 32588d46662SJoseph Chen ${TOOL_MKIMAGE} -f ${ITS_UBOOT} -k ${ARG_KEY_DIR} -K ${UBOOT_DTB} -E -p ${OFFS_DATA} -r ${ITB_UBOOT} -v ${ARG_VER_UBOOT} 32688d46662SJoseph Chen echo "## Adding RSA public key into ${UBOOT_DTB}" 32788d46662SJoseph Chen fi 32888d46662SJoseph Chen 32988d46662SJoseph Chen if fdtget -l ${SPL_DTB} /signature >/dev/null 2>&1 ; then 33088d46662SJoseph Chen fdtput -r ${SPL_DTB} /signature 33188d46662SJoseph Chen fi 33288d46662SJoseph Chen 33388d46662SJoseph Chen # sign 33488d46662SJoseph Chen ${TOOL_MKIMAGE} -f ${ITS_UBOOT} -k ${ARG_KEY_DIR} -K ${SPL_DTB} -E -p ${OFFS_DATA} -r ${ITB_UBOOT} -v ${ARG_VER_UBOOT} 33588d46662SJoseph Chen 33688d46662SJoseph Chen # burn-key-hash 33788d46662SJoseph Chen if [ "${ARG_BURN_KEY_HASH}" == "y" ]; then 33888d46662SJoseph Chen if grep -q '^CONFIG_SPL_FIT_HW_CRYPTO=y' ${SIGN_CONFIG} ; then 33988d46662SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} burn-key-hash 0x1 34088d46662SJoseph Chen else 34188d46662SJoseph Chen echo "ERROR: --burn-key-hash requires CONFIG_SPL_FIT_HW_CRYPTO=y" 34288d46662SJoseph Chen exit 1 34388d46662SJoseph Chen fi 34488d46662SJoseph Chen fi 34588d46662SJoseph Chen 34688d46662SJoseph Chen # rollback-index read back check 34788d46662SJoseph Chen if [ "${ARG_SPL_ROLLBACK_PROTECT}" == "y" ]; then 34888d46662SJoseph Chen VERSION=`fdtget -ti ${ITB_UBOOT} /configurations/conf rollback-index` 34988d46662SJoseph Chen if [ "${VERSION}" != "${ARG_ROLLBACK_IDX_UBOOT}" ]; then 35088d46662SJoseph Chen echo "ERROR: Failed to set rollback-index for ${ITB_UBOOT}"; 35188d46662SJoseph Chen exit 1 35288d46662SJoseph Chen fi 35388d46662SJoseph Chen else 35488d46662SJoseph Chen if [ ! -z "${ARG_ROLLBACK_IDX_UBOOT}" ]; then 35588d46662SJoseph Chen echo "WARNING: ignore \"--rollback-index uboot.img ${ARG_ROLLBACK_IDX_UBOOT}\" due to CONFIG_SPL_FIT_ROLLBACK_PROTECT=n" 35688d46662SJoseph Chen echo 35788d46662SJoseph Chen fi 35888d46662SJoseph Chen fi 35988d46662SJoseph Chen 36088d46662SJoseph Chen # burn-key-hash read back check 36188d46662SJoseph Chen if [ "${ARG_BURN_KEY_HASH}" == "y" ]; then 36288d46662SJoseph Chen if [ "`fdtget -ti ${SPL_DTB} ${SIGNATURE_KEY_NODE} burn-key-hash`" != "1" ]; then 36388d46662SJoseph Chen echo "ERROR: Failed to set burn-key-hash for ${SPL_DTB}"; 36488d46662SJoseph Chen exit 1 36588d46662SJoseph Chen fi 36688d46662SJoseph Chen fi 36788d46662SJoseph Chen 36888d46662SJoseph Chen # host check signature 36988d46662SJoseph Chen ${TOOL_FIT_CHECK_SIGN} -f ${ITB_UBOOT} -k ${SPL_DTB} -s 37088d46662SJoseph Chen 37188d46662SJoseph Chen # minimize u-boot-spl.dtb: clear as 0 but not remove property. 37288d46662SJoseph Chen if grep -q '^CONFIG_SPL_FIT_HW_CRYPTO=y' ${SIGN_CONFIG} ; then 37388d46662SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,r-squared 0x0 37488d46662SJoseph Chen if grep -q '^CONFIG_SPL_ROCKCHIP_CRYPTO_V1=y' ${SIGN_CONFIG} ; then 37588d46662SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,np 0x0 37688d46662SJoseph Chen fdtput -r ${SPL_DTB} ${SIGNATURE_KEY_NODE}/hash@np 37788d46662SJoseph Chen else 37888d46662SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,c 0x0 37988d46662SJoseph Chen fdtput -r ${SPL_DTB} ${SIGNATURE_KEY_NODE}/hash@c 38088d46662SJoseph Chen fi 38188d46662SJoseph Chen else 38288d46662SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,c 0x0 38388d46662SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,np 0x0 38488d46662SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,exponent-BN 0x0 38588d46662SJoseph Chen fdtput -r ${SPL_DTB} ${SIGNATURE_KEY_NODE}/hash@c 38688d46662SJoseph Chen fdtput -r ${SPL_DTB} ${SIGNATURE_KEY_NODE}/hash@np 38788d46662SJoseph Chen fi 38888d46662SJoseph Chen 38988d46662SJoseph Chen # repack spl 39088d46662SJoseph Chen dd if=${SPL_DTB} of=${FlashBoot} bs=${OFFSET} seek=1 >/dev/null 2>&1 39188d46662SJoseph Chen 39288d46662SJoseph Chen if [ "${ARG_BURN_KEY_HASH}" == "y" ]; then 39388d46662SJoseph Chen echo "## ${SPL_DTB}: burn-key-hash=1" 39488d46662SJoseph Chen fi 39588d46662SJoseph Chen 39688d46662SJoseph Chen ITB_MAX_NUM=`sed -n "/CONFIG_SPL_FIT_IMAGE_MULTIPLE/p" ${SIGN_CONFIG} | awk -F "=" '{ print $2 }'` 39788d46662SJoseph Chen ITB_MAX_KB=`sed -n "/CONFIG_SPL_FIT_IMAGE_KB/p" ${SIGN_CONFIG} | awk -F "=" '{ print $2 }'` 39888d46662SJoseph Chen ITB_MAX_BS=$((ITB_MAX_KB*1024)) 39988d46662SJoseph Chen ITB_BS=`ls -l ${ITB_UBOOT} | awk '{ print $5 }'` 40088d46662SJoseph Chen 40188d46662SJoseph Chen if [ ${ITB_BS} -gt ${ITB_MAX_BS} ]; then 40288d46662SJoseph Chen echo "ERROR: pack uboot.img failed! ${ITB_UBOOT} actual: ${ITB_BS} bytes, max limit: ${ITB_MAX_BS} bytes" 40388d46662SJoseph Chen exit 1 40488d46662SJoseph Chen fi 40588d46662SJoseph Chen 40688d46662SJoseph Chen for ((i = 0; i < ${ITB_MAX_NUM}; i++)); 40788d46662SJoseph Chen do 40888d46662SJoseph Chen cat ${ITB_UBOOT} >> ${IMG_UBOOT} 40988d46662SJoseph Chen truncate -s %${ITB_MAX_KB}K ${IMG_UBOOT} 41088d46662SJoseph Chen done 41188d46662SJoseph Chen} 41288d46662SJoseph Chen 41388d46662SJoseph Chenfunction sign_fit() 41488d46662SJoseph Chen{ 41588d46662SJoseph Chen SRC_FILE="$1.img" 41688d46662SJoseph Chen UNPACK_DIR="${SIGN_DIR}/unpack_$1" 41788d46662SJoseph Chen ITS_FILE="${UNPACK_DIR}/image.its" 41888d46662SJoseph Chen ITB_FILE="${UNPACK_DIR}/image.itb" 41988d46662SJoseph Chen IMG_FILE="${SIGN_OUTPUT}/${SRC_FILE}" 42088d46662SJoseph Chen ARG_VERSION=${VERSION_PARAMS["$1"]:-0} 42188d46662SJoseph Chen ARG_ROLLBACK_IDX=${ROLLBACK_PARAMS["$1"]:-0} 42288d46662SJoseph Chen 42388d46662SJoseph Chen echo 42488d46662SJoseph Chen echo "==================== sign ${SRC_FILE}: version=${ARG_VERSION}, rollback-index=${ARG_ROLLBACK_IDX} ====================" 42588d46662SJoseph Chen cp ${UBOOT_DTB_ORIG} ${UBOOT_DTB} 42688d46662SJoseph Chen rm -rf ${UNPACK_DIR} 42788d46662SJoseph Chen ${TOOL_FIT_UNPACK} -f ${ARG_SRC_DIR}/${SRC_FILE} -o ${UNPACK_DIR} 42888d46662SJoseph Chen check_rsa_algo ${ITS_FILE} 42988d46662SJoseph Chen 43088d46662SJoseph Chen if ! grep -q '^CONFIG_FIT_SIGNATURE=y' ${SIGN_CONFIG} ; then 43188d46662SJoseph Chen echo "ERROR: CONFIG_FIT_SIGNATURE is disabled" 43288d46662SJoseph Chen exit 1 43388d46662SJoseph Chen fi 43488d46662SJoseph Chen 43588d46662SJoseph Chen # ARG_ROLLBACK_IDX default value is 0. 43688d46662SJoseph Chen if grep -q '^CONFIG_FIT_ROLLBACK_PROTECT=y' ${SIGN_CONFIG} ; then 43788d46662SJoseph Chen ARG_ROLLBACK_PROTECT="y" 43888d46662SJoseph Chen if ! grep -q '^CONFIG_OPTEE_CLIENT=y' ${SIGN_CONFIG} ; then 43988d46662SJoseph Chen if [ ${ARG_ROLLBACK_IDX} -gt 0 ]; then 44088d46662SJoseph Chen echo "ERROR: Don't support \"--rollback-index ${SRC_FILE} <n>\" due to CONFIG_FIT_ROLLBACK_PROTECT=y but CONFIG_OPTEE_CLIENT=n" 44188d46662SJoseph Chen exit 1 44288d46662SJoseph Chen fi 44388d46662SJoseph Chen else 44488d46662SJoseph Chen if [ ${ARG_ROLLBACK_IDX} -eq 0 ]; then 44588d46662SJoseph Chen echo "ERROR: No arg \"--rollback-index ${SRC_FILE} <n>\"" 44688d46662SJoseph Chen exit 1 44788d46662SJoseph Chen fi 44888d46662SJoseph Chen fi 44988d46662SJoseph Chen else 45088d46662SJoseph Chen if [ ${ARG_ROLLBACK_IDX} -gt 0 ]; then 45188d46662SJoseph Chen echo "WARNING: ignore \"--rollback-index ${SRC_FILE} ${ARG_ROLLBACK_IDX}\" due to CONFIG_FIT_ROLLBACK_PROTECT=n" 45288d46662SJoseph Chen echo 45388d46662SJoseph Chen fi 45488d46662SJoseph Chen fi 45588d46662SJoseph Chen 45688d46662SJoseph Chen # Limit as same. 45788d46662SJoseph Chen if [ -z "${PREV_ARG_ROLLBACK_IDX}" ]; then 45888d46662SJoseph Chen PREV_ARG_ROLLBACK_IDX=${ARG_ROLLBACK_IDX} 45988d46662SJoseph Chen else 46088d46662SJoseph Chen if [ "${PREV_ARG_ROLLBACK_IDX}" != "${ARG_ROLLBACK_IDX}" ]; then 46188d46662SJoseph Chen echo "ERROR: ${SRC_FILE} rollback version should be the same as previous: ${PREV_ARG_ROLLBACK_IDX}" 46288d46662SJoseph Chen exit 1 46388d46662SJoseph Chen fi 46488d46662SJoseph Chen fi 46588d46662SJoseph Chen 46688d46662SJoseph Chen # fixup for non-thunderboot 46788d46662SJoseph Chen FDT_ADDR_R=`filt_val "fdt_addr_r" ${SIGN_CONFIG}` 46888d46662SJoseph Chen KERNEL_ADDR_R=`filt_val "kernel_addr_r" ${SIGN_CONFIG}` 46988d46662SJoseph Chen RAMDISK_ADDR_R=`filt_val "ramdisk_addr_r" ${SIGN_CONFIG}` 47088d46662SJoseph Chen sed -i "s/${FDT_ADDR_PLACEHOLDER}/${FDT_ADDR_R}/g" ${ITS_FILE} 47188d46662SJoseph Chen sed -i "s/${KERNEL_ADDR_PLACEHOLDER}/${KERNEL_ADDR_R}/g" ${ITS_FILE} 47288d46662SJoseph Chen sed -i "s/${RAMDISK_ADDR_PLACEHOLDER}/${RAMDISK_ADDR_R}/g" ${ITS_FILE} 47388d46662SJoseph Chen 47488d46662SJoseph Chen if [ "${ARG_ROLLBACK_PROTECT}" == "y" ]; then 47588d46662SJoseph Chen VERSION=`grep 'rollback-index' ${ITS_FILE} | awk -F '=' '{ printf $2 }' | tr -d ' '` 47688d46662SJoseph Chen sed -i "s/rollback-index = ${VERSION}/rollback-index = <${ARG_ROLLBACK_IDX}>;/g" ${ITS_FILE} 47788d46662SJoseph Chen fi 47888d46662SJoseph Chen 47988d46662SJoseph Chen # sign 48088d46662SJoseph Chen ${TOOL_MKIMAGE} -f ${ITS_FILE} -k ${ARG_KEY_DIR} -K ${UBOOT_DTB} -E -p ${OFFS_DATA} -r ${ITB_FILE} -v ${ARG_VERSION} 48188d46662SJoseph Chen 48288d46662SJoseph Chen # rollback-index read back check 48388d46662SJoseph Chen if [ "${ARG_ROLLBACK_PROTECT}" == "y" ]; then 48488d46662SJoseph Chen VERSION=`fdtget -ti ${ITB_FILE} /configurations/conf rollback-index` 48588d46662SJoseph Chen if [ "${VERSION}" != "${ARG_ROLLBACK_IDX}" ]; then 48688d46662SJoseph Chen echo "ERROR: Failed to set rollback-index for ${ITB_FILE}"; 48788d46662SJoseph Chen exit 1 48888d46662SJoseph Chen fi 48988d46662SJoseph Chen fi 49088d46662SJoseph Chen 49188d46662SJoseph Chen # host check signature 49288d46662SJoseph Chen ${TOOL_FIT_CHECK_SIGN} -f ${ITB_FILE} -k ${UBOOT_DTB} 49388d46662SJoseph Chen 49488d46662SJoseph Chen # minimize u-boot.dtb: clearn as 0 but not remove property. 49588d46662SJoseph Chen if grep -q '^CONFIG_FIT_HW_CRYPTO=y' ${SIGN_CONFIG} ; then 49688d46662SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,r-squared 0x0 49788d46662SJoseph Chen if grep -q '^CONFIG_ROCKCHIP_CRYPTO_V1=y' ${SIGN_CONFIG} ; then 49888d46662SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,np 0x0 49988d46662SJoseph Chen else 50088d46662SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,c 0x0 50188d46662SJoseph Chen fi 50288d46662SJoseph Chen else 50388d46662SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,c 0x0 50488d46662SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,np 0x0 50588d46662SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,exponent-BN 0x0 50688d46662SJoseph Chen fi 50788d46662SJoseph Chen fdtput -r ${UBOOT_DTB} ${SIGNATURE_KEY_NODE}/hash@c 50888d46662SJoseph Chen fdtput -r ${UBOOT_DTB} ${SIGNATURE_KEY_NODE}/hash@np 50988d46662SJoseph Chen 51088d46662SJoseph Chen cp ${ITB_FILE} ${IMG_FILE} 51188d46662SJoseph Chen} 51288d46662SJoseph Chen 51388d46662SJoseph Chenfunction unpack_loader_uboot() 51488d46662SJoseph Chen{ 51588d46662SJoseph Chen echo 51688d46662SJoseph Chen echo "==================== unpack files ====================" 51788d46662SJoseph Chen # unpack loader 51888d46662SJoseph Chen rm -rf ${UNPACK_LOADER}/ && mkdir -p ${UNPACK_LOADER}/ 51988d46662SJoseph Chen ${TOOL_BOOT_MERGER} unpack -i ${LOADER_NAME} -o ${UNPACK_LOADER}/ 52088d46662SJoseph Chen 52188d46662SJoseph Chen # csum spl 52288d46662SJoseph Chen FlashBoot=`find ${UNPACK_LOADER}/ -name '*FlashBoot*bin' | head -n 1` 52388d46662SJoseph Chen SIZE=`grep 'spl_size=' ${SIGN_CONFIG} | awk -F "=" '{print $2}'` 52488d46662SJoseph Chen dd if=${FlashBoot} of=${UNPACK_LOADER}/u-boot-spl-nodtb.bin bs=1 skip=0 count=${SIZE} >/dev/null 2>&1 52588d46662SJoseph Chen CSUM1=`grep 'spl_sha256sum=' ${SIGN_CONFIG} | awk -F "=" '{print $2}'` 52688d46662SJoseph Chen CSUM2=`sha256sum ${UNPACK_LOADER}/u-boot-spl-nodtb.bin | awk '{ print $1 }'` 52788d46662SJoseph Chen if [ "${CSUM1}" != "${CSUM2}" ]; then 52888d46662SJoseph Chen echo "ERROR: SHA256 checksum is not match:" 52988d46662SJoseph Chen echo " ${CSUM1}: ${LOADER_NAME}/" 53088d46662SJoseph Chen echo " ${CSUM2}: ${SIGN_CONFIG} history" 53188d46662SJoseph Chen echo 53288d46662SJoseph Chen echo "Build info of ${SIGN_CONFIG}:" 53388d46662SJoseph Chen echo " ${BUILD}" 53488d46662SJoseph Chen echo 53588d46662SJoseph Chen exit 1 53688d46662SJoseph Chen fi 53788d46662SJoseph Chen 53888d46662SJoseph Chen # unpack uboot.img 53988d46662SJoseph Chen rm -rf ${UNPACK_UBOOT}/ 54088d46662SJoseph Chen ${TOOL_FIT_UNPACK} -f ${ARG_SRC_DIR}/uboot.img -o ${UNPACK_UBOOT} 54188d46662SJoseph Chen 54288d46662SJoseph Chen # csum uboot 54388d46662SJoseph Chen CSUM1=`grep 'uboot_sha256sum=' ${SIGN_CONFIG} | awk -F "=" '{print $2}'` 54488d46662SJoseph Chen CSUM2=`sha256sum ${UNPACK_UBOOT}/uboot | awk '{ print $1 }'` 54588d46662SJoseph Chen BUILD=`grep 'BUILD:' ${SIGN_CONFIG}` 54688d46662SJoseph Chen if [ "${CSUM1}" != "${CSUM2}" ]; then 54788d46662SJoseph Chen echo "ERROR: SHA256 checksum is not match:" 54888d46662SJoseph Chen echo " ${CSUM1}: uboot in ${ARG_SRC_DIR}/uboot.img" 54988d46662SJoseph Chen echo " ${CSUM2}: in ${SIGN_CONFIG}" 55088d46662SJoseph Chen echo 55188d46662SJoseph Chen echo "Build info of ${SIGN_CONFIG}:" 55288d46662SJoseph Chen echo " ${BUILD}" 55388d46662SJoseph Chen echo 55488d46662SJoseph Chen exit 1 55588d46662SJoseph Chen fi 55688d46662SJoseph Chen 55788d46662SJoseph Chen check_rsa_algo ${ITS_UBOOT} 55888d46662SJoseph Chen if fdtget -l ${UBOOT_DTB} /signature >/dev/null 2>&1 ; then 55988d46662SJoseph Chen fdtput -r ${UBOOT_DTB} /signature 56088d46662SJoseph Chen fi 56188d46662SJoseph Chen cp ${UBOOT_DTB} ${UBOOT_DTB_ORIG} 56288d46662SJoseph Chen} 56388d46662SJoseph Chen 56488d46662SJoseph Chenfunction prepare() 56588d46662SJoseph Chen{ 56688d46662SJoseph Chen if [ ! -d ${SIGN_CFG_DIR} ]; then 56788d46662SJoseph Chen echo "ERROR: No ${SIGN_CFG_DIR} directory" 56888d46662SJoseph Chen exit 1 56988d46662SJoseph Chen fi 57088d46662SJoseph Chen if [ ! -f ${SIGN_CONFIG} ]; then 57188d46662SJoseph Chen echo "ERROR: No ${SIGN_CONFIG} file" 57288d46662SJoseph Chen exit 1 57388d46662SJoseph Chen fi 57488d46662SJoseph Chen if [ ! -f ${ARG_SRC_DIR}/uboot.img ]; then 57588d46662SJoseph Chen echo "ERROR: No ${ARG_SRC_DIR}/uboot.img file" 57688d46662SJoseph Chen exit 1 57788d46662SJoseph Chen fi 57888d46662SJoseph Chen INI_PATH=`find ${SIGN_CFG_DIR} -name 'MINIALL.ini' | head -n 1` 57988d46662SJoseph Chen if [ -z "${INI_PATH}" ]; then 58088d46662SJoseph Chen echo "ERROR: No platform MINIALL.ini file" 58188d46662SJoseph Chen exit 1 58288d46662SJoseph Chen fi 58388d46662SJoseph Chen LOADER_NAME=`find ${ARG_SRC_DIR} -name '*loader*bin' | head -n 1` 58488d46662SJoseph Chen if [ -z "${LOADER_NAME}" ]; then 58588d46662SJoseph Chen LOADER_NAME=`find ${ARG_SRC_DIR} -name '*download*.bin' | head -n 1` 58688d46662SJoseph Chen fi 58788d46662SJoseph Chen if [ -z "${LOADER_NAME}" ]; then 588*8385bc16SXuhui Lin LOADER_NAME=`find ${ARG_SRC_DIR} -name 'MiniLoaderAll.bin' | head -n 1` 589*8385bc16SXuhui Lin fi 590*8385bc16SXuhui Lin if [ -z "${LOADER_NAME}" ]; then 59188d46662SJoseph Chen echo "ERROR: No platform loader or download found" 59288d46662SJoseph Chen exit 1 59388d46662SJoseph Chen fi 59488d46662SJoseph Chen 59588d46662SJoseph Chen rm -rf ${SIGN_DIR} && mkdir -p ${SIGN_OUTPUT} 59688d46662SJoseph Chen} 59788d46662SJoseph Chen 59888d46662SJoseph Chenfunction finish() 59988d46662SJoseph Chen{ 60088d46662SJoseph Chen echo 60188d46662SJoseph Chen echo "Rollback-Index:" 60288d46662SJoseph Chen for FILE in ${SIGN_OUTPUT}/*.img; do 60315257973SJoseph Chen if file $(realpath ${FILE}) | grep -q 'Device Tree Blob' ; then 60488d46662SJoseph Chen VERSION=`fdtget -ti ${FILE} /configurations/conf rollback-index` 60588d46662SJoseph Chen NAME=`basename ${FILE}` 60688d46662SJoseph Chen echo " - ${NAME}=${VERSION}" 60788d46662SJoseph Chen fi 60888d46662SJoseph Chen done 60988d46662SJoseph Chen echo 61088d46662SJoseph Chen echo "OK. Signed images are ready in ${ARG_OUTPUT_DIR}:" 61188d46662SJoseph Chen ls ${SIGN_OUTPUT} 61288d46662SJoseph Chen mv ${SIGN_OUTPUT}/* ${ARG_OUTPUT_DIR}/ 61388d46662SJoseph Chen rm -rf ${SIGN_DIR}/ data2sign* 61488d46662SJoseph Chen echo 61588d46662SJoseph Chen} 61688d46662SJoseph Chen 61788d46662SJoseph Chenfunction main() 61888d46662SJoseph Chen{ 61988d46662SJoseph Chen prepare 62088d46662SJoseph Chen unpack_loader_uboot 62188d46662SJoseph Chen 62288d46662SJoseph Chen for FILE in ${ARG_SRC_DIR}/*.img; do 62388d46662SJoseph Chen if echo ${FILE} | grep -q "uboot.img"; then 62488d46662SJoseph Chen continue; 62588d46662SJoseph Chen fi 62615257973SJoseph Chen if file $(realpath ${FILE}) | grep -q 'Device Tree Blob' ; then 62788d46662SJoseph Chen FILE=$(basename "${FILE}" .img) 62888d46662SJoseph Chen sign_fit ${FILE} 62988d46662SJoseph Chen fi 63088d46662SJoseph Chen done 63188d46662SJoseph Chen 63288d46662SJoseph Chen sign_uboot 63388d46662SJoseph Chen sign_loader 63488d46662SJoseph Chen finish 63588d46662SJoseph Chen} 63688d46662SJoseph Chen 63788d46662SJoseph Chenprocess_args $* 63888d46662SJoseph Chenmain 639