diff options
Diffstat (limited to 'crypto/tcrypt.c')
-rw-r--r-- | crypto/tcrypt.c | 910 |
1 files changed, 910 insertions, 0 deletions
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c new file mode 100644 index 000000000000..92b0352c8e92 --- /dev/null +++ b/crypto/tcrypt.c | |||
@@ -0,0 +1,910 @@ | |||
1 | /* | ||
2 | * Quick & dirty crypto testing module. | ||
3 | * | ||
4 | * This will only exist until we have a better testing mechanism | ||
5 | * (e.g. a char device). | ||
6 | * | ||
7 | * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> | ||
8 | * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License as published by the Free | ||
12 | * Software Foundation; either version 2 of the License, or (at your option) | ||
13 | * any later version. | ||
14 | * | ||
15 | * 14 - 09 - 2003 | ||
16 | * Rewritten by Kartikey Mahendra Bhatt | ||
17 | */ | ||
18 | |||
19 | #include <linux/init.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/mm.h> | ||
22 | #include <linux/slab.h> | ||
23 | #include <asm/scatterlist.h> | ||
24 | #include <linux/string.h> | ||
25 | #include <linux/crypto.h> | ||
26 | #include <linux/highmem.h> | ||
27 | #include <linux/moduleparam.h> | ||
28 | #include "tcrypt.h" | ||
29 | |||
30 | /* | ||
31 | * Need to kmalloc() memory for testing kmap(). | ||
32 | */ | ||
33 | #define TVMEMSIZE 4096 | ||
34 | #define XBUFSIZE 32768 | ||
35 | |||
36 | /* | ||
37 | * Indexes into the xbuf to simulate cross-page access. | ||
38 | */ | ||
39 | #define IDX1 37 | ||
40 | #define IDX2 32400 | ||
41 | #define IDX3 1 | ||
42 | #define IDX4 8193 | ||
43 | #define IDX5 22222 | ||
44 | #define IDX6 17101 | ||
45 | #define IDX7 27333 | ||
46 | #define IDX8 3000 | ||
47 | |||
48 | /* | ||
49 | * Used by test_cipher() | ||
50 | */ | ||
51 | #define ENCRYPT 1 | ||
52 | #define DECRYPT 0 | ||
53 | #define MODE_ECB 1 | ||
54 | #define MODE_CBC 0 | ||
55 | |||
56 | static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; | ||
57 | |||
58 | static int mode; | ||
59 | static char *xbuf; | ||
60 | static char *tvmem; | ||
61 | |||
62 | static char *check[] = { | ||
63 | "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish", | ||
64 | "twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6", | ||
65 | "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea", | ||
66 | "khazad", "wp512", "wp384", "wp256", "tnepres", NULL | ||
67 | }; | ||
68 | |||
69 | static void | ||
70 | hexdump(unsigned char *buf, unsigned int len) | ||
71 | { | ||
72 | while (len--) | ||
73 | printk("%02x", *buf++); | ||
74 | |||
75 | printk("\n"); | ||
76 | } | ||
77 | |||
78 | static void | ||
79 | test_hash (char * algo, struct hash_testvec * template, unsigned int tcount) | ||
80 | { | ||
81 | char *p; | ||
82 | unsigned int i, j, k, temp; | ||
83 | struct scatterlist sg[8]; | ||
84 | char result[64]; | ||
85 | struct crypto_tfm *tfm; | ||
86 | struct hash_testvec *hash_tv; | ||
87 | unsigned int tsize; | ||
88 | |||
89 | printk("\ntesting %s\n", algo); | ||
90 | |||
91 | tsize = sizeof (struct hash_testvec); | ||
92 | tsize *= tcount; | ||
93 | |||
94 | if (tsize > TVMEMSIZE) { | ||
95 | printk("template (%u) too big for tvmem (%u)\n", tsize, TVMEMSIZE); | ||
96 | return; | ||
97 | } | ||
98 | |||
99 | memcpy(tvmem, template, tsize); | ||
100 | hash_tv = (void *) tvmem; | ||
101 | tfm = crypto_alloc_tfm(algo, 0); | ||
102 | if (tfm == NULL) { | ||
103 | printk("failed to load transform for %s\n", algo); | ||
104 | return; | ||
105 | } | ||
106 | |||
107 | for (i = 0; i < tcount; i++) { | ||
108 | printk ("test %u:\n", i + 1); | ||
109 | memset (result, 0, 64); | ||
110 | |||
111 | p = hash_tv[i].plaintext; | ||
112 | sg[0].page = virt_to_page (p); | ||
113 | sg[0].offset = offset_in_page (p); | ||
114 | sg[0].length = hash_tv[i].psize; | ||
115 | |||
116 | crypto_digest_init (tfm); | ||
117 | if (tfm->crt_u.digest.dit_setkey) { | ||
118 | crypto_digest_setkey (tfm, hash_tv[i].key, | ||
119 | hash_tv[i].ksize); | ||
120 | } | ||
121 | crypto_digest_update (tfm, sg, 1); | ||
122 | crypto_digest_final (tfm, result); | ||
123 | |||
124 | hexdump (result, crypto_tfm_alg_digestsize (tfm)); | ||
125 | printk("%s\n", | ||
126 | memcmp(result, hash_tv[i].digest, | ||
127 | crypto_tfm_alg_digestsize(tfm)) ? "fail" : | ||
128 | "pass"); | ||
129 | } | ||
130 | |||
131 | printk ("testing %s across pages\n", algo); | ||
132 | |||
133 | /* setup the dummy buffer first */ | ||
134 | memset(xbuf, 0, XBUFSIZE); | ||
135 | |||
136 | j = 0; | ||
137 | for (i = 0; i < tcount; i++) { | ||
138 | if (hash_tv[i].np) { | ||
139 | j++; | ||
140 | printk ("test %u:\n", j); | ||
141 | memset (result, 0, 64); | ||
142 | |||
143 | temp = 0; | ||
144 | for (k = 0; k < hash_tv[i].np; k++) { | ||
145 | memcpy (&xbuf[IDX[k]], hash_tv[i].plaintext + temp, | ||
146 | hash_tv[i].tap[k]); | ||
147 | temp += hash_tv[i].tap[k]; | ||
148 | p = &xbuf[IDX[k]]; | ||
149 | sg[k].page = virt_to_page (p); | ||
150 | sg[k].offset = offset_in_page (p); | ||
151 | sg[k].length = hash_tv[i].tap[k]; | ||
152 | } | ||
153 | |||
154 | crypto_digest_digest (tfm, sg, hash_tv[i].np, result); | ||
155 | |||
156 | hexdump (result, crypto_tfm_alg_digestsize (tfm)); | ||
157 | printk("%s\n", | ||
158 | memcmp(result, hash_tv[i].digest, | ||
159 | crypto_tfm_alg_digestsize(tfm)) ? "fail" : | ||
160 | "pass"); | ||
161 | } | ||
162 | } | ||
163 | |||
164 | crypto_free_tfm (tfm); | ||
165 | } | ||
166 | |||
167 | |||
168 | #ifdef CONFIG_CRYPTO_HMAC | ||
169 | |||
170 | static void | ||
171 | test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount) | ||
172 | { | ||
173 | char *p; | ||
174 | unsigned int i, j, k, temp; | ||
175 | struct scatterlist sg[8]; | ||
176 | char result[64]; | ||
177 | struct crypto_tfm *tfm; | ||
178 | struct hmac_testvec *hmac_tv; | ||
179 | unsigned int tsize, klen; | ||
180 | |||
181 | tfm = crypto_alloc_tfm(algo, 0); | ||
182 | if (tfm == NULL) { | ||
183 | printk("failed to load transform for %s\n", algo); | ||
184 | return; | ||
185 | } | ||
186 | |||
187 | printk("\ntesting hmac_%s\n", algo); | ||
188 | |||
189 | tsize = sizeof (struct hmac_testvec); | ||
190 | tsize *= tcount; | ||
191 | if (tsize > TVMEMSIZE) { | ||
192 | printk("template (%u) too big for tvmem (%u)\n", tsize, | ||
193 | TVMEMSIZE); | ||
194 | goto out; | ||
195 | } | ||
196 | |||
197 | memcpy(tvmem, template, tsize); | ||
198 | hmac_tv = (void *) tvmem; | ||
199 | |||
200 | for (i = 0; i < tcount; i++) { | ||
201 | printk("test %u:\n", i + 1); | ||
202 | memset(result, 0, sizeof (result)); | ||
203 | |||
204 | p = hmac_tv[i].plaintext; | ||
205 | klen = hmac_tv[i].ksize; | ||
206 | sg[0].page = virt_to_page(p); | ||
207 | sg[0].offset = offset_in_page(p); | ||
208 | sg[0].length = hmac_tv[i].psize; | ||
209 | |||
210 | crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, 1, result); | ||
211 | |||
212 | hexdump(result, crypto_tfm_alg_digestsize(tfm)); | ||
213 | printk("%s\n", | ||
214 | memcmp(result, hmac_tv[i].digest, | ||
215 | crypto_tfm_alg_digestsize(tfm)) ? "fail" : | ||
216 | "pass"); | ||
217 | } | ||
218 | |||
219 | printk("\ntesting hmac_%s across pages\n", algo); | ||
220 | |||
221 | memset(xbuf, 0, XBUFSIZE); | ||
222 | |||
223 | j = 0; | ||
224 | for (i = 0; i < tcount; i++) { | ||
225 | if (hmac_tv[i].np) { | ||
226 | j++; | ||
227 | printk ("test %u:\n",j); | ||
228 | memset (result, 0, 64); | ||
229 | |||
230 | temp = 0; | ||
231 | klen = hmac_tv[i].ksize; | ||
232 | for (k = 0; k < hmac_tv[i].np; k++) { | ||
233 | memcpy (&xbuf[IDX[k]], hmac_tv[i].plaintext + temp, | ||
234 | hmac_tv[i].tap[k]); | ||
235 | temp += hmac_tv[i].tap[k]; | ||
236 | p = &xbuf[IDX[k]]; | ||
237 | sg[k].page = virt_to_page (p); | ||
238 | sg[k].offset = offset_in_page (p); | ||
239 | sg[k].length = hmac_tv[i].tap[k]; | ||
240 | } | ||
241 | |||
242 | crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, hmac_tv[i].np, | ||
243 | result); | ||
244 | hexdump(result, crypto_tfm_alg_digestsize(tfm)); | ||
245 | |||
246 | printk("%s\n", | ||
247 | memcmp(result, hmac_tv[i].digest, | ||
248 | crypto_tfm_alg_digestsize(tfm)) ? "fail" : | ||
249 | "pass"); | ||
250 | } | ||
251 | } | ||
252 | out: | ||
253 | crypto_free_tfm(tfm); | ||
254 | } | ||
255 | |||
256 | #endif /* CONFIG_CRYPTO_HMAC */ | ||
257 | |||
258 | static void | ||
259 | test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, unsigned int tcount) | ||
260 | { | ||
261 | unsigned int ret, i, j, k, temp; | ||
262 | unsigned int tsize; | ||
263 | char *p, *q; | ||
264 | struct crypto_tfm *tfm; | ||
265 | char *key; | ||
266 | struct cipher_testvec *cipher_tv; | ||
267 | struct scatterlist sg[8]; | ||
268 | char e[11], m[4]; | ||
269 | |||
270 | if (enc == ENCRYPT) | ||
271 | strncpy(e, "encryption", 11); | ||
272 | else | ||
273 | strncpy(e, "decryption", 11); | ||
274 | if (mode == MODE_ECB) | ||
275 | strncpy(m, "ECB", 4); | ||
276 | else | ||
277 | strncpy(m, "CBC", 4); | ||
278 | |||
279 | printk("\ntesting %s %s %s \n", algo, m, e); | ||
280 | |||
281 | tsize = sizeof (struct cipher_testvec); | ||
282 | tsize *= tcount; | ||
283 | |||
284 | if (tsize > TVMEMSIZE) { | ||
285 | printk("template (%u) too big for tvmem (%u)\n", tsize, | ||
286 | TVMEMSIZE); | ||
287 | return; | ||
288 | } | ||
289 | |||
290 | memcpy(tvmem, template, tsize); | ||
291 | cipher_tv = (void *) tvmem; | ||
292 | |||
293 | if (mode) | ||
294 | tfm = crypto_alloc_tfm (algo, 0); | ||
295 | else | ||
296 | tfm = crypto_alloc_tfm (algo, CRYPTO_TFM_MODE_CBC); | ||
297 | |||
298 | if (tfm == NULL) { | ||
299 | printk("failed to load transform for %s %s\n", algo, m); | ||
300 | return; | ||
301 | } | ||
302 | |||
303 | j = 0; | ||
304 | for (i = 0; i < tcount; i++) { | ||
305 | if (!(cipher_tv[i].np)) { | ||
306 | j++; | ||
307 | printk("test %u (%d bit key):\n", | ||
308 | j, cipher_tv[i].klen * 8); | ||
309 | |||
310 | tfm->crt_flags = 0; | ||
311 | if (cipher_tv[i].wk) | ||
312 | tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY; | ||
313 | key = cipher_tv[i].key; | ||
314 | |||
315 | ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen); | ||
316 | if (ret) { | ||
317 | printk("setkey() failed flags=%x\n", tfm->crt_flags); | ||
318 | |||
319 | if (!cipher_tv[i].fail) | ||
320 | goto out; | ||
321 | } | ||
322 | |||
323 | p = cipher_tv[i].input; | ||
324 | sg[0].page = virt_to_page(p); | ||
325 | sg[0].offset = offset_in_page(p); | ||
326 | sg[0].length = cipher_tv[i].ilen; | ||
327 | |||
328 | if (!mode) { | ||
329 | crypto_cipher_set_iv(tfm, cipher_tv[i].iv, | ||
330 | crypto_tfm_alg_ivsize (tfm)); | ||
331 | } | ||
332 | |||
333 | if (enc) | ||
334 | ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen); | ||
335 | else | ||
336 | ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen); | ||
337 | |||
338 | |||
339 | if (ret) { | ||
340 | printk("%s () failed flags=%x\n", e, tfm->crt_flags); | ||
341 | goto out; | ||
342 | } | ||
343 | |||
344 | q = kmap(sg[0].page) + sg[0].offset; | ||
345 | hexdump(q, cipher_tv[i].rlen); | ||
346 | |||
347 | printk("%s\n", | ||
348 | memcmp(q, cipher_tv[i].result, cipher_tv[i].rlen) ? "fail" : | ||
349 | "pass"); | ||
350 | } | ||
351 | } | ||
352 | |||
353 | printk("\ntesting %s %s %s across pages (chunking) \n", algo, m, e); | ||
354 | memset(xbuf, 0, XBUFSIZE); | ||
355 | |||
356 | j = 0; | ||
357 | for (i = 0; i < tcount; i++) { | ||
358 | if (cipher_tv[i].np) { | ||
359 | j++; | ||
360 | printk("test %u (%d bit key):\n", | ||
361 | j, cipher_tv[i].klen * 8); | ||
362 | |||
363 | tfm->crt_flags = 0; | ||
364 | if (cipher_tv[i].wk) | ||
365 | tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY; | ||
366 | key = cipher_tv[i].key; | ||
367 | |||
368 | ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen); | ||
369 | if (ret) { | ||
370 | printk("setkey() failed flags=%x\n", tfm->crt_flags); | ||
371 | |||
372 | if (!cipher_tv[i].fail) | ||
373 | goto out; | ||
374 | } | ||
375 | |||
376 | temp = 0; | ||
377 | for (k = 0; k < cipher_tv[i].np; k++) { | ||
378 | memcpy (&xbuf[IDX[k]], cipher_tv[i].input + temp, | ||
379 | cipher_tv[i].tap[k]); | ||
380 | temp += cipher_tv[i].tap[k]; | ||
381 | p = &xbuf[IDX[k]]; | ||
382 | sg[k].page = virt_to_page (p); | ||
383 | sg[k].offset = offset_in_page (p); | ||
384 | sg[k].length = cipher_tv[i].tap[k]; | ||
385 | } | ||
386 | |||
387 | if (!mode) { | ||
388 | crypto_cipher_set_iv(tfm, cipher_tv[i].iv, | ||
389 | crypto_tfm_alg_ivsize (tfm)); | ||
390 | } | ||
391 | |||
392 | if (enc) | ||
393 | ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen); | ||
394 | else | ||
395 | ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen); | ||
396 | |||
397 | if (ret) { | ||
398 | printk("%s () failed flags=%x\n", e, tfm->crt_flags); | ||
399 | goto out; | ||
400 | } | ||
401 | |||
402 | temp = 0; | ||
403 | for (k = 0; k < cipher_tv[i].np; k++) { | ||
404 | printk("page %u\n", k); | ||
405 | q = kmap(sg[k].page) + sg[k].offset; | ||
406 | hexdump(q, cipher_tv[i].tap[k]); | ||
407 | printk("%s\n", | ||
408 | memcmp(q, cipher_tv[i].result + temp, | ||
409 | cipher_tv[i].tap[k]) ? "fail" : | ||
410 | "pass"); | ||
411 | temp += cipher_tv[i].tap[k]; | ||
412 | } | ||
413 | } | ||
414 | } | ||
415 | |||
416 | out: | ||
417 | crypto_free_tfm(tfm); | ||
418 | } | ||
419 | |||
420 | static void | ||
421 | test_deflate(void) | ||
422 | { | ||
423 | unsigned int i; | ||
424 | char result[COMP_BUF_SIZE]; | ||
425 | struct crypto_tfm *tfm; | ||
426 | struct comp_testvec *tv; | ||
427 | unsigned int tsize; | ||
428 | |||
429 | printk("\ntesting deflate compression\n"); | ||
430 | |||
431 | tsize = sizeof (deflate_comp_tv_template); | ||
432 | if (tsize > TVMEMSIZE) { | ||
433 | printk("template (%u) too big for tvmem (%u)\n", tsize, | ||
434 | TVMEMSIZE); | ||
435 | return; | ||
436 | } | ||
437 | |||
438 | memcpy(tvmem, deflate_comp_tv_template, tsize); | ||
439 | tv = (void *) tvmem; | ||
440 | |||
441 | tfm = crypto_alloc_tfm("deflate", 0); | ||
442 | if (tfm == NULL) { | ||
443 | printk("failed to load transform for deflate\n"); | ||
444 | return; | ||
445 | } | ||
446 | |||
447 | for (i = 0; i < DEFLATE_COMP_TEST_VECTORS; i++) { | ||
448 | int ilen, ret, dlen = COMP_BUF_SIZE; | ||
449 | |||
450 | printk("test %u:\n", i + 1); | ||
451 | memset(result, 0, sizeof (result)); | ||
452 | |||
453 | ilen = tv[i].inlen; | ||
454 | ret = crypto_comp_compress(tfm, tv[i].input, | ||
455 | ilen, result, &dlen); | ||
456 | if (ret) { | ||
457 | printk("fail: ret=%d\n", ret); | ||
458 | continue; | ||
459 | } | ||
460 | hexdump(result, dlen); | ||
461 | printk("%s (ratio %d:%d)\n", | ||
462 | memcmp(result, tv[i].output, dlen) ? "fail" : "pass", | ||
463 | ilen, dlen); | ||
464 | } | ||
465 | |||
466 | printk("\ntesting deflate decompression\n"); | ||
467 | |||
468 | tsize = sizeof (deflate_decomp_tv_template); | ||
469 | if (tsize > TVMEMSIZE) { | ||
470 | printk("template (%u) too big for tvmem (%u)\n", tsize, | ||
471 | TVMEMSIZE); | ||
472 | goto out; | ||
473 | } | ||
474 | |||
475 | memcpy(tvmem, deflate_decomp_tv_template, tsize); | ||
476 | tv = (void *) tvmem; | ||
477 | |||
478 | for (i = 0; i < DEFLATE_DECOMP_TEST_VECTORS; i++) { | ||
479 | int ilen, ret, dlen = COMP_BUF_SIZE; | ||
480 | |||
481 | printk("test %u:\n", i + 1); | ||
482 | memset(result, 0, sizeof (result)); | ||
483 | |||
484 | ilen = tv[i].inlen; | ||
485 | ret = crypto_comp_decompress(tfm, tv[i].input, | ||
486 | ilen, result, &dlen); | ||
487 | if (ret) { | ||
488 | printk("fail: ret=%d\n", ret); | ||
489 | continue; | ||
490 | } | ||
491 | hexdump(result, dlen); | ||
492 | printk("%s (ratio %d:%d)\n", | ||
493 | memcmp(result, tv[i].output, dlen) ? "fail" : "pass", | ||
494 | ilen, dlen); | ||
495 | } | ||
496 | out: | ||
497 | crypto_free_tfm(tfm); | ||
498 | } | ||
499 | |||
500 | static void | ||
501 | test_crc32c(void) | ||
502 | { | ||
503 | #define NUMVEC 6 | ||
504 | #define VECSIZE 40 | ||
505 | |||
506 | int i, j, pass; | ||
507 | u32 crc; | ||
508 | u8 b, test_vec[NUMVEC][VECSIZE]; | ||
509 | static u32 vec_results[NUMVEC] = { | ||
510 | 0x0e2c157f, 0xe980ebf6, 0xde74bded, | ||
511 | 0xd579c862, 0xba979ad0, 0x2b29d913 | ||
512 | }; | ||
513 | static u32 tot_vec_results = 0x24c5d375; | ||
514 | |||
515 | struct scatterlist sg[NUMVEC]; | ||
516 | struct crypto_tfm *tfm; | ||
517 | char *fmtdata = "testing crc32c initialized to %08x: %s\n"; | ||
518 | #define SEEDTESTVAL 0xedcba987 | ||
519 | u32 seed; | ||
520 | |||
521 | printk("\ntesting crc32c\n"); | ||
522 | |||
523 | tfm = crypto_alloc_tfm("crc32c", 0); | ||
524 | if (tfm == NULL) { | ||
525 | printk("failed to load transform for crc32c\n"); | ||
526 | return; | ||
527 | } | ||
528 | |||
529 | crypto_digest_init(tfm); | ||
530 | crypto_digest_final(tfm, (u8*)&crc); | ||
531 | printk(fmtdata, crc, (crc == 0) ? "pass" : "ERROR"); | ||
532 | |||
533 | /* | ||
534 | * stuff test_vec with known values, simple incrementing | ||
535 | * byte values. | ||
536 | */ | ||
537 | b = 0; | ||
538 | for (i = 0; i < NUMVEC; i++) { | ||
539 | for (j = 0; j < VECSIZE; j++) | ||
540 | test_vec[i][j] = ++b; | ||
541 | sg[i].page = virt_to_page(test_vec[i]); | ||
542 | sg[i].offset = offset_in_page(test_vec[i]); | ||
543 | sg[i].length = VECSIZE; | ||
544 | } | ||
545 | |||
546 | seed = SEEDTESTVAL; | ||
547 | (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32)); | ||
548 | crypto_digest_final(tfm, (u8*)&crc); | ||
549 | printk("testing crc32c setkey returns %08x : %s\n", crc, (crc == (SEEDTESTVAL ^ ~(u32)0)) ? | ||
550 | "pass" : "ERROR"); | ||
551 | |||
552 | printk("testing crc32c using update/final:\n"); | ||
553 | |||
554 | pass = 1; /* assume all is well */ | ||
555 | |||
556 | for (i = 0; i < NUMVEC; i++) { | ||
557 | seed = ~(u32)0; | ||
558 | (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32)); | ||
559 | crypto_digest_update(tfm, &sg[i], 1); | ||
560 | crypto_digest_final(tfm, (u8*)&crc); | ||
561 | if (crc == vec_results[i]) { | ||
562 | printk(" %08x:OK", crc); | ||
563 | } else { | ||
564 | printk(" %08x:BAD, wanted %08x\n", crc, vec_results[i]); | ||
565 | pass = 0; | ||
566 | } | ||
567 | } | ||
568 | |||
569 | printk("\ntesting crc32c using incremental accumulator:\n"); | ||
570 | crc = 0; | ||
571 | for (i = 0; i < NUMVEC; i++) { | ||
572 | seed = (crc ^ ~(u32)0); | ||
573 | (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32)); | ||
574 | crypto_digest_update(tfm, &sg[i], 1); | ||
575 | crypto_digest_final(tfm, (u8*)&crc); | ||
576 | } | ||
577 | if (crc == tot_vec_results) { | ||
578 | printk(" %08x:OK", crc); | ||
579 | } else { | ||
580 | printk(" %08x:BAD, wanted %08x\n", crc, tot_vec_results); | ||
581 | pass = 0; | ||
582 | } | ||
583 | |||
584 | printk("\ntesting crc32c using digest:\n"); | ||
585 | seed = ~(u32)0; | ||
586 | (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32)); | ||
587 | crypto_digest_digest(tfm, sg, NUMVEC, (u8*)&crc); | ||
588 | if (crc == tot_vec_results) { | ||
589 | printk(" %08x:OK", crc); | ||
590 | } else { | ||
591 | printk(" %08x:BAD, wanted %08x\n", crc, tot_vec_results); | ||
592 | pass = 0; | ||
593 | } | ||
594 | |||
595 | printk("\n%s\n", pass ? "pass" : "ERROR"); | ||
596 | |||
597 | crypto_free_tfm(tfm); | ||
598 | printk("crc32c test complete\n"); | ||
599 | } | ||
600 | |||
601 | static void | ||
602 | test_available(void) | ||
603 | { | ||
604 | char **name = check; | ||
605 | |||
606 | while (*name) { | ||
607 | printk("alg %s ", *name); | ||
608 | printk((crypto_alg_available(*name, 0)) ? | ||
609 | "found\n" : "not found\n"); | ||
610 | name++; | ||
611 | } | ||
612 | } | ||
613 | |||
614 | static void | ||
615 | do_test(void) | ||
616 | { | ||
617 | switch (mode) { | ||
618 | |||
619 | case 0: | ||
620 | test_hash("md5", md5_tv_template, MD5_TEST_VECTORS); | ||
621 | |||
622 | test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS); | ||
623 | |||
624 | //DES | ||
625 | test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS); | ||
626 | test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS); | ||
627 | test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS); | ||
628 | test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS); | ||
629 | |||
630 | //DES3_EDE | ||
631 | test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS); | ||
632 | test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS); | ||
633 | |||
634 | test_hash("md4", md4_tv_template, MD4_TEST_VECTORS); | ||
635 | |||
636 | test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS); | ||
637 | |||
638 | //BLOWFISH | ||
639 | test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS); | ||
640 | test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS); | ||
641 | test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS); | ||
642 | test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS); | ||
643 | |||
644 | //TWOFISH | ||
645 | test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS); | ||
646 | test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS); | ||
647 | test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS); | ||
648 | test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS); | ||
649 | |||
650 | //SERPENT | ||
651 | test_cipher ("serpent", MODE_ECB, ENCRYPT, serpent_enc_tv_template, SERPENT_ENC_TEST_VECTORS); | ||
652 | test_cipher ("serpent", MODE_ECB, DECRYPT, serpent_dec_tv_template, SERPENT_DEC_TEST_VECTORS); | ||
653 | |||
654 | //TNEPRES | ||
655 | test_cipher ("tnepres", MODE_ECB, ENCRYPT, tnepres_enc_tv_template, TNEPRES_ENC_TEST_VECTORS); | ||
656 | test_cipher ("tnepres", MODE_ECB, DECRYPT, tnepres_dec_tv_template, TNEPRES_DEC_TEST_VECTORS); | ||
657 | |||
658 | //AES | ||
659 | test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS); | ||
660 | test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS); | ||
661 | |||
662 | //CAST5 | ||
663 | test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS); | ||
664 | test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS); | ||
665 | |||
666 | //CAST6 | ||
667 | test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS); | ||
668 | test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS); | ||
669 | |||
670 | //ARC4 | ||
671 | test_cipher ("arc4", MODE_ECB, ENCRYPT, arc4_enc_tv_template, ARC4_ENC_TEST_VECTORS); | ||
672 | test_cipher ("arc4", MODE_ECB, DECRYPT, arc4_dec_tv_template, ARC4_DEC_TEST_VECTORS); | ||
673 | |||
674 | //TEA | ||
675 | test_cipher ("tea", MODE_ECB, ENCRYPT, tea_enc_tv_template, TEA_ENC_TEST_VECTORS); | ||
676 | test_cipher ("tea", MODE_ECB, DECRYPT, tea_dec_tv_template, TEA_DEC_TEST_VECTORS); | ||
677 | |||
678 | |||
679 | //XTEA | ||
680 | test_cipher ("xtea", MODE_ECB, ENCRYPT, xtea_enc_tv_template, XTEA_ENC_TEST_VECTORS); | ||
681 | test_cipher ("xtea", MODE_ECB, DECRYPT, xtea_dec_tv_template, XTEA_DEC_TEST_VECTORS); | ||
682 | |||
683 | //KHAZAD | ||
684 | test_cipher ("khazad", MODE_ECB, ENCRYPT, khazad_enc_tv_template, KHAZAD_ENC_TEST_VECTORS); | ||
685 | test_cipher ("khazad", MODE_ECB, DECRYPT, khazad_dec_tv_template, KHAZAD_DEC_TEST_VECTORS); | ||
686 | |||
687 | //ANUBIS | ||
688 | test_cipher ("anubis", MODE_ECB, ENCRYPT, anubis_enc_tv_template, ANUBIS_ENC_TEST_VECTORS); | ||
689 | test_cipher ("anubis", MODE_ECB, DECRYPT, anubis_dec_tv_template, ANUBIS_DEC_TEST_VECTORS); | ||
690 | test_cipher ("anubis", MODE_CBC, ENCRYPT, anubis_cbc_enc_tv_template, ANUBIS_CBC_ENC_TEST_VECTORS); | ||
691 | test_cipher ("anubis", MODE_CBC, DECRYPT, anubis_cbc_dec_tv_template, ANUBIS_CBC_ENC_TEST_VECTORS); | ||
692 | |||
693 | test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS); | ||
694 | test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS); | ||
695 | test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS); | ||
696 | test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS); | ||
697 | test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS); | ||
698 | test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS); | ||
699 | test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS); | ||
700 | test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS); | ||
701 | test_deflate(); | ||
702 | test_crc32c(); | ||
703 | #ifdef CONFIG_CRYPTO_HMAC | ||
704 | test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS); | ||
705 | test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS); | ||
706 | test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS); | ||
707 | #endif | ||
708 | |||
709 | test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS); | ||
710 | break; | ||
711 | |||
712 | case 1: | ||
713 | test_hash("md5", md5_tv_template, MD5_TEST_VECTORS); | ||
714 | break; | ||
715 | |||
716 | case 2: | ||
717 | test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS); | ||
718 | break; | ||
719 | |||
720 | case 3: | ||
721 | test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS); | ||
722 | test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS); | ||
723 | test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS); | ||
724 | test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS); | ||
725 | break; | ||
726 | |||
727 | case 4: | ||
728 | test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS); | ||
729 | test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS); | ||
730 | break; | ||
731 | |||
732 | case 5: | ||
733 | test_hash("md4", md4_tv_template, MD4_TEST_VECTORS); | ||
734 | break; | ||
735 | |||
736 | case 6: | ||
737 | test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS); | ||
738 | break; | ||
739 | |||
740 | case 7: | ||
741 | test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS); | ||
742 | test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS); | ||
743 | test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS); | ||
744 | test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS); | ||
745 | break; | ||
746 | |||
747 | case 8: | ||
748 | test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS); | ||
749 | test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS); | ||
750 | test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS); | ||
751 | test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS); | ||
752 | break; | ||
753 | |||
754 | case 9: | ||
755 | test_cipher ("serpent", MODE_ECB, ENCRYPT, serpent_enc_tv_template, SERPENT_ENC_TEST_VECTORS); | ||
756 | test_cipher ("serpent", MODE_ECB, DECRYPT, serpent_dec_tv_template, SERPENT_DEC_TEST_VECTORS); | ||
757 | break; | ||
758 | |||
759 | case 10: | ||
760 | test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS); | ||
761 | test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS); | ||
762 | break; | ||
763 | |||
764 | case 11: | ||
765 | test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS); | ||
766 | break; | ||
767 | |||
768 | case 12: | ||
769 | test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS); | ||
770 | break; | ||
771 | |||
772 | case 13: | ||
773 | test_deflate(); | ||
774 | break; | ||
775 | |||
776 | case 14: | ||
777 | test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS); | ||
778 | test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS); | ||
779 | break; | ||
780 | |||
781 | case 15: | ||
782 | test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS); | ||
783 | test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS); | ||
784 | break; | ||
785 | |||
786 | case 16: | ||
787 | test_cipher ("arc4", MODE_ECB, ENCRYPT, arc4_enc_tv_template, ARC4_ENC_TEST_VECTORS); | ||
788 | test_cipher ("arc4", MODE_ECB, DECRYPT, arc4_dec_tv_template, ARC4_DEC_TEST_VECTORS); | ||
789 | break; | ||
790 | |||
791 | case 17: | ||
792 | test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS); | ||
793 | break; | ||
794 | |||
795 | case 18: | ||
796 | test_crc32c(); | ||
797 | break; | ||
798 | |||
799 | case 19: | ||
800 | test_cipher ("tea", MODE_ECB, ENCRYPT, tea_enc_tv_template, TEA_ENC_TEST_VECTORS); | ||
801 | test_cipher ("tea", MODE_ECB, DECRYPT, tea_dec_tv_template, TEA_DEC_TEST_VECTORS); | ||
802 | break; | ||
803 | |||
804 | case 20: | ||
805 | test_cipher ("xtea", MODE_ECB, ENCRYPT, xtea_enc_tv_template, XTEA_ENC_TEST_VECTORS); | ||
806 | test_cipher ("xtea", MODE_ECB, DECRYPT, xtea_dec_tv_template, XTEA_DEC_TEST_VECTORS); | ||
807 | break; | ||
808 | |||
809 | case 21: | ||
810 | test_cipher ("khazad", MODE_ECB, ENCRYPT, khazad_enc_tv_template, KHAZAD_ENC_TEST_VECTORS); | ||
811 | test_cipher ("khazad", MODE_ECB, DECRYPT, khazad_dec_tv_template, KHAZAD_DEC_TEST_VECTORS); | ||
812 | break; | ||
813 | |||
814 | case 22: | ||
815 | test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS); | ||
816 | break; | ||
817 | |||
818 | case 23: | ||
819 | test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS); | ||
820 | break; | ||
821 | |||
822 | case 24: | ||
823 | test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS); | ||
824 | break; | ||
825 | |||
826 | case 25: | ||
827 | test_cipher ("tnepres", MODE_ECB, ENCRYPT, tnepres_enc_tv_template, TNEPRES_ENC_TEST_VECTORS); | ||
828 | test_cipher ("tnepres", MODE_ECB, DECRYPT, tnepres_dec_tv_template, TNEPRES_DEC_TEST_VECTORS); | ||
829 | break; | ||
830 | |||
831 | case 26: | ||
832 | test_cipher ("anubis", MODE_ECB, ENCRYPT, anubis_enc_tv_template, ANUBIS_ENC_TEST_VECTORS); | ||
833 | test_cipher ("anubis", MODE_ECB, DECRYPT, anubis_dec_tv_template, ANUBIS_DEC_TEST_VECTORS); | ||
834 | test_cipher ("anubis", MODE_CBC, ENCRYPT, anubis_cbc_enc_tv_template, ANUBIS_CBC_ENC_TEST_VECTORS); | ||
835 | test_cipher ("anubis", MODE_CBC, DECRYPT, anubis_cbc_dec_tv_template, ANUBIS_CBC_ENC_TEST_VECTORS); | ||
836 | break; | ||
837 | |||
838 | case 27: | ||
839 | test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS); | ||
840 | break; | ||
841 | |||
842 | case 28: | ||
843 | |||
844 | test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS); | ||
845 | break; | ||
846 | |||
847 | case 29: | ||
848 | test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS); | ||
849 | break; | ||
850 | |||
851 | #ifdef CONFIG_CRYPTO_HMAC | ||
852 | case 100: | ||
853 | test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS); | ||
854 | break; | ||
855 | |||
856 | case 101: | ||
857 | test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS); | ||
858 | break; | ||
859 | |||
860 | case 102: | ||
861 | test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS); | ||
862 | break; | ||
863 | |||
864 | #endif | ||
865 | |||
866 | case 1000: | ||
867 | test_available(); | ||
868 | break; | ||
869 | |||
870 | default: | ||
871 | /* useful for debugging */ | ||
872 | printk("not testing anything\n"); | ||
873 | break; | ||
874 | } | ||
875 | } | ||
876 | |||
877 | static int __init | ||
878 | init(void) | ||
879 | { | ||
880 | tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL); | ||
881 | if (tvmem == NULL) | ||
882 | return -ENOMEM; | ||
883 | |||
884 | xbuf = kmalloc(XBUFSIZE, GFP_KERNEL); | ||
885 | if (xbuf == NULL) { | ||
886 | kfree(tvmem); | ||
887 | return -ENOMEM; | ||
888 | } | ||
889 | |||
890 | do_test(); | ||
891 | |||
892 | kfree(xbuf); | ||
893 | kfree(tvmem); | ||
894 | return 0; | ||
895 | } | ||
896 | |||
897 | /* | ||
898 | * If an init function is provided, an exit function must also be provided | ||
899 | * to allow module unload. | ||
900 | */ | ||
901 | static void __exit fini(void) { } | ||
902 | |||
903 | module_init(init); | ||
904 | module_exit(fini); | ||
905 | |||
906 | module_param(mode, int, 0); | ||
907 | |||
908 | MODULE_LICENSE("GPL"); | ||
909 | MODULE_DESCRIPTION("Quick & dirty crypto testing module"); | ||
910 | MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>"); | ||