More meth updates.
[linux-2.6/linux-mips.git] / crypto / tcrypt.c
blobe3011b2f56f353e45db6f9ea8e017bd5a8c58aea
1 /*
2 * Quick & dirty crypto testing module.
4 * This will only exist until we have a better testing mechanism
5 * (e.g. a char device).
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.
16 #include <linux/init.h>
17 #include <linux/module.h>
18 #include <linux/string.h>
19 #include <linux/mm.h>
20 #include <linux/slab.h>
21 #include <asm/scatterlist.h>
22 #include <linux/string.h>
23 #include <linux/crypto.h>
24 #include <linux/highmem.h>
25 #include "tcrypt.h"
28 * Need to kmalloc() memory for testing kmap().
30 #define TVMEMSIZE 4096
31 #define XBUFSIZE 32768
34 * Indexes into the xbuf to simulate cross-page access.
36 #define IDX1 37
37 #define IDX2 32400
38 #define IDX3 1
39 #define IDX4 8193
40 #define IDX5 22222
41 #define IDX6 17101
42 #define IDX7 27333
43 #define IDX8 3000
45 static int mode = 0;
46 static char *xbuf;
47 static char *tvmem;
49 static char *check[] = {
50 "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
51 "twofish", "serpent", "sha384", "sha512", "md4", "aes", "deflate",
52 NULL
55 static void
56 hexdump(unsigned char *buf, unsigned int len)
58 while (len--)
59 printk("%02x", *buf++);
61 printk("\n");
64 static void
65 test_md5(void)
67 char *p;
68 unsigned int i;
69 struct scatterlist sg[2];
70 char result[128];
71 struct crypto_tfm *tfm;
72 struct md5_testvec *md5_tv;
73 unsigned int tsize;
75 printk("\ntesting md5\n");
77 tsize = sizeof (md5_tv_template);
78 if (tsize > TVMEMSIZE) {
79 printk("template (%u) too big for tvmem (%u)\n", tsize,
80 TVMEMSIZE);
81 return;
84 memcpy(tvmem, md5_tv_template, tsize);
85 md5_tv = (void *) tvmem;
87 tfm = crypto_alloc_tfm("md5", 0);
88 if (tfm == NULL) {
89 printk("failed to load transform for md5\n");
90 return;
93 for (i = 0; i < MD5_TEST_VECTORS; i++) {
94 printk("test %u:\n", i + 1);
95 memset(result, 0, sizeof (result));
97 p = md5_tv[i].plaintext;
98 sg[0].page = virt_to_page(p);
99 sg[0].offset = ((long) p & ~PAGE_MASK);
100 sg[0].length = strlen(md5_tv[i].plaintext);
102 crypto_digest_init(tfm);
103 crypto_digest_update(tfm, sg, 1);
104 crypto_digest_final(tfm, result);
106 hexdump(result, crypto_tfm_alg_digestsize(tfm));
107 printk("%s\n",
108 memcmp(result, md5_tv[i].digest,
109 crypto_tfm_alg_digestsize(tfm)) ? "fail" :
110 "pass");
113 printk("\ntesting md5 across pages\n");
115 /* setup the dummy buffer first */
116 memset(xbuf, 0, XBUFSIZE);
117 memcpy(&xbuf[IDX1], "abcdefghijklm", 13);
118 memcpy(&xbuf[IDX2], "nopqrstuvwxyz", 13);
120 p = &xbuf[IDX1];
121 sg[0].page = virt_to_page(p);
122 sg[0].offset = ((long) p & ~PAGE_MASK);
123 sg[0].length = 13;
125 p = &xbuf[IDX2];
126 sg[1].page = virt_to_page(p);
127 sg[1].offset = ((long) p & ~PAGE_MASK);
128 sg[1].length = 13;
130 memset(result, 0, sizeof (result));
131 crypto_digest_digest(tfm, sg, 2, result);
132 hexdump(result, crypto_tfm_alg_digestsize(tfm));
134 printk("%s\n",
135 memcmp(result, md5_tv[4].digest,
136 crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
137 crypto_free_tfm(tfm);
140 #ifdef CONFIG_CRYPTO_HMAC
141 static void
142 test_hmac_md5(void)
144 char *p;
145 unsigned int i, klen;
146 struct scatterlist sg[2];
147 char result[128];
148 struct crypto_tfm *tfm;
149 struct hmac_md5_testvec *hmac_md5_tv;
150 unsigned int tsize;
152 tfm = crypto_alloc_tfm("md5", 0);
153 if (tfm == NULL) {
154 printk("failed to load transform for md5\n");
155 return;
158 printk("\ntesting hmac_md5\n");
160 tsize = sizeof (hmac_md5_tv_template);
161 if (tsize > TVMEMSIZE) {
162 printk("template (%u) too big for tvmem (%u)\n", tsize,
163 TVMEMSIZE);
164 goto out;
167 memcpy(tvmem, hmac_md5_tv_template, tsize);
168 hmac_md5_tv = (void *) tvmem;
170 for (i = 0; i < HMAC_MD5_TEST_VECTORS; i++) {
171 printk("test %u:\n", i + 1);
172 memset(result, 0, sizeof (result));
174 p = hmac_md5_tv[i].plaintext;
175 sg[0].page = virt_to_page(p);
176 sg[0].offset = ((long) p & ~PAGE_MASK);
177 sg[0].length = strlen(hmac_md5_tv[i].plaintext);
179 klen = strlen(hmac_md5_tv[i].key);
180 crypto_hmac(tfm, hmac_md5_tv[i].key, &klen, sg, 1, result);
182 hexdump(result, crypto_tfm_alg_digestsize(tfm));
183 printk("%s\n",
184 memcmp(result, hmac_md5_tv[i].digest,
185 crypto_tfm_alg_digestsize(tfm)) ? "fail" :
186 "pass");
189 printk("\ntesting hmac_md5 across pages\n");
191 memset(xbuf, 0, XBUFSIZE);
193 memcpy(&xbuf[IDX1], "what do ya want ", 16);
194 memcpy(&xbuf[IDX2], "for nothing?", 12);
196 p = &xbuf[IDX1];
197 sg[0].page = virt_to_page(p);
198 sg[0].offset = ((long) p & ~PAGE_MASK);
199 sg[0].length = 16;
201 p = &xbuf[IDX2];
202 sg[1].page = virt_to_page(p);
203 sg[1].offset = ((long) p & ~PAGE_MASK);
204 sg[1].length = 12;
206 memset(result, 0, sizeof (result));
207 klen = strlen(hmac_md5_tv[7].key);
208 crypto_hmac(tfm, hmac_md5_tv[7].key, &klen, sg, 2, result);
209 hexdump(result, crypto_tfm_alg_digestsize(tfm));
211 printk("%s\n",
212 memcmp(result, hmac_md5_tv[7].digest,
213 crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
214 out:
215 crypto_free_tfm(tfm);
218 static void
219 test_hmac_sha1(void)
221 char *p;
222 unsigned int i, klen;
223 struct crypto_tfm *tfm;
224 struct hmac_sha1_testvec *hmac_sha1_tv;
225 struct scatterlist sg[2];
226 unsigned int tsize;
227 char result[SHA1_DIGEST_SIZE];
229 tfm = crypto_alloc_tfm("sha1", 0);
230 if (tfm == NULL) {
231 printk("failed to load transform for sha1\n");
232 return;
235 printk("\ntesting hmac_sha1\n");
237 tsize = sizeof (hmac_sha1_tv_template);
238 if (tsize > TVMEMSIZE) {
239 printk("template (%u) too big for tvmem (%u)\n", tsize,
240 TVMEMSIZE);
241 goto out;
244 memcpy(tvmem, hmac_sha1_tv_template, tsize);
245 hmac_sha1_tv = (void *) tvmem;
247 for (i = 0; i < HMAC_SHA1_TEST_VECTORS; i++) {
248 printk("test %u:\n", i + 1);
249 memset(result, 0, sizeof (result));
251 p = hmac_sha1_tv[i].plaintext;
252 sg[0].page = virt_to_page(p);
253 sg[0].offset = ((long) p & ~PAGE_MASK);
254 sg[0].length = strlen(hmac_sha1_tv[i].plaintext);
256 klen = strlen(hmac_sha1_tv[i].key);
258 crypto_hmac(tfm, hmac_sha1_tv[i].key, &klen, sg, 1, result);
260 hexdump(result, sizeof (result));
261 printk("%s\n",
262 memcmp(result, hmac_sha1_tv[i].digest,
263 crypto_tfm_alg_digestsize(tfm)) ? "fail" :
264 "pass");
267 printk("\ntesting hmac_sha1 across pages\n");
269 /* setup the dummy buffer first */
270 memset(xbuf, 0, XBUFSIZE);
272 memcpy(&xbuf[IDX1], "what do ya want ", 16);
273 memcpy(&xbuf[IDX2], "for nothing?", 12);
275 p = &xbuf[IDX1];
276 sg[0].page = virt_to_page(p);
277 sg[0].offset = ((long) p & ~PAGE_MASK);
278 sg[0].length = 16;
280 p = &xbuf[IDX2];
281 sg[1].page = virt_to_page(p);
282 sg[1].offset = ((long) p & ~PAGE_MASK);
283 sg[1].length = 12;
285 memset(result, 0, sizeof (result));
286 klen = strlen(hmac_sha1_tv[7].key);
287 crypto_hmac(tfm, hmac_sha1_tv[7].key, &klen, sg, 2, result);
288 hexdump(result, crypto_tfm_alg_digestsize(tfm));
290 printk("%s\n",
291 memcmp(result, hmac_sha1_tv[7].digest,
292 crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
293 out:
294 crypto_free_tfm(tfm);
297 static void
298 test_hmac_sha256(void)
300 char *p;
301 unsigned int i, klen;
302 struct crypto_tfm *tfm;
303 struct hmac_sha256_testvec *hmac_sha256_tv;
304 struct scatterlist sg[2];
305 unsigned int tsize;
306 char result[SHA256_DIGEST_SIZE];
308 tfm = crypto_alloc_tfm("sha256", 0);
309 if (tfm == NULL) {
310 printk("failed to load transform for sha256\n");
311 return;
314 printk("\ntesting hmac_sha256\n");
316 tsize = sizeof (hmac_sha256_tv_template);
317 if (tsize > TVMEMSIZE) {
318 printk("template (%u) too big for tvmem (%u)\n", tsize,
319 TVMEMSIZE);
320 goto out;
323 memcpy(tvmem, hmac_sha256_tv_template, tsize);
324 hmac_sha256_tv = (void *) tvmem;
326 for (i = 0; i < HMAC_SHA256_TEST_VECTORS; i++) {
327 printk("test %u:\n", i + 1);
328 memset(result, 0, sizeof (result));
330 p = hmac_sha256_tv[i].plaintext;
331 sg[0].page = virt_to_page(p);
332 sg[0].offset = ((long) p & ~PAGE_MASK);
333 sg[0].length = strlen(hmac_sha256_tv[i].plaintext);
335 klen = strlen(hmac_sha256_tv[i].key);
337 hexdump(hmac_sha256_tv[i].key, strlen(hmac_sha256_tv[i].key));
338 crypto_hmac(tfm, hmac_sha256_tv[i].key, &klen, sg, 1, result);
339 hexdump(result, crypto_tfm_alg_digestsize(tfm));
340 printk("%s\n",
341 memcmp(result, hmac_sha256_tv[i].digest,
342 crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
345 out:
346 crypto_free_tfm(tfm);
349 #endif /* CONFIG_CRYPTO_HMAC */
351 static void
352 test_md4(void)
354 char *p;
355 unsigned int i;
356 struct scatterlist sg[1];
357 char result[128];
358 struct crypto_tfm *tfm;
359 struct md4_testvec *md4_tv;
360 unsigned int tsize;
362 printk("\ntesting md4\n");
364 tsize = sizeof (md4_tv_template);
365 if (tsize > TVMEMSIZE) {
366 printk("template (%u) too big for tvmem (%u)\n", tsize,
367 TVMEMSIZE);
368 return;
371 memcpy(tvmem, md4_tv_template, tsize);
372 md4_tv = (void *) tvmem;
374 tfm = crypto_alloc_tfm("md4", 0);
375 if (tfm == NULL) {
376 printk("failed to load transform for md4\n");
377 return;
380 for (i = 0; i < MD4_TEST_VECTORS; i++) {
381 printk("test %u:\n", i + 1);
382 memset(result, 0, sizeof (result));
384 p = md4_tv[i].plaintext;
385 sg[0].page = virt_to_page(p);
386 sg[0].offset = ((long) p & ~PAGE_MASK);
387 sg[0].length = strlen(md4_tv[i].plaintext);
389 crypto_digest_digest(tfm, sg, 1, result);
391 hexdump(result, crypto_tfm_alg_digestsize(tfm));
392 printk("%s\n",
393 memcmp(result, md4_tv[i].digest,
394 crypto_tfm_alg_digestsize(tfm)) ? "fail" :
395 "pass");
398 crypto_free_tfm(tfm);
401 static void
402 test_sha1(void)
404 char *p;
405 unsigned int i;
406 struct crypto_tfm *tfm;
407 struct sha1_testvec *sha1_tv;
408 struct scatterlist sg[2];
409 unsigned int tsize;
410 char result[SHA1_DIGEST_SIZE];
412 printk("\ntesting sha1\n");
414 tsize = sizeof (sha1_tv_template);
415 if (tsize > TVMEMSIZE) {
416 printk("template (%u) too big for tvmem (%u)\n", tsize,
417 TVMEMSIZE);
418 return;
421 memcpy(tvmem, sha1_tv_template, tsize);
422 sha1_tv = (void *) tvmem;
424 tfm = crypto_alloc_tfm("sha1", 0);
425 if (tfm == NULL) {
426 printk("failed to load transform for sha1\n");
427 return;
430 for (i = 0; i < SHA1_TEST_VECTORS; i++) {
431 printk("test %u:\n", i + 1);
432 memset(result, 0, sizeof (result));
434 p = sha1_tv[i].plaintext;
435 sg[0].page = virt_to_page(p);
436 sg[0].offset = ((long) p & ~PAGE_MASK);
437 sg[0].length = strlen(sha1_tv[i].plaintext);
439 crypto_digest_init(tfm);
440 crypto_digest_update(tfm, sg, 1);
441 crypto_digest_final(tfm, result);
443 hexdump(result, crypto_tfm_alg_digestsize(tfm));
444 printk("%s\n",
445 memcmp(result, sha1_tv[i].digest,
446 crypto_tfm_alg_digestsize(tfm)) ? "fail" :
447 "pass");
450 printk("\ntesting sha1 across pages\n");
452 /* setup the dummy buffer first */
453 memset(xbuf, 0, XBUFSIZE);
454 memcpy(&xbuf[IDX1], "abcdbcdecdefdefgefghfghighij", 28);
455 memcpy(&xbuf[IDX2], "hijkijkljklmklmnlmnomnopnopq", 28);
457 p = &xbuf[IDX1];
458 sg[0].page = virt_to_page(p);
459 sg[0].offset = ((long) p & ~PAGE_MASK);
460 sg[0].length = 28;
462 p = &xbuf[IDX2];
463 sg[1].page = virt_to_page(p);
464 sg[1].offset = ((long) p & ~PAGE_MASK);
465 sg[1].length = 28;
467 memset(result, 0, sizeof (result));
468 crypto_digest_digest(tfm, sg, 2, result);
469 hexdump(result, crypto_tfm_alg_digestsize(tfm));
470 printk("%s\n",
471 memcmp(result, sha1_tv[1].digest,
472 crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
473 crypto_free_tfm(tfm);
476 static void
477 test_sha256(void)
479 char *p;
480 unsigned int i;
481 struct crypto_tfm *tfm;
482 struct sha256_testvec *sha256_tv;
483 struct scatterlist sg[2];
484 unsigned int tsize;
485 char result[SHA256_DIGEST_SIZE];
487 printk("\ntesting sha256\n");
489 tsize = sizeof (sha256_tv_template);
490 if (tsize > TVMEMSIZE) {
491 printk("template (%u) too big for tvmem (%u)\n", tsize,
492 TVMEMSIZE);
493 return;
496 memcpy(tvmem, sha256_tv_template, tsize);
497 sha256_tv = (void *) tvmem;
499 tfm = crypto_alloc_tfm("sha256", 0);
500 if (tfm == NULL) {
501 printk("failed to load transform for sha256\n");
502 return;
505 for (i = 0; i < SHA256_TEST_VECTORS; i++) {
506 printk("test %u:\n", i + 1);
507 memset(result, 0, sizeof (result));
509 p = sha256_tv[i].plaintext;
510 sg[0].page = virt_to_page(p);
511 sg[0].offset = ((long) p & ~PAGE_MASK);
512 sg[0].length = strlen(sha256_tv[i].plaintext);
514 crypto_digest_init(tfm);
515 crypto_digest_update(tfm, sg, 1);
516 crypto_digest_final(tfm, result);
518 hexdump(result, crypto_tfm_alg_digestsize(tfm));
519 printk("%s\n",
520 memcmp(result, sha256_tv[i].digest,
521 crypto_tfm_alg_digestsize(tfm)) ? "fail" :
522 "pass");
525 printk("\ntesting sha256 across pages\n");
527 /* setup the dummy buffer first */
528 memset(xbuf, 0, XBUFSIZE);
529 memcpy(&xbuf[IDX1], "abcdbcdecdefdefgefghfghighij", 28);
530 memcpy(&xbuf[IDX2], "hijkijkljklmklmnlmnomnopnopq", 28);
532 p = &xbuf[IDX1];
533 sg[0].page = virt_to_page(p);
534 sg[0].offset = ((long) p & ~PAGE_MASK);
535 sg[0].length = 28;
537 p = &xbuf[IDX2];
538 sg[1].page = virt_to_page(p);
539 sg[1].offset = ((long) p & ~PAGE_MASK);
540 sg[1].length = 28;
542 memset(result, 0, sizeof (result));
543 crypto_digest_digest(tfm, sg, 2, result);
544 hexdump(result, crypto_tfm_alg_digestsize(tfm));
545 printk("%s\n",
546 memcmp(result, sha256_tv[1].digest,
547 crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
549 crypto_free_tfm(tfm);
552 static void
553 test_sha384(void)
555 char *p;
556 unsigned int i;
557 struct crypto_tfm *tfm;
558 struct sha384_testvec *sha384_tv;
559 struct scatterlist sg[2];
560 unsigned int tsize;
561 char result[SHA384_DIGEST_SIZE];
563 printk("\ntesting sha384\n");
565 tsize = sizeof (sha384_tv_template);
566 if (tsize > TVMEMSIZE) {
567 printk("template (%u) too big for tvmem (%u)\n", tsize,
568 TVMEMSIZE);
569 return;
572 memcpy(tvmem, sha384_tv_template, tsize);
573 sha384_tv = (void *) tvmem;
575 tfm = crypto_alloc_tfm("sha384", 0);
576 if (tfm == NULL) {
577 printk("failed to load transform for sha384\n");
578 return;
581 for (i = 0; i < SHA384_TEST_VECTORS; i++) {
582 printk("test %u:\n", i + 1);
583 memset(result, 0, sizeof (result));
585 p = sha384_tv[i].plaintext;
586 sg[0].page = virt_to_page(p);
587 sg[0].offset = ((long) p & ~PAGE_MASK);
588 sg[0].length = strlen(sha384_tv[i].plaintext);
590 crypto_digest_init(tfm);
591 crypto_digest_update(tfm, sg, 1);
592 crypto_digest_final(tfm, result);
594 hexdump(result, crypto_tfm_alg_digestsize(tfm));
595 printk("%s\n",
596 memcmp(result, sha384_tv[i].digest,
597 crypto_tfm_alg_digestsize(tfm)) ? "fail" :
598 "pass");
601 crypto_free_tfm(tfm);
604 static void
605 test_sha512(void)
607 char *p;
608 unsigned int i;
609 struct crypto_tfm *tfm;
610 struct sha512_testvec *sha512_tv;
611 struct scatterlist sg[2];
612 unsigned int tsize;
613 char result[SHA512_DIGEST_SIZE];
615 printk("\ntesting sha512\n");
617 tsize = sizeof (sha512_tv_template);
618 if (tsize > TVMEMSIZE) {
619 printk("template (%u) too big for tvmem (%u)\n", tsize,
620 TVMEMSIZE);
621 return;
624 memcpy(tvmem, sha512_tv_template, tsize);
625 sha512_tv = (void *) tvmem;
627 tfm = crypto_alloc_tfm("sha512", 0);
628 if (tfm == NULL) {
629 printk("failed to load transform for sha512\n");
630 return;
633 for (i = 0; i < SHA512_TEST_VECTORS; i++) {
634 printk("test %u:\n", i + 1);
635 memset(result, 0, sizeof (result));
637 p = sha512_tv[i].plaintext;
638 sg[0].page = virt_to_page(p);
639 sg[0].offset = ((long) p & ~PAGE_MASK);
640 sg[0].length = strlen(sha512_tv[i].plaintext);
642 crypto_digest_init(tfm);
643 crypto_digest_update(tfm, sg, 1);
644 crypto_digest_final(tfm, result);
646 hexdump(result, crypto_tfm_alg_digestsize(tfm));
647 printk("%s\n",
648 memcmp(result, sha512_tv[i].digest,
649 crypto_tfm_alg_digestsize(tfm)) ? "fail" :
650 "pass");
653 crypto_free_tfm(tfm);
656 void
657 test_des(void)
659 unsigned int ret, i, len;
660 unsigned int tsize;
661 char *p, *q;
662 struct crypto_tfm *tfm;
663 char *key;
664 char res[8];
665 struct des_tv *des_tv;
666 struct scatterlist sg[8];
668 printk("\ntesting des encryption\n");
670 tsize = sizeof (des_enc_tv_template);
671 if (tsize > TVMEMSIZE) {
672 printk("template (%u) too big for tvmem (%u)\n", tsize,
673 TVMEMSIZE);
674 return;
677 memcpy(tvmem, des_enc_tv_template, tsize);
678 des_tv = (void *) tvmem;
680 tfm = crypto_alloc_tfm("des", 0);
681 if (tfm == NULL) {
682 printk("failed to load transform for des (default ecb)\n");
683 return;
686 for (i = 0; i < DES_ENC_TEST_VECTORS; i++) {
687 printk("test %u:\n", i + 1);
689 key = des_tv[i].key;
690 tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
692 ret = crypto_cipher_setkey(tfm, key, 8);
693 if (ret) {
694 printk("setkey() failed flags=%x\n", tfm->crt_flags);
696 if (!des_tv[i].fail)
697 goto out;
700 len = des_tv[i].len;
702 p = des_tv[i].plaintext;
703 sg[0].page = virt_to_page(p);
704 sg[0].offset = ((long) p & ~PAGE_MASK);
705 sg[0].length = len;
706 ret = crypto_cipher_encrypt(tfm, sg, sg, len);
707 if (ret) {
708 printk("encrypt() failed flags=%x\n", tfm->crt_flags);
709 goto out;
712 q = kmap(sg[0].page) + sg[0].offset;
713 hexdump(q, len);
715 printk("%s\n",
716 memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
720 printk("\ntesting des ecb encryption across pages\n");
722 i = 5;
723 key = des_tv[i].key;
724 tfm->crt_flags = 0;
726 hexdump(key, 8);
728 ret = crypto_cipher_setkey(tfm, key, 8);
729 if (ret) {
730 printk("setkey() failed flags=%x\n", tfm->crt_flags);
731 goto out;
734 /* setup the dummy buffer first */
735 memset(xbuf, 0, sizeof (xbuf));
736 memcpy(&xbuf[IDX1], des_tv[i].plaintext, 8);
737 memcpy(&xbuf[IDX2], des_tv[i].plaintext + 8, 8);
739 p = &xbuf[IDX1];
740 sg[0].page = virt_to_page(p);
741 sg[0].offset = ((long) p & ~PAGE_MASK);
742 sg[0].length = 8;
744 p = &xbuf[IDX2];
745 sg[1].page = virt_to_page(p);
746 sg[1].offset = ((long) p & ~PAGE_MASK);
747 sg[1].length = 8;
749 ret = crypto_cipher_encrypt(tfm, sg, sg, 16);
750 if (ret) {
751 printk("encrypt() failed flags=%x\n", tfm->crt_flags);
752 goto out;
755 printk("page 1\n");
756 q = kmap(sg[0].page) + sg[0].offset;
757 hexdump(q, 8);
758 printk("%s\n", memcmp(q, des_tv[i].result, 8) ? "fail" : "pass");
760 printk("page 2\n");
761 q = kmap(sg[1].page) + sg[1].offset;
762 hexdump(q, 8);
763 printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
765 printk("\ntesting des ecb encryption chunking scenario A\n");
768 * Scenario A:
770 * F1 F2 F3
771 * [8 + 6] [2 + 8] [8]
772 * ^^^^^^ ^
773 * a b c
775 * Chunking should begin at a, then end with b, and
776 * continue encrypting at an offset of 2 until c.
779 i = 7;
781 key = des_tv[i].key;
782 tfm->crt_flags = 0;
784 ret = crypto_cipher_setkey(tfm, key, 8);
785 if (ret) {
786 printk("setkey() failed flags=%x\n", tfm->crt_flags);
787 goto out;
790 /* setup the dummy buffer first */
791 memset(xbuf, 0, sizeof (xbuf));
793 /* Frag 1: 8 + 6 */
794 memcpy(&xbuf[IDX3], des_tv[i].plaintext, 14);
796 /* Frag 2: 2 + 8 */
797 memcpy(&xbuf[IDX4], des_tv[i].plaintext + 14, 10);
799 /* Frag 3: 8 */
800 memcpy(&xbuf[IDX5], des_tv[i].plaintext + 24, 8);
802 p = &xbuf[IDX3];
803 sg[0].page = virt_to_page(p);
804 sg[0].offset = ((long) p & ~PAGE_MASK);
805 sg[0].length = 14;
807 p = &xbuf[IDX4];
808 sg[1].page = virt_to_page(p);
809 sg[1].offset = ((long) p & ~PAGE_MASK);
810 sg[1].length = 10;
812 p = &xbuf[IDX5];
813 sg[2].page = virt_to_page(p);
814 sg[2].offset = ((long) p & ~PAGE_MASK);
815 sg[2].length = 8;
817 ret = crypto_cipher_encrypt(tfm, sg, sg, 32);
819 if (ret) {
820 printk("decrypt() failed flags=%x\n", tfm->crt_flags);
821 goto out;
824 printk("page 1\n");
825 q = kmap(sg[0].page) + sg[0].offset;
826 hexdump(q, 14);
827 printk("%s\n", memcmp(q, des_tv[i].result, 14) ? "fail" : "pass");
829 printk("page 2\n");
830 q = kmap(sg[1].page) + sg[1].offset;
831 hexdump(q, 10);
832 printk("%s\n", memcmp(q, des_tv[i].result + 14, 10) ? "fail" : "pass");
834 printk("page 3\n");
835 q = kmap(sg[2].page) + sg[2].offset;
836 hexdump(q, 8);
837 printk("%s\n", memcmp(q, des_tv[i].result + 24, 8) ? "fail" : "pass");
839 printk("\ntesting des ecb encryption chunking scenario B\n");
842 * Scenario B:
844 * F1 F2 F3 F4
845 * [2] [1] [3] [2 + 8 + 8]
847 i = 7;
849 key = des_tv[i].key;
850 tfm->crt_flags = 0;
852 ret = crypto_cipher_setkey(tfm, key, 8);
853 if (ret) {
854 printk("setkey() failed flags=%x\n", tfm->crt_flags);
855 goto out;
858 /* setup the dummy buffer first */
859 memset(xbuf, 0, sizeof (xbuf));
861 /* Frag 1: 2 */
862 memcpy(&xbuf[IDX3], des_tv[i].plaintext, 2);
864 /* Frag 2: 1 */
865 memcpy(&xbuf[IDX4], des_tv[i].plaintext + 2, 1);
867 /* Frag 3: 3 */
868 memcpy(&xbuf[IDX5], des_tv[i].plaintext + 3, 3);
870 /* Frag 4: 2 + 8 + 8 */
871 memcpy(&xbuf[IDX6], des_tv[i].plaintext + 6, 18);
873 p = &xbuf[IDX3];
874 sg[0].page = virt_to_page(p);
875 sg[0].offset = ((long) p & ~PAGE_MASK);
876 sg[0].length = 2;
878 p = &xbuf[IDX4];
879 sg[1].page = virt_to_page(p);
880 sg[1].offset = ((long) p & ~PAGE_MASK);
881 sg[1].length = 1;
883 p = &xbuf[IDX5];
884 sg[2].page = virt_to_page(p);
885 sg[2].offset = ((long) p & ~PAGE_MASK);
886 sg[2].length = 3;
888 p = &xbuf[IDX6];
889 sg[3].page = virt_to_page(p);
890 sg[3].offset = ((long) p & ~PAGE_MASK);
891 sg[3].length = 18;
893 ret = crypto_cipher_encrypt(tfm, sg, sg, 24);
895 if (ret) {
896 printk("encrypt() failed flags=%x\n", tfm->crt_flags);
897 goto out;
900 printk("page 1\n");
901 q = kmap(sg[0].page) + sg[0].offset;
902 hexdump(q, 2);
903 printk("%s\n", memcmp(q, des_tv[i].result, 2) ? "fail" : "pass");
905 printk("page 2\n");
906 q = kmap(sg[1].page) + sg[1].offset;
907 hexdump(q, 1);
908 printk("%s\n", memcmp(q, des_tv[i].result + 2, 1) ? "fail" : "pass");
910 printk("page 3\n");
911 q = kmap(sg[2].page) + sg[2].offset;
912 hexdump(q, 3);
913 printk("%s\n", memcmp(q, des_tv[i].result + 3, 3) ? "fail" : "pass");
915 printk("page 4\n");
916 q = kmap(sg[3].page) + sg[3].offset;
917 hexdump(q, 18);
918 printk("%s\n", memcmp(q, des_tv[i].result + 6, 18) ? "fail" : "pass");
920 printk("\ntesting des ecb encryption chunking scenario C\n");
923 * Scenario B:
925 * F1 F2 F3 F4 F5
926 * [2] [2] [2] [2] [8]
928 i = 7;
930 key = des_tv[i].key;
931 tfm->crt_flags = 0;
933 ret = crypto_cipher_setkey(tfm, key, 8);
934 if (ret) {
935 printk("setkey() failed flags=%x\n", tfm->crt_flags);
936 goto out;
939 /* setup the dummy buffer first */
940 memset(xbuf, 0, sizeof (xbuf));
942 /* Frag 1: 2 */
943 memcpy(&xbuf[IDX3], des_tv[i].plaintext, 2);
945 /* Frag 2: 2 */
946 memcpy(&xbuf[IDX4], des_tv[i].plaintext + 2, 2);
948 /* Frag 3: 2 */
949 memcpy(&xbuf[IDX5], des_tv[i].plaintext + 4, 2);
951 /* Frag 4: 2 */
952 memcpy(&xbuf[IDX6], des_tv[i].plaintext + 6, 2);
954 /* Frag 5: 8 */
955 memcpy(&xbuf[IDX7], des_tv[i].plaintext + 8, 8);
957 p = &xbuf[IDX3];
958 sg[0].page = virt_to_page(p);
959 sg[0].offset = ((long) p & ~PAGE_MASK);
960 sg[0].length = 2;
962 p = &xbuf[IDX4];
963 sg[1].page = virt_to_page(p);
964 sg[1].offset = ((long) p & ~PAGE_MASK);
965 sg[1].length = 2;
967 p = &xbuf[IDX5];
968 sg[2].page = virt_to_page(p);
969 sg[2].offset = ((long) p & ~PAGE_MASK);
970 sg[2].length = 2;
972 p = &xbuf[IDX6];
973 sg[3].page = virt_to_page(p);
974 sg[3].offset = ((long) p & ~PAGE_MASK);
975 sg[3].length = 2;
977 p = &xbuf[IDX7];
978 sg[4].page = virt_to_page(p);
979 sg[4].offset = ((long) p & ~PAGE_MASK);
980 sg[4].length = 8;
982 ret = crypto_cipher_encrypt(tfm, sg, sg, 16);
984 if (ret) {
985 printk("encrypt() failed flags=%x\n", tfm->crt_flags);
986 goto out;
989 printk("page 1\n");
990 q = kmap(sg[0].page) + sg[0].offset;
991 hexdump(q, 2);
992 printk("%s\n", memcmp(q, des_tv[i].result, 2) ? "fail" : "pass");
994 printk("page 2\n");
995 q = kmap(sg[1].page) + sg[1].offset;
996 hexdump(q, 2);
997 printk("%s\n", memcmp(q, des_tv[i].result + 2, 2) ? "fail" : "pass");
999 printk("page 3\n");
1000 q = kmap(sg[2].page) + sg[2].offset;
1001 hexdump(q, 2);
1002 printk("%s\n", memcmp(q, des_tv[i].result + 4, 2) ? "fail" : "pass");
1004 printk("page 4\n");
1005 q = kmap(sg[3].page) + sg[3].offset;
1006 hexdump(q, 2);
1007 printk("%s\n", memcmp(q, des_tv[i].result + 6, 2) ? "fail" : "pass");
1009 printk("page 5\n");
1010 q = kmap(sg[4].page) + sg[4].offset;
1011 hexdump(q, 8);
1012 printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
1014 printk("\ntesting des ecb encryption chunking scenario D\n");
1017 * Scenario D, torture test, one byte per frag.
1019 i = 7;
1020 key = des_tv[i].key;
1021 tfm->crt_flags = 0;
1023 ret = crypto_cipher_setkey(tfm, key, 8);
1024 if (ret) {
1025 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1026 goto out;
1029 /* setup the dummy buffer first */
1030 memset(xbuf, 0, XBUFSIZE);
1032 xbuf[IDX1] = des_tv[i].plaintext[0];
1033 xbuf[IDX2] = des_tv[i].plaintext[1];
1034 xbuf[IDX3] = des_tv[i].plaintext[2];
1035 xbuf[IDX4] = des_tv[i].plaintext[3];
1036 xbuf[IDX5] = des_tv[i].plaintext[4];
1037 xbuf[IDX6] = des_tv[i].plaintext[5];
1038 xbuf[IDX7] = des_tv[i].plaintext[6];
1039 xbuf[IDX8] = des_tv[i].plaintext[7];
1041 p = &xbuf[IDX1];
1042 sg[0].page = virt_to_page(p);
1043 sg[0].offset = ((long) p & ~PAGE_MASK);
1044 sg[0].length = 1;
1046 p = &xbuf[IDX2];
1047 sg[1].page = virt_to_page(p);
1048 sg[1].offset = ((long) p & ~PAGE_MASK);
1049 sg[1].length = 1;
1051 p = &xbuf[IDX3];
1052 sg[2].page = virt_to_page(p);
1053 sg[2].offset = ((long) p & ~PAGE_MASK);
1054 sg[2].length = 1;
1056 p = &xbuf[IDX4];
1057 sg[3].page = virt_to_page(p);
1058 sg[3].offset = ((long) p & ~PAGE_MASK);
1059 sg[3].length = 1;
1061 p = &xbuf[IDX5];
1062 sg[4].page = virt_to_page(p);
1063 sg[4].offset = ((long) p & ~PAGE_MASK);
1064 sg[4].length = 1;
1066 p = &xbuf[IDX6];
1067 sg[5].page = virt_to_page(p);
1068 sg[5].offset = ((long) p & ~PAGE_MASK);
1069 sg[5].length = 1;
1071 p = &xbuf[IDX7];
1072 sg[6].page = virt_to_page(p);
1073 sg[6].offset = ((long) p & ~PAGE_MASK);
1074 sg[6].length = 1;
1076 p = &xbuf[IDX8];
1077 sg[7].page = virt_to_page(p);
1078 sg[7].offset = ((long) p & ~PAGE_MASK);
1079 sg[7].length = 1;
1081 ret = crypto_cipher_encrypt(tfm, sg, sg, 8);
1082 if (ret) {
1083 printk("encrypt() failed flags=%x\n", tfm->crt_flags);
1084 goto out;
1087 for (i = 0; i < 8; i++)
1088 res[i] = *(char *) (kmap(sg[i].page) + sg[i].offset);
1090 hexdump(res, 8);
1091 printk("%s\n", memcmp(res, des_tv[7].result, 8) ? "fail" : "pass");
1093 printk("\ntesting des decryption\n");
1095 tsize = sizeof (des_dec_tv_template);
1096 if (tsize > TVMEMSIZE) {
1097 printk("template (%u) too big for tvmem (%u)\n", tsize,
1098 TVMEMSIZE);
1099 return;
1101 memcpy(tvmem, des_dec_tv_template, tsize);
1102 des_tv = (void *) tvmem;
1104 for (i = 0; i < DES_DEC_TEST_VECTORS; i++) {
1105 printk("test %u:\n", i + 1);
1107 key = des_tv[i].key;
1109 tfm->crt_flags = 0;
1110 ret = crypto_cipher_setkey(tfm, key, 8);
1111 if (ret) {
1112 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1113 goto out;
1116 len = des_tv[i].len;
1118 p = des_tv[i].plaintext;
1119 sg[0].page = virt_to_page(p);
1120 sg[0].offset = ((long) p & ~PAGE_MASK);
1121 sg[0].length = len;
1123 ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
1124 if (ret) {
1125 printk("des_decrypt() failed flags=%x\n",
1126 tfm->crt_flags);
1127 goto out;
1130 q = kmap(sg[0].page) + sg[0].offset;
1131 hexdump(q, len);
1133 printk("%s\n",
1134 memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
1138 printk("\ntesting des ecb decryption across pages\n");
1140 i = 6;
1142 key = des_tv[i].key;
1143 tfm->crt_flags = 0;
1145 ret = crypto_cipher_setkey(tfm, key, 8);
1146 if (ret) {
1147 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1148 goto out;
1151 /* setup the dummy buffer first */
1152 memset(xbuf, 0, sizeof (xbuf));
1153 memcpy(&xbuf[IDX1], des_tv[i].plaintext, 8);
1154 memcpy(&xbuf[IDX2], des_tv[i].plaintext + 8, 8);
1156 p = &xbuf[IDX1];
1157 sg[0].page = virt_to_page(p);
1158 sg[0].offset = ((long) p & ~PAGE_MASK);
1159 sg[0].length = 8;
1161 p = &xbuf[IDX2];
1162 sg[1].page = virt_to_page(p);
1163 sg[1].offset = ((long) p & ~PAGE_MASK);
1164 sg[1].length = 8;
1166 ret = crypto_cipher_decrypt(tfm, sg, sg, 16);
1167 if (ret) {
1168 printk("decrypt() failed flags=%x\n", tfm->crt_flags);
1169 goto out;
1172 printk("page 1\n");
1173 q = kmap(sg[0].page) + sg[0].offset;
1174 hexdump(q, 8);
1175 printk("%s\n", memcmp(q, des_tv[i].result, 8) ? "fail" : "pass");
1177 printk("page 2\n");
1178 q = kmap(sg[1].page) + sg[1].offset;
1179 hexdump(q, 8);
1180 printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
1183 * Scenario E:
1185 * F1 F2 F3
1186 * [3] [5 + 7] [1]
1189 printk("\ntesting des ecb decryption chunking scenario E\n");
1190 i = 2;
1192 key = des_tv[i].key;
1193 tfm->crt_flags = 0;
1195 ret = crypto_cipher_setkey(tfm, key, 8);
1196 if (ret) {
1197 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1198 goto out;
1201 /* setup the dummy buffer first */
1202 memset(xbuf, 0, sizeof (xbuf));
1204 memcpy(&xbuf[IDX1], des_tv[i].plaintext, 3);
1205 memcpy(&xbuf[IDX2], des_tv[i].plaintext + 3, 12);
1206 memcpy(&xbuf[IDX3], des_tv[i].plaintext + 15, 1);
1208 p = &xbuf[IDX1];
1209 sg[0].page = virt_to_page(p);
1210 sg[0].offset = ((long) p & ~PAGE_MASK);
1211 sg[0].length = 3;
1213 p = &xbuf[IDX2];
1214 sg[1].page = virt_to_page(p);
1215 sg[1].offset = ((long) p & ~PAGE_MASK);
1216 sg[1].length = 12;
1218 p = &xbuf[IDX3];
1219 sg[2].page = virt_to_page(p);
1220 sg[2].offset = ((long) p & ~PAGE_MASK);
1221 sg[2].length = 1;
1223 ret = crypto_cipher_decrypt(tfm, sg, sg, 16);
1225 if (ret) {
1226 printk("decrypt() failed flags=%x\n", tfm->crt_flags);
1227 goto out;
1230 printk("page 1\n");
1231 q = kmap(sg[0].page) + sg[0].offset;
1232 hexdump(q, 3);
1233 printk("%s\n", memcmp(q, des_tv[i].result, 3) ? "fail" : "pass");
1235 printk("page 2\n");
1236 q = kmap(sg[1].page) + sg[1].offset;
1237 hexdump(q, 12);
1238 printk("%s\n", memcmp(q, des_tv[i].result + 3, 12) ? "fail" : "pass");
1240 printk("page 3\n");
1241 q = kmap(sg[2].page) + sg[2].offset;
1242 hexdump(q, 1);
1243 printk("%s\n", memcmp(q, des_tv[i].result + 15, 1) ? "fail" : "pass");
1245 crypto_free_tfm(tfm);
1247 tfm = crypto_alloc_tfm("des", CRYPTO_TFM_MODE_CBC);
1248 if (tfm == NULL) {
1249 printk("failed to load transform for des cbc\n");
1250 return;
1253 printk("\ntesting des cbc encryption\n");
1255 tsize = sizeof (des_cbc_enc_tv_template);
1256 if (tsize > TVMEMSIZE) {
1257 printk("template (%u) too big for tvmem (%u)\n", tsize,
1258 TVMEMSIZE);
1259 return;
1261 memcpy(tvmem, des_cbc_enc_tv_template, tsize);
1262 des_tv = (void *) tvmem;
1264 crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
1265 crypto_cipher_get_iv(tfm, res, crypto_tfm_alg_ivsize(tfm));
1267 if (memcmp(res, des_tv[i].iv, sizeof(res))) {
1268 printk("crypto_cipher_[set|get]_iv() failed\n");
1269 goto out;
1272 for (i = 0; i < DES_CBC_ENC_TEST_VECTORS; i++) {
1273 printk("test %u:\n", i + 1);
1275 key = des_tv[i].key;
1277 ret = crypto_cipher_setkey(tfm, key, 8);
1278 if (ret) {
1279 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1280 goto out;
1283 len = des_tv[i].len;
1284 p = des_tv[i].plaintext;
1286 sg[0].page = virt_to_page(p);
1287 sg[0].offset = ((long) p & ~PAGE_MASK);
1288 sg[0].length = len;
1290 crypto_cipher_set_iv(tfm, des_tv[i].iv,
1291 crypto_tfm_alg_ivsize(tfm));
1293 ret = crypto_cipher_encrypt(tfm, sg, sg, len);
1294 if (ret) {
1295 printk("des_cbc_encrypt() failed flags=%x\n",
1296 tfm->crt_flags);
1297 goto out;
1300 q = kmap(sg[0].page) + sg[0].offset;
1301 hexdump(q, len);
1303 printk("%s\n",
1304 memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
1307 crypto_free_tfm(tfm);
1310 * Scenario F:
1312 * F1 F2
1313 * [8 + 5] [3 + 8]
1316 printk("\ntesting des cbc encryption chunking scenario F\n");
1317 i = 4;
1319 tfm = crypto_alloc_tfm("des", CRYPTO_TFM_MODE_CBC);
1320 if (tfm == NULL) {
1321 printk("failed to load transform for CRYPTO_ALG_DES_CCB\n");
1322 return;
1325 tfm->crt_flags = 0;
1326 key = des_tv[i].key;
1328 ret = crypto_cipher_setkey(tfm, key, 8);
1329 if (ret) {
1330 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1331 goto out;
1334 /* setup the dummy buffer first */
1335 memset(xbuf, 0, sizeof (xbuf));
1337 memcpy(&xbuf[IDX1], des_tv[i].plaintext, 13);
1338 memcpy(&xbuf[IDX2], des_tv[i].plaintext + 13, 11);
1340 p = &xbuf[IDX1];
1341 sg[0].page = virt_to_page(p);
1342 sg[0].offset = ((long) p & ~PAGE_MASK);
1343 sg[0].length = 13;
1345 p = &xbuf[IDX2];
1346 sg[1].page = virt_to_page(p);
1347 sg[1].offset = ((long) p & ~PAGE_MASK);
1348 sg[1].length = 11;
1350 crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
1352 ret = crypto_cipher_encrypt(tfm, sg, sg, 24);
1353 if (ret) {
1354 printk("des_cbc_decrypt() failed flags=%x\n", tfm->crt_flags);
1355 goto out;
1358 printk("page 1\n");
1359 q = kmap(sg[0].page) + sg[0].offset;
1360 hexdump(q, 13);
1361 printk("%s\n", memcmp(q, des_tv[i].result, 13) ? "fail" : "pass");
1363 printk("page 2\n");
1364 q = kmap(sg[1].page) + sg[1].offset;
1365 hexdump(q, 11);
1366 printk("%s\n", memcmp(q, des_tv[i].result + 13, 11) ? "fail" : "pass");
1368 tsize = sizeof (des_cbc_dec_tv_template);
1369 if (tsize > TVMEMSIZE) {
1370 printk("template (%u) too big for tvmem (%u)\n", tsize,
1371 TVMEMSIZE);
1372 return;
1374 memcpy(tvmem, des_cbc_dec_tv_template, tsize);
1375 des_tv = (void *) tvmem;
1377 printk("\ntesting des cbc decryption\n");
1379 for (i = 0; i < DES_CBC_DEC_TEST_VECTORS; i++) {
1380 printk("test %u:\n", i + 1);
1382 tfm->crt_flags = 0;
1383 key = des_tv[i].key;
1385 ret = crypto_cipher_setkey(tfm, key, 8);
1386 if (ret) {
1387 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1388 goto out;
1391 len = des_tv[i].len;
1392 p = des_tv[i].plaintext;
1394 sg[0].page = virt_to_page(p);
1395 sg[0].offset = ((long) p & ~PAGE_MASK);
1396 sg[0].length = len;
1398 crypto_cipher_set_iv(tfm, des_tv[i].iv,
1399 crypto_tfm_alg_blocksize(tfm));
1401 ret = crypto_cipher_decrypt(tfm, sg, sg, len);
1402 if (ret) {
1403 printk("des_cbc_decrypt() failed flags=%x\n",
1404 tfm->crt_flags);
1405 goto out;
1408 hexdump(tfm->crt_cipher.cit_iv, 8);
1410 q = kmap(sg[0].page) + sg[0].offset;
1411 hexdump(q, len);
1413 printk("%s\n",
1414 memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
1418 * Scenario G:
1420 * F1 F2
1421 * [4] [4]
1424 printk("\ntesting des cbc decryption chunking scenario G\n");
1425 i = 3;
1427 tfm->crt_flags = 0;
1428 key = des_tv[i].key;
1430 ret = crypto_cipher_setkey(tfm, key, 8);
1431 if (ret) {
1432 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1433 goto out;
1436 /* setup the dummy buffer first */
1437 memset(xbuf, 0, sizeof (xbuf));
1438 memcpy(&xbuf[IDX1], des_tv[i].plaintext, 4);
1439 memcpy(&xbuf[IDX2], des_tv[i].plaintext + 4, 4);
1441 p = &xbuf[IDX1];
1442 sg[0].page = virt_to_page(p);
1443 sg[0].offset = ((long) p & ~PAGE_MASK);
1444 sg[0].length = 4;
1446 p = &xbuf[IDX2];
1447 sg[1].page = virt_to_page(p);
1448 sg[1].offset = ((long) p & ~PAGE_MASK);
1449 sg[1].length = 4;
1451 crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
1453 ret = crypto_cipher_decrypt(tfm, sg, sg, 8);
1454 if (ret) {
1455 printk("des_cbc_decrypt() failed flags=%x\n", tfm->crt_flags);
1456 goto out;
1459 printk("page 1\n");
1460 q = kmap(sg[0].page) + sg[0].offset;
1461 hexdump(q, 4);
1462 printk("%s\n", memcmp(q, des_tv[i].result, 4) ? "fail" : "pass");
1464 printk("page 2\n");
1465 q = kmap(sg[1].page) + sg[1].offset;
1466 hexdump(q, 4);
1467 printk("%s\n", memcmp(q, des_tv[i].result + 4, 4) ? "fail" : "pass");
1469 out:
1470 crypto_free_tfm(tfm);
1473 void
1474 test_des3_ede(void)
1476 unsigned int ret, i, len;
1477 unsigned int tsize;
1478 char *p, *q;
1479 struct crypto_tfm *tfm;
1480 char *key;
1481 /*char res[8]; */
1482 struct des_tv *des_tv;
1483 struct scatterlist sg[8];
1485 printk("\ntesting des3 ede encryption\n");
1487 tsize = sizeof (des3_ede_enc_tv_template);
1488 if (tsize > TVMEMSIZE) {
1489 printk("template (%u) too big for tvmem (%u)\n", tsize,
1490 TVMEMSIZE);
1491 return;
1494 memcpy(tvmem, des3_ede_enc_tv_template, tsize);
1495 des_tv = (void *) tvmem;
1497 tfm = crypto_alloc_tfm("des3_ede", CRYPTO_TFM_MODE_ECB);
1498 if (tfm == NULL) {
1499 printk("failed to load transform for 3des ecb\n");
1500 return;
1503 for (i = 0; i < DES3_EDE_ENC_TEST_VECTORS; i++) {
1504 printk("test %u:\n", i + 1);
1506 key = des_tv[i].key;
1507 ret = crypto_cipher_setkey(tfm, key, 24);
1508 if (ret) {
1509 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1511 if (!des_tv[i].fail)
1512 goto out;
1515 len = des_tv[i].len;
1517 p = des_tv[i].plaintext;
1518 sg[0].page = virt_to_page(p);
1519 sg[0].offset = ((long) p & ~PAGE_MASK);
1520 sg[0].length = len;
1521 ret = crypto_cipher_encrypt(tfm, sg, sg, len);
1522 if (ret) {
1523 printk("encrypt() failed flags=%x\n", tfm->crt_flags);
1524 goto out;
1527 q = kmap(sg[0].page) + sg[0].offset;
1528 hexdump(q, len);
1530 printk("%s\n",
1531 memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
1534 printk("\ntesting des3 ede decryption\n");
1536 tsize = sizeof (des3_ede_dec_tv_template);
1537 if (tsize > TVMEMSIZE) {
1538 printk("template (%u) too big for tvmem (%u)\n", tsize,
1539 TVMEMSIZE);
1540 return;
1543 memcpy(tvmem, des3_ede_dec_tv_template, tsize);
1544 des_tv = (void *) tvmem;
1546 for (i = 0; i < DES3_EDE_DEC_TEST_VECTORS; i++) {
1547 printk("test %u:\n", i + 1);
1549 key = des_tv[i].key;
1550 ret = crypto_cipher_setkey(tfm, key, 24);
1551 if (ret) {
1552 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1554 if (!des_tv[i].fail)
1555 goto out;
1558 len = des_tv[i].len;
1560 p = des_tv[i].plaintext;
1561 sg[0].page = virt_to_page(p);
1562 sg[0].offset = ((long) p & ~PAGE_MASK);
1563 sg[0].length = len;
1564 ret = crypto_cipher_decrypt(tfm, sg, sg, len);
1565 if (ret) {
1566 printk("decrypt() failed flags=%x\n", tfm->crt_flags);
1567 goto out;
1570 q = kmap(sg[0].page) + sg[0].offset;
1571 hexdump(q, len);
1573 printk("%s\n",
1574 memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
1577 out:
1578 crypto_free_tfm(tfm);
1581 void
1582 test_blowfish(void)
1584 unsigned int ret, i;
1585 unsigned int tsize;
1586 char *p, *q;
1587 struct crypto_tfm *tfm;
1588 char *key;
1589 struct bf_tv *bf_tv;
1590 struct scatterlist sg[1];
1592 printk("\ntesting blowfish encryption\n");
1594 tsize = sizeof (bf_enc_tv_template);
1595 if (tsize > TVMEMSIZE) {
1596 printk("template (%u) too big for tvmem (%u)\n", tsize,
1597 TVMEMSIZE);
1598 return;
1601 memcpy(tvmem, bf_enc_tv_template, tsize);
1602 bf_tv = (void *) tvmem;
1604 tfm = crypto_alloc_tfm("blowfish", 0);
1605 if (tfm == NULL) {
1606 printk("failed to load transform for blowfish (default ecb)\n");
1607 return;
1610 for (i = 0; i < BF_ENC_TEST_VECTORS; i++) {
1611 printk("test %u (%d bit key):\n",
1612 i + 1, bf_tv[i].keylen * 8);
1613 key = bf_tv[i].key;
1615 ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
1616 if (ret) {
1617 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1619 if (!bf_tv[i].fail)
1620 goto out;
1623 p = bf_tv[i].plaintext;
1624 sg[0].page = virt_to_page(p);
1625 sg[0].offset = ((long) p & ~PAGE_MASK);
1626 sg[0].length = bf_tv[i].plen;
1627 ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
1628 if (ret) {
1629 printk("encrypt() failed flags=%x\n", tfm->crt_flags);
1630 goto out;
1633 q = kmap(sg[0].page) + sg[0].offset;
1634 hexdump(q, bf_tv[i].rlen);
1636 printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen) ?
1637 "fail" : "pass");
1640 printk("\ntesting blowfish decryption\n");
1642 tsize = sizeof (bf_dec_tv_template);
1643 if (tsize > TVMEMSIZE) {
1644 printk("template (%u) too big for tvmem (%u)\n", tsize,
1645 TVMEMSIZE);
1646 return;
1649 memcpy(tvmem, bf_dec_tv_template, tsize);
1650 bf_tv = (void *) tvmem;
1652 for (i = 0; i < BF_DEC_TEST_VECTORS; i++) {
1653 printk("test %u (%d bit key):\n",
1654 i + 1, bf_tv[i].keylen * 8);
1655 key = bf_tv[i].key;
1657 ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
1658 if (ret) {
1659 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1661 if (!bf_tv[i].fail)
1662 goto out;
1665 p = bf_tv[i].plaintext;
1666 sg[0].page = virt_to_page(p);
1667 sg[0].offset = ((long) p & ~PAGE_MASK);
1668 sg[0].length = bf_tv[i].plen;
1669 ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
1670 if (ret) {
1671 printk("decrypt() failed flags=%x\n", tfm->crt_flags);
1672 goto out;
1675 q = kmap(sg[0].page) + sg[0].offset;
1676 hexdump(q, bf_tv[i].rlen);
1678 printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen) ?
1679 "fail" : "pass");
1682 crypto_free_tfm(tfm);
1684 tfm = crypto_alloc_tfm("blowfish", CRYPTO_TFM_MODE_CBC);
1685 if (tfm == NULL) {
1686 printk("failed to load transform for blowfish cbc\n");
1687 return;
1690 printk("\ntesting blowfish cbc encryption\n");
1692 tsize = sizeof (bf_cbc_enc_tv_template);
1693 if (tsize > TVMEMSIZE) {
1694 printk("template (%u) too big for tvmem (%u)\n", tsize,
1695 TVMEMSIZE);
1696 goto out;
1698 memcpy(tvmem, bf_cbc_enc_tv_template, tsize);
1699 bf_tv = (void *) tvmem;
1701 for (i = 0; i < BF_CBC_ENC_TEST_VECTORS; i++) {
1702 printk("test %u (%d bit key):\n",
1703 i + 1, bf_tv[i].keylen * 8);
1705 key = bf_tv[i].key;
1707 ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
1708 if (ret) {
1709 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1710 goto out;
1713 p = bf_tv[i].plaintext;
1715 sg[0].page = virt_to_page(p);
1716 sg[0].offset = ((long) p & ~PAGE_MASK);
1717 sg[0].length = bf_tv[i].plen;
1719 crypto_cipher_set_iv(tfm, bf_tv[i].iv,
1720 crypto_tfm_alg_ivsize(tfm));
1722 ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
1723 if (ret) {
1724 printk("blowfish_cbc_encrypt() failed flags=%x\n",
1725 tfm->crt_flags);
1726 goto out;
1729 q = kmap(sg[0].page) + sg[0].offset;
1730 hexdump(q, bf_tv[i].rlen);
1732 printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen)
1733 ? "fail" : "pass");
1736 printk("\ntesting blowfish cbc decryption\n");
1738 tsize = sizeof (bf_cbc_dec_tv_template);
1739 if (tsize > TVMEMSIZE) {
1740 printk("template (%u) too big for tvmem (%u)\n", tsize,
1741 TVMEMSIZE);
1742 goto out;
1744 memcpy(tvmem, bf_cbc_dec_tv_template, tsize);
1745 bf_tv = (void *) tvmem;
1747 for (i = 0; i < BF_CBC_ENC_TEST_VECTORS; i++) {
1748 printk("test %u (%d bit key):\n",
1749 i + 1, bf_tv[i].keylen * 8);
1750 key = bf_tv[i].key;
1752 ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
1753 if (ret) {
1754 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1755 goto out;
1758 p = bf_tv[i].plaintext;
1760 sg[0].page = virt_to_page(p);
1761 sg[0].offset = ((long) p & ~PAGE_MASK);
1762 sg[0].length = bf_tv[i].plen;
1764 crypto_cipher_set_iv(tfm, bf_tv[i].iv,
1765 crypto_tfm_alg_ivsize(tfm));
1767 ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
1768 if (ret) {
1769 printk("blowfish_cbc_decrypt() failed flags=%x\n",
1770 tfm->crt_flags);
1771 goto out;
1774 q = kmap(sg[0].page) + sg[0].offset;
1775 hexdump(q, bf_tv[i].rlen);
1777 printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen)
1778 ? "fail" : "pass");
1781 out:
1782 crypto_free_tfm(tfm);
1786 void
1787 test_twofish(void)
1789 unsigned int ret, i;
1790 unsigned int tsize;
1791 char *p, *q;
1792 struct crypto_tfm *tfm;
1793 char *key;
1794 struct tf_tv *tf_tv;
1795 struct scatterlist sg[1];
1797 printk("\ntesting twofish encryption\n");
1799 tsize = sizeof (tf_enc_tv_template);
1800 if (tsize > TVMEMSIZE) {
1801 printk("template (%u) too big for tvmem (%u)\n", tsize,
1802 TVMEMSIZE);
1803 return;
1806 memcpy(tvmem, tf_enc_tv_template, tsize);
1807 tf_tv = (void *) tvmem;
1809 tfm = crypto_alloc_tfm("twofish", 0);
1810 if (tfm == NULL) {
1811 printk("failed to load transform for blowfish (default ecb)\n");
1812 return;
1815 for (i = 0; i < TF_ENC_TEST_VECTORS; i++) {
1816 printk("test %u (%d bit key):\n",
1817 i + 1, tf_tv[i].keylen * 8);
1818 key = tf_tv[i].key;
1820 ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
1821 if (ret) {
1822 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1824 if (!tf_tv[i].fail)
1825 goto out;
1828 p = tf_tv[i].plaintext;
1829 sg[0].page = virt_to_page(p);
1830 sg[0].offset = ((long) p & ~PAGE_MASK);
1831 sg[0].length = tf_tv[i].plen;
1832 ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
1833 if (ret) {
1834 printk("encrypt() failed flags=%x\n", tfm->crt_flags);
1835 goto out;
1838 q = kmap(sg[0].page) + sg[0].offset;
1839 hexdump(q, tf_tv[i].rlen);
1841 printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen) ?
1842 "fail" : "pass");
1845 printk("\ntesting twofish decryption\n");
1847 tsize = sizeof (tf_dec_tv_template);
1848 if (tsize > TVMEMSIZE) {
1849 printk("template (%u) too big for tvmem (%u)\n", tsize,
1850 TVMEMSIZE);
1851 return;
1854 memcpy(tvmem, tf_dec_tv_template, tsize);
1855 tf_tv = (void *) tvmem;
1857 for (i = 0; i < TF_DEC_TEST_VECTORS; i++) {
1858 printk("test %u (%d bit key):\n",
1859 i + 1, tf_tv[i].keylen * 8);
1860 key = tf_tv[i].key;
1862 ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
1863 if (ret) {
1864 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1866 if (!tf_tv[i].fail)
1867 goto out;
1870 p = tf_tv[i].plaintext;
1871 sg[0].page = virt_to_page(p);
1872 sg[0].offset = ((long) p & ~PAGE_MASK);
1873 sg[0].length = tf_tv[i].plen;
1874 ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
1875 if (ret) {
1876 printk("decrypt() failed flags=%x\n", tfm->crt_flags);
1877 goto out;
1880 q = kmap(sg[0].page) + sg[0].offset;
1881 hexdump(q, tf_tv[i].rlen);
1883 printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen) ?
1884 "fail" : "pass");
1887 crypto_free_tfm(tfm);
1889 tfm = crypto_alloc_tfm("twofish", CRYPTO_TFM_MODE_CBC);
1890 if (tfm == NULL) {
1891 printk("failed to load transform for twofish cbc\n");
1892 return;
1895 printk("\ntesting twofish cbc encryption\n");
1897 tsize = sizeof (tf_cbc_enc_tv_template);
1898 if (tsize > TVMEMSIZE) {
1899 printk("template (%u) too big for tvmem (%u)\n", tsize,
1900 TVMEMSIZE);
1901 goto out;
1903 memcpy(tvmem, tf_cbc_enc_tv_template, tsize);
1904 tf_tv = (void *) tvmem;
1906 for (i = 0; i < TF_CBC_ENC_TEST_VECTORS; i++) {
1907 printk("test %u (%d bit key):\n",
1908 i + 1, tf_tv[i].keylen * 8);
1910 key = tf_tv[i].key;
1912 ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
1913 if (ret) {
1914 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1915 goto out;
1918 p = tf_tv[i].plaintext;
1920 sg[0].page = virt_to_page(p);
1921 sg[0].offset = ((long) p & ~PAGE_MASK);
1922 sg[0].length = tf_tv[i].plen;
1924 crypto_cipher_set_iv(tfm, tf_tv[i].iv,
1925 crypto_tfm_alg_ivsize(tfm));
1927 ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
1928 if (ret) {
1929 printk("blowfish_cbc_encrypt() failed flags=%x\n",
1930 tfm->crt_flags);
1931 goto out;
1934 q = kmap(sg[0].page) + sg[0].offset;
1935 hexdump(q, tf_tv[i].rlen);
1937 printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen)
1938 ? "fail" : "pass");
1941 printk("\ntesting twofish cbc decryption\n");
1943 tsize = sizeof (tf_cbc_dec_tv_template);
1944 if (tsize > TVMEMSIZE) {
1945 printk("template (%u) too big for tvmem (%u)\n", tsize,
1946 TVMEMSIZE);
1947 goto out;
1949 memcpy(tvmem, tf_cbc_dec_tv_template, tsize);
1950 tf_tv = (void *) tvmem;
1952 for (i = 0; i < TF_CBC_DEC_TEST_VECTORS; i++) {
1953 printk("test %u (%d bit key):\n",
1954 i + 1, tf_tv[i].keylen * 8);
1956 key = tf_tv[i].key;
1958 ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
1959 if (ret) {
1960 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1961 goto out;
1964 p = tf_tv[i].plaintext;
1966 sg[0].page = virt_to_page(p);
1967 sg[0].offset = ((long) p & ~PAGE_MASK);
1968 sg[0].length = tf_tv[i].plen;
1970 crypto_cipher_set_iv(tfm, tf_tv[i].iv,
1971 crypto_tfm_alg_ivsize(tfm));
1973 ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
1974 if (ret) {
1975 printk("blowfish_cbc_decrypt() failed flags=%x\n",
1976 tfm->crt_flags);
1977 goto out;
1980 q = kmap(sg[0].page) + sg[0].offset;
1981 hexdump(q, tf_tv[i].rlen);
1983 printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen)
1984 ? "fail" : "pass");
1987 out:
1988 crypto_free_tfm(tfm);
1991 void
1992 test_serpent(void)
1994 unsigned int ret, i, tsize;
1995 u8 *p, *q, *key;
1996 struct crypto_tfm *tfm;
1997 struct serpent_tv *serp_tv;
1998 struct scatterlist sg[1];
2000 printk("\ntesting serpent encryption\n");
2002 tfm = crypto_alloc_tfm("serpent", 0);
2003 if (tfm == NULL) {
2004 printk("failed to load transform for serpent (default ecb)\n");
2005 return;
2008 tsize = sizeof (serpent_enc_tv_template);
2009 if (tsize > TVMEMSIZE) {
2010 printk("template (%u) too big for tvmem (%u)\n", tsize,
2011 TVMEMSIZE);
2012 return;
2015 memcpy(tvmem, serpent_enc_tv_template, tsize);
2016 serp_tv = (void *) tvmem;
2017 for (i = 0; i < SERPENT_ENC_TEST_VECTORS; i++) {
2018 printk("test %u (%d bit key):\n", i + 1, serp_tv[i].keylen * 8);
2019 key = serp_tv[i].key;
2021 ret = crypto_cipher_setkey(tfm, key, serp_tv[i].keylen);
2022 if (ret) {
2023 printk("setkey() failed flags=%x\n", tfm->crt_flags);
2025 if (!serp_tv[i].fail)
2026 goto out;
2029 p = serp_tv[i].plaintext;
2030 sg[0].page = virt_to_page(p);
2031 sg[0].offset = ((long) p & ~PAGE_MASK);
2032 sg[0].length = sizeof(serp_tv[i].plaintext);
2033 ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
2034 if (ret) {
2035 printk("encrypt() failed flags=%x\n", tfm->crt_flags);
2036 goto out;
2039 q = kmap(sg[0].page) + sg[0].offset;
2040 hexdump(q, sizeof(serp_tv[i].result));
2042 printk("%s\n", memcmp(q, serp_tv[i].result,
2043 sizeof(serp_tv[i].result)) ? "fail" : "pass");
2046 printk("\ntesting serpent decryption\n");
2048 tsize = sizeof (serpent_dec_tv_template);
2049 if (tsize > TVMEMSIZE) {
2050 printk("template (%u) too big for tvmem (%u)\n", tsize,
2051 TVMEMSIZE);
2052 return;
2055 memcpy(tvmem, serpent_dec_tv_template, tsize);
2056 serp_tv = (void *) tvmem;
2057 for (i = 0; i < SERPENT_DEC_TEST_VECTORS; i++) {
2058 printk("test %u (%d bit key):\n", i + 1, serp_tv[i].keylen * 8);
2059 key = serp_tv[i].key;
2061 ret = crypto_cipher_setkey(tfm, key, serp_tv[i].keylen);
2062 if (ret) {
2063 printk("setkey() failed flags=%x\n", tfm->crt_flags);
2065 if (!serp_tv[i].fail)
2066 goto out;
2069 p = serp_tv[i].plaintext;
2070 sg[0].page = virt_to_page(p);
2071 sg[0].offset = ((long) p & ~PAGE_MASK);
2072 sg[0].length = sizeof(serp_tv[i].plaintext);
2073 ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
2074 if (ret) {
2075 printk("decrypt() failed flags=%x\n", tfm->crt_flags);
2076 goto out;
2079 q = kmap(sg[0].page) + sg[0].offset;
2080 hexdump(q, sizeof(serp_tv[i].result));
2082 printk("%s\n", memcmp(q, serp_tv[i].result,
2083 sizeof(serp_tv[i].result)) ? "fail" : "pass");
2086 out:
2087 crypto_free_tfm(tfm);
2090 void
2091 test_aes(void)
2093 unsigned int ret, i;
2094 unsigned int tsize;
2095 char *p, *q;
2096 struct crypto_tfm *tfm;
2097 char *key;
2098 struct aes_tv *aes_tv;
2099 struct scatterlist sg[1];
2101 printk("\ntesting aes encryption\n");
2103 tsize = sizeof (aes_enc_tv_template);
2104 if (tsize > TVMEMSIZE) {
2105 printk("template (%u) too big for tvmem (%u)\n", tsize,
2106 TVMEMSIZE);
2107 return;
2110 memcpy(tvmem, aes_enc_tv_template, tsize);
2111 aes_tv = (void *) tvmem;
2113 tfm = crypto_alloc_tfm("aes", 0);
2114 if (tfm == NULL) {
2115 printk("failed to load transform for aes (default ecb)\n");
2116 return;
2119 for (i = 0; i < AES_ENC_TEST_VECTORS; i++) {
2120 printk("test %u (%d bit key):\n",
2121 i + 1, aes_tv[i].keylen * 8);
2122 key = aes_tv[i].key;
2124 ret = crypto_cipher_setkey(tfm, key, aes_tv[i].keylen);
2125 if (ret) {
2126 printk("setkey() failed flags=%x\n", tfm->crt_flags);
2128 if (!aes_tv[i].fail)
2129 goto out;
2132 p = aes_tv[i].plaintext;
2133 sg[0].page = virt_to_page(p);
2134 sg[0].offset = ((long) p & ~PAGE_MASK);
2135 sg[0].length = aes_tv[i].plen;
2136 ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
2137 if (ret) {
2138 printk("encrypt() failed flags=%x\n", tfm->crt_flags);
2139 goto out;
2142 q = kmap(sg[0].page) + sg[0].offset;
2143 hexdump(q, aes_tv[i].rlen);
2145 printk("%s\n", memcmp(q, aes_tv[i].result, aes_tv[i].rlen) ?
2146 "fail" : "pass");
2149 printk("\ntesting aes decryption\n");
2151 tsize = sizeof (aes_dec_tv_template);
2152 if (tsize > TVMEMSIZE) {
2153 printk("template (%u) too big for tvmem (%u)\n", tsize,
2154 TVMEMSIZE);
2155 return;
2158 memcpy(tvmem, aes_dec_tv_template, tsize);
2159 aes_tv = (void *) tvmem;
2161 for (i = 0; i < AES_DEC_TEST_VECTORS; i++) {
2162 printk("test %u (%d bit key):\n",
2163 i + 1, aes_tv[i].keylen * 8);
2164 key = aes_tv[i].key;
2166 ret = crypto_cipher_setkey(tfm, key, aes_tv[i].keylen);
2167 if (ret) {
2168 printk("setkey() failed flags=%x\n", tfm->crt_flags);
2170 if (!aes_tv[i].fail)
2171 goto out;
2174 p = aes_tv[i].plaintext;
2175 sg[0].page = virt_to_page(p);
2176 sg[0].offset = ((long) p & ~PAGE_MASK);
2177 sg[0].length = aes_tv[i].plen;
2178 ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
2179 if (ret) {
2180 printk("decrypt() failed flags=%x\n", tfm->crt_flags);
2181 goto out;
2184 q = kmap(sg[0].page) + sg[0].offset;
2185 hexdump(q, aes_tv[i].rlen);
2187 printk("%s\n", memcmp(q, aes_tv[i].result, aes_tv[i].rlen) ?
2188 "fail" : "pass");
2191 out:
2192 crypto_free_tfm(tfm);
2195 static void
2196 test_deflate(void)
2198 unsigned int i;
2199 char result[COMP_BUF_SIZE];
2200 struct crypto_tfm *tfm;
2201 struct comp_testvec *tv;
2202 unsigned int tsize;
2204 printk("\ntesting deflate compression\n");
2206 tsize = sizeof (deflate_comp_tv_template);
2207 if (tsize > TVMEMSIZE) {
2208 printk("template (%u) too big for tvmem (%u)\n", tsize,
2209 TVMEMSIZE);
2210 return;
2213 memcpy(tvmem, deflate_comp_tv_template, tsize);
2214 tv = (void *) tvmem;
2216 tfm = crypto_alloc_tfm("deflate", 0);
2217 if (tfm == NULL) {
2218 printk("failed to load transform for deflate\n");
2219 return;
2222 for (i = 0; i < DEFLATE_COMP_TEST_VECTORS; i++) {
2223 int ilen, ret, dlen = COMP_BUF_SIZE;
2225 printk("test %u:\n", i + 1);
2226 memset(result, 0, sizeof (result));
2228 ilen = tv[i].inlen;
2229 ret = crypto_comp_compress(tfm, tv[i].input,
2230 ilen, result, &dlen);
2231 if (ret) {
2232 printk("fail: ret=%d\n", ret);
2233 continue;
2235 hexdump(result, dlen);
2236 printk("%s (ratio %d:%d)\n",
2237 memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
2238 ilen, dlen);
2241 printk("\ntesting deflate decompression\n");
2243 tsize = sizeof (deflate_decomp_tv_template);
2244 if (tsize > TVMEMSIZE) {
2245 printk("template (%u) too big for tvmem (%u)\n", tsize,
2246 TVMEMSIZE);
2247 goto out;
2250 memcpy(tvmem, deflate_decomp_tv_template, tsize);
2251 tv = (void *) tvmem;
2253 for (i = 0; i < DEFLATE_DECOMP_TEST_VECTORS; i++) {
2254 int ilen, ret, dlen = COMP_BUF_SIZE;
2256 printk("test %u:\n", i + 1);
2257 memset(result, 0, sizeof (result));
2259 ilen = tv[i].inlen;
2260 ret = crypto_comp_decompress(tfm, tv[i].input,
2261 ilen, result, &dlen);
2262 if (ret) {
2263 printk("fail: ret=%d\n", ret);
2264 continue;
2266 hexdump(result, dlen);
2267 printk("%s (ratio %d:%d)\n",
2268 memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
2269 ilen, dlen);
2271 out:
2272 crypto_free_tfm(tfm);
2275 static void
2276 test_available(void)
2278 char **name = check;
2280 while (*name) {
2281 printk("alg %s ", *name);
2282 printk((crypto_alg_available(*name, 0)) ?
2283 "found\n" : "not found\n");
2284 name++;
2288 static void
2289 do_test(void)
2291 switch (mode) {
2293 case 0:
2294 test_md5();
2295 test_sha1();
2296 test_des();
2297 test_des3_ede();
2298 test_md4();
2299 test_sha256();
2300 test_blowfish();
2301 test_twofish();
2302 test_serpent();
2303 test_aes();
2304 test_sha384();
2305 test_sha512();
2306 test_deflate();
2307 #ifdef CONFIG_CRYPTO_HMAC
2308 test_hmac_md5();
2309 test_hmac_sha1();
2310 test_hmac_sha256();
2311 #endif
2312 break;
2314 case 1:
2315 test_md5();
2316 break;
2318 case 2:
2319 test_sha1();
2320 break;
2322 case 3:
2323 test_des();
2324 break;
2326 case 4:
2327 test_des3_ede();
2328 break;
2330 case 5:
2331 test_md4();
2332 break;
2334 case 6:
2335 test_sha256();
2336 break;
2338 case 7:
2339 test_blowfish();
2340 break;
2342 case 8:
2343 test_twofish();
2344 break;
2346 case 9:
2347 test_serpent();
2348 break;
2350 case 10:
2351 test_aes();
2352 break;
2354 case 11:
2355 test_sha384();
2356 break;
2358 case 12:
2359 test_sha512();
2360 break;
2362 case 13:
2363 test_deflate();
2364 break;
2366 #ifdef CONFIG_CRYPTO_HMAC
2367 case 100:
2368 test_hmac_md5();
2369 break;
2371 case 101:
2372 test_hmac_sha1();
2373 break;
2375 case 102:
2376 test_hmac_sha256();
2377 break;
2379 #endif
2381 case 1000:
2382 test_available();
2383 break;
2385 default:
2386 /* useful for debugging */
2387 printk("not testing anything\n");
2388 break;
2392 static int __init
2393 init(void)
2395 tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL);
2396 if (tvmem == NULL)
2397 return -ENOMEM;
2399 xbuf = kmalloc(XBUFSIZE, GFP_KERNEL);
2400 if (xbuf == NULL) {
2401 kfree(tvmem);
2402 return -ENOMEM;
2405 do_test();
2407 kfree(xbuf);
2408 kfree(tvmem);
2409 return 0;
2412 module_init(init);
2414 MODULE_PARM(mode, "i");
2416 MODULE_LICENSE("GPL");
2417 MODULE_DESCRIPTION("Quick & dirty crypto testing module");
2418 MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");