commented early_printk patch because of rejects.
[linux-flexiantxendom0-3.2.10.git] / crypto / tcrypt.c
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  */
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"
26
27 /*
28  * Need to kmalloc() memory for testing kmap().
29  */
30 #define TVMEMSIZE       4096
31 #define XBUFSIZE        32768
32
33 /*
34  * Indexes into the xbuf to simulate cross-page access.
35  */
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
44
45 static int mode;
46 static char *xbuf;
47 static char *tvmem;
48
49 static char *check[] = {
50         "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
51         "twofish", "serpent", "sha384", "sha512", "md4", "aes", "deflate",
52          NULL
53 };
54
55 static void
56 hexdump(unsigned char *buf, unsigned int len)
57 {
58         while (len--)
59                 printk("%02x", *buf++);
60
61         printk("\n");
62 }
63
64 static void
65 test_md5(void)
66 {
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;
74
75         printk("\ntesting md5\n");
76
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;
82         }
83
84         memcpy(tvmem, md5_tv_template, tsize);
85         md5_tv = (void *) tvmem;
86
87         tfm = crypto_alloc_tfm("md5", 0);
88         if (tfm == NULL) {
89                 printk("failed to load transform for md5\n");
90                 return;
91         }
92
93         for (i = 0; i < MD5_TEST_VECTORS; i++) {
94                 printk("test %u:\n", i + 1);
95                 memset(result, 0, sizeof (result));
96
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);
101
102                 crypto_digest_init(tfm);
103                 crypto_digest_update(tfm, sg, 1);
104                 crypto_digest_final(tfm, result);
105
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");
111         }
112
113         printk("\ntesting md5 across pages\n");
114
115         /* setup the dummy buffer first */
116         memset(xbuf, 0, XBUFSIZE);
117         memcpy(&xbuf[IDX1], "abcdefghijklm", 13);
118         memcpy(&xbuf[IDX2], "nopqrstuvwxyz", 13);
119
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;
124
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;
129
130         memset(result, 0, sizeof (result));
131         crypto_digest_digest(tfm, sg, 2, result);
132         hexdump(result, crypto_tfm_alg_digestsize(tfm));
133
134         printk("%s\n",
135                memcmp(result, md5_tv[4].digest,
136                       crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
137         crypto_free_tfm(tfm);
138 }
139
140 #ifdef CONFIG_CRYPTO_HMAC
141 static void
142 test_hmac_md5(void)
143 {
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;
151
152         tfm = crypto_alloc_tfm("md5", 0);
153         if (tfm == NULL) {
154                 printk("failed to load transform for md5\n");
155                 return;
156         }
157
158         printk("\ntesting hmac_md5\n");
159         
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;
165         }
166
167         memcpy(tvmem, hmac_md5_tv_template, tsize);
168         hmac_md5_tv = (void *) tvmem;
169
170         for (i = 0; i < HMAC_MD5_TEST_VECTORS; i++) {
171                 printk("test %u:\n", i + 1);
172                 memset(result, 0, sizeof (result));
173
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);
178
179                 klen = strlen(hmac_md5_tv[i].key);
180                 crypto_hmac(tfm, hmac_md5_tv[i].key, &klen, sg, 1, result);
181
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");
187         }
188
189         printk("\ntesting hmac_md5 across pages\n");
190
191         memset(xbuf, 0, XBUFSIZE);
192
193         memcpy(&xbuf[IDX1], "what do ya want ", 16);
194         memcpy(&xbuf[IDX2], "for nothing?", 12);
195
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;
200
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;
205
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));
210
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);
216 }
217
218 static void
219 test_hmac_sha1(void)
220 {
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];
228
229         tfm = crypto_alloc_tfm("sha1", 0);
230         if (tfm == NULL) {
231                 printk("failed to load transform for sha1\n");
232                 return;
233         }
234
235         printk("\ntesting hmac_sha1\n");
236
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;
242         }
243
244         memcpy(tvmem, hmac_sha1_tv_template, tsize);
245         hmac_sha1_tv = (void *) tvmem;
246
247         for (i = 0; i < HMAC_SHA1_TEST_VECTORS; i++) {
248                 printk("test %u:\n", i + 1);
249                 memset(result, 0, sizeof (result));
250
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);
255
256                 klen = strlen(hmac_sha1_tv[i].key);
257                 
258                 crypto_hmac(tfm, hmac_sha1_tv[i].key, &klen, sg, 1, result);
259
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");
265         }
266
267         printk("\ntesting hmac_sha1 across pages\n");
268
269         /* setup the dummy buffer first */
270         memset(xbuf, 0, XBUFSIZE);
271
272         memcpy(&xbuf[IDX1], "what do ya want ", 16);
273         memcpy(&xbuf[IDX2], "for nothing?", 12);
274
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;
279
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;
284
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));
289
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);
295 }
296
297 static void
298 test_hmac_sha256(void)
299 {
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];
307
308         tfm = crypto_alloc_tfm("sha256", 0);
309         if (tfm == NULL) {
310                 printk("failed to load transform for sha256\n");
311                 return;
312         }
313
314         printk("\ntesting hmac_sha256\n");
315
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;
321         }
322
323         memcpy(tvmem, hmac_sha256_tv_template, tsize);
324         hmac_sha256_tv = (void *) tvmem;
325
326         for (i = 0; i < HMAC_SHA256_TEST_VECTORS; i++) {
327                 printk("test %u:\n", i + 1);
328                 memset(result, 0, sizeof (result));
329
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);
334
335                 klen = strlen(hmac_sha256_tv[i].key);
336         
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");
343         }
344
345 out:
346         crypto_free_tfm(tfm);
347 }
348
349 #endif  /* CONFIG_CRYPTO_HMAC */
350
351 static void
352 test_md4(void)
353 {
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;
361
362         printk("\ntesting md4\n");
363
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;
369         }
370
371         memcpy(tvmem, md4_tv_template, tsize);
372         md4_tv = (void *) tvmem;
373
374         tfm = crypto_alloc_tfm("md4", 0);
375         if (tfm == NULL) {
376                 printk("failed to load transform for md4\n");
377                 return;
378         }
379
380         for (i = 0; i < MD4_TEST_VECTORS; i++) {
381                 printk("test %u:\n", i + 1);
382                 memset(result, 0, sizeof (result));
383
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);
388
389                 crypto_digest_digest(tfm, sg, 1, result);
390
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");
396         }
397
398         crypto_free_tfm(tfm);
399 }
400
401 static void
402 test_sha1(void)
403 {
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];
411
412         printk("\ntesting sha1\n");
413
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;
419         }
420
421         memcpy(tvmem, sha1_tv_template, tsize);
422         sha1_tv = (void *) tvmem;
423
424         tfm = crypto_alloc_tfm("sha1", 0);
425         if (tfm == NULL) {
426                 printk("failed to load transform for sha1\n");
427                 return;
428         }
429
430         for (i = 0; i < SHA1_TEST_VECTORS; i++) {
431                 printk("test %u:\n", i + 1);
432                 memset(result, 0, sizeof (result));
433
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);
438
439                 crypto_digest_init(tfm);
440                 crypto_digest_update(tfm, sg, 1);
441                 crypto_digest_final(tfm, result);
442
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");
448         }
449
450         printk("\ntesting sha1 across pages\n");
451
452         /* setup the dummy buffer first */
453         memset(xbuf, 0, XBUFSIZE);
454         memcpy(&xbuf[IDX1], "abcdbcdecdefdefgefghfghighij", 28);
455         memcpy(&xbuf[IDX2], "hijkijkljklmklmnlmnomnopnopq", 28);
456
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;
461
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;
466
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);
474 }
475
476 static void
477 test_sha256(void)
478 {
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];
486
487         printk("\ntesting sha256\n");
488
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;
494         }
495
496         memcpy(tvmem, sha256_tv_template, tsize);
497         sha256_tv = (void *) tvmem;
498
499         tfm = crypto_alloc_tfm("sha256", 0);
500         if (tfm == NULL) {
501                 printk("failed to load transform for sha256\n");
502                 return;
503         }
504
505         for (i = 0; i < SHA256_TEST_VECTORS; i++) {
506                 printk("test %u:\n", i + 1);
507                 memset(result, 0, sizeof (result));
508
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);
513
514                 crypto_digest_init(tfm);
515                 crypto_digest_update(tfm, sg, 1);
516                 crypto_digest_final(tfm, result);
517
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");
523         }
524
525         printk("\ntesting sha256 across pages\n");
526
527         /* setup the dummy buffer first */
528         memset(xbuf, 0, XBUFSIZE);
529         memcpy(&xbuf[IDX1], "abcdbcdecdefdefgefghfghighij", 28);
530         memcpy(&xbuf[IDX2], "hijkijkljklmklmnlmnomnopnopq", 28);
531
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;
536
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;
541
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");
548                      
549         crypto_free_tfm(tfm);
550 }
551
552 static void
553 test_sha384(void)
554 {
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];
562
563         printk("\ntesting sha384\n");
564
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;
570         }
571
572         memcpy(tvmem, sha384_tv_template, tsize);
573         sha384_tv = (void *) tvmem;
574
575         tfm = crypto_alloc_tfm("sha384", 0);
576         if (tfm == NULL) {
577                 printk("failed to load transform for sha384\n");
578                 return;
579         }
580
581         for (i = 0; i < SHA384_TEST_VECTORS; i++) {
582                 printk("test %u:\n", i + 1);
583                 memset(result, 0, sizeof (result));
584
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);
589
590                 crypto_digest_init(tfm);
591                 crypto_digest_update(tfm, sg, 1);
592                 crypto_digest_final(tfm, result);
593
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");
599         }
600
601         crypto_free_tfm(tfm);
602 }
603
604 static void
605 test_sha512(void)
606 {
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];
614
615         printk("\ntesting sha512\n");
616
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;
622         }
623
624         memcpy(tvmem, sha512_tv_template, tsize);
625         sha512_tv = (void *) tvmem;
626
627         tfm = crypto_alloc_tfm("sha512", 0);
628         if (tfm == NULL) {
629                 printk("failed to load transform for sha512\n");
630                 return;
631         }
632
633         for (i = 0; i < SHA512_TEST_VECTORS; i++) {
634                 printk("test %u:\n", i + 1);
635                 memset(result, 0, sizeof (result));
636
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);
641
642                 crypto_digest_init(tfm);
643                 crypto_digest_update(tfm, sg, 1);
644                 crypto_digest_final(tfm, result);
645
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");
651         }
652
653         crypto_free_tfm(tfm);
654 }
655
656 void
657 test_des(void)
658 {
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];
667
668         printk("\ntesting des encryption\n");
669
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;
675         }
676
677         memcpy(tvmem, des_enc_tv_template, tsize);
678         des_tv = (void *) tvmem;
679
680         tfm = crypto_alloc_tfm("des", 0);
681         if (tfm == NULL) {
682                 printk("failed to load transform for des (default ecb)\n");
683                 return;
684         }
685
686         for (i = 0; i < DES_ENC_TEST_VECTORS; i++) {
687                 printk("test %u:\n", i + 1);
688
689                 key = des_tv[i].key;
690                 tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
691
692                 ret = crypto_cipher_setkey(tfm, key, 8);
693                 if (ret) {
694                         printk("setkey() failed flags=%x\n", tfm->crt_flags);
695
696                         if (!des_tv[i].fail)
697                                 goto out;
698                 }
699
700                 len = des_tv[i].len;
701
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;
710                 }
711
712                 q = kmap(sg[0].page) + sg[0].offset;
713                 hexdump(q, len);
714
715                 printk("%s\n",
716                        memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
717
718         }
719
720         printk("\ntesting des ecb encryption across pages\n");
721
722         i = 5;
723         key = des_tv[i].key;
724         tfm->crt_flags = 0;
725
726         hexdump(key, 8);
727
728         ret = crypto_cipher_setkey(tfm, key, 8);
729         if (ret) {
730                 printk("setkey() failed flags=%x\n", tfm->crt_flags);
731                 goto out;
732         }
733
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);
738
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;
743
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;
748
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;
753         }
754
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");
759
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");
764
765         printk("\ntesting des ecb encryption chunking scenario A\n");
766
767         /*
768          * Scenario A:
769          * 
770          *  F1       F2      F3
771          *  [8 + 6]  [2 + 8] [8]
772          *       ^^^^^^   ^
773          *       a    b   c
774          *
775          * Chunking should begin at a, then end with b, and
776          * continue encrypting at an offset of 2 until c.
777          *
778          */
779         i = 7;
780
781         key = des_tv[i].key;
782         tfm->crt_flags = 0;
783
784         ret = crypto_cipher_setkey(tfm, key, 8);
785         if (ret) {
786                 printk("setkey() failed flags=%x\n", tfm->crt_flags);
787                 goto out;
788         }
789
790         /* setup the dummy buffer first */
791         memset(xbuf, 0, sizeof (xbuf));
792
793         /* Frag 1: 8 + 6 */
794         memcpy(&xbuf[IDX3], des_tv[i].plaintext, 14);
795
796         /* Frag 2: 2 + 8 */
797         memcpy(&xbuf[IDX4], des_tv[i].plaintext + 14, 10);
798
799         /* Frag 3: 8 */
800         memcpy(&xbuf[IDX5], des_tv[i].plaintext + 24, 8);
801
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;
806
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;
811
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;
816
817         ret = crypto_cipher_encrypt(tfm, sg, sg, 32);
818
819         if (ret) {
820                 printk("decrypt() failed flags=%x\n", tfm->crt_flags);
821                 goto out;
822         }
823
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");
828
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");
833
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");
838
839         printk("\ntesting des ecb encryption chunking scenario B\n");
840
841         /*
842          * Scenario B:
843          * 
844          *  F1  F2  F3  F4
845          *  [2] [1] [3] [2 + 8 + 8]
846          */
847         i = 7;
848
849         key = des_tv[i].key;
850         tfm->crt_flags = 0;
851
852         ret = crypto_cipher_setkey(tfm, key, 8);
853         if (ret) {
854                 printk("setkey() failed flags=%x\n", tfm->crt_flags);
855                 goto out;
856         }
857
858         /* setup the dummy buffer first */
859         memset(xbuf, 0, sizeof (xbuf));
860
861         /* Frag 1: 2 */
862         memcpy(&xbuf[IDX3], des_tv[i].plaintext, 2);
863
864         /* Frag 2: 1 */
865         memcpy(&xbuf[IDX4], des_tv[i].plaintext + 2, 1);
866
867         /* Frag 3: 3 */
868         memcpy(&xbuf[IDX5], des_tv[i].plaintext + 3, 3);
869
870         /* Frag 4: 2 + 8 + 8 */
871         memcpy(&xbuf[IDX6], des_tv[i].plaintext + 6, 18);
872
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;
877
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;
882
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;
887
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;
892
893         ret = crypto_cipher_encrypt(tfm, sg, sg, 24);
894
895         if (ret) {
896                 printk("encrypt() failed flags=%x\n", tfm->crt_flags);
897                 goto out;
898         }
899
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");
904
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");
909
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");
914
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");
919
920         printk("\ntesting des ecb encryption chunking scenario C\n");
921
922         /*
923          * Scenario B:
924          * 
925          *  F1  F2  F3  F4  F5
926          *  [2] [2] [2] [2] [8]
927          */
928         i = 7;
929
930         key = des_tv[i].key;
931         tfm->crt_flags = 0;
932
933         ret = crypto_cipher_setkey(tfm, key, 8);
934         if (ret) {
935                 printk("setkey() failed flags=%x\n", tfm->crt_flags);
936                 goto out;
937         }
938
939         /* setup the dummy buffer first */
940         memset(xbuf, 0, sizeof (xbuf));
941
942         /* Frag 1: 2 */
943         memcpy(&xbuf[IDX3], des_tv[i].plaintext, 2);
944
945         /* Frag 2: 2 */
946         memcpy(&xbuf[IDX4], des_tv[i].plaintext + 2, 2);
947
948         /* Frag 3: 2 */
949         memcpy(&xbuf[IDX5], des_tv[i].plaintext + 4, 2);
950
951         /* Frag 4: 2 */
952         memcpy(&xbuf[IDX6], des_tv[i].plaintext + 6, 2);
953
954         /* Frag 5: 8 */
955         memcpy(&xbuf[IDX7], des_tv[i].plaintext + 8, 8);
956
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;
961
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;
966
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;
971
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;
976
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;
981
982         ret = crypto_cipher_encrypt(tfm, sg, sg, 16);
983
984         if (ret) {
985                 printk("encrypt() failed flags=%x\n", tfm->crt_flags);
986                 goto out;
987         }
988
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");
993
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");
998
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");
1003
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");
1008
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");
1013
1014         printk("\ntesting des ecb encryption chunking scenario D\n");
1015
1016         /*
1017          * Scenario D, torture test, one byte per frag.
1018          */
1019         i = 7;
1020         key = des_tv[i].key;
1021         tfm->crt_flags = 0;
1022
1023         ret = crypto_cipher_setkey(tfm, key, 8);
1024         if (ret) {
1025                 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1026                 goto out;
1027         }
1028
1029         /* setup the dummy buffer first */
1030         memset(xbuf, 0, XBUFSIZE);
1031
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];
1040
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;
1045
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;
1050
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;
1055
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;
1060
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;
1065
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;
1070
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;
1075
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;
1080
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;
1085         }
1086
1087         for (i = 0; i < 8; i++)
1088                 res[i] = *(char *) (kmap(sg[i].page) + sg[i].offset);
1089
1090         hexdump(res, 8);
1091         printk("%s\n", memcmp(res, des_tv[7].result, 8) ? "fail" : "pass");
1092
1093         printk("\ntesting des decryption\n");
1094
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;
1100         }
1101         memcpy(tvmem, des_dec_tv_template, tsize);
1102         des_tv = (void *) tvmem;
1103
1104         for (i = 0; i < DES_DEC_TEST_VECTORS; i++) {
1105                 printk("test %u:\n", i + 1);
1106
1107                 key = des_tv[i].key;
1108
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;
1114                 }
1115
1116                 len = des_tv[i].len;
1117
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;
1122
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;
1128                 }
1129
1130                 q = kmap(sg[0].page) + sg[0].offset;
1131                 hexdump(q, len);
1132
1133                 printk("%s\n",
1134                        memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
1135
1136         }
1137
1138         printk("\ntesting des ecb decryption across pages\n");
1139
1140         i = 6;
1141
1142         key = des_tv[i].key;
1143         tfm->crt_flags = 0;
1144
1145         ret = crypto_cipher_setkey(tfm, key, 8);
1146         if (ret) {
1147                 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1148                 goto out;
1149         }
1150
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);
1155
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;
1160
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;
1165
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;
1170         }
1171
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");
1176
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");
1181
1182         /*
1183          * Scenario E:
1184          * 
1185          *  F1   F2      F3
1186          *  [3]  [5 + 7] [1]
1187          *
1188          */
1189         printk("\ntesting des ecb decryption chunking scenario E\n");
1190         i = 2;
1191
1192         key = des_tv[i].key;
1193         tfm->crt_flags = 0;
1194
1195         ret = crypto_cipher_setkey(tfm, key, 8);
1196         if (ret) {
1197                 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1198                 goto out;
1199         }
1200
1201         /* setup the dummy buffer first */
1202         memset(xbuf, 0, sizeof (xbuf));
1203
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);
1207
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;
1212
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;
1217
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;
1222
1223         ret = crypto_cipher_decrypt(tfm, sg, sg, 16);
1224
1225         if (ret) {
1226                 printk("decrypt() failed flags=%x\n", tfm->crt_flags);
1227                 goto out;
1228         }
1229
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");
1234
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");
1239
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");
1244
1245         crypto_free_tfm(tfm);
1246
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;
1251         }
1252
1253         printk("\ntesting des cbc encryption\n");
1254
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;
1260         }
1261         memcpy(tvmem, des_cbc_enc_tv_template, tsize);
1262         des_tv = (void *) tvmem;
1263
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));
1266         
1267         if (memcmp(res, des_tv[i].iv, sizeof(res))) {
1268                 printk("crypto_cipher_[set|get]_iv() failed\n");
1269                 goto out;
1270         }
1271         
1272         for (i = 0; i < DES_CBC_ENC_TEST_VECTORS; i++) {
1273                 printk("test %u:\n", i + 1);
1274
1275                 key = des_tv[i].key;
1276
1277                 ret = crypto_cipher_setkey(tfm, key, 8);
1278                 if (ret) {
1279                         printk("setkey() failed flags=%x\n", tfm->crt_flags);
1280                         goto out;
1281                 }
1282
1283                 len = des_tv[i].len;
1284                 p = des_tv[i].plaintext;
1285
1286                 sg[0].page = virt_to_page(p);
1287                 sg[0].offset = ((long) p & ~PAGE_MASK);
1288                 sg[0].length = len;
1289
1290                 crypto_cipher_set_iv(tfm, des_tv[i].iv,
1291                                      crypto_tfm_alg_ivsize(tfm));
1292
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;
1298                 }
1299
1300                 q = kmap(sg[0].page) + sg[0].offset;
1301                 hexdump(q, len);
1302
1303                 printk("%s\n",
1304                        memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
1305         }
1306
1307         crypto_free_tfm(tfm);
1308
1309         /*
1310          * Scenario F:
1311          * 
1312          *  F1       F2      
1313          *  [8 + 5]  [3 + 8]
1314          *
1315          */
1316         printk("\ntesting des cbc encryption chunking scenario F\n");
1317         i = 4;
1318
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;
1323         }
1324
1325         tfm->crt_flags = 0;
1326         key = des_tv[i].key;
1327
1328         ret = crypto_cipher_setkey(tfm, key, 8);
1329         if (ret) {
1330                 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1331                 goto out;
1332         }
1333
1334         /* setup the dummy buffer first */
1335         memset(xbuf, 0, sizeof (xbuf));
1336
1337         memcpy(&xbuf[IDX1], des_tv[i].plaintext, 13);
1338         memcpy(&xbuf[IDX2], des_tv[i].plaintext + 13, 11);
1339
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;
1344
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;
1349
1350         crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
1351
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;
1356         }
1357
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");
1362
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");
1367
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;
1373         }
1374         memcpy(tvmem, des_cbc_dec_tv_template, tsize);
1375         des_tv = (void *) tvmem;
1376
1377         printk("\ntesting des cbc decryption\n");
1378
1379         for (i = 0; i < DES_CBC_DEC_TEST_VECTORS; i++) {
1380                 printk("test %u:\n", i + 1);
1381
1382                 tfm->crt_flags = 0;
1383                 key = des_tv[i].key;
1384
1385                 ret = crypto_cipher_setkey(tfm, key, 8);
1386                 if (ret) {
1387                         printk("setkey() failed flags=%x\n", tfm->crt_flags);
1388                         goto out;
1389                 }
1390
1391                 len = des_tv[i].len;
1392                 p = des_tv[i].plaintext;
1393
1394                 sg[0].page = virt_to_page(p);
1395                 sg[0].offset = ((long) p & ~PAGE_MASK);
1396                 sg[0].length = len;
1397
1398                 crypto_cipher_set_iv(tfm, des_tv[i].iv,
1399                                       crypto_tfm_alg_blocksize(tfm));
1400
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;
1406                 }
1407
1408                 hexdump(tfm->crt_cipher.cit_iv, 8);
1409
1410                 q = kmap(sg[0].page) + sg[0].offset;
1411                 hexdump(q, len);
1412
1413                 printk("%s\n",
1414                        memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
1415         }
1416
1417         /*
1418          * Scenario G:
1419          * 
1420          *  F1   F2      
1421          *  [4]  [4]
1422          *
1423          */
1424         printk("\ntesting des cbc decryption chunking scenario G\n");
1425         i = 3;
1426
1427         tfm->crt_flags = 0;
1428         key = des_tv[i].key;
1429
1430         ret = crypto_cipher_setkey(tfm, key, 8);
1431         if (ret) {
1432                 printk("setkey() failed flags=%x\n", tfm->crt_flags);
1433                 goto out;
1434         }
1435
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);
1440
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;
1445
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;
1450
1451         crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
1452
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;
1457         }
1458
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");
1463
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");
1468
1469       out:
1470         crypto_free_tfm(tfm);
1471 }
1472
1473 void
1474 test_des3_ede(void)
1475 {
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];
1484
1485         printk("\ntesting des3 ede encryption\n");
1486
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;
1492         }
1493
1494         memcpy(tvmem, des3_ede_enc_tv_template, tsize);
1495         des_tv = (void *) tvmem;
1496
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;
1501         }
1502
1503         for (i = 0; i < DES3_EDE_ENC_TEST_VECTORS; i++) {
1504                 printk("test %u:\n", i + 1);
1505
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);
1510
1511                         if (!des_tv[i].fail)
1512                                 goto out;
1513                 }
1514
1515                 len = des_tv[i].len;
1516
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;
1525                 }
1526
1527                 q = kmap(sg[0].page) + sg[0].offset;
1528                 hexdump(q, len);
1529
1530                 printk("%s\n",
1531                        memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
1532         }
1533
1534         printk("\ntesting des3 ede decryption\n");
1535
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;
1541         }
1542
1543         memcpy(tvmem, des3_ede_dec_tv_template, tsize);
1544         des_tv = (void *) tvmem;
1545
1546         for (i = 0; i < DES3_EDE_DEC_TEST_VECTORS; i++) {
1547                 printk("test %u:\n", i + 1);
1548
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);
1553
1554                         if (!des_tv[i].fail)
1555                                 goto out;
1556                 }
1557
1558                 len = des_tv[i].len;
1559
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;
1568                 }
1569
1570                 q = kmap(sg[0].page) + sg[0].offset;
1571                 hexdump(q, len);
1572
1573                 printk("%s\n",
1574                        memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
1575         }
1576
1577       out:
1578         crypto_free_tfm(tfm);
1579 }
1580
1581 void
1582 test_blowfish(void)
1583 {
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];
1591
1592         printk("\ntesting blowfish encryption\n");
1593
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;
1599         }
1600
1601         memcpy(tvmem, bf_enc_tv_template, tsize);
1602         bf_tv = (void *) tvmem;
1603
1604         tfm = crypto_alloc_tfm("blowfish", 0);
1605         if (tfm == NULL) {
1606                 printk("failed to load transform for blowfish (default ecb)\n");
1607                 return;
1608         }
1609
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;
1614
1615                 ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
1616                 if (ret) {
1617                         printk("setkey() failed flags=%x\n", tfm->crt_flags);
1618
1619                         if (!bf_tv[i].fail)
1620                                 goto out;
1621                 }
1622
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;
1631                 }
1632
1633                 q = kmap(sg[0].page) + sg[0].offset;
1634                 hexdump(q, bf_tv[i].rlen);
1635
1636                 printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen) ?
1637                         "fail" : "pass");
1638         }
1639
1640         printk("\ntesting blowfish decryption\n");
1641
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;
1647         }
1648
1649         memcpy(tvmem, bf_dec_tv_template, tsize);
1650         bf_tv = (void *) tvmem;
1651
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;
1656
1657                 ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
1658                 if (ret) {
1659                         printk("setkey() failed flags=%x\n", tfm->crt_flags);
1660
1661                         if (!bf_tv[i].fail)
1662                                 goto out;
1663                 }
1664
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;
1673                 }
1674
1675                 q = kmap(sg[0].page) + sg[0].offset;
1676                 hexdump(q, bf_tv[i].rlen);
1677
1678                 printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen) ?
1679                         "fail" : "pass");
1680         }
1681         
1682         crypto_free_tfm(tfm);
1683         
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;
1688         }
1689
1690         printk("\ntesting blowfish cbc encryption\n");
1691
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;
1697         }
1698         memcpy(tvmem, bf_cbc_enc_tv_template, tsize);
1699         bf_tv = (void *) tvmem;
1700
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);
1704
1705                 key = bf_tv[i].key;
1706
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;
1711                 }
1712
1713                 p = bf_tv[i].plaintext;
1714
1715                 sg[0].page = virt_to_page(p);
1716                 sg[0].offset = ((long) p & ~PAGE_MASK);
1717                 sg[0].length =  bf_tv[i].plen;
1718
1719                 crypto_cipher_set_iv(tfm, bf_tv[i].iv,
1720                                      crypto_tfm_alg_ivsize(tfm));
1721
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;
1727                 }
1728
1729                 q = kmap(sg[0].page) + sg[0].offset;
1730                 hexdump(q, bf_tv[i].rlen);
1731
1732                 printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen)
1733                         ? "fail" : "pass");
1734         }
1735
1736         printk("\ntesting blowfish cbc decryption\n");
1737
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;
1743         }
1744         memcpy(tvmem, bf_cbc_dec_tv_template, tsize);
1745         bf_tv = (void *) tvmem;
1746
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;
1751
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;
1756                 }
1757
1758                 p = bf_tv[i].plaintext;
1759
1760                 sg[0].page = virt_to_page(p);
1761                 sg[0].offset = ((long) p & ~PAGE_MASK);
1762                 sg[0].length =  bf_tv[i].plen;
1763
1764                 crypto_cipher_set_iv(tfm, bf_tv[i].iv,
1765                                      crypto_tfm_alg_ivsize(tfm));
1766
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;
1772                 }
1773
1774                 q = kmap(sg[0].page) + sg[0].offset;
1775                 hexdump(q, bf_tv[i].rlen);
1776
1777                 printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen)
1778                         ? "fail" : "pass");
1779         }
1780
1781 out:
1782         crypto_free_tfm(tfm);
1783 }
1784
1785
1786 void
1787 test_twofish(void)
1788 {
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];
1796
1797         printk("\ntesting twofish encryption\n");
1798
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;
1804         }
1805
1806         memcpy(tvmem, tf_enc_tv_template, tsize);
1807         tf_tv = (void *) tvmem;
1808
1809         tfm = crypto_alloc_tfm("twofish", 0);
1810         if (tfm == NULL) {
1811                 printk("failed to load transform for blowfish (default ecb)\n");
1812                 return;
1813         }
1814
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;
1819
1820                 ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
1821                 if (ret) {
1822                         printk("setkey() failed flags=%x\n", tfm->crt_flags);
1823
1824                         if (!tf_tv[i].fail)
1825                                 goto out;
1826                 }
1827
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;
1836                 }
1837
1838                 q = kmap(sg[0].page) + sg[0].offset;
1839                 hexdump(q, tf_tv[i].rlen);
1840
1841                 printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen) ?
1842                         "fail" : "pass");
1843         }
1844
1845         printk("\ntesting twofish decryption\n");
1846
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;
1852         }
1853
1854         memcpy(tvmem, tf_dec_tv_template, tsize);
1855         tf_tv = (void *) tvmem;
1856
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;
1861
1862                 ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
1863                 if (ret) {
1864                         printk("setkey() failed flags=%x\n", tfm->crt_flags);
1865
1866                         if (!tf_tv[i].fail)
1867                                 goto out;
1868                 }
1869
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;
1878                 }
1879
1880                 q = kmap(sg[0].page) + sg[0].offset;
1881                 hexdump(q, tf_tv[i].rlen);
1882
1883                 printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen) ?
1884                         "fail" : "pass");
1885         }
1886
1887         crypto_free_tfm(tfm);
1888         
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;
1893         }
1894
1895         printk("\ntesting twofish cbc encryption\n");
1896
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;
1902         }
1903         memcpy(tvmem, tf_cbc_enc_tv_template, tsize);
1904         tf_tv = (void *) tvmem;
1905
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);
1909
1910                 key = tf_tv[i].key;
1911
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;
1916                 }
1917
1918                 p = tf_tv[i].plaintext;
1919
1920                 sg[0].page = virt_to_page(p);
1921                 sg[0].offset = ((long) p & ~PAGE_MASK);
1922                 sg[0].length =  tf_tv[i].plen;
1923
1924                 crypto_cipher_set_iv(tfm, tf_tv[i].iv,
1925                                      crypto_tfm_alg_ivsize(tfm));
1926
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;
1932                 }
1933
1934                 q = kmap(sg[0].page) + sg[0].offset;
1935                 hexdump(q, tf_tv[i].rlen);
1936
1937                 printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen)
1938                         ? "fail" : "pass");
1939         }
1940
1941         printk("\ntesting twofish cbc decryption\n");
1942
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;
1948         }
1949         memcpy(tvmem, tf_cbc_dec_tv_template, tsize);
1950         tf_tv = (void *) tvmem;
1951
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);
1955
1956                 key = tf_tv[i].key;
1957
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;
1962                 }
1963
1964                 p = tf_tv[i].plaintext;
1965
1966                 sg[0].page = virt_to_page(p);
1967                 sg[0].offset = ((long) p & ~PAGE_MASK);
1968                 sg[0].length =  tf_tv[i].plen;
1969
1970                 crypto_cipher_set_iv(tfm, tf_tv[i].iv,
1971                                      crypto_tfm_alg_ivsize(tfm));
1972
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;
1978                 }
1979
1980                 q = kmap(sg[0].page) + sg[0].offset;
1981                 hexdump(q, tf_tv[i].rlen);
1982
1983                 printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen)
1984                         ? "fail" : "pass");
1985         }
1986
1987 out:    
1988         crypto_free_tfm(tfm);
1989 }
1990
1991 void
1992 test_serpent(void)
1993 {
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];
1999
2000         printk("\ntesting serpent encryption\n");
2001
2002         tfm = crypto_alloc_tfm("serpent", 0);
2003         if (tfm == NULL) {
2004                 printk("failed to load transform for serpent (default ecb)\n");
2005                 return;
2006         }
2007
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;
2013         }
2014
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;
2020
2021                 ret = crypto_cipher_setkey(tfm, key, serp_tv[i].keylen);
2022                 if (ret) {
2023                         printk("setkey() failed flags=%x\n", tfm->crt_flags);
2024
2025                         if (!serp_tv[i].fail)
2026                                 goto out;
2027                 }
2028
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;
2037                 }
2038
2039                 q = kmap(sg[0].page) + sg[0].offset;
2040                 hexdump(q, sizeof(serp_tv[i].result));
2041
2042                 printk("%s\n", memcmp(q, serp_tv[i].result,
2043                         sizeof(serp_tv[i].result)) ? "fail" : "pass");
2044         }
2045
2046         printk("\ntesting serpent decryption\n");
2047
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;
2053         }
2054
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;
2060
2061                 ret = crypto_cipher_setkey(tfm, key, serp_tv[i].keylen);
2062                 if (ret) {
2063                         printk("setkey() failed flags=%x\n", tfm->crt_flags);
2064
2065                         if (!serp_tv[i].fail)
2066                                 goto out;
2067                 }
2068
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;
2077                 }
2078
2079                 q = kmap(sg[0].page) + sg[0].offset;
2080                 hexdump(q, sizeof(serp_tv[i].result));
2081
2082                 printk("%s\n", memcmp(q, serp_tv[i].result,
2083                         sizeof(serp_tv[i].result)) ? "fail" : "pass");
2084         }
2085
2086 out:
2087         crypto_free_tfm(tfm);
2088 }
2089
2090 void
2091 test_aes(void)
2092 {
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];
2100
2101         printk("\ntesting aes encryption\n");
2102
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;
2108         }
2109
2110         memcpy(tvmem, aes_enc_tv_template, tsize);
2111         aes_tv = (void *) tvmem;
2112
2113         tfm = crypto_alloc_tfm("aes", 0);
2114         if (tfm == NULL) {
2115                 printk("failed to load transform for aes (default ecb)\n");
2116                 return;
2117         }
2118
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;
2123
2124                 ret = crypto_cipher_setkey(tfm, key, aes_tv[i].keylen);
2125                 if (ret) {
2126                         printk("setkey() failed flags=%x\n", tfm->crt_flags);
2127
2128                         if (!aes_tv[i].fail)
2129                                 goto out;
2130                 }
2131
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;
2140                 }
2141
2142                 q = kmap(sg[0].page) + sg[0].offset;
2143                 hexdump(q, aes_tv[i].rlen);
2144
2145                 printk("%s\n", memcmp(q, aes_tv[i].result, aes_tv[i].rlen) ?
2146                         "fail" : "pass");
2147         }
2148         
2149         printk("\ntesting aes decryption\n");
2150
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;
2156         }
2157
2158         memcpy(tvmem, aes_dec_tv_template, tsize);
2159         aes_tv = (void *) tvmem;
2160
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;
2165
2166                 ret = crypto_cipher_setkey(tfm, key, aes_tv[i].keylen);
2167                 if (ret) {
2168                         printk("setkey() failed flags=%x\n", tfm->crt_flags);
2169
2170                         if (!aes_tv[i].fail)
2171                                 goto out;
2172                 }
2173
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;
2182                 }
2183
2184                 q = kmap(sg[0].page) + sg[0].offset;
2185                 hexdump(q, aes_tv[i].rlen);
2186
2187                 printk("%s\n", memcmp(q, aes_tv[i].result, aes_tv[i].rlen) ?
2188                         "fail" : "pass");
2189         }
2190
2191 out:
2192         crypto_free_tfm(tfm);
2193 }
2194
2195 static void
2196 test_deflate(void)
2197 {
2198         unsigned int i;
2199         char result[COMP_BUF_SIZE];
2200         struct crypto_tfm *tfm;
2201         struct comp_testvec *tv;
2202         unsigned int tsize;
2203
2204         printk("\ntesting deflate compression\n");
2205
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;
2211         }
2212
2213         memcpy(tvmem, deflate_comp_tv_template, tsize);
2214         tv = (void *) tvmem;
2215
2216         tfm = crypto_alloc_tfm("deflate", 0);
2217         if (tfm == NULL) {
2218                 printk("failed to load transform for deflate\n");
2219                 return;
2220         }
2221
2222         for (i = 0; i < DEFLATE_COMP_TEST_VECTORS; i++) {
2223                 int ilen, ret, dlen = COMP_BUF_SIZE;
2224                 
2225                 printk("test %u:\n", i + 1);
2226                 memset(result, 0, sizeof (result));
2227
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;
2234                 }
2235                 hexdump(result, dlen);
2236                 printk("%s (ratio %d:%d)\n",
2237                        memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
2238                        ilen, dlen);
2239         }
2240
2241         printk("\ntesting deflate decompression\n");
2242
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;
2248         }
2249
2250         memcpy(tvmem, deflate_decomp_tv_template, tsize);
2251         tv = (void *) tvmem;
2252
2253         for (i = 0; i < DEFLATE_DECOMP_TEST_VECTORS; i++) {
2254                 int ilen, ret, dlen = COMP_BUF_SIZE;
2255                 
2256                 printk("test %u:\n", i + 1);
2257                 memset(result, 0, sizeof (result));
2258
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;
2265                 }
2266                 hexdump(result, dlen);
2267                 printk("%s (ratio %d:%d)\n",
2268                        memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
2269                        ilen, dlen);
2270         }
2271 out:
2272         crypto_free_tfm(tfm);
2273 }
2274
2275 static void
2276 test_available(void)
2277 {
2278         char **name = check;
2279         
2280         while (*name) {
2281                 printk("alg %s ", *name);
2282                 printk((crypto_alg_available(*name, 0)) ?
2283                         "found\n" : "not found\n");
2284                 name++;
2285         }       
2286 }
2287
2288 static void
2289 do_test(void)
2290 {
2291         switch (mode) {
2292
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;
2313
2314         case 1:
2315                 test_md5();
2316                 break;
2317
2318         case 2:
2319                 test_sha1();
2320                 break;
2321
2322         case 3:
2323                 test_des();
2324                 break;
2325
2326         case 4:
2327                 test_des3_ede();
2328                 break;
2329
2330         case 5:
2331                 test_md4();
2332                 break;
2333                 
2334         case 6:
2335                 test_sha256();
2336                 break;
2337         
2338         case 7:
2339                 test_blowfish();
2340                 break;
2341
2342         case 8:
2343                 test_twofish();
2344                 break;
2345
2346         case 9:
2347                 test_serpent();
2348                 break;
2349
2350         case 10:
2351                 test_aes();
2352                 break;
2353
2354         case 11:
2355                 test_sha384();
2356                 break;
2357                 
2358         case 12:
2359                 test_sha512();
2360                 break;
2361
2362         case 13:
2363                 test_deflate();
2364                 break;
2365
2366 #ifdef CONFIG_CRYPTO_HMAC
2367         case 100:
2368                 test_hmac_md5();
2369                 break;
2370                 
2371         case 101:
2372                 test_hmac_sha1();
2373                 break;
2374         
2375         case 102:
2376                 test_hmac_sha256();
2377                 break;
2378
2379 #endif
2380
2381         case 1000:
2382                 test_available();
2383                 break;
2384                 
2385         default:
2386                 /* useful for debugging */
2387                 printk("not testing anything\n");
2388                 break;
2389         }
2390 }
2391
2392 static int __init
2393 init(void)
2394 {
2395         tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL);
2396         if (tvmem == NULL)
2397                 return -ENOMEM;
2398
2399         xbuf = kmalloc(XBUFSIZE, GFP_KERNEL);
2400         if (xbuf == NULL) {
2401                 kfree(tvmem);
2402                 return -ENOMEM;
2403         }
2404
2405         do_test();
2406
2407         kfree(xbuf);
2408         kfree(tvmem);
2409         return 0;
2410 }
2411
2412 module_init(init);
2413
2414 MODULE_PARM(mode, "i");
2415
2416 MODULE_LICENSE("GPL");
2417 MODULE_DESCRIPTION("Quick & dirty crypto testing module");
2418 MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");