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