xref: /openbmc/linux/crypto/testmgr.c (revision e080b17a)
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 		.suite = {
16424d6d6a2cSJohannes Goetzfried 			.cipher = {
16434d6d6a2cSJohannes Goetzfried 				.enc = {
16444d6d6a2cSJohannes Goetzfried 					.vecs = NULL,
16454d6d6a2cSJohannes Goetzfried 					.count = 0
16464d6d6a2cSJohannes Goetzfried 				},
16474d6d6a2cSJohannes Goetzfried 				.dec = {
16484d6d6a2cSJohannes Goetzfried 					.vecs = NULL,
16494d6d6a2cSJohannes Goetzfried 					.count = 0
16504d6d6a2cSJohannes Goetzfried 				}
16514d6d6a2cSJohannes Goetzfried 			}
16524d6d6a2cSJohannes Goetzfried 		}
16534d6d6a2cSJohannes Goetzfried 	}, {
16544ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
16554ea1277dSJohannes Goetzfried 		.test = alg_test_null,
16564ea1277dSJohannes Goetzfried 		.suite = {
16574ea1277dSJohannes Goetzfried 			.cipher = {
16584ea1277dSJohannes Goetzfried 				.enc = {
16594ea1277dSJohannes Goetzfried 					.vecs = NULL,
16604ea1277dSJohannes Goetzfried 					.count = 0
16614ea1277dSJohannes Goetzfried 				},
16624ea1277dSJohannes Goetzfried 				.dec = {
16634ea1277dSJohannes Goetzfried 					.vecs = NULL,
16644ea1277dSJohannes Goetzfried 					.count = 0
16654ea1277dSJohannes Goetzfried 				}
16664ea1277dSJohannes Goetzfried 			}
16674ea1277dSJohannes Goetzfried 		}
16684ea1277dSJohannes Goetzfried 	}, {
16697efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
16707efe4076SJohannes Goetzfried 		.test = alg_test_null,
16717efe4076SJohannes Goetzfried 		.suite = {
16727efe4076SJohannes Goetzfried 			.cipher = {
16737efe4076SJohannes Goetzfried 				.enc = {
16747efe4076SJohannes Goetzfried 					.vecs = NULL,
16757efe4076SJohannes Goetzfried 					.count = 0
16767efe4076SJohannes Goetzfried 				},
16777efe4076SJohannes Goetzfried 				.dec = {
16787efe4076SJohannes Goetzfried 					.vecs = NULL,
16797efe4076SJohannes Goetzfried 					.count = 0
16807efe4076SJohannes Goetzfried 				}
16817efe4076SJohannes Goetzfried 			}
16827efe4076SJohannes Goetzfried 		}
16837efe4076SJohannes Goetzfried 	}, {
1684937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
1685937c30d7SJussi Kivilinna 		.test = alg_test_null,
1686937c30d7SJussi Kivilinna 		.suite = {
1687937c30d7SJussi Kivilinna 			.cipher = {
1688937c30d7SJussi Kivilinna 				.enc = {
1689937c30d7SJussi Kivilinna 					.vecs = NULL,
1690937c30d7SJussi Kivilinna 					.count = 0
1691937c30d7SJussi Kivilinna 				},
1692937c30d7SJussi Kivilinna 				.dec = {
1693937c30d7SJussi Kivilinna 					.vecs = NULL,
1694937c30d7SJussi Kivilinna 					.count = 0
1695937c30d7SJussi Kivilinna 				}
1696937c30d7SJussi Kivilinna 			}
1697937c30d7SJussi Kivilinna 		}
1698937c30d7SJussi Kivilinna 	}, {
1699107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
1700107778b5SJohannes Goetzfried 		.test = alg_test_null,
1701107778b5SJohannes Goetzfried 		.suite = {
1702107778b5SJohannes Goetzfried 			.cipher = {
1703107778b5SJohannes Goetzfried 				.enc = {
1704107778b5SJohannes Goetzfried 					.vecs = NULL,
1705107778b5SJohannes Goetzfried 					.count = 0
1706107778b5SJohannes Goetzfried 				},
1707107778b5SJohannes Goetzfried 				.dec = {
1708107778b5SJohannes Goetzfried 					.vecs = NULL,
1709107778b5SJohannes Goetzfried 					.count = 0
1710107778b5SJohannes Goetzfried 				}
1711107778b5SJohannes Goetzfried 			}
1712107778b5SJohannes Goetzfried 		}
1713107778b5SJohannes Goetzfried 	}, {
1714863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
1715863b557aSYouquan, Song 		.test = alg_test_null,
17166c79294fSMilan Broz 		.fips_allowed = 1,
1717863b557aSYouquan, Song 		.suite = {
1718863b557aSYouquan, Song 			.cipher = {
1719863b557aSYouquan, Song 				.enc = {
1720863b557aSYouquan, Song 					.vecs = NULL,
1721863b557aSYouquan, Song 					.count = 0
1722863b557aSYouquan, Song 				},
1723863b557aSYouquan, Song 				.dec = {
1724863b557aSYouquan, Song 					.vecs = NULL,
1725863b557aSYouquan, Song 					.count = 0
1726863b557aSYouquan, Song 				}
1727863b557aSYouquan, Song 			}
1728863b557aSYouquan, Song 		}
1729863b557aSYouquan, Song 	}, {
17304d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
17314d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
17324d6d6a2cSJohannes Goetzfried 		.suite = {
17334d6d6a2cSJohannes Goetzfried 			.cipher = {
17344d6d6a2cSJohannes Goetzfried 				.enc = {
17354d6d6a2cSJohannes Goetzfried 					.vecs = NULL,
17364d6d6a2cSJohannes Goetzfried 					.count = 0
17374d6d6a2cSJohannes Goetzfried 				},
17384d6d6a2cSJohannes Goetzfried 				.dec = {
17394d6d6a2cSJohannes Goetzfried 					.vecs = NULL,
17404d6d6a2cSJohannes Goetzfried 					.count = 0
17414d6d6a2cSJohannes Goetzfried 				}
17424d6d6a2cSJohannes Goetzfried 			}
17434d6d6a2cSJohannes Goetzfried 		}
17444d6d6a2cSJohannes Goetzfried 	}, {
17454ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
17464ea1277dSJohannes Goetzfried 		.test = alg_test_null,
17474ea1277dSJohannes Goetzfried 		.suite = {
17484ea1277dSJohannes Goetzfried 			.cipher = {
17494ea1277dSJohannes Goetzfried 				.enc = {
17504ea1277dSJohannes Goetzfried 					.vecs = NULL,
17514ea1277dSJohannes Goetzfried 					.count = 0
17524ea1277dSJohannes Goetzfried 				},
17534ea1277dSJohannes Goetzfried 				.dec = {
17544ea1277dSJohannes Goetzfried 					.vecs = NULL,
17554ea1277dSJohannes Goetzfried 					.count = 0
17564ea1277dSJohannes Goetzfried 				}
17574ea1277dSJohannes Goetzfried 			}
17584ea1277dSJohannes Goetzfried 		}
17594ea1277dSJohannes Goetzfried 	}, {
17607efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
17617efe4076SJohannes Goetzfried 		.test = alg_test_null,
17627efe4076SJohannes Goetzfried 		.suite = {
17637efe4076SJohannes Goetzfried 			.cipher = {
17647efe4076SJohannes Goetzfried 				.enc = {
17657efe4076SJohannes Goetzfried 					.vecs = NULL,
17667efe4076SJohannes Goetzfried 					.count = 0
17677efe4076SJohannes Goetzfried 				},
17687efe4076SJohannes Goetzfried 				.dec = {
17697efe4076SJohannes Goetzfried 					.vecs = NULL,
17707efe4076SJohannes Goetzfried 					.count = 0
17717efe4076SJohannes Goetzfried 				}
17727efe4076SJohannes Goetzfried 			}
17737efe4076SJohannes Goetzfried 		}
17747efe4076SJohannes Goetzfried 	}, {
1775937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
1776937c30d7SJussi Kivilinna 		.test = alg_test_null,
1777937c30d7SJussi Kivilinna 		.suite = {
1778937c30d7SJussi Kivilinna 			.cipher = {
1779937c30d7SJussi Kivilinna 				.enc = {
1780937c30d7SJussi Kivilinna 					.vecs = NULL,
1781937c30d7SJussi Kivilinna 					.count = 0
1782937c30d7SJussi Kivilinna 				},
1783937c30d7SJussi Kivilinna 				.dec = {
1784937c30d7SJussi Kivilinna 					.vecs = NULL,
1785937c30d7SJussi Kivilinna 					.count = 0
1786937c30d7SJussi Kivilinna 				}
1787937c30d7SJussi Kivilinna 			}
1788937c30d7SJussi Kivilinna 		}
1789937c30d7SJussi Kivilinna 	}, {
1790107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
1791107778b5SJohannes Goetzfried 		.test = alg_test_null,
1792107778b5SJohannes Goetzfried 		.suite = {
1793107778b5SJohannes Goetzfried 			.cipher = {
1794107778b5SJohannes Goetzfried 				.enc = {
1795107778b5SJohannes Goetzfried 					.vecs = NULL,
1796107778b5SJohannes Goetzfried 					.count = 0
1797107778b5SJohannes Goetzfried 				},
1798107778b5SJohannes Goetzfried 				.dec = {
1799107778b5SJohannes Goetzfried 					.vecs = NULL,
1800107778b5SJohannes Goetzfried 					.count = 0
1801107778b5SJohannes Goetzfried 				}
1802107778b5SJohannes Goetzfried 			}
1803107778b5SJohannes Goetzfried 		}
1804107778b5SJohannes Goetzfried 	}, {
1805863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
1806863b557aSYouquan, Song 		.test = alg_test_null,
18076c79294fSMilan Broz 		.fips_allowed = 1,
1808863b557aSYouquan, Song 		.suite = {
1809863b557aSYouquan, Song 			.cipher = {
1810863b557aSYouquan, Song 				.enc = {
1811863b557aSYouquan, Song 					.vecs = NULL,
1812863b557aSYouquan, Song 					.count = 0
1813863b557aSYouquan, Song 				},
1814863b557aSYouquan, Song 				.dec = {
1815863b557aSYouquan, Song 					.vecs = NULL,
1816863b557aSYouquan, Song 					.count = 0
1817863b557aSYouquan, Song 				}
1818863b557aSYouquan, Song 			}
1819863b557aSYouquan, Song 		}
1820863b557aSYouquan, Song 	}, {
18214d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
18224d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
18234d6d6a2cSJohannes Goetzfried 		.suite = {
18244d6d6a2cSJohannes Goetzfried 			.cipher = {
18254d6d6a2cSJohannes Goetzfried 				.enc = {
18264d6d6a2cSJohannes Goetzfried 					.vecs = NULL,
18274d6d6a2cSJohannes Goetzfried 					.count = 0
18284d6d6a2cSJohannes Goetzfried 				},
18294d6d6a2cSJohannes Goetzfried 				.dec = {
18304d6d6a2cSJohannes Goetzfried 					.vecs = NULL,
18314d6d6a2cSJohannes Goetzfried 					.count = 0
18324d6d6a2cSJohannes Goetzfried 				}
18334d6d6a2cSJohannes Goetzfried 			}
18344d6d6a2cSJohannes Goetzfried 		}
18354d6d6a2cSJohannes Goetzfried 	}, {
18364ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
18374ea1277dSJohannes Goetzfried 		.test = alg_test_null,
18384ea1277dSJohannes Goetzfried 		.suite = {
18394ea1277dSJohannes Goetzfried 			.cipher = {
18404ea1277dSJohannes Goetzfried 				.enc = {
18414ea1277dSJohannes Goetzfried 					.vecs = NULL,
18424ea1277dSJohannes Goetzfried 					.count = 0
18434ea1277dSJohannes Goetzfried 				},
18444ea1277dSJohannes Goetzfried 				.dec = {
18454ea1277dSJohannes Goetzfried 					.vecs = NULL,
18464ea1277dSJohannes Goetzfried 					.count = 0
18474ea1277dSJohannes Goetzfried 				}
18484ea1277dSJohannes Goetzfried 			}
18494ea1277dSJohannes Goetzfried 		}
18504ea1277dSJohannes Goetzfried 	}, {
18517efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
18527efe4076SJohannes Goetzfried 		.test = alg_test_null,
18537efe4076SJohannes Goetzfried 		.suite = {
18547efe4076SJohannes Goetzfried 			.cipher = {
18557efe4076SJohannes Goetzfried 				.enc = {
18567efe4076SJohannes Goetzfried 					.vecs = NULL,
18577efe4076SJohannes Goetzfried 					.count = 0
18587efe4076SJohannes Goetzfried 				},
18597efe4076SJohannes Goetzfried 				.dec = {
18607efe4076SJohannes Goetzfried 					.vecs = NULL,
18617efe4076SJohannes Goetzfried 					.count = 0
18627efe4076SJohannes Goetzfried 				}
18637efe4076SJohannes Goetzfried 			}
18647efe4076SJohannes Goetzfried 		}
18657efe4076SJohannes Goetzfried 	}, {
1866937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
1867937c30d7SJussi Kivilinna 		.test = alg_test_null,
1868937c30d7SJussi Kivilinna 		.suite = {
1869937c30d7SJussi Kivilinna 			.cipher = {
1870937c30d7SJussi Kivilinna 				.enc = {
1871937c30d7SJussi Kivilinna 					.vecs = NULL,
1872937c30d7SJussi Kivilinna 					.count = 0
1873937c30d7SJussi Kivilinna 				},
1874937c30d7SJussi Kivilinna 				.dec = {
1875937c30d7SJussi Kivilinna 					.vecs = NULL,
1876937c30d7SJussi Kivilinna 					.count = 0
1877937c30d7SJussi Kivilinna 				}
1878937c30d7SJussi Kivilinna 			}
1879937c30d7SJussi Kivilinna 		}
1880937c30d7SJussi Kivilinna 	}, {
1881107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
1882107778b5SJohannes Goetzfried 		.test = alg_test_null,
1883107778b5SJohannes Goetzfried 		.suite = {
1884107778b5SJohannes Goetzfried 			.cipher = {
1885107778b5SJohannes Goetzfried 				.enc = {
1886107778b5SJohannes Goetzfried 					.vecs = NULL,
1887107778b5SJohannes Goetzfried 					.count = 0
1888107778b5SJohannes Goetzfried 				},
1889107778b5SJohannes Goetzfried 				.dec = {
1890107778b5SJohannes Goetzfried 					.vecs = NULL,
1891107778b5SJohannes Goetzfried 					.count = 0
1892107778b5SJohannes Goetzfried 				}
1893107778b5SJohannes Goetzfried 			}
1894107778b5SJohannes Goetzfried 		}
1895107778b5SJohannes Goetzfried 	}, {
1896863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
1897863b557aSYouquan, Song 		.test = alg_test_null,
18986c79294fSMilan Broz 		.fips_allowed = 1,
1899863b557aSYouquan, Song 		.suite = {
1900863b557aSYouquan, Song 			.hash = {
1901863b557aSYouquan, Song 				.vecs = NULL,
1902863b557aSYouquan, Song 				.count = 0
1903863b557aSYouquan, Song 			}
1904863b557aSYouquan, Song 		}
1905863b557aSYouquan, Song 	}, {
1906e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
1907e08ca2daSJarod Wilson 		.test = alg_test_cprng,
1908a1915d51SJarod Wilson 		.fips_allowed = 1,
1909e08ca2daSJarod Wilson 		.suite = {
1910e08ca2daSJarod Wilson 			.cprng = {
1911e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
1912e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
1913e08ca2daSJarod Wilson 			}
1914e08ca2daSJarod Wilson 		}
1915e08ca2daSJarod Wilson 	}, {
1916e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha1),cbc(aes))",
1917e46e9a46SHoria Geanta 		.test = alg_test_aead,
1918e46e9a46SHoria Geanta 		.fips_allowed = 1,
1919e46e9a46SHoria Geanta 		.suite = {
1920e46e9a46SHoria Geanta 			.aead = {
1921e46e9a46SHoria Geanta 				.enc = {
1922e46e9a46SHoria Geanta 					.vecs = hmac_sha1_aes_cbc_enc_tv_template,
1923e46e9a46SHoria Geanta 					.count = HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS
1924e46e9a46SHoria Geanta 				}
1925e46e9a46SHoria Geanta 			}
1926e46e9a46SHoria Geanta 		}
1927e46e9a46SHoria Geanta 	}, {
1928e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha256),cbc(aes))",
1929e46e9a46SHoria Geanta 		.test = alg_test_aead,
1930e46e9a46SHoria Geanta 		.fips_allowed = 1,
1931e46e9a46SHoria Geanta 		.suite = {
1932e46e9a46SHoria Geanta 			.aead = {
1933e46e9a46SHoria Geanta 				.enc = {
1934e46e9a46SHoria Geanta 					.vecs = hmac_sha256_aes_cbc_enc_tv_template,
1935e46e9a46SHoria Geanta 					.count = HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS
1936e46e9a46SHoria Geanta 				}
1937e46e9a46SHoria Geanta 			}
1938e46e9a46SHoria Geanta 		}
1939e46e9a46SHoria Geanta 	}, {
1940e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha512),cbc(aes))",
1941e46e9a46SHoria Geanta 		.test = alg_test_aead,
1942e46e9a46SHoria Geanta 		.fips_allowed = 1,
1943e46e9a46SHoria Geanta 		.suite = {
1944e46e9a46SHoria Geanta 			.aead = {
1945e46e9a46SHoria Geanta 				.enc = {
1946e46e9a46SHoria Geanta 					.vecs = hmac_sha512_aes_cbc_enc_tv_template,
1947e46e9a46SHoria Geanta 					.count = HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS
1948e46e9a46SHoria Geanta 				}
1949e46e9a46SHoria Geanta 			}
1950e46e9a46SHoria Geanta 		}
1951e46e9a46SHoria Geanta 	}, {
1952da7f033dSHerbert Xu 		.alg = "cbc(aes)",
19531aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1954a1915d51SJarod Wilson 		.fips_allowed = 1,
1955da7f033dSHerbert Xu 		.suite = {
1956da7f033dSHerbert Xu 			.cipher = {
1957da7f033dSHerbert Xu 				.enc = {
1958da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
1959da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
1960da7f033dSHerbert Xu 				},
1961da7f033dSHerbert Xu 				.dec = {
1962da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
1963da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
1964da7f033dSHerbert Xu 				}
1965da7f033dSHerbert Xu 			}
1966da7f033dSHerbert Xu 		}
1967da7f033dSHerbert Xu 	}, {
1968da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
19691aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1970da7f033dSHerbert Xu 		.suite = {
1971da7f033dSHerbert Xu 			.cipher = {
1972da7f033dSHerbert Xu 				.enc = {
1973da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
1974da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
1975da7f033dSHerbert Xu 				},
1976da7f033dSHerbert Xu 				.dec = {
1977da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
1978da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
1979da7f033dSHerbert Xu 				}
1980da7f033dSHerbert Xu 			}
1981da7f033dSHerbert Xu 		}
1982da7f033dSHerbert Xu 	}, {
1983da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
19841aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1985da7f033dSHerbert Xu 		.suite = {
1986da7f033dSHerbert Xu 			.cipher = {
1987da7f033dSHerbert Xu 				.enc = {
1988da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
1989da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
1990da7f033dSHerbert Xu 				},
1991da7f033dSHerbert Xu 				.dec = {
1992da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
1993da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
1994da7f033dSHerbert Xu 				}
1995da7f033dSHerbert Xu 			}
1996da7f033dSHerbert Xu 		}
1997da7f033dSHerbert Xu 	}, {
1998da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
19991aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2000da7f033dSHerbert Xu 		.suite = {
2001da7f033dSHerbert Xu 			.cipher = {
2002da7f033dSHerbert Xu 				.enc = {
2003da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
2004da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
2005da7f033dSHerbert Xu 				},
2006da7f033dSHerbert Xu 				.dec = {
2007da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
2008da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
2009da7f033dSHerbert Xu 				}
2010da7f033dSHerbert Xu 			}
2011da7f033dSHerbert Xu 		}
2012da7f033dSHerbert Xu 	}, {
2013a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2014a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2015a2c58260SJohannes Goetzfried 		.suite = {
2016a2c58260SJohannes Goetzfried 			.cipher = {
2017a2c58260SJohannes Goetzfried 				.enc = {
2018a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
2019a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
2020a2c58260SJohannes Goetzfried 				},
2021a2c58260SJohannes Goetzfried 				.dec = {
2022a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
2023a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
2024a2c58260SJohannes Goetzfried 				}
2025a2c58260SJohannes Goetzfried 			}
2026a2c58260SJohannes Goetzfried 		}
2027a2c58260SJohannes Goetzfried 	}, {
20289b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
20299b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
20309b8b0405SJohannes Goetzfried 		.suite = {
20319b8b0405SJohannes Goetzfried 			.cipher = {
20329b8b0405SJohannes Goetzfried 				.enc = {
20339b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
20349b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
20359b8b0405SJohannes Goetzfried 				},
20369b8b0405SJohannes Goetzfried 				.dec = {
20379b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
20389b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
20399b8b0405SJohannes Goetzfried 				}
20409b8b0405SJohannes Goetzfried 			}
20419b8b0405SJohannes Goetzfried 		}
20429b8b0405SJohannes Goetzfried 	}, {
2043da7f033dSHerbert Xu 		.alg = "cbc(des)",
20441aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2045da7f033dSHerbert Xu 		.suite = {
2046da7f033dSHerbert Xu 			.cipher = {
2047da7f033dSHerbert Xu 				.enc = {
2048da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
2049da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
2050da7f033dSHerbert Xu 				},
2051da7f033dSHerbert Xu 				.dec = {
2052da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
2053da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
2054da7f033dSHerbert Xu 				}
2055da7f033dSHerbert Xu 			}
2056da7f033dSHerbert Xu 		}
2057da7f033dSHerbert Xu 	}, {
2058da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
20591aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2060a1915d51SJarod Wilson 		.fips_allowed = 1,
2061da7f033dSHerbert Xu 		.suite = {
2062da7f033dSHerbert Xu 			.cipher = {
2063da7f033dSHerbert Xu 				.enc = {
2064da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
2065da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
2066da7f033dSHerbert Xu 				},
2067da7f033dSHerbert Xu 				.dec = {
2068da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
2069da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
2070da7f033dSHerbert Xu 				}
2071da7f033dSHerbert Xu 			}
2072da7f033dSHerbert Xu 		}
2073da7f033dSHerbert Xu 	}, {
20749d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
20759d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
20769d25917dSJussi Kivilinna 		.suite = {
20779d25917dSJussi Kivilinna 			.cipher = {
20789d25917dSJussi Kivilinna 				.enc = {
20799d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
20809d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
20819d25917dSJussi Kivilinna 				},
20829d25917dSJussi Kivilinna 				.dec = {
20839d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
20849d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
20859d25917dSJussi Kivilinna 				}
20869d25917dSJussi Kivilinna 			}
20879d25917dSJussi Kivilinna 		}
20889d25917dSJussi Kivilinna 	}, {
2089da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
20901aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2091da7f033dSHerbert Xu 		.suite = {
2092da7f033dSHerbert Xu 			.cipher = {
2093da7f033dSHerbert Xu 				.enc = {
2094da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
2095da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
2096da7f033dSHerbert Xu 				},
2097da7f033dSHerbert Xu 				.dec = {
2098da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
2099da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
2100da7f033dSHerbert Xu 				}
2101da7f033dSHerbert Xu 			}
2102da7f033dSHerbert Xu 		}
2103da7f033dSHerbert Xu 	}, {
2104da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2105da7f033dSHerbert Xu 		.test = alg_test_aead,
2106a1915d51SJarod Wilson 		.fips_allowed = 1,
2107da7f033dSHerbert Xu 		.suite = {
2108da7f033dSHerbert Xu 			.aead = {
2109da7f033dSHerbert Xu 				.enc = {
2110da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
2111da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
2112da7f033dSHerbert Xu 				},
2113da7f033dSHerbert Xu 				.dec = {
2114da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
2115da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
2116da7f033dSHerbert Xu 				}
2117da7f033dSHerbert Xu 			}
2118da7f033dSHerbert Xu 		}
2119da7f033dSHerbert Xu 	}, {
2120da7f033dSHerbert Xu 		.alg = "crc32c",
21218e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2122a1915d51SJarod Wilson 		.fips_allowed = 1,
2123da7f033dSHerbert Xu 		.suite = {
2124da7f033dSHerbert Xu 			.hash = {
2125da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
2126da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
2127da7f033dSHerbert Xu 			}
2128da7f033dSHerbert Xu 		}
2129da7f033dSHerbert Xu 	}, {
21306c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
21316c79294fSMilan Broz 		.test = alg_test_null,
21326c79294fSMilan Broz 		.fips_allowed = 1,
21336c79294fSMilan Broz 		.suite = {
21346c79294fSMilan Broz 			.cipher = {
21356c79294fSMilan Broz 				.enc = {
21366c79294fSMilan Broz 					.vecs = NULL,
21376c79294fSMilan Broz 					.count = 0
21386c79294fSMilan Broz 				},
21396c79294fSMilan Broz 				.dec = {
21406c79294fSMilan Broz 					.vecs = NULL,
21416c79294fSMilan Broz 					.count = 0
21426c79294fSMilan Broz 				}
21436c79294fSMilan Broz 			}
21446c79294fSMilan Broz 		}
21456c79294fSMilan Broz 	}, {
2146863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
2147863b557aSYouquan, Song 		.test = alg_test_null,
21486c79294fSMilan Broz 		.fips_allowed = 1,
2149863b557aSYouquan, Song 		.suite = {
2150863b557aSYouquan, Song 			.cipher = {
2151863b557aSYouquan, Song 				.enc = {
2152863b557aSYouquan, Song 					.vecs = NULL,
2153863b557aSYouquan, Song 					.count = 0
2154863b557aSYouquan, Song 				},
2155863b557aSYouquan, Song 				.dec = {
2156863b557aSYouquan, Song 					.vecs = NULL,
2157863b557aSYouquan, Song 					.count = 0
2158863b557aSYouquan, Song 				}
2159863b557aSYouquan, Song 			}
2160863b557aSYouquan, Song 		}
2161863b557aSYouquan, Song 	}, {
21624d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
21634d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
21644d6d6a2cSJohannes Goetzfried 		.suite = {
21654d6d6a2cSJohannes Goetzfried 			.cipher = {
21664d6d6a2cSJohannes Goetzfried 				.enc = {
21674d6d6a2cSJohannes Goetzfried 					.vecs = NULL,
21684d6d6a2cSJohannes Goetzfried 					.count = 0
21694d6d6a2cSJohannes Goetzfried 				},
21704d6d6a2cSJohannes Goetzfried 				.dec = {
21714d6d6a2cSJohannes Goetzfried 					.vecs = NULL,
21724d6d6a2cSJohannes Goetzfried 					.count = 0
21734d6d6a2cSJohannes Goetzfried 				}
21744d6d6a2cSJohannes Goetzfried 			}
21754d6d6a2cSJohannes Goetzfried 		}
21764d6d6a2cSJohannes Goetzfried 	}, {
21774ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
21784ea1277dSJohannes Goetzfried 		.test = alg_test_null,
21794ea1277dSJohannes Goetzfried 		.suite = {
21804ea1277dSJohannes Goetzfried 			.cipher = {
21814ea1277dSJohannes Goetzfried 				.enc = {
21824ea1277dSJohannes Goetzfried 					.vecs = NULL,
21834ea1277dSJohannes Goetzfried 					.count = 0
21844ea1277dSJohannes Goetzfried 				},
21854ea1277dSJohannes Goetzfried 				.dec = {
21864ea1277dSJohannes Goetzfried 					.vecs = NULL,
21874ea1277dSJohannes Goetzfried 					.count = 0
21884ea1277dSJohannes Goetzfried 				}
21894ea1277dSJohannes Goetzfried 			}
21904ea1277dSJohannes Goetzfried 		}
21914ea1277dSJohannes Goetzfried 	}, {
21927efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
21937efe4076SJohannes Goetzfried 		.test = alg_test_null,
21947efe4076SJohannes Goetzfried 		.suite = {
21957efe4076SJohannes Goetzfried 			.cipher = {
21967efe4076SJohannes Goetzfried 				.enc = {
21977efe4076SJohannes Goetzfried 					.vecs = NULL,
21987efe4076SJohannes Goetzfried 					.count = 0
21997efe4076SJohannes Goetzfried 				},
22007efe4076SJohannes Goetzfried 				.dec = {
22017efe4076SJohannes Goetzfried 					.vecs = NULL,
22027efe4076SJohannes Goetzfried 					.count = 0
22037efe4076SJohannes Goetzfried 				}
22047efe4076SJohannes Goetzfried 			}
22057efe4076SJohannes Goetzfried 		}
22067efe4076SJohannes Goetzfried 	}, {
2207937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
2208937c30d7SJussi Kivilinna 		.test = alg_test_null,
2209937c30d7SJussi Kivilinna 		.suite = {
2210937c30d7SJussi Kivilinna 			.cipher = {
2211937c30d7SJussi Kivilinna 				.enc = {
2212937c30d7SJussi Kivilinna 					.vecs = NULL,
2213937c30d7SJussi Kivilinna 					.count = 0
2214937c30d7SJussi Kivilinna 				},
2215937c30d7SJussi Kivilinna 				.dec = {
2216937c30d7SJussi Kivilinna 					.vecs = NULL,
2217937c30d7SJussi Kivilinna 					.count = 0
2218937c30d7SJussi Kivilinna 				}
2219937c30d7SJussi Kivilinna 			}
2220937c30d7SJussi Kivilinna 		}
2221937c30d7SJussi Kivilinna 	}, {
2222107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
2223107778b5SJohannes Goetzfried 		.test = alg_test_null,
2224107778b5SJohannes Goetzfried 		.suite = {
2225107778b5SJohannes Goetzfried 			.cipher = {
2226107778b5SJohannes Goetzfried 				.enc = {
2227107778b5SJohannes Goetzfried 					.vecs = NULL,
2228107778b5SJohannes Goetzfried 					.count = 0
2229107778b5SJohannes Goetzfried 				},
2230107778b5SJohannes Goetzfried 				.dec = {
2231107778b5SJohannes Goetzfried 					.vecs = NULL,
2232107778b5SJohannes Goetzfried 					.count = 0
2233107778b5SJohannes Goetzfried 				}
2234107778b5SJohannes Goetzfried 			}
2235107778b5SJohannes Goetzfried 		}
2236107778b5SJohannes Goetzfried 	}, {
22376c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
22386c79294fSMilan Broz 		.test = alg_test_null,
22396c79294fSMilan Broz 		.fips_allowed = 1,
22406c79294fSMilan Broz 		.suite = {
22416c79294fSMilan Broz 			.cipher = {
22426c79294fSMilan Broz 				.enc = {
22436c79294fSMilan Broz 					.vecs = NULL,
22446c79294fSMilan Broz 					.count = 0
22456c79294fSMilan Broz 				},
22466c79294fSMilan Broz 				.dec = {
22476c79294fSMilan Broz 					.vecs = NULL,
22486c79294fSMilan Broz 					.count = 0
22496c79294fSMilan Broz 				}
22506c79294fSMilan Broz 			}
22516c79294fSMilan Broz 		}
22526c79294fSMilan Broz 	}, {
2253863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2254863b557aSYouquan, Song 		.test = alg_test_null,
22556c79294fSMilan Broz 		.fips_allowed = 1,
2256863b557aSYouquan, Song 		.suite = {
2257863b557aSYouquan, Song 			.hash = {
2258863b557aSYouquan, Song 				.vecs = NULL,
2259863b557aSYouquan, Song 				.count = 0
2260863b557aSYouquan, Song 			}
2261863b557aSYouquan, Song 		}
2262863b557aSYouquan, Song 	}, {
2263f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2264f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2265a1915d51SJarod Wilson 		.fips_allowed = 1,
2266f7cb80f2SJarod Wilson 		.suite = {
2267f7cb80f2SJarod Wilson 			.cipher = {
2268f7cb80f2SJarod Wilson 				.enc = {
2269f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2270f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2271f7cb80f2SJarod Wilson 				},
2272f7cb80f2SJarod Wilson 				.dec = {
2273f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2274f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2275f7cb80f2SJarod Wilson 				}
2276f7cb80f2SJarod Wilson 			}
2277f7cb80f2SJarod Wilson 		}
2278f7cb80f2SJarod Wilson 	}, {
227985b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
228085b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
228185b63e34SJussi Kivilinna 		.suite = {
228285b63e34SJussi Kivilinna 			.cipher = {
228385b63e34SJussi Kivilinna 				.enc = {
228485b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
228585b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
228685b63e34SJussi Kivilinna 				},
228785b63e34SJussi Kivilinna 				.dec = {
228885b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
228985b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
229085b63e34SJussi Kivilinna 				}
229185b63e34SJussi Kivilinna 			}
229285b63e34SJussi Kivilinna 		}
229385b63e34SJussi Kivilinna 	}, {
22940840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
22950840605eSJussi Kivilinna 		.test = alg_test_skcipher,
22960840605eSJussi Kivilinna 		.suite = {
22970840605eSJussi Kivilinna 			.cipher = {
22980840605eSJussi Kivilinna 				.enc = {
22990840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
23000840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
23010840605eSJussi Kivilinna 				},
23020840605eSJussi Kivilinna 				.dec = {
23030840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
23040840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
23050840605eSJussi Kivilinna 				}
23060840605eSJussi Kivilinna 			}
23070840605eSJussi Kivilinna 		}
23080840605eSJussi Kivilinna 	}, {
2309a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2310a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2311a2c58260SJohannes Goetzfried 		.suite = {
2312a2c58260SJohannes Goetzfried 			.cipher = {
2313a2c58260SJohannes Goetzfried 				.enc = {
2314a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2315a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2316a2c58260SJohannes Goetzfried 				},
2317a2c58260SJohannes Goetzfried 				.dec = {
2318a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2319a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2320a2c58260SJohannes Goetzfried 				}
2321a2c58260SJohannes Goetzfried 			}
2322a2c58260SJohannes Goetzfried 		}
2323a2c58260SJohannes Goetzfried 	}, {
23249b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
23259b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
23269b8b0405SJohannes Goetzfried 		.suite = {
23279b8b0405SJohannes Goetzfried 			.cipher = {
23289b8b0405SJohannes Goetzfried 				.enc = {
23299b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
23309b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
23319b8b0405SJohannes Goetzfried 				},
23329b8b0405SJohannes Goetzfried 				.dec = {
23339b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
23349b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
23359b8b0405SJohannes Goetzfried 				}
23369b8b0405SJohannes Goetzfried 			}
23379b8b0405SJohannes Goetzfried 		}
23389b8b0405SJohannes Goetzfried 	}, {
23398163fc30SJussi Kivilinna 		.alg = "ctr(des)",
23408163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
23418163fc30SJussi Kivilinna 		.suite = {
23428163fc30SJussi Kivilinna 			.cipher = {
23438163fc30SJussi Kivilinna 				.enc = {
23448163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
23458163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
23468163fc30SJussi Kivilinna 				},
23478163fc30SJussi Kivilinna 				.dec = {
23488163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
23498163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
23508163fc30SJussi Kivilinna 				}
23518163fc30SJussi Kivilinna 			}
23528163fc30SJussi Kivilinna 		}
23538163fc30SJussi Kivilinna 	}, {
2354e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2355e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2356e080b17aSJussi Kivilinna 		.suite = {
2357e080b17aSJussi Kivilinna 			.cipher = {
2358e080b17aSJussi Kivilinna 				.enc = {
2359e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2360e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2361e080b17aSJussi Kivilinna 				},
2362e080b17aSJussi Kivilinna 				.dec = {
2363e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2364e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2365e080b17aSJussi Kivilinna 				}
2366e080b17aSJussi Kivilinna 			}
2367e080b17aSJussi Kivilinna 		}
2368e080b17aSJussi Kivilinna 	}, {
23699d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
23709d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
23719d25917dSJussi Kivilinna 		.suite = {
23729d25917dSJussi Kivilinna 			.cipher = {
23739d25917dSJussi Kivilinna 				.enc = {
23749d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
23759d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
23769d25917dSJussi Kivilinna 				},
23779d25917dSJussi Kivilinna 				.dec = {
23789d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
23799d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
23809d25917dSJussi Kivilinna 				}
23819d25917dSJussi Kivilinna 			}
23829d25917dSJussi Kivilinna 		}
23839d25917dSJussi Kivilinna 	}, {
2384573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2385573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2386573da620SJussi Kivilinna 		.suite = {
2387573da620SJussi Kivilinna 			.cipher = {
2388573da620SJussi Kivilinna 				.enc = {
2389573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2390573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2391573da620SJussi Kivilinna 				},
2392573da620SJussi Kivilinna 				.dec = {
2393573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2394573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2395573da620SJussi Kivilinna 				}
2396573da620SJussi Kivilinna 			}
2397573da620SJussi Kivilinna 		}
2398573da620SJussi Kivilinna 	}, {
2399da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
24001aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2401da7f033dSHerbert Xu 		.suite = {
2402da7f033dSHerbert Xu 			.cipher = {
2403da7f033dSHerbert Xu 				.enc = {
2404da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2405da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2406da7f033dSHerbert Xu 				},
2407da7f033dSHerbert Xu 				.dec = {
2408da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2409da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2410da7f033dSHerbert Xu 				}
2411da7f033dSHerbert Xu 			}
2412da7f033dSHerbert Xu 		}
2413da7f033dSHerbert Xu 	}, {
2414da7f033dSHerbert Xu 		.alg = "deflate",
2415da7f033dSHerbert Xu 		.test = alg_test_comp,
2416da7f033dSHerbert Xu 		.suite = {
2417da7f033dSHerbert Xu 			.comp = {
2418da7f033dSHerbert Xu 				.comp = {
2419da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2420da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2421da7f033dSHerbert Xu 				},
2422da7f033dSHerbert Xu 				.decomp = {
2423da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2424da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2425da7f033dSHerbert Xu 				}
2426da7f033dSHerbert Xu 			}
2427da7f033dSHerbert Xu 		}
2428da7f033dSHerbert Xu 	}, {
2429863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2430863b557aSYouquan, Song 		.test = alg_test_null,
24316c79294fSMilan Broz 		.fips_allowed = 1,
2432863b557aSYouquan, Song 		.suite = {
2433863b557aSYouquan, Song 			.cipher = {
2434863b557aSYouquan, Song 				.enc = {
2435863b557aSYouquan, Song 					.vecs = NULL,
2436863b557aSYouquan, Song 					.count = 0
2437863b557aSYouquan, Song 				},
2438863b557aSYouquan, Song 				.dec = {
2439863b557aSYouquan, Song 					.vecs = NULL,
2440863b557aSYouquan, Song 					.count = 0
2441863b557aSYouquan, Song 				}
2442863b557aSYouquan, Song 			}
2443863b557aSYouquan, Song 		}
2444863b557aSYouquan, Song 	}, {
2445da7f033dSHerbert Xu 		.alg = "ecb(aes)",
24461aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2447a1915d51SJarod Wilson 		.fips_allowed = 1,
2448da7f033dSHerbert Xu 		.suite = {
2449da7f033dSHerbert Xu 			.cipher = {
2450da7f033dSHerbert Xu 				.enc = {
2451da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2452da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2453da7f033dSHerbert Xu 				},
2454da7f033dSHerbert Xu 				.dec = {
2455da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2456da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2457da7f033dSHerbert Xu 				}
2458da7f033dSHerbert Xu 			}
2459da7f033dSHerbert Xu 		}
2460da7f033dSHerbert Xu 	}, {
2461da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
24621aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2463da7f033dSHerbert Xu 		.suite = {
2464da7f033dSHerbert Xu 			.cipher = {
2465da7f033dSHerbert Xu 				.enc = {
2466da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2467da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2468da7f033dSHerbert Xu 				},
2469da7f033dSHerbert Xu 				.dec = {
2470da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2471da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2472da7f033dSHerbert Xu 				}
2473da7f033dSHerbert Xu 			}
2474da7f033dSHerbert Xu 		}
2475da7f033dSHerbert Xu 	}, {
2476da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
24771aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2478da7f033dSHerbert Xu 		.suite = {
2479da7f033dSHerbert Xu 			.cipher = {
2480da7f033dSHerbert Xu 				.enc = {
2481da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2482da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2483da7f033dSHerbert Xu 				},
2484da7f033dSHerbert Xu 				.dec = {
2485da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2486da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2487da7f033dSHerbert Xu 				}
2488da7f033dSHerbert Xu 			}
2489da7f033dSHerbert Xu 		}
2490da7f033dSHerbert Xu 	}, {
2491da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
24921aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2493da7f033dSHerbert Xu 		.suite = {
2494da7f033dSHerbert Xu 			.cipher = {
2495da7f033dSHerbert Xu 				.enc = {
2496da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2497da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2498da7f033dSHerbert Xu 				},
2499da7f033dSHerbert Xu 				.dec = {
2500da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2501da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2502da7f033dSHerbert Xu 				}
2503da7f033dSHerbert Xu 			}
2504da7f033dSHerbert Xu 		}
2505da7f033dSHerbert Xu 	}, {
2506da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
25071aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2508da7f033dSHerbert Xu 		.suite = {
2509da7f033dSHerbert Xu 			.cipher = {
2510da7f033dSHerbert Xu 				.enc = {
2511da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2512da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2513da7f033dSHerbert Xu 				},
2514da7f033dSHerbert Xu 				.dec = {
2515da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2516da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2517da7f033dSHerbert Xu 				}
2518da7f033dSHerbert Xu 			}
2519da7f033dSHerbert Xu 		}
2520da7f033dSHerbert Xu 	}, {
2521da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
25221aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2523da7f033dSHerbert Xu 		.suite = {
2524da7f033dSHerbert Xu 			.cipher = {
2525da7f033dSHerbert Xu 				.enc = {
2526da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2527da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2528da7f033dSHerbert Xu 				},
2529da7f033dSHerbert Xu 				.dec = {
2530da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2531da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2532da7f033dSHerbert Xu 				}
2533da7f033dSHerbert Xu 			}
2534da7f033dSHerbert Xu 		}
2535da7f033dSHerbert Xu 	}, {
2536da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
25371aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2538da7f033dSHerbert Xu 		.suite = {
2539da7f033dSHerbert Xu 			.cipher = {
2540da7f033dSHerbert Xu 				.enc = {
2541da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2542da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
2543da7f033dSHerbert Xu 				},
2544da7f033dSHerbert Xu 				.dec = {
2545da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
2546da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
2547da7f033dSHerbert Xu 				}
2548da7f033dSHerbert Xu 			}
2549da7f033dSHerbert Xu 		}
2550da7f033dSHerbert Xu 	}, {
2551da7f033dSHerbert Xu 		.alg = "ecb(des)",
25521aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2553a1915d51SJarod Wilson 		.fips_allowed = 1,
2554da7f033dSHerbert Xu 		.suite = {
2555da7f033dSHerbert Xu 			.cipher = {
2556da7f033dSHerbert Xu 				.enc = {
2557da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
2558da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
2559da7f033dSHerbert Xu 				},
2560da7f033dSHerbert Xu 				.dec = {
2561da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
2562da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
2563da7f033dSHerbert Xu 				}
2564da7f033dSHerbert Xu 			}
2565da7f033dSHerbert Xu 		}
2566da7f033dSHerbert Xu 	}, {
2567da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
25681aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2569a1915d51SJarod Wilson 		.fips_allowed = 1,
2570da7f033dSHerbert Xu 		.suite = {
2571da7f033dSHerbert Xu 			.cipher = {
2572da7f033dSHerbert Xu 				.enc = {
2573da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
2574da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
2575da7f033dSHerbert Xu 				},
2576da7f033dSHerbert Xu 				.dec = {
2577da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
2578da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
2579da7f033dSHerbert Xu 				}
2580da7f033dSHerbert Xu 			}
2581da7f033dSHerbert Xu 		}
2582da7f033dSHerbert Xu 	}, {
2583da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
25841aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2585da7f033dSHerbert Xu 		.suite = {
2586da7f033dSHerbert Xu 			.cipher = {
2587da7f033dSHerbert Xu 				.enc = {
2588da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
2589da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
2590da7f033dSHerbert Xu 				},
2591da7f033dSHerbert Xu 				.dec = {
2592da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
2593da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
2594da7f033dSHerbert Xu 				}
2595da7f033dSHerbert Xu 			}
2596da7f033dSHerbert Xu 		}
2597da7f033dSHerbert Xu 	}, {
2598da7f033dSHerbert Xu 		.alg = "ecb(seed)",
25991aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2600da7f033dSHerbert Xu 		.suite = {
2601da7f033dSHerbert Xu 			.cipher = {
2602da7f033dSHerbert Xu 				.enc = {
2603da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
2604da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
2605da7f033dSHerbert Xu 				},
2606da7f033dSHerbert Xu 				.dec = {
2607da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
2608da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
2609da7f033dSHerbert Xu 				}
2610da7f033dSHerbert Xu 			}
2611da7f033dSHerbert Xu 		}
2612da7f033dSHerbert Xu 	}, {
2613da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
26141aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2615da7f033dSHerbert Xu 		.suite = {
2616da7f033dSHerbert Xu 			.cipher = {
2617da7f033dSHerbert Xu 				.enc = {
2618da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
2619da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
2620da7f033dSHerbert Xu 				},
2621da7f033dSHerbert Xu 				.dec = {
2622da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
2623da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
2624da7f033dSHerbert Xu 				}
2625da7f033dSHerbert Xu 			}
2626da7f033dSHerbert Xu 		}
2627da7f033dSHerbert Xu 	}, {
2628da7f033dSHerbert Xu 		.alg = "ecb(tea)",
26291aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2630da7f033dSHerbert Xu 		.suite = {
2631da7f033dSHerbert Xu 			.cipher = {
2632da7f033dSHerbert Xu 				.enc = {
2633da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
2634da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
2635da7f033dSHerbert Xu 				},
2636da7f033dSHerbert Xu 				.dec = {
2637da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
2638da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
2639da7f033dSHerbert Xu 				}
2640da7f033dSHerbert Xu 			}
2641da7f033dSHerbert Xu 		}
2642da7f033dSHerbert Xu 	}, {
2643da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
26441aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2645da7f033dSHerbert Xu 		.suite = {
2646da7f033dSHerbert Xu 			.cipher = {
2647da7f033dSHerbert Xu 				.enc = {
2648da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
2649da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
2650da7f033dSHerbert Xu 				},
2651da7f033dSHerbert Xu 				.dec = {
2652da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
2653da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
2654da7f033dSHerbert Xu 				}
2655da7f033dSHerbert Xu 			}
2656da7f033dSHerbert Xu 		}
2657da7f033dSHerbert Xu 	}, {
2658da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
26591aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2660da7f033dSHerbert Xu 		.suite = {
2661da7f033dSHerbert Xu 			.cipher = {
2662da7f033dSHerbert Xu 				.enc = {
2663da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
2664da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
2665da7f033dSHerbert Xu 				},
2666da7f033dSHerbert Xu 				.dec = {
2667da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
2668da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
2669da7f033dSHerbert Xu 				}
2670da7f033dSHerbert Xu 			}
2671da7f033dSHerbert Xu 		}
2672da7f033dSHerbert Xu 	}, {
2673da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
26741aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2675da7f033dSHerbert Xu 		.suite = {
2676da7f033dSHerbert Xu 			.cipher = {
2677da7f033dSHerbert Xu 				.enc = {
2678da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
2679da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
2680da7f033dSHerbert Xu 				},
2681da7f033dSHerbert Xu 				.dec = {
2682da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
2683da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
2684da7f033dSHerbert Xu 				}
2685da7f033dSHerbert Xu 			}
2686da7f033dSHerbert Xu 		}
2687da7f033dSHerbert Xu 	}, {
2688da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
26891aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2690da7f033dSHerbert Xu 		.suite = {
2691da7f033dSHerbert Xu 			.cipher = {
2692da7f033dSHerbert Xu 				.enc = {
2693da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
2694da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
2695da7f033dSHerbert Xu 				},
2696da7f033dSHerbert Xu 				.dec = {
2697da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
2698da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
2699da7f033dSHerbert Xu 				}
2700da7f033dSHerbert Xu 			}
2701da7f033dSHerbert Xu 		}
2702da7f033dSHerbert Xu 	}, {
2703da7f033dSHerbert Xu 		.alg = "gcm(aes)",
2704da7f033dSHerbert Xu 		.test = alg_test_aead,
2705a1915d51SJarod Wilson 		.fips_allowed = 1,
2706da7f033dSHerbert Xu 		.suite = {
2707da7f033dSHerbert Xu 			.aead = {
2708da7f033dSHerbert Xu 				.enc = {
2709da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
2710da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
2711da7f033dSHerbert Xu 				},
2712da7f033dSHerbert Xu 				.dec = {
2713da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
2714da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
2715da7f033dSHerbert Xu 				}
2716da7f033dSHerbert Xu 			}
2717da7f033dSHerbert Xu 		}
2718da7f033dSHerbert Xu 	}, {
2719507069c9SYouquan, Song 		.alg = "ghash",
2720507069c9SYouquan, Song 		.test = alg_test_hash,
272118c0ebd2SJarod Wilson 		.fips_allowed = 1,
2722507069c9SYouquan, Song 		.suite = {
2723507069c9SYouquan, Song 			.hash = {
2724507069c9SYouquan, Song 				.vecs = ghash_tv_template,
2725507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
2726507069c9SYouquan, Song 			}
2727507069c9SYouquan, Song 		}
2728507069c9SYouquan, Song 	}, {
2729a482b081SSonic Zhang 		.alg = "hmac(crc32)",
2730a482b081SSonic Zhang 		.test = alg_test_hash,
2731a482b081SSonic Zhang 		.suite = {
2732a482b081SSonic Zhang 			.hash = {
2733a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
2734a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
2735a482b081SSonic Zhang 			}
2736a482b081SSonic Zhang 		}
2737a482b081SSonic Zhang 	}, {
2738da7f033dSHerbert Xu 		.alg = "hmac(md5)",
2739da7f033dSHerbert Xu 		.test = alg_test_hash,
2740da7f033dSHerbert Xu 		.suite = {
2741da7f033dSHerbert Xu 			.hash = {
2742da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
2743da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
2744da7f033dSHerbert Xu 			}
2745da7f033dSHerbert Xu 		}
2746da7f033dSHerbert Xu 	}, {
2747da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
2748da7f033dSHerbert Xu 		.test = alg_test_hash,
2749da7f033dSHerbert Xu 		.suite = {
2750da7f033dSHerbert Xu 			.hash = {
2751da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
2752da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
2753da7f033dSHerbert Xu 			}
2754da7f033dSHerbert Xu 		}
2755da7f033dSHerbert Xu 	}, {
2756da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
2757da7f033dSHerbert Xu 		.test = alg_test_hash,
2758da7f033dSHerbert Xu 		.suite = {
2759da7f033dSHerbert Xu 			.hash = {
2760da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
2761da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
2762da7f033dSHerbert Xu 			}
2763da7f033dSHerbert Xu 		}
2764da7f033dSHerbert Xu 	}, {
2765da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
2766da7f033dSHerbert Xu 		.test = alg_test_hash,
2767a1915d51SJarod Wilson 		.fips_allowed = 1,
2768da7f033dSHerbert Xu 		.suite = {
2769da7f033dSHerbert Xu 			.hash = {
2770da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
2771da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
2772da7f033dSHerbert Xu 			}
2773da7f033dSHerbert Xu 		}
2774da7f033dSHerbert Xu 	}, {
2775da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
2776da7f033dSHerbert Xu 		.test = alg_test_hash,
2777a1915d51SJarod Wilson 		.fips_allowed = 1,
2778da7f033dSHerbert Xu 		.suite = {
2779da7f033dSHerbert Xu 			.hash = {
2780da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
2781da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
2782da7f033dSHerbert Xu 			}
2783da7f033dSHerbert Xu 		}
2784da7f033dSHerbert Xu 	}, {
2785da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
2786da7f033dSHerbert Xu 		.test = alg_test_hash,
2787a1915d51SJarod Wilson 		.fips_allowed = 1,
2788da7f033dSHerbert Xu 		.suite = {
2789da7f033dSHerbert Xu 			.hash = {
2790da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
2791da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
2792da7f033dSHerbert Xu 			}
2793da7f033dSHerbert Xu 		}
2794da7f033dSHerbert Xu 	}, {
2795da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
2796da7f033dSHerbert Xu 		.test = alg_test_hash,
2797a1915d51SJarod Wilson 		.fips_allowed = 1,
2798da7f033dSHerbert Xu 		.suite = {
2799da7f033dSHerbert Xu 			.hash = {
2800da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
2801da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
2802da7f033dSHerbert Xu 			}
2803da7f033dSHerbert Xu 		}
2804da7f033dSHerbert Xu 	}, {
2805da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
2806da7f033dSHerbert Xu 		.test = alg_test_hash,
2807a1915d51SJarod Wilson 		.fips_allowed = 1,
2808da7f033dSHerbert Xu 		.suite = {
2809da7f033dSHerbert Xu 			.hash = {
2810da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
2811da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
2812da7f033dSHerbert Xu 			}
2813da7f033dSHerbert Xu 		}
2814da7f033dSHerbert Xu 	}, {
2815da7f033dSHerbert Xu 		.alg = "lrw(aes)",
28161aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2817da7f033dSHerbert Xu 		.suite = {
2818da7f033dSHerbert Xu 			.cipher = {
2819da7f033dSHerbert Xu 				.enc = {
2820da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
2821da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
2822da7f033dSHerbert Xu 				},
2823da7f033dSHerbert Xu 				.dec = {
2824da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
2825da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
2826da7f033dSHerbert Xu 				}
2827da7f033dSHerbert Xu 			}
2828da7f033dSHerbert Xu 		}
2829da7f033dSHerbert Xu 	}, {
28300840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
28310840605eSJussi Kivilinna 		.test = alg_test_skcipher,
28320840605eSJussi Kivilinna 		.suite = {
28330840605eSJussi Kivilinna 			.cipher = {
28340840605eSJussi Kivilinna 				.enc = {
28350840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
28360840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
28370840605eSJussi Kivilinna 				},
28380840605eSJussi Kivilinna 				.dec = {
28390840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
28400840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
28410840605eSJussi Kivilinna 				}
28420840605eSJussi Kivilinna 			}
28430840605eSJussi Kivilinna 		}
28440840605eSJussi Kivilinna 	}, {
28459b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
28469b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
28479b8b0405SJohannes Goetzfried 		.suite = {
28489b8b0405SJohannes Goetzfried 			.cipher = {
28499b8b0405SJohannes Goetzfried 				.enc = {
28509b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
28519b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
28529b8b0405SJohannes Goetzfried 				},
28539b8b0405SJohannes Goetzfried 				.dec = {
28549b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
28559b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
28569b8b0405SJohannes Goetzfried 				}
28579b8b0405SJohannes Goetzfried 			}
28589b8b0405SJohannes Goetzfried 		}
28599b8b0405SJohannes Goetzfried 	}, {
2860d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
2861d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
2862d7bfc0faSJussi Kivilinna 		.suite = {
2863d7bfc0faSJussi Kivilinna 			.cipher = {
2864d7bfc0faSJussi Kivilinna 				.enc = {
2865d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
2866d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
2867d7bfc0faSJussi Kivilinna 				},
2868d7bfc0faSJussi Kivilinna 				.dec = {
2869d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
2870d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
2871d7bfc0faSJussi Kivilinna 				}
2872d7bfc0faSJussi Kivilinna 			}
2873d7bfc0faSJussi Kivilinna 		}
2874d7bfc0faSJussi Kivilinna 	}, {
28750b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
28760b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
28770b2a1551SJussi Kivilinna 		.suite = {
28780b2a1551SJussi Kivilinna 			.cipher = {
28790b2a1551SJussi Kivilinna 				.enc = {
28800b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
28810b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
28820b2a1551SJussi Kivilinna 				},
28830b2a1551SJussi Kivilinna 				.dec = {
28840b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
28850b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
28860b2a1551SJussi Kivilinna 				}
28870b2a1551SJussi Kivilinna 			}
28880b2a1551SJussi Kivilinna 		}
28890b2a1551SJussi Kivilinna 	}, {
2890da7f033dSHerbert Xu 		.alg = "lzo",
2891da7f033dSHerbert Xu 		.test = alg_test_comp,
2892da7f033dSHerbert Xu 		.suite = {
2893da7f033dSHerbert Xu 			.comp = {
2894da7f033dSHerbert Xu 				.comp = {
2895da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
2896da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
2897da7f033dSHerbert Xu 				},
2898da7f033dSHerbert Xu 				.decomp = {
2899da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
2900da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
2901da7f033dSHerbert Xu 				}
2902da7f033dSHerbert Xu 			}
2903da7f033dSHerbert Xu 		}
2904da7f033dSHerbert Xu 	}, {
2905da7f033dSHerbert Xu 		.alg = "md4",
2906da7f033dSHerbert Xu 		.test = alg_test_hash,
2907da7f033dSHerbert Xu 		.suite = {
2908da7f033dSHerbert Xu 			.hash = {
2909da7f033dSHerbert Xu 				.vecs = md4_tv_template,
2910da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
2911da7f033dSHerbert Xu 			}
2912da7f033dSHerbert Xu 		}
2913da7f033dSHerbert Xu 	}, {
2914da7f033dSHerbert Xu 		.alg = "md5",
2915da7f033dSHerbert Xu 		.test = alg_test_hash,
2916da7f033dSHerbert Xu 		.suite = {
2917da7f033dSHerbert Xu 			.hash = {
2918da7f033dSHerbert Xu 				.vecs = md5_tv_template,
2919da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
2920da7f033dSHerbert Xu 			}
2921da7f033dSHerbert Xu 		}
2922da7f033dSHerbert Xu 	}, {
2923da7f033dSHerbert Xu 		.alg = "michael_mic",
2924da7f033dSHerbert Xu 		.test = alg_test_hash,
2925da7f033dSHerbert Xu 		.suite = {
2926da7f033dSHerbert Xu 			.hash = {
2927da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
2928da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
2929da7f033dSHerbert Xu 			}
2930da7f033dSHerbert Xu 		}
2931da7f033dSHerbert Xu 	}, {
2932ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
2933ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
2934ba0e14acSPuneet Saxena 		.fips_allowed = 1,
2935ba0e14acSPuneet Saxena 		.suite = {
2936ba0e14acSPuneet Saxena 			.cipher = {
2937ba0e14acSPuneet Saxena 				.enc = {
2938ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
2939ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
2940ba0e14acSPuneet Saxena 				},
2941ba0e14acSPuneet Saxena 				.dec = {
2942ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
2943ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
2944ba0e14acSPuneet Saxena 				}
2945ba0e14acSPuneet Saxena 			}
2946ba0e14acSPuneet Saxena 		}
2947ba0e14acSPuneet Saxena 	}, {
2948da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
29491aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2950da7f033dSHerbert Xu 		.suite = {
2951da7f033dSHerbert Xu 			.cipher = {
2952da7f033dSHerbert Xu 				.enc = {
2953da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
2954da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
2955da7f033dSHerbert Xu 				},
2956da7f033dSHerbert Xu 				.dec = {
2957da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
2958da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
2959da7f033dSHerbert Xu 				}
2960da7f033dSHerbert Xu 			}
2961da7f033dSHerbert Xu 		}
2962da7f033dSHerbert Xu 	}, {
2963da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
29641aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2965a1915d51SJarod Wilson 		.fips_allowed = 1,
2966da7f033dSHerbert Xu 		.suite = {
2967da7f033dSHerbert Xu 			.cipher = {
2968da7f033dSHerbert Xu 				.enc = {
2969f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
2970f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
2971da7f033dSHerbert Xu 				},
2972da7f033dSHerbert Xu 				.dec = {
2973f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
2974f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
2975da7f033dSHerbert Xu 				}
2976da7f033dSHerbert Xu 			}
2977da7f033dSHerbert Xu 		}
2978da7f033dSHerbert Xu 	}, {
297969435b94SAdrian Hoban 		.alg = "rfc4106(gcm(aes))",
298069435b94SAdrian Hoban 		.test = alg_test_aead,
298169435b94SAdrian Hoban 		.suite = {
298269435b94SAdrian Hoban 			.aead = {
298369435b94SAdrian Hoban 				.enc = {
298469435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
298569435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
298669435b94SAdrian Hoban 				},
298769435b94SAdrian Hoban 				.dec = {
298869435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
298969435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
299069435b94SAdrian Hoban 				}
299169435b94SAdrian Hoban 			}
299269435b94SAdrian Hoban 		}
299369435b94SAdrian Hoban 	}, {
299469435b94SAdrian Hoban 
299569435b94SAdrian Hoban 
29965d667322SJarod Wilson 		.alg = "rfc4309(ccm(aes))",
29975d667322SJarod Wilson 		.test = alg_test_aead,
2998a1915d51SJarod Wilson 		.fips_allowed = 1,
29995d667322SJarod Wilson 		.suite = {
30005d667322SJarod Wilson 			.aead = {
30015d667322SJarod Wilson 				.enc = {
30025d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
30035d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
30045d667322SJarod Wilson 				},
30055d667322SJarod Wilson 				.dec = {
30065d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
30075d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
30085d667322SJarod Wilson 				}
30095d667322SJarod Wilson 			}
30105d667322SJarod Wilson 		}
30115d667322SJarod Wilson 	}, {
3012da7f033dSHerbert Xu 		.alg = "rmd128",
3013da7f033dSHerbert Xu 		.test = alg_test_hash,
3014da7f033dSHerbert Xu 		.suite = {
3015da7f033dSHerbert Xu 			.hash = {
3016da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
3017da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
3018da7f033dSHerbert Xu 			}
3019da7f033dSHerbert Xu 		}
3020da7f033dSHerbert Xu 	}, {
3021da7f033dSHerbert Xu 		.alg = "rmd160",
3022da7f033dSHerbert Xu 		.test = alg_test_hash,
3023da7f033dSHerbert Xu 		.suite = {
3024da7f033dSHerbert Xu 			.hash = {
3025da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
3026da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
3027da7f033dSHerbert Xu 			}
3028da7f033dSHerbert Xu 		}
3029da7f033dSHerbert Xu 	}, {
3030da7f033dSHerbert Xu 		.alg = "rmd256",
3031da7f033dSHerbert Xu 		.test = alg_test_hash,
3032da7f033dSHerbert Xu 		.suite = {
3033da7f033dSHerbert Xu 			.hash = {
3034da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
3035da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
3036da7f033dSHerbert Xu 			}
3037da7f033dSHerbert Xu 		}
3038da7f033dSHerbert Xu 	}, {
3039da7f033dSHerbert Xu 		.alg = "rmd320",
3040da7f033dSHerbert Xu 		.test = alg_test_hash,
3041da7f033dSHerbert Xu 		.suite = {
3042da7f033dSHerbert Xu 			.hash = {
3043da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
3044da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
3045da7f033dSHerbert Xu 			}
3046da7f033dSHerbert Xu 		}
3047da7f033dSHerbert Xu 	}, {
3048da7f033dSHerbert Xu 		.alg = "salsa20",
30491aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3050da7f033dSHerbert Xu 		.suite = {
3051da7f033dSHerbert Xu 			.cipher = {
3052da7f033dSHerbert Xu 				.enc = {
3053da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
3054da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
3055da7f033dSHerbert Xu 				}
3056da7f033dSHerbert Xu 			}
3057da7f033dSHerbert Xu 		}
3058da7f033dSHerbert Xu 	}, {
3059da7f033dSHerbert Xu 		.alg = "sha1",
3060da7f033dSHerbert Xu 		.test = alg_test_hash,
3061a1915d51SJarod Wilson 		.fips_allowed = 1,
3062da7f033dSHerbert Xu 		.suite = {
3063da7f033dSHerbert Xu 			.hash = {
3064da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
3065da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
3066da7f033dSHerbert Xu 			}
3067da7f033dSHerbert Xu 		}
3068da7f033dSHerbert Xu 	}, {
3069da7f033dSHerbert Xu 		.alg = "sha224",
3070da7f033dSHerbert Xu 		.test = alg_test_hash,
3071a1915d51SJarod Wilson 		.fips_allowed = 1,
3072da7f033dSHerbert Xu 		.suite = {
3073da7f033dSHerbert Xu 			.hash = {
3074da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
3075da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
3076da7f033dSHerbert Xu 			}
3077da7f033dSHerbert Xu 		}
3078da7f033dSHerbert Xu 	}, {
3079da7f033dSHerbert Xu 		.alg = "sha256",
3080da7f033dSHerbert Xu 		.test = alg_test_hash,
3081a1915d51SJarod Wilson 		.fips_allowed = 1,
3082da7f033dSHerbert Xu 		.suite = {
3083da7f033dSHerbert Xu 			.hash = {
3084da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
3085da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
3086da7f033dSHerbert Xu 			}
3087da7f033dSHerbert Xu 		}
3088da7f033dSHerbert Xu 	}, {
3089da7f033dSHerbert Xu 		.alg = "sha384",
3090da7f033dSHerbert Xu 		.test = alg_test_hash,
3091a1915d51SJarod Wilson 		.fips_allowed = 1,
3092da7f033dSHerbert Xu 		.suite = {
3093da7f033dSHerbert Xu 			.hash = {
3094da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
3095da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
3096da7f033dSHerbert Xu 			}
3097da7f033dSHerbert Xu 		}
3098da7f033dSHerbert Xu 	}, {
3099da7f033dSHerbert Xu 		.alg = "sha512",
3100da7f033dSHerbert Xu 		.test = alg_test_hash,
3101a1915d51SJarod Wilson 		.fips_allowed = 1,
3102da7f033dSHerbert Xu 		.suite = {
3103da7f033dSHerbert Xu 			.hash = {
3104da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
3105da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
3106da7f033dSHerbert Xu 			}
3107da7f033dSHerbert Xu 		}
3108da7f033dSHerbert Xu 	}, {
3109da7f033dSHerbert Xu 		.alg = "tgr128",
3110da7f033dSHerbert Xu 		.test = alg_test_hash,
3111da7f033dSHerbert Xu 		.suite = {
3112da7f033dSHerbert Xu 			.hash = {
3113da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
3114da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
3115da7f033dSHerbert Xu 			}
3116da7f033dSHerbert Xu 		}
3117da7f033dSHerbert Xu 	}, {
3118da7f033dSHerbert Xu 		.alg = "tgr160",
3119da7f033dSHerbert Xu 		.test = alg_test_hash,
3120da7f033dSHerbert Xu 		.suite = {
3121da7f033dSHerbert Xu 			.hash = {
3122da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
3123da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
3124da7f033dSHerbert Xu 			}
3125da7f033dSHerbert Xu 		}
3126da7f033dSHerbert Xu 	}, {
3127da7f033dSHerbert Xu 		.alg = "tgr192",
3128da7f033dSHerbert Xu 		.test = alg_test_hash,
3129da7f033dSHerbert Xu 		.suite = {
3130da7f033dSHerbert Xu 			.hash = {
3131da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
3132da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
3133da7f033dSHerbert Xu 			}
3134da7f033dSHerbert Xu 		}
3135da7f033dSHerbert Xu 	}, {
3136f1939f7cSShane Wang 		.alg = "vmac(aes)",
3137f1939f7cSShane Wang 		.test = alg_test_hash,
3138f1939f7cSShane Wang 		.suite = {
3139f1939f7cSShane Wang 			.hash = {
3140f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
3141f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
3142f1939f7cSShane Wang 			}
3143f1939f7cSShane Wang 		}
3144f1939f7cSShane Wang 	}, {
3145da7f033dSHerbert Xu 		.alg = "wp256",
3146da7f033dSHerbert Xu 		.test = alg_test_hash,
3147da7f033dSHerbert Xu 		.suite = {
3148da7f033dSHerbert Xu 			.hash = {
3149da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
3150da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
3151da7f033dSHerbert Xu 			}
3152da7f033dSHerbert Xu 		}
3153da7f033dSHerbert Xu 	}, {
3154da7f033dSHerbert Xu 		.alg = "wp384",
3155da7f033dSHerbert Xu 		.test = alg_test_hash,
3156da7f033dSHerbert Xu 		.suite = {
3157da7f033dSHerbert Xu 			.hash = {
3158da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
3159da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
3160da7f033dSHerbert Xu 			}
3161da7f033dSHerbert Xu 		}
3162da7f033dSHerbert Xu 	}, {
3163da7f033dSHerbert Xu 		.alg = "wp512",
3164da7f033dSHerbert Xu 		.test = alg_test_hash,
3165da7f033dSHerbert Xu 		.suite = {
3166da7f033dSHerbert Xu 			.hash = {
3167da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
3168da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
3169da7f033dSHerbert Xu 			}
3170da7f033dSHerbert Xu 		}
3171da7f033dSHerbert Xu 	}, {
3172da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3173da7f033dSHerbert Xu 		.test = alg_test_hash,
3174da7f033dSHerbert Xu 		.suite = {
3175da7f033dSHerbert Xu 			.hash = {
3176da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
3177da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
3178da7f033dSHerbert Xu 			}
3179da7f033dSHerbert Xu 		}
3180da7f033dSHerbert Xu 	}, {
3181da7f033dSHerbert Xu 		.alg = "xts(aes)",
31821aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
31832918aa8dSJarod Wilson 		.fips_allowed = 1,
3184da7f033dSHerbert Xu 		.suite = {
3185da7f033dSHerbert Xu 			.cipher = {
3186da7f033dSHerbert Xu 				.enc = {
3187da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
3188da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
3189da7f033dSHerbert Xu 				},
3190da7f033dSHerbert Xu 				.dec = {
3191da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
3192da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
3193da7f033dSHerbert Xu 				}
3194da7f033dSHerbert Xu 			}
3195da7f033dSHerbert Xu 		}
31960c01aed5SGeert Uytterhoeven 	}, {
31970840605eSJussi Kivilinna 		.alg = "xts(camellia)",
31980840605eSJussi Kivilinna 		.test = alg_test_skcipher,
31990840605eSJussi Kivilinna 		.suite = {
32000840605eSJussi Kivilinna 			.cipher = {
32010840605eSJussi Kivilinna 				.enc = {
32020840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
32030840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
32040840605eSJussi Kivilinna 				},
32050840605eSJussi Kivilinna 				.dec = {
32060840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
32070840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
32080840605eSJussi Kivilinna 				}
32090840605eSJussi Kivilinna 			}
32100840605eSJussi Kivilinna 		}
32110840605eSJussi Kivilinna 	}, {
32129b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
32139b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
32149b8b0405SJohannes Goetzfried 		.suite = {
32159b8b0405SJohannes Goetzfried 			.cipher = {
32169b8b0405SJohannes Goetzfried 				.enc = {
32179b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
32189b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
32199b8b0405SJohannes Goetzfried 				},
32209b8b0405SJohannes Goetzfried 				.dec = {
32219b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
32229b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
32239b8b0405SJohannes Goetzfried 				}
32249b8b0405SJohannes Goetzfried 			}
32259b8b0405SJohannes Goetzfried 		}
32269b8b0405SJohannes Goetzfried 	}, {
322718be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
322818be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
322918be20b9SJussi Kivilinna 		.suite = {
323018be20b9SJussi Kivilinna 			.cipher = {
323118be20b9SJussi Kivilinna 				.enc = {
323218be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
323318be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
323418be20b9SJussi Kivilinna 				},
323518be20b9SJussi Kivilinna 				.dec = {
323618be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
323718be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
323818be20b9SJussi Kivilinna 				}
323918be20b9SJussi Kivilinna 			}
324018be20b9SJussi Kivilinna 		}
324118be20b9SJussi Kivilinna 	}, {
3242aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3243aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3244aed265b9SJussi Kivilinna 		.suite = {
3245aed265b9SJussi Kivilinna 			.cipher = {
3246aed265b9SJussi Kivilinna 				.enc = {
3247aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
3248aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
3249aed265b9SJussi Kivilinna 				},
3250aed265b9SJussi Kivilinna 				.dec = {
3251aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
3252aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
3253aed265b9SJussi Kivilinna 				}
3254aed265b9SJussi Kivilinna 			}
3255aed265b9SJussi Kivilinna 		}
3256aed265b9SJussi Kivilinna 	}, {
32570c01aed5SGeert Uytterhoeven 		.alg = "zlib",
32580c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
32590c01aed5SGeert Uytterhoeven 		.suite = {
32600c01aed5SGeert Uytterhoeven 			.pcomp = {
32610c01aed5SGeert Uytterhoeven 				.comp = {
32620c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
32630c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
32640c01aed5SGeert Uytterhoeven 				},
32650c01aed5SGeert Uytterhoeven 				.decomp = {
32660c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
32670c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
32680c01aed5SGeert Uytterhoeven 				}
32690c01aed5SGeert Uytterhoeven 			}
32700c01aed5SGeert Uytterhoeven 		}
3271da7f033dSHerbert Xu 	}
3272da7f033dSHerbert Xu };
3273da7f033dSHerbert Xu 
32741aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3275da7f033dSHerbert Xu {
3276da7f033dSHerbert Xu 	int start = 0;
3277da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3278da7f033dSHerbert Xu 
3279da7f033dSHerbert Xu 	while (start < end) {
3280da7f033dSHerbert Xu 		int i = (start + end) / 2;
3281da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3282da7f033dSHerbert Xu 
3283da7f033dSHerbert Xu 		if (diff > 0) {
3284da7f033dSHerbert Xu 			end = i;
3285da7f033dSHerbert Xu 			continue;
3286da7f033dSHerbert Xu 		}
3287da7f033dSHerbert Xu 
3288da7f033dSHerbert Xu 		if (diff < 0) {
3289da7f033dSHerbert Xu 			start = i + 1;
3290da7f033dSHerbert Xu 			continue;
3291da7f033dSHerbert Xu 		}
3292da7f033dSHerbert Xu 
32931aa4ecd9SHerbert Xu 		return i;
3294da7f033dSHerbert Xu 	}
3295da7f033dSHerbert Xu 
32961aa4ecd9SHerbert Xu 	return -1;
32971aa4ecd9SHerbert Xu }
32981aa4ecd9SHerbert Xu 
32991aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
33001aa4ecd9SHerbert Xu {
33011aa4ecd9SHerbert Xu 	int i;
3302a68f6610SHerbert Xu 	int j;
3303d12d6b6dSNeil Horman 	int rc;
33041aa4ecd9SHerbert Xu 
33051aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
33061aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
33071aa4ecd9SHerbert Xu 
33081aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
33091aa4ecd9SHerbert Xu 		    sizeof(nalg))
33101aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
33111aa4ecd9SHerbert Xu 
33121aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
33131aa4ecd9SHerbert Xu 		if (i < 0)
33141aa4ecd9SHerbert Xu 			goto notest;
33151aa4ecd9SHerbert Xu 
3316a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3317a3bef3a3SJarod Wilson 			goto non_fips_alg;
3318a3bef3a3SJarod Wilson 
3319941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3320941fb328SJarod Wilson 		goto test_done;
33211aa4ecd9SHerbert Xu 	}
33221aa4ecd9SHerbert Xu 
33231aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3324a68f6610SHerbert Xu 	j = alg_find_test(driver);
3325a68f6610SHerbert Xu 	if (i < 0 && j < 0)
33261aa4ecd9SHerbert Xu 		goto notest;
33271aa4ecd9SHerbert Xu 
3328a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3329a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3330a3bef3a3SJarod Wilson 		goto non_fips_alg;
3331a3bef3a3SJarod Wilson 
3332a68f6610SHerbert Xu 	rc = 0;
3333a68f6610SHerbert Xu 	if (i >= 0)
3334a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
33351aa4ecd9SHerbert Xu 					     type, mask);
3336a68f6610SHerbert Xu 	if (j >= 0)
3337a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3338a68f6610SHerbert Xu 					     type, mask);
3339a68f6610SHerbert Xu 
3340941fb328SJarod Wilson test_done:
3341d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3342d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3343d12d6b6dSNeil Horman 
334429ecd4abSJarod Wilson 	if (fips_enabled && !rc)
334529ecd4abSJarod Wilson 		printk(KERN_INFO "alg: self-tests for %s (%s) passed\n",
334629ecd4abSJarod Wilson 		       driver, alg);
334729ecd4abSJarod Wilson 
3348d12d6b6dSNeil Horman 	return rc;
33491aa4ecd9SHerbert Xu 
33501aa4ecd9SHerbert Xu notest:
3351da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3352da7f033dSHerbert Xu 	return 0;
3353a3bef3a3SJarod Wilson non_fips_alg:
3354a3bef3a3SJarod Wilson 	return -EINVAL;
3355da7f033dSHerbert Xu }
33560b767f96SAlexander Shishkin 
3357326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
33580b767f96SAlexander Shishkin 
3359da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3360