xref: /openbmc/linux/crypto/testmgr.c (revision 66e5bd00)
1da7f033dSHerbert Xu /*
2da7f033dSHerbert Xu  * Algorithm testing framework and tests.
3da7f033dSHerbert Xu  *
4da7f033dSHerbert Xu  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5da7f033dSHerbert Xu  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6da7f033dSHerbert Xu  * Copyright (c) 2007 Nokia Siemens Networks
7da7f033dSHerbert Xu  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8da7f033dSHerbert Xu  *
969435b94SAdrian Hoban  * Updated RFC4106 AES-GCM testing.
1069435b94SAdrian Hoban  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
1169435b94SAdrian Hoban  *             Adrian Hoban <adrian.hoban@intel.com>
1269435b94SAdrian Hoban  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
1369435b94SAdrian Hoban  *             Tadeusz Struk (tadeusz.struk@intel.com)
1469435b94SAdrian Hoban  *    Copyright (c) 2010, Intel Corporation.
1569435b94SAdrian Hoban  *
16da7f033dSHerbert Xu  * This program is free software; you can redistribute it and/or modify it
17da7f033dSHerbert Xu  * under the terms of the GNU General Public License as published by the Free
18da7f033dSHerbert Xu  * Software Foundation; either version 2 of the License, or (at your option)
19da7f033dSHerbert Xu  * any later version.
20da7f033dSHerbert Xu  *
21da7f033dSHerbert Xu  */
22da7f033dSHerbert Xu 
23da7f033dSHerbert Xu #include <crypto/hash.h>
24da7f033dSHerbert Xu #include <linux/err.h>
25da7f033dSHerbert Xu #include <linux/module.h>
26da7f033dSHerbert Xu #include <linux/scatterlist.h>
27da7f033dSHerbert Xu #include <linux/slab.h>
28da7f033dSHerbert Xu #include <linux/string.h>
297647d6ceSJarod Wilson #include <crypto/rng.h>
30da7f033dSHerbert Xu 
31da7f033dSHerbert Xu #include "internal.h"
320b767f96SAlexander Shishkin 
33326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
340b767f96SAlexander Shishkin 
350b767f96SAlexander Shishkin /* a perfect nop */
360b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
370b767f96SAlexander Shishkin {
380b767f96SAlexander Shishkin 	return 0;
390b767f96SAlexander Shishkin }
400b767f96SAlexander Shishkin 
410b767f96SAlexander Shishkin #else
420b767f96SAlexander Shishkin 
43da7f033dSHerbert Xu #include "testmgr.h"
44da7f033dSHerbert Xu 
45da7f033dSHerbert Xu /*
46da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
47da7f033dSHerbert Xu  */
48da7f033dSHerbert Xu #define XBUFSIZE	8
49da7f033dSHerbert Xu 
50da7f033dSHerbert Xu /*
51da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
52da7f033dSHerbert Xu  */
53da7f033dSHerbert Xu #define IDX1		32
54da7f033dSHerbert Xu #define IDX2		32400
55da7f033dSHerbert Xu #define IDX3		1
56da7f033dSHerbert Xu #define IDX4		8193
57da7f033dSHerbert Xu #define IDX5		22222
58da7f033dSHerbert Xu #define IDX6		17101
59da7f033dSHerbert Xu #define IDX7		27333
60da7f033dSHerbert Xu #define IDX8		3000
61da7f033dSHerbert Xu 
62da7f033dSHerbert Xu /*
63da7f033dSHerbert Xu * Used by test_cipher()
64da7f033dSHerbert Xu */
65da7f033dSHerbert Xu #define ENCRYPT 1
66da7f033dSHerbert Xu #define DECRYPT 0
67da7f033dSHerbert Xu 
68da7f033dSHerbert Xu struct tcrypt_result {
69da7f033dSHerbert Xu 	struct completion completion;
70da7f033dSHerbert Xu 	int err;
71da7f033dSHerbert Xu };
72da7f033dSHerbert Xu 
73da7f033dSHerbert Xu struct aead_test_suite {
74da7f033dSHerbert Xu 	struct {
75da7f033dSHerbert Xu 		struct aead_testvec *vecs;
76da7f033dSHerbert Xu 		unsigned int count;
77da7f033dSHerbert Xu 	} enc, dec;
78da7f033dSHerbert Xu };
79da7f033dSHerbert Xu 
80da7f033dSHerbert Xu struct cipher_test_suite {
81da7f033dSHerbert Xu 	struct {
82da7f033dSHerbert Xu 		struct cipher_testvec *vecs;
83da7f033dSHerbert Xu 		unsigned int count;
84da7f033dSHerbert Xu 	} enc, dec;
85da7f033dSHerbert Xu };
86da7f033dSHerbert Xu 
87da7f033dSHerbert Xu struct comp_test_suite {
88da7f033dSHerbert Xu 	struct {
89da7f033dSHerbert Xu 		struct comp_testvec *vecs;
90da7f033dSHerbert Xu 		unsigned int count;
91da7f033dSHerbert Xu 	} comp, decomp;
92da7f033dSHerbert Xu };
93da7f033dSHerbert Xu 
948064efb8SGeert Uytterhoeven struct pcomp_test_suite {
958064efb8SGeert Uytterhoeven 	struct {
968064efb8SGeert Uytterhoeven 		struct pcomp_testvec *vecs;
978064efb8SGeert Uytterhoeven 		unsigned int count;
988064efb8SGeert Uytterhoeven 	} comp, decomp;
998064efb8SGeert Uytterhoeven };
1008064efb8SGeert Uytterhoeven 
101da7f033dSHerbert Xu struct hash_test_suite {
102da7f033dSHerbert Xu 	struct hash_testvec *vecs;
103da7f033dSHerbert Xu 	unsigned int count;
104da7f033dSHerbert Xu };
105da7f033dSHerbert Xu 
1067647d6ceSJarod Wilson struct cprng_test_suite {
1077647d6ceSJarod Wilson 	struct cprng_testvec *vecs;
1087647d6ceSJarod Wilson 	unsigned int count;
1097647d6ceSJarod Wilson };
1107647d6ceSJarod Wilson 
111da7f033dSHerbert Xu struct alg_test_desc {
112da7f033dSHerbert Xu 	const char *alg;
113da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
114da7f033dSHerbert Xu 		    u32 type, u32 mask);
115a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
116da7f033dSHerbert Xu 
117da7f033dSHerbert Xu 	union {
118da7f033dSHerbert Xu 		struct aead_test_suite aead;
119da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
120da7f033dSHerbert Xu 		struct comp_test_suite comp;
1218064efb8SGeert Uytterhoeven 		struct pcomp_test_suite pcomp;
122da7f033dSHerbert Xu 		struct hash_test_suite hash;
1237647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
124da7f033dSHerbert Xu 	} suite;
125da7f033dSHerbert Xu };
126da7f033dSHerbert Xu 
127da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
128da7f033dSHerbert Xu 
129da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
130da7f033dSHerbert Xu {
131da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
132da7f033dSHerbert Xu 			16, 1,
133da7f033dSHerbert Xu 			buf, len, false);
134da7f033dSHerbert Xu }
135da7f033dSHerbert Xu 
136da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
137da7f033dSHerbert Xu {
138da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
139da7f033dSHerbert Xu 
140da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
141da7f033dSHerbert Xu 		return;
142da7f033dSHerbert Xu 
143da7f033dSHerbert Xu 	res->err = err;
144da7f033dSHerbert Xu 	complete(&res->completion);
145da7f033dSHerbert Xu }
146da7f033dSHerbert Xu 
147f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
148f8b0d4d0SHerbert Xu {
149f8b0d4d0SHerbert Xu 	int i;
150f8b0d4d0SHerbert Xu 
151f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
152f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
153f8b0d4d0SHerbert Xu 		if (!buf[i])
154f8b0d4d0SHerbert Xu 			goto err_free_buf;
155f8b0d4d0SHerbert Xu 	}
156f8b0d4d0SHerbert Xu 
157f8b0d4d0SHerbert Xu 	return 0;
158f8b0d4d0SHerbert Xu 
159f8b0d4d0SHerbert Xu err_free_buf:
160f8b0d4d0SHerbert Xu 	while (i-- > 0)
161f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
162f8b0d4d0SHerbert Xu 
163f8b0d4d0SHerbert Xu 	return -ENOMEM;
164f8b0d4d0SHerbert Xu }
165f8b0d4d0SHerbert Xu 
166f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
167f8b0d4d0SHerbert Xu {
168f8b0d4d0SHerbert Xu 	int i;
169f8b0d4d0SHerbert Xu 
170f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
171f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
172f8b0d4d0SHerbert Xu }
173f8b0d4d0SHerbert Xu 
174a8f1a052SDavid S. Miller static int do_one_async_hash_op(struct ahash_request *req,
175a8f1a052SDavid S. Miller 				struct tcrypt_result *tr,
176a8f1a052SDavid S. Miller 				int ret)
177a8f1a052SDavid S. Miller {
178a8f1a052SDavid S. Miller 	if (ret == -EINPROGRESS || ret == -EBUSY) {
179a8f1a052SDavid S. Miller 		ret = wait_for_completion_interruptible(&tr->completion);
180a8f1a052SDavid S. Miller 		if (!ret)
181a8f1a052SDavid S. Miller 			ret = tr->err;
182a8f1a052SDavid S. Miller 		INIT_COMPLETION(tr->completion);
183a8f1a052SDavid S. Miller 	}
184a8f1a052SDavid S. Miller 	return ret;
185a8f1a052SDavid S. Miller }
186a8f1a052SDavid S. Miller 
187da7f033dSHerbert Xu static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
188a8f1a052SDavid S. Miller 		     unsigned int tcount, bool use_digest)
189da7f033dSHerbert Xu {
190da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
191da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
192da7f033dSHerbert Xu 	struct scatterlist sg[8];
193da7f033dSHerbert Xu 	char result[64];
194da7f033dSHerbert Xu 	struct ahash_request *req;
195da7f033dSHerbert Xu 	struct tcrypt_result tresult;
196da7f033dSHerbert Xu 	void *hash_buff;
197f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
198f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
199f8b0d4d0SHerbert Xu 
200f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
201f8b0d4d0SHerbert Xu 		goto out_nobuf;
202da7f033dSHerbert Xu 
203da7f033dSHerbert Xu 	init_completion(&tresult.completion);
204da7f033dSHerbert Xu 
205da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
206da7f033dSHerbert Xu 	if (!req) {
207da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
208da7f033dSHerbert Xu 		       "%s\n", algo);
209da7f033dSHerbert Xu 		goto out_noreq;
210da7f033dSHerbert Xu 	}
211da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
212da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
213da7f033dSHerbert Xu 
214a0cfae59SHerbert Xu 	j = 0;
215da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
216a0cfae59SHerbert Xu 		if (template[i].np)
217a0cfae59SHerbert Xu 			continue;
218a0cfae59SHerbert Xu 
219a0cfae59SHerbert Xu 		j++;
220da7f033dSHerbert Xu 		memset(result, 0, 64);
221da7f033dSHerbert Xu 
222da7f033dSHerbert Xu 		hash_buff = xbuf[0];
223da7f033dSHerbert Xu 
224da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
225da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
226da7f033dSHerbert Xu 
227da7f033dSHerbert Xu 		if (template[i].ksize) {
228da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
229da7f033dSHerbert Xu 			ret = crypto_ahash_setkey(tfm, template[i].key,
230da7f033dSHerbert Xu 						  template[i].ksize);
231da7f033dSHerbert Xu 			if (ret) {
232da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
233a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
234da7f033dSHerbert Xu 				       -ret);
235da7f033dSHerbert Xu 				goto out;
236da7f033dSHerbert Xu 			}
237da7f033dSHerbert Xu 		}
238da7f033dSHerbert Xu 
239da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
240a8f1a052SDavid S. Miller 		if (use_digest) {
241a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
242a8f1a052SDavid S. Miller 						   crypto_ahash_digest(req));
243a8f1a052SDavid S. Miller 			if (ret) {
244a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
245a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
246da7f033dSHerbert Xu 				goto out;
247da7f033dSHerbert Xu 			}
248a8f1a052SDavid S. Miller 		} else {
249a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
250a8f1a052SDavid S. Miller 						   crypto_ahash_init(req));
251a8f1a052SDavid S. Miller 			if (ret) {
252a8f1a052SDavid S. Miller 				pr_err("alt: hash: init failed on test %d "
253a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
254a8f1a052SDavid S. Miller 				goto out;
255a8f1a052SDavid S. Miller 			}
256a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
257a8f1a052SDavid S. Miller 						   crypto_ahash_update(req));
258a8f1a052SDavid S. Miller 			if (ret) {
259a8f1a052SDavid S. Miller 				pr_err("alt: hash: update failed on test %d "
260a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
261a8f1a052SDavid S. Miller 				goto out;
262a8f1a052SDavid S. Miller 			}
263a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
264a8f1a052SDavid S. Miller 						   crypto_ahash_final(req));
265a8f1a052SDavid S. Miller 			if (ret) {
266a8f1a052SDavid S. Miller 				pr_err("alt: hash: final failed on test %d "
267a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
268a8f1a052SDavid S. Miller 				goto out;
269a8f1a052SDavid S. Miller 			}
270a8f1a052SDavid S. Miller 		}
271da7f033dSHerbert Xu 
272da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
273da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
274da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
275a0cfae59SHerbert Xu 			       j, algo);
276da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
277da7f033dSHerbert Xu 			ret = -EINVAL;
278da7f033dSHerbert Xu 			goto out;
279da7f033dSHerbert Xu 		}
280da7f033dSHerbert Xu 	}
281da7f033dSHerbert Xu 
282da7f033dSHerbert Xu 	j = 0;
283da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
284da7f033dSHerbert Xu 		if (template[i].np) {
285da7f033dSHerbert Xu 			j++;
286da7f033dSHerbert Xu 			memset(result, 0, 64);
287da7f033dSHerbert Xu 
288da7f033dSHerbert Xu 			temp = 0;
289da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
290fd57f22aSHerbert Xu 			ret = -EINVAL;
291da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
292fd57f22aSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
293fd57f22aSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
294fd57f22aSHerbert Xu 					goto out;
295da7f033dSHerbert Xu 				sg_set_buf(&sg[k],
296da7f033dSHerbert Xu 					   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
297da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
298da7f033dSHerbert Xu 						  template[i].plaintext + temp,
299da7f033dSHerbert Xu 						  template[i].tap[k]),
300da7f033dSHerbert Xu 					   template[i].tap[k]);
301da7f033dSHerbert Xu 				temp += template[i].tap[k];
302da7f033dSHerbert Xu 			}
303da7f033dSHerbert Xu 
304da7f033dSHerbert Xu 			if (template[i].ksize) {
305da7f033dSHerbert Xu 				crypto_ahash_clear_flags(tfm, ~0);
306da7f033dSHerbert Xu 				ret = crypto_ahash_setkey(tfm, template[i].key,
307da7f033dSHerbert Xu 							  template[i].ksize);
308da7f033dSHerbert Xu 
309da7f033dSHerbert Xu 				if (ret) {
310da7f033dSHerbert Xu 					printk(KERN_ERR "alg: hash: setkey "
311da7f033dSHerbert Xu 					       "failed on chunking test %d "
312da7f033dSHerbert Xu 					       "for %s: ret=%d\n", j, algo,
313da7f033dSHerbert Xu 					       -ret);
314da7f033dSHerbert Xu 					goto out;
315da7f033dSHerbert Xu 				}
316da7f033dSHerbert Xu 			}
317da7f033dSHerbert Xu 
318da7f033dSHerbert Xu 			ahash_request_set_crypt(req, sg, result,
319da7f033dSHerbert Xu 						template[i].psize);
320da7f033dSHerbert Xu 			ret = crypto_ahash_digest(req);
321da7f033dSHerbert Xu 			switch (ret) {
322da7f033dSHerbert Xu 			case 0:
323da7f033dSHerbert Xu 				break;
324da7f033dSHerbert Xu 			case -EINPROGRESS:
325da7f033dSHerbert Xu 			case -EBUSY:
326da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
327da7f033dSHerbert Xu 					&tresult.completion);
328da7f033dSHerbert Xu 				if (!ret && !(ret = tresult.err)) {
329da7f033dSHerbert Xu 					INIT_COMPLETION(tresult.completion);
330da7f033dSHerbert Xu 					break;
331da7f033dSHerbert Xu 				}
332da7f033dSHerbert Xu 				/* fall through */
333da7f033dSHerbert Xu 			default:
334da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: digest failed "
335da7f033dSHerbert Xu 				       "on chunking test %d for %s: "
336da7f033dSHerbert Xu 				       "ret=%d\n", j, algo, -ret);
337da7f033dSHerbert Xu 				goto out;
338da7f033dSHerbert Xu 			}
339da7f033dSHerbert Xu 
340da7f033dSHerbert Xu 			if (memcmp(result, template[i].digest,
341da7f033dSHerbert Xu 				   crypto_ahash_digestsize(tfm))) {
342da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: Chunking test %d "
343da7f033dSHerbert Xu 				       "failed for %s\n", j, algo);
344da7f033dSHerbert Xu 				hexdump(result, crypto_ahash_digestsize(tfm));
345da7f033dSHerbert Xu 				ret = -EINVAL;
346da7f033dSHerbert Xu 				goto out;
347da7f033dSHerbert Xu 			}
348da7f033dSHerbert Xu 		}
349da7f033dSHerbert Xu 	}
350da7f033dSHerbert Xu 
351da7f033dSHerbert Xu 	ret = 0;
352da7f033dSHerbert Xu 
353da7f033dSHerbert Xu out:
354da7f033dSHerbert Xu 	ahash_request_free(req);
355da7f033dSHerbert Xu out_noreq:
356f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
357f8b0d4d0SHerbert Xu out_nobuf:
358da7f033dSHerbert Xu 	return ret;
359da7f033dSHerbert Xu }
360da7f033dSHerbert Xu 
361d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
362d8a32ac2SJussi Kivilinna 		       struct aead_testvec *template, unsigned int tcount,
363d8a32ac2SJussi Kivilinna 		       const bool diff_dst)
364da7f033dSHerbert Xu {
365da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
366da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
367f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
368da7f033dSHerbert Xu 	char *q;
369da7f033dSHerbert Xu 	char *key;
370da7f033dSHerbert Xu 	struct aead_request *req;
371d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
372d8a32ac2SJussi Kivilinna 	struct scatterlist *asg;
373d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
374d8a32ac2SJussi Kivilinna 	const char *e, *d;
375da7f033dSHerbert Xu 	struct tcrypt_result result;
376da7f033dSHerbert Xu 	unsigned int authsize;
377da7f033dSHerbert Xu 	void *input;
378d8a32ac2SJussi Kivilinna 	void *output;
379da7f033dSHerbert Xu 	void *assoc;
380da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
381f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
382d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
383f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
384f8b0d4d0SHerbert Xu 
385f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
386f8b0d4d0SHerbert Xu 		goto out_noxbuf;
387f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
388f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
389da7f033dSHerbert Xu 
390d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
391d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
392d8a32ac2SJussi Kivilinna 
393d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
394d8a32ac2SJussi Kivilinna 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 3 : 2), GFP_KERNEL);
395d8a32ac2SJussi Kivilinna 	if (!sg)
396d8a32ac2SJussi Kivilinna 		goto out_nosg;
397d8a32ac2SJussi Kivilinna 	asg = &sg[8];
398d8a32ac2SJussi Kivilinna 	sgout = &asg[8];
399d8a32ac2SJussi Kivilinna 
400d8a32ac2SJussi Kivilinna 	if (diff_dst)
401d8a32ac2SJussi Kivilinna 		d = "-ddst";
402d8a32ac2SJussi Kivilinna 	else
403d8a32ac2SJussi Kivilinna 		d = "";
404d8a32ac2SJussi Kivilinna 
405da7f033dSHerbert Xu 	if (enc == ENCRYPT)
406da7f033dSHerbert Xu 		e = "encryption";
407da7f033dSHerbert Xu 	else
408da7f033dSHerbert Xu 		e = "decryption";
409da7f033dSHerbert Xu 
410da7f033dSHerbert Xu 	init_completion(&result.completion);
411da7f033dSHerbert Xu 
412da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
413da7f033dSHerbert Xu 	if (!req) {
414d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
415d8a32ac2SJussi Kivilinna 		       d, algo);
416da7f033dSHerbert Xu 		goto out;
417da7f033dSHerbert Xu 	}
418da7f033dSHerbert Xu 
419da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
420da7f033dSHerbert Xu 				  tcrypt_complete, &result);
421da7f033dSHerbert Xu 
422da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
423da7f033dSHerbert Xu 		if (!template[i].np) {
424da7f033dSHerbert Xu 			j++;
425da7f033dSHerbert Xu 
426da7f033dSHerbert Xu 			/* some tepmplates have no input data but they will
427da7f033dSHerbert Xu 			 * touch input
428da7f033dSHerbert Xu 			 */
429da7f033dSHerbert Xu 			input = xbuf[0];
430da7f033dSHerbert Xu 			assoc = axbuf[0];
431da7f033dSHerbert Xu 
432fd57f22aSHerbert Xu 			ret = -EINVAL;
433fd57f22aSHerbert Xu 			if (WARN_ON(template[i].ilen > PAGE_SIZE ||
434fd57f22aSHerbert Xu 				    template[i].alen > PAGE_SIZE))
435fd57f22aSHerbert Xu 				goto out;
436fd57f22aSHerbert Xu 
437da7f033dSHerbert Xu 			memcpy(input, template[i].input, template[i].ilen);
438da7f033dSHerbert Xu 			memcpy(assoc, template[i].assoc, template[i].alen);
439da7f033dSHerbert Xu 			if (template[i].iv)
440da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
441da7f033dSHerbert Xu 			else
442da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
443da7f033dSHerbert Xu 
444da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
445da7f033dSHerbert Xu 			if (template[i].wk)
446da7f033dSHerbert Xu 				crypto_aead_set_flags(
447da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
448da7f033dSHerbert Xu 
449da7f033dSHerbert Xu 			key = template[i].key;
450da7f033dSHerbert Xu 
451da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key,
452da7f033dSHerbert Xu 						 template[i].klen);
453da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
454d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
455d8a32ac2SJussi Kivilinna 				       d, j, algo, crypto_aead_get_flags(tfm));
456da7f033dSHerbert Xu 				goto out;
457da7f033dSHerbert Xu 			} else if (ret)
458da7f033dSHerbert Xu 				continue;
459da7f033dSHerbert Xu 
460da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
461da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
462da7f033dSHerbert Xu 			if (ret) {
463d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
464d8a32ac2SJussi Kivilinna 				       d, authsize, j, algo);
465da7f033dSHerbert Xu 				goto out;
466da7f033dSHerbert Xu 			}
467da7f033dSHerbert Xu 
468da7f033dSHerbert Xu 			sg_init_one(&sg[0], input,
469da7f033dSHerbert Xu 				    template[i].ilen + (enc ? authsize : 0));
470da7f033dSHerbert Xu 
471d8a32ac2SJussi Kivilinna 			if (diff_dst) {
472d8a32ac2SJussi Kivilinna 				output = xoutbuf[0];
473d8a32ac2SJussi Kivilinna 				sg_init_one(&sgout[0], output,
474d8a32ac2SJussi Kivilinna 					    template[i].ilen +
475d8a32ac2SJussi Kivilinna 						(enc ? authsize : 0));
476d8a32ac2SJussi Kivilinna 			} else {
477d8a32ac2SJussi Kivilinna 				output = input;
478d8a32ac2SJussi Kivilinna 			}
479d8a32ac2SJussi Kivilinna 
480da7f033dSHerbert Xu 			sg_init_one(&asg[0], assoc, template[i].alen);
481da7f033dSHerbert Xu 
482d8a32ac2SJussi Kivilinna 			aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
483da7f033dSHerbert Xu 					       template[i].ilen, iv);
484da7f033dSHerbert Xu 
485da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
486da7f033dSHerbert Xu 
487da7f033dSHerbert Xu 			ret = enc ?
488da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
489da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
490da7f033dSHerbert Xu 
491da7f033dSHerbert Xu 			switch (ret) {
492da7f033dSHerbert Xu 			case 0:
493e44a1b44SJarod Wilson 				if (template[i].novrfy) {
494e44a1b44SJarod Wilson 					/* verification was supposed to fail */
495d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
496d8a32ac2SJussi Kivilinna 					       d, e, j, algo);
497e44a1b44SJarod Wilson 					/* so really, we got a bad message */
498e44a1b44SJarod Wilson 					ret = -EBADMSG;
499e44a1b44SJarod Wilson 					goto out;
500e44a1b44SJarod Wilson 				}
501da7f033dSHerbert Xu 				break;
502da7f033dSHerbert Xu 			case -EINPROGRESS:
503da7f033dSHerbert Xu 			case -EBUSY:
504da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
505da7f033dSHerbert Xu 					&result.completion);
506da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
507da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
508da7f033dSHerbert Xu 					break;
509da7f033dSHerbert Xu 				}
510e44a1b44SJarod Wilson 			case -EBADMSG:
511e44a1b44SJarod Wilson 				if (template[i].novrfy)
512e44a1b44SJarod Wilson 					/* verification failure was expected */
513e44a1b44SJarod Wilson 					continue;
514da7f033dSHerbert Xu 				/* fall through */
515da7f033dSHerbert Xu 			default:
516d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
517d8a32ac2SJussi Kivilinna 				       d, e, j, algo, -ret);
518da7f033dSHerbert Xu 				goto out;
519da7f033dSHerbert Xu 			}
520da7f033dSHerbert Xu 
521d8a32ac2SJussi Kivilinna 			q = output;
522da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
523d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Test %d failed on %s for %s\n",
524d8a32ac2SJussi Kivilinna 				       d, j, e, algo);
525da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
526da7f033dSHerbert Xu 				ret = -EINVAL;
527da7f033dSHerbert Xu 				goto out;
528da7f033dSHerbert Xu 			}
529da7f033dSHerbert Xu 		}
530da7f033dSHerbert Xu 	}
531da7f033dSHerbert Xu 
532da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
533da7f033dSHerbert Xu 		if (template[i].np) {
534da7f033dSHerbert Xu 			j++;
535da7f033dSHerbert Xu 
536da7f033dSHerbert Xu 			if (template[i].iv)
537da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
538da7f033dSHerbert Xu 			else
539da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
540da7f033dSHerbert Xu 
541da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
542da7f033dSHerbert Xu 			if (template[i].wk)
543da7f033dSHerbert Xu 				crypto_aead_set_flags(
544da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
545da7f033dSHerbert Xu 			key = template[i].key;
546da7f033dSHerbert Xu 
547da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key, template[i].klen);
548da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
549d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
550d8a32ac2SJussi Kivilinna 				       d, j, algo, crypto_aead_get_flags(tfm));
551da7f033dSHerbert Xu 				goto out;
552da7f033dSHerbert Xu 			} else if (ret)
553da7f033dSHerbert Xu 				continue;
554da7f033dSHerbert Xu 
555da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
556da7f033dSHerbert Xu 
557da7f033dSHerbert Xu 			ret = -EINVAL;
558da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
559d8a32ac2SJussi Kivilinna 			if (diff_dst)
560d8a32ac2SJussi Kivilinna 				sg_init_table(sgout, template[i].np);
561da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
562da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
563da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
564da7f033dSHerbert Xu 					goto out;
565da7f033dSHerbert Xu 
566da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
567da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
568da7f033dSHerbert Xu 
569da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
570da7f033dSHerbert Xu 				       template[i].tap[k]);
571da7f033dSHerbert Xu 
572da7f033dSHerbert Xu 				n = template[i].tap[k];
573da7f033dSHerbert Xu 				if (k == template[i].np - 1 && enc)
574da7f033dSHerbert Xu 					n += authsize;
575da7f033dSHerbert Xu 				if (offset_in_page(q) + n < PAGE_SIZE)
576da7f033dSHerbert Xu 					q[n] = 0;
577da7f033dSHerbert Xu 
578da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
579d8a32ac2SJussi Kivilinna 
580d8a32ac2SJussi Kivilinna 				if (diff_dst) {
581d8a32ac2SJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
582d8a32ac2SJussi Kivilinna 					    offset_in_page(IDX[k]);
583d8a32ac2SJussi Kivilinna 
584d8a32ac2SJussi Kivilinna 					memset(q, 0, template[i].tap[k]);
585d8a32ac2SJussi Kivilinna 					if (offset_in_page(q) + n < PAGE_SIZE)
586d8a32ac2SJussi Kivilinna 						q[n] = 0;
587d8a32ac2SJussi Kivilinna 
588d8a32ac2SJussi Kivilinna 					sg_set_buf(&sgout[k], q,
589d8a32ac2SJussi Kivilinna 						   template[i].tap[k]);
590d8a32ac2SJussi Kivilinna 				}
591d8a32ac2SJussi Kivilinna 
592da7f033dSHerbert Xu 				temp += template[i].tap[k];
593da7f033dSHerbert Xu 			}
594da7f033dSHerbert Xu 
595da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
596da7f033dSHerbert Xu 			if (ret) {
597d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
598d8a32ac2SJussi Kivilinna 				       d, authsize, j, algo);
599da7f033dSHerbert Xu 				goto out;
600da7f033dSHerbert Xu 			}
601da7f033dSHerbert Xu 
602da7f033dSHerbert Xu 			if (enc) {
603da7f033dSHerbert Xu 				if (WARN_ON(sg[k - 1].offset +
604da7f033dSHerbert Xu 					    sg[k - 1].length + authsize >
605da7f033dSHerbert Xu 					    PAGE_SIZE)) {
606da7f033dSHerbert Xu 					ret = -EINVAL;
607da7f033dSHerbert Xu 					goto out;
608da7f033dSHerbert Xu 				}
609da7f033dSHerbert Xu 
610da7f033dSHerbert Xu 				sg[k - 1].length += authsize;
611d8a32ac2SJussi Kivilinna 
612d8a32ac2SJussi Kivilinna 				if (diff_dst)
613d8a32ac2SJussi Kivilinna 					sgout[k - 1].length += authsize;
614da7f033dSHerbert Xu 			}
615da7f033dSHerbert Xu 
616da7f033dSHerbert Xu 			sg_init_table(asg, template[i].anp);
617fd57f22aSHerbert Xu 			ret = -EINVAL;
618da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].anp; k++) {
619fd57f22aSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
620fd57f22aSHerbert Xu 					    template[i].atap[k] > PAGE_SIZE))
621fd57f22aSHerbert Xu 					goto out;
622da7f033dSHerbert Xu 				sg_set_buf(&asg[k],
623da7f033dSHerbert Xu 					   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
624da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
625da7f033dSHerbert Xu 						  template[i].assoc + temp,
626da7f033dSHerbert Xu 						  template[i].atap[k]),
627da7f033dSHerbert Xu 					   template[i].atap[k]);
628da7f033dSHerbert Xu 				temp += template[i].atap[k];
629da7f033dSHerbert Xu 			}
630da7f033dSHerbert Xu 
631d8a32ac2SJussi Kivilinna 			aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
632da7f033dSHerbert Xu 					       template[i].ilen,
633da7f033dSHerbert Xu 					       iv);
634da7f033dSHerbert Xu 
635da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
636da7f033dSHerbert Xu 
637da7f033dSHerbert Xu 			ret = enc ?
638da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
639da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
640da7f033dSHerbert Xu 
641da7f033dSHerbert Xu 			switch (ret) {
642da7f033dSHerbert Xu 			case 0:
643e44a1b44SJarod Wilson 				if (template[i].novrfy) {
644e44a1b44SJarod Wilson 					/* verification was supposed to fail */
645d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
646d8a32ac2SJussi Kivilinna 					       d, e, j, algo);
647e44a1b44SJarod Wilson 					/* so really, we got a bad message */
648e44a1b44SJarod Wilson 					ret = -EBADMSG;
649e44a1b44SJarod Wilson 					goto out;
650e44a1b44SJarod Wilson 				}
651da7f033dSHerbert Xu 				break;
652da7f033dSHerbert Xu 			case -EINPROGRESS:
653da7f033dSHerbert Xu 			case -EBUSY:
654da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
655da7f033dSHerbert Xu 					&result.completion);
656da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
657da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
658da7f033dSHerbert Xu 					break;
659da7f033dSHerbert Xu 				}
660e44a1b44SJarod Wilson 			case -EBADMSG:
661e44a1b44SJarod Wilson 				if (template[i].novrfy)
662e44a1b44SJarod Wilson 					/* verification failure was expected */
663e44a1b44SJarod Wilson 					continue;
664da7f033dSHerbert Xu 				/* fall through */
665da7f033dSHerbert Xu 			default:
666d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
667d8a32ac2SJussi Kivilinna 				       d, e, j, algo, -ret);
668da7f033dSHerbert Xu 				goto out;
669da7f033dSHerbert Xu 			}
670da7f033dSHerbert Xu 
671da7f033dSHerbert Xu 			ret = -EINVAL;
672da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
673d8a32ac2SJussi Kivilinna 				if (diff_dst)
674d8a32ac2SJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
675d8a32ac2SJussi Kivilinna 					    offset_in_page(IDX[k]);
676d8a32ac2SJussi Kivilinna 				else
677da7f033dSHerbert Xu 					q = xbuf[IDX[k] >> PAGE_SHIFT] +
678da7f033dSHerbert Xu 					    offset_in_page(IDX[k]);
679da7f033dSHerbert Xu 
680da7f033dSHerbert Xu 				n = template[i].tap[k];
681da7f033dSHerbert Xu 				if (k == template[i].np - 1)
682da7f033dSHerbert Xu 					n += enc ? authsize : -authsize;
683da7f033dSHerbert Xu 
684da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp, n)) {
685d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
686d8a32ac2SJussi Kivilinna 					       d, j, e, k, algo);
687da7f033dSHerbert Xu 					hexdump(q, n);
688da7f033dSHerbert Xu 					goto out;
689da7f033dSHerbert Xu 				}
690da7f033dSHerbert Xu 
691da7f033dSHerbert Xu 				q += n;
692da7f033dSHerbert Xu 				if (k == template[i].np - 1 && !enc) {
693d8a32ac2SJussi Kivilinna 					if (!diff_dst &&
694d8a32ac2SJussi Kivilinna 						memcmp(q, template[i].input +
695da7f033dSHerbert Xu 						      temp + n, authsize))
696da7f033dSHerbert Xu 						n = authsize;
697da7f033dSHerbert Xu 					else
698da7f033dSHerbert Xu 						n = 0;
699da7f033dSHerbert Xu 				} else {
700da7f033dSHerbert Xu 					for (n = 0; offset_in_page(q + n) &&
701da7f033dSHerbert Xu 						    q[n]; n++)
702da7f033dSHerbert Xu 						;
703da7f033dSHerbert Xu 				}
704da7f033dSHerbert Xu 				if (n) {
705d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
706d8a32ac2SJussi Kivilinna 					       d, j, e, k, algo, n);
707da7f033dSHerbert Xu 					hexdump(q, n);
708da7f033dSHerbert Xu 					goto out;
709da7f033dSHerbert Xu 				}
710da7f033dSHerbert Xu 
711da7f033dSHerbert Xu 				temp += template[i].tap[k];
712da7f033dSHerbert Xu 			}
713da7f033dSHerbert Xu 		}
714da7f033dSHerbert Xu 	}
715da7f033dSHerbert Xu 
716da7f033dSHerbert Xu 	ret = 0;
717da7f033dSHerbert Xu 
718da7f033dSHerbert Xu out:
719da7f033dSHerbert Xu 	aead_request_free(req);
720d8a32ac2SJussi Kivilinna 	kfree(sg);
721d8a32ac2SJussi Kivilinna out_nosg:
722d8a32ac2SJussi Kivilinna 	if (diff_dst)
723d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
724d8a32ac2SJussi Kivilinna out_nooutbuf:
725f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
726f8b0d4d0SHerbert Xu out_noaxbuf:
727f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
728f8b0d4d0SHerbert Xu out_noxbuf:
729da7f033dSHerbert Xu 	return ret;
730da7f033dSHerbert Xu }
731da7f033dSHerbert Xu 
732d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
733d8a32ac2SJussi Kivilinna 		     struct aead_testvec *template, unsigned int tcount)
734d8a32ac2SJussi Kivilinna {
735d8a32ac2SJussi Kivilinna 	int ret;
736d8a32ac2SJussi Kivilinna 
737d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
738d8a32ac2SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false);
739d8a32ac2SJussi Kivilinna 	if (ret)
740d8a32ac2SJussi Kivilinna 		return ret;
741d8a32ac2SJussi Kivilinna 
742d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
743d8a32ac2SJussi Kivilinna 	return __test_aead(tfm, enc, template, tcount, true);
744d8a32ac2SJussi Kivilinna }
745d8a32ac2SJussi Kivilinna 
7461aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
7471aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
7481aa4ecd9SHerbert Xu {
7491aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
7501aa4ecd9SHerbert Xu 	unsigned int i, j, k;
7511aa4ecd9SHerbert Xu 	char *q;
7521aa4ecd9SHerbert Xu 	const char *e;
7531aa4ecd9SHerbert Xu 	void *data;
754f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
755f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
756f8b0d4d0SHerbert Xu 
757f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
758f8b0d4d0SHerbert Xu 		goto out_nobuf;
7591aa4ecd9SHerbert Xu 
7601aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
7611aa4ecd9SHerbert Xu 	        e = "encryption";
7621aa4ecd9SHerbert Xu 	else
7631aa4ecd9SHerbert Xu 		e = "decryption";
7641aa4ecd9SHerbert Xu 
7651aa4ecd9SHerbert Xu 	j = 0;
7661aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
7671aa4ecd9SHerbert Xu 		if (template[i].np)
7681aa4ecd9SHerbert Xu 			continue;
7691aa4ecd9SHerbert Xu 
7701aa4ecd9SHerbert Xu 		j++;
7711aa4ecd9SHerbert Xu 
772fd57f22aSHerbert Xu 		ret = -EINVAL;
773fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
774fd57f22aSHerbert Xu 			goto out;
775fd57f22aSHerbert Xu 
7761aa4ecd9SHerbert Xu 		data = xbuf[0];
7771aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
7781aa4ecd9SHerbert Xu 
7791aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
7801aa4ecd9SHerbert Xu 		if (template[i].wk)
7811aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
7821aa4ecd9SHerbert Xu 
7831aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
7841aa4ecd9SHerbert Xu 					   template[i].klen);
7851aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
7861aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
7871aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
7881aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
7891aa4ecd9SHerbert Xu 			goto out;
7901aa4ecd9SHerbert Xu 		} else if (ret)
7911aa4ecd9SHerbert Xu 			continue;
7921aa4ecd9SHerbert Xu 
7931aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
7941aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
7951aa4ecd9SHerbert Xu 			if (enc)
7961aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
7971aa4ecd9SHerbert Xu 							  data + k);
7981aa4ecd9SHerbert Xu 			else
7991aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
8001aa4ecd9SHerbert Xu 							  data + k);
8011aa4ecd9SHerbert Xu 		}
8021aa4ecd9SHerbert Xu 
8031aa4ecd9SHerbert Xu 		q = data;
8041aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
8051aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
8061aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
8071aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
8081aa4ecd9SHerbert Xu 			ret = -EINVAL;
8091aa4ecd9SHerbert Xu 			goto out;
8101aa4ecd9SHerbert Xu 		}
8111aa4ecd9SHerbert Xu 	}
8121aa4ecd9SHerbert Xu 
8131aa4ecd9SHerbert Xu 	ret = 0;
8141aa4ecd9SHerbert Xu 
8151aa4ecd9SHerbert Xu out:
816f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
817f8b0d4d0SHerbert Xu out_nobuf:
8181aa4ecd9SHerbert Xu 	return ret;
8191aa4ecd9SHerbert Xu }
8201aa4ecd9SHerbert Xu 
82108d6af8cSJussi Kivilinna static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc,
82208d6af8cSJussi Kivilinna 			   struct cipher_testvec *template, unsigned int tcount,
82308d6af8cSJussi Kivilinna 			   const bool diff_dst)
824da7f033dSHerbert Xu {
825da7f033dSHerbert Xu 	const char *algo =
826da7f033dSHerbert Xu 		crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
827da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
828da7f033dSHerbert Xu 	char *q;
829da7f033dSHerbert Xu 	struct ablkcipher_request *req;
830da7f033dSHerbert Xu 	struct scatterlist sg[8];
83108d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
83208d6af8cSJussi Kivilinna 	const char *e, *d;
833da7f033dSHerbert Xu 	struct tcrypt_result result;
834da7f033dSHerbert Xu 	void *data;
835da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
836f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
83708d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
838f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
839f8b0d4d0SHerbert Xu 
840f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
841f8b0d4d0SHerbert Xu 		goto out_nobuf;
842da7f033dSHerbert Xu 
84308d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
84408d6af8cSJussi Kivilinna 		goto out_nooutbuf;
84508d6af8cSJussi Kivilinna 
84608d6af8cSJussi Kivilinna 	if (diff_dst)
84708d6af8cSJussi Kivilinna 		d = "-ddst";
84808d6af8cSJussi Kivilinna 	else
84908d6af8cSJussi Kivilinna 		d = "";
85008d6af8cSJussi Kivilinna 
851da7f033dSHerbert Xu 	if (enc == ENCRYPT)
852da7f033dSHerbert Xu 	        e = "encryption";
853da7f033dSHerbert Xu 	else
854da7f033dSHerbert Xu 		e = "decryption";
855da7f033dSHerbert Xu 
856da7f033dSHerbert Xu 	init_completion(&result.completion);
857da7f033dSHerbert Xu 
858da7f033dSHerbert Xu 	req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
859da7f033dSHerbert Xu 	if (!req) {
86008d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
86108d6af8cSJussi Kivilinna 		       d, algo);
862da7f033dSHerbert Xu 		goto out;
863da7f033dSHerbert Xu 	}
864da7f033dSHerbert Xu 
865da7f033dSHerbert Xu 	ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
866da7f033dSHerbert Xu 					tcrypt_complete, &result);
867da7f033dSHerbert Xu 
868da7f033dSHerbert Xu 	j = 0;
869da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
870da7f033dSHerbert Xu 		if (template[i].iv)
871da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
872da7f033dSHerbert Xu 		else
873da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
874da7f033dSHerbert Xu 
875f44d83d1SJussi Kivilinna 		if (!(template[i].np) || (template[i].also_non_np)) {
876da7f033dSHerbert Xu 			j++;
877da7f033dSHerbert Xu 
878fd57f22aSHerbert Xu 			ret = -EINVAL;
879fd57f22aSHerbert Xu 			if (WARN_ON(template[i].ilen > PAGE_SIZE))
880fd57f22aSHerbert Xu 				goto out;
881fd57f22aSHerbert Xu 
882da7f033dSHerbert Xu 			data = xbuf[0];
883da7f033dSHerbert Xu 			memcpy(data, template[i].input, template[i].ilen);
884da7f033dSHerbert Xu 
885da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
886da7f033dSHerbert Xu 			if (template[i].wk)
887da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
888da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
889da7f033dSHerbert Xu 
890da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
891da7f033dSHerbert Xu 						       template[i].klen);
892da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
89308d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
89408d6af8cSJussi Kivilinna 				       d, j, algo,
89508d6af8cSJussi Kivilinna 				       crypto_ablkcipher_get_flags(tfm));
896da7f033dSHerbert Xu 				goto out;
897da7f033dSHerbert Xu 			} else if (ret)
898da7f033dSHerbert Xu 				continue;
899da7f033dSHerbert Xu 
900da7f033dSHerbert Xu 			sg_init_one(&sg[0], data, template[i].ilen);
90108d6af8cSJussi Kivilinna 			if (diff_dst) {
90208d6af8cSJussi Kivilinna 				data = xoutbuf[0];
90308d6af8cSJussi Kivilinna 				sg_init_one(&sgout[0], data, template[i].ilen);
90408d6af8cSJussi Kivilinna 			}
905da7f033dSHerbert Xu 
90608d6af8cSJussi Kivilinna 			ablkcipher_request_set_crypt(req, sg,
90708d6af8cSJussi Kivilinna 						     (diff_dst) ? sgout : sg,
908da7f033dSHerbert Xu 						     template[i].ilen, iv);
909da7f033dSHerbert Xu 			ret = enc ?
910da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
911da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
912da7f033dSHerbert Xu 
913da7f033dSHerbert Xu 			switch (ret) {
914da7f033dSHerbert Xu 			case 0:
915da7f033dSHerbert Xu 				break;
916da7f033dSHerbert Xu 			case -EINPROGRESS:
917da7f033dSHerbert Xu 			case -EBUSY:
918da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
919da7f033dSHerbert Xu 					&result.completion);
920da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
921da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
922da7f033dSHerbert Xu 					break;
923da7f033dSHerbert Xu 				}
924da7f033dSHerbert Xu 				/* fall through */
925da7f033dSHerbert Xu 			default:
92608d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
92708d6af8cSJussi Kivilinna 				       d, e, j, algo, -ret);
928da7f033dSHerbert Xu 				goto out;
929da7f033dSHerbert Xu 			}
930da7f033dSHerbert Xu 
931da7f033dSHerbert Xu 			q = data;
932da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
93308d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Test %d failed on %s for %s\n",
93408d6af8cSJussi Kivilinna 				       d, j, e, algo);
935da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
936da7f033dSHerbert Xu 				ret = -EINVAL;
937da7f033dSHerbert Xu 				goto out;
938da7f033dSHerbert Xu 			}
939da7f033dSHerbert Xu 		}
940da7f033dSHerbert Xu 	}
941da7f033dSHerbert Xu 
942da7f033dSHerbert Xu 	j = 0;
943da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
944da7f033dSHerbert Xu 
945da7f033dSHerbert Xu 		if (template[i].iv)
946da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
947da7f033dSHerbert Xu 		else
948da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
949da7f033dSHerbert Xu 
950da7f033dSHerbert Xu 		if (template[i].np) {
951da7f033dSHerbert Xu 			j++;
952da7f033dSHerbert Xu 
953da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
954da7f033dSHerbert Xu 			if (template[i].wk)
955da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
956da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
957da7f033dSHerbert Xu 
958da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
959da7f033dSHerbert Xu 						       template[i].klen);
960da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
96108d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
96208d6af8cSJussi Kivilinna 				       d, j, algo,
963da7f033dSHerbert Xu 				       crypto_ablkcipher_get_flags(tfm));
964da7f033dSHerbert Xu 				goto out;
965da7f033dSHerbert Xu 			} else if (ret)
966da7f033dSHerbert Xu 				continue;
967da7f033dSHerbert Xu 
968da7f033dSHerbert Xu 			temp = 0;
969da7f033dSHerbert Xu 			ret = -EINVAL;
970da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
97108d6af8cSJussi Kivilinna 			if (diff_dst)
97208d6af8cSJussi Kivilinna 				sg_init_table(sgout, template[i].np);
973da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
974da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
975da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
976da7f033dSHerbert Xu 					goto out;
977da7f033dSHerbert Xu 
978da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
979da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
980da7f033dSHerbert Xu 
981da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
982da7f033dSHerbert Xu 				       template[i].tap[k]);
983da7f033dSHerbert Xu 
984da7f033dSHerbert Xu 				if (offset_in_page(q) + template[i].tap[k] <
985da7f033dSHerbert Xu 				    PAGE_SIZE)
986da7f033dSHerbert Xu 					q[template[i].tap[k]] = 0;
987da7f033dSHerbert Xu 
988da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
98908d6af8cSJussi Kivilinna 				if (diff_dst) {
99008d6af8cSJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
99108d6af8cSJussi Kivilinna 					    offset_in_page(IDX[k]);
99208d6af8cSJussi Kivilinna 
99308d6af8cSJussi Kivilinna 					sg_set_buf(&sgout[k], q,
99408d6af8cSJussi Kivilinna 						   template[i].tap[k]);
99508d6af8cSJussi Kivilinna 
99608d6af8cSJussi Kivilinna 					memset(q, 0, template[i].tap[k]);
99708d6af8cSJussi Kivilinna 					if (offset_in_page(q) +
99808d6af8cSJussi Kivilinna 					    template[i].tap[k] < PAGE_SIZE)
99908d6af8cSJussi Kivilinna 						q[template[i].tap[k]] = 0;
100008d6af8cSJussi Kivilinna 				}
1001da7f033dSHerbert Xu 
1002da7f033dSHerbert Xu 				temp += template[i].tap[k];
1003da7f033dSHerbert Xu 			}
1004da7f033dSHerbert Xu 
100508d6af8cSJussi Kivilinna 			ablkcipher_request_set_crypt(req, sg,
100608d6af8cSJussi Kivilinna 					(diff_dst) ? sgout : sg,
1007da7f033dSHerbert Xu 					template[i].ilen, iv);
1008da7f033dSHerbert Xu 
1009da7f033dSHerbert Xu 			ret = enc ?
1010da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
1011da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
1012da7f033dSHerbert Xu 
1013da7f033dSHerbert Xu 			switch (ret) {
1014da7f033dSHerbert Xu 			case 0:
1015da7f033dSHerbert Xu 				break;
1016da7f033dSHerbert Xu 			case -EINPROGRESS:
1017da7f033dSHerbert Xu 			case -EBUSY:
1018da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
1019da7f033dSHerbert Xu 					&result.completion);
1020da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
1021da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
1022da7f033dSHerbert Xu 					break;
1023da7f033dSHerbert Xu 				}
1024da7f033dSHerbert Xu 				/* fall through */
1025da7f033dSHerbert Xu 			default:
102608d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
102708d6af8cSJussi Kivilinna 				       d, e, j, algo, -ret);
1028da7f033dSHerbert Xu 				goto out;
1029da7f033dSHerbert Xu 			}
1030da7f033dSHerbert Xu 
1031da7f033dSHerbert Xu 			temp = 0;
1032da7f033dSHerbert Xu 			ret = -EINVAL;
1033da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
103408d6af8cSJussi Kivilinna 				if (diff_dst)
103508d6af8cSJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
103608d6af8cSJussi Kivilinna 					    offset_in_page(IDX[k]);
103708d6af8cSJussi Kivilinna 				else
1038da7f033dSHerbert Xu 					q = xbuf[IDX[k] >> PAGE_SHIFT] +
1039da7f033dSHerbert Xu 					    offset_in_page(IDX[k]);
1040da7f033dSHerbert Xu 
1041da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp,
1042da7f033dSHerbert Xu 					   template[i].tap[k])) {
104308d6af8cSJussi Kivilinna 					pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
104408d6af8cSJussi Kivilinna 					       d, j, e, k, algo);
1045da7f033dSHerbert Xu 					hexdump(q, template[i].tap[k]);
1046da7f033dSHerbert Xu 					goto out;
1047da7f033dSHerbert Xu 				}
1048da7f033dSHerbert Xu 
1049da7f033dSHerbert Xu 				q += template[i].tap[k];
1050da7f033dSHerbert Xu 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
1051da7f033dSHerbert Xu 					;
1052da7f033dSHerbert Xu 				if (n) {
105308d6af8cSJussi Kivilinna 					pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
105408d6af8cSJussi Kivilinna 					       d, j, e, k, algo, n);
1055da7f033dSHerbert Xu 					hexdump(q, n);
1056da7f033dSHerbert Xu 					goto out;
1057da7f033dSHerbert Xu 				}
1058da7f033dSHerbert Xu 				temp += template[i].tap[k];
1059da7f033dSHerbert Xu 			}
1060da7f033dSHerbert Xu 		}
1061da7f033dSHerbert Xu 	}
1062da7f033dSHerbert Xu 
1063da7f033dSHerbert Xu 	ret = 0;
1064da7f033dSHerbert Xu 
1065da7f033dSHerbert Xu out:
1066da7f033dSHerbert Xu 	ablkcipher_request_free(req);
106708d6af8cSJussi Kivilinna 	if (diff_dst)
106808d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
106908d6af8cSJussi Kivilinna out_nooutbuf:
1070f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1071f8b0d4d0SHerbert Xu out_nobuf:
1072da7f033dSHerbert Xu 	return ret;
1073da7f033dSHerbert Xu }
1074da7f033dSHerbert Xu 
107508d6af8cSJussi Kivilinna static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
107608d6af8cSJussi Kivilinna 			 struct cipher_testvec *template, unsigned int tcount)
107708d6af8cSJussi Kivilinna {
107808d6af8cSJussi Kivilinna 	int ret;
107908d6af8cSJussi Kivilinna 
108008d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
108108d6af8cSJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false);
108208d6af8cSJussi Kivilinna 	if (ret)
108308d6af8cSJussi Kivilinna 		return ret;
108408d6af8cSJussi Kivilinna 
108508d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
108608d6af8cSJussi Kivilinna 	return __test_skcipher(tfm, enc, template, tcount, true);
108708d6af8cSJussi Kivilinna }
108808d6af8cSJussi Kivilinna 
1089da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1090da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1091da7f033dSHerbert Xu {
1092da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1093da7f033dSHerbert Xu 	unsigned int i;
1094da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1095da7f033dSHerbert Xu 	int ret;
1096da7f033dSHerbert Xu 
1097da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1098c79cf910SGeert Uytterhoeven 		int ilen;
1099c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1100da7f033dSHerbert Xu 
1101da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1102da7f033dSHerbert Xu 
1103da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1104da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1105da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1106da7f033dSHerbert Xu 		if (ret) {
1107da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1108da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1109da7f033dSHerbert Xu 			       -ret);
1110da7f033dSHerbert Xu 			goto out;
1111da7f033dSHerbert Xu 		}
1112da7f033dSHerbert Xu 
1113b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1114b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1115b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1116b812eb00SGeert Uytterhoeven 			       dlen);
1117b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1118b812eb00SGeert Uytterhoeven 			goto out;
1119b812eb00SGeert Uytterhoeven 		}
1120b812eb00SGeert Uytterhoeven 
1121da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1122da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1123da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1124da7f033dSHerbert Xu 			hexdump(result, dlen);
1125da7f033dSHerbert Xu 			ret = -EINVAL;
1126da7f033dSHerbert Xu 			goto out;
1127da7f033dSHerbert Xu 		}
1128da7f033dSHerbert Xu 	}
1129da7f033dSHerbert Xu 
1130da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1131c79cf910SGeert Uytterhoeven 		int ilen;
1132c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1133da7f033dSHerbert Xu 
1134da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1135da7f033dSHerbert Xu 
1136da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1137da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1138da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1139da7f033dSHerbert Xu 		if (ret) {
1140da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1141da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1142da7f033dSHerbert Xu 			       -ret);
1143da7f033dSHerbert Xu 			goto out;
1144da7f033dSHerbert Xu 		}
1145da7f033dSHerbert Xu 
1146b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1147b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1148b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1149b812eb00SGeert Uytterhoeven 			       dlen);
1150b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1151b812eb00SGeert Uytterhoeven 			goto out;
1152b812eb00SGeert Uytterhoeven 		}
1153b812eb00SGeert Uytterhoeven 
1154da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1155da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1156da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1157da7f033dSHerbert Xu 			hexdump(result, dlen);
1158da7f033dSHerbert Xu 			ret = -EINVAL;
1159da7f033dSHerbert Xu 			goto out;
1160da7f033dSHerbert Xu 		}
1161da7f033dSHerbert Xu 	}
1162da7f033dSHerbert Xu 
1163da7f033dSHerbert Xu 	ret = 0;
1164da7f033dSHerbert Xu 
1165da7f033dSHerbert Xu out:
1166da7f033dSHerbert Xu 	return ret;
1167da7f033dSHerbert Xu }
1168da7f033dSHerbert Xu 
11698064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm,
11708064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *ctemplate,
11718064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *dtemplate, int ctcount,
11728064efb8SGeert Uytterhoeven 		      int dtcount)
11738064efb8SGeert Uytterhoeven {
11748064efb8SGeert Uytterhoeven 	const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
11758064efb8SGeert Uytterhoeven 	unsigned int i;
11768064efb8SGeert Uytterhoeven 	char result[COMP_BUF_SIZE];
11773ce858cbSGeert Uytterhoeven 	int res;
11788064efb8SGeert Uytterhoeven 
11798064efb8SGeert Uytterhoeven 	for (i = 0; i < ctcount; i++) {
11808064efb8SGeert Uytterhoeven 		struct comp_request req;
11813ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
11828064efb8SGeert Uytterhoeven 
11833ce858cbSGeert Uytterhoeven 		res = crypto_compress_setup(tfm, ctemplate[i].params,
11848064efb8SGeert Uytterhoeven 					    ctemplate[i].paramsize);
11853ce858cbSGeert Uytterhoeven 		if (res) {
11868064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression setup failed on test "
11873ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
11883ce858cbSGeert Uytterhoeven 			return res;
11898064efb8SGeert Uytterhoeven 		}
11908064efb8SGeert Uytterhoeven 
11913ce858cbSGeert Uytterhoeven 		res = crypto_compress_init(tfm);
11923ce858cbSGeert Uytterhoeven 		if (res) {
11938064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression init failed on test "
11943ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
11953ce858cbSGeert Uytterhoeven 			return res;
11968064efb8SGeert Uytterhoeven 		}
11978064efb8SGeert Uytterhoeven 
11988064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
11998064efb8SGeert Uytterhoeven 
12008064efb8SGeert Uytterhoeven 		req.next_in = ctemplate[i].input;
12018064efb8SGeert Uytterhoeven 		req.avail_in = ctemplate[i].inlen / 2;
12028064efb8SGeert Uytterhoeven 		req.next_out = result;
12038064efb8SGeert Uytterhoeven 		req.avail_out = ctemplate[i].outlen / 2;
12048064efb8SGeert Uytterhoeven 
12053ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
12063ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
12078064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
12083ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12093ce858cbSGeert Uytterhoeven 			return res;
12108064efb8SGeert Uytterhoeven 		}
12113ce858cbSGeert Uytterhoeven 		if (res > 0)
12123ce858cbSGeert Uytterhoeven 			produced += res;
12138064efb8SGeert Uytterhoeven 
12148064efb8SGeert Uytterhoeven 		/* Add remaining input data */
12158064efb8SGeert Uytterhoeven 		req.avail_in += (ctemplate[i].inlen + 1) / 2;
12168064efb8SGeert Uytterhoeven 
12173ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
12183ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
12198064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
12203ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12213ce858cbSGeert Uytterhoeven 			return res;
12228064efb8SGeert Uytterhoeven 		}
12233ce858cbSGeert Uytterhoeven 		if (res > 0)
12243ce858cbSGeert Uytterhoeven 			produced += res;
12258064efb8SGeert Uytterhoeven 
12268064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
12278064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
12288064efb8SGeert Uytterhoeven 
12293ce858cbSGeert Uytterhoeven 		res = crypto_compress_final(tfm, &req);
12303ce858cbSGeert Uytterhoeven 		if (res < 0) {
12318064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression final failed on test "
12323ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12333ce858cbSGeert Uytterhoeven 			return res;
12348064efb8SGeert Uytterhoeven 		}
12353ce858cbSGeert Uytterhoeven 		produced += res;
12368064efb8SGeert Uytterhoeven 
12378064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
12388064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
12398064efb8SGeert Uytterhoeven 			       "output len = %d (expected %d)\n", i + 1, algo,
12408064efb8SGeert Uytterhoeven 			       COMP_BUF_SIZE - req.avail_out,
12418064efb8SGeert Uytterhoeven 			       ctemplate[i].outlen);
12428064efb8SGeert Uytterhoeven 			return -EINVAL;
12438064efb8SGeert Uytterhoeven 		}
12448064efb8SGeert Uytterhoeven 
12453ce858cbSGeert Uytterhoeven 		if (produced != ctemplate[i].outlen) {
12463ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
12473ce858cbSGeert Uytterhoeven 			       "returned len = %u (expected %d)\n", i + 1,
12483ce858cbSGeert Uytterhoeven 			       algo, produced, ctemplate[i].outlen);
12493ce858cbSGeert Uytterhoeven 			return -EINVAL;
12503ce858cbSGeert Uytterhoeven 		}
12513ce858cbSGeert Uytterhoeven 
12528064efb8SGeert Uytterhoeven 		if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
12538064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Compression test %d failed for "
12548064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
12558064efb8SGeert Uytterhoeven 			hexdump(result, ctemplate[i].outlen);
12568064efb8SGeert Uytterhoeven 			return -EINVAL;
12578064efb8SGeert Uytterhoeven 		}
12588064efb8SGeert Uytterhoeven 	}
12598064efb8SGeert Uytterhoeven 
12608064efb8SGeert Uytterhoeven 	for (i = 0; i < dtcount; i++) {
12618064efb8SGeert Uytterhoeven 		struct comp_request req;
12623ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
12638064efb8SGeert Uytterhoeven 
12643ce858cbSGeert Uytterhoeven 		res = crypto_decompress_setup(tfm, dtemplate[i].params,
12658064efb8SGeert Uytterhoeven 					      dtemplate[i].paramsize);
12663ce858cbSGeert Uytterhoeven 		if (res) {
12678064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression setup failed on "
12683ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
12693ce858cbSGeert Uytterhoeven 			return res;
12708064efb8SGeert Uytterhoeven 		}
12718064efb8SGeert Uytterhoeven 
12723ce858cbSGeert Uytterhoeven 		res = crypto_decompress_init(tfm);
12733ce858cbSGeert Uytterhoeven 		if (res) {
12748064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression init failed on test "
12753ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12763ce858cbSGeert Uytterhoeven 			return res;
12778064efb8SGeert Uytterhoeven 		}
12788064efb8SGeert Uytterhoeven 
12798064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
12808064efb8SGeert Uytterhoeven 
12818064efb8SGeert Uytterhoeven 		req.next_in = dtemplate[i].input;
12828064efb8SGeert Uytterhoeven 		req.avail_in = dtemplate[i].inlen / 2;
12838064efb8SGeert Uytterhoeven 		req.next_out = result;
12848064efb8SGeert Uytterhoeven 		req.avail_out = dtemplate[i].outlen / 2;
12858064efb8SGeert Uytterhoeven 
12863ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
12873ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
12888064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
12893ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
12903ce858cbSGeert Uytterhoeven 			return res;
12918064efb8SGeert Uytterhoeven 		}
12923ce858cbSGeert Uytterhoeven 		if (res > 0)
12933ce858cbSGeert Uytterhoeven 			produced += res;
12948064efb8SGeert Uytterhoeven 
12958064efb8SGeert Uytterhoeven 		/* Add remaining input data */
12968064efb8SGeert Uytterhoeven 		req.avail_in += (dtemplate[i].inlen + 1) / 2;
12978064efb8SGeert Uytterhoeven 
12983ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
12993ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13008064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
13013ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13023ce858cbSGeert Uytterhoeven 			return res;
13038064efb8SGeert Uytterhoeven 		}
13043ce858cbSGeert Uytterhoeven 		if (res > 0)
13053ce858cbSGeert Uytterhoeven 			produced += res;
13068064efb8SGeert Uytterhoeven 
13078064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
13088064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
13098064efb8SGeert Uytterhoeven 
13103ce858cbSGeert Uytterhoeven 		res = crypto_decompress_final(tfm, &req);
13113ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13128064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression final failed on "
13133ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13143ce858cbSGeert Uytterhoeven 			return res;
13158064efb8SGeert Uytterhoeven 		}
13163ce858cbSGeert Uytterhoeven 		if (res > 0)
13173ce858cbSGeert Uytterhoeven 			produced += res;
13188064efb8SGeert Uytterhoeven 
13198064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
13208064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
13218064efb8SGeert Uytterhoeven 			       "%s: output len = %d (expected %d)\n", i + 1,
13228064efb8SGeert Uytterhoeven 			       algo, COMP_BUF_SIZE - req.avail_out,
13238064efb8SGeert Uytterhoeven 			       dtemplate[i].outlen);
13248064efb8SGeert Uytterhoeven 			return -EINVAL;
13258064efb8SGeert Uytterhoeven 		}
13268064efb8SGeert Uytterhoeven 
13273ce858cbSGeert Uytterhoeven 		if (produced != dtemplate[i].outlen) {
13283ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
13293ce858cbSGeert Uytterhoeven 			       "%s: returned len = %u (expected %d)\n", i + 1,
13303ce858cbSGeert Uytterhoeven 			       algo, produced, dtemplate[i].outlen);
13313ce858cbSGeert Uytterhoeven 			return -EINVAL;
13323ce858cbSGeert Uytterhoeven 		}
13333ce858cbSGeert Uytterhoeven 
13348064efb8SGeert Uytterhoeven 		if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
13358064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Decompression test %d failed for "
13368064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
13378064efb8SGeert Uytterhoeven 			hexdump(result, dtemplate[i].outlen);
13388064efb8SGeert Uytterhoeven 			return -EINVAL;
13398064efb8SGeert Uytterhoeven 		}
13408064efb8SGeert Uytterhoeven 	}
13418064efb8SGeert Uytterhoeven 
13428064efb8SGeert Uytterhoeven 	return 0;
13438064efb8SGeert Uytterhoeven }
13448064efb8SGeert Uytterhoeven 
13457647d6ceSJarod Wilson 
13467647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
13477647d6ceSJarod Wilson 		      unsigned int tcount)
13487647d6ceSJarod Wilson {
13497647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1350fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
13517647d6ceSJarod Wilson 	u8 *seed;
13527647d6ceSJarod Wilson 	char result[32];
13537647d6ceSJarod Wilson 
13547647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
13557647d6ceSJarod Wilson 
13567647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
13577647d6ceSJarod Wilson 	if (!seed) {
13587647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
13597647d6ceSJarod Wilson 		       "for %s\n", algo);
13607647d6ceSJarod Wilson 		return -ENOMEM;
13617647d6ceSJarod Wilson 	}
13627647d6ceSJarod Wilson 
13637647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
13647647d6ceSJarod Wilson 		memset(result, 0, 32);
13657647d6ceSJarod Wilson 
13667647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
13677647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
13687647d6ceSJarod Wilson 		       template[i].klen);
13697647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
13707647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
13717647d6ceSJarod Wilson 
13727647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
13737647d6ceSJarod Wilson 		if (err) {
13747647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
13757647d6ceSJarod Wilson 			       "for %s\n", algo);
13767647d6ceSJarod Wilson 			goto out;
13777647d6ceSJarod Wilson 		}
13787647d6ceSJarod Wilson 
13797647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
13807647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
13817647d6ceSJarod Wilson 						   template[i].rlen);
13827647d6ceSJarod Wilson 			if (err != template[i].rlen) {
13837647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
13847647d6ceSJarod Wilson 				       "the correct amount of random data for "
13857647d6ceSJarod Wilson 				       "%s (requested %d, got %d)\n", algo,
13867647d6ceSJarod Wilson 				       template[i].rlen, err);
13877647d6ceSJarod Wilson 				goto out;
13887647d6ceSJarod Wilson 			}
13897647d6ceSJarod Wilson 		}
13907647d6ceSJarod Wilson 
13917647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
13927647d6ceSJarod Wilson 			     template[i].rlen);
13937647d6ceSJarod Wilson 		if (err) {
13947647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
13957647d6ceSJarod Wilson 			       i, algo);
13967647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
13977647d6ceSJarod Wilson 			err = -EINVAL;
13987647d6ceSJarod Wilson 			goto out;
13997647d6ceSJarod Wilson 		}
14007647d6ceSJarod Wilson 	}
14017647d6ceSJarod Wilson 
14027647d6ceSJarod Wilson out:
14037647d6ceSJarod Wilson 	kfree(seed);
14047647d6ceSJarod Wilson 	return err;
14057647d6ceSJarod Wilson }
14067647d6ceSJarod Wilson 
1407da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1408da7f033dSHerbert Xu 			 u32 type, u32 mask)
1409da7f033dSHerbert Xu {
1410da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1411da7f033dSHerbert Xu 	int err = 0;
1412da7f033dSHerbert Xu 
1413da7f033dSHerbert Xu 	tfm = crypto_alloc_aead(driver, type, mask);
1414da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1415da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1416da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1417da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1418da7f033dSHerbert Xu 	}
1419da7f033dSHerbert Xu 
1420da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1421da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1422da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1423da7f033dSHerbert Xu 		if (err)
1424da7f033dSHerbert Xu 			goto out;
1425da7f033dSHerbert Xu 	}
1426da7f033dSHerbert Xu 
1427da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1428da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1429da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1430da7f033dSHerbert Xu 
1431da7f033dSHerbert Xu out:
1432da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1433da7f033dSHerbert Xu 	return err;
1434da7f033dSHerbert Xu }
1435da7f033dSHerbert Xu 
1436da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1437da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1438da7f033dSHerbert Xu {
14391aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1440da7f033dSHerbert Xu 	int err = 0;
1441da7f033dSHerbert Xu 
14421aa4ecd9SHerbert Xu 	tfm = crypto_alloc_cipher(driver, type, mask);
1443da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1444da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1445da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1446da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1447da7f033dSHerbert Xu 	}
1448da7f033dSHerbert Xu 
1449da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1450da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1451da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1452da7f033dSHerbert Xu 		if (err)
1453da7f033dSHerbert Xu 			goto out;
1454da7f033dSHerbert Xu 	}
1455da7f033dSHerbert Xu 
1456da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1457da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1458da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1459da7f033dSHerbert Xu 
1460da7f033dSHerbert Xu out:
14611aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
14621aa4ecd9SHerbert Xu 	return err;
14631aa4ecd9SHerbert Xu }
14641aa4ecd9SHerbert Xu 
14651aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
14661aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
14671aa4ecd9SHerbert Xu {
14681aa4ecd9SHerbert Xu 	struct crypto_ablkcipher *tfm;
14691aa4ecd9SHerbert Xu 	int err = 0;
14701aa4ecd9SHerbert Xu 
14711aa4ecd9SHerbert Xu 	tfm = crypto_alloc_ablkcipher(driver, type, mask);
14721aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
14731aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
14741aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
14751aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
14761aa4ecd9SHerbert Xu 	}
14771aa4ecd9SHerbert Xu 
14781aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
14791aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
14801aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
14811aa4ecd9SHerbert Xu 		if (err)
14821aa4ecd9SHerbert Xu 			goto out;
14831aa4ecd9SHerbert Xu 	}
14841aa4ecd9SHerbert Xu 
14851aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
14861aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
14871aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
14881aa4ecd9SHerbert Xu 
14891aa4ecd9SHerbert Xu out:
1490da7f033dSHerbert Xu 	crypto_free_ablkcipher(tfm);
1491da7f033dSHerbert Xu 	return err;
1492da7f033dSHerbert Xu }
1493da7f033dSHerbert Xu 
1494da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1495da7f033dSHerbert Xu 			 u32 type, u32 mask)
1496da7f033dSHerbert Xu {
1497da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1498da7f033dSHerbert Xu 	int err;
1499da7f033dSHerbert Xu 
1500da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1501da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1502da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1503da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1504da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1505da7f033dSHerbert Xu 	}
1506da7f033dSHerbert Xu 
1507da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1508da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1509da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1510da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1511da7f033dSHerbert Xu 
1512da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1513da7f033dSHerbert Xu 	return err;
1514da7f033dSHerbert Xu }
1515da7f033dSHerbert Xu 
15168064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
15178064efb8SGeert Uytterhoeven 			  u32 type, u32 mask)
15188064efb8SGeert Uytterhoeven {
15198064efb8SGeert Uytterhoeven 	struct crypto_pcomp *tfm;
15208064efb8SGeert Uytterhoeven 	int err;
15218064efb8SGeert Uytterhoeven 
15228064efb8SGeert Uytterhoeven 	tfm = crypto_alloc_pcomp(driver, type, mask);
15238064efb8SGeert Uytterhoeven 	if (IS_ERR(tfm)) {
15248064efb8SGeert Uytterhoeven 		pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
15258064efb8SGeert Uytterhoeven 		       driver, PTR_ERR(tfm));
15268064efb8SGeert Uytterhoeven 		return PTR_ERR(tfm);
15278064efb8SGeert Uytterhoeven 	}
15288064efb8SGeert Uytterhoeven 
15298064efb8SGeert Uytterhoeven 	err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
15308064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.vecs,
15318064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.comp.count,
15328064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.count);
15338064efb8SGeert Uytterhoeven 
15348064efb8SGeert Uytterhoeven 	crypto_free_pcomp(tfm);
15358064efb8SGeert Uytterhoeven 	return err;
15368064efb8SGeert Uytterhoeven }
15378064efb8SGeert Uytterhoeven 
1538da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1539da7f033dSHerbert Xu 			 u32 type, u32 mask)
1540da7f033dSHerbert Xu {
1541da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1542da7f033dSHerbert Xu 	int err;
1543da7f033dSHerbert Xu 
1544da7f033dSHerbert Xu 	tfm = crypto_alloc_ahash(driver, type, mask);
1545da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1546da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1547da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1548da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1549da7f033dSHerbert Xu 	}
1550da7f033dSHerbert Xu 
1551a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1552a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1553a8f1a052SDavid S. Miller 	if (!err)
1554a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1555a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1556da7f033dSHerbert Xu 
1557da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1558da7f033dSHerbert Xu 	return err;
1559da7f033dSHerbert Xu }
1560da7f033dSHerbert Xu 
15618e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
15628e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
15638e3ee85eSHerbert Xu {
15648e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
15658e3ee85eSHerbert Xu 	u32 val;
15668e3ee85eSHerbert Xu 	int err;
15678e3ee85eSHerbert Xu 
15688e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
15698e3ee85eSHerbert Xu 	if (err)
15708e3ee85eSHerbert Xu 		goto out;
15718e3ee85eSHerbert Xu 
15728e3ee85eSHerbert Xu 	tfm = crypto_alloc_shash(driver, type, mask);
15738e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
15748e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
15758e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
15768e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
15778e3ee85eSHerbert Xu 		goto out;
15788e3ee85eSHerbert Xu 	}
15798e3ee85eSHerbert Xu 
15808e3ee85eSHerbert Xu 	do {
15818e3ee85eSHerbert Xu 		struct {
15828e3ee85eSHerbert Xu 			struct shash_desc shash;
15838e3ee85eSHerbert Xu 			char ctx[crypto_shash_descsize(tfm)];
15848e3ee85eSHerbert Xu 		} sdesc;
15858e3ee85eSHerbert Xu 
15868e3ee85eSHerbert Xu 		sdesc.shash.tfm = tfm;
15878e3ee85eSHerbert Xu 		sdesc.shash.flags = 0;
15888e3ee85eSHerbert Xu 
15898e3ee85eSHerbert Xu 		*(u32 *)sdesc.ctx = le32_to_cpu(420553207);
15908e3ee85eSHerbert Xu 		err = crypto_shash_final(&sdesc.shash, (u8 *)&val);
15918e3ee85eSHerbert Xu 		if (err) {
15928e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
15938e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
15948e3ee85eSHerbert Xu 			break;
15958e3ee85eSHerbert Xu 		}
15968e3ee85eSHerbert Xu 
15978e3ee85eSHerbert Xu 		if (val != ~420553207) {
15988e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
15998e3ee85eSHerbert Xu 			       "%d\n", driver, val);
16008e3ee85eSHerbert Xu 			err = -EINVAL;
16018e3ee85eSHerbert Xu 		}
16028e3ee85eSHerbert Xu 	} while (0);
16038e3ee85eSHerbert Xu 
16048e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
16058e3ee85eSHerbert Xu 
16068e3ee85eSHerbert Xu out:
16078e3ee85eSHerbert Xu 	return err;
16088e3ee85eSHerbert Xu }
16098e3ee85eSHerbert Xu 
16107647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
16117647d6ceSJarod Wilson 			  u32 type, u32 mask)
16127647d6ceSJarod Wilson {
16137647d6ceSJarod Wilson 	struct crypto_rng *rng;
16147647d6ceSJarod Wilson 	int err;
16157647d6ceSJarod Wilson 
16167647d6ceSJarod Wilson 	rng = crypto_alloc_rng(driver, type, mask);
16177647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
16187647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
16197647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
16207647d6ceSJarod Wilson 		return PTR_ERR(rng);
16217647d6ceSJarod Wilson 	}
16227647d6ceSJarod Wilson 
16237647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
16247647d6ceSJarod Wilson 
16257647d6ceSJarod Wilson 	crypto_free_rng(rng);
16267647d6ceSJarod Wilson 
16277647d6ceSJarod Wilson 	return err;
16287647d6ceSJarod Wilson }
16297647d6ceSJarod Wilson 
1630863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1631863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1632863b557aSYouquan, Song {
1633863b557aSYouquan, Song 	return 0;
1634863b557aSYouquan, Song }
1635863b557aSYouquan, Song 
1636da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1637da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1638da7f033dSHerbert Xu 	{
16394d6d6a2cSJohannes Goetzfried 		.alg = "__cbc-cast5-avx",
16404d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
16414d6d6a2cSJohannes Goetzfried 	}, {
16424ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
16434ea1277dSJohannes Goetzfried 		.test = alg_test_null,
16444ea1277dSJohannes Goetzfried 	}, {
16457efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
16467efe4076SJohannes Goetzfried 		.test = alg_test_null,
16477efe4076SJohannes Goetzfried 	}, {
1648937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
1649937c30d7SJussi Kivilinna 		.test = alg_test_null,
1650937c30d7SJussi Kivilinna 	}, {
1651107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
1652107778b5SJohannes Goetzfried 		.test = alg_test_null,
1653107778b5SJohannes Goetzfried 	}, {
1654863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
1655863b557aSYouquan, Song 		.test = alg_test_null,
16566c79294fSMilan Broz 		.fips_allowed = 1,
1657863b557aSYouquan, Song 	}, {
1658d9b1d2e7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni",
1659d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1660d9b1d2e7SJussi Kivilinna 	}, {
16614d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
16624d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
16634d6d6a2cSJohannes Goetzfried 	}, {
16644ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
16654ea1277dSJohannes Goetzfried 		.test = alg_test_null,
16664ea1277dSJohannes Goetzfried 	}, {
16677efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
16687efe4076SJohannes Goetzfried 		.test = alg_test_null,
16697efe4076SJohannes Goetzfried 	}, {
1670937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
1671937c30d7SJussi Kivilinna 		.test = alg_test_null,
1672937c30d7SJussi Kivilinna 	}, {
1673107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
1674107778b5SJohannes Goetzfried 		.test = alg_test_null,
1675107778b5SJohannes Goetzfried 	}, {
1676863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
1677863b557aSYouquan, Song 		.test = alg_test_null,
16786c79294fSMilan Broz 		.fips_allowed = 1,
1679863b557aSYouquan, Song 	}, {
1680d9b1d2e7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni",
1681d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1682d9b1d2e7SJussi Kivilinna 	}, {
16834d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
16844d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
16854d6d6a2cSJohannes Goetzfried 	}, {
16864ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
16874ea1277dSJohannes Goetzfried 		.test = alg_test_null,
16884ea1277dSJohannes Goetzfried 	}, {
16897efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
16907efe4076SJohannes Goetzfried 		.test = alg_test_null,
16917efe4076SJohannes Goetzfried 	}, {
1692937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
1693937c30d7SJussi Kivilinna 		.test = alg_test_null,
1694937c30d7SJussi Kivilinna 	}, {
1695107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
1696107778b5SJohannes Goetzfried 		.test = alg_test_null,
1697107778b5SJohannes Goetzfried 	}, {
1698863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
1699863b557aSYouquan, Song 		.test = alg_test_null,
17006c79294fSMilan Broz 		.fips_allowed = 1,
1701863b557aSYouquan, Song 	}, {
1702e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
1703e08ca2daSJarod Wilson 		.test = alg_test_cprng,
1704a1915d51SJarod Wilson 		.fips_allowed = 1,
1705e08ca2daSJarod Wilson 		.suite = {
1706e08ca2daSJarod Wilson 			.cprng = {
1707e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
1708e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
1709e08ca2daSJarod Wilson 			}
1710e08ca2daSJarod Wilson 		}
1711e08ca2daSJarod Wilson 	}, {
1712e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha1),cbc(aes))",
1713e46e9a46SHoria Geanta 		.test = alg_test_aead,
1714e46e9a46SHoria Geanta 		.fips_allowed = 1,
1715e46e9a46SHoria Geanta 		.suite = {
1716e46e9a46SHoria Geanta 			.aead = {
1717e46e9a46SHoria Geanta 				.enc = {
1718e46e9a46SHoria Geanta 					.vecs = hmac_sha1_aes_cbc_enc_tv_template,
1719e46e9a46SHoria Geanta 					.count = HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS
1720e46e9a46SHoria Geanta 				}
1721e46e9a46SHoria Geanta 			}
1722e46e9a46SHoria Geanta 		}
1723e46e9a46SHoria Geanta 	}, {
1724e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha256),cbc(aes))",
1725e46e9a46SHoria Geanta 		.test = alg_test_aead,
1726e46e9a46SHoria Geanta 		.fips_allowed = 1,
1727e46e9a46SHoria Geanta 		.suite = {
1728e46e9a46SHoria Geanta 			.aead = {
1729e46e9a46SHoria Geanta 				.enc = {
1730e46e9a46SHoria Geanta 					.vecs = hmac_sha256_aes_cbc_enc_tv_template,
1731e46e9a46SHoria Geanta 					.count = HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS
1732e46e9a46SHoria Geanta 				}
1733e46e9a46SHoria Geanta 			}
1734e46e9a46SHoria Geanta 		}
1735e46e9a46SHoria Geanta 	}, {
1736e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha512),cbc(aes))",
1737e46e9a46SHoria Geanta 		.test = alg_test_aead,
1738e46e9a46SHoria Geanta 		.fips_allowed = 1,
1739e46e9a46SHoria Geanta 		.suite = {
1740e46e9a46SHoria Geanta 			.aead = {
1741e46e9a46SHoria Geanta 				.enc = {
1742e46e9a46SHoria Geanta 					.vecs = hmac_sha512_aes_cbc_enc_tv_template,
1743e46e9a46SHoria Geanta 					.count = HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS
1744e46e9a46SHoria Geanta 				}
1745e46e9a46SHoria Geanta 			}
1746e46e9a46SHoria Geanta 		}
1747e46e9a46SHoria Geanta 	}, {
1748da7f033dSHerbert Xu 		.alg = "cbc(aes)",
17491aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1750a1915d51SJarod Wilson 		.fips_allowed = 1,
1751da7f033dSHerbert Xu 		.suite = {
1752da7f033dSHerbert Xu 			.cipher = {
1753da7f033dSHerbert Xu 				.enc = {
1754da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
1755da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
1756da7f033dSHerbert Xu 				},
1757da7f033dSHerbert Xu 				.dec = {
1758da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
1759da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
1760da7f033dSHerbert Xu 				}
1761da7f033dSHerbert Xu 			}
1762da7f033dSHerbert Xu 		}
1763da7f033dSHerbert Xu 	}, {
1764da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
17651aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1766da7f033dSHerbert Xu 		.suite = {
1767da7f033dSHerbert Xu 			.cipher = {
1768da7f033dSHerbert Xu 				.enc = {
1769da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
1770da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
1771da7f033dSHerbert Xu 				},
1772da7f033dSHerbert Xu 				.dec = {
1773da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
1774da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
1775da7f033dSHerbert Xu 				}
1776da7f033dSHerbert Xu 			}
1777da7f033dSHerbert Xu 		}
1778da7f033dSHerbert Xu 	}, {
1779da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
17801aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1781da7f033dSHerbert Xu 		.suite = {
1782da7f033dSHerbert Xu 			.cipher = {
1783da7f033dSHerbert Xu 				.enc = {
1784da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
1785da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
1786da7f033dSHerbert Xu 				},
1787da7f033dSHerbert Xu 				.dec = {
1788da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
1789da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
1790da7f033dSHerbert Xu 				}
1791da7f033dSHerbert Xu 			}
1792da7f033dSHerbert Xu 		}
1793da7f033dSHerbert Xu 	}, {
1794da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
17951aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1796da7f033dSHerbert Xu 		.suite = {
1797da7f033dSHerbert Xu 			.cipher = {
1798da7f033dSHerbert Xu 				.enc = {
1799da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
1800da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
1801da7f033dSHerbert Xu 				},
1802da7f033dSHerbert Xu 				.dec = {
1803da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
1804da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
1805da7f033dSHerbert Xu 				}
1806da7f033dSHerbert Xu 			}
1807da7f033dSHerbert Xu 		}
1808da7f033dSHerbert Xu 	}, {
1809a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
1810a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
1811a2c58260SJohannes Goetzfried 		.suite = {
1812a2c58260SJohannes Goetzfried 			.cipher = {
1813a2c58260SJohannes Goetzfried 				.enc = {
1814a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
1815a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
1816a2c58260SJohannes Goetzfried 				},
1817a2c58260SJohannes Goetzfried 				.dec = {
1818a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
1819a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
1820a2c58260SJohannes Goetzfried 				}
1821a2c58260SJohannes Goetzfried 			}
1822a2c58260SJohannes Goetzfried 		}
1823a2c58260SJohannes Goetzfried 	}, {
18249b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
18259b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
18269b8b0405SJohannes Goetzfried 		.suite = {
18279b8b0405SJohannes Goetzfried 			.cipher = {
18289b8b0405SJohannes Goetzfried 				.enc = {
18299b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
18309b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
18319b8b0405SJohannes Goetzfried 				},
18329b8b0405SJohannes Goetzfried 				.dec = {
18339b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
18349b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
18359b8b0405SJohannes Goetzfried 				}
18369b8b0405SJohannes Goetzfried 			}
18379b8b0405SJohannes Goetzfried 		}
18389b8b0405SJohannes Goetzfried 	}, {
1839da7f033dSHerbert Xu 		.alg = "cbc(des)",
18401aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1841da7f033dSHerbert Xu 		.suite = {
1842da7f033dSHerbert Xu 			.cipher = {
1843da7f033dSHerbert Xu 				.enc = {
1844da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
1845da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
1846da7f033dSHerbert Xu 				},
1847da7f033dSHerbert Xu 				.dec = {
1848da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
1849da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
1850da7f033dSHerbert Xu 				}
1851da7f033dSHerbert Xu 			}
1852da7f033dSHerbert Xu 		}
1853da7f033dSHerbert Xu 	}, {
1854da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
18551aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1856a1915d51SJarod Wilson 		.fips_allowed = 1,
1857da7f033dSHerbert Xu 		.suite = {
1858da7f033dSHerbert Xu 			.cipher = {
1859da7f033dSHerbert Xu 				.enc = {
1860da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
1861da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
1862da7f033dSHerbert Xu 				},
1863da7f033dSHerbert Xu 				.dec = {
1864da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
1865da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
1866da7f033dSHerbert Xu 				}
1867da7f033dSHerbert Xu 			}
1868da7f033dSHerbert Xu 		}
1869da7f033dSHerbert Xu 	}, {
18709d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
18719d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
18729d25917dSJussi Kivilinna 		.suite = {
18739d25917dSJussi Kivilinna 			.cipher = {
18749d25917dSJussi Kivilinna 				.enc = {
18759d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
18769d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
18779d25917dSJussi Kivilinna 				},
18789d25917dSJussi Kivilinna 				.dec = {
18799d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
18809d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
18819d25917dSJussi Kivilinna 				}
18829d25917dSJussi Kivilinna 			}
18839d25917dSJussi Kivilinna 		}
18849d25917dSJussi Kivilinna 	}, {
1885da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
18861aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1887da7f033dSHerbert Xu 		.suite = {
1888da7f033dSHerbert Xu 			.cipher = {
1889da7f033dSHerbert Xu 				.enc = {
1890da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
1891da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
1892da7f033dSHerbert Xu 				},
1893da7f033dSHerbert Xu 				.dec = {
1894da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
1895da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
1896da7f033dSHerbert Xu 				}
1897da7f033dSHerbert Xu 			}
1898da7f033dSHerbert Xu 		}
1899da7f033dSHerbert Xu 	}, {
1900da7f033dSHerbert Xu 		.alg = "ccm(aes)",
1901da7f033dSHerbert Xu 		.test = alg_test_aead,
1902a1915d51SJarod Wilson 		.fips_allowed = 1,
1903da7f033dSHerbert Xu 		.suite = {
1904da7f033dSHerbert Xu 			.aead = {
1905da7f033dSHerbert Xu 				.enc = {
1906da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
1907da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
1908da7f033dSHerbert Xu 				},
1909da7f033dSHerbert Xu 				.dec = {
1910da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
1911da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
1912da7f033dSHerbert Xu 				}
1913da7f033dSHerbert Xu 			}
1914da7f033dSHerbert Xu 		}
1915da7f033dSHerbert Xu 	}, {
1916da7f033dSHerbert Xu 		.alg = "crc32c",
19178e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
1918a1915d51SJarod Wilson 		.fips_allowed = 1,
1919da7f033dSHerbert Xu 		.suite = {
1920da7f033dSHerbert Xu 			.hash = {
1921da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
1922da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
1923da7f033dSHerbert Xu 			}
1924da7f033dSHerbert Xu 		}
1925da7f033dSHerbert Xu 	}, {
19266c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
19276c79294fSMilan Broz 		.test = alg_test_null,
19286c79294fSMilan Broz 		.fips_allowed = 1,
19296c79294fSMilan Broz 	}, {
1930d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni)",
1931d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1932d9b1d2e7SJussi Kivilinna 	}, {
1933863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
1934863b557aSYouquan, Song 		.test = alg_test_null,
19356c79294fSMilan Broz 		.fips_allowed = 1,
1936863b557aSYouquan, Song 	}, {
1937d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni)",
1938d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1939d9b1d2e7SJussi Kivilinna 	}, {
19404d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
19414d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
19424d6d6a2cSJohannes Goetzfried 	}, {
19434ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
19444ea1277dSJohannes Goetzfried 		.test = alg_test_null,
19454ea1277dSJohannes Goetzfried 	}, {
19467efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
19477efe4076SJohannes Goetzfried 		.test = alg_test_null,
19487efe4076SJohannes Goetzfried 	}, {
1949937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
1950937c30d7SJussi Kivilinna 		.test = alg_test_null,
1951937c30d7SJussi Kivilinna 	}, {
1952107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
1953107778b5SJohannes Goetzfried 		.test = alg_test_null,
1954107778b5SJohannes Goetzfried 	}, {
19556c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
19566c79294fSMilan Broz 		.test = alg_test_null,
19576c79294fSMilan Broz 		.fips_allowed = 1,
19586c79294fSMilan Broz 	}, {
1959863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
1960863b557aSYouquan, Song 		.test = alg_test_null,
19616c79294fSMilan Broz 		.fips_allowed = 1,
1962863b557aSYouquan, Song 	}, {
1963f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
1964f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
1965a1915d51SJarod Wilson 		.fips_allowed = 1,
1966f7cb80f2SJarod Wilson 		.suite = {
1967f7cb80f2SJarod Wilson 			.cipher = {
1968f7cb80f2SJarod Wilson 				.enc = {
1969f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
1970f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
1971f7cb80f2SJarod Wilson 				},
1972f7cb80f2SJarod Wilson 				.dec = {
1973f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
1974f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
1975f7cb80f2SJarod Wilson 				}
1976f7cb80f2SJarod Wilson 			}
1977f7cb80f2SJarod Wilson 		}
1978f7cb80f2SJarod Wilson 	}, {
197985b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
198085b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
198185b63e34SJussi Kivilinna 		.suite = {
198285b63e34SJussi Kivilinna 			.cipher = {
198385b63e34SJussi Kivilinna 				.enc = {
198485b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
198585b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
198685b63e34SJussi Kivilinna 				},
198785b63e34SJussi Kivilinna 				.dec = {
198885b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
198985b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
199085b63e34SJussi Kivilinna 				}
199185b63e34SJussi Kivilinna 			}
199285b63e34SJussi Kivilinna 		}
199385b63e34SJussi Kivilinna 	}, {
19940840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
19950840605eSJussi Kivilinna 		.test = alg_test_skcipher,
19960840605eSJussi Kivilinna 		.suite = {
19970840605eSJussi Kivilinna 			.cipher = {
19980840605eSJussi Kivilinna 				.enc = {
19990840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
20000840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
20010840605eSJussi Kivilinna 				},
20020840605eSJussi Kivilinna 				.dec = {
20030840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
20040840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
20050840605eSJussi Kivilinna 				}
20060840605eSJussi Kivilinna 			}
20070840605eSJussi Kivilinna 		}
20080840605eSJussi Kivilinna 	}, {
2009a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2010a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2011a2c58260SJohannes Goetzfried 		.suite = {
2012a2c58260SJohannes Goetzfried 			.cipher = {
2013a2c58260SJohannes Goetzfried 				.enc = {
2014a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2015a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2016a2c58260SJohannes Goetzfried 				},
2017a2c58260SJohannes Goetzfried 				.dec = {
2018a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2019a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2020a2c58260SJohannes Goetzfried 				}
2021a2c58260SJohannes Goetzfried 			}
2022a2c58260SJohannes Goetzfried 		}
2023a2c58260SJohannes Goetzfried 	}, {
20249b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
20259b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
20269b8b0405SJohannes Goetzfried 		.suite = {
20279b8b0405SJohannes Goetzfried 			.cipher = {
20289b8b0405SJohannes Goetzfried 				.enc = {
20299b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
20309b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
20319b8b0405SJohannes Goetzfried 				},
20329b8b0405SJohannes Goetzfried 				.dec = {
20339b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
20349b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
20359b8b0405SJohannes Goetzfried 				}
20369b8b0405SJohannes Goetzfried 			}
20379b8b0405SJohannes Goetzfried 		}
20389b8b0405SJohannes Goetzfried 	}, {
20398163fc30SJussi Kivilinna 		.alg = "ctr(des)",
20408163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
20418163fc30SJussi Kivilinna 		.suite = {
20428163fc30SJussi Kivilinna 			.cipher = {
20438163fc30SJussi Kivilinna 				.enc = {
20448163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
20458163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
20468163fc30SJussi Kivilinna 				},
20478163fc30SJussi Kivilinna 				.dec = {
20488163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
20498163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
20508163fc30SJussi Kivilinna 				}
20518163fc30SJussi Kivilinna 			}
20528163fc30SJussi Kivilinna 		}
20538163fc30SJussi Kivilinna 	}, {
2054e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2055e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2056e080b17aSJussi Kivilinna 		.suite = {
2057e080b17aSJussi Kivilinna 			.cipher = {
2058e080b17aSJussi Kivilinna 				.enc = {
2059e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2060e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2061e080b17aSJussi Kivilinna 				},
2062e080b17aSJussi Kivilinna 				.dec = {
2063e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2064e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2065e080b17aSJussi Kivilinna 				}
2066e080b17aSJussi Kivilinna 			}
2067e080b17aSJussi Kivilinna 		}
2068e080b17aSJussi Kivilinna 	}, {
20699d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
20709d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
20719d25917dSJussi Kivilinna 		.suite = {
20729d25917dSJussi Kivilinna 			.cipher = {
20739d25917dSJussi Kivilinna 				.enc = {
20749d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
20759d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
20769d25917dSJussi Kivilinna 				},
20779d25917dSJussi Kivilinna 				.dec = {
20789d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
20799d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
20809d25917dSJussi Kivilinna 				}
20819d25917dSJussi Kivilinna 			}
20829d25917dSJussi Kivilinna 		}
20839d25917dSJussi Kivilinna 	}, {
2084573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2085573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2086573da620SJussi Kivilinna 		.suite = {
2087573da620SJussi Kivilinna 			.cipher = {
2088573da620SJussi Kivilinna 				.enc = {
2089573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2090573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2091573da620SJussi Kivilinna 				},
2092573da620SJussi Kivilinna 				.dec = {
2093573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2094573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2095573da620SJussi Kivilinna 				}
2096573da620SJussi Kivilinna 			}
2097573da620SJussi Kivilinna 		}
2098573da620SJussi Kivilinna 	}, {
2099da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
21001aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2101da7f033dSHerbert Xu 		.suite = {
2102da7f033dSHerbert Xu 			.cipher = {
2103da7f033dSHerbert Xu 				.enc = {
2104da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2105da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2106da7f033dSHerbert Xu 				},
2107da7f033dSHerbert Xu 				.dec = {
2108da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2109da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2110da7f033dSHerbert Xu 				}
2111da7f033dSHerbert Xu 			}
2112da7f033dSHerbert Xu 		}
2113da7f033dSHerbert Xu 	}, {
2114da7f033dSHerbert Xu 		.alg = "deflate",
2115da7f033dSHerbert Xu 		.test = alg_test_comp,
21160818904dSMilan Broz 		.fips_allowed = 1,
2117da7f033dSHerbert Xu 		.suite = {
2118da7f033dSHerbert Xu 			.comp = {
2119da7f033dSHerbert Xu 				.comp = {
2120da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2121da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2122da7f033dSHerbert Xu 				},
2123da7f033dSHerbert Xu 				.decomp = {
2124da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2125da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2126da7f033dSHerbert Xu 				}
2127da7f033dSHerbert Xu 			}
2128da7f033dSHerbert Xu 		}
2129da7f033dSHerbert Xu 	}, {
2130863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2131863b557aSYouquan, Song 		.test = alg_test_null,
21326c79294fSMilan Broz 		.fips_allowed = 1,
2133863b557aSYouquan, Song 	}, {
2134da7f033dSHerbert Xu 		.alg = "ecb(aes)",
21351aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2136a1915d51SJarod Wilson 		.fips_allowed = 1,
2137da7f033dSHerbert Xu 		.suite = {
2138da7f033dSHerbert Xu 			.cipher = {
2139da7f033dSHerbert Xu 				.enc = {
2140da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2141da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2142da7f033dSHerbert Xu 				},
2143da7f033dSHerbert Xu 				.dec = {
2144da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2145da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2146da7f033dSHerbert Xu 				}
2147da7f033dSHerbert Xu 			}
2148da7f033dSHerbert Xu 		}
2149da7f033dSHerbert Xu 	}, {
2150da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
21511aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2152da7f033dSHerbert Xu 		.suite = {
2153da7f033dSHerbert Xu 			.cipher = {
2154da7f033dSHerbert Xu 				.enc = {
2155da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2156da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2157da7f033dSHerbert Xu 				},
2158da7f033dSHerbert Xu 				.dec = {
2159da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2160da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2161da7f033dSHerbert Xu 				}
2162da7f033dSHerbert Xu 			}
2163da7f033dSHerbert Xu 		}
2164da7f033dSHerbert Xu 	}, {
2165da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
21661aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2167da7f033dSHerbert Xu 		.suite = {
2168da7f033dSHerbert Xu 			.cipher = {
2169da7f033dSHerbert Xu 				.enc = {
2170da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2171da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2172da7f033dSHerbert Xu 				},
2173da7f033dSHerbert Xu 				.dec = {
2174da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2175da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2176da7f033dSHerbert Xu 				}
2177da7f033dSHerbert Xu 			}
2178da7f033dSHerbert Xu 		}
2179da7f033dSHerbert Xu 	}, {
2180da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
21811aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2182da7f033dSHerbert Xu 		.suite = {
2183da7f033dSHerbert Xu 			.cipher = {
2184da7f033dSHerbert Xu 				.enc = {
2185da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2186da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2187da7f033dSHerbert Xu 				},
2188da7f033dSHerbert Xu 				.dec = {
2189da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2190da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2191da7f033dSHerbert Xu 				}
2192da7f033dSHerbert Xu 			}
2193da7f033dSHerbert Xu 		}
2194da7f033dSHerbert Xu 	}, {
2195da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
21961aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2197da7f033dSHerbert Xu 		.suite = {
2198da7f033dSHerbert Xu 			.cipher = {
2199da7f033dSHerbert Xu 				.enc = {
2200da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2201da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2202da7f033dSHerbert Xu 				},
2203da7f033dSHerbert Xu 				.dec = {
2204da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2205da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2206da7f033dSHerbert Xu 				}
2207da7f033dSHerbert Xu 			}
2208da7f033dSHerbert Xu 		}
2209da7f033dSHerbert Xu 	}, {
2210da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
22111aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2212da7f033dSHerbert Xu 		.suite = {
2213da7f033dSHerbert Xu 			.cipher = {
2214da7f033dSHerbert Xu 				.enc = {
2215da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2216da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2217da7f033dSHerbert Xu 				},
2218da7f033dSHerbert Xu 				.dec = {
2219da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2220da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2221da7f033dSHerbert Xu 				}
2222da7f033dSHerbert Xu 			}
2223da7f033dSHerbert Xu 		}
2224da7f033dSHerbert Xu 	}, {
2225da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
22261aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2227da7f033dSHerbert Xu 		.suite = {
2228da7f033dSHerbert Xu 			.cipher = {
2229da7f033dSHerbert Xu 				.enc = {
2230da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2231da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
2232da7f033dSHerbert Xu 				},
2233da7f033dSHerbert Xu 				.dec = {
2234da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
2235da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
2236da7f033dSHerbert Xu 				}
2237da7f033dSHerbert Xu 			}
2238da7f033dSHerbert Xu 		}
2239da7f033dSHerbert Xu 	}, {
2240da7f033dSHerbert Xu 		.alg = "ecb(des)",
22411aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2242a1915d51SJarod Wilson 		.fips_allowed = 1,
2243da7f033dSHerbert Xu 		.suite = {
2244da7f033dSHerbert Xu 			.cipher = {
2245da7f033dSHerbert Xu 				.enc = {
2246da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
2247da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
2248da7f033dSHerbert Xu 				},
2249da7f033dSHerbert Xu 				.dec = {
2250da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
2251da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
2252da7f033dSHerbert Xu 				}
2253da7f033dSHerbert Xu 			}
2254da7f033dSHerbert Xu 		}
2255da7f033dSHerbert Xu 	}, {
2256da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
22571aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2258a1915d51SJarod Wilson 		.fips_allowed = 1,
2259da7f033dSHerbert Xu 		.suite = {
2260da7f033dSHerbert Xu 			.cipher = {
2261da7f033dSHerbert Xu 				.enc = {
2262da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
2263da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
2264da7f033dSHerbert Xu 				},
2265da7f033dSHerbert Xu 				.dec = {
2266da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
2267da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
2268da7f033dSHerbert Xu 				}
2269da7f033dSHerbert Xu 			}
2270da7f033dSHerbert Xu 		}
2271da7f033dSHerbert Xu 	}, {
227266e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
227366e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
227466e5bd00SJussi Kivilinna 		.suite = {
227566e5bd00SJussi Kivilinna 			.cipher = {
227666e5bd00SJussi Kivilinna 				.enc = {
227766e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
227866e5bd00SJussi Kivilinna 					.count = 1
227966e5bd00SJussi Kivilinna 				},
228066e5bd00SJussi Kivilinna 				.dec = {
228166e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
228266e5bd00SJussi Kivilinna 					.count = 1
228366e5bd00SJussi Kivilinna 				}
228466e5bd00SJussi Kivilinna 			}
228566e5bd00SJussi Kivilinna 		}
228666e5bd00SJussi Kivilinna 	}, {
2287da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
22881aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2289da7f033dSHerbert Xu 		.suite = {
2290da7f033dSHerbert Xu 			.cipher = {
2291da7f033dSHerbert Xu 				.enc = {
2292da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
2293da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
2294da7f033dSHerbert Xu 				},
2295da7f033dSHerbert Xu 				.dec = {
2296da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
2297da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
2298da7f033dSHerbert Xu 				}
2299da7f033dSHerbert Xu 			}
2300da7f033dSHerbert Xu 		}
2301da7f033dSHerbert Xu 	}, {
2302da7f033dSHerbert Xu 		.alg = "ecb(seed)",
23031aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2304da7f033dSHerbert Xu 		.suite = {
2305da7f033dSHerbert Xu 			.cipher = {
2306da7f033dSHerbert Xu 				.enc = {
2307da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
2308da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
2309da7f033dSHerbert Xu 				},
2310da7f033dSHerbert Xu 				.dec = {
2311da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
2312da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
2313da7f033dSHerbert Xu 				}
2314da7f033dSHerbert Xu 			}
2315da7f033dSHerbert Xu 		}
2316da7f033dSHerbert Xu 	}, {
2317da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
23181aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2319da7f033dSHerbert Xu 		.suite = {
2320da7f033dSHerbert Xu 			.cipher = {
2321da7f033dSHerbert Xu 				.enc = {
2322da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
2323da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
2324da7f033dSHerbert Xu 				},
2325da7f033dSHerbert Xu 				.dec = {
2326da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
2327da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
2328da7f033dSHerbert Xu 				}
2329da7f033dSHerbert Xu 			}
2330da7f033dSHerbert Xu 		}
2331da7f033dSHerbert Xu 	}, {
2332da7f033dSHerbert Xu 		.alg = "ecb(tea)",
23331aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2334da7f033dSHerbert Xu 		.suite = {
2335da7f033dSHerbert Xu 			.cipher = {
2336da7f033dSHerbert Xu 				.enc = {
2337da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
2338da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
2339da7f033dSHerbert Xu 				},
2340da7f033dSHerbert Xu 				.dec = {
2341da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
2342da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
2343da7f033dSHerbert Xu 				}
2344da7f033dSHerbert Xu 			}
2345da7f033dSHerbert Xu 		}
2346da7f033dSHerbert Xu 	}, {
2347da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
23481aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2349da7f033dSHerbert Xu 		.suite = {
2350da7f033dSHerbert Xu 			.cipher = {
2351da7f033dSHerbert Xu 				.enc = {
2352da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
2353da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
2354da7f033dSHerbert Xu 				},
2355da7f033dSHerbert Xu 				.dec = {
2356da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
2357da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
2358da7f033dSHerbert Xu 				}
2359da7f033dSHerbert Xu 			}
2360da7f033dSHerbert Xu 		}
2361da7f033dSHerbert Xu 	}, {
2362da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
23631aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2364da7f033dSHerbert Xu 		.suite = {
2365da7f033dSHerbert Xu 			.cipher = {
2366da7f033dSHerbert Xu 				.enc = {
2367da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
2368da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
2369da7f033dSHerbert Xu 				},
2370da7f033dSHerbert Xu 				.dec = {
2371da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
2372da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
2373da7f033dSHerbert Xu 				}
2374da7f033dSHerbert Xu 			}
2375da7f033dSHerbert Xu 		}
2376da7f033dSHerbert Xu 	}, {
2377da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
23781aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2379da7f033dSHerbert Xu 		.suite = {
2380da7f033dSHerbert Xu 			.cipher = {
2381da7f033dSHerbert Xu 				.enc = {
2382da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
2383da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
2384da7f033dSHerbert Xu 				},
2385da7f033dSHerbert Xu 				.dec = {
2386da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
2387da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
2388da7f033dSHerbert Xu 				}
2389da7f033dSHerbert Xu 			}
2390da7f033dSHerbert Xu 		}
2391da7f033dSHerbert Xu 	}, {
2392da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
23931aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2394da7f033dSHerbert Xu 		.suite = {
2395da7f033dSHerbert Xu 			.cipher = {
2396da7f033dSHerbert Xu 				.enc = {
2397da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
2398da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
2399da7f033dSHerbert Xu 				},
2400da7f033dSHerbert Xu 				.dec = {
2401da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
2402da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
2403da7f033dSHerbert Xu 				}
2404da7f033dSHerbert Xu 			}
2405da7f033dSHerbert Xu 		}
2406da7f033dSHerbert Xu 	}, {
2407da7f033dSHerbert Xu 		.alg = "gcm(aes)",
2408da7f033dSHerbert Xu 		.test = alg_test_aead,
2409a1915d51SJarod Wilson 		.fips_allowed = 1,
2410da7f033dSHerbert Xu 		.suite = {
2411da7f033dSHerbert Xu 			.aead = {
2412da7f033dSHerbert Xu 				.enc = {
2413da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
2414da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
2415da7f033dSHerbert Xu 				},
2416da7f033dSHerbert Xu 				.dec = {
2417da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
2418da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
2419da7f033dSHerbert Xu 				}
2420da7f033dSHerbert Xu 			}
2421da7f033dSHerbert Xu 		}
2422da7f033dSHerbert Xu 	}, {
2423507069c9SYouquan, Song 		.alg = "ghash",
2424507069c9SYouquan, Song 		.test = alg_test_hash,
242518c0ebd2SJarod Wilson 		.fips_allowed = 1,
2426507069c9SYouquan, Song 		.suite = {
2427507069c9SYouquan, Song 			.hash = {
2428507069c9SYouquan, Song 				.vecs = ghash_tv_template,
2429507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
2430507069c9SYouquan, Song 			}
2431507069c9SYouquan, Song 		}
2432507069c9SYouquan, Song 	}, {
2433a482b081SSonic Zhang 		.alg = "hmac(crc32)",
2434a482b081SSonic Zhang 		.test = alg_test_hash,
2435a482b081SSonic Zhang 		.suite = {
2436a482b081SSonic Zhang 			.hash = {
2437a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
2438a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
2439a482b081SSonic Zhang 			}
2440a482b081SSonic Zhang 		}
2441a482b081SSonic Zhang 	}, {
2442da7f033dSHerbert Xu 		.alg = "hmac(md5)",
2443da7f033dSHerbert Xu 		.test = alg_test_hash,
2444da7f033dSHerbert Xu 		.suite = {
2445da7f033dSHerbert Xu 			.hash = {
2446da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
2447da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
2448da7f033dSHerbert Xu 			}
2449da7f033dSHerbert Xu 		}
2450da7f033dSHerbert Xu 	}, {
2451da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
2452da7f033dSHerbert Xu 		.test = alg_test_hash,
2453da7f033dSHerbert Xu 		.suite = {
2454da7f033dSHerbert Xu 			.hash = {
2455da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
2456da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
2457da7f033dSHerbert Xu 			}
2458da7f033dSHerbert Xu 		}
2459da7f033dSHerbert Xu 	}, {
2460da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
2461da7f033dSHerbert Xu 		.test = alg_test_hash,
2462da7f033dSHerbert Xu 		.suite = {
2463da7f033dSHerbert Xu 			.hash = {
2464da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
2465da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
2466da7f033dSHerbert Xu 			}
2467da7f033dSHerbert Xu 		}
2468da7f033dSHerbert Xu 	}, {
2469da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
2470da7f033dSHerbert Xu 		.test = alg_test_hash,
2471a1915d51SJarod Wilson 		.fips_allowed = 1,
2472da7f033dSHerbert Xu 		.suite = {
2473da7f033dSHerbert Xu 			.hash = {
2474da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
2475da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
2476da7f033dSHerbert Xu 			}
2477da7f033dSHerbert Xu 		}
2478da7f033dSHerbert Xu 	}, {
2479da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
2480da7f033dSHerbert Xu 		.test = alg_test_hash,
2481a1915d51SJarod Wilson 		.fips_allowed = 1,
2482da7f033dSHerbert Xu 		.suite = {
2483da7f033dSHerbert Xu 			.hash = {
2484da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
2485da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
2486da7f033dSHerbert Xu 			}
2487da7f033dSHerbert Xu 		}
2488da7f033dSHerbert Xu 	}, {
2489da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
2490da7f033dSHerbert Xu 		.test = alg_test_hash,
2491a1915d51SJarod Wilson 		.fips_allowed = 1,
2492da7f033dSHerbert Xu 		.suite = {
2493da7f033dSHerbert Xu 			.hash = {
2494da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
2495da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
2496da7f033dSHerbert Xu 			}
2497da7f033dSHerbert Xu 		}
2498da7f033dSHerbert Xu 	}, {
2499da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
2500da7f033dSHerbert Xu 		.test = alg_test_hash,
2501a1915d51SJarod Wilson 		.fips_allowed = 1,
2502da7f033dSHerbert Xu 		.suite = {
2503da7f033dSHerbert Xu 			.hash = {
2504da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
2505da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
2506da7f033dSHerbert Xu 			}
2507da7f033dSHerbert Xu 		}
2508da7f033dSHerbert Xu 	}, {
2509da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
2510da7f033dSHerbert Xu 		.test = alg_test_hash,
2511a1915d51SJarod Wilson 		.fips_allowed = 1,
2512da7f033dSHerbert Xu 		.suite = {
2513da7f033dSHerbert Xu 			.hash = {
2514da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
2515da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
2516da7f033dSHerbert Xu 			}
2517da7f033dSHerbert Xu 		}
2518da7f033dSHerbert Xu 	}, {
2519da7f033dSHerbert Xu 		.alg = "lrw(aes)",
25201aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2521da7f033dSHerbert Xu 		.suite = {
2522da7f033dSHerbert Xu 			.cipher = {
2523da7f033dSHerbert Xu 				.enc = {
2524da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
2525da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
2526da7f033dSHerbert Xu 				},
2527da7f033dSHerbert Xu 				.dec = {
2528da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
2529da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
2530da7f033dSHerbert Xu 				}
2531da7f033dSHerbert Xu 			}
2532da7f033dSHerbert Xu 		}
2533da7f033dSHerbert Xu 	}, {
25340840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
25350840605eSJussi Kivilinna 		.test = alg_test_skcipher,
25360840605eSJussi Kivilinna 		.suite = {
25370840605eSJussi Kivilinna 			.cipher = {
25380840605eSJussi Kivilinna 				.enc = {
25390840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
25400840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
25410840605eSJussi Kivilinna 				},
25420840605eSJussi Kivilinna 				.dec = {
25430840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
25440840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
25450840605eSJussi Kivilinna 				}
25460840605eSJussi Kivilinna 			}
25470840605eSJussi Kivilinna 		}
25480840605eSJussi Kivilinna 	}, {
25499b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
25509b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
25519b8b0405SJohannes Goetzfried 		.suite = {
25529b8b0405SJohannes Goetzfried 			.cipher = {
25539b8b0405SJohannes Goetzfried 				.enc = {
25549b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
25559b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
25569b8b0405SJohannes Goetzfried 				},
25579b8b0405SJohannes Goetzfried 				.dec = {
25589b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
25599b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
25609b8b0405SJohannes Goetzfried 				}
25619b8b0405SJohannes Goetzfried 			}
25629b8b0405SJohannes Goetzfried 		}
25639b8b0405SJohannes Goetzfried 	}, {
2564d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
2565d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
2566d7bfc0faSJussi Kivilinna 		.suite = {
2567d7bfc0faSJussi Kivilinna 			.cipher = {
2568d7bfc0faSJussi Kivilinna 				.enc = {
2569d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
2570d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
2571d7bfc0faSJussi Kivilinna 				},
2572d7bfc0faSJussi Kivilinna 				.dec = {
2573d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
2574d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
2575d7bfc0faSJussi Kivilinna 				}
2576d7bfc0faSJussi Kivilinna 			}
2577d7bfc0faSJussi Kivilinna 		}
2578d7bfc0faSJussi Kivilinna 	}, {
25790b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
25800b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
25810b2a1551SJussi Kivilinna 		.suite = {
25820b2a1551SJussi Kivilinna 			.cipher = {
25830b2a1551SJussi Kivilinna 				.enc = {
25840b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
25850b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
25860b2a1551SJussi Kivilinna 				},
25870b2a1551SJussi Kivilinna 				.dec = {
25880b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
25890b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
25900b2a1551SJussi Kivilinna 				}
25910b2a1551SJussi Kivilinna 			}
25920b2a1551SJussi Kivilinna 		}
25930b2a1551SJussi Kivilinna 	}, {
2594da7f033dSHerbert Xu 		.alg = "lzo",
2595da7f033dSHerbert Xu 		.test = alg_test_comp,
25960818904dSMilan Broz 		.fips_allowed = 1,
2597da7f033dSHerbert Xu 		.suite = {
2598da7f033dSHerbert Xu 			.comp = {
2599da7f033dSHerbert Xu 				.comp = {
2600da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
2601da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
2602da7f033dSHerbert Xu 				},
2603da7f033dSHerbert Xu 				.decomp = {
2604da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
2605da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
2606da7f033dSHerbert Xu 				}
2607da7f033dSHerbert Xu 			}
2608da7f033dSHerbert Xu 		}
2609da7f033dSHerbert Xu 	}, {
2610da7f033dSHerbert Xu 		.alg = "md4",
2611da7f033dSHerbert Xu 		.test = alg_test_hash,
2612da7f033dSHerbert Xu 		.suite = {
2613da7f033dSHerbert Xu 			.hash = {
2614da7f033dSHerbert Xu 				.vecs = md4_tv_template,
2615da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
2616da7f033dSHerbert Xu 			}
2617da7f033dSHerbert Xu 		}
2618da7f033dSHerbert Xu 	}, {
2619da7f033dSHerbert Xu 		.alg = "md5",
2620da7f033dSHerbert Xu 		.test = alg_test_hash,
2621da7f033dSHerbert Xu 		.suite = {
2622da7f033dSHerbert Xu 			.hash = {
2623da7f033dSHerbert Xu 				.vecs = md5_tv_template,
2624da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
2625da7f033dSHerbert Xu 			}
2626da7f033dSHerbert Xu 		}
2627da7f033dSHerbert Xu 	}, {
2628da7f033dSHerbert Xu 		.alg = "michael_mic",
2629da7f033dSHerbert Xu 		.test = alg_test_hash,
2630da7f033dSHerbert Xu 		.suite = {
2631da7f033dSHerbert Xu 			.hash = {
2632da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
2633da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
2634da7f033dSHerbert Xu 			}
2635da7f033dSHerbert Xu 		}
2636da7f033dSHerbert Xu 	}, {
2637ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
2638ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
2639ba0e14acSPuneet Saxena 		.fips_allowed = 1,
2640ba0e14acSPuneet Saxena 		.suite = {
2641ba0e14acSPuneet Saxena 			.cipher = {
2642ba0e14acSPuneet Saxena 				.enc = {
2643ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
2644ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
2645ba0e14acSPuneet Saxena 				},
2646ba0e14acSPuneet Saxena 				.dec = {
2647ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
2648ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
2649ba0e14acSPuneet Saxena 				}
2650ba0e14acSPuneet Saxena 			}
2651ba0e14acSPuneet Saxena 		}
2652ba0e14acSPuneet Saxena 	}, {
2653da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
26541aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2655da7f033dSHerbert Xu 		.suite = {
2656da7f033dSHerbert Xu 			.cipher = {
2657da7f033dSHerbert Xu 				.enc = {
2658da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
2659da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
2660da7f033dSHerbert Xu 				},
2661da7f033dSHerbert Xu 				.dec = {
2662da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
2663da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
2664da7f033dSHerbert Xu 				}
2665da7f033dSHerbert Xu 			}
2666da7f033dSHerbert Xu 		}
2667da7f033dSHerbert Xu 	}, {
2668da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
26691aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2670a1915d51SJarod Wilson 		.fips_allowed = 1,
2671da7f033dSHerbert Xu 		.suite = {
2672da7f033dSHerbert Xu 			.cipher = {
2673da7f033dSHerbert Xu 				.enc = {
2674f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
2675f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
2676da7f033dSHerbert Xu 				},
2677da7f033dSHerbert Xu 				.dec = {
2678f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
2679f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
2680da7f033dSHerbert Xu 				}
2681da7f033dSHerbert Xu 			}
2682da7f033dSHerbert Xu 		}
2683da7f033dSHerbert Xu 	}, {
268469435b94SAdrian Hoban 		.alg = "rfc4106(gcm(aes))",
268569435b94SAdrian Hoban 		.test = alg_test_aead,
268669435b94SAdrian Hoban 		.suite = {
268769435b94SAdrian Hoban 			.aead = {
268869435b94SAdrian Hoban 				.enc = {
268969435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
269069435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
269169435b94SAdrian Hoban 				},
269269435b94SAdrian Hoban 				.dec = {
269369435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
269469435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
269569435b94SAdrian Hoban 				}
269669435b94SAdrian Hoban 			}
269769435b94SAdrian Hoban 		}
269869435b94SAdrian Hoban 	}, {
269969435b94SAdrian Hoban 
270069435b94SAdrian Hoban 
27015d667322SJarod Wilson 		.alg = "rfc4309(ccm(aes))",
27025d667322SJarod Wilson 		.test = alg_test_aead,
2703a1915d51SJarod Wilson 		.fips_allowed = 1,
27045d667322SJarod Wilson 		.suite = {
27055d667322SJarod Wilson 			.aead = {
27065d667322SJarod Wilson 				.enc = {
27075d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
27085d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
27095d667322SJarod Wilson 				},
27105d667322SJarod Wilson 				.dec = {
27115d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
27125d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
27135d667322SJarod Wilson 				}
27145d667322SJarod Wilson 			}
27155d667322SJarod Wilson 		}
27165d667322SJarod Wilson 	}, {
2717da7f033dSHerbert Xu 		.alg = "rmd128",
2718da7f033dSHerbert Xu 		.test = alg_test_hash,
2719da7f033dSHerbert Xu 		.suite = {
2720da7f033dSHerbert Xu 			.hash = {
2721da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
2722da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
2723da7f033dSHerbert Xu 			}
2724da7f033dSHerbert Xu 		}
2725da7f033dSHerbert Xu 	}, {
2726da7f033dSHerbert Xu 		.alg = "rmd160",
2727da7f033dSHerbert Xu 		.test = alg_test_hash,
2728da7f033dSHerbert Xu 		.suite = {
2729da7f033dSHerbert Xu 			.hash = {
2730da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
2731da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
2732da7f033dSHerbert Xu 			}
2733da7f033dSHerbert Xu 		}
2734da7f033dSHerbert Xu 	}, {
2735da7f033dSHerbert Xu 		.alg = "rmd256",
2736da7f033dSHerbert Xu 		.test = alg_test_hash,
2737da7f033dSHerbert Xu 		.suite = {
2738da7f033dSHerbert Xu 			.hash = {
2739da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
2740da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
2741da7f033dSHerbert Xu 			}
2742da7f033dSHerbert Xu 		}
2743da7f033dSHerbert Xu 	}, {
2744da7f033dSHerbert Xu 		.alg = "rmd320",
2745da7f033dSHerbert Xu 		.test = alg_test_hash,
2746da7f033dSHerbert Xu 		.suite = {
2747da7f033dSHerbert Xu 			.hash = {
2748da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
2749da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
2750da7f033dSHerbert Xu 			}
2751da7f033dSHerbert Xu 		}
2752da7f033dSHerbert Xu 	}, {
2753da7f033dSHerbert Xu 		.alg = "salsa20",
27541aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2755da7f033dSHerbert Xu 		.suite = {
2756da7f033dSHerbert Xu 			.cipher = {
2757da7f033dSHerbert Xu 				.enc = {
2758da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
2759da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
2760da7f033dSHerbert Xu 				}
2761da7f033dSHerbert Xu 			}
2762da7f033dSHerbert Xu 		}
2763da7f033dSHerbert Xu 	}, {
2764da7f033dSHerbert Xu 		.alg = "sha1",
2765da7f033dSHerbert Xu 		.test = alg_test_hash,
2766a1915d51SJarod Wilson 		.fips_allowed = 1,
2767da7f033dSHerbert Xu 		.suite = {
2768da7f033dSHerbert Xu 			.hash = {
2769da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
2770da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
2771da7f033dSHerbert Xu 			}
2772da7f033dSHerbert Xu 		}
2773da7f033dSHerbert Xu 	}, {
2774da7f033dSHerbert Xu 		.alg = "sha224",
2775da7f033dSHerbert Xu 		.test = alg_test_hash,
2776a1915d51SJarod Wilson 		.fips_allowed = 1,
2777da7f033dSHerbert Xu 		.suite = {
2778da7f033dSHerbert Xu 			.hash = {
2779da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
2780da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
2781da7f033dSHerbert Xu 			}
2782da7f033dSHerbert Xu 		}
2783da7f033dSHerbert Xu 	}, {
2784da7f033dSHerbert Xu 		.alg = "sha256",
2785da7f033dSHerbert Xu 		.test = alg_test_hash,
2786a1915d51SJarod Wilson 		.fips_allowed = 1,
2787da7f033dSHerbert Xu 		.suite = {
2788da7f033dSHerbert Xu 			.hash = {
2789da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
2790da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
2791da7f033dSHerbert Xu 			}
2792da7f033dSHerbert Xu 		}
2793da7f033dSHerbert Xu 	}, {
2794da7f033dSHerbert Xu 		.alg = "sha384",
2795da7f033dSHerbert Xu 		.test = alg_test_hash,
2796a1915d51SJarod Wilson 		.fips_allowed = 1,
2797da7f033dSHerbert Xu 		.suite = {
2798da7f033dSHerbert Xu 			.hash = {
2799da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
2800da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
2801da7f033dSHerbert Xu 			}
2802da7f033dSHerbert Xu 		}
2803da7f033dSHerbert Xu 	}, {
2804da7f033dSHerbert Xu 		.alg = "sha512",
2805da7f033dSHerbert Xu 		.test = alg_test_hash,
2806a1915d51SJarod Wilson 		.fips_allowed = 1,
2807da7f033dSHerbert Xu 		.suite = {
2808da7f033dSHerbert Xu 			.hash = {
2809da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
2810da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
2811da7f033dSHerbert Xu 			}
2812da7f033dSHerbert Xu 		}
2813da7f033dSHerbert Xu 	}, {
2814da7f033dSHerbert Xu 		.alg = "tgr128",
2815da7f033dSHerbert Xu 		.test = alg_test_hash,
2816da7f033dSHerbert Xu 		.suite = {
2817da7f033dSHerbert Xu 			.hash = {
2818da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
2819da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
2820da7f033dSHerbert Xu 			}
2821da7f033dSHerbert Xu 		}
2822da7f033dSHerbert Xu 	}, {
2823da7f033dSHerbert Xu 		.alg = "tgr160",
2824da7f033dSHerbert Xu 		.test = alg_test_hash,
2825da7f033dSHerbert Xu 		.suite = {
2826da7f033dSHerbert Xu 			.hash = {
2827da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
2828da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
2829da7f033dSHerbert Xu 			}
2830da7f033dSHerbert Xu 		}
2831da7f033dSHerbert Xu 	}, {
2832da7f033dSHerbert Xu 		.alg = "tgr192",
2833da7f033dSHerbert Xu 		.test = alg_test_hash,
2834da7f033dSHerbert Xu 		.suite = {
2835da7f033dSHerbert Xu 			.hash = {
2836da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
2837da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
2838da7f033dSHerbert Xu 			}
2839da7f033dSHerbert Xu 		}
2840da7f033dSHerbert Xu 	}, {
2841f1939f7cSShane Wang 		.alg = "vmac(aes)",
2842f1939f7cSShane Wang 		.test = alg_test_hash,
2843f1939f7cSShane Wang 		.suite = {
2844f1939f7cSShane Wang 			.hash = {
2845f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
2846f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
2847f1939f7cSShane Wang 			}
2848f1939f7cSShane Wang 		}
2849f1939f7cSShane Wang 	}, {
2850da7f033dSHerbert Xu 		.alg = "wp256",
2851da7f033dSHerbert Xu 		.test = alg_test_hash,
2852da7f033dSHerbert Xu 		.suite = {
2853da7f033dSHerbert Xu 			.hash = {
2854da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
2855da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
2856da7f033dSHerbert Xu 			}
2857da7f033dSHerbert Xu 		}
2858da7f033dSHerbert Xu 	}, {
2859da7f033dSHerbert Xu 		.alg = "wp384",
2860da7f033dSHerbert Xu 		.test = alg_test_hash,
2861da7f033dSHerbert Xu 		.suite = {
2862da7f033dSHerbert Xu 			.hash = {
2863da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
2864da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
2865da7f033dSHerbert Xu 			}
2866da7f033dSHerbert Xu 		}
2867da7f033dSHerbert Xu 	}, {
2868da7f033dSHerbert Xu 		.alg = "wp512",
2869da7f033dSHerbert Xu 		.test = alg_test_hash,
2870da7f033dSHerbert Xu 		.suite = {
2871da7f033dSHerbert Xu 			.hash = {
2872da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
2873da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
2874da7f033dSHerbert Xu 			}
2875da7f033dSHerbert Xu 		}
2876da7f033dSHerbert Xu 	}, {
2877da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
2878da7f033dSHerbert Xu 		.test = alg_test_hash,
2879da7f033dSHerbert Xu 		.suite = {
2880da7f033dSHerbert Xu 			.hash = {
2881da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
2882da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
2883da7f033dSHerbert Xu 			}
2884da7f033dSHerbert Xu 		}
2885da7f033dSHerbert Xu 	}, {
2886da7f033dSHerbert Xu 		.alg = "xts(aes)",
28871aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
28882918aa8dSJarod Wilson 		.fips_allowed = 1,
2889da7f033dSHerbert Xu 		.suite = {
2890da7f033dSHerbert Xu 			.cipher = {
2891da7f033dSHerbert Xu 				.enc = {
2892da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
2893da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
2894da7f033dSHerbert Xu 				},
2895da7f033dSHerbert Xu 				.dec = {
2896da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
2897da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
2898da7f033dSHerbert Xu 				}
2899da7f033dSHerbert Xu 			}
2900da7f033dSHerbert Xu 		}
29010c01aed5SGeert Uytterhoeven 	}, {
29020840605eSJussi Kivilinna 		.alg = "xts(camellia)",
29030840605eSJussi Kivilinna 		.test = alg_test_skcipher,
29040840605eSJussi Kivilinna 		.suite = {
29050840605eSJussi Kivilinna 			.cipher = {
29060840605eSJussi Kivilinna 				.enc = {
29070840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
29080840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
29090840605eSJussi Kivilinna 				},
29100840605eSJussi Kivilinna 				.dec = {
29110840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
29120840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
29130840605eSJussi Kivilinna 				}
29140840605eSJussi Kivilinna 			}
29150840605eSJussi Kivilinna 		}
29160840605eSJussi Kivilinna 	}, {
29179b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
29189b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
29199b8b0405SJohannes Goetzfried 		.suite = {
29209b8b0405SJohannes Goetzfried 			.cipher = {
29219b8b0405SJohannes Goetzfried 				.enc = {
29229b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
29239b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
29249b8b0405SJohannes Goetzfried 				},
29259b8b0405SJohannes Goetzfried 				.dec = {
29269b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
29279b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
29289b8b0405SJohannes Goetzfried 				}
29299b8b0405SJohannes Goetzfried 			}
29309b8b0405SJohannes Goetzfried 		}
29319b8b0405SJohannes Goetzfried 	}, {
293218be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
293318be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
293418be20b9SJussi Kivilinna 		.suite = {
293518be20b9SJussi Kivilinna 			.cipher = {
293618be20b9SJussi Kivilinna 				.enc = {
293718be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
293818be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
293918be20b9SJussi Kivilinna 				},
294018be20b9SJussi Kivilinna 				.dec = {
294118be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
294218be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
294318be20b9SJussi Kivilinna 				}
294418be20b9SJussi Kivilinna 			}
294518be20b9SJussi Kivilinna 		}
294618be20b9SJussi Kivilinna 	}, {
2947aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
2948aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
2949aed265b9SJussi Kivilinna 		.suite = {
2950aed265b9SJussi Kivilinna 			.cipher = {
2951aed265b9SJussi Kivilinna 				.enc = {
2952aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
2953aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
2954aed265b9SJussi Kivilinna 				},
2955aed265b9SJussi Kivilinna 				.dec = {
2956aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
2957aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
2958aed265b9SJussi Kivilinna 				}
2959aed265b9SJussi Kivilinna 			}
2960aed265b9SJussi Kivilinna 		}
2961aed265b9SJussi Kivilinna 	}, {
29620c01aed5SGeert Uytterhoeven 		.alg = "zlib",
29630c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
29640818904dSMilan Broz 		.fips_allowed = 1,
29650c01aed5SGeert Uytterhoeven 		.suite = {
29660c01aed5SGeert Uytterhoeven 			.pcomp = {
29670c01aed5SGeert Uytterhoeven 				.comp = {
29680c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
29690c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
29700c01aed5SGeert Uytterhoeven 				},
29710c01aed5SGeert Uytterhoeven 				.decomp = {
29720c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
29730c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
29740c01aed5SGeert Uytterhoeven 				}
29750c01aed5SGeert Uytterhoeven 			}
29760c01aed5SGeert Uytterhoeven 		}
2977da7f033dSHerbert Xu 	}
2978da7f033dSHerbert Xu };
2979da7f033dSHerbert Xu 
29801aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
2981da7f033dSHerbert Xu {
2982da7f033dSHerbert Xu 	int start = 0;
2983da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
2984da7f033dSHerbert Xu 
2985da7f033dSHerbert Xu 	while (start < end) {
2986da7f033dSHerbert Xu 		int i = (start + end) / 2;
2987da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
2988da7f033dSHerbert Xu 
2989da7f033dSHerbert Xu 		if (diff > 0) {
2990da7f033dSHerbert Xu 			end = i;
2991da7f033dSHerbert Xu 			continue;
2992da7f033dSHerbert Xu 		}
2993da7f033dSHerbert Xu 
2994da7f033dSHerbert Xu 		if (diff < 0) {
2995da7f033dSHerbert Xu 			start = i + 1;
2996da7f033dSHerbert Xu 			continue;
2997da7f033dSHerbert Xu 		}
2998da7f033dSHerbert Xu 
29991aa4ecd9SHerbert Xu 		return i;
3000da7f033dSHerbert Xu 	}
3001da7f033dSHerbert Xu 
30021aa4ecd9SHerbert Xu 	return -1;
30031aa4ecd9SHerbert Xu }
30041aa4ecd9SHerbert Xu 
30051aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
30061aa4ecd9SHerbert Xu {
30071aa4ecd9SHerbert Xu 	int i;
3008a68f6610SHerbert Xu 	int j;
3009d12d6b6dSNeil Horman 	int rc;
30101aa4ecd9SHerbert Xu 
30111aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
30121aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
30131aa4ecd9SHerbert Xu 
30141aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
30151aa4ecd9SHerbert Xu 		    sizeof(nalg))
30161aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
30171aa4ecd9SHerbert Xu 
30181aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
30191aa4ecd9SHerbert Xu 		if (i < 0)
30201aa4ecd9SHerbert Xu 			goto notest;
30211aa4ecd9SHerbert Xu 
3022a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3023a3bef3a3SJarod Wilson 			goto non_fips_alg;
3024a3bef3a3SJarod Wilson 
3025941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3026941fb328SJarod Wilson 		goto test_done;
30271aa4ecd9SHerbert Xu 	}
30281aa4ecd9SHerbert Xu 
30291aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3030a68f6610SHerbert Xu 	j = alg_find_test(driver);
3031a68f6610SHerbert Xu 	if (i < 0 && j < 0)
30321aa4ecd9SHerbert Xu 		goto notest;
30331aa4ecd9SHerbert Xu 
3034a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3035a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3036a3bef3a3SJarod Wilson 		goto non_fips_alg;
3037a3bef3a3SJarod Wilson 
3038a68f6610SHerbert Xu 	rc = 0;
3039a68f6610SHerbert Xu 	if (i >= 0)
3040a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
30411aa4ecd9SHerbert Xu 					     type, mask);
3042a68f6610SHerbert Xu 	if (j >= 0)
3043a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3044a68f6610SHerbert Xu 					     type, mask);
3045a68f6610SHerbert Xu 
3046941fb328SJarod Wilson test_done:
3047d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3048d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3049d12d6b6dSNeil Horman 
305029ecd4abSJarod Wilson 	if (fips_enabled && !rc)
305129ecd4abSJarod Wilson 		printk(KERN_INFO "alg: self-tests for %s (%s) passed\n",
305229ecd4abSJarod Wilson 		       driver, alg);
305329ecd4abSJarod Wilson 
3054d12d6b6dSNeil Horman 	return rc;
30551aa4ecd9SHerbert Xu 
30561aa4ecd9SHerbert Xu notest:
3057da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3058da7f033dSHerbert Xu 	return 0;
3059a3bef3a3SJarod Wilson non_fips_alg:
3060a3bef3a3SJarod Wilson 	return -EINVAL;
3061da7f033dSHerbert Xu }
30620b767f96SAlexander Shishkin 
3063326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
30640b767f96SAlexander Shishkin 
3065da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3066