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