Makefile: Add security compiling option (RELRO, SC, and FORTIFY)
[platform/upstream/cryptsetup.git] / tests / unit-wipe-test
1 #!/bin/bash
2
3 WIPE_UNIT=./unit-wipe
4 FILE=./wipe_localfile
5 FILE_RAND=./wipe_random_localfile
6 MB_BYTES=$((1024*1024))
7 DEVSIZEMB=8
8 DEVSIZE=$((DEVSIZEMB*$MB_BYTES))
9
10 HASH_EMPTY=2daeb1f36095b44b318410b3f4e8b5d989dcc7bb023d1426c492dab0a3053e74
11
12 function cleanup() {
13         rm -f $FILE $FILE_RAND 2> /dev/null
14         sleep 1
15         rmmod scsi_debug >/dev/null 2>&1
16 }
17
18 function fail()
19 {
20         if [ -n "$1" ] ; then echo "FAIL $1" ; else echo "FAIL" ; fi
21         echo "FAILED backtrace:"
22         while caller $frame; do ((frame++)); done
23         cleanup
24         exit 100
25 }
26
27 function skip()
28 {
29         echo "TEST SKIPPED: $1"
30         cleanup
31         exit 77
32 }
33
34 function add_device()
35 {
36         rmmod scsi_debug >/dev/null 2>&1
37         if [ -d /sys/module/scsi_debug ] ; then
38                 skip "Cannot use scsi_debug module (in use or compiled-in)."
39         fi
40         modprobe scsi_debug dev_size_mb=$DEVSIZEMB num_tgts=1 delay=0 >/dev/null 2>&1
41         if [ $? -ne 0 ] ; then
42                 skip "This kernel seems to not support proper scsi_debug module."
43         fi
44         grep -q scsi_debug /sys/block/*/device/model || sleep 2
45         DEV=$(grep -l -e scsi_debug /sys/block/*/device/model | cut -f4 -d /)
46         DEV="/dev/$DEV"
47         [ -b $DEV ] || fail "Cannot find $DEV."
48 }
49
50 function check_hash() # $1 dev, $2 hash
51 {
52         local HASH=$(sha256sum $1 | cut -d' ' -f 1)
53         [ $HASH == "$2" ]
54 }
55
56 function init_hash_dd() # $1 dev, $dev orig
57 {
58         dd if=/dev/urandom of=$2 bs=1M count=$DEVSIZEMB conv=notrunc 2> /dev/null
59         dd if=$2 of=$1 bs=1M conv=notrunc 2> /dev/null
60         HASH_0=$(sha256sum $1 | cut -d' ' -f 1)
61         # second MB wiped
62         dd if=/dev/zero of=$1 bs=1M seek=1 count=1 conv=notrunc 2> /dev/null
63         HASH_1=$(sha256sum $1 | cut -d' ' -f 1)
64         # 4,5,6 MB wiped
65         dd if=/dev/zero of=$1 bs=1M seek=4 count=3 conv=notrunc 2> /dev/null
66         HASH_2=$(sha256sum $1 | cut -d' ' -f 1)
67         dd if=$2 of=$1 bs=1M conv=notrunc 2> /dev/null
68 }
69
70 function add_file()
71 {
72         dd if=/dev/zero of=$FILE      bs=1M count=$DEVSIZEMB 2> /dev/null || fail
73         dd if=/dev/zero of=$FILE_RAND bs=1M count=$DEVSIZEMB 2> /dev/null || fail
74         check_hash $FILE $HASH_EMPTY || fail
75         check_hash $FILE_RAND $HASH_EMPTY || fail
76         dd if=$FILE of=/dev/null bs=4096 count=1 iflag=direct >/dev/null 2>&1 || FILE_NODIO=1
77 }
78
79 function test_wipe_full() # $1 dev, $2 block size, [$3 flags]
80 {
81         # wipe random and back to zero
82         $WIPE_UNIT $1 random 0 $DEVSIZE $2 $3 || fail
83         check_hash $1 $HASH_EMPTY && fail "Failed random wipe"
84         $WIPE_UNIT $1 zero 0 $DEVSIZE $2 $3 || fail
85         check_hash $1 $HASH_EMPTY || fail "Failed zero wipe"
86 }
87
88 # wipe MB blocks, with zero, random and special and back to original
89 function test_wipe_blocks() # $1 dev $2 block sizem [$3 flags]
90 {
91         init_hash_dd $1 $FILE_RAND
92         check_hash $1 $HASH_0 || fail
93
94         $WIPE_UNIT $1 zero    $((1*$MB_BYTES)) $((1*$MB_BYTES)) $2 $3 || fail
95         check_hash $1 $HASH_1 || fail
96         $WIPE_UNIT $1 random  $((1*$MB_BYTES)) $((1*$MB_BYTES)) $2 $3 || fail
97         check_hash $1 $HASH_1 && fail
98         $WIPE_UNIT $1 special $((1*$MB_BYTES)) $((1*$MB_BYTES)) $2 $3 || fail
99         check_hash $1 $HASH_1 && fail
100         $WIPE_UNIT $1 zero    $((1*$MB_BYTES)) $((1*$MB_BYTES)) $2 $3 || fail
101         check_hash $1 $HASH_1 || fail
102
103         $WIPE_UNIT $1 zero    $((4*$MB_BYTES)) $((3*$MB_BYTES)) $2 $3 || fail
104         check_hash $1 $HASH_2 || fail
105         $WIPE_UNIT $1 random  $((4*$MB_BYTES)) $((3*$MB_BYTES)) $2 $3 || fail
106         check_hash $1 $HASH_2 && fail
107         $WIPE_UNIT $1 special $((4*$MB_BYTES)) $((3*$MB_BYTES)) $2 $3 || fail
108         check_hash $1 $HASH_2 && fail
109         $WIPE_UNIT $1 zero    $((4*$MB_BYTES)) $((3*$MB_BYTES)) $2 $3 || fail
110         check_hash $1 $HASH_2 || fail
111 }
112
113 test -x $WIPE_UNIT || skip "Run \"make `basename $WIPE_UNIT`\" first"
114
115 cleanup
116 add_file
117
118 echo -n "[1] Wipe full file "
119 for bs in 0 $MB_BYTES $((4*$MB_BYTES)); do
120         if [ -n "$FILE_NODIO" ]; then
121                 echo -n [$bs/DIO N/A]
122         else
123                 echo -n [$bs/DIO]
124                 test_wipe_full $FILE $bs
125         fi
126         echo -n [$bs]
127         test_wipe_full $FILE $bs no-dio
128 done
129 echo "[OK]"
130
131 echo -n "[2] Wipe blocks in file "
132 for bs in 0 $MB_BYTES $((4*$MB_BYTES)); do
133         if [ -n "$FILE_NODIO" ]; then
134                 echo -n [$bs/DIO N/A]
135         else
136                 echo -n [$bs/DIO]
137                 test_wipe_blocks $FILE $bs
138         fi
139         echo -n [$bs]
140         test_wipe_blocks $FILE $bs no-dio
141 done
142 echo "[OK]"
143
144 [ $(id -u) -eq 0 ] || {
145         echo "WARNING: You must be root to run remaining tests."
146         cleanup
147         exit 0
148 }
149
150 add_device
151
152 echo -n "[3] Wipe full block device "
153 for bs in 0 $MB_BYTES $((4*$MB_BYTES)); do
154         echo -n [$bs/DIO]
155         test_wipe_full $DEV $bs
156         echo -n [$bs]
157         test_wipe_full $DEV $bs no-dio
158 done
159 echo "[OK]"
160
161 echo -n "[4] Wipe blocks in block device "
162 for bs in 0 $MB_BYTES $((4*$MB_BYTES)); do
163         echo -n [$bs/DIO]
164         test_wipe_blocks $DEV $bs
165         echo -n [$bs]
166         test_wipe_blocks $DEV $bs no-dio
167 done
168 echo "[OK]"
169
170 cleanup