GNU Linux-libre 5.4.257-gnu1
[releases.git] / crypto / tcrypt.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Quick & dirty crypto testing module.
4  *
5  * This will only exist until we have a better testing mechanism
6  * (e.g. a char device).
7  *
8  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
9  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
10  * Copyright (c) 2007 Nokia Siemens Networks
11  *
12  * Updated RFC4106 AES-GCM testing.
13  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
14  *             Adrian Hoban <adrian.hoban@intel.com>
15  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
16  *             Tadeusz Struk (tadeusz.struk@intel.com)
17  *             Copyright (c) 2010, Intel Corporation.
18  */
19
20 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21
22 #include <crypto/aead.h>
23 #include <crypto/hash.h>
24 #include <crypto/skcipher.h>
25 #include <linux/err.h>
26 #include <linux/fips.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
38 /*
39  * Need slab memory for testing (size in number of pages).
40  */
41 #define TVMEMSIZE       4
42
43 /*
44 * Used by test_cipher_speed()
45 */
46 #define ENCRYPT 1
47 #define DECRYPT 0
48
49 #define MAX_DIGEST_SIZE         64
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 u32 num_mb = 8;
66 static char *tvmem[TVMEMSIZE];
67
68 static char *check[] = {
69         "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256", "sm3",
70         "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
71         "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
72         "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta",  "fcrypt",
73         "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
74         "lzo", "lzo-rle", "cts", "sha3-224", "sha3-256", "sha3-384",
75         "sha3-512", "streebog256", "streebog512",
76         NULL
77 };
78
79 static u32 block_sizes[] = { 16, 64, 256, 1024, 1472, 8192, 0 };
80 static u32 aead_sizes[] = { 16, 64, 256, 512, 1024, 2048, 4096, 8192, 0 };
81
82 #define XBUFSIZE 8
83 #define MAX_IVLEN 32
84
85 static int testmgr_alloc_buf(char *buf[XBUFSIZE])
86 {
87         int i;
88
89         for (i = 0; i < XBUFSIZE; i++) {
90                 buf[i] = (void *)__get_free_page(GFP_KERNEL);
91                 if (!buf[i])
92                         goto err_free_buf;
93         }
94
95         return 0;
96
97 err_free_buf:
98         while (i-- > 0)
99                 free_page((unsigned long)buf[i]);
100
101         return -ENOMEM;
102 }
103
104 static void testmgr_free_buf(char *buf[XBUFSIZE])
105 {
106         int i;
107
108         for (i = 0; i < XBUFSIZE; i++)
109                 free_page((unsigned long)buf[i]);
110 }
111
112 static void sg_init_aead(struct scatterlist *sg, char *xbuf[XBUFSIZE],
113                          unsigned int buflen, const void *assoc,
114                          unsigned int aad_size)
115 {
116         int np = (buflen + PAGE_SIZE - 1)/PAGE_SIZE;
117         int k, rem;
118
119         if (np > XBUFSIZE) {
120                 rem = PAGE_SIZE;
121                 np = XBUFSIZE;
122         } else {
123                 rem = buflen % PAGE_SIZE;
124         }
125
126         sg_init_table(sg, np + 1);
127
128         sg_set_buf(&sg[0], assoc, aad_size);
129
130         if (rem)
131                 np--;
132         for (k = 0; k < np; k++)
133                 sg_set_buf(&sg[k + 1], xbuf[k], PAGE_SIZE);
134
135         if (rem)
136                 sg_set_buf(&sg[k + 1], xbuf[k], rem);
137 }
138
139 static inline int do_one_aead_op(struct aead_request *req, int ret)
140 {
141         struct crypto_wait *wait = req->base.data;
142
143         return crypto_wait_req(ret, wait);
144 }
145
146 struct test_mb_aead_data {
147         struct scatterlist sg[XBUFSIZE];
148         struct scatterlist sgout[XBUFSIZE];
149         struct aead_request *req;
150         struct crypto_wait wait;
151         char *xbuf[XBUFSIZE];
152         char *xoutbuf[XBUFSIZE];
153         char *axbuf[XBUFSIZE];
154 };
155
156 static int do_mult_aead_op(struct test_mb_aead_data *data, int enc,
157                                 u32 num_mb, int *rc)
158 {
159         int i, err = 0;
160
161         /* Fire up a bunch of concurrent requests */
162         for (i = 0; i < num_mb; i++) {
163                 if (enc == ENCRYPT)
164                         rc[i] = crypto_aead_encrypt(data[i].req);
165                 else
166                         rc[i] = crypto_aead_decrypt(data[i].req);
167         }
168
169         /* Wait for all requests to finish */
170         for (i = 0; i < num_mb; i++) {
171                 rc[i] = crypto_wait_req(rc[i], &data[i].wait);
172
173                 if (rc[i]) {
174                         pr_info("concurrent request %d error %d\n", i, rc[i]);
175                         err = rc[i];
176                 }
177         }
178
179         return err;
180 }
181
182 static int test_mb_aead_jiffies(struct test_mb_aead_data *data, int enc,
183                                 int blen, int secs, u32 num_mb)
184 {
185         unsigned long start, end;
186         int bcount;
187         int ret = 0;
188         int *rc;
189
190         rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
191         if (!rc)
192                 return -ENOMEM;
193
194         for (start = jiffies, end = start + secs * HZ, bcount = 0;
195              time_before(jiffies, end); bcount++) {
196                 ret = do_mult_aead_op(data, enc, num_mb, rc);
197                 if (ret)
198                         goto out;
199         }
200
201         pr_cont("%d operations in %d seconds (%llu bytes)\n",
202                 bcount * num_mb, secs, (u64)bcount * blen * num_mb);
203
204 out:
205         kfree(rc);
206         return ret;
207 }
208
209 static int test_mb_aead_cycles(struct test_mb_aead_data *data, int enc,
210                                int blen, u32 num_mb)
211 {
212         unsigned long cycles = 0;
213         int ret = 0;
214         int i;
215         int *rc;
216
217         rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
218         if (!rc)
219                 return -ENOMEM;
220
221         /* Warm-up run. */
222         for (i = 0; i < 4; i++) {
223                 ret = do_mult_aead_op(data, enc, num_mb, rc);
224                 if (ret)
225                         goto out;
226         }
227
228         /* The real thing. */
229         for (i = 0; i < 8; i++) {
230                 cycles_t start, end;
231
232                 start = get_cycles();
233                 ret = do_mult_aead_op(data, enc, num_mb, rc);
234                 end = get_cycles();
235
236                 if (ret)
237                         goto out;
238
239                 cycles += end - start;
240         }
241
242         pr_cont("1 operation in %lu cycles (%d bytes)\n",
243                 (cycles + 4) / (8 * num_mb), blen);
244
245 out:
246         kfree(rc);
247         return ret;
248 }
249
250 static void test_mb_aead_speed(const char *algo, int enc, int secs,
251                                struct aead_speed_template *template,
252                                unsigned int tcount, u8 authsize,
253                                unsigned int aad_size, u8 *keysize, u32 num_mb)
254 {
255         struct test_mb_aead_data *data;
256         struct crypto_aead *tfm;
257         unsigned int i, j, iv_len;
258         const char *key;
259         const char *e;
260         void *assoc;
261         u32 *b_size;
262         char *iv;
263         int ret;
264
265
266         if (aad_size >= PAGE_SIZE) {
267                 pr_err("associate data length (%u) too big\n", aad_size);
268                 return;
269         }
270
271         iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
272         if (!iv)
273                 return;
274
275         if (enc == ENCRYPT)
276                 e = "encryption";
277         else
278                 e = "decryption";
279
280         data = kcalloc(num_mb, sizeof(*data), GFP_KERNEL);
281         if (!data)
282                 goto out_free_iv;
283
284         tfm = crypto_alloc_aead(algo, 0, 0);
285         if (IS_ERR(tfm)) {
286                 pr_err("failed to load transform for %s: %ld\n",
287                         algo, PTR_ERR(tfm));
288                 goto out_free_data;
289         }
290
291         ret = crypto_aead_setauthsize(tfm, authsize);
292
293         for (i = 0; i < num_mb; ++i)
294                 if (testmgr_alloc_buf(data[i].xbuf)) {
295                         while (i--)
296                                 testmgr_free_buf(data[i].xbuf);
297                         goto out_free_tfm;
298                 }
299
300         for (i = 0; i < num_mb; ++i)
301                 if (testmgr_alloc_buf(data[i].axbuf)) {
302                         while (i--)
303                                 testmgr_free_buf(data[i].axbuf);
304                         goto out_free_xbuf;
305                 }
306
307         for (i = 0; i < num_mb; ++i)
308                 if (testmgr_alloc_buf(data[i].xoutbuf)) {
309                         while (i--)
310                                 testmgr_free_buf(data[i].xoutbuf);
311                         goto out_free_axbuf;
312                 }
313
314         for (i = 0; i < num_mb; ++i) {
315                 data[i].req = aead_request_alloc(tfm, GFP_KERNEL);
316                 if (!data[i].req) {
317                         pr_err("alg: skcipher: Failed to allocate request for %s\n",
318                                algo);
319                         while (i--)
320                                 aead_request_free(data[i].req);
321                         goto out_free_xoutbuf;
322                 }
323         }
324
325         for (i = 0; i < num_mb; ++i) {
326                 crypto_init_wait(&data[i].wait);
327                 aead_request_set_callback(data[i].req,
328                                           CRYPTO_TFM_REQ_MAY_BACKLOG,
329                                           crypto_req_done, &data[i].wait);
330         }
331
332         pr_info("\ntesting speed of multibuffer %s (%s) %s\n", algo,
333                 get_driver_name(crypto_aead, tfm), e);
334
335         i = 0;
336         do {
337                 b_size = aead_sizes;
338                 do {
339                         if (*b_size + authsize > XBUFSIZE * PAGE_SIZE) {
340                                 pr_err("template (%u) too big for buffer (%lu)\n",
341                                        authsize + *b_size,
342                                        XBUFSIZE * PAGE_SIZE);
343                                 goto out;
344                         }
345
346                         pr_info("test %u (%d bit key, %d byte blocks): ", i,
347                                 *keysize * 8, *b_size);
348
349                         /* Set up tfm global state, i.e. the key */
350
351                         memset(tvmem[0], 0xff, PAGE_SIZE);
352                         key = tvmem[0];
353                         for (j = 0; j < tcount; j++) {
354                                 if (template[j].klen == *keysize) {
355                                         key = template[j].key;
356                                         break;
357                                 }
358                         }
359
360                         crypto_aead_clear_flags(tfm, ~0);
361
362                         ret = crypto_aead_setkey(tfm, key, *keysize);
363                         if (ret) {
364                                 pr_err("setkey() failed flags=%x\n",
365                                        crypto_aead_get_flags(tfm));
366                                 goto out;
367                         }
368
369                         iv_len = crypto_aead_ivsize(tfm);
370                         if (iv_len)
371                                 memset(iv, 0xff, iv_len);
372
373                         /* Now setup per request stuff, i.e. buffers */
374
375                         for (j = 0; j < num_mb; ++j) {
376                                 struct test_mb_aead_data *cur = &data[j];
377
378                                 assoc = cur->axbuf[0];
379                                 memset(assoc, 0xff, aad_size);
380
381                                 sg_init_aead(cur->sg, cur->xbuf,
382                                              *b_size + (enc ? 0 : authsize),
383                                              assoc, aad_size);
384
385                                 sg_init_aead(cur->sgout, cur->xoutbuf,
386                                              *b_size + (enc ? authsize : 0),
387                                              assoc, aad_size);
388
389                                 aead_request_set_ad(cur->req, aad_size);
390
391                                 if (!enc) {
392
393                                         aead_request_set_crypt(cur->req,
394                                                                cur->sgout,
395                                                                cur->sg,
396                                                                *b_size, iv);
397                                         ret = crypto_aead_encrypt(cur->req);
398                                         ret = do_one_aead_op(cur->req, ret);
399
400                                         if (ret) {
401                                                 pr_err("calculating auth failed failed (%d)\n",
402                                                        ret);
403                                                 break;
404                                         }
405                                 }
406
407                                 aead_request_set_crypt(cur->req, cur->sg,
408                                                        cur->sgout, *b_size +
409                                                        (enc ? 0 : authsize),
410                                                        iv);
411
412                         }
413
414                         if (secs) {
415                                 ret = test_mb_aead_jiffies(data, enc, *b_size,
416                                                            secs, num_mb);
417                                 cond_resched();
418                         } else {
419                                 ret = test_mb_aead_cycles(data, enc, *b_size,
420                                                           num_mb);
421                         }
422
423                         if (ret) {
424                                 pr_err("%s() failed return code=%d\n", e, ret);
425                                 break;
426                         }
427                         b_size++;
428                         i++;
429                 } while (*b_size);
430                 keysize++;
431         } while (*keysize);
432
433 out:
434         for (i = 0; i < num_mb; ++i)
435                 aead_request_free(data[i].req);
436 out_free_xoutbuf:
437         for (i = 0; i < num_mb; ++i)
438                 testmgr_free_buf(data[i].xoutbuf);
439 out_free_axbuf:
440         for (i = 0; i < num_mb; ++i)
441                 testmgr_free_buf(data[i].axbuf);
442 out_free_xbuf:
443         for (i = 0; i < num_mb; ++i)
444                 testmgr_free_buf(data[i].xbuf);
445 out_free_tfm:
446         crypto_free_aead(tfm);
447 out_free_data:
448         kfree(data);
449 out_free_iv:
450         kfree(iv);
451 }
452
453 static int test_aead_jiffies(struct aead_request *req, int enc,
454                                 int blen, int secs)
455 {
456         unsigned long start, end;
457         int bcount;
458         int ret;
459
460         for (start = jiffies, end = start + secs * HZ, bcount = 0;
461              time_before(jiffies, end); bcount++) {
462                 if (enc)
463                         ret = do_one_aead_op(req, crypto_aead_encrypt(req));
464                 else
465                         ret = do_one_aead_op(req, crypto_aead_decrypt(req));
466
467                 if (ret)
468                         return ret;
469         }
470
471         pr_cont("%d operations in %d seconds (%llu bytes)\n",
472                 bcount, secs, (u64)bcount * blen);
473         return 0;
474 }
475
476 static int test_aead_cycles(struct aead_request *req, int enc, int blen)
477 {
478         unsigned long cycles = 0;
479         int ret = 0;
480         int i;
481
482         /* Warm-up run. */
483         for (i = 0; i < 4; i++) {
484                 if (enc)
485                         ret = do_one_aead_op(req, crypto_aead_encrypt(req));
486                 else
487                         ret = do_one_aead_op(req, crypto_aead_decrypt(req));
488
489                 if (ret)
490                         goto out;
491         }
492
493         /* The real thing. */
494         for (i = 0; i < 8; i++) {
495                 cycles_t start, end;
496
497                 start = get_cycles();
498                 if (enc)
499                         ret = do_one_aead_op(req, crypto_aead_encrypt(req));
500                 else
501                         ret = do_one_aead_op(req, crypto_aead_decrypt(req));
502                 end = get_cycles();
503
504                 if (ret)
505                         goto out;
506
507                 cycles += end - start;
508         }
509
510 out:
511         if (ret == 0)
512                 printk("1 operation in %lu cycles (%d bytes)\n",
513                        (cycles + 4) / 8, blen);
514
515         return ret;
516 }
517
518 static void test_aead_speed(const char *algo, int enc, unsigned int secs,
519                             struct aead_speed_template *template,
520                             unsigned int tcount, u8 authsize,
521                             unsigned int aad_size, u8 *keysize)
522 {
523         unsigned int i, j;
524         struct crypto_aead *tfm;
525         int ret = -ENOMEM;
526         const char *key;
527         struct aead_request *req;
528         struct scatterlist *sg;
529         struct scatterlist *sgout;
530         const char *e;
531         void *assoc;
532         char *iv;
533         char *xbuf[XBUFSIZE];
534         char *xoutbuf[XBUFSIZE];
535         char *axbuf[XBUFSIZE];
536         unsigned int *b_size;
537         unsigned int iv_len;
538         struct crypto_wait wait;
539
540         iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
541         if (!iv)
542                 return;
543
544         if (aad_size >= PAGE_SIZE) {
545                 pr_err("associate data length (%u) too big\n", aad_size);
546                 goto out_noxbuf;
547         }
548
549         if (enc == ENCRYPT)
550                 e = "encryption";
551         else
552                 e = "decryption";
553
554         if (testmgr_alloc_buf(xbuf))
555                 goto out_noxbuf;
556         if (testmgr_alloc_buf(axbuf))
557                 goto out_noaxbuf;
558         if (testmgr_alloc_buf(xoutbuf))
559                 goto out_nooutbuf;
560
561         sg = kmalloc(sizeof(*sg) * 9 * 2, GFP_KERNEL);
562         if (!sg)
563                 goto out_nosg;
564         sgout = &sg[9];
565
566         tfm = crypto_alloc_aead(algo, 0, 0);
567
568         if (IS_ERR(tfm)) {
569                 pr_err("alg: aead: Failed to load transform for %s: %ld\n", algo,
570                        PTR_ERR(tfm));
571                 goto out_notfm;
572         }
573
574         crypto_init_wait(&wait);
575         printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo,
576                         get_driver_name(crypto_aead, tfm), e);
577
578         req = aead_request_alloc(tfm, GFP_KERNEL);
579         if (!req) {
580                 pr_err("alg: aead: Failed to allocate request for %s\n",
581                        algo);
582                 goto out_noreq;
583         }
584
585         aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
586                                   crypto_req_done, &wait);
587
588         i = 0;
589         do {
590                 b_size = aead_sizes;
591                 do {
592                         assoc = axbuf[0];
593                         memset(assoc, 0xff, aad_size);
594
595                         if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
596                                 pr_err("template (%u) too big for tvmem (%lu)\n",
597                                        *keysize + *b_size,
598                                         TVMEMSIZE * PAGE_SIZE);
599                                 goto out;
600                         }
601
602                         key = tvmem[0];
603                         for (j = 0; j < tcount; j++) {
604                                 if (template[j].klen == *keysize) {
605                                         key = template[j].key;
606                                         break;
607                                 }
608                         }
609                         ret = crypto_aead_setkey(tfm, key, *keysize);
610                         ret = crypto_aead_setauthsize(tfm, authsize);
611
612                         iv_len = crypto_aead_ivsize(tfm);
613                         if (iv_len)
614                                 memset(iv, 0xff, iv_len);
615
616                         crypto_aead_clear_flags(tfm, ~0);
617                         printk(KERN_INFO "test %u (%d bit key, %d byte blocks): ",
618                                         i, *keysize * 8, *b_size);
619
620
621                         memset(tvmem[0], 0xff, PAGE_SIZE);
622
623                         if (ret) {
624                                 pr_err("setkey() failed flags=%x\n",
625                                                 crypto_aead_get_flags(tfm));
626                                 goto out;
627                         }
628
629                         sg_init_aead(sg, xbuf, *b_size + (enc ? 0 : authsize),
630                                      assoc, aad_size);
631
632                         sg_init_aead(sgout, xoutbuf,
633                                      *b_size + (enc ? authsize : 0), assoc,
634                                      aad_size);
635
636                         aead_request_set_ad(req, aad_size);
637
638                         if (!enc) {
639
640                                 /*
641                                  * For decryption we need a proper auth so
642                                  * we do the encryption path once with buffers
643                                  * reversed (input <-> output) to calculate it
644                                  */
645                                 aead_request_set_crypt(req, sgout, sg,
646                                                        *b_size, iv);
647                                 ret = do_one_aead_op(req,
648                                                      crypto_aead_encrypt(req));
649
650                                 if (ret) {
651                                         pr_err("calculating auth failed failed (%d)\n",
652                                                ret);
653                                         break;
654                                 }
655                         }
656
657                         aead_request_set_crypt(req, sg, sgout,
658                                                *b_size + (enc ? 0 : authsize),
659                                                iv);
660
661                         if (secs) {
662                                 ret = test_aead_jiffies(req, enc, *b_size,
663                                                         secs);
664                                 cond_resched();
665                         } else {
666                                 ret = test_aead_cycles(req, enc, *b_size);
667                         }
668
669                         if (ret) {
670                                 pr_err("%s() failed return code=%d\n", e, ret);
671                                 break;
672                         }
673                         b_size++;
674                         i++;
675                 } while (*b_size);
676                 keysize++;
677         } while (*keysize);
678
679 out:
680         aead_request_free(req);
681 out_noreq:
682         crypto_free_aead(tfm);
683 out_notfm:
684         kfree(sg);
685 out_nosg:
686         testmgr_free_buf(xoutbuf);
687 out_nooutbuf:
688         testmgr_free_buf(axbuf);
689 out_noaxbuf:
690         testmgr_free_buf(xbuf);
691 out_noxbuf:
692         kfree(iv);
693 }
694
695 static void test_hash_sg_init(struct scatterlist *sg)
696 {
697         int i;
698
699         sg_init_table(sg, TVMEMSIZE);
700         for (i = 0; i < TVMEMSIZE; i++) {
701                 sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
702                 memset(tvmem[i], 0xff, PAGE_SIZE);
703         }
704 }
705
706 static inline int do_one_ahash_op(struct ahash_request *req, int ret)
707 {
708         struct crypto_wait *wait = req->base.data;
709
710         return crypto_wait_req(ret, wait);
711 }
712
713 struct test_mb_ahash_data {
714         struct scatterlist sg[XBUFSIZE];
715         char result[64];
716         struct ahash_request *req;
717         struct crypto_wait wait;
718         char *xbuf[XBUFSIZE];
719 };
720
721 static inline int do_mult_ahash_op(struct test_mb_ahash_data *data, u32 num_mb,
722                                    int *rc)
723 {
724         int i, err = 0;
725
726         /* Fire up a bunch of concurrent requests */
727         for (i = 0; i < num_mb; i++)
728                 rc[i] = crypto_ahash_digest(data[i].req);
729
730         /* Wait for all requests to finish */
731         for (i = 0; i < num_mb; i++) {
732                 rc[i] = crypto_wait_req(rc[i], &data[i].wait);
733
734                 if (rc[i]) {
735                         pr_info("concurrent request %d error %d\n", i, rc[i]);
736                         err = rc[i];
737                 }
738         }
739
740         return err;
741 }
742
743 static int test_mb_ahash_jiffies(struct test_mb_ahash_data *data, int blen,
744                                  int secs, u32 num_mb)
745 {
746         unsigned long start, end;
747         int bcount;
748         int ret = 0;
749         int *rc;
750
751         rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
752         if (!rc)
753                 return -ENOMEM;
754
755         for (start = jiffies, end = start + secs * HZ, bcount = 0;
756              time_before(jiffies, end); bcount++) {
757                 ret = do_mult_ahash_op(data, num_mb, rc);
758                 if (ret)
759                         goto out;
760         }
761
762         pr_cont("%d operations in %d seconds (%llu bytes)\n",
763                 bcount * num_mb, secs, (u64)bcount * blen * num_mb);
764
765 out:
766         kfree(rc);
767         return ret;
768 }
769
770 static int test_mb_ahash_cycles(struct test_mb_ahash_data *data, int blen,
771                                 u32 num_mb)
772 {
773         unsigned long cycles = 0;
774         int ret = 0;
775         int i;
776         int *rc;
777
778         rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
779         if (!rc)
780                 return -ENOMEM;
781
782         /* Warm-up run. */
783         for (i = 0; i < 4; i++) {
784                 ret = do_mult_ahash_op(data, num_mb, rc);
785                 if (ret)
786                         goto out;
787         }
788
789         /* The real thing. */
790         for (i = 0; i < 8; i++) {
791                 cycles_t start, end;
792
793                 start = get_cycles();
794                 ret = do_mult_ahash_op(data, num_mb, rc);
795                 end = get_cycles();
796
797                 if (ret)
798                         goto out;
799
800                 cycles += end - start;
801         }
802
803         pr_cont("1 operation in %lu cycles (%d bytes)\n",
804                 (cycles + 4) / (8 * num_mb), blen);
805
806 out:
807         kfree(rc);
808         return ret;
809 }
810
811 static void test_mb_ahash_speed(const char *algo, unsigned int secs,
812                                 struct hash_speed *speed, u32 num_mb)
813 {
814         struct test_mb_ahash_data *data;
815         struct crypto_ahash *tfm;
816         unsigned int i, j, k;
817         int ret;
818
819         data = kcalloc(num_mb, sizeof(*data), GFP_KERNEL);
820         if (!data)
821                 return;
822
823         tfm = crypto_alloc_ahash(algo, 0, 0);
824         if (IS_ERR(tfm)) {
825                 pr_err("failed to load transform for %s: %ld\n",
826                         algo, PTR_ERR(tfm));
827                 goto free_data;
828         }
829
830         for (i = 0; i < num_mb; ++i) {
831                 if (testmgr_alloc_buf(data[i].xbuf))
832                         goto out;
833
834                 crypto_init_wait(&data[i].wait);
835
836                 data[i].req = ahash_request_alloc(tfm, GFP_KERNEL);
837                 if (!data[i].req) {
838                         pr_err("alg: hash: Failed to allocate request for %s\n",
839                                algo);
840                         goto out;
841                 }
842
843                 ahash_request_set_callback(data[i].req, 0, crypto_req_done,
844                                            &data[i].wait);
845
846                 sg_init_table(data[i].sg, XBUFSIZE);
847                 for (j = 0; j < XBUFSIZE; j++) {
848                         sg_set_buf(data[i].sg + j, data[i].xbuf[j], PAGE_SIZE);
849                         memset(data[i].xbuf[j], 0xff, PAGE_SIZE);
850                 }
851         }
852
853         pr_info("\ntesting speed of multibuffer %s (%s)\n", algo,
854                 get_driver_name(crypto_ahash, tfm));
855
856         for (i = 0; speed[i].blen != 0; i++) {
857                 /* For some reason this only tests digests. */
858                 if (speed[i].blen != speed[i].plen)
859                         continue;
860
861                 if (speed[i].blen > XBUFSIZE * PAGE_SIZE) {
862                         pr_err("template (%u) too big for tvmem (%lu)\n",
863                                speed[i].blen, XBUFSIZE * PAGE_SIZE);
864                         goto out;
865                 }
866
867                 if (speed[i].klen)
868                         crypto_ahash_setkey(tfm, tvmem[0], speed[i].klen);
869
870                 for (k = 0; k < num_mb; k++)
871                         ahash_request_set_crypt(data[k].req, data[k].sg,
872                                                 data[k].result, speed[i].blen);
873
874                 pr_info("test%3u "
875                         "(%5u byte blocks,%5u bytes per update,%4u updates): ",
876                         i, speed[i].blen, speed[i].plen,
877                         speed[i].blen / speed[i].plen);
878
879                 if (secs) {
880                         ret = test_mb_ahash_jiffies(data, speed[i].blen, secs,
881                                                     num_mb);
882                         cond_resched();
883                 } else {
884                         ret = test_mb_ahash_cycles(data, speed[i].blen, num_mb);
885                 }
886
887
888                 if (ret) {
889                         pr_err("At least one hashing failed ret=%d\n", ret);
890                         break;
891                 }
892         }
893
894 out:
895         for (k = 0; k < num_mb; ++k)
896                 ahash_request_free(data[k].req);
897
898         for (k = 0; k < num_mb; ++k)
899                 testmgr_free_buf(data[k].xbuf);
900
901         crypto_free_ahash(tfm);
902
903 free_data:
904         kfree(data);
905 }
906
907 static int test_ahash_jiffies_digest(struct ahash_request *req, int blen,
908                                      char *out, int secs)
909 {
910         unsigned long start, end;
911         int bcount;
912         int ret;
913
914         for (start = jiffies, end = start + secs * HZ, bcount = 0;
915              time_before(jiffies, end); bcount++) {
916                 ret = do_one_ahash_op(req, crypto_ahash_digest(req));
917                 if (ret)
918                         return ret;
919         }
920
921         printk("%6u opers/sec, %9lu bytes/sec\n",
922                bcount / secs, ((long)bcount * blen) / secs);
923
924         return 0;
925 }
926
927 static int test_ahash_jiffies(struct ahash_request *req, int blen,
928                               int plen, char *out, int secs)
929 {
930         unsigned long start, end;
931         int bcount, pcount;
932         int ret;
933
934         if (plen == blen)
935                 return test_ahash_jiffies_digest(req, blen, out, secs);
936
937         for (start = jiffies, end = start + secs * HZ, bcount = 0;
938              time_before(jiffies, end); bcount++) {
939                 ret = do_one_ahash_op(req, crypto_ahash_init(req));
940                 if (ret)
941                         return ret;
942                 for (pcount = 0; pcount < blen; pcount += plen) {
943                         ret = do_one_ahash_op(req, crypto_ahash_update(req));
944                         if (ret)
945                                 return ret;
946                 }
947                 /* we assume there is enough space in 'out' for the result */
948                 ret = do_one_ahash_op(req, crypto_ahash_final(req));
949                 if (ret)
950                         return ret;
951         }
952
953         pr_cont("%6u opers/sec, %9lu bytes/sec\n",
954                 bcount / secs, ((long)bcount * blen) / secs);
955
956         return 0;
957 }
958
959 static int test_ahash_cycles_digest(struct ahash_request *req, int blen,
960                                     char *out)
961 {
962         unsigned long cycles = 0;
963         int ret, i;
964
965         /* Warm-up run. */
966         for (i = 0; i < 4; i++) {
967                 ret = do_one_ahash_op(req, crypto_ahash_digest(req));
968                 if (ret)
969                         goto out;
970         }
971
972         /* The real thing. */
973         for (i = 0; i < 8; i++) {
974                 cycles_t start, end;
975
976                 start = get_cycles();
977
978                 ret = do_one_ahash_op(req, crypto_ahash_digest(req));
979                 if (ret)
980                         goto out;
981
982                 end = get_cycles();
983
984                 cycles += end - start;
985         }
986
987 out:
988         if (ret)
989                 return ret;
990
991         pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
992                 cycles / 8, cycles / (8 * blen));
993
994         return 0;
995 }
996
997 static int test_ahash_cycles(struct ahash_request *req, int blen,
998                              int plen, char *out)
999 {
1000         unsigned long cycles = 0;
1001         int i, pcount, ret;
1002
1003         if (plen == blen)
1004                 return test_ahash_cycles_digest(req, blen, out);
1005
1006         /* Warm-up run. */
1007         for (i = 0; i < 4; i++) {
1008                 ret = do_one_ahash_op(req, crypto_ahash_init(req));
1009                 if (ret)
1010                         goto out;
1011                 for (pcount = 0; pcount < blen; pcount += plen) {
1012                         ret = do_one_ahash_op(req, crypto_ahash_update(req));
1013                         if (ret)
1014                                 goto out;
1015                 }
1016                 ret = do_one_ahash_op(req, crypto_ahash_final(req));
1017                 if (ret)
1018                         goto out;
1019         }
1020
1021         /* The real thing. */
1022         for (i = 0; i < 8; i++) {
1023                 cycles_t start, end;
1024
1025                 start = get_cycles();
1026
1027                 ret = do_one_ahash_op(req, crypto_ahash_init(req));
1028                 if (ret)
1029                         goto out;
1030                 for (pcount = 0; pcount < blen; pcount += plen) {
1031                         ret = do_one_ahash_op(req, crypto_ahash_update(req));
1032                         if (ret)
1033                                 goto out;
1034                 }
1035                 ret = do_one_ahash_op(req, crypto_ahash_final(req));
1036                 if (ret)
1037                         goto out;
1038
1039                 end = get_cycles();
1040
1041                 cycles += end - start;
1042         }
1043
1044 out:
1045         if (ret)
1046                 return ret;
1047
1048         pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
1049                 cycles / 8, cycles / (8 * blen));
1050
1051         return 0;
1052 }
1053
1054 static void test_ahash_speed_common(const char *algo, unsigned int secs,
1055                                     struct hash_speed *speed, unsigned mask)
1056 {
1057         struct scatterlist sg[TVMEMSIZE];
1058         struct crypto_wait wait;
1059         struct ahash_request *req;
1060         struct crypto_ahash *tfm;
1061         char *output;
1062         int i, ret;
1063
1064         tfm = crypto_alloc_ahash(algo, 0, mask);
1065         if (IS_ERR(tfm)) {
1066                 pr_err("failed to load transform for %s: %ld\n",
1067                        algo, PTR_ERR(tfm));
1068                 return;
1069         }
1070
1071         printk(KERN_INFO "\ntesting speed of async %s (%s)\n", algo,
1072                         get_driver_name(crypto_ahash, tfm));
1073
1074         if (crypto_ahash_digestsize(tfm) > MAX_DIGEST_SIZE) {
1075                 pr_err("digestsize(%u) > %d\n", crypto_ahash_digestsize(tfm),
1076                        MAX_DIGEST_SIZE);
1077                 goto out;
1078         }
1079
1080         test_hash_sg_init(sg);
1081         req = ahash_request_alloc(tfm, GFP_KERNEL);
1082         if (!req) {
1083                 pr_err("ahash request allocation failure\n");
1084                 goto out;
1085         }
1086
1087         crypto_init_wait(&wait);
1088         ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1089                                    crypto_req_done, &wait);
1090
1091         output = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
1092         if (!output)
1093                 goto out_nomem;
1094
1095         for (i = 0; speed[i].blen != 0; i++) {
1096                 if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
1097                         pr_err("template (%u) too big for tvmem (%lu)\n",
1098                                speed[i].blen, TVMEMSIZE * PAGE_SIZE);
1099                         break;
1100                 }
1101
1102                 if (speed[i].klen)
1103                         crypto_ahash_setkey(tfm, tvmem[0], speed[i].klen);
1104
1105                 pr_info("test%3u "
1106                         "(%5u byte blocks,%5u bytes per update,%4u updates): ",
1107                         i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
1108
1109                 ahash_request_set_crypt(req, sg, output, speed[i].plen);
1110
1111                 if (secs) {
1112                         ret = test_ahash_jiffies(req, speed[i].blen,
1113                                                  speed[i].plen, output, secs);
1114                         cond_resched();
1115                 } else {
1116                         ret = test_ahash_cycles(req, speed[i].blen,
1117                                                 speed[i].plen, output);
1118                 }
1119
1120                 if (ret) {
1121                         pr_err("hashing failed ret=%d\n", ret);
1122                         break;
1123                 }
1124         }
1125
1126         kfree(output);
1127
1128 out_nomem:
1129         ahash_request_free(req);
1130
1131 out:
1132         crypto_free_ahash(tfm);
1133 }
1134
1135 static void test_ahash_speed(const char *algo, unsigned int secs,
1136                              struct hash_speed *speed)
1137 {
1138         return test_ahash_speed_common(algo, secs, speed, 0);
1139 }
1140
1141 static void test_hash_speed(const char *algo, unsigned int secs,
1142                             struct hash_speed *speed)
1143 {
1144         return test_ahash_speed_common(algo, secs, speed, CRYPTO_ALG_ASYNC);
1145 }
1146
1147 struct test_mb_skcipher_data {
1148         struct scatterlist sg[XBUFSIZE];
1149         struct skcipher_request *req;
1150         struct crypto_wait wait;
1151         char *xbuf[XBUFSIZE];
1152 };
1153
1154 static int do_mult_acipher_op(struct test_mb_skcipher_data *data, int enc,
1155                                 u32 num_mb, int *rc)
1156 {
1157         int i, err = 0;
1158
1159         /* Fire up a bunch of concurrent requests */
1160         for (i = 0; i < num_mb; i++) {
1161                 if (enc == ENCRYPT)
1162                         rc[i] = crypto_skcipher_encrypt(data[i].req);
1163                 else
1164                         rc[i] = crypto_skcipher_decrypt(data[i].req);
1165         }
1166
1167         /* Wait for all requests to finish */
1168         for (i = 0; i < num_mb; i++) {
1169                 rc[i] = crypto_wait_req(rc[i], &data[i].wait);
1170
1171                 if (rc[i]) {
1172                         pr_info("concurrent request %d error %d\n", i, rc[i]);
1173                         err = rc[i];
1174                 }
1175         }
1176
1177         return err;
1178 }
1179
1180 static int test_mb_acipher_jiffies(struct test_mb_skcipher_data *data, int enc,
1181                                 int blen, int secs, u32 num_mb)
1182 {
1183         unsigned long start, end;
1184         int bcount;
1185         int ret = 0;
1186         int *rc;
1187
1188         rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
1189         if (!rc)
1190                 return -ENOMEM;
1191
1192         for (start = jiffies, end = start + secs * HZ, bcount = 0;
1193              time_before(jiffies, end); bcount++) {
1194                 ret = do_mult_acipher_op(data, enc, num_mb, rc);
1195                 if (ret)
1196                         goto out;
1197         }
1198
1199         pr_cont("%d operations in %d seconds (%llu bytes)\n",
1200                 bcount * num_mb, secs, (u64)bcount * blen * num_mb);
1201
1202 out:
1203         kfree(rc);
1204         return ret;
1205 }
1206
1207 static int test_mb_acipher_cycles(struct test_mb_skcipher_data *data, int enc,
1208                                int blen, u32 num_mb)
1209 {
1210         unsigned long cycles = 0;
1211         int ret = 0;
1212         int i;
1213         int *rc;
1214
1215         rc = kcalloc(num_mb, sizeof(*rc), GFP_KERNEL);
1216         if (!rc)
1217                 return -ENOMEM;
1218
1219         /* Warm-up run. */
1220         for (i = 0; i < 4; i++) {
1221                 ret = do_mult_acipher_op(data, enc, num_mb, rc);
1222                 if (ret)
1223                         goto out;
1224         }
1225
1226         /* The real thing. */
1227         for (i = 0; i < 8; i++) {
1228                 cycles_t start, end;
1229
1230                 start = get_cycles();
1231                 ret = do_mult_acipher_op(data, enc, num_mb, rc);
1232                 end = get_cycles();
1233
1234                 if (ret)
1235                         goto out;
1236
1237                 cycles += end - start;
1238         }
1239
1240         pr_cont("1 operation in %lu cycles (%d bytes)\n",
1241                 (cycles + 4) / (8 * num_mb), blen);
1242
1243 out:
1244         kfree(rc);
1245         return ret;
1246 }
1247
1248 static void test_mb_skcipher_speed(const char *algo, int enc, int secs,
1249                                    struct cipher_speed_template *template,
1250                                    unsigned int tcount, u8 *keysize, u32 num_mb)
1251 {
1252         struct test_mb_skcipher_data *data;
1253         struct crypto_skcipher *tfm;
1254         unsigned int i, j, iv_len;
1255         const char *key;
1256         const char *e;
1257         u32 *b_size;
1258         char iv[128];
1259         int ret;
1260
1261         if (enc == ENCRYPT)
1262                 e = "encryption";
1263         else
1264                 e = "decryption";
1265
1266         data = kcalloc(num_mb, sizeof(*data), GFP_KERNEL);
1267         if (!data)
1268                 return;
1269
1270         tfm = crypto_alloc_skcipher(algo, 0, 0);
1271         if (IS_ERR(tfm)) {
1272                 pr_err("failed to load transform for %s: %ld\n",
1273                         algo, PTR_ERR(tfm));
1274                 goto out_free_data;
1275         }
1276
1277         for (i = 0; i < num_mb; ++i)
1278                 if (testmgr_alloc_buf(data[i].xbuf)) {
1279                         while (i--)
1280                                 testmgr_free_buf(data[i].xbuf);
1281                         goto out_free_tfm;
1282                 }
1283
1284         for (i = 0; i < num_mb; ++i) {
1285                 data[i].req = skcipher_request_alloc(tfm, GFP_KERNEL);
1286                 if (!data[i].req) {
1287                         pr_err("alg: skcipher: Failed to allocate request for %s\n",
1288                                algo);
1289                         while (i--)
1290                                 skcipher_request_free(data[i].req);
1291                         goto out_free_xbuf;
1292                 }
1293         }
1294
1295         for (i = 0; i < num_mb; ++i) {
1296                 skcipher_request_set_callback(data[i].req,
1297                                               CRYPTO_TFM_REQ_MAY_BACKLOG,
1298                                               crypto_req_done, &data[i].wait);
1299                 crypto_init_wait(&data[i].wait);
1300         }
1301
1302         pr_info("\ntesting speed of multibuffer %s (%s) %s\n", algo,
1303                 get_driver_name(crypto_skcipher, tfm), e);
1304
1305         i = 0;
1306         do {
1307                 b_size = block_sizes;
1308                 do {
1309                         if (*b_size > XBUFSIZE * PAGE_SIZE) {
1310                                 pr_err("template (%u) too big for buffer (%lu)\n",
1311                                        *b_size, XBUFSIZE * PAGE_SIZE);
1312                                 goto out;
1313                         }
1314
1315                         pr_info("test %u (%d bit key, %d byte blocks): ", i,
1316                                 *keysize * 8, *b_size);
1317
1318                         /* Set up tfm global state, i.e. the key */
1319
1320                         memset(tvmem[0], 0xff, PAGE_SIZE);
1321                         key = tvmem[0];
1322                         for (j = 0; j < tcount; j++) {
1323                                 if (template[j].klen == *keysize) {
1324                                         key = template[j].key;
1325                                         break;
1326                                 }
1327                         }
1328
1329                         crypto_skcipher_clear_flags(tfm, ~0);
1330
1331                         ret = crypto_skcipher_setkey(tfm, key, *keysize);
1332                         if (ret) {
1333                                 pr_err("setkey() failed flags=%x\n",
1334                                        crypto_skcipher_get_flags(tfm));
1335                                 goto out;
1336                         }
1337
1338                         iv_len = crypto_skcipher_ivsize(tfm);
1339                         if (iv_len)
1340                                 memset(&iv, 0xff, iv_len);
1341
1342                         /* Now setup per request stuff, i.e. buffers */
1343
1344                         for (j = 0; j < num_mb; ++j) {
1345                                 struct test_mb_skcipher_data *cur = &data[j];
1346                                 unsigned int k = *b_size;
1347                                 unsigned int pages = DIV_ROUND_UP(k, PAGE_SIZE);
1348                                 unsigned int p = 0;
1349
1350                                 sg_init_table(cur->sg, pages);
1351
1352                                 while (k > PAGE_SIZE) {
1353                                         sg_set_buf(cur->sg + p, cur->xbuf[p],
1354                                                    PAGE_SIZE);
1355                                         memset(cur->xbuf[p], 0xff, PAGE_SIZE);
1356                                         p++;
1357                                         k -= PAGE_SIZE;
1358                                 }
1359
1360                                 sg_set_buf(cur->sg + p, cur->xbuf[p], k);
1361                                 memset(cur->xbuf[p], 0xff, k);
1362
1363                                 skcipher_request_set_crypt(cur->req, cur->sg,
1364                                                            cur->sg, *b_size,
1365                                                            iv);
1366                         }
1367
1368                         if (secs) {
1369                                 ret = test_mb_acipher_jiffies(data, enc,
1370                                                               *b_size, secs,
1371                                                               num_mb);
1372                                 cond_resched();
1373                         } else {
1374                                 ret = test_mb_acipher_cycles(data, enc,
1375                                                              *b_size, num_mb);
1376                         }
1377
1378                         if (ret) {
1379                                 pr_err("%s() failed flags=%x\n", e,
1380                                        crypto_skcipher_get_flags(tfm));
1381                                 break;
1382                         }
1383                         b_size++;
1384                         i++;
1385                 } while (*b_size);
1386                 keysize++;
1387         } while (*keysize);
1388
1389 out:
1390         for (i = 0; i < num_mb; ++i)
1391                 skcipher_request_free(data[i].req);
1392 out_free_xbuf:
1393         for (i = 0; i < num_mb; ++i)
1394                 testmgr_free_buf(data[i].xbuf);
1395 out_free_tfm:
1396         crypto_free_skcipher(tfm);
1397 out_free_data:
1398         kfree(data);
1399 }
1400
1401 static inline int do_one_acipher_op(struct skcipher_request *req, int ret)
1402 {
1403         struct crypto_wait *wait = req->base.data;
1404
1405         return crypto_wait_req(ret, wait);
1406 }
1407
1408 static int test_acipher_jiffies(struct skcipher_request *req, int enc,
1409                                 int blen, int secs)
1410 {
1411         unsigned long start, end;
1412         int bcount;
1413         int ret;
1414
1415         for (start = jiffies, end = start + secs * HZ, bcount = 0;
1416              time_before(jiffies, end); bcount++) {
1417                 if (enc)
1418                         ret = do_one_acipher_op(req,
1419                                                 crypto_skcipher_encrypt(req));
1420                 else
1421                         ret = do_one_acipher_op(req,
1422                                                 crypto_skcipher_decrypt(req));
1423
1424                 if (ret)
1425                         return ret;
1426         }
1427
1428         pr_cont("%d operations in %d seconds (%llu bytes)\n",
1429                 bcount, secs, (u64)bcount * blen);
1430         return 0;
1431 }
1432
1433 static int test_acipher_cycles(struct skcipher_request *req, int enc,
1434                                int blen)
1435 {
1436         unsigned long cycles = 0;
1437         int ret = 0;
1438         int i;
1439
1440         /* Warm-up run. */
1441         for (i = 0; i < 4; i++) {
1442                 if (enc)
1443                         ret = do_one_acipher_op(req,
1444                                                 crypto_skcipher_encrypt(req));
1445                 else
1446                         ret = do_one_acipher_op(req,
1447                                                 crypto_skcipher_decrypt(req));
1448
1449                 if (ret)
1450                         goto out;
1451         }
1452
1453         /* The real thing. */
1454         for (i = 0; i < 8; i++) {
1455                 cycles_t start, end;
1456
1457                 start = get_cycles();
1458                 if (enc)
1459                         ret = do_one_acipher_op(req,
1460                                                 crypto_skcipher_encrypt(req));
1461                 else
1462                         ret = do_one_acipher_op(req,
1463                                                 crypto_skcipher_decrypt(req));
1464                 end = get_cycles();
1465
1466                 if (ret)
1467                         goto out;
1468
1469                 cycles += end - start;
1470         }
1471
1472 out:
1473         if (ret == 0)
1474                 pr_cont("1 operation in %lu cycles (%d bytes)\n",
1475                         (cycles + 4) / 8, blen);
1476
1477         return ret;
1478 }
1479
1480 static void test_skcipher_speed(const char *algo, int enc, unsigned int secs,
1481                                 struct cipher_speed_template *template,
1482                                 unsigned int tcount, u8 *keysize, bool async)
1483 {
1484         unsigned int ret, i, j, k, iv_len;
1485         struct crypto_wait wait;
1486         const char *key;
1487         char iv[128];
1488         struct skcipher_request *req;
1489         struct crypto_skcipher *tfm;
1490         const char *e;
1491         u32 *b_size;
1492
1493         if (enc == ENCRYPT)
1494                 e = "encryption";
1495         else
1496                 e = "decryption";
1497
1498         crypto_init_wait(&wait);
1499
1500         tfm = crypto_alloc_skcipher(algo, 0, async ? 0 : CRYPTO_ALG_ASYNC);
1501
1502         if (IS_ERR(tfm)) {
1503                 pr_err("failed to load transform for %s: %ld\n", algo,
1504                        PTR_ERR(tfm));
1505                 return;
1506         }
1507
1508         pr_info("\ntesting speed of async %s (%s) %s\n", algo,
1509                         get_driver_name(crypto_skcipher, tfm), e);
1510
1511         req = skcipher_request_alloc(tfm, GFP_KERNEL);
1512         if (!req) {
1513                 pr_err("tcrypt: skcipher: Failed to allocate request for %s\n",
1514                        algo);
1515                 goto out;
1516         }
1517
1518         skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1519                                       crypto_req_done, &wait);
1520
1521         i = 0;
1522         do {
1523                 b_size = block_sizes;
1524
1525                 do {
1526                         struct scatterlist sg[TVMEMSIZE];
1527
1528                         if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
1529                                 pr_err("template (%u) too big for "
1530                                        "tvmem (%lu)\n", *keysize + *b_size,
1531                                        TVMEMSIZE * PAGE_SIZE);
1532                                 goto out_free_req;
1533                         }
1534
1535                         pr_info("test %u (%d bit key, %d byte blocks): ", i,
1536                                 *keysize * 8, *b_size);
1537
1538                         memset(tvmem[0], 0xff, PAGE_SIZE);
1539
1540                         /* set key, plain text and IV */
1541                         key = tvmem[0];
1542                         for (j = 0; j < tcount; j++) {
1543                                 if (template[j].klen == *keysize) {
1544                                         key = template[j].key;
1545                                         break;
1546                                 }
1547                         }
1548
1549                         crypto_skcipher_clear_flags(tfm, ~0);
1550
1551                         ret = crypto_skcipher_setkey(tfm, key, *keysize);
1552                         if (ret) {
1553                                 pr_err("setkey() failed flags=%x\n",
1554                                         crypto_skcipher_get_flags(tfm));
1555                                 goto out_free_req;
1556                         }
1557
1558                         k = *keysize + *b_size;
1559                         sg_init_table(sg, DIV_ROUND_UP(k, PAGE_SIZE));
1560
1561                         if (k > PAGE_SIZE) {
1562                                 sg_set_buf(sg, tvmem[0] + *keysize,
1563                                    PAGE_SIZE - *keysize);
1564                                 k -= PAGE_SIZE;
1565                                 j = 1;
1566                                 while (k > PAGE_SIZE) {
1567                                         sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
1568                                         memset(tvmem[j], 0xff, PAGE_SIZE);
1569                                         j++;
1570                                         k -= PAGE_SIZE;
1571                                 }
1572                                 sg_set_buf(sg + j, tvmem[j], k);
1573                                 memset(tvmem[j], 0xff, k);
1574                         } else {
1575                                 sg_set_buf(sg, tvmem[0] + *keysize, *b_size);
1576                         }
1577
1578                         iv_len = crypto_skcipher_ivsize(tfm);
1579                         if (iv_len)
1580                                 memset(&iv, 0xff, iv_len);
1581
1582                         skcipher_request_set_crypt(req, sg, sg, *b_size, iv);
1583
1584                         if (secs) {
1585                                 ret = test_acipher_jiffies(req, enc,
1586                                                            *b_size, secs);
1587                                 cond_resched();
1588                         } else {
1589                                 ret = test_acipher_cycles(req, enc,
1590                                                           *b_size);
1591                         }
1592
1593                         if (ret) {
1594                                 pr_err("%s() failed flags=%x\n", e,
1595                                        crypto_skcipher_get_flags(tfm));
1596                                 break;
1597                         }
1598                         b_size++;
1599                         i++;
1600                 } while (*b_size);
1601                 keysize++;
1602         } while (*keysize);
1603
1604 out_free_req:
1605         skcipher_request_free(req);
1606 out:
1607         crypto_free_skcipher(tfm);
1608 }
1609
1610 static void test_acipher_speed(const char *algo, int enc, unsigned int secs,
1611                                struct cipher_speed_template *template,
1612                                unsigned int tcount, u8 *keysize)
1613 {
1614         return test_skcipher_speed(algo, enc, secs, template, tcount, keysize,
1615                                    true);
1616 }
1617
1618 static void test_cipher_speed(const char *algo, int enc, unsigned int secs,
1619                               struct cipher_speed_template *template,
1620                               unsigned int tcount, u8 *keysize)
1621 {
1622         return test_skcipher_speed(algo, enc, secs, template, tcount, keysize,
1623                                    false);
1624 }
1625
1626 static void test_available(void)
1627 {
1628         char **name = check;
1629
1630         while (*name) {
1631                 printk("alg %s ", *name);
1632                 printk(crypto_has_alg(*name, 0, 0) ?
1633                        "found\n" : "not found\n");
1634                 name++;
1635         }
1636 }
1637
1638 static inline int tcrypt_test(const char *alg)
1639 {
1640         int ret;
1641
1642         pr_debug("testing %s\n", alg);
1643
1644         ret = alg_test(alg, alg, 0, 0);
1645         /* non-fips algs return -EINVAL in fips mode */
1646         if (fips_enabled && ret == -EINVAL)
1647                 ret = 0;
1648         return ret;
1649 }
1650
1651 static int do_test(const char *alg, u32 type, u32 mask, int m, u32 num_mb)
1652 {
1653         int i;
1654         int ret = 0;
1655
1656         switch (m) {
1657         case 0:
1658                 if (alg) {
1659                         if (!crypto_has_alg(alg, type,
1660                                             mask ?: CRYPTO_ALG_TYPE_MASK))
1661                                 ret = -ENOENT;
1662                         break;
1663                 }
1664
1665                 for (i = 1; i < 200; i++)
1666                         ret += do_test(NULL, 0, 0, i, num_mb);
1667                 break;
1668
1669         case 1:
1670                 ret += tcrypt_test("md5");
1671                 break;
1672
1673         case 2:
1674                 ret += tcrypt_test("sha1");
1675                 break;
1676
1677         case 3:
1678                 ret += tcrypt_test("ecb(des)");
1679                 ret += tcrypt_test("cbc(des)");
1680                 ret += tcrypt_test("ctr(des)");
1681                 break;
1682
1683         case 4:
1684                 ret += tcrypt_test("ecb(des3_ede)");
1685                 ret += tcrypt_test("cbc(des3_ede)");
1686                 ret += tcrypt_test("ctr(des3_ede)");
1687                 break;
1688
1689         case 5:
1690                 ret += tcrypt_test("md4");
1691                 break;
1692
1693         case 6:
1694                 ret += tcrypt_test("sha256");
1695                 break;
1696
1697         case 7:
1698                 ret += tcrypt_test("ecb(blowfish)");
1699                 ret += tcrypt_test("cbc(blowfish)");
1700                 ret += tcrypt_test("ctr(blowfish)");
1701                 break;
1702
1703         case 8:
1704                 ret += tcrypt_test("ecb(twofish)");
1705                 ret += tcrypt_test("cbc(twofish)");
1706                 ret += tcrypt_test("ctr(twofish)");
1707                 ret += tcrypt_test("lrw(twofish)");
1708                 ret += tcrypt_test("xts(twofish)");
1709                 break;
1710
1711         case 9:
1712                 ret += tcrypt_test("ecb(serpent)");
1713                 ret += tcrypt_test("cbc(serpent)");
1714                 ret += tcrypt_test("ctr(serpent)");
1715                 ret += tcrypt_test("lrw(serpent)");
1716                 ret += tcrypt_test("xts(serpent)");
1717                 break;
1718
1719         case 10:
1720                 ret += tcrypt_test("ecb(aes)");
1721                 ret += tcrypt_test("cbc(aes)");
1722                 ret += tcrypt_test("lrw(aes)");
1723                 ret += tcrypt_test("xts(aes)");
1724                 ret += tcrypt_test("ctr(aes)");
1725                 ret += tcrypt_test("rfc3686(ctr(aes))");
1726                 ret += tcrypt_test("ofb(aes)");
1727                 ret += tcrypt_test("cfb(aes)");
1728                 break;
1729
1730         case 11:
1731                 ret += tcrypt_test("sha384");
1732                 break;
1733
1734         case 12:
1735                 ret += tcrypt_test("sha512");
1736                 break;
1737
1738         case 13:
1739                 ret += tcrypt_test("deflate");
1740                 break;
1741
1742         case 14:
1743                 ret += tcrypt_test("ecb(cast5)");
1744                 ret += tcrypt_test("cbc(cast5)");
1745                 ret += tcrypt_test("ctr(cast5)");
1746                 break;
1747
1748         case 15:
1749                 ret += tcrypt_test("ecb(cast6)");
1750                 ret += tcrypt_test("cbc(cast6)");
1751                 ret += tcrypt_test("ctr(cast6)");
1752                 ret += tcrypt_test("lrw(cast6)");
1753                 ret += tcrypt_test("xts(cast6)");
1754                 break;
1755
1756         case 16:
1757                 ret += tcrypt_test("ecb(arc4)");
1758                 break;
1759
1760         case 17:
1761                 ret += tcrypt_test("michael_mic");
1762                 break;
1763
1764         case 18:
1765                 ret += tcrypt_test("crc32c");
1766                 break;
1767
1768         case 19:
1769                 ret += tcrypt_test("ecb(tea)");
1770                 break;
1771
1772         case 20:
1773                 ret += tcrypt_test("ecb(xtea)");
1774                 break;
1775
1776         case 21:
1777                 ret += tcrypt_test("ecb(khazad)");
1778                 break;
1779
1780         case 22:
1781                 ret += tcrypt_test("wp512");
1782                 break;
1783
1784         case 23:
1785                 ret += tcrypt_test("wp384");
1786                 break;
1787
1788         case 24:
1789                 ret += tcrypt_test("wp256");
1790                 break;
1791
1792         case 25:
1793                 ret += tcrypt_test("ecb(tnepres)");
1794                 break;
1795
1796         case 26:
1797                 ret += tcrypt_test("ecb(anubis)");
1798                 ret += tcrypt_test("cbc(anubis)");
1799                 break;
1800
1801         case 27:
1802                 ret += tcrypt_test("tgr192");
1803                 break;
1804
1805         case 28:
1806                 ret += tcrypt_test("tgr160");
1807                 break;
1808
1809         case 29:
1810                 ret += tcrypt_test("tgr128");
1811                 break;
1812
1813         case 30:
1814                 ret += tcrypt_test("ecb(xeta)");
1815                 break;
1816
1817         case 31:
1818                 ret += tcrypt_test("pcbc(fcrypt)");
1819                 break;
1820
1821         case 32:
1822                 ret += tcrypt_test("ecb(camellia)");
1823                 ret += tcrypt_test("cbc(camellia)");
1824                 ret += tcrypt_test("ctr(camellia)");
1825                 ret += tcrypt_test("lrw(camellia)");
1826                 ret += tcrypt_test("xts(camellia)");
1827                 break;
1828
1829         case 33:
1830                 ret += tcrypt_test("sha224");
1831                 break;
1832
1833         case 34:
1834                 ret += tcrypt_test("salsa20");
1835                 break;
1836
1837         case 35:
1838                 ret += tcrypt_test("gcm(aes)");
1839                 break;
1840
1841         case 36:
1842                 ret += tcrypt_test("lzo");
1843                 break;
1844
1845         case 37:
1846                 ret += tcrypt_test("ccm(aes)");
1847                 break;
1848
1849         case 38:
1850                 ret += tcrypt_test("cts(cbc(aes))");
1851                 break;
1852
1853         case 39:
1854                 ret += tcrypt_test("rmd128");
1855                 break;
1856
1857         case 40:
1858                 ret += tcrypt_test("rmd160");
1859                 break;
1860
1861         case 41:
1862                 ret += tcrypt_test("rmd256");
1863                 break;
1864
1865         case 42:
1866                 ret += tcrypt_test("rmd320");
1867                 break;
1868
1869         case 43:
1870                 ret += tcrypt_test("ecb(seed)");
1871                 break;
1872
1873         case 45:
1874                 ret += tcrypt_test("rfc4309(ccm(aes))");
1875                 break;
1876
1877         case 46:
1878                 ret += tcrypt_test("ghash");
1879                 break;
1880
1881         case 47:
1882                 ret += tcrypt_test("crct10dif");
1883                 break;
1884
1885         case 48:
1886                 ret += tcrypt_test("sha3-224");
1887                 break;
1888
1889         case 49:
1890                 ret += tcrypt_test("sha3-256");
1891                 break;
1892
1893         case 50:
1894                 ret += tcrypt_test("sha3-384");
1895                 break;
1896
1897         case 51:
1898                 ret += tcrypt_test("sha3-512");
1899                 break;
1900
1901         case 52:
1902                 ret += tcrypt_test("sm3");
1903                 break;
1904
1905         case 53:
1906                 ret += tcrypt_test("streebog256");
1907                 break;
1908
1909         case 54:
1910                 ret += tcrypt_test("streebog512");
1911                 break;
1912
1913         case 100:
1914                 ret += tcrypt_test("hmac(md5)");
1915                 break;
1916
1917         case 101:
1918                 ret += tcrypt_test("hmac(sha1)");
1919                 break;
1920
1921         case 102:
1922                 ret += tcrypt_test("hmac(sha256)");
1923                 break;
1924
1925         case 103:
1926                 ret += tcrypt_test("hmac(sha384)");
1927                 break;
1928
1929         case 104:
1930                 ret += tcrypt_test("hmac(sha512)");
1931                 break;
1932
1933         case 105:
1934                 ret += tcrypt_test("hmac(sha224)");
1935                 break;
1936
1937         case 106:
1938                 ret += tcrypt_test("xcbc(aes)");
1939                 break;
1940
1941         case 107:
1942                 ret += tcrypt_test("hmac(rmd128)");
1943                 break;
1944
1945         case 108:
1946                 ret += tcrypt_test("hmac(rmd160)");
1947                 break;
1948
1949         case 109:
1950                 ret += tcrypt_test("vmac64(aes)");
1951                 break;
1952
1953         case 111:
1954                 ret += tcrypt_test("hmac(sha3-224)");
1955                 break;
1956
1957         case 112:
1958                 ret += tcrypt_test("hmac(sha3-256)");
1959                 break;
1960
1961         case 113:
1962                 ret += tcrypt_test("hmac(sha3-384)");
1963                 break;
1964
1965         case 114:
1966                 ret += tcrypt_test("hmac(sha3-512)");
1967                 break;
1968
1969         case 115:
1970                 ret += tcrypt_test("hmac(streebog256)");
1971                 break;
1972
1973         case 116:
1974                 ret += tcrypt_test("hmac(streebog512)");
1975                 break;
1976
1977         case 150:
1978                 ret += tcrypt_test("ansi_cprng");
1979                 break;
1980
1981         case 151:
1982                 ret += tcrypt_test("rfc4106(gcm(aes))");
1983                 break;
1984
1985         case 152:
1986                 ret += tcrypt_test("rfc4543(gcm(aes))");
1987                 break;
1988
1989         case 153:
1990                 ret += tcrypt_test("cmac(aes)");
1991                 break;
1992
1993         case 154:
1994                 ret += tcrypt_test("cmac(des3_ede)");
1995                 break;
1996
1997         case 155:
1998                 ret += tcrypt_test("authenc(hmac(sha1),cbc(aes))");
1999                 break;
2000
2001         case 156:
2002                 ret += tcrypt_test("authenc(hmac(md5),ecb(cipher_null))");
2003                 break;
2004
2005         case 157:
2006                 ret += tcrypt_test("authenc(hmac(sha1),ecb(cipher_null))");
2007                 break;
2008         case 181:
2009                 ret += tcrypt_test("authenc(hmac(sha1),cbc(des))");
2010                 break;
2011         case 182:
2012                 ret += tcrypt_test("authenc(hmac(sha1),cbc(des3_ede))");
2013                 break;
2014         case 183:
2015                 ret += tcrypt_test("authenc(hmac(sha224),cbc(des))");
2016                 break;
2017         case 184:
2018                 ret += tcrypt_test("authenc(hmac(sha224),cbc(des3_ede))");
2019                 break;
2020         case 185:
2021                 ret += tcrypt_test("authenc(hmac(sha256),cbc(des))");
2022                 break;
2023         case 186:
2024                 ret += tcrypt_test("authenc(hmac(sha256),cbc(des3_ede))");
2025                 break;
2026         case 187:
2027                 ret += tcrypt_test("authenc(hmac(sha384),cbc(des))");
2028                 break;
2029         case 188:
2030                 ret += tcrypt_test("authenc(hmac(sha384),cbc(des3_ede))");
2031                 break;
2032         case 189:
2033                 ret += tcrypt_test("authenc(hmac(sha512),cbc(des))");
2034                 break;
2035         case 190:
2036                 ret += tcrypt_test("authenc(hmac(sha512),cbc(des3_ede))");
2037                 break;
2038         case 191:
2039                 ret += tcrypt_test("ecb(sm4)");
2040                 ret += tcrypt_test("cbc(sm4)");
2041                 ret += tcrypt_test("ctr(sm4)");
2042                 break;
2043         case 200:
2044                 test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
2045                                 speed_template_16_24_32);
2046                 test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
2047                                 speed_template_16_24_32);
2048                 test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
2049                                 speed_template_16_24_32);
2050                 test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
2051                                 speed_template_16_24_32);
2052                 test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
2053                                 speed_template_32_40_48);
2054                 test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
2055                                 speed_template_32_40_48);
2056                 test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
2057                                 speed_template_32_64);
2058                 test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
2059                                 speed_template_32_64);
2060                 test_cipher_speed("cts(cbc(aes))", ENCRYPT, sec, NULL, 0,
2061                                 speed_template_16_24_32);
2062                 test_cipher_speed("cts(cbc(aes))", DECRYPT, sec, NULL, 0,
2063                                 speed_template_16_24_32);
2064                 test_cipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
2065                                 speed_template_16_24_32);
2066                 test_cipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
2067                                 speed_template_16_24_32);
2068                 test_cipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
2069                                 speed_template_16_24_32);
2070                 test_cipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
2071                                 speed_template_16_24_32);
2072                 break;
2073
2074         case 201:
2075                 test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
2076                                 des3_speed_template, DES3_SPEED_VECTORS,
2077                                 speed_template_24);
2078                 test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
2079                                 des3_speed_template, DES3_SPEED_VECTORS,
2080                                 speed_template_24);
2081                 test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
2082                                 des3_speed_template, DES3_SPEED_VECTORS,
2083                                 speed_template_24);
2084                 test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
2085                                 des3_speed_template, DES3_SPEED_VECTORS,
2086                                 speed_template_24);
2087                 test_cipher_speed("ctr(des3_ede)", ENCRYPT, sec,
2088                                 des3_speed_template, DES3_SPEED_VECTORS,
2089                                 speed_template_24);
2090                 test_cipher_speed("ctr(des3_ede)", DECRYPT, sec,
2091                                 des3_speed_template, DES3_SPEED_VECTORS,
2092                                 speed_template_24);
2093                 break;
2094
2095         case 202:
2096                 test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
2097                                 speed_template_16_24_32);
2098                 test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
2099                                 speed_template_16_24_32);
2100                 test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
2101                                 speed_template_16_24_32);
2102                 test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
2103                                 speed_template_16_24_32);
2104                 test_cipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
2105                                 speed_template_16_24_32);
2106                 test_cipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
2107                                 speed_template_16_24_32);
2108                 test_cipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
2109                                 speed_template_32_40_48);
2110                 test_cipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
2111                                 speed_template_32_40_48);
2112                 test_cipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
2113                                 speed_template_32_48_64);
2114                 test_cipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
2115                                 speed_template_32_48_64);
2116                 break;
2117
2118         case 203:
2119                 test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
2120                                   speed_template_8_32);
2121                 test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
2122                                   speed_template_8_32);
2123                 test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
2124                                   speed_template_8_32);
2125                 test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
2126                                   speed_template_8_32);
2127                 test_cipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
2128                                   speed_template_8_32);
2129                 test_cipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
2130                                   speed_template_8_32);
2131                 break;
2132
2133         case 204:
2134                 test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
2135                                   speed_template_8);
2136                 test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
2137                                   speed_template_8);
2138                 test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
2139                                   speed_template_8);
2140                 test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
2141                                   speed_template_8);
2142                 break;
2143
2144         case 205:
2145                 test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
2146                                 speed_template_16_24_32);
2147                 test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
2148                                 speed_template_16_24_32);
2149                 test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
2150                                 speed_template_16_24_32);
2151                 test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
2152                                 speed_template_16_24_32);
2153                 test_cipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
2154                                 speed_template_16_24_32);
2155                 test_cipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
2156                                 speed_template_16_24_32);
2157                 test_cipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
2158                                 speed_template_32_40_48);
2159                 test_cipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
2160                                 speed_template_32_40_48);
2161                 test_cipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
2162                                 speed_template_32_48_64);
2163                 test_cipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
2164                                 speed_template_32_48_64);
2165                 break;
2166
2167         case 206:
2168                 test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
2169                                   speed_template_16_32);
2170                 break;
2171
2172         case 207:
2173                 test_cipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
2174                                   speed_template_16_32);
2175                 test_cipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
2176                                   speed_template_16_32);
2177                 test_cipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
2178                                   speed_template_16_32);
2179                 test_cipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
2180                                   speed_template_16_32);
2181                 test_cipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
2182                                   speed_template_16_32);
2183                 test_cipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
2184                                   speed_template_16_32);
2185                 test_cipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
2186                                   speed_template_32_48);
2187                 test_cipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
2188                                   speed_template_32_48);
2189                 test_cipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
2190                                   speed_template_32_64);
2191                 test_cipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
2192                                   speed_template_32_64);
2193                 break;
2194
2195         case 208:
2196                 test_cipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
2197                                   speed_template_8);
2198                 break;
2199
2200         case 209:
2201                 test_cipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
2202                                   speed_template_8_16);
2203                 test_cipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
2204                                   speed_template_8_16);
2205                 test_cipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
2206                                   speed_template_8_16);
2207                 test_cipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
2208                                   speed_template_8_16);
2209                 test_cipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
2210                                   speed_template_8_16);
2211                 test_cipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
2212                                   speed_template_8_16);
2213                 break;
2214
2215         case 210:
2216                 test_cipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
2217                                   speed_template_16_32);
2218                 test_cipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
2219                                   speed_template_16_32);
2220                 test_cipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
2221                                   speed_template_16_32);
2222                 test_cipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
2223                                   speed_template_16_32);
2224                 test_cipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
2225                                   speed_template_16_32);
2226                 test_cipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
2227                                   speed_template_16_32);
2228                 test_cipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
2229                                   speed_template_32_48);
2230                 test_cipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
2231                                   speed_template_32_48);
2232                 test_cipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
2233                                   speed_template_32_64);
2234                 test_cipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
2235                                   speed_template_32_64);
2236                 break;
2237
2238         case 211:
2239                 test_aead_speed("rfc4106(gcm(aes))", ENCRYPT, sec,
2240                                 NULL, 0, 16, 16, aead_speed_template_20);
2241                 test_aead_speed("gcm(aes)", ENCRYPT, sec,
2242                                 NULL, 0, 16, 8, speed_template_16_24_32);
2243                 test_aead_speed("rfc4106(gcm(aes))", DECRYPT, sec,
2244                                 NULL, 0, 16, 16, aead_speed_template_20);
2245                 test_aead_speed("gcm(aes)", DECRYPT, sec,
2246                                 NULL, 0, 16, 8, speed_template_16_24_32);
2247                 break;
2248
2249         case 212:
2250                 test_aead_speed("rfc4309(ccm(aes))", ENCRYPT, sec,
2251                                 NULL, 0, 16, 16, aead_speed_template_19);
2252                 test_aead_speed("rfc4309(ccm(aes))", DECRYPT, sec,
2253                                 NULL, 0, 16, 16, aead_speed_template_19);
2254                 break;
2255
2256         case 213:
2257                 test_aead_speed("rfc7539esp(chacha20,poly1305)", ENCRYPT, sec,
2258                                 NULL, 0, 16, 8, aead_speed_template_36);
2259                 test_aead_speed("rfc7539esp(chacha20,poly1305)", DECRYPT, sec,
2260                                 NULL, 0, 16, 8, aead_speed_template_36);
2261                 break;
2262
2263         case 214:
2264                 test_cipher_speed("chacha20", ENCRYPT, sec, NULL, 0,
2265                                   speed_template_32);
2266                 break;
2267
2268         case 215:
2269                 test_mb_aead_speed("rfc4106(gcm(aes))", ENCRYPT, sec, NULL,
2270                                    0, 16, 16, aead_speed_template_20, num_mb);
2271                 test_mb_aead_speed("gcm(aes)", ENCRYPT, sec, NULL, 0, 16, 8,
2272                                    speed_template_16_24_32, num_mb);
2273                 test_mb_aead_speed("rfc4106(gcm(aes))", DECRYPT, sec, NULL,
2274                                    0, 16, 16, aead_speed_template_20, num_mb);
2275                 test_mb_aead_speed("gcm(aes)", DECRYPT, sec, NULL, 0, 16, 8,
2276                                    speed_template_16_24_32, num_mb);
2277                 break;
2278
2279         case 216:
2280                 test_mb_aead_speed("rfc4309(ccm(aes))", ENCRYPT, sec, NULL, 0,
2281                                    16, 16, aead_speed_template_19, num_mb);
2282                 test_mb_aead_speed("rfc4309(ccm(aes))", DECRYPT, sec, NULL, 0,
2283                                    16, 16, aead_speed_template_19, num_mb);
2284                 break;
2285
2286         case 217:
2287                 test_mb_aead_speed("rfc7539esp(chacha20,poly1305)", ENCRYPT,
2288                                    sec, NULL, 0, 16, 8, aead_speed_template_36,
2289                                    num_mb);
2290                 test_mb_aead_speed("rfc7539esp(chacha20,poly1305)", DECRYPT,
2291                                    sec, NULL, 0, 16, 8, aead_speed_template_36,
2292                                    num_mb);
2293                 break;
2294
2295         case 218:
2296                 test_cipher_speed("ecb(sm4)", ENCRYPT, sec, NULL, 0,
2297                                 speed_template_16);
2298                 test_cipher_speed("ecb(sm4)", DECRYPT, sec, NULL, 0,
2299                                 speed_template_16);
2300                 test_cipher_speed("cbc(sm4)", ENCRYPT, sec, NULL, 0,
2301                                 speed_template_16);
2302                 test_cipher_speed("cbc(sm4)", DECRYPT, sec, NULL, 0,
2303                                 speed_template_16);
2304                 test_cipher_speed("ctr(sm4)", ENCRYPT, sec, NULL, 0,
2305                                 speed_template_16);
2306                 test_cipher_speed("ctr(sm4)", DECRYPT, sec, NULL, 0,
2307                                 speed_template_16);
2308                 break;
2309
2310         case 219:
2311                 test_cipher_speed("adiantum(xchacha12,aes)", ENCRYPT, sec, NULL,
2312                                   0, speed_template_32);
2313                 test_cipher_speed("adiantum(xchacha12,aes)", DECRYPT, sec, NULL,
2314                                   0, speed_template_32);
2315                 test_cipher_speed("adiantum(xchacha20,aes)", ENCRYPT, sec, NULL,
2316                                   0, speed_template_32);
2317                 test_cipher_speed("adiantum(xchacha20,aes)", DECRYPT, sec, NULL,
2318                                   0, speed_template_32);
2319                 break;
2320
2321         case 220:
2322                 test_acipher_speed("essiv(cbc(aes),sha256)",
2323                                   ENCRYPT, sec, NULL, 0,
2324                                   speed_template_16_24_32);
2325                 test_acipher_speed("essiv(cbc(aes),sha256)",
2326                                   DECRYPT, sec, NULL, 0,
2327                                   speed_template_16_24_32);
2328                 break;
2329
2330         case 221:
2331                 test_aead_speed("aegis128", ENCRYPT, sec,
2332                                 NULL, 0, 16, 8, speed_template_16);
2333                 test_aead_speed("aegis128", DECRYPT, sec,
2334                                 NULL, 0, 16, 8, speed_template_16);
2335                 break;
2336
2337         case 300:
2338                 if (alg) {
2339                         test_hash_speed(alg, sec, generic_hash_speed_template);
2340                         break;
2341                 }
2342                 /* fall through */
2343         case 301:
2344                 test_hash_speed("md4", sec, generic_hash_speed_template);
2345                 if (mode > 300 && mode < 400) break;
2346                 /* fall through */
2347         case 302:
2348                 test_hash_speed("md5", sec, generic_hash_speed_template);
2349                 if (mode > 300 && mode < 400) break;
2350                 /* fall through */
2351         case 303:
2352                 test_hash_speed("sha1", sec, generic_hash_speed_template);
2353                 if (mode > 300 && mode < 400) break;
2354                 /* fall through */
2355         case 304:
2356                 test_hash_speed("sha256", sec, generic_hash_speed_template);
2357                 if (mode > 300 && mode < 400) break;
2358                 /* fall through */
2359         case 305:
2360                 test_hash_speed("sha384", sec, generic_hash_speed_template);
2361                 if (mode > 300 && mode < 400) break;
2362                 /* fall through */
2363         case 306:
2364                 test_hash_speed("sha512", sec, generic_hash_speed_template);
2365                 if (mode > 300 && mode < 400) break;
2366                 /* fall through */
2367         case 307:
2368                 test_hash_speed("wp256", sec, generic_hash_speed_template);
2369                 if (mode > 300 && mode < 400) break;
2370                 /* fall through */
2371         case 308:
2372                 test_hash_speed("wp384", sec, generic_hash_speed_template);
2373                 if (mode > 300 && mode < 400) break;
2374                 /* fall through */
2375         case 309:
2376                 test_hash_speed("wp512", sec, generic_hash_speed_template);
2377                 if (mode > 300 && mode < 400) break;
2378                 /* fall through */
2379         case 310:
2380                 test_hash_speed("tgr128", sec, generic_hash_speed_template);
2381                 if (mode > 300 && mode < 400) break;
2382                 /* fall through */
2383         case 311:
2384                 test_hash_speed("tgr160", sec, generic_hash_speed_template);
2385                 if (mode > 300 && mode < 400) break;
2386                 /* fall through */
2387         case 312:
2388                 test_hash_speed("tgr192", sec, generic_hash_speed_template);
2389                 if (mode > 300 && mode < 400) break;
2390                 /* fall through */
2391         case 313:
2392                 test_hash_speed("sha224", sec, generic_hash_speed_template);
2393                 if (mode > 300 && mode < 400) break;
2394                 /* fall through */
2395         case 314:
2396                 test_hash_speed("rmd128", sec, generic_hash_speed_template);
2397                 if (mode > 300 && mode < 400) break;
2398                 /* fall through */
2399         case 315:
2400                 test_hash_speed("rmd160", sec, generic_hash_speed_template);
2401                 if (mode > 300 && mode < 400) break;
2402                 /* fall through */
2403         case 316:
2404                 test_hash_speed("rmd256", sec, generic_hash_speed_template);
2405                 if (mode > 300 && mode < 400) break;
2406                 /* fall through */
2407         case 317:
2408                 test_hash_speed("rmd320", sec, generic_hash_speed_template);
2409                 if (mode > 300 && mode < 400) break;
2410                 /* fall through */
2411         case 318:
2412                 test_hash_speed("ghash-generic", sec, hash_speed_template_16);
2413                 if (mode > 300 && mode < 400) break;
2414                 /* fall through */
2415         case 319:
2416                 test_hash_speed("crc32c", sec, generic_hash_speed_template);
2417                 if (mode > 300 && mode < 400) break;
2418                 /* fall through */
2419         case 320:
2420                 test_hash_speed("crct10dif", sec, generic_hash_speed_template);
2421                 if (mode > 300 && mode < 400) break;
2422                 /* fall through */
2423         case 321:
2424                 test_hash_speed("poly1305", sec, poly1305_speed_template);
2425                 if (mode > 300 && mode < 400) break;
2426                 /* fall through */
2427         case 322:
2428                 test_hash_speed("sha3-224", sec, generic_hash_speed_template);
2429                 if (mode > 300 && mode < 400) break;
2430                 /* fall through */
2431         case 323:
2432                 test_hash_speed("sha3-256", sec, generic_hash_speed_template);
2433                 if (mode > 300 && mode < 400) break;
2434                 /* fall through */
2435         case 324:
2436                 test_hash_speed("sha3-384", sec, generic_hash_speed_template);
2437                 if (mode > 300 && mode < 400) break;
2438                 /* fall through */
2439         case 325:
2440                 test_hash_speed("sha3-512", sec, generic_hash_speed_template);
2441                 if (mode > 300 && mode < 400) break;
2442                 /* fall through */
2443         case 326:
2444                 test_hash_speed("sm3", sec, generic_hash_speed_template);
2445                 if (mode > 300 && mode < 400) break;
2446                 /* fall through */
2447         case 327:
2448                 test_hash_speed("streebog256", sec,
2449                                 generic_hash_speed_template);
2450                 if (mode > 300 && mode < 400) break;
2451                 /* fall through */
2452         case 328:
2453                 test_hash_speed("streebog512", sec,
2454                                 generic_hash_speed_template);
2455                 if (mode > 300 && mode < 400) break;
2456                 /* fall through */
2457         case 399:
2458                 break;
2459
2460         case 400:
2461                 if (alg) {
2462                         test_ahash_speed(alg, sec, generic_hash_speed_template);
2463                         break;
2464                 }
2465                 /* fall through */
2466         case 401:
2467                 test_ahash_speed("md4", sec, generic_hash_speed_template);
2468                 if (mode > 400 && mode < 500) break;
2469                 /* fall through */
2470         case 402:
2471                 test_ahash_speed("md5", sec, generic_hash_speed_template);
2472                 if (mode > 400 && mode < 500) break;
2473                 /* fall through */
2474         case 403:
2475                 test_ahash_speed("sha1", sec, generic_hash_speed_template);
2476                 if (mode > 400 && mode < 500) break;
2477                 /* fall through */
2478         case 404:
2479                 test_ahash_speed("sha256", sec, generic_hash_speed_template);
2480                 if (mode > 400 && mode < 500) break;
2481                 /* fall through */
2482         case 405:
2483                 test_ahash_speed("sha384", sec, generic_hash_speed_template);
2484                 if (mode > 400 && mode < 500) break;
2485                 /* fall through */
2486         case 406:
2487                 test_ahash_speed("sha512", sec, generic_hash_speed_template);
2488                 if (mode > 400 && mode < 500) break;
2489                 /* fall through */
2490         case 407:
2491                 test_ahash_speed("wp256", sec, generic_hash_speed_template);
2492                 if (mode > 400 && mode < 500) break;
2493                 /* fall through */
2494         case 408:
2495                 test_ahash_speed("wp384", sec, generic_hash_speed_template);
2496                 if (mode > 400 && mode < 500) break;
2497                 /* fall through */
2498         case 409:
2499                 test_ahash_speed("wp512", sec, generic_hash_speed_template);
2500                 if (mode > 400 && mode < 500) break;
2501                 /* fall through */
2502         case 410:
2503                 test_ahash_speed("tgr128", sec, generic_hash_speed_template);
2504                 if (mode > 400 && mode < 500) break;
2505                 /* fall through */
2506         case 411:
2507                 test_ahash_speed("tgr160", sec, generic_hash_speed_template);
2508                 if (mode > 400 && mode < 500) break;
2509                 /* fall through */
2510         case 412:
2511                 test_ahash_speed("tgr192", sec, generic_hash_speed_template);
2512                 if (mode > 400 && mode < 500) break;
2513                 /* fall through */
2514         case 413:
2515                 test_ahash_speed("sha224", sec, generic_hash_speed_template);
2516                 if (mode > 400 && mode < 500) break;
2517                 /* fall through */
2518         case 414:
2519                 test_ahash_speed("rmd128", sec, generic_hash_speed_template);
2520                 if (mode > 400 && mode < 500) break;
2521                 /* fall through */
2522         case 415:
2523                 test_ahash_speed("rmd160", sec, generic_hash_speed_template);
2524                 if (mode > 400 && mode < 500) break;
2525                 /* fall through */
2526         case 416:
2527                 test_ahash_speed("rmd256", sec, generic_hash_speed_template);
2528                 if (mode > 400 && mode < 500) break;
2529                 /* fall through */
2530         case 417:
2531                 test_ahash_speed("rmd320", sec, generic_hash_speed_template);
2532                 if (mode > 400 && mode < 500) break;
2533                 /* fall through */
2534         case 418:
2535                 test_ahash_speed("sha3-224", sec, generic_hash_speed_template);
2536                 if (mode > 400 && mode < 500) break;
2537                 /* fall through */
2538         case 419:
2539                 test_ahash_speed("sha3-256", sec, generic_hash_speed_template);
2540                 if (mode > 400 && mode < 500) break;
2541                 /* fall through */
2542         case 420:
2543                 test_ahash_speed("sha3-384", sec, generic_hash_speed_template);
2544                 if (mode > 400 && mode < 500) break;
2545                 /* fall through */
2546         case 421:
2547                 test_ahash_speed("sha3-512", sec, generic_hash_speed_template);
2548                 if (mode > 400 && mode < 500) break;
2549                 /* fall through */
2550         case 422:
2551                 test_mb_ahash_speed("sha1", sec, generic_hash_speed_template,
2552                                     num_mb);
2553                 if (mode > 400 && mode < 500) break;
2554                 /* fall through */
2555         case 423:
2556                 test_mb_ahash_speed("sha256", sec, generic_hash_speed_template,
2557                                     num_mb);
2558                 if (mode > 400 && mode < 500) break;
2559                 /* fall through */
2560         case 424:
2561                 test_mb_ahash_speed("sha512", sec, generic_hash_speed_template,
2562                                     num_mb);
2563                 if (mode > 400 && mode < 500) break;
2564                 /* fall through */
2565         case 425:
2566                 test_mb_ahash_speed("sm3", sec, generic_hash_speed_template,
2567                                     num_mb);
2568                 if (mode > 400 && mode < 500) break;
2569                 /* fall through */
2570         case 426:
2571                 test_mb_ahash_speed("streebog256", sec,
2572                                     generic_hash_speed_template, num_mb);
2573                 if (mode > 400 && mode < 500) break;
2574                 /* fall through */
2575         case 427:
2576                 test_mb_ahash_speed("streebog512", sec,
2577                                     generic_hash_speed_template, num_mb);
2578                 if (mode > 400 && mode < 500) break;
2579                 /* fall through */
2580         case 499:
2581                 break;
2582
2583         case 500:
2584                 test_acipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
2585                                    speed_template_16_24_32);
2586                 test_acipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
2587                                    speed_template_16_24_32);
2588                 test_acipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
2589                                    speed_template_16_24_32);
2590                 test_acipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
2591                                    speed_template_16_24_32);
2592                 test_acipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
2593                                    speed_template_32_40_48);
2594                 test_acipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
2595                                    speed_template_32_40_48);
2596                 test_acipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
2597                                    speed_template_32_64);
2598                 test_acipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
2599                                    speed_template_32_64);
2600                 test_acipher_speed("cts(cbc(aes))", ENCRYPT, sec, NULL, 0,
2601                                    speed_template_16_24_32);
2602                 test_acipher_speed("cts(cbc(aes))", DECRYPT, sec, NULL, 0,
2603                                    speed_template_16_24_32);
2604                 test_acipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
2605                                    speed_template_16_24_32);
2606                 test_acipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
2607                                    speed_template_16_24_32);
2608                 test_acipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
2609                                    speed_template_16_24_32);
2610                 test_acipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
2611                                    speed_template_16_24_32);
2612                 test_acipher_speed("ofb(aes)", ENCRYPT, sec, NULL, 0,
2613                                    speed_template_16_24_32);
2614                 test_acipher_speed("ofb(aes)", DECRYPT, sec, NULL, 0,
2615                                    speed_template_16_24_32);
2616                 test_acipher_speed("rfc3686(ctr(aes))", ENCRYPT, sec, NULL, 0,
2617                                    speed_template_20_28_36);
2618                 test_acipher_speed("rfc3686(ctr(aes))", DECRYPT, sec, NULL, 0,
2619                                    speed_template_20_28_36);
2620                 break;
2621
2622         case 501:
2623                 test_acipher_speed("ecb(des3_ede)", ENCRYPT, sec,
2624                                    des3_speed_template, DES3_SPEED_VECTORS,
2625                                    speed_template_24);
2626                 test_acipher_speed("ecb(des3_ede)", DECRYPT, sec,
2627                                    des3_speed_template, DES3_SPEED_VECTORS,
2628                                    speed_template_24);
2629                 test_acipher_speed("cbc(des3_ede)", ENCRYPT, sec,
2630                                    des3_speed_template, DES3_SPEED_VECTORS,
2631                                    speed_template_24);
2632                 test_acipher_speed("cbc(des3_ede)", DECRYPT, sec,
2633                                    des3_speed_template, DES3_SPEED_VECTORS,
2634                                    speed_template_24);
2635                 test_acipher_speed("cfb(des3_ede)", ENCRYPT, sec,
2636                                    des3_speed_template, DES3_SPEED_VECTORS,
2637                                    speed_template_24);
2638                 test_acipher_speed("cfb(des3_ede)", DECRYPT, sec,
2639                                    des3_speed_template, DES3_SPEED_VECTORS,
2640                                    speed_template_24);
2641                 test_acipher_speed("ofb(des3_ede)", ENCRYPT, sec,
2642                                    des3_speed_template, DES3_SPEED_VECTORS,
2643                                    speed_template_24);
2644                 test_acipher_speed("ofb(des3_ede)", DECRYPT, sec,
2645                                    des3_speed_template, DES3_SPEED_VECTORS,
2646                                    speed_template_24);
2647                 break;
2648
2649         case 502:
2650                 test_acipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
2651                                    speed_template_8);
2652                 test_acipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
2653                                    speed_template_8);
2654                 test_acipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
2655                                    speed_template_8);
2656                 test_acipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
2657                                    speed_template_8);
2658                 test_acipher_speed("cfb(des)", ENCRYPT, sec, NULL, 0,
2659                                    speed_template_8);
2660                 test_acipher_speed("cfb(des)", DECRYPT, sec, NULL, 0,
2661                                    speed_template_8);
2662                 test_acipher_speed("ofb(des)", ENCRYPT, sec, NULL, 0,
2663                                    speed_template_8);
2664                 test_acipher_speed("ofb(des)", DECRYPT, sec, NULL, 0,
2665                                    speed_template_8);
2666                 break;
2667
2668         case 503:
2669                 test_acipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
2670                                    speed_template_16_32);
2671                 test_acipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
2672                                    speed_template_16_32);
2673                 test_acipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
2674                                    speed_template_16_32);
2675                 test_acipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
2676                                    speed_template_16_32);
2677                 test_acipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
2678                                    speed_template_16_32);
2679                 test_acipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
2680                                    speed_template_16_32);
2681                 test_acipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
2682                                    speed_template_32_48);
2683                 test_acipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
2684                                    speed_template_32_48);
2685                 test_acipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
2686                                    speed_template_32_64);
2687                 test_acipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
2688                                    speed_template_32_64);
2689                 break;
2690
2691         case 504:
2692                 test_acipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
2693                                    speed_template_16_24_32);
2694                 test_acipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
2695                                    speed_template_16_24_32);
2696                 test_acipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
2697                                    speed_template_16_24_32);
2698                 test_acipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
2699                                    speed_template_16_24_32);
2700                 test_acipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
2701                                    speed_template_16_24_32);
2702                 test_acipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
2703                                    speed_template_16_24_32);
2704                 test_acipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
2705                                    speed_template_32_40_48);
2706                 test_acipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
2707                                    speed_template_32_40_48);
2708                 test_acipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
2709                                    speed_template_32_48_64);
2710                 test_acipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
2711                                    speed_template_32_48_64);
2712                 break;
2713
2714         case 505:
2715                 test_acipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
2716                                    speed_template_8);
2717                 break;
2718
2719         case 506:
2720                 test_acipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
2721                                    speed_template_8_16);
2722                 test_acipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
2723                                    speed_template_8_16);
2724                 test_acipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
2725                                    speed_template_8_16);
2726                 test_acipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
2727                                    speed_template_8_16);
2728                 test_acipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
2729                                    speed_template_8_16);
2730                 test_acipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
2731                                    speed_template_8_16);
2732                 break;
2733
2734         case 507:
2735                 test_acipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
2736                                    speed_template_16_32);
2737                 test_acipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
2738                                    speed_template_16_32);
2739                 test_acipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
2740                                    speed_template_16_32);
2741                 test_acipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
2742                                    speed_template_16_32);
2743                 test_acipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
2744                                    speed_template_16_32);
2745                 test_acipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
2746                                    speed_template_16_32);
2747                 test_acipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
2748                                    speed_template_32_48);
2749                 test_acipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
2750                                    speed_template_32_48);
2751                 test_acipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
2752                                    speed_template_32_64);
2753                 test_acipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
2754                                    speed_template_32_64);
2755                 break;
2756
2757         case 508:
2758                 test_acipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
2759                                    speed_template_16_32);
2760                 test_acipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
2761                                    speed_template_16_32);
2762                 test_acipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
2763                                    speed_template_16_32);
2764                 test_acipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
2765                                    speed_template_16_32);
2766                 test_acipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
2767                                    speed_template_16_32);
2768                 test_acipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
2769                                    speed_template_16_32);
2770                 test_acipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
2771                                    speed_template_32_48);
2772                 test_acipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
2773                                    speed_template_32_48);
2774                 test_acipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
2775                                    speed_template_32_64);
2776                 test_acipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
2777                                    speed_template_32_64);
2778                 break;
2779
2780         case 509:
2781                 test_acipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
2782                                    speed_template_8_32);
2783                 test_acipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
2784                                    speed_template_8_32);
2785                 test_acipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
2786                                    speed_template_8_32);
2787                 test_acipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
2788                                    speed_template_8_32);
2789                 test_acipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
2790                                    speed_template_8_32);
2791                 test_acipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
2792                                    speed_template_8_32);
2793                 break;
2794
2795         case 600:
2796                 test_mb_skcipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
2797                                        speed_template_16_24_32, num_mb);
2798                 test_mb_skcipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
2799                                        speed_template_16_24_32, num_mb);
2800                 test_mb_skcipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
2801                                        speed_template_16_24_32, num_mb);
2802                 test_mb_skcipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
2803                                        speed_template_16_24_32, num_mb);
2804                 test_mb_skcipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
2805                                        speed_template_32_40_48, num_mb);
2806                 test_mb_skcipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
2807                                        speed_template_32_40_48, num_mb);
2808                 test_mb_skcipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
2809                                        speed_template_32_64, num_mb);
2810                 test_mb_skcipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
2811                                        speed_template_32_64, num_mb);
2812                 test_mb_skcipher_speed("cts(cbc(aes))", ENCRYPT, sec, NULL, 0,
2813                                        speed_template_16_24_32, num_mb);
2814                 test_mb_skcipher_speed("cts(cbc(aes))", DECRYPT, sec, NULL, 0,
2815                                        speed_template_16_24_32, num_mb);
2816                 test_mb_skcipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
2817                                        speed_template_16_24_32, num_mb);
2818                 test_mb_skcipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
2819                                        speed_template_16_24_32, num_mb);
2820                 test_mb_skcipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
2821                                        speed_template_16_24_32, num_mb);
2822                 test_mb_skcipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
2823                                        speed_template_16_24_32, num_mb);
2824                 test_mb_skcipher_speed("ofb(aes)", ENCRYPT, sec, NULL, 0,
2825                                        speed_template_16_24_32, num_mb);
2826                 test_mb_skcipher_speed("ofb(aes)", DECRYPT, sec, NULL, 0,
2827                                        speed_template_16_24_32, num_mb);
2828                 test_mb_skcipher_speed("rfc3686(ctr(aes))", ENCRYPT, sec, NULL,
2829                                        0, speed_template_20_28_36, num_mb);
2830                 test_mb_skcipher_speed("rfc3686(ctr(aes))", DECRYPT, sec, NULL,
2831                                        0, speed_template_20_28_36, num_mb);
2832                 break;
2833
2834         case 601:
2835                 test_mb_skcipher_speed("ecb(des3_ede)", ENCRYPT, sec,
2836                                        des3_speed_template, DES3_SPEED_VECTORS,
2837                                        speed_template_24, num_mb);
2838                 test_mb_skcipher_speed("ecb(des3_ede)", DECRYPT, sec,
2839                                        des3_speed_template, DES3_SPEED_VECTORS,
2840                                        speed_template_24, num_mb);
2841                 test_mb_skcipher_speed("cbc(des3_ede)", ENCRYPT, sec,
2842                                        des3_speed_template, DES3_SPEED_VECTORS,
2843                                        speed_template_24, num_mb);
2844                 test_mb_skcipher_speed("cbc(des3_ede)", DECRYPT, sec,
2845                                        des3_speed_template, DES3_SPEED_VECTORS,
2846                                        speed_template_24, num_mb);
2847                 test_mb_skcipher_speed("cfb(des3_ede)", ENCRYPT, sec,
2848                                        des3_speed_template, DES3_SPEED_VECTORS,
2849                                        speed_template_24, num_mb);
2850                 test_mb_skcipher_speed("cfb(des3_ede)", DECRYPT, sec,
2851                                        des3_speed_template, DES3_SPEED_VECTORS,
2852                                        speed_template_24, num_mb);
2853                 test_mb_skcipher_speed("ofb(des3_ede)", ENCRYPT, sec,
2854                                        des3_speed_template, DES3_SPEED_VECTORS,
2855                                        speed_template_24, num_mb);
2856                 test_mb_skcipher_speed("ofb(des3_ede)", DECRYPT, sec,
2857                                        des3_speed_template, DES3_SPEED_VECTORS,
2858                                        speed_template_24, num_mb);
2859                 break;
2860
2861         case 602:
2862                 test_mb_skcipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
2863                                        speed_template_8, num_mb);
2864                 test_mb_skcipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
2865                                        speed_template_8, num_mb);
2866                 test_mb_skcipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
2867                                        speed_template_8, num_mb);
2868                 test_mb_skcipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
2869                                        speed_template_8, num_mb);
2870                 test_mb_skcipher_speed("cfb(des)", ENCRYPT, sec, NULL, 0,
2871                                        speed_template_8, num_mb);
2872                 test_mb_skcipher_speed("cfb(des)", DECRYPT, sec, NULL, 0,
2873                                        speed_template_8, num_mb);
2874                 test_mb_skcipher_speed("ofb(des)", ENCRYPT, sec, NULL, 0,
2875                                        speed_template_8, num_mb);
2876                 test_mb_skcipher_speed("ofb(des)", DECRYPT, sec, NULL, 0,
2877                                        speed_template_8, num_mb);
2878                 break;
2879
2880         case 603:
2881                 test_mb_skcipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
2882                                        speed_template_16_32, num_mb);
2883                 test_mb_skcipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
2884                                        speed_template_16_32, num_mb);
2885                 test_mb_skcipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
2886                                        speed_template_16_32, num_mb);
2887                 test_mb_skcipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
2888                                        speed_template_16_32, num_mb);
2889                 test_mb_skcipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
2890                                        speed_template_16_32, num_mb);
2891                 test_mb_skcipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
2892                                        speed_template_16_32, num_mb);
2893                 test_mb_skcipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
2894                                        speed_template_32_48, num_mb);
2895                 test_mb_skcipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
2896                                        speed_template_32_48, num_mb);
2897                 test_mb_skcipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
2898                                        speed_template_32_64, num_mb);
2899                 test_mb_skcipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
2900                                        speed_template_32_64, num_mb);
2901                 break;
2902
2903         case 604:
2904                 test_mb_skcipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
2905                                        speed_template_16_24_32, num_mb);
2906                 test_mb_skcipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
2907                                        speed_template_16_24_32, num_mb);
2908                 test_mb_skcipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
2909                                        speed_template_16_24_32, num_mb);
2910                 test_mb_skcipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
2911                                        speed_template_16_24_32, num_mb);
2912                 test_mb_skcipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
2913                                        speed_template_16_24_32, num_mb);
2914                 test_mb_skcipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
2915                                        speed_template_16_24_32, num_mb);
2916                 test_mb_skcipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
2917                                        speed_template_32_40_48, num_mb);
2918                 test_mb_skcipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
2919                                        speed_template_32_40_48, num_mb);
2920                 test_mb_skcipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
2921                                        speed_template_32_48_64, num_mb);
2922                 test_mb_skcipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
2923                                        speed_template_32_48_64, num_mb);
2924                 break;
2925
2926         case 605:
2927                 test_mb_skcipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
2928                                        speed_template_8, num_mb);
2929                 break;
2930
2931         case 606:
2932                 test_mb_skcipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
2933                                        speed_template_8_16, num_mb);
2934                 test_mb_skcipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
2935                                        speed_template_8_16, num_mb);
2936                 test_mb_skcipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
2937                                        speed_template_8_16, num_mb);
2938                 test_mb_skcipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
2939                                        speed_template_8_16, num_mb);
2940                 test_mb_skcipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
2941                                        speed_template_8_16, num_mb);
2942                 test_mb_skcipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
2943                                        speed_template_8_16, num_mb);
2944                 break;
2945
2946         case 607:
2947                 test_mb_skcipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
2948                                        speed_template_16_32, num_mb);
2949                 test_mb_skcipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
2950                                        speed_template_16_32, num_mb);
2951                 test_mb_skcipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
2952                                        speed_template_16_32, num_mb);
2953                 test_mb_skcipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
2954                                        speed_template_16_32, num_mb);
2955                 test_mb_skcipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
2956                                        speed_template_16_32, num_mb);
2957                 test_mb_skcipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
2958                                        speed_template_16_32, num_mb);
2959                 test_mb_skcipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
2960                                        speed_template_32_48, num_mb);
2961                 test_mb_skcipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
2962                                        speed_template_32_48, num_mb);
2963                 test_mb_skcipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
2964                                        speed_template_32_64, num_mb);
2965                 test_mb_skcipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
2966                                        speed_template_32_64, num_mb);
2967                 break;
2968
2969         case 608:
2970                 test_mb_skcipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
2971                                        speed_template_16_32, num_mb);
2972                 test_mb_skcipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
2973                                        speed_template_16_32, num_mb);
2974                 test_mb_skcipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
2975                                        speed_template_16_32, num_mb);
2976                 test_mb_skcipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
2977                                        speed_template_16_32, num_mb);
2978                 test_mb_skcipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
2979                                        speed_template_16_32, num_mb);
2980                 test_mb_skcipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
2981                                        speed_template_16_32, num_mb);
2982                 test_mb_skcipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
2983                                        speed_template_32_48, num_mb);
2984                 test_mb_skcipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
2985                                        speed_template_32_48, num_mb);
2986                 test_mb_skcipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
2987                                        speed_template_32_64, num_mb);
2988                 test_mb_skcipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
2989                                        speed_template_32_64, num_mb);
2990                 break;
2991
2992         case 609:
2993                 test_mb_skcipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
2994                                        speed_template_8_32, num_mb);
2995                 test_mb_skcipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
2996                                        speed_template_8_32, num_mb);
2997                 test_mb_skcipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
2998                                        speed_template_8_32, num_mb);
2999                 test_mb_skcipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
3000                                        speed_template_8_32, num_mb);
3001                 test_mb_skcipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
3002                                        speed_template_8_32, num_mb);
3003                 test_mb_skcipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
3004                                        speed_template_8_32, num_mb);
3005                 break;
3006
3007         case 1000:
3008                 test_available();
3009                 break;
3010         }
3011
3012         return ret;
3013 }
3014
3015 static int __init tcrypt_mod_init(void)
3016 {
3017         int err = -ENOMEM;
3018         int i;
3019
3020         for (i = 0; i < TVMEMSIZE; i++) {
3021                 tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
3022                 if (!tvmem[i])
3023                         goto err_free_tv;
3024         }
3025
3026         err = do_test(alg, type, mask, mode, num_mb);
3027
3028         if (err) {
3029                 printk(KERN_ERR "tcrypt: one or more tests failed!\n");
3030                 goto err_free_tv;
3031         } else {
3032                 pr_debug("all tests passed\n");
3033         }
3034
3035         /* We intentionaly return -EAGAIN to prevent keeping the module,
3036          * unless we're running in fips mode. It does all its work from
3037          * init() and doesn't offer any runtime functionality, but in
3038          * the fips case, checking for a successful load is helpful.
3039          * => we don't need it in the memory, do we?
3040          *                                        -- mludvig
3041          */
3042         if (!fips_enabled)
3043                 err = -EAGAIN;
3044
3045 err_free_tv:
3046         for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
3047                 free_page((unsigned long)tvmem[i]);
3048
3049         return err;
3050 }
3051
3052 /*
3053  * If an init function is provided, an exit function must also be provided
3054  * to allow module unload.
3055  */
3056 static void __exit tcrypt_mod_fini(void) { }
3057
3058 subsys_initcall(tcrypt_mod_init);
3059 module_exit(tcrypt_mod_fini);
3060
3061 module_param(alg, charp, 0);
3062 module_param(type, uint, 0);
3063 module_param(mask, uint, 0);
3064 module_param(mode, int, 0);
3065 module_param(sec, uint, 0);
3066 MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
3067                       "(defaults to zero which uses CPU cycles instead)");
3068 module_param(num_mb, uint, 0000);
3069 MODULE_PARM_DESC(num_mb, "Number of concurrent requests to be used in mb speed tests (defaults to 8)");
3070
3071 MODULE_LICENSE("GPL");
3072 MODULE_DESCRIPTION("Quick & dirty crypto testing module");
3073 MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");