Include 'sys/sysmacros.h' for GCC-9
[platform/upstream/cryptsetup.git] / tests / password-hash-test
1 #!/bin/bash
2
3 # check hash processing in create command
4
5 CRYPTSETUP=../src/cryptsetup
6 DEV_NAME=dmc_test
7 KEY_FILE=keyfile
8
9 DEV2=$DEV_NAME"_x"
10
11 dmremove() { # device
12         udevadm settle >/dev/null 2>&1
13         dmsetup remove $1 >/dev/null 2>&1
14 }
15
16 cleanup() {
17         [ -b /dev/mapper/$DEV2 ] && dmremove $DEV2
18         [ -b /dev/mapper/$DEV_NAME ] && dmremove $DEV_NAME
19         rm -f $KEY_FILE
20         exit $1
21 }
22
23 function fail()
24 {
25         echo " $1 [FAILED]"
26         cleanup 2
27 }
28
29 crypt_key() # hash keysize pwd/file name outkey [limit] [offset]
30 {
31         DEV2=$DEV_NAME"_x"
32         LIMIT=""
33         MODE=aes-cbc-essiv:sha256
34         [ $2 -gt 256 ] && MODE=aes-xts-plain
35         [ -n "$6" ] && LIMIT="-l $6"
36         [ -n "$7" ] && LIMIT="$LIMIT --keyfile-offset $7"
37
38         echo -n "HASH: $1 KSIZE: $2 / $3"
39         case "$3" in
40         pwd)
41                 echo -e -n "$4" | $CRYPTSETUP create -c $MODE -h $1 -s $2 $LIMIT $DEV2 /dev/mapper/$DEV_NAME 2>/dev/null
42                 ret=$?
43                 ;;
44         std-)
45                 echo -e -n "$4" | $CRYPTSETUP create -c $MODE -d "-" -h $1 -s $2 $LIMIT $DEV2 /dev/mapper/$DEV_NAME 2>/dev/null
46                 ret=$?
47                 ;;
48         stdin)
49                 echo -e -n "$4" | $CRYPTSETUP create -c $MODE -h $1 -s $2 $LIMIT $DEV2 /dev/mapper/$DEV_NAME 2>/dev/null
50                 ret=$?
51                 ;;
52         cat)
53                 cat $4 | $CRYPTSETUP create -c $MODE -h $1 -s $2 $LIMIT $DEV2 /dev/mapper/$DEV_NAME 2>/dev/null
54                 ret=$?
55                 ;;
56         cat-)
57                 cat $4 | $CRYPTSETUP create -c $MODE -h $1 -s $2 $LIMIT $DEV2 -d - /dev/mapper/$DEV_NAME 2>/dev/null
58                 ret=$?
59                 ;;
60         file)
61                 $CRYPTSETUP create -q -c $MODE -d $4 -h $1 -s $2 $DEV2 /dev/mapper/$DEV_NAME 2>/dev/null
62                 ret=$?
63                 ;;
64         failpwd)
65                 echo -e -n "$4" | $CRYPTSETUP create -c $MODE -h $1 -s $2 $LIMIT $DEV2 /dev/mapper/$DEV_NAME 2>/dev/null && fail "Expecting failure"
66                 echo " [OK]"
67                 return
68                 ;;
69         *)
70                 fail ""
71                 ;;
72         esac
73
74         # ignore these cases, not all libs/kernel supports it
75         if [ "$1" == "ripemd160" -o $2 -gt 256 ] ; then
76                 if [ $ret -ne 0 ] ; then
77                         echo " [N/A] ($ret, SKIPPED)"
78                         return
79                 fi
80         fi
81
82         VKEY=$(dmsetup table $DEV2 --showkeys 2>/dev/null | sed 's/.*: //' | cut -d' '  -f 5)
83         if [ "$VKEY" != "$5" ] ; then
84                 echo " [FAILED]"
85                 echo "expected: $5"
86                 echo "real key: $VKEY"
87                 cleanup 100
88         else
89                 echo " [OK]"
90         fi
91
92         dmremove $DEV2
93 }
94
95 if [ $(id -u) != 0 ]; then
96         echo "WARNING: You must be root to run this test, test skipped."
97         exit 0
98 fi
99
100 dmsetup create $DEV_NAME --table "0 10240 zero" >/dev/null 2>&1
101
102 crypt_key ripemd160   0 pwd "xxx" aeb26d1f69eb6dddfb9381eed4d7299f091e99aa5d3ff06866d4ce9f620f7aca
103 crypt_key ripemd160 256 pwd "xxx" aeb26d1f69eb6dddfb9381eed4d7299f091e99aa5d3ff06866d4ce9f620f7aca
104 crypt_key ripemd160 128 pwd "xxx" aeb26d1f69eb6dddfb9381eed4d7299f
105 crypt_key sha1      256 pwd "xxx" b60d121b438a380c343d5ec3c2037564b82ffef30b1e0a6ad9af7a73aa91c197
106 crypt_key sha1      128 pwd "xxx" b60d121b438a380c343d5ec3c2037564
107 crypt_key sha256    256 pwd "xxx" cd2eb0837c9b4c962c22d2ff8b5441b7b45805887f051d39bf133b583baf6860
108 crypt_key sha256    128 pwd "xxx" cd2eb0837c9b4c962c22d2ff8b5441b7
109
110 crypt_key sha256   0 std- "xxx"    cd2eb0837c9b4c962c22d2ff8b5441b7b45805887f051d39bf133b583baf6860
111 crypt_key sha256 256 std- "xxx\n"  042aea10a0f14f2d391373599be69d53a75dde9951fc3d3cd10b6100aa7a9f24
112 crypt_key sha256 128 std- "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" \
113                                    2a42b97084779dcedf2c66405c5d296c
114 crypt_key sha256 256 stdin "xxx"   cd2eb0837c9b4c962c22d2ff8b5441b7b45805887f051d39bf133b583baf6860
115 crypt_key sha256   0 stdin "xxx\n" cd2eb0837c9b4c962c22d2ff8b5441b7b45805887f051d39bf133b583baf6860
116
117 # with keyfile, hash is ignored
118 crypt_key ripemd160 256 file /dev/zero 0000000000000000000000000000000000000000000000000000000000000000
119 crypt_key sha256    256 file /dev/zero 0000000000000000000000000000000000000000000000000000000000000000
120 crypt_key unknown*  256 file /dev/zero 0000000000000000000000000000000000000000000000000000000000000000
121
122 # limiting key
123 crypt_key sha256:20 256 pwd "xxx" cd2eb0837c9b4c962c22d2ff8b5441b7b4580588000000000000000000000000
124 crypt_key sha256:32 256 pwd "xxx" cd2eb0837c9b4c962c22d2ff8b5441b7b45805887f051d39bf133b583baf6860
125
126 crypt_key sha256:   256 failpwd "xxx" x
127 crypt_key sha256:xx 256 failpwd "xxx" x
128
129 # key file, 80 chars
130 echo -n -e "0123456789abcdef\n\x01\x00\x03\xff\xff\r\xff\xff\n\r" \
131            "2352j3rkjhadcfasc823rqaw7e1 3dq sdq3d 2dkjqw3h2=====" >$KEY_FILE
132 KEY_FILE_HEX="303132333435363738396162636465660a010003ffff0dffff0a0d20323335326a33726b6a686164636661736338323372716177376531203364712073647133"
133
134 # ignore hash if keyfile is specified
135 crypt_key ripemd160 256 file $KEY_FILE ${KEY_FILE_HEX:0:64}
136 crypt_key sha256    256 file $KEY_FILE ${KEY_FILE_HEX:0:64}
137 crypt_key sha256    128 file $KEY_FILE ${KEY_FILE_HEX:0:32}
138 crypt_key sha256    512 file $KEY_FILE $KEY_FILE_HEX
139
140 # stdin can be limited
141 crypt_key plain     128 cat /dev/zero 00000000000000000000000000000000 16
142 crypt_key plain     128 cat /dev/zero 00000000000000000000000000000000 17
143
144 # read key only up to \n
145 crypt_key plain     128 cat $KEY_FILE ${KEY_FILE_HEX:0:28}0000 14
146
147 # read full key, ignore keyfile length
148 crypt_key plain     128 cat- $KEY_FILE ${KEY_FILE_HEX:0:32}
149 crypt_key plain     128 cat- $KEY_FILE ${KEY_FILE_HEX:0:32} 14
150
151 # but do not ignore hash if keysgfile is "-"
152 crypt_key sha256    128 cat- $KEY_FILE f3b827c8a6f159ad8c8ed5bd5ab3f8c5
153 crypt_key sha256    128 cat- $KEY_FILE f3b827c8a6f159ad8c8ed5bd5ab3f8c5 0
154 crypt_key sha256    128 cat- $KEY_FILE f3b827c8a6f159ad8c8ed5bd5ab3f8c5 80
155 crypt_key sha256    128 cat- $KEY_FILE a82c9227cc54c7475620ce85ba1fca1e 14
156 crypt_key sha256    128 cat- $KEY_FILE 7df3f4a41a33805596be85c781cac3b4 14 2
157 crypt_key sha256    128 cat- $KEY_FILE ebbe65a178e886ddbb778e0a5538db72 40 40
158
159 # limiting plain (no hash)
160 crypt_key plain   256     pwd "xxxxxxxx" 7878787878787878000000000000000000000000000000000000000000000000
161 crypt_key plain:2 256     pwd "xxxxxxxx" 7878000000000000000000000000000000000000000000000000000000000000
162 crypt_key plain:9 256 failpwd "xxxxxxxx" x
163
164 crypt_key sha256    128 cat $KEY_FILE a82c9227cc54c7475620ce85ba1fca1e 14
165 crypt_key sha256:14 128 cat $KEY_FILE a82c9227cc54c7475620ce85ba1f0000 14
166
167 crypt_key sha256    128 pwd "0123456789abcdef" 9f9f5111f7b27a781f1f1ddde5ebc2dd 16
168 crypt_key sha256    128 pwd "0123456789abcdef" 1be2e452b46d7a0d9656bbb1f768e824  4
169 crypt_key sha256    128 pwd "0123"             1be2e452b46d7a0d9656bbb1f768e824  4
170
171 cleanup 0