[CRYPTO] tcrypt: Add common compression tester function
[linux-flexiantxendom0-natty.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  * Copyright (c) 2007 Nokia Siemens Networks
10  *
11  * This program is free software; you can redistribute it and/or modify it
12  * under the terms of the GNU General Public License as published by the Free
13  * Software Foundation; either version 2 of the License, or (at your option)
14  * any later version.
15  *
16  * 2007-11-13 Added GCM tests
17  * 2007-11-13 Added AEAD support
18  * 2007-11-06 Added SHA-224 and SHA-224-HMAC tests
19  * 2006-12-07 Added SHA384 HMAC and SHA512 HMAC tests
20  * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>)
21  * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt
22  *
23  */
24
25 #include <linux/err.h>
26 #include <linux/init.h>
27 #include <linux/module.h>
28 #include <linux/mm.h>
29 #include <linux/slab.h>
30 #include <linux/scatterlist.h>
31 #include <linux/string.h>
32 #include <linux/crypto.h>
33 #include <linux/highmem.h>
34 #include <linux/moduleparam.h>
35 #include <linux/jiffies.h>
36 #include <linux/timex.h>
37 #include <linux/interrupt.h>
38 #include "tcrypt.h"
39
40 /*
41  * Need to kmalloc() memory for testing kmap().
42  */
43 #define TVMEMSIZE       16384
44 #define XBUFSIZE        32768
45
46 /*
47  * Indexes into the xbuf to simulate cross-page access.
48  */
49 #define IDX1            37
50 #define IDX2            32400
51 #define IDX3            1
52 #define IDX4            8193
53 #define IDX5            22222
54 #define IDX6            17101
55 #define IDX7            27333
56 #define IDX8            3000
57
58 /*
59 * Used by test_cipher()
60 */
61 #define ENCRYPT 1
62 #define DECRYPT 0
63
64 struct tcrypt_result {
65         struct completion completion;
66         int err;
67 };
68
69 static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
70
71 /*
72  * Used by test_cipher_speed()
73  */
74 static unsigned int sec;
75
76 static int mode;
77 static char *xbuf;
78 static char *axbuf;
79 static char *tvmem;
80
81 static char *check[] = {
82         "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
83         "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
84         "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
85         "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
86         "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta",  "fcrypt",
87         "camellia", "seed", "salsa20", NULL
88 };
89
90 static void hexdump(unsigned char *buf, unsigned int len)
91 {
92         print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
93                         16, 1,
94                         buf, len, false);
95 }
96
97 static void tcrypt_complete(struct crypto_async_request *req, int err)
98 {
99         struct tcrypt_result *res = req->data;
100
101         if (err == -EINPROGRESS)
102                 return;
103
104         res->err = err;
105         complete(&res->completion);
106 }
107
108 static void test_hash(char *algo, struct hash_testvec *template,
109                       unsigned int tcount)
110 {
111         unsigned int i, j, k, temp;
112         struct scatterlist sg[8];
113         char result[64];
114         struct crypto_hash *tfm;
115         struct hash_desc desc;
116         struct hash_testvec *hash_tv;
117         unsigned int tsize;
118         int ret;
119
120         printk("\ntesting %s\n", algo);
121
122         tsize = sizeof(struct hash_testvec);
123         tsize *= tcount;
124
125         if (tsize > TVMEMSIZE) {
126                 printk("template (%u) too big for tvmem (%u)\n", tsize, TVMEMSIZE);
127                 return;
128         }
129
130         memcpy(tvmem, template, tsize);
131         hash_tv = (void *)tvmem;
132
133         tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
134         if (IS_ERR(tfm)) {
135                 printk("failed to load transform for %s: %ld\n", algo,
136                        PTR_ERR(tfm));
137                 return;
138         }
139
140         desc.tfm = tfm;
141         desc.flags = 0;
142
143         for (i = 0; i < tcount; i++) {
144                 printk("test %u:\n", i + 1);
145                 memset(result, 0, 64);
146
147                 sg_init_one(&sg[0], hash_tv[i].plaintext, hash_tv[i].psize);
148
149                 if (hash_tv[i].ksize) {
150                         ret = crypto_hash_setkey(tfm, hash_tv[i].key,
151                                                  hash_tv[i].ksize);
152                         if (ret) {
153                                 printk("setkey() failed ret=%d\n", ret);
154                                 goto out;
155                         }
156                 }
157
158                 ret = crypto_hash_digest(&desc, sg, hash_tv[i].psize, result);
159                 if (ret) {
160                         printk("digest () failed ret=%d\n", ret);
161                         goto out;
162                 }
163
164                 hexdump(result, crypto_hash_digestsize(tfm));
165                 printk("%s\n",
166                        memcmp(result, hash_tv[i].digest,
167                               crypto_hash_digestsize(tfm)) ?
168                        "fail" : "pass");
169         }
170
171         printk("testing %s across pages\n", algo);
172
173         /* setup the dummy buffer first */
174         memset(xbuf, 0, XBUFSIZE);
175         memset(axbuf, 0, XBUFSIZE);
176
177         j = 0;
178         for (i = 0; i < tcount; i++) {
179                 if (hash_tv[i].np) {
180                         j++;
181                         printk("test %u:\n", j);
182                         memset(result, 0, 64);
183
184                         temp = 0;
185                         sg_init_table(sg, hash_tv[i].np);
186                         for (k = 0; k < hash_tv[i].np; k++) {
187                                 memcpy(&xbuf[IDX[k]],
188                                        hash_tv[i].plaintext + temp,
189                                        hash_tv[i].tap[k]);
190                                 temp += hash_tv[i].tap[k];
191                                 sg_set_buf(&sg[k], &xbuf[IDX[k]],
192                                             hash_tv[i].tap[k]);
193                         }
194
195                         if (hash_tv[i].ksize) {
196                                 ret = crypto_hash_setkey(tfm, hash_tv[i].key,
197                                                          hash_tv[i].ksize);
198
199                                 if (ret) {
200                                         printk("setkey() failed ret=%d\n", ret);
201                                         goto out;
202                                 }
203                         }
204
205                         ret = crypto_hash_digest(&desc, sg, hash_tv[i].psize,
206                                                  result);
207                         if (ret) {
208                                 printk("digest () failed ret=%d\n", ret);
209                                 goto out;
210                         }
211
212                         hexdump(result, crypto_hash_digestsize(tfm));
213                         printk("%s\n",
214                                memcmp(result, hash_tv[i].digest,
215                                       crypto_hash_digestsize(tfm)) ?
216                                "fail" : "pass");
217                 }
218         }
219
220 out:
221         crypto_free_hash(tfm);
222 }
223
224 static void test_aead(char *algo, int enc, struct aead_testvec *template,
225                       unsigned int tcount)
226 {
227         unsigned int ret, i, j, k, temp;
228         unsigned int tsize;
229         char *q;
230         struct crypto_aead *tfm;
231         char *key;
232         struct aead_testvec *aead_tv;
233         struct aead_request *req;
234         struct scatterlist sg[8];
235         struct scatterlist asg[8];
236         const char *e;
237         struct tcrypt_result result;
238         unsigned int authsize;
239
240         if (enc == ENCRYPT)
241                 e = "encryption";
242         else
243                 e = "decryption";
244
245         printk(KERN_INFO "\ntesting %s %s\n", algo, e);
246
247         tsize = sizeof(struct aead_testvec);
248         tsize *= tcount;
249
250         if (tsize > TVMEMSIZE) {
251                 printk(KERN_INFO "template (%u) too big for tvmem (%u)\n",
252                        tsize, TVMEMSIZE);
253                 return;
254         }
255
256         memcpy(tvmem, template, tsize);
257         aead_tv = (void *)tvmem;
258
259         init_completion(&result.completion);
260
261         tfm = crypto_alloc_aead(algo, 0, 0);
262
263         if (IS_ERR(tfm)) {
264                 printk(KERN_INFO "failed to load transform for %s: %ld\n",
265                        algo, PTR_ERR(tfm));
266                 return;
267         }
268
269         authsize = crypto_aead_authsize(tfm);
270
271         req = aead_request_alloc(tfm, GFP_KERNEL);
272         if (!req) {
273                 printk(KERN_INFO "failed to allocate request for %s\n", algo);
274                 goto out;
275         }
276
277         aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
278                                   tcrypt_complete, &result);
279
280         for (i = 0, j = 0; i < tcount; i++) {
281                 if (!aead_tv[i].np) {
282                         printk(KERN_INFO "test %u (%d bit key):\n",
283                                ++j, aead_tv[i].klen * 8);
284
285                         crypto_aead_clear_flags(tfm, ~0);
286                         if (aead_tv[i].wk)
287                                 crypto_aead_set_flags(
288                                         tfm, CRYPTO_TFM_REQ_WEAK_KEY);
289                         key = aead_tv[i].key;
290
291                         ret = crypto_aead_setkey(tfm, key,
292                                                  aead_tv[i].klen);
293                         if (ret) {
294                                 printk(KERN_INFO "setkey() failed flags=%x\n",
295                                        crypto_aead_get_flags(tfm));
296
297                                 if (!aead_tv[i].fail)
298                                         goto out;
299                         }
300
301                         sg_init_one(&sg[0], aead_tv[i].input,
302                                     aead_tv[i].ilen + (enc ? authsize : 0));
303
304                         sg_init_one(&asg[0], aead_tv[i].assoc,
305                                     aead_tv[i].alen);
306
307                         aead_request_set_crypt(req, sg, sg,
308                                                aead_tv[i].ilen,
309                                                aead_tv[i].iv);
310
311                         aead_request_set_assoc(req, asg, aead_tv[i].alen);
312
313                         ret = enc ?
314                                 crypto_aead_encrypt(req) :
315                                 crypto_aead_decrypt(req);
316
317                         switch (ret) {
318                         case 0:
319                                 break;
320                         case -EINPROGRESS:
321                         case -EBUSY:
322                                 ret = wait_for_completion_interruptible(
323                                         &result.completion);
324                                 if (!ret && !(ret = result.err)) {
325                                         INIT_COMPLETION(result.completion);
326                                         break;
327                                 }
328                                 /* fall through */
329                         default:
330                                 printk(KERN_INFO "%s () failed err=%d\n",
331                                        e, -ret);
332                                 goto out;
333                         }
334
335                         q = kmap(sg_page(&sg[0])) + sg[0].offset;
336                         hexdump(q, aead_tv[i].rlen);
337
338                         printk(KERN_INFO "enc/dec: %s\n",
339                                memcmp(q, aead_tv[i].result,
340                                       aead_tv[i].rlen) ? "fail" : "pass");
341                 }
342         }
343
344         printk(KERN_INFO "\ntesting %s %s across pages (chunking)\n", algo, e);
345         memset(xbuf, 0, XBUFSIZE);
346
347         for (i = 0, j = 0; i < tcount; i++) {
348                 if (aead_tv[i].np) {
349                         printk(KERN_INFO "test %u (%d bit key):\n",
350                                ++j, aead_tv[i].klen * 8);
351
352                         crypto_aead_clear_flags(tfm, ~0);
353                         if (aead_tv[i].wk)
354                                 crypto_aead_set_flags(
355                                         tfm, CRYPTO_TFM_REQ_WEAK_KEY);
356                         key = aead_tv[i].key;
357
358                         ret = crypto_aead_setkey(tfm, key, aead_tv[i].klen);
359                         if (ret) {
360                                 printk(KERN_INFO "setkey() failed flags=%x\n",
361                                        crypto_aead_get_flags(tfm));
362
363                                 if (!aead_tv[i].fail)
364                                         goto out;
365                         }
366
367                         sg_init_table(sg, aead_tv[i].np);
368                         for (k = 0, temp = 0; k < aead_tv[i].np; k++) {
369                                 memcpy(&xbuf[IDX[k]],
370                                        aead_tv[i].input + temp,
371                                        aead_tv[i].tap[k]);
372                                 temp += aead_tv[i].tap[k];
373                                 sg_set_buf(&sg[k], &xbuf[IDX[k]],
374                                            aead_tv[i].tap[k]);
375                         }
376
377                         if (enc)
378                                 sg[k - 1].length += authsize;
379
380                         sg_init_table(asg, aead_tv[i].anp);
381                         for (k = 0, temp = 0; k < aead_tv[i].anp; k++) {
382                                 memcpy(&axbuf[IDX[k]],
383                                        aead_tv[i].assoc + temp,
384                                        aead_tv[i].atap[k]);
385                                 temp += aead_tv[i].atap[k];
386                                 sg_set_buf(&asg[k], &axbuf[IDX[k]],
387                                            aead_tv[i].atap[k]);
388                         }
389
390                         aead_request_set_crypt(req, sg, sg,
391                                                aead_tv[i].ilen,
392                                                aead_tv[i].iv);
393
394                         aead_request_set_assoc(req, asg, aead_tv[i].alen);
395
396                         ret = enc ?
397                                 crypto_aead_encrypt(req) :
398                                 crypto_aead_decrypt(req);
399
400                         switch (ret) {
401                         case 0:
402                                 break;
403                         case -EINPROGRESS:
404                         case -EBUSY:
405                                 ret = wait_for_completion_interruptible(
406                                         &result.completion);
407                                 if (!ret && !(ret = result.err)) {
408                                         INIT_COMPLETION(result.completion);
409                                         break;
410                                 }
411                                 /* fall through */
412                         default:
413                                 printk(KERN_INFO "%s () failed err=%d\n",
414                                        e, -ret);
415                                 goto out;
416                         }
417
418                         for (k = 0, temp = 0; k < aead_tv[i].np; k++) {
419                                 printk(KERN_INFO "page %u\n", k);
420                                 q = kmap(sg_page(&sg[k])) + sg[k].offset;
421                                 hexdump(q, aead_tv[i].tap[k]);
422                                 printk(KERN_INFO "%s\n",
423                                        memcmp(q, aead_tv[i].result + temp,
424                                               aead_tv[i].tap[k] -
425                                               (k < aead_tv[i].np - 1 || enc ?
426                                                0 : authsize)) ?
427                                        "fail" : "pass");
428
429                                 temp += aead_tv[i].tap[k];
430                         }
431                 }
432         }
433
434 out:
435         crypto_free_aead(tfm);
436         aead_request_free(req);
437 }
438
439 static void test_cipher(char *algo, int enc,
440                         struct cipher_testvec *template, unsigned int tcount)
441 {
442         unsigned int ret, i, j, k, temp;
443         unsigned int tsize;
444         char *q;
445         struct crypto_ablkcipher *tfm;
446         char *key;
447         struct cipher_testvec *cipher_tv;
448         struct ablkcipher_request *req;
449         struct scatterlist sg[8];
450         const char *e;
451         struct tcrypt_result result;
452
453         if (enc == ENCRYPT)
454                 e = "encryption";
455         else
456                 e = "decryption";
457
458         printk("\ntesting %s %s\n", algo, e);
459
460         tsize = sizeof (struct cipher_testvec);
461         if (tsize > TVMEMSIZE) {
462                 printk("template (%u) too big for tvmem (%u)\n", tsize,
463                        TVMEMSIZE);
464                 return;
465         }
466         cipher_tv = (void *)tvmem;
467
468         init_completion(&result.completion);
469
470         tfm = crypto_alloc_ablkcipher(algo, 0, 0);
471
472         if (IS_ERR(tfm)) {
473                 printk("failed to load transform for %s: %ld\n", algo,
474                        PTR_ERR(tfm));
475                 return;
476         }
477
478         req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
479         if (!req) {
480                 printk("failed to allocate request for %s\n", algo);
481                 goto out;
482         }
483
484         ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
485                                         tcrypt_complete, &result);
486
487         j = 0;
488         for (i = 0; i < tcount; i++) {
489                 memcpy(cipher_tv, &template[i], tsize);
490                 if (!(cipher_tv->np)) {
491                         j++;
492                         printk("test %u (%d bit key):\n",
493                         j, cipher_tv->klen * 8);
494
495                         crypto_ablkcipher_clear_flags(tfm, ~0);
496                         if (cipher_tv->wk)
497                                 crypto_ablkcipher_set_flags(
498                                         tfm, CRYPTO_TFM_REQ_WEAK_KEY);
499                         key = cipher_tv->key;
500
501                         ret = crypto_ablkcipher_setkey(tfm, key,
502                                                        cipher_tv->klen);
503                         if (ret) {
504                                 printk("setkey() failed flags=%x\n",
505                                        crypto_ablkcipher_get_flags(tfm));
506
507                                 if (!cipher_tv->fail)
508                                         goto out;
509                         }
510
511                         sg_init_one(&sg[0], cipher_tv->input,
512                                     cipher_tv->ilen);
513
514                         ablkcipher_request_set_crypt(req, sg, sg,
515                                                      cipher_tv->ilen,
516                                                      cipher_tv->iv);
517
518                         ret = enc ?
519                                 crypto_ablkcipher_encrypt(req) :
520                                 crypto_ablkcipher_decrypt(req);
521
522                         switch (ret) {
523                         case 0:
524                                 break;
525                         case -EINPROGRESS:
526                         case -EBUSY:
527                                 ret = wait_for_completion_interruptible(
528                                         &result.completion);
529                                 if (!ret && !((ret = result.err))) {
530                                         INIT_COMPLETION(result.completion);
531                                         break;
532                                 }
533                                 /* fall through */
534                         default:
535                                 printk("%s () failed err=%d\n", e, -ret);
536                                 goto out;
537                         }
538
539                         q = kmap(sg_page(&sg[0])) + sg[0].offset;
540                         hexdump(q, cipher_tv->rlen);
541
542                         printk("%s\n",
543                                memcmp(q, cipher_tv->result,
544                                       cipher_tv->rlen) ? "fail" : "pass");
545                 }
546         }
547
548         printk("\ntesting %s %s across pages (chunking)\n", algo, e);
549         memset(xbuf, 0, XBUFSIZE);
550
551         j = 0;
552         for (i = 0; i < tcount; i++) {
553                 memcpy(cipher_tv, &template[i], tsize);
554                 if (cipher_tv->np) {
555                         j++;
556                         printk("test %u (%d bit key):\n",
557                         j, cipher_tv->klen * 8);
558
559                         crypto_ablkcipher_clear_flags(tfm, ~0);
560                         if (cipher_tv->wk)
561                                 crypto_ablkcipher_set_flags(
562                                         tfm, CRYPTO_TFM_REQ_WEAK_KEY);
563                         key = cipher_tv->key;
564
565                         ret = crypto_ablkcipher_setkey(tfm, key,
566                                                        cipher_tv->klen);
567                         if (ret) {
568                                 printk("setkey() failed flags=%x\n",
569                                        crypto_ablkcipher_get_flags(tfm));
570
571                                 if (!cipher_tv->fail)
572                                         goto out;
573                         }
574
575                         temp = 0;
576                         sg_init_table(sg, cipher_tv->np);
577                         for (k = 0; k < cipher_tv->np; k++) {
578                                 memcpy(&xbuf[IDX[k]],
579                                        cipher_tv->input + temp,
580                                        cipher_tv->tap[k]);
581                                 temp += cipher_tv->tap[k];
582                                 sg_set_buf(&sg[k], &xbuf[IDX[k]],
583                                            cipher_tv->tap[k]);
584                         }
585
586                         ablkcipher_request_set_crypt(req, sg, sg,
587                                                      cipher_tv->ilen,
588                                                      cipher_tv->iv);
589
590                         ret = enc ?
591                                 crypto_ablkcipher_encrypt(req) :
592                                 crypto_ablkcipher_decrypt(req);
593
594                         switch (ret) {
595                         case 0:
596                                 break;
597                         case -EINPROGRESS:
598                         case -EBUSY:
599                                 ret = wait_for_completion_interruptible(
600                                         &result.completion);
601                                 if (!ret && !((ret = result.err))) {
602                                         INIT_COMPLETION(result.completion);
603                                         break;
604                                 }
605                                 /* fall through */
606                         default:
607                                 printk("%s () failed err=%d\n", e, -ret);
608                                 goto out;
609                         }
610
611                         temp = 0;
612                         for (k = 0; k < cipher_tv->np; k++) {
613                                 printk("page %u\n", k);
614                                 q = kmap(sg_page(&sg[k])) + sg[k].offset;
615                                 hexdump(q, cipher_tv->tap[k]);
616                                 printk("%s\n",
617                                         memcmp(q, cipher_tv->result + temp,
618                                                 cipher_tv->tap[k]) ? "fail" :
619                                         "pass");
620                                 temp += cipher_tv->tap[k];
621                         }
622                 }
623         }
624
625 out:
626         crypto_free_ablkcipher(tfm);
627         ablkcipher_request_free(req);
628 }
629
630 static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc, char *p,
631                                int blen, int sec)
632 {
633         struct scatterlist sg[1];
634         unsigned long start, end;
635         int bcount;
636         int ret;
637
638         sg_init_one(sg, p, blen);
639
640         for (start = jiffies, end = start + sec * HZ, bcount = 0;
641              time_before(jiffies, end); bcount++) {
642                 if (enc)
643                         ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
644                 else
645                         ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
646
647                 if (ret)
648                         return ret;
649         }
650
651         printk("%d operations in %d seconds (%ld bytes)\n",
652                bcount, sec, (long)bcount * blen);
653         return 0;
654 }
655
656 static int test_cipher_cycles(struct blkcipher_desc *desc, int enc, char *p,
657                               int blen)
658 {
659         struct scatterlist sg[1];
660         unsigned long cycles = 0;
661         int ret = 0;
662         int i;
663
664         sg_init_one(sg, p, blen);
665
666         local_bh_disable();
667         local_irq_disable();
668
669         /* Warm-up run. */
670         for (i = 0; i < 4; i++) {
671                 if (enc)
672                         ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
673                 else
674                         ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
675
676                 if (ret)
677                         goto out;
678         }
679
680         /* The real thing. */
681         for (i = 0; i < 8; i++) {
682                 cycles_t start, end;
683
684                 start = get_cycles();
685                 if (enc)
686                         ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
687                 else
688                         ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
689                 end = get_cycles();
690
691                 if (ret)
692                         goto out;
693
694                 cycles += end - start;
695         }
696
697 out:
698         local_irq_enable();
699         local_bh_enable();
700
701         if (ret == 0)
702                 printk("1 operation in %lu cycles (%d bytes)\n",
703                        (cycles + 4) / 8, blen);
704
705         return ret;
706 }
707
708 static void test_cipher_speed(char *algo, int enc, unsigned int sec,
709                               struct cipher_testvec *template,
710                               unsigned int tcount, struct cipher_speed *speed)
711 {
712         unsigned int ret, i, j, iv_len;
713         unsigned char *key, *p, iv[128];
714         struct crypto_blkcipher *tfm;
715         struct blkcipher_desc desc;
716         const char *e;
717
718         if (enc == ENCRYPT)
719                 e = "encryption";
720         else
721                 e = "decryption";
722
723         printk("\ntesting speed of %s %s\n", algo, e);
724
725         tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
726
727         if (IS_ERR(tfm)) {
728                 printk("failed to load transform for %s: %ld\n", algo,
729                        PTR_ERR(tfm));
730                 return;
731         }
732         desc.tfm = tfm;
733         desc.flags = 0;
734
735         for (i = 0; speed[i].klen != 0; i++) {
736                 if ((speed[i].blen + speed[i].klen) > TVMEMSIZE) {
737                         printk("template (%u) too big for tvmem (%u)\n",
738                                speed[i].blen + speed[i].klen, TVMEMSIZE);
739                         goto out;
740                 }
741
742                 printk("test %u (%d bit key, %d byte blocks): ", i,
743                        speed[i].klen * 8, speed[i].blen);
744
745                 memset(tvmem, 0xff, speed[i].klen + speed[i].blen);
746
747                 /* set key, plain text and IV */
748                 key = (unsigned char *)tvmem;
749                 for (j = 0; j < tcount; j++) {
750                         if (template[j].klen == speed[i].klen) {
751                                 key = template[j].key;
752                                 break;
753                         }
754                 }
755                 p = (unsigned char *)tvmem + speed[i].klen;
756
757                 ret = crypto_blkcipher_setkey(tfm, key, speed[i].klen);
758                 if (ret) {
759                         printk("setkey() failed flags=%x\n",
760                                crypto_blkcipher_get_flags(tfm));
761                         goto out;
762                 }
763
764                 iv_len = crypto_blkcipher_ivsize(tfm);
765                 if (iv_len) {
766                         memset(&iv, 0xff, iv_len);
767                         crypto_blkcipher_set_iv(tfm, iv, iv_len);
768                 }
769
770                 if (sec)
771                         ret = test_cipher_jiffies(&desc, enc, p, speed[i].blen,
772                                                   sec);
773                 else
774                         ret = test_cipher_cycles(&desc, enc, p, speed[i].blen);
775
776                 if (ret) {
777                         printk("%s() failed flags=%x\n", e, desc.flags);
778                         break;
779                 }
780         }
781
782 out:
783         crypto_free_blkcipher(tfm);
784 }
785
786 static int test_hash_jiffies_digest(struct hash_desc *desc, char *p, int blen,
787                                     char *out, int sec)
788 {
789         struct scatterlist sg[1];
790         unsigned long start, end;
791         int bcount;
792         int ret;
793
794         sg_init_table(sg, 1);
795
796         for (start = jiffies, end = start + sec * HZ, bcount = 0;
797              time_before(jiffies, end); bcount++) {
798                 sg_set_buf(sg, p, blen);
799                 ret = crypto_hash_digest(desc, sg, blen, out);
800                 if (ret)
801                         return ret;
802         }
803
804         printk("%6u opers/sec, %9lu bytes/sec\n",
805                bcount / sec, ((long)bcount * blen) / sec);
806
807         return 0;
808 }
809
810 static int test_hash_jiffies(struct hash_desc *desc, char *p, int blen,
811                              int plen, char *out, int sec)
812 {
813         struct scatterlist sg[1];
814         unsigned long start, end;
815         int bcount, pcount;
816         int ret;
817
818         if (plen == blen)
819                 return test_hash_jiffies_digest(desc, p, blen, out, sec);
820
821         sg_init_table(sg, 1);
822
823         for (start = jiffies, end = start + sec * HZ, bcount = 0;
824              time_before(jiffies, end); bcount++) {
825                 ret = crypto_hash_init(desc);
826                 if (ret)
827                         return ret;
828                 for (pcount = 0; pcount < blen; pcount += plen) {
829                         sg_set_buf(sg, p + pcount, plen);
830                         ret = crypto_hash_update(desc, sg, plen);
831                         if (ret)
832                                 return ret;
833                 }
834                 /* we assume there is enough space in 'out' for the result */
835                 ret = crypto_hash_final(desc, out);
836                 if (ret)
837                         return ret;
838         }
839
840         printk("%6u opers/sec, %9lu bytes/sec\n",
841                bcount / sec, ((long)bcount * blen) / sec);
842
843         return 0;
844 }
845
846 static int test_hash_cycles_digest(struct hash_desc *desc, char *p, int blen,
847                                    char *out)
848 {
849         struct scatterlist sg[1];
850         unsigned long cycles = 0;
851         int i;
852         int ret;
853
854         sg_init_table(sg, 1);
855
856         local_bh_disable();
857         local_irq_disable();
858
859         /* Warm-up run. */
860         for (i = 0; i < 4; i++) {
861                 sg_set_buf(sg, p, blen);
862                 ret = crypto_hash_digest(desc, sg, blen, out);
863                 if (ret)
864                         goto out;
865         }
866
867         /* The real thing. */
868         for (i = 0; i < 8; i++) {
869                 cycles_t start, end;
870
871                 start = get_cycles();
872
873                 sg_set_buf(sg, p, blen);
874                 ret = crypto_hash_digest(desc, sg, blen, out);
875                 if (ret)
876                         goto out;
877
878                 end = get_cycles();
879
880                 cycles += end - start;
881         }
882
883 out:
884         local_irq_enable();
885         local_bh_enable();
886
887         if (ret)
888                 return ret;
889
890         printk("%6lu cycles/operation, %4lu cycles/byte\n",
891                cycles / 8, cycles / (8 * blen));
892
893         return 0;
894 }
895
896 static int test_hash_cycles(struct hash_desc *desc, char *p, int blen,
897                             int plen, char *out)
898 {
899         struct scatterlist sg[1];
900         unsigned long cycles = 0;
901         int i, pcount;
902         int ret;
903
904         if (plen == blen)
905                 return test_hash_cycles_digest(desc, p, blen, out);
906
907         sg_init_table(sg, 1);
908
909         local_bh_disable();
910         local_irq_disable();
911
912         /* Warm-up run. */
913         for (i = 0; i < 4; i++) {
914                 ret = crypto_hash_init(desc);
915                 if (ret)
916                         goto out;
917                 for (pcount = 0; pcount < blen; pcount += plen) {
918                         sg_set_buf(sg, p + pcount, plen);
919                         ret = crypto_hash_update(desc, sg, plen);
920                         if (ret)
921                                 goto out;
922                 }
923                 ret = crypto_hash_final(desc, out);
924                 if (ret)
925                         goto out;
926         }
927
928         /* The real thing. */
929         for (i = 0; i < 8; i++) {
930                 cycles_t start, end;
931
932                 start = get_cycles();
933
934                 ret = crypto_hash_init(desc);
935                 if (ret)
936                         goto out;
937                 for (pcount = 0; pcount < blen; pcount += plen) {
938                         sg_set_buf(sg, p + pcount, plen);
939                         ret = crypto_hash_update(desc, sg, plen);
940                         if (ret)
941                                 goto out;
942                 }
943                 ret = crypto_hash_final(desc, out);
944                 if (ret)
945                         goto out;
946
947                 end = get_cycles();
948
949                 cycles += end - start;
950         }
951
952 out:
953         local_irq_enable();
954         local_bh_enable();
955
956         if (ret)
957                 return ret;
958
959         printk("%6lu cycles/operation, %4lu cycles/byte\n",
960                cycles / 8, cycles / (8 * blen));
961
962         return 0;
963 }
964
965 static void test_hash_speed(char *algo, unsigned int sec,
966                               struct hash_speed *speed)
967 {
968         struct crypto_hash *tfm;
969         struct hash_desc desc;
970         char output[1024];
971         int i;
972         int ret;
973
974         printk("\ntesting speed of %s\n", algo);
975
976         tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
977
978         if (IS_ERR(tfm)) {
979                 printk("failed to load transform for %s: %ld\n", algo,
980                        PTR_ERR(tfm));
981                 return;
982         }
983
984         desc.tfm = tfm;
985         desc.flags = 0;
986
987         if (crypto_hash_digestsize(tfm) > sizeof(output)) {
988                 printk("digestsize(%u) > outputbuffer(%zu)\n",
989                        crypto_hash_digestsize(tfm), sizeof(output));
990                 goto out;
991         }
992
993         for (i = 0; speed[i].blen != 0; i++) {
994                 if (speed[i].blen > TVMEMSIZE) {
995                         printk("template (%u) too big for tvmem (%u)\n",
996                                speed[i].blen, TVMEMSIZE);
997                         goto out;
998                 }
999
1000                 printk("test%3u (%5u byte blocks,%5u bytes per update,%4u updates): ",
1001                        i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
1002
1003                 memset(tvmem, 0xff, speed[i].blen);
1004
1005                 if (sec)
1006                         ret = test_hash_jiffies(&desc, tvmem, speed[i].blen,
1007                                                 speed[i].plen, output, sec);
1008                 else
1009                         ret = test_hash_cycles(&desc, tvmem, speed[i].blen,
1010                                                speed[i].plen, output);
1011
1012                 if (ret) {
1013                         printk("hashing failed ret=%d\n", ret);
1014                         break;
1015                 }
1016         }
1017
1018 out:
1019         crypto_free_hash(tfm);
1020 }
1021
1022 static void test_comp(char *algo, struct comp_testvec *ctemplate,
1023                        struct comp_testvec *dtemplate, int ctcount, int dtcount)
1024 {
1025         unsigned int i;
1026         char result[COMP_BUF_SIZE];
1027         struct crypto_comp *tfm;
1028         struct comp_testvec *tv;
1029         unsigned int tsize;
1030
1031         printk("\ntesting %s compression\n", algo);
1032
1033         tsize = sizeof(struct comp_testvec);
1034         tsize *= ctcount;
1035         if (tsize > TVMEMSIZE) {
1036                 printk("template (%u) too big for tvmem (%u)\n", tsize,
1037                        TVMEMSIZE);
1038                 return;
1039         }
1040
1041         memcpy(tvmem, ctemplate, tsize);
1042         tv = (void *)tvmem;
1043
1044         tfm = crypto_alloc_comp(algo, 0, CRYPTO_ALG_ASYNC);
1045         if (IS_ERR(tfm)) {
1046                 printk("failed to load transform for %s\n", algo);
1047                 return;
1048         }
1049
1050         for (i = 0; i < ctcount; i++) {
1051                 int ilen, ret, dlen = COMP_BUF_SIZE;
1052
1053                 printk("test %u:\n", i + 1);
1054                 memset(result, 0, sizeof (result));
1055
1056                 ilen = tv[i].inlen;
1057                 ret = crypto_comp_compress(tfm, tv[i].input,
1058                                            ilen, result, &dlen);
1059                 if (ret) {
1060                         printk("fail: ret=%d\n", ret);
1061                         continue;
1062                 }
1063                 hexdump(result, dlen);
1064                 printk("%s (ratio %d:%d)\n",
1065                        memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
1066                        ilen, dlen);
1067         }
1068
1069         printk("\ntesting %s decompression\n", algo);
1070
1071         tsize = sizeof(struct comp_testvec);
1072         tsize *= dtcount;
1073         if (tsize > TVMEMSIZE) {
1074                 printk("template (%u) too big for tvmem (%u)\n", tsize,
1075                        TVMEMSIZE);
1076                 goto out;
1077         }
1078
1079         memcpy(tvmem, dtemplate, tsize);
1080         tv = (void *)tvmem;
1081
1082         for (i = 0; i < dtcount; i++) {
1083                 int ilen, ret, dlen = COMP_BUF_SIZE;
1084
1085                 printk("test %u:\n", i + 1);
1086                 memset(result, 0, sizeof (result));
1087
1088                 ilen = tv[i].inlen;
1089                 ret = crypto_comp_decompress(tfm, tv[i].input,
1090                                              ilen, result, &dlen);
1091                 if (ret) {
1092                         printk("fail: ret=%d\n", ret);
1093                         continue;
1094                 }
1095                 hexdump(result, dlen);
1096                 printk("%s (ratio %d:%d)\n",
1097                        memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
1098                        ilen, dlen);
1099         }
1100 out:
1101         crypto_free_comp(tfm);
1102 }
1103
1104 static void test_available(void)
1105 {
1106         char **name = check;
1107
1108         while (*name) {
1109                 printk("alg %s ", *name);
1110                 printk(crypto_has_alg(*name, 0, 0) ?
1111                        "found\n" : "not found\n");
1112                 name++;
1113         }
1114 }
1115
1116 static void do_test(void)
1117 {
1118         switch (mode) {
1119
1120         case 0:
1121                 test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
1122
1123                 test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
1124
1125                 //DES
1126                 test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
1127                             DES_ENC_TEST_VECTORS);
1128                 test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
1129                             DES_DEC_TEST_VECTORS);
1130                 test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
1131                             DES_CBC_ENC_TEST_VECTORS);
1132                 test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
1133                             DES_CBC_DEC_TEST_VECTORS);
1134
1135                 //DES3_EDE
1136                 test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
1137                             DES3_EDE_ENC_TEST_VECTORS);
1138                 test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
1139                             DES3_EDE_DEC_TEST_VECTORS);
1140
1141                 test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
1142
1143                 test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);
1144
1145                 test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
1146
1147                 //BLOWFISH
1148                 test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
1149                             BF_ENC_TEST_VECTORS);
1150                 test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
1151                             BF_DEC_TEST_VECTORS);
1152                 test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
1153                             BF_CBC_ENC_TEST_VECTORS);
1154                 test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
1155                             BF_CBC_DEC_TEST_VECTORS);
1156
1157                 //TWOFISH
1158                 test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
1159                             TF_ENC_TEST_VECTORS);
1160                 test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
1161                             TF_DEC_TEST_VECTORS);
1162                 test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
1163                             TF_CBC_ENC_TEST_VECTORS);
1164                 test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
1165                             TF_CBC_DEC_TEST_VECTORS);
1166
1167                 //SERPENT
1168                 test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
1169                             SERPENT_ENC_TEST_VECTORS);
1170                 test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
1171                             SERPENT_DEC_TEST_VECTORS);
1172
1173                 //TNEPRES
1174                 test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
1175                             TNEPRES_ENC_TEST_VECTORS);
1176                 test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
1177                             TNEPRES_DEC_TEST_VECTORS);
1178
1179                 //AES
1180                 test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
1181                             AES_ENC_TEST_VECTORS);
1182                 test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
1183                             AES_DEC_TEST_VECTORS);
1184                 test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
1185                             AES_CBC_ENC_TEST_VECTORS);
1186                 test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
1187                             AES_CBC_DEC_TEST_VECTORS);
1188                 test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
1189                             AES_LRW_ENC_TEST_VECTORS);
1190                 test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
1191                             AES_LRW_DEC_TEST_VECTORS);
1192                 test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
1193                             AES_XTS_ENC_TEST_VECTORS);
1194                 test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
1195                             AES_XTS_DEC_TEST_VECTORS);
1196                 test_cipher("ctr(aes,4,8,4)", ENCRYPT, aes_ctr_enc_tv_template,
1197                             AES_CTR_ENC_TEST_VECTORS);
1198                 test_cipher("ctr(aes,4,8,4)", DECRYPT, aes_ctr_dec_tv_template,
1199                             AES_CTR_DEC_TEST_VECTORS);
1200                 test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template,
1201                           AES_GCM_ENC_TEST_VECTORS);
1202                 test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template,
1203                           AES_GCM_DEC_TEST_VECTORS);
1204
1205                 //CAST5
1206                 test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
1207                             CAST5_ENC_TEST_VECTORS);
1208                 test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
1209                             CAST5_DEC_TEST_VECTORS);
1210
1211                 //CAST6
1212                 test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
1213                             CAST6_ENC_TEST_VECTORS);
1214                 test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
1215                             CAST6_DEC_TEST_VECTORS);
1216
1217                 //ARC4
1218                 test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
1219                             ARC4_ENC_TEST_VECTORS);
1220                 test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
1221                             ARC4_DEC_TEST_VECTORS);
1222
1223                 //TEA
1224                 test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
1225                             TEA_ENC_TEST_VECTORS);
1226                 test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
1227                             TEA_DEC_TEST_VECTORS);
1228
1229
1230                 //XTEA
1231                 test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
1232                             XTEA_ENC_TEST_VECTORS);
1233                 test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
1234                             XTEA_DEC_TEST_VECTORS);
1235
1236                 //KHAZAD
1237                 test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
1238                             KHAZAD_ENC_TEST_VECTORS);
1239                 test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
1240                             KHAZAD_DEC_TEST_VECTORS);
1241
1242                 //ANUBIS
1243                 test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
1244                             ANUBIS_ENC_TEST_VECTORS);
1245                 test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
1246                             ANUBIS_DEC_TEST_VECTORS);
1247                 test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
1248                             ANUBIS_CBC_ENC_TEST_VECTORS);
1249                 test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
1250                             ANUBIS_CBC_ENC_TEST_VECTORS);
1251
1252                 //XETA
1253                 test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
1254                             XETA_ENC_TEST_VECTORS);
1255                 test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
1256                             XETA_DEC_TEST_VECTORS);
1257
1258                 //FCrypt
1259                 test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
1260                             FCRYPT_ENC_TEST_VECTORS);
1261                 test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
1262                             FCRYPT_DEC_TEST_VECTORS);
1263
1264                 //CAMELLIA
1265                 test_cipher("ecb(camellia)", ENCRYPT,
1266                             camellia_enc_tv_template,
1267                             CAMELLIA_ENC_TEST_VECTORS);
1268                 test_cipher("ecb(camellia)", DECRYPT,
1269                             camellia_dec_tv_template,
1270                             CAMELLIA_DEC_TEST_VECTORS);
1271                 test_cipher("cbc(camellia)", ENCRYPT,
1272                             camellia_cbc_enc_tv_template,
1273                             CAMELLIA_CBC_ENC_TEST_VECTORS);
1274                 test_cipher("cbc(camellia)", DECRYPT,
1275                             camellia_cbc_dec_tv_template,
1276                             CAMELLIA_CBC_DEC_TEST_VECTORS);
1277
1278                 //SEED
1279                 test_cipher("ecb(seed)", ENCRYPT, seed_enc_tv_template,
1280                             SEED_ENC_TEST_VECTORS);
1281                 test_cipher("ecb(seed)", DECRYPT, seed_dec_tv_template,
1282                             SEED_DEC_TEST_VECTORS);
1283
1284                 test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
1285                 test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
1286                 test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
1287                 test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
1288                 test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
1289                 test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
1290                 test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
1291                 test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
1292                 test_comp("deflate", deflate_comp_tv_template,
1293                           deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
1294                           DEFLATE_DECOMP_TEST_VECTORS);
1295                 test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
1296                 test_hash("hmac(md5)", hmac_md5_tv_template,
1297                           HMAC_MD5_TEST_VECTORS);
1298                 test_hash("hmac(sha1)", hmac_sha1_tv_template,
1299                           HMAC_SHA1_TEST_VECTORS);
1300                 test_hash("hmac(sha224)", hmac_sha224_tv_template,
1301                           HMAC_SHA224_TEST_VECTORS);
1302                 test_hash("hmac(sha256)", hmac_sha256_tv_template,
1303                           HMAC_SHA256_TEST_VECTORS);
1304                 test_hash("hmac(sha384)", hmac_sha384_tv_template,
1305                           HMAC_SHA384_TEST_VECTORS);
1306                 test_hash("hmac(sha512)", hmac_sha512_tv_template,
1307                           HMAC_SHA512_TEST_VECTORS);
1308
1309                 test_hash("xcbc(aes)", aes_xcbc128_tv_template,
1310                           XCBC_AES_TEST_VECTORS);
1311
1312                 test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
1313                 break;
1314
1315         case 1:
1316                 test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
1317                 break;
1318
1319         case 2:
1320                 test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
1321                 break;
1322
1323         case 3:
1324                 test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
1325                             DES_ENC_TEST_VECTORS);
1326                 test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
1327                             DES_DEC_TEST_VECTORS);
1328                 test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
1329                             DES_CBC_ENC_TEST_VECTORS);
1330                 test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
1331                             DES_CBC_DEC_TEST_VECTORS);
1332                 break;
1333
1334         case 4:
1335                 test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
1336                             DES3_EDE_ENC_TEST_VECTORS);
1337                 test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
1338                             DES3_EDE_DEC_TEST_VECTORS);
1339                 break;
1340
1341         case 5:
1342                 test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
1343                 break;
1344
1345         case 6:
1346                 test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
1347                 break;
1348
1349         case 7:
1350                 test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
1351                             BF_ENC_TEST_VECTORS);
1352                 test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
1353                             BF_DEC_TEST_VECTORS);
1354                 test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
1355                             BF_CBC_ENC_TEST_VECTORS);
1356                 test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
1357                             BF_CBC_DEC_TEST_VECTORS);
1358                 break;
1359
1360         case 8:
1361                 test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
1362                             TF_ENC_TEST_VECTORS);
1363                 test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
1364                             TF_DEC_TEST_VECTORS);
1365                 test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
1366                             TF_CBC_ENC_TEST_VECTORS);
1367                 test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
1368                             TF_CBC_DEC_TEST_VECTORS);
1369                 break;
1370
1371         case 9:
1372                 test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
1373                             SERPENT_ENC_TEST_VECTORS);
1374                 test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
1375                             SERPENT_DEC_TEST_VECTORS);
1376                 break;
1377
1378         case 10:
1379                 test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
1380                             AES_ENC_TEST_VECTORS);
1381                 test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
1382                             AES_DEC_TEST_VECTORS);
1383                 test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
1384                             AES_CBC_ENC_TEST_VECTORS);
1385                 test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
1386                             AES_CBC_DEC_TEST_VECTORS);
1387                 test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
1388                             AES_LRW_ENC_TEST_VECTORS);
1389                 test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
1390                             AES_LRW_DEC_TEST_VECTORS);
1391                 test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
1392                             AES_XTS_ENC_TEST_VECTORS);
1393                 test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
1394                             AES_XTS_DEC_TEST_VECTORS);
1395                 test_cipher("ctr(aes,4,8,4)", ENCRYPT, aes_ctr_enc_tv_template,
1396                             AES_CTR_ENC_TEST_VECTORS);
1397                 test_cipher("ctr(aes,4,8,4)", DECRYPT, aes_ctr_dec_tv_template,
1398                             AES_CTR_DEC_TEST_VECTORS);
1399                 break;
1400
1401         case 11:
1402                 test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
1403                 break;
1404
1405         case 12:
1406                 test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
1407                 break;
1408
1409         case 13:
1410                 test_comp("deflate", deflate_comp_tv_template,
1411                           deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
1412                           DEFLATE_DECOMP_TEST_VECTORS);
1413                 break;
1414
1415         case 14:
1416                 test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
1417                             CAST5_ENC_TEST_VECTORS);
1418                 test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
1419                             CAST5_DEC_TEST_VECTORS);
1420                 break;
1421
1422         case 15:
1423                 test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
1424                             CAST6_ENC_TEST_VECTORS);
1425                 test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
1426                             CAST6_DEC_TEST_VECTORS);
1427                 break;
1428
1429         case 16:
1430                 test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
1431                             ARC4_ENC_TEST_VECTORS);
1432                 test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
1433                             ARC4_DEC_TEST_VECTORS);
1434                 break;
1435
1436         case 17:
1437                 test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
1438                 break;
1439
1440         case 18:
1441                 test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
1442                 break;
1443
1444         case 19:
1445                 test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
1446                             TEA_ENC_TEST_VECTORS);
1447                 test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
1448                             TEA_DEC_TEST_VECTORS);
1449                 break;
1450
1451         case 20:
1452                 test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
1453                             XTEA_ENC_TEST_VECTORS);
1454                 test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
1455                             XTEA_DEC_TEST_VECTORS);
1456                 break;
1457
1458         case 21:
1459                 test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
1460                             KHAZAD_ENC_TEST_VECTORS);
1461                 test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
1462                             KHAZAD_DEC_TEST_VECTORS);
1463                 break;
1464
1465         case 22:
1466                 test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
1467                 break;
1468
1469         case 23:
1470                 test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
1471                 break;
1472
1473         case 24:
1474                 test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
1475                 break;
1476
1477         case 25:
1478                 test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
1479                             TNEPRES_ENC_TEST_VECTORS);
1480                 test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
1481                             TNEPRES_DEC_TEST_VECTORS);
1482                 break;
1483
1484         case 26:
1485                 test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
1486                             ANUBIS_ENC_TEST_VECTORS);
1487                 test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
1488                             ANUBIS_DEC_TEST_VECTORS);
1489                 test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
1490                             ANUBIS_CBC_ENC_TEST_VECTORS);
1491                 test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
1492                             ANUBIS_CBC_ENC_TEST_VECTORS);
1493                 break;
1494
1495         case 27:
1496                 test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
1497                 break;
1498
1499         case 28:
1500
1501                 test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
1502                 break;
1503
1504         case 29:
1505                 test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
1506                 break;
1507                 
1508         case 30:
1509                 test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
1510                             XETA_ENC_TEST_VECTORS);
1511                 test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
1512                             XETA_DEC_TEST_VECTORS);
1513                 break;
1514
1515         case 31:
1516                 test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
1517                             FCRYPT_ENC_TEST_VECTORS);
1518                 test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
1519                             FCRYPT_DEC_TEST_VECTORS);
1520                 break;
1521
1522         case 32:
1523                 test_cipher("ecb(camellia)", ENCRYPT,
1524                             camellia_enc_tv_template,
1525                             CAMELLIA_ENC_TEST_VECTORS);
1526                 test_cipher("ecb(camellia)", DECRYPT,
1527                             camellia_dec_tv_template,
1528                             CAMELLIA_DEC_TEST_VECTORS);
1529                 test_cipher("cbc(camellia)", ENCRYPT,
1530                             camellia_cbc_enc_tv_template,
1531                             CAMELLIA_CBC_ENC_TEST_VECTORS);
1532                 test_cipher("cbc(camellia)", DECRYPT,
1533                             camellia_cbc_dec_tv_template,
1534                             CAMELLIA_CBC_DEC_TEST_VECTORS);
1535                 break;
1536         case 33:
1537                 test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);
1538                 break;
1539
1540         case 34:
1541                 test_cipher("salsa20", ENCRYPT,
1542                             salsa20_stream_enc_tv_template,
1543                             SALSA20_STREAM_ENC_TEST_VECTORS);
1544                 break;
1545
1546         case 35:
1547                 test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template,
1548                           AES_GCM_ENC_TEST_VECTORS);
1549                 test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template,
1550                           AES_GCM_DEC_TEST_VECTORS);
1551                 break;
1552
1553         case 100:
1554                 test_hash("hmac(md5)", hmac_md5_tv_template,
1555                           HMAC_MD5_TEST_VECTORS);
1556                 break;
1557
1558         case 101:
1559                 test_hash("hmac(sha1)", hmac_sha1_tv_template,
1560                           HMAC_SHA1_TEST_VECTORS);
1561                 break;
1562
1563         case 102:
1564                 test_hash("hmac(sha256)", hmac_sha256_tv_template,
1565                           HMAC_SHA256_TEST_VECTORS);
1566                 break;
1567
1568         case 103:
1569                 test_hash("hmac(sha384)", hmac_sha384_tv_template,
1570                           HMAC_SHA384_TEST_VECTORS);
1571                 break;
1572
1573         case 104:
1574                 test_hash("hmac(sha512)", hmac_sha512_tv_template,
1575                           HMAC_SHA512_TEST_VECTORS);
1576                 break;
1577         case 105:
1578                 test_hash("hmac(sha224)", hmac_sha224_tv_template,
1579                           HMAC_SHA224_TEST_VECTORS);
1580                 break;
1581
1582         case 200:
1583                 test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
1584                                   aes_speed_template);
1585                 test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
1586                                   aes_speed_template);
1587                 test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
1588                                   aes_speed_template);
1589                 test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
1590                                   aes_speed_template);
1591                 test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
1592                                   aes_lrw_speed_template);
1593                 test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
1594                                   aes_lrw_speed_template);
1595                 test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
1596                                   aes_xts_speed_template);
1597                 test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
1598                                   aes_xts_speed_template);
1599                 break;
1600
1601         case 201:
1602                 test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
1603                                   des3_ede_enc_tv_template,
1604                                   DES3_EDE_ENC_TEST_VECTORS,
1605                                   des3_ede_speed_template);
1606                 test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
1607                                   des3_ede_dec_tv_template,
1608                                   DES3_EDE_DEC_TEST_VECTORS,
1609                                   des3_ede_speed_template);
1610                 test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
1611                                   des3_ede_enc_tv_template,
1612                                   DES3_EDE_ENC_TEST_VECTORS,
1613                                   des3_ede_speed_template);
1614                 test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
1615                                   des3_ede_dec_tv_template,
1616                                   DES3_EDE_DEC_TEST_VECTORS,
1617                                   des3_ede_speed_template);
1618                 break;
1619
1620         case 202:
1621                 test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
1622                                   twofish_speed_template);
1623                 test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
1624                                   twofish_speed_template);
1625                 test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
1626                                   twofish_speed_template);
1627                 test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
1628                                   twofish_speed_template);
1629                 break;
1630
1631         case 203:
1632                 test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
1633                                   blowfish_speed_template);
1634                 test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
1635                                   blowfish_speed_template);
1636                 test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
1637                                   blowfish_speed_template);
1638                 test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
1639                                   blowfish_speed_template);
1640                 break;
1641
1642         case 204:
1643                 test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
1644                                   des_speed_template);
1645                 test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
1646                                   des_speed_template);
1647                 test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
1648                                   des_speed_template);
1649                 test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
1650                                   des_speed_template);
1651                 break;
1652
1653         case 205:
1654                 test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
1655                                 camellia_speed_template);
1656                 test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
1657                                 camellia_speed_template);
1658                 test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
1659                                 camellia_speed_template);
1660                 test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
1661                                 camellia_speed_template);
1662                 break;
1663
1664         case 300:
1665                 /* fall through */
1666
1667         case 301:
1668                 test_hash_speed("md4", sec, generic_hash_speed_template);
1669                 if (mode > 300 && mode < 400) break;
1670
1671         case 302:
1672                 test_hash_speed("md5", sec, generic_hash_speed_template);
1673                 if (mode > 300 && mode < 400) break;
1674
1675         case 303:
1676                 test_hash_speed("sha1", sec, generic_hash_speed_template);
1677                 if (mode > 300 && mode < 400) break;
1678
1679         case 304:
1680                 test_hash_speed("sha256", sec, generic_hash_speed_template);
1681                 if (mode > 300 && mode < 400) break;
1682
1683         case 305:
1684                 test_hash_speed("sha384", sec, generic_hash_speed_template);
1685                 if (mode > 300 && mode < 400) break;
1686
1687         case 306:
1688                 test_hash_speed("sha512", sec, generic_hash_speed_template);
1689                 if (mode > 300 && mode < 400) break;
1690
1691         case 307:
1692                 test_hash_speed("wp256", sec, generic_hash_speed_template);
1693                 if (mode > 300 && mode < 400) break;
1694
1695         case 308:
1696                 test_hash_speed("wp384", sec, generic_hash_speed_template);
1697                 if (mode > 300 && mode < 400) break;
1698
1699         case 309:
1700                 test_hash_speed("wp512", sec, generic_hash_speed_template);
1701                 if (mode > 300 && mode < 400) break;
1702
1703         case 310:
1704                 test_hash_speed("tgr128", sec, generic_hash_speed_template);
1705                 if (mode > 300 && mode < 400) break;
1706
1707         case 311:
1708                 test_hash_speed("tgr160", sec, generic_hash_speed_template);
1709                 if (mode > 300 && mode < 400) break;
1710
1711         case 312:
1712                 test_hash_speed("tgr192", sec, generic_hash_speed_template);
1713                 if (mode > 300 && mode < 400) break;
1714
1715         case 313:
1716                 test_hash_speed("sha224", sec, generic_hash_speed_template);
1717                 if (mode > 300 && mode < 400) break;
1718
1719         case 399:
1720                 break;
1721
1722         case 1000:
1723                 test_available();
1724                 break;
1725
1726         default:
1727                 /* useful for debugging */
1728                 printk("not testing anything\n");
1729                 break;
1730         }
1731 }
1732
1733 static int __init init(void)
1734 {
1735         int err = -ENOMEM;
1736
1737         tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL);
1738         if (tvmem == NULL)
1739                 return err;
1740
1741         xbuf = kmalloc(XBUFSIZE, GFP_KERNEL);
1742         if (xbuf == NULL)
1743                 goto err_free_tv;
1744
1745         axbuf = kmalloc(XBUFSIZE, GFP_KERNEL);
1746         if (axbuf == NULL)
1747                 goto err_free_xbuf;
1748
1749         do_test();
1750
1751         /* We intentionaly return -EAGAIN to prevent keeping
1752          * the module. It does all its work from init()
1753          * and doesn't offer any runtime functionality 
1754          * => we don't need it in the memory, do we?
1755          *                                        -- mludvig
1756          */
1757         err = -EAGAIN;
1758
1759         kfree(axbuf);
1760  err_free_xbuf:
1761         kfree(xbuf);
1762  err_free_tv:
1763         kfree(tvmem);
1764
1765         return err;
1766 }
1767
1768 /*
1769  * If an init function is provided, an exit function must also be provided
1770  * to allow module unload.
1771  */
1772 static void __exit fini(void) { }
1773
1774 module_init(init);
1775 module_exit(fini);
1776
1777 module_param(mode, int, 0);
1778 module_param(sec, uint, 0);
1779 MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
1780                       "(defaults to zero which uses CPU cycles instead)");
1781
1782 MODULE_LICENSE("GPL");
1783 MODULE_DESCRIPTION("Quick & dirty crypto testing module");
1784 MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");