xref: /openbmc/linux/crypto/testmgr.c (revision aac5987a)
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		1511
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 	size_t digest_size = crypto_ahash_digestsize(tfm);
269 	unsigned int i, j, k, temp;
270 	struct scatterlist sg[8];
271 	char *result;
272 	char *key;
273 	struct ahash_request *req;
274 	struct tcrypt_result tresult;
275 	void *hash_buff;
276 	char *xbuf[XBUFSIZE];
277 	int ret = -ENOMEM;
278 
279 	result = kmalloc(digest_size, GFP_KERNEL);
280 	if (!result)
281 		return ret;
282 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
283 	if (!key)
284 		goto out_nobuf;
285 	if (testmgr_alloc_buf(xbuf))
286 		goto out_nobuf;
287 
288 	init_completion(&tresult.completion);
289 
290 	req = ahash_request_alloc(tfm, GFP_KERNEL);
291 	if (!req) {
292 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
293 		       "%s\n", algo);
294 		goto out_noreq;
295 	}
296 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
297 				   tcrypt_complete, &tresult);
298 
299 	j = 0;
300 	for (i = 0; i < tcount; i++) {
301 		if (template[i].np)
302 			continue;
303 
304 		ret = -EINVAL;
305 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
306 			goto out;
307 
308 		j++;
309 		memset(result, 0, digest_size);
310 
311 		hash_buff = xbuf[0];
312 		hash_buff += align_offset;
313 
314 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
315 		sg_init_one(&sg[0], hash_buff, template[i].psize);
316 
317 		if (template[i].ksize) {
318 			crypto_ahash_clear_flags(tfm, ~0);
319 			if (template[i].ksize > MAX_KEYLEN) {
320 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
321 				       j, algo, template[i].ksize, MAX_KEYLEN);
322 				ret = -EINVAL;
323 				goto out;
324 			}
325 			memcpy(key, template[i].key, template[i].ksize);
326 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
327 			if (ret) {
328 				printk(KERN_ERR "alg: hash: setkey failed on "
329 				       "test %d for %s: ret=%d\n", j, algo,
330 				       -ret);
331 				goto out;
332 			}
333 		}
334 
335 		ahash_request_set_crypt(req, sg, result, template[i].psize);
336 		if (use_digest) {
337 			ret = wait_async_op(&tresult, crypto_ahash_digest(req));
338 			if (ret) {
339 				pr_err("alg: hash: digest failed on test %d "
340 				       "for %s: ret=%d\n", j, algo, -ret);
341 				goto out;
342 			}
343 		} else {
344 			ret = wait_async_op(&tresult, crypto_ahash_init(req));
345 			if (ret) {
346 				pr_err("alt: hash: init failed on test %d "
347 				       "for %s: ret=%d\n", j, algo, -ret);
348 				goto out;
349 			}
350 			ret = wait_async_op(&tresult, crypto_ahash_update(req));
351 			if (ret) {
352 				pr_err("alt: hash: update failed on test %d "
353 				       "for %s: ret=%d\n", j, algo, -ret);
354 				goto out;
355 			}
356 			ret = wait_async_op(&tresult, crypto_ahash_final(req));
357 			if (ret) {
358 				pr_err("alt: hash: final failed on test %d "
359 				       "for %s: ret=%d\n", j, algo, -ret);
360 				goto out;
361 			}
362 		}
363 
364 		if (memcmp(result, template[i].digest,
365 			   crypto_ahash_digestsize(tfm))) {
366 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
367 			       j, algo);
368 			hexdump(result, crypto_ahash_digestsize(tfm));
369 			ret = -EINVAL;
370 			goto out;
371 		}
372 	}
373 
374 	j = 0;
375 	for (i = 0; i < tcount; i++) {
376 		/* alignment tests are only done with continuous buffers */
377 		if (align_offset != 0)
378 			break;
379 
380 		if (!template[i].np)
381 			continue;
382 
383 		j++;
384 		memset(result, 0, digest_size);
385 
386 		temp = 0;
387 		sg_init_table(sg, template[i].np);
388 		ret = -EINVAL;
389 		for (k = 0; k < template[i].np; k++) {
390 			if (WARN_ON(offset_in_page(IDX[k]) +
391 				    template[i].tap[k] > PAGE_SIZE))
392 				goto out;
393 			sg_set_buf(&sg[k],
394 				   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
395 					  offset_in_page(IDX[k]),
396 					  template[i].plaintext + temp,
397 					  template[i].tap[k]),
398 				   template[i].tap[k]);
399 			temp += template[i].tap[k];
400 		}
401 
402 		if (template[i].ksize) {
403 			if (template[i].ksize > MAX_KEYLEN) {
404 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
405 				       j, algo, template[i].ksize, MAX_KEYLEN);
406 				ret = -EINVAL;
407 				goto out;
408 			}
409 			crypto_ahash_clear_flags(tfm, ~0);
410 			memcpy(key, template[i].key, template[i].ksize);
411 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
412 
413 			if (ret) {
414 				printk(KERN_ERR "alg: hash: setkey "
415 				       "failed on chunking test %d "
416 				       "for %s: ret=%d\n", j, algo, -ret);
417 				goto out;
418 			}
419 		}
420 
421 		ahash_request_set_crypt(req, sg, result, template[i].psize);
422 		ret = crypto_ahash_digest(req);
423 		switch (ret) {
424 		case 0:
425 			break;
426 		case -EINPROGRESS:
427 		case -EBUSY:
428 			wait_for_completion(&tresult.completion);
429 			reinit_completion(&tresult.completion);
430 			ret = tresult.err;
431 			if (!ret)
432 				break;
433 			/* fall through */
434 		default:
435 			printk(KERN_ERR "alg: hash: digest failed "
436 			       "on chunking test %d for %s: "
437 			       "ret=%d\n", j, algo, -ret);
438 			goto out;
439 		}
440 
441 		if (memcmp(result, template[i].digest,
442 			   crypto_ahash_digestsize(tfm))) {
443 			printk(KERN_ERR "alg: hash: Chunking test %d "
444 			       "failed for %s\n", j, algo);
445 			hexdump(result, crypto_ahash_digestsize(tfm));
446 			ret = -EINVAL;
447 			goto out;
448 		}
449 	}
450 
451 	/* partial update exercise */
452 	j = 0;
453 	for (i = 0; i < tcount; i++) {
454 		/* alignment tests are only done with continuous buffers */
455 		if (align_offset != 0)
456 			break;
457 
458 		if (template[i].np < 2)
459 			continue;
460 
461 		j++;
462 		memset(result, 0, digest_size);
463 
464 		ret = -EINVAL;
465 		hash_buff = xbuf[0];
466 		memcpy(hash_buff, template[i].plaintext,
467 			template[i].tap[0]);
468 		sg_init_one(&sg[0], hash_buff, template[i].tap[0]);
469 
470 		if (template[i].ksize) {
471 			crypto_ahash_clear_flags(tfm, ~0);
472 			if (template[i].ksize > MAX_KEYLEN) {
473 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
474 					j, algo, template[i].ksize, MAX_KEYLEN);
475 				ret = -EINVAL;
476 				goto out;
477 			}
478 			memcpy(key, template[i].key, template[i].ksize);
479 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
480 			if (ret) {
481 				pr_err("alg: hash: setkey failed on test %d for %s: ret=%d\n",
482 					j, algo, -ret);
483 				goto out;
484 			}
485 		}
486 
487 		ahash_request_set_crypt(req, sg, result, template[i].tap[0]);
488 		ret = wait_async_op(&tresult, crypto_ahash_init(req));
489 		if (ret) {
490 			pr_err("alt: hash: init failed on test %d for %s: ret=%d\n",
491 				j, algo, -ret);
492 			goto out;
493 		}
494 		ret = wait_async_op(&tresult, crypto_ahash_update(req));
495 		if (ret) {
496 			pr_err("alt: hash: update failed on test %d for %s: ret=%d\n",
497 				j, algo, -ret);
498 			goto out;
499 		}
500 
501 		temp = template[i].tap[0];
502 		for (k = 1; k < template[i].np; k++) {
503 			ret = ahash_partial_update(&req, tfm, &template[i],
504 				hash_buff, k, temp, &sg[0], algo, result,
505 				&tresult);
506 			if (ret) {
507 				pr_err("hash: partial update failed on test %d for %s: ret=%d\n",
508 					j, algo, -ret);
509 				goto out_noreq;
510 			}
511 			temp += template[i].tap[k];
512 		}
513 		ret = wait_async_op(&tresult, crypto_ahash_final(req));
514 		if (ret) {
515 			pr_err("alt: hash: final failed on test %d for %s: ret=%d\n",
516 				j, algo, -ret);
517 			goto out;
518 		}
519 		if (memcmp(result, template[i].digest,
520 			   crypto_ahash_digestsize(tfm))) {
521 			pr_err("alg: hash: Partial Test %d failed for %s\n",
522 			       j, algo);
523 			hexdump(result, crypto_ahash_digestsize(tfm));
524 			ret = -EINVAL;
525 			goto out;
526 		}
527 	}
528 
529 	ret = 0;
530 
531 out:
532 	ahash_request_free(req);
533 out_noreq:
534 	testmgr_free_buf(xbuf);
535 out_nobuf:
536 	kfree(key);
537 	kfree(result);
538 	return ret;
539 }
540 
541 static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
542 		     unsigned int tcount, bool use_digest)
543 {
544 	unsigned int alignmask;
545 	int ret;
546 
547 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
548 	if (ret)
549 		return ret;
550 
551 	/* test unaligned buffers, check with one byte offset */
552 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
553 	if (ret)
554 		return ret;
555 
556 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
557 	if (alignmask) {
558 		/* Check if alignment mask for tfm is correctly set. */
559 		ret = __test_hash(tfm, template, tcount, use_digest,
560 				  alignmask + 1);
561 		if (ret)
562 			return ret;
563 	}
564 
565 	return 0;
566 }
567 
568 static int __test_aead(struct crypto_aead *tfm, int enc,
569 		       struct aead_testvec *template, unsigned int tcount,
570 		       const bool diff_dst, const int align_offset)
571 {
572 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
573 	unsigned int i, j, k, n, temp;
574 	int ret = -ENOMEM;
575 	char *q;
576 	char *key;
577 	struct aead_request *req;
578 	struct scatterlist *sg;
579 	struct scatterlist *sgout;
580 	const char *e, *d;
581 	struct tcrypt_result result;
582 	unsigned int authsize, iv_len;
583 	void *input;
584 	void *output;
585 	void *assoc;
586 	char *iv;
587 	char *xbuf[XBUFSIZE];
588 	char *xoutbuf[XBUFSIZE];
589 	char *axbuf[XBUFSIZE];
590 
591 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
592 	if (!iv)
593 		return ret;
594 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
595 	if (!key)
596 		goto out_noxbuf;
597 	if (testmgr_alloc_buf(xbuf))
598 		goto out_noxbuf;
599 	if (testmgr_alloc_buf(axbuf))
600 		goto out_noaxbuf;
601 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
602 		goto out_nooutbuf;
603 
604 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
605 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
606 	if (!sg)
607 		goto out_nosg;
608 	sgout = &sg[16];
609 
610 	if (diff_dst)
611 		d = "-ddst";
612 	else
613 		d = "";
614 
615 	if (enc == ENCRYPT)
616 		e = "encryption";
617 	else
618 		e = "decryption";
619 
620 	init_completion(&result.completion);
621 
622 	req = aead_request_alloc(tfm, GFP_KERNEL);
623 	if (!req) {
624 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
625 		       d, algo);
626 		goto out;
627 	}
628 
629 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
630 				  tcrypt_complete, &result);
631 
632 	iv_len = crypto_aead_ivsize(tfm);
633 
634 	for (i = 0, j = 0; i < tcount; i++) {
635 		if (template[i].np)
636 			continue;
637 
638 		j++;
639 
640 		/* some templates have no input data but they will
641 		 * touch input
642 		 */
643 		input = xbuf[0];
644 		input += align_offset;
645 		assoc = axbuf[0];
646 
647 		ret = -EINVAL;
648 		if (WARN_ON(align_offset + template[i].ilen >
649 			    PAGE_SIZE || template[i].alen > PAGE_SIZE))
650 			goto out;
651 
652 		memcpy(input, template[i].input, template[i].ilen);
653 		memcpy(assoc, template[i].assoc, template[i].alen);
654 		if (template[i].iv)
655 			memcpy(iv, template[i].iv, iv_len);
656 		else
657 			memset(iv, 0, iv_len);
658 
659 		crypto_aead_clear_flags(tfm, ~0);
660 		if (template[i].wk)
661 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
662 
663 		if (template[i].klen > MAX_KEYLEN) {
664 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
665 			       d, j, algo, template[i].klen,
666 			       MAX_KEYLEN);
667 			ret = -EINVAL;
668 			goto out;
669 		}
670 		memcpy(key, template[i].key, template[i].klen);
671 
672 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
673 		if (template[i].fail == !ret) {
674 			pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
675 			       d, j, algo, crypto_aead_get_flags(tfm));
676 			goto out;
677 		} else if (ret)
678 			continue;
679 
680 		authsize = abs(template[i].rlen - template[i].ilen);
681 		ret = crypto_aead_setauthsize(tfm, authsize);
682 		if (ret) {
683 			pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
684 			       d, authsize, j, algo);
685 			goto out;
686 		}
687 
688 		k = !!template[i].alen;
689 		sg_init_table(sg, k + 1);
690 		sg_set_buf(&sg[0], assoc, template[i].alen);
691 		sg_set_buf(&sg[k], input,
692 			   template[i].ilen + (enc ? authsize : 0));
693 		output = input;
694 
695 		if (diff_dst) {
696 			sg_init_table(sgout, k + 1);
697 			sg_set_buf(&sgout[0], assoc, template[i].alen);
698 
699 			output = xoutbuf[0];
700 			output += align_offset;
701 			sg_set_buf(&sgout[k], output,
702 				   template[i].rlen + (enc ? 0 : authsize));
703 		}
704 
705 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
706 				       template[i].ilen, iv);
707 
708 		aead_request_set_ad(req, template[i].alen);
709 
710 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
711 
712 		switch (ret) {
713 		case 0:
714 			if (template[i].novrfy) {
715 				/* verification was supposed to fail */
716 				pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
717 				       d, e, j, algo);
718 				/* so really, we got a bad message */
719 				ret = -EBADMSG;
720 				goto out;
721 			}
722 			break;
723 		case -EINPROGRESS:
724 		case -EBUSY:
725 			wait_for_completion(&result.completion);
726 			reinit_completion(&result.completion);
727 			ret = result.err;
728 			if (!ret)
729 				break;
730 		case -EBADMSG:
731 			if (template[i].novrfy)
732 				/* verification failure was expected */
733 				continue;
734 			/* fall through */
735 		default:
736 			pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
737 			       d, e, j, algo, -ret);
738 			goto out;
739 		}
740 
741 		q = output;
742 		if (memcmp(q, template[i].result, template[i].rlen)) {
743 			pr_err("alg: aead%s: Test %d failed on %s for %s\n",
744 			       d, j, e, algo);
745 			hexdump(q, template[i].rlen);
746 			ret = -EINVAL;
747 			goto out;
748 		}
749 	}
750 
751 	for (i = 0, j = 0; i < tcount; i++) {
752 		/* alignment tests are only done with continuous buffers */
753 		if (align_offset != 0)
754 			break;
755 
756 		if (!template[i].np)
757 			continue;
758 
759 		j++;
760 
761 		if (template[i].iv)
762 			memcpy(iv, template[i].iv, iv_len);
763 		else
764 			memset(iv, 0, MAX_IVLEN);
765 
766 		crypto_aead_clear_flags(tfm, ~0);
767 		if (template[i].wk)
768 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
769 		if (template[i].klen > MAX_KEYLEN) {
770 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
771 			       d, j, algo, template[i].klen, MAX_KEYLEN);
772 			ret = -EINVAL;
773 			goto out;
774 		}
775 		memcpy(key, template[i].key, template[i].klen);
776 
777 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
778 		if (template[i].fail == !ret) {
779 			pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
780 			       d, j, algo, crypto_aead_get_flags(tfm));
781 			goto out;
782 		} else if (ret)
783 			continue;
784 
785 		authsize = abs(template[i].rlen - template[i].ilen);
786 
787 		ret = -EINVAL;
788 		sg_init_table(sg, template[i].anp + template[i].np);
789 		if (diff_dst)
790 			sg_init_table(sgout, template[i].anp + template[i].np);
791 
792 		ret = -EINVAL;
793 		for (k = 0, temp = 0; k < template[i].anp; k++) {
794 			if (WARN_ON(offset_in_page(IDX[k]) +
795 				    template[i].atap[k] > PAGE_SIZE))
796 				goto out;
797 			sg_set_buf(&sg[k],
798 				   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
799 					  offset_in_page(IDX[k]),
800 					  template[i].assoc + temp,
801 					  template[i].atap[k]),
802 				   template[i].atap[k]);
803 			if (diff_dst)
804 				sg_set_buf(&sgout[k],
805 					   axbuf[IDX[k] >> PAGE_SHIFT] +
806 					   offset_in_page(IDX[k]),
807 					   template[i].atap[k]);
808 			temp += template[i].atap[k];
809 		}
810 
811 		for (k = 0, temp = 0; k < template[i].np; k++) {
812 			if (WARN_ON(offset_in_page(IDX[k]) +
813 				    template[i].tap[k] > PAGE_SIZE))
814 				goto out;
815 
816 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
817 			memcpy(q, template[i].input + temp, template[i].tap[k]);
818 			sg_set_buf(&sg[template[i].anp + k],
819 				   q, template[i].tap[k]);
820 
821 			if (diff_dst) {
822 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
823 				    offset_in_page(IDX[k]);
824 
825 				memset(q, 0, template[i].tap[k]);
826 
827 				sg_set_buf(&sgout[template[i].anp + k],
828 					   q, template[i].tap[k]);
829 			}
830 
831 			n = template[i].tap[k];
832 			if (k == template[i].np - 1 && enc)
833 				n += authsize;
834 			if (offset_in_page(q) + n < PAGE_SIZE)
835 				q[n] = 0;
836 
837 			temp += template[i].tap[k];
838 		}
839 
840 		ret = crypto_aead_setauthsize(tfm, authsize);
841 		if (ret) {
842 			pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
843 			       d, authsize, j, algo);
844 			goto out;
845 		}
846 
847 		if (enc) {
848 			if (WARN_ON(sg[template[i].anp + k - 1].offset +
849 				    sg[template[i].anp + k - 1].length +
850 				    authsize > PAGE_SIZE)) {
851 				ret = -EINVAL;
852 				goto out;
853 			}
854 
855 			if (diff_dst)
856 				sgout[template[i].anp + k - 1].length +=
857 					authsize;
858 			sg[template[i].anp + k - 1].length += authsize;
859 		}
860 
861 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
862 				       template[i].ilen,
863 				       iv);
864 
865 		aead_request_set_ad(req, template[i].alen);
866 
867 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
868 
869 		switch (ret) {
870 		case 0:
871 			if (template[i].novrfy) {
872 				/* verification was supposed to fail */
873 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
874 				       d, e, j, algo);
875 				/* so really, we got a bad message */
876 				ret = -EBADMSG;
877 				goto out;
878 			}
879 			break;
880 		case -EINPROGRESS:
881 		case -EBUSY:
882 			wait_for_completion(&result.completion);
883 			reinit_completion(&result.completion);
884 			ret = result.err;
885 			if (!ret)
886 				break;
887 		case -EBADMSG:
888 			if (template[i].novrfy)
889 				/* verification failure was expected */
890 				continue;
891 			/* fall through */
892 		default:
893 			pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
894 			       d, e, j, algo, -ret);
895 			goto out;
896 		}
897 
898 		ret = -EINVAL;
899 		for (k = 0, temp = 0; k < template[i].np; k++) {
900 			if (diff_dst)
901 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
902 				    offset_in_page(IDX[k]);
903 			else
904 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
905 				    offset_in_page(IDX[k]);
906 
907 			n = template[i].tap[k];
908 			if (k == template[i].np - 1)
909 				n += enc ? authsize : -authsize;
910 
911 			if (memcmp(q, template[i].result + temp, n)) {
912 				pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
913 				       d, j, e, k, algo);
914 				hexdump(q, n);
915 				goto out;
916 			}
917 
918 			q += n;
919 			if (k == template[i].np - 1 && !enc) {
920 				if (!diff_dst &&
921 					memcmp(q, template[i].input +
922 					      temp + n, authsize))
923 					n = authsize;
924 				else
925 					n = 0;
926 			} else {
927 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
928 					;
929 			}
930 			if (n) {
931 				pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
932 				       d, j, e, k, algo, n);
933 				hexdump(q, n);
934 				goto out;
935 			}
936 
937 			temp += template[i].tap[k];
938 		}
939 	}
940 
941 	ret = 0;
942 
943 out:
944 	aead_request_free(req);
945 	kfree(sg);
946 out_nosg:
947 	if (diff_dst)
948 		testmgr_free_buf(xoutbuf);
949 out_nooutbuf:
950 	testmgr_free_buf(axbuf);
951 out_noaxbuf:
952 	testmgr_free_buf(xbuf);
953 out_noxbuf:
954 	kfree(key);
955 	kfree(iv);
956 	return ret;
957 }
958 
959 static int test_aead(struct crypto_aead *tfm, int enc,
960 		     struct aead_testvec *template, unsigned int tcount)
961 {
962 	unsigned int alignmask;
963 	int ret;
964 
965 	/* test 'dst == src' case */
966 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
967 	if (ret)
968 		return ret;
969 
970 	/* test 'dst != src' case */
971 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
972 	if (ret)
973 		return ret;
974 
975 	/* test unaligned buffers, check with one byte offset */
976 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
977 	if (ret)
978 		return ret;
979 
980 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
981 	if (alignmask) {
982 		/* Check if alignment mask for tfm is correctly set. */
983 		ret = __test_aead(tfm, enc, template, tcount, true,
984 				  alignmask + 1);
985 		if (ret)
986 			return ret;
987 	}
988 
989 	return 0;
990 }
991 
992 static int test_cipher(struct crypto_cipher *tfm, int enc,
993 		       struct cipher_testvec *template, unsigned int tcount)
994 {
995 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
996 	unsigned int i, j, k;
997 	char *q;
998 	const char *e;
999 	void *data;
1000 	char *xbuf[XBUFSIZE];
1001 	int ret = -ENOMEM;
1002 
1003 	if (testmgr_alloc_buf(xbuf))
1004 		goto out_nobuf;
1005 
1006 	if (enc == ENCRYPT)
1007 	        e = "encryption";
1008 	else
1009 		e = "decryption";
1010 
1011 	j = 0;
1012 	for (i = 0; i < tcount; i++) {
1013 		if (template[i].np)
1014 			continue;
1015 
1016 		if (fips_enabled && template[i].fips_skip)
1017 			continue;
1018 
1019 		j++;
1020 
1021 		ret = -EINVAL;
1022 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
1023 			goto out;
1024 
1025 		data = xbuf[0];
1026 		memcpy(data, template[i].input, template[i].ilen);
1027 
1028 		crypto_cipher_clear_flags(tfm, ~0);
1029 		if (template[i].wk)
1030 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
1031 
1032 		ret = crypto_cipher_setkey(tfm, template[i].key,
1033 					   template[i].klen);
1034 		if (template[i].fail == !ret) {
1035 			printk(KERN_ERR "alg: cipher: setkey failed "
1036 			       "on test %d for %s: flags=%x\n", j,
1037 			       algo, crypto_cipher_get_flags(tfm));
1038 			goto out;
1039 		} else if (ret)
1040 			continue;
1041 
1042 		for (k = 0; k < template[i].ilen;
1043 		     k += crypto_cipher_blocksize(tfm)) {
1044 			if (enc)
1045 				crypto_cipher_encrypt_one(tfm, data + k,
1046 							  data + k);
1047 			else
1048 				crypto_cipher_decrypt_one(tfm, data + k,
1049 							  data + k);
1050 		}
1051 
1052 		q = data;
1053 		if (memcmp(q, template[i].result, template[i].rlen)) {
1054 			printk(KERN_ERR "alg: cipher: Test %d failed "
1055 			       "on %s for %s\n", j, e, algo);
1056 			hexdump(q, template[i].rlen);
1057 			ret = -EINVAL;
1058 			goto out;
1059 		}
1060 	}
1061 
1062 	ret = 0;
1063 
1064 out:
1065 	testmgr_free_buf(xbuf);
1066 out_nobuf:
1067 	return ret;
1068 }
1069 
1070 static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
1071 			   struct cipher_testvec *template, unsigned int tcount,
1072 			   const bool diff_dst, const int align_offset)
1073 {
1074 	const char *algo =
1075 		crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
1076 	unsigned int i, j, k, n, temp;
1077 	char *q;
1078 	struct skcipher_request *req;
1079 	struct scatterlist sg[8];
1080 	struct scatterlist sgout[8];
1081 	const char *e, *d;
1082 	struct tcrypt_result result;
1083 	void *data;
1084 	char iv[MAX_IVLEN];
1085 	char *xbuf[XBUFSIZE];
1086 	char *xoutbuf[XBUFSIZE];
1087 	int ret = -ENOMEM;
1088 	unsigned int ivsize = crypto_skcipher_ivsize(tfm);
1089 
1090 	if (testmgr_alloc_buf(xbuf))
1091 		goto out_nobuf;
1092 
1093 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
1094 		goto out_nooutbuf;
1095 
1096 	if (diff_dst)
1097 		d = "-ddst";
1098 	else
1099 		d = "";
1100 
1101 	if (enc == ENCRYPT)
1102 	        e = "encryption";
1103 	else
1104 		e = "decryption";
1105 
1106 	init_completion(&result.completion);
1107 
1108 	req = skcipher_request_alloc(tfm, GFP_KERNEL);
1109 	if (!req) {
1110 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
1111 		       d, algo);
1112 		goto out;
1113 	}
1114 
1115 	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1116 				      tcrypt_complete, &result);
1117 
1118 	j = 0;
1119 	for (i = 0; i < tcount; i++) {
1120 		if (template[i].np && !template[i].also_non_np)
1121 			continue;
1122 
1123 		if (fips_enabled && template[i].fips_skip)
1124 			continue;
1125 
1126 		if (template[i].iv)
1127 			memcpy(iv, template[i].iv, ivsize);
1128 		else
1129 			memset(iv, 0, MAX_IVLEN);
1130 
1131 		j++;
1132 		ret = -EINVAL;
1133 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
1134 			goto out;
1135 
1136 		data = xbuf[0];
1137 		data += align_offset;
1138 		memcpy(data, template[i].input, template[i].ilen);
1139 
1140 		crypto_skcipher_clear_flags(tfm, ~0);
1141 		if (template[i].wk)
1142 			crypto_skcipher_set_flags(tfm,
1143 						  CRYPTO_TFM_REQ_WEAK_KEY);
1144 
1145 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1146 					     template[i].klen);
1147 		if (template[i].fail == !ret) {
1148 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
1149 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1150 			goto out;
1151 		} else if (ret)
1152 			continue;
1153 
1154 		sg_init_one(&sg[0], data, template[i].ilen);
1155 		if (diff_dst) {
1156 			data = xoutbuf[0];
1157 			data += align_offset;
1158 			sg_init_one(&sgout[0], data, template[i].ilen);
1159 		}
1160 
1161 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1162 					   template[i].ilen, iv);
1163 		ret = enc ? crypto_skcipher_encrypt(req) :
1164 			    crypto_skcipher_decrypt(req);
1165 
1166 		switch (ret) {
1167 		case 0:
1168 			break;
1169 		case -EINPROGRESS:
1170 		case -EBUSY:
1171 			wait_for_completion(&result.completion);
1172 			reinit_completion(&result.completion);
1173 			ret = result.err;
1174 			if (!ret)
1175 				break;
1176 			/* fall through */
1177 		default:
1178 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
1179 			       d, e, j, algo, -ret);
1180 			goto out;
1181 		}
1182 
1183 		q = data;
1184 		if (memcmp(q, template[i].result, template[i].rlen)) {
1185 			pr_err("alg: skcipher%s: Test %d failed (invalid result) on %s for %s\n",
1186 			       d, j, e, algo);
1187 			hexdump(q, template[i].rlen);
1188 			ret = -EINVAL;
1189 			goto out;
1190 		}
1191 
1192 		if (template[i].iv_out &&
1193 		    memcmp(iv, template[i].iv_out,
1194 			   crypto_skcipher_ivsize(tfm))) {
1195 			pr_err("alg: skcipher%s: Test %d failed (invalid output IV) on %s for %s\n",
1196 			       d, j, e, algo);
1197 			hexdump(iv, crypto_skcipher_ivsize(tfm));
1198 			ret = -EINVAL;
1199 			goto out;
1200 		}
1201 	}
1202 
1203 	j = 0;
1204 	for (i = 0; i < tcount; i++) {
1205 		/* alignment tests are only done with continuous buffers */
1206 		if (align_offset != 0)
1207 			break;
1208 
1209 		if (!template[i].np)
1210 			continue;
1211 
1212 		if (fips_enabled && template[i].fips_skip)
1213 			continue;
1214 
1215 		if (template[i].iv)
1216 			memcpy(iv, template[i].iv, ivsize);
1217 		else
1218 			memset(iv, 0, MAX_IVLEN);
1219 
1220 		j++;
1221 		crypto_skcipher_clear_flags(tfm, ~0);
1222 		if (template[i].wk)
1223 			crypto_skcipher_set_flags(tfm,
1224 						  CRYPTO_TFM_REQ_WEAK_KEY);
1225 
1226 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1227 					     template[i].klen);
1228 		if (template[i].fail == !ret) {
1229 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
1230 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1231 			goto out;
1232 		} else if (ret)
1233 			continue;
1234 
1235 		temp = 0;
1236 		ret = -EINVAL;
1237 		sg_init_table(sg, template[i].np);
1238 		if (diff_dst)
1239 			sg_init_table(sgout, template[i].np);
1240 		for (k = 0; k < template[i].np; k++) {
1241 			if (WARN_ON(offset_in_page(IDX[k]) +
1242 				    template[i].tap[k] > PAGE_SIZE))
1243 				goto out;
1244 
1245 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1246 
1247 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1248 
1249 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1250 				q[template[i].tap[k]] = 0;
1251 
1252 			sg_set_buf(&sg[k], q, template[i].tap[k]);
1253 			if (diff_dst) {
1254 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
1255 				    offset_in_page(IDX[k]);
1256 
1257 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
1258 
1259 				memset(q, 0, template[i].tap[k]);
1260 				if (offset_in_page(q) +
1261 				    template[i].tap[k] < PAGE_SIZE)
1262 					q[template[i].tap[k]] = 0;
1263 			}
1264 
1265 			temp += template[i].tap[k];
1266 		}
1267 
1268 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1269 					   template[i].ilen, iv);
1270 
1271 		ret = enc ? crypto_skcipher_encrypt(req) :
1272 			    crypto_skcipher_decrypt(req);
1273 
1274 		switch (ret) {
1275 		case 0:
1276 			break;
1277 		case -EINPROGRESS:
1278 		case -EBUSY:
1279 			wait_for_completion(&result.completion);
1280 			reinit_completion(&result.completion);
1281 			ret = result.err;
1282 			if (!ret)
1283 				break;
1284 			/* fall through */
1285 		default:
1286 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
1287 			       d, e, j, algo, -ret);
1288 			goto out;
1289 		}
1290 
1291 		temp = 0;
1292 		ret = -EINVAL;
1293 		for (k = 0; k < template[i].np; k++) {
1294 			if (diff_dst)
1295 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
1296 				    offset_in_page(IDX[k]);
1297 			else
1298 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1299 				    offset_in_page(IDX[k]);
1300 
1301 			if (memcmp(q, template[i].result + temp,
1302 				   template[i].tap[k])) {
1303 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
1304 				       d, j, e, k, algo);
1305 				hexdump(q, template[i].tap[k]);
1306 				goto out;
1307 			}
1308 
1309 			q += template[i].tap[k];
1310 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1311 				;
1312 			if (n) {
1313 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
1314 				       d, j, e, k, algo, n);
1315 				hexdump(q, n);
1316 				goto out;
1317 			}
1318 			temp += template[i].tap[k];
1319 		}
1320 	}
1321 
1322 	ret = 0;
1323 
1324 out:
1325 	skcipher_request_free(req);
1326 	if (diff_dst)
1327 		testmgr_free_buf(xoutbuf);
1328 out_nooutbuf:
1329 	testmgr_free_buf(xbuf);
1330 out_nobuf:
1331 	return ret;
1332 }
1333 
1334 static int test_skcipher(struct crypto_skcipher *tfm, int enc,
1335 			 struct cipher_testvec *template, unsigned int tcount)
1336 {
1337 	unsigned int alignmask;
1338 	int ret;
1339 
1340 	/* test 'dst == src' case */
1341 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
1342 	if (ret)
1343 		return ret;
1344 
1345 	/* test 'dst != src' case */
1346 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
1347 	if (ret)
1348 		return ret;
1349 
1350 	/* test unaligned buffers, check with one byte offset */
1351 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
1352 	if (ret)
1353 		return ret;
1354 
1355 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
1356 	if (alignmask) {
1357 		/* Check if alignment mask for tfm is correctly set. */
1358 		ret = __test_skcipher(tfm, enc, template, tcount, true,
1359 				      alignmask + 1);
1360 		if (ret)
1361 			return ret;
1362 	}
1363 
1364 	return 0;
1365 }
1366 
1367 static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1368 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1369 {
1370 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1371 	unsigned int i;
1372 	char result[COMP_BUF_SIZE];
1373 	int ret;
1374 
1375 	for (i = 0; i < ctcount; i++) {
1376 		int ilen;
1377 		unsigned int dlen = COMP_BUF_SIZE;
1378 
1379 		memset(result, 0, sizeof (result));
1380 
1381 		ilen = ctemplate[i].inlen;
1382 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1383 		                           ilen, result, &dlen);
1384 		if (ret) {
1385 			printk(KERN_ERR "alg: comp: compression failed "
1386 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1387 			       -ret);
1388 			goto out;
1389 		}
1390 
1391 		if (dlen != ctemplate[i].outlen) {
1392 			printk(KERN_ERR "alg: comp: Compression test %d "
1393 			       "failed for %s: output len = %d\n", i + 1, algo,
1394 			       dlen);
1395 			ret = -EINVAL;
1396 			goto out;
1397 		}
1398 
1399 		if (memcmp(result, ctemplate[i].output, dlen)) {
1400 			printk(KERN_ERR "alg: comp: Compression test %d "
1401 			       "failed for %s\n", i + 1, algo);
1402 			hexdump(result, dlen);
1403 			ret = -EINVAL;
1404 			goto out;
1405 		}
1406 	}
1407 
1408 	for (i = 0; i < dtcount; i++) {
1409 		int ilen;
1410 		unsigned int dlen = COMP_BUF_SIZE;
1411 
1412 		memset(result, 0, sizeof (result));
1413 
1414 		ilen = dtemplate[i].inlen;
1415 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1416 		                             ilen, result, &dlen);
1417 		if (ret) {
1418 			printk(KERN_ERR "alg: comp: decompression failed "
1419 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1420 			       -ret);
1421 			goto out;
1422 		}
1423 
1424 		if (dlen != dtemplate[i].outlen) {
1425 			printk(KERN_ERR "alg: comp: Decompression test %d "
1426 			       "failed for %s: output len = %d\n", i + 1, algo,
1427 			       dlen);
1428 			ret = -EINVAL;
1429 			goto out;
1430 		}
1431 
1432 		if (memcmp(result, dtemplate[i].output, dlen)) {
1433 			printk(KERN_ERR "alg: comp: Decompression test %d "
1434 			       "failed for %s\n", i + 1, algo);
1435 			hexdump(result, dlen);
1436 			ret = -EINVAL;
1437 			goto out;
1438 		}
1439 	}
1440 
1441 	ret = 0;
1442 
1443 out:
1444 	return ret;
1445 }
1446 
1447 static int test_acomp(struct crypto_acomp *tfm, struct comp_testvec *ctemplate,
1448 		      struct comp_testvec *dtemplate, int ctcount, int dtcount)
1449 {
1450 	const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm));
1451 	unsigned int i;
1452 	char *output;
1453 	int ret;
1454 	struct scatterlist src, dst;
1455 	struct acomp_req *req;
1456 	struct tcrypt_result result;
1457 
1458 	output = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
1459 	if (!output)
1460 		return -ENOMEM;
1461 
1462 	for (i = 0; i < ctcount; i++) {
1463 		unsigned int dlen = COMP_BUF_SIZE;
1464 		int ilen = ctemplate[i].inlen;
1465 		void *input_vec;
1466 
1467 		input_vec = kmemdup(ctemplate[i].input, ilen, GFP_KERNEL);
1468 		if (!input_vec) {
1469 			ret = -ENOMEM;
1470 			goto out;
1471 		}
1472 
1473 		memset(output, 0, dlen);
1474 		init_completion(&result.completion);
1475 		sg_init_one(&src, input_vec, ilen);
1476 		sg_init_one(&dst, output, dlen);
1477 
1478 		req = acomp_request_alloc(tfm);
1479 		if (!req) {
1480 			pr_err("alg: acomp: request alloc failed for %s\n",
1481 			       algo);
1482 			kfree(input_vec);
1483 			ret = -ENOMEM;
1484 			goto out;
1485 		}
1486 
1487 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1488 		acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1489 					   tcrypt_complete, &result);
1490 
1491 		ret = wait_async_op(&result, crypto_acomp_compress(req));
1492 		if (ret) {
1493 			pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
1494 			       i + 1, algo, -ret);
1495 			kfree(input_vec);
1496 			acomp_request_free(req);
1497 			goto out;
1498 		}
1499 
1500 		if (req->dlen != ctemplate[i].outlen) {
1501 			pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n",
1502 			       i + 1, algo, req->dlen);
1503 			ret = -EINVAL;
1504 			kfree(input_vec);
1505 			acomp_request_free(req);
1506 			goto out;
1507 		}
1508 
1509 		if (memcmp(output, ctemplate[i].output, req->dlen)) {
1510 			pr_err("alg: acomp: Compression test %d failed for %s\n",
1511 			       i + 1, algo);
1512 			hexdump(output, req->dlen);
1513 			ret = -EINVAL;
1514 			kfree(input_vec);
1515 			acomp_request_free(req);
1516 			goto out;
1517 		}
1518 
1519 		kfree(input_vec);
1520 		acomp_request_free(req);
1521 	}
1522 
1523 	for (i = 0; i < dtcount; i++) {
1524 		unsigned int dlen = COMP_BUF_SIZE;
1525 		int ilen = dtemplate[i].inlen;
1526 		void *input_vec;
1527 
1528 		input_vec = kmemdup(dtemplate[i].input, ilen, GFP_KERNEL);
1529 		if (!input_vec) {
1530 			ret = -ENOMEM;
1531 			goto out;
1532 		}
1533 
1534 		memset(output, 0, dlen);
1535 		init_completion(&result.completion);
1536 		sg_init_one(&src, input_vec, ilen);
1537 		sg_init_one(&dst, output, dlen);
1538 
1539 		req = acomp_request_alloc(tfm);
1540 		if (!req) {
1541 			pr_err("alg: acomp: request alloc failed for %s\n",
1542 			       algo);
1543 			kfree(input_vec);
1544 			ret = -ENOMEM;
1545 			goto out;
1546 		}
1547 
1548 		acomp_request_set_params(req, &src, &dst, ilen, dlen);
1549 		acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1550 					   tcrypt_complete, &result);
1551 
1552 		ret = wait_async_op(&result, crypto_acomp_decompress(req));
1553 		if (ret) {
1554 			pr_err("alg: acomp: decompression failed on test %d for %s: ret=%d\n",
1555 			       i + 1, algo, -ret);
1556 			kfree(input_vec);
1557 			acomp_request_free(req);
1558 			goto out;
1559 		}
1560 
1561 		if (req->dlen != dtemplate[i].outlen) {
1562 			pr_err("alg: acomp: Decompression test %d failed for %s: output len = %d\n",
1563 			       i + 1, algo, req->dlen);
1564 			ret = -EINVAL;
1565 			kfree(input_vec);
1566 			acomp_request_free(req);
1567 			goto out;
1568 		}
1569 
1570 		if (memcmp(output, dtemplate[i].output, req->dlen)) {
1571 			pr_err("alg: acomp: Decompression test %d failed for %s\n",
1572 			       i + 1, algo);
1573 			hexdump(output, req->dlen);
1574 			ret = -EINVAL;
1575 			kfree(input_vec);
1576 			acomp_request_free(req);
1577 			goto out;
1578 		}
1579 
1580 		kfree(input_vec);
1581 		acomp_request_free(req);
1582 	}
1583 
1584 	ret = 0;
1585 
1586 out:
1587 	kfree(output);
1588 	return ret;
1589 }
1590 
1591 static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
1592 		      unsigned int tcount)
1593 {
1594 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1595 	int err = 0, i, j, seedsize;
1596 	u8 *seed;
1597 	char result[32];
1598 
1599 	seedsize = crypto_rng_seedsize(tfm);
1600 
1601 	seed = kmalloc(seedsize, GFP_KERNEL);
1602 	if (!seed) {
1603 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
1604 		       "for %s\n", algo);
1605 		return -ENOMEM;
1606 	}
1607 
1608 	for (i = 0; i < tcount; i++) {
1609 		memset(result, 0, 32);
1610 
1611 		memcpy(seed, template[i].v, template[i].vlen);
1612 		memcpy(seed + template[i].vlen, template[i].key,
1613 		       template[i].klen);
1614 		memcpy(seed + template[i].vlen + template[i].klen,
1615 		       template[i].dt, template[i].dtlen);
1616 
1617 		err = crypto_rng_reset(tfm, seed, seedsize);
1618 		if (err) {
1619 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
1620 			       "for %s\n", algo);
1621 			goto out;
1622 		}
1623 
1624 		for (j = 0; j < template[i].loops; j++) {
1625 			err = crypto_rng_get_bytes(tfm, result,
1626 						   template[i].rlen);
1627 			if (err < 0) {
1628 				printk(KERN_ERR "alg: cprng: Failed to obtain "
1629 				       "the correct amount of random data for "
1630 				       "%s (requested %d)\n", algo,
1631 				       template[i].rlen);
1632 				goto out;
1633 			}
1634 		}
1635 
1636 		err = memcmp(result, template[i].result,
1637 			     template[i].rlen);
1638 		if (err) {
1639 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
1640 			       i, algo);
1641 			hexdump(result, template[i].rlen);
1642 			err = -EINVAL;
1643 			goto out;
1644 		}
1645 	}
1646 
1647 out:
1648 	kfree(seed);
1649 	return err;
1650 }
1651 
1652 static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1653 			 u32 type, u32 mask)
1654 {
1655 	struct crypto_aead *tfm;
1656 	int err = 0;
1657 
1658 	tfm = crypto_alloc_aead(driver, type, mask);
1659 	if (IS_ERR(tfm)) {
1660 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1661 		       "%ld\n", driver, PTR_ERR(tfm));
1662 		return PTR_ERR(tfm);
1663 	}
1664 
1665 	if (desc->suite.aead.enc.vecs) {
1666 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1667 				desc->suite.aead.enc.count);
1668 		if (err)
1669 			goto out;
1670 	}
1671 
1672 	if (!err && desc->suite.aead.dec.vecs)
1673 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1674 				desc->suite.aead.dec.count);
1675 
1676 out:
1677 	crypto_free_aead(tfm);
1678 	return err;
1679 }
1680 
1681 static int alg_test_cipher(const struct alg_test_desc *desc,
1682 			   const char *driver, u32 type, u32 mask)
1683 {
1684 	struct crypto_cipher *tfm;
1685 	int err = 0;
1686 
1687 	tfm = crypto_alloc_cipher(driver, type, mask);
1688 	if (IS_ERR(tfm)) {
1689 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1690 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1691 		return PTR_ERR(tfm);
1692 	}
1693 
1694 	if (desc->suite.cipher.enc.vecs) {
1695 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1696 				  desc->suite.cipher.enc.count);
1697 		if (err)
1698 			goto out;
1699 	}
1700 
1701 	if (desc->suite.cipher.dec.vecs)
1702 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1703 				  desc->suite.cipher.dec.count);
1704 
1705 out:
1706 	crypto_free_cipher(tfm);
1707 	return err;
1708 }
1709 
1710 static int alg_test_skcipher(const struct alg_test_desc *desc,
1711 			     const char *driver, u32 type, u32 mask)
1712 {
1713 	struct crypto_skcipher *tfm;
1714 	int err = 0;
1715 
1716 	tfm = crypto_alloc_skcipher(driver, type, mask);
1717 	if (IS_ERR(tfm)) {
1718 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
1719 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1720 		return PTR_ERR(tfm);
1721 	}
1722 
1723 	if (desc->suite.cipher.enc.vecs) {
1724 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1725 				    desc->suite.cipher.enc.count);
1726 		if (err)
1727 			goto out;
1728 	}
1729 
1730 	if (desc->suite.cipher.dec.vecs)
1731 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1732 				    desc->suite.cipher.dec.count);
1733 
1734 out:
1735 	crypto_free_skcipher(tfm);
1736 	return err;
1737 }
1738 
1739 static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1740 			 u32 type, u32 mask)
1741 {
1742 	struct crypto_comp *comp;
1743 	struct crypto_acomp *acomp;
1744 	int err;
1745 	u32 algo_type = type & CRYPTO_ALG_TYPE_ACOMPRESS_MASK;
1746 
1747 	if (algo_type == CRYPTO_ALG_TYPE_ACOMPRESS) {
1748 		acomp = crypto_alloc_acomp(driver, type, mask);
1749 		if (IS_ERR(acomp)) {
1750 			pr_err("alg: acomp: Failed to load transform for %s: %ld\n",
1751 			       driver, PTR_ERR(acomp));
1752 			return PTR_ERR(acomp);
1753 		}
1754 		err = test_acomp(acomp, desc->suite.comp.comp.vecs,
1755 				 desc->suite.comp.decomp.vecs,
1756 				 desc->suite.comp.comp.count,
1757 				 desc->suite.comp.decomp.count);
1758 		crypto_free_acomp(acomp);
1759 	} else {
1760 		comp = crypto_alloc_comp(driver, type, mask);
1761 		if (IS_ERR(comp)) {
1762 			pr_err("alg: comp: Failed to load transform for %s: %ld\n",
1763 			       driver, PTR_ERR(comp));
1764 			return PTR_ERR(comp);
1765 		}
1766 
1767 		err = test_comp(comp, desc->suite.comp.comp.vecs,
1768 				desc->suite.comp.decomp.vecs,
1769 				desc->suite.comp.comp.count,
1770 				desc->suite.comp.decomp.count);
1771 
1772 		crypto_free_comp(comp);
1773 	}
1774 	return err;
1775 }
1776 
1777 static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1778 			 u32 type, u32 mask)
1779 {
1780 	struct crypto_ahash *tfm;
1781 	int err;
1782 
1783 	tfm = crypto_alloc_ahash(driver, type, mask);
1784 	if (IS_ERR(tfm)) {
1785 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1786 		       "%ld\n", driver, PTR_ERR(tfm));
1787 		return PTR_ERR(tfm);
1788 	}
1789 
1790 	err = test_hash(tfm, desc->suite.hash.vecs,
1791 			desc->suite.hash.count, true);
1792 	if (!err)
1793 		err = test_hash(tfm, desc->suite.hash.vecs,
1794 				desc->suite.hash.count, false);
1795 
1796 	crypto_free_ahash(tfm);
1797 	return err;
1798 }
1799 
1800 static int alg_test_crc32c(const struct alg_test_desc *desc,
1801 			   const char *driver, u32 type, u32 mask)
1802 {
1803 	struct crypto_shash *tfm;
1804 	u32 val;
1805 	int err;
1806 
1807 	err = alg_test_hash(desc, driver, type, mask);
1808 	if (err)
1809 		goto out;
1810 
1811 	tfm = crypto_alloc_shash(driver, type, mask);
1812 	if (IS_ERR(tfm)) {
1813 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
1814 		       "%ld\n", driver, PTR_ERR(tfm));
1815 		err = PTR_ERR(tfm);
1816 		goto out;
1817 	}
1818 
1819 	do {
1820 		SHASH_DESC_ON_STACK(shash, tfm);
1821 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
1822 
1823 		shash->tfm = tfm;
1824 		shash->flags = 0;
1825 
1826 		*ctx = le32_to_cpu(420553207);
1827 		err = crypto_shash_final(shash, (u8 *)&val);
1828 		if (err) {
1829 			printk(KERN_ERR "alg: crc32c: Operation failed for "
1830 			       "%s: %d\n", driver, err);
1831 			break;
1832 		}
1833 
1834 		if (val != ~420553207) {
1835 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
1836 			       "%d\n", driver, val);
1837 			err = -EINVAL;
1838 		}
1839 	} while (0);
1840 
1841 	crypto_free_shash(tfm);
1842 
1843 out:
1844 	return err;
1845 }
1846 
1847 static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
1848 			  u32 type, u32 mask)
1849 {
1850 	struct crypto_rng *rng;
1851 	int err;
1852 
1853 	rng = crypto_alloc_rng(driver, type, mask);
1854 	if (IS_ERR(rng)) {
1855 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
1856 		       "%ld\n", driver, PTR_ERR(rng));
1857 		return PTR_ERR(rng);
1858 	}
1859 
1860 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
1861 
1862 	crypto_free_rng(rng);
1863 
1864 	return err;
1865 }
1866 
1867 
1868 static int drbg_cavs_test(struct drbg_testvec *test, int pr,
1869 			  const char *driver, u32 type, u32 mask)
1870 {
1871 	int ret = -EAGAIN;
1872 	struct crypto_rng *drng;
1873 	struct drbg_test_data test_data;
1874 	struct drbg_string addtl, pers, testentropy;
1875 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
1876 
1877 	if (!buf)
1878 		return -ENOMEM;
1879 
1880 	drng = crypto_alloc_rng(driver, type, mask);
1881 	if (IS_ERR(drng)) {
1882 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
1883 		       "%s\n", driver);
1884 		kzfree(buf);
1885 		return -ENOMEM;
1886 	}
1887 
1888 	test_data.testentropy = &testentropy;
1889 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
1890 	drbg_string_fill(&pers, test->pers, test->perslen);
1891 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
1892 	if (ret) {
1893 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
1894 		goto outbuf;
1895 	}
1896 
1897 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
1898 	if (pr) {
1899 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
1900 		ret = crypto_drbg_get_bytes_addtl_test(drng,
1901 			buf, test->expectedlen, &addtl,	&test_data);
1902 	} else {
1903 		ret = crypto_drbg_get_bytes_addtl(drng,
1904 			buf, test->expectedlen, &addtl);
1905 	}
1906 	if (ret < 0) {
1907 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
1908 		       "driver %s\n", driver);
1909 		goto outbuf;
1910 	}
1911 
1912 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
1913 	if (pr) {
1914 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
1915 		ret = crypto_drbg_get_bytes_addtl_test(drng,
1916 			buf, test->expectedlen, &addtl, &test_data);
1917 	} else {
1918 		ret = crypto_drbg_get_bytes_addtl(drng,
1919 			buf, test->expectedlen, &addtl);
1920 	}
1921 	if (ret < 0) {
1922 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
1923 		       "driver %s\n", driver);
1924 		goto outbuf;
1925 	}
1926 
1927 	ret = memcmp(test->expected, buf, test->expectedlen);
1928 
1929 outbuf:
1930 	crypto_free_rng(drng);
1931 	kzfree(buf);
1932 	return ret;
1933 }
1934 
1935 
1936 static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
1937 			 u32 type, u32 mask)
1938 {
1939 	int err = 0;
1940 	int pr = 0;
1941 	int i = 0;
1942 	struct drbg_testvec *template = desc->suite.drbg.vecs;
1943 	unsigned int tcount = desc->suite.drbg.count;
1944 
1945 	if (0 == memcmp(driver, "drbg_pr_", 8))
1946 		pr = 1;
1947 
1948 	for (i = 0; i < tcount; i++) {
1949 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
1950 		if (err) {
1951 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
1952 			       i, driver);
1953 			err = -EINVAL;
1954 			break;
1955 		}
1956 	}
1957 	return err;
1958 
1959 }
1960 
1961 static int do_test_kpp(struct crypto_kpp *tfm, struct kpp_testvec *vec,
1962 		       const char *alg)
1963 {
1964 	struct kpp_request *req;
1965 	void *input_buf = NULL;
1966 	void *output_buf = NULL;
1967 	struct tcrypt_result result;
1968 	unsigned int out_len_max;
1969 	int err = -ENOMEM;
1970 	struct scatterlist src, dst;
1971 
1972 	req = kpp_request_alloc(tfm, GFP_KERNEL);
1973 	if (!req)
1974 		return err;
1975 
1976 	init_completion(&result.completion);
1977 
1978 	err = crypto_kpp_set_secret(tfm, vec->secret, vec->secret_size);
1979 	if (err < 0)
1980 		goto free_req;
1981 
1982 	out_len_max = crypto_kpp_maxsize(tfm);
1983 	output_buf = kzalloc(out_len_max, GFP_KERNEL);
1984 	if (!output_buf) {
1985 		err = -ENOMEM;
1986 		goto free_req;
1987 	}
1988 
1989 	/* Use appropriate parameter as base */
1990 	kpp_request_set_input(req, NULL, 0);
1991 	sg_init_one(&dst, output_buf, out_len_max);
1992 	kpp_request_set_output(req, &dst, out_len_max);
1993 	kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1994 				 tcrypt_complete, &result);
1995 
1996 	/* Compute public key */
1997 	err = wait_async_op(&result, crypto_kpp_generate_public_key(req));
1998 	if (err) {
1999 		pr_err("alg: %s: generate public key test failed. err %d\n",
2000 		       alg, err);
2001 		goto free_output;
2002 	}
2003 	/* Verify calculated public key */
2004 	if (memcmp(vec->expected_a_public, sg_virt(req->dst),
2005 		   vec->expected_a_public_size)) {
2006 		pr_err("alg: %s: generate public key test failed. Invalid output\n",
2007 		       alg);
2008 		err = -EINVAL;
2009 		goto free_output;
2010 	}
2011 
2012 	/* Calculate shared secret key by using counter part (b) public key. */
2013 	input_buf = kzalloc(vec->b_public_size, GFP_KERNEL);
2014 	if (!input_buf) {
2015 		err = -ENOMEM;
2016 		goto free_output;
2017 	}
2018 
2019 	memcpy(input_buf, vec->b_public, vec->b_public_size);
2020 	sg_init_one(&src, input_buf, vec->b_public_size);
2021 	sg_init_one(&dst, output_buf, out_len_max);
2022 	kpp_request_set_input(req, &src, vec->b_public_size);
2023 	kpp_request_set_output(req, &dst, out_len_max);
2024 	kpp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2025 				 tcrypt_complete, &result);
2026 	err = wait_async_op(&result, crypto_kpp_compute_shared_secret(req));
2027 	if (err) {
2028 		pr_err("alg: %s: compute shard secret test failed. err %d\n",
2029 		       alg, err);
2030 		goto free_all;
2031 	}
2032 	/*
2033 	 * verify shared secret from which the user will derive
2034 	 * secret key by executing whatever hash it has chosen
2035 	 */
2036 	if (memcmp(vec->expected_ss, sg_virt(req->dst),
2037 		   vec->expected_ss_size)) {
2038 		pr_err("alg: %s: compute shared secret test failed. Invalid output\n",
2039 		       alg);
2040 		err = -EINVAL;
2041 	}
2042 
2043 free_all:
2044 	kfree(input_buf);
2045 free_output:
2046 	kfree(output_buf);
2047 free_req:
2048 	kpp_request_free(req);
2049 	return err;
2050 }
2051 
2052 static int test_kpp(struct crypto_kpp *tfm, const char *alg,
2053 		    struct kpp_testvec *vecs, unsigned int tcount)
2054 {
2055 	int ret, i;
2056 
2057 	for (i = 0; i < tcount; i++) {
2058 		ret = do_test_kpp(tfm, vecs++, alg);
2059 		if (ret) {
2060 			pr_err("alg: %s: test failed on vector %d, err=%d\n",
2061 			       alg, i + 1, ret);
2062 			return ret;
2063 		}
2064 	}
2065 	return 0;
2066 }
2067 
2068 static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver,
2069 			u32 type, u32 mask)
2070 {
2071 	struct crypto_kpp *tfm;
2072 	int err = 0;
2073 
2074 	tfm = crypto_alloc_kpp(driver, type, mask);
2075 	if (IS_ERR(tfm)) {
2076 		pr_err("alg: kpp: Failed to load tfm for %s: %ld\n",
2077 		       driver, PTR_ERR(tfm));
2078 		return PTR_ERR(tfm);
2079 	}
2080 	if (desc->suite.kpp.vecs)
2081 		err = test_kpp(tfm, desc->alg, desc->suite.kpp.vecs,
2082 			       desc->suite.kpp.count);
2083 
2084 	crypto_free_kpp(tfm);
2085 	return err;
2086 }
2087 
2088 static int test_akcipher_one(struct crypto_akcipher *tfm,
2089 			     struct akcipher_testvec *vecs)
2090 {
2091 	char *xbuf[XBUFSIZE];
2092 	struct akcipher_request *req;
2093 	void *outbuf_enc = NULL;
2094 	void *outbuf_dec = NULL;
2095 	struct tcrypt_result result;
2096 	unsigned int out_len_max, out_len = 0;
2097 	int err = -ENOMEM;
2098 	struct scatterlist src, dst, src_tab[2];
2099 
2100 	if (testmgr_alloc_buf(xbuf))
2101 		return err;
2102 
2103 	req = akcipher_request_alloc(tfm, GFP_KERNEL);
2104 	if (!req)
2105 		goto free_xbuf;
2106 
2107 	init_completion(&result.completion);
2108 
2109 	if (vecs->public_key_vec)
2110 		err = crypto_akcipher_set_pub_key(tfm, vecs->key,
2111 						  vecs->key_len);
2112 	else
2113 		err = crypto_akcipher_set_priv_key(tfm, vecs->key,
2114 						   vecs->key_len);
2115 	if (err)
2116 		goto free_req;
2117 
2118 	err = -ENOMEM;
2119 	out_len_max = crypto_akcipher_maxsize(tfm);
2120 	outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
2121 	if (!outbuf_enc)
2122 		goto free_req;
2123 
2124 	if (WARN_ON(vecs->m_size > PAGE_SIZE))
2125 		goto free_all;
2126 
2127 	memcpy(xbuf[0], vecs->m, vecs->m_size);
2128 
2129 	sg_init_table(src_tab, 2);
2130 	sg_set_buf(&src_tab[0], xbuf[0], 8);
2131 	sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8);
2132 	sg_init_one(&dst, outbuf_enc, out_len_max);
2133 	akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
2134 				   out_len_max);
2135 	akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2136 				      tcrypt_complete, &result);
2137 
2138 	/* Run RSA encrypt - c = m^e mod n;*/
2139 	err = wait_async_op(&result, crypto_akcipher_encrypt(req));
2140 	if (err) {
2141 		pr_err("alg: akcipher: encrypt test failed. err %d\n", err);
2142 		goto free_all;
2143 	}
2144 	if (req->dst_len != vecs->c_size) {
2145 		pr_err("alg: akcipher: encrypt test failed. Invalid output len\n");
2146 		err = -EINVAL;
2147 		goto free_all;
2148 	}
2149 	/* verify that encrypted message is equal to expected */
2150 	if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
2151 		pr_err("alg: akcipher: encrypt test failed. Invalid output\n");
2152 		hexdump(outbuf_enc, vecs->c_size);
2153 		err = -EINVAL;
2154 		goto free_all;
2155 	}
2156 	/* Don't invoke decrypt for vectors with public key */
2157 	if (vecs->public_key_vec) {
2158 		err = 0;
2159 		goto free_all;
2160 	}
2161 	outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
2162 	if (!outbuf_dec) {
2163 		err = -ENOMEM;
2164 		goto free_all;
2165 	}
2166 
2167 	if (WARN_ON(vecs->c_size > PAGE_SIZE))
2168 		goto free_all;
2169 
2170 	memcpy(xbuf[0], vecs->c, vecs->c_size);
2171 
2172 	sg_init_one(&src, xbuf[0], vecs->c_size);
2173 	sg_init_one(&dst, outbuf_dec, out_len_max);
2174 	init_completion(&result.completion);
2175 	akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
2176 
2177 	/* Run RSA decrypt - m = c^d mod n;*/
2178 	err = wait_async_op(&result, crypto_akcipher_decrypt(req));
2179 	if (err) {
2180 		pr_err("alg: akcipher: decrypt test failed. err %d\n", err);
2181 		goto free_all;
2182 	}
2183 	out_len = req->dst_len;
2184 	if (out_len < vecs->m_size) {
2185 		pr_err("alg: akcipher: decrypt test failed. "
2186 		       "Invalid output len %u\n", out_len);
2187 		err = -EINVAL;
2188 		goto free_all;
2189 	}
2190 	/* verify that decrypted message is equal to the original msg */
2191 	if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) ||
2192 	    memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size,
2193 		   vecs->m_size)) {
2194 		pr_err("alg: akcipher: decrypt test failed. Invalid output\n");
2195 		hexdump(outbuf_dec, out_len);
2196 		err = -EINVAL;
2197 	}
2198 free_all:
2199 	kfree(outbuf_dec);
2200 	kfree(outbuf_enc);
2201 free_req:
2202 	akcipher_request_free(req);
2203 free_xbuf:
2204 	testmgr_free_buf(xbuf);
2205 	return err;
2206 }
2207 
2208 static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
2209 			 struct akcipher_testvec *vecs, unsigned int tcount)
2210 {
2211 	const char *algo =
2212 		crypto_tfm_alg_driver_name(crypto_akcipher_tfm(tfm));
2213 	int ret, i;
2214 
2215 	for (i = 0; i < tcount; i++) {
2216 		ret = test_akcipher_one(tfm, vecs++);
2217 		if (!ret)
2218 			continue;
2219 
2220 		pr_err("alg: akcipher: test %d failed for %s, err=%d\n",
2221 		       i + 1, algo, ret);
2222 		return ret;
2223 	}
2224 	return 0;
2225 }
2226 
2227 static int alg_test_akcipher(const struct alg_test_desc *desc,
2228 			     const char *driver, u32 type, u32 mask)
2229 {
2230 	struct crypto_akcipher *tfm;
2231 	int err = 0;
2232 
2233 	tfm = crypto_alloc_akcipher(driver, type, mask);
2234 	if (IS_ERR(tfm)) {
2235 		pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
2236 		       driver, PTR_ERR(tfm));
2237 		return PTR_ERR(tfm);
2238 	}
2239 	if (desc->suite.akcipher.vecs)
2240 		err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
2241 				    desc->suite.akcipher.count);
2242 
2243 	crypto_free_akcipher(tfm);
2244 	return err;
2245 }
2246 
2247 static int alg_test_null(const struct alg_test_desc *desc,
2248 			     const char *driver, u32 type, u32 mask)
2249 {
2250 	return 0;
2251 }
2252 
2253 #define __VECS(tv)	{ .vecs = tv, .count = ARRAY_SIZE(tv) }
2254 
2255 /* Please keep this list sorted by algorithm name. */
2256 static const struct alg_test_desc alg_test_descs[] = {
2257 	{
2258 		.alg = "ansi_cprng",
2259 		.test = alg_test_cprng,
2260 		.suite = {
2261 			.cprng = __VECS(ansi_cprng_aes_tv_template)
2262 		}
2263 	}, {
2264 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
2265 		.test = alg_test_aead,
2266 		.suite = {
2267 			.aead = {
2268 				.enc = __VECS(hmac_md5_ecb_cipher_null_enc_tv_template),
2269 				.dec = __VECS(hmac_md5_ecb_cipher_null_dec_tv_template)
2270 			}
2271 		}
2272 	}, {
2273 		.alg = "authenc(hmac(sha1),cbc(aes))",
2274 		.test = alg_test_aead,
2275 		.suite = {
2276 			.aead = {
2277 				.enc = __VECS(hmac_sha1_aes_cbc_enc_tv_temp)
2278 			}
2279 		}
2280 	}, {
2281 		.alg = "authenc(hmac(sha1),cbc(des))",
2282 		.test = alg_test_aead,
2283 		.suite = {
2284 			.aead = {
2285 				.enc = __VECS(hmac_sha1_des_cbc_enc_tv_temp)
2286 			}
2287 		}
2288 	}, {
2289 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
2290 		.test = alg_test_aead,
2291 		.fips_allowed = 1,
2292 		.suite = {
2293 			.aead = {
2294 				.enc = __VECS(hmac_sha1_des3_ede_cbc_enc_tv_temp)
2295 			}
2296 		}
2297 	}, {
2298 		.alg = "authenc(hmac(sha1),ctr(aes))",
2299 		.test = alg_test_null,
2300 		.fips_allowed = 1,
2301 	}, {
2302 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
2303 		.test = alg_test_aead,
2304 		.suite = {
2305 			.aead = {
2306 				.enc = __VECS(hmac_sha1_ecb_cipher_null_enc_tv_temp),
2307 				.dec = __VECS(hmac_sha1_ecb_cipher_null_dec_tv_temp)
2308 			}
2309 		}
2310 	}, {
2311 		.alg = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
2312 		.test = alg_test_null,
2313 		.fips_allowed = 1,
2314 	}, {
2315 		.alg = "authenc(hmac(sha224),cbc(des))",
2316 		.test = alg_test_aead,
2317 		.suite = {
2318 			.aead = {
2319 				.enc = __VECS(hmac_sha224_des_cbc_enc_tv_temp)
2320 			}
2321 		}
2322 	}, {
2323 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
2324 		.test = alg_test_aead,
2325 		.fips_allowed = 1,
2326 		.suite = {
2327 			.aead = {
2328 				.enc = __VECS(hmac_sha224_des3_ede_cbc_enc_tv_temp)
2329 			}
2330 		}
2331 	}, {
2332 		.alg = "authenc(hmac(sha256),cbc(aes))",
2333 		.test = alg_test_aead,
2334 		.fips_allowed = 1,
2335 		.suite = {
2336 			.aead = {
2337 				.enc = __VECS(hmac_sha256_aes_cbc_enc_tv_temp)
2338 			}
2339 		}
2340 	}, {
2341 		.alg = "authenc(hmac(sha256),cbc(des))",
2342 		.test = alg_test_aead,
2343 		.suite = {
2344 			.aead = {
2345 				.enc = __VECS(hmac_sha256_des_cbc_enc_tv_temp)
2346 			}
2347 		}
2348 	}, {
2349 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
2350 		.test = alg_test_aead,
2351 		.fips_allowed = 1,
2352 		.suite = {
2353 			.aead = {
2354 				.enc = __VECS(hmac_sha256_des3_ede_cbc_enc_tv_temp)
2355 			}
2356 		}
2357 	}, {
2358 		.alg = "authenc(hmac(sha256),ctr(aes))",
2359 		.test = alg_test_null,
2360 		.fips_allowed = 1,
2361 	}, {
2362 		.alg = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
2363 		.test = alg_test_null,
2364 		.fips_allowed = 1,
2365 	}, {
2366 		.alg = "authenc(hmac(sha384),cbc(des))",
2367 		.test = alg_test_aead,
2368 		.suite = {
2369 			.aead = {
2370 				.enc = __VECS(hmac_sha384_des_cbc_enc_tv_temp)
2371 			}
2372 		}
2373 	}, {
2374 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
2375 		.test = alg_test_aead,
2376 		.fips_allowed = 1,
2377 		.suite = {
2378 			.aead = {
2379 				.enc = __VECS(hmac_sha384_des3_ede_cbc_enc_tv_temp)
2380 			}
2381 		}
2382 	}, {
2383 		.alg = "authenc(hmac(sha384),ctr(aes))",
2384 		.test = alg_test_null,
2385 		.fips_allowed = 1,
2386 	}, {
2387 		.alg = "authenc(hmac(sha384),rfc3686(ctr(aes)))",
2388 		.test = alg_test_null,
2389 		.fips_allowed = 1,
2390 	}, {
2391 		.alg = "authenc(hmac(sha512),cbc(aes))",
2392 		.fips_allowed = 1,
2393 		.test = alg_test_aead,
2394 		.suite = {
2395 			.aead = {
2396 				.enc = __VECS(hmac_sha512_aes_cbc_enc_tv_temp)
2397 			}
2398 		}
2399 	}, {
2400 		.alg = "authenc(hmac(sha512),cbc(des))",
2401 		.test = alg_test_aead,
2402 		.suite = {
2403 			.aead = {
2404 				.enc = __VECS(hmac_sha512_des_cbc_enc_tv_temp)
2405 			}
2406 		}
2407 	}, {
2408 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
2409 		.test = alg_test_aead,
2410 		.fips_allowed = 1,
2411 		.suite = {
2412 			.aead = {
2413 				.enc = __VECS(hmac_sha512_des3_ede_cbc_enc_tv_temp)
2414 			}
2415 		}
2416 	}, {
2417 		.alg = "authenc(hmac(sha512),ctr(aes))",
2418 		.test = alg_test_null,
2419 		.fips_allowed = 1,
2420 	}, {
2421 		.alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
2422 		.test = alg_test_null,
2423 		.fips_allowed = 1,
2424 	}, {
2425 		.alg = "cbc(aes)",
2426 		.test = alg_test_skcipher,
2427 		.fips_allowed = 1,
2428 		.suite = {
2429 			.cipher = {
2430 				.enc = __VECS(aes_cbc_enc_tv_template),
2431 				.dec = __VECS(aes_cbc_dec_tv_template)
2432 			}
2433 		}
2434 	}, {
2435 		.alg = "cbc(anubis)",
2436 		.test = alg_test_skcipher,
2437 		.suite = {
2438 			.cipher = {
2439 				.enc = __VECS(anubis_cbc_enc_tv_template),
2440 				.dec = __VECS(anubis_cbc_dec_tv_template)
2441 			}
2442 		}
2443 	}, {
2444 		.alg = "cbc(blowfish)",
2445 		.test = alg_test_skcipher,
2446 		.suite = {
2447 			.cipher = {
2448 				.enc = __VECS(bf_cbc_enc_tv_template),
2449 				.dec = __VECS(bf_cbc_dec_tv_template)
2450 			}
2451 		}
2452 	}, {
2453 		.alg = "cbc(camellia)",
2454 		.test = alg_test_skcipher,
2455 		.suite = {
2456 			.cipher = {
2457 				.enc = __VECS(camellia_cbc_enc_tv_template),
2458 				.dec = __VECS(camellia_cbc_dec_tv_template)
2459 			}
2460 		}
2461 	}, {
2462 		.alg = "cbc(cast5)",
2463 		.test = alg_test_skcipher,
2464 		.suite = {
2465 			.cipher = {
2466 				.enc = __VECS(cast5_cbc_enc_tv_template),
2467 				.dec = __VECS(cast5_cbc_dec_tv_template)
2468 			}
2469 		}
2470 	}, {
2471 		.alg = "cbc(cast6)",
2472 		.test = alg_test_skcipher,
2473 		.suite = {
2474 			.cipher = {
2475 				.enc = __VECS(cast6_cbc_enc_tv_template),
2476 				.dec = __VECS(cast6_cbc_dec_tv_template)
2477 			}
2478 		}
2479 	}, {
2480 		.alg = "cbc(des)",
2481 		.test = alg_test_skcipher,
2482 		.suite = {
2483 			.cipher = {
2484 				.enc = __VECS(des_cbc_enc_tv_template),
2485 				.dec = __VECS(des_cbc_dec_tv_template)
2486 			}
2487 		}
2488 	}, {
2489 		.alg = "cbc(des3_ede)",
2490 		.test = alg_test_skcipher,
2491 		.fips_allowed = 1,
2492 		.suite = {
2493 			.cipher = {
2494 				.enc = __VECS(des3_ede_cbc_enc_tv_template),
2495 				.dec = __VECS(des3_ede_cbc_dec_tv_template)
2496 			}
2497 		}
2498 	}, {
2499 		.alg = "cbc(serpent)",
2500 		.test = alg_test_skcipher,
2501 		.suite = {
2502 			.cipher = {
2503 				.enc = __VECS(serpent_cbc_enc_tv_template),
2504 				.dec = __VECS(serpent_cbc_dec_tv_template)
2505 			}
2506 		}
2507 	}, {
2508 		.alg = "cbc(twofish)",
2509 		.test = alg_test_skcipher,
2510 		.suite = {
2511 			.cipher = {
2512 				.enc = __VECS(tf_cbc_enc_tv_template),
2513 				.dec = __VECS(tf_cbc_dec_tv_template)
2514 			}
2515 		}
2516 	}, {
2517 		.alg = "cbcmac(aes)",
2518 		.fips_allowed = 1,
2519 		.test = alg_test_hash,
2520 		.suite = {
2521 			.hash = __VECS(aes_cbcmac_tv_template)
2522 		}
2523 	}, {
2524 		.alg = "ccm(aes)",
2525 		.test = alg_test_aead,
2526 		.fips_allowed = 1,
2527 		.suite = {
2528 			.aead = {
2529 				.enc = __VECS(aes_ccm_enc_tv_template),
2530 				.dec = __VECS(aes_ccm_dec_tv_template)
2531 			}
2532 		}
2533 	}, {
2534 		.alg = "chacha20",
2535 		.test = alg_test_skcipher,
2536 		.suite = {
2537 			.cipher = {
2538 				.enc = __VECS(chacha20_enc_tv_template),
2539 				.dec = __VECS(chacha20_enc_tv_template),
2540 			}
2541 		}
2542 	}, {
2543 		.alg = "cmac(aes)",
2544 		.fips_allowed = 1,
2545 		.test = alg_test_hash,
2546 		.suite = {
2547 			.hash = __VECS(aes_cmac128_tv_template)
2548 		}
2549 	}, {
2550 		.alg = "cmac(des3_ede)",
2551 		.fips_allowed = 1,
2552 		.test = alg_test_hash,
2553 		.suite = {
2554 			.hash = __VECS(des3_ede_cmac64_tv_template)
2555 		}
2556 	}, {
2557 		.alg = "compress_null",
2558 		.test = alg_test_null,
2559 	}, {
2560 		.alg = "crc32",
2561 		.test = alg_test_hash,
2562 		.suite = {
2563 			.hash = __VECS(crc32_tv_template)
2564 		}
2565 	}, {
2566 		.alg = "crc32c",
2567 		.test = alg_test_crc32c,
2568 		.fips_allowed = 1,
2569 		.suite = {
2570 			.hash = __VECS(crc32c_tv_template)
2571 		}
2572 	}, {
2573 		.alg = "crct10dif",
2574 		.test = alg_test_hash,
2575 		.fips_allowed = 1,
2576 		.suite = {
2577 			.hash = __VECS(crct10dif_tv_template)
2578 		}
2579 	}, {
2580 		.alg = "ctr(aes)",
2581 		.test = alg_test_skcipher,
2582 		.fips_allowed = 1,
2583 		.suite = {
2584 			.cipher = {
2585 				.enc = __VECS(aes_ctr_enc_tv_template),
2586 				.dec = __VECS(aes_ctr_dec_tv_template)
2587 			}
2588 		}
2589 	}, {
2590 		.alg = "ctr(blowfish)",
2591 		.test = alg_test_skcipher,
2592 		.suite = {
2593 			.cipher = {
2594 				.enc = __VECS(bf_ctr_enc_tv_template),
2595 				.dec = __VECS(bf_ctr_dec_tv_template)
2596 			}
2597 		}
2598 	}, {
2599 		.alg = "ctr(camellia)",
2600 		.test = alg_test_skcipher,
2601 		.suite = {
2602 			.cipher = {
2603 				.enc = __VECS(camellia_ctr_enc_tv_template),
2604 				.dec = __VECS(camellia_ctr_dec_tv_template)
2605 			}
2606 		}
2607 	}, {
2608 		.alg = "ctr(cast5)",
2609 		.test = alg_test_skcipher,
2610 		.suite = {
2611 			.cipher = {
2612 				.enc = __VECS(cast5_ctr_enc_tv_template),
2613 				.dec = __VECS(cast5_ctr_dec_tv_template)
2614 			}
2615 		}
2616 	}, {
2617 		.alg = "ctr(cast6)",
2618 		.test = alg_test_skcipher,
2619 		.suite = {
2620 			.cipher = {
2621 				.enc = __VECS(cast6_ctr_enc_tv_template),
2622 				.dec = __VECS(cast6_ctr_dec_tv_template)
2623 			}
2624 		}
2625 	}, {
2626 		.alg = "ctr(des)",
2627 		.test = alg_test_skcipher,
2628 		.suite = {
2629 			.cipher = {
2630 				.enc = __VECS(des_ctr_enc_tv_template),
2631 				.dec = __VECS(des_ctr_dec_tv_template)
2632 			}
2633 		}
2634 	}, {
2635 		.alg = "ctr(des3_ede)",
2636 		.test = alg_test_skcipher,
2637 		.suite = {
2638 			.cipher = {
2639 				.enc = __VECS(des3_ede_ctr_enc_tv_template),
2640 				.dec = __VECS(des3_ede_ctr_dec_tv_template)
2641 			}
2642 		}
2643 	}, {
2644 		.alg = "ctr(serpent)",
2645 		.test = alg_test_skcipher,
2646 		.suite = {
2647 			.cipher = {
2648 				.enc = __VECS(serpent_ctr_enc_tv_template),
2649 				.dec = __VECS(serpent_ctr_dec_tv_template)
2650 			}
2651 		}
2652 	}, {
2653 		.alg = "ctr(twofish)",
2654 		.test = alg_test_skcipher,
2655 		.suite = {
2656 			.cipher = {
2657 				.enc = __VECS(tf_ctr_enc_tv_template),
2658 				.dec = __VECS(tf_ctr_dec_tv_template)
2659 			}
2660 		}
2661 	}, {
2662 		.alg = "cts(cbc(aes))",
2663 		.test = alg_test_skcipher,
2664 		.suite = {
2665 			.cipher = {
2666 				.enc = __VECS(cts_mode_enc_tv_template),
2667 				.dec = __VECS(cts_mode_dec_tv_template)
2668 			}
2669 		}
2670 	}, {
2671 		.alg = "deflate",
2672 		.test = alg_test_comp,
2673 		.fips_allowed = 1,
2674 		.suite = {
2675 			.comp = {
2676 				.comp = __VECS(deflate_comp_tv_template),
2677 				.decomp = __VECS(deflate_decomp_tv_template)
2678 			}
2679 		}
2680 	}, {
2681 		.alg = "dh",
2682 		.test = alg_test_kpp,
2683 		.fips_allowed = 1,
2684 		.suite = {
2685 			.kpp = __VECS(dh_tv_template)
2686 		}
2687 	}, {
2688 		.alg = "digest_null",
2689 		.test = alg_test_null,
2690 	}, {
2691 		.alg = "drbg_nopr_ctr_aes128",
2692 		.test = alg_test_drbg,
2693 		.fips_allowed = 1,
2694 		.suite = {
2695 			.drbg = __VECS(drbg_nopr_ctr_aes128_tv_template)
2696 		}
2697 	}, {
2698 		.alg = "drbg_nopr_ctr_aes192",
2699 		.test = alg_test_drbg,
2700 		.fips_allowed = 1,
2701 		.suite = {
2702 			.drbg = __VECS(drbg_nopr_ctr_aes192_tv_template)
2703 		}
2704 	}, {
2705 		.alg = "drbg_nopr_ctr_aes256",
2706 		.test = alg_test_drbg,
2707 		.fips_allowed = 1,
2708 		.suite = {
2709 			.drbg = __VECS(drbg_nopr_ctr_aes256_tv_template)
2710 		}
2711 	}, {
2712 		/*
2713 		 * There is no need to specifically test the DRBG with every
2714 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
2715 		 */
2716 		.alg = "drbg_nopr_hmac_sha1",
2717 		.fips_allowed = 1,
2718 		.test = alg_test_null,
2719 	}, {
2720 		.alg = "drbg_nopr_hmac_sha256",
2721 		.test = alg_test_drbg,
2722 		.fips_allowed = 1,
2723 		.suite = {
2724 			.drbg = __VECS(drbg_nopr_hmac_sha256_tv_template)
2725 		}
2726 	}, {
2727 		/* covered by drbg_nopr_hmac_sha256 test */
2728 		.alg = "drbg_nopr_hmac_sha384",
2729 		.fips_allowed = 1,
2730 		.test = alg_test_null,
2731 	}, {
2732 		.alg = "drbg_nopr_hmac_sha512",
2733 		.test = alg_test_null,
2734 		.fips_allowed = 1,
2735 	}, {
2736 		.alg = "drbg_nopr_sha1",
2737 		.fips_allowed = 1,
2738 		.test = alg_test_null,
2739 	}, {
2740 		.alg = "drbg_nopr_sha256",
2741 		.test = alg_test_drbg,
2742 		.fips_allowed = 1,
2743 		.suite = {
2744 			.drbg = __VECS(drbg_nopr_sha256_tv_template)
2745 		}
2746 	}, {
2747 		/* covered by drbg_nopr_sha256 test */
2748 		.alg = "drbg_nopr_sha384",
2749 		.fips_allowed = 1,
2750 		.test = alg_test_null,
2751 	}, {
2752 		.alg = "drbg_nopr_sha512",
2753 		.fips_allowed = 1,
2754 		.test = alg_test_null,
2755 	}, {
2756 		.alg = "drbg_pr_ctr_aes128",
2757 		.test = alg_test_drbg,
2758 		.fips_allowed = 1,
2759 		.suite = {
2760 			.drbg = __VECS(drbg_pr_ctr_aes128_tv_template)
2761 		}
2762 	}, {
2763 		/* covered by drbg_pr_ctr_aes128 test */
2764 		.alg = "drbg_pr_ctr_aes192",
2765 		.fips_allowed = 1,
2766 		.test = alg_test_null,
2767 	}, {
2768 		.alg = "drbg_pr_ctr_aes256",
2769 		.fips_allowed = 1,
2770 		.test = alg_test_null,
2771 	}, {
2772 		.alg = "drbg_pr_hmac_sha1",
2773 		.fips_allowed = 1,
2774 		.test = alg_test_null,
2775 	}, {
2776 		.alg = "drbg_pr_hmac_sha256",
2777 		.test = alg_test_drbg,
2778 		.fips_allowed = 1,
2779 		.suite = {
2780 			.drbg = __VECS(drbg_pr_hmac_sha256_tv_template)
2781 		}
2782 	}, {
2783 		/* covered by drbg_pr_hmac_sha256 test */
2784 		.alg = "drbg_pr_hmac_sha384",
2785 		.fips_allowed = 1,
2786 		.test = alg_test_null,
2787 	}, {
2788 		.alg = "drbg_pr_hmac_sha512",
2789 		.test = alg_test_null,
2790 		.fips_allowed = 1,
2791 	}, {
2792 		.alg = "drbg_pr_sha1",
2793 		.fips_allowed = 1,
2794 		.test = alg_test_null,
2795 	}, {
2796 		.alg = "drbg_pr_sha256",
2797 		.test = alg_test_drbg,
2798 		.fips_allowed = 1,
2799 		.suite = {
2800 			.drbg = __VECS(drbg_pr_sha256_tv_template)
2801 		}
2802 	}, {
2803 		/* covered by drbg_pr_sha256 test */
2804 		.alg = "drbg_pr_sha384",
2805 		.fips_allowed = 1,
2806 		.test = alg_test_null,
2807 	}, {
2808 		.alg = "drbg_pr_sha512",
2809 		.fips_allowed = 1,
2810 		.test = alg_test_null,
2811 	}, {
2812 		.alg = "ecb(aes)",
2813 		.test = alg_test_skcipher,
2814 		.fips_allowed = 1,
2815 		.suite = {
2816 			.cipher = {
2817 				.enc = __VECS(aes_enc_tv_template),
2818 				.dec = __VECS(aes_dec_tv_template)
2819 			}
2820 		}
2821 	}, {
2822 		.alg = "ecb(anubis)",
2823 		.test = alg_test_skcipher,
2824 		.suite = {
2825 			.cipher = {
2826 				.enc = __VECS(anubis_enc_tv_template),
2827 				.dec = __VECS(anubis_dec_tv_template)
2828 			}
2829 		}
2830 	}, {
2831 		.alg = "ecb(arc4)",
2832 		.test = alg_test_skcipher,
2833 		.suite = {
2834 			.cipher = {
2835 				.enc = __VECS(arc4_enc_tv_template),
2836 				.dec = __VECS(arc4_dec_tv_template)
2837 			}
2838 		}
2839 	}, {
2840 		.alg = "ecb(blowfish)",
2841 		.test = alg_test_skcipher,
2842 		.suite = {
2843 			.cipher = {
2844 				.enc = __VECS(bf_enc_tv_template),
2845 				.dec = __VECS(bf_dec_tv_template)
2846 			}
2847 		}
2848 	}, {
2849 		.alg = "ecb(camellia)",
2850 		.test = alg_test_skcipher,
2851 		.suite = {
2852 			.cipher = {
2853 				.enc = __VECS(camellia_enc_tv_template),
2854 				.dec = __VECS(camellia_dec_tv_template)
2855 			}
2856 		}
2857 	}, {
2858 		.alg = "ecb(cast5)",
2859 		.test = alg_test_skcipher,
2860 		.suite = {
2861 			.cipher = {
2862 				.enc = __VECS(cast5_enc_tv_template),
2863 				.dec = __VECS(cast5_dec_tv_template)
2864 			}
2865 		}
2866 	}, {
2867 		.alg = "ecb(cast6)",
2868 		.test = alg_test_skcipher,
2869 		.suite = {
2870 			.cipher = {
2871 				.enc = __VECS(cast6_enc_tv_template),
2872 				.dec = __VECS(cast6_dec_tv_template)
2873 			}
2874 		}
2875 	}, {
2876 		.alg = "ecb(cipher_null)",
2877 		.test = alg_test_null,
2878 	}, {
2879 		.alg = "ecb(des)",
2880 		.test = alg_test_skcipher,
2881 		.suite = {
2882 			.cipher = {
2883 				.enc = __VECS(des_enc_tv_template),
2884 				.dec = __VECS(des_dec_tv_template)
2885 			}
2886 		}
2887 	}, {
2888 		.alg = "ecb(des3_ede)",
2889 		.test = alg_test_skcipher,
2890 		.fips_allowed = 1,
2891 		.suite = {
2892 			.cipher = {
2893 				.enc = __VECS(des3_ede_enc_tv_template),
2894 				.dec = __VECS(des3_ede_dec_tv_template)
2895 			}
2896 		}
2897 	}, {
2898 		.alg = "ecb(fcrypt)",
2899 		.test = alg_test_skcipher,
2900 		.suite = {
2901 			.cipher = {
2902 				.enc = {
2903 					.vecs = fcrypt_pcbc_enc_tv_template,
2904 					.count = 1
2905 				},
2906 				.dec = {
2907 					.vecs = fcrypt_pcbc_dec_tv_template,
2908 					.count = 1
2909 				}
2910 			}
2911 		}
2912 	}, {
2913 		.alg = "ecb(khazad)",
2914 		.test = alg_test_skcipher,
2915 		.suite = {
2916 			.cipher = {
2917 				.enc = __VECS(khazad_enc_tv_template),
2918 				.dec = __VECS(khazad_dec_tv_template)
2919 			}
2920 		}
2921 	}, {
2922 		.alg = "ecb(seed)",
2923 		.test = alg_test_skcipher,
2924 		.suite = {
2925 			.cipher = {
2926 				.enc = __VECS(seed_enc_tv_template),
2927 				.dec = __VECS(seed_dec_tv_template)
2928 			}
2929 		}
2930 	}, {
2931 		.alg = "ecb(serpent)",
2932 		.test = alg_test_skcipher,
2933 		.suite = {
2934 			.cipher = {
2935 				.enc = __VECS(serpent_enc_tv_template),
2936 				.dec = __VECS(serpent_dec_tv_template)
2937 			}
2938 		}
2939 	}, {
2940 		.alg = "ecb(tea)",
2941 		.test = alg_test_skcipher,
2942 		.suite = {
2943 			.cipher = {
2944 				.enc = __VECS(tea_enc_tv_template),
2945 				.dec = __VECS(tea_dec_tv_template)
2946 			}
2947 		}
2948 	}, {
2949 		.alg = "ecb(tnepres)",
2950 		.test = alg_test_skcipher,
2951 		.suite = {
2952 			.cipher = {
2953 				.enc = __VECS(tnepres_enc_tv_template),
2954 				.dec = __VECS(tnepres_dec_tv_template)
2955 			}
2956 		}
2957 	}, {
2958 		.alg = "ecb(twofish)",
2959 		.test = alg_test_skcipher,
2960 		.suite = {
2961 			.cipher = {
2962 				.enc = __VECS(tf_enc_tv_template),
2963 				.dec = __VECS(tf_dec_tv_template)
2964 			}
2965 		}
2966 	}, {
2967 		.alg = "ecb(xeta)",
2968 		.test = alg_test_skcipher,
2969 		.suite = {
2970 			.cipher = {
2971 				.enc = __VECS(xeta_enc_tv_template),
2972 				.dec = __VECS(xeta_dec_tv_template)
2973 			}
2974 		}
2975 	}, {
2976 		.alg = "ecb(xtea)",
2977 		.test = alg_test_skcipher,
2978 		.suite = {
2979 			.cipher = {
2980 				.enc = __VECS(xtea_enc_tv_template),
2981 				.dec = __VECS(xtea_dec_tv_template)
2982 			}
2983 		}
2984 	}, {
2985 		.alg = "ecdh",
2986 		.test = alg_test_kpp,
2987 		.fips_allowed = 1,
2988 		.suite = {
2989 			.kpp = __VECS(ecdh_tv_template)
2990 		}
2991 	}, {
2992 		.alg = "gcm(aes)",
2993 		.test = alg_test_aead,
2994 		.fips_allowed = 1,
2995 		.suite = {
2996 			.aead = {
2997 				.enc = __VECS(aes_gcm_enc_tv_template),
2998 				.dec = __VECS(aes_gcm_dec_tv_template)
2999 			}
3000 		}
3001 	}, {
3002 		.alg = "ghash",
3003 		.test = alg_test_hash,
3004 		.fips_allowed = 1,
3005 		.suite = {
3006 			.hash = __VECS(ghash_tv_template)
3007 		}
3008 	}, {
3009 		.alg = "hmac(crc32)",
3010 		.test = alg_test_hash,
3011 		.suite = {
3012 			.hash = __VECS(bfin_crc_tv_template)
3013 		}
3014 	}, {
3015 		.alg = "hmac(md5)",
3016 		.test = alg_test_hash,
3017 		.suite = {
3018 			.hash = __VECS(hmac_md5_tv_template)
3019 		}
3020 	}, {
3021 		.alg = "hmac(rmd128)",
3022 		.test = alg_test_hash,
3023 		.suite = {
3024 			.hash = __VECS(hmac_rmd128_tv_template)
3025 		}
3026 	}, {
3027 		.alg = "hmac(rmd160)",
3028 		.test = alg_test_hash,
3029 		.suite = {
3030 			.hash = __VECS(hmac_rmd160_tv_template)
3031 		}
3032 	}, {
3033 		.alg = "hmac(sha1)",
3034 		.test = alg_test_hash,
3035 		.fips_allowed = 1,
3036 		.suite = {
3037 			.hash = __VECS(hmac_sha1_tv_template)
3038 		}
3039 	}, {
3040 		.alg = "hmac(sha224)",
3041 		.test = alg_test_hash,
3042 		.fips_allowed = 1,
3043 		.suite = {
3044 			.hash = __VECS(hmac_sha224_tv_template)
3045 		}
3046 	}, {
3047 		.alg = "hmac(sha256)",
3048 		.test = alg_test_hash,
3049 		.fips_allowed = 1,
3050 		.suite = {
3051 			.hash = __VECS(hmac_sha256_tv_template)
3052 		}
3053 	}, {
3054 		.alg = "hmac(sha3-224)",
3055 		.test = alg_test_hash,
3056 		.fips_allowed = 1,
3057 		.suite = {
3058 			.hash = __VECS(hmac_sha3_224_tv_template)
3059 		}
3060 	}, {
3061 		.alg = "hmac(sha3-256)",
3062 		.test = alg_test_hash,
3063 		.fips_allowed = 1,
3064 		.suite = {
3065 			.hash = __VECS(hmac_sha3_256_tv_template)
3066 		}
3067 	}, {
3068 		.alg = "hmac(sha3-384)",
3069 		.test = alg_test_hash,
3070 		.fips_allowed = 1,
3071 		.suite = {
3072 			.hash = __VECS(hmac_sha3_384_tv_template)
3073 		}
3074 	}, {
3075 		.alg = "hmac(sha3-512)",
3076 		.test = alg_test_hash,
3077 		.fips_allowed = 1,
3078 		.suite = {
3079 			.hash = __VECS(hmac_sha3_512_tv_template)
3080 		}
3081 	}, {
3082 		.alg = "hmac(sha384)",
3083 		.test = alg_test_hash,
3084 		.fips_allowed = 1,
3085 		.suite = {
3086 			.hash = __VECS(hmac_sha384_tv_template)
3087 		}
3088 	}, {
3089 		.alg = "hmac(sha512)",
3090 		.test = alg_test_hash,
3091 		.fips_allowed = 1,
3092 		.suite = {
3093 			.hash = __VECS(hmac_sha512_tv_template)
3094 		}
3095 	}, {
3096 		.alg = "jitterentropy_rng",
3097 		.fips_allowed = 1,
3098 		.test = alg_test_null,
3099 	}, {
3100 		.alg = "kw(aes)",
3101 		.test = alg_test_skcipher,
3102 		.fips_allowed = 1,
3103 		.suite = {
3104 			.cipher = {
3105 				.enc = __VECS(aes_kw_enc_tv_template),
3106 				.dec = __VECS(aes_kw_dec_tv_template)
3107 			}
3108 		}
3109 	}, {
3110 		.alg = "lrw(aes)",
3111 		.test = alg_test_skcipher,
3112 		.suite = {
3113 			.cipher = {
3114 				.enc = __VECS(aes_lrw_enc_tv_template),
3115 				.dec = __VECS(aes_lrw_dec_tv_template)
3116 			}
3117 		}
3118 	}, {
3119 		.alg = "lrw(camellia)",
3120 		.test = alg_test_skcipher,
3121 		.suite = {
3122 			.cipher = {
3123 				.enc = __VECS(camellia_lrw_enc_tv_template),
3124 				.dec = __VECS(camellia_lrw_dec_tv_template)
3125 			}
3126 		}
3127 	}, {
3128 		.alg = "lrw(cast6)",
3129 		.test = alg_test_skcipher,
3130 		.suite = {
3131 			.cipher = {
3132 				.enc = __VECS(cast6_lrw_enc_tv_template),
3133 				.dec = __VECS(cast6_lrw_dec_tv_template)
3134 			}
3135 		}
3136 	}, {
3137 		.alg = "lrw(serpent)",
3138 		.test = alg_test_skcipher,
3139 		.suite = {
3140 			.cipher = {
3141 				.enc = __VECS(serpent_lrw_enc_tv_template),
3142 				.dec = __VECS(serpent_lrw_dec_tv_template)
3143 			}
3144 		}
3145 	}, {
3146 		.alg = "lrw(twofish)",
3147 		.test = alg_test_skcipher,
3148 		.suite = {
3149 			.cipher = {
3150 				.enc = __VECS(tf_lrw_enc_tv_template),
3151 				.dec = __VECS(tf_lrw_dec_tv_template)
3152 			}
3153 		}
3154 	}, {
3155 		.alg = "lz4",
3156 		.test = alg_test_comp,
3157 		.fips_allowed = 1,
3158 		.suite = {
3159 			.comp = {
3160 				.comp = __VECS(lz4_comp_tv_template),
3161 				.decomp = __VECS(lz4_decomp_tv_template)
3162 			}
3163 		}
3164 	}, {
3165 		.alg = "lz4hc",
3166 		.test = alg_test_comp,
3167 		.fips_allowed = 1,
3168 		.suite = {
3169 			.comp = {
3170 				.comp = __VECS(lz4hc_comp_tv_template),
3171 				.decomp = __VECS(lz4hc_decomp_tv_template)
3172 			}
3173 		}
3174 	}, {
3175 		.alg = "lzo",
3176 		.test = alg_test_comp,
3177 		.fips_allowed = 1,
3178 		.suite = {
3179 			.comp = {
3180 				.comp = __VECS(lzo_comp_tv_template),
3181 				.decomp = __VECS(lzo_decomp_tv_template)
3182 			}
3183 		}
3184 	}, {
3185 		.alg = "md4",
3186 		.test = alg_test_hash,
3187 		.suite = {
3188 			.hash = __VECS(md4_tv_template)
3189 		}
3190 	}, {
3191 		.alg = "md5",
3192 		.test = alg_test_hash,
3193 		.suite = {
3194 			.hash = __VECS(md5_tv_template)
3195 		}
3196 	}, {
3197 		.alg = "michael_mic",
3198 		.test = alg_test_hash,
3199 		.suite = {
3200 			.hash = __VECS(michael_mic_tv_template)
3201 		}
3202 	}, {
3203 		.alg = "ofb(aes)",
3204 		.test = alg_test_skcipher,
3205 		.fips_allowed = 1,
3206 		.suite = {
3207 			.cipher = {
3208 				.enc = __VECS(aes_ofb_enc_tv_template),
3209 				.dec = __VECS(aes_ofb_dec_tv_template)
3210 			}
3211 		}
3212 	}, {
3213 		.alg = "pcbc(fcrypt)",
3214 		.test = alg_test_skcipher,
3215 		.suite = {
3216 			.cipher = {
3217 				.enc = __VECS(fcrypt_pcbc_enc_tv_template),
3218 				.dec = __VECS(fcrypt_pcbc_dec_tv_template)
3219 			}
3220 		}
3221 	}, {
3222 		.alg = "poly1305",
3223 		.test = alg_test_hash,
3224 		.suite = {
3225 			.hash = __VECS(poly1305_tv_template)
3226 		}
3227 	}, {
3228 		.alg = "rfc3686(ctr(aes))",
3229 		.test = alg_test_skcipher,
3230 		.fips_allowed = 1,
3231 		.suite = {
3232 			.cipher = {
3233 				.enc = __VECS(aes_ctr_rfc3686_enc_tv_template),
3234 				.dec = __VECS(aes_ctr_rfc3686_dec_tv_template)
3235 			}
3236 		}
3237 	}, {
3238 		.alg = "rfc4106(gcm(aes))",
3239 		.test = alg_test_aead,
3240 		.fips_allowed = 1,
3241 		.suite = {
3242 			.aead = {
3243 				.enc = __VECS(aes_gcm_rfc4106_enc_tv_template),
3244 				.dec = __VECS(aes_gcm_rfc4106_dec_tv_template)
3245 			}
3246 		}
3247 	}, {
3248 		.alg = "rfc4309(ccm(aes))",
3249 		.test = alg_test_aead,
3250 		.fips_allowed = 1,
3251 		.suite = {
3252 			.aead = {
3253 				.enc = __VECS(aes_ccm_rfc4309_enc_tv_template),
3254 				.dec = __VECS(aes_ccm_rfc4309_dec_tv_template)
3255 			}
3256 		}
3257 	}, {
3258 		.alg = "rfc4543(gcm(aes))",
3259 		.test = alg_test_aead,
3260 		.suite = {
3261 			.aead = {
3262 				.enc = __VECS(aes_gcm_rfc4543_enc_tv_template),
3263 				.dec = __VECS(aes_gcm_rfc4543_dec_tv_template),
3264 			}
3265 		}
3266 	}, {
3267 		.alg = "rfc7539(chacha20,poly1305)",
3268 		.test = alg_test_aead,
3269 		.suite = {
3270 			.aead = {
3271 				.enc = __VECS(rfc7539_enc_tv_template),
3272 				.dec = __VECS(rfc7539_dec_tv_template),
3273 			}
3274 		}
3275 	}, {
3276 		.alg = "rfc7539esp(chacha20,poly1305)",
3277 		.test = alg_test_aead,
3278 		.suite = {
3279 			.aead = {
3280 				.enc = __VECS(rfc7539esp_enc_tv_template),
3281 				.dec = __VECS(rfc7539esp_dec_tv_template),
3282 			}
3283 		}
3284 	}, {
3285 		.alg = "rmd128",
3286 		.test = alg_test_hash,
3287 		.suite = {
3288 			.hash = __VECS(rmd128_tv_template)
3289 		}
3290 	}, {
3291 		.alg = "rmd160",
3292 		.test = alg_test_hash,
3293 		.suite = {
3294 			.hash = __VECS(rmd160_tv_template)
3295 		}
3296 	}, {
3297 		.alg = "rmd256",
3298 		.test = alg_test_hash,
3299 		.suite = {
3300 			.hash = __VECS(rmd256_tv_template)
3301 		}
3302 	}, {
3303 		.alg = "rmd320",
3304 		.test = alg_test_hash,
3305 		.suite = {
3306 			.hash = __VECS(rmd320_tv_template)
3307 		}
3308 	}, {
3309 		.alg = "rsa",
3310 		.test = alg_test_akcipher,
3311 		.fips_allowed = 1,
3312 		.suite = {
3313 			.akcipher = __VECS(rsa_tv_template)
3314 		}
3315 	}, {
3316 		.alg = "salsa20",
3317 		.test = alg_test_skcipher,
3318 		.suite = {
3319 			.cipher = {
3320 				.enc = __VECS(salsa20_stream_enc_tv_template)
3321 			}
3322 		}
3323 	}, {
3324 		.alg = "sha1",
3325 		.test = alg_test_hash,
3326 		.fips_allowed = 1,
3327 		.suite = {
3328 			.hash = __VECS(sha1_tv_template)
3329 		}
3330 	}, {
3331 		.alg = "sha224",
3332 		.test = alg_test_hash,
3333 		.fips_allowed = 1,
3334 		.suite = {
3335 			.hash = __VECS(sha224_tv_template)
3336 		}
3337 	}, {
3338 		.alg = "sha256",
3339 		.test = alg_test_hash,
3340 		.fips_allowed = 1,
3341 		.suite = {
3342 			.hash = __VECS(sha256_tv_template)
3343 		}
3344 	}, {
3345 		.alg = "sha3-224",
3346 		.test = alg_test_hash,
3347 		.fips_allowed = 1,
3348 		.suite = {
3349 			.hash = __VECS(sha3_224_tv_template)
3350 		}
3351 	}, {
3352 		.alg = "sha3-256",
3353 		.test = alg_test_hash,
3354 		.fips_allowed = 1,
3355 		.suite = {
3356 			.hash = __VECS(sha3_256_tv_template)
3357 		}
3358 	}, {
3359 		.alg = "sha3-384",
3360 		.test = alg_test_hash,
3361 		.fips_allowed = 1,
3362 		.suite = {
3363 			.hash = __VECS(sha3_384_tv_template)
3364 		}
3365 	}, {
3366 		.alg = "sha3-512",
3367 		.test = alg_test_hash,
3368 		.fips_allowed = 1,
3369 		.suite = {
3370 			.hash = __VECS(sha3_512_tv_template)
3371 		}
3372 	}, {
3373 		.alg = "sha384",
3374 		.test = alg_test_hash,
3375 		.fips_allowed = 1,
3376 		.suite = {
3377 			.hash = __VECS(sha384_tv_template)
3378 		}
3379 	}, {
3380 		.alg = "sha512",
3381 		.test = alg_test_hash,
3382 		.fips_allowed = 1,
3383 		.suite = {
3384 			.hash = __VECS(sha512_tv_template)
3385 		}
3386 	}, {
3387 		.alg = "tgr128",
3388 		.test = alg_test_hash,
3389 		.suite = {
3390 			.hash = __VECS(tgr128_tv_template)
3391 		}
3392 	}, {
3393 		.alg = "tgr160",
3394 		.test = alg_test_hash,
3395 		.suite = {
3396 			.hash = __VECS(tgr160_tv_template)
3397 		}
3398 	}, {
3399 		.alg = "tgr192",
3400 		.test = alg_test_hash,
3401 		.suite = {
3402 			.hash = __VECS(tgr192_tv_template)
3403 		}
3404 	}, {
3405 		.alg = "vmac(aes)",
3406 		.test = alg_test_hash,
3407 		.suite = {
3408 			.hash = __VECS(aes_vmac128_tv_template)
3409 		}
3410 	}, {
3411 		.alg = "wp256",
3412 		.test = alg_test_hash,
3413 		.suite = {
3414 			.hash = __VECS(wp256_tv_template)
3415 		}
3416 	}, {
3417 		.alg = "wp384",
3418 		.test = alg_test_hash,
3419 		.suite = {
3420 			.hash = __VECS(wp384_tv_template)
3421 		}
3422 	}, {
3423 		.alg = "wp512",
3424 		.test = alg_test_hash,
3425 		.suite = {
3426 			.hash = __VECS(wp512_tv_template)
3427 		}
3428 	}, {
3429 		.alg = "xcbc(aes)",
3430 		.test = alg_test_hash,
3431 		.suite = {
3432 			.hash = __VECS(aes_xcbc128_tv_template)
3433 		}
3434 	}, {
3435 		.alg = "xts(aes)",
3436 		.test = alg_test_skcipher,
3437 		.fips_allowed = 1,
3438 		.suite = {
3439 			.cipher = {
3440 				.enc = __VECS(aes_xts_enc_tv_template),
3441 				.dec = __VECS(aes_xts_dec_tv_template)
3442 			}
3443 		}
3444 	}, {
3445 		.alg = "xts(camellia)",
3446 		.test = alg_test_skcipher,
3447 		.suite = {
3448 			.cipher = {
3449 				.enc = __VECS(camellia_xts_enc_tv_template),
3450 				.dec = __VECS(camellia_xts_dec_tv_template)
3451 			}
3452 		}
3453 	}, {
3454 		.alg = "xts(cast6)",
3455 		.test = alg_test_skcipher,
3456 		.suite = {
3457 			.cipher = {
3458 				.enc = __VECS(cast6_xts_enc_tv_template),
3459 				.dec = __VECS(cast6_xts_dec_tv_template)
3460 			}
3461 		}
3462 	}, {
3463 		.alg = "xts(serpent)",
3464 		.test = alg_test_skcipher,
3465 		.suite = {
3466 			.cipher = {
3467 				.enc = __VECS(serpent_xts_enc_tv_template),
3468 				.dec = __VECS(serpent_xts_dec_tv_template)
3469 			}
3470 		}
3471 	}, {
3472 		.alg = "xts(twofish)",
3473 		.test = alg_test_skcipher,
3474 		.suite = {
3475 			.cipher = {
3476 				.enc = __VECS(tf_xts_enc_tv_template),
3477 				.dec = __VECS(tf_xts_dec_tv_template)
3478 			}
3479 		}
3480 	}
3481 };
3482 
3483 static bool alg_test_descs_checked;
3484 
3485 static void alg_test_descs_check_order(void)
3486 {
3487 	int i;
3488 
3489 	/* only check once */
3490 	if (alg_test_descs_checked)
3491 		return;
3492 
3493 	alg_test_descs_checked = true;
3494 
3495 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
3496 		int diff = strcmp(alg_test_descs[i - 1].alg,
3497 				  alg_test_descs[i].alg);
3498 
3499 		if (WARN_ON(diff > 0)) {
3500 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
3501 				alg_test_descs[i - 1].alg,
3502 				alg_test_descs[i].alg);
3503 		}
3504 
3505 		if (WARN_ON(diff == 0)) {
3506 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
3507 				alg_test_descs[i].alg);
3508 		}
3509 	}
3510 }
3511 
3512 static int alg_find_test(const char *alg)
3513 {
3514 	int start = 0;
3515 	int end = ARRAY_SIZE(alg_test_descs);
3516 
3517 	while (start < end) {
3518 		int i = (start + end) / 2;
3519 		int diff = strcmp(alg_test_descs[i].alg, alg);
3520 
3521 		if (diff > 0) {
3522 			end = i;
3523 			continue;
3524 		}
3525 
3526 		if (diff < 0) {
3527 			start = i + 1;
3528 			continue;
3529 		}
3530 
3531 		return i;
3532 	}
3533 
3534 	return -1;
3535 }
3536 
3537 int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
3538 {
3539 	int i;
3540 	int j;
3541 	int rc;
3542 
3543 	if (!fips_enabled && notests) {
3544 		printk_once(KERN_INFO "alg: self-tests disabled\n");
3545 		return 0;
3546 	}
3547 
3548 	alg_test_descs_check_order();
3549 
3550 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
3551 		char nalg[CRYPTO_MAX_ALG_NAME];
3552 
3553 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
3554 		    sizeof(nalg))
3555 			return -ENAMETOOLONG;
3556 
3557 		i = alg_find_test(nalg);
3558 		if (i < 0)
3559 			goto notest;
3560 
3561 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3562 			goto non_fips_alg;
3563 
3564 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3565 		goto test_done;
3566 	}
3567 
3568 	i = alg_find_test(alg);
3569 	j = alg_find_test(driver);
3570 	if (i < 0 && j < 0)
3571 		goto notest;
3572 
3573 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3574 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3575 		goto non_fips_alg;
3576 
3577 	rc = 0;
3578 	if (i >= 0)
3579 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
3580 					     type, mask);
3581 	if (j >= 0 && j != i)
3582 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3583 					     type, mask);
3584 
3585 test_done:
3586 	if (fips_enabled && rc)
3587 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3588 
3589 	if (fips_enabled && !rc)
3590 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
3591 
3592 	return rc;
3593 
3594 notest:
3595 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3596 	return 0;
3597 non_fips_alg:
3598 	return -EINVAL;
3599 }
3600 
3601 #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
3602 
3603 EXPORT_SYMBOL_GPL(alg_test);
3604