MIPS: SEAD3: Use symbolic addresses from sead-addr.h in LED driver.
[linux-drm-fsl-dcu.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  * Updated RFC4106 AES-GCM testing.
12  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
13  *             Adrian Hoban <adrian.hoban@intel.com>
14  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
15  *             Tadeusz Struk (tadeusz.struk@intel.com)
16  *             Copyright (c) 2010, Intel Corporation.
17  *
18  * This program is free software; you can redistribute it and/or modify it
19  * under the terms of the GNU General Public License as published by the Free
20  * Software Foundation; either version 2 of the License, or (at your option)
21  * any later version.
22  *
23  */
24
25 #include <crypto/hash.h>
26 #include <linux/err.h>
27 #include <linux/init.h>
28 #include <linux/gfp.h>
29 #include <linux/module.h>
30 #include <linux/scatterlist.h>
31 #include <linux/string.h>
32 #include <linux/moduleparam.h>
33 #include <linux/jiffies.h>
34 #include <linux/timex.h>
35 #include <linux/interrupt.h>
36 #include "tcrypt.h"
37 #include "internal.h"
38
39 /*
40  * Need slab memory for testing (size in number of pages).
41  */
42 #define TVMEMSIZE       4
43
44 /*
45 * Used by test_cipher_speed()
46 */
47 #define ENCRYPT 1
48 #define DECRYPT 0
49
50 /*
51  * return a string with the driver name
52  */
53 #define get_driver_name(tfm_type, tfm) crypto_tfm_alg_driver_name(tfm_type ## _tfm(tfm))
54
55 /*
56  * Used by test_cipher_speed()
57  */
58 static unsigned int sec;
59
60 static char *alg = NULL;
61 static u32 type;
62 static u32 mask;
63 static int mode;
64 static char *tvmem[TVMEMSIZE];
65
66 static char *check[] = {
67         "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
68         "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
69         "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
70         "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta",  "fcrypt",
71         "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
72         "lzo", "cts", "zlib", NULL
73 };
74
75 static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
76                                struct scatterlist *sg, int blen, int secs)
77 {
78         unsigned long start, end;
79         int bcount;
80         int ret;
81
82         for (start = jiffies, end = start + secs * HZ, bcount = 0;
83              time_before(jiffies, end); bcount++) {
84                 if (enc)
85                         ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
86                 else
87                         ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
88
89                 if (ret)
90                         return ret;
91         }
92
93         printk("%d operations in %d seconds (%ld bytes)\n",
94                bcount, secs, (long)bcount * blen);
95         return 0;
96 }
97
98 static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
99                               struct scatterlist *sg, int blen)
100 {
101         unsigned long cycles = 0;
102         int ret = 0;
103         int i;
104
105         local_irq_disable();
106
107         /* Warm-up run. */
108         for (i = 0; i < 4; i++) {
109                 if (enc)
110                         ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
111                 else
112                         ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
113
114                 if (ret)
115                         goto out;
116         }
117
118         /* The real thing. */
119         for (i = 0; i < 8; i++) {
120                 cycles_t start, end;
121
122                 start = get_cycles();
123                 if (enc)
124                         ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
125                 else
126                         ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
127                 end = get_cycles();
128
129                 if (ret)
130                         goto out;
131
132                 cycles += end - start;
133         }
134
135 out:
136         local_irq_enable();
137
138         if (ret == 0)
139                 printk("1 operation in %lu cycles (%d bytes)\n",
140                        (cycles + 4) / 8, blen);
141
142         return ret;
143 }
144
145 static int test_aead_jiffies(struct aead_request *req, int enc,
146                                 int blen, int secs)
147 {
148         unsigned long start, end;
149         int bcount;
150         int ret;
151
152         for (start = jiffies, end = start + secs * HZ, bcount = 0;
153              time_before(jiffies, end); bcount++) {
154                 if (enc)
155                         ret = crypto_aead_encrypt(req);
156                 else
157                         ret = crypto_aead_decrypt(req);
158
159                 if (ret)
160                         return ret;
161         }
162
163         printk("%d operations in %d seconds (%ld bytes)\n",
164                bcount, secs, (long)bcount * blen);
165         return 0;
166 }
167
168 static int test_aead_cycles(struct aead_request *req, int enc, int blen)
169 {
170         unsigned long cycles = 0;
171         int ret = 0;
172         int i;
173
174         local_irq_disable();
175
176         /* Warm-up run. */
177         for (i = 0; i < 4; i++) {
178                 if (enc)
179                         ret = crypto_aead_encrypt(req);
180                 else
181                         ret = crypto_aead_decrypt(req);
182
183                 if (ret)
184                         goto out;
185         }
186
187         /* The real thing. */
188         for (i = 0; i < 8; i++) {
189                 cycles_t start, end;
190
191                 start = get_cycles();
192                 if (enc)
193                         ret = crypto_aead_encrypt(req);
194                 else
195                         ret = crypto_aead_decrypt(req);
196                 end = get_cycles();
197
198                 if (ret)
199                         goto out;
200
201                 cycles += end - start;
202         }
203
204 out:
205         local_irq_enable();
206
207         if (ret == 0)
208                 printk("1 operation in %lu cycles (%d bytes)\n",
209                        (cycles + 4) / 8, blen);
210
211         return ret;
212 }
213
214 static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
215 static u32 aead_sizes[] = { 16, 64, 256, 512, 1024, 2048, 4096, 8192, 0 };
216
217 #define XBUFSIZE 8
218 #define MAX_IVLEN 32
219
220 static int testmgr_alloc_buf(char *buf[XBUFSIZE])
221 {
222         int i;
223
224         for (i = 0; i < XBUFSIZE; i++) {
225                 buf[i] = (void *)__get_free_page(GFP_KERNEL);
226                 if (!buf[i])
227                         goto err_free_buf;
228         }
229
230         return 0;
231
232 err_free_buf:
233         while (i-- > 0)
234                 free_page((unsigned long)buf[i]);
235
236         return -ENOMEM;
237 }
238
239 static void testmgr_free_buf(char *buf[XBUFSIZE])
240 {
241         int i;
242
243         for (i = 0; i < XBUFSIZE; i++)
244                 free_page((unsigned long)buf[i]);
245 }
246
247 static void sg_init_aead(struct scatterlist *sg, char *xbuf[XBUFSIZE],
248                         unsigned int buflen)
249 {
250         int np = (buflen + PAGE_SIZE - 1)/PAGE_SIZE;
251         int k, rem;
252
253         if (np > XBUFSIZE) {
254                 rem = PAGE_SIZE;
255                 np = XBUFSIZE;
256         } else {
257                 rem = buflen % PAGE_SIZE;
258         }
259
260         sg_init_table(sg, np);
261         np--;
262         for (k = 0; k < np; k++)
263                 sg_set_buf(&sg[k], xbuf[k], PAGE_SIZE);
264
265         sg_set_buf(&sg[k], xbuf[k], rem);
266 }
267
268 static void test_aead_speed(const char *algo, int enc, unsigned int secs,
269                             struct aead_speed_template *template,
270                             unsigned int tcount, u8 authsize,
271                             unsigned int aad_size, u8 *keysize)
272 {
273         unsigned int i, j;
274         struct crypto_aead *tfm;
275         int ret = -ENOMEM;
276         const char *key;
277         struct aead_request *req;
278         struct scatterlist *sg;
279         struct scatterlist *asg;
280         struct scatterlist *sgout;
281         const char *e;
282         void *assoc;
283         char *iv;
284         char *xbuf[XBUFSIZE];
285         char *xoutbuf[XBUFSIZE];
286         char *axbuf[XBUFSIZE];
287         unsigned int *b_size;
288         unsigned int iv_len;
289
290         iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
291         if (!iv)
292                 return;
293
294         if (aad_size >= PAGE_SIZE) {
295                 pr_err("associate data length (%u) too big\n", aad_size);
296                 goto out_noxbuf;
297         }
298
299         if (enc == ENCRYPT)
300                 e = "encryption";
301         else
302                 e = "decryption";
303
304         if (testmgr_alloc_buf(xbuf))
305                 goto out_noxbuf;
306         if (testmgr_alloc_buf(axbuf))
307                 goto out_noaxbuf;
308         if (testmgr_alloc_buf(xoutbuf))
309                 goto out_nooutbuf;
310
311         sg = kmalloc(sizeof(*sg) * 8 * 3, GFP_KERNEL);
312         if (!sg)
313                 goto out_nosg;
314         asg = &sg[8];
315         sgout = &asg[8];
316
317         tfm = crypto_alloc_aead(algo, 0, 0);
318
319         if (IS_ERR(tfm)) {
320                 pr_err("alg: aead: Failed to load transform for %s: %ld\n", algo,
321                        PTR_ERR(tfm));
322                 goto out_notfm;
323         }
324
325         printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo,
326                         get_driver_name(crypto_aead, tfm), e);
327
328         req = aead_request_alloc(tfm, GFP_KERNEL);
329         if (!req) {
330                 pr_err("alg: aead: Failed to allocate request for %s\n",
331                        algo);
332                 goto out_noreq;
333         }
334
335         i = 0;
336         do {
337                 b_size = aead_sizes;
338                 do {
339                         assoc = axbuf[0];
340                         memset(assoc, 0xff, aad_size);
341                         sg_init_one(&asg[0], assoc, aad_size);
342
343                         if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
344                                 pr_err("template (%u) too big for tvmem (%lu)\n",
345                                        *keysize + *b_size,
346                                         TVMEMSIZE * PAGE_SIZE);
347                                 goto out;
348                         }
349
350                         key = tvmem[0];
351                         for (j = 0; j < tcount; j++) {
352                                 if (template[j].klen == *keysize) {
353                                         key = template[j].key;
354                                         break;
355                                 }
356                         }
357                         ret = crypto_aead_setkey(tfm, key, *keysize);
358                         ret = crypto_aead_setauthsize(tfm, authsize);
359
360                         iv_len = crypto_aead_ivsize(tfm);
361                         if (iv_len)
362                                 memset(iv, 0xff, iv_len);
363
364                         crypto_aead_clear_flags(tfm, ~0);
365                         printk(KERN_INFO "test %u (%d bit key, %d byte blocks): ",
366                                         i, *keysize * 8, *b_size);
367
368
369                         memset(tvmem[0], 0xff, PAGE_SIZE);
370
371                         if (ret) {
372                                 pr_err("setkey() failed flags=%x\n",
373                                                 crypto_aead_get_flags(tfm));
374                                 goto out;
375                         }
376
377                         sg_init_aead(&sg[0], xbuf,
378                                     *b_size + (enc ? authsize : 0));
379
380                         sg_init_aead(&sgout[0], xoutbuf,
381                                     *b_size + (enc ? authsize : 0));
382
383                         aead_request_set_crypt(req, sg, sgout, *b_size, iv);
384                         aead_request_set_assoc(req, asg, aad_size);
385
386                         if (secs)
387                                 ret = test_aead_jiffies(req, enc, *b_size,
388                                                         secs);
389                         else
390                                 ret = test_aead_cycles(req, enc, *b_size);
391
392                         if (ret) {
393                                 pr_err("%s() failed return code=%d\n", e, ret);
394                                 break;
395                         }
396                         b_size++;
397                         i++;
398                 } while (*b_size);
399                 keysize++;
400         } while (*keysize);
401
402 out:
403         aead_request_free(req);
404 out_noreq:
405         crypto_free_aead(tfm);
406 out_notfm:
407         kfree(sg);
408 out_nosg:
409         testmgr_free_buf(xoutbuf);
410 out_nooutbuf:
411         testmgr_free_buf(axbuf);
412 out_noaxbuf:
413         testmgr_free_buf(xbuf);
414 out_noxbuf:
415         kfree(iv);
416         return;
417 }
418
419 static void test_cipher_speed(const char *algo, int enc, unsigned int secs,
420                               struct cipher_speed_template *template,
421                               unsigned int tcount, u8 *keysize)
422 {
423         unsigned int ret, i, j, iv_len;
424         const char *key;
425         char iv[128];
426         struct crypto_blkcipher *tfm;
427         struct blkcipher_desc desc;
428         const char *e;
429         u32 *b_size;
430
431         if (enc == ENCRYPT)
432                 e = "encryption";
433         else
434                 e = "decryption";
435
436         tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
437
438         if (IS_ERR(tfm)) {
439                 printk("failed to load transform for %s: %ld\n", algo,
440                        PTR_ERR(tfm));
441                 return;
442         }
443         desc.tfm = tfm;
444         desc.flags = 0;
445
446         printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo,
447                         get_driver_name(crypto_blkcipher, tfm), e);
448
449         i = 0;
450         do {
451
452                 b_size = block_sizes;
453                 do {
454                         struct scatterlist sg[TVMEMSIZE];
455
456                         if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
457                                 printk("template (%u) too big for "
458                                        "tvmem (%lu)\n", *keysize + *b_size,
459                                        TVMEMSIZE * PAGE_SIZE);
460                                 goto out;
461                         }
462
463                         printk("test %u (%d bit key, %d byte blocks): ", i,
464                                         *keysize * 8, *b_size);
465
466                         memset(tvmem[0], 0xff, PAGE_SIZE);
467
468                         /* set key, plain text and IV */
469                         key = tvmem[0];
470                         for (j = 0; j < tcount; j++) {
471                                 if (template[j].klen == *keysize) {
472                                         key = template[j].key;
473                                         break;
474                                 }
475                         }
476
477                         ret = crypto_blkcipher_setkey(tfm, key, *keysize);
478                         if (ret) {
479                                 printk("setkey() failed flags=%x\n",
480                                                 crypto_blkcipher_get_flags(tfm));
481                                 goto out;
482                         }
483
484                         sg_init_table(sg, TVMEMSIZE);
485                         sg_set_buf(sg, tvmem[0] + *keysize,
486                                    PAGE_SIZE - *keysize);
487                         for (j = 1; j < TVMEMSIZE; j++) {
488                                 sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
489                                 memset (tvmem[j], 0xff, PAGE_SIZE);
490                         }
491
492                         iv_len = crypto_blkcipher_ivsize(tfm);
493                         if (iv_len) {
494                                 memset(&iv, 0xff, iv_len);
495                                 crypto_blkcipher_set_iv(tfm, iv, iv_len);
496                         }
497
498                         if (secs)
499                                 ret = test_cipher_jiffies(&desc, enc, sg,
500                                                           *b_size, secs);
501                         else
502                                 ret = test_cipher_cycles(&desc, enc, sg,
503                                                          *b_size);
504
505                         if (ret) {
506                                 printk("%s() failed flags=%x\n", e, desc.flags);
507                                 break;
508                         }
509                         b_size++;
510                         i++;
511                 } while (*b_size);
512                 keysize++;
513         } while (*keysize);
514
515 out:
516         crypto_free_blkcipher(tfm);
517 }
518
519 static int test_hash_jiffies_digest(struct hash_desc *desc,
520                                     struct scatterlist *sg, int blen,
521                                     char *out, int secs)
522 {
523         unsigned long start, end;
524         int bcount;
525         int ret;
526
527         for (start = jiffies, end = start + secs * HZ, bcount = 0;
528              time_before(jiffies, end); bcount++) {
529                 ret = crypto_hash_digest(desc, sg, blen, out);
530                 if (ret)
531                         return ret;
532         }
533
534         printk("%6u opers/sec, %9lu bytes/sec\n",
535                bcount / secs, ((long)bcount * blen) / secs);
536
537         return 0;
538 }
539
540 static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
541                              int blen, int plen, char *out, int secs)
542 {
543         unsigned long start, end;
544         int bcount, pcount;
545         int ret;
546
547         if (plen == blen)
548                 return test_hash_jiffies_digest(desc, sg, blen, out, secs);
549
550         for (start = jiffies, end = start + secs * HZ, bcount = 0;
551              time_before(jiffies, end); bcount++) {
552                 ret = crypto_hash_init(desc);
553                 if (ret)
554                         return ret;
555                 for (pcount = 0; pcount < blen; pcount += plen) {
556                         ret = crypto_hash_update(desc, sg, plen);
557                         if (ret)
558                                 return ret;
559                 }
560                 /* we assume there is enough space in 'out' for the result */
561                 ret = crypto_hash_final(desc, out);
562                 if (ret)
563                         return ret;
564         }
565
566         printk("%6u opers/sec, %9lu bytes/sec\n",
567                bcount / secs, ((long)bcount * blen) / secs);
568
569         return 0;
570 }
571
572 static int test_hash_cycles_digest(struct hash_desc *desc,
573                                    struct scatterlist *sg, int blen, char *out)
574 {
575         unsigned long cycles = 0;
576         int i;
577         int ret;
578
579         local_irq_disable();
580
581         /* Warm-up run. */
582         for (i = 0; i < 4; i++) {
583                 ret = crypto_hash_digest(desc, sg, blen, out);
584                 if (ret)
585                         goto out;
586         }
587
588         /* The real thing. */
589         for (i = 0; i < 8; i++) {
590                 cycles_t start, end;
591
592                 start = get_cycles();
593
594                 ret = crypto_hash_digest(desc, sg, blen, out);
595                 if (ret)
596                         goto out;
597
598                 end = get_cycles();
599
600                 cycles += end - start;
601         }
602
603 out:
604         local_irq_enable();
605
606         if (ret)
607                 return ret;
608
609         printk("%6lu cycles/operation, %4lu cycles/byte\n",
610                cycles / 8, cycles / (8 * blen));
611
612         return 0;
613 }
614
615 static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
616                             int blen, int plen, char *out)
617 {
618         unsigned long cycles = 0;
619         int i, pcount;
620         int ret;
621
622         if (plen == blen)
623                 return test_hash_cycles_digest(desc, sg, blen, out);
624
625         local_irq_disable();
626
627         /* Warm-up run. */
628         for (i = 0; i < 4; i++) {
629                 ret = crypto_hash_init(desc);
630                 if (ret)
631                         goto out;
632                 for (pcount = 0; pcount < blen; pcount += plen) {
633                         ret = crypto_hash_update(desc, sg, plen);
634                         if (ret)
635                                 goto out;
636                 }
637                 ret = crypto_hash_final(desc, out);
638                 if (ret)
639                         goto out;
640         }
641
642         /* The real thing. */
643         for (i = 0; i < 8; i++) {
644                 cycles_t start, end;
645
646                 start = get_cycles();
647
648                 ret = crypto_hash_init(desc);
649                 if (ret)
650                         goto out;
651                 for (pcount = 0; pcount < blen; pcount += plen) {
652                         ret = crypto_hash_update(desc, sg, plen);
653                         if (ret)
654                                 goto out;
655                 }
656                 ret = crypto_hash_final(desc, out);
657                 if (ret)
658                         goto out;
659
660                 end = get_cycles();
661
662                 cycles += end - start;
663         }
664
665 out:
666         local_irq_enable();
667
668         if (ret)
669                 return ret;
670
671         printk("%6lu cycles/operation, %4lu cycles/byte\n",
672                cycles / 8, cycles / (8 * blen));
673
674         return 0;
675 }
676
677 static void test_hash_sg_init(struct scatterlist *sg)
678 {
679         int i;
680
681         sg_init_table(sg, TVMEMSIZE);
682         for (i = 0; i < TVMEMSIZE; i++) {
683                 sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
684                 memset(tvmem[i], 0xff, PAGE_SIZE);
685         }
686 }
687
688 static void test_hash_speed(const char *algo, unsigned int secs,
689                             struct hash_speed *speed)
690 {
691         struct scatterlist sg[TVMEMSIZE];
692         struct crypto_hash *tfm;
693         struct hash_desc desc;
694         static char output[1024];
695         int i;
696         int ret;
697
698         tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
699
700         if (IS_ERR(tfm)) {
701                 printk(KERN_ERR "failed to load transform for %s: %ld\n", algo,
702                        PTR_ERR(tfm));
703                 return;
704         }
705
706         printk(KERN_INFO "\ntesting speed of %s (%s)\n", algo,
707                         get_driver_name(crypto_hash, tfm));
708
709         desc.tfm = tfm;
710         desc.flags = 0;
711
712         if (crypto_hash_digestsize(tfm) > sizeof(output)) {
713                 printk(KERN_ERR "digestsize(%u) > outputbuffer(%zu)\n",
714                        crypto_hash_digestsize(tfm), sizeof(output));
715                 goto out;
716         }
717
718         test_hash_sg_init(sg);
719         for (i = 0; speed[i].blen != 0; i++) {
720                 if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
721                         printk(KERN_ERR
722                                "template (%u) too big for tvmem (%lu)\n",
723                                speed[i].blen, TVMEMSIZE * PAGE_SIZE);
724                         goto out;
725                 }
726
727                 if (speed[i].klen)
728                         crypto_hash_setkey(tfm, tvmem[0], speed[i].klen);
729
730                 printk(KERN_INFO "test%3u "
731                        "(%5u byte blocks,%5u bytes per update,%4u updates): ",
732                        i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
733
734                 if (secs)
735                         ret = test_hash_jiffies(&desc, sg, speed[i].blen,
736                                                 speed[i].plen, output, secs);
737                 else
738                         ret = test_hash_cycles(&desc, sg, speed[i].blen,
739                                                speed[i].plen, output);
740
741                 if (ret) {
742                         printk(KERN_ERR "hashing failed ret=%d\n", ret);
743                         break;
744                 }
745         }
746
747 out:
748         crypto_free_hash(tfm);
749 }
750
751 struct tcrypt_result {
752         struct completion completion;
753         int err;
754 };
755
756 static void tcrypt_complete(struct crypto_async_request *req, int err)
757 {
758         struct tcrypt_result *res = req->data;
759
760         if (err == -EINPROGRESS)
761                 return;
762
763         res->err = err;
764         complete(&res->completion);
765 }
766
767 static inline int do_one_ahash_op(struct ahash_request *req, int ret)
768 {
769         if (ret == -EINPROGRESS || ret == -EBUSY) {
770                 struct tcrypt_result *tr = req->base.data;
771
772                 wait_for_completion(&tr->completion);
773                 reinit_completion(&tr->completion);
774                 ret = tr->err;
775         }
776         return ret;
777 }
778
779 static int test_ahash_jiffies_digest(struct ahash_request *req, int blen,
780                                      char *out, int secs)
781 {
782         unsigned long start, end;
783         int bcount;
784         int ret;
785
786         for (start = jiffies, end = start + secs * HZ, bcount = 0;
787              time_before(jiffies, end); bcount++) {
788                 ret = do_one_ahash_op(req, crypto_ahash_digest(req));
789                 if (ret)
790                         return ret;
791         }
792
793         printk("%6u opers/sec, %9lu bytes/sec\n",
794                bcount / secs, ((long)bcount * blen) / secs);
795
796         return 0;
797 }
798
799 static int test_ahash_jiffies(struct ahash_request *req, int blen,
800                               int plen, char *out, int secs)
801 {
802         unsigned long start, end;
803         int bcount, pcount;
804         int ret;
805
806         if (plen == blen)
807                 return test_ahash_jiffies_digest(req, blen, out, secs);
808
809         for (start = jiffies, end = start + secs * HZ, bcount = 0;
810              time_before(jiffies, end); bcount++) {
811                 ret = crypto_ahash_init(req);
812                 if (ret)
813                         return ret;
814                 for (pcount = 0; pcount < blen; pcount += plen) {
815                         ret = do_one_ahash_op(req, crypto_ahash_update(req));
816                         if (ret)
817                                 return ret;
818                 }
819                 /* we assume there is enough space in 'out' for the result */
820                 ret = do_one_ahash_op(req, crypto_ahash_final(req));
821                 if (ret)
822                         return ret;
823         }
824
825         pr_cont("%6u opers/sec, %9lu bytes/sec\n",
826                 bcount / secs, ((long)bcount * blen) / secs);
827
828         return 0;
829 }
830
831 static int test_ahash_cycles_digest(struct ahash_request *req, int blen,
832                                     char *out)
833 {
834         unsigned long cycles = 0;
835         int ret, i;
836
837         /* Warm-up run. */
838         for (i = 0; i < 4; i++) {
839                 ret = do_one_ahash_op(req, crypto_ahash_digest(req));
840                 if (ret)
841                         goto out;
842         }
843
844         /* The real thing. */
845         for (i = 0; i < 8; i++) {
846                 cycles_t start, end;
847
848                 start = get_cycles();
849
850                 ret = do_one_ahash_op(req, crypto_ahash_digest(req));
851                 if (ret)
852                         goto out;
853
854                 end = get_cycles();
855
856                 cycles += end - start;
857         }
858
859 out:
860         if (ret)
861                 return ret;
862
863         pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
864                 cycles / 8, cycles / (8 * blen));
865
866         return 0;
867 }
868
869 static int test_ahash_cycles(struct ahash_request *req, int blen,
870                              int plen, char *out)
871 {
872         unsigned long cycles = 0;
873         int i, pcount, ret;
874
875         if (plen == blen)
876                 return test_ahash_cycles_digest(req, blen, out);
877
878         /* Warm-up run. */
879         for (i = 0; i < 4; i++) {
880                 ret = crypto_ahash_init(req);
881                 if (ret)
882                         goto out;
883                 for (pcount = 0; pcount < blen; pcount += plen) {
884                         ret = do_one_ahash_op(req, crypto_ahash_update(req));
885                         if (ret)
886                                 goto out;
887                 }
888                 ret = do_one_ahash_op(req, crypto_ahash_final(req));
889                 if (ret)
890                         goto out;
891         }
892
893         /* The real thing. */
894         for (i = 0; i < 8; i++) {
895                 cycles_t start, end;
896
897                 start = get_cycles();
898
899                 ret = crypto_ahash_init(req);
900                 if (ret)
901                         goto out;
902                 for (pcount = 0; pcount < blen; pcount += plen) {
903                         ret = do_one_ahash_op(req, crypto_ahash_update(req));
904                         if (ret)
905                                 goto out;
906                 }
907                 ret = do_one_ahash_op(req, crypto_ahash_final(req));
908                 if (ret)
909                         goto out;
910
911                 end = get_cycles();
912
913                 cycles += end - start;
914         }
915
916 out:
917         if (ret)
918                 return ret;
919
920         pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
921                 cycles / 8, cycles / (8 * blen));
922
923         return 0;
924 }
925
926 static void test_ahash_speed(const char *algo, unsigned int secs,
927                              struct hash_speed *speed)
928 {
929         struct scatterlist sg[TVMEMSIZE];
930         struct tcrypt_result tresult;
931         struct ahash_request *req;
932         struct crypto_ahash *tfm;
933         static char output[1024];
934         int i, ret;
935
936         tfm = crypto_alloc_ahash(algo, 0, 0);
937         if (IS_ERR(tfm)) {
938                 pr_err("failed to load transform for %s: %ld\n",
939                        algo, PTR_ERR(tfm));
940                 return;
941         }
942
943         printk(KERN_INFO "\ntesting speed of async %s (%s)\n", algo,
944                         get_driver_name(crypto_ahash, tfm));
945
946         if (crypto_ahash_digestsize(tfm) > sizeof(output)) {
947                 pr_err("digestsize(%u) > outputbuffer(%zu)\n",
948                        crypto_ahash_digestsize(tfm), sizeof(output));
949                 goto out;
950         }
951
952         test_hash_sg_init(sg);
953         req = ahash_request_alloc(tfm, GFP_KERNEL);
954         if (!req) {
955                 pr_err("ahash request allocation failure\n");
956                 goto out;
957         }
958
959         init_completion(&tresult.completion);
960         ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
961                                    tcrypt_complete, &tresult);
962
963         for (i = 0; speed[i].blen != 0; i++) {
964                 if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
965                         pr_err("template (%u) too big for tvmem (%lu)\n",
966                                speed[i].blen, TVMEMSIZE * PAGE_SIZE);
967                         break;
968                 }
969
970                 pr_info("test%3u "
971                         "(%5u byte blocks,%5u bytes per update,%4u updates): ",
972                         i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
973
974                 ahash_request_set_crypt(req, sg, output, speed[i].plen);
975
976                 if (secs)
977                         ret = test_ahash_jiffies(req, speed[i].blen,
978                                                  speed[i].plen, output, secs);
979                 else
980                         ret = test_ahash_cycles(req, speed[i].blen,
981                                                 speed[i].plen, output);
982
983                 if (ret) {
984                         pr_err("hashing failed ret=%d\n", ret);
985                         break;
986                 }
987         }
988
989         ahash_request_free(req);
990
991 out:
992         crypto_free_ahash(tfm);
993 }
994
995 static inline int do_one_acipher_op(struct ablkcipher_request *req, int ret)
996 {
997         if (ret == -EINPROGRESS || ret == -EBUSY) {
998                 struct tcrypt_result *tr = req->base.data;
999
1000                 wait_for_completion(&tr->completion);
1001                 reinit_completion(&tr->completion);
1002                 ret = tr->err;
1003         }
1004
1005         return ret;
1006 }
1007
1008 static int test_acipher_jiffies(struct ablkcipher_request *req, int enc,
1009                                 int blen, int secs)
1010 {
1011         unsigned long start, end;
1012         int bcount;
1013         int ret;
1014
1015         for (start = jiffies, end = start + secs * HZ, bcount = 0;
1016              time_before(jiffies, end); bcount++) {
1017                 if (enc)
1018                         ret = do_one_acipher_op(req,
1019                                                 crypto_ablkcipher_encrypt(req));
1020                 else
1021                         ret = do_one_acipher_op(req,
1022                                                 crypto_ablkcipher_decrypt(req));
1023
1024                 if (ret)
1025                         return ret;
1026         }
1027
1028         pr_cont("%d operations in %d seconds (%ld bytes)\n",
1029                 bcount, secs, (long)bcount * blen);
1030         return 0;
1031 }
1032
1033 static int test_acipher_cycles(struct ablkcipher_request *req, int enc,
1034                                int blen)
1035 {
1036         unsigned long cycles = 0;
1037         int ret = 0;
1038         int i;
1039
1040         /* Warm-up run. */
1041         for (i = 0; i < 4; i++) {
1042                 if (enc)
1043                         ret = do_one_acipher_op(req,
1044                                                 crypto_ablkcipher_encrypt(req));
1045                 else
1046                         ret = do_one_acipher_op(req,
1047                                                 crypto_ablkcipher_decrypt(req));
1048
1049                 if (ret)
1050                         goto out;
1051         }
1052
1053         /* The real thing. */
1054         for (i = 0; i < 8; i++) {
1055                 cycles_t start, end;
1056
1057                 start = get_cycles();
1058                 if (enc)
1059                         ret = do_one_acipher_op(req,
1060                                                 crypto_ablkcipher_encrypt(req));
1061                 else
1062                         ret = do_one_acipher_op(req,
1063                                                 crypto_ablkcipher_decrypt(req));
1064                 end = get_cycles();
1065
1066                 if (ret)
1067                         goto out;
1068
1069                 cycles += end - start;
1070         }
1071
1072 out:
1073         if (ret == 0)
1074                 pr_cont("1 operation in %lu cycles (%d bytes)\n",
1075                         (cycles + 4) / 8, blen);
1076
1077         return ret;
1078 }
1079
1080 static void test_acipher_speed(const char *algo, int enc, unsigned int secs,
1081                                struct cipher_speed_template *template,
1082                                unsigned int tcount, u8 *keysize)
1083 {
1084         unsigned int ret, i, j, k, iv_len;
1085         struct tcrypt_result tresult;
1086         const char *key;
1087         char iv[128];
1088         struct ablkcipher_request *req;
1089         struct crypto_ablkcipher *tfm;
1090         const char *e;
1091         u32 *b_size;
1092
1093         if (enc == ENCRYPT)
1094                 e = "encryption";
1095         else
1096                 e = "decryption";
1097
1098         init_completion(&tresult.completion);
1099
1100         tfm = crypto_alloc_ablkcipher(algo, 0, 0);
1101
1102         if (IS_ERR(tfm)) {
1103                 pr_err("failed to load transform for %s: %ld\n", algo,
1104                        PTR_ERR(tfm));
1105                 return;
1106         }
1107
1108         pr_info("\ntesting speed of async %s (%s) %s\n", algo,
1109                         get_driver_name(crypto_ablkcipher, tfm), e);
1110
1111         req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
1112         if (!req) {
1113                 pr_err("tcrypt: skcipher: Failed to allocate request for %s\n",
1114                        algo);
1115                 goto out;
1116         }
1117
1118         ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1119                                         tcrypt_complete, &tresult);
1120
1121         i = 0;
1122         do {
1123                 b_size = block_sizes;
1124
1125                 do {
1126                         struct scatterlist sg[TVMEMSIZE];
1127
1128                         if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
1129                                 pr_err("template (%u) too big for "
1130                                        "tvmem (%lu)\n", *keysize + *b_size,
1131                                        TVMEMSIZE * PAGE_SIZE);
1132                                 goto out_free_req;
1133                         }
1134
1135                         pr_info("test %u (%d bit key, %d byte blocks): ", i,
1136                                 *keysize * 8, *b_size);
1137
1138                         memset(tvmem[0], 0xff, PAGE_SIZE);
1139
1140                         /* set key, plain text and IV */
1141                         key = tvmem[0];
1142                         for (j = 0; j < tcount; j++) {
1143                                 if (template[j].klen == *keysize) {
1144                                         key = template[j].key;
1145                                         break;
1146                                 }
1147                         }
1148
1149                         crypto_ablkcipher_clear_flags(tfm, ~0);
1150
1151                         ret = crypto_ablkcipher_setkey(tfm, key, *keysize);
1152                         if (ret) {
1153                                 pr_err("setkey() failed flags=%x\n",
1154                                         crypto_ablkcipher_get_flags(tfm));
1155                                 goto out_free_req;
1156                         }
1157
1158                         sg_init_table(sg, TVMEMSIZE);
1159
1160                         k = *keysize + *b_size;
1161                         if (k > PAGE_SIZE) {
1162                                 sg_set_buf(sg, tvmem[0] + *keysize,
1163                                    PAGE_SIZE - *keysize);
1164                                 k -= PAGE_SIZE;
1165                                 j = 1;
1166                                 while (k > PAGE_SIZE) {
1167                                         sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
1168                                         memset(tvmem[j], 0xff, PAGE_SIZE);
1169                                         j++;
1170                                         k -= PAGE_SIZE;
1171                                 }
1172                                 sg_set_buf(sg + j, tvmem[j], k);
1173                                 memset(tvmem[j], 0xff, k);
1174                         } else {
1175                                 sg_set_buf(sg, tvmem[0] + *keysize, *b_size);
1176                         }
1177
1178                         iv_len = crypto_ablkcipher_ivsize(tfm);
1179                         if (iv_len)
1180                                 memset(&iv, 0xff, iv_len);
1181
1182                         ablkcipher_request_set_crypt(req, sg, sg, *b_size, iv);
1183
1184                         if (secs)
1185                                 ret = test_acipher_jiffies(req, enc,
1186                                                            *b_size, secs);
1187                         else
1188                                 ret = test_acipher_cycles(req, enc,
1189                                                           *b_size);
1190
1191                         if (ret) {
1192                                 pr_err("%s() failed flags=%x\n", e,
1193                                         crypto_ablkcipher_get_flags(tfm));
1194                                 break;
1195                         }
1196                         b_size++;
1197                         i++;
1198                 } while (*b_size);
1199                 keysize++;
1200         } while (*keysize);
1201
1202 out_free_req:
1203         ablkcipher_request_free(req);
1204 out:
1205         crypto_free_ablkcipher(tfm);
1206 }
1207
1208 static void test_available(void)
1209 {
1210         char **name = check;
1211
1212         while (*name) {
1213                 printk("alg %s ", *name);
1214                 printk(crypto_has_alg(*name, 0, 0) ?
1215                        "found\n" : "not found\n");
1216                 name++;
1217         }
1218 }
1219
1220 static inline int tcrypt_test(const char *alg)
1221 {
1222         int ret;
1223
1224         ret = alg_test(alg, alg, 0, 0);
1225         /* non-fips algs return -EINVAL in fips mode */
1226         if (fips_enabled && ret == -EINVAL)
1227                 ret = 0;
1228         return ret;
1229 }
1230
1231 static int do_test(const char *alg, u32 type, u32 mask, int m)
1232 {
1233         int i;
1234         int ret = 0;
1235
1236         switch (m) {
1237         case 0:
1238                 if (alg) {
1239                         if (!crypto_has_alg(alg, type,
1240                                             mask ?: CRYPTO_ALG_TYPE_MASK))
1241                                 ret = -ENOENT;
1242                         break;
1243                 }
1244
1245                 for (i = 1; i < 200; i++)
1246                         ret += do_test(NULL, 0, 0, i);
1247                 break;
1248
1249         case 1:
1250                 ret += tcrypt_test("md5");
1251                 break;
1252
1253         case 2:
1254                 ret += tcrypt_test("sha1");
1255                 break;
1256
1257         case 3:
1258                 ret += tcrypt_test("ecb(des)");
1259                 ret += tcrypt_test("cbc(des)");
1260                 ret += tcrypt_test("ctr(des)");
1261                 break;
1262
1263         case 4:
1264                 ret += tcrypt_test("ecb(des3_ede)");
1265                 ret += tcrypt_test("cbc(des3_ede)");
1266                 ret += tcrypt_test("ctr(des3_ede)");
1267                 break;
1268
1269         case 5:
1270                 ret += tcrypt_test("md4");
1271                 break;
1272
1273         case 6:
1274                 ret += tcrypt_test("sha256");
1275                 break;
1276
1277         case 7:
1278                 ret += tcrypt_test("ecb(blowfish)");
1279                 ret += tcrypt_test("cbc(blowfish)");
1280                 ret += tcrypt_test("ctr(blowfish)");
1281                 break;
1282
1283         case 8:
1284                 ret += tcrypt_test("ecb(twofish)");
1285                 ret += tcrypt_test("cbc(twofish)");
1286                 ret += tcrypt_test("ctr(twofish)");
1287                 ret += tcrypt_test("lrw(twofish)");
1288                 ret += tcrypt_test("xts(twofish)");
1289                 break;
1290
1291         case 9:
1292                 ret += tcrypt_test("ecb(serpent)");
1293                 ret += tcrypt_test("cbc(serpent)");
1294                 ret += tcrypt_test("ctr(serpent)");
1295                 ret += tcrypt_test("lrw(serpent)");
1296                 ret += tcrypt_test("xts(serpent)");
1297                 break;
1298
1299         case 10:
1300                 ret += tcrypt_test("ecb(aes)");
1301                 ret += tcrypt_test("cbc(aes)");
1302                 ret += tcrypt_test("lrw(aes)");
1303                 ret += tcrypt_test("xts(aes)");
1304                 ret += tcrypt_test("ctr(aes)");
1305                 ret += tcrypt_test("rfc3686(ctr(aes))");
1306                 break;
1307
1308         case 11:
1309                 ret += tcrypt_test("sha384");
1310                 break;
1311
1312         case 12:
1313                 ret += tcrypt_test("sha512");
1314                 break;
1315
1316         case 13:
1317                 ret += tcrypt_test("deflate");
1318                 break;
1319
1320         case 14:
1321                 ret += tcrypt_test("ecb(cast5)");
1322                 ret += tcrypt_test("cbc(cast5)");
1323                 ret += tcrypt_test("ctr(cast5)");
1324                 break;
1325
1326         case 15:
1327                 ret += tcrypt_test("ecb(cast6)");
1328                 ret += tcrypt_test("cbc(cast6)");
1329                 ret += tcrypt_test("ctr(cast6)");
1330                 ret += tcrypt_test("lrw(cast6)");
1331                 ret += tcrypt_test("xts(cast6)");
1332                 break;
1333
1334         case 16:
1335                 ret += tcrypt_test("ecb(arc4)");
1336                 break;
1337
1338         case 17:
1339                 ret += tcrypt_test("michael_mic");
1340                 break;
1341
1342         case 18:
1343                 ret += tcrypt_test("crc32c");
1344                 break;
1345
1346         case 19:
1347                 ret += tcrypt_test("ecb(tea)");
1348                 break;
1349
1350         case 20:
1351                 ret += tcrypt_test("ecb(xtea)");
1352                 break;
1353
1354         case 21:
1355                 ret += tcrypt_test("ecb(khazad)");
1356                 break;
1357
1358         case 22:
1359                 ret += tcrypt_test("wp512");
1360                 break;
1361
1362         case 23:
1363                 ret += tcrypt_test("wp384");
1364                 break;
1365
1366         case 24:
1367                 ret += tcrypt_test("wp256");
1368                 break;
1369
1370         case 25:
1371                 ret += tcrypt_test("ecb(tnepres)");
1372                 break;
1373
1374         case 26:
1375                 ret += tcrypt_test("ecb(anubis)");
1376                 ret += tcrypt_test("cbc(anubis)");
1377                 break;
1378
1379         case 27:
1380                 ret += tcrypt_test("tgr192");
1381                 break;
1382
1383         case 28:
1384                 ret += tcrypt_test("tgr160");
1385                 break;
1386
1387         case 29:
1388                 ret += tcrypt_test("tgr128");
1389                 break;
1390
1391         case 30:
1392                 ret += tcrypt_test("ecb(xeta)");
1393                 break;
1394
1395         case 31:
1396                 ret += tcrypt_test("pcbc(fcrypt)");
1397                 break;
1398
1399         case 32:
1400                 ret += tcrypt_test("ecb(camellia)");
1401                 ret += tcrypt_test("cbc(camellia)");
1402                 ret += tcrypt_test("ctr(camellia)");
1403                 ret += tcrypt_test("lrw(camellia)");
1404                 ret += tcrypt_test("xts(camellia)");
1405                 break;
1406
1407         case 33:
1408                 ret += tcrypt_test("sha224");
1409                 break;
1410
1411         case 34:
1412                 ret += tcrypt_test("salsa20");
1413                 break;
1414
1415         case 35:
1416                 ret += tcrypt_test("gcm(aes)");
1417                 break;
1418
1419         case 36:
1420                 ret += tcrypt_test("lzo");
1421                 break;
1422
1423         case 37:
1424                 ret += tcrypt_test("ccm(aes)");
1425                 break;
1426
1427         case 38:
1428                 ret += tcrypt_test("cts(cbc(aes))");
1429                 break;
1430
1431         case 39:
1432                 ret += tcrypt_test("rmd128");
1433                 break;
1434
1435         case 40:
1436                 ret += tcrypt_test("rmd160");
1437                 break;
1438
1439         case 41:
1440                 ret += tcrypt_test("rmd256");
1441                 break;
1442
1443         case 42:
1444                 ret += tcrypt_test("rmd320");
1445                 break;
1446
1447         case 43:
1448                 ret += tcrypt_test("ecb(seed)");
1449                 break;
1450
1451         case 44:
1452                 ret += tcrypt_test("zlib");
1453                 break;
1454
1455         case 45:
1456                 ret += tcrypt_test("rfc4309(ccm(aes))");
1457                 break;
1458
1459         case 46:
1460                 ret += tcrypt_test("ghash");
1461                 break;
1462
1463         case 47:
1464                 ret += tcrypt_test("crct10dif");
1465                 break;
1466
1467         case 100:
1468                 ret += tcrypt_test("hmac(md5)");
1469                 break;
1470
1471         case 101:
1472                 ret += tcrypt_test("hmac(sha1)");
1473                 break;
1474
1475         case 102:
1476                 ret += tcrypt_test("hmac(sha256)");
1477                 break;
1478
1479         case 103:
1480                 ret += tcrypt_test("hmac(sha384)");
1481                 break;
1482
1483         case 104:
1484                 ret += tcrypt_test("hmac(sha512)");
1485                 break;
1486
1487         case 105:
1488                 ret += tcrypt_test("hmac(sha224)");
1489                 break;
1490
1491         case 106:
1492                 ret += tcrypt_test("xcbc(aes)");
1493                 break;
1494
1495         case 107:
1496                 ret += tcrypt_test("hmac(rmd128)");
1497                 break;
1498
1499         case 108:
1500                 ret += tcrypt_test("hmac(rmd160)");
1501                 break;
1502
1503         case 109:
1504                 ret += tcrypt_test("vmac(aes)");
1505                 break;
1506
1507         case 110:
1508                 ret += tcrypt_test("hmac(crc32)");
1509                 break;
1510
1511         case 150:
1512                 ret += tcrypt_test("ansi_cprng");
1513                 break;
1514
1515         case 151:
1516                 ret += tcrypt_test("rfc4106(gcm(aes))");
1517                 break;
1518
1519         case 152:
1520                 ret += tcrypt_test("rfc4543(gcm(aes))");
1521                 break;
1522
1523         case 153:
1524                 ret += tcrypt_test("cmac(aes)");
1525                 break;
1526
1527         case 154:
1528                 ret += tcrypt_test("cmac(des3_ede)");
1529                 break;
1530
1531         case 155:
1532                 ret += tcrypt_test("authenc(hmac(sha1),cbc(aes))");
1533                 break;
1534
1535         case 156:
1536                 ret += tcrypt_test("authenc(hmac(md5),ecb(cipher_null))");
1537                 break;
1538
1539         case 157:
1540                 ret += tcrypt_test("authenc(hmac(sha1),ecb(cipher_null))");
1541                 break;
1542         case 181:
1543                 ret += tcrypt_test("authenc(hmac(sha1),cbc(des))");
1544                 break;
1545         case 182:
1546                 ret += tcrypt_test("authenc(hmac(sha1),cbc(des3_ede))");
1547                 break;
1548         case 183:
1549                 ret += tcrypt_test("authenc(hmac(sha224),cbc(des))");
1550                 break;
1551         case 184:
1552                 ret += tcrypt_test("authenc(hmac(sha224),cbc(des3_ede))");
1553                 break;
1554         case 185:
1555                 ret += tcrypt_test("authenc(hmac(sha256),cbc(des))");
1556                 break;
1557         case 186:
1558                 ret += tcrypt_test("authenc(hmac(sha256),cbc(des3_ede))");
1559                 break;
1560         case 187:
1561                 ret += tcrypt_test("authenc(hmac(sha384),cbc(des))");
1562                 break;
1563         case 188:
1564                 ret += tcrypt_test("authenc(hmac(sha384),cbc(des3_ede))");
1565                 break;
1566         case 189:
1567                 ret += tcrypt_test("authenc(hmac(sha512),cbc(des))");
1568                 break;
1569         case 190:
1570                 ret += tcrypt_test("authenc(hmac(sha512),cbc(des3_ede))");
1571                 break;
1572         case 200:
1573                 test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
1574                                 speed_template_16_24_32);
1575                 test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
1576                                 speed_template_16_24_32);
1577                 test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
1578                                 speed_template_16_24_32);
1579                 test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
1580                                 speed_template_16_24_32);
1581                 test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
1582                                 speed_template_32_40_48);
1583                 test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
1584                                 speed_template_32_40_48);
1585                 test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
1586                                 speed_template_32_48_64);
1587                 test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
1588                                 speed_template_32_48_64);
1589                 test_cipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
1590                                 speed_template_16_24_32);
1591                 test_cipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
1592                                 speed_template_16_24_32);
1593                 break;
1594
1595         case 201:
1596                 test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
1597                                 des3_speed_template, DES3_SPEED_VECTORS,
1598                                 speed_template_24);
1599                 test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
1600                                 des3_speed_template, DES3_SPEED_VECTORS,
1601                                 speed_template_24);
1602                 test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
1603                                 des3_speed_template, DES3_SPEED_VECTORS,
1604                                 speed_template_24);
1605                 test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
1606                                 des3_speed_template, DES3_SPEED_VECTORS,
1607                                 speed_template_24);
1608                 test_cipher_speed("ctr(des3_ede)", ENCRYPT, sec,
1609                                 des3_speed_template, DES3_SPEED_VECTORS,
1610                                 speed_template_24);
1611                 test_cipher_speed("ctr(des3_ede)", DECRYPT, sec,
1612                                 des3_speed_template, DES3_SPEED_VECTORS,
1613                                 speed_template_24);
1614                 break;
1615
1616         case 202:
1617                 test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
1618                                 speed_template_16_24_32);
1619                 test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
1620                                 speed_template_16_24_32);
1621                 test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
1622                                 speed_template_16_24_32);
1623                 test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
1624                                 speed_template_16_24_32);
1625                 test_cipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
1626                                 speed_template_16_24_32);
1627                 test_cipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
1628                                 speed_template_16_24_32);
1629                 test_cipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
1630                                 speed_template_32_40_48);
1631                 test_cipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
1632                                 speed_template_32_40_48);
1633                 test_cipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
1634                                 speed_template_32_48_64);
1635                 test_cipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
1636                                 speed_template_32_48_64);
1637                 break;
1638
1639         case 203:
1640                 test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
1641                                   speed_template_8_32);
1642                 test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
1643                                   speed_template_8_32);
1644                 test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
1645                                   speed_template_8_32);
1646                 test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
1647                                   speed_template_8_32);
1648                 test_cipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
1649                                   speed_template_8_32);
1650                 test_cipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
1651                                   speed_template_8_32);
1652                 break;
1653
1654         case 204:
1655                 test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
1656                                   speed_template_8);
1657                 test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
1658                                   speed_template_8);
1659                 test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
1660                                   speed_template_8);
1661                 test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
1662                                   speed_template_8);
1663                 break;
1664
1665         case 205:
1666                 test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
1667                                 speed_template_16_24_32);
1668                 test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
1669                                 speed_template_16_24_32);
1670                 test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
1671                                 speed_template_16_24_32);
1672                 test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
1673                                 speed_template_16_24_32);
1674                 test_cipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
1675                                 speed_template_16_24_32);
1676                 test_cipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
1677                                 speed_template_16_24_32);
1678                 test_cipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
1679                                 speed_template_32_40_48);
1680                 test_cipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
1681                                 speed_template_32_40_48);
1682                 test_cipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
1683                                 speed_template_32_48_64);
1684                 test_cipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
1685                                 speed_template_32_48_64);
1686                 break;
1687
1688         case 206:
1689                 test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
1690                                   speed_template_16_32);
1691                 break;
1692
1693         case 207:
1694                 test_cipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
1695                                   speed_template_16_32);
1696                 test_cipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
1697                                   speed_template_16_32);
1698                 test_cipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
1699                                   speed_template_16_32);
1700                 test_cipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
1701                                   speed_template_16_32);
1702                 test_cipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
1703                                   speed_template_16_32);
1704                 test_cipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
1705                                   speed_template_16_32);
1706                 test_cipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
1707                                   speed_template_32_48);
1708                 test_cipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
1709                                   speed_template_32_48);
1710                 test_cipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
1711                                   speed_template_32_64);
1712                 test_cipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
1713                                   speed_template_32_64);
1714                 break;
1715
1716         case 208:
1717                 test_cipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
1718                                   speed_template_8);
1719                 break;
1720
1721         case 209:
1722                 test_cipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
1723                                   speed_template_8_16);
1724                 test_cipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
1725                                   speed_template_8_16);
1726                 test_cipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
1727                                   speed_template_8_16);
1728                 test_cipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
1729                                   speed_template_8_16);
1730                 test_cipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
1731                                   speed_template_8_16);
1732                 test_cipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
1733                                   speed_template_8_16);
1734                 break;
1735
1736         case 210:
1737                 test_cipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
1738                                   speed_template_16_32);
1739                 test_cipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
1740                                   speed_template_16_32);
1741                 test_cipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
1742                                   speed_template_16_32);
1743                 test_cipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
1744                                   speed_template_16_32);
1745                 test_cipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
1746                                   speed_template_16_32);
1747                 test_cipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
1748                                   speed_template_16_32);
1749                 test_cipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
1750                                   speed_template_32_48);
1751                 test_cipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
1752                                   speed_template_32_48);
1753                 test_cipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
1754                                   speed_template_32_64);
1755                 test_cipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
1756                                   speed_template_32_64);
1757                 break;
1758
1759         case 211:
1760                 test_aead_speed("rfc4106(gcm(aes))", ENCRYPT, sec,
1761                                 NULL, 0, 16, 8, aead_speed_template_20);
1762                 break;
1763
1764         case 300:
1765                 if (alg) {
1766                         test_hash_speed(alg, sec, generic_hash_speed_template);
1767                         break;
1768                 }
1769
1770                 /* fall through */
1771
1772         case 301:
1773                 test_hash_speed("md4", sec, generic_hash_speed_template);
1774                 if (mode > 300 && mode < 400) break;
1775
1776         case 302:
1777                 test_hash_speed("md5", sec, generic_hash_speed_template);
1778                 if (mode > 300 && mode < 400) break;
1779
1780         case 303:
1781                 test_hash_speed("sha1", sec, generic_hash_speed_template);
1782                 if (mode > 300 && mode < 400) break;
1783
1784         case 304:
1785                 test_hash_speed("sha256", sec, generic_hash_speed_template);
1786                 if (mode > 300 && mode < 400) break;
1787
1788         case 305:
1789                 test_hash_speed("sha384", sec, generic_hash_speed_template);
1790                 if (mode > 300 && mode < 400) break;
1791
1792         case 306:
1793                 test_hash_speed("sha512", sec, generic_hash_speed_template);
1794                 if (mode > 300 && mode < 400) break;
1795
1796         case 307:
1797                 test_hash_speed("wp256", sec, generic_hash_speed_template);
1798                 if (mode > 300 && mode < 400) break;
1799
1800         case 308:
1801                 test_hash_speed("wp384", sec, generic_hash_speed_template);
1802                 if (mode > 300 && mode < 400) break;
1803
1804         case 309:
1805                 test_hash_speed("wp512", sec, generic_hash_speed_template);
1806                 if (mode > 300 && mode < 400) break;
1807
1808         case 310:
1809                 test_hash_speed("tgr128", sec, generic_hash_speed_template);
1810                 if (mode > 300 && mode < 400) break;
1811
1812         case 311:
1813                 test_hash_speed("tgr160", sec, generic_hash_speed_template);
1814                 if (mode > 300 && mode < 400) break;
1815
1816         case 312:
1817                 test_hash_speed("tgr192", sec, generic_hash_speed_template);
1818                 if (mode > 300 && mode < 400) break;
1819
1820         case 313:
1821                 test_hash_speed("sha224", sec, generic_hash_speed_template);
1822                 if (mode > 300 && mode < 400) break;
1823
1824         case 314:
1825                 test_hash_speed("rmd128", sec, generic_hash_speed_template);
1826                 if (mode > 300 && mode < 400) break;
1827
1828         case 315:
1829                 test_hash_speed("rmd160", sec, generic_hash_speed_template);
1830                 if (mode > 300 && mode < 400) break;
1831
1832         case 316:
1833                 test_hash_speed("rmd256", sec, generic_hash_speed_template);
1834                 if (mode > 300 && mode < 400) break;
1835
1836         case 317:
1837                 test_hash_speed("rmd320", sec, generic_hash_speed_template);
1838                 if (mode > 300 && mode < 400) break;
1839
1840         case 318:
1841                 test_hash_speed("ghash-generic", sec, hash_speed_template_16);
1842                 if (mode > 300 && mode < 400) break;
1843
1844         case 319:
1845                 test_hash_speed("crc32c", sec, generic_hash_speed_template);
1846                 if (mode > 300 && mode < 400) break;
1847
1848         case 320:
1849                 test_hash_speed("crct10dif", sec, generic_hash_speed_template);
1850                 if (mode > 300 && mode < 400) break;
1851
1852         case 399:
1853                 break;
1854
1855         case 400:
1856                 if (alg) {
1857                         test_ahash_speed(alg, sec, generic_hash_speed_template);
1858                         break;
1859                 }
1860
1861                 /* fall through */
1862
1863         case 401:
1864                 test_ahash_speed("md4", sec, generic_hash_speed_template);
1865                 if (mode > 400 && mode < 500) break;
1866
1867         case 402:
1868                 test_ahash_speed("md5", sec, generic_hash_speed_template);
1869                 if (mode > 400 && mode < 500) break;
1870
1871         case 403:
1872                 test_ahash_speed("sha1", sec, generic_hash_speed_template);
1873                 if (mode > 400 && mode < 500) break;
1874
1875         case 404:
1876                 test_ahash_speed("sha256", sec, generic_hash_speed_template);
1877                 if (mode > 400 && mode < 500) break;
1878
1879         case 405:
1880                 test_ahash_speed("sha384", sec, generic_hash_speed_template);
1881                 if (mode > 400 && mode < 500) break;
1882
1883         case 406:
1884                 test_ahash_speed("sha512", sec, generic_hash_speed_template);
1885                 if (mode > 400 && mode < 500) break;
1886
1887         case 407:
1888                 test_ahash_speed("wp256", sec, generic_hash_speed_template);
1889                 if (mode > 400 && mode < 500) break;
1890
1891         case 408:
1892                 test_ahash_speed("wp384", sec, generic_hash_speed_template);
1893                 if (mode > 400 && mode < 500) break;
1894
1895         case 409:
1896                 test_ahash_speed("wp512", sec, generic_hash_speed_template);
1897                 if (mode > 400 && mode < 500) break;
1898
1899         case 410:
1900                 test_ahash_speed("tgr128", sec, generic_hash_speed_template);
1901                 if (mode > 400 && mode < 500) break;
1902
1903         case 411:
1904                 test_ahash_speed("tgr160", sec, generic_hash_speed_template);
1905                 if (mode > 400 && mode < 500) break;
1906
1907         case 412:
1908                 test_ahash_speed("tgr192", sec, generic_hash_speed_template);
1909                 if (mode > 400 && mode < 500) break;
1910
1911         case 413:
1912                 test_ahash_speed("sha224", sec, generic_hash_speed_template);
1913                 if (mode > 400 && mode < 500) break;
1914
1915         case 414:
1916                 test_ahash_speed("rmd128", sec, generic_hash_speed_template);
1917                 if (mode > 400 && mode < 500) break;
1918
1919         case 415:
1920                 test_ahash_speed("rmd160", sec, generic_hash_speed_template);
1921                 if (mode > 400 && mode < 500) break;
1922
1923         case 416:
1924                 test_ahash_speed("rmd256", sec, generic_hash_speed_template);
1925                 if (mode > 400 && mode < 500) break;
1926
1927         case 417:
1928                 test_ahash_speed("rmd320", sec, generic_hash_speed_template);
1929                 if (mode > 400 && mode < 500) break;
1930
1931         case 499:
1932                 break;
1933
1934         case 500:
1935                 test_acipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
1936                                    speed_template_16_24_32);
1937                 test_acipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
1938                                    speed_template_16_24_32);
1939                 test_acipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
1940                                    speed_template_16_24_32);
1941                 test_acipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
1942                                    speed_template_16_24_32);
1943                 test_acipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
1944                                    speed_template_32_40_48);
1945                 test_acipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
1946                                    speed_template_32_40_48);
1947                 test_acipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
1948                                    speed_template_32_48_64);
1949                 test_acipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
1950                                    speed_template_32_48_64);
1951                 test_acipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
1952                                    speed_template_16_24_32);
1953                 test_acipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
1954                                    speed_template_16_24_32);
1955                 test_acipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
1956                                    speed_template_16_24_32);
1957                 test_acipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
1958                                    speed_template_16_24_32);
1959                 test_acipher_speed("ofb(aes)", ENCRYPT, sec, NULL, 0,
1960                                    speed_template_16_24_32);
1961                 test_acipher_speed("ofb(aes)", DECRYPT, sec, NULL, 0,
1962                                    speed_template_16_24_32);
1963                 test_acipher_speed("rfc3686(ctr(aes))", ENCRYPT, sec, NULL, 0,
1964                                    speed_template_20_28_36);
1965                 test_acipher_speed("rfc3686(ctr(aes))", DECRYPT, sec, NULL, 0,
1966                                    speed_template_20_28_36);
1967                 break;
1968
1969         case 501:
1970                 test_acipher_speed("ecb(des3_ede)", ENCRYPT, sec,
1971                                    des3_speed_template, DES3_SPEED_VECTORS,
1972                                    speed_template_24);
1973                 test_acipher_speed("ecb(des3_ede)", DECRYPT, sec,
1974                                    des3_speed_template, DES3_SPEED_VECTORS,
1975                                    speed_template_24);
1976                 test_acipher_speed("cbc(des3_ede)", ENCRYPT, sec,
1977                                    des3_speed_template, DES3_SPEED_VECTORS,
1978                                    speed_template_24);
1979                 test_acipher_speed("cbc(des3_ede)", DECRYPT, sec,
1980                                    des3_speed_template, DES3_SPEED_VECTORS,
1981                                    speed_template_24);
1982                 test_acipher_speed("cfb(des3_ede)", ENCRYPT, sec,
1983                                    des3_speed_template, DES3_SPEED_VECTORS,
1984                                    speed_template_24);
1985                 test_acipher_speed("cfb(des3_ede)", DECRYPT, sec,
1986                                    des3_speed_template, DES3_SPEED_VECTORS,
1987                                    speed_template_24);
1988                 test_acipher_speed("ofb(des3_ede)", ENCRYPT, sec,
1989                                    des3_speed_template, DES3_SPEED_VECTORS,
1990                                    speed_template_24);
1991                 test_acipher_speed("ofb(des3_ede)", DECRYPT, sec,
1992                                    des3_speed_template, DES3_SPEED_VECTORS,
1993                                    speed_template_24);
1994                 break;
1995
1996         case 502:
1997                 test_acipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
1998                                    speed_template_8);
1999                 test_acipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
2000                                    speed_template_8);
2001                 test_acipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
2002                                    speed_template_8);
2003                 test_acipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
2004                                    speed_template_8);
2005                 test_acipher_speed("cfb(des)", ENCRYPT, sec, NULL, 0,
2006                                    speed_template_8);
2007                 test_acipher_speed("cfb(des)", DECRYPT, sec, NULL, 0,
2008                                    speed_template_8);
2009                 test_acipher_speed("ofb(des)", ENCRYPT, sec, NULL, 0,
2010                                    speed_template_8);
2011                 test_acipher_speed("ofb(des)", DECRYPT, sec, NULL, 0,
2012                                    speed_template_8);
2013                 break;
2014
2015         case 503:
2016                 test_acipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
2017                                    speed_template_16_32);
2018                 test_acipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
2019                                    speed_template_16_32);
2020                 test_acipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
2021                                    speed_template_16_32);
2022                 test_acipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
2023                                    speed_template_16_32);
2024                 test_acipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
2025                                    speed_template_16_32);
2026                 test_acipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
2027                                    speed_template_16_32);
2028                 test_acipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
2029                                    speed_template_32_48);
2030                 test_acipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
2031                                    speed_template_32_48);
2032                 test_acipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
2033                                    speed_template_32_64);
2034                 test_acipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
2035                                    speed_template_32_64);
2036                 break;
2037
2038         case 504:
2039                 test_acipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
2040                                    speed_template_16_24_32);
2041                 test_acipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
2042                                    speed_template_16_24_32);
2043                 test_acipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
2044                                    speed_template_16_24_32);
2045                 test_acipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
2046                                    speed_template_16_24_32);
2047                 test_acipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
2048                                    speed_template_16_24_32);
2049                 test_acipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
2050                                    speed_template_16_24_32);
2051                 test_acipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
2052                                    speed_template_32_40_48);
2053                 test_acipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
2054                                    speed_template_32_40_48);
2055                 test_acipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
2056                                    speed_template_32_48_64);
2057                 test_acipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
2058                                    speed_template_32_48_64);
2059                 break;
2060
2061         case 505:
2062                 test_acipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
2063                                    speed_template_8);
2064                 break;
2065
2066         case 506:
2067                 test_acipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
2068                                    speed_template_8_16);
2069                 test_acipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
2070                                    speed_template_8_16);
2071                 test_acipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
2072                                    speed_template_8_16);
2073                 test_acipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
2074                                    speed_template_8_16);
2075                 test_acipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
2076                                    speed_template_8_16);
2077                 test_acipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
2078                                    speed_template_8_16);
2079                 break;
2080
2081         case 507:
2082                 test_acipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
2083                                    speed_template_16_32);
2084                 test_acipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
2085                                    speed_template_16_32);
2086                 test_acipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
2087                                    speed_template_16_32);
2088                 test_acipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
2089                                    speed_template_16_32);
2090                 test_acipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
2091                                    speed_template_16_32);
2092                 test_acipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
2093                                    speed_template_16_32);
2094                 test_acipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
2095                                    speed_template_32_48);
2096                 test_acipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
2097                                    speed_template_32_48);
2098                 test_acipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
2099                                    speed_template_32_64);
2100                 test_acipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
2101                                    speed_template_32_64);
2102                 break;
2103
2104         case 508:
2105                 test_acipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
2106                                    speed_template_16_32);
2107                 test_acipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
2108                                    speed_template_16_32);
2109                 test_acipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
2110                                    speed_template_16_32);
2111                 test_acipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
2112                                    speed_template_16_32);
2113                 test_acipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
2114                                    speed_template_16_32);
2115                 test_acipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
2116                                    speed_template_16_32);
2117                 test_acipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
2118                                    speed_template_32_48);
2119                 test_acipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
2120                                    speed_template_32_48);
2121                 test_acipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
2122                                    speed_template_32_64);
2123                 test_acipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
2124                                    speed_template_32_64);
2125                 break;
2126
2127         case 509:
2128                 test_acipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
2129                                    speed_template_8_32);
2130                 test_acipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
2131                                    speed_template_8_32);
2132                 test_acipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
2133                                    speed_template_8_32);
2134                 test_acipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
2135                                    speed_template_8_32);
2136                 test_acipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
2137                                    speed_template_8_32);
2138                 test_acipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
2139                                    speed_template_8_32);
2140                 break;
2141
2142         case 1000:
2143                 test_available();
2144                 break;
2145         }
2146
2147         return ret;
2148 }
2149
2150 static int __init tcrypt_mod_init(void)
2151 {
2152         int err = -ENOMEM;
2153         int i;
2154
2155         for (i = 0; i < TVMEMSIZE; i++) {
2156                 tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
2157                 if (!tvmem[i])
2158                         goto err_free_tv;
2159         }
2160
2161         err = do_test(alg, type, mask, mode);
2162
2163         if (err) {
2164                 printk(KERN_ERR "tcrypt: one or more tests failed!\n");
2165                 goto err_free_tv;
2166         }
2167
2168         /* We intentionaly return -EAGAIN to prevent keeping the module,
2169          * unless we're running in fips mode. It does all its work from
2170          * init() and doesn't offer any runtime functionality, but in
2171          * the fips case, checking for a successful load is helpful.
2172          * => we don't need it in the memory, do we?
2173          *                                        -- mludvig
2174          */
2175         if (!fips_enabled)
2176                 err = -EAGAIN;
2177
2178 err_free_tv:
2179         for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
2180                 free_page((unsigned long)tvmem[i]);
2181
2182         return err;
2183 }
2184
2185 /*
2186  * If an init function is provided, an exit function must also be provided
2187  * to allow module unload.
2188  */
2189 static void __exit tcrypt_mod_fini(void) { }
2190
2191 module_init(tcrypt_mod_init);
2192 module_exit(tcrypt_mod_fini);
2193
2194 module_param(alg, charp, 0);
2195 module_param(type, uint, 0);
2196 module_param(mask, uint, 0);
2197 module_param(mode, int, 0);
2198 module_param(sec, uint, 0);
2199 MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
2200                       "(defaults to zero which uses CPU cycles instead)");
2201
2202 MODULE_LICENSE("GPL");
2203 MODULE_DESCRIPTION("Quick & dirty crypto testing module");
2204 MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");