xref: /openbmc/linux/crypto/testmgr.c (revision 29b77e5d)
1da7f033dSHerbert Xu /*
2da7f033dSHerbert Xu  * Algorithm testing framework and tests.
3da7f033dSHerbert Xu  *
4da7f033dSHerbert Xu  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5da7f033dSHerbert Xu  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6da7f033dSHerbert Xu  * Copyright (c) 2007 Nokia Siemens Networks
7da7f033dSHerbert Xu  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8da7f033dSHerbert Xu  *
969435b94SAdrian Hoban  * Updated RFC4106 AES-GCM testing.
1069435b94SAdrian Hoban  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
1169435b94SAdrian Hoban  *             Adrian Hoban <adrian.hoban@intel.com>
1269435b94SAdrian Hoban  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
1369435b94SAdrian Hoban  *             Tadeusz Struk (tadeusz.struk@intel.com)
1469435b94SAdrian Hoban  *    Copyright (c) 2010, Intel Corporation.
1569435b94SAdrian Hoban  *
16da7f033dSHerbert Xu  * This program is free software; you can redistribute it and/or modify it
17da7f033dSHerbert Xu  * under the terms of the GNU General Public License as published by the Free
18da7f033dSHerbert Xu  * Software Foundation; either version 2 of the License, or (at your option)
19da7f033dSHerbert Xu  * any later version.
20da7f033dSHerbert Xu  *
21da7f033dSHerbert Xu  */
22da7f033dSHerbert Xu 
23da7f033dSHerbert Xu #include <crypto/hash.h>
24da7f033dSHerbert Xu #include <linux/err.h>
25da7f033dSHerbert Xu #include <linux/module.h>
26da7f033dSHerbert Xu #include <linux/scatterlist.h>
27da7f033dSHerbert Xu #include <linux/slab.h>
28da7f033dSHerbert Xu #include <linux/string.h>
297647d6ceSJarod Wilson #include <crypto/rng.h>
3064d1cdfbSStephan Mueller #include <crypto/drbg.h>
31da7f033dSHerbert Xu 
32da7f033dSHerbert Xu #include "internal.h"
330b767f96SAlexander Shishkin 
34326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
350b767f96SAlexander Shishkin 
360b767f96SAlexander Shishkin /* a perfect nop */
370b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
380b767f96SAlexander Shishkin {
390b767f96SAlexander Shishkin 	return 0;
400b767f96SAlexander Shishkin }
410b767f96SAlexander Shishkin 
420b767f96SAlexander Shishkin #else
430b767f96SAlexander Shishkin 
44da7f033dSHerbert Xu #include "testmgr.h"
45da7f033dSHerbert Xu 
46da7f033dSHerbert Xu /*
47da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
48da7f033dSHerbert Xu  */
49da7f033dSHerbert Xu #define XBUFSIZE	8
50da7f033dSHerbert Xu 
51da7f033dSHerbert Xu /*
52da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
53da7f033dSHerbert Xu  */
54da7f033dSHerbert Xu #define IDX1		32
55da7f033dSHerbert Xu #define IDX2		32400
56da7f033dSHerbert Xu #define IDX3		1
57da7f033dSHerbert Xu #define IDX4		8193
58da7f033dSHerbert Xu #define IDX5		22222
59da7f033dSHerbert Xu #define IDX6		17101
60da7f033dSHerbert Xu #define IDX7		27333
61da7f033dSHerbert Xu #define IDX8		3000
62da7f033dSHerbert Xu 
63da7f033dSHerbert Xu /*
64da7f033dSHerbert Xu * Used by test_cipher()
65da7f033dSHerbert Xu */
66da7f033dSHerbert Xu #define ENCRYPT 1
67da7f033dSHerbert Xu #define DECRYPT 0
68da7f033dSHerbert Xu 
69da7f033dSHerbert Xu struct tcrypt_result {
70da7f033dSHerbert Xu 	struct completion completion;
71da7f033dSHerbert Xu 	int err;
72da7f033dSHerbert Xu };
73da7f033dSHerbert Xu 
74da7f033dSHerbert Xu struct aead_test_suite {
75da7f033dSHerbert Xu 	struct {
76da7f033dSHerbert Xu 		struct aead_testvec *vecs;
77da7f033dSHerbert Xu 		unsigned int count;
78da7f033dSHerbert Xu 	} enc, dec;
79da7f033dSHerbert Xu };
80da7f033dSHerbert Xu 
81da7f033dSHerbert Xu struct cipher_test_suite {
82da7f033dSHerbert Xu 	struct {
83da7f033dSHerbert Xu 		struct cipher_testvec *vecs;
84da7f033dSHerbert Xu 		unsigned int count;
85da7f033dSHerbert Xu 	} enc, dec;
86da7f033dSHerbert Xu };
87da7f033dSHerbert Xu 
88da7f033dSHerbert Xu struct comp_test_suite {
89da7f033dSHerbert Xu 	struct {
90da7f033dSHerbert Xu 		struct comp_testvec *vecs;
91da7f033dSHerbert Xu 		unsigned int count;
92da7f033dSHerbert Xu 	} comp, decomp;
93da7f033dSHerbert Xu };
94da7f033dSHerbert Xu 
958064efb8SGeert Uytterhoeven struct pcomp_test_suite {
968064efb8SGeert Uytterhoeven 	struct {
978064efb8SGeert Uytterhoeven 		struct pcomp_testvec *vecs;
988064efb8SGeert Uytterhoeven 		unsigned int count;
998064efb8SGeert Uytterhoeven 	} comp, decomp;
1008064efb8SGeert Uytterhoeven };
1018064efb8SGeert Uytterhoeven 
102da7f033dSHerbert Xu struct hash_test_suite {
103da7f033dSHerbert Xu 	struct hash_testvec *vecs;
104da7f033dSHerbert Xu 	unsigned int count;
105da7f033dSHerbert Xu };
106da7f033dSHerbert Xu 
1077647d6ceSJarod Wilson struct cprng_test_suite {
1087647d6ceSJarod Wilson 	struct cprng_testvec *vecs;
1097647d6ceSJarod Wilson 	unsigned int count;
1107647d6ceSJarod Wilson };
1117647d6ceSJarod Wilson 
11264d1cdfbSStephan Mueller struct drbg_test_suite {
11364d1cdfbSStephan Mueller 	struct drbg_testvec *vecs;
11464d1cdfbSStephan Mueller 	unsigned int count;
11564d1cdfbSStephan Mueller };
11664d1cdfbSStephan Mueller 
117da7f033dSHerbert Xu struct alg_test_desc {
118da7f033dSHerbert Xu 	const char *alg;
119da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
120da7f033dSHerbert Xu 		    u32 type, u32 mask);
121a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
122da7f033dSHerbert Xu 
123da7f033dSHerbert Xu 	union {
124da7f033dSHerbert Xu 		struct aead_test_suite aead;
125da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
126da7f033dSHerbert Xu 		struct comp_test_suite comp;
1278064efb8SGeert Uytterhoeven 		struct pcomp_test_suite pcomp;
128da7f033dSHerbert Xu 		struct hash_test_suite hash;
1297647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
13064d1cdfbSStephan Mueller 		struct drbg_test_suite drbg;
131da7f033dSHerbert Xu 	} suite;
132da7f033dSHerbert Xu };
133da7f033dSHerbert Xu 
134da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
135da7f033dSHerbert Xu 
136da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
137da7f033dSHerbert Xu {
138da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
139da7f033dSHerbert Xu 			16, 1,
140da7f033dSHerbert Xu 			buf, len, false);
141da7f033dSHerbert Xu }
142da7f033dSHerbert Xu 
143da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
144da7f033dSHerbert Xu {
145da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
146da7f033dSHerbert Xu 
147da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
148da7f033dSHerbert Xu 		return;
149da7f033dSHerbert Xu 
150da7f033dSHerbert Xu 	res->err = err;
151da7f033dSHerbert Xu 	complete(&res->completion);
152da7f033dSHerbert Xu }
153da7f033dSHerbert Xu 
154f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
155f8b0d4d0SHerbert Xu {
156f8b0d4d0SHerbert Xu 	int i;
157f8b0d4d0SHerbert Xu 
158f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
159f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
160f8b0d4d0SHerbert Xu 		if (!buf[i])
161f8b0d4d0SHerbert Xu 			goto err_free_buf;
162f8b0d4d0SHerbert Xu 	}
163f8b0d4d0SHerbert Xu 
164f8b0d4d0SHerbert Xu 	return 0;
165f8b0d4d0SHerbert Xu 
166f8b0d4d0SHerbert Xu err_free_buf:
167f8b0d4d0SHerbert Xu 	while (i-- > 0)
168f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
169f8b0d4d0SHerbert Xu 
170f8b0d4d0SHerbert Xu 	return -ENOMEM;
171f8b0d4d0SHerbert Xu }
172f8b0d4d0SHerbert Xu 
173f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
174f8b0d4d0SHerbert Xu {
175f8b0d4d0SHerbert Xu 	int i;
176f8b0d4d0SHerbert Xu 
177f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
178f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
179f8b0d4d0SHerbert Xu }
180f8b0d4d0SHerbert Xu 
181a8f1a052SDavid S. Miller static int do_one_async_hash_op(struct ahash_request *req,
182a8f1a052SDavid S. Miller 				struct tcrypt_result *tr,
183a8f1a052SDavid S. Miller 				int ret)
184a8f1a052SDavid S. Miller {
185a8f1a052SDavid S. Miller 	if (ret == -EINPROGRESS || ret == -EBUSY) {
186a8f1a052SDavid S. Miller 		ret = wait_for_completion_interruptible(&tr->completion);
187a8f1a052SDavid S. Miller 		if (!ret)
188a8f1a052SDavid S. Miller 			ret = tr->err;
18916735d02SWolfram Sang 		reinit_completion(&tr->completion);
190a8f1a052SDavid S. Miller 	}
191a8f1a052SDavid S. Miller 	return ret;
192a8f1a052SDavid S. Miller }
193a8f1a052SDavid S. Miller 
194da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
195da5ffe11SJussi Kivilinna 		       unsigned int tcount, bool use_digest,
196da5ffe11SJussi Kivilinna 		       const int align_offset)
197da7f033dSHerbert Xu {
198da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
199da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
200da7f033dSHerbert Xu 	struct scatterlist sg[8];
20129b77e5dSHoria Geanta 	char *result;
20229b77e5dSHoria Geanta 	char *key;
203da7f033dSHerbert Xu 	struct ahash_request *req;
204da7f033dSHerbert Xu 	struct tcrypt_result tresult;
205da7f033dSHerbert Xu 	void *hash_buff;
206f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
207f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
208f8b0d4d0SHerbert Xu 
20929b77e5dSHoria Geanta 	result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
21029b77e5dSHoria Geanta 	if (!result)
21129b77e5dSHoria Geanta 		return ret;
21229b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
21329b77e5dSHoria Geanta 	if (!key)
21429b77e5dSHoria Geanta 		goto out_nobuf;
215f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
216f8b0d4d0SHerbert Xu 		goto out_nobuf;
217da7f033dSHerbert Xu 
218da7f033dSHerbert Xu 	init_completion(&tresult.completion);
219da7f033dSHerbert Xu 
220da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
221da7f033dSHerbert Xu 	if (!req) {
222da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
223da7f033dSHerbert Xu 		       "%s\n", algo);
224da7f033dSHerbert Xu 		goto out_noreq;
225da7f033dSHerbert Xu 	}
226da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
227da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
228da7f033dSHerbert Xu 
229a0cfae59SHerbert Xu 	j = 0;
230da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
231a0cfae59SHerbert Xu 		if (template[i].np)
232a0cfae59SHerbert Xu 			continue;
233a0cfae59SHerbert Xu 
234da5ffe11SJussi Kivilinna 		ret = -EINVAL;
235da5ffe11SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
236da5ffe11SJussi Kivilinna 			goto out;
237da5ffe11SJussi Kivilinna 
238a0cfae59SHerbert Xu 		j++;
23929b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
240da7f033dSHerbert Xu 
241da7f033dSHerbert Xu 		hash_buff = xbuf[0];
242da5ffe11SJussi Kivilinna 		hash_buff += align_offset;
243da7f033dSHerbert Xu 
244da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
245da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
246da7f033dSHerbert Xu 
247da7f033dSHerbert Xu 		if (template[i].ksize) {
248da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
24929b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
25029b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
25129b77e5dSHoria Geanta 				       j, algo, template[i].ksize, MAX_KEYLEN);
25229b77e5dSHoria Geanta 				ret = -EINVAL;
25329b77e5dSHoria Geanta 				goto out;
25429b77e5dSHoria Geanta 			}
25529b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
25629b77e5dSHoria Geanta 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
257da7f033dSHerbert Xu 			if (ret) {
258da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
259a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
260da7f033dSHerbert Xu 				       -ret);
261da7f033dSHerbert Xu 				goto out;
262da7f033dSHerbert Xu 			}
263da7f033dSHerbert Xu 		}
264da7f033dSHerbert Xu 
265da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
266a8f1a052SDavid S. Miller 		if (use_digest) {
267a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
268a8f1a052SDavid S. Miller 						   crypto_ahash_digest(req));
269a8f1a052SDavid S. Miller 			if (ret) {
270a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
271a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
272da7f033dSHerbert Xu 				goto out;
273da7f033dSHerbert Xu 			}
274a8f1a052SDavid S. Miller 		} else {
275a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
276a8f1a052SDavid S. Miller 						   crypto_ahash_init(req));
277a8f1a052SDavid S. Miller 			if (ret) {
278a8f1a052SDavid S. Miller 				pr_err("alt: hash: init failed on test %d "
279a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
280a8f1a052SDavid S. Miller 				goto out;
281a8f1a052SDavid S. Miller 			}
282a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
283a8f1a052SDavid S. Miller 						   crypto_ahash_update(req));
284a8f1a052SDavid S. Miller 			if (ret) {
285a8f1a052SDavid S. Miller 				pr_err("alt: hash: update failed on test %d "
286a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
287a8f1a052SDavid S. Miller 				goto out;
288a8f1a052SDavid S. Miller 			}
289a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
290a8f1a052SDavid S. Miller 						   crypto_ahash_final(req));
291a8f1a052SDavid S. Miller 			if (ret) {
292a8f1a052SDavid S. Miller 				pr_err("alt: hash: final failed on test %d "
293a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
294a8f1a052SDavid S. Miller 				goto out;
295a8f1a052SDavid S. Miller 			}
296a8f1a052SDavid S. Miller 		}
297da7f033dSHerbert Xu 
298da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
299da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
300da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
301a0cfae59SHerbert Xu 			       j, algo);
302da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
303da7f033dSHerbert Xu 			ret = -EINVAL;
304da7f033dSHerbert Xu 			goto out;
305da7f033dSHerbert Xu 		}
306da7f033dSHerbert Xu 	}
307da7f033dSHerbert Xu 
308da7f033dSHerbert Xu 	j = 0;
309da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
310da5ffe11SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
311da5ffe11SJussi Kivilinna 		if (align_offset != 0)
312da5ffe11SJussi Kivilinna 			break;
313da5ffe11SJussi Kivilinna 
314da7f033dSHerbert Xu 		if (template[i].np) {
315da7f033dSHerbert Xu 			j++;
31629b77e5dSHoria Geanta 			memset(result, 0, MAX_DIGEST_SIZE);
317da7f033dSHerbert Xu 
318da7f033dSHerbert Xu 			temp = 0;
319da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
320fd57f22aSHerbert Xu 			ret = -EINVAL;
321da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
322fd57f22aSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
323fd57f22aSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
324fd57f22aSHerbert Xu 					goto out;
325da7f033dSHerbert Xu 				sg_set_buf(&sg[k],
326da7f033dSHerbert Xu 					   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
327da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
328da7f033dSHerbert Xu 						  template[i].plaintext + temp,
329da7f033dSHerbert Xu 						  template[i].tap[k]),
330da7f033dSHerbert Xu 					   template[i].tap[k]);
331da7f033dSHerbert Xu 				temp += template[i].tap[k];
332da7f033dSHerbert Xu 			}
333da7f033dSHerbert Xu 
334da7f033dSHerbert Xu 			if (template[i].ksize) {
33529b77e5dSHoria Geanta 				if (template[i].ksize > MAX_KEYLEN) {
33629b77e5dSHoria Geanta 					pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
33729b77e5dSHoria Geanta 					       j, algo, template[i].ksize,
33829b77e5dSHoria Geanta 					       MAX_KEYLEN);
33929b77e5dSHoria Geanta 					ret = -EINVAL;
34029b77e5dSHoria Geanta 					goto out;
34129b77e5dSHoria Geanta 				}
342da7f033dSHerbert Xu 				crypto_ahash_clear_flags(tfm, ~0);
34329b77e5dSHoria Geanta 				memcpy(key, template[i].key, template[i].ksize);
34429b77e5dSHoria Geanta 				ret = crypto_ahash_setkey(tfm, key,
345da7f033dSHerbert Xu 							  template[i].ksize);
346da7f033dSHerbert Xu 
347da7f033dSHerbert Xu 				if (ret) {
348da7f033dSHerbert Xu 					printk(KERN_ERR "alg: hash: setkey "
349da7f033dSHerbert Xu 					       "failed on chunking test %d "
350da7f033dSHerbert Xu 					       "for %s: ret=%d\n", j, algo,
351da7f033dSHerbert Xu 					       -ret);
352da7f033dSHerbert Xu 					goto out;
353da7f033dSHerbert Xu 				}
354da7f033dSHerbert Xu 			}
355da7f033dSHerbert Xu 
356da7f033dSHerbert Xu 			ahash_request_set_crypt(req, sg, result,
357da7f033dSHerbert Xu 						template[i].psize);
358da7f033dSHerbert Xu 			ret = crypto_ahash_digest(req);
359da7f033dSHerbert Xu 			switch (ret) {
360da7f033dSHerbert Xu 			case 0:
361da7f033dSHerbert Xu 				break;
362da7f033dSHerbert Xu 			case -EINPROGRESS:
363da7f033dSHerbert Xu 			case -EBUSY:
364da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
365da7f033dSHerbert Xu 					&tresult.completion);
366da7f033dSHerbert Xu 				if (!ret && !(ret = tresult.err)) {
36716735d02SWolfram Sang 					reinit_completion(&tresult.completion);
368da7f033dSHerbert Xu 					break;
369da7f033dSHerbert Xu 				}
370da7f033dSHerbert Xu 				/* fall through */
371da7f033dSHerbert Xu 			default:
372da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: digest failed "
373da7f033dSHerbert Xu 				       "on chunking test %d for %s: "
374da7f033dSHerbert Xu 				       "ret=%d\n", j, algo, -ret);
375da7f033dSHerbert Xu 				goto out;
376da7f033dSHerbert Xu 			}
377da7f033dSHerbert Xu 
378da7f033dSHerbert Xu 			if (memcmp(result, template[i].digest,
379da7f033dSHerbert Xu 				   crypto_ahash_digestsize(tfm))) {
380da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: Chunking test %d "
381da7f033dSHerbert Xu 				       "failed for %s\n", j, algo);
382da7f033dSHerbert Xu 				hexdump(result, crypto_ahash_digestsize(tfm));
383da7f033dSHerbert Xu 				ret = -EINVAL;
384da7f033dSHerbert Xu 				goto out;
385da7f033dSHerbert Xu 			}
386da7f033dSHerbert Xu 		}
387da7f033dSHerbert Xu 	}
388da7f033dSHerbert Xu 
389da7f033dSHerbert Xu 	ret = 0;
390da7f033dSHerbert Xu 
391da7f033dSHerbert Xu out:
392da7f033dSHerbert Xu 	ahash_request_free(req);
393da7f033dSHerbert Xu out_noreq:
394f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
395f8b0d4d0SHerbert Xu out_nobuf:
39629b77e5dSHoria Geanta 	kfree(key);
39729b77e5dSHoria Geanta 	kfree(result);
398da7f033dSHerbert Xu 	return ret;
399da7f033dSHerbert Xu }
400da7f033dSHerbert Xu 
401da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
402da5ffe11SJussi Kivilinna 		     unsigned int tcount, bool use_digest)
403da5ffe11SJussi Kivilinna {
404da5ffe11SJussi Kivilinna 	unsigned int alignmask;
405da5ffe11SJussi Kivilinna 	int ret;
406da5ffe11SJussi Kivilinna 
407da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
408da5ffe11SJussi Kivilinna 	if (ret)
409da5ffe11SJussi Kivilinna 		return ret;
410da5ffe11SJussi Kivilinna 
411da5ffe11SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
412da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
413da5ffe11SJussi Kivilinna 	if (ret)
414da5ffe11SJussi Kivilinna 		return ret;
415da5ffe11SJussi Kivilinna 
416da5ffe11SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
417da5ffe11SJussi Kivilinna 	if (alignmask) {
418da5ffe11SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
419da5ffe11SJussi Kivilinna 		ret = __test_hash(tfm, template, tcount, use_digest,
420da5ffe11SJussi Kivilinna 				  alignmask + 1);
421da5ffe11SJussi Kivilinna 		if (ret)
422da5ffe11SJussi Kivilinna 			return ret;
423da5ffe11SJussi Kivilinna 	}
424da5ffe11SJussi Kivilinna 
425da5ffe11SJussi Kivilinna 	return 0;
426da5ffe11SJussi Kivilinna }
427da5ffe11SJussi Kivilinna 
428d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
429d8a32ac2SJussi Kivilinna 		       struct aead_testvec *template, unsigned int tcount,
43058dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
431da7f033dSHerbert Xu {
432da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
433da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
434f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
435da7f033dSHerbert Xu 	char *q;
436da7f033dSHerbert Xu 	char *key;
437da7f033dSHerbert Xu 	struct aead_request *req;
438d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
439d8a32ac2SJussi Kivilinna 	struct scatterlist *asg;
440d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
441d8a32ac2SJussi Kivilinna 	const char *e, *d;
442da7f033dSHerbert Xu 	struct tcrypt_result result;
443da7f033dSHerbert Xu 	unsigned int authsize;
444da7f033dSHerbert Xu 	void *input;
445d8a32ac2SJussi Kivilinna 	void *output;
446da7f033dSHerbert Xu 	void *assoc;
4479bac019dSTadeusz Struk 	char *iv;
448f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
449d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
450f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
451f8b0d4d0SHerbert Xu 
4529bac019dSTadeusz Struk 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
4539bac019dSTadeusz Struk 	if (!iv)
4549bac019dSTadeusz Struk 		return ret;
45529b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
45629b77e5dSHoria Geanta 	if (!key)
45729b77e5dSHoria Geanta 		goto out_noxbuf;
458f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
459f8b0d4d0SHerbert Xu 		goto out_noxbuf;
460f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
461f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
462d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
463d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
464d8a32ac2SJussi Kivilinna 
465d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
466d8a32ac2SJussi Kivilinna 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 3 : 2), GFP_KERNEL);
467d8a32ac2SJussi Kivilinna 	if (!sg)
468d8a32ac2SJussi Kivilinna 		goto out_nosg;
469d8a32ac2SJussi Kivilinna 	asg = &sg[8];
470d8a32ac2SJussi Kivilinna 	sgout = &asg[8];
471d8a32ac2SJussi Kivilinna 
472d8a32ac2SJussi Kivilinna 	if (diff_dst)
473d8a32ac2SJussi Kivilinna 		d = "-ddst";
474d8a32ac2SJussi Kivilinna 	else
475d8a32ac2SJussi Kivilinna 		d = "";
476d8a32ac2SJussi Kivilinna 
477da7f033dSHerbert Xu 	if (enc == ENCRYPT)
478da7f033dSHerbert Xu 		e = "encryption";
479da7f033dSHerbert Xu 	else
480da7f033dSHerbert Xu 		e = "decryption";
481da7f033dSHerbert Xu 
482da7f033dSHerbert Xu 	init_completion(&result.completion);
483da7f033dSHerbert Xu 
484da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
485da7f033dSHerbert Xu 	if (!req) {
486d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
487d8a32ac2SJussi Kivilinna 		       d, algo);
488da7f033dSHerbert Xu 		goto out;
489da7f033dSHerbert Xu 	}
490da7f033dSHerbert Xu 
491da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
492da7f033dSHerbert Xu 				  tcrypt_complete, &result);
493da7f033dSHerbert Xu 
494da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
495da7f033dSHerbert Xu 		if (!template[i].np) {
496da7f033dSHerbert Xu 			j++;
497da7f033dSHerbert Xu 
49858dcf548SJussi Kivilinna 			/* some templates have no input data but they will
499da7f033dSHerbert Xu 			 * touch input
500da7f033dSHerbert Xu 			 */
501da7f033dSHerbert Xu 			input = xbuf[0];
50258dcf548SJussi Kivilinna 			input += align_offset;
503da7f033dSHerbert Xu 			assoc = axbuf[0];
504da7f033dSHerbert Xu 
505fd57f22aSHerbert Xu 			ret = -EINVAL;
50658dcf548SJussi Kivilinna 			if (WARN_ON(align_offset + template[i].ilen >
50758dcf548SJussi Kivilinna 				    PAGE_SIZE || template[i].alen > PAGE_SIZE))
508fd57f22aSHerbert Xu 				goto out;
509fd57f22aSHerbert Xu 
510da7f033dSHerbert Xu 			memcpy(input, template[i].input, template[i].ilen);
511da7f033dSHerbert Xu 			memcpy(assoc, template[i].assoc, template[i].alen);
512da7f033dSHerbert Xu 			if (template[i].iv)
513da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
514da7f033dSHerbert Xu 			else
515da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
516da7f033dSHerbert Xu 
517da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
518da7f033dSHerbert Xu 			if (template[i].wk)
519da7f033dSHerbert Xu 				crypto_aead_set_flags(
520da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
521da7f033dSHerbert Xu 
52229b77e5dSHoria Geanta 			if (template[i].klen > MAX_KEYLEN) {
52329b77e5dSHoria Geanta 				pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
52429b77e5dSHoria Geanta 				       d, j, algo, template[i].klen,
52529b77e5dSHoria Geanta 				       MAX_KEYLEN);
52629b77e5dSHoria Geanta 				ret = -EINVAL;
52729b77e5dSHoria Geanta 				goto out;
52829b77e5dSHoria Geanta 			}
52929b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].klen);
530da7f033dSHerbert Xu 
531da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key,
532da7f033dSHerbert Xu 						 template[i].klen);
533da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
534d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
535d8a32ac2SJussi Kivilinna 				       d, j, algo, crypto_aead_get_flags(tfm));
536da7f033dSHerbert Xu 				goto out;
537da7f033dSHerbert Xu 			} else if (ret)
538da7f033dSHerbert Xu 				continue;
539da7f033dSHerbert Xu 
540da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
541da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
542da7f033dSHerbert Xu 			if (ret) {
543d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
544d8a32ac2SJussi Kivilinna 				       d, authsize, j, algo);
545da7f033dSHerbert Xu 				goto out;
546da7f033dSHerbert Xu 			}
547da7f033dSHerbert Xu 
548d8a32ac2SJussi Kivilinna 			if (diff_dst) {
549d8a32ac2SJussi Kivilinna 				output = xoutbuf[0];
55058dcf548SJussi Kivilinna 				output += align_offset;
5518ec25c51SHoria Geanta 				sg_init_one(&sg[0], input, template[i].ilen);
552d8a32ac2SJussi Kivilinna 				sg_init_one(&sgout[0], output,
5538ec25c51SHoria Geanta 					    template[i].rlen);
5548ec25c51SHoria Geanta 			} else {
5558ec25c51SHoria Geanta 				sg_init_one(&sg[0], input,
556d8a32ac2SJussi Kivilinna 					    template[i].ilen +
557d8a32ac2SJussi Kivilinna 						(enc ? authsize : 0));
558d8a32ac2SJussi Kivilinna 				output = input;
559d8a32ac2SJussi Kivilinna 			}
560d8a32ac2SJussi Kivilinna 
561da7f033dSHerbert Xu 			sg_init_one(&asg[0], assoc, template[i].alen);
562da7f033dSHerbert Xu 
563d8a32ac2SJussi Kivilinna 			aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
564da7f033dSHerbert Xu 					       template[i].ilen, iv);
565da7f033dSHerbert Xu 
566da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
567da7f033dSHerbert Xu 
568da7f033dSHerbert Xu 			ret = enc ?
569da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
570da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
571da7f033dSHerbert Xu 
572da7f033dSHerbert Xu 			switch (ret) {
573da7f033dSHerbert Xu 			case 0:
574e44a1b44SJarod Wilson 				if (template[i].novrfy) {
575e44a1b44SJarod Wilson 					/* verification was supposed to fail */
576d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
577d8a32ac2SJussi Kivilinna 					       d, e, j, algo);
578e44a1b44SJarod Wilson 					/* so really, we got a bad message */
579e44a1b44SJarod Wilson 					ret = -EBADMSG;
580e44a1b44SJarod Wilson 					goto out;
581e44a1b44SJarod Wilson 				}
582da7f033dSHerbert Xu 				break;
583da7f033dSHerbert Xu 			case -EINPROGRESS:
584da7f033dSHerbert Xu 			case -EBUSY:
585da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
586da7f033dSHerbert Xu 					&result.completion);
587da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
58816735d02SWolfram Sang 					reinit_completion(&result.completion);
589da7f033dSHerbert Xu 					break;
590da7f033dSHerbert Xu 				}
591e44a1b44SJarod Wilson 			case -EBADMSG:
592e44a1b44SJarod Wilson 				if (template[i].novrfy)
593e44a1b44SJarod Wilson 					/* verification failure was expected */
594e44a1b44SJarod Wilson 					continue;
595da7f033dSHerbert Xu 				/* fall through */
596da7f033dSHerbert Xu 			default:
597d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
598d8a32ac2SJussi Kivilinna 				       d, e, j, algo, -ret);
599da7f033dSHerbert Xu 				goto out;
600da7f033dSHerbert Xu 			}
601da7f033dSHerbert Xu 
602d8a32ac2SJussi Kivilinna 			q = output;
603da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
604d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Test %d failed on %s for %s\n",
605d8a32ac2SJussi Kivilinna 				       d, j, e, algo);
606da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
607da7f033dSHerbert Xu 				ret = -EINVAL;
608da7f033dSHerbert Xu 				goto out;
609da7f033dSHerbert Xu 			}
610da7f033dSHerbert Xu 		}
611da7f033dSHerbert Xu 	}
612da7f033dSHerbert Xu 
613da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
61458dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
61558dcf548SJussi Kivilinna 		if (align_offset != 0)
61658dcf548SJussi Kivilinna 			break;
61758dcf548SJussi Kivilinna 
618da7f033dSHerbert Xu 		if (template[i].np) {
619da7f033dSHerbert Xu 			j++;
620da7f033dSHerbert Xu 
621da7f033dSHerbert Xu 			if (template[i].iv)
622da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
623da7f033dSHerbert Xu 			else
624da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
625da7f033dSHerbert Xu 
626da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
627da7f033dSHerbert Xu 			if (template[i].wk)
628da7f033dSHerbert Xu 				crypto_aead_set_flags(
629da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
63029b77e5dSHoria Geanta 			if (template[i].klen > MAX_KEYLEN) {
63129b77e5dSHoria Geanta 				pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
63229b77e5dSHoria Geanta 				       d, j, algo, template[i].klen,
63329b77e5dSHoria Geanta 				       MAX_KEYLEN);
63429b77e5dSHoria Geanta 				ret = -EINVAL;
63529b77e5dSHoria Geanta 				goto out;
63629b77e5dSHoria Geanta 			}
63729b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].klen);
638da7f033dSHerbert Xu 
639da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key, template[i].klen);
640da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
641d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
642d8a32ac2SJussi Kivilinna 				       d, j, algo, crypto_aead_get_flags(tfm));
643da7f033dSHerbert Xu 				goto out;
644da7f033dSHerbert Xu 			} else if (ret)
645da7f033dSHerbert Xu 				continue;
646da7f033dSHerbert Xu 
647da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
648da7f033dSHerbert Xu 
649da7f033dSHerbert Xu 			ret = -EINVAL;
650da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
651d8a32ac2SJussi Kivilinna 			if (diff_dst)
652d8a32ac2SJussi Kivilinna 				sg_init_table(sgout, template[i].np);
653da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
654da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
655da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
656da7f033dSHerbert Xu 					goto out;
657da7f033dSHerbert Xu 
658da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
659da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
660da7f033dSHerbert Xu 
661da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
662da7f033dSHerbert Xu 				       template[i].tap[k]);
663da7f033dSHerbert Xu 
664da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
665d8a32ac2SJussi Kivilinna 
666d8a32ac2SJussi Kivilinna 				if (diff_dst) {
667d8a32ac2SJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
668d8a32ac2SJussi Kivilinna 					    offset_in_page(IDX[k]);
669d8a32ac2SJussi Kivilinna 
670d8a32ac2SJussi Kivilinna 					memset(q, 0, template[i].tap[k]);
671d8a32ac2SJussi Kivilinna 
672d8a32ac2SJussi Kivilinna 					sg_set_buf(&sgout[k], q,
673d8a32ac2SJussi Kivilinna 						   template[i].tap[k]);
674d8a32ac2SJussi Kivilinna 				}
675d8a32ac2SJussi Kivilinna 
6768ec25c51SHoria Geanta 				n = template[i].tap[k];
6778ec25c51SHoria Geanta 				if (k == template[i].np - 1 && enc)
6788ec25c51SHoria Geanta 					n += authsize;
6798ec25c51SHoria Geanta 				if (offset_in_page(q) + n < PAGE_SIZE)
6808ec25c51SHoria Geanta 					q[n] = 0;
6818ec25c51SHoria Geanta 
682da7f033dSHerbert Xu 				temp += template[i].tap[k];
683da7f033dSHerbert Xu 			}
684da7f033dSHerbert Xu 
685da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
686da7f033dSHerbert Xu 			if (ret) {
687d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
688d8a32ac2SJussi Kivilinna 				       d, authsize, j, algo);
689da7f033dSHerbert Xu 				goto out;
690da7f033dSHerbert Xu 			}
691da7f033dSHerbert Xu 
692da7f033dSHerbert Xu 			if (enc) {
693da7f033dSHerbert Xu 				if (WARN_ON(sg[k - 1].offset +
694da7f033dSHerbert Xu 					    sg[k - 1].length + authsize >
695da7f033dSHerbert Xu 					    PAGE_SIZE)) {
696da7f033dSHerbert Xu 					ret = -EINVAL;
697da7f033dSHerbert Xu 					goto out;
698da7f033dSHerbert Xu 				}
699da7f033dSHerbert Xu 
700d8a32ac2SJussi Kivilinna 				if (diff_dst)
701d8a32ac2SJussi Kivilinna 					sgout[k - 1].length += authsize;
7028ec25c51SHoria Geanta 				else
7038ec25c51SHoria Geanta 					sg[k - 1].length += authsize;
704da7f033dSHerbert Xu 			}
705da7f033dSHerbert Xu 
706da7f033dSHerbert Xu 			sg_init_table(asg, template[i].anp);
707fd57f22aSHerbert Xu 			ret = -EINVAL;
708da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].anp; k++) {
709fd57f22aSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
710fd57f22aSHerbert Xu 					    template[i].atap[k] > PAGE_SIZE))
711fd57f22aSHerbert Xu 					goto out;
712da7f033dSHerbert Xu 				sg_set_buf(&asg[k],
713da7f033dSHerbert Xu 					   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
714da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
715da7f033dSHerbert Xu 						  template[i].assoc + temp,
716da7f033dSHerbert Xu 						  template[i].atap[k]),
717da7f033dSHerbert Xu 					   template[i].atap[k]);
718da7f033dSHerbert Xu 				temp += template[i].atap[k];
719da7f033dSHerbert Xu 			}
720da7f033dSHerbert Xu 
721d8a32ac2SJussi Kivilinna 			aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
722da7f033dSHerbert Xu 					       template[i].ilen,
723da7f033dSHerbert Xu 					       iv);
724da7f033dSHerbert Xu 
725da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
726da7f033dSHerbert Xu 
727da7f033dSHerbert Xu 			ret = enc ?
728da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
729da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
730da7f033dSHerbert Xu 
731da7f033dSHerbert Xu 			switch (ret) {
732da7f033dSHerbert Xu 			case 0:
733e44a1b44SJarod Wilson 				if (template[i].novrfy) {
734e44a1b44SJarod Wilson 					/* verification was supposed to fail */
735d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
736d8a32ac2SJussi Kivilinna 					       d, e, j, algo);
737e44a1b44SJarod Wilson 					/* so really, we got a bad message */
738e44a1b44SJarod Wilson 					ret = -EBADMSG;
739e44a1b44SJarod Wilson 					goto out;
740e44a1b44SJarod Wilson 				}
741da7f033dSHerbert Xu 				break;
742da7f033dSHerbert Xu 			case -EINPROGRESS:
743da7f033dSHerbert Xu 			case -EBUSY:
744da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
745da7f033dSHerbert Xu 					&result.completion);
746da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
74716735d02SWolfram Sang 					reinit_completion(&result.completion);
748da7f033dSHerbert Xu 					break;
749da7f033dSHerbert Xu 				}
750e44a1b44SJarod Wilson 			case -EBADMSG:
751e44a1b44SJarod Wilson 				if (template[i].novrfy)
752e44a1b44SJarod Wilson 					/* verification failure was expected */
753e44a1b44SJarod Wilson 					continue;
754da7f033dSHerbert Xu 				/* fall through */
755da7f033dSHerbert Xu 			default:
756d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
757d8a32ac2SJussi Kivilinna 				       d, e, j, algo, -ret);
758da7f033dSHerbert Xu 				goto out;
759da7f033dSHerbert Xu 			}
760da7f033dSHerbert Xu 
761da7f033dSHerbert Xu 			ret = -EINVAL;
762da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
763d8a32ac2SJussi Kivilinna 				if (diff_dst)
764d8a32ac2SJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
765d8a32ac2SJussi Kivilinna 					    offset_in_page(IDX[k]);
766d8a32ac2SJussi Kivilinna 				else
767da7f033dSHerbert Xu 					q = xbuf[IDX[k] >> PAGE_SHIFT] +
768da7f033dSHerbert Xu 					    offset_in_page(IDX[k]);
769da7f033dSHerbert Xu 
770da7f033dSHerbert Xu 				n = template[i].tap[k];
771da7f033dSHerbert Xu 				if (k == template[i].np - 1)
772da7f033dSHerbert Xu 					n += enc ? authsize : -authsize;
773da7f033dSHerbert Xu 
774da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp, n)) {
775d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
776d8a32ac2SJussi Kivilinna 					       d, j, e, k, algo);
777da7f033dSHerbert Xu 					hexdump(q, n);
778da7f033dSHerbert Xu 					goto out;
779da7f033dSHerbert Xu 				}
780da7f033dSHerbert Xu 
781da7f033dSHerbert Xu 				q += n;
782da7f033dSHerbert Xu 				if (k == template[i].np - 1 && !enc) {
783d8a32ac2SJussi Kivilinna 					if (!diff_dst &&
784d8a32ac2SJussi Kivilinna 						memcmp(q, template[i].input +
785da7f033dSHerbert Xu 						      temp + n, authsize))
786da7f033dSHerbert Xu 						n = authsize;
787da7f033dSHerbert Xu 					else
788da7f033dSHerbert Xu 						n = 0;
789da7f033dSHerbert Xu 				} else {
790da7f033dSHerbert Xu 					for (n = 0; offset_in_page(q + n) &&
791da7f033dSHerbert Xu 						    q[n]; n++)
792da7f033dSHerbert Xu 						;
793da7f033dSHerbert Xu 				}
794da7f033dSHerbert Xu 				if (n) {
795d8a32ac2SJussi Kivilinna 					pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
796d8a32ac2SJussi Kivilinna 					       d, j, e, k, algo, n);
797da7f033dSHerbert Xu 					hexdump(q, n);
798da7f033dSHerbert Xu 					goto out;
799da7f033dSHerbert Xu 				}
800da7f033dSHerbert Xu 
801da7f033dSHerbert Xu 				temp += template[i].tap[k];
802da7f033dSHerbert Xu 			}
803da7f033dSHerbert Xu 		}
804da7f033dSHerbert Xu 	}
805da7f033dSHerbert Xu 
806da7f033dSHerbert Xu 	ret = 0;
807da7f033dSHerbert Xu 
808da7f033dSHerbert Xu out:
809da7f033dSHerbert Xu 	aead_request_free(req);
810d8a32ac2SJussi Kivilinna 	kfree(sg);
811d8a32ac2SJussi Kivilinna out_nosg:
812d8a32ac2SJussi Kivilinna 	if (diff_dst)
813d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
814d8a32ac2SJussi Kivilinna out_nooutbuf:
815f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
816f8b0d4d0SHerbert Xu out_noaxbuf:
817f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
818f8b0d4d0SHerbert Xu out_noxbuf:
81929b77e5dSHoria Geanta 	kfree(key);
8209bac019dSTadeusz Struk 	kfree(iv);
821da7f033dSHerbert Xu 	return ret;
822da7f033dSHerbert Xu }
823da7f033dSHerbert Xu 
824d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
825d8a32ac2SJussi Kivilinna 		     struct aead_testvec *template, unsigned int tcount)
826d8a32ac2SJussi Kivilinna {
82758dcf548SJussi Kivilinna 	unsigned int alignmask;
828d8a32ac2SJussi Kivilinna 	int ret;
829d8a32ac2SJussi Kivilinna 
830d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
83158dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
832d8a32ac2SJussi Kivilinna 	if (ret)
833d8a32ac2SJussi Kivilinna 		return ret;
834d8a32ac2SJussi Kivilinna 
835d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
83658dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
83758dcf548SJussi Kivilinna 	if (ret)
83858dcf548SJussi Kivilinna 		return ret;
83958dcf548SJussi Kivilinna 
84058dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
84158dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
84258dcf548SJussi Kivilinna 	if (ret)
84358dcf548SJussi Kivilinna 		return ret;
84458dcf548SJussi Kivilinna 
84558dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
84658dcf548SJussi Kivilinna 	if (alignmask) {
84758dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
84858dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
84958dcf548SJussi Kivilinna 				  alignmask + 1);
85058dcf548SJussi Kivilinna 		if (ret)
85158dcf548SJussi Kivilinna 			return ret;
85258dcf548SJussi Kivilinna 	}
85358dcf548SJussi Kivilinna 
85458dcf548SJussi Kivilinna 	return 0;
855d8a32ac2SJussi Kivilinna }
856d8a32ac2SJussi Kivilinna 
8571aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
8581aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
8591aa4ecd9SHerbert Xu {
8601aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
8611aa4ecd9SHerbert Xu 	unsigned int i, j, k;
8621aa4ecd9SHerbert Xu 	char *q;
8631aa4ecd9SHerbert Xu 	const char *e;
8641aa4ecd9SHerbert Xu 	void *data;
865f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
866f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
867f8b0d4d0SHerbert Xu 
868f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
869f8b0d4d0SHerbert Xu 		goto out_nobuf;
8701aa4ecd9SHerbert Xu 
8711aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
8721aa4ecd9SHerbert Xu 	        e = "encryption";
8731aa4ecd9SHerbert Xu 	else
8741aa4ecd9SHerbert Xu 		e = "decryption";
8751aa4ecd9SHerbert Xu 
8761aa4ecd9SHerbert Xu 	j = 0;
8771aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
8781aa4ecd9SHerbert Xu 		if (template[i].np)
8791aa4ecd9SHerbert Xu 			continue;
8801aa4ecd9SHerbert Xu 
8811aa4ecd9SHerbert Xu 		j++;
8821aa4ecd9SHerbert Xu 
883fd57f22aSHerbert Xu 		ret = -EINVAL;
884fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
885fd57f22aSHerbert Xu 			goto out;
886fd57f22aSHerbert Xu 
8871aa4ecd9SHerbert Xu 		data = xbuf[0];
8881aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
8891aa4ecd9SHerbert Xu 
8901aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
8911aa4ecd9SHerbert Xu 		if (template[i].wk)
8921aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
8931aa4ecd9SHerbert Xu 
8941aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
8951aa4ecd9SHerbert Xu 					   template[i].klen);
8961aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
8971aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
8981aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
8991aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
9001aa4ecd9SHerbert Xu 			goto out;
9011aa4ecd9SHerbert Xu 		} else if (ret)
9021aa4ecd9SHerbert Xu 			continue;
9031aa4ecd9SHerbert Xu 
9041aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
9051aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
9061aa4ecd9SHerbert Xu 			if (enc)
9071aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
9081aa4ecd9SHerbert Xu 							  data + k);
9091aa4ecd9SHerbert Xu 			else
9101aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
9111aa4ecd9SHerbert Xu 							  data + k);
9121aa4ecd9SHerbert Xu 		}
9131aa4ecd9SHerbert Xu 
9141aa4ecd9SHerbert Xu 		q = data;
9151aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
9161aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
9171aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
9181aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
9191aa4ecd9SHerbert Xu 			ret = -EINVAL;
9201aa4ecd9SHerbert Xu 			goto out;
9211aa4ecd9SHerbert Xu 		}
9221aa4ecd9SHerbert Xu 	}
9231aa4ecd9SHerbert Xu 
9241aa4ecd9SHerbert Xu 	ret = 0;
9251aa4ecd9SHerbert Xu 
9261aa4ecd9SHerbert Xu out:
927f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
928f8b0d4d0SHerbert Xu out_nobuf:
9291aa4ecd9SHerbert Xu 	return ret;
9301aa4ecd9SHerbert Xu }
9311aa4ecd9SHerbert Xu 
93208d6af8cSJussi Kivilinna static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc,
93308d6af8cSJussi Kivilinna 			   struct cipher_testvec *template, unsigned int tcount,
9343a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
935da7f033dSHerbert Xu {
936da7f033dSHerbert Xu 	const char *algo =
937da7f033dSHerbert Xu 		crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
938da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
939da7f033dSHerbert Xu 	char *q;
940da7f033dSHerbert Xu 	struct ablkcipher_request *req;
941da7f033dSHerbert Xu 	struct scatterlist sg[8];
94208d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
94308d6af8cSJussi Kivilinna 	const char *e, *d;
944da7f033dSHerbert Xu 	struct tcrypt_result result;
945da7f033dSHerbert Xu 	void *data;
946da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
947f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
94808d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
949f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
950f8b0d4d0SHerbert Xu 
951f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
952f8b0d4d0SHerbert Xu 		goto out_nobuf;
953da7f033dSHerbert Xu 
95408d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
95508d6af8cSJussi Kivilinna 		goto out_nooutbuf;
95608d6af8cSJussi Kivilinna 
95708d6af8cSJussi Kivilinna 	if (diff_dst)
95808d6af8cSJussi Kivilinna 		d = "-ddst";
95908d6af8cSJussi Kivilinna 	else
96008d6af8cSJussi Kivilinna 		d = "";
96108d6af8cSJussi Kivilinna 
962da7f033dSHerbert Xu 	if (enc == ENCRYPT)
963da7f033dSHerbert Xu 	        e = "encryption";
964da7f033dSHerbert Xu 	else
965da7f033dSHerbert Xu 		e = "decryption";
966da7f033dSHerbert Xu 
967da7f033dSHerbert Xu 	init_completion(&result.completion);
968da7f033dSHerbert Xu 
969da7f033dSHerbert Xu 	req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
970da7f033dSHerbert Xu 	if (!req) {
97108d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
97208d6af8cSJussi Kivilinna 		       d, algo);
973da7f033dSHerbert Xu 		goto out;
974da7f033dSHerbert Xu 	}
975da7f033dSHerbert Xu 
976da7f033dSHerbert Xu 	ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
977da7f033dSHerbert Xu 					tcrypt_complete, &result);
978da7f033dSHerbert Xu 
979da7f033dSHerbert Xu 	j = 0;
980da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
981da7f033dSHerbert Xu 		if (template[i].iv)
982da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
983da7f033dSHerbert Xu 		else
984da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
985da7f033dSHerbert Xu 
986f44d83d1SJussi Kivilinna 		if (!(template[i].np) || (template[i].also_non_np)) {
987da7f033dSHerbert Xu 			j++;
988da7f033dSHerbert Xu 
989fd57f22aSHerbert Xu 			ret = -EINVAL;
9903a338f20SJussi Kivilinna 			if (WARN_ON(align_offset + template[i].ilen >
9913a338f20SJussi Kivilinna 				    PAGE_SIZE))
992fd57f22aSHerbert Xu 				goto out;
993fd57f22aSHerbert Xu 
994da7f033dSHerbert Xu 			data = xbuf[0];
9953a338f20SJussi Kivilinna 			data += align_offset;
996da7f033dSHerbert Xu 			memcpy(data, template[i].input, template[i].ilen);
997da7f033dSHerbert Xu 
998da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
999da7f033dSHerbert Xu 			if (template[i].wk)
1000da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
1001da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
1002da7f033dSHerbert Xu 
1003da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
1004da7f033dSHerbert Xu 						       template[i].klen);
1005da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
100608d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
100708d6af8cSJussi Kivilinna 				       d, j, algo,
100808d6af8cSJussi Kivilinna 				       crypto_ablkcipher_get_flags(tfm));
1009da7f033dSHerbert Xu 				goto out;
1010da7f033dSHerbert Xu 			} else if (ret)
1011da7f033dSHerbert Xu 				continue;
1012da7f033dSHerbert Xu 
1013da7f033dSHerbert Xu 			sg_init_one(&sg[0], data, template[i].ilen);
101408d6af8cSJussi Kivilinna 			if (diff_dst) {
101508d6af8cSJussi Kivilinna 				data = xoutbuf[0];
10163a338f20SJussi Kivilinna 				data += align_offset;
101708d6af8cSJussi Kivilinna 				sg_init_one(&sgout[0], data, template[i].ilen);
101808d6af8cSJussi Kivilinna 			}
1019da7f033dSHerbert Xu 
102008d6af8cSJussi Kivilinna 			ablkcipher_request_set_crypt(req, sg,
102108d6af8cSJussi Kivilinna 						     (diff_dst) ? sgout : sg,
1022da7f033dSHerbert Xu 						     template[i].ilen, iv);
1023da7f033dSHerbert Xu 			ret = enc ?
1024da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
1025da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
1026da7f033dSHerbert Xu 
1027da7f033dSHerbert Xu 			switch (ret) {
1028da7f033dSHerbert Xu 			case 0:
1029da7f033dSHerbert Xu 				break;
1030da7f033dSHerbert Xu 			case -EINPROGRESS:
1031da7f033dSHerbert Xu 			case -EBUSY:
1032da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
1033da7f033dSHerbert Xu 					&result.completion);
1034da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
103516735d02SWolfram Sang 					reinit_completion(&result.completion);
1036da7f033dSHerbert Xu 					break;
1037da7f033dSHerbert Xu 				}
1038da7f033dSHerbert Xu 				/* fall through */
1039da7f033dSHerbert Xu 			default:
104008d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
104108d6af8cSJussi Kivilinna 				       d, e, j, algo, -ret);
1042da7f033dSHerbert Xu 				goto out;
1043da7f033dSHerbert Xu 			}
1044da7f033dSHerbert Xu 
1045da7f033dSHerbert Xu 			q = data;
1046da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
104708d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Test %d failed on %s for %s\n",
104808d6af8cSJussi Kivilinna 				       d, j, e, algo);
1049da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
1050da7f033dSHerbert Xu 				ret = -EINVAL;
1051da7f033dSHerbert Xu 				goto out;
1052da7f033dSHerbert Xu 			}
1053da7f033dSHerbert Xu 		}
1054da7f033dSHerbert Xu 	}
1055da7f033dSHerbert Xu 
1056da7f033dSHerbert Xu 	j = 0;
1057da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
10583a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
10593a338f20SJussi Kivilinna 		if (align_offset != 0)
10603a338f20SJussi Kivilinna 			break;
1061da7f033dSHerbert Xu 
1062da7f033dSHerbert Xu 		if (template[i].iv)
1063da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
1064da7f033dSHerbert Xu 		else
1065da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1066da7f033dSHerbert Xu 
1067da7f033dSHerbert Xu 		if (template[i].np) {
1068da7f033dSHerbert Xu 			j++;
1069da7f033dSHerbert Xu 
1070da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
1071da7f033dSHerbert Xu 			if (template[i].wk)
1072da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
1073da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
1074da7f033dSHerbert Xu 
1075da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
1076da7f033dSHerbert Xu 						       template[i].klen);
1077da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
107808d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
107908d6af8cSJussi Kivilinna 				       d, j, algo,
1080da7f033dSHerbert Xu 				       crypto_ablkcipher_get_flags(tfm));
1081da7f033dSHerbert Xu 				goto out;
1082da7f033dSHerbert Xu 			} else if (ret)
1083da7f033dSHerbert Xu 				continue;
1084da7f033dSHerbert Xu 
1085da7f033dSHerbert Xu 			temp = 0;
1086da7f033dSHerbert Xu 			ret = -EINVAL;
1087da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
108808d6af8cSJussi Kivilinna 			if (diff_dst)
108908d6af8cSJussi Kivilinna 				sg_init_table(sgout, template[i].np);
1090da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
1091da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
1092da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
1093da7f033dSHerbert Xu 					goto out;
1094da7f033dSHerbert Xu 
1095da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1096da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1097da7f033dSHerbert Xu 
1098da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
1099da7f033dSHerbert Xu 				       template[i].tap[k]);
1100da7f033dSHerbert Xu 
1101da7f033dSHerbert Xu 				if (offset_in_page(q) + template[i].tap[k] <
1102da7f033dSHerbert Xu 				    PAGE_SIZE)
1103da7f033dSHerbert Xu 					q[template[i].tap[k]] = 0;
1104da7f033dSHerbert Xu 
1105da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
110608d6af8cSJussi Kivilinna 				if (diff_dst) {
110708d6af8cSJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
110808d6af8cSJussi Kivilinna 					    offset_in_page(IDX[k]);
110908d6af8cSJussi Kivilinna 
111008d6af8cSJussi Kivilinna 					sg_set_buf(&sgout[k], q,
111108d6af8cSJussi Kivilinna 						   template[i].tap[k]);
111208d6af8cSJussi Kivilinna 
111308d6af8cSJussi Kivilinna 					memset(q, 0, template[i].tap[k]);
111408d6af8cSJussi Kivilinna 					if (offset_in_page(q) +
111508d6af8cSJussi Kivilinna 					    template[i].tap[k] < PAGE_SIZE)
111608d6af8cSJussi Kivilinna 						q[template[i].tap[k]] = 0;
111708d6af8cSJussi Kivilinna 				}
1118da7f033dSHerbert Xu 
1119da7f033dSHerbert Xu 				temp += template[i].tap[k];
1120da7f033dSHerbert Xu 			}
1121da7f033dSHerbert Xu 
112208d6af8cSJussi Kivilinna 			ablkcipher_request_set_crypt(req, sg,
112308d6af8cSJussi Kivilinna 					(diff_dst) ? sgout : sg,
1124da7f033dSHerbert Xu 					template[i].ilen, iv);
1125da7f033dSHerbert Xu 
1126da7f033dSHerbert Xu 			ret = enc ?
1127da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
1128da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
1129da7f033dSHerbert Xu 
1130da7f033dSHerbert Xu 			switch (ret) {
1131da7f033dSHerbert Xu 			case 0:
1132da7f033dSHerbert Xu 				break;
1133da7f033dSHerbert Xu 			case -EINPROGRESS:
1134da7f033dSHerbert Xu 			case -EBUSY:
1135da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
1136da7f033dSHerbert Xu 					&result.completion);
1137da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
113816735d02SWolfram Sang 					reinit_completion(&result.completion);
1139da7f033dSHerbert Xu 					break;
1140da7f033dSHerbert Xu 				}
1141da7f033dSHerbert Xu 				/* fall through */
1142da7f033dSHerbert Xu 			default:
114308d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
114408d6af8cSJussi Kivilinna 				       d, e, j, algo, -ret);
1145da7f033dSHerbert Xu 				goto out;
1146da7f033dSHerbert Xu 			}
1147da7f033dSHerbert Xu 
1148da7f033dSHerbert Xu 			temp = 0;
1149da7f033dSHerbert Xu 			ret = -EINVAL;
1150da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
115108d6af8cSJussi Kivilinna 				if (diff_dst)
115208d6af8cSJussi Kivilinna 					q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
115308d6af8cSJussi Kivilinna 					    offset_in_page(IDX[k]);
115408d6af8cSJussi Kivilinna 				else
1155da7f033dSHerbert Xu 					q = xbuf[IDX[k] >> PAGE_SHIFT] +
1156da7f033dSHerbert Xu 					    offset_in_page(IDX[k]);
1157da7f033dSHerbert Xu 
1158da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp,
1159da7f033dSHerbert Xu 					   template[i].tap[k])) {
116008d6af8cSJussi Kivilinna 					pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
116108d6af8cSJussi Kivilinna 					       d, j, e, k, algo);
1162da7f033dSHerbert Xu 					hexdump(q, template[i].tap[k]);
1163da7f033dSHerbert Xu 					goto out;
1164da7f033dSHerbert Xu 				}
1165da7f033dSHerbert Xu 
1166da7f033dSHerbert Xu 				q += template[i].tap[k];
1167da7f033dSHerbert Xu 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
1168da7f033dSHerbert Xu 					;
1169da7f033dSHerbert Xu 				if (n) {
117008d6af8cSJussi Kivilinna 					pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
117108d6af8cSJussi Kivilinna 					       d, j, e, k, algo, n);
1172da7f033dSHerbert Xu 					hexdump(q, n);
1173da7f033dSHerbert Xu 					goto out;
1174da7f033dSHerbert Xu 				}
1175da7f033dSHerbert Xu 				temp += template[i].tap[k];
1176da7f033dSHerbert Xu 			}
1177da7f033dSHerbert Xu 		}
1178da7f033dSHerbert Xu 	}
1179da7f033dSHerbert Xu 
1180da7f033dSHerbert Xu 	ret = 0;
1181da7f033dSHerbert Xu 
1182da7f033dSHerbert Xu out:
1183da7f033dSHerbert Xu 	ablkcipher_request_free(req);
118408d6af8cSJussi Kivilinna 	if (diff_dst)
118508d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
118608d6af8cSJussi Kivilinna out_nooutbuf:
1187f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1188f8b0d4d0SHerbert Xu out_nobuf:
1189da7f033dSHerbert Xu 	return ret;
1190da7f033dSHerbert Xu }
1191da7f033dSHerbert Xu 
119208d6af8cSJussi Kivilinna static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
119308d6af8cSJussi Kivilinna 			 struct cipher_testvec *template, unsigned int tcount)
119408d6af8cSJussi Kivilinna {
11953a338f20SJussi Kivilinna 	unsigned int alignmask;
119608d6af8cSJussi Kivilinna 	int ret;
119708d6af8cSJussi Kivilinna 
119808d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
11993a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
120008d6af8cSJussi Kivilinna 	if (ret)
120108d6af8cSJussi Kivilinna 		return ret;
120208d6af8cSJussi Kivilinna 
120308d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
12043a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
12053a338f20SJussi Kivilinna 	if (ret)
12063a338f20SJussi Kivilinna 		return ret;
12073a338f20SJussi Kivilinna 
12083a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
12093a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
12103a338f20SJussi Kivilinna 	if (ret)
12113a338f20SJussi Kivilinna 		return ret;
12123a338f20SJussi Kivilinna 
12133a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
12143a338f20SJussi Kivilinna 	if (alignmask) {
12153a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
12163a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
12173a338f20SJussi Kivilinna 				      alignmask + 1);
12183a338f20SJussi Kivilinna 		if (ret)
12193a338f20SJussi Kivilinna 			return ret;
12203a338f20SJussi Kivilinna 	}
12213a338f20SJussi Kivilinna 
12223a338f20SJussi Kivilinna 	return 0;
122308d6af8cSJussi Kivilinna }
122408d6af8cSJussi Kivilinna 
1225da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1226da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1227da7f033dSHerbert Xu {
1228da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1229da7f033dSHerbert Xu 	unsigned int i;
1230da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1231da7f033dSHerbert Xu 	int ret;
1232da7f033dSHerbert Xu 
1233da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1234c79cf910SGeert Uytterhoeven 		int ilen;
1235c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1236da7f033dSHerbert Xu 
1237da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1238da7f033dSHerbert Xu 
1239da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1240da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1241da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1242da7f033dSHerbert Xu 		if (ret) {
1243da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1244da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1245da7f033dSHerbert Xu 			       -ret);
1246da7f033dSHerbert Xu 			goto out;
1247da7f033dSHerbert Xu 		}
1248da7f033dSHerbert Xu 
1249b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1250b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1251b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1252b812eb00SGeert Uytterhoeven 			       dlen);
1253b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1254b812eb00SGeert Uytterhoeven 			goto out;
1255b812eb00SGeert Uytterhoeven 		}
1256b812eb00SGeert Uytterhoeven 
1257da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1258da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1259da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1260da7f033dSHerbert Xu 			hexdump(result, dlen);
1261da7f033dSHerbert Xu 			ret = -EINVAL;
1262da7f033dSHerbert Xu 			goto out;
1263da7f033dSHerbert Xu 		}
1264da7f033dSHerbert Xu 	}
1265da7f033dSHerbert Xu 
1266da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1267c79cf910SGeert Uytterhoeven 		int ilen;
1268c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1269da7f033dSHerbert Xu 
1270da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1271da7f033dSHerbert Xu 
1272da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1273da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1274da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1275da7f033dSHerbert Xu 		if (ret) {
1276da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1277da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1278da7f033dSHerbert Xu 			       -ret);
1279da7f033dSHerbert Xu 			goto out;
1280da7f033dSHerbert Xu 		}
1281da7f033dSHerbert Xu 
1282b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1283b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1284b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1285b812eb00SGeert Uytterhoeven 			       dlen);
1286b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1287b812eb00SGeert Uytterhoeven 			goto out;
1288b812eb00SGeert Uytterhoeven 		}
1289b812eb00SGeert Uytterhoeven 
1290da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1291da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1292da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1293da7f033dSHerbert Xu 			hexdump(result, dlen);
1294da7f033dSHerbert Xu 			ret = -EINVAL;
1295da7f033dSHerbert Xu 			goto out;
1296da7f033dSHerbert Xu 		}
1297da7f033dSHerbert Xu 	}
1298da7f033dSHerbert Xu 
1299da7f033dSHerbert Xu 	ret = 0;
1300da7f033dSHerbert Xu 
1301da7f033dSHerbert Xu out:
1302da7f033dSHerbert Xu 	return ret;
1303da7f033dSHerbert Xu }
1304da7f033dSHerbert Xu 
13058064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm,
13068064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *ctemplate,
13078064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *dtemplate, int ctcount,
13088064efb8SGeert Uytterhoeven 		      int dtcount)
13098064efb8SGeert Uytterhoeven {
13108064efb8SGeert Uytterhoeven 	const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
13118064efb8SGeert Uytterhoeven 	unsigned int i;
13128064efb8SGeert Uytterhoeven 	char result[COMP_BUF_SIZE];
13133ce858cbSGeert Uytterhoeven 	int res;
13148064efb8SGeert Uytterhoeven 
13158064efb8SGeert Uytterhoeven 	for (i = 0; i < ctcount; i++) {
13168064efb8SGeert Uytterhoeven 		struct comp_request req;
13173ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
13188064efb8SGeert Uytterhoeven 
13193ce858cbSGeert Uytterhoeven 		res = crypto_compress_setup(tfm, ctemplate[i].params,
13208064efb8SGeert Uytterhoeven 					    ctemplate[i].paramsize);
13213ce858cbSGeert Uytterhoeven 		if (res) {
13228064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression setup failed on test "
13233ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13243ce858cbSGeert Uytterhoeven 			return res;
13258064efb8SGeert Uytterhoeven 		}
13268064efb8SGeert Uytterhoeven 
13273ce858cbSGeert Uytterhoeven 		res = crypto_compress_init(tfm);
13283ce858cbSGeert Uytterhoeven 		if (res) {
13298064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression init failed on test "
13303ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13313ce858cbSGeert Uytterhoeven 			return res;
13328064efb8SGeert Uytterhoeven 		}
13338064efb8SGeert Uytterhoeven 
13348064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
13358064efb8SGeert Uytterhoeven 
13368064efb8SGeert Uytterhoeven 		req.next_in = ctemplate[i].input;
13378064efb8SGeert Uytterhoeven 		req.avail_in = ctemplate[i].inlen / 2;
13388064efb8SGeert Uytterhoeven 		req.next_out = result;
13398064efb8SGeert Uytterhoeven 		req.avail_out = ctemplate[i].outlen / 2;
13408064efb8SGeert Uytterhoeven 
13413ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13423ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13438064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13443ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13453ce858cbSGeert Uytterhoeven 			return res;
13468064efb8SGeert Uytterhoeven 		}
13473ce858cbSGeert Uytterhoeven 		if (res > 0)
13483ce858cbSGeert Uytterhoeven 			produced += res;
13498064efb8SGeert Uytterhoeven 
13508064efb8SGeert Uytterhoeven 		/* Add remaining input data */
13518064efb8SGeert Uytterhoeven 		req.avail_in += (ctemplate[i].inlen + 1) / 2;
13528064efb8SGeert Uytterhoeven 
13533ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13543ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13558064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13563ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13573ce858cbSGeert Uytterhoeven 			return res;
13588064efb8SGeert Uytterhoeven 		}
13593ce858cbSGeert Uytterhoeven 		if (res > 0)
13603ce858cbSGeert Uytterhoeven 			produced += res;
13618064efb8SGeert Uytterhoeven 
13628064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
13638064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
13648064efb8SGeert Uytterhoeven 
13653ce858cbSGeert Uytterhoeven 		res = crypto_compress_final(tfm, &req);
13663ce858cbSGeert Uytterhoeven 		if (res < 0) {
13678064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression final failed on test "
13683ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13693ce858cbSGeert Uytterhoeven 			return res;
13708064efb8SGeert Uytterhoeven 		}
13713ce858cbSGeert Uytterhoeven 		produced += res;
13728064efb8SGeert Uytterhoeven 
13738064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
13748064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13758064efb8SGeert Uytterhoeven 			       "output len = %d (expected %d)\n", i + 1, algo,
13768064efb8SGeert Uytterhoeven 			       COMP_BUF_SIZE - req.avail_out,
13778064efb8SGeert Uytterhoeven 			       ctemplate[i].outlen);
13788064efb8SGeert Uytterhoeven 			return -EINVAL;
13798064efb8SGeert Uytterhoeven 		}
13808064efb8SGeert Uytterhoeven 
13813ce858cbSGeert Uytterhoeven 		if (produced != ctemplate[i].outlen) {
13823ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13833ce858cbSGeert Uytterhoeven 			       "returned len = %u (expected %d)\n", i + 1,
13843ce858cbSGeert Uytterhoeven 			       algo, produced, ctemplate[i].outlen);
13853ce858cbSGeert Uytterhoeven 			return -EINVAL;
13863ce858cbSGeert Uytterhoeven 		}
13873ce858cbSGeert Uytterhoeven 
13888064efb8SGeert Uytterhoeven 		if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
13898064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Compression test %d failed for "
13908064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
13918064efb8SGeert Uytterhoeven 			hexdump(result, ctemplate[i].outlen);
13928064efb8SGeert Uytterhoeven 			return -EINVAL;
13938064efb8SGeert Uytterhoeven 		}
13948064efb8SGeert Uytterhoeven 	}
13958064efb8SGeert Uytterhoeven 
13968064efb8SGeert Uytterhoeven 	for (i = 0; i < dtcount; i++) {
13978064efb8SGeert Uytterhoeven 		struct comp_request req;
13983ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
13998064efb8SGeert Uytterhoeven 
14003ce858cbSGeert Uytterhoeven 		res = crypto_decompress_setup(tfm, dtemplate[i].params,
14018064efb8SGeert Uytterhoeven 					      dtemplate[i].paramsize);
14023ce858cbSGeert Uytterhoeven 		if (res) {
14038064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression setup failed on "
14043ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14053ce858cbSGeert Uytterhoeven 			return res;
14068064efb8SGeert Uytterhoeven 		}
14078064efb8SGeert Uytterhoeven 
14083ce858cbSGeert Uytterhoeven 		res = crypto_decompress_init(tfm);
14093ce858cbSGeert Uytterhoeven 		if (res) {
14108064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression init failed on test "
14113ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
14123ce858cbSGeert Uytterhoeven 			return res;
14138064efb8SGeert Uytterhoeven 		}
14148064efb8SGeert Uytterhoeven 
14158064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
14168064efb8SGeert Uytterhoeven 
14178064efb8SGeert Uytterhoeven 		req.next_in = dtemplate[i].input;
14188064efb8SGeert Uytterhoeven 		req.avail_in = dtemplate[i].inlen / 2;
14198064efb8SGeert Uytterhoeven 		req.next_out = result;
14208064efb8SGeert Uytterhoeven 		req.avail_out = dtemplate[i].outlen / 2;
14218064efb8SGeert Uytterhoeven 
14223ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
14233ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14248064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
14253ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14263ce858cbSGeert Uytterhoeven 			return res;
14278064efb8SGeert Uytterhoeven 		}
14283ce858cbSGeert Uytterhoeven 		if (res > 0)
14293ce858cbSGeert Uytterhoeven 			produced += res;
14308064efb8SGeert Uytterhoeven 
14318064efb8SGeert Uytterhoeven 		/* Add remaining input data */
14328064efb8SGeert Uytterhoeven 		req.avail_in += (dtemplate[i].inlen + 1) / 2;
14338064efb8SGeert Uytterhoeven 
14343ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
14353ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14368064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
14373ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14383ce858cbSGeert Uytterhoeven 			return res;
14398064efb8SGeert Uytterhoeven 		}
14403ce858cbSGeert Uytterhoeven 		if (res > 0)
14413ce858cbSGeert Uytterhoeven 			produced += res;
14428064efb8SGeert Uytterhoeven 
14438064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
14448064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
14458064efb8SGeert Uytterhoeven 
14463ce858cbSGeert Uytterhoeven 		res = crypto_decompress_final(tfm, &req);
14473ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14488064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression final failed on "
14493ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14503ce858cbSGeert Uytterhoeven 			return res;
14518064efb8SGeert Uytterhoeven 		}
14523ce858cbSGeert Uytterhoeven 		if (res > 0)
14533ce858cbSGeert Uytterhoeven 			produced += res;
14548064efb8SGeert Uytterhoeven 
14558064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
14568064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14578064efb8SGeert Uytterhoeven 			       "%s: output len = %d (expected %d)\n", i + 1,
14588064efb8SGeert Uytterhoeven 			       algo, COMP_BUF_SIZE - req.avail_out,
14598064efb8SGeert Uytterhoeven 			       dtemplate[i].outlen);
14608064efb8SGeert Uytterhoeven 			return -EINVAL;
14618064efb8SGeert Uytterhoeven 		}
14628064efb8SGeert Uytterhoeven 
14633ce858cbSGeert Uytterhoeven 		if (produced != dtemplate[i].outlen) {
14643ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14653ce858cbSGeert Uytterhoeven 			       "%s: returned len = %u (expected %d)\n", i + 1,
14663ce858cbSGeert Uytterhoeven 			       algo, produced, dtemplate[i].outlen);
14673ce858cbSGeert Uytterhoeven 			return -EINVAL;
14683ce858cbSGeert Uytterhoeven 		}
14693ce858cbSGeert Uytterhoeven 
14708064efb8SGeert Uytterhoeven 		if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
14718064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Decompression test %d failed for "
14728064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
14738064efb8SGeert Uytterhoeven 			hexdump(result, dtemplate[i].outlen);
14748064efb8SGeert Uytterhoeven 			return -EINVAL;
14758064efb8SGeert Uytterhoeven 		}
14768064efb8SGeert Uytterhoeven 	}
14778064efb8SGeert Uytterhoeven 
14788064efb8SGeert Uytterhoeven 	return 0;
14798064efb8SGeert Uytterhoeven }
14808064efb8SGeert Uytterhoeven 
14817647d6ceSJarod Wilson 
14827647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
14837647d6ceSJarod Wilson 		      unsigned int tcount)
14847647d6ceSJarod Wilson {
14857647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1486fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
14877647d6ceSJarod Wilson 	u8 *seed;
14887647d6ceSJarod Wilson 	char result[32];
14897647d6ceSJarod Wilson 
14907647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
14917647d6ceSJarod Wilson 
14927647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
14937647d6ceSJarod Wilson 	if (!seed) {
14947647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
14957647d6ceSJarod Wilson 		       "for %s\n", algo);
14967647d6ceSJarod Wilson 		return -ENOMEM;
14977647d6ceSJarod Wilson 	}
14987647d6ceSJarod Wilson 
14997647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
15007647d6ceSJarod Wilson 		memset(result, 0, 32);
15017647d6ceSJarod Wilson 
15027647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
15037647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
15047647d6ceSJarod Wilson 		       template[i].klen);
15057647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
15067647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
15077647d6ceSJarod Wilson 
15087647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
15097647d6ceSJarod Wilson 		if (err) {
15107647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
15117647d6ceSJarod Wilson 			       "for %s\n", algo);
15127647d6ceSJarod Wilson 			goto out;
15137647d6ceSJarod Wilson 		}
15147647d6ceSJarod Wilson 
15157647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
15167647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
15177647d6ceSJarod Wilson 						   template[i].rlen);
15187647d6ceSJarod Wilson 			if (err != template[i].rlen) {
15197647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
15207647d6ceSJarod Wilson 				       "the correct amount of random data for "
15217647d6ceSJarod Wilson 				       "%s (requested %d, got %d)\n", algo,
15227647d6ceSJarod Wilson 				       template[i].rlen, err);
15237647d6ceSJarod Wilson 				goto out;
15247647d6ceSJarod Wilson 			}
15257647d6ceSJarod Wilson 		}
15267647d6ceSJarod Wilson 
15277647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
15287647d6ceSJarod Wilson 			     template[i].rlen);
15297647d6ceSJarod Wilson 		if (err) {
15307647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
15317647d6ceSJarod Wilson 			       i, algo);
15327647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
15337647d6ceSJarod Wilson 			err = -EINVAL;
15347647d6ceSJarod Wilson 			goto out;
15357647d6ceSJarod Wilson 		}
15367647d6ceSJarod Wilson 	}
15377647d6ceSJarod Wilson 
15387647d6ceSJarod Wilson out:
15397647d6ceSJarod Wilson 	kfree(seed);
15407647d6ceSJarod Wilson 	return err;
15417647d6ceSJarod Wilson }
15427647d6ceSJarod Wilson 
1543da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1544da7f033dSHerbert Xu 			 u32 type, u32 mask)
1545da7f033dSHerbert Xu {
1546da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1547da7f033dSHerbert Xu 	int err = 0;
1548da7f033dSHerbert Xu 
1549da7f033dSHerbert Xu 	tfm = crypto_alloc_aead(driver, type, mask);
1550da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1551da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1552da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1553da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1554da7f033dSHerbert Xu 	}
1555da7f033dSHerbert Xu 
1556da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1557da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1558da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1559da7f033dSHerbert Xu 		if (err)
1560da7f033dSHerbert Xu 			goto out;
1561da7f033dSHerbert Xu 	}
1562da7f033dSHerbert Xu 
1563da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1564da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1565da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1566da7f033dSHerbert Xu 
1567da7f033dSHerbert Xu out:
1568da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1569da7f033dSHerbert Xu 	return err;
1570da7f033dSHerbert Xu }
1571da7f033dSHerbert Xu 
1572da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1573da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1574da7f033dSHerbert Xu {
15751aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1576da7f033dSHerbert Xu 	int err = 0;
1577da7f033dSHerbert Xu 
15781aa4ecd9SHerbert Xu 	tfm = crypto_alloc_cipher(driver, type, mask);
1579da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1580da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1581da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1582da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1583da7f033dSHerbert Xu 	}
1584da7f033dSHerbert Xu 
1585da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1586da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1587da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1588da7f033dSHerbert Xu 		if (err)
1589da7f033dSHerbert Xu 			goto out;
1590da7f033dSHerbert Xu 	}
1591da7f033dSHerbert Xu 
1592da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1593da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1594da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1595da7f033dSHerbert Xu 
1596da7f033dSHerbert Xu out:
15971aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
15981aa4ecd9SHerbert Xu 	return err;
15991aa4ecd9SHerbert Xu }
16001aa4ecd9SHerbert Xu 
16011aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
16021aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
16031aa4ecd9SHerbert Xu {
16041aa4ecd9SHerbert Xu 	struct crypto_ablkcipher *tfm;
16051aa4ecd9SHerbert Xu 	int err = 0;
16061aa4ecd9SHerbert Xu 
16071aa4ecd9SHerbert Xu 	tfm = crypto_alloc_ablkcipher(driver, type, mask);
16081aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
16091aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
16101aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
16111aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
16121aa4ecd9SHerbert Xu 	}
16131aa4ecd9SHerbert Xu 
16141aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
16151aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
16161aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
16171aa4ecd9SHerbert Xu 		if (err)
16181aa4ecd9SHerbert Xu 			goto out;
16191aa4ecd9SHerbert Xu 	}
16201aa4ecd9SHerbert Xu 
16211aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
16221aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
16231aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
16241aa4ecd9SHerbert Xu 
16251aa4ecd9SHerbert Xu out:
1626da7f033dSHerbert Xu 	crypto_free_ablkcipher(tfm);
1627da7f033dSHerbert Xu 	return err;
1628da7f033dSHerbert Xu }
1629da7f033dSHerbert Xu 
1630da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1631da7f033dSHerbert Xu 			 u32 type, u32 mask)
1632da7f033dSHerbert Xu {
1633da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1634da7f033dSHerbert Xu 	int err;
1635da7f033dSHerbert Xu 
1636da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1637da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1638da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1639da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1640da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1641da7f033dSHerbert Xu 	}
1642da7f033dSHerbert Xu 
1643da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1644da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1645da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1646da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1647da7f033dSHerbert Xu 
1648da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1649da7f033dSHerbert Xu 	return err;
1650da7f033dSHerbert Xu }
1651da7f033dSHerbert Xu 
16528064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
16538064efb8SGeert Uytterhoeven 			  u32 type, u32 mask)
16548064efb8SGeert Uytterhoeven {
16558064efb8SGeert Uytterhoeven 	struct crypto_pcomp *tfm;
16568064efb8SGeert Uytterhoeven 	int err;
16578064efb8SGeert Uytterhoeven 
16588064efb8SGeert Uytterhoeven 	tfm = crypto_alloc_pcomp(driver, type, mask);
16598064efb8SGeert Uytterhoeven 	if (IS_ERR(tfm)) {
16608064efb8SGeert Uytterhoeven 		pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
16618064efb8SGeert Uytterhoeven 		       driver, PTR_ERR(tfm));
16628064efb8SGeert Uytterhoeven 		return PTR_ERR(tfm);
16638064efb8SGeert Uytterhoeven 	}
16648064efb8SGeert Uytterhoeven 
16658064efb8SGeert Uytterhoeven 	err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
16668064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.vecs,
16678064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.comp.count,
16688064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.count);
16698064efb8SGeert Uytterhoeven 
16708064efb8SGeert Uytterhoeven 	crypto_free_pcomp(tfm);
16718064efb8SGeert Uytterhoeven 	return err;
16728064efb8SGeert Uytterhoeven }
16738064efb8SGeert Uytterhoeven 
1674da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1675da7f033dSHerbert Xu 			 u32 type, u32 mask)
1676da7f033dSHerbert Xu {
1677da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1678da7f033dSHerbert Xu 	int err;
1679da7f033dSHerbert Xu 
1680da7f033dSHerbert Xu 	tfm = crypto_alloc_ahash(driver, type, mask);
1681da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1682da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1683da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1684da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1685da7f033dSHerbert Xu 	}
1686da7f033dSHerbert Xu 
1687a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1688a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1689a8f1a052SDavid S. Miller 	if (!err)
1690a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1691a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1692da7f033dSHerbert Xu 
1693da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1694da7f033dSHerbert Xu 	return err;
1695da7f033dSHerbert Xu }
1696da7f033dSHerbert Xu 
16978e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
16988e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
16998e3ee85eSHerbert Xu {
17008e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
17018e3ee85eSHerbert Xu 	u32 val;
17028e3ee85eSHerbert Xu 	int err;
17038e3ee85eSHerbert Xu 
17048e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
17058e3ee85eSHerbert Xu 	if (err)
17068e3ee85eSHerbert Xu 		goto out;
17078e3ee85eSHerbert Xu 
17088e3ee85eSHerbert Xu 	tfm = crypto_alloc_shash(driver, type, mask);
17098e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
17108e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
17118e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
17128e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
17138e3ee85eSHerbert Xu 		goto out;
17148e3ee85eSHerbert Xu 	}
17158e3ee85eSHerbert Xu 
17168e3ee85eSHerbert Xu 	do {
17178e3ee85eSHerbert Xu 		struct {
17188e3ee85eSHerbert Xu 			struct shash_desc shash;
17198e3ee85eSHerbert Xu 			char ctx[crypto_shash_descsize(tfm)];
17208e3ee85eSHerbert Xu 		} sdesc;
17218e3ee85eSHerbert Xu 
17228e3ee85eSHerbert Xu 		sdesc.shash.tfm = tfm;
17238e3ee85eSHerbert Xu 		sdesc.shash.flags = 0;
17248e3ee85eSHerbert Xu 
17258e3ee85eSHerbert Xu 		*(u32 *)sdesc.ctx = le32_to_cpu(420553207);
17268e3ee85eSHerbert Xu 		err = crypto_shash_final(&sdesc.shash, (u8 *)&val);
17278e3ee85eSHerbert Xu 		if (err) {
17288e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
17298e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
17308e3ee85eSHerbert Xu 			break;
17318e3ee85eSHerbert Xu 		}
17328e3ee85eSHerbert Xu 
17338e3ee85eSHerbert Xu 		if (val != ~420553207) {
17348e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
17358e3ee85eSHerbert Xu 			       "%d\n", driver, val);
17368e3ee85eSHerbert Xu 			err = -EINVAL;
17378e3ee85eSHerbert Xu 		}
17388e3ee85eSHerbert Xu 	} while (0);
17398e3ee85eSHerbert Xu 
17408e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
17418e3ee85eSHerbert Xu 
17428e3ee85eSHerbert Xu out:
17438e3ee85eSHerbert Xu 	return err;
17448e3ee85eSHerbert Xu }
17458e3ee85eSHerbert Xu 
17467647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
17477647d6ceSJarod Wilson 			  u32 type, u32 mask)
17487647d6ceSJarod Wilson {
17497647d6ceSJarod Wilson 	struct crypto_rng *rng;
17507647d6ceSJarod Wilson 	int err;
17517647d6ceSJarod Wilson 
17527647d6ceSJarod Wilson 	rng = crypto_alloc_rng(driver, type, mask);
17537647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
17547647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
17557647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
17567647d6ceSJarod Wilson 		return PTR_ERR(rng);
17577647d6ceSJarod Wilson 	}
17587647d6ceSJarod Wilson 
17597647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
17607647d6ceSJarod Wilson 
17617647d6ceSJarod Wilson 	crypto_free_rng(rng);
17627647d6ceSJarod Wilson 
17637647d6ceSJarod Wilson 	return err;
17647647d6ceSJarod Wilson }
17657647d6ceSJarod Wilson 
176664d1cdfbSStephan Mueller 
176764d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr,
176864d1cdfbSStephan Mueller 			  const char *driver, u32 type, u32 mask)
176964d1cdfbSStephan Mueller {
177064d1cdfbSStephan Mueller 	int ret = -EAGAIN;
177164d1cdfbSStephan Mueller 	struct crypto_rng *drng;
177264d1cdfbSStephan Mueller 	struct drbg_test_data test_data;
177364d1cdfbSStephan Mueller 	struct drbg_string addtl, pers, testentropy;
177464d1cdfbSStephan Mueller 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
177564d1cdfbSStephan Mueller 
177664d1cdfbSStephan Mueller 	if (!buf)
177764d1cdfbSStephan Mueller 		return -ENOMEM;
177864d1cdfbSStephan Mueller 
177964d1cdfbSStephan Mueller 	drng = crypto_alloc_rng(driver, type, mask);
178064d1cdfbSStephan Mueller 	if (IS_ERR(drng)) {
178164d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for"
178264d1cdfbSStephan Mueller 		       "%s\n", driver);
178364d1cdfbSStephan Mueller 		kzfree(buf);
178464d1cdfbSStephan Mueller 		return -ENOMEM;
178564d1cdfbSStephan Mueller 	}
178664d1cdfbSStephan Mueller 
178764d1cdfbSStephan Mueller 	test_data.testentropy = &testentropy;
178864d1cdfbSStephan Mueller 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
178964d1cdfbSStephan Mueller 	drbg_string_fill(&pers, test->pers, test->perslen);
179064d1cdfbSStephan Mueller 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
179164d1cdfbSStephan Mueller 	if (ret) {
179264d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
179364d1cdfbSStephan Mueller 		goto outbuf;
179464d1cdfbSStephan Mueller 	}
179564d1cdfbSStephan Mueller 
179664d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
179764d1cdfbSStephan Mueller 	if (pr) {
179864d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
179964d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
180064d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl,	&test_data);
180164d1cdfbSStephan Mueller 	} else {
180264d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
180364d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
180464d1cdfbSStephan Mueller 	}
180564d1cdfbSStephan Mueller 	if (ret <= 0) {
180664d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for"
180764d1cdfbSStephan Mueller 		       "driver %s\n", driver);
180864d1cdfbSStephan Mueller 		goto outbuf;
180964d1cdfbSStephan Mueller 	}
181064d1cdfbSStephan Mueller 
181164d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
181264d1cdfbSStephan Mueller 	if (pr) {
181364d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
181464d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
181564d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl, &test_data);
181664d1cdfbSStephan Mueller 	} else {
181764d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
181864d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
181964d1cdfbSStephan Mueller 	}
182064d1cdfbSStephan Mueller 	if (ret <= 0) {
182164d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for"
182264d1cdfbSStephan Mueller 		       "driver %s\n", driver);
182364d1cdfbSStephan Mueller 		goto outbuf;
182464d1cdfbSStephan Mueller 	}
182564d1cdfbSStephan Mueller 
182664d1cdfbSStephan Mueller 	ret = memcmp(test->expected, buf, test->expectedlen);
182764d1cdfbSStephan Mueller 
182864d1cdfbSStephan Mueller outbuf:
182964d1cdfbSStephan Mueller 	crypto_free_rng(drng);
183064d1cdfbSStephan Mueller 	kzfree(buf);
183164d1cdfbSStephan Mueller 	return ret;
183264d1cdfbSStephan Mueller }
183364d1cdfbSStephan Mueller 
183464d1cdfbSStephan Mueller 
183564d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
183664d1cdfbSStephan Mueller 			 u32 type, u32 mask)
183764d1cdfbSStephan Mueller {
183864d1cdfbSStephan Mueller 	int err = 0;
183964d1cdfbSStephan Mueller 	int pr = 0;
184064d1cdfbSStephan Mueller 	int i = 0;
184164d1cdfbSStephan Mueller 	struct drbg_testvec *template = desc->suite.drbg.vecs;
184264d1cdfbSStephan Mueller 	unsigned int tcount = desc->suite.drbg.count;
184364d1cdfbSStephan Mueller 
184464d1cdfbSStephan Mueller 	if (0 == memcmp(driver, "drbg_pr_", 8))
184564d1cdfbSStephan Mueller 		pr = 1;
184664d1cdfbSStephan Mueller 
184764d1cdfbSStephan Mueller 	for (i = 0; i < tcount; i++) {
184864d1cdfbSStephan Mueller 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
184964d1cdfbSStephan Mueller 		if (err) {
185064d1cdfbSStephan Mueller 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
185164d1cdfbSStephan Mueller 			       i, driver);
185264d1cdfbSStephan Mueller 			err = -EINVAL;
185364d1cdfbSStephan Mueller 			break;
185464d1cdfbSStephan Mueller 		}
185564d1cdfbSStephan Mueller 	}
185664d1cdfbSStephan Mueller 	return err;
185764d1cdfbSStephan Mueller 
185864d1cdfbSStephan Mueller }
185964d1cdfbSStephan Mueller 
1860863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1861863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1862863b557aSYouquan, Song {
1863863b557aSYouquan, Song 	return 0;
1864863b557aSYouquan, Song }
1865863b557aSYouquan, Song 
1866da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1867da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1868da7f033dSHerbert Xu 	{
18694d6d6a2cSJohannes Goetzfried 		.alg = "__cbc-cast5-avx",
18704d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
18714d6d6a2cSJohannes Goetzfried 	}, {
18724ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
18734ea1277dSJohannes Goetzfried 		.test = alg_test_null,
18744ea1277dSJohannes Goetzfried 	}, {
18757efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
18767efe4076SJohannes Goetzfried 		.test = alg_test_null,
18777efe4076SJohannes Goetzfried 	}, {
187856d76c96SJussi Kivilinna 		.alg = "__cbc-serpent-avx2",
187956d76c96SJussi Kivilinna 		.test = alg_test_null,
188056d76c96SJussi Kivilinna 	}, {
1881937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
1882937c30d7SJussi Kivilinna 		.test = alg_test_null,
1883937c30d7SJussi Kivilinna 	}, {
1884107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
1885107778b5SJohannes Goetzfried 		.test = alg_test_null,
1886107778b5SJohannes Goetzfried 	}, {
1887863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
1888863b557aSYouquan, Song 		.test = alg_test_null,
18896c79294fSMilan Broz 		.fips_allowed = 1,
1890863b557aSYouquan, Song 	}, {
1891d9b1d2e7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni",
1892d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1893d9b1d2e7SJussi Kivilinna 	}, {
1894f3f935a7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni-avx2",
1895f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1896f3f935a7SJussi Kivilinna 	}, {
18974d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
18984d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
18994d6d6a2cSJohannes Goetzfried 	}, {
19004ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
19014ea1277dSJohannes Goetzfried 		.test = alg_test_null,
19024ea1277dSJohannes Goetzfried 	}, {
19037efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
19047efe4076SJohannes Goetzfried 		.test = alg_test_null,
19057efe4076SJohannes Goetzfried 	}, {
190656d76c96SJussi Kivilinna 		.alg = "__driver-cbc-serpent-avx2",
190756d76c96SJussi Kivilinna 		.test = alg_test_null,
190856d76c96SJussi Kivilinna 	}, {
1909937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
1910937c30d7SJussi Kivilinna 		.test = alg_test_null,
1911937c30d7SJussi Kivilinna 	}, {
1912107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
1913107778b5SJohannes Goetzfried 		.test = alg_test_null,
1914107778b5SJohannes Goetzfried 	}, {
1915863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
1916863b557aSYouquan, Song 		.test = alg_test_null,
19176c79294fSMilan Broz 		.fips_allowed = 1,
1918863b557aSYouquan, Song 	}, {
1919d9b1d2e7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni",
1920d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1921d9b1d2e7SJussi Kivilinna 	}, {
1922f3f935a7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni-avx2",
1923f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1924f3f935a7SJussi Kivilinna 	}, {
19254d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
19264d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
19274d6d6a2cSJohannes Goetzfried 	}, {
19284ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
19294ea1277dSJohannes Goetzfried 		.test = alg_test_null,
19304ea1277dSJohannes Goetzfried 	}, {
19317efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
19327efe4076SJohannes Goetzfried 		.test = alg_test_null,
19337efe4076SJohannes Goetzfried 	}, {
193456d76c96SJussi Kivilinna 		.alg = "__driver-ecb-serpent-avx2",
193556d76c96SJussi Kivilinna 		.test = alg_test_null,
193656d76c96SJussi Kivilinna 	}, {
1937937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
1938937c30d7SJussi Kivilinna 		.test = alg_test_null,
1939937c30d7SJussi Kivilinna 	}, {
1940107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
1941107778b5SJohannes Goetzfried 		.test = alg_test_null,
1942107778b5SJohannes Goetzfried 	}, {
1943863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
1944863b557aSYouquan, Song 		.test = alg_test_null,
19456c79294fSMilan Broz 		.fips_allowed = 1,
1946863b557aSYouquan, Song 	}, {
1947e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
1948e08ca2daSJarod Wilson 		.test = alg_test_cprng,
1949a1915d51SJarod Wilson 		.fips_allowed = 1,
1950e08ca2daSJarod Wilson 		.suite = {
1951e08ca2daSJarod Wilson 			.cprng = {
1952e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
1953e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
1954e08ca2daSJarod Wilson 			}
1955e08ca2daSJarod Wilson 		}
1956e08ca2daSJarod Wilson 	}, {
1957bca4feb0SHoria Geanta 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
1958bca4feb0SHoria Geanta 		.test = alg_test_aead,
1959bca4feb0SHoria Geanta 		.fips_allowed = 1,
1960bca4feb0SHoria Geanta 		.suite = {
1961bca4feb0SHoria Geanta 			.aead = {
1962bca4feb0SHoria Geanta 				.enc = {
1963bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_enc_tv_template,
1964bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS
1965bca4feb0SHoria Geanta 				},
1966bca4feb0SHoria Geanta 				.dec = {
1967bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_dec_tv_template,
1968bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS
1969bca4feb0SHoria Geanta 				}
1970bca4feb0SHoria Geanta 			}
1971bca4feb0SHoria Geanta 		}
1972bca4feb0SHoria Geanta 	}, {
1973e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha1),cbc(aes))",
1974e46e9a46SHoria Geanta 		.test = alg_test_aead,
1975e46e9a46SHoria Geanta 		.fips_allowed = 1,
1976e46e9a46SHoria Geanta 		.suite = {
1977e46e9a46SHoria Geanta 			.aead = {
1978e46e9a46SHoria Geanta 				.enc = {
19795208ed2cSNitesh Lal 					.vecs =
19805208ed2cSNitesh Lal 					hmac_sha1_aes_cbc_enc_tv_temp,
19815208ed2cSNitesh Lal 					.count =
19825208ed2cSNitesh Lal 					HMAC_SHA1_AES_CBC_ENC_TEST_VEC
19835208ed2cSNitesh Lal 				}
19845208ed2cSNitesh Lal 			}
19855208ed2cSNitesh Lal 		}
19865208ed2cSNitesh Lal 	}, {
19875208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha1),cbc(des))",
19885208ed2cSNitesh Lal 		.test = alg_test_aead,
19895208ed2cSNitesh Lal 		.fips_allowed = 1,
19905208ed2cSNitesh Lal 		.suite = {
19915208ed2cSNitesh Lal 			.aead = {
19925208ed2cSNitesh Lal 				.enc = {
19935208ed2cSNitesh Lal 					.vecs =
19945208ed2cSNitesh Lal 					hmac_sha1_des_cbc_enc_tv_temp,
19955208ed2cSNitesh Lal 					.count =
19965208ed2cSNitesh Lal 					HMAC_SHA1_DES_CBC_ENC_TEST_VEC
19975208ed2cSNitesh Lal 				}
19985208ed2cSNitesh Lal 			}
19995208ed2cSNitesh Lal 		}
20005208ed2cSNitesh Lal 	}, {
20015208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
20025208ed2cSNitesh Lal 		.test = alg_test_aead,
20035208ed2cSNitesh Lal 		.fips_allowed = 1,
20045208ed2cSNitesh Lal 		.suite = {
20055208ed2cSNitesh Lal 			.aead = {
20065208ed2cSNitesh Lal 				.enc = {
20075208ed2cSNitesh Lal 					.vecs =
20085208ed2cSNitesh Lal 					hmac_sha1_des3_ede_cbc_enc_tv_temp,
20095208ed2cSNitesh Lal 					.count =
20105208ed2cSNitesh Lal 					HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
2011e46e9a46SHoria Geanta 				}
2012e46e9a46SHoria Geanta 			}
2013e46e9a46SHoria Geanta 		}
2014e46e9a46SHoria Geanta 	}, {
2015bca4feb0SHoria Geanta 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
2016bca4feb0SHoria Geanta 		.test = alg_test_aead,
2017bca4feb0SHoria Geanta 		.fips_allowed = 1,
2018bca4feb0SHoria Geanta 		.suite = {
2019bca4feb0SHoria Geanta 			.aead = {
2020bca4feb0SHoria Geanta 				.enc = {
20215208ed2cSNitesh Lal 					.vecs =
20225208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_enc_tv_temp,
20235208ed2cSNitesh Lal 					.count =
20245208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
2025bca4feb0SHoria Geanta 				},
2026bca4feb0SHoria Geanta 				.dec = {
20275208ed2cSNitesh Lal 					.vecs =
20285208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_dec_tv_temp,
20295208ed2cSNitesh Lal 					.count =
20305208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
20315208ed2cSNitesh Lal 				}
20325208ed2cSNitesh Lal 			}
20335208ed2cSNitesh Lal 		}
20345208ed2cSNitesh Lal 	}, {
20355208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha224),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_sha224_des_cbc_enc_tv_temp,
20435208ed2cSNitesh Lal 					.count =
20445208ed2cSNitesh Lal 					HMAC_SHA224_DES_CBC_ENC_TEST_VEC
20455208ed2cSNitesh Lal 				}
20465208ed2cSNitesh Lal 			}
20475208ed2cSNitesh Lal 		}
20485208ed2cSNitesh Lal 	}, {
20495208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha224),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_sha224_des3_ede_cbc_enc_tv_temp,
20575208ed2cSNitesh Lal 					.count =
20585208ed2cSNitesh Lal 					HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
2059bca4feb0SHoria Geanta 				}
2060bca4feb0SHoria Geanta 			}
2061bca4feb0SHoria Geanta 		}
2062bca4feb0SHoria Geanta 	}, {
2063e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha256),cbc(aes))",
2064e46e9a46SHoria Geanta 		.test = alg_test_aead,
2065e46e9a46SHoria Geanta 		.fips_allowed = 1,
2066e46e9a46SHoria Geanta 		.suite = {
2067e46e9a46SHoria Geanta 			.aead = {
2068e46e9a46SHoria Geanta 				.enc = {
20695208ed2cSNitesh Lal 					.vecs =
20705208ed2cSNitesh Lal 					hmac_sha256_aes_cbc_enc_tv_temp,
20715208ed2cSNitesh Lal 					.count =
20725208ed2cSNitesh Lal 					HMAC_SHA256_AES_CBC_ENC_TEST_VEC
20735208ed2cSNitesh Lal 				}
20745208ed2cSNitesh Lal 			}
20755208ed2cSNitesh Lal 		}
20765208ed2cSNitesh Lal 	}, {
20775208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha256),cbc(des))",
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_sha256_des_cbc_enc_tv_temp,
20855208ed2cSNitesh Lal 					.count =
20865208ed2cSNitesh Lal 					HMAC_SHA256_DES_CBC_ENC_TEST_VEC
20875208ed2cSNitesh Lal 				}
20885208ed2cSNitesh Lal 			}
20895208ed2cSNitesh Lal 		}
20905208ed2cSNitesh Lal 	}, {
20915208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
20925208ed2cSNitesh Lal 		.test = alg_test_aead,
20935208ed2cSNitesh Lal 		.fips_allowed = 1,
20945208ed2cSNitesh Lal 		.suite = {
20955208ed2cSNitesh Lal 			.aead = {
20965208ed2cSNitesh Lal 				.enc = {
20975208ed2cSNitesh Lal 					.vecs =
20985208ed2cSNitesh Lal 					hmac_sha256_des3_ede_cbc_enc_tv_temp,
20995208ed2cSNitesh Lal 					.count =
21005208ed2cSNitesh Lal 					HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
21015208ed2cSNitesh Lal 				}
21025208ed2cSNitesh Lal 			}
21035208ed2cSNitesh Lal 		}
21045208ed2cSNitesh Lal 	}, {
21055208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha384),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_sha384_des_cbc_enc_tv_temp,
21135208ed2cSNitesh Lal 					.count =
21145208ed2cSNitesh Lal 					HMAC_SHA384_DES_CBC_ENC_TEST_VEC
21155208ed2cSNitesh Lal 				}
21165208ed2cSNitesh Lal 			}
21175208ed2cSNitesh Lal 		}
21185208ed2cSNitesh Lal 	}, {
21195208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha384),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_sha384_des3_ede_cbc_enc_tv_temp,
21275208ed2cSNitesh Lal 					.count =
21285208ed2cSNitesh Lal 					HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC
2129e46e9a46SHoria Geanta 				}
2130e46e9a46SHoria Geanta 			}
2131e46e9a46SHoria Geanta 		}
2132e46e9a46SHoria Geanta 	}, {
2133e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha512),cbc(aes))",
2134e46e9a46SHoria Geanta 		.test = alg_test_aead,
2135e46e9a46SHoria Geanta 		.fips_allowed = 1,
2136e46e9a46SHoria Geanta 		.suite = {
2137e46e9a46SHoria Geanta 			.aead = {
2138e46e9a46SHoria Geanta 				.enc = {
21395208ed2cSNitesh Lal 					.vecs =
21405208ed2cSNitesh Lal 					hmac_sha512_aes_cbc_enc_tv_temp,
21415208ed2cSNitesh Lal 					.count =
21425208ed2cSNitesh Lal 					HMAC_SHA512_AES_CBC_ENC_TEST_VEC
21435208ed2cSNitesh Lal 				}
21445208ed2cSNitesh Lal 			}
21455208ed2cSNitesh Lal 		}
21465208ed2cSNitesh Lal 	}, {
21475208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha512),cbc(des))",
21485208ed2cSNitesh Lal 		.test = alg_test_aead,
21495208ed2cSNitesh Lal 		.fips_allowed = 1,
21505208ed2cSNitesh Lal 		.suite = {
21515208ed2cSNitesh Lal 			.aead = {
21525208ed2cSNitesh Lal 				.enc = {
21535208ed2cSNitesh Lal 					.vecs =
21545208ed2cSNitesh Lal 					hmac_sha512_des_cbc_enc_tv_temp,
21555208ed2cSNitesh Lal 					.count =
21565208ed2cSNitesh Lal 					HMAC_SHA512_DES_CBC_ENC_TEST_VEC
21575208ed2cSNitesh Lal 				}
21585208ed2cSNitesh Lal 			}
21595208ed2cSNitesh Lal 		}
21605208ed2cSNitesh Lal 	}, {
21615208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
21625208ed2cSNitesh Lal 		.test = alg_test_aead,
21635208ed2cSNitesh Lal 		.fips_allowed = 1,
21645208ed2cSNitesh Lal 		.suite = {
21655208ed2cSNitesh Lal 			.aead = {
21665208ed2cSNitesh Lal 				.enc = {
21675208ed2cSNitesh Lal 					.vecs =
21685208ed2cSNitesh Lal 					hmac_sha512_des3_ede_cbc_enc_tv_temp,
21695208ed2cSNitesh Lal 					.count =
21705208ed2cSNitesh Lal 					HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
2171e46e9a46SHoria Geanta 				}
2172e46e9a46SHoria Geanta 			}
2173e46e9a46SHoria Geanta 		}
2174e46e9a46SHoria Geanta 	}, {
2175da7f033dSHerbert Xu 		.alg = "cbc(aes)",
21761aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2177a1915d51SJarod Wilson 		.fips_allowed = 1,
2178da7f033dSHerbert Xu 		.suite = {
2179da7f033dSHerbert Xu 			.cipher = {
2180da7f033dSHerbert Xu 				.enc = {
2181da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
2182da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
2183da7f033dSHerbert Xu 				},
2184da7f033dSHerbert Xu 				.dec = {
2185da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
2186da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
2187da7f033dSHerbert Xu 				}
2188da7f033dSHerbert Xu 			}
2189da7f033dSHerbert Xu 		}
2190da7f033dSHerbert Xu 	}, {
2191da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
21921aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2193da7f033dSHerbert Xu 		.suite = {
2194da7f033dSHerbert Xu 			.cipher = {
2195da7f033dSHerbert Xu 				.enc = {
2196da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
2197da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
2198da7f033dSHerbert Xu 				},
2199da7f033dSHerbert Xu 				.dec = {
2200da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
2201da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
2202da7f033dSHerbert Xu 				}
2203da7f033dSHerbert Xu 			}
2204da7f033dSHerbert Xu 		}
2205da7f033dSHerbert Xu 	}, {
2206da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
22071aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2208da7f033dSHerbert Xu 		.suite = {
2209da7f033dSHerbert Xu 			.cipher = {
2210da7f033dSHerbert Xu 				.enc = {
2211da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
2212da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
2213da7f033dSHerbert Xu 				},
2214da7f033dSHerbert Xu 				.dec = {
2215da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
2216da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
2217da7f033dSHerbert Xu 				}
2218da7f033dSHerbert Xu 			}
2219da7f033dSHerbert Xu 		}
2220da7f033dSHerbert Xu 	}, {
2221da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
22221aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2223da7f033dSHerbert Xu 		.suite = {
2224da7f033dSHerbert Xu 			.cipher = {
2225da7f033dSHerbert Xu 				.enc = {
2226da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
2227da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
2228da7f033dSHerbert Xu 				},
2229da7f033dSHerbert Xu 				.dec = {
2230da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
2231da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
2232da7f033dSHerbert Xu 				}
2233da7f033dSHerbert Xu 			}
2234da7f033dSHerbert Xu 		}
2235da7f033dSHerbert Xu 	}, {
2236a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2237a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2238a2c58260SJohannes Goetzfried 		.suite = {
2239a2c58260SJohannes Goetzfried 			.cipher = {
2240a2c58260SJohannes Goetzfried 				.enc = {
2241a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
2242a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
2243a2c58260SJohannes Goetzfried 				},
2244a2c58260SJohannes Goetzfried 				.dec = {
2245a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
2246a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
2247a2c58260SJohannes Goetzfried 				}
2248a2c58260SJohannes Goetzfried 			}
2249a2c58260SJohannes Goetzfried 		}
2250a2c58260SJohannes Goetzfried 	}, {
22519b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
22529b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
22539b8b0405SJohannes Goetzfried 		.suite = {
22549b8b0405SJohannes Goetzfried 			.cipher = {
22559b8b0405SJohannes Goetzfried 				.enc = {
22569b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
22579b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
22589b8b0405SJohannes Goetzfried 				},
22599b8b0405SJohannes Goetzfried 				.dec = {
22609b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
22619b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
22629b8b0405SJohannes Goetzfried 				}
22639b8b0405SJohannes Goetzfried 			}
22649b8b0405SJohannes Goetzfried 		}
22659b8b0405SJohannes Goetzfried 	}, {
2266da7f033dSHerbert Xu 		.alg = "cbc(des)",
22671aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2268da7f033dSHerbert Xu 		.suite = {
2269da7f033dSHerbert Xu 			.cipher = {
2270da7f033dSHerbert Xu 				.enc = {
2271da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
2272da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
2273da7f033dSHerbert Xu 				},
2274da7f033dSHerbert Xu 				.dec = {
2275da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
2276da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
2277da7f033dSHerbert Xu 				}
2278da7f033dSHerbert Xu 			}
2279da7f033dSHerbert Xu 		}
2280da7f033dSHerbert Xu 	}, {
2281da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
22821aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2283a1915d51SJarod Wilson 		.fips_allowed = 1,
2284da7f033dSHerbert Xu 		.suite = {
2285da7f033dSHerbert Xu 			.cipher = {
2286da7f033dSHerbert Xu 				.enc = {
2287da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
2288da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
2289da7f033dSHerbert Xu 				},
2290da7f033dSHerbert Xu 				.dec = {
2291da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
2292da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
2293da7f033dSHerbert Xu 				}
2294da7f033dSHerbert Xu 			}
2295da7f033dSHerbert Xu 		}
2296da7f033dSHerbert Xu 	}, {
22979d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
22989d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
22999d25917dSJussi Kivilinna 		.suite = {
23009d25917dSJussi Kivilinna 			.cipher = {
23019d25917dSJussi Kivilinna 				.enc = {
23029d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
23039d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
23049d25917dSJussi Kivilinna 				},
23059d25917dSJussi Kivilinna 				.dec = {
23069d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
23079d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
23089d25917dSJussi Kivilinna 				}
23099d25917dSJussi Kivilinna 			}
23109d25917dSJussi Kivilinna 		}
23119d25917dSJussi Kivilinna 	}, {
2312da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
23131aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2314da7f033dSHerbert Xu 		.suite = {
2315da7f033dSHerbert Xu 			.cipher = {
2316da7f033dSHerbert Xu 				.enc = {
2317da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
2318da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
2319da7f033dSHerbert Xu 				},
2320da7f033dSHerbert Xu 				.dec = {
2321da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
2322da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
2323da7f033dSHerbert Xu 				}
2324da7f033dSHerbert Xu 			}
2325da7f033dSHerbert Xu 		}
2326da7f033dSHerbert Xu 	}, {
2327da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2328da7f033dSHerbert Xu 		.test = alg_test_aead,
2329a1915d51SJarod Wilson 		.fips_allowed = 1,
2330da7f033dSHerbert Xu 		.suite = {
2331da7f033dSHerbert Xu 			.aead = {
2332da7f033dSHerbert Xu 				.enc = {
2333da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
2334da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
2335da7f033dSHerbert Xu 				},
2336da7f033dSHerbert Xu 				.dec = {
2337da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
2338da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
2339da7f033dSHerbert Xu 				}
2340da7f033dSHerbert Xu 			}
2341da7f033dSHerbert Xu 		}
2342da7f033dSHerbert Xu 	}, {
234393b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
234493b5e86aSJussi Kivilinna 		.test = alg_test_hash,
234593b5e86aSJussi Kivilinna 		.suite = {
234693b5e86aSJussi Kivilinna 			.hash = {
234793b5e86aSJussi Kivilinna 				.vecs = aes_cmac128_tv_template,
234893b5e86aSJussi Kivilinna 				.count = CMAC_AES_TEST_VECTORS
234993b5e86aSJussi Kivilinna 			}
235093b5e86aSJussi Kivilinna 		}
235193b5e86aSJussi Kivilinna 	}, {
235293b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
235393b5e86aSJussi Kivilinna 		.test = alg_test_hash,
235493b5e86aSJussi Kivilinna 		.suite = {
235593b5e86aSJussi Kivilinna 			.hash = {
235693b5e86aSJussi Kivilinna 				.vecs = des3_ede_cmac64_tv_template,
235793b5e86aSJussi Kivilinna 				.count = CMAC_DES3_EDE_TEST_VECTORS
235893b5e86aSJussi Kivilinna 			}
235993b5e86aSJussi Kivilinna 		}
236093b5e86aSJussi Kivilinna 	}, {
2361e448370dSJussi Kivilinna 		.alg = "compress_null",
2362e448370dSJussi Kivilinna 		.test = alg_test_null,
2363e448370dSJussi Kivilinna 	}, {
2364da7f033dSHerbert Xu 		.alg = "crc32c",
23658e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2366a1915d51SJarod Wilson 		.fips_allowed = 1,
2367da7f033dSHerbert Xu 		.suite = {
2368da7f033dSHerbert Xu 			.hash = {
2369da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
2370da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
2371da7f033dSHerbert Xu 			}
2372da7f033dSHerbert Xu 		}
2373da7f033dSHerbert Xu 	}, {
237468411521SHerbert Xu 		.alg = "crct10dif",
237568411521SHerbert Xu 		.test = alg_test_hash,
237668411521SHerbert Xu 		.fips_allowed = 1,
237768411521SHerbert Xu 		.suite = {
237868411521SHerbert Xu 			.hash = {
237968411521SHerbert Xu 				.vecs = crct10dif_tv_template,
238068411521SHerbert Xu 				.count = CRCT10DIF_TEST_VECTORS
238168411521SHerbert Xu 			}
238268411521SHerbert Xu 		}
238368411521SHerbert Xu 	}, {
23846c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
23856c79294fSMilan Broz 		.test = alg_test_null,
23866c79294fSMilan Broz 		.fips_allowed = 1,
23876c79294fSMilan Broz 	}, {
2388d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni)",
2389d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2390d9b1d2e7SJussi Kivilinna 	}, {
2391f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2392f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2393f3f935a7SJussi Kivilinna 	}, {
239456d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-serpent-avx2)",
239556d76c96SJussi Kivilinna 		.test = alg_test_null,
239656d76c96SJussi Kivilinna 	}, {
2397863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
2398863b557aSYouquan, Song 		.test = alg_test_null,
23996c79294fSMilan Broz 		.fips_allowed = 1,
2400863b557aSYouquan, Song 	}, {
2401d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni)",
2402d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2403d9b1d2e7SJussi Kivilinna 	}, {
2404f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2405f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2406f3f935a7SJussi Kivilinna 	}, {
24074d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
24084d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
24094d6d6a2cSJohannes Goetzfried 	}, {
24104ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
24114ea1277dSJohannes Goetzfried 		.test = alg_test_null,
24124ea1277dSJohannes Goetzfried 	}, {
24137efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
24147efe4076SJohannes Goetzfried 		.test = alg_test_null,
24157efe4076SJohannes Goetzfried 	}, {
241656d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-avx2)",
241756d76c96SJussi Kivilinna 		.test = alg_test_null,
241856d76c96SJussi Kivilinna 	}, {
2419937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
2420937c30d7SJussi Kivilinna 		.test = alg_test_null,
2421937c30d7SJussi Kivilinna 	}, {
2422107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
2423107778b5SJohannes Goetzfried 		.test = alg_test_null,
2424107778b5SJohannes Goetzfried 	}, {
24256c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
24266c79294fSMilan Broz 		.test = alg_test_null,
24276c79294fSMilan Broz 		.fips_allowed = 1,
24286c79294fSMilan Broz 	}, {
2429863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2430863b557aSYouquan, Song 		.test = alg_test_null,
24316c79294fSMilan Broz 		.fips_allowed = 1,
2432863b557aSYouquan, Song 	}, {
2433f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2434f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2435a1915d51SJarod Wilson 		.fips_allowed = 1,
2436f7cb80f2SJarod Wilson 		.suite = {
2437f7cb80f2SJarod Wilson 			.cipher = {
2438f7cb80f2SJarod Wilson 				.enc = {
2439f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2440f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2441f7cb80f2SJarod Wilson 				},
2442f7cb80f2SJarod Wilson 				.dec = {
2443f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2444f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2445f7cb80f2SJarod Wilson 				}
2446f7cb80f2SJarod Wilson 			}
2447f7cb80f2SJarod Wilson 		}
2448f7cb80f2SJarod Wilson 	}, {
244985b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
245085b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
245185b63e34SJussi Kivilinna 		.suite = {
245285b63e34SJussi Kivilinna 			.cipher = {
245385b63e34SJussi Kivilinna 				.enc = {
245485b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
245585b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
245685b63e34SJussi Kivilinna 				},
245785b63e34SJussi Kivilinna 				.dec = {
245885b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
245985b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
246085b63e34SJussi Kivilinna 				}
246185b63e34SJussi Kivilinna 			}
246285b63e34SJussi Kivilinna 		}
246385b63e34SJussi Kivilinna 	}, {
24640840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
24650840605eSJussi Kivilinna 		.test = alg_test_skcipher,
24660840605eSJussi Kivilinna 		.suite = {
24670840605eSJussi Kivilinna 			.cipher = {
24680840605eSJussi Kivilinna 				.enc = {
24690840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
24700840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
24710840605eSJussi Kivilinna 				},
24720840605eSJussi Kivilinna 				.dec = {
24730840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
24740840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
24750840605eSJussi Kivilinna 				}
24760840605eSJussi Kivilinna 			}
24770840605eSJussi Kivilinna 		}
24780840605eSJussi Kivilinna 	}, {
2479a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2480a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2481a2c58260SJohannes Goetzfried 		.suite = {
2482a2c58260SJohannes Goetzfried 			.cipher = {
2483a2c58260SJohannes Goetzfried 				.enc = {
2484a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2485a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2486a2c58260SJohannes Goetzfried 				},
2487a2c58260SJohannes Goetzfried 				.dec = {
2488a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2489a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2490a2c58260SJohannes Goetzfried 				}
2491a2c58260SJohannes Goetzfried 			}
2492a2c58260SJohannes Goetzfried 		}
2493a2c58260SJohannes Goetzfried 	}, {
24949b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
24959b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
24969b8b0405SJohannes Goetzfried 		.suite = {
24979b8b0405SJohannes Goetzfried 			.cipher = {
24989b8b0405SJohannes Goetzfried 				.enc = {
24999b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
25009b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
25019b8b0405SJohannes Goetzfried 				},
25029b8b0405SJohannes Goetzfried 				.dec = {
25039b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
25049b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
25059b8b0405SJohannes Goetzfried 				}
25069b8b0405SJohannes Goetzfried 			}
25079b8b0405SJohannes Goetzfried 		}
25089b8b0405SJohannes Goetzfried 	}, {
25098163fc30SJussi Kivilinna 		.alg = "ctr(des)",
25108163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
25118163fc30SJussi Kivilinna 		.suite = {
25128163fc30SJussi Kivilinna 			.cipher = {
25138163fc30SJussi Kivilinna 				.enc = {
25148163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
25158163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
25168163fc30SJussi Kivilinna 				},
25178163fc30SJussi Kivilinna 				.dec = {
25188163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
25198163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
25208163fc30SJussi Kivilinna 				}
25218163fc30SJussi Kivilinna 			}
25228163fc30SJussi Kivilinna 		}
25238163fc30SJussi Kivilinna 	}, {
2524e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2525e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2526e080b17aSJussi Kivilinna 		.suite = {
2527e080b17aSJussi Kivilinna 			.cipher = {
2528e080b17aSJussi Kivilinna 				.enc = {
2529e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2530e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2531e080b17aSJussi Kivilinna 				},
2532e080b17aSJussi Kivilinna 				.dec = {
2533e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2534e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2535e080b17aSJussi Kivilinna 				}
2536e080b17aSJussi Kivilinna 			}
2537e080b17aSJussi Kivilinna 		}
2538e080b17aSJussi Kivilinna 	}, {
25399d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
25409d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
25419d25917dSJussi Kivilinna 		.suite = {
25429d25917dSJussi Kivilinna 			.cipher = {
25439d25917dSJussi Kivilinna 				.enc = {
25449d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
25459d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
25469d25917dSJussi Kivilinna 				},
25479d25917dSJussi Kivilinna 				.dec = {
25489d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
25499d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
25509d25917dSJussi Kivilinna 				}
25519d25917dSJussi Kivilinna 			}
25529d25917dSJussi Kivilinna 		}
25539d25917dSJussi Kivilinna 	}, {
2554573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2555573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2556573da620SJussi Kivilinna 		.suite = {
2557573da620SJussi Kivilinna 			.cipher = {
2558573da620SJussi Kivilinna 				.enc = {
2559573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2560573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2561573da620SJussi Kivilinna 				},
2562573da620SJussi Kivilinna 				.dec = {
2563573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2564573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2565573da620SJussi Kivilinna 				}
2566573da620SJussi Kivilinna 			}
2567573da620SJussi Kivilinna 		}
2568573da620SJussi Kivilinna 	}, {
2569da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
25701aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2571da7f033dSHerbert Xu 		.suite = {
2572da7f033dSHerbert Xu 			.cipher = {
2573da7f033dSHerbert Xu 				.enc = {
2574da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2575da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2576da7f033dSHerbert Xu 				},
2577da7f033dSHerbert Xu 				.dec = {
2578da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2579da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2580da7f033dSHerbert Xu 				}
2581da7f033dSHerbert Xu 			}
2582da7f033dSHerbert Xu 		}
2583da7f033dSHerbert Xu 	}, {
2584da7f033dSHerbert Xu 		.alg = "deflate",
2585da7f033dSHerbert Xu 		.test = alg_test_comp,
25860818904dSMilan Broz 		.fips_allowed = 1,
2587da7f033dSHerbert Xu 		.suite = {
2588da7f033dSHerbert Xu 			.comp = {
2589da7f033dSHerbert Xu 				.comp = {
2590da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2591da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2592da7f033dSHerbert Xu 				},
2593da7f033dSHerbert Xu 				.decomp = {
2594da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2595da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2596da7f033dSHerbert Xu 				}
2597da7f033dSHerbert Xu 			}
2598da7f033dSHerbert Xu 		}
2599da7f033dSHerbert Xu 	}, {
2600e448370dSJussi Kivilinna 		.alg = "digest_null",
2601e448370dSJussi Kivilinna 		.test = alg_test_null,
2602e448370dSJussi Kivilinna 	}, {
260364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes128",
260464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
260564d1cdfbSStephan Mueller 		.fips_allowed = 1,
260664d1cdfbSStephan Mueller 		.suite = {
260764d1cdfbSStephan Mueller 			.drbg = {
260864d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes128_tv_template,
260964d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
261064d1cdfbSStephan Mueller 			}
261164d1cdfbSStephan Mueller 		}
261264d1cdfbSStephan Mueller 	}, {
261364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes192",
261464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
261564d1cdfbSStephan Mueller 		.fips_allowed = 1,
261664d1cdfbSStephan Mueller 		.suite = {
261764d1cdfbSStephan Mueller 			.drbg = {
261864d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes192_tv_template,
261964d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
262064d1cdfbSStephan Mueller 			}
262164d1cdfbSStephan Mueller 		}
262264d1cdfbSStephan Mueller 	}, {
262364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes256",
262464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
262564d1cdfbSStephan Mueller 		.fips_allowed = 1,
262664d1cdfbSStephan Mueller 		.suite = {
262764d1cdfbSStephan Mueller 			.drbg = {
262864d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes256_tv_template,
262964d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
263064d1cdfbSStephan Mueller 			}
263164d1cdfbSStephan Mueller 		}
263264d1cdfbSStephan Mueller 	}, {
263364d1cdfbSStephan Mueller 		/*
263464d1cdfbSStephan Mueller 		 * There is no need to specifically test the DRBG with every
263564d1cdfbSStephan Mueller 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
263664d1cdfbSStephan Mueller 		 */
263764d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha1",
263864d1cdfbSStephan Mueller 		.fips_allowed = 1,
263964d1cdfbSStephan Mueller 		.test = alg_test_null,
264064d1cdfbSStephan Mueller 	}, {
264164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha256",
264264d1cdfbSStephan Mueller 		.test = alg_test_drbg,
264364d1cdfbSStephan Mueller 		.fips_allowed = 1,
264464d1cdfbSStephan Mueller 		.suite = {
264564d1cdfbSStephan Mueller 			.drbg = {
264664d1cdfbSStephan Mueller 				.vecs = drbg_nopr_hmac_sha256_tv_template,
264764d1cdfbSStephan Mueller 				.count =
264864d1cdfbSStephan Mueller 				ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
264964d1cdfbSStephan Mueller 			}
265064d1cdfbSStephan Mueller 		}
265164d1cdfbSStephan Mueller 	}, {
265264d1cdfbSStephan Mueller 		/* covered by drbg_nopr_hmac_sha256 test */
265364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha384",
265464d1cdfbSStephan Mueller 		.fips_allowed = 1,
265564d1cdfbSStephan Mueller 		.test = alg_test_null,
265664d1cdfbSStephan Mueller 	}, {
265764d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha512",
265864d1cdfbSStephan Mueller 		.test = alg_test_null,
265964d1cdfbSStephan Mueller 		.fips_allowed = 1,
266064d1cdfbSStephan Mueller 	}, {
266164d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha1",
266264d1cdfbSStephan Mueller 		.fips_allowed = 1,
266364d1cdfbSStephan Mueller 		.test = alg_test_null,
266464d1cdfbSStephan Mueller 	}, {
266564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha256",
266664d1cdfbSStephan Mueller 		.test = alg_test_drbg,
266764d1cdfbSStephan Mueller 		.fips_allowed = 1,
266864d1cdfbSStephan Mueller 		.suite = {
266964d1cdfbSStephan Mueller 			.drbg = {
267064d1cdfbSStephan Mueller 				.vecs = drbg_nopr_sha256_tv_template,
267164d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
267264d1cdfbSStephan Mueller 			}
267364d1cdfbSStephan Mueller 		}
267464d1cdfbSStephan Mueller 	}, {
267564d1cdfbSStephan Mueller 		/* covered by drbg_nopr_sha256 test */
267664d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha384",
267764d1cdfbSStephan Mueller 		.fips_allowed = 1,
267864d1cdfbSStephan Mueller 		.test = alg_test_null,
267964d1cdfbSStephan Mueller 	}, {
268064d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha512",
268164d1cdfbSStephan Mueller 		.fips_allowed = 1,
268264d1cdfbSStephan Mueller 		.test = alg_test_null,
268364d1cdfbSStephan Mueller 	}, {
268464d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes128",
268564d1cdfbSStephan Mueller 		.test = alg_test_drbg,
268664d1cdfbSStephan Mueller 		.fips_allowed = 1,
268764d1cdfbSStephan Mueller 		.suite = {
268864d1cdfbSStephan Mueller 			.drbg = {
268964d1cdfbSStephan Mueller 				.vecs = drbg_pr_ctr_aes128_tv_template,
269064d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
269164d1cdfbSStephan Mueller 			}
269264d1cdfbSStephan Mueller 		}
269364d1cdfbSStephan Mueller 	}, {
269464d1cdfbSStephan Mueller 		/* covered by drbg_pr_ctr_aes128 test */
269564d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes192",
269664d1cdfbSStephan Mueller 		.fips_allowed = 1,
269764d1cdfbSStephan Mueller 		.test = alg_test_null,
269864d1cdfbSStephan Mueller 	}, {
269964d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes256",
270064d1cdfbSStephan Mueller 		.fips_allowed = 1,
270164d1cdfbSStephan Mueller 		.test = alg_test_null,
270264d1cdfbSStephan Mueller 	}, {
270364d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha1",
270464d1cdfbSStephan Mueller 		.fips_allowed = 1,
270564d1cdfbSStephan Mueller 		.test = alg_test_null,
270664d1cdfbSStephan Mueller 	}, {
270764d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha256",
270864d1cdfbSStephan Mueller 		.test = alg_test_drbg,
270964d1cdfbSStephan Mueller 		.fips_allowed = 1,
271064d1cdfbSStephan Mueller 		.suite = {
271164d1cdfbSStephan Mueller 			.drbg = {
271264d1cdfbSStephan Mueller 				.vecs = drbg_pr_hmac_sha256_tv_template,
271364d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
271464d1cdfbSStephan Mueller 			}
271564d1cdfbSStephan Mueller 		}
271664d1cdfbSStephan Mueller 	}, {
271764d1cdfbSStephan Mueller 		/* covered by drbg_pr_hmac_sha256 test */
271864d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha384",
271964d1cdfbSStephan Mueller 		.fips_allowed = 1,
272064d1cdfbSStephan Mueller 		.test = alg_test_null,
272164d1cdfbSStephan Mueller 	}, {
272264d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha512",
272364d1cdfbSStephan Mueller 		.test = alg_test_null,
272464d1cdfbSStephan Mueller 		.fips_allowed = 1,
272564d1cdfbSStephan Mueller 	}, {
272664d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha1",
272764d1cdfbSStephan Mueller 		.fips_allowed = 1,
272864d1cdfbSStephan Mueller 		.test = alg_test_null,
272964d1cdfbSStephan Mueller 	}, {
273064d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha256",
273164d1cdfbSStephan Mueller 		.test = alg_test_drbg,
273264d1cdfbSStephan Mueller 		.fips_allowed = 1,
273364d1cdfbSStephan Mueller 		.suite = {
273464d1cdfbSStephan Mueller 			.drbg = {
273564d1cdfbSStephan Mueller 				.vecs = drbg_pr_sha256_tv_template,
273664d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
273764d1cdfbSStephan Mueller 			}
273864d1cdfbSStephan Mueller 		}
273964d1cdfbSStephan Mueller 	}, {
274064d1cdfbSStephan Mueller 		/* covered by drbg_pr_sha256 test */
274164d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha384",
274264d1cdfbSStephan Mueller 		.fips_allowed = 1,
274364d1cdfbSStephan Mueller 		.test = alg_test_null,
274464d1cdfbSStephan Mueller 	}, {
274564d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha512",
274664d1cdfbSStephan Mueller 		.fips_allowed = 1,
274764d1cdfbSStephan Mueller 		.test = alg_test_null,
274864d1cdfbSStephan Mueller 	}, {
2749863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2750863b557aSYouquan, Song 		.test = alg_test_null,
27516c79294fSMilan Broz 		.fips_allowed = 1,
2752863b557aSYouquan, Song 	}, {
2753da7f033dSHerbert Xu 		.alg = "ecb(aes)",
27541aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2755a1915d51SJarod Wilson 		.fips_allowed = 1,
2756da7f033dSHerbert Xu 		.suite = {
2757da7f033dSHerbert Xu 			.cipher = {
2758da7f033dSHerbert Xu 				.enc = {
2759da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2760da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2761da7f033dSHerbert Xu 				},
2762da7f033dSHerbert Xu 				.dec = {
2763da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2764da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2765da7f033dSHerbert Xu 				}
2766da7f033dSHerbert Xu 			}
2767da7f033dSHerbert Xu 		}
2768da7f033dSHerbert Xu 	}, {
2769da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
27701aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2771da7f033dSHerbert Xu 		.suite = {
2772da7f033dSHerbert Xu 			.cipher = {
2773da7f033dSHerbert Xu 				.enc = {
2774da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2775da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2776da7f033dSHerbert Xu 				},
2777da7f033dSHerbert Xu 				.dec = {
2778da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2779da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2780da7f033dSHerbert Xu 				}
2781da7f033dSHerbert Xu 			}
2782da7f033dSHerbert Xu 		}
2783da7f033dSHerbert Xu 	}, {
2784da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
27851aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2786da7f033dSHerbert Xu 		.suite = {
2787da7f033dSHerbert Xu 			.cipher = {
2788da7f033dSHerbert Xu 				.enc = {
2789da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2790da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2791da7f033dSHerbert Xu 				},
2792da7f033dSHerbert Xu 				.dec = {
2793da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2794da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2795da7f033dSHerbert Xu 				}
2796da7f033dSHerbert Xu 			}
2797da7f033dSHerbert Xu 		}
2798da7f033dSHerbert Xu 	}, {
2799da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
28001aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2801da7f033dSHerbert Xu 		.suite = {
2802da7f033dSHerbert Xu 			.cipher = {
2803da7f033dSHerbert Xu 				.enc = {
2804da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2805da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2806da7f033dSHerbert Xu 				},
2807da7f033dSHerbert Xu 				.dec = {
2808da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2809da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2810da7f033dSHerbert Xu 				}
2811da7f033dSHerbert Xu 			}
2812da7f033dSHerbert Xu 		}
2813da7f033dSHerbert Xu 	}, {
2814da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
28151aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2816da7f033dSHerbert Xu 		.suite = {
2817da7f033dSHerbert Xu 			.cipher = {
2818da7f033dSHerbert Xu 				.enc = {
2819da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2820da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2821da7f033dSHerbert Xu 				},
2822da7f033dSHerbert Xu 				.dec = {
2823da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2824da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2825da7f033dSHerbert Xu 				}
2826da7f033dSHerbert Xu 			}
2827da7f033dSHerbert Xu 		}
2828da7f033dSHerbert Xu 	}, {
2829da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
28301aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2831da7f033dSHerbert Xu 		.suite = {
2832da7f033dSHerbert Xu 			.cipher = {
2833da7f033dSHerbert Xu 				.enc = {
2834da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2835da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2836da7f033dSHerbert Xu 				},
2837da7f033dSHerbert Xu 				.dec = {
2838da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2839da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2840da7f033dSHerbert Xu 				}
2841da7f033dSHerbert Xu 			}
2842da7f033dSHerbert Xu 		}
2843da7f033dSHerbert Xu 	}, {
2844da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
28451aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2846da7f033dSHerbert Xu 		.suite = {
2847da7f033dSHerbert Xu 			.cipher = {
2848da7f033dSHerbert Xu 				.enc = {
2849da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2850da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
2851da7f033dSHerbert Xu 				},
2852da7f033dSHerbert Xu 				.dec = {
2853da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
2854da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
2855da7f033dSHerbert Xu 				}
2856da7f033dSHerbert Xu 			}
2857da7f033dSHerbert Xu 		}
2858da7f033dSHerbert Xu 	}, {
2859e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
2860e448370dSJussi Kivilinna 		.test = alg_test_null,
2861e448370dSJussi Kivilinna 	}, {
2862da7f033dSHerbert Xu 		.alg = "ecb(des)",
28631aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2864a1915d51SJarod Wilson 		.fips_allowed = 1,
2865da7f033dSHerbert Xu 		.suite = {
2866da7f033dSHerbert Xu 			.cipher = {
2867da7f033dSHerbert Xu 				.enc = {
2868da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
2869da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
2870da7f033dSHerbert Xu 				},
2871da7f033dSHerbert Xu 				.dec = {
2872da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
2873da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
2874da7f033dSHerbert Xu 				}
2875da7f033dSHerbert Xu 			}
2876da7f033dSHerbert Xu 		}
2877da7f033dSHerbert Xu 	}, {
2878da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
28791aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2880a1915d51SJarod Wilson 		.fips_allowed = 1,
2881da7f033dSHerbert Xu 		.suite = {
2882da7f033dSHerbert Xu 			.cipher = {
2883da7f033dSHerbert Xu 				.enc = {
2884da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
2885da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
2886da7f033dSHerbert Xu 				},
2887da7f033dSHerbert Xu 				.dec = {
2888da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
2889da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
2890da7f033dSHerbert Xu 				}
2891da7f033dSHerbert Xu 			}
2892da7f033dSHerbert Xu 		}
2893da7f033dSHerbert Xu 	}, {
289466e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
289566e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
289666e5bd00SJussi Kivilinna 		.suite = {
289766e5bd00SJussi Kivilinna 			.cipher = {
289866e5bd00SJussi Kivilinna 				.enc = {
289966e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
290066e5bd00SJussi Kivilinna 					.count = 1
290166e5bd00SJussi Kivilinna 				},
290266e5bd00SJussi Kivilinna 				.dec = {
290366e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
290466e5bd00SJussi Kivilinna 					.count = 1
290566e5bd00SJussi Kivilinna 				}
290666e5bd00SJussi Kivilinna 			}
290766e5bd00SJussi Kivilinna 		}
290866e5bd00SJussi Kivilinna 	}, {
2909da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
29101aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2911da7f033dSHerbert Xu 		.suite = {
2912da7f033dSHerbert Xu 			.cipher = {
2913da7f033dSHerbert Xu 				.enc = {
2914da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
2915da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
2916da7f033dSHerbert Xu 				},
2917da7f033dSHerbert Xu 				.dec = {
2918da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
2919da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
2920da7f033dSHerbert Xu 				}
2921da7f033dSHerbert Xu 			}
2922da7f033dSHerbert Xu 		}
2923da7f033dSHerbert Xu 	}, {
2924da7f033dSHerbert Xu 		.alg = "ecb(seed)",
29251aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2926da7f033dSHerbert Xu 		.suite = {
2927da7f033dSHerbert Xu 			.cipher = {
2928da7f033dSHerbert Xu 				.enc = {
2929da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
2930da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
2931da7f033dSHerbert Xu 				},
2932da7f033dSHerbert Xu 				.dec = {
2933da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
2934da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
2935da7f033dSHerbert Xu 				}
2936da7f033dSHerbert Xu 			}
2937da7f033dSHerbert Xu 		}
2938da7f033dSHerbert Xu 	}, {
2939da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
29401aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2941da7f033dSHerbert Xu 		.suite = {
2942da7f033dSHerbert Xu 			.cipher = {
2943da7f033dSHerbert Xu 				.enc = {
2944da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
2945da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
2946da7f033dSHerbert Xu 				},
2947da7f033dSHerbert Xu 				.dec = {
2948da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
2949da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
2950da7f033dSHerbert Xu 				}
2951da7f033dSHerbert Xu 			}
2952da7f033dSHerbert Xu 		}
2953da7f033dSHerbert Xu 	}, {
2954da7f033dSHerbert Xu 		.alg = "ecb(tea)",
29551aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2956da7f033dSHerbert Xu 		.suite = {
2957da7f033dSHerbert Xu 			.cipher = {
2958da7f033dSHerbert Xu 				.enc = {
2959da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
2960da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
2961da7f033dSHerbert Xu 				},
2962da7f033dSHerbert Xu 				.dec = {
2963da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
2964da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
2965da7f033dSHerbert Xu 				}
2966da7f033dSHerbert Xu 			}
2967da7f033dSHerbert Xu 		}
2968da7f033dSHerbert Xu 	}, {
2969da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
29701aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2971da7f033dSHerbert Xu 		.suite = {
2972da7f033dSHerbert Xu 			.cipher = {
2973da7f033dSHerbert Xu 				.enc = {
2974da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
2975da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
2976da7f033dSHerbert Xu 				},
2977da7f033dSHerbert Xu 				.dec = {
2978da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
2979da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
2980da7f033dSHerbert Xu 				}
2981da7f033dSHerbert Xu 			}
2982da7f033dSHerbert Xu 		}
2983da7f033dSHerbert Xu 	}, {
2984da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
29851aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2986da7f033dSHerbert Xu 		.suite = {
2987da7f033dSHerbert Xu 			.cipher = {
2988da7f033dSHerbert Xu 				.enc = {
2989da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
2990da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
2991da7f033dSHerbert Xu 				},
2992da7f033dSHerbert Xu 				.dec = {
2993da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
2994da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
2995da7f033dSHerbert Xu 				}
2996da7f033dSHerbert Xu 			}
2997da7f033dSHerbert Xu 		}
2998da7f033dSHerbert Xu 	}, {
2999da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
30001aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3001da7f033dSHerbert Xu 		.suite = {
3002da7f033dSHerbert Xu 			.cipher = {
3003da7f033dSHerbert Xu 				.enc = {
3004da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
3005da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
3006da7f033dSHerbert Xu 				},
3007da7f033dSHerbert Xu 				.dec = {
3008da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
3009da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
3010da7f033dSHerbert Xu 				}
3011da7f033dSHerbert Xu 			}
3012da7f033dSHerbert Xu 		}
3013da7f033dSHerbert Xu 	}, {
3014da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
30151aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3016da7f033dSHerbert Xu 		.suite = {
3017da7f033dSHerbert Xu 			.cipher = {
3018da7f033dSHerbert Xu 				.enc = {
3019da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
3020da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
3021da7f033dSHerbert Xu 				},
3022da7f033dSHerbert Xu 				.dec = {
3023da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
3024da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
3025da7f033dSHerbert Xu 				}
3026da7f033dSHerbert Xu 			}
3027da7f033dSHerbert Xu 		}
3028da7f033dSHerbert Xu 	}, {
3029da7f033dSHerbert Xu 		.alg = "gcm(aes)",
3030da7f033dSHerbert Xu 		.test = alg_test_aead,
3031a1915d51SJarod Wilson 		.fips_allowed = 1,
3032da7f033dSHerbert Xu 		.suite = {
3033da7f033dSHerbert Xu 			.aead = {
3034da7f033dSHerbert Xu 				.enc = {
3035da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
3036da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
3037da7f033dSHerbert Xu 				},
3038da7f033dSHerbert Xu 				.dec = {
3039da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
3040da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
3041da7f033dSHerbert Xu 				}
3042da7f033dSHerbert Xu 			}
3043da7f033dSHerbert Xu 		}
3044da7f033dSHerbert Xu 	}, {
3045507069c9SYouquan, Song 		.alg = "ghash",
3046507069c9SYouquan, Song 		.test = alg_test_hash,
304718c0ebd2SJarod Wilson 		.fips_allowed = 1,
3048507069c9SYouquan, Song 		.suite = {
3049507069c9SYouquan, Song 			.hash = {
3050507069c9SYouquan, Song 				.vecs = ghash_tv_template,
3051507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
3052507069c9SYouquan, Song 			}
3053507069c9SYouquan, Song 		}
3054507069c9SYouquan, Song 	}, {
3055a482b081SSonic Zhang 		.alg = "hmac(crc32)",
3056a482b081SSonic Zhang 		.test = alg_test_hash,
3057a482b081SSonic Zhang 		.suite = {
3058a482b081SSonic Zhang 			.hash = {
3059a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
3060a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
3061a482b081SSonic Zhang 			}
3062a482b081SSonic Zhang 		}
3063a482b081SSonic Zhang 	}, {
3064da7f033dSHerbert Xu 		.alg = "hmac(md5)",
3065da7f033dSHerbert Xu 		.test = alg_test_hash,
3066da7f033dSHerbert Xu 		.suite = {
3067da7f033dSHerbert Xu 			.hash = {
3068da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
3069da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
3070da7f033dSHerbert Xu 			}
3071da7f033dSHerbert Xu 		}
3072da7f033dSHerbert Xu 	}, {
3073da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
3074da7f033dSHerbert Xu 		.test = alg_test_hash,
3075da7f033dSHerbert Xu 		.suite = {
3076da7f033dSHerbert Xu 			.hash = {
3077da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
3078da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
3079da7f033dSHerbert Xu 			}
3080da7f033dSHerbert Xu 		}
3081da7f033dSHerbert Xu 	}, {
3082da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
3083da7f033dSHerbert Xu 		.test = alg_test_hash,
3084da7f033dSHerbert Xu 		.suite = {
3085da7f033dSHerbert Xu 			.hash = {
3086da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
3087da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
3088da7f033dSHerbert Xu 			}
3089da7f033dSHerbert Xu 		}
3090da7f033dSHerbert Xu 	}, {
3091da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
3092da7f033dSHerbert Xu 		.test = alg_test_hash,
3093a1915d51SJarod Wilson 		.fips_allowed = 1,
3094da7f033dSHerbert Xu 		.suite = {
3095da7f033dSHerbert Xu 			.hash = {
3096da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
3097da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
3098da7f033dSHerbert Xu 			}
3099da7f033dSHerbert Xu 		}
3100da7f033dSHerbert Xu 	}, {
3101da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
3102da7f033dSHerbert Xu 		.test = alg_test_hash,
3103a1915d51SJarod Wilson 		.fips_allowed = 1,
3104da7f033dSHerbert Xu 		.suite = {
3105da7f033dSHerbert Xu 			.hash = {
3106da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
3107da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
3108da7f033dSHerbert Xu 			}
3109da7f033dSHerbert Xu 		}
3110da7f033dSHerbert Xu 	}, {
3111da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
3112da7f033dSHerbert Xu 		.test = alg_test_hash,
3113a1915d51SJarod Wilson 		.fips_allowed = 1,
3114da7f033dSHerbert Xu 		.suite = {
3115da7f033dSHerbert Xu 			.hash = {
3116da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
3117da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
3118da7f033dSHerbert Xu 			}
3119da7f033dSHerbert Xu 		}
3120da7f033dSHerbert Xu 	}, {
3121da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
3122da7f033dSHerbert Xu 		.test = alg_test_hash,
3123a1915d51SJarod Wilson 		.fips_allowed = 1,
3124da7f033dSHerbert Xu 		.suite = {
3125da7f033dSHerbert Xu 			.hash = {
3126da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
3127da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
3128da7f033dSHerbert Xu 			}
3129da7f033dSHerbert Xu 		}
3130da7f033dSHerbert Xu 	}, {
3131da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
3132da7f033dSHerbert Xu 		.test = alg_test_hash,
3133a1915d51SJarod Wilson 		.fips_allowed = 1,
3134da7f033dSHerbert Xu 		.suite = {
3135da7f033dSHerbert Xu 			.hash = {
3136da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
3137da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
3138da7f033dSHerbert Xu 			}
3139da7f033dSHerbert Xu 		}
3140da7f033dSHerbert Xu 	}, {
3141da7f033dSHerbert Xu 		.alg = "lrw(aes)",
31421aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3143da7f033dSHerbert Xu 		.suite = {
3144da7f033dSHerbert Xu 			.cipher = {
3145da7f033dSHerbert Xu 				.enc = {
3146da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
3147da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
3148da7f033dSHerbert Xu 				},
3149da7f033dSHerbert Xu 				.dec = {
3150da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
3151da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
3152da7f033dSHerbert Xu 				}
3153da7f033dSHerbert Xu 			}
3154da7f033dSHerbert Xu 		}
3155da7f033dSHerbert Xu 	}, {
31560840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
31570840605eSJussi Kivilinna 		.test = alg_test_skcipher,
31580840605eSJussi Kivilinna 		.suite = {
31590840605eSJussi Kivilinna 			.cipher = {
31600840605eSJussi Kivilinna 				.enc = {
31610840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
31620840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
31630840605eSJussi Kivilinna 				},
31640840605eSJussi Kivilinna 				.dec = {
31650840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
31660840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
31670840605eSJussi Kivilinna 				}
31680840605eSJussi Kivilinna 			}
31690840605eSJussi Kivilinna 		}
31700840605eSJussi Kivilinna 	}, {
31719b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
31729b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
31739b8b0405SJohannes Goetzfried 		.suite = {
31749b8b0405SJohannes Goetzfried 			.cipher = {
31759b8b0405SJohannes Goetzfried 				.enc = {
31769b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
31779b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
31789b8b0405SJohannes Goetzfried 				},
31799b8b0405SJohannes Goetzfried 				.dec = {
31809b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
31819b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
31829b8b0405SJohannes Goetzfried 				}
31839b8b0405SJohannes Goetzfried 			}
31849b8b0405SJohannes Goetzfried 		}
31859b8b0405SJohannes Goetzfried 	}, {
3186d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
3187d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
3188d7bfc0faSJussi Kivilinna 		.suite = {
3189d7bfc0faSJussi Kivilinna 			.cipher = {
3190d7bfc0faSJussi Kivilinna 				.enc = {
3191d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
3192d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
3193d7bfc0faSJussi Kivilinna 				},
3194d7bfc0faSJussi Kivilinna 				.dec = {
3195d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
3196d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
3197d7bfc0faSJussi Kivilinna 				}
3198d7bfc0faSJussi Kivilinna 			}
3199d7bfc0faSJussi Kivilinna 		}
3200d7bfc0faSJussi Kivilinna 	}, {
32010b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
32020b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
32030b2a1551SJussi Kivilinna 		.suite = {
32040b2a1551SJussi Kivilinna 			.cipher = {
32050b2a1551SJussi Kivilinna 				.enc = {
32060b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
32070b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
32080b2a1551SJussi Kivilinna 				},
32090b2a1551SJussi Kivilinna 				.dec = {
32100b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
32110b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
32120b2a1551SJussi Kivilinna 				}
32130b2a1551SJussi Kivilinna 			}
32140b2a1551SJussi Kivilinna 		}
32150b2a1551SJussi Kivilinna 	}, {
3216da7f033dSHerbert Xu 		.alg = "lzo",
3217da7f033dSHerbert Xu 		.test = alg_test_comp,
32180818904dSMilan Broz 		.fips_allowed = 1,
3219da7f033dSHerbert Xu 		.suite = {
3220da7f033dSHerbert Xu 			.comp = {
3221da7f033dSHerbert Xu 				.comp = {
3222da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
3223da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
3224da7f033dSHerbert Xu 				},
3225da7f033dSHerbert Xu 				.decomp = {
3226da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
3227da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
3228da7f033dSHerbert Xu 				}
3229da7f033dSHerbert Xu 			}
3230da7f033dSHerbert Xu 		}
3231da7f033dSHerbert Xu 	}, {
3232da7f033dSHerbert Xu 		.alg = "md4",
3233da7f033dSHerbert Xu 		.test = alg_test_hash,
3234da7f033dSHerbert Xu 		.suite = {
3235da7f033dSHerbert Xu 			.hash = {
3236da7f033dSHerbert Xu 				.vecs = md4_tv_template,
3237da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
3238da7f033dSHerbert Xu 			}
3239da7f033dSHerbert Xu 		}
3240da7f033dSHerbert Xu 	}, {
3241da7f033dSHerbert Xu 		.alg = "md5",
3242da7f033dSHerbert Xu 		.test = alg_test_hash,
3243da7f033dSHerbert Xu 		.suite = {
3244da7f033dSHerbert Xu 			.hash = {
3245da7f033dSHerbert Xu 				.vecs = md5_tv_template,
3246da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
3247da7f033dSHerbert Xu 			}
3248da7f033dSHerbert Xu 		}
3249da7f033dSHerbert Xu 	}, {
3250da7f033dSHerbert Xu 		.alg = "michael_mic",
3251da7f033dSHerbert Xu 		.test = alg_test_hash,
3252da7f033dSHerbert Xu 		.suite = {
3253da7f033dSHerbert Xu 			.hash = {
3254da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
3255da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
3256da7f033dSHerbert Xu 			}
3257da7f033dSHerbert Xu 		}
3258da7f033dSHerbert Xu 	}, {
3259ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
3260ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
3261ba0e14acSPuneet Saxena 		.fips_allowed = 1,
3262ba0e14acSPuneet Saxena 		.suite = {
3263ba0e14acSPuneet Saxena 			.cipher = {
3264ba0e14acSPuneet Saxena 				.enc = {
3265ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
3266ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
3267ba0e14acSPuneet Saxena 				},
3268ba0e14acSPuneet Saxena 				.dec = {
3269ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
3270ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
3271ba0e14acSPuneet Saxena 				}
3272ba0e14acSPuneet Saxena 			}
3273ba0e14acSPuneet Saxena 		}
3274ba0e14acSPuneet Saxena 	}, {
3275da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
32761aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3277da7f033dSHerbert Xu 		.suite = {
3278da7f033dSHerbert Xu 			.cipher = {
3279da7f033dSHerbert Xu 				.enc = {
3280da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
3281da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
3282da7f033dSHerbert Xu 				},
3283da7f033dSHerbert Xu 				.dec = {
3284da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
3285da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
3286da7f033dSHerbert Xu 				}
3287da7f033dSHerbert Xu 			}
3288da7f033dSHerbert Xu 		}
3289da7f033dSHerbert Xu 	}, {
3290da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
32911aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3292a1915d51SJarod Wilson 		.fips_allowed = 1,
3293da7f033dSHerbert Xu 		.suite = {
3294da7f033dSHerbert Xu 			.cipher = {
3295da7f033dSHerbert Xu 				.enc = {
3296f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
3297f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
3298da7f033dSHerbert Xu 				},
3299da7f033dSHerbert Xu 				.dec = {
3300f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
3301f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
3302da7f033dSHerbert Xu 				}
3303da7f033dSHerbert Xu 			}
3304da7f033dSHerbert Xu 		}
3305da7f033dSHerbert Xu 	}, {
330669435b94SAdrian Hoban 		.alg = "rfc4106(gcm(aes))",
330769435b94SAdrian Hoban 		.test = alg_test_aead,
330869435b94SAdrian Hoban 		.suite = {
330969435b94SAdrian Hoban 			.aead = {
331069435b94SAdrian Hoban 				.enc = {
331169435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
331269435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
331369435b94SAdrian Hoban 				},
331469435b94SAdrian Hoban 				.dec = {
331569435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
331669435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
331769435b94SAdrian Hoban 				}
331869435b94SAdrian Hoban 			}
331969435b94SAdrian Hoban 		}
332069435b94SAdrian Hoban 	}, {
33215d667322SJarod Wilson 		.alg = "rfc4309(ccm(aes))",
33225d667322SJarod Wilson 		.test = alg_test_aead,
3323a1915d51SJarod Wilson 		.fips_allowed = 1,
33245d667322SJarod Wilson 		.suite = {
33255d667322SJarod Wilson 			.aead = {
33265d667322SJarod Wilson 				.enc = {
33275d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
33285d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
33295d667322SJarod Wilson 				},
33305d667322SJarod Wilson 				.dec = {
33315d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
33325d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
33335d667322SJarod Wilson 				}
33345d667322SJarod Wilson 			}
33355d667322SJarod Wilson 		}
33365d667322SJarod Wilson 	}, {
3337e9b7441aSJussi Kivilinna 		.alg = "rfc4543(gcm(aes))",
3338e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
3339e9b7441aSJussi Kivilinna 		.suite = {
3340e9b7441aSJussi Kivilinna 			.aead = {
3341e9b7441aSJussi Kivilinna 				.enc = {
3342e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_enc_tv_template,
3343e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_ENC_TEST_VECTORS
3344e9b7441aSJussi Kivilinna 				},
3345e9b7441aSJussi Kivilinna 				.dec = {
3346e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_dec_tv_template,
3347e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_DEC_TEST_VECTORS
3348e9b7441aSJussi Kivilinna 				},
3349e9b7441aSJussi Kivilinna 			}
3350e9b7441aSJussi Kivilinna 		}
3351e9b7441aSJussi Kivilinna 	}, {
3352da7f033dSHerbert Xu 		.alg = "rmd128",
3353da7f033dSHerbert Xu 		.test = alg_test_hash,
3354da7f033dSHerbert Xu 		.suite = {
3355da7f033dSHerbert Xu 			.hash = {
3356da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
3357da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
3358da7f033dSHerbert Xu 			}
3359da7f033dSHerbert Xu 		}
3360da7f033dSHerbert Xu 	}, {
3361da7f033dSHerbert Xu 		.alg = "rmd160",
3362da7f033dSHerbert Xu 		.test = alg_test_hash,
3363da7f033dSHerbert Xu 		.suite = {
3364da7f033dSHerbert Xu 			.hash = {
3365da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
3366da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
3367da7f033dSHerbert Xu 			}
3368da7f033dSHerbert Xu 		}
3369da7f033dSHerbert Xu 	}, {
3370da7f033dSHerbert Xu 		.alg = "rmd256",
3371da7f033dSHerbert Xu 		.test = alg_test_hash,
3372da7f033dSHerbert Xu 		.suite = {
3373da7f033dSHerbert Xu 			.hash = {
3374da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
3375da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
3376da7f033dSHerbert Xu 			}
3377da7f033dSHerbert Xu 		}
3378da7f033dSHerbert Xu 	}, {
3379da7f033dSHerbert Xu 		.alg = "rmd320",
3380da7f033dSHerbert Xu 		.test = alg_test_hash,
3381da7f033dSHerbert Xu 		.suite = {
3382da7f033dSHerbert Xu 			.hash = {
3383da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
3384da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
3385da7f033dSHerbert Xu 			}
3386da7f033dSHerbert Xu 		}
3387da7f033dSHerbert Xu 	}, {
3388da7f033dSHerbert Xu 		.alg = "salsa20",
33891aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3390da7f033dSHerbert Xu 		.suite = {
3391da7f033dSHerbert Xu 			.cipher = {
3392da7f033dSHerbert Xu 				.enc = {
3393da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
3394da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
3395da7f033dSHerbert Xu 				}
3396da7f033dSHerbert Xu 			}
3397da7f033dSHerbert Xu 		}
3398da7f033dSHerbert Xu 	}, {
3399da7f033dSHerbert Xu 		.alg = "sha1",
3400da7f033dSHerbert Xu 		.test = alg_test_hash,
3401a1915d51SJarod Wilson 		.fips_allowed = 1,
3402da7f033dSHerbert Xu 		.suite = {
3403da7f033dSHerbert Xu 			.hash = {
3404da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
3405da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
3406da7f033dSHerbert Xu 			}
3407da7f033dSHerbert Xu 		}
3408da7f033dSHerbert Xu 	}, {
3409da7f033dSHerbert Xu 		.alg = "sha224",
3410da7f033dSHerbert Xu 		.test = alg_test_hash,
3411a1915d51SJarod Wilson 		.fips_allowed = 1,
3412da7f033dSHerbert Xu 		.suite = {
3413da7f033dSHerbert Xu 			.hash = {
3414da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
3415da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
3416da7f033dSHerbert Xu 			}
3417da7f033dSHerbert Xu 		}
3418da7f033dSHerbert Xu 	}, {
3419da7f033dSHerbert Xu 		.alg = "sha256",
3420da7f033dSHerbert Xu 		.test = alg_test_hash,
3421a1915d51SJarod Wilson 		.fips_allowed = 1,
3422da7f033dSHerbert Xu 		.suite = {
3423da7f033dSHerbert Xu 			.hash = {
3424da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
3425da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
3426da7f033dSHerbert Xu 			}
3427da7f033dSHerbert Xu 		}
3428da7f033dSHerbert Xu 	}, {
3429da7f033dSHerbert Xu 		.alg = "sha384",
3430da7f033dSHerbert Xu 		.test = alg_test_hash,
3431a1915d51SJarod Wilson 		.fips_allowed = 1,
3432da7f033dSHerbert Xu 		.suite = {
3433da7f033dSHerbert Xu 			.hash = {
3434da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
3435da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
3436da7f033dSHerbert Xu 			}
3437da7f033dSHerbert Xu 		}
3438da7f033dSHerbert Xu 	}, {
3439da7f033dSHerbert Xu 		.alg = "sha512",
3440da7f033dSHerbert Xu 		.test = alg_test_hash,
3441a1915d51SJarod Wilson 		.fips_allowed = 1,
3442da7f033dSHerbert Xu 		.suite = {
3443da7f033dSHerbert Xu 			.hash = {
3444da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
3445da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
3446da7f033dSHerbert Xu 			}
3447da7f033dSHerbert Xu 		}
3448da7f033dSHerbert Xu 	}, {
3449da7f033dSHerbert Xu 		.alg = "tgr128",
3450da7f033dSHerbert Xu 		.test = alg_test_hash,
3451da7f033dSHerbert Xu 		.suite = {
3452da7f033dSHerbert Xu 			.hash = {
3453da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
3454da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
3455da7f033dSHerbert Xu 			}
3456da7f033dSHerbert Xu 		}
3457da7f033dSHerbert Xu 	}, {
3458da7f033dSHerbert Xu 		.alg = "tgr160",
3459da7f033dSHerbert Xu 		.test = alg_test_hash,
3460da7f033dSHerbert Xu 		.suite = {
3461da7f033dSHerbert Xu 			.hash = {
3462da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
3463da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
3464da7f033dSHerbert Xu 			}
3465da7f033dSHerbert Xu 		}
3466da7f033dSHerbert Xu 	}, {
3467da7f033dSHerbert Xu 		.alg = "tgr192",
3468da7f033dSHerbert Xu 		.test = alg_test_hash,
3469da7f033dSHerbert Xu 		.suite = {
3470da7f033dSHerbert Xu 			.hash = {
3471da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
3472da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
3473da7f033dSHerbert Xu 			}
3474da7f033dSHerbert Xu 		}
3475da7f033dSHerbert Xu 	}, {
3476f1939f7cSShane Wang 		.alg = "vmac(aes)",
3477f1939f7cSShane Wang 		.test = alg_test_hash,
3478f1939f7cSShane Wang 		.suite = {
3479f1939f7cSShane Wang 			.hash = {
3480f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
3481f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
3482f1939f7cSShane Wang 			}
3483f1939f7cSShane Wang 		}
3484f1939f7cSShane Wang 	}, {
3485da7f033dSHerbert Xu 		.alg = "wp256",
3486da7f033dSHerbert Xu 		.test = alg_test_hash,
3487da7f033dSHerbert Xu 		.suite = {
3488da7f033dSHerbert Xu 			.hash = {
3489da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
3490da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
3491da7f033dSHerbert Xu 			}
3492da7f033dSHerbert Xu 		}
3493da7f033dSHerbert Xu 	}, {
3494da7f033dSHerbert Xu 		.alg = "wp384",
3495da7f033dSHerbert Xu 		.test = alg_test_hash,
3496da7f033dSHerbert Xu 		.suite = {
3497da7f033dSHerbert Xu 			.hash = {
3498da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
3499da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
3500da7f033dSHerbert Xu 			}
3501da7f033dSHerbert Xu 		}
3502da7f033dSHerbert Xu 	}, {
3503da7f033dSHerbert Xu 		.alg = "wp512",
3504da7f033dSHerbert Xu 		.test = alg_test_hash,
3505da7f033dSHerbert Xu 		.suite = {
3506da7f033dSHerbert Xu 			.hash = {
3507da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
3508da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
3509da7f033dSHerbert Xu 			}
3510da7f033dSHerbert Xu 		}
3511da7f033dSHerbert Xu 	}, {
3512da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3513da7f033dSHerbert Xu 		.test = alg_test_hash,
3514da7f033dSHerbert Xu 		.suite = {
3515da7f033dSHerbert Xu 			.hash = {
3516da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
3517da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
3518da7f033dSHerbert Xu 			}
3519da7f033dSHerbert Xu 		}
3520da7f033dSHerbert Xu 	}, {
3521da7f033dSHerbert Xu 		.alg = "xts(aes)",
35221aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
35232918aa8dSJarod Wilson 		.fips_allowed = 1,
3524da7f033dSHerbert Xu 		.suite = {
3525da7f033dSHerbert Xu 			.cipher = {
3526da7f033dSHerbert Xu 				.enc = {
3527da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
3528da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
3529da7f033dSHerbert Xu 				},
3530da7f033dSHerbert Xu 				.dec = {
3531da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
3532da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
3533da7f033dSHerbert Xu 				}
3534da7f033dSHerbert Xu 			}
3535da7f033dSHerbert Xu 		}
35360c01aed5SGeert Uytterhoeven 	}, {
35370840605eSJussi Kivilinna 		.alg = "xts(camellia)",
35380840605eSJussi Kivilinna 		.test = alg_test_skcipher,
35390840605eSJussi Kivilinna 		.suite = {
35400840605eSJussi Kivilinna 			.cipher = {
35410840605eSJussi Kivilinna 				.enc = {
35420840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
35430840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
35440840605eSJussi Kivilinna 				},
35450840605eSJussi Kivilinna 				.dec = {
35460840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
35470840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
35480840605eSJussi Kivilinna 				}
35490840605eSJussi Kivilinna 			}
35500840605eSJussi Kivilinna 		}
35510840605eSJussi Kivilinna 	}, {
35529b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
35539b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
35549b8b0405SJohannes Goetzfried 		.suite = {
35559b8b0405SJohannes Goetzfried 			.cipher = {
35569b8b0405SJohannes Goetzfried 				.enc = {
35579b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
35589b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
35599b8b0405SJohannes Goetzfried 				},
35609b8b0405SJohannes Goetzfried 				.dec = {
35619b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
35629b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
35639b8b0405SJohannes Goetzfried 				}
35649b8b0405SJohannes Goetzfried 			}
35659b8b0405SJohannes Goetzfried 		}
35669b8b0405SJohannes Goetzfried 	}, {
356718be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
356818be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
356918be20b9SJussi Kivilinna 		.suite = {
357018be20b9SJussi Kivilinna 			.cipher = {
357118be20b9SJussi Kivilinna 				.enc = {
357218be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
357318be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
357418be20b9SJussi Kivilinna 				},
357518be20b9SJussi Kivilinna 				.dec = {
357618be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
357718be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
357818be20b9SJussi Kivilinna 				}
357918be20b9SJussi Kivilinna 			}
358018be20b9SJussi Kivilinna 		}
358118be20b9SJussi Kivilinna 	}, {
3582aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3583aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3584aed265b9SJussi Kivilinna 		.suite = {
3585aed265b9SJussi Kivilinna 			.cipher = {
3586aed265b9SJussi Kivilinna 				.enc = {
3587aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
3588aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
3589aed265b9SJussi Kivilinna 				},
3590aed265b9SJussi Kivilinna 				.dec = {
3591aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
3592aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
3593aed265b9SJussi Kivilinna 				}
3594aed265b9SJussi Kivilinna 			}
3595aed265b9SJussi Kivilinna 		}
3596aed265b9SJussi Kivilinna 	}, {
35970c01aed5SGeert Uytterhoeven 		.alg = "zlib",
35980c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
35990818904dSMilan Broz 		.fips_allowed = 1,
36000c01aed5SGeert Uytterhoeven 		.suite = {
36010c01aed5SGeert Uytterhoeven 			.pcomp = {
36020c01aed5SGeert Uytterhoeven 				.comp = {
36030c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
36040c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
36050c01aed5SGeert Uytterhoeven 				},
36060c01aed5SGeert Uytterhoeven 				.decomp = {
36070c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
36080c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
36090c01aed5SGeert Uytterhoeven 				}
36100c01aed5SGeert Uytterhoeven 			}
36110c01aed5SGeert Uytterhoeven 		}
3612da7f033dSHerbert Xu 	}
3613da7f033dSHerbert Xu };
3614da7f033dSHerbert Xu 
36155714758bSJussi Kivilinna static bool alg_test_descs_checked;
36165714758bSJussi Kivilinna 
36175714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
36185714758bSJussi Kivilinna {
36195714758bSJussi Kivilinna 	int i;
36205714758bSJussi Kivilinna 
36215714758bSJussi Kivilinna 	/* only check once */
36225714758bSJussi Kivilinna 	if (alg_test_descs_checked)
36235714758bSJussi Kivilinna 		return;
36245714758bSJussi Kivilinna 
36255714758bSJussi Kivilinna 	alg_test_descs_checked = true;
36265714758bSJussi Kivilinna 
36275714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
36285714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
36295714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
36305714758bSJussi Kivilinna 
36315714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
36325714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
36335714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
36345714758bSJussi Kivilinna 				alg_test_descs[i].alg);
36355714758bSJussi Kivilinna 		}
36365714758bSJussi Kivilinna 
36375714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
36385714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
36395714758bSJussi Kivilinna 				alg_test_descs[i].alg);
36405714758bSJussi Kivilinna 		}
36415714758bSJussi Kivilinna 	}
36425714758bSJussi Kivilinna }
36435714758bSJussi Kivilinna 
36441aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3645da7f033dSHerbert Xu {
3646da7f033dSHerbert Xu 	int start = 0;
3647da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3648da7f033dSHerbert Xu 
3649da7f033dSHerbert Xu 	while (start < end) {
3650da7f033dSHerbert Xu 		int i = (start + end) / 2;
3651da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3652da7f033dSHerbert Xu 
3653da7f033dSHerbert Xu 		if (diff > 0) {
3654da7f033dSHerbert Xu 			end = i;
3655da7f033dSHerbert Xu 			continue;
3656da7f033dSHerbert Xu 		}
3657da7f033dSHerbert Xu 
3658da7f033dSHerbert Xu 		if (diff < 0) {
3659da7f033dSHerbert Xu 			start = i + 1;
3660da7f033dSHerbert Xu 			continue;
3661da7f033dSHerbert Xu 		}
3662da7f033dSHerbert Xu 
36631aa4ecd9SHerbert Xu 		return i;
3664da7f033dSHerbert Xu 	}
3665da7f033dSHerbert Xu 
36661aa4ecd9SHerbert Xu 	return -1;
36671aa4ecd9SHerbert Xu }
36681aa4ecd9SHerbert Xu 
36691aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
36701aa4ecd9SHerbert Xu {
36711aa4ecd9SHerbert Xu 	int i;
3672a68f6610SHerbert Xu 	int j;
3673d12d6b6dSNeil Horman 	int rc;
36741aa4ecd9SHerbert Xu 
36755714758bSJussi Kivilinna 	alg_test_descs_check_order();
36765714758bSJussi Kivilinna 
36771aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
36781aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
36791aa4ecd9SHerbert Xu 
36801aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
36811aa4ecd9SHerbert Xu 		    sizeof(nalg))
36821aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
36831aa4ecd9SHerbert Xu 
36841aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
36851aa4ecd9SHerbert Xu 		if (i < 0)
36861aa4ecd9SHerbert Xu 			goto notest;
36871aa4ecd9SHerbert Xu 
3688a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3689a3bef3a3SJarod Wilson 			goto non_fips_alg;
3690a3bef3a3SJarod Wilson 
3691941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3692941fb328SJarod Wilson 		goto test_done;
36931aa4ecd9SHerbert Xu 	}
36941aa4ecd9SHerbert Xu 
36951aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3696a68f6610SHerbert Xu 	j = alg_find_test(driver);
3697a68f6610SHerbert Xu 	if (i < 0 && j < 0)
36981aa4ecd9SHerbert Xu 		goto notest;
36991aa4ecd9SHerbert Xu 
3700a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3701a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3702a3bef3a3SJarod Wilson 		goto non_fips_alg;
3703a3bef3a3SJarod Wilson 
3704a68f6610SHerbert Xu 	rc = 0;
3705a68f6610SHerbert Xu 	if (i >= 0)
3706a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
37071aa4ecd9SHerbert Xu 					     type, mask);
3708032c8cacSCristian Stoica 	if (j >= 0 && j != i)
3709a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3710a68f6610SHerbert Xu 					     type, mask);
3711a68f6610SHerbert Xu 
3712941fb328SJarod Wilson test_done:
3713d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3714d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3715d12d6b6dSNeil Horman 
371629ecd4abSJarod Wilson 	if (fips_enabled && !rc)
37175208ed2cSNitesh Lal 		pr_info(KERN_INFO "alg: self-tests for %s (%s) passed\n",
371829ecd4abSJarod Wilson 			driver, alg);
371929ecd4abSJarod Wilson 
3720d12d6b6dSNeil Horman 	return rc;
37211aa4ecd9SHerbert Xu 
37221aa4ecd9SHerbert Xu notest:
3723da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3724da7f033dSHerbert Xu 	return 0;
3725a3bef3a3SJarod Wilson non_fips_alg:
3726a3bef3a3SJarod Wilson 	return -EINVAL;
3727da7f033dSHerbert Xu }
37280b767f96SAlexander Shishkin 
3729326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
37300b767f96SAlexander Shishkin 
3731da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3732