xref: /openbmc/linux/crypto/testmgr.c (revision e46e9a46)
1da7f033dSHerbert Xu /*
2da7f033dSHerbert Xu  * Algorithm testing framework and tests.
3da7f033dSHerbert Xu  *
4da7f033dSHerbert Xu  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5da7f033dSHerbert Xu  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6da7f033dSHerbert Xu  * Copyright (c) 2007 Nokia Siemens Networks
7da7f033dSHerbert Xu  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8da7f033dSHerbert Xu  *
969435b94SAdrian Hoban  * Updated RFC4106 AES-GCM testing.
1069435b94SAdrian Hoban  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
1169435b94SAdrian Hoban  *             Adrian Hoban <adrian.hoban@intel.com>
1269435b94SAdrian Hoban  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
1369435b94SAdrian Hoban  *             Tadeusz Struk (tadeusz.struk@intel.com)
1469435b94SAdrian Hoban  *    Copyright (c) 2010, Intel Corporation.
1569435b94SAdrian Hoban  *
16da7f033dSHerbert Xu  * This program is free software; you can redistribute it and/or modify it
17da7f033dSHerbert Xu  * under the terms of the GNU General Public License as published by the Free
18da7f033dSHerbert Xu  * Software Foundation; either version 2 of the License, or (at your option)
19da7f033dSHerbert Xu  * any later version.
20da7f033dSHerbert Xu  *
21da7f033dSHerbert Xu  */
22da7f033dSHerbert Xu 
23da7f033dSHerbert Xu #include <crypto/hash.h>
24da7f033dSHerbert Xu #include <linux/err.h>
25da7f033dSHerbert Xu #include <linux/module.h>
26da7f033dSHerbert Xu #include <linux/scatterlist.h>
27da7f033dSHerbert Xu #include <linux/slab.h>
28da7f033dSHerbert Xu #include <linux/string.h>
297647d6ceSJarod Wilson #include <crypto/rng.h>
30da7f033dSHerbert Xu 
31da7f033dSHerbert Xu #include "internal.h"
320b767f96SAlexander Shishkin 
33326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
340b767f96SAlexander Shishkin 
350b767f96SAlexander Shishkin /* a perfect nop */
360b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
370b767f96SAlexander Shishkin {
380b767f96SAlexander Shishkin 	return 0;
390b767f96SAlexander Shishkin }
400b767f96SAlexander Shishkin 
410b767f96SAlexander Shishkin #else
420b767f96SAlexander Shishkin 
43da7f033dSHerbert Xu #include "testmgr.h"
44da7f033dSHerbert Xu 
45da7f033dSHerbert Xu /*
46da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
47da7f033dSHerbert Xu  */
48da7f033dSHerbert Xu #define XBUFSIZE	8
49da7f033dSHerbert Xu 
50da7f033dSHerbert Xu /*
51da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
52da7f033dSHerbert Xu  */
53da7f033dSHerbert Xu #define IDX1		32
54da7f033dSHerbert Xu #define IDX2		32400
55da7f033dSHerbert Xu #define IDX3		1
56da7f033dSHerbert Xu #define IDX4		8193
57da7f033dSHerbert Xu #define IDX5		22222
58da7f033dSHerbert Xu #define IDX6		17101
59da7f033dSHerbert Xu #define IDX7		27333
60da7f033dSHerbert Xu #define IDX8		3000
61da7f033dSHerbert Xu 
62da7f033dSHerbert Xu /*
63da7f033dSHerbert Xu * Used by test_cipher()
64da7f033dSHerbert Xu */
65da7f033dSHerbert Xu #define ENCRYPT 1
66da7f033dSHerbert Xu #define DECRYPT 0
67da7f033dSHerbert Xu 
68da7f033dSHerbert Xu struct tcrypt_result {
69da7f033dSHerbert Xu 	struct completion completion;
70da7f033dSHerbert Xu 	int err;
71da7f033dSHerbert Xu };
72da7f033dSHerbert Xu 
73da7f033dSHerbert Xu struct aead_test_suite {
74da7f033dSHerbert Xu 	struct {
75da7f033dSHerbert Xu 		struct aead_testvec *vecs;
76da7f033dSHerbert Xu 		unsigned int count;
77da7f033dSHerbert Xu 	} enc, dec;
78da7f033dSHerbert Xu };
79da7f033dSHerbert Xu 
80da7f033dSHerbert Xu struct cipher_test_suite {
81da7f033dSHerbert Xu 	struct {
82da7f033dSHerbert Xu 		struct cipher_testvec *vecs;
83da7f033dSHerbert Xu 		unsigned int count;
84da7f033dSHerbert Xu 	} enc, dec;
85da7f033dSHerbert Xu };
86da7f033dSHerbert Xu 
87da7f033dSHerbert Xu struct comp_test_suite {
88da7f033dSHerbert Xu 	struct {
89da7f033dSHerbert Xu 		struct comp_testvec *vecs;
90da7f033dSHerbert Xu 		unsigned int count;
91da7f033dSHerbert Xu 	} comp, decomp;
92da7f033dSHerbert Xu };
93da7f033dSHerbert Xu 
948064efb8SGeert Uytterhoeven struct pcomp_test_suite {
958064efb8SGeert Uytterhoeven 	struct {
968064efb8SGeert Uytterhoeven 		struct pcomp_testvec *vecs;
978064efb8SGeert Uytterhoeven 		unsigned int count;
988064efb8SGeert Uytterhoeven 	} comp, decomp;
998064efb8SGeert Uytterhoeven };
1008064efb8SGeert Uytterhoeven 
101da7f033dSHerbert Xu struct hash_test_suite {
102da7f033dSHerbert Xu 	struct hash_testvec *vecs;
103da7f033dSHerbert Xu 	unsigned int count;
104da7f033dSHerbert Xu };
105da7f033dSHerbert Xu 
1067647d6ceSJarod Wilson struct cprng_test_suite {
1077647d6ceSJarod Wilson 	struct cprng_testvec *vecs;
1087647d6ceSJarod Wilson 	unsigned int count;
1097647d6ceSJarod Wilson };
1107647d6ceSJarod Wilson 
111da7f033dSHerbert Xu struct alg_test_desc {
112da7f033dSHerbert Xu 	const char *alg;
113da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
114da7f033dSHerbert Xu 		    u32 type, u32 mask);
115a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
116da7f033dSHerbert Xu 
117da7f033dSHerbert Xu 	union {
118da7f033dSHerbert Xu 		struct aead_test_suite aead;
119da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
120da7f033dSHerbert Xu 		struct comp_test_suite comp;
1218064efb8SGeert Uytterhoeven 		struct pcomp_test_suite pcomp;
122da7f033dSHerbert Xu 		struct hash_test_suite hash;
1237647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
124da7f033dSHerbert Xu 	} suite;
125da7f033dSHerbert Xu };
126da7f033dSHerbert Xu 
127da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
128da7f033dSHerbert Xu 
129da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
130da7f033dSHerbert Xu {
131da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
132da7f033dSHerbert Xu 			16, 1,
133da7f033dSHerbert Xu 			buf, len, false);
134da7f033dSHerbert Xu }
135da7f033dSHerbert Xu 
136da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
137da7f033dSHerbert Xu {
138da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
139da7f033dSHerbert Xu 
140da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
141da7f033dSHerbert Xu 		return;
142da7f033dSHerbert Xu 
143da7f033dSHerbert Xu 	res->err = err;
144da7f033dSHerbert Xu 	complete(&res->completion);
145da7f033dSHerbert Xu }
146da7f033dSHerbert Xu 
147f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
148f8b0d4d0SHerbert Xu {
149f8b0d4d0SHerbert Xu 	int i;
150f8b0d4d0SHerbert Xu 
151f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
152f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
153f8b0d4d0SHerbert Xu 		if (!buf[i])
154f8b0d4d0SHerbert Xu 			goto err_free_buf;
155f8b0d4d0SHerbert Xu 	}
156f8b0d4d0SHerbert Xu 
157f8b0d4d0SHerbert Xu 	return 0;
158f8b0d4d0SHerbert Xu 
159f8b0d4d0SHerbert Xu err_free_buf:
160f8b0d4d0SHerbert Xu 	while (i-- > 0)
161f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
162f8b0d4d0SHerbert Xu 
163f8b0d4d0SHerbert Xu 	return -ENOMEM;
164f8b0d4d0SHerbert Xu }
165f8b0d4d0SHerbert Xu 
166f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
167f8b0d4d0SHerbert Xu {
168f8b0d4d0SHerbert Xu 	int i;
169f8b0d4d0SHerbert Xu 
170f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
171f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
172f8b0d4d0SHerbert Xu }
173f8b0d4d0SHerbert Xu 
174a8f1a052SDavid S. Miller static int do_one_async_hash_op(struct ahash_request *req,
175a8f1a052SDavid S. Miller 				struct tcrypt_result *tr,
176a8f1a052SDavid S. Miller 				int ret)
177a8f1a052SDavid S. Miller {
178a8f1a052SDavid S. Miller 	if (ret == -EINPROGRESS || ret == -EBUSY) {
179a8f1a052SDavid S. Miller 		ret = wait_for_completion_interruptible(&tr->completion);
180a8f1a052SDavid S. Miller 		if (!ret)
181a8f1a052SDavid S. Miller 			ret = tr->err;
182a8f1a052SDavid S. Miller 		INIT_COMPLETION(tr->completion);
183a8f1a052SDavid S. Miller 	}
184a8f1a052SDavid S. Miller 	return ret;
185a8f1a052SDavid S. Miller }
186a8f1a052SDavid S. Miller 
187da7f033dSHerbert Xu static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
188a8f1a052SDavid S. Miller 		     unsigned int tcount, bool use_digest)
189da7f033dSHerbert Xu {
190da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
191da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
192da7f033dSHerbert Xu 	struct scatterlist sg[8];
193da7f033dSHerbert Xu 	char result[64];
194da7f033dSHerbert Xu 	struct ahash_request *req;
195da7f033dSHerbert Xu 	struct tcrypt_result tresult;
196da7f033dSHerbert Xu 	void *hash_buff;
197f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
198f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
199f8b0d4d0SHerbert Xu 
200f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
201f8b0d4d0SHerbert Xu 		goto out_nobuf;
202da7f033dSHerbert Xu 
203da7f033dSHerbert Xu 	init_completion(&tresult.completion);
204da7f033dSHerbert Xu 
205da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
206da7f033dSHerbert Xu 	if (!req) {
207da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
208da7f033dSHerbert Xu 		       "%s\n", algo);
209da7f033dSHerbert Xu 		goto out_noreq;
210da7f033dSHerbert Xu 	}
211da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
212da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
213da7f033dSHerbert Xu 
214a0cfae59SHerbert Xu 	j = 0;
215da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
216a0cfae59SHerbert Xu 		if (template[i].np)
217a0cfae59SHerbert Xu 			continue;
218a0cfae59SHerbert Xu 
219a0cfae59SHerbert Xu 		j++;
220da7f033dSHerbert Xu 		memset(result, 0, 64);
221da7f033dSHerbert Xu 
222da7f033dSHerbert Xu 		hash_buff = xbuf[0];
223da7f033dSHerbert Xu 
224da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
225da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
226da7f033dSHerbert Xu 
227da7f033dSHerbert Xu 		if (template[i].ksize) {
228da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
229da7f033dSHerbert Xu 			ret = crypto_ahash_setkey(tfm, template[i].key,
230da7f033dSHerbert Xu 						  template[i].ksize);
231da7f033dSHerbert Xu 			if (ret) {
232da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
233a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
234da7f033dSHerbert Xu 				       -ret);
235da7f033dSHerbert Xu 				goto out;
236da7f033dSHerbert Xu 			}
237da7f033dSHerbert Xu 		}
238da7f033dSHerbert Xu 
239da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
240a8f1a052SDavid S. Miller 		if (use_digest) {
241a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
242a8f1a052SDavid S. Miller 						   crypto_ahash_digest(req));
243a8f1a052SDavid S. Miller 			if (ret) {
244a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
245a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
246da7f033dSHerbert Xu 				goto out;
247da7f033dSHerbert Xu 			}
248a8f1a052SDavid S. Miller 		} else {
249a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
250a8f1a052SDavid S. Miller 						   crypto_ahash_init(req));
251a8f1a052SDavid S. Miller 			if (ret) {
252a8f1a052SDavid S. Miller 				pr_err("alt: hash: init failed on test %d "
253a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
254a8f1a052SDavid S. Miller 				goto out;
255a8f1a052SDavid S. Miller 			}
256a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
257a8f1a052SDavid S. Miller 						   crypto_ahash_update(req));
258a8f1a052SDavid S. Miller 			if (ret) {
259a8f1a052SDavid S. Miller 				pr_err("alt: hash: update failed on test %d "
260a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
261a8f1a052SDavid S. Miller 				goto out;
262a8f1a052SDavid S. Miller 			}
263a8f1a052SDavid S. Miller 			ret = do_one_async_hash_op(req, &tresult,
264a8f1a052SDavid S. Miller 						   crypto_ahash_final(req));
265a8f1a052SDavid S. Miller 			if (ret) {
266a8f1a052SDavid S. Miller 				pr_err("alt: hash: final failed on test %d "
267a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
268a8f1a052SDavid S. Miller 				goto out;
269a8f1a052SDavid S. Miller 			}
270a8f1a052SDavid S. Miller 		}
271da7f033dSHerbert Xu 
272da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
273da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
274da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
275a0cfae59SHerbert Xu 			       j, algo);
276da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
277da7f033dSHerbert Xu 			ret = -EINVAL;
278da7f033dSHerbert Xu 			goto out;
279da7f033dSHerbert Xu 		}
280da7f033dSHerbert Xu 	}
281da7f033dSHerbert Xu 
282da7f033dSHerbert Xu 	j = 0;
283da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
284da7f033dSHerbert Xu 		if (template[i].np) {
285da7f033dSHerbert Xu 			j++;
286da7f033dSHerbert Xu 			memset(result, 0, 64);
287da7f033dSHerbert Xu 
288da7f033dSHerbert Xu 			temp = 0;
289da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
290fd57f22aSHerbert Xu 			ret = -EINVAL;
291da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
292fd57f22aSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
293fd57f22aSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
294fd57f22aSHerbert Xu 					goto out;
295da7f033dSHerbert Xu 				sg_set_buf(&sg[k],
296da7f033dSHerbert Xu 					   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
297da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
298da7f033dSHerbert Xu 						  template[i].plaintext + temp,
299da7f033dSHerbert Xu 						  template[i].tap[k]),
300da7f033dSHerbert Xu 					   template[i].tap[k]);
301da7f033dSHerbert Xu 				temp += template[i].tap[k];
302da7f033dSHerbert Xu 			}
303da7f033dSHerbert Xu 
304da7f033dSHerbert Xu 			if (template[i].ksize) {
305da7f033dSHerbert Xu 				crypto_ahash_clear_flags(tfm, ~0);
306da7f033dSHerbert Xu 				ret = crypto_ahash_setkey(tfm, template[i].key,
307da7f033dSHerbert Xu 							  template[i].ksize);
308da7f033dSHerbert Xu 
309da7f033dSHerbert Xu 				if (ret) {
310da7f033dSHerbert Xu 					printk(KERN_ERR "alg: hash: setkey "
311da7f033dSHerbert Xu 					       "failed on chunking test %d "
312da7f033dSHerbert Xu 					       "for %s: ret=%d\n", j, algo,
313da7f033dSHerbert Xu 					       -ret);
314da7f033dSHerbert Xu 					goto out;
315da7f033dSHerbert Xu 				}
316da7f033dSHerbert Xu 			}
317da7f033dSHerbert Xu 
318da7f033dSHerbert Xu 			ahash_request_set_crypt(req, sg, result,
319da7f033dSHerbert Xu 						template[i].psize);
320da7f033dSHerbert Xu 			ret = crypto_ahash_digest(req);
321da7f033dSHerbert Xu 			switch (ret) {
322da7f033dSHerbert Xu 			case 0:
323da7f033dSHerbert Xu 				break;
324da7f033dSHerbert Xu 			case -EINPROGRESS:
325da7f033dSHerbert Xu 			case -EBUSY:
326da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
327da7f033dSHerbert Xu 					&tresult.completion);
328da7f033dSHerbert Xu 				if (!ret && !(ret = tresult.err)) {
329da7f033dSHerbert Xu 					INIT_COMPLETION(tresult.completion);
330da7f033dSHerbert Xu 					break;
331da7f033dSHerbert Xu 				}
332da7f033dSHerbert Xu 				/* fall through */
333da7f033dSHerbert Xu 			default:
334da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: digest failed "
335da7f033dSHerbert Xu 				       "on chunking test %d for %s: "
336da7f033dSHerbert Xu 				       "ret=%d\n", j, algo, -ret);
337da7f033dSHerbert Xu 				goto out;
338da7f033dSHerbert Xu 			}
339da7f033dSHerbert Xu 
340da7f033dSHerbert Xu 			if (memcmp(result, template[i].digest,
341da7f033dSHerbert Xu 				   crypto_ahash_digestsize(tfm))) {
342da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: Chunking test %d "
343da7f033dSHerbert Xu 				       "failed for %s\n", j, algo);
344da7f033dSHerbert Xu 				hexdump(result, crypto_ahash_digestsize(tfm));
345da7f033dSHerbert Xu 				ret = -EINVAL;
346da7f033dSHerbert Xu 				goto out;
347da7f033dSHerbert Xu 			}
348da7f033dSHerbert Xu 		}
349da7f033dSHerbert Xu 	}
350da7f033dSHerbert Xu 
351da7f033dSHerbert Xu 	ret = 0;
352da7f033dSHerbert Xu 
353da7f033dSHerbert Xu out:
354da7f033dSHerbert Xu 	ahash_request_free(req);
355da7f033dSHerbert Xu out_noreq:
356f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
357f8b0d4d0SHerbert Xu out_nobuf:
358da7f033dSHerbert Xu 	return ret;
359da7f033dSHerbert Xu }
360da7f033dSHerbert Xu 
361da7f033dSHerbert Xu static int test_aead(struct crypto_aead *tfm, int enc,
362da7f033dSHerbert Xu 		     struct aead_testvec *template, unsigned int tcount)
363da7f033dSHerbert Xu {
364da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
365da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
366f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
367da7f033dSHerbert Xu 	char *q;
368da7f033dSHerbert Xu 	char *key;
369da7f033dSHerbert Xu 	struct aead_request *req;
370da7f033dSHerbert Xu 	struct scatterlist sg[8];
371da7f033dSHerbert Xu 	struct scatterlist asg[8];
372da7f033dSHerbert Xu 	const char *e;
373da7f033dSHerbert Xu 	struct tcrypt_result result;
374da7f033dSHerbert Xu 	unsigned int authsize;
375da7f033dSHerbert Xu 	void *input;
376da7f033dSHerbert Xu 	void *assoc;
377da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
378f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
379f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
380f8b0d4d0SHerbert Xu 
381f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
382f8b0d4d0SHerbert Xu 		goto out_noxbuf;
383f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
384f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
385da7f033dSHerbert Xu 
386da7f033dSHerbert Xu 	if (enc == ENCRYPT)
387da7f033dSHerbert Xu 		e = "encryption";
388da7f033dSHerbert Xu 	else
389da7f033dSHerbert Xu 		e = "decryption";
390da7f033dSHerbert Xu 
391da7f033dSHerbert Xu 	init_completion(&result.completion);
392da7f033dSHerbert Xu 
393da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
394da7f033dSHerbert Xu 	if (!req) {
395da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to allocate request for "
396da7f033dSHerbert Xu 		       "%s\n", algo);
397da7f033dSHerbert Xu 		goto out;
398da7f033dSHerbert Xu 	}
399da7f033dSHerbert Xu 
400da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
401da7f033dSHerbert Xu 				  tcrypt_complete, &result);
402da7f033dSHerbert Xu 
403da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
404da7f033dSHerbert Xu 		if (!template[i].np) {
405da7f033dSHerbert Xu 			j++;
406da7f033dSHerbert Xu 
407da7f033dSHerbert Xu 			/* some tepmplates have no input data but they will
408da7f033dSHerbert Xu 			 * touch input
409da7f033dSHerbert Xu 			 */
410da7f033dSHerbert Xu 			input = xbuf[0];
411da7f033dSHerbert Xu 			assoc = axbuf[0];
412da7f033dSHerbert Xu 
413fd57f22aSHerbert Xu 			ret = -EINVAL;
414fd57f22aSHerbert Xu 			if (WARN_ON(template[i].ilen > PAGE_SIZE ||
415fd57f22aSHerbert Xu 				    template[i].alen > PAGE_SIZE))
416fd57f22aSHerbert Xu 				goto out;
417fd57f22aSHerbert Xu 
418da7f033dSHerbert Xu 			memcpy(input, template[i].input, template[i].ilen);
419da7f033dSHerbert Xu 			memcpy(assoc, template[i].assoc, template[i].alen);
420da7f033dSHerbert Xu 			if (template[i].iv)
421da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
422da7f033dSHerbert Xu 			else
423da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
424da7f033dSHerbert Xu 
425da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
426da7f033dSHerbert Xu 			if (template[i].wk)
427da7f033dSHerbert Xu 				crypto_aead_set_flags(
428da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
429da7f033dSHerbert Xu 
430da7f033dSHerbert Xu 			key = template[i].key;
431da7f033dSHerbert Xu 
432da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key,
433da7f033dSHerbert Xu 						 template[i].klen);
434da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
435da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: setkey failed on "
436da7f033dSHerbert Xu 				       "test %d for %s: flags=%x\n", j, algo,
437da7f033dSHerbert Xu 				       crypto_aead_get_flags(tfm));
438da7f033dSHerbert Xu 				goto out;
439da7f033dSHerbert Xu 			} else if (ret)
440da7f033dSHerbert Xu 				continue;
441da7f033dSHerbert Xu 
442da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
443da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
444da7f033dSHerbert Xu 			if (ret) {
445da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: Failed to set "
446da7f033dSHerbert Xu 				       "authsize to %u on test %d for %s\n",
447da7f033dSHerbert Xu 				       authsize, j, algo);
448da7f033dSHerbert Xu 				goto out;
449da7f033dSHerbert Xu 			}
450da7f033dSHerbert Xu 
451da7f033dSHerbert Xu 			sg_init_one(&sg[0], input,
452da7f033dSHerbert Xu 				    template[i].ilen + (enc ? authsize : 0));
453da7f033dSHerbert Xu 
454da7f033dSHerbert Xu 			sg_init_one(&asg[0], assoc, template[i].alen);
455da7f033dSHerbert Xu 
456da7f033dSHerbert Xu 			aead_request_set_crypt(req, sg, sg,
457da7f033dSHerbert Xu 					       template[i].ilen, iv);
458da7f033dSHerbert Xu 
459da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
460da7f033dSHerbert Xu 
461da7f033dSHerbert Xu 			ret = enc ?
462da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
463da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
464da7f033dSHerbert Xu 
465da7f033dSHerbert Xu 			switch (ret) {
466da7f033dSHerbert Xu 			case 0:
467e44a1b44SJarod Wilson 				if (template[i].novrfy) {
468e44a1b44SJarod Wilson 					/* verification was supposed to fail */
469e44a1b44SJarod Wilson 					printk(KERN_ERR "alg: aead: %s failed "
470e44a1b44SJarod Wilson 					       "on test %d for %s: ret was 0, "
471e44a1b44SJarod Wilson 					       "expected -EBADMSG\n",
472e44a1b44SJarod Wilson 					       e, j, algo);
473e44a1b44SJarod Wilson 					/* so really, we got a bad message */
474e44a1b44SJarod Wilson 					ret = -EBADMSG;
475e44a1b44SJarod Wilson 					goto out;
476e44a1b44SJarod Wilson 				}
477da7f033dSHerbert Xu 				break;
478da7f033dSHerbert Xu 			case -EINPROGRESS:
479da7f033dSHerbert Xu 			case -EBUSY:
480da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
481da7f033dSHerbert Xu 					&result.completion);
482da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
483da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
484da7f033dSHerbert Xu 					break;
485da7f033dSHerbert Xu 				}
486e44a1b44SJarod Wilson 			case -EBADMSG:
487e44a1b44SJarod Wilson 				if (template[i].novrfy)
488e44a1b44SJarod Wilson 					/* verification failure was expected */
489e44a1b44SJarod Wilson 					continue;
490da7f033dSHerbert Xu 				/* fall through */
491da7f033dSHerbert Xu 			default:
492da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: %s failed on test "
493da7f033dSHerbert Xu 				       "%d for %s: ret=%d\n", e, j, algo, -ret);
494da7f033dSHerbert Xu 				goto out;
495da7f033dSHerbert Xu 			}
496da7f033dSHerbert Xu 
497da7f033dSHerbert Xu 			q = input;
498da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
499da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: Test %d failed on "
500da7f033dSHerbert Xu 				       "%s for %s\n", j, e, algo);
501da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
502da7f033dSHerbert Xu 				ret = -EINVAL;
503da7f033dSHerbert Xu 				goto out;
504da7f033dSHerbert Xu 			}
505da7f033dSHerbert Xu 		}
506da7f033dSHerbert Xu 	}
507da7f033dSHerbert Xu 
508da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
509da7f033dSHerbert Xu 		if (template[i].np) {
510da7f033dSHerbert Xu 			j++;
511da7f033dSHerbert Xu 
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 			key = template[i].key;
522da7f033dSHerbert Xu 
523da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key, template[i].klen);
524da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
525da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: setkey failed on "
526da7f033dSHerbert Xu 				       "chunk test %d for %s: flags=%x\n", j,
527da7f033dSHerbert Xu 				       algo, crypto_aead_get_flags(tfm));
528da7f033dSHerbert Xu 				goto out;
529da7f033dSHerbert Xu 			} else if (ret)
530da7f033dSHerbert Xu 				continue;
531da7f033dSHerbert Xu 
532da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
533da7f033dSHerbert Xu 
534da7f033dSHerbert Xu 			ret = -EINVAL;
535da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
536da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
537da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
538da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
539da7f033dSHerbert Xu 					goto out;
540da7f033dSHerbert Xu 
541da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
542da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
543da7f033dSHerbert Xu 
544da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
545da7f033dSHerbert Xu 				       template[i].tap[k]);
546da7f033dSHerbert Xu 
547da7f033dSHerbert Xu 				n = template[i].tap[k];
548da7f033dSHerbert Xu 				if (k == template[i].np - 1 && enc)
549da7f033dSHerbert Xu 					n += authsize;
550da7f033dSHerbert Xu 				if (offset_in_page(q) + n < PAGE_SIZE)
551da7f033dSHerbert Xu 					q[n] = 0;
552da7f033dSHerbert Xu 
553da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
554da7f033dSHerbert Xu 				temp += template[i].tap[k];
555da7f033dSHerbert Xu 			}
556da7f033dSHerbert Xu 
557da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
558da7f033dSHerbert Xu 			if (ret) {
559da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: Failed to set "
560da7f033dSHerbert Xu 				       "authsize to %u on chunk test %d for "
561da7f033dSHerbert Xu 				       "%s\n", authsize, j, algo);
562da7f033dSHerbert Xu 				goto out;
563da7f033dSHerbert Xu 			}
564da7f033dSHerbert Xu 
565da7f033dSHerbert Xu 			if (enc) {
566da7f033dSHerbert Xu 				if (WARN_ON(sg[k - 1].offset +
567da7f033dSHerbert Xu 					    sg[k - 1].length + authsize >
568da7f033dSHerbert Xu 					    PAGE_SIZE)) {
569da7f033dSHerbert Xu 					ret = -EINVAL;
570da7f033dSHerbert Xu 					goto out;
571da7f033dSHerbert Xu 				}
572da7f033dSHerbert Xu 
573da7f033dSHerbert Xu 				sg[k - 1].length += authsize;
574da7f033dSHerbert Xu 			}
575da7f033dSHerbert Xu 
576da7f033dSHerbert Xu 			sg_init_table(asg, template[i].anp);
577fd57f22aSHerbert Xu 			ret = -EINVAL;
578da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].anp; k++) {
579fd57f22aSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
580fd57f22aSHerbert Xu 					    template[i].atap[k] > PAGE_SIZE))
581fd57f22aSHerbert Xu 					goto out;
582da7f033dSHerbert Xu 				sg_set_buf(&asg[k],
583da7f033dSHerbert Xu 					   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
584da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
585da7f033dSHerbert Xu 						  template[i].assoc + temp,
586da7f033dSHerbert Xu 						  template[i].atap[k]),
587da7f033dSHerbert Xu 					   template[i].atap[k]);
588da7f033dSHerbert Xu 				temp += template[i].atap[k];
589da7f033dSHerbert Xu 			}
590da7f033dSHerbert Xu 
591da7f033dSHerbert Xu 			aead_request_set_crypt(req, sg, sg,
592da7f033dSHerbert Xu 					       template[i].ilen,
593da7f033dSHerbert Xu 					       iv);
594da7f033dSHerbert Xu 
595da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
596da7f033dSHerbert Xu 
597da7f033dSHerbert Xu 			ret = enc ?
598da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
599da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
600da7f033dSHerbert Xu 
601da7f033dSHerbert Xu 			switch (ret) {
602da7f033dSHerbert Xu 			case 0:
603e44a1b44SJarod Wilson 				if (template[i].novrfy) {
604e44a1b44SJarod Wilson 					/* verification was supposed to fail */
605e44a1b44SJarod Wilson 					printk(KERN_ERR "alg: aead: %s failed "
606e44a1b44SJarod Wilson 					       "on chunk test %d for %s: ret "
607e44a1b44SJarod Wilson 					       "was 0, expected -EBADMSG\n",
608e44a1b44SJarod Wilson 					       e, j, algo);
609e44a1b44SJarod Wilson 					/* so really, we got a bad message */
610e44a1b44SJarod Wilson 					ret = -EBADMSG;
611e44a1b44SJarod Wilson 					goto out;
612e44a1b44SJarod Wilson 				}
613da7f033dSHerbert Xu 				break;
614da7f033dSHerbert Xu 			case -EINPROGRESS:
615da7f033dSHerbert Xu 			case -EBUSY:
616da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
617da7f033dSHerbert Xu 					&result.completion);
618da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
619da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
620da7f033dSHerbert Xu 					break;
621da7f033dSHerbert Xu 				}
622e44a1b44SJarod Wilson 			case -EBADMSG:
623e44a1b44SJarod Wilson 				if (template[i].novrfy)
624e44a1b44SJarod Wilson 					/* verification failure was expected */
625e44a1b44SJarod Wilson 					continue;
626da7f033dSHerbert Xu 				/* fall through */
627da7f033dSHerbert Xu 			default:
628da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: %s failed on "
629da7f033dSHerbert Xu 				       "chunk test %d for %s: ret=%d\n", e, j,
630da7f033dSHerbert Xu 				       algo, -ret);
631da7f033dSHerbert Xu 				goto out;
632da7f033dSHerbert Xu 			}
633da7f033dSHerbert Xu 
634da7f033dSHerbert Xu 			ret = -EINVAL;
635da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
636da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
637da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
638da7f033dSHerbert Xu 
639da7f033dSHerbert Xu 				n = template[i].tap[k];
640da7f033dSHerbert Xu 				if (k == template[i].np - 1)
641da7f033dSHerbert Xu 					n += enc ? authsize : -authsize;
642da7f033dSHerbert Xu 
643da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp, n)) {
644da7f033dSHerbert Xu 					printk(KERN_ERR "alg: aead: Chunk "
645da7f033dSHerbert Xu 					       "test %d failed on %s at page "
646da7f033dSHerbert Xu 					       "%u for %s\n", j, e, k, algo);
647da7f033dSHerbert Xu 					hexdump(q, n);
648da7f033dSHerbert Xu 					goto out;
649da7f033dSHerbert Xu 				}
650da7f033dSHerbert Xu 
651da7f033dSHerbert Xu 				q += n;
652da7f033dSHerbert Xu 				if (k == template[i].np - 1 && !enc) {
653da7f033dSHerbert Xu 					if (memcmp(q, template[i].input +
654da7f033dSHerbert Xu 						      temp + n, authsize))
655da7f033dSHerbert Xu 						n = authsize;
656da7f033dSHerbert Xu 					else
657da7f033dSHerbert Xu 						n = 0;
658da7f033dSHerbert Xu 				} else {
659da7f033dSHerbert Xu 					for (n = 0; offset_in_page(q + n) &&
660da7f033dSHerbert Xu 						    q[n]; n++)
661da7f033dSHerbert Xu 						;
662da7f033dSHerbert Xu 				}
663da7f033dSHerbert Xu 				if (n) {
664da7f033dSHerbert Xu 					printk(KERN_ERR "alg: aead: Result "
665da7f033dSHerbert Xu 					       "buffer corruption in chunk "
666da7f033dSHerbert Xu 					       "test %d on %s at page %u for "
667da7f033dSHerbert Xu 					       "%s: %u bytes:\n", j, e, k,
668da7f033dSHerbert Xu 					       algo, n);
669da7f033dSHerbert Xu 					hexdump(q, n);
670da7f033dSHerbert Xu 					goto out;
671da7f033dSHerbert Xu 				}
672da7f033dSHerbert Xu 
673da7f033dSHerbert Xu 				temp += template[i].tap[k];
674da7f033dSHerbert Xu 			}
675da7f033dSHerbert Xu 		}
676da7f033dSHerbert Xu 	}
677da7f033dSHerbert Xu 
678da7f033dSHerbert Xu 	ret = 0;
679da7f033dSHerbert Xu 
680da7f033dSHerbert Xu out:
681da7f033dSHerbert Xu 	aead_request_free(req);
682f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
683f8b0d4d0SHerbert Xu out_noaxbuf:
684f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
685f8b0d4d0SHerbert Xu out_noxbuf:
686da7f033dSHerbert Xu 	return ret;
687da7f033dSHerbert Xu }
688da7f033dSHerbert Xu 
6891aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
6901aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
6911aa4ecd9SHerbert Xu {
6921aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
6931aa4ecd9SHerbert Xu 	unsigned int i, j, k;
6941aa4ecd9SHerbert Xu 	char *q;
6951aa4ecd9SHerbert Xu 	const char *e;
6961aa4ecd9SHerbert Xu 	void *data;
697f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
698f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
699f8b0d4d0SHerbert Xu 
700f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
701f8b0d4d0SHerbert Xu 		goto out_nobuf;
7021aa4ecd9SHerbert Xu 
7031aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
7041aa4ecd9SHerbert Xu 	        e = "encryption";
7051aa4ecd9SHerbert Xu 	else
7061aa4ecd9SHerbert Xu 		e = "decryption";
7071aa4ecd9SHerbert Xu 
7081aa4ecd9SHerbert Xu 	j = 0;
7091aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
7101aa4ecd9SHerbert Xu 		if (template[i].np)
7111aa4ecd9SHerbert Xu 			continue;
7121aa4ecd9SHerbert Xu 
7131aa4ecd9SHerbert Xu 		j++;
7141aa4ecd9SHerbert Xu 
715fd57f22aSHerbert Xu 		ret = -EINVAL;
716fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
717fd57f22aSHerbert Xu 			goto out;
718fd57f22aSHerbert Xu 
7191aa4ecd9SHerbert Xu 		data = xbuf[0];
7201aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
7211aa4ecd9SHerbert Xu 
7221aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
7231aa4ecd9SHerbert Xu 		if (template[i].wk)
7241aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
7251aa4ecd9SHerbert Xu 
7261aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
7271aa4ecd9SHerbert Xu 					   template[i].klen);
7281aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
7291aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
7301aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
7311aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
7321aa4ecd9SHerbert Xu 			goto out;
7331aa4ecd9SHerbert Xu 		} else if (ret)
7341aa4ecd9SHerbert Xu 			continue;
7351aa4ecd9SHerbert Xu 
7361aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
7371aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
7381aa4ecd9SHerbert Xu 			if (enc)
7391aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
7401aa4ecd9SHerbert Xu 							  data + k);
7411aa4ecd9SHerbert Xu 			else
7421aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
7431aa4ecd9SHerbert Xu 							  data + k);
7441aa4ecd9SHerbert Xu 		}
7451aa4ecd9SHerbert Xu 
7461aa4ecd9SHerbert Xu 		q = data;
7471aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
7481aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
7491aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
7501aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
7511aa4ecd9SHerbert Xu 			ret = -EINVAL;
7521aa4ecd9SHerbert Xu 			goto out;
7531aa4ecd9SHerbert Xu 		}
7541aa4ecd9SHerbert Xu 	}
7551aa4ecd9SHerbert Xu 
7561aa4ecd9SHerbert Xu 	ret = 0;
7571aa4ecd9SHerbert Xu 
7581aa4ecd9SHerbert Xu out:
759f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
760f8b0d4d0SHerbert Xu out_nobuf:
7611aa4ecd9SHerbert Xu 	return ret;
7621aa4ecd9SHerbert Xu }
7631aa4ecd9SHerbert Xu 
7641aa4ecd9SHerbert Xu static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
765da7f033dSHerbert Xu 			 struct cipher_testvec *template, unsigned int tcount)
766da7f033dSHerbert Xu {
767da7f033dSHerbert Xu 	const char *algo =
768da7f033dSHerbert Xu 		crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
769da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
770da7f033dSHerbert Xu 	char *q;
771da7f033dSHerbert Xu 	struct ablkcipher_request *req;
772da7f033dSHerbert Xu 	struct scatterlist sg[8];
773da7f033dSHerbert Xu 	const char *e;
774da7f033dSHerbert Xu 	struct tcrypt_result result;
775da7f033dSHerbert Xu 	void *data;
776da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
777f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
778f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
779f8b0d4d0SHerbert Xu 
780f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
781f8b0d4d0SHerbert Xu 		goto out_nobuf;
782da7f033dSHerbert Xu 
783da7f033dSHerbert Xu 	if (enc == ENCRYPT)
784da7f033dSHerbert Xu 	        e = "encryption";
785da7f033dSHerbert Xu 	else
786da7f033dSHerbert Xu 		e = "decryption";
787da7f033dSHerbert Xu 
788da7f033dSHerbert Xu 	init_completion(&result.completion);
789da7f033dSHerbert Xu 
790da7f033dSHerbert Xu 	req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
791da7f033dSHerbert Xu 	if (!req) {
7921aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to allocate request "
7931aa4ecd9SHerbert Xu 		       "for %s\n", algo);
794da7f033dSHerbert Xu 		goto out;
795da7f033dSHerbert Xu 	}
796da7f033dSHerbert Xu 
797da7f033dSHerbert Xu 	ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
798da7f033dSHerbert Xu 					tcrypt_complete, &result);
799da7f033dSHerbert Xu 
800da7f033dSHerbert Xu 	j = 0;
801da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
802da7f033dSHerbert Xu 		if (template[i].iv)
803da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
804da7f033dSHerbert Xu 		else
805da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
806da7f033dSHerbert Xu 
807da7f033dSHerbert Xu 		if (!(template[i].np)) {
808da7f033dSHerbert Xu 			j++;
809da7f033dSHerbert Xu 
810fd57f22aSHerbert Xu 			ret = -EINVAL;
811fd57f22aSHerbert Xu 			if (WARN_ON(template[i].ilen > PAGE_SIZE))
812fd57f22aSHerbert Xu 				goto out;
813fd57f22aSHerbert Xu 
814da7f033dSHerbert Xu 			data = xbuf[0];
815da7f033dSHerbert Xu 			memcpy(data, template[i].input, template[i].ilen);
816da7f033dSHerbert Xu 
817da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
818da7f033dSHerbert Xu 			if (template[i].wk)
819da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
820da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
821da7f033dSHerbert Xu 
822da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
823da7f033dSHerbert Xu 						       template[i].klen);
824da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
8251aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: setkey failed "
826da7f033dSHerbert Xu 				       "on test %d for %s: flags=%x\n", j,
827da7f033dSHerbert Xu 				       algo, crypto_ablkcipher_get_flags(tfm));
828da7f033dSHerbert Xu 				goto out;
829da7f033dSHerbert Xu 			} else if (ret)
830da7f033dSHerbert Xu 				continue;
831da7f033dSHerbert Xu 
832da7f033dSHerbert Xu 			sg_init_one(&sg[0], data, template[i].ilen);
833da7f033dSHerbert Xu 
834da7f033dSHerbert Xu 			ablkcipher_request_set_crypt(req, sg, sg,
835da7f033dSHerbert Xu 						     template[i].ilen, iv);
836da7f033dSHerbert Xu 			ret = enc ?
837da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
838da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
839da7f033dSHerbert Xu 
840da7f033dSHerbert Xu 			switch (ret) {
841da7f033dSHerbert Xu 			case 0:
842da7f033dSHerbert Xu 				break;
843da7f033dSHerbert Xu 			case -EINPROGRESS:
844da7f033dSHerbert Xu 			case -EBUSY:
845da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
846da7f033dSHerbert Xu 					&result.completion);
847da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
848da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
849da7f033dSHerbert Xu 					break;
850da7f033dSHerbert Xu 				}
851da7f033dSHerbert Xu 				/* fall through */
852da7f033dSHerbert Xu 			default:
8531aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: %s failed on "
854da7f033dSHerbert Xu 				       "test %d for %s: ret=%d\n", e, j, algo,
855da7f033dSHerbert Xu 				       -ret);
856da7f033dSHerbert Xu 				goto out;
857da7f033dSHerbert Xu 			}
858da7f033dSHerbert Xu 
859da7f033dSHerbert Xu 			q = data;
860da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
8611aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: Test %d "
8621aa4ecd9SHerbert Xu 				       "failed on %s for %s\n", j, e, algo);
863da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
864da7f033dSHerbert Xu 				ret = -EINVAL;
865da7f033dSHerbert Xu 				goto out;
866da7f033dSHerbert Xu 			}
867da7f033dSHerbert Xu 		}
868da7f033dSHerbert Xu 	}
869da7f033dSHerbert Xu 
870da7f033dSHerbert Xu 	j = 0;
871da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
872da7f033dSHerbert Xu 
873da7f033dSHerbert Xu 		if (template[i].iv)
874da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
875da7f033dSHerbert Xu 		else
876da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
877da7f033dSHerbert Xu 
878da7f033dSHerbert Xu 		if (template[i].np) {
879da7f033dSHerbert Xu 			j++;
880da7f033dSHerbert Xu 
881da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
882da7f033dSHerbert Xu 			if (template[i].wk)
883da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
884da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
885da7f033dSHerbert Xu 
886da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
887da7f033dSHerbert Xu 						       template[i].klen);
888da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
8891aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: setkey failed "
890da7f033dSHerbert Xu 				       "on chunk test %d for %s: flags=%x\n",
891da7f033dSHerbert Xu 				       j, algo,
892da7f033dSHerbert Xu 				       crypto_ablkcipher_get_flags(tfm));
893da7f033dSHerbert Xu 				goto out;
894da7f033dSHerbert Xu 			} else if (ret)
895da7f033dSHerbert Xu 				continue;
896da7f033dSHerbert Xu 
897da7f033dSHerbert Xu 			temp = 0;
898da7f033dSHerbert Xu 			ret = -EINVAL;
899da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
900da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
901da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
902da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
903da7f033dSHerbert Xu 					goto out;
904da7f033dSHerbert Xu 
905da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
906da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
907da7f033dSHerbert Xu 
908da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
909da7f033dSHerbert Xu 				       template[i].tap[k]);
910da7f033dSHerbert Xu 
911da7f033dSHerbert Xu 				if (offset_in_page(q) + template[i].tap[k] <
912da7f033dSHerbert Xu 				    PAGE_SIZE)
913da7f033dSHerbert Xu 					q[template[i].tap[k]] = 0;
914da7f033dSHerbert Xu 
915da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
916da7f033dSHerbert Xu 
917da7f033dSHerbert Xu 				temp += template[i].tap[k];
918da7f033dSHerbert Xu 			}
919da7f033dSHerbert Xu 
920da7f033dSHerbert Xu 			ablkcipher_request_set_crypt(req, sg, sg,
921da7f033dSHerbert Xu 					template[i].ilen, iv);
922da7f033dSHerbert Xu 
923da7f033dSHerbert Xu 			ret = enc ?
924da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
925da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
926da7f033dSHerbert Xu 
927da7f033dSHerbert Xu 			switch (ret) {
928da7f033dSHerbert Xu 			case 0:
929da7f033dSHerbert Xu 				break;
930da7f033dSHerbert Xu 			case -EINPROGRESS:
931da7f033dSHerbert Xu 			case -EBUSY:
932da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
933da7f033dSHerbert Xu 					&result.completion);
934da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
935da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
936da7f033dSHerbert Xu 					break;
937da7f033dSHerbert Xu 				}
938da7f033dSHerbert Xu 				/* fall through */
939da7f033dSHerbert Xu 			default:
9401aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: %s failed on "
941da7f033dSHerbert Xu 				       "chunk test %d for %s: ret=%d\n", e, j,
942da7f033dSHerbert Xu 				       algo, -ret);
943da7f033dSHerbert Xu 				goto out;
944da7f033dSHerbert Xu 			}
945da7f033dSHerbert Xu 
946da7f033dSHerbert Xu 			temp = 0;
947da7f033dSHerbert Xu 			ret = -EINVAL;
948da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
949da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
950da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
951da7f033dSHerbert Xu 
952da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp,
953da7f033dSHerbert Xu 					   template[i].tap[k])) {
9541aa4ecd9SHerbert Xu 					printk(KERN_ERR "alg: skcipher: Chunk "
955da7f033dSHerbert Xu 					       "test %d failed on %s at page "
956da7f033dSHerbert Xu 					       "%u for %s\n", j, e, k, algo);
957da7f033dSHerbert Xu 					hexdump(q, template[i].tap[k]);
958da7f033dSHerbert Xu 					goto out;
959da7f033dSHerbert Xu 				}
960da7f033dSHerbert Xu 
961da7f033dSHerbert Xu 				q += template[i].tap[k];
962da7f033dSHerbert Xu 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
963da7f033dSHerbert Xu 					;
964da7f033dSHerbert Xu 				if (n) {
9651aa4ecd9SHerbert Xu 					printk(KERN_ERR "alg: skcipher: "
966da7f033dSHerbert Xu 					       "Result buffer corruption in "
967da7f033dSHerbert Xu 					       "chunk test %d on %s at page "
968da7f033dSHerbert Xu 					       "%u for %s: %u bytes:\n", j, e,
969da7f033dSHerbert Xu 					       k, algo, n);
970da7f033dSHerbert Xu 					hexdump(q, n);
971da7f033dSHerbert Xu 					goto out;
972da7f033dSHerbert Xu 				}
973da7f033dSHerbert Xu 				temp += template[i].tap[k];
974da7f033dSHerbert Xu 			}
975da7f033dSHerbert Xu 		}
976da7f033dSHerbert Xu 	}
977da7f033dSHerbert Xu 
978da7f033dSHerbert Xu 	ret = 0;
979da7f033dSHerbert Xu 
980da7f033dSHerbert Xu out:
981da7f033dSHerbert Xu 	ablkcipher_request_free(req);
982f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
983f8b0d4d0SHerbert Xu out_nobuf:
984da7f033dSHerbert Xu 	return ret;
985da7f033dSHerbert Xu }
986da7f033dSHerbert Xu 
987da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
988da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
989da7f033dSHerbert Xu {
990da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
991da7f033dSHerbert Xu 	unsigned int i;
992da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
993da7f033dSHerbert Xu 	int ret;
994da7f033dSHerbert Xu 
995da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
996c79cf910SGeert Uytterhoeven 		int ilen;
997c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
998da7f033dSHerbert Xu 
999da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1000da7f033dSHerbert Xu 
1001da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1002da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1003da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1004da7f033dSHerbert Xu 		if (ret) {
1005da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1006da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1007da7f033dSHerbert Xu 			       -ret);
1008da7f033dSHerbert Xu 			goto out;
1009da7f033dSHerbert Xu 		}
1010da7f033dSHerbert Xu 
1011b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1012b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1013b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1014b812eb00SGeert Uytterhoeven 			       dlen);
1015b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1016b812eb00SGeert Uytterhoeven 			goto out;
1017b812eb00SGeert Uytterhoeven 		}
1018b812eb00SGeert Uytterhoeven 
1019da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1020da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1021da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1022da7f033dSHerbert Xu 			hexdump(result, dlen);
1023da7f033dSHerbert Xu 			ret = -EINVAL;
1024da7f033dSHerbert Xu 			goto out;
1025da7f033dSHerbert Xu 		}
1026da7f033dSHerbert Xu 	}
1027da7f033dSHerbert Xu 
1028da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1029c79cf910SGeert Uytterhoeven 		int ilen;
1030c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1031da7f033dSHerbert Xu 
1032da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1033da7f033dSHerbert Xu 
1034da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1035da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1036da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1037da7f033dSHerbert Xu 		if (ret) {
1038da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1039da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1040da7f033dSHerbert Xu 			       -ret);
1041da7f033dSHerbert Xu 			goto out;
1042da7f033dSHerbert Xu 		}
1043da7f033dSHerbert Xu 
1044b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1045b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1046b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1047b812eb00SGeert Uytterhoeven 			       dlen);
1048b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1049b812eb00SGeert Uytterhoeven 			goto out;
1050b812eb00SGeert Uytterhoeven 		}
1051b812eb00SGeert Uytterhoeven 
1052da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1053da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1054da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1055da7f033dSHerbert Xu 			hexdump(result, dlen);
1056da7f033dSHerbert Xu 			ret = -EINVAL;
1057da7f033dSHerbert Xu 			goto out;
1058da7f033dSHerbert Xu 		}
1059da7f033dSHerbert Xu 	}
1060da7f033dSHerbert Xu 
1061da7f033dSHerbert Xu 	ret = 0;
1062da7f033dSHerbert Xu 
1063da7f033dSHerbert Xu out:
1064da7f033dSHerbert Xu 	return ret;
1065da7f033dSHerbert Xu }
1066da7f033dSHerbert Xu 
10678064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm,
10688064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *ctemplate,
10698064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *dtemplate, int ctcount,
10708064efb8SGeert Uytterhoeven 		      int dtcount)
10718064efb8SGeert Uytterhoeven {
10728064efb8SGeert Uytterhoeven 	const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
10738064efb8SGeert Uytterhoeven 	unsigned int i;
10748064efb8SGeert Uytterhoeven 	char result[COMP_BUF_SIZE];
10753ce858cbSGeert Uytterhoeven 	int res;
10768064efb8SGeert Uytterhoeven 
10778064efb8SGeert Uytterhoeven 	for (i = 0; i < ctcount; i++) {
10788064efb8SGeert Uytterhoeven 		struct comp_request req;
10793ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
10808064efb8SGeert Uytterhoeven 
10813ce858cbSGeert Uytterhoeven 		res = crypto_compress_setup(tfm, ctemplate[i].params,
10828064efb8SGeert Uytterhoeven 					    ctemplate[i].paramsize);
10833ce858cbSGeert Uytterhoeven 		if (res) {
10848064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression setup failed on test "
10853ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
10863ce858cbSGeert Uytterhoeven 			return res;
10878064efb8SGeert Uytterhoeven 		}
10888064efb8SGeert Uytterhoeven 
10893ce858cbSGeert Uytterhoeven 		res = crypto_compress_init(tfm);
10903ce858cbSGeert Uytterhoeven 		if (res) {
10918064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression init failed on test "
10923ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
10933ce858cbSGeert Uytterhoeven 			return res;
10948064efb8SGeert Uytterhoeven 		}
10958064efb8SGeert Uytterhoeven 
10968064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
10978064efb8SGeert Uytterhoeven 
10988064efb8SGeert Uytterhoeven 		req.next_in = ctemplate[i].input;
10998064efb8SGeert Uytterhoeven 		req.avail_in = ctemplate[i].inlen / 2;
11008064efb8SGeert Uytterhoeven 		req.next_out = result;
11018064efb8SGeert Uytterhoeven 		req.avail_out = ctemplate[i].outlen / 2;
11028064efb8SGeert Uytterhoeven 
11033ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
11043ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
11058064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
11063ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
11073ce858cbSGeert Uytterhoeven 			return res;
11088064efb8SGeert Uytterhoeven 		}
11093ce858cbSGeert Uytterhoeven 		if (res > 0)
11103ce858cbSGeert Uytterhoeven 			produced += res;
11118064efb8SGeert Uytterhoeven 
11128064efb8SGeert Uytterhoeven 		/* Add remaining input data */
11138064efb8SGeert Uytterhoeven 		req.avail_in += (ctemplate[i].inlen + 1) / 2;
11148064efb8SGeert Uytterhoeven 
11153ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
11163ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
11178064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
11183ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
11193ce858cbSGeert Uytterhoeven 			return res;
11208064efb8SGeert Uytterhoeven 		}
11213ce858cbSGeert Uytterhoeven 		if (res > 0)
11223ce858cbSGeert Uytterhoeven 			produced += res;
11238064efb8SGeert Uytterhoeven 
11248064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
11258064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
11268064efb8SGeert Uytterhoeven 
11273ce858cbSGeert Uytterhoeven 		res = crypto_compress_final(tfm, &req);
11283ce858cbSGeert Uytterhoeven 		if (res < 0) {
11298064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression final failed on test "
11303ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
11313ce858cbSGeert Uytterhoeven 			return res;
11328064efb8SGeert Uytterhoeven 		}
11333ce858cbSGeert Uytterhoeven 		produced += res;
11348064efb8SGeert Uytterhoeven 
11358064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
11368064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
11378064efb8SGeert Uytterhoeven 			       "output len = %d (expected %d)\n", i + 1, algo,
11388064efb8SGeert Uytterhoeven 			       COMP_BUF_SIZE - req.avail_out,
11398064efb8SGeert Uytterhoeven 			       ctemplate[i].outlen);
11408064efb8SGeert Uytterhoeven 			return -EINVAL;
11418064efb8SGeert Uytterhoeven 		}
11428064efb8SGeert Uytterhoeven 
11433ce858cbSGeert Uytterhoeven 		if (produced != ctemplate[i].outlen) {
11443ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
11453ce858cbSGeert Uytterhoeven 			       "returned len = %u (expected %d)\n", i + 1,
11463ce858cbSGeert Uytterhoeven 			       algo, produced, ctemplate[i].outlen);
11473ce858cbSGeert Uytterhoeven 			return -EINVAL;
11483ce858cbSGeert Uytterhoeven 		}
11493ce858cbSGeert Uytterhoeven 
11508064efb8SGeert Uytterhoeven 		if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
11518064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Compression test %d failed for "
11528064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
11538064efb8SGeert Uytterhoeven 			hexdump(result, ctemplate[i].outlen);
11548064efb8SGeert Uytterhoeven 			return -EINVAL;
11558064efb8SGeert Uytterhoeven 		}
11568064efb8SGeert Uytterhoeven 	}
11578064efb8SGeert Uytterhoeven 
11588064efb8SGeert Uytterhoeven 	for (i = 0; i < dtcount; i++) {
11598064efb8SGeert Uytterhoeven 		struct comp_request req;
11603ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
11618064efb8SGeert Uytterhoeven 
11623ce858cbSGeert Uytterhoeven 		res = crypto_decompress_setup(tfm, dtemplate[i].params,
11638064efb8SGeert Uytterhoeven 					      dtemplate[i].paramsize);
11643ce858cbSGeert Uytterhoeven 		if (res) {
11658064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression setup failed on "
11663ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
11673ce858cbSGeert Uytterhoeven 			return res;
11688064efb8SGeert Uytterhoeven 		}
11698064efb8SGeert Uytterhoeven 
11703ce858cbSGeert Uytterhoeven 		res = crypto_decompress_init(tfm);
11713ce858cbSGeert Uytterhoeven 		if (res) {
11728064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression init failed on test "
11733ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
11743ce858cbSGeert Uytterhoeven 			return res;
11758064efb8SGeert Uytterhoeven 		}
11768064efb8SGeert Uytterhoeven 
11778064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
11788064efb8SGeert Uytterhoeven 
11798064efb8SGeert Uytterhoeven 		req.next_in = dtemplate[i].input;
11808064efb8SGeert Uytterhoeven 		req.avail_in = dtemplate[i].inlen / 2;
11818064efb8SGeert Uytterhoeven 		req.next_out = result;
11828064efb8SGeert Uytterhoeven 		req.avail_out = dtemplate[i].outlen / 2;
11838064efb8SGeert Uytterhoeven 
11843ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
11853ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
11868064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
11873ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
11883ce858cbSGeert Uytterhoeven 			return res;
11898064efb8SGeert Uytterhoeven 		}
11903ce858cbSGeert Uytterhoeven 		if (res > 0)
11913ce858cbSGeert Uytterhoeven 			produced += res;
11928064efb8SGeert Uytterhoeven 
11938064efb8SGeert Uytterhoeven 		/* Add remaining input data */
11948064efb8SGeert Uytterhoeven 		req.avail_in += (dtemplate[i].inlen + 1) / 2;
11958064efb8SGeert Uytterhoeven 
11963ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
11973ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
11988064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
11993ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
12003ce858cbSGeert Uytterhoeven 			return res;
12018064efb8SGeert Uytterhoeven 		}
12023ce858cbSGeert Uytterhoeven 		if (res > 0)
12033ce858cbSGeert Uytterhoeven 			produced += res;
12048064efb8SGeert Uytterhoeven 
12058064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
12068064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
12078064efb8SGeert Uytterhoeven 
12083ce858cbSGeert Uytterhoeven 		res = crypto_decompress_final(tfm, &req);
12093ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
12108064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression final failed on "
12113ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
12123ce858cbSGeert Uytterhoeven 			return res;
12138064efb8SGeert Uytterhoeven 		}
12143ce858cbSGeert Uytterhoeven 		if (res > 0)
12153ce858cbSGeert Uytterhoeven 			produced += res;
12168064efb8SGeert Uytterhoeven 
12178064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
12188064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
12198064efb8SGeert Uytterhoeven 			       "%s: output len = %d (expected %d)\n", i + 1,
12208064efb8SGeert Uytterhoeven 			       algo, COMP_BUF_SIZE - req.avail_out,
12218064efb8SGeert Uytterhoeven 			       dtemplate[i].outlen);
12228064efb8SGeert Uytterhoeven 			return -EINVAL;
12238064efb8SGeert Uytterhoeven 		}
12248064efb8SGeert Uytterhoeven 
12253ce858cbSGeert Uytterhoeven 		if (produced != dtemplate[i].outlen) {
12263ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
12273ce858cbSGeert Uytterhoeven 			       "%s: returned len = %u (expected %d)\n", i + 1,
12283ce858cbSGeert Uytterhoeven 			       algo, produced, dtemplate[i].outlen);
12293ce858cbSGeert Uytterhoeven 			return -EINVAL;
12303ce858cbSGeert Uytterhoeven 		}
12313ce858cbSGeert Uytterhoeven 
12328064efb8SGeert Uytterhoeven 		if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
12338064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Decompression test %d failed for "
12348064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
12358064efb8SGeert Uytterhoeven 			hexdump(result, dtemplate[i].outlen);
12368064efb8SGeert Uytterhoeven 			return -EINVAL;
12378064efb8SGeert Uytterhoeven 		}
12388064efb8SGeert Uytterhoeven 	}
12398064efb8SGeert Uytterhoeven 
12408064efb8SGeert Uytterhoeven 	return 0;
12418064efb8SGeert Uytterhoeven }
12428064efb8SGeert Uytterhoeven 
12437647d6ceSJarod Wilson 
12447647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
12457647d6ceSJarod Wilson 		      unsigned int tcount)
12467647d6ceSJarod Wilson {
12477647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1248fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
12497647d6ceSJarod Wilson 	u8 *seed;
12507647d6ceSJarod Wilson 	char result[32];
12517647d6ceSJarod Wilson 
12527647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
12537647d6ceSJarod Wilson 
12547647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
12557647d6ceSJarod Wilson 	if (!seed) {
12567647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
12577647d6ceSJarod Wilson 		       "for %s\n", algo);
12587647d6ceSJarod Wilson 		return -ENOMEM;
12597647d6ceSJarod Wilson 	}
12607647d6ceSJarod Wilson 
12617647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
12627647d6ceSJarod Wilson 		memset(result, 0, 32);
12637647d6ceSJarod Wilson 
12647647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
12657647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
12667647d6ceSJarod Wilson 		       template[i].klen);
12677647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
12687647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
12697647d6ceSJarod Wilson 
12707647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
12717647d6ceSJarod Wilson 		if (err) {
12727647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
12737647d6ceSJarod Wilson 			       "for %s\n", algo);
12747647d6ceSJarod Wilson 			goto out;
12757647d6ceSJarod Wilson 		}
12767647d6ceSJarod Wilson 
12777647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
12787647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
12797647d6ceSJarod Wilson 						   template[i].rlen);
12807647d6ceSJarod Wilson 			if (err != template[i].rlen) {
12817647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
12827647d6ceSJarod Wilson 				       "the correct amount of random data for "
12837647d6ceSJarod Wilson 				       "%s (requested %d, got %d)\n", algo,
12847647d6ceSJarod Wilson 				       template[i].rlen, err);
12857647d6ceSJarod Wilson 				goto out;
12867647d6ceSJarod Wilson 			}
12877647d6ceSJarod Wilson 		}
12887647d6ceSJarod Wilson 
12897647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
12907647d6ceSJarod Wilson 			     template[i].rlen);
12917647d6ceSJarod Wilson 		if (err) {
12927647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
12937647d6ceSJarod Wilson 			       i, algo);
12947647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
12957647d6ceSJarod Wilson 			err = -EINVAL;
12967647d6ceSJarod Wilson 			goto out;
12977647d6ceSJarod Wilson 		}
12987647d6ceSJarod Wilson 	}
12997647d6ceSJarod Wilson 
13007647d6ceSJarod Wilson out:
13017647d6ceSJarod Wilson 	kfree(seed);
13027647d6ceSJarod Wilson 	return err;
13037647d6ceSJarod Wilson }
13047647d6ceSJarod Wilson 
1305da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1306da7f033dSHerbert Xu 			 u32 type, u32 mask)
1307da7f033dSHerbert Xu {
1308da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1309da7f033dSHerbert Xu 	int err = 0;
1310da7f033dSHerbert Xu 
1311da7f033dSHerbert Xu 	tfm = crypto_alloc_aead(driver, type, mask);
1312da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1313da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1314da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1315da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1316da7f033dSHerbert Xu 	}
1317da7f033dSHerbert Xu 
1318da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1319da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1320da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1321da7f033dSHerbert Xu 		if (err)
1322da7f033dSHerbert Xu 			goto out;
1323da7f033dSHerbert Xu 	}
1324da7f033dSHerbert Xu 
1325da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1326da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1327da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1328da7f033dSHerbert Xu 
1329da7f033dSHerbert Xu out:
1330da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1331da7f033dSHerbert Xu 	return err;
1332da7f033dSHerbert Xu }
1333da7f033dSHerbert Xu 
1334da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1335da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1336da7f033dSHerbert Xu {
13371aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1338da7f033dSHerbert Xu 	int err = 0;
1339da7f033dSHerbert Xu 
13401aa4ecd9SHerbert Xu 	tfm = crypto_alloc_cipher(driver, type, mask);
1341da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1342da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1343da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1344da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1345da7f033dSHerbert Xu 	}
1346da7f033dSHerbert Xu 
1347da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1348da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1349da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1350da7f033dSHerbert Xu 		if (err)
1351da7f033dSHerbert Xu 			goto out;
1352da7f033dSHerbert Xu 	}
1353da7f033dSHerbert Xu 
1354da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1355da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1356da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1357da7f033dSHerbert Xu 
1358da7f033dSHerbert Xu out:
13591aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
13601aa4ecd9SHerbert Xu 	return err;
13611aa4ecd9SHerbert Xu }
13621aa4ecd9SHerbert Xu 
13631aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
13641aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
13651aa4ecd9SHerbert Xu {
13661aa4ecd9SHerbert Xu 	struct crypto_ablkcipher *tfm;
13671aa4ecd9SHerbert Xu 	int err = 0;
13681aa4ecd9SHerbert Xu 
13691aa4ecd9SHerbert Xu 	tfm = crypto_alloc_ablkcipher(driver, type, mask);
13701aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
13711aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
13721aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
13731aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
13741aa4ecd9SHerbert Xu 	}
13751aa4ecd9SHerbert Xu 
13761aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
13771aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
13781aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
13791aa4ecd9SHerbert Xu 		if (err)
13801aa4ecd9SHerbert Xu 			goto out;
13811aa4ecd9SHerbert Xu 	}
13821aa4ecd9SHerbert Xu 
13831aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
13841aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
13851aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
13861aa4ecd9SHerbert Xu 
13871aa4ecd9SHerbert Xu out:
1388da7f033dSHerbert Xu 	crypto_free_ablkcipher(tfm);
1389da7f033dSHerbert Xu 	return err;
1390da7f033dSHerbert Xu }
1391da7f033dSHerbert Xu 
1392da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1393da7f033dSHerbert Xu 			 u32 type, u32 mask)
1394da7f033dSHerbert Xu {
1395da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1396da7f033dSHerbert Xu 	int err;
1397da7f033dSHerbert Xu 
1398da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1399da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1400da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1401da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1402da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1403da7f033dSHerbert Xu 	}
1404da7f033dSHerbert Xu 
1405da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1406da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1407da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1408da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1409da7f033dSHerbert Xu 
1410da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1411da7f033dSHerbert Xu 	return err;
1412da7f033dSHerbert Xu }
1413da7f033dSHerbert Xu 
14148064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
14158064efb8SGeert Uytterhoeven 			  u32 type, u32 mask)
14168064efb8SGeert Uytterhoeven {
14178064efb8SGeert Uytterhoeven 	struct crypto_pcomp *tfm;
14188064efb8SGeert Uytterhoeven 	int err;
14198064efb8SGeert Uytterhoeven 
14208064efb8SGeert Uytterhoeven 	tfm = crypto_alloc_pcomp(driver, type, mask);
14218064efb8SGeert Uytterhoeven 	if (IS_ERR(tfm)) {
14228064efb8SGeert Uytterhoeven 		pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
14238064efb8SGeert Uytterhoeven 		       driver, PTR_ERR(tfm));
14248064efb8SGeert Uytterhoeven 		return PTR_ERR(tfm);
14258064efb8SGeert Uytterhoeven 	}
14268064efb8SGeert Uytterhoeven 
14278064efb8SGeert Uytterhoeven 	err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
14288064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.vecs,
14298064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.comp.count,
14308064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.count);
14318064efb8SGeert Uytterhoeven 
14328064efb8SGeert Uytterhoeven 	crypto_free_pcomp(tfm);
14338064efb8SGeert Uytterhoeven 	return err;
14348064efb8SGeert Uytterhoeven }
14358064efb8SGeert Uytterhoeven 
1436da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1437da7f033dSHerbert Xu 			 u32 type, u32 mask)
1438da7f033dSHerbert Xu {
1439da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1440da7f033dSHerbert Xu 	int err;
1441da7f033dSHerbert Xu 
1442da7f033dSHerbert Xu 	tfm = crypto_alloc_ahash(driver, type, mask);
1443da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1444da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1445da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1446da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1447da7f033dSHerbert Xu 	}
1448da7f033dSHerbert Xu 
1449a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1450a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1451a8f1a052SDavid S. Miller 	if (!err)
1452a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1453a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1454da7f033dSHerbert Xu 
1455da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1456da7f033dSHerbert Xu 	return err;
1457da7f033dSHerbert Xu }
1458da7f033dSHerbert Xu 
14598e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
14608e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
14618e3ee85eSHerbert Xu {
14628e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
14638e3ee85eSHerbert Xu 	u32 val;
14648e3ee85eSHerbert Xu 	int err;
14658e3ee85eSHerbert Xu 
14668e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
14678e3ee85eSHerbert Xu 	if (err)
14688e3ee85eSHerbert Xu 		goto out;
14698e3ee85eSHerbert Xu 
14708e3ee85eSHerbert Xu 	tfm = crypto_alloc_shash(driver, type, mask);
14718e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
14728e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
14738e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
14748e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
14758e3ee85eSHerbert Xu 		goto out;
14768e3ee85eSHerbert Xu 	}
14778e3ee85eSHerbert Xu 
14788e3ee85eSHerbert Xu 	do {
14798e3ee85eSHerbert Xu 		struct {
14808e3ee85eSHerbert Xu 			struct shash_desc shash;
14818e3ee85eSHerbert Xu 			char ctx[crypto_shash_descsize(tfm)];
14828e3ee85eSHerbert Xu 		} sdesc;
14838e3ee85eSHerbert Xu 
14848e3ee85eSHerbert Xu 		sdesc.shash.tfm = tfm;
14858e3ee85eSHerbert Xu 		sdesc.shash.flags = 0;
14868e3ee85eSHerbert Xu 
14878e3ee85eSHerbert Xu 		*(u32 *)sdesc.ctx = le32_to_cpu(420553207);
14888e3ee85eSHerbert Xu 		err = crypto_shash_final(&sdesc.shash, (u8 *)&val);
14898e3ee85eSHerbert Xu 		if (err) {
14908e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
14918e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
14928e3ee85eSHerbert Xu 			break;
14938e3ee85eSHerbert Xu 		}
14948e3ee85eSHerbert Xu 
14958e3ee85eSHerbert Xu 		if (val != ~420553207) {
14968e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
14978e3ee85eSHerbert Xu 			       "%d\n", driver, val);
14988e3ee85eSHerbert Xu 			err = -EINVAL;
14998e3ee85eSHerbert Xu 		}
15008e3ee85eSHerbert Xu 	} while (0);
15018e3ee85eSHerbert Xu 
15028e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
15038e3ee85eSHerbert Xu 
15048e3ee85eSHerbert Xu out:
15058e3ee85eSHerbert Xu 	return err;
15068e3ee85eSHerbert Xu }
15078e3ee85eSHerbert Xu 
15087647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
15097647d6ceSJarod Wilson 			  u32 type, u32 mask)
15107647d6ceSJarod Wilson {
15117647d6ceSJarod Wilson 	struct crypto_rng *rng;
15127647d6ceSJarod Wilson 	int err;
15137647d6ceSJarod Wilson 
15147647d6ceSJarod Wilson 	rng = crypto_alloc_rng(driver, type, mask);
15157647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
15167647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
15177647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
15187647d6ceSJarod Wilson 		return PTR_ERR(rng);
15197647d6ceSJarod Wilson 	}
15207647d6ceSJarod Wilson 
15217647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
15227647d6ceSJarod Wilson 
15237647d6ceSJarod Wilson 	crypto_free_rng(rng);
15247647d6ceSJarod Wilson 
15257647d6ceSJarod Wilson 	return err;
15267647d6ceSJarod Wilson }
15277647d6ceSJarod Wilson 
1528863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1529863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1530863b557aSYouquan, Song {
1531863b557aSYouquan, Song 	return 0;
1532863b557aSYouquan, Song }
1533863b557aSYouquan, Song 
1534da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1535da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1536da7f033dSHerbert Xu 	{
15377efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
15387efe4076SJohannes Goetzfried 		.test = alg_test_null,
15397efe4076SJohannes Goetzfried 		.suite = {
15407efe4076SJohannes Goetzfried 			.cipher = {
15417efe4076SJohannes Goetzfried 				.enc = {
15427efe4076SJohannes Goetzfried 					.vecs = NULL,
15437efe4076SJohannes Goetzfried 					.count = 0
15447efe4076SJohannes Goetzfried 				},
15457efe4076SJohannes Goetzfried 				.dec = {
15467efe4076SJohannes Goetzfried 					.vecs = NULL,
15477efe4076SJohannes Goetzfried 					.count = 0
15487efe4076SJohannes Goetzfried 				}
15497efe4076SJohannes Goetzfried 			}
15507efe4076SJohannes Goetzfried 		}
15517efe4076SJohannes Goetzfried 	}, {
1552937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
1553937c30d7SJussi Kivilinna 		.test = alg_test_null,
1554937c30d7SJussi Kivilinna 		.suite = {
1555937c30d7SJussi Kivilinna 			.cipher = {
1556937c30d7SJussi Kivilinna 				.enc = {
1557937c30d7SJussi Kivilinna 					.vecs = NULL,
1558937c30d7SJussi Kivilinna 					.count = 0
1559937c30d7SJussi Kivilinna 				},
1560937c30d7SJussi Kivilinna 				.dec = {
1561937c30d7SJussi Kivilinna 					.vecs = NULL,
1562937c30d7SJussi Kivilinna 					.count = 0
1563937c30d7SJussi Kivilinna 				}
1564937c30d7SJussi Kivilinna 			}
1565937c30d7SJussi Kivilinna 		}
1566937c30d7SJussi Kivilinna 	}, {
1567107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
1568107778b5SJohannes Goetzfried 		.test = alg_test_null,
1569107778b5SJohannes Goetzfried 		.suite = {
1570107778b5SJohannes Goetzfried 			.cipher = {
1571107778b5SJohannes Goetzfried 				.enc = {
1572107778b5SJohannes Goetzfried 					.vecs = NULL,
1573107778b5SJohannes Goetzfried 					.count = 0
1574107778b5SJohannes Goetzfried 				},
1575107778b5SJohannes Goetzfried 				.dec = {
1576107778b5SJohannes Goetzfried 					.vecs = NULL,
1577107778b5SJohannes Goetzfried 					.count = 0
1578107778b5SJohannes Goetzfried 				}
1579107778b5SJohannes Goetzfried 			}
1580107778b5SJohannes Goetzfried 		}
1581107778b5SJohannes Goetzfried 	}, {
1582863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
1583863b557aSYouquan, Song 		.test = alg_test_null,
15846c79294fSMilan Broz 		.fips_allowed = 1,
1585863b557aSYouquan, Song 		.suite = {
1586863b557aSYouquan, Song 			.cipher = {
1587863b557aSYouquan, Song 				.enc = {
1588863b557aSYouquan, Song 					.vecs = NULL,
1589863b557aSYouquan, Song 					.count = 0
1590863b557aSYouquan, Song 				},
1591863b557aSYouquan, Song 				.dec = {
1592863b557aSYouquan, Song 					.vecs = NULL,
1593863b557aSYouquan, Song 					.count = 0
1594863b557aSYouquan, Song 				}
1595863b557aSYouquan, Song 			}
1596863b557aSYouquan, Song 		}
1597863b557aSYouquan, Song 	}, {
15987efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
15997efe4076SJohannes Goetzfried 		.test = alg_test_null,
16007efe4076SJohannes Goetzfried 		.suite = {
16017efe4076SJohannes Goetzfried 			.cipher = {
16027efe4076SJohannes Goetzfried 				.enc = {
16037efe4076SJohannes Goetzfried 					.vecs = NULL,
16047efe4076SJohannes Goetzfried 					.count = 0
16057efe4076SJohannes Goetzfried 				},
16067efe4076SJohannes Goetzfried 				.dec = {
16077efe4076SJohannes Goetzfried 					.vecs = NULL,
16087efe4076SJohannes Goetzfried 					.count = 0
16097efe4076SJohannes Goetzfried 				}
16107efe4076SJohannes Goetzfried 			}
16117efe4076SJohannes Goetzfried 		}
16127efe4076SJohannes Goetzfried 	}, {
1613937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
1614937c30d7SJussi Kivilinna 		.test = alg_test_null,
1615937c30d7SJussi Kivilinna 		.suite = {
1616937c30d7SJussi Kivilinna 			.cipher = {
1617937c30d7SJussi Kivilinna 				.enc = {
1618937c30d7SJussi Kivilinna 					.vecs = NULL,
1619937c30d7SJussi Kivilinna 					.count = 0
1620937c30d7SJussi Kivilinna 				},
1621937c30d7SJussi Kivilinna 				.dec = {
1622937c30d7SJussi Kivilinna 					.vecs = NULL,
1623937c30d7SJussi Kivilinna 					.count = 0
1624937c30d7SJussi Kivilinna 				}
1625937c30d7SJussi Kivilinna 			}
1626937c30d7SJussi Kivilinna 		}
1627937c30d7SJussi Kivilinna 	}, {
1628107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
1629107778b5SJohannes Goetzfried 		.test = alg_test_null,
1630107778b5SJohannes Goetzfried 		.suite = {
1631107778b5SJohannes Goetzfried 			.cipher = {
1632107778b5SJohannes Goetzfried 				.enc = {
1633107778b5SJohannes Goetzfried 					.vecs = NULL,
1634107778b5SJohannes Goetzfried 					.count = 0
1635107778b5SJohannes Goetzfried 				},
1636107778b5SJohannes Goetzfried 				.dec = {
1637107778b5SJohannes Goetzfried 					.vecs = NULL,
1638107778b5SJohannes Goetzfried 					.count = 0
1639107778b5SJohannes Goetzfried 				}
1640107778b5SJohannes Goetzfried 			}
1641107778b5SJohannes Goetzfried 		}
1642107778b5SJohannes Goetzfried 	}, {
1643863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
1644863b557aSYouquan, Song 		.test = alg_test_null,
16456c79294fSMilan Broz 		.fips_allowed = 1,
1646863b557aSYouquan, Song 		.suite = {
1647863b557aSYouquan, Song 			.cipher = {
1648863b557aSYouquan, Song 				.enc = {
1649863b557aSYouquan, Song 					.vecs = NULL,
1650863b557aSYouquan, Song 					.count = 0
1651863b557aSYouquan, Song 				},
1652863b557aSYouquan, Song 				.dec = {
1653863b557aSYouquan, Song 					.vecs = NULL,
1654863b557aSYouquan, Song 					.count = 0
1655863b557aSYouquan, Song 				}
1656863b557aSYouquan, Song 			}
1657863b557aSYouquan, Song 		}
1658863b557aSYouquan, Song 	}, {
16597efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
16607efe4076SJohannes Goetzfried 		.test = alg_test_null,
16617efe4076SJohannes Goetzfried 		.suite = {
16627efe4076SJohannes Goetzfried 			.cipher = {
16637efe4076SJohannes Goetzfried 				.enc = {
16647efe4076SJohannes Goetzfried 					.vecs = NULL,
16657efe4076SJohannes Goetzfried 					.count = 0
16667efe4076SJohannes Goetzfried 				},
16677efe4076SJohannes Goetzfried 				.dec = {
16687efe4076SJohannes Goetzfried 					.vecs = NULL,
16697efe4076SJohannes Goetzfried 					.count = 0
16707efe4076SJohannes Goetzfried 				}
16717efe4076SJohannes Goetzfried 			}
16727efe4076SJohannes Goetzfried 		}
16737efe4076SJohannes Goetzfried 	}, {
1674937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
1675937c30d7SJussi Kivilinna 		.test = alg_test_null,
1676937c30d7SJussi Kivilinna 		.suite = {
1677937c30d7SJussi Kivilinna 			.cipher = {
1678937c30d7SJussi Kivilinna 				.enc = {
1679937c30d7SJussi Kivilinna 					.vecs = NULL,
1680937c30d7SJussi Kivilinna 					.count = 0
1681937c30d7SJussi Kivilinna 				},
1682937c30d7SJussi Kivilinna 				.dec = {
1683937c30d7SJussi Kivilinna 					.vecs = NULL,
1684937c30d7SJussi Kivilinna 					.count = 0
1685937c30d7SJussi Kivilinna 				}
1686937c30d7SJussi Kivilinna 			}
1687937c30d7SJussi Kivilinna 		}
1688937c30d7SJussi Kivilinna 	}, {
1689107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
1690107778b5SJohannes Goetzfried 		.test = alg_test_null,
1691107778b5SJohannes Goetzfried 		.suite = {
1692107778b5SJohannes Goetzfried 			.cipher = {
1693107778b5SJohannes Goetzfried 				.enc = {
1694107778b5SJohannes Goetzfried 					.vecs = NULL,
1695107778b5SJohannes Goetzfried 					.count = 0
1696107778b5SJohannes Goetzfried 				},
1697107778b5SJohannes Goetzfried 				.dec = {
1698107778b5SJohannes Goetzfried 					.vecs = NULL,
1699107778b5SJohannes Goetzfried 					.count = 0
1700107778b5SJohannes Goetzfried 				}
1701107778b5SJohannes Goetzfried 			}
1702107778b5SJohannes Goetzfried 		}
1703107778b5SJohannes Goetzfried 	}, {
1704863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
1705863b557aSYouquan, Song 		.test = alg_test_null,
17066c79294fSMilan Broz 		.fips_allowed = 1,
1707863b557aSYouquan, Song 		.suite = {
1708863b557aSYouquan, Song 			.hash = {
1709863b557aSYouquan, Song 				.vecs = NULL,
1710863b557aSYouquan, Song 				.count = 0
1711863b557aSYouquan, Song 			}
1712863b557aSYouquan, Song 		}
1713863b557aSYouquan, Song 	}, {
1714e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
1715e08ca2daSJarod Wilson 		.test = alg_test_cprng,
1716a1915d51SJarod Wilson 		.fips_allowed = 1,
1717e08ca2daSJarod Wilson 		.suite = {
1718e08ca2daSJarod Wilson 			.cprng = {
1719e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
1720e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
1721e08ca2daSJarod Wilson 			}
1722e08ca2daSJarod Wilson 		}
1723e08ca2daSJarod Wilson 	}, {
1724e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha1),cbc(aes))",
1725e46e9a46SHoria Geanta 		.test = alg_test_aead,
1726e46e9a46SHoria Geanta 		.fips_allowed = 1,
1727e46e9a46SHoria Geanta 		.suite = {
1728e46e9a46SHoria Geanta 			.aead = {
1729e46e9a46SHoria Geanta 				.enc = {
1730e46e9a46SHoria Geanta 					.vecs = hmac_sha1_aes_cbc_enc_tv_template,
1731e46e9a46SHoria Geanta 					.count = HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS
1732e46e9a46SHoria Geanta 				}
1733e46e9a46SHoria Geanta 			}
1734e46e9a46SHoria Geanta 		}
1735e46e9a46SHoria Geanta 	}, {
1736e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha256),cbc(aes))",
1737e46e9a46SHoria Geanta 		.test = alg_test_aead,
1738e46e9a46SHoria Geanta 		.fips_allowed = 1,
1739e46e9a46SHoria Geanta 		.suite = {
1740e46e9a46SHoria Geanta 			.aead = {
1741e46e9a46SHoria Geanta 				.enc = {
1742e46e9a46SHoria Geanta 					.vecs = hmac_sha256_aes_cbc_enc_tv_template,
1743e46e9a46SHoria Geanta 					.count = HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS
1744e46e9a46SHoria Geanta 				}
1745e46e9a46SHoria Geanta 			}
1746e46e9a46SHoria Geanta 		}
1747e46e9a46SHoria Geanta 	}, {
1748e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha512),cbc(aes))",
1749e46e9a46SHoria Geanta 		.test = alg_test_aead,
1750e46e9a46SHoria Geanta 		.fips_allowed = 1,
1751e46e9a46SHoria Geanta 		.suite = {
1752e46e9a46SHoria Geanta 			.aead = {
1753e46e9a46SHoria Geanta 				.enc = {
1754e46e9a46SHoria Geanta 					.vecs = hmac_sha512_aes_cbc_enc_tv_template,
1755e46e9a46SHoria Geanta 					.count = HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS
1756e46e9a46SHoria Geanta 				}
1757e46e9a46SHoria Geanta 			}
1758e46e9a46SHoria Geanta 		}
1759e46e9a46SHoria Geanta 	}, {
1760da7f033dSHerbert Xu 		.alg = "cbc(aes)",
17611aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1762a1915d51SJarod Wilson 		.fips_allowed = 1,
1763da7f033dSHerbert Xu 		.suite = {
1764da7f033dSHerbert Xu 			.cipher = {
1765da7f033dSHerbert Xu 				.enc = {
1766da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
1767da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
1768da7f033dSHerbert Xu 				},
1769da7f033dSHerbert Xu 				.dec = {
1770da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
1771da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
1772da7f033dSHerbert Xu 				}
1773da7f033dSHerbert Xu 			}
1774da7f033dSHerbert Xu 		}
1775da7f033dSHerbert Xu 	}, {
1776da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
17771aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1778da7f033dSHerbert Xu 		.suite = {
1779da7f033dSHerbert Xu 			.cipher = {
1780da7f033dSHerbert Xu 				.enc = {
1781da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
1782da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
1783da7f033dSHerbert Xu 				},
1784da7f033dSHerbert Xu 				.dec = {
1785da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
1786da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
1787da7f033dSHerbert Xu 				}
1788da7f033dSHerbert Xu 			}
1789da7f033dSHerbert Xu 		}
1790da7f033dSHerbert Xu 	}, {
1791da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
17921aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1793da7f033dSHerbert Xu 		.suite = {
1794da7f033dSHerbert Xu 			.cipher = {
1795da7f033dSHerbert Xu 				.enc = {
1796da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
1797da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
1798da7f033dSHerbert Xu 				},
1799da7f033dSHerbert Xu 				.dec = {
1800da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
1801da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
1802da7f033dSHerbert Xu 				}
1803da7f033dSHerbert Xu 			}
1804da7f033dSHerbert Xu 		}
1805da7f033dSHerbert Xu 	}, {
1806da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
18071aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1808da7f033dSHerbert Xu 		.suite = {
1809da7f033dSHerbert Xu 			.cipher = {
1810da7f033dSHerbert Xu 				.enc = {
1811da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
1812da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
1813da7f033dSHerbert Xu 				},
1814da7f033dSHerbert Xu 				.dec = {
1815da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
1816da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
1817da7f033dSHerbert Xu 				}
1818da7f033dSHerbert Xu 			}
1819da7f033dSHerbert Xu 		}
1820da7f033dSHerbert Xu 	}, {
1821da7f033dSHerbert Xu 		.alg = "cbc(des)",
18221aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1823da7f033dSHerbert Xu 		.suite = {
1824da7f033dSHerbert Xu 			.cipher = {
1825da7f033dSHerbert Xu 				.enc = {
1826da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
1827da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
1828da7f033dSHerbert Xu 				},
1829da7f033dSHerbert Xu 				.dec = {
1830da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
1831da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
1832da7f033dSHerbert Xu 				}
1833da7f033dSHerbert Xu 			}
1834da7f033dSHerbert Xu 		}
1835da7f033dSHerbert Xu 	}, {
1836da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
18371aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1838a1915d51SJarod Wilson 		.fips_allowed = 1,
1839da7f033dSHerbert Xu 		.suite = {
1840da7f033dSHerbert Xu 			.cipher = {
1841da7f033dSHerbert Xu 				.enc = {
1842da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
1843da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
1844da7f033dSHerbert Xu 				},
1845da7f033dSHerbert Xu 				.dec = {
1846da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
1847da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
1848da7f033dSHerbert Xu 				}
1849da7f033dSHerbert Xu 			}
1850da7f033dSHerbert Xu 		}
1851da7f033dSHerbert Xu 	}, {
18529d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
18539d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
18549d25917dSJussi Kivilinna 		.suite = {
18559d25917dSJussi Kivilinna 			.cipher = {
18569d25917dSJussi Kivilinna 				.enc = {
18579d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
18589d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
18599d25917dSJussi Kivilinna 				},
18609d25917dSJussi Kivilinna 				.dec = {
18619d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
18629d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
18639d25917dSJussi Kivilinna 				}
18649d25917dSJussi Kivilinna 			}
18659d25917dSJussi Kivilinna 		}
18669d25917dSJussi Kivilinna 	}, {
1867da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
18681aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1869da7f033dSHerbert Xu 		.suite = {
1870da7f033dSHerbert Xu 			.cipher = {
1871da7f033dSHerbert Xu 				.enc = {
1872da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
1873da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
1874da7f033dSHerbert Xu 				},
1875da7f033dSHerbert Xu 				.dec = {
1876da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
1877da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
1878da7f033dSHerbert Xu 				}
1879da7f033dSHerbert Xu 			}
1880da7f033dSHerbert Xu 		}
1881da7f033dSHerbert Xu 	}, {
1882da7f033dSHerbert Xu 		.alg = "ccm(aes)",
1883da7f033dSHerbert Xu 		.test = alg_test_aead,
1884a1915d51SJarod Wilson 		.fips_allowed = 1,
1885da7f033dSHerbert Xu 		.suite = {
1886da7f033dSHerbert Xu 			.aead = {
1887da7f033dSHerbert Xu 				.enc = {
1888da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
1889da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
1890da7f033dSHerbert Xu 				},
1891da7f033dSHerbert Xu 				.dec = {
1892da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
1893da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
1894da7f033dSHerbert Xu 				}
1895da7f033dSHerbert Xu 			}
1896da7f033dSHerbert Xu 		}
1897da7f033dSHerbert Xu 	}, {
1898da7f033dSHerbert Xu 		.alg = "crc32c",
18998e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
1900a1915d51SJarod Wilson 		.fips_allowed = 1,
1901da7f033dSHerbert Xu 		.suite = {
1902da7f033dSHerbert Xu 			.hash = {
1903da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
1904da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
1905da7f033dSHerbert Xu 			}
1906da7f033dSHerbert Xu 		}
1907da7f033dSHerbert Xu 	}, {
19086c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
19096c79294fSMilan Broz 		.test = alg_test_null,
19106c79294fSMilan Broz 		.fips_allowed = 1,
19116c79294fSMilan Broz 		.suite = {
19126c79294fSMilan Broz 			.cipher = {
19136c79294fSMilan Broz 				.enc = {
19146c79294fSMilan Broz 					.vecs = NULL,
19156c79294fSMilan Broz 					.count = 0
19166c79294fSMilan Broz 				},
19176c79294fSMilan Broz 				.dec = {
19186c79294fSMilan Broz 					.vecs = NULL,
19196c79294fSMilan Broz 					.count = 0
19206c79294fSMilan Broz 				}
19216c79294fSMilan Broz 			}
19226c79294fSMilan Broz 		}
19236c79294fSMilan Broz 	}, {
1924863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
1925863b557aSYouquan, Song 		.test = alg_test_null,
19266c79294fSMilan Broz 		.fips_allowed = 1,
1927863b557aSYouquan, Song 		.suite = {
1928863b557aSYouquan, Song 			.cipher = {
1929863b557aSYouquan, Song 				.enc = {
1930863b557aSYouquan, Song 					.vecs = NULL,
1931863b557aSYouquan, Song 					.count = 0
1932863b557aSYouquan, Song 				},
1933863b557aSYouquan, Song 				.dec = {
1934863b557aSYouquan, Song 					.vecs = NULL,
1935863b557aSYouquan, Song 					.count = 0
1936863b557aSYouquan, Song 				}
1937863b557aSYouquan, Song 			}
1938863b557aSYouquan, Song 		}
1939863b557aSYouquan, Song 	}, {
19407efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
19417efe4076SJohannes Goetzfried 		.test = alg_test_null,
19427efe4076SJohannes Goetzfried 		.suite = {
19437efe4076SJohannes Goetzfried 			.cipher = {
19447efe4076SJohannes Goetzfried 				.enc = {
19457efe4076SJohannes Goetzfried 					.vecs = NULL,
19467efe4076SJohannes Goetzfried 					.count = 0
19477efe4076SJohannes Goetzfried 				},
19487efe4076SJohannes Goetzfried 				.dec = {
19497efe4076SJohannes Goetzfried 					.vecs = NULL,
19507efe4076SJohannes Goetzfried 					.count = 0
19517efe4076SJohannes Goetzfried 				}
19527efe4076SJohannes Goetzfried 			}
19537efe4076SJohannes Goetzfried 		}
19547efe4076SJohannes Goetzfried 	}, {
1955937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
1956937c30d7SJussi Kivilinna 		.test = alg_test_null,
1957937c30d7SJussi Kivilinna 		.suite = {
1958937c30d7SJussi Kivilinna 			.cipher = {
1959937c30d7SJussi Kivilinna 				.enc = {
1960937c30d7SJussi Kivilinna 					.vecs = NULL,
1961937c30d7SJussi Kivilinna 					.count = 0
1962937c30d7SJussi Kivilinna 				},
1963937c30d7SJussi Kivilinna 				.dec = {
1964937c30d7SJussi Kivilinna 					.vecs = NULL,
1965937c30d7SJussi Kivilinna 					.count = 0
1966937c30d7SJussi Kivilinna 				}
1967937c30d7SJussi Kivilinna 			}
1968937c30d7SJussi Kivilinna 		}
1969937c30d7SJussi Kivilinna 	}, {
1970107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
1971107778b5SJohannes Goetzfried 		.test = alg_test_null,
1972107778b5SJohannes Goetzfried 		.suite = {
1973107778b5SJohannes Goetzfried 			.cipher = {
1974107778b5SJohannes Goetzfried 				.enc = {
1975107778b5SJohannes Goetzfried 					.vecs = NULL,
1976107778b5SJohannes Goetzfried 					.count = 0
1977107778b5SJohannes Goetzfried 				},
1978107778b5SJohannes Goetzfried 				.dec = {
1979107778b5SJohannes Goetzfried 					.vecs = NULL,
1980107778b5SJohannes Goetzfried 					.count = 0
1981107778b5SJohannes Goetzfried 				}
1982107778b5SJohannes Goetzfried 			}
1983107778b5SJohannes Goetzfried 		}
1984107778b5SJohannes Goetzfried 	}, {
19856c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
19866c79294fSMilan Broz 		.test = alg_test_null,
19876c79294fSMilan Broz 		.fips_allowed = 1,
19886c79294fSMilan Broz 		.suite = {
19896c79294fSMilan Broz 			.cipher = {
19906c79294fSMilan Broz 				.enc = {
19916c79294fSMilan Broz 					.vecs = NULL,
19926c79294fSMilan Broz 					.count = 0
19936c79294fSMilan Broz 				},
19946c79294fSMilan Broz 				.dec = {
19956c79294fSMilan Broz 					.vecs = NULL,
19966c79294fSMilan Broz 					.count = 0
19976c79294fSMilan Broz 				}
19986c79294fSMilan Broz 			}
19996c79294fSMilan Broz 		}
20006c79294fSMilan Broz 	}, {
2001863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2002863b557aSYouquan, Song 		.test = alg_test_null,
20036c79294fSMilan Broz 		.fips_allowed = 1,
2004863b557aSYouquan, Song 		.suite = {
2005863b557aSYouquan, Song 			.hash = {
2006863b557aSYouquan, Song 				.vecs = NULL,
2007863b557aSYouquan, Song 				.count = 0
2008863b557aSYouquan, Song 			}
2009863b557aSYouquan, Song 		}
2010863b557aSYouquan, Song 	}, {
2011f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2012f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2013a1915d51SJarod Wilson 		.fips_allowed = 1,
2014f7cb80f2SJarod Wilson 		.suite = {
2015f7cb80f2SJarod Wilson 			.cipher = {
2016f7cb80f2SJarod Wilson 				.enc = {
2017f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2018f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2019f7cb80f2SJarod Wilson 				},
2020f7cb80f2SJarod Wilson 				.dec = {
2021f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2022f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2023f7cb80f2SJarod Wilson 				}
2024f7cb80f2SJarod Wilson 			}
2025f7cb80f2SJarod Wilson 		}
2026f7cb80f2SJarod Wilson 	}, {
202785b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
202885b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
202985b63e34SJussi Kivilinna 		.suite = {
203085b63e34SJussi Kivilinna 			.cipher = {
203185b63e34SJussi Kivilinna 				.enc = {
203285b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
203385b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
203485b63e34SJussi Kivilinna 				},
203585b63e34SJussi Kivilinna 				.dec = {
203685b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
203785b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
203885b63e34SJussi Kivilinna 				}
203985b63e34SJussi Kivilinna 			}
204085b63e34SJussi Kivilinna 		}
204185b63e34SJussi Kivilinna 	}, {
20420840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
20430840605eSJussi Kivilinna 		.test = alg_test_skcipher,
20440840605eSJussi Kivilinna 		.suite = {
20450840605eSJussi Kivilinna 			.cipher = {
20460840605eSJussi Kivilinna 				.enc = {
20470840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
20480840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
20490840605eSJussi Kivilinna 				},
20500840605eSJussi Kivilinna 				.dec = {
20510840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
20520840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
20530840605eSJussi Kivilinna 				}
20540840605eSJussi Kivilinna 			}
20550840605eSJussi Kivilinna 		}
20560840605eSJussi Kivilinna 	}, {
20579d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
20589d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
20599d25917dSJussi Kivilinna 		.suite = {
20609d25917dSJussi Kivilinna 			.cipher = {
20619d25917dSJussi Kivilinna 				.enc = {
20629d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
20639d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
20649d25917dSJussi Kivilinna 				},
20659d25917dSJussi Kivilinna 				.dec = {
20669d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
20679d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
20689d25917dSJussi Kivilinna 				}
20699d25917dSJussi Kivilinna 			}
20709d25917dSJussi Kivilinna 		}
20719d25917dSJussi Kivilinna 	}, {
2072573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2073573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2074573da620SJussi Kivilinna 		.suite = {
2075573da620SJussi Kivilinna 			.cipher = {
2076573da620SJussi Kivilinna 				.enc = {
2077573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2078573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2079573da620SJussi Kivilinna 				},
2080573da620SJussi Kivilinna 				.dec = {
2081573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2082573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2083573da620SJussi Kivilinna 				}
2084573da620SJussi Kivilinna 			}
2085573da620SJussi Kivilinna 		}
2086573da620SJussi Kivilinna 	}, {
2087da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
20881aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2089da7f033dSHerbert Xu 		.suite = {
2090da7f033dSHerbert Xu 			.cipher = {
2091da7f033dSHerbert Xu 				.enc = {
2092da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2093da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2094da7f033dSHerbert Xu 				},
2095da7f033dSHerbert Xu 				.dec = {
2096da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2097da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2098da7f033dSHerbert Xu 				}
2099da7f033dSHerbert Xu 			}
2100da7f033dSHerbert Xu 		}
2101da7f033dSHerbert Xu 	}, {
2102da7f033dSHerbert Xu 		.alg = "deflate",
2103da7f033dSHerbert Xu 		.test = alg_test_comp,
2104da7f033dSHerbert Xu 		.suite = {
2105da7f033dSHerbert Xu 			.comp = {
2106da7f033dSHerbert Xu 				.comp = {
2107da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2108da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2109da7f033dSHerbert Xu 				},
2110da7f033dSHerbert Xu 				.decomp = {
2111da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2112da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2113da7f033dSHerbert Xu 				}
2114da7f033dSHerbert Xu 			}
2115da7f033dSHerbert Xu 		}
2116da7f033dSHerbert Xu 	}, {
2117863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2118863b557aSYouquan, Song 		.test = alg_test_null,
21196c79294fSMilan Broz 		.fips_allowed = 1,
2120863b557aSYouquan, Song 		.suite = {
2121863b557aSYouquan, Song 			.cipher = {
2122863b557aSYouquan, Song 				.enc = {
2123863b557aSYouquan, Song 					.vecs = NULL,
2124863b557aSYouquan, Song 					.count = 0
2125863b557aSYouquan, Song 				},
2126863b557aSYouquan, Song 				.dec = {
2127863b557aSYouquan, Song 					.vecs = NULL,
2128863b557aSYouquan, Song 					.count = 0
2129863b557aSYouquan, Song 				}
2130863b557aSYouquan, Song 			}
2131863b557aSYouquan, Song 		}
2132863b557aSYouquan, Song 	}, {
2133da7f033dSHerbert Xu 		.alg = "ecb(aes)",
21341aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2135a1915d51SJarod Wilson 		.fips_allowed = 1,
2136da7f033dSHerbert Xu 		.suite = {
2137da7f033dSHerbert Xu 			.cipher = {
2138da7f033dSHerbert Xu 				.enc = {
2139da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2140da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2141da7f033dSHerbert Xu 				},
2142da7f033dSHerbert Xu 				.dec = {
2143da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2144da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2145da7f033dSHerbert Xu 				}
2146da7f033dSHerbert Xu 			}
2147da7f033dSHerbert Xu 		}
2148da7f033dSHerbert Xu 	}, {
2149da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
21501aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2151da7f033dSHerbert Xu 		.suite = {
2152da7f033dSHerbert Xu 			.cipher = {
2153da7f033dSHerbert Xu 				.enc = {
2154da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2155da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2156da7f033dSHerbert Xu 				},
2157da7f033dSHerbert Xu 				.dec = {
2158da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2159da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2160da7f033dSHerbert Xu 				}
2161da7f033dSHerbert Xu 			}
2162da7f033dSHerbert Xu 		}
2163da7f033dSHerbert Xu 	}, {
2164da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
21651aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2166da7f033dSHerbert Xu 		.suite = {
2167da7f033dSHerbert Xu 			.cipher = {
2168da7f033dSHerbert Xu 				.enc = {
2169da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2170da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2171da7f033dSHerbert Xu 				},
2172da7f033dSHerbert Xu 				.dec = {
2173da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2174da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2175da7f033dSHerbert Xu 				}
2176da7f033dSHerbert Xu 			}
2177da7f033dSHerbert Xu 		}
2178da7f033dSHerbert Xu 	}, {
2179da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
21801aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2181da7f033dSHerbert Xu 		.suite = {
2182da7f033dSHerbert Xu 			.cipher = {
2183da7f033dSHerbert Xu 				.enc = {
2184da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2185da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2186da7f033dSHerbert Xu 				},
2187da7f033dSHerbert Xu 				.dec = {
2188da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2189da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2190da7f033dSHerbert Xu 				}
2191da7f033dSHerbert Xu 			}
2192da7f033dSHerbert Xu 		}
2193da7f033dSHerbert Xu 	}, {
2194da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
21951aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2196da7f033dSHerbert Xu 		.suite = {
2197da7f033dSHerbert Xu 			.cipher = {
2198da7f033dSHerbert Xu 				.enc = {
2199da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2200da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2201da7f033dSHerbert Xu 				},
2202da7f033dSHerbert Xu 				.dec = {
2203da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2204da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2205da7f033dSHerbert Xu 				}
2206da7f033dSHerbert Xu 			}
2207da7f033dSHerbert Xu 		}
2208da7f033dSHerbert Xu 	}, {
2209da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
22101aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2211da7f033dSHerbert Xu 		.suite = {
2212da7f033dSHerbert Xu 			.cipher = {
2213da7f033dSHerbert Xu 				.enc = {
2214da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2215da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2216da7f033dSHerbert Xu 				},
2217da7f033dSHerbert Xu 				.dec = {
2218da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2219da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2220da7f033dSHerbert Xu 				}
2221da7f033dSHerbert Xu 			}
2222da7f033dSHerbert Xu 		}
2223da7f033dSHerbert Xu 	}, {
2224da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
22251aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2226da7f033dSHerbert Xu 		.suite = {
2227da7f033dSHerbert Xu 			.cipher = {
2228da7f033dSHerbert Xu 				.enc = {
2229da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2230da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
2231da7f033dSHerbert Xu 				},
2232da7f033dSHerbert Xu 				.dec = {
2233da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
2234da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
2235da7f033dSHerbert Xu 				}
2236da7f033dSHerbert Xu 			}
2237da7f033dSHerbert Xu 		}
2238da7f033dSHerbert Xu 	}, {
2239da7f033dSHerbert Xu 		.alg = "ecb(des)",
22401aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2241a1915d51SJarod Wilson 		.fips_allowed = 1,
2242da7f033dSHerbert Xu 		.suite = {
2243da7f033dSHerbert Xu 			.cipher = {
2244da7f033dSHerbert Xu 				.enc = {
2245da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
2246da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
2247da7f033dSHerbert Xu 				},
2248da7f033dSHerbert Xu 				.dec = {
2249da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
2250da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
2251da7f033dSHerbert Xu 				}
2252da7f033dSHerbert Xu 			}
2253da7f033dSHerbert Xu 		}
2254da7f033dSHerbert Xu 	}, {
2255da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
22561aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2257a1915d51SJarod Wilson 		.fips_allowed = 1,
2258da7f033dSHerbert Xu 		.suite = {
2259da7f033dSHerbert Xu 			.cipher = {
2260da7f033dSHerbert Xu 				.enc = {
2261da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
2262da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
2263da7f033dSHerbert Xu 				},
2264da7f033dSHerbert Xu 				.dec = {
2265da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
2266da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
2267da7f033dSHerbert Xu 				}
2268da7f033dSHerbert Xu 			}
2269da7f033dSHerbert Xu 		}
2270da7f033dSHerbert Xu 	}, {
2271da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
22721aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2273da7f033dSHerbert Xu 		.suite = {
2274da7f033dSHerbert Xu 			.cipher = {
2275da7f033dSHerbert Xu 				.enc = {
2276da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
2277da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
2278da7f033dSHerbert Xu 				},
2279da7f033dSHerbert Xu 				.dec = {
2280da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
2281da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
2282da7f033dSHerbert Xu 				}
2283da7f033dSHerbert Xu 			}
2284da7f033dSHerbert Xu 		}
2285da7f033dSHerbert Xu 	}, {
2286da7f033dSHerbert Xu 		.alg = "ecb(seed)",
22871aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2288da7f033dSHerbert Xu 		.suite = {
2289da7f033dSHerbert Xu 			.cipher = {
2290da7f033dSHerbert Xu 				.enc = {
2291da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
2292da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
2293da7f033dSHerbert Xu 				},
2294da7f033dSHerbert Xu 				.dec = {
2295da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
2296da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
2297da7f033dSHerbert Xu 				}
2298da7f033dSHerbert Xu 			}
2299da7f033dSHerbert Xu 		}
2300da7f033dSHerbert Xu 	}, {
2301da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
23021aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2303da7f033dSHerbert Xu 		.suite = {
2304da7f033dSHerbert Xu 			.cipher = {
2305da7f033dSHerbert Xu 				.enc = {
2306da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
2307da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
2308da7f033dSHerbert Xu 				},
2309da7f033dSHerbert Xu 				.dec = {
2310da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
2311da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
2312da7f033dSHerbert Xu 				}
2313da7f033dSHerbert Xu 			}
2314da7f033dSHerbert Xu 		}
2315da7f033dSHerbert Xu 	}, {
2316da7f033dSHerbert Xu 		.alg = "ecb(tea)",
23171aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2318da7f033dSHerbert Xu 		.suite = {
2319da7f033dSHerbert Xu 			.cipher = {
2320da7f033dSHerbert Xu 				.enc = {
2321da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
2322da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
2323da7f033dSHerbert Xu 				},
2324da7f033dSHerbert Xu 				.dec = {
2325da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
2326da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
2327da7f033dSHerbert Xu 				}
2328da7f033dSHerbert Xu 			}
2329da7f033dSHerbert Xu 		}
2330da7f033dSHerbert Xu 	}, {
2331da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
23321aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2333da7f033dSHerbert Xu 		.suite = {
2334da7f033dSHerbert Xu 			.cipher = {
2335da7f033dSHerbert Xu 				.enc = {
2336da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
2337da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
2338da7f033dSHerbert Xu 				},
2339da7f033dSHerbert Xu 				.dec = {
2340da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
2341da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
2342da7f033dSHerbert Xu 				}
2343da7f033dSHerbert Xu 			}
2344da7f033dSHerbert Xu 		}
2345da7f033dSHerbert Xu 	}, {
2346da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
23471aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2348da7f033dSHerbert Xu 		.suite = {
2349da7f033dSHerbert Xu 			.cipher = {
2350da7f033dSHerbert Xu 				.enc = {
2351da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
2352da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
2353da7f033dSHerbert Xu 				},
2354da7f033dSHerbert Xu 				.dec = {
2355da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
2356da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
2357da7f033dSHerbert Xu 				}
2358da7f033dSHerbert Xu 			}
2359da7f033dSHerbert Xu 		}
2360da7f033dSHerbert Xu 	}, {
2361da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
23621aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2363da7f033dSHerbert Xu 		.suite = {
2364da7f033dSHerbert Xu 			.cipher = {
2365da7f033dSHerbert Xu 				.enc = {
2366da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
2367da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
2368da7f033dSHerbert Xu 				},
2369da7f033dSHerbert Xu 				.dec = {
2370da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
2371da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
2372da7f033dSHerbert Xu 				}
2373da7f033dSHerbert Xu 			}
2374da7f033dSHerbert Xu 		}
2375da7f033dSHerbert Xu 	}, {
2376da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
23771aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2378da7f033dSHerbert Xu 		.suite = {
2379da7f033dSHerbert Xu 			.cipher = {
2380da7f033dSHerbert Xu 				.enc = {
2381da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
2382da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
2383da7f033dSHerbert Xu 				},
2384da7f033dSHerbert Xu 				.dec = {
2385da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
2386da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
2387da7f033dSHerbert Xu 				}
2388da7f033dSHerbert Xu 			}
2389da7f033dSHerbert Xu 		}
2390da7f033dSHerbert Xu 	}, {
2391da7f033dSHerbert Xu 		.alg = "gcm(aes)",
2392da7f033dSHerbert Xu 		.test = alg_test_aead,
2393a1915d51SJarod Wilson 		.fips_allowed = 1,
2394da7f033dSHerbert Xu 		.suite = {
2395da7f033dSHerbert Xu 			.aead = {
2396da7f033dSHerbert Xu 				.enc = {
2397da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
2398da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
2399da7f033dSHerbert Xu 				},
2400da7f033dSHerbert Xu 				.dec = {
2401da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
2402da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
2403da7f033dSHerbert Xu 				}
2404da7f033dSHerbert Xu 			}
2405da7f033dSHerbert Xu 		}
2406da7f033dSHerbert Xu 	}, {
2407507069c9SYouquan, Song 		.alg = "ghash",
2408507069c9SYouquan, Song 		.test = alg_test_hash,
240918c0ebd2SJarod Wilson 		.fips_allowed = 1,
2410507069c9SYouquan, Song 		.suite = {
2411507069c9SYouquan, Song 			.hash = {
2412507069c9SYouquan, Song 				.vecs = ghash_tv_template,
2413507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
2414507069c9SYouquan, Song 			}
2415507069c9SYouquan, Song 		}
2416507069c9SYouquan, Song 	}, {
2417a482b081SSonic Zhang 		.alg = "hmac(crc32)",
2418a482b081SSonic Zhang 		.test = alg_test_hash,
2419a482b081SSonic Zhang 		.suite = {
2420a482b081SSonic Zhang 			.hash = {
2421a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
2422a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
2423a482b081SSonic Zhang 			}
2424a482b081SSonic Zhang 		}
2425a482b081SSonic Zhang 	}, {
2426da7f033dSHerbert Xu 		.alg = "hmac(md5)",
2427da7f033dSHerbert Xu 		.test = alg_test_hash,
2428da7f033dSHerbert Xu 		.suite = {
2429da7f033dSHerbert Xu 			.hash = {
2430da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
2431da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
2432da7f033dSHerbert Xu 			}
2433da7f033dSHerbert Xu 		}
2434da7f033dSHerbert Xu 	}, {
2435da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
2436da7f033dSHerbert Xu 		.test = alg_test_hash,
2437da7f033dSHerbert Xu 		.suite = {
2438da7f033dSHerbert Xu 			.hash = {
2439da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
2440da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
2441da7f033dSHerbert Xu 			}
2442da7f033dSHerbert Xu 		}
2443da7f033dSHerbert Xu 	}, {
2444da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
2445da7f033dSHerbert Xu 		.test = alg_test_hash,
2446da7f033dSHerbert Xu 		.suite = {
2447da7f033dSHerbert Xu 			.hash = {
2448da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
2449da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
2450da7f033dSHerbert Xu 			}
2451da7f033dSHerbert Xu 		}
2452da7f033dSHerbert Xu 	}, {
2453da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
2454da7f033dSHerbert Xu 		.test = alg_test_hash,
2455a1915d51SJarod Wilson 		.fips_allowed = 1,
2456da7f033dSHerbert Xu 		.suite = {
2457da7f033dSHerbert Xu 			.hash = {
2458da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
2459da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
2460da7f033dSHerbert Xu 			}
2461da7f033dSHerbert Xu 		}
2462da7f033dSHerbert Xu 	}, {
2463da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
2464da7f033dSHerbert Xu 		.test = alg_test_hash,
2465a1915d51SJarod Wilson 		.fips_allowed = 1,
2466da7f033dSHerbert Xu 		.suite = {
2467da7f033dSHerbert Xu 			.hash = {
2468da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
2469da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
2470da7f033dSHerbert Xu 			}
2471da7f033dSHerbert Xu 		}
2472da7f033dSHerbert Xu 	}, {
2473da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
2474da7f033dSHerbert Xu 		.test = alg_test_hash,
2475a1915d51SJarod Wilson 		.fips_allowed = 1,
2476da7f033dSHerbert Xu 		.suite = {
2477da7f033dSHerbert Xu 			.hash = {
2478da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
2479da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
2480da7f033dSHerbert Xu 			}
2481da7f033dSHerbert Xu 		}
2482da7f033dSHerbert Xu 	}, {
2483da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
2484da7f033dSHerbert Xu 		.test = alg_test_hash,
2485a1915d51SJarod Wilson 		.fips_allowed = 1,
2486da7f033dSHerbert Xu 		.suite = {
2487da7f033dSHerbert Xu 			.hash = {
2488da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
2489da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
2490da7f033dSHerbert Xu 			}
2491da7f033dSHerbert Xu 		}
2492da7f033dSHerbert Xu 	}, {
2493da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
2494da7f033dSHerbert Xu 		.test = alg_test_hash,
2495a1915d51SJarod Wilson 		.fips_allowed = 1,
2496da7f033dSHerbert Xu 		.suite = {
2497da7f033dSHerbert Xu 			.hash = {
2498da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
2499da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
2500da7f033dSHerbert Xu 			}
2501da7f033dSHerbert Xu 		}
2502da7f033dSHerbert Xu 	}, {
2503da7f033dSHerbert Xu 		.alg = "lrw(aes)",
25041aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2505da7f033dSHerbert Xu 		.suite = {
2506da7f033dSHerbert Xu 			.cipher = {
2507da7f033dSHerbert Xu 				.enc = {
2508da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
2509da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
2510da7f033dSHerbert Xu 				},
2511da7f033dSHerbert Xu 				.dec = {
2512da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
2513da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
2514da7f033dSHerbert Xu 				}
2515da7f033dSHerbert Xu 			}
2516da7f033dSHerbert Xu 		}
2517da7f033dSHerbert Xu 	}, {
25180840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
25190840605eSJussi Kivilinna 		.test = alg_test_skcipher,
25200840605eSJussi Kivilinna 		.suite = {
25210840605eSJussi Kivilinna 			.cipher = {
25220840605eSJussi Kivilinna 				.enc = {
25230840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
25240840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
25250840605eSJussi Kivilinna 				},
25260840605eSJussi Kivilinna 				.dec = {
25270840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
25280840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
25290840605eSJussi Kivilinna 				}
25300840605eSJussi Kivilinna 			}
25310840605eSJussi Kivilinna 		}
25320840605eSJussi Kivilinna 	}, {
2533d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
2534d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
2535d7bfc0faSJussi Kivilinna 		.suite = {
2536d7bfc0faSJussi Kivilinna 			.cipher = {
2537d7bfc0faSJussi Kivilinna 				.enc = {
2538d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
2539d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
2540d7bfc0faSJussi Kivilinna 				},
2541d7bfc0faSJussi Kivilinna 				.dec = {
2542d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
2543d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
2544d7bfc0faSJussi Kivilinna 				}
2545d7bfc0faSJussi Kivilinna 			}
2546d7bfc0faSJussi Kivilinna 		}
2547d7bfc0faSJussi Kivilinna 	}, {
25480b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
25490b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
25500b2a1551SJussi Kivilinna 		.suite = {
25510b2a1551SJussi Kivilinna 			.cipher = {
25520b2a1551SJussi Kivilinna 				.enc = {
25530b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
25540b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
25550b2a1551SJussi Kivilinna 				},
25560b2a1551SJussi Kivilinna 				.dec = {
25570b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
25580b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
25590b2a1551SJussi Kivilinna 				}
25600b2a1551SJussi Kivilinna 			}
25610b2a1551SJussi Kivilinna 		}
25620b2a1551SJussi Kivilinna 	}, {
2563da7f033dSHerbert Xu 		.alg = "lzo",
2564da7f033dSHerbert Xu 		.test = alg_test_comp,
2565da7f033dSHerbert Xu 		.suite = {
2566da7f033dSHerbert Xu 			.comp = {
2567da7f033dSHerbert Xu 				.comp = {
2568da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
2569da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
2570da7f033dSHerbert Xu 				},
2571da7f033dSHerbert Xu 				.decomp = {
2572da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
2573da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
2574da7f033dSHerbert Xu 				}
2575da7f033dSHerbert Xu 			}
2576da7f033dSHerbert Xu 		}
2577da7f033dSHerbert Xu 	}, {
2578da7f033dSHerbert Xu 		.alg = "md4",
2579da7f033dSHerbert Xu 		.test = alg_test_hash,
2580da7f033dSHerbert Xu 		.suite = {
2581da7f033dSHerbert Xu 			.hash = {
2582da7f033dSHerbert Xu 				.vecs = md4_tv_template,
2583da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
2584da7f033dSHerbert Xu 			}
2585da7f033dSHerbert Xu 		}
2586da7f033dSHerbert Xu 	}, {
2587da7f033dSHerbert Xu 		.alg = "md5",
2588da7f033dSHerbert Xu 		.test = alg_test_hash,
2589da7f033dSHerbert Xu 		.suite = {
2590da7f033dSHerbert Xu 			.hash = {
2591da7f033dSHerbert Xu 				.vecs = md5_tv_template,
2592da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
2593da7f033dSHerbert Xu 			}
2594da7f033dSHerbert Xu 		}
2595da7f033dSHerbert Xu 	}, {
2596da7f033dSHerbert Xu 		.alg = "michael_mic",
2597da7f033dSHerbert Xu 		.test = alg_test_hash,
2598da7f033dSHerbert Xu 		.suite = {
2599da7f033dSHerbert Xu 			.hash = {
2600da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
2601da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
2602da7f033dSHerbert Xu 			}
2603da7f033dSHerbert Xu 		}
2604da7f033dSHerbert Xu 	}, {
2605ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
2606ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
2607ba0e14acSPuneet Saxena 		.fips_allowed = 1,
2608ba0e14acSPuneet Saxena 		.suite = {
2609ba0e14acSPuneet Saxena 			.cipher = {
2610ba0e14acSPuneet Saxena 				.enc = {
2611ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
2612ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
2613ba0e14acSPuneet Saxena 				},
2614ba0e14acSPuneet Saxena 				.dec = {
2615ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
2616ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
2617ba0e14acSPuneet Saxena 				}
2618ba0e14acSPuneet Saxena 			}
2619ba0e14acSPuneet Saxena 		}
2620ba0e14acSPuneet Saxena 	}, {
2621da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
26221aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2623da7f033dSHerbert Xu 		.suite = {
2624da7f033dSHerbert Xu 			.cipher = {
2625da7f033dSHerbert Xu 				.enc = {
2626da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
2627da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
2628da7f033dSHerbert Xu 				},
2629da7f033dSHerbert Xu 				.dec = {
2630da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
2631da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
2632da7f033dSHerbert Xu 				}
2633da7f033dSHerbert Xu 			}
2634da7f033dSHerbert Xu 		}
2635da7f033dSHerbert Xu 	}, {
2636da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
26371aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2638a1915d51SJarod Wilson 		.fips_allowed = 1,
2639da7f033dSHerbert Xu 		.suite = {
2640da7f033dSHerbert Xu 			.cipher = {
2641da7f033dSHerbert Xu 				.enc = {
2642f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
2643f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
2644da7f033dSHerbert Xu 				},
2645da7f033dSHerbert Xu 				.dec = {
2646f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
2647f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
2648da7f033dSHerbert Xu 				}
2649da7f033dSHerbert Xu 			}
2650da7f033dSHerbert Xu 		}
2651da7f033dSHerbert Xu 	}, {
265269435b94SAdrian Hoban 		.alg = "rfc4106(gcm(aes))",
265369435b94SAdrian Hoban 		.test = alg_test_aead,
265469435b94SAdrian Hoban 		.suite = {
265569435b94SAdrian Hoban 			.aead = {
265669435b94SAdrian Hoban 				.enc = {
265769435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
265869435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
265969435b94SAdrian Hoban 				},
266069435b94SAdrian Hoban 				.dec = {
266169435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
266269435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
266369435b94SAdrian Hoban 				}
266469435b94SAdrian Hoban 			}
266569435b94SAdrian Hoban 		}
266669435b94SAdrian Hoban 	}, {
266769435b94SAdrian Hoban 
266869435b94SAdrian Hoban 
26695d667322SJarod Wilson 		.alg = "rfc4309(ccm(aes))",
26705d667322SJarod Wilson 		.test = alg_test_aead,
2671a1915d51SJarod Wilson 		.fips_allowed = 1,
26725d667322SJarod Wilson 		.suite = {
26735d667322SJarod Wilson 			.aead = {
26745d667322SJarod Wilson 				.enc = {
26755d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
26765d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
26775d667322SJarod Wilson 				},
26785d667322SJarod Wilson 				.dec = {
26795d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
26805d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
26815d667322SJarod Wilson 				}
26825d667322SJarod Wilson 			}
26835d667322SJarod Wilson 		}
26845d667322SJarod Wilson 	}, {
2685da7f033dSHerbert Xu 		.alg = "rmd128",
2686da7f033dSHerbert Xu 		.test = alg_test_hash,
2687da7f033dSHerbert Xu 		.suite = {
2688da7f033dSHerbert Xu 			.hash = {
2689da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
2690da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
2691da7f033dSHerbert Xu 			}
2692da7f033dSHerbert Xu 		}
2693da7f033dSHerbert Xu 	}, {
2694da7f033dSHerbert Xu 		.alg = "rmd160",
2695da7f033dSHerbert Xu 		.test = alg_test_hash,
2696da7f033dSHerbert Xu 		.suite = {
2697da7f033dSHerbert Xu 			.hash = {
2698da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
2699da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
2700da7f033dSHerbert Xu 			}
2701da7f033dSHerbert Xu 		}
2702da7f033dSHerbert Xu 	}, {
2703da7f033dSHerbert Xu 		.alg = "rmd256",
2704da7f033dSHerbert Xu 		.test = alg_test_hash,
2705da7f033dSHerbert Xu 		.suite = {
2706da7f033dSHerbert Xu 			.hash = {
2707da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
2708da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
2709da7f033dSHerbert Xu 			}
2710da7f033dSHerbert Xu 		}
2711da7f033dSHerbert Xu 	}, {
2712da7f033dSHerbert Xu 		.alg = "rmd320",
2713da7f033dSHerbert Xu 		.test = alg_test_hash,
2714da7f033dSHerbert Xu 		.suite = {
2715da7f033dSHerbert Xu 			.hash = {
2716da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
2717da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
2718da7f033dSHerbert Xu 			}
2719da7f033dSHerbert Xu 		}
2720da7f033dSHerbert Xu 	}, {
2721da7f033dSHerbert Xu 		.alg = "salsa20",
27221aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2723da7f033dSHerbert Xu 		.suite = {
2724da7f033dSHerbert Xu 			.cipher = {
2725da7f033dSHerbert Xu 				.enc = {
2726da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
2727da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
2728da7f033dSHerbert Xu 				}
2729da7f033dSHerbert Xu 			}
2730da7f033dSHerbert Xu 		}
2731da7f033dSHerbert Xu 	}, {
2732da7f033dSHerbert Xu 		.alg = "sha1",
2733da7f033dSHerbert Xu 		.test = alg_test_hash,
2734a1915d51SJarod Wilson 		.fips_allowed = 1,
2735da7f033dSHerbert Xu 		.suite = {
2736da7f033dSHerbert Xu 			.hash = {
2737da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
2738da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
2739da7f033dSHerbert Xu 			}
2740da7f033dSHerbert Xu 		}
2741da7f033dSHerbert Xu 	}, {
2742da7f033dSHerbert Xu 		.alg = "sha224",
2743da7f033dSHerbert Xu 		.test = alg_test_hash,
2744a1915d51SJarod Wilson 		.fips_allowed = 1,
2745da7f033dSHerbert Xu 		.suite = {
2746da7f033dSHerbert Xu 			.hash = {
2747da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
2748da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
2749da7f033dSHerbert Xu 			}
2750da7f033dSHerbert Xu 		}
2751da7f033dSHerbert Xu 	}, {
2752da7f033dSHerbert Xu 		.alg = "sha256",
2753da7f033dSHerbert Xu 		.test = alg_test_hash,
2754a1915d51SJarod Wilson 		.fips_allowed = 1,
2755da7f033dSHerbert Xu 		.suite = {
2756da7f033dSHerbert Xu 			.hash = {
2757da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
2758da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
2759da7f033dSHerbert Xu 			}
2760da7f033dSHerbert Xu 		}
2761da7f033dSHerbert Xu 	}, {
2762da7f033dSHerbert Xu 		.alg = "sha384",
2763da7f033dSHerbert Xu 		.test = alg_test_hash,
2764a1915d51SJarod Wilson 		.fips_allowed = 1,
2765da7f033dSHerbert Xu 		.suite = {
2766da7f033dSHerbert Xu 			.hash = {
2767da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
2768da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
2769da7f033dSHerbert Xu 			}
2770da7f033dSHerbert Xu 		}
2771da7f033dSHerbert Xu 	}, {
2772da7f033dSHerbert Xu 		.alg = "sha512",
2773da7f033dSHerbert Xu 		.test = alg_test_hash,
2774a1915d51SJarod Wilson 		.fips_allowed = 1,
2775da7f033dSHerbert Xu 		.suite = {
2776da7f033dSHerbert Xu 			.hash = {
2777da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
2778da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
2779da7f033dSHerbert Xu 			}
2780da7f033dSHerbert Xu 		}
2781da7f033dSHerbert Xu 	}, {
2782da7f033dSHerbert Xu 		.alg = "tgr128",
2783da7f033dSHerbert Xu 		.test = alg_test_hash,
2784da7f033dSHerbert Xu 		.suite = {
2785da7f033dSHerbert Xu 			.hash = {
2786da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
2787da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
2788da7f033dSHerbert Xu 			}
2789da7f033dSHerbert Xu 		}
2790da7f033dSHerbert Xu 	}, {
2791da7f033dSHerbert Xu 		.alg = "tgr160",
2792da7f033dSHerbert Xu 		.test = alg_test_hash,
2793da7f033dSHerbert Xu 		.suite = {
2794da7f033dSHerbert Xu 			.hash = {
2795da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
2796da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
2797da7f033dSHerbert Xu 			}
2798da7f033dSHerbert Xu 		}
2799da7f033dSHerbert Xu 	}, {
2800da7f033dSHerbert Xu 		.alg = "tgr192",
2801da7f033dSHerbert Xu 		.test = alg_test_hash,
2802da7f033dSHerbert Xu 		.suite = {
2803da7f033dSHerbert Xu 			.hash = {
2804da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
2805da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
2806da7f033dSHerbert Xu 			}
2807da7f033dSHerbert Xu 		}
2808da7f033dSHerbert Xu 	}, {
2809f1939f7cSShane Wang 		.alg = "vmac(aes)",
2810f1939f7cSShane Wang 		.test = alg_test_hash,
2811f1939f7cSShane Wang 		.suite = {
2812f1939f7cSShane Wang 			.hash = {
2813f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
2814f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
2815f1939f7cSShane Wang 			}
2816f1939f7cSShane Wang 		}
2817f1939f7cSShane Wang 	}, {
2818da7f033dSHerbert Xu 		.alg = "wp256",
2819da7f033dSHerbert Xu 		.test = alg_test_hash,
2820da7f033dSHerbert Xu 		.suite = {
2821da7f033dSHerbert Xu 			.hash = {
2822da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
2823da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
2824da7f033dSHerbert Xu 			}
2825da7f033dSHerbert Xu 		}
2826da7f033dSHerbert Xu 	}, {
2827da7f033dSHerbert Xu 		.alg = "wp384",
2828da7f033dSHerbert Xu 		.test = alg_test_hash,
2829da7f033dSHerbert Xu 		.suite = {
2830da7f033dSHerbert Xu 			.hash = {
2831da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
2832da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
2833da7f033dSHerbert Xu 			}
2834da7f033dSHerbert Xu 		}
2835da7f033dSHerbert Xu 	}, {
2836da7f033dSHerbert Xu 		.alg = "wp512",
2837da7f033dSHerbert Xu 		.test = alg_test_hash,
2838da7f033dSHerbert Xu 		.suite = {
2839da7f033dSHerbert Xu 			.hash = {
2840da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
2841da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
2842da7f033dSHerbert Xu 			}
2843da7f033dSHerbert Xu 		}
2844da7f033dSHerbert Xu 	}, {
2845da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
2846da7f033dSHerbert Xu 		.test = alg_test_hash,
2847da7f033dSHerbert Xu 		.suite = {
2848da7f033dSHerbert Xu 			.hash = {
2849da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
2850da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
2851da7f033dSHerbert Xu 			}
2852da7f033dSHerbert Xu 		}
2853da7f033dSHerbert Xu 	}, {
2854da7f033dSHerbert Xu 		.alg = "xts(aes)",
28551aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
28562918aa8dSJarod Wilson 		.fips_allowed = 1,
2857da7f033dSHerbert Xu 		.suite = {
2858da7f033dSHerbert Xu 			.cipher = {
2859da7f033dSHerbert Xu 				.enc = {
2860da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
2861da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
2862da7f033dSHerbert Xu 				},
2863da7f033dSHerbert Xu 				.dec = {
2864da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
2865da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
2866da7f033dSHerbert Xu 				}
2867da7f033dSHerbert Xu 			}
2868da7f033dSHerbert Xu 		}
28690c01aed5SGeert Uytterhoeven 	}, {
28700840605eSJussi Kivilinna 		.alg = "xts(camellia)",
28710840605eSJussi Kivilinna 		.test = alg_test_skcipher,
28720840605eSJussi Kivilinna 		.suite = {
28730840605eSJussi Kivilinna 			.cipher = {
28740840605eSJussi Kivilinna 				.enc = {
28750840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
28760840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
28770840605eSJussi Kivilinna 				},
28780840605eSJussi Kivilinna 				.dec = {
28790840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
28800840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
28810840605eSJussi Kivilinna 				}
28820840605eSJussi Kivilinna 			}
28830840605eSJussi Kivilinna 		}
28840840605eSJussi Kivilinna 	}, {
288518be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
288618be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
288718be20b9SJussi Kivilinna 		.suite = {
288818be20b9SJussi Kivilinna 			.cipher = {
288918be20b9SJussi Kivilinna 				.enc = {
289018be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
289118be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
289218be20b9SJussi Kivilinna 				},
289318be20b9SJussi Kivilinna 				.dec = {
289418be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
289518be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
289618be20b9SJussi Kivilinna 				}
289718be20b9SJussi Kivilinna 			}
289818be20b9SJussi Kivilinna 		}
289918be20b9SJussi Kivilinna 	}, {
2900aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
2901aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
2902aed265b9SJussi Kivilinna 		.suite = {
2903aed265b9SJussi Kivilinna 			.cipher = {
2904aed265b9SJussi Kivilinna 				.enc = {
2905aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
2906aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
2907aed265b9SJussi Kivilinna 				},
2908aed265b9SJussi Kivilinna 				.dec = {
2909aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
2910aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
2911aed265b9SJussi Kivilinna 				}
2912aed265b9SJussi Kivilinna 			}
2913aed265b9SJussi Kivilinna 		}
2914aed265b9SJussi Kivilinna 	}, {
29150c01aed5SGeert Uytterhoeven 		.alg = "zlib",
29160c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
29170c01aed5SGeert Uytterhoeven 		.suite = {
29180c01aed5SGeert Uytterhoeven 			.pcomp = {
29190c01aed5SGeert Uytterhoeven 				.comp = {
29200c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
29210c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
29220c01aed5SGeert Uytterhoeven 				},
29230c01aed5SGeert Uytterhoeven 				.decomp = {
29240c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
29250c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
29260c01aed5SGeert Uytterhoeven 				}
29270c01aed5SGeert Uytterhoeven 			}
29280c01aed5SGeert Uytterhoeven 		}
2929da7f033dSHerbert Xu 	}
2930da7f033dSHerbert Xu };
2931da7f033dSHerbert Xu 
29321aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
2933da7f033dSHerbert Xu {
2934da7f033dSHerbert Xu 	int start = 0;
2935da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
2936da7f033dSHerbert Xu 
2937da7f033dSHerbert Xu 	while (start < end) {
2938da7f033dSHerbert Xu 		int i = (start + end) / 2;
2939da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
2940da7f033dSHerbert Xu 
2941da7f033dSHerbert Xu 		if (diff > 0) {
2942da7f033dSHerbert Xu 			end = i;
2943da7f033dSHerbert Xu 			continue;
2944da7f033dSHerbert Xu 		}
2945da7f033dSHerbert Xu 
2946da7f033dSHerbert Xu 		if (diff < 0) {
2947da7f033dSHerbert Xu 			start = i + 1;
2948da7f033dSHerbert Xu 			continue;
2949da7f033dSHerbert Xu 		}
2950da7f033dSHerbert Xu 
29511aa4ecd9SHerbert Xu 		return i;
2952da7f033dSHerbert Xu 	}
2953da7f033dSHerbert Xu 
29541aa4ecd9SHerbert Xu 	return -1;
29551aa4ecd9SHerbert Xu }
29561aa4ecd9SHerbert Xu 
29571aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
29581aa4ecd9SHerbert Xu {
29591aa4ecd9SHerbert Xu 	int i;
2960a68f6610SHerbert Xu 	int j;
2961d12d6b6dSNeil Horman 	int rc;
29621aa4ecd9SHerbert Xu 
29631aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
29641aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
29651aa4ecd9SHerbert Xu 
29661aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
29671aa4ecd9SHerbert Xu 		    sizeof(nalg))
29681aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
29691aa4ecd9SHerbert Xu 
29701aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
29711aa4ecd9SHerbert Xu 		if (i < 0)
29721aa4ecd9SHerbert Xu 			goto notest;
29731aa4ecd9SHerbert Xu 
2974a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
2975a3bef3a3SJarod Wilson 			goto non_fips_alg;
2976a3bef3a3SJarod Wilson 
2977941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
2978941fb328SJarod Wilson 		goto test_done;
29791aa4ecd9SHerbert Xu 	}
29801aa4ecd9SHerbert Xu 
29811aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
2982a68f6610SHerbert Xu 	j = alg_find_test(driver);
2983a68f6610SHerbert Xu 	if (i < 0 && j < 0)
29841aa4ecd9SHerbert Xu 		goto notest;
29851aa4ecd9SHerbert Xu 
2986a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
2987a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
2988a3bef3a3SJarod Wilson 		goto non_fips_alg;
2989a3bef3a3SJarod Wilson 
2990a68f6610SHerbert Xu 	rc = 0;
2991a68f6610SHerbert Xu 	if (i >= 0)
2992a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
29931aa4ecd9SHerbert Xu 					     type, mask);
2994a68f6610SHerbert Xu 	if (j >= 0)
2995a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
2996a68f6610SHerbert Xu 					     type, mask);
2997a68f6610SHerbert Xu 
2998941fb328SJarod Wilson test_done:
2999d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3000d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3001d12d6b6dSNeil Horman 
300229ecd4abSJarod Wilson 	if (fips_enabled && !rc)
300329ecd4abSJarod Wilson 		printk(KERN_INFO "alg: self-tests for %s (%s) passed\n",
300429ecd4abSJarod Wilson 		       driver, alg);
300529ecd4abSJarod Wilson 
3006d12d6b6dSNeil Horman 	return rc;
30071aa4ecd9SHerbert Xu 
30081aa4ecd9SHerbert Xu notest:
3009da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3010da7f033dSHerbert Xu 	return 0;
3011a3bef3a3SJarod Wilson non_fips_alg:
3012a3bef3a3SJarod Wilson 	return -EINVAL;
3013da7f033dSHerbert Xu }
30140b767f96SAlexander Shishkin 
3015326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
30160b767f96SAlexander Shishkin 
3017da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3018