Rewrite veritysetup to use libcryptsetup.
[platform/upstream/cryptsetup.git] / tests / verity-compat-test
1 #!/bin/bash
2
3 VERITYSETUP=../src/veritysetup
4 #VERITYSETUP=../veritysetup-org
5
6 DEV_NAME=verity3273
7 DEV_OUT="$DEV_NAME.out"
8 IMG=verity-data
9 IMG_HASH=verity-hash
10
11 function remove_mapping()
12 {
13         [ -b /dev/mapper/$DEV_NAME ] && dmsetup remove $DEV_NAME
14         [ ! -z "$LOOPDEV1" ] && losetup -d $LOOPDEV1 >/dev/null 2>&1
15         [ ! -z "$LOOPDEV2" ] && losetup -d $LOOPDEV2 >/dev/null 2>&1
16         rm -f $IMG $IMG_HASH $DEV_OUT >/dev/null 2>&1
17         LOOPDEV1=""
18         LOOPDEV2=""
19 }
20
21 function fail()
22 {
23         [ -n "$1" ] && echo "$1"
24         echo "FAILED"
25         [ -f $DEV_OUT ] && cat $DEV_OUT
26         remove_mapping
27         exit 2
28 }
29
30 function skip()
31 {
32         [ -n "$1" ] && echo "$1"
33         exit 0
34 }
35
36 function prepare() # $1 dev1_siz [$2 dev2_size]
37 {
38         remove_mapping
39
40         dd if=/dev/zero of=$IMG      bs=1k count=$1 >/dev/null 2>&1
41         LOOPDEV1=$(losetup -f 2>/dev/null)
42         [ -z "$LOOPDEV1" ] && fail "No free loop device"
43         losetup $LOOPDEV1 $IMG
44
45         [ -z "$2" ] && return
46         dd if=/dev/zero of=$IMG_HASH bs=1k count=$2 >/dev/null 2>&1
47         LOOPDEV2=$(losetup -f 2>/dev/null)
48         [ -z "$LOOPDEV2" ] && fail "No free loop device"
49         losetup $LOOPDEV2 $IMG_HASH
50 }
51
52 function wipe()
53 {
54         dd if=/dev/zero of=$LOOPDEV1 bs=256k >/dev/null 2>&1
55         dd if=/dev/zero of=$LOOPDEV2 bs=256k >/dev/null 2>&1
56         rm -f $DEV_OUT >/dev/null 2>&1
57 }
58
59 function check_exists()
60 {
61         [ -b /dev/mapper/$DEV_NAME ] || fail
62 }
63
64 function compare_out() # $1 what, $2 expected
65 {
66         OPT=$(grep -v "^#" $DEV_OUT | grep -i "$1" | sed -e s/.*\:\ //)
67         [ -z "$OPT" ] && fail
68         [ $OPT != $2 ] && fail "$1 differs ($OPT)"
69 }
70
71 function check_root_hash() # $1 size, $2 hash, $3 salt, $4 version, $5 hash, [$6 offset]
72 {
73         if [ -z "$LOOPDEV2" ] ; then
74                 BLOCKS=$(($6 * 512 / $1))
75                 DEV_PARAMS="$LOOPDEV1 $LOOPDEV1 \
76                            --hash-start $6 \
77                            --data-blocks=$BLOCKS"
78         else
79                 DEV_PARAMS="$LOOPDEV1 $LOOPDEV2"
80         fi
81
82         for fail in data hash; do
83         wipe
84         echo -n "V$4 $5 block size $1: "
85         $VERITYSETUP -c $DEV_PARAMS --format=$4 \
86                 --data-block-size=$1 --hash-block-size=$1 \
87                 --algorithm=$5 --salt=$3 \
88                 >$DEV_OUT || fail
89
90         echo -n "[root hash]"
91         compare_out "root hash" $2
92         compare_out "alt" "$3"
93
94         $VERITYSETUP -v $DEV_PARAMS $2 >>$DEV_OUT 2>&1 || fail
95         echo -n "[verify]"
96
97         $VERITYSETUP -a $DEV_NAME $DEV_PARAMS $2  >>$DEV_OUT 2>&1 || fail
98         check_exists
99         echo -n "[activate]"
100
101         dd if=/dev/mapper/$DEV_NAME of=/dev/null bs=$1 2>/dev/null
102         dmsetup status $DEV_NAME | grep "verity V" >/dev/null || fail
103         echo -n "[in-kernel verify]"
104
105         dmsetup remove $DEV_NAME || fail
106
107         case $fail in
108         data)
109                 dd if=/dev/urandom of=$LOOPDEV1 bs=1 seek=3456 count=1 2>/dev/null
110                 TXT="data_dev"
111                 ;;
112         hash)
113                 if [ -z "$LOOPDEV2" ] ; then
114                         dd if=/dev/urandom of=$LOOPDEV1 bs=1 seek=$((8193 + $4)) count=1 2>/dev/null
115                 else
116                         dd if=/dev/urandom of=$LOOPDEV2 bs=1 seek=8193 count=1 2>/dev/null
117                 fi
118                 TXT="hash_dev"
119                 ;;
120         esac
121
122         $VERITYSETUP -v $DEV_PARAMS $2 >>$DEV_OUT 2>&1 && \
123                 fail "userspace check for $TXT corruption"
124         $VERITYSETUP -a $DEV_NAME $DEV_PARAMS $2 >>$DEV_OUT 2>&1 || \
125                 fail "activation"
126         dd if=/dev/mapper/$DEV_NAME of=/dev/null bs=$1 2>/dev/null
127         dmsetup status $DEV_NAME | grep "verity V" >/dev/null && \
128                 fail "in-kernel check for $TXT corruption"
129         dmsetup remove $DEV_NAME || fail "deactivation"
130         echo "[$TXT corruption]"
131         done
132 }
133
134 function valgrind_setup()
135 {
136         which valgrind >/dev/null 2>&1 || fail "Cannot find valgrind."
137         [ ! -f $CRYPTSETUP_VALGRIND ] && fail "Unable to get location of cryptsetup executable."
138         #export LD_LIBRARY_PATH="$CRYPTSETUP_LIB_VALGRIND:$LD_LIBRARY_PATH"
139 }
140
141 function valgrind_run()
142 {
143         INFOSTRING="$(basename ${BASH_SOURCE[1]})-line-${BASH_LINENO[0]}" ./valg.sh ${VERITYSETUP} "$@"
144 }
145
146 [ $(id -u) != 0 ] && skip "WARNING: You must be root to run this test, test skipped."
147 [ ! -x "$VERITYSETUP" ] && skip "Cannot find $VERITYSETUP, test skipped."
148
149 [ -n "$VALG" ] && valgrind_setup && VERITYSETUP=valgrind_run
150
151 # VERITYSETUP tests
152
153 SALT=e48da609055204e89ae53b655ca2216dd983cf3cb829f34f63a297d106d53e2d
154
155 echo "Verity tests [separate devices]"
156 prepare 8192 1024
157 check_root_hash  512 9de18652fe74edfb9b805aaed72ae2aa48f94333f1ba5c452ac33b1c39325174 $SALT 1 sha256
158 check_root_hash 1024 54d92778750495d1f80832b486ebd007617d746271511bbf0e295e143da2b3df $SALT 1 sha256
159 check_root_hash 4096 e522df0f97da4febb882ac40f30b37dc0b444bf6df418929463fa25280f09d5c $SALT 1 sha256
160 # version 0
161 check_root_hash 4096 cbbf4ebd004ef65e29b935bb635a39cf754d677f3fa10b0126da725bbdf10f7d $SALT 0 sha256
162 # sha1
163 check_root_hash 1024 d0e9163ca8844aaa2e88fe5265a8c5d9ee494a99 $SALT 1 sha1
164 check_root_hash 1024 73509e8e868be6b8ac939817a98a3d35121413b2 dadada 1 sha1
165
166 echo "Verity tests [one device offset]"
167 prepare $((8192 + 1024))
168 check_root_hash  512 9de18652fe74edfb9b805aaed72ae2aa48f94333f1ba5c452ac33b1c39325174 $SALT 1 sha256 16384
169 check_root_hash 1024 54d92778750495d1f80832b486ebd007617d746271511bbf0e295e143da2b3df $SALT 1 sha256 16384
170 check_root_hash 4096 e522df0f97da4febb882ac40f30b37dc0b444bf6df418929463fa25280f09d5c $SALT 1 sha256 16384
171 # version 0
172 check_root_hash 4096 cbbf4ebd004ef65e29b935bb635a39cf754d677f3fa10b0126da725bbdf10f7d $SALT 0 sha256 16384
173 # sha1
174 check_root_hash 1024 d0e9163ca8844aaa2e88fe5265a8c5d9ee494a99 $SALT 1 sha1 16384
175 check_root_hash 1024 73509e8e868be6b8ac939817a98a3d35121413b2 dadada 1 sha1 16384
176
177 remove_mapping
178 exit 0