OSDN Git Service

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