xref: /rk3399_rockchip-uboot/scripts/fit-resign.sh (revision 1a9d1d0db00bb2fdb5cd966f648297faabe92fe4)
13301aa1aSJoseph Chen#!/bin/bash
23301aa1aSJoseph Chen#
33301aa1aSJoseph Chen# Copyright (c) 2020 Fuzhou Rockchip Electronics Co., Ltd
475323eb8SJoseph Chen#
53301aa1aSJoseph Chen# SPDX-License-Identifier: GPL-2.0
63301aa1aSJoseph Chen#
73301aa1aSJoseph Chenset -e
83301aa1aSJoseph Chen
91ff581bbSJoseph Chen# [Keys]
101ff581bbSJoseph Chen#	mkdir -p keys
111ff581bbSJoseph Chen#	openssl genpkey -algorithm RSA -out keys/dev.key -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537
121ff581bbSJoseph Chen#	openssl req -batch -new -x509 -key keys/dev.key -out keys/dev.crt
13ee147feaSJoseph Chen#	openssl rsa -in keys/dev.key -pubout -out keys/dev.pubkey
141ff581bbSJoseph Chen# [Sign]
15bff167c5SJoseph Chen#	openssl dgst -sha256 -sign keys/dev.key -sigopt rsa_padding_mode:pss -out sha256-rsa2048.sign fit/boot.data2sign
163301aa1aSJoseph Chen
171ff581bbSJoseph ChenIMG_UBOOT="uboot.img"
181ff581bbSJoseph ChenIMG_BOOT="boot.img"
19*1a9d1d0dSXuhui LinIMG_RECOVERY="recovery.img"
201ff581bbSJoseph Chen
211ff581bbSJoseph Chenfunction usage_resign()
221ff581bbSJoseph Chen{
231ff581bbSJoseph Chen	echo
241ff581bbSJoseph Chen	echo "usage:"
25*1a9d1d0dSXuhui Lin	echo "    $0 -f [itb] -s [sig] -n [num of U-Boot copies] -k [KB of each U-Boot copy]"
261ff581bbSJoseph Chen	echo
271ff581bbSJoseph Chen}
281ff581bbSJoseph Chen
29*1a9d1d0dSXuhui Linfunction arg_check_decimal()
30*1a9d1d0dSXuhui Lin{
31*1a9d1d0dSXuhui Lin	if [ -z $1 ]; then
32*1a9d1d0dSXuhui Lin		usage_resign
33*1a9d1d0dSXuhui Lin		exit 1
34*1a9d1d0dSXuhui Lin	fi
35*1a9d1d0dSXuhui Lin
36*1a9d1d0dSXuhui Lin	decimal=`echo $1 |sed 's/[0-9]//g'`
37*1a9d1d0dSXuhui Lin	if [ ! -z ${decimal} ]; then
38*1a9d1d0dSXuhui Lin		echo "ERROR: $1 is not decimal integer"
39*1a9d1d0dSXuhui Lin		usage_resign
40*1a9d1d0dSXuhui Lin		exit 1
41*1a9d1d0dSXuhui Lin	fi
42*1a9d1d0dSXuhui Lin}
43*1a9d1d0dSXuhui Lin
441ff581bbSJoseph Chenfunction fit_resign()
451ff581bbSJoseph Chen{
46*1a9d1d0dSXuhui Lin	if [ $# -ne 4 -a $# -ne 8 ]; then
471ff581bbSJoseph Chen		usage_resign
481ff581bbSJoseph Chen		exit 1
491ff581bbSJoseph Chen	fi
501ff581bbSJoseph Chen
511ff581bbSJoseph Chen	while [ $# -gt 0 ]; do
521ff581bbSJoseph Chen		case $1 in
531ff581bbSJoseph Chen			-f)
541ff581bbSJoseph Chen				ITB=$2
551ff581bbSJoseph Chen				shift 2
561ff581bbSJoseph Chen				;;
571ff581bbSJoseph Chen			-s)
581ff581bbSJoseph Chen				SIG=$2
591ff581bbSJoseph Chen				shift 2
601ff581bbSJoseph Chen				;;
61*1a9d1d0dSXuhui Lin			-n)
62*1a9d1d0dSXuhui Lin				ITB_MAX_NUM=$2
63*1a9d1d0dSXuhui Lin				arg_check_decimal $2
64*1a9d1d0dSXuhui Lin				shift 2
65*1a9d1d0dSXuhui Lin				;;
66*1a9d1d0dSXuhui Lin			-k)
67*1a9d1d0dSXuhui Lin				ITB_MAX_KB=$2
68*1a9d1d0dSXuhui Lin				arg_check_decimal $2
69*1a9d1d0dSXuhui Lin				shift 2
70*1a9d1d0dSXuhui Lin				;;
711ff581bbSJoseph Chen			*)
721ff581bbSJoseph Chen				usage_resign
731ff581bbSJoseph Chen				exit 1
741ff581bbSJoseph Chen				;;
751ff581bbSJoseph Chen		esac
761ff581bbSJoseph Chen	done
771ff581bbSJoseph Chen
781ff581bbSJoseph Chen	if [ ! -f ${ITB} ]; then
791ff581bbSJoseph Chen		echo "ERROR: No ${ITB}"
801ff581bbSJoseph Chen		exit 1
81e156df43SJoseph Chen	elif ! file ${ITB} | grep 'Device Tree Blob' ; then
82e156df43SJoseph Chen		echo "ERROR: ${ITB} is not FIT image"
83e156df43SJoseph Chen		exit 1
841ff581bbSJoseph Chen	elif [ ! -f ${SIG} ]; then
851ff581bbSJoseph Chen		echo "ERROR: No ${SIG}"
861ff581bbSJoseph Chen		exit 1
871ff581bbSJoseph Chen	fi
881ff581bbSJoseph Chen
891ff581bbSJoseph Chen	copies=`strings ${ITB} | grep "signer-version"  | wc -l`
901ff581bbSJoseph Chen	if [ ${copies} -ne 1 ]; then
911ff581bbSJoseph Chen		echo "ERROR: ${ITB} seems not a itb but a image, ${copies}"
921ff581bbSJoseph Chen		exit 1
931ff581bbSJoseph Chen	fi
941ff581bbSJoseph Chen
951ff581bbSJoseph Chen	SIG_SZ=`ls -l ${SIG} | awk '{ print $5 }'`
961ff581bbSJoseph Chen	LEN=`./tools/fit_info -f ${ITB} -n /configurations/conf/signature -p value | sed -n "/LEN:/p" | awk '{ print $2 }'`
971ff581bbSJoseph Chen	OFF=`./tools/fit_info -f ${ITB} -n /configurations/conf/signature -p value | sed -n "/OFF:/p" | awk '{ print $2 }'`
981ff581bbSJoseph Chen	END=`./tools/fit_info -f ${ITB} -n /configurations/conf/signature -p value | sed -n "/END:/p" | awk '{ print $2 }'`
991ff581bbSJoseph Chen
1001ff581bbSJoseph Chen	if [ -z ${LEN} ]; then
1011ff581bbSJoseph Chen		echo "ERROR: No signature in ${ITB}"
1021ff581bbSJoseph Chen		exit 1
1031ff581bbSJoseph Chen		strings uboot.img | grep "rollback-index" | wc -l
1041ff581bbSJoseph Chen	elif [ "${SIG_SZ}" -ne "${LEN}" ]; then
1051ff581bbSJoseph Chen		echo "ERROR: ${SIG} size ${SIG_SZ} != ${ITB} Signature size ${LEN}"
1061ff581bbSJoseph Chen		exit 1
1071ff581bbSJoseph Chen	fi
1081ff581bbSJoseph Chen
1091ff581bbSJoseph Chen	dd if=${ITB} of=${ITB}.half1 count=1 bs=${OFF}
1101ff581bbSJoseph Chen	dd if=${ITB} of=${ITB}.half2 skip=1 ibs=${END}
1111ff581bbSJoseph Chen
1121ff581bbSJoseph Chen	ITB_RESIGN="${ITB}.resign"
1131ff581bbSJoseph Chen	cat ${ITB}.half1  >  ${ITB_RESIGN}
1141ff581bbSJoseph Chen	cat ${SIG}        >> ${ITB_RESIGN}
1151ff581bbSJoseph Chen	cat ${ITB}.half2  >> ${ITB_RESIGN}
1161ff581bbSJoseph Chen	echo
1171ff581bbSJoseph Chen
1181ff581bbSJoseph Chen	if fdtget -l ${ITB_RESIGN} /images/uboot >/dev/null 2>&1 ; then
119*1a9d1d0dSXuhui Lin		if [ -z ${ITB_MAX_NUM} ]; then
1201ff581bbSJoseph Chen			ITB_MAX_NUM=`sed -n "/SPL_FIT_IMAGE_MULTIPLE/p" .config | awk -F "=" '{ print $2 }'`
121*1a9d1d0dSXuhui Lin		fi
122*1a9d1d0dSXuhui Lin		if [ -z ${ITB_MAX_KB} ]; then
1231ff581bbSJoseph Chen			ITB_MAX_KB=`sed  -n "/SPL_FIT_IMAGE_KB/p" .config | awk -F "=" '{ print $2 }'`
124*1a9d1d0dSXuhui Lin		fi
1251ff581bbSJoseph Chen		ITB_MAX_BS=$((ITB_MAX_KB*1024))
1261ff581bbSJoseph Chen		ITB_BS=`ls -l ${ITB} | awk '{ print $5 }'`
1271ff581bbSJoseph Chen		if [ ${ITB_BS} -gt ${ITB_MAX_BS} ]; then
1281ff581bbSJoseph Chen			echo "ERROR: pack ${IMG_UBOOT} failed! ${ITB} actual: ${ITB_BS} bytes, max limit: ${ITB_MAX_BS} bytes"
1291ff581bbSJoseph Chen			exit 1
1301ff581bbSJoseph Chen		fi
1311ff581bbSJoseph Chen
1321ff581bbSJoseph Chen		rm -f ${IMG_UBOOT}
1331ff581bbSJoseph Chen		for ((i = 0; i < ${ITB_MAX_NUM}; i++));
1341ff581bbSJoseph Chen		do
1351ff581bbSJoseph Chen			cat ${ITB_RESIGN} >> ${IMG_UBOOT}
1361ff581bbSJoseph Chen			truncate -s %${ITB_MAX_KB}K ${IMG_UBOOT}
1371ff581bbSJoseph Chen		done
1381ff581bbSJoseph Chen		echo "Image(re-signed):  ${IMG_UBOOT} is ready"
139*1a9d1d0dSXuhui Lin	elif [ "${ITB}" == "boot.itb" ]; then
1401ff581bbSJoseph Chen		cp ${ITB_RESIGN} ${IMG_BOOT}
1411ff581bbSJoseph Chen		echo "Image(re-signed):  ${IMG_BOOT} is ready"
142*1a9d1d0dSXuhui Lin	elif [ "${ITB}" == "recovery.itb" ]; then
143*1a9d1d0dSXuhui Lin		cp ${ITB_RESIGN} ${IMG_RECOVERY}
144*1a9d1d0dSXuhui Lin		echo "Image(re-signed):  ${IMG_RECOVERY} is ready"
145*1a9d1d0dSXuhui Lin	else
146*1a9d1d0dSXuhui Lin		usage_resign
147*1a9d1d0dSXuhui Lin		exit 1
1481ff581bbSJoseph Chen	fi
1491ff581bbSJoseph Chen
1501ff581bbSJoseph Chen	rm -f ${ITB}.half1 ${ITB}.half2 ${ITB_RESIGN}
1511ff581bbSJoseph Chen}
1521ff581bbSJoseph Chen
15375323eb8SJoseph Chenfit_resign $*
154