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