xref: /OK3568_Linux_fs/buildroot/board/rockchip/common/security-ramdisk-overlay/init.in (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/sh
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun# devtmpfs does not get automounted for initramfs
4*4882a593Smuzhiyun/bin/mount -t devtmpfs devtmpfs /dev
5*4882a593Smuzhiyun/bin/mount -t proc proc /proc
6*4882a593Smuzhiyun/bin/mount -t sysfs sysfs /sys
7*4882a593Smuzhiyun/bin/mount -t tmpfs tmpfs /tmp
8*4882a593Smuzhiyun
9*4882a593Smuzhiyunexec 1>/dev/console
10*4882a593Smuzhiyunexec 2>/dev/console
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunSLOT_SUFIX=
13*4882a593SmuzhiyunSYSTEM_NAME=rootfs
14*4882a593SmuzhiyunBLOCK_PATH=/sys/class/block
15*4882a593SmuzhiyunBLOCK_TYPE_SUPPORTED="
16*4882a593Smuzhiyunmmcblk
17*4882a593Smuzhiyunflash"
18*4882a593Smuzhiyun
19*4882a593SmuzhiyunMSG_OUTPUT=/dev/null
20*4882a593SmuzhiyunDEBUG() {
21*4882a593Smuzhiyun	echo $1 > $MSG_OUTPUT
22*4882a593Smuzhiyun}
23*4882a593Smuzhiyun
24*4882a593Smuzhiyuncheck_device_is_supported() {
25*4882a593Smuzhiyun	for i in $BLOCK_TYPE_SUPPORTED
26*4882a593Smuzhiyun	do
27*4882a593Smuzhiyun		if [ ! -z "$(echo $(basename $1) | grep $i)" ]; then
28*4882a593Smuzhiyun			echo $1
29*4882a593Smuzhiyun			return 0
30*4882a593Smuzhiyun		fi
31*4882a593Smuzhiyun	done
32*4882a593Smuzhiyun}
33*4882a593Smuzhiyun
34*4882a593Smuzhiyunfind_raw_partition() {
35*4882a593Smuzhiyun	local target=$1
36*4882a593Smuzhiyun	local target_dev=
37*4882a593Smuzhiyun	local partname=
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun	DEBUG "try to find block $target"
40*4882a593Smuzhiyun	while true
41*4882a593Smuzhiyun	do
42*4882a593Smuzhiyun		for dev in ${BLOCK_PATH}/*
43*4882a593Smuzhiyun		do
44*4882a593Smuzhiyun			target_dev=$(check_device_is_supported $dev)
45*4882a593Smuzhiyun			if [ ! -z "$target_dev" ]; then
46*4882a593Smuzhiyun				partname=$(cat $target_dev/uevent | grep PARTNAME | sed "s#.*PARTNAME=##")
47*4882a593Smuzhiyun				if [ "$partname" == "$target" ]; then
48*4882a593Smuzhiyun					echo "$(basename $target_dev)"
49*4882a593Smuzhiyun					return 0
50*4882a593Smuzhiyun				fi
51*4882a593Smuzhiyun			fi
52*4882a593Smuzhiyun		done
53*4882a593Smuzhiyun	done
54*4882a593Smuzhiyun}
55*4882a593Smuzhiyun
56*4882a593SmuzhiyunDEBUG "--------------------------"
57*4882a593SmuzhiyunDEBUG "Debug For Security Ramboot"
58*4882a593SmuzhiyunDEBUG "--------------------------"
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun# make sure /dev/ has mounted
61*4882a593Smuzhiyunwhile [ ! -e /dev/mapper/control -o ! -e /proc/mounts ]
62*4882a593Smuzhiyundo
63*4882a593Smuzhiyun	usleep 10000
64*4882a593Smuzhiyun	echo .
65*4882a593Smuzhiyundone
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun# check a/b system
68*4882a593Smuzhiyunif [ ! -z "$(cat /proc/cmdline | grep android_slotsufix)" ]; then
69*4882a593Smuzhiyun	SLOT_SUFIX=$(cat /proc/cmdline | sed "s#.*android_slotsufix=##" | cut -d ' ' -f 1)
70*4882a593Smuzhiyun	SYSTEM_NAME=system
71*4882a593Smuzhiyunfi
72*4882a593Smuzhiyun
73*4882a593SmuzhiyunDEBUG "system name is ${SYSTEM_NAME}${SLOT_SUFIX}"
74*4882a593Smuzhiyunmkdir -p /dev/block/by-name
75*4882a593SmuzhiyunBLOCK=$(find_raw_partition "${SYSTEM_NAME}${SLOT_SUFIX}")
76*4882a593SmuzhiyunDEBUG "find system -> ${BLOCK}"
77*4882a593Smuzhiyunln -s /dev/$BLOCK /dev/block/by-name/system
78*4882a593Smuzhiyun
79*4882a593SmuzhiyunOFFSET=
80*4882a593Smuzhiyun# encrypto partition should get size from dev
81*4882a593Smuzhiyunif [ -z "$OFFSET" ]; then
82*4882a593Smuzhiyun	OFFSET=$(cat /sys/class/block/${BLOCK}/size)
83*4882a593Smuzhiyunfi
84*4882a593Smuzhiyun
85*4882a593SmuzhiyunDEBUG "OFFSET is ${OFFSET}"
86*4882a593Smuzhiyun
87*4882a593SmuzhiyunHASH=
88*4882a593SmuzhiyunCIPHER=
89*4882a593SmuzhiyunENC_EN=
90*4882a593SmuzhiyunFORCE_KEY_WRITE=false
91*4882a593Smuzhiyun
92*4882a593Smuzhiyunif [ "${ENC_EN}" = "true" ]; then
93*4882a593Smuzhiyun	/usr/bin/tee-supplicant &
94*4882a593Smuzhiyun	/usr/bin/keybox_app
95*4882a593Smuzhiyun	if [ "$?" != 0 ] || [ "$FORCE_KEY_WRITE" = "true" ]; then
96*4882a593Smuzhiyun		DEBUG "BAD KEY FETCH -> try to find misc"
97*4882a593Smuzhiyun		MISC_BLOCK=$(find_raw_partition "misc")
98*4882a593Smuzhiyun		DEBUG "find misc -> $MISC_BLOCK"
99*4882a593Smuzhiyun		ln -s /dev/$MISC_BLOCK /dev/block/by-name/misc
100*4882a593Smuzhiyun		/usr/bin/updateEngine --misc_custom read
101*4882a593Smuzhiyun		if [ "$?" != 0 ]; then
102*4882a593Smuzhiyun			if [ "$FORCE_KEY_WRITE" != "true" ]; then
103*4882a593Smuzhiyun				DEBUG "Can't fetch key from misc, reboot !!!"
104*4882a593Smuzhiyun				reboot loader &
105*4882a593Smuzhiyun				while true
106*4882a593Smuzhiyun				do
107*4882a593Smuzhiyun					sleep 1
108*4882a593Smuzhiyun					killall -15 reboot
109*4882a593Smuzhiyun				done
110*4882a593Smuzhiyun				exit 0
111*4882a593Smuzhiyun			fi
112*4882a593Smuzhiyun		else
113*4882a593Smuzhiyun			mv /tmp/custom_cmdline /tmp/syspw
114*4882a593Smuzhiyun			/usr/bin/updateEngine --misc_custom clean
115*4882a593Smuzhiyun			/usr/bin/keybox_app write
116*4882a593Smuzhiyun			echo None > /tmp/syspw
117*4882a593Smuzhiyun		fi
118*4882a593Smuzhiyun		/usr/bin/keybox_app
119*4882a593Smuzhiyun	fi
120*4882a593Smuzhiyun	KEY=`cat /tmp/syspw`
121*4882a593Smuzhiyun	DEBUG "key=$KEY"
122*4882a593Smuzhiyun	dmsetup create vroot --table "0 ${OFFSET} crypt ${CIPHER} ${KEY} 0 /dev/block/by-name/system 0 1 allow_discards"
123*4882a593Smuzhiyun	echo None > /tmp/syspw
124*4882a593Smuzhiyunelse
125*4882a593Smuzhiyun	/usr/sbin/veritysetup --hash-offset=${OFFSET} create vroot /dev/block/by-name/system  /dev/block/by-name/system ${HASH} > /dev/null 2>&1
126*4882a593Smuzhiyunfi
127*4882a593Smuzhiyun
128*4882a593Smuzhiyunkillall tee-supplicant
129*4882a593Smuzhiyun
130*4882a593Smuzhiyunmount /dev/mapper/vroot /mnt
131*4882a593Smuzhiyun
132*4882a593SmuzhiyunLABLE=$(dumpe2fs -h /dev/mapper/vroot | grep name | xargs -n 1 | tail -1)
133*4882a593Smuzhiyun
134*4882a593Smuzhiyunif [ "$LABLE" != "rootfs" ]; then
135*4882a593Smuzhiyun	mount -o remount,rw /mnt
136*4882a593Smuzhiyun	resize2fs /dev/mapper/vroot && tune2fs /dev/mapper/vroot -L rootfs
137*4882a593Smuzhiyunfi
138*4882a593Smuzhiyun
139*4882a593Smuzhiyunif [ -e "/mnt/init" ]; then
140*4882a593Smuzhiyun	INIT=/init
141*4882a593Smuzhiyunelse
142*4882a593Smuzhiyun	INIT=/sbin/init
143*4882a593Smuzhiyunfi
144*4882a593Smuzhiyun# exec /sbin/init "$@"
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun# echo "exec busybox switch_root /mnt ${INIT}"
147*4882a593Smuzhiyun# exec busybox switch_root /mnt ${INIT}
148*4882a593Smuzhiyunexec 0</dev/console
149*4882a593Smuzhiyunexec /sbin/init "$@"
150