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