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