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