xref: /openbmc/linux/crypto/testmgr.c (revision 22287b0b)
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 
231ce33115SHerbert Xu #include <crypto/aead.h>
24da7f033dSHerbert Xu #include <crypto/hash.h>
2512773d93SHerbert Xu #include <crypto/skcipher.h>
26da7f033dSHerbert Xu #include <linux/err.h>
271c41b882SHerbert Xu #include <linux/fips.h>
28da7f033dSHerbert Xu #include <linux/module.h>
29da7f033dSHerbert Xu #include <linux/scatterlist.h>
30da7f033dSHerbert Xu #include <linux/slab.h>
31da7f033dSHerbert Xu #include <linux/string.h>
327647d6ceSJarod Wilson #include <crypto/rng.h>
3364d1cdfbSStephan Mueller #include <crypto/drbg.h>
34946cc463STadeusz Struk #include <crypto/akcipher.h>
35da7f033dSHerbert Xu 
36da7f033dSHerbert Xu #include "internal.h"
370b767f96SAlexander Shishkin 
38326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
390b767f96SAlexander Shishkin 
400b767f96SAlexander Shishkin /* a perfect nop */
410b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
420b767f96SAlexander Shishkin {
430b767f96SAlexander Shishkin 	return 0;
440b767f96SAlexander Shishkin }
450b767f96SAlexander Shishkin 
460b767f96SAlexander Shishkin #else
470b767f96SAlexander Shishkin 
48da7f033dSHerbert Xu #include "testmgr.h"
49da7f033dSHerbert Xu 
50da7f033dSHerbert Xu /*
51da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
52da7f033dSHerbert Xu  */
53da7f033dSHerbert Xu #define XBUFSIZE	8
54da7f033dSHerbert Xu 
55da7f033dSHerbert Xu /*
56da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
57da7f033dSHerbert Xu  */
58da7f033dSHerbert Xu #define IDX1		32
59da7f033dSHerbert Xu #define IDX2		32400
60da7f033dSHerbert Xu #define IDX3		1
61da7f033dSHerbert Xu #define IDX4		8193
62da7f033dSHerbert Xu #define IDX5		22222
63da7f033dSHerbert Xu #define IDX6		17101
64da7f033dSHerbert Xu #define IDX7		27333
65da7f033dSHerbert Xu #define IDX8		3000
66da7f033dSHerbert Xu 
67da7f033dSHerbert Xu /*
68da7f033dSHerbert Xu * Used by test_cipher()
69da7f033dSHerbert Xu */
70da7f033dSHerbert Xu #define ENCRYPT 1
71da7f033dSHerbert Xu #define DECRYPT 0
72da7f033dSHerbert Xu 
73da7f033dSHerbert Xu struct tcrypt_result {
74da7f033dSHerbert Xu 	struct completion completion;
75da7f033dSHerbert Xu 	int err;
76da7f033dSHerbert Xu };
77da7f033dSHerbert Xu 
78da7f033dSHerbert Xu struct aead_test_suite {
79da7f033dSHerbert Xu 	struct {
80da7f033dSHerbert Xu 		struct aead_testvec *vecs;
81da7f033dSHerbert Xu 		unsigned int count;
82da7f033dSHerbert Xu 	} enc, dec;
83da7f033dSHerbert Xu };
84da7f033dSHerbert Xu 
85da7f033dSHerbert Xu struct cipher_test_suite {
86da7f033dSHerbert Xu 	struct {
87da7f033dSHerbert Xu 		struct cipher_testvec *vecs;
88da7f033dSHerbert Xu 		unsigned int count;
89da7f033dSHerbert Xu 	} enc, dec;
90da7f033dSHerbert Xu };
91da7f033dSHerbert Xu 
92da7f033dSHerbert Xu struct comp_test_suite {
93da7f033dSHerbert Xu 	struct {
94da7f033dSHerbert Xu 		struct comp_testvec *vecs;
95da7f033dSHerbert Xu 		unsigned int count;
96da7f033dSHerbert Xu 	} comp, decomp;
97da7f033dSHerbert Xu };
98da7f033dSHerbert Xu 
998064efb8SGeert Uytterhoeven struct pcomp_test_suite {
1008064efb8SGeert Uytterhoeven 	struct {
1018064efb8SGeert Uytterhoeven 		struct pcomp_testvec *vecs;
1028064efb8SGeert Uytterhoeven 		unsigned int count;
1038064efb8SGeert Uytterhoeven 	} comp, decomp;
1048064efb8SGeert Uytterhoeven };
1058064efb8SGeert Uytterhoeven 
106da7f033dSHerbert Xu struct hash_test_suite {
107da7f033dSHerbert Xu 	struct hash_testvec *vecs;
108da7f033dSHerbert Xu 	unsigned int count;
109da7f033dSHerbert Xu };
110da7f033dSHerbert Xu 
1117647d6ceSJarod Wilson struct cprng_test_suite {
1127647d6ceSJarod Wilson 	struct cprng_testvec *vecs;
1137647d6ceSJarod Wilson 	unsigned int count;
1147647d6ceSJarod Wilson };
1157647d6ceSJarod Wilson 
11664d1cdfbSStephan Mueller struct drbg_test_suite {
11764d1cdfbSStephan Mueller 	struct drbg_testvec *vecs;
11864d1cdfbSStephan Mueller 	unsigned int count;
11964d1cdfbSStephan Mueller };
12064d1cdfbSStephan Mueller 
121946cc463STadeusz Struk struct akcipher_test_suite {
122946cc463STadeusz Struk 	struct akcipher_testvec *vecs;
123946cc463STadeusz Struk 	unsigned int count;
124946cc463STadeusz Struk };
125946cc463STadeusz Struk 
126da7f033dSHerbert Xu struct alg_test_desc {
127da7f033dSHerbert Xu 	const char *alg;
128da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
129da7f033dSHerbert Xu 		    u32 type, u32 mask);
130a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
131da7f033dSHerbert Xu 
132da7f033dSHerbert Xu 	union {
133da7f033dSHerbert Xu 		struct aead_test_suite aead;
134da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
135da7f033dSHerbert Xu 		struct comp_test_suite comp;
1368064efb8SGeert Uytterhoeven 		struct pcomp_test_suite pcomp;
137da7f033dSHerbert Xu 		struct hash_test_suite hash;
1387647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
13964d1cdfbSStephan Mueller 		struct drbg_test_suite drbg;
140946cc463STadeusz Struk 		struct akcipher_test_suite akcipher;
141da7f033dSHerbert Xu 	} suite;
142da7f033dSHerbert Xu };
143da7f033dSHerbert Xu 
144da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
145da7f033dSHerbert Xu 
146da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
147da7f033dSHerbert Xu {
148da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
149da7f033dSHerbert Xu 			16, 1,
150da7f033dSHerbert Xu 			buf, len, false);
151da7f033dSHerbert Xu }
152da7f033dSHerbert Xu 
153da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
154da7f033dSHerbert Xu {
155da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
156da7f033dSHerbert Xu 
157da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
158da7f033dSHerbert Xu 		return;
159da7f033dSHerbert Xu 
160da7f033dSHerbert Xu 	res->err = err;
161da7f033dSHerbert Xu 	complete(&res->completion);
162da7f033dSHerbert Xu }
163da7f033dSHerbert Xu 
164f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
165f8b0d4d0SHerbert Xu {
166f8b0d4d0SHerbert Xu 	int i;
167f8b0d4d0SHerbert Xu 
168f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
169f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
170f8b0d4d0SHerbert Xu 		if (!buf[i])
171f8b0d4d0SHerbert Xu 			goto err_free_buf;
172f8b0d4d0SHerbert Xu 	}
173f8b0d4d0SHerbert Xu 
174f8b0d4d0SHerbert Xu 	return 0;
175f8b0d4d0SHerbert Xu 
176f8b0d4d0SHerbert Xu err_free_buf:
177f8b0d4d0SHerbert Xu 	while (i-- > 0)
178f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
179f8b0d4d0SHerbert Xu 
180f8b0d4d0SHerbert Xu 	return -ENOMEM;
181f8b0d4d0SHerbert Xu }
182f8b0d4d0SHerbert Xu 
183f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
184f8b0d4d0SHerbert Xu {
185f8b0d4d0SHerbert Xu 	int i;
186f8b0d4d0SHerbert Xu 
187f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
188f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
189f8b0d4d0SHerbert Xu }
190f8b0d4d0SHerbert Xu 
191d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret)
192a8f1a052SDavid S. Miller {
193a8f1a052SDavid S. Miller 	if (ret == -EINPROGRESS || ret == -EBUSY) {
1948a45ac12SRabin Vincent 		wait_for_completion(&tr->completion);
19516735d02SWolfram Sang 		reinit_completion(&tr->completion);
1968a45ac12SRabin Vincent 		ret = tr->err;
197a8f1a052SDavid S. Miller 	}
198a8f1a052SDavid S. Miller 	return ret;
199a8f1a052SDavid S. Miller }
200a8f1a052SDavid S. Miller 
201da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
202da5ffe11SJussi Kivilinna 		       unsigned int tcount, bool use_digest,
203da5ffe11SJussi Kivilinna 		       const int align_offset)
204da7f033dSHerbert Xu {
205da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
206da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
207da7f033dSHerbert Xu 	struct scatterlist sg[8];
20829b77e5dSHoria Geanta 	char *result;
20929b77e5dSHoria Geanta 	char *key;
210da7f033dSHerbert Xu 	struct ahash_request *req;
211da7f033dSHerbert Xu 	struct tcrypt_result tresult;
212da7f033dSHerbert Xu 	void *hash_buff;
213f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
214f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
215f8b0d4d0SHerbert Xu 
21629b77e5dSHoria Geanta 	result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
21729b77e5dSHoria Geanta 	if (!result)
21829b77e5dSHoria Geanta 		return ret;
21929b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
22029b77e5dSHoria Geanta 	if (!key)
22129b77e5dSHoria Geanta 		goto out_nobuf;
222f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
223f8b0d4d0SHerbert Xu 		goto out_nobuf;
224da7f033dSHerbert Xu 
225da7f033dSHerbert Xu 	init_completion(&tresult.completion);
226da7f033dSHerbert Xu 
227da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
228da7f033dSHerbert Xu 	if (!req) {
229da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
230da7f033dSHerbert Xu 		       "%s\n", algo);
231da7f033dSHerbert Xu 		goto out_noreq;
232da7f033dSHerbert Xu 	}
233da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
234da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
235da7f033dSHerbert Xu 
236a0cfae59SHerbert Xu 	j = 0;
237da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
238a0cfae59SHerbert Xu 		if (template[i].np)
239a0cfae59SHerbert Xu 			continue;
240a0cfae59SHerbert Xu 
241da5ffe11SJussi Kivilinna 		ret = -EINVAL;
242da5ffe11SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
243da5ffe11SJussi Kivilinna 			goto out;
244da5ffe11SJussi Kivilinna 
245a0cfae59SHerbert Xu 		j++;
24629b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
247da7f033dSHerbert Xu 
248da7f033dSHerbert Xu 		hash_buff = xbuf[0];
249da5ffe11SJussi Kivilinna 		hash_buff += align_offset;
250da7f033dSHerbert Xu 
251da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
252da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
253da7f033dSHerbert Xu 
254da7f033dSHerbert Xu 		if (template[i].ksize) {
255da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
25629b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
25729b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
25829b77e5dSHoria Geanta 				       j, algo, template[i].ksize, MAX_KEYLEN);
25929b77e5dSHoria Geanta 				ret = -EINVAL;
26029b77e5dSHoria Geanta 				goto out;
26129b77e5dSHoria Geanta 			}
26229b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
26329b77e5dSHoria Geanta 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
264da7f033dSHerbert Xu 			if (ret) {
265da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
266a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
267da7f033dSHerbert Xu 				       -ret);
268da7f033dSHerbert Xu 				goto out;
269da7f033dSHerbert Xu 			}
270da7f033dSHerbert Xu 		}
271da7f033dSHerbert Xu 
272da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
273a8f1a052SDavid S. Miller 		if (use_digest) {
274d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_digest(req));
275a8f1a052SDavid S. Miller 			if (ret) {
276a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
277a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
278da7f033dSHerbert Xu 				goto out;
279da7f033dSHerbert Xu 			}
280a8f1a052SDavid S. Miller 		} else {
281d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_init(req));
282a8f1a052SDavid S. Miller 			if (ret) {
283a8f1a052SDavid S. Miller 				pr_err("alt: hash: init failed on test %d "
284a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
285a8f1a052SDavid S. Miller 				goto out;
286a8f1a052SDavid S. Miller 			}
287d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_update(req));
288a8f1a052SDavid S. Miller 			if (ret) {
289a8f1a052SDavid S. Miller 				pr_err("alt: hash: update failed on test %d "
290a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
291a8f1a052SDavid S. Miller 				goto out;
292a8f1a052SDavid S. Miller 			}
293d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_final(req));
294a8f1a052SDavid S. Miller 			if (ret) {
295a8f1a052SDavid S. Miller 				pr_err("alt: hash: final failed on test %d "
296a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
297a8f1a052SDavid S. Miller 				goto out;
298a8f1a052SDavid S. Miller 			}
299a8f1a052SDavid S. Miller 		}
300da7f033dSHerbert Xu 
301da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
302da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
303da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
304a0cfae59SHerbert Xu 			       j, algo);
305da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
306da7f033dSHerbert Xu 			ret = -EINVAL;
307da7f033dSHerbert Xu 			goto out;
308da7f033dSHerbert Xu 		}
309da7f033dSHerbert Xu 	}
310da7f033dSHerbert Xu 
311da7f033dSHerbert Xu 	j = 0;
312da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
313da5ffe11SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
314da5ffe11SJussi Kivilinna 		if (align_offset != 0)
315da5ffe11SJussi Kivilinna 			break;
316da5ffe11SJussi Kivilinna 
3175f2b424eSCristian Stoica 		if (!template[i].np)
3185f2b424eSCristian Stoica 			continue;
3195f2b424eSCristian Stoica 
320da7f033dSHerbert Xu 		j++;
32129b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
322da7f033dSHerbert Xu 
323da7f033dSHerbert Xu 		temp = 0;
324da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
325fd57f22aSHerbert Xu 		ret = -EINVAL;
326da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
327fd57f22aSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
328fd57f22aSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
329fd57f22aSHerbert Xu 				goto out;
330da7f033dSHerbert Xu 			sg_set_buf(&sg[k],
331da7f033dSHerbert Xu 				   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
332da7f033dSHerbert Xu 					  offset_in_page(IDX[k]),
333da7f033dSHerbert Xu 					  template[i].plaintext + temp,
334da7f033dSHerbert Xu 					  template[i].tap[k]),
335da7f033dSHerbert Xu 				   template[i].tap[k]);
336da7f033dSHerbert Xu 			temp += template[i].tap[k];
337da7f033dSHerbert Xu 		}
338da7f033dSHerbert Xu 
339da7f033dSHerbert Xu 		if (template[i].ksize) {
34029b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
34129b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
3425f2b424eSCristian Stoica 				       j, algo, template[i].ksize, MAX_KEYLEN);
34329b77e5dSHoria Geanta 				ret = -EINVAL;
34429b77e5dSHoria Geanta 				goto out;
34529b77e5dSHoria Geanta 			}
346da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
34729b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
3485f2b424eSCristian Stoica 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
349da7f033dSHerbert Xu 
350da7f033dSHerbert Xu 			if (ret) {
351da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey "
352da7f033dSHerbert Xu 				       "failed on chunking test %d "
3535f2b424eSCristian Stoica 				       "for %s: ret=%d\n", j, algo, -ret);
354da7f033dSHerbert Xu 				goto out;
355da7f033dSHerbert Xu 			}
356da7f033dSHerbert Xu 		}
357da7f033dSHerbert Xu 
3585f2b424eSCristian Stoica 		ahash_request_set_crypt(req, sg, result, template[i].psize);
359da7f033dSHerbert Xu 		ret = crypto_ahash_digest(req);
360da7f033dSHerbert Xu 		switch (ret) {
361da7f033dSHerbert Xu 		case 0:
362da7f033dSHerbert Xu 			break;
363da7f033dSHerbert Xu 		case -EINPROGRESS:
364da7f033dSHerbert Xu 		case -EBUSY:
3658a45ac12SRabin Vincent 			wait_for_completion(&tresult.completion);
36616735d02SWolfram Sang 			reinit_completion(&tresult.completion);
3678a45ac12SRabin Vincent 			ret = tresult.err;
3688a45ac12SRabin Vincent 			if (!ret)
369da7f033dSHerbert Xu 				break;
370da7f033dSHerbert Xu 			/* fall through */
371da7f033dSHerbert Xu 		default:
372da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: digest failed "
373da7f033dSHerbert Xu 			       "on chunking test %d for %s: "
374da7f033dSHerbert Xu 			       "ret=%d\n", j, algo, -ret);
375da7f033dSHerbert Xu 			goto out;
376da7f033dSHerbert Xu 		}
377da7f033dSHerbert Xu 
378da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
379da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
380da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Chunking test %d "
381da7f033dSHerbert Xu 			       "failed for %s\n", j, algo);
382da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
383da7f033dSHerbert Xu 			ret = -EINVAL;
384da7f033dSHerbert Xu 			goto out;
385da7f033dSHerbert Xu 		}
386da7f033dSHerbert Xu 	}
387da7f033dSHerbert Xu 
388da7f033dSHerbert Xu 	ret = 0;
389da7f033dSHerbert Xu 
390da7f033dSHerbert Xu out:
391da7f033dSHerbert Xu 	ahash_request_free(req);
392da7f033dSHerbert Xu out_noreq:
393f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
394f8b0d4d0SHerbert Xu out_nobuf:
39529b77e5dSHoria Geanta 	kfree(key);
39629b77e5dSHoria Geanta 	kfree(result);
397da7f033dSHerbert Xu 	return ret;
398da7f033dSHerbert Xu }
399da7f033dSHerbert Xu 
400da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
401da5ffe11SJussi Kivilinna 		     unsigned int tcount, bool use_digest)
402da5ffe11SJussi Kivilinna {
403da5ffe11SJussi Kivilinna 	unsigned int alignmask;
404da5ffe11SJussi Kivilinna 	int ret;
405da5ffe11SJussi Kivilinna 
406da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
407da5ffe11SJussi Kivilinna 	if (ret)
408da5ffe11SJussi Kivilinna 		return ret;
409da5ffe11SJussi Kivilinna 
410da5ffe11SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
411da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
412da5ffe11SJussi Kivilinna 	if (ret)
413da5ffe11SJussi Kivilinna 		return ret;
414da5ffe11SJussi Kivilinna 
415da5ffe11SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
416da5ffe11SJussi Kivilinna 	if (alignmask) {
417da5ffe11SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
418da5ffe11SJussi Kivilinna 		ret = __test_hash(tfm, template, tcount, use_digest,
419da5ffe11SJussi Kivilinna 				  alignmask + 1);
420da5ffe11SJussi Kivilinna 		if (ret)
421da5ffe11SJussi Kivilinna 			return ret;
422da5ffe11SJussi Kivilinna 	}
423da5ffe11SJussi Kivilinna 
424da5ffe11SJussi Kivilinna 	return 0;
425da5ffe11SJussi Kivilinna }
426da5ffe11SJussi Kivilinna 
427d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
428d8a32ac2SJussi Kivilinna 		       struct aead_testvec *template, unsigned int tcount,
42958dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
430da7f033dSHerbert Xu {
431da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
432da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
433f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
434da7f033dSHerbert Xu 	char *q;
435da7f033dSHerbert Xu 	char *key;
436da7f033dSHerbert Xu 	struct aead_request *req;
437d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
438d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
439d8a32ac2SJussi Kivilinna 	const char *e, *d;
440da7f033dSHerbert Xu 	struct tcrypt_result result;
441424a5da6SCristian Stoica 	unsigned int authsize, iv_len;
442da7f033dSHerbert Xu 	void *input;
443d8a32ac2SJussi Kivilinna 	void *output;
444da7f033dSHerbert Xu 	void *assoc;
4459bac019dSTadeusz Struk 	char *iv;
446f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
447d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
448f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
449f8b0d4d0SHerbert Xu 
4509bac019dSTadeusz Struk 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
4519bac019dSTadeusz Struk 	if (!iv)
4529bac019dSTadeusz Struk 		return ret;
45329b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
45429b77e5dSHoria Geanta 	if (!key)
45529b77e5dSHoria Geanta 		goto out_noxbuf;
456f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
457f8b0d4d0SHerbert Xu 		goto out_noxbuf;
458f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
459f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
460d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
461d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
462d8a32ac2SJussi Kivilinna 
463d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
4648a525fcdSHerbert Xu 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
465d8a32ac2SJussi Kivilinna 	if (!sg)
466d8a32ac2SJussi Kivilinna 		goto out_nosg;
4678a525fcdSHerbert Xu 	sgout = &sg[16];
468d8a32ac2SJussi Kivilinna 
469d8a32ac2SJussi Kivilinna 	if (diff_dst)
470d8a32ac2SJussi Kivilinna 		d = "-ddst";
471d8a32ac2SJussi Kivilinna 	else
472d8a32ac2SJussi Kivilinna 		d = "";
473d8a32ac2SJussi Kivilinna 
474da7f033dSHerbert Xu 	if (enc == ENCRYPT)
475da7f033dSHerbert Xu 		e = "encryption";
476da7f033dSHerbert Xu 	else
477da7f033dSHerbert Xu 		e = "decryption";
478da7f033dSHerbert Xu 
479da7f033dSHerbert Xu 	init_completion(&result.completion);
480da7f033dSHerbert Xu 
481da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
482da7f033dSHerbert Xu 	if (!req) {
483d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
484d8a32ac2SJussi Kivilinna 		       d, algo);
485da7f033dSHerbert Xu 		goto out;
486da7f033dSHerbert Xu 	}
487da7f033dSHerbert Xu 
488da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
489da7f033dSHerbert Xu 				  tcrypt_complete, &result);
490da7f033dSHerbert Xu 
491da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
49205b1d338SCristian Stoica 		if (template[i].np)
49305b1d338SCristian Stoica 			continue;
49405b1d338SCristian Stoica 
495da7f033dSHerbert Xu 		j++;
496da7f033dSHerbert Xu 
49758dcf548SJussi Kivilinna 		/* some templates have no input data but they will
498da7f033dSHerbert Xu 		 * touch input
499da7f033dSHerbert Xu 		 */
500da7f033dSHerbert Xu 		input = xbuf[0];
50158dcf548SJussi Kivilinna 		input += align_offset;
502da7f033dSHerbert Xu 		assoc = axbuf[0];
503da7f033dSHerbert Xu 
504fd57f22aSHerbert Xu 		ret = -EINVAL;
50558dcf548SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].ilen >
50658dcf548SJussi Kivilinna 			    PAGE_SIZE || template[i].alen > PAGE_SIZE))
507fd57f22aSHerbert Xu 			goto out;
508fd57f22aSHerbert Xu 
509da7f033dSHerbert Xu 		memcpy(input, template[i].input, template[i].ilen);
510da7f033dSHerbert Xu 		memcpy(assoc, template[i].assoc, template[i].alen);
511424a5da6SCristian Stoica 		iv_len = crypto_aead_ivsize(tfm);
512da7f033dSHerbert Xu 		if (template[i].iv)
513424a5da6SCristian Stoica 			memcpy(iv, template[i].iv, iv_len);
514da7f033dSHerbert Xu 		else
515424a5da6SCristian Stoica 			memset(iv, 0, iv_len);
516da7f033dSHerbert Xu 
517da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
518da7f033dSHerbert Xu 		if (template[i].wk)
51905b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
520da7f033dSHerbert Xu 
52129b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
52229b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
52329b77e5dSHoria Geanta 			       d, j, algo, template[i].klen,
52429b77e5dSHoria Geanta 			       MAX_KEYLEN);
52529b77e5dSHoria Geanta 			ret = -EINVAL;
52629b77e5dSHoria Geanta 			goto out;
52729b77e5dSHoria Geanta 		}
52829b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
529da7f033dSHerbert Xu 
53005b1d338SCristian Stoica 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
531da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
532d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
533d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
534da7f033dSHerbert Xu 			goto out;
535da7f033dSHerbert Xu 		} else if (ret)
536da7f033dSHerbert Xu 			continue;
537da7f033dSHerbert Xu 
538da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
539da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
540da7f033dSHerbert Xu 		if (ret) {
541d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
542d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
543da7f033dSHerbert Xu 			goto out;
544da7f033dSHerbert Xu 		}
545da7f033dSHerbert Xu 
5468a525fcdSHerbert Xu 		k = !!template[i].alen;
5478a525fcdSHerbert Xu 		sg_init_table(sg, k + 1);
5488a525fcdSHerbert Xu 		sg_set_buf(&sg[0], assoc, template[i].alen);
5498a525fcdSHerbert Xu 		sg_set_buf(&sg[k], input,
55005b1d338SCristian Stoica 			   template[i].ilen + (enc ? authsize : 0));
551d8a32ac2SJussi Kivilinna 		output = input;
552d8a32ac2SJussi Kivilinna 
5538a525fcdSHerbert Xu 		if (diff_dst) {
5548a525fcdSHerbert Xu 			sg_init_table(sgout, k + 1);
5558a525fcdSHerbert Xu 			sg_set_buf(&sgout[0], assoc, template[i].alen);
5568a525fcdSHerbert Xu 
5578a525fcdSHerbert Xu 			output = xoutbuf[0];
5588a525fcdSHerbert Xu 			output += align_offset;
5598a525fcdSHerbert Xu 			sg_set_buf(&sgout[k], output,
5608a525fcdSHerbert Xu 				   template[i].rlen + (enc ? 0 : authsize));
5618a525fcdSHerbert Xu 		}
562da7f033dSHerbert Xu 
563d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
564da7f033dSHerbert Xu 				       template[i].ilen, iv);
565da7f033dSHerbert Xu 
5668a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
567da7f033dSHerbert Xu 
56805b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
569da7f033dSHerbert Xu 
570da7f033dSHerbert Xu 		switch (ret) {
571da7f033dSHerbert Xu 		case 0:
572e44a1b44SJarod Wilson 			if (template[i].novrfy) {
573e44a1b44SJarod Wilson 				/* verification was supposed to fail */
574d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
575d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
576e44a1b44SJarod Wilson 				/* so really, we got a bad message */
577e44a1b44SJarod Wilson 				ret = -EBADMSG;
578e44a1b44SJarod Wilson 				goto out;
579e44a1b44SJarod Wilson 			}
580da7f033dSHerbert Xu 			break;
581da7f033dSHerbert Xu 		case -EINPROGRESS:
582da7f033dSHerbert Xu 		case -EBUSY:
5838a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
58416735d02SWolfram Sang 			reinit_completion(&result.completion);
5858a45ac12SRabin Vincent 			ret = result.err;
5868a45ac12SRabin Vincent 			if (!ret)
587da7f033dSHerbert Xu 				break;
588e44a1b44SJarod Wilson 		case -EBADMSG:
589e44a1b44SJarod Wilson 			if (template[i].novrfy)
590e44a1b44SJarod Wilson 				/* verification failure was expected */
591e44a1b44SJarod Wilson 				continue;
592da7f033dSHerbert Xu 			/* fall through */
593da7f033dSHerbert Xu 		default:
594d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
595d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
596da7f033dSHerbert Xu 			goto out;
597da7f033dSHerbert Xu 		}
598da7f033dSHerbert Xu 
599d8a32ac2SJussi Kivilinna 		q = output;
600da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
601d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Test %d failed on %s for %s\n",
602d8a32ac2SJussi Kivilinna 			       d, j, e, algo);
603da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
604da7f033dSHerbert Xu 			ret = -EINVAL;
605da7f033dSHerbert Xu 			goto out;
606da7f033dSHerbert Xu 		}
607da7f033dSHerbert Xu 	}
608da7f033dSHerbert Xu 
609da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
61058dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
61158dcf548SJussi Kivilinna 		if (align_offset != 0)
61258dcf548SJussi Kivilinna 			break;
61358dcf548SJussi Kivilinna 
61405b1d338SCristian Stoica 		if (!template[i].np)
61505b1d338SCristian Stoica 			continue;
61605b1d338SCristian Stoica 
617da7f033dSHerbert Xu 		j++;
618da7f033dSHerbert Xu 
619da7f033dSHerbert Xu 		if (template[i].iv)
620da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
621da7f033dSHerbert Xu 		else
622da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
623da7f033dSHerbert Xu 
624da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
625da7f033dSHerbert Xu 		if (template[i].wk)
62605b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
62729b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
62829b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
62905b1d338SCristian Stoica 			       d, j, algo, template[i].klen, MAX_KEYLEN);
63029b77e5dSHoria Geanta 			ret = -EINVAL;
63129b77e5dSHoria Geanta 			goto out;
63229b77e5dSHoria Geanta 		}
63329b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
634da7f033dSHerbert Xu 
635da7f033dSHerbert Xu 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
636da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
637d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
638d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
639da7f033dSHerbert Xu 			goto out;
640da7f033dSHerbert Xu 		} else if (ret)
641da7f033dSHerbert Xu 			continue;
642da7f033dSHerbert Xu 
643da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
644da7f033dSHerbert Xu 
645da7f033dSHerbert Xu 		ret = -EINVAL;
6468a525fcdSHerbert Xu 		sg_init_table(sg, template[i].anp + template[i].np);
647d8a32ac2SJussi Kivilinna 		if (diff_dst)
6488a525fcdSHerbert Xu 			sg_init_table(sgout, template[i].anp + template[i].np);
6498a525fcdSHerbert Xu 
6508a525fcdSHerbert Xu 		ret = -EINVAL;
6518a525fcdSHerbert Xu 		for (k = 0, temp = 0; k < template[i].anp; k++) {
6528a525fcdSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
6538a525fcdSHerbert Xu 				    template[i].atap[k] > PAGE_SIZE))
6548a525fcdSHerbert Xu 				goto out;
6558a525fcdSHerbert Xu 			sg_set_buf(&sg[k],
6568a525fcdSHerbert Xu 				   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
6578a525fcdSHerbert Xu 					  offset_in_page(IDX[k]),
6588a525fcdSHerbert Xu 					  template[i].assoc + temp,
6598a525fcdSHerbert Xu 					  template[i].atap[k]),
6608a525fcdSHerbert Xu 				   template[i].atap[k]);
6618a525fcdSHerbert Xu 			if (diff_dst)
6628a525fcdSHerbert Xu 				sg_set_buf(&sgout[k],
6638a525fcdSHerbert Xu 					   axbuf[IDX[k] >> PAGE_SHIFT] +
6648a525fcdSHerbert Xu 					   offset_in_page(IDX[k]),
6658a525fcdSHerbert Xu 					   template[i].atap[k]);
6668a525fcdSHerbert Xu 			temp += template[i].atap[k];
6678a525fcdSHerbert Xu 		}
6688a525fcdSHerbert Xu 
669da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
670da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
671da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
672da7f033dSHerbert Xu 				goto out;
673da7f033dSHerbert Xu 
67405b1d338SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
67505b1d338SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
6768a525fcdSHerbert Xu 			sg_set_buf(&sg[template[i].anp + k],
6778a525fcdSHerbert Xu 				   q, template[i].tap[k]);
678d8a32ac2SJussi Kivilinna 
679d8a32ac2SJussi Kivilinna 			if (diff_dst) {
680d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
681d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
682d8a32ac2SJussi Kivilinna 
683d8a32ac2SJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
684d8a32ac2SJussi Kivilinna 
6858a525fcdSHerbert Xu 				sg_set_buf(&sgout[template[i].anp + k],
6868a525fcdSHerbert Xu 					   q, template[i].tap[k]);
687d8a32ac2SJussi Kivilinna 			}
688d8a32ac2SJussi Kivilinna 
6898ec25c51SHoria Geanta 			n = template[i].tap[k];
6908ec25c51SHoria Geanta 			if (k == template[i].np - 1 && enc)
6918ec25c51SHoria Geanta 				n += authsize;
6928ec25c51SHoria Geanta 			if (offset_in_page(q) + n < PAGE_SIZE)
6938ec25c51SHoria Geanta 				q[n] = 0;
6948ec25c51SHoria Geanta 
695da7f033dSHerbert Xu 			temp += template[i].tap[k];
696da7f033dSHerbert Xu 		}
697da7f033dSHerbert Xu 
698da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
699da7f033dSHerbert Xu 		if (ret) {
700d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
701d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
702da7f033dSHerbert Xu 			goto out;
703da7f033dSHerbert Xu 		}
704da7f033dSHerbert Xu 
705da7f033dSHerbert Xu 		if (enc) {
7068a525fcdSHerbert Xu 			if (WARN_ON(sg[template[i].anp + k - 1].offset +
7078a525fcdSHerbert Xu 				    sg[template[i].anp + k - 1].length +
7088a525fcdSHerbert Xu 				    authsize > PAGE_SIZE)) {
709da7f033dSHerbert Xu 				ret = -EINVAL;
710da7f033dSHerbert Xu 				goto out;
711da7f033dSHerbert Xu 			}
712da7f033dSHerbert Xu 
713d8a32ac2SJussi Kivilinna 			if (diff_dst)
7148a525fcdSHerbert Xu 				sgout[template[i].anp + k - 1].length +=
7158a525fcdSHerbert Xu 					authsize;
7168a525fcdSHerbert Xu 			sg[template[i].anp + k - 1].length += authsize;
717da7f033dSHerbert Xu 		}
718da7f033dSHerbert Xu 
719d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
720da7f033dSHerbert Xu 				       template[i].ilen,
721da7f033dSHerbert Xu 				       iv);
722da7f033dSHerbert Xu 
7238a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
724da7f033dSHerbert Xu 
72505b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
726da7f033dSHerbert Xu 
727da7f033dSHerbert Xu 		switch (ret) {
728da7f033dSHerbert Xu 		case 0:
729e44a1b44SJarod Wilson 			if (template[i].novrfy) {
730e44a1b44SJarod Wilson 				/* verification was supposed to fail */
731d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
732d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
733e44a1b44SJarod Wilson 				/* so really, we got a bad message */
734e44a1b44SJarod Wilson 				ret = -EBADMSG;
735e44a1b44SJarod Wilson 				goto out;
736e44a1b44SJarod Wilson 			}
737da7f033dSHerbert Xu 			break;
738da7f033dSHerbert Xu 		case -EINPROGRESS:
739da7f033dSHerbert Xu 		case -EBUSY:
7408a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
74116735d02SWolfram Sang 			reinit_completion(&result.completion);
7428a45ac12SRabin Vincent 			ret = result.err;
7438a45ac12SRabin Vincent 			if (!ret)
744da7f033dSHerbert Xu 				break;
745e44a1b44SJarod Wilson 		case -EBADMSG:
746e44a1b44SJarod Wilson 			if (template[i].novrfy)
747e44a1b44SJarod Wilson 				/* verification failure was expected */
748e44a1b44SJarod Wilson 				continue;
749da7f033dSHerbert Xu 			/* fall through */
750da7f033dSHerbert Xu 		default:
751d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
752d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
753da7f033dSHerbert Xu 			goto out;
754da7f033dSHerbert Xu 		}
755da7f033dSHerbert Xu 
756da7f033dSHerbert Xu 		ret = -EINVAL;
757da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
758d8a32ac2SJussi Kivilinna 			if (diff_dst)
759d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
760d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
761d8a32ac2SJussi Kivilinna 			else
762da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
763da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
764da7f033dSHerbert Xu 
765da7f033dSHerbert Xu 			n = template[i].tap[k];
766da7f033dSHerbert Xu 			if (k == template[i].np - 1)
767da7f033dSHerbert Xu 				n += enc ? authsize : -authsize;
768da7f033dSHerbert Xu 
769da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp, n)) {
770d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
771d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo);
772da7f033dSHerbert Xu 				hexdump(q, n);
773da7f033dSHerbert Xu 				goto out;
774da7f033dSHerbert Xu 			}
775da7f033dSHerbert Xu 
776da7f033dSHerbert Xu 			q += n;
777da7f033dSHerbert Xu 			if (k == template[i].np - 1 && !enc) {
778d8a32ac2SJussi Kivilinna 				if (!diff_dst &&
779d8a32ac2SJussi Kivilinna 					memcmp(q, template[i].input +
780da7f033dSHerbert Xu 					      temp + n, authsize))
781da7f033dSHerbert Xu 					n = authsize;
782da7f033dSHerbert Xu 				else
783da7f033dSHerbert Xu 					n = 0;
784da7f033dSHerbert Xu 			} else {
78505b1d338SCristian Stoica 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
786da7f033dSHerbert Xu 					;
787da7f033dSHerbert Xu 			}
788da7f033dSHerbert Xu 			if (n) {
789d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
790d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo, n);
791da7f033dSHerbert Xu 				hexdump(q, n);
792da7f033dSHerbert Xu 				goto out;
793da7f033dSHerbert Xu 			}
794da7f033dSHerbert Xu 
795da7f033dSHerbert Xu 			temp += template[i].tap[k];
796da7f033dSHerbert Xu 		}
797da7f033dSHerbert Xu 	}
798da7f033dSHerbert Xu 
799da7f033dSHerbert Xu 	ret = 0;
800da7f033dSHerbert Xu 
801da7f033dSHerbert Xu out:
802da7f033dSHerbert Xu 	aead_request_free(req);
803d8a32ac2SJussi Kivilinna 	kfree(sg);
804d8a32ac2SJussi Kivilinna out_nosg:
805d8a32ac2SJussi Kivilinna 	if (diff_dst)
806d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
807d8a32ac2SJussi Kivilinna out_nooutbuf:
808f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
809f8b0d4d0SHerbert Xu out_noaxbuf:
810f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
811f8b0d4d0SHerbert Xu out_noxbuf:
81229b77e5dSHoria Geanta 	kfree(key);
8139bac019dSTadeusz Struk 	kfree(iv);
814da7f033dSHerbert Xu 	return ret;
815da7f033dSHerbert Xu }
816da7f033dSHerbert Xu 
817d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
818d8a32ac2SJussi Kivilinna 		     struct aead_testvec *template, unsigned int tcount)
819d8a32ac2SJussi Kivilinna {
82058dcf548SJussi Kivilinna 	unsigned int alignmask;
821d8a32ac2SJussi Kivilinna 	int ret;
822d8a32ac2SJussi Kivilinna 
823d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
82458dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
825d8a32ac2SJussi Kivilinna 	if (ret)
826d8a32ac2SJussi Kivilinna 		return ret;
827d8a32ac2SJussi Kivilinna 
828d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
82958dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
83058dcf548SJussi Kivilinna 	if (ret)
83158dcf548SJussi Kivilinna 		return ret;
83258dcf548SJussi Kivilinna 
83358dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
83458dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
83558dcf548SJussi Kivilinna 	if (ret)
83658dcf548SJussi Kivilinna 		return ret;
83758dcf548SJussi Kivilinna 
83858dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
83958dcf548SJussi Kivilinna 	if (alignmask) {
84058dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
84158dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
84258dcf548SJussi Kivilinna 				  alignmask + 1);
84358dcf548SJussi Kivilinna 		if (ret)
84458dcf548SJussi Kivilinna 			return ret;
84558dcf548SJussi Kivilinna 	}
84658dcf548SJussi Kivilinna 
84758dcf548SJussi Kivilinna 	return 0;
848d8a32ac2SJussi Kivilinna }
849d8a32ac2SJussi Kivilinna 
8501aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
8511aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
8521aa4ecd9SHerbert Xu {
8531aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
8541aa4ecd9SHerbert Xu 	unsigned int i, j, k;
8551aa4ecd9SHerbert Xu 	char *q;
8561aa4ecd9SHerbert Xu 	const char *e;
8571aa4ecd9SHerbert Xu 	void *data;
858f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
859f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
860f8b0d4d0SHerbert Xu 
861f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
862f8b0d4d0SHerbert Xu 		goto out_nobuf;
8631aa4ecd9SHerbert Xu 
8641aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
8651aa4ecd9SHerbert Xu 	        e = "encryption";
8661aa4ecd9SHerbert Xu 	else
8671aa4ecd9SHerbert Xu 		e = "decryption";
8681aa4ecd9SHerbert Xu 
8691aa4ecd9SHerbert Xu 	j = 0;
8701aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
8711aa4ecd9SHerbert Xu 		if (template[i].np)
8721aa4ecd9SHerbert Xu 			continue;
8731aa4ecd9SHerbert Xu 
8741aa4ecd9SHerbert Xu 		j++;
8751aa4ecd9SHerbert Xu 
876fd57f22aSHerbert Xu 		ret = -EINVAL;
877fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
878fd57f22aSHerbert Xu 			goto out;
879fd57f22aSHerbert Xu 
8801aa4ecd9SHerbert Xu 		data = xbuf[0];
8811aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
8821aa4ecd9SHerbert Xu 
8831aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
8841aa4ecd9SHerbert Xu 		if (template[i].wk)
8851aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
8861aa4ecd9SHerbert Xu 
8871aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
8881aa4ecd9SHerbert Xu 					   template[i].klen);
8891aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
8901aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
8911aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
8921aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
8931aa4ecd9SHerbert Xu 			goto out;
8941aa4ecd9SHerbert Xu 		} else if (ret)
8951aa4ecd9SHerbert Xu 			continue;
8961aa4ecd9SHerbert Xu 
8971aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
8981aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
8991aa4ecd9SHerbert Xu 			if (enc)
9001aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
9011aa4ecd9SHerbert Xu 							  data + k);
9021aa4ecd9SHerbert Xu 			else
9031aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
9041aa4ecd9SHerbert Xu 							  data + k);
9051aa4ecd9SHerbert Xu 		}
9061aa4ecd9SHerbert Xu 
9071aa4ecd9SHerbert Xu 		q = data;
9081aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
9091aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
9101aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
9111aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
9121aa4ecd9SHerbert Xu 			ret = -EINVAL;
9131aa4ecd9SHerbert Xu 			goto out;
9141aa4ecd9SHerbert Xu 		}
9151aa4ecd9SHerbert Xu 	}
9161aa4ecd9SHerbert Xu 
9171aa4ecd9SHerbert Xu 	ret = 0;
9181aa4ecd9SHerbert Xu 
9191aa4ecd9SHerbert Xu out:
920f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
921f8b0d4d0SHerbert Xu out_nobuf:
9221aa4ecd9SHerbert Xu 	return ret;
9231aa4ecd9SHerbert Xu }
9241aa4ecd9SHerbert Xu 
92512773d93SHerbert Xu static int __test_skcipher(struct crypto_skcipher *tfm, int enc,
92608d6af8cSJussi Kivilinna 			   struct cipher_testvec *template, unsigned int tcount,
9273a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
928da7f033dSHerbert Xu {
929da7f033dSHerbert Xu 	const char *algo =
93012773d93SHerbert Xu 		crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm));
931da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
932da7f033dSHerbert Xu 	char *q;
93312773d93SHerbert Xu 	struct skcipher_request *req;
934da7f033dSHerbert Xu 	struct scatterlist sg[8];
93508d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
93608d6af8cSJussi Kivilinna 	const char *e, *d;
937da7f033dSHerbert Xu 	struct tcrypt_result result;
938da7f033dSHerbert Xu 	void *data;
939da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
940f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
94108d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
942f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
94384cba178SAndrey Ryabinin 	unsigned int ivsize = crypto_skcipher_ivsize(tfm);
944f8b0d4d0SHerbert Xu 
945f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
946f8b0d4d0SHerbert Xu 		goto out_nobuf;
947da7f033dSHerbert Xu 
94808d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
94908d6af8cSJussi Kivilinna 		goto out_nooutbuf;
95008d6af8cSJussi Kivilinna 
95108d6af8cSJussi Kivilinna 	if (diff_dst)
95208d6af8cSJussi Kivilinna 		d = "-ddst";
95308d6af8cSJussi Kivilinna 	else
95408d6af8cSJussi Kivilinna 		d = "";
95508d6af8cSJussi Kivilinna 
956da7f033dSHerbert Xu 	if (enc == ENCRYPT)
957da7f033dSHerbert Xu 	        e = "encryption";
958da7f033dSHerbert Xu 	else
959da7f033dSHerbert Xu 		e = "decryption";
960da7f033dSHerbert Xu 
961da7f033dSHerbert Xu 	init_completion(&result.completion);
962da7f033dSHerbert Xu 
96312773d93SHerbert Xu 	req = skcipher_request_alloc(tfm, GFP_KERNEL);
964da7f033dSHerbert Xu 	if (!req) {
96508d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
96608d6af8cSJussi Kivilinna 		       d, algo);
967da7f033dSHerbert Xu 		goto out;
968da7f033dSHerbert Xu 	}
969da7f033dSHerbert Xu 
97012773d93SHerbert Xu 	skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
971da7f033dSHerbert Xu 				      tcrypt_complete, &result);
972da7f033dSHerbert Xu 
973da7f033dSHerbert Xu 	j = 0;
974da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
975bbb9a7ddSCristian Stoica 		if (template[i].np && !template[i].also_non_np)
976bbb9a7ddSCristian Stoica 			continue;
977bbb9a7ddSCristian Stoica 
978da7f033dSHerbert Xu 		if (template[i].iv)
97984cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
980da7f033dSHerbert Xu 		else
981da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
982da7f033dSHerbert Xu 
983da7f033dSHerbert Xu 		j++;
984fd57f22aSHerbert Xu 		ret = -EINVAL;
985a1aa44a2SCristian Stoica 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
986fd57f22aSHerbert Xu 			goto out;
987fd57f22aSHerbert Xu 
988da7f033dSHerbert Xu 		data = xbuf[0];
9893a338f20SJussi Kivilinna 		data += align_offset;
990da7f033dSHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
991da7f033dSHerbert Xu 
99212773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
993da7f033dSHerbert Xu 		if (template[i].wk)
99412773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
99512773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
996da7f033dSHerbert Xu 
99712773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
998da7f033dSHerbert Xu 					     template[i].klen);
999da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
100008d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
100112773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1002da7f033dSHerbert Xu 			goto out;
1003da7f033dSHerbert Xu 		} else if (ret)
1004da7f033dSHerbert Xu 			continue;
1005da7f033dSHerbert Xu 
1006da7f033dSHerbert Xu 		sg_init_one(&sg[0], data, template[i].ilen);
100708d6af8cSJussi Kivilinna 		if (diff_dst) {
100808d6af8cSJussi Kivilinna 			data = xoutbuf[0];
10093a338f20SJussi Kivilinna 			data += align_offset;
101008d6af8cSJussi Kivilinna 			sg_init_one(&sgout[0], data, template[i].ilen);
101108d6af8cSJussi Kivilinna 		}
1012da7f033dSHerbert Xu 
101312773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1014da7f033dSHerbert Xu 					   template[i].ilen, iv);
101512773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
101612773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1017da7f033dSHerbert Xu 
1018da7f033dSHerbert Xu 		switch (ret) {
1019da7f033dSHerbert Xu 		case 0:
1020da7f033dSHerbert Xu 			break;
1021da7f033dSHerbert Xu 		case -EINPROGRESS:
1022da7f033dSHerbert Xu 		case -EBUSY:
10238a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
102416735d02SWolfram Sang 			reinit_completion(&result.completion);
10258a45ac12SRabin Vincent 			ret = result.err;
10268a45ac12SRabin Vincent 			if (!ret)
1027da7f033dSHerbert Xu 				break;
1028da7f033dSHerbert Xu 			/* fall through */
1029da7f033dSHerbert Xu 		default:
103008d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
103108d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1032da7f033dSHerbert Xu 			goto out;
1033da7f033dSHerbert Xu 		}
1034da7f033dSHerbert Xu 
1035da7f033dSHerbert Xu 		q = data;
1036da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
103708d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: Test %d failed on %s for %s\n",
103808d6af8cSJussi Kivilinna 			       d, j, e, algo);
1039da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
1040da7f033dSHerbert Xu 			ret = -EINVAL;
1041da7f033dSHerbert Xu 			goto out;
1042da7f033dSHerbert Xu 		}
1043da7f033dSHerbert Xu 	}
1044da7f033dSHerbert Xu 
1045da7f033dSHerbert Xu 	j = 0;
1046da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
10473a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
10483a338f20SJussi Kivilinna 		if (align_offset != 0)
10493a338f20SJussi Kivilinna 			break;
1050da7f033dSHerbert Xu 
1051bbb9a7ddSCristian Stoica 		if (!template[i].np)
1052bbb9a7ddSCristian Stoica 			continue;
1053bbb9a7ddSCristian Stoica 
1054da7f033dSHerbert Xu 		if (template[i].iv)
105584cba178SAndrey Ryabinin 			memcpy(iv, template[i].iv, ivsize);
1056da7f033dSHerbert Xu 		else
1057da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1058da7f033dSHerbert Xu 
1059da7f033dSHerbert Xu 		j++;
106012773d93SHerbert Xu 		crypto_skcipher_clear_flags(tfm, ~0);
1061da7f033dSHerbert Xu 		if (template[i].wk)
106212773d93SHerbert Xu 			crypto_skcipher_set_flags(tfm,
106312773d93SHerbert Xu 						  CRYPTO_TFM_REQ_WEAK_KEY);
1064da7f033dSHerbert Xu 
106512773d93SHerbert Xu 		ret = crypto_skcipher_setkey(tfm, template[i].key,
1066da7f033dSHerbert Xu 					     template[i].klen);
1067da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
106808d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
106912773d93SHerbert Xu 			       d, j, algo, crypto_skcipher_get_flags(tfm));
1070da7f033dSHerbert Xu 			goto out;
1071da7f033dSHerbert Xu 		} else if (ret)
1072da7f033dSHerbert Xu 			continue;
1073da7f033dSHerbert Xu 
1074da7f033dSHerbert Xu 		temp = 0;
1075da7f033dSHerbert Xu 		ret = -EINVAL;
1076da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
107708d6af8cSJussi Kivilinna 		if (diff_dst)
107808d6af8cSJussi Kivilinna 			sg_init_table(sgout, template[i].np);
1079da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
1080da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
1081da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
1082da7f033dSHerbert Xu 				goto out;
1083da7f033dSHerbert Xu 
1084a1aa44a2SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1085da7f033dSHerbert Xu 
1086a1aa44a2SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1087da7f033dSHerbert Xu 
1088a1aa44a2SCristian Stoica 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1089da7f033dSHerbert Xu 				q[template[i].tap[k]] = 0;
1090da7f033dSHerbert Xu 
1091da7f033dSHerbert Xu 			sg_set_buf(&sg[k], q, template[i].tap[k]);
109208d6af8cSJussi Kivilinna 			if (diff_dst) {
109308d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
109408d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
109508d6af8cSJussi Kivilinna 
1096a1aa44a2SCristian Stoica 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
109708d6af8cSJussi Kivilinna 
109808d6af8cSJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
109908d6af8cSJussi Kivilinna 				if (offset_in_page(q) +
110008d6af8cSJussi Kivilinna 				    template[i].tap[k] < PAGE_SIZE)
110108d6af8cSJussi Kivilinna 					q[template[i].tap[k]] = 0;
110208d6af8cSJussi Kivilinna 			}
1103da7f033dSHerbert Xu 
1104da7f033dSHerbert Xu 			temp += template[i].tap[k];
1105da7f033dSHerbert Xu 		}
1106da7f033dSHerbert Xu 
110712773d93SHerbert Xu 		skcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1108da7f033dSHerbert Xu 					   template[i].ilen, iv);
1109da7f033dSHerbert Xu 
111012773d93SHerbert Xu 		ret = enc ? crypto_skcipher_encrypt(req) :
111112773d93SHerbert Xu 			    crypto_skcipher_decrypt(req);
1112da7f033dSHerbert Xu 
1113da7f033dSHerbert Xu 		switch (ret) {
1114da7f033dSHerbert Xu 		case 0:
1115da7f033dSHerbert Xu 			break;
1116da7f033dSHerbert Xu 		case -EINPROGRESS:
1117da7f033dSHerbert Xu 		case -EBUSY:
11188a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
111916735d02SWolfram Sang 			reinit_completion(&result.completion);
11208a45ac12SRabin Vincent 			ret = result.err;
11218a45ac12SRabin Vincent 			if (!ret)
1122da7f033dSHerbert Xu 				break;
1123da7f033dSHerbert Xu 			/* fall through */
1124da7f033dSHerbert Xu 		default:
112508d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
112608d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1127da7f033dSHerbert Xu 			goto out;
1128da7f033dSHerbert Xu 		}
1129da7f033dSHerbert Xu 
1130da7f033dSHerbert Xu 		temp = 0;
1131da7f033dSHerbert Xu 		ret = -EINVAL;
1132da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
113308d6af8cSJussi Kivilinna 			if (diff_dst)
113408d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
113508d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
113608d6af8cSJussi Kivilinna 			else
1137da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1138da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1139da7f033dSHerbert Xu 
1140da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp,
1141da7f033dSHerbert Xu 				   template[i].tap[k])) {
114208d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
114308d6af8cSJussi Kivilinna 				       d, j, e, k, algo);
1144da7f033dSHerbert Xu 				hexdump(q, template[i].tap[k]);
1145da7f033dSHerbert Xu 				goto out;
1146da7f033dSHerbert Xu 			}
1147da7f033dSHerbert Xu 
1148da7f033dSHerbert Xu 			q += template[i].tap[k];
1149da7f033dSHerbert Xu 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1150da7f033dSHerbert Xu 				;
1151da7f033dSHerbert Xu 			if (n) {
115208d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
115308d6af8cSJussi Kivilinna 				       d, j, e, k, algo, n);
1154da7f033dSHerbert Xu 				hexdump(q, n);
1155da7f033dSHerbert Xu 				goto out;
1156da7f033dSHerbert Xu 			}
1157da7f033dSHerbert Xu 			temp += template[i].tap[k];
1158da7f033dSHerbert Xu 		}
1159da7f033dSHerbert Xu 	}
1160da7f033dSHerbert Xu 
1161da7f033dSHerbert Xu 	ret = 0;
1162da7f033dSHerbert Xu 
1163da7f033dSHerbert Xu out:
116412773d93SHerbert Xu 	skcipher_request_free(req);
116508d6af8cSJussi Kivilinna 	if (diff_dst)
116608d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
116708d6af8cSJussi Kivilinna out_nooutbuf:
1168f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1169f8b0d4d0SHerbert Xu out_nobuf:
1170da7f033dSHerbert Xu 	return ret;
1171da7f033dSHerbert Xu }
1172da7f033dSHerbert Xu 
117312773d93SHerbert Xu static int test_skcipher(struct crypto_skcipher *tfm, int enc,
117408d6af8cSJussi Kivilinna 			 struct cipher_testvec *template, unsigned int tcount)
117508d6af8cSJussi Kivilinna {
11763a338f20SJussi Kivilinna 	unsigned int alignmask;
117708d6af8cSJussi Kivilinna 	int ret;
117808d6af8cSJussi Kivilinna 
117908d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
11803a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
118108d6af8cSJussi Kivilinna 	if (ret)
118208d6af8cSJussi Kivilinna 		return ret;
118308d6af8cSJussi Kivilinna 
118408d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
11853a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
11863a338f20SJussi Kivilinna 	if (ret)
11873a338f20SJussi Kivilinna 		return ret;
11883a338f20SJussi Kivilinna 
11893a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
11903a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
11913a338f20SJussi Kivilinna 	if (ret)
11923a338f20SJussi Kivilinna 		return ret;
11933a338f20SJussi Kivilinna 
11943a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
11953a338f20SJussi Kivilinna 	if (alignmask) {
11963a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
11973a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
11983a338f20SJussi Kivilinna 				      alignmask + 1);
11993a338f20SJussi Kivilinna 		if (ret)
12003a338f20SJussi Kivilinna 			return ret;
12013a338f20SJussi Kivilinna 	}
12023a338f20SJussi Kivilinna 
12033a338f20SJussi Kivilinna 	return 0;
120408d6af8cSJussi Kivilinna }
120508d6af8cSJussi Kivilinna 
1206da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1207da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1208da7f033dSHerbert Xu {
1209da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1210da7f033dSHerbert Xu 	unsigned int i;
1211da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1212da7f033dSHerbert Xu 	int ret;
1213da7f033dSHerbert Xu 
1214da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1215c79cf910SGeert Uytterhoeven 		int ilen;
1216c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1217da7f033dSHerbert Xu 
1218da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1219da7f033dSHerbert Xu 
1220da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1221da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1222da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1223da7f033dSHerbert Xu 		if (ret) {
1224da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1225da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1226da7f033dSHerbert Xu 			       -ret);
1227da7f033dSHerbert Xu 			goto out;
1228da7f033dSHerbert Xu 		}
1229da7f033dSHerbert Xu 
1230b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1231b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1232b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1233b812eb00SGeert Uytterhoeven 			       dlen);
1234b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1235b812eb00SGeert Uytterhoeven 			goto out;
1236b812eb00SGeert Uytterhoeven 		}
1237b812eb00SGeert Uytterhoeven 
1238da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1239da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1240da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1241da7f033dSHerbert Xu 			hexdump(result, dlen);
1242da7f033dSHerbert Xu 			ret = -EINVAL;
1243da7f033dSHerbert Xu 			goto out;
1244da7f033dSHerbert Xu 		}
1245da7f033dSHerbert Xu 	}
1246da7f033dSHerbert Xu 
1247da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1248c79cf910SGeert Uytterhoeven 		int ilen;
1249c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1250da7f033dSHerbert Xu 
1251da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1252da7f033dSHerbert Xu 
1253da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1254da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1255da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1256da7f033dSHerbert Xu 		if (ret) {
1257da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1258da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1259da7f033dSHerbert Xu 			       -ret);
1260da7f033dSHerbert Xu 			goto out;
1261da7f033dSHerbert Xu 		}
1262da7f033dSHerbert Xu 
1263b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1264b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1265b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1266b812eb00SGeert Uytterhoeven 			       dlen);
1267b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1268b812eb00SGeert Uytterhoeven 			goto out;
1269b812eb00SGeert Uytterhoeven 		}
1270b812eb00SGeert Uytterhoeven 
1271da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1272da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1273da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1274da7f033dSHerbert Xu 			hexdump(result, dlen);
1275da7f033dSHerbert Xu 			ret = -EINVAL;
1276da7f033dSHerbert Xu 			goto out;
1277da7f033dSHerbert Xu 		}
1278da7f033dSHerbert Xu 	}
1279da7f033dSHerbert Xu 
1280da7f033dSHerbert Xu 	ret = 0;
1281da7f033dSHerbert Xu 
1282da7f033dSHerbert Xu out:
1283da7f033dSHerbert Xu 	return ret;
1284da7f033dSHerbert Xu }
1285da7f033dSHerbert Xu 
12868064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm,
12878064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *ctemplate,
12888064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *dtemplate, int ctcount,
12898064efb8SGeert Uytterhoeven 		      int dtcount)
12908064efb8SGeert Uytterhoeven {
12918064efb8SGeert Uytterhoeven 	const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
12928064efb8SGeert Uytterhoeven 	unsigned int i;
12938064efb8SGeert Uytterhoeven 	char result[COMP_BUF_SIZE];
12943ce858cbSGeert Uytterhoeven 	int res;
12958064efb8SGeert Uytterhoeven 
12968064efb8SGeert Uytterhoeven 	for (i = 0; i < ctcount; i++) {
12978064efb8SGeert Uytterhoeven 		struct comp_request req;
12983ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
12998064efb8SGeert Uytterhoeven 
13003ce858cbSGeert Uytterhoeven 		res = crypto_compress_setup(tfm, ctemplate[i].params,
13018064efb8SGeert Uytterhoeven 					    ctemplate[i].paramsize);
13023ce858cbSGeert Uytterhoeven 		if (res) {
13038064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression setup failed on test "
13043ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13053ce858cbSGeert Uytterhoeven 			return res;
13068064efb8SGeert Uytterhoeven 		}
13078064efb8SGeert Uytterhoeven 
13083ce858cbSGeert Uytterhoeven 		res = crypto_compress_init(tfm);
13093ce858cbSGeert Uytterhoeven 		if (res) {
13108064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression init failed on test "
13113ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13123ce858cbSGeert Uytterhoeven 			return res;
13138064efb8SGeert Uytterhoeven 		}
13148064efb8SGeert Uytterhoeven 
13158064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
13168064efb8SGeert Uytterhoeven 
13178064efb8SGeert Uytterhoeven 		req.next_in = ctemplate[i].input;
13188064efb8SGeert Uytterhoeven 		req.avail_in = ctemplate[i].inlen / 2;
13198064efb8SGeert Uytterhoeven 		req.next_out = result;
13208064efb8SGeert Uytterhoeven 		req.avail_out = ctemplate[i].outlen / 2;
13218064efb8SGeert Uytterhoeven 
13223ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13233ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13248064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13253ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13263ce858cbSGeert Uytterhoeven 			return res;
13278064efb8SGeert Uytterhoeven 		}
13283ce858cbSGeert Uytterhoeven 		if (res > 0)
13293ce858cbSGeert Uytterhoeven 			produced += res;
13308064efb8SGeert Uytterhoeven 
13318064efb8SGeert Uytterhoeven 		/* Add remaining input data */
13328064efb8SGeert Uytterhoeven 		req.avail_in += (ctemplate[i].inlen + 1) / 2;
13338064efb8SGeert Uytterhoeven 
13343ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13353ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13368064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13373ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13383ce858cbSGeert Uytterhoeven 			return res;
13398064efb8SGeert Uytterhoeven 		}
13403ce858cbSGeert Uytterhoeven 		if (res > 0)
13413ce858cbSGeert Uytterhoeven 			produced += res;
13428064efb8SGeert Uytterhoeven 
13438064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
13448064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
13458064efb8SGeert Uytterhoeven 
13463ce858cbSGeert Uytterhoeven 		res = crypto_compress_final(tfm, &req);
13473ce858cbSGeert Uytterhoeven 		if (res < 0) {
13488064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression final failed on test "
13493ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13503ce858cbSGeert Uytterhoeven 			return res;
13518064efb8SGeert Uytterhoeven 		}
13523ce858cbSGeert Uytterhoeven 		produced += res;
13538064efb8SGeert Uytterhoeven 
13548064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
13558064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13568064efb8SGeert Uytterhoeven 			       "output len = %d (expected %d)\n", i + 1, algo,
13578064efb8SGeert Uytterhoeven 			       COMP_BUF_SIZE - req.avail_out,
13588064efb8SGeert Uytterhoeven 			       ctemplate[i].outlen);
13598064efb8SGeert Uytterhoeven 			return -EINVAL;
13608064efb8SGeert Uytterhoeven 		}
13618064efb8SGeert Uytterhoeven 
13623ce858cbSGeert Uytterhoeven 		if (produced != ctemplate[i].outlen) {
13633ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13643ce858cbSGeert Uytterhoeven 			       "returned len = %u (expected %d)\n", i + 1,
13653ce858cbSGeert Uytterhoeven 			       algo, produced, ctemplate[i].outlen);
13663ce858cbSGeert Uytterhoeven 			return -EINVAL;
13673ce858cbSGeert Uytterhoeven 		}
13683ce858cbSGeert Uytterhoeven 
13698064efb8SGeert Uytterhoeven 		if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
13708064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Compression test %d failed for "
13718064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
13728064efb8SGeert Uytterhoeven 			hexdump(result, ctemplate[i].outlen);
13738064efb8SGeert Uytterhoeven 			return -EINVAL;
13748064efb8SGeert Uytterhoeven 		}
13758064efb8SGeert Uytterhoeven 	}
13768064efb8SGeert Uytterhoeven 
13778064efb8SGeert Uytterhoeven 	for (i = 0; i < dtcount; i++) {
13788064efb8SGeert Uytterhoeven 		struct comp_request req;
13793ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
13808064efb8SGeert Uytterhoeven 
13813ce858cbSGeert Uytterhoeven 		res = crypto_decompress_setup(tfm, dtemplate[i].params,
13828064efb8SGeert Uytterhoeven 					      dtemplate[i].paramsize);
13833ce858cbSGeert Uytterhoeven 		if (res) {
13848064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression setup failed on "
13853ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13863ce858cbSGeert Uytterhoeven 			return res;
13878064efb8SGeert Uytterhoeven 		}
13888064efb8SGeert Uytterhoeven 
13893ce858cbSGeert Uytterhoeven 		res = crypto_decompress_init(tfm);
13903ce858cbSGeert Uytterhoeven 		if (res) {
13918064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression init failed on test "
13923ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13933ce858cbSGeert Uytterhoeven 			return res;
13948064efb8SGeert Uytterhoeven 		}
13958064efb8SGeert Uytterhoeven 
13968064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
13978064efb8SGeert Uytterhoeven 
13988064efb8SGeert Uytterhoeven 		req.next_in = dtemplate[i].input;
13998064efb8SGeert Uytterhoeven 		req.avail_in = dtemplate[i].inlen / 2;
14008064efb8SGeert Uytterhoeven 		req.next_out = result;
14018064efb8SGeert Uytterhoeven 		req.avail_out = dtemplate[i].outlen / 2;
14028064efb8SGeert Uytterhoeven 
14033ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
14043ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14058064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
14063ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14073ce858cbSGeert Uytterhoeven 			return res;
14088064efb8SGeert Uytterhoeven 		}
14093ce858cbSGeert Uytterhoeven 		if (res > 0)
14103ce858cbSGeert Uytterhoeven 			produced += res;
14118064efb8SGeert Uytterhoeven 
14128064efb8SGeert Uytterhoeven 		/* Add remaining input data */
14138064efb8SGeert Uytterhoeven 		req.avail_in += (dtemplate[i].inlen + 1) / 2;
14148064efb8SGeert Uytterhoeven 
14153ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
14163ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14178064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
14183ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14193ce858cbSGeert Uytterhoeven 			return res;
14208064efb8SGeert Uytterhoeven 		}
14213ce858cbSGeert Uytterhoeven 		if (res > 0)
14223ce858cbSGeert Uytterhoeven 			produced += res;
14238064efb8SGeert Uytterhoeven 
14248064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
14258064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
14268064efb8SGeert Uytterhoeven 
14273ce858cbSGeert Uytterhoeven 		res = crypto_decompress_final(tfm, &req);
14283ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14298064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression final failed on "
14303ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14313ce858cbSGeert Uytterhoeven 			return res;
14328064efb8SGeert Uytterhoeven 		}
14333ce858cbSGeert Uytterhoeven 		if (res > 0)
14343ce858cbSGeert Uytterhoeven 			produced += res;
14358064efb8SGeert Uytterhoeven 
14368064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
14378064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14388064efb8SGeert Uytterhoeven 			       "%s: output len = %d (expected %d)\n", i + 1,
14398064efb8SGeert Uytterhoeven 			       algo, COMP_BUF_SIZE - req.avail_out,
14408064efb8SGeert Uytterhoeven 			       dtemplate[i].outlen);
14418064efb8SGeert Uytterhoeven 			return -EINVAL;
14428064efb8SGeert Uytterhoeven 		}
14438064efb8SGeert Uytterhoeven 
14443ce858cbSGeert Uytterhoeven 		if (produced != dtemplate[i].outlen) {
14453ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14463ce858cbSGeert Uytterhoeven 			       "%s: returned len = %u (expected %d)\n", i + 1,
14473ce858cbSGeert Uytterhoeven 			       algo, produced, dtemplate[i].outlen);
14483ce858cbSGeert Uytterhoeven 			return -EINVAL;
14493ce858cbSGeert Uytterhoeven 		}
14503ce858cbSGeert Uytterhoeven 
14518064efb8SGeert Uytterhoeven 		if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
14528064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Decompression test %d failed for "
14538064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
14548064efb8SGeert Uytterhoeven 			hexdump(result, dtemplate[i].outlen);
14558064efb8SGeert Uytterhoeven 			return -EINVAL;
14568064efb8SGeert Uytterhoeven 		}
14578064efb8SGeert Uytterhoeven 	}
14588064efb8SGeert Uytterhoeven 
14598064efb8SGeert Uytterhoeven 	return 0;
14608064efb8SGeert Uytterhoeven }
14618064efb8SGeert Uytterhoeven 
14627647d6ceSJarod Wilson 
14637647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
14647647d6ceSJarod Wilson 		      unsigned int tcount)
14657647d6ceSJarod Wilson {
14667647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1467fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
14687647d6ceSJarod Wilson 	u8 *seed;
14697647d6ceSJarod Wilson 	char result[32];
14707647d6ceSJarod Wilson 
14717647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
14727647d6ceSJarod Wilson 
14737647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
14747647d6ceSJarod Wilson 	if (!seed) {
14757647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
14767647d6ceSJarod Wilson 		       "for %s\n", algo);
14777647d6ceSJarod Wilson 		return -ENOMEM;
14787647d6ceSJarod Wilson 	}
14797647d6ceSJarod Wilson 
14807647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
14817647d6ceSJarod Wilson 		memset(result, 0, 32);
14827647d6ceSJarod Wilson 
14837647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
14847647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
14857647d6ceSJarod Wilson 		       template[i].klen);
14867647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
14877647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
14887647d6ceSJarod Wilson 
14897647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
14907647d6ceSJarod Wilson 		if (err) {
14917647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
14927647d6ceSJarod Wilson 			       "for %s\n", algo);
14937647d6ceSJarod Wilson 			goto out;
14947647d6ceSJarod Wilson 		}
14957647d6ceSJarod Wilson 
14967647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
14977647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
14987647d6ceSJarod Wilson 						   template[i].rlen);
149919e60e13SStephan Mueller 			if (err < 0) {
15007647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
15017647d6ceSJarod Wilson 				       "the correct amount of random data for "
150219e60e13SStephan Mueller 				       "%s (requested %d)\n", algo,
150319e60e13SStephan Mueller 				       template[i].rlen);
15047647d6ceSJarod Wilson 				goto out;
15057647d6ceSJarod Wilson 			}
15067647d6ceSJarod Wilson 		}
15077647d6ceSJarod Wilson 
15087647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
15097647d6ceSJarod Wilson 			     template[i].rlen);
15107647d6ceSJarod Wilson 		if (err) {
15117647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
15127647d6ceSJarod Wilson 			       i, algo);
15137647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
15147647d6ceSJarod Wilson 			err = -EINVAL;
15157647d6ceSJarod Wilson 			goto out;
15167647d6ceSJarod Wilson 		}
15177647d6ceSJarod Wilson 	}
15187647d6ceSJarod Wilson 
15197647d6ceSJarod Wilson out:
15207647d6ceSJarod Wilson 	kfree(seed);
15217647d6ceSJarod Wilson 	return err;
15227647d6ceSJarod Wilson }
15237647d6ceSJarod Wilson 
1524da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1525da7f033dSHerbert Xu 			 u32 type, u32 mask)
1526da7f033dSHerbert Xu {
1527da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1528da7f033dSHerbert Xu 	int err = 0;
1529da7f033dSHerbert Xu 
1530425a8829SStephan Mueller 	tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask);
1531da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1532da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1533da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1534da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1535da7f033dSHerbert Xu 	}
1536da7f033dSHerbert Xu 
1537da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1538da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1539da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1540da7f033dSHerbert Xu 		if (err)
1541da7f033dSHerbert Xu 			goto out;
1542da7f033dSHerbert Xu 	}
1543da7f033dSHerbert Xu 
1544da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1545da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1546da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1547da7f033dSHerbert Xu 
1548da7f033dSHerbert Xu out:
1549da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1550da7f033dSHerbert Xu 	return err;
1551da7f033dSHerbert Xu }
1552da7f033dSHerbert Xu 
1553da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1554da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1555da7f033dSHerbert Xu {
15561aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1557da7f033dSHerbert Xu 	int err = 0;
1558da7f033dSHerbert Xu 
1559425a8829SStephan Mueller 	tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1560da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1561da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1562da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1563da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1564da7f033dSHerbert Xu 	}
1565da7f033dSHerbert Xu 
1566da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1567da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1568da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1569da7f033dSHerbert Xu 		if (err)
1570da7f033dSHerbert Xu 			goto out;
1571da7f033dSHerbert Xu 	}
1572da7f033dSHerbert Xu 
1573da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1574da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1575da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1576da7f033dSHerbert Xu 
1577da7f033dSHerbert Xu out:
15781aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
15791aa4ecd9SHerbert Xu 	return err;
15801aa4ecd9SHerbert Xu }
15811aa4ecd9SHerbert Xu 
15821aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
15831aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
15841aa4ecd9SHerbert Xu {
158512773d93SHerbert Xu 	struct crypto_skcipher *tfm;
15861aa4ecd9SHerbert Xu 	int err = 0;
15871aa4ecd9SHerbert Xu 
158812773d93SHerbert Xu 	tfm = crypto_alloc_skcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
15891aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
15901aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
15911aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
15921aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
15931aa4ecd9SHerbert Xu 	}
15941aa4ecd9SHerbert Xu 
15951aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
15961aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
15971aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
15981aa4ecd9SHerbert Xu 		if (err)
15991aa4ecd9SHerbert Xu 			goto out;
16001aa4ecd9SHerbert Xu 	}
16011aa4ecd9SHerbert Xu 
16021aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
16031aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
16041aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
16051aa4ecd9SHerbert Xu 
16061aa4ecd9SHerbert Xu out:
160712773d93SHerbert Xu 	crypto_free_skcipher(tfm);
1608da7f033dSHerbert Xu 	return err;
1609da7f033dSHerbert Xu }
1610da7f033dSHerbert Xu 
1611da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1612da7f033dSHerbert Xu 			 u32 type, u32 mask)
1613da7f033dSHerbert Xu {
1614da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1615da7f033dSHerbert Xu 	int err;
1616da7f033dSHerbert Xu 
1617da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1618da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1619da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1620da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1621da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1622da7f033dSHerbert Xu 	}
1623da7f033dSHerbert Xu 
1624da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1625da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1626da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1627da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1628da7f033dSHerbert Xu 
1629da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1630da7f033dSHerbert Xu 	return err;
1631da7f033dSHerbert Xu }
1632da7f033dSHerbert Xu 
16338064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
16348064efb8SGeert Uytterhoeven 			  u32 type, u32 mask)
16358064efb8SGeert Uytterhoeven {
16368064efb8SGeert Uytterhoeven 	struct crypto_pcomp *tfm;
16378064efb8SGeert Uytterhoeven 	int err;
16388064efb8SGeert Uytterhoeven 
16398064efb8SGeert Uytterhoeven 	tfm = crypto_alloc_pcomp(driver, type, mask);
16408064efb8SGeert Uytterhoeven 	if (IS_ERR(tfm)) {
16418064efb8SGeert Uytterhoeven 		pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
16428064efb8SGeert Uytterhoeven 		       driver, PTR_ERR(tfm));
16438064efb8SGeert Uytterhoeven 		return PTR_ERR(tfm);
16448064efb8SGeert Uytterhoeven 	}
16458064efb8SGeert Uytterhoeven 
16468064efb8SGeert Uytterhoeven 	err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
16478064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.vecs,
16488064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.comp.count,
16498064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.count);
16508064efb8SGeert Uytterhoeven 
16518064efb8SGeert Uytterhoeven 	crypto_free_pcomp(tfm);
16528064efb8SGeert Uytterhoeven 	return err;
16538064efb8SGeert Uytterhoeven }
16548064efb8SGeert Uytterhoeven 
1655da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1656da7f033dSHerbert Xu 			 u32 type, u32 mask)
1657da7f033dSHerbert Xu {
1658da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1659da7f033dSHerbert Xu 	int err;
1660da7f033dSHerbert Xu 
1661425a8829SStephan Mueller 	tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask);
1662da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1663da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1664da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1665da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1666da7f033dSHerbert Xu 	}
1667da7f033dSHerbert Xu 
1668a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1669a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1670a8f1a052SDavid S. Miller 	if (!err)
1671a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1672a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1673da7f033dSHerbert Xu 
1674da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1675da7f033dSHerbert Xu 	return err;
1676da7f033dSHerbert Xu }
1677da7f033dSHerbert Xu 
16788e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
16798e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
16808e3ee85eSHerbert Xu {
16818e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
16828e3ee85eSHerbert Xu 	u32 val;
16838e3ee85eSHerbert Xu 	int err;
16848e3ee85eSHerbert Xu 
16858e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
16868e3ee85eSHerbert Xu 	if (err)
16878e3ee85eSHerbert Xu 		goto out;
16888e3ee85eSHerbert Xu 
1689425a8829SStephan Mueller 	tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask);
16908e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
16918e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
16928e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
16938e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
16948e3ee85eSHerbert Xu 		goto out;
16958e3ee85eSHerbert Xu 	}
16968e3ee85eSHerbert Xu 
16978e3ee85eSHerbert Xu 	do {
16984c5c3024SJan-Simon Möller 		SHASH_DESC_ON_STACK(shash, tfm);
16994c5c3024SJan-Simon Möller 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
17008e3ee85eSHerbert Xu 
17014c5c3024SJan-Simon Möller 		shash->tfm = tfm;
17024c5c3024SJan-Simon Möller 		shash->flags = 0;
17038e3ee85eSHerbert Xu 
17044c5c3024SJan-Simon Möller 		*ctx = le32_to_cpu(420553207);
17054c5c3024SJan-Simon Möller 		err = crypto_shash_final(shash, (u8 *)&val);
17068e3ee85eSHerbert Xu 		if (err) {
17078e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
17088e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
17098e3ee85eSHerbert Xu 			break;
17108e3ee85eSHerbert Xu 		}
17118e3ee85eSHerbert Xu 
17128e3ee85eSHerbert Xu 		if (val != ~420553207) {
17138e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
17148e3ee85eSHerbert Xu 			       "%d\n", driver, val);
17158e3ee85eSHerbert Xu 			err = -EINVAL;
17168e3ee85eSHerbert Xu 		}
17178e3ee85eSHerbert Xu 	} while (0);
17188e3ee85eSHerbert Xu 
17198e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
17208e3ee85eSHerbert Xu 
17218e3ee85eSHerbert Xu out:
17228e3ee85eSHerbert Xu 	return err;
17238e3ee85eSHerbert Xu }
17248e3ee85eSHerbert Xu 
17257647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
17267647d6ceSJarod Wilson 			  u32 type, u32 mask)
17277647d6ceSJarod Wilson {
17287647d6ceSJarod Wilson 	struct crypto_rng *rng;
17297647d6ceSJarod Wilson 	int err;
17307647d6ceSJarod Wilson 
1731425a8829SStephan Mueller 	rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
17327647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
17337647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
17347647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
17357647d6ceSJarod Wilson 		return PTR_ERR(rng);
17367647d6ceSJarod Wilson 	}
17377647d6ceSJarod Wilson 
17387647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
17397647d6ceSJarod Wilson 
17407647d6ceSJarod Wilson 	crypto_free_rng(rng);
17417647d6ceSJarod Wilson 
17427647d6ceSJarod Wilson 	return err;
17437647d6ceSJarod Wilson }
17447647d6ceSJarod Wilson 
174564d1cdfbSStephan Mueller 
174664d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr,
174764d1cdfbSStephan Mueller 			  const char *driver, u32 type, u32 mask)
174864d1cdfbSStephan Mueller {
174964d1cdfbSStephan Mueller 	int ret = -EAGAIN;
175064d1cdfbSStephan Mueller 	struct crypto_rng *drng;
175164d1cdfbSStephan Mueller 	struct drbg_test_data test_data;
175264d1cdfbSStephan Mueller 	struct drbg_string addtl, pers, testentropy;
175364d1cdfbSStephan Mueller 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
175464d1cdfbSStephan Mueller 
175564d1cdfbSStephan Mueller 	if (!buf)
175664d1cdfbSStephan Mueller 		return -ENOMEM;
175764d1cdfbSStephan Mueller 
1758425a8829SStephan Mueller 	drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
175964d1cdfbSStephan Mueller 	if (IS_ERR(drng)) {
176064d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
176164d1cdfbSStephan Mueller 		       "%s\n", driver);
176264d1cdfbSStephan Mueller 		kzfree(buf);
176364d1cdfbSStephan Mueller 		return -ENOMEM;
176464d1cdfbSStephan Mueller 	}
176564d1cdfbSStephan Mueller 
176664d1cdfbSStephan Mueller 	test_data.testentropy = &testentropy;
176764d1cdfbSStephan Mueller 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
176864d1cdfbSStephan Mueller 	drbg_string_fill(&pers, test->pers, test->perslen);
176964d1cdfbSStephan Mueller 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
177064d1cdfbSStephan Mueller 	if (ret) {
177164d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
177264d1cdfbSStephan Mueller 		goto outbuf;
177364d1cdfbSStephan Mueller 	}
177464d1cdfbSStephan Mueller 
177564d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
177664d1cdfbSStephan Mueller 	if (pr) {
177764d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
177864d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
177964d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl,	&test_data);
178064d1cdfbSStephan Mueller 	} else {
178164d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
178264d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
178364d1cdfbSStephan Mueller 	}
178419e60e13SStephan Mueller 	if (ret < 0) {
178564d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
178664d1cdfbSStephan Mueller 		       "driver %s\n", driver);
178764d1cdfbSStephan Mueller 		goto outbuf;
178864d1cdfbSStephan Mueller 	}
178964d1cdfbSStephan Mueller 
179064d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
179164d1cdfbSStephan Mueller 	if (pr) {
179264d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
179364d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
179464d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl, &test_data);
179564d1cdfbSStephan Mueller 	} else {
179664d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
179764d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
179864d1cdfbSStephan Mueller 	}
179919e60e13SStephan Mueller 	if (ret < 0) {
180064d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
180164d1cdfbSStephan Mueller 		       "driver %s\n", driver);
180264d1cdfbSStephan Mueller 		goto outbuf;
180364d1cdfbSStephan Mueller 	}
180464d1cdfbSStephan Mueller 
180564d1cdfbSStephan Mueller 	ret = memcmp(test->expected, buf, test->expectedlen);
180664d1cdfbSStephan Mueller 
180764d1cdfbSStephan Mueller outbuf:
180864d1cdfbSStephan Mueller 	crypto_free_rng(drng);
180964d1cdfbSStephan Mueller 	kzfree(buf);
181064d1cdfbSStephan Mueller 	return ret;
181164d1cdfbSStephan Mueller }
181264d1cdfbSStephan Mueller 
181364d1cdfbSStephan Mueller 
181464d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
181564d1cdfbSStephan Mueller 			 u32 type, u32 mask)
181664d1cdfbSStephan Mueller {
181764d1cdfbSStephan Mueller 	int err = 0;
181864d1cdfbSStephan Mueller 	int pr = 0;
181964d1cdfbSStephan Mueller 	int i = 0;
182064d1cdfbSStephan Mueller 	struct drbg_testvec *template = desc->suite.drbg.vecs;
182164d1cdfbSStephan Mueller 	unsigned int tcount = desc->suite.drbg.count;
182264d1cdfbSStephan Mueller 
182364d1cdfbSStephan Mueller 	if (0 == memcmp(driver, "drbg_pr_", 8))
182464d1cdfbSStephan Mueller 		pr = 1;
182564d1cdfbSStephan Mueller 
182664d1cdfbSStephan Mueller 	for (i = 0; i < tcount; i++) {
182764d1cdfbSStephan Mueller 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
182864d1cdfbSStephan Mueller 		if (err) {
182964d1cdfbSStephan Mueller 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
183064d1cdfbSStephan Mueller 			       i, driver);
183164d1cdfbSStephan Mueller 			err = -EINVAL;
183264d1cdfbSStephan Mueller 			break;
183364d1cdfbSStephan Mueller 		}
183464d1cdfbSStephan Mueller 	}
183564d1cdfbSStephan Mueller 	return err;
183664d1cdfbSStephan Mueller 
183764d1cdfbSStephan Mueller }
183864d1cdfbSStephan Mueller 
1839946cc463STadeusz Struk static int do_test_rsa(struct crypto_akcipher *tfm,
1840946cc463STadeusz Struk 		       struct akcipher_testvec *vecs)
1841946cc463STadeusz Struk {
1842946cc463STadeusz Struk 	struct akcipher_request *req;
1843946cc463STadeusz Struk 	void *outbuf_enc = NULL;
1844946cc463STadeusz Struk 	void *outbuf_dec = NULL;
1845946cc463STadeusz Struk 	struct tcrypt_result result;
1846946cc463STadeusz Struk 	unsigned int out_len_max, out_len = 0;
1847946cc463STadeusz Struk 	int err = -ENOMEM;
184822287b0bSTadeusz Struk 	struct scatterlist src, dst, src_tab[2];
1849946cc463STadeusz Struk 
1850946cc463STadeusz Struk 	req = akcipher_request_alloc(tfm, GFP_KERNEL);
1851946cc463STadeusz Struk 	if (!req)
1852946cc463STadeusz Struk 		return err;
1853946cc463STadeusz Struk 
1854946cc463STadeusz Struk 	init_completion(&result.completion);
185522287b0bSTadeusz Struk 
185622287b0bSTadeusz Struk 	if (vecs->public_key_vec)
185722287b0bSTadeusz Struk 		err = crypto_akcipher_set_pub_key(tfm, vecs->key,
185822287b0bSTadeusz Struk 						  vecs->key_len);
185922287b0bSTadeusz Struk 	else
186022287b0bSTadeusz Struk 		err = crypto_akcipher_set_priv_key(tfm, vecs->key,
186122287b0bSTadeusz Struk 						   vecs->key_len);
1862946cc463STadeusz Struk 	if (err)
1863946cc463STadeusz Struk 		goto free_req;
1864946cc463STadeusz Struk 
186522287b0bSTadeusz Struk 	out_len_max = crypto_akcipher_maxsize(tfm);
1866946cc463STadeusz Struk 	outbuf_enc = kzalloc(out_len_max, GFP_KERNEL);
1867946cc463STadeusz Struk 	if (!outbuf_enc)
1868946cc463STadeusz Struk 		goto free_req;
1869946cc463STadeusz Struk 
187022287b0bSTadeusz Struk 	sg_init_table(src_tab, 2);
187122287b0bSTadeusz Struk 	sg_set_buf(&src_tab[0], vecs->m, 8);
187222287b0bSTadeusz Struk 	sg_set_buf(&src_tab[1], vecs->m + 8, vecs->m_size - 8);
187322287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_enc, out_len_max);
187422287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
187522287b0bSTadeusz Struk 				   out_len_max);
1876946cc463STadeusz Struk 	akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
1877946cc463STadeusz Struk 				      tcrypt_complete, &result);
1878946cc463STadeusz Struk 
1879946cc463STadeusz Struk 	/* Run RSA encrypt - c = m^e mod n;*/
1880946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_encrypt(req));
1881946cc463STadeusz Struk 	if (err) {
1882946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. err %d\n", err);
1883946cc463STadeusz Struk 		goto free_all;
1884946cc463STadeusz Struk 	}
188522287b0bSTadeusz Struk 	if (req->dst_len != vecs->c_size) {
1886946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. Invalid output len\n");
1887946cc463STadeusz Struk 		err = -EINVAL;
1888946cc463STadeusz Struk 		goto free_all;
1889946cc463STadeusz Struk 	}
1890946cc463STadeusz Struk 	/* verify that encrypted message is equal to expected */
189122287b0bSTadeusz Struk 	if (memcmp(vecs->c, sg_virt(req->dst), vecs->c_size)) {
1892946cc463STadeusz Struk 		pr_err("alg: rsa: encrypt test failed. Invalid output\n");
1893946cc463STadeusz Struk 		err = -EINVAL;
1894946cc463STadeusz Struk 		goto free_all;
1895946cc463STadeusz Struk 	}
1896946cc463STadeusz Struk 	/* Don't invoke decrypt for vectors with public key */
1897946cc463STadeusz Struk 	if (vecs->public_key_vec) {
1898946cc463STadeusz Struk 		err = 0;
1899946cc463STadeusz Struk 		goto free_all;
1900946cc463STadeusz Struk 	}
1901946cc463STadeusz Struk 	outbuf_dec = kzalloc(out_len_max, GFP_KERNEL);
1902946cc463STadeusz Struk 	if (!outbuf_dec) {
1903946cc463STadeusz Struk 		err = -ENOMEM;
1904946cc463STadeusz Struk 		goto free_all;
1905946cc463STadeusz Struk 	}
190622287b0bSTadeusz Struk 	sg_init_one(&src, vecs->c, vecs->c_size);
190722287b0bSTadeusz Struk 	sg_init_one(&dst, outbuf_dec, out_len_max);
1908946cc463STadeusz Struk 	init_completion(&result.completion);
190922287b0bSTadeusz Struk 	akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
1910946cc463STadeusz Struk 
1911946cc463STadeusz Struk 	/* Run RSA decrypt - m = c^d mod n;*/
1912946cc463STadeusz Struk 	err = wait_async_op(&result, crypto_akcipher_decrypt(req));
1913946cc463STadeusz Struk 	if (err) {
1914946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. err %d\n", err);
1915946cc463STadeusz Struk 		goto free_all;
1916946cc463STadeusz Struk 	}
1917946cc463STadeusz Struk 	out_len = req->dst_len;
1918946cc463STadeusz Struk 	if (out_len != vecs->m_size) {
1919946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. Invalid output len\n");
1920946cc463STadeusz Struk 		err = -EINVAL;
1921946cc463STadeusz Struk 		goto free_all;
1922946cc463STadeusz Struk 	}
1923946cc463STadeusz Struk 	/* verify that decrypted message is equal to the original msg */
1924946cc463STadeusz Struk 	if (memcmp(vecs->m, outbuf_dec, vecs->m_size)) {
1925946cc463STadeusz Struk 		pr_err("alg: rsa: decrypt test failed. Invalid output\n");
1926946cc463STadeusz Struk 		err = -EINVAL;
1927946cc463STadeusz Struk 	}
1928946cc463STadeusz Struk free_all:
1929946cc463STadeusz Struk 	kfree(outbuf_dec);
1930946cc463STadeusz Struk 	kfree(outbuf_enc);
1931946cc463STadeusz Struk free_req:
1932946cc463STadeusz Struk 	akcipher_request_free(req);
1933946cc463STadeusz Struk 	return err;
1934946cc463STadeusz Struk }
1935946cc463STadeusz Struk 
1936946cc463STadeusz Struk static int test_rsa(struct crypto_akcipher *tfm, struct akcipher_testvec *vecs,
1937946cc463STadeusz Struk 		    unsigned int tcount)
1938946cc463STadeusz Struk {
1939946cc463STadeusz Struk 	int ret, i;
1940946cc463STadeusz Struk 
1941946cc463STadeusz Struk 	for (i = 0; i < tcount; i++) {
1942946cc463STadeusz Struk 		ret = do_test_rsa(tfm, vecs++);
1943946cc463STadeusz Struk 		if (ret) {
1944946cc463STadeusz Struk 			pr_err("alg: rsa: test failed on vector %d, err=%d\n",
1945946cc463STadeusz Struk 			       i + 1, ret);
1946946cc463STadeusz Struk 			return ret;
1947946cc463STadeusz Struk 		}
1948946cc463STadeusz Struk 	}
1949946cc463STadeusz Struk 	return 0;
1950946cc463STadeusz Struk }
1951946cc463STadeusz Struk 
1952946cc463STadeusz Struk static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
1953946cc463STadeusz Struk 			 struct akcipher_testvec *vecs, unsigned int tcount)
1954946cc463STadeusz Struk {
1955946cc463STadeusz Struk 	if (strncmp(alg, "rsa", 3) == 0)
1956946cc463STadeusz Struk 		return test_rsa(tfm, vecs, tcount);
1957946cc463STadeusz Struk 
1958946cc463STadeusz Struk 	return 0;
1959946cc463STadeusz Struk }
1960946cc463STadeusz Struk 
1961946cc463STadeusz Struk static int alg_test_akcipher(const struct alg_test_desc *desc,
1962946cc463STadeusz Struk 			     const char *driver, u32 type, u32 mask)
1963946cc463STadeusz Struk {
1964946cc463STadeusz Struk 	struct crypto_akcipher *tfm;
1965946cc463STadeusz Struk 	int err = 0;
1966946cc463STadeusz Struk 
1967946cc463STadeusz Struk 	tfm = crypto_alloc_akcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1968946cc463STadeusz Struk 	if (IS_ERR(tfm)) {
1969946cc463STadeusz Struk 		pr_err("alg: akcipher: Failed to load tfm for %s: %ld\n",
1970946cc463STadeusz Struk 		       driver, PTR_ERR(tfm));
1971946cc463STadeusz Struk 		return PTR_ERR(tfm);
1972946cc463STadeusz Struk 	}
1973946cc463STadeusz Struk 	if (desc->suite.akcipher.vecs)
1974946cc463STadeusz Struk 		err = test_akcipher(tfm, desc->alg, desc->suite.akcipher.vecs,
1975946cc463STadeusz Struk 				    desc->suite.akcipher.count);
1976946cc463STadeusz Struk 
1977946cc463STadeusz Struk 	crypto_free_akcipher(tfm);
1978946cc463STadeusz Struk 	return err;
1979946cc463STadeusz Struk }
1980946cc463STadeusz Struk 
1981863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1982863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1983863b557aSYouquan, Song {
1984863b557aSYouquan, Song 	return 0;
1985863b557aSYouquan, Song }
1986863b557aSYouquan, Song 
1987da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1988da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1989da7f033dSHerbert Xu 	{
19904d6d6a2cSJohannes Goetzfried 		.alg = "__cbc-cast5-avx",
19914d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
19924d6d6a2cSJohannes Goetzfried 	}, {
19934ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
19944ea1277dSJohannes Goetzfried 		.test = alg_test_null,
19954ea1277dSJohannes Goetzfried 	}, {
19967efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
19977efe4076SJohannes Goetzfried 		.test = alg_test_null,
19987efe4076SJohannes Goetzfried 	}, {
199956d76c96SJussi Kivilinna 		.alg = "__cbc-serpent-avx2",
200056d76c96SJussi Kivilinna 		.test = alg_test_null,
200156d76c96SJussi Kivilinna 	}, {
2002937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
2003937c30d7SJussi Kivilinna 		.test = alg_test_null,
2004937c30d7SJussi Kivilinna 	}, {
2005107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
2006107778b5SJohannes Goetzfried 		.test = alg_test_null,
2007107778b5SJohannes Goetzfried 	}, {
2008863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
2009863b557aSYouquan, Song 		.test = alg_test_null,
20106c79294fSMilan Broz 		.fips_allowed = 1,
2011863b557aSYouquan, Song 	}, {
2012d9b1d2e7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni",
2013d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2014d9b1d2e7SJussi Kivilinna 	}, {
2015f3f935a7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni-avx2",
2016f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2017f3f935a7SJussi Kivilinna 	}, {
20184d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
20194d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
20204d6d6a2cSJohannes Goetzfried 	}, {
20214ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
20224ea1277dSJohannes Goetzfried 		.test = alg_test_null,
20234ea1277dSJohannes Goetzfried 	}, {
20247efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
20257efe4076SJohannes Goetzfried 		.test = alg_test_null,
20267efe4076SJohannes Goetzfried 	}, {
202756d76c96SJussi Kivilinna 		.alg = "__driver-cbc-serpent-avx2",
202856d76c96SJussi Kivilinna 		.test = alg_test_null,
202956d76c96SJussi Kivilinna 	}, {
2030937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
2031937c30d7SJussi Kivilinna 		.test = alg_test_null,
2032937c30d7SJussi Kivilinna 	}, {
2033107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
2034107778b5SJohannes Goetzfried 		.test = alg_test_null,
2035107778b5SJohannes Goetzfried 	}, {
2036863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
2037863b557aSYouquan, Song 		.test = alg_test_null,
20386c79294fSMilan Broz 		.fips_allowed = 1,
2039863b557aSYouquan, Song 	}, {
2040d9b1d2e7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni",
2041d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2042d9b1d2e7SJussi Kivilinna 	}, {
2043f3f935a7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni-avx2",
2044f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2045f3f935a7SJussi Kivilinna 	}, {
20464d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
20474d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
20484d6d6a2cSJohannes Goetzfried 	}, {
20494ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
20504ea1277dSJohannes Goetzfried 		.test = alg_test_null,
20514ea1277dSJohannes Goetzfried 	}, {
20527efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
20537efe4076SJohannes Goetzfried 		.test = alg_test_null,
20547efe4076SJohannes Goetzfried 	}, {
205556d76c96SJussi Kivilinna 		.alg = "__driver-ecb-serpent-avx2",
205656d76c96SJussi Kivilinna 		.test = alg_test_null,
205756d76c96SJussi Kivilinna 	}, {
2058937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
2059937c30d7SJussi Kivilinna 		.test = alg_test_null,
2060937c30d7SJussi Kivilinna 	}, {
2061107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
2062107778b5SJohannes Goetzfried 		.test = alg_test_null,
2063107778b5SJohannes Goetzfried 	}, {
20649d77b6c2STadeusz Struk 		.alg = "__driver-gcm-aes-aesni",
20659d77b6c2STadeusz Struk 		.test = alg_test_null,
20669d77b6c2STadeusz Struk 		.fips_allowed = 1,
20679d77b6c2STadeusz Struk 	}, {
2068863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
2069863b557aSYouquan, Song 		.test = alg_test_null,
20706c79294fSMilan Broz 		.fips_allowed = 1,
2071863b557aSYouquan, Song 	}, {
2072e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
2073e08ca2daSJarod Wilson 		.test = alg_test_cprng,
2074a1915d51SJarod Wilson 		.fips_allowed = 1,
2075e08ca2daSJarod Wilson 		.suite = {
2076e08ca2daSJarod Wilson 			.cprng = {
2077e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
2078e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
2079e08ca2daSJarod Wilson 			}
2080e08ca2daSJarod Wilson 		}
2081e08ca2daSJarod Wilson 	}, {
2082bca4feb0SHoria Geanta 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
2083bca4feb0SHoria Geanta 		.test = alg_test_aead,
2084bca4feb0SHoria Geanta 		.suite = {
2085bca4feb0SHoria Geanta 			.aead = {
2086bca4feb0SHoria Geanta 				.enc = {
2087bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_enc_tv_template,
2088bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS
2089bca4feb0SHoria Geanta 				},
2090bca4feb0SHoria Geanta 				.dec = {
2091bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_dec_tv_template,
2092bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS
2093bca4feb0SHoria Geanta 				}
2094bca4feb0SHoria Geanta 			}
2095bca4feb0SHoria Geanta 		}
2096bca4feb0SHoria Geanta 	}, {
2097a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(aes))",
2098e46e9a46SHoria Geanta 		.test = alg_test_aead,
2099e46e9a46SHoria Geanta 		.suite = {
2100e46e9a46SHoria Geanta 			.aead = {
2101e46e9a46SHoria Geanta 				.enc = {
21025208ed2cSNitesh Lal 					.vecs =
21035208ed2cSNitesh Lal 					hmac_sha1_aes_cbc_enc_tv_temp,
21045208ed2cSNitesh Lal 					.count =
21055208ed2cSNitesh Lal 					HMAC_SHA1_AES_CBC_ENC_TEST_VEC
21065208ed2cSNitesh Lal 				}
21075208ed2cSNitesh Lal 			}
21085208ed2cSNitesh Lal 		}
21095208ed2cSNitesh Lal 	}, {
2110a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des))",
21115208ed2cSNitesh Lal 		.test = alg_test_aead,
21125208ed2cSNitesh Lal 		.suite = {
21135208ed2cSNitesh Lal 			.aead = {
21145208ed2cSNitesh Lal 				.enc = {
21155208ed2cSNitesh Lal 					.vecs =
21165208ed2cSNitesh Lal 					hmac_sha1_des_cbc_enc_tv_temp,
21175208ed2cSNitesh Lal 					.count =
21185208ed2cSNitesh Lal 					HMAC_SHA1_DES_CBC_ENC_TEST_VEC
21195208ed2cSNitesh Lal 				}
21205208ed2cSNitesh Lal 			}
21215208ed2cSNitesh Lal 		}
21225208ed2cSNitesh Lal 	}, {
2123a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
21245208ed2cSNitesh Lal 		.test = alg_test_aead,
21255208ed2cSNitesh Lal 		.suite = {
21265208ed2cSNitesh Lal 			.aead = {
21275208ed2cSNitesh Lal 				.enc = {
21285208ed2cSNitesh Lal 					.vecs =
21295208ed2cSNitesh Lal 					hmac_sha1_des3_ede_cbc_enc_tv_temp,
21305208ed2cSNitesh Lal 					.count =
21315208ed2cSNitesh Lal 					HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
2132e46e9a46SHoria Geanta 				}
2133e46e9a46SHoria Geanta 			}
2134e46e9a46SHoria Geanta 		}
2135e46e9a46SHoria Geanta 	}, {
2136bca4feb0SHoria Geanta 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
2137bca4feb0SHoria Geanta 		.test = alg_test_aead,
2138bca4feb0SHoria Geanta 		.suite = {
2139bca4feb0SHoria Geanta 			.aead = {
2140bca4feb0SHoria Geanta 				.enc = {
21415208ed2cSNitesh Lal 					.vecs =
21425208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_enc_tv_temp,
21435208ed2cSNitesh Lal 					.count =
21445208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
2145bca4feb0SHoria Geanta 				},
2146bca4feb0SHoria Geanta 				.dec = {
21475208ed2cSNitesh Lal 					.vecs =
21485208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_dec_tv_temp,
21495208ed2cSNitesh Lal 					.count =
21505208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
21515208ed2cSNitesh Lal 				}
21525208ed2cSNitesh Lal 			}
21535208ed2cSNitesh Lal 		}
21545208ed2cSNitesh Lal 	}, {
2155a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des))",
21565208ed2cSNitesh Lal 		.test = alg_test_aead,
21575208ed2cSNitesh Lal 		.suite = {
21585208ed2cSNitesh Lal 			.aead = {
21595208ed2cSNitesh Lal 				.enc = {
21605208ed2cSNitesh Lal 					.vecs =
21615208ed2cSNitesh Lal 					hmac_sha224_des_cbc_enc_tv_temp,
21625208ed2cSNitesh Lal 					.count =
21635208ed2cSNitesh Lal 					HMAC_SHA224_DES_CBC_ENC_TEST_VEC
21645208ed2cSNitesh Lal 				}
21655208ed2cSNitesh Lal 			}
21665208ed2cSNitesh Lal 		}
21675208ed2cSNitesh Lal 	}, {
2168a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
21695208ed2cSNitesh Lal 		.test = alg_test_aead,
21705208ed2cSNitesh Lal 		.suite = {
21715208ed2cSNitesh Lal 			.aead = {
21725208ed2cSNitesh Lal 				.enc = {
21735208ed2cSNitesh Lal 					.vecs =
21745208ed2cSNitesh Lal 					hmac_sha224_des3_ede_cbc_enc_tv_temp,
21755208ed2cSNitesh Lal 					.count =
21765208ed2cSNitesh Lal 					HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
2177bca4feb0SHoria Geanta 				}
2178bca4feb0SHoria Geanta 			}
2179bca4feb0SHoria Geanta 		}
2180bca4feb0SHoria Geanta 	}, {
2181a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(aes))",
2182e46e9a46SHoria Geanta 		.test = alg_test_aead,
2183e46e9a46SHoria Geanta 		.suite = {
2184e46e9a46SHoria Geanta 			.aead = {
2185e46e9a46SHoria Geanta 				.enc = {
21865208ed2cSNitesh Lal 					.vecs =
21875208ed2cSNitesh Lal 					hmac_sha256_aes_cbc_enc_tv_temp,
21885208ed2cSNitesh Lal 					.count =
21895208ed2cSNitesh Lal 					HMAC_SHA256_AES_CBC_ENC_TEST_VEC
21905208ed2cSNitesh Lal 				}
21915208ed2cSNitesh Lal 			}
21925208ed2cSNitesh Lal 		}
21935208ed2cSNitesh Lal 	}, {
2194a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des))",
21955208ed2cSNitesh Lal 		.test = alg_test_aead,
21965208ed2cSNitesh Lal 		.suite = {
21975208ed2cSNitesh Lal 			.aead = {
21985208ed2cSNitesh Lal 				.enc = {
21995208ed2cSNitesh Lal 					.vecs =
22005208ed2cSNitesh Lal 					hmac_sha256_des_cbc_enc_tv_temp,
22015208ed2cSNitesh Lal 					.count =
22025208ed2cSNitesh Lal 					HMAC_SHA256_DES_CBC_ENC_TEST_VEC
22035208ed2cSNitesh Lal 				}
22045208ed2cSNitesh Lal 			}
22055208ed2cSNitesh Lal 		}
22065208ed2cSNitesh Lal 	}, {
2207a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
22085208ed2cSNitesh Lal 		.test = alg_test_aead,
22095208ed2cSNitesh Lal 		.suite = {
22105208ed2cSNitesh Lal 			.aead = {
22115208ed2cSNitesh Lal 				.enc = {
22125208ed2cSNitesh Lal 					.vecs =
22135208ed2cSNitesh Lal 					hmac_sha256_des3_ede_cbc_enc_tv_temp,
22145208ed2cSNitesh Lal 					.count =
22155208ed2cSNitesh Lal 					HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
22165208ed2cSNitesh Lal 				}
22175208ed2cSNitesh Lal 			}
22185208ed2cSNitesh Lal 		}
22195208ed2cSNitesh Lal 	}, {
2220a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des))",
22215208ed2cSNitesh Lal 		.test = alg_test_aead,
22225208ed2cSNitesh Lal 		.suite = {
22235208ed2cSNitesh Lal 			.aead = {
22245208ed2cSNitesh Lal 				.enc = {
22255208ed2cSNitesh Lal 					.vecs =
22265208ed2cSNitesh Lal 					hmac_sha384_des_cbc_enc_tv_temp,
22275208ed2cSNitesh Lal 					.count =
22285208ed2cSNitesh Lal 					HMAC_SHA384_DES_CBC_ENC_TEST_VEC
22295208ed2cSNitesh Lal 				}
22305208ed2cSNitesh Lal 			}
22315208ed2cSNitesh Lal 		}
22325208ed2cSNitesh Lal 	}, {
2233a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
22345208ed2cSNitesh Lal 		.test = alg_test_aead,
22355208ed2cSNitesh Lal 		.suite = {
22365208ed2cSNitesh Lal 			.aead = {
22375208ed2cSNitesh Lal 				.enc = {
22385208ed2cSNitesh Lal 					.vecs =
22395208ed2cSNitesh Lal 					hmac_sha384_des3_ede_cbc_enc_tv_temp,
22405208ed2cSNitesh Lal 					.count =
22415208ed2cSNitesh Lal 					HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC
2242e46e9a46SHoria Geanta 				}
2243e46e9a46SHoria Geanta 			}
2244e46e9a46SHoria Geanta 		}
2245e46e9a46SHoria Geanta 	}, {
2246a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(aes))",
2247e46e9a46SHoria Geanta 		.test = alg_test_aead,
2248e46e9a46SHoria Geanta 		.suite = {
2249e46e9a46SHoria Geanta 			.aead = {
2250e46e9a46SHoria Geanta 				.enc = {
22515208ed2cSNitesh Lal 					.vecs =
22525208ed2cSNitesh Lal 					hmac_sha512_aes_cbc_enc_tv_temp,
22535208ed2cSNitesh Lal 					.count =
22545208ed2cSNitesh Lal 					HMAC_SHA512_AES_CBC_ENC_TEST_VEC
22555208ed2cSNitesh Lal 				}
22565208ed2cSNitesh Lal 			}
22575208ed2cSNitesh Lal 		}
22585208ed2cSNitesh Lal 	}, {
2259a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des))",
22605208ed2cSNitesh Lal 		.test = alg_test_aead,
22615208ed2cSNitesh Lal 		.suite = {
22625208ed2cSNitesh Lal 			.aead = {
22635208ed2cSNitesh Lal 				.enc = {
22645208ed2cSNitesh Lal 					.vecs =
22655208ed2cSNitesh Lal 					hmac_sha512_des_cbc_enc_tv_temp,
22665208ed2cSNitesh Lal 					.count =
22675208ed2cSNitesh Lal 					HMAC_SHA512_DES_CBC_ENC_TEST_VEC
22685208ed2cSNitesh Lal 				}
22695208ed2cSNitesh Lal 			}
22705208ed2cSNitesh Lal 		}
22715208ed2cSNitesh Lal 	}, {
2272a4198fd4SHerbert Xu 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
22735208ed2cSNitesh Lal 		.test = alg_test_aead,
22745208ed2cSNitesh Lal 		.suite = {
22755208ed2cSNitesh Lal 			.aead = {
22765208ed2cSNitesh Lal 				.enc = {
22775208ed2cSNitesh Lal 					.vecs =
22785208ed2cSNitesh Lal 					hmac_sha512_des3_ede_cbc_enc_tv_temp,
22795208ed2cSNitesh Lal 					.count =
22805208ed2cSNitesh Lal 					HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
2281e46e9a46SHoria Geanta 				}
2282e46e9a46SHoria Geanta 			}
2283e46e9a46SHoria Geanta 		}
2284e46e9a46SHoria Geanta 	}, {
2285da7f033dSHerbert Xu 		.alg = "cbc(aes)",
22861aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2287a1915d51SJarod Wilson 		.fips_allowed = 1,
2288da7f033dSHerbert Xu 		.suite = {
2289da7f033dSHerbert Xu 			.cipher = {
2290da7f033dSHerbert Xu 				.enc = {
2291da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
2292da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
2293da7f033dSHerbert Xu 				},
2294da7f033dSHerbert Xu 				.dec = {
2295da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
2296da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
2297da7f033dSHerbert Xu 				}
2298da7f033dSHerbert Xu 			}
2299da7f033dSHerbert Xu 		}
2300da7f033dSHerbert Xu 	}, {
2301da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
23021aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2303da7f033dSHerbert Xu 		.suite = {
2304da7f033dSHerbert Xu 			.cipher = {
2305da7f033dSHerbert Xu 				.enc = {
2306da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
2307da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
2308da7f033dSHerbert Xu 				},
2309da7f033dSHerbert Xu 				.dec = {
2310da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
2311da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
2312da7f033dSHerbert Xu 				}
2313da7f033dSHerbert Xu 			}
2314da7f033dSHerbert Xu 		}
2315da7f033dSHerbert Xu 	}, {
2316da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
23171aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2318da7f033dSHerbert Xu 		.suite = {
2319da7f033dSHerbert Xu 			.cipher = {
2320da7f033dSHerbert Xu 				.enc = {
2321da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
2322da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
2323da7f033dSHerbert Xu 				},
2324da7f033dSHerbert Xu 				.dec = {
2325da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
2326da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
2327da7f033dSHerbert Xu 				}
2328da7f033dSHerbert Xu 			}
2329da7f033dSHerbert Xu 		}
2330da7f033dSHerbert Xu 	}, {
2331da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
23321aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2333da7f033dSHerbert Xu 		.suite = {
2334da7f033dSHerbert Xu 			.cipher = {
2335da7f033dSHerbert Xu 				.enc = {
2336da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
2337da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
2338da7f033dSHerbert Xu 				},
2339da7f033dSHerbert Xu 				.dec = {
2340da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
2341da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
2342da7f033dSHerbert Xu 				}
2343da7f033dSHerbert Xu 			}
2344da7f033dSHerbert Xu 		}
2345da7f033dSHerbert Xu 	}, {
2346a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2347a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2348a2c58260SJohannes Goetzfried 		.suite = {
2349a2c58260SJohannes Goetzfried 			.cipher = {
2350a2c58260SJohannes Goetzfried 				.enc = {
2351a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
2352a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
2353a2c58260SJohannes Goetzfried 				},
2354a2c58260SJohannes Goetzfried 				.dec = {
2355a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
2356a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
2357a2c58260SJohannes Goetzfried 				}
2358a2c58260SJohannes Goetzfried 			}
2359a2c58260SJohannes Goetzfried 		}
2360a2c58260SJohannes Goetzfried 	}, {
23619b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
23629b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
23639b8b0405SJohannes Goetzfried 		.suite = {
23649b8b0405SJohannes Goetzfried 			.cipher = {
23659b8b0405SJohannes Goetzfried 				.enc = {
23669b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
23679b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
23689b8b0405SJohannes Goetzfried 				},
23699b8b0405SJohannes Goetzfried 				.dec = {
23709b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
23719b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
23729b8b0405SJohannes Goetzfried 				}
23739b8b0405SJohannes Goetzfried 			}
23749b8b0405SJohannes Goetzfried 		}
23759b8b0405SJohannes Goetzfried 	}, {
2376da7f033dSHerbert Xu 		.alg = "cbc(des)",
23771aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2378da7f033dSHerbert Xu 		.suite = {
2379da7f033dSHerbert Xu 			.cipher = {
2380da7f033dSHerbert Xu 				.enc = {
2381da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
2382da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
2383da7f033dSHerbert Xu 				},
2384da7f033dSHerbert Xu 				.dec = {
2385da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
2386da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
2387da7f033dSHerbert Xu 				}
2388da7f033dSHerbert Xu 			}
2389da7f033dSHerbert Xu 		}
2390da7f033dSHerbert Xu 	}, {
2391da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
23921aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2393a1915d51SJarod Wilson 		.fips_allowed = 1,
2394da7f033dSHerbert Xu 		.suite = {
2395da7f033dSHerbert Xu 			.cipher = {
2396da7f033dSHerbert Xu 				.enc = {
2397da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
2398da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
2399da7f033dSHerbert Xu 				},
2400da7f033dSHerbert Xu 				.dec = {
2401da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
2402da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
2403da7f033dSHerbert Xu 				}
2404da7f033dSHerbert Xu 			}
2405da7f033dSHerbert Xu 		}
2406da7f033dSHerbert Xu 	}, {
24079d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
24089d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
24099d25917dSJussi Kivilinna 		.suite = {
24109d25917dSJussi Kivilinna 			.cipher = {
24119d25917dSJussi Kivilinna 				.enc = {
24129d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
24139d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
24149d25917dSJussi Kivilinna 				},
24159d25917dSJussi Kivilinna 				.dec = {
24169d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
24179d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
24189d25917dSJussi Kivilinna 				}
24199d25917dSJussi Kivilinna 			}
24209d25917dSJussi Kivilinna 		}
24219d25917dSJussi Kivilinna 	}, {
2422da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
24231aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2424da7f033dSHerbert Xu 		.suite = {
2425da7f033dSHerbert Xu 			.cipher = {
2426da7f033dSHerbert Xu 				.enc = {
2427da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
2428da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
2429da7f033dSHerbert Xu 				},
2430da7f033dSHerbert Xu 				.dec = {
2431da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
2432da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
2433da7f033dSHerbert Xu 				}
2434da7f033dSHerbert Xu 			}
2435da7f033dSHerbert Xu 		}
2436da7f033dSHerbert Xu 	}, {
2437da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2438da7f033dSHerbert Xu 		.test = alg_test_aead,
2439a1915d51SJarod Wilson 		.fips_allowed = 1,
2440da7f033dSHerbert Xu 		.suite = {
2441da7f033dSHerbert Xu 			.aead = {
2442da7f033dSHerbert Xu 				.enc = {
2443da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
2444da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
2445da7f033dSHerbert Xu 				},
2446da7f033dSHerbert Xu 				.dec = {
2447da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
2448da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
2449da7f033dSHerbert Xu 				}
2450da7f033dSHerbert Xu 			}
2451da7f033dSHerbert Xu 		}
2452da7f033dSHerbert Xu 	}, {
24533590ebf2SMartin Willi 		.alg = "chacha20",
24543590ebf2SMartin Willi 		.test = alg_test_skcipher,
24553590ebf2SMartin Willi 		.suite = {
24563590ebf2SMartin Willi 			.cipher = {
24573590ebf2SMartin Willi 				.enc = {
24583590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
24593590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
24603590ebf2SMartin Willi 				},
24613590ebf2SMartin Willi 				.dec = {
24623590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
24633590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
24643590ebf2SMartin Willi 				},
24653590ebf2SMartin Willi 			}
24663590ebf2SMartin Willi 		}
24673590ebf2SMartin Willi 	}, {
246893b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
24698f183751SStephan Mueller 		.fips_allowed = 1,
247093b5e86aSJussi Kivilinna 		.test = alg_test_hash,
247193b5e86aSJussi Kivilinna 		.suite = {
247293b5e86aSJussi Kivilinna 			.hash = {
247393b5e86aSJussi Kivilinna 				.vecs = aes_cmac128_tv_template,
247493b5e86aSJussi Kivilinna 				.count = CMAC_AES_TEST_VECTORS
247593b5e86aSJussi Kivilinna 			}
247693b5e86aSJussi Kivilinna 		}
247793b5e86aSJussi Kivilinna 	}, {
247893b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
24798f183751SStephan Mueller 		.fips_allowed = 1,
248093b5e86aSJussi Kivilinna 		.test = alg_test_hash,
248193b5e86aSJussi Kivilinna 		.suite = {
248293b5e86aSJussi Kivilinna 			.hash = {
248393b5e86aSJussi Kivilinna 				.vecs = des3_ede_cmac64_tv_template,
248493b5e86aSJussi Kivilinna 				.count = CMAC_DES3_EDE_TEST_VECTORS
248593b5e86aSJussi Kivilinna 			}
248693b5e86aSJussi Kivilinna 		}
248793b5e86aSJussi Kivilinna 	}, {
2488e448370dSJussi Kivilinna 		.alg = "compress_null",
2489e448370dSJussi Kivilinna 		.test = alg_test_null,
2490e448370dSJussi Kivilinna 	}, {
2491ebb3472fSArd Biesheuvel 		.alg = "crc32",
2492ebb3472fSArd Biesheuvel 		.test = alg_test_hash,
2493ebb3472fSArd Biesheuvel 		.suite = {
2494ebb3472fSArd Biesheuvel 			.hash = {
2495ebb3472fSArd Biesheuvel 				.vecs = crc32_tv_template,
2496ebb3472fSArd Biesheuvel 				.count = CRC32_TEST_VECTORS
2497ebb3472fSArd Biesheuvel 			}
2498ebb3472fSArd Biesheuvel 		}
2499ebb3472fSArd Biesheuvel 	}, {
2500da7f033dSHerbert Xu 		.alg = "crc32c",
25018e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2502a1915d51SJarod Wilson 		.fips_allowed = 1,
2503da7f033dSHerbert Xu 		.suite = {
2504da7f033dSHerbert Xu 			.hash = {
2505da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
2506da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
2507da7f033dSHerbert Xu 			}
2508da7f033dSHerbert Xu 		}
2509da7f033dSHerbert Xu 	}, {
251068411521SHerbert Xu 		.alg = "crct10dif",
251168411521SHerbert Xu 		.test = alg_test_hash,
251268411521SHerbert Xu 		.fips_allowed = 1,
251368411521SHerbert Xu 		.suite = {
251468411521SHerbert Xu 			.hash = {
251568411521SHerbert Xu 				.vecs = crct10dif_tv_template,
251668411521SHerbert Xu 				.count = CRCT10DIF_TEST_VECTORS
251768411521SHerbert Xu 			}
251868411521SHerbert Xu 		}
251968411521SHerbert Xu 	}, {
25206c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
25216c79294fSMilan Broz 		.test = alg_test_null,
25226c79294fSMilan Broz 		.fips_allowed = 1,
25236c79294fSMilan Broz 	}, {
2524d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni)",
2525d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2526d9b1d2e7SJussi Kivilinna 	}, {
2527f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2528f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2529f3f935a7SJussi Kivilinna 	}, {
253056d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-serpent-avx2)",
253156d76c96SJussi Kivilinna 		.test = alg_test_null,
253256d76c96SJussi Kivilinna 	}, {
2533863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
2534863b557aSYouquan, Song 		.test = alg_test_null,
25356c79294fSMilan Broz 		.fips_allowed = 1,
2536863b557aSYouquan, Song 	}, {
2537d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni)",
2538d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2539d9b1d2e7SJussi Kivilinna 	}, {
2540f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2541f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2542f3f935a7SJussi Kivilinna 	}, {
25434d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
25444d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
25454d6d6a2cSJohannes Goetzfried 	}, {
25464ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
25474ea1277dSJohannes Goetzfried 		.test = alg_test_null,
25484ea1277dSJohannes Goetzfried 	}, {
25497efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
25507efe4076SJohannes Goetzfried 		.test = alg_test_null,
25517efe4076SJohannes Goetzfried 	}, {
255256d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-avx2)",
255356d76c96SJussi Kivilinna 		.test = alg_test_null,
255456d76c96SJussi Kivilinna 	}, {
2555937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
2556937c30d7SJussi Kivilinna 		.test = alg_test_null,
2557937c30d7SJussi Kivilinna 	}, {
2558107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
2559107778b5SJohannes Goetzfried 		.test = alg_test_null,
2560107778b5SJohannes Goetzfried 	}, {
25616c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
25626c79294fSMilan Broz 		.test = alg_test_null,
25636c79294fSMilan Broz 		.fips_allowed = 1,
25646c79294fSMilan Broz 	}, {
2565863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2566863b557aSYouquan, Song 		.test = alg_test_null,
25676c79294fSMilan Broz 		.fips_allowed = 1,
2568863b557aSYouquan, Song 	}, {
2569f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2570f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2571a1915d51SJarod Wilson 		.fips_allowed = 1,
2572f7cb80f2SJarod Wilson 		.suite = {
2573f7cb80f2SJarod Wilson 			.cipher = {
2574f7cb80f2SJarod Wilson 				.enc = {
2575f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2576f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2577f7cb80f2SJarod Wilson 				},
2578f7cb80f2SJarod Wilson 				.dec = {
2579f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2580f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2581f7cb80f2SJarod Wilson 				}
2582f7cb80f2SJarod Wilson 			}
2583f7cb80f2SJarod Wilson 		}
2584f7cb80f2SJarod Wilson 	}, {
258585b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
258685b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
258785b63e34SJussi Kivilinna 		.suite = {
258885b63e34SJussi Kivilinna 			.cipher = {
258985b63e34SJussi Kivilinna 				.enc = {
259085b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
259185b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
259285b63e34SJussi Kivilinna 				},
259385b63e34SJussi Kivilinna 				.dec = {
259485b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
259585b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
259685b63e34SJussi Kivilinna 				}
259785b63e34SJussi Kivilinna 			}
259885b63e34SJussi Kivilinna 		}
259985b63e34SJussi Kivilinna 	}, {
26000840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
26010840605eSJussi Kivilinna 		.test = alg_test_skcipher,
26020840605eSJussi Kivilinna 		.suite = {
26030840605eSJussi Kivilinna 			.cipher = {
26040840605eSJussi Kivilinna 				.enc = {
26050840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
26060840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
26070840605eSJussi Kivilinna 				},
26080840605eSJussi Kivilinna 				.dec = {
26090840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
26100840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
26110840605eSJussi Kivilinna 				}
26120840605eSJussi Kivilinna 			}
26130840605eSJussi Kivilinna 		}
26140840605eSJussi Kivilinna 	}, {
2615a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2616a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2617a2c58260SJohannes Goetzfried 		.suite = {
2618a2c58260SJohannes Goetzfried 			.cipher = {
2619a2c58260SJohannes Goetzfried 				.enc = {
2620a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2621a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2622a2c58260SJohannes Goetzfried 				},
2623a2c58260SJohannes Goetzfried 				.dec = {
2624a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2625a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2626a2c58260SJohannes Goetzfried 				}
2627a2c58260SJohannes Goetzfried 			}
2628a2c58260SJohannes Goetzfried 		}
2629a2c58260SJohannes Goetzfried 	}, {
26309b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
26319b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
26329b8b0405SJohannes Goetzfried 		.suite = {
26339b8b0405SJohannes Goetzfried 			.cipher = {
26349b8b0405SJohannes Goetzfried 				.enc = {
26359b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
26369b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
26379b8b0405SJohannes Goetzfried 				},
26389b8b0405SJohannes Goetzfried 				.dec = {
26399b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
26409b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
26419b8b0405SJohannes Goetzfried 				}
26429b8b0405SJohannes Goetzfried 			}
26439b8b0405SJohannes Goetzfried 		}
26449b8b0405SJohannes Goetzfried 	}, {
26458163fc30SJussi Kivilinna 		.alg = "ctr(des)",
26468163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
26478163fc30SJussi Kivilinna 		.suite = {
26488163fc30SJussi Kivilinna 			.cipher = {
26498163fc30SJussi Kivilinna 				.enc = {
26508163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
26518163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
26528163fc30SJussi Kivilinna 				},
26538163fc30SJussi Kivilinna 				.dec = {
26548163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
26558163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
26568163fc30SJussi Kivilinna 				}
26578163fc30SJussi Kivilinna 			}
26588163fc30SJussi Kivilinna 		}
26598163fc30SJussi Kivilinna 	}, {
2660e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2661e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2662e080b17aSJussi Kivilinna 		.suite = {
2663e080b17aSJussi Kivilinna 			.cipher = {
2664e080b17aSJussi Kivilinna 				.enc = {
2665e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2666e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2667e080b17aSJussi Kivilinna 				},
2668e080b17aSJussi Kivilinna 				.dec = {
2669e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2670e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2671e080b17aSJussi Kivilinna 				}
2672e080b17aSJussi Kivilinna 			}
2673e080b17aSJussi Kivilinna 		}
2674e080b17aSJussi Kivilinna 	}, {
26759d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
26769d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
26779d25917dSJussi Kivilinna 		.suite = {
26789d25917dSJussi Kivilinna 			.cipher = {
26799d25917dSJussi Kivilinna 				.enc = {
26809d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
26819d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
26829d25917dSJussi Kivilinna 				},
26839d25917dSJussi Kivilinna 				.dec = {
26849d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
26859d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
26869d25917dSJussi Kivilinna 				}
26879d25917dSJussi Kivilinna 			}
26889d25917dSJussi Kivilinna 		}
26899d25917dSJussi Kivilinna 	}, {
2690573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2691573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2692573da620SJussi Kivilinna 		.suite = {
2693573da620SJussi Kivilinna 			.cipher = {
2694573da620SJussi Kivilinna 				.enc = {
2695573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2696573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2697573da620SJussi Kivilinna 				},
2698573da620SJussi Kivilinna 				.dec = {
2699573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2700573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2701573da620SJussi Kivilinna 				}
2702573da620SJussi Kivilinna 			}
2703573da620SJussi Kivilinna 		}
2704573da620SJussi Kivilinna 	}, {
2705da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
27061aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2707da7f033dSHerbert Xu 		.suite = {
2708da7f033dSHerbert Xu 			.cipher = {
2709da7f033dSHerbert Xu 				.enc = {
2710da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2711da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2712da7f033dSHerbert Xu 				},
2713da7f033dSHerbert Xu 				.dec = {
2714da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2715da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2716da7f033dSHerbert Xu 				}
2717da7f033dSHerbert Xu 			}
2718da7f033dSHerbert Xu 		}
2719da7f033dSHerbert Xu 	}, {
2720da7f033dSHerbert Xu 		.alg = "deflate",
2721da7f033dSHerbert Xu 		.test = alg_test_comp,
27220818904dSMilan Broz 		.fips_allowed = 1,
2723da7f033dSHerbert Xu 		.suite = {
2724da7f033dSHerbert Xu 			.comp = {
2725da7f033dSHerbert Xu 				.comp = {
2726da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2727da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2728da7f033dSHerbert Xu 				},
2729da7f033dSHerbert Xu 				.decomp = {
2730da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2731da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2732da7f033dSHerbert Xu 				}
2733da7f033dSHerbert Xu 			}
2734da7f033dSHerbert Xu 		}
2735da7f033dSHerbert Xu 	}, {
2736e448370dSJussi Kivilinna 		.alg = "digest_null",
2737e448370dSJussi Kivilinna 		.test = alg_test_null,
2738e448370dSJussi Kivilinna 	}, {
273964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes128",
274064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
274164d1cdfbSStephan Mueller 		.fips_allowed = 1,
274264d1cdfbSStephan Mueller 		.suite = {
274364d1cdfbSStephan Mueller 			.drbg = {
274464d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes128_tv_template,
274564d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
274664d1cdfbSStephan Mueller 			}
274764d1cdfbSStephan Mueller 		}
274864d1cdfbSStephan Mueller 	}, {
274964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes192",
275064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
275164d1cdfbSStephan Mueller 		.fips_allowed = 1,
275264d1cdfbSStephan Mueller 		.suite = {
275364d1cdfbSStephan Mueller 			.drbg = {
275464d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes192_tv_template,
275564d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
275664d1cdfbSStephan Mueller 			}
275764d1cdfbSStephan Mueller 		}
275864d1cdfbSStephan Mueller 	}, {
275964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes256",
276064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
276164d1cdfbSStephan Mueller 		.fips_allowed = 1,
276264d1cdfbSStephan Mueller 		.suite = {
276364d1cdfbSStephan Mueller 			.drbg = {
276464d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes256_tv_template,
276564d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
276664d1cdfbSStephan Mueller 			}
276764d1cdfbSStephan Mueller 		}
276864d1cdfbSStephan Mueller 	}, {
276964d1cdfbSStephan Mueller 		/*
277064d1cdfbSStephan Mueller 		 * There is no need to specifically test the DRBG with every
277164d1cdfbSStephan Mueller 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
277264d1cdfbSStephan Mueller 		 */
277364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha1",
277464d1cdfbSStephan Mueller 		.fips_allowed = 1,
277564d1cdfbSStephan Mueller 		.test = alg_test_null,
277664d1cdfbSStephan Mueller 	}, {
277764d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha256",
277864d1cdfbSStephan Mueller 		.test = alg_test_drbg,
277964d1cdfbSStephan Mueller 		.fips_allowed = 1,
278064d1cdfbSStephan Mueller 		.suite = {
278164d1cdfbSStephan Mueller 			.drbg = {
278264d1cdfbSStephan Mueller 				.vecs = drbg_nopr_hmac_sha256_tv_template,
278364d1cdfbSStephan Mueller 				.count =
278464d1cdfbSStephan Mueller 				ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
278564d1cdfbSStephan Mueller 			}
278664d1cdfbSStephan Mueller 		}
278764d1cdfbSStephan Mueller 	}, {
278864d1cdfbSStephan Mueller 		/* covered by drbg_nopr_hmac_sha256 test */
278964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha384",
279064d1cdfbSStephan Mueller 		.fips_allowed = 1,
279164d1cdfbSStephan Mueller 		.test = alg_test_null,
279264d1cdfbSStephan Mueller 	}, {
279364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha512",
279464d1cdfbSStephan Mueller 		.test = alg_test_null,
279564d1cdfbSStephan Mueller 		.fips_allowed = 1,
279664d1cdfbSStephan Mueller 	}, {
279764d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha1",
279864d1cdfbSStephan Mueller 		.fips_allowed = 1,
279964d1cdfbSStephan Mueller 		.test = alg_test_null,
280064d1cdfbSStephan Mueller 	}, {
280164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha256",
280264d1cdfbSStephan Mueller 		.test = alg_test_drbg,
280364d1cdfbSStephan Mueller 		.fips_allowed = 1,
280464d1cdfbSStephan Mueller 		.suite = {
280564d1cdfbSStephan Mueller 			.drbg = {
280664d1cdfbSStephan Mueller 				.vecs = drbg_nopr_sha256_tv_template,
280764d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
280864d1cdfbSStephan Mueller 			}
280964d1cdfbSStephan Mueller 		}
281064d1cdfbSStephan Mueller 	}, {
281164d1cdfbSStephan Mueller 		/* covered by drbg_nopr_sha256 test */
281264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha384",
281364d1cdfbSStephan Mueller 		.fips_allowed = 1,
281464d1cdfbSStephan Mueller 		.test = alg_test_null,
281564d1cdfbSStephan Mueller 	}, {
281664d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha512",
281764d1cdfbSStephan Mueller 		.fips_allowed = 1,
281864d1cdfbSStephan Mueller 		.test = alg_test_null,
281964d1cdfbSStephan Mueller 	}, {
282064d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes128",
282164d1cdfbSStephan Mueller 		.test = alg_test_drbg,
282264d1cdfbSStephan Mueller 		.fips_allowed = 1,
282364d1cdfbSStephan Mueller 		.suite = {
282464d1cdfbSStephan Mueller 			.drbg = {
282564d1cdfbSStephan Mueller 				.vecs = drbg_pr_ctr_aes128_tv_template,
282664d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
282764d1cdfbSStephan Mueller 			}
282864d1cdfbSStephan Mueller 		}
282964d1cdfbSStephan Mueller 	}, {
283064d1cdfbSStephan Mueller 		/* covered by drbg_pr_ctr_aes128 test */
283164d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes192",
283264d1cdfbSStephan Mueller 		.fips_allowed = 1,
283364d1cdfbSStephan Mueller 		.test = alg_test_null,
283464d1cdfbSStephan Mueller 	}, {
283564d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes256",
283664d1cdfbSStephan Mueller 		.fips_allowed = 1,
283764d1cdfbSStephan Mueller 		.test = alg_test_null,
283864d1cdfbSStephan Mueller 	}, {
283964d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha1",
284064d1cdfbSStephan Mueller 		.fips_allowed = 1,
284164d1cdfbSStephan Mueller 		.test = alg_test_null,
284264d1cdfbSStephan Mueller 	}, {
284364d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha256",
284464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
284564d1cdfbSStephan Mueller 		.fips_allowed = 1,
284664d1cdfbSStephan Mueller 		.suite = {
284764d1cdfbSStephan Mueller 			.drbg = {
284864d1cdfbSStephan Mueller 				.vecs = drbg_pr_hmac_sha256_tv_template,
284964d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
285064d1cdfbSStephan Mueller 			}
285164d1cdfbSStephan Mueller 		}
285264d1cdfbSStephan Mueller 	}, {
285364d1cdfbSStephan Mueller 		/* covered by drbg_pr_hmac_sha256 test */
285464d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha384",
285564d1cdfbSStephan Mueller 		.fips_allowed = 1,
285664d1cdfbSStephan Mueller 		.test = alg_test_null,
285764d1cdfbSStephan Mueller 	}, {
285864d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha512",
285964d1cdfbSStephan Mueller 		.test = alg_test_null,
286064d1cdfbSStephan Mueller 		.fips_allowed = 1,
286164d1cdfbSStephan Mueller 	}, {
286264d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha1",
286364d1cdfbSStephan Mueller 		.fips_allowed = 1,
286464d1cdfbSStephan Mueller 		.test = alg_test_null,
286564d1cdfbSStephan Mueller 	}, {
286664d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha256",
286764d1cdfbSStephan Mueller 		.test = alg_test_drbg,
286864d1cdfbSStephan Mueller 		.fips_allowed = 1,
286964d1cdfbSStephan Mueller 		.suite = {
287064d1cdfbSStephan Mueller 			.drbg = {
287164d1cdfbSStephan Mueller 				.vecs = drbg_pr_sha256_tv_template,
287264d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
287364d1cdfbSStephan Mueller 			}
287464d1cdfbSStephan Mueller 		}
287564d1cdfbSStephan Mueller 	}, {
287664d1cdfbSStephan Mueller 		/* covered by drbg_pr_sha256 test */
287764d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha384",
287864d1cdfbSStephan Mueller 		.fips_allowed = 1,
287964d1cdfbSStephan Mueller 		.test = alg_test_null,
288064d1cdfbSStephan Mueller 	}, {
288164d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha512",
288264d1cdfbSStephan Mueller 		.fips_allowed = 1,
288364d1cdfbSStephan Mueller 		.test = alg_test_null,
288464d1cdfbSStephan Mueller 	}, {
2885863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2886863b557aSYouquan, Song 		.test = alg_test_null,
28876c79294fSMilan Broz 		.fips_allowed = 1,
2888863b557aSYouquan, Song 	}, {
2889da7f033dSHerbert Xu 		.alg = "ecb(aes)",
28901aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2891a1915d51SJarod Wilson 		.fips_allowed = 1,
2892da7f033dSHerbert Xu 		.suite = {
2893da7f033dSHerbert Xu 			.cipher = {
2894da7f033dSHerbert Xu 				.enc = {
2895da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2896da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2897da7f033dSHerbert Xu 				},
2898da7f033dSHerbert Xu 				.dec = {
2899da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2900da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2901da7f033dSHerbert Xu 				}
2902da7f033dSHerbert Xu 			}
2903da7f033dSHerbert Xu 		}
2904da7f033dSHerbert Xu 	}, {
2905da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
29061aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2907da7f033dSHerbert Xu 		.suite = {
2908da7f033dSHerbert Xu 			.cipher = {
2909da7f033dSHerbert Xu 				.enc = {
2910da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2911da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2912da7f033dSHerbert Xu 				},
2913da7f033dSHerbert Xu 				.dec = {
2914da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2915da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2916da7f033dSHerbert Xu 				}
2917da7f033dSHerbert Xu 			}
2918da7f033dSHerbert Xu 		}
2919da7f033dSHerbert Xu 	}, {
2920da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
29211aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2922da7f033dSHerbert Xu 		.suite = {
2923da7f033dSHerbert Xu 			.cipher = {
2924da7f033dSHerbert Xu 				.enc = {
2925da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2926da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2927da7f033dSHerbert Xu 				},
2928da7f033dSHerbert Xu 				.dec = {
2929da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2930da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2931da7f033dSHerbert Xu 				}
2932da7f033dSHerbert Xu 			}
2933da7f033dSHerbert Xu 		}
2934da7f033dSHerbert Xu 	}, {
2935da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
29361aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2937da7f033dSHerbert Xu 		.suite = {
2938da7f033dSHerbert Xu 			.cipher = {
2939da7f033dSHerbert Xu 				.enc = {
2940da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2941da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2942da7f033dSHerbert Xu 				},
2943da7f033dSHerbert Xu 				.dec = {
2944da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2945da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2946da7f033dSHerbert Xu 				}
2947da7f033dSHerbert Xu 			}
2948da7f033dSHerbert Xu 		}
2949da7f033dSHerbert Xu 	}, {
2950da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
29511aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2952da7f033dSHerbert Xu 		.suite = {
2953da7f033dSHerbert Xu 			.cipher = {
2954da7f033dSHerbert Xu 				.enc = {
2955da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2956da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2957da7f033dSHerbert Xu 				},
2958da7f033dSHerbert Xu 				.dec = {
2959da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2960da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2961da7f033dSHerbert Xu 				}
2962da7f033dSHerbert Xu 			}
2963da7f033dSHerbert Xu 		}
2964da7f033dSHerbert Xu 	}, {
2965da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
29661aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2967da7f033dSHerbert Xu 		.suite = {
2968da7f033dSHerbert Xu 			.cipher = {
2969da7f033dSHerbert Xu 				.enc = {
2970da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2971da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2972da7f033dSHerbert Xu 				},
2973da7f033dSHerbert Xu 				.dec = {
2974da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2975da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2976da7f033dSHerbert Xu 				}
2977da7f033dSHerbert Xu 			}
2978da7f033dSHerbert Xu 		}
2979da7f033dSHerbert Xu 	}, {
2980da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
29811aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2982da7f033dSHerbert Xu 		.suite = {
2983da7f033dSHerbert Xu 			.cipher = {
2984da7f033dSHerbert Xu 				.enc = {
2985da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2986da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
2987da7f033dSHerbert Xu 				},
2988da7f033dSHerbert Xu 				.dec = {
2989da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
2990da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
2991da7f033dSHerbert Xu 				}
2992da7f033dSHerbert Xu 			}
2993da7f033dSHerbert Xu 		}
2994da7f033dSHerbert Xu 	}, {
2995e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
2996e448370dSJussi Kivilinna 		.test = alg_test_null,
2997e448370dSJussi Kivilinna 	}, {
2998da7f033dSHerbert Xu 		.alg = "ecb(des)",
29991aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3000da7f033dSHerbert Xu 		.suite = {
3001da7f033dSHerbert Xu 			.cipher = {
3002da7f033dSHerbert Xu 				.enc = {
3003da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
3004da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
3005da7f033dSHerbert Xu 				},
3006da7f033dSHerbert Xu 				.dec = {
3007da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
3008da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
3009da7f033dSHerbert Xu 				}
3010da7f033dSHerbert Xu 			}
3011da7f033dSHerbert Xu 		}
3012da7f033dSHerbert Xu 	}, {
3013da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
30141aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3015a1915d51SJarod Wilson 		.fips_allowed = 1,
3016da7f033dSHerbert Xu 		.suite = {
3017da7f033dSHerbert Xu 			.cipher = {
3018da7f033dSHerbert Xu 				.enc = {
3019da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
3020da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
3021da7f033dSHerbert Xu 				},
3022da7f033dSHerbert Xu 				.dec = {
3023da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
3024da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
3025da7f033dSHerbert Xu 				}
3026da7f033dSHerbert Xu 			}
3027da7f033dSHerbert Xu 		}
3028da7f033dSHerbert Xu 	}, {
302966e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
303066e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
303166e5bd00SJussi Kivilinna 		.suite = {
303266e5bd00SJussi Kivilinna 			.cipher = {
303366e5bd00SJussi Kivilinna 				.enc = {
303466e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
303566e5bd00SJussi Kivilinna 					.count = 1
303666e5bd00SJussi Kivilinna 				},
303766e5bd00SJussi Kivilinna 				.dec = {
303866e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
303966e5bd00SJussi Kivilinna 					.count = 1
304066e5bd00SJussi Kivilinna 				}
304166e5bd00SJussi Kivilinna 			}
304266e5bd00SJussi Kivilinna 		}
304366e5bd00SJussi Kivilinna 	}, {
3044da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
30451aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3046da7f033dSHerbert Xu 		.suite = {
3047da7f033dSHerbert Xu 			.cipher = {
3048da7f033dSHerbert Xu 				.enc = {
3049da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
3050da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
3051da7f033dSHerbert Xu 				},
3052da7f033dSHerbert Xu 				.dec = {
3053da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
3054da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
3055da7f033dSHerbert Xu 				}
3056da7f033dSHerbert Xu 			}
3057da7f033dSHerbert Xu 		}
3058da7f033dSHerbert Xu 	}, {
3059da7f033dSHerbert Xu 		.alg = "ecb(seed)",
30601aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3061da7f033dSHerbert Xu 		.suite = {
3062da7f033dSHerbert Xu 			.cipher = {
3063da7f033dSHerbert Xu 				.enc = {
3064da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
3065da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
3066da7f033dSHerbert Xu 				},
3067da7f033dSHerbert Xu 				.dec = {
3068da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
3069da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
3070da7f033dSHerbert Xu 				}
3071da7f033dSHerbert Xu 			}
3072da7f033dSHerbert Xu 		}
3073da7f033dSHerbert Xu 	}, {
3074da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
30751aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3076da7f033dSHerbert Xu 		.suite = {
3077da7f033dSHerbert Xu 			.cipher = {
3078da7f033dSHerbert Xu 				.enc = {
3079da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
3080da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
3081da7f033dSHerbert Xu 				},
3082da7f033dSHerbert Xu 				.dec = {
3083da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
3084da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
3085da7f033dSHerbert Xu 				}
3086da7f033dSHerbert Xu 			}
3087da7f033dSHerbert Xu 		}
3088da7f033dSHerbert Xu 	}, {
3089da7f033dSHerbert Xu 		.alg = "ecb(tea)",
30901aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3091da7f033dSHerbert Xu 		.suite = {
3092da7f033dSHerbert Xu 			.cipher = {
3093da7f033dSHerbert Xu 				.enc = {
3094da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
3095da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
3096da7f033dSHerbert Xu 				},
3097da7f033dSHerbert Xu 				.dec = {
3098da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
3099da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
3100da7f033dSHerbert Xu 				}
3101da7f033dSHerbert Xu 			}
3102da7f033dSHerbert Xu 		}
3103da7f033dSHerbert Xu 	}, {
3104da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
31051aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3106da7f033dSHerbert Xu 		.suite = {
3107da7f033dSHerbert Xu 			.cipher = {
3108da7f033dSHerbert Xu 				.enc = {
3109da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
3110da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
3111da7f033dSHerbert Xu 				},
3112da7f033dSHerbert Xu 				.dec = {
3113da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
3114da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
3115da7f033dSHerbert Xu 				}
3116da7f033dSHerbert Xu 			}
3117da7f033dSHerbert Xu 		}
3118da7f033dSHerbert Xu 	}, {
3119da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
31201aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3121da7f033dSHerbert Xu 		.suite = {
3122da7f033dSHerbert Xu 			.cipher = {
3123da7f033dSHerbert Xu 				.enc = {
3124da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
3125da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
3126da7f033dSHerbert Xu 				},
3127da7f033dSHerbert Xu 				.dec = {
3128da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
3129da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
3130da7f033dSHerbert Xu 				}
3131da7f033dSHerbert Xu 			}
3132da7f033dSHerbert Xu 		}
3133da7f033dSHerbert Xu 	}, {
3134da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
31351aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3136da7f033dSHerbert Xu 		.suite = {
3137da7f033dSHerbert Xu 			.cipher = {
3138da7f033dSHerbert Xu 				.enc = {
3139da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
3140da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
3141da7f033dSHerbert Xu 				},
3142da7f033dSHerbert Xu 				.dec = {
3143da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
3144da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
3145da7f033dSHerbert Xu 				}
3146da7f033dSHerbert Xu 			}
3147da7f033dSHerbert Xu 		}
3148da7f033dSHerbert Xu 	}, {
3149da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
31501aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3151da7f033dSHerbert Xu 		.suite = {
3152da7f033dSHerbert Xu 			.cipher = {
3153da7f033dSHerbert Xu 				.enc = {
3154da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
3155da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
3156da7f033dSHerbert Xu 				},
3157da7f033dSHerbert Xu 				.dec = {
3158da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
3159da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
3160da7f033dSHerbert Xu 				}
3161da7f033dSHerbert Xu 			}
3162da7f033dSHerbert Xu 		}
3163da7f033dSHerbert Xu 	}, {
3164da7f033dSHerbert Xu 		.alg = "gcm(aes)",
3165da7f033dSHerbert Xu 		.test = alg_test_aead,
3166a1915d51SJarod Wilson 		.fips_allowed = 1,
3167da7f033dSHerbert Xu 		.suite = {
3168da7f033dSHerbert Xu 			.aead = {
3169da7f033dSHerbert Xu 				.enc = {
3170da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
3171da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
3172da7f033dSHerbert Xu 				},
3173da7f033dSHerbert Xu 				.dec = {
3174da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
3175da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
3176da7f033dSHerbert Xu 				}
3177da7f033dSHerbert Xu 			}
3178da7f033dSHerbert Xu 		}
3179da7f033dSHerbert Xu 	}, {
3180507069c9SYouquan, Song 		.alg = "ghash",
3181507069c9SYouquan, Song 		.test = alg_test_hash,
318218c0ebd2SJarod Wilson 		.fips_allowed = 1,
3183507069c9SYouquan, Song 		.suite = {
3184507069c9SYouquan, Song 			.hash = {
3185507069c9SYouquan, Song 				.vecs = ghash_tv_template,
3186507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
3187507069c9SYouquan, Song 			}
3188507069c9SYouquan, Song 		}
3189507069c9SYouquan, Song 	}, {
3190a482b081SSonic Zhang 		.alg = "hmac(crc32)",
3191a482b081SSonic Zhang 		.test = alg_test_hash,
3192a482b081SSonic Zhang 		.suite = {
3193a482b081SSonic Zhang 			.hash = {
3194a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
3195a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
3196a482b081SSonic Zhang 			}
3197a482b081SSonic Zhang 		}
3198a482b081SSonic Zhang 	}, {
3199da7f033dSHerbert Xu 		.alg = "hmac(md5)",
3200da7f033dSHerbert Xu 		.test = alg_test_hash,
3201da7f033dSHerbert Xu 		.suite = {
3202da7f033dSHerbert Xu 			.hash = {
3203da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
3204da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
3205da7f033dSHerbert Xu 			}
3206da7f033dSHerbert Xu 		}
3207da7f033dSHerbert Xu 	}, {
3208da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
3209da7f033dSHerbert Xu 		.test = alg_test_hash,
3210da7f033dSHerbert Xu 		.suite = {
3211da7f033dSHerbert Xu 			.hash = {
3212da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
3213da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
3214da7f033dSHerbert Xu 			}
3215da7f033dSHerbert Xu 		}
3216da7f033dSHerbert Xu 	}, {
3217da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
3218da7f033dSHerbert Xu 		.test = alg_test_hash,
3219da7f033dSHerbert Xu 		.suite = {
3220da7f033dSHerbert Xu 			.hash = {
3221da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
3222da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
3223da7f033dSHerbert Xu 			}
3224da7f033dSHerbert Xu 		}
3225da7f033dSHerbert Xu 	}, {
3226da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
3227da7f033dSHerbert Xu 		.test = alg_test_hash,
3228a1915d51SJarod Wilson 		.fips_allowed = 1,
3229da7f033dSHerbert Xu 		.suite = {
3230da7f033dSHerbert Xu 			.hash = {
3231da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
3232da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
3233da7f033dSHerbert Xu 			}
3234da7f033dSHerbert Xu 		}
3235da7f033dSHerbert Xu 	}, {
3236da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
3237da7f033dSHerbert Xu 		.test = alg_test_hash,
3238a1915d51SJarod Wilson 		.fips_allowed = 1,
3239da7f033dSHerbert Xu 		.suite = {
3240da7f033dSHerbert Xu 			.hash = {
3241da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
3242da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
3243da7f033dSHerbert Xu 			}
3244da7f033dSHerbert Xu 		}
3245da7f033dSHerbert Xu 	}, {
3246da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
3247da7f033dSHerbert Xu 		.test = alg_test_hash,
3248a1915d51SJarod Wilson 		.fips_allowed = 1,
3249da7f033dSHerbert Xu 		.suite = {
3250da7f033dSHerbert Xu 			.hash = {
3251da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
3252da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
3253da7f033dSHerbert Xu 			}
3254da7f033dSHerbert Xu 		}
3255da7f033dSHerbert Xu 	}, {
3256da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
3257da7f033dSHerbert Xu 		.test = alg_test_hash,
3258a1915d51SJarod Wilson 		.fips_allowed = 1,
3259da7f033dSHerbert Xu 		.suite = {
3260da7f033dSHerbert Xu 			.hash = {
3261da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
3262da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
3263da7f033dSHerbert Xu 			}
3264da7f033dSHerbert Xu 		}
3265da7f033dSHerbert Xu 	}, {
3266da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
3267da7f033dSHerbert Xu 		.test = alg_test_hash,
3268a1915d51SJarod Wilson 		.fips_allowed = 1,
3269da7f033dSHerbert Xu 		.suite = {
3270da7f033dSHerbert Xu 			.hash = {
3271da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
3272da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
3273da7f033dSHerbert Xu 			}
3274da7f033dSHerbert Xu 		}
3275da7f033dSHerbert Xu 	}, {
3276bb5530e4SStephan Mueller 		.alg = "jitterentropy_rng",
3277bb5530e4SStephan Mueller 		.fips_allowed = 1,
3278bb5530e4SStephan Mueller 		.test = alg_test_null,
3279bb5530e4SStephan Mueller 	}, {
3280da7f033dSHerbert Xu 		.alg = "lrw(aes)",
32811aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3282da7f033dSHerbert Xu 		.suite = {
3283da7f033dSHerbert Xu 			.cipher = {
3284da7f033dSHerbert Xu 				.enc = {
3285da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
3286da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
3287da7f033dSHerbert Xu 				},
3288da7f033dSHerbert Xu 				.dec = {
3289da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
3290da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
3291da7f033dSHerbert Xu 				}
3292da7f033dSHerbert Xu 			}
3293da7f033dSHerbert Xu 		}
3294da7f033dSHerbert Xu 	}, {
32950840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
32960840605eSJussi Kivilinna 		.test = alg_test_skcipher,
32970840605eSJussi Kivilinna 		.suite = {
32980840605eSJussi Kivilinna 			.cipher = {
32990840605eSJussi Kivilinna 				.enc = {
33000840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
33010840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
33020840605eSJussi Kivilinna 				},
33030840605eSJussi Kivilinna 				.dec = {
33040840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
33050840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
33060840605eSJussi Kivilinna 				}
33070840605eSJussi Kivilinna 			}
33080840605eSJussi Kivilinna 		}
33090840605eSJussi Kivilinna 	}, {
33109b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
33119b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
33129b8b0405SJohannes Goetzfried 		.suite = {
33139b8b0405SJohannes Goetzfried 			.cipher = {
33149b8b0405SJohannes Goetzfried 				.enc = {
33159b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
33169b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
33179b8b0405SJohannes Goetzfried 				},
33189b8b0405SJohannes Goetzfried 				.dec = {
33199b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
33209b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
33219b8b0405SJohannes Goetzfried 				}
33229b8b0405SJohannes Goetzfried 			}
33239b8b0405SJohannes Goetzfried 		}
33249b8b0405SJohannes Goetzfried 	}, {
3325d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
3326d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
3327d7bfc0faSJussi Kivilinna 		.suite = {
3328d7bfc0faSJussi Kivilinna 			.cipher = {
3329d7bfc0faSJussi Kivilinna 				.enc = {
3330d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
3331d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
3332d7bfc0faSJussi Kivilinna 				},
3333d7bfc0faSJussi Kivilinna 				.dec = {
3334d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
3335d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
3336d7bfc0faSJussi Kivilinna 				}
3337d7bfc0faSJussi Kivilinna 			}
3338d7bfc0faSJussi Kivilinna 		}
3339d7bfc0faSJussi Kivilinna 	}, {
33400b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
33410b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
33420b2a1551SJussi Kivilinna 		.suite = {
33430b2a1551SJussi Kivilinna 			.cipher = {
33440b2a1551SJussi Kivilinna 				.enc = {
33450b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
33460b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
33470b2a1551SJussi Kivilinna 				},
33480b2a1551SJussi Kivilinna 				.dec = {
33490b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
33500b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
33510b2a1551SJussi Kivilinna 				}
33520b2a1551SJussi Kivilinna 			}
33530b2a1551SJussi Kivilinna 		}
33540b2a1551SJussi Kivilinna 	}, {
33551443cc9bSKOVACS Krisztian 		.alg = "lz4",
33561443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
33571443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
33581443cc9bSKOVACS Krisztian 		.suite = {
33591443cc9bSKOVACS Krisztian 			.comp = {
33601443cc9bSKOVACS Krisztian 				.comp = {
33611443cc9bSKOVACS Krisztian 					.vecs = lz4_comp_tv_template,
33621443cc9bSKOVACS Krisztian 					.count = LZ4_COMP_TEST_VECTORS
33631443cc9bSKOVACS Krisztian 				},
33641443cc9bSKOVACS Krisztian 				.decomp = {
33651443cc9bSKOVACS Krisztian 					.vecs = lz4_decomp_tv_template,
33661443cc9bSKOVACS Krisztian 					.count = LZ4_DECOMP_TEST_VECTORS
33671443cc9bSKOVACS Krisztian 				}
33681443cc9bSKOVACS Krisztian 			}
33691443cc9bSKOVACS Krisztian 		}
33701443cc9bSKOVACS Krisztian 	}, {
33711443cc9bSKOVACS Krisztian 		.alg = "lz4hc",
33721443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
33731443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
33741443cc9bSKOVACS Krisztian 		.suite = {
33751443cc9bSKOVACS Krisztian 			.comp = {
33761443cc9bSKOVACS Krisztian 				.comp = {
33771443cc9bSKOVACS Krisztian 					.vecs = lz4hc_comp_tv_template,
33781443cc9bSKOVACS Krisztian 					.count = LZ4HC_COMP_TEST_VECTORS
33791443cc9bSKOVACS Krisztian 				},
33801443cc9bSKOVACS Krisztian 				.decomp = {
33811443cc9bSKOVACS Krisztian 					.vecs = lz4hc_decomp_tv_template,
33821443cc9bSKOVACS Krisztian 					.count = LZ4HC_DECOMP_TEST_VECTORS
33831443cc9bSKOVACS Krisztian 				}
33841443cc9bSKOVACS Krisztian 			}
33851443cc9bSKOVACS Krisztian 		}
33861443cc9bSKOVACS Krisztian 	}, {
3387da7f033dSHerbert Xu 		.alg = "lzo",
3388da7f033dSHerbert Xu 		.test = alg_test_comp,
33890818904dSMilan Broz 		.fips_allowed = 1,
3390da7f033dSHerbert Xu 		.suite = {
3391da7f033dSHerbert Xu 			.comp = {
3392da7f033dSHerbert Xu 				.comp = {
3393da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
3394da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
3395da7f033dSHerbert Xu 				},
3396da7f033dSHerbert Xu 				.decomp = {
3397da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
3398da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
3399da7f033dSHerbert Xu 				}
3400da7f033dSHerbert Xu 			}
3401da7f033dSHerbert Xu 		}
3402da7f033dSHerbert Xu 	}, {
3403da7f033dSHerbert Xu 		.alg = "md4",
3404da7f033dSHerbert Xu 		.test = alg_test_hash,
3405da7f033dSHerbert Xu 		.suite = {
3406da7f033dSHerbert Xu 			.hash = {
3407da7f033dSHerbert Xu 				.vecs = md4_tv_template,
3408da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
3409da7f033dSHerbert Xu 			}
3410da7f033dSHerbert Xu 		}
3411da7f033dSHerbert Xu 	}, {
3412da7f033dSHerbert Xu 		.alg = "md5",
3413da7f033dSHerbert Xu 		.test = alg_test_hash,
3414da7f033dSHerbert Xu 		.suite = {
3415da7f033dSHerbert Xu 			.hash = {
3416da7f033dSHerbert Xu 				.vecs = md5_tv_template,
3417da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
3418da7f033dSHerbert Xu 			}
3419da7f033dSHerbert Xu 		}
3420da7f033dSHerbert Xu 	}, {
3421da7f033dSHerbert Xu 		.alg = "michael_mic",
3422da7f033dSHerbert Xu 		.test = alg_test_hash,
3423da7f033dSHerbert Xu 		.suite = {
3424da7f033dSHerbert Xu 			.hash = {
3425da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
3426da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
3427da7f033dSHerbert Xu 			}
3428da7f033dSHerbert Xu 		}
3429da7f033dSHerbert Xu 	}, {
3430ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
3431ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
3432ba0e14acSPuneet Saxena 		.fips_allowed = 1,
3433ba0e14acSPuneet Saxena 		.suite = {
3434ba0e14acSPuneet Saxena 			.cipher = {
3435ba0e14acSPuneet Saxena 				.enc = {
3436ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
3437ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
3438ba0e14acSPuneet Saxena 				},
3439ba0e14acSPuneet Saxena 				.dec = {
3440ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
3441ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
3442ba0e14acSPuneet Saxena 				}
3443ba0e14acSPuneet Saxena 			}
3444ba0e14acSPuneet Saxena 		}
3445ba0e14acSPuneet Saxena 	}, {
3446da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
34471aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3448da7f033dSHerbert Xu 		.suite = {
3449da7f033dSHerbert Xu 			.cipher = {
3450da7f033dSHerbert Xu 				.enc = {
3451da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
3452da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
3453da7f033dSHerbert Xu 				},
3454da7f033dSHerbert Xu 				.dec = {
3455da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
3456da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
3457da7f033dSHerbert Xu 				}
3458da7f033dSHerbert Xu 			}
3459da7f033dSHerbert Xu 		}
3460da7f033dSHerbert Xu 	}, {
3461eee9dc61SMartin Willi 		.alg = "poly1305",
3462eee9dc61SMartin Willi 		.test = alg_test_hash,
3463eee9dc61SMartin Willi 		.suite = {
3464eee9dc61SMartin Willi 			.hash = {
3465eee9dc61SMartin Willi 				.vecs = poly1305_tv_template,
3466eee9dc61SMartin Willi 				.count = POLY1305_TEST_VECTORS
3467eee9dc61SMartin Willi 			}
3468eee9dc61SMartin Willi 		}
3469eee9dc61SMartin Willi 	}, {
3470da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
34711aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3472a1915d51SJarod Wilson 		.fips_allowed = 1,
3473da7f033dSHerbert Xu 		.suite = {
3474da7f033dSHerbert Xu 			.cipher = {
3475da7f033dSHerbert Xu 				.enc = {
3476f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
3477f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
3478da7f033dSHerbert Xu 				},
3479da7f033dSHerbert Xu 				.dec = {
3480f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
3481f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
3482da7f033dSHerbert Xu 				}
3483da7f033dSHerbert Xu 			}
3484da7f033dSHerbert Xu 		}
3485da7f033dSHerbert Xu 	}, {
34863f31a740SHerbert Xu 		.alg = "rfc4106(gcm(aes))",
348769435b94SAdrian Hoban 		.test = alg_test_aead,
3488db71f29aSJarod Wilson 		.fips_allowed = 1,
348969435b94SAdrian Hoban 		.suite = {
349069435b94SAdrian Hoban 			.aead = {
349169435b94SAdrian Hoban 				.enc = {
349269435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
349369435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
349469435b94SAdrian Hoban 				},
349569435b94SAdrian Hoban 				.dec = {
349669435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
349769435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
349869435b94SAdrian Hoban 				}
349969435b94SAdrian Hoban 			}
350069435b94SAdrian Hoban 		}
350169435b94SAdrian Hoban 	}, {
3502544c436aSHerbert Xu 		.alg = "rfc4309(ccm(aes))",
35035d667322SJarod Wilson 		.test = alg_test_aead,
3504a1915d51SJarod Wilson 		.fips_allowed = 1,
35055d667322SJarod Wilson 		.suite = {
35065d667322SJarod Wilson 			.aead = {
35075d667322SJarod Wilson 				.enc = {
35085d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
35095d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
35105d667322SJarod Wilson 				},
35115d667322SJarod Wilson 				.dec = {
35125d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
35135d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
35145d667322SJarod Wilson 				}
35155d667322SJarod Wilson 			}
35165d667322SJarod Wilson 		}
35175d667322SJarod Wilson 	}, {
3518bb68745eSHerbert Xu 		.alg = "rfc4543(gcm(aes))",
3519e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
3520e9b7441aSJussi Kivilinna 		.suite = {
3521e9b7441aSJussi Kivilinna 			.aead = {
3522e9b7441aSJussi Kivilinna 				.enc = {
3523e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_enc_tv_template,
3524e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_ENC_TEST_VECTORS
3525e9b7441aSJussi Kivilinna 				},
3526e9b7441aSJussi Kivilinna 				.dec = {
3527e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_dec_tv_template,
3528e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_DEC_TEST_VECTORS
3529e9b7441aSJussi Kivilinna 				},
3530e9b7441aSJussi Kivilinna 			}
3531e9b7441aSJussi Kivilinna 		}
3532e9b7441aSJussi Kivilinna 	}, {
3533af2b76b5SMartin Willi 		.alg = "rfc7539(chacha20,poly1305)",
3534af2b76b5SMartin Willi 		.test = alg_test_aead,
3535af2b76b5SMartin Willi 		.suite = {
3536af2b76b5SMartin Willi 			.aead = {
3537af2b76b5SMartin Willi 				.enc = {
3538af2b76b5SMartin Willi 					.vecs = rfc7539_enc_tv_template,
3539af2b76b5SMartin Willi 					.count = RFC7539_ENC_TEST_VECTORS
3540af2b76b5SMartin Willi 				},
3541af2b76b5SMartin Willi 				.dec = {
3542af2b76b5SMartin Willi 					.vecs = rfc7539_dec_tv_template,
3543af2b76b5SMartin Willi 					.count = RFC7539_DEC_TEST_VECTORS
3544af2b76b5SMartin Willi 				},
3545af2b76b5SMartin Willi 			}
3546af2b76b5SMartin Willi 		}
3547af2b76b5SMartin Willi 	}, {
35485900758dSMartin Willi 		.alg = "rfc7539esp(chacha20,poly1305)",
35495900758dSMartin Willi 		.test = alg_test_aead,
35505900758dSMartin Willi 		.suite = {
35515900758dSMartin Willi 			.aead = {
35525900758dSMartin Willi 				.enc = {
35535900758dSMartin Willi 					.vecs = rfc7539esp_enc_tv_template,
35545900758dSMartin Willi 					.count = RFC7539ESP_ENC_TEST_VECTORS
35555900758dSMartin Willi 				},
35565900758dSMartin Willi 				.dec = {
35575900758dSMartin Willi 					.vecs = rfc7539esp_dec_tv_template,
35585900758dSMartin Willi 					.count = RFC7539ESP_DEC_TEST_VECTORS
35595900758dSMartin Willi 				},
35605900758dSMartin Willi 			}
35615900758dSMartin Willi 		}
35625900758dSMartin Willi 	}, {
3563da7f033dSHerbert Xu 		.alg = "rmd128",
3564da7f033dSHerbert Xu 		.test = alg_test_hash,
3565da7f033dSHerbert Xu 		.suite = {
3566da7f033dSHerbert Xu 			.hash = {
3567da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
3568da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
3569da7f033dSHerbert Xu 			}
3570da7f033dSHerbert Xu 		}
3571da7f033dSHerbert Xu 	}, {
3572da7f033dSHerbert Xu 		.alg = "rmd160",
3573da7f033dSHerbert Xu 		.test = alg_test_hash,
3574da7f033dSHerbert Xu 		.suite = {
3575da7f033dSHerbert Xu 			.hash = {
3576da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
3577da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
3578da7f033dSHerbert Xu 			}
3579da7f033dSHerbert Xu 		}
3580da7f033dSHerbert Xu 	}, {
3581da7f033dSHerbert Xu 		.alg = "rmd256",
3582da7f033dSHerbert Xu 		.test = alg_test_hash,
3583da7f033dSHerbert Xu 		.suite = {
3584da7f033dSHerbert Xu 			.hash = {
3585da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
3586da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
3587da7f033dSHerbert Xu 			}
3588da7f033dSHerbert Xu 		}
3589da7f033dSHerbert Xu 	}, {
3590da7f033dSHerbert Xu 		.alg = "rmd320",
3591da7f033dSHerbert Xu 		.test = alg_test_hash,
3592da7f033dSHerbert Xu 		.suite = {
3593da7f033dSHerbert Xu 			.hash = {
3594da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
3595da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
3596da7f033dSHerbert Xu 			}
3597da7f033dSHerbert Xu 		}
3598da7f033dSHerbert Xu 	}, {
3599946cc463STadeusz Struk 		.alg = "rsa",
3600946cc463STadeusz Struk 		.test = alg_test_akcipher,
3601946cc463STadeusz Struk 		.fips_allowed = 1,
3602946cc463STadeusz Struk 		.suite = {
3603946cc463STadeusz Struk 			.akcipher = {
3604946cc463STadeusz Struk 				.vecs = rsa_tv_template,
3605946cc463STadeusz Struk 				.count = RSA_TEST_VECTORS
3606946cc463STadeusz Struk 			}
3607946cc463STadeusz Struk 		}
3608946cc463STadeusz Struk 	}, {
3609da7f033dSHerbert Xu 		.alg = "salsa20",
36101aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3611da7f033dSHerbert Xu 		.suite = {
3612da7f033dSHerbert Xu 			.cipher = {
3613da7f033dSHerbert Xu 				.enc = {
3614da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
3615da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
3616da7f033dSHerbert Xu 				}
3617da7f033dSHerbert Xu 			}
3618da7f033dSHerbert Xu 		}
3619da7f033dSHerbert Xu 	}, {
3620da7f033dSHerbert Xu 		.alg = "sha1",
3621da7f033dSHerbert Xu 		.test = alg_test_hash,
3622a1915d51SJarod Wilson 		.fips_allowed = 1,
3623da7f033dSHerbert Xu 		.suite = {
3624da7f033dSHerbert Xu 			.hash = {
3625da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
3626da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
3627da7f033dSHerbert Xu 			}
3628da7f033dSHerbert Xu 		}
3629da7f033dSHerbert Xu 	}, {
3630da7f033dSHerbert Xu 		.alg = "sha224",
3631da7f033dSHerbert Xu 		.test = alg_test_hash,
3632a1915d51SJarod Wilson 		.fips_allowed = 1,
3633da7f033dSHerbert Xu 		.suite = {
3634da7f033dSHerbert Xu 			.hash = {
3635da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
3636da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
3637da7f033dSHerbert Xu 			}
3638da7f033dSHerbert Xu 		}
3639da7f033dSHerbert Xu 	}, {
3640da7f033dSHerbert Xu 		.alg = "sha256",
3641da7f033dSHerbert Xu 		.test = alg_test_hash,
3642a1915d51SJarod Wilson 		.fips_allowed = 1,
3643da7f033dSHerbert Xu 		.suite = {
3644da7f033dSHerbert Xu 			.hash = {
3645da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
3646da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
3647da7f033dSHerbert Xu 			}
3648da7f033dSHerbert Xu 		}
3649da7f033dSHerbert Xu 	}, {
3650da7f033dSHerbert Xu 		.alg = "sha384",
3651da7f033dSHerbert Xu 		.test = alg_test_hash,
3652a1915d51SJarod Wilson 		.fips_allowed = 1,
3653da7f033dSHerbert Xu 		.suite = {
3654da7f033dSHerbert Xu 			.hash = {
3655da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
3656da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
3657da7f033dSHerbert Xu 			}
3658da7f033dSHerbert Xu 		}
3659da7f033dSHerbert Xu 	}, {
3660da7f033dSHerbert Xu 		.alg = "sha512",
3661da7f033dSHerbert Xu 		.test = alg_test_hash,
3662a1915d51SJarod Wilson 		.fips_allowed = 1,
3663da7f033dSHerbert Xu 		.suite = {
3664da7f033dSHerbert Xu 			.hash = {
3665da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
3666da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
3667da7f033dSHerbert Xu 			}
3668da7f033dSHerbert Xu 		}
3669da7f033dSHerbert Xu 	}, {
3670da7f033dSHerbert Xu 		.alg = "tgr128",
3671da7f033dSHerbert Xu 		.test = alg_test_hash,
3672da7f033dSHerbert Xu 		.suite = {
3673da7f033dSHerbert Xu 			.hash = {
3674da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
3675da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
3676da7f033dSHerbert Xu 			}
3677da7f033dSHerbert Xu 		}
3678da7f033dSHerbert Xu 	}, {
3679da7f033dSHerbert Xu 		.alg = "tgr160",
3680da7f033dSHerbert Xu 		.test = alg_test_hash,
3681da7f033dSHerbert Xu 		.suite = {
3682da7f033dSHerbert Xu 			.hash = {
3683da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
3684da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
3685da7f033dSHerbert Xu 			}
3686da7f033dSHerbert Xu 		}
3687da7f033dSHerbert Xu 	}, {
3688da7f033dSHerbert Xu 		.alg = "tgr192",
3689da7f033dSHerbert Xu 		.test = alg_test_hash,
3690da7f033dSHerbert Xu 		.suite = {
3691da7f033dSHerbert Xu 			.hash = {
3692da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
3693da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
3694da7f033dSHerbert Xu 			}
3695da7f033dSHerbert Xu 		}
3696da7f033dSHerbert Xu 	}, {
3697f1939f7cSShane Wang 		.alg = "vmac(aes)",
3698f1939f7cSShane Wang 		.test = alg_test_hash,
3699f1939f7cSShane Wang 		.suite = {
3700f1939f7cSShane Wang 			.hash = {
3701f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
3702f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
3703f1939f7cSShane Wang 			}
3704f1939f7cSShane Wang 		}
3705f1939f7cSShane Wang 	}, {
3706da7f033dSHerbert Xu 		.alg = "wp256",
3707da7f033dSHerbert Xu 		.test = alg_test_hash,
3708da7f033dSHerbert Xu 		.suite = {
3709da7f033dSHerbert Xu 			.hash = {
3710da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
3711da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
3712da7f033dSHerbert Xu 			}
3713da7f033dSHerbert Xu 		}
3714da7f033dSHerbert Xu 	}, {
3715da7f033dSHerbert Xu 		.alg = "wp384",
3716da7f033dSHerbert Xu 		.test = alg_test_hash,
3717da7f033dSHerbert Xu 		.suite = {
3718da7f033dSHerbert Xu 			.hash = {
3719da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
3720da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
3721da7f033dSHerbert Xu 			}
3722da7f033dSHerbert Xu 		}
3723da7f033dSHerbert Xu 	}, {
3724da7f033dSHerbert Xu 		.alg = "wp512",
3725da7f033dSHerbert Xu 		.test = alg_test_hash,
3726da7f033dSHerbert Xu 		.suite = {
3727da7f033dSHerbert Xu 			.hash = {
3728da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
3729da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
3730da7f033dSHerbert Xu 			}
3731da7f033dSHerbert Xu 		}
3732da7f033dSHerbert Xu 	}, {
3733da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3734da7f033dSHerbert Xu 		.test = alg_test_hash,
3735da7f033dSHerbert Xu 		.suite = {
3736da7f033dSHerbert Xu 			.hash = {
3737da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
3738da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
3739da7f033dSHerbert Xu 			}
3740da7f033dSHerbert Xu 		}
3741da7f033dSHerbert Xu 	}, {
3742da7f033dSHerbert Xu 		.alg = "xts(aes)",
37431aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
37442918aa8dSJarod Wilson 		.fips_allowed = 1,
3745da7f033dSHerbert Xu 		.suite = {
3746da7f033dSHerbert Xu 			.cipher = {
3747da7f033dSHerbert Xu 				.enc = {
3748da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
3749da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
3750da7f033dSHerbert Xu 				},
3751da7f033dSHerbert Xu 				.dec = {
3752da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
3753da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
3754da7f033dSHerbert Xu 				}
3755da7f033dSHerbert Xu 			}
3756da7f033dSHerbert Xu 		}
37570c01aed5SGeert Uytterhoeven 	}, {
37580840605eSJussi Kivilinna 		.alg = "xts(camellia)",
37590840605eSJussi Kivilinna 		.test = alg_test_skcipher,
37600840605eSJussi Kivilinna 		.suite = {
37610840605eSJussi Kivilinna 			.cipher = {
37620840605eSJussi Kivilinna 				.enc = {
37630840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
37640840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
37650840605eSJussi Kivilinna 				},
37660840605eSJussi Kivilinna 				.dec = {
37670840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
37680840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
37690840605eSJussi Kivilinna 				}
37700840605eSJussi Kivilinna 			}
37710840605eSJussi Kivilinna 		}
37720840605eSJussi Kivilinna 	}, {
37739b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
37749b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
37759b8b0405SJohannes Goetzfried 		.suite = {
37769b8b0405SJohannes Goetzfried 			.cipher = {
37779b8b0405SJohannes Goetzfried 				.enc = {
37789b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
37799b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
37809b8b0405SJohannes Goetzfried 				},
37819b8b0405SJohannes Goetzfried 				.dec = {
37829b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
37839b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
37849b8b0405SJohannes Goetzfried 				}
37859b8b0405SJohannes Goetzfried 			}
37869b8b0405SJohannes Goetzfried 		}
37879b8b0405SJohannes Goetzfried 	}, {
378818be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
378918be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
379018be20b9SJussi Kivilinna 		.suite = {
379118be20b9SJussi Kivilinna 			.cipher = {
379218be20b9SJussi Kivilinna 				.enc = {
379318be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
379418be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
379518be20b9SJussi Kivilinna 				},
379618be20b9SJussi Kivilinna 				.dec = {
379718be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
379818be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
379918be20b9SJussi Kivilinna 				}
380018be20b9SJussi Kivilinna 			}
380118be20b9SJussi Kivilinna 		}
380218be20b9SJussi Kivilinna 	}, {
3803aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3804aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3805aed265b9SJussi Kivilinna 		.suite = {
3806aed265b9SJussi Kivilinna 			.cipher = {
3807aed265b9SJussi Kivilinna 				.enc = {
3808aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
3809aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
3810aed265b9SJussi Kivilinna 				},
3811aed265b9SJussi Kivilinna 				.dec = {
3812aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
3813aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
3814aed265b9SJussi Kivilinna 				}
3815aed265b9SJussi Kivilinna 			}
3816aed265b9SJussi Kivilinna 		}
3817aed265b9SJussi Kivilinna 	}, {
38180c01aed5SGeert Uytterhoeven 		.alg = "zlib",
38190c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
38200818904dSMilan Broz 		.fips_allowed = 1,
38210c01aed5SGeert Uytterhoeven 		.suite = {
38220c01aed5SGeert Uytterhoeven 			.pcomp = {
38230c01aed5SGeert Uytterhoeven 				.comp = {
38240c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
38250c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
38260c01aed5SGeert Uytterhoeven 				},
38270c01aed5SGeert Uytterhoeven 				.decomp = {
38280c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
38290c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
38300c01aed5SGeert Uytterhoeven 				}
38310c01aed5SGeert Uytterhoeven 			}
38320c01aed5SGeert Uytterhoeven 		}
3833da7f033dSHerbert Xu 	}
3834da7f033dSHerbert Xu };
3835da7f033dSHerbert Xu 
38365714758bSJussi Kivilinna static bool alg_test_descs_checked;
38375714758bSJussi Kivilinna 
38385714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
38395714758bSJussi Kivilinna {
38405714758bSJussi Kivilinna 	int i;
38415714758bSJussi Kivilinna 
38425714758bSJussi Kivilinna 	/* only check once */
38435714758bSJussi Kivilinna 	if (alg_test_descs_checked)
38445714758bSJussi Kivilinna 		return;
38455714758bSJussi Kivilinna 
38465714758bSJussi Kivilinna 	alg_test_descs_checked = true;
38475714758bSJussi Kivilinna 
38485714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
38495714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
38505714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
38515714758bSJussi Kivilinna 
38525714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
38535714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
38545714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
38555714758bSJussi Kivilinna 				alg_test_descs[i].alg);
38565714758bSJussi Kivilinna 		}
38575714758bSJussi Kivilinna 
38585714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
38595714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
38605714758bSJussi Kivilinna 				alg_test_descs[i].alg);
38615714758bSJussi Kivilinna 		}
38625714758bSJussi Kivilinna 	}
38635714758bSJussi Kivilinna }
38645714758bSJussi Kivilinna 
38651aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3866da7f033dSHerbert Xu {
3867da7f033dSHerbert Xu 	int start = 0;
3868da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3869da7f033dSHerbert Xu 
3870da7f033dSHerbert Xu 	while (start < end) {
3871da7f033dSHerbert Xu 		int i = (start + end) / 2;
3872da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3873da7f033dSHerbert Xu 
3874da7f033dSHerbert Xu 		if (diff > 0) {
3875da7f033dSHerbert Xu 			end = i;
3876da7f033dSHerbert Xu 			continue;
3877da7f033dSHerbert Xu 		}
3878da7f033dSHerbert Xu 
3879da7f033dSHerbert Xu 		if (diff < 0) {
3880da7f033dSHerbert Xu 			start = i + 1;
3881da7f033dSHerbert Xu 			continue;
3882da7f033dSHerbert Xu 		}
3883da7f033dSHerbert Xu 
38841aa4ecd9SHerbert Xu 		return i;
3885da7f033dSHerbert Xu 	}
3886da7f033dSHerbert Xu 
38871aa4ecd9SHerbert Xu 	return -1;
38881aa4ecd9SHerbert Xu }
38891aa4ecd9SHerbert Xu 
38901aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
38911aa4ecd9SHerbert Xu {
38921aa4ecd9SHerbert Xu 	int i;
3893a68f6610SHerbert Xu 	int j;
3894d12d6b6dSNeil Horman 	int rc;
38951aa4ecd9SHerbert Xu 
38965714758bSJussi Kivilinna 	alg_test_descs_check_order();
38975714758bSJussi Kivilinna 
38981aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
38991aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
39001aa4ecd9SHerbert Xu 
39011aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
39021aa4ecd9SHerbert Xu 		    sizeof(nalg))
39031aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
39041aa4ecd9SHerbert Xu 
39051aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
39061aa4ecd9SHerbert Xu 		if (i < 0)
39071aa4ecd9SHerbert Xu 			goto notest;
39081aa4ecd9SHerbert Xu 
3909a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3910a3bef3a3SJarod Wilson 			goto non_fips_alg;
3911a3bef3a3SJarod Wilson 
3912941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3913941fb328SJarod Wilson 		goto test_done;
39141aa4ecd9SHerbert Xu 	}
39151aa4ecd9SHerbert Xu 
39161aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3917a68f6610SHerbert Xu 	j = alg_find_test(driver);
3918a68f6610SHerbert Xu 	if (i < 0 && j < 0)
39191aa4ecd9SHerbert Xu 		goto notest;
39201aa4ecd9SHerbert Xu 
3921a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3922a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3923a3bef3a3SJarod Wilson 		goto non_fips_alg;
3924a3bef3a3SJarod Wilson 
3925a68f6610SHerbert Xu 	rc = 0;
3926a68f6610SHerbert Xu 	if (i >= 0)
3927a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
39281aa4ecd9SHerbert Xu 					     type, mask);
3929032c8cacSCristian Stoica 	if (j >= 0 && j != i)
3930a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3931a68f6610SHerbert Xu 					     type, mask);
3932a68f6610SHerbert Xu 
3933941fb328SJarod Wilson test_done:
3934d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3935d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3936d12d6b6dSNeil Horman 
393729ecd4abSJarod Wilson 	if (fips_enabled && !rc)
39383e8cffd4SMasanari Iida 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
393929ecd4abSJarod Wilson 
3940d12d6b6dSNeil Horman 	return rc;
39411aa4ecd9SHerbert Xu 
39421aa4ecd9SHerbert Xu notest:
3943da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3944da7f033dSHerbert Xu 	return 0;
3945a3bef3a3SJarod Wilson non_fips_alg:
3946a3bef3a3SJarod Wilson 	return -EINVAL;
3947da7f033dSHerbert Xu }
39480b767f96SAlexander Shishkin 
3949326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
39500b767f96SAlexander Shishkin 
3951da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3952