xref: /linux/crypto/testmgr.c (revision 1c41b88249f623a3c92e53aa7cc221b2245bd044)
1da7f033dSHerbert Xu /*
2da7f033dSHerbert Xu  * Algorithm testing framework and tests.
3da7f033dSHerbert Xu  *
4da7f033dSHerbert Xu  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5da7f033dSHerbert Xu  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6da7f033dSHerbert Xu  * Copyright (c) 2007 Nokia Siemens Networks
7da7f033dSHerbert Xu  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8da7f033dSHerbert Xu  *
969435b94SAdrian Hoban  * Updated RFC4106 AES-GCM testing.
1069435b94SAdrian Hoban  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
1169435b94SAdrian Hoban  *             Adrian Hoban <adrian.hoban@intel.com>
1269435b94SAdrian Hoban  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
1369435b94SAdrian Hoban  *             Tadeusz Struk (tadeusz.struk@intel.com)
1469435b94SAdrian Hoban  *    Copyright (c) 2010, Intel Corporation.
1569435b94SAdrian Hoban  *
16da7f033dSHerbert Xu  * This program is free software; you can redistribute it and/or modify it
17da7f033dSHerbert Xu  * under the terms of the GNU General Public License as published by the Free
18da7f033dSHerbert Xu  * Software Foundation; either version 2 of the License, or (at your option)
19da7f033dSHerbert Xu  * any later version.
20da7f033dSHerbert Xu  *
21da7f033dSHerbert Xu  */
22da7f033dSHerbert Xu 
23da7f033dSHerbert Xu #include <crypto/hash.h>
24da7f033dSHerbert Xu #include <linux/err.h>
251c41b882SHerbert Xu #include <linux/fips.h>
26da7f033dSHerbert Xu #include <linux/module.h>
27da7f033dSHerbert Xu #include <linux/scatterlist.h>
28da7f033dSHerbert Xu #include <linux/slab.h>
29da7f033dSHerbert Xu #include <linux/string.h>
307647d6ceSJarod Wilson #include <crypto/rng.h>
3164d1cdfbSStephan Mueller #include <crypto/drbg.h>
32da7f033dSHerbert Xu 
33da7f033dSHerbert Xu #include "internal.h"
340b767f96SAlexander Shishkin 
35326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
360b767f96SAlexander Shishkin 
370b767f96SAlexander Shishkin /* a perfect nop */
380b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
390b767f96SAlexander Shishkin {
400b767f96SAlexander Shishkin 	return 0;
410b767f96SAlexander Shishkin }
420b767f96SAlexander Shishkin 
430b767f96SAlexander Shishkin #else
440b767f96SAlexander Shishkin 
45da7f033dSHerbert Xu #include "testmgr.h"
46da7f033dSHerbert Xu 
47da7f033dSHerbert Xu /*
48da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
49da7f033dSHerbert Xu  */
50da7f033dSHerbert Xu #define XBUFSIZE	8
51da7f033dSHerbert Xu 
52da7f033dSHerbert Xu /*
53da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
54da7f033dSHerbert Xu  */
55da7f033dSHerbert Xu #define IDX1		32
56da7f033dSHerbert Xu #define IDX2		32400
57da7f033dSHerbert Xu #define IDX3		1
58da7f033dSHerbert Xu #define IDX4		8193
59da7f033dSHerbert Xu #define IDX5		22222
60da7f033dSHerbert Xu #define IDX6		17101
61da7f033dSHerbert Xu #define IDX7		27333
62da7f033dSHerbert Xu #define IDX8		3000
63da7f033dSHerbert Xu 
64da7f033dSHerbert Xu /*
65da7f033dSHerbert Xu * Used by test_cipher()
66da7f033dSHerbert Xu */
67da7f033dSHerbert Xu #define ENCRYPT 1
68da7f033dSHerbert Xu #define DECRYPT 0
69da7f033dSHerbert Xu 
70da7f033dSHerbert Xu struct tcrypt_result {
71da7f033dSHerbert Xu 	struct completion completion;
72da7f033dSHerbert Xu 	int err;
73da7f033dSHerbert Xu };
74da7f033dSHerbert Xu 
75da7f033dSHerbert Xu struct aead_test_suite {
76da7f033dSHerbert Xu 	struct {
77da7f033dSHerbert Xu 		struct aead_testvec *vecs;
78da7f033dSHerbert Xu 		unsigned int count;
79da7f033dSHerbert Xu 	} enc, dec;
80da7f033dSHerbert Xu };
81da7f033dSHerbert Xu 
82da7f033dSHerbert Xu struct cipher_test_suite {
83da7f033dSHerbert Xu 	struct {
84da7f033dSHerbert Xu 		struct cipher_testvec *vecs;
85da7f033dSHerbert Xu 		unsigned int count;
86da7f033dSHerbert Xu 	} enc, dec;
87da7f033dSHerbert Xu };
88da7f033dSHerbert Xu 
89da7f033dSHerbert Xu struct comp_test_suite {
90da7f033dSHerbert Xu 	struct {
91da7f033dSHerbert Xu 		struct comp_testvec *vecs;
92da7f033dSHerbert Xu 		unsigned int count;
93da7f033dSHerbert Xu 	} comp, decomp;
94da7f033dSHerbert Xu };
95da7f033dSHerbert Xu 
968064efb8SGeert Uytterhoeven struct pcomp_test_suite {
978064efb8SGeert Uytterhoeven 	struct {
988064efb8SGeert Uytterhoeven 		struct pcomp_testvec *vecs;
998064efb8SGeert Uytterhoeven 		unsigned int count;
1008064efb8SGeert Uytterhoeven 	} comp, decomp;
1018064efb8SGeert Uytterhoeven };
1028064efb8SGeert Uytterhoeven 
103da7f033dSHerbert Xu struct hash_test_suite {
104da7f033dSHerbert Xu 	struct hash_testvec *vecs;
105da7f033dSHerbert Xu 	unsigned int count;
106da7f033dSHerbert Xu };
107da7f033dSHerbert Xu 
1087647d6ceSJarod Wilson struct cprng_test_suite {
1097647d6ceSJarod Wilson 	struct cprng_testvec *vecs;
1107647d6ceSJarod Wilson 	unsigned int count;
1117647d6ceSJarod Wilson };
1127647d6ceSJarod Wilson 
11364d1cdfbSStephan Mueller struct drbg_test_suite {
11464d1cdfbSStephan Mueller 	struct drbg_testvec *vecs;
11564d1cdfbSStephan Mueller 	unsigned int count;
11664d1cdfbSStephan Mueller };
11764d1cdfbSStephan Mueller 
118da7f033dSHerbert Xu struct alg_test_desc {
119da7f033dSHerbert Xu 	const char *alg;
120da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
121da7f033dSHerbert Xu 		    u32 type, u32 mask);
122a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
123da7f033dSHerbert Xu 
124da7f033dSHerbert Xu 	union {
125da7f033dSHerbert Xu 		struct aead_test_suite aead;
126da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
127da7f033dSHerbert Xu 		struct comp_test_suite comp;
1288064efb8SGeert Uytterhoeven 		struct pcomp_test_suite pcomp;
129da7f033dSHerbert Xu 		struct hash_test_suite hash;
1307647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
13164d1cdfbSStephan Mueller 		struct drbg_test_suite drbg;
132da7f033dSHerbert Xu 	} suite;
133da7f033dSHerbert Xu };
134da7f033dSHerbert Xu 
135da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
136da7f033dSHerbert Xu 
137da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
138da7f033dSHerbert Xu {
139da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
140da7f033dSHerbert Xu 			16, 1,
141da7f033dSHerbert Xu 			buf, len, false);
142da7f033dSHerbert Xu }
143da7f033dSHerbert Xu 
144da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
145da7f033dSHerbert Xu {
146da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
147da7f033dSHerbert Xu 
148da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
149da7f033dSHerbert Xu 		return;
150da7f033dSHerbert Xu 
151da7f033dSHerbert Xu 	res->err = err;
152da7f033dSHerbert Xu 	complete(&res->completion);
153da7f033dSHerbert Xu }
154da7f033dSHerbert Xu 
155f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
156f8b0d4d0SHerbert Xu {
157f8b0d4d0SHerbert Xu 	int i;
158f8b0d4d0SHerbert Xu 
159f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
160f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
161f8b0d4d0SHerbert Xu 		if (!buf[i])
162f8b0d4d0SHerbert Xu 			goto err_free_buf;
163f8b0d4d0SHerbert Xu 	}
164f8b0d4d0SHerbert Xu 
165f8b0d4d0SHerbert Xu 	return 0;
166f8b0d4d0SHerbert Xu 
167f8b0d4d0SHerbert Xu err_free_buf:
168f8b0d4d0SHerbert Xu 	while (i-- > 0)
169f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
170f8b0d4d0SHerbert Xu 
171f8b0d4d0SHerbert Xu 	return -ENOMEM;
172f8b0d4d0SHerbert Xu }
173f8b0d4d0SHerbert Xu 
174f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
175f8b0d4d0SHerbert Xu {
176f8b0d4d0SHerbert Xu 	int i;
177f8b0d4d0SHerbert Xu 
178f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
179f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
180f8b0d4d0SHerbert Xu }
181f8b0d4d0SHerbert Xu 
182d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret)
183a8f1a052SDavid S. Miller {
184a8f1a052SDavid S. Miller 	if (ret == -EINPROGRESS || ret == -EBUSY) {
1858a45ac12SRabin Vincent 		wait_for_completion(&tr->completion);
18616735d02SWolfram Sang 		reinit_completion(&tr->completion);
1878a45ac12SRabin Vincent 		ret = tr->err;
188a8f1a052SDavid S. Miller 	}
189a8f1a052SDavid S. Miller 	return ret;
190a8f1a052SDavid S. Miller }
191a8f1a052SDavid S. Miller 
192da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
193da5ffe11SJussi Kivilinna 		       unsigned int tcount, bool use_digest,
194da5ffe11SJussi Kivilinna 		       const int align_offset)
195da7f033dSHerbert Xu {
196da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
197da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
198da7f033dSHerbert Xu 	struct scatterlist sg[8];
19929b77e5dSHoria Geanta 	char *result;
20029b77e5dSHoria Geanta 	char *key;
201da7f033dSHerbert Xu 	struct ahash_request *req;
202da7f033dSHerbert Xu 	struct tcrypt_result tresult;
203da7f033dSHerbert Xu 	void *hash_buff;
204f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
205f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
206f8b0d4d0SHerbert Xu 
20729b77e5dSHoria Geanta 	result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
20829b77e5dSHoria Geanta 	if (!result)
20929b77e5dSHoria Geanta 		return ret;
21029b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
21129b77e5dSHoria Geanta 	if (!key)
21229b77e5dSHoria Geanta 		goto out_nobuf;
213f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
214f8b0d4d0SHerbert Xu 		goto out_nobuf;
215da7f033dSHerbert Xu 
216da7f033dSHerbert Xu 	init_completion(&tresult.completion);
217da7f033dSHerbert Xu 
218da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
219da7f033dSHerbert Xu 	if (!req) {
220da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
221da7f033dSHerbert Xu 		       "%s\n", algo);
222da7f033dSHerbert Xu 		goto out_noreq;
223da7f033dSHerbert Xu 	}
224da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
225da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
226da7f033dSHerbert Xu 
227a0cfae59SHerbert Xu 	j = 0;
228da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
229a0cfae59SHerbert Xu 		if (template[i].np)
230a0cfae59SHerbert Xu 			continue;
231a0cfae59SHerbert Xu 
232da5ffe11SJussi Kivilinna 		ret = -EINVAL;
233da5ffe11SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
234da5ffe11SJussi Kivilinna 			goto out;
235da5ffe11SJussi Kivilinna 
236a0cfae59SHerbert Xu 		j++;
23729b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
238da7f033dSHerbert Xu 
239da7f033dSHerbert Xu 		hash_buff = xbuf[0];
240da5ffe11SJussi Kivilinna 		hash_buff += align_offset;
241da7f033dSHerbert Xu 
242da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
243da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
244da7f033dSHerbert Xu 
245da7f033dSHerbert Xu 		if (template[i].ksize) {
246da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
24729b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
24829b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
24929b77e5dSHoria Geanta 				       j, algo, template[i].ksize, MAX_KEYLEN);
25029b77e5dSHoria Geanta 				ret = -EINVAL;
25129b77e5dSHoria Geanta 				goto out;
25229b77e5dSHoria Geanta 			}
25329b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
25429b77e5dSHoria Geanta 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
255da7f033dSHerbert Xu 			if (ret) {
256da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
257a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
258da7f033dSHerbert Xu 				       -ret);
259da7f033dSHerbert Xu 				goto out;
260da7f033dSHerbert Xu 			}
261da7f033dSHerbert Xu 		}
262da7f033dSHerbert Xu 
263da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
264a8f1a052SDavid S. Miller 		if (use_digest) {
265d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_digest(req));
266a8f1a052SDavid S. Miller 			if (ret) {
267a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
268a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
269da7f033dSHerbert Xu 				goto out;
270da7f033dSHerbert Xu 			}
271a8f1a052SDavid S. Miller 		} else {
272d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_init(req));
273a8f1a052SDavid S. Miller 			if (ret) {
274a8f1a052SDavid S. Miller 				pr_err("alt: hash: init failed on test %d "
275a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
276a8f1a052SDavid S. Miller 				goto out;
277a8f1a052SDavid S. Miller 			}
278d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_update(req));
279a8f1a052SDavid S. Miller 			if (ret) {
280a8f1a052SDavid S. Miller 				pr_err("alt: hash: update failed on test %d "
281a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
282a8f1a052SDavid S. Miller 				goto out;
283a8f1a052SDavid S. Miller 			}
284d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_final(req));
285a8f1a052SDavid S. Miller 			if (ret) {
286a8f1a052SDavid S. Miller 				pr_err("alt: hash: final failed on test %d "
287a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
288a8f1a052SDavid S. Miller 				goto out;
289a8f1a052SDavid S. Miller 			}
290a8f1a052SDavid S. Miller 		}
291da7f033dSHerbert Xu 
292da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
293da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
294da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
295a0cfae59SHerbert Xu 			       j, algo);
296da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
297da7f033dSHerbert Xu 			ret = -EINVAL;
298da7f033dSHerbert Xu 			goto out;
299da7f033dSHerbert Xu 		}
300da7f033dSHerbert Xu 	}
301da7f033dSHerbert Xu 
302da7f033dSHerbert Xu 	j = 0;
303da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
304da5ffe11SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
305da5ffe11SJussi Kivilinna 		if (align_offset != 0)
306da5ffe11SJussi Kivilinna 			break;
307da5ffe11SJussi Kivilinna 
3085f2b424eSCristian Stoica 		if (!template[i].np)
3095f2b424eSCristian Stoica 			continue;
3105f2b424eSCristian Stoica 
311da7f033dSHerbert Xu 		j++;
31229b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
313da7f033dSHerbert Xu 
314da7f033dSHerbert Xu 		temp = 0;
315da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
316fd57f22aSHerbert Xu 		ret = -EINVAL;
317da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
318fd57f22aSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
319fd57f22aSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
320fd57f22aSHerbert Xu 				goto out;
321da7f033dSHerbert Xu 			sg_set_buf(&sg[k],
322da7f033dSHerbert Xu 				   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
323da7f033dSHerbert Xu 					  offset_in_page(IDX[k]),
324da7f033dSHerbert Xu 					  template[i].plaintext + temp,
325da7f033dSHerbert Xu 					  template[i].tap[k]),
326da7f033dSHerbert Xu 				   template[i].tap[k]);
327da7f033dSHerbert Xu 			temp += template[i].tap[k];
328da7f033dSHerbert Xu 		}
329da7f033dSHerbert Xu 
330da7f033dSHerbert Xu 		if (template[i].ksize) {
33129b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
33229b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
3335f2b424eSCristian Stoica 				       j, algo, template[i].ksize, MAX_KEYLEN);
33429b77e5dSHoria Geanta 				ret = -EINVAL;
33529b77e5dSHoria Geanta 				goto out;
33629b77e5dSHoria Geanta 			}
337da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
33829b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
3395f2b424eSCristian Stoica 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
340da7f033dSHerbert Xu 
341da7f033dSHerbert Xu 			if (ret) {
342da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey "
343da7f033dSHerbert Xu 				       "failed on chunking test %d "
3445f2b424eSCristian Stoica 				       "for %s: ret=%d\n", j, algo, -ret);
345da7f033dSHerbert Xu 				goto out;
346da7f033dSHerbert Xu 			}
347da7f033dSHerbert Xu 		}
348da7f033dSHerbert Xu 
3495f2b424eSCristian Stoica 		ahash_request_set_crypt(req, sg, result, template[i].psize);
350da7f033dSHerbert Xu 		ret = crypto_ahash_digest(req);
351da7f033dSHerbert Xu 		switch (ret) {
352da7f033dSHerbert Xu 		case 0:
353da7f033dSHerbert Xu 			break;
354da7f033dSHerbert Xu 		case -EINPROGRESS:
355da7f033dSHerbert Xu 		case -EBUSY:
3568a45ac12SRabin Vincent 			wait_for_completion(&tresult.completion);
35716735d02SWolfram Sang 			reinit_completion(&tresult.completion);
3588a45ac12SRabin Vincent 			ret = tresult.err;
3598a45ac12SRabin Vincent 			if (!ret)
360da7f033dSHerbert Xu 				break;
361da7f033dSHerbert Xu 			/* fall through */
362da7f033dSHerbert Xu 		default:
363da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: digest failed "
364da7f033dSHerbert Xu 			       "on chunking test %d for %s: "
365da7f033dSHerbert Xu 			       "ret=%d\n", j, algo, -ret);
366da7f033dSHerbert Xu 			goto out;
367da7f033dSHerbert Xu 		}
368da7f033dSHerbert Xu 
369da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
370da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
371da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Chunking test %d "
372da7f033dSHerbert Xu 			       "failed for %s\n", j, algo);
373da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
374da7f033dSHerbert Xu 			ret = -EINVAL;
375da7f033dSHerbert Xu 			goto out;
376da7f033dSHerbert Xu 		}
377da7f033dSHerbert Xu 	}
378da7f033dSHerbert Xu 
379da7f033dSHerbert Xu 	ret = 0;
380da7f033dSHerbert Xu 
381da7f033dSHerbert Xu out:
382da7f033dSHerbert Xu 	ahash_request_free(req);
383da7f033dSHerbert Xu out_noreq:
384f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
385f8b0d4d0SHerbert Xu out_nobuf:
38629b77e5dSHoria Geanta 	kfree(key);
38729b77e5dSHoria Geanta 	kfree(result);
388da7f033dSHerbert Xu 	return ret;
389da7f033dSHerbert Xu }
390da7f033dSHerbert Xu 
391da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
392da5ffe11SJussi Kivilinna 		     unsigned int tcount, bool use_digest)
393da5ffe11SJussi Kivilinna {
394da5ffe11SJussi Kivilinna 	unsigned int alignmask;
395da5ffe11SJussi Kivilinna 	int ret;
396da5ffe11SJussi Kivilinna 
397da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
398da5ffe11SJussi Kivilinna 	if (ret)
399da5ffe11SJussi Kivilinna 		return ret;
400da5ffe11SJussi Kivilinna 
401da5ffe11SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
402da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
403da5ffe11SJussi Kivilinna 	if (ret)
404da5ffe11SJussi Kivilinna 		return ret;
405da5ffe11SJussi Kivilinna 
406da5ffe11SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
407da5ffe11SJussi Kivilinna 	if (alignmask) {
408da5ffe11SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
409da5ffe11SJussi Kivilinna 		ret = __test_hash(tfm, template, tcount, use_digest,
410da5ffe11SJussi Kivilinna 				  alignmask + 1);
411da5ffe11SJussi Kivilinna 		if (ret)
412da5ffe11SJussi Kivilinna 			return ret;
413da5ffe11SJussi Kivilinna 	}
414da5ffe11SJussi Kivilinna 
415da5ffe11SJussi Kivilinna 	return 0;
416da5ffe11SJussi Kivilinna }
417da5ffe11SJussi Kivilinna 
418d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
419d8a32ac2SJussi Kivilinna 		       struct aead_testvec *template, unsigned int tcount,
42058dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
421da7f033dSHerbert Xu {
422da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
423da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
424f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
425da7f033dSHerbert Xu 	char *q;
426da7f033dSHerbert Xu 	char *key;
427da7f033dSHerbert Xu 	struct aead_request *req;
428d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
429d8a32ac2SJussi Kivilinna 	struct scatterlist *asg;
430d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
431d8a32ac2SJussi Kivilinna 	const char *e, *d;
432da7f033dSHerbert Xu 	struct tcrypt_result result;
433424a5da6SCristian Stoica 	unsigned int authsize, iv_len;
434da7f033dSHerbert Xu 	void *input;
435d8a32ac2SJussi Kivilinna 	void *output;
436da7f033dSHerbert Xu 	void *assoc;
4379bac019dSTadeusz Struk 	char *iv;
438f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
439d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
440f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
441f8b0d4d0SHerbert Xu 
4429bac019dSTadeusz Struk 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
4439bac019dSTadeusz Struk 	if (!iv)
4449bac019dSTadeusz Struk 		return ret;
44529b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
44629b77e5dSHoria Geanta 	if (!key)
44729b77e5dSHoria Geanta 		goto out_noxbuf;
448f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
449f8b0d4d0SHerbert Xu 		goto out_noxbuf;
450f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
451f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
452d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
453d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
454d8a32ac2SJussi Kivilinna 
455d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
456d8a32ac2SJussi Kivilinna 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 3 : 2), GFP_KERNEL);
457d8a32ac2SJussi Kivilinna 	if (!sg)
458d8a32ac2SJussi Kivilinna 		goto out_nosg;
459d8a32ac2SJussi Kivilinna 	asg = &sg[8];
460d8a32ac2SJussi Kivilinna 	sgout = &asg[8];
461d8a32ac2SJussi Kivilinna 
462d8a32ac2SJussi Kivilinna 	if (diff_dst)
463d8a32ac2SJussi Kivilinna 		d = "-ddst";
464d8a32ac2SJussi Kivilinna 	else
465d8a32ac2SJussi Kivilinna 		d = "";
466d8a32ac2SJussi Kivilinna 
467da7f033dSHerbert Xu 	if (enc == ENCRYPT)
468da7f033dSHerbert Xu 		e = "encryption";
469da7f033dSHerbert Xu 	else
470da7f033dSHerbert Xu 		e = "decryption";
471da7f033dSHerbert Xu 
472da7f033dSHerbert Xu 	init_completion(&result.completion);
473da7f033dSHerbert Xu 
474da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
475da7f033dSHerbert Xu 	if (!req) {
476d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
477d8a32ac2SJussi Kivilinna 		       d, algo);
478da7f033dSHerbert Xu 		goto out;
479da7f033dSHerbert Xu 	}
480da7f033dSHerbert Xu 
481da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
482da7f033dSHerbert Xu 				  tcrypt_complete, &result);
483da7f033dSHerbert Xu 
484da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
48505b1d338SCristian Stoica 		if (template[i].np)
48605b1d338SCristian Stoica 			continue;
48705b1d338SCristian Stoica 
488da7f033dSHerbert Xu 		j++;
489da7f033dSHerbert Xu 
49058dcf548SJussi Kivilinna 		/* some templates have no input data but they will
491da7f033dSHerbert Xu 		 * touch input
492da7f033dSHerbert Xu 		 */
493da7f033dSHerbert Xu 		input = xbuf[0];
49458dcf548SJussi Kivilinna 		input += align_offset;
495da7f033dSHerbert Xu 		assoc = axbuf[0];
496da7f033dSHerbert Xu 
497fd57f22aSHerbert Xu 		ret = -EINVAL;
49858dcf548SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].ilen >
49958dcf548SJussi Kivilinna 			    PAGE_SIZE || template[i].alen > PAGE_SIZE))
500fd57f22aSHerbert Xu 			goto out;
501fd57f22aSHerbert Xu 
502da7f033dSHerbert Xu 		memcpy(input, template[i].input, template[i].ilen);
503da7f033dSHerbert Xu 		memcpy(assoc, template[i].assoc, template[i].alen);
504424a5da6SCristian Stoica 		iv_len = crypto_aead_ivsize(tfm);
505da7f033dSHerbert Xu 		if (template[i].iv)
506424a5da6SCristian Stoica 			memcpy(iv, template[i].iv, iv_len);
507da7f033dSHerbert Xu 		else
508424a5da6SCristian Stoica 			memset(iv, 0, iv_len);
509da7f033dSHerbert Xu 
510da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
511da7f033dSHerbert Xu 		if (template[i].wk)
51205b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
513da7f033dSHerbert Xu 
51429b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
51529b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
51629b77e5dSHoria Geanta 			       d, j, algo, template[i].klen,
51729b77e5dSHoria Geanta 			       MAX_KEYLEN);
51829b77e5dSHoria Geanta 			ret = -EINVAL;
51929b77e5dSHoria Geanta 			goto out;
52029b77e5dSHoria Geanta 		}
52129b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
522da7f033dSHerbert Xu 
52305b1d338SCristian Stoica 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
524da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
525d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
526d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
527da7f033dSHerbert Xu 			goto out;
528da7f033dSHerbert Xu 		} else if (ret)
529da7f033dSHerbert Xu 			continue;
530da7f033dSHerbert Xu 
531da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
532da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
533da7f033dSHerbert Xu 		if (ret) {
534d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
535d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
536da7f033dSHerbert Xu 			goto out;
537da7f033dSHerbert Xu 		}
538da7f033dSHerbert Xu 
539d8a32ac2SJussi Kivilinna 		if (diff_dst) {
540d8a32ac2SJussi Kivilinna 			output = xoutbuf[0];
54158dcf548SJussi Kivilinna 			output += align_offset;
5428ec25c51SHoria Geanta 			sg_init_one(&sg[0], input, template[i].ilen);
54305b1d338SCristian Stoica 			sg_init_one(&sgout[0], output, template[i].rlen);
5448ec25c51SHoria Geanta 		} else {
5458ec25c51SHoria Geanta 			sg_init_one(&sg[0], input,
54605b1d338SCristian Stoica 				    template[i].ilen + (enc ? authsize : 0));
547d8a32ac2SJussi Kivilinna 			output = input;
548d8a32ac2SJussi Kivilinna 		}
549d8a32ac2SJussi Kivilinna 
550da7f033dSHerbert Xu 		sg_init_one(&asg[0], assoc, template[i].alen);
551da7f033dSHerbert Xu 
552d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
553da7f033dSHerbert Xu 				       template[i].ilen, iv);
554da7f033dSHerbert Xu 
555da7f033dSHerbert Xu 		aead_request_set_assoc(req, asg, template[i].alen);
556da7f033dSHerbert Xu 
55705b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
558da7f033dSHerbert Xu 
559da7f033dSHerbert Xu 		switch (ret) {
560da7f033dSHerbert Xu 		case 0:
561e44a1b44SJarod Wilson 			if (template[i].novrfy) {
562e44a1b44SJarod Wilson 				/* verification was supposed to fail */
563d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
564d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
565e44a1b44SJarod Wilson 				/* so really, we got a bad message */
566e44a1b44SJarod Wilson 				ret = -EBADMSG;
567e44a1b44SJarod Wilson 				goto out;
568e44a1b44SJarod Wilson 			}
569da7f033dSHerbert Xu 			break;
570da7f033dSHerbert Xu 		case -EINPROGRESS:
571da7f033dSHerbert Xu 		case -EBUSY:
5728a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
57316735d02SWolfram Sang 			reinit_completion(&result.completion);
5748a45ac12SRabin Vincent 			ret = result.err;
5758a45ac12SRabin Vincent 			if (!ret)
576da7f033dSHerbert Xu 				break;
577e44a1b44SJarod Wilson 		case -EBADMSG:
578e44a1b44SJarod Wilson 			if (template[i].novrfy)
579e44a1b44SJarod Wilson 				/* verification failure was expected */
580e44a1b44SJarod Wilson 				continue;
581da7f033dSHerbert Xu 			/* fall through */
582da7f033dSHerbert Xu 		default:
583d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
584d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
585da7f033dSHerbert Xu 			goto out;
586da7f033dSHerbert Xu 		}
587da7f033dSHerbert Xu 
588d8a32ac2SJussi Kivilinna 		q = output;
589da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
590d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Test %d failed on %s for %s\n",
591d8a32ac2SJussi Kivilinna 			       d, j, e, algo);
592da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
593da7f033dSHerbert Xu 			ret = -EINVAL;
594da7f033dSHerbert Xu 			goto out;
595da7f033dSHerbert Xu 		}
596da7f033dSHerbert Xu 	}
597da7f033dSHerbert Xu 
598da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
59958dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
60058dcf548SJussi Kivilinna 		if (align_offset != 0)
60158dcf548SJussi Kivilinna 			break;
60258dcf548SJussi Kivilinna 
60305b1d338SCristian Stoica 		if (!template[i].np)
60405b1d338SCristian Stoica 			continue;
60505b1d338SCristian Stoica 
606da7f033dSHerbert Xu 		j++;
607da7f033dSHerbert Xu 
608da7f033dSHerbert Xu 		if (template[i].iv)
609da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
610da7f033dSHerbert Xu 		else
611da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
612da7f033dSHerbert Xu 
613da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
614da7f033dSHerbert Xu 		if (template[i].wk)
61505b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
61629b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
61729b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
61805b1d338SCristian Stoica 			       d, j, algo, template[i].klen, MAX_KEYLEN);
61929b77e5dSHoria Geanta 			ret = -EINVAL;
62029b77e5dSHoria Geanta 			goto out;
62129b77e5dSHoria Geanta 		}
62229b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
623da7f033dSHerbert Xu 
624da7f033dSHerbert Xu 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
625da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
626d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
627d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
628da7f033dSHerbert Xu 			goto out;
629da7f033dSHerbert Xu 		} else if (ret)
630da7f033dSHerbert Xu 			continue;
631da7f033dSHerbert Xu 
632da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
633da7f033dSHerbert Xu 
634da7f033dSHerbert Xu 		ret = -EINVAL;
635da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
636d8a32ac2SJussi Kivilinna 		if (diff_dst)
637d8a32ac2SJussi Kivilinna 			sg_init_table(sgout, template[i].np);
638da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
639da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
640da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
641da7f033dSHerbert Xu 				goto out;
642da7f033dSHerbert Xu 
64305b1d338SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
64405b1d338SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
645da7f033dSHerbert Xu 			sg_set_buf(&sg[k], q, template[i].tap[k]);
646d8a32ac2SJussi Kivilinna 
647d8a32ac2SJussi Kivilinna 			if (diff_dst) {
648d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
649d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
650d8a32ac2SJussi Kivilinna 
651d8a32ac2SJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
652d8a32ac2SJussi Kivilinna 
65305b1d338SCristian Stoica 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
654d8a32ac2SJussi Kivilinna 			}
655d8a32ac2SJussi Kivilinna 
6568ec25c51SHoria Geanta 			n = template[i].tap[k];
6578ec25c51SHoria Geanta 			if (k == template[i].np - 1 && enc)
6588ec25c51SHoria Geanta 				n += authsize;
6598ec25c51SHoria Geanta 			if (offset_in_page(q) + n < PAGE_SIZE)
6608ec25c51SHoria Geanta 				q[n] = 0;
6618ec25c51SHoria Geanta 
662da7f033dSHerbert Xu 			temp += template[i].tap[k];
663da7f033dSHerbert Xu 		}
664da7f033dSHerbert Xu 
665da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
666da7f033dSHerbert Xu 		if (ret) {
667d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
668d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
669da7f033dSHerbert Xu 			goto out;
670da7f033dSHerbert Xu 		}
671da7f033dSHerbert Xu 
672da7f033dSHerbert Xu 		if (enc) {
673da7f033dSHerbert Xu 			if (WARN_ON(sg[k - 1].offset +
674da7f033dSHerbert Xu 				    sg[k - 1].length + authsize >
675da7f033dSHerbert Xu 				    PAGE_SIZE)) {
676da7f033dSHerbert Xu 				ret = -EINVAL;
677da7f033dSHerbert Xu 				goto out;
678da7f033dSHerbert Xu 			}
679da7f033dSHerbert Xu 
680d8a32ac2SJussi Kivilinna 			if (diff_dst)
681d8a32ac2SJussi Kivilinna 				sgout[k - 1].length += authsize;
6828ec25c51SHoria Geanta 			else
6838ec25c51SHoria Geanta 				sg[k - 1].length += authsize;
684da7f033dSHerbert Xu 		}
685da7f033dSHerbert Xu 
686da7f033dSHerbert Xu 		sg_init_table(asg, template[i].anp);
687fd57f22aSHerbert Xu 		ret = -EINVAL;
688da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].anp; k++) {
689fd57f22aSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
690fd57f22aSHerbert Xu 				    template[i].atap[k] > PAGE_SIZE))
691fd57f22aSHerbert Xu 				goto out;
692da7f033dSHerbert Xu 			sg_set_buf(&asg[k],
693da7f033dSHerbert Xu 				   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
694da7f033dSHerbert Xu 					  offset_in_page(IDX[k]),
695da7f033dSHerbert Xu 					  template[i].assoc + temp,
696da7f033dSHerbert Xu 					  template[i].atap[k]),
697da7f033dSHerbert Xu 				   template[i].atap[k]);
698da7f033dSHerbert Xu 			temp += template[i].atap[k];
699da7f033dSHerbert Xu 		}
700da7f033dSHerbert Xu 
701d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
702da7f033dSHerbert Xu 				       template[i].ilen,
703da7f033dSHerbert Xu 				       iv);
704da7f033dSHerbert Xu 
705da7f033dSHerbert Xu 		aead_request_set_assoc(req, asg, template[i].alen);
706da7f033dSHerbert Xu 
70705b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
708da7f033dSHerbert Xu 
709da7f033dSHerbert Xu 		switch (ret) {
710da7f033dSHerbert Xu 		case 0:
711e44a1b44SJarod Wilson 			if (template[i].novrfy) {
712e44a1b44SJarod Wilson 				/* verification was supposed to fail */
713d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
714d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
715e44a1b44SJarod Wilson 				/* so really, we got a bad message */
716e44a1b44SJarod Wilson 				ret = -EBADMSG;
717e44a1b44SJarod Wilson 				goto out;
718e44a1b44SJarod Wilson 			}
719da7f033dSHerbert Xu 			break;
720da7f033dSHerbert Xu 		case -EINPROGRESS:
721da7f033dSHerbert Xu 		case -EBUSY:
7228a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
72316735d02SWolfram Sang 			reinit_completion(&result.completion);
7248a45ac12SRabin Vincent 			ret = result.err;
7258a45ac12SRabin Vincent 			if (!ret)
726da7f033dSHerbert Xu 				break;
727e44a1b44SJarod Wilson 		case -EBADMSG:
728e44a1b44SJarod Wilson 			if (template[i].novrfy)
729e44a1b44SJarod Wilson 				/* verification failure was expected */
730e44a1b44SJarod Wilson 				continue;
731da7f033dSHerbert Xu 			/* fall through */
732da7f033dSHerbert Xu 		default:
733d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
734d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
735da7f033dSHerbert Xu 			goto out;
736da7f033dSHerbert Xu 		}
737da7f033dSHerbert Xu 
738da7f033dSHerbert Xu 		ret = -EINVAL;
739da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
740d8a32ac2SJussi Kivilinna 			if (diff_dst)
741d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
742d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
743d8a32ac2SJussi Kivilinna 			else
744da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
745da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
746da7f033dSHerbert Xu 
747da7f033dSHerbert Xu 			n = template[i].tap[k];
748da7f033dSHerbert Xu 			if (k == template[i].np - 1)
749da7f033dSHerbert Xu 				n += enc ? authsize : -authsize;
750da7f033dSHerbert Xu 
751da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp, n)) {
752d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
753d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo);
754da7f033dSHerbert Xu 				hexdump(q, n);
755da7f033dSHerbert Xu 				goto out;
756da7f033dSHerbert Xu 			}
757da7f033dSHerbert Xu 
758da7f033dSHerbert Xu 			q += n;
759da7f033dSHerbert Xu 			if (k == template[i].np - 1 && !enc) {
760d8a32ac2SJussi Kivilinna 				if (!diff_dst &&
761d8a32ac2SJussi Kivilinna 					memcmp(q, template[i].input +
762da7f033dSHerbert Xu 					      temp + n, authsize))
763da7f033dSHerbert Xu 					n = authsize;
764da7f033dSHerbert Xu 				else
765da7f033dSHerbert Xu 					n = 0;
766da7f033dSHerbert Xu 			} else {
76705b1d338SCristian Stoica 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
768da7f033dSHerbert Xu 					;
769da7f033dSHerbert Xu 			}
770da7f033dSHerbert Xu 			if (n) {
771d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
772d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo, n);
773da7f033dSHerbert Xu 				hexdump(q, n);
774da7f033dSHerbert Xu 				goto out;
775da7f033dSHerbert Xu 			}
776da7f033dSHerbert Xu 
777da7f033dSHerbert Xu 			temp += template[i].tap[k];
778da7f033dSHerbert Xu 		}
779da7f033dSHerbert Xu 	}
780da7f033dSHerbert Xu 
781da7f033dSHerbert Xu 	ret = 0;
782da7f033dSHerbert Xu 
783da7f033dSHerbert Xu out:
784da7f033dSHerbert Xu 	aead_request_free(req);
785d8a32ac2SJussi Kivilinna 	kfree(sg);
786d8a32ac2SJussi Kivilinna out_nosg:
787d8a32ac2SJussi Kivilinna 	if (diff_dst)
788d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
789d8a32ac2SJussi Kivilinna out_nooutbuf:
790f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
791f8b0d4d0SHerbert Xu out_noaxbuf:
792f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
793f8b0d4d0SHerbert Xu out_noxbuf:
79429b77e5dSHoria Geanta 	kfree(key);
7959bac019dSTadeusz Struk 	kfree(iv);
796da7f033dSHerbert Xu 	return ret;
797da7f033dSHerbert Xu }
798da7f033dSHerbert Xu 
799d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
800d8a32ac2SJussi Kivilinna 		     struct aead_testvec *template, unsigned int tcount)
801d8a32ac2SJussi Kivilinna {
80258dcf548SJussi Kivilinna 	unsigned int alignmask;
803d8a32ac2SJussi Kivilinna 	int ret;
804d8a32ac2SJussi Kivilinna 
805d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
80658dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
807d8a32ac2SJussi Kivilinna 	if (ret)
808d8a32ac2SJussi Kivilinna 		return ret;
809d8a32ac2SJussi Kivilinna 
810d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
81158dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
81258dcf548SJussi Kivilinna 	if (ret)
81358dcf548SJussi Kivilinna 		return ret;
81458dcf548SJussi Kivilinna 
81558dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
81658dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
81758dcf548SJussi Kivilinna 	if (ret)
81858dcf548SJussi Kivilinna 		return ret;
81958dcf548SJussi Kivilinna 
82058dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
82158dcf548SJussi Kivilinna 	if (alignmask) {
82258dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
82358dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
82458dcf548SJussi Kivilinna 				  alignmask + 1);
82558dcf548SJussi Kivilinna 		if (ret)
82658dcf548SJussi Kivilinna 			return ret;
82758dcf548SJussi Kivilinna 	}
82858dcf548SJussi Kivilinna 
82958dcf548SJussi Kivilinna 	return 0;
830d8a32ac2SJussi Kivilinna }
831d8a32ac2SJussi Kivilinna 
8321aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
8331aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
8341aa4ecd9SHerbert Xu {
8351aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
8361aa4ecd9SHerbert Xu 	unsigned int i, j, k;
8371aa4ecd9SHerbert Xu 	char *q;
8381aa4ecd9SHerbert Xu 	const char *e;
8391aa4ecd9SHerbert Xu 	void *data;
840f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
841f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
842f8b0d4d0SHerbert Xu 
843f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
844f8b0d4d0SHerbert Xu 		goto out_nobuf;
8451aa4ecd9SHerbert Xu 
8461aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
8471aa4ecd9SHerbert Xu 	        e = "encryption";
8481aa4ecd9SHerbert Xu 	else
8491aa4ecd9SHerbert Xu 		e = "decryption";
8501aa4ecd9SHerbert Xu 
8511aa4ecd9SHerbert Xu 	j = 0;
8521aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
8531aa4ecd9SHerbert Xu 		if (template[i].np)
8541aa4ecd9SHerbert Xu 			continue;
8551aa4ecd9SHerbert Xu 
8561aa4ecd9SHerbert Xu 		j++;
8571aa4ecd9SHerbert Xu 
858fd57f22aSHerbert Xu 		ret = -EINVAL;
859fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
860fd57f22aSHerbert Xu 			goto out;
861fd57f22aSHerbert Xu 
8621aa4ecd9SHerbert Xu 		data = xbuf[0];
8631aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
8641aa4ecd9SHerbert Xu 
8651aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
8661aa4ecd9SHerbert Xu 		if (template[i].wk)
8671aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
8681aa4ecd9SHerbert Xu 
8691aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
8701aa4ecd9SHerbert Xu 					   template[i].klen);
8711aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
8721aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
8731aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
8741aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
8751aa4ecd9SHerbert Xu 			goto out;
8761aa4ecd9SHerbert Xu 		} else if (ret)
8771aa4ecd9SHerbert Xu 			continue;
8781aa4ecd9SHerbert Xu 
8791aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
8801aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
8811aa4ecd9SHerbert Xu 			if (enc)
8821aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
8831aa4ecd9SHerbert Xu 							  data + k);
8841aa4ecd9SHerbert Xu 			else
8851aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
8861aa4ecd9SHerbert Xu 							  data + k);
8871aa4ecd9SHerbert Xu 		}
8881aa4ecd9SHerbert Xu 
8891aa4ecd9SHerbert Xu 		q = data;
8901aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
8911aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
8921aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
8931aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
8941aa4ecd9SHerbert Xu 			ret = -EINVAL;
8951aa4ecd9SHerbert Xu 			goto out;
8961aa4ecd9SHerbert Xu 		}
8971aa4ecd9SHerbert Xu 	}
8981aa4ecd9SHerbert Xu 
8991aa4ecd9SHerbert Xu 	ret = 0;
9001aa4ecd9SHerbert Xu 
9011aa4ecd9SHerbert Xu out:
902f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
903f8b0d4d0SHerbert Xu out_nobuf:
9041aa4ecd9SHerbert Xu 	return ret;
9051aa4ecd9SHerbert Xu }
9061aa4ecd9SHerbert Xu 
90708d6af8cSJussi Kivilinna static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc,
90808d6af8cSJussi Kivilinna 			   struct cipher_testvec *template, unsigned int tcount,
9093a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
910da7f033dSHerbert Xu {
911da7f033dSHerbert Xu 	const char *algo =
912da7f033dSHerbert Xu 		crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
913da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
914da7f033dSHerbert Xu 	char *q;
915da7f033dSHerbert Xu 	struct ablkcipher_request *req;
916da7f033dSHerbert Xu 	struct scatterlist sg[8];
91708d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
91808d6af8cSJussi Kivilinna 	const char *e, *d;
919da7f033dSHerbert Xu 	struct tcrypt_result result;
920da7f033dSHerbert Xu 	void *data;
921da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
922f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
92308d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
924f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
925f8b0d4d0SHerbert Xu 
926f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
927f8b0d4d0SHerbert Xu 		goto out_nobuf;
928da7f033dSHerbert Xu 
92908d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
93008d6af8cSJussi Kivilinna 		goto out_nooutbuf;
93108d6af8cSJussi Kivilinna 
93208d6af8cSJussi Kivilinna 	if (diff_dst)
93308d6af8cSJussi Kivilinna 		d = "-ddst";
93408d6af8cSJussi Kivilinna 	else
93508d6af8cSJussi Kivilinna 		d = "";
93608d6af8cSJussi Kivilinna 
937da7f033dSHerbert Xu 	if (enc == ENCRYPT)
938da7f033dSHerbert Xu 	        e = "encryption";
939da7f033dSHerbert Xu 	else
940da7f033dSHerbert Xu 		e = "decryption";
941da7f033dSHerbert Xu 
942da7f033dSHerbert Xu 	init_completion(&result.completion);
943da7f033dSHerbert Xu 
944da7f033dSHerbert Xu 	req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
945da7f033dSHerbert Xu 	if (!req) {
94608d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
94708d6af8cSJussi Kivilinna 		       d, algo);
948da7f033dSHerbert Xu 		goto out;
949da7f033dSHerbert Xu 	}
950da7f033dSHerbert Xu 
951da7f033dSHerbert Xu 	ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
952da7f033dSHerbert Xu 					tcrypt_complete, &result);
953da7f033dSHerbert Xu 
954da7f033dSHerbert Xu 	j = 0;
955da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
956bbb9a7ddSCristian Stoica 		if (template[i].np && !template[i].also_non_np)
957bbb9a7ddSCristian Stoica 			continue;
958bbb9a7ddSCristian Stoica 
959da7f033dSHerbert Xu 		if (template[i].iv)
960da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
961da7f033dSHerbert Xu 		else
962da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
963da7f033dSHerbert Xu 
964da7f033dSHerbert Xu 		j++;
965fd57f22aSHerbert Xu 		ret = -EINVAL;
966a1aa44a2SCristian Stoica 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
967fd57f22aSHerbert Xu 			goto out;
968fd57f22aSHerbert Xu 
969da7f033dSHerbert Xu 		data = xbuf[0];
9703a338f20SJussi Kivilinna 		data += align_offset;
971da7f033dSHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
972da7f033dSHerbert Xu 
973da7f033dSHerbert Xu 		crypto_ablkcipher_clear_flags(tfm, ~0);
974da7f033dSHerbert Xu 		if (template[i].wk)
975a1aa44a2SCristian Stoica 			crypto_ablkcipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
976da7f033dSHerbert Xu 
977da7f033dSHerbert Xu 		ret = crypto_ablkcipher_setkey(tfm, template[i].key,
978da7f033dSHerbert Xu 					       template[i].klen);
979da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
98008d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
981a1aa44a2SCristian Stoica 			       d, j, algo, crypto_ablkcipher_get_flags(tfm));
982da7f033dSHerbert Xu 			goto out;
983da7f033dSHerbert Xu 		} else if (ret)
984da7f033dSHerbert Xu 			continue;
985da7f033dSHerbert Xu 
986da7f033dSHerbert Xu 		sg_init_one(&sg[0], data, template[i].ilen);
98708d6af8cSJussi Kivilinna 		if (diff_dst) {
98808d6af8cSJussi Kivilinna 			data = xoutbuf[0];
9893a338f20SJussi Kivilinna 			data += align_offset;
99008d6af8cSJussi Kivilinna 			sg_init_one(&sgout[0], data, template[i].ilen);
99108d6af8cSJussi Kivilinna 		}
992da7f033dSHerbert Xu 
993a1aa44a2SCristian Stoica 		ablkcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
994da7f033dSHerbert Xu 					     template[i].ilen, iv);
995a1aa44a2SCristian Stoica 		ret = enc ? crypto_ablkcipher_encrypt(req) :
996da7f033dSHerbert Xu 			    crypto_ablkcipher_decrypt(req);
997da7f033dSHerbert Xu 
998da7f033dSHerbert Xu 		switch (ret) {
999da7f033dSHerbert Xu 		case 0:
1000da7f033dSHerbert Xu 			break;
1001da7f033dSHerbert Xu 		case -EINPROGRESS:
1002da7f033dSHerbert Xu 		case -EBUSY:
10038a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
100416735d02SWolfram Sang 			reinit_completion(&result.completion);
10058a45ac12SRabin Vincent 			ret = result.err;
10068a45ac12SRabin Vincent 			if (!ret)
1007da7f033dSHerbert Xu 				break;
1008da7f033dSHerbert Xu 			/* fall through */
1009da7f033dSHerbert Xu 		default:
101008d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
101108d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1012da7f033dSHerbert Xu 			goto out;
1013da7f033dSHerbert Xu 		}
1014da7f033dSHerbert Xu 
1015da7f033dSHerbert Xu 		q = data;
1016da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
101708d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: Test %d failed on %s for %s\n",
101808d6af8cSJussi Kivilinna 			       d, j, e, algo);
1019da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
1020da7f033dSHerbert Xu 			ret = -EINVAL;
1021da7f033dSHerbert Xu 			goto out;
1022da7f033dSHerbert Xu 		}
1023da7f033dSHerbert Xu 	}
1024da7f033dSHerbert Xu 
1025da7f033dSHerbert Xu 	j = 0;
1026da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
10273a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
10283a338f20SJussi Kivilinna 		if (align_offset != 0)
10293a338f20SJussi Kivilinna 			break;
1030da7f033dSHerbert Xu 
1031bbb9a7ddSCristian Stoica 		if (!template[i].np)
1032bbb9a7ddSCristian Stoica 			continue;
1033bbb9a7ddSCristian Stoica 
1034da7f033dSHerbert Xu 		if (template[i].iv)
1035da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
1036da7f033dSHerbert Xu 		else
1037da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1038da7f033dSHerbert Xu 
1039da7f033dSHerbert Xu 		j++;
1040da7f033dSHerbert Xu 		crypto_ablkcipher_clear_flags(tfm, ~0);
1041da7f033dSHerbert Xu 		if (template[i].wk)
1042a1aa44a2SCristian Stoica 			crypto_ablkcipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
1043da7f033dSHerbert Xu 
1044da7f033dSHerbert Xu 		ret = crypto_ablkcipher_setkey(tfm, template[i].key,
1045da7f033dSHerbert Xu 					       template[i].klen);
1046da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
104708d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
1048a1aa44a2SCristian Stoica 			       d, j, algo, crypto_ablkcipher_get_flags(tfm));
1049da7f033dSHerbert Xu 			goto out;
1050da7f033dSHerbert Xu 		} else if (ret)
1051da7f033dSHerbert Xu 			continue;
1052da7f033dSHerbert Xu 
1053da7f033dSHerbert Xu 		temp = 0;
1054da7f033dSHerbert Xu 		ret = -EINVAL;
1055da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
105608d6af8cSJussi Kivilinna 		if (diff_dst)
105708d6af8cSJussi Kivilinna 			sg_init_table(sgout, template[i].np);
1058da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
1059da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
1060da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
1061da7f033dSHerbert Xu 				goto out;
1062da7f033dSHerbert Xu 
1063a1aa44a2SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1064da7f033dSHerbert Xu 
1065a1aa44a2SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1066da7f033dSHerbert Xu 
1067a1aa44a2SCristian Stoica 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1068da7f033dSHerbert Xu 				q[template[i].tap[k]] = 0;
1069da7f033dSHerbert Xu 
1070da7f033dSHerbert Xu 			sg_set_buf(&sg[k], q, template[i].tap[k]);
107108d6af8cSJussi Kivilinna 			if (diff_dst) {
107208d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
107308d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
107408d6af8cSJussi Kivilinna 
1075a1aa44a2SCristian Stoica 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
107608d6af8cSJussi Kivilinna 
107708d6af8cSJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
107808d6af8cSJussi Kivilinna 				if (offset_in_page(q) +
107908d6af8cSJussi Kivilinna 				    template[i].tap[k] < PAGE_SIZE)
108008d6af8cSJussi Kivilinna 					q[template[i].tap[k]] = 0;
108108d6af8cSJussi Kivilinna 			}
1082da7f033dSHerbert Xu 
1083da7f033dSHerbert Xu 			temp += template[i].tap[k];
1084da7f033dSHerbert Xu 		}
1085da7f033dSHerbert Xu 
1086a1aa44a2SCristian Stoica 		ablkcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1087da7f033dSHerbert Xu 					     template[i].ilen, iv);
1088da7f033dSHerbert Xu 
1089a1aa44a2SCristian Stoica 		ret = enc ? crypto_ablkcipher_encrypt(req) :
1090da7f033dSHerbert Xu 			    crypto_ablkcipher_decrypt(req);
1091da7f033dSHerbert Xu 
1092da7f033dSHerbert Xu 		switch (ret) {
1093da7f033dSHerbert Xu 		case 0:
1094da7f033dSHerbert Xu 			break;
1095da7f033dSHerbert Xu 		case -EINPROGRESS:
1096da7f033dSHerbert Xu 		case -EBUSY:
10978a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
109816735d02SWolfram Sang 			reinit_completion(&result.completion);
10998a45ac12SRabin Vincent 			ret = result.err;
11008a45ac12SRabin Vincent 			if (!ret)
1101da7f033dSHerbert Xu 				break;
1102da7f033dSHerbert Xu 			/* fall through */
1103da7f033dSHerbert Xu 		default:
110408d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
110508d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1106da7f033dSHerbert Xu 			goto out;
1107da7f033dSHerbert Xu 		}
1108da7f033dSHerbert Xu 
1109da7f033dSHerbert Xu 		temp = 0;
1110da7f033dSHerbert Xu 		ret = -EINVAL;
1111da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
111208d6af8cSJussi Kivilinna 			if (diff_dst)
111308d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
111408d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
111508d6af8cSJussi Kivilinna 			else
1116da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1117da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1118da7f033dSHerbert Xu 
1119da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp,
1120da7f033dSHerbert Xu 				   template[i].tap[k])) {
112108d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
112208d6af8cSJussi Kivilinna 				       d, j, e, k, algo);
1123da7f033dSHerbert Xu 				hexdump(q, template[i].tap[k]);
1124da7f033dSHerbert Xu 				goto out;
1125da7f033dSHerbert Xu 			}
1126da7f033dSHerbert Xu 
1127da7f033dSHerbert Xu 			q += template[i].tap[k];
1128da7f033dSHerbert Xu 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1129da7f033dSHerbert Xu 				;
1130da7f033dSHerbert Xu 			if (n) {
113108d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
113208d6af8cSJussi Kivilinna 				       d, j, e, k, algo, n);
1133da7f033dSHerbert Xu 				hexdump(q, n);
1134da7f033dSHerbert Xu 				goto out;
1135da7f033dSHerbert Xu 			}
1136da7f033dSHerbert Xu 			temp += template[i].tap[k];
1137da7f033dSHerbert Xu 		}
1138da7f033dSHerbert Xu 	}
1139da7f033dSHerbert Xu 
1140da7f033dSHerbert Xu 	ret = 0;
1141da7f033dSHerbert Xu 
1142da7f033dSHerbert Xu out:
1143da7f033dSHerbert Xu 	ablkcipher_request_free(req);
114408d6af8cSJussi Kivilinna 	if (diff_dst)
114508d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
114608d6af8cSJussi Kivilinna out_nooutbuf:
1147f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1148f8b0d4d0SHerbert Xu out_nobuf:
1149da7f033dSHerbert Xu 	return ret;
1150da7f033dSHerbert Xu }
1151da7f033dSHerbert Xu 
115208d6af8cSJussi Kivilinna static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
115308d6af8cSJussi Kivilinna 			 struct cipher_testvec *template, unsigned int tcount)
115408d6af8cSJussi Kivilinna {
11553a338f20SJussi Kivilinna 	unsigned int alignmask;
115608d6af8cSJussi Kivilinna 	int ret;
115708d6af8cSJussi Kivilinna 
115808d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
11593a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
116008d6af8cSJussi Kivilinna 	if (ret)
116108d6af8cSJussi Kivilinna 		return ret;
116208d6af8cSJussi Kivilinna 
116308d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
11643a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
11653a338f20SJussi Kivilinna 	if (ret)
11663a338f20SJussi Kivilinna 		return ret;
11673a338f20SJussi Kivilinna 
11683a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
11693a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
11703a338f20SJussi Kivilinna 	if (ret)
11713a338f20SJussi Kivilinna 		return ret;
11723a338f20SJussi Kivilinna 
11733a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
11743a338f20SJussi Kivilinna 	if (alignmask) {
11753a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
11763a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
11773a338f20SJussi Kivilinna 				      alignmask + 1);
11783a338f20SJussi Kivilinna 		if (ret)
11793a338f20SJussi Kivilinna 			return ret;
11803a338f20SJussi Kivilinna 	}
11813a338f20SJussi Kivilinna 
11823a338f20SJussi Kivilinna 	return 0;
118308d6af8cSJussi Kivilinna }
118408d6af8cSJussi Kivilinna 
1185da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1186da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1187da7f033dSHerbert Xu {
1188da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1189da7f033dSHerbert Xu 	unsigned int i;
1190da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1191da7f033dSHerbert Xu 	int ret;
1192da7f033dSHerbert Xu 
1193da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1194c79cf910SGeert Uytterhoeven 		int ilen;
1195c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1196da7f033dSHerbert Xu 
1197da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1198da7f033dSHerbert Xu 
1199da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1200da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1201da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1202da7f033dSHerbert Xu 		if (ret) {
1203da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1204da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1205da7f033dSHerbert Xu 			       -ret);
1206da7f033dSHerbert Xu 			goto out;
1207da7f033dSHerbert Xu 		}
1208da7f033dSHerbert Xu 
1209b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1210b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1211b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1212b812eb00SGeert Uytterhoeven 			       dlen);
1213b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1214b812eb00SGeert Uytterhoeven 			goto out;
1215b812eb00SGeert Uytterhoeven 		}
1216b812eb00SGeert Uytterhoeven 
1217da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1218da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1219da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1220da7f033dSHerbert Xu 			hexdump(result, dlen);
1221da7f033dSHerbert Xu 			ret = -EINVAL;
1222da7f033dSHerbert Xu 			goto out;
1223da7f033dSHerbert Xu 		}
1224da7f033dSHerbert Xu 	}
1225da7f033dSHerbert Xu 
1226da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1227c79cf910SGeert Uytterhoeven 		int ilen;
1228c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1229da7f033dSHerbert Xu 
1230da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1231da7f033dSHerbert Xu 
1232da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1233da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1234da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1235da7f033dSHerbert Xu 		if (ret) {
1236da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1237da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1238da7f033dSHerbert Xu 			       -ret);
1239da7f033dSHerbert Xu 			goto out;
1240da7f033dSHerbert Xu 		}
1241da7f033dSHerbert Xu 
1242b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1243b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1244b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1245b812eb00SGeert Uytterhoeven 			       dlen);
1246b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1247b812eb00SGeert Uytterhoeven 			goto out;
1248b812eb00SGeert Uytterhoeven 		}
1249b812eb00SGeert Uytterhoeven 
1250da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1251da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1252da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1253da7f033dSHerbert Xu 			hexdump(result, dlen);
1254da7f033dSHerbert Xu 			ret = -EINVAL;
1255da7f033dSHerbert Xu 			goto out;
1256da7f033dSHerbert Xu 		}
1257da7f033dSHerbert Xu 	}
1258da7f033dSHerbert Xu 
1259da7f033dSHerbert Xu 	ret = 0;
1260da7f033dSHerbert Xu 
1261da7f033dSHerbert Xu out:
1262da7f033dSHerbert Xu 	return ret;
1263da7f033dSHerbert Xu }
1264da7f033dSHerbert Xu 
12658064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm,
12668064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *ctemplate,
12678064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *dtemplate, int ctcount,
12688064efb8SGeert Uytterhoeven 		      int dtcount)
12698064efb8SGeert Uytterhoeven {
12708064efb8SGeert Uytterhoeven 	const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
12718064efb8SGeert Uytterhoeven 	unsigned int i;
12728064efb8SGeert Uytterhoeven 	char result[COMP_BUF_SIZE];
12733ce858cbSGeert Uytterhoeven 	int res;
12748064efb8SGeert Uytterhoeven 
12758064efb8SGeert Uytterhoeven 	for (i = 0; i < ctcount; i++) {
12768064efb8SGeert Uytterhoeven 		struct comp_request req;
12773ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
12788064efb8SGeert Uytterhoeven 
12793ce858cbSGeert Uytterhoeven 		res = crypto_compress_setup(tfm, ctemplate[i].params,
12808064efb8SGeert Uytterhoeven 					    ctemplate[i].paramsize);
12813ce858cbSGeert Uytterhoeven 		if (res) {
12828064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression setup failed on test "
12833ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12843ce858cbSGeert Uytterhoeven 			return res;
12858064efb8SGeert Uytterhoeven 		}
12868064efb8SGeert Uytterhoeven 
12873ce858cbSGeert Uytterhoeven 		res = crypto_compress_init(tfm);
12883ce858cbSGeert Uytterhoeven 		if (res) {
12898064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression init failed on test "
12903ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12913ce858cbSGeert Uytterhoeven 			return res;
12928064efb8SGeert Uytterhoeven 		}
12938064efb8SGeert Uytterhoeven 
12948064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
12958064efb8SGeert Uytterhoeven 
12968064efb8SGeert Uytterhoeven 		req.next_in = ctemplate[i].input;
12978064efb8SGeert Uytterhoeven 		req.avail_in = ctemplate[i].inlen / 2;
12988064efb8SGeert Uytterhoeven 		req.next_out = result;
12998064efb8SGeert Uytterhoeven 		req.avail_out = ctemplate[i].outlen / 2;
13008064efb8SGeert Uytterhoeven 
13013ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13023ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13038064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13043ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13053ce858cbSGeert Uytterhoeven 			return res;
13068064efb8SGeert Uytterhoeven 		}
13073ce858cbSGeert Uytterhoeven 		if (res > 0)
13083ce858cbSGeert Uytterhoeven 			produced += res;
13098064efb8SGeert Uytterhoeven 
13108064efb8SGeert Uytterhoeven 		/* Add remaining input data */
13118064efb8SGeert Uytterhoeven 		req.avail_in += (ctemplate[i].inlen + 1) / 2;
13128064efb8SGeert Uytterhoeven 
13133ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13143ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13158064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13163ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13173ce858cbSGeert Uytterhoeven 			return res;
13188064efb8SGeert Uytterhoeven 		}
13193ce858cbSGeert Uytterhoeven 		if (res > 0)
13203ce858cbSGeert Uytterhoeven 			produced += res;
13218064efb8SGeert Uytterhoeven 
13228064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
13238064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
13248064efb8SGeert Uytterhoeven 
13253ce858cbSGeert Uytterhoeven 		res = crypto_compress_final(tfm, &req);
13263ce858cbSGeert Uytterhoeven 		if (res < 0) {
13278064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression final failed on test "
13283ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13293ce858cbSGeert Uytterhoeven 			return res;
13308064efb8SGeert Uytterhoeven 		}
13313ce858cbSGeert Uytterhoeven 		produced += res;
13328064efb8SGeert Uytterhoeven 
13338064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
13348064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13358064efb8SGeert Uytterhoeven 			       "output len = %d (expected %d)\n", i + 1, algo,
13368064efb8SGeert Uytterhoeven 			       COMP_BUF_SIZE - req.avail_out,
13378064efb8SGeert Uytterhoeven 			       ctemplate[i].outlen);
13388064efb8SGeert Uytterhoeven 			return -EINVAL;
13398064efb8SGeert Uytterhoeven 		}
13408064efb8SGeert Uytterhoeven 
13413ce858cbSGeert Uytterhoeven 		if (produced != ctemplate[i].outlen) {
13423ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13433ce858cbSGeert Uytterhoeven 			       "returned len = %u (expected %d)\n", i + 1,
13443ce858cbSGeert Uytterhoeven 			       algo, produced, ctemplate[i].outlen);
13453ce858cbSGeert Uytterhoeven 			return -EINVAL;
13463ce858cbSGeert Uytterhoeven 		}
13473ce858cbSGeert Uytterhoeven 
13488064efb8SGeert Uytterhoeven 		if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
13498064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Compression test %d failed for "
13508064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
13518064efb8SGeert Uytterhoeven 			hexdump(result, ctemplate[i].outlen);
13528064efb8SGeert Uytterhoeven 			return -EINVAL;
13538064efb8SGeert Uytterhoeven 		}
13548064efb8SGeert Uytterhoeven 	}
13558064efb8SGeert Uytterhoeven 
13568064efb8SGeert Uytterhoeven 	for (i = 0; i < dtcount; i++) {
13578064efb8SGeert Uytterhoeven 		struct comp_request req;
13583ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
13598064efb8SGeert Uytterhoeven 
13603ce858cbSGeert Uytterhoeven 		res = crypto_decompress_setup(tfm, dtemplate[i].params,
13618064efb8SGeert Uytterhoeven 					      dtemplate[i].paramsize);
13623ce858cbSGeert Uytterhoeven 		if (res) {
13638064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression setup failed on "
13643ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13653ce858cbSGeert Uytterhoeven 			return res;
13668064efb8SGeert Uytterhoeven 		}
13678064efb8SGeert Uytterhoeven 
13683ce858cbSGeert Uytterhoeven 		res = crypto_decompress_init(tfm);
13693ce858cbSGeert Uytterhoeven 		if (res) {
13708064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression init failed on test "
13713ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13723ce858cbSGeert Uytterhoeven 			return res;
13738064efb8SGeert Uytterhoeven 		}
13748064efb8SGeert Uytterhoeven 
13758064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
13768064efb8SGeert Uytterhoeven 
13778064efb8SGeert Uytterhoeven 		req.next_in = dtemplate[i].input;
13788064efb8SGeert Uytterhoeven 		req.avail_in = dtemplate[i].inlen / 2;
13798064efb8SGeert Uytterhoeven 		req.next_out = result;
13808064efb8SGeert Uytterhoeven 		req.avail_out = dtemplate[i].outlen / 2;
13818064efb8SGeert Uytterhoeven 
13823ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
13833ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13848064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
13853ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13863ce858cbSGeert Uytterhoeven 			return res;
13878064efb8SGeert Uytterhoeven 		}
13883ce858cbSGeert Uytterhoeven 		if (res > 0)
13893ce858cbSGeert Uytterhoeven 			produced += res;
13908064efb8SGeert Uytterhoeven 
13918064efb8SGeert Uytterhoeven 		/* Add remaining input data */
13928064efb8SGeert Uytterhoeven 		req.avail_in += (dtemplate[i].inlen + 1) / 2;
13938064efb8SGeert Uytterhoeven 
13943ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
13953ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13968064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
13973ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13983ce858cbSGeert Uytterhoeven 			return res;
13998064efb8SGeert Uytterhoeven 		}
14003ce858cbSGeert Uytterhoeven 		if (res > 0)
14013ce858cbSGeert Uytterhoeven 			produced += res;
14028064efb8SGeert Uytterhoeven 
14038064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
14048064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
14058064efb8SGeert Uytterhoeven 
14063ce858cbSGeert Uytterhoeven 		res = crypto_decompress_final(tfm, &req);
14073ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14088064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression final failed on "
14093ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14103ce858cbSGeert Uytterhoeven 			return res;
14118064efb8SGeert Uytterhoeven 		}
14123ce858cbSGeert Uytterhoeven 		if (res > 0)
14133ce858cbSGeert Uytterhoeven 			produced += res;
14148064efb8SGeert Uytterhoeven 
14158064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
14168064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14178064efb8SGeert Uytterhoeven 			       "%s: output len = %d (expected %d)\n", i + 1,
14188064efb8SGeert Uytterhoeven 			       algo, COMP_BUF_SIZE - req.avail_out,
14198064efb8SGeert Uytterhoeven 			       dtemplate[i].outlen);
14208064efb8SGeert Uytterhoeven 			return -EINVAL;
14218064efb8SGeert Uytterhoeven 		}
14228064efb8SGeert Uytterhoeven 
14233ce858cbSGeert Uytterhoeven 		if (produced != dtemplate[i].outlen) {
14243ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14253ce858cbSGeert Uytterhoeven 			       "%s: returned len = %u (expected %d)\n", i + 1,
14263ce858cbSGeert Uytterhoeven 			       algo, produced, dtemplate[i].outlen);
14273ce858cbSGeert Uytterhoeven 			return -EINVAL;
14283ce858cbSGeert Uytterhoeven 		}
14293ce858cbSGeert Uytterhoeven 
14308064efb8SGeert Uytterhoeven 		if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
14318064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Decompression test %d failed for "
14328064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
14338064efb8SGeert Uytterhoeven 			hexdump(result, dtemplate[i].outlen);
14348064efb8SGeert Uytterhoeven 			return -EINVAL;
14358064efb8SGeert Uytterhoeven 		}
14368064efb8SGeert Uytterhoeven 	}
14378064efb8SGeert Uytterhoeven 
14388064efb8SGeert Uytterhoeven 	return 0;
14398064efb8SGeert Uytterhoeven }
14408064efb8SGeert Uytterhoeven 
14417647d6ceSJarod Wilson 
14427647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
14437647d6ceSJarod Wilson 		      unsigned int tcount)
14447647d6ceSJarod Wilson {
14457647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1446fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
14477647d6ceSJarod Wilson 	u8 *seed;
14487647d6ceSJarod Wilson 	char result[32];
14497647d6ceSJarod Wilson 
14507647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
14517647d6ceSJarod Wilson 
14527647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
14537647d6ceSJarod Wilson 	if (!seed) {
14547647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
14557647d6ceSJarod Wilson 		       "for %s\n", algo);
14567647d6ceSJarod Wilson 		return -ENOMEM;
14577647d6ceSJarod Wilson 	}
14587647d6ceSJarod Wilson 
14597647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
14607647d6ceSJarod Wilson 		memset(result, 0, 32);
14617647d6ceSJarod Wilson 
14627647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
14637647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
14647647d6ceSJarod Wilson 		       template[i].klen);
14657647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
14667647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
14677647d6ceSJarod Wilson 
14687647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
14697647d6ceSJarod Wilson 		if (err) {
14707647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
14717647d6ceSJarod Wilson 			       "for %s\n", algo);
14727647d6ceSJarod Wilson 			goto out;
14737647d6ceSJarod Wilson 		}
14747647d6ceSJarod Wilson 
14757647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
14767647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
14777647d6ceSJarod Wilson 						   template[i].rlen);
147819e60e13SStephan Mueller 			if (err < 0) {
14797647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
14807647d6ceSJarod Wilson 				       "the correct amount of random data for "
148119e60e13SStephan Mueller 				       "%s (requested %d)\n", algo,
148219e60e13SStephan Mueller 				       template[i].rlen);
14837647d6ceSJarod Wilson 				goto out;
14847647d6ceSJarod Wilson 			}
14857647d6ceSJarod Wilson 		}
14867647d6ceSJarod Wilson 
14877647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
14887647d6ceSJarod Wilson 			     template[i].rlen);
14897647d6ceSJarod Wilson 		if (err) {
14907647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
14917647d6ceSJarod Wilson 			       i, algo);
14927647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
14937647d6ceSJarod Wilson 			err = -EINVAL;
14947647d6ceSJarod Wilson 			goto out;
14957647d6ceSJarod Wilson 		}
14967647d6ceSJarod Wilson 	}
14977647d6ceSJarod Wilson 
14987647d6ceSJarod Wilson out:
14997647d6ceSJarod Wilson 	kfree(seed);
15007647d6ceSJarod Wilson 	return err;
15017647d6ceSJarod Wilson }
15027647d6ceSJarod Wilson 
1503da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1504da7f033dSHerbert Xu 			 u32 type, u32 mask)
1505da7f033dSHerbert Xu {
1506da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1507da7f033dSHerbert Xu 	int err = 0;
1508da7f033dSHerbert Xu 
1509425a8829SStephan Mueller 	tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask);
1510da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1511da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1512da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1513da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1514da7f033dSHerbert Xu 	}
1515da7f033dSHerbert Xu 
1516da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1517da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1518da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1519da7f033dSHerbert Xu 		if (err)
1520da7f033dSHerbert Xu 			goto out;
1521da7f033dSHerbert Xu 	}
1522da7f033dSHerbert Xu 
1523da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1524da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1525da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1526da7f033dSHerbert Xu 
1527da7f033dSHerbert Xu out:
1528da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1529da7f033dSHerbert Xu 	return err;
1530da7f033dSHerbert Xu }
1531da7f033dSHerbert Xu 
1532da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1533da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1534da7f033dSHerbert Xu {
15351aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1536da7f033dSHerbert Xu 	int err = 0;
1537da7f033dSHerbert Xu 
1538425a8829SStephan Mueller 	tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1539da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1540da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1541da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1542da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1543da7f033dSHerbert Xu 	}
1544da7f033dSHerbert Xu 
1545da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1546da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1547da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1548da7f033dSHerbert Xu 		if (err)
1549da7f033dSHerbert Xu 			goto out;
1550da7f033dSHerbert Xu 	}
1551da7f033dSHerbert Xu 
1552da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1553da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1554da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1555da7f033dSHerbert Xu 
1556da7f033dSHerbert Xu out:
15571aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
15581aa4ecd9SHerbert Xu 	return err;
15591aa4ecd9SHerbert Xu }
15601aa4ecd9SHerbert Xu 
15611aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
15621aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
15631aa4ecd9SHerbert Xu {
15641aa4ecd9SHerbert Xu 	struct crypto_ablkcipher *tfm;
15651aa4ecd9SHerbert Xu 	int err = 0;
15661aa4ecd9SHerbert Xu 
1567425a8829SStephan Mueller 	tfm = crypto_alloc_ablkcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
15681aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
15691aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
15701aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
15711aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
15721aa4ecd9SHerbert Xu 	}
15731aa4ecd9SHerbert Xu 
15741aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
15751aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
15761aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
15771aa4ecd9SHerbert Xu 		if (err)
15781aa4ecd9SHerbert Xu 			goto out;
15791aa4ecd9SHerbert Xu 	}
15801aa4ecd9SHerbert Xu 
15811aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
15821aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
15831aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
15841aa4ecd9SHerbert Xu 
15851aa4ecd9SHerbert Xu out:
1586da7f033dSHerbert Xu 	crypto_free_ablkcipher(tfm);
1587da7f033dSHerbert Xu 	return err;
1588da7f033dSHerbert Xu }
1589da7f033dSHerbert Xu 
1590da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1591da7f033dSHerbert Xu 			 u32 type, u32 mask)
1592da7f033dSHerbert Xu {
1593da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1594da7f033dSHerbert Xu 	int err;
1595da7f033dSHerbert Xu 
1596da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1597da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1598da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1599da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1600da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1601da7f033dSHerbert Xu 	}
1602da7f033dSHerbert Xu 
1603da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1604da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1605da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1606da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1607da7f033dSHerbert Xu 
1608da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1609da7f033dSHerbert Xu 	return err;
1610da7f033dSHerbert Xu }
1611da7f033dSHerbert Xu 
16128064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
16138064efb8SGeert Uytterhoeven 			  u32 type, u32 mask)
16148064efb8SGeert Uytterhoeven {
16158064efb8SGeert Uytterhoeven 	struct crypto_pcomp *tfm;
16168064efb8SGeert Uytterhoeven 	int err;
16178064efb8SGeert Uytterhoeven 
16188064efb8SGeert Uytterhoeven 	tfm = crypto_alloc_pcomp(driver, type, mask);
16198064efb8SGeert Uytterhoeven 	if (IS_ERR(tfm)) {
16208064efb8SGeert Uytterhoeven 		pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
16218064efb8SGeert Uytterhoeven 		       driver, PTR_ERR(tfm));
16228064efb8SGeert Uytterhoeven 		return PTR_ERR(tfm);
16238064efb8SGeert Uytterhoeven 	}
16248064efb8SGeert Uytterhoeven 
16258064efb8SGeert Uytterhoeven 	err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
16268064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.vecs,
16278064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.comp.count,
16288064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.count);
16298064efb8SGeert Uytterhoeven 
16308064efb8SGeert Uytterhoeven 	crypto_free_pcomp(tfm);
16318064efb8SGeert Uytterhoeven 	return err;
16328064efb8SGeert Uytterhoeven }
16338064efb8SGeert Uytterhoeven 
1634da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1635da7f033dSHerbert Xu 			 u32 type, u32 mask)
1636da7f033dSHerbert Xu {
1637da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1638da7f033dSHerbert Xu 	int err;
1639da7f033dSHerbert Xu 
1640425a8829SStephan Mueller 	tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask);
1641da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1642da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1643da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1644da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1645da7f033dSHerbert Xu 	}
1646da7f033dSHerbert Xu 
1647a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1648a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1649a8f1a052SDavid S. Miller 	if (!err)
1650a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1651a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1652da7f033dSHerbert Xu 
1653da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1654da7f033dSHerbert Xu 	return err;
1655da7f033dSHerbert Xu }
1656da7f033dSHerbert Xu 
16578e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
16588e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
16598e3ee85eSHerbert Xu {
16608e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
16618e3ee85eSHerbert Xu 	u32 val;
16628e3ee85eSHerbert Xu 	int err;
16638e3ee85eSHerbert Xu 
16648e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
16658e3ee85eSHerbert Xu 	if (err)
16668e3ee85eSHerbert Xu 		goto out;
16678e3ee85eSHerbert Xu 
1668425a8829SStephan Mueller 	tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask);
16698e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
16708e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
16718e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
16728e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
16738e3ee85eSHerbert Xu 		goto out;
16748e3ee85eSHerbert Xu 	}
16758e3ee85eSHerbert Xu 
16768e3ee85eSHerbert Xu 	do {
16774c5c3024SJan-Simon Möller 		SHASH_DESC_ON_STACK(shash, tfm);
16784c5c3024SJan-Simon Möller 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
16798e3ee85eSHerbert Xu 
16804c5c3024SJan-Simon Möller 		shash->tfm = tfm;
16814c5c3024SJan-Simon Möller 		shash->flags = 0;
16828e3ee85eSHerbert Xu 
16834c5c3024SJan-Simon Möller 		*ctx = le32_to_cpu(420553207);
16844c5c3024SJan-Simon Möller 		err = crypto_shash_final(shash, (u8 *)&val);
16858e3ee85eSHerbert Xu 		if (err) {
16868e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
16878e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
16888e3ee85eSHerbert Xu 			break;
16898e3ee85eSHerbert Xu 		}
16908e3ee85eSHerbert Xu 
16918e3ee85eSHerbert Xu 		if (val != ~420553207) {
16928e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
16938e3ee85eSHerbert Xu 			       "%d\n", driver, val);
16948e3ee85eSHerbert Xu 			err = -EINVAL;
16958e3ee85eSHerbert Xu 		}
16968e3ee85eSHerbert Xu 	} while (0);
16978e3ee85eSHerbert Xu 
16988e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
16998e3ee85eSHerbert Xu 
17008e3ee85eSHerbert Xu out:
17018e3ee85eSHerbert Xu 	return err;
17028e3ee85eSHerbert Xu }
17038e3ee85eSHerbert Xu 
17047647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
17057647d6ceSJarod Wilson 			  u32 type, u32 mask)
17067647d6ceSJarod Wilson {
17077647d6ceSJarod Wilson 	struct crypto_rng *rng;
17087647d6ceSJarod Wilson 	int err;
17097647d6ceSJarod Wilson 
1710425a8829SStephan Mueller 	rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
17117647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
17127647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
17137647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
17147647d6ceSJarod Wilson 		return PTR_ERR(rng);
17157647d6ceSJarod Wilson 	}
17167647d6ceSJarod Wilson 
17177647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
17187647d6ceSJarod Wilson 
17197647d6ceSJarod Wilson 	crypto_free_rng(rng);
17207647d6ceSJarod Wilson 
17217647d6ceSJarod Wilson 	return err;
17227647d6ceSJarod Wilson }
17237647d6ceSJarod Wilson 
172464d1cdfbSStephan Mueller 
172564d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr,
172664d1cdfbSStephan Mueller 			  const char *driver, u32 type, u32 mask)
172764d1cdfbSStephan Mueller {
172864d1cdfbSStephan Mueller 	int ret = -EAGAIN;
172964d1cdfbSStephan Mueller 	struct crypto_rng *drng;
173064d1cdfbSStephan Mueller 	struct drbg_test_data test_data;
173164d1cdfbSStephan Mueller 	struct drbg_string addtl, pers, testentropy;
173264d1cdfbSStephan Mueller 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
173364d1cdfbSStephan Mueller 
173464d1cdfbSStephan Mueller 	if (!buf)
173564d1cdfbSStephan Mueller 		return -ENOMEM;
173664d1cdfbSStephan Mueller 
1737425a8829SStephan Mueller 	drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
173864d1cdfbSStephan Mueller 	if (IS_ERR(drng)) {
173964d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
174064d1cdfbSStephan Mueller 		       "%s\n", driver);
174164d1cdfbSStephan Mueller 		kzfree(buf);
174264d1cdfbSStephan Mueller 		return -ENOMEM;
174364d1cdfbSStephan Mueller 	}
174464d1cdfbSStephan Mueller 
174564d1cdfbSStephan Mueller 	test_data.testentropy = &testentropy;
174664d1cdfbSStephan Mueller 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
174764d1cdfbSStephan Mueller 	drbg_string_fill(&pers, test->pers, test->perslen);
174864d1cdfbSStephan Mueller 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
174964d1cdfbSStephan Mueller 	if (ret) {
175064d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
175164d1cdfbSStephan Mueller 		goto outbuf;
175264d1cdfbSStephan Mueller 	}
175364d1cdfbSStephan Mueller 
175464d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
175564d1cdfbSStephan Mueller 	if (pr) {
175664d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
175764d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
175864d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl,	&test_data);
175964d1cdfbSStephan Mueller 	} else {
176064d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
176164d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
176264d1cdfbSStephan Mueller 	}
176319e60e13SStephan Mueller 	if (ret < 0) {
176464d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
176564d1cdfbSStephan Mueller 		       "driver %s\n", driver);
176664d1cdfbSStephan Mueller 		goto outbuf;
176764d1cdfbSStephan Mueller 	}
176864d1cdfbSStephan Mueller 
176964d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
177064d1cdfbSStephan Mueller 	if (pr) {
177164d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
177264d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
177364d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl, &test_data);
177464d1cdfbSStephan Mueller 	} else {
177564d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
177664d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
177764d1cdfbSStephan Mueller 	}
177819e60e13SStephan Mueller 	if (ret < 0) {
177964d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
178064d1cdfbSStephan Mueller 		       "driver %s\n", driver);
178164d1cdfbSStephan Mueller 		goto outbuf;
178264d1cdfbSStephan Mueller 	}
178364d1cdfbSStephan Mueller 
178464d1cdfbSStephan Mueller 	ret = memcmp(test->expected, buf, test->expectedlen);
178564d1cdfbSStephan Mueller 
178664d1cdfbSStephan Mueller outbuf:
178764d1cdfbSStephan Mueller 	crypto_free_rng(drng);
178864d1cdfbSStephan Mueller 	kzfree(buf);
178964d1cdfbSStephan Mueller 	return ret;
179064d1cdfbSStephan Mueller }
179164d1cdfbSStephan Mueller 
179264d1cdfbSStephan Mueller 
179364d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
179464d1cdfbSStephan Mueller 			 u32 type, u32 mask)
179564d1cdfbSStephan Mueller {
179664d1cdfbSStephan Mueller 	int err = 0;
179764d1cdfbSStephan Mueller 	int pr = 0;
179864d1cdfbSStephan Mueller 	int i = 0;
179964d1cdfbSStephan Mueller 	struct drbg_testvec *template = desc->suite.drbg.vecs;
180064d1cdfbSStephan Mueller 	unsigned int tcount = desc->suite.drbg.count;
180164d1cdfbSStephan Mueller 
180264d1cdfbSStephan Mueller 	if (0 == memcmp(driver, "drbg_pr_", 8))
180364d1cdfbSStephan Mueller 		pr = 1;
180464d1cdfbSStephan Mueller 
180564d1cdfbSStephan Mueller 	for (i = 0; i < tcount; i++) {
180664d1cdfbSStephan Mueller 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
180764d1cdfbSStephan Mueller 		if (err) {
180864d1cdfbSStephan Mueller 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
180964d1cdfbSStephan Mueller 			       i, driver);
181064d1cdfbSStephan Mueller 			err = -EINVAL;
181164d1cdfbSStephan Mueller 			break;
181264d1cdfbSStephan Mueller 		}
181364d1cdfbSStephan Mueller 	}
181464d1cdfbSStephan Mueller 	return err;
181564d1cdfbSStephan Mueller 
181664d1cdfbSStephan Mueller }
181764d1cdfbSStephan Mueller 
1818863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1819863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1820863b557aSYouquan, Song {
1821863b557aSYouquan, Song 	return 0;
1822863b557aSYouquan, Song }
1823863b557aSYouquan, Song 
1824da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1825da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1826da7f033dSHerbert Xu 	{
18274d6d6a2cSJohannes Goetzfried 		.alg = "__cbc-cast5-avx",
18284d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
18294d6d6a2cSJohannes Goetzfried 	}, {
18304ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
18314ea1277dSJohannes Goetzfried 		.test = alg_test_null,
18324ea1277dSJohannes Goetzfried 	}, {
18337efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
18347efe4076SJohannes Goetzfried 		.test = alg_test_null,
18357efe4076SJohannes Goetzfried 	}, {
183656d76c96SJussi Kivilinna 		.alg = "__cbc-serpent-avx2",
183756d76c96SJussi Kivilinna 		.test = alg_test_null,
183856d76c96SJussi Kivilinna 	}, {
1839937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
1840937c30d7SJussi Kivilinna 		.test = alg_test_null,
1841937c30d7SJussi Kivilinna 	}, {
1842107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
1843107778b5SJohannes Goetzfried 		.test = alg_test_null,
1844107778b5SJohannes Goetzfried 	}, {
1845863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
1846863b557aSYouquan, Song 		.test = alg_test_null,
18476c79294fSMilan Broz 		.fips_allowed = 1,
1848863b557aSYouquan, Song 	}, {
1849d9b1d2e7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni",
1850d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1851d9b1d2e7SJussi Kivilinna 	}, {
1852f3f935a7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni-avx2",
1853f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1854f3f935a7SJussi Kivilinna 	}, {
18554d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
18564d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
18574d6d6a2cSJohannes Goetzfried 	}, {
18584ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
18594ea1277dSJohannes Goetzfried 		.test = alg_test_null,
18604ea1277dSJohannes Goetzfried 	}, {
18617efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
18627efe4076SJohannes Goetzfried 		.test = alg_test_null,
18637efe4076SJohannes Goetzfried 	}, {
186456d76c96SJussi Kivilinna 		.alg = "__driver-cbc-serpent-avx2",
186556d76c96SJussi Kivilinna 		.test = alg_test_null,
186656d76c96SJussi Kivilinna 	}, {
1867937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
1868937c30d7SJussi Kivilinna 		.test = alg_test_null,
1869937c30d7SJussi Kivilinna 	}, {
1870107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
1871107778b5SJohannes Goetzfried 		.test = alg_test_null,
1872107778b5SJohannes Goetzfried 	}, {
1873863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
1874863b557aSYouquan, Song 		.test = alg_test_null,
18756c79294fSMilan Broz 		.fips_allowed = 1,
1876863b557aSYouquan, Song 	}, {
1877d9b1d2e7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni",
1878d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1879d9b1d2e7SJussi Kivilinna 	}, {
1880f3f935a7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni-avx2",
1881f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1882f3f935a7SJussi Kivilinna 	}, {
18834d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
18844d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
18854d6d6a2cSJohannes Goetzfried 	}, {
18864ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
18874ea1277dSJohannes Goetzfried 		.test = alg_test_null,
18884ea1277dSJohannes Goetzfried 	}, {
18897efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
18907efe4076SJohannes Goetzfried 		.test = alg_test_null,
18917efe4076SJohannes Goetzfried 	}, {
189256d76c96SJussi Kivilinna 		.alg = "__driver-ecb-serpent-avx2",
189356d76c96SJussi Kivilinna 		.test = alg_test_null,
189456d76c96SJussi Kivilinna 	}, {
1895937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
1896937c30d7SJussi Kivilinna 		.test = alg_test_null,
1897937c30d7SJussi Kivilinna 	}, {
1898107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
1899107778b5SJohannes Goetzfried 		.test = alg_test_null,
1900107778b5SJohannes Goetzfried 	}, {
1901863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
1902863b557aSYouquan, Song 		.test = alg_test_null,
19036c79294fSMilan Broz 		.fips_allowed = 1,
1904863b557aSYouquan, Song 	}, {
1905e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
1906e08ca2daSJarod Wilson 		.test = alg_test_cprng,
1907a1915d51SJarod Wilson 		.fips_allowed = 1,
1908e08ca2daSJarod Wilson 		.suite = {
1909e08ca2daSJarod Wilson 			.cprng = {
1910e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
1911e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
1912e08ca2daSJarod Wilson 			}
1913e08ca2daSJarod Wilson 		}
1914e08ca2daSJarod Wilson 	}, {
1915bca4feb0SHoria Geanta 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
1916bca4feb0SHoria Geanta 		.test = alg_test_aead,
1917bca4feb0SHoria Geanta 		.fips_allowed = 1,
1918bca4feb0SHoria Geanta 		.suite = {
1919bca4feb0SHoria Geanta 			.aead = {
1920bca4feb0SHoria Geanta 				.enc = {
1921bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_enc_tv_template,
1922bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS
1923bca4feb0SHoria Geanta 				},
1924bca4feb0SHoria Geanta 				.dec = {
1925bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_dec_tv_template,
1926bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS
1927bca4feb0SHoria Geanta 				}
1928bca4feb0SHoria Geanta 			}
1929bca4feb0SHoria Geanta 		}
1930bca4feb0SHoria Geanta 	}, {
1931e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha1),cbc(aes))",
1932e46e9a46SHoria Geanta 		.test = alg_test_aead,
1933e46e9a46SHoria Geanta 		.fips_allowed = 1,
1934e46e9a46SHoria Geanta 		.suite = {
1935e46e9a46SHoria Geanta 			.aead = {
1936e46e9a46SHoria Geanta 				.enc = {
19375208ed2cSNitesh Lal 					.vecs =
19385208ed2cSNitesh Lal 					hmac_sha1_aes_cbc_enc_tv_temp,
19395208ed2cSNitesh Lal 					.count =
19405208ed2cSNitesh Lal 					HMAC_SHA1_AES_CBC_ENC_TEST_VEC
19415208ed2cSNitesh Lal 				}
19425208ed2cSNitesh Lal 			}
19435208ed2cSNitesh Lal 		}
19445208ed2cSNitesh Lal 	}, {
19455208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha1),cbc(des))",
19465208ed2cSNitesh Lal 		.test = alg_test_aead,
19475208ed2cSNitesh Lal 		.fips_allowed = 1,
19485208ed2cSNitesh Lal 		.suite = {
19495208ed2cSNitesh Lal 			.aead = {
19505208ed2cSNitesh Lal 				.enc = {
19515208ed2cSNitesh Lal 					.vecs =
19525208ed2cSNitesh Lal 					hmac_sha1_des_cbc_enc_tv_temp,
19535208ed2cSNitesh Lal 					.count =
19545208ed2cSNitesh Lal 					HMAC_SHA1_DES_CBC_ENC_TEST_VEC
19555208ed2cSNitesh Lal 				}
19565208ed2cSNitesh Lal 			}
19575208ed2cSNitesh Lal 		}
19585208ed2cSNitesh Lal 	}, {
19595208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
19605208ed2cSNitesh Lal 		.test = alg_test_aead,
19615208ed2cSNitesh Lal 		.fips_allowed = 1,
19625208ed2cSNitesh Lal 		.suite = {
19635208ed2cSNitesh Lal 			.aead = {
19645208ed2cSNitesh Lal 				.enc = {
19655208ed2cSNitesh Lal 					.vecs =
19665208ed2cSNitesh Lal 					hmac_sha1_des3_ede_cbc_enc_tv_temp,
19675208ed2cSNitesh Lal 					.count =
19685208ed2cSNitesh Lal 					HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
1969e46e9a46SHoria Geanta 				}
1970e46e9a46SHoria Geanta 			}
1971e46e9a46SHoria Geanta 		}
1972e46e9a46SHoria Geanta 	}, {
1973bca4feb0SHoria Geanta 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
1974bca4feb0SHoria Geanta 		.test = alg_test_aead,
1975bca4feb0SHoria Geanta 		.fips_allowed = 1,
1976bca4feb0SHoria Geanta 		.suite = {
1977bca4feb0SHoria Geanta 			.aead = {
1978bca4feb0SHoria Geanta 				.enc = {
19795208ed2cSNitesh Lal 					.vecs =
19805208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_enc_tv_temp,
19815208ed2cSNitesh Lal 					.count =
19825208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
1983bca4feb0SHoria Geanta 				},
1984bca4feb0SHoria Geanta 				.dec = {
19855208ed2cSNitesh Lal 					.vecs =
19865208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_dec_tv_temp,
19875208ed2cSNitesh Lal 					.count =
19885208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
19895208ed2cSNitesh Lal 				}
19905208ed2cSNitesh Lal 			}
19915208ed2cSNitesh Lal 		}
19925208ed2cSNitesh Lal 	}, {
19935208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha224),cbc(des))",
19945208ed2cSNitesh Lal 		.test = alg_test_aead,
19955208ed2cSNitesh Lal 		.fips_allowed = 1,
19965208ed2cSNitesh Lal 		.suite = {
19975208ed2cSNitesh Lal 			.aead = {
19985208ed2cSNitesh Lal 				.enc = {
19995208ed2cSNitesh Lal 					.vecs =
20005208ed2cSNitesh Lal 					hmac_sha224_des_cbc_enc_tv_temp,
20015208ed2cSNitesh Lal 					.count =
20025208ed2cSNitesh Lal 					HMAC_SHA224_DES_CBC_ENC_TEST_VEC
20035208ed2cSNitesh Lal 				}
20045208ed2cSNitesh Lal 			}
20055208ed2cSNitesh Lal 		}
20065208ed2cSNitesh Lal 	}, {
20075208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
20085208ed2cSNitesh Lal 		.test = alg_test_aead,
20095208ed2cSNitesh Lal 		.fips_allowed = 1,
20105208ed2cSNitesh Lal 		.suite = {
20115208ed2cSNitesh Lal 			.aead = {
20125208ed2cSNitesh Lal 				.enc = {
20135208ed2cSNitesh Lal 					.vecs =
20145208ed2cSNitesh Lal 					hmac_sha224_des3_ede_cbc_enc_tv_temp,
20155208ed2cSNitesh Lal 					.count =
20165208ed2cSNitesh Lal 					HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
2017bca4feb0SHoria Geanta 				}
2018bca4feb0SHoria Geanta 			}
2019bca4feb0SHoria Geanta 		}
2020bca4feb0SHoria Geanta 	}, {
2021e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha256),cbc(aes))",
2022e46e9a46SHoria Geanta 		.test = alg_test_aead,
2023e46e9a46SHoria Geanta 		.fips_allowed = 1,
2024e46e9a46SHoria Geanta 		.suite = {
2025e46e9a46SHoria Geanta 			.aead = {
2026e46e9a46SHoria Geanta 				.enc = {
20275208ed2cSNitesh Lal 					.vecs =
20285208ed2cSNitesh Lal 					hmac_sha256_aes_cbc_enc_tv_temp,
20295208ed2cSNitesh Lal 					.count =
20305208ed2cSNitesh Lal 					HMAC_SHA256_AES_CBC_ENC_TEST_VEC
20315208ed2cSNitesh Lal 				}
20325208ed2cSNitesh Lal 			}
20335208ed2cSNitesh Lal 		}
20345208ed2cSNitesh Lal 	}, {
20355208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha256),cbc(des))",
20365208ed2cSNitesh Lal 		.test = alg_test_aead,
20375208ed2cSNitesh Lal 		.fips_allowed = 1,
20385208ed2cSNitesh Lal 		.suite = {
20395208ed2cSNitesh Lal 			.aead = {
20405208ed2cSNitesh Lal 				.enc = {
20415208ed2cSNitesh Lal 					.vecs =
20425208ed2cSNitesh Lal 					hmac_sha256_des_cbc_enc_tv_temp,
20435208ed2cSNitesh Lal 					.count =
20445208ed2cSNitesh Lal 					HMAC_SHA256_DES_CBC_ENC_TEST_VEC
20455208ed2cSNitesh Lal 				}
20465208ed2cSNitesh Lal 			}
20475208ed2cSNitesh Lal 		}
20485208ed2cSNitesh Lal 	}, {
20495208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
20505208ed2cSNitesh Lal 		.test = alg_test_aead,
20515208ed2cSNitesh Lal 		.fips_allowed = 1,
20525208ed2cSNitesh Lal 		.suite = {
20535208ed2cSNitesh Lal 			.aead = {
20545208ed2cSNitesh Lal 				.enc = {
20555208ed2cSNitesh Lal 					.vecs =
20565208ed2cSNitesh Lal 					hmac_sha256_des3_ede_cbc_enc_tv_temp,
20575208ed2cSNitesh Lal 					.count =
20585208ed2cSNitesh Lal 					HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
20595208ed2cSNitesh Lal 				}
20605208ed2cSNitesh Lal 			}
20615208ed2cSNitesh Lal 		}
20625208ed2cSNitesh Lal 	}, {
20635208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha384),cbc(des))",
20645208ed2cSNitesh Lal 		.test = alg_test_aead,
20655208ed2cSNitesh Lal 		.fips_allowed = 1,
20665208ed2cSNitesh Lal 		.suite = {
20675208ed2cSNitesh Lal 			.aead = {
20685208ed2cSNitesh Lal 				.enc = {
20695208ed2cSNitesh Lal 					.vecs =
20705208ed2cSNitesh Lal 					hmac_sha384_des_cbc_enc_tv_temp,
20715208ed2cSNitesh Lal 					.count =
20725208ed2cSNitesh Lal 					HMAC_SHA384_DES_CBC_ENC_TEST_VEC
20735208ed2cSNitesh Lal 				}
20745208ed2cSNitesh Lal 			}
20755208ed2cSNitesh Lal 		}
20765208ed2cSNitesh Lal 	}, {
20775208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
20785208ed2cSNitesh Lal 		.test = alg_test_aead,
20795208ed2cSNitesh Lal 		.fips_allowed = 1,
20805208ed2cSNitesh Lal 		.suite = {
20815208ed2cSNitesh Lal 			.aead = {
20825208ed2cSNitesh Lal 				.enc = {
20835208ed2cSNitesh Lal 					.vecs =
20845208ed2cSNitesh Lal 					hmac_sha384_des3_ede_cbc_enc_tv_temp,
20855208ed2cSNitesh Lal 					.count =
20865208ed2cSNitesh Lal 					HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC
2087e46e9a46SHoria Geanta 				}
2088e46e9a46SHoria Geanta 			}
2089e46e9a46SHoria Geanta 		}
2090e46e9a46SHoria Geanta 	}, {
2091e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha512),cbc(aes))",
2092e46e9a46SHoria Geanta 		.test = alg_test_aead,
2093e46e9a46SHoria Geanta 		.fips_allowed = 1,
2094e46e9a46SHoria Geanta 		.suite = {
2095e46e9a46SHoria Geanta 			.aead = {
2096e46e9a46SHoria Geanta 				.enc = {
20975208ed2cSNitesh Lal 					.vecs =
20985208ed2cSNitesh Lal 					hmac_sha512_aes_cbc_enc_tv_temp,
20995208ed2cSNitesh Lal 					.count =
21005208ed2cSNitesh Lal 					HMAC_SHA512_AES_CBC_ENC_TEST_VEC
21015208ed2cSNitesh Lal 				}
21025208ed2cSNitesh Lal 			}
21035208ed2cSNitesh Lal 		}
21045208ed2cSNitesh Lal 	}, {
21055208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha512),cbc(des))",
21065208ed2cSNitesh Lal 		.test = alg_test_aead,
21075208ed2cSNitesh Lal 		.fips_allowed = 1,
21085208ed2cSNitesh Lal 		.suite = {
21095208ed2cSNitesh Lal 			.aead = {
21105208ed2cSNitesh Lal 				.enc = {
21115208ed2cSNitesh Lal 					.vecs =
21125208ed2cSNitesh Lal 					hmac_sha512_des_cbc_enc_tv_temp,
21135208ed2cSNitesh Lal 					.count =
21145208ed2cSNitesh Lal 					HMAC_SHA512_DES_CBC_ENC_TEST_VEC
21155208ed2cSNitesh Lal 				}
21165208ed2cSNitesh Lal 			}
21175208ed2cSNitesh Lal 		}
21185208ed2cSNitesh Lal 	}, {
21195208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
21205208ed2cSNitesh Lal 		.test = alg_test_aead,
21215208ed2cSNitesh Lal 		.fips_allowed = 1,
21225208ed2cSNitesh Lal 		.suite = {
21235208ed2cSNitesh Lal 			.aead = {
21245208ed2cSNitesh Lal 				.enc = {
21255208ed2cSNitesh Lal 					.vecs =
21265208ed2cSNitesh Lal 					hmac_sha512_des3_ede_cbc_enc_tv_temp,
21275208ed2cSNitesh Lal 					.count =
21285208ed2cSNitesh Lal 					HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
2129e46e9a46SHoria Geanta 				}
2130e46e9a46SHoria Geanta 			}
2131e46e9a46SHoria Geanta 		}
2132e46e9a46SHoria Geanta 	}, {
2133da7f033dSHerbert Xu 		.alg = "cbc(aes)",
21341aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2135a1915d51SJarod Wilson 		.fips_allowed = 1,
2136da7f033dSHerbert Xu 		.suite = {
2137da7f033dSHerbert Xu 			.cipher = {
2138da7f033dSHerbert Xu 				.enc = {
2139da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
2140da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
2141da7f033dSHerbert Xu 				},
2142da7f033dSHerbert Xu 				.dec = {
2143da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
2144da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
2145da7f033dSHerbert Xu 				}
2146da7f033dSHerbert Xu 			}
2147da7f033dSHerbert Xu 		}
2148da7f033dSHerbert Xu 	}, {
2149da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
21501aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2151da7f033dSHerbert Xu 		.suite = {
2152da7f033dSHerbert Xu 			.cipher = {
2153da7f033dSHerbert Xu 				.enc = {
2154da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
2155da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
2156da7f033dSHerbert Xu 				},
2157da7f033dSHerbert Xu 				.dec = {
2158da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
2159da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
2160da7f033dSHerbert Xu 				}
2161da7f033dSHerbert Xu 			}
2162da7f033dSHerbert Xu 		}
2163da7f033dSHerbert Xu 	}, {
2164da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
21651aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2166da7f033dSHerbert Xu 		.suite = {
2167da7f033dSHerbert Xu 			.cipher = {
2168da7f033dSHerbert Xu 				.enc = {
2169da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
2170da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
2171da7f033dSHerbert Xu 				},
2172da7f033dSHerbert Xu 				.dec = {
2173da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
2174da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
2175da7f033dSHerbert Xu 				}
2176da7f033dSHerbert Xu 			}
2177da7f033dSHerbert Xu 		}
2178da7f033dSHerbert Xu 	}, {
2179da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
21801aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2181da7f033dSHerbert Xu 		.suite = {
2182da7f033dSHerbert Xu 			.cipher = {
2183da7f033dSHerbert Xu 				.enc = {
2184da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
2185da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
2186da7f033dSHerbert Xu 				},
2187da7f033dSHerbert Xu 				.dec = {
2188da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
2189da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
2190da7f033dSHerbert Xu 				}
2191da7f033dSHerbert Xu 			}
2192da7f033dSHerbert Xu 		}
2193da7f033dSHerbert Xu 	}, {
2194a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2195a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2196a2c58260SJohannes Goetzfried 		.suite = {
2197a2c58260SJohannes Goetzfried 			.cipher = {
2198a2c58260SJohannes Goetzfried 				.enc = {
2199a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
2200a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
2201a2c58260SJohannes Goetzfried 				},
2202a2c58260SJohannes Goetzfried 				.dec = {
2203a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
2204a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
2205a2c58260SJohannes Goetzfried 				}
2206a2c58260SJohannes Goetzfried 			}
2207a2c58260SJohannes Goetzfried 		}
2208a2c58260SJohannes Goetzfried 	}, {
22099b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
22109b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
22119b8b0405SJohannes Goetzfried 		.suite = {
22129b8b0405SJohannes Goetzfried 			.cipher = {
22139b8b0405SJohannes Goetzfried 				.enc = {
22149b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
22159b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
22169b8b0405SJohannes Goetzfried 				},
22179b8b0405SJohannes Goetzfried 				.dec = {
22189b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
22199b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
22209b8b0405SJohannes Goetzfried 				}
22219b8b0405SJohannes Goetzfried 			}
22229b8b0405SJohannes Goetzfried 		}
22239b8b0405SJohannes Goetzfried 	}, {
2224da7f033dSHerbert Xu 		.alg = "cbc(des)",
22251aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2226da7f033dSHerbert Xu 		.suite = {
2227da7f033dSHerbert Xu 			.cipher = {
2228da7f033dSHerbert Xu 				.enc = {
2229da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
2230da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
2231da7f033dSHerbert Xu 				},
2232da7f033dSHerbert Xu 				.dec = {
2233da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
2234da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
2235da7f033dSHerbert Xu 				}
2236da7f033dSHerbert Xu 			}
2237da7f033dSHerbert Xu 		}
2238da7f033dSHerbert Xu 	}, {
2239da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
22401aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2241a1915d51SJarod Wilson 		.fips_allowed = 1,
2242da7f033dSHerbert Xu 		.suite = {
2243da7f033dSHerbert Xu 			.cipher = {
2244da7f033dSHerbert Xu 				.enc = {
2245da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
2246da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
2247da7f033dSHerbert Xu 				},
2248da7f033dSHerbert Xu 				.dec = {
2249da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
2250da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
2251da7f033dSHerbert Xu 				}
2252da7f033dSHerbert Xu 			}
2253da7f033dSHerbert Xu 		}
2254da7f033dSHerbert Xu 	}, {
22559d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
22569d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
22579d25917dSJussi Kivilinna 		.suite = {
22589d25917dSJussi Kivilinna 			.cipher = {
22599d25917dSJussi Kivilinna 				.enc = {
22609d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
22619d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
22629d25917dSJussi Kivilinna 				},
22639d25917dSJussi Kivilinna 				.dec = {
22649d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
22659d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
22669d25917dSJussi Kivilinna 				}
22679d25917dSJussi Kivilinna 			}
22689d25917dSJussi Kivilinna 		}
22699d25917dSJussi Kivilinna 	}, {
2270da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
22711aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2272da7f033dSHerbert Xu 		.suite = {
2273da7f033dSHerbert Xu 			.cipher = {
2274da7f033dSHerbert Xu 				.enc = {
2275da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
2276da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
2277da7f033dSHerbert Xu 				},
2278da7f033dSHerbert Xu 				.dec = {
2279da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
2280da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
2281da7f033dSHerbert Xu 				}
2282da7f033dSHerbert Xu 			}
2283da7f033dSHerbert Xu 		}
2284da7f033dSHerbert Xu 	}, {
2285da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2286da7f033dSHerbert Xu 		.test = alg_test_aead,
2287a1915d51SJarod Wilson 		.fips_allowed = 1,
2288da7f033dSHerbert Xu 		.suite = {
2289da7f033dSHerbert Xu 			.aead = {
2290da7f033dSHerbert Xu 				.enc = {
2291da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
2292da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
2293da7f033dSHerbert Xu 				},
2294da7f033dSHerbert Xu 				.dec = {
2295da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
2296da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
2297da7f033dSHerbert Xu 				}
2298da7f033dSHerbert Xu 			}
2299da7f033dSHerbert Xu 		}
2300da7f033dSHerbert Xu 	}, {
230193b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
230293b5e86aSJussi Kivilinna 		.test = alg_test_hash,
230393b5e86aSJussi Kivilinna 		.suite = {
230493b5e86aSJussi Kivilinna 			.hash = {
230593b5e86aSJussi Kivilinna 				.vecs = aes_cmac128_tv_template,
230693b5e86aSJussi Kivilinna 				.count = CMAC_AES_TEST_VECTORS
230793b5e86aSJussi Kivilinna 			}
230893b5e86aSJussi Kivilinna 		}
230993b5e86aSJussi Kivilinna 	}, {
231093b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
231193b5e86aSJussi Kivilinna 		.test = alg_test_hash,
231293b5e86aSJussi Kivilinna 		.suite = {
231393b5e86aSJussi Kivilinna 			.hash = {
231493b5e86aSJussi Kivilinna 				.vecs = des3_ede_cmac64_tv_template,
231593b5e86aSJussi Kivilinna 				.count = CMAC_DES3_EDE_TEST_VECTORS
231693b5e86aSJussi Kivilinna 			}
231793b5e86aSJussi Kivilinna 		}
231893b5e86aSJussi Kivilinna 	}, {
2319e448370dSJussi Kivilinna 		.alg = "compress_null",
2320e448370dSJussi Kivilinna 		.test = alg_test_null,
2321e448370dSJussi Kivilinna 	}, {
2322da7f033dSHerbert Xu 		.alg = "crc32c",
23238e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2324a1915d51SJarod Wilson 		.fips_allowed = 1,
2325da7f033dSHerbert Xu 		.suite = {
2326da7f033dSHerbert Xu 			.hash = {
2327da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
2328da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
2329da7f033dSHerbert Xu 			}
2330da7f033dSHerbert Xu 		}
2331da7f033dSHerbert Xu 	}, {
233268411521SHerbert Xu 		.alg = "crct10dif",
233368411521SHerbert Xu 		.test = alg_test_hash,
233468411521SHerbert Xu 		.fips_allowed = 1,
233568411521SHerbert Xu 		.suite = {
233668411521SHerbert Xu 			.hash = {
233768411521SHerbert Xu 				.vecs = crct10dif_tv_template,
233868411521SHerbert Xu 				.count = CRCT10DIF_TEST_VECTORS
233968411521SHerbert Xu 			}
234068411521SHerbert Xu 		}
234168411521SHerbert Xu 	}, {
23426c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
23436c79294fSMilan Broz 		.test = alg_test_null,
23446c79294fSMilan Broz 		.fips_allowed = 1,
23456c79294fSMilan Broz 	}, {
2346d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni)",
2347d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2348d9b1d2e7SJussi Kivilinna 	}, {
2349f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2350f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2351f3f935a7SJussi Kivilinna 	}, {
235256d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-serpent-avx2)",
235356d76c96SJussi Kivilinna 		.test = alg_test_null,
235456d76c96SJussi Kivilinna 	}, {
2355863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
2356863b557aSYouquan, Song 		.test = alg_test_null,
23576c79294fSMilan Broz 		.fips_allowed = 1,
2358863b557aSYouquan, Song 	}, {
2359d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni)",
2360d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2361d9b1d2e7SJussi Kivilinna 	}, {
2362f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2363f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2364f3f935a7SJussi Kivilinna 	}, {
23654d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
23664d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
23674d6d6a2cSJohannes Goetzfried 	}, {
23684ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
23694ea1277dSJohannes Goetzfried 		.test = alg_test_null,
23704ea1277dSJohannes Goetzfried 	}, {
23717efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
23727efe4076SJohannes Goetzfried 		.test = alg_test_null,
23737efe4076SJohannes Goetzfried 	}, {
237456d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-avx2)",
237556d76c96SJussi Kivilinna 		.test = alg_test_null,
237656d76c96SJussi Kivilinna 	}, {
2377937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
2378937c30d7SJussi Kivilinna 		.test = alg_test_null,
2379937c30d7SJussi Kivilinna 	}, {
2380107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
2381107778b5SJohannes Goetzfried 		.test = alg_test_null,
2382107778b5SJohannes Goetzfried 	}, {
23836c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
23846c79294fSMilan Broz 		.test = alg_test_null,
23856c79294fSMilan Broz 		.fips_allowed = 1,
23866c79294fSMilan Broz 	}, {
2387863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2388863b557aSYouquan, Song 		.test = alg_test_null,
23896c79294fSMilan Broz 		.fips_allowed = 1,
2390863b557aSYouquan, Song 	}, {
2391f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2392f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2393a1915d51SJarod Wilson 		.fips_allowed = 1,
2394f7cb80f2SJarod Wilson 		.suite = {
2395f7cb80f2SJarod Wilson 			.cipher = {
2396f7cb80f2SJarod Wilson 				.enc = {
2397f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2398f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2399f7cb80f2SJarod Wilson 				},
2400f7cb80f2SJarod Wilson 				.dec = {
2401f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2402f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2403f7cb80f2SJarod Wilson 				}
2404f7cb80f2SJarod Wilson 			}
2405f7cb80f2SJarod Wilson 		}
2406f7cb80f2SJarod Wilson 	}, {
240785b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
240885b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
240985b63e34SJussi Kivilinna 		.suite = {
241085b63e34SJussi Kivilinna 			.cipher = {
241185b63e34SJussi Kivilinna 				.enc = {
241285b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
241385b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
241485b63e34SJussi Kivilinna 				},
241585b63e34SJussi Kivilinna 				.dec = {
241685b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
241785b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
241885b63e34SJussi Kivilinna 				}
241985b63e34SJussi Kivilinna 			}
242085b63e34SJussi Kivilinna 		}
242185b63e34SJussi Kivilinna 	}, {
24220840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
24230840605eSJussi Kivilinna 		.test = alg_test_skcipher,
24240840605eSJussi Kivilinna 		.suite = {
24250840605eSJussi Kivilinna 			.cipher = {
24260840605eSJussi Kivilinna 				.enc = {
24270840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
24280840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
24290840605eSJussi Kivilinna 				},
24300840605eSJussi Kivilinna 				.dec = {
24310840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
24320840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
24330840605eSJussi Kivilinna 				}
24340840605eSJussi Kivilinna 			}
24350840605eSJussi Kivilinna 		}
24360840605eSJussi Kivilinna 	}, {
2437a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2438a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2439a2c58260SJohannes Goetzfried 		.suite = {
2440a2c58260SJohannes Goetzfried 			.cipher = {
2441a2c58260SJohannes Goetzfried 				.enc = {
2442a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2443a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2444a2c58260SJohannes Goetzfried 				},
2445a2c58260SJohannes Goetzfried 				.dec = {
2446a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2447a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2448a2c58260SJohannes Goetzfried 				}
2449a2c58260SJohannes Goetzfried 			}
2450a2c58260SJohannes Goetzfried 		}
2451a2c58260SJohannes Goetzfried 	}, {
24529b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
24539b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
24549b8b0405SJohannes Goetzfried 		.suite = {
24559b8b0405SJohannes Goetzfried 			.cipher = {
24569b8b0405SJohannes Goetzfried 				.enc = {
24579b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
24589b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
24599b8b0405SJohannes Goetzfried 				},
24609b8b0405SJohannes Goetzfried 				.dec = {
24619b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
24629b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
24639b8b0405SJohannes Goetzfried 				}
24649b8b0405SJohannes Goetzfried 			}
24659b8b0405SJohannes Goetzfried 		}
24669b8b0405SJohannes Goetzfried 	}, {
24678163fc30SJussi Kivilinna 		.alg = "ctr(des)",
24688163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
24698163fc30SJussi Kivilinna 		.suite = {
24708163fc30SJussi Kivilinna 			.cipher = {
24718163fc30SJussi Kivilinna 				.enc = {
24728163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
24738163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
24748163fc30SJussi Kivilinna 				},
24758163fc30SJussi Kivilinna 				.dec = {
24768163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
24778163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
24788163fc30SJussi Kivilinna 				}
24798163fc30SJussi Kivilinna 			}
24808163fc30SJussi Kivilinna 		}
24818163fc30SJussi Kivilinna 	}, {
2482e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2483e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2484e080b17aSJussi Kivilinna 		.suite = {
2485e080b17aSJussi Kivilinna 			.cipher = {
2486e080b17aSJussi Kivilinna 				.enc = {
2487e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2488e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2489e080b17aSJussi Kivilinna 				},
2490e080b17aSJussi Kivilinna 				.dec = {
2491e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2492e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2493e080b17aSJussi Kivilinna 				}
2494e080b17aSJussi Kivilinna 			}
2495e080b17aSJussi Kivilinna 		}
2496e080b17aSJussi Kivilinna 	}, {
24979d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
24989d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
24999d25917dSJussi Kivilinna 		.suite = {
25009d25917dSJussi Kivilinna 			.cipher = {
25019d25917dSJussi Kivilinna 				.enc = {
25029d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
25039d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
25049d25917dSJussi Kivilinna 				},
25059d25917dSJussi Kivilinna 				.dec = {
25069d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
25079d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
25089d25917dSJussi Kivilinna 				}
25099d25917dSJussi Kivilinna 			}
25109d25917dSJussi Kivilinna 		}
25119d25917dSJussi Kivilinna 	}, {
2512573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2513573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2514573da620SJussi Kivilinna 		.suite = {
2515573da620SJussi Kivilinna 			.cipher = {
2516573da620SJussi Kivilinna 				.enc = {
2517573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2518573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2519573da620SJussi Kivilinna 				},
2520573da620SJussi Kivilinna 				.dec = {
2521573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2522573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2523573da620SJussi Kivilinna 				}
2524573da620SJussi Kivilinna 			}
2525573da620SJussi Kivilinna 		}
2526573da620SJussi Kivilinna 	}, {
2527da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
25281aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2529da7f033dSHerbert Xu 		.suite = {
2530da7f033dSHerbert Xu 			.cipher = {
2531da7f033dSHerbert Xu 				.enc = {
2532da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2533da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2534da7f033dSHerbert Xu 				},
2535da7f033dSHerbert Xu 				.dec = {
2536da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2537da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2538da7f033dSHerbert Xu 				}
2539da7f033dSHerbert Xu 			}
2540da7f033dSHerbert Xu 		}
2541da7f033dSHerbert Xu 	}, {
2542da7f033dSHerbert Xu 		.alg = "deflate",
2543da7f033dSHerbert Xu 		.test = alg_test_comp,
25440818904dSMilan Broz 		.fips_allowed = 1,
2545da7f033dSHerbert Xu 		.suite = {
2546da7f033dSHerbert Xu 			.comp = {
2547da7f033dSHerbert Xu 				.comp = {
2548da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2549da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2550da7f033dSHerbert Xu 				},
2551da7f033dSHerbert Xu 				.decomp = {
2552da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2553da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2554da7f033dSHerbert Xu 				}
2555da7f033dSHerbert Xu 			}
2556da7f033dSHerbert Xu 		}
2557da7f033dSHerbert Xu 	}, {
2558e448370dSJussi Kivilinna 		.alg = "digest_null",
2559e448370dSJussi Kivilinna 		.test = alg_test_null,
2560e448370dSJussi Kivilinna 	}, {
256164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes128",
256264d1cdfbSStephan Mueller 		.test = alg_test_drbg,
256364d1cdfbSStephan Mueller 		.fips_allowed = 1,
256464d1cdfbSStephan Mueller 		.suite = {
256564d1cdfbSStephan Mueller 			.drbg = {
256664d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes128_tv_template,
256764d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
256864d1cdfbSStephan Mueller 			}
256964d1cdfbSStephan Mueller 		}
257064d1cdfbSStephan Mueller 	}, {
257164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes192",
257264d1cdfbSStephan Mueller 		.test = alg_test_drbg,
257364d1cdfbSStephan Mueller 		.fips_allowed = 1,
257464d1cdfbSStephan Mueller 		.suite = {
257564d1cdfbSStephan Mueller 			.drbg = {
257664d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes192_tv_template,
257764d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
257864d1cdfbSStephan Mueller 			}
257964d1cdfbSStephan Mueller 		}
258064d1cdfbSStephan Mueller 	}, {
258164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes256",
258264d1cdfbSStephan Mueller 		.test = alg_test_drbg,
258364d1cdfbSStephan Mueller 		.fips_allowed = 1,
258464d1cdfbSStephan Mueller 		.suite = {
258564d1cdfbSStephan Mueller 			.drbg = {
258664d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes256_tv_template,
258764d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
258864d1cdfbSStephan Mueller 			}
258964d1cdfbSStephan Mueller 		}
259064d1cdfbSStephan Mueller 	}, {
259164d1cdfbSStephan Mueller 		/*
259264d1cdfbSStephan Mueller 		 * There is no need to specifically test the DRBG with every
259364d1cdfbSStephan Mueller 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
259464d1cdfbSStephan Mueller 		 */
259564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha1",
259664d1cdfbSStephan Mueller 		.fips_allowed = 1,
259764d1cdfbSStephan Mueller 		.test = alg_test_null,
259864d1cdfbSStephan Mueller 	}, {
259964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha256",
260064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
260164d1cdfbSStephan Mueller 		.fips_allowed = 1,
260264d1cdfbSStephan Mueller 		.suite = {
260364d1cdfbSStephan Mueller 			.drbg = {
260464d1cdfbSStephan Mueller 				.vecs = drbg_nopr_hmac_sha256_tv_template,
260564d1cdfbSStephan Mueller 				.count =
260664d1cdfbSStephan Mueller 				ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
260764d1cdfbSStephan Mueller 			}
260864d1cdfbSStephan Mueller 		}
260964d1cdfbSStephan Mueller 	}, {
261064d1cdfbSStephan Mueller 		/* covered by drbg_nopr_hmac_sha256 test */
261164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha384",
261264d1cdfbSStephan Mueller 		.fips_allowed = 1,
261364d1cdfbSStephan Mueller 		.test = alg_test_null,
261464d1cdfbSStephan Mueller 	}, {
261564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha512",
261664d1cdfbSStephan Mueller 		.test = alg_test_null,
261764d1cdfbSStephan Mueller 		.fips_allowed = 1,
261864d1cdfbSStephan Mueller 	}, {
261964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha1",
262064d1cdfbSStephan Mueller 		.fips_allowed = 1,
262164d1cdfbSStephan Mueller 		.test = alg_test_null,
262264d1cdfbSStephan Mueller 	}, {
262364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha256",
262464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
262564d1cdfbSStephan Mueller 		.fips_allowed = 1,
262664d1cdfbSStephan Mueller 		.suite = {
262764d1cdfbSStephan Mueller 			.drbg = {
262864d1cdfbSStephan Mueller 				.vecs = drbg_nopr_sha256_tv_template,
262964d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
263064d1cdfbSStephan Mueller 			}
263164d1cdfbSStephan Mueller 		}
263264d1cdfbSStephan Mueller 	}, {
263364d1cdfbSStephan Mueller 		/* covered by drbg_nopr_sha256 test */
263464d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha384",
263564d1cdfbSStephan Mueller 		.fips_allowed = 1,
263664d1cdfbSStephan Mueller 		.test = alg_test_null,
263764d1cdfbSStephan Mueller 	}, {
263864d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha512",
263964d1cdfbSStephan Mueller 		.fips_allowed = 1,
264064d1cdfbSStephan Mueller 		.test = alg_test_null,
264164d1cdfbSStephan Mueller 	}, {
264264d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes128",
264364d1cdfbSStephan Mueller 		.test = alg_test_drbg,
264464d1cdfbSStephan Mueller 		.fips_allowed = 1,
264564d1cdfbSStephan Mueller 		.suite = {
264664d1cdfbSStephan Mueller 			.drbg = {
264764d1cdfbSStephan Mueller 				.vecs = drbg_pr_ctr_aes128_tv_template,
264864d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
264964d1cdfbSStephan Mueller 			}
265064d1cdfbSStephan Mueller 		}
265164d1cdfbSStephan Mueller 	}, {
265264d1cdfbSStephan Mueller 		/* covered by drbg_pr_ctr_aes128 test */
265364d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes192",
265464d1cdfbSStephan Mueller 		.fips_allowed = 1,
265564d1cdfbSStephan Mueller 		.test = alg_test_null,
265664d1cdfbSStephan Mueller 	}, {
265764d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes256",
265864d1cdfbSStephan Mueller 		.fips_allowed = 1,
265964d1cdfbSStephan Mueller 		.test = alg_test_null,
266064d1cdfbSStephan Mueller 	}, {
266164d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha1",
266264d1cdfbSStephan Mueller 		.fips_allowed = 1,
266364d1cdfbSStephan Mueller 		.test = alg_test_null,
266464d1cdfbSStephan Mueller 	}, {
266564d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha256",
266664d1cdfbSStephan Mueller 		.test = alg_test_drbg,
266764d1cdfbSStephan Mueller 		.fips_allowed = 1,
266864d1cdfbSStephan Mueller 		.suite = {
266964d1cdfbSStephan Mueller 			.drbg = {
267064d1cdfbSStephan Mueller 				.vecs = drbg_pr_hmac_sha256_tv_template,
267164d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
267264d1cdfbSStephan Mueller 			}
267364d1cdfbSStephan Mueller 		}
267464d1cdfbSStephan Mueller 	}, {
267564d1cdfbSStephan Mueller 		/* covered by drbg_pr_hmac_sha256 test */
267664d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha384",
267764d1cdfbSStephan Mueller 		.fips_allowed = 1,
267864d1cdfbSStephan Mueller 		.test = alg_test_null,
267964d1cdfbSStephan Mueller 	}, {
268064d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha512",
268164d1cdfbSStephan Mueller 		.test = alg_test_null,
268264d1cdfbSStephan Mueller 		.fips_allowed = 1,
268364d1cdfbSStephan Mueller 	}, {
268464d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha1",
268564d1cdfbSStephan Mueller 		.fips_allowed = 1,
268664d1cdfbSStephan Mueller 		.test = alg_test_null,
268764d1cdfbSStephan Mueller 	}, {
268864d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha256",
268964d1cdfbSStephan Mueller 		.test = alg_test_drbg,
269064d1cdfbSStephan Mueller 		.fips_allowed = 1,
269164d1cdfbSStephan Mueller 		.suite = {
269264d1cdfbSStephan Mueller 			.drbg = {
269364d1cdfbSStephan Mueller 				.vecs = drbg_pr_sha256_tv_template,
269464d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
269564d1cdfbSStephan Mueller 			}
269664d1cdfbSStephan Mueller 		}
269764d1cdfbSStephan Mueller 	}, {
269864d1cdfbSStephan Mueller 		/* covered by drbg_pr_sha256 test */
269964d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha384",
270064d1cdfbSStephan Mueller 		.fips_allowed = 1,
270164d1cdfbSStephan Mueller 		.test = alg_test_null,
270264d1cdfbSStephan Mueller 	}, {
270364d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha512",
270464d1cdfbSStephan Mueller 		.fips_allowed = 1,
270564d1cdfbSStephan Mueller 		.test = alg_test_null,
270664d1cdfbSStephan Mueller 	}, {
2707863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2708863b557aSYouquan, Song 		.test = alg_test_null,
27096c79294fSMilan Broz 		.fips_allowed = 1,
2710863b557aSYouquan, Song 	}, {
2711da7f033dSHerbert Xu 		.alg = "ecb(aes)",
27121aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2713a1915d51SJarod Wilson 		.fips_allowed = 1,
2714da7f033dSHerbert Xu 		.suite = {
2715da7f033dSHerbert Xu 			.cipher = {
2716da7f033dSHerbert Xu 				.enc = {
2717da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2718da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2719da7f033dSHerbert Xu 				},
2720da7f033dSHerbert Xu 				.dec = {
2721da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2722da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2723da7f033dSHerbert Xu 				}
2724da7f033dSHerbert Xu 			}
2725da7f033dSHerbert Xu 		}
2726da7f033dSHerbert Xu 	}, {
2727da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
27281aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2729da7f033dSHerbert Xu 		.suite = {
2730da7f033dSHerbert Xu 			.cipher = {
2731da7f033dSHerbert Xu 				.enc = {
2732da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2733da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2734da7f033dSHerbert Xu 				},
2735da7f033dSHerbert Xu 				.dec = {
2736da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2737da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2738da7f033dSHerbert Xu 				}
2739da7f033dSHerbert Xu 			}
2740da7f033dSHerbert Xu 		}
2741da7f033dSHerbert Xu 	}, {
2742da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
27431aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2744da7f033dSHerbert Xu 		.suite = {
2745da7f033dSHerbert Xu 			.cipher = {
2746da7f033dSHerbert Xu 				.enc = {
2747da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2748da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2749da7f033dSHerbert Xu 				},
2750da7f033dSHerbert Xu 				.dec = {
2751da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2752da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2753da7f033dSHerbert Xu 				}
2754da7f033dSHerbert Xu 			}
2755da7f033dSHerbert Xu 		}
2756da7f033dSHerbert Xu 	}, {
2757da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
27581aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2759da7f033dSHerbert Xu 		.suite = {
2760da7f033dSHerbert Xu 			.cipher = {
2761da7f033dSHerbert Xu 				.enc = {
2762da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2763da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2764da7f033dSHerbert Xu 				},
2765da7f033dSHerbert Xu 				.dec = {
2766da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2767da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2768da7f033dSHerbert Xu 				}
2769da7f033dSHerbert Xu 			}
2770da7f033dSHerbert Xu 		}
2771da7f033dSHerbert Xu 	}, {
2772da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
27731aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2774da7f033dSHerbert Xu 		.suite = {
2775da7f033dSHerbert Xu 			.cipher = {
2776da7f033dSHerbert Xu 				.enc = {
2777da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2778da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2779da7f033dSHerbert Xu 				},
2780da7f033dSHerbert Xu 				.dec = {
2781da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2782da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2783da7f033dSHerbert Xu 				}
2784da7f033dSHerbert Xu 			}
2785da7f033dSHerbert Xu 		}
2786da7f033dSHerbert Xu 	}, {
2787da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
27881aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2789da7f033dSHerbert Xu 		.suite = {
2790da7f033dSHerbert Xu 			.cipher = {
2791da7f033dSHerbert Xu 				.enc = {
2792da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2793da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2794da7f033dSHerbert Xu 				},
2795da7f033dSHerbert Xu 				.dec = {
2796da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2797da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2798da7f033dSHerbert Xu 				}
2799da7f033dSHerbert Xu 			}
2800da7f033dSHerbert Xu 		}
2801da7f033dSHerbert Xu 	}, {
2802da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
28031aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2804da7f033dSHerbert Xu 		.suite = {
2805da7f033dSHerbert Xu 			.cipher = {
2806da7f033dSHerbert Xu 				.enc = {
2807da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2808da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
2809da7f033dSHerbert Xu 				},
2810da7f033dSHerbert Xu 				.dec = {
2811da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
2812da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
2813da7f033dSHerbert Xu 				}
2814da7f033dSHerbert Xu 			}
2815da7f033dSHerbert Xu 		}
2816da7f033dSHerbert Xu 	}, {
2817e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
2818e448370dSJussi Kivilinna 		.test = alg_test_null,
2819e448370dSJussi Kivilinna 	}, {
2820da7f033dSHerbert Xu 		.alg = "ecb(des)",
28211aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2822a1915d51SJarod Wilson 		.fips_allowed = 1,
2823da7f033dSHerbert Xu 		.suite = {
2824da7f033dSHerbert Xu 			.cipher = {
2825da7f033dSHerbert Xu 				.enc = {
2826da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
2827da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
2828da7f033dSHerbert Xu 				},
2829da7f033dSHerbert Xu 				.dec = {
2830da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
2831da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
2832da7f033dSHerbert Xu 				}
2833da7f033dSHerbert Xu 			}
2834da7f033dSHerbert Xu 		}
2835da7f033dSHerbert Xu 	}, {
2836da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
28371aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2838a1915d51SJarod Wilson 		.fips_allowed = 1,
2839da7f033dSHerbert Xu 		.suite = {
2840da7f033dSHerbert Xu 			.cipher = {
2841da7f033dSHerbert Xu 				.enc = {
2842da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
2843da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
2844da7f033dSHerbert Xu 				},
2845da7f033dSHerbert Xu 				.dec = {
2846da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
2847da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
2848da7f033dSHerbert Xu 				}
2849da7f033dSHerbert Xu 			}
2850da7f033dSHerbert Xu 		}
2851da7f033dSHerbert Xu 	}, {
285266e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
285366e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
285466e5bd00SJussi Kivilinna 		.suite = {
285566e5bd00SJussi Kivilinna 			.cipher = {
285666e5bd00SJussi Kivilinna 				.enc = {
285766e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
285866e5bd00SJussi Kivilinna 					.count = 1
285966e5bd00SJussi Kivilinna 				},
286066e5bd00SJussi Kivilinna 				.dec = {
286166e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
286266e5bd00SJussi Kivilinna 					.count = 1
286366e5bd00SJussi Kivilinna 				}
286466e5bd00SJussi Kivilinna 			}
286566e5bd00SJussi Kivilinna 		}
286666e5bd00SJussi Kivilinna 	}, {
2867da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
28681aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2869da7f033dSHerbert Xu 		.suite = {
2870da7f033dSHerbert Xu 			.cipher = {
2871da7f033dSHerbert Xu 				.enc = {
2872da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
2873da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
2874da7f033dSHerbert Xu 				},
2875da7f033dSHerbert Xu 				.dec = {
2876da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
2877da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
2878da7f033dSHerbert Xu 				}
2879da7f033dSHerbert Xu 			}
2880da7f033dSHerbert Xu 		}
2881da7f033dSHerbert Xu 	}, {
2882da7f033dSHerbert Xu 		.alg = "ecb(seed)",
28831aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2884da7f033dSHerbert Xu 		.suite = {
2885da7f033dSHerbert Xu 			.cipher = {
2886da7f033dSHerbert Xu 				.enc = {
2887da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
2888da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
2889da7f033dSHerbert Xu 				},
2890da7f033dSHerbert Xu 				.dec = {
2891da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
2892da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
2893da7f033dSHerbert Xu 				}
2894da7f033dSHerbert Xu 			}
2895da7f033dSHerbert Xu 		}
2896da7f033dSHerbert Xu 	}, {
2897da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
28981aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2899da7f033dSHerbert Xu 		.suite = {
2900da7f033dSHerbert Xu 			.cipher = {
2901da7f033dSHerbert Xu 				.enc = {
2902da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
2903da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
2904da7f033dSHerbert Xu 				},
2905da7f033dSHerbert Xu 				.dec = {
2906da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
2907da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
2908da7f033dSHerbert Xu 				}
2909da7f033dSHerbert Xu 			}
2910da7f033dSHerbert Xu 		}
2911da7f033dSHerbert Xu 	}, {
2912da7f033dSHerbert Xu 		.alg = "ecb(tea)",
29131aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2914da7f033dSHerbert Xu 		.suite = {
2915da7f033dSHerbert Xu 			.cipher = {
2916da7f033dSHerbert Xu 				.enc = {
2917da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
2918da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
2919da7f033dSHerbert Xu 				},
2920da7f033dSHerbert Xu 				.dec = {
2921da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
2922da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
2923da7f033dSHerbert Xu 				}
2924da7f033dSHerbert Xu 			}
2925da7f033dSHerbert Xu 		}
2926da7f033dSHerbert Xu 	}, {
2927da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
29281aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2929da7f033dSHerbert Xu 		.suite = {
2930da7f033dSHerbert Xu 			.cipher = {
2931da7f033dSHerbert Xu 				.enc = {
2932da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
2933da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
2934da7f033dSHerbert Xu 				},
2935da7f033dSHerbert Xu 				.dec = {
2936da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
2937da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
2938da7f033dSHerbert Xu 				}
2939da7f033dSHerbert Xu 			}
2940da7f033dSHerbert Xu 		}
2941da7f033dSHerbert Xu 	}, {
2942da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
29431aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2944da7f033dSHerbert Xu 		.suite = {
2945da7f033dSHerbert Xu 			.cipher = {
2946da7f033dSHerbert Xu 				.enc = {
2947da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
2948da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
2949da7f033dSHerbert Xu 				},
2950da7f033dSHerbert Xu 				.dec = {
2951da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
2952da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
2953da7f033dSHerbert Xu 				}
2954da7f033dSHerbert Xu 			}
2955da7f033dSHerbert Xu 		}
2956da7f033dSHerbert Xu 	}, {
2957da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
29581aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2959da7f033dSHerbert Xu 		.suite = {
2960da7f033dSHerbert Xu 			.cipher = {
2961da7f033dSHerbert Xu 				.enc = {
2962da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
2963da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
2964da7f033dSHerbert Xu 				},
2965da7f033dSHerbert Xu 				.dec = {
2966da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
2967da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
2968da7f033dSHerbert Xu 				}
2969da7f033dSHerbert Xu 			}
2970da7f033dSHerbert Xu 		}
2971da7f033dSHerbert Xu 	}, {
2972da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
29731aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2974da7f033dSHerbert Xu 		.suite = {
2975da7f033dSHerbert Xu 			.cipher = {
2976da7f033dSHerbert Xu 				.enc = {
2977da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
2978da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
2979da7f033dSHerbert Xu 				},
2980da7f033dSHerbert Xu 				.dec = {
2981da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
2982da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
2983da7f033dSHerbert Xu 				}
2984da7f033dSHerbert Xu 			}
2985da7f033dSHerbert Xu 		}
2986da7f033dSHerbert Xu 	}, {
2987da7f033dSHerbert Xu 		.alg = "gcm(aes)",
2988da7f033dSHerbert Xu 		.test = alg_test_aead,
2989a1915d51SJarod Wilson 		.fips_allowed = 1,
2990da7f033dSHerbert Xu 		.suite = {
2991da7f033dSHerbert Xu 			.aead = {
2992da7f033dSHerbert Xu 				.enc = {
2993da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
2994da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
2995da7f033dSHerbert Xu 				},
2996da7f033dSHerbert Xu 				.dec = {
2997da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
2998da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
2999da7f033dSHerbert Xu 				}
3000da7f033dSHerbert Xu 			}
3001da7f033dSHerbert Xu 		}
3002da7f033dSHerbert Xu 	}, {
3003507069c9SYouquan, Song 		.alg = "ghash",
3004507069c9SYouquan, Song 		.test = alg_test_hash,
300518c0ebd2SJarod Wilson 		.fips_allowed = 1,
3006507069c9SYouquan, Song 		.suite = {
3007507069c9SYouquan, Song 			.hash = {
3008507069c9SYouquan, Song 				.vecs = ghash_tv_template,
3009507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
3010507069c9SYouquan, Song 			}
3011507069c9SYouquan, Song 		}
3012507069c9SYouquan, Song 	}, {
3013a482b081SSonic Zhang 		.alg = "hmac(crc32)",
3014a482b081SSonic Zhang 		.test = alg_test_hash,
3015a482b081SSonic Zhang 		.suite = {
3016a482b081SSonic Zhang 			.hash = {
3017a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
3018a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
3019a482b081SSonic Zhang 			}
3020a482b081SSonic Zhang 		}
3021a482b081SSonic Zhang 	}, {
3022da7f033dSHerbert Xu 		.alg = "hmac(md5)",
3023da7f033dSHerbert Xu 		.test = alg_test_hash,
3024da7f033dSHerbert Xu 		.suite = {
3025da7f033dSHerbert Xu 			.hash = {
3026da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
3027da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
3028da7f033dSHerbert Xu 			}
3029da7f033dSHerbert Xu 		}
3030da7f033dSHerbert Xu 	}, {
3031da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
3032da7f033dSHerbert Xu 		.test = alg_test_hash,
3033da7f033dSHerbert Xu 		.suite = {
3034da7f033dSHerbert Xu 			.hash = {
3035da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
3036da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
3037da7f033dSHerbert Xu 			}
3038da7f033dSHerbert Xu 		}
3039da7f033dSHerbert Xu 	}, {
3040da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
3041da7f033dSHerbert Xu 		.test = alg_test_hash,
3042da7f033dSHerbert Xu 		.suite = {
3043da7f033dSHerbert Xu 			.hash = {
3044da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
3045da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
3046da7f033dSHerbert Xu 			}
3047da7f033dSHerbert Xu 		}
3048da7f033dSHerbert Xu 	}, {
3049da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
3050da7f033dSHerbert Xu 		.test = alg_test_hash,
3051a1915d51SJarod Wilson 		.fips_allowed = 1,
3052da7f033dSHerbert Xu 		.suite = {
3053da7f033dSHerbert Xu 			.hash = {
3054da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
3055da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
3056da7f033dSHerbert Xu 			}
3057da7f033dSHerbert Xu 		}
3058da7f033dSHerbert Xu 	}, {
3059da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
3060da7f033dSHerbert Xu 		.test = alg_test_hash,
3061a1915d51SJarod Wilson 		.fips_allowed = 1,
3062da7f033dSHerbert Xu 		.suite = {
3063da7f033dSHerbert Xu 			.hash = {
3064da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
3065da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
3066da7f033dSHerbert Xu 			}
3067da7f033dSHerbert Xu 		}
3068da7f033dSHerbert Xu 	}, {
3069da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
3070da7f033dSHerbert Xu 		.test = alg_test_hash,
3071a1915d51SJarod Wilson 		.fips_allowed = 1,
3072da7f033dSHerbert Xu 		.suite = {
3073da7f033dSHerbert Xu 			.hash = {
3074da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
3075da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
3076da7f033dSHerbert Xu 			}
3077da7f033dSHerbert Xu 		}
3078da7f033dSHerbert Xu 	}, {
3079da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
3080da7f033dSHerbert Xu 		.test = alg_test_hash,
3081a1915d51SJarod Wilson 		.fips_allowed = 1,
3082da7f033dSHerbert Xu 		.suite = {
3083da7f033dSHerbert Xu 			.hash = {
3084da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
3085da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
3086da7f033dSHerbert Xu 			}
3087da7f033dSHerbert Xu 		}
3088da7f033dSHerbert Xu 	}, {
3089da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
3090da7f033dSHerbert Xu 		.test = alg_test_hash,
3091a1915d51SJarod Wilson 		.fips_allowed = 1,
3092da7f033dSHerbert Xu 		.suite = {
3093da7f033dSHerbert Xu 			.hash = {
3094da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
3095da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
3096da7f033dSHerbert Xu 			}
3097da7f033dSHerbert Xu 		}
3098da7f033dSHerbert Xu 	}, {
3099da7f033dSHerbert Xu 		.alg = "lrw(aes)",
31001aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3101da7f033dSHerbert Xu 		.suite = {
3102da7f033dSHerbert Xu 			.cipher = {
3103da7f033dSHerbert Xu 				.enc = {
3104da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
3105da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
3106da7f033dSHerbert Xu 				},
3107da7f033dSHerbert Xu 				.dec = {
3108da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
3109da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
3110da7f033dSHerbert Xu 				}
3111da7f033dSHerbert Xu 			}
3112da7f033dSHerbert Xu 		}
3113da7f033dSHerbert Xu 	}, {
31140840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
31150840605eSJussi Kivilinna 		.test = alg_test_skcipher,
31160840605eSJussi Kivilinna 		.suite = {
31170840605eSJussi Kivilinna 			.cipher = {
31180840605eSJussi Kivilinna 				.enc = {
31190840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
31200840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
31210840605eSJussi Kivilinna 				},
31220840605eSJussi Kivilinna 				.dec = {
31230840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
31240840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
31250840605eSJussi Kivilinna 				}
31260840605eSJussi Kivilinna 			}
31270840605eSJussi Kivilinna 		}
31280840605eSJussi Kivilinna 	}, {
31299b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
31309b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
31319b8b0405SJohannes Goetzfried 		.suite = {
31329b8b0405SJohannes Goetzfried 			.cipher = {
31339b8b0405SJohannes Goetzfried 				.enc = {
31349b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
31359b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
31369b8b0405SJohannes Goetzfried 				},
31379b8b0405SJohannes Goetzfried 				.dec = {
31389b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
31399b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
31409b8b0405SJohannes Goetzfried 				}
31419b8b0405SJohannes Goetzfried 			}
31429b8b0405SJohannes Goetzfried 		}
31439b8b0405SJohannes Goetzfried 	}, {
3144d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
3145d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
3146d7bfc0faSJussi Kivilinna 		.suite = {
3147d7bfc0faSJussi Kivilinna 			.cipher = {
3148d7bfc0faSJussi Kivilinna 				.enc = {
3149d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
3150d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
3151d7bfc0faSJussi Kivilinna 				},
3152d7bfc0faSJussi Kivilinna 				.dec = {
3153d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
3154d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
3155d7bfc0faSJussi Kivilinna 				}
3156d7bfc0faSJussi Kivilinna 			}
3157d7bfc0faSJussi Kivilinna 		}
3158d7bfc0faSJussi Kivilinna 	}, {
31590b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
31600b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
31610b2a1551SJussi Kivilinna 		.suite = {
31620b2a1551SJussi Kivilinna 			.cipher = {
31630b2a1551SJussi Kivilinna 				.enc = {
31640b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
31650b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
31660b2a1551SJussi Kivilinna 				},
31670b2a1551SJussi Kivilinna 				.dec = {
31680b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
31690b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
31700b2a1551SJussi Kivilinna 				}
31710b2a1551SJussi Kivilinna 			}
31720b2a1551SJussi Kivilinna 		}
31730b2a1551SJussi Kivilinna 	}, {
31741443cc9bSKOVACS Krisztian 		.alg = "lz4",
31751443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
31761443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
31771443cc9bSKOVACS Krisztian 		.suite = {
31781443cc9bSKOVACS Krisztian 			.comp = {
31791443cc9bSKOVACS Krisztian 				.comp = {
31801443cc9bSKOVACS Krisztian 					.vecs = lz4_comp_tv_template,
31811443cc9bSKOVACS Krisztian 					.count = LZ4_COMP_TEST_VECTORS
31821443cc9bSKOVACS Krisztian 				},
31831443cc9bSKOVACS Krisztian 				.decomp = {
31841443cc9bSKOVACS Krisztian 					.vecs = lz4_decomp_tv_template,
31851443cc9bSKOVACS Krisztian 					.count = LZ4_DECOMP_TEST_VECTORS
31861443cc9bSKOVACS Krisztian 				}
31871443cc9bSKOVACS Krisztian 			}
31881443cc9bSKOVACS Krisztian 		}
31891443cc9bSKOVACS Krisztian 	}, {
31901443cc9bSKOVACS Krisztian 		.alg = "lz4hc",
31911443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
31921443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
31931443cc9bSKOVACS Krisztian 		.suite = {
31941443cc9bSKOVACS Krisztian 			.comp = {
31951443cc9bSKOVACS Krisztian 				.comp = {
31961443cc9bSKOVACS Krisztian 					.vecs = lz4hc_comp_tv_template,
31971443cc9bSKOVACS Krisztian 					.count = LZ4HC_COMP_TEST_VECTORS
31981443cc9bSKOVACS Krisztian 				},
31991443cc9bSKOVACS Krisztian 				.decomp = {
32001443cc9bSKOVACS Krisztian 					.vecs = lz4hc_decomp_tv_template,
32011443cc9bSKOVACS Krisztian 					.count = LZ4HC_DECOMP_TEST_VECTORS
32021443cc9bSKOVACS Krisztian 				}
32031443cc9bSKOVACS Krisztian 			}
32041443cc9bSKOVACS Krisztian 		}
32051443cc9bSKOVACS Krisztian 	}, {
3206da7f033dSHerbert Xu 		.alg = "lzo",
3207da7f033dSHerbert Xu 		.test = alg_test_comp,
32080818904dSMilan Broz 		.fips_allowed = 1,
3209da7f033dSHerbert Xu 		.suite = {
3210da7f033dSHerbert Xu 			.comp = {
3211da7f033dSHerbert Xu 				.comp = {
3212da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
3213da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
3214da7f033dSHerbert Xu 				},
3215da7f033dSHerbert Xu 				.decomp = {
3216da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
3217da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
3218da7f033dSHerbert Xu 				}
3219da7f033dSHerbert Xu 			}
3220da7f033dSHerbert Xu 		}
3221da7f033dSHerbert Xu 	}, {
3222da7f033dSHerbert Xu 		.alg = "md4",
3223da7f033dSHerbert Xu 		.test = alg_test_hash,
3224da7f033dSHerbert Xu 		.suite = {
3225da7f033dSHerbert Xu 			.hash = {
3226da7f033dSHerbert Xu 				.vecs = md4_tv_template,
3227da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
3228da7f033dSHerbert Xu 			}
3229da7f033dSHerbert Xu 		}
3230da7f033dSHerbert Xu 	}, {
3231da7f033dSHerbert Xu 		.alg = "md5",
3232da7f033dSHerbert Xu 		.test = alg_test_hash,
3233da7f033dSHerbert Xu 		.suite = {
3234da7f033dSHerbert Xu 			.hash = {
3235da7f033dSHerbert Xu 				.vecs = md5_tv_template,
3236da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
3237da7f033dSHerbert Xu 			}
3238da7f033dSHerbert Xu 		}
3239da7f033dSHerbert Xu 	}, {
3240da7f033dSHerbert Xu 		.alg = "michael_mic",
3241da7f033dSHerbert Xu 		.test = alg_test_hash,
3242da7f033dSHerbert Xu 		.suite = {
3243da7f033dSHerbert Xu 			.hash = {
3244da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
3245da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
3246da7f033dSHerbert Xu 			}
3247da7f033dSHerbert Xu 		}
3248da7f033dSHerbert Xu 	}, {
3249ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
3250ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
3251ba0e14acSPuneet Saxena 		.fips_allowed = 1,
3252ba0e14acSPuneet Saxena 		.suite = {
3253ba0e14acSPuneet Saxena 			.cipher = {
3254ba0e14acSPuneet Saxena 				.enc = {
3255ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
3256ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
3257ba0e14acSPuneet Saxena 				},
3258ba0e14acSPuneet Saxena 				.dec = {
3259ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
3260ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
3261ba0e14acSPuneet Saxena 				}
3262ba0e14acSPuneet Saxena 			}
3263ba0e14acSPuneet Saxena 		}
3264ba0e14acSPuneet Saxena 	}, {
3265da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
32661aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3267da7f033dSHerbert Xu 		.suite = {
3268da7f033dSHerbert Xu 			.cipher = {
3269da7f033dSHerbert Xu 				.enc = {
3270da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
3271da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
3272da7f033dSHerbert Xu 				},
3273da7f033dSHerbert Xu 				.dec = {
3274da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
3275da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
3276da7f033dSHerbert Xu 				}
3277da7f033dSHerbert Xu 			}
3278da7f033dSHerbert Xu 		}
3279da7f033dSHerbert Xu 	}, {
3280da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
32811aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3282a1915d51SJarod Wilson 		.fips_allowed = 1,
3283da7f033dSHerbert Xu 		.suite = {
3284da7f033dSHerbert Xu 			.cipher = {
3285da7f033dSHerbert Xu 				.enc = {
3286f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
3287f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
3288da7f033dSHerbert Xu 				},
3289da7f033dSHerbert Xu 				.dec = {
3290f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
3291f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
3292da7f033dSHerbert Xu 				}
3293da7f033dSHerbert Xu 			}
3294da7f033dSHerbert Xu 		}
3295da7f033dSHerbert Xu 	}, {
329669435b94SAdrian Hoban 		.alg = "rfc4106(gcm(aes))",
329769435b94SAdrian Hoban 		.test = alg_test_aead,
3298db71f29aSJarod Wilson 		.fips_allowed = 1,
329969435b94SAdrian Hoban 		.suite = {
330069435b94SAdrian Hoban 			.aead = {
330169435b94SAdrian Hoban 				.enc = {
330269435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
330369435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
330469435b94SAdrian Hoban 				},
330569435b94SAdrian Hoban 				.dec = {
330669435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
330769435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
330869435b94SAdrian Hoban 				}
330969435b94SAdrian Hoban 			}
331069435b94SAdrian Hoban 		}
331169435b94SAdrian Hoban 	}, {
33125d667322SJarod Wilson 		.alg = "rfc4309(ccm(aes))",
33135d667322SJarod Wilson 		.test = alg_test_aead,
3314a1915d51SJarod Wilson 		.fips_allowed = 1,
33155d667322SJarod Wilson 		.suite = {
33165d667322SJarod Wilson 			.aead = {
33175d667322SJarod Wilson 				.enc = {
33185d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
33195d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
33205d667322SJarod Wilson 				},
33215d667322SJarod Wilson 				.dec = {
33225d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
33235d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
33245d667322SJarod Wilson 				}
33255d667322SJarod Wilson 			}
33265d667322SJarod Wilson 		}
33275d667322SJarod Wilson 	}, {
3328e9b7441aSJussi Kivilinna 		.alg = "rfc4543(gcm(aes))",
3329e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
3330e9b7441aSJussi Kivilinna 		.suite = {
3331e9b7441aSJussi Kivilinna 			.aead = {
3332e9b7441aSJussi Kivilinna 				.enc = {
3333e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_enc_tv_template,
3334e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_ENC_TEST_VECTORS
3335e9b7441aSJussi Kivilinna 				},
3336e9b7441aSJussi Kivilinna 				.dec = {
3337e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_dec_tv_template,
3338e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_DEC_TEST_VECTORS
3339e9b7441aSJussi Kivilinna 				},
3340e9b7441aSJussi Kivilinna 			}
3341e9b7441aSJussi Kivilinna 		}
3342e9b7441aSJussi Kivilinna 	}, {
3343da7f033dSHerbert Xu 		.alg = "rmd128",
3344da7f033dSHerbert Xu 		.test = alg_test_hash,
3345da7f033dSHerbert Xu 		.suite = {
3346da7f033dSHerbert Xu 			.hash = {
3347da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
3348da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
3349da7f033dSHerbert Xu 			}
3350da7f033dSHerbert Xu 		}
3351da7f033dSHerbert Xu 	}, {
3352da7f033dSHerbert Xu 		.alg = "rmd160",
3353da7f033dSHerbert Xu 		.test = alg_test_hash,
3354da7f033dSHerbert Xu 		.suite = {
3355da7f033dSHerbert Xu 			.hash = {
3356da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
3357da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
3358da7f033dSHerbert Xu 			}
3359da7f033dSHerbert Xu 		}
3360da7f033dSHerbert Xu 	}, {
3361da7f033dSHerbert Xu 		.alg = "rmd256",
3362da7f033dSHerbert Xu 		.test = alg_test_hash,
3363da7f033dSHerbert Xu 		.suite = {
3364da7f033dSHerbert Xu 			.hash = {
3365da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
3366da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
3367da7f033dSHerbert Xu 			}
3368da7f033dSHerbert Xu 		}
3369da7f033dSHerbert Xu 	}, {
3370da7f033dSHerbert Xu 		.alg = "rmd320",
3371da7f033dSHerbert Xu 		.test = alg_test_hash,
3372da7f033dSHerbert Xu 		.suite = {
3373da7f033dSHerbert Xu 			.hash = {
3374da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
3375da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
3376da7f033dSHerbert Xu 			}
3377da7f033dSHerbert Xu 		}
3378da7f033dSHerbert Xu 	}, {
3379da7f033dSHerbert Xu 		.alg = "salsa20",
33801aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3381da7f033dSHerbert Xu 		.suite = {
3382da7f033dSHerbert Xu 			.cipher = {
3383da7f033dSHerbert Xu 				.enc = {
3384da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
3385da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
3386da7f033dSHerbert Xu 				}
3387da7f033dSHerbert Xu 			}
3388da7f033dSHerbert Xu 		}
3389da7f033dSHerbert Xu 	}, {
3390da7f033dSHerbert Xu 		.alg = "sha1",
3391da7f033dSHerbert Xu 		.test = alg_test_hash,
3392a1915d51SJarod Wilson 		.fips_allowed = 1,
3393da7f033dSHerbert Xu 		.suite = {
3394da7f033dSHerbert Xu 			.hash = {
3395da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
3396da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
3397da7f033dSHerbert Xu 			}
3398da7f033dSHerbert Xu 		}
3399da7f033dSHerbert Xu 	}, {
3400da7f033dSHerbert Xu 		.alg = "sha224",
3401da7f033dSHerbert Xu 		.test = alg_test_hash,
3402a1915d51SJarod Wilson 		.fips_allowed = 1,
3403da7f033dSHerbert Xu 		.suite = {
3404da7f033dSHerbert Xu 			.hash = {
3405da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
3406da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
3407da7f033dSHerbert Xu 			}
3408da7f033dSHerbert Xu 		}
3409da7f033dSHerbert Xu 	}, {
3410da7f033dSHerbert Xu 		.alg = "sha256",
3411da7f033dSHerbert Xu 		.test = alg_test_hash,
3412a1915d51SJarod Wilson 		.fips_allowed = 1,
3413da7f033dSHerbert Xu 		.suite = {
3414da7f033dSHerbert Xu 			.hash = {
3415da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
3416da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
3417da7f033dSHerbert Xu 			}
3418da7f033dSHerbert Xu 		}
3419da7f033dSHerbert Xu 	}, {
3420da7f033dSHerbert Xu 		.alg = "sha384",
3421da7f033dSHerbert Xu 		.test = alg_test_hash,
3422a1915d51SJarod Wilson 		.fips_allowed = 1,
3423da7f033dSHerbert Xu 		.suite = {
3424da7f033dSHerbert Xu 			.hash = {
3425da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
3426da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
3427da7f033dSHerbert Xu 			}
3428da7f033dSHerbert Xu 		}
3429da7f033dSHerbert Xu 	}, {
3430da7f033dSHerbert Xu 		.alg = "sha512",
3431da7f033dSHerbert Xu 		.test = alg_test_hash,
3432a1915d51SJarod Wilson 		.fips_allowed = 1,
3433da7f033dSHerbert Xu 		.suite = {
3434da7f033dSHerbert Xu 			.hash = {
3435da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
3436da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
3437da7f033dSHerbert Xu 			}
3438da7f033dSHerbert Xu 		}
3439da7f033dSHerbert Xu 	}, {
3440da7f033dSHerbert Xu 		.alg = "tgr128",
3441da7f033dSHerbert Xu 		.test = alg_test_hash,
3442da7f033dSHerbert Xu 		.suite = {
3443da7f033dSHerbert Xu 			.hash = {
3444da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
3445da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
3446da7f033dSHerbert Xu 			}
3447da7f033dSHerbert Xu 		}
3448da7f033dSHerbert Xu 	}, {
3449da7f033dSHerbert Xu 		.alg = "tgr160",
3450da7f033dSHerbert Xu 		.test = alg_test_hash,
3451da7f033dSHerbert Xu 		.suite = {
3452da7f033dSHerbert Xu 			.hash = {
3453da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
3454da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
3455da7f033dSHerbert Xu 			}
3456da7f033dSHerbert Xu 		}
3457da7f033dSHerbert Xu 	}, {
3458da7f033dSHerbert Xu 		.alg = "tgr192",
3459da7f033dSHerbert Xu 		.test = alg_test_hash,
3460da7f033dSHerbert Xu 		.suite = {
3461da7f033dSHerbert Xu 			.hash = {
3462da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
3463da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
3464da7f033dSHerbert Xu 			}
3465da7f033dSHerbert Xu 		}
3466da7f033dSHerbert Xu 	}, {
3467f1939f7cSShane Wang 		.alg = "vmac(aes)",
3468f1939f7cSShane Wang 		.test = alg_test_hash,
3469f1939f7cSShane Wang 		.suite = {
3470f1939f7cSShane Wang 			.hash = {
3471f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
3472f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
3473f1939f7cSShane Wang 			}
3474f1939f7cSShane Wang 		}
3475f1939f7cSShane Wang 	}, {
3476da7f033dSHerbert Xu 		.alg = "wp256",
3477da7f033dSHerbert Xu 		.test = alg_test_hash,
3478da7f033dSHerbert Xu 		.suite = {
3479da7f033dSHerbert Xu 			.hash = {
3480da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
3481da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
3482da7f033dSHerbert Xu 			}
3483da7f033dSHerbert Xu 		}
3484da7f033dSHerbert Xu 	}, {
3485da7f033dSHerbert Xu 		.alg = "wp384",
3486da7f033dSHerbert Xu 		.test = alg_test_hash,
3487da7f033dSHerbert Xu 		.suite = {
3488da7f033dSHerbert Xu 			.hash = {
3489da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
3490da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
3491da7f033dSHerbert Xu 			}
3492da7f033dSHerbert Xu 		}
3493da7f033dSHerbert Xu 	}, {
3494da7f033dSHerbert Xu 		.alg = "wp512",
3495da7f033dSHerbert Xu 		.test = alg_test_hash,
3496da7f033dSHerbert Xu 		.suite = {
3497da7f033dSHerbert Xu 			.hash = {
3498da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
3499da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
3500da7f033dSHerbert Xu 			}
3501da7f033dSHerbert Xu 		}
3502da7f033dSHerbert Xu 	}, {
3503da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3504da7f033dSHerbert Xu 		.test = alg_test_hash,
3505da7f033dSHerbert Xu 		.suite = {
3506da7f033dSHerbert Xu 			.hash = {
3507da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
3508da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
3509da7f033dSHerbert Xu 			}
3510da7f033dSHerbert Xu 		}
3511da7f033dSHerbert Xu 	}, {
3512da7f033dSHerbert Xu 		.alg = "xts(aes)",
35131aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
35142918aa8dSJarod Wilson 		.fips_allowed = 1,
3515da7f033dSHerbert Xu 		.suite = {
3516da7f033dSHerbert Xu 			.cipher = {
3517da7f033dSHerbert Xu 				.enc = {
3518da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
3519da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
3520da7f033dSHerbert Xu 				},
3521da7f033dSHerbert Xu 				.dec = {
3522da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
3523da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
3524da7f033dSHerbert Xu 				}
3525da7f033dSHerbert Xu 			}
3526da7f033dSHerbert Xu 		}
35270c01aed5SGeert Uytterhoeven 	}, {
35280840605eSJussi Kivilinna 		.alg = "xts(camellia)",
35290840605eSJussi Kivilinna 		.test = alg_test_skcipher,
35300840605eSJussi Kivilinna 		.suite = {
35310840605eSJussi Kivilinna 			.cipher = {
35320840605eSJussi Kivilinna 				.enc = {
35330840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
35340840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
35350840605eSJussi Kivilinna 				},
35360840605eSJussi Kivilinna 				.dec = {
35370840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
35380840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
35390840605eSJussi Kivilinna 				}
35400840605eSJussi Kivilinna 			}
35410840605eSJussi Kivilinna 		}
35420840605eSJussi Kivilinna 	}, {
35439b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
35449b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
35459b8b0405SJohannes Goetzfried 		.suite = {
35469b8b0405SJohannes Goetzfried 			.cipher = {
35479b8b0405SJohannes Goetzfried 				.enc = {
35489b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
35499b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
35509b8b0405SJohannes Goetzfried 				},
35519b8b0405SJohannes Goetzfried 				.dec = {
35529b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
35539b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
35549b8b0405SJohannes Goetzfried 				}
35559b8b0405SJohannes Goetzfried 			}
35569b8b0405SJohannes Goetzfried 		}
35579b8b0405SJohannes Goetzfried 	}, {
355818be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
355918be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
356018be20b9SJussi Kivilinna 		.suite = {
356118be20b9SJussi Kivilinna 			.cipher = {
356218be20b9SJussi Kivilinna 				.enc = {
356318be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
356418be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
356518be20b9SJussi Kivilinna 				},
356618be20b9SJussi Kivilinna 				.dec = {
356718be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
356818be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
356918be20b9SJussi Kivilinna 				}
357018be20b9SJussi Kivilinna 			}
357118be20b9SJussi Kivilinna 		}
357218be20b9SJussi Kivilinna 	}, {
3573aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3574aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3575aed265b9SJussi Kivilinna 		.suite = {
3576aed265b9SJussi Kivilinna 			.cipher = {
3577aed265b9SJussi Kivilinna 				.enc = {
3578aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
3579aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
3580aed265b9SJussi Kivilinna 				},
3581aed265b9SJussi Kivilinna 				.dec = {
3582aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
3583aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
3584aed265b9SJussi Kivilinna 				}
3585aed265b9SJussi Kivilinna 			}
3586aed265b9SJussi Kivilinna 		}
3587aed265b9SJussi Kivilinna 	}, {
35880c01aed5SGeert Uytterhoeven 		.alg = "zlib",
35890c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
35900818904dSMilan Broz 		.fips_allowed = 1,
35910c01aed5SGeert Uytterhoeven 		.suite = {
35920c01aed5SGeert Uytterhoeven 			.pcomp = {
35930c01aed5SGeert Uytterhoeven 				.comp = {
35940c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
35950c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
35960c01aed5SGeert Uytterhoeven 				},
35970c01aed5SGeert Uytterhoeven 				.decomp = {
35980c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
35990c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
36000c01aed5SGeert Uytterhoeven 				}
36010c01aed5SGeert Uytterhoeven 			}
36020c01aed5SGeert Uytterhoeven 		}
3603da7f033dSHerbert Xu 	}
3604da7f033dSHerbert Xu };
3605da7f033dSHerbert Xu 
36065714758bSJussi Kivilinna static bool alg_test_descs_checked;
36075714758bSJussi Kivilinna 
36085714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
36095714758bSJussi Kivilinna {
36105714758bSJussi Kivilinna 	int i;
36115714758bSJussi Kivilinna 
36125714758bSJussi Kivilinna 	/* only check once */
36135714758bSJussi Kivilinna 	if (alg_test_descs_checked)
36145714758bSJussi Kivilinna 		return;
36155714758bSJussi Kivilinna 
36165714758bSJussi Kivilinna 	alg_test_descs_checked = true;
36175714758bSJussi Kivilinna 
36185714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
36195714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
36205714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
36215714758bSJussi Kivilinna 
36225714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
36235714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
36245714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
36255714758bSJussi Kivilinna 				alg_test_descs[i].alg);
36265714758bSJussi Kivilinna 		}
36275714758bSJussi Kivilinna 
36285714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
36295714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
36305714758bSJussi Kivilinna 				alg_test_descs[i].alg);
36315714758bSJussi Kivilinna 		}
36325714758bSJussi Kivilinna 	}
36335714758bSJussi Kivilinna }
36345714758bSJussi Kivilinna 
36351aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3636da7f033dSHerbert Xu {
3637da7f033dSHerbert Xu 	int start = 0;
3638da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3639da7f033dSHerbert Xu 
3640da7f033dSHerbert Xu 	while (start < end) {
3641da7f033dSHerbert Xu 		int i = (start + end) / 2;
3642da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3643da7f033dSHerbert Xu 
3644da7f033dSHerbert Xu 		if (diff > 0) {
3645da7f033dSHerbert Xu 			end = i;
3646da7f033dSHerbert Xu 			continue;
3647da7f033dSHerbert Xu 		}
3648da7f033dSHerbert Xu 
3649da7f033dSHerbert Xu 		if (diff < 0) {
3650da7f033dSHerbert Xu 			start = i + 1;
3651da7f033dSHerbert Xu 			continue;
3652da7f033dSHerbert Xu 		}
3653da7f033dSHerbert Xu 
36541aa4ecd9SHerbert Xu 		return i;
3655da7f033dSHerbert Xu 	}
3656da7f033dSHerbert Xu 
36571aa4ecd9SHerbert Xu 	return -1;
36581aa4ecd9SHerbert Xu }
36591aa4ecd9SHerbert Xu 
36601aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
36611aa4ecd9SHerbert Xu {
36621aa4ecd9SHerbert Xu 	int i;
3663a68f6610SHerbert Xu 	int j;
3664d12d6b6dSNeil Horman 	int rc;
36651aa4ecd9SHerbert Xu 
36665714758bSJussi Kivilinna 	alg_test_descs_check_order();
36675714758bSJussi Kivilinna 
36681aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
36691aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
36701aa4ecd9SHerbert Xu 
36711aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
36721aa4ecd9SHerbert Xu 		    sizeof(nalg))
36731aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
36741aa4ecd9SHerbert Xu 
36751aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
36761aa4ecd9SHerbert Xu 		if (i < 0)
36771aa4ecd9SHerbert Xu 			goto notest;
36781aa4ecd9SHerbert Xu 
3679a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3680a3bef3a3SJarod Wilson 			goto non_fips_alg;
3681a3bef3a3SJarod Wilson 
3682941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3683941fb328SJarod Wilson 		goto test_done;
36841aa4ecd9SHerbert Xu 	}
36851aa4ecd9SHerbert Xu 
36861aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3687a68f6610SHerbert Xu 	j = alg_find_test(driver);
3688a68f6610SHerbert Xu 	if (i < 0 && j < 0)
36891aa4ecd9SHerbert Xu 		goto notest;
36901aa4ecd9SHerbert Xu 
3691a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3692a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3693a3bef3a3SJarod Wilson 		goto non_fips_alg;
3694a3bef3a3SJarod Wilson 
3695a68f6610SHerbert Xu 	rc = 0;
3696a68f6610SHerbert Xu 	if (i >= 0)
3697a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
36981aa4ecd9SHerbert Xu 					     type, mask);
3699032c8cacSCristian Stoica 	if (j >= 0 && j != i)
3700a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3701a68f6610SHerbert Xu 					     type, mask);
3702a68f6610SHerbert Xu 
3703941fb328SJarod Wilson test_done:
3704d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3705d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3706d12d6b6dSNeil Horman 
370729ecd4abSJarod Wilson 	if (fips_enabled && !rc)
37083e8cffd4SMasanari Iida 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
370929ecd4abSJarod Wilson 
3710d12d6b6dSNeil Horman 	return rc;
37111aa4ecd9SHerbert Xu 
37121aa4ecd9SHerbert Xu notest:
3713da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3714da7f033dSHerbert Xu 	return 0;
3715a3bef3a3SJarod Wilson non_fips_alg:
3716a3bef3a3SJarod Wilson 	return -EINVAL;
3717da7f033dSHerbert Xu }
37180b767f96SAlexander Shishkin 
3719326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
37200b767f96SAlexander Shishkin 
3721da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3722