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