blob: d10deb49c5f45b3af9ccc0f5159e844144b0dd77 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#!/bin/bash
2
3TOPDIR=$1
4STAGING_DIR_HOST=$2
5squashfs=$3
6dm_crypt_cfg=$4
7
8SECTOR_SIZE=512
9BLOCK_SIZE=4096
10
11align_up() {
12 local offset=$1
13 local size=$2
14
15 echo $(((($offset + ($size - 1)) / $size) * $size))
16}
17
18verity_get_meta() {
19 local needle="$1"
20 local haystack="$2"
21
22 echo "$haystack" | grep "$needle" | cut -d: -f2 | tr -d '[ \t]'
23}
24
25
26if [[ "$dm_crypt_cfg" == "y" ]]; then
27CRYPT_KEY_SIZE=32
28FIXED_KEY=2f54e5b40c9de5e4700d52f5d3938c1fd19a1d5e05b9dcf74c34a653b4b73ff5
29RANDOM_KEY=$(openssl rand -hex $CRYPT_KEY_SIZE)
30
31openssl enc -aes-$(($CRYPT_KEY_SIZE * 8))-ecb -e -in $squashfs -out "$squashfs"_enc -K $RANDOM_KEY
32mv "$squashfs"_enc $squashfs
33
34ENCRYPTED_KEY=$(echo -ne $RANDOM_KEY | perl -ne 'print pack "H*", $_' | openssl enc \
35 -aes-$(($CRYPT_KEY_SIZE * 8))-ecb -K $FIXED_KEY -nopad | perl -ne 'print unpack "H*", $_' | tr -d '\n')
36fi
37
38VERITY_HASH_OFFSET=$(align_up $(stat --format=%s $squashfs) $BLOCK_SIZE)
39VERITY_HASH_BLOCKS=$(($VERITY_HASH_OFFSET / $BLOCK_SIZE))
40#echo "hash-blocks:"${VERITY_HASH_BLOCKS}
41
42VERITY_META="$(veritysetup format \
43 --hash-offset=$VERITY_HASH_OFFSET \
44 "$squashfs" "$squashfs")"
45
46#echo "VERITY_META= :"${VERITY_META}
47
48VERITY_SALT=$(verity_get_meta Salt "$VERITY_META")
49VERITY_ROOT=$(verity_get_meta Root "$VERITY_META")
50
51ROOT_SECTORS=$(($VERITY_HASH_OFFSET / $SECTOR_SIZE))
52
53ROOT_VERITY="$VERITY_ROOT $VERITY_SALT"
54SMASH_DM_MOD_CREATE="ROOT_SECTORS=$ROOT_SECTORS:HASH_BLOCKS=$VERITY_HASH_BLOCKS:HASHSALT=$ROOT_VERITY"
55if [[ "$dm_crypt_cfg" == "y" ]]; then
56SMASH_DM_MOD_CREATE="$SMASH_DM_MOD_CREATE:ENCRYPTED_KEY=$ENCRYPTED_KEY"
57fi
58DM_SIZE=`echo ${#SMASH_DM_MOD_CREATE}`
59
60DM_ALIGN_SIZE=0x20000
61ROOT_FS_SIZE=$(stat -c%s "$squashfs")
62
63BLOCK_MUL_SIZE=$(($ROOT_FS_SIZE / $DM_ALIGN_SIZE))
64
65if [ $(($ROOT_FS_SIZE % $DM_ALIGN_SIZE)) -eq 0 ]; then
66 APPEND_POS=$ROOT_FS_SIZE
67else
68 APPEND_POS=$((($BLOCK_MUL_SIZE + 1) * $DM_ALIGN_SIZE))
69fi
70
71FILL_SIZE=$(($APPEND_POS - $ROOT_FS_SIZE))
72dd if=/dev/zero of=$squashfs conv=notrunc bs=1 seek=$ROOT_FS_SIZE count=$FILL_SIZE
73echo -n -e "DM_SIZE=$DM_SIZE:"${SMASH_DM_MOD_CREATE} | dd of=$squashfs conv=notrunc bs=1 seek=$APPEND_POS
74