Fixed the build error for riscv64 arch using gcc 13
[platform/upstream/cryptsetup.git] / tests / crypto-vectors.c
1 /*
2  * cryptsetup crypto backend test vectors
3  *
4  * Copyright (C) 2018-2021 Milan Broz
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <errno.h>
25
26 #include "crypto_backend.h"
27
28 #ifndef ARRAY_SIZE
29 # define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
30 #endif
31
32 static void printhex(const char *s, const char *buf, size_t len)
33 {
34         size_t i;
35
36         printf("%s: ", s);
37         for (i = 0; i < len; i++)
38                 printf(" %02x", (unsigned char)buf[i]);
39         printf("\n");
40         fflush(stdout);
41 }
42
43 /*
44  * KDF tests
45  */
46 struct kdf_test_vector {
47         const char *type;
48         const char *hash;
49         unsigned int hash_block_length;
50         unsigned int iterations;
51         unsigned int memory;
52         unsigned int parallelism;
53         const char *password;
54         unsigned int password_length;
55         const char *salt;
56         unsigned int salt_length;
57 //      const char *key;
58 //      unsigned int key_length;
59 //      const char *ad;
60 //      unsigned int ad_length;
61         const char *output;
62         unsigned int output_length;
63 };
64
65 static struct kdf_test_vector kdf_test_vectors[] = {
66         /* Argon2 RFC (without key and ad values) */
67         {
68                 "argon2i", NULL, 0, 3, 32, 4,
69                 "\x01\x01\x01\x01\x01\x01\x01\x01"
70                 "\x01\x01\x01\x01\x01\x01\x01\x01"
71                 "\x01\x01\x01\x01\x01\x01\x01\x01"
72                 "\x01\x01\x01\x01\x01\x01\x01\x01", 32,
73                 "\x02\x02\x02\x02\x02\x02\x02\x02"
74                 "\x02\x02\x02\x02\x02\x02\x02\x02", 16,
75 //              "\x03\x03\x03\x03\x03\x03\x03\x03", 8,
76 //              "\x04\x04\x04\x04\x04\x04\x04\x04"
77 //              "\x04\x04\x04\x04", 12,
78                 "\xa9\xa7\x51\x0e\x6d\xb4\xd5\x88"
79                 "\xba\x34\x14\xcd\x0e\x09\x4d\x48"
80                 "\x0d\x68\x3f\x97\xb9\xcc\xb6\x12"
81                 "\xa5\x44\xfe\x8e\xf6\x5b\xa8\xe0", 32
82 //              "\xc8\x14\xd9\xd1\xdc\x7f\x37\xaa"
83 //              "\x13\xf0\xd7\x7f\x24\x94\xbd\xa1"
84 //              "\xc8\xde\x6b\x01\x6d\xd3\x88\xd2"
85 //              "\x99\x52\xa4\xc4\x67\x2b\x6c\xe8", 32
86         },
87         {
88                 "argon2id", NULL, 0, 3, 32, 4,
89                 "\x01\x01\x01\x01\x01\x01\x01\x01"
90                 "\x01\x01\x01\x01\x01\x01\x01\x01"
91                 "\x01\x01\x01\x01\x01\x01\x01\x01"
92                 "\x01\x01\x01\x01\x01\x01\x01\x01", 32,
93                 "\x02\x02\x02\x02\x02\x02\x02\x02"
94                 "\x02\x02\x02\x02\x02\x02\x02\x02", 16,
95 //              "\x03\x03\x03\x03\x03\x03\x03\x03", 8,
96 //              "\x04\x04\x04\x04\x04\x04\x04\x04"
97 //              "\x04\x04\x04\x04", 12,
98                 "\x03\xaa\xb9\x65\xc1\x20\x01\xc9"
99                 "\xd7\xd0\xd2\xde\x33\x19\x2c\x04"
100                 "\x94\xb6\x84\xbb\x14\x81\x96\xd7"
101                 "\x3c\x1d\xf1\xac\xaf\x6d\x0c\x2e", 32
102 //              "\x0d\x64\x0d\xf5\x8d\x78\x76\x6c"
103 //              "\x08\xc0\x37\xa3\x4a\x8b\x53\xc9"
104 //              "\xd0\x1e\xf0\x45\x2d\x75\xb6\x5e"
105 //              "\xb5\x25\x20\xe9\x6b\x01\xe6\x59", 32
106         },
107         /* RFC 3962 */
108         {
109                 "pbkdf2", "sha1", 64, 1, 0, 0,
110                 "password", 8,
111                 "ATHENA.MIT.EDUraeburn", 21,
112                 "\xcd\xed\xb5\x28\x1b\xb2\xf8\x01"
113                 "\x56\x5a\x11\x22\xb2\x56\x35\x15"
114                 "\x0a\xd1\xf7\xa0\x4b\xb9\xf3\xa3"
115                 "\x33\xec\xc0\xe2\xe1\xf7\x08\x37", 32
116         }, {
117                 "pbkdf2", "sha1", 64, 2, 0, 0,
118                 "password", 8,
119                 "ATHENA.MIT.EDUraeburn", 21,
120                 "\x01\xdb\xee\x7f\x4a\x9e\x24\x3e"
121                 "\x98\x8b\x62\xc7\x3c\xda\x93\x5d"
122                 "\xa0\x53\x78\xb9\x32\x44\xec\x8f"
123                 "\x48\xa9\x9e\x61\xad\x79\x9d\x86", 32
124         }, {
125                 "pbkdf2", "sha1", 64, 1200, 0, 0,
126                 "password", 8,
127                 "ATHENA.MIT.EDUraeburn", 21,
128                 "\x5c\x08\xeb\x61\xfd\xf7\x1e\x4e"
129                 "\x4e\xc3\xcf\x6b\xa1\xf5\x51\x2b"
130                 "\xa7\xe5\x2d\xdb\xc5\xe5\x14\x2f"
131                 "\x70\x8a\x31\xe2\xe6\x2b\x1e\x13", 32
132         }, {
133                 "pbkdf2", "sha1", 64, 5, 0, 0,
134                 "password", 8,
135                 "\0224VxxV4\022", 8, // "\x1234567878563412
136                 "\xd1\xda\xa7\x86\x15\xf2\x87\xe6"
137                 "\xa1\xc8\xb1\x20\xd7\x06\x2a\x49"
138                 "\x3f\x98\xd2\x03\xe6\xbe\x49\xa6"
139                 "\xad\xf4\xfa\x57\x4b\x6e\x64\xee", 32
140         }, {
141                 "pbkdf2", "sha1", 64, 1200, 0, 0,
142                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
143                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 64,
144                 "pass phrase equals block size", 29,
145                 "\x13\x9c\x30\xc0\x96\x6b\xc3\x2b"
146                 "\xa5\x5f\xdb\xf2\x12\x53\x0a\xc9"
147                 "\xc5\xec\x59\xf1\xa4\x52\xf5\xcc"
148                 "\x9a\xd9\x40\xfe\xa0\x59\x8e\xd1", 32
149         }, {
150                 "pbkdf2", "sha1", 64, 1200, 0, 0,
151                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
152                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 65,
153                 "pass phrase exceeds block size", 30,
154                 "\x9c\xca\xd6\xd4\x68\x77\x0c\xd5"
155                 "\x1b\x10\xe6\xa6\x87\x21\xbe\x61"
156                 "\x1a\x8b\x4d\x28\x26\x01\xdb\x3b"
157                 "\x36\xbe\x92\x46\x91\x5e\xc8\x2a", 32
158         }, {
159                 "pbkdf2", "sha1", 64, 50, 0, 0,
160                 "\360\235\204\236", 4, // g-clef ("\xf09d849e)
161                 "EXAMPLE.COMpianist", 18,
162                 "\x6b\x9c\xf2\x6d\x45\x45\x5a\x43"
163                 "\xa5\xb8\xbb\x27\x6a\x40\x3b\x39"
164                 "\xe7\xfe\x37\xa0\xc4\x1e\x02\xc2"
165                 "\x81\xff\x30\x69\xe1\xe9\x4f\x52", 32
166         }, {
167         /* RFC-6070 */
168                 "pbkdf2", "sha1", 64, 1, 0, 0,
169                 "password", 8,
170                 "salt", 4,
171                 "\x0c\x60\xc8\x0f\x96\x1f\x0e\x71\xf3\xa9"
172                 "\xb5\x24\xaf\x60\x12\x06\x2f\xe0\x37\xa6", 20
173         }, {
174                 "pbkdf2", "sha1", 64, 2, 0, 0,
175                 "password", 8,
176                 "salt", 4,
177                 "\xea\x6c\x01\x4d\xc7\x2d\x6f\x8c\xcd\x1e"
178                 "\xd9\x2a\xce\x1d\x41\xf0\xd8\xde\x89\x57", 20
179         }, {
180                 "pbkdf2", "sha1", 64, 4096, 0, 0,
181                 "password", 8,
182                 "salt", 4,
183                 "\x4b\x00\x79\x01\xb7\x65\x48\x9a\xbe\xad"
184                 "\x49\xd9\x26\xf7\x21\xd0\x65\xa4\x29\xc1", 20
185         }, {
186                 "pbkdf2", "sha1", 64, 16777216, 0, 0,
187                 "password", 8,
188                 "salt", 4,
189                 "\xee\xfe\x3d\x61\xcd\x4d\xa4\xe4\xe9\x94"
190                 "\x5b\x3d\x6b\xa2\x15\x8c\x26\x34\xe9\x84", 20
191         }, {
192                 "pbkdf2", "sha1", 64, 4096, 0, 0,
193                 "passwordPASSWORDpassword", 24,
194                 "saltSALTsaltSALTsaltSALTsaltSALTsalt", 36,
195                 "\x3d\x2e\xec\x4f\xe4\x1c\x84\x9b\x80\xc8"
196                 "\xd8\x36\x62\xc0\xe4\x4a\x8b\x29\x1a\x96"
197                 "\x4c\xf2\xf0\x70\x38", 25
198         }, {
199                 "pbkdf2", "sha1", 64, 4096, 0, 0,
200                 "pass\0word", 9,
201                 "sa\0lt", 5,
202                 "\x56\xfa\x6a\xa7\x55\x48\x09\x9d\xcc\x37"
203                 "\xd7\xf0\x34\x25\xe0\xc3", 16
204         }, {
205         /* empty password test */
206                 "pbkdf2", "sha1", 64, 2, 0, 0,
207                 "", 0,
208                 "salt", 4,
209                 "\x13\x3a\x4c\xe8\x37\xb4\xd2\x52\x1e\xe2"
210                 "\xbf\x03\xe1\x1c\x71\xca\x79\x4e\x07\x97", 20
211         }, {
212         /* Password exceeds block size test */
213                 "pbkdf2", "sha256", 64, 1200, 0, 0,
214                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
215                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 65,
216                 "pass phrase exceeds block size", 30,
217                 "\x22\x34\x4b\xc4\xb6\xe3\x26\x75"
218                 "\xa8\x09\x0f\x3e\xa8\x0b\xe0\x1d"
219                 "\x5f\x95\x12\x6a\x2c\xdd\xc3\xfa"
220                 "\xcc\x4a\x5e\x6d\xca\x04\xec\x58", 32
221         }, {
222                 "pbkdf2", "sha512", 128, 1200, 0, 0,
223                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
224                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
225                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
226                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 129,
227                 "pass phrase exceeds block size", 30,
228                 "\x0f\xb2\xed\x2c\x0e\x6e\xfb\x7d"
229                 "\x7d\x8e\xdd\x58\x01\xb4\x59\x72"
230                 "\x99\x92\x16\x30\x5e\xa4\x36\x8d"
231                 "\x76\x14\x80\xf3\xe3\x7a\x22\xb9", 32
232         }, {
233                 "pbkdf2", "whirlpool", 64, 1200, 0, 0,
234                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
235                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 65,
236                 "pass phrase exceeds block size", 30,
237                 "\x9c\x1c\x74\xf5\x88\x26\xe7\x6a"
238                 "\x53\x58\xf4\x0c\x39\xe7\x80\x89"
239                 "\x07\xc0\x31\x19\x9a\x50\xa2\x48"
240                 "\xf1\xd9\xfe\x78\x64\xe5\x84\x50", 32
241         }
242 };
243
244 /*
245  * Hash tests
246  */
247 struct hash_test_vector {
248         const char *data;
249         unsigned int data_length;
250         struct {
251                 const char *name;
252                 unsigned int length;
253                 const char *out;
254         } out[8];
255 };
256
257 static struct hash_test_vector hash_test_vectors[] = {
258 {
259         "", 0, {
260         { "crc32",      4, "\x00\x00\x00\x00" },
261         { "sha1",      20, "\xda\x39\xa3\xee\x5e\x6b\x4b\x0d\x32\x55\xbf\xef\x95\x60\x18\x90\xaf\xd8\x07\x09" },
262         { "sha256",    32, "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24"
263                            "\x27\xae\x41\xe4\x64\x9b\x93\x4c\xa4\x95\x99\x1b\x78\x52\xb8\x55" },
264         { "sha512",    64, "\xcf\x83\xe1\x35\x7e\xef\xb8\xbd\xf1\x54\x28\x50\xd6\x6d\x80\x07"
265                            "\xd6\x20\xe4\x05\x0b\x57\x15\xdc\x83\xf4\xa9\x21\xd3\x6c\xe9\xce"
266                            "\x47\xd0\xd1\x3c\x5d\x85\xf2\xb0\xff\x83\x18\xd2\x87\x7e\xec\x2f"
267                            "\x63\xb9\x31\xbd\x47\x41\x7a\x81\xa5\x38\x32\x7a\xf9\x27\xda\x3e" },
268         { "ripemd160", 20, "\x9c\x11\x85\xa5\xc5\xe9\xfc\x54\x61\x28\x08\x97\x7e\xe8\xf5\x48\xb2\x25\x8d\x31" },
269         { "whirlpool", 64, "\x19\xfa\x61\xd7\x55\x22\xa4\x66\x9b\x44\xe3\x9c\x1d\x2e\x17\x26"
270                            "\xc5\x30\x23\x21\x30\xd4\x07\xf8\x9a\xfe\xe0\x96\x49\x97\xf7\xa7"
271                            "\x3e\x83\xbe\x69\x8b\x28\x8f\xeb\xcf\x88\xe3\xe0\x3c\x4f\x07\x57"
272                            "\xea\x89\x64\xe5\x9b\x63\xd9\x37\x08\xb1\x38\xcc\x42\xa6\x6e\xb3" },
273         { "blake2b-512",64,"\x78\x6a\x02\xf7\x42\x01\x59\x03\xc6\xc6\xfd\x85\x25\x52\xd2\x72"
274                            "\x91\x2f\x47\x40\xe1\x58\x47\x61\x8a\x86\xe2\x17\xf7\x1f\x54\x19"
275                            "\xd2\x5e\x10\x31\xaf\xee\x58\x53\x13\x89\x64\x44\x93\x4e\xb0\x4b"
276                            "\x90\x3a\x68\x5b\x14\x48\xb7\x55\xd5\x6f\x70\x1a\xfe\x9b\xe2\xce" },
277         { "blake2s-256",32,"\x69\x21\x7a\x30\x79\x90\x80\x94\xe1\x11\x21\xd0\x42\x35\x4a\x7c"
278                            "\x1f\x55\xb6\x48\x2c\xa1\xa5\x1e\x1b\x25\x0d\xfd\x1e\xd0\xee\xf9" },
279 }},{
280         "a", 1, {
281         { "crc32",      4, "\xe8\xb7\xbe\x43" },
282         { "sha1",      20, "\x86\xf7\xe4\x37\xfa\xa5\xa7\xfc\xe1\x5d\x1d\xdc\xb9\xea\xea\xea\x37\x76\x67\xb8" },
283         { "sha256",    32, "\xca\x97\x81\x12\xca\x1b\xbd\xca\xfa\xc2\x31\xb3\x9a\x23\xdc\x4d"
284                            "\xa7\x86\xef\xf8\x14\x7c\x4e\x72\xb9\x80\x77\x85\xaf\xee\x48\xbb" },
285         { "sha512",    64, "\x1f\x40\xfc\x92\xda\x24\x16\x94\x75\x09\x79\xee\x6c\xf5\x82\xf2"
286                            "\xd5\xd7\xd2\x8e\x18\x33\x5d\xe0\x5a\xbc\x54\xd0\x56\x0e\x0f\x53"
287                            "\x02\x86\x0c\x65\x2b\xf0\x8d\x56\x02\x52\xaa\x5e\x74\x21\x05\x46"
288                            "\xf3\x69\xfb\xbb\xce\x8c\x12\xcf\xc7\x95\x7b\x26\x52\xfe\x9a\x75" },
289         { "ripemd160", 20, "\x0b\xdc\x9d\x2d\x25\x6b\x3e\xe9\xda\xae\x34\x7b\xe6\xf4\xdc\x83\x5a\x46\x7f\xfe" },
290         { "whirlpool", 64, "\x8a\xca\x26\x02\x79\x2a\xec\x6f\x11\xa6\x72\x06\x53\x1f\xb7\xd7"
291                            "\xf0\xdf\xf5\x94\x13\x14\x5e\x69\x73\xc4\x50\x01\xd0\x08\x7b\x42"
292                            "\xd1\x1b\xc6\x45\x41\x3a\xef\xf6\x3a\x42\x39\x1a\x39\x14\x5a\x59"
293                            "\x1a\x92\x20\x0d\x56\x01\x95\xe5\x3b\x47\x85\x84\xfd\xae\x23\x1a" },
294         { "blake2b-512",64,"\x33\x3f\xcb\x4e\xe1\xaa\x7c\x11\x53\x55\xec\x66\xce\xac\x91\x7c"
295                            "\x8b\xfd\x81\x5b\xf7\x58\x7d\x32\x5a\xec\x18\x64\xed\xd2\x4e\x34"
296                            "\xd5\xab\xe2\xc6\xb1\xb5\xee\x3f\xac\xe6\x2f\xed\x78\xdb\xef\x80"
297                            "\x2f\x2a\x85\xcb\x91\xd4\x55\xa8\xf5\x24\x9d\x33\x08\x53\xcb\x3c" },
298         { "blake2s-256",32,"\x4a\x0d\x12\x98\x73\x40\x30\x37\xc2\xcd\x9b\x90\x48\x20\x36\x87"
299                            "\xf6\x23\x3f\xb6\x73\x89\x56\xe0\x34\x9b\xd4\x32\x0f\xec\x3e\x90" },
300 }},{
301         "abc", 3, {
302         { "crc32",      4, "\x35\x24\x41\xc2" },
303         { "sha1",      20, "\xa9\x99\x3e\x36\x47\x06\x81\x6a\xba\x3e\x25\x71\x78\x50\xc2\x6c\x9c\xd0\xd8\x9d" },
304         { "sha256",    32, "\xba\x78\x16\xbf\x8f\x01\xcf\xea\x41\x41\x40\xde\x5d\xae\x22\x23"
305                            "\xb0\x03\x61\xa3\x96\x17\x7a\x9c\xb4\x10\xff\x61\xf2\x00\x15\xad" },
306         { "sha512",    64, "\xdd\xaf\x35\xa1\x93\x61\x7a\xba\xcc\x41\x73\x49\xae\x20\x41\x31"
307                            "\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2\x0a\x9e\xee\xe6\x4b\x55\xd3\x9a"
308                            "\x21\x92\x99\x2a\x27\x4f\xc1\xa8\x36\xba\x3c\x23\xa3\xfe\xeb\xbd"
309                            "\x45\x4d\x44\x23\x64\x3c\xe8\x0e\x2a\x9a\xc9\x4f\xa5\x4c\xa4\x9f" },
310         { "ripemd160", 20, "\x8e\xb2\x08\xf7\xe0\x5d\x98\x7a\x9b\x04\x4a\x8e\x98\xc6\xb0\x87\xf1\x5a\x0b\xfc" },
311         { "whirlpool", 64, "\x4e\x24\x48\xa4\xc6\xf4\x86\xbb\x16\xb6\x56\x2c\x73\xb4\x02\x0b"
312                            "\xf3\x04\x3e\x3a\x73\x1b\xce\x72\x1a\xe1\xb3\x03\xd9\x7e\x6d\x4c"
313                            "\x71\x81\xee\xbd\xb6\xc5\x7e\x27\x7d\x0e\x34\x95\x71\x14\xcb\xd6"
314                            "\xc7\x97\xfc\x9d\x95\xd8\xb5\x82\xd2\x25\x29\x20\x76\xd4\xee\xf5" },
315         { "blake2b-512",64,"\xba\x80\xa5\x3f\x98\x1c\x4d\x0d\x6a\x27\x97\xb6\x9f\x12\xf6\xe9"
316                            "\x4c\x21\x2f\x14\x68\x5a\xc4\xb7\x4b\x12\xbb\x6f\xdb\xff\xa2\xd1"
317                            "\x7d\x87\xc5\x39\x2a\xab\x79\x2d\xc2\x52\xd5\xde\x45\x33\xcc\x95"
318                            "\x18\xd3\x8a\xa8\xdb\xf1\x92\x5a\xb9\x23\x86\xed\xd4\x00\x99\x23" },
319         { "blake2s-256",32,"\x50\x8c\x5e\x8c\x32\x7c\x14\xe2\xe1\xa7\x2b\xa3\x4e\xeb\x45\x2f"
320                            "\x37\x45\x8b\x20\x9e\xd6\x3a\x29\x4d\x99\x9b\x4c\x86\x67\x59\x82" },
321 }},{
322         "abcdefghijklmnopqrstuvwxyz", 26, {
323         { "crc32",      4, "\x4c\x27\x50\xbd" },
324         { "sha1",      20, "\x32\xd1\x0c\x7b\x8c\xf9\x65\x70\xca\x04\xce\x37\xf2\xa1\x9d\x84\x24\x0d\x3a\x89" },
325         { "sha256",    32, "\x71\xc4\x80\xdf\x93\xd6\xae\x2f\x1e\xfa\xd1\x44\x7c\x66\xc9\x52"
326                            "\x5e\x31\x62\x18\xcf\x51\xfc\x8d\x9e\xd8\x32\xf2\xda\xf1\x8b\x73" },
327         { "sha512",    64, "\x4d\xbf\xf8\x6c\xc2\xca\x1b\xae\x1e\x16\x46\x8a\x05\xcb\x98\x81"
328                            "\xc9\x7f\x17\x53\xbc\xe3\x61\x90\x34\x89\x8f\xaa\x1a\xab\xe4\x29"
329                            "\x95\x5a\x1b\xf8\xec\x48\x3d\x74\x21\xfe\x3c\x16\x46\x61\x3a\x59"
330                            "\xed\x54\x41\xfb\x0f\x32\x13\x89\xf7\x7f\x48\xa8\x79\xc7\xb1\xf1" },
331         { "ripemd160", 20, "\xf7\x1c\x27\x10\x9c\x69\x2c\x1b\x56\xbb\xdc\xeb\x5b\x9d\x28\x65\xb3\x70\x8d\xbc" },
332         { "whirlpool", 64, "\xf1\xd7\x54\x66\x26\x36\xff\xe9\x2c\x82\xeb\xb9\x21\x2a\x48\x4a"
333                            "\x8d\x38\x63\x1e\xad\x42\x38\xf5\x44\x2e\xe1\x3b\x80\x54\xe4\x1b"
334                            "\x08\xbf\x2a\x92\x51\xc3\x0b\x6a\x0b\x8a\xae\x86\x17\x7a\xb4\xa6"
335                            "\xf6\x8f\x67\x3e\x72\x07\x86\x5d\x5d\x98\x19\xa3\xdb\xa4\xeb\x3b" },
336         { "blake2b-512",64,"\xc6\x8e\xde\x14\x3e\x41\x6e\xb7\xb4\xaa\xae\x0d\x8e\x48\xe5\x5d"
337                            "\xd5\x29\xea\xfe\xd1\x0b\x1d\xf1\xa6\x14\x16\x95\x3a\x2b\x0a\x56"
338                            "\x66\xc7\x61\xe7\xd4\x12\xe6\x70\x9e\x31\xff\xe2\x21\xb7\xa7\xa7"
339                            "\x39\x08\xcb\x95\xa4\xd1\x20\xb8\xb0\x90\xa8\x7d\x1f\xbe\xdb\x4c" },
340         { "blake2s-256",32,"\xbd\xf8\x8e\xb1\xf8\x6a\x0c\xdf\x0e\x84\x0b\xa8\x8f\xa1\x18\x50"
341                            "\x83\x69\xdf\x18\x6c\x73\x55\xb4\xb1\x6c\xf7\x9f\xa2\x71\x0a\x12" },
342 }},{
343         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 62, {
344         { "crc32",      4, "\x1f\xc2\xe6\xd2" },
345         { "sha1",      20, "\x76\x1c\x45\x7b\xf7\x3b\x14\xd2\x7e\x9e\x92\x65\xc4\x6f\x4b\x4d\xda\x11\xf9\x40" },
346         { "sha256",    32, "\xdb\x4b\xfc\xbd\x4d\xa0\xcd\x85\xa6\x0c\x3c\x37\xd3\xfb\xd8\x80"
347                            "\x5c\x77\xf1\x5f\xc6\xb1\xfd\xfe\x61\x4e\xe0\xa7\xc8\xfd\xb4\xc0" },
348         { "sha512",    64, "\x1e\x07\xbe\x23\xc2\x6a\x86\xea\x37\xea\x81\x0c\x8e\xc7\x80\x93"
349                            "\x52\x51\x5a\x97\x0e\x92\x53\xc2\x6f\x53\x6c\xfc\x7a\x99\x96\xc4"
350                            "\x5c\x83\x70\x58\x3e\x0a\x78\xfa\x4a\x90\x04\x1d\x71\xa4\xce\xab"
351                            "\x74\x23\xf1\x9c\x71\xb9\xd5\xa3\xe0\x12\x49\xf0\xbe\xbd\x58\x94" },
352         { "ripemd160", 20, "\xb0\xe2\x0b\x6e\x31\x16\x64\x02\x86\xed\x3a\x87\xa5\x71\x30\x79\xb2\x1f\x51\x89" },
353         { "whirlpool", 64, "\xdc\x37\xe0\x08\xcf\x9e\xe6\x9b\xf1\x1f\x00\xed\x9a\xba\x26\x90"
354                            "\x1d\xd7\xc2\x8c\xde\xc0\x66\xcc\x6a\xf4\x2e\x40\xf8\x2f\x3a\x1e"
355                            "\x08\xeb\xa2\x66\x29\x12\x9d\x8f\xb7\xcb\x57\x21\x1b\x92\x81\xa6"
356                            "\x55\x17\xcc\x87\x9d\x7b\x96\x21\x42\xc6\x5f\x5a\x7a\xf0\x14\x67" },
357         { "blake2b-512",64,"\x99\x96\x48\x02\xe5\xc2\x5e\x70\x37\x22\x90\x5d\x3f\xb8\x00\x46"
358                            "\xb6\xbc\xa6\x98\xca\x9e\x2c\xc7\xe4\x9b\x4f\xe1\xfa\x08\x7c\x2e"
359                            "\xdf\x03\x12\xdf\xbb\x27\x5c\xf2\x50\xa1\xe5\x42\xfd\x5d\xc2\xed"
360                            "\xd3\x13\xf9\xc4\x91\x12\x7c\x2e\x8c\x0c\x9b\x24\x16\x8e\x2d\x50" },
361         { "blake2s-256",32,"\xc7\x54\x39\xea\x17\xe1\xde\x6f\xa4\x51\x0c\x33\x5d\xc3\xd3\xf3"
362                            "\x43\xe6\xf9\xe1\xce\x27\x73\xe2\x5b\x41\x74\xf1\xdf\x8b\x11\x9b" },
363 }},{
364         "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56, {
365         { "crc32",      4, "\x17\x1a\x3f\x5f" },
366         { "sha1",      20, "\x84\x98\x3e\x44\x1c\x3b\xd2\x6e\xba\xae\x4a\xa1\xf9\x51\x29\xe5\xe5\x46\x70\xf1" },
367         { "sha256",    32, "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
368                            "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1" },
369         { "sha512",    64, "\x20\x4a\x8f\xc6\xdd\xa8\x2f\x0a\x0c\xed\x7b\xeb\x8e\x08\xa4\x16"
370                            "\x57\xc1\x6e\xf4\x68\xb2\x28\xa8\x27\x9b\xe3\x31\xa7\x03\xc3\x35"
371                            "\x96\xfd\x15\xc1\x3b\x1b\x07\xf9\xaa\x1d\x3b\xea\x57\x78\x9c\xa0"
372                            "\x31\xad\x85\xc7\xa7\x1d\xd7\x03\x54\xec\x63\x12\x38\xca\x34\x45" },
373         { "ripemd160", 20, "\x12\xa0\x53\x38\x4a\x9c\x0c\x88\xe4\x05\xa0\x6c\x27\xdc\xf4\x9a\xda\x62\xeb\x2b" },
374         { "whirlpool", 64, "\x52\x6b\x23\x94\xd8\x56\x83\xe2\x4b\x29\xac\xd0\xfd\x37\xf7\xd5"
375                            "\x02\x7f\x61\x36\x6a\x14\x07\x26\x2d\xc2\xa6\xa3\x45\xd9\xe2\x40"
376                            "\xc0\x17\xc1\x83\x3d\xb1\xe6\xdb\x6a\x46\xbd\x44\x4b\x0c\x69\x52"
377                            "\x0c\x85\x6e\x7c\x6e\x9c\x36\x6d\x15\x0a\x7d\xa3\xae\xb1\x60\xd1" },
378         { "blake2b-512",64,"\x72\x85\xff\x3e\x8b\xd7\x68\xd6\x9b\xe6\x2b\x3b\xf1\x87\x65\xa3"
379                            "\x25\x91\x7f\xa9\x74\x4a\xc2\xf5\x82\xa2\x08\x50\xbc\x2b\x11\x41"
380                            "\xed\x1b\x3e\x45\x28\x59\x5a\xcc\x90\x77\x2b\xdf\x2d\x37\xdc\x8a"
381                            "\x47\x13\x0b\x44\xf3\x3a\x02\xe8\x73\x0e\x5a\xd8\xe1\x66\xe8\x88" },
382         { "blake2s-256",32,"\x6f\x4d\xf5\x11\x6a\x6f\x33\x2e\xda\xb1\xd9\xe1\x0e\xe8\x7d\xf6"
383                            "\x55\x7b\xea\xb6\x25\x9d\x76\x63\xf3\xbc\xd5\x72\x2c\x13\xf1\x89" },
384 }},{
385         "message digest", 14, {
386         { "crc32",      4, "\x20\x15\x9d\x7f" },
387         { "sha1",      20, "\xc1\x22\x52\xce\xda\x8b\xe8\x99\x4d\x5f\xa0\x29\x0a\x47\x23\x1c\x1d\x16\xaa\xe3" },
388         { "sha256",    32, "\xf7\x84\x6f\x55\xcf\x23\xe1\x4e\xeb\xea\xb5\xb4\xe1\x55\x0c\xad"
389                            "\x5b\x50\x9e\x33\x48\xfb\xc4\xef\xa3\xa1\x41\x3d\x39\x3c\xb6\x50" },
390         { "sha512",    64, "\x10\x7d\xbf\x38\x9d\x9e\x9f\x71\xa3\xa9\x5f\x6c\x05\x5b\x92\x51"
391                            "\xbc\x52\x68\xc2\xbe\x16\xd6\xc1\x34\x92\xea\x45\xb0\x19\x9f\x33"
392                            "\x09\xe1\x64\x55\xab\x1e\x96\x11\x8e\x8a\x90\x5d\x55\x97\xb7\x20"
393                            "\x38\xdd\xb3\x72\xa8\x98\x26\x04\x6d\xe6\x66\x87\xbb\x42\x0e\x7c" },
394         { "ripemd160", 20, "\x5d\x06\x89\xef\x49\xd2\xfa\xe5\x72\xb8\x81\xb1\x23\xa8\x5f\xfa\x21\x59\x5f\x36" },
395         { "whirlpool", 64, "\x37\x8c\x84\xa4\x12\x6e\x2d\xc6\xe5\x6d\xcc\x74\x58\x37\x7a\xac"
396                            "\x83\x8d\x00\x03\x22\x30\xf5\x3c\xe1\xf5\x70\x0c\x0f\xfb\x4d\x3b"
397                            "\x84\x21\x55\x76\x59\xef\x55\xc1\x06\xb4\xb5\x2a\xc5\xa4\xaa\xa6"
398                            "\x92\xed\x92\x00\x52\x83\x8f\x33\x62\xe8\x6d\xbd\x37\xa8\x90\x3e" },
399         { "blake2b-512",64,"\x3c\x26\xce\x48\x7b\x1c\x0f\x06\x23\x63\xaf\xa3\xc6\x75\xeb\xdb"
400                            "\xf5\xf4\xef\x9b\xdc\x02\x2c\xfb\xef\x91\xe3\x11\x1c\xdc\x28\x38"
401                            "\x40\xd8\x33\x1f\xc3\x0a\x8a\x09\x06\xcf\xf4\xbc\xdb\xcd\x23\x0c"
402                            "\x61\xaa\xec\x60\xfd\xfa\xd4\x57\xed\x96\xb7\x09\xa3\x82\x35\x9a" },
403         { "blake2s-256",32,"\xfa\x10\xab\x77\x5a\xcf\x89\xb7\xd3\xc8\xa6\xe8\x23\xd5\x86\xf6"
404                            "\xb6\x7b\xdb\xac\x4c\xe2\x07\xfe\x14\x5b\x7d\x3a\xc2\x5c\xd2\x8c" },
405 }}};
406
407 /*
408  * HMAC tests
409  */
410 // RFC 4231 - HMAC test vectors for SHA-256, SHA-512
411 // RFC 2202 - HMAC test vectors for SHA-1
412
413 struct hmac_test_vector {
414         const char *key;
415         unsigned int key_length;
416         const char *data;
417         unsigned int data_length;
418         struct {
419                 const char *name;
420                 unsigned int length;
421                 const char *out;
422         } out[3];
423 };
424
425 static struct hmac_test_vector hmac_test_vectors[] = {
426 {
427         "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20,
428         "\x48\x69\x20\x54\x68\x65\x72\x65", 8, /* "Hi There" */ {
429         { "sha1",   20, "\xb6\x17\x31\x86\x55\x05\x72\x64\xe2\x8b\xc0\xb6\xfb\x37\x8c\x8e\xf1\x46\xbe\x00" },
430         { "sha256", 32, "\xb0\x34\x4c\x61\xd8\xdb\x38\x53\x5c\xa8\xaf\xce\xaf\x0b\xf1\x2b"
431                         "\x88\x1d\xc2\x00\xc9\x83\x3d\xa7\x26\xe9\x37\x6c\x2e\x32\xcf\xf7" },
432         { "sha512", 64, "\x87\xaa\x7c\xde\xa5\xef\x61\x9d\x4f\xf0\xb4\x24\x1a\x1d\x6c\xb0"
433                         "\x23\x79\xf4\xe2\xce\x4e\xc2\x78\x7a\xd0\xb3\x05\x45\xe1\x7c\xde"
434                         "\xda\xa8\x33\xb7\xd6\xb8\xa7\x02\x03\x8b\x27\x4e\xae\xa3\xf4\xe4"
435                         "\xbe\x9d\x91\x4e\xeb\x61\xf1\x70\x2e\x69\x6c\x20\x3a\x12\x68\x54" },
436 }},{
437         "\x4a\x65\x66\x65", 4, /* "Jefe" */
438         "\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61\x20\x77\x61\x6e\x74\x20"
439         "\x66\x6f\x72\x20\x6e\x6f\x74\x68\x69\x6e\x67\x3f", 28, /* "what do ya want for nothing?" */ {
440         { "sha1",   20, "\xef\xfc\xdf\x6a\xe5\xeb\x2f\xa2\xd2\x74\x16\xd5\xf1\x84\xdf\x9c\x25\x9a\x7c\x79" },
441         { "sha256", 32, "\x5b\xdc\xc1\x46\xbf\x60\x75\x4e\x6a\x04\x24\x26\x08\x95\x75\xc7"
442                         "\x5a\x00\x3f\x08\x9d\x27\x39\x83\x9d\xec\x58\xb9\x64\xec\x38\x43" },
443         { "sha512", 64, "\x16\x4b\x7a\x7b\xfc\xf8\x19\xe2\xe3\x95\xfb\xe7\x3b\x56\xe0\xa3"
444                         "\x87\xbd\x64\x22\x2e\x83\x1f\xd6\x10\x27\x0c\xd7\xea\x25\x05\x54"
445                         "\x97\x58\xbf\x75\xc0\x5a\x99\x4a\x6d\x03\x4f\x65\xf8\xf0\xe6\xfd"
446                         "\xca\xea\xb1\xa3\x4d\x4a\x6b\x4b\x63\x6e\x07\x0a\x38\xbc\xe7\x37" },
447 }},{
448         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20,
449         "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
450         "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
451         "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd", 50, {
452         { "sha1",   20, "\x12\x5d\x73\x42\xb9\xac\x11\xcd\x91\xa3\x9a\xf4\x8a\xa1\x7b\x4f\x63\xf1\x75\xd3" },
453         { "sha256", 32, "\x77\x3e\xa9\x1e\x36\x80\x0e\x46\x85\x4d\xb8\xeb\xd0\x91\x81\xa7"
454                         "\x29\x59\x09\x8b\x3e\xf8\xc1\x22\xd9\x63\x55\x14\xce\xd5\x65\xfe" },
455         { "sha512", 64, "\xfa\x73\xb0\x08\x9d\x56\xa2\x84\xef\xb0\xf0\x75\x6c\x89\x0b\xe9"
456                         "\xb1\xb5\xdb\xdd\x8e\xe8\x1a\x36\x55\xf8\x3e\x33\xb2\x27\x9d\x39"
457                         "\xbf\x3e\x84\x82\x79\xa7\x22\xc8\x06\xb4\x85\xa4\x7e\x67\xc8\x07"
458                         "\xb9\x46\xa3\x37\xbe\xe8\x94\x26\x74\x27\x88\x59\xe1\x32\x92\xfb" },
459 }},{
460         "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19", 25,
461         "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
462         "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
463         "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd", 50, {
464         { "sha1",   20, "\x4c\x90\x07\xf4\x02\x62\x50\xc6\xbc\x84\x14\xf9\xbf\x50\xc8\x6c\x2d\x72\x35\xda" },
465         { "sha256", 32, "\x82\x55\x8a\x38\x9a\x44\x3c\x0e\xa4\xcc\x81\x98\x99\xf2\x08\x3a"
466                         "\x85\xf0\xfa\xa3\xe5\x78\xf8\x07\x7a\x2e\x3f\xf4\x67\x29\x66\x5b" },
467         { "sha512", 64, "\xb0\xba\x46\x56\x37\x45\x8c\x69\x90\xe5\xa8\xc5\xf6\x1d\x4a\xf7"
468                         "\xe5\x76\xd9\x7f\xf9\x4b\x87\x2d\xe7\x6f\x80\x50\x36\x1e\xe3\xdb"
469                         "\xa9\x1c\xa5\xc1\x1a\xa2\x5e\xb4\xd6\x79\x27\x5c\xc5\x78\x80\x63"
470                         "\xa5\xf1\x97\x41\x12\x0c\x4f\x2d\xe2\xad\xeb\xeb\x10\xa2\x98\xdd" },
471 }},{
472         // Long key
473         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
474         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
475         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
476         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
477         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
478         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
479         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
480         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131,
481         "\x54\x65\x73\x74\x20\x55\x73\x69\x6e\x67\x20\x4c\x61\x72\x67\x65"
482         "\x72\x20\x54\x68\x61\x6e\x20\x42\x6c\x6f\x63\x6b\x2d\x53\x69\x7a"
483         "\x65\x20\x4b\x65\x79\x20\x2d\x20\x48\x61\x73\x68\x20\x4b\x65\x79"
484         "\x20\x46\x69\x72\x73\x74", 54, /* "Test Using Larger Than Block-Size Key - Hash Key First" */ {
485         { "sha1",   20, "\x90\xd0\xda\xce\x1c\x1b\xdc\x95\x73\x39\x30\x78\x03\x16\x03\x35\xbd\xe6\xdf\x2b" },
486         { "sha256", 32, "\x60\xe4\x31\x59\x1e\xe0\xb6\x7f\x0d\x8a\x26\xaa\xcb\xf5\xb7\x7f"
487                         "\x8e\x0b\xc6\x21\x37\x28\xc5\x14\x05\x46\x04\x0f\x0e\xe3\x7f\x54" },
488         { "sha512", 64, "\x80\xb2\x42\x63\xc7\xc1\xa3\xeb\xb7\x14\x93\xc1\xdd\x7b\xe8\xb4"
489                         "\x9b\x46\xd1\xf4\x1b\x4a\xee\xc1\x12\x1b\x01\x37\x83\xf8\xf3\x52"
490                         "\x6b\x56\xd0\x37\xe0\x5f\x25\x98\xbd\x0f\xd2\x21\x5d\x6a\x1e\x52"
491                         "\x95\xe6\x4f\x73\xf6\x3f\x0a\xec\x8b\x91\x5a\x98\x5d\x78\x65\x98" },
492 }},{
493         // Long key and long data
494         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
495         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
496         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
497         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
498         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
499         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
500         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
501         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 131,
502         "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74\x20\x75"
503         "\x73\x69\x6e\x67\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68"
504         "\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x6b\x65"
505         "\x79\x20\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74"
506         "\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64"
507         "\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b\x65\x79\x20\x6e\x65\x65"
508         "\x64\x73\x20\x74\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65\x64\x20"
509         "\x62\x65\x66\x6f\x72\x65\x20\x62\x65\x69\x6e\x67\x20\x75\x73\x65"
510         "\x64\x20\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68\x6d\x2e", 152, {
511         { "sha1",   20, "\x21\x7e\x44\xbb\x08\xb6\xe0\x6a\x2d\x6c\x30\xf3\xcb\x9f\x53\x7f\x97\xc6\x33\x56" },
512         { "sha256", 32, "\x9b\x09\xff\xa7\x1b\x94\x2f\xcb\x27\x63\x5f\xbc\xd5\xb0\xe9\x44"
513                         "\xbf\xdc\x63\x64\x4f\x07\x13\x93\x8a\x7f\x51\x53\x5c\x3a\x35\xe2" },
514         { "sha512", 64, "\xe3\x7b\x6a\x77\x5d\xc8\x7d\xba\xa4\xdf\xa9\xf9\x6e\x5e\x3f\xfd"
515                         "\xde\xbd\x71\xf8\x86\x72\x89\x86\x5d\xf5\xa3\x2d\x20\xcd\xc9\x44"
516                         "\xb6\x02\x2c\xac\x3c\x49\x82\xb1\x0d\x5e\xeb\x55\xc3\xe4\xde\x15"
517                         "\x13\x46\x76\xfb\x6d\xe0\x44\x60\x65\xc9\x74\x40\xfa\x8c\x6a\x58" },
518 }}};
519
520 /*
521  * Block cipher tests
522  */
523 struct cipher_test_vector {
524         const char *key;
525         unsigned int key_length;
526         const char *iv;
527         unsigned int iv_length;
528         const char *plaintext;
529         unsigned int data_length;
530         struct {
531                 const char *name;
532                 const char *mode;
533                 const char *ciphertext;
534         } out[2];
535 };
536
537 static struct cipher_test_vector cipher_test_vectors[] = {
538 { // NIST SP 800-38A
539         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16,
540         NULL, 0,
541         "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
542         "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
543         "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
544         "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10", 64, {
545         {
546                 "aes", "ecb",
547                 "\x3a\xd7\x7b\xb4\x0d\x7a\x36\x60\xa8\x9e\xca\xf3\x24\x66\xef\x97"
548                 "\xf5\xd3\xd5\x85\x03\xb9\x69\x9d\xe7\x85\x89\x5a\x96\xfd\xba\xaf"
549                 "\x43\xb1\xcd\x7f\x59\x8e\xce\x23\x88\x1b\x00\xe3\xed\x03\x06\x88"
550                 "\x7b\x0c\x78\x5e\x27\xe8\xad\x3f\x82\x23\x20\x71\x04\x72\x5d\xd4"
551         },{
552                 "serpent", "ecb",
553                 "\xf7\xa7\x21\xe6\xc7\x56\xb6\x55\xcb\xdf\x53\x3f\xc3\xb3\x1a\xc4"
554                 "\x4b\xc6\x04\x29\x3a\x81\xa6\xa6\xe4\xcb\xa7\x8d\x1a\x32\xa2\x9e"
555                 "\xcf\xc2\x8e\x50\x97\xdd\x6b\x49\xa9\x38\xb1\x51\x5e\xbc\x5a\xac"
556                 "\xfe\xd2\xc4\x95\x92\xf9\x1c\x0c\x9f\x17\xcd\x86\x38\x65\x29\xeb"
557         },
558 }},{ // NIST SP 800-38A
559         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16,
560         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f", 16,
561         "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
562         "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
563         "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
564         "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10", 64, {
565         {
566                 "aes", "cbc",
567                 "\x76\x49\xab\xac\x81\x19\xb2\x46\xce\xe9\x8e\x9b\x12\xe9\x19\x7d"
568                 "\x50\x86\xcb\x9b\x50\x72\x19\xee\x95\xdb\x11\x3a\x91\x76\x78\xb2"
569                 "\x73\xbe\xd6\xb8\xe3\xc1\x74\x3b\x71\x16\xe6\x9e\x22\x22\x95\x16"
570                 "\x3f\xf1\xca\xa1\x68\x1f\xac\x09\x12\x0e\xca\x30\x75\x86\xe1\xa7"
571         },{
572                 "serpent", "cbc",
573                 "\xdd\x73\x69\x1a\xb5\x66\xb6\x38\xe3\xb9\x62\x36\xc8\xc8\xa1\xdd"
574                 "\xa9\xb5\xd9\xdb\x20\xfb\x8b\x82\x51\x40\xbf\xe6\x4d\xf2\x1c\xa8"
575                 "\x5f\x48\xbc\x29\xff\x62\x27\xda\x09\x7c\xaa\x22\x75\x6f\x43\xff"
576                 "\x31\xd8\x3e\x83\x4d\x92\x48\xeb\x49\x1c\xf8\x26\x80\x4e\xb9\x02"
577         },
578 }},{ // NIST SP 800-38A
579         "\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81"
580         "\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4", 32,
581         NULL, 0,
582         "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
583         "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
584         "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
585         "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10", 64, {
586         {
587                 "aes", "ecb",
588                 "\xf3\xee\xd1\xbd\xb5\xd2\xa0\x3c\x06\x4b\x5a\x7e\x3d\xb1\x81\xf8"
589                 "\x59\x1c\xcb\x10\xd4\x10\xed\x26\xdc\x5b\xa7\x4a\x31\x36\x28\x70"
590                 "\xb6\xed\x21\xb9\x9c\xa6\xf4\xf9\xf1\x53\xe7\xb1\xbe\xaf\xed\x1d"
591                 "\x23\x30\x4b\x7a\x39\xf9\xf3\xff\x06\x7d\x8d\x8f\x9e\x24\xec\xc7"
592         },{
593                 "serpent", "ecb",
594                 "\x78\xe5\x84\x8e\xd9\xd5\xde\x2d\x4d\xb0\x2f\x53\x61\x6a\xfd\xf2"
595                 "\x50\x5d\xf1\x68\x92\x40\x8e\xf6\x9c\x3b\x9e\xa6\x67\xd9\xdd\xb8"
596                 "\xb9\x5f\xc8\x20\x76\x52\x1d\xce\x60\xe4\xfc\xac\xe3\xd3\x91\x51"
597                 "\x09\x22\x62\xde\x62\x6d\xc5\x7b\x4c\x87\x0c\x65\xe7\x1f\xc7\x13"
598         },
599 }},{ // NIST SP 800-38A
600         "\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81"
601         "\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4", 32,
602         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f", 16,
603         "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
604         "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
605         "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
606         "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10", 64, {
607         {
608                 "aes", "cbc",
609                 "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
610                 "\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
611                 "\x39\xf2\x33\x69\xa9\xd9\xba\xcf\xa5\x30\xe2\x63\x04\x23\x14\x61"
612                 "\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc\xda\x6c\x19\x07\x8c\x6a\x9d\x1b"
613         },{
614                 "serpent", "cbc",
615                 "\xb8\x93\xc8\xde\xc5\xc8\x5f\x03\x01\xac\x32\x74\xdf\xc6\x71\x9d"
616                 "\x37\x61\xc5\xf8\x34\x4d\xe9\x10\x91\xd3\x87\x80\x42\xcc\x70\x95"
617                 "\x40\x95\xa3\x2c\xdb\x38\xe2\x6f\x03\x91\xf5\xd3\x51\x7e\x52\xb0"
618                 "\x8a\x1c\x2d\x7f\x04\x59\x13\x93\x31\xa9\x82\xc9\x4e\xd9\x11\x0c"
619         },
620 }},{ // CAVS XTSGenAES128,101
621         "\xb7\xb9\x3f\x51\x6a\xef\x29\x5e\xff\x3a\x29\xd8\x37\xcf\x1f\x13"
622         "\x53\x47\xe8\xa2\x1d\xae\x61\x6f\xf5\x06\x2b\x2e\x8d\x78\xce\x5e", 32,
623         "\x87\x3e\xde\xa6\x53\xb6\x43\xbd\x8b\xcf\x51\x40\x31\x97\xed\x14", 16,
624         "\x23\x6f\x8a\x5b\x58\xdd\x55\xf6\x19\x4e\xd7\x0c\x4a\xc1\xa1\x7f"
625         "\x1f\xe6\x0e\xc9\xa6\xc4\x54\xd0\x87\xcc\xb7\x7d\x6b\x63\x8c\x47", 32, {
626         {
627                 "aes", "xts",
628                 "\x22\xe6\xa3\xc6\x37\x9d\xcf\x75\x99\xb0\x52\xb5\xa7\x49\xc7\xf7"
629                 "\x8a\xd8\xa1\x1b\x9f\x1a\xa9\x43\x0c\xf3\xae\xf4\x45\x68\x2e\x19"
630         },{
631                 "serpent", "xts",
632                 "\x6d\xa2\xa4\x2b\x18\x71\x57\xdc\x03\xaf\x8b\x82\x28\x66\x3d\xf1"
633                 "\x70\x8b\x75\x98\xd2\xdd\xbf\x72\x9e\xb3\xb4\xc2\x3f\x18\xdf\xa1"
634         },
635 }},{ // CAVS XTSGenAES256,101
636         "\x26\x6c\x33\x6b\x3b\x01\x48\x9f\x32\x67\xf5\x28\x35\xfd\x92\xf6"
637         "\x74\x37\x4b\x88\xb4\xe1\xeb\xd2\xd3\x6a\x5f\x45\x75\x81\xd9\xd0"
638         "\x42\xc3\xee\xf7\xb0\xb7\xe5\x13\x7b\x08\x64\x96\xb4\xd9\xe6\xac"
639         "\x65\x8d\x71\x96\xa2\x3f\x23\xf0\x36\x17\x2f\xdb\x8f\xae\xe5\x27", 64,
640         "\x06\xb2\x09\xa7\xa2\x2f\x48\x6e\xcb\xfa\xdb\x0f\x31\x37\xba\x42", 16,
641         "\xca\x7d\x65\xef\x8d\x3d\xfa\xd3\x45\xb6\x1c\xcd\xdc\xa1\xad\x81"
642         "\xde\x83\x0b\x9e\x86\xc7\xb4\x26\xd7\x6c\xb7\xdb\x76\x68\x52\xd9"
643         "\x81\xc6\xb2\x14\x09\x39\x9d\x78\xf4\x2c\xc0\xb3\x3a\x7b\xbb\x06", 48, {
644         {
645                 "aes", "xts",
646                 "\xc7\x32\x56\x87\x0c\xc2\xf4\xdd\x57\xac\xc7\x4b\x54\x56\xdb\xd7"
647                 "\x76\x91\x2a\x12\x8b\xc1\xf7\x7d\x72\xcd\xeb\xbf\x27\x00\x44\xb7"
648                 "\xa4\x3c\xee\xd2\x90\x25\xe1\xe8\xbe\x21\x1f\xa3\xc3\xed\x00\x2d"
649         },{
650                 "serpent", "xts",
651                 "\x37\xe4\xc0\xa9\xf1\x49\xe5\x3e\x73\xb9\x1f\xec\xdc\xe0\xbd\xc5"
652                 "\x31\xd7\xef\x08\x65\x20\xe3\xad\xd9\x84\x60\xdc\x61\x6f\x26\x86"
653                 "\xb8\xd5\x29\x4b\x04\x41\x52\x59\x05\x00\xb0\xc2\x9b\x30\xda\x48"
654         },
655 }},{
656         "\xa5\x28\x24\x34\x1a\x3c\xd8\xf7\x05\x91\x8f\xee\x85\x1f\x35\x7f"
657         "\x80\x3d\xfc\x9b\x94\xf6\xfc\x9e\x19\x09\x00\xa9\x04\x31\x4f\x11", 32,
658         "\xa1\xba\x49\x95\xff\x34\x6d\xb8\xcd\x87\x5d\x5e\xfd\xea\x85\xdb"
659         "\x8a\x7b\x5e\xb2\x5d\x57\xdd\x62\xac\xa9\x8c\x41\x42\x94\x75\xb7", 32,
660         "\x69\xb4\xe8\x8c\x37\xe8\x67\x82\xf1\xec\x5d\x04\xe5\x14\x91\x13"
661         "\xdf\xf2\x87\x1b\x69\x81\x1d\x71\x70\x9e\x9c\x3b\xde\x49\x70\x11"
662         "\xa0\xa3\xdb\x0d\x54\x4f\x66\x69\xd7\xdb\x80\xa7\x70\x92\x68\xce"
663         "\x81\x04\x2c\xc6\xab\xae\xe5\x60\x15\xe9\x6f\xef\xaa\x8f\xa7\xa7"
664         "\x63\x8f\xf2\xf0\x77\xf1\xa8\xea\xe1\xb7\x1f\x9e\xab\x9e\x4b\x3f"
665         "\x07\x87\x5b\x6f\xcd\xa8\xaf\xb9\xfa\x70\x0b\x52\xb8\xa8\xa7\x9e"
666         "\x07\x5f\xa6\x0e\xb3\x9b\x79\x13\x79\xc3\x3e\x8d\x1c\x2c\x68\xc8"
667         "\x51\x1d\x3c\x7b\x7d\x79\x77\x2a\x56\x65\xc5\x54\x23\x28\xb0\x03", 128, {
668         {
669                 "xchacha12,aes", "adiantum",
670                 "\x9e\x16\xab\xed\x4b\xa7\x42\x5a\xc6\xfb\x4e\x76\xff\xbe\x03\xa0"
671                 "\x0f\xe3\xad\xba\xe4\x98\x2b\x0e\x21\x48\xa0\xb8\x65\x48\x27\x48"
672                 "\x84\x54\x54\xb2\x9a\x94\x7b\xe6\x4b\x29\xe9\xcf\x05\x91\x80\x1a"
673                 "\x3a\xf3\x41\x96\x85\x1d\x9f\x74\x51\x56\x63\xfa\x7c\x28\x85\x49"
674                 "\xf7\x2f\xf9\xf2\x18\x46\xf5\x33\x80\xa3\x3c\xce\xb2\x57\x93\xf5"
675                 "\xae\xbd\xa9\xf5\x7b\x30\xc4\x93\x66\xe0\x30\x77\x16\xe4\xa0\x31"
676                 "\xba\x70\xbc\x68\x13\xf5\xb0\x9a\xc1\xfc\x7e\xfe\x55\x80\x5c\x48"
677                 "\x74\xa6\xaa\xa3\xac\xdc\xc2\xf5\x8d\xde\x34\x86\x78\x60\x75\x8d",
678         },{
679                 "xchacha20,aes", "adiantum",
680                 "\xb1\x8b\xa0\x05\x77\xa8\x4d\x59\x1b\x8e\x21\xfc\x3a\x49\xfa\xd4"
681                 "\xeb\x36\xf3\xc4\xdf\xdc\xae\x67\x07\x3f\x70\x0e\xe9\x66\xf5\x0c"
682                 "\x30\x4d\x66\xc9\xa4\x2f\x73\x9c\x13\xc8\x49\x44\xcc\x0a\x90\x9d"
683                 "\x7c\xdd\x19\x3f\xea\x72\x8d\x58\xab\xe7\x09\x2c\xec\xb5\x44\xd2"
684                 "\xca\xa6\x2d\x7a\x5c\x9c\x2b\x15\xec\x2a\xa6\x69\x91\xf9\xf3\x13"
685                 "\xf7\x72\xc1\xc1\x40\xd5\xe1\x94\xf4\x29\xa1\x3e\x25\x02\xa8\x3e"
686                 "\x94\xc1\x91\x14\xa1\x14\xcb\xbe\x67\x4c\xb9\x38\xfe\xa7\xaa\x32"
687                 "\x29\x62\x0d\xb2\xf6\x3c\x58\x57\xc1\xd5\x5a\xbb\xd6\xa6\x2a\xe5"
688         },
689 }}};
690
691 /*
692  * Cipher IV tests
693  */
694 struct cipher_iv_test_vector {
695         const char *cipher_name;
696         const char *cipher_mode;
697         const char *key;
698         unsigned int key_length;
699         const char *iv_name;
700         uint64_t iv_offset;
701         unsigned int data_length;
702         const char in_sha256[32];
703         struct {
704                 size_t sector_size;
705                 bool large_iv;
706                 const char out_sha256[32];
707         } out[7];
708 };
709
710 static struct cipher_iv_test_vector cipher_iv_test_vectors[] = {
711 {
712         "aes", "cbc",
713         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16,
714         "null", UINT32_MAX-7, 8192,
715         "\x9f\x1d\xcb\xc3\x5c\x35\x0d\x60\x27\xf9\x8b\xe0\xf5\xc8\xb4\x3b"
716         "\x42\xca\x52\xb7\x60\x44\x59\xc0\xc4\x2b\xe3\xaa\x88\x91\x3d\x47", {
717         {       512, false,
718                 "\xfd\x05\xd0\x4d\x51\xb9\xd4\x87\xa4\x57\x9a\x62\x07\x39\xc9\x4a"
719                 "\x00\x90\x3e\xaf\xe8\xb2\xac\x12\xca\xeb\x58\xf9\x48\xf6\xef\x08"
720         },{     1024, false,
721                 "\x55\x87\x5c\xde\x86\x6a\x8b\xab\x08\xbe\x5b\x38\x17\x53\xdf\xe5"
722                 "\x7e\xb9\x5f\x59\xaf\x07\xa4\xca\x6a\x24\xd1\x12\xa9\x15\x25\xf4"
723         },{     1024, true,
724                 "\x55\x87\x5c\xde\x86\x6a\x8b\xab\x08\xbe\x5b\x38\x17\x53\xdf\xe5"
725                 "\x7e\xb9\x5f\x59\xaf\x07\xa4\xca\x6a\x24\xd1\x12\xa9\x15\x25\xf4"
726         },{     2048, false,
727                 "\x55\x5b\x8e\x74\x90\x9d\x0d\x4b\x74\x8c\x16\x7e\x29\xcf\xa9\xa3"
728                 "\xf3\x42\x8b\x62\xda\x2d\x8c\xda\xc9\x32\xc8\x78\xe2\x7e\xd2\x70"
729         },{     2048, true,
730                 "\x55\x5b\x8e\x74\x90\x9d\x0d\x4b\x74\x8c\x16\x7e\x29\xcf\xa9\xa3"
731                 "\xf3\x42\x8b\x62\xda\x2d\x8c\xda\xc9\x32\xc8\x78\xe2\x7e\xd2\x70"
732         },{     4096, false,
733                 "\xc6\x45\xba\xe0\x40\x3a\x96\x09\x5e\x46\x0d\x19\x9d\x58\x4b\x93"
734                 "\x78\xc5\x3f\xa4\x2e\x9e\xb0\x19\x04\x4b\x73\x26\xf4\xa6\xb5\xc3"
735         },{     4096, true,
736                 "\xc6\x45\xba\xe0\x40\x3a\x96\x09\x5e\x46\x0d\x19\x9d\x58\x4b\x93"
737                 "\x78\xc5\x3f\xa4\x2e\x9e\xb0\x19\x04\x4b\x73\x26\xf4\xa6\xb5\xc3"
738         },
739 }},
740 {
741         "aes", "cbc",
742         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16,
743         "plain", UINT32_MAX-7, 8192,
744         "\x9f\x1d\xcb\xc3\x5c\x35\x0d\x60\x27\xf9\x8b\xe0\xf5\xc8\xb4\x3b"
745         "\x42\xca\x52\xb7\x60\x44\x59\xc0\xc4\x2b\xe3\xaa\x88\x91\x3d\x47", {
746         {       512, false,
747                 "\x43\xfd\x6e\x25\x80\xb2\x13\xf5\xca\x71\x79\x18\xe4\x12\x91\xe0"
748                 "\x6e\x37\x24\x32\xfd\x40\x4b\x42\xcb\xc1\x72\x1a\xc7\x5a\x19\xc8"
749         },{     1024, false,
750                 "\x18\x79\x8d\xad\xf2\x7b\x38\x03\x27\xa5\x76\x19\x07\xcd\x12\x62"
751                 "\x03\x36\x57\x85\x88\x50\xd0\x6c\xf6\xdf\xf1\xcf\xb8\xcf\x01\x77"
752         },{     1024, true,
753                 "\xd0\x21\xcf\xb2\x7a\x01\xa8\x94\xb2\x87\x49\xc4\x9f\x9c\xb2\x3a"
754                 "\x7c\xc4\x0d\x50\x08\xea\x4d\xfb\x87\xe4\x49\x8c\x1a\xd6\xec\x16"
755         },{     2048, false,
756                 "\xa4\x89\x72\xb9\xcf\x78\x0c\x2a\xc8\x20\x4f\xd5\x13\xcb\x75\x30"
757                 "\x90\xd2\x4a\xfd\xd3\xb2\xe8\xf0\xd2\xb7\x9d\x07\xbd\xa9\x70\x97"
758         },{     2048, true,
759                 "\x2a\xcf\x07\x57\xc8\xea\x64\xc7\xd0\xd5\x28\xe6\xd1\x9a\xb5\x7d"
760                 "\xe4\xb9\x63\xa2\x66\x5a\x3d\x14\xbd\x27\xc7\x09\xc0\x3c\xd9\x00"
761         },{     4096, false,
762                 "\x12\x1b\x00\x54\x6e\x2d\x08\xc1\x15\x8b\x15\x57\xc5\x11\x30\x8b"
763                 "\x63\x33\x64\xa0\xd1\x45\xd6\xcb\xdd\x49\x91\x04\x29\xe6\x93\x08"
764         },{     4096, true,
765                 "\x44\xaa\xf1\x23\x0c\x34\x32\x2a\xfa\xe3\xf7\x95\x7a\x7c\xa8\x8b"
766                 "\x34\x78\xbd\x12\x5c\xae\x4a\x65\x23\x8a\x6f\x3a\x96\x05\xfa\xae"
767         },
768 }},
769 {
770         "aes", "cbc",
771         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16,
772         "plain64", UINT32_MAX-7, 8192,
773         "\x9f\x1d\xcb\xc3\x5c\x35\x0d\x60\x27\xf9\x8b\xe0\xf5\xc8\xb4\x3b"
774         "\x42\xca\x52\xb7\x60\x44\x59\xc0\xc4\x2b\xe3\xaa\x88\x91\x3d\x47", {
775         {       512, false,
776                 "\xb3\x65\x7e\x6c\xba\xe0\x39\xcd\x1e\x1d\xaf\x65\xae\xb7\xda\x20"
777                 "\x25\x17\x6a\x38\x75\x79\x68\x4c\x9a\x75\xc7\xfb\x2b\xa2\x17\xd2"
778         },{     1024, false,
779                 "\x0a\xa3\x23\x72\x80\xd3\x76\x33\x8b\x2b\xae\x01\x03\x99\xa5\xca"
780                 "\xcd\x95\x27\x40\x27\xec\x14\x90\xfd\x58\xb0\x08\x9b\x99\x27\xe2"
781         },{     1024, true,
782                 "\xd0\x21\xcf\xb2\x7a\x01\xa8\x94\xb2\x87\x49\xc4\x9f\x9c\xb2\x3a"
783                 "\x7c\xc4\x0d\x50\x08\xea\x4d\xfb\x87\xe4\x49\x8c\x1a\xd6\xec\x16"
784         },{     2048, false,
785                 "\x67\x87\xeb\xed\xe1\x16\x85\x0a\x3f\xb2\x5c\xbc\x27\x61\x99\x52"
786                 "\xfe\x64\xb9\xab\x24\xdd\x2c\x1a\x2c\xff\xcd\x7e\x2e\x74\xb5\xd4"
787         },{     2048, true,
788                 "\x2a\xcf\x07\x57\xc8\xea\x64\xc7\xd0\xd5\x28\xe6\xd1\x9a\xb5\x7d"
789                 "\xe4\xb9\x63\xa2\x66\x5a\x3d\x14\xbd\x27\xc7\x09\xc0\x3c\xd9\x00"
790         },{     4096, false,
791                 "\xb2\xf1\x0e\x66\xd4\x58\x4e\x93\xe7\x98\xae\x9c\x3e\xa7\xad\xf2"
792                 "\x93\x1a\xaa\x3c\xc4\x90\x12\x05\x00\x58\x25\x8f\x1f\x5d\xc6\x67"
793         },{     4096, true,
794                 "\x44\xaa\xf1\x23\x0c\x34\x32\x2a\xfa\xe3\xf7\x95\x7a\x7c\xa8\x8b"
795                 "\x34\x78\xbd\x12\x5c\xae\x4a\x65\x23\x8a\x6f\x3a\x96\x05\xfa\xae"
796         },
797 }},
798 {
799         "aes", "cbc",
800         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16,
801         "plain64be", UINT32_MAX-7, 8192,
802         "\x9f\x1d\xcb\xc3\x5c\x35\x0d\x60\x27\xf9\x8b\xe0\xf5\xc8\xb4\x3b"
803         "\x42\xca\x52\xb7\x60\x44\x59\xc0\xc4\x2b\xe3\xaa\x88\x91\x3d\x47", {
804         {       512, false,
805                 "\x28\xbf\x09\xe1\x68\xcc\x05\x1b\x20\xaf\x8d\x01\x36\x21\x8a\x8d"
806                 "\x7a\x94\x98\xa8\x99\xe9\xf4\x66\xd8\xb7\x99\xca\x04\x58\x83\x90"
807         },{     1024, false,
808                 "\x9b\x74\xf7\xd5\x5a\x6b\xb2\x3a\xd2\x09\xdd\x80\x59\x28\x70\x8f"
809                 "\x3a\x61\xf2\x14\xc3\x0d\xa8\xd7\xd9\xcb\x57\x26\x73\x88\x93\xd2"
810         },{     1024, true,
811                 "\x36\xb5\x68\x08\x29\x55\xb9\xe9\x01\xc1\xa8\xcf\x3e\x5b\x00\x28"
812                 "\xb6\xd1\x35\xc5\xf7\x0c\xf6\x59\xb5\x8f\xb9\xa2\x00\x43\x29\x48"
813         },{     2048, false,
814                 "\x94\x4f\xc8\xb4\xfe\xad\xdc\x56\xf0\x62\x00\x8d\x52\x0b\x2d\x58"
815                 "\xc0\x05\xd6\x1d\x47\x35\xc6\x6a\x42\xec\x98\xee\x21\x74\x7b\xe5"
816         },{     2048, true,
817                 "\x14\x6b\xaa\x2f\xf4\xa8\x24\x3f\x4e\x92\x97\x1a\xca\x1c\xbb\x46"
818                 "\xa7\x08\xbb\xc5\x95\xac\x73\x81\x25\x34\x33\x41\x95\x71\xd9\xe7"
819         },{     4096, false,
820                 "\xa8\x17\x5d\x84\xc8\x16\x06\x7f\xa2\x68\xdd\x1e\x7d\x63\x34\x93"
821                 "\x7b\x45\x2d\xf4\x10\x0b\x90\xfa\x14\x8b\x73\x86\xbc\x09\x4a\xe3"
822         },{     4096, true,
823                 "\xe2\xc3\x30\xd8\xa1\xb3\xa8\xeb\xde\xdc\xfe\x9b\xe0\x0b\x62\x4e"
824                 "\x38\x2f\xa1\x45\x0e\x8f\x6c\xf0\x4e\x88\x58\x17\x13\xb5\x10\x98"
825         },
826 }},
827 {
828         "aes", "cbc",
829         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16,
830         "essiv:sha256", 0, 8192,
831         "\x9f\x1d\xcb\xc3\x5c\x35\x0d\x60\x27\xf9\x8b\xe0\xf5\xc8\xb4\x3b"
832         "\x42\xca\x52\xb7\x60\x44\x59\xc0\xc4\x2b\xe3\xaa\x88\x91\x3d\x47", {
833         {       512, false,
834                 "\xa5\x3e\x74\xc4\x1a\x5c\xf3\x6b\x63\x49\xd5\xd9\xbb\x7a\x89\x5a"
835                 "\xd5\x3e\x76\x6f\x4c\x2d\x0b\xd3\x8b\x5e\x0e\x91\xa3\x8c\x2a\xde"
836         },{     1024, false,
837                 "\x41\x6b\xc6\x75\x2e\x99\x76\xa1\x83\xea\xd5\x97\x64\x0e\x24\x8c"
838                 "\x91\x17\x03\x38\xe7\xd8\x66\x64\xaa\xd7\x27\x50\x2a\xd3\x0b\xe6"
839         },{     1024, true,
840                 "\x02\x3c\xbe\xe6\x1e\x9a\xf3\x14\xab\x16\xff\x6f\xb6\xa2\x3e\x03"
841                 "\xa1\xbd\xe9\xe4\xfa\x44\x5b\x22\xc6\x53\xe8\x60\x58\x15\x99\xea"
842         },{     2048, false,
843                 "\x84\xdc\x45\xd3\x61\x03\xa8\x51\x85\x5b\xef\xf8\x92\x6b\x12\x06"
844                 "\x2c\xfe\x75\x3e\xcf\x28\xd1\x8b\x4d\xcb\x88\x9e\x31\xb0\x0b\x92"
845         },{     2048, true,
846                 "\x4b\x9d\xe4\x3c\xe2\x4e\x7a\x13\x72\x02\x48\xf8\x7a\x7e\x15\xe8"
847                 "\x3a\xc3\x92\x0b\xe8\x30\xac\xb7\x9a\xe0\xcf\xf9\xb1\xf5\x61\x5b"
848         },{     4096, false,
849                 "\xbb\x1b\xa3\xa9\x41\xbf\x17\xd8\x76\x19\x08\x8e\x3f\x50\xed\xfd"
850                 "\x57\x1d\xd2\xc2\x8a\x32\x01\xb9\xd9\x8a\xcc\x0d\xa0\x65\x8b\x6d"
851         },{     4096, true,
852                 "\xa6\xdc\x7d\xc8\xc4\x9b\x78\x81\x72\xe9\xdd\x35\x6c\x07\xeb\x7b"
853                 "\xd6\x56\x9e\xe4\xdf\xf5\xdd\x2e\x2c\x19\x8f\x63\x58\xdb\xa7\xd0"
854         },
855 }},
856 {
857         "aes", "cbc",
858         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16,
859         "benbi", 0, 8192,
860         "\x9f\x1d\xcb\xc3\x5c\x35\x0d\x60\x27\xf9\x8b\xe0\xf5\xc8\xb4\x3b"
861         "\x42\xca\x52\xb7\x60\x44\x59\xc0\xc4\x2b\xe3\xaa\x88\x91\x3d\x47", {
862         {       512, false,
863                 "\x3c\xe3\x94\xe3\x6d\x68\x5b\xdb\x5a\x8d\x71\xbf\xd3\xa6\x68\xb9"
864                 "\x1f\x33\x0f\x97\xe2\xd6\xe8\xe2\xe1\xfc\x7e\x80\x28\xf1\x73\xbd"
865         },{     1024, false,
866                 "\x0f\x27\xa7\xae\x31\x9e\x71\x02\x12\x16\x44\x5f\xbb\xc6\xcb\x78"
867                 "\xd4\x84\x49\xe0\x88\x85\x04\xbf\x6d\xea\x60\x76\x98\x34\x0a\x7e"
868         },{     1024, true,
869                 "\x3e\xf3\x08\x8d\x3b\x20\x4b\x51\x54\xde\x7f\x77\x5b\xcf\x02\x8b"
870                 "\x0e\xb0\x74\x2e\x8e\x29\xfa\x5e\x86\xb4\xab\x65\x18\x59\x48\xb1"
871         },{     2048, false,
872                 "\xb0\x9a\xe5\x31\x5f\x2e\x9d\x13\x04\x08\x2a\x02\x71\x3d\xdb\x5d"
873                 "\xb2\xc9\x68\x5b\xdc\xd1\x38\xc2\x96\xb3\x3b\x72\xda\x9d\xcb\xe6"
874         },{     2048, true,
875                 "\x6f\x34\xf0\xc1\xea\x72\xe4\xdc\x91\x91\x78\xb3\x7c\xb0\x9d\x41"
876                 "\x94\xf6\xb8\xad\x05\xc4\x0e\x49\x05\x31\x90\xf0\x56\xfe\x21\x3f"
877         },{     4096, false,
878                 "\xaa\x74\x7d\xd6\x73\xa7\x77\xe1\x7f\xb9\x76\xf7\x5c\xcf\xc0\xb7"
879                 "\xfa\x7b\xed\x15\xc2\x32\x7c\x27\xbb\x35\xfc\xfe\x12\xee\x14\x2d"
880         },{     4096, true,
881                 "\x71\x1b\x3d\x26\xf4\x44\x82\x72\x1b\x7a\x65\x0b\x37\x8c\x94\x5b"
882                 "\x1c\xd3\x30\x2f\xf6\xce\xa4\x24\x25\xeb\x9b\xb9\x83\xe5\x71\xbb"
883         },
884 }},
885 {
886         "aes", "cbc",
887         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c", 16,
888         "eboiv", 0, 8192,
889         "\x9f\x1d\xcb\xc3\x5c\x35\x0d\x60\x27\xf9\x8b\xe0\xf5\xc8\xb4\x3b"
890         "\x42\xca\x52\xb7\x60\x44\x59\xc0\xc4\x2b\xe3\xaa\x88\x91\x3d\x47", {
891         {       512, false,
892                 "\x04\x4e\x92\x9f\x79\x66\xfe\x93\x1b\xa5\xb8\x02\xfe\x7e\xf9\x26"
893                 "\x7b\x64\x39\xe7\xb3\xca\xc4\x6e\xca\x27\xa0\x2f\xe2\xea\x91\x16"
894         },{     1024, false,
895                 "\xb0\x4a\xa4\xb5\xd6\x45\x7a\x86\xe9\x43\x3d\xd6\x01\xf7\x68\x8e"
896                 "\xe6\x81\x8d\x50\x55\x18\x8e\x4b\xb6\xa7\x89\xdf\xe2\x4b\x94\xe2"
897         },{     1024, true,
898                 "\x95\x08\x4d\x4e\x89\xab\x91\x4e\xae\x56\x5d\xec\xf2\x78\x13\xb1"
899                 "\x82\xf7\xc8\xb5\x03\xd6\xfa\xb0\xe3\xf9\xc1\x01\xc0\x0c\x35\xa4"
900         },{     2048, false,
901                 "\xd4\x00\x1f\x26\x18\xd1\x6d\xd5\xc4\xbf\x4a\x13\x30\xae\xd7\x4b"
902                 "\x33\x1e\xd5\xe8\x43\x2d\x95\x84\x67\x39\x04\x51\x5f\x1f\x49\xe4"
903         },{     2048, true,
904                 "\x89\x8d\xa2\xec\x45\x7f\xf0\xac\xfc\x70\xb6\x36\xf0\x89\xca\x86"
905                 "\x6b\xbf\x09\xd2\x54\xa0\x7c\xbc\x17\xd3\x4e\xb8\x10\x8a\x3f\x5d"
906         },{     4096, false,
907                 "\xd1\xd7\x4f\x70\x9a\xa0\x22\x27\x60\xdb\x40\x5a\x84\xce\x89\x2c"
908                 "\x4f\x98\x55\xd2\x2d\xd1\xea\x9e\x47\xae\x8a\x83\xb5\x90\xbb\x49"
909         },{     4096, true,
910                 "\xdb\xe7\xd2\x25\xb0\x4f\x5d\x36\x20\xc4\xc2\xb4\xe8\x7e\xae\xe9"
911                 "\x95\x10\x45\x5d\xdd\xc4\xcd\x33\xad\xbd\x39\x49\xf2\x85\x82\x4c"
912         },
913 }}};
914
915 static int pbkdf_test_vectors(void)
916 {
917         char result[256];
918         unsigned int i;
919         const struct kdf_test_vector *vec;
920
921         for (i = 0; i < (sizeof(kdf_test_vectors) / sizeof(*kdf_test_vectors)); i++) {
922                 crypt_backend_memzero(result, sizeof(result));
923                 vec = &kdf_test_vectors[i];
924                 printf("PBKDF vector %02d %s ", i, vec->type);
925                 if (vec->hash && crypt_hmac_size(vec->hash) < 0) {
926                         printf("[%s N/A]\n", vec->hash);
927                         continue;
928                 }
929                 if (crypt_pbkdf(vec->type, vec->hash,
930                     vec->password, vec->password_length,
931                     vec->salt, vec->salt_length,
932                     result, vec->output_length,
933                     vec->iterations, vec->memory, vec->parallelism) < 0) {
934                         printf("[%s-%s N/A]\n", vec->type, vec->hash);
935                         continue;
936                 }
937                 if (memcmp(result, vec->output, vec->output_length)) {
938                         printf("[FAILED]\n");
939                         printhex(" got", result, vec->output_length);
940                         printhex("want", vec->output, vec->output_length);
941                         return EXIT_FAILURE;
942                 }
943                 printf("[OK]\n");
944         }
945         return EXIT_SUCCESS;
946 }
947
948 static int crc32_test(const struct hash_test_vector *vector, unsigned int i)
949 {
950         uint32_t crc32;
951
952         if (vector->out[i].length != sizeof(uint32_t))
953                 return EXIT_FAILURE;
954
955         crc32 = crypt_crc32(~0, (const unsigned char*)vector->data, vector->data_length) ^ ~0;
956
957         if ((unsigned char)vector->out[i].out[0] != ((crc32 >> 24) & 0xFF) ||
958             (unsigned char)vector->out[i].out[1] != ((crc32 >> 16) & 0xFF) ||
959             (unsigned char)vector->out[i].out[2] != ((crc32 >>  8) & 0xFF) ||
960             (unsigned char)vector->out[i].out[3] != ((crc32 >>  0) & 0xFF)) {
961                 printf("[FAILED]\n");
962                 printhex(" got", (const char *)&crc32, sizeof(crc32));
963                 printhex("want", vector->out[i].out, vector->out[i].length);
964                 return EXIT_FAILURE;
965         }
966
967         return EXIT_SUCCESS;
968 }
969
970 static int hash_test(void)
971 {
972         const struct hash_test_vector *vector;
973         unsigned int i, j;
974         int r;
975         struct crypt_hash *h;
976         char result[64];
977
978         for (i = 0; i < ARRAY_SIZE(hash_test_vectors); i++) {
979                 vector = &hash_test_vectors[i];
980                 printf("Hash vector %02d: ", i);
981
982                 for (j = 0; j < ARRAY_SIZE(vector->out); j++) {
983
984                         // CRC32 vector test is special
985                         if (!strcmp("crc32", vector->out[j].name)) {
986                                 if (crc32_test(vector, j) < 0)
987                                         return EXIT_FAILURE;
988                                 printf("[%s]", vector->out[j].name);
989                                 continue;
990                         }
991
992                         if (crypt_hash_size(vector->out[j].name) < 0) {
993                                 printf("[%s N/A]", vector->out[j].name);
994                                 continue;
995                         }
996
997                         if (crypt_hash_size(vector->out[j].name) != (int)vector->out[j].length)
998                                 return EXIT_FAILURE;
999
1000                         if (sizeof(result) < vector->out[j].length)
1001                                 return EXIT_FAILURE;
1002
1003                         crypt_backend_memzero(result, sizeof(result));
1004                         printf("[%s]", vector->out[j].name);
1005
1006                         if (crypt_hash_init(&h, vector->out[j].name)) {
1007                                 printf("[%s N/A (init)]", vector->out[j].name);
1008                                 continue;
1009                         }
1010
1011                         r = crypt_hash_write(h, vector->data, vector->data_length);
1012                         if (!r)
1013                                 r = crypt_hash_final(h, result, vector->out[j].length);
1014
1015                         crypt_hash_destroy(h);
1016
1017                         if (r)
1018                                 return EXIT_FAILURE;
1019
1020                         if (memcmp(result, vector->out[j].out, vector->out[j].length)) {
1021                                 printf("[FAILED]\n");
1022                                 printhex(" got", result, vector->out[j].length);
1023                                 printhex("want", vector->out[j].out, vector->out[j].length);
1024                                 return EXIT_FAILURE;
1025                         }
1026                 }
1027                 printf("\n");
1028         }
1029
1030         return EXIT_SUCCESS;
1031 }
1032
1033 static int hmac_test(void)
1034 {
1035         const struct hmac_test_vector *vector;
1036         struct crypt_hmac *hmac;
1037         unsigned int i, j;
1038         int r;
1039         char result[64];
1040
1041         for (i = 0; i < ARRAY_SIZE(hmac_test_vectors); i++) {
1042                 vector = &hmac_test_vectors[i];
1043                 printf("HMAC vector %02d: ", i);
1044
1045                 for(j = 0; j < ARRAY_SIZE(vector->out); j++) {
1046
1047                         if (crypt_hmac_size(vector->out[j].name) < 0) {
1048                                 printf("[%s N/A]", vector->out[j].name);
1049                                 continue;
1050                         }
1051
1052                         if (crypt_hmac_size(vector->out[j].name) != (int)vector->out[j].length)
1053                                 return EXIT_FAILURE;
1054
1055                         if (sizeof(result) < vector->out[j].length)
1056                                 return EXIT_FAILURE;
1057
1058                         crypt_backend_memzero(result, sizeof(result));
1059                         printf("[%s]", vector->out[j].name);
1060
1061                         if (crypt_hmac_init(&hmac, vector->out[j].name, vector->key, vector->key_length))
1062                                 return EXIT_FAILURE;
1063
1064                         r = crypt_hmac_write(hmac, vector->data, vector->data_length);
1065                         if (!r)
1066                                 r = crypt_hmac_final(hmac, result, vector->out[j].length);
1067
1068                         crypt_hmac_destroy(hmac);
1069
1070                         if (r)
1071                                 return EXIT_FAILURE;
1072
1073                         if (memcmp(result, vector->out[j].out, vector->out[j].length)) {
1074                                 printf("[FAILED]\n");
1075                                 printhex(" got", result, vector->out[j].length);
1076                                 printhex("want", vector->out[j].out, vector->out[j].length);
1077                                 return EXIT_FAILURE;
1078                         }
1079                 }
1080                 printf("\n");
1081         }
1082
1083         return EXIT_SUCCESS;
1084 }
1085
1086 static int cipher_test(void)
1087 {
1088         const struct cipher_test_vector *vector;
1089         struct crypt_cipher *cipher;
1090         unsigned int i, j;
1091         char result[256];
1092         int r;
1093
1094         for (i = 0; i < ARRAY_SIZE(cipher_test_vectors); i++) {
1095                 vector = &cipher_test_vectors[i];
1096                 printf("CIPHER vector %02d: ", i);
1097
1098                 for (j = 0; j < ARRAY_SIZE(vector->out); j++) {
1099                         if (vector->iv_length &&
1100                             crypt_cipher_ivsize(vector->out[j].name, vector->out[j].mode) != (int)vector->iv_length)
1101                                 return EXIT_FAILURE;
1102                         if (vector->data_length > sizeof(result))
1103                                 return EXIT_FAILURE;
1104
1105                         r = crypt_cipher_init(&cipher, vector->out[j].name, vector->out[j].mode,
1106                                               vector->key, vector->key_length);
1107                         if (r == -ENOENT || r == -ENOTSUP) {
1108                                 printf("[%s-%s N/A]", vector->out[j].name, vector->out[j].mode);
1109                                 continue;
1110                         } else {
1111                                 printf("[%s-%s,%dbits]", vector->out[j].name, vector->out[j].mode, vector->key_length * 8);
1112                                 if (r)
1113                                         return EXIT_FAILURE;
1114                         }
1115
1116                         crypt_backend_memzero(result, sizeof(result));
1117                         if (crypt_cipher_encrypt(cipher, vector->plaintext, result, vector->data_length,
1118                                                  vector->iv, vector->iv_length)) {
1119                                 crypt_cipher_destroy(cipher);
1120                                 return EXIT_FAILURE;
1121                         }
1122
1123                         if (memcmp(vector->out[j].ciphertext, result, vector->data_length)) {
1124                                 printf("[ENCRYPTION FAILED]\n");
1125                                 printhex(" got", result, vector->data_length);
1126                                 printhex("want", vector->out[j].ciphertext, vector->data_length);
1127                                 crypt_cipher_destroy(cipher);
1128                                 return EXIT_FAILURE;
1129                         }
1130
1131                         crypt_backend_memzero(result, sizeof(result));
1132                         if (crypt_cipher_decrypt(cipher, vector->out[j].ciphertext, result, vector->data_length,
1133                                                  vector->iv, vector->iv_length)) {
1134                                 crypt_cipher_destroy(cipher);
1135                                 return EXIT_FAILURE;
1136                         }
1137
1138                         if (memcmp(vector->plaintext, result, vector->data_length)) {
1139                                 printf("[DECRYPTION FAILED]\n");
1140                                 printhex(" got", result, vector->data_length);
1141                                 printhex("want", vector->plaintext, vector->data_length);
1142                                 crypt_cipher_destroy(cipher);
1143                                 return EXIT_FAILURE;
1144                         }
1145
1146                         crypt_cipher_destroy(cipher);
1147                 }
1148                 printf("\n");
1149         }
1150
1151         return EXIT_SUCCESS;
1152 }
1153
1154 static void get_sha256(const char *in, size_t length, char out[32])
1155 {
1156         struct crypt_hash *h;
1157
1158         crypt_backend_memzero(out, 32);
1159         if (crypt_hash_init(&h, "sha256"))
1160                 return;
1161
1162         if (!crypt_hash_write(h, in, length))
1163                 crypt_hash_final(h, out, 32);
1164
1165         crypt_hash_destroy(h);
1166 }
1167
1168 static int cipher_iv_test(void)
1169 {
1170         const struct cipher_iv_test_vector *vector;
1171         struct crypt_storage *storage;
1172         unsigned int i, j;
1173         char mode_iv[256];
1174         char result[8192], hash[32];
1175         int r;
1176
1177         for (i = 0; i < ARRAY_SIZE(cipher_iv_test_vectors); i++) {
1178                 vector = &cipher_iv_test_vectors[i];
1179                 printf("IV vector %02d: [%s-%s-%s]", i, vector->cipher_name, vector->cipher_mode, vector->iv_name);
1180
1181                 for (j = 0; j < ARRAY_SIZE(vector->out); j++) {
1182                         if (vector->data_length > sizeof(result))
1183                                 return EXIT_FAILURE;
1184
1185                         snprintf(mode_iv, sizeof(mode_iv)-2, "%s-%s", vector->cipher_mode, vector->iv_name);
1186                         r = crypt_storage_init(&storage, vector->out[j].sector_size, vector->cipher_name, mode_iv,
1187                                                vector->key, vector->key_length, vector->out[j].large_iv);
1188                         if (r == -ENOENT || r == -ENOTSUP) {
1189                                 printf("[N/A]");
1190                                 continue;
1191                         } else {
1192                                 printf("[%i%s]", (int)vector->out[j].sector_size, vector->out[j].large_iv ? "L" : "");
1193                                 if (r)
1194                                         return EXIT_FAILURE;
1195                         }
1196
1197                         crypt_backend_memzero(result, sizeof(result));
1198                         if (crypt_storage_encrypt(storage, vector->iv_offset, vector->data_length, result)) {
1199                                 crypt_storage_destroy(storage);
1200                                 return EXIT_FAILURE;
1201                         }
1202
1203                         get_sha256(result, vector->data_length, hash);
1204                         if (memcmp(vector->out[j].out_sha256, hash, sizeof(hash))) {
1205                                 printf("[ENCRYPTION FAILED]\n");
1206                                 printhex(" got", hash, sizeof(hash));
1207                                 printhex("want", vector->out[j].out_sha256, sizeof(vector->out[j].out_sha256));
1208                                 crypt_storage_destroy(storage);
1209                                 return EXIT_FAILURE;
1210                         }
1211
1212                         if (crypt_storage_decrypt(storage, vector->iv_offset, vector->data_length, result)) {
1213                                 crypt_storage_destroy(storage);
1214                                 return EXIT_FAILURE;
1215                         }
1216
1217                         get_sha256(result, vector->data_length, hash);
1218                         if (memcmp(vector->in_sha256, hash, sizeof(hash))) {
1219                                 printf("[DECRYPTION FAILED]\n");
1220                                 printhex(" got", hash, sizeof(hash));
1221                                 printhex("want", vector->in_sha256, sizeof(vector->in_sha256));
1222                                 crypt_storage_destroy(storage);
1223                                 return EXIT_FAILURE;
1224                         }
1225
1226                         crypt_storage_destroy(storage);
1227                 }
1228                 printf("\n");
1229         }
1230
1231         return EXIT_SUCCESS;
1232 }
1233
1234 static void __attribute__((noreturn)) exit_test(const char *msg, int r)
1235 {
1236         if (msg)
1237                 printf("%s\n", msg);
1238         crypt_backend_destroy();
1239         exit(r);
1240 }
1241
1242 int main(__attribute__ ((unused)) int argc, __attribute__ ((unused))char *argv[])
1243 {
1244         setvbuf(stdout, NULL, _IONBF, 0);
1245
1246         if (getenv("CRYPTSETUP_PATH")) {
1247                 printf("Cannot run this test with CRYPTSETUP_PATH set.\n");
1248                 exit(77);
1249         }
1250
1251         if (crypt_backend_init())
1252                 exit_test("Crypto backend init error.", EXIT_FAILURE);
1253
1254         printf("Test vectors using %s crypto backend.\n", crypt_backend_version());
1255
1256         if (pbkdf_test_vectors())
1257                 exit_test("PBKDF test failed.", EXIT_FAILURE);
1258
1259         if (hash_test())
1260                 exit_test("HASH test failed.", EXIT_FAILURE);
1261
1262         if (hmac_test())
1263                 exit_test("HMAC test failed.", EXIT_FAILURE);
1264
1265         if (cipher_test())
1266                 exit_test("CIPHER test failed.", EXIT_FAILURE);
1267
1268         if (cipher_iv_test())
1269                 exit_test("IV test failed.", EXIT_FAILURE);
1270
1271         exit_test(NULL, EXIT_SUCCESS);
1272 }