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