xref: /openbmc/linux/crypto/testmgr.c (revision af2b76b5)
1da7f033dSHerbert Xu /*
2da7f033dSHerbert Xu  * Algorithm testing framework and tests.
3da7f033dSHerbert Xu  *
4da7f033dSHerbert Xu  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
5da7f033dSHerbert Xu  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
6da7f033dSHerbert Xu  * Copyright (c) 2007 Nokia Siemens Networks
7da7f033dSHerbert Xu  * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
8da7f033dSHerbert Xu  *
969435b94SAdrian Hoban  * Updated RFC4106 AES-GCM testing.
1069435b94SAdrian Hoban  *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
1169435b94SAdrian Hoban  *             Adrian Hoban <adrian.hoban@intel.com>
1269435b94SAdrian Hoban  *             Gabriele Paoloni <gabriele.paoloni@intel.com>
1369435b94SAdrian Hoban  *             Tadeusz Struk (tadeusz.struk@intel.com)
1469435b94SAdrian Hoban  *    Copyright (c) 2010, Intel Corporation.
1569435b94SAdrian Hoban  *
16da7f033dSHerbert Xu  * This program is free software; you can redistribute it and/or modify it
17da7f033dSHerbert Xu  * under the terms of the GNU General Public License as published by the Free
18da7f033dSHerbert Xu  * Software Foundation; either version 2 of the License, or (at your option)
19da7f033dSHerbert Xu  * any later version.
20da7f033dSHerbert Xu  *
21da7f033dSHerbert Xu  */
22da7f033dSHerbert Xu 
231ce33115SHerbert Xu #include <crypto/aead.h>
24da7f033dSHerbert Xu #include <crypto/hash.h>
25da7f033dSHerbert Xu #include <linux/err.h>
261c41b882SHerbert Xu #include <linux/fips.h>
27da7f033dSHerbert Xu #include <linux/module.h>
28da7f033dSHerbert Xu #include <linux/scatterlist.h>
29da7f033dSHerbert Xu #include <linux/slab.h>
30da7f033dSHerbert Xu #include <linux/string.h>
317647d6ceSJarod Wilson #include <crypto/rng.h>
3264d1cdfbSStephan Mueller #include <crypto/drbg.h>
33da7f033dSHerbert Xu 
34da7f033dSHerbert Xu #include "internal.h"
350b767f96SAlexander Shishkin 
36326a6346SHerbert Xu #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
370b767f96SAlexander Shishkin 
380b767f96SAlexander Shishkin /* a perfect nop */
390b767f96SAlexander Shishkin int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
400b767f96SAlexander Shishkin {
410b767f96SAlexander Shishkin 	return 0;
420b767f96SAlexander Shishkin }
430b767f96SAlexander Shishkin 
440b767f96SAlexander Shishkin #else
450b767f96SAlexander Shishkin 
46da7f033dSHerbert Xu #include "testmgr.h"
47da7f033dSHerbert Xu 
48da7f033dSHerbert Xu /*
49da7f033dSHerbert Xu  * Need slab memory for testing (size in number of pages).
50da7f033dSHerbert Xu  */
51da7f033dSHerbert Xu #define XBUFSIZE	8
52da7f033dSHerbert Xu 
53da7f033dSHerbert Xu /*
54da7f033dSHerbert Xu  * Indexes into the xbuf to simulate cross-page access.
55da7f033dSHerbert Xu  */
56da7f033dSHerbert Xu #define IDX1		32
57da7f033dSHerbert Xu #define IDX2		32400
58da7f033dSHerbert Xu #define IDX3		1
59da7f033dSHerbert Xu #define IDX4		8193
60da7f033dSHerbert Xu #define IDX5		22222
61da7f033dSHerbert Xu #define IDX6		17101
62da7f033dSHerbert Xu #define IDX7		27333
63da7f033dSHerbert Xu #define IDX8		3000
64da7f033dSHerbert Xu 
65da7f033dSHerbert Xu /*
66da7f033dSHerbert Xu * Used by test_cipher()
67da7f033dSHerbert Xu */
68da7f033dSHerbert Xu #define ENCRYPT 1
69da7f033dSHerbert Xu #define DECRYPT 0
70da7f033dSHerbert Xu 
71da7f033dSHerbert Xu struct tcrypt_result {
72da7f033dSHerbert Xu 	struct completion completion;
73da7f033dSHerbert Xu 	int err;
74da7f033dSHerbert Xu };
75da7f033dSHerbert Xu 
76da7f033dSHerbert Xu struct aead_test_suite {
77da7f033dSHerbert Xu 	struct {
78da7f033dSHerbert Xu 		struct aead_testvec *vecs;
79da7f033dSHerbert Xu 		unsigned int count;
80da7f033dSHerbert Xu 	} enc, dec;
81da7f033dSHerbert Xu };
82da7f033dSHerbert Xu 
83da7f033dSHerbert Xu struct cipher_test_suite {
84da7f033dSHerbert Xu 	struct {
85da7f033dSHerbert Xu 		struct cipher_testvec *vecs;
86da7f033dSHerbert Xu 		unsigned int count;
87da7f033dSHerbert Xu 	} enc, dec;
88da7f033dSHerbert Xu };
89da7f033dSHerbert Xu 
90da7f033dSHerbert Xu struct comp_test_suite {
91da7f033dSHerbert Xu 	struct {
92da7f033dSHerbert Xu 		struct comp_testvec *vecs;
93da7f033dSHerbert Xu 		unsigned int count;
94da7f033dSHerbert Xu 	} comp, decomp;
95da7f033dSHerbert Xu };
96da7f033dSHerbert Xu 
978064efb8SGeert Uytterhoeven struct pcomp_test_suite {
988064efb8SGeert Uytterhoeven 	struct {
998064efb8SGeert Uytterhoeven 		struct pcomp_testvec *vecs;
1008064efb8SGeert Uytterhoeven 		unsigned int count;
1018064efb8SGeert Uytterhoeven 	} comp, decomp;
1028064efb8SGeert Uytterhoeven };
1038064efb8SGeert Uytterhoeven 
104da7f033dSHerbert Xu struct hash_test_suite {
105da7f033dSHerbert Xu 	struct hash_testvec *vecs;
106da7f033dSHerbert Xu 	unsigned int count;
107da7f033dSHerbert Xu };
108da7f033dSHerbert Xu 
1097647d6ceSJarod Wilson struct cprng_test_suite {
1107647d6ceSJarod Wilson 	struct cprng_testvec *vecs;
1117647d6ceSJarod Wilson 	unsigned int count;
1127647d6ceSJarod Wilson };
1137647d6ceSJarod Wilson 
11464d1cdfbSStephan Mueller struct drbg_test_suite {
11564d1cdfbSStephan Mueller 	struct drbg_testvec *vecs;
11664d1cdfbSStephan Mueller 	unsigned int count;
11764d1cdfbSStephan Mueller };
11864d1cdfbSStephan Mueller 
119da7f033dSHerbert Xu struct alg_test_desc {
120da7f033dSHerbert Xu 	const char *alg;
121da7f033dSHerbert Xu 	int (*test)(const struct alg_test_desc *desc, const char *driver,
122da7f033dSHerbert Xu 		    u32 type, u32 mask);
123a1915d51SJarod Wilson 	int fips_allowed;	/* set if alg is allowed in fips mode */
124da7f033dSHerbert Xu 
125da7f033dSHerbert Xu 	union {
126da7f033dSHerbert Xu 		struct aead_test_suite aead;
127da7f033dSHerbert Xu 		struct cipher_test_suite cipher;
128da7f033dSHerbert Xu 		struct comp_test_suite comp;
1298064efb8SGeert Uytterhoeven 		struct pcomp_test_suite pcomp;
130da7f033dSHerbert Xu 		struct hash_test_suite hash;
1317647d6ceSJarod Wilson 		struct cprng_test_suite cprng;
13264d1cdfbSStephan Mueller 		struct drbg_test_suite drbg;
133da7f033dSHerbert Xu 	} suite;
134da7f033dSHerbert Xu };
135da7f033dSHerbert Xu 
136da7f033dSHerbert Xu static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
137da7f033dSHerbert Xu 
138da7f033dSHerbert Xu static void hexdump(unsigned char *buf, unsigned int len)
139da7f033dSHerbert Xu {
140da7f033dSHerbert Xu 	print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
141da7f033dSHerbert Xu 			16, 1,
142da7f033dSHerbert Xu 			buf, len, false);
143da7f033dSHerbert Xu }
144da7f033dSHerbert Xu 
145da7f033dSHerbert Xu static void tcrypt_complete(struct crypto_async_request *req, int err)
146da7f033dSHerbert Xu {
147da7f033dSHerbert Xu 	struct tcrypt_result *res = req->data;
148da7f033dSHerbert Xu 
149da7f033dSHerbert Xu 	if (err == -EINPROGRESS)
150da7f033dSHerbert Xu 		return;
151da7f033dSHerbert Xu 
152da7f033dSHerbert Xu 	res->err = err;
153da7f033dSHerbert Xu 	complete(&res->completion);
154da7f033dSHerbert Xu }
155da7f033dSHerbert Xu 
156f8b0d4d0SHerbert Xu static int testmgr_alloc_buf(char *buf[XBUFSIZE])
157f8b0d4d0SHerbert Xu {
158f8b0d4d0SHerbert Xu 	int i;
159f8b0d4d0SHerbert Xu 
160f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++) {
161f8b0d4d0SHerbert Xu 		buf[i] = (void *)__get_free_page(GFP_KERNEL);
162f8b0d4d0SHerbert Xu 		if (!buf[i])
163f8b0d4d0SHerbert Xu 			goto err_free_buf;
164f8b0d4d0SHerbert Xu 	}
165f8b0d4d0SHerbert Xu 
166f8b0d4d0SHerbert Xu 	return 0;
167f8b0d4d0SHerbert Xu 
168f8b0d4d0SHerbert Xu err_free_buf:
169f8b0d4d0SHerbert Xu 	while (i-- > 0)
170f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
171f8b0d4d0SHerbert Xu 
172f8b0d4d0SHerbert Xu 	return -ENOMEM;
173f8b0d4d0SHerbert Xu }
174f8b0d4d0SHerbert Xu 
175f8b0d4d0SHerbert Xu static void testmgr_free_buf(char *buf[XBUFSIZE])
176f8b0d4d0SHerbert Xu {
177f8b0d4d0SHerbert Xu 	int i;
178f8b0d4d0SHerbert Xu 
179f8b0d4d0SHerbert Xu 	for (i = 0; i < XBUFSIZE; i++)
180f8b0d4d0SHerbert Xu 		free_page((unsigned long)buf[i]);
181f8b0d4d0SHerbert Xu }
182f8b0d4d0SHerbert Xu 
183d4c85f9bSCristian Stoica static int wait_async_op(struct tcrypt_result *tr, int ret)
184a8f1a052SDavid S. Miller {
185a8f1a052SDavid S. Miller 	if (ret == -EINPROGRESS || ret == -EBUSY) {
1868a45ac12SRabin Vincent 		wait_for_completion(&tr->completion);
18716735d02SWolfram Sang 		reinit_completion(&tr->completion);
1888a45ac12SRabin Vincent 		ret = tr->err;
189a8f1a052SDavid S. Miller 	}
190a8f1a052SDavid S. Miller 	return ret;
191a8f1a052SDavid S. Miller }
192a8f1a052SDavid S. Miller 
193da5ffe11SJussi Kivilinna static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
194da5ffe11SJussi Kivilinna 		       unsigned int tcount, bool use_digest,
195da5ffe11SJussi Kivilinna 		       const int align_offset)
196da7f033dSHerbert Xu {
197da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
198da7f033dSHerbert Xu 	unsigned int i, j, k, temp;
199da7f033dSHerbert Xu 	struct scatterlist sg[8];
20029b77e5dSHoria Geanta 	char *result;
20129b77e5dSHoria Geanta 	char *key;
202da7f033dSHerbert Xu 	struct ahash_request *req;
203da7f033dSHerbert Xu 	struct tcrypt_result tresult;
204da7f033dSHerbert Xu 	void *hash_buff;
205f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
206f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
207f8b0d4d0SHerbert Xu 
20829b77e5dSHoria Geanta 	result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
20929b77e5dSHoria Geanta 	if (!result)
21029b77e5dSHoria Geanta 		return ret;
21129b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
21229b77e5dSHoria Geanta 	if (!key)
21329b77e5dSHoria Geanta 		goto out_nobuf;
214f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
215f8b0d4d0SHerbert Xu 		goto out_nobuf;
216da7f033dSHerbert Xu 
217da7f033dSHerbert Xu 	init_completion(&tresult.completion);
218da7f033dSHerbert Xu 
219da7f033dSHerbert Xu 	req = ahash_request_alloc(tfm, GFP_KERNEL);
220da7f033dSHerbert Xu 	if (!req) {
221da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to allocate request for "
222da7f033dSHerbert Xu 		       "%s\n", algo);
223da7f033dSHerbert Xu 		goto out_noreq;
224da7f033dSHerbert Xu 	}
225da7f033dSHerbert Xu 	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
226da7f033dSHerbert Xu 				   tcrypt_complete, &tresult);
227da7f033dSHerbert Xu 
228a0cfae59SHerbert Xu 	j = 0;
229da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
230a0cfae59SHerbert Xu 		if (template[i].np)
231a0cfae59SHerbert Xu 			continue;
232a0cfae59SHerbert Xu 
233da5ffe11SJussi Kivilinna 		ret = -EINVAL;
234da5ffe11SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
235da5ffe11SJussi Kivilinna 			goto out;
236da5ffe11SJussi Kivilinna 
237a0cfae59SHerbert Xu 		j++;
23829b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
239da7f033dSHerbert Xu 
240da7f033dSHerbert Xu 		hash_buff = xbuf[0];
241da5ffe11SJussi Kivilinna 		hash_buff += align_offset;
242da7f033dSHerbert Xu 
243da7f033dSHerbert Xu 		memcpy(hash_buff, template[i].plaintext, template[i].psize);
244da7f033dSHerbert Xu 		sg_init_one(&sg[0], hash_buff, template[i].psize);
245da7f033dSHerbert Xu 
246da7f033dSHerbert Xu 		if (template[i].ksize) {
247da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
24829b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
24929b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
25029b77e5dSHoria Geanta 				       j, algo, template[i].ksize, MAX_KEYLEN);
25129b77e5dSHoria Geanta 				ret = -EINVAL;
25229b77e5dSHoria Geanta 				goto out;
25329b77e5dSHoria Geanta 			}
25429b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
25529b77e5dSHoria Geanta 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
256da7f033dSHerbert Xu 			if (ret) {
257da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey failed on "
258a0cfae59SHerbert Xu 				       "test %d for %s: ret=%d\n", j, algo,
259da7f033dSHerbert Xu 				       -ret);
260da7f033dSHerbert Xu 				goto out;
261da7f033dSHerbert Xu 			}
262da7f033dSHerbert Xu 		}
263da7f033dSHerbert Xu 
264da7f033dSHerbert Xu 		ahash_request_set_crypt(req, sg, result, template[i].psize);
265a8f1a052SDavid S. Miller 		if (use_digest) {
266d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_digest(req));
267a8f1a052SDavid S. Miller 			if (ret) {
268a8f1a052SDavid S. Miller 				pr_err("alg: hash: digest failed on test %d "
269a0cfae59SHerbert Xu 				       "for %s: ret=%d\n", j, algo, -ret);
270da7f033dSHerbert Xu 				goto out;
271da7f033dSHerbert Xu 			}
272a8f1a052SDavid S. Miller 		} else {
273d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_init(req));
274a8f1a052SDavid S. Miller 			if (ret) {
275a8f1a052SDavid S. Miller 				pr_err("alt: hash: init failed on test %d "
276a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
277a8f1a052SDavid S. Miller 				goto out;
278a8f1a052SDavid S. Miller 			}
279d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_update(req));
280a8f1a052SDavid S. Miller 			if (ret) {
281a8f1a052SDavid S. Miller 				pr_err("alt: hash: update failed on test %d "
282a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
283a8f1a052SDavid S. Miller 				goto out;
284a8f1a052SDavid S. Miller 			}
285d4c85f9bSCristian Stoica 			ret = wait_async_op(&tresult, crypto_ahash_final(req));
286a8f1a052SDavid S. Miller 			if (ret) {
287a8f1a052SDavid S. Miller 				pr_err("alt: hash: final failed on test %d "
288a8f1a052SDavid S. Miller 				       "for %s: ret=%d\n", j, algo, -ret);
289a8f1a052SDavid S. Miller 				goto out;
290a8f1a052SDavid S. Miller 			}
291a8f1a052SDavid S. Miller 		}
292da7f033dSHerbert Xu 
293da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
294da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
295da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
296a0cfae59SHerbert Xu 			       j, algo);
297da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
298da7f033dSHerbert Xu 			ret = -EINVAL;
299da7f033dSHerbert Xu 			goto out;
300da7f033dSHerbert Xu 		}
301da7f033dSHerbert Xu 	}
302da7f033dSHerbert Xu 
303da7f033dSHerbert Xu 	j = 0;
304da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
305da5ffe11SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
306da5ffe11SJussi Kivilinna 		if (align_offset != 0)
307da5ffe11SJussi Kivilinna 			break;
308da5ffe11SJussi Kivilinna 
3095f2b424eSCristian Stoica 		if (!template[i].np)
3105f2b424eSCristian Stoica 			continue;
3115f2b424eSCristian Stoica 
312da7f033dSHerbert Xu 		j++;
31329b77e5dSHoria Geanta 		memset(result, 0, MAX_DIGEST_SIZE);
314da7f033dSHerbert Xu 
315da7f033dSHerbert Xu 		temp = 0;
316da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
317fd57f22aSHerbert Xu 		ret = -EINVAL;
318da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
319fd57f22aSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
320fd57f22aSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
321fd57f22aSHerbert Xu 				goto out;
322da7f033dSHerbert Xu 			sg_set_buf(&sg[k],
323da7f033dSHerbert Xu 				   memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
324da7f033dSHerbert Xu 					  offset_in_page(IDX[k]),
325da7f033dSHerbert Xu 					  template[i].plaintext + temp,
326da7f033dSHerbert Xu 					  template[i].tap[k]),
327da7f033dSHerbert Xu 				   template[i].tap[k]);
328da7f033dSHerbert Xu 			temp += template[i].tap[k];
329da7f033dSHerbert Xu 		}
330da7f033dSHerbert Xu 
331da7f033dSHerbert Xu 		if (template[i].ksize) {
33229b77e5dSHoria Geanta 			if (template[i].ksize > MAX_KEYLEN) {
33329b77e5dSHoria Geanta 				pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
3345f2b424eSCristian Stoica 				       j, algo, template[i].ksize, MAX_KEYLEN);
33529b77e5dSHoria Geanta 				ret = -EINVAL;
33629b77e5dSHoria Geanta 				goto out;
33729b77e5dSHoria Geanta 			}
338da7f033dSHerbert Xu 			crypto_ahash_clear_flags(tfm, ~0);
33929b77e5dSHoria Geanta 			memcpy(key, template[i].key, template[i].ksize);
3405f2b424eSCristian Stoica 			ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
341da7f033dSHerbert Xu 
342da7f033dSHerbert Xu 			if (ret) {
343da7f033dSHerbert Xu 				printk(KERN_ERR "alg: hash: setkey "
344da7f033dSHerbert Xu 				       "failed on chunking test %d "
3455f2b424eSCristian Stoica 				       "for %s: ret=%d\n", j, algo, -ret);
346da7f033dSHerbert Xu 				goto out;
347da7f033dSHerbert Xu 			}
348da7f033dSHerbert Xu 		}
349da7f033dSHerbert Xu 
3505f2b424eSCristian Stoica 		ahash_request_set_crypt(req, sg, result, template[i].psize);
351da7f033dSHerbert Xu 		ret = crypto_ahash_digest(req);
352da7f033dSHerbert Xu 		switch (ret) {
353da7f033dSHerbert Xu 		case 0:
354da7f033dSHerbert Xu 			break;
355da7f033dSHerbert Xu 		case -EINPROGRESS:
356da7f033dSHerbert Xu 		case -EBUSY:
3578a45ac12SRabin Vincent 			wait_for_completion(&tresult.completion);
35816735d02SWolfram Sang 			reinit_completion(&tresult.completion);
3598a45ac12SRabin Vincent 			ret = tresult.err;
3608a45ac12SRabin Vincent 			if (!ret)
361da7f033dSHerbert Xu 				break;
362da7f033dSHerbert Xu 			/* fall through */
363da7f033dSHerbert Xu 		default:
364da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: digest failed "
365da7f033dSHerbert Xu 			       "on chunking test %d for %s: "
366da7f033dSHerbert Xu 			       "ret=%d\n", j, algo, -ret);
367da7f033dSHerbert Xu 			goto out;
368da7f033dSHerbert Xu 		}
369da7f033dSHerbert Xu 
370da7f033dSHerbert Xu 		if (memcmp(result, template[i].digest,
371da7f033dSHerbert Xu 			   crypto_ahash_digestsize(tfm))) {
372da7f033dSHerbert Xu 			printk(KERN_ERR "alg: hash: Chunking test %d "
373da7f033dSHerbert Xu 			       "failed for %s\n", j, algo);
374da7f033dSHerbert Xu 			hexdump(result, crypto_ahash_digestsize(tfm));
375da7f033dSHerbert Xu 			ret = -EINVAL;
376da7f033dSHerbert Xu 			goto out;
377da7f033dSHerbert Xu 		}
378da7f033dSHerbert Xu 	}
379da7f033dSHerbert Xu 
380da7f033dSHerbert Xu 	ret = 0;
381da7f033dSHerbert Xu 
382da7f033dSHerbert Xu out:
383da7f033dSHerbert Xu 	ahash_request_free(req);
384da7f033dSHerbert Xu out_noreq:
385f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
386f8b0d4d0SHerbert Xu out_nobuf:
38729b77e5dSHoria Geanta 	kfree(key);
38829b77e5dSHoria Geanta 	kfree(result);
389da7f033dSHerbert Xu 	return ret;
390da7f033dSHerbert Xu }
391da7f033dSHerbert Xu 
392da5ffe11SJussi Kivilinna static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
393da5ffe11SJussi Kivilinna 		     unsigned int tcount, bool use_digest)
394da5ffe11SJussi Kivilinna {
395da5ffe11SJussi Kivilinna 	unsigned int alignmask;
396da5ffe11SJussi Kivilinna 	int ret;
397da5ffe11SJussi Kivilinna 
398da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 0);
399da5ffe11SJussi Kivilinna 	if (ret)
400da5ffe11SJussi Kivilinna 		return ret;
401da5ffe11SJussi Kivilinna 
402da5ffe11SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
403da5ffe11SJussi Kivilinna 	ret = __test_hash(tfm, template, tcount, use_digest, 1);
404da5ffe11SJussi Kivilinna 	if (ret)
405da5ffe11SJussi Kivilinna 		return ret;
406da5ffe11SJussi Kivilinna 
407da5ffe11SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
408da5ffe11SJussi Kivilinna 	if (alignmask) {
409da5ffe11SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
410da5ffe11SJussi Kivilinna 		ret = __test_hash(tfm, template, tcount, use_digest,
411da5ffe11SJussi Kivilinna 				  alignmask + 1);
412da5ffe11SJussi Kivilinna 		if (ret)
413da5ffe11SJussi Kivilinna 			return ret;
414da5ffe11SJussi Kivilinna 	}
415da5ffe11SJussi Kivilinna 
416da5ffe11SJussi Kivilinna 	return 0;
417da5ffe11SJussi Kivilinna }
418da5ffe11SJussi Kivilinna 
419d8a32ac2SJussi Kivilinna static int __test_aead(struct crypto_aead *tfm, int enc,
420d8a32ac2SJussi Kivilinna 		       struct aead_testvec *template, unsigned int tcount,
42158dcf548SJussi Kivilinna 		       const bool diff_dst, const int align_offset)
422da7f033dSHerbert Xu {
423da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
424da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
425f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
426da7f033dSHerbert Xu 	char *q;
427da7f033dSHerbert Xu 	char *key;
428da7f033dSHerbert Xu 	struct aead_request *req;
429d8a32ac2SJussi Kivilinna 	struct scatterlist *sg;
430d8a32ac2SJussi Kivilinna 	struct scatterlist *sgout;
431d8a32ac2SJussi Kivilinna 	const char *e, *d;
432da7f033dSHerbert Xu 	struct tcrypt_result result;
433424a5da6SCristian Stoica 	unsigned int authsize, iv_len;
434da7f033dSHerbert Xu 	void *input;
435d8a32ac2SJussi Kivilinna 	void *output;
436da7f033dSHerbert Xu 	void *assoc;
4379bac019dSTadeusz Struk 	char *iv;
438f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
439d8a32ac2SJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
440f8b0d4d0SHerbert Xu 	char *axbuf[XBUFSIZE];
441f8b0d4d0SHerbert Xu 
4429bac019dSTadeusz Struk 	iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
4439bac019dSTadeusz Struk 	if (!iv)
4449bac019dSTadeusz Struk 		return ret;
44529b77e5dSHoria Geanta 	key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
44629b77e5dSHoria Geanta 	if (!key)
44729b77e5dSHoria Geanta 		goto out_noxbuf;
448f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
449f8b0d4d0SHerbert Xu 		goto out_noxbuf;
450f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(axbuf))
451f8b0d4d0SHerbert Xu 		goto out_noaxbuf;
452d8a32ac2SJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
453d8a32ac2SJussi Kivilinna 		goto out_nooutbuf;
454d8a32ac2SJussi Kivilinna 
455d8a32ac2SJussi Kivilinna 	/* avoid "the frame size is larger than 1024 bytes" compiler warning */
4568a525fcdSHerbert Xu 	sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
457d8a32ac2SJussi Kivilinna 	if (!sg)
458d8a32ac2SJussi Kivilinna 		goto out_nosg;
4598a525fcdSHerbert Xu 	sgout = &sg[16];
460d8a32ac2SJussi Kivilinna 
461d8a32ac2SJussi Kivilinna 	if (diff_dst)
462d8a32ac2SJussi Kivilinna 		d = "-ddst";
463d8a32ac2SJussi Kivilinna 	else
464d8a32ac2SJussi Kivilinna 		d = "";
465d8a32ac2SJussi Kivilinna 
466da7f033dSHerbert Xu 	if (enc == ENCRYPT)
467da7f033dSHerbert Xu 		e = "encryption";
468da7f033dSHerbert Xu 	else
469da7f033dSHerbert Xu 		e = "decryption";
470da7f033dSHerbert Xu 
471da7f033dSHerbert Xu 	init_completion(&result.completion);
472da7f033dSHerbert Xu 
473da7f033dSHerbert Xu 	req = aead_request_alloc(tfm, GFP_KERNEL);
474da7f033dSHerbert Xu 	if (!req) {
475d8a32ac2SJussi Kivilinna 		pr_err("alg: aead%s: Failed to allocate request for %s\n",
476d8a32ac2SJussi Kivilinna 		       d, algo);
477da7f033dSHerbert Xu 		goto out;
478da7f033dSHerbert Xu 	}
479da7f033dSHerbert Xu 
480da7f033dSHerbert Xu 	aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
481da7f033dSHerbert Xu 				  tcrypt_complete, &result);
482da7f033dSHerbert Xu 
483da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
48405b1d338SCristian Stoica 		if (template[i].np)
48505b1d338SCristian Stoica 			continue;
48605b1d338SCristian Stoica 
487da7f033dSHerbert Xu 		j++;
488da7f033dSHerbert Xu 
48958dcf548SJussi Kivilinna 		/* some templates have no input data but they will
490da7f033dSHerbert Xu 		 * touch input
491da7f033dSHerbert Xu 		 */
492da7f033dSHerbert Xu 		input = xbuf[0];
49358dcf548SJussi Kivilinna 		input += align_offset;
494da7f033dSHerbert Xu 		assoc = axbuf[0];
495da7f033dSHerbert Xu 
496fd57f22aSHerbert Xu 		ret = -EINVAL;
49758dcf548SJussi Kivilinna 		if (WARN_ON(align_offset + template[i].ilen >
49858dcf548SJussi Kivilinna 			    PAGE_SIZE || template[i].alen > PAGE_SIZE))
499fd57f22aSHerbert Xu 			goto out;
500fd57f22aSHerbert Xu 
501da7f033dSHerbert Xu 		memcpy(input, template[i].input, template[i].ilen);
502da7f033dSHerbert Xu 		memcpy(assoc, template[i].assoc, template[i].alen);
503424a5da6SCristian Stoica 		iv_len = crypto_aead_ivsize(tfm);
504da7f033dSHerbert Xu 		if (template[i].iv)
505424a5da6SCristian Stoica 			memcpy(iv, template[i].iv, iv_len);
506da7f033dSHerbert Xu 		else
507424a5da6SCristian Stoica 			memset(iv, 0, iv_len);
508da7f033dSHerbert Xu 
509da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
510da7f033dSHerbert Xu 		if (template[i].wk)
51105b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
512da7f033dSHerbert Xu 
51329b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
51429b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
51529b77e5dSHoria Geanta 			       d, j, algo, template[i].klen,
51629b77e5dSHoria Geanta 			       MAX_KEYLEN);
51729b77e5dSHoria Geanta 			ret = -EINVAL;
51829b77e5dSHoria Geanta 			goto out;
51929b77e5dSHoria Geanta 		}
52029b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
521da7f033dSHerbert Xu 
52205b1d338SCristian Stoica 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
523da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
524d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
525d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
526da7f033dSHerbert Xu 			goto out;
527da7f033dSHerbert Xu 		} else if (ret)
528da7f033dSHerbert Xu 			continue;
529da7f033dSHerbert Xu 
530da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
531da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
532da7f033dSHerbert Xu 		if (ret) {
533d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
534d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
535da7f033dSHerbert Xu 			goto out;
536da7f033dSHerbert Xu 		}
537da7f033dSHerbert Xu 
5388a525fcdSHerbert Xu 		k = !!template[i].alen;
5398a525fcdSHerbert Xu 		sg_init_table(sg, k + 1);
5408a525fcdSHerbert Xu 		sg_set_buf(&sg[0], assoc, template[i].alen);
5418a525fcdSHerbert Xu 		sg_set_buf(&sg[k], input,
54205b1d338SCristian Stoica 			   template[i].ilen + (enc ? authsize : 0));
543d8a32ac2SJussi Kivilinna 		output = input;
544d8a32ac2SJussi Kivilinna 
5458a525fcdSHerbert Xu 		if (diff_dst) {
5468a525fcdSHerbert Xu 			sg_init_table(sgout, k + 1);
5478a525fcdSHerbert Xu 			sg_set_buf(&sgout[0], assoc, template[i].alen);
5488a525fcdSHerbert Xu 
5498a525fcdSHerbert Xu 			output = xoutbuf[0];
5508a525fcdSHerbert Xu 			output += align_offset;
5518a525fcdSHerbert Xu 			sg_set_buf(&sgout[k], output,
5528a525fcdSHerbert Xu 				   template[i].rlen + (enc ? 0 : authsize));
5538a525fcdSHerbert Xu 		}
554da7f033dSHerbert Xu 
555d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
556da7f033dSHerbert Xu 				       template[i].ilen, iv);
557da7f033dSHerbert Xu 
5588a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
559da7f033dSHerbert Xu 
56005b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
561da7f033dSHerbert Xu 
562da7f033dSHerbert Xu 		switch (ret) {
563da7f033dSHerbert Xu 		case 0:
564e44a1b44SJarod Wilson 			if (template[i].novrfy) {
565e44a1b44SJarod Wilson 				/* verification was supposed to fail */
566d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
567d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
568e44a1b44SJarod Wilson 				/* so really, we got a bad message */
569e44a1b44SJarod Wilson 				ret = -EBADMSG;
570e44a1b44SJarod Wilson 				goto out;
571e44a1b44SJarod Wilson 			}
572da7f033dSHerbert Xu 			break;
573da7f033dSHerbert Xu 		case -EINPROGRESS:
574da7f033dSHerbert Xu 		case -EBUSY:
5758a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
57616735d02SWolfram Sang 			reinit_completion(&result.completion);
5778a45ac12SRabin Vincent 			ret = result.err;
5788a45ac12SRabin Vincent 			if (!ret)
579da7f033dSHerbert Xu 				break;
580e44a1b44SJarod Wilson 		case -EBADMSG:
581e44a1b44SJarod Wilson 			if (template[i].novrfy)
582e44a1b44SJarod Wilson 				/* verification failure was expected */
583e44a1b44SJarod Wilson 				continue;
584da7f033dSHerbert Xu 			/* fall through */
585da7f033dSHerbert Xu 		default:
586d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
587d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
588da7f033dSHerbert Xu 			goto out;
589da7f033dSHerbert Xu 		}
590da7f033dSHerbert Xu 
591d8a32ac2SJussi Kivilinna 		q = output;
592da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
593d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Test %d failed on %s for %s\n",
594d8a32ac2SJussi Kivilinna 			       d, j, e, algo);
595da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
596da7f033dSHerbert Xu 			ret = -EINVAL;
597da7f033dSHerbert Xu 			goto out;
598da7f033dSHerbert Xu 		}
599da7f033dSHerbert Xu 	}
600da7f033dSHerbert Xu 
601da7f033dSHerbert Xu 	for (i = 0, j = 0; i < tcount; i++) {
60258dcf548SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
60358dcf548SJussi Kivilinna 		if (align_offset != 0)
60458dcf548SJussi Kivilinna 			break;
60558dcf548SJussi Kivilinna 
60605b1d338SCristian Stoica 		if (!template[i].np)
60705b1d338SCristian Stoica 			continue;
60805b1d338SCristian Stoica 
609da7f033dSHerbert Xu 		j++;
610da7f033dSHerbert Xu 
611da7f033dSHerbert Xu 		if (template[i].iv)
612da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
613da7f033dSHerbert Xu 		else
614da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
615da7f033dSHerbert Xu 
616da7f033dSHerbert Xu 		crypto_aead_clear_flags(tfm, ~0);
617da7f033dSHerbert Xu 		if (template[i].wk)
61805b1d338SCristian Stoica 			crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
61929b77e5dSHoria Geanta 		if (template[i].klen > MAX_KEYLEN) {
62029b77e5dSHoria Geanta 			pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
62105b1d338SCristian Stoica 			       d, j, algo, template[i].klen, MAX_KEYLEN);
62229b77e5dSHoria Geanta 			ret = -EINVAL;
62329b77e5dSHoria Geanta 			goto out;
62429b77e5dSHoria Geanta 		}
62529b77e5dSHoria Geanta 		memcpy(key, template[i].key, template[i].klen);
626da7f033dSHerbert Xu 
627da7f033dSHerbert Xu 		ret = crypto_aead_setkey(tfm, key, template[i].klen);
628da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
629d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
630d8a32ac2SJussi Kivilinna 			       d, j, algo, crypto_aead_get_flags(tfm));
631da7f033dSHerbert Xu 			goto out;
632da7f033dSHerbert Xu 		} else if (ret)
633da7f033dSHerbert Xu 			continue;
634da7f033dSHerbert Xu 
635da7f033dSHerbert Xu 		authsize = abs(template[i].rlen - template[i].ilen);
636da7f033dSHerbert Xu 
637da7f033dSHerbert Xu 		ret = -EINVAL;
6388a525fcdSHerbert Xu 		sg_init_table(sg, template[i].anp + template[i].np);
639d8a32ac2SJussi Kivilinna 		if (diff_dst)
6408a525fcdSHerbert Xu 			sg_init_table(sgout, template[i].anp + template[i].np);
6418a525fcdSHerbert Xu 
6428a525fcdSHerbert Xu 		ret = -EINVAL;
6438a525fcdSHerbert Xu 		for (k = 0, temp = 0; k < template[i].anp; k++) {
6448a525fcdSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
6458a525fcdSHerbert Xu 				    template[i].atap[k] > PAGE_SIZE))
6468a525fcdSHerbert Xu 				goto out;
6478a525fcdSHerbert Xu 			sg_set_buf(&sg[k],
6488a525fcdSHerbert Xu 				   memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
6498a525fcdSHerbert Xu 					  offset_in_page(IDX[k]),
6508a525fcdSHerbert Xu 					  template[i].assoc + temp,
6518a525fcdSHerbert Xu 					  template[i].atap[k]),
6528a525fcdSHerbert Xu 				   template[i].atap[k]);
6538a525fcdSHerbert Xu 			if (diff_dst)
6548a525fcdSHerbert Xu 				sg_set_buf(&sgout[k],
6558a525fcdSHerbert Xu 					   axbuf[IDX[k] >> PAGE_SHIFT] +
6568a525fcdSHerbert Xu 					   offset_in_page(IDX[k]),
6578a525fcdSHerbert Xu 					   template[i].atap[k]);
6588a525fcdSHerbert Xu 			temp += template[i].atap[k];
6598a525fcdSHerbert Xu 		}
6608a525fcdSHerbert Xu 
661da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
662da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
663da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
664da7f033dSHerbert Xu 				goto out;
665da7f033dSHerbert Xu 
66605b1d338SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
66705b1d338SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
6688a525fcdSHerbert Xu 			sg_set_buf(&sg[template[i].anp + k],
6698a525fcdSHerbert Xu 				   q, template[i].tap[k]);
670d8a32ac2SJussi Kivilinna 
671d8a32ac2SJussi Kivilinna 			if (diff_dst) {
672d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
673d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
674d8a32ac2SJussi Kivilinna 
675d8a32ac2SJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
676d8a32ac2SJussi Kivilinna 
6778a525fcdSHerbert Xu 				sg_set_buf(&sgout[template[i].anp + k],
6788a525fcdSHerbert Xu 					   q, template[i].tap[k]);
679d8a32ac2SJussi Kivilinna 			}
680d8a32ac2SJussi Kivilinna 
6818ec25c51SHoria Geanta 			n = template[i].tap[k];
6828ec25c51SHoria Geanta 			if (k == template[i].np - 1 && enc)
6838ec25c51SHoria Geanta 				n += authsize;
6848ec25c51SHoria Geanta 			if (offset_in_page(q) + n < PAGE_SIZE)
6858ec25c51SHoria Geanta 				q[n] = 0;
6868ec25c51SHoria Geanta 
687da7f033dSHerbert Xu 			temp += template[i].tap[k];
688da7f033dSHerbert Xu 		}
689da7f033dSHerbert Xu 
690da7f033dSHerbert Xu 		ret = crypto_aead_setauthsize(tfm, authsize);
691da7f033dSHerbert Xu 		if (ret) {
692d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
693d8a32ac2SJussi Kivilinna 			       d, authsize, j, algo);
694da7f033dSHerbert Xu 			goto out;
695da7f033dSHerbert Xu 		}
696da7f033dSHerbert Xu 
697da7f033dSHerbert Xu 		if (enc) {
6988a525fcdSHerbert Xu 			if (WARN_ON(sg[template[i].anp + k - 1].offset +
6998a525fcdSHerbert Xu 				    sg[template[i].anp + k - 1].length +
7008a525fcdSHerbert Xu 				    authsize > PAGE_SIZE)) {
701da7f033dSHerbert Xu 				ret = -EINVAL;
702da7f033dSHerbert Xu 				goto out;
703da7f033dSHerbert Xu 			}
704da7f033dSHerbert Xu 
705d8a32ac2SJussi Kivilinna 			if (diff_dst)
7068a525fcdSHerbert Xu 				sgout[template[i].anp + k - 1].length +=
7078a525fcdSHerbert Xu 					authsize;
7088a525fcdSHerbert Xu 			sg[template[i].anp + k - 1].length += authsize;
709da7f033dSHerbert Xu 		}
710da7f033dSHerbert Xu 
711d8a32ac2SJussi Kivilinna 		aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
712da7f033dSHerbert Xu 				       template[i].ilen,
713da7f033dSHerbert Xu 				       iv);
714da7f033dSHerbert Xu 
7158a525fcdSHerbert Xu 		aead_request_set_ad(req, template[i].alen);
716da7f033dSHerbert Xu 
71705b1d338SCristian Stoica 		ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
718da7f033dSHerbert Xu 
719da7f033dSHerbert Xu 		switch (ret) {
720da7f033dSHerbert Xu 		case 0:
721e44a1b44SJarod Wilson 			if (template[i].novrfy) {
722e44a1b44SJarod Wilson 				/* verification was supposed to fail */
723d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
724d8a32ac2SJussi Kivilinna 				       d, e, j, algo);
725e44a1b44SJarod Wilson 				/* so really, we got a bad message */
726e44a1b44SJarod Wilson 				ret = -EBADMSG;
727e44a1b44SJarod Wilson 				goto out;
728e44a1b44SJarod Wilson 			}
729da7f033dSHerbert Xu 			break;
730da7f033dSHerbert Xu 		case -EINPROGRESS:
731da7f033dSHerbert Xu 		case -EBUSY:
7328a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
73316735d02SWolfram Sang 			reinit_completion(&result.completion);
7348a45ac12SRabin Vincent 			ret = result.err;
7358a45ac12SRabin Vincent 			if (!ret)
736da7f033dSHerbert Xu 				break;
737e44a1b44SJarod Wilson 		case -EBADMSG:
738e44a1b44SJarod Wilson 			if (template[i].novrfy)
739e44a1b44SJarod Wilson 				/* verification failure was expected */
740e44a1b44SJarod Wilson 				continue;
741da7f033dSHerbert Xu 			/* fall through */
742da7f033dSHerbert Xu 		default:
743d8a32ac2SJussi Kivilinna 			pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
744d8a32ac2SJussi Kivilinna 			       d, e, j, algo, -ret);
745da7f033dSHerbert Xu 			goto out;
746da7f033dSHerbert Xu 		}
747da7f033dSHerbert Xu 
748da7f033dSHerbert Xu 		ret = -EINVAL;
749da7f033dSHerbert Xu 		for (k = 0, temp = 0; k < template[i].np; k++) {
750d8a32ac2SJussi Kivilinna 			if (diff_dst)
751d8a32ac2SJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
752d8a32ac2SJussi Kivilinna 				    offset_in_page(IDX[k]);
753d8a32ac2SJussi Kivilinna 			else
754da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
755da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
756da7f033dSHerbert Xu 
757da7f033dSHerbert Xu 			n = template[i].tap[k];
758da7f033dSHerbert Xu 			if (k == template[i].np - 1)
759da7f033dSHerbert Xu 				n += enc ? authsize : -authsize;
760da7f033dSHerbert Xu 
761da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp, n)) {
762d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
763d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo);
764da7f033dSHerbert Xu 				hexdump(q, n);
765da7f033dSHerbert Xu 				goto out;
766da7f033dSHerbert Xu 			}
767da7f033dSHerbert Xu 
768da7f033dSHerbert Xu 			q += n;
769da7f033dSHerbert Xu 			if (k == template[i].np - 1 && !enc) {
770d8a32ac2SJussi Kivilinna 				if (!diff_dst &&
771d8a32ac2SJussi Kivilinna 					memcmp(q, template[i].input +
772da7f033dSHerbert Xu 					      temp + n, authsize))
773da7f033dSHerbert Xu 					n = authsize;
774da7f033dSHerbert Xu 				else
775da7f033dSHerbert Xu 					n = 0;
776da7f033dSHerbert Xu 			} else {
77705b1d338SCristian Stoica 				for (n = 0; offset_in_page(q + n) && q[n]; n++)
778da7f033dSHerbert Xu 					;
779da7f033dSHerbert Xu 			}
780da7f033dSHerbert Xu 			if (n) {
781d8a32ac2SJussi Kivilinna 				pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
782d8a32ac2SJussi Kivilinna 				       d, j, e, k, algo, n);
783da7f033dSHerbert Xu 				hexdump(q, n);
784da7f033dSHerbert Xu 				goto out;
785da7f033dSHerbert Xu 			}
786da7f033dSHerbert Xu 
787da7f033dSHerbert Xu 			temp += template[i].tap[k];
788da7f033dSHerbert Xu 		}
789da7f033dSHerbert Xu 	}
790da7f033dSHerbert Xu 
791da7f033dSHerbert Xu 	ret = 0;
792da7f033dSHerbert Xu 
793da7f033dSHerbert Xu out:
794da7f033dSHerbert Xu 	aead_request_free(req);
795d8a32ac2SJussi Kivilinna 	kfree(sg);
796d8a32ac2SJussi Kivilinna out_nosg:
797d8a32ac2SJussi Kivilinna 	if (diff_dst)
798d8a32ac2SJussi Kivilinna 		testmgr_free_buf(xoutbuf);
799d8a32ac2SJussi Kivilinna out_nooutbuf:
800f8b0d4d0SHerbert Xu 	testmgr_free_buf(axbuf);
801f8b0d4d0SHerbert Xu out_noaxbuf:
802f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
803f8b0d4d0SHerbert Xu out_noxbuf:
80429b77e5dSHoria Geanta 	kfree(key);
8059bac019dSTadeusz Struk 	kfree(iv);
806da7f033dSHerbert Xu 	return ret;
807da7f033dSHerbert Xu }
808da7f033dSHerbert Xu 
809d8a32ac2SJussi Kivilinna static int test_aead(struct crypto_aead *tfm, int enc,
810d8a32ac2SJussi Kivilinna 		     struct aead_testvec *template, unsigned int tcount)
811d8a32ac2SJussi Kivilinna {
81258dcf548SJussi Kivilinna 	unsigned int alignmask;
813d8a32ac2SJussi Kivilinna 	int ret;
814d8a32ac2SJussi Kivilinna 
815d8a32ac2SJussi Kivilinna 	/* test 'dst == src' case */
81658dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, false, 0);
817d8a32ac2SJussi Kivilinna 	if (ret)
818d8a32ac2SJussi Kivilinna 		return ret;
819d8a32ac2SJussi Kivilinna 
820d8a32ac2SJussi Kivilinna 	/* test 'dst != src' case */
82158dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 0);
82258dcf548SJussi Kivilinna 	if (ret)
82358dcf548SJussi Kivilinna 		return ret;
82458dcf548SJussi Kivilinna 
82558dcf548SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
82658dcf548SJussi Kivilinna 	ret = __test_aead(tfm, enc, template, tcount, true, 1);
82758dcf548SJussi Kivilinna 	if (ret)
82858dcf548SJussi Kivilinna 		return ret;
82958dcf548SJussi Kivilinna 
83058dcf548SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
83158dcf548SJussi Kivilinna 	if (alignmask) {
83258dcf548SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
83358dcf548SJussi Kivilinna 		ret = __test_aead(tfm, enc, template, tcount, true,
83458dcf548SJussi Kivilinna 				  alignmask + 1);
83558dcf548SJussi Kivilinna 		if (ret)
83658dcf548SJussi Kivilinna 			return ret;
83758dcf548SJussi Kivilinna 	}
83858dcf548SJussi Kivilinna 
83958dcf548SJussi Kivilinna 	return 0;
840d8a32ac2SJussi Kivilinna }
841d8a32ac2SJussi Kivilinna 
8421aa4ecd9SHerbert Xu static int test_cipher(struct crypto_cipher *tfm, int enc,
8431aa4ecd9SHerbert Xu 		       struct cipher_testvec *template, unsigned int tcount)
8441aa4ecd9SHerbert Xu {
8451aa4ecd9SHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
8461aa4ecd9SHerbert Xu 	unsigned int i, j, k;
8471aa4ecd9SHerbert Xu 	char *q;
8481aa4ecd9SHerbert Xu 	const char *e;
8491aa4ecd9SHerbert Xu 	void *data;
850f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
851f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
852f8b0d4d0SHerbert Xu 
853f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
854f8b0d4d0SHerbert Xu 		goto out_nobuf;
8551aa4ecd9SHerbert Xu 
8561aa4ecd9SHerbert Xu 	if (enc == ENCRYPT)
8571aa4ecd9SHerbert Xu 	        e = "encryption";
8581aa4ecd9SHerbert Xu 	else
8591aa4ecd9SHerbert Xu 		e = "decryption";
8601aa4ecd9SHerbert Xu 
8611aa4ecd9SHerbert Xu 	j = 0;
8621aa4ecd9SHerbert Xu 	for (i = 0; i < tcount; i++) {
8631aa4ecd9SHerbert Xu 		if (template[i].np)
8641aa4ecd9SHerbert Xu 			continue;
8651aa4ecd9SHerbert Xu 
8661aa4ecd9SHerbert Xu 		j++;
8671aa4ecd9SHerbert Xu 
868fd57f22aSHerbert Xu 		ret = -EINVAL;
869fd57f22aSHerbert Xu 		if (WARN_ON(template[i].ilen > PAGE_SIZE))
870fd57f22aSHerbert Xu 			goto out;
871fd57f22aSHerbert Xu 
8721aa4ecd9SHerbert Xu 		data = xbuf[0];
8731aa4ecd9SHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
8741aa4ecd9SHerbert Xu 
8751aa4ecd9SHerbert Xu 		crypto_cipher_clear_flags(tfm, ~0);
8761aa4ecd9SHerbert Xu 		if (template[i].wk)
8771aa4ecd9SHerbert Xu 			crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
8781aa4ecd9SHerbert Xu 
8791aa4ecd9SHerbert Xu 		ret = crypto_cipher_setkey(tfm, template[i].key,
8801aa4ecd9SHerbert Xu 					   template[i].klen);
8811aa4ecd9SHerbert Xu 		if (!ret == template[i].fail) {
8821aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: setkey failed "
8831aa4ecd9SHerbert Xu 			       "on test %d for %s: flags=%x\n", j,
8841aa4ecd9SHerbert Xu 			       algo, crypto_cipher_get_flags(tfm));
8851aa4ecd9SHerbert Xu 			goto out;
8861aa4ecd9SHerbert Xu 		} else if (ret)
8871aa4ecd9SHerbert Xu 			continue;
8881aa4ecd9SHerbert Xu 
8891aa4ecd9SHerbert Xu 		for (k = 0; k < template[i].ilen;
8901aa4ecd9SHerbert Xu 		     k += crypto_cipher_blocksize(tfm)) {
8911aa4ecd9SHerbert Xu 			if (enc)
8921aa4ecd9SHerbert Xu 				crypto_cipher_encrypt_one(tfm, data + k,
8931aa4ecd9SHerbert Xu 							  data + k);
8941aa4ecd9SHerbert Xu 			else
8951aa4ecd9SHerbert Xu 				crypto_cipher_decrypt_one(tfm, data + k,
8961aa4ecd9SHerbert Xu 							  data + k);
8971aa4ecd9SHerbert Xu 		}
8981aa4ecd9SHerbert Xu 
8991aa4ecd9SHerbert Xu 		q = data;
9001aa4ecd9SHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
9011aa4ecd9SHerbert Xu 			printk(KERN_ERR "alg: cipher: Test %d failed "
9021aa4ecd9SHerbert Xu 			       "on %s for %s\n", j, e, algo);
9031aa4ecd9SHerbert Xu 			hexdump(q, template[i].rlen);
9041aa4ecd9SHerbert Xu 			ret = -EINVAL;
9051aa4ecd9SHerbert Xu 			goto out;
9061aa4ecd9SHerbert Xu 		}
9071aa4ecd9SHerbert Xu 	}
9081aa4ecd9SHerbert Xu 
9091aa4ecd9SHerbert Xu 	ret = 0;
9101aa4ecd9SHerbert Xu 
9111aa4ecd9SHerbert Xu out:
912f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
913f8b0d4d0SHerbert Xu out_nobuf:
9141aa4ecd9SHerbert Xu 	return ret;
9151aa4ecd9SHerbert Xu }
9161aa4ecd9SHerbert Xu 
91708d6af8cSJussi Kivilinna static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc,
91808d6af8cSJussi Kivilinna 			   struct cipher_testvec *template, unsigned int tcount,
9193a338f20SJussi Kivilinna 			   const bool diff_dst, const int align_offset)
920da7f033dSHerbert Xu {
921da7f033dSHerbert Xu 	const char *algo =
922da7f033dSHerbert Xu 		crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
923da7f033dSHerbert Xu 	unsigned int i, j, k, n, temp;
924da7f033dSHerbert Xu 	char *q;
925da7f033dSHerbert Xu 	struct ablkcipher_request *req;
926da7f033dSHerbert Xu 	struct scatterlist sg[8];
92708d6af8cSJussi Kivilinna 	struct scatterlist sgout[8];
92808d6af8cSJussi Kivilinna 	const char *e, *d;
929da7f033dSHerbert Xu 	struct tcrypt_result result;
930da7f033dSHerbert Xu 	void *data;
931da7f033dSHerbert Xu 	char iv[MAX_IVLEN];
932f8b0d4d0SHerbert Xu 	char *xbuf[XBUFSIZE];
93308d6af8cSJussi Kivilinna 	char *xoutbuf[XBUFSIZE];
934f8b0d4d0SHerbert Xu 	int ret = -ENOMEM;
935f8b0d4d0SHerbert Xu 
936f8b0d4d0SHerbert Xu 	if (testmgr_alloc_buf(xbuf))
937f8b0d4d0SHerbert Xu 		goto out_nobuf;
938da7f033dSHerbert Xu 
93908d6af8cSJussi Kivilinna 	if (diff_dst && testmgr_alloc_buf(xoutbuf))
94008d6af8cSJussi Kivilinna 		goto out_nooutbuf;
94108d6af8cSJussi Kivilinna 
94208d6af8cSJussi Kivilinna 	if (diff_dst)
94308d6af8cSJussi Kivilinna 		d = "-ddst";
94408d6af8cSJussi Kivilinna 	else
94508d6af8cSJussi Kivilinna 		d = "";
94608d6af8cSJussi Kivilinna 
947da7f033dSHerbert Xu 	if (enc == ENCRYPT)
948da7f033dSHerbert Xu 	        e = "encryption";
949da7f033dSHerbert Xu 	else
950da7f033dSHerbert Xu 		e = "decryption";
951da7f033dSHerbert Xu 
952da7f033dSHerbert Xu 	init_completion(&result.completion);
953da7f033dSHerbert Xu 
954da7f033dSHerbert Xu 	req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
955da7f033dSHerbert Xu 	if (!req) {
95608d6af8cSJussi Kivilinna 		pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
95708d6af8cSJussi Kivilinna 		       d, algo);
958da7f033dSHerbert Xu 		goto out;
959da7f033dSHerbert Xu 	}
960da7f033dSHerbert Xu 
961da7f033dSHerbert Xu 	ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
962da7f033dSHerbert Xu 					tcrypt_complete, &result);
963da7f033dSHerbert Xu 
964da7f033dSHerbert Xu 	j = 0;
965da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
966bbb9a7ddSCristian Stoica 		if (template[i].np && !template[i].also_non_np)
967bbb9a7ddSCristian Stoica 			continue;
968bbb9a7ddSCristian Stoica 
969da7f033dSHerbert Xu 		if (template[i].iv)
970da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
971da7f033dSHerbert Xu 		else
972da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
973da7f033dSHerbert Xu 
974da7f033dSHerbert Xu 		j++;
975fd57f22aSHerbert Xu 		ret = -EINVAL;
976a1aa44a2SCristian Stoica 		if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
977fd57f22aSHerbert Xu 			goto out;
978fd57f22aSHerbert Xu 
979da7f033dSHerbert Xu 		data = xbuf[0];
9803a338f20SJussi Kivilinna 		data += align_offset;
981da7f033dSHerbert Xu 		memcpy(data, template[i].input, template[i].ilen);
982da7f033dSHerbert Xu 
983da7f033dSHerbert Xu 		crypto_ablkcipher_clear_flags(tfm, ~0);
984da7f033dSHerbert Xu 		if (template[i].wk)
985a1aa44a2SCristian Stoica 			crypto_ablkcipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
986da7f033dSHerbert Xu 
987da7f033dSHerbert Xu 		ret = crypto_ablkcipher_setkey(tfm, template[i].key,
988da7f033dSHerbert Xu 					       template[i].klen);
989da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
99008d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
991a1aa44a2SCristian Stoica 			       d, j, algo, crypto_ablkcipher_get_flags(tfm));
992da7f033dSHerbert Xu 			goto out;
993da7f033dSHerbert Xu 		} else if (ret)
994da7f033dSHerbert Xu 			continue;
995da7f033dSHerbert Xu 
996da7f033dSHerbert Xu 		sg_init_one(&sg[0], data, template[i].ilen);
99708d6af8cSJussi Kivilinna 		if (diff_dst) {
99808d6af8cSJussi Kivilinna 			data = xoutbuf[0];
9993a338f20SJussi Kivilinna 			data += align_offset;
100008d6af8cSJussi Kivilinna 			sg_init_one(&sgout[0], data, template[i].ilen);
100108d6af8cSJussi Kivilinna 		}
1002da7f033dSHerbert Xu 
1003a1aa44a2SCristian Stoica 		ablkcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1004da7f033dSHerbert Xu 					     template[i].ilen, iv);
1005a1aa44a2SCristian Stoica 		ret = enc ? crypto_ablkcipher_encrypt(req) :
1006da7f033dSHerbert Xu 			    crypto_ablkcipher_decrypt(req);
1007da7f033dSHerbert Xu 
1008da7f033dSHerbert Xu 		switch (ret) {
1009da7f033dSHerbert Xu 		case 0:
1010da7f033dSHerbert Xu 			break;
1011da7f033dSHerbert Xu 		case -EINPROGRESS:
1012da7f033dSHerbert Xu 		case -EBUSY:
10138a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
101416735d02SWolfram Sang 			reinit_completion(&result.completion);
10158a45ac12SRabin Vincent 			ret = result.err;
10168a45ac12SRabin Vincent 			if (!ret)
1017da7f033dSHerbert Xu 				break;
1018da7f033dSHerbert Xu 			/* fall through */
1019da7f033dSHerbert Xu 		default:
102008d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
102108d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1022da7f033dSHerbert Xu 			goto out;
1023da7f033dSHerbert Xu 		}
1024da7f033dSHerbert Xu 
1025da7f033dSHerbert Xu 		q = data;
1026da7f033dSHerbert Xu 		if (memcmp(q, template[i].result, template[i].rlen)) {
102708d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: Test %d failed on %s for %s\n",
102808d6af8cSJussi Kivilinna 			       d, j, e, algo);
1029da7f033dSHerbert Xu 			hexdump(q, template[i].rlen);
1030da7f033dSHerbert Xu 			ret = -EINVAL;
1031da7f033dSHerbert Xu 			goto out;
1032da7f033dSHerbert Xu 		}
1033da7f033dSHerbert Xu 	}
1034da7f033dSHerbert Xu 
1035da7f033dSHerbert Xu 	j = 0;
1036da7f033dSHerbert Xu 	for (i = 0; i < tcount; i++) {
10373a338f20SJussi Kivilinna 		/* alignment tests are only done with continuous buffers */
10383a338f20SJussi Kivilinna 		if (align_offset != 0)
10393a338f20SJussi Kivilinna 			break;
1040da7f033dSHerbert Xu 
1041bbb9a7ddSCristian Stoica 		if (!template[i].np)
1042bbb9a7ddSCristian Stoica 			continue;
1043bbb9a7ddSCristian Stoica 
1044da7f033dSHerbert Xu 		if (template[i].iv)
1045da7f033dSHerbert Xu 			memcpy(iv, template[i].iv, MAX_IVLEN);
1046da7f033dSHerbert Xu 		else
1047da7f033dSHerbert Xu 			memset(iv, 0, MAX_IVLEN);
1048da7f033dSHerbert Xu 
1049da7f033dSHerbert Xu 		j++;
1050da7f033dSHerbert Xu 		crypto_ablkcipher_clear_flags(tfm, ~0);
1051da7f033dSHerbert Xu 		if (template[i].wk)
1052a1aa44a2SCristian Stoica 			crypto_ablkcipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
1053da7f033dSHerbert Xu 
1054da7f033dSHerbert Xu 		ret = crypto_ablkcipher_setkey(tfm, template[i].key,
1055da7f033dSHerbert Xu 					       template[i].klen);
1056da7f033dSHerbert Xu 		if (!ret == template[i].fail) {
105708d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
1058a1aa44a2SCristian Stoica 			       d, j, algo, crypto_ablkcipher_get_flags(tfm));
1059da7f033dSHerbert Xu 			goto out;
1060da7f033dSHerbert Xu 		} else if (ret)
1061da7f033dSHerbert Xu 			continue;
1062da7f033dSHerbert Xu 
1063da7f033dSHerbert Xu 		temp = 0;
1064da7f033dSHerbert Xu 		ret = -EINVAL;
1065da7f033dSHerbert Xu 		sg_init_table(sg, template[i].np);
106608d6af8cSJussi Kivilinna 		if (diff_dst)
106708d6af8cSJussi Kivilinna 			sg_init_table(sgout, template[i].np);
1068da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
1069da7f033dSHerbert Xu 			if (WARN_ON(offset_in_page(IDX[k]) +
1070da7f033dSHerbert Xu 				    template[i].tap[k] > PAGE_SIZE))
1071da7f033dSHerbert Xu 				goto out;
1072da7f033dSHerbert Xu 
1073a1aa44a2SCristian Stoica 			q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
1074da7f033dSHerbert Xu 
1075a1aa44a2SCristian Stoica 			memcpy(q, template[i].input + temp, template[i].tap[k]);
1076da7f033dSHerbert Xu 
1077a1aa44a2SCristian Stoica 			if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
1078da7f033dSHerbert Xu 				q[template[i].tap[k]] = 0;
1079da7f033dSHerbert Xu 
1080da7f033dSHerbert Xu 			sg_set_buf(&sg[k], q, template[i].tap[k]);
108108d6af8cSJussi Kivilinna 			if (diff_dst) {
108208d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
108308d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
108408d6af8cSJussi Kivilinna 
1085a1aa44a2SCristian Stoica 				sg_set_buf(&sgout[k], q, template[i].tap[k]);
108608d6af8cSJussi Kivilinna 
108708d6af8cSJussi Kivilinna 				memset(q, 0, template[i].tap[k]);
108808d6af8cSJussi Kivilinna 				if (offset_in_page(q) +
108908d6af8cSJussi Kivilinna 				    template[i].tap[k] < PAGE_SIZE)
109008d6af8cSJussi Kivilinna 					q[template[i].tap[k]] = 0;
109108d6af8cSJussi Kivilinna 			}
1092da7f033dSHerbert Xu 
1093da7f033dSHerbert Xu 			temp += template[i].tap[k];
1094da7f033dSHerbert Xu 		}
1095da7f033dSHerbert Xu 
1096a1aa44a2SCristian Stoica 		ablkcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
1097da7f033dSHerbert Xu 					     template[i].ilen, iv);
1098da7f033dSHerbert Xu 
1099a1aa44a2SCristian Stoica 		ret = enc ? crypto_ablkcipher_encrypt(req) :
1100da7f033dSHerbert Xu 			    crypto_ablkcipher_decrypt(req);
1101da7f033dSHerbert Xu 
1102da7f033dSHerbert Xu 		switch (ret) {
1103da7f033dSHerbert Xu 		case 0:
1104da7f033dSHerbert Xu 			break;
1105da7f033dSHerbert Xu 		case -EINPROGRESS:
1106da7f033dSHerbert Xu 		case -EBUSY:
11078a45ac12SRabin Vincent 			wait_for_completion(&result.completion);
110816735d02SWolfram Sang 			reinit_completion(&result.completion);
11098a45ac12SRabin Vincent 			ret = result.err;
11108a45ac12SRabin Vincent 			if (!ret)
1111da7f033dSHerbert Xu 				break;
1112da7f033dSHerbert Xu 			/* fall through */
1113da7f033dSHerbert Xu 		default:
111408d6af8cSJussi Kivilinna 			pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
111508d6af8cSJussi Kivilinna 			       d, e, j, algo, -ret);
1116da7f033dSHerbert Xu 			goto out;
1117da7f033dSHerbert Xu 		}
1118da7f033dSHerbert Xu 
1119da7f033dSHerbert Xu 		temp = 0;
1120da7f033dSHerbert Xu 		ret = -EINVAL;
1121da7f033dSHerbert Xu 		for (k = 0; k < template[i].np; k++) {
112208d6af8cSJussi Kivilinna 			if (diff_dst)
112308d6af8cSJussi Kivilinna 				q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
112408d6af8cSJussi Kivilinna 				    offset_in_page(IDX[k]);
112508d6af8cSJussi Kivilinna 			else
1126da7f033dSHerbert Xu 				q = xbuf[IDX[k] >> PAGE_SHIFT] +
1127da7f033dSHerbert Xu 				    offset_in_page(IDX[k]);
1128da7f033dSHerbert Xu 
1129da7f033dSHerbert Xu 			if (memcmp(q, template[i].result + temp,
1130da7f033dSHerbert Xu 				   template[i].tap[k])) {
113108d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
113208d6af8cSJussi Kivilinna 				       d, j, e, k, algo);
1133da7f033dSHerbert Xu 				hexdump(q, template[i].tap[k]);
1134da7f033dSHerbert Xu 				goto out;
1135da7f033dSHerbert Xu 			}
1136da7f033dSHerbert Xu 
1137da7f033dSHerbert Xu 			q += template[i].tap[k];
1138da7f033dSHerbert Xu 			for (n = 0; offset_in_page(q + n) && q[n]; n++)
1139da7f033dSHerbert Xu 				;
1140da7f033dSHerbert Xu 			if (n) {
114108d6af8cSJussi Kivilinna 				pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
114208d6af8cSJussi Kivilinna 				       d, j, e, k, algo, n);
1143da7f033dSHerbert Xu 				hexdump(q, n);
1144da7f033dSHerbert Xu 				goto out;
1145da7f033dSHerbert Xu 			}
1146da7f033dSHerbert Xu 			temp += template[i].tap[k];
1147da7f033dSHerbert Xu 		}
1148da7f033dSHerbert Xu 	}
1149da7f033dSHerbert Xu 
1150da7f033dSHerbert Xu 	ret = 0;
1151da7f033dSHerbert Xu 
1152da7f033dSHerbert Xu out:
1153da7f033dSHerbert Xu 	ablkcipher_request_free(req);
115408d6af8cSJussi Kivilinna 	if (diff_dst)
115508d6af8cSJussi Kivilinna 		testmgr_free_buf(xoutbuf);
115608d6af8cSJussi Kivilinna out_nooutbuf:
1157f8b0d4d0SHerbert Xu 	testmgr_free_buf(xbuf);
1158f8b0d4d0SHerbert Xu out_nobuf:
1159da7f033dSHerbert Xu 	return ret;
1160da7f033dSHerbert Xu }
1161da7f033dSHerbert Xu 
116208d6af8cSJussi Kivilinna static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
116308d6af8cSJussi Kivilinna 			 struct cipher_testvec *template, unsigned int tcount)
116408d6af8cSJussi Kivilinna {
11653a338f20SJussi Kivilinna 	unsigned int alignmask;
116608d6af8cSJussi Kivilinna 	int ret;
116708d6af8cSJussi Kivilinna 
116808d6af8cSJussi Kivilinna 	/* test 'dst == src' case */
11693a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
117008d6af8cSJussi Kivilinna 	if (ret)
117108d6af8cSJussi Kivilinna 		return ret;
117208d6af8cSJussi Kivilinna 
117308d6af8cSJussi Kivilinna 	/* test 'dst != src' case */
11743a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
11753a338f20SJussi Kivilinna 	if (ret)
11763a338f20SJussi Kivilinna 		return ret;
11773a338f20SJussi Kivilinna 
11783a338f20SJussi Kivilinna 	/* test unaligned buffers, check with one byte offset */
11793a338f20SJussi Kivilinna 	ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
11803a338f20SJussi Kivilinna 	if (ret)
11813a338f20SJussi Kivilinna 		return ret;
11823a338f20SJussi Kivilinna 
11833a338f20SJussi Kivilinna 	alignmask = crypto_tfm_alg_alignmask(&tfm->base);
11843a338f20SJussi Kivilinna 	if (alignmask) {
11853a338f20SJussi Kivilinna 		/* Check if alignment mask for tfm is correctly set. */
11863a338f20SJussi Kivilinna 		ret = __test_skcipher(tfm, enc, template, tcount, true,
11873a338f20SJussi Kivilinna 				      alignmask + 1);
11883a338f20SJussi Kivilinna 		if (ret)
11893a338f20SJussi Kivilinna 			return ret;
11903a338f20SJussi Kivilinna 	}
11913a338f20SJussi Kivilinna 
11923a338f20SJussi Kivilinna 	return 0;
119308d6af8cSJussi Kivilinna }
119408d6af8cSJussi Kivilinna 
1195da7f033dSHerbert Xu static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
1196da7f033dSHerbert Xu 		     struct comp_testvec *dtemplate, int ctcount, int dtcount)
1197da7f033dSHerbert Xu {
1198da7f033dSHerbert Xu 	const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
1199da7f033dSHerbert Xu 	unsigned int i;
1200da7f033dSHerbert Xu 	char result[COMP_BUF_SIZE];
1201da7f033dSHerbert Xu 	int ret;
1202da7f033dSHerbert Xu 
1203da7f033dSHerbert Xu 	for (i = 0; i < ctcount; i++) {
1204c79cf910SGeert Uytterhoeven 		int ilen;
1205c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1206da7f033dSHerbert Xu 
1207da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1208da7f033dSHerbert Xu 
1209da7f033dSHerbert Xu 		ilen = ctemplate[i].inlen;
1210da7f033dSHerbert Xu 		ret = crypto_comp_compress(tfm, ctemplate[i].input,
1211da7f033dSHerbert Xu 		                           ilen, result, &dlen);
1212da7f033dSHerbert Xu 		if (ret) {
1213da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: compression failed "
1214da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1215da7f033dSHerbert Xu 			       -ret);
1216da7f033dSHerbert Xu 			goto out;
1217da7f033dSHerbert Xu 		}
1218da7f033dSHerbert Xu 
1219b812eb00SGeert Uytterhoeven 		if (dlen != ctemplate[i].outlen) {
1220b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Compression test %d "
1221b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1222b812eb00SGeert Uytterhoeven 			       dlen);
1223b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1224b812eb00SGeert Uytterhoeven 			goto out;
1225b812eb00SGeert Uytterhoeven 		}
1226b812eb00SGeert Uytterhoeven 
1227da7f033dSHerbert Xu 		if (memcmp(result, ctemplate[i].output, dlen)) {
1228da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Compression test %d "
1229da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1230da7f033dSHerbert Xu 			hexdump(result, dlen);
1231da7f033dSHerbert Xu 			ret = -EINVAL;
1232da7f033dSHerbert Xu 			goto out;
1233da7f033dSHerbert Xu 		}
1234da7f033dSHerbert Xu 	}
1235da7f033dSHerbert Xu 
1236da7f033dSHerbert Xu 	for (i = 0; i < dtcount; i++) {
1237c79cf910SGeert Uytterhoeven 		int ilen;
1238c79cf910SGeert Uytterhoeven 		unsigned int dlen = COMP_BUF_SIZE;
1239da7f033dSHerbert Xu 
1240da7f033dSHerbert Xu 		memset(result, 0, sizeof (result));
1241da7f033dSHerbert Xu 
1242da7f033dSHerbert Xu 		ilen = dtemplate[i].inlen;
1243da7f033dSHerbert Xu 		ret = crypto_comp_decompress(tfm, dtemplate[i].input,
1244da7f033dSHerbert Xu 		                             ilen, result, &dlen);
1245da7f033dSHerbert Xu 		if (ret) {
1246da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: decompression failed "
1247da7f033dSHerbert Xu 			       "on test %d for %s: ret=%d\n", i + 1, algo,
1248da7f033dSHerbert Xu 			       -ret);
1249da7f033dSHerbert Xu 			goto out;
1250da7f033dSHerbert Xu 		}
1251da7f033dSHerbert Xu 
1252b812eb00SGeert Uytterhoeven 		if (dlen != dtemplate[i].outlen) {
1253b812eb00SGeert Uytterhoeven 			printk(KERN_ERR "alg: comp: Decompression test %d "
1254b812eb00SGeert Uytterhoeven 			       "failed for %s: output len = %d\n", i + 1, algo,
1255b812eb00SGeert Uytterhoeven 			       dlen);
1256b812eb00SGeert Uytterhoeven 			ret = -EINVAL;
1257b812eb00SGeert Uytterhoeven 			goto out;
1258b812eb00SGeert Uytterhoeven 		}
1259b812eb00SGeert Uytterhoeven 
1260da7f033dSHerbert Xu 		if (memcmp(result, dtemplate[i].output, dlen)) {
1261da7f033dSHerbert Xu 			printk(KERN_ERR "alg: comp: Decompression test %d "
1262da7f033dSHerbert Xu 			       "failed for %s\n", i + 1, algo);
1263da7f033dSHerbert Xu 			hexdump(result, dlen);
1264da7f033dSHerbert Xu 			ret = -EINVAL;
1265da7f033dSHerbert Xu 			goto out;
1266da7f033dSHerbert Xu 		}
1267da7f033dSHerbert Xu 	}
1268da7f033dSHerbert Xu 
1269da7f033dSHerbert Xu 	ret = 0;
1270da7f033dSHerbert Xu 
1271da7f033dSHerbert Xu out:
1272da7f033dSHerbert Xu 	return ret;
1273da7f033dSHerbert Xu }
1274da7f033dSHerbert Xu 
12758064efb8SGeert Uytterhoeven static int test_pcomp(struct crypto_pcomp *tfm,
12768064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *ctemplate,
12778064efb8SGeert Uytterhoeven 		      struct pcomp_testvec *dtemplate, int ctcount,
12788064efb8SGeert Uytterhoeven 		      int dtcount)
12798064efb8SGeert Uytterhoeven {
12808064efb8SGeert Uytterhoeven 	const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
12818064efb8SGeert Uytterhoeven 	unsigned int i;
12828064efb8SGeert Uytterhoeven 	char result[COMP_BUF_SIZE];
12833ce858cbSGeert Uytterhoeven 	int res;
12848064efb8SGeert Uytterhoeven 
12858064efb8SGeert Uytterhoeven 	for (i = 0; i < ctcount; i++) {
12868064efb8SGeert Uytterhoeven 		struct comp_request req;
12873ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
12888064efb8SGeert Uytterhoeven 
12893ce858cbSGeert Uytterhoeven 		res = crypto_compress_setup(tfm, ctemplate[i].params,
12908064efb8SGeert Uytterhoeven 					    ctemplate[i].paramsize);
12913ce858cbSGeert Uytterhoeven 		if (res) {
12928064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression setup failed on test "
12933ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
12943ce858cbSGeert Uytterhoeven 			return res;
12958064efb8SGeert Uytterhoeven 		}
12968064efb8SGeert Uytterhoeven 
12973ce858cbSGeert Uytterhoeven 		res = crypto_compress_init(tfm);
12983ce858cbSGeert Uytterhoeven 		if (res) {
12998064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression init failed on test "
13003ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13013ce858cbSGeert Uytterhoeven 			return res;
13028064efb8SGeert Uytterhoeven 		}
13038064efb8SGeert Uytterhoeven 
13048064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
13058064efb8SGeert Uytterhoeven 
13068064efb8SGeert Uytterhoeven 		req.next_in = ctemplate[i].input;
13078064efb8SGeert Uytterhoeven 		req.avail_in = ctemplate[i].inlen / 2;
13088064efb8SGeert Uytterhoeven 		req.next_out = result;
13098064efb8SGeert Uytterhoeven 		req.avail_out = ctemplate[i].outlen / 2;
13108064efb8SGeert Uytterhoeven 
13113ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13123ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13138064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13143ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13153ce858cbSGeert Uytterhoeven 			return res;
13168064efb8SGeert Uytterhoeven 		}
13173ce858cbSGeert Uytterhoeven 		if (res > 0)
13183ce858cbSGeert Uytterhoeven 			produced += res;
13198064efb8SGeert Uytterhoeven 
13208064efb8SGeert Uytterhoeven 		/* Add remaining input data */
13218064efb8SGeert Uytterhoeven 		req.avail_in += (ctemplate[i].inlen + 1) / 2;
13228064efb8SGeert Uytterhoeven 
13233ce858cbSGeert Uytterhoeven 		res = crypto_compress_update(tfm, &req);
13243ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13258064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression update failed on test "
13263ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13273ce858cbSGeert Uytterhoeven 			return res;
13288064efb8SGeert Uytterhoeven 		}
13293ce858cbSGeert Uytterhoeven 		if (res > 0)
13303ce858cbSGeert Uytterhoeven 			produced += res;
13318064efb8SGeert Uytterhoeven 
13328064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
13338064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
13348064efb8SGeert Uytterhoeven 
13353ce858cbSGeert Uytterhoeven 		res = crypto_compress_final(tfm, &req);
13363ce858cbSGeert Uytterhoeven 		if (res < 0) {
13378064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: compression final failed on test "
13383ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13393ce858cbSGeert Uytterhoeven 			return res;
13408064efb8SGeert Uytterhoeven 		}
13413ce858cbSGeert Uytterhoeven 		produced += res;
13428064efb8SGeert Uytterhoeven 
13438064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
13448064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13458064efb8SGeert Uytterhoeven 			       "output len = %d (expected %d)\n", i + 1, algo,
13468064efb8SGeert Uytterhoeven 			       COMP_BUF_SIZE - req.avail_out,
13478064efb8SGeert Uytterhoeven 			       ctemplate[i].outlen);
13488064efb8SGeert Uytterhoeven 			return -EINVAL;
13498064efb8SGeert Uytterhoeven 		}
13508064efb8SGeert Uytterhoeven 
13513ce858cbSGeert Uytterhoeven 		if (produced != ctemplate[i].outlen) {
13523ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Compression test %d failed for %s: "
13533ce858cbSGeert Uytterhoeven 			       "returned len = %u (expected %d)\n", i + 1,
13543ce858cbSGeert Uytterhoeven 			       algo, produced, ctemplate[i].outlen);
13553ce858cbSGeert Uytterhoeven 			return -EINVAL;
13563ce858cbSGeert Uytterhoeven 		}
13573ce858cbSGeert Uytterhoeven 
13588064efb8SGeert Uytterhoeven 		if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
13598064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Compression test %d failed for "
13608064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
13618064efb8SGeert Uytterhoeven 			hexdump(result, ctemplate[i].outlen);
13628064efb8SGeert Uytterhoeven 			return -EINVAL;
13638064efb8SGeert Uytterhoeven 		}
13648064efb8SGeert Uytterhoeven 	}
13658064efb8SGeert Uytterhoeven 
13668064efb8SGeert Uytterhoeven 	for (i = 0; i < dtcount; i++) {
13678064efb8SGeert Uytterhoeven 		struct comp_request req;
13683ce858cbSGeert Uytterhoeven 		unsigned int produced = 0;
13698064efb8SGeert Uytterhoeven 
13703ce858cbSGeert Uytterhoeven 		res = crypto_decompress_setup(tfm, dtemplate[i].params,
13718064efb8SGeert Uytterhoeven 					      dtemplate[i].paramsize);
13723ce858cbSGeert Uytterhoeven 		if (res) {
13738064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression setup failed on "
13743ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13753ce858cbSGeert Uytterhoeven 			return res;
13768064efb8SGeert Uytterhoeven 		}
13778064efb8SGeert Uytterhoeven 
13783ce858cbSGeert Uytterhoeven 		res = crypto_decompress_init(tfm);
13793ce858cbSGeert Uytterhoeven 		if (res) {
13808064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression init failed on test "
13813ce858cbSGeert Uytterhoeven 			       "%d for %s: error=%d\n", i + 1, algo, res);
13823ce858cbSGeert Uytterhoeven 			return res;
13838064efb8SGeert Uytterhoeven 		}
13848064efb8SGeert Uytterhoeven 
13858064efb8SGeert Uytterhoeven 		memset(result, 0, sizeof(result));
13868064efb8SGeert Uytterhoeven 
13878064efb8SGeert Uytterhoeven 		req.next_in = dtemplate[i].input;
13888064efb8SGeert Uytterhoeven 		req.avail_in = dtemplate[i].inlen / 2;
13898064efb8SGeert Uytterhoeven 		req.next_out = result;
13908064efb8SGeert Uytterhoeven 		req.avail_out = dtemplate[i].outlen / 2;
13918064efb8SGeert Uytterhoeven 
13923ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
13933ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
13948064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
13953ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
13963ce858cbSGeert Uytterhoeven 			return res;
13978064efb8SGeert Uytterhoeven 		}
13983ce858cbSGeert Uytterhoeven 		if (res > 0)
13993ce858cbSGeert Uytterhoeven 			produced += res;
14008064efb8SGeert Uytterhoeven 
14018064efb8SGeert Uytterhoeven 		/* Add remaining input data */
14028064efb8SGeert Uytterhoeven 		req.avail_in += (dtemplate[i].inlen + 1) / 2;
14038064efb8SGeert Uytterhoeven 
14043ce858cbSGeert Uytterhoeven 		res = crypto_decompress_update(tfm, &req);
14053ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14068064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression update failed on "
14073ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14083ce858cbSGeert Uytterhoeven 			return res;
14098064efb8SGeert Uytterhoeven 		}
14103ce858cbSGeert Uytterhoeven 		if (res > 0)
14113ce858cbSGeert Uytterhoeven 			produced += res;
14128064efb8SGeert Uytterhoeven 
14138064efb8SGeert Uytterhoeven 		/* Provide remaining output space */
14148064efb8SGeert Uytterhoeven 		req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
14158064efb8SGeert Uytterhoeven 
14163ce858cbSGeert Uytterhoeven 		res = crypto_decompress_final(tfm, &req);
14173ce858cbSGeert Uytterhoeven 		if (res < 0 && (res != -EAGAIN || req.avail_in)) {
14188064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: decompression final failed on "
14193ce858cbSGeert Uytterhoeven 			       "test %d for %s: error=%d\n", i + 1, algo, res);
14203ce858cbSGeert Uytterhoeven 			return res;
14218064efb8SGeert Uytterhoeven 		}
14223ce858cbSGeert Uytterhoeven 		if (res > 0)
14233ce858cbSGeert Uytterhoeven 			produced += res;
14248064efb8SGeert Uytterhoeven 
14258064efb8SGeert Uytterhoeven 		if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
14268064efb8SGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14278064efb8SGeert Uytterhoeven 			       "%s: output len = %d (expected %d)\n", i + 1,
14288064efb8SGeert Uytterhoeven 			       algo, COMP_BUF_SIZE - req.avail_out,
14298064efb8SGeert Uytterhoeven 			       dtemplate[i].outlen);
14308064efb8SGeert Uytterhoeven 			return -EINVAL;
14318064efb8SGeert Uytterhoeven 		}
14328064efb8SGeert Uytterhoeven 
14333ce858cbSGeert Uytterhoeven 		if (produced != dtemplate[i].outlen) {
14343ce858cbSGeert Uytterhoeven 			pr_err("alg: comp: Decompression test %d failed for "
14353ce858cbSGeert Uytterhoeven 			       "%s: returned len = %u (expected %d)\n", i + 1,
14363ce858cbSGeert Uytterhoeven 			       algo, produced, dtemplate[i].outlen);
14373ce858cbSGeert Uytterhoeven 			return -EINVAL;
14383ce858cbSGeert Uytterhoeven 		}
14393ce858cbSGeert Uytterhoeven 
14408064efb8SGeert Uytterhoeven 		if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
14418064efb8SGeert Uytterhoeven 			pr_err("alg: pcomp: Decompression test %d failed for "
14428064efb8SGeert Uytterhoeven 			       "%s\n", i + 1, algo);
14438064efb8SGeert Uytterhoeven 			hexdump(result, dtemplate[i].outlen);
14448064efb8SGeert Uytterhoeven 			return -EINVAL;
14458064efb8SGeert Uytterhoeven 		}
14468064efb8SGeert Uytterhoeven 	}
14478064efb8SGeert Uytterhoeven 
14488064efb8SGeert Uytterhoeven 	return 0;
14498064efb8SGeert Uytterhoeven }
14508064efb8SGeert Uytterhoeven 
14517647d6ceSJarod Wilson 
14527647d6ceSJarod Wilson static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
14537647d6ceSJarod Wilson 		      unsigned int tcount)
14547647d6ceSJarod Wilson {
14557647d6ceSJarod Wilson 	const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
1456fa4ef8a6SFelipe Contreras 	int err = 0, i, j, seedsize;
14577647d6ceSJarod Wilson 	u8 *seed;
14587647d6ceSJarod Wilson 	char result[32];
14597647d6ceSJarod Wilson 
14607647d6ceSJarod Wilson 	seedsize = crypto_rng_seedsize(tfm);
14617647d6ceSJarod Wilson 
14627647d6ceSJarod Wilson 	seed = kmalloc(seedsize, GFP_KERNEL);
14637647d6ceSJarod Wilson 	if (!seed) {
14647647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
14657647d6ceSJarod Wilson 		       "for %s\n", algo);
14667647d6ceSJarod Wilson 		return -ENOMEM;
14677647d6ceSJarod Wilson 	}
14687647d6ceSJarod Wilson 
14697647d6ceSJarod Wilson 	for (i = 0; i < tcount; i++) {
14707647d6ceSJarod Wilson 		memset(result, 0, 32);
14717647d6ceSJarod Wilson 
14727647d6ceSJarod Wilson 		memcpy(seed, template[i].v, template[i].vlen);
14737647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen, template[i].key,
14747647d6ceSJarod Wilson 		       template[i].klen);
14757647d6ceSJarod Wilson 		memcpy(seed + template[i].vlen + template[i].klen,
14767647d6ceSJarod Wilson 		       template[i].dt, template[i].dtlen);
14777647d6ceSJarod Wilson 
14787647d6ceSJarod Wilson 		err = crypto_rng_reset(tfm, seed, seedsize);
14797647d6ceSJarod Wilson 		if (err) {
14807647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Failed to reset rng "
14817647d6ceSJarod Wilson 			       "for %s\n", algo);
14827647d6ceSJarod Wilson 			goto out;
14837647d6ceSJarod Wilson 		}
14847647d6ceSJarod Wilson 
14857647d6ceSJarod Wilson 		for (j = 0; j < template[i].loops; j++) {
14867647d6ceSJarod Wilson 			err = crypto_rng_get_bytes(tfm, result,
14877647d6ceSJarod Wilson 						   template[i].rlen);
148819e60e13SStephan Mueller 			if (err < 0) {
14897647d6ceSJarod Wilson 				printk(KERN_ERR "alg: cprng: Failed to obtain "
14907647d6ceSJarod Wilson 				       "the correct amount of random data for "
149119e60e13SStephan Mueller 				       "%s (requested %d)\n", algo,
149219e60e13SStephan Mueller 				       template[i].rlen);
14937647d6ceSJarod Wilson 				goto out;
14947647d6ceSJarod Wilson 			}
14957647d6ceSJarod Wilson 		}
14967647d6ceSJarod Wilson 
14977647d6ceSJarod Wilson 		err = memcmp(result, template[i].result,
14987647d6ceSJarod Wilson 			     template[i].rlen);
14997647d6ceSJarod Wilson 		if (err) {
15007647d6ceSJarod Wilson 			printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
15017647d6ceSJarod Wilson 			       i, algo);
15027647d6ceSJarod Wilson 			hexdump(result, template[i].rlen);
15037647d6ceSJarod Wilson 			err = -EINVAL;
15047647d6ceSJarod Wilson 			goto out;
15057647d6ceSJarod Wilson 		}
15067647d6ceSJarod Wilson 	}
15077647d6ceSJarod Wilson 
15087647d6ceSJarod Wilson out:
15097647d6ceSJarod Wilson 	kfree(seed);
15107647d6ceSJarod Wilson 	return err;
15117647d6ceSJarod Wilson }
15127647d6ceSJarod Wilson 
1513da7f033dSHerbert Xu static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1514da7f033dSHerbert Xu 			 u32 type, u32 mask)
1515da7f033dSHerbert Xu {
1516da7f033dSHerbert Xu 	struct crypto_aead *tfm;
1517da7f033dSHerbert Xu 	int err = 0;
1518da7f033dSHerbert Xu 
1519425a8829SStephan Mueller 	tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask);
1520da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1521da7f033dSHerbert Xu 		printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1522da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1523da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1524da7f033dSHerbert Xu 	}
1525da7f033dSHerbert Xu 
1526da7f033dSHerbert Xu 	if (desc->suite.aead.enc.vecs) {
1527da7f033dSHerbert Xu 		err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1528da7f033dSHerbert Xu 				desc->suite.aead.enc.count);
1529da7f033dSHerbert Xu 		if (err)
1530da7f033dSHerbert Xu 			goto out;
1531da7f033dSHerbert Xu 	}
1532da7f033dSHerbert Xu 
1533da7f033dSHerbert Xu 	if (!err && desc->suite.aead.dec.vecs)
1534da7f033dSHerbert Xu 		err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1535da7f033dSHerbert Xu 				desc->suite.aead.dec.count);
1536da7f033dSHerbert Xu 
1537da7f033dSHerbert Xu out:
1538da7f033dSHerbert Xu 	crypto_free_aead(tfm);
1539da7f033dSHerbert Xu 	return err;
1540da7f033dSHerbert Xu }
1541da7f033dSHerbert Xu 
1542da7f033dSHerbert Xu static int alg_test_cipher(const struct alg_test_desc *desc,
1543da7f033dSHerbert Xu 			   const char *driver, u32 type, u32 mask)
1544da7f033dSHerbert Xu {
15451aa4ecd9SHerbert Xu 	struct crypto_cipher *tfm;
1546da7f033dSHerbert Xu 	int err = 0;
1547da7f033dSHerbert Xu 
1548425a8829SStephan Mueller 	tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
1549da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1550da7f033dSHerbert Xu 		printk(KERN_ERR "alg: cipher: Failed to load transform for "
1551da7f033dSHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
1552da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1553da7f033dSHerbert Xu 	}
1554da7f033dSHerbert Xu 
1555da7f033dSHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
1556da7f033dSHerbert Xu 		err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1557da7f033dSHerbert Xu 				  desc->suite.cipher.enc.count);
1558da7f033dSHerbert Xu 		if (err)
1559da7f033dSHerbert Xu 			goto out;
1560da7f033dSHerbert Xu 	}
1561da7f033dSHerbert Xu 
1562da7f033dSHerbert Xu 	if (desc->suite.cipher.dec.vecs)
1563da7f033dSHerbert Xu 		err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1564da7f033dSHerbert Xu 				  desc->suite.cipher.dec.count);
1565da7f033dSHerbert Xu 
1566da7f033dSHerbert Xu out:
15671aa4ecd9SHerbert Xu 	crypto_free_cipher(tfm);
15681aa4ecd9SHerbert Xu 	return err;
15691aa4ecd9SHerbert Xu }
15701aa4ecd9SHerbert Xu 
15711aa4ecd9SHerbert Xu static int alg_test_skcipher(const struct alg_test_desc *desc,
15721aa4ecd9SHerbert Xu 			     const char *driver, u32 type, u32 mask)
15731aa4ecd9SHerbert Xu {
15741aa4ecd9SHerbert Xu 	struct crypto_ablkcipher *tfm;
15751aa4ecd9SHerbert Xu 	int err = 0;
15761aa4ecd9SHerbert Xu 
1577425a8829SStephan Mueller 	tfm = crypto_alloc_ablkcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
15781aa4ecd9SHerbert Xu 	if (IS_ERR(tfm)) {
15791aa4ecd9SHerbert Xu 		printk(KERN_ERR "alg: skcipher: Failed to load transform for "
15801aa4ecd9SHerbert Xu 		       "%s: %ld\n", driver, PTR_ERR(tfm));
15811aa4ecd9SHerbert Xu 		return PTR_ERR(tfm);
15821aa4ecd9SHerbert Xu 	}
15831aa4ecd9SHerbert Xu 
15841aa4ecd9SHerbert Xu 	if (desc->suite.cipher.enc.vecs) {
15851aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
15861aa4ecd9SHerbert Xu 				    desc->suite.cipher.enc.count);
15871aa4ecd9SHerbert Xu 		if (err)
15881aa4ecd9SHerbert Xu 			goto out;
15891aa4ecd9SHerbert Xu 	}
15901aa4ecd9SHerbert Xu 
15911aa4ecd9SHerbert Xu 	if (desc->suite.cipher.dec.vecs)
15921aa4ecd9SHerbert Xu 		err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
15931aa4ecd9SHerbert Xu 				    desc->suite.cipher.dec.count);
15941aa4ecd9SHerbert Xu 
15951aa4ecd9SHerbert Xu out:
1596da7f033dSHerbert Xu 	crypto_free_ablkcipher(tfm);
1597da7f033dSHerbert Xu 	return err;
1598da7f033dSHerbert Xu }
1599da7f033dSHerbert Xu 
1600da7f033dSHerbert Xu static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1601da7f033dSHerbert Xu 			 u32 type, u32 mask)
1602da7f033dSHerbert Xu {
1603da7f033dSHerbert Xu 	struct crypto_comp *tfm;
1604da7f033dSHerbert Xu 	int err;
1605da7f033dSHerbert Xu 
1606da7f033dSHerbert Xu 	tfm = crypto_alloc_comp(driver, type, mask);
1607da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1608da7f033dSHerbert Xu 		printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1609da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1610da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1611da7f033dSHerbert Xu 	}
1612da7f033dSHerbert Xu 
1613da7f033dSHerbert Xu 	err = test_comp(tfm, desc->suite.comp.comp.vecs,
1614da7f033dSHerbert Xu 			desc->suite.comp.decomp.vecs,
1615da7f033dSHerbert Xu 			desc->suite.comp.comp.count,
1616da7f033dSHerbert Xu 			desc->suite.comp.decomp.count);
1617da7f033dSHerbert Xu 
1618da7f033dSHerbert Xu 	crypto_free_comp(tfm);
1619da7f033dSHerbert Xu 	return err;
1620da7f033dSHerbert Xu }
1621da7f033dSHerbert Xu 
16228064efb8SGeert Uytterhoeven static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
16238064efb8SGeert Uytterhoeven 			  u32 type, u32 mask)
16248064efb8SGeert Uytterhoeven {
16258064efb8SGeert Uytterhoeven 	struct crypto_pcomp *tfm;
16268064efb8SGeert Uytterhoeven 	int err;
16278064efb8SGeert Uytterhoeven 
16288064efb8SGeert Uytterhoeven 	tfm = crypto_alloc_pcomp(driver, type, mask);
16298064efb8SGeert Uytterhoeven 	if (IS_ERR(tfm)) {
16308064efb8SGeert Uytterhoeven 		pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
16318064efb8SGeert Uytterhoeven 		       driver, PTR_ERR(tfm));
16328064efb8SGeert Uytterhoeven 		return PTR_ERR(tfm);
16338064efb8SGeert Uytterhoeven 	}
16348064efb8SGeert Uytterhoeven 
16358064efb8SGeert Uytterhoeven 	err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
16368064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.vecs,
16378064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.comp.count,
16388064efb8SGeert Uytterhoeven 			 desc->suite.pcomp.decomp.count);
16398064efb8SGeert Uytterhoeven 
16408064efb8SGeert Uytterhoeven 	crypto_free_pcomp(tfm);
16418064efb8SGeert Uytterhoeven 	return err;
16428064efb8SGeert Uytterhoeven }
16438064efb8SGeert Uytterhoeven 
1644da7f033dSHerbert Xu static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1645da7f033dSHerbert Xu 			 u32 type, u32 mask)
1646da7f033dSHerbert Xu {
1647da7f033dSHerbert Xu 	struct crypto_ahash *tfm;
1648da7f033dSHerbert Xu 	int err;
1649da7f033dSHerbert Xu 
1650425a8829SStephan Mueller 	tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask);
1651da7f033dSHerbert Xu 	if (IS_ERR(tfm)) {
1652da7f033dSHerbert Xu 		printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1653da7f033dSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
1654da7f033dSHerbert Xu 		return PTR_ERR(tfm);
1655da7f033dSHerbert Xu 	}
1656da7f033dSHerbert Xu 
1657a8f1a052SDavid S. Miller 	err = test_hash(tfm, desc->suite.hash.vecs,
1658a8f1a052SDavid S. Miller 			desc->suite.hash.count, true);
1659a8f1a052SDavid S. Miller 	if (!err)
1660a8f1a052SDavid S. Miller 		err = test_hash(tfm, desc->suite.hash.vecs,
1661a8f1a052SDavid S. Miller 				desc->suite.hash.count, false);
1662da7f033dSHerbert Xu 
1663da7f033dSHerbert Xu 	crypto_free_ahash(tfm);
1664da7f033dSHerbert Xu 	return err;
1665da7f033dSHerbert Xu }
1666da7f033dSHerbert Xu 
16678e3ee85eSHerbert Xu static int alg_test_crc32c(const struct alg_test_desc *desc,
16688e3ee85eSHerbert Xu 			   const char *driver, u32 type, u32 mask)
16698e3ee85eSHerbert Xu {
16708e3ee85eSHerbert Xu 	struct crypto_shash *tfm;
16718e3ee85eSHerbert Xu 	u32 val;
16728e3ee85eSHerbert Xu 	int err;
16738e3ee85eSHerbert Xu 
16748e3ee85eSHerbert Xu 	err = alg_test_hash(desc, driver, type, mask);
16758e3ee85eSHerbert Xu 	if (err)
16768e3ee85eSHerbert Xu 		goto out;
16778e3ee85eSHerbert Xu 
1678425a8829SStephan Mueller 	tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask);
16798e3ee85eSHerbert Xu 	if (IS_ERR(tfm)) {
16808e3ee85eSHerbert Xu 		printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
16818e3ee85eSHerbert Xu 		       "%ld\n", driver, PTR_ERR(tfm));
16828e3ee85eSHerbert Xu 		err = PTR_ERR(tfm);
16838e3ee85eSHerbert Xu 		goto out;
16848e3ee85eSHerbert Xu 	}
16858e3ee85eSHerbert Xu 
16868e3ee85eSHerbert Xu 	do {
16874c5c3024SJan-Simon Möller 		SHASH_DESC_ON_STACK(shash, tfm);
16884c5c3024SJan-Simon Möller 		u32 *ctx = (u32 *)shash_desc_ctx(shash);
16898e3ee85eSHerbert Xu 
16904c5c3024SJan-Simon Möller 		shash->tfm = tfm;
16914c5c3024SJan-Simon Möller 		shash->flags = 0;
16928e3ee85eSHerbert Xu 
16934c5c3024SJan-Simon Möller 		*ctx = le32_to_cpu(420553207);
16944c5c3024SJan-Simon Möller 		err = crypto_shash_final(shash, (u8 *)&val);
16958e3ee85eSHerbert Xu 		if (err) {
16968e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Operation failed for "
16978e3ee85eSHerbert Xu 			       "%s: %d\n", driver, err);
16988e3ee85eSHerbert Xu 			break;
16998e3ee85eSHerbert Xu 		}
17008e3ee85eSHerbert Xu 
17018e3ee85eSHerbert Xu 		if (val != ~420553207) {
17028e3ee85eSHerbert Xu 			printk(KERN_ERR "alg: crc32c: Test failed for %s: "
17038e3ee85eSHerbert Xu 			       "%d\n", driver, val);
17048e3ee85eSHerbert Xu 			err = -EINVAL;
17058e3ee85eSHerbert Xu 		}
17068e3ee85eSHerbert Xu 	} while (0);
17078e3ee85eSHerbert Xu 
17088e3ee85eSHerbert Xu 	crypto_free_shash(tfm);
17098e3ee85eSHerbert Xu 
17108e3ee85eSHerbert Xu out:
17118e3ee85eSHerbert Xu 	return err;
17128e3ee85eSHerbert Xu }
17138e3ee85eSHerbert Xu 
17147647d6ceSJarod Wilson static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
17157647d6ceSJarod Wilson 			  u32 type, u32 mask)
17167647d6ceSJarod Wilson {
17177647d6ceSJarod Wilson 	struct crypto_rng *rng;
17187647d6ceSJarod Wilson 	int err;
17197647d6ceSJarod Wilson 
1720425a8829SStephan Mueller 	rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
17217647d6ceSJarod Wilson 	if (IS_ERR(rng)) {
17227647d6ceSJarod Wilson 		printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
17237647d6ceSJarod Wilson 		       "%ld\n", driver, PTR_ERR(rng));
17247647d6ceSJarod Wilson 		return PTR_ERR(rng);
17257647d6ceSJarod Wilson 	}
17267647d6ceSJarod Wilson 
17277647d6ceSJarod Wilson 	err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
17287647d6ceSJarod Wilson 
17297647d6ceSJarod Wilson 	crypto_free_rng(rng);
17307647d6ceSJarod Wilson 
17317647d6ceSJarod Wilson 	return err;
17327647d6ceSJarod Wilson }
17337647d6ceSJarod Wilson 
173464d1cdfbSStephan Mueller 
173564d1cdfbSStephan Mueller static int drbg_cavs_test(struct drbg_testvec *test, int pr,
173664d1cdfbSStephan Mueller 			  const char *driver, u32 type, u32 mask)
173764d1cdfbSStephan Mueller {
173864d1cdfbSStephan Mueller 	int ret = -EAGAIN;
173964d1cdfbSStephan Mueller 	struct crypto_rng *drng;
174064d1cdfbSStephan Mueller 	struct drbg_test_data test_data;
174164d1cdfbSStephan Mueller 	struct drbg_string addtl, pers, testentropy;
174264d1cdfbSStephan Mueller 	unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
174364d1cdfbSStephan Mueller 
174464d1cdfbSStephan Mueller 	if (!buf)
174564d1cdfbSStephan Mueller 		return -ENOMEM;
174664d1cdfbSStephan Mueller 
1747425a8829SStephan Mueller 	drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
174864d1cdfbSStephan Mueller 	if (IS_ERR(drng)) {
174964d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
175064d1cdfbSStephan Mueller 		       "%s\n", driver);
175164d1cdfbSStephan Mueller 		kzfree(buf);
175264d1cdfbSStephan Mueller 		return -ENOMEM;
175364d1cdfbSStephan Mueller 	}
175464d1cdfbSStephan Mueller 
175564d1cdfbSStephan Mueller 	test_data.testentropy = &testentropy;
175664d1cdfbSStephan Mueller 	drbg_string_fill(&testentropy, test->entropy, test->entropylen);
175764d1cdfbSStephan Mueller 	drbg_string_fill(&pers, test->pers, test->perslen);
175864d1cdfbSStephan Mueller 	ret = crypto_drbg_reset_test(drng, &pers, &test_data);
175964d1cdfbSStephan Mueller 	if (ret) {
176064d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
176164d1cdfbSStephan Mueller 		goto outbuf;
176264d1cdfbSStephan Mueller 	}
176364d1cdfbSStephan Mueller 
176464d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtla, test->addtllen);
176564d1cdfbSStephan Mueller 	if (pr) {
176664d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entpra, test->entprlen);
176764d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
176864d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl,	&test_data);
176964d1cdfbSStephan Mueller 	} else {
177064d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
177164d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
177264d1cdfbSStephan Mueller 	}
177319e60e13SStephan Mueller 	if (ret < 0) {
177464d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
177564d1cdfbSStephan Mueller 		       "driver %s\n", driver);
177664d1cdfbSStephan Mueller 		goto outbuf;
177764d1cdfbSStephan Mueller 	}
177864d1cdfbSStephan Mueller 
177964d1cdfbSStephan Mueller 	drbg_string_fill(&addtl, test->addtlb, test->addtllen);
178064d1cdfbSStephan Mueller 	if (pr) {
178164d1cdfbSStephan Mueller 		drbg_string_fill(&testentropy, test->entprb, test->entprlen);
178264d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl_test(drng,
178364d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl, &test_data);
178464d1cdfbSStephan Mueller 	} else {
178564d1cdfbSStephan Mueller 		ret = crypto_drbg_get_bytes_addtl(drng,
178664d1cdfbSStephan Mueller 			buf, test->expectedlen, &addtl);
178764d1cdfbSStephan Mueller 	}
178819e60e13SStephan Mueller 	if (ret < 0) {
178964d1cdfbSStephan Mueller 		printk(KERN_ERR "alg: drbg: could not obtain random data for "
179064d1cdfbSStephan Mueller 		       "driver %s\n", driver);
179164d1cdfbSStephan Mueller 		goto outbuf;
179264d1cdfbSStephan Mueller 	}
179364d1cdfbSStephan Mueller 
179464d1cdfbSStephan Mueller 	ret = memcmp(test->expected, buf, test->expectedlen);
179564d1cdfbSStephan Mueller 
179664d1cdfbSStephan Mueller outbuf:
179764d1cdfbSStephan Mueller 	crypto_free_rng(drng);
179864d1cdfbSStephan Mueller 	kzfree(buf);
179964d1cdfbSStephan Mueller 	return ret;
180064d1cdfbSStephan Mueller }
180164d1cdfbSStephan Mueller 
180264d1cdfbSStephan Mueller 
180364d1cdfbSStephan Mueller static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
180464d1cdfbSStephan Mueller 			 u32 type, u32 mask)
180564d1cdfbSStephan Mueller {
180664d1cdfbSStephan Mueller 	int err = 0;
180764d1cdfbSStephan Mueller 	int pr = 0;
180864d1cdfbSStephan Mueller 	int i = 0;
180964d1cdfbSStephan Mueller 	struct drbg_testvec *template = desc->suite.drbg.vecs;
181064d1cdfbSStephan Mueller 	unsigned int tcount = desc->suite.drbg.count;
181164d1cdfbSStephan Mueller 
181264d1cdfbSStephan Mueller 	if (0 == memcmp(driver, "drbg_pr_", 8))
181364d1cdfbSStephan Mueller 		pr = 1;
181464d1cdfbSStephan Mueller 
181564d1cdfbSStephan Mueller 	for (i = 0; i < tcount; i++) {
181664d1cdfbSStephan Mueller 		err = drbg_cavs_test(&template[i], pr, driver, type, mask);
181764d1cdfbSStephan Mueller 		if (err) {
181864d1cdfbSStephan Mueller 			printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
181964d1cdfbSStephan Mueller 			       i, driver);
182064d1cdfbSStephan Mueller 			err = -EINVAL;
182164d1cdfbSStephan Mueller 			break;
182264d1cdfbSStephan Mueller 		}
182364d1cdfbSStephan Mueller 	}
182464d1cdfbSStephan Mueller 	return err;
182564d1cdfbSStephan Mueller 
182664d1cdfbSStephan Mueller }
182764d1cdfbSStephan Mueller 
1828863b557aSYouquan, Song static int alg_test_null(const struct alg_test_desc *desc,
1829863b557aSYouquan, Song 			     const char *driver, u32 type, u32 mask)
1830863b557aSYouquan, Song {
1831863b557aSYouquan, Song 	return 0;
1832863b557aSYouquan, Song }
1833863b557aSYouquan, Song 
1834da7f033dSHerbert Xu /* Please keep this list sorted by algorithm name. */
1835da7f033dSHerbert Xu static const struct alg_test_desc alg_test_descs[] = {
1836da7f033dSHerbert Xu 	{
18374d6d6a2cSJohannes Goetzfried 		.alg = "__cbc-cast5-avx",
18384d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
18394d6d6a2cSJohannes Goetzfried 	}, {
18404ea1277dSJohannes Goetzfried 		.alg = "__cbc-cast6-avx",
18414ea1277dSJohannes Goetzfried 		.test = alg_test_null,
18424ea1277dSJohannes Goetzfried 	}, {
18437efe4076SJohannes Goetzfried 		.alg = "__cbc-serpent-avx",
18447efe4076SJohannes Goetzfried 		.test = alg_test_null,
18457efe4076SJohannes Goetzfried 	}, {
184656d76c96SJussi Kivilinna 		.alg = "__cbc-serpent-avx2",
184756d76c96SJussi Kivilinna 		.test = alg_test_null,
184856d76c96SJussi Kivilinna 	}, {
1849937c30d7SJussi Kivilinna 		.alg = "__cbc-serpent-sse2",
1850937c30d7SJussi Kivilinna 		.test = alg_test_null,
1851937c30d7SJussi Kivilinna 	}, {
1852107778b5SJohannes Goetzfried 		.alg = "__cbc-twofish-avx",
1853107778b5SJohannes Goetzfried 		.test = alg_test_null,
1854107778b5SJohannes Goetzfried 	}, {
1855863b557aSYouquan, Song 		.alg = "__driver-cbc-aes-aesni",
1856863b557aSYouquan, Song 		.test = alg_test_null,
18576c79294fSMilan Broz 		.fips_allowed = 1,
1858863b557aSYouquan, Song 	}, {
1859d9b1d2e7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni",
1860d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1861d9b1d2e7SJussi Kivilinna 	}, {
1862f3f935a7SJussi Kivilinna 		.alg = "__driver-cbc-camellia-aesni-avx2",
1863f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1864f3f935a7SJussi Kivilinna 	}, {
18654d6d6a2cSJohannes Goetzfried 		.alg = "__driver-cbc-cast5-avx",
18664d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
18674d6d6a2cSJohannes Goetzfried 	}, {
18684ea1277dSJohannes Goetzfried 		.alg = "__driver-cbc-cast6-avx",
18694ea1277dSJohannes Goetzfried 		.test = alg_test_null,
18704ea1277dSJohannes Goetzfried 	}, {
18717efe4076SJohannes Goetzfried 		.alg = "__driver-cbc-serpent-avx",
18727efe4076SJohannes Goetzfried 		.test = alg_test_null,
18737efe4076SJohannes Goetzfried 	}, {
187456d76c96SJussi Kivilinna 		.alg = "__driver-cbc-serpent-avx2",
187556d76c96SJussi Kivilinna 		.test = alg_test_null,
187656d76c96SJussi Kivilinna 	}, {
1877937c30d7SJussi Kivilinna 		.alg = "__driver-cbc-serpent-sse2",
1878937c30d7SJussi Kivilinna 		.test = alg_test_null,
1879937c30d7SJussi Kivilinna 	}, {
1880107778b5SJohannes Goetzfried 		.alg = "__driver-cbc-twofish-avx",
1881107778b5SJohannes Goetzfried 		.test = alg_test_null,
1882107778b5SJohannes Goetzfried 	}, {
1883863b557aSYouquan, Song 		.alg = "__driver-ecb-aes-aesni",
1884863b557aSYouquan, Song 		.test = alg_test_null,
18856c79294fSMilan Broz 		.fips_allowed = 1,
1886863b557aSYouquan, Song 	}, {
1887d9b1d2e7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni",
1888d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
1889d9b1d2e7SJussi Kivilinna 	}, {
1890f3f935a7SJussi Kivilinna 		.alg = "__driver-ecb-camellia-aesni-avx2",
1891f3f935a7SJussi Kivilinna 		.test = alg_test_null,
1892f3f935a7SJussi Kivilinna 	}, {
18934d6d6a2cSJohannes Goetzfried 		.alg = "__driver-ecb-cast5-avx",
18944d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
18954d6d6a2cSJohannes Goetzfried 	}, {
18964ea1277dSJohannes Goetzfried 		.alg = "__driver-ecb-cast6-avx",
18974ea1277dSJohannes Goetzfried 		.test = alg_test_null,
18984ea1277dSJohannes Goetzfried 	}, {
18997efe4076SJohannes Goetzfried 		.alg = "__driver-ecb-serpent-avx",
19007efe4076SJohannes Goetzfried 		.test = alg_test_null,
19017efe4076SJohannes Goetzfried 	}, {
190256d76c96SJussi Kivilinna 		.alg = "__driver-ecb-serpent-avx2",
190356d76c96SJussi Kivilinna 		.test = alg_test_null,
190456d76c96SJussi Kivilinna 	}, {
1905937c30d7SJussi Kivilinna 		.alg = "__driver-ecb-serpent-sse2",
1906937c30d7SJussi Kivilinna 		.test = alg_test_null,
1907937c30d7SJussi Kivilinna 	}, {
1908107778b5SJohannes Goetzfried 		.alg = "__driver-ecb-twofish-avx",
1909107778b5SJohannes Goetzfried 		.test = alg_test_null,
1910107778b5SJohannes Goetzfried 	}, {
1911863b557aSYouquan, Song 		.alg = "__ghash-pclmulqdqni",
1912863b557aSYouquan, Song 		.test = alg_test_null,
19136c79294fSMilan Broz 		.fips_allowed = 1,
1914863b557aSYouquan, Song 	}, {
1915e08ca2daSJarod Wilson 		.alg = "ansi_cprng",
1916e08ca2daSJarod Wilson 		.test = alg_test_cprng,
1917a1915d51SJarod Wilson 		.fips_allowed = 1,
1918e08ca2daSJarod Wilson 		.suite = {
1919e08ca2daSJarod Wilson 			.cprng = {
1920e08ca2daSJarod Wilson 				.vecs = ansi_cprng_aes_tv_template,
1921e08ca2daSJarod Wilson 				.count = ANSI_CPRNG_AES_TEST_VECTORS
1922e08ca2daSJarod Wilson 			}
1923e08ca2daSJarod Wilson 		}
1924e08ca2daSJarod Wilson 	}, {
1925bca4feb0SHoria Geanta 		.alg = "authenc(hmac(md5),ecb(cipher_null))",
1926bca4feb0SHoria Geanta 		.test = alg_test_aead,
1927bca4feb0SHoria Geanta 		.fips_allowed = 1,
1928bca4feb0SHoria Geanta 		.suite = {
1929bca4feb0SHoria Geanta 			.aead = {
1930bca4feb0SHoria Geanta 				.enc = {
1931bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_enc_tv_template,
1932bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS
1933bca4feb0SHoria Geanta 				},
1934bca4feb0SHoria Geanta 				.dec = {
1935bca4feb0SHoria Geanta 					.vecs = hmac_md5_ecb_cipher_null_dec_tv_template,
1936bca4feb0SHoria Geanta 					.count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS
1937bca4feb0SHoria Geanta 				}
1938bca4feb0SHoria Geanta 			}
1939bca4feb0SHoria Geanta 		}
1940bca4feb0SHoria Geanta 	}, {
1941e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha1),cbc(aes))",
1942e46e9a46SHoria Geanta 		.test = alg_test_aead,
1943e46e9a46SHoria Geanta 		.fips_allowed = 1,
1944e46e9a46SHoria Geanta 		.suite = {
1945e46e9a46SHoria Geanta 			.aead = {
1946e46e9a46SHoria Geanta 				.enc = {
19475208ed2cSNitesh Lal 					.vecs =
19485208ed2cSNitesh Lal 					hmac_sha1_aes_cbc_enc_tv_temp,
19495208ed2cSNitesh Lal 					.count =
19505208ed2cSNitesh Lal 					HMAC_SHA1_AES_CBC_ENC_TEST_VEC
19515208ed2cSNitesh Lal 				}
19525208ed2cSNitesh Lal 			}
19535208ed2cSNitesh Lal 		}
19545208ed2cSNitesh Lal 	}, {
19555208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha1),cbc(des))",
19565208ed2cSNitesh Lal 		.test = alg_test_aead,
19575208ed2cSNitesh Lal 		.fips_allowed = 1,
19585208ed2cSNitesh Lal 		.suite = {
19595208ed2cSNitesh Lal 			.aead = {
19605208ed2cSNitesh Lal 				.enc = {
19615208ed2cSNitesh Lal 					.vecs =
19625208ed2cSNitesh Lal 					hmac_sha1_des_cbc_enc_tv_temp,
19635208ed2cSNitesh Lal 					.count =
19645208ed2cSNitesh Lal 					HMAC_SHA1_DES_CBC_ENC_TEST_VEC
19655208ed2cSNitesh Lal 				}
19665208ed2cSNitesh Lal 			}
19675208ed2cSNitesh Lal 		}
19685208ed2cSNitesh Lal 	}, {
19695208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha1),cbc(des3_ede))",
19705208ed2cSNitesh Lal 		.test = alg_test_aead,
19715208ed2cSNitesh Lal 		.fips_allowed = 1,
19725208ed2cSNitesh Lal 		.suite = {
19735208ed2cSNitesh Lal 			.aead = {
19745208ed2cSNitesh Lal 				.enc = {
19755208ed2cSNitesh Lal 					.vecs =
19765208ed2cSNitesh Lal 					hmac_sha1_des3_ede_cbc_enc_tv_temp,
19775208ed2cSNitesh Lal 					.count =
19785208ed2cSNitesh Lal 					HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
1979e46e9a46SHoria Geanta 				}
1980e46e9a46SHoria Geanta 			}
1981e46e9a46SHoria Geanta 		}
1982e46e9a46SHoria Geanta 	}, {
1983bca4feb0SHoria Geanta 		.alg = "authenc(hmac(sha1),ecb(cipher_null))",
1984bca4feb0SHoria Geanta 		.test = alg_test_aead,
1985bca4feb0SHoria Geanta 		.fips_allowed = 1,
1986bca4feb0SHoria Geanta 		.suite = {
1987bca4feb0SHoria Geanta 			.aead = {
1988bca4feb0SHoria Geanta 				.enc = {
19895208ed2cSNitesh Lal 					.vecs =
19905208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_enc_tv_temp,
19915208ed2cSNitesh Lal 					.count =
19925208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
1993bca4feb0SHoria Geanta 				},
1994bca4feb0SHoria Geanta 				.dec = {
19955208ed2cSNitesh Lal 					.vecs =
19965208ed2cSNitesh Lal 					hmac_sha1_ecb_cipher_null_dec_tv_temp,
19975208ed2cSNitesh Lal 					.count =
19985208ed2cSNitesh Lal 					HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
19995208ed2cSNitesh Lal 				}
20005208ed2cSNitesh Lal 			}
20015208ed2cSNitesh Lal 		}
20025208ed2cSNitesh Lal 	}, {
20035208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha224),cbc(des))",
20045208ed2cSNitesh Lal 		.test = alg_test_aead,
20055208ed2cSNitesh Lal 		.fips_allowed = 1,
20065208ed2cSNitesh Lal 		.suite = {
20075208ed2cSNitesh Lal 			.aead = {
20085208ed2cSNitesh Lal 				.enc = {
20095208ed2cSNitesh Lal 					.vecs =
20105208ed2cSNitesh Lal 					hmac_sha224_des_cbc_enc_tv_temp,
20115208ed2cSNitesh Lal 					.count =
20125208ed2cSNitesh Lal 					HMAC_SHA224_DES_CBC_ENC_TEST_VEC
20135208ed2cSNitesh Lal 				}
20145208ed2cSNitesh Lal 			}
20155208ed2cSNitesh Lal 		}
20165208ed2cSNitesh Lal 	}, {
20175208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha224),cbc(des3_ede))",
20185208ed2cSNitesh Lal 		.test = alg_test_aead,
20195208ed2cSNitesh Lal 		.fips_allowed = 1,
20205208ed2cSNitesh Lal 		.suite = {
20215208ed2cSNitesh Lal 			.aead = {
20225208ed2cSNitesh Lal 				.enc = {
20235208ed2cSNitesh Lal 					.vecs =
20245208ed2cSNitesh Lal 					hmac_sha224_des3_ede_cbc_enc_tv_temp,
20255208ed2cSNitesh Lal 					.count =
20265208ed2cSNitesh Lal 					HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
2027bca4feb0SHoria Geanta 				}
2028bca4feb0SHoria Geanta 			}
2029bca4feb0SHoria Geanta 		}
2030bca4feb0SHoria Geanta 	}, {
2031e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha256),cbc(aes))",
2032e46e9a46SHoria Geanta 		.test = alg_test_aead,
2033e46e9a46SHoria Geanta 		.fips_allowed = 1,
2034e46e9a46SHoria Geanta 		.suite = {
2035e46e9a46SHoria Geanta 			.aead = {
2036e46e9a46SHoria Geanta 				.enc = {
20375208ed2cSNitesh Lal 					.vecs =
20385208ed2cSNitesh Lal 					hmac_sha256_aes_cbc_enc_tv_temp,
20395208ed2cSNitesh Lal 					.count =
20405208ed2cSNitesh Lal 					HMAC_SHA256_AES_CBC_ENC_TEST_VEC
20415208ed2cSNitesh Lal 				}
20425208ed2cSNitesh Lal 			}
20435208ed2cSNitesh Lal 		}
20445208ed2cSNitesh Lal 	}, {
20455208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha256),cbc(des))",
20465208ed2cSNitesh Lal 		.test = alg_test_aead,
20475208ed2cSNitesh Lal 		.fips_allowed = 1,
20485208ed2cSNitesh Lal 		.suite = {
20495208ed2cSNitesh Lal 			.aead = {
20505208ed2cSNitesh Lal 				.enc = {
20515208ed2cSNitesh Lal 					.vecs =
20525208ed2cSNitesh Lal 					hmac_sha256_des_cbc_enc_tv_temp,
20535208ed2cSNitesh Lal 					.count =
20545208ed2cSNitesh Lal 					HMAC_SHA256_DES_CBC_ENC_TEST_VEC
20555208ed2cSNitesh Lal 				}
20565208ed2cSNitesh Lal 			}
20575208ed2cSNitesh Lal 		}
20585208ed2cSNitesh Lal 	}, {
20595208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha256),cbc(des3_ede))",
20605208ed2cSNitesh Lal 		.test = alg_test_aead,
20615208ed2cSNitesh Lal 		.fips_allowed = 1,
20625208ed2cSNitesh Lal 		.suite = {
20635208ed2cSNitesh Lal 			.aead = {
20645208ed2cSNitesh Lal 				.enc = {
20655208ed2cSNitesh Lal 					.vecs =
20665208ed2cSNitesh Lal 					hmac_sha256_des3_ede_cbc_enc_tv_temp,
20675208ed2cSNitesh Lal 					.count =
20685208ed2cSNitesh Lal 					HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
20695208ed2cSNitesh Lal 				}
20705208ed2cSNitesh Lal 			}
20715208ed2cSNitesh Lal 		}
20725208ed2cSNitesh Lal 	}, {
20735208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha384),cbc(des))",
20745208ed2cSNitesh Lal 		.test = alg_test_aead,
20755208ed2cSNitesh Lal 		.fips_allowed = 1,
20765208ed2cSNitesh Lal 		.suite = {
20775208ed2cSNitesh Lal 			.aead = {
20785208ed2cSNitesh Lal 				.enc = {
20795208ed2cSNitesh Lal 					.vecs =
20805208ed2cSNitesh Lal 					hmac_sha384_des_cbc_enc_tv_temp,
20815208ed2cSNitesh Lal 					.count =
20825208ed2cSNitesh Lal 					HMAC_SHA384_DES_CBC_ENC_TEST_VEC
20835208ed2cSNitesh Lal 				}
20845208ed2cSNitesh Lal 			}
20855208ed2cSNitesh Lal 		}
20865208ed2cSNitesh Lal 	}, {
20875208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha384),cbc(des3_ede))",
20885208ed2cSNitesh Lal 		.test = alg_test_aead,
20895208ed2cSNitesh Lal 		.fips_allowed = 1,
20905208ed2cSNitesh Lal 		.suite = {
20915208ed2cSNitesh Lal 			.aead = {
20925208ed2cSNitesh Lal 				.enc = {
20935208ed2cSNitesh Lal 					.vecs =
20945208ed2cSNitesh Lal 					hmac_sha384_des3_ede_cbc_enc_tv_temp,
20955208ed2cSNitesh Lal 					.count =
20965208ed2cSNitesh Lal 					HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC
2097e46e9a46SHoria Geanta 				}
2098e46e9a46SHoria Geanta 			}
2099e46e9a46SHoria Geanta 		}
2100e46e9a46SHoria Geanta 	}, {
2101e46e9a46SHoria Geanta 		.alg = "authenc(hmac(sha512),cbc(aes))",
2102e46e9a46SHoria Geanta 		.test = alg_test_aead,
2103e46e9a46SHoria Geanta 		.fips_allowed = 1,
2104e46e9a46SHoria Geanta 		.suite = {
2105e46e9a46SHoria Geanta 			.aead = {
2106e46e9a46SHoria Geanta 				.enc = {
21075208ed2cSNitesh Lal 					.vecs =
21085208ed2cSNitesh Lal 					hmac_sha512_aes_cbc_enc_tv_temp,
21095208ed2cSNitesh Lal 					.count =
21105208ed2cSNitesh Lal 					HMAC_SHA512_AES_CBC_ENC_TEST_VEC
21115208ed2cSNitesh Lal 				}
21125208ed2cSNitesh Lal 			}
21135208ed2cSNitesh Lal 		}
21145208ed2cSNitesh Lal 	}, {
21155208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha512),cbc(des))",
21165208ed2cSNitesh Lal 		.test = alg_test_aead,
21175208ed2cSNitesh Lal 		.fips_allowed = 1,
21185208ed2cSNitesh Lal 		.suite = {
21195208ed2cSNitesh Lal 			.aead = {
21205208ed2cSNitesh Lal 				.enc = {
21215208ed2cSNitesh Lal 					.vecs =
21225208ed2cSNitesh Lal 					hmac_sha512_des_cbc_enc_tv_temp,
21235208ed2cSNitesh Lal 					.count =
21245208ed2cSNitesh Lal 					HMAC_SHA512_DES_CBC_ENC_TEST_VEC
21255208ed2cSNitesh Lal 				}
21265208ed2cSNitesh Lal 			}
21275208ed2cSNitesh Lal 		}
21285208ed2cSNitesh Lal 	}, {
21295208ed2cSNitesh Lal 		.alg = "authenc(hmac(sha512),cbc(des3_ede))",
21305208ed2cSNitesh Lal 		.test = alg_test_aead,
21315208ed2cSNitesh Lal 		.fips_allowed = 1,
21325208ed2cSNitesh Lal 		.suite = {
21335208ed2cSNitesh Lal 			.aead = {
21345208ed2cSNitesh Lal 				.enc = {
21355208ed2cSNitesh Lal 					.vecs =
21365208ed2cSNitesh Lal 					hmac_sha512_des3_ede_cbc_enc_tv_temp,
21375208ed2cSNitesh Lal 					.count =
21385208ed2cSNitesh Lal 					HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
2139e46e9a46SHoria Geanta 				}
2140e46e9a46SHoria Geanta 			}
2141e46e9a46SHoria Geanta 		}
2142e46e9a46SHoria Geanta 	}, {
2143da7f033dSHerbert Xu 		.alg = "cbc(aes)",
21441aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2145a1915d51SJarod Wilson 		.fips_allowed = 1,
2146da7f033dSHerbert Xu 		.suite = {
2147da7f033dSHerbert Xu 			.cipher = {
2148da7f033dSHerbert Xu 				.enc = {
2149da7f033dSHerbert Xu 					.vecs = aes_cbc_enc_tv_template,
2150da7f033dSHerbert Xu 					.count = AES_CBC_ENC_TEST_VECTORS
2151da7f033dSHerbert Xu 				},
2152da7f033dSHerbert Xu 				.dec = {
2153da7f033dSHerbert Xu 					.vecs = aes_cbc_dec_tv_template,
2154da7f033dSHerbert Xu 					.count = AES_CBC_DEC_TEST_VECTORS
2155da7f033dSHerbert Xu 				}
2156da7f033dSHerbert Xu 			}
2157da7f033dSHerbert Xu 		}
2158da7f033dSHerbert Xu 	}, {
2159da7f033dSHerbert Xu 		.alg = "cbc(anubis)",
21601aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2161da7f033dSHerbert Xu 		.suite = {
2162da7f033dSHerbert Xu 			.cipher = {
2163da7f033dSHerbert Xu 				.enc = {
2164da7f033dSHerbert Xu 					.vecs = anubis_cbc_enc_tv_template,
2165da7f033dSHerbert Xu 					.count = ANUBIS_CBC_ENC_TEST_VECTORS
2166da7f033dSHerbert Xu 				},
2167da7f033dSHerbert Xu 				.dec = {
2168da7f033dSHerbert Xu 					.vecs = anubis_cbc_dec_tv_template,
2169da7f033dSHerbert Xu 					.count = ANUBIS_CBC_DEC_TEST_VECTORS
2170da7f033dSHerbert Xu 				}
2171da7f033dSHerbert Xu 			}
2172da7f033dSHerbert Xu 		}
2173da7f033dSHerbert Xu 	}, {
2174da7f033dSHerbert Xu 		.alg = "cbc(blowfish)",
21751aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2176da7f033dSHerbert Xu 		.suite = {
2177da7f033dSHerbert Xu 			.cipher = {
2178da7f033dSHerbert Xu 				.enc = {
2179da7f033dSHerbert Xu 					.vecs = bf_cbc_enc_tv_template,
2180da7f033dSHerbert Xu 					.count = BF_CBC_ENC_TEST_VECTORS
2181da7f033dSHerbert Xu 				},
2182da7f033dSHerbert Xu 				.dec = {
2183da7f033dSHerbert Xu 					.vecs = bf_cbc_dec_tv_template,
2184da7f033dSHerbert Xu 					.count = BF_CBC_DEC_TEST_VECTORS
2185da7f033dSHerbert Xu 				}
2186da7f033dSHerbert Xu 			}
2187da7f033dSHerbert Xu 		}
2188da7f033dSHerbert Xu 	}, {
2189da7f033dSHerbert Xu 		.alg = "cbc(camellia)",
21901aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2191da7f033dSHerbert Xu 		.suite = {
2192da7f033dSHerbert Xu 			.cipher = {
2193da7f033dSHerbert Xu 				.enc = {
2194da7f033dSHerbert Xu 					.vecs = camellia_cbc_enc_tv_template,
2195da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_ENC_TEST_VECTORS
2196da7f033dSHerbert Xu 				},
2197da7f033dSHerbert Xu 				.dec = {
2198da7f033dSHerbert Xu 					.vecs = camellia_cbc_dec_tv_template,
2199da7f033dSHerbert Xu 					.count = CAMELLIA_CBC_DEC_TEST_VECTORS
2200da7f033dSHerbert Xu 				}
2201da7f033dSHerbert Xu 			}
2202da7f033dSHerbert Xu 		}
2203da7f033dSHerbert Xu 	}, {
2204a2c58260SJohannes Goetzfried 		.alg = "cbc(cast5)",
2205a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2206a2c58260SJohannes Goetzfried 		.suite = {
2207a2c58260SJohannes Goetzfried 			.cipher = {
2208a2c58260SJohannes Goetzfried 				.enc = {
2209a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_enc_tv_template,
2210a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_ENC_TEST_VECTORS
2211a2c58260SJohannes Goetzfried 				},
2212a2c58260SJohannes Goetzfried 				.dec = {
2213a2c58260SJohannes Goetzfried 					.vecs = cast5_cbc_dec_tv_template,
2214a2c58260SJohannes Goetzfried 					.count = CAST5_CBC_DEC_TEST_VECTORS
2215a2c58260SJohannes Goetzfried 				}
2216a2c58260SJohannes Goetzfried 			}
2217a2c58260SJohannes Goetzfried 		}
2218a2c58260SJohannes Goetzfried 	}, {
22199b8b0405SJohannes Goetzfried 		.alg = "cbc(cast6)",
22209b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
22219b8b0405SJohannes Goetzfried 		.suite = {
22229b8b0405SJohannes Goetzfried 			.cipher = {
22239b8b0405SJohannes Goetzfried 				.enc = {
22249b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_enc_tv_template,
22259b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_ENC_TEST_VECTORS
22269b8b0405SJohannes Goetzfried 				},
22279b8b0405SJohannes Goetzfried 				.dec = {
22289b8b0405SJohannes Goetzfried 					.vecs = cast6_cbc_dec_tv_template,
22299b8b0405SJohannes Goetzfried 					.count = CAST6_CBC_DEC_TEST_VECTORS
22309b8b0405SJohannes Goetzfried 				}
22319b8b0405SJohannes Goetzfried 			}
22329b8b0405SJohannes Goetzfried 		}
22339b8b0405SJohannes Goetzfried 	}, {
2234da7f033dSHerbert Xu 		.alg = "cbc(des)",
22351aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2236da7f033dSHerbert Xu 		.suite = {
2237da7f033dSHerbert Xu 			.cipher = {
2238da7f033dSHerbert Xu 				.enc = {
2239da7f033dSHerbert Xu 					.vecs = des_cbc_enc_tv_template,
2240da7f033dSHerbert Xu 					.count = DES_CBC_ENC_TEST_VECTORS
2241da7f033dSHerbert Xu 				},
2242da7f033dSHerbert Xu 				.dec = {
2243da7f033dSHerbert Xu 					.vecs = des_cbc_dec_tv_template,
2244da7f033dSHerbert Xu 					.count = DES_CBC_DEC_TEST_VECTORS
2245da7f033dSHerbert Xu 				}
2246da7f033dSHerbert Xu 			}
2247da7f033dSHerbert Xu 		}
2248da7f033dSHerbert Xu 	}, {
2249da7f033dSHerbert Xu 		.alg = "cbc(des3_ede)",
22501aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2251a1915d51SJarod Wilson 		.fips_allowed = 1,
2252da7f033dSHerbert Xu 		.suite = {
2253da7f033dSHerbert Xu 			.cipher = {
2254da7f033dSHerbert Xu 				.enc = {
2255da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_enc_tv_template,
2256da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_ENC_TEST_VECTORS
2257da7f033dSHerbert Xu 				},
2258da7f033dSHerbert Xu 				.dec = {
2259da7f033dSHerbert Xu 					.vecs = des3_ede_cbc_dec_tv_template,
2260da7f033dSHerbert Xu 					.count = DES3_EDE_CBC_DEC_TEST_VECTORS
2261da7f033dSHerbert Xu 				}
2262da7f033dSHerbert Xu 			}
2263da7f033dSHerbert Xu 		}
2264da7f033dSHerbert Xu 	}, {
22659d25917dSJussi Kivilinna 		.alg = "cbc(serpent)",
22669d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
22679d25917dSJussi Kivilinna 		.suite = {
22689d25917dSJussi Kivilinna 			.cipher = {
22699d25917dSJussi Kivilinna 				.enc = {
22709d25917dSJussi Kivilinna 					.vecs = serpent_cbc_enc_tv_template,
22719d25917dSJussi Kivilinna 					.count = SERPENT_CBC_ENC_TEST_VECTORS
22729d25917dSJussi Kivilinna 				},
22739d25917dSJussi Kivilinna 				.dec = {
22749d25917dSJussi Kivilinna 					.vecs = serpent_cbc_dec_tv_template,
22759d25917dSJussi Kivilinna 					.count = SERPENT_CBC_DEC_TEST_VECTORS
22769d25917dSJussi Kivilinna 				}
22779d25917dSJussi Kivilinna 			}
22789d25917dSJussi Kivilinna 		}
22799d25917dSJussi Kivilinna 	}, {
2280da7f033dSHerbert Xu 		.alg = "cbc(twofish)",
22811aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2282da7f033dSHerbert Xu 		.suite = {
2283da7f033dSHerbert Xu 			.cipher = {
2284da7f033dSHerbert Xu 				.enc = {
2285da7f033dSHerbert Xu 					.vecs = tf_cbc_enc_tv_template,
2286da7f033dSHerbert Xu 					.count = TF_CBC_ENC_TEST_VECTORS
2287da7f033dSHerbert Xu 				},
2288da7f033dSHerbert Xu 				.dec = {
2289da7f033dSHerbert Xu 					.vecs = tf_cbc_dec_tv_template,
2290da7f033dSHerbert Xu 					.count = TF_CBC_DEC_TEST_VECTORS
2291da7f033dSHerbert Xu 				}
2292da7f033dSHerbert Xu 			}
2293da7f033dSHerbert Xu 		}
2294da7f033dSHerbert Xu 	}, {
2295da7f033dSHerbert Xu 		.alg = "ccm(aes)",
2296da7f033dSHerbert Xu 		.test = alg_test_aead,
2297a1915d51SJarod Wilson 		.fips_allowed = 1,
2298da7f033dSHerbert Xu 		.suite = {
2299da7f033dSHerbert Xu 			.aead = {
2300da7f033dSHerbert Xu 				.enc = {
2301da7f033dSHerbert Xu 					.vecs = aes_ccm_enc_tv_template,
2302da7f033dSHerbert Xu 					.count = AES_CCM_ENC_TEST_VECTORS
2303da7f033dSHerbert Xu 				},
2304da7f033dSHerbert Xu 				.dec = {
2305da7f033dSHerbert Xu 					.vecs = aes_ccm_dec_tv_template,
2306da7f033dSHerbert Xu 					.count = AES_CCM_DEC_TEST_VECTORS
2307da7f033dSHerbert Xu 				}
2308da7f033dSHerbert Xu 			}
2309da7f033dSHerbert Xu 		}
2310da7f033dSHerbert Xu 	}, {
23113590ebf2SMartin Willi 		.alg = "chacha20",
23123590ebf2SMartin Willi 		.test = alg_test_skcipher,
23133590ebf2SMartin Willi 		.suite = {
23143590ebf2SMartin Willi 			.cipher = {
23153590ebf2SMartin Willi 				.enc = {
23163590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
23173590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
23183590ebf2SMartin Willi 				},
23193590ebf2SMartin Willi 				.dec = {
23203590ebf2SMartin Willi 					.vecs = chacha20_enc_tv_template,
23213590ebf2SMartin Willi 					.count = CHACHA20_ENC_TEST_VECTORS
23223590ebf2SMartin Willi 				},
23233590ebf2SMartin Willi 			}
23243590ebf2SMartin Willi 		}
23253590ebf2SMartin Willi 	}, {
232693b5e86aSJussi Kivilinna 		.alg = "cmac(aes)",
232793b5e86aSJussi Kivilinna 		.test = alg_test_hash,
232893b5e86aSJussi Kivilinna 		.suite = {
232993b5e86aSJussi Kivilinna 			.hash = {
233093b5e86aSJussi Kivilinna 				.vecs = aes_cmac128_tv_template,
233193b5e86aSJussi Kivilinna 				.count = CMAC_AES_TEST_VECTORS
233293b5e86aSJussi Kivilinna 			}
233393b5e86aSJussi Kivilinna 		}
233493b5e86aSJussi Kivilinna 	}, {
233593b5e86aSJussi Kivilinna 		.alg = "cmac(des3_ede)",
233693b5e86aSJussi Kivilinna 		.test = alg_test_hash,
233793b5e86aSJussi Kivilinna 		.suite = {
233893b5e86aSJussi Kivilinna 			.hash = {
233993b5e86aSJussi Kivilinna 				.vecs = des3_ede_cmac64_tv_template,
234093b5e86aSJussi Kivilinna 				.count = CMAC_DES3_EDE_TEST_VECTORS
234193b5e86aSJussi Kivilinna 			}
234293b5e86aSJussi Kivilinna 		}
234393b5e86aSJussi Kivilinna 	}, {
2344e448370dSJussi Kivilinna 		.alg = "compress_null",
2345e448370dSJussi Kivilinna 		.test = alg_test_null,
2346e448370dSJussi Kivilinna 	}, {
2347ebb3472fSArd Biesheuvel 		.alg = "crc32",
2348ebb3472fSArd Biesheuvel 		.test = alg_test_hash,
2349ebb3472fSArd Biesheuvel 		.suite = {
2350ebb3472fSArd Biesheuvel 			.hash = {
2351ebb3472fSArd Biesheuvel 				.vecs = crc32_tv_template,
2352ebb3472fSArd Biesheuvel 				.count = CRC32_TEST_VECTORS
2353ebb3472fSArd Biesheuvel 			}
2354ebb3472fSArd Biesheuvel 		}
2355ebb3472fSArd Biesheuvel 	}, {
2356da7f033dSHerbert Xu 		.alg = "crc32c",
23578e3ee85eSHerbert Xu 		.test = alg_test_crc32c,
2358a1915d51SJarod Wilson 		.fips_allowed = 1,
2359da7f033dSHerbert Xu 		.suite = {
2360da7f033dSHerbert Xu 			.hash = {
2361da7f033dSHerbert Xu 				.vecs = crc32c_tv_template,
2362da7f033dSHerbert Xu 				.count = CRC32C_TEST_VECTORS
2363da7f033dSHerbert Xu 			}
2364da7f033dSHerbert Xu 		}
2365da7f033dSHerbert Xu 	}, {
236668411521SHerbert Xu 		.alg = "crct10dif",
236768411521SHerbert Xu 		.test = alg_test_hash,
236868411521SHerbert Xu 		.fips_allowed = 1,
236968411521SHerbert Xu 		.suite = {
237068411521SHerbert Xu 			.hash = {
237168411521SHerbert Xu 				.vecs = crct10dif_tv_template,
237268411521SHerbert Xu 				.count = CRCT10DIF_TEST_VECTORS
237368411521SHerbert Xu 			}
237468411521SHerbert Xu 		}
237568411521SHerbert Xu 	}, {
23766c79294fSMilan Broz 		.alg = "cryptd(__driver-cbc-aes-aesni)",
23776c79294fSMilan Broz 		.test = alg_test_null,
23786c79294fSMilan Broz 		.fips_allowed = 1,
23796c79294fSMilan Broz 	}, {
2380d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni)",
2381d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2382d9b1d2e7SJussi Kivilinna 	}, {
2383f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
2384f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2385f3f935a7SJussi Kivilinna 	}, {
238656d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-cbc-serpent-avx2)",
238756d76c96SJussi Kivilinna 		.test = alg_test_null,
238856d76c96SJussi Kivilinna 	}, {
2389863b557aSYouquan, Song 		.alg = "cryptd(__driver-ecb-aes-aesni)",
2390863b557aSYouquan, Song 		.test = alg_test_null,
23916c79294fSMilan Broz 		.fips_allowed = 1,
2392863b557aSYouquan, Song 	}, {
2393d9b1d2e7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni)",
2394d9b1d2e7SJussi Kivilinna 		.test = alg_test_null,
2395d9b1d2e7SJussi Kivilinna 	}, {
2396f3f935a7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
2397f3f935a7SJussi Kivilinna 		.test = alg_test_null,
2398f3f935a7SJussi Kivilinna 	}, {
23994d6d6a2cSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast5-avx)",
24004d6d6a2cSJohannes Goetzfried 		.test = alg_test_null,
24014d6d6a2cSJohannes Goetzfried 	}, {
24024ea1277dSJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-cast6-avx)",
24034ea1277dSJohannes Goetzfried 		.test = alg_test_null,
24044ea1277dSJohannes Goetzfried 	}, {
24057efe4076SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-serpent-avx)",
24067efe4076SJohannes Goetzfried 		.test = alg_test_null,
24077efe4076SJohannes Goetzfried 	}, {
240856d76c96SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-avx2)",
240956d76c96SJussi Kivilinna 		.test = alg_test_null,
241056d76c96SJussi Kivilinna 	}, {
2411937c30d7SJussi Kivilinna 		.alg = "cryptd(__driver-ecb-serpent-sse2)",
2412937c30d7SJussi Kivilinna 		.test = alg_test_null,
2413937c30d7SJussi Kivilinna 	}, {
2414107778b5SJohannes Goetzfried 		.alg = "cryptd(__driver-ecb-twofish-avx)",
2415107778b5SJohannes Goetzfried 		.test = alg_test_null,
2416107778b5SJohannes Goetzfried 	}, {
24176c79294fSMilan Broz 		.alg = "cryptd(__driver-gcm-aes-aesni)",
24186c79294fSMilan Broz 		.test = alg_test_null,
24196c79294fSMilan Broz 		.fips_allowed = 1,
24206c79294fSMilan Broz 	}, {
2421863b557aSYouquan, Song 		.alg = "cryptd(__ghash-pclmulqdqni)",
2422863b557aSYouquan, Song 		.test = alg_test_null,
24236c79294fSMilan Broz 		.fips_allowed = 1,
2424863b557aSYouquan, Song 	}, {
2425f7cb80f2SJarod Wilson 		.alg = "ctr(aes)",
2426f7cb80f2SJarod Wilson 		.test = alg_test_skcipher,
2427a1915d51SJarod Wilson 		.fips_allowed = 1,
2428f7cb80f2SJarod Wilson 		.suite = {
2429f7cb80f2SJarod Wilson 			.cipher = {
2430f7cb80f2SJarod Wilson 				.enc = {
2431f7cb80f2SJarod Wilson 					.vecs = aes_ctr_enc_tv_template,
2432f7cb80f2SJarod Wilson 					.count = AES_CTR_ENC_TEST_VECTORS
2433f7cb80f2SJarod Wilson 				},
2434f7cb80f2SJarod Wilson 				.dec = {
2435f7cb80f2SJarod Wilson 					.vecs = aes_ctr_dec_tv_template,
2436f7cb80f2SJarod Wilson 					.count = AES_CTR_DEC_TEST_VECTORS
2437f7cb80f2SJarod Wilson 				}
2438f7cb80f2SJarod Wilson 			}
2439f7cb80f2SJarod Wilson 		}
2440f7cb80f2SJarod Wilson 	}, {
244185b63e34SJussi Kivilinna 		.alg = "ctr(blowfish)",
244285b63e34SJussi Kivilinna 		.test = alg_test_skcipher,
244385b63e34SJussi Kivilinna 		.suite = {
244485b63e34SJussi Kivilinna 			.cipher = {
244585b63e34SJussi Kivilinna 				.enc = {
244685b63e34SJussi Kivilinna 					.vecs = bf_ctr_enc_tv_template,
244785b63e34SJussi Kivilinna 					.count = BF_CTR_ENC_TEST_VECTORS
244885b63e34SJussi Kivilinna 				},
244985b63e34SJussi Kivilinna 				.dec = {
245085b63e34SJussi Kivilinna 					.vecs = bf_ctr_dec_tv_template,
245185b63e34SJussi Kivilinna 					.count = BF_CTR_DEC_TEST_VECTORS
245285b63e34SJussi Kivilinna 				}
245385b63e34SJussi Kivilinna 			}
245485b63e34SJussi Kivilinna 		}
245585b63e34SJussi Kivilinna 	}, {
24560840605eSJussi Kivilinna 		.alg = "ctr(camellia)",
24570840605eSJussi Kivilinna 		.test = alg_test_skcipher,
24580840605eSJussi Kivilinna 		.suite = {
24590840605eSJussi Kivilinna 			.cipher = {
24600840605eSJussi Kivilinna 				.enc = {
24610840605eSJussi Kivilinna 					.vecs = camellia_ctr_enc_tv_template,
24620840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_ENC_TEST_VECTORS
24630840605eSJussi Kivilinna 				},
24640840605eSJussi Kivilinna 				.dec = {
24650840605eSJussi Kivilinna 					.vecs = camellia_ctr_dec_tv_template,
24660840605eSJussi Kivilinna 					.count = CAMELLIA_CTR_DEC_TEST_VECTORS
24670840605eSJussi Kivilinna 				}
24680840605eSJussi Kivilinna 			}
24690840605eSJussi Kivilinna 		}
24700840605eSJussi Kivilinna 	}, {
2471a2c58260SJohannes Goetzfried 		.alg = "ctr(cast5)",
2472a2c58260SJohannes Goetzfried 		.test = alg_test_skcipher,
2473a2c58260SJohannes Goetzfried 		.suite = {
2474a2c58260SJohannes Goetzfried 			.cipher = {
2475a2c58260SJohannes Goetzfried 				.enc = {
2476a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_enc_tv_template,
2477a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_ENC_TEST_VECTORS
2478a2c58260SJohannes Goetzfried 				},
2479a2c58260SJohannes Goetzfried 				.dec = {
2480a2c58260SJohannes Goetzfried 					.vecs = cast5_ctr_dec_tv_template,
2481a2c58260SJohannes Goetzfried 					.count = CAST5_CTR_DEC_TEST_VECTORS
2482a2c58260SJohannes Goetzfried 				}
2483a2c58260SJohannes Goetzfried 			}
2484a2c58260SJohannes Goetzfried 		}
2485a2c58260SJohannes Goetzfried 	}, {
24869b8b0405SJohannes Goetzfried 		.alg = "ctr(cast6)",
24879b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
24889b8b0405SJohannes Goetzfried 		.suite = {
24899b8b0405SJohannes Goetzfried 			.cipher = {
24909b8b0405SJohannes Goetzfried 				.enc = {
24919b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_enc_tv_template,
24929b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_ENC_TEST_VECTORS
24939b8b0405SJohannes Goetzfried 				},
24949b8b0405SJohannes Goetzfried 				.dec = {
24959b8b0405SJohannes Goetzfried 					.vecs = cast6_ctr_dec_tv_template,
24969b8b0405SJohannes Goetzfried 					.count = CAST6_CTR_DEC_TEST_VECTORS
24979b8b0405SJohannes Goetzfried 				}
24989b8b0405SJohannes Goetzfried 			}
24999b8b0405SJohannes Goetzfried 		}
25009b8b0405SJohannes Goetzfried 	}, {
25018163fc30SJussi Kivilinna 		.alg = "ctr(des)",
25028163fc30SJussi Kivilinna 		.test = alg_test_skcipher,
25038163fc30SJussi Kivilinna 		.suite = {
25048163fc30SJussi Kivilinna 			.cipher = {
25058163fc30SJussi Kivilinna 				.enc = {
25068163fc30SJussi Kivilinna 					.vecs = des_ctr_enc_tv_template,
25078163fc30SJussi Kivilinna 					.count = DES_CTR_ENC_TEST_VECTORS
25088163fc30SJussi Kivilinna 				},
25098163fc30SJussi Kivilinna 				.dec = {
25108163fc30SJussi Kivilinna 					.vecs = des_ctr_dec_tv_template,
25118163fc30SJussi Kivilinna 					.count = DES_CTR_DEC_TEST_VECTORS
25128163fc30SJussi Kivilinna 				}
25138163fc30SJussi Kivilinna 			}
25148163fc30SJussi Kivilinna 		}
25158163fc30SJussi Kivilinna 	}, {
2516e080b17aSJussi Kivilinna 		.alg = "ctr(des3_ede)",
2517e080b17aSJussi Kivilinna 		.test = alg_test_skcipher,
2518e080b17aSJussi Kivilinna 		.suite = {
2519e080b17aSJussi Kivilinna 			.cipher = {
2520e080b17aSJussi Kivilinna 				.enc = {
2521e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_enc_tv_template,
2522e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_ENC_TEST_VECTORS
2523e080b17aSJussi Kivilinna 				},
2524e080b17aSJussi Kivilinna 				.dec = {
2525e080b17aSJussi Kivilinna 					.vecs = des3_ede_ctr_dec_tv_template,
2526e080b17aSJussi Kivilinna 					.count = DES3_EDE_CTR_DEC_TEST_VECTORS
2527e080b17aSJussi Kivilinna 				}
2528e080b17aSJussi Kivilinna 			}
2529e080b17aSJussi Kivilinna 		}
2530e080b17aSJussi Kivilinna 	}, {
25319d25917dSJussi Kivilinna 		.alg = "ctr(serpent)",
25329d25917dSJussi Kivilinna 		.test = alg_test_skcipher,
25339d25917dSJussi Kivilinna 		.suite = {
25349d25917dSJussi Kivilinna 			.cipher = {
25359d25917dSJussi Kivilinna 				.enc = {
25369d25917dSJussi Kivilinna 					.vecs = serpent_ctr_enc_tv_template,
25379d25917dSJussi Kivilinna 					.count = SERPENT_CTR_ENC_TEST_VECTORS
25389d25917dSJussi Kivilinna 				},
25399d25917dSJussi Kivilinna 				.dec = {
25409d25917dSJussi Kivilinna 					.vecs = serpent_ctr_dec_tv_template,
25419d25917dSJussi Kivilinna 					.count = SERPENT_CTR_DEC_TEST_VECTORS
25429d25917dSJussi Kivilinna 				}
25439d25917dSJussi Kivilinna 			}
25449d25917dSJussi Kivilinna 		}
25459d25917dSJussi Kivilinna 	}, {
2546573da620SJussi Kivilinna 		.alg = "ctr(twofish)",
2547573da620SJussi Kivilinna 		.test = alg_test_skcipher,
2548573da620SJussi Kivilinna 		.suite = {
2549573da620SJussi Kivilinna 			.cipher = {
2550573da620SJussi Kivilinna 				.enc = {
2551573da620SJussi Kivilinna 					.vecs = tf_ctr_enc_tv_template,
2552573da620SJussi Kivilinna 					.count = TF_CTR_ENC_TEST_VECTORS
2553573da620SJussi Kivilinna 				},
2554573da620SJussi Kivilinna 				.dec = {
2555573da620SJussi Kivilinna 					.vecs = tf_ctr_dec_tv_template,
2556573da620SJussi Kivilinna 					.count = TF_CTR_DEC_TEST_VECTORS
2557573da620SJussi Kivilinna 				}
2558573da620SJussi Kivilinna 			}
2559573da620SJussi Kivilinna 		}
2560573da620SJussi Kivilinna 	}, {
2561da7f033dSHerbert Xu 		.alg = "cts(cbc(aes))",
25621aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2563da7f033dSHerbert Xu 		.suite = {
2564da7f033dSHerbert Xu 			.cipher = {
2565da7f033dSHerbert Xu 				.enc = {
2566da7f033dSHerbert Xu 					.vecs = cts_mode_enc_tv_template,
2567da7f033dSHerbert Xu 					.count = CTS_MODE_ENC_TEST_VECTORS
2568da7f033dSHerbert Xu 				},
2569da7f033dSHerbert Xu 				.dec = {
2570da7f033dSHerbert Xu 					.vecs = cts_mode_dec_tv_template,
2571da7f033dSHerbert Xu 					.count = CTS_MODE_DEC_TEST_VECTORS
2572da7f033dSHerbert Xu 				}
2573da7f033dSHerbert Xu 			}
2574da7f033dSHerbert Xu 		}
2575da7f033dSHerbert Xu 	}, {
2576da7f033dSHerbert Xu 		.alg = "deflate",
2577da7f033dSHerbert Xu 		.test = alg_test_comp,
25780818904dSMilan Broz 		.fips_allowed = 1,
2579da7f033dSHerbert Xu 		.suite = {
2580da7f033dSHerbert Xu 			.comp = {
2581da7f033dSHerbert Xu 				.comp = {
2582da7f033dSHerbert Xu 					.vecs = deflate_comp_tv_template,
2583da7f033dSHerbert Xu 					.count = DEFLATE_COMP_TEST_VECTORS
2584da7f033dSHerbert Xu 				},
2585da7f033dSHerbert Xu 				.decomp = {
2586da7f033dSHerbert Xu 					.vecs = deflate_decomp_tv_template,
2587da7f033dSHerbert Xu 					.count = DEFLATE_DECOMP_TEST_VECTORS
2588da7f033dSHerbert Xu 				}
2589da7f033dSHerbert Xu 			}
2590da7f033dSHerbert Xu 		}
2591da7f033dSHerbert Xu 	}, {
2592e448370dSJussi Kivilinna 		.alg = "digest_null",
2593e448370dSJussi Kivilinna 		.test = alg_test_null,
2594e448370dSJussi Kivilinna 	}, {
259564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes128",
259664d1cdfbSStephan Mueller 		.test = alg_test_drbg,
259764d1cdfbSStephan Mueller 		.fips_allowed = 1,
259864d1cdfbSStephan Mueller 		.suite = {
259964d1cdfbSStephan Mueller 			.drbg = {
260064d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes128_tv_template,
260164d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
260264d1cdfbSStephan Mueller 			}
260364d1cdfbSStephan Mueller 		}
260464d1cdfbSStephan Mueller 	}, {
260564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes192",
260664d1cdfbSStephan Mueller 		.test = alg_test_drbg,
260764d1cdfbSStephan Mueller 		.fips_allowed = 1,
260864d1cdfbSStephan Mueller 		.suite = {
260964d1cdfbSStephan Mueller 			.drbg = {
261064d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes192_tv_template,
261164d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
261264d1cdfbSStephan Mueller 			}
261364d1cdfbSStephan Mueller 		}
261464d1cdfbSStephan Mueller 	}, {
261564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_ctr_aes256",
261664d1cdfbSStephan Mueller 		.test = alg_test_drbg,
261764d1cdfbSStephan Mueller 		.fips_allowed = 1,
261864d1cdfbSStephan Mueller 		.suite = {
261964d1cdfbSStephan Mueller 			.drbg = {
262064d1cdfbSStephan Mueller 				.vecs = drbg_nopr_ctr_aes256_tv_template,
262164d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
262264d1cdfbSStephan Mueller 			}
262364d1cdfbSStephan Mueller 		}
262464d1cdfbSStephan Mueller 	}, {
262564d1cdfbSStephan Mueller 		/*
262664d1cdfbSStephan Mueller 		 * There is no need to specifically test the DRBG with every
262764d1cdfbSStephan Mueller 		 * backend cipher -- covered by drbg_nopr_hmac_sha256 test
262864d1cdfbSStephan Mueller 		 */
262964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha1",
263064d1cdfbSStephan Mueller 		.fips_allowed = 1,
263164d1cdfbSStephan Mueller 		.test = alg_test_null,
263264d1cdfbSStephan Mueller 	}, {
263364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha256",
263464d1cdfbSStephan Mueller 		.test = alg_test_drbg,
263564d1cdfbSStephan Mueller 		.fips_allowed = 1,
263664d1cdfbSStephan Mueller 		.suite = {
263764d1cdfbSStephan Mueller 			.drbg = {
263864d1cdfbSStephan Mueller 				.vecs = drbg_nopr_hmac_sha256_tv_template,
263964d1cdfbSStephan Mueller 				.count =
264064d1cdfbSStephan Mueller 				ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
264164d1cdfbSStephan Mueller 			}
264264d1cdfbSStephan Mueller 		}
264364d1cdfbSStephan Mueller 	}, {
264464d1cdfbSStephan Mueller 		/* covered by drbg_nopr_hmac_sha256 test */
264564d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha384",
264664d1cdfbSStephan Mueller 		.fips_allowed = 1,
264764d1cdfbSStephan Mueller 		.test = alg_test_null,
264864d1cdfbSStephan Mueller 	}, {
264964d1cdfbSStephan Mueller 		.alg = "drbg_nopr_hmac_sha512",
265064d1cdfbSStephan Mueller 		.test = alg_test_null,
265164d1cdfbSStephan Mueller 		.fips_allowed = 1,
265264d1cdfbSStephan Mueller 	}, {
265364d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha1",
265464d1cdfbSStephan Mueller 		.fips_allowed = 1,
265564d1cdfbSStephan Mueller 		.test = alg_test_null,
265664d1cdfbSStephan Mueller 	}, {
265764d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha256",
265864d1cdfbSStephan Mueller 		.test = alg_test_drbg,
265964d1cdfbSStephan Mueller 		.fips_allowed = 1,
266064d1cdfbSStephan Mueller 		.suite = {
266164d1cdfbSStephan Mueller 			.drbg = {
266264d1cdfbSStephan Mueller 				.vecs = drbg_nopr_sha256_tv_template,
266364d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
266464d1cdfbSStephan Mueller 			}
266564d1cdfbSStephan Mueller 		}
266664d1cdfbSStephan Mueller 	}, {
266764d1cdfbSStephan Mueller 		/* covered by drbg_nopr_sha256 test */
266864d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha384",
266964d1cdfbSStephan Mueller 		.fips_allowed = 1,
267064d1cdfbSStephan Mueller 		.test = alg_test_null,
267164d1cdfbSStephan Mueller 	}, {
267264d1cdfbSStephan Mueller 		.alg = "drbg_nopr_sha512",
267364d1cdfbSStephan Mueller 		.fips_allowed = 1,
267464d1cdfbSStephan Mueller 		.test = alg_test_null,
267564d1cdfbSStephan Mueller 	}, {
267664d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes128",
267764d1cdfbSStephan Mueller 		.test = alg_test_drbg,
267864d1cdfbSStephan Mueller 		.fips_allowed = 1,
267964d1cdfbSStephan Mueller 		.suite = {
268064d1cdfbSStephan Mueller 			.drbg = {
268164d1cdfbSStephan Mueller 				.vecs = drbg_pr_ctr_aes128_tv_template,
268264d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
268364d1cdfbSStephan Mueller 			}
268464d1cdfbSStephan Mueller 		}
268564d1cdfbSStephan Mueller 	}, {
268664d1cdfbSStephan Mueller 		/* covered by drbg_pr_ctr_aes128 test */
268764d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes192",
268864d1cdfbSStephan Mueller 		.fips_allowed = 1,
268964d1cdfbSStephan Mueller 		.test = alg_test_null,
269064d1cdfbSStephan Mueller 	}, {
269164d1cdfbSStephan Mueller 		.alg = "drbg_pr_ctr_aes256",
269264d1cdfbSStephan Mueller 		.fips_allowed = 1,
269364d1cdfbSStephan Mueller 		.test = alg_test_null,
269464d1cdfbSStephan Mueller 	}, {
269564d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha1",
269664d1cdfbSStephan Mueller 		.fips_allowed = 1,
269764d1cdfbSStephan Mueller 		.test = alg_test_null,
269864d1cdfbSStephan Mueller 	}, {
269964d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha256",
270064d1cdfbSStephan Mueller 		.test = alg_test_drbg,
270164d1cdfbSStephan Mueller 		.fips_allowed = 1,
270264d1cdfbSStephan Mueller 		.suite = {
270364d1cdfbSStephan Mueller 			.drbg = {
270464d1cdfbSStephan Mueller 				.vecs = drbg_pr_hmac_sha256_tv_template,
270564d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
270664d1cdfbSStephan Mueller 			}
270764d1cdfbSStephan Mueller 		}
270864d1cdfbSStephan Mueller 	}, {
270964d1cdfbSStephan Mueller 		/* covered by drbg_pr_hmac_sha256 test */
271064d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha384",
271164d1cdfbSStephan Mueller 		.fips_allowed = 1,
271264d1cdfbSStephan Mueller 		.test = alg_test_null,
271364d1cdfbSStephan Mueller 	}, {
271464d1cdfbSStephan Mueller 		.alg = "drbg_pr_hmac_sha512",
271564d1cdfbSStephan Mueller 		.test = alg_test_null,
271664d1cdfbSStephan Mueller 		.fips_allowed = 1,
271764d1cdfbSStephan Mueller 	}, {
271864d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha1",
271964d1cdfbSStephan Mueller 		.fips_allowed = 1,
272064d1cdfbSStephan Mueller 		.test = alg_test_null,
272164d1cdfbSStephan Mueller 	}, {
272264d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha256",
272364d1cdfbSStephan Mueller 		.test = alg_test_drbg,
272464d1cdfbSStephan Mueller 		.fips_allowed = 1,
272564d1cdfbSStephan Mueller 		.suite = {
272664d1cdfbSStephan Mueller 			.drbg = {
272764d1cdfbSStephan Mueller 				.vecs = drbg_pr_sha256_tv_template,
272864d1cdfbSStephan Mueller 				.count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
272964d1cdfbSStephan Mueller 			}
273064d1cdfbSStephan Mueller 		}
273164d1cdfbSStephan Mueller 	}, {
273264d1cdfbSStephan Mueller 		/* covered by drbg_pr_sha256 test */
273364d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha384",
273464d1cdfbSStephan Mueller 		.fips_allowed = 1,
273564d1cdfbSStephan Mueller 		.test = alg_test_null,
273664d1cdfbSStephan Mueller 	}, {
273764d1cdfbSStephan Mueller 		.alg = "drbg_pr_sha512",
273864d1cdfbSStephan Mueller 		.fips_allowed = 1,
273964d1cdfbSStephan Mueller 		.test = alg_test_null,
274064d1cdfbSStephan Mueller 	}, {
2741863b557aSYouquan, Song 		.alg = "ecb(__aes-aesni)",
2742863b557aSYouquan, Song 		.test = alg_test_null,
27436c79294fSMilan Broz 		.fips_allowed = 1,
2744863b557aSYouquan, Song 	}, {
2745da7f033dSHerbert Xu 		.alg = "ecb(aes)",
27461aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2747a1915d51SJarod Wilson 		.fips_allowed = 1,
2748da7f033dSHerbert Xu 		.suite = {
2749da7f033dSHerbert Xu 			.cipher = {
2750da7f033dSHerbert Xu 				.enc = {
2751da7f033dSHerbert Xu 					.vecs = aes_enc_tv_template,
2752da7f033dSHerbert Xu 					.count = AES_ENC_TEST_VECTORS
2753da7f033dSHerbert Xu 				},
2754da7f033dSHerbert Xu 				.dec = {
2755da7f033dSHerbert Xu 					.vecs = aes_dec_tv_template,
2756da7f033dSHerbert Xu 					.count = AES_DEC_TEST_VECTORS
2757da7f033dSHerbert Xu 				}
2758da7f033dSHerbert Xu 			}
2759da7f033dSHerbert Xu 		}
2760da7f033dSHerbert Xu 	}, {
2761da7f033dSHerbert Xu 		.alg = "ecb(anubis)",
27621aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2763da7f033dSHerbert Xu 		.suite = {
2764da7f033dSHerbert Xu 			.cipher = {
2765da7f033dSHerbert Xu 				.enc = {
2766da7f033dSHerbert Xu 					.vecs = anubis_enc_tv_template,
2767da7f033dSHerbert Xu 					.count = ANUBIS_ENC_TEST_VECTORS
2768da7f033dSHerbert Xu 				},
2769da7f033dSHerbert Xu 				.dec = {
2770da7f033dSHerbert Xu 					.vecs = anubis_dec_tv_template,
2771da7f033dSHerbert Xu 					.count = ANUBIS_DEC_TEST_VECTORS
2772da7f033dSHerbert Xu 				}
2773da7f033dSHerbert Xu 			}
2774da7f033dSHerbert Xu 		}
2775da7f033dSHerbert Xu 	}, {
2776da7f033dSHerbert Xu 		.alg = "ecb(arc4)",
27771aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2778da7f033dSHerbert Xu 		.suite = {
2779da7f033dSHerbert Xu 			.cipher = {
2780da7f033dSHerbert Xu 				.enc = {
2781da7f033dSHerbert Xu 					.vecs = arc4_enc_tv_template,
2782da7f033dSHerbert Xu 					.count = ARC4_ENC_TEST_VECTORS
2783da7f033dSHerbert Xu 				},
2784da7f033dSHerbert Xu 				.dec = {
2785da7f033dSHerbert Xu 					.vecs = arc4_dec_tv_template,
2786da7f033dSHerbert Xu 					.count = ARC4_DEC_TEST_VECTORS
2787da7f033dSHerbert Xu 				}
2788da7f033dSHerbert Xu 			}
2789da7f033dSHerbert Xu 		}
2790da7f033dSHerbert Xu 	}, {
2791da7f033dSHerbert Xu 		.alg = "ecb(blowfish)",
27921aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2793da7f033dSHerbert Xu 		.suite = {
2794da7f033dSHerbert Xu 			.cipher = {
2795da7f033dSHerbert Xu 				.enc = {
2796da7f033dSHerbert Xu 					.vecs = bf_enc_tv_template,
2797da7f033dSHerbert Xu 					.count = BF_ENC_TEST_VECTORS
2798da7f033dSHerbert Xu 				},
2799da7f033dSHerbert Xu 				.dec = {
2800da7f033dSHerbert Xu 					.vecs = bf_dec_tv_template,
2801da7f033dSHerbert Xu 					.count = BF_DEC_TEST_VECTORS
2802da7f033dSHerbert Xu 				}
2803da7f033dSHerbert Xu 			}
2804da7f033dSHerbert Xu 		}
2805da7f033dSHerbert Xu 	}, {
2806da7f033dSHerbert Xu 		.alg = "ecb(camellia)",
28071aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2808da7f033dSHerbert Xu 		.suite = {
2809da7f033dSHerbert Xu 			.cipher = {
2810da7f033dSHerbert Xu 				.enc = {
2811da7f033dSHerbert Xu 					.vecs = camellia_enc_tv_template,
2812da7f033dSHerbert Xu 					.count = CAMELLIA_ENC_TEST_VECTORS
2813da7f033dSHerbert Xu 				},
2814da7f033dSHerbert Xu 				.dec = {
2815da7f033dSHerbert Xu 					.vecs = camellia_dec_tv_template,
2816da7f033dSHerbert Xu 					.count = CAMELLIA_DEC_TEST_VECTORS
2817da7f033dSHerbert Xu 				}
2818da7f033dSHerbert Xu 			}
2819da7f033dSHerbert Xu 		}
2820da7f033dSHerbert Xu 	}, {
2821da7f033dSHerbert Xu 		.alg = "ecb(cast5)",
28221aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2823da7f033dSHerbert Xu 		.suite = {
2824da7f033dSHerbert Xu 			.cipher = {
2825da7f033dSHerbert Xu 				.enc = {
2826da7f033dSHerbert Xu 					.vecs = cast5_enc_tv_template,
2827da7f033dSHerbert Xu 					.count = CAST5_ENC_TEST_VECTORS
2828da7f033dSHerbert Xu 				},
2829da7f033dSHerbert Xu 				.dec = {
2830da7f033dSHerbert Xu 					.vecs = cast5_dec_tv_template,
2831da7f033dSHerbert Xu 					.count = CAST5_DEC_TEST_VECTORS
2832da7f033dSHerbert Xu 				}
2833da7f033dSHerbert Xu 			}
2834da7f033dSHerbert Xu 		}
2835da7f033dSHerbert Xu 	}, {
2836da7f033dSHerbert Xu 		.alg = "ecb(cast6)",
28371aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2838da7f033dSHerbert Xu 		.suite = {
2839da7f033dSHerbert Xu 			.cipher = {
2840da7f033dSHerbert Xu 				.enc = {
2841da7f033dSHerbert Xu 					.vecs = cast6_enc_tv_template,
2842da7f033dSHerbert Xu 					.count = CAST6_ENC_TEST_VECTORS
2843da7f033dSHerbert Xu 				},
2844da7f033dSHerbert Xu 				.dec = {
2845da7f033dSHerbert Xu 					.vecs = cast6_dec_tv_template,
2846da7f033dSHerbert Xu 					.count = CAST6_DEC_TEST_VECTORS
2847da7f033dSHerbert Xu 				}
2848da7f033dSHerbert Xu 			}
2849da7f033dSHerbert Xu 		}
2850da7f033dSHerbert Xu 	}, {
2851e448370dSJussi Kivilinna 		.alg = "ecb(cipher_null)",
2852e448370dSJussi Kivilinna 		.test = alg_test_null,
2853e448370dSJussi Kivilinna 	}, {
2854da7f033dSHerbert Xu 		.alg = "ecb(des)",
28551aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2856a1915d51SJarod Wilson 		.fips_allowed = 1,
2857da7f033dSHerbert Xu 		.suite = {
2858da7f033dSHerbert Xu 			.cipher = {
2859da7f033dSHerbert Xu 				.enc = {
2860da7f033dSHerbert Xu 					.vecs = des_enc_tv_template,
2861da7f033dSHerbert Xu 					.count = DES_ENC_TEST_VECTORS
2862da7f033dSHerbert Xu 				},
2863da7f033dSHerbert Xu 				.dec = {
2864da7f033dSHerbert Xu 					.vecs = des_dec_tv_template,
2865da7f033dSHerbert Xu 					.count = DES_DEC_TEST_VECTORS
2866da7f033dSHerbert Xu 				}
2867da7f033dSHerbert Xu 			}
2868da7f033dSHerbert Xu 		}
2869da7f033dSHerbert Xu 	}, {
2870da7f033dSHerbert Xu 		.alg = "ecb(des3_ede)",
28711aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2872a1915d51SJarod Wilson 		.fips_allowed = 1,
2873da7f033dSHerbert Xu 		.suite = {
2874da7f033dSHerbert Xu 			.cipher = {
2875da7f033dSHerbert Xu 				.enc = {
2876da7f033dSHerbert Xu 					.vecs = des3_ede_enc_tv_template,
2877da7f033dSHerbert Xu 					.count = DES3_EDE_ENC_TEST_VECTORS
2878da7f033dSHerbert Xu 				},
2879da7f033dSHerbert Xu 				.dec = {
2880da7f033dSHerbert Xu 					.vecs = des3_ede_dec_tv_template,
2881da7f033dSHerbert Xu 					.count = DES3_EDE_DEC_TEST_VECTORS
2882da7f033dSHerbert Xu 				}
2883da7f033dSHerbert Xu 			}
2884da7f033dSHerbert Xu 		}
2885da7f033dSHerbert Xu 	}, {
288666e5bd00SJussi Kivilinna 		.alg = "ecb(fcrypt)",
288766e5bd00SJussi Kivilinna 		.test = alg_test_skcipher,
288866e5bd00SJussi Kivilinna 		.suite = {
288966e5bd00SJussi Kivilinna 			.cipher = {
289066e5bd00SJussi Kivilinna 				.enc = {
289166e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_enc_tv_template,
289266e5bd00SJussi Kivilinna 					.count = 1
289366e5bd00SJussi Kivilinna 				},
289466e5bd00SJussi Kivilinna 				.dec = {
289566e5bd00SJussi Kivilinna 					.vecs = fcrypt_pcbc_dec_tv_template,
289666e5bd00SJussi Kivilinna 					.count = 1
289766e5bd00SJussi Kivilinna 				}
289866e5bd00SJussi Kivilinna 			}
289966e5bd00SJussi Kivilinna 		}
290066e5bd00SJussi Kivilinna 	}, {
2901da7f033dSHerbert Xu 		.alg = "ecb(khazad)",
29021aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2903da7f033dSHerbert Xu 		.suite = {
2904da7f033dSHerbert Xu 			.cipher = {
2905da7f033dSHerbert Xu 				.enc = {
2906da7f033dSHerbert Xu 					.vecs = khazad_enc_tv_template,
2907da7f033dSHerbert Xu 					.count = KHAZAD_ENC_TEST_VECTORS
2908da7f033dSHerbert Xu 				},
2909da7f033dSHerbert Xu 				.dec = {
2910da7f033dSHerbert Xu 					.vecs = khazad_dec_tv_template,
2911da7f033dSHerbert Xu 					.count = KHAZAD_DEC_TEST_VECTORS
2912da7f033dSHerbert Xu 				}
2913da7f033dSHerbert Xu 			}
2914da7f033dSHerbert Xu 		}
2915da7f033dSHerbert Xu 	}, {
2916da7f033dSHerbert Xu 		.alg = "ecb(seed)",
29171aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2918da7f033dSHerbert Xu 		.suite = {
2919da7f033dSHerbert Xu 			.cipher = {
2920da7f033dSHerbert Xu 				.enc = {
2921da7f033dSHerbert Xu 					.vecs = seed_enc_tv_template,
2922da7f033dSHerbert Xu 					.count = SEED_ENC_TEST_VECTORS
2923da7f033dSHerbert Xu 				},
2924da7f033dSHerbert Xu 				.dec = {
2925da7f033dSHerbert Xu 					.vecs = seed_dec_tv_template,
2926da7f033dSHerbert Xu 					.count = SEED_DEC_TEST_VECTORS
2927da7f033dSHerbert Xu 				}
2928da7f033dSHerbert Xu 			}
2929da7f033dSHerbert Xu 		}
2930da7f033dSHerbert Xu 	}, {
2931da7f033dSHerbert Xu 		.alg = "ecb(serpent)",
29321aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2933da7f033dSHerbert Xu 		.suite = {
2934da7f033dSHerbert Xu 			.cipher = {
2935da7f033dSHerbert Xu 				.enc = {
2936da7f033dSHerbert Xu 					.vecs = serpent_enc_tv_template,
2937da7f033dSHerbert Xu 					.count = SERPENT_ENC_TEST_VECTORS
2938da7f033dSHerbert Xu 				},
2939da7f033dSHerbert Xu 				.dec = {
2940da7f033dSHerbert Xu 					.vecs = serpent_dec_tv_template,
2941da7f033dSHerbert Xu 					.count = SERPENT_DEC_TEST_VECTORS
2942da7f033dSHerbert Xu 				}
2943da7f033dSHerbert Xu 			}
2944da7f033dSHerbert Xu 		}
2945da7f033dSHerbert Xu 	}, {
2946da7f033dSHerbert Xu 		.alg = "ecb(tea)",
29471aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2948da7f033dSHerbert Xu 		.suite = {
2949da7f033dSHerbert Xu 			.cipher = {
2950da7f033dSHerbert Xu 				.enc = {
2951da7f033dSHerbert Xu 					.vecs = tea_enc_tv_template,
2952da7f033dSHerbert Xu 					.count = TEA_ENC_TEST_VECTORS
2953da7f033dSHerbert Xu 				},
2954da7f033dSHerbert Xu 				.dec = {
2955da7f033dSHerbert Xu 					.vecs = tea_dec_tv_template,
2956da7f033dSHerbert Xu 					.count = TEA_DEC_TEST_VECTORS
2957da7f033dSHerbert Xu 				}
2958da7f033dSHerbert Xu 			}
2959da7f033dSHerbert Xu 		}
2960da7f033dSHerbert Xu 	}, {
2961da7f033dSHerbert Xu 		.alg = "ecb(tnepres)",
29621aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2963da7f033dSHerbert Xu 		.suite = {
2964da7f033dSHerbert Xu 			.cipher = {
2965da7f033dSHerbert Xu 				.enc = {
2966da7f033dSHerbert Xu 					.vecs = tnepres_enc_tv_template,
2967da7f033dSHerbert Xu 					.count = TNEPRES_ENC_TEST_VECTORS
2968da7f033dSHerbert Xu 				},
2969da7f033dSHerbert Xu 				.dec = {
2970da7f033dSHerbert Xu 					.vecs = tnepres_dec_tv_template,
2971da7f033dSHerbert Xu 					.count = TNEPRES_DEC_TEST_VECTORS
2972da7f033dSHerbert Xu 				}
2973da7f033dSHerbert Xu 			}
2974da7f033dSHerbert Xu 		}
2975da7f033dSHerbert Xu 	}, {
2976da7f033dSHerbert Xu 		.alg = "ecb(twofish)",
29771aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2978da7f033dSHerbert Xu 		.suite = {
2979da7f033dSHerbert Xu 			.cipher = {
2980da7f033dSHerbert Xu 				.enc = {
2981da7f033dSHerbert Xu 					.vecs = tf_enc_tv_template,
2982da7f033dSHerbert Xu 					.count = TF_ENC_TEST_VECTORS
2983da7f033dSHerbert Xu 				},
2984da7f033dSHerbert Xu 				.dec = {
2985da7f033dSHerbert Xu 					.vecs = tf_dec_tv_template,
2986da7f033dSHerbert Xu 					.count = TF_DEC_TEST_VECTORS
2987da7f033dSHerbert Xu 				}
2988da7f033dSHerbert Xu 			}
2989da7f033dSHerbert Xu 		}
2990da7f033dSHerbert Xu 	}, {
2991da7f033dSHerbert Xu 		.alg = "ecb(xeta)",
29921aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
2993da7f033dSHerbert Xu 		.suite = {
2994da7f033dSHerbert Xu 			.cipher = {
2995da7f033dSHerbert Xu 				.enc = {
2996da7f033dSHerbert Xu 					.vecs = xeta_enc_tv_template,
2997da7f033dSHerbert Xu 					.count = XETA_ENC_TEST_VECTORS
2998da7f033dSHerbert Xu 				},
2999da7f033dSHerbert Xu 				.dec = {
3000da7f033dSHerbert Xu 					.vecs = xeta_dec_tv_template,
3001da7f033dSHerbert Xu 					.count = XETA_DEC_TEST_VECTORS
3002da7f033dSHerbert Xu 				}
3003da7f033dSHerbert Xu 			}
3004da7f033dSHerbert Xu 		}
3005da7f033dSHerbert Xu 	}, {
3006da7f033dSHerbert Xu 		.alg = "ecb(xtea)",
30071aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3008da7f033dSHerbert Xu 		.suite = {
3009da7f033dSHerbert Xu 			.cipher = {
3010da7f033dSHerbert Xu 				.enc = {
3011da7f033dSHerbert Xu 					.vecs = xtea_enc_tv_template,
3012da7f033dSHerbert Xu 					.count = XTEA_ENC_TEST_VECTORS
3013da7f033dSHerbert Xu 				},
3014da7f033dSHerbert Xu 				.dec = {
3015da7f033dSHerbert Xu 					.vecs = xtea_dec_tv_template,
3016da7f033dSHerbert Xu 					.count = XTEA_DEC_TEST_VECTORS
3017da7f033dSHerbert Xu 				}
3018da7f033dSHerbert Xu 			}
3019da7f033dSHerbert Xu 		}
3020da7f033dSHerbert Xu 	}, {
3021da7f033dSHerbert Xu 		.alg = "gcm(aes)",
3022da7f033dSHerbert Xu 		.test = alg_test_aead,
3023a1915d51SJarod Wilson 		.fips_allowed = 1,
3024da7f033dSHerbert Xu 		.suite = {
3025da7f033dSHerbert Xu 			.aead = {
3026da7f033dSHerbert Xu 				.enc = {
3027da7f033dSHerbert Xu 					.vecs = aes_gcm_enc_tv_template,
3028da7f033dSHerbert Xu 					.count = AES_GCM_ENC_TEST_VECTORS
3029da7f033dSHerbert Xu 				},
3030da7f033dSHerbert Xu 				.dec = {
3031da7f033dSHerbert Xu 					.vecs = aes_gcm_dec_tv_template,
3032da7f033dSHerbert Xu 					.count = AES_GCM_DEC_TEST_VECTORS
3033da7f033dSHerbert Xu 				}
3034da7f033dSHerbert Xu 			}
3035da7f033dSHerbert Xu 		}
3036da7f033dSHerbert Xu 	}, {
3037507069c9SYouquan, Song 		.alg = "ghash",
3038507069c9SYouquan, Song 		.test = alg_test_hash,
303918c0ebd2SJarod Wilson 		.fips_allowed = 1,
3040507069c9SYouquan, Song 		.suite = {
3041507069c9SYouquan, Song 			.hash = {
3042507069c9SYouquan, Song 				.vecs = ghash_tv_template,
3043507069c9SYouquan, Song 				.count = GHASH_TEST_VECTORS
3044507069c9SYouquan, Song 			}
3045507069c9SYouquan, Song 		}
3046507069c9SYouquan, Song 	}, {
3047a482b081SSonic Zhang 		.alg = "hmac(crc32)",
3048a482b081SSonic Zhang 		.test = alg_test_hash,
3049a482b081SSonic Zhang 		.suite = {
3050a482b081SSonic Zhang 			.hash = {
3051a482b081SSonic Zhang 				.vecs = bfin_crc_tv_template,
3052a482b081SSonic Zhang 				.count = BFIN_CRC_TEST_VECTORS
3053a482b081SSonic Zhang 			}
3054a482b081SSonic Zhang 		}
3055a482b081SSonic Zhang 	}, {
3056da7f033dSHerbert Xu 		.alg = "hmac(md5)",
3057da7f033dSHerbert Xu 		.test = alg_test_hash,
3058da7f033dSHerbert Xu 		.suite = {
3059da7f033dSHerbert Xu 			.hash = {
3060da7f033dSHerbert Xu 				.vecs = hmac_md5_tv_template,
3061da7f033dSHerbert Xu 				.count = HMAC_MD5_TEST_VECTORS
3062da7f033dSHerbert Xu 			}
3063da7f033dSHerbert Xu 		}
3064da7f033dSHerbert Xu 	}, {
3065da7f033dSHerbert Xu 		.alg = "hmac(rmd128)",
3066da7f033dSHerbert Xu 		.test = alg_test_hash,
3067da7f033dSHerbert Xu 		.suite = {
3068da7f033dSHerbert Xu 			.hash = {
3069da7f033dSHerbert Xu 				.vecs = hmac_rmd128_tv_template,
3070da7f033dSHerbert Xu 				.count = HMAC_RMD128_TEST_VECTORS
3071da7f033dSHerbert Xu 			}
3072da7f033dSHerbert Xu 		}
3073da7f033dSHerbert Xu 	}, {
3074da7f033dSHerbert Xu 		.alg = "hmac(rmd160)",
3075da7f033dSHerbert Xu 		.test = alg_test_hash,
3076da7f033dSHerbert Xu 		.suite = {
3077da7f033dSHerbert Xu 			.hash = {
3078da7f033dSHerbert Xu 				.vecs = hmac_rmd160_tv_template,
3079da7f033dSHerbert Xu 				.count = HMAC_RMD160_TEST_VECTORS
3080da7f033dSHerbert Xu 			}
3081da7f033dSHerbert Xu 		}
3082da7f033dSHerbert Xu 	}, {
3083da7f033dSHerbert Xu 		.alg = "hmac(sha1)",
3084da7f033dSHerbert Xu 		.test = alg_test_hash,
3085a1915d51SJarod Wilson 		.fips_allowed = 1,
3086da7f033dSHerbert Xu 		.suite = {
3087da7f033dSHerbert Xu 			.hash = {
3088da7f033dSHerbert Xu 				.vecs = hmac_sha1_tv_template,
3089da7f033dSHerbert Xu 				.count = HMAC_SHA1_TEST_VECTORS
3090da7f033dSHerbert Xu 			}
3091da7f033dSHerbert Xu 		}
3092da7f033dSHerbert Xu 	}, {
3093da7f033dSHerbert Xu 		.alg = "hmac(sha224)",
3094da7f033dSHerbert Xu 		.test = alg_test_hash,
3095a1915d51SJarod Wilson 		.fips_allowed = 1,
3096da7f033dSHerbert Xu 		.suite = {
3097da7f033dSHerbert Xu 			.hash = {
3098da7f033dSHerbert Xu 				.vecs = hmac_sha224_tv_template,
3099da7f033dSHerbert Xu 				.count = HMAC_SHA224_TEST_VECTORS
3100da7f033dSHerbert Xu 			}
3101da7f033dSHerbert Xu 		}
3102da7f033dSHerbert Xu 	}, {
3103da7f033dSHerbert Xu 		.alg = "hmac(sha256)",
3104da7f033dSHerbert Xu 		.test = alg_test_hash,
3105a1915d51SJarod Wilson 		.fips_allowed = 1,
3106da7f033dSHerbert Xu 		.suite = {
3107da7f033dSHerbert Xu 			.hash = {
3108da7f033dSHerbert Xu 				.vecs = hmac_sha256_tv_template,
3109da7f033dSHerbert Xu 				.count = HMAC_SHA256_TEST_VECTORS
3110da7f033dSHerbert Xu 			}
3111da7f033dSHerbert Xu 		}
3112da7f033dSHerbert Xu 	}, {
3113da7f033dSHerbert Xu 		.alg = "hmac(sha384)",
3114da7f033dSHerbert Xu 		.test = alg_test_hash,
3115a1915d51SJarod Wilson 		.fips_allowed = 1,
3116da7f033dSHerbert Xu 		.suite = {
3117da7f033dSHerbert Xu 			.hash = {
3118da7f033dSHerbert Xu 				.vecs = hmac_sha384_tv_template,
3119da7f033dSHerbert Xu 				.count = HMAC_SHA384_TEST_VECTORS
3120da7f033dSHerbert Xu 			}
3121da7f033dSHerbert Xu 		}
3122da7f033dSHerbert Xu 	}, {
3123da7f033dSHerbert Xu 		.alg = "hmac(sha512)",
3124da7f033dSHerbert Xu 		.test = alg_test_hash,
3125a1915d51SJarod Wilson 		.fips_allowed = 1,
3126da7f033dSHerbert Xu 		.suite = {
3127da7f033dSHerbert Xu 			.hash = {
3128da7f033dSHerbert Xu 				.vecs = hmac_sha512_tv_template,
3129da7f033dSHerbert Xu 				.count = HMAC_SHA512_TEST_VECTORS
3130da7f033dSHerbert Xu 			}
3131da7f033dSHerbert Xu 		}
3132da7f033dSHerbert Xu 	}, {
3133bb5530e4SStephan Mueller 		.alg = "jitterentropy_rng",
3134bb5530e4SStephan Mueller 		.fips_allowed = 1,
3135bb5530e4SStephan Mueller 		.test = alg_test_null,
3136bb5530e4SStephan Mueller 	}, {
3137da7f033dSHerbert Xu 		.alg = "lrw(aes)",
31381aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3139da7f033dSHerbert Xu 		.suite = {
3140da7f033dSHerbert Xu 			.cipher = {
3141da7f033dSHerbert Xu 				.enc = {
3142da7f033dSHerbert Xu 					.vecs = aes_lrw_enc_tv_template,
3143da7f033dSHerbert Xu 					.count = AES_LRW_ENC_TEST_VECTORS
3144da7f033dSHerbert Xu 				},
3145da7f033dSHerbert Xu 				.dec = {
3146da7f033dSHerbert Xu 					.vecs = aes_lrw_dec_tv_template,
3147da7f033dSHerbert Xu 					.count = AES_LRW_DEC_TEST_VECTORS
3148da7f033dSHerbert Xu 				}
3149da7f033dSHerbert Xu 			}
3150da7f033dSHerbert Xu 		}
3151da7f033dSHerbert Xu 	}, {
31520840605eSJussi Kivilinna 		.alg = "lrw(camellia)",
31530840605eSJussi Kivilinna 		.test = alg_test_skcipher,
31540840605eSJussi Kivilinna 		.suite = {
31550840605eSJussi Kivilinna 			.cipher = {
31560840605eSJussi Kivilinna 				.enc = {
31570840605eSJussi Kivilinna 					.vecs = camellia_lrw_enc_tv_template,
31580840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_ENC_TEST_VECTORS
31590840605eSJussi Kivilinna 				},
31600840605eSJussi Kivilinna 				.dec = {
31610840605eSJussi Kivilinna 					.vecs = camellia_lrw_dec_tv_template,
31620840605eSJussi Kivilinna 					.count = CAMELLIA_LRW_DEC_TEST_VECTORS
31630840605eSJussi Kivilinna 				}
31640840605eSJussi Kivilinna 			}
31650840605eSJussi Kivilinna 		}
31660840605eSJussi Kivilinna 	}, {
31679b8b0405SJohannes Goetzfried 		.alg = "lrw(cast6)",
31689b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
31699b8b0405SJohannes Goetzfried 		.suite = {
31709b8b0405SJohannes Goetzfried 			.cipher = {
31719b8b0405SJohannes Goetzfried 				.enc = {
31729b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_enc_tv_template,
31739b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_ENC_TEST_VECTORS
31749b8b0405SJohannes Goetzfried 				},
31759b8b0405SJohannes Goetzfried 				.dec = {
31769b8b0405SJohannes Goetzfried 					.vecs = cast6_lrw_dec_tv_template,
31779b8b0405SJohannes Goetzfried 					.count = CAST6_LRW_DEC_TEST_VECTORS
31789b8b0405SJohannes Goetzfried 				}
31799b8b0405SJohannes Goetzfried 			}
31809b8b0405SJohannes Goetzfried 		}
31819b8b0405SJohannes Goetzfried 	}, {
3182d7bfc0faSJussi Kivilinna 		.alg = "lrw(serpent)",
3183d7bfc0faSJussi Kivilinna 		.test = alg_test_skcipher,
3184d7bfc0faSJussi Kivilinna 		.suite = {
3185d7bfc0faSJussi Kivilinna 			.cipher = {
3186d7bfc0faSJussi Kivilinna 				.enc = {
3187d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_enc_tv_template,
3188d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_ENC_TEST_VECTORS
3189d7bfc0faSJussi Kivilinna 				},
3190d7bfc0faSJussi Kivilinna 				.dec = {
3191d7bfc0faSJussi Kivilinna 					.vecs = serpent_lrw_dec_tv_template,
3192d7bfc0faSJussi Kivilinna 					.count = SERPENT_LRW_DEC_TEST_VECTORS
3193d7bfc0faSJussi Kivilinna 				}
3194d7bfc0faSJussi Kivilinna 			}
3195d7bfc0faSJussi Kivilinna 		}
3196d7bfc0faSJussi Kivilinna 	}, {
31970b2a1551SJussi Kivilinna 		.alg = "lrw(twofish)",
31980b2a1551SJussi Kivilinna 		.test = alg_test_skcipher,
31990b2a1551SJussi Kivilinna 		.suite = {
32000b2a1551SJussi Kivilinna 			.cipher = {
32010b2a1551SJussi Kivilinna 				.enc = {
32020b2a1551SJussi Kivilinna 					.vecs = tf_lrw_enc_tv_template,
32030b2a1551SJussi Kivilinna 					.count = TF_LRW_ENC_TEST_VECTORS
32040b2a1551SJussi Kivilinna 				},
32050b2a1551SJussi Kivilinna 				.dec = {
32060b2a1551SJussi Kivilinna 					.vecs = tf_lrw_dec_tv_template,
32070b2a1551SJussi Kivilinna 					.count = TF_LRW_DEC_TEST_VECTORS
32080b2a1551SJussi Kivilinna 				}
32090b2a1551SJussi Kivilinna 			}
32100b2a1551SJussi Kivilinna 		}
32110b2a1551SJussi Kivilinna 	}, {
32121443cc9bSKOVACS Krisztian 		.alg = "lz4",
32131443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
32141443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
32151443cc9bSKOVACS Krisztian 		.suite = {
32161443cc9bSKOVACS Krisztian 			.comp = {
32171443cc9bSKOVACS Krisztian 				.comp = {
32181443cc9bSKOVACS Krisztian 					.vecs = lz4_comp_tv_template,
32191443cc9bSKOVACS Krisztian 					.count = LZ4_COMP_TEST_VECTORS
32201443cc9bSKOVACS Krisztian 				},
32211443cc9bSKOVACS Krisztian 				.decomp = {
32221443cc9bSKOVACS Krisztian 					.vecs = lz4_decomp_tv_template,
32231443cc9bSKOVACS Krisztian 					.count = LZ4_DECOMP_TEST_VECTORS
32241443cc9bSKOVACS Krisztian 				}
32251443cc9bSKOVACS Krisztian 			}
32261443cc9bSKOVACS Krisztian 		}
32271443cc9bSKOVACS Krisztian 	}, {
32281443cc9bSKOVACS Krisztian 		.alg = "lz4hc",
32291443cc9bSKOVACS Krisztian 		.test = alg_test_comp,
32301443cc9bSKOVACS Krisztian 		.fips_allowed = 1,
32311443cc9bSKOVACS Krisztian 		.suite = {
32321443cc9bSKOVACS Krisztian 			.comp = {
32331443cc9bSKOVACS Krisztian 				.comp = {
32341443cc9bSKOVACS Krisztian 					.vecs = lz4hc_comp_tv_template,
32351443cc9bSKOVACS Krisztian 					.count = LZ4HC_COMP_TEST_VECTORS
32361443cc9bSKOVACS Krisztian 				},
32371443cc9bSKOVACS Krisztian 				.decomp = {
32381443cc9bSKOVACS Krisztian 					.vecs = lz4hc_decomp_tv_template,
32391443cc9bSKOVACS Krisztian 					.count = LZ4HC_DECOMP_TEST_VECTORS
32401443cc9bSKOVACS Krisztian 				}
32411443cc9bSKOVACS Krisztian 			}
32421443cc9bSKOVACS Krisztian 		}
32431443cc9bSKOVACS Krisztian 	}, {
3244da7f033dSHerbert Xu 		.alg = "lzo",
3245da7f033dSHerbert Xu 		.test = alg_test_comp,
32460818904dSMilan Broz 		.fips_allowed = 1,
3247da7f033dSHerbert Xu 		.suite = {
3248da7f033dSHerbert Xu 			.comp = {
3249da7f033dSHerbert Xu 				.comp = {
3250da7f033dSHerbert Xu 					.vecs = lzo_comp_tv_template,
3251da7f033dSHerbert Xu 					.count = LZO_COMP_TEST_VECTORS
3252da7f033dSHerbert Xu 				},
3253da7f033dSHerbert Xu 				.decomp = {
3254da7f033dSHerbert Xu 					.vecs = lzo_decomp_tv_template,
3255da7f033dSHerbert Xu 					.count = LZO_DECOMP_TEST_VECTORS
3256da7f033dSHerbert Xu 				}
3257da7f033dSHerbert Xu 			}
3258da7f033dSHerbert Xu 		}
3259da7f033dSHerbert Xu 	}, {
3260da7f033dSHerbert Xu 		.alg = "md4",
3261da7f033dSHerbert Xu 		.test = alg_test_hash,
3262da7f033dSHerbert Xu 		.suite = {
3263da7f033dSHerbert Xu 			.hash = {
3264da7f033dSHerbert Xu 				.vecs = md4_tv_template,
3265da7f033dSHerbert Xu 				.count = MD4_TEST_VECTORS
3266da7f033dSHerbert Xu 			}
3267da7f033dSHerbert Xu 		}
3268da7f033dSHerbert Xu 	}, {
3269da7f033dSHerbert Xu 		.alg = "md5",
3270da7f033dSHerbert Xu 		.test = alg_test_hash,
3271da7f033dSHerbert Xu 		.suite = {
3272da7f033dSHerbert Xu 			.hash = {
3273da7f033dSHerbert Xu 				.vecs = md5_tv_template,
3274da7f033dSHerbert Xu 				.count = MD5_TEST_VECTORS
3275da7f033dSHerbert Xu 			}
3276da7f033dSHerbert Xu 		}
3277da7f033dSHerbert Xu 	}, {
3278da7f033dSHerbert Xu 		.alg = "michael_mic",
3279da7f033dSHerbert Xu 		.test = alg_test_hash,
3280da7f033dSHerbert Xu 		.suite = {
3281da7f033dSHerbert Xu 			.hash = {
3282da7f033dSHerbert Xu 				.vecs = michael_mic_tv_template,
3283da7f033dSHerbert Xu 				.count = MICHAEL_MIC_TEST_VECTORS
3284da7f033dSHerbert Xu 			}
3285da7f033dSHerbert Xu 		}
3286da7f033dSHerbert Xu 	}, {
3287ba0e14acSPuneet Saxena 		.alg = "ofb(aes)",
3288ba0e14acSPuneet Saxena 		.test = alg_test_skcipher,
3289ba0e14acSPuneet Saxena 		.fips_allowed = 1,
3290ba0e14acSPuneet Saxena 		.suite = {
3291ba0e14acSPuneet Saxena 			.cipher = {
3292ba0e14acSPuneet Saxena 				.enc = {
3293ba0e14acSPuneet Saxena 					.vecs = aes_ofb_enc_tv_template,
3294ba0e14acSPuneet Saxena 					.count = AES_OFB_ENC_TEST_VECTORS
3295ba0e14acSPuneet Saxena 				},
3296ba0e14acSPuneet Saxena 				.dec = {
3297ba0e14acSPuneet Saxena 					.vecs = aes_ofb_dec_tv_template,
3298ba0e14acSPuneet Saxena 					.count = AES_OFB_DEC_TEST_VECTORS
3299ba0e14acSPuneet Saxena 				}
3300ba0e14acSPuneet Saxena 			}
3301ba0e14acSPuneet Saxena 		}
3302ba0e14acSPuneet Saxena 	}, {
3303da7f033dSHerbert Xu 		.alg = "pcbc(fcrypt)",
33041aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3305da7f033dSHerbert Xu 		.suite = {
3306da7f033dSHerbert Xu 			.cipher = {
3307da7f033dSHerbert Xu 				.enc = {
3308da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_enc_tv_template,
3309da7f033dSHerbert Xu 					.count = FCRYPT_ENC_TEST_VECTORS
3310da7f033dSHerbert Xu 				},
3311da7f033dSHerbert Xu 				.dec = {
3312da7f033dSHerbert Xu 					.vecs = fcrypt_pcbc_dec_tv_template,
3313da7f033dSHerbert Xu 					.count = FCRYPT_DEC_TEST_VECTORS
3314da7f033dSHerbert Xu 				}
3315da7f033dSHerbert Xu 			}
3316da7f033dSHerbert Xu 		}
3317da7f033dSHerbert Xu 	}, {
3318eee9dc61SMartin Willi 		.alg = "poly1305",
3319eee9dc61SMartin Willi 		.test = alg_test_hash,
3320eee9dc61SMartin Willi 		.suite = {
3321eee9dc61SMartin Willi 			.hash = {
3322eee9dc61SMartin Willi 				.vecs = poly1305_tv_template,
3323eee9dc61SMartin Willi 				.count = POLY1305_TEST_VECTORS
3324eee9dc61SMartin Willi 			}
3325eee9dc61SMartin Willi 		}
3326eee9dc61SMartin Willi 	}, {
3327da7f033dSHerbert Xu 		.alg = "rfc3686(ctr(aes))",
33281aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3329a1915d51SJarod Wilson 		.fips_allowed = 1,
3330da7f033dSHerbert Xu 		.suite = {
3331da7f033dSHerbert Xu 			.cipher = {
3332da7f033dSHerbert Xu 				.enc = {
3333f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_enc_tv_template,
3334f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_ENC_TEST_VECTORS
3335da7f033dSHerbert Xu 				},
3336da7f033dSHerbert Xu 				.dec = {
3337f7cb80f2SJarod Wilson 					.vecs = aes_ctr_rfc3686_dec_tv_template,
3338f7cb80f2SJarod Wilson 					.count = AES_CTR_3686_DEC_TEST_VECTORS
3339da7f033dSHerbert Xu 				}
3340da7f033dSHerbert Xu 			}
3341da7f033dSHerbert Xu 		}
3342da7f033dSHerbert Xu 	}, {
334369435b94SAdrian Hoban 		.alg = "rfc4106(gcm(aes))",
334469435b94SAdrian Hoban 		.test = alg_test_aead,
3345db71f29aSJarod Wilson 		.fips_allowed = 1,
334669435b94SAdrian Hoban 		.suite = {
334769435b94SAdrian Hoban 			.aead = {
334869435b94SAdrian Hoban 				.enc = {
334969435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_enc_tv_template,
335069435b94SAdrian Hoban 					.count = AES_GCM_4106_ENC_TEST_VECTORS
335169435b94SAdrian Hoban 				},
335269435b94SAdrian Hoban 				.dec = {
335369435b94SAdrian Hoban 					.vecs = aes_gcm_rfc4106_dec_tv_template,
335469435b94SAdrian Hoban 					.count = AES_GCM_4106_DEC_TEST_VECTORS
335569435b94SAdrian Hoban 				}
335669435b94SAdrian Hoban 			}
335769435b94SAdrian Hoban 		}
335869435b94SAdrian Hoban 	}, {
33595d667322SJarod Wilson 		.alg = "rfc4309(ccm(aes))",
33605d667322SJarod Wilson 		.test = alg_test_aead,
3361a1915d51SJarod Wilson 		.fips_allowed = 1,
33625d667322SJarod Wilson 		.suite = {
33635d667322SJarod Wilson 			.aead = {
33645d667322SJarod Wilson 				.enc = {
33655d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_enc_tv_template,
33665d667322SJarod Wilson 					.count = AES_CCM_4309_ENC_TEST_VECTORS
33675d667322SJarod Wilson 				},
33685d667322SJarod Wilson 				.dec = {
33695d667322SJarod Wilson 					.vecs = aes_ccm_rfc4309_dec_tv_template,
33705d667322SJarod Wilson 					.count = AES_CCM_4309_DEC_TEST_VECTORS
33715d667322SJarod Wilson 				}
33725d667322SJarod Wilson 			}
33735d667322SJarod Wilson 		}
33745d667322SJarod Wilson 	}, {
3375e9b7441aSJussi Kivilinna 		.alg = "rfc4543(gcm(aes))",
3376e9b7441aSJussi Kivilinna 		.test = alg_test_aead,
3377e9b7441aSJussi Kivilinna 		.suite = {
3378e9b7441aSJussi Kivilinna 			.aead = {
3379e9b7441aSJussi Kivilinna 				.enc = {
3380e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_enc_tv_template,
3381e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_ENC_TEST_VECTORS
3382e9b7441aSJussi Kivilinna 				},
3383e9b7441aSJussi Kivilinna 				.dec = {
3384e9b7441aSJussi Kivilinna 					.vecs = aes_gcm_rfc4543_dec_tv_template,
3385e9b7441aSJussi Kivilinna 					.count = AES_GCM_4543_DEC_TEST_VECTORS
3386e9b7441aSJussi Kivilinna 				},
3387e9b7441aSJussi Kivilinna 			}
3388e9b7441aSJussi Kivilinna 		}
3389e9b7441aSJussi Kivilinna 	}, {
3390af2b76b5SMartin Willi 		.alg = "rfc7539(chacha20,poly1305)",
3391af2b76b5SMartin Willi 		.test = alg_test_aead,
3392af2b76b5SMartin Willi 		.suite = {
3393af2b76b5SMartin Willi 			.aead = {
3394af2b76b5SMartin Willi 				.enc = {
3395af2b76b5SMartin Willi 					.vecs = rfc7539_enc_tv_template,
3396af2b76b5SMartin Willi 					.count = RFC7539_ENC_TEST_VECTORS
3397af2b76b5SMartin Willi 				},
3398af2b76b5SMartin Willi 				.dec = {
3399af2b76b5SMartin Willi 					.vecs = rfc7539_dec_tv_template,
3400af2b76b5SMartin Willi 					.count = RFC7539_DEC_TEST_VECTORS
3401af2b76b5SMartin Willi 				},
3402af2b76b5SMartin Willi 			}
3403af2b76b5SMartin Willi 		}
3404af2b76b5SMartin Willi 	}, {
3405da7f033dSHerbert Xu 		.alg = "rmd128",
3406da7f033dSHerbert Xu 		.test = alg_test_hash,
3407da7f033dSHerbert Xu 		.suite = {
3408da7f033dSHerbert Xu 			.hash = {
3409da7f033dSHerbert Xu 				.vecs = rmd128_tv_template,
3410da7f033dSHerbert Xu 				.count = RMD128_TEST_VECTORS
3411da7f033dSHerbert Xu 			}
3412da7f033dSHerbert Xu 		}
3413da7f033dSHerbert Xu 	}, {
3414da7f033dSHerbert Xu 		.alg = "rmd160",
3415da7f033dSHerbert Xu 		.test = alg_test_hash,
3416da7f033dSHerbert Xu 		.suite = {
3417da7f033dSHerbert Xu 			.hash = {
3418da7f033dSHerbert Xu 				.vecs = rmd160_tv_template,
3419da7f033dSHerbert Xu 				.count = RMD160_TEST_VECTORS
3420da7f033dSHerbert Xu 			}
3421da7f033dSHerbert Xu 		}
3422da7f033dSHerbert Xu 	}, {
3423da7f033dSHerbert Xu 		.alg = "rmd256",
3424da7f033dSHerbert Xu 		.test = alg_test_hash,
3425da7f033dSHerbert Xu 		.suite = {
3426da7f033dSHerbert Xu 			.hash = {
3427da7f033dSHerbert Xu 				.vecs = rmd256_tv_template,
3428da7f033dSHerbert Xu 				.count = RMD256_TEST_VECTORS
3429da7f033dSHerbert Xu 			}
3430da7f033dSHerbert Xu 		}
3431da7f033dSHerbert Xu 	}, {
3432da7f033dSHerbert Xu 		.alg = "rmd320",
3433da7f033dSHerbert Xu 		.test = alg_test_hash,
3434da7f033dSHerbert Xu 		.suite = {
3435da7f033dSHerbert Xu 			.hash = {
3436da7f033dSHerbert Xu 				.vecs = rmd320_tv_template,
3437da7f033dSHerbert Xu 				.count = RMD320_TEST_VECTORS
3438da7f033dSHerbert Xu 			}
3439da7f033dSHerbert Xu 		}
3440da7f033dSHerbert Xu 	}, {
3441da7f033dSHerbert Xu 		.alg = "salsa20",
34421aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
3443da7f033dSHerbert Xu 		.suite = {
3444da7f033dSHerbert Xu 			.cipher = {
3445da7f033dSHerbert Xu 				.enc = {
3446da7f033dSHerbert Xu 					.vecs = salsa20_stream_enc_tv_template,
3447da7f033dSHerbert Xu 					.count = SALSA20_STREAM_ENC_TEST_VECTORS
3448da7f033dSHerbert Xu 				}
3449da7f033dSHerbert Xu 			}
3450da7f033dSHerbert Xu 		}
3451da7f033dSHerbert Xu 	}, {
3452da7f033dSHerbert Xu 		.alg = "sha1",
3453da7f033dSHerbert Xu 		.test = alg_test_hash,
3454a1915d51SJarod Wilson 		.fips_allowed = 1,
3455da7f033dSHerbert Xu 		.suite = {
3456da7f033dSHerbert Xu 			.hash = {
3457da7f033dSHerbert Xu 				.vecs = sha1_tv_template,
3458da7f033dSHerbert Xu 				.count = SHA1_TEST_VECTORS
3459da7f033dSHerbert Xu 			}
3460da7f033dSHerbert Xu 		}
3461da7f033dSHerbert Xu 	}, {
3462da7f033dSHerbert Xu 		.alg = "sha224",
3463da7f033dSHerbert Xu 		.test = alg_test_hash,
3464a1915d51SJarod Wilson 		.fips_allowed = 1,
3465da7f033dSHerbert Xu 		.suite = {
3466da7f033dSHerbert Xu 			.hash = {
3467da7f033dSHerbert Xu 				.vecs = sha224_tv_template,
3468da7f033dSHerbert Xu 				.count = SHA224_TEST_VECTORS
3469da7f033dSHerbert Xu 			}
3470da7f033dSHerbert Xu 		}
3471da7f033dSHerbert Xu 	}, {
3472da7f033dSHerbert Xu 		.alg = "sha256",
3473da7f033dSHerbert Xu 		.test = alg_test_hash,
3474a1915d51SJarod Wilson 		.fips_allowed = 1,
3475da7f033dSHerbert Xu 		.suite = {
3476da7f033dSHerbert Xu 			.hash = {
3477da7f033dSHerbert Xu 				.vecs = sha256_tv_template,
3478da7f033dSHerbert Xu 				.count = SHA256_TEST_VECTORS
3479da7f033dSHerbert Xu 			}
3480da7f033dSHerbert Xu 		}
3481da7f033dSHerbert Xu 	}, {
3482da7f033dSHerbert Xu 		.alg = "sha384",
3483da7f033dSHerbert Xu 		.test = alg_test_hash,
3484a1915d51SJarod Wilson 		.fips_allowed = 1,
3485da7f033dSHerbert Xu 		.suite = {
3486da7f033dSHerbert Xu 			.hash = {
3487da7f033dSHerbert Xu 				.vecs = sha384_tv_template,
3488da7f033dSHerbert Xu 				.count = SHA384_TEST_VECTORS
3489da7f033dSHerbert Xu 			}
3490da7f033dSHerbert Xu 		}
3491da7f033dSHerbert Xu 	}, {
3492da7f033dSHerbert Xu 		.alg = "sha512",
3493da7f033dSHerbert Xu 		.test = alg_test_hash,
3494a1915d51SJarod Wilson 		.fips_allowed = 1,
3495da7f033dSHerbert Xu 		.suite = {
3496da7f033dSHerbert Xu 			.hash = {
3497da7f033dSHerbert Xu 				.vecs = sha512_tv_template,
3498da7f033dSHerbert Xu 				.count = SHA512_TEST_VECTORS
3499da7f033dSHerbert Xu 			}
3500da7f033dSHerbert Xu 		}
3501da7f033dSHerbert Xu 	}, {
3502da7f033dSHerbert Xu 		.alg = "tgr128",
3503da7f033dSHerbert Xu 		.test = alg_test_hash,
3504da7f033dSHerbert Xu 		.suite = {
3505da7f033dSHerbert Xu 			.hash = {
3506da7f033dSHerbert Xu 				.vecs = tgr128_tv_template,
3507da7f033dSHerbert Xu 				.count = TGR128_TEST_VECTORS
3508da7f033dSHerbert Xu 			}
3509da7f033dSHerbert Xu 		}
3510da7f033dSHerbert Xu 	}, {
3511da7f033dSHerbert Xu 		.alg = "tgr160",
3512da7f033dSHerbert Xu 		.test = alg_test_hash,
3513da7f033dSHerbert Xu 		.suite = {
3514da7f033dSHerbert Xu 			.hash = {
3515da7f033dSHerbert Xu 				.vecs = tgr160_tv_template,
3516da7f033dSHerbert Xu 				.count = TGR160_TEST_VECTORS
3517da7f033dSHerbert Xu 			}
3518da7f033dSHerbert Xu 		}
3519da7f033dSHerbert Xu 	}, {
3520da7f033dSHerbert Xu 		.alg = "tgr192",
3521da7f033dSHerbert Xu 		.test = alg_test_hash,
3522da7f033dSHerbert Xu 		.suite = {
3523da7f033dSHerbert Xu 			.hash = {
3524da7f033dSHerbert Xu 				.vecs = tgr192_tv_template,
3525da7f033dSHerbert Xu 				.count = TGR192_TEST_VECTORS
3526da7f033dSHerbert Xu 			}
3527da7f033dSHerbert Xu 		}
3528da7f033dSHerbert Xu 	}, {
3529f1939f7cSShane Wang 		.alg = "vmac(aes)",
3530f1939f7cSShane Wang 		.test = alg_test_hash,
3531f1939f7cSShane Wang 		.suite = {
3532f1939f7cSShane Wang 			.hash = {
3533f1939f7cSShane Wang 				.vecs = aes_vmac128_tv_template,
3534f1939f7cSShane Wang 				.count = VMAC_AES_TEST_VECTORS
3535f1939f7cSShane Wang 			}
3536f1939f7cSShane Wang 		}
3537f1939f7cSShane Wang 	}, {
3538da7f033dSHerbert Xu 		.alg = "wp256",
3539da7f033dSHerbert Xu 		.test = alg_test_hash,
3540da7f033dSHerbert Xu 		.suite = {
3541da7f033dSHerbert Xu 			.hash = {
3542da7f033dSHerbert Xu 				.vecs = wp256_tv_template,
3543da7f033dSHerbert Xu 				.count = WP256_TEST_VECTORS
3544da7f033dSHerbert Xu 			}
3545da7f033dSHerbert Xu 		}
3546da7f033dSHerbert Xu 	}, {
3547da7f033dSHerbert Xu 		.alg = "wp384",
3548da7f033dSHerbert Xu 		.test = alg_test_hash,
3549da7f033dSHerbert Xu 		.suite = {
3550da7f033dSHerbert Xu 			.hash = {
3551da7f033dSHerbert Xu 				.vecs = wp384_tv_template,
3552da7f033dSHerbert Xu 				.count = WP384_TEST_VECTORS
3553da7f033dSHerbert Xu 			}
3554da7f033dSHerbert Xu 		}
3555da7f033dSHerbert Xu 	}, {
3556da7f033dSHerbert Xu 		.alg = "wp512",
3557da7f033dSHerbert Xu 		.test = alg_test_hash,
3558da7f033dSHerbert Xu 		.suite = {
3559da7f033dSHerbert Xu 			.hash = {
3560da7f033dSHerbert Xu 				.vecs = wp512_tv_template,
3561da7f033dSHerbert Xu 				.count = WP512_TEST_VECTORS
3562da7f033dSHerbert Xu 			}
3563da7f033dSHerbert Xu 		}
3564da7f033dSHerbert Xu 	}, {
3565da7f033dSHerbert Xu 		.alg = "xcbc(aes)",
3566da7f033dSHerbert Xu 		.test = alg_test_hash,
3567da7f033dSHerbert Xu 		.suite = {
3568da7f033dSHerbert Xu 			.hash = {
3569da7f033dSHerbert Xu 				.vecs = aes_xcbc128_tv_template,
3570da7f033dSHerbert Xu 				.count = XCBC_AES_TEST_VECTORS
3571da7f033dSHerbert Xu 			}
3572da7f033dSHerbert Xu 		}
3573da7f033dSHerbert Xu 	}, {
3574da7f033dSHerbert Xu 		.alg = "xts(aes)",
35751aa4ecd9SHerbert Xu 		.test = alg_test_skcipher,
35762918aa8dSJarod Wilson 		.fips_allowed = 1,
3577da7f033dSHerbert Xu 		.suite = {
3578da7f033dSHerbert Xu 			.cipher = {
3579da7f033dSHerbert Xu 				.enc = {
3580da7f033dSHerbert Xu 					.vecs = aes_xts_enc_tv_template,
3581da7f033dSHerbert Xu 					.count = AES_XTS_ENC_TEST_VECTORS
3582da7f033dSHerbert Xu 				},
3583da7f033dSHerbert Xu 				.dec = {
3584da7f033dSHerbert Xu 					.vecs = aes_xts_dec_tv_template,
3585da7f033dSHerbert Xu 					.count = AES_XTS_DEC_TEST_VECTORS
3586da7f033dSHerbert Xu 				}
3587da7f033dSHerbert Xu 			}
3588da7f033dSHerbert Xu 		}
35890c01aed5SGeert Uytterhoeven 	}, {
35900840605eSJussi Kivilinna 		.alg = "xts(camellia)",
35910840605eSJussi Kivilinna 		.test = alg_test_skcipher,
35920840605eSJussi Kivilinna 		.suite = {
35930840605eSJussi Kivilinna 			.cipher = {
35940840605eSJussi Kivilinna 				.enc = {
35950840605eSJussi Kivilinna 					.vecs = camellia_xts_enc_tv_template,
35960840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_ENC_TEST_VECTORS
35970840605eSJussi Kivilinna 				},
35980840605eSJussi Kivilinna 				.dec = {
35990840605eSJussi Kivilinna 					.vecs = camellia_xts_dec_tv_template,
36000840605eSJussi Kivilinna 					.count = CAMELLIA_XTS_DEC_TEST_VECTORS
36010840605eSJussi Kivilinna 				}
36020840605eSJussi Kivilinna 			}
36030840605eSJussi Kivilinna 		}
36040840605eSJussi Kivilinna 	}, {
36059b8b0405SJohannes Goetzfried 		.alg = "xts(cast6)",
36069b8b0405SJohannes Goetzfried 		.test = alg_test_skcipher,
36079b8b0405SJohannes Goetzfried 		.suite = {
36089b8b0405SJohannes Goetzfried 			.cipher = {
36099b8b0405SJohannes Goetzfried 				.enc = {
36109b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_enc_tv_template,
36119b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_ENC_TEST_VECTORS
36129b8b0405SJohannes Goetzfried 				},
36139b8b0405SJohannes Goetzfried 				.dec = {
36149b8b0405SJohannes Goetzfried 					.vecs = cast6_xts_dec_tv_template,
36159b8b0405SJohannes Goetzfried 					.count = CAST6_XTS_DEC_TEST_VECTORS
36169b8b0405SJohannes Goetzfried 				}
36179b8b0405SJohannes Goetzfried 			}
36189b8b0405SJohannes Goetzfried 		}
36199b8b0405SJohannes Goetzfried 	}, {
362018be20b9SJussi Kivilinna 		.alg = "xts(serpent)",
362118be20b9SJussi Kivilinna 		.test = alg_test_skcipher,
362218be20b9SJussi Kivilinna 		.suite = {
362318be20b9SJussi Kivilinna 			.cipher = {
362418be20b9SJussi Kivilinna 				.enc = {
362518be20b9SJussi Kivilinna 					.vecs = serpent_xts_enc_tv_template,
362618be20b9SJussi Kivilinna 					.count = SERPENT_XTS_ENC_TEST_VECTORS
362718be20b9SJussi Kivilinna 				},
362818be20b9SJussi Kivilinna 				.dec = {
362918be20b9SJussi Kivilinna 					.vecs = serpent_xts_dec_tv_template,
363018be20b9SJussi Kivilinna 					.count = SERPENT_XTS_DEC_TEST_VECTORS
363118be20b9SJussi Kivilinna 				}
363218be20b9SJussi Kivilinna 			}
363318be20b9SJussi Kivilinna 		}
363418be20b9SJussi Kivilinna 	}, {
3635aed265b9SJussi Kivilinna 		.alg = "xts(twofish)",
3636aed265b9SJussi Kivilinna 		.test = alg_test_skcipher,
3637aed265b9SJussi Kivilinna 		.suite = {
3638aed265b9SJussi Kivilinna 			.cipher = {
3639aed265b9SJussi Kivilinna 				.enc = {
3640aed265b9SJussi Kivilinna 					.vecs = tf_xts_enc_tv_template,
3641aed265b9SJussi Kivilinna 					.count = TF_XTS_ENC_TEST_VECTORS
3642aed265b9SJussi Kivilinna 				},
3643aed265b9SJussi Kivilinna 				.dec = {
3644aed265b9SJussi Kivilinna 					.vecs = tf_xts_dec_tv_template,
3645aed265b9SJussi Kivilinna 					.count = TF_XTS_DEC_TEST_VECTORS
3646aed265b9SJussi Kivilinna 				}
3647aed265b9SJussi Kivilinna 			}
3648aed265b9SJussi Kivilinna 		}
3649aed265b9SJussi Kivilinna 	}, {
36500c01aed5SGeert Uytterhoeven 		.alg = "zlib",
36510c01aed5SGeert Uytterhoeven 		.test = alg_test_pcomp,
36520818904dSMilan Broz 		.fips_allowed = 1,
36530c01aed5SGeert Uytterhoeven 		.suite = {
36540c01aed5SGeert Uytterhoeven 			.pcomp = {
36550c01aed5SGeert Uytterhoeven 				.comp = {
36560c01aed5SGeert Uytterhoeven 					.vecs = zlib_comp_tv_template,
36570c01aed5SGeert Uytterhoeven 					.count = ZLIB_COMP_TEST_VECTORS
36580c01aed5SGeert Uytterhoeven 				},
36590c01aed5SGeert Uytterhoeven 				.decomp = {
36600c01aed5SGeert Uytterhoeven 					.vecs = zlib_decomp_tv_template,
36610c01aed5SGeert Uytterhoeven 					.count = ZLIB_DECOMP_TEST_VECTORS
36620c01aed5SGeert Uytterhoeven 				}
36630c01aed5SGeert Uytterhoeven 			}
36640c01aed5SGeert Uytterhoeven 		}
3665da7f033dSHerbert Xu 	}
3666da7f033dSHerbert Xu };
3667da7f033dSHerbert Xu 
36685714758bSJussi Kivilinna static bool alg_test_descs_checked;
36695714758bSJussi Kivilinna 
36705714758bSJussi Kivilinna static void alg_test_descs_check_order(void)
36715714758bSJussi Kivilinna {
36725714758bSJussi Kivilinna 	int i;
36735714758bSJussi Kivilinna 
36745714758bSJussi Kivilinna 	/* only check once */
36755714758bSJussi Kivilinna 	if (alg_test_descs_checked)
36765714758bSJussi Kivilinna 		return;
36775714758bSJussi Kivilinna 
36785714758bSJussi Kivilinna 	alg_test_descs_checked = true;
36795714758bSJussi Kivilinna 
36805714758bSJussi Kivilinna 	for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
36815714758bSJussi Kivilinna 		int diff = strcmp(alg_test_descs[i - 1].alg,
36825714758bSJussi Kivilinna 				  alg_test_descs[i].alg);
36835714758bSJussi Kivilinna 
36845714758bSJussi Kivilinna 		if (WARN_ON(diff > 0)) {
36855714758bSJussi Kivilinna 			pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
36865714758bSJussi Kivilinna 				alg_test_descs[i - 1].alg,
36875714758bSJussi Kivilinna 				alg_test_descs[i].alg);
36885714758bSJussi Kivilinna 		}
36895714758bSJussi Kivilinna 
36905714758bSJussi Kivilinna 		if (WARN_ON(diff == 0)) {
36915714758bSJussi Kivilinna 			pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
36925714758bSJussi Kivilinna 				alg_test_descs[i].alg);
36935714758bSJussi Kivilinna 		}
36945714758bSJussi Kivilinna 	}
36955714758bSJussi Kivilinna }
36965714758bSJussi Kivilinna 
36971aa4ecd9SHerbert Xu static int alg_find_test(const char *alg)
3698da7f033dSHerbert Xu {
3699da7f033dSHerbert Xu 	int start = 0;
3700da7f033dSHerbert Xu 	int end = ARRAY_SIZE(alg_test_descs);
3701da7f033dSHerbert Xu 
3702da7f033dSHerbert Xu 	while (start < end) {
3703da7f033dSHerbert Xu 		int i = (start + end) / 2;
3704da7f033dSHerbert Xu 		int diff = strcmp(alg_test_descs[i].alg, alg);
3705da7f033dSHerbert Xu 
3706da7f033dSHerbert Xu 		if (diff > 0) {
3707da7f033dSHerbert Xu 			end = i;
3708da7f033dSHerbert Xu 			continue;
3709da7f033dSHerbert Xu 		}
3710da7f033dSHerbert Xu 
3711da7f033dSHerbert Xu 		if (diff < 0) {
3712da7f033dSHerbert Xu 			start = i + 1;
3713da7f033dSHerbert Xu 			continue;
3714da7f033dSHerbert Xu 		}
3715da7f033dSHerbert Xu 
37161aa4ecd9SHerbert Xu 		return i;
3717da7f033dSHerbert Xu 	}
3718da7f033dSHerbert Xu 
37191aa4ecd9SHerbert Xu 	return -1;
37201aa4ecd9SHerbert Xu }
37211aa4ecd9SHerbert Xu 
37221aa4ecd9SHerbert Xu int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
37231aa4ecd9SHerbert Xu {
37241aa4ecd9SHerbert Xu 	int i;
3725a68f6610SHerbert Xu 	int j;
3726d12d6b6dSNeil Horman 	int rc;
37271aa4ecd9SHerbert Xu 
37285714758bSJussi Kivilinna 	alg_test_descs_check_order();
37295714758bSJussi Kivilinna 
37301aa4ecd9SHerbert Xu 	if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
37311aa4ecd9SHerbert Xu 		char nalg[CRYPTO_MAX_ALG_NAME];
37321aa4ecd9SHerbert Xu 
37331aa4ecd9SHerbert Xu 		if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
37341aa4ecd9SHerbert Xu 		    sizeof(nalg))
37351aa4ecd9SHerbert Xu 			return -ENAMETOOLONG;
37361aa4ecd9SHerbert Xu 
37371aa4ecd9SHerbert Xu 		i = alg_find_test(nalg);
37381aa4ecd9SHerbert Xu 		if (i < 0)
37391aa4ecd9SHerbert Xu 			goto notest;
37401aa4ecd9SHerbert Xu 
3741a3bef3a3SJarod Wilson 		if (fips_enabled && !alg_test_descs[i].fips_allowed)
3742a3bef3a3SJarod Wilson 			goto non_fips_alg;
3743a3bef3a3SJarod Wilson 
3744941fb328SJarod Wilson 		rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
3745941fb328SJarod Wilson 		goto test_done;
37461aa4ecd9SHerbert Xu 	}
37471aa4ecd9SHerbert Xu 
37481aa4ecd9SHerbert Xu 	i = alg_find_test(alg);
3749a68f6610SHerbert Xu 	j = alg_find_test(driver);
3750a68f6610SHerbert Xu 	if (i < 0 && j < 0)
37511aa4ecd9SHerbert Xu 		goto notest;
37521aa4ecd9SHerbert Xu 
3753a68f6610SHerbert Xu 	if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
3754a68f6610SHerbert Xu 			     (j >= 0 && !alg_test_descs[j].fips_allowed)))
3755a3bef3a3SJarod Wilson 		goto non_fips_alg;
3756a3bef3a3SJarod Wilson 
3757a68f6610SHerbert Xu 	rc = 0;
3758a68f6610SHerbert Xu 	if (i >= 0)
3759a68f6610SHerbert Xu 		rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
37601aa4ecd9SHerbert Xu 					     type, mask);
3761032c8cacSCristian Stoica 	if (j >= 0 && j != i)
3762a68f6610SHerbert Xu 		rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
3763a68f6610SHerbert Xu 					     type, mask);
3764a68f6610SHerbert Xu 
3765941fb328SJarod Wilson test_done:
3766d12d6b6dSNeil Horman 	if (fips_enabled && rc)
3767d12d6b6dSNeil Horman 		panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
3768d12d6b6dSNeil Horman 
376929ecd4abSJarod Wilson 	if (fips_enabled && !rc)
37703e8cffd4SMasanari Iida 		pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
377129ecd4abSJarod Wilson 
3772d12d6b6dSNeil Horman 	return rc;
37731aa4ecd9SHerbert Xu 
37741aa4ecd9SHerbert Xu notest:
3775da7f033dSHerbert Xu 	printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
3776da7f033dSHerbert Xu 	return 0;
3777a3bef3a3SJarod Wilson non_fips_alg:
3778a3bef3a3SJarod Wilson 	return -EINVAL;
3779da7f033dSHerbert Xu }
37800b767f96SAlexander Shishkin 
3781326a6346SHerbert Xu #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
37820b767f96SAlexander Shishkin 
3783da7f033dSHerbert Xu EXPORT_SYMBOL_GPL(alg_test);
3784