xref: /openbmc/linux/crypto/testmgr.c (revision da5ffe11)
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 
187da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
188da5ffe11SJussi Kivilinna 		       unsigned int tcount, bool use_digest,
189da5ffe11SJussi Kivilinna 		       const int align_offset)
190da7f033dSHerbert Xu {
191da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
192da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
193da7f033dSHerbert Xu 	struct scatterlist sg[8];
194da7f033dSHerbert Xu 	char result[64];
195da7f033dSHerbert Xu 	struct ahash_request *req;
196da7f033dSHerbert Xu 	struct tcrypt_result tresult;
197da7f033dSHerbert Xu 	void *hash_buff;
198f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
199f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
200f8b0d4d0SHerbert Xu 
201f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
202f8b0d4d0SHerbert Xu 		goto out_nobuf;
203da7f033dSHerbert Xu 
204da7f033dSHerbert Xu 	init_completion(&tresult.completion);
205da7f033dSHerbert Xu 
206da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
207da7f033dSHerbert Xu 	if (!req) {
208da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
209da7f033dSHerbert Xu 		       "%s\n", algo);
210da7f033dSHerbert Xu 		goto out_noreq;
211da7f033dSHerbert Xu 	}
212da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
213da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
214da7f033dSHerbert Xu 
215a0cfae59SHerbert Xu 	j = 0;
216da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
217a0cfae59SHerbert Xu 		if (template[i].np)
218a0cfae59SHerbert Xu 			continue;
219a0cfae59SHerbert Xu 
220da5ffe11SJussi Kivilinna 		ret = -EINVAL;
221da5ffe11SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
222da5ffe11SJussi Kivilinna 			goto out;
223da5ffe11SJussi Kivilinna 
224a0cfae59SHerbert Xu 		j++;
225da7f033dSHerbert Xu 		memset(result, 0, 64);
226da7f033dSHerbert Xu 
227da7f033dSHerbert Xu 		hash_buff = xbuf[0];
228da5ffe11SJussi Kivilinna 		hash_buff += align_offset;
229da7f033dSHerbert Xu 
230da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
231da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
232da7f033dSHerbert Xu 
233da7f033dSHerbert Xu 		if (template[i].ksize) {
234da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
235da7f033dSHerbert Xu 			ret = crypto_ahash_setkey(tfm, template[i].key,
236da7f033dSHerbert Xu 						  template[i].ksize);
237da7f033dSHerbert Xu 			if (ret) {
238da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
239a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
240da7f033dSHerbert Xu 				       -ret);
241da7f033dSHerbert Xu 				goto out;
242da7f033dSHerbert Xu 			}
243da7f033dSHerbert Xu 		}
244da7f033dSHerbert Xu 
245da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
246a8f1a052SDavid S. Miller 		if (use_digest) {
247a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
248a8f1a052SDavid S. Miller 						   crypto_ahash_digest(req));
249a8f1a052SDavid S. Miller 			if (ret) {
250a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
251a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
252da7f033dSHerbert Xu 				goto out;
253da7f033dSHerbert Xu 			}
254a8f1a052SDavid S. Miller 		} else {
255a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
256a8f1a052SDavid S. Miller 						   crypto_ahash_init(req));
257a8f1a052SDavid S. Miller 			if (ret) {
258a8f1a052SDavid S. Miller 				pr_err("alt: hash: init failed on test %d "
259a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
260a8f1a052SDavid S. Miller 				goto out;
261a8f1a052SDavid S. Miller 			}
262a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
263a8f1a052SDavid S. Miller 						   crypto_ahash_update(req));
264a8f1a052SDavid S. Miller 			if (ret) {
265a8f1a052SDavid S. Miller 				pr_err("alt: hash: update failed on test %d "
266a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
267a8f1a052SDavid S. Miller 				goto out;
268a8f1a052SDavid S. Miller 			}
269a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
270a8f1a052SDavid S. Miller 						   crypto_ahash_final(req));
271a8f1a052SDavid S. Miller 			if (ret) {
272a8f1a052SDavid S. Miller 				pr_err("alt: hash: final failed on test %d "
273a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
274a8f1a052SDavid S. Miller 				goto out;
275a8f1a052SDavid S. Miller 			}
276a8f1a052SDavid S. Miller 		}
277da7f033dSHerbert Xu 
278da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
279da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
280da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
281a0cfae59SHerbert Xu 			       j, algo);
282da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
283da7f033dSHerbert Xu 			ret = -EINVAL;
284da7f033dSHerbert Xu 			goto out;
285da7f033dSHerbert Xu 		}
286da7f033dSHerbert Xu 	}
287da7f033dSHerbert Xu 
288da7f033dSHerbert Xu 	j = 0;
289da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
290da5ffe11SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
291da5ffe11SJussi Kivilinna 		if (align_offset != 0)
292da5ffe11SJussi Kivilinna 			break;
293da5ffe11SJussi Kivilinna 
294da7f033dSHerbert Xu 		if (template[i].np) {
295da7f033dSHerbert Xu 			j++;
296da7f033dSHerbert Xu 			memset(result, 0, 64);
297da7f033dSHerbert Xu 
298da7f033dSHerbert Xu 			temp = 0;
299da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
300fd57f22aSHerbert Xu 			ret = -EINVAL;
301da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
302fd57f22aSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
303fd57f22aSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
304fd57f22aSHerbert Xu 					goto out;
305da7f033dSHerbert Xu 				sg_set_buf(&sg[k],
306da7f033dSHerbert Xu 					   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
307da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
308da7f033dSHerbert Xu 						  template[i].plaintext + temp,
309da7f033dSHerbert Xu 						  template[i].tap[k]),
310da7f033dSHerbert Xu 					   template[i].tap[k]);
311da7f033dSHerbert Xu 				temp += template[i].tap[k];
312da7f033dSHerbert Xu 			}
313da7f033dSHerbert Xu 
314da7f033dSHerbert Xu 			if (template[i].ksize) {
315da7f033dSHerbert Xu 				crypto_ahash_clear_flags(tfm, ~0);
316da7f033dSHerbert Xu 				ret = crypto_ahash_setkey(tfm, template[i].key,
317da7f033dSHerbert Xu 							  template[i].ksize);
318da7f033dSHerbert Xu 
319da7f033dSHerbert Xu 				if (ret) {
320da7f033dSHerbert Xu 					printk(KERN_ERR "alg: hash: setkey "
321da7f033dSHerbert Xu 					       "failed on chunking test %d "
322da7f033dSHerbert Xu 					       "for %s: ret=%d\n", j, algo,
323da7f033dSHerbert Xu 					       -ret);
324da7f033dSHerbert Xu 					goto out;
325da7f033dSHerbert Xu 				}
326da7f033dSHerbert Xu 			}
327da7f033dSHerbert Xu 
328da7f033dSHerbert Xu 			ahash_request_set_crypt(req, sg, result,
329da7f033dSHerbert Xu 						template[i].psize);
330da7f033dSHerbert Xu 			ret = crypto_ahash_digest(req);
331da7f033dSHerbert Xu 			switch (ret) {
332da7f033dSHerbert Xu 			case 0:
333da7f033dSHerbert Xu 				break;
334da7f033dSHerbert Xu 			case -EINPROGRESS:
335da7f033dSHerbert Xu 			case -EBUSY:
336da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
337da7f033dSHerbert Xu 					&tresult.completion);
338da7f033dSHerbert Xu 				if (!ret && !(ret = tresult.err)) {
339da7f033dSHerbert Xu 					INIT_COMPLETION(tresult.completion);
340da7f033dSHerbert Xu 					break;
341da7f033dSHerbert Xu 				}
342da7f033dSHerbert Xu 				/* fall through */
343da7f033dSHerbert Xu 			default:
344da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: digest failed "
345da7f033dSHerbert Xu 				       "on chunking test %d for %s: "
346da7f033dSHerbert Xu 				       "ret=%d\n", j, algo, -ret);
347da7f033dSHerbert Xu 				goto out;
348da7f033dSHerbert Xu 			}
349da7f033dSHerbert Xu 
350da7f033dSHerbert Xu 			if (memcmp(result, template[i].digest,
351da7f033dSHerbert Xu 				   crypto_ahash_digestsize(tfm))) {
352da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: Chunking test %d "
353da7f033dSHerbert Xu 				       "failed for %s\n", j, algo);
354da7f033dSHerbert Xu 				hexdump(result, crypto_ahash_digestsize(tfm));
355da7f033dSHerbert Xu 				ret = -EINVAL;
356da7f033dSHerbert Xu 				goto out;
357da7f033dSHerbert Xu 			}
358da7f033dSHerbert Xu 		}
359da7f033dSHerbert Xu 	}
360da7f033dSHerbert Xu 
361da7f033dSHerbert Xu 	ret = 0;
362da7f033dSHerbert Xu 
363da7f033dSHerbert Xu out:
364da7f033dSHerbert Xu 	ahash_request_free(req);
365da7f033dSHerbert Xu out_noreq:
366f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
367f8b0d4d0SHerbert Xu out_nobuf:
368da7f033dSHerbert Xu 	return ret;
369da7f033dSHerbert Xu }
370da7f033dSHerbert Xu 
371da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
372da5ffe11SJussi Kivilinna 		     unsigned int tcount, bool use_digest)
373da5ffe11SJussi Kivilinna {
374da5ffe11SJussi Kivilinna 	unsigned int alignmask;
375da5ffe11SJussi Kivilinna 	int ret;
376da5ffe11SJussi Kivilinna 
377da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
378da5ffe11SJussi Kivilinna 	if (ret)
379da5ffe11SJussi Kivilinna 		return ret;
380da5ffe11SJussi Kivilinna 
381da5ffe11SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
382da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
383da5ffe11SJussi Kivilinna 	if (ret)
384da5ffe11SJussi Kivilinna 		return ret;
385da5ffe11SJussi Kivilinna 
386da5ffe11SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
387da5ffe11SJussi Kivilinna 	if (alignmask) {
388da5ffe11SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
389da5ffe11SJussi Kivilinna 		ret = __test_hash(tfm, template, tcount, use_digest,
390da5ffe11SJussi Kivilinna 				  alignmask + 1);
391da5ffe11SJussi Kivilinna 		if (ret)
392da5ffe11SJussi Kivilinna 			return ret;
393da5ffe11SJussi Kivilinna 	}
394da5ffe11SJussi Kivilinna 
395da5ffe11SJussi Kivilinna 	return 0;
396da5ffe11SJussi Kivilinna }
397da5ffe11SJussi Kivilinna 
398d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
399d8a32ac2SJussi Kivilinna 		       struct aead_testvec *template, unsigned int tcount,
40058dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
401da7f033dSHerbert Xu {
402da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
403da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
404f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
405da7f033dSHerbert Xu 	char *q;
406da7f033dSHerbert Xu 	char *key;
407da7f033dSHerbert Xu 	struct aead_request *req;
408d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
409d8a32ac2SJussi Kivilinna 	struct scatterlist *asg;
410d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
411d8a32ac2SJussi Kivilinna 	const char *e, *d;
412da7f033dSHerbert Xu 	struct tcrypt_result result;
413da7f033dSHerbert Xu 	unsigned int authsize;
414da7f033dSHerbert Xu 	void *input;
415d8a32ac2SJussi Kivilinna 	void *output;
416da7f033dSHerbert Xu 	void *assoc;
417da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
418f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
419d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
420f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
421f8b0d4d0SHerbert Xu 
422f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
423f8b0d4d0SHerbert Xu 		goto out_noxbuf;
424f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
425f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
426da7f033dSHerbert Xu 
427d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
428d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
429d8a32ac2SJussi Kivilinna 
430d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
431d8a32ac2SJussi Kivilinna 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 3 : 2), GFP_KERNEL);
432d8a32ac2SJussi Kivilinna 	if (!sg)
433d8a32ac2SJussi Kivilinna 		goto out_nosg;
434d8a32ac2SJussi Kivilinna 	asg = &sg[8];
435d8a32ac2SJussi Kivilinna 	sgout = &asg[8];
436d8a32ac2SJussi Kivilinna 
437d8a32ac2SJussi Kivilinna 	if (diff_dst)
438d8a32ac2SJussi Kivilinna 		d = "-ddst";
439d8a32ac2SJussi Kivilinna 	else
440d8a32ac2SJussi Kivilinna 		d = "";
441d8a32ac2SJussi Kivilinna 
442da7f033dSHerbert Xu 	if (enc == ENCRYPT)
443da7f033dSHerbert Xu 		e = "encryption";
444da7f033dSHerbert Xu 	else
445da7f033dSHerbert Xu 		e = "decryption";
446da7f033dSHerbert Xu 
447da7f033dSHerbert Xu 	init_completion(&result.completion);
448da7f033dSHerbert Xu 
449da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
450da7f033dSHerbert Xu 	if (!req) {
451d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
452d8a32ac2SJussi Kivilinna 		       d, algo);
453da7f033dSHerbert Xu 		goto out;
454da7f033dSHerbert Xu 	}
455da7f033dSHerbert Xu 
456da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
457da7f033dSHerbert Xu 				  tcrypt_complete, &result);
458da7f033dSHerbert Xu 
459da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
460da7f033dSHerbert Xu 		if (!template[i].np) {
461da7f033dSHerbert Xu 			j++;
462da7f033dSHerbert Xu 
46358dcf548SJussi Kivilinna 			/* some templates have no input data but they will
464da7f033dSHerbert Xu 			 * touch input
465da7f033dSHerbert Xu 			 */
466da7f033dSHerbert Xu 			input = xbuf[0];
46758dcf548SJussi Kivilinna 			input += align_offset;
468da7f033dSHerbert Xu 			assoc = axbuf[0];
469da7f033dSHerbert Xu 
470fd57f22aSHerbert Xu 			ret = -EINVAL;
47158dcf548SJussi Kivilinna 			if (WARN_ON(align_offset + template[i].ilen >
47258dcf548SJussi Kivilinna 				    PAGE_SIZE || template[i].alen > PAGE_SIZE))
473fd57f22aSHerbert Xu 				goto out;
474fd57f22aSHerbert Xu 
475da7f033dSHerbert Xu 			memcpy(input, template[i].input, template[i].ilen);
476da7f033dSHerbert Xu 			memcpy(assoc, template[i].assoc, template[i].alen);
477da7f033dSHerbert Xu 			if (template[i].iv)
478da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
479da7f033dSHerbert Xu 			else
480da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
481da7f033dSHerbert Xu 
482da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
483da7f033dSHerbert Xu 			if (template[i].wk)
484da7f033dSHerbert Xu 				crypto_aead_set_flags(
485da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
486da7f033dSHerbert Xu 
487da7f033dSHerbert Xu 			key = template[i].key;
488da7f033dSHerbert Xu 
489da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key,
490da7f033dSHerbert Xu 						 template[i].klen);
491da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
492d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
493d8a32ac2SJussi Kivilinna 				       d, j, algo, crypto_aead_get_flags(tfm));
494da7f033dSHerbert Xu 				goto out;
495da7f033dSHerbert Xu 			} else if (ret)
496da7f033dSHerbert Xu 				continue;
497da7f033dSHerbert Xu 
498da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
499da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
500da7f033dSHerbert Xu 			if (ret) {
501d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
502d8a32ac2SJussi Kivilinna 				       d, authsize, j, algo);
503da7f033dSHerbert Xu 				goto out;
504da7f033dSHerbert Xu 			}
505da7f033dSHerbert Xu 
506da7f033dSHerbert Xu 			sg_init_one(&sg[0], input,
507da7f033dSHerbert Xu 				    template[i].ilen + (enc ? authsize : 0));
508da7f033dSHerbert Xu 
509d8a32ac2SJussi Kivilinna 			if (diff_dst) {
510d8a32ac2SJussi Kivilinna 				output = xoutbuf[0];
51158dcf548SJussi Kivilinna 				output += align_offset;
512d8a32ac2SJussi Kivilinna 				sg_init_one(&sgout[0], output,
513d8a32ac2SJussi Kivilinna 					    template[i].ilen +
514d8a32ac2SJussi Kivilinna 						(enc ? authsize : 0));
515d8a32ac2SJussi Kivilinna 			} else {
516d8a32ac2SJussi Kivilinna 				output = input;
517d8a32ac2SJussi Kivilinna 			}
518d8a32ac2SJussi Kivilinna 
519da7f033dSHerbert Xu 			sg_init_one(&asg[0], assoc, template[i].alen);
520da7f033dSHerbert Xu 
521d8a32ac2SJussi Kivilinna 			aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
522da7f033dSHerbert Xu 					       template[i].ilen, iv);
523da7f033dSHerbert Xu 
524da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
525da7f033dSHerbert Xu 
526da7f033dSHerbert Xu 			ret = enc ?
527da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
528da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
529da7f033dSHerbert Xu 
530da7f033dSHerbert Xu 			switch (ret) {
531da7f033dSHerbert Xu 			case 0:
532e44a1b44SJarod Wilson 				if (template[i].novrfy) {
533e44a1b44SJarod Wilson 					/* verification was supposed to fail */
534d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
535d8a32ac2SJussi Kivilinna 					       d, e, j, algo);
536e44a1b44SJarod Wilson 					/* so really, we got a bad message */
537e44a1b44SJarod Wilson 					ret = -EBADMSG;
538e44a1b44SJarod Wilson 					goto out;
539e44a1b44SJarod Wilson 				}
540da7f033dSHerbert Xu 				break;
541da7f033dSHerbert Xu 			case -EINPROGRESS:
542da7f033dSHerbert Xu 			case -EBUSY:
543da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
544da7f033dSHerbert Xu 					&result.completion);
545da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
546da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
547da7f033dSHerbert Xu 					break;
548da7f033dSHerbert Xu 				}
549e44a1b44SJarod Wilson 			case -EBADMSG:
550e44a1b44SJarod Wilson 				if (template[i].novrfy)
551e44a1b44SJarod Wilson 					/* verification failure was expected */
552e44a1b44SJarod Wilson 					continue;
553da7f033dSHerbert Xu 				/* fall through */
554da7f033dSHerbert Xu 			default:
555d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
556d8a32ac2SJussi Kivilinna 				       d, e, j, algo, -ret);
557da7f033dSHerbert Xu 				goto out;
558da7f033dSHerbert Xu 			}
559da7f033dSHerbert Xu 
560d8a32ac2SJussi Kivilinna 			q = output;
561da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
562d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Test %d failed on %s for %s\n",
563d8a32ac2SJussi Kivilinna 				       d, j, e, algo);
564da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
565da7f033dSHerbert Xu 				ret = -EINVAL;
566da7f033dSHerbert Xu 				goto out;
567da7f033dSHerbert Xu 			}
568da7f033dSHerbert Xu 		}
569da7f033dSHerbert Xu 	}
570da7f033dSHerbert Xu 
571da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
57258dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
57358dcf548SJussi Kivilinna 		if (align_offset != 0)
57458dcf548SJussi Kivilinna 			break;
57558dcf548SJussi Kivilinna 
576da7f033dSHerbert Xu 		if (template[i].np) {
577da7f033dSHerbert Xu 			j++;
578da7f033dSHerbert Xu 
579da7f033dSHerbert Xu 			if (template[i].iv)
580da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
581da7f033dSHerbert Xu 			else
582da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
583da7f033dSHerbert Xu 
584da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
585da7f033dSHerbert Xu 			if (template[i].wk)
586da7f033dSHerbert Xu 				crypto_aead_set_flags(
587da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
588da7f033dSHerbert Xu 			key = template[i].key;
589da7f033dSHerbert Xu 
590da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key, template[i].klen);
591da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
592d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
593d8a32ac2SJussi Kivilinna 				       d, j, algo, crypto_aead_get_flags(tfm));
594da7f033dSHerbert Xu 				goto out;
595da7f033dSHerbert Xu 			} else if (ret)
596da7f033dSHerbert Xu 				continue;
597da7f033dSHerbert Xu 
598da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
599da7f033dSHerbert Xu 
600da7f033dSHerbert Xu 			ret = -EINVAL;
601da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
602d8a32ac2SJussi Kivilinna 			if (diff_dst)
603d8a32ac2SJussi Kivilinna 				sg_init_table(sgout, template[i].np);
604da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
605da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
606da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
607da7f033dSHerbert Xu 					goto out;
608da7f033dSHerbert Xu 
609da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
610da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
611da7f033dSHerbert Xu 
612da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
613da7f033dSHerbert Xu 				       template[i].tap[k]);
614da7f033dSHerbert Xu 
615da7f033dSHerbert Xu 				n = template[i].tap[k];
616da7f033dSHerbert Xu 				if (k == template[i].np - 1 && enc)
617da7f033dSHerbert Xu 					n += authsize;
618da7f033dSHerbert Xu 				if (offset_in_page(q) + n < PAGE_SIZE)
619da7f033dSHerbert Xu 					q[n] = 0;
620da7f033dSHerbert Xu 
621da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
622d8a32ac2SJussi Kivilinna 
623d8a32ac2SJussi Kivilinna 				if (diff_dst) {
624d8a32ac2SJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
625d8a32ac2SJussi Kivilinna 					    offset_in_page(IDX[k]);
626d8a32ac2SJussi Kivilinna 
627d8a32ac2SJussi Kivilinna 					memset(q, 0, template[i].tap[k]);
628d8a32ac2SJussi Kivilinna 					if (offset_in_page(q) + n < PAGE_SIZE)
629d8a32ac2SJussi Kivilinna 						q[n] = 0;
630d8a32ac2SJussi Kivilinna 
631d8a32ac2SJussi Kivilinna 					sg_set_buf(&sgout[k], q,
632d8a32ac2SJussi Kivilinna 						   template[i].tap[k]);
633d8a32ac2SJussi Kivilinna 				}
634d8a32ac2SJussi Kivilinna 
635da7f033dSHerbert Xu 				temp += template[i].tap[k];
636da7f033dSHerbert Xu 			}
637da7f033dSHerbert Xu 
638da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
639da7f033dSHerbert Xu 			if (ret) {
640d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
641d8a32ac2SJussi Kivilinna 				       d, authsize, j, algo);
642da7f033dSHerbert Xu 				goto out;
643da7f033dSHerbert Xu 			}
644da7f033dSHerbert Xu 
645da7f033dSHerbert Xu 			if (enc) {
646da7f033dSHerbert Xu 				if (WARN_ON(sg[k - 1].offset +
647da7f033dSHerbert Xu 					    sg[k - 1].length + authsize >
648da7f033dSHerbert Xu 					    PAGE_SIZE)) {
649da7f033dSHerbert Xu 					ret = -EINVAL;
650da7f033dSHerbert Xu 					goto out;
651da7f033dSHerbert Xu 				}
652da7f033dSHerbert Xu 
653da7f033dSHerbert Xu 				sg[k - 1].length += authsize;
654d8a32ac2SJussi Kivilinna 
655d8a32ac2SJussi Kivilinna 				if (diff_dst)
656d8a32ac2SJussi Kivilinna 					sgout[k - 1].length += authsize;
657da7f033dSHerbert Xu 			}
658da7f033dSHerbert Xu 
659da7f033dSHerbert Xu 			sg_init_table(asg, template[i].anp);
660fd57f22aSHerbert Xu 			ret = -EINVAL;
661da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].anp; k++) {
662fd57f22aSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
663fd57f22aSHerbert Xu 					    template[i].atap[k] > PAGE_SIZE))
664fd57f22aSHerbert Xu 					goto out;
665da7f033dSHerbert Xu 				sg_set_buf(&asg[k],
666da7f033dSHerbert Xu 					   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
667da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
668da7f033dSHerbert Xu 						  template[i].assoc + temp,
669da7f033dSHerbert Xu 						  template[i].atap[k]),
670da7f033dSHerbert Xu 					   template[i].atap[k]);
671da7f033dSHerbert Xu 				temp += template[i].atap[k];
672da7f033dSHerbert Xu 			}
673da7f033dSHerbert Xu 
674d8a32ac2SJussi Kivilinna 			aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
675da7f033dSHerbert Xu 					       template[i].ilen,
676da7f033dSHerbert Xu 					       iv);
677da7f033dSHerbert Xu 
678da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
679da7f033dSHerbert Xu 
680da7f033dSHerbert Xu 			ret = enc ?
681da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
682da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
683da7f033dSHerbert Xu 
684da7f033dSHerbert Xu 			switch (ret) {
685da7f033dSHerbert Xu 			case 0:
686e44a1b44SJarod Wilson 				if (template[i].novrfy) {
687e44a1b44SJarod Wilson 					/* verification was supposed to fail */
688d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
689d8a32ac2SJussi Kivilinna 					       d, e, j, algo);
690e44a1b44SJarod Wilson 					/* so really, we got a bad message */
691e44a1b44SJarod Wilson 					ret = -EBADMSG;
692e44a1b44SJarod Wilson 					goto out;
693e44a1b44SJarod Wilson 				}
694da7f033dSHerbert Xu 				break;
695da7f033dSHerbert Xu 			case -EINPROGRESS:
696da7f033dSHerbert Xu 			case -EBUSY:
697da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
698da7f033dSHerbert Xu 					&result.completion);
699da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
700da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
701da7f033dSHerbert Xu 					break;
702da7f033dSHerbert Xu 				}
703e44a1b44SJarod Wilson 			case -EBADMSG:
704e44a1b44SJarod Wilson 				if (template[i].novrfy)
705e44a1b44SJarod Wilson 					/* verification failure was expected */
706e44a1b44SJarod Wilson 					continue;
707da7f033dSHerbert Xu 				/* fall through */
708da7f033dSHerbert Xu 			default:
709d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
710d8a32ac2SJussi Kivilinna 				       d, e, j, algo, -ret);
711da7f033dSHerbert Xu 				goto out;
712da7f033dSHerbert Xu 			}
713da7f033dSHerbert Xu 
714da7f033dSHerbert Xu 			ret = -EINVAL;
715da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
716d8a32ac2SJussi Kivilinna 				if (diff_dst)
717d8a32ac2SJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
718d8a32ac2SJussi Kivilinna 					    offset_in_page(IDX[k]);
719d8a32ac2SJussi Kivilinna 				else
720da7f033dSHerbert Xu 					q = xbuf[IDX[k] >> PAGE_SHIFT] +
721da7f033dSHerbert Xu 					    offset_in_page(IDX[k]);
722da7f033dSHerbert Xu 
723da7f033dSHerbert Xu 				n = template[i].tap[k];
724da7f033dSHerbert Xu 				if (k == template[i].np - 1)
725da7f033dSHerbert Xu 					n += enc ? authsize : -authsize;
726da7f033dSHerbert Xu 
727da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp, n)) {
728d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
729d8a32ac2SJussi Kivilinna 					       d, j, e, k, algo);
730da7f033dSHerbert Xu 					hexdump(q, n);
731da7f033dSHerbert Xu 					goto out;
732da7f033dSHerbert Xu 				}
733da7f033dSHerbert Xu 
734da7f033dSHerbert Xu 				q += n;
735da7f033dSHerbert Xu 				if (k == template[i].np - 1 && !enc) {
736d8a32ac2SJussi Kivilinna 					if (!diff_dst &&
737d8a32ac2SJussi Kivilinna 						memcmp(q, template[i].input +
738da7f033dSHerbert Xu 						      temp + n, authsize))
739da7f033dSHerbert Xu 						n = authsize;
740da7f033dSHerbert Xu 					else
741da7f033dSHerbert Xu 						n = 0;
742da7f033dSHerbert Xu 				} else {
743da7f033dSHerbert Xu 					for (n = 0; offset_in_page(q + n) &&
744da7f033dSHerbert Xu 						    q[n]; n++)
745da7f033dSHerbert Xu 						;
746da7f033dSHerbert Xu 				}
747da7f033dSHerbert Xu 				if (n) {
748d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
749d8a32ac2SJussi Kivilinna 					       d, j, e, k, algo, n);
750da7f033dSHerbert Xu 					hexdump(q, n);
751da7f033dSHerbert Xu 					goto out;
752da7f033dSHerbert Xu 				}
753da7f033dSHerbert Xu 
754da7f033dSHerbert Xu 				temp += template[i].tap[k];
755da7f033dSHerbert Xu 			}
756da7f033dSHerbert Xu 		}
757da7f033dSHerbert Xu 	}
758da7f033dSHerbert Xu 
759da7f033dSHerbert Xu 	ret = 0;
760da7f033dSHerbert Xu 
761da7f033dSHerbert Xu out:
762da7f033dSHerbert Xu 	aead_request_free(req);
763d8a32ac2SJussi Kivilinna 	kfree(sg);
764d8a32ac2SJussi Kivilinna out_nosg:
765d8a32ac2SJussi Kivilinna 	if (diff_dst)
766d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
767d8a32ac2SJussi Kivilinna out_nooutbuf:
768f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
769f8b0d4d0SHerbert Xu out_noaxbuf:
770f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
771f8b0d4d0SHerbert Xu out_noxbuf:
772da7f033dSHerbert Xu 	return ret;
773da7f033dSHerbert Xu }
774da7f033dSHerbert Xu 
775d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
776d8a32ac2SJussi Kivilinna 		     struct aead_testvec *template, unsigned int tcount)
777d8a32ac2SJussi Kivilinna {
77858dcf548SJussi Kivilinna 	unsigned int alignmask;
779d8a32ac2SJussi Kivilinna 	int ret;
780d8a32ac2SJussi Kivilinna 
781d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
78258dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
783d8a32ac2SJussi Kivilinna 	if (ret)
784d8a32ac2SJussi Kivilinna 		return ret;
785d8a32ac2SJussi Kivilinna 
786d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
78758dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
78858dcf548SJussi Kivilinna 	if (ret)
78958dcf548SJussi Kivilinna 		return ret;
79058dcf548SJussi Kivilinna 
79158dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
79258dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
79358dcf548SJussi Kivilinna 	if (ret)
79458dcf548SJussi Kivilinna 		return ret;
79558dcf548SJussi Kivilinna 
79658dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
79758dcf548SJussi Kivilinna 	if (alignmask) {
79858dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
79958dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
80058dcf548SJussi Kivilinna 				  alignmask + 1);
80158dcf548SJussi Kivilinna 		if (ret)
80258dcf548SJussi Kivilinna 			return ret;
80358dcf548SJussi Kivilinna 	}
80458dcf548SJussi Kivilinna 
80558dcf548SJussi Kivilinna 	return 0;
806d8a32ac2SJussi Kivilinna }
807d8a32ac2SJussi Kivilinna 
8081aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
8091aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
8101aa4ecd9SHerbert Xu {
8111aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
8121aa4ecd9SHerbert Xu 	unsigned int i, j, k;
8131aa4ecd9SHerbert Xu 	char *q;
8141aa4ecd9SHerbert Xu 	const char *e;
8151aa4ecd9SHerbert Xu 	void *data;
816f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
817f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
818f8b0d4d0SHerbert Xu 
819f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
820f8b0d4d0SHerbert Xu 		goto out_nobuf;
8211aa4ecd9SHerbert Xu 
8221aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
8231aa4ecd9SHerbert Xu 	        e = "encryption";
8241aa4ecd9SHerbert Xu 	else
8251aa4ecd9SHerbert Xu 		e = "decryption";
8261aa4ecd9SHerbert Xu 
8271aa4ecd9SHerbert Xu 	j = 0;
8281aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
8291aa4ecd9SHerbert Xu 		if (template[i].np)
8301aa4ecd9SHerbert Xu 			continue;
8311aa4ecd9SHerbert Xu 
8321aa4ecd9SHerbert Xu 		j++;
8331aa4ecd9SHerbert Xu 
834fd57f22aSHerbert Xu 		ret = -EINVAL;
835fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
836fd57f22aSHerbert Xu 			goto out;
837fd57f22aSHerbert Xu 
8381aa4ecd9SHerbert Xu 		data = xbuf[0];
8391aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
8401aa4ecd9SHerbert Xu 
8411aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
8421aa4ecd9SHerbert Xu 		if (template[i].wk)
8431aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
8441aa4ecd9SHerbert Xu 
8451aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
8461aa4ecd9SHerbert Xu 					   template[i].klen);
8471aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
8481aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
8491aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
8501aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
8511aa4ecd9SHerbert Xu 			goto out;
8521aa4ecd9SHerbert Xu 		} else if (ret)
8531aa4ecd9SHerbert Xu 			continue;
8541aa4ecd9SHerbert Xu 
8551aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
8561aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
8571aa4ecd9SHerbert Xu 			if (enc)
8581aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
8591aa4ecd9SHerbert Xu 							  data + k);
8601aa4ecd9SHerbert Xu 			else
8611aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
8621aa4ecd9SHerbert Xu 							  data + k);
8631aa4ecd9SHerbert Xu 		}
8641aa4ecd9SHerbert Xu 
8651aa4ecd9SHerbert Xu 		q = data;
8661aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
8671aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
8681aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
8691aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
8701aa4ecd9SHerbert Xu 			ret = -EINVAL;
8711aa4ecd9SHerbert Xu 			goto out;
8721aa4ecd9SHerbert Xu 		}
8731aa4ecd9SHerbert Xu 	}
8741aa4ecd9SHerbert Xu 
8751aa4ecd9SHerbert Xu 	ret = 0;
8761aa4ecd9SHerbert Xu 
8771aa4ecd9SHerbert Xu out:
878f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
879f8b0d4d0SHerbert Xu out_nobuf:
8801aa4ecd9SHerbert Xu 	return ret;
8811aa4ecd9SHerbert Xu }
8821aa4ecd9SHerbert Xu 
88308d6af8cSJussi Kivilinna static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc,
88408d6af8cSJussi Kivilinna 			   struct cipher_testvec *template, unsigned int tcount,
8853a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
886da7f033dSHerbert Xu {
887da7f033dSHerbert Xu 	const char *algo =
888da7f033dSHerbert Xu 		crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
889da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
890da7f033dSHerbert Xu 	char *q;
891da7f033dSHerbert Xu 	struct ablkcipher_request *req;
892da7f033dSHerbert Xu 	struct scatterlist sg[8];
89308d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
89408d6af8cSJussi Kivilinna 	const char *e, *d;
895da7f033dSHerbert Xu 	struct tcrypt_result result;
896da7f033dSHerbert Xu 	void *data;
897da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
898f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
89908d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
900f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
901f8b0d4d0SHerbert Xu 
902f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
903f8b0d4d0SHerbert Xu 		goto out_nobuf;
904da7f033dSHerbert Xu 
90508d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
90608d6af8cSJussi Kivilinna 		goto out_nooutbuf;
90708d6af8cSJussi Kivilinna 
90808d6af8cSJussi Kivilinna 	if (diff_dst)
90908d6af8cSJussi Kivilinna 		d = "-ddst";
91008d6af8cSJussi Kivilinna 	else
91108d6af8cSJussi Kivilinna 		d = "";
91208d6af8cSJussi Kivilinna 
913da7f033dSHerbert Xu 	if (enc == ENCRYPT)
914da7f033dSHerbert Xu 	        e = "encryption";
915da7f033dSHerbert Xu 	else
916da7f033dSHerbert Xu 		e = "decryption";
917da7f033dSHerbert Xu 
918da7f033dSHerbert Xu 	init_completion(&result.completion);
919da7f033dSHerbert Xu 
920da7f033dSHerbert Xu 	req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
921da7f033dSHerbert Xu 	if (!req) {
92208d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
92308d6af8cSJussi Kivilinna 		       d, algo);
924da7f033dSHerbert Xu 		goto out;
925da7f033dSHerbert Xu 	}
926da7f033dSHerbert Xu 
927da7f033dSHerbert Xu 	ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
928da7f033dSHerbert Xu 					tcrypt_complete, &result);
929da7f033dSHerbert Xu 
930da7f033dSHerbert Xu 	j = 0;
931da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
932da7f033dSHerbert Xu 		if (template[i].iv)
933da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
934da7f033dSHerbert Xu 		else
935da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
936da7f033dSHerbert Xu 
937f44d83d1SJussi Kivilinna 		if (!(template[i].np) || (template[i].also_non_np)) {
938da7f033dSHerbert Xu 			j++;
939da7f033dSHerbert Xu 
940fd57f22aSHerbert Xu 			ret = -EINVAL;
9413a338f20SJussi Kivilinna 			if (WARN_ON(align_offset + template[i].ilen >
9423a338f20SJussi Kivilinna 				    PAGE_SIZE))
943fd57f22aSHerbert Xu 				goto out;
944fd57f22aSHerbert Xu 
945da7f033dSHerbert Xu 			data = xbuf[0];
9463a338f20SJussi Kivilinna 			data += align_offset;
947da7f033dSHerbert Xu 			memcpy(data, template[i].input, template[i].ilen);
948da7f033dSHerbert Xu 
949da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
950da7f033dSHerbert Xu 			if (template[i].wk)
951da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
952da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
953da7f033dSHerbert Xu 
954da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
955da7f033dSHerbert Xu 						       template[i].klen);
956da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
95708d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
95808d6af8cSJussi Kivilinna 				       d, j, algo,
95908d6af8cSJussi Kivilinna 				       crypto_ablkcipher_get_flags(tfm));
960da7f033dSHerbert Xu 				goto out;
961da7f033dSHerbert Xu 			} else if (ret)
962da7f033dSHerbert Xu 				continue;
963da7f033dSHerbert Xu 
964da7f033dSHerbert Xu 			sg_init_one(&sg[0], data, template[i].ilen);
96508d6af8cSJussi Kivilinna 			if (diff_dst) {
96608d6af8cSJussi Kivilinna 				data = xoutbuf[0];
9673a338f20SJussi Kivilinna 				data += align_offset;
96808d6af8cSJussi Kivilinna 				sg_init_one(&sgout[0], data, template[i].ilen);
96908d6af8cSJussi Kivilinna 			}
970da7f033dSHerbert Xu 
97108d6af8cSJussi Kivilinna 			ablkcipher_request_set_crypt(req, sg,
97208d6af8cSJussi Kivilinna 						     (diff_dst) ? sgout : sg,
973da7f033dSHerbert Xu 						     template[i].ilen, iv);
974da7f033dSHerbert Xu 			ret = enc ?
975da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
976da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
977da7f033dSHerbert Xu 
978da7f033dSHerbert Xu 			switch (ret) {
979da7f033dSHerbert Xu 			case 0:
980da7f033dSHerbert Xu 				break;
981da7f033dSHerbert Xu 			case -EINPROGRESS:
982da7f033dSHerbert Xu 			case -EBUSY:
983da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
984da7f033dSHerbert Xu 					&result.completion);
985da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
986da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
987da7f033dSHerbert Xu 					break;
988da7f033dSHerbert Xu 				}
989da7f033dSHerbert Xu 				/* fall through */
990da7f033dSHerbert Xu 			default:
99108d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
99208d6af8cSJussi Kivilinna 				       d, e, j, algo, -ret);
993da7f033dSHerbert Xu 				goto out;
994da7f033dSHerbert Xu 			}
995da7f033dSHerbert Xu 
996da7f033dSHerbert Xu 			q = data;
997da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
99808d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Test %d failed on %s for %s\n",
99908d6af8cSJussi Kivilinna 				       d, j, e, algo);
1000da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
1001da7f033dSHerbert Xu 				ret = -EINVAL;
1002da7f033dSHerbert Xu 				goto out;
1003da7f033dSHerbert Xu 			}
1004da7f033dSHerbert Xu 		}
1005da7f033dSHerbert Xu 	}
1006da7f033dSHerbert Xu 
1007da7f033dSHerbert Xu 	j = 0;
1008da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
10093a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
10103a338f20SJussi Kivilinna 		if (align_offset != 0)
10113a338f20SJussi Kivilinna 			break;
1012da7f033dSHerbert Xu 
1013da7f033dSHerbert Xu 		if (template[i].iv)
1014da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
1015da7f033dSHerbert Xu 		else
1016da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1017da7f033dSHerbert Xu 
1018da7f033dSHerbert Xu 		if (template[i].np) {
1019da7f033dSHerbert Xu 			j++;
1020da7f033dSHerbert Xu 
1021da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
1022da7f033dSHerbert Xu 			if (template[i].wk)
1023da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
1024da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
1025da7f033dSHerbert Xu 
1026da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
1027da7f033dSHerbert Xu 						       template[i].klen);
1028da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
102908d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
103008d6af8cSJussi Kivilinna 				       d, j, algo,
1031da7f033dSHerbert Xu 				       crypto_ablkcipher_get_flags(tfm));
1032da7f033dSHerbert Xu 				goto out;
1033da7f033dSHerbert Xu 			} else if (ret)
1034da7f033dSHerbert Xu 				continue;
1035da7f033dSHerbert Xu 
1036da7f033dSHerbert Xu 			temp = 0;
1037da7f033dSHerbert Xu 			ret = -EINVAL;
1038da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
103908d6af8cSJussi Kivilinna 			if (diff_dst)
104008d6af8cSJussi Kivilinna 				sg_init_table(sgout, template[i].np);
1041da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
1042da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
1043da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
1044da7f033dSHerbert Xu 					goto out;
1045da7f033dSHerbert Xu 
1046da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1047da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1048da7f033dSHerbert Xu 
1049da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
1050da7f033dSHerbert Xu 				       template[i].tap[k]);
1051da7f033dSHerbert Xu 
1052da7f033dSHerbert Xu 				if (offset_in_page(q) + template[i].tap[k] <
1053da7f033dSHerbert Xu 				    PAGE_SIZE)
1054da7f033dSHerbert Xu 					q[template[i].tap[k]] = 0;
1055da7f033dSHerbert Xu 
1056da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
105708d6af8cSJussi Kivilinna 				if (diff_dst) {
105808d6af8cSJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
105908d6af8cSJussi Kivilinna 					    offset_in_page(IDX[k]);
106008d6af8cSJussi Kivilinna 
106108d6af8cSJussi Kivilinna 					sg_set_buf(&sgout[k], q,
106208d6af8cSJussi Kivilinna 						   template[i].tap[k]);
106308d6af8cSJussi Kivilinna 
106408d6af8cSJussi Kivilinna 					memset(q, 0, template[i].tap[k]);
106508d6af8cSJussi Kivilinna 					if (offset_in_page(q) +
106608d6af8cSJussi Kivilinna 					    template[i].tap[k] < PAGE_SIZE)
106708d6af8cSJussi Kivilinna 						q[template[i].tap[k]] = 0;
106808d6af8cSJussi Kivilinna 				}
1069da7f033dSHerbert Xu 
1070da7f033dSHerbert Xu 				temp += template[i].tap[k];
1071da7f033dSHerbert Xu 			}
1072da7f033dSHerbert Xu 
107308d6af8cSJussi Kivilinna 			ablkcipher_request_set_crypt(req, sg,
107408d6af8cSJussi Kivilinna 					(diff_dst) ? sgout : sg,
1075da7f033dSHerbert Xu 					template[i].ilen, iv);
1076da7f033dSHerbert Xu 
1077da7f033dSHerbert Xu 			ret = enc ?
1078da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
1079da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
1080da7f033dSHerbert Xu 
1081da7f033dSHerbert Xu 			switch (ret) {
1082da7f033dSHerbert Xu 			case 0:
1083da7f033dSHerbert Xu 				break;
1084da7f033dSHerbert Xu 			case -EINPROGRESS:
1085da7f033dSHerbert Xu 			case -EBUSY:
1086da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
1087da7f033dSHerbert Xu 					&result.completion);
1088da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
1089da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
1090da7f033dSHerbert Xu 					break;
1091da7f033dSHerbert Xu 				}
1092da7f033dSHerbert Xu 				/* fall through */
1093da7f033dSHerbert Xu 			default:
109408d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
109508d6af8cSJussi Kivilinna 				       d, e, j, algo, -ret);
1096da7f033dSHerbert Xu 				goto out;
1097da7f033dSHerbert Xu 			}
1098da7f033dSHerbert Xu 
1099da7f033dSHerbert Xu 			temp = 0;
1100da7f033dSHerbert Xu 			ret = -EINVAL;
1101da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
110208d6af8cSJussi Kivilinna 				if (diff_dst)
110308d6af8cSJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
110408d6af8cSJussi Kivilinna 					    offset_in_page(IDX[k]);
110508d6af8cSJussi Kivilinna 				else
1106da7f033dSHerbert Xu 					q = xbuf[IDX[k] >> PAGE_SHIFT] +
1107da7f033dSHerbert Xu 					    offset_in_page(IDX[k]);
1108da7f033dSHerbert Xu 
1109da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp,
1110da7f033dSHerbert Xu 					   template[i].tap[k])) {
111108d6af8cSJussi Kivilinna 					pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
111208d6af8cSJussi Kivilinna 					       d, j, e, k, algo);
1113da7f033dSHerbert Xu 					hexdump(q, template[i].tap[k]);
1114da7f033dSHerbert Xu 					goto out;
1115da7f033dSHerbert Xu 				}
1116da7f033dSHerbert Xu 
1117da7f033dSHerbert Xu 				q += template[i].tap[k];
1118da7f033dSHerbert Xu 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
1119da7f033dSHerbert Xu 					;
1120da7f033dSHerbert Xu 				if (n) {
112108d6af8cSJussi Kivilinna 					pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
112208d6af8cSJussi Kivilinna 					       d, j, e, k, algo, n);
1123da7f033dSHerbert Xu 					hexdump(q, n);
1124da7f033dSHerbert Xu 					goto out;
1125da7f033dSHerbert Xu 				}
1126da7f033dSHerbert Xu 				temp += template[i].tap[k];
1127da7f033dSHerbert Xu 			}
1128da7f033dSHerbert Xu 		}
1129da7f033dSHerbert Xu 	}
1130da7f033dSHerbert Xu 
1131da7f033dSHerbert Xu 	ret = 0;
1132da7f033dSHerbert Xu 
1133da7f033dSHerbert Xu out:
1134da7f033dSHerbert Xu 	ablkcipher_request_free(req);
113508d6af8cSJussi Kivilinna 	if (diff_dst)
113608d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
113708d6af8cSJussi Kivilinna out_nooutbuf:
1138f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1139f8b0d4d0SHerbert Xu out_nobuf:
1140da7f033dSHerbert Xu 	return ret;
1141da7f033dSHerbert Xu }
1142da7f033dSHerbert Xu 
114308d6af8cSJussi Kivilinna static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
114408d6af8cSJussi Kivilinna 			 struct cipher_testvec *template, unsigned int tcount)
114508d6af8cSJussi Kivilinna {
11463a338f20SJussi Kivilinna 	unsigned int alignmask;
114708d6af8cSJussi Kivilinna 	int ret;
114808d6af8cSJussi Kivilinna 
114908d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
11503a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
115108d6af8cSJussi Kivilinna 	if (ret)
115208d6af8cSJussi Kivilinna 		return ret;
115308d6af8cSJussi Kivilinna 
115408d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
11553a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
11563a338f20SJussi Kivilinna 	if (ret)
11573a338f20SJussi Kivilinna 		return ret;
11583a338f20SJussi Kivilinna 
11593a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
11603a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
11613a338f20SJussi Kivilinna 	if (ret)
11623a338f20SJussi Kivilinna 		return ret;
11633a338f20SJussi Kivilinna 
11643a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
11653a338f20SJussi Kivilinna 	if (alignmask) {
11663a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
11673a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
11683a338f20SJussi Kivilinna 				      alignmask + 1);
11693a338f20SJussi Kivilinna 		if (ret)
11703a338f20SJussi Kivilinna 			return ret;
11713a338f20SJussi Kivilinna 	}
11723a338f20SJussi Kivilinna 
11733a338f20SJussi Kivilinna 	return 0;
117408d6af8cSJussi Kivilinna }
117508d6af8cSJussi Kivilinna 
1176da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1177da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1178da7f033dSHerbert Xu {
1179da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1180da7f033dSHerbert Xu 	unsigned int i;
1181da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1182da7f033dSHerbert Xu 	int ret;
1183da7f033dSHerbert Xu 
1184da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1185c79cf910SGeert Uytterhoeven 		int ilen;
1186c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1187da7f033dSHerbert Xu 
1188da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1189da7f033dSHerbert Xu 
1190da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1191da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1192da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1193da7f033dSHerbert Xu 		if (ret) {
1194da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1195da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1196da7f033dSHerbert Xu 			       -ret);
1197da7f033dSHerbert Xu 			goto out;
1198da7f033dSHerbert Xu 		}
1199da7f033dSHerbert Xu 
1200b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1201b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1202b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1203b812eb00SGeert Uytterhoeven 			       dlen);
1204b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1205b812eb00SGeert Uytterhoeven 			goto out;
1206b812eb00SGeert Uytterhoeven 		}
1207b812eb00SGeert Uytterhoeven 
1208da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1209da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1210da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1211da7f033dSHerbert Xu 			hexdump(result, dlen);
1212da7f033dSHerbert Xu 			ret = -EINVAL;
1213da7f033dSHerbert Xu 			goto out;
1214da7f033dSHerbert Xu 		}
1215da7f033dSHerbert Xu 	}
1216da7f033dSHerbert Xu 
1217da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1218c79cf910SGeert Uytterhoeven 		int ilen;
1219c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1220da7f033dSHerbert Xu 
1221da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1222da7f033dSHerbert Xu 
1223da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1224da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1225da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1226da7f033dSHerbert Xu 		if (ret) {
1227da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1228da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1229da7f033dSHerbert Xu 			       -ret);
1230da7f033dSHerbert Xu 			goto out;
1231da7f033dSHerbert Xu 		}
1232da7f033dSHerbert Xu 
1233b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1234b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1235b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1236b812eb00SGeert Uytterhoeven 			       dlen);
1237b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1238b812eb00SGeert Uytterhoeven 			goto out;
1239b812eb00SGeert Uytterhoeven 		}
1240b812eb00SGeert Uytterhoeven 
1241da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1242da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1243da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1244da7f033dSHerbert Xu 			hexdump(result, dlen);
1245da7f033dSHerbert Xu 			ret = -EINVAL;
1246da7f033dSHerbert Xu 			goto out;
1247da7f033dSHerbert Xu 		}
1248da7f033dSHerbert Xu 	}
1249da7f033dSHerbert Xu 
1250da7f033dSHerbert Xu 	ret = 0;
1251da7f033dSHerbert Xu 
1252da7f033dSHerbert Xu out:
1253da7f033dSHerbert Xu 	return ret;
1254da7f033dSHerbert Xu }
1255da7f033dSHerbert Xu 
12568064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm,
12578064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *ctemplate,
12588064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *dtemplate, int ctcount,
12598064efb8SGeert Uytterhoeven 		      int dtcount)
12608064efb8SGeert Uytterhoeven {
12618064efb8SGeert Uytterhoeven 	const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
12628064efb8SGeert Uytterhoeven 	unsigned int i;
12638064efb8SGeert Uytterhoeven 	char result[COMP_BUF_SIZE];
12643ce858cbSGeert Uytterhoeven 	int res;
12658064efb8SGeert Uytterhoeven 
12668064efb8SGeert Uytterhoeven 	for (i = 0; i < ctcount; i++) {
12678064efb8SGeert Uytterhoeven 		struct comp_request req;
12683ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
12698064efb8SGeert Uytterhoeven 
12703ce858cbSGeert Uytterhoeven 		res = crypto_compress_setup(tfm, ctemplate[i].params,
12718064efb8SGeert Uytterhoeven 					    ctemplate[i].paramsize);
12723ce858cbSGeert Uytterhoeven 		if (res) {
12738064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression setup failed on test "
12743ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12753ce858cbSGeert Uytterhoeven 			return res;
12768064efb8SGeert Uytterhoeven 		}
12778064efb8SGeert Uytterhoeven 
12783ce858cbSGeert Uytterhoeven 		res = crypto_compress_init(tfm);
12793ce858cbSGeert Uytterhoeven 		if (res) {
12808064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression init failed on test "
12813ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12823ce858cbSGeert Uytterhoeven 			return res;
12838064efb8SGeert Uytterhoeven 		}
12848064efb8SGeert Uytterhoeven 
12858064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
12868064efb8SGeert Uytterhoeven 
12878064efb8SGeert Uytterhoeven 		req.next_in = ctemplate[i].input;
12888064efb8SGeert Uytterhoeven 		req.avail_in = ctemplate[i].inlen / 2;
12898064efb8SGeert Uytterhoeven 		req.next_out = result;
12908064efb8SGeert Uytterhoeven 		req.avail_out = ctemplate[i].outlen / 2;
12918064efb8SGeert Uytterhoeven 
12923ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
12933ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
12948064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
12953ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12963ce858cbSGeert Uytterhoeven 			return res;
12978064efb8SGeert Uytterhoeven 		}
12983ce858cbSGeert Uytterhoeven 		if (res > 0)
12993ce858cbSGeert Uytterhoeven 			produced += res;
13008064efb8SGeert Uytterhoeven 
13018064efb8SGeert Uytterhoeven 		/* Add remaining input data */
13028064efb8SGeert Uytterhoeven 		req.avail_in += (ctemplate[i].inlen + 1) / 2;
13038064efb8SGeert Uytterhoeven 
13043ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13053ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13068064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13073ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13083ce858cbSGeert Uytterhoeven 			return res;
13098064efb8SGeert Uytterhoeven 		}
13103ce858cbSGeert Uytterhoeven 		if (res > 0)
13113ce858cbSGeert Uytterhoeven 			produced += res;
13128064efb8SGeert Uytterhoeven 
13138064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
13148064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
13158064efb8SGeert Uytterhoeven 
13163ce858cbSGeert Uytterhoeven 		res = crypto_compress_final(tfm, &req);
13173ce858cbSGeert Uytterhoeven 		if (res < 0) {
13188064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression final failed on test "
13193ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13203ce858cbSGeert Uytterhoeven 			return res;
13218064efb8SGeert Uytterhoeven 		}
13223ce858cbSGeert Uytterhoeven 		produced += res;
13238064efb8SGeert Uytterhoeven 
13248064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
13258064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13268064efb8SGeert Uytterhoeven 			       "output len = %d (expected %d)\n", i + 1, algo,
13278064efb8SGeert Uytterhoeven 			       COMP_BUF_SIZE - req.avail_out,
13288064efb8SGeert Uytterhoeven 			       ctemplate[i].outlen);
13298064efb8SGeert Uytterhoeven 			return -EINVAL;
13308064efb8SGeert Uytterhoeven 		}
13318064efb8SGeert Uytterhoeven 
13323ce858cbSGeert Uytterhoeven 		if (produced != ctemplate[i].outlen) {
13333ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13343ce858cbSGeert Uytterhoeven 			       "returned len = %u (expected %d)\n", i + 1,
13353ce858cbSGeert Uytterhoeven 			       algo, produced, ctemplate[i].outlen);
13363ce858cbSGeert Uytterhoeven 			return -EINVAL;
13373ce858cbSGeert Uytterhoeven 		}
13383ce858cbSGeert Uytterhoeven 
13398064efb8SGeert Uytterhoeven 		if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
13408064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Compression test %d failed for "
13418064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
13428064efb8SGeert Uytterhoeven 			hexdump(result, ctemplate[i].outlen);
13438064efb8SGeert Uytterhoeven 			return -EINVAL;
13448064efb8SGeert Uytterhoeven 		}
13458064efb8SGeert Uytterhoeven 	}
13468064efb8SGeert Uytterhoeven 
13478064efb8SGeert Uytterhoeven 	for (i = 0; i < dtcount; i++) {
13488064efb8SGeert Uytterhoeven 		struct comp_request req;
13493ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
13508064efb8SGeert Uytterhoeven 
13513ce858cbSGeert Uytterhoeven 		res = crypto_decompress_setup(tfm, dtemplate[i].params,
13528064efb8SGeert Uytterhoeven 					      dtemplate[i].paramsize);
13533ce858cbSGeert Uytterhoeven 		if (res) {
13548064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression setup failed on "
13553ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13563ce858cbSGeert Uytterhoeven 			return res;
13578064efb8SGeert Uytterhoeven 		}
13588064efb8SGeert Uytterhoeven 
13593ce858cbSGeert Uytterhoeven 		res = crypto_decompress_init(tfm);
13603ce858cbSGeert Uytterhoeven 		if (res) {
13618064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression init failed on test "
13623ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13633ce858cbSGeert Uytterhoeven 			return res;
13648064efb8SGeert Uytterhoeven 		}
13658064efb8SGeert Uytterhoeven 
13668064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
13678064efb8SGeert Uytterhoeven 
13688064efb8SGeert Uytterhoeven 		req.next_in = dtemplate[i].input;
13698064efb8SGeert Uytterhoeven 		req.avail_in = dtemplate[i].inlen / 2;
13708064efb8SGeert Uytterhoeven 		req.next_out = result;
13718064efb8SGeert Uytterhoeven 		req.avail_out = dtemplate[i].outlen / 2;
13728064efb8SGeert Uytterhoeven 
13733ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
13743ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13758064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
13763ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13773ce858cbSGeert Uytterhoeven 			return res;
13788064efb8SGeert Uytterhoeven 		}
13793ce858cbSGeert Uytterhoeven 		if (res > 0)
13803ce858cbSGeert Uytterhoeven 			produced += res;
13818064efb8SGeert Uytterhoeven 
13828064efb8SGeert Uytterhoeven 		/* Add remaining input data */
13838064efb8SGeert Uytterhoeven 		req.avail_in += (dtemplate[i].inlen + 1) / 2;
13848064efb8SGeert Uytterhoeven 
13853ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
13863ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13878064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
13883ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13893ce858cbSGeert Uytterhoeven 			return res;
13908064efb8SGeert Uytterhoeven 		}
13913ce858cbSGeert Uytterhoeven 		if (res > 0)
13923ce858cbSGeert Uytterhoeven 			produced += res;
13938064efb8SGeert Uytterhoeven 
13948064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
13958064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
13968064efb8SGeert Uytterhoeven 
13973ce858cbSGeert Uytterhoeven 		res = crypto_decompress_final(tfm, &req);
13983ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13998064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression final failed on "
14003ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14013ce858cbSGeert Uytterhoeven 			return res;
14028064efb8SGeert Uytterhoeven 		}
14033ce858cbSGeert Uytterhoeven 		if (res > 0)
14043ce858cbSGeert Uytterhoeven 			produced += res;
14058064efb8SGeert Uytterhoeven 
14068064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
14078064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14088064efb8SGeert Uytterhoeven 			       "%s: output len = %d (expected %d)\n", i + 1,
14098064efb8SGeert Uytterhoeven 			       algo, COMP_BUF_SIZE - req.avail_out,
14108064efb8SGeert Uytterhoeven 			       dtemplate[i].outlen);
14118064efb8SGeert Uytterhoeven 			return -EINVAL;
14128064efb8SGeert Uytterhoeven 		}
14138064efb8SGeert Uytterhoeven 
14143ce858cbSGeert Uytterhoeven 		if (produced != dtemplate[i].outlen) {
14153ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14163ce858cbSGeert Uytterhoeven 			       "%s: returned len = %u (expected %d)\n", i + 1,
14173ce858cbSGeert Uytterhoeven 			       algo, produced, dtemplate[i].outlen);
14183ce858cbSGeert Uytterhoeven 			return -EINVAL;
14193ce858cbSGeert Uytterhoeven 		}
14203ce858cbSGeert Uytterhoeven 
14218064efb8SGeert Uytterhoeven 		if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
14228064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Decompression test %d failed for "
14238064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
14248064efb8SGeert Uytterhoeven 			hexdump(result, dtemplate[i].outlen);
14258064efb8SGeert Uytterhoeven 			return -EINVAL;
14268064efb8SGeert Uytterhoeven 		}
14278064efb8SGeert Uytterhoeven 	}
14288064efb8SGeert Uytterhoeven 
14298064efb8SGeert Uytterhoeven 	return 0;
14308064efb8SGeert Uytterhoeven }
14318064efb8SGeert Uytterhoeven 
14327647d6ceSJarod Wilson 
14337647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
14347647d6ceSJarod Wilson 		      unsigned int tcount)
14357647d6ceSJarod Wilson {
14367647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1437fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
14387647d6ceSJarod Wilson 	u8 *seed;
14397647d6ceSJarod Wilson 	char result[32];
14407647d6ceSJarod Wilson 
14417647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
14427647d6ceSJarod Wilson 
14437647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
14447647d6ceSJarod Wilson 	if (!seed) {
14457647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
14467647d6ceSJarod Wilson 		       "for %s\n", algo);
14477647d6ceSJarod Wilson 		return -ENOMEM;
14487647d6ceSJarod Wilson 	}
14497647d6ceSJarod Wilson 
14507647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
14517647d6ceSJarod Wilson 		memset(result, 0, 32);
14527647d6ceSJarod Wilson 
14537647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
14547647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
14557647d6ceSJarod Wilson 		       template[i].klen);
14567647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
14577647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
14587647d6ceSJarod Wilson 
14597647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
14607647d6ceSJarod Wilson 		if (err) {
14617647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
14627647d6ceSJarod Wilson 			       "for %s\n", algo);
14637647d6ceSJarod Wilson 			goto out;
14647647d6ceSJarod Wilson 		}
14657647d6ceSJarod Wilson 
14667647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
14677647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
14687647d6ceSJarod Wilson 						   template[i].rlen);
14697647d6ceSJarod Wilson 			if (err != template[i].rlen) {
14707647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
14717647d6ceSJarod Wilson 				       "the correct amount of random data for "
14727647d6ceSJarod Wilson 				       "%s (requested %d, got %d)\n", algo,
14737647d6ceSJarod Wilson 				       template[i].rlen, err);
14747647d6ceSJarod Wilson 				goto out;
14757647d6ceSJarod Wilson 			}
14767647d6ceSJarod Wilson 		}
14777647d6ceSJarod Wilson 
14787647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
14797647d6ceSJarod Wilson 			     template[i].rlen);
14807647d6ceSJarod Wilson 		if (err) {
14817647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
14827647d6ceSJarod Wilson 			       i, algo);
14837647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
14847647d6ceSJarod Wilson 			err = -EINVAL;
14857647d6ceSJarod Wilson 			goto out;
14867647d6ceSJarod Wilson 		}
14877647d6ceSJarod Wilson 	}
14887647d6ceSJarod Wilson 
14897647d6ceSJarod Wilson out:
14907647d6ceSJarod Wilson 	kfree(seed);
14917647d6ceSJarod Wilson 	return err;
14927647d6ceSJarod Wilson }
14937647d6ceSJarod Wilson 
1494da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1495da7f033dSHerbert Xu 			 u32 type, u32 mask)
1496da7f033dSHerbert Xu {
1497da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1498da7f033dSHerbert Xu 	int err = 0;
1499da7f033dSHerbert Xu 
1500da7f033dSHerbert Xu 	tfm = crypto_alloc_aead(driver, type, mask);
1501da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1502da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1503da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1504da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1505da7f033dSHerbert Xu 	}
1506da7f033dSHerbert Xu 
1507da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1508da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1509da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1510da7f033dSHerbert Xu 		if (err)
1511da7f033dSHerbert Xu 			goto out;
1512da7f033dSHerbert Xu 	}
1513da7f033dSHerbert Xu 
1514da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1515da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1516da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1517da7f033dSHerbert Xu 
1518da7f033dSHerbert Xu out:
1519da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1520da7f033dSHerbert Xu 	return err;
1521da7f033dSHerbert Xu }
1522da7f033dSHerbert Xu 
1523da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1524da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1525da7f033dSHerbert Xu {
15261aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1527da7f033dSHerbert Xu 	int err = 0;
1528da7f033dSHerbert Xu 
15291aa4ecd9SHerbert Xu 	tfm = crypto_alloc_cipher(driver, type, mask);
1530da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1531da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1532da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1533da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1534da7f033dSHerbert Xu 	}
1535da7f033dSHerbert Xu 
1536da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1537da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1538da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1539da7f033dSHerbert Xu 		if (err)
1540da7f033dSHerbert Xu 			goto out;
1541da7f033dSHerbert Xu 	}
1542da7f033dSHerbert Xu 
1543da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1544da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1545da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1546da7f033dSHerbert Xu 
1547da7f033dSHerbert Xu out:
15481aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
15491aa4ecd9SHerbert Xu 	return err;
15501aa4ecd9SHerbert Xu }
15511aa4ecd9SHerbert Xu 
15521aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
15531aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
15541aa4ecd9SHerbert Xu {
15551aa4ecd9SHerbert Xu 	struct crypto_ablkcipher *tfm;
15561aa4ecd9SHerbert Xu 	int err = 0;
15571aa4ecd9SHerbert Xu 
15581aa4ecd9SHerbert Xu 	tfm = crypto_alloc_ablkcipher(driver, type, mask);
15591aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
15601aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
15611aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
15621aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
15631aa4ecd9SHerbert Xu 	}
15641aa4ecd9SHerbert Xu 
15651aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
15661aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
15671aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
15681aa4ecd9SHerbert Xu 		if (err)
15691aa4ecd9SHerbert Xu 			goto out;
15701aa4ecd9SHerbert Xu 	}
15711aa4ecd9SHerbert Xu 
15721aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
15731aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
15741aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
15751aa4ecd9SHerbert Xu 
15761aa4ecd9SHerbert Xu out:
1577da7f033dSHerbert Xu 	crypto_free_ablkcipher(tfm);
1578da7f033dSHerbert Xu 	return err;
1579da7f033dSHerbert Xu }
1580da7f033dSHerbert Xu 
1581da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1582da7f033dSHerbert Xu 			 u32 type, u32 mask)
1583da7f033dSHerbert Xu {
1584da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1585da7f033dSHerbert Xu 	int err;
1586da7f033dSHerbert Xu 
1587da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1588da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1589da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1590da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1591da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1592da7f033dSHerbert Xu 	}
1593da7f033dSHerbert Xu 
1594da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1595da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1596da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1597da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1598da7f033dSHerbert Xu 
1599da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1600da7f033dSHerbert Xu 	return err;
1601da7f033dSHerbert Xu }
1602da7f033dSHerbert Xu 
16038064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
16048064efb8SGeert Uytterhoeven 			  u32 type, u32 mask)
16058064efb8SGeert Uytterhoeven {
16068064efb8SGeert Uytterhoeven 	struct crypto_pcomp *tfm;
16078064efb8SGeert Uytterhoeven 	int err;
16088064efb8SGeert Uytterhoeven 
16098064efb8SGeert Uytterhoeven 	tfm = crypto_alloc_pcomp(driver, type, mask);
16108064efb8SGeert Uytterhoeven 	if (IS_ERR(tfm)) {
16118064efb8SGeert Uytterhoeven 		pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
16128064efb8SGeert Uytterhoeven 		       driver, PTR_ERR(tfm));
16138064efb8SGeert Uytterhoeven 		return PTR_ERR(tfm);
16148064efb8SGeert Uytterhoeven 	}
16158064efb8SGeert Uytterhoeven 
16168064efb8SGeert Uytterhoeven 	err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
16178064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.vecs,
16188064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.comp.count,
16198064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.count);
16208064efb8SGeert Uytterhoeven 
16218064efb8SGeert Uytterhoeven 	crypto_free_pcomp(tfm);
16228064efb8SGeert Uytterhoeven 	return err;
16238064efb8SGeert Uytterhoeven }
16248064efb8SGeert Uytterhoeven 
1625da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1626da7f033dSHerbert Xu 			 u32 type, u32 mask)
1627da7f033dSHerbert Xu {
1628da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1629da7f033dSHerbert Xu 	int err;
1630da7f033dSHerbert Xu 
1631da7f033dSHerbert Xu 	tfm = crypto_alloc_ahash(driver, type, mask);
1632da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1633da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1634da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1635da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1636da7f033dSHerbert Xu 	}
1637da7f033dSHerbert Xu 
1638a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1639a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1640a8f1a052SDavid S. Miller 	if (!err)
1641a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1642a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1643da7f033dSHerbert Xu 
1644da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1645da7f033dSHerbert Xu 	return err;
1646da7f033dSHerbert Xu }
1647da7f033dSHerbert Xu 
16488e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
16498e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
16508e3ee85eSHerbert Xu {
16518e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
16528e3ee85eSHerbert Xu 	u32 val;
16538e3ee85eSHerbert Xu 	int err;
16548e3ee85eSHerbert Xu 
16558e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
16568e3ee85eSHerbert Xu 	if (err)
16578e3ee85eSHerbert Xu 		goto out;
16588e3ee85eSHerbert Xu 
16598e3ee85eSHerbert Xu 	tfm = crypto_alloc_shash(driver, type, mask);
16608e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
16618e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
16628e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
16638e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
16648e3ee85eSHerbert Xu 		goto out;
16658e3ee85eSHerbert Xu 	}
16668e3ee85eSHerbert Xu 
16678e3ee85eSHerbert Xu 	do {
16688e3ee85eSHerbert Xu 		struct {
16698e3ee85eSHerbert Xu 			struct shash_desc shash;
16708e3ee85eSHerbert Xu 			char ctx[crypto_shash_descsize(tfm)];
16718e3ee85eSHerbert Xu 		} sdesc;
16728e3ee85eSHerbert Xu 
16738e3ee85eSHerbert Xu 		sdesc.shash.tfm = tfm;
16748e3ee85eSHerbert Xu 		sdesc.shash.flags = 0;
16758e3ee85eSHerbert Xu 
16768e3ee85eSHerbert Xu 		*(u32 *)sdesc.ctx = le32_to_cpu(420553207);
16778e3ee85eSHerbert Xu 		err = crypto_shash_final(&sdesc.shash, (u8 *)&val);
16788e3ee85eSHerbert Xu 		if (err) {
16798e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
16808e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
16818e3ee85eSHerbert Xu 			break;
16828e3ee85eSHerbert Xu 		}
16838e3ee85eSHerbert Xu 
16848e3ee85eSHerbert Xu 		if (val != ~420553207) {
16858e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
16868e3ee85eSHerbert Xu 			       "%d\n", driver, val);
16878e3ee85eSHerbert Xu 			err = -EINVAL;
16888e3ee85eSHerbert Xu 		}
16898e3ee85eSHerbert Xu 	} while (0);
16908e3ee85eSHerbert Xu 
16918e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
16928e3ee85eSHerbert Xu 
16938e3ee85eSHerbert Xu out:
16948e3ee85eSHerbert Xu 	return err;
16958e3ee85eSHerbert Xu }
16968e3ee85eSHerbert Xu 
16977647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
16987647d6ceSJarod Wilson 			  u32 type, u32 mask)
16997647d6ceSJarod Wilson {
17007647d6ceSJarod Wilson 	struct crypto_rng *rng;
17017647d6ceSJarod Wilson 	int err;
17027647d6ceSJarod Wilson 
17037647d6ceSJarod Wilson 	rng = crypto_alloc_rng(driver, type, mask);
17047647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
17057647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
17067647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
17077647d6ceSJarod Wilson 		return PTR_ERR(rng);
17087647d6ceSJarod Wilson 	}
17097647d6ceSJarod Wilson 
17107647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
17117647d6ceSJarod Wilson 
17127647d6ceSJarod Wilson 	crypto_free_rng(rng);
17137647d6ceSJarod Wilson 
17147647d6ceSJarod Wilson 	return err;
17157647d6ceSJarod Wilson }
17167647d6ceSJarod Wilson 
1717863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1718863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1719863b557aSYouquan, Song {
1720863b557aSYouquan, Song 	return 0;
1721863b557aSYouquan, Song }
1722863b557aSYouquan, Song 
1723da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1724da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1725da7f033dSHerbert Xu 	{
17264d6d6a2cSJohannes Goetzfried 		.alg = "__cbc-cast5-avx",
17274d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
17284d6d6a2cSJohannes Goetzfried 	}, {
17294ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
17304ea1277dSJohannes Goetzfried 		.test = alg_test_null,
17314ea1277dSJohannes Goetzfried 	}, {
17327efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
17337efe4076SJohannes Goetzfried 		.test = alg_test_null,
17347efe4076SJohannes Goetzfried 	}, {
173556d76c96SJussi Kivilinna 		.alg = "__cbc-serpent-avx2",
173656d76c96SJussi Kivilinna 		.test = alg_test_null,
173756d76c96SJussi Kivilinna 	}, {
1738937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
1739937c30d7SJussi Kivilinna 		.test = alg_test_null,
1740937c30d7SJussi Kivilinna 	}, {
1741107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
1742107778b5SJohannes Goetzfried 		.test = alg_test_null,
1743107778b5SJohannes Goetzfried 	}, {
1744863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
1745863b557aSYouquan, Song 		.test = alg_test_null,
17466c79294fSMilan Broz 		.fips_allowed = 1,
1747863b557aSYouquan, Song 	}, {
1748d9b1d2e7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni",
1749d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1750d9b1d2e7SJussi Kivilinna 	}, {
1751f3f935a7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni-avx2",
1752f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1753f3f935a7SJussi Kivilinna 	}, {
17544d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
17554d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
17564d6d6a2cSJohannes Goetzfried 	}, {
17574ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
17584ea1277dSJohannes Goetzfried 		.test = alg_test_null,
17594ea1277dSJohannes Goetzfried 	}, {
17607efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
17617efe4076SJohannes Goetzfried 		.test = alg_test_null,
17627efe4076SJohannes Goetzfried 	}, {
176356d76c96SJussi Kivilinna 		.alg = "__driver-cbc-serpent-avx2",
176456d76c96SJussi Kivilinna 		.test = alg_test_null,
176556d76c96SJussi Kivilinna 	}, {
1766937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
1767937c30d7SJussi Kivilinna 		.test = alg_test_null,
1768937c30d7SJussi Kivilinna 	}, {
1769107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
1770107778b5SJohannes Goetzfried 		.test = alg_test_null,
1771107778b5SJohannes Goetzfried 	}, {
1772863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
1773863b557aSYouquan, Song 		.test = alg_test_null,
17746c79294fSMilan Broz 		.fips_allowed = 1,
1775863b557aSYouquan, Song 	}, {
1776d9b1d2e7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni",
1777d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1778d9b1d2e7SJussi Kivilinna 	}, {
1779f3f935a7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni-avx2",
1780f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1781f3f935a7SJussi Kivilinna 	}, {
17824d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
17834d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
17844d6d6a2cSJohannes Goetzfried 	}, {
17854ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
17864ea1277dSJohannes Goetzfried 		.test = alg_test_null,
17874ea1277dSJohannes Goetzfried 	}, {
17887efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
17897efe4076SJohannes Goetzfried 		.test = alg_test_null,
17907efe4076SJohannes Goetzfried 	}, {
179156d76c96SJussi Kivilinna 		.alg = "__driver-ecb-serpent-avx2",
179256d76c96SJussi Kivilinna 		.test = alg_test_null,
179356d76c96SJussi Kivilinna 	}, {
1794937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
1795937c30d7SJussi Kivilinna 		.test = alg_test_null,
1796937c30d7SJussi Kivilinna 	}, {
1797107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
1798107778b5SJohannes Goetzfried 		.test = alg_test_null,
1799107778b5SJohannes Goetzfried 	}, {
1800863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
1801863b557aSYouquan, Song 		.test = alg_test_null,
18026c79294fSMilan Broz 		.fips_allowed = 1,
1803863b557aSYouquan, Song 	}, {
1804e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
1805e08ca2daSJarod Wilson 		.test = alg_test_cprng,
1806a1915d51SJarod Wilson 		.fips_allowed = 1,
1807e08ca2daSJarod Wilson 		.suite = {
1808e08ca2daSJarod Wilson 			.cprng = {
1809e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
1810e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
1811e08ca2daSJarod Wilson 			}
1812e08ca2daSJarod Wilson 		}
1813e08ca2daSJarod Wilson 	}, {
1814e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha1),cbc(aes))",
1815e46e9a46SHoria Geanta 		.test = alg_test_aead,
1816e46e9a46SHoria Geanta 		.fips_allowed = 1,
1817e46e9a46SHoria Geanta 		.suite = {
1818e46e9a46SHoria Geanta 			.aead = {
1819e46e9a46SHoria Geanta 				.enc = {
1820e46e9a46SHoria Geanta 					.vecs = hmac_sha1_aes_cbc_enc_tv_template,
1821e46e9a46SHoria Geanta 					.count = HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS
1822e46e9a46SHoria Geanta 				}
1823e46e9a46SHoria Geanta 			}
1824e46e9a46SHoria Geanta 		}
1825e46e9a46SHoria Geanta 	}, {
1826e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha256),cbc(aes))",
1827e46e9a46SHoria Geanta 		.test = alg_test_aead,
1828e46e9a46SHoria Geanta 		.fips_allowed = 1,
1829e46e9a46SHoria Geanta 		.suite = {
1830e46e9a46SHoria Geanta 			.aead = {
1831e46e9a46SHoria Geanta 				.enc = {
1832e46e9a46SHoria Geanta 					.vecs = hmac_sha256_aes_cbc_enc_tv_template,
1833e46e9a46SHoria Geanta 					.count = HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS
1834e46e9a46SHoria Geanta 				}
1835e46e9a46SHoria Geanta 			}
1836e46e9a46SHoria Geanta 		}
1837e46e9a46SHoria Geanta 	}, {
1838e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha512),cbc(aes))",
1839e46e9a46SHoria Geanta 		.test = alg_test_aead,
1840e46e9a46SHoria Geanta 		.fips_allowed = 1,
1841e46e9a46SHoria Geanta 		.suite = {
1842e46e9a46SHoria Geanta 			.aead = {
1843e46e9a46SHoria Geanta 				.enc = {
1844e46e9a46SHoria Geanta 					.vecs = hmac_sha512_aes_cbc_enc_tv_template,
1845e46e9a46SHoria Geanta 					.count = HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS
1846e46e9a46SHoria Geanta 				}
1847e46e9a46SHoria Geanta 			}
1848e46e9a46SHoria Geanta 		}
1849e46e9a46SHoria Geanta 	}, {
1850da7f033dSHerbert Xu 		.alg = "cbc(aes)",
18511aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1852a1915d51SJarod Wilson 		.fips_allowed = 1,
1853da7f033dSHerbert Xu 		.suite = {
1854da7f033dSHerbert Xu 			.cipher = {
1855da7f033dSHerbert Xu 				.enc = {
1856da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
1857da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
1858da7f033dSHerbert Xu 				},
1859da7f033dSHerbert Xu 				.dec = {
1860da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
1861da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
1862da7f033dSHerbert Xu 				}
1863da7f033dSHerbert Xu 			}
1864da7f033dSHerbert Xu 		}
1865da7f033dSHerbert Xu 	}, {
1866da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
18671aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1868da7f033dSHerbert Xu 		.suite = {
1869da7f033dSHerbert Xu 			.cipher = {
1870da7f033dSHerbert Xu 				.enc = {
1871da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
1872da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
1873da7f033dSHerbert Xu 				},
1874da7f033dSHerbert Xu 				.dec = {
1875da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
1876da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
1877da7f033dSHerbert Xu 				}
1878da7f033dSHerbert Xu 			}
1879da7f033dSHerbert Xu 		}
1880da7f033dSHerbert Xu 	}, {
1881da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
18821aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1883da7f033dSHerbert Xu 		.suite = {
1884da7f033dSHerbert Xu 			.cipher = {
1885da7f033dSHerbert Xu 				.enc = {
1886da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
1887da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
1888da7f033dSHerbert Xu 				},
1889da7f033dSHerbert Xu 				.dec = {
1890da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
1891da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
1892da7f033dSHerbert Xu 				}
1893da7f033dSHerbert Xu 			}
1894da7f033dSHerbert Xu 		}
1895da7f033dSHerbert Xu 	}, {
1896da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
18971aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1898da7f033dSHerbert Xu 		.suite = {
1899da7f033dSHerbert Xu 			.cipher = {
1900da7f033dSHerbert Xu 				.enc = {
1901da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
1902da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
1903da7f033dSHerbert Xu 				},
1904da7f033dSHerbert Xu 				.dec = {
1905da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
1906da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
1907da7f033dSHerbert Xu 				}
1908da7f033dSHerbert Xu 			}
1909da7f033dSHerbert Xu 		}
1910da7f033dSHerbert Xu 	}, {
1911a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
1912a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
1913a2c58260SJohannes Goetzfried 		.suite = {
1914a2c58260SJohannes Goetzfried 			.cipher = {
1915a2c58260SJohannes Goetzfried 				.enc = {
1916a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
1917a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
1918a2c58260SJohannes Goetzfried 				},
1919a2c58260SJohannes Goetzfried 				.dec = {
1920a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
1921a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
1922a2c58260SJohannes Goetzfried 				}
1923a2c58260SJohannes Goetzfried 			}
1924a2c58260SJohannes Goetzfried 		}
1925a2c58260SJohannes Goetzfried 	}, {
19269b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
19279b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
19289b8b0405SJohannes Goetzfried 		.suite = {
19299b8b0405SJohannes Goetzfried 			.cipher = {
19309b8b0405SJohannes Goetzfried 				.enc = {
19319b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
19329b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
19339b8b0405SJohannes Goetzfried 				},
19349b8b0405SJohannes Goetzfried 				.dec = {
19359b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
19369b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
19379b8b0405SJohannes Goetzfried 				}
19389b8b0405SJohannes Goetzfried 			}
19399b8b0405SJohannes Goetzfried 		}
19409b8b0405SJohannes Goetzfried 	}, {
1941da7f033dSHerbert Xu 		.alg = "cbc(des)",
19421aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1943da7f033dSHerbert Xu 		.suite = {
1944da7f033dSHerbert Xu 			.cipher = {
1945da7f033dSHerbert Xu 				.enc = {
1946da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
1947da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
1948da7f033dSHerbert Xu 				},
1949da7f033dSHerbert Xu 				.dec = {
1950da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
1951da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
1952da7f033dSHerbert Xu 				}
1953da7f033dSHerbert Xu 			}
1954da7f033dSHerbert Xu 		}
1955da7f033dSHerbert Xu 	}, {
1956da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
19571aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1958a1915d51SJarod Wilson 		.fips_allowed = 1,
1959da7f033dSHerbert Xu 		.suite = {
1960da7f033dSHerbert Xu 			.cipher = {
1961da7f033dSHerbert Xu 				.enc = {
1962da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
1963da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
1964da7f033dSHerbert Xu 				},
1965da7f033dSHerbert Xu 				.dec = {
1966da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
1967da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
1968da7f033dSHerbert Xu 				}
1969da7f033dSHerbert Xu 			}
1970da7f033dSHerbert Xu 		}
1971da7f033dSHerbert Xu 	}, {
19729d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
19739d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
19749d25917dSJussi Kivilinna 		.suite = {
19759d25917dSJussi Kivilinna 			.cipher = {
19769d25917dSJussi Kivilinna 				.enc = {
19779d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
19789d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
19799d25917dSJussi Kivilinna 				},
19809d25917dSJussi Kivilinna 				.dec = {
19819d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
19829d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
19839d25917dSJussi Kivilinna 				}
19849d25917dSJussi Kivilinna 			}
19859d25917dSJussi Kivilinna 		}
19869d25917dSJussi Kivilinna 	}, {
1987da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
19881aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1989da7f033dSHerbert Xu 		.suite = {
1990da7f033dSHerbert Xu 			.cipher = {
1991da7f033dSHerbert Xu 				.enc = {
1992da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
1993da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
1994da7f033dSHerbert Xu 				},
1995da7f033dSHerbert Xu 				.dec = {
1996da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
1997da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
1998da7f033dSHerbert Xu 				}
1999da7f033dSHerbert Xu 			}
2000da7f033dSHerbert Xu 		}
2001da7f033dSHerbert Xu 	}, {
2002da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2003da7f033dSHerbert Xu 		.test = alg_test_aead,
2004a1915d51SJarod Wilson 		.fips_allowed = 1,
2005da7f033dSHerbert Xu 		.suite = {
2006da7f033dSHerbert Xu 			.aead = {
2007da7f033dSHerbert Xu 				.enc = {
2008da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
2009da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
2010da7f033dSHerbert Xu 				},
2011da7f033dSHerbert Xu 				.dec = {
2012da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
2013da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
2014da7f033dSHerbert Xu 				}
2015da7f033dSHerbert Xu 			}
2016da7f033dSHerbert Xu 		}
2017da7f033dSHerbert Xu 	}, {
201893b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
201993b5e86aSJussi Kivilinna 		.test = alg_test_hash,
202093b5e86aSJussi Kivilinna 		.suite = {
202193b5e86aSJussi Kivilinna 			.hash = {
202293b5e86aSJussi Kivilinna 				.vecs = aes_cmac128_tv_template,
202393b5e86aSJussi Kivilinna 				.count = CMAC_AES_TEST_VECTORS
202493b5e86aSJussi Kivilinna 			}
202593b5e86aSJussi Kivilinna 		}
202693b5e86aSJussi Kivilinna 	}, {
202793b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
202893b5e86aSJussi Kivilinna 		.test = alg_test_hash,
202993b5e86aSJussi Kivilinna 		.suite = {
203093b5e86aSJussi Kivilinna 			.hash = {
203193b5e86aSJussi Kivilinna 				.vecs = des3_ede_cmac64_tv_template,
203293b5e86aSJussi Kivilinna 				.count = CMAC_DES3_EDE_TEST_VECTORS
203393b5e86aSJussi Kivilinna 			}
203493b5e86aSJussi Kivilinna 		}
203593b5e86aSJussi Kivilinna 	}, {
2036e448370dSJussi Kivilinna 		.alg = "compress_null",
2037e448370dSJussi Kivilinna 		.test = alg_test_null,
2038e448370dSJussi Kivilinna 	}, {
2039da7f033dSHerbert Xu 		.alg = "crc32c",
20408e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2041a1915d51SJarod Wilson 		.fips_allowed = 1,
2042da7f033dSHerbert Xu 		.suite = {
2043da7f033dSHerbert Xu 			.hash = {
2044da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
2045da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
2046da7f033dSHerbert Xu 			}
2047da7f033dSHerbert Xu 		}
2048da7f033dSHerbert Xu 	}, {
204939761214STim Chen 		.alg = "crct10dif",
205039761214STim Chen 		.test = alg_test_hash,
205139761214STim Chen 		.fips_allowed = 1,
205239761214STim Chen 		.suite = {
205339761214STim Chen 			.hash = {
205439761214STim Chen 				.vecs = crct10dif_tv_template,
205539761214STim Chen 				.count = CRCT10DIF_TEST_VECTORS
205639761214STim Chen 			}
205739761214STim Chen 		}
205839761214STim Chen 	}, {
20596c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
20606c79294fSMilan Broz 		.test = alg_test_null,
20616c79294fSMilan Broz 		.fips_allowed = 1,
20626c79294fSMilan Broz 	}, {
2063d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni)",
2064d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2065d9b1d2e7SJussi Kivilinna 	}, {
2066f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2067f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2068f3f935a7SJussi Kivilinna 	}, {
206956d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-serpent-avx2)",
207056d76c96SJussi Kivilinna 		.test = alg_test_null,
207156d76c96SJussi Kivilinna 	}, {
2072863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
2073863b557aSYouquan, Song 		.test = alg_test_null,
20746c79294fSMilan Broz 		.fips_allowed = 1,
2075863b557aSYouquan, Song 	}, {
2076d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni)",
2077d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2078d9b1d2e7SJussi Kivilinna 	}, {
2079f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2080f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2081f3f935a7SJussi Kivilinna 	}, {
20824d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
20834d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
20844d6d6a2cSJohannes Goetzfried 	}, {
20854ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
20864ea1277dSJohannes Goetzfried 		.test = alg_test_null,
20874ea1277dSJohannes Goetzfried 	}, {
20887efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
20897efe4076SJohannes Goetzfried 		.test = alg_test_null,
20907efe4076SJohannes Goetzfried 	}, {
209156d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-avx2)",
209256d76c96SJussi Kivilinna 		.test = alg_test_null,
209356d76c96SJussi Kivilinna 	}, {
2094937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
2095937c30d7SJussi Kivilinna 		.test = alg_test_null,
2096937c30d7SJussi Kivilinna 	}, {
2097107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
2098107778b5SJohannes Goetzfried 		.test = alg_test_null,
2099107778b5SJohannes Goetzfried 	}, {
21006c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
21016c79294fSMilan Broz 		.test = alg_test_null,
21026c79294fSMilan Broz 		.fips_allowed = 1,
21036c79294fSMilan Broz 	}, {
2104863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2105863b557aSYouquan, Song 		.test = alg_test_null,
21066c79294fSMilan Broz 		.fips_allowed = 1,
2107863b557aSYouquan, Song 	}, {
2108f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2109f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2110a1915d51SJarod Wilson 		.fips_allowed = 1,
2111f7cb80f2SJarod Wilson 		.suite = {
2112f7cb80f2SJarod Wilson 			.cipher = {
2113f7cb80f2SJarod Wilson 				.enc = {
2114f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2115f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2116f7cb80f2SJarod Wilson 				},
2117f7cb80f2SJarod Wilson 				.dec = {
2118f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2119f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2120f7cb80f2SJarod Wilson 				}
2121f7cb80f2SJarod Wilson 			}
2122f7cb80f2SJarod Wilson 		}
2123f7cb80f2SJarod Wilson 	}, {
212485b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
212585b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
212685b63e34SJussi Kivilinna 		.suite = {
212785b63e34SJussi Kivilinna 			.cipher = {
212885b63e34SJussi Kivilinna 				.enc = {
212985b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
213085b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
213185b63e34SJussi Kivilinna 				},
213285b63e34SJussi Kivilinna 				.dec = {
213385b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
213485b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
213585b63e34SJussi Kivilinna 				}
213685b63e34SJussi Kivilinna 			}
213785b63e34SJussi Kivilinna 		}
213885b63e34SJussi Kivilinna 	}, {
21390840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
21400840605eSJussi Kivilinna 		.test = alg_test_skcipher,
21410840605eSJussi Kivilinna 		.suite = {
21420840605eSJussi Kivilinna 			.cipher = {
21430840605eSJussi Kivilinna 				.enc = {
21440840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
21450840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
21460840605eSJussi Kivilinna 				},
21470840605eSJussi Kivilinna 				.dec = {
21480840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
21490840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
21500840605eSJussi Kivilinna 				}
21510840605eSJussi Kivilinna 			}
21520840605eSJussi Kivilinna 		}
21530840605eSJussi Kivilinna 	}, {
2154a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2155a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2156a2c58260SJohannes Goetzfried 		.suite = {
2157a2c58260SJohannes Goetzfried 			.cipher = {
2158a2c58260SJohannes Goetzfried 				.enc = {
2159a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2160a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2161a2c58260SJohannes Goetzfried 				},
2162a2c58260SJohannes Goetzfried 				.dec = {
2163a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2164a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2165a2c58260SJohannes Goetzfried 				}
2166a2c58260SJohannes Goetzfried 			}
2167a2c58260SJohannes Goetzfried 		}
2168a2c58260SJohannes Goetzfried 	}, {
21699b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
21709b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
21719b8b0405SJohannes Goetzfried 		.suite = {
21729b8b0405SJohannes Goetzfried 			.cipher = {
21739b8b0405SJohannes Goetzfried 				.enc = {
21749b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
21759b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
21769b8b0405SJohannes Goetzfried 				},
21779b8b0405SJohannes Goetzfried 				.dec = {
21789b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
21799b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
21809b8b0405SJohannes Goetzfried 				}
21819b8b0405SJohannes Goetzfried 			}
21829b8b0405SJohannes Goetzfried 		}
21839b8b0405SJohannes Goetzfried 	}, {
21848163fc30SJussi Kivilinna 		.alg = "ctr(des)",
21858163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
21868163fc30SJussi Kivilinna 		.suite = {
21878163fc30SJussi Kivilinna 			.cipher = {
21888163fc30SJussi Kivilinna 				.enc = {
21898163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
21908163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
21918163fc30SJussi Kivilinna 				},
21928163fc30SJussi Kivilinna 				.dec = {
21938163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
21948163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
21958163fc30SJussi Kivilinna 				}
21968163fc30SJussi Kivilinna 			}
21978163fc30SJussi Kivilinna 		}
21988163fc30SJussi Kivilinna 	}, {
2199e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2200e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2201e080b17aSJussi Kivilinna 		.suite = {
2202e080b17aSJussi Kivilinna 			.cipher = {
2203e080b17aSJussi Kivilinna 				.enc = {
2204e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2205e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2206e080b17aSJussi Kivilinna 				},
2207e080b17aSJussi Kivilinna 				.dec = {
2208e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2209e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2210e080b17aSJussi Kivilinna 				}
2211e080b17aSJussi Kivilinna 			}
2212e080b17aSJussi Kivilinna 		}
2213e080b17aSJussi Kivilinna 	}, {
22149d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
22159d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
22169d25917dSJussi Kivilinna 		.suite = {
22179d25917dSJussi Kivilinna 			.cipher = {
22189d25917dSJussi Kivilinna 				.enc = {
22199d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
22209d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
22219d25917dSJussi Kivilinna 				},
22229d25917dSJussi Kivilinna 				.dec = {
22239d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
22249d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
22259d25917dSJussi Kivilinna 				}
22269d25917dSJussi Kivilinna 			}
22279d25917dSJussi Kivilinna 		}
22289d25917dSJussi Kivilinna 	}, {
2229573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2230573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2231573da620SJussi Kivilinna 		.suite = {
2232573da620SJussi Kivilinna 			.cipher = {
2233573da620SJussi Kivilinna 				.enc = {
2234573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2235573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2236573da620SJussi Kivilinna 				},
2237573da620SJussi Kivilinna 				.dec = {
2238573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2239573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2240573da620SJussi Kivilinna 				}
2241573da620SJussi Kivilinna 			}
2242573da620SJussi Kivilinna 		}
2243573da620SJussi Kivilinna 	}, {
2244da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
22451aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2246da7f033dSHerbert Xu 		.suite = {
2247da7f033dSHerbert Xu 			.cipher = {
2248da7f033dSHerbert Xu 				.enc = {
2249da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2250da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2251da7f033dSHerbert Xu 				},
2252da7f033dSHerbert Xu 				.dec = {
2253da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2254da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2255da7f033dSHerbert Xu 				}
2256da7f033dSHerbert Xu 			}
2257da7f033dSHerbert Xu 		}
2258da7f033dSHerbert Xu 	}, {
2259da7f033dSHerbert Xu 		.alg = "deflate",
2260da7f033dSHerbert Xu 		.test = alg_test_comp,
22610818904dSMilan Broz 		.fips_allowed = 1,
2262da7f033dSHerbert Xu 		.suite = {
2263da7f033dSHerbert Xu 			.comp = {
2264da7f033dSHerbert Xu 				.comp = {
2265da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2266da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2267da7f033dSHerbert Xu 				},
2268da7f033dSHerbert Xu 				.decomp = {
2269da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2270da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2271da7f033dSHerbert Xu 				}
2272da7f033dSHerbert Xu 			}
2273da7f033dSHerbert Xu 		}
2274da7f033dSHerbert Xu 	}, {
2275e448370dSJussi Kivilinna 		.alg = "digest_null",
2276e448370dSJussi Kivilinna 		.test = alg_test_null,
2277e448370dSJussi Kivilinna 	}, {
2278863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2279863b557aSYouquan, Song 		.test = alg_test_null,
22806c79294fSMilan Broz 		.fips_allowed = 1,
2281863b557aSYouquan, Song 	}, {
2282da7f033dSHerbert Xu 		.alg = "ecb(aes)",
22831aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2284a1915d51SJarod Wilson 		.fips_allowed = 1,
2285da7f033dSHerbert Xu 		.suite = {
2286da7f033dSHerbert Xu 			.cipher = {
2287da7f033dSHerbert Xu 				.enc = {
2288da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2289da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2290da7f033dSHerbert Xu 				},
2291da7f033dSHerbert Xu 				.dec = {
2292da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2293da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2294da7f033dSHerbert Xu 				}
2295da7f033dSHerbert Xu 			}
2296da7f033dSHerbert Xu 		}
2297da7f033dSHerbert Xu 	}, {
2298da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
22991aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2300da7f033dSHerbert Xu 		.suite = {
2301da7f033dSHerbert Xu 			.cipher = {
2302da7f033dSHerbert Xu 				.enc = {
2303da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2304da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2305da7f033dSHerbert Xu 				},
2306da7f033dSHerbert Xu 				.dec = {
2307da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2308da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2309da7f033dSHerbert Xu 				}
2310da7f033dSHerbert Xu 			}
2311da7f033dSHerbert Xu 		}
2312da7f033dSHerbert Xu 	}, {
2313da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
23141aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2315da7f033dSHerbert Xu 		.suite = {
2316da7f033dSHerbert Xu 			.cipher = {
2317da7f033dSHerbert Xu 				.enc = {
2318da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2319da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2320da7f033dSHerbert Xu 				},
2321da7f033dSHerbert Xu 				.dec = {
2322da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2323da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2324da7f033dSHerbert Xu 				}
2325da7f033dSHerbert Xu 			}
2326da7f033dSHerbert Xu 		}
2327da7f033dSHerbert Xu 	}, {
2328da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
23291aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2330da7f033dSHerbert Xu 		.suite = {
2331da7f033dSHerbert Xu 			.cipher = {
2332da7f033dSHerbert Xu 				.enc = {
2333da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2334da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2335da7f033dSHerbert Xu 				},
2336da7f033dSHerbert Xu 				.dec = {
2337da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2338da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2339da7f033dSHerbert Xu 				}
2340da7f033dSHerbert Xu 			}
2341da7f033dSHerbert Xu 		}
2342da7f033dSHerbert Xu 	}, {
2343da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
23441aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2345da7f033dSHerbert Xu 		.suite = {
2346da7f033dSHerbert Xu 			.cipher = {
2347da7f033dSHerbert Xu 				.enc = {
2348da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2349da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2350da7f033dSHerbert Xu 				},
2351da7f033dSHerbert Xu 				.dec = {
2352da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2353da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2354da7f033dSHerbert Xu 				}
2355da7f033dSHerbert Xu 			}
2356da7f033dSHerbert Xu 		}
2357da7f033dSHerbert Xu 	}, {
2358da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
23591aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2360da7f033dSHerbert Xu 		.suite = {
2361da7f033dSHerbert Xu 			.cipher = {
2362da7f033dSHerbert Xu 				.enc = {
2363da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2364da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2365da7f033dSHerbert Xu 				},
2366da7f033dSHerbert Xu 				.dec = {
2367da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2368da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2369da7f033dSHerbert Xu 				}
2370da7f033dSHerbert Xu 			}
2371da7f033dSHerbert Xu 		}
2372da7f033dSHerbert Xu 	}, {
2373da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
23741aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2375da7f033dSHerbert Xu 		.suite = {
2376da7f033dSHerbert Xu 			.cipher = {
2377da7f033dSHerbert Xu 				.enc = {
2378da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2379da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
2380da7f033dSHerbert Xu 				},
2381da7f033dSHerbert Xu 				.dec = {
2382da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
2383da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
2384da7f033dSHerbert Xu 				}
2385da7f033dSHerbert Xu 			}
2386da7f033dSHerbert Xu 		}
2387da7f033dSHerbert Xu 	}, {
2388e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
2389e448370dSJussi Kivilinna 		.test = alg_test_null,
2390e448370dSJussi Kivilinna 	}, {
2391da7f033dSHerbert Xu 		.alg = "ecb(des)",
23921aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2393a1915d51SJarod Wilson 		.fips_allowed = 1,
2394da7f033dSHerbert Xu 		.suite = {
2395da7f033dSHerbert Xu 			.cipher = {
2396da7f033dSHerbert Xu 				.enc = {
2397da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
2398da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
2399da7f033dSHerbert Xu 				},
2400da7f033dSHerbert Xu 				.dec = {
2401da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
2402da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
2403da7f033dSHerbert Xu 				}
2404da7f033dSHerbert Xu 			}
2405da7f033dSHerbert Xu 		}
2406da7f033dSHerbert Xu 	}, {
2407da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
24081aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2409a1915d51SJarod Wilson 		.fips_allowed = 1,
2410da7f033dSHerbert Xu 		.suite = {
2411da7f033dSHerbert Xu 			.cipher = {
2412da7f033dSHerbert Xu 				.enc = {
2413da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
2414da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
2415da7f033dSHerbert Xu 				},
2416da7f033dSHerbert Xu 				.dec = {
2417da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
2418da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
2419da7f033dSHerbert Xu 				}
2420da7f033dSHerbert Xu 			}
2421da7f033dSHerbert Xu 		}
2422da7f033dSHerbert Xu 	}, {
242366e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
242466e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
242566e5bd00SJussi Kivilinna 		.suite = {
242666e5bd00SJussi Kivilinna 			.cipher = {
242766e5bd00SJussi Kivilinna 				.enc = {
242866e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
242966e5bd00SJussi Kivilinna 					.count = 1
243066e5bd00SJussi Kivilinna 				},
243166e5bd00SJussi Kivilinna 				.dec = {
243266e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
243366e5bd00SJussi Kivilinna 					.count = 1
243466e5bd00SJussi Kivilinna 				}
243566e5bd00SJussi Kivilinna 			}
243666e5bd00SJussi Kivilinna 		}
243766e5bd00SJussi Kivilinna 	}, {
2438da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
24391aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2440da7f033dSHerbert Xu 		.suite = {
2441da7f033dSHerbert Xu 			.cipher = {
2442da7f033dSHerbert Xu 				.enc = {
2443da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
2444da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
2445da7f033dSHerbert Xu 				},
2446da7f033dSHerbert Xu 				.dec = {
2447da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
2448da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
2449da7f033dSHerbert Xu 				}
2450da7f033dSHerbert Xu 			}
2451da7f033dSHerbert Xu 		}
2452da7f033dSHerbert Xu 	}, {
2453da7f033dSHerbert Xu 		.alg = "ecb(seed)",
24541aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2455da7f033dSHerbert Xu 		.suite = {
2456da7f033dSHerbert Xu 			.cipher = {
2457da7f033dSHerbert Xu 				.enc = {
2458da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
2459da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
2460da7f033dSHerbert Xu 				},
2461da7f033dSHerbert Xu 				.dec = {
2462da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
2463da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
2464da7f033dSHerbert Xu 				}
2465da7f033dSHerbert Xu 			}
2466da7f033dSHerbert Xu 		}
2467da7f033dSHerbert Xu 	}, {
2468da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
24691aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2470da7f033dSHerbert Xu 		.suite = {
2471da7f033dSHerbert Xu 			.cipher = {
2472da7f033dSHerbert Xu 				.enc = {
2473da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
2474da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
2475da7f033dSHerbert Xu 				},
2476da7f033dSHerbert Xu 				.dec = {
2477da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
2478da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
2479da7f033dSHerbert Xu 				}
2480da7f033dSHerbert Xu 			}
2481da7f033dSHerbert Xu 		}
2482da7f033dSHerbert Xu 	}, {
2483da7f033dSHerbert Xu 		.alg = "ecb(tea)",
24841aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2485da7f033dSHerbert Xu 		.suite = {
2486da7f033dSHerbert Xu 			.cipher = {
2487da7f033dSHerbert Xu 				.enc = {
2488da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
2489da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
2490da7f033dSHerbert Xu 				},
2491da7f033dSHerbert Xu 				.dec = {
2492da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
2493da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
2494da7f033dSHerbert Xu 				}
2495da7f033dSHerbert Xu 			}
2496da7f033dSHerbert Xu 		}
2497da7f033dSHerbert Xu 	}, {
2498da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
24991aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2500da7f033dSHerbert Xu 		.suite = {
2501da7f033dSHerbert Xu 			.cipher = {
2502da7f033dSHerbert Xu 				.enc = {
2503da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
2504da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
2505da7f033dSHerbert Xu 				},
2506da7f033dSHerbert Xu 				.dec = {
2507da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
2508da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
2509da7f033dSHerbert Xu 				}
2510da7f033dSHerbert Xu 			}
2511da7f033dSHerbert Xu 		}
2512da7f033dSHerbert Xu 	}, {
2513da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
25141aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2515da7f033dSHerbert Xu 		.suite = {
2516da7f033dSHerbert Xu 			.cipher = {
2517da7f033dSHerbert Xu 				.enc = {
2518da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
2519da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
2520da7f033dSHerbert Xu 				},
2521da7f033dSHerbert Xu 				.dec = {
2522da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
2523da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
2524da7f033dSHerbert Xu 				}
2525da7f033dSHerbert Xu 			}
2526da7f033dSHerbert Xu 		}
2527da7f033dSHerbert Xu 	}, {
2528da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
25291aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2530da7f033dSHerbert Xu 		.suite = {
2531da7f033dSHerbert Xu 			.cipher = {
2532da7f033dSHerbert Xu 				.enc = {
2533da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
2534da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
2535da7f033dSHerbert Xu 				},
2536da7f033dSHerbert Xu 				.dec = {
2537da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
2538da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
2539da7f033dSHerbert Xu 				}
2540da7f033dSHerbert Xu 			}
2541da7f033dSHerbert Xu 		}
2542da7f033dSHerbert Xu 	}, {
2543da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
25441aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2545da7f033dSHerbert Xu 		.suite = {
2546da7f033dSHerbert Xu 			.cipher = {
2547da7f033dSHerbert Xu 				.enc = {
2548da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
2549da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
2550da7f033dSHerbert Xu 				},
2551da7f033dSHerbert Xu 				.dec = {
2552da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
2553da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
2554da7f033dSHerbert Xu 				}
2555da7f033dSHerbert Xu 			}
2556da7f033dSHerbert Xu 		}
2557da7f033dSHerbert Xu 	}, {
2558da7f033dSHerbert Xu 		.alg = "gcm(aes)",
2559da7f033dSHerbert Xu 		.test = alg_test_aead,
2560a1915d51SJarod Wilson 		.fips_allowed = 1,
2561da7f033dSHerbert Xu 		.suite = {
2562da7f033dSHerbert Xu 			.aead = {
2563da7f033dSHerbert Xu 				.enc = {
2564da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
2565da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
2566da7f033dSHerbert Xu 				},
2567da7f033dSHerbert Xu 				.dec = {
2568da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
2569da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
2570da7f033dSHerbert Xu 				}
2571da7f033dSHerbert Xu 			}
2572da7f033dSHerbert Xu 		}
2573da7f033dSHerbert Xu 	}, {
2574507069c9SYouquan, Song 		.alg = "ghash",
2575507069c9SYouquan, Song 		.test = alg_test_hash,
257618c0ebd2SJarod Wilson 		.fips_allowed = 1,
2577507069c9SYouquan, Song 		.suite = {
2578507069c9SYouquan, Song 			.hash = {
2579507069c9SYouquan, Song 				.vecs = ghash_tv_template,
2580507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
2581507069c9SYouquan, Song 			}
2582507069c9SYouquan, Song 		}
2583507069c9SYouquan, Song 	}, {
2584a482b081SSonic Zhang 		.alg = "hmac(crc32)",
2585a482b081SSonic Zhang 		.test = alg_test_hash,
2586a482b081SSonic Zhang 		.suite = {
2587a482b081SSonic Zhang 			.hash = {
2588a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
2589a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
2590a482b081SSonic Zhang 			}
2591a482b081SSonic Zhang 		}
2592a482b081SSonic Zhang 	}, {
2593da7f033dSHerbert Xu 		.alg = "hmac(md5)",
2594da7f033dSHerbert Xu 		.test = alg_test_hash,
2595da7f033dSHerbert Xu 		.suite = {
2596da7f033dSHerbert Xu 			.hash = {
2597da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
2598da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
2599da7f033dSHerbert Xu 			}
2600da7f033dSHerbert Xu 		}
2601da7f033dSHerbert Xu 	}, {
2602da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
2603da7f033dSHerbert Xu 		.test = alg_test_hash,
2604da7f033dSHerbert Xu 		.suite = {
2605da7f033dSHerbert Xu 			.hash = {
2606da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
2607da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
2608da7f033dSHerbert Xu 			}
2609da7f033dSHerbert Xu 		}
2610da7f033dSHerbert Xu 	}, {
2611da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
2612da7f033dSHerbert Xu 		.test = alg_test_hash,
2613da7f033dSHerbert Xu 		.suite = {
2614da7f033dSHerbert Xu 			.hash = {
2615da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
2616da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
2617da7f033dSHerbert Xu 			}
2618da7f033dSHerbert Xu 		}
2619da7f033dSHerbert Xu 	}, {
2620da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
2621da7f033dSHerbert Xu 		.test = alg_test_hash,
2622a1915d51SJarod Wilson 		.fips_allowed = 1,
2623da7f033dSHerbert Xu 		.suite = {
2624da7f033dSHerbert Xu 			.hash = {
2625da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
2626da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
2627da7f033dSHerbert Xu 			}
2628da7f033dSHerbert Xu 		}
2629da7f033dSHerbert Xu 	}, {
2630da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
2631da7f033dSHerbert Xu 		.test = alg_test_hash,
2632a1915d51SJarod Wilson 		.fips_allowed = 1,
2633da7f033dSHerbert Xu 		.suite = {
2634da7f033dSHerbert Xu 			.hash = {
2635da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
2636da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
2637da7f033dSHerbert Xu 			}
2638da7f033dSHerbert Xu 		}
2639da7f033dSHerbert Xu 	}, {
2640da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
2641da7f033dSHerbert Xu 		.test = alg_test_hash,
2642a1915d51SJarod Wilson 		.fips_allowed = 1,
2643da7f033dSHerbert Xu 		.suite = {
2644da7f033dSHerbert Xu 			.hash = {
2645da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
2646da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
2647da7f033dSHerbert Xu 			}
2648da7f033dSHerbert Xu 		}
2649da7f033dSHerbert Xu 	}, {
2650da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
2651da7f033dSHerbert Xu 		.test = alg_test_hash,
2652a1915d51SJarod Wilson 		.fips_allowed = 1,
2653da7f033dSHerbert Xu 		.suite = {
2654da7f033dSHerbert Xu 			.hash = {
2655da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
2656da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
2657da7f033dSHerbert Xu 			}
2658da7f033dSHerbert Xu 		}
2659da7f033dSHerbert Xu 	}, {
2660da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
2661da7f033dSHerbert Xu 		.test = alg_test_hash,
2662a1915d51SJarod Wilson 		.fips_allowed = 1,
2663da7f033dSHerbert Xu 		.suite = {
2664da7f033dSHerbert Xu 			.hash = {
2665da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
2666da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
2667da7f033dSHerbert Xu 			}
2668da7f033dSHerbert Xu 		}
2669da7f033dSHerbert Xu 	}, {
2670da7f033dSHerbert Xu 		.alg = "lrw(aes)",
26711aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2672da7f033dSHerbert Xu 		.suite = {
2673da7f033dSHerbert Xu 			.cipher = {
2674da7f033dSHerbert Xu 				.enc = {
2675da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
2676da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
2677da7f033dSHerbert Xu 				},
2678da7f033dSHerbert Xu 				.dec = {
2679da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
2680da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
2681da7f033dSHerbert Xu 				}
2682da7f033dSHerbert Xu 			}
2683da7f033dSHerbert Xu 		}
2684da7f033dSHerbert Xu 	}, {
26850840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
26860840605eSJussi Kivilinna 		.test = alg_test_skcipher,
26870840605eSJussi Kivilinna 		.suite = {
26880840605eSJussi Kivilinna 			.cipher = {
26890840605eSJussi Kivilinna 				.enc = {
26900840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
26910840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
26920840605eSJussi Kivilinna 				},
26930840605eSJussi Kivilinna 				.dec = {
26940840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
26950840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
26960840605eSJussi Kivilinna 				}
26970840605eSJussi Kivilinna 			}
26980840605eSJussi Kivilinna 		}
26990840605eSJussi Kivilinna 	}, {
27009b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
27019b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
27029b8b0405SJohannes Goetzfried 		.suite = {
27039b8b0405SJohannes Goetzfried 			.cipher = {
27049b8b0405SJohannes Goetzfried 				.enc = {
27059b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
27069b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
27079b8b0405SJohannes Goetzfried 				},
27089b8b0405SJohannes Goetzfried 				.dec = {
27099b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
27109b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
27119b8b0405SJohannes Goetzfried 				}
27129b8b0405SJohannes Goetzfried 			}
27139b8b0405SJohannes Goetzfried 		}
27149b8b0405SJohannes Goetzfried 	}, {
2715d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
2716d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
2717d7bfc0faSJussi Kivilinna 		.suite = {
2718d7bfc0faSJussi Kivilinna 			.cipher = {
2719d7bfc0faSJussi Kivilinna 				.enc = {
2720d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
2721d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
2722d7bfc0faSJussi Kivilinna 				},
2723d7bfc0faSJussi Kivilinna 				.dec = {
2724d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
2725d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
2726d7bfc0faSJussi Kivilinna 				}
2727d7bfc0faSJussi Kivilinna 			}
2728d7bfc0faSJussi Kivilinna 		}
2729d7bfc0faSJussi Kivilinna 	}, {
27300b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
27310b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
27320b2a1551SJussi Kivilinna 		.suite = {
27330b2a1551SJussi Kivilinna 			.cipher = {
27340b2a1551SJussi Kivilinna 				.enc = {
27350b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
27360b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
27370b2a1551SJussi Kivilinna 				},
27380b2a1551SJussi Kivilinna 				.dec = {
27390b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
27400b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
27410b2a1551SJussi Kivilinna 				}
27420b2a1551SJussi Kivilinna 			}
27430b2a1551SJussi Kivilinna 		}
27440b2a1551SJussi Kivilinna 	}, {
2745da7f033dSHerbert Xu 		.alg = "lzo",
2746da7f033dSHerbert Xu 		.test = alg_test_comp,
27470818904dSMilan Broz 		.fips_allowed = 1,
2748da7f033dSHerbert Xu 		.suite = {
2749da7f033dSHerbert Xu 			.comp = {
2750da7f033dSHerbert Xu 				.comp = {
2751da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
2752da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
2753da7f033dSHerbert Xu 				},
2754da7f033dSHerbert Xu 				.decomp = {
2755da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
2756da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
2757da7f033dSHerbert Xu 				}
2758da7f033dSHerbert Xu 			}
2759da7f033dSHerbert Xu 		}
2760da7f033dSHerbert Xu 	}, {
2761da7f033dSHerbert Xu 		.alg = "md4",
2762da7f033dSHerbert Xu 		.test = alg_test_hash,
2763da7f033dSHerbert Xu 		.suite = {
2764da7f033dSHerbert Xu 			.hash = {
2765da7f033dSHerbert Xu 				.vecs = md4_tv_template,
2766da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
2767da7f033dSHerbert Xu 			}
2768da7f033dSHerbert Xu 		}
2769da7f033dSHerbert Xu 	}, {
2770da7f033dSHerbert Xu 		.alg = "md5",
2771da7f033dSHerbert Xu 		.test = alg_test_hash,
2772da7f033dSHerbert Xu 		.suite = {
2773da7f033dSHerbert Xu 			.hash = {
2774da7f033dSHerbert Xu 				.vecs = md5_tv_template,
2775da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
2776da7f033dSHerbert Xu 			}
2777da7f033dSHerbert Xu 		}
2778da7f033dSHerbert Xu 	}, {
2779da7f033dSHerbert Xu 		.alg = "michael_mic",
2780da7f033dSHerbert Xu 		.test = alg_test_hash,
2781da7f033dSHerbert Xu 		.suite = {
2782da7f033dSHerbert Xu 			.hash = {
2783da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
2784da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
2785da7f033dSHerbert Xu 			}
2786da7f033dSHerbert Xu 		}
2787da7f033dSHerbert Xu 	}, {
2788ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
2789ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
2790ba0e14acSPuneet Saxena 		.fips_allowed = 1,
2791ba0e14acSPuneet Saxena 		.suite = {
2792ba0e14acSPuneet Saxena 			.cipher = {
2793ba0e14acSPuneet Saxena 				.enc = {
2794ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
2795ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
2796ba0e14acSPuneet Saxena 				},
2797ba0e14acSPuneet Saxena 				.dec = {
2798ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
2799ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
2800ba0e14acSPuneet Saxena 				}
2801ba0e14acSPuneet Saxena 			}
2802ba0e14acSPuneet Saxena 		}
2803ba0e14acSPuneet Saxena 	}, {
2804da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
28051aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2806da7f033dSHerbert Xu 		.suite = {
2807da7f033dSHerbert Xu 			.cipher = {
2808da7f033dSHerbert Xu 				.enc = {
2809da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
2810da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
2811da7f033dSHerbert Xu 				},
2812da7f033dSHerbert Xu 				.dec = {
2813da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
2814da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
2815da7f033dSHerbert Xu 				}
2816da7f033dSHerbert Xu 			}
2817da7f033dSHerbert Xu 		}
2818da7f033dSHerbert Xu 	}, {
2819da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
28201aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2821a1915d51SJarod Wilson 		.fips_allowed = 1,
2822da7f033dSHerbert Xu 		.suite = {
2823da7f033dSHerbert Xu 			.cipher = {
2824da7f033dSHerbert Xu 				.enc = {
2825f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
2826f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
2827da7f033dSHerbert Xu 				},
2828da7f033dSHerbert Xu 				.dec = {
2829f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
2830f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
2831da7f033dSHerbert Xu 				}
2832da7f033dSHerbert Xu 			}
2833da7f033dSHerbert Xu 		}
2834da7f033dSHerbert Xu 	}, {
283569435b94SAdrian Hoban 		.alg = "rfc4106(gcm(aes))",
283669435b94SAdrian Hoban 		.test = alg_test_aead,
283769435b94SAdrian Hoban 		.suite = {
283869435b94SAdrian Hoban 			.aead = {
283969435b94SAdrian Hoban 				.enc = {
284069435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
284169435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
284269435b94SAdrian Hoban 				},
284369435b94SAdrian Hoban 				.dec = {
284469435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
284569435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
284669435b94SAdrian Hoban 				}
284769435b94SAdrian Hoban 			}
284869435b94SAdrian Hoban 		}
284969435b94SAdrian Hoban 	}, {
28505d667322SJarod Wilson 		.alg = "rfc4309(ccm(aes))",
28515d667322SJarod Wilson 		.test = alg_test_aead,
2852a1915d51SJarod Wilson 		.fips_allowed = 1,
28535d667322SJarod Wilson 		.suite = {
28545d667322SJarod Wilson 			.aead = {
28555d667322SJarod Wilson 				.enc = {
28565d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
28575d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
28585d667322SJarod Wilson 				},
28595d667322SJarod Wilson 				.dec = {
28605d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
28615d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
28625d667322SJarod Wilson 				}
28635d667322SJarod Wilson 			}
28645d667322SJarod Wilson 		}
28655d667322SJarod Wilson 	}, {
2866e9b7441aSJussi Kivilinna 		.alg = "rfc4543(gcm(aes))",
2867e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
2868e9b7441aSJussi Kivilinna 		.suite = {
2869e9b7441aSJussi Kivilinna 			.aead = {
2870e9b7441aSJussi Kivilinna 				.enc = {
2871e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_enc_tv_template,
2872e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_ENC_TEST_VECTORS
2873e9b7441aSJussi Kivilinna 				},
2874e9b7441aSJussi Kivilinna 				.dec = {
2875e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_dec_tv_template,
2876e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_DEC_TEST_VECTORS
2877e9b7441aSJussi Kivilinna 				},
2878e9b7441aSJussi Kivilinna 			}
2879e9b7441aSJussi Kivilinna 		}
2880e9b7441aSJussi Kivilinna 	}, {
2881da7f033dSHerbert Xu 		.alg = "rmd128",
2882da7f033dSHerbert Xu 		.test = alg_test_hash,
2883da7f033dSHerbert Xu 		.suite = {
2884da7f033dSHerbert Xu 			.hash = {
2885da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
2886da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
2887da7f033dSHerbert Xu 			}
2888da7f033dSHerbert Xu 		}
2889da7f033dSHerbert Xu 	}, {
2890da7f033dSHerbert Xu 		.alg = "rmd160",
2891da7f033dSHerbert Xu 		.test = alg_test_hash,
2892da7f033dSHerbert Xu 		.suite = {
2893da7f033dSHerbert Xu 			.hash = {
2894da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
2895da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
2896da7f033dSHerbert Xu 			}
2897da7f033dSHerbert Xu 		}
2898da7f033dSHerbert Xu 	}, {
2899da7f033dSHerbert Xu 		.alg = "rmd256",
2900da7f033dSHerbert Xu 		.test = alg_test_hash,
2901da7f033dSHerbert Xu 		.suite = {
2902da7f033dSHerbert Xu 			.hash = {
2903da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
2904da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
2905da7f033dSHerbert Xu 			}
2906da7f033dSHerbert Xu 		}
2907da7f033dSHerbert Xu 	}, {
2908da7f033dSHerbert Xu 		.alg = "rmd320",
2909da7f033dSHerbert Xu 		.test = alg_test_hash,
2910da7f033dSHerbert Xu 		.suite = {
2911da7f033dSHerbert Xu 			.hash = {
2912da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
2913da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
2914da7f033dSHerbert Xu 			}
2915da7f033dSHerbert Xu 		}
2916da7f033dSHerbert Xu 	}, {
2917da7f033dSHerbert Xu 		.alg = "salsa20",
29181aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2919da7f033dSHerbert Xu 		.suite = {
2920da7f033dSHerbert Xu 			.cipher = {
2921da7f033dSHerbert Xu 				.enc = {
2922da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
2923da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
2924da7f033dSHerbert Xu 				}
2925da7f033dSHerbert Xu 			}
2926da7f033dSHerbert Xu 		}
2927da7f033dSHerbert Xu 	}, {
2928da7f033dSHerbert Xu 		.alg = "sha1",
2929da7f033dSHerbert Xu 		.test = alg_test_hash,
2930a1915d51SJarod Wilson 		.fips_allowed = 1,
2931da7f033dSHerbert Xu 		.suite = {
2932da7f033dSHerbert Xu 			.hash = {
2933da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
2934da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
2935da7f033dSHerbert Xu 			}
2936da7f033dSHerbert Xu 		}
2937da7f033dSHerbert Xu 	}, {
2938da7f033dSHerbert Xu 		.alg = "sha224",
2939da7f033dSHerbert Xu 		.test = alg_test_hash,
2940a1915d51SJarod Wilson 		.fips_allowed = 1,
2941da7f033dSHerbert Xu 		.suite = {
2942da7f033dSHerbert Xu 			.hash = {
2943da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
2944da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
2945da7f033dSHerbert Xu 			}
2946da7f033dSHerbert Xu 		}
2947da7f033dSHerbert Xu 	}, {
2948da7f033dSHerbert Xu 		.alg = "sha256",
2949da7f033dSHerbert Xu 		.test = alg_test_hash,
2950a1915d51SJarod Wilson 		.fips_allowed = 1,
2951da7f033dSHerbert Xu 		.suite = {
2952da7f033dSHerbert Xu 			.hash = {
2953da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
2954da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
2955da7f033dSHerbert Xu 			}
2956da7f033dSHerbert Xu 		}
2957da7f033dSHerbert Xu 	}, {
2958da7f033dSHerbert Xu 		.alg = "sha384",
2959da7f033dSHerbert Xu 		.test = alg_test_hash,
2960a1915d51SJarod Wilson 		.fips_allowed = 1,
2961da7f033dSHerbert Xu 		.suite = {
2962da7f033dSHerbert Xu 			.hash = {
2963da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
2964da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
2965da7f033dSHerbert Xu 			}
2966da7f033dSHerbert Xu 		}
2967da7f033dSHerbert Xu 	}, {
2968da7f033dSHerbert Xu 		.alg = "sha512",
2969da7f033dSHerbert Xu 		.test = alg_test_hash,
2970a1915d51SJarod Wilson 		.fips_allowed = 1,
2971da7f033dSHerbert Xu 		.suite = {
2972da7f033dSHerbert Xu 			.hash = {
2973da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
2974da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
2975da7f033dSHerbert Xu 			}
2976da7f033dSHerbert Xu 		}
2977da7f033dSHerbert Xu 	}, {
2978da7f033dSHerbert Xu 		.alg = "tgr128",
2979da7f033dSHerbert Xu 		.test = alg_test_hash,
2980da7f033dSHerbert Xu 		.suite = {
2981da7f033dSHerbert Xu 			.hash = {
2982da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
2983da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
2984da7f033dSHerbert Xu 			}
2985da7f033dSHerbert Xu 		}
2986da7f033dSHerbert Xu 	}, {
2987da7f033dSHerbert Xu 		.alg = "tgr160",
2988da7f033dSHerbert Xu 		.test = alg_test_hash,
2989da7f033dSHerbert Xu 		.suite = {
2990da7f033dSHerbert Xu 			.hash = {
2991da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
2992da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
2993da7f033dSHerbert Xu 			}
2994da7f033dSHerbert Xu 		}
2995da7f033dSHerbert Xu 	}, {
2996da7f033dSHerbert Xu 		.alg = "tgr192",
2997da7f033dSHerbert Xu 		.test = alg_test_hash,
2998da7f033dSHerbert Xu 		.suite = {
2999da7f033dSHerbert Xu 			.hash = {
3000da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
3001da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
3002da7f033dSHerbert Xu 			}
3003da7f033dSHerbert Xu 		}
3004da7f033dSHerbert Xu 	}, {
3005f1939f7cSShane Wang 		.alg = "vmac(aes)",
3006f1939f7cSShane Wang 		.test = alg_test_hash,
3007f1939f7cSShane Wang 		.suite = {
3008f1939f7cSShane Wang 			.hash = {
3009f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
3010f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
3011f1939f7cSShane Wang 			}
3012f1939f7cSShane Wang 		}
3013f1939f7cSShane Wang 	}, {
3014da7f033dSHerbert Xu 		.alg = "wp256",
3015da7f033dSHerbert Xu 		.test = alg_test_hash,
3016da7f033dSHerbert Xu 		.suite = {
3017da7f033dSHerbert Xu 			.hash = {
3018da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
3019da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
3020da7f033dSHerbert Xu 			}
3021da7f033dSHerbert Xu 		}
3022da7f033dSHerbert Xu 	}, {
3023da7f033dSHerbert Xu 		.alg = "wp384",
3024da7f033dSHerbert Xu 		.test = alg_test_hash,
3025da7f033dSHerbert Xu 		.suite = {
3026da7f033dSHerbert Xu 			.hash = {
3027da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
3028da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
3029da7f033dSHerbert Xu 			}
3030da7f033dSHerbert Xu 		}
3031da7f033dSHerbert Xu 	}, {
3032da7f033dSHerbert Xu 		.alg = "wp512",
3033da7f033dSHerbert Xu 		.test = alg_test_hash,
3034da7f033dSHerbert Xu 		.suite = {
3035da7f033dSHerbert Xu 			.hash = {
3036da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
3037da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
3038da7f033dSHerbert Xu 			}
3039da7f033dSHerbert Xu 		}
3040da7f033dSHerbert Xu 	}, {
3041da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3042da7f033dSHerbert Xu 		.test = alg_test_hash,
3043da7f033dSHerbert Xu 		.suite = {
3044da7f033dSHerbert Xu 			.hash = {
3045da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
3046da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
3047da7f033dSHerbert Xu 			}
3048da7f033dSHerbert Xu 		}
3049da7f033dSHerbert Xu 	}, {
3050da7f033dSHerbert Xu 		.alg = "xts(aes)",
30511aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
30522918aa8dSJarod Wilson 		.fips_allowed = 1,
3053da7f033dSHerbert Xu 		.suite = {
3054da7f033dSHerbert Xu 			.cipher = {
3055da7f033dSHerbert Xu 				.enc = {
3056da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
3057da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
3058da7f033dSHerbert Xu 				},
3059da7f033dSHerbert Xu 				.dec = {
3060da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
3061da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
3062da7f033dSHerbert Xu 				}
3063da7f033dSHerbert Xu 			}
3064da7f033dSHerbert Xu 		}
30650c01aed5SGeert Uytterhoeven 	}, {
30660840605eSJussi Kivilinna 		.alg = "xts(camellia)",
30670840605eSJussi Kivilinna 		.test = alg_test_skcipher,
30680840605eSJussi Kivilinna 		.suite = {
30690840605eSJussi Kivilinna 			.cipher = {
30700840605eSJussi Kivilinna 				.enc = {
30710840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
30720840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
30730840605eSJussi Kivilinna 				},
30740840605eSJussi Kivilinna 				.dec = {
30750840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
30760840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
30770840605eSJussi Kivilinna 				}
30780840605eSJussi Kivilinna 			}
30790840605eSJussi Kivilinna 		}
30800840605eSJussi Kivilinna 	}, {
30819b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
30829b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
30839b8b0405SJohannes Goetzfried 		.suite = {
30849b8b0405SJohannes Goetzfried 			.cipher = {
30859b8b0405SJohannes Goetzfried 				.enc = {
30869b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
30879b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
30889b8b0405SJohannes Goetzfried 				},
30899b8b0405SJohannes Goetzfried 				.dec = {
30909b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
30919b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
30929b8b0405SJohannes Goetzfried 				}
30939b8b0405SJohannes Goetzfried 			}
30949b8b0405SJohannes Goetzfried 		}
30959b8b0405SJohannes Goetzfried 	}, {
309618be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
309718be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
309818be20b9SJussi Kivilinna 		.suite = {
309918be20b9SJussi Kivilinna 			.cipher = {
310018be20b9SJussi Kivilinna 				.enc = {
310118be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
310218be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
310318be20b9SJussi Kivilinna 				},
310418be20b9SJussi Kivilinna 				.dec = {
310518be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
310618be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
310718be20b9SJussi Kivilinna 				}
310818be20b9SJussi Kivilinna 			}
310918be20b9SJussi Kivilinna 		}
311018be20b9SJussi Kivilinna 	}, {
3111aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3112aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3113aed265b9SJussi Kivilinna 		.suite = {
3114aed265b9SJussi Kivilinna 			.cipher = {
3115aed265b9SJussi Kivilinna 				.enc = {
3116aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
3117aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
3118aed265b9SJussi Kivilinna 				},
3119aed265b9SJussi Kivilinna 				.dec = {
3120aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
3121aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
3122aed265b9SJussi Kivilinna 				}
3123aed265b9SJussi Kivilinna 			}
3124aed265b9SJussi Kivilinna 		}
3125aed265b9SJussi Kivilinna 	}, {
31260c01aed5SGeert Uytterhoeven 		.alg = "zlib",
31270c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
31280818904dSMilan Broz 		.fips_allowed = 1,
31290c01aed5SGeert Uytterhoeven 		.suite = {
31300c01aed5SGeert Uytterhoeven 			.pcomp = {
31310c01aed5SGeert Uytterhoeven 				.comp = {
31320c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
31330c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
31340c01aed5SGeert Uytterhoeven 				},
31350c01aed5SGeert Uytterhoeven 				.decomp = {
31360c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
31370c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
31380c01aed5SGeert Uytterhoeven 				}
31390c01aed5SGeert Uytterhoeven 			}
31400c01aed5SGeert Uytterhoeven 		}
3141da7f033dSHerbert Xu 	}
3142da7f033dSHerbert Xu };
3143da7f033dSHerbert Xu 
31445714758bSJussi Kivilinna static bool alg_test_descs_checked;
31455714758bSJussi Kivilinna 
31465714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
31475714758bSJussi Kivilinna {
31485714758bSJussi Kivilinna 	int i;
31495714758bSJussi Kivilinna 
31505714758bSJussi Kivilinna 	/* only check once */
31515714758bSJussi Kivilinna 	if (alg_test_descs_checked)
31525714758bSJussi Kivilinna 		return;
31535714758bSJussi Kivilinna 
31545714758bSJussi Kivilinna 	alg_test_descs_checked = true;
31555714758bSJussi Kivilinna 
31565714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
31575714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
31585714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
31595714758bSJussi Kivilinna 
31605714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
31615714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
31625714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
31635714758bSJussi Kivilinna 				alg_test_descs[i].alg);
31645714758bSJussi Kivilinna 		}
31655714758bSJussi Kivilinna 
31665714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
31675714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
31685714758bSJussi Kivilinna 				alg_test_descs[i].alg);
31695714758bSJussi Kivilinna 		}
31705714758bSJussi Kivilinna 	}
31715714758bSJussi Kivilinna }
31725714758bSJussi Kivilinna 
31731aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3174da7f033dSHerbert Xu {
3175da7f033dSHerbert Xu 	int start = 0;
3176da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3177da7f033dSHerbert Xu 
3178da7f033dSHerbert Xu 	while (start < end) {
3179da7f033dSHerbert Xu 		int i = (start + end) / 2;
3180da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3181da7f033dSHerbert Xu 
3182da7f033dSHerbert Xu 		if (diff > 0) {
3183da7f033dSHerbert Xu 			end = i;
3184da7f033dSHerbert Xu 			continue;
3185da7f033dSHerbert Xu 		}
3186da7f033dSHerbert Xu 
3187da7f033dSHerbert Xu 		if (diff < 0) {
3188da7f033dSHerbert Xu 			start = i + 1;
3189da7f033dSHerbert Xu 			continue;
3190da7f033dSHerbert Xu 		}
3191da7f033dSHerbert Xu 
31921aa4ecd9SHerbert Xu 		return i;
3193da7f033dSHerbert Xu 	}
3194da7f033dSHerbert Xu 
31951aa4ecd9SHerbert Xu 	return -1;
31961aa4ecd9SHerbert Xu }
31971aa4ecd9SHerbert Xu 
31981aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
31991aa4ecd9SHerbert Xu {
32001aa4ecd9SHerbert Xu 	int i;
3201a68f6610SHerbert Xu 	int j;
3202d12d6b6dSNeil Horman 	int rc;
32031aa4ecd9SHerbert Xu 
32045714758bSJussi Kivilinna 	alg_test_descs_check_order();
32055714758bSJussi Kivilinna 
32061aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
32071aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
32081aa4ecd9SHerbert Xu 
32091aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
32101aa4ecd9SHerbert Xu 		    sizeof(nalg))
32111aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
32121aa4ecd9SHerbert Xu 
32131aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
32141aa4ecd9SHerbert Xu 		if (i < 0)
32151aa4ecd9SHerbert Xu 			goto notest;
32161aa4ecd9SHerbert Xu 
3217a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3218a3bef3a3SJarod Wilson 			goto non_fips_alg;
3219a3bef3a3SJarod Wilson 
3220941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3221941fb328SJarod Wilson 		goto test_done;
32221aa4ecd9SHerbert Xu 	}
32231aa4ecd9SHerbert Xu 
32241aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3225a68f6610SHerbert Xu 	j = alg_find_test(driver);
3226a68f6610SHerbert Xu 	if (i < 0 && j < 0)
32271aa4ecd9SHerbert Xu 		goto notest;
32281aa4ecd9SHerbert Xu 
3229a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3230a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3231a3bef3a3SJarod Wilson 		goto non_fips_alg;
3232a3bef3a3SJarod Wilson 
3233a68f6610SHerbert Xu 	rc = 0;
3234a68f6610SHerbert Xu 	if (i >= 0)
3235a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
32361aa4ecd9SHerbert Xu 					     type, mask);
3237a68f6610SHerbert Xu 	if (j >= 0)
3238a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3239a68f6610SHerbert Xu 					     type, mask);
3240a68f6610SHerbert Xu 
3241941fb328SJarod Wilson test_done:
3242d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3243d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3244d12d6b6dSNeil Horman 
324529ecd4abSJarod Wilson 	if (fips_enabled && !rc)
324629ecd4abSJarod Wilson 		printk(KERN_INFO "alg: self-tests for %s (%s) passed\n",
324729ecd4abSJarod Wilson 		       driver, alg);
324829ecd4abSJarod Wilson 
3249d12d6b6dSNeil Horman 	return rc;
32501aa4ecd9SHerbert Xu 
32511aa4ecd9SHerbert Xu notest:
3252da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3253da7f033dSHerbert Xu 	return 0;
3254a3bef3a3SJarod Wilson non_fips_alg:
3255a3bef3a3SJarod Wilson 	return -EINVAL;
3256da7f033dSHerbert Xu }
32570b767f96SAlexander Shishkin 
3258326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
32590b767f96SAlexander Shishkin 
3260da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3261