xref: /openbmc/linux/crypto/testmgr.c (revision e08ca2da)
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);
97da7f033dSHerbert Xu 
98da7f033dSHerbert Xu 	union {
99da7f033dSHerbert Xu 		struct aead_test_suite aead;
100da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
101da7f033dSHerbert Xu 		struct comp_test_suite comp;
1028064efb8SGeert Uytterhoeven 		struct pcomp_test_suite pcomp;
103da7f033dSHerbert Xu 		struct hash_test_suite hash;
1047647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
105da7f033dSHerbert Xu 	} suite;
106da7f033dSHerbert Xu };
107da7f033dSHerbert Xu 
108da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
109da7f033dSHerbert Xu 
110da7f033dSHerbert Xu static char *xbuf[XBUFSIZE];
111da7f033dSHerbert Xu static char *axbuf[XBUFSIZE];
112da7f033dSHerbert Xu 
113da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
114da7f033dSHerbert Xu {
115da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
116da7f033dSHerbert Xu 			16, 1,
117da7f033dSHerbert Xu 			buf, len, false);
118da7f033dSHerbert Xu }
119da7f033dSHerbert Xu 
120da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
121da7f033dSHerbert Xu {
122da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
123da7f033dSHerbert Xu 
124da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
125da7f033dSHerbert Xu 		return;
126da7f033dSHerbert Xu 
127da7f033dSHerbert Xu 	res->err = err;
128da7f033dSHerbert Xu 	complete(&res->completion);
129da7f033dSHerbert Xu }
130da7f033dSHerbert Xu 
131da7f033dSHerbert Xu static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
132da7f033dSHerbert Xu 		     unsigned int tcount)
133da7f033dSHerbert Xu {
134da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
135da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
136da7f033dSHerbert Xu 	struct scatterlist sg[8];
137da7f033dSHerbert Xu 	char result[64];
138da7f033dSHerbert Xu 	struct ahash_request *req;
139da7f033dSHerbert Xu 	struct tcrypt_result tresult;
140da7f033dSHerbert Xu 	int ret;
141da7f033dSHerbert Xu 	void *hash_buff;
142da7f033dSHerbert Xu 
143da7f033dSHerbert Xu 	init_completion(&tresult.completion);
144da7f033dSHerbert Xu 
145da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
146da7f033dSHerbert Xu 	if (!req) {
147da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
148da7f033dSHerbert Xu 		       "%s\n", algo);
149da7f033dSHerbert Xu 		ret = -ENOMEM;
150da7f033dSHerbert Xu 		goto out_noreq;
151da7f033dSHerbert Xu 	}
152da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
153da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
154da7f033dSHerbert Xu 
155da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
156da7f033dSHerbert Xu 		memset(result, 0, 64);
157da7f033dSHerbert Xu 
158da7f033dSHerbert Xu 		hash_buff = xbuf[0];
159da7f033dSHerbert Xu 
160da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
161da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
162da7f033dSHerbert Xu 
163da7f033dSHerbert Xu 		if (template[i].ksize) {
164da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
165da7f033dSHerbert Xu 			ret = crypto_ahash_setkey(tfm, template[i].key,
166da7f033dSHerbert Xu 						  template[i].ksize);
167da7f033dSHerbert Xu 			if (ret) {
168da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
169da7f033dSHerbert Xu 				       "test %d for %s: ret=%d\n", i + 1, algo,
170da7f033dSHerbert Xu 				       -ret);
171da7f033dSHerbert Xu 				goto out;
172da7f033dSHerbert Xu 			}
173da7f033dSHerbert Xu 		}
174da7f033dSHerbert Xu 
175da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
176da7f033dSHerbert Xu 		ret = crypto_ahash_digest(req);
177da7f033dSHerbert Xu 		switch (ret) {
178da7f033dSHerbert Xu 		case 0:
179da7f033dSHerbert Xu 			break;
180da7f033dSHerbert Xu 		case -EINPROGRESS:
181da7f033dSHerbert Xu 		case -EBUSY:
182da7f033dSHerbert Xu 			ret = wait_for_completion_interruptible(
183da7f033dSHerbert Xu 				&tresult.completion);
184da7f033dSHerbert Xu 			if (!ret && !(ret = tresult.err)) {
185da7f033dSHerbert Xu 				INIT_COMPLETION(tresult.completion);
186da7f033dSHerbert Xu 				break;
187da7f033dSHerbert Xu 			}
188da7f033dSHerbert Xu 			/* fall through */
189da7f033dSHerbert Xu 		default:
190da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: digest failed on test %d "
191da7f033dSHerbert Xu 			       "for %s: ret=%d\n", i + 1, algo, -ret);
192da7f033dSHerbert Xu 			goto out;
193da7f033dSHerbert Xu 		}
194da7f033dSHerbert Xu 
195da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
196da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
197da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
198da7f033dSHerbert Xu 			       i + 1, algo);
199da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
200da7f033dSHerbert Xu 			ret = -EINVAL;
201da7f033dSHerbert Xu 			goto out;
202da7f033dSHerbert Xu 		}
203da7f033dSHerbert Xu 	}
204da7f033dSHerbert Xu 
205da7f033dSHerbert Xu 	j = 0;
206da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
207da7f033dSHerbert Xu 		if (template[i].np) {
208da7f033dSHerbert Xu 			j++;
209da7f033dSHerbert Xu 			memset(result, 0, 64);
210da7f033dSHerbert Xu 
211da7f033dSHerbert Xu 			temp = 0;
212da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
213da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
214da7f033dSHerbert Xu 				sg_set_buf(&sg[k],
215da7f033dSHerbert Xu 					   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
216da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
217da7f033dSHerbert Xu 						  template[i].plaintext + temp,
218da7f033dSHerbert Xu 						  template[i].tap[k]),
219da7f033dSHerbert Xu 					   template[i].tap[k]);
220da7f033dSHerbert Xu 				temp += template[i].tap[k];
221da7f033dSHerbert Xu 			}
222da7f033dSHerbert Xu 
223da7f033dSHerbert Xu 			if (template[i].ksize) {
224da7f033dSHerbert Xu 				crypto_ahash_clear_flags(tfm, ~0);
225da7f033dSHerbert Xu 				ret = crypto_ahash_setkey(tfm, template[i].key,
226da7f033dSHerbert Xu 							  template[i].ksize);
227da7f033dSHerbert Xu 
228da7f033dSHerbert Xu 				if (ret) {
229da7f033dSHerbert Xu 					printk(KERN_ERR "alg: hash: setkey "
230da7f033dSHerbert Xu 					       "failed on chunking test %d "
231da7f033dSHerbert Xu 					       "for %s: ret=%d\n", j, algo,
232da7f033dSHerbert Xu 					       -ret);
233da7f033dSHerbert Xu 					goto out;
234da7f033dSHerbert Xu 				}
235da7f033dSHerbert Xu 			}
236da7f033dSHerbert Xu 
237da7f033dSHerbert Xu 			ahash_request_set_crypt(req, sg, result,
238da7f033dSHerbert Xu 						template[i].psize);
239da7f033dSHerbert Xu 			ret = crypto_ahash_digest(req);
240da7f033dSHerbert Xu 			switch (ret) {
241da7f033dSHerbert Xu 			case 0:
242da7f033dSHerbert Xu 				break;
243da7f033dSHerbert Xu 			case -EINPROGRESS:
244da7f033dSHerbert Xu 			case -EBUSY:
245da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
246da7f033dSHerbert Xu 					&tresult.completion);
247da7f033dSHerbert Xu 				if (!ret && !(ret = tresult.err)) {
248da7f033dSHerbert Xu 					INIT_COMPLETION(tresult.completion);
249da7f033dSHerbert Xu 					break;
250da7f033dSHerbert Xu 				}
251da7f033dSHerbert Xu 				/* fall through */
252da7f033dSHerbert Xu 			default:
253da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: digest failed "
254da7f033dSHerbert Xu 				       "on chunking test %d for %s: "
255da7f033dSHerbert Xu 				       "ret=%d\n", j, algo, -ret);
256da7f033dSHerbert Xu 				goto out;
257da7f033dSHerbert Xu 			}
258da7f033dSHerbert Xu 
259da7f033dSHerbert Xu 			if (memcmp(result, template[i].digest,
260da7f033dSHerbert Xu 				   crypto_ahash_digestsize(tfm))) {
261da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: Chunking test %d "
262da7f033dSHerbert Xu 				       "failed for %s\n", j, algo);
263da7f033dSHerbert Xu 				hexdump(result, crypto_ahash_digestsize(tfm));
264da7f033dSHerbert Xu 				ret = -EINVAL;
265da7f033dSHerbert Xu 				goto out;
266da7f033dSHerbert Xu 			}
267da7f033dSHerbert Xu 		}
268da7f033dSHerbert Xu 	}
269da7f033dSHerbert Xu 
270da7f033dSHerbert Xu 	ret = 0;
271da7f033dSHerbert Xu 
272da7f033dSHerbert Xu out:
273da7f033dSHerbert Xu 	ahash_request_free(req);
274da7f033dSHerbert Xu out_noreq:
275da7f033dSHerbert Xu 	return ret;
276da7f033dSHerbert Xu }
277da7f033dSHerbert Xu 
278da7f033dSHerbert Xu static int test_aead(struct crypto_aead *tfm, int enc,
279da7f033dSHerbert Xu 		     struct aead_testvec *template, unsigned int tcount)
280da7f033dSHerbert Xu {
281da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
282da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
283da7f033dSHerbert Xu 	int ret = 0;
284da7f033dSHerbert Xu 	char *q;
285da7f033dSHerbert Xu 	char *key;
286da7f033dSHerbert Xu 	struct aead_request *req;
287da7f033dSHerbert Xu 	struct scatterlist sg[8];
288da7f033dSHerbert Xu 	struct scatterlist asg[8];
289da7f033dSHerbert Xu 	const char *e;
290da7f033dSHerbert Xu 	struct tcrypt_result result;
291da7f033dSHerbert Xu 	unsigned int authsize;
292da7f033dSHerbert Xu 	void *input;
293da7f033dSHerbert Xu 	void *assoc;
294da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
295da7f033dSHerbert Xu 
296da7f033dSHerbert Xu 	if (enc == ENCRYPT)
297da7f033dSHerbert Xu 		e = "encryption";
298da7f033dSHerbert Xu 	else
299da7f033dSHerbert Xu 		e = "decryption";
300da7f033dSHerbert Xu 
301da7f033dSHerbert Xu 	init_completion(&result.completion);
302da7f033dSHerbert Xu 
303da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
304da7f033dSHerbert Xu 	if (!req) {
305da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to allocate request for "
306da7f033dSHerbert Xu 		       "%s\n", algo);
307da7f033dSHerbert Xu 		ret = -ENOMEM;
308da7f033dSHerbert Xu 		goto out;
309da7f033dSHerbert Xu 	}
310da7f033dSHerbert Xu 
311da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
312da7f033dSHerbert Xu 				  tcrypt_complete, &result);
313da7f033dSHerbert Xu 
314da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
315da7f033dSHerbert Xu 		if (!template[i].np) {
316da7f033dSHerbert Xu 			j++;
317da7f033dSHerbert Xu 
318da7f033dSHerbert Xu 			/* some tepmplates have no input data but they will
319da7f033dSHerbert Xu 			 * touch input
320da7f033dSHerbert Xu 			 */
321da7f033dSHerbert Xu 			input = xbuf[0];
322da7f033dSHerbert Xu 			assoc = axbuf[0];
323da7f033dSHerbert Xu 
324da7f033dSHerbert Xu 			memcpy(input, template[i].input, template[i].ilen);
325da7f033dSHerbert Xu 			memcpy(assoc, template[i].assoc, template[i].alen);
326da7f033dSHerbert Xu 			if (template[i].iv)
327da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
328da7f033dSHerbert Xu 			else
329da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
330da7f033dSHerbert Xu 
331da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
332da7f033dSHerbert Xu 			if (template[i].wk)
333da7f033dSHerbert Xu 				crypto_aead_set_flags(
334da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
335da7f033dSHerbert Xu 
336da7f033dSHerbert Xu 			key = template[i].key;
337da7f033dSHerbert Xu 
338da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key,
339da7f033dSHerbert Xu 						 template[i].klen);
340da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
341da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: setkey failed on "
342da7f033dSHerbert Xu 				       "test %d for %s: flags=%x\n", j, algo,
343da7f033dSHerbert Xu 				       crypto_aead_get_flags(tfm));
344da7f033dSHerbert Xu 				goto out;
345da7f033dSHerbert Xu 			} else if (ret)
346da7f033dSHerbert Xu 				continue;
347da7f033dSHerbert Xu 
348da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
349da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
350da7f033dSHerbert Xu 			if (ret) {
351da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: Failed to set "
352da7f033dSHerbert Xu 				       "authsize to %u on test %d for %s\n",
353da7f033dSHerbert Xu 				       authsize, j, algo);
354da7f033dSHerbert Xu 				goto out;
355da7f033dSHerbert Xu 			}
356da7f033dSHerbert Xu 
357da7f033dSHerbert Xu 			sg_init_one(&sg[0], input,
358da7f033dSHerbert Xu 				    template[i].ilen + (enc ? authsize : 0));
359da7f033dSHerbert Xu 
360da7f033dSHerbert Xu 			sg_init_one(&asg[0], assoc, template[i].alen);
361da7f033dSHerbert Xu 
362da7f033dSHerbert Xu 			aead_request_set_crypt(req, sg, sg,
363da7f033dSHerbert Xu 					       template[i].ilen, iv);
364da7f033dSHerbert Xu 
365da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
366da7f033dSHerbert Xu 
367da7f033dSHerbert Xu 			ret = enc ?
368da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
369da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
370da7f033dSHerbert Xu 
371da7f033dSHerbert Xu 			switch (ret) {
372da7f033dSHerbert Xu 			case 0:
373e44a1b44SJarod Wilson 				if (template[i].novrfy) {
374e44a1b44SJarod Wilson 					/* verification was supposed to fail */
375e44a1b44SJarod Wilson 					printk(KERN_ERR "alg: aead: %s failed "
376e44a1b44SJarod Wilson 					       "on test %d for %s: ret was 0, "
377e44a1b44SJarod Wilson 					       "expected -EBADMSG\n",
378e44a1b44SJarod Wilson 					       e, j, algo);
379e44a1b44SJarod Wilson 					/* so really, we got a bad message */
380e44a1b44SJarod Wilson 					ret = -EBADMSG;
381e44a1b44SJarod Wilson 					goto out;
382e44a1b44SJarod Wilson 				}
383da7f033dSHerbert Xu 				break;
384da7f033dSHerbert Xu 			case -EINPROGRESS:
385da7f033dSHerbert Xu 			case -EBUSY:
386da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
387da7f033dSHerbert Xu 					&result.completion);
388da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
389da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
390da7f033dSHerbert Xu 					break;
391da7f033dSHerbert Xu 				}
392e44a1b44SJarod Wilson 			case -EBADMSG:
393e44a1b44SJarod Wilson 				if (template[i].novrfy)
394e44a1b44SJarod Wilson 					/* verification failure was expected */
395e44a1b44SJarod Wilson 					continue;
396da7f033dSHerbert Xu 				/* fall through */
397da7f033dSHerbert Xu 			default:
398da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: %s failed on test "
399da7f033dSHerbert Xu 				       "%d for %s: ret=%d\n", e, j, algo, -ret);
400da7f033dSHerbert Xu 				goto out;
401da7f033dSHerbert Xu 			}
402da7f033dSHerbert Xu 
403da7f033dSHerbert Xu 			q = input;
404da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
405da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: Test %d failed on "
406da7f033dSHerbert Xu 				       "%s for %s\n", j, e, algo);
407da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
408da7f033dSHerbert Xu 				ret = -EINVAL;
409da7f033dSHerbert Xu 				goto out;
410da7f033dSHerbert Xu 			}
411da7f033dSHerbert Xu 		}
412da7f033dSHerbert Xu 	}
413da7f033dSHerbert Xu 
414da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
415da7f033dSHerbert Xu 		if (template[i].np) {
416da7f033dSHerbert Xu 			j++;
417da7f033dSHerbert Xu 
418da7f033dSHerbert Xu 			if (template[i].iv)
419da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
420da7f033dSHerbert Xu 			else
421da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
422da7f033dSHerbert Xu 
423da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
424da7f033dSHerbert Xu 			if (template[i].wk)
425da7f033dSHerbert Xu 				crypto_aead_set_flags(
426da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
427da7f033dSHerbert Xu 			key = template[i].key;
428da7f033dSHerbert Xu 
429da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key, template[i].klen);
430da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
431da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: setkey failed on "
432da7f033dSHerbert Xu 				       "chunk test %d for %s: flags=%x\n", j,
433da7f033dSHerbert Xu 				       algo, crypto_aead_get_flags(tfm));
434da7f033dSHerbert Xu 				goto out;
435da7f033dSHerbert Xu 			} else if (ret)
436da7f033dSHerbert Xu 				continue;
437da7f033dSHerbert Xu 
438da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
439da7f033dSHerbert Xu 
440da7f033dSHerbert Xu 			ret = -EINVAL;
441da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
442da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
443da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
444da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
445da7f033dSHerbert Xu 					goto out;
446da7f033dSHerbert Xu 
447da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
448da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
449da7f033dSHerbert Xu 
450da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
451da7f033dSHerbert Xu 				       template[i].tap[k]);
452da7f033dSHerbert Xu 
453da7f033dSHerbert Xu 				n = template[i].tap[k];
454da7f033dSHerbert Xu 				if (k == template[i].np - 1 && enc)
455da7f033dSHerbert Xu 					n += authsize;
456da7f033dSHerbert Xu 				if (offset_in_page(q) + n < PAGE_SIZE)
457da7f033dSHerbert Xu 					q[n] = 0;
458da7f033dSHerbert Xu 
459da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
460da7f033dSHerbert Xu 				temp += template[i].tap[k];
461da7f033dSHerbert Xu 			}
462da7f033dSHerbert Xu 
463da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
464da7f033dSHerbert Xu 			if (ret) {
465da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: Failed to set "
466da7f033dSHerbert Xu 				       "authsize to %u on chunk test %d for "
467da7f033dSHerbert Xu 				       "%s\n", authsize, j, algo);
468da7f033dSHerbert Xu 				goto out;
469da7f033dSHerbert Xu 			}
470da7f033dSHerbert Xu 
471da7f033dSHerbert Xu 			if (enc) {
472da7f033dSHerbert Xu 				if (WARN_ON(sg[k - 1].offset +
473da7f033dSHerbert Xu 					    sg[k - 1].length + authsize >
474da7f033dSHerbert Xu 					    PAGE_SIZE)) {
475da7f033dSHerbert Xu 					ret = -EINVAL;
476da7f033dSHerbert Xu 					goto out;
477da7f033dSHerbert Xu 				}
478da7f033dSHerbert Xu 
479da7f033dSHerbert Xu 				sg[k - 1].length += authsize;
480da7f033dSHerbert Xu 			}
481da7f033dSHerbert Xu 
482da7f033dSHerbert Xu 			sg_init_table(asg, template[i].anp);
483da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].anp; k++) {
484da7f033dSHerbert Xu 				sg_set_buf(&asg[k],
485da7f033dSHerbert Xu 					   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
486da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
487da7f033dSHerbert Xu 						  template[i].assoc + temp,
488da7f033dSHerbert Xu 						  template[i].atap[k]),
489da7f033dSHerbert Xu 					   template[i].atap[k]);
490da7f033dSHerbert Xu 				temp += template[i].atap[k];
491da7f033dSHerbert Xu 			}
492da7f033dSHerbert Xu 
493da7f033dSHerbert Xu 			aead_request_set_crypt(req, sg, sg,
494da7f033dSHerbert Xu 					       template[i].ilen,
495da7f033dSHerbert Xu 					       iv);
496da7f033dSHerbert Xu 
497da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
498da7f033dSHerbert Xu 
499da7f033dSHerbert Xu 			ret = enc ?
500da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
501da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
502da7f033dSHerbert Xu 
503da7f033dSHerbert Xu 			switch (ret) {
504da7f033dSHerbert Xu 			case 0:
505e44a1b44SJarod Wilson 				if (template[i].novrfy) {
506e44a1b44SJarod Wilson 					/* verification was supposed to fail */
507e44a1b44SJarod Wilson 					printk(KERN_ERR "alg: aead: %s failed "
508e44a1b44SJarod Wilson 					       "on chunk test %d for %s: ret "
509e44a1b44SJarod Wilson 					       "was 0, expected -EBADMSG\n",
510e44a1b44SJarod Wilson 					       e, j, algo);
511e44a1b44SJarod Wilson 					/* so really, we got a bad message */
512e44a1b44SJarod Wilson 					ret = -EBADMSG;
513e44a1b44SJarod Wilson 					goto out;
514e44a1b44SJarod Wilson 				}
515da7f033dSHerbert Xu 				break;
516da7f033dSHerbert Xu 			case -EINPROGRESS:
517da7f033dSHerbert Xu 			case -EBUSY:
518da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
519da7f033dSHerbert Xu 					&result.completion);
520da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
521da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
522da7f033dSHerbert Xu 					break;
523da7f033dSHerbert Xu 				}
524e44a1b44SJarod Wilson 			case -EBADMSG:
525e44a1b44SJarod Wilson 				if (template[i].novrfy)
526e44a1b44SJarod Wilson 					/* verification failure was expected */
527e44a1b44SJarod Wilson 					continue;
528da7f033dSHerbert Xu 				/* fall through */
529da7f033dSHerbert Xu 			default:
530da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: %s failed on "
531da7f033dSHerbert Xu 				       "chunk test %d for %s: ret=%d\n", e, j,
532da7f033dSHerbert Xu 				       algo, -ret);
533da7f033dSHerbert Xu 				goto out;
534da7f033dSHerbert Xu 			}
535da7f033dSHerbert Xu 
536da7f033dSHerbert Xu 			ret = -EINVAL;
537da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
538da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
539da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
540da7f033dSHerbert Xu 
541da7f033dSHerbert Xu 				n = template[i].tap[k];
542da7f033dSHerbert Xu 				if (k == template[i].np - 1)
543da7f033dSHerbert Xu 					n += enc ? authsize : -authsize;
544da7f033dSHerbert Xu 
545da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp, n)) {
546da7f033dSHerbert Xu 					printk(KERN_ERR "alg: aead: Chunk "
547da7f033dSHerbert Xu 					       "test %d failed on %s at page "
548da7f033dSHerbert Xu 					       "%u for %s\n", j, e, k, algo);
549da7f033dSHerbert Xu 					hexdump(q, n);
550da7f033dSHerbert Xu 					goto out;
551da7f033dSHerbert Xu 				}
552da7f033dSHerbert Xu 
553da7f033dSHerbert Xu 				q += n;
554da7f033dSHerbert Xu 				if (k == template[i].np - 1 && !enc) {
555da7f033dSHerbert Xu 					if (memcmp(q, template[i].input +
556da7f033dSHerbert Xu 						      temp + n, authsize))
557da7f033dSHerbert Xu 						n = authsize;
558da7f033dSHerbert Xu 					else
559da7f033dSHerbert Xu 						n = 0;
560da7f033dSHerbert Xu 				} else {
561da7f033dSHerbert Xu 					for (n = 0; offset_in_page(q + n) &&
562da7f033dSHerbert Xu 						    q[n]; n++)
563da7f033dSHerbert Xu 						;
564da7f033dSHerbert Xu 				}
565da7f033dSHerbert Xu 				if (n) {
566da7f033dSHerbert Xu 					printk(KERN_ERR "alg: aead: Result "
567da7f033dSHerbert Xu 					       "buffer corruption in chunk "
568da7f033dSHerbert Xu 					       "test %d on %s at page %u for "
569da7f033dSHerbert Xu 					       "%s: %u bytes:\n", j, e, k,
570da7f033dSHerbert Xu 					       algo, n);
571da7f033dSHerbert Xu 					hexdump(q, n);
572da7f033dSHerbert Xu 					goto out;
573da7f033dSHerbert Xu 				}
574da7f033dSHerbert Xu 
575da7f033dSHerbert Xu 				temp += template[i].tap[k];
576da7f033dSHerbert Xu 			}
577da7f033dSHerbert Xu 		}
578da7f033dSHerbert Xu 	}
579da7f033dSHerbert Xu 
580da7f033dSHerbert Xu 	ret = 0;
581da7f033dSHerbert Xu 
582da7f033dSHerbert Xu out:
583da7f033dSHerbert Xu 	aead_request_free(req);
584da7f033dSHerbert Xu 	return ret;
585da7f033dSHerbert Xu }
586da7f033dSHerbert Xu 
5871aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
5881aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
5891aa4ecd9SHerbert Xu {
5901aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
5911aa4ecd9SHerbert Xu 	unsigned int i, j, k;
5921aa4ecd9SHerbert Xu 	int ret;
5931aa4ecd9SHerbert Xu 	char *q;
5941aa4ecd9SHerbert Xu 	const char *e;
5951aa4ecd9SHerbert Xu 	void *data;
5961aa4ecd9SHerbert Xu 
5971aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
5981aa4ecd9SHerbert Xu 	        e = "encryption";
5991aa4ecd9SHerbert Xu 	else
6001aa4ecd9SHerbert Xu 		e = "decryption";
6011aa4ecd9SHerbert Xu 
6021aa4ecd9SHerbert Xu 	j = 0;
6031aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
6041aa4ecd9SHerbert Xu 		if (template[i].np)
6051aa4ecd9SHerbert Xu 			continue;
6061aa4ecd9SHerbert Xu 
6071aa4ecd9SHerbert Xu 		j++;
6081aa4ecd9SHerbert Xu 
6091aa4ecd9SHerbert Xu 		data = xbuf[0];
6101aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
6111aa4ecd9SHerbert Xu 
6121aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
6131aa4ecd9SHerbert Xu 		if (template[i].wk)
6141aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
6151aa4ecd9SHerbert Xu 
6161aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
6171aa4ecd9SHerbert Xu 					   template[i].klen);
6181aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
6191aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
6201aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
6211aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
6221aa4ecd9SHerbert Xu 			goto out;
6231aa4ecd9SHerbert Xu 		} else if (ret)
6241aa4ecd9SHerbert Xu 			continue;
6251aa4ecd9SHerbert Xu 
6261aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
6271aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
6281aa4ecd9SHerbert Xu 			if (enc)
6291aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
6301aa4ecd9SHerbert Xu 							  data + k);
6311aa4ecd9SHerbert Xu 			else
6321aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
6331aa4ecd9SHerbert Xu 							  data + k);
6341aa4ecd9SHerbert Xu 		}
6351aa4ecd9SHerbert Xu 
6361aa4ecd9SHerbert Xu 		q = data;
6371aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
6381aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
6391aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
6401aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
6411aa4ecd9SHerbert Xu 			ret = -EINVAL;
6421aa4ecd9SHerbert Xu 			goto out;
6431aa4ecd9SHerbert Xu 		}
6441aa4ecd9SHerbert Xu 	}
6451aa4ecd9SHerbert Xu 
6461aa4ecd9SHerbert Xu 	ret = 0;
6471aa4ecd9SHerbert Xu 
6481aa4ecd9SHerbert Xu out:
6491aa4ecd9SHerbert Xu 	return ret;
6501aa4ecd9SHerbert Xu }
6511aa4ecd9SHerbert Xu 
6521aa4ecd9SHerbert Xu static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
653da7f033dSHerbert Xu 			 struct cipher_testvec *template, unsigned int tcount)
654da7f033dSHerbert Xu {
655da7f033dSHerbert Xu 	const char *algo =
656da7f033dSHerbert Xu 		crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
657da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
658da7f033dSHerbert Xu 	int ret;
659da7f033dSHerbert Xu 	char *q;
660da7f033dSHerbert Xu 	struct ablkcipher_request *req;
661da7f033dSHerbert Xu 	struct scatterlist sg[8];
662da7f033dSHerbert Xu 	const char *e;
663da7f033dSHerbert Xu 	struct tcrypt_result result;
664da7f033dSHerbert Xu 	void *data;
665da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
666da7f033dSHerbert Xu 
667da7f033dSHerbert Xu 	if (enc == ENCRYPT)
668da7f033dSHerbert Xu 	        e = "encryption";
669da7f033dSHerbert Xu 	else
670da7f033dSHerbert Xu 		e = "decryption";
671da7f033dSHerbert Xu 
672da7f033dSHerbert Xu 	init_completion(&result.completion);
673da7f033dSHerbert Xu 
674da7f033dSHerbert Xu 	req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
675da7f033dSHerbert Xu 	if (!req) {
6761aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to allocate request "
6771aa4ecd9SHerbert Xu 		       "for %s\n", algo);
678da7f033dSHerbert Xu 		ret = -ENOMEM;
679da7f033dSHerbert Xu 		goto out;
680da7f033dSHerbert Xu 	}
681da7f033dSHerbert Xu 
682da7f033dSHerbert Xu 	ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
683da7f033dSHerbert Xu 					tcrypt_complete, &result);
684da7f033dSHerbert Xu 
685da7f033dSHerbert Xu 	j = 0;
686da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
687da7f033dSHerbert Xu 		if (template[i].iv)
688da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
689da7f033dSHerbert Xu 		else
690da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
691da7f033dSHerbert Xu 
692da7f033dSHerbert Xu 		if (!(template[i].np)) {
693da7f033dSHerbert Xu 			j++;
694da7f033dSHerbert Xu 
695da7f033dSHerbert Xu 			data = xbuf[0];
696da7f033dSHerbert Xu 			memcpy(data, template[i].input, template[i].ilen);
697da7f033dSHerbert Xu 
698da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
699da7f033dSHerbert Xu 			if (template[i].wk)
700da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
701da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
702da7f033dSHerbert Xu 
703da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
704da7f033dSHerbert Xu 						       template[i].klen);
705da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
7061aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: setkey failed "
707da7f033dSHerbert Xu 				       "on test %d for %s: flags=%x\n", j,
708da7f033dSHerbert Xu 				       algo, crypto_ablkcipher_get_flags(tfm));
709da7f033dSHerbert Xu 				goto out;
710da7f033dSHerbert Xu 			} else if (ret)
711da7f033dSHerbert Xu 				continue;
712da7f033dSHerbert Xu 
713da7f033dSHerbert Xu 			sg_init_one(&sg[0], data, template[i].ilen);
714da7f033dSHerbert Xu 
715da7f033dSHerbert Xu 			ablkcipher_request_set_crypt(req, sg, sg,
716da7f033dSHerbert Xu 						     template[i].ilen, iv);
717da7f033dSHerbert Xu 			ret = enc ?
718da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
719da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
720da7f033dSHerbert Xu 
721da7f033dSHerbert Xu 			switch (ret) {
722da7f033dSHerbert Xu 			case 0:
723da7f033dSHerbert Xu 				break;
724da7f033dSHerbert Xu 			case -EINPROGRESS:
725da7f033dSHerbert Xu 			case -EBUSY:
726da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
727da7f033dSHerbert Xu 					&result.completion);
728da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
729da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
730da7f033dSHerbert Xu 					break;
731da7f033dSHerbert Xu 				}
732da7f033dSHerbert Xu 				/* fall through */
733da7f033dSHerbert Xu 			default:
7341aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: %s failed on "
735da7f033dSHerbert Xu 				       "test %d for %s: ret=%d\n", e, j, algo,
736da7f033dSHerbert Xu 				       -ret);
737da7f033dSHerbert Xu 				goto out;
738da7f033dSHerbert Xu 			}
739da7f033dSHerbert Xu 
740da7f033dSHerbert Xu 			q = data;
741da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
7421aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: Test %d "
7431aa4ecd9SHerbert Xu 				       "failed on %s for %s\n", j, e, algo);
744da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
745da7f033dSHerbert Xu 				ret = -EINVAL;
746da7f033dSHerbert Xu 				goto out;
747da7f033dSHerbert Xu 			}
748da7f033dSHerbert Xu 		}
749da7f033dSHerbert Xu 	}
750da7f033dSHerbert Xu 
751da7f033dSHerbert Xu 	j = 0;
752da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
753da7f033dSHerbert Xu 
754da7f033dSHerbert Xu 		if (template[i].iv)
755da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
756da7f033dSHerbert Xu 		else
757da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
758da7f033dSHerbert Xu 
759da7f033dSHerbert Xu 		if (template[i].np) {
760da7f033dSHerbert Xu 			j++;
761da7f033dSHerbert Xu 
762da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
763da7f033dSHerbert Xu 			if (template[i].wk)
764da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
765da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
766da7f033dSHerbert Xu 
767da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
768da7f033dSHerbert Xu 						       template[i].klen);
769da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
7701aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: setkey failed "
771da7f033dSHerbert Xu 				       "on chunk test %d for %s: flags=%x\n",
772da7f033dSHerbert Xu 				       j, algo,
773da7f033dSHerbert Xu 				       crypto_ablkcipher_get_flags(tfm));
774da7f033dSHerbert Xu 				goto out;
775da7f033dSHerbert Xu 			} else if (ret)
776da7f033dSHerbert Xu 				continue;
777da7f033dSHerbert Xu 
778da7f033dSHerbert Xu 			temp = 0;
779da7f033dSHerbert Xu 			ret = -EINVAL;
780da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
781da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
782da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
783da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
784da7f033dSHerbert Xu 					goto out;
785da7f033dSHerbert Xu 
786da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
787da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
788da7f033dSHerbert Xu 
789da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
790da7f033dSHerbert Xu 				       template[i].tap[k]);
791da7f033dSHerbert Xu 
792da7f033dSHerbert Xu 				if (offset_in_page(q) + template[i].tap[k] <
793da7f033dSHerbert Xu 				    PAGE_SIZE)
794da7f033dSHerbert Xu 					q[template[i].tap[k]] = 0;
795da7f033dSHerbert Xu 
796da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
797da7f033dSHerbert Xu 
798da7f033dSHerbert Xu 				temp += template[i].tap[k];
799da7f033dSHerbert Xu 			}
800da7f033dSHerbert Xu 
801da7f033dSHerbert Xu 			ablkcipher_request_set_crypt(req, sg, sg,
802da7f033dSHerbert Xu 					template[i].ilen, iv);
803da7f033dSHerbert Xu 
804da7f033dSHerbert Xu 			ret = enc ?
805da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
806da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
807da7f033dSHerbert Xu 
808da7f033dSHerbert Xu 			switch (ret) {
809da7f033dSHerbert Xu 			case 0:
810da7f033dSHerbert Xu 				break;
811da7f033dSHerbert Xu 			case -EINPROGRESS:
812da7f033dSHerbert Xu 			case -EBUSY:
813da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
814da7f033dSHerbert Xu 					&result.completion);
815da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
816da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
817da7f033dSHerbert Xu 					break;
818da7f033dSHerbert Xu 				}
819da7f033dSHerbert Xu 				/* fall through */
820da7f033dSHerbert Xu 			default:
8211aa4ecd9SHerbert Xu 				printk(KERN_ERR "alg: skcipher: %s failed on "
822da7f033dSHerbert Xu 				       "chunk test %d for %s: ret=%d\n", e, j,
823da7f033dSHerbert Xu 				       algo, -ret);
824da7f033dSHerbert Xu 				goto out;
825da7f033dSHerbert Xu 			}
826da7f033dSHerbert Xu 
827da7f033dSHerbert Xu 			temp = 0;
828da7f033dSHerbert Xu 			ret = -EINVAL;
829da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
830da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
831da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
832da7f033dSHerbert Xu 
833da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp,
834da7f033dSHerbert Xu 					   template[i].tap[k])) {
8351aa4ecd9SHerbert Xu 					printk(KERN_ERR "alg: skcipher: Chunk "
836da7f033dSHerbert Xu 					       "test %d failed on %s at page "
837da7f033dSHerbert Xu 					       "%u for %s\n", j, e, k, algo);
838da7f033dSHerbert Xu 					hexdump(q, template[i].tap[k]);
839da7f033dSHerbert Xu 					goto out;
840da7f033dSHerbert Xu 				}
841da7f033dSHerbert Xu 
842da7f033dSHerbert Xu 				q += template[i].tap[k];
843da7f033dSHerbert Xu 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
844da7f033dSHerbert Xu 					;
845da7f033dSHerbert Xu 				if (n) {
8461aa4ecd9SHerbert Xu 					printk(KERN_ERR "alg: skcipher: "
847da7f033dSHerbert Xu 					       "Result buffer corruption in "
848da7f033dSHerbert Xu 					       "chunk test %d on %s at page "
849da7f033dSHerbert Xu 					       "%u for %s: %u bytes:\n", j, e,
850da7f033dSHerbert Xu 					       k, algo, n);
851da7f033dSHerbert Xu 					hexdump(q, n);
852da7f033dSHerbert Xu 					goto out;
853da7f033dSHerbert Xu 				}
854da7f033dSHerbert Xu 				temp += template[i].tap[k];
855da7f033dSHerbert Xu 			}
856da7f033dSHerbert Xu 		}
857da7f033dSHerbert Xu 	}
858da7f033dSHerbert Xu 
859da7f033dSHerbert Xu 	ret = 0;
860da7f033dSHerbert Xu 
861da7f033dSHerbert Xu out:
862da7f033dSHerbert Xu 	ablkcipher_request_free(req);
863da7f033dSHerbert Xu 	return ret;
864da7f033dSHerbert Xu }
865da7f033dSHerbert Xu 
866da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
867da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
868da7f033dSHerbert Xu {
869da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
870da7f033dSHerbert Xu 	unsigned int i;
871da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
872da7f033dSHerbert Xu 	int ret;
873da7f033dSHerbert Xu 
874da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
875c79cf910SGeert Uytterhoeven 		int ilen;
876c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
877da7f033dSHerbert Xu 
878da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
879da7f033dSHerbert Xu 
880da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
881da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
882da7f033dSHerbert Xu 		                           ilen, result, &dlen);
883da7f033dSHerbert Xu 		if (ret) {
884da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
885da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
886da7f033dSHerbert Xu 			       -ret);
887da7f033dSHerbert Xu 			goto out;
888da7f033dSHerbert Xu 		}
889da7f033dSHerbert Xu 
890b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
891b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
892b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
893b812eb00SGeert Uytterhoeven 			       dlen);
894b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
895b812eb00SGeert Uytterhoeven 			goto out;
896b812eb00SGeert Uytterhoeven 		}
897b812eb00SGeert Uytterhoeven 
898da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
899da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
900da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
901da7f033dSHerbert Xu 			hexdump(result, dlen);
902da7f033dSHerbert Xu 			ret = -EINVAL;
903da7f033dSHerbert Xu 			goto out;
904da7f033dSHerbert Xu 		}
905da7f033dSHerbert Xu 	}
906da7f033dSHerbert Xu 
907da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
908c79cf910SGeert Uytterhoeven 		int ilen;
909c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
910da7f033dSHerbert Xu 
911da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
912da7f033dSHerbert Xu 
913da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
914da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
915da7f033dSHerbert Xu 		                             ilen, result, &dlen);
916da7f033dSHerbert Xu 		if (ret) {
917da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
918da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
919da7f033dSHerbert Xu 			       -ret);
920da7f033dSHerbert Xu 			goto out;
921da7f033dSHerbert Xu 		}
922da7f033dSHerbert Xu 
923b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
924b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
925b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
926b812eb00SGeert Uytterhoeven 			       dlen);
927b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
928b812eb00SGeert Uytterhoeven 			goto out;
929b812eb00SGeert Uytterhoeven 		}
930b812eb00SGeert Uytterhoeven 
931da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
932da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
933da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
934da7f033dSHerbert Xu 			hexdump(result, dlen);
935da7f033dSHerbert Xu 			ret = -EINVAL;
936da7f033dSHerbert Xu 			goto out;
937da7f033dSHerbert Xu 		}
938da7f033dSHerbert Xu 	}
939da7f033dSHerbert Xu 
940da7f033dSHerbert Xu 	ret = 0;
941da7f033dSHerbert Xu 
942da7f033dSHerbert Xu out:
943da7f033dSHerbert Xu 	return ret;
944da7f033dSHerbert Xu }
945da7f033dSHerbert Xu 
9468064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm,
9478064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *ctemplate,
9488064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *dtemplate, int ctcount,
9498064efb8SGeert Uytterhoeven 		      int dtcount)
9508064efb8SGeert Uytterhoeven {
9518064efb8SGeert Uytterhoeven 	const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
9528064efb8SGeert Uytterhoeven 	unsigned int i;
9538064efb8SGeert Uytterhoeven 	char result[COMP_BUF_SIZE];
9548064efb8SGeert Uytterhoeven 	int error;
9558064efb8SGeert Uytterhoeven 
9568064efb8SGeert Uytterhoeven 	for (i = 0; i < ctcount; i++) {
9578064efb8SGeert Uytterhoeven 		struct comp_request req;
9588064efb8SGeert Uytterhoeven 
9598064efb8SGeert Uytterhoeven 		error = crypto_compress_setup(tfm, ctemplate[i].params,
9608064efb8SGeert Uytterhoeven 					      ctemplate[i].paramsize);
9618064efb8SGeert Uytterhoeven 		if (error) {
9628064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression setup failed on test "
9638064efb8SGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, error);
9648064efb8SGeert Uytterhoeven 			return error;
9658064efb8SGeert Uytterhoeven 		}
9668064efb8SGeert Uytterhoeven 
9678064efb8SGeert Uytterhoeven 		error = crypto_compress_init(tfm);
9688064efb8SGeert Uytterhoeven 		if (error) {
9698064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression init failed on test "
9708064efb8SGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, error);
9718064efb8SGeert Uytterhoeven 			return error;
9728064efb8SGeert Uytterhoeven 		}
9738064efb8SGeert Uytterhoeven 
9748064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
9758064efb8SGeert Uytterhoeven 
9768064efb8SGeert Uytterhoeven 		req.next_in = ctemplate[i].input;
9778064efb8SGeert Uytterhoeven 		req.avail_in = ctemplate[i].inlen / 2;
9788064efb8SGeert Uytterhoeven 		req.next_out = result;
9798064efb8SGeert Uytterhoeven 		req.avail_out = ctemplate[i].outlen / 2;
9808064efb8SGeert Uytterhoeven 
9818064efb8SGeert Uytterhoeven 		error = crypto_compress_update(tfm, &req);
9828064efb8SGeert Uytterhoeven 		if (error && (error != -EAGAIN || req.avail_in)) {
9838064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
9848064efb8SGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, error);
9858064efb8SGeert Uytterhoeven 			return error;
9868064efb8SGeert Uytterhoeven 		}
9878064efb8SGeert Uytterhoeven 
9888064efb8SGeert Uytterhoeven 		/* Add remaining input data */
9898064efb8SGeert Uytterhoeven 		req.avail_in += (ctemplate[i].inlen + 1) / 2;
9908064efb8SGeert Uytterhoeven 
9918064efb8SGeert Uytterhoeven 		error = crypto_compress_update(tfm, &req);
9928064efb8SGeert Uytterhoeven 		if (error && (error != -EAGAIN || req.avail_in)) {
9938064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
9948064efb8SGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, error);
9958064efb8SGeert Uytterhoeven 			return error;
9968064efb8SGeert Uytterhoeven 		}
9978064efb8SGeert Uytterhoeven 
9988064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
9998064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
10008064efb8SGeert Uytterhoeven 
10018064efb8SGeert Uytterhoeven 		error = crypto_compress_final(tfm, &req);
10028064efb8SGeert Uytterhoeven 		if (error) {
10038064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression final failed on test "
10048064efb8SGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, error);
10058064efb8SGeert Uytterhoeven 			return error;
10068064efb8SGeert Uytterhoeven 		}
10078064efb8SGeert Uytterhoeven 
10088064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
10098064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
10108064efb8SGeert Uytterhoeven 			       "output len = %d (expected %d)\n", i + 1, algo,
10118064efb8SGeert Uytterhoeven 			       COMP_BUF_SIZE - req.avail_out,
10128064efb8SGeert Uytterhoeven 			       ctemplate[i].outlen);
10138064efb8SGeert Uytterhoeven 			return -EINVAL;
10148064efb8SGeert Uytterhoeven 		}
10158064efb8SGeert Uytterhoeven 
10168064efb8SGeert Uytterhoeven 		if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
10178064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Compression test %d failed for "
10188064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
10198064efb8SGeert Uytterhoeven 			hexdump(result, ctemplate[i].outlen);
10208064efb8SGeert Uytterhoeven 			return -EINVAL;
10218064efb8SGeert Uytterhoeven 		}
10228064efb8SGeert Uytterhoeven 	}
10238064efb8SGeert Uytterhoeven 
10248064efb8SGeert Uytterhoeven 	for (i = 0; i < dtcount; i++) {
10258064efb8SGeert Uytterhoeven 		struct comp_request req;
10268064efb8SGeert Uytterhoeven 
10278064efb8SGeert Uytterhoeven 		error = crypto_decompress_setup(tfm, dtemplate[i].params,
10288064efb8SGeert Uytterhoeven 						dtemplate[i].paramsize);
10298064efb8SGeert Uytterhoeven 		if (error) {
10308064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression setup failed on "
10318064efb8SGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo,
10328064efb8SGeert Uytterhoeven 			       error);
10338064efb8SGeert Uytterhoeven 			return error;
10348064efb8SGeert Uytterhoeven 		}
10358064efb8SGeert Uytterhoeven 
10368064efb8SGeert Uytterhoeven 		error = crypto_decompress_init(tfm);
10378064efb8SGeert Uytterhoeven 		if (error) {
10388064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression init failed on test "
10398064efb8SGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, error);
10408064efb8SGeert Uytterhoeven 			return error;
10418064efb8SGeert Uytterhoeven 		}
10428064efb8SGeert Uytterhoeven 
10438064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
10448064efb8SGeert Uytterhoeven 
10458064efb8SGeert Uytterhoeven 		req.next_in = dtemplate[i].input;
10468064efb8SGeert Uytterhoeven 		req.avail_in = dtemplate[i].inlen / 2;
10478064efb8SGeert Uytterhoeven 		req.next_out = result;
10488064efb8SGeert Uytterhoeven 		req.avail_out = dtemplate[i].outlen / 2;
10498064efb8SGeert Uytterhoeven 
10508064efb8SGeert Uytterhoeven 		error = crypto_decompress_update(tfm, &req);
10518064efb8SGeert Uytterhoeven 		if (error  && (error != -EAGAIN || req.avail_in)) {
10528064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
10538064efb8SGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo,
10548064efb8SGeert Uytterhoeven 			       error);
10558064efb8SGeert Uytterhoeven 			return error;
10568064efb8SGeert Uytterhoeven 		}
10578064efb8SGeert Uytterhoeven 
10588064efb8SGeert Uytterhoeven 		/* Add remaining input data */
10598064efb8SGeert Uytterhoeven 		req.avail_in += (dtemplate[i].inlen + 1) / 2;
10608064efb8SGeert Uytterhoeven 
10618064efb8SGeert Uytterhoeven 		error = crypto_decompress_update(tfm, &req);
10628064efb8SGeert Uytterhoeven 		if (error  && (error != -EAGAIN || req.avail_in)) {
10638064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
10648064efb8SGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo,
10658064efb8SGeert Uytterhoeven 			       error);
10668064efb8SGeert Uytterhoeven 			return error;
10678064efb8SGeert Uytterhoeven 		}
10688064efb8SGeert Uytterhoeven 
10698064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
10708064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
10718064efb8SGeert Uytterhoeven 
10728064efb8SGeert Uytterhoeven 		error = crypto_decompress_final(tfm, &req);
10738064efb8SGeert Uytterhoeven 		if (error  && (error != -EAGAIN || req.avail_in)) {
10748064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression final failed on "
10758064efb8SGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo,
10768064efb8SGeert Uytterhoeven 			       error);
10778064efb8SGeert Uytterhoeven 			return error;
10788064efb8SGeert Uytterhoeven 		}
10798064efb8SGeert Uytterhoeven 
10808064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
10818064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
10828064efb8SGeert Uytterhoeven 			       "%s: output len = %d (expected %d)\n", i + 1,
10838064efb8SGeert Uytterhoeven 			       algo, COMP_BUF_SIZE - req.avail_out,
10848064efb8SGeert Uytterhoeven 			       dtemplate[i].outlen);
10858064efb8SGeert Uytterhoeven 			return -EINVAL;
10868064efb8SGeert Uytterhoeven 		}
10878064efb8SGeert Uytterhoeven 
10888064efb8SGeert Uytterhoeven 		if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
10898064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Decompression test %d failed for "
10908064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
10918064efb8SGeert Uytterhoeven 			hexdump(result, dtemplate[i].outlen);
10928064efb8SGeert Uytterhoeven 			return -EINVAL;
10938064efb8SGeert Uytterhoeven 		}
10948064efb8SGeert Uytterhoeven 	}
10958064efb8SGeert Uytterhoeven 
10968064efb8SGeert Uytterhoeven 	return 0;
10978064efb8SGeert Uytterhoeven }
10988064efb8SGeert Uytterhoeven 
10997647d6ceSJarod Wilson 
11007647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
11017647d6ceSJarod Wilson 		      unsigned int tcount)
11027647d6ceSJarod Wilson {
11037647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
11047647d6ceSJarod Wilson 	int err, i, j, seedsize;
11057647d6ceSJarod Wilson 	u8 *seed;
11067647d6ceSJarod Wilson 	char result[32];
11077647d6ceSJarod Wilson 
11087647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
11097647d6ceSJarod Wilson 
11107647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
11117647d6ceSJarod Wilson 	if (!seed) {
11127647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
11137647d6ceSJarod Wilson 		       "for %s\n", algo);
11147647d6ceSJarod Wilson 		return -ENOMEM;
11157647d6ceSJarod Wilson 	}
11167647d6ceSJarod Wilson 
11177647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
11187647d6ceSJarod Wilson 		memset(result, 0, 32);
11197647d6ceSJarod Wilson 
11207647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
11217647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
11227647d6ceSJarod Wilson 		       template[i].klen);
11237647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
11247647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
11257647d6ceSJarod Wilson 
11267647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
11277647d6ceSJarod Wilson 		if (err) {
11287647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
11297647d6ceSJarod Wilson 			       "for %s\n", algo);
11307647d6ceSJarod Wilson 			goto out;
11317647d6ceSJarod Wilson 		}
11327647d6ceSJarod Wilson 
11337647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
11347647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
11357647d6ceSJarod Wilson 						   template[i].rlen);
11367647d6ceSJarod Wilson 			if (err != template[i].rlen) {
11377647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
11387647d6ceSJarod Wilson 				       "the correct amount of random data for "
11397647d6ceSJarod Wilson 				       "%s (requested %d, got %d)\n", algo,
11407647d6ceSJarod Wilson 				       template[i].rlen, err);
11417647d6ceSJarod Wilson 				goto out;
11427647d6ceSJarod Wilson 			}
11437647d6ceSJarod Wilson 		}
11447647d6ceSJarod Wilson 
11457647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
11467647d6ceSJarod Wilson 			     template[i].rlen);
11477647d6ceSJarod Wilson 		if (err) {
11487647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
11497647d6ceSJarod Wilson 			       i, algo);
11507647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
11517647d6ceSJarod Wilson 			err = -EINVAL;
11527647d6ceSJarod Wilson 			goto out;
11537647d6ceSJarod Wilson 		}
11547647d6ceSJarod Wilson 	}
11557647d6ceSJarod Wilson 
11567647d6ceSJarod Wilson out:
11577647d6ceSJarod Wilson 	kfree(seed);
11587647d6ceSJarod Wilson 	return err;
11597647d6ceSJarod Wilson }
11607647d6ceSJarod Wilson 
1161da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1162da7f033dSHerbert Xu 			 u32 type, u32 mask)
1163da7f033dSHerbert Xu {
1164da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1165da7f033dSHerbert Xu 	int err = 0;
1166da7f033dSHerbert Xu 
1167da7f033dSHerbert Xu 	tfm = crypto_alloc_aead(driver, type, mask);
1168da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1169da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1170da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1171da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1172da7f033dSHerbert Xu 	}
1173da7f033dSHerbert Xu 
1174da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1175da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1176da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1177da7f033dSHerbert Xu 		if (err)
1178da7f033dSHerbert Xu 			goto out;
1179da7f033dSHerbert Xu 	}
1180da7f033dSHerbert Xu 
1181da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1182da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1183da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1184da7f033dSHerbert Xu 
1185da7f033dSHerbert Xu out:
1186da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1187da7f033dSHerbert Xu 	return err;
1188da7f033dSHerbert Xu }
1189da7f033dSHerbert Xu 
1190da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1191da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1192da7f033dSHerbert Xu {
11931aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1194da7f033dSHerbert Xu 	int err = 0;
1195da7f033dSHerbert Xu 
11961aa4ecd9SHerbert Xu 	tfm = crypto_alloc_cipher(driver, type, mask);
1197da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1198da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1199da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1200da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1201da7f033dSHerbert Xu 	}
1202da7f033dSHerbert Xu 
1203da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1204da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1205da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1206da7f033dSHerbert Xu 		if (err)
1207da7f033dSHerbert Xu 			goto out;
1208da7f033dSHerbert Xu 	}
1209da7f033dSHerbert Xu 
1210da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1211da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1212da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1213da7f033dSHerbert Xu 
1214da7f033dSHerbert Xu out:
12151aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
12161aa4ecd9SHerbert Xu 	return err;
12171aa4ecd9SHerbert Xu }
12181aa4ecd9SHerbert Xu 
12191aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
12201aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
12211aa4ecd9SHerbert Xu {
12221aa4ecd9SHerbert Xu 	struct crypto_ablkcipher *tfm;
12231aa4ecd9SHerbert Xu 	int err = 0;
12241aa4ecd9SHerbert Xu 
12251aa4ecd9SHerbert Xu 	tfm = crypto_alloc_ablkcipher(driver, type, mask);
12261aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
12271aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
12281aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
12291aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
12301aa4ecd9SHerbert Xu 	}
12311aa4ecd9SHerbert Xu 
12321aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
12331aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
12341aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
12351aa4ecd9SHerbert Xu 		if (err)
12361aa4ecd9SHerbert Xu 			goto out;
12371aa4ecd9SHerbert Xu 	}
12381aa4ecd9SHerbert Xu 
12391aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
12401aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
12411aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
12421aa4ecd9SHerbert Xu 
12431aa4ecd9SHerbert Xu out:
1244da7f033dSHerbert Xu 	crypto_free_ablkcipher(tfm);
1245da7f033dSHerbert Xu 	return err;
1246da7f033dSHerbert Xu }
1247da7f033dSHerbert Xu 
1248da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1249da7f033dSHerbert Xu 			 u32 type, u32 mask)
1250da7f033dSHerbert Xu {
1251da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1252da7f033dSHerbert Xu 	int err;
1253da7f033dSHerbert Xu 
1254da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1255da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1256da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1257da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1258da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1259da7f033dSHerbert Xu 	}
1260da7f033dSHerbert Xu 
1261da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1262da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1263da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1264da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1265da7f033dSHerbert Xu 
1266da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1267da7f033dSHerbert Xu 	return err;
1268da7f033dSHerbert Xu }
1269da7f033dSHerbert Xu 
12708064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
12718064efb8SGeert Uytterhoeven 			  u32 type, u32 mask)
12728064efb8SGeert Uytterhoeven {
12738064efb8SGeert Uytterhoeven 	struct crypto_pcomp *tfm;
12748064efb8SGeert Uytterhoeven 	int err;
12758064efb8SGeert Uytterhoeven 
12768064efb8SGeert Uytterhoeven 	tfm = crypto_alloc_pcomp(driver, type, mask);
12778064efb8SGeert Uytterhoeven 	if (IS_ERR(tfm)) {
12788064efb8SGeert Uytterhoeven 		pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
12798064efb8SGeert Uytterhoeven 		       driver, PTR_ERR(tfm));
12808064efb8SGeert Uytterhoeven 		return PTR_ERR(tfm);
12818064efb8SGeert Uytterhoeven 	}
12828064efb8SGeert Uytterhoeven 
12838064efb8SGeert Uytterhoeven 	err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
12848064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.vecs,
12858064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.comp.count,
12868064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.count);
12878064efb8SGeert Uytterhoeven 
12888064efb8SGeert Uytterhoeven 	crypto_free_pcomp(tfm);
12898064efb8SGeert Uytterhoeven 	return err;
12908064efb8SGeert Uytterhoeven }
12918064efb8SGeert Uytterhoeven 
1292da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1293da7f033dSHerbert Xu 			 u32 type, u32 mask)
1294da7f033dSHerbert Xu {
1295da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1296da7f033dSHerbert Xu 	int err;
1297da7f033dSHerbert Xu 
1298da7f033dSHerbert Xu 	tfm = crypto_alloc_ahash(driver, type, mask);
1299da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1300da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1301da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1302da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1303da7f033dSHerbert Xu 	}
1304da7f033dSHerbert Xu 
1305da7f033dSHerbert Xu 	err = test_hash(tfm, desc->suite.hash.vecs, desc->suite.hash.count);
1306da7f033dSHerbert Xu 
1307da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1308da7f033dSHerbert Xu 	return err;
1309da7f033dSHerbert Xu }
1310da7f033dSHerbert Xu 
13118e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
13128e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
13138e3ee85eSHerbert Xu {
13148e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
13158e3ee85eSHerbert Xu 	u32 val;
13168e3ee85eSHerbert Xu 	int err;
13178e3ee85eSHerbert Xu 
13188e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
13198e3ee85eSHerbert Xu 	if (err)
13208e3ee85eSHerbert Xu 		goto out;
13218e3ee85eSHerbert Xu 
13228e3ee85eSHerbert Xu 	tfm = crypto_alloc_shash(driver, type, mask);
13238e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
13248e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
13258e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
13268e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
13278e3ee85eSHerbert Xu 		goto out;
13288e3ee85eSHerbert Xu 	}
13298e3ee85eSHerbert Xu 
13308e3ee85eSHerbert Xu 	do {
13318e3ee85eSHerbert Xu 		struct {
13328e3ee85eSHerbert Xu 			struct shash_desc shash;
13338e3ee85eSHerbert Xu 			char ctx[crypto_shash_descsize(tfm)];
13348e3ee85eSHerbert Xu 		} sdesc;
13358e3ee85eSHerbert Xu 
13368e3ee85eSHerbert Xu 		sdesc.shash.tfm = tfm;
13378e3ee85eSHerbert Xu 		sdesc.shash.flags = 0;
13388e3ee85eSHerbert Xu 
13398e3ee85eSHerbert Xu 		*(u32 *)sdesc.ctx = le32_to_cpu(420553207);
13408e3ee85eSHerbert Xu 		err = crypto_shash_final(&sdesc.shash, (u8 *)&val);
13418e3ee85eSHerbert Xu 		if (err) {
13428e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
13438e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
13448e3ee85eSHerbert Xu 			break;
13458e3ee85eSHerbert Xu 		}
13468e3ee85eSHerbert Xu 
13478e3ee85eSHerbert Xu 		if (val != ~420553207) {
13488e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
13498e3ee85eSHerbert Xu 			       "%d\n", driver, val);
13508e3ee85eSHerbert Xu 			err = -EINVAL;
13518e3ee85eSHerbert Xu 		}
13528e3ee85eSHerbert Xu 	} while (0);
13538e3ee85eSHerbert Xu 
13548e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
13558e3ee85eSHerbert Xu 
13568e3ee85eSHerbert Xu out:
13578e3ee85eSHerbert Xu 	return err;
13588e3ee85eSHerbert Xu }
13598e3ee85eSHerbert Xu 
13607647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
13617647d6ceSJarod Wilson 			  u32 type, u32 mask)
13627647d6ceSJarod Wilson {
13637647d6ceSJarod Wilson 	struct crypto_rng *rng;
13647647d6ceSJarod Wilson 	int err;
13657647d6ceSJarod Wilson 
13667647d6ceSJarod Wilson 	rng = crypto_alloc_rng(driver, type, mask);
13677647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
13687647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
13697647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
13707647d6ceSJarod Wilson 		return PTR_ERR(rng);
13717647d6ceSJarod Wilson 	}
13727647d6ceSJarod Wilson 
13737647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
13747647d6ceSJarod Wilson 
13757647d6ceSJarod Wilson 	crypto_free_rng(rng);
13767647d6ceSJarod Wilson 
13777647d6ceSJarod Wilson 	return err;
13787647d6ceSJarod Wilson }
13797647d6ceSJarod Wilson 
1380da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1381da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1382da7f033dSHerbert Xu 	{
1383e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
1384e08ca2daSJarod Wilson 		.test = alg_test_cprng,
1385e08ca2daSJarod Wilson 		.suite = {
1386e08ca2daSJarod Wilson 			.cprng = {
1387e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
1388e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
1389e08ca2daSJarod Wilson 			}
1390e08ca2daSJarod Wilson 		}
1391e08ca2daSJarod Wilson 	}, {
1392da7f033dSHerbert Xu 		.alg = "cbc(aes)",
13931aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1394da7f033dSHerbert Xu 		.suite = {
1395da7f033dSHerbert Xu 			.cipher = {
1396da7f033dSHerbert Xu 				.enc = {
1397da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
1398da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
1399da7f033dSHerbert Xu 				},
1400da7f033dSHerbert Xu 				.dec = {
1401da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
1402da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
1403da7f033dSHerbert Xu 				}
1404da7f033dSHerbert Xu 			}
1405da7f033dSHerbert Xu 		}
1406da7f033dSHerbert Xu 	}, {
1407da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
14081aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1409da7f033dSHerbert Xu 		.suite = {
1410da7f033dSHerbert Xu 			.cipher = {
1411da7f033dSHerbert Xu 				.enc = {
1412da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
1413da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
1414da7f033dSHerbert Xu 				},
1415da7f033dSHerbert Xu 				.dec = {
1416da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
1417da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
1418da7f033dSHerbert Xu 				}
1419da7f033dSHerbert Xu 			}
1420da7f033dSHerbert Xu 		}
1421da7f033dSHerbert Xu 	}, {
1422da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
14231aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1424da7f033dSHerbert Xu 		.suite = {
1425da7f033dSHerbert Xu 			.cipher = {
1426da7f033dSHerbert Xu 				.enc = {
1427da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
1428da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
1429da7f033dSHerbert Xu 				},
1430da7f033dSHerbert Xu 				.dec = {
1431da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
1432da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
1433da7f033dSHerbert Xu 				}
1434da7f033dSHerbert Xu 			}
1435da7f033dSHerbert Xu 		}
1436da7f033dSHerbert Xu 	}, {
1437da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
14381aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1439da7f033dSHerbert Xu 		.suite = {
1440da7f033dSHerbert Xu 			.cipher = {
1441da7f033dSHerbert Xu 				.enc = {
1442da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
1443da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
1444da7f033dSHerbert Xu 				},
1445da7f033dSHerbert Xu 				.dec = {
1446da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
1447da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
1448da7f033dSHerbert Xu 				}
1449da7f033dSHerbert Xu 			}
1450da7f033dSHerbert Xu 		}
1451da7f033dSHerbert Xu 	}, {
1452da7f033dSHerbert Xu 		.alg = "cbc(des)",
14531aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1454da7f033dSHerbert Xu 		.suite = {
1455da7f033dSHerbert Xu 			.cipher = {
1456da7f033dSHerbert Xu 				.enc = {
1457da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
1458da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
1459da7f033dSHerbert Xu 				},
1460da7f033dSHerbert Xu 				.dec = {
1461da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
1462da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
1463da7f033dSHerbert Xu 				}
1464da7f033dSHerbert Xu 			}
1465da7f033dSHerbert Xu 		}
1466da7f033dSHerbert Xu 	}, {
1467da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
14681aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1469da7f033dSHerbert Xu 		.suite = {
1470da7f033dSHerbert Xu 			.cipher = {
1471da7f033dSHerbert Xu 				.enc = {
1472da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
1473da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
1474da7f033dSHerbert Xu 				},
1475da7f033dSHerbert Xu 				.dec = {
1476da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
1477da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
1478da7f033dSHerbert Xu 				}
1479da7f033dSHerbert Xu 			}
1480da7f033dSHerbert Xu 		}
1481da7f033dSHerbert Xu 	}, {
1482da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
14831aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1484da7f033dSHerbert Xu 		.suite = {
1485da7f033dSHerbert Xu 			.cipher = {
1486da7f033dSHerbert Xu 				.enc = {
1487da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
1488da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
1489da7f033dSHerbert Xu 				},
1490da7f033dSHerbert Xu 				.dec = {
1491da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
1492da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
1493da7f033dSHerbert Xu 				}
1494da7f033dSHerbert Xu 			}
1495da7f033dSHerbert Xu 		}
1496da7f033dSHerbert Xu 	}, {
1497da7f033dSHerbert Xu 		.alg = "ccm(aes)",
1498da7f033dSHerbert Xu 		.test = alg_test_aead,
1499da7f033dSHerbert Xu 		.suite = {
1500da7f033dSHerbert Xu 			.aead = {
1501da7f033dSHerbert Xu 				.enc = {
1502da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
1503da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
1504da7f033dSHerbert Xu 				},
1505da7f033dSHerbert Xu 				.dec = {
1506da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
1507da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
1508da7f033dSHerbert Xu 				}
1509da7f033dSHerbert Xu 			}
1510da7f033dSHerbert Xu 		}
1511da7f033dSHerbert Xu 	}, {
1512da7f033dSHerbert Xu 		.alg = "crc32c",
15138e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
1514da7f033dSHerbert Xu 		.suite = {
1515da7f033dSHerbert Xu 			.hash = {
1516da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
1517da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
1518da7f033dSHerbert Xu 			}
1519da7f033dSHerbert Xu 		}
1520da7f033dSHerbert Xu 	}, {
1521da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
15221aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1523da7f033dSHerbert Xu 		.suite = {
1524da7f033dSHerbert Xu 			.cipher = {
1525da7f033dSHerbert Xu 				.enc = {
1526da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
1527da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
1528da7f033dSHerbert Xu 				},
1529da7f033dSHerbert Xu 				.dec = {
1530da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
1531da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
1532da7f033dSHerbert Xu 				}
1533da7f033dSHerbert Xu 			}
1534da7f033dSHerbert Xu 		}
1535da7f033dSHerbert Xu 	}, {
1536da7f033dSHerbert Xu 		.alg = "deflate",
1537da7f033dSHerbert Xu 		.test = alg_test_comp,
1538da7f033dSHerbert Xu 		.suite = {
1539da7f033dSHerbert Xu 			.comp = {
1540da7f033dSHerbert Xu 				.comp = {
1541da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
1542da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
1543da7f033dSHerbert Xu 				},
1544da7f033dSHerbert Xu 				.decomp = {
1545da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
1546da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
1547da7f033dSHerbert Xu 				}
1548da7f033dSHerbert Xu 			}
1549da7f033dSHerbert Xu 		}
1550da7f033dSHerbert Xu 	}, {
1551da7f033dSHerbert Xu 		.alg = "ecb(aes)",
15521aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1553da7f033dSHerbert Xu 		.suite = {
1554da7f033dSHerbert Xu 			.cipher = {
1555da7f033dSHerbert Xu 				.enc = {
1556da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
1557da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
1558da7f033dSHerbert Xu 				},
1559da7f033dSHerbert Xu 				.dec = {
1560da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
1561da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
1562da7f033dSHerbert Xu 				}
1563da7f033dSHerbert Xu 			}
1564da7f033dSHerbert Xu 		}
1565da7f033dSHerbert Xu 	}, {
1566da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
15671aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1568da7f033dSHerbert Xu 		.suite = {
1569da7f033dSHerbert Xu 			.cipher = {
1570da7f033dSHerbert Xu 				.enc = {
1571da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
1572da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
1573da7f033dSHerbert Xu 				},
1574da7f033dSHerbert Xu 				.dec = {
1575da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
1576da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
1577da7f033dSHerbert Xu 				}
1578da7f033dSHerbert Xu 			}
1579da7f033dSHerbert Xu 		}
1580da7f033dSHerbert Xu 	}, {
1581da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
15821aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1583da7f033dSHerbert Xu 		.suite = {
1584da7f033dSHerbert Xu 			.cipher = {
1585da7f033dSHerbert Xu 				.enc = {
1586da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
1587da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
1588da7f033dSHerbert Xu 				},
1589da7f033dSHerbert Xu 				.dec = {
1590da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
1591da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
1592da7f033dSHerbert Xu 				}
1593da7f033dSHerbert Xu 			}
1594da7f033dSHerbert Xu 		}
1595da7f033dSHerbert Xu 	}, {
1596da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
15971aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1598da7f033dSHerbert Xu 		.suite = {
1599da7f033dSHerbert Xu 			.cipher = {
1600da7f033dSHerbert Xu 				.enc = {
1601da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
1602da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
1603da7f033dSHerbert Xu 				},
1604da7f033dSHerbert Xu 				.dec = {
1605da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
1606da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
1607da7f033dSHerbert Xu 				}
1608da7f033dSHerbert Xu 			}
1609da7f033dSHerbert Xu 		}
1610da7f033dSHerbert Xu 	}, {
1611da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
16121aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1613da7f033dSHerbert Xu 		.suite = {
1614da7f033dSHerbert Xu 			.cipher = {
1615da7f033dSHerbert Xu 				.enc = {
1616da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
1617da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
1618da7f033dSHerbert Xu 				},
1619da7f033dSHerbert Xu 				.dec = {
1620da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
1621da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
1622da7f033dSHerbert Xu 				}
1623da7f033dSHerbert Xu 			}
1624da7f033dSHerbert Xu 		}
1625da7f033dSHerbert Xu 	}, {
1626da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
16271aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1628da7f033dSHerbert Xu 		.suite = {
1629da7f033dSHerbert Xu 			.cipher = {
1630da7f033dSHerbert Xu 				.enc = {
1631da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
1632da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
1633da7f033dSHerbert Xu 				},
1634da7f033dSHerbert Xu 				.dec = {
1635da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
1636da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
1637da7f033dSHerbert Xu 				}
1638da7f033dSHerbert Xu 			}
1639da7f033dSHerbert Xu 		}
1640da7f033dSHerbert Xu 	}, {
1641da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
16421aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1643da7f033dSHerbert Xu 		.suite = {
1644da7f033dSHerbert Xu 			.cipher = {
1645da7f033dSHerbert Xu 				.enc = {
1646da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
1647da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
1648da7f033dSHerbert Xu 				},
1649da7f033dSHerbert Xu 				.dec = {
1650da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
1651da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
1652da7f033dSHerbert Xu 				}
1653da7f033dSHerbert Xu 			}
1654da7f033dSHerbert Xu 		}
1655da7f033dSHerbert Xu 	}, {
1656da7f033dSHerbert Xu 		.alg = "ecb(des)",
16571aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1658da7f033dSHerbert Xu 		.suite = {
1659da7f033dSHerbert Xu 			.cipher = {
1660da7f033dSHerbert Xu 				.enc = {
1661da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
1662da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
1663da7f033dSHerbert Xu 				},
1664da7f033dSHerbert Xu 				.dec = {
1665da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
1666da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
1667da7f033dSHerbert Xu 				}
1668da7f033dSHerbert Xu 			}
1669da7f033dSHerbert Xu 		}
1670da7f033dSHerbert Xu 	}, {
1671da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
16721aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1673da7f033dSHerbert Xu 		.suite = {
1674da7f033dSHerbert Xu 			.cipher = {
1675da7f033dSHerbert Xu 				.enc = {
1676da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
1677da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
1678da7f033dSHerbert Xu 				},
1679da7f033dSHerbert Xu 				.dec = {
1680da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
1681da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
1682da7f033dSHerbert Xu 				}
1683da7f033dSHerbert Xu 			}
1684da7f033dSHerbert Xu 		}
1685da7f033dSHerbert Xu 	}, {
1686da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
16871aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1688da7f033dSHerbert Xu 		.suite = {
1689da7f033dSHerbert Xu 			.cipher = {
1690da7f033dSHerbert Xu 				.enc = {
1691da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
1692da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
1693da7f033dSHerbert Xu 				},
1694da7f033dSHerbert Xu 				.dec = {
1695da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
1696da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
1697da7f033dSHerbert Xu 				}
1698da7f033dSHerbert Xu 			}
1699da7f033dSHerbert Xu 		}
1700da7f033dSHerbert Xu 	}, {
1701da7f033dSHerbert Xu 		.alg = "ecb(seed)",
17021aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1703da7f033dSHerbert Xu 		.suite = {
1704da7f033dSHerbert Xu 			.cipher = {
1705da7f033dSHerbert Xu 				.enc = {
1706da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
1707da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
1708da7f033dSHerbert Xu 				},
1709da7f033dSHerbert Xu 				.dec = {
1710da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
1711da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
1712da7f033dSHerbert Xu 				}
1713da7f033dSHerbert Xu 			}
1714da7f033dSHerbert Xu 		}
1715da7f033dSHerbert Xu 	}, {
1716da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
17171aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1718da7f033dSHerbert Xu 		.suite = {
1719da7f033dSHerbert Xu 			.cipher = {
1720da7f033dSHerbert Xu 				.enc = {
1721da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
1722da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
1723da7f033dSHerbert Xu 				},
1724da7f033dSHerbert Xu 				.dec = {
1725da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
1726da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
1727da7f033dSHerbert Xu 				}
1728da7f033dSHerbert Xu 			}
1729da7f033dSHerbert Xu 		}
1730da7f033dSHerbert Xu 	}, {
1731da7f033dSHerbert Xu 		.alg = "ecb(tea)",
17321aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1733da7f033dSHerbert Xu 		.suite = {
1734da7f033dSHerbert Xu 			.cipher = {
1735da7f033dSHerbert Xu 				.enc = {
1736da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
1737da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
1738da7f033dSHerbert Xu 				},
1739da7f033dSHerbert Xu 				.dec = {
1740da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
1741da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
1742da7f033dSHerbert Xu 				}
1743da7f033dSHerbert Xu 			}
1744da7f033dSHerbert Xu 		}
1745da7f033dSHerbert Xu 	}, {
1746da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
17471aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1748da7f033dSHerbert Xu 		.suite = {
1749da7f033dSHerbert Xu 			.cipher = {
1750da7f033dSHerbert Xu 				.enc = {
1751da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
1752da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
1753da7f033dSHerbert Xu 				},
1754da7f033dSHerbert Xu 				.dec = {
1755da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
1756da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
1757da7f033dSHerbert Xu 				}
1758da7f033dSHerbert Xu 			}
1759da7f033dSHerbert Xu 		}
1760da7f033dSHerbert Xu 	}, {
1761da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
17621aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1763da7f033dSHerbert Xu 		.suite = {
1764da7f033dSHerbert Xu 			.cipher = {
1765da7f033dSHerbert Xu 				.enc = {
1766da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
1767da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
1768da7f033dSHerbert Xu 				},
1769da7f033dSHerbert Xu 				.dec = {
1770da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
1771da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
1772da7f033dSHerbert Xu 				}
1773da7f033dSHerbert Xu 			}
1774da7f033dSHerbert Xu 		}
1775da7f033dSHerbert Xu 	}, {
1776da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
17771aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1778da7f033dSHerbert Xu 		.suite = {
1779da7f033dSHerbert Xu 			.cipher = {
1780da7f033dSHerbert Xu 				.enc = {
1781da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
1782da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
1783da7f033dSHerbert Xu 				},
1784da7f033dSHerbert Xu 				.dec = {
1785da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
1786da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
1787da7f033dSHerbert Xu 				}
1788da7f033dSHerbert Xu 			}
1789da7f033dSHerbert Xu 		}
1790da7f033dSHerbert Xu 	}, {
1791da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
17921aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1793da7f033dSHerbert Xu 		.suite = {
1794da7f033dSHerbert Xu 			.cipher = {
1795da7f033dSHerbert Xu 				.enc = {
1796da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
1797da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
1798da7f033dSHerbert Xu 				},
1799da7f033dSHerbert Xu 				.dec = {
1800da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
1801da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
1802da7f033dSHerbert Xu 				}
1803da7f033dSHerbert Xu 			}
1804da7f033dSHerbert Xu 		}
1805da7f033dSHerbert Xu 	}, {
1806da7f033dSHerbert Xu 		.alg = "gcm(aes)",
1807da7f033dSHerbert Xu 		.test = alg_test_aead,
1808da7f033dSHerbert Xu 		.suite = {
1809da7f033dSHerbert Xu 			.aead = {
1810da7f033dSHerbert Xu 				.enc = {
1811da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
1812da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
1813da7f033dSHerbert Xu 				},
1814da7f033dSHerbert Xu 				.dec = {
1815da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
1816da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
1817da7f033dSHerbert Xu 				}
1818da7f033dSHerbert Xu 			}
1819da7f033dSHerbert Xu 		}
1820da7f033dSHerbert Xu 	}, {
1821da7f033dSHerbert Xu 		.alg = "hmac(md5)",
1822da7f033dSHerbert Xu 		.test = alg_test_hash,
1823da7f033dSHerbert Xu 		.suite = {
1824da7f033dSHerbert Xu 			.hash = {
1825da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
1826da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
1827da7f033dSHerbert Xu 			}
1828da7f033dSHerbert Xu 		}
1829da7f033dSHerbert Xu 	}, {
1830da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
1831da7f033dSHerbert Xu 		.test = alg_test_hash,
1832da7f033dSHerbert Xu 		.suite = {
1833da7f033dSHerbert Xu 			.hash = {
1834da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
1835da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
1836da7f033dSHerbert Xu 			}
1837da7f033dSHerbert Xu 		}
1838da7f033dSHerbert Xu 	}, {
1839da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
1840da7f033dSHerbert Xu 		.test = alg_test_hash,
1841da7f033dSHerbert Xu 		.suite = {
1842da7f033dSHerbert Xu 			.hash = {
1843da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
1844da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
1845da7f033dSHerbert Xu 			}
1846da7f033dSHerbert Xu 		}
1847da7f033dSHerbert Xu 	}, {
1848da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
1849da7f033dSHerbert Xu 		.test = alg_test_hash,
1850da7f033dSHerbert Xu 		.suite = {
1851da7f033dSHerbert Xu 			.hash = {
1852da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
1853da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
1854da7f033dSHerbert Xu 			}
1855da7f033dSHerbert Xu 		}
1856da7f033dSHerbert Xu 	}, {
1857da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
1858da7f033dSHerbert Xu 		.test = alg_test_hash,
1859da7f033dSHerbert Xu 		.suite = {
1860da7f033dSHerbert Xu 			.hash = {
1861da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
1862da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
1863da7f033dSHerbert Xu 			}
1864da7f033dSHerbert Xu 		}
1865da7f033dSHerbert Xu 	}, {
1866da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
1867da7f033dSHerbert Xu 		.test = alg_test_hash,
1868da7f033dSHerbert Xu 		.suite = {
1869da7f033dSHerbert Xu 			.hash = {
1870da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
1871da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
1872da7f033dSHerbert Xu 			}
1873da7f033dSHerbert Xu 		}
1874da7f033dSHerbert Xu 	}, {
1875da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
1876da7f033dSHerbert Xu 		.test = alg_test_hash,
1877da7f033dSHerbert Xu 		.suite = {
1878da7f033dSHerbert Xu 			.hash = {
1879da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
1880da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
1881da7f033dSHerbert Xu 			}
1882da7f033dSHerbert Xu 		}
1883da7f033dSHerbert Xu 	}, {
1884da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
1885da7f033dSHerbert Xu 		.test = alg_test_hash,
1886da7f033dSHerbert Xu 		.suite = {
1887da7f033dSHerbert Xu 			.hash = {
1888da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
1889da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
1890da7f033dSHerbert Xu 			}
1891da7f033dSHerbert Xu 		}
1892da7f033dSHerbert Xu 	}, {
1893da7f033dSHerbert Xu 		.alg = "lrw(aes)",
18941aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1895da7f033dSHerbert Xu 		.suite = {
1896da7f033dSHerbert Xu 			.cipher = {
1897da7f033dSHerbert Xu 				.enc = {
1898da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
1899da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
1900da7f033dSHerbert Xu 				},
1901da7f033dSHerbert Xu 				.dec = {
1902da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
1903da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
1904da7f033dSHerbert Xu 				}
1905da7f033dSHerbert Xu 			}
1906da7f033dSHerbert Xu 		}
1907da7f033dSHerbert Xu 	}, {
1908da7f033dSHerbert Xu 		.alg = "lzo",
1909da7f033dSHerbert Xu 		.test = alg_test_comp,
1910da7f033dSHerbert Xu 		.suite = {
1911da7f033dSHerbert Xu 			.comp = {
1912da7f033dSHerbert Xu 				.comp = {
1913da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
1914da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
1915da7f033dSHerbert Xu 				},
1916da7f033dSHerbert Xu 				.decomp = {
1917da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
1918da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
1919da7f033dSHerbert Xu 				}
1920da7f033dSHerbert Xu 			}
1921da7f033dSHerbert Xu 		}
1922da7f033dSHerbert Xu 	}, {
1923da7f033dSHerbert Xu 		.alg = "md4",
1924da7f033dSHerbert Xu 		.test = alg_test_hash,
1925da7f033dSHerbert Xu 		.suite = {
1926da7f033dSHerbert Xu 			.hash = {
1927da7f033dSHerbert Xu 				.vecs = md4_tv_template,
1928da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
1929da7f033dSHerbert Xu 			}
1930da7f033dSHerbert Xu 		}
1931da7f033dSHerbert Xu 	}, {
1932da7f033dSHerbert Xu 		.alg = "md5",
1933da7f033dSHerbert Xu 		.test = alg_test_hash,
1934da7f033dSHerbert Xu 		.suite = {
1935da7f033dSHerbert Xu 			.hash = {
1936da7f033dSHerbert Xu 				.vecs = md5_tv_template,
1937da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
1938da7f033dSHerbert Xu 			}
1939da7f033dSHerbert Xu 		}
1940da7f033dSHerbert Xu 	}, {
1941da7f033dSHerbert Xu 		.alg = "michael_mic",
1942da7f033dSHerbert Xu 		.test = alg_test_hash,
1943da7f033dSHerbert Xu 		.suite = {
1944da7f033dSHerbert Xu 			.hash = {
1945da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
1946da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
1947da7f033dSHerbert Xu 			}
1948da7f033dSHerbert Xu 		}
1949da7f033dSHerbert Xu 	}, {
1950da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
19511aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1952da7f033dSHerbert Xu 		.suite = {
1953da7f033dSHerbert Xu 			.cipher = {
1954da7f033dSHerbert Xu 				.enc = {
1955da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
1956da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
1957da7f033dSHerbert Xu 				},
1958da7f033dSHerbert Xu 				.dec = {
1959da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
1960da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
1961da7f033dSHerbert Xu 				}
1962da7f033dSHerbert Xu 			}
1963da7f033dSHerbert Xu 		}
1964da7f033dSHerbert Xu 	}, {
1965da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
19661aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
1967da7f033dSHerbert Xu 		.suite = {
1968da7f033dSHerbert Xu 			.cipher = {
1969da7f033dSHerbert Xu 				.enc = {
1970da7f033dSHerbert Xu 					.vecs = aes_ctr_enc_tv_template,
1971da7f033dSHerbert Xu 					.count = AES_CTR_ENC_TEST_VECTORS
1972da7f033dSHerbert Xu 				},
1973da7f033dSHerbert Xu 				.dec = {
1974da7f033dSHerbert Xu 					.vecs = aes_ctr_dec_tv_template,
1975da7f033dSHerbert Xu 					.count = AES_CTR_DEC_TEST_VECTORS
1976da7f033dSHerbert Xu 				}
1977da7f033dSHerbert Xu 			}
1978da7f033dSHerbert Xu 		}
1979da7f033dSHerbert Xu 	}, {
19805d667322SJarod Wilson 		.alg = "rfc4309(ccm(aes))",
19815d667322SJarod Wilson 		.test = alg_test_aead,
19825d667322SJarod Wilson 		.suite = {
19835d667322SJarod Wilson 			.aead = {
19845d667322SJarod Wilson 				.enc = {
19855d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
19865d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
19875d667322SJarod Wilson 				},
19885d667322SJarod Wilson 				.dec = {
19895d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
19905d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
19915d667322SJarod Wilson 				}
19925d667322SJarod Wilson 			}
19935d667322SJarod Wilson 		}
19945d667322SJarod Wilson 	}, {
1995da7f033dSHerbert Xu 		.alg = "rmd128",
1996da7f033dSHerbert Xu 		.test = alg_test_hash,
1997da7f033dSHerbert Xu 		.suite = {
1998da7f033dSHerbert Xu 			.hash = {
1999da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
2000da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
2001da7f033dSHerbert Xu 			}
2002da7f033dSHerbert Xu 		}
2003da7f033dSHerbert Xu 	}, {
2004da7f033dSHerbert Xu 		.alg = "rmd160",
2005da7f033dSHerbert Xu 		.test = alg_test_hash,
2006da7f033dSHerbert Xu 		.suite = {
2007da7f033dSHerbert Xu 			.hash = {
2008da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
2009da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
2010da7f033dSHerbert Xu 			}
2011da7f033dSHerbert Xu 		}
2012da7f033dSHerbert Xu 	}, {
2013da7f033dSHerbert Xu 		.alg = "rmd256",
2014da7f033dSHerbert Xu 		.test = alg_test_hash,
2015da7f033dSHerbert Xu 		.suite = {
2016da7f033dSHerbert Xu 			.hash = {
2017da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
2018da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
2019da7f033dSHerbert Xu 			}
2020da7f033dSHerbert Xu 		}
2021da7f033dSHerbert Xu 	}, {
2022da7f033dSHerbert Xu 		.alg = "rmd320",
2023da7f033dSHerbert Xu 		.test = alg_test_hash,
2024da7f033dSHerbert Xu 		.suite = {
2025da7f033dSHerbert Xu 			.hash = {
2026da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
2027da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
2028da7f033dSHerbert Xu 			}
2029da7f033dSHerbert Xu 		}
2030da7f033dSHerbert Xu 	}, {
2031da7f033dSHerbert Xu 		.alg = "salsa20",
20321aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2033da7f033dSHerbert Xu 		.suite = {
2034da7f033dSHerbert Xu 			.cipher = {
2035da7f033dSHerbert Xu 				.enc = {
2036da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
2037da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
2038da7f033dSHerbert Xu 				}
2039da7f033dSHerbert Xu 			}
2040da7f033dSHerbert Xu 		}
2041da7f033dSHerbert Xu 	}, {
2042da7f033dSHerbert Xu 		.alg = "sha1",
2043da7f033dSHerbert Xu 		.test = alg_test_hash,
2044da7f033dSHerbert Xu 		.suite = {
2045da7f033dSHerbert Xu 			.hash = {
2046da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
2047da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
2048da7f033dSHerbert Xu 			}
2049da7f033dSHerbert Xu 		}
2050da7f033dSHerbert Xu 	}, {
2051da7f033dSHerbert Xu 		.alg = "sha224",
2052da7f033dSHerbert Xu 		.test = alg_test_hash,
2053da7f033dSHerbert Xu 		.suite = {
2054da7f033dSHerbert Xu 			.hash = {
2055da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
2056da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
2057da7f033dSHerbert Xu 			}
2058da7f033dSHerbert Xu 		}
2059da7f033dSHerbert Xu 	}, {
2060da7f033dSHerbert Xu 		.alg = "sha256",
2061da7f033dSHerbert Xu 		.test = alg_test_hash,
2062da7f033dSHerbert Xu 		.suite = {
2063da7f033dSHerbert Xu 			.hash = {
2064da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
2065da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
2066da7f033dSHerbert Xu 			}
2067da7f033dSHerbert Xu 		}
2068da7f033dSHerbert Xu 	}, {
2069da7f033dSHerbert Xu 		.alg = "sha384",
2070da7f033dSHerbert Xu 		.test = alg_test_hash,
2071da7f033dSHerbert Xu 		.suite = {
2072da7f033dSHerbert Xu 			.hash = {
2073da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
2074da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
2075da7f033dSHerbert Xu 			}
2076da7f033dSHerbert Xu 		}
2077da7f033dSHerbert Xu 	}, {
2078da7f033dSHerbert Xu 		.alg = "sha512",
2079da7f033dSHerbert Xu 		.test = alg_test_hash,
2080da7f033dSHerbert Xu 		.suite = {
2081da7f033dSHerbert Xu 			.hash = {
2082da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
2083da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
2084da7f033dSHerbert Xu 			}
2085da7f033dSHerbert Xu 		}
2086da7f033dSHerbert Xu 	}, {
2087da7f033dSHerbert Xu 		.alg = "tgr128",
2088da7f033dSHerbert Xu 		.test = alg_test_hash,
2089da7f033dSHerbert Xu 		.suite = {
2090da7f033dSHerbert Xu 			.hash = {
2091da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
2092da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
2093da7f033dSHerbert Xu 			}
2094da7f033dSHerbert Xu 		}
2095da7f033dSHerbert Xu 	}, {
2096da7f033dSHerbert Xu 		.alg = "tgr160",
2097da7f033dSHerbert Xu 		.test = alg_test_hash,
2098da7f033dSHerbert Xu 		.suite = {
2099da7f033dSHerbert Xu 			.hash = {
2100da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
2101da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
2102da7f033dSHerbert Xu 			}
2103da7f033dSHerbert Xu 		}
2104da7f033dSHerbert Xu 	}, {
2105da7f033dSHerbert Xu 		.alg = "tgr192",
2106da7f033dSHerbert Xu 		.test = alg_test_hash,
2107da7f033dSHerbert Xu 		.suite = {
2108da7f033dSHerbert Xu 			.hash = {
2109da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
2110da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
2111da7f033dSHerbert Xu 			}
2112da7f033dSHerbert Xu 		}
2113da7f033dSHerbert Xu 	}, {
2114da7f033dSHerbert Xu 		.alg = "wp256",
2115da7f033dSHerbert Xu 		.test = alg_test_hash,
2116da7f033dSHerbert Xu 		.suite = {
2117da7f033dSHerbert Xu 			.hash = {
2118da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
2119da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
2120da7f033dSHerbert Xu 			}
2121da7f033dSHerbert Xu 		}
2122da7f033dSHerbert Xu 	}, {
2123da7f033dSHerbert Xu 		.alg = "wp384",
2124da7f033dSHerbert Xu 		.test = alg_test_hash,
2125da7f033dSHerbert Xu 		.suite = {
2126da7f033dSHerbert Xu 			.hash = {
2127da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
2128da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
2129da7f033dSHerbert Xu 			}
2130da7f033dSHerbert Xu 		}
2131da7f033dSHerbert Xu 	}, {
2132da7f033dSHerbert Xu 		.alg = "wp512",
2133da7f033dSHerbert Xu 		.test = alg_test_hash,
2134da7f033dSHerbert Xu 		.suite = {
2135da7f033dSHerbert Xu 			.hash = {
2136da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
2137da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
2138da7f033dSHerbert Xu 			}
2139da7f033dSHerbert Xu 		}
2140da7f033dSHerbert Xu 	}, {
2141da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
2142da7f033dSHerbert Xu 		.test = alg_test_hash,
2143da7f033dSHerbert Xu 		.suite = {
2144da7f033dSHerbert Xu 			.hash = {
2145da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
2146da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
2147da7f033dSHerbert Xu 			}
2148da7f033dSHerbert Xu 		}
2149da7f033dSHerbert Xu 	}, {
2150da7f033dSHerbert Xu 		.alg = "xts(aes)",
21511aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2152da7f033dSHerbert Xu 		.suite = {
2153da7f033dSHerbert Xu 			.cipher = {
2154da7f033dSHerbert Xu 				.enc = {
2155da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
2156da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
2157da7f033dSHerbert Xu 				},
2158da7f033dSHerbert Xu 				.dec = {
2159da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
2160da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
2161da7f033dSHerbert Xu 				}
2162da7f033dSHerbert Xu 			}
2163da7f033dSHerbert Xu 		}
21640c01aed5SGeert Uytterhoeven 	}, {
21650c01aed5SGeert Uytterhoeven 		.alg = "zlib",
21660c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
21670c01aed5SGeert Uytterhoeven 		.suite = {
21680c01aed5SGeert Uytterhoeven 			.pcomp = {
21690c01aed5SGeert Uytterhoeven 				.comp = {
21700c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
21710c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
21720c01aed5SGeert Uytterhoeven 				},
21730c01aed5SGeert Uytterhoeven 				.decomp = {
21740c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
21750c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
21760c01aed5SGeert Uytterhoeven 				}
21770c01aed5SGeert Uytterhoeven 			}
21780c01aed5SGeert Uytterhoeven 		}
2179da7f033dSHerbert Xu 	}
2180da7f033dSHerbert Xu };
2181da7f033dSHerbert Xu 
21821aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
2183da7f033dSHerbert Xu {
2184da7f033dSHerbert Xu 	int start = 0;
2185da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
2186da7f033dSHerbert Xu 
2187da7f033dSHerbert Xu 	while (start < end) {
2188da7f033dSHerbert Xu 		int i = (start + end) / 2;
2189da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
2190da7f033dSHerbert Xu 
2191da7f033dSHerbert Xu 		if (diff > 0) {
2192da7f033dSHerbert Xu 			end = i;
2193da7f033dSHerbert Xu 			continue;
2194da7f033dSHerbert Xu 		}
2195da7f033dSHerbert Xu 
2196da7f033dSHerbert Xu 		if (diff < 0) {
2197da7f033dSHerbert Xu 			start = i + 1;
2198da7f033dSHerbert Xu 			continue;
2199da7f033dSHerbert Xu 		}
2200da7f033dSHerbert Xu 
22011aa4ecd9SHerbert Xu 		return i;
2202da7f033dSHerbert Xu 	}
2203da7f033dSHerbert Xu 
22041aa4ecd9SHerbert Xu 	return -1;
22051aa4ecd9SHerbert Xu }
22061aa4ecd9SHerbert Xu 
22071aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
22081aa4ecd9SHerbert Xu {
22091aa4ecd9SHerbert Xu 	int i;
2210d12d6b6dSNeil Horman 	int rc;
22111aa4ecd9SHerbert Xu 
22121aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
22131aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
22141aa4ecd9SHerbert Xu 
22151aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
22161aa4ecd9SHerbert Xu 		    sizeof(nalg))
22171aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
22181aa4ecd9SHerbert Xu 
22191aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
22201aa4ecd9SHerbert Xu 		if (i < 0)
22211aa4ecd9SHerbert Xu 			goto notest;
22221aa4ecd9SHerbert Xu 
22231aa4ecd9SHerbert Xu 		return alg_test_cipher(alg_test_descs + i, driver, type, mask);
22241aa4ecd9SHerbert Xu 	}
22251aa4ecd9SHerbert Xu 
22261aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
22271aa4ecd9SHerbert Xu 	if (i < 0)
22281aa4ecd9SHerbert Xu 		goto notest;
22291aa4ecd9SHerbert Xu 
2230d12d6b6dSNeil Horman 	rc = alg_test_descs[i].test(alg_test_descs + i, driver,
22311aa4ecd9SHerbert Xu 				      type, mask);
2232d12d6b6dSNeil Horman 	if (fips_enabled && rc)
2233d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
2234d12d6b6dSNeil Horman 
2235d12d6b6dSNeil Horman 	return rc;
22361aa4ecd9SHerbert Xu 
22371aa4ecd9SHerbert Xu notest:
2238da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
2239da7f033dSHerbert Xu 	return 0;
2240da7f033dSHerbert Xu }
2241da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
2242da7f033dSHerbert Xu 
2243da7f033dSHerbert Xu int __init testmgr_init(void)
2244da7f033dSHerbert Xu {
2245da7f033dSHerbert Xu 	int i;
2246da7f033dSHerbert Xu 
2247da7f033dSHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
2248da7f033dSHerbert Xu 		xbuf[i] = (void *)__get_free_page(GFP_KERNEL);
2249da7f033dSHerbert Xu 		if (!xbuf[i])
2250da7f033dSHerbert Xu 			goto err_free_xbuf;
2251da7f033dSHerbert Xu 	}
2252da7f033dSHerbert Xu 
2253da7f033dSHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
2254da7f033dSHerbert Xu 		axbuf[i] = (void *)__get_free_page(GFP_KERNEL);
2255da7f033dSHerbert Xu 		if (!axbuf[i])
2256da7f033dSHerbert Xu 			goto err_free_axbuf;
2257da7f033dSHerbert Xu 	}
2258da7f033dSHerbert Xu 
2259da7f033dSHerbert Xu 	return 0;
2260da7f033dSHerbert Xu 
2261da7f033dSHerbert Xu err_free_axbuf:
2262da7f033dSHerbert Xu 	for (i = 0; i < XBUFSIZE && axbuf[i]; i++)
2263da7f033dSHerbert Xu 		free_page((unsigned long)axbuf[i]);
2264da7f033dSHerbert Xu err_free_xbuf:
2265da7f033dSHerbert Xu 	for (i = 0; i < XBUFSIZE && xbuf[i]; i++)
2266da7f033dSHerbert Xu 		free_page((unsigned long)xbuf[i]);
2267da7f033dSHerbert Xu 
2268da7f033dSHerbert Xu 	return -ENOMEM;
2269da7f033dSHerbert Xu }
2270da7f033dSHerbert Xu 
2271da7f033dSHerbert Xu void testmgr_exit(void)
2272da7f033dSHerbert Xu {
2273da7f033dSHerbert Xu 	int i;
2274da7f033dSHerbert Xu 
2275da7f033dSHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
2276da7f033dSHerbert Xu 		free_page((unsigned long)axbuf[i]);
2277da7f033dSHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
2278da7f033dSHerbert Xu 		free_page((unsigned long)xbuf[i]);
2279da7f033dSHerbert Xu }
2280