xref: /openbmc/linux/crypto/testmgr.c (revision 58dcf548)
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,
36358dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
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 
42658dcf548SJussi Kivilinna 			/* some templates have no input data but they will
427da7f033dSHerbert Xu 			 * touch input
428da7f033dSHerbert Xu 			 */
429da7f033dSHerbert Xu 			input = xbuf[0];
43058dcf548SJussi Kivilinna 			input += align_offset;
431da7f033dSHerbert Xu 			assoc = axbuf[0];
432da7f033dSHerbert Xu 
433fd57f22aSHerbert Xu 			ret = -EINVAL;
43458dcf548SJussi Kivilinna 			if (WARN_ON(align_offset + template[i].ilen >
43558dcf548SJussi Kivilinna 				    PAGE_SIZE || template[i].alen > PAGE_SIZE))
436fd57f22aSHerbert Xu 				goto out;
437fd57f22aSHerbert Xu 
438da7f033dSHerbert Xu 			memcpy(input, template[i].input, template[i].ilen);
439da7f033dSHerbert Xu 			memcpy(assoc, template[i].assoc, template[i].alen);
440da7f033dSHerbert Xu 			if (template[i].iv)
441da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
442da7f033dSHerbert Xu 			else
443da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
444da7f033dSHerbert Xu 
445da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
446da7f033dSHerbert Xu 			if (template[i].wk)
447da7f033dSHerbert Xu 				crypto_aead_set_flags(
448da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
449da7f033dSHerbert Xu 
450da7f033dSHerbert Xu 			key = template[i].key;
451da7f033dSHerbert Xu 
452da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key,
453da7f033dSHerbert Xu 						 template[i].klen);
454da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
455d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
456d8a32ac2SJussi Kivilinna 				       d, j, algo, crypto_aead_get_flags(tfm));
457da7f033dSHerbert Xu 				goto out;
458da7f033dSHerbert Xu 			} else if (ret)
459da7f033dSHerbert Xu 				continue;
460da7f033dSHerbert Xu 
461da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
462da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
463da7f033dSHerbert Xu 			if (ret) {
464d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
465d8a32ac2SJussi Kivilinna 				       d, authsize, j, algo);
466da7f033dSHerbert Xu 				goto out;
467da7f033dSHerbert Xu 			}
468da7f033dSHerbert Xu 
469da7f033dSHerbert Xu 			sg_init_one(&sg[0], input,
470da7f033dSHerbert Xu 				    template[i].ilen + (enc ? authsize : 0));
471da7f033dSHerbert Xu 
472d8a32ac2SJussi Kivilinna 			if (diff_dst) {
473d8a32ac2SJussi Kivilinna 				output = xoutbuf[0];
47458dcf548SJussi Kivilinna 				output += align_offset;
475d8a32ac2SJussi Kivilinna 				sg_init_one(&sgout[0], output,
476d8a32ac2SJussi Kivilinna 					    template[i].ilen +
477d8a32ac2SJussi Kivilinna 						(enc ? authsize : 0));
478d8a32ac2SJussi Kivilinna 			} else {
479d8a32ac2SJussi Kivilinna 				output = input;
480d8a32ac2SJussi Kivilinna 			}
481d8a32ac2SJussi Kivilinna 
482da7f033dSHerbert Xu 			sg_init_one(&asg[0], assoc, template[i].alen);
483da7f033dSHerbert Xu 
484d8a32ac2SJussi Kivilinna 			aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
485da7f033dSHerbert Xu 					       template[i].ilen, iv);
486da7f033dSHerbert Xu 
487da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
488da7f033dSHerbert Xu 
489da7f033dSHerbert Xu 			ret = enc ?
490da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
491da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
492da7f033dSHerbert Xu 
493da7f033dSHerbert Xu 			switch (ret) {
494da7f033dSHerbert Xu 			case 0:
495e44a1b44SJarod Wilson 				if (template[i].novrfy) {
496e44a1b44SJarod Wilson 					/* verification was supposed to fail */
497d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
498d8a32ac2SJussi Kivilinna 					       d, e, j, algo);
499e44a1b44SJarod Wilson 					/* so really, we got a bad message */
500e44a1b44SJarod Wilson 					ret = -EBADMSG;
501e44a1b44SJarod Wilson 					goto out;
502e44a1b44SJarod Wilson 				}
503da7f033dSHerbert Xu 				break;
504da7f033dSHerbert Xu 			case -EINPROGRESS:
505da7f033dSHerbert Xu 			case -EBUSY:
506da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
507da7f033dSHerbert Xu 					&result.completion);
508da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
509da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
510da7f033dSHerbert Xu 					break;
511da7f033dSHerbert Xu 				}
512e44a1b44SJarod Wilson 			case -EBADMSG:
513e44a1b44SJarod Wilson 				if (template[i].novrfy)
514e44a1b44SJarod Wilson 					/* verification failure was expected */
515e44a1b44SJarod Wilson 					continue;
516da7f033dSHerbert Xu 				/* fall through */
517da7f033dSHerbert Xu 			default:
518d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
519d8a32ac2SJussi Kivilinna 				       d, e, j, algo, -ret);
520da7f033dSHerbert Xu 				goto out;
521da7f033dSHerbert Xu 			}
522da7f033dSHerbert Xu 
523d8a32ac2SJussi Kivilinna 			q = output;
524da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
525d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Test %d failed on %s for %s\n",
526d8a32ac2SJussi Kivilinna 				       d, j, e, algo);
527da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
528da7f033dSHerbert Xu 				ret = -EINVAL;
529da7f033dSHerbert Xu 				goto out;
530da7f033dSHerbert Xu 			}
531da7f033dSHerbert Xu 		}
532da7f033dSHerbert Xu 	}
533da7f033dSHerbert Xu 
534da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
53558dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
53658dcf548SJussi Kivilinna 		if (align_offset != 0)
53758dcf548SJussi Kivilinna 			break;
53858dcf548SJussi Kivilinna 
539da7f033dSHerbert Xu 		if (template[i].np) {
540da7f033dSHerbert Xu 			j++;
541da7f033dSHerbert Xu 
542da7f033dSHerbert Xu 			if (template[i].iv)
543da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
544da7f033dSHerbert Xu 			else
545da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
546da7f033dSHerbert Xu 
547da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
548da7f033dSHerbert Xu 			if (template[i].wk)
549da7f033dSHerbert Xu 				crypto_aead_set_flags(
550da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
551da7f033dSHerbert Xu 			key = template[i].key;
552da7f033dSHerbert Xu 
553da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key, template[i].klen);
554da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
555d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
556d8a32ac2SJussi Kivilinna 				       d, j, algo, crypto_aead_get_flags(tfm));
557da7f033dSHerbert Xu 				goto out;
558da7f033dSHerbert Xu 			} else if (ret)
559da7f033dSHerbert Xu 				continue;
560da7f033dSHerbert Xu 
561da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
562da7f033dSHerbert Xu 
563da7f033dSHerbert Xu 			ret = -EINVAL;
564da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
565d8a32ac2SJussi Kivilinna 			if (diff_dst)
566d8a32ac2SJussi Kivilinna 				sg_init_table(sgout, template[i].np);
567da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
568da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
569da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
570da7f033dSHerbert Xu 					goto out;
571da7f033dSHerbert Xu 
572da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
573da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
574da7f033dSHerbert Xu 
575da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
576da7f033dSHerbert Xu 				       template[i].tap[k]);
577da7f033dSHerbert Xu 
578da7f033dSHerbert Xu 				n = template[i].tap[k];
579da7f033dSHerbert Xu 				if (k == template[i].np - 1 && enc)
580da7f033dSHerbert Xu 					n += authsize;
581da7f033dSHerbert Xu 				if (offset_in_page(q) + n < PAGE_SIZE)
582da7f033dSHerbert Xu 					q[n] = 0;
583da7f033dSHerbert Xu 
584da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
585d8a32ac2SJussi Kivilinna 
586d8a32ac2SJussi Kivilinna 				if (diff_dst) {
587d8a32ac2SJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
588d8a32ac2SJussi Kivilinna 					    offset_in_page(IDX[k]);
589d8a32ac2SJussi Kivilinna 
590d8a32ac2SJussi Kivilinna 					memset(q, 0, template[i].tap[k]);
591d8a32ac2SJussi Kivilinna 					if (offset_in_page(q) + n < PAGE_SIZE)
592d8a32ac2SJussi Kivilinna 						q[n] = 0;
593d8a32ac2SJussi Kivilinna 
594d8a32ac2SJussi Kivilinna 					sg_set_buf(&sgout[k], q,
595d8a32ac2SJussi Kivilinna 						   template[i].tap[k]);
596d8a32ac2SJussi Kivilinna 				}
597d8a32ac2SJussi Kivilinna 
598da7f033dSHerbert Xu 				temp += template[i].tap[k];
599da7f033dSHerbert Xu 			}
600da7f033dSHerbert Xu 
601da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
602da7f033dSHerbert Xu 			if (ret) {
603d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
604d8a32ac2SJussi Kivilinna 				       d, authsize, j, algo);
605da7f033dSHerbert Xu 				goto out;
606da7f033dSHerbert Xu 			}
607da7f033dSHerbert Xu 
608da7f033dSHerbert Xu 			if (enc) {
609da7f033dSHerbert Xu 				if (WARN_ON(sg[k - 1].offset +
610da7f033dSHerbert Xu 					    sg[k - 1].length + authsize >
611da7f033dSHerbert Xu 					    PAGE_SIZE)) {
612da7f033dSHerbert Xu 					ret = -EINVAL;
613da7f033dSHerbert Xu 					goto out;
614da7f033dSHerbert Xu 				}
615da7f033dSHerbert Xu 
616da7f033dSHerbert Xu 				sg[k - 1].length += authsize;
617d8a32ac2SJussi Kivilinna 
618d8a32ac2SJussi Kivilinna 				if (diff_dst)
619d8a32ac2SJussi Kivilinna 					sgout[k - 1].length += authsize;
620da7f033dSHerbert Xu 			}
621da7f033dSHerbert Xu 
622da7f033dSHerbert Xu 			sg_init_table(asg, template[i].anp);
623fd57f22aSHerbert Xu 			ret = -EINVAL;
624da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].anp; k++) {
625fd57f22aSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
626fd57f22aSHerbert Xu 					    template[i].atap[k] > PAGE_SIZE))
627fd57f22aSHerbert Xu 					goto out;
628da7f033dSHerbert Xu 				sg_set_buf(&asg[k],
629da7f033dSHerbert Xu 					   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
630da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
631da7f033dSHerbert Xu 						  template[i].assoc + temp,
632da7f033dSHerbert Xu 						  template[i].atap[k]),
633da7f033dSHerbert Xu 					   template[i].atap[k]);
634da7f033dSHerbert Xu 				temp += template[i].atap[k];
635da7f033dSHerbert Xu 			}
636da7f033dSHerbert Xu 
637d8a32ac2SJussi Kivilinna 			aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
638da7f033dSHerbert Xu 					       template[i].ilen,
639da7f033dSHerbert Xu 					       iv);
640da7f033dSHerbert Xu 
641da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
642da7f033dSHerbert Xu 
643da7f033dSHerbert Xu 			ret = enc ?
644da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
645da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
646da7f033dSHerbert Xu 
647da7f033dSHerbert Xu 			switch (ret) {
648da7f033dSHerbert Xu 			case 0:
649e44a1b44SJarod Wilson 				if (template[i].novrfy) {
650e44a1b44SJarod Wilson 					/* verification was supposed to fail */
651d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
652d8a32ac2SJussi Kivilinna 					       d, e, j, algo);
653e44a1b44SJarod Wilson 					/* so really, we got a bad message */
654e44a1b44SJarod Wilson 					ret = -EBADMSG;
655e44a1b44SJarod Wilson 					goto out;
656e44a1b44SJarod Wilson 				}
657da7f033dSHerbert Xu 				break;
658da7f033dSHerbert Xu 			case -EINPROGRESS:
659da7f033dSHerbert Xu 			case -EBUSY:
660da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
661da7f033dSHerbert Xu 					&result.completion);
662da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
663da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
664da7f033dSHerbert Xu 					break;
665da7f033dSHerbert Xu 				}
666e44a1b44SJarod Wilson 			case -EBADMSG:
667e44a1b44SJarod Wilson 				if (template[i].novrfy)
668e44a1b44SJarod Wilson 					/* verification failure was expected */
669e44a1b44SJarod Wilson 					continue;
670da7f033dSHerbert Xu 				/* fall through */
671da7f033dSHerbert Xu 			default:
672d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
673d8a32ac2SJussi Kivilinna 				       d, e, j, algo, -ret);
674da7f033dSHerbert Xu 				goto out;
675da7f033dSHerbert Xu 			}
676da7f033dSHerbert Xu 
677da7f033dSHerbert Xu 			ret = -EINVAL;
678da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
679d8a32ac2SJussi Kivilinna 				if (diff_dst)
680d8a32ac2SJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
681d8a32ac2SJussi Kivilinna 					    offset_in_page(IDX[k]);
682d8a32ac2SJussi Kivilinna 				else
683da7f033dSHerbert Xu 					q = xbuf[IDX[k] >> PAGE_SHIFT] +
684da7f033dSHerbert Xu 					    offset_in_page(IDX[k]);
685da7f033dSHerbert Xu 
686da7f033dSHerbert Xu 				n = template[i].tap[k];
687da7f033dSHerbert Xu 				if (k == template[i].np - 1)
688da7f033dSHerbert Xu 					n += enc ? authsize : -authsize;
689da7f033dSHerbert Xu 
690da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp, n)) {
691d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
692d8a32ac2SJussi Kivilinna 					       d, j, e, k, algo);
693da7f033dSHerbert Xu 					hexdump(q, n);
694da7f033dSHerbert Xu 					goto out;
695da7f033dSHerbert Xu 				}
696da7f033dSHerbert Xu 
697da7f033dSHerbert Xu 				q += n;
698da7f033dSHerbert Xu 				if (k == template[i].np - 1 && !enc) {
699d8a32ac2SJussi Kivilinna 					if (!diff_dst &&
700d8a32ac2SJussi Kivilinna 						memcmp(q, template[i].input +
701da7f033dSHerbert Xu 						      temp + n, authsize))
702da7f033dSHerbert Xu 						n = authsize;
703da7f033dSHerbert Xu 					else
704da7f033dSHerbert Xu 						n = 0;
705da7f033dSHerbert Xu 				} else {
706da7f033dSHerbert Xu 					for (n = 0; offset_in_page(q + n) &&
707da7f033dSHerbert Xu 						    q[n]; n++)
708da7f033dSHerbert Xu 						;
709da7f033dSHerbert Xu 				}
710da7f033dSHerbert Xu 				if (n) {
711d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
712d8a32ac2SJussi Kivilinna 					       d, j, e, k, algo, n);
713da7f033dSHerbert Xu 					hexdump(q, n);
714da7f033dSHerbert Xu 					goto out;
715da7f033dSHerbert Xu 				}
716da7f033dSHerbert Xu 
717da7f033dSHerbert Xu 				temp += template[i].tap[k];
718da7f033dSHerbert Xu 			}
719da7f033dSHerbert Xu 		}
720da7f033dSHerbert Xu 	}
721da7f033dSHerbert Xu 
722da7f033dSHerbert Xu 	ret = 0;
723da7f033dSHerbert Xu 
724da7f033dSHerbert Xu out:
725da7f033dSHerbert Xu 	aead_request_free(req);
726d8a32ac2SJussi Kivilinna 	kfree(sg);
727d8a32ac2SJussi Kivilinna out_nosg:
728d8a32ac2SJussi Kivilinna 	if (diff_dst)
729d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
730d8a32ac2SJussi Kivilinna out_nooutbuf:
731f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
732f8b0d4d0SHerbert Xu out_noaxbuf:
733f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
734f8b0d4d0SHerbert Xu out_noxbuf:
735da7f033dSHerbert Xu 	return ret;
736da7f033dSHerbert Xu }
737da7f033dSHerbert Xu 
738d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
739d8a32ac2SJussi Kivilinna 		     struct aead_testvec *template, unsigned int tcount)
740d8a32ac2SJussi Kivilinna {
74158dcf548SJussi Kivilinna 	unsigned int alignmask;
742d8a32ac2SJussi Kivilinna 	int ret;
743d8a32ac2SJussi Kivilinna 
744d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
74558dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
746d8a32ac2SJussi Kivilinna 	if (ret)
747d8a32ac2SJussi Kivilinna 		return ret;
748d8a32ac2SJussi Kivilinna 
749d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
75058dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
75158dcf548SJussi Kivilinna 	if (ret)
75258dcf548SJussi Kivilinna 		return ret;
75358dcf548SJussi Kivilinna 
75458dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
75558dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
75658dcf548SJussi Kivilinna 	if (ret)
75758dcf548SJussi Kivilinna 		return ret;
75858dcf548SJussi Kivilinna 
75958dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
76058dcf548SJussi Kivilinna 	if (alignmask) {
76158dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
76258dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
76358dcf548SJussi Kivilinna 				  alignmask + 1);
76458dcf548SJussi Kivilinna 		if (ret)
76558dcf548SJussi Kivilinna 			return ret;
76658dcf548SJussi Kivilinna 	}
76758dcf548SJussi Kivilinna 
76858dcf548SJussi Kivilinna 	return 0;
769d8a32ac2SJussi Kivilinna }
770d8a32ac2SJussi Kivilinna 
7711aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
7721aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
7731aa4ecd9SHerbert Xu {
7741aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
7751aa4ecd9SHerbert Xu 	unsigned int i, j, k;
7761aa4ecd9SHerbert Xu 	char *q;
7771aa4ecd9SHerbert Xu 	const char *e;
7781aa4ecd9SHerbert Xu 	void *data;
779f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
780f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
781f8b0d4d0SHerbert Xu 
782f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
783f8b0d4d0SHerbert Xu 		goto out_nobuf;
7841aa4ecd9SHerbert Xu 
7851aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
7861aa4ecd9SHerbert Xu 	        e = "encryption";
7871aa4ecd9SHerbert Xu 	else
7881aa4ecd9SHerbert Xu 		e = "decryption";
7891aa4ecd9SHerbert Xu 
7901aa4ecd9SHerbert Xu 	j = 0;
7911aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
7921aa4ecd9SHerbert Xu 		if (template[i].np)
7931aa4ecd9SHerbert Xu 			continue;
7941aa4ecd9SHerbert Xu 
7951aa4ecd9SHerbert Xu 		j++;
7961aa4ecd9SHerbert Xu 
797fd57f22aSHerbert Xu 		ret = -EINVAL;
798fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
799fd57f22aSHerbert Xu 			goto out;
800fd57f22aSHerbert Xu 
8011aa4ecd9SHerbert Xu 		data = xbuf[0];
8021aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
8031aa4ecd9SHerbert Xu 
8041aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
8051aa4ecd9SHerbert Xu 		if (template[i].wk)
8061aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
8071aa4ecd9SHerbert Xu 
8081aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
8091aa4ecd9SHerbert Xu 					   template[i].klen);
8101aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
8111aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
8121aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
8131aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
8141aa4ecd9SHerbert Xu 			goto out;
8151aa4ecd9SHerbert Xu 		} else if (ret)
8161aa4ecd9SHerbert Xu 			continue;
8171aa4ecd9SHerbert Xu 
8181aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
8191aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
8201aa4ecd9SHerbert Xu 			if (enc)
8211aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
8221aa4ecd9SHerbert Xu 							  data + k);
8231aa4ecd9SHerbert Xu 			else
8241aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
8251aa4ecd9SHerbert Xu 							  data + k);
8261aa4ecd9SHerbert Xu 		}
8271aa4ecd9SHerbert Xu 
8281aa4ecd9SHerbert Xu 		q = data;
8291aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
8301aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
8311aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
8321aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
8331aa4ecd9SHerbert Xu 			ret = -EINVAL;
8341aa4ecd9SHerbert Xu 			goto out;
8351aa4ecd9SHerbert Xu 		}
8361aa4ecd9SHerbert Xu 	}
8371aa4ecd9SHerbert Xu 
8381aa4ecd9SHerbert Xu 	ret = 0;
8391aa4ecd9SHerbert Xu 
8401aa4ecd9SHerbert Xu out:
841f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
842f8b0d4d0SHerbert Xu out_nobuf:
8431aa4ecd9SHerbert Xu 	return ret;
8441aa4ecd9SHerbert Xu }
8451aa4ecd9SHerbert Xu 
84608d6af8cSJussi Kivilinna static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc,
84708d6af8cSJussi Kivilinna 			   struct cipher_testvec *template, unsigned int tcount,
8483a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
849da7f033dSHerbert Xu {
850da7f033dSHerbert Xu 	const char *algo =
851da7f033dSHerbert Xu 		crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
852da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
853da7f033dSHerbert Xu 	char *q;
854da7f033dSHerbert Xu 	struct ablkcipher_request *req;
855da7f033dSHerbert Xu 	struct scatterlist sg[8];
85608d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
85708d6af8cSJussi Kivilinna 	const char *e, *d;
858da7f033dSHerbert Xu 	struct tcrypt_result result;
859da7f033dSHerbert Xu 	void *data;
860da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
861f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
86208d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
863f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
864f8b0d4d0SHerbert Xu 
865f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
866f8b0d4d0SHerbert Xu 		goto out_nobuf;
867da7f033dSHerbert Xu 
86808d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
86908d6af8cSJussi Kivilinna 		goto out_nooutbuf;
87008d6af8cSJussi Kivilinna 
87108d6af8cSJussi Kivilinna 	if (diff_dst)
87208d6af8cSJussi Kivilinna 		d = "-ddst";
87308d6af8cSJussi Kivilinna 	else
87408d6af8cSJussi Kivilinna 		d = "";
87508d6af8cSJussi Kivilinna 
876da7f033dSHerbert Xu 	if (enc == ENCRYPT)
877da7f033dSHerbert Xu 	        e = "encryption";
878da7f033dSHerbert Xu 	else
879da7f033dSHerbert Xu 		e = "decryption";
880da7f033dSHerbert Xu 
881da7f033dSHerbert Xu 	init_completion(&result.completion);
882da7f033dSHerbert Xu 
883da7f033dSHerbert Xu 	req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
884da7f033dSHerbert Xu 	if (!req) {
88508d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
88608d6af8cSJussi Kivilinna 		       d, algo);
887da7f033dSHerbert Xu 		goto out;
888da7f033dSHerbert Xu 	}
889da7f033dSHerbert Xu 
890da7f033dSHerbert Xu 	ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
891da7f033dSHerbert Xu 					tcrypt_complete, &result);
892da7f033dSHerbert Xu 
893da7f033dSHerbert Xu 	j = 0;
894da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
895da7f033dSHerbert Xu 		if (template[i].iv)
896da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
897da7f033dSHerbert Xu 		else
898da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
899da7f033dSHerbert Xu 
900f44d83d1SJussi Kivilinna 		if (!(template[i].np) || (template[i].also_non_np)) {
901da7f033dSHerbert Xu 			j++;
902da7f033dSHerbert Xu 
903fd57f22aSHerbert Xu 			ret = -EINVAL;
9043a338f20SJussi Kivilinna 			if (WARN_ON(align_offset + template[i].ilen >
9053a338f20SJussi Kivilinna 				    PAGE_SIZE))
906fd57f22aSHerbert Xu 				goto out;
907fd57f22aSHerbert Xu 
908da7f033dSHerbert Xu 			data = xbuf[0];
9093a338f20SJussi Kivilinna 			data += align_offset;
910da7f033dSHerbert Xu 			memcpy(data, template[i].input, template[i].ilen);
911da7f033dSHerbert Xu 
912da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
913da7f033dSHerbert Xu 			if (template[i].wk)
914da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
915da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
916da7f033dSHerbert Xu 
917da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
918da7f033dSHerbert Xu 						       template[i].klen);
919da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
92008d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
92108d6af8cSJussi Kivilinna 				       d, j, algo,
92208d6af8cSJussi Kivilinna 				       crypto_ablkcipher_get_flags(tfm));
923da7f033dSHerbert Xu 				goto out;
924da7f033dSHerbert Xu 			} else if (ret)
925da7f033dSHerbert Xu 				continue;
926da7f033dSHerbert Xu 
927da7f033dSHerbert Xu 			sg_init_one(&sg[0], data, template[i].ilen);
92808d6af8cSJussi Kivilinna 			if (diff_dst) {
92908d6af8cSJussi Kivilinna 				data = xoutbuf[0];
9303a338f20SJussi Kivilinna 				data += align_offset;
93108d6af8cSJussi Kivilinna 				sg_init_one(&sgout[0], data, template[i].ilen);
93208d6af8cSJussi Kivilinna 			}
933da7f033dSHerbert Xu 
93408d6af8cSJussi Kivilinna 			ablkcipher_request_set_crypt(req, sg,
93508d6af8cSJussi Kivilinna 						     (diff_dst) ? sgout : sg,
936da7f033dSHerbert Xu 						     template[i].ilen, iv);
937da7f033dSHerbert Xu 			ret = enc ?
938da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
939da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
940da7f033dSHerbert Xu 
941da7f033dSHerbert Xu 			switch (ret) {
942da7f033dSHerbert Xu 			case 0:
943da7f033dSHerbert Xu 				break;
944da7f033dSHerbert Xu 			case -EINPROGRESS:
945da7f033dSHerbert Xu 			case -EBUSY:
946da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
947da7f033dSHerbert Xu 					&result.completion);
948da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
949da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
950da7f033dSHerbert Xu 					break;
951da7f033dSHerbert Xu 				}
952da7f033dSHerbert Xu 				/* fall through */
953da7f033dSHerbert Xu 			default:
95408d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
95508d6af8cSJussi Kivilinna 				       d, e, j, algo, -ret);
956da7f033dSHerbert Xu 				goto out;
957da7f033dSHerbert Xu 			}
958da7f033dSHerbert Xu 
959da7f033dSHerbert Xu 			q = data;
960da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
96108d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Test %d failed on %s for %s\n",
96208d6af8cSJussi Kivilinna 				       d, j, e, algo);
963da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
964da7f033dSHerbert Xu 				ret = -EINVAL;
965da7f033dSHerbert Xu 				goto out;
966da7f033dSHerbert Xu 			}
967da7f033dSHerbert Xu 		}
968da7f033dSHerbert Xu 	}
969da7f033dSHerbert Xu 
970da7f033dSHerbert Xu 	j = 0;
971da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
9723a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
9733a338f20SJussi Kivilinna 		if (align_offset != 0)
9743a338f20SJussi Kivilinna 			break;
975da7f033dSHerbert Xu 
976da7f033dSHerbert Xu 		if (template[i].iv)
977da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
978da7f033dSHerbert Xu 		else
979da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
980da7f033dSHerbert Xu 
981da7f033dSHerbert Xu 		if (template[i].np) {
982da7f033dSHerbert Xu 			j++;
983da7f033dSHerbert Xu 
984da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
985da7f033dSHerbert Xu 			if (template[i].wk)
986da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
987da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
988da7f033dSHerbert Xu 
989da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
990da7f033dSHerbert Xu 						       template[i].klen);
991da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
99208d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
99308d6af8cSJussi Kivilinna 				       d, j, algo,
994da7f033dSHerbert Xu 				       crypto_ablkcipher_get_flags(tfm));
995da7f033dSHerbert Xu 				goto out;
996da7f033dSHerbert Xu 			} else if (ret)
997da7f033dSHerbert Xu 				continue;
998da7f033dSHerbert Xu 
999da7f033dSHerbert Xu 			temp = 0;
1000da7f033dSHerbert Xu 			ret = -EINVAL;
1001da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
100208d6af8cSJussi Kivilinna 			if (diff_dst)
100308d6af8cSJussi Kivilinna 				sg_init_table(sgout, template[i].np);
1004da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
1005da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
1006da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
1007da7f033dSHerbert Xu 					goto out;
1008da7f033dSHerbert Xu 
1009da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1010da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1011da7f033dSHerbert Xu 
1012da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
1013da7f033dSHerbert Xu 				       template[i].tap[k]);
1014da7f033dSHerbert Xu 
1015da7f033dSHerbert Xu 				if (offset_in_page(q) + template[i].tap[k] <
1016da7f033dSHerbert Xu 				    PAGE_SIZE)
1017da7f033dSHerbert Xu 					q[template[i].tap[k]] = 0;
1018da7f033dSHerbert Xu 
1019da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
102008d6af8cSJussi Kivilinna 				if (diff_dst) {
102108d6af8cSJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
102208d6af8cSJussi Kivilinna 					    offset_in_page(IDX[k]);
102308d6af8cSJussi Kivilinna 
102408d6af8cSJussi Kivilinna 					sg_set_buf(&sgout[k], q,
102508d6af8cSJussi Kivilinna 						   template[i].tap[k]);
102608d6af8cSJussi Kivilinna 
102708d6af8cSJussi Kivilinna 					memset(q, 0, template[i].tap[k]);
102808d6af8cSJussi Kivilinna 					if (offset_in_page(q) +
102908d6af8cSJussi Kivilinna 					    template[i].tap[k] < PAGE_SIZE)
103008d6af8cSJussi Kivilinna 						q[template[i].tap[k]] = 0;
103108d6af8cSJussi Kivilinna 				}
1032da7f033dSHerbert Xu 
1033da7f033dSHerbert Xu 				temp += template[i].tap[k];
1034da7f033dSHerbert Xu 			}
1035da7f033dSHerbert Xu 
103608d6af8cSJussi Kivilinna 			ablkcipher_request_set_crypt(req, sg,
103708d6af8cSJussi Kivilinna 					(diff_dst) ? sgout : sg,
1038da7f033dSHerbert Xu 					template[i].ilen, iv);
1039da7f033dSHerbert Xu 
1040da7f033dSHerbert Xu 			ret = enc ?
1041da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
1042da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
1043da7f033dSHerbert Xu 
1044da7f033dSHerbert Xu 			switch (ret) {
1045da7f033dSHerbert Xu 			case 0:
1046da7f033dSHerbert Xu 				break;
1047da7f033dSHerbert Xu 			case -EINPROGRESS:
1048da7f033dSHerbert Xu 			case -EBUSY:
1049da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
1050da7f033dSHerbert Xu 					&result.completion);
1051da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
1052da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
1053da7f033dSHerbert Xu 					break;
1054da7f033dSHerbert Xu 				}
1055da7f033dSHerbert Xu 				/* fall through */
1056da7f033dSHerbert Xu 			default:
105708d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
105808d6af8cSJussi Kivilinna 				       d, e, j, algo, -ret);
1059da7f033dSHerbert Xu 				goto out;
1060da7f033dSHerbert Xu 			}
1061da7f033dSHerbert Xu 
1062da7f033dSHerbert Xu 			temp = 0;
1063da7f033dSHerbert Xu 			ret = -EINVAL;
1064da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
106508d6af8cSJussi Kivilinna 				if (diff_dst)
106608d6af8cSJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
106708d6af8cSJussi Kivilinna 					    offset_in_page(IDX[k]);
106808d6af8cSJussi Kivilinna 				else
1069da7f033dSHerbert Xu 					q = xbuf[IDX[k] >> PAGE_SHIFT] +
1070da7f033dSHerbert Xu 					    offset_in_page(IDX[k]);
1071da7f033dSHerbert Xu 
1072da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp,
1073da7f033dSHerbert Xu 					   template[i].tap[k])) {
107408d6af8cSJussi Kivilinna 					pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
107508d6af8cSJussi Kivilinna 					       d, j, e, k, algo);
1076da7f033dSHerbert Xu 					hexdump(q, template[i].tap[k]);
1077da7f033dSHerbert Xu 					goto out;
1078da7f033dSHerbert Xu 				}
1079da7f033dSHerbert Xu 
1080da7f033dSHerbert Xu 				q += template[i].tap[k];
1081da7f033dSHerbert Xu 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
1082da7f033dSHerbert Xu 					;
1083da7f033dSHerbert Xu 				if (n) {
108408d6af8cSJussi Kivilinna 					pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
108508d6af8cSJussi Kivilinna 					       d, j, e, k, algo, n);
1086da7f033dSHerbert Xu 					hexdump(q, n);
1087da7f033dSHerbert Xu 					goto out;
1088da7f033dSHerbert Xu 				}
1089da7f033dSHerbert Xu 				temp += template[i].tap[k];
1090da7f033dSHerbert Xu 			}
1091da7f033dSHerbert Xu 		}
1092da7f033dSHerbert Xu 	}
1093da7f033dSHerbert Xu 
1094da7f033dSHerbert Xu 	ret = 0;
1095da7f033dSHerbert Xu 
1096da7f033dSHerbert Xu out:
1097da7f033dSHerbert Xu 	ablkcipher_request_free(req);
109808d6af8cSJussi Kivilinna 	if (diff_dst)
109908d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
110008d6af8cSJussi Kivilinna out_nooutbuf:
1101f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1102f8b0d4d0SHerbert Xu out_nobuf:
1103da7f033dSHerbert Xu 	return ret;
1104da7f033dSHerbert Xu }
1105da7f033dSHerbert Xu 
110608d6af8cSJussi Kivilinna static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
110708d6af8cSJussi Kivilinna 			 struct cipher_testvec *template, unsigned int tcount)
110808d6af8cSJussi Kivilinna {
11093a338f20SJussi Kivilinna 	unsigned int alignmask;
111008d6af8cSJussi Kivilinna 	int ret;
111108d6af8cSJussi Kivilinna 
111208d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
11133a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
111408d6af8cSJussi Kivilinna 	if (ret)
111508d6af8cSJussi Kivilinna 		return ret;
111608d6af8cSJussi Kivilinna 
111708d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
11183a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
11193a338f20SJussi Kivilinna 	if (ret)
11203a338f20SJussi Kivilinna 		return ret;
11213a338f20SJussi Kivilinna 
11223a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
11233a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
11243a338f20SJussi Kivilinna 	if (ret)
11253a338f20SJussi Kivilinna 		return ret;
11263a338f20SJussi Kivilinna 
11273a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
11283a338f20SJussi Kivilinna 	if (alignmask) {
11293a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
11303a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
11313a338f20SJussi Kivilinna 				      alignmask + 1);
11323a338f20SJussi Kivilinna 		if (ret)
11333a338f20SJussi Kivilinna 			return ret;
11343a338f20SJussi Kivilinna 	}
11353a338f20SJussi Kivilinna 
11363a338f20SJussi Kivilinna 	return 0;
113708d6af8cSJussi Kivilinna }
113808d6af8cSJussi Kivilinna 
1139da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1140da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1141da7f033dSHerbert Xu {
1142da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1143da7f033dSHerbert Xu 	unsigned int i;
1144da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1145da7f033dSHerbert Xu 	int ret;
1146da7f033dSHerbert Xu 
1147da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1148c79cf910SGeert Uytterhoeven 		int ilen;
1149c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1150da7f033dSHerbert Xu 
1151da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1152da7f033dSHerbert Xu 
1153da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1154da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1155da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1156da7f033dSHerbert Xu 		if (ret) {
1157da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1158da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1159da7f033dSHerbert Xu 			       -ret);
1160da7f033dSHerbert Xu 			goto out;
1161da7f033dSHerbert Xu 		}
1162da7f033dSHerbert Xu 
1163b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1164b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1165b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1166b812eb00SGeert Uytterhoeven 			       dlen);
1167b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1168b812eb00SGeert Uytterhoeven 			goto out;
1169b812eb00SGeert Uytterhoeven 		}
1170b812eb00SGeert Uytterhoeven 
1171da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1172da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1173da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1174da7f033dSHerbert Xu 			hexdump(result, dlen);
1175da7f033dSHerbert Xu 			ret = -EINVAL;
1176da7f033dSHerbert Xu 			goto out;
1177da7f033dSHerbert Xu 		}
1178da7f033dSHerbert Xu 	}
1179da7f033dSHerbert Xu 
1180da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1181c79cf910SGeert Uytterhoeven 		int ilen;
1182c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1183da7f033dSHerbert Xu 
1184da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1185da7f033dSHerbert Xu 
1186da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1187da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1188da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1189da7f033dSHerbert Xu 		if (ret) {
1190da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1191da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1192da7f033dSHerbert Xu 			       -ret);
1193da7f033dSHerbert Xu 			goto out;
1194da7f033dSHerbert Xu 		}
1195da7f033dSHerbert Xu 
1196b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1197b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1198b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1199b812eb00SGeert Uytterhoeven 			       dlen);
1200b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1201b812eb00SGeert Uytterhoeven 			goto out;
1202b812eb00SGeert Uytterhoeven 		}
1203b812eb00SGeert Uytterhoeven 
1204da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1205da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1206da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1207da7f033dSHerbert Xu 			hexdump(result, dlen);
1208da7f033dSHerbert Xu 			ret = -EINVAL;
1209da7f033dSHerbert Xu 			goto out;
1210da7f033dSHerbert Xu 		}
1211da7f033dSHerbert Xu 	}
1212da7f033dSHerbert Xu 
1213da7f033dSHerbert Xu 	ret = 0;
1214da7f033dSHerbert Xu 
1215da7f033dSHerbert Xu out:
1216da7f033dSHerbert Xu 	return ret;
1217da7f033dSHerbert Xu }
1218da7f033dSHerbert Xu 
12198064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm,
12208064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *ctemplate,
12218064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *dtemplate, int ctcount,
12228064efb8SGeert Uytterhoeven 		      int dtcount)
12238064efb8SGeert Uytterhoeven {
12248064efb8SGeert Uytterhoeven 	const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
12258064efb8SGeert Uytterhoeven 	unsigned int i;
12268064efb8SGeert Uytterhoeven 	char result[COMP_BUF_SIZE];
12273ce858cbSGeert Uytterhoeven 	int res;
12288064efb8SGeert Uytterhoeven 
12298064efb8SGeert Uytterhoeven 	for (i = 0; i < ctcount; i++) {
12308064efb8SGeert Uytterhoeven 		struct comp_request req;
12313ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
12328064efb8SGeert Uytterhoeven 
12333ce858cbSGeert Uytterhoeven 		res = crypto_compress_setup(tfm, ctemplate[i].params,
12348064efb8SGeert Uytterhoeven 					    ctemplate[i].paramsize);
12353ce858cbSGeert Uytterhoeven 		if (res) {
12368064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression setup failed on test "
12373ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12383ce858cbSGeert Uytterhoeven 			return res;
12398064efb8SGeert Uytterhoeven 		}
12408064efb8SGeert Uytterhoeven 
12413ce858cbSGeert Uytterhoeven 		res = crypto_compress_init(tfm);
12423ce858cbSGeert Uytterhoeven 		if (res) {
12438064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression init failed on test "
12443ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12453ce858cbSGeert Uytterhoeven 			return res;
12468064efb8SGeert Uytterhoeven 		}
12478064efb8SGeert Uytterhoeven 
12488064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
12498064efb8SGeert Uytterhoeven 
12508064efb8SGeert Uytterhoeven 		req.next_in = ctemplate[i].input;
12518064efb8SGeert Uytterhoeven 		req.avail_in = ctemplate[i].inlen / 2;
12528064efb8SGeert Uytterhoeven 		req.next_out = result;
12538064efb8SGeert Uytterhoeven 		req.avail_out = ctemplate[i].outlen / 2;
12548064efb8SGeert Uytterhoeven 
12553ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
12563ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
12578064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
12583ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12593ce858cbSGeert Uytterhoeven 			return res;
12608064efb8SGeert Uytterhoeven 		}
12613ce858cbSGeert Uytterhoeven 		if (res > 0)
12623ce858cbSGeert Uytterhoeven 			produced += res;
12638064efb8SGeert Uytterhoeven 
12648064efb8SGeert Uytterhoeven 		/* Add remaining input data */
12658064efb8SGeert Uytterhoeven 		req.avail_in += (ctemplate[i].inlen + 1) / 2;
12668064efb8SGeert Uytterhoeven 
12673ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
12683ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
12698064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
12703ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12713ce858cbSGeert Uytterhoeven 			return res;
12728064efb8SGeert Uytterhoeven 		}
12733ce858cbSGeert Uytterhoeven 		if (res > 0)
12743ce858cbSGeert Uytterhoeven 			produced += res;
12758064efb8SGeert Uytterhoeven 
12768064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
12778064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
12788064efb8SGeert Uytterhoeven 
12793ce858cbSGeert Uytterhoeven 		res = crypto_compress_final(tfm, &req);
12803ce858cbSGeert Uytterhoeven 		if (res < 0) {
12818064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression final failed on test "
12823ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12833ce858cbSGeert Uytterhoeven 			return res;
12848064efb8SGeert Uytterhoeven 		}
12853ce858cbSGeert Uytterhoeven 		produced += res;
12868064efb8SGeert Uytterhoeven 
12878064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
12888064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
12898064efb8SGeert Uytterhoeven 			       "output len = %d (expected %d)\n", i + 1, algo,
12908064efb8SGeert Uytterhoeven 			       COMP_BUF_SIZE - req.avail_out,
12918064efb8SGeert Uytterhoeven 			       ctemplate[i].outlen);
12928064efb8SGeert Uytterhoeven 			return -EINVAL;
12938064efb8SGeert Uytterhoeven 		}
12948064efb8SGeert Uytterhoeven 
12953ce858cbSGeert Uytterhoeven 		if (produced != ctemplate[i].outlen) {
12963ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
12973ce858cbSGeert Uytterhoeven 			       "returned len = %u (expected %d)\n", i + 1,
12983ce858cbSGeert Uytterhoeven 			       algo, produced, ctemplate[i].outlen);
12993ce858cbSGeert Uytterhoeven 			return -EINVAL;
13003ce858cbSGeert Uytterhoeven 		}
13013ce858cbSGeert Uytterhoeven 
13028064efb8SGeert Uytterhoeven 		if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
13038064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Compression test %d failed for "
13048064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
13058064efb8SGeert Uytterhoeven 			hexdump(result, ctemplate[i].outlen);
13068064efb8SGeert Uytterhoeven 			return -EINVAL;
13078064efb8SGeert Uytterhoeven 		}
13088064efb8SGeert Uytterhoeven 	}
13098064efb8SGeert Uytterhoeven 
13108064efb8SGeert Uytterhoeven 	for (i = 0; i < dtcount; i++) {
13118064efb8SGeert Uytterhoeven 		struct comp_request req;
13123ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
13138064efb8SGeert Uytterhoeven 
13143ce858cbSGeert Uytterhoeven 		res = crypto_decompress_setup(tfm, dtemplate[i].params,
13158064efb8SGeert Uytterhoeven 					      dtemplate[i].paramsize);
13163ce858cbSGeert Uytterhoeven 		if (res) {
13178064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression setup failed on "
13183ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13193ce858cbSGeert Uytterhoeven 			return res;
13208064efb8SGeert Uytterhoeven 		}
13218064efb8SGeert Uytterhoeven 
13223ce858cbSGeert Uytterhoeven 		res = crypto_decompress_init(tfm);
13233ce858cbSGeert Uytterhoeven 		if (res) {
13248064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression init failed on test "
13253ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13263ce858cbSGeert Uytterhoeven 			return res;
13278064efb8SGeert Uytterhoeven 		}
13288064efb8SGeert Uytterhoeven 
13298064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
13308064efb8SGeert Uytterhoeven 
13318064efb8SGeert Uytterhoeven 		req.next_in = dtemplate[i].input;
13328064efb8SGeert Uytterhoeven 		req.avail_in = dtemplate[i].inlen / 2;
13338064efb8SGeert Uytterhoeven 		req.next_out = result;
13348064efb8SGeert Uytterhoeven 		req.avail_out = dtemplate[i].outlen / 2;
13358064efb8SGeert Uytterhoeven 
13363ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
13373ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13388064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
13393ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13403ce858cbSGeert Uytterhoeven 			return res;
13418064efb8SGeert Uytterhoeven 		}
13423ce858cbSGeert Uytterhoeven 		if (res > 0)
13433ce858cbSGeert Uytterhoeven 			produced += res;
13448064efb8SGeert Uytterhoeven 
13458064efb8SGeert Uytterhoeven 		/* Add remaining input data */
13468064efb8SGeert Uytterhoeven 		req.avail_in += (dtemplate[i].inlen + 1) / 2;
13478064efb8SGeert Uytterhoeven 
13483ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
13493ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13508064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
13513ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13523ce858cbSGeert Uytterhoeven 			return res;
13538064efb8SGeert Uytterhoeven 		}
13543ce858cbSGeert Uytterhoeven 		if (res > 0)
13553ce858cbSGeert Uytterhoeven 			produced += res;
13568064efb8SGeert Uytterhoeven 
13578064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
13588064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
13598064efb8SGeert Uytterhoeven 
13603ce858cbSGeert Uytterhoeven 		res = crypto_decompress_final(tfm, &req);
13613ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13628064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression final failed on "
13633ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13643ce858cbSGeert Uytterhoeven 			return res;
13658064efb8SGeert Uytterhoeven 		}
13663ce858cbSGeert Uytterhoeven 		if (res > 0)
13673ce858cbSGeert Uytterhoeven 			produced += res;
13688064efb8SGeert Uytterhoeven 
13698064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
13708064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
13718064efb8SGeert Uytterhoeven 			       "%s: output len = %d (expected %d)\n", i + 1,
13728064efb8SGeert Uytterhoeven 			       algo, COMP_BUF_SIZE - req.avail_out,
13738064efb8SGeert Uytterhoeven 			       dtemplate[i].outlen);
13748064efb8SGeert Uytterhoeven 			return -EINVAL;
13758064efb8SGeert Uytterhoeven 		}
13768064efb8SGeert Uytterhoeven 
13773ce858cbSGeert Uytterhoeven 		if (produced != dtemplate[i].outlen) {
13783ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
13793ce858cbSGeert Uytterhoeven 			       "%s: returned len = %u (expected %d)\n", i + 1,
13803ce858cbSGeert Uytterhoeven 			       algo, produced, dtemplate[i].outlen);
13813ce858cbSGeert Uytterhoeven 			return -EINVAL;
13823ce858cbSGeert Uytterhoeven 		}
13833ce858cbSGeert Uytterhoeven 
13848064efb8SGeert Uytterhoeven 		if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
13858064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Decompression test %d failed for "
13868064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
13878064efb8SGeert Uytterhoeven 			hexdump(result, dtemplate[i].outlen);
13888064efb8SGeert Uytterhoeven 			return -EINVAL;
13898064efb8SGeert Uytterhoeven 		}
13908064efb8SGeert Uytterhoeven 	}
13918064efb8SGeert Uytterhoeven 
13928064efb8SGeert Uytterhoeven 	return 0;
13938064efb8SGeert Uytterhoeven }
13948064efb8SGeert Uytterhoeven 
13957647d6ceSJarod Wilson 
13967647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
13977647d6ceSJarod Wilson 		      unsigned int tcount)
13987647d6ceSJarod Wilson {
13997647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1400fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
14017647d6ceSJarod Wilson 	u8 *seed;
14027647d6ceSJarod Wilson 	char result[32];
14037647d6ceSJarod Wilson 
14047647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
14057647d6ceSJarod Wilson 
14067647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
14077647d6ceSJarod Wilson 	if (!seed) {
14087647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
14097647d6ceSJarod Wilson 		       "for %s\n", algo);
14107647d6ceSJarod Wilson 		return -ENOMEM;
14117647d6ceSJarod Wilson 	}
14127647d6ceSJarod Wilson 
14137647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
14147647d6ceSJarod Wilson 		memset(result, 0, 32);
14157647d6ceSJarod Wilson 
14167647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
14177647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
14187647d6ceSJarod Wilson 		       template[i].klen);
14197647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
14207647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
14217647d6ceSJarod Wilson 
14227647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
14237647d6ceSJarod Wilson 		if (err) {
14247647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
14257647d6ceSJarod Wilson 			       "for %s\n", algo);
14267647d6ceSJarod Wilson 			goto out;
14277647d6ceSJarod Wilson 		}
14287647d6ceSJarod Wilson 
14297647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
14307647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
14317647d6ceSJarod Wilson 						   template[i].rlen);
14327647d6ceSJarod Wilson 			if (err != template[i].rlen) {
14337647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
14347647d6ceSJarod Wilson 				       "the correct amount of random data for "
14357647d6ceSJarod Wilson 				       "%s (requested %d, got %d)\n", algo,
14367647d6ceSJarod Wilson 				       template[i].rlen, err);
14377647d6ceSJarod Wilson 				goto out;
14387647d6ceSJarod Wilson 			}
14397647d6ceSJarod Wilson 		}
14407647d6ceSJarod Wilson 
14417647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
14427647d6ceSJarod Wilson 			     template[i].rlen);
14437647d6ceSJarod Wilson 		if (err) {
14447647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
14457647d6ceSJarod Wilson 			       i, algo);
14467647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
14477647d6ceSJarod Wilson 			err = -EINVAL;
14487647d6ceSJarod Wilson 			goto out;
14497647d6ceSJarod Wilson 		}
14507647d6ceSJarod Wilson 	}
14517647d6ceSJarod Wilson 
14527647d6ceSJarod Wilson out:
14537647d6ceSJarod Wilson 	kfree(seed);
14547647d6ceSJarod Wilson 	return err;
14557647d6ceSJarod Wilson }
14567647d6ceSJarod Wilson 
1457da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1458da7f033dSHerbert Xu 			 u32 type, u32 mask)
1459da7f033dSHerbert Xu {
1460da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1461da7f033dSHerbert Xu 	int err = 0;
1462da7f033dSHerbert Xu 
1463da7f033dSHerbert Xu 	tfm = crypto_alloc_aead(driver, type, mask);
1464da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1465da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1466da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1467da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1468da7f033dSHerbert Xu 	}
1469da7f033dSHerbert Xu 
1470da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1471da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1472da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1473da7f033dSHerbert Xu 		if (err)
1474da7f033dSHerbert Xu 			goto out;
1475da7f033dSHerbert Xu 	}
1476da7f033dSHerbert Xu 
1477da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1478da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1479da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1480da7f033dSHerbert Xu 
1481da7f033dSHerbert Xu out:
1482da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1483da7f033dSHerbert Xu 	return err;
1484da7f033dSHerbert Xu }
1485da7f033dSHerbert Xu 
1486da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1487da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1488da7f033dSHerbert Xu {
14891aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1490da7f033dSHerbert Xu 	int err = 0;
1491da7f033dSHerbert Xu 
14921aa4ecd9SHerbert Xu 	tfm = crypto_alloc_cipher(driver, type, mask);
1493da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1494da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1495da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1496da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1497da7f033dSHerbert Xu 	}
1498da7f033dSHerbert Xu 
1499da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1500da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1501da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1502da7f033dSHerbert Xu 		if (err)
1503da7f033dSHerbert Xu 			goto out;
1504da7f033dSHerbert Xu 	}
1505da7f033dSHerbert Xu 
1506da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1507da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1508da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1509da7f033dSHerbert Xu 
1510da7f033dSHerbert Xu out:
15111aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
15121aa4ecd9SHerbert Xu 	return err;
15131aa4ecd9SHerbert Xu }
15141aa4ecd9SHerbert Xu 
15151aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
15161aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
15171aa4ecd9SHerbert Xu {
15181aa4ecd9SHerbert Xu 	struct crypto_ablkcipher *tfm;
15191aa4ecd9SHerbert Xu 	int err = 0;
15201aa4ecd9SHerbert Xu 
15211aa4ecd9SHerbert Xu 	tfm = crypto_alloc_ablkcipher(driver, type, mask);
15221aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
15231aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
15241aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
15251aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
15261aa4ecd9SHerbert Xu 	}
15271aa4ecd9SHerbert Xu 
15281aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
15291aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
15301aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
15311aa4ecd9SHerbert Xu 		if (err)
15321aa4ecd9SHerbert Xu 			goto out;
15331aa4ecd9SHerbert Xu 	}
15341aa4ecd9SHerbert Xu 
15351aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
15361aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
15371aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
15381aa4ecd9SHerbert Xu 
15391aa4ecd9SHerbert Xu out:
1540da7f033dSHerbert Xu 	crypto_free_ablkcipher(tfm);
1541da7f033dSHerbert Xu 	return err;
1542da7f033dSHerbert Xu }
1543da7f033dSHerbert Xu 
1544da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1545da7f033dSHerbert Xu 			 u32 type, u32 mask)
1546da7f033dSHerbert Xu {
1547da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1548da7f033dSHerbert Xu 	int err;
1549da7f033dSHerbert Xu 
1550da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1551da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1552da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1553da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1554da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1555da7f033dSHerbert Xu 	}
1556da7f033dSHerbert Xu 
1557da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1558da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1559da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1560da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1561da7f033dSHerbert Xu 
1562da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1563da7f033dSHerbert Xu 	return err;
1564da7f033dSHerbert Xu }
1565da7f033dSHerbert Xu 
15668064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
15678064efb8SGeert Uytterhoeven 			  u32 type, u32 mask)
15688064efb8SGeert Uytterhoeven {
15698064efb8SGeert Uytterhoeven 	struct crypto_pcomp *tfm;
15708064efb8SGeert Uytterhoeven 	int err;
15718064efb8SGeert Uytterhoeven 
15728064efb8SGeert Uytterhoeven 	tfm = crypto_alloc_pcomp(driver, type, mask);
15738064efb8SGeert Uytterhoeven 	if (IS_ERR(tfm)) {
15748064efb8SGeert Uytterhoeven 		pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
15758064efb8SGeert Uytterhoeven 		       driver, PTR_ERR(tfm));
15768064efb8SGeert Uytterhoeven 		return PTR_ERR(tfm);
15778064efb8SGeert Uytterhoeven 	}
15788064efb8SGeert Uytterhoeven 
15798064efb8SGeert Uytterhoeven 	err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
15808064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.vecs,
15818064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.comp.count,
15828064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.count);
15838064efb8SGeert Uytterhoeven 
15848064efb8SGeert Uytterhoeven 	crypto_free_pcomp(tfm);
15858064efb8SGeert Uytterhoeven 	return err;
15868064efb8SGeert Uytterhoeven }
15878064efb8SGeert Uytterhoeven 
1588da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1589da7f033dSHerbert Xu 			 u32 type, u32 mask)
1590da7f033dSHerbert Xu {
1591da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1592da7f033dSHerbert Xu 	int err;
1593da7f033dSHerbert Xu 
1594da7f033dSHerbert Xu 	tfm = crypto_alloc_ahash(driver, type, mask);
1595da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1596da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1597da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1598da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1599da7f033dSHerbert Xu 	}
1600da7f033dSHerbert Xu 
1601a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1602a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1603a8f1a052SDavid S. Miller 	if (!err)
1604a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1605a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1606da7f033dSHerbert Xu 
1607da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1608da7f033dSHerbert Xu 	return err;
1609da7f033dSHerbert Xu }
1610da7f033dSHerbert Xu 
16118e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
16128e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
16138e3ee85eSHerbert Xu {
16148e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
16158e3ee85eSHerbert Xu 	u32 val;
16168e3ee85eSHerbert Xu 	int err;
16178e3ee85eSHerbert Xu 
16188e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
16198e3ee85eSHerbert Xu 	if (err)
16208e3ee85eSHerbert Xu 		goto out;
16218e3ee85eSHerbert Xu 
16228e3ee85eSHerbert Xu 	tfm = crypto_alloc_shash(driver, type, mask);
16238e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
16248e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
16258e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
16268e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
16278e3ee85eSHerbert Xu 		goto out;
16288e3ee85eSHerbert Xu 	}
16298e3ee85eSHerbert Xu 
16308e3ee85eSHerbert Xu 	do {
16318e3ee85eSHerbert Xu 		struct {
16328e3ee85eSHerbert Xu 			struct shash_desc shash;
16338e3ee85eSHerbert Xu 			char ctx[crypto_shash_descsize(tfm)];
16348e3ee85eSHerbert Xu 		} sdesc;
16358e3ee85eSHerbert Xu 
16368e3ee85eSHerbert Xu 		sdesc.shash.tfm = tfm;
16378e3ee85eSHerbert Xu 		sdesc.shash.flags = 0;
16388e3ee85eSHerbert Xu 
16398e3ee85eSHerbert Xu 		*(u32 *)sdesc.ctx = le32_to_cpu(420553207);
16408e3ee85eSHerbert Xu 		err = crypto_shash_final(&sdesc.shash, (u8 *)&val);
16418e3ee85eSHerbert Xu 		if (err) {
16428e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
16438e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
16448e3ee85eSHerbert Xu 			break;
16458e3ee85eSHerbert Xu 		}
16468e3ee85eSHerbert Xu 
16478e3ee85eSHerbert Xu 		if (val != ~420553207) {
16488e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
16498e3ee85eSHerbert Xu 			       "%d\n", driver, val);
16508e3ee85eSHerbert Xu 			err = -EINVAL;
16518e3ee85eSHerbert Xu 		}
16528e3ee85eSHerbert Xu 	} while (0);
16538e3ee85eSHerbert Xu 
16548e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
16558e3ee85eSHerbert Xu 
16568e3ee85eSHerbert Xu out:
16578e3ee85eSHerbert Xu 	return err;
16588e3ee85eSHerbert Xu }
16598e3ee85eSHerbert Xu 
16607647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
16617647d6ceSJarod Wilson 			  u32 type, u32 mask)
16627647d6ceSJarod Wilson {
16637647d6ceSJarod Wilson 	struct crypto_rng *rng;
16647647d6ceSJarod Wilson 	int err;
16657647d6ceSJarod Wilson 
16667647d6ceSJarod Wilson 	rng = crypto_alloc_rng(driver, type, mask);
16677647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
16687647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
16697647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
16707647d6ceSJarod Wilson 		return PTR_ERR(rng);
16717647d6ceSJarod Wilson 	}
16727647d6ceSJarod Wilson 
16737647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
16747647d6ceSJarod Wilson 
16757647d6ceSJarod Wilson 	crypto_free_rng(rng);
16767647d6ceSJarod Wilson 
16777647d6ceSJarod Wilson 	return err;
16787647d6ceSJarod Wilson }
16797647d6ceSJarod Wilson 
1680863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1681863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1682863b557aSYouquan, Song {
1683863b557aSYouquan, Song 	return 0;
1684863b557aSYouquan, Song }
1685863b557aSYouquan, Song 
1686da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1687da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1688da7f033dSHerbert Xu 	{
16894d6d6a2cSJohannes Goetzfried 		.alg = "__cbc-cast5-avx",
16904d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
16914d6d6a2cSJohannes Goetzfried 	}, {
16924ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
16934ea1277dSJohannes Goetzfried 		.test = alg_test_null,
16944ea1277dSJohannes Goetzfried 	}, {
16957efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
16967efe4076SJohannes Goetzfried 		.test = alg_test_null,
16977efe4076SJohannes Goetzfried 	}, {
169856d76c96SJussi Kivilinna 		.alg = "__cbc-serpent-avx2",
169956d76c96SJussi Kivilinna 		.test = alg_test_null,
170056d76c96SJussi Kivilinna 	}, {
1701937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
1702937c30d7SJussi Kivilinna 		.test = alg_test_null,
1703937c30d7SJussi Kivilinna 	}, {
1704107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
1705107778b5SJohannes Goetzfried 		.test = alg_test_null,
1706107778b5SJohannes Goetzfried 	}, {
1707863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
1708863b557aSYouquan, Song 		.test = alg_test_null,
17096c79294fSMilan Broz 		.fips_allowed = 1,
1710863b557aSYouquan, Song 	}, {
1711d9b1d2e7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni",
1712d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1713d9b1d2e7SJussi Kivilinna 	}, {
1714f3f935a7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni-avx2",
1715f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1716f3f935a7SJussi Kivilinna 	}, {
17174d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
17184d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
17194d6d6a2cSJohannes Goetzfried 	}, {
17204ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
17214ea1277dSJohannes Goetzfried 		.test = alg_test_null,
17224ea1277dSJohannes Goetzfried 	}, {
17237efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
17247efe4076SJohannes Goetzfried 		.test = alg_test_null,
17257efe4076SJohannes Goetzfried 	}, {
172656d76c96SJussi Kivilinna 		.alg = "__driver-cbc-serpent-avx2",
172756d76c96SJussi Kivilinna 		.test = alg_test_null,
172856d76c96SJussi Kivilinna 	}, {
1729937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
1730937c30d7SJussi Kivilinna 		.test = alg_test_null,
1731937c30d7SJussi Kivilinna 	}, {
1732107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
1733107778b5SJohannes Goetzfried 		.test = alg_test_null,
1734107778b5SJohannes Goetzfried 	}, {
1735863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
1736863b557aSYouquan, Song 		.test = alg_test_null,
17376c79294fSMilan Broz 		.fips_allowed = 1,
1738863b557aSYouquan, Song 	}, {
1739d9b1d2e7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni",
1740d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1741d9b1d2e7SJussi Kivilinna 	}, {
1742f3f935a7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni-avx2",
1743f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1744f3f935a7SJussi Kivilinna 	}, {
17454d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
17464d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
17474d6d6a2cSJohannes Goetzfried 	}, {
17484ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
17494ea1277dSJohannes Goetzfried 		.test = alg_test_null,
17504ea1277dSJohannes Goetzfried 	}, {
17517efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
17527efe4076SJohannes Goetzfried 		.test = alg_test_null,
17537efe4076SJohannes Goetzfried 	}, {
175456d76c96SJussi Kivilinna 		.alg = "__driver-ecb-serpent-avx2",
175556d76c96SJussi Kivilinna 		.test = alg_test_null,
175656d76c96SJussi Kivilinna 	}, {
1757937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
1758937c30d7SJussi Kivilinna 		.test = alg_test_null,
1759937c30d7SJussi Kivilinna 	}, {
1760107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
1761107778b5SJohannes Goetzfried 		.test = alg_test_null,
1762107778b5SJohannes Goetzfried 	}, {
1763863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
1764863b557aSYouquan, Song 		.test = alg_test_null,
17656c79294fSMilan Broz 		.fips_allowed = 1,
1766863b557aSYouquan, Song 	}, {
1767e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
1768e08ca2daSJarod Wilson 		.test = alg_test_cprng,
1769a1915d51SJarod Wilson 		.fips_allowed = 1,
1770e08ca2daSJarod Wilson 		.suite = {
1771e08ca2daSJarod Wilson 			.cprng = {
1772e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
1773e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
1774e08ca2daSJarod Wilson 			}
1775e08ca2daSJarod Wilson 		}
1776e08ca2daSJarod Wilson 	}, {
1777e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha1),cbc(aes))",
1778e46e9a46SHoria Geanta 		.test = alg_test_aead,
1779e46e9a46SHoria Geanta 		.fips_allowed = 1,
1780e46e9a46SHoria Geanta 		.suite = {
1781e46e9a46SHoria Geanta 			.aead = {
1782e46e9a46SHoria Geanta 				.enc = {
1783e46e9a46SHoria Geanta 					.vecs = hmac_sha1_aes_cbc_enc_tv_template,
1784e46e9a46SHoria Geanta 					.count = HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS
1785e46e9a46SHoria Geanta 				}
1786e46e9a46SHoria Geanta 			}
1787e46e9a46SHoria Geanta 		}
1788e46e9a46SHoria Geanta 	}, {
1789e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha256),cbc(aes))",
1790e46e9a46SHoria Geanta 		.test = alg_test_aead,
1791e46e9a46SHoria Geanta 		.fips_allowed = 1,
1792e46e9a46SHoria Geanta 		.suite = {
1793e46e9a46SHoria Geanta 			.aead = {
1794e46e9a46SHoria Geanta 				.enc = {
1795e46e9a46SHoria Geanta 					.vecs = hmac_sha256_aes_cbc_enc_tv_template,
1796e46e9a46SHoria Geanta 					.count = HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS
1797e46e9a46SHoria Geanta 				}
1798e46e9a46SHoria Geanta 			}
1799e46e9a46SHoria Geanta 		}
1800e46e9a46SHoria Geanta 	}, {
1801e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha512),cbc(aes))",
1802e46e9a46SHoria Geanta 		.test = alg_test_aead,
1803e46e9a46SHoria Geanta 		.fips_allowed = 1,
1804e46e9a46SHoria Geanta 		.suite = {
1805e46e9a46SHoria Geanta 			.aead = {
1806e46e9a46SHoria Geanta 				.enc = {
1807e46e9a46SHoria Geanta 					.vecs = hmac_sha512_aes_cbc_enc_tv_template,
1808e46e9a46SHoria Geanta 					.count = HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS
1809e46e9a46SHoria Geanta 				}
1810e46e9a46SHoria Geanta 			}
1811e46e9a46SHoria Geanta 		}
1812e46e9a46SHoria Geanta 	}, {
1813da7f033dSHerbert Xu 		.alg = "cbc(aes)",
18141aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1815a1915d51SJarod Wilson 		.fips_allowed = 1,
1816da7f033dSHerbert Xu 		.suite = {
1817da7f033dSHerbert Xu 			.cipher = {
1818da7f033dSHerbert Xu 				.enc = {
1819da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
1820da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
1821da7f033dSHerbert Xu 				},
1822da7f033dSHerbert Xu 				.dec = {
1823da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
1824da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
1825da7f033dSHerbert Xu 				}
1826da7f033dSHerbert Xu 			}
1827da7f033dSHerbert Xu 		}
1828da7f033dSHerbert Xu 	}, {
1829da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
18301aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1831da7f033dSHerbert Xu 		.suite = {
1832da7f033dSHerbert Xu 			.cipher = {
1833da7f033dSHerbert Xu 				.enc = {
1834da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
1835da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
1836da7f033dSHerbert Xu 				},
1837da7f033dSHerbert Xu 				.dec = {
1838da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
1839da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
1840da7f033dSHerbert Xu 				}
1841da7f033dSHerbert Xu 			}
1842da7f033dSHerbert Xu 		}
1843da7f033dSHerbert Xu 	}, {
1844da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
18451aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1846da7f033dSHerbert Xu 		.suite = {
1847da7f033dSHerbert Xu 			.cipher = {
1848da7f033dSHerbert Xu 				.enc = {
1849da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
1850da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
1851da7f033dSHerbert Xu 				},
1852da7f033dSHerbert Xu 				.dec = {
1853da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
1854da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
1855da7f033dSHerbert Xu 				}
1856da7f033dSHerbert Xu 			}
1857da7f033dSHerbert Xu 		}
1858da7f033dSHerbert Xu 	}, {
1859da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
18601aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1861da7f033dSHerbert Xu 		.suite = {
1862da7f033dSHerbert Xu 			.cipher = {
1863da7f033dSHerbert Xu 				.enc = {
1864da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
1865da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
1866da7f033dSHerbert Xu 				},
1867da7f033dSHerbert Xu 				.dec = {
1868da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
1869da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
1870da7f033dSHerbert Xu 				}
1871da7f033dSHerbert Xu 			}
1872da7f033dSHerbert Xu 		}
1873da7f033dSHerbert Xu 	}, {
1874a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
1875a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
1876a2c58260SJohannes Goetzfried 		.suite = {
1877a2c58260SJohannes Goetzfried 			.cipher = {
1878a2c58260SJohannes Goetzfried 				.enc = {
1879a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
1880a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
1881a2c58260SJohannes Goetzfried 				},
1882a2c58260SJohannes Goetzfried 				.dec = {
1883a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
1884a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
1885a2c58260SJohannes Goetzfried 				}
1886a2c58260SJohannes Goetzfried 			}
1887a2c58260SJohannes Goetzfried 		}
1888a2c58260SJohannes Goetzfried 	}, {
18899b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
18909b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
18919b8b0405SJohannes Goetzfried 		.suite = {
18929b8b0405SJohannes Goetzfried 			.cipher = {
18939b8b0405SJohannes Goetzfried 				.enc = {
18949b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
18959b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
18969b8b0405SJohannes Goetzfried 				},
18979b8b0405SJohannes Goetzfried 				.dec = {
18989b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
18999b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
19009b8b0405SJohannes Goetzfried 				}
19019b8b0405SJohannes Goetzfried 			}
19029b8b0405SJohannes Goetzfried 		}
19039b8b0405SJohannes Goetzfried 	}, {
1904da7f033dSHerbert Xu 		.alg = "cbc(des)",
19051aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1906da7f033dSHerbert Xu 		.suite = {
1907da7f033dSHerbert Xu 			.cipher = {
1908da7f033dSHerbert Xu 				.enc = {
1909da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
1910da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
1911da7f033dSHerbert Xu 				},
1912da7f033dSHerbert Xu 				.dec = {
1913da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
1914da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
1915da7f033dSHerbert Xu 				}
1916da7f033dSHerbert Xu 			}
1917da7f033dSHerbert Xu 		}
1918da7f033dSHerbert Xu 	}, {
1919da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
19201aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1921a1915d51SJarod Wilson 		.fips_allowed = 1,
1922da7f033dSHerbert Xu 		.suite = {
1923da7f033dSHerbert Xu 			.cipher = {
1924da7f033dSHerbert Xu 				.enc = {
1925da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
1926da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
1927da7f033dSHerbert Xu 				},
1928da7f033dSHerbert Xu 				.dec = {
1929da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
1930da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
1931da7f033dSHerbert Xu 				}
1932da7f033dSHerbert Xu 			}
1933da7f033dSHerbert Xu 		}
1934da7f033dSHerbert Xu 	}, {
19359d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
19369d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
19379d25917dSJussi Kivilinna 		.suite = {
19389d25917dSJussi Kivilinna 			.cipher = {
19399d25917dSJussi Kivilinna 				.enc = {
19409d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
19419d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
19429d25917dSJussi Kivilinna 				},
19439d25917dSJussi Kivilinna 				.dec = {
19449d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
19459d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
19469d25917dSJussi Kivilinna 				}
19479d25917dSJussi Kivilinna 			}
19489d25917dSJussi Kivilinna 		}
19499d25917dSJussi Kivilinna 	}, {
1950da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
19511aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1952da7f033dSHerbert Xu 		.suite = {
1953da7f033dSHerbert Xu 			.cipher = {
1954da7f033dSHerbert Xu 				.enc = {
1955da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
1956da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
1957da7f033dSHerbert Xu 				},
1958da7f033dSHerbert Xu 				.dec = {
1959da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
1960da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
1961da7f033dSHerbert Xu 				}
1962da7f033dSHerbert Xu 			}
1963da7f033dSHerbert Xu 		}
1964da7f033dSHerbert Xu 	}, {
1965da7f033dSHerbert Xu 		.alg = "ccm(aes)",
1966da7f033dSHerbert Xu 		.test = alg_test_aead,
1967a1915d51SJarod Wilson 		.fips_allowed = 1,
1968da7f033dSHerbert Xu 		.suite = {
1969da7f033dSHerbert Xu 			.aead = {
1970da7f033dSHerbert Xu 				.enc = {
1971da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
1972da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
1973da7f033dSHerbert Xu 				},
1974da7f033dSHerbert Xu 				.dec = {
1975da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
1976da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
1977da7f033dSHerbert Xu 				}
1978da7f033dSHerbert Xu 			}
1979da7f033dSHerbert Xu 		}
1980da7f033dSHerbert Xu 	}, {
198193b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
198293b5e86aSJussi Kivilinna 		.test = alg_test_hash,
198393b5e86aSJussi Kivilinna 		.suite = {
198493b5e86aSJussi Kivilinna 			.hash = {
198593b5e86aSJussi Kivilinna 				.vecs = aes_cmac128_tv_template,
198693b5e86aSJussi Kivilinna 				.count = CMAC_AES_TEST_VECTORS
198793b5e86aSJussi Kivilinna 			}
198893b5e86aSJussi Kivilinna 		}
198993b5e86aSJussi Kivilinna 	}, {
199093b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
199193b5e86aSJussi Kivilinna 		.test = alg_test_hash,
199293b5e86aSJussi Kivilinna 		.suite = {
199393b5e86aSJussi Kivilinna 			.hash = {
199493b5e86aSJussi Kivilinna 				.vecs = des3_ede_cmac64_tv_template,
199593b5e86aSJussi Kivilinna 				.count = CMAC_DES3_EDE_TEST_VECTORS
199693b5e86aSJussi Kivilinna 			}
199793b5e86aSJussi Kivilinna 		}
199893b5e86aSJussi Kivilinna 	}, {
1999e448370dSJussi Kivilinna 		.alg = "compress_null",
2000e448370dSJussi Kivilinna 		.test = alg_test_null,
2001e448370dSJussi Kivilinna 	}, {
2002da7f033dSHerbert Xu 		.alg = "crc32c",
20038e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2004a1915d51SJarod Wilson 		.fips_allowed = 1,
2005da7f033dSHerbert Xu 		.suite = {
2006da7f033dSHerbert Xu 			.hash = {
2007da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
2008da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
2009da7f033dSHerbert Xu 			}
2010da7f033dSHerbert Xu 		}
2011da7f033dSHerbert Xu 	}, {
201239761214STim Chen 		.alg = "crct10dif",
201339761214STim Chen 		.test = alg_test_hash,
201439761214STim Chen 		.fips_allowed = 1,
201539761214STim Chen 		.suite = {
201639761214STim Chen 			.hash = {
201739761214STim Chen 				.vecs = crct10dif_tv_template,
201839761214STim Chen 				.count = CRCT10DIF_TEST_VECTORS
201939761214STim Chen 			}
202039761214STim Chen 		}
202139761214STim Chen 	}, {
20226c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
20236c79294fSMilan Broz 		.test = alg_test_null,
20246c79294fSMilan Broz 		.fips_allowed = 1,
20256c79294fSMilan Broz 	}, {
2026d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni)",
2027d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2028d9b1d2e7SJussi Kivilinna 	}, {
2029f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2030f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2031f3f935a7SJussi Kivilinna 	}, {
203256d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-serpent-avx2)",
203356d76c96SJussi Kivilinna 		.test = alg_test_null,
203456d76c96SJussi Kivilinna 	}, {
2035863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
2036863b557aSYouquan, Song 		.test = alg_test_null,
20376c79294fSMilan Broz 		.fips_allowed = 1,
2038863b557aSYouquan, Song 	}, {
2039d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni)",
2040d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2041d9b1d2e7SJussi Kivilinna 	}, {
2042f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2043f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2044f3f935a7SJussi Kivilinna 	}, {
20454d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
20464d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
20474d6d6a2cSJohannes Goetzfried 	}, {
20484ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
20494ea1277dSJohannes Goetzfried 		.test = alg_test_null,
20504ea1277dSJohannes Goetzfried 	}, {
20517efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
20527efe4076SJohannes Goetzfried 		.test = alg_test_null,
20537efe4076SJohannes Goetzfried 	}, {
205456d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-avx2)",
205556d76c96SJussi Kivilinna 		.test = alg_test_null,
205656d76c96SJussi Kivilinna 	}, {
2057937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
2058937c30d7SJussi Kivilinna 		.test = alg_test_null,
2059937c30d7SJussi Kivilinna 	}, {
2060107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
2061107778b5SJohannes Goetzfried 		.test = alg_test_null,
2062107778b5SJohannes Goetzfried 	}, {
20636c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
20646c79294fSMilan Broz 		.test = alg_test_null,
20656c79294fSMilan Broz 		.fips_allowed = 1,
20666c79294fSMilan Broz 	}, {
2067863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2068863b557aSYouquan, Song 		.test = alg_test_null,
20696c79294fSMilan Broz 		.fips_allowed = 1,
2070863b557aSYouquan, Song 	}, {
2071f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2072f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2073a1915d51SJarod Wilson 		.fips_allowed = 1,
2074f7cb80f2SJarod Wilson 		.suite = {
2075f7cb80f2SJarod Wilson 			.cipher = {
2076f7cb80f2SJarod Wilson 				.enc = {
2077f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2078f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2079f7cb80f2SJarod Wilson 				},
2080f7cb80f2SJarod Wilson 				.dec = {
2081f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2082f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2083f7cb80f2SJarod Wilson 				}
2084f7cb80f2SJarod Wilson 			}
2085f7cb80f2SJarod Wilson 		}
2086f7cb80f2SJarod Wilson 	}, {
208785b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
208885b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
208985b63e34SJussi Kivilinna 		.suite = {
209085b63e34SJussi Kivilinna 			.cipher = {
209185b63e34SJussi Kivilinna 				.enc = {
209285b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
209385b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
209485b63e34SJussi Kivilinna 				},
209585b63e34SJussi Kivilinna 				.dec = {
209685b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
209785b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
209885b63e34SJussi Kivilinna 				}
209985b63e34SJussi Kivilinna 			}
210085b63e34SJussi Kivilinna 		}
210185b63e34SJussi Kivilinna 	}, {
21020840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
21030840605eSJussi Kivilinna 		.test = alg_test_skcipher,
21040840605eSJussi Kivilinna 		.suite = {
21050840605eSJussi Kivilinna 			.cipher = {
21060840605eSJussi Kivilinna 				.enc = {
21070840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
21080840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
21090840605eSJussi Kivilinna 				},
21100840605eSJussi Kivilinna 				.dec = {
21110840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
21120840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
21130840605eSJussi Kivilinna 				}
21140840605eSJussi Kivilinna 			}
21150840605eSJussi Kivilinna 		}
21160840605eSJussi Kivilinna 	}, {
2117a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2118a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2119a2c58260SJohannes Goetzfried 		.suite = {
2120a2c58260SJohannes Goetzfried 			.cipher = {
2121a2c58260SJohannes Goetzfried 				.enc = {
2122a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2123a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2124a2c58260SJohannes Goetzfried 				},
2125a2c58260SJohannes Goetzfried 				.dec = {
2126a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2127a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2128a2c58260SJohannes Goetzfried 				}
2129a2c58260SJohannes Goetzfried 			}
2130a2c58260SJohannes Goetzfried 		}
2131a2c58260SJohannes Goetzfried 	}, {
21329b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
21339b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
21349b8b0405SJohannes Goetzfried 		.suite = {
21359b8b0405SJohannes Goetzfried 			.cipher = {
21369b8b0405SJohannes Goetzfried 				.enc = {
21379b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
21389b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
21399b8b0405SJohannes Goetzfried 				},
21409b8b0405SJohannes Goetzfried 				.dec = {
21419b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
21429b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
21439b8b0405SJohannes Goetzfried 				}
21449b8b0405SJohannes Goetzfried 			}
21459b8b0405SJohannes Goetzfried 		}
21469b8b0405SJohannes Goetzfried 	}, {
21478163fc30SJussi Kivilinna 		.alg = "ctr(des)",
21488163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
21498163fc30SJussi Kivilinna 		.suite = {
21508163fc30SJussi Kivilinna 			.cipher = {
21518163fc30SJussi Kivilinna 				.enc = {
21528163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
21538163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
21548163fc30SJussi Kivilinna 				},
21558163fc30SJussi Kivilinna 				.dec = {
21568163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
21578163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
21588163fc30SJussi Kivilinna 				}
21598163fc30SJussi Kivilinna 			}
21608163fc30SJussi Kivilinna 		}
21618163fc30SJussi Kivilinna 	}, {
2162e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2163e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2164e080b17aSJussi Kivilinna 		.suite = {
2165e080b17aSJussi Kivilinna 			.cipher = {
2166e080b17aSJussi Kivilinna 				.enc = {
2167e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2168e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2169e080b17aSJussi Kivilinna 				},
2170e080b17aSJussi Kivilinna 				.dec = {
2171e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2172e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2173e080b17aSJussi Kivilinna 				}
2174e080b17aSJussi Kivilinna 			}
2175e080b17aSJussi Kivilinna 		}
2176e080b17aSJussi Kivilinna 	}, {
21779d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
21789d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
21799d25917dSJussi Kivilinna 		.suite = {
21809d25917dSJussi Kivilinna 			.cipher = {
21819d25917dSJussi Kivilinna 				.enc = {
21829d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
21839d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
21849d25917dSJussi Kivilinna 				},
21859d25917dSJussi Kivilinna 				.dec = {
21869d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
21879d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
21889d25917dSJussi Kivilinna 				}
21899d25917dSJussi Kivilinna 			}
21909d25917dSJussi Kivilinna 		}
21919d25917dSJussi Kivilinna 	}, {
2192573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2193573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2194573da620SJussi Kivilinna 		.suite = {
2195573da620SJussi Kivilinna 			.cipher = {
2196573da620SJussi Kivilinna 				.enc = {
2197573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2198573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2199573da620SJussi Kivilinna 				},
2200573da620SJussi Kivilinna 				.dec = {
2201573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2202573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2203573da620SJussi Kivilinna 				}
2204573da620SJussi Kivilinna 			}
2205573da620SJussi Kivilinna 		}
2206573da620SJussi Kivilinna 	}, {
2207da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
22081aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2209da7f033dSHerbert Xu 		.suite = {
2210da7f033dSHerbert Xu 			.cipher = {
2211da7f033dSHerbert Xu 				.enc = {
2212da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2213da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2214da7f033dSHerbert Xu 				},
2215da7f033dSHerbert Xu 				.dec = {
2216da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2217da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2218da7f033dSHerbert Xu 				}
2219da7f033dSHerbert Xu 			}
2220da7f033dSHerbert Xu 		}
2221da7f033dSHerbert Xu 	}, {
2222da7f033dSHerbert Xu 		.alg = "deflate",
2223da7f033dSHerbert Xu 		.test = alg_test_comp,
22240818904dSMilan Broz 		.fips_allowed = 1,
2225da7f033dSHerbert Xu 		.suite = {
2226da7f033dSHerbert Xu 			.comp = {
2227da7f033dSHerbert Xu 				.comp = {
2228da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2229da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2230da7f033dSHerbert Xu 				},
2231da7f033dSHerbert Xu 				.decomp = {
2232da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2233da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2234da7f033dSHerbert Xu 				}
2235da7f033dSHerbert Xu 			}
2236da7f033dSHerbert Xu 		}
2237da7f033dSHerbert Xu 	}, {
2238e448370dSJussi Kivilinna 		.alg = "digest_null",
2239e448370dSJussi Kivilinna 		.test = alg_test_null,
2240e448370dSJussi Kivilinna 	}, {
2241863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2242863b557aSYouquan, Song 		.test = alg_test_null,
22436c79294fSMilan Broz 		.fips_allowed = 1,
2244863b557aSYouquan, Song 	}, {
2245da7f033dSHerbert Xu 		.alg = "ecb(aes)",
22461aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2247a1915d51SJarod Wilson 		.fips_allowed = 1,
2248da7f033dSHerbert Xu 		.suite = {
2249da7f033dSHerbert Xu 			.cipher = {
2250da7f033dSHerbert Xu 				.enc = {
2251da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2252da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2253da7f033dSHerbert Xu 				},
2254da7f033dSHerbert Xu 				.dec = {
2255da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2256da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2257da7f033dSHerbert Xu 				}
2258da7f033dSHerbert Xu 			}
2259da7f033dSHerbert Xu 		}
2260da7f033dSHerbert Xu 	}, {
2261da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
22621aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2263da7f033dSHerbert Xu 		.suite = {
2264da7f033dSHerbert Xu 			.cipher = {
2265da7f033dSHerbert Xu 				.enc = {
2266da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2267da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2268da7f033dSHerbert Xu 				},
2269da7f033dSHerbert Xu 				.dec = {
2270da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2271da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2272da7f033dSHerbert Xu 				}
2273da7f033dSHerbert Xu 			}
2274da7f033dSHerbert Xu 		}
2275da7f033dSHerbert Xu 	}, {
2276da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
22771aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2278da7f033dSHerbert Xu 		.suite = {
2279da7f033dSHerbert Xu 			.cipher = {
2280da7f033dSHerbert Xu 				.enc = {
2281da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2282da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2283da7f033dSHerbert Xu 				},
2284da7f033dSHerbert Xu 				.dec = {
2285da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2286da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2287da7f033dSHerbert Xu 				}
2288da7f033dSHerbert Xu 			}
2289da7f033dSHerbert Xu 		}
2290da7f033dSHerbert Xu 	}, {
2291da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
22921aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2293da7f033dSHerbert Xu 		.suite = {
2294da7f033dSHerbert Xu 			.cipher = {
2295da7f033dSHerbert Xu 				.enc = {
2296da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2297da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2298da7f033dSHerbert Xu 				},
2299da7f033dSHerbert Xu 				.dec = {
2300da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2301da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2302da7f033dSHerbert Xu 				}
2303da7f033dSHerbert Xu 			}
2304da7f033dSHerbert Xu 		}
2305da7f033dSHerbert Xu 	}, {
2306da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
23071aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2308da7f033dSHerbert Xu 		.suite = {
2309da7f033dSHerbert Xu 			.cipher = {
2310da7f033dSHerbert Xu 				.enc = {
2311da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2312da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2313da7f033dSHerbert Xu 				},
2314da7f033dSHerbert Xu 				.dec = {
2315da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2316da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2317da7f033dSHerbert Xu 				}
2318da7f033dSHerbert Xu 			}
2319da7f033dSHerbert Xu 		}
2320da7f033dSHerbert Xu 	}, {
2321da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
23221aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2323da7f033dSHerbert Xu 		.suite = {
2324da7f033dSHerbert Xu 			.cipher = {
2325da7f033dSHerbert Xu 				.enc = {
2326da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2327da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2328da7f033dSHerbert Xu 				},
2329da7f033dSHerbert Xu 				.dec = {
2330da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2331da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2332da7f033dSHerbert Xu 				}
2333da7f033dSHerbert Xu 			}
2334da7f033dSHerbert Xu 		}
2335da7f033dSHerbert Xu 	}, {
2336da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
23371aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2338da7f033dSHerbert Xu 		.suite = {
2339da7f033dSHerbert Xu 			.cipher = {
2340da7f033dSHerbert Xu 				.enc = {
2341da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2342da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
2343da7f033dSHerbert Xu 				},
2344da7f033dSHerbert Xu 				.dec = {
2345da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
2346da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
2347da7f033dSHerbert Xu 				}
2348da7f033dSHerbert Xu 			}
2349da7f033dSHerbert Xu 		}
2350da7f033dSHerbert Xu 	}, {
2351e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
2352e448370dSJussi Kivilinna 		.test = alg_test_null,
2353e448370dSJussi Kivilinna 	}, {
2354da7f033dSHerbert Xu 		.alg = "ecb(des)",
23551aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2356a1915d51SJarod Wilson 		.fips_allowed = 1,
2357da7f033dSHerbert Xu 		.suite = {
2358da7f033dSHerbert Xu 			.cipher = {
2359da7f033dSHerbert Xu 				.enc = {
2360da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
2361da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
2362da7f033dSHerbert Xu 				},
2363da7f033dSHerbert Xu 				.dec = {
2364da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
2365da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
2366da7f033dSHerbert Xu 				}
2367da7f033dSHerbert Xu 			}
2368da7f033dSHerbert Xu 		}
2369da7f033dSHerbert Xu 	}, {
2370da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
23711aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2372a1915d51SJarod Wilson 		.fips_allowed = 1,
2373da7f033dSHerbert Xu 		.suite = {
2374da7f033dSHerbert Xu 			.cipher = {
2375da7f033dSHerbert Xu 				.enc = {
2376da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
2377da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
2378da7f033dSHerbert Xu 				},
2379da7f033dSHerbert Xu 				.dec = {
2380da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
2381da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
2382da7f033dSHerbert Xu 				}
2383da7f033dSHerbert Xu 			}
2384da7f033dSHerbert Xu 		}
2385da7f033dSHerbert Xu 	}, {
238666e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
238766e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
238866e5bd00SJussi Kivilinna 		.suite = {
238966e5bd00SJussi Kivilinna 			.cipher = {
239066e5bd00SJussi Kivilinna 				.enc = {
239166e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
239266e5bd00SJussi Kivilinna 					.count = 1
239366e5bd00SJussi Kivilinna 				},
239466e5bd00SJussi Kivilinna 				.dec = {
239566e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
239666e5bd00SJussi Kivilinna 					.count = 1
239766e5bd00SJussi Kivilinna 				}
239866e5bd00SJussi Kivilinna 			}
239966e5bd00SJussi Kivilinna 		}
240066e5bd00SJussi Kivilinna 	}, {
2401da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
24021aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2403da7f033dSHerbert Xu 		.suite = {
2404da7f033dSHerbert Xu 			.cipher = {
2405da7f033dSHerbert Xu 				.enc = {
2406da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
2407da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
2408da7f033dSHerbert Xu 				},
2409da7f033dSHerbert Xu 				.dec = {
2410da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
2411da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
2412da7f033dSHerbert Xu 				}
2413da7f033dSHerbert Xu 			}
2414da7f033dSHerbert Xu 		}
2415da7f033dSHerbert Xu 	}, {
2416da7f033dSHerbert Xu 		.alg = "ecb(seed)",
24171aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2418da7f033dSHerbert Xu 		.suite = {
2419da7f033dSHerbert Xu 			.cipher = {
2420da7f033dSHerbert Xu 				.enc = {
2421da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
2422da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
2423da7f033dSHerbert Xu 				},
2424da7f033dSHerbert Xu 				.dec = {
2425da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
2426da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
2427da7f033dSHerbert Xu 				}
2428da7f033dSHerbert Xu 			}
2429da7f033dSHerbert Xu 		}
2430da7f033dSHerbert Xu 	}, {
2431da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
24321aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2433da7f033dSHerbert Xu 		.suite = {
2434da7f033dSHerbert Xu 			.cipher = {
2435da7f033dSHerbert Xu 				.enc = {
2436da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
2437da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
2438da7f033dSHerbert Xu 				},
2439da7f033dSHerbert Xu 				.dec = {
2440da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
2441da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
2442da7f033dSHerbert Xu 				}
2443da7f033dSHerbert Xu 			}
2444da7f033dSHerbert Xu 		}
2445da7f033dSHerbert Xu 	}, {
2446da7f033dSHerbert Xu 		.alg = "ecb(tea)",
24471aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2448da7f033dSHerbert Xu 		.suite = {
2449da7f033dSHerbert Xu 			.cipher = {
2450da7f033dSHerbert Xu 				.enc = {
2451da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
2452da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
2453da7f033dSHerbert Xu 				},
2454da7f033dSHerbert Xu 				.dec = {
2455da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
2456da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
2457da7f033dSHerbert Xu 				}
2458da7f033dSHerbert Xu 			}
2459da7f033dSHerbert Xu 		}
2460da7f033dSHerbert Xu 	}, {
2461da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
24621aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2463da7f033dSHerbert Xu 		.suite = {
2464da7f033dSHerbert Xu 			.cipher = {
2465da7f033dSHerbert Xu 				.enc = {
2466da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
2467da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
2468da7f033dSHerbert Xu 				},
2469da7f033dSHerbert Xu 				.dec = {
2470da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
2471da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
2472da7f033dSHerbert Xu 				}
2473da7f033dSHerbert Xu 			}
2474da7f033dSHerbert Xu 		}
2475da7f033dSHerbert Xu 	}, {
2476da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
24771aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2478da7f033dSHerbert Xu 		.suite = {
2479da7f033dSHerbert Xu 			.cipher = {
2480da7f033dSHerbert Xu 				.enc = {
2481da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
2482da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
2483da7f033dSHerbert Xu 				},
2484da7f033dSHerbert Xu 				.dec = {
2485da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
2486da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
2487da7f033dSHerbert Xu 				}
2488da7f033dSHerbert Xu 			}
2489da7f033dSHerbert Xu 		}
2490da7f033dSHerbert Xu 	}, {
2491da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
24921aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2493da7f033dSHerbert Xu 		.suite = {
2494da7f033dSHerbert Xu 			.cipher = {
2495da7f033dSHerbert Xu 				.enc = {
2496da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
2497da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
2498da7f033dSHerbert Xu 				},
2499da7f033dSHerbert Xu 				.dec = {
2500da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
2501da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
2502da7f033dSHerbert Xu 				}
2503da7f033dSHerbert Xu 			}
2504da7f033dSHerbert Xu 		}
2505da7f033dSHerbert Xu 	}, {
2506da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
25071aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2508da7f033dSHerbert Xu 		.suite = {
2509da7f033dSHerbert Xu 			.cipher = {
2510da7f033dSHerbert Xu 				.enc = {
2511da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
2512da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
2513da7f033dSHerbert Xu 				},
2514da7f033dSHerbert Xu 				.dec = {
2515da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
2516da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
2517da7f033dSHerbert Xu 				}
2518da7f033dSHerbert Xu 			}
2519da7f033dSHerbert Xu 		}
2520da7f033dSHerbert Xu 	}, {
2521da7f033dSHerbert Xu 		.alg = "gcm(aes)",
2522da7f033dSHerbert Xu 		.test = alg_test_aead,
2523a1915d51SJarod Wilson 		.fips_allowed = 1,
2524da7f033dSHerbert Xu 		.suite = {
2525da7f033dSHerbert Xu 			.aead = {
2526da7f033dSHerbert Xu 				.enc = {
2527da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
2528da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
2529da7f033dSHerbert Xu 				},
2530da7f033dSHerbert Xu 				.dec = {
2531da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
2532da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
2533da7f033dSHerbert Xu 				}
2534da7f033dSHerbert Xu 			}
2535da7f033dSHerbert Xu 		}
2536da7f033dSHerbert Xu 	}, {
2537507069c9SYouquan, Song 		.alg = "ghash",
2538507069c9SYouquan, Song 		.test = alg_test_hash,
253918c0ebd2SJarod Wilson 		.fips_allowed = 1,
2540507069c9SYouquan, Song 		.suite = {
2541507069c9SYouquan, Song 			.hash = {
2542507069c9SYouquan, Song 				.vecs = ghash_tv_template,
2543507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
2544507069c9SYouquan, Song 			}
2545507069c9SYouquan, Song 		}
2546507069c9SYouquan, Song 	}, {
2547a482b081SSonic Zhang 		.alg = "hmac(crc32)",
2548a482b081SSonic Zhang 		.test = alg_test_hash,
2549a482b081SSonic Zhang 		.suite = {
2550a482b081SSonic Zhang 			.hash = {
2551a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
2552a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
2553a482b081SSonic Zhang 			}
2554a482b081SSonic Zhang 		}
2555a482b081SSonic Zhang 	}, {
2556da7f033dSHerbert Xu 		.alg = "hmac(md5)",
2557da7f033dSHerbert Xu 		.test = alg_test_hash,
2558da7f033dSHerbert Xu 		.suite = {
2559da7f033dSHerbert Xu 			.hash = {
2560da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
2561da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
2562da7f033dSHerbert Xu 			}
2563da7f033dSHerbert Xu 		}
2564da7f033dSHerbert Xu 	}, {
2565da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
2566da7f033dSHerbert Xu 		.test = alg_test_hash,
2567da7f033dSHerbert Xu 		.suite = {
2568da7f033dSHerbert Xu 			.hash = {
2569da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
2570da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
2571da7f033dSHerbert Xu 			}
2572da7f033dSHerbert Xu 		}
2573da7f033dSHerbert Xu 	}, {
2574da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
2575da7f033dSHerbert Xu 		.test = alg_test_hash,
2576da7f033dSHerbert Xu 		.suite = {
2577da7f033dSHerbert Xu 			.hash = {
2578da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
2579da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
2580da7f033dSHerbert Xu 			}
2581da7f033dSHerbert Xu 		}
2582da7f033dSHerbert Xu 	}, {
2583da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
2584da7f033dSHerbert Xu 		.test = alg_test_hash,
2585a1915d51SJarod Wilson 		.fips_allowed = 1,
2586da7f033dSHerbert Xu 		.suite = {
2587da7f033dSHerbert Xu 			.hash = {
2588da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
2589da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
2590da7f033dSHerbert Xu 			}
2591da7f033dSHerbert Xu 		}
2592da7f033dSHerbert Xu 	}, {
2593da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
2594da7f033dSHerbert Xu 		.test = alg_test_hash,
2595a1915d51SJarod Wilson 		.fips_allowed = 1,
2596da7f033dSHerbert Xu 		.suite = {
2597da7f033dSHerbert Xu 			.hash = {
2598da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
2599da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
2600da7f033dSHerbert Xu 			}
2601da7f033dSHerbert Xu 		}
2602da7f033dSHerbert Xu 	}, {
2603da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
2604da7f033dSHerbert Xu 		.test = alg_test_hash,
2605a1915d51SJarod Wilson 		.fips_allowed = 1,
2606da7f033dSHerbert Xu 		.suite = {
2607da7f033dSHerbert Xu 			.hash = {
2608da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
2609da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
2610da7f033dSHerbert Xu 			}
2611da7f033dSHerbert Xu 		}
2612da7f033dSHerbert Xu 	}, {
2613da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
2614da7f033dSHerbert Xu 		.test = alg_test_hash,
2615a1915d51SJarod Wilson 		.fips_allowed = 1,
2616da7f033dSHerbert Xu 		.suite = {
2617da7f033dSHerbert Xu 			.hash = {
2618da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
2619da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
2620da7f033dSHerbert Xu 			}
2621da7f033dSHerbert Xu 		}
2622da7f033dSHerbert Xu 	}, {
2623da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
2624da7f033dSHerbert Xu 		.test = alg_test_hash,
2625a1915d51SJarod Wilson 		.fips_allowed = 1,
2626da7f033dSHerbert Xu 		.suite = {
2627da7f033dSHerbert Xu 			.hash = {
2628da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
2629da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
2630da7f033dSHerbert Xu 			}
2631da7f033dSHerbert Xu 		}
2632da7f033dSHerbert Xu 	}, {
2633da7f033dSHerbert Xu 		.alg = "lrw(aes)",
26341aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2635da7f033dSHerbert Xu 		.suite = {
2636da7f033dSHerbert Xu 			.cipher = {
2637da7f033dSHerbert Xu 				.enc = {
2638da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
2639da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
2640da7f033dSHerbert Xu 				},
2641da7f033dSHerbert Xu 				.dec = {
2642da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
2643da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
2644da7f033dSHerbert Xu 				}
2645da7f033dSHerbert Xu 			}
2646da7f033dSHerbert Xu 		}
2647da7f033dSHerbert Xu 	}, {
26480840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
26490840605eSJussi Kivilinna 		.test = alg_test_skcipher,
26500840605eSJussi Kivilinna 		.suite = {
26510840605eSJussi Kivilinna 			.cipher = {
26520840605eSJussi Kivilinna 				.enc = {
26530840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
26540840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
26550840605eSJussi Kivilinna 				},
26560840605eSJussi Kivilinna 				.dec = {
26570840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
26580840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
26590840605eSJussi Kivilinna 				}
26600840605eSJussi Kivilinna 			}
26610840605eSJussi Kivilinna 		}
26620840605eSJussi Kivilinna 	}, {
26639b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
26649b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
26659b8b0405SJohannes Goetzfried 		.suite = {
26669b8b0405SJohannes Goetzfried 			.cipher = {
26679b8b0405SJohannes Goetzfried 				.enc = {
26689b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
26699b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
26709b8b0405SJohannes Goetzfried 				},
26719b8b0405SJohannes Goetzfried 				.dec = {
26729b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
26739b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
26749b8b0405SJohannes Goetzfried 				}
26759b8b0405SJohannes Goetzfried 			}
26769b8b0405SJohannes Goetzfried 		}
26779b8b0405SJohannes Goetzfried 	}, {
2678d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
2679d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
2680d7bfc0faSJussi Kivilinna 		.suite = {
2681d7bfc0faSJussi Kivilinna 			.cipher = {
2682d7bfc0faSJussi Kivilinna 				.enc = {
2683d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
2684d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
2685d7bfc0faSJussi Kivilinna 				},
2686d7bfc0faSJussi Kivilinna 				.dec = {
2687d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
2688d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
2689d7bfc0faSJussi Kivilinna 				}
2690d7bfc0faSJussi Kivilinna 			}
2691d7bfc0faSJussi Kivilinna 		}
2692d7bfc0faSJussi Kivilinna 	}, {
26930b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
26940b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
26950b2a1551SJussi Kivilinna 		.suite = {
26960b2a1551SJussi Kivilinna 			.cipher = {
26970b2a1551SJussi Kivilinna 				.enc = {
26980b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
26990b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
27000b2a1551SJussi Kivilinna 				},
27010b2a1551SJussi Kivilinna 				.dec = {
27020b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
27030b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
27040b2a1551SJussi Kivilinna 				}
27050b2a1551SJussi Kivilinna 			}
27060b2a1551SJussi Kivilinna 		}
27070b2a1551SJussi Kivilinna 	}, {
2708da7f033dSHerbert Xu 		.alg = "lzo",
2709da7f033dSHerbert Xu 		.test = alg_test_comp,
27100818904dSMilan Broz 		.fips_allowed = 1,
2711da7f033dSHerbert Xu 		.suite = {
2712da7f033dSHerbert Xu 			.comp = {
2713da7f033dSHerbert Xu 				.comp = {
2714da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
2715da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
2716da7f033dSHerbert Xu 				},
2717da7f033dSHerbert Xu 				.decomp = {
2718da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
2719da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
2720da7f033dSHerbert Xu 				}
2721da7f033dSHerbert Xu 			}
2722da7f033dSHerbert Xu 		}
2723da7f033dSHerbert Xu 	}, {
2724da7f033dSHerbert Xu 		.alg = "md4",
2725da7f033dSHerbert Xu 		.test = alg_test_hash,
2726da7f033dSHerbert Xu 		.suite = {
2727da7f033dSHerbert Xu 			.hash = {
2728da7f033dSHerbert Xu 				.vecs = md4_tv_template,
2729da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
2730da7f033dSHerbert Xu 			}
2731da7f033dSHerbert Xu 		}
2732da7f033dSHerbert Xu 	}, {
2733da7f033dSHerbert Xu 		.alg = "md5",
2734da7f033dSHerbert Xu 		.test = alg_test_hash,
2735da7f033dSHerbert Xu 		.suite = {
2736da7f033dSHerbert Xu 			.hash = {
2737da7f033dSHerbert Xu 				.vecs = md5_tv_template,
2738da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
2739da7f033dSHerbert Xu 			}
2740da7f033dSHerbert Xu 		}
2741da7f033dSHerbert Xu 	}, {
2742da7f033dSHerbert Xu 		.alg = "michael_mic",
2743da7f033dSHerbert Xu 		.test = alg_test_hash,
2744da7f033dSHerbert Xu 		.suite = {
2745da7f033dSHerbert Xu 			.hash = {
2746da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
2747da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
2748da7f033dSHerbert Xu 			}
2749da7f033dSHerbert Xu 		}
2750da7f033dSHerbert Xu 	}, {
2751ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
2752ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
2753ba0e14acSPuneet Saxena 		.fips_allowed = 1,
2754ba0e14acSPuneet Saxena 		.suite = {
2755ba0e14acSPuneet Saxena 			.cipher = {
2756ba0e14acSPuneet Saxena 				.enc = {
2757ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
2758ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
2759ba0e14acSPuneet Saxena 				},
2760ba0e14acSPuneet Saxena 				.dec = {
2761ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
2762ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
2763ba0e14acSPuneet Saxena 				}
2764ba0e14acSPuneet Saxena 			}
2765ba0e14acSPuneet Saxena 		}
2766ba0e14acSPuneet Saxena 	}, {
2767da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
27681aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2769da7f033dSHerbert Xu 		.suite = {
2770da7f033dSHerbert Xu 			.cipher = {
2771da7f033dSHerbert Xu 				.enc = {
2772da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
2773da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
2774da7f033dSHerbert Xu 				},
2775da7f033dSHerbert Xu 				.dec = {
2776da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
2777da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
2778da7f033dSHerbert Xu 				}
2779da7f033dSHerbert Xu 			}
2780da7f033dSHerbert Xu 		}
2781da7f033dSHerbert Xu 	}, {
2782da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
27831aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2784a1915d51SJarod Wilson 		.fips_allowed = 1,
2785da7f033dSHerbert Xu 		.suite = {
2786da7f033dSHerbert Xu 			.cipher = {
2787da7f033dSHerbert Xu 				.enc = {
2788f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
2789f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
2790da7f033dSHerbert Xu 				},
2791da7f033dSHerbert Xu 				.dec = {
2792f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
2793f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
2794da7f033dSHerbert Xu 				}
2795da7f033dSHerbert Xu 			}
2796da7f033dSHerbert Xu 		}
2797da7f033dSHerbert Xu 	}, {
279869435b94SAdrian Hoban 		.alg = "rfc4106(gcm(aes))",
279969435b94SAdrian Hoban 		.test = alg_test_aead,
280069435b94SAdrian Hoban 		.suite = {
280169435b94SAdrian Hoban 			.aead = {
280269435b94SAdrian Hoban 				.enc = {
280369435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
280469435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
280569435b94SAdrian Hoban 				},
280669435b94SAdrian Hoban 				.dec = {
280769435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
280869435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
280969435b94SAdrian Hoban 				}
281069435b94SAdrian Hoban 			}
281169435b94SAdrian Hoban 		}
281269435b94SAdrian Hoban 	}, {
28135d667322SJarod Wilson 		.alg = "rfc4309(ccm(aes))",
28145d667322SJarod Wilson 		.test = alg_test_aead,
2815a1915d51SJarod Wilson 		.fips_allowed = 1,
28165d667322SJarod Wilson 		.suite = {
28175d667322SJarod Wilson 			.aead = {
28185d667322SJarod Wilson 				.enc = {
28195d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
28205d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
28215d667322SJarod Wilson 				},
28225d667322SJarod Wilson 				.dec = {
28235d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
28245d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
28255d667322SJarod Wilson 				}
28265d667322SJarod Wilson 			}
28275d667322SJarod Wilson 		}
28285d667322SJarod Wilson 	}, {
2829e9b7441aSJussi Kivilinna 		.alg = "rfc4543(gcm(aes))",
2830e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
2831e9b7441aSJussi Kivilinna 		.suite = {
2832e9b7441aSJussi Kivilinna 			.aead = {
2833e9b7441aSJussi Kivilinna 				.enc = {
2834e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_enc_tv_template,
2835e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_ENC_TEST_VECTORS
2836e9b7441aSJussi Kivilinna 				},
2837e9b7441aSJussi Kivilinna 				.dec = {
2838e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_dec_tv_template,
2839e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_DEC_TEST_VECTORS
2840e9b7441aSJussi Kivilinna 				},
2841e9b7441aSJussi Kivilinna 			}
2842e9b7441aSJussi Kivilinna 		}
2843e9b7441aSJussi Kivilinna 	}, {
2844da7f033dSHerbert Xu 		.alg = "rmd128",
2845da7f033dSHerbert Xu 		.test = alg_test_hash,
2846da7f033dSHerbert Xu 		.suite = {
2847da7f033dSHerbert Xu 			.hash = {
2848da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
2849da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
2850da7f033dSHerbert Xu 			}
2851da7f033dSHerbert Xu 		}
2852da7f033dSHerbert Xu 	}, {
2853da7f033dSHerbert Xu 		.alg = "rmd160",
2854da7f033dSHerbert Xu 		.test = alg_test_hash,
2855da7f033dSHerbert Xu 		.suite = {
2856da7f033dSHerbert Xu 			.hash = {
2857da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
2858da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
2859da7f033dSHerbert Xu 			}
2860da7f033dSHerbert Xu 		}
2861da7f033dSHerbert Xu 	}, {
2862da7f033dSHerbert Xu 		.alg = "rmd256",
2863da7f033dSHerbert Xu 		.test = alg_test_hash,
2864da7f033dSHerbert Xu 		.suite = {
2865da7f033dSHerbert Xu 			.hash = {
2866da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
2867da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
2868da7f033dSHerbert Xu 			}
2869da7f033dSHerbert Xu 		}
2870da7f033dSHerbert Xu 	}, {
2871da7f033dSHerbert Xu 		.alg = "rmd320",
2872da7f033dSHerbert Xu 		.test = alg_test_hash,
2873da7f033dSHerbert Xu 		.suite = {
2874da7f033dSHerbert Xu 			.hash = {
2875da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
2876da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
2877da7f033dSHerbert Xu 			}
2878da7f033dSHerbert Xu 		}
2879da7f033dSHerbert Xu 	}, {
2880da7f033dSHerbert Xu 		.alg = "salsa20",
28811aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2882da7f033dSHerbert Xu 		.suite = {
2883da7f033dSHerbert Xu 			.cipher = {
2884da7f033dSHerbert Xu 				.enc = {
2885da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
2886da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
2887da7f033dSHerbert Xu 				}
2888da7f033dSHerbert Xu 			}
2889da7f033dSHerbert Xu 		}
2890da7f033dSHerbert Xu 	}, {
2891da7f033dSHerbert Xu 		.alg = "sha1",
2892da7f033dSHerbert Xu 		.test = alg_test_hash,
2893a1915d51SJarod Wilson 		.fips_allowed = 1,
2894da7f033dSHerbert Xu 		.suite = {
2895da7f033dSHerbert Xu 			.hash = {
2896da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
2897da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
2898da7f033dSHerbert Xu 			}
2899da7f033dSHerbert Xu 		}
2900da7f033dSHerbert Xu 	}, {
2901da7f033dSHerbert Xu 		.alg = "sha224",
2902da7f033dSHerbert Xu 		.test = alg_test_hash,
2903a1915d51SJarod Wilson 		.fips_allowed = 1,
2904da7f033dSHerbert Xu 		.suite = {
2905da7f033dSHerbert Xu 			.hash = {
2906da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
2907da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
2908da7f033dSHerbert Xu 			}
2909da7f033dSHerbert Xu 		}
2910da7f033dSHerbert Xu 	}, {
2911da7f033dSHerbert Xu 		.alg = "sha256",
2912da7f033dSHerbert Xu 		.test = alg_test_hash,
2913a1915d51SJarod Wilson 		.fips_allowed = 1,
2914da7f033dSHerbert Xu 		.suite = {
2915da7f033dSHerbert Xu 			.hash = {
2916da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
2917da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
2918da7f033dSHerbert Xu 			}
2919da7f033dSHerbert Xu 		}
2920da7f033dSHerbert Xu 	}, {
2921da7f033dSHerbert Xu 		.alg = "sha384",
2922da7f033dSHerbert Xu 		.test = alg_test_hash,
2923a1915d51SJarod Wilson 		.fips_allowed = 1,
2924da7f033dSHerbert Xu 		.suite = {
2925da7f033dSHerbert Xu 			.hash = {
2926da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
2927da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
2928da7f033dSHerbert Xu 			}
2929da7f033dSHerbert Xu 		}
2930da7f033dSHerbert Xu 	}, {
2931da7f033dSHerbert Xu 		.alg = "sha512",
2932da7f033dSHerbert Xu 		.test = alg_test_hash,
2933a1915d51SJarod Wilson 		.fips_allowed = 1,
2934da7f033dSHerbert Xu 		.suite = {
2935da7f033dSHerbert Xu 			.hash = {
2936da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
2937da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
2938da7f033dSHerbert Xu 			}
2939da7f033dSHerbert Xu 		}
2940da7f033dSHerbert Xu 	}, {
2941da7f033dSHerbert Xu 		.alg = "tgr128",
2942da7f033dSHerbert Xu 		.test = alg_test_hash,
2943da7f033dSHerbert Xu 		.suite = {
2944da7f033dSHerbert Xu 			.hash = {
2945da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
2946da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
2947da7f033dSHerbert Xu 			}
2948da7f033dSHerbert Xu 		}
2949da7f033dSHerbert Xu 	}, {
2950da7f033dSHerbert Xu 		.alg = "tgr160",
2951da7f033dSHerbert Xu 		.test = alg_test_hash,
2952da7f033dSHerbert Xu 		.suite = {
2953da7f033dSHerbert Xu 			.hash = {
2954da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
2955da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
2956da7f033dSHerbert Xu 			}
2957da7f033dSHerbert Xu 		}
2958da7f033dSHerbert Xu 	}, {
2959da7f033dSHerbert Xu 		.alg = "tgr192",
2960da7f033dSHerbert Xu 		.test = alg_test_hash,
2961da7f033dSHerbert Xu 		.suite = {
2962da7f033dSHerbert Xu 			.hash = {
2963da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
2964da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
2965da7f033dSHerbert Xu 			}
2966da7f033dSHerbert Xu 		}
2967da7f033dSHerbert Xu 	}, {
2968f1939f7cSShane Wang 		.alg = "vmac(aes)",
2969f1939f7cSShane Wang 		.test = alg_test_hash,
2970f1939f7cSShane Wang 		.suite = {
2971f1939f7cSShane Wang 			.hash = {
2972f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
2973f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
2974f1939f7cSShane Wang 			}
2975f1939f7cSShane Wang 		}
2976f1939f7cSShane Wang 	}, {
2977da7f033dSHerbert Xu 		.alg = "wp256",
2978da7f033dSHerbert Xu 		.test = alg_test_hash,
2979da7f033dSHerbert Xu 		.suite = {
2980da7f033dSHerbert Xu 			.hash = {
2981da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
2982da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
2983da7f033dSHerbert Xu 			}
2984da7f033dSHerbert Xu 		}
2985da7f033dSHerbert Xu 	}, {
2986da7f033dSHerbert Xu 		.alg = "wp384",
2987da7f033dSHerbert Xu 		.test = alg_test_hash,
2988da7f033dSHerbert Xu 		.suite = {
2989da7f033dSHerbert Xu 			.hash = {
2990da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
2991da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
2992da7f033dSHerbert Xu 			}
2993da7f033dSHerbert Xu 		}
2994da7f033dSHerbert Xu 	}, {
2995da7f033dSHerbert Xu 		.alg = "wp512",
2996da7f033dSHerbert Xu 		.test = alg_test_hash,
2997da7f033dSHerbert Xu 		.suite = {
2998da7f033dSHerbert Xu 			.hash = {
2999da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
3000da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
3001da7f033dSHerbert Xu 			}
3002da7f033dSHerbert Xu 		}
3003da7f033dSHerbert Xu 	}, {
3004da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3005da7f033dSHerbert Xu 		.test = alg_test_hash,
3006da7f033dSHerbert Xu 		.suite = {
3007da7f033dSHerbert Xu 			.hash = {
3008da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
3009da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
3010da7f033dSHerbert Xu 			}
3011da7f033dSHerbert Xu 		}
3012da7f033dSHerbert Xu 	}, {
3013da7f033dSHerbert Xu 		.alg = "xts(aes)",
30141aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
30152918aa8dSJarod Wilson 		.fips_allowed = 1,
3016da7f033dSHerbert Xu 		.suite = {
3017da7f033dSHerbert Xu 			.cipher = {
3018da7f033dSHerbert Xu 				.enc = {
3019da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
3020da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
3021da7f033dSHerbert Xu 				},
3022da7f033dSHerbert Xu 				.dec = {
3023da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
3024da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
3025da7f033dSHerbert Xu 				}
3026da7f033dSHerbert Xu 			}
3027da7f033dSHerbert Xu 		}
30280c01aed5SGeert Uytterhoeven 	}, {
30290840605eSJussi Kivilinna 		.alg = "xts(camellia)",
30300840605eSJussi Kivilinna 		.test = alg_test_skcipher,
30310840605eSJussi Kivilinna 		.suite = {
30320840605eSJussi Kivilinna 			.cipher = {
30330840605eSJussi Kivilinna 				.enc = {
30340840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
30350840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
30360840605eSJussi Kivilinna 				},
30370840605eSJussi Kivilinna 				.dec = {
30380840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
30390840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
30400840605eSJussi Kivilinna 				}
30410840605eSJussi Kivilinna 			}
30420840605eSJussi Kivilinna 		}
30430840605eSJussi Kivilinna 	}, {
30449b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
30459b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
30469b8b0405SJohannes Goetzfried 		.suite = {
30479b8b0405SJohannes Goetzfried 			.cipher = {
30489b8b0405SJohannes Goetzfried 				.enc = {
30499b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
30509b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
30519b8b0405SJohannes Goetzfried 				},
30529b8b0405SJohannes Goetzfried 				.dec = {
30539b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
30549b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
30559b8b0405SJohannes Goetzfried 				}
30569b8b0405SJohannes Goetzfried 			}
30579b8b0405SJohannes Goetzfried 		}
30589b8b0405SJohannes Goetzfried 	}, {
305918be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
306018be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
306118be20b9SJussi Kivilinna 		.suite = {
306218be20b9SJussi Kivilinna 			.cipher = {
306318be20b9SJussi Kivilinna 				.enc = {
306418be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
306518be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
306618be20b9SJussi Kivilinna 				},
306718be20b9SJussi Kivilinna 				.dec = {
306818be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
306918be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
307018be20b9SJussi Kivilinna 				}
307118be20b9SJussi Kivilinna 			}
307218be20b9SJussi Kivilinna 		}
307318be20b9SJussi Kivilinna 	}, {
3074aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3075aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3076aed265b9SJussi Kivilinna 		.suite = {
3077aed265b9SJussi Kivilinna 			.cipher = {
3078aed265b9SJussi Kivilinna 				.enc = {
3079aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
3080aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
3081aed265b9SJussi Kivilinna 				},
3082aed265b9SJussi Kivilinna 				.dec = {
3083aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
3084aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
3085aed265b9SJussi Kivilinna 				}
3086aed265b9SJussi Kivilinna 			}
3087aed265b9SJussi Kivilinna 		}
3088aed265b9SJussi Kivilinna 	}, {
30890c01aed5SGeert Uytterhoeven 		.alg = "zlib",
30900c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
30910818904dSMilan Broz 		.fips_allowed = 1,
30920c01aed5SGeert Uytterhoeven 		.suite = {
30930c01aed5SGeert Uytterhoeven 			.pcomp = {
30940c01aed5SGeert Uytterhoeven 				.comp = {
30950c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
30960c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
30970c01aed5SGeert Uytterhoeven 				},
30980c01aed5SGeert Uytterhoeven 				.decomp = {
30990c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
31000c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
31010c01aed5SGeert Uytterhoeven 				}
31020c01aed5SGeert Uytterhoeven 			}
31030c01aed5SGeert Uytterhoeven 		}
3104da7f033dSHerbert Xu 	}
3105da7f033dSHerbert Xu };
3106da7f033dSHerbert Xu 
31075714758bSJussi Kivilinna static bool alg_test_descs_checked;
31085714758bSJussi Kivilinna 
31095714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
31105714758bSJussi Kivilinna {
31115714758bSJussi Kivilinna 	int i;
31125714758bSJussi Kivilinna 
31135714758bSJussi Kivilinna 	/* only check once */
31145714758bSJussi Kivilinna 	if (alg_test_descs_checked)
31155714758bSJussi Kivilinna 		return;
31165714758bSJussi Kivilinna 
31175714758bSJussi Kivilinna 	alg_test_descs_checked = true;
31185714758bSJussi Kivilinna 
31195714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
31205714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
31215714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
31225714758bSJussi Kivilinna 
31235714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
31245714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
31255714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
31265714758bSJussi Kivilinna 				alg_test_descs[i].alg);
31275714758bSJussi Kivilinna 		}
31285714758bSJussi Kivilinna 
31295714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
31305714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
31315714758bSJussi Kivilinna 				alg_test_descs[i].alg);
31325714758bSJussi Kivilinna 		}
31335714758bSJussi Kivilinna 	}
31345714758bSJussi Kivilinna }
31355714758bSJussi Kivilinna 
31361aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3137da7f033dSHerbert Xu {
3138da7f033dSHerbert Xu 	int start = 0;
3139da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3140da7f033dSHerbert Xu 
3141da7f033dSHerbert Xu 	while (start < end) {
3142da7f033dSHerbert Xu 		int i = (start + end) / 2;
3143da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3144da7f033dSHerbert Xu 
3145da7f033dSHerbert Xu 		if (diff > 0) {
3146da7f033dSHerbert Xu 			end = i;
3147da7f033dSHerbert Xu 			continue;
3148da7f033dSHerbert Xu 		}
3149da7f033dSHerbert Xu 
3150da7f033dSHerbert Xu 		if (diff < 0) {
3151da7f033dSHerbert Xu 			start = i + 1;
3152da7f033dSHerbert Xu 			continue;
3153da7f033dSHerbert Xu 		}
3154da7f033dSHerbert Xu 
31551aa4ecd9SHerbert Xu 		return i;
3156da7f033dSHerbert Xu 	}
3157da7f033dSHerbert Xu 
31581aa4ecd9SHerbert Xu 	return -1;
31591aa4ecd9SHerbert Xu }
31601aa4ecd9SHerbert Xu 
31611aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
31621aa4ecd9SHerbert Xu {
31631aa4ecd9SHerbert Xu 	int i;
3164a68f6610SHerbert Xu 	int j;
3165d12d6b6dSNeil Horman 	int rc;
31661aa4ecd9SHerbert Xu 
31675714758bSJussi Kivilinna 	alg_test_descs_check_order();
31685714758bSJussi Kivilinna 
31691aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
31701aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
31711aa4ecd9SHerbert Xu 
31721aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
31731aa4ecd9SHerbert Xu 		    sizeof(nalg))
31741aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
31751aa4ecd9SHerbert Xu 
31761aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
31771aa4ecd9SHerbert Xu 		if (i < 0)
31781aa4ecd9SHerbert Xu 			goto notest;
31791aa4ecd9SHerbert Xu 
3180a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3181a3bef3a3SJarod Wilson 			goto non_fips_alg;
3182a3bef3a3SJarod Wilson 
3183941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3184941fb328SJarod Wilson 		goto test_done;
31851aa4ecd9SHerbert Xu 	}
31861aa4ecd9SHerbert Xu 
31871aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3188a68f6610SHerbert Xu 	j = alg_find_test(driver);
3189a68f6610SHerbert Xu 	if (i < 0 && j < 0)
31901aa4ecd9SHerbert Xu 		goto notest;
31911aa4ecd9SHerbert Xu 
3192a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3193a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3194a3bef3a3SJarod Wilson 		goto non_fips_alg;
3195a3bef3a3SJarod Wilson 
3196a68f6610SHerbert Xu 	rc = 0;
3197a68f6610SHerbert Xu 	if (i >= 0)
3198a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
31991aa4ecd9SHerbert Xu 					     type, mask);
3200a68f6610SHerbert Xu 	if (j >= 0)
3201a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3202a68f6610SHerbert Xu 					     type, mask);
3203a68f6610SHerbert Xu 
3204941fb328SJarod Wilson test_done:
3205d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3206d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3207d12d6b6dSNeil Horman 
320829ecd4abSJarod Wilson 	if (fips_enabled && !rc)
320929ecd4abSJarod Wilson 		printk(KERN_INFO "alg: self-tests for %s (%s) passed\n",
321029ecd4abSJarod Wilson 		       driver, alg);
321129ecd4abSJarod Wilson 
3212d12d6b6dSNeil Horman 	return rc;
32131aa4ecd9SHerbert Xu 
32141aa4ecd9SHerbert Xu notest:
3215da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3216da7f033dSHerbert Xu 	return 0;
3217a3bef3a3SJarod Wilson non_fips_alg:
3218a3bef3a3SJarod Wilson 	return -EINVAL;
3219da7f033dSHerbert Xu }
32200b767f96SAlexander Shishkin 
3221326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
32220b767f96SAlexander Shishkin 
3223da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3224