xref: /openbmc/linux/crypto/testmgr.c (revision 863b557a)
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  *
9da7f033dSHerbert Xu  * This program is free software; you can redistribute it and/or modify it
10da7f033dSHerbert Xu  * under the terms of the GNU General Public License as published by the Free
11da7f033dSHerbert Xu  * Software Foundation; either version 2 of the License, or (at your option)
12da7f033dSHerbert Xu  * any later version.
13da7f033dSHerbert Xu  *
14da7f033dSHerbert Xu  */
15da7f033dSHerbert Xu 
16da7f033dSHerbert Xu #include <crypto/hash.h>
17da7f033dSHerbert Xu #include <linux/err.h>
18da7f033dSHerbert Xu #include <linux/module.h>
19da7f033dSHerbert Xu #include <linux/scatterlist.h>
20da7f033dSHerbert Xu #include <linux/slab.h>
21da7f033dSHerbert Xu #include <linux/string.h>
227647d6ceSJarod Wilson #include <crypto/rng.h>
23da7f033dSHerbert Xu 
24da7f033dSHerbert Xu #include "internal.h"
25da7f033dSHerbert Xu #include "testmgr.h"
26da7f033dSHerbert Xu 
27da7f033dSHerbert Xu /*
28da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
29da7f033dSHerbert Xu  */
30da7f033dSHerbert Xu #define XBUFSIZE	8
31da7f033dSHerbert Xu 
32da7f033dSHerbert Xu /*
33da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
34da7f033dSHerbert Xu  */
35da7f033dSHerbert Xu #define IDX1		32
36da7f033dSHerbert Xu #define IDX2		32400
37da7f033dSHerbert Xu #define IDX3		1
38da7f033dSHerbert Xu #define IDX4		8193
39da7f033dSHerbert Xu #define IDX5		22222
40da7f033dSHerbert Xu #define IDX6		17101
41da7f033dSHerbert Xu #define IDX7		27333
42da7f033dSHerbert Xu #define IDX8		3000
43da7f033dSHerbert Xu 
44da7f033dSHerbert Xu /*
45da7f033dSHerbert Xu * Used by test_cipher()
46da7f033dSHerbert Xu */
47da7f033dSHerbert Xu #define ENCRYPT 1
48da7f033dSHerbert Xu #define DECRYPT 0
49da7f033dSHerbert Xu 
50da7f033dSHerbert Xu struct tcrypt_result {
51da7f033dSHerbert Xu 	struct completion completion;
52da7f033dSHerbert Xu 	int err;
53da7f033dSHerbert Xu };
54da7f033dSHerbert Xu 
55da7f033dSHerbert Xu struct aead_test_suite {
56da7f033dSHerbert Xu 	struct {
57da7f033dSHerbert Xu 		struct aead_testvec *vecs;
58da7f033dSHerbert Xu 		unsigned int count;
59da7f033dSHerbert Xu 	} enc, dec;
60da7f033dSHerbert Xu };
61da7f033dSHerbert Xu 
62da7f033dSHerbert Xu struct cipher_test_suite {
63da7f033dSHerbert Xu 	struct {
64da7f033dSHerbert Xu 		struct cipher_testvec *vecs;
65da7f033dSHerbert Xu 		unsigned int count;
66da7f033dSHerbert Xu 	} enc, dec;
67da7f033dSHerbert Xu };
68da7f033dSHerbert Xu 
69da7f033dSHerbert Xu struct comp_test_suite {
70da7f033dSHerbert Xu 	struct {
71da7f033dSHerbert Xu 		struct comp_testvec *vecs;
72da7f033dSHerbert Xu 		unsigned int count;
73da7f033dSHerbert Xu 	} comp, decomp;
74da7f033dSHerbert Xu };
75da7f033dSHerbert Xu 
768064efb8SGeert Uytterhoeven struct pcomp_test_suite {
778064efb8SGeert Uytterhoeven 	struct {
788064efb8SGeert Uytterhoeven 		struct pcomp_testvec *vecs;
798064efb8SGeert Uytterhoeven 		unsigned int count;
808064efb8SGeert Uytterhoeven 	} comp, decomp;
818064efb8SGeert Uytterhoeven };
828064efb8SGeert Uytterhoeven 
83da7f033dSHerbert Xu struct hash_test_suite {
84da7f033dSHerbert Xu 	struct hash_testvec *vecs;
85da7f033dSHerbert Xu 	unsigned int count;
86da7f033dSHerbert Xu };
87da7f033dSHerbert Xu 
887647d6ceSJarod Wilson struct cprng_test_suite {
897647d6ceSJarod Wilson 	struct cprng_testvec *vecs;
907647d6ceSJarod Wilson 	unsigned int count;
917647d6ceSJarod Wilson };
927647d6ceSJarod Wilson 
93da7f033dSHerbert Xu struct alg_test_desc {
94da7f033dSHerbert Xu 	const char *alg;
95da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
96da7f033dSHerbert Xu 		    u32 type, u32 mask);
97a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
98da7f033dSHerbert Xu 
99da7f033dSHerbert Xu 	union {
100da7f033dSHerbert Xu 		struct aead_test_suite aead;
101da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
102da7f033dSHerbert Xu 		struct comp_test_suite comp;
1038064efb8SGeert Uytterhoeven 		struct pcomp_test_suite pcomp;
104da7f033dSHerbert Xu 		struct hash_test_suite hash;
1057647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
106da7f033dSHerbert Xu 	} suite;
107da7f033dSHerbert Xu };
108da7f033dSHerbert Xu 
109da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
110da7f033dSHerbert Xu 
111da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
112da7f033dSHerbert Xu {
113da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
114da7f033dSHerbert Xu 			16, 1,
115da7f033dSHerbert Xu 			buf, len, false);
116da7f033dSHerbert Xu }
117da7f033dSHerbert Xu 
118da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
119da7f033dSHerbert Xu {
120da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
121da7f033dSHerbert Xu 
122da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
123da7f033dSHerbert Xu 		return;
124da7f033dSHerbert Xu 
125da7f033dSHerbert Xu 	res->err = err;
126da7f033dSHerbert Xu 	complete(&res->completion);
127da7f033dSHerbert Xu }
128da7f033dSHerbert Xu 
129f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
130f8b0d4d0SHerbert Xu {
131f8b0d4d0SHerbert Xu 	int i;
132f8b0d4d0SHerbert Xu 
133f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
134f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
135f8b0d4d0SHerbert Xu 		if (!buf[i])
136f8b0d4d0SHerbert Xu 			goto err_free_buf;
137f8b0d4d0SHerbert Xu 	}
138f8b0d4d0SHerbert Xu 
139f8b0d4d0SHerbert Xu 	return 0;
140f8b0d4d0SHerbert Xu 
141f8b0d4d0SHerbert Xu err_free_buf:
142f8b0d4d0SHerbert Xu 	while (i-- > 0)
143f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
144f8b0d4d0SHerbert Xu 
145f8b0d4d0SHerbert Xu 	return -ENOMEM;
146f8b0d4d0SHerbert Xu }
147f8b0d4d0SHerbert Xu 
148f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
149f8b0d4d0SHerbert Xu {
150f8b0d4d0SHerbert Xu 	int i;
151f8b0d4d0SHerbert Xu 
152f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
153f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
154f8b0d4d0SHerbert Xu }
155f8b0d4d0SHerbert Xu 
156da7f033dSHerbert Xu static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
157da7f033dSHerbert Xu 		     unsigned int tcount)
158da7f033dSHerbert Xu {
159da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
160da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
161da7f033dSHerbert Xu 	struct scatterlist sg[8];
162da7f033dSHerbert Xu 	char result[64];
163da7f033dSHerbert Xu 	struct ahash_request *req;
164da7f033dSHerbert Xu 	struct tcrypt_result tresult;
165da7f033dSHerbert Xu 	void *hash_buff;
166f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
167f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
168f8b0d4d0SHerbert Xu 
169f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
170f8b0d4d0SHerbert Xu 		goto out_nobuf;
171da7f033dSHerbert Xu 
172da7f033dSHerbert Xu 	init_completion(&tresult.completion);
173da7f033dSHerbert Xu 
174da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
175da7f033dSHerbert Xu 	if (!req) {
176da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
177da7f033dSHerbert Xu 		       "%s\n", algo);
178da7f033dSHerbert Xu 		goto out_noreq;
179da7f033dSHerbert Xu 	}
180da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
181da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
182da7f033dSHerbert Xu 
183a0cfae59SHerbert Xu 	j = 0;
184da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
185a0cfae59SHerbert Xu 		if (template[i].np)
186a0cfae59SHerbert Xu 			continue;
187a0cfae59SHerbert Xu 
188a0cfae59SHerbert Xu 		j++;
189da7f033dSHerbert Xu 		memset(result, 0, 64);
190da7f033dSHerbert Xu 
191da7f033dSHerbert Xu 		hash_buff = xbuf[0];
192da7f033dSHerbert Xu 
193da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
194da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
195da7f033dSHerbert Xu 
196da7f033dSHerbert Xu 		if (template[i].ksize) {
197da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
198da7f033dSHerbert Xu 			ret = crypto_ahash_setkey(tfm, template[i].key,
199da7f033dSHerbert Xu 						  template[i].ksize);
200da7f033dSHerbert Xu 			if (ret) {
201da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
202a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
203da7f033dSHerbert Xu 				       -ret);
204da7f033dSHerbert Xu 				goto out;
205da7f033dSHerbert Xu 			}
206da7f033dSHerbert Xu 		}
207da7f033dSHerbert Xu 
208da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
209da7f033dSHerbert Xu 		ret = crypto_ahash_digest(req);
210da7f033dSHerbert Xu 		switch (ret) {
211da7f033dSHerbert Xu 		case 0:
212da7f033dSHerbert Xu 			break;
213da7f033dSHerbert Xu 		case -EINPROGRESS:
214da7f033dSHerbert Xu 		case -EBUSY:
215da7f033dSHerbert Xu 			ret = wait_for_completion_interruptible(
216da7f033dSHerbert Xu 				&tresult.completion);
217da7f033dSHerbert Xu 			if (!ret && !(ret = tresult.err)) {
218da7f033dSHerbert Xu 				INIT_COMPLETION(tresult.completion);
219da7f033dSHerbert Xu 				break;
220da7f033dSHerbert Xu 			}
221da7f033dSHerbert Xu 			/* fall through */
222da7f033dSHerbert Xu 		default:
223da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: digest failed on test %d "
224a0cfae59SHerbert Xu 			       "for %s: ret=%d\n", j, algo, -ret);
225da7f033dSHerbert Xu 			goto out;
226da7f033dSHerbert Xu 		}
227da7f033dSHerbert Xu 
228da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
229da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
230da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
231a0cfae59SHerbert Xu 			       j, algo);
232da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
233da7f033dSHerbert Xu 			ret = -EINVAL;
234da7f033dSHerbert Xu 			goto out;
235da7f033dSHerbert Xu 		}
236da7f033dSHerbert Xu 	}
237da7f033dSHerbert Xu 
238da7f033dSHerbert Xu 	j = 0;
239da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
240da7f033dSHerbert Xu 		if (template[i].np) {
241da7f033dSHerbert Xu 			j++;
242da7f033dSHerbert Xu 			memset(result, 0, 64);
243da7f033dSHerbert Xu 
244da7f033dSHerbert Xu 			temp = 0;
245da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
246fd57f22aSHerbert Xu 			ret = -EINVAL;
247da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
248fd57f22aSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
249fd57f22aSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
250fd57f22aSHerbert Xu 					goto out;
251da7f033dSHerbert Xu 				sg_set_buf(&sg[k],
252da7f033dSHerbert Xu 					   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
253da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
254da7f033dSHerbert Xu 						  template[i].plaintext + temp,
255da7f033dSHerbert Xu 						  template[i].tap[k]),
256da7f033dSHerbert Xu 					   template[i].tap[k]);
257da7f033dSHerbert Xu 				temp += template[i].tap[k];
258da7f033dSHerbert Xu 			}
259da7f033dSHerbert Xu 
260da7f033dSHerbert Xu 			if (template[i].ksize) {
261da7f033dSHerbert Xu 				crypto_ahash_clear_flags(tfm, ~0);
262da7f033dSHerbert Xu 				ret = crypto_ahash_setkey(tfm, template[i].key,
263da7f033dSHerbert Xu 							  template[i].ksize);
264da7f033dSHerbert Xu 
265da7f033dSHerbert Xu 				if (ret) {
266da7f033dSHerbert Xu 					printk(KERN_ERR "alg: hash: setkey "
267da7f033dSHerbert Xu 					       "failed on chunking test %d "
268da7f033dSHerbert Xu 					       "for %s: ret=%d\n", j, algo,
269da7f033dSHerbert Xu 					       -ret);
270da7f033dSHerbert Xu 					goto out;
271da7f033dSHerbert Xu 				}
272da7f033dSHerbert Xu 			}
273da7f033dSHerbert Xu 
274da7f033dSHerbert Xu 			ahash_request_set_crypt(req, sg, result,
275da7f033dSHerbert Xu 						template[i].psize);
276da7f033dSHerbert Xu 			ret = crypto_ahash_digest(req);
277da7f033dSHerbert Xu 			switch (ret) {
278da7f033dSHerbert Xu 			case 0:
279da7f033dSHerbert Xu 				break;
280da7f033dSHerbert Xu 			case -EINPROGRESS:
281da7f033dSHerbert Xu 			case -EBUSY:
282da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
283da7f033dSHerbert Xu 					&tresult.completion);
284da7f033dSHerbert Xu 				if (!ret && !(ret = tresult.err)) {
285da7f033dSHerbert Xu 					INIT_COMPLETION(tresult.completion);
286da7f033dSHerbert Xu 					break;
287da7f033dSHerbert Xu 				}
288da7f033dSHerbert Xu 				/* fall through */
289da7f033dSHerbert Xu 			default:
290da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: digest failed "
291da7f033dSHerbert Xu 				       "on chunking test %d for %s: "
292da7f033dSHerbert Xu 				       "ret=%d\n", j, algo, -ret);
293da7f033dSHerbert Xu 				goto out;
294da7f033dSHerbert Xu 			}
295da7f033dSHerbert Xu 
296da7f033dSHerbert Xu 			if (memcmp(result, template[i].digest,
297da7f033dSHerbert Xu 				   crypto_ahash_digestsize(tfm))) {
298da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: Chunking test %d "
299da7f033dSHerbert Xu 				       "failed for %s\n", j, algo);
300da7f033dSHerbert Xu 				hexdump(result, crypto_ahash_digestsize(tfm));
301da7f033dSHerbert Xu 				ret = -EINVAL;
302da7f033dSHerbert Xu 				goto out;
303da7f033dSHerbert Xu 			}
304da7f033dSHerbert Xu 		}
305da7f033dSHerbert Xu 	}
306da7f033dSHerbert Xu 
307da7f033dSHerbert Xu 	ret = 0;
308da7f033dSHerbert Xu 
309da7f033dSHerbert Xu out:
310da7f033dSHerbert Xu 	ahash_request_free(req);
311da7f033dSHerbert Xu out_noreq:
312f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
313f8b0d4d0SHerbert Xu out_nobuf:
314da7f033dSHerbert Xu 	return ret;
315da7f033dSHerbert Xu }
316da7f033dSHerbert Xu 
317da7f033dSHerbert Xu static int test_aead(struct crypto_aead *tfm, int enc,
318da7f033dSHerbert Xu 		     struct aead_testvec *template, unsigned int tcount)
319da7f033dSHerbert Xu {
320da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
321da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
322f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
323da7f033dSHerbert Xu 	char *q;
324da7f033dSHerbert Xu 	char *key;
325da7f033dSHerbert Xu 	struct aead_request *req;
326da7f033dSHerbert Xu 	struct scatterlist sg[8];
327da7f033dSHerbert Xu 	struct scatterlist asg[8];
328da7f033dSHerbert Xu 	const char *e;
329da7f033dSHerbert Xu 	struct tcrypt_result result;
330da7f033dSHerbert Xu 	unsigned int authsize;
331da7f033dSHerbert Xu 	void *input;
332da7f033dSHerbert Xu 	void *assoc;
333da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
334f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
335f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
336f8b0d4d0SHerbert Xu 
337f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
338f8b0d4d0SHerbert Xu 		goto out_noxbuf;
339f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
340f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
341da7f033dSHerbert Xu 
342da7f033dSHerbert Xu 	if (enc == ENCRYPT)
343da7f033dSHerbert Xu 		e = "encryption";
344da7f033dSHerbert Xu 	else
345da7f033dSHerbert Xu 		e = "decryption";
346da7f033dSHerbert Xu 
347da7f033dSHerbert Xu 	init_completion(&result.completion);
348da7f033dSHerbert Xu 
349da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
350da7f033dSHerbert Xu 	if (!req) {
351da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to allocate request for "
352da7f033dSHerbert Xu 		       "%s\n", algo);
353da7f033dSHerbert Xu 		goto out;
354da7f033dSHerbert Xu 	}
355da7f033dSHerbert Xu 
356da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
357da7f033dSHerbert Xu 				  tcrypt_complete, &result);
358da7f033dSHerbert Xu 
359da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
360da7f033dSHerbert Xu 		if (!template[i].np) {
361da7f033dSHerbert Xu 			j++;
362da7f033dSHerbert Xu 
363da7f033dSHerbert Xu 			/* some tepmplates have no input data but they will
364da7f033dSHerbert Xu 			 * touch input
365da7f033dSHerbert Xu 			 */
366da7f033dSHerbert Xu 			input = xbuf[0];
367da7f033dSHerbert Xu 			assoc = axbuf[0];
368da7f033dSHerbert Xu 
369fd57f22aSHerbert Xu 			ret = -EINVAL;
370fd57f22aSHerbert Xu 			if (WARN_ON(template[i].ilen > PAGE_SIZE ||
371fd57f22aSHerbert Xu 				    template[i].alen > PAGE_SIZE))
372fd57f22aSHerbert Xu 				goto out;
373fd57f22aSHerbert Xu 
374da7f033dSHerbert Xu 			memcpy(input, template[i].input, template[i].ilen);
375da7f033dSHerbert Xu 			memcpy(assoc, template[i].assoc, template[i].alen);
376da7f033dSHerbert Xu 			if (template[i].iv)
377da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
378da7f033dSHerbert Xu 			else
379da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
380da7f033dSHerbert Xu 
381da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
382da7f033dSHerbert Xu 			if (template[i].wk)
383da7f033dSHerbert Xu 				crypto_aead_set_flags(
384da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
385da7f033dSHerbert Xu 
386da7f033dSHerbert Xu 			key = template[i].key;
387da7f033dSHerbert Xu 
388da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key,
389da7f033dSHerbert Xu 						 template[i].klen);
390da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
391da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: setkey failed on "
392da7f033dSHerbert Xu 				       "test %d for %s: flags=%x\n", j, algo,
393da7f033dSHerbert Xu 				       crypto_aead_get_flags(tfm));
394da7f033dSHerbert Xu 				goto out;
395da7f033dSHerbert Xu 			} else if (ret)
396da7f033dSHerbert Xu 				continue;
397da7f033dSHerbert Xu 
398da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
399da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
400da7f033dSHerbert Xu 			if (ret) {
401da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: Failed to set "
402da7f033dSHerbert Xu 				       "authsize to %u on test %d for %s\n",
403da7f033dSHerbert Xu 				       authsize, j, algo);
404da7f033dSHerbert Xu 				goto out;
405da7f033dSHerbert Xu 			}
406da7f033dSHerbert Xu 
407da7f033dSHerbert Xu 			sg_init_one(&sg[0], input,
408da7f033dSHerbert Xu 				    template[i].ilen + (enc ? authsize : 0));
409da7f033dSHerbert Xu 
410da7f033dSHerbert Xu 			sg_init_one(&asg[0], assoc, template[i].alen);
411da7f033dSHerbert Xu 
412da7f033dSHerbert Xu 			aead_request_set_crypt(req, sg, sg,
413da7f033dSHerbert Xu 					       template[i].ilen, iv);
414da7f033dSHerbert Xu 
415da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
416da7f033dSHerbert Xu 
417da7f033dSHerbert Xu 			ret = enc ?
418da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
419da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
420da7f033dSHerbert Xu 
421da7f033dSHerbert Xu 			switch (ret) {
422da7f033dSHerbert Xu 			case 0:
423e44a1b44SJarod Wilson 				if (template[i].novrfy) {
424e44a1b44SJarod Wilson 					/* verification was supposed to fail */
425e44a1b44SJarod Wilson 					printk(KERN_ERR "alg: aead: %s failed "
426e44a1b44SJarod Wilson 					       "on test %d for %s: ret was 0, "
427e44a1b44SJarod Wilson 					       "expected -EBADMSG\n",
428e44a1b44SJarod Wilson 					       e, j, algo);
429e44a1b44SJarod Wilson 					/* so really, we got a bad message */
430e44a1b44SJarod Wilson 					ret = -EBADMSG;
431e44a1b44SJarod Wilson 					goto out;
432e44a1b44SJarod Wilson 				}
433da7f033dSHerbert Xu 				break;
434da7f033dSHerbert Xu 			case -EINPROGRESS:
435da7f033dSHerbert Xu 			case -EBUSY:
436da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
437da7f033dSHerbert Xu 					&result.completion);
438da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
439da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
440da7f033dSHerbert Xu 					break;
441da7f033dSHerbert Xu 				}
442e44a1b44SJarod Wilson 			case -EBADMSG:
443e44a1b44SJarod Wilson 				if (template[i].novrfy)
444e44a1b44SJarod Wilson 					/* verification failure was expected */
445e44a1b44SJarod Wilson 					continue;
446da7f033dSHerbert Xu 				/* fall through */
447da7f033dSHerbert Xu 			default:
448da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: %s failed on test "
449da7f033dSHerbert Xu 				       "%d for %s: ret=%d\n", e, j, algo, -ret);
450da7f033dSHerbert Xu 				goto out;
451da7f033dSHerbert Xu 			}
452da7f033dSHerbert Xu 
453da7f033dSHerbert Xu 			q = input;
454da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
455da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: Test %d failed on "
456da7f033dSHerbert Xu 				       "%s for %s\n", j, e, algo);
457da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
458da7f033dSHerbert Xu 				ret = -EINVAL;
459da7f033dSHerbert Xu 				goto out;
460da7f033dSHerbert Xu 			}
461da7f033dSHerbert Xu 		}
462da7f033dSHerbert Xu 	}
463da7f033dSHerbert Xu 
464da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
465da7f033dSHerbert Xu 		if (template[i].np) {
466da7f033dSHerbert Xu 			j++;
467da7f033dSHerbert Xu 
468da7f033dSHerbert Xu 			if (template[i].iv)
469da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
470da7f033dSHerbert Xu 			else
471da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
472da7f033dSHerbert Xu 
473da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
474da7f033dSHerbert Xu 			if (template[i].wk)
475da7f033dSHerbert Xu 				crypto_aead_set_flags(
476da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
477da7f033dSHerbert Xu 			key = template[i].key;
478da7f033dSHerbert Xu 
479da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key, template[i].klen);
480da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
481da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: setkey failed on "
482da7f033dSHerbert Xu 				       "chunk test %d for %s: flags=%x\n", j,
483da7f033dSHerbert Xu 				       algo, crypto_aead_get_flags(tfm));
484da7f033dSHerbert Xu 				goto out;
485da7f033dSHerbert Xu 			} else if (ret)
486da7f033dSHerbert Xu 				continue;
487da7f033dSHerbert Xu 
488da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
489da7f033dSHerbert Xu 
490da7f033dSHerbert Xu 			ret = -EINVAL;
491da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
492da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
493da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
494da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
495da7f033dSHerbert Xu 					goto out;
496da7f033dSHerbert Xu 
497da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
498da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
499da7f033dSHerbert Xu 
500da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
501da7f033dSHerbert Xu 				       template[i].tap[k]);
502da7f033dSHerbert Xu 
503da7f033dSHerbert Xu 				n = template[i].tap[k];
504da7f033dSHerbert Xu 				if (k == template[i].np - 1 && enc)
505da7f033dSHerbert Xu 					n += authsize;
506da7f033dSHerbert Xu 				if (offset_in_page(q) + n < PAGE_SIZE)
507da7f033dSHerbert Xu 					q[n] = 0;
508da7f033dSHerbert Xu 
509da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
510da7f033dSHerbert Xu 				temp += template[i].tap[k];
511da7f033dSHerbert Xu 			}
512da7f033dSHerbert Xu 
513da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
514da7f033dSHerbert Xu 			if (ret) {
515da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: Failed to set "
516da7f033dSHerbert Xu 				       "authsize to %u on chunk test %d for "
517da7f033dSHerbert Xu 				       "%s\n", authsize, j, algo);
518da7f033dSHerbert Xu 				goto out;
519da7f033dSHerbert Xu 			}
520da7f033dSHerbert Xu 
521da7f033dSHerbert Xu 			if (enc) {
522da7f033dSHerbert Xu 				if (WARN_ON(sg[k - 1].offset +
523da7f033dSHerbert Xu 					    sg[k - 1].length + authsize >
524da7f033dSHerbert Xu 					    PAGE_SIZE)) {
525da7f033dSHerbert Xu 					ret = -EINVAL;
526da7f033dSHerbert Xu 					goto out;
527da7f033dSHerbert Xu 				}
528da7f033dSHerbert Xu 
529da7f033dSHerbert Xu 				sg[k - 1].length += authsize;
530da7f033dSHerbert Xu 			}
531da7f033dSHerbert Xu 
532da7f033dSHerbert Xu 			sg_init_table(asg, template[i].anp);
533fd57f22aSHerbert Xu 			ret = -EINVAL;
534da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].anp; k++) {
535fd57f22aSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
536fd57f22aSHerbert Xu 					    template[i].atap[k] > PAGE_SIZE))
537fd57f22aSHerbert Xu 					goto out;
538da7f033dSHerbert Xu 				sg_set_buf(&asg[k],
539da7f033dSHerbert Xu 					   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
540da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
541da7f033dSHerbert Xu 						  template[i].assoc + temp,
542da7f033dSHerbert Xu 						  template[i].atap[k]),
543da7f033dSHerbert Xu 					   template[i].atap[k]);
544da7f033dSHerbert Xu 				temp += template[i].atap[k];
545da7f033dSHerbert Xu 			}
546da7f033dSHerbert Xu 
547da7f033dSHerbert Xu 			aead_request_set_crypt(req, sg, sg,
548da7f033dSHerbert Xu 					       template[i].ilen,
549da7f033dSHerbert Xu 					       iv);
550da7f033dSHerbert Xu 
551da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
552da7f033dSHerbert Xu 
553da7f033dSHerbert Xu 			ret = enc ?
554da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
555da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
556da7f033dSHerbert Xu 
557da7f033dSHerbert Xu 			switch (ret) {
558da7f033dSHerbert Xu 			case 0:
559e44a1b44SJarod Wilson 				if (template[i].novrfy) {
560e44a1b44SJarod Wilson 					/* verification was supposed to fail */
561e44a1b44SJarod Wilson 					printk(KERN_ERR "alg: aead: %s failed "
562e44a1b44SJarod Wilson 					       "on chunk test %d for %s: ret "
563e44a1b44SJarod Wilson 					       "was 0, expected -EBADMSG\n",
564e44a1b44SJarod Wilson 					       e, j, algo);
565e44a1b44SJarod Wilson 					/* so really, we got a bad message */
566e44a1b44SJarod Wilson 					ret = -EBADMSG;
567e44a1b44SJarod Wilson 					goto out;
568e44a1b44SJarod Wilson 				}
569da7f033dSHerbert Xu 				break;
570da7f033dSHerbert Xu 			case -EINPROGRESS:
571da7f033dSHerbert Xu 			case -EBUSY:
572da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
573da7f033dSHerbert Xu 					&result.completion);
574da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
575da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
576da7f033dSHerbert Xu 					break;
577da7f033dSHerbert Xu 				}
578e44a1b44SJarod Wilson 			case -EBADMSG:
579e44a1b44SJarod Wilson 				if (template[i].novrfy)
580e44a1b44SJarod Wilson 					/* verification failure was expected */
581e44a1b44SJarod Wilson 					continue;
582da7f033dSHerbert Xu 				/* fall through */
583da7f033dSHerbert Xu 			default:
584da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: %s failed on "
585da7f033dSHerbert Xu 				       "chunk test %d for %s: ret=%d\n", e, j,
586da7f033dSHerbert Xu 				       algo, -ret);
587da7f033dSHerbert Xu 				goto out;
588da7f033dSHerbert Xu 			}
589da7f033dSHerbert Xu 
590da7f033dSHerbert Xu 			ret = -EINVAL;
591da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
592da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
593da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
594da7f033dSHerbert Xu 
595da7f033dSHerbert Xu 				n = template[i].tap[k];
596da7f033dSHerbert Xu 				if (k == template[i].np - 1)
597da7f033dSHerbert Xu 					n += enc ? authsize : -authsize;
598da7f033dSHerbert Xu 
599da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp, n)) {
600da7f033dSHerbert Xu 					printk(KERN_ERR "alg: aead: Chunk "
601da7f033dSHerbert Xu 					       "test %d failed on %s at page "
602da7f033dSHerbert Xu 					       "%u for %s\n", j, e, k, algo);
603da7f033dSHerbert Xu 					hexdump(q, n);
604da7f033dSHerbert Xu 					goto out;
605da7f033dSHerbert Xu 				}
606da7f033dSHerbert Xu 
607da7f033dSHerbert Xu 				q += n;
608da7f033dSHerbert Xu 				if (k == template[i].np - 1 && !enc) {
609da7f033dSHerbert Xu 					if (memcmp(q, template[i].input +
610da7f033dSHerbert Xu 						      temp + n, authsize))
611da7f033dSHerbert Xu 						n = authsize;
612da7f033dSHerbert Xu 					else
613da7f033dSHerbert Xu 						n = 0;
614da7f033dSHerbert Xu 				} else {
615da7f033dSHerbert Xu 					for (n = 0; offset_in_page(q + n) &&
616da7f033dSHerbert Xu 						    q[n]; n++)
617da7f033dSHerbert Xu 						;
618da7f033dSHerbert Xu 				}
619da7f033dSHerbert Xu 				if (n) {
620da7f033dSHerbert Xu 					printk(KERN_ERR "alg: aead: Result "
621da7f033dSHerbert Xu 					       "buffer corruption in chunk "
622da7f033dSHerbert Xu 					       "test %d on %s at page %u for "
623da7f033dSHerbert Xu 					       "%s: %u bytes:\n", j, e, k,
624da7f033dSHerbert Xu 					       algo, n);
625da7f033dSHerbert Xu 					hexdump(q, n);
626da7f033dSHerbert Xu 					goto out;
627da7f033dSHerbert Xu 				}
628da7f033dSHerbert Xu 
629da7f033dSHerbert Xu 				temp += template[i].tap[k];
630da7f033dSHerbert Xu 			}
631da7f033dSHerbert Xu 		}
632da7f033dSHerbert Xu 	}
633da7f033dSHerbert Xu 
634da7f033dSHerbert Xu 	ret = 0;
635da7f033dSHerbert Xu 
636da7f033dSHerbert Xu out:
637da7f033dSHerbert Xu 	aead_request_free(req);
638f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
639f8b0d4d0SHerbert Xu out_noaxbuf:
640f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
641f8b0d4d0SHerbert Xu out_noxbuf:
642da7f033dSHerbert Xu 	return ret;
643da7f033dSHerbert Xu }
644da7f033dSHerbert Xu 
6451aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
6461aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
6471aa4ecd9SHerbert Xu {
6481aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
6491aa4ecd9SHerbert Xu 	unsigned int i, j, k;
6501aa4ecd9SHerbert Xu 	char *q;
6511aa4ecd9SHerbert Xu 	const char *e;
6521aa4ecd9SHerbert Xu 	void *data;
653f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
654f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
655f8b0d4d0SHerbert Xu 
656f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
657f8b0d4d0SHerbert Xu 		goto out_nobuf;
6581aa4ecd9SHerbert Xu 
6591aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
6601aa4ecd9SHerbert Xu 	        e = "encryption";
6611aa4ecd9SHerbert Xu 	else
6621aa4ecd9SHerbert Xu 		e = "decryption";
6631aa4ecd9SHerbert Xu 
6641aa4ecd9SHerbert Xu 	j = 0;
6651aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
6661aa4ecd9SHerbert Xu 		if (template[i].np)
6671aa4ecd9SHerbert Xu 			continue;
6681aa4ecd9SHerbert Xu 
6691aa4ecd9SHerbert Xu 		j++;
6701aa4ecd9SHerbert Xu 
671fd57f22aSHerbert Xu 		ret = -EINVAL;
672fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
673fd57f22aSHerbert Xu 			goto out;
674fd57f22aSHerbert Xu 
6751aa4ecd9SHerbert Xu 		data = xbuf[0];
6761aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
6771aa4ecd9SHerbert Xu 
6781aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
6791aa4ecd9SHerbert Xu 		if (template[i].wk)
6801aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
6811aa4ecd9SHerbert Xu 
6821aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
6831aa4ecd9SHerbert Xu 					   template[i].klen);
6841aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
6851aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
6861aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
6871aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
6881aa4ecd9SHerbert Xu 			goto out;
6891aa4ecd9SHerbert Xu 		} else if (ret)
6901aa4ecd9SHerbert Xu 			continue;
6911aa4ecd9SHerbert Xu 
6921aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
6931aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
6941aa4ecd9SHerbert Xu 			if (enc)
6951aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
6961aa4ecd9SHerbert Xu 							  data + k);
6971aa4ecd9SHerbert Xu 			else
6981aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
6991aa4ecd9SHerbert Xu 							  data + k);
7001aa4ecd9SHerbert Xu 		}
7011aa4ecd9SHerbert Xu 
7021aa4ecd9SHerbert Xu 		q = data;
7031aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
7041aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
7051aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
7061aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
7071aa4ecd9SHerbert Xu 			ret = -EINVAL;
7081aa4ecd9SHerbert Xu 			goto out;
7091aa4ecd9SHerbert Xu 		}
7101aa4ecd9SHerbert Xu 	}
7111aa4ecd9SHerbert Xu 
7121aa4ecd9SHerbert Xu 	ret = 0;
7131aa4ecd9SHerbert Xu 
7141aa4ecd9SHerbert Xu out:
715f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
716f8b0d4d0SHerbert Xu out_nobuf:
7171aa4ecd9SHerbert Xu 	return ret;
7181aa4ecd9SHerbert Xu }
7191aa4ecd9SHerbert Xu 
7201aa4ecd9SHerbert Xu static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
721da7f033dSHerbert Xu 			 struct cipher_testvec *template, unsigned int tcount)
722da7f033dSHerbert Xu {
723da7f033dSHerbert Xu 	const char *algo =
724da7f033dSHerbert Xu 		crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
725da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
726da7f033dSHerbert Xu 	char *q;
727da7f033dSHerbert Xu 	struct ablkcipher_request *req;
728da7f033dSHerbert Xu 	struct scatterlist sg[8];
729da7f033dSHerbert Xu 	const char *e;
730da7f033dSHerbert Xu 	struct tcrypt_result result;
731da7f033dSHerbert Xu 	void *data;
732da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
733f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
734f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
735f8b0d4d0SHerbert Xu 
736f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
737f8b0d4d0SHerbert Xu 		goto out_nobuf;
738da7f033dSHerbert Xu 
739da7f033dSHerbert Xu 	if (enc == ENCRYPT)
740da7f033dSHerbert Xu 	        e = "encryption";
741da7f033dSHerbert Xu 	else
742da7f033dSHerbert Xu 		e = "decryption";
743da7f033dSHerbert Xu 
744da7f033dSHerbert Xu 	init_completion(&result.completion);
745da7f033dSHerbert Xu 
746da7f033dSHerbert Xu 	req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
747da7f033dSHerbert Xu 	if (!req) {
7481aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to allocate request "
7491aa4ecd9SHerbert Xu 		       "for %s\n", algo);
750da7f033dSHerbert Xu 		goto out;
751da7f033dSHerbert Xu 	}
752da7f033dSHerbert Xu 
753da7f033dSHerbert Xu 	ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
754da7f033dSHerbert Xu 					tcrypt_complete, &result);
755da7f033dSHerbert Xu 
756da7f033dSHerbert Xu 	j = 0;
757da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
758da7f033dSHerbert Xu 		if (template[i].iv)
759da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
760da7f033dSHerbert Xu 		else
761da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
762da7f033dSHerbert Xu 
763da7f033dSHerbert Xu 		if (!(template[i].np)) {
764da7f033dSHerbert Xu 			j++;
765da7f033dSHerbert Xu 
766fd57f22aSHerbert Xu 			ret = -EINVAL;
767fd57f22aSHerbert Xu 			if (WARN_ON(template[i].ilen > PAGE_SIZE))
768fd57f22aSHerbert Xu 				goto out;
769fd57f22aSHerbert Xu 
770da7f033dSHerbert Xu 			data = xbuf[0];
771da7f033dSHerbert Xu 			memcpy(data, template[i].input, template[i].ilen);
772da7f033dSHerbert Xu 
773da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
774da7f033dSHerbert Xu 			if (template[i].wk)
775da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
776da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
777da7f033dSHerbert Xu 
778da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
779da7f033dSHerbert Xu 						       template[i].klen);
780da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
7811aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: setkey failed "
782da7f033dSHerbert Xu 				       "on test %d for %s: flags=%x\n", j,
783da7f033dSHerbert Xu 				       algo, crypto_ablkcipher_get_flags(tfm));
784da7f033dSHerbert Xu 				goto out;
785da7f033dSHerbert Xu 			} else if (ret)
786da7f033dSHerbert Xu 				continue;
787da7f033dSHerbert Xu 
788da7f033dSHerbert Xu 			sg_init_one(&sg[0], data, template[i].ilen);
789da7f033dSHerbert Xu 
790da7f033dSHerbert Xu 			ablkcipher_request_set_crypt(req, sg, sg,
791da7f033dSHerbert Xu 						     template[i].ilen, iv);
792da7f033dSHerbert Xu 			ret = enc ?
793da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
794da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
795da7f033dSHerbert Xu 
796da7f033dSHerbert Xu 			switch (ret) {
797da7f033dSHerbert Xu 			case 0:
798da7f033dSHerbert Xu 				break;
799da7f033dSHerbert Xu 			case -EINPROGRESS:
800da7f033dSHerbert Xu 			case -EBUSY:
801da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
802da7f033dSHerbert Xu 					&result.completion);
803da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
804da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
805da7f033dSHerbert Xu 					break;
806da7f033dSHerbert Xu 				}
807da7f033dSHerbert Xu 				/* fall through */
808da7f033dSHerbert Xu 			default:
8091aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: %s failed on "
810da7f033dSHerbert Xu 				       "test %d for %s: ret=%d\n", e, j, algo,
811da7f033dSHerbert Xu 				       -ret);
812da7f033dSHerbert Xu 				goto out;
813da7f033dSHerbert Xu 			}
814da7f033dSHerbert Xu 
815da7f033dSHerbert Xu 			q = data;
816da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
8171aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: Test %d "
8181aa4ecd9SHerbert Xu 				       "failed on %s for %s\n", j, e, algo);
819da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
820da7f033dSHerbert Xu 				ret = -EINVAL;
821da7f033dSHerbert Xu 				goto out;
822da7f033dSHerbert Xu 			}
823da7f033dSHerbert Xu 		}
824da7f033dSHerbert Xu 	}
825da7f033dSHerbert Xu 
826da7f033dSHerbert Xu 	j = 0;
827da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
828da7f033dSHerbert Xu 
829da7f033dSHerbert Xu 		if (template[i].iv)
830da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
831da7f033dSHerbert Xu 		else
832da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
833da7f033dSHerbert Xu 
834da7f033dSHerbert Xu 		if (template[i].np) {
835da7f033dSHerbert Xu 			j++;
836da7f033dSHerbert Xu 
837da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
838da7f033dSHerbert Xu 			if (template[i].wk)
839da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
840da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
841da7f033dSHerbert Xu 
842da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
843da7f033dSHerbert Xu 						       template[i].klen);
844da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
8451aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: setkey failed "
846da7f033dSHerbert Xu 				       "on chunk test %d for %s: flags=%x\n",
847da7f033dSHerbert Xu 				       j, algo,
848da7f033dSHerbert Xu 				       crypto_ablkcipher_get_flags(tfm));
849da7f033dSHerbert Xu 				goto out;
850da7f033dSHerbert Xu 			} else if (ret)
851da7f033dSHerbert Xu 				continue;
852da7f033dSHerbert Xu 
853da7f033dSHerbert Xu 			temp = 0;
854da7f033dSHerbert Xu 			ret = -EINVAL;
855da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
856da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
857da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
858da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
859da7f033dSHerbert Xu 					goto out;
860da7f033dSHerbert Xu 
861da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
862da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
863da7f033dSHerbert Xu 
864da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
865da7f033dSHerbert Xu 				       template[i].tap[k]);
866da7f033dSHerbert Xu 
867da7f033dSHerbert Xu 				if (offset_in_page(q) + template[i].tap[k] <
868da7f033dSHerbert Xu 				    PAGE_SIZE)
869da7f033dSHerbert Xu 					q[template[i].tap[k]] = 0;
870da7f033dSHerbert Xu 
871da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
872da7f033dSHerbert Xu 
873da7f033dSHerbert Xu 				temp += template[i].tap[k];
874da7f033dSHerbert Xu 			}
875da7f033dSHerbert Xu 
876da7f033dSHerbert Xu 			ablkcipher_request_set_crypt(req, sg, sg,
877da7f033dSHerbert Xu 					template[i].ilen, iv);
878da7f033dSHerbert Xu 
879da7f033dSHerbert Xu 			ret = enc ?
880da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
881da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
882da7f033dSHerbert Xu 
883da7f033dSHerbert Xu 			switch (ret) {
884da7f033dSHerbert Xu 			case 0:
885da7f033dSHerbert Xu 				break;
886da7f033dSHerbert Xu 			case -EINPROGRESS:
887da7f033dSHerbert Xu 			case -EBUSY:
888da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
889da7f033dSHerbert Xu 					&result.completion);
890da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
891da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
892da7f033dSHerbert Xu 					break;
893da7f033dSHerbert Xu 				}
894da7f033dSHerbert Xu 				/* fall through */
895da7f033dSHerbert Xu 			default:
8961aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: %s failed on "
897da7f033dSHerbert Xu 				       "chunk test %d for %s: ret=%d\n", e, j,
898da7f033dSHerbert Xu 				       algo, -ret);
899da7f033dSHerbert Xu 				goto out;
900da7f033dSHerbert Xu 			}
901da7f033dSHerbert Xu 
902da7f033dSHerbert Xu 			temp = 0;
903da7f033dSHerbert Xu 			ret = -EINVAL;
904da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
905da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
906da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
907da7f033dSHerbert Xu 
908da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp,
909da7f033dSHerbert Xu 					   template[i].tap[k])) {
9101aa4ecd9SHerbert Xu 					printk(KERN_ERR "alg: skcipher: Chunk "
911da7f033dSHerbert Xu 					       "test %d failed on %s at page "
912da7f033dSHerbert Xu 					       "%u for %s\n", j, e, k, algo);
913da7f033dSHerbert Xu 					hexdump(q, template[i].tap[k]);
914da7f033dSHerbert Xu 					goto out;
915da7f033dSHerbert Xu 				}
916da7f033dSHerbert Xu 
917da7f033dSHerbert Xu 				q += template[i].tap[k];
918da7f033dSHerbert Xu 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
919da7f033dSHerbert Xu 					;
920da7f033dSHerbert Xu 				if (n) {
9211aa4ecd9SHerbert Xu 					printk(KERN_ERR "alg: skcipher: "
922da7f033dSHerbert Xu 					       "Result buffer corruption in "
923da7f033dSHerbert Xu 					       "chunk test %d on %s at page "
924da7f033dSHerbert Xu 					       "%u for %s: %u bytes:\n", j, e,
925da7f033dSHerbert Xu 					       k, algo, n);
926da7f033dSHerbert Xu 					hexdump(q, n);
927da7f033dSHerbert Xu 					goto out;
928da7f033dSHerbert Xu 				}
929da7f033dSHerbert Xu 				temp += template[i].tap[k];
930da7f033dSHerbert Xu 			}
931da7f033dSHerbert Xu 		}
932da7f033dSHerbert Xu 	}
933da7f033dSHerbert Xu 
934da7f033dSHerbert Xu 	ret = 0;
935da7f033dSHerbert Xu 
936da7f033dSHerbert Xu out:
937da7f033dSHerbert Xu 	ablkcipher_request_free(req);
938f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
939f8b0d4d0SHerbert Xu out_nobuf:
940da7f033dSHerbert Xu 	return ret;
941da7f033dSHerbert Xu }
942da7f033dSHerbert Xu 
943da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
944da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
945da7f033dSHerbert Xu {
946da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
947da7f033dSHerbert Xu 	unsigned int i;
948da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
949da7f033dSHerbert Xu 	int ret;
950da7f033dSHerbert Xu 
951da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
952c79cf910SGeert Uytterhoeven 		int ilen;
953c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
954da7f033dSHerbert Xu 
955da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
956da7f033dSHerbert Xu 
957da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
958da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
959da7f033dSHerbert Xu 		                           ilen, result, &dlen);
960da7f033dSHerbert Xu 		if (ret) {
961da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
962da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
963da7f033dSHerbert Xu 			       -ret);
964da7f033dSHerbert Xu 			goto out;
965da7f033dSHerbert Xu 		}
966da7f033dSHerbert Xu 
967b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
968b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
969b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
970b812eb00SGeert Uytterhoeven 			       dlen);
971b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
972b812eb00SGeert Uytterhoeven 			goto out;
973b812eb00SGeert Uytterhoeven 		}
974b812eb00SGeert Uytterhoeven 
975da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
976da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
977da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
978da7f033dSHerbert Xu 			hexdump(result, dlen);
979da7f033dSHerbert Xu 			ret = -EINVAL;
980da7f033dSHerbert Xu 			goto out;
981da7f033dSHerbert Xu 		}
982da7f033dSHerbert Xu 	}
983da7f033dSHerbert Xu 
984da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
985c79cf910SGeert Uytterhoeven 		int ilen;
986c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
987da7f033dSHerbert Xu 
988da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
989da7f033dSHerbert Xu 
990da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
991da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
992da7f033dSHerbert Xu 		                             ilen, result, &dlen);
993da7f033dSHerbert Xu 		if (ret) {
994da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
995da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
996da7f033dSHerbert Xu 			       -ret);
997da7f033dSHerbert Xu 			goto out;
998da7f033dSHerbert Xu 		}
999da7f033dSHerbert Xu 
1000b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1001b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1002b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1003b812eb00SGeert Uytterhoeven 			       dlen);
1004b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1005b812eb00SGeert Uytterhoeven 			goto out;
1006b812eb00SGeert Uytterhoeven 		}
1007b812eb00SGeert Uytterhoeven 
1008da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1009da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1010da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1011da7f033dSHerbert Xu 			hexdump(result, dlen);
1012da7f033dSHerbert Xu 			ret = -EINVAL;
1013da7f033dSHerbert Xu 			goto out;
1014da7f033dSHerbert Xu 		}
1015da7f033dSHerbert Xu 	}
1016da7f033dSHerbert Xu 
1017da7f033dSHerbert Xu 	ret = 0;
1018da7f033dSHerbert Xu 
1019da7f033dSHerbert Xu out:
1020da7f033dSHerbert Xu 	return ret;
1021da7f033dSHerbert Xu }
1022da7f033dSHerbert Xu 
10238064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm,
10248064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *ctemplate,
10258064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *dtemplate, int ctcount,
10268064efb8SGeert Uytterhoeven 		      int dtcount)
10278064efb8SGeert Uytterhoeven {
10288064efb8SGeert Uytterhoeven 	const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
10298064efb8SGeert Uytterhoeven 	unsigned int i;
10308064efb8SGeert Uytterhoeven 	char result[COMP_BUF_SIZE];
10313ce858cbSGeert Uytterhoeven 	int res;
10328064efb8SGeert Uytterhoeven 
10338064efb8SGeert Uytterhoeven 	for (i = 0; i < ctcount; i++) {
10348064efb8SGeert Uytterhoeven 		struct comp_request req;
10353ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
10368064efb8SGeert Uytterhoeven 
10373ce858cbSGeert Uytterhoeven 		res = crypto_compress_setup(tfm, ctemplate[i].params,
10388064efb8SGeert Uytterhoeven 					    ctemplate[i].paramsize);
10393ce858cbSGeert Uytterhoeven 		if (res) {
10408064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression setup failed on test "
10413ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
10423ce858cbSGeert Uytterhoeven 			return res;
10438064efb8SGeert Uytterhoeven 		}
10448064efb8SGeert Uytterhoeven 
10453ce858cbSGeert Uytterhoeven 		res = crypto_compress_init(tfm);
10463ce858cbSGeert Uytterhoeven 		if (res) {
10478064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression init failed on test "
10483ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
10493ce858cbSGeert Uytterhoeven 			return res;
10508064efb8SGeert Uytterhoeven 		}
10518064efb8SGeert Uytterhoeven 
10528064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
10538064efb8SGeert Uytterhoeven 
10548064efb8SGeert Uytterhoeven 		req.next_in = ctemplate[i].input;
10558064efb8SGeert Uytterhoeven 		req.avail_in = ctemplate[i].inlen / 2;
10568064efb8SGeert Uytterhoeven 		req.next_out = result;
10578064efb8SGeert Uytterhoeven 		req.avail_out = ctemplate[i].outlen / 2;
10588064efb8SGeert Uytterhoeven 
10593ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
10603ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
10618064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
10623ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
10633ce858cbSGeert Uytterhoeven 			return res;
10648064efb8SGeert Uytterhoeven 		}
10653ce858cbSGeert Uytterhoeven 		if (res > 0)
10663ce858cbSGeert Uytterhoeven 			produced += res;
10678064efb8SGeert Uytterhoeven 
10688064efb8SGeert Uytterhoeven 		/* Add remaining input data */
10698064efb8SGeert Uytterhoeven 		req.avail_in += (ctemplate[i].inlen + 1) / 2;
10708064efb8SGeert Uytterhoeven 
10713ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
10723ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
10738064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
10743ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
10753ce858cbSGeert Uytterhoeven 			return res;
10768064efb8SGeert Uytterhoeven 		}
10773ce858cbSGeert Uytterhoeven 		if (res > 0)
10783ce858cbSGeert Uytterhoeven 			produced += res;
10798064efb8SGeert Uytterhoeven 
10808064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
10818064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
10828064efb8SGeert Uytterhoeven 
10833ce858cbSGeert Uytterhoeven 		res = crypto_compress_final(tfm, &req);
10843ce858cbSGeert Uytterhoeven 		if (res < 0) {
10858064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression final failed on test "
10863ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
10873ce858cbSGeert Uytterhoeven 			return res;
10888064efb8SGeert Uytterhoeven 		}
10893ce858cbSGeert Uytterhoeven 		produced += res;
10908064efb8SGeert Uytterhoeven 
10918064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
10928064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
10938064efb8SGeert Uytterhoeven 			       "output len = %d (expected %d)\n", i + 1, algo,
10948064efb8SGeert Uytterhoeven 			       COMP_BUF_SIZE - req.avail_out,
10958064efb8SGeert Uytterhoeven 			       ctemplate[i].outlen);
10968064efb8SGeert Uytterhoeven 			return -EINVAL;
10978064efb8SGeert Uytterhoeven 		}
10988064efb8SGeert Uytterhoeven 
10993ce858cbSGeert Uytterhoeven 		if (produced != ctemplate[i].outlen) {
11003ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
11013ce858cbSGeert Uytterhoeven 			       "returned len = %u (expected %d)\n", i + 1,
11023ce858cbSGeert Uytterhoeven 			       algo, produced, ctemplate[i].outlen);
11033ce858cbSGeert Uytterhoeven 			return -EINVAL;
11043ce858cbSGeert Uytterhoeven 		}
11053ce858cbSGeert Uytterhoeven 
11068064efb8SGeert Uytterhoeven 		if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
11078064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Compression test %d failed for "
11088064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
11098064efb8SGeert Uytterhoeven 			hexdump(result, ctemplate[i].outlen);
11108064efb8SGeert Uytterhoeven 			return -EINVAL;
11118064efb8SGeert Uytterhoeven 		}
11128064efb8SGeert Uytterhoeven 	}
11138064efb8SGeert Uytterhoeven 
11148064efb8SGeert Uytterhoeven 	for (i = 0; i < dtcount; i++) {
11158064efb8SGeert Uytterhoeven 		struct comp_request req;
11163ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
11178064efb8SGeert Uytterhoeven 
11183ce858cbSGeert Uytterhoeven 		res = crypto_decompress_setup(tfm, dtemplate[i].params,
11198064efb8SGeert Uytterhoeven 					      dtemplate[i].paramsize);
11203ce858cbSGeert Uytterhoeven 		if (res) {
11218064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression setup failed on "
11223ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
11233ce858cbSGeert Uytterhoeven 			return res;
11248064efb8SGeert Uytterhoeven 		}
11258064efb8SGeert Uytterhoeven 
11263ce858cbSGeert Uytterhoeven 		res = crypto_decompress_init(tfm);
11273ce858cbSGeert Uytterhoeven 		if (res) {
11288064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression init failed on test "
11293ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
11303ce858cbSGeert Uytterhoeven 			return res;
11318064efb8SGeert Uytterhoeven 		}
11328064efb8SGeert Uytterhoeven 
11338064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
11348064efb8SGeert Uytterhoeven 
11358064efb8SGeert Uytterhoeven 		req.next_in = dtemplate[i].input;
11368064efb8SGeert Uytterhoeven 		req.avail_in = dtemplate[i].inlen / 2;
11378064efb8SGeert Uytterhoeven 		req.next_out = result;
11388064efb8SGeert Uytterhoeven 		req.avail_out = dtemplate[i].outlen / 2;
11398064efb8SGeert Uytterhoeven 
11403ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
11413ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
11428064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
11433ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
11443ce858cbSGeert Uytterhoeven 			return res;
11458064efb8SGeert Uytterhoeven 		}
11463ce858cbSGeert Uytterhoeven 		if (res > 0)
11473ce858cbSGeert Uytterhoeven 			produced += res;
11488064efb8SGeert Uytterhoeven 
11498064efb8SGeert Uytterhoeven 		/* Add remaining input data */
11508064efb8SGeert Uytterhoeven 		req.avail_in += (dtemplate[i].inlen + 1) / 2;
11518064efb8SGeert Uytterhoeven 
11523ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
11533ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
11548064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
11553ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
11563ce858cbSGeert Uytterhoeven 			return res;
11578064efb8SGeert Uytterhoeven 		}
11583ce858cbSGeert Uytterhoeven 		if (res > 0)
11593ce858cbSGeert Uytterhoeven 			produced += res;
11608064efb8SGeert Uytterhoeven 
11618064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
11628064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
11638064efb8SGeert Uytterhoeven 
11643ce858cbSGeert Uytterhoeven 		res = crypto_decompress_final(tfm, &req);
11653ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
11668064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression final failed on "
11673ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
11683ce858cbSGeert Uytterhoeven 			return res;
11698064efb8SGeert Uytterhoeven 		}
11703ce858cbSGeert Uytterhoeven 		if (res > 0)
11713ce858cbSGeert Uytterhoeven 			produced += res;
11728064efb8SGeert Uytterhoeven 
11738064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
11748064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
11758064efb8SGeert Uytterhoeven 			       "%s: output len = %d (expected %d)\n", i + 1,
11768064efb8SGeert Uytterhoeven 			       algo, COMP_BUF_SIZE - req.avail_out,
11778064efb8SGeert Uytterhoeven 			       dtemplate[i].outlen);
11788064efb8SGeert Uytterhoeven 			return -EINVAL;
11798064efb8SGeert Uytterhoeven 		}
11808064efb8SGeert Uytterhoeven 
11813ce858cbSGeert Uytterhoeven 		if (produced != dtemplate[i].outlen) {
11823ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
11833ce858cbSGeert Uytterhoeven 			       "%s: returned len = %u (expected %d)\n", i + 1,
11843ce858cbSGeert Uytterhoeven 			       algo, produced, dtemplate[i].outlen);
11853ce858cbSGeert Uytterhoeven 			return -EINVAL;
11863ce858cbSGeert Uytterhoeven 		}
11873ce858cbSGeert Uytterhoeven 
11888064efb8SGeert Uytterhoeven 		if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
11898064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Decompression test %d failed for "
11908064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
11918064efb8SGeert Uytterhoeven 			hexdump(result, dtemplate[i].outlen);
11928064efb8SGeert Uytterhoeven 			return -EINVAL;
11938064efb8SGeert Uytterhoeven 		}
11948064efb8SGeert Uytterhoeven 	}
11958064efb8SGeert Uytterhoeven 
11968064efb8SGeert Uytterhoeven 	return 0;
11978064efb8SGeert Uytterhoeven }
11988064efb8SGeert Uytterhoeven 
11997647d6ceSJarod Wilson 
12007647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
12017647d6ceSJarod Wilson 		      unsigned int tcount)
12027647d6ceSJarod Wilson {
12037647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1204fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
12057647d6ceSJarod Wilson 	u8 *seed;
12067647d6ceSJarod Wilson 	char result[32];
12077647d6ceSJarod Wilson 
12087647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
12097647d6ceSJarod Wilson 
12107647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
12117647d6ceSJarod Wilson 	if (!seed) {
12127647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
12137647d6ceSJarod Wilson 		       "for %s\n", algo);
12147647d6ceSJarod Wilson 		return -ENOMEM;
12157647d6ceSJarod Wilson 	}
12167647d6ceSJarod Wilson 
12177647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
12187647d6ceSJarod Wilson 		memset(result, 0, 32);
12197647d6ceSJarod Wilson 
12207647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
12217647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
12227647d6ceSJarod Wilson 		       template[i].klen);
12237647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
12247647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
12257647d6ceSJarod Wilson 
12267647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
12277647d6ceSJarod Wilson 		if (err) {
12287647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
12297647d6ceSJarod Wilson 			       "for %s\n", algo);
12307647d6ceSJarod Wilson 			goto out;
12317647d6ceSJarod Wilson 		}
12327647d6ceSJarod Wilson 
12337647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
12347647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
12357647d6ceSJarod Wilson 						   template[i].rlen);
12367647d6ceSJarod Wilson 			if (err != template[i].rlen) {
12377647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
12387647d6ceSJarod Wilson 				       "the correct amount of random data for "
12397647d6ceSJarod Wilson 				       "%s (requested %d, got %d)\n", algo,
12407647d6ceSJarod Wilson 				       template[i].rlen, err);
12417647d6ceSJarod Wilson 				goto out;
12427647d6ceSJarod Wilson 			}
12437647d6ceSJarod Wilson 		}
12447647d6ceSJarod Wilson 
12457647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
12467647d6ceSJarod Wilson 			     template[i].rlen);
12477647d6ceSJarod Wilson 		if (err) {
12487647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
12497647d6ceSJarod Wilson 			       i, algo);
12507647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
12517647d6ceSJarod Wilson 			err = -EINVAL;
12527647d6ceSJarod Wilson 			goto out;
12537647d6ceSJarod Wilson 		}
12547647d6ceSJarod Wilson 	}
12557647d6ceSJarod Wilson 
12567647d6ceSJarod Wilson out:
12577647d6ceSJarod Wilson 	kfree(seed);
12587647d6ceSJarod Wilson 	return err;
12597647d6ceSJarod Wilson }
12607647d6ceSJarod Wilson 
1261da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1262da7f033dSHerbert Xu 			 u32 type, u32 mask)
1263da7f033dSHerbert Xu {
1264da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1265da7f033dSHerbert Xu 	int err = 0;
1266da7f033dSHerbert Xu 
1267da7f033dSHerbert Xu 	tfm = crypto_alloc_aead(driver, type, mask);
1268da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1269da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1270da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1271da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1272da7f033dSHerbert Xu 	}
1273da7f033dSHerbert Xu 
1274da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1275da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1276da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1277da7f033dSHerbert Xu 		if (err)
1278da7f033dSHerbert Xu 			goto out;
1279da7f033dSHerbert Xu 	}
1280da7f033dSHerbert Xu 
1281da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1282da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1283da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1284da7f033dSHerbert Xu 
1285da7f033dSHerbert Xu out:
1286da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1287da7f033dSHerbert Xu 	return err;
1288da7f033dSHerbert Xu }
1289da7f033dSHerbert Xu 
1290da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1291da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1292da7f033dSHerbert Xu {
12931aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1294da7f033dSHerbert Xu 	int err = 0;
1295da7f033dSHerbert Xu 
12961aa4ecd9SHerbert Xu 	tfm = crypto_alloc_cipher(driver, type, mask);
1297da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1298da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1299da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1300da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1301da7f033dSHerbert Xu 	}
1302da7f033dSHerbert Xu 
1303da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1304da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1305da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1306da7f033dSHerbert Xu 		if (err)
1307da7f033dSHerbert Xu 			goto out;
1308da7f033dSHerbert Xu 	}
1309da7f033dSHerbert Xu 
1310da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1311da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1312da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1313da7f033dSHerbert Xu 
1314da7f033dSHerbert Xu out:
13151aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
13161aa4ecd9SHerbert Xu 	return err;
13171aa4ecd9SHerbert Xu }
13181aa4ecd9SHerbert Xu 
13191aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
13201aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
13211aa4ecd9SHerbert Xu {
13221aa4ecd9SHerbert Xu 	struct crypto_ablkcipher *tfm;
13231aa4ecd9SHerbert Xu 	int err = 0;
13241aa4ecd9SHerbert Xu 
13251aa4ecd9SHerbert Xu 	tfm = crypto_alloc_ablkcipher(driver, type, mask);
13261aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
13271aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
13281aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
13291aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
13301aa4ecd9SHerbert Xu 	}
13311aa4ecd9SHerbert Xu 
13321aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
13331aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
13341aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
13351aa4ecd9SHerbert Xu 		if (err)
13361aa4ecd9SHerbert Xu 			goto out;
13371aa4ecd9SHerbert Xu 	}
13381aa4ecd9SHerbert Xu 
13391aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
13401aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
13411aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
13421aa4ecd9SHerbert Xu 
13431aa4ecd9SHerbert Xu out:
1344da7f033dSHerbert Xu 	crypto_free_ablkcipher(tfm);
1345da7f033dSHerbert Xu 	return err;
1346da7f033dSHerbert Xu }
1347da7f033dSHerbert Xu 
1348da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1349da7f033dSHerbert Xu 			 u32 type, u32 mask)
1350da7f033dSHerbert Xu {
1351da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1352da7f033dSHerbert Xu 	int err;
1353da7f033dSHerbert Xu 
1354da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1355da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1356da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1357da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1358da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1359da7f033dSHerbert Xu 	}
1360da7f033dSHerbert Xu 
1361da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1362da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1363da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1364da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1365da7f033dSHerbert Xu 
1366da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1367da7f033dSHerbert Xu 	return err;
1368da7f033dSHerbert Xu }
1369da7f033dSHerbert Xu 
13708064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
13718064efb8SGeert Uytterhoeven 			  u32 type, u32 mask)
13728064efb8SGeert Uytterhoeven {
13738064efb8SGeert Uytterhoeven 	struct crypto_pcomp *tfm;
13748064efb8SGeert Uytterhoeven 	int err;
13758064efb8SGeert Uytterhoeven 
13768064efb8SGeert Uytterhoeven 	tfm = crypto_alloc_pcomp(driver, type, mask);
13778064efb8SGeert Uytterhoeven 	if (IS_ERR(tfm)) {
13788064efb8SGeert Uytterhoeven 		pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
13798064efb8SGeert Uytterhoeven 		       driver, PTR_ERR(tfm));
13808064efb8SGeert Uytterhoeven 		return PTR_ERR(tfm);
13818064efb8SGeert Uytterhoeven 	}
13828064efb8SGeert Uytterhoeven 
13838064efb8SGeert Uytterhoeven 	err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
13848064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.vecs,
13858064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.comp.count,
13868064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.count);
13878064efb8SGeert Uytterhoeven 
13888064efb8SGeert Uytterhoeven 	crypto_free_pcomp(tfm);
13898064efb8SGeert Uytterhoeven 	return err;
13908064efb8SGeert Uytterhoeven }
13918064efb8SGeert Uytterhoeven 
1392da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1393da7f033dSHerbert Xu 			 u32 type, u32 mask)
1394da7f033dSHerbert Xu {
1395da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1396da7f033dSHerbert Xu 	int err;
1397da7f033dSHerbert Xu 
1398da7f033dSHerbert Xu 	tfm = crypto_alloc_ahash(driver, type, mask);
1399da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1400da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: 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_hash(tfm, desc->suite.hash.vecs, desc->suite.hash.count);
1406da7f033dSHerbert Xu 
1407da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1408da7f033dSHerbert Xu 	return err;
1409da7f033dSHerbert Xu }
1410da7f033dSHerbert Xu 
14118e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
14128e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
14138e3ee85eSHerbert Xu {
14148e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
14158e3ee85eSHerbert Xu 	u32 val;
14168e3ee85eSHerbert Xu 	int err;
14178e3ee85eSHerbert Xu 
14188e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
14198e3ee85eSHerbert Xu 	if (err)
14208e3ee85eSHerbert Xu 		goto out;
14218e3ee85eSHerbert Xu 
14228e3ee85eSHerbert Xu 	tfm = crypto_alloc_shash(driver, type, mask);
14238e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
14248e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
14258e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
14268e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
14278e3ee85eSHerbert Xu 		goto out;
14288e3ee85eSHerbert Xu 	}
14298e3ee85eSHerbert Xu 
14308e3ee85eSHerbert Xu 	do {
14318e3ee85eSHerbert Xu 		struct {
14328e3ee85eSHerbert Xu 			struct shash_desc shash;
14338e3ee85eSHerbert Xu 			char ctx[crypto_shash_descsize(tfm)];
14348e3ee85eSHerbert Xu 		} sdesc;
14358e3ee85eSHerbert Xu 
14368e3ee85eSHerbert Xu 		sdesc.shash.tfm = tfm;
14378e3ee85eSHerbert Xu 		sdesc.shash.flags = 0;
14388e3ee85eSHerbert Xu 
14398e3ee85eSHerbert Xu 		*(u32 *)sdesc.ctx = le32_to_cpu(420553207);
14408e3ee85eSHerbert Xu 		err = crypto_shash_final(&sdesc.shash, (u8 *)&val);
14418e3ee85eSHerbert Xu 		if (err) {
14428e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
14438e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
14448e3ee85eSHerbert Xu 			break;
14458e3ee85eSHerbert Xu 		}
14468e3ee85eSHerbert Xu 
14478e3ee85eSHerbert Xu 		if (val != ~420553207) {
14488e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
14498e3ee85eSHerbert Xu 			       "%d\n", driver, val);
14508e3ee85eSHerbert Xu 			err = -EINVAL;
14518e3ee85eSHerbert Xu 		}
14528e3ee85eSHerbert Xu 	} while (0);
14538e3ee85eSHerbert Xu 
14548e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
14558e3ee85eSHerbert Xu 
14568e3ee85eSHerbert Xu out:
14578e3ee85eSHerbert Xu 	return err;
14588e3ee85eSHerbert Xu }
14598e3ee85eSHerbert Xu 
14607647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
14617647d6ceSJarod Wilson 			  u32 type, u32 mask)
14627647d6ceSJarod Wilson {
14637647d6ceSJarod Wilson 	struct crypto_rng *rng;
14647647d6ceSJarod Wilson 	int err;
14657647d6ceSJarod Wilson 
14667647d6ceSJarod Wilson 	rng = crypto_alloc_rng(driver, type, mask);
14677647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
14687647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
14697647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
14707647d6ceSJarod Wilson 		return PTR_ERR(rng);
14717647d6ceSJarod Wilson 	}
14727647d6ceSJarod Wilson 
14737647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
14747647d6ceSJarod Wilson 
14757647d6ceSJarod Wilson 	crypto_free_rng(rng);
14767647d6ceSJarod Wilson 
14777647d6ceSJarod Wilson 	return err;
14787647d6ceSJarod Wilson }
14797647d6ceSJarod Wilson 
1480863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1481863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1482863b557aSYouquan, Song {
1483863b557aSYouquan, Song 	return 0;
1484863b557aSYouquan, Song }
1485863b557aSYouquan, Song 
1486da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1487da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1488da7f033dSHerbert Xu 	{
1489863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
1490863b557aSYouquan, Song 		.test = alg_test_null,
1491863b557aSYouquan, Song 		.suite = {
1492863b557aSYouquan, Song 			.cipher = {
1493863b557aSYouquan, Song 				.enc = {
1494863b557aSYouquan, Song 					.vecs = NULL,
1495863b557aSYouquan, Song 					.count = 0
1496863b557aSYouquan, Song 				},
1497863b557aSYouquan, Song 				.dec = {
1498863b557aSYouquan, Song 					.vecs = NULL,
1499863b557aSYouquan, Song 					.count = 0
1500863b557aSYouquan, Song 				}
1501863b557aSYouquan, Song 			}
1502863b557aSYouquan, Song 		}
1503863b557aSYouquan, Song 	}, {
1504863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
1505863b557aSYouquan, Song 		.test = alg_test_null,
1506863b557aSYouquan, Song 		.suite = {
1507863b557aSYouquan, Song 			.cipher = {
1508863b557aSYouquan, Song 				.enc = {
1509863b557aSYouquan, Song 					.vecs = NULL,
1510863b557aSYouquan, Song 					.count = 0
1511863b557aSYouquan, Song 				},
1512863b557aSYouquan, Song 				.dec = {
1513863b557aSYouquan, Song 					.vecs = NULL,
1514863b557aSYouquan, Song 					.count = 0
1515863b557aSYouquan, Song 				}
1516863b557aSYouquan, Song 			}
1517863b557aSYouquan, Song 		}
1518863b557aSYouquan, Song 	}, {
1519863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
1520863b557aSYouquan, Song 		.test = alg_test_null,
1521863b557aSYouquan, Song 		.suite = {
1522863b557aSYouquan, Song 			.hash = {
1523863b557aSYouquan, Song 				.vecs = NULL,
1524863b557aSYouquan, Song 				.count = 0
1525863b557aSYouquan, Song 			}
1526863b557aSYouquan, Song 		}
1527863b557aSYouquan, Song 	}, {
1528e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
1529e08ca2daSJarod Wilson 		.test = alg_test_cprng,
1530a1915d51SJarod Wilson 		.fips_allowed = 1,
1531e08ca2daSJarod Wilson 		.suite = {
1532e08ca2daSJarod Wilson 			.cprng = {
1533e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
1534e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
1535e08ca2daSJarod Wilson 			}
1536e08ca2daSJarod Wilson 		}
1537e08ca2daSJarod Wilson 	}, {
1538da7f033dSHerbert Xu 		.alg = "cbc(aes)",
15391aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1540a1915d51SJarod Wilson 		.fips_allowed = 1,
1541da7f033dSHerbert Xu 		.suite = {
1542da7f033dSHerbert Xu 			.cipher = {
1543da7f033dSHerbert Xu 				.enc = {
1544da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
1545da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
1546da7f033dSHerbert Xu 				},
1547da7f033dSHerbert Xu 				.dec = {
1548da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
1549da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
1550da7f033dSHerbert Xu 				}
1551da7f033dSHerbert Xu 			}
1552da7f033dSHerbert Xu 		}
1553da7f033dSHerbert Xu 	}, {
1554da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
15551aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1556da7f033dSHerbert Xu 		.suite = {
1557da7f033dSHerbert Xu 			.cipher = {
1558da7f033dSHerbert Xu 				.enc = {
1559da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
1560da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
1561da7f033dSHerbert Xu 				},
1562da7f033dSHerbert Xu 				.dec = {
1563da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
1564da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
1565da7f033dSHerbert Xu 				}
1566da7f033dSHerbert Xu 			}
1567da7f033dSHerbert Xu 		}
1568da7f033dSHerbert Xu 	}, {
1569da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
15701aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1571da7f033dSHerbert Xu 		.suite = {
1572da7f033dSHerbert Xu 			.cipher = {
1573da7f033dSHerbert Xu 				.enc = {
1574da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
1575da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
1576da7f033dSHerbert Xu 				},
1577da7f033dSHerbert Xu 				.dec = {
1578da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
1579da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
1580da7f033dSHerbert Xu 				}
1581da7f033dSHerbert Xu 			}
1582da7f033dSHerbert Xu 		}
1583da7f033dSHerbert Xu 	}, {
1584da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
15851aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1586da7f033dSHerbert Xu 		.suite = {
1587da7f033dSHerbert Xu 			.cipher = {
1588da7f033dSHerbert Xu 				.enc = {
1589da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
1590da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
1591da7f033dSHerbert Xu 				},
1592da7f033dSHerbert Xu 				.dec = {
1593da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
1594da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
1595da7f033dSHerbert Xu 				}
1596da7f033dSHerbert Xu 			}
1597da7f033dSHerbert Xu 		}
1598da7f033dSHerbert Xu 	}, {
1599da7f033dSHerbert Xu 		.alg = "cbc(des)",
16001aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1601da7f033dSHerbert Xu 		.suite = {
1602da7f033dSHerbert Xu 			.cipher = {
1603da7f033dSHerbert Xu 				.enc = {
1604da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
1605da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
1606da7f033dSHerbert Xu 				},
1607da7f033dSHerbert Xu 				.dec = {
1608da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
1609da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
1610da7f033dSHerbert Xu 				}
1611da7f033dSHerbert Xu 			}
1612da7f033dSHerbert Xu 		}
1613da7f033dSHerbert Xu 	}, {
1614da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
16151aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1616a1915d51SJarod Wilson 		.fips_allowed = 1,
1617da7f033dSHerbert Xu 		.suite = {
1618da7f033dSHerbert Xu 			.cipher = {
1619da7f033dSHerbert Xu 				.enc = {
1620da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
1621da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
1622da7f033dSHerbert Xu 				},
1623da7f033dSHerbert Xu 				.dec = {
1624da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
1625da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
1626da7f033dSHerbert Xu 				}
1627da7f033dSHerbert Xu 			}
1628da7f033dSHerbert Xu 		}
1629da7f033dSHerbert Xu 	}, {
1630da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
16311aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1632da7f033dSHerbert Xu 		.suite = {
1633da7f033dSHerbert Xu 			.cipher = {
1634da7f033dSHerbert Xu 				.enc = {
1635da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
1636da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
1637da7f033dSHerbert Xu 				},
1638da7f033dSHerbert Xu 				.dec = {
1639da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
1640da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
1641da7f033dSHerbert Xu 				}
1642da7f033dSHerbert Xu 			}
1643da7f033dSHerbert Xu 		}
1644da7f033dSHerbert Xu 	}, {
1645da7f033dSHerbert Xu 		.alg = "ccm(aes)",
1646da7f033dSHerbert Xu 		.test = alg_test_aead,
1647a1915d51SJarod Wilson 		.fips_allowed = 1,
1648da7f033dSHerbert Xu 		.suite = {
1649da7f033dSHerbert Xu 			.aead = {
1650da7f033dSHerbert Xu 				.enc = {
1651da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
1652da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
1653da7f033dSHerbert Xu 				},
1654da7f033dSHerbert Xu 				.dec = {
1655da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
1656da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
1657da7f033dSHerbert Xu 				}
1658da7f033dSHerbert Xu 			}
1659da7f033dSHerbert Xu 		}
1660da7f033dSHerbert Xu 	}, {
1661da7f033dSHerbert Xu 		.alg = "crc32c",
16628e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
1663a1915d51SJarod Wilson 		.fips_allowed = 1,
1664da7f033dSHerbert Xu 		.suite = {
1665da7f033dSHerbert Xu 			.hash = {
1666da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
1667da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
1668da7f033dSHerbert Xu 			}
1669da7f033dSHerbert Xu 		}
1670da7f033dSHerbert Xu 	}, {
1671863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
1672863b557aSYouquan, Song 		.test = alg_test_null,
1673863b557aSYouquan, Song 		.suite = {
1674863b557aSYouquan, Song 			.cipher = {
1675863b557aSYouquan, Song 				.enc = {
1676863b557aSYouquan, Song 					.vecs = NULL,
1677863b557aSYouquan, Song 					.count = 0
1678863b557aSYouquan, Song 				},
1679863b557aSYouquan, Song 				.dec = {
1680863b557aSYouquan, Song 					.vecs = NULL,
1681863b557aSYouquan, Song 					.count = 0
1682863b557aSYouquan, Song 				}
1683863b557aSYouquan, Song 			}
1684863b557aSYouquan, Song 		}
1685863b557aSYouquan, Song 	}, {
1686863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
1687863b557aSYouquan, Song 		.test = alg_test_null,
1688863b557aSYouquan, Song 		.suite = {
1689863b557aSYouquan, Song 			.hash = {
1690863b557aSYouquan, Song 				.vecs = NULL,
1691863b557aSYouquan, Song 				.count = 0
1692863b557aSYouquan, Song 			}
1693863b557aSYouquan, Song 		}
1694863b557aSYouquan, Song 	}, {
1695f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
1696f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
1697a1915d51SJarod Wilson 		.fips_allowed = 1,
1698f7cb80f2SJarod Wilson 		.suite = {
1699f7cb80f2SJarod Wilson 			.cipher = {
1700f7cb80f2SJarod Wilson 				.enc = {
1701f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
1702f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
1703f7cb80f2SJarod Wilson 				},
1704f7cb80f2SJarod Wilson 				.dec = {
1705f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
1706f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
1707f7cb80f2SJarod Wilson 				}
1708f7cb80f2SJarod Wilson 			}
1709f7cb80f2SJarod Wilson 		}
1710f7cb80f2SJarod Wilson 	}, {
1711da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
17121aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1713da7f033dSHerbert Xu 		.suite = {
1714da7f033dSHerbert Xu 			.cipher = {
1715da7f033dSHerbert Xu 				.enc = {
1716da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
1717da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
1718da7f033dSHerbert Xu 				},
1719da7f033dSHerbert Xu 				.dec = {
1720da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
1721da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
1722da7f033dSHerbert Xu 				}
1723da7f033dSHerbert Xu 			}
1724da7f033dSHerbert Xu 		}
1725da7f033dSHerbert Xu 	}, {
1726da7f033dSHerbert Xu 		.alg = "deflate",
1727da7f033dSHerbert Xu 		.test = alg_test_comp,
1728da7f033dSHerbert Xu 		.suite = {
1729da7f033dSHerbert Xu 			.comp = {
1730da7f033dSHerbert Xu 				.comp = {
1731da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
1732da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
1733da7f033dSHerbert Xu 				},
1734da7f033dSHerbert Xu 				.decomp = {
1735da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
1736da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
1737da7f033dSHerbert Xu 				}
1738da7f033dSHerbert Xu 			}
1739da7f033dSHerbert Xu 		}
1740da7f033dSHerbert Xu 	}, {
1741863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
1742863b557aSYouquan, Song 		.test = alg_test_null,
1743863b557aSYouquan, Song 		.suite = {
1744863b557aSYouquan, Song 			.cipher = {
1745863b557aSYouquan, Song 				.enc = {
1746863b557aSYouquan, Song 					.vecs = NULL,
1747863b557aSYouquan, Song 					.count = 0
1748863b557aSYouquan, Song 				},
1749863b557aSYouquan, Song 				.dec = {
1750863b557aSYouquan, Song 					.vecs = NULL,
1751863b557aSYouquan, Song 					.count = 0
1752863b557aSYouquan, Song 				}
1753863b557aSYouquan, Song 			}
1754863b557aSYouquan, Song 		}
1755863b557aSYouquan, Song 	}, {
1756da7f033dSHerbert Xu 		.alg = "ecb(aes)",
17571aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1758a1915d51SJarod Wilson 		.fips_allowed = 1,
1759da7f033dSHerbert Xu 		.suite = {
1760da7f033dSHerbert Xu 			.cipher = {
1761da7f033dSHerbert Xu 				.enc = {
1762da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
1763da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
1764da7f033dSHerbert Xu 				},
1765da7f033dSHerbert Xu 				.dec = {
1766da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
1767da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
1768da7f033dSHerbert Xu 				}
1769da7f033dSHerbert Xu 			}
1770da7f033dSHerbert Xu 		}
1771da7f033dSHerbert Xu 	}, {
1772da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
17731aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1774da7f033dSHerbert Xu 		.suite = {
1775da7f033dSHerbert Xu 			.cipher = {
1776da7f033dSHerbert Xu 				.enc = {
1777da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
1778da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
1779da7f033dSHerbert Xu 				},
1780da7f033dSHerbert Xu 				.dec = {
1781da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
1782da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
1783da7f033dSHerbert Xu 				}
1784da7f033dSHerbert Xu 			}
1785da7f033dSHerbert Xu 		}
1786da7f033dSHerbert Xu 	}, {
1787da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
17881aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1789da7f033dSHerbert Xu 		.suite = {
1790da7f033dSHerbert Xu 			.cipher = {
1791da7f033dSHerbert Xu 				.enc = {
1792da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
1793da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
1794da7f033dSHerbert Xu 				},
1795da7f033dSHerbert Xu 				.dec = {
1796da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
1797da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
1798da7f033dSHerbert Xu 				}
1799da7f033dSHerbert Xu 			}
1800da7f033dSHerbert Xu 		}
1801da7f033dSHerbert Xu 	}, {
1802da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
18031aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1804da7f033dSHerbert Xu 		.suite = {
1805da7f033dSHerbert Xu 			.cipher = {
1806da7f033dSHerbert Xu 				.enc = {
1807da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
1808da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
1809da7f033dSHerbert Xu 				},
1810da7f033dSHerbert Xu 				.dec = {
1811da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
1812da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
1813da7f033dSHerbert Xu 				}
1814da7f033dSHerbert Xu 			}
1815da7f033dSHerbert Xu 		}
1816da7f033dSHerbert Xu 	}, {
1817da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
18181aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1819da7f033dSHerbert Xu 		.suite = {
1820da7f033dSHerbert Xu 			.cipher = {
1821da7f033dSHerbert Xu 				.enc = {
1822da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
1823da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
1824da7f033dSHerbert Xu 				},
1825da7f033dSHerbert Xu 				.dec = {
1826da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
1827da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
1828da7f033dSHerbert Xu 				}
1829da7f033dSHerbert Xu 			}
1830da7f033dSHerbert Xu 		}
1831da7f033dSHerbert Xu 	}, {
1832da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
18331aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1834da7f033dSHerbert Xu 		.suite = {
1835da7f033dSHerbert Xu 			.cipher = {
1836da7f033dSHerbert Xu 				.enc = {
1837da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
1838da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
1839da7f033dSHerbert Xu 				},
1840da7f033dSHerbert Xu 				.dec = {
1841da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
1842da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
1843da7f033dSHerbert Xu 				}
1844da7f033dSHerbert Xu 			}
1845da7f033dSHerbert Xu 		}
1846da7f033dSHerbert Xu 	}, {
1847da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
18481aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1849da7f033dSHerbert Xu 		.suite = {
1850da7f033dSHerbert Xu 			.cipher = {
1851da7f033dSHerbert Xu 				.enc = {
1852da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
1853da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
1854da7f033dSHerbert Xu 				},
1855da7f033dSHerbert Xu 				.dec = {
1856da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
1857da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
1858da7f033dSHerbert Xu 				}
1859da7f033dSHerbert Xu 			}
1860da7f033dSHerbert Xu 		}
1861da7f033dSHerbert Xu 	}, {
1862da7f033dSHerbert Xu 		.alg = "ecb(des)",
18631aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1864a1915d51SJarod Wilson 		.fips_allowed = 1,
1865da7f033dSHerbert Xu 		.suite = {
1866da7f033dSHerbert Xu 			.cipher = {
1867da7f033dSHerbert Xu 				.enc = {
1868da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
1869da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
1870da7f033dSHerbert Xu 				},
1871da7f033dSHerbert Xu 				.dec = {
1872da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
1873da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
1874da7f033dSHerbert Xu 				}
1875da7f033dSHerbert Xu 			}
1876da7f033dSHerbert Xu 		}
1877da7f033dSHerbert Xu 	}, {
1878da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
18791aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1880a1915d51SJarod Wilson 		.fips_allowed = 1,
1881da7f033dSHerbert Xu 		.suite = {
1882da7f033dSHerbert Xu 			.cipher = {
1883da7f033dSHerbert Xu 				.enc = {
1884da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
1885da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
1886da7f033dSHerbert Xu 				},
1887da7f033dSHerbert Xu 				.dec = {
1888da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
1889da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
1890da7f033dSHerbert Xu 				}
1891da7f033dSHerbert Xu 			}
1892da7f033dSHerbert Xu 		}
1893da7f033dSHerbert Xu 	}, {
1894da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
18951aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1896da7f033dSHerbert Xu 		.suite = {
1897da7f033dSHerbert Xu 			.cipher = {
1898da7f033dSHerbert Xu 				.enc = {
1899da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
1900da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
1901da7f033dSHerbert Xu 				},
1902da7f033dSHerbert Xu 				.dec = {
1903da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
1904da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
1905da7f033dSHerbert Xu 				}
1906da7f033dSHerbert Xu 			}
1907da7f033dSHerbert Xu 		}
1908da7f033dSHerbert Xu 	}, {
1909da7f033dSHerbert Xu 		.alg = "ecb(seed)",
19101aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1911da7f033dSHerbert Xu 		.suite = {
1912da7f033dSHerbert Xu 			.cipher = {
1913da7f033dSHerbert Xu 				.enc = {
1914da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
1915da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
1916da7f033dSHerbert Xu 				},
1917da7f033dSHerbert Xu 				.dec = {
1918da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
1919da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
1920da7f033dSHerbert Xu 				}
1921da7f033dSHerbert Xu 			}
1922da7f033dSHerbert Xu 		}
1923da7f033dSHerbert Xu 	}, {
1924da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
19251aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1926da7f033dSHerbert Xu 		.suite = {
1927da7f033dSHerbert Xu 			.cipher = {
1928da7f033dSHerbert Xu 				.enc = {
1929da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
1930da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
1931da7f033dSHerbert Xu 				},
1932da7f033dSHerbert Xu 				.dec = {
1933da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
1934da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
1935da7f033dSHerbert Xu 				}
1936da7f033dSHerbert Xu 			}
1937da7f033dSHerbert Xu 		}
1938da7f033dSHerbert Xu 	}, {
1939da7f033dSHerbert Xu 		.alg = "ecb(tea)",
19401aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1941da7f033dSHerbert Xu 		.suite = {
1942da7f033dSHerbert Xu 			.cipher = {
1943da7f033dSHerbert Xu 				.enc = {
1944da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
1945da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
1946da7f033dSHerbert Xu 				},
1947da7f033dSHerbert Xu 				.dec = {
1948da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
1949da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
1950da7f033dSHerbert Xu 				}
1951da7f033dSHerbert Xu 			}
1952da7f033dSHerbert Xu 		}
1953da7f033dSHerbert Xu 	}, {
1954da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
19551aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1956da7f033dSHerbert Xu 		.suite = {
1957da7f033dSHerbert Xu 			.cipher = {
1958da7f033dSHerbert Xu 				.enc = {
1959da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
1960da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
1961da7f033dSHerbert Xu 				},
1962da7f033dSHerbert Xu 				.dec = {
1963da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
1964da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
1965da7f033dSHerbert Xu 				}
1966da7f033dSHerbert Xu 			}
1967da7f033dSHerbert Xu 		}
1968da7f033dSHerbert Xu 	}, {
1969da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
19701aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1971da7f033dSHerbert Xu 		.suite = {
1972da7f033dSHerbert Xu 			.cipher = {
1973da7f033dSHerbert Xu 				.enc = {
1974da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
1975da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
1976da7f033dSHerbert Xu 				},
1977da7f033dSHerbert Xu 				.dec = {
1978da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
1979da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
1980da7f033dSHerbert Xu 				}
1981da7f033dSHerbert Xu 			}
1982da7f033dSHerbert Xu 		}
1983da7f033dSHerbert Xu 	}, {
1984da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
19851aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1986da7f033dSHerbert Xu 		.suite = {
1987da7f033dSHerbert Xu 			.cipher = {
1988da7f033dSHerbert Xu 				.enc = {
1989da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
1990da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
1991da7f033dSHerbert Xu 				},
1992da7f033dSHerbert Xu 				.dec = {
1993da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
1994da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
1995da7f033dSHerbert Xu 				}
1996da7f033dSHerbert Xu 			}
1997da7f033dSHerbert Xu 		}
1998da7f033dSHerbert Xu 	}, {
1999da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
20001aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2001da7f033dSHerbert Xu 		.suite = {
2002da7f033dSHerbert Xu 			.cipher = {
2003da7f033dSHerbert Xu 				.enc = {
2004da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
2005da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
2006da7f033dSHerbert Xu 				},
2007da7f033dSHerbert Xu 				.dec = {
2008da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
2009da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
2010da7f033dSHerbert Xu 				}
2011da7f033dSHerbert Xu 			}
2012da7f033dSHerbert Xu 		}
2013da7f033dSHerbert Xu 	}, {
2014da7f033dSHerbert Xu 		.alg = "gcm(aes)",
2015da7f033dSHerbert Xu 		.test = alg_test_aead,
2016a1915d51SJarod Wilson 		.fips_allowed = 1,
2017da7f033dSHerbert Xu 		.suite = {
2018da7f033dSHerbert Xu 			.aead = {
2019da7f033dSHerbert Xu 				.enc = {
2020da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
2021da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
2022da7f033dSHerbert Xu 				},
2023da7f033dSHerbert Xu 				.dec = {
2024da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
2025da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
2026da7f033dSHerbert Xu 				}
2027da7f033dSHerbert Xu 			}
2028da7f033dSHerbert Xu 		}
2029da7f033dSHerbert Xu 	}, {
2030507069c9SYouquan, Song 		.alg = "ghash",
2031507069c9SYouquan, Song 		.test = alg_test_hash,
2032507069c9SYouquan, Song 		.suite = {
2033507069c9SYouquan, Song 			.hash = {
2034507069c9SYouquan, Song 				.vecs = ghash_tv_template,
2035507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
2036507069c9SYouquan, Song 			}
2037507069c9SYouquan, Song 		}
2038507069c9SYouquan, Song 	}, {
2039da7f033dSHerbert Xu 		.alg = "hmac(md5)",
2040da7f033dSHerbert Xu 		.test = alg_test_hash,
2041da7f033dSHerbert Xu 		.suite = {
2042da7f033dSHerbert Xu 			.hash = {
2043da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
2044da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
2045da7f033dSHerbert Xu 			}
2046da7f033dSHerbert Xu 		}
2047da7f033dSHerbert Xu 	}, {
2048da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
2049da7f033dSHerbert Xu 		.test = alg_test_hash,
2050da7f033dSHerbert Xu 		.suite = {
2051da7f033dSHerbert Xu 			.hash = {
2052da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
2053da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
2054da7f033dSHerbert Xu 			}
2055da7f033dSHerbert Xu 		}
2056da7f033dSHerbert Xu 	}, {
2057da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
2058da7f033dSHerbert Xu 		.test = alg_test_hash,
2059da7f033dSHerbert Xu 		.suite = {
2060da7f033dSHerbert Xu 			.hash = {
2061da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
2062da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
2063da7f033dSHerbert Xu 			}
2064da7f033dSHerbert Xu 		}
2065da7f033dSHerbert Xu 	}, {
2066da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
2067da7f033dSHerbert Xu 		.test = alg_test_hash,
2068a1915d51SJarod Wilson 		.fips_allowed = 1,
2069da7f033dSHerbert Xu 		.suite = {
2070da7f033dSHerbert Xu 			.hash = {
2071da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
2072da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
2073da7f033dSHerbert Xu 			}
2074da7f033dSHerbert Xu 		}
2075da7f033dSHerbert Xu 	}, {
2076da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
2077da7f033dSHerbert Xu 		.test = alg_test_hash,
2078a1915d51SJarod Wilson 		.fips_allowed = 1,
2079da7f033dSHerbert Xu 		.suite = {
2080da7f033dSHerbert Xu 			.hash = {
2081da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
2082da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
2083da7f033dSHerbert Xu 			}
2084da7f033dSHerbert Xu 		}
2085da7f033dSHerbert Xu 	}, {
2086da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
2087da7f033dSHerbert Xu 		.test = alg_test_hash,
2088a1915d51SJarod Wilson 		.fips_allowed = 1,
2089da7f033dSHerbert Xu 		.suite = {
2090da7f033dSHerbert Xu 			.hash = {
2091da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
2092da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
2093da7f033dSHerbert Xu 			}
2094da7f033dSHerbert Xu 		}
2095da7f033dSHerbert Xu 	}, {
2096da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
2097da7f033dSHerbert Xu 		.test = alg_test_hash,
2098a1915d51SJarod Wilson 		.fips_allowed = 1,
2099da7f033dSHerbert Xu 		.suite = {
2100da7f033dSHerbert Xu 			.hash = {
2101da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
2102da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
2103da7f033dSHerbert Xu 			}
2104da7f033dSHerbert Xu 		}
2105da7f033dSHerbert Xu 	}, {
2106da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
2107da7f033dSHerbert Xu 		.test = alg_test_hash,
2108a1915d51SJarod Wilson 		.fips_allowed = 1,
2109da7f033dSHerbert Xu 		.suite = {
2110da7f033dSHerbert Xu 			.hash = {
2111da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
2112da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
2113da7f033dSHerbert Xu 			}
2114da7f033dSHerbert Xu 		}
2115da7f033dSHerbert Xu 	}, {
2116da7f033dSHerbert Xu 		.alg = "lrw(aes)",
21171aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2118da7f033dSHerbert Xu 		.suite = {
2119da7f033dSHerbert Xu 			.cipher = {
2120da7f033dSHerbert Xu 				.enc = {
2121da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
2122da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
2123da7f033dSHerbert Xu 				},
2124da7f033dSHerbert Xu 				.dec = {
2125da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
2126da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
2127da7f033dSHerbert Xu 				}
2128da7f033dSHerbert Xu 			}
2129da7f033dSHerbert Xu 		}
2130da7f033dSHerbert Xu 	}, {
2131da7f033dSHerbert Xu 		.alg = "lzo",
2132da7f033dSHerbert Xu 		.test = alg_test_comp,
2133da7f033dSHerbert Xu 		.suite = {
2134da7f033dSHerbert Xu 			.comp = {
2135da7f033dSHerbert Xu 				.comp = {
2136da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
2137da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
2138da7f033dSHerbert Xu 				},
2139da7f033dSHerbert Xu 				.decomp = {
2140da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
2141da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
2142da7f033dSHerbert Xu 				}
2143da7f033dSHerbert Xu 			}
2144da7f033dSHerbert Xu 		}
2145da7f033dSHerbert Xu 	}, {
2146da7f033dSHerbert Xu 		.alg = "md4",
2147da7f033dSHerbert Xu 		.test = alg_test_hash,
2148da7f033dSHerbert Xu 		.suite = {
2149da7f033dSHerbert Xu 			.hash = {
2150da7f033dSHerbert Xu 				.vecs = md4_tv_template,
2151da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
2152da7f033dSHerbert Xu 			}
2153da7f033dSHerbert Xu 		}
2154da7f033dSHerbert Xu 	}, {
2155da7f033dSHerbert Xu 		.alg = "md5",
2156da7f033dSHerbert Xu 		.test = alg_test_hash,
2157da7f033dSHerbert Xu 		.suite = {
2158da7f033dSHerbert Xu 			.hash = {
2159da7f033dSHerbert Xu 				.vecs = md5_tv_template,
2160da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
2161da7f033dSHerbert Xu 			}
2162da7f033dSHerbert Xu 		}
2163da7f033dSHerbert Xu 	}, {
2164da7f033dSHerbert Xu 		.alg = "michael_mic",
2165da7f033dSHerbert Xu 		.test = alg_test_hash,
2166da7f033dSHerbert Xu 		.suite = {
2167da7f033dSHerbert Xu 			.hash = {
2168da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
2169da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
2170da7f033dSHerbert Xu 			}
2171da7f033dSHerbert Xu 		}
2172da7f033dSHerbert Xu 	}, {
2173da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
21741aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2175da7f033dSHerbert Xu 		.suite = {
2176da7f033dSHerbert Xu 			.cipher = {
2177da7f033dSHerbert Xu 				.enc = {
2178da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
2179da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
2180da7f033dSHerbert Xu 				},
2181da7f033dSHerbert Xu 				.dec = {
2182da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
2183da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
2184da7f033dSHerbert Xu 				}
2185da7f033dSHerbert Xu 			}
2186da7f033dSHerbert Xu 		}
2187da7f033dSHerbert Xu 	}, {
2188da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
21891aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2190a1915d51SJarod Wilson 		.fips_allowed = 1,
2191da7f033dSHerbert Xu 		.suite = {
2192da7f033dSHerbert Xu 			.cipher = {
2193da7f033dSHerbert Xu 				.enc = {
2194f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
2195f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
2196da7f033dSHerbert Xu 				},
2197da7f033dSHerbert Xu 				.dec = {
2198f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
2199f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
2200da7f033dSHerbert Xu 				}
2201da7f033dSHerbert Xu 			}
2202da7f033dSHerbert Xu 		}
2203da7f033dSHerbert Xu 	}, {
22045d667322SJarod Wilson 		.alg = "rfc4309(ccm(aes))",
22055d667322SJarod Wilson 		.test = alg_test_aead,
2206a1915d51SJarod Wilson 		.fips_allowed = 1,
22075d667322SJarod Wilson 		.suite = {
22085d667322SJarod Wilson 			.aead = {
22095d667322SJarod Wilson 				.enc = {
22105d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
22115d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
22125d667322SJarod Wilson 				},
22135d667322SJarod Wilson 				.dec = {
22145d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
22155d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
22165d667322SJarod Wilson 				}
22175d667322SJarod Wilson 			}
22185d667322SJarod Wilson 		}
22195d667322SJarod Wilson 	}, {
2220da7f033dSHerbert Xu 		.alg = "rmd128",
2221da7f033dSHerbert Xu 		.test = alg_test_hash,
2222da7f033dSHerbert Xu 		.suite = {
2223da7f033dSHerbert Xu 			.hash = {
2224da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
2225da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
2226da7f033dSHerbert Xu 			}
2227da7f033dSHerbert Xu 		}
2228da7f033dSHerbert Xu 	}, {
2229da7f033dSHerbert Xu 		.alg = "rmd160",
2230da7f033dSHerbert Xu 		.test = alg_test_hash,
2231da7f033dSHerbert Xu 		.suite = {
2232da7f033dSHerbert Xu 			.hash = {
2233da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
2234da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
2235da7f033dSHerbert Xu 			}
2236da7f033dSHerbert Xu 		}
2237da7f033dSHerbert Xu 	}, {
2238da7f033dSHerbert Xu 		.alg = "rmd256",
2239da7f033dSHerbert Xu 		.test = alg_test_hash,
2240da7f033dSHerbert Xu 		.suite = {
2241da7f033dSHerbert Xu 			.hash = {
2242da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
2243da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
2244da7f033dSHerbert Xu 			}
2245da7f033dSHerbert Xu 		}
2246da7f033dSHerbert Xu 	}, {
2247da7f033dSHerbert Xu 		.alg = "rmd320",
2248da7f033dSHerbert Xu 		.test = alg_test_hash,
2249da7f033dSHerbert Xu 		.suite = {
2250da7f033dSHerbert Xu 			.hash = {
2251da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
2252da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
2253da7f033dSHerbert Xu 			}
2254da7f033dSHerbert Xu 		}
2255da7f033dSHerbert Xu 	}, {
2256da7f033dSHerbert Xu 		.alg = "salsa20",
22571aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2258da7f033dSHerbert Xu 		.suite = {
2259da7f033dSHerbert Xu 			.cipher = {
2260da7f033dSHerbert Xu 				.enc = {
2261da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
2262da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
2263da7f033dSHerbert Xu 				}
2264da7f033dSHerbert Xu 			}
2265da7f033dSHerbert Xu 		}
2266da7f033dSHerbert Xu 	}, {
2267da7f033dSHerbert Xu 		.alg = "sha1",
2268da7f033dSHerbert Xu 		.test = alg_test_hash,
2269a1915d51SJarod Wilson 		.fips_allowed = 1,
2270da7f033dSHerbert Xu 		.suite = {
2271da7f033dSHerbert Xu 			.hash = {
2272da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
2273da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
2274da7f033dSHerbert Xu 			}
2275da7f033dSHerbert Xu 		}
2276da7f033dSHerbert Xu 	}, {
2277da7f033dSHerbert Xu 		.alg = "sha224",
2278da7f033dSHerbert Xu 		.test = alg_test_hash,
2279a1915d51SJarod Wilson 		.fips_allowed = 1,
2280da7f033dSHerbert Xu 		.suite = {
2281da7f033dSHerbert Xu 			.hash = {
2282da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
2283da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
2284da7f033dSHerbert Xu 			}
2285da7f033dSHerbert Xu 		}
2286da7f033dSHerbert Xu 	}, {
2287da7f033dSHerbert Xu 		.alg = "sha256",
2288da7f033dSHerbert Xu 		.test = alg_test_hash,
2289a1915d51SJarod Wilson 		.fips_allowed = 1,
2290da7f033dSHerbert Xu 		.suite = {
2291da7f033dSHerbert Xu 			.hash = {
2292da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
2293da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
2294da7f033dSHerbert Xu 			}
2295da7f033dSHerbert Xu 		}
2296da7f033dSHerbert Xu 	}, {
2297da7f033dSHerbert Xu 		.alg = "sha384",
2298da7f033dSHerbert Xu 		.test = alg_test_hash,
2299a1915d51SJarod Wilson 		.fips_allowed = 1,
2300da7f033dSHerbert Xu 		.suite = {
2301da7f033dSHerbert Xu 			.hash = {
2302da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
2303da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
2304da7f033dSHerbert Xu 			}
2305da7f033dSHerbert Xu 		}
2306da7f033dSHerbert Xu 	}, {
2307da7f033dSHerbert Xu 		.alg = "sha512",
2308da7f033dSHerbert Xu 		.test = alg_test_hash,
2309a1915d51SJarod Wilson 		.fips_allowed = 1,
2310da7f033dSHerbert Xu 		.suite = {
2311da7f033dSHerbert Xu 			.hash = {
2312da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
2313da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
2314da7f033dSHerbert Xu 			}
2315da7f033dSHerbert Xu 		}
2316da7f033dSHerbert Xu 	}, {
2317da7f033dSHerbert Xu 		.alg = "tgr128",
2318da7f033dSHerbert Xu 		.test = alg_test_hash,
2319da7f033dSHerbert Xu 		.suite = {
2320da7f033dSHerbert Xu 			.hash = {
2321da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
2322da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
2323da7f033dSHerbert Xu 			}
2324da7f033dSHerbert Xu 		}
2325da7f033dSHerbert Xu 	}, {
2326da7f033dSHerbert Xu 		.alg = "tgr160",
2327da7f033dSHerbert Xu 		.test = alg_test_hash,
2328da7f033dSHerbert Xu 		.suite = {
2329da7f033dSHerbert Xu 			.hash = {
2330da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
2331da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
2332da7f033dSHerbert Xu 			}
2333da7f033dSHerbert Xu 		}
2334da7f033dSHerbert Xu 	}, {
2335da7f033dSHerbert Xu 		.alg = "tgr192",
2336da7f033dSHerbert Xu 		.test = alg_test_hash,
2337da7f033dSHerbert Xu 		.suite = {
2338da7f033dSHerbert Xu 			.hash = {
2339da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
2340da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
2341da7f033dSHerbert Xu 			}
2342da7f033dSHerbert Xu 		}
2343da7f033dSHerbert Xu 	}, {
2344f1939f7cSShane Wang 		.alg = "vmac(aes)",
2345f1939f7cSShane Wang 		.test = alg_test_hash,
2346f1939f7cSShane Wang 		.suite = {
2347f1939f7cSShane Wang 			.hash = {
2348f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
2349f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
2350f1939f7cSShane Wang 			}
2351f1939f7cSShane Wang 		}
2352f1939f7cSShane Wang 	}, {
2353da7f033dSHerbert Xu 		.alg = "wp256",
2354da7f033dSHerbert Xu 		.test = alg_test_hash,
2355da7f033dSHerbert Xu 		.suite = {
2356da7f033dSHerbert Xu 			.hash = {
2357da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
2358da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
2359da7f033dSHerbert Xu 			}
2360da7f033dSHerbert Xu 		}
2361da7f033dSHerbert Xu 	}, {
2362da7f033dSHerbert Xu 		.alg = "wp384",
2363da7f033dSHerbert Xu 		.test = alg_test_hash,
2364da7f033dSHerbert Xu 		.suite = {
2365da7f033dSHerbert Xu 			.hash = {
2366da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
2367da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
2368da7f033dSHerbert Xu 			}
2369da7f033dSHerbert Xu 		}
2370da7f033dSHerbert Xu 	}, {
2371da7f033dSHerbert Xu 		.alg = "wp512",
2372da7f033dSHerbert Xu 		.test = alg_test_hash,
2373da7f033dSHerbert Xu 		.suite = {
2374da7f033dSHerbert Xu 			.hash = {
2375da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
2376da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
2377da7f033dSHerbert Xu 			}
2378da7f033dSHerbert Xu 		}
2379da7f033dSHerbert Xu 	}, {
2380da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
2381da7f033dSHerbert Xu 		.test = alg_test_hash,
2382da7f033dSHerbert Xu 		.suite = {
2383da7f033dSHerbert Xu 			.hash = {
2384da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
2385da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
2386da7f033dSHerbert Xu 			}
2387da7f033dSHerbert Xu 		}
2388da7f033dSHerbert Xu 	}, {
2389da7f033dSHerbert Xu 		.alg = "xts(aes)",
23901aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2391da7f033dSHerbert Xu 		.suite = {
2392da7f033dSHerbert Xu 			.cipher = {
2393da7f033dSHerbert Xu 				.enc = {
2394da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
2395da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
2396da7f033dSHerbert Xu 				},
2397da7f033dSHerbert Xu 				.dec = {
2398da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
2399da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
2400da7f033dSHerbert Xu 				}
2401da7f033dSHerbert Xu 			}
2402da7f033dSHerbert Xu 		}
24030c01aed5SGeert Uytterhoeven 	}, {
24040c01aed5SGeert Uytterhoeven 		.alg = "zlib",
24050c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
24060c01aed5SGeert Uytterhoeven 		.suite = {
24070c01aed5SGeert Uytterhoeven 			.pcomp = {
24080c01aed5SGeert Uytterhoeven 				.comp = {
24090c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
24100c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
24110c01aed5SGeert Uytterhoeven 				},
24120c01aed5SGeert Uytterhoeven 				.decomp = {
24130c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
24140c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
24150c01aed5SGeert Uytterhoeven 				}
24160c01aed5SGeert Uytterhoeven 			}
24170c01aed5SGeert Uytterhoeven 		}
2418da7f033dSHerbert Xu 	}
2419da7f033dSHerbert Xu };
2420da7f033dSHerbert Xu 
24211aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
2422da7f033dSHerbert Xu {
2423da7f033dSHerbert Xu 	int start = 0;
2424da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
2425da7f033dSHerbert Xu 
2426da7f033dSHerbert Xu 	while (start < end) {
2427da7f033dSHerbert Xu 		int i = (start + end) / 2;
2428da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
2429da7f033dSHerbert Xu 
2430da7f033dSHerbert Xu 		if (diff > 0) {
2431da7f033dSHerbert Xu 			end = i;
2432da7f033dSHerbert Xu 			continue;
2433da7f033dSHerbert Xu 		}
2434da7f033dSHerbert Xu 
2435da7f033dSHerbert Xu 		if (diff < 0) {
2436da7f033dSHerbert Xu 			start = i + 1;
2437da7f033dSHerbert Xu 			continue;
2438da7f033dSHerbert Xu 		}
2439da7f033dSHerbert Xu 
24401aa4ecd9SHerbert Xu 		return i;
2441da7f033dSHerbert Xu 	}
2442da7f033dSHerbert Xu 
24431aa4ecd9SHerbert Xu 	return -1;
24441aa4ecd9SHerbert Xu }
24451aa4ecd9SHerbert Xu 
24461aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
24471aa4ecd9SHerbert Xu {
24481aa4ecd9SHerbert Xu 	int i;
2449a68f6610SHerbert Xu 	int j;
2450d12d6b6dSNeil Horman 	int rc;
24511aa4ecd9SHerbert Xu 
24521aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
24531aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
24541aa4ecd9SHerbert Xu 
24551aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
24561aa4ecd9SHerbert Xu 		    sizeof(nalg))
24571aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
24581aa4ecd9SHerbert Xu 
24591aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
24601aa4ecd9SHerbert Xu 		if (i < 0)
24611aa4ecd9SHerbert Xu 			goto notest;
24621aa4ecd9SHerbert Xu 
2463a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
2464a3bef3a3SJarod Wilson 			goto non_fips_alg;
2465a3bef3a3SJarod Wilson 
2466941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
2467941fb328SJarod Wilson 		goto test_done;
24681aa4ecd9SHerbert Xu 	}
24691aa4ecd9SHerbert Xu 
24701aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
2471a68f6610SHerbert Xu 	j = alg_find_test(driver);
2472a68f6610SHerbert Xu 	if (i < 0 && j < 0)
24731aa4ecd9SHerbert Xu 		goto notest;
24741aa4ecd9SHerbert Xu 
2475a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
2476a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
2477a3bef3a3SJarod Wilson 		goto non_fips_alg;
2478a3bef3a3SJarod Wilson 
2479a68f6610SHerbert Xu 	rc = 0;
2480a68f6610SHerbert Xu 	if (i >= 0)
2481a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
24821aa4ecd9SHerbert Xu 					     type, mask);
2483a68f6610SHerbert Xu 	if (j >= 0)
2484a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
2485a68f6610SHerbert Xu 					     type, mask);
2486a68f6610SHerbert Xu 
2487941fb328SJarod Wilson test_done:
2488d12d6b6dSNeil Horman 	if (fips_enabled && rc)
2489d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
2490d12d6b6dSNeil Horman 
249129ecd4abSJarod Wilson 	if (fips_enabled && !rc)
249229ecd4abSJarod Wilson 		printk(KERN_INFO "alg: self-tests for %s (%s) passed\n",
249329ecd4abSJarod Wilson 		       driver, alg);
249429ecd4abSJarod Wilson 
2495d12d6b6dSNeil Horman 	return rc;
24961aa4ecd9SHerbert Xu 
24971aa4ecd9SHerbert Xu notest:
2498da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
2499da7f033dSHerbert Xu 	return 0;
2500a3bef3a3SJarod Wilson non_fips_alg:
2501a3bef3a3SJarod Wilson 	return -EINVAL;
2502da7f033dSHerbert Xu }
2503da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
2504