1*91b5d872SJoseph Chen#!/bin/bash 2*91b5d872SJoseph Chen# 3*91b5d872SJoseph Chen# Copyright (c) 2024 Rockchip Electronics Co., Ltd 4*91b5d872SJoseph Chen# 5*91b5d872SJoseph Chen# SPDX-License-Identifier: GPL-2.0 6*91b5d872SJoseph Chen# 7*91b5d872SJoseph Chenset -e 8*91b5d872SJoseph Chen 9*91b5d872SJoseph ChenSIGN_DIR=".fit_sign" 10*91b5d872SJoseph ChenSIGN_OUTPUT="${SIGN_DIR}/output" 11*91b5d872SJoseph ChenUNPACK_UBOOT="${SIGN_DIR}/unpack_uboot" 12*91b5d872SJoseph ChenUNPACK_LOADER="${SIGN_DIR}/unpack_loader" 13*91b5d872SJoseph ChenTOOLS=$(cd `dirname $0`; pwd) 14*91b5d872SJoseph Chen# tools 15*91b5d872SJoseph ChenTOOL_MKIMAGE=${TOOLS}/mkimage 16*91b5d872SJoseph ChenTOOL_FIT_UNPACK=${TOOLS}/fit-unpack.sh 17*91b5d872SJoseph ChenTOOL_FIT_CHECK_SIGN=${TOOLS}/fit_check_sign 18*91b5d872SJoseph ChenTOOL_RK_SIGN=${TOOLS}/rk_sign_tool 19*91b5d872SJoseph ChenTOOL_BOOT_MERGER=${TOOLS}/boot_merger 20*91b5d872SJoseph Chen# offset 21*91b5d872SJoseph ChenOFFS_DATA=0x1200 22*91b5d872SJoseph Chen# placeholder address 23*91b5d872SJoseph ChenFDT_ADDR_PLACEHOLDER="0xffffff00" 24*91b5d872SJoseph ChenKERNEL_ADDR_PLACEHOLDER="0xffffff01" 25*91b5d872SJoseph ChenRAMDISK_ADDR_PLACEHOLDER="0xffffff02" 26*91b5d872SJoseph Chen# key 27*91b5d872SJoseph ChenSIGNATURE_KEY_NODE="/signature/key-dev" 28*91b5d872SJoseph Chen# dtb 29*91b5d872SJoseph ChenSPL_DTB="${UNPACK_LOADER}/u-boot-spl.dtb" 30*91b5d872SJoseph ChenUBOOT_DTB="${UNPACK_UBOOT}/fdt" 31*91b5d872SJoseph ChenUBOOT_DTB_ORIG="${UNPACK_UBOOT}/fdt_orig" 32*91b5d872SJoseph Chen# uboot 33*91b5d872SJoseph ChenITS_UBOOT="${UNPACK_UBOOT}/image.its" 34*91b5d872SJoseph ChenITB_UBOOT="${UNPACK_UBOOT}/image.itb" 35*91b5d872SJoseph ChenIMG_UBOOT="${SIGN_OUTPUT}/uboot.img" 36*91b5d872SJoseph Chen# rollback & version 37*91b5d872SJoseph Chendeclare -A ROLLBACK_PARAMS 38*91b5d872SJoseph Chendeclare -A VERSION_PARAMS 39*91b5d872SJoseph Chen 40*91b5d872SJoseph Chen# All required tools: 41*91b5d872SJoseph Chen# 42*91b5d872SJoseph Chen# ├── boot_merger 43*91b5d872SJoseph Chen# ├── fit_check_sign 44*91b5d872SJoseph Chen# ├── fit-unpack.sh 45*91b5d872SJoseph Chen# ├── mkimage 46*91b5d872SJoseph Chen# ├── rk_sign_tool 47*91b5d872SJoseph Chen# └── setting.ini 48*91b5d872SJoseph Chen 49*91b5d872SJoseph Chenfunction filt_val() 50*91b5d872SJoseph Chen{ 51*91b5d872SJoseph Chen sed -n "/${1}=/s/${1}=//p" $2 | tr -d '\r' | tr -d '"' 52*91b5d872SJoseph Chen} 53*91b5d872SJoseph Chen 54*91b5d872SJoseph Chenfunction help() 55*91b5d872SJoseph Chen{ 56*91b5d872SJoseph Chen echo 57*91b5d872SJoseph Chen echo "Usage:" 58*91b5d872SJoseph Chen echo " $0 [args]" 59*91b5d872SJoseph Chen echo 60*91b5d872SJoseph Chen echo "Args:" 61*91b5d872SJoseph Chen echo " --key-dir <dir> | Mandatory" 62*91b5d872SJoseph Chen echo " --src-dir <dir> | Mandatory" 63*91b5d872SJoseph Chen echo " --out-dir <dir> | Mandatory" 64*91b5d872SJoseph Chen echo " --burn-key-hash | Optional" 65*91b5d872SJoseph Chen echo " --rollback-index <image1 n1> <image2 n2> ... | Optional" 66*91b5d872SJoseph Chen echo " --version <image1 n1> <image2 n2> ... | Optional" 67*91b5d872SJoseph Chen echo "" 68*91b5d872SJoseph Chen echo "Example:" 69*91b5d872SJoseph 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" 70*91b5d872SJoseph Chen echo 71*91b5d872SJoseph Chen} 72*91b5d872SJoseph Chen 73*91b5d872SJoseph Chenfunction arg_check_decimal() 74*91b5d872SJoseph Chen{ 75*91b5d872SJoseph Chen if [ -z $1 ]; then 76*91b5d872SJoseph Chen help 77*91b5d872SJoseph Chen exit 1 78*91b5d872SJoseph Chen fi 79*91b5d872SJoseph Chen 80*91b5d872SJoseph Chen DECIMAL=`echo $1 |sed 's/[0-9]//g'` 81*91b5d872SJoseph Chen if [ ! -z ${DECIMAL} ]; then 82*91b5d872SJoseph Chen echo "ERROR: $1 is not decimal integer" 83*91b5d872SJoseph Chen help 84*91b5d872SJoseph Chen exit 1 85*91b5d872SJoseph Chen fi 86*91b5d872SJoseph Chen} 87*91b5d872SJoseph Chen 88*91b5d872SJoseph Chenfunction process_args() 89*91b5d872SJoseph Chen{ 90*91b5d872SJoseph Chen while [ $# -gt 0 ]; do 91*91b5d872SJoseph Chen case $1 in 92*91b5d872SJoseph Chen --key-dir) 93*91b5d872SJoseph Chen ARG_KEY_DIR=$2 94*91b5d872SJoseph Chen RSA_PRI_KEY="${ARG_KEY_DIR}/dev.key" 95*91b5d872SJoseph Chen RSA_PUB_KEY="${ARG_KEY_DIR}/dev.pubkey" 96*91b5d872SJoseph Chen RSA_CRT_KEY="${ARG_KEY_DIR}/dev.crt" 97*91b5d872SJoseph Chen check_dir_exist $2 98*91b5d872SJoseph Chen check_rsa_keys $2 99*91b5d872SJoseph Chen shift 2 100*91b5d872SJoseph Chen ;; 101*91b5d872SJoseph Chen --src-dir) 102*91b5d872SJoseph Chen ARG_SRC_DIR=$2 103*91b5d872SJoseph Chen check_dir_exist $2 104*91b5d872SJoseph Chen SIGN_CFG_DIR="${ARG_SRC_DIR}/fit_signcfg/" 105*91b5d872SJoseph Chen SIGN_CONFIG="${ARG_SRC_DIR}/fit_signcfg/sign.readonly_config" 106*91b5d872SJoseph Chen shift 2 107*91b5d872SJoseph Chen ;; 108*91b5d872SJoseph Chen --out-dir) 109*91b5d872SJoseph Chen ARG_OUTPUT_DIR=$2 110*91b5d872SJoseph Chen check_dir_exist $2 111*91b5d872SJoseph Chen shift 2 112*91b5d872SJoseph Chen ;; 113*91b5d872SJoseph Chen --rollback-index) 114*91b5d872SJoseph Chen shift 1 115*91b5d872SJoseph Chen for arg in "$@"; do 116*91b5d872SJoseph Chen FILE_NAME="${1%.img}" 117*91b5d872SJoseph Chen arg_check_decimal $2 118*91b5d872SJoseph Chen ROLLBACK_PARAMS["${FILE_NAME}"]="$2" 119*91b5d872SJoseph Chen if [[ $3 == *"--"* || -z $3 ]]; then 120*91b5d872SJoseph Chen shift 2 121*91b5d872SJoseph Chen break; 122*91b5d872SJoseph Chen fi 123*91b5d872SJoseph Chen shift 2 124*91b5d872SJoseph Chen done 125*91b5d872SJoseph Chen ;; 126*91b5d872SJoseph Chen --version) 127*91b5d872SJoseph Chen shift 1 128*91b5d872SJoseph Chen for arg in "$@"; do 129*91b5d872SJoseph Chen FILE_NAME="${1%.img}" 130*91b5d872SJoseph Chen arg_check_decimal $2 131*91b5d872SJoseph Chen VERSION_PARAMS["${FILE_NAME}"]="$2" 132*91b5d872SJoseph Chen if [[ $3 == *"--"* || -z $3 ]]; then 133*91b5d872SJoseph Chen shift 2 134*91b5d872SJoseph Chen break; 135*91b5d872SJoseph Chen fi 136*91b5d872SJoseph Chen shift 2 137*91b5d872SJoseph Chen done 138*91b5d872SJoseph Chen ;; 139*91b5d872SJoseph Chen --burn-key-hash) 140*91b5d872SJoseph Chen ARG_BURN_KEY_HASH="y" 141*91b5d872SJoseph Chen shift 1 142*91b5d872SJoseph Chen ;; 143*91b5d872SJoseph Chen *) 144*91b5d872SJoseph Chen help 145*91b5d872SJoseph Chen exit 1 146*91b5d872SJoseph Chen ;; 147*91b5d872SJoseph Chen esac 148*91b5d872SJoseph Chen done 149*91b5d872SJoseph Chen 150*91b5d872SJoseph Chen if [ -z "${ARG_KEY_DIR}" ] || [ -z "${ARG_SRC_DIR}" ] || [ -z "${ARG_OUTPUT_DIR}" ]; then 151*91b5d872SJoseph Chen help 152*91b5d872SJoseph Chen exit 1 153*91b5d872SJoseph Chen fi 154*91b5d872SJoseph Chen} 155*91b5d872SJoseph Chen 156*91b5d872SJoseph Chenfunction check_dir_exist() 157*91b5d872SJoseph Chen{ 158*91b5d872SJoseph Chen if [ ! -d $1 ]; then 159*91b5d872SJoseph Chen echo "ERROR: No $1 directory" 160*91b5d872SJoseph Chen exit 1 161*91b5d872SJoseph Chen fi 162*91b5d872SJoseph Chen} 163*91b5d872SJoseph Chen 164*91b5d872SJoseph Chenfunction check_file_exist() 165*91b5d872SJoseph Chen{ 166*91b5d872SJoseph Chen if [ ! -f $1 ]; then 167*91b5d872SJoseph Chen echo "ERROR: No $1" 168*91b5d872SJoseph Chen exit 1 169*91b5d872SJoseph Chen fi 170*91b5d872SJoseph Chen} 171*91b5d872SJoseph Chen 172*91b5d872SJoseph Chenfunction check_its() 173*91b5d872SJoseph Chen{ 174*91b5d872SJoseph Chen cat $1 | while read LINE 175*91b5d872SJoseph Chen do 176*91b5d872SJoseph Chen FILE=`echo ${LINE} | sed -n "/incbin/p" | awk -F '"' '{ printf $2 }' | tr -d ' '` 177*91b5d872SJoseph Chen if [ ! -f ${FILE} ]; then 178*91b5d872SJoseph Chen echo "ERROR: ${FILE} not exist" 179*91b5d872SJoseph Chen exit 1 180*91b5d872SJoseph Chen fi 181*91b5d872SJoseph Chen done 182*91b5d872SJoseph Chen} 183*91b5d872SJoseph Chen 184*91b5d872SJoseph Chenfunction check_rsa_algo() 185*91b5d872SJoseph Chen{ 186*91b5d872SJoseph Chen if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' ${SIGN_CONFIG} ; then 187*91b5d872SJoseph Chen RSA_ALGO="rsa4096" 188*91b5d872SJoseph Chen else 189*91b5d872SJoseph Chen RSA_ALGO="rsa2048" 190*91b5d872SJoseph Chen fi 191*91b5d872SJoseph Chen 192*91b5d872SJoseph Chen if ! grep -q ${RSA_ALGO} $1 ; then 193*91b5d872SJoseph Chen echo "ERROR: Wrong rsa 'algo' in its file. It should be ${RSA_ALGO}." 194*91b5d872SJoseph Chen exit 1 195*91b5d872SJoseph Chen fi 196*91b5d872SJoseph Chen} 197*91b5d872SJoseph Chen 198*91b5d872SJoseph Chenfunction check_rsa_keys() 199*91b5d872SJoseph Chen{ 200*91b5d872SJoseph Chen if [ ! -f ${RSA_PRI_KEY} ]; then 201*91b5d872SJoseph Chen echo "ERROR: No ${RSA_PRI_KEY} " 202*91b5d872SJoseph Chen exit 1 203*91b5d872SJoseph Chen elif [ ! -f ${RSA_PUB_KEY} ]; then 204*91b5d872SJoseph Chen echo "ERROR: No ${RSA_PUB_KEY} " 205*91b5d872SJoseph Chen exit 1 206*91b5d872SJoseph Chen elif [ ! -f ${RSA_CRT_KEY} ]; then 207*91b5d872SJoseph Chen echo "ERROR: No ${RSA_CRT_KEY} " 208*91b5d872SJoseph Chen exit 1 209*91b5d872SJoseph Chen fi 210*91b5d872SJoseph Chen} 211*91b5d872SJoseph Chen 212*91b5d872SJoseph Chenfunction sign_loader() 213*91b5d872SJoseph Chen{ 214*91b5d872SJoseph Chen echo 215*91b5d872SJoseph Chen echo "==================== sign loader ====================" 216*91b5d872SJoseph Chen cp ${INI_PATH} ${UNPACK_LOADER}/ 217*91b5d872SJoseph Chen INI_PATH=`find ${UNPACK_LOADER}/ -name 'MINIALL.ini'` 218*91b5d872SJoseph Chen sed -i "s|PATH=|PATH=${SIGN_OUTPUT}\/|g" ${INI_PATH} 219*91b5d872SJoseph Chen 220*91b5d872SJoseph Chen # code471 221*91b5d872SJoseph Chen DDR=`grep "Path1=bin/[^ ]*_ddr_" ${INI_PATH} | tr -d ' '` 222*91b5d872SJoseph Chen if [ ! -z ${DDR} ]; then 223*91b5d872SJoseph Chen DDR=${DDR/*=/} 224*91b5d872SJoseph Chen NEW_DDR=`find ${UNPACK_LOADER}/ -name '*ddr*bin' | head -n 1` 225*91b5d872SJoseph Chen echo "${DDR} ${NEW_DDR}" 226*91b5d872SJoseph Chen sed -i "s|${DDR}|${NEW_DDR}|g" ${INI_PATH} 227*91b5d872SJoseph Chen fi 228*91b5d872SJoseph Chen # code472 229*91b5d872SJoseph Chen USBPLUG=`grep "Path1=bin/[^ ]*_usbplug_" ${INI_PATH} | tr -d ' '` 230*91b5d872SJoseph Chen if [ ! -z ${USBPLUG} ]; then 231*91b5d872SJoseph Chen USBPLUG=${USBPLUG/*=/} 232*91b5d872SJoseph Chen NEW_USBPLUG=`find ${UNPACK_LOADER}/ -name '*usbplug*bin' | head -n 1` 233*91b5d872SJoseph Chen echo "${USBPLUG} ${NEW_USBPLUG}" 234*91b5d872SJoseph Chen sed -i "s|${USBPLUG}|${NEW_USBPLUG}|g" ${INI_PATH} 235*91b5d872SJoseph Chen fi 236*91b5d872SJoseph Chen # FlashData 237*91b5d872SJoseph Chen FlashData=`grep "FlashData=bin/[^ ]*_ddr_" ${INI_PATH} | tr -d ' '` 238*91b5d872SJoseph Chen if [ ! -z ${FlashData} ]; then 239*91b5d872SJoseph Chen FlashData=${FlashData/*=/} 240*91b5d872SJoseph Chen NEW_FlashData=`find ${UNPACK_LOADER}/ -name '*FlashData*bin' | head -n 1` 241*91b5d872SJoseph Chen echo "${FlashData} ${NEW_FlashData}" 242*91b5d872SJoseph Chen sed -i "s|${FlashData}|${NEW_FlashData}|g" ${INI_PATH} 243*91b5d872SJoseph Chen fi 244*91b5d872SJoseph Chen # FlashBoot 245*91b5d872SJoseph Chen FlashBoot=`grep "FlashBoot=bin/[^ ]*_spl_" ${INI_PATH} | tr -d ' '` 246*91b5d872SJoseph Chen if [ ! -z ${FlashBoot} ]; then 247*91b5d872SJoseph Chen FlashBoot=${FlashBoot/*=/} 248*91b5d872SJoseph Chen NEW_FlashBoot=`find ${UNPACK_LOADER}/ -name '*FlashBoot*bin' | head -n 1` 249*91b5d872SJoseph Chen echo "${FlashBoot} ${NEW_FlashBoot}" 250*91b5d872SJoseph Chen sed -i "s|${FlashBoot}|${NEW_FlashBoot}|g" ${INI_PATH} 251*91b5d872SJoseph Chen fi 252*91b5d872SJoseph Chen # FlashBoost 253*91b5d872SJoseph Chen FlashBoost=`grep "FlashBoost=bin/[^ ]*_boost_" ${INI_PATH} | tr -d ' '` 254*91b5d872SJoseph Chen if [ ! -z ${FlashBoost} ]; then 255*91b5d872SJoseph Chen FlashBoost=${FlashBoost/*=/} 256*91b5d872SJoseph Chen NEW_FlashBoot=`find ${UNPACK_LOADER}/ -name '*FlashBoost*bin' | head -n 1` 257*91b5d872SJoseph Chen echo "${FlashBoost} ${NEW_FlashBoot}" 258*91b5d872SJoseph Chen sed -i "s|${FlashBoost}|${NEW_FlashBoot}|g" ${INI_PATH} 259*91b5d872SJoseph Chen fi 260*91b5d872SJoseph Chen 261*91b5d872SJoseph Chen ${TOOL_BOOT_MERGER} ${INI_PATH} 262*91b5d872SJoseph Chen 263*91b5d872SJoseph Chen # chip name 264*91b5d872SJoseph Chen CHIP_PATTERN='^CONFIG_ROCKCHIP_[R,P][X,V,K][0-9ESXB]{1,5}' 265*91b5d872SJoseph Chen RKCHIP=`egrep -o ${CHIP_PATTERN} ${SIGN_CONFIG}` 266*91b5d872SJoseph Chen RKCHIP=${RKCHIP##*_} 267*91b5d872SJoseph Chen CHIP_NAME=`filt_val "CONFIG_CHIP_NAME" ${SIGN_CONFIG}` 268*91b5d872SJoseph Chen if [ -z "${CHIP_NAME}" ]; then 269*91b5d872SJoseph Chen CHIP_NAME=${RKCHIP} 270*91b5d872SJoseph Chen fi 271*91b5d872SJoseph Chen 272*91b5d872SJoseph Chen # sign 273*91b5d872SJoseph Chen ${TOOL_RK_SIGN} cc --chip ${CHIP_NAME: 2: 6} 274*91b5d872SJoseph Chen ${TOOL_RK_SIGN} lk --key ${RSA_PRI_KEY} --pubkey ${RSA_PUB_KEY} 275*91b5d872SJoseph Chen if ls ${SIGN_OUTPUT}/*loader*.bin >/dev/null 2>&1 ; then 276*91b5d872SJoseph Chen ${TOOL_RK_SIGN} sl --loader ${SIGN_OUTPUT}/*loader*.bin 277*91b5d872SJoseph Chen fi 278*91b5d872SJoseph Chen if ls ${SIGN_OUTPUT}/*download*.bin >/dev/null 2>&1 ; then 279*91b5d872SJoseph Chen ${TOOL_RK_SIGN} sl --loader ${SIGN_OUTPUT}/*download*.bin 280*91b5d872SJoseph Chen fi 281*91b5d872SJoseph Chen if ls ${SIGN_OUTPUT}/*idblock*.img >/dev/null 2>&1 ; then 282*91b5d872SJoseph Chen ${TOOL_RK_SIGN} sb --idb ${SIGN_OUTPUT}/*idblock*.img 283*91b5d872SJoseph Chen fi 284*91b5d872SJoseph Chen} 285*91b5d872SJoseph Chen 286*91b5d872SJoseph Chenfunction sign_uboot() 287*91b5d872SJoseph Chen{ 288*91b5d872SJoseph Chen ARG_ROLLBACK_IDX_UBOOT=${ROLLBACK_PARAMS["uboot"]:-0} 289*91b5d872SJoseph Chen ARG_VER_UBOOT=${VERSION_PARAMS["uboot"]:-0} 290*91b5d872SJoseph Chen 291*91b5d872SJoseph Chen echo 292*91b5d872SJoseph Chen echo "==================== sign uboot.img: version=${ARG_VER_UBOOT}, rollback-index=${ARG_ROLLBACK_IDX_UBOOT} ====================" 293*91b5d872SJoseph Chen if ! grep -q '^CONFIG_SPL_FIT_SIGNATURE=y' ${SIGN_CONFIG} ; then 294*91b5d872SJoseph Chen echo "ERROR: CONFIG_SPL_FIT_SIGNATURE is disabled" 295*91b5d872SJoseph Chen exit 1 296*91b5d872SJoseph Chen fi 297*91b5d872SJoseph Chen # spl dtb 298*91b5d872SJoseph Chen FlashBoot=`find ${UNPACK_LOADER}/ -name '*FlashBoot*bin' | head -n 1` 299*91b5d872SJoseph Chen TOTALSIZE=`fdtdump -s ${FlashBoot} | grep totalsize | awk '{ print $4 }' | tr -d "()"` 300*91b5d872SJoseph Chen OFFSET=`fdtdump -s ${FlashBoot} | head -1 | awk -F ":" '{ print $2 }' | sed "s/ found fdt at offset //g" | tr -d " "` 301*91b5d872SJoseph Chen if [ -z ${OFFSET} ]; then 302*91b5d872SJoseph Chen echo "ERROR: invalid ${FlashBoot} , unable to find fdt blob" 303*91b5d872SJoseph Chen fi 304*91b5d872SJoseph Chen OFFSET=`printf %d ${OFFSET} ` # hex -> dec 305*91b5d872SJoseph Chen 306*91b5d872SJoseph Chen dd if=${FlashBoot} of=${SPL_DTB} bs=1 skip=${OFFSET} count=${TOTALSIZE} >/dev/null 2>&1 307*91b5d872SJoseph Chen 308*91b5d872SJoseph Chen # rollback-index 309*91b5d872SJoseph Chen if grep -q '^CONFIG_SPL_FIT_ROLLBACK_PROTECT=y' ${SIGN_CONFIG} ; then 310*91b5d872SJoseph Chen ARG_SPL_ROLLBACK_PROTECT="y" 311*91b5d872SJoseph Chen if [ ${ARG_ROLLBACK_IDX_UBOOT} -eq 0 ]; then 312*91b5d872SJoseph Chen echo "ERROR: No arg \"--rollback-index uboot.img <n>\"" 313*91b5d872SJoseph Chen exit 1 314*91b5d872SJoseph Chen fi 315*91b5d872SJoseph Chen fi 316*91b5d872SJoseph Chen 317*91b5d872SJoseph Chen if [ "${ARG_SPL_ROLLBACK_PROTECT}" == "y" ]; then 318*91b5d872SJoseph Chen VERSION=`grep 'rollback-index' ${ITS_UBOOT} | awk -F '=' '{ printf $2 }' | tr -d ' '` 319*91b5d872SJoseph Chen sed -i "s/rollback-index = ${VERSION}/rollback-index = <${ARG_ROLLBACK_IDX_UBOOT}>;/g" ${ITS_UBOOT} 320*91b5d872SJoseph Chen fi 321*91b5d872SJoseph Chen 322*91b5d872SJoseph Chen if ! fdtget -l ${UBOOT_DTB} /signature >/dev/null 2>&1 ; then 323*91b5d872SJoseph Chen ${TOOL_MKIMAGE} -f ${ITS_UBOOT} -k ${ARG_KEY_DIR} -K ${UBOOT_DTB} -E -p ${OFFS_DATA} -r ${ITB_UBOOT} -v ${ARG_VER_UBOOT} 324*91b5d872SJoseph Chen echo "## Adding RSA public key into ${UBOOT_DTB}" 325*91b5d872SJoseph Chen fi 326*91b5d872SJoseph Chen 327*91b5d872SJoseph Chen if fdtget -l ${SPL_DTB} /signature >/dev/null 2>&1 ; then 328*91b5d872SJoseph Chen fdtput -r ${SPL_DTB} /signature 329*91b5d872SJoseph Chen fi 330*91b5d872SJoseph Chen 331*91b5d872SJoseph Chen # sign 332*91b5d872SJoseph Chen ${TOOL_MKIMAGE} -f ${ITS_UBOOT} -k ${ARG_KEY_DIR} -K ${SPL_DTB} -E -p ${OFFS_DATA} -r ${ITB_UBOOT} -v ${ARG_VER_UBOOT} 333*91b5d872SJoseph Chen 334*91b5d872SJoseph Chen # burn-key-hash 335*91b5d872SJoseph Chen if [ "${ARG_BURN_KEY_HASH}" == "y" ]; then 336*91b5d872SJoseph Chen if grep -q '^CONFIG_SPL_FIT_HW_CRYPTO=y' ${SIGN_CONFIG} ; then 337*91b5d872SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} burn-key-hash 0x1 338*91b5d872SJoseph Chen else 339*91b5d872SJoseph Chen echo "ERROR: --burn-key-hash requires CONFIG_SPL_FIT_HW_CRYPTO=y" 340*91b5d872SJoseph Chen exit 1 341*91b5d872SJoseph Chen fi 342*91b5d872SJoseph Chen fi 343*91b5d872SJoseph Chen 344*91b5d872SJoseph Chen # rollback-index read back check 345*91b5d872SJoseph Chen if [ "${ARG_SPL_ROLLBACK_PROTECT}" == "y" ]; then 346*91b5d872SJoseph Chen VERSION=`fdtget -ti ${ITB_UBOOT} /configurations/conf rollback-index` 347*91b5d872SJoseph Chen if [ "${VERSION}" != "${ARG_ROLLBACK_IDX_UBOOT}" ]; then 348*91b5d872SJoseph Chen echo "ERROR: Failed to set rollback-index for ${ITB_UBOOT}"; 349*91b5d872SJoseph Chen exit 1 350*91b5d872SJoseph Chen fi 351*91b5d872SJoseph Chen else 352*91b5d872SJoseph Chen if [ ! -z "${ARG_ROLLBACK_IDX_UBOOT}" ]; then 353*91b5d872SJoseph Chen echo "WARNING: ignore \"--rollback-index uboot.img ${ARG_ROLLBACK_IDX_UBOOT}\" due to CONFIG_SPL_FIT_ROLLBACK_PROTECT=n" 354*91b5d872SJoseph Chen echo 355*91b5d872SJoseph Chen fi 356*91b5d872SJoseph Chen fi 357*91b5d872SJoseph Chen 358*91b5d872SJoseph Chen # burn-key-hash read back check 359*91b5d872SJoseph Chen if [ "${ARG_BURN_KEY_HASH}" == "y" ]; then 360*91b5d872SJoseph Chen if [ "`fdtget -ti ${SPL_DTB} ${SIGNATURE_KEY_NODE} burn-key-hash`" != "1" ]; then 361*91b5d872SJoseph Chen echo "ERROR: Failed to set burn-key-hash for ${SPL_DTB}"; 362*91b5d872SJoseph Chen exit 1 363*91b5d872SJoseph Chen fi 364*91b5d872SJoseph Chen fi 365*91b5d872SJoseph Chen 366*91b5d872SJoseph Chen # host check signature 367*91b5d872SJoseph Chen ${TOOL_FIT_CHECK_SIGN} -f ${ITB_UBOOT} -k ${SPL_DTB} -s 368*91b5d872SJoseph Chen 369*91b5d872SJoseph Chen # minimize u-boot-spl.dtb: clear as 0 but not remove property. 370*91b5d872SJoseph Chen if grep -q '^CONFIG_SPL_FIT_HW_CRYPTO=y' ${SIGN_CONFIG} ; then 371*91b5d872SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,r-squared 0x0 372*91b5d872SJoseph Chen if grep -q '^CONFIG_SPL_ROCKCHIP_CRYPTO_V1=y' ${SIGN_CONFIG} ; then 373*91b5d872SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,np 0x0 374*91b5d872SJoseph Chen fdtput -r ${SPL_DTB} ${SIGNATURE_KEY_NODE}/hash@np 375*91b5d872SJoseph Chen else 376*91b5d872SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,c 0x0 377*91b5d872SJoseph Chen fdtput -r ${SPL_DTB} ${SIGNATURE_KEY_NODE}/hash@c 378*91b5d872SJoseph Chen fi 379*91b5d872SJoseph Chen else 380*91b5d872SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,c 0x0 381*91b5d872SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,np 0x0 382*91b5d872SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,exponent-BN 0x0 383*91b5d872SJoseph Chen fdtput -r ${SPL_DTB} ${SIGNATURE_KEY_NODE}/hash@c 384*91b5d872SJoseph Chen fdtput -r ${SPL_DTB} ${SIGNATURE_KEY_NODE}/hash@np 385*91b5d872SJoseph Chen fi 386*91b5d872SJoseph Chen 387*91b5d872SJoseph Chen # repack spl 388*91b5d872SJoseph Chen dd if=${SPL_DTB} of=${FlashBoot} bs=${OFFSET} seek=1 >/dev/null 2>&1 389*91b5d872SJoseph Chen 390*91b5d872SJoseph Chen if [ "${ARG_BURN_KEY_HASH}" == "y" ]; then 391*91b5d872SJoseph Chen echo "## ${SPL_DTB}: burn-key-hash=1" 392*91b5d872SJoseph Chen fi 393*91b5d872SJoseph Chen 394*91b5d872SJoseph Chen ITB_MAX_NUM=`sed -n "/CONFIG_SPL_FIT_IMAGE_MULTIPLE/p" ${SIGN_CONFIG} | awk -F "=" '{ print $2 }'` 395*91b5d872SJoseph Chen ITB_MAX_KB=`sed -n "/CONFIG_SPL_FIT_IMAGE_KB/p" ${SIGN_CONFIG} | awk -F "=" '{ print $2 }'` 396*91b5d872SJoseph Chen ITB_MAX_BS=$((ITB_MAX_KB*1024)) 397*91b5d872SJoseph Chen ITB_BS=`ls -l ${ITB_UBOOT} | awk '{ print $5 }'` 398*91b5d872SJoseph Chen 399*91b5d872SJoseph Chen if [ ${ITB_BS} -gt ${ITB_MAX_BS} ]; then 400*91b5d872SJoseph Chen echo "ERROR: pack uboot.img failed! ${ITB_UBOOT} actual: ${ITB_BS} bytes, max limit: ${ITB_MAX_BS} bytes" 401*91b5d872SJoseph Chen exit 1 402*91b5d872SJoseph Chen fi 403*91b5d872SJoseph Chen 404*91b5d872SJoseph Chen for ((i = 0; i < ${ITB_MAX_NUM}; i++)); 405*91b5d872SJoseph Chen do 406*91b5d872SJoseph Chen cat ${ITB_UBOOT} >> ${IMG_UBOOT} 407*91b5d872SJoseph Chen truncate -s %${ITB_MAX_KB}K ${IMG_UBOOT} 408*91b5d872SJoseph Chen done 409*91b5d872SJoseph Chen} 410*91b5d872SJoseph Chen 411*91b5d872SJoseph Chenfunction sign_fit() 412*91b5d872SJoseph Chen{ 413*91b5d872SJoseph Chen SRC_FILE="$1.img" 414*91b5d872SJoseph Chen UNPACK_DIR="${SIGN_DIR}/unpack_$1" 415*91b5d872SJoseph Chen ITS_FILE="${UNPACK_DIR}/image.its" 416*91b5d872SJoseph Chen ITB_FILE="${UNPACK_DIR}/image.itb" 417*91b5d872SJoseph Chen IMG_FILE="${SIGN_OUTPUT}/${SRC_FILE}" 418*91b5d872SJoseph Chen ARG_VERSION=${VERSION_PARAMS["$1"]:-0} 419*91b5d872SJoseph Chen ARG_ROLLBACK_IDX=${ROLLBACK_PARAMS["$1"]:-0} 420*91b5d872SJoseph Chen 421*91b5d872SJoseph Chen echo 422*91b5d872SJoseph Chen echo "==================== sign ${SRC_FILE}: version=${ARG_VERSION}, rollback-index=${ARG_ROLLBACK_IDX} ====================" 423*91b5d872SJoseph Chen cp ${UBOOT_DTB_ORIG} ${UBOOT_DTB} 424*91b5d872SJoseph Chen rm -rf ${UNPACK_DIR} 425*91b5d872SJoseph Chen ${TOOL_FIT_UNPACK} -f ${ARG_SRC_DIR}/${SRC_FILE} -o ${UNPACK_DIR} 426*91b5d872SJoseph Chen check_rsa_algo ${ITS_FILE} 427*91b5d872SJoseph Chen 428*91b5d872SJoseph Chen if ! grep -q '^CONFIG_FIT_SIGNATURE=y' ${SIGN_CONFIG} ; then 429*91b5d872SJoseph Chen echo "ERROR: CONFIG_FIT_SIGNATURE is disabled" 430*91b5d872SJoseph Chen exit 1 431*91b5d872SJoseph Chen fi 432*91b5d872SJoseph Chen 433*91b5d872SJoseph Chen # ARG_ROLLBACK_IDX default value is 0. 434*91b5d872SJoseph Chen if grep -q '^CONFIG_FIT_ROLLBACK_PROTECT=y' ${SIGN_CONFIG} ; then 435*91b5d872SJoseph Chen ARG_ROLLBACK_PROTECT="y" 436*91b5d872SJoseph Chen if ! grep -q '^CONFIG_OPTEE_CLIENT=y' ${SIGN_CONFIG} ; then 437*91b5d872SJoseph Chen if [ ${ARG_ROLLBACK_IDX} -gt 0 ]; then 438*91b5d872SJoseph Chen echo "ERROR: Don't support \"--rollback-index ${SRC_FILE} <n>\" due to CONFIG_FIT_ROLLBACK_PROTECT=y but CONFIG_OPTEE_CLIENT=n" 439*91b5d872SJoseph Chen exit 1 440*91b5d872SJoseph Chen fi 441*91b5d872SJoseph Chen else 442*91b5d872SJoseph Chen if [ ${ARG_ROLLBACK_IDX} -eq 0 ]; then 443*91b5d872SJoseph Chen echo "ERROR: No arg \"--rollback-index ${SRC_FILE} <n>\"" 444*91b5d872SJoseph Chen exit 1 445*91b5d872SJoseph Chen fi 446*91b5d872SJoseph Chen fi 447*91b5d872SJoseph Chen else 448*91b5d872SJoseph Chen if [ ${ARG_ROLLBACK_IDX} -gt 0 ]; then 449*91b5d872SJoseph Chen echo "WARNING: ignore \"--rollback-index ${SRC_FILE} ${ARG_ROLLBACK_IDX}\" due to CONFIG_FIT_ROLLBACK_PROTECT=n" 450*91b5d872SJoseph Chen echo 451*91b5d872SJoseph Chen fi 452*91b5d872SJoseph Chen fi 453*91b5d872SJoseph Chen 454*91b5d872SJoseph Chen # Limit as same. 455*91b5d872SJoseph Chen if [ -z "${PREV_ARG_ROLLBACK_IDX}" ]; then 456*91b5d872SJoseph Chen PREV_ARG_ROLLBACK_IDX=${ARG_ROLLBACK_IDX} 457*91b5d872SJoseph Chen else 458*91b5d872SJoseph Chen if [ "${PREV_ARG_ROLLBACK_IDX}" != "${ARG_ROLLBACK_IDX}" ]; then 459*91b5d872SJoseph Chen echo "ERROR: ${SRC_FILE} rollback version should be the same as previous: ${PREV_ARG_ROLLBACK_IDX}" 460*91b5d872SJoseph Chen exit 1 461*91b5d872SJoseph Chen fi 462*91b5d872SJoseph Chen fi 463*91b5d872SJoseph Chen 464*91b5d872SJoseph Chen # fixup for non-thunderboot 465*91b5d872SJoseph Chen FDT_ADDR_R=`filt_val "fdt_addr_r" ${SIGN_CONFIG}` 466*91b5d872SJoseph Chen KERNEL_ADDR_R=`filt_val "kernel_addr_r" ${SIGN_CONFIG}` 467*91b5d872SJoseph Chen RAMDISK_ADDR_R=`filt_val "ramdisk_addr_r" ${SIGN_CONFIG}` 468*91b5d872SJoseph Chen sed -i "s/${FDT_ADDR_PLACEHOLDER}/${FDT_ADDR_R}/g" ${ITS_FILE} 469*91b5d872SJoseph Chen sed -i "s/${KERNEL_ADDR_PLACEHOLDER}/${KERNEL_ADDR_R}/g" ${ITS_FILE} 470*91b5d872SJoseph Chen sed -i "s/${RAMDISK_ADDR_PLACEHOLDER}/${RAMDISK_ADDR_R}/g" ${ITS_FILE} 471*91b5d872SJoseph Chen 472*91b5d872SJoseph Chen if [ "${ARG_ROLLBACK_PROTECT}" == "y" ]; then 473*91b5d872SJoseph Chen VERSION=`grep 'rollback-index' ${ITS_FILE} | awk -F '=' '{ printf $2 }' | tr -d ' '` 474*91b5d872SJoseph Chen sed -i "s/rollback-index = ${VERSION}/rollback-index = <${ARG_ROLLBACK_IDX}>;/g" ${ITS_FILE} 475*91b5d872SJoseph Chen fi 476*91b5d872SJoseph Chen 477*91b5d872SJoseph Chen # sign 478*91b5d872SJoseph Chen ${TOOL_MKIMAGE} -f ${ITS_FILE} -k ${ARG_KEY_DIR} -K ${UBOOT_DTB} -E -p ${OFFS_DATA} -r ${ITB_FILE} -v ${ARG_VERSION} 479*91b5d872SJoseph Chen 480*91b5d872SJoseph Chen # rollback-index read back check 481*91b5d872SJoseph Chen if [ "${ARG_ROLLBACK_PROTECT}" == "y" ]; then 482*91b5d872SJoseph Chen VERSION=`fdtget -ti ${ITB_FILE} /configurations/conf rollback-index` 483*91b5d872SJoseph Chen if [ "${VERSION}" != "${ARG_ROLLBACK_IDX}" ]; then 484*91b5d872SJoseph Chen echo "ERROR: Failed to set rollback-index for ${ITB_FILE}"; 485*91b5d872SJoseph Chen exit 1 486*91b5d872SJoseph Chen fi 487*91b5d872SJoseph Chen fi 488*91b5d872SJoseph Chen 489*91b5d872SJoseph Chen # host check signature 490*91b5d872SJoseph Chen ${TOOL_FIT_CHECK_SIGN} -f ${ITB_FILE} -k ${UBOOT_DTB} 491*91b5d872SJoseph Chen 492*91b5d872SJoseph Chen # minimize u-boot.dtb: clearn as 0 but not remove property. 493*91b5d872SJoseph Chen if grep -q '^CONFIG_FIT_HW_CRYPTO=y' ${SIGN_CONFIG} ; then 494*91b5d872SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,r-squared 0x0 495*91b5d872SJoseph Chen if grep -q '^CONFIG_ROCKCHIP_CRYPTO_V1=y' ${SIGN_CONFIG} ; then 496*91b5d872SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,np 0x0 497*91b5d872SJoseph Chen else 498*91b5d872SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,c 0x0 499*91b5d872SJoseph Chen fi 500*91b5d872SJoseph Chen else 501*91b5d872SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,c 0x0 502*91b5d872SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,np 0x0 503*91b5d872SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,exponent-BN 0x0 504*91b5d872SJoseph Chen fi 505*91b5d872SJoseph Chen fdtput -r ${UBOOT_DTB} ${SIGNATURE_KEY_NODE}/hash@c 506*91b5d872SJoseph Chen fdtput -r ${UBOOT_DTB} ${SIGNATURE_KEY_NODE}/hash@np 507*91b5d872SJoseph Chen 508*91b5d872SJoseph Chen cp ${ITB_FILE} ${IMG_FILE} 509*91b5d872SJoseph Chen} 510*91b5d872SJoseph Chen 511*91b5d872SJoseph Chenfunction unpack_loader_uboot() 512*91b5d872SJoseph Chen{ 513*91b5d872SJoseph Chen echo 514*91b5d872SJoseph Chen echo "==================== unpack files ====================" 515*91b5d872SJoseph Chen # unpack loader 516*91b5d872SJoseph Chen rm -rf ${UNPACK_LOADER}/ && mkdir -p ${UNPACK_LOADER}/ 517*91b5d872SJoseph Chen ${TOOL_BOOT_MERGER} unpack -i ${LOADER_NAME} -o ${UNPACK_LOADER}/ 518*91b5d872SJoseph Chen 519*91b5d872SJoseph Chen # csum spl 520*91b5d872SJoseph Chen FlashBoot=`find ${UNPACK_LOADER}/ -name '*FlashBoot*bin' | head -n 1` 521*91b5d872SJoseph Chen SIZE=`grep 'spl_size=' ${SIGN_CONFIG} | awk -F "=" '{print $2}'` 522*91b5d872SJoseph Chen dd if=${FlashBoot} of=${UNPACK_LOADER}/u-boot-spl-nodtb.bin bs=1 skip=0 count=${SIZE} >/dev/null 2>&1 523*91b5d872SJoseph Chen CSUM1=`grep 'spl_sha256sum=' ${SIGN_CONFIG} | awk -F "=" '{print $2}'` 524*91b5d872SJoseph Chen CSUM2=`sha256sum ${UNPACK_LOADER}/u-boot-spl-nodtb.bin | awk '{ print $1 }'` 525*91b5d872SJoseph Chen if [ "${CSUM1}" != "${CSUM2}" ]; then 526*91b5d872SJoseph Chen echo "ERROR: SHA256 checksum is not match:" 527*91b5d872SJoseph Chen echo " ${CSUM1}: ${LOADER_NAME}/" 528*91b5d872SJoseph Chen echo " ${CSUM2}: ${SIGN_CONFIG} history" 529*91b5d872SJoseph Chen echo 530*91b5d872SJoseph Chen echo "Build info of ${SIGN_CONFIG}:" 531*91b5d872SJoseph Chen echo " ${BUILD}" 532*91b5d872SJoseph Chen echo 533*91b5d872SJoseph Chen exit 1 534*91b5d872SJoseph Chen fi 535*91b5d872SJoseph Chen 536*91b5d872SJoseph Chen # unpack uboot.img 537*91b5d872SJoseph Chen rm -rf ${UNPACK_UBOOT}/ 538*91b5d872SJoseph Chen ${TOOL_FIT_UNPACK} -f ${ARG_SRC_DIR}/uboot.img -o ${UNPACK_UBOOT} 539*91b5d872SJoseph Chen 540*91b5d872SJoseph Chen # csum uboot 541*91b5d872SJoseph Chen CSUM1=`grep 'uboot_sha256sum=' ${SIGN_CONFIG} | awk -F "=" '{print $2}'` 542*91b5d872SJoseph Chen CSUM2=`sha256sum ${UNPACK_UBOOT}/uboot | awk '{ print $1 }'` 543*91b5d872SJoseph Chen BUILD=`grep 'BUILD:' ${SIGN_CONFIG}` 544*91b5d872SJoseph Chen if [ "${CSUM1}" != "${CSUM2}" ]; then 545*91b5d872SJoseph Chen echo "ERROR: SHA256 checksum is not match:" 546*91b5d872SJoseph Chen echo " ${CSUM1}: uboot in ${ARG_SRC_DIR}/uboot.img" 547*91b5d872SJoseph Chen echo " ${CSUM2}: in ${SIGN_CONFIG}" 548*91b5d872SJoseph Chen echo 549*91b5d872SJoseph Chen echo "Build info of ${SIGN_CONFIG}:" 550*91b5d872SJoseph Chen echo " ${BUILD}" 551*91b5d872SJoseph Chen echo 552*91b5d872SJoseph Chen exit 1 553*91b5d872SJoseph Chen fi 554*91b5d872SJoseph Chen 555*91b5d872SJoseph Chen check_rsa_algo ${ITS_UBOOT} 556*91b5d872SJoseph Chen if fdtget -l ${UBOOT_DTB} /signature >/dev/null 2>&1 ; then 557*91b5d872SJoseph Chen fdtput -r ${UBOOT_DTB} /signature 558*91b5d872SJoseph Chen fi 559*91b5d872SJoseph Chen cp ${UBOOT_DTB} ${UBOOT_DTB_ORIG} 560*91b5d872SJoseph Chen} 561*91b5d872SJoseph Chen 562*91b5d872SJoseph Chenfunction prepare() 563*91b5d872SJoseph Chen{ 564*91b5d872SJoseph Chen if [ ! -d ${SIGN_CFG_DIR} ]; then 565*91b5d872SJoseph Chen echo "ERROR: No ${SIGN_CFG_DIR} directory" 566*91b5d872SJoseph Chen exit 1 567*91b5d872SJoseph Chen fi 568*91b5d872SJoseph Chen if [ ! -f ${SIGN_CONFIG} ]; then 569*91b5d872SJoseph Chen echo "ERROR: No ${SIGN_CONFIG} file" 570*91b5d872SJoseph Chen exit 1 571*91b5d872SJoseph Chen fi 572*91b5d872SJoseph Chen if [ ! -f ${ARG_SRC_DIR}/uboot.img ]; then 573*91b5d872SJoseph Chen echo "ERROR: No ${ARG_SRC_DIR}/uboot.img file" 574*91b5d872SJoseph Chen exit 1 575*91b5d872SJoseph Chen fi 576*91b5d872SJoseph Chen INI_PATH=`find ${SIGN_CFG_DIR} -name 'MINIALL.ini' | head -n 1` 577*91b5d872SJoseph Chen if [ -z "${INI_PATH}" ]; then 578*91b5d872SJoseph Chen echo "ERROR: No platform MINIALL.ini file" 579*91b5d872SJoseph Chen exit 1 580*91b5d872SJoseph Chen fi 581*91b5d872SJoseph Chen LOADER_NAME=`find ${ARG_SRC_DIR} -name '*loader*bin' | head -n 1` 582*91b5d872SJoseph Chen if [ -z "${LOADER_NAME}" ]; then 583*91b5d872SJoseph Chen LOADER_NAME=`find ${ARG_SRC_DIR} -name '*download*.bin' | head -n 1` 584*91b5d872SJoseph Chen fi 585*91b5d872SJoseph Chen if [ -z "${LOADER_NAME}" ]; then 586*91b5d872SJoseph Chen echo "ERROR: No platform loader or download found" 587*91b5d872SJoseph Chen exit 1 588*91b5d872SJoseph Chen fi 589*91b5d872SJoseph Chen 590*91b5d872SJoseph Chen rm -rf ${SIGN_DIR} && mkdir -p ${SIGN_OUTPUT} 591*91b5d872SJoseph Chen} 592*91b5d872SJoseph Chen 593*91b5d872SJoseph Chenfunction finish() 594*91b5d872SJoseph Chen{ 595*91b5d872SJoseph Chen echo 596*91b5d872SJoseph Chen echo "Rollback-Index:" 597*91b5d872SJoseph Chen for FILE in ${SIGN_OUTPUT}/*.img; do 598*91b5d872SJoseph Chen if file ${FILE} | grep -q 'Device Tree Blob' ; then 599*91b5d872SJoseph Chen VERSION=`fdtget -ti ${FILE} /configurations/conf rollback-index` 600*91b5d872SJoseph Chen NAME=`basename ${FILE}` 601*91b5d872SJoseph Chen echo " - ${NAME}=${VERSION}" 602*91b5d872SJoseph Chen fi 603*91b5d872SJoseph Chen done 604*91b5d872SJoseph Chen echo 605*91b5d872SJoseph Chen echo "OK. Signed images are ready in ${ARG_OUTPUT_DIR}:" 606*91b5d872SJoseph Chen ls ${SIGN_OUTPUT} 607*91b5d872SJoseph Chen mv ${SIGN_OUTPUT}/* ${ARG_OUTPUT_DIR}/ 608*91b5d872SJoseph Chen rm -rf ${SIGN_DIR}/ data2sign* 609*91b5d872SJoseph Chen echo 610*91b5d872SJoseph Chen} 611*91b5d872SJoseph Chen 612*91b5d872SJoseph Chenfunction main() 613*91b5d872SJoseph Chen{ 614*91b5d872SJoseph Chen prepare 615*91b5d872SJoseph Chen unpack_loader_uboot 616*91b5d872SJoseph Chen 617*91b5d872SJoseph Chen for FILE in ${ARG_SRC_DIR}/*.img; do 618*91b5d872SJoseph Chen if echo ${FILE} | grep -q "uboot.img"; then 619*91b5d872SJoseph Chen continue; 620*91b5d872SJoseph Chen fi 621*91b5d872SJoseph Chen if file ${FILE} | grep -q 'Device Tree Blob' ; then 622*91b5d872SJoseph Chen FILE=$(basename "${FILE}" .img) 623*91b5d872SJoseph Chen sign_fit ${FILE} 624*91b5d872SJoseph Chen fi 625*91b5d872SJoseph Chen done 626*91b5d872SJoseph Chen 627*91b5d872SJoseph Chen sign_uboot 628*91b5d872SJoseph Chen sign_loader 629*91b5d872SJoseph Chen finish 630*91b5d872SJoseph Chen} 631*91b5d872SJoseph Chen 632*91b5d872SJoseph Chenprocess_args $* 633*91b5d872SJoseph Chenmain 634