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