xref: /openbmc/linux/crypto/testmgr.c (revision eb095593)
1 /*
2  * Algorithm testing framework and tests.
3  *
4  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6  * Copyright (c) 2007 Nokia Siemens Networks
7  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8  *
9  * Updated RFC4106 AES-GCM testing.
10  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
11  *             Adrian Hoban <adrian.hoban@intel.com>
12  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
13  *             Tadeusz Struk (tadeusz.struk@intel.com)
14  *    Copyright (c) 2010, Intel Corporation.
15  *
16  * This program is free software; you can redistribute it and/or modify it
17  * under the terms of the GNU General Public License as published by the Free
18  * Software Foundation; either version 2 of the License, or (at your option)
19  * any later version.
20  *
21  */
22 
23 #include <crypto/aead.h>
24 #include <crypto/hash.h>
25 #include <crypto/skcipher.h>
26 #include <linux/err.h>
27 #include <linux/fips.h>
28 #include <linux/module.h>
29 #include <linux/scatterlist.h>
30 #include <linux/slab.h>
31 #include <linux/string.h>
32 #include <crypto/rng.h>
33 #include <crypto/drbg.h>
34 #include <crypto/akcipher.h>
35 #include <crypto/kpp.h>
36 #include <crypto/acompress.h>
37 
38 #include "internal.h"
39 
40 static bool notests;
41 module_param(notests, bool, 0644);
42 MODULE_PARM_DESC(notests, "disable crypto self-tests");
43 
44 #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
45 
46 /* a perfect nop */
47 int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
48 {
49 	return 0;
50 }
51 
52 #else
53 
54 #include "testmgr.h"
55 
56 /*
57  * Need slab memory for testing (size in number of pages).
58  */
59 #define XBUFSIZE	8
60 
61 /*
62  * Indexes into the xbuf to simulate cross-page access.
63  */
64 #define IDX1		32
65 #define IDX2		32400
66 #define IDX3		1
67 #define IDX4		8193
68 #define IDX5		22222
69 #define IDX6		17101
70 #define IDX7		27333
71 #define IDX8		3000
72 
73 /*
74 * Used by test_cipher()
75 */
76 #define ENCRYPT 1
77 #define DECRYPT 0
78 
79 struct tcrypt_result {
80 	struct completion completion;
81 	int err;
82 };
83 
84 struct aead_test_suite {
85 	struct {
86 		struct aead_testvec *vecs;
87 		unsigned int count;
88 	} enc, dec;
89 };
90 
91 struct cipher_test_suite {
92 	struct {
93 		struct cipher_testvec *vecs;
94 		unsigned int count;
95 	} enc, dec;
96 };
97 
98 struct comp_test_suite {
99 	struct {
100 		struct comp_testvec *vecs;
101 		unsigned int count;
102 	} comp, decomp;
103 };
104 
105 struct hash_test_suite {
106 	struct hash_testvec *vecs;
107 	unsigned int count;
108 };
109 
110 struct cprng_test_suite {
111 	struct cprng_testvec *vecs;
112 	unsigned int count;
113 };
114 
115 struct drbg_test_suite {
116 	struct drbg_testvec *vecs;
117 	unsigned int count;
118 };
119 
120 struct akcipher_test_suite {
121 	struct akcipher_testvec *vecs;
122 	unsigned int count;
123 };
124 
125 struct kpp_test_suite {
126 	struct kpp_testvec *vecs;
127 	unsigned int count;
128 };
129 
130 struct alg_test_desc {
131 	const char *alg;
132 	int (*test)(const struct alg_test_desc *desc, const char *driver,
133 		    u32 type, u32 mask);
134 	int fips_allowed;	/* set if alg is allowed in fips mode */
135 
136 	union {
137 		struct aead_test_suite aead;
138 		struct cipher_test_suite cipher;
139 		struct comp_test_suite comp;
140 		struct hash_test_suite hash;
141 		struct cprng_test_suite cprng;
142 		struct drbg_test_suite drbg;
143 		struct akcipher_test_suite akcipher;
144 		struct kpp_test_suite kpp;
145 	} suite;
146 };
147 
148 static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
149 
150 static void hexdump(unsigned char *buf, unsigned int len)
151 {
152 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
153 			16, 1,
154 			buf, len, false);
155 }
156 
157 static void tcrypt_complete(struct crypto_async_request *req, int err)
158 {
159 	struct tcrypt_result *res = req->data;
160 
161 	if (err == -EINPROGRESS)
162 		return;
163 
164 	res->err = err;
165 	complete(&res->completion);
166 }
167 
168 static int testmgr_alloc_buf(char *buf[XBUFSIZE])
169 {
170 	int i;
171 
172 	for (i = 0; i < XBUFSIZE; i++) {
173 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
174 		if (!buf[i])
175 			goto err_free_buf;
176 	}
177 
178 	return 0;
179 
180 err_free_buf:
181 	while (i-- > 0)
182 		free_page((unsigned long)buf[i]);
183 
184 	return -ENOMEM;
185 }
186 
187 static void testmgr_free_buf(char *buf[XBUFSIZE])
188 {
189 	int i;
190 
191 	for (i = 0; i < XBUFSIZE; i++)
192 		free_page((unsigned long)buf[i]);
193 }
194 
195 static int wait_async_op(struct tcrypt_result *tr, int ret)
196 {
197 	if (ret == -EINPROGRESS || ret == -EBUSY) {
198 		wait_for_completion(&tr->completion);
199 		reinit_completion(&tr->completion);
200 		ret = tr->err;
201 	}
202 	return ret;
203 }
204 
205 static int ahash_partial_update(struct ahash_request **preq,
206 	struct crypto_ahash *tfm, struct hash_testvec *template,
207 	void *hash_buff, int k, int temp, struct scatterlist *sg,
208 	const char *algo, char *result, struct tcrypt_result *tresult)
209 {
210 	char *state;
211 	struct ahash_request *req;
212 	int statesize, ret = -EINVAL;
213 	const char guard[] = { 0x00, 0xba, 0xad, 0x00 };
214 
215 	req = *preq;
216 	statesize = crypto_ahash_statesize(
217 			crypto_ahash_reqtfm(req));
218 	state = kmalloc(statesize + sizeof(guard), GFP_KERNEL);
219 	if (!state) {
220 		pr_err("alt: hash: Failed to alloc state for %s\n", algo);
221 		goto out_nostate;
222 	}
223 	memcpy(state + statesize, guard, sizeof(guard));
224 	ret = crypto_ahash_export(req, state);
225 	WARN_ON(memcmp(state + statesize, guard, sizeof(guard)));
226 	if (ret) {
227 		pr_err("alt: hash: Failed to export() for %s\n", algo);
228 		goto out;
229 	}
230 	ahash_request_free(req);
231 	req = ahash_request_alloc(tfm, GFP_KERNEL);
232 	if (!req) {
233 		pr_err("alg: hash: Failed to alloc request for %s\n", algo);
234 		goto out_noreq;
235 	}
236 	ahash_request_set_callback(req,
237 		CRYPTO_TFM_REQ_MAY_BACKLOG,
238 		tcrypt_complete, tresult);
239 
240 	memcpy(hash_buff, template->plaintext + temp,
241 		template->tap[k]);
242 	sg_init_one(&sg[0], hash_buff, template->tap[k]);
243 	ahash_request_set_crypt(req, sg, result, template->tap[k]);
244 	ret = crypto_ahash_import(req, state);
245 	if (ret) {
246 		pr_err("alg: hash: Failed to import() for %s\n", algo);
247 		goto out;
248 	}
249 	ret = wait_async_op(tresult, crypto_ahash_update(req));
250 	if (ret)
251 		goto out;
252 	*preq = req;
253 	ret = 0;
254 	goto out_noreq;
255 out:
256 	ahash_request_free(req);
257 out_noreq:
258 	kfree(state);
259 out_nostate:
260 	return ret;
261 }
262 
263 static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
264 		       unsigned int tcount, bool use_digest,
265 		       const int align_offset)
266 {
267 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
268 	unsigned int i, j, k, temp;
269 	struct scatterlist sg[8];
270 	char *result;
271 	char *key;
272 	struct ahash_request *req;
273 	struct tcrypt_result tresult;
274 	void *hash_buff;
275 	char *xbuf[XBUFSIZE];
276 	int ret = -ENOMEM;
277 
278 	result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
279 	if (!result)
280 		return ret;
281 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
282 	if (!key)
283 		goto out_nobuf;
284 	if (testmgr_alloc_buf(xbuf))
285 		goto out_nobuf;
286 
287 	init_completion(&tresult.completion);
288 
289 	req = ahash_request_alloc(tfm, GFP_KERNEL);
290 	if (!req) {
291 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
292 		       "%s\n", algo);
293 		goto out_noreq;
294 	}
295 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
296 				   tcrypt_complete, &tresult);
297 
298 	j = 0;
299 	for (i = 0; i < tcount; i++) {
300 		if (template[i].np)
301 			continue;
302 
303 		ret = -EINVAL;
304 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
305 			goto out;
306 
307 		j++;
308 		memset(result, 0, MAX_DIGEST_SIZE);
309 
310 		hash_buff = xbuf[0];
311 		hash_buff += align_offset;
312 
313 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
314 		sg_init_one(&sg[0], hash_buff, template[i].psize);
315 
316 		if (template[i].ksize) {
317 			crypto_ahash_clear_flags(tfm, ~0);
318 			if (template[i].ksize > MAX_KEYLEN) {
319 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
320 				       j, algo, template[i].ksize, MAX_KEYLEN);
321 				ret = -EINVAL;
322 				goto out;
323 			}
324 			memcpy(key, template[i].key, template[i].ksize);
325 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
326 			if (ret) {
327 				printk(KERN_ERR "alg: hash: setkey failed on "
328 				       "test %d for %s: ret=%d\n", j, algo,
329 				       -ret);
330 				goto out;
331 			}
332 		}
333 
334 		ahash_request_set_crypt(req, sg, result, template[i].psize);
335 		if (use_digest) {
336 			ret = wait_async_op(&tresult, crypto_ahash_digest(req));
337 			if (ret) {
338 				pr_err("alg: hash: digest failed on test %d "
339 				       "for %s: ret=%d\n", j, algo, -ret);
340 				goto out;
341 			}
342 		} else {
343 			ret = wait_async_op(&tresult, crypto_ahash_init(req));
344 			if (ret) {
345 				pr_err("alt: hash: init failed on test %d "
346 				       "for %s: ret=%d\n", j, algo, -ret);
347 				goto out;
348 			}
349 			ret = wait_async_op(&tresult, crypto_ahash_update(req));
350 			if (ret) {
351 				pr_err("alt: hash: update failed on test %d "
352 				       "for %s: ret=%d\n", j, algo, -ret);
353 				goto out;
354 			}
355 			ret = wait_async_op(&tresult, crypto_ahash_final(req));
356 			if (ret) {
357 				pr_err("alt: hash: final failed on test %d "
358 				       "for %s: ret=%d\n", j, algo, -ret);
359 				goto out;
360 			}
361 		}
362 
363 		if (memcmp(result, template[i].digest,
364 			   crypto_ahash_digestsize(tfm))) {
365 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
366 			       j, algo);
367 			hexdump(result, crypto_ahash_digestsize(tfm));
368 			ret = -EINVAL;
369 			goto out;
370 		}
371 	}
372 
373 	j = 0;
374 	for (i = 0; i < tcount; i++) {
375 		/* alignment tests are only done with continuous buffers */
376 		if (align_offset != 0)
377 			break;
378 
379 		if (!template[i].np)
380 			continue;
381 
382 		j++;
383 		memset(result, 0, MAX_DIGEST_SIZE);
384 
385 		temp = 0;
386 		sg_init_table(sg, template[i].np);
387 		ret = -EINVAL;
388 		for (k = 0; k < template[i].np; k++) {
389 			if (WARN_ON(offset_in_page(IDX[k]) +
390 				    template[i].tap[k] > PAGE_SIZE))
391 				goto out;
392 			sg_set_buf(&sg[k],
393 				   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
394 					  offset_in_page(IDX[k]),
395 					  template[i].plaintext + temp,
396 					  template[i].tap[k]),
397 				   template[i].tap[k]);
398 			temp += template[i].tap[k];
399 		}
400 
401 		if (template[i].ksize) {
402 			if (template[i].ksize > MAX_KEYLEN) {
403 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
404 				       j, algo, template[i].ksize, MAX_KEYLEN);
405 				ret = -EINVAL;
406 				goto out;
407 			}
408 			crypto_ahash_clear_flags(tfm, ~0);
409 			memcpy(key, template[i].key, template[i].ksize);
410 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
411 
412 			if (ret) {
413 				printk(KERN_ERR "alg: hash: setkey "
414 				       "failed on chunking test %d "
415 				       "for %s: ret=%d\n", j, algo, -ret);
416 				goto out;
417 			}
418 		}
419 
420 		ahash_request_set_crypt(req, sg, result, template[i].psize);
421 		ret = crypto_ahash_digest(req);
422 		switch (ret) {
423 		case 0:
424 			break;
425 		case -EINPROGRESS:
426 		case -EBUSY:
427 			wait_for_completion(&tresult.completion);
428 			reinit_completion(&tresult.completion);
429 			ret = tresult.err;
430 			if (!ret)
431 				break;
432 			/* fall through */
433 		default:
434 			printk(KERN_ERR "alg: hash: digest failed "
435 			       "on chunking test %d for %s: "
436 			       "ret=%d\n", j, algo, -ret);
437 			goto out;
438 		}
439 
440 		if (memcmp(result, template[i].digest,
441 			   crypto_ahash_digestsize(tfm))) {
442 			printk(KERN_ERR "alg: hash: Chunking test %d "
443 			       "failed for %s\n", j, algo);
444 			hexdump(result, crypto_ahash_digestsize(tfm));
445 			ret = -EINVAL;
446 			goto out;
447 		}
448 	}
449 
450 	/* partial update exercise */
451 	j = 0;
452 	for (i = 0; i < tcount; i++) {
453 		/* alignment tests are only done with continuous buffers */
454 		if (align_offset != 0)
455 			break;
456 
457 		if (template[i].np < 2)
458 			continue;
459 
460 		j++;
461 		memset(result, 0, MAX_DIGEST_SIZE);
462 
463 		ret = -EINVAL;
464 		hash_buff = xbuf[0];
465 		memcpy(hash_buff, template[i].plaintext,
466 			template[i].tap[0]);
467 		sg_init_one(&sg[0], hash_buff, template[i].tap[0]);
468 
469 		if (template[i].ksize) {
470 			crypto_ahash_clear_flags(tfm, ~0);
471 			if (template[i].ksize > MAX_KEYLEN) {
472 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
473 					j, algo, template[i].ksize, MAX_KEYLEN);
474 				ret = -EINVAL;
475 				goto out;
476 			}
477 			memcpy(key, template[i].key, template[i].ksize);
478 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
479 			if (ret) {
480 				pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n",
481 					j, algo, -ret);
482 				goto out;
483 			}
484 		}
485 
486 		ahash_request_set_crypt(req, sg, result, template[i].tap[0]);
487 		ret = wait_async_op(&tresult, crypto_ahash_init(req));
488 		if (ret) {
489 			pr_err("alt: hash: init failed on test %d for %s: ret=%d\n",
490 				j, algo, -ret);
491 			goto out;
492 		}
493 		ret = wait_async_op(&tresult, crypto_ahash_update(req));
494 		if (ret) {
495 			pr_err("alt: hash: update failed on test %d for %s: ret=%d\n",
496 				j, algo, -ret);
497 			goto out;
498 		}
499 
500 		temp = template[i].tap[0];
501 		for (k = 1; k < template[i].np; k++) {
502 			ret = ahash_partial_update(&req, tfm, &template[i],
503 				hash_buff, k, temp, &sg[0], algo, result,
504 				&tresult);
505 			if (ret) {
506 				pr_err("hash: partial update failed on test %d for %s: ret=%d\n",
507 					j, algo, -ret);
508 				goto out_noreq;
509 			}
510 			temp += template[i].tap[k];
511 		}
512 		ret = wait_async_op(&tresult, crypto_ahash_final(req));
513 		if (ret) {
514 			pr_err("alt: hash: final failed on test %d for %s: ret=%d\n",
515 				j, algo, -ret);
516 			goto out;
517 		}
518 		if (memcmp(result, template[i].digest,
519 			   crypto_ahash_digestsize(tfm))) {
520 			pr_err("alg: hash: Partial Test %d failed for %s\n",
521 			       j, algo);
522 			hexdump(result, crypto_ahash_digestsize(tfm));
523 			ret = -EINVAL;
524 			goto out;
525 		}
526 	}
527 
528 	ret = 0;
529 
530 out:
531 	ahash_request_free(req);
532 out_noreq:
533 	testmgr_free_buf(xbuf);
534 out_nobuf:
535 	kfree(key);
536 	kfree(result);
537 	return ret;
538 }
539 
540 static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
541 		     unsigned int tcount, bool use_digest)
542 {
543 	unsigned int alignmask;
544 	int ret;
545 
546 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
547 	if (ret)
548 		return ret;
549 
550 	/* test unaligned buffers, check with one byte offset */
551 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
552 	if (ret)
553 		return ret;
554 
555 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
556 	if (alignmask) {
557 		/* Check if alignment mask for tfm is correctly set. */
558 		ret = __test_hash(tfm, template, tcount, use_digest,
559 				  alignmask + 1);
560 		if (ret)
561 			return ret;
562 	}
563 
564 	return 0;
565 }
566 
567 static int __test_aead(struct crypto_aead *tfm, int enc,
568 		       struct aead_testvec *template, unsigned int tcount,
569 		       const bool diff_dst, const int align_offset)
570 {
571 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
572 	unsigned int i, j, k, n, temp;
573 	int ret = -ENOMEM;
574 	char *q;
575 	char *key;
576 	struct aead_request *req;
577 	struct scatterlist *sg;
578 	struct scatterlist *sgout;
579 	const char *e, *d;
580 	struct tcrypt_result result;
581 	unsigned int authsize, iv_len;
582 	void *input;
583 	void *output;
584 	void *assoc;
585 	char *iv;
586 	char *xbuf[XBUFSIZE];
587 	char *xoutbuf[XBUFSIZE];
588 	char *axbuf[XBUFSIZE];
589 
590 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
591 	if (!iv)
592 		return ret;
593 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
594 	if (!key)
595 		goto out_noxbuf;
596 	if (testmgr_alloc_buf(xbuf))
597 		goto out_noxbuf;
598 	if (testmgr_alloc_buf(axbuf))
599 		goto out_noaxbuf;
600 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
601 		goto out_nooutbuf;
602 
603 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
604 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
605 	if (!sg)
606 		goto out_nosg;
607 	sgout = &sg[16];
608 
609 	if (diff_dst)
610 		d = "-ddst";
611 	else
612 		d = "";
613 
614 	if (enc == ENCRYPT)
615 		e = "encryption";
616 	else
617 		e = "decryption";
618 
619 	init_completion(&result.completion);
620 
621 	req = aead_request_alloc(tfm, GFP_KERNEL);
622 	if (!req) {
623 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
624 		       d, algo);
625 		goto out;
626 	}
627 
628 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
629 				  tcrypt_complete, &result);
630 
631 	iv_len = crypto_aead_ivsize(tfm);
632 
633 	for (i = 0, j = 0; i < tcount; i++) {
634 		if (template[i].np)
635 			continue;
636 
637 		j++;
638 
639 		/* some templates have no input data but they will
640 		 * touch input
641 		 */
642 		input = xbuf[0];
643 		input += align_offset;
644 		assoc = axbuf[0];
645 
646 		ret = -EINVAL;
647 		if (WARN_ON(align_offset + template[i].ilen >
648 			    PAGE_SIZE || template[i].alen > PAGE_SIZE))
649 			goto out;
650 
651 		memcpy(input, template[i].input, template[i].ilen);
652 		memcpy(assoc, template[i].assoc, template[i].alen);
653 		if (template[i].iv)
654 			memcpy(iv, template[i].iv, iv_len);
655 		else
656 			memset(iv, 0, iv_len);
657 
658 		crypto_aead_clear_flags(tfm, ~0);
659 		if (template[i].wk)
660 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
661 
662 		if (template[i].klen > MAX_KEYLEN) {
663 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
664 			       d, j, algo, template[i].klen,
665 			       MAX_KEYLEN);
666 			ret = -EINVAL;
667 			goto out;
668 		}
669 		memcpy(key, template[i].key, template[i].klen);
670 
671 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
672 		if (template[i].fail == !ret) {
673 			pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
674 			       d, j, algo, crypto_aead_get_flags(tfm));
675 			goto out;
676 		} else if (ret)
677 			continue;
678 
679 		authsize = abs(template[i].rlen - template[i].ilen);
680 		ret = crypto_aead_setauthsize(tfm, authsize);
681 		if (ret) {
682 			pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
683 			       d, authsize, j, algo);
684 			goto out;
685 		}
686 
687 		k = !!template[i].alen;
688 		sg_init_table(sg, k + 1);
689 		sg_set_buf(&sg[0], assoc, template[i].alen);
690 		sg_set_buf(&sg[k], input,
691 			   template[i].ilen + (enc ? authsize : 0));
692 		output = input;
693 
694 		if (diff_dst) {
695 			sg_init_table(sgout, k + 1);
696 			sg_set_buf(&sgout[0], assoc, template[i].alen);
697 
698 			output = xoutbuf[0];
699 			output += align_offset;
700 			sg_set_buf(&sgout[k], output,
701 				   template[i].rlen + (enc ? 0 : authsize));
702 		}
703 
704 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
705 				       template[i].ilen, iv);
706 
707 		aead_request_set_ad(req, template[i].alen);
708 
709 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
710 
711 		switch (ret) {
712 		case 0:
713 			if (template[i].novrfy) {
714 				/* verification was supposed to fail */
715 				pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
716 				       d, e, j, algo);
717 				/* so really, we got a bad message */
718 				ret = -EBADMSG;
719 				goto out;
720 			}
721 			break;
722 		case -EINPROGRESS:
723 		case -EBUSY:
724 			wait_for_completion(&result.completion);
725 			reinit_completion(&result.completion);
726 			ret = result.err;
727 			if (!ret)
728 				break;
729 		case -EBADMSG:
730 			if (template[i].novrfy)
731 				/* verification failure was expected */
732 				continue;
733 			/* fall through */
734 		default:
735 			pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
736 			       d, e, j, algo, -ret);
737 			goto out;
738 		}
739 
740 		q = output;
741 		if (memcmp(q, template[i].result, template[i].rlen)) {
742 			pr_err("alg: aead%s: Test %d failed on %s for %s\n",
743 			       d, j, e, algo);
744 			hexdump(q, template[i].rlen);
745 			ret = -EINVAL;
746 			goto out;
747 		}
748 	}
749 
750 	for (i = 0, j = 0; i < tcount; i++) {
751 		/* alignment tests are only done with continuous buffers */
752 		if (align_offset != 0)
753 			break;
754 
755 		if (!template[i].np)
756 			continue;
757 
758 		j++;
759 
760 		if (template[i].iv)
761 			memcpy(iv, template[i].iv, iv_len);
762 		else
763 			memset(iv, 0, MAX_IVLEN);
764 
765 		crypto_aead_clear_flags(tfm, ~0);
766 		if (template[i].wk)
767 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
768 		if (template[i].klen > MAX_KEYLEN) {
769 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
770 			       d, j, algo, template[i].klen, MAX_KEYLEN);
771 			ret = -EINVAL;
772 			goto out;
773 		}
774 		memcpy(key, template[i].key, template[i].klen);
775 
776 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
777 		if (template[i].fail == !ret) {
778 			pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
779 			       d, j, algo, crypto_aead_get_flags(tfm));
780 			goto out;
781 		} else if (ret)
782 			continue;
783 
784 		authsize = abs(template[i].rlen - template[i].ilen);
785 
786 		ret = -EINVAL;
787 		sg_init_table(sg, template[i].anp + template[i].np);
788 		if (diff_dst)
789 			sg_init_table(sgout, template[i].anp + template[i].np);
790 
791 		ret = -EINVAL;
792 		for (k = 0, temp = 0; k < template[i].anp; k++) {
793 			if (WARN_ON(offset_in_page(IDX[k]) +
794 				    template[i].atap[k] > PAGE_SIZE))
795 				goto out;
796 			sg_set_buf(&sg[k],
797 				   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
798 					  offset_in_page(IDX[k]),
799 					  template[i].assoc + temp,
800 					  template[i].atap[k]),
801 				   template[i].atap[k]);
802 			if (diff_dst)
803 				sg_set_buf(&sgout[k],
804 					   axbuf[IDX[k] >> PAGE_SHIFT] +
805 					   offset_in_page(IDX[k]),
806 					   template[i].atap[k]);
807 			temp += template[i].atap[k];
808 		}
809 
810 		for (k = 0, temp = 0; k < template[i].np; k++) {
811 			if (WARN_ON(offset_in_page(IDX[k]) +
812 				    template[i].tap[k] > PAGE_SIZE))
813 				goto out;
814 
815 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
816 			memcpy(q, template[i].input + temp, template[i].tap[k]);
817 			sg_set_buf(&sg[template[i].anp + k],
818 				   q, template[i].tap[k]);
819 
820 			if (diff_dst) {
821 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
822 				    offset_in_page(IDX[k]);
823 
824 				memset(q, 0, template[i].tap[k]);
825 
826 				sg_set_buf(&sgout[template[i].anp + k],
827 					   q, template[i].tap[k]);
828 			}
829 
830 			n = template[i].tap[k];
831 			if (k == template[i].np - 1 && enc)
832 				n += authsize;
833 			if (offset_in_page(q) + n < PAGE_SIZE)
834 				q[n] = 0;
835 
836 			temp += template[i].tap[k];
837 		}
838 
839 		ret = crypto_aead_setauthsize(tfm, authsize);
840 		if (ret) {
841 			pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
842 			       d, authsize, j, algo);
843 			goto out;
844 		}
845 
846 		if (enc) {
847 			if (WARN_ON(sg[template[i].anp + k - 1].offset +
848 				    sg[template[i].anp + k - 1].length +
849 				    authsize > PAGE_SIZE)) {
850 				ret = -EINVAL;
851 				goto out;
852 			}
853 
854 			if (diff_dst)
855 				sgout[template[i].anp + k - 1].length +=
856 					authsize;
857 			sg[template[i].anp + k - 1].length += authsize;
858 		}
859 
860 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
861 				       template[i].ilen,
862 				       iv);
863 
864 		aead_request_set_ad(req, template[i].alen);
865 
866 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
867 
868 		switch (ret) {
869 		case 0:
870 			if (template[i].novrfy) {
871 				/* verification was supposed to fail */
872 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
873 				       d, e, j, algo);
874 				/* so really, we got a bad message */
875 				ret = -EBADMSG;
876 				goto out;
877 			}
878 			break;
879 		case -EINPROGRESS:
880 		case -EBUSY:
881 			wait_for_completion(&result.completion);
882 			reinit_completion(&result.completion);
883 			ret = result.err;
884 			if (!ret)
885 				break;
886 		case -EBADMSG:
887 			if (template[i].novrfy)
888 				/* verification failure was expected */
889 				continue;
890 			/* fall through */
891 		default:
892 			pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
893 			       d, e, j, algo, -ret);
894 			goto out;
895 		}
896 
897 		ret = -EINVAL;
898 		for (k = 0, temp = 0; k < template[i].np; k++) {
899 			if (diff_dst)
900 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
901 				    offset_in_page(IDX[k]);
902 			else
903 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
904 				    offset_in_page(IDX[k]);
905 
906 			n = template[i].tap[k];
907 			if (k == template[i].np - 1)
908 				n += enc ? authsize : -authsize;
909 
910 			if (memcmp(q, template[i].result + temp, n)) {
911 				pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
912 				       d, j, e, k, algo);
913 				hexdump(q, n);
914 				goto out;
915 			}
916 
917 			q += n;
918 			if (k == template[i].np - 1 && !enc) {
919 				if (!diff_dst &&
920 					memcmp(q, template[i].input +
921 					      temp + n, authsize))
922 					n = authsize;
923 				else
924 					n = 0;
925 			} else {
926 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
927 					;
928 			}
929 			if (n) {
930 				pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
931 				       d, j, e, k, algo, n);
932 				hexdump(q, n);
933 				goto out;
934 			}
935 
936 			temp += template[i].tap[k];
937 		}
938 	}
939 
940 	ret = 0;
941 
942 out:
943 	aead_request_free(req);
944 	kfree(sg);
945 out_nosg:
946 	if (diff_dst)
947 		testmgr_free_buf(xoutbuf);
948 out_nooutbuf:
949 	testmgr_free_buf(axbuf);
950 out_noaxbuf:
951 	testmgr_free_buf(xbuf);
952 out_noxbuf:
953 	kfree(key);
954 	kfree(iv);
955 	return ret;
956 }
957 
958 static int test_aead(struct crypto_aead *tfm, int enc,
959 		     struct aead_testvec *template, unsigned int tcount)
960 {
961 	unsigned int alignmask;
962 	int ret;
963 
964 	/* test 'dst == src' case */
965 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
966 	if (ret)
967 		return ret;
968 
969 	/* test 'dst != src' case */
970 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
971 	if (ret)
972 		return ret;
973 
974 	/* test unaligned buffers, check with one byte offset */
975 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
976 	if (ret)
977 		return ret;
978 
979 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
980 	if (alignmask) {
981 		/* Check if alignment mask for tfm is correctly set. */
982 		ret = __test_aead(tfm, enc, template, tcount, true,
983 				  alignmask + 1);
984 		if (ret)
985 			return ret;
986 	}
987 
988 	return 0;
989 }
990 
991 static int test_cipher(struct crypto_cipher *tfm, int enc,
992 		       struct cipher_testvec *template, unsigned int tcount)
993 {
994 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
995 	unsigned int i, j, k;
996 	char *q;
997 	const char *e;
998 	void *data;
999 	char *xbuf[XBUFSIZE];
1000 	int ret = -ENOMEM;
1001 
1002 	if (testmgr_alloc_buf(xbuf))
1003 		goto out_nobuf;
1004 
1005 	if (enc == ENCRYPT)
1006 	        e = "encryption";
1007 	else
1008 		e = "decryption";
1009 
1010 	j = 0;
1011 	for (i = 0; i < tcount; i++) {
1012 		if (template[i].np)
1013 			continue;
1014 
1015 		if (fips_enabled && template[i].fips_skip)
1016 			continue;
1017 
1018 		j++;
1019 
1020 		ret = -EINVAL;
1021 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
1022 			goto out;
1023 
1024 		data = xbuf[0];
1025 		memcpy(data, template[i].input, template[i].ilen);
1026 
1027 		crypto_cipher_clear_flags(tfm, ~0);
1028 		if (template[i].wk)
1029 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
1030 
1031 		ret = crypto_cipher_setkey(tfm, template[i].key,
1032 					   template[i].klen);
1033 		if (template[i].fail == !ret) {
1034 			printk(KERN_ERR "alg: cipher: setkey failed "
1035 			       "on test %d for %s: flags=%x\n", j,
1036 			       algo, crypto_cipher_get_flags(tfm));
1037 			goto out;
1038 		} else if (ret)
1039 			continue;
1040 
1041 		for (k = 0; k < template[i].ilen;
1042 		     k += crypto_cipher_blocksize(tfm)) {
1043 			if (enc)
1044 				crypto_cipher_encrypt_one(tfm, data + k,
1045 							  data + k);
1046 			else
1047 				crypto_cipher_decrypt_one(tfm, data + k,
1048 							  data + k);
1049 		}
1050 
1051 		q = data;
1052 		if (memcmp(q, template[i].result, template[i].rlen)) {
1053 			printk(KERN_ERR "alg: cipher: Test %d failed "
1054 			       "on %s for %s\n", j, e, algo);
1055 			hexdump(q, template[i].rlen);
1056 			ret = -EINVAL;
1057 			goto out;
1058 		}
1059 	}
1060 
1061 	ret = 0;
1062 
1063 out:
1064 	testmgr_free_buf(xbuf);
1065 out_nobuf:
1066 	return ret;
1067 }
1068 
1069 static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
1070 			   struct cipher_testvec *template, unsigned int tcount,
1071 			   const bool diff_dst, const int align_offset)
1072 {
1073 	const char *algo =
1074 		crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
1075 	unsigned int i, j, k, n, temp;
1076 	char *q;
1077 	struct skcipher_request *req;
1078 	struct scatterlist sg[8];
1079 	struct scatterlist sgout[8];
1080 	const char *e, *d;
1081 	struct tcrypt_result result;
1082 	void *data;
1083 	char iv[MAX_IVLEN];
1084 	char *xbuf[XBUFSIZE];
1085 	char *xoutbuf[XBUFSIZE];
1086 	int ret = -ENOMEM;
1087 	unsigned int ivsize = crypto_skcipher_ivsize(tfm);
1088 
1089 	if (testmgr_alloc_buf(xbuf))
1090 		goto out_nobuf;
1091 
1092 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
1093 		goto out_nooutbuf;
1094 
1095 	if (diff_dst)
1096 		d = "-ddst";
1097 	else
1098 		d = "";
1099 
1100 	if (enc == ENCRYPT)
1101 	        e = "encryption";
1102 	else
1103 		e = "decryption";
1104 
1105 	init_completion(&result.completion);
1106 
1107 	req = skcipher_request_alloc(tfm, GFP_KERNEL);
1108 	if (!req) {
1109 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
1110 		       d, algo);
1111 		goto out;
1112 	}
1113 
1114 	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1115 				      tcrypt_complete, &result);
1116 
1117 	j = 0;
1118 	for (i = 0; i < tcount; i++) {
1119 		if (template[i].np && !template[i].also_non_np)
1120 			continue;
1121 
1122 		if (fips_enabled && template[i].fips_skip)
1123 			continue;
1124 
1125 		if (template[i].iv)
1126 			memcpy(iv, template[i].iv, ivsize);
1127 		else
1128 			memset(iv, 0, MAX_IVLEN);
1129 
1130 		j++;
1131 		ret = -EINVAL;
1132 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
1133 			goto out;
1134 
1135 		data = xbuf[0];
1136 		data += align_offset;
1137 		memcpy(data, template[i].input, template[i].ilen);
1138 
1139 		crypto_skcipher_clear_flags(tfm, ~0);
1140 		if (template[i].wk)
1141 			crypto_skcipher_set_flags(tfm,
1142 						  CRYPTO_TFM_REQ_WEAK_KEY);
1143 
1144 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1145 					     template[i].klen);
1146 		if (template[i].fail == !ret) {
1147 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
1148 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1149 			goto out;
1150 		} else if (ret)
1151 			continue;
1152 
1153 		sg_init_one(&sg[0], data, template[i].ilen);
1154 		if (diff_dst) {
1155 			data = xoutbuf[0];
1156 			data += align_offset;
1157 			sg_init_one(&sgout[0], data, template[i].ilen);
1158 		}
1159 
1160 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1161 					   template[i].ilen, iv);
1162 		ret = enc ? crypto_skcipher_encrypt(req) :
1163 			    crypto_skcipher_decrypt(req);
1164 
1165 		switch (ret) {
1166 		case 0:
1167 			break;
1168 		case -EINPROGRESS:
1169 		case -EBUSY:
1170 			wait_for_completion(&result.completion);
1171 			reinit_completion(&result.completion);
1172 			ret = result.err;
1173 			if (!ret)
1174 				break;
1175 			/* fall through */
1176 		default:
1177 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
1178 			       d, e, j, algo, -ret);
1179 			goto out;
1180 		}
1181 
1182 		q = data;
1183 		if (memcmp(q, template[i].result, template[i].rlen)) {
1184 			pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
1185 			       d, j, e, algo);
1186 			hexdump(q, template[i].rlen);
1187 			ret = -EINVAL;
1188 			goto out;
1189 		}
1190 
1191 		if (template[i].iv_out &&
1192 		    memcmp(iv, template[i].iv_out,
1193 			   crypto_skcipher_ivsize(tfm))) {
1194 			pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
1195 			       d, j, e, algo);
1196 			hexdump(iv, crypto_skcipher_ivsize(tfm));
1197 			ret = -EINVAL;
1198 			goto out;
1199 		}
1200 	}
1201 
1202 	j = 0;
1203 	for (i = 0; i < tcount; i++) {
1204 		/* alignment tests are only done with continuous buffers */
1205 		if (align_offset != 0)
1206 			break;
1207 
1208 		if (!template[i].np)
1209 			continue;
1210 
1211 		if (fips_enabled && template[i].fips_skip)
1212 			continue;
1213 
1214 		if (template[i].iv)
1215 			memcpy(iv, template[i].iv, ivsize);
1216 		else
1217 			memset(iv, 0, MAX_IVLEN);
1218 
1219 		j++;
1220 		crypto_skcipher_clear_flags(tfm, ~0);
1221 		if (template[i].wk)
1222 			crypto_skcipher_set_flags(tfm,
1223 						  CRYPTO_TFM_REQ_WEAK_KEY);
1224 
1225 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1226 					     template[i].klen);
1227 		if (template[i].fail == !ret) {
1228 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
1229 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1230 			goto out;
1231 		} else if (ret)
1232 			continue;
1233 
1234 		temp = 0;
1235 		ret = -EINVAL;
1236 		sg_init_table(sg, template[i].np);
1237 		if (diff_dst)
1238 			sg_init_table(sgout, template[i].np);
1239 		for (k = 0; k < template[i].np; k++) {
1240 			if (WARN_ON(offset_in_page(IDX[k]) +
1241 				    template[i].tap[k] > PAGE_SIZE))
1242 				goto out;
1243 
1244 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1245 
1246 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1247 
1248 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1249 				q[template[i].tap[k]] = 0;
1250 
1251 			sg_set_buf(&sg[k], q, template[i].tap[k]);
1252 			if (diff_dst) {
1253 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
1254 				    offset_in_page(IDX[k]);
1255 
1256 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
1257 
1258 				memset(q, 0, template[i].tap[k]);
1259 				if (offset_in_page(q) +
1260 				    template[i].tap[k] < PAGE_SIZE)
1261 					q[template[i].tap[k]] = 0;
1262 			}
1263 
1264 			temp += template[i].tap[k];
1265 		}
1266 
1267 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1268 					   template[i].ilen, iv);
1269 
1270 		ret = enc ? crypto_skcipher_encrypt(req) :
1271 			    crypto_skcipher_decrypt(req);
1272 
1273 		switch (ret) {
1274 		case 0:
1275 			break;
1276 		case -EINPROGRESS:
1277 		case -EBUSY:
1278 			wait_for_completion(&result.completion);
1279 			reinit_completion(&result.completion);
1280 			ret = result.err;
1281 			if (!ret)
1282 				break;
1283 			/* fall through */
1284 		default:
1285 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
1286 			       d, e, j, algo, -ret);
1287 			goto out;
1288 		}
1289 
1290 		temp = 0;
1291 		ret = -EINVAL;
1292 		for (k = 0; k < template[i].np; k++) {
1293 			if (diff_dst)
1294 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
1295 				    offset_in_page(IDX[k]);
1296 			else
1297 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1298 				    offset_in_page(IDX[k]);
1299 
1300 			if (memcmp(q, template[i].result + temp,
1301 				   template[i].tap[k])) {
1302 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
1303 				       d, j, e, k, algo);
1304 				hexdump(q, template[i].tap[k]);
1305 				goto out;
1306 			}
1307 
1308 			q += template[i].tap[k];
1309 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1310 				;
1311 			if (n) {
1312 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
1313 				       d, j, e, k, algo, n);
1314 				hexdump(q, n);
1315 				goto out;
1316 			}
1317 			temp += template[i].tap[k];
1318 		}
1319 	}
1320 
1321 	ret = 0;
1322 
1323 out:
1324 	skcipher_request_free(req);
1325 	if (diff_dst)
1326 		testmgr_free_buf(xoutbuf);
1327 out_nooutbuf:
1328 	testmgr_free_buf(xbuf);
1329 out_nobuf:
1330 	return ret;
1331 }
1332 
1333 static int test_skcipher(struct crypto_skcipher *tfm, int enc,
1334 			 struct cipher_testvec *template, unsigned int tcount)
1335 {
1336 	unsigned int alignmask;
1337 	int ret;
1338 
1339 	/* test 'dst == src' case */
1340 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
1341 	if (ret)
1342 		return ret;
1343 
1344 	/* test 'dst != src' case */
1345 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
1346 	if (ret)
1347 		return ret;
1348 
1349 	/* test unaligned buffers, check with one byte offset */
1350 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
1351 	if (ret)
1352 		return ret;
1353 
1354 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
1355 	if (alignmask) {
1356 		/* Check if alignment mask for tfm is correctly set. */
1357 		ret = __test_skcipher(tfm, enc, template, tcount, true,
1358 				      alignmask + 1);
1359 		if (ret)
1360 			return ret;
1361 	}
1362 
1363 	return 0;
1364 }
1365 
1366 static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1367 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1368 {
1369 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1370 	unsigned int i;
1371 	char result[COMP_BUF_SIZE];
1372 	int ret;
1373 
1374 	for (i = 0; i < ctcount; i++) {
1375 		int ilen;
1376 		unsigned int dlen = COMP_BUF_SIZE;
1377 
1378 		memset(result, 0, sizeof (result));
1379 
1380 		ilen = ctemplate[i].inlen;
1381 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1382 		                           ilen, result, &dlen);
1383 		if (ret) {
1384 			printk(KERN_ERR "alg: comp: compression failed "
1385 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1386 			       -ret);
1387 			goto out;
1388 		}
1389 
1390 		if (dlen != ctemplate[i].outlen) {
1391 			printk(KERN_ERR "alg: comp: Compression test %d "
1392 			       "failed for %s: output len = %d\n", i + 1, algo,
1393 			       dlen);
1394 			ret = -EINVAL;
1395 			goto out;
1396 		}
1397 
1398 		if (memcmp(result, ctemplate[i].output, dlen)) {
1399 			printk(KERN_ERR "alg: comp: Compression test %d "
1400 			       "failed for %s\n", i + 1, algo);
1401 			hexdump(result, dlen);
1402 			ret = -EINVAL;
1403 			goto out;
1404 		}
1405 	}
1406 
1407 	for (i = 0; i < dtcount; i++) {
1408 		int ilen;
1409 		unsigned int dlen = COMP_BUF_SIZE;
1410 
1411 		memset(result, 0, sizeof (result));
1412 
1413 		ilen = dtemplate[i].inlen;
1414 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1415 		                             ilen, result, &dlen);
1416 		if (ret) {
1417 			printk(KERN_ERR "alg: comp: decompression failed "
1418 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1419 			       -ret);
1420 			goto out;
1421 		}
1422 
1423 		if (dlen != dtemplate[i].outlen) {
1424 			printk(KERN_ERR "alg: comp: Decompression test %d "
1425 			       "failed for %s: output len = %d\n", i + 1, algo,
1426 			       dlen);
1427 			ret = -EINVAL;
1428 			goto out;
1429 		}
1430 
1431 		if (memcmp(result, dtemplate[i].output, dlen)) {
1432 			printk(KERN_ERR "alg: comp: Decompression test %d "
1433 			       "failed for %s\n", i + 1, algo);
1434 			hexdump(result, dlen);
1435 			ret = -EINVAL;
1436 			goto out;
1437 		}
1438 	}
1439 
1440 	ret = 0;
1441 
1442 out:
1443 	return ret;
1444 }
1445 
1446 static int test_acomp(struct crypto_acomp *tfm, struct comp_testvec *ctemplate,
1447 		      struct comp_testvec *dtemplate, int ctcount, int dtcount)
1448 {
1449 	const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm));
1450 	unsigned int i;
1451 	char *output;
1452 	int ret;
1453 	struct scatterlist src, dst;
1454 	struct acomp_req *req;
1455 	struct tcrypt_result result;
1456 
1457 	output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
1458 	if (!output)
1459 		return -ENOMEM;
1460 
1461 	for (i = 0; i < ctcount; i++) {
1462 		unsigned int dlen = COMP_BUF_SIZE;
1463 		int ilen = ctemplate[i].inlen;
1464 
1465 		memset(output, 0, dlen);
1466 		init_completion(&result.completion);
1467 		sg_init_one(&src, ctemplate[i].input, ilen);
1468 		sg_init_one(&dst, output, dlen);
1469 
1470 		req = acomp_request_alloc(tfm);
1471 		if (!req) {
1472 			pr_err("alg: acomp: request alloc failed for %s\n",
1473 			       algo);
1474 			ret = -ENOMEM;
1475 			goto out;
1476 		}
1477 
1478 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1479 		acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1480 					   tcrypt_complete, &result);
1481 
1482 		ret = wait_async_op(&result, crypto_acomp_compress(req));
1483 		if (ret) {
1484 			pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
1485 			       i + 1, algo, -ret);
1486 			acomp_request_free(req);
1487 			goto out;
1488 		}
1489 
1490 		if (req->dlen != ctemplate[i].outlen) {
1491 			pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n",
1492 			       i + 1, algo, req->dlen);
1493 			ret = -EINVAL;
1494 			acomp_request_free(req);
1495 			goto out;
1496 		}
1497 
1498 		if (memcmp(output, ctemplate[i].output, req->dlen)) {
1499 			pr_err("alg: acomp: Compression test %d failed for %s\n",
1500 			       i + 1, algo);
1501 			hexdump(output, req->dlen);
1502 			ret = -EINVAL;
1503 			acomp_request_free(req);
1504 			goto out;
1505 		}
1506 
1507 		acomp_request_free(req);
1508 	}
1509 
1510 	for (i = 0; i < dtcount; i++) {
1511 		unsigned int dlen = COMP_BUF_SIZE;
1512 		int ilen = dtemplate[i].inlen;
1513 
1514 		memset(output, 0, dlen);
1515 		init_completion(&result.completion);
1516 		sg_init_one(&src, dtemplate[i].input, ilen);
1517 		sg_init_one(&dst, output, dlen);
1518 
1519 		req = acomp_request_alloc(tfm);
1520 		if (!req) {
1521 			pr_err("alg: acomp: request alloc failed for %s\n",
1522 			       algo);
1523 			ret = -ENOMEM;
1524 			goto out;
1525 		}
1526 
1527 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1528 		acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1529 					   tcrypt_complete, &result);
1530 
1531 		ret = wait_async_op(&result, crypto_acomp_decompress(req));
1532 		if (ret) {
1533 			pr_err("alg: acomp: decompression failed on test %d for %s: ret=%d\n",
1534 			       i + 1, algo, -ret);
1535 			acomp_request_free(req);
1536 			goto out;
1537 		}
1538 
1539 		if (req->dlen != dtemplate[i].outlen) {
1540 			pr_err("alg: acomp: Decompression test %d failed for %s: output len = %d\n",
1541 			       i + 1, algo, req->dlen);
1542 			ret = -EINVAL;
1543 			acomp_request_free(req);
1544 			goto out;
1545 		}
1546 
1547 		if (memcmp(output, dtemplate[i].output, req->dlen)) {
1548 			pr_err("alg: acomp: Decompression test %d failed for %s\n",
1549 			       i + 1, algo);
1550 			hexdump(output, req->dlen);
1551 			ret = -EINVAL;
1552 			acomp_request_free(req);
1553 			goto out;
1554 		}
1555 
1556 		acomp_request_free(req);
1557 	}
1558 
1559 	ret = 0;
1560 
1561 out:
1562 	kfree(output);
1563 	return ret;
1564 }
1565 
1566 static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
1567 		      unsigned int tcount)
1568 {
1569 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1570 	int err = 0, i, j, seedsize;
1571 	u8 *seed;
1572 	char result[32];
1573 
1574 	seedsize = crypto_rng_seedsize(tfm);
1575 
1576 	seed = kmalloc(seedsize, GFP_KERNEL);
1577 	if (!seed) {
1578 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
1579 		       "for %s\n", algo);
1580 		return -ENOMEM;
1581 	}
1582 
1583 	for (i = 0; i < tcount; i++) {
1584 		memset(result, 0, 32);
1585 
1586 		memcpy(seed, template[i].v, template[i].vlen);
1587 		memcpy(seed + template[i].vlen, template[i].key,
1588 		       template[i].klen);
1589 		memcpy(seed + template[i].vlen + template[i].klen,
1590 		       template[i].dt, template[i].dtlen);
1591 
1592 		err = crypto_rng_reset(tfm, seed, seedsize);
1593 		if (err) {
1594 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
1595 			       "for %s\n", algo);
1596 			goto out;
1597 		}
1598 
1599 		for (j = 0; j < template[i].loops; j++) {
1600 			err = crypto_rng_get_bytes(tfm, result,
1601 						   template[i].rlen);
1602 			if (err < 0) {
1603 				printk(KERN_ERR "alg: cprng: Failed to obtain "
1604 				       "the correct amount of random data for "
1605 				       "%s (requested %d)\n", algo,
1606 				       template[i].rlen);
1607 				goto out;
1608 			}
1609 		}
1610 
1611 		err = memcmp(result, template[i].result,
1612 			     template[i].rlen);
1613 		if (err) {
1614 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
1615 			       i, algo);
1616 			hexdump(result, template[i].rlen);
1617 			err = -EINVAL;
1618 			goto out;
1619 		}
1620 	}
1621 
1622 out:
1623 	kfree(seed);
1624 	return err;
1625 }
1626 
1627 static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1628 			 u32 type, u32 mask)
1629 {
1630 	struct crypto_aead *tfm;
1631 	int err = 0;
1632 
1633 	tfm = crypto_alloc_aead(driver, type, mask);
1634 	if (IS_ERR(tfm)) {
1635 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1636 		       "%ld\n", driver, PTR_ERR(tfm));
1637 		return PTR_ERR(tfm);
1638 	}
1639 
1640 	if (desc->suite.aead.enc.vecs) {
1641 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1642 				desc->suite.aead.enc.count);
1643 		if (err)
1644 			goto out;
1645 	}
1646 
1647 	if (!err && desc->suite.aead.dec.vecs)
1648 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1649 				desc->suite.aead.dec.count);
1650 
1651 out:
1652 	crypto_free_aead(tfm);
1653 	return err;
1654 }
1655 
1656 static int alg_test_cipher(const struct alg_test_desc *desc,
1657 			   const char *driver, u32 type, u32 mask)
1658 {
1659 	struct crypto_cipher *tfm;
1660 	int err = 0;
1661 
1662 	tfm = crypto_alloc_cipher(driver, type, mask);
1663 	if (IS_ERR(tfm)) {
1664 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1665 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1666 		return PTR_ERR(tfm);
1667 	}
1668 
1669 	if (desc->suite.cipher.enc.vecs) {
1670 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1671 				  desc->suite.cipher.enc.count);
1672 		if (err)
1673 			goto out;
1674 	}
1675 
1676 	if (desc->suite.cipher.dec.vecs)
1677 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1678 				  desc->suite.cipher.dec.count);
1679 
1680 out:
1681 	crypto_free_cipher(tfm);
1682 	return err;
1683 }
1684 
1685 static int alg_test_skcipher(const struct alg_test_desc *desc,
1686 			     const char *driver, u32 type, u32 mask)
1687 {
1688 	struct crypto_skcipher *tfm;
1689 	int err = 0;
1690 
1691 	tfm = crypto_alloc_skcipher(driver, type, mask);
1692 	if (IS_ERR(tfm)) {
1693 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
1694 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1695 		return PTR_ERR(tfm);
1696 	}
1697 
1698 	if (desc->suite.cipher.enc.vecs) {
1699 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1700 				    desc->suite.cipher.enc.count);
1701 		if (err)
1702 			goto out;
1703 	}
1704 
1705 	if (desc->suite.cipher.dec.vecs)
1706 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1707 				    desc->suite.cipher.dec.count);
1708 
1709 out:
1710 	crypto_free_skcipher(tfm);
1711 	return err;
1712 }
1713 
1714 static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1715 			 u32 type, u32 mask)
1716 {
1717 	struct crypto_comp *comp;
1718 	struct crypto_acomp *acomp;
1719 	int err;
1720 	u32 algo_type = type & CRYPTO_ALG_TYPE_ACOMPRESS_MASK;
1721 
1722 	if (algo_type == CRYPTO_ALG_TYPE_ACOMPRESS) {
1723 		acomp = crypto_alloc_acomp(driver, type, mask);
1724 		if (IS_ERR(acomp)) {
1725 			pr_err("alg: acomp: Failed to load transform for %s: %ld\n",
1726 			       driver, PTR_ERR(acomp));
1727 			return PTR_ERR(acomp);
1728 		}
1729 		err = test_acomp(acomp, desc->suite.comp.comp.vecs,
1730 				 desc->suite.comp.decomp.vecs,
1731 				 desc->suite.comp.comp.count,
1732 				 desc->suite.comp.decomp.count);
1733 		crypto_free_acomp(acomp);
1734 	} else {
1735 		comp = crypto_alloc_comp(driver, type, mask);
1736 		if (IS_ERR(comp)) {
1737 			pr_err("alg: comp: Failed to load transform for %s: %ld\n",
1738 			       driver, PTR_ERR(comp));
1739 			return PTR_ERR(comp);
1740 		}
1741 
1742 		err = test_comp(comp, desc->suite.comp.comp.vecs,
1743 				desc->suite.comp.decomp.vecs,
1744 				desc->suite.comp.comp.count,
1745 				desc->suite.comp.decomp.count);
1746 
1747 		crypto_free_comp(comp);
1748 	}
1749 	return err;
1750 }
1751 
1752 static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1753 			 u32 type, u32 mask)
1754 {
1755 	struct crypto_ahash *tfm;
1756 	int err;
1757 
1758 	tfm = crypto_alloc_ahash(driver, type, mask);
1759 	if (IS_ERR(tfm)) {
1760 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1761 		       "%ld\n", driver, PTR_ERR(tfm));
1762 		return PTR_ERR(tfm);
1763 	}
1764 
1765 	err = test_hash(tfm, desc->suite.hash.vecs,
1766 			desc->suite.hash.count, true);
1767 	if (!err)
1768 		err = test_hash(tfm, desc->suite.hash.vecs,
1769 				desc->suite.hash.count, false);
1770 
1771 	crypto_free_ahash(tfm);
1772 	return err;
1773 }
1774 
1775 static int alg_test_crc32c(const struct alg_test_desc *desc,
1776 			   const char *driver, u32 type, u32 mask)
1777 {
1778 	struct crypto_shash *tfm;
1779 	u32 val;
1780 	int err;
1781 
1782 	err = alg_test_hash(desc, driver, type, mask);
1783 	if (err)
1784 		goto out;
1785 
1786 	tfm = crypto_alloc_shash(driver, type, mask);
1787 	if (IS_ERR(tfm)) {
1788 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
1789 		       "%ld\n", driver, PTR_ERR(tfm));
1790 		err = PTR_ERR(tfm);
1791 		goto out;
1792 	}
1793 
1794 	do {
1795 		SHASH_DESC_ON_STACK(shash, tfm);
1796 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
1797 
1798 		shash->tfm = tfm;
1799 		shash->flags = 0;
1800 
1801 		*ctx = le32_to_cpu(420553207);
1802 		err = crypto_shash_final(shash, (u8 *)&val);
1803 		if (err) {
1804 			printk(KERN_ERR "alg: crc32c: Operation failed for "
1805 			       "%s: %d\n", driver, err);
1806 			break;
1807 		}
1808 
1809 		if (val != ~420553207) {
1810 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
1811 			       "%d\n", driver, val);
1812 			err = -EINVAL;
1813 		}
1814 	} while (0);
1815 
1816 	crypto_free_shash(tfm);
1817 
1818 out:
1819 	return err;
1820 }
1821 
1822 static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
1823 			  u32 type, u32 mask)
1824 {
1825 	struct crypto_rng *rng;
1826 	int err;
1827 
1828 	rng = crypto_alloc_rng(driver, type, mask);
1829 	if (IS_ERR(rng)) {
1830 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
1831 		       "%ld\n", driver, PTR_ERR(rng));
1832 		return PTR_ERR(rng);
1833 	}
1834 
1835 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
1836 
1837 	crypto_free_rng(rng);
1838 
1839 	return err;
1840 }
1841 
1842 
1843 static int drbg_cavs_test(struct drbg_testvec *test, int pr,
1844 			  const char *driver, u32 type, u32 mask)
1845 {
1846 	int ret = -EAGAIN;
1847 	struct crypto_rng *drng;
1848 	struct drbg_test_data test_data;
1849 	struct drbg_string addtl, pers, testentropy;
1850 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
1851 
1852 	if (!buf)
1853 		return -ENOMEM;
1854 
1855 	drng = crypto_alloc_rng(driver, type, mask);
1856 	if (IS_ERR(drng)) {
1857 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
1858 		       "%s\n", driver);
1859 		kzfree(buf);
1860 		return -ENOMEM;
1861 	}
1862 
1863 	test_data.testentropy = &testentropy;
1864 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
1865 	drbg_string_fill(&pers, test->pers, test->perslen);
1866 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
1867 	if (ret) {
1868 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
1869 		goto outbuf;
1870 	}
1871 
1872 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
1873 	if (pr) {
1874 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
1875 		ret = crypto_drbg_get_bytes_addtl_test(drng,
1876 			buf, test->expectedlen, &addtl,	&test_data);
1877 	} else {
1878 		ret = crypto_drbg_get_bytes_addtl(drng,
1879 			buf, test->expectedlen, &addtl);
1880 	}
1881 	if (ret < 0) {
1882 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
1883 		       "driver %s\n", driver);
1884 		goto outbuf;
1885 	}
1886 
1887 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
1888 	if (pr) {
1889 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
1890 		ret = crypto_drbg_get_bytes_addtl_test(drng,
1891 			buf, test->expectedlen, &addtl, &test_data);
1892 	} else {
1893 		ret = crypto_drbg_get_bytes_addtl(drng,
1894 			buf, test->expectedlen, &addtl);
1895 	}
1896 	if (ret < 0) {
1897 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
1898 		       "driver %s\n", driver);
1899 		goto outbuf;
1900 	}
1901 
1902 	ret = memcmp(test->expected, buf, test->expectedlen);
1903 
1904 outbuf:
1905 	crypto_free_rng(drng);
1906 	kzfree(buf);
1907 	return ret;
1908 }
1909 
1910 
1911 static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
1912 			 u32 type, u32 mask)
1913 {
1914 	int err = 0;
1915 	int pr = 0;
1916 	int i = 0;
1917 	struct drbg_testvec *template = desc->suite.drbg.vecs;
1918 	unsigned int tcount = desc->suite.drbg.count;
1919 
1920 	if (0 == memcmp(driver, "drbg_pr_", 8))
1921 		pr = 1;
1922 
1923 	for (i = 0; i < tcount; i++) {
1924 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
1925 		if (err) {
1926 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
1927 			       i, driver);
1928 			err = -EINVAL;
1929 			break;
1930 		}
1931 	}
1932 	return err;
1933 
1934 }
1935 
1936 static int do_test_kpp(struct crypto_kpp *tfm, struct kpp_testvec *vec,
1937 		       const char *alg)
1938 {
1939 	struct kpp_request *req;
1940 	void *input_buf = NULL;
1941 	void *output_buf = NULL;
1942 	struct tcrypt_result result;
1943 	unsigned int out_len_max;
1944 	int err = -ENOMEM;
1945 	struct scatterlist src, dst;
1946 
1947 	req = kpp_request_alloc(tfm, GFP_KERNEL);
1948 	if (!req)
1949 		return err;
1950 
1951 	init_completion(&result.completion);
1952 
1953 	err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size);
1954 	if (err < 0)
1955 		goto free_req;
1956 
1957 	out_len_max = crypto_kpp_maxsize(tfm);
1958 	output_buf = kzalloc(out_len_max, GFP_KERNEL);
1959 	if (!output_buf) {
1960 		err = -ENOMEM;
1961 		goto free_req;
1962 	}
1963 
1964 	/* Use appropriate parameter as base */
1965 	kpp_request_set_input(req, NULL, 0);
1966 	sg_init_one(&dst, output_buf, out_len_max);
1967 	kpp_request_set_output(req, &dst, out_len_max);
1968 	kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1969 				 tcrypt_complete, &result);
1970 
1971 	/* Compute public key */
1972 	err = wait_async_op(&result, crypto_kpp_generate_public_key(req));
1973 	if (err) {
1974 		pr_err("alg: %s: generate public key test failed. err %d\n",
1975 		       alg, err);
1976 		goto free_output;
1977 	}
1978 	/* Verify calculated public key */
1979 	if (memcmp(vec->expected_a_public, sg_virt(req->dst),
1980 		   vec->expected_a_public_size)) {
1981 		pr_err("alg: %s: generate public key test failed. Invalid output\n",
1982 		       alg);
1983 		err = -EINVAL;
1984 		goto free_output;
1985 	}
1986 
1987 	/* Calculate shared secret key by using counter part (b) public key. */
1988 	input_buf = kzalloc(vec->b_public_size, GFP_KERNEL);
1989 	if (!input_buf) {
1990 		err = -ENOMEM;
1991 		goto free_output;
1992 	}
1993 
1994 	memcpy(input_buf, vec->b_public, vec->b_public_size);
1995 	sg_init_one(&src, input_buf, vec->b_public_size);
1996 	sg_init_one(&dst, output_buf, out_len_max);
1997 	kpp_request_set_input(req, &src, vec->b_public_size);
1998 	kpp_request_set_output(req, &dst, out_len_max);
1999 	kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2000 				 tcrypt_complete, &result);
2001 	err = wait_async_op(&result, crypto_kpp_compute_shared_secret(req));
2002 	if (err) {
2003 		pr_err("alg: %s: compute shard secret test failed. err %d\n",
2004 		       alg, err);
2005 		goto free_all;
2006 	}
2007 	/*
2008 	 * verify shared secret from which the user will derive
2009 	 * secret key by executing whatever hash it has chosen
2010 	 */
2011 	if (memcmp(vec->expected_ss, sg_virt(req->dst),
2012 		   vec->expected_ss_size)) {
2013 		pr_err("alg: %s: compute shared secret test failed. Invalid output\n",
2014 		       alg);
2015 		err = -EINVAL;
2016 	}
2017 
2018 free_all:
2019 	kfree(input_buf);
2020 free_output:
2021 	kfree(output_buf);
2022 free_req:
2023 	kpp_request_free(req);
2024 	return err;
2025 }
2026 
2027 static int test_kpp(struct crypto_kpp *tfm, const char *alg,
2028 		    struct kpp_testvec *vecs, unsigned int tcount)
2029 {
2030 	int ret, i;
2031 
2032 	for (i = 0; i < tcount; i++) {
2033 		ret = do_test_kpp(tfm, vecs++, alg);
2034 		if (ret) {
2035 			pr_err("alg: %s: test failed on vector %d, err=%d\n",
2036 			       alg, i + 1, ret);
2037 			return ret;
2038 		}
2039 	}
2040 	return 0;
2041 }
2042 
2043 static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver,
2044 			u32 type, u32 mask)
2045 {
2046 	struct crypto_kpp *tfm;
2047 	int err = 0;
2048 
2049 	tfm = crypto_alloc_kpp(driver, type, mask);
2050 	if (IS_ERR(tfm)) {
2051 		pr_err("alg: kpp: Failed to load tfm for %s: %ld\n",
2052 		       driver, PTR_ERR(tfm));
2053 		return PTR_ERR(tfm);
2054 	}
2055 	if (desc->suite.kpp.vecs)
2056 		err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs,
2057 			       desc->suite.kpp.count);
2058 
2059 	crypto_free_kpp(tfm);
2060 	return err;
2061 }
2062 
2063 static int test_akcipher_one(struct crypto_akcipher *tfm,
2064 			     struct akcipher_testvec *vecs)
2065 {
2066 	char *xbuf[XBUFSIZE];
2067 	struct akcipher_request *req;
2068 	void *outbuf_enc = NULL;
2069 	void *outbuf_dec = NULL;
2070 	struct tcrypt_result result;
2071 	unsigned int out_len_max, out_len = 0;
2072 	int err = -ENOMEM;
2073 	struct scatterlist src, dst, src_tab[2];
2074 
2075 	if (testmgr_alloc_buf(xbuf))
2076 		return err;
2077 
2078 	req = akcipher_request_alloc(tfm, GFP_KERNEL);
2079 	if (!req)
2080 		goto free_xbuf;
2081 
2082 	init_completion(&result.completion);
2083 
2084 	if (vecs->public_key_vec)
2085 		err = crypto_akcipher_set_pub_key(tfm, vecs->key,
2086 						  vecs->key_len);
2087 	else
2088 		err = crypto_akcipher_set_priv_key(tfm, vecs->key,
2089 						   vecs->key_len);
2090 	if (err)
2091 		goto free_req;
2092 
2093 	err = -ENOMEM;
2094 	out_len_max = crypto_akcipher_maxsize(tfm);
2095 	outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
2096 	if (!outbuf_enc)
2097 		goto free_req;
2098 
2099 	if (WARN_ON(vecs->m_size > PAGE_SIZE))
2100 		goto free_all;
2101 
2102 	memcpy(xbuf[0], vecs->m, vecs->m_size);
2103 
2104 	sg_init_table(src_tab, 2);
2105 	sg_set_buf(&src_tab[0], xbuf[0], 8);
2106 	sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8);
2107 	sg_init_one(&dst, outbuf_enc, out_len_max);
2108 	akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
2109 				   out_len_max);
2110 	akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2111 				      tcrypt_complete, &result);
2112 
2113 	/* Run RSA encrypt - c = m^e mod n;*/
2114 	err = wait_async_op(&result, crypto_akcipher_encrypt(req));
2115 	if (err) {
2116 		pr_err("alg: akcipher: encrypt test failed. err %d\n", err);
2117 		goto free_all;
2118 	}
2119 	if (req->dst_len != vecs->c_size) {
2120 		pr_err("alg: akcipher: encrypt test failed. Invalid output len\n");
2121 		err = -EINVAL;
2122 		goto free_all;
2123 	}
2124 	/* verify that encrypted message is equal to expected */
2125 	if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
2126 		pr_err("alg: akcipher: encrypt test failed. Invalid output\n");
2127 		hexdump(outbuf_enc, vecs->c_size);
2128 		err = -EINVAL;
2129 		goto free_all;
2130 	}
2131 	/* Don't invoke decrypt for vectors with public key */
2132 	if (vecs->public_key_vec) {
2133 		err = 0;
2134 		goto free_all;
2135 	}
2136 	outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
2137 	if (!outbuf_dec) {
2138 		err = -ENOMEM;
2139 		goto free_all;
2140 	}
2141 
2142 	if (WARN_ON(vecs->c_size > PAGE_SIZE))
2143 		goto free_all;
2144 
2145 	memcpy(xbuf[0], vecs->c, vecs->c_size);
2146 
2147 	sg_init_one(&src, xbuf[0], vecs->c_size);
2148 	sg_init_one(&dst, outbuf_dec, out_len_max);
2149 	init_completion(&result.completion);
2150 	akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
2151 
2152 	/* Run RSA decrypt - m = c^d mod n;*/
2153 	err = wait_async_op(&result, crypto_akcipher_decrypt(req));
2154 	if (err) {
2155 		pr_err("alg: akcipher: decrypt test failed. err %d\n", err);
2156 		goto free_all;
2157 	}
2158 	out_len = req->dst_len;
2159 	if (out_len < vecs->m_size) {
2160 		pr_err("alg: akcipher: decrypt test failed. "
2161 		       "Invalid output len %u\n", out_len);
2162 		err = -EINVAL;
2163 		goto free_all;
2164 	}
2165 	/* verify that decrypted message is equal to the original msg */
2166 	if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) ||
2167 	    memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size,
2168 		   vecs->m_size)) {
2169 		pr_err("alg: akcipher: decrypt test failed. Invalid output\n");
2170 		hexdump(outbuf_dec, out_len);
2171 		err = -EINVAL;
2172 	}
2173 free_all:
2174 	kfree(outbuf_dec);
2175 	kfree(outbuf_enc);
2176 free_req:
2177 	akcipher_request_free(req);
2178 free_xbuf:
2179 	testmgr_free_buf(xbuf);
2180 	return err;
2181 }
2182 
2183 static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
2184 			 struct akcipher_testvec *vecs, unsigned int tcount)
2185 {
2186 	const char *algo =
2187 		crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm));
2188 	int ret, i;
2189 
2190 	for (i = 0; i < tcount; i++) {
2191 		ret = test_akcipher_one(tfm, vecs++);
2192 		if (!ret)
2193 			continue;
2194 
2195 		pr_err("alg: akcipher: test %d failed for %s, err=%d\n",
2196 		       i + 1, algo, ret);
2197 		return ret;
2198 	}
2199 	return 0;
2200 }
2201 
2202 static int alg_test_akcipher(const struct alg_test_desc *desc,
2203 			     const char *driver, u32 type, u32 mask)
2204 {
2205 	struct crypto_akcipher *tfm;
2206 	int err = 0;
2207 
2208 	tfm = crypto_alloc_akcipher(driver, type, mask);
2209 	if (IS_ERR(tfm)) {
2210 		pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
2211 		       driver, PTR_ERR(tfm));
2212 		return PTR_ERR(tfm);
2213 	}
2214 	if (desc->suite.akcipher.vecs)
2215 		err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
2216 				    desc->suite.akcipher.count);
2217 
2218 	crypto_free_akcipher(tfm);
2219 	return err;
2220 }
2221 
2222 static int alg_test_null(const struct alg_test_desc *desc,
2223 			     const char *driver, u32 type, u32 mask)
2224 {
2225 	return 0;
2226 }
2227 
2228 /* Please keep this list sorted by algorithm name. */
2229 static const struct alg_test_desc alg_test_descs[] = {
2230 	{
2231 		.alg = "ansi_cprng",
2232 		.test = alg_test_cprng,
2233 		.suite = {
2234 			.cprng = {
2235 				.vecs = ansi_cprng_aes_tv_template,
2236 				.count = ANSI_CPRNG_AES_TEST_VECTORS
2237 			}
2238 		}
2239 	}, {
2240 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
2241 		.test = alg_test_aead,
2242 		.suite = {
2243 			.aead = {
2244 				.enc = {
2245 					.vecs = hmac_md5_ecb_cipher_null_enc_tv_template,
2246 					.count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS
2247 				},
2248 				.dec = {
2249 					.vecs = hmac_md5_ecb_cipher_null_dec_tv_template,
2250 					.count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS
2251 				}
2252 			}
2253 		}
2254 	}, {
2255 		.alg = "authenc(hmac(sha1),cbc(aes))",
2256 		.test = alg_test_aead,
2257 		.suite = {
2258 			.aead = {
2259 				.enc = {
2260 					.vecs =
2261 					hmac_sha1_aes_cbc_enc_tv_temp,
2262 					.count =
2263 					HMAC_SHA1_AES_CBC_ENC_TEST_VEC
2264 				}
2265 			}
2266 		}
2267 	}, {
2268 		.alg = "authenc(hmac(sha1),cbc(des))",
2269 		.test = alg_test_aead,
2270 		.suite = {
2271 			.aead = {
2272 				.enc = {
2273 					.vecs =
2274 					hmac_sha1_des_cbc_enc_tv_temp,
2275 					.count =
2276 					HMAC_SHA1_DES_CBC_ENC_TEST_VEC
2277 				}
2278 			}
2279 		}
2280 	}, {
2281 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
2282 		.test = alg_test_aead,
2283 		.fips_allowed = 1,
2284 		.suite = {
2285 			.aead = {
2286 				.enc = {
2287 					.vecs =
2288 					hmac_sha1_des3_ede_cbc_enc_tv_temp,
2289 					.count =
2290 					HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
2291 				}
2292 			}
2293 		}
2294 	}, {
2295 		.alg = "authenc(hmac(sha1),ctr(aes))",
2296 		.test = alg_test_null,
2297 		.fips_allowed = 1,
2298 	}, {
2299 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
2300 		.test = alg_test_aead,
2301 		.suite = {
2302 			.aead = {
2303 				.enc = {
2304 					.vecs =
2305 					hmac_sha1_ecb_cipher_null_enc_tv_temp,
2306 					.count =
2307 					HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
2308 				},
2309 				.dec = {
2310 					.vecs =
2311 					hmac_sha1_ecb_cipher_null_dec_tv_temp,
2312 					.count =
2313 					HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
2314 				}
2315 			}
2316 		}
2317 	}, {
2318 		.alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
2319 		.test = alg_test_null,
2320 		.fips_allowed = 1,
2321 	}, {
2322 		.alg = "authenc(hmac(sha224),cbc(des))",
2323 		.test = alg_test_aead,
2324 		.suite = {
2325 			.aead = {
2326 				.enc = {
2327 					.vecs =
2328 					hmac_sha224_des_cbc_enc_tv_temp,
2329 					.count =
2330 					HMAC_SHA224_DES_CBC_ENC_TEST_VEC
2331 				}
2332 			}
2333 		}
2334 	}, {
2335 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
2336 		.test = alg_test_aead,
2337 		.fips_allowed = 1,
2338 		.suite = {
2339 			.aead = {
2340 				.enc = {
2341 					.vecs =
2342 					hmac_sha224_des3_ede_cbc_enc_tv_temp,
2343 					.count =
2344 					HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
2345 				}
2346 			}
2347 		}
2348 	}, {
2349 		.alg = "authenc(hmac(sha256),cbc(aes))",
2350 		.test = alg_test_aead,
2351 		.fips_allowed = 1,
2352 		.suite = {
2353 			.aead = {
2354 				.enc = {
2355 					.vecs =
2356 					hmac_sha256_aes_cbc_enc_tv_temp,
2357 					.count =
2358 					HMAC_SHA256_AES_CBC_ENC_TEST_VEC
2359 				}
2360 			}
2361 		}
2362 	}, {
2363 		.alg = "authenc(hmac(sha256),cbc(des))",
2364 		.test = alg_test_aead,
2365 		.suite = {
2366 			.aead = {
2367 				.enc = {
2368 					.vecs =
2369 					hmac_sha256_des_cbc_enc_tv_temp,
2370 					.count =
2371 					HMAC_SHA256_DES_CBC_ENC_TEST_VEC
2372 				}
2373 			}
2374 		}
2375 	}, {
2376 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
2377 		.test = alg_test_aead,
2378 		.fips_allowed = 1,
2379 		.suite = {
2380 			.aead = {
2381 				.enc = {
2382 					.vecs =
2383 					hmac_sha256_des3_ede_cbc_enc_tv_temp,
2384 					.count =
2385 					HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
2386 				}
2387 			}
2388 		}
2389 	}, {
2390 		.alg = "authenc(hmac(sha256),ctr(aes))",
2391 		.test = alg_test_null,
2392 		.fips_allowed = 1,
2393 	}, {
2394 		.alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
2395 		.test = alg_test_null,
2396 		.fips_allowed = 1,
2397 	}, {
2398 		.alg = "authenc(hmac(sha384),cbc(des))",
2399 		.test = alg_test_aead,
2400 		.suite = {
2401 			.aead = {
2402 				.enc = {
2403 					.vecs =
2404 					hmac_sha384_des_cbc_enc_tv_temp,
2405 					.count =
2406 					HMAC_SHA384_DES_CBC_ENC_TEST_VEC
2407 				}
2408 			}
2409 		}
2410 	}, {
2411 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
2412 		.test = alg_test_aead,
2413 		.fips_allowed = 1,
2414 		.suite = {
2415 			.aead = {
2416 				.enc = {
2417 					.vecs =
2418 					hmac_sha384_des3_ede_cbc_enc_tv_temp,
2419 					.count =
2420 					HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC
2421 				}
2422 			}
2423 		}
2424 	}, {
2425 		.alg = "authenc(hmac(sha384),ctr(aes))",
2426 		.test = alg_test_null,
2427 		.fips_allowed = 1,
2428 	}, {
2429 		.alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
2430 		.test = alg_test_null,
2431 		.fips_allowed = 1,
2432 	}, {
2433 		.alg = "authenc(hmac(sha512),cbc(aes))",
2434 		.fips_allowed = 1,
2435 		.test = alg_test_aead,
2436 		.suite = {
2437 			.aead = {
2438 				.enc = {
2439 					.vecs =
2440 					hmac_sha512_aes_cbc_enc_tv_temp,
2441 					.count =
2442 					HMAC_SHA512_AES_CBC_ENC_TEST_VEC
2443 				}
2444 			}
2445 		}
2446 	}, {
2447 		.alg = "authenc(hmac(sha512),cbc(des))",
2448 		.test = alg_test_aead,
2449 		.suite = {
2450 			.aead = {
2451 				.enc = {
2452 					.vecs =
2453 					hmac_sha512_des_cbc_enc_tv_temp,
2454 					.count =
2455 					HMAC_SHA512_DES_CBC_ENC_TEST_VEC
2456 				}
2457 			}
2458 		}
2459 	}, {
2460 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
2461 		.test = alg_test_aead,
2462 		.fips_allowed = 1,
2463 		.suite = {
2464 			.aead = {
2465 				.enc = {
2466 					.vecs =
2467 					hmac_sha512_des3_ede_cbc_enc_tv_temp,
2468 					.count =
2469 					HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
2470 				}
2471 			}
2472 		}
2473 	}, {
2474 		.alg = "authenc(hmac(sha512),ctr(aes))",
2475 		.test = alg_test_null,
2476 		.fips_allowed = 1,
2477 	}, {
2478 		.alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
2479 		.test = alg_test_null,
2480 		.fips_allowed = 1,
2481 	}, {
2482 		.alg = "cbc(aes)",
2483 		.test = alg_test_skcipher,
2484 		.fips_allowed = 1,
2485 		.suite = {
2486 			.cipher = {
2487 				.enc = {
2488 					.vecs = aes_cbc_enc_tv_template,
2489 					.count = AES_CBC_ENC_TEST_VECTORS
2490 				},
2491 				.dec = {
2492 					.vecs = aes_cbc_dec_tv_template,
2493 					.count = AES_CBC_DEC_TEST_VECTORS
2494 				}
2495 			}
2496 		}
2497 	}, {
2498 		.alg = "cbc(anubis)",
2499 		.test = alg_test_skcipher,
2500 		.suite = {
2501 			.cipher = {
2502 				.enc = {
2503 					.vecs = anubis_cbc_enc_tv_template,
2504 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
2505 				},
2506 				.dec = {
2507 					.vecs = anubis_cbc_dec_tv_template,
2508 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
2509 				}
2510 			}
2511 		}
2512 	}, {
2513 		.alg = "cbc(blowfish)",
2514 		.test = alg_test_skcipher,
2515 		.suite = {
2516 			.cipher = {
2517 				.enc = {
2518 					.vecs = bf_cbc_enc_tv_template,
2519 					.count = BF_CBC_ENC_TEST_VECTORS
2520 				},
2521 				.dec = {
2522 					.vecs = bf_cbc_dec_tv_template,
2523 					.count = BF_CBC_DEC_TEST_VECTORS
2524 				}
2525 			}
2526 		}
2527 	}, {
2528 		.alg = "cbc(camellia)",
2529 		.test = alg_test_skcipher,
2530 		.suite = {
2531 			.cipher = {
2532 				.enc = {
2533 					.vecs = camellia_cbc_enc_tv_template,
2534 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
2535 				},
2536 				.dec = {
2537 					.vecs = camellia_cbc_dec_tv_template,
2538 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
2539 				}
2540 			}
2541 		}
2542 	}, {
2543 		.alg = "cbc(cast5)",
2544 		.test = alg_test_skcipher,
2545 		.suite = {
2546 			.cipher = {
2547 				.enc = {
2548 					.vecs = cast5_cbc_enc_tv_template,
2549 					.count = CAST5_CBC_ENC_TEST_VECTORS
2550 				},
2551 				.dec = {
2552 					.vecs = cast5_cbc_dec_tv_template,
2553 					.count = CAST5_CBC_DEC_TEST_VECTORS
2554 				}
2555 			}
2556 		}
2557 	}, {
2558 		.alg = "cbc(cast6)",
2559 		.test = alg_test_skcipher,
2560 		.suite = {
2561 			.cipher = {
2562 				.enc = {
2563 					.vecs = cast6_cbc_enc_tv_template,
2564 					.count = CAST6_CBC_ENC_TEST_VECTORS
2565 				},
2566 				.dec = {
2567 					.vecs = cast6_cbc_dec_tv_template,
2568 					.count = CAST6_CBC_DEC_TEST_VECTORS
2569 				}
2570 			}
2571 		}
2572 	}, {
2573 		.alg = "cbc(des)",
2574 		.test = alg_test_skcipher,
2575 		.suite = {
2576 			.cipher = {
2577 				.enc = {
2578 					.vecs = des_cbc_enc_tv_template,
2579 					.count = DES_CBC_ENC_TEST_VECTORS
2580 				},
2581 				.dec = {
2582 					.vecs = des_cbc_dec_tv_template,
2583 					.count = DES_CBC_DEC_TEST_VECTORS
2584 				}
2585 			}
2586 		}
2587 	}, {
2588 		.alg = "cbc(des3_ede)",
2589 		.test = alg_test_skcipher,
2590 		.fips_allowed = 1,
2591 		.suite = {
2592 			.cipher = {
2593 				.enc = {
2594 					.vecs = des3_ede_cbc_enc_tv_template,
2595 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
2596 				},
2597 				.dec = {
2598 					.vecs = des3_ede_cbc_dec_tv_template,
2599 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
2600 				}
2601 			}
2602 		}
2603 	}, {
2604 		.alg = "cbc(serpent)",
2605 		.test = alg_test_skcipher,
2606 		.suite = {
2607 			.cipher = {
2608 				.enc = {
2609 					.vecs = serpent_cbc_enc_tv_template,
2610 					.count = SERPENT_CBC_ENC_TEST_VECTORS
2611 				},
2612 				.dec = {
2613 					.vecs = serpent_cbc_dec_tv_template,
2614 					.count = SERPENT_CBC_DEC_TEST_VECTORS
2615 				}
2616 			}
2617 		}
2618 	}, {
2619 		.alg = "cbc(twofish)",
2620 		.test = alg_test_skcipher,
2621 		.suite = {
2622 			.cipher = {
2623 				.enc = {
2624 					.vecs = tf_cbc_enc_tv_template,
2625 					.count = TF_CBC_ENC_TEST_VECTORS
2626 				},
2627 				.dec = {
2628 					.vecs = tf_cbc_dec_tv_template,
2629 					.count = TF_CBC_DEC_TEST_VECTORS
2630 				}
2631 			}
2632 		}
2633 	}, {
2634 		.alg = "ccm(aes)",
2635 		.test = alg_test_aead,
2636 		.fips_allowed = 1,
2637 		.suite = {
2638 			.aead = {
2639 				.enc = {
2640 					.vecs = aes_ccm_enc_tv_template,
2641 					.count = AES_CCM_ENC_TEST_VECTORS
2642 				},
2643 				.dec = {
2644 					.vecs = aes_ccm_dec_tv_template,
2645 					.count = AES_CCM_DEC_TEST_VECTORS
2646 				}
2647 			}
2648 		}
2649 	}, {
2650 		.alg = "chacha20",
2651 		.test = alg_test_skcipher,
2652 		.suite = {
2653 			.cipher = {
2654 				.enc = {
2655 					.vecs = chacha20_enc_tv_template,
2656 					.count = CHACHA20_ENC_TEST_VECTORS
2657 				},
2658 				.dec = {
2659 					.vecs = chacha20_enc_tv_template,
2660 					.count = CHACHA20_ENC_TEST_VECTORS
2661 				},
2662 			}
2663 		}
2664 	}, {
2665 		.alg = "cmac(aes)",
2666 		.fips_allowed = 1,
2667 		.test = alg_test_hash,
2668 		.suite = {
2669 			.hash = {
2670 				.vecs = aes_cmac128_tv_template,
2671 				.count = CMAC_AES_TEST_VECTORS
2672 			}
2673 		}
2674 	}, {
2675 		.alg = "cmac(des3_ede)",
2676 		.fips_allowed = 1,
2677 		.test = alg_test_hash,
2678 		.suite = {
2679 			.hash = {
2680 				.vecs = des3_ede_cmac64_tv_template,
2681 				.count = CMAC_DES3_EDE_TEST_VECTORS
2682 			}
2683 		}
2684 	}, {
2685 		.alg = "compress_null",
2686 		.test = alg_test_null,
2687 	}, {
2688 		.alg = "crc32",
2689 		.test = alg_test_hash,
2690 		.suite = {
2691 			.hash = {
2692 				.vecs = crc32_tv_template,
2693 				.count = CRC32_TEST_VECTORS
2694 			}
2695 		}
2696 	}, {
2697 		.alg = "crc32c",
2698 		.test = alg_test_crc32c,
2699 		.fips_allowed = 1,
2700 		.suite = {
2701 			.hash = {
2702 				.vecs = crc32c_tv_template,
2703 				.count = CRC32C_TEST_VECTORS
2704 			}
2705 		}
2706 	}, {
2707 		.alg = "crct10dif",
2708 		.test = alg_test_hash,
2709 		.fips_allowed = 1,
2710 		.suite = {
2711 			.hash = {
2712 				.vecs = crct10dif_tv_template,
2713 				.count = CRCT10DIF_TEST_VECTORS
2714 			}
2715 		}
2716 	}, {
2717 		.alg = "ctr(aes)",
2718 		.test = alg_test_skcipher,
2719 		.fips_allowed = 1,
2720 		.suite = {
2721 			.cipher = {
2722 				.enc = {
2723 					.vecs = aes_ctr_enc_tv_template,
2724 					.count = AES_CTR_ENC_TEST_VECTORS
2725 				},
2726 				.dec = {
2727 					.vecs = aes_ctr_dec_tv_template,
2728 					.count = AES_CTR_DEC_TEST_VECTORS
2729 				}
2730 			}
2731 		}
2732 	}, {
2733 		.alg = "ctr(blowfish)",
2734 		.test = alg_test_skcipher,
2735 		.suite = {
2736 			.cipher = {
2737 				.enc = {
2738 					.vecs = bf_ctr_enc_tv_template,
2739 					.count = BF_CTR_ENC_TEST_VECTORS
2740 				},
2741 				.dec = {
2742 					.vecs = bf_ctr_dec_tv_template,
2743 					.count = BF_CTR_DEC_TEST_VECTORS
2744 				}
2745 			}
2746 		}
2747 	}, {
2748 		.alg = "ctr(camellia)",
2749 		.test = alg_test_skcipher,
2750 		.suite = {
2751 			.cipher = {
2752 				.enc = {
2753 					.vecs = camellia_ctr_enc_tv_template,
2754 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
2755 				},
2756 				.dec = {
2757 					.vecs = camellia_ctr_dec_tv_template,
2758 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
2759 				}
2760 			}
2761 		}
2762 	}, {
2763 		.alg = "ctr(cast5)",
2764 		.test = alg_test_skcipher,
2765 		.suite = {
2766 			.cipher = {
2767 				.enc = {
2768 					.vecs = cast5_ctr_enc_tv_template,
2769 					.count = CAST5_CTR_ENC_TEST_VECTORS
2770 				},
2771 				.dec = {
2772 					.vecs = cast5_ctr_dec_tv_template,
2773 					.count = CAST5_CTR_DEC_TEST_VECTORS
2774 				}
2775 			}
2776 		}
2777 	}, {
2778 		.alg = "ctr(cast6)",
2779 		.test = alg_test_skcipher,
2780 		.suite = {
2781 			.cipher = {
2782 				.enc = {
2783 					.vecs = cast6_ctr_enc_tv_template,
2784 					.count = CAST6_CTR_ENC_TEST_VECTORS
2785 				},
2786 				.dec = {
2787 					.vecs = cast6_ctr_dec_tv_template,
2788 					.count = CAST6_CTR_DEC_TEST_VECTORS
2789 				}
2790 			}
2791 		}
2792 	}, {
2793 		.alg = "ctr(des)",
2794 		.test = alg_test_skcipher,
2795 		.suite = {
2796 			.cipher = {
2797 				.enc = {
2798 					.vecs = des_ctr_enc_tv_template,
2799 					.count = DES_CTR_ENC_TEST_VECTORS
2800 				},
2801 				.dec = {
2802 					.vecs = des_ctr_dec_tv_template,
2803 					.count = DES_CTR_DEC_TEST_VECTORS
2804 				}
2805 			}
2806 		}
2807 	}, {
2808 		.alg = "ctr(des3_ede)",
2809 		.test = alg_test_skcipher,
2810 		.suite = {
2811 			.cipher = {
2812 				.enc = {
2813 					.vecs = des3_ede_ctr_enc_tv_template,
2814 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2815 				},
2816 				.dec = {
2817 					.vecs = des3_ede_ctr_dec_tv_template,
2818 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2819 				}
2820 			}
2821 		}
2822 	}, {
2823 		.alg = "ctr(serpent)",
2824 		.test = alg_test_skcipher,
2825 		.suite = {
2826 			.cipher = {
2827 				.enc = {
2828 					.vecs = serpent_ctr_enc_tv_template,
2829 					.count = SERPENT_CTR_ENC_TEST_VECTORS
2830 				},
2831 				.dec = {
2832 					.vecs = serpent_ctr_dec_tv_template,
2833 					.count = SERPENT_CTR_DEC_TEST_VECTORS
2834 				}
2835 			}
2836 		}
2837 	}, {
2838 		.alg = "ctr(twofish)",
2839 		.test = alg_test_skcipher,
2840 		.suite = {
2841 			.cipher = {
2842 				.enc = {
2843 					.vecs = tf_ctr_enc_tv_template,
2844 					.count = TF_CTR_ENC_TEST_VECTORS
2845 				},
2846 				.dec = {
2847 					.vecs = tf_ctr_dec_tv_template,
2848 					.count = TF_CTR_DEC_TEST_VECTORS
2849 				}
2850 			}
2851 		}
2852 	}, {
2853 		.alg = "cts(cbc(aes))",
2854 		.test = alg_test_skcipher,
2855 		.suite = {
2856 			.cipher = {
2857 				.enc = {
2858 					.vecs = cts_mode_enc_tv_template,
2859 					.count = CTS_MODE_ENC_TEST_VECTORS
2860 				},
2861 				.dec = {
2862 					.vecs = cts_mode_dec_tv_template,
2863 					.count = CTS_MODE_DEC_TEST_VECTORS
2864 				}
2865 			}
2866 		}
2867 	}, {
2868 		.alg = "deflate",
2869 		.test = alg_test_comp,
2870 		.fips_allowed = 1,
2871 		.suite = {
2872 			.comp = {
2873 				.comp = {
2874 					.vecs = deflate_comp_tv_template,
2875 					.count = DEFLATE_COMP_TEST_VECTORS
2876 				},
2877 				.decomp = {
2878 					.vecs = deflate_decomp_tv_template,
2879 					.count = DEFLATE_DECOMP_TEST_VECTORS
2880 				}
2881 			}
2882 		}
2883 	}, {
2884 		.alg = "dh",
2885 		.test = alg_test_kpp,
2886 		.fips_allowed = 1,
2887 		.suite = {
2888 			.kpp = {
2889 				.vecs = dh_tv_template,
2890 				.count = DH_TEST_VECTORS
2891 			}
2892 		}
2893 	}, {
2894 		.alg = "digest_null",
2895 		.test = alg_test_null,
2896 	}, {
2897 		.alg = "drbg_nopr_ctr_aes128",
2898 		.test = alg_test_drbg,
2899 		.fips_allowed = 1,
2900 		.suite = {
2901 			.drbg = {
2902 				.vecs = drbg_nopr_ctr_aes128_tv_template,
2903 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
2904 			}
2905 		}
2906 	}, {
2907 		.alg = "drbg_nopr_ctr_aes192",
2908 		.test = alg_test_drbg,
2909 		.fips_allowed = 1,
2910 		.suite = {
2911 			.drbg = {
2912 				.vecs = drbg_nopr_ctr_aes192_tv_template,
2913 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
2914 			}
2915 		}
2916 	}, {
2917 		.alg = "drbg_nopr_ctr_aes256",
2918 		.test = alg_test_drbg,
2919 		.fips_allowed = 1,
2920 		.suite = {
2921 			.drbg = {
2922 				.vecs = drbg_nopr_ctr_aes256_tv_template,
2923 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
2924 			}
2925 		}
2926 	}, {
2927 		/*
2928 		 * There is no need to specifically test the DRBG with every
2929 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
2930 		 */
2931 		.alg = "drbg_nopr_hmac_sha1",
2932 		.fips_allowed = 1,
2933 		.test = alg_test_null,
2934 	}, {
2935 		.alg = "drbg_nopr_hmac_sha256",
2936 		.test = alg_test_drbg,
2937 		.fips_allowed = 1,
2938 		.suite = {
2939 			.drbg = {
2940 				.vecs = drbg_nopr_hmac_sha256_tv_template,
2941 				.count =
2942 				ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
2943 			}
2944 		}
2945 	}, {
2946 		/* covered by drbg_nopr_hmac_sha256 test */
2947 		.alg = "drbg_nopr_hmac_sha384",
2948 		.fips_allowed = 1,
2949 		.test = alg_test_null,
2950 	}, {
2951 		.alg = "drbg_nopr_hmac_sha512",
2952 		.test = alg_test_null,
2953 		.fips_allowed = 1,
2954 	}, {
2955 		.alg = "drbg_nopr_sha1",
2956 		.fips_allowed = 1,
2957 		.test = alg_test_null,
2958 	}, {
2959 		.alg = "drbg_nopr_sha256",
2960 		.test = alg_test_drbg,
2961 		.fips_allowed = 1,
2962 		.suite = {
2963 			.drbg = {
2964 				.vecs = drbg_nopr_sha256_tv_template,
2965 				.count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
2966 			}
2967 		}
2968 	}, {
2969 		/* covered by drbg_nopr_sha256 test */
2970 		.alg = "drbg_nopr_sha384",
2971 		.fips_allowed = 1,
2972 		.test = alg_test_null,
2973 	}, {
2974 		.alg = "drbg_nopr_sha512",
2975 		.fips_allowed = 1,
2976 		.test = alg_test_null,
2977 	}, {
2978 		.alg = "drbg_pr_ctr_aes128",
2979 		.test = alg_test_drbg,
2980 		.fips_allowed = 1,
2981 		.suite = {
2982 			.drbg = {
2983 				.vecs = drbg_pr_ctr_aes128_tv_template,
2984 				.count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
2985 			}
2986 		}
2987 	}, {
2988 		/* covered by drbg_pr_ctr_aes128 test */
2989 		.alg = "drbg_pr_ctr_aes192",
2990 		.fips_allowed = 1,
2991 		.test = alg_test_null,
2992 	}, {
2993 		.alg = "drbg_pr_ctr_aes256",
2994 		.fips_allowed = 1,
2995 		.test = alg_test_null,
2996 	}, {
2997 		.alg = "drbg_pr_hmac_sha1",
2998 		.fips_allowed = 1,
2999 		.test = alg_test_null,
3000 	}, {
3001 		.alg = "drbg_pr_hmac_sha256",
3002 		.test = alg_test_drbg,
3003 		.fips_allowed = 1,
3004 		.suite = {
3005 			.drbg = {
3006 				.vecs = drbg_pr_hmac_sha256_tv_template,
3007 				.count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
3008 			}
3009 		}
3010 	}, {
3011 		/* covered by drbg_pr_hmac_sha256 test */
3012 		.alg = "drbg_pr_hmac_sha384",
3013 		.fips_allowed = 1,
3014 		.test = alg_test_null,
3015 	}, {
3016 		.alg = "drbg_pr_hmac_sha512",
3017 		.test = alg_test_null,
3018 		.fips_allowed = 1,
3019 	}, {
3020 		.alg = "drbg_pr_sha1",
3021 		.fips_allowed = 1,
3022 		.test = alg_test_null,
3023 	}, {
3024 		.alg = "drbg_pr_sha256",
3025 		.test = alg_test_drbg,
3026 		.fips_allowed = 1,
3027 		.suite = {
3028 			.drbg = {
3029 				.vecs = drbg_pr_sha256_tv_template,
3030 				.count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
3031 			}
3032 		}
3033 	}, {
3034 		/* covered by drbg_pr_sha256 test */
3035 		.alg = "drbg_pr_sha384",
3036 		.fips_allowed = 1,
3037 		.test = alg_test_null,
3038 	}, {
3039 		.alg = "drbg_pr_sha512",
3040 		.fips_allowed = 1,
3041 		.test = alg_test_null,
3042 	}, {
3043 		.alg = "ecb(aes)",
3044 		.test = alg_test_skcipher,
3045 		.fips_allowed = 1,
3046 		.suite = {
3047 			.cipher = {
3048 				.enc = {
3049 					.vecs = aes_enc_tv_template,
3050 					.count = AES_ENC_TEST_VECTORS
3051 				},
3052 				.dec = {
3053 					.vecs = aes_dec_tv_template,
3054 					.count = AES_DEC_TEST_VECTORS
3055 				}
3056 			}
3057 		}
3058 	}, {
3059 		.alg = "ecb(anubis)",
3060 		.test = alg_test_skcipher,
3061 		.suite = {
3062 			.cipher = {
3063 				.enc = {
3064 					.vecs = anubis_enc_tv_template,
3065 					.count = ANUBIS_ENC_TEST_VECTORS
3066 				},
3067 				.dec = {
3068 					.vecs = anubis_dec_tv_template,
3069 					.count = ANUBIS_DEC_TEST_VECTORS
3070 				}
3071 			}
3072 		}
3073 	}, {
3074 		.alg = "ecb(arc4)",
3075 		.test = alg_test_skcipher,
3076 		.suite = {
3077 			.cipher = {
3078 				.enc = {
3079 					.vecs = arc4_enc_tv_template,
3080 					.count = ARC4_ENC_TEST_VECTORS
3081 				},
3082 				.dec = {
3083 					.vecs = arc4_dec_tv_template,
3084 					.count = ARC4_DEC_TEST_VECTORS
3085 				}
3086 			}
3087 		}
3088 	}, {
3089 		.alg = "ecb(blowfish)",
3090 		.test = alg_test_skcipher,
3091 		.suite = {
3092 			.cipher = {
3093 				.enc = {
3094 					.vecs = bf_enc_tv_template,
3095 					.count = BF_ENC_TEST_VECTORS
3096 				},
3097 				.dec = {
3098 					.vecs = bf_dec_tv_template,
3099 					.count = BF_DEC_TEST_VECTORS
3100 				}
3101 			}
3102 		}
3103 	}, {
3104 		.alg = "ecb(camellia)",
3105 		.test = alg_test_skcipher,
3106 		.suite = {
3107 			.cipher = {
3108 				.enc = {
3109 					.vecs = camellia_enc_tv_template,
3110 					.count = CAMELLIA_ENC_TEST_VECTORS
3111 				},
3112 				.dec = {
3113 					.vecs = camellia_dec_tv_template,
3114 					.count = CAMELLIA_DEC_TEST_VECTORS
3115 				}
3116 			}
3117 		}
3118 	}, {
3119 		.alg = "ecb(cast5)",
3120 		.test = alg_test_skcipher,
3121 		.suite = {
3122 			.cipher = {
3123 				.enc = {
3124 					.vecs = cast5_enc_tv_template,
3125 					.count = CAST5_ENC_TEST_VECTORS
3126 				},
3127 				.dec = {
3128 					.vecs = cast5_dec_tv_template,
3129 					.count = CAST5_DEC_TEST_VECTORS
3130 				}
3131 			}
3132 		}
3133 	}, {
3134 		.alg = "ecb(cast6)",
3135 		.test = alg_test_skcipher,
3136 		.suite = {
3137 			.cipher = {
3138 				.enc = {
3139 					.vecs = cast6_enc_tv_template,
3140 					.count = CAST6_ENC_TEST_VECTORS
3141 				},
3142 				.dec = {
3143 					.vecs = cast6_dec_tv_template,
3144 					.count = CAST6_DEC_TEST_VECTORS
3145 				}
3146 			}
3147 		}
3148 	}, {
3149 		.alg = "ecb(cipher_null)",
3150 		.test = alg_test_null,
3151 	}, {
3152 		.alg = "ecb(des)",
3153 		.test = alg_test_skcipher,
3154 		.suite = {
3155 			.cipher = {
3156 				.enc = {
3157 					.vecs = des_enc_tv_template,
3158 					.count = DES_ENC_TEST_VECTORS
3159 				},
3160 				.dec = {
3161 					.vecs = des_dec_tv_template,
3162 					.count = DES_DEC_TEST_VECTORS
3163 				}
3164 			}
3165 		}
3166 	}, {
3167 		.alg = "ecb(des3_ede)",
3168 		.test = alg_test_skcipher,
3169 		.fips_allowed = 1,
3170 		.suite = {
3171 			.cipher = {
3172 				.enc = {
3173 					.vecs = des3_ede_enc_tv_template,
3174 					.count = DES3_EDE_ENC_TEST_VECTORS
3175 				},
3176 				.dec = {
3177 					.vecs = des3_ede_dec_tv_template,
3178 					.count = DES3_EDE_DEC_TEST_VECTORS
3179 				}
3180 			}
3181 		}
3182 	}, {
3183 		.alg = "ecb(fcrypt)",
3184 		.test = alg_test_skcipher,
3185 		.suite = {
3186 			.cipher = {
3187 				.enc = {
3188 					.vecs = fcrypt_pcbc_enc_tv_template,
3189 					.count = 1
3190 				},
3191 				.dec = {
3192 					.vecs = fcrypt_pcbc_dec_tv_template,
3193 					.count = 1
3194 				}
3195 			}
3196 		}
3197 	}, {
3198 		.alg = "ecb(khazad)",
3199 		.test = alg_test_skcipher,
3200 		.suite = {
3201 			.cipher = {
3202 				.enc = {
3203 					.vecs = khazad_enc_tv_template,
3204 					.count = KHAZAD_ENC_TEST_VECTORS
3205 				},
3206 				.dec = {
3207 					.vecs = khazad_dec_tv_template,
3208 					.count = KHAZAD_DEC_TEST_VECTORS
3209 				}
3210 			}
3211 		}
3212 	}, {
3213 		.alg = "ecb(seed)",
3214 		.test = alg_test_skcipher,
3215 		.suite = {
3216 			.cipher = {
3217 				.enc = {
3218 					.vecs = seed_enc_tv_template,
3219 					.count = SEED_ENC_TEST_VECTORS
3220 				},
3221 				.dec = {
3222 					.vecs = seed_dec_tv_template,
3223 					.count = SEED_DEC_TEST_VECTORS
3224 				}
3225 			}
3226 		}
3227 	}, {
3228 		.alg = "ecb(serpent)",
3229 		.test = alg_test_skcipher,
3230 		.suite = {
3231 			.cipher = {
3232 				.enc = {
3233 					.vecs = serpent_enc_tv_template,
3234 					.count = SERPENT_ENC_TEST_VECTORS
3235 				},
3236 				.dec = {
3237 					.vecs = serpent_dec_tv_template,
3238 					.count = SERPENT_DEC_TEST_VECTORS
3239 				}
3240 			}
3241 		}
3242 	}, {
3243 		.alg = "ecb(tea)",
3244 		.test = alg_test_skcipher,
3245 		.suite = {
3246 			.cipher = {
3247 				.enc = {
3248 					.vecs = tea_enc_tv_template,
3249 					.count = TEA_ENC_TEST_VECTORS
3250 				},
3251 				.dec = {
3252 					.vecs = tea_dec_tv_template,
3253 					.count = TEA_DEC_TEST_VECTORS
3254 				}
3255 			}
3256 		}
3257 	}, {
3258 		.alg = "ecb(tnepres)",
3259 		.test = alg_test_skcipher,
3260 		.suite = {
3261 			.cipher = {
3262 				.enc = {
3263 					.vecs = tnepres_enc_tv_template,
3264 					.count = TNEPRES_ENC_TEST_VECTORS
3265 				},
3266 				.dec = {
3267 					.vecs = tnepres_dec_tv_template,
3268 					.count = TNEPRES_DEC_TEST_VECTORS
3269 				}
3270 			}
3271 		}
3272 	}, {
3273 		.alg = "ecb(twofish)",
3274 		.test = alg_test_skcipher,
3275 		.suite = {
3276 			.cipher = {
3277 				.enc = {
3278 					.vecs = tf_enc_tv_template,
3279 					.count = TF_ENC_TEST_VECTORS
3280 				},
3281 				.dec = {
3282 					.vecs = tf_dec_tv_template,
3283 					.count = TF_DEC_TEST_VECTORS
3284 				}
3285 			}
3286 		}
3287 	}, {
3288 		.alg = "ecb(xeta)",
3289 		.test = alg_test_skcipher,
3290 		.suite = {
3291 			.cipher = {
3292 				.enc = {
3293 					.vecs = xeta_enc_tv_template,
3294 					.count = XETA_ENC_TEST_VECTORS
3295 				},
3296 				.dec = {
3297 					.vecs = xeta_dec_tv_template,
3298 					.count = XETA_DEC_TEST_VECTORS
3299 				}
3300 			}
3301 		}
3302 	}, {
3303 		.alg = "ecb(xtea)",
3304 		.test = alg_test_skcipher,
3305 		.suite = {
3306 			.cipher = {
3307 				.enc = {
3308 					.vecs = xtea_enc_tv_template,
3309 					.count = XTEA_ENC_TEST_VECTORS
3310 				},
3311 				.dec = {
3312 					.vecs = xtea_dec_tv_template,
3313 					.count = XTEA_DEC_TEST_VECTORS
3314 				}
3315 			}
3316 		}
3317 	}, {
3318 		.alg = "ecdh",
3319 		.test = alg_test_kpp,
3320 		.fips_allowed = 1,
3321 		.suite = {
3322 			.kpp = {
3323 				.vecs = ecdh_tv_template,
3324 				.count = ECDH_TEST_VECTORS
3325 			}
3326 		}
3327 	}, {
3328 		.alg = "gcm(aes)",
3329 		.test = alg_test_aead,
3330 		.fips_allowed = 1,
3331 		.suite = {
3332 			.aead = {
3333 				.enc = {
3334 					.vecs = aes_gcm_enc_tv_template,
3335 					.count = AES_GCM_ENC_TEST_VECTORS
3336 				},
3337 				.dec = {
3338 					.vecs = aes_gcm_dec_tv_template,
3339 					.count = AES_GCM_DEC_TEST_VECTORS
3340 				}
3341 			}
3342 		}
3343 	}, {
3344 		.alg = "ghash",
3345 		.test = alg_test_hash,
3346 		.fips_allowed = 1,
3347 		.suite = {
3348 			.hash = {
3349 				.vecs = ghash_tv_template,
3350 				.count = GHASH_TEST_VECTORS
3351 			}
3352 		}
3353 	}, {
3354 		.alg = "hmac(crc32)",
3355 		.test = alg_test_hash,
3356 		.suite = {
3357 			.hash = {
3358 				.vecs = bfin_crc_tv_template,
3359 				.count = BFIN_CRC_TEST_VECTORS
3360 			}
3361 		}
3362 	}, {
3363 		.alg = "hmac(md5)",
3364 		.test = alg_test_hash,
3365 		.suite = {
3366 			.hash = {
3367 				.vecs = hmac_md5_tv_template,
3368 				.count = HMAC_MD5_TEST_VECTORS
3369 			}
3370 		}
3371 	}, {
3372 		.alg = "hmac(rmd128)",
3373 		.test = alg_test_hash,
3374 		.suite = {
3375 			.hash = {
3376 				.vecs = hmac_rmd128_tv_template,
3377 				.count = HMAC_RMD128_TEST_VECTORS
3378 			}
3379 		}
3380 	}, {
3381 		.alg = "hmac(rmd160)",
3382 		.test = alg_test_hash,
3383 		.suite = {
3384 			.hash = {
3385 				.vecs = hmac_rmd160_tv_template,
3386 				.count = HMAC_RMD160_TEST_VECTORS
3387 			}
3388 		}
3389 	}, {
3390 		.alg = "hmac(sha1)",
3391 		.test = alg_test_hash,
3392 		.fips_allowed = 1,
3393 		.suite = {
3394 			.hash = {
3395 				.vecs = hmac_sha1_tv_template,
3396 				.count = HMAC_SHA1_TEST_VECTORS
3397 			}
3398 		}
3399 	}, {
3400 		.alg = "hmac(sha224)",
3401 		.test = alg_test_hash,
3402 		.fips_allowed = 1,
3403 		.suite = {
3404 			.hash = {
3405 				.vecs = hmac_sha224_tv_template,
3406 				.count = HMAC_SHA224_TEST_VECTORS
3407 			}
3408 		}
3409 	}, {
3410 		.alg = "hmac(sha256)",
3411 		.test = alg_test_hash,
3412 		.fips_allowed = 1,
3413 		.suite = {
3414 			.hash = {
3415 				.vecs = hmac_sha256_tv_template,
3416 				.count = HMAC_SHA256_TEST_VECTORS
3417 			}
3418 		}
3419 	}, {
3420 		.alg = "hmac(sha3-224)",
3421 		.test = alg_test_hash,
3422 		.fips_allowed = 1,
3423 		.suite = {
3424 			.hash = {
3425 				.vecs = hmac_sha3_224_tv_template,
3426 				.count = HMAC_SHA3_224_TEST_VECTORS
3427 			}
3428 		}
3429 	}, {
3430 		.alg = "hmac(sha3-256)",
3431 		.test = alg_test_hash,
3432 		.fips_allowed = 1,
3433 		.suite = {
3434 			.hash = {
3435 				.vecs = hmac_sha3_256_tv_template,
3436 				.count = HMAC_SHA3_256_TEST_VECTORS
3437 			}
3438 		}
3439 	}, {
3440 		.alg = "hmac(sha3-384)",
3441 		.test = alg_test_hash,
3442 		.fips_allowed = 1,
3443 		.suite = {
3444 			.hash = {
3445 				.vecs = hmac_sha3_384_tv_template,
3446 				.count = HMAC_SHA3_384_TEST_VECTORS
3447 			}
3448 		}
3449 	}, {
3450 		.alg = "hmac(sha3-512)",
3451 		.test = alg_test_hash,
3452 		.fips_allowed = 1,
3453 		.suite = {
3454 			.hash = {
3455 				.vecs = hmac_sha3_512_tv_template,
3456 				.count = HMAC_SHA3_512_TEST_VECTORS
3457 			}
3458 		}
3459 	}, {
3460 		.alg = "hmac(sha384)",
3461 		.test = alg_test_hash,
3462 		.fips_allowed = 1,
3463 		.suite = {
3464 			.hash = {
3465 				.vecs = hmac_sha384_tv_template,
3466 				.count = HMAC_SHA384_TEST_VECTORS
3467 			}
3468 		}
3469 	}, {
3470 		.alg = "hmac(sha512)",
3471 		.test = alg_test_hash,
3472 		.fips_allowed = 1,
3473 		.suite = {
3474 			.hash = {
3475 				.vecs = hmac_sha512_tv_template,
3476 				.count = HMAC_SHA512_TEST_VECTORS
3477 			}
3478 		}
3479 	}, {
3480 		.alg = "jitterentropy_rng",
3481 		.fips_allowed = 1,
3482 		.test = alg_test_null,
3483 	}, {
3484 		.alg = "kw(aes)",
3485 		.test = alg_test_skcipher,
3486 		.fips_allowed = 1,
3487 		.suite = {
3488 			.cipher = {
3489 				.enc = {
3490 					.vecs = aes_kw_enc_tv_template,
3491 					.count = ARRAY_SIZE(aes_kw_enc_tv_template)
3492 				},
3493 				.dec = {
3494 					.vecs = aes_kw_dec_tv_template,
3495 					.count = ARRAY_SIZE(aes_kw_dec_tv_template)
3496 				}
3497 			}
3498 		}
3499 	}, {
3500 		.alg = "lrw(aes)",
3501 		.test = alg_test_skcipher,
3502 		.suite = {
3503 			.cipher = {
3504 				.enc = {
3505 					.vecs = aes_lrw_enc_tv_template,
3506 					.count = AES_LRW_ENC_TEST_VECTORS
3507 				},
3508 				.dec = {
3509 					.vecs = aes_lrw_dec_tv_template,
3510 					.count = AES_LRW_DEC_TEST_VECTORS
3511 				}
3512 			}
3513 		}
3514 	}, {
3515 		.alg = "lrw(camellia)",
3516 		.test = alg_test_skcipher,
3517 		.suite = {
3518 			.cipher = {
3519 				.enc = {
3520 					.vecs = camellia_lrw_enc_tv_template,
3521 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
3522 				},
3523 				.dec = {
3524 					.vecs = camellia_lrw_dec_tv_template,
3525 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
3526 				}
3527 			}
3528 		}
3529 	}, {
3530 		.alg = "lrw(cast6)",
3531 		.test = alg_test_skcipher,
3532 		.suite = {
3533 			.cipher = {
3534 				.enc = {
3535 					.vecs = cast6_lrw_enc_tv_template,
3536 					.count = CAST6_LRW_ENC_TEST_VECTORS
3537 				},
3538 				.dec = {
3539 					.vecs = cast6_lrw_dec_tv_template,
3540 					.count = CAST6_LRW_DEC_TEST_VECTORS
3541 				}
3542 			}
3543 		}
3544 	}, {
3545 		.alg = "lrw(serpent)",
3546 		.test = alg_test_skcipher,
3547 		.suite = {
3548 			.cipher = {
3549 				.enc = {
3550 					.vecs = serpent_lrw_enc_tv_template,
3551 					.count = SERPENT_LRW_ENC_TEST_VECTORS
3552 				},
3553 				.dec = {
3554 					.vecs = serpent_lrw_dec_tv_template,
3555 					.count = SERPENT_LRW_DEC_TEST_VECTORS
3556 				}
3557 			}
3558 		}
3559 	}, {
3560 		.alg = "lrw(twofish)",
3561 		.test = alg_test_skcipher,
3562 		.suite = {
3563 			.cipher = {
3564 				.enc = {
3565 					.vecs = tf_lrw_enc_tv_template,
3566 					.count = TF_LRW_ENC_TEST_VECTORS
3567 				},
3568 				.dec = {
3569 					.vecs = tf_lrw_dec_tv_template,
3570 					.count = TF_LRW_DEC_TEST_VECTORS
3571 				}
3572 			}
3573 		}
3574 	}, {
3575 		.alg = "lz4",
3576 		.test = alg_test_comp,
3577 		.fips_allowed = 1,
3578 		.suite = {
3579 			.comp = {
3580 				.comp = {
3581 					.vecs = lz4_comp_tv_template,
3582 					.count = LZ4_COMP_TEST_VECTORS
3583 				},
3584 				.decomp = {
3585 					.vecs = lz4_decomp_tv_template,
3586 					.count = LZ4_DECOMP_TEST_VECTORS
3587 				}
3588 			}
3589 		}
3590 	}, {
3591 		.alg = "lz4hc",
3592 		.test = alg_test_comp,
3593 		.fips_allowed = 1,
3594 		.suite = {
3595 			.comp = {
3596 				.comp = {
3597 					.vecs = lz4hc_comp_tv_template,
3598 					.count = LZ4HC_COMP_TEST_VECTORS
3599 				},
3600 				.decomp = {
3601 					.vecs = lz4hc_decomp_tv_template,
3602 					.count = LZ4HC_DECOMP_TEST_VECTORS
3603 				}
3604 			}
3605 		}
3606 	}, {
3607 		.alg = "lzo",
3608 		.test = alg_test_comp,
3609 		.fips_allowed = 1,
3610 		.suite = {
3611 			.comp = {
3612 				.comp = {
3613 					.vecs = lzo_comp_tv_template,
3614 					.count = LZO_COMP_TEST_VECTORS
3615 				},
3616 				.decomp = {
3617 					.vecs = lzo_decomp_tv_template,
3618 					.count = LZO_DECOMP_TEST_VECTORS
3619 				}
3620 			}
3621 		}
3622 	}, {
3623 		.alg = "md4",
3624 		.test = alg_test_hash,
3625 		.suite = {
3626 			.hash = {
3627 				.vecs = md4_tv_template,
3628 				.count = MD4_TEST_VECTORS
3629 			}
3630 		}
3631 	}, {
3632 		.alg = "md5",
3633 		.test = alg_test_hash,
3634 		.suite = {
3635 			.hash = {
3636 				.vecs = md5_tv_template,
3637 				.count = MD5_TEST_VECTORS
3638 			}
3639 		}
3640 	}, {
3641 		.alg = "michael_mic",
3642 		.test = alg_test_hash,
3643 		.suite = {
3644 			.hash = {
3645 				.vecs = michael_mic_tv_template,
3646 				.count = MICHAEL_MIC_TEST_VECTORS
3647 			}
3648 		}
3649 	}, {
3650 		.alg = "ofb(aes)",
3651 		.test = alg_test_skcipher,
3652 		.fips_allowed = 1,
3653 		.suite = {
3654 			.cipher = {
3655 				.enc = {
3656 					.vecs = aes_ofb_enc_tv_template,
3657 					.count = AES_OFB_ENC_TEST_VECTORS
3658 				},
3659 				.dec = {
3660 					.vecs = aes_ofb_dec_tv_template,
3661 					.count = AES_OFB_DEC_TEST_VECTORS
3662 				}
3663 			}
3664 		}
3665 	}, {
3666 		.alg = "pcbc(fcrypt)",
3667 		.test = alg_test_skcipher,
3668 		.suite = {
3669 			.cipher = {
3670 				.enc = {
3671 					.vecs = fcrypt_pcbc_enc_tv_template,
3672 					.count = FCRYPT_ENC_TEST_VECTORS
3673 				},
3674 				.dec = {
3675 					.vecs = fcrypt_pcbc_dec_tv_template,
3676 					.count = FCRYPT_DEC_TEST_VECTORS
3677 				}
3678 			}
3679 		}
3680 	}, {
3681 		.alg = "poly1305",
3682 		.test = alg_test_hash,
3683 		.suite = {
3684 			.hash = {
3685 				.vecs = poly1305_tv_template,
3686 				.count = POLY1305_TEST_VECTORS
3687 			}
3688 		}
3689 	}, {
3690 		.alg = "rfc3686(ctr(aes))",
3691 		.test = alg_test_skcipher,
3692 		.fips_allowed = 1,
3693 		.suite = {
3694 			.cipher = {
3695 				.enc = {
3696 					.vecs = aes_ctr_rfc3686_enc_tv_template,
3697 					.count = AES_CTR_3686_ENC_TEST_VECTORS
3698 				},
3699 				.dec = {
3700 					.vecs = aes_ctr_rfc3686_dec_tv_template,
3701 					.count = AES_CTR_3686_DEC_TEST_VECTORS
3702 				}
3703 			}
3704 		}
3705 	}, {
3706 		.alg = "rfc4106(gcm(aes))",
3707 		.test = alg_test_aead,
3708 		.fips_allowed = 1,
3709 		.suite = {
3710 			.aead = {
3711 				.enc = {
3712 					.vecs = aes_gcm_rfc4106_enc_tv_template,
3713 					.count = AES_GCM_4106_ENC_TEST_VECTORS
3714 				},
3715 				.dec = {
3716 					.vecs = aes_gcm_rfc4106_dec_tv_template,
3717 					.count = AES_GCM_4106_DEC_TEST_VECTORS
3718 				}
3719 			}
3720 		}
3721 	}, {
3722 		.alg = "rfc4309(ccm(aes))",
3723 		.test = alg_test_aead,
3724 		.fips_allowed = 1,
3725 		.suite = {
3726 			.aead = {
3727 				.enc = {
3728 					.vecs = aes_ccm_rfc4309_enc_tv_template,
3729 					.count = AES_CCM_4309_ENC_TEST_VECTORS
3730 				},
3731 				.dec = {
3732 					.vecs = aes_ccm_rfc4309_dec_tv_template,
3733 					.count = AES_CCM_4309_DEC_TEST_VECTORS
3734 				}
3735 			}
3736 		}
3737 	}, {
3738 		.alg = "rfc4543(gcm(aes))",
3739 		.test = alg_test_aead,
3740 		.suite = {
3741 			.aead = {
3742 				.enc = {
3743 					.vecs = aes_gcm_rfc4543_enc_tv_template,
3744 					.count = AES_GCM_4543_ENC_TEST_VECTORS
3745 				},
3746 				.dec = {
3747 					.vecs = aes_gcm_rfc4543_dec_tv_template,
3748 					.count = AES_GCM_4543_DEC_TEST_VECTORS
3749 				},
3750 			}
3751 		}
3752 	}, {
3753 		.alg = "rfc7539(chacha20,poly1305)",
3754 		.test = alg_test_aead,
3755 		.suite = {
3756 			.aead = {
3757 				.enc = {
3758 					.vecs = rfc7539_enc_tv_template,
3759 					.count = RFC7539_ENC_TEST_VECTORS
3760 				},
3761 				.dec = {
3762 					.vecs = rfc7539_dec_tv_template,
3763 					.count = RFC7539_DEC_TEST_VECTORS
3764 				},
3765 			}
3766 		}
3767 	}, {
3768 		.alg = "rfc7539esp(chacha20,poly1305)",
3769 		.test = alg_test_aead,
3770 		.suite = {
3771 			.aead = {
3772 				.enc = {
3773 					.vecs = rfc7539esp_enc_tv_template,
3774 					.count = RFC7539ESP_ENC_TEST_VECTORS
3775 				},
3776 				.dec = {
3777 					.vecs = rfc7539esp_dec_tv_template,
3778 					.count = RFC7539ESP_DEC_TEST_VECTORS
3779 				},
3780 			}
3781 		}
3782 	}, {
3783 		.alg = "rmd128",
3784 		.test = alg_test_hash,
3785 		.suite = {
3786 			.hash = {
3787 				.vecs = rmd128_tv_template,
3788 				.count = RMD128_TEST_VECTORS
3789 			}
3790 		}
3791 	}, {
3792 		.alg = "rmd160",
3793 		.test = alg_test_hash,
3794 		.suite = {
3795 			.hash = {
3796 				.vecs = rmd160_tv_template,
3797 				.count = RMD160_TEST_VECTORS
3798 			}
3799 		}
3800 	}, {
3801 		.alg = "rmd256",
3802 		.test = alg_test_hash,
3803 		.suite = {
3804 			.hash = {
3805 				.vecs = rmd256_tv_template,
3806 				.count = RMD256_TEST_VECTORS
3807 			}
3808 		}
3809 	}, {
3810 		.alg = "rmd320",
3811 		.test = alg_test_hash,
3812 		.suite = {
3813 			.hash = {
3814 				.vecs = rmd320_tv_template,
3815 				.count = RMD320_TEST_VECTORS
3816 			}
3817 		}
3818 	}, {
3819 		.alg = "rsa",
3820 		.test = alg_test_akcipher,
3821 		.fips_allowed = 1,
3822 		.suite = {
3823 			.akcipher = {
3824 				.vecs = rsa_tv_template,
3825 				.count = RSA_TEST_VECTORS
3826 			}
3827 		}
3828 	}, {
3829 		.alg = "salsa20",
3830 		.test = alg_test_skcipher,
3831 		.suite = {
3832 			.cipher = {
3833 				.enc = {
3834 					.vecs = salsa20_stream_enc_tv_template,
3835 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
3836 				}
3837 			}
3838 		}
3839 	}, {
3840 		.alg = "sha1",
3841 		.test = alg_test_hash,
3842 		.fips_allowed = 1,
3843 		.suite = {
3844 			.hash = {
3845 				.vecs = sha1_tv_template,
3846 				.count = SHA1_TEST_VECTORS
3847 			}
3848 		}
3849 	}, {
3850 		.alg = "sha224",
3851 		.test = alg_test_hash,
3852 		.fips_allowed = 1,
3853 		.suite = {
3854 			.hash = {
3855 				.vecs = sha224_tv_template,
3856 				.count = SHA224_TEST_VECTORS
3857 			}
3858 		}
3859 	}, {
3860 		.alg = "sha256",
3861 		.test = alg_test_hash,
3862 		.fips_allowed = 1,
3863 		.suite = {
3864 			.hash = {
3865 				.vecs = sha256_tv_template,
3866 				.count = SHA256_TEST_VECTORS
3867 			}
3868 		}
3869 	}, {
3870 		.alg = "sha3-224",
3871 		.test = alg_test_hash,
3872 		.fips_allowed = 1,
3873 		.suite = {
3874 			.hash = {
3875 				.vecs = sha3_224_tv_template,
3876 				.count = SHA3_224_TEST_VECTORS
3877 			}
3878 		}
3879 	}, {
3880 		.alg = "sha3-256",
3881 		.test = alg_test_hash,
3882 		.fips_allowed = 1,
3883 		.suite = {
3884 			.hash = {
3885 				.vecs = sha3_256_tv_template,
3886 				.count = SHA3_256_TEST_VECTORS
3887 			}
3888 		}
3889 	}, {
3890 		.alg = "sha3-384",
3891 		.test = alg_test_hash,
3892 		.fips_allowed = 1,
3893 		.suite = {
3894 			.hash = {
3895 				.vecs = sha3_384_tv_template,
3896 				.count = SHA3_384_TEST_VECTORS
3897 			}
3898 		}
3899 	}, {
3900 		.alg = "sha3-512",
3901 		.test = alg_test_hash,
3902 		.fips_allowed = 1,
3903 		.suite = {
3904 			.hash = {
3905 				.vecs = sha3_512_tv_template,
3906 				.count = SHA3_512_TEST_VECTORS
3907 			}
3908 		}
3909 	}, {
3910 		.alg = "sha384",
3911 		.test = alg_test_hash,
3912 		.fips_allowed = 1,
3913 		.suite = {
3914 			.hash = {
3915 				.vecs = sha384_tv_template,
3916 				.count = SHA384_TEST_VECTORS
3917 			}
3918 		}
3919 	}, {
3920 		.alg = "sha512",
3921 		.test = alg_test_hash,
3922 		.fips_allowed = 1,
3923 		.suite = {
3924 			.hash = {
3925 				.vecs = sha512_tv_template,
3926 				.count = SHA512_TEST_VECTORS
3927 			}
3928 		}
3929 	}, {
3930 		.alg = "tgr128",
3931 		.test = alg_test_hash,
3932 		.suite = {
3933 			.hash = {
3934 				.vecs = tgr128_tv_template,
3935 				.count = TGR128_TEST_VECTORS
3936 			}
3937 		}
3938 	}, {
3939 		.alg = "tgr160",
3940 		.test = alg_test_hash,
3941 		.suite = {
3942 			.hash = {
3943 				.vecs = tgr160_tv_template,
3944 				.count = TGR160_TEST_VECTORS
3945 			}
3946 		}
3947 	}, {
3948 		.alg = "tgr192",
3949 		.test = alg_test_hash,
3950 		.suite = {
3951 			.hash = {
3952 				.vecs = tgr192_tv_template,
3953 				.count = TGR192_TEST_VECTORS
3954 			}
3955 		}
3956 	}, {
3957 		.alg = "vmac(aes)",
3958 		.test = alg_test_hash,
3959 		.suite = {
3960 			.hash = {
3961 				.vecs = aes_vmac128_tv_template,
3962 				.count = VMAC_AES_TEST_VECTORS
3963 			}
3964 		}
3965 	}, {
3966 		.alg = "wp256",
3967 		.test = alg_test_hash,
3968 		.suite = {
3969 			.hash = {
3970 				.vecs = wp256_tv_template,
3971 				.count = WP256_TEST_VECTORS
3972 			}
3973 		}
3974 	}, {
3975 		.alg = "wp384",
3976 		.test = alg_test_hash,
3977 		.suite = {
3978 			.hash = {
3979 				.vecs = wp384_tv_template,
3980 				.count = WP384_TEST_VECTORS
3981 			}
3982 		}
3983 	}, {
3984 		.alg = "wp512",
3985 		.test = alg_test_hash,
3986 		.suite = {
3987 			.hash = {
3988 				.vecs = wp512_tv_template,
3989 				.count = WP512_TEST_VECTORS
3990 			}
3991 		}
3992 	}, {
3993 		.alg = "xcbc(aes)",
3994 		.test = alg_test_hash,
3995 		.suite = {
3996 			.hash = {
3997 				.vecs = aes_xcbc128_tv_template,
3998 				.count = XCBC_AES_TEST_VECTORS
3999 			}
4000 		}
4001 	}, {
4002 		.alg = "xts(aes)",
4003 		.test = alg_test_skcipher,
4004 		.fips_allowed = 1,
4005 		.suite = {
4006 			.cipher = {
4007 				.enc = {
4008 					.vecs = aes_xts_enc_tv_template,
4009 					.count = AES_XTS_ENC_TEST_VECTORS
4010 				},
4011 				.dec = {
4012 					.vecs = aes_xts_dec_tv_template,
4013 					.count = AES_XTS_DEC_TEST_VECTORS
4014 				}
4015 			}
4016 		}
4017 	}, {
4018 		.alg = "xts(camellia)",
4019 		.test = alg_test_skcipher,
4020 		.suite = {
4021 			.cipher = {
4022 				.enc = {
4023 					.vecs = camellia_xts_enc_tv_template,
4024 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
4025 				},
4026 				.dec = {
4027 					.vecs = camellia_xts_dec_tv_template,
4028 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
4029 				}
4030 			}
4031 		}
4032 	}, {
4033 		.alg = "xts(cast6)",
4034 		.test = alg_test_skcipher,
4035 		.suite = {
4036 			.cipher = {
4037 				.enc = {
4038 					.vecs = cast6_xts_enc_tv_template,
4039 					.count = CAST6_XTS_ENC_TEST_VECTORS
4040 				},
4041 				.dec = {
4042 					.vecs = cast6_xts_dec_tv_template,
4043 					.count = CAST6_XTS_DEC_TEST_VECTORS
4044 				}
4045 			}
4046 		}
4047 	}, {
4048 		.alg = "xts(serpent)",
4049 		.test = alg_test_skcipher,
4050 		.suite = {
4051 			.cipher = {
4052 				.enc = {
4053 					.vecs = serpent_xts_enc_tv_template,
4054 					.count = SERPENT_XTS_ENC_TEST_VECTORS
4055 				},
4056 				.dec = {
4057 					.vecs = serpent_xts_dec_tv_template,
4058 					.count = SERPENT_XTS_DEC_TEST_VECTORS
4059 				}
4060 			}
4061 		}
4062 	}, {
4063 		.alg = "xts(twofish)",
4064 		.test = alg_test_skcipher,
4065 		.suite = {
4066 			.cipher = {
4067 				.enc = {
4068 					.vecs = tf_xts_enc_tv_template,
4069 					.count = TF_XTS_ENC_TEST_VECTORS
4070 				},
4071 				.dec = {
4072 					.vecs = tf_xts_dec_tv_template,
4073 					.count = TF_XTS_DEC_TEST_VECTORS
4074 				}
4075 			}
4076 		}
4077 	}
4078 };
4079 
4080 static bool alg_test_descs_checked;
4081 
4082 static void alg_test_descs_check_order(void)
4083 {
4084 	int i;
4085 
4086 	/* only check once */
4087 	if (alg_test_descs_checked)
4088 		return;
4089 
4090 	alg_test_descs_checked = true;
4091 
4092 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
4093 		int diff = strcmp(alg_test_descs[i - 1].alg,
4094 				  alg_test_descs[i].alg);
4095 
4096 		if (WARN_ON(diff > 0)) {
4097 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
4098 				alg_test_descs[i - 1].alg,
4099 				alg_test_descs[i].alg);
4100 		}
4101 
4102 		if (WARN_ON(diff == 0)) {
4103 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
4104 				alg_test_descs[i].alg);
4105 		}
4106 	}
4107 }
4108 
4109 static int alg_find_test(const char *alg)
4110 {
4111 	int start = 0;
4112 	int end = ARRAY_SIZE(alg_test_descs);
4113 
4114 	while (start < end) {
4115 		int i = (start + end) / 2;
4116 		int diff = strcmp(alg_test_descs[i].alg, alg);
4117 
4118 		if (diff > 0) {
4119 			end = i;
4120 			continue;
4121 		}
4122 
4123 		if (diff < 0) {
4124 			start = i + 1;
4125 			continue;
4126 		}
4127 
4128 		return i;
4129 	}
4130 
4131 	return -1;
4132 }
4133 
4134 int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
4135 {
4136 	int i;
4137 	int j;
4138 	int rc;
4139 
4140 	if (!fips_enabled && notests) {
4141 		printk_once(KERN_INFO "alg: self-tests disabled\n");
4142 		return 0;
4143 	}
4144 
4145 	alg_test_descs_check_order();
4146 
4147 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
4148 		char nalg[CRYPTO_MAX_ALG_NAME];
4149 
4150 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
4151 		    sizeof(nalg))
4152 			return -ENAMETOOLONG;
4153 
4154 		i = alg_find_test(nalg);
4155 		if (i < 0)
4156 			goto notest;
4157 
4158 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
4159 			goto non_fips_alg;
4160 
4161 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
4162 		goto test_done;
4163 	}
4164 
4165 	i = alg_find_test(alg);
4166 	j = alg_find_test(driver);
4167 	if (i < 0 && j < 0)
4168 		goto notest;
4169 
4170 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
4171 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
4172 		goto non_fips_alg;
4173 
4174 	rc = 0;
4175 	if (i >= 0)
4176 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
4177 					     type, mask);
4178 	if (j >= 0 && j != i)
4179 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
4180 					     type, mask);
4181 
4182 test_done:
4183 	if (fips_enabled && rc)
4184 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
4185 
4186 	if (fips_enabled && !rc)
4187 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
4188 
4189 	return rc;
4190 
4191 notest:
4192 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
4193 	return 0;
4194 non_fips_alg:
4195 	return -EINVAL;
4196 }
4197 
4198 #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
4199 
4200 EXPORT_SYMBOL_GPL(alg_test);
4201