xref: /rk3399_rockchip-uboot/scripts/fit-sign.sh (revision 91b5d8722dafb947226dcbd350336e137c5dc1e7)
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