xref: /openbmc/linux/crypto/testmgr.c (revision da7f033d)
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>
22da7f033dSHerbert Xu 
23da7f033dSHerbert Xu #include "internal.h"
24da7f033dSHerbert Xu #include "testmgr.h"
25da7f033dSHerbert Xu 
26da7f033dSHerbert Xu /*
27da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
28da7f033dSHerbert Xu  */
29da7f033dSHerbert Xu #define XBUFSIZE	8
30da7f033dSHerbert Xu 
31da7f033dSHerbert Xu /*
32da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
33da7f033dSHerbert Xu  */
34da7f033dSHerbert Xu #define IDX1		32
35da7f033dSHerbert Xu #define IDX2		32400
36da7f033dSHerbert Xu #define IDX3		1
37da7f033dSHerbert Xu #define IDX4		8193
38da7f033dSHerbert Xu #define IDX5		22222
39da7f033dSHerbert Xu #define IDX6		17101
40da7f033dSHerbert Xu #define IDX7		27333
41da7f033dSHerbert Xu #define IDX8		3000
42da7f033dSHerbert Xu 
43da7f033dSHerbert Xu /*
44da7f033dSHerbert Xu * Used by test_cipher()
45da7f033dSHerbert Xu */
46da7f033dSHerbert Xu #define ENCRYPT 1
47da7f033dSHerbert Xu #define DECRYPT 0
48da7f033dSHerbert Xu 
49da7f033dSHerbert Xu struct tcrypt_result {
50da7f033dSHerbert Xu 	struct completion completion;
51da7f033dSHerbert Xu 	int err;
52da7f033dSHerbert Xu };
53da7f033dSHerbert Xu 
54da7f033dSHerbert Xu struct aead_test_suite {
55da7f033dSHerbert Xu 	struct {
56da7f033dSHerbert Xu 		struct aead_testvec *vecs;
57da7f033dSHerbert Xu 		unsigned int count;
58da7f033dSHerbert Xu 	} enc, dec;
59da7f033dSHerbert Xu };
60da7f033dSHerbert Xu 
61da7f033dSHerbert Xu struct cipher_test_suite {
62da7f033dSHerbert Xu 	struct {
63da7f033dSHerbert Xu 		struct cipher_testvec *vecs;
64da7f033dSHerbert Xu 		unsigned int count;
65da7f033dSHerbert Xu 	} enc, dec;
66da7f033dSHerbert Xu };
67da7f033dSHerbert Xu 
68da7f033dSHerbert Xu struct comp_test_suite {
69da7f033dSHerbert Xu 	struct {
70da7f033dSHerbert Xu 		struct comp_testvec *vecs;
71da7f033dSHerbert Xu 		unsigned int count;
72da7f033dSHerbert Xu 	} comp, decomp;
73da7f033dSHerbert Xu };
74da7f033dSHerbert Xu 
75da7f033dSHerbert Xu struct hash_test_suite {
76da7f033dSHerbert Xu 	struct hash_testvec *vecs;
77da7f033dSHerbert Xu 	unsigned int count;
78da7f033dSHerbert Xu };
79da7f033dSHerbert Xu 
80da7f033dSHerbert Xu struct alg_test_desc {
81da7f033dSHerbert Xu 	const char *alg;
82da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
83da7f033dSHerbert Xu 		    u32 type, u32 mask);
84da7f033dSHerbert Xu 
85da7f033dSHerbert Xu 	union {
86da7f033dSHerbert Xu 		struct aead_test_suite aead;
87da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
88da7f033dSHerbert Xu 		struct comp_test_suite comp;
89da7f033dSHerbert Xu 		struct hash_test_suite hash;
90da7f033dSHerbert Xu 	} suite;
91da7f033dSHerbert Xu };
92da7f033dSHerbert Xu 
93da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
94da7f033dSHerbert Xu 
95da7f033dSHerbert Xu static char *xbuf[XBUFSIZE];
96da7f033dSHerbert Xu static char *axbuf[XBUFSIZE];
97da7f033dSHerbert Xu 
98da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
99da7f033dSHerbert Xu {
100da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
101da7f033dSHerbert Xu 			16, 1,
102da7f033dSHerbert Xu 			buf, len, false);
103da7f033dSHerbert Xu }
104da7f033dSHerbert Xu 
105da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
106da7f033dSHerbert Xu {
107da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
108da7f033dSHerbert Xu 
109da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
110da7f033dSHerbert Xu 		return;
111da7f033dSHerbert Xu 
112da7f033dSHerbert Xu 	res->err = err;
113da7f033dSHerbert Xu 	complete(&res->completion);
114da7f033dSHerbert Xu }
115da7f033dSHerbert Xu 
116da7f033dSHerbert Xu static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
117da7f033dSHerbert Xu 		     unsigned int tcount)
118da7f033dSHerbert Xu {
119da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
120da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
121da7f033dSHerbert Xu 	struct scatterlist sg[8];
122da7f033dSHerbert Xu 	char result[64];
123da7f033dSHerbert Xu 	struct ahash_request *req;
124da7f033dSHerbert Xu 	struct tcrypt_result tresult;
125da7f033dSHerbert Xu 	int ret;
126da7f033dSHerbert Xu 	void *hash_buff;
127da7f033dSHerbert Xu 
128da7f033dSHerbert Xu 	init_completion(&tresult.completion);
129da7f033dSHerbert Xu 
130da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
131da7f033dSHerbert Xu 	if (!req) {
132da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
133da7f033dSHerbert Xu 		       "%s\n", algo);
134da7f033dSHerbert Xu 		ret = -ENOMEM;
135da7f033dSHerbert Xu 		goto out_noreq;
136da7f033dSHerbert Xu 	}
137da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
138da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
139da7f033dSHerbert Xu 
140da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
141da7f033dSHerbert Xu 		memset(result, 0, 64);
142da7f033dSHerbert Xu 
143da7f033dSHerbert Xu 		hash_buff = xbuf[0];
144da7f033dSHerbert Xu 
145da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
146da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
147da7f033dSHerbert Xu 
148da7f033dSHerbert Xu 		if (template[i].ksize) {
149da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
150da7f033dSHerbert Xu 			ret = crypto_ahash_setkey(tfm, template[i].key,
151da7f033dSHerbert Xu 						  template[i].ksize);
152da7f033dSHerbert Xu 			if (ret) {
153da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
154da7f033dSHerbert Xu 				       "test %d for %s: ret=%d\n", i + 1, algo,
155da7f033dSHerbert Xu 				       -ret);
156da7f033dSHerbert Xu 				goto out;
157da7f033dSHerbert Xu 			}
158da7f033dSHerbert Xu 		}
159da7f033dSHerbert Xu 
160da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
161da7f033dSHerbert Xu 		ret = crypto_ahash_digest(req);
162da7f033dSHerbert Xu 		switch (ret) {
163da7f033dSHerbert Xu 		case 0:
164da7f033dSHerbert Xu 			break;
165da7f033dSHerbert Xu 		case -EINPROGRESS:
166da7f033dSHerbert Xu 		case -EBUSY:
167da7f033dSHerbert Xu 			ret = wait_for_completion_interruptible(
168da7f033dSHerbert Xu 				&tresult.completion);
169da7f033dSHerbert Xu 			if (!ret && !(ret = tresult.err)) {
170da7f033dSHerbert Xu 				INIT_COMPLETION(tresult.completion);
171da7f033dSHerbert Xu 				break;
172da7f033dSHerbert Xu 			}
173da7f033dSHerbert Xu 			/* fall through */
174da7f033dSHerbert Xu 		default:
175da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: digest failed on test %d "
176da7f033dSHerbert Xu 			       "for %s: ret=%d\n", i + 1, algo, -ret);
177da7f033dSHerbert Xu 			goto out;
178da7f033dSHerbert Xu 		}
179da7f033dSHerbert Xu 
180da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
181da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
182da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
183da7f033dSHerbert Xu 			       i + 1, algo);
184da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
185da7f033dSHerbert Xu 			ret = -EINVAL;
186da7f033dSHerbert Xu 			goto out;
187da7f033dSHerbert Xu 		}
188da7f033dSHerbert Xu 	}
189da7f033dSHerbert Xu 
190da7f033dSHerbert Xu 	j = 0;
191da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
192da7f033dSHerbert Xu 		if (template[i].np) {
193da7f033dSHerbert Xu 			j++;
194da7f033dSHerbert Xu 			memset(result, 0, 64);
195da7f033dSHerbert Xu 
196da7f033dSHerbert Xu 			temp = 0;
197da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
198da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
199da7f033dSHerbert Xu 				sg_set_buf(&sg[k],
200da7f033dSHerbert Xu 					   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
201da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
202da7f033dSHerbert Xu 						  template[i].plaintext + temp,
203da7f033dSHerbert Xu 						  template[i].tap[k]),
204da7f033dSHerbert Xu 					   template[i].tap[k]);
205da7f033dSHerbert Xu 				temp += template[i].tap[k];
206da7f033dSHerbert Xu 			}
207da7f033dSHerbert Xu 
208da7f033dSHerbert Xu 			if (template[i].ksize) {
209da7f033dSHerbert Xu 				crypto_ahash_clear_flags(tfm, ~0);
210da7f033dSHerbert Xu 				ret = crypto_ahash_setkey(tfm, template[i].key,
211da7f033dSHerbert Xu 							  template[i].ksize);
212da7f033dSHerbert Xu 
213da7f033dSHerbert Xu 				if (ret) {
214da7f033dSHerbert Xu 					printk(KERN_ERR "alg: hash: setkey "
215da7f033dSHerbert Xu 					       "failed on chunking test %d "
216da7f033dSHerbert Xu 					       "for %s: ret=%d\n", j, algo,
217da7f033dSHerbert Xu 					       -ret);
218da7f033dSHerbert Xu 					goto out;
219da7f033dSHerbert Xu 				}
220da7f033dSHerbert Xu 			}
221da7f033dSHerbert Xu 
222da7f033dSHerbert Xu 			ahash_request_set_crypt(req, sg, result,
223da7f033dSHerbert Xu 						template[i].psize);
224da7f033dSHerbert Xu 			ret = crypto_ahash_digest(req);
225da7f033dSHerbert Xu 			switch (ret) {
226da7f033dSHerbert Xu 			case 0:
227da7f033dSHerbert Xu 				break;
228da7f033dSHerbert Xu 			case -EINPROGRESS:
229da7f033dSHerbert Xu 			case -EBUSY:
230da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
231da7f033dSHerbert Xu 					&tresult.completion);
232da7f033dSHerbert Xu 				if (!ret && !(ret = tresult.err)) {
233da7f033dSHerbert Xu 					INIT_COMPLETION(tresult.completion);
234da7f033dSHerbert Xu 					break;
235da7f033dSHerbert Xu 				}
236da7f033dSHerbert Xu 				/* fall through */
237da7f033dSHerbert Xu 			default:
238da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: digest failed "
239da7f033dSHerbert Xu 				       "on chunking test %d for %s: "
240da7f033dSHerbert Xu 				       "ret=%d\n", j, algo, -ret);
241da7f033dSHerbert Xu 				goto out;
242da7f033dSHerbert Xu 			}
243da7f033dSHerbert Xu 
244da7f033dSHerbert Xu 			if (memcmp(result, template[i].digest,
245da7f033dSHerbert Xu 				   crypto_ahash_digestsize(tfm))) {
246da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: Chunking test %d "
247da7f033dSHerbert Xu 				       "failed for %s\n", j, algo);
248da7f033dSHerbert Xu 				hexdump(result, crypto_ahash_digestsize(tfm));
249da7f033dSHerbert Xu 				ret = -EINVAL;
250da7f033dSHerbert Xu 				goto out;
251da7f033dSHerbert Xu 			}
252da7f033dSHerbert Xu 		}
253da7f033dSHerbert Xu 	}
254da7f033dSHerbert Xu 
255da7f033dSHerbert Xu 	ret = 0;
256da7f033dSHerbert Xu 
257da7f033dSHerbert Xu out:
258da7f033dSHerbert Xu 	ahash_request_free(req);
259da7f033dSHerbert Xu out_noreq:
260da7f033dSHerbert Xu 	return ret;
261da7f033dSHerbert Xu }
262da7f033dSHerbert Xu 
263da7f033dSHerbert Xu static int test_aead(struct crypto_aead *tfm, int enc,
264da7f033dSHerbert Xu 		     struct aead_testvec *template, unsigned int tcount)
265da7f033dSHerbert Xu {
266da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
267da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
268da7f033dSHerbert Xu 	int ret = 0;
269da7f033dSHerbert Xu 	char *q;
270da7f033dSHerbert Xu 	char *key;
271da7f033dSHerbert Xu 	struct aead_request *req;
272da7f033dSHerbert Xu 	struct scatterlist sg[8];
273da7f033dSHerbert Xu 	struct scatterlist asg[8];
274da7f033dSHerbert Xu 	const char *e;
275da7f033dSHerbert Xu 	struct tcrypt_result result;
276da7f033dSHerbert Xu 	unsigned int authsize;
277da7f033dSHerbert Xu 	void *input;
278da7f033dSHerbert Xu 	void *assoc;
279da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
280da7f033dSHerbert Xu 
281da7f033dSHerbert Xu 	if (enc == ENCRYPT)
282da7f033dSHerbert Xu 		e = "encryption";
283da7f033dSHerbert Xu 	else
284da7f033dSHerbert Xu 		e = "decryption";
285da7f033dSHerbert Xu 
286da7f033dSHerbert Xu 	init_completion(&result.completion);
287da7f033dSHerbert Xu 
288da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
289da7f033dSHerbert Xu 	if (!req) {
290da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to allocate request for "
291da7f033dSHerbert Xu 		       "%s\n", algo);
292da7f033dSHerbert Xu 		ret = -ENOMEM;
293da7f033dSHerbert Xu 		goto out;
294da7f033dSHerbert Xu 	}
295da7f033dSHerbert Xu 
296da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
297da7f033dSHerbert Xu 				  tcrypt_complete, &result);
298da7f033dSHerbert Xu 
299da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
300da7f033dSHerbert Xu 		if (!template[i].np) {
301da7f033dSHerbert Xu 			j++;
302da7f033dSHerbert Xu 
303da7f033dSHerbert Xu 			/* some tepmplates have no input data but they will
304da7f033dSHerbert Xu 			 * touch input
305da7f033dSHerbert Xu 			 */
306da7f033dSHerbert Xu 			input = xbuf[0];
307da7f033dSHerbert Xu 			assoc = axbuf[0];
308da7f033dSHerbert Xu 
309da7f033dSHerbert Xu 			memcpy(input, template[i].input, template[i].ilen);
310da7f033dSHerbert Xu 			memcpy(assoc, template[i].assoc, template[i].alen);
311da7f033dSHerbert Xu 			if (template[i].iv)
312da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
313da7f033dSHerbert Xu 			else
314da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
315da7f033dSHerbert Xu 
316da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
317da7f033dSHerbert Xu 			if (template[i].wk)
318da7f033dSHerbert Xu 				crypto_aead_set_flags(
319da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
320da7f033dSHerbert Xu 
321da7f033dSHerbert Xu 			key = template[i].key;
322da7f033dSHerbert Xu 
323da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key,
324da7f033dSHerbert Xu 						 template[i].klen);
325da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
326da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: setkey failed on "
327da7f033dSHerbert Xu 				       "test %d for %s: flags=%x\n", j, algo,
328da7f033dSHerbert Xu 				       crypto_aead_get_flags(tfm));
329da7f033dSHerbert Xu 				goto out;
330da7f033dSHerbert Xu 			} else if (ret)
331da7f033dSHerbert Xu 				continue;
332da7f033dSHerbert Xu 
333da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
334da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
335da7f033dSHerbert Xu 			if (ret) {
336da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: Failed to set "
337da7f033dSHerbert Xu 				       "authsize to %u on test %d for %s\n",
338da7f033dSHerbert Xu 				       authsize, j, algo);
339da7f033dSHerbert Xu 				goto out;
340da7f033dSHerbert Xu 			}
341da7f033dSHerbert Xu 
342da7f033dSHerbert Xu 			sg_init_one(&sg[0], input,
343da7f033dSHerbert Xu 				    template[i].ilen + (enc ? authsize : 0));
344da7f033dSHerbert Xu 
345da7f033dSHerbert Xu 			sg_init_one(&asg[0], assoc, template[i].alen);
346da7f033dSHerbert Xu 
347da7f033dSHerbert Xu 			aead_request_set_crypt(req, sg, sg,
348da7f033dSHerbert Xu 					       template[i].ilen, iv);
349da7f033dSHerbert Xu 
350da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
351da7f033dSHerbert Xu 
352da7f033dSHerbert Xu 			ret = enc ?
353da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
354da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
355da7f033dSHerbert Xu 
356da7f033dSHerbert Xu 			switch (ret) {
357da7f033dSHerbert Xu 			case 0:
358da7f033dSHerbert Xu 				break;
359da7f033dSHerbert Xu 			case -EINPROGRESS:
360da7f033dSHerbert Xu 			case -EBUSY:
361da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
362da7f033dSHerbert Xu 					&result.completion);
363da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
364da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
365da7f033dSHerbert Xu 					break;
366da7f033dSHerbert Xu 				}
367da7f033dSHerbert Xu 				/* fall through */
368da7f033dSHerbert Xu 			default:
369da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: %s failed on test "
370da7f033dSHerbert Xu 				       "%d for %s: ret=%d\n", e, j, algo, -ret);
371da7f033dSHerbert Xu 				goto out;
372da7f033dSHerbert Xu 			}
373da7f033dSHerbert Xu 
374da7f033dSHerbert Xu 			q = input;
375da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
376da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: Test %d failed on "
377da7f033dSHerbert Xu 				       "%s for %s\n", j, e, algo);
378da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
379da7f033dSHerbert Xu 				ret = -EINVAL;
380da7f033dSHerbert Xu 				goto out;
381da7f033dSHerbert Xu 			}
382da7f033dSHerbert Xu 		}
383da7f033dSHerbert Xu 	}
384da7f033dSHerbert Xu 
385da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
386da7f033dSHerbert Xu 		if (template[i].np) {
387da7f033dSHerbert Xu 			j++;
388da7f033dSHerbert Xu 
389da7f033dSHerbert Xu 			if (template[i].iv)
390da7f033dSHerbert Xu 				memcpy(iv, template[i].iv, MAX_IVLEN);
391da7f033dSHerbert Xu 			else
392da7f033dSHerbert Xu 				memset(iv, 0, MAX_IVLEN);
393da7f033dSHerbert Xu 
394da7f033dSHerbert Xu 			crypto_aead_clear_flags(tfm, ~0);
395da7f033dSHerbert Xu 			if (template[i].wk)
396da7f033dSHerbert Xu 				crypto_aead_set_flags(
397da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
398da7f033dSHerbert Xu 			key = template[i].key;
399da7f033dSHerbert Xu 
400da7f033dSHerbert Xu 			ret = crypto_aead_setkey(tfm, key, template[i].klen);
401da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
402da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: setkey failed on "
403da7f033dSHerbert Xu 				       "chunk test %d for %s: flags=%x\n", j,
404da7f033dSHerbert Xu 				       algo, crypto_aead_get_flags(tfm));
405da7f033dSHerbert Xu 				goto out;
406da7f033dSHerbert Xu 			} else if (ret)
407da7f033dSHerbert Xu 				continue;
408da7f033dSHerbert Xu 
409da7f033dSHerbert Xu 			authsize = abs(template[i].rlen - template[i].ilen);
410da7f033dSHerbert Xu 
411da7f033dSHerbert Xu 			ret = -EINVAL;
412da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
413da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
414da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
415da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
416da7f033dSHerbert Xu 					goto out;
417da7f033dSHerbert Xu 
418da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
419da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
420da7f033dSHerbert Xu 
421da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
422da7f033dSHerbert Xu 				       template[i].tap[k]);
423da7f033dSHerbert Xu 
424da7f033dSHerbert Xu 				n = template[i].tap[k];
425da7f033dSHerbert Xu 				if (k == template[i].np - 1 && enc)
426da7f033dSHerbert Xu 					n += authsize;
427da7f033dSHerbert Xu 				if (offset_in_page(q) + n < PAGE_SIZE)
428da7f033dSHerbert Xu 					q[n] = 0;
429da7f033dSHerbert Xu 
430da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
431da7f033dSHerbert Xu 				temp += template[i].tap[k];
432da7f033dSHerbert Xu 			}
433da7f033dSHerbert Xu 
434da7f033dSHerbert Xu 			ret = crypto_aead_setauthsize(tfm, authsize);
435da7f033dSHerbert Xu 			if (ret) {
436da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: Failed to set "
437da7f033dSHerbert Xu 				       "authsize to %u on chunk test %d for "
438da7f033dSHerbert Xu 				       "%s\n", authsize, j, algo);
439da7f033dSHerbert Xu 				goto out;
440da7f033dSHerbert Xu 			}
441da7f033dSHerbert Xu 
442da7f033dSHerbert Xu 			if (enc) {
443da7f033dSHerbert Xu 				if (WARN_ON(sg[k - 1].offset +
444da7f033dSHerbert Xu 					    sg[k - 1].length + authsize >
445da7f033dSHerbert Xu 					    PAGE_SIZE)) {
446da7f033dSHerbert Xu 					ret = -EINVAL;
447da7f033dSHerbert Xu 					goto out;
448da7f033dSHerbert Xu 				}
449da7f033dSHerbert Xu 
450da7f033dSHerbert Xu 				sg[k - 1].length += authsize;
451da7f033dSHerbert Xu 			}
452da7f033dSHerbert Xu 
453da7f033dSHerbert Xu 			sg_init_table(asg, template[i].anp);
454da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].anp; k++) {
455da7f033dSHerbert Xu 				sg_set_buf(&asg[k],
456da7f033dSHerbert Xu 					   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
457da7f033dSHerbert Xu 						  offset_in_page(IDX[k]),
458da7f033dSHerbert Xu 						  template[i].assoc + temp,
459da7f033dSHerbert Xu 						  template[i].atap[k]),
460da7f033dSHerbert Xu 					   template[i].atap[k]);
461da7f033dSHerbert Xu 				temp += template[i].atap[k];
462da7f033dSHerbert Xu 			}
463da7f033dSHerbert Xu 
464da7f033dSHerbert Xu 			aead_request_set_crypt(req, sg, sg,
465da7f033dSHerbert Xu 					       template[i].ilen,
466da7f033dSHerbert Xu 					       iv);
467da7f033dSHerbert Xu 
468da7f033dSHerbert Xu 			aead_request_set_assoc(req, asg, template[i].alen);
469da7f033dSHerbert Xu 
470da7f033dSHerbert Xu 			ret = enc ?
471da7f033dSHerbert Xu 				crypto_aead_encrypt(req) :
472da7f033dSHerbert Xu 				crypto_aead_decrypt(req);
473da7f033dSHerbert Xu 
474da7f033dSHerbert Xu 			switch (ret) {
475da7f033dSHerbert Xu 			case 0:
476da7f033dSHerbert Xu 				break;
477da7f033dSHerbert Xu 			case -EINPROGRESS:
478da7f033dSHerbert Xu 			case -EBUSY:
479da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
480da7f033dSHerbert Xu 					&result.completion);
481da7f033dSHerbert Xu 				if (!ret && !(ret = result.err)) {
482da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
483da7f033dSHerbert Xu 					break;
484da7f033dSHerbert Xu 				}
485da7f033dSHerbert Xu 				/* fall through */
486da7f033dSHerbert Xu 			default:
487da7f033dSHerbert Xu 				printk(KERN_ERR "alg: aead: %s failed on "
488da7f033dSHerbert Xu 				       "chunk test %d for %s: ret=%d\n", e, j,
489da7f033dSHerbert Xu 				       algo, -ret);
490da7f033dSHerbert Xu 				goto out;
491da7f033dSHerbert Xu 			}
492da7f033dSHerbert Xu 
493da7f033dSHerbert Xu 			ret = -EINVAL;
494da7f033dSHerbert Xu 			for (k = 0, temp = 0; k < template[i].np; k++) {
495da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
496da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
497da7f033dSHerbert Xu 
498da7f033dSHerbert Xu 				n = template[i].tap[k];
499da7f033dSHerbert Xu 				if (k == template[i].np - 1)
500da7f033dSHerbert Xu 					n += enc ? authsize : -authsize;
501da7f033dSHerbert Xu 
502da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp, n)) {
503da7f033dSHerbert Xu 					printk(KERN_ERR "alg: aead: Chunk "
504da7f033dSHerbert Xu 					       "test %d failed on %s at page "
505da7f033dSHerbert Xu 					       "%u for %s\n", j, e, k, algo);
506da7f033dSHerbert Xu 					hexdump(q, n);
507da7f033dSHerbert Xu 					goto out;
508da7f033dSHerbert Xu 				}
509da7f033dSHerbert Xu 
510da7f033dSHerbert Xu 				q += n;
511da7f033dSHerbert Xu 				if (k == template[i].np - 1 && !enc) {
512da7f033dSHerbert Xu 					if (memcmp(q, template[i].input +
513da7f033dSHerbert Xu 						      temp + n, authsize))
514da7f033dSHerbert Xu 						n = authsize;
515da7f033dSHerbert Xu 					else
516da7f033dSHerbert Xu 						n = 0;
517da7f033dSHerbert Xu 				} else {
518da7f033dSHerbert Xu 					for (n = 0; offset_in_page(q + n) &&
519da7f033dSHerbert Xu 						    q[n]; n++)
520da7f033dSHerbert Xu 						;
521da7f033dSHerbert Xu 				}
522da7f033dSHerbert Xu 				if (n) {
523da7f033dSHerbert Xu 					printk(KERN_ERR "alg: aead: Result "
524da7f033dSHerbert Xu 					       "buffer corruption in chunk "
525da7f033dSHerbert Xu 					       "test %d on %s at page %u for "
526da7f033dSHerbert Xu 					       "%s: %u bytes:\n", j, e, k,
527da7f033dSHerbert Xu 					       algo, n);
528da7f033dSHerbert Xu 					hexdump(q, n);
529da7f033dSHerbert Xu 					goto out;
530da7f033dSHerbert Xu 				}
531da7f033dSHerbert Xu 
532da7f033dSHerbert Xu 				temp += template[i].tap[k];
533da7f033dSHerbert Xu 			}
534da7f033dSHerbert Xu 		}
535da7f033dSHerbert Xu 	}
536da7f033dSHerbert Xu 
537da7f033dSHerbert Xu 	ret = 0;
538da7f033dSHerbert Xu 
539da7f033dSHerbert Xu out:
540da7f033dSHerbert Xu 	aead_request_free(req);
541da7f033dSHerbert Xu 	return ret;
542da7f033dSHerbert Xu }
543da7f033dSHerbert Xu 
544da7f033dSHerbert Xu static int test_cipher(struct crypto_ablkcipher *tfm, int enc,
545da7f033dSHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
546da7f033dSHerbert Xu {
547da7f033dSHerbert Xu 	const char *algo =
548da7f033dSHerbert Xu 		crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
549da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
550da7f033dSHerbert Xu 	int ret;
551da7f033dSHerbert Xu 	char *q;
552da7f033dSHerbert Xu 	struct ablkcipher_request *req;
553da7f033dSHerbert Xu 	struct scatterlist sg[8];
554da7f033dSHerbert Xu 	const char *e;
555da7f033dSHerbert Xu 	struct tcrypt_result result;
556da7f033dSHerbert Xu 	void *data;
557da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
558da7f033dSHerbert Xu 
559da7f033dSHerbert Xu 	if (enc == ENCRYPT)
560da7f033dSHerbert Xu 	        e = "encryption";
561da7f033dSHerbert Xu 	else
562da7f033dSHerbert Xu 		e = "decryption";
563da7f033dSHerbert Xu 
564da7f033dSHerbert Xu 	init_completion(&result.completion);
565da7f033dSHerbert Xu 
566da7f033dSHerbert Xu 	req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
567da7f033dSHerbert Xu 	if (!req) {
568da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to allocate request for "
569da7f033dSHerbert Xu 		       "%s\n", algo);
570da7f033dSHerbert Xu 		ret = -ENOMEM;
571da7f033dSHerbert Xu 		goto out;
572da7f033dSHerbert Xu 	}
573da7f033dSHerbert Xu 
574da7f033dSHerbert Xu 	ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
575da7f033dSHerbert Xu 					tcrypt_complete, &result);
576da7f033dSHerbert Xu 
577da7f033dSHerbert Xu 	j = 0;
578da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
579da7f033dSHerbert Xu 		if (template[i].iv)
580da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
581da7f033dSHerbert Xu 		else
582da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
583da7f033dSHerbert Xu 
584da7f033dSHerbert Xu 		if (!(template[i].np)) {
585da7f033dSHerbert Xu 			j++;
586da7f033dSHerbert Xu 
587da7f033dSHerbert Xu 			data = xbuf[0];
588da7f033dSHerbert Xu 			memcpy(data, template[i].input, template[i].ilen);
589da7f033dSHerbert Xu 
590da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
591da7f033dSHerbert Xu 			if (template[i].wk)
592da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
593da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
594da7f033dSHerbert Xu 
595da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
596da7f033dSHerbert Xu 						       template[i].klen);
597da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
598da7f033dSHerbert Xu 				printk(KERN_ERR "alg: cipher: setkey failed "
599da7f033dSHerbert Xu 				       "on test %d for %s: flags=%x\n", j,
600da7f033dSHerbert Xu 				       algo, crypto_ablkcipher_get_flags(tfm));
601da7f033dSHerbert Xu 				goto out;
602da7f033dSHerbert Xu 			} else if (ret)
603da7f033dSHerbert Xu 				continue;
604da7f033dSHerbert Xu 
605da7f033dSHerbert Xu 			sg_init_one(&sg[0], data, template[i].ilen);
606da7f033dSHerbert Xu 
607da7f033dSHerbert Xu 			ablkcipher_request_set_crypt(req, sg, sg,
608da7f033dSHerbert Xu 						     template[i].ilen, iv);
609da7f033dSHerbert Xu 			ret = enc ?
610da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
611da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
612da7f033dSHerbert Xu 
613da7f033dSHerbert Xu 			switch (ret) {
614da7f033dSHerbert Xu 			case 0:
615da7f033dSHerbert Xu 				break;
616da7f033dSHerbert Xu 			case -EINPROGRESS:
617da7f033dSHerbert Xu 			case -EBUSY:
618da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
619da7f033dSHerbert Xu 					&result.completion);
620da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
621da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
622da7f033dSHerbert Xu 					break;
623da7f033dSHerbert Xu 				}
624da7f033dSHerbert Xu 				/* fall through */
625da7f033dSHerbert Xu 			default:
626da7f033dSHerbert Xu 				printk(KERN_ERR "alg: cipher: %s failed on "
627da7f033dSHerbert Xu 				       "test %d for %s: ret=%d\n", e, j, algo,
628da7f033dSHerbert Xu 				       -ret);
629da7f033dSHerbert Xu 				goto out;
630da7f033dSHerbert Xu 			}
631da7f033dSHerbert Xu 
632da7f033dSHerbert Xu 			q = data;
633da7f033dSHerbert Xu 			if (memcmp(q, template[i].result, template[i].rlen)) {
634da7f033dSHerbert Xu 				printk(KERN_ERR "alg: cipher: Test %d failed "
635da7f033dSHerbert Xu 				       "on %s for %s\n", j, e, algo);
636da7f033dSHerbert Xu 				hexdump(q, template[i].rlen);
637da7f033dSHerbert Xu 				ret = -EINVAL;
638da7f033dSHerbert Xu 				goto out;
639da7f033dSHerbert Xu 			}
640da7f033dSHerbert Xu 		}
641da7f033dSHerbert Xu 	}
642da7f033dSHerbert Xu 
643da7f033dSHerbert Xu 	j = 0;
644da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
645da7f033dSHerbert Xu 
646da7f033dSHerbert Xu 		if (template[i].iv)
647da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
648da7f033dSHerbert Xu 		else
649da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
650da7f033dSHerbert Xu 
651da7f033dSHerbert Xu 		if (template[i].np) {
652da7f033dSHerbert Xu 			j++;
653da7f033dSHerbert Xu 
654da7f033dSHerbert Xu 			crypto_ablkcipher_clear_flags(tfm, ~0);
655da7f033dSHerbert Xu 			if (template[i].wk)
656da7f033dSHerbert Xu 				crypto_ablkcipher_set_flags(
657da7f033dSHerbert Xu 					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
658da7f033dSHerbert Xu 
659da7f033dSHerbert Xu 			ret = crypto_ablkcipher_setkey(tfm, template[i].key,
660da7f033dSHerbert Xu 						       template[i].klen);
661da7f033dSHerbert Xu 			if (!ret == template[i].fail) {
662da7f033dSHerbert Xu 				printk(KERN_ERR "alg: cipher: setkey failed "
663da7f033dSHerbert Xu 				       "on chunk test %d for %s: flags=%x\n",
664da7f033dSHerbert Xu 				       j, algo,
665da7f033dSHerbert Xu 				       crypto_ablkcipher_get_flags(tfm));
666da7f033dSHerbert Xu 				goto out;
667da7f033dSHerbert Xu 			} else if (ret)
668da7f033dSHerbert Xu 				continue;
669da7f033dSHerbert Xu 
670da7f033dSHerbert Xu 			temp = 0;
671da7f033dSHerbert Xu 			ret = -EINVAL;
672da7f033dSHerbert Xu 			sg_init_table(sg, template[i].np);
673da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
674da7f033dSHerbert Xu 				if (WARN_ON(offset_in_page(IDX[k]) +
675da7f033dSHerbert Xu 					    template[i].tap[k] > PAGE_SIZE))
676da7f033dSHerbert Xu 					goto out;
677da7f033dSHerbert Xu 
678da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
679da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
680da7f033dSHerbert Xu 
681da7f033dSHerbert Xu 				memcpy(q, template[i].input + temp,
682da7f033dSHerbert Xu 				       template[i].tap[k]);
683da7f033dSHerbert Xu 
684da7f033dSHerbert Xu 				if (offset_in_page(q) + template[i].tap[k] <
685da7f033dSHerbert Xu 				    PAGE_SIZE)
686da7f033dSHerbert Xu 					q[template[i].tap[k]] = 0;
687da7f033dSHerbert Xu 
688da7f033dSHerbert Xu 				sg_set_buf(&sg[k], q, template[i].tap[k]);
689da7f033dSHerbert Xu 
690da7f033dSHerbert Xu 				temp += template[i].tap[k];
691da7f033dSHerbert Xu 			}
692da7f033dSHerbert Xu 
693da7f033dSHerbert Xu 			ablkcipher_request_set_crypt(req, sg, sg,
694da7f033dSHerbert Xu 					template[i].ilen, iv);
695da7f033dSHerbert Xu 
696da7f033dSHerbert Xu 			ret = enc ?
697da7f033dSHerbert Xu 				crypto_ablkcipher_encrypt(req) :
698da7f033dSHerbert Xu 				crypto_ablkcipher_decrypt(req);
699da7f033dSHerbert Xu 
700da7f033dSHerbert Xu 			switch (ret) {
701da7f033dSHerbert Xu 			case 0:
702da7f033dSHerbert Xu 				break;
703da7f033dSHerbert Xu 			case -EINPROGRESS:
704da7f033dSHerbert Xu 			case -EBUSY:
705da7f033dSHerbert Xu 				ret = wait_for_completion_interruptible(
706da7f033dSHerbert Xu 					&result.completion);
707da7f033dSHerbert Xu 				if (!ret && !((ret = result.err))) {
708da7f033dSHerbert Xu 					INIT_COMPLETION(result.completion);
709da7f033dSHerbert Xu 					break;
710da7f033dSHerbert Xu 				}
711da7f033dSHerbert Xu 				/* fall through */
712da7f033dSHerbert Xu 			default:
713da7f033dSHerbert Xu 				printk(KERN_ERR "alg: cipher: %s failed on "
714da7f033dSHerbert Xu 				       "chunk test %d for %s: ret=%d\n", e, j,
715da7f033dSHerbert Xu 				       algo, -ret);
716da7f033dSHerbert Xu 				goto out;
717da7f033dSHerbert Xu 			}
718da7f033dSHerbert Xu 
719da7f033dSHerbert Xu 			temp = 0;
720da7f033dSHerbert Xu 			ret = -EINVAL;
721da7f033dSHerbert Xu 			for (k = 0; k < template[i].np; k++) {
722da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
723da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
724da7f033dSHerbert Xu 
725da7f033dSHerbert Xu 				if (memcmp(q, template[i].result + temp,
726da7f033dSHerbert Xu 					   template[i].tap[k])) {
727da7f033dSHerbert Xu 					printk(KERN_ERR "alg: cipher: Chunk "
728da7f033dSHerbert Xu 					       "test %d failed on %s at page "
729da7f033dSHerbert Xu 					       "%u for %s\n", j, e, k, algo);
730da7f033dSHerbert Xu 					hexdump(q, template[i].tap[k]);
731da7f033dSHerbert Xu 					goto out;
732da7f033dSHerbert Xu 				}
733da7f033dSHerbert Xu 
734da7f033dSHerbert Xu 				q += template[i].tap[k];
735da7f033dSHerbert Xu 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
736da7f033dSHerbert Xu 					;
737da7f033dSHerbert Xu 				if (n) {
738da7f033dSHerbert Xu 					printk(KERN_ERR "alg: cipher: "
739da7f033dSHerbert Xu 					       "Result buffer corruption in "
740da7f033dSHerbert Xu 					       "chunk test %d on %s at page "
741da7f033dSHerbert Xu 					       "%u for %s: %u bytes:\n", j, e,
742da7f033dSHerbert Xu 					       k, algo, n);
743da7f033dSHerbert Xu 					hexdump(q, n);
744da7f033dSHerbert Xu 					goto out;
745da7f033dSHerbert Xu 				}
746da7f033dSHerbert Xu 				temp += template[i].tap[k];
747da7f033dSHerbert Xu 			}
748da7f033dSHerbert Xu 		}
749da7f033dSHerbert Xu 	}
750da7f033dSHerbert Xu 
751da7f033dSHerbert Xu 	ret = 0;
752da7f033dSHerbert Xu 
753da7f033dSHerbert Xu out:
754da7f033dSHerbert Xu 	ablkcipher_request_free(req);
755da7f033dSHerbert Xu 	return ret;
756da7f033dSHerbert Xu }
757da7f033dSHerbert Xu 
758da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
759da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
760da7f033dSHerbert Xu {
761da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
762da7f033dSHerbert Xu 	unsigned int i;
763da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
764da7f033dSHerbert Xu 	int ret;
765da7f033dSHerbert Xu 
766da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
767da7f033dSHerbert Xu 		int ilen, dlen = COMP_BUF_SIZE;
768da7f033dSHerbert Xu 
769da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
770da7f033dSHerbert Xu 
771da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
772da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
773da7f033dSHerbert Xu 		                           ilen, result, &dlen);
774da7f033dSHerbert Xu 		if (ret) {
775da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
776da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
777da7f033dSHerbert Xu 			       -ret);
778da7f033dSHerbert Xu 			goto out;
779da7f033dSHerbert Xu 		}
780da7f033dSHerbert Xu 
781da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
782da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
783da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
784da7f033dSHerbert Xu 			hexdump(result, dlen);
785da7f033dSHerbert Xu 			ret = -EINVAL;
786da7f033dSHerbert Xu 			goto out;
787da7f033dSHerbert Xu 		}
788da7f033dSHerbert Xu 	}
789da7f033dSHerbert Xu 
790da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
791da7f033dSHerbert Xu 		int ilen, ret, dlen = COMP_BUF_SIZE;
792da7f033dSHerbert Xu 
793da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
794da7f033dSHerbert Xu 
795da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
796da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
797da7f033dSHerbert Xu 		                             ilen, result, &dlen);
798da7f033dSHerbert Xu 		if (ret) {
799da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
800da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
801da7f033dSHerbert Xu 			       -ret);
802da7f033dSHerbert Xu 			goto out;
803da7f033dSHerbert Xu 		}
804da7f033dSHerbert Xu 
805da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
806da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
807da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
808da7f033dSHerbert Xu 			hexdump(result, dlen);
809da7f033dSHerbert Xu 			ret = -EINVAL;
810da7f033dSHerbert Xu 			goto out;
811da7f033dSHerbert Xu 		}
812da7f033dSHerbert Xu 	}
813da7f033dSHerbert Xu 
814da7f033dSHerbert Xu 	ret = 0;
815da7f033dSHerbert Xu 
816da7f033dSHerbert Xu out:
817da7f033dSHerbert Xu 	return ret;
818da7f033dSHerbert Xu }
819da7f033dSHerbert Xu 
820da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
821da7f033dSHerbert Xu 			 u32 type, u32 mask)
822da7f033dSHerbert Xu {
823da7f033dSHerbert Xu 	struct crypto_aead *tfm;
824da7f033dSHerbert Xu 	int err = 0;
825da7f033dSHerbert Xu 
826da7f033dSHerbert Xu 	tfm = crypto_alloc_aead(driver, type, mask);
827da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
828da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
829da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
830da7f033dSHerbert Xu 		return PTR_ERR(tfm);
831da7f033dSHerbert Xu 	}
832da7f033dSHerbert Xu 
833da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
834da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
835da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
836da7f033dSHerbert Xu 		if (err)
837da7f033dSHerbert Xu 			goto out;
838da7f033dSHerbert Xu 	}
839da7f033dSHerbert Xu 
840da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
841da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
842da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
843da7f033dSHerbert Xu 
844da7f033dSHerbert Xu out:
845da7f033dSHerbert Xu 	crypto_free_aead(tfm);
846da7f033dSHerbert Xu 	return err;
847da7f033dSHerbert Xu }
848da7f033dSHerbert Xu 
849da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
850da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
851da7f033dSHerbert Xu {
852da7f033dSHerbert Xu 	struct crypto_ablkcipher *tfm;
853da7f033dSHerbert Xu 	int err = 0;
854da7f033dSHerbert Xu 
855da7f033dSHerbert Xu 	tfm = crypto_alloc_ablkcipher(driver, type, mask);
856da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
857da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
858da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
859da7f033dSHerbert Xu 		return PTR_ERR(tfm);
860da7f033dSHerbert Xu 	}
861da7f033dSHerbert Xu 
862da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
863da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
864da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
865da7f033dSHerbert Xu 		if (err)
866da7f033dSHerbert Xu 			goto out;
867da7f033dSHerbert Xu 	}
868da7f033dSHerbert Xu 
869da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
870da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
871da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
872da7f033dSHerbert Xu 
873da7f033dSHerbert Xu out:
874da7f033dSHerbert Xu 	crypto_free_ablkcipher(tfm);
875da7f033dSHerbert Xu 	return err;
876da7f033dSHerbert Xu }
877da7f033dSHerbert Xu 
878da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
879da7f033dSHerbert Xu 			 u32 type, u32 mask)
880da7f033dSHerbert Xu {
881da7f033dSHerbert Xu 	struct crypto_comp *tfm;
882da7f033dSHerbert Xu 	int err;
883da7f033dSHerbert Xu 
884da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
885da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
886da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
887da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
888da7f033dSHerbert Xu 		return PTR_ERR(tfm);
889da7f033dSHerbert Xu 	}
890da7f033dSHerbert Xu 
891da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
892da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
893da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
894da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
895da7f033dSHerbert Xu 
896da7f033dSHerbert Xu 	crypto_free_comp(tfm);
897da7f033dSHerbert Xu 	return err;
898da7f033dSHerbert Xu }
899da7f033dSHerbert Xu 
900da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
901da7f033dSHerbert Xu 			 u32 type, u32 mask)
902da7f033dSHerbert Xu {
903da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
904da7f033dSHerbert Xu 	int err;
905da7f033dSHerbert Xu 
906da7f033dSHerbert Xu 	tfm = crypto_alloc_ahash(driver, type, mask);
907da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
908da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
909da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
910da7f033dSHerbert Xu 		return PTR_ERR(tfm);
911da7f033dSHerbert Xu 	}
912da7f033dSHerbert Xu 
913da7f033dSHerbert Xu 	err = test_hash(tfm, desc->suite.hash.vecs, desc->suite.hash.count);
914da7f033dSHerbert Xu 
915da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
916da7f033dSHerbert Xu 	return err;
917da7f033dSHerbert Xu }
918da7f033dSHerbert Xu 
919da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
920da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
921da7f033dSHerbert Xu 	{
922da7f033dSHerbert Xu 		.alg = "cbc(aes)",
923da7f033dSHerbert Xu 		.test = alg_test_cipher,
924da7f033dSHerbert Xu 		.suite = {
925da7f033dSHerbert Xu 			.cipher = {
926da7f033dSHerbert Xu 				.enc = {
927da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
928da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
929da7f033dSHerbert Xu 				},
930da7f033dSHerbert Xu 				.dec = {
931da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
932da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
933da7f033dSHerbert Xu 				}
934da7f033dSHerbert Xu 			}
935da7f033dSHerbert Xu 		}
936da7f033dSHerbert Xu 	}, {
937da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
938da7f033dSHerbert Xu 		.test = alg_test_cipher,
939da7f033dSHerbert Xu 		.suite = {
940da7f033dSHerbert Xu 			.cipher = {
941da7f033dSHerbert Xu 				.enc = {
942da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
943da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
944da7f033dSHerbert Xu 				},
945da7f033dSHerbert Xu 				.dec = {
946da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
947da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
948da7f033dSHerbert Xu 				}
949da7f033dSHerbert Xu 			}
950da7f033dSHerbert Xu 		}
951da7f033dSHerbert Xu 	}, {
952da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
953da7f033dSHerbert Xu 		.test = alg_test_cipher,
954da7f033dSHerbert Xu 		.suite = {
955da7f033dSHerbert Xu 			.cipher = {
956da7f033dSHerbert Xu 				.enc = {
957da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
958da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
959da7f033dSHerbert Xu 				},
960da7f033dSHerbert Xu 				.dec = {
961da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
962da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
963da7f033dSHerbert Xu 				}
964da7f033dSHerbert Xu 			}
965da7f033dSHerbert Xu 		}
966da7f033dSHerbert Xu 	}, {
967da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
968da7f033dSHerbert Xu 		.test = alg_test_cipher,
969da7f033dSHerbert Xu 		.suite = {
970da7f033dSHerbert Xu 			.cipher = {
971da7f033dSHerbert Xu 				.enc = {
972da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
973da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
974da7f033dSHerbert Xu 				},
975da7f033dSHerbert Xu 				.dec = {
976da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
977da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
978da7f033dSHerbert Xu 				}
979da7f033dSHerbert Xu 			}
980da7f033dSHerbert Xu 		}
981da7f033dSHerbert Xu 	}, {
982da7f033dSHerbert Xu 		.alg = "cbc(des)",
983da7f033dSHerbert Xu 		.test = alg_test_cipher,
984da7f033dSHerbert Xu 		.suite = {
985da7f033dSHerbert Xu 			.cipher = {
986da7f033dSHerbert Xu 				.enc = {
987da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
988da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
989da7f033dSHerbert Xu 				},
990da7f033dSHerbert Xu 				.dec = {
991da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
992da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
993da7f033dSHerbert Xu 				}
994da7f033dSHerbert Xu 			}
995da7f033dSHerbert Xu 		}
996da7f033dSHerbert Xu 	}, {
997da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
998da7f033dSHerbert Xu 		.test = alg_test_cipher,
999da7f033dSHerbert Xu 		.suite = {
1000da7f033dSHerbert Xu 			.cipher = {
1001da7f033dSHerbert Xu 				.enc = {
1002da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
1003da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
1004da7f033dSHerbert Xu 				},
1005da7f033dSHerbert Xu 				.dec = {
1006da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
1007da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
1008da7f033dSHerbert Xu 				}
1009da7f033dSHerbert Xu 			}
1010da7f033dSHerbert Xu 		}
1011da7f033dSHerbert Xu 	}, {
1012da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
1013da7f033dSHerbert Xu 		.test = alg_test_cipher,
1014da7f033dSHerbert Xu 		.suite = {
1015da7f033dSHerbert Xu 			.cipher = {
1016da7f033dSHerbert Xu 				.enc = {
1017da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
1018da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
1019da7f033dSHerbert Xu 				},
1020da7f033dSHerbert Xu 				.dec = {
1021da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
1022da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
1023da7f033dSHerbert Xu 				}
1024da7f033dSHerbert Xu 			}
1025da7f033dSHerbert Xu 		}
1026da7f033dSHerbert Xu 	}, {
1027da7f033dSHerbert Xu 		.alg = "ccm(aes)",
1028da7f033dSHerbert Xu 		.test = alg_test_aead,
1029da7f033dSHerbert Xu 		.suite = {
1030da7f033dSHerbert Xu 			.aead = {
1031da7f033dSHerbert Xu 				.enc = {
1032da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
1033da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
1034da7f033dSHerbert Xu 				},
1035da7f033dSHerbert Xu 				.dec = {
1036da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
1037da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
1038da7f033dSHerbert Xu 				}
1039da7f033dSHerbert Xu 			}
1040da7f033dSHerbert Xu 		}
1041da7f033dSHerbert Xu 	}, {
1042da7f033dSHerbert Xu 		.alg = "crc32c",
1043da7f033dSHerbert Xu 		.test = alg_test_hash,
1044da7f033dSHerbert Xu 		.suite = {
1045da7f033dSHerbert Xu 			.hash = {
1046da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
1047da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
1048da7f033dSHerbert Xu 			}
1049da7f033dSHerbert Xu 		}
1050da7f033dSHerbert Xu 	}, {
1051da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
1052da7f033dSHerbert Xu 		.test = alg_test_cipher,
1053da7f033dSHerbert Xu 		.suite = {
1054da7f033dSHerbert Xu 			.cipher = {
1055da7f033dSHerbert Xu 				.enc = {
1056da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
1057da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
1058da7f033dSHerbert Xu 				},
1059da7f033dSHerbert Xu 				.dec = {
1060da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
1061da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
1062da7f033dSHerbert Xu 				}
1063da7f033dSHerbert Xu 			}
1064da7f033dSHerbert Xu 		}
1065da7f033dSHerbert Xu 	}, {
1066da7f033dSHerbert Xu 		.alg = "deflate",
1067da7f033dSHerbert Xu 		.test = alg_test_comp,
1068da7f033dSHerbert Xu 		.suite = {
1069da7f033dSHerbert Xu 			.comp = {
1070da7f033dSHerbert Xu 				.comp = {
1071da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
1072da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
1073da7f033dSHerbert Xu 				},
1074da7f033dSHerbert Xu 				.decomp = {
1075da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
1076da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
1077da7f033dSHerbert Xu 				}
1078da7f033dSHerbert Xu 			}
1079da7f033dSHerbert Xu 		}
1080da7f033dSHerbert Xu 	}, {
1081da7f033dSHerbert Xu 		.alg = "ecb(aes)",
1082da7f033dSHerbert Xu 		.test = alg_test_cipher,
1083da7f033dSHerbert Xu 		.suite = {
1084da7f033dSHerbert Xu 			.cipher = {
1085da7f033dSHerbert Xu 				.enc = {
1086da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
1087da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
1088da7f033dSHerbert Xu 				},
1089da7f033dSHerbert Xu 				.dec = {
1090da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
1091da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
1092da7f033dSHerbert Xu 				}
1093da7f033dSHerbert Xu 			}
1094da7f033dSHerbert Xu 		}
1095da7f033dSHerbert Xu 	}, {
1096da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
1097da7f033dSHerbert Xu 		.test = alg_test_cipher,
1098da7f033dSHerbert Xu 		.suite = {
1099da7f033dSHerbert Xu 			.cipher = {
1100da7f033dSHerbert Xu 				.enc = {
1101da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
1102da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
1103da7f033dSHerbert Xu 				},
1104da7f033dSHerbert Xu 				.dec = {
1105da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
1106da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
1107da7f033dSHerbert Xu 				}
1108da7f033dSHerbert Xu 			}
1109da7f033dSHerbert Xu 		}
1110da7f033dSHerbert Xu 	}, {
1111da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
1112da7f033dSHerbert Xu 		.test = alg_test_cipher,
1113da7f033dSHerbert Xu 		.suite = {
1114da7f033dSHerbert Xu 			.cipher = {
1115da7f033dSHerbert Xu 				.enc = {
1116da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
1117da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
1118da7f033dSHerbert Xu 				},
1119da7f033dSHerbert Xu 				.dec = {
1120da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
1121da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
1122da7f033dSHerbert Xu 				}
1123da7f033dSHerbert Xu 			}
1124da7f033dSHerbert Xu 		}
1125da7f033dSHerbert Xu 	}, {
1126da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
1127da7f033dSHerbert Xu 		.test = alg_test_cipher,
1128da7f033dSHerbert Xu 		.suite = {
1129da7f033dSHerbert Xu 			.cipher = {
1130da7f033dSHerbert Xu 				.enc = {
1131da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
1132da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
1133da7f033dSHerbert Xu 				},
1134da7f033dSHerbert Xu 				.dec = {
1135da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
1136da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
1137da7f033dSHerbert Xu 				}
1138da7f033dSHerbert Xu 			}
1139da7f033dSHerbert Xu 		}
1140da7f033dSHerbert Xu 	}, {
1141da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
1142da7f033dSHerbert Xu 		.test = alg_test_cipher,
1143da7f033dSHerbert Xu 		.suite = {
1144da7f033dSHerbert Xu 			.cipher = {
1145da7f033dSHerbert Xu 				.enc = {
1146da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
1147da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
1148da7f033dSHerbert Xu 				},
1149da7f033dSHerbert Xu 				.dec = {
1150da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
1151da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
1152da7f033dSHerbert Xu 				}
1153da7f033dSHerbert Xu 			}
1154da7f033dSHerbert Xu 		}
1155da7f033dSHerbert Xu 	}, {
1156da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
1157da7f033dSHerbert Xu 		.test = alg_test_cipher,
1158da7f033dSHerbert Xu 		.suite = {
1159da7f033dSHerbert Xu 			.cipher = {
1160da7f033dSHerbert Xu 				.enc = {
1161da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
1162da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
1163da7f033dSHerbert Xu 				},
1164da7f033dSHerbert Xu 				.dec = {
1165da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
1166da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
1167da7f033dSHerbert Xu 				}
1168da7f033dSHerbert Xu 			}
1169da7f033dSHerbert Xu 		}
1170da7f033dSHerbert Xu 	}, {
1171da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
1172da7f033dSHerbert Xu 		.test = alg_test_cipher,
1173da7f033dSHerbert Xu 		.suite = {
1174da7f033dSHerbert Xu 			.cipher = {
1175da7f033dSHerbert Xu 				.enc = {
1176da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
1177da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
1178da7f033dSHerbert Xu 				},
1179da7f033dSHerbert Xu 				.dec = {
1180da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
1181da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
1182da7f033dSHerbert Xu 				}
1183da7f033dSHerbert Xu 			}
1184da7f033dSHerbert Xu 		}
1185da7f033dSHerbert Xu 	}, {
1186da7f033dSHerbert Xu 		.alg = "ecb(des)",
1187da7f033dSHerbert Xu 		.test = alg_test_cipher,
1188da7f033dSHerbert Xu 		.suite = {
1189da7f033dSHerbert Xu 			.cipher = {
1190da7f033dSHerbert Xu 				.enc = {
1191da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
1192da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
1193da7f033dSHerbert Xu 				},
1194da7f033dSHerbert Xu 				.dec = {
1195da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
1196da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
1197da7f033dSHerbert Xu 				}
1198da7f033dSHerbert Xu 			}
1199da7f033dSHerbert Xu 		}
1200da7f033dSHerbert Xu 	}, {
1201da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
1202da7f033dSHerbert Xu 		.test = alg_test_cipher,
1203da7f033dSHerbert Xu 		.suite = {
1204da7f033dSHerbert Xu 			.cipher = {
1205da7f033dSHerbert Xu 				.enc = {
1206da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
1207da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
1208da7f033dSHerbert Xu 				},
1209da7f033dSHerbert Xu 				.dec = {
1210da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
1211da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
1212da7f033dSHerbert Xu 				}
1213da7f033dSHerbert Xu 			}
1214da7f033dSHerbert Xu 		}
1215da7f033dSHerbert Xu 	}, {
1216da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
1217da7f033dSHerbert Xu 		.test = alg_test_cipher,
1218da7f033dSHerbert Xu 		.suite = {
1219da7f033dSHerbert Xu 			.cipher = {
1220da7f033dSHerbert Xu 				.enc = {
1221da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
1222da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
1223da7f033dSHerbert Xu 				},
1224da7f033dSHerbert Xu 				.dec = {
1225da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
1226da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
1227da7f033dSHerbert Xu 				}
1228da7f033dSHerbert Xu 			}
1229da7f033dSHerbert Xu 		}
1230da7f033dSHerbert Xu 	}, {
1231da7f033dSHerbert Xu 		.alg = "ecb(seed)",
1232da7f033dSHerbert Xu 		.test = alg_test_cipher,
1233da7f033dSHerbert Xu 		.suite = {
1234da7f033dSHerbert Xu 			.cipher = {
1235da7f033dSHerbert Xu 				.enc = {
1236da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
1237da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
1238da7f033dSHerbert Xu 				},
1239da7f033dSHerbert Xu 				.dec = {
1240da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
1241da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
1242da7f033dSHerbert Xu 				}
1243da7f033dSHerbert Xu 			}
1244da7f033dSHerbert Xu 		}
1245da7f033dSHerbert Xu 	}, {
1246da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
1247da7f033dSHerbert Xu 		.test = alg_test_cipher,
1248da7f033dSHerbert Xu 		.suite = {
1249da7f033dSHerbert Xu 			.cipher = {
1250da7f033dSHerbert Xu 				.enc = {
1251da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
1252da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
1253da7f033dSHerbert Xu 				},
1254da7f033dSHerbert Xu 				.dec = {
1255da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
1256da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
1257da7f033dSHerbert Xu 				}
1258da7f033dSHerbert Xu 			}
1259da7f033dSHerbert Xu 		}
1260da7f033dSHerbert Xu 	}, {
1261da7f033dSHerbert Xu 		.alg = "ecb(tea)",
1262da7f033dSHerbert Xu 		.test = alg_test_cipher,
1263da7f033dSHerbert Xu 		.suite = {
1264da7f033dSHerbert Xu 			.cipher = {
1265da7f033dSHerbert Xu 				.enc = {
1266da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
1267da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
1268da7f033dSHerbert Xu 				},
1269da7f033dSHerbert Xu 				.dec = {
1270da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
1271da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
1272da7f033dSHerbert Xu 				}
1273da7f033dSHerbert Xu 			}
1274da7f033dSHerbert Xu 		}
1275da7f033dSHerbert Xu 	}, {
1276da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
1277da7f033dSHerbert Xu 		.test = alg_test_cipher,
1278da7f033dSHerbert Xu 		.suite = {
1279da7f033dSHerbert Xu 			.cipher = {
1280da7f033dSHerbert Xu 				.enc = {
1281da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
1282da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
1283da7f033dSHerbert Xu 				},
1284da7f033dSHerbert Xu 				.dec = {
1285da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
1286da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
1287da7f033dSHerbert Xu 				}
1288da7f033dSHerbert Xu 			}
1289da7f033dSHerbert Xu 		}
1290da7f033dSHerbert Xu 	}, {
1291da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
1292da7f033dSHerbert Xu 		.test = alg_test_cipher,
1293da7f033dSHerbert Xu 		.suite = {
1294da7f033dSHerbert Xu 			.cipher = {
1295da7f033dSHerbert Xu 				.enc = {
1296da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
1297da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
1298da7f033dSHerbert Xu 				},
1299da7f033dSHerbert Xu 				.dec = {
1300da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
1301da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
1302da7f033dSHerbert Xu 				}
1303da7f033dSHerbert Xu 			}
1304da7f033dSHerbert Xu 		}
1305da7f033dSHerbert Xu 	}, {
1306da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
1307da7f033dSHerbert Xu 		.test = alg_test_cipher,
1308da7f033dSHerbert Xu 		.suite = {
1309da7f033dSHerbert Xu 			.cipher = {
1310da7f033dSHerbert Xu 				.enc = {
1311da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
1312da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
1313da7f033dSHerbert Xu 				},
1314da7f033dSHerbert Xu 				.dec = {
1315da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
1316da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
1317da7f033dSHerbert Xu 				}
1318da7f033dSHerbert Xu 			}
1319da7f033dSHerbert Xu 		}
1320da7f033dSHerbert Xu 	}, {
1321da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
1322da7f033dSHerbert Xu 		.test = alg_test_cipher,
1323da7f033dSHerbert Xu 		.suite = {
1324da7f033dSHerbert Xu 			.cipher = {
1325da7f033dSHerbert Xu 				.enc = {
1326da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
1327da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
1328da7f033dSHerbert Xu 				},
1329da7f033dSHerbert Xu 				.dec = {
1330da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
1331da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
1332da7f033dSHerbert Xu 				}
1333da7f033dSHerbert Xu 			}
1334da7f033dSHerbert Xu 		}
1335da7f033dSHerbert Xu 	}, {
1336da7f033dSHerbert Xu 		.alg = "gcm(aes)",
1337da7f033dSHerbert Xu 		.test = alg_test_aead,
1338da7f033dSHerbert Xu 		.suite = {
1339da7f033dSHerbert Xu 			.aead = {
1340da7f033dSHerbert Xu 				.enc = {
1341da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
1342da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
1343da7f033dSHerbert Xu 				},
1344da7f033dSHerbert Xu 				.dec = {
1345da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
1346da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
1347da7f033dSHerbert Xu 				}
1348da7f033dSHerbert Xu 			}
1349da7f033dSHerbert Xu 		}
1350da7f033dSHerbert Xu 	}, {
1351da7f033dSHerbert Xu 		.alg = "hmac(md5)",
1352da7f033dSHerbert Xu 		.test = alg_test_hash,
1353da7f033dSHerbert Xu 		.suite = {
1354da7f033dSHerbert Xu 			.hash = {
1355da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
1356da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
1357da7f033dSHerbert Xu 			}
1358da7f033dSHerbert Xu 		}
1359da7f033dSHerbert Xu 	}, {
1360da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
1361da7f033dSHerbert Xu 		.test = alg_test_hash,
1362da7f033dSHerbert Xu 		.suite = {
1363da7f033dSHerbert Xu 			.hash = {
1364da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
1365da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
1366da7f033dSHerbert Xu 			}
1367da7f033dSHerbert Xu 		}
1368da7f033dSHerbert Xu 	}, {
1369da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
1370da7f033dSHerbert Xu 		.test = alg_test_hash,
1371da7f033dSHerbert Xu 		.suite = {
1372da7f033dSHerbert Xu 			.hash = {
1373da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
1374da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
1375da7f033dSHerbert Xu 			}
1376da7f033dSHerbert Xu 		}
1377da7f033dSHerbert Xu 	}, {
1378da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
1379da7f033dSHerbert Xu 		.test = alg_test_hash,
1380da7f033dSHerbert Xu 		.suite = {
1381da7f033dSHerbert Xu 			.hash = {
1382da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
1383da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
1384da7f033dSHerbert Xu 			}
1385da7f033dSHerbert Xu 		}
1386da7f033dSHerbert Xu 	}, {
1387da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
1388da7f033dSHerbert Xu 		.test = alg_test_hash,
1389da7f033dSHerbert Xu 		.suite = {
1390da7f033dSHerbert Xu 			.hash = {
1391da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
1392da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
1393da7f033dSHerbert Xu 			}
1394da7f033dSHerbert Xu 		}
1395da7f033dSHerbert Xu 	}, {
1396da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
1397da7f033dSHerbert Xu 		.test = alg_test_hash,
1398da7f033dSHerbert Xu 		.suite = {
1399da7f033dSHerbert Xu 			.hash = {
1400da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
1401da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
1402da7f033dSHerbert Xu 			}
1403da7f033dSHerbert Xu 		}
1404da7f033dSHerbert Xu 	}, {
1405da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
1406da7f033dSHerbert Xu 		.test = alg_test_hash,
1407da7f033dSHerbert Xu 		.suite = {
1408da7f033dSHerbert Xu 			.hash = {
1409da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
1410da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
1411da7f033dSHerbert Xu 			}
1412da7f033dSHerbert Xu 		}
1413da7f033dSHerbert Xu 	}, {
1414da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
1415da7f033dSHerbert Xu 		.test = alg_test_hash,
1416da7f033dSHerbert Xu 		.suite = {
1417da7f033dSHerbert Xu 			.hash = {
1418da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
1419da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
1420da7f033dSHerbert Xu 			}
1421da7f033dSHerbert Xu 		}
1422da7f033dSHerbert Xu 	}, {
1423da7f033dSHerbert Xu 		.alg = "lrw(aes)",
1424da7f033dSHerbert Xu 		.test = alg_test_cipher,
1425da7f033dSHerbert Xu 		.suite = {
1426da7f033dSHerbert Xu 			.cipher = {
1427da7f033dSHerbert Xu 				.enc = {
1428da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
1429da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
1430da7f033dSHerbert Xu 				},
1431da7f033dSHerbert Xu 				.dec = {
1432da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
1433da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
1434da7f033dSHerbert Xu 				}
1435da7f033dSHerbert Xu 			}
1436da7f033dSHerbert Xu 		}
1437da7f033dSHerbert Xu 	}, {
1438da7f033dSHerbert Xu 		.alg = "lzo",
1439da7f033dSHerbert Xu 		.test = alg_test_comp,
1440da7f033dSHerbert Xu 		.suite = {
1441da7f033dSHerbert Xu 			.comp = {
1442da7f033dSHerbert Xu 				.comp = {
1443da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
1444da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
1445da7f033dSHerbert Xu 				},
1446da7f033dSHerbert Xu 				.decomp = {
1447da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
1448da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
1449da7f033dSHerbert Xu 				}
1450da7f033dSHerbert Xu 			}
1451da7f033dSHerbert Xu 		}
1452da7f033dSHerbert Xu 	}, {
1453da7f033dSHerbert Xu 		.alg = "md4",
1454da7f033dSHerbert Xu 		.test = alg_test_hash,
1455da7f033dSHerbert Xu 		.suite = {
1456da7f033dSHerbert Xu 			.hash = {
1457da7f033dSHerbert Xu 				.vecs = md4_tv_template,
1458da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
1459da7f033dSHerbert Xu 			}
1460da7f033dSHerbert Xu 		}
1461da7f033dSHerbert Xu 	}, {
1462da7f033dSHerbert Xu 		.alg = "md5",
1463da7f033dSHerbert Xu 		.test = alg_test_hash,
1464da7f033dSHerbert Xu 		.suite = {
1465da7f033dSHerbert Xu 			.hash = {
1466da7f033dSHerbert Xu 				.vecs = md5_tv_template,
1467da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
1468da7f033dSHerbert Xu 			}
1469da7f033dSHerbert Xu 		}
1470da7f033dSHerbert Xu 	}, {
1471da7f033dSHerbert Xu 		.alg = "michael_mic",
1472da7f033dSHerbert Xu 		.test = alg_test_hash,
1473da7f033dSHerbert Xu 		.suite = {
1474da7f033dSHerbert Xu 			.hash = {
1475da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
1476da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
1477da7f033dSHerbert Xu 			}
1478da7f033dSHerbert Xu 		}
1479da7f033dSHerbert Xu 	}, {
1480da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
1481da7f033dSHerbert Xu 		.test = alg_test_cipher,
1482da7f033dSHerbert Xu 		.suite = {
1483da7f033dSHerbert Xu 			.cipher = {
1484da7f033dSHerbert Xu 				.enc = {
1485da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
1486da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
1487da7f033dSHerbert Xu 				},
1488da7f033dSHerbert Xu 				.dec = {
1489da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
1490da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
1491da7f033dSHerbert Xu 				}
1492da7f033dSHerbert Xu 			}
1493da7f033dSHerbert Xu 		}
1494da7f033dSHerbert Xu 	}, {
1495da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
1496da7f033dSHerbert Xu 		.test = alg_test_cipher,
1497da7f033dSHerbert Xu 		.suite = {
1498da7f033dSHerbert Xu 			.cipher = {
1499da7f033dSHerbert Xu 				.enc = {
1500da7f033dSHerbert Xu 					.vecs = aes_ctr_enc_tv_template,
1501da7f033dSHerbert Xu 					.count = AES_CTR_ENC_TEST_VECTORS
1502da7f033dSHerbert Xu 				},
1503da7f033dSHerbert Xu 				.dec = {
1504da7f033dSHerbert Xu 					.vecs = aes_ctr_dec_tv_template,
1505da7f033dSHerbert Xu 					.count = AES_CTR_DEC_TEST_VECTORS
1506da7f033dSHerbert Xu 				}
1507da7f033dSHerbert Xu 			}
1508da7f033dSHerbert Xu 		}
1509da7f033dSHerbert Xu 	}, {
1510da7f033dSHerbert Xu 		.alg = "rmd128",
1511da7f033dSHerbert Xu 		.test = alg_test_hash,
1512da7f033dSHerbert Xu 		.suite = {
1513da7f033dSHerbert Xu 			.hash = {
1514da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
1515da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
1516da7f033dSHerbert Xu 			}
1517da7f033dSHerbert Xu 		}
1518da7f033dSHerbert Xu 	}, {
1519da7f033dSHerbert Xu 		.alg = "rmd160",
1520da7f033dSHerbert Xu 		.test = alg_test_hash,
1521da7f033dSHerbert Xu 		.suite = {
1522da7f033dSHerbert Xu 			.hash = {
1523da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
1524da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
1525da7f033dSHerbert Xu 			}
1526da7f033dSHerbert Xu 		}
1527da7f033dSHerbert Xu 	}, {
1528da7f033dSHerbert Xu 		.alg = "rmd256",
1529da7f033dSHerbert Xu 		.test = alg_test_hash,
1530da7f033dSHerbert Xu 		.suite = {
1531da7f033dSHerbert Xu 			.hash = {
1532da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
1533da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
1534da7f033dSHerbert Xu 			}
1535da7f033dSHerbert Xu 		}
1536da7f033dSHerbert Xu 	}, {
1537da7f033dSHerbert Xu 		.alg = "rmd320",
1538da7f033dSHerbert Xu 		.test = alg_test_hash,
1539da7f033dSHerbert Xu 		.suite = {
1540da7f033dSHerbert Xu 			.hash = {
1541da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
1542da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
1543da7f033dSHerbert Xu 			}
1544da7f033dSHerbert Xu 		}
1545da7f033dSHerbert Xu 	}, {
1546da7f033dSHerbert Xu 		.alg = "salsa20",
1547da7f033dSHerbert Xu 		.test = alg_test_cipher,
1548da7f033dSHerbert Xu 		.suite = {
1549da7f033dSHerbert Xu 			.cipher = {
1550da7f033dSHerbert Xu 				.enc = {
1551da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
1552da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
1553da7f033dSHerbert Xu 				}
1554da7f033dSHerbert Xu 			}
1555da7f033dSHerbert Xu 		}
1556da7f033dSHerbert Xu 	}, {
1557da7f033dSHerbert Xu 		.alg = "sha1",
1558da7f033dSHerbert Xu 		.test = alg_test_hash,
1559da7f033dSHerbert Xu 		.suite = {
1560da7f033dSHerbert Xu 			.hash = {
1561da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
1562da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
1563da7f033dSHerbert Xu 			}
1564da7f033dSHerbert Xu 		}
1565da7f033dSHerbert Xu 	}, {
1566da7f033dSHerbert Xu 		.alg = "sha224",
1567da7f033dSHerbert Xu 		.test = alg_test_hash,
1568da7f033dSHerbert Xu 		.suite = {
1569da7f033dSHerbert Xu 			.hash = {
1570da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
1571da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
1572da7f033dSHerbert Xu 			}
1573da7f033dSHerbert Xu 		}
1574da7f033dSHerbert Xu 	}, {
1575da7f033dSHerbert Xu 		.alg = "sha256",
1576da7f033dSHerbert Xu 		.test = alg_test_hash,
1577da7f033dSHerbert Xu 		.suite = {
1578da7f033dSHerbert Xu 			.hash = {
1579da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
1580da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
1581da7f033dSHerbert Xu 			}
1582da7f033dSHerbert Xu 		}
1583da7f033dSHerbert Xu 	}, {
1584da7f033dSHerbert Xu 		.alg = "sha384",
1585da7f033dSHerbert Xu 		.test = alg_test_hash,
1586da7f033dSHerbert Xu 		.suite = {
1587da7f033dSHerbert Xu 			.hash = {
1588da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
1589da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
1590da7f033dSHerbert Xu 			}
1591da7f033dSHerbert Xu 		}
1592da7f033dSHerbert Xu 	}, {
1593da7f033dSHerbert Xu 		.alg = "sha512",
1594da7f033dSHerbert Xu 		.test = alg_test_hash,
1595da7f033dSHerbert Xu 		.suite = {
1596da7f033dSHerbert Xu 			.hash = {
1597da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
1598da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
1599da7f033dSHerbert Xu 			}
1600da7f033dSHerbert Xu 		}
1601da7f033dSHerbert Xu 	}, {
1602da7f033dSHerbert Xu 		.alg = "tgr128",
1603da7f033dSHerbert Xu 		.test = alg_test_hash,
1604da7f033dSHerbert Xu 		.suite = {
1605da7f033dSHerbert Xu 			.hash = {
1606da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
1607da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
1608da7f033dSHerbert Xu 			}
1609da7f033dSHerbert Xu 		}
1610da7f033dSHerbert Xu 	}, {
1611da7f033dSHerbert Xu 		.alg = "tgr160",
1612da7f033dSHerbert Xu 		.test = alg_test_hash,
1613da7f033dSHerbert Xu 		.suite = {
1614da7f033dSHerbert Xu 			.hash = {
1615da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
1616da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
1617da7f033dSHerbert Xu 			}
1618da7f033dSHerbert Xu 		}
1619da7f033dSHerbert Xu 	}, {
1620da7f033dSHerbert Xu 		.alg = "tgr192",
1621da7f033dSHerbert Xu 		.test = alg_test_hash,
1622da7f033dSHerbert Xu 		.suite = {
1623da7f033dSHerbert Xu 			.hash = {
1624da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
1625da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
1626da7f033dSHerbert Xu 			}
1627da7f033dSHerbert Xu 		}
1628da7f033dSHerbert Xu 	}, {
1629da7f033dSHerbert Xu 		.alg = "wp256",
1630da7f033dSHerbert Xu 		.test = alg_test_hash,
1631da7f033dSHerbert Xu 		.suite = {
1632da7f033dSHerbert Xu 			.hash = {
1633da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
1634da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
1635da7f033dSHerbert Xu 			}
1636da7f033dSHerbert Xu 		}
1637da7f033dSHerbert Xu 	}, {
1638da7f033dSHerbert Xu 		.alg = "wp384",
1639da7f033dSHerbert Xu 		.test = alg_test_hash,
1640da7f033dSHerbert Xu 		.suite = {
1641da7f033dSHerbert Xu 			.hash = {
1642da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
1643da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
1644da7f033dSHerbert Xu 			}
1645da7f033dSHerbert Xu 		}
1646da7f033dSHerbert Xu 	}, {
1647da7f033dSHerbert Xu 		.alg = "wp512",
1648da7f033dSHerbert Xu 		.test = alg_test_hash,
1649da7f033dSHerbert Xu 		.suite = {
1650da7f033dSHerbert Xu 			.hash = {
1651da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
1652da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
1653da7f033dSHerbert Xu 			}
1654da7f033dSHerbert Xu 		}
1655da7f033dSHerbert Xu 	}, {
1656da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
1657da7f033dSHerbert Xu 		.test = alg_test_hash,
1658da7f033dSHerbert Xu 		.suite = {
1659da7f033dSHerbert Xu 			.hash = {
1660da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
1661da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
1662da7f033dSHerbert Xu 			}
1663da7f033dSHerbert Xu 		}
1664da7f033dSHerbert Xu 	}, {
1665da7f033dSHerbert Xu 		.alg = "xts(aes)",
1666da7f033dSHerbert Xu 		.test = alg_test_cipher,
1667da7f033dSHerbert Xu 		.suite = {
1668da7f033dSHerbert Xu 			.cipher = {
1669da7f033dSHerbert Xu 				.enc = {
1670da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
1671da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
1672da7f033dSHerbert Xu 				},
1673da7f033dSHerbert Xu 				.dec = {
1674da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
1675da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
1676da7f033dSHerbert Xu 				}
1677da7f033dSHerbert Xu 			}
1678da7f033dSHerbert Xu 		}
1679da7f033dSHerbert Xu 	}
1680da7f033dSHerbert Xu };
1681da7f033dSHerbert Xu 
1682da7f033dSHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
1683da7f033dSHerbert Xu {
1684da7f033dSHerbert Xu 	int start = 0;
1685da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
1686da7f033dSHerbert Xu 
1687da7f033dSHerbert Xu 	while (start < end) {
1688da7f033dSHerbert Xu 		int i = (start + end) / 2;
1689da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
1690da7f033dSHerbert Xu 
1691da7f033dSHerbert Xu 		if (diff > 0) {
1692da7f033dSHerbert Xu 			end = i;
1693da7f033dSHerbert Xu 			continue;
1694da7f033dSHerbert Xu 		}
1695da7f033dSHerbert Xu 
1696da7f033dSHerbert Xu 		if (diff < 0) {
1697da7f033dSHerbert Xu 			start = i + 1;
1698da7f033dSHerbert Xu 			continue;
1699da7f033dSHerbert Xu 		}
1700da7f033dSHerbert Xu 
1701da7f033dSHerbert Xu 		return alg_test_descs[i].test(alg_test_descs + i, driver,
1702da7f033dSHerbert Xu 					      type, mask);
1703da7f033dSHerbert Xu 	}
1704da7f033dSHerbert Xu 
1705da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
1706da7f033dSHerbert Xu 	return 0;
1707da7f033dSHerbert Xu }
1708da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
1709da7f033dSHerbert Xu 
1710da7f033dSHerbert Xu int __init testmgr_init(void)
1711da7f033dSHerbert Xu {
1712da7f033dSHerbert Xu 	int i;
1713da7f033dSHerbert Xu 
1714da7f033dSHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
1715da7f033dSHerbert Xu 		xbuf[i] = (void *)__get_free_page(GFP_KERNEL);
1716da7f033dSHerbert Xu 		if (!xbuf[i])
1717da7f033dSHerbert Xu 			goto err_free_xbuf;
1718da7f033dSHerbert Xu 	}
1719da7f033dSHerbert Xu 
1720da7f033dSHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
1721da7f033dSHerbert Xu 		axbuf[i] = (void *)__get_free_page(GFP_KERNEL);
1722da7f033dSHerbert Xu 		if (!axbuf[i])
1723da7f033dSHerbert Xu 			goto err_free_axbuf;
1724da7f033dSHerbert Xu 	}
1725da7f033dSHerbert Xu 
1726da7f033dSHerbert Xu 	return 0;
1727da7f033dSHerbert Xu 
1728da7f033dSHerbert Xu err_free_axbuf:
1729da7f033dSHerbert Xu 	for (i = 0; i < XBUFSIZE && axbuf[i]; i++)
1730da7f033dSHerbert Xu 		free_page((unsigned long)axbuf[i]);
1731da7f033dSHerbert Xu err_free_xbuf:
1732da7f033dSHerbert Xu 	for (i = 0; i < XBUFSIZE && xbuf[i]; i++)
1733da7f033dSHerbert Xu 		free_page((unsigned long)xbuf[i]);
1734da7f033dSHerbert Xu 
1735da7f033dSHerbert Xu 	return -ENOMEM;
1736da7f033dSHerbert Xu }
1737da7f033dSHerbert Xu 
1738da7f033dSHerbert Xu void testmgr_exit(void)
1739da7f033dSHerbert Xu {
1740da7f033dSHerbert Xu 	int i;
1741da7f033dSHerbert Xu 
1742da7f033dSHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
1743da7f033dSHerbert Xu 		free_page((unsigned long)axbuf[i]);
1744da7f033dSHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
1745da7f033dSHerbert Xu 		free_page((unsigned long)xbuf[i]);
1746da7f033dSHerbert Xu }
1747