blob: ed9d4ee42f7b8341d40e2741f0494b4d1dae4166 [file] [log] [blame]
Herbert Xuef2736f2005-06-22 13:26:03 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * Quick & dirty crypto testing module.
3 *
4 * This will only exist until we have a better testing mechanism
5 * (e.g. a char device).
6 *
7 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
8 * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
Mikko Herranene3a4ea42007-11-26 22:12:07 +08009 * Copyright (c) 2007 Nokia Siemens Networks
Linus Torvalds1da177e2005-04-16 15:20:36 -070010 *
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the Free
Herbert Xuef2736f2005-06-22 13:26:03 -070013 * Software Foundation; either version 2 of the License, or (at your option)
Linus Torvalds1da177e2005-04-16 15:20:36 -070014 * any later version.
15 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070016 */
17
Herbert Xu18e33e62008-07-10 16:01:22 +080018#include <crypto/hash.h>
Herbert Xucba83562006-08-13 08:26:09 +100019#include <linux/err.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070020#include <linux/init.h>
21#include <linux/module.h>
22#include <linux/mm.h>
23#include <linux/slab.h>
David Hardeman378f0582005-09-17 17:55:31 +100024#include <linux/scatterlist.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070025#include <linux/string.h>
26#include <linux/crypto.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <linux/moduleparam.h>
Harald Welteebfd9bc2005-06-22 13:27:23 -070028#include <linux/jiffies.h>
Herbert Xu6a179442005-06-22 13:29:03 -070029#include <linux/timex.h>
30#include <linux/interrupt.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include "tcrypt.h"
32
33/*
Herbert Xuf139cfa2008-07-31 12:23:53 +080034 * Need slab memory for testing (size in number of pages).
Linus Torvalds1da177e2005-04-16 15:20:36 -070035 */
Herbert Xuf139cfa2008-07-31 12:23:53 +080036#define TVMEMSIZE 4
37#define XBUFSIZE 8
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
39/*
40 * Indexes into the xbuf to simulate cross-page access.
41 */
Patrick McHardya558f1d2008-05-08 19:27:47 +080042#define IDX1 32
Linus Torvalds1da177e2005-04-16 15:20:36 -070043#define IDX2 32400
44#define IDX3 1
45#define IDX4 8193
46#define IDX5 22222
47#define IDX6 17101
48#define IDX7 27333
49#define IDX8 3000
50
51/*
52* Used by test_cipher()
53*/
54#define ENCRYPT 1
55#define DECRYPT 0
Linus Torvalds1da177e2005-04-16 15:20:36 -070056
Herbert Xu6158efc2007-04-04 17:41:07 +100057struct tcrypt_result {
58 struct completion completion;
59 int err;
60};
61
Herbert Xu01b32322008-07-31 15:41:55 +080062struct aead_test_suite {
63 struct {
64 struct aead_testvec *vecs;
65 unsigned int count;
66 } enc, dec;
67};
68
69struct cipher_test_suite {
70 struct {
71 struct cipher_testvec *vecs;
72 unsigned int count;
73 } enc, dec;
74};
75
76struct comp_test_suite {
77 struct {
78 struct comp_testvec *vecs;
79 unsigned int count;
80 } comp, decomp;
81};
82
83struct hash_test_suite {
84 struct hash_testvec *vecs;
85 unsigned int count;
86};
87
88struct alg_test_desc {
89 const char *alg;
90 int (*test)(const struct alg_test_desc *desc, const char *driver,
91 u32 type, u32 mask);
92
93 union {
94 struct aead_test_suite aead;
95 struct cipher_test_suite cipher;
96 struct comp_test_suite comp;
97 struct hash_test_suite hash;
98 } suite;
99};
100
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
102
Harald Welteebfd9bc2005-06-22 13:27:23 -0700103/*
104 * Used by test_cipher_speed()
105 */
Herbert Xu6a179442005-06-22 13:29:03 -0700106static unsigned int sec;
Harald Welteebfd9bc2005-06-22 13:27:23 -0700107
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108static int mode;
Herbert Xuf139cfa2008-07-31 12:23:53 +0800109static char *xbuf[XBUFSIZE];
110static char *axbuf[XBUFSIZE];
111static char *tvmem[TVMEMSIZE];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112
113static char *check[] = {
Jonathan Lynchcd12fb92007-11-10 20:08:25 +0800114 "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
115 "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
116 "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
David Howells90831632006-12-16 12:13:14 +1100117 "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +0800118 "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
119 "lzo", "cts", NULL
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120};
121
Herbert Xuef2736f2005-06-22 13:26:03 -0700122static void hexdump(unsigned char *buf, unsigned int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700123{
Denis Chenga10e1192007-11-30 16:59:30 +1100124 print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
125 16, 1,
126 buf, len, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127}
128
Herbert Xu6158efc2007-04-04 17:41:07 +1000129static void tcrypt_complete(struct crypto_async_request *req, int err)
130{
131 struct tcrypt_result *res = req->data;
132
133 if (err == -EINPROGRESS)
134 return;
135
136 res->err = err;
137 complete(&res->completion);
138}
139
Herbert Xu01b32322008-07-31 15:41:55 +0800140static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
Herbert Xubdecd222008-07-31 14:03:44 +0800141 unsigned int tcount)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700142{
Herbert Xu01b32322008-07-31 15:41:55 +0800143 const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
Herbert Xuef2736f2005-06-22 13:26:03 -0700144 unsigned int i, j, k, temp;
145 struct scatterlist sg[8];
146 char result[64];
Loc Hocde0e2c2008-05-14 21:24:51 +0800147 struct ahash_request *req;
148 struct tcrypt_result tresult;
Herbert Xue9d41162006-08-19 21:38:49 +1000149 int ret;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800150 void *hash_buff;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151
Loc Hocde0e2c2008-05-14 21:24:51 +0800152 init_completion(&tresult.completion);
153
Loc Hocde0e2c2008-05-14 21:24:51 +0800154 req = ahash_request_alloc(tfm, GFP_KERNEL);
155 if (!req) {
Herbert Xubdecd222008-07-31 14:03:44 +0800156 printk(KERN_ERR "alg: hash: Failed to allocate request for "
157 "%s\n", algo);
158 ret = -ENOMEM;
Loc Hocde0e2c2008-05-14 21:24:51 +0800159 goto out_noreq;
160 }
161 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
162 tcrypt_complete, &tresult);
Herbert Xue9d41162006-08-19 21:38:49 +1000163
Linus Torvalds1da177e2005-04-16 15:20:36 -0700164 for (i = 0; i < tcount; i++) {
Herbert Xuef2736f2005-06-22 13:26:03 -0700165 memset(result, 0, 64);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700166
Herbert Xuf139cfa2008-07-31 12:23:53 +0800167 hash_buff = xbuf[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168
Sebastian Siewior562954d2008-03-13 20:20:28 +0800169 memcpy(hash_buff, template[i].plaintext, template[i].psize);
170 sg_init_one(&sg[0], hash_buff, template[i].psize);
171
172 if (template[i].ksize) {
Loc Hocde0e2c2008-05-14 21:24:51 +0800173 crypto_ahash_clear_flags(tfm, ~0);
174 ret = crypto_ahash_setkey(tfm, template[i].key,
175 template[i].ksize);
Herbert Xue9d41162006-08-19 21:38:49 +1000176 if (ret) {
Herbert Xubdecd222008-07-31 14:03:44 +0800177 printk(KERN_ERR "alg: hash: setkey failed on "
178 "test %d for %s: ret=%d\n", i + 1, algo,
179 -ret);
Herbert Xue9d41162006-08-19 21:38:49 +1000180 goto out;
181 }
182 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183
Loc Hocde0e2c2008-05-14 21:24:51 +0800184 ahash_request_set_crypt(req, sg, result, template[i].psize);
185 ret = crypto_ahash_digest(req);
186 switch (ret) {
187 case 0:
188 break;
189 case -EINPROGRESS:
190 case -EBUSY:
191 ret = wait_for_completion_interruptible(
192 &tresult.completion);
193 if (!ret && !(ret = tresult.err)) {
194 INIT_COMPLETION(tresult.completion);
195 break;
196 }
197 /* fall through */
198 default:
Herbert Xubdecd222008-07-31 14:03:44 +0800199 printk(KERN_ERR "alg: hash: digest failed on test %d "
200 "for %s: ret=%d\n", i + 1, algo, -ret);
Herbert Xue9d41162006-08-19 21:38:49 +1000201 goto out;
202 }
203
Herbert Xubdecd222008-07-31 14:03:44 +0800204 if (memcmp(result, template[i].digest,
205 crypto_ahash_digestsize(tfm))) {
206 printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
207 i + 1, algo);
208 hexdump(result, crypto_ahash_digestsize(tfm));
209 ret = -EINVAL;
210 goto out;
211 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700212 }
213
Linus Torvalds1da177e2005-04-16 15:20:36 -0700214 j = 0;
215 for (i = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800216 if (template[i].np) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700217 j++;
Herbert Xuef2736f2005-06-22 13:26:03 -0700218 memset(result, 0, 64);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700219
220 temp = 0;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800221 sg_init_table(sg, template[i].np);
222 for (k = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800223 sg_set_buf(&sg[k],
224 memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
225 offset_in_page(IDX[k]),
226 template[i].plaintext + temp,
227 template[i].tap[k]),
228 template[i].tap[k]);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800229 temp += template[i].tap[k];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700230 }
231
Sebastian Siewior562954d2008-03-13 20:20:28 +0800232 if (template[i].ksize) {
Loc Hocde0e2c2008-05-14 21:24:51 +0800233 crypto_ahash_clear_flags(tfm, ~0);
234 ret = crypto_ahash_setkey(tfm, template[i].key,
235 template[i].ksize);
Herbert Xuef2736f2005-06-22 13:26:03 -0700236
Herbert Xue9d41162006-08-19 21:38:49 +1000237 if (ret) {
Herbert Xubdecd222008-07-31 14:03:44 +0800238 printk(KERN_ERR "alg: hash: setkey "
239 "failed on chunking test %d "
240 "for %s: ret=%d\n", j, algo,
241 -ret);
Herbert Xue9d41162006-08-19 21:38:49 +1000242 goto out;
243 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700244 }
245
Loc Hocde0e2c2008-05-14 21:24:51 +0800246 ahash_request_set_crypt(req, sg, result,
247 template[i].psize);
248 ret = crypto_ahash_digest(req);
249 switch (ret) {
250 case 0:
251 break;
252 case -EINPROGRESS:
253 case -EBUSY:
254 ret = wait_for_completion_interruptible(
255 &tresult.completion);
256 if (!ret && !(ret = tresult.err)) {
257 INIT_COMPLETION(tresult.completion);
258 break;
259 }
260 /* fall through */
261 default:
Herbert Xubdecd222008-07-31 14:03:44 +0800262 printk(KERN_ERR "alg: hash: digest failed "
263 "on chunking test %d for %s: "
264 "ret=%d\n", j, algo, -ret);
Herbert Xue9d41162006-08-19 21:38:49 +1000265 goto out;
266 }
Herbert Xuef2736f2005-06-22 13:26:03 -0700267
Herbert Xubdecd222008-07-31 14:03:44 +0800268 if (memcmp(result, template[i].digest,
269 crypto_ahash_digestsize(tfm))) {
270 printk(KERN_ERR "alg: hash: Chunking test %d "
271 "failed for %s\n", j, algo);
272 hexdump(result, crypto_ahash_digestsize(tfm));
273 ret = -EINVAL;
274 goto out;
275 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276 }
277 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278
Herbert Xubdecd222008-07-31 14:03:44 +0800279 ret = 0;
280
Herbert Xue9d41162006-08-19 21:38:49 +1000281out:
Loc Hocde0e2c2008-05-14 21:24:51 +0800282 ahash_request_free(req);
283out_noreq:
Herbert Xubdecd222008-07-31 14:03:44 +0800284 return ret;
Herbert Xue9d41162006-08-19 21:38:49 +1000285}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286
Herbert Xu01b32322008-07-31 15:41:55 +0800287static int test_aead(struct crypto_aead *tfm, int enc,
288 struct aead_testvec *template, unsigned int tcount)
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800289{
Herbert Xu01b32322008-07-31 15:41:55 +0800290 const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
Herbert Xubdecd222008-07-31 14:03:44 +0800291 unsigned int i, j, k, n, temp;
292 int ret = 0;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800293 char *q;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800294 char *key;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800295 struct aead_request *req;
296 struct scatterlist sg[8];
297 struct scatterlist asg[8];
298 const char *e;
299 struct tcrypt_result result;
Herbert Xu6160b282007-12-04 19:17:50 +1100300 unsigned int authsize;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800301 void *input;
302 void *assoc;
303 char iv[MAX_IVLEN];
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800304
305 if (enc == ENCRYPT)
306 e = "encryption";
307 else
308 e = "decryption";
309
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800310 init_completion(&result.completion);
311
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800312 req = aead_request_alloc(tfm, GFP_KERNEL);
313 if (!req) {
Herbert Xubdecd222008-07-31 14:03:44 +0800314 printk(KERN_ERR "alg: aead: Failed to allocate request for "
315 "%s\n", algo);
316 ret = -ENOMEM;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800317 goto out;
318 }
319
320 aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
321 tcrypt_complete, &result);
322
323 for (i = 0, j = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800324 if (!template[i].np) {
Herbert Xubdecd222008-07-31 14:03:44 +0800325 j++;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800326
327 /* some tepmplates have no input data but they will
328 * touch input
329 */
Herbert Xuf139cfa2008-07-31 12:23:53 +0800330 input = xbuf[0];
331 assoc = axbuf[0];
Sebastian Siewior562954d2008-03-13 20:20:28 +0800332
333 memcpy(input, template[i].input, template[i].ilen);
334 memcpy(assoc, template[i].assoc, template[i].alen);
335 if (template[i].iv)
336 memcpy(iv, template[i].iv, MAX_IVLEN);
337 else
338 memset(iv, 0, MAX_IVLEN);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800339
340 crypto_aead_clear_flags(tfm, ~0);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800341 if (template[i].wk)
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800342 crypto_aead_set_flags(
343 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800344
Herbert Xuf139cfa2008-07-31 12:23:53 +0800345 key = template[i].key;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800346
347 ret = crypto_aead_setkey(tfm, key,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800348 template[i].klen);
Herbert Xubdecd222008-07-31 14:03:44 +0800349 if (!ret == template[i].fail) {
350 printk(KERN_ERR "alg: aead: setkey failed on "
351 "test %d for %s: flags=%x\n", j, algo,
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800352 crypto_aead_get_flags(tfm));
Herbert Xubdecd222008-07-31 14:03:44 +0800353 goto out;
354 } else if (ret)
355 continue;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800356
Sebastian Siewior562954d2008-03-13 20:20:28 +0800357 authsize = abs(template[i].rlen - template[i].ilen);
Joy Latten93cc74e2007-12-12 20:24:22 +0800358 ret = crypto_aead_setauthsize(tfm, authsize);
359 if (ret) {
Herbert Xubdecd222008-07-31 14:03:44 +0800360 printk(KERN_ERR "alg: aead: Failed to set "
361 "authsize to %u on test %d for %s\n",
362 authsize, j, algo);
363 goto out;
Joy Latten93cc74e2007-12-12 20:24:22 +0800364 }
365
Sebastian Siewior562954d2008-03-13 20:20:28 +0800366 sg_init_one(&sg[0], input,
367 template[i].ilen + (enc ? authsize : 0));
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800368
Sebastian Siewior562954d2008-03-13 20:20:28 +0800369 sg_init_one(&asg[0], assoc, template[i].alen);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800370
371 aead_request_set_crypt(req, sg, sg,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800372 template[i].ilen, iv);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800373
Sebastian Siewior562954d2008-03-13 20:20:28 +0800374 aead_request_set_assoc(req, asg, template[i].alen);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800375
Herbert Xu6160b282007-12-04 19:17:50 +1100376 ret = enc ?
377 crypto_aead_encrypt(req) :
378 crypto_aead_decrypt(req);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800379
380 switch (ret) {
381 case 0:
382 break;
383 case -EINPROGRESS:
384 case -EBUSY:
385 ret = wait_for_completion_interruptible(
386 &result.completion);
387 if (!ret && !(ret = result.err)) {
388 INIT_COMPLETION(result.completion);
389 break;
390 }
391 /* fall through */
392 default:
Herbert Xubdecd222008-07-31 14:03:44 +0800393 printk(KERN_ERR "alg: aead: %s failed on test "
394 "%d for %s: ret=%d\n", e, j, algo, -ret);
395 goto out;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800396 }
397
Herbert Xu4b22f0d2008-07-03 14:57:30 +0800398 q = input;
Herbert Xubdecd222008-07-31 14:03:44 +0800399 if (memcmp(q, template[i].result, template[i].rlen)) {
400 printk(KERN_ERR "alg: aead: Test %d failed on "
401 "%s for %s\n", j, e, algo);
402 hexdump(q, template[i].rlen);
403 ret = -EINVAL;
404 goto out;
405 }
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800406 }
407 }
408
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800409 for (i = 0, j = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800410 if (template[i].np) {
Herbert Xubdecd222008-07-31 14:03:44 +0800411 j++;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800412
413 if (template[i].iv)
414 memcpy(iv, template[i].iv, MAX_IVLEN);
415 else
416 memset(iv, 0, MAX_IVLEN);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800417
418 crypto_aead_clear_flags(tfm, ~0);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800419 if (template[i].wk)
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800420 crypto_aead_set_flags(
421 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800422 key = template[i].key;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800423
Sebastian Siewior562954d2008-03-13 20:20:28 +0800424 ret = crypto_aead_setkey(tfm, key, template[i].klen);
Herbert Xubdecd222008-07-31 14:03:44 +0800425 if (!ret == template[i].fail) {
426 printk(KERN_ERR "alg: aead: setkey failed on "
427 "chunk test %d for %s: flags=%x\n", j,
428 algo, crypto_aead_get_flags(tfm));
429 goto out;
430 } else if (ret)
431 continue;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800432
Herbert Xuf139cfa2008-07-31 12:23:53 +0800433 authsize = abs(template[i].rlen - template[i].ilen);
434
Herbert Xubdecd222008-07-31 14:03:44 +0800435 ret = -EINVAL;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800436 sg_init_table(sg, template[i].np);
437 for (k = 0, temp = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800438 if (WARN_ON(offset_in_page(IDX[k]) +
439 template[i].tap[k] > PAGE_SIZE))
440 goto out;
441
442 q = xbuf[IDX[k] >> PAGE_SHIFT] +
443 offset_in_page(IDX[k]);
444
445 memcpy(q, template[i].input + temp,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800446 template[i].tap[k]);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800447
448 n = template[i].tap[k];
449 if (k == template[i].np - 1 && enc)
450 n += authsize;
451 if (offset_in_page(q) + n < PAGE_SIZE)
452 q[n] = 0;
453
454 sg_set_buf(&sg[k], q, template[i].tap[k]);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800455 temp += template[i].tap[k];
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800456 }
457
Joy Latten93cc74e2007-12-12 20:24:22 +0800458 ret = crypto_aead_setauthsize(tfm, authsize);
459 if (ret) {
Herbert Xubdecd222008-07-31 14:03:44 +0800460 printk(KERN_ERR "alg: aead: Failed to set "
461 "authsize to %u on chunk test %d for "
462 "%s\n", authsize, j, algo);
Joy Latten93cc74e2007-12-12 20:24:22 +0800463 goto out;
464 }
465
Herbert Xuf139cfa2008-07-31 12:23:53 +0800466 if (enc) {
467 if (WARN_ON(sg[k - 1].offset +
468 sg[k - 1].length + authsize >
Herbert Xubdecd222008-07-31 14:03:44 +0800469 PAGE_SIZE)) {
470 ret = -EINVAL;
Herbert Xuf139cfa2008-07-31 12:23:53 +0800471 goto out;
Herbert Xubdecd222008-07-31 14:03:44 +0800472 }
Herbert Xuf139cfa2008-07-31 12:23:53 +0800473
Herbert Xu6160b282007-12-04 19:17:50 +1100474 sg[k - 1].length += authsize;
Herbert Xuf139cfa2008-07-31 12:23:53 +0800475 }
Herbert Xu6160b282007-12-04 19:17:50 +1100476
Sebastian Siewior562954d2008-03-13 20:20:28 +0800477 sg_init_table(asg, template[i].anp);
478 for (k = 0, temp = 0; k < template[i].anp; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800479 sg_set_buf(&asg[k],
480 memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
481 offset_in_page(IDX[k]),
482 template[i].assoc + temp,
483 template[i].atap[k]),
Sebastian Siewior562954d2008-03-13 20:20:28 +0800484 template[i].atap[k]);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800485 temp += template[i].atap[k];
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800486 }
487
488 aead_request_set_crypt(req, sg, sg,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800489 template[i].ilen,
490 iv);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800491
Sebastian Siewior562954d2008-03-13 20:20:28 +0800492 aead_request_set_assoc(req, asg, template[i].alen);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800493
Herbert Xu6160b282007-12-04 19:17:50 +1100494 ret = enc ?
495 crypto_aead_encrypt(req) :
496 crypto_aead_decrypt(req);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800497
498 switch (ret) {
499 case 0:
500 break;
501 case -EINPROGRESS:
502 case -EBUSY:
503 ret = wait_for_completion_interruptible(
504 &result.completion);
505 if (!ret && !(ret = result.err)) {
506 INIT_COMPLETION(result.completion);
507 break;
508 }
509 /* fall through */
510 default:
Herbert Xubdecd222008-07-31 14:03:44 +0800511 printk(KERN_ERR "alg: aead: %s failed on "
512 "chunk test %d for %s: ret=%d\n", e, j,
513 algo, -ret);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800514 goto out;
515 }
516
Herbert Xubdecd222008-07-31 14:03:44 +0800517 ret = -EINVAL;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800518 for (k = 0, temp = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800519 q = xbuf[IDX[k] >> PAGE_SHIFT] +
520 offset_in_page(IDX[k]);
Herbert Xuf176e632008-07-30 16:23:51 +0800521
522 n = template[i].tap[k];
523 if (k == template[i].np - 1)
524 n += enc ? authsize : -authsize;
Herbert Xubdecd222008-07-31 14:03:44 +0800525
526 if (memcmp(q, template[i].result + temp, n)) {
527 printk(KERN_ERR "alg: aead: Chunk "
528 "test %d failed on %s at page "
529 "%u for %s\n", j, e, k, algo);
530 hexdump(q, n);
531 goto out;
532 }
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800533
Herbert Xuf176e632008-07-30 16:23:51 +0800534 q += n;
535 if (k == template[i].np - 1 && !enc) {
536 if (memcmp(q, template[i].input +
537 temp + n, authsize))
538 n = authsize;
539 else
540 n = 0;
541 } else {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800542 for (n = 0; offset_in_page(q + n) &&
543 q[n]; n++)
Herbert Xuf176e632008-07-30 16:23:51 +0800544 ;
545 }
Patrick McHardya558f1d2008-05-08 19:27:47 +0800546 if (n) {
Herbert Xubdecd222008-07-31 14:03:44 +0800547 printk(KERN_ERR "alg: aead: Result "
548 "buffer corruption in chunk "
549 "test %d on %s at page %u for "
550 "%s: %u bytes:\n", j, e, k,
551 algo, n);
Herbert Xuf176e632008-07-30 16:23:51 +0800552 hexdump(q, n);
Herbert Xubdecd222008-07-31 14:03:44 +0800553 goto out;
Patrick McHardya558f1d2008-05-08 19:27:47 +0800554 }
555
Sebastian Siewior562954d2008-03-13 20:20:28 +0800556 temp += template[i].tap[k];
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800557 }
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800558 }
559 }
560
Herbert Xubdecd222008-07-31 14:03:44 +0800561 ret = 0;
562
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800563out:
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800564 aead_request_free(req);
Herbert Xubdecd222008-07-31 14:03:44 +0800565 return ret;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800566}
567
Herbert Xu01b32322008-07-31 15:41:55 +0800568static int test_cipher(struct crypto_ablkcipher *tfm, int enc,
Herbert Xubdecd222008-07-31 14:03:44 +0800569 struct cipher_testvec *template, unsigned int tcount)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570{
Herbert Xu01b32322008-07-31 15:41:55 +0800571 const char *algo =
572 crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
Herbert Xubdecd222008-07-31 14:03:44 +0800573 unsigned int i, j, k, n, temp;
574 int ret;
David Hardeman378f0582005-09-17 17:55:31 +1000575 char *q;
Herbert Xu6158efc2007-04-04 17:41:07 +1000576 struct ablkcipher_request *req;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577 struct scatterlist sg[8];
Herbert Xucba83562006-08-13 08:26:09 +1000578 const char *e;
Herbert Xu6158efc2007-04-04 17:41:07 +1000579 struct tcrypt_result result;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800580 void *data;
581 char iv[MAX_IVLEN];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582
583 if (enc == ENCRYPT)
Herbert Xu3cc38162005-06-22 13:26:36 -0700584 e = "encryption";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700585 else
Herbert Xu3cc38162005-06-22 13:26:36 -0700586 e = "decryption";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587
Herbert Xu6158efc2007-04-04 17:41:07 +1000588 init_completion(&result.completion);
Herbert Xu6158efc2007-04-04 17:41:07 +1000589
590 req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
591 if (!req) {
Herbert Xubdecd222008-07-31 14:03:44 +0800592 printk(KERN_ERR "alg: cipher: Failed to allocate request for "
593 "%s\n", algo);
594 ret = -ENOMEM;
Herbert Xu6158efc2007-04-04 17:41:07 +1000595 goto out;
596 }
597
598 ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
599 tcrypt_complete, &result);
Herbert Xuef2736f2005-06-22 13:26:03 -0700600
Linus Torvalds1da177e2005-04-16 15:20:36 -0700601 j = 0;
602 for (i = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800603 if (template[i].iv)
604 memcpy(iv, template[i].iv, MAX_IVLEN);
605 else
606 memset(iv, 0, MAX_IVLEN);
607
608 if (!(template[i].np)) {
Herbert Xuef2736f2005-06-22 13:26:03 -0700609 j++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610
Herbert Xuf139cfa2008-07-31 12:23:53 +0800611 data = xbuf[0];
612 memcpy(data, template[i].input, template[i].ilen);
613
Herbert Xu6158efc2007-04-04 17:41:07 +1000614 crypto_ablkcipher_clear_flags(tfm, ~0);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800615 if (template[i].wk)
Herbert Xu6158efc2007-04-04 17:41:07 +1000616 crypto_ablkcipher_set_flags(
Herbert Xucba83562006-08-13 08:26:09 +1000617 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
Herbert Xuef2736f2005-06-22 13:26:03 -0700618
Sebastian Siewior562954d2008-03-13 20:20:28 +0800619 ret = crypto_ablkcipher_setkey(tfm, template[i].key,
620 template[i].klen);
Herbert Xubdecd222008-07-31 14:03:44 +0800621 if (!ret == template[i].fail) {
622 printk(KERN_ERR "alg: cipher: setkey failed "
623 "on test %d for %s: flags=%x\n", j,
624 algo, crypto_ablkcipher_get_flags(tfm));
625 goto out;
626 } else if (ret)
627 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628
Sebastian Siewior562954d2008-03-13 20:20:28 +0800629 sg_init_one(&sg[0], data, template[i].ilen);
Herbert Xuef2736f2005-06-22 13:26:03 -0700630
Herbert Xu6158efc2007-04-04 17:41:07 +1000631 ablkcipher_request_set_crypt(req, sg, sg,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800632 template[i].ilen, iv);
Herbert Xucba83562006-08-13 08:26:09 +1000633 ret = enc ?
Herbert Xu6158efc2007-04-04 17:41:07 +1000634 crypto_ablkcipher_encrypt(req) :
635 crypto_ablkcipher_decrypt(req);
Herbert Xuef2736f2005-06-22 13:26:03 -0700636
Herbert Xu6158efc2007-04-04 17:41:07 +1000637 switch (ret) {
638 case 0:
639 break;
640 case -EINPROGRESS:
641 case -EBUSY:
642 ret = wait_for_completion_interruptible(
643 &result.completion);
644 if (!ret && !((ret = result.err))) {
645 INIT_COMPLETION(result.completion);
646 break;
647 }
648 /* fall through */
649 default:
Herbert Xubdecd222008-07-31 14:03:44 +0800650 printk(KERN_ERR "alg: cipher: %s failed on "
651 "test %d for %s: ret=%d\n", e, j, algo,
652 -ret);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700653 goto out;
Herbert Xuef2736f2005-06-22 13:26:03 -0700654 }
655
Herbert Xu4b22f0d2008-07-03 14:57:30 +0800656 q = data;
Herbert Xubdecd222008-07-31 14:03:44 +0800657 if (memcmp(q, template[i].result, template[i].rlen)) {
658 printk(KERN_ERR "alg: cipher: Test %d failed "
659 "on %s for %s\n", j, e, algo);
660 hexdump(q, template[i].rlen);
661 ret = -EINVAL;
662 goto out;
663 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664 }
665 }
Herbert Xuef2736f2005-06-22 13:26:03 -0700666
Linus Torvalds1da177e2005-04-16 15:20:36 -0700667 j = 0;
668 for (i = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800669
Sebastian Siewior562954d2008-03-13 20:20:28 +0800670 if (template[i].iv)
671 memcpy(iv, template[i].iv, MAX_IVLEN);
672 else
673 memset(iv, 0, MAX_IVLEN);
674
675 if (template[i].np) {
Herbert Xuef2736f2005-06-22 13:26:03 -0700676 j++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677
Herbert Xu6158efc2007-04-04 17:41:07 +1000678 crypto_ablkcipher_clear_flags(tfm, ~0);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800679 if (template[i].wk)
Herbert Xu6158efc2007-04-04 17:41:07 +1000680 crypto_ablkcipher_set_flags(
Herbert Xucba83562006-08-13 08:26:09 +1000681 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
Herbert Xuef2736f2005-06-22 13:26:03 -0700682
Sebastian Siewior562954d2008-03-13 20:20:28 +0800683 ret = crypto_ablkcipher_setkey(tfm, template[i].key,
684 template[i].klen);
Herbert Xubdecd222008-07-31 14:03:44 +0800685 if (!ret == template[i].fail) {
686 printk(KERN_ERR "alg: cipher: setkey failed "
687 "on chunk test %d for %s: flags=%x\n",
688 j, algo,
689 crypto_ablkcipher_get_flags(tfm));
690 goto out;
691 } else if (ret)
692 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693
694 temp = 0;
Herbert Xubdecd222008-07-31 14:03:44 +0800695 ret = -EINVAL;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800696 sg_init_table(sg, template[i].np);
697 for (k = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800698 if (WARN_ON(offset_in_page(IDX[k]) +
699 template[i].tap[k] > PAGE_SIZE))
700 goto out;
701
702 q = xbuf[IDX[k] >> PAGE_SHIFT] +
703 offset_in_page(IDX[k]);
704
705 memcpy(q, template[i].input + temp,
706 template[i].tap[k]);
707
708 if (offset_in_page(q) + template[i].tap[k] <
709 PAGE_SIZE)
710 q[template[i].tap[k]] = 0;
711
712 sg_set_buf(&sg[k], q, template[i].tap[k]);
713
Sebastian Siewior562954d2008-03-13 20:20:28 +0800714 temp += template[i].tap[k];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700715 }
Herbert Xuef2736f2005-06-22 13:26:03 -0700716
Herbert Xu6158efc2007-04-04 17:41:07 +1000717 ablkcipher_request_set_crypt(req, sg, sg,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800718 template[i].ilen, iv);
Herbert Xuef2736f2005-06-22 13:26:03 -0700719
Herbert Xucba83562006-08-13 08:26:09 +1000720 ret = enc ?
Herbert Xu6158efc2007-04-04 17:41:07 +1000721 crypto_ablkcipher_encrypt(req) :
722 crypto_ablkcipher_decrypt(req);
Herbert Xuef2736f2005-06-22 13:26:03 -0700723
Herbert Xu6158efc2007-04-04 17:41:07 +1000724 switch (ret) {
725 case 0:
726 break;
727 case -EINPROGRESS:
728 case -EBUSY:
729 ret = wait_for_completion_interruptible(
730 &result.completion);
731 if (!ret && !((ret = result.err))) {
732 INIT_COMPLETION(result.completion);
733 break;
734 }
735 /* fall through */
736 default:
Herbert Xubdecd222008-07-31 14:03:44 +0800737 printk(KERN_ERR "alg: cipher: %s failed on "
738 "chunk test %d for %s: ret=%d\n", e, j,
739 algo, -ret);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700740 goto out;
741 }
742
743 temp = 0;
Herbert Xubdecd222008-07-31 14:03:44 +0800744 ret = -EINVAL;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800745 for (k = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800746 q = xbuf[IDX[k] >> PAGE_SHIFT] +
747 offset_in_page(IDX[k]);
Herbert Xubdecd222008-07-31 14:03:44 +0800748
749 if (memcmp(q, template[i].result + temp,
750 template[i].tap[k])) {
751 printk(KERN_ERR "alg: cipher: Chunk "
752 "test %d failed on %s at page "
753 "%u for %s\n", j, e, k, algo);
754 hexdump(q, template[i].tap[k]);
755 goto out;
756 }
Patrick McHardya558f1d2008-05-08 19:27:47 +0800757
Herbert Xuf139cfa2008-07-31 12:23:53 +0800758 q += template[i].tap[k];
759 for (n = 0; offset_in_page(q + n) && q[n]; n++)
Patrick McHardya558f1d2008-05-08 19:27:47 +0800760 ;
761 if (n) {
Herbert Xubdecd222008-07-31 14:03:44 +0800762 printk(KERN_ERR "alg: cipher: "
763 "Result buffer corruption in "
764 "chunk test %d on %s at page "
765 "%u for %s: %u bytes:\n", j, e,
766 k, algo, n);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800767 hexdump(q, n);
Herbert Xubdecd222008-07-31 14:03:44 +0800768 goto out;
Patrick McHardya558f1d2008-05-08 19:27:47 +0800769 }
Sebastian Siewior562954d2008-03-13 20:20:28 +0800770 temp += template[i].tap[k];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771 }
772 }
773 }
Herbert Xubdecd222008-07-31 14:03:44 +0800774
775 ret = 0;
776
Linus Torvalds1da177e2005-04-16 15:20:36 -0700777out:
Herbert Xu6158efc2007-04-04 17:41:07 +1000778 ablkcipher_request_free(req);
Herbert Xubdecd222008-07-31 14:03:44 +0800779 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700780}
781
Herbert Xuf139cfa2008-07-31 12:23:53 +0800782static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
783 struct scatterlist *sg, int blen, int sec)
Herbert Xu6a179442005-06-22 13:29:03 -0700784{
Herbert Xu6a179442005-06-22 13:29:03 -0700785 unsigned long start, end;
786 int bcount;
787 int ret;
788
Herbert Xu6a179442005-06-22 13:29:03 -0700789 for (start = jiffies, end = start + sec * HZ, bcount = 0;
790 time_before(jiffies, end); bcount++) {
791 if (enc)
Herbert Xucba83562006-08-13 08:26:09 +1000792 ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700793 else
Herbert Xucba83562006-08-13 08:26:09 +1000794 ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700795
796 if (ret)
797 return ret;
798 }
799
800 printk("%d operations in %d seconds (%ld bytes)\n",
801 bcount, sec, (long)bcount * blen);
802 return 0;
803}
804
Herbert Xuf139cfa2008-07-31 12:23:53 +0800805static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
806 struct scatterlist *sg, int blen)
Herbert Xu6a179442005-06-22 13:29:03 -0700807{
Herbert Xu6a179442005-06-22 13:29:03 -0700808 unsigned long cycles = 0;
809 int ret = 0;
810 int i;
811
Herbert Xu6a179442005-06-22 13:29:03 -0700812 local_bh_disable();
813 local_irq_disable();
814
815 /* Warm-up run. */
816 for (i = 0; i < 4; i++) {
817 if (enc)
Herbert Xucba83562006-08-13 08:26:09 +1000818 ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700819 else
Herbert Xucba83562006-08-13 08:26:09 +1000820 ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700821
822 if (ret)
823 goto out;
824 }
825
826 /* The real thing. */
827 for (i = 0; i < 8; i++) {
828 cycles_t start, end;
829
830 start = get_cycles();
831 if (enc)
Herbert Xucba83562006-08-13 08:26:09 +1000832 ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700833 else
Herbert Xucba83562006-08-13 08:26:09 +1000834 ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700835 end = get_cycles();
836
837 if (ret)
838 goto out;
839
840 cycles += end - start;
841 }
842
843out:
844 local_irq_enable();
845 local_bh_enable();
846
847 if (ret == 0)
848 printk("1 operation in %lu cycles (%d bytes)\n",
849 (cycles + 4) / 8, blen);
850
851 return ret;
852}
853
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800854static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
855
Herbert Xu01b32322008-07-31 15:41:55 +0800856static void test_cipher_speed(const char *algo, int enc, unsigned int sec,
Herbert Xudce907c2005-06-22 13:27:51 -0700857 struct cipher_testvec *template,
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800858 unsigned int tcount, u8 *keysize)
Harald Welteebfd9bc2005-06-22 13:27:23 -0700859{
Herbert Xudce907c2005-06-22 13:27:51 -0700860 unsigned int ret, i, j, iv_len;
Herbert Xuf139cfa2008-07-31 12:23:53 +0800861 unsigned char *key, iv[128];
Herbert Xucba83562006-08-13 08:26:09 +1000862 struct crypto_blkcipher *tfm;
863 struct blkcipher_desc desc;
864 const char *e;
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800865 u32 *b_size;
Harald Welteebfd9bc2005-06-22 13:27:23 -0700866
867 if (enc == ENCRYPT)
868 e = "encryption";
869 else
870 e = "decryption";
Harald Welteebfd9bc2005-06-22 13:27:23 -0700871
Herbert Xucba83562006-08-13 08:26:09 +1000872 printk("\ntesting speed of %s %s\n", algo, e);
Harald Welteebfd9bc2005-06-22 13:27:23 -0700873
Herbert Xucba83562006-08-13 08:26:09 +1000874 tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
Harald Welteebfd9bc2005-06-22 13:27:23 -0700875
Herbert Xucba83562006-08-13 08:26:09 +1000876 if (IS_ERR(tfm)) {
877 printk("failed to load transform for %s: %ld\n", algo,
878 PTR_ERR(tfm));
Harald Welteebfd9bc2005-06-22 13:27:23 -0700879 return;
880 }
Herbert Xucba83562006-08-13 08:26:09 +1000881 desc.tfm = tfm;
882 desc.flags = 0;
Harald Welteebfd9bc2005-06-22 13:27:23 -0700883
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800884 i = 0;
885 do {
Harald Welteebfd9bc2005-06-22 13:27:23 -0700886
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800887 b_size = block_sizes;
888 do {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800889 struct scatterlist sg[TVMEMSIZE];
Harald Welteebfd9bc2005-06-22 13:27:23 -0700890
Herbert Xuf139cfa2008-07-31 12:23:53 +0800891 if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
892 printk("template (%u) too big for "
893 "tvmem (%lu)\n", *keysize + *b_size,
894 TVMEMSIZE * PAGE_SIZE);
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800895 goto out;
896 }
Harald Welteebfd9bc2005-06-22 13:27:23 -0700897
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800898 printk("test %u (%d bit key, %d byte blocks): ", i,
899 *keysize * 8, *b_size);
900
Herbert Xuf139cfa2008-07-31 12:23:53 +0800901 memset(tvmem[0], 0xff, PAGE_SIZE);
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800902
903 /* set key, plain text and IV */
Herbert Xuf139cfa2008-07-31 12:23:53 +0800904 key = (unsigned char *)tvmem[0];
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800905 for (j = 0; j < tcount; j++) {
906 if (template[j].klen == *keysize) {
907 key = template[j].key;
908 break;
909 }
910 }
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800911
912 ret = crypto_blkcipher_setkey(tfm, key, *keysize);
913 if (ret) {
914 printk("setkey() failed flags=%x\n",
915 crypto_blkcipher_get_flags(tfm));
916 goto out;
917 }
918
Herbert Xuf139cfa2008-07-31 12:23:53 +0800919 sg_init_table(sg, TVMEMSIZE);
920 sg_set_buf(sg, tvmem[0] + *keysize,
921 PAGE_SIZE - *keysize);
922 for (j = 1; j < TVMEMSIZE; j++) {
923 sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
924 memset (tvmem[j], 0xff, PAGE_SIZE);
925 }
926
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800927 iv_len = crypto_blkcipher_ivsize(tfm);
928 if (iv_len) {
929 memset(&iv, 0xff, iv_len);
930 crypto_blkcipher_set_iv(tfm, iv, iv_len);
931 }
932
933 if (sec)
Herbert Xuf139cfa2008-07-31 12:23:53 +0800934 ret = test_cipher_jiffies(&desc, enc, sg,
935 *b_size, sec);
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800936 else
Herbert Xuf139cfa2008-07-31 12:23:53 +0800937 ret = test_cipher_cycles(&desc, enc, sg,
938 *b_size);
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800939
940 if (ret) {
941 printk("%s() failed flags=%x\n", e, desc.flags);
Herbert Xudce907c2005-06-22 13:27:51 -0700942 break;
943 }
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800944 b_size++;
945 i++;
946 } while (*b_size);
947 keysize++;
948 } while (*keysize);
Harald Welteebfd9bc2005-06-22 13:27:23 -0700949
950out:
Herbert Xucba83562006-08-13 08:26:09 +1000951 crypto_free_blkcipher(tfm);
Harald Welteebfd9bc2005-06-22 13:27:23 -0700952}
953
Herbert Xuf139cfa2008-07-31 12:23:53 +0800954static int test_hash_jiffies_digest(struct hash_desc *desc,
955 struct scatterlist *sg, int blen,
Herbert Xue9d41162006-08-19 21:38:49 +1000956 char *out, int sec)
Michal Ludvige8057922006-05-30 22:04:19 +1000957{
Michal Ludvige8057922006-05-30 22:04:19 +1000958 unsigned long start, end;
Herbert Xue9d41162006-08-19 21:38:49 +1000959 int bcount;
960 int ret;
Michal Ludvige8057922006-05-30 22:04:19 +1000961
962 for (start = jiffies, end = start + sec * HZ, bcount = 0;
963 time_before(jiffies, end); bcount++) {
Herbert Xue9d41162006-08-19 21:38:49 +1000964 ret = crypto_hash_digest(desc, sg, blen, out);
965 if (ret)
966 return ret;
Michal Ludvige8057922006-05-30 22:04:19 +1000967 }
968
969 printk("%6u opers/sec, %9lu bytes/sec\n",
970 bcount / sec, ((long)bcount * blen) / sec);
971
Herbert Xue9d41162006-08-19 21:38:49 +1000972 return 0;
Michal Ludvige8057922006-05-30 22:04:19 +1000973}
974
Herbert Xuf139cfa2008-07-31 12:23:53 +0800975static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
976 int blen, int plen, char *out, int sec)
Herbert Xue9d41162006-08-19 21:38:49 +1000977{
Herbert Xue9d41162006-08-19 21:38:49 +1000978 unsigned long start, end;
979 int bcount, pcount;
980 int ret;
981
982 if (plen == blen)
Herbert Xuf139cfa2008-07-31 12:23:53 +0800983 return test_hash_jiffies_digest(desc, sg, blen, out, sec);
Herbert Xua5a613a2007-10-27 00:51:21 -0700984
Herbert Xue9d41162006-08-19 21:38:49 +1000985 for (start = jiffies, end = start + sec * HZ, bcount = 0;
986 time_before(jiffies, end); bcount++) {
987 ret = crypto_hash_init(desc);
988 if (ret)
989 return ret;
990 for (pcount = 0; pcount < blen; pcount += plen) {
Herbert Xue9d41162006-08-19 21:38:49 +1000991 ret = crypto_hash_update(desc, sg, plen);
992 if (ret)
993 return ret;
994 }
995 /* we assume there is enough space in 'out' for the result */
996 ret = crypto_hash_final(desc, out);
997 if (ret)
998 return ret;
999 }
1000
1001 printk("%6u opers/sec, %9lu bytes/sec\n",
1002 bcount / sec, ((long)bcount * blen) / sec);
1003
1004 return 0;
1005}
1006
Herbert Xuf139cfa2008-07-31 12:23:53 +08001007static int test_hash_cycles_digest(struct hash_desc *desc,
1008 struct scatterlist *sg, int blen, char *out)
Michal Ludvige8057922006-05-30 22:04:19 +10001009{
Michal Ludvige8057922006-05-30 22:04:19 +10001010 unsigned long cycles = 0;
Herbert Xue9d41162006-08-19 21:38:49 +10001011 int i;
1012 int ret;
Michal Ludvige8057922006-05-30 22:04:19 +10001013
1014 local_bh_disable();
1015 local_irq_disable();
1016
1017 /* Warm-up run. */
1018 for (i = 0; i < 4; i++) {
Herbert Xue9d41162006-08-19 21:38:49 +10001019 ret = crypto_hash_digest(desc, sg, blen, out);
1020 if (ret)
1021 goto out;
Michal Ludvige8057922006-05-30 22:04:19 +10001022 }
1023
1024 /* The real thing. */
1025 for (i = 0; i < 8; i++) {
1026 cycles_t start, end;
1027
Michal Ludvige8057922006-05-30 22:04:19 +10001028 start = get_cycles();
1029
Herbert Xue9d41162006-08-19 21:38:49 +10001030 ret = crypto_hash_digest(desc, sg, blen, out);
1031 if (ret)
1032 goto out;
Michal Ludvige8057922006-05-30 22:04:19 +10001033
1034 end = get_cycles();
1035
1036 cycles += end - start;
1037 }
1038
Herbert Xue9d41162006-08-19 21:38:49 +10001039out:
Michal Ludvige8057922006-05-30 22:04:19 +10001040 local_irq_enable();
1041 local_bh_enable();
1042
Herbert Xue9d41162006-08-19 21:38:49 +10001043 if (ret)
1044 return ret;
1045
Michal Ludvige8057922006-05-30 22:04:19 +10001046 printk("%6lu cycles/operation, %4lu cycles/byte\n",
1047 cycles / 8, cycles / (8 * blen));
1048
Herbert Xue9d41162006-08-19 21:38:49 +10001049 return 0;
Michal Ludvige8057922006-05-30 22:04:19 +10001050}
1051
Herbert Xuf139cfa2008-07-31 12:23:53 +08001052static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
1053 int blen, int plen, char *out)
Michal Ludvige8057922006-05-30 22:04:19 +10001054{
Herbert Xue9d41162006-08-19 21:38:49 +10001055 unsigned long cycles = 0;
1056 int i, pcount;
1057 int ret;
1058
1059 if (plen == blen)
Herbert Xuf139cfa2008-07-31 12:23:53 +08001060 return test_hash_cycles_digest(desc, sg, blen, out);
Herbert Xua5a613a2007-10-27 00:51:21 -07001061
Herbert Xue9d41162006-08-19 21:38:49 +10001062 local_bh_disable();
1063 local_irq_disable();
1064
1065 /* Warm-up run. */
1066 for (i = 0; i < 4; i++) {
1067 ret = crypto_hash_init(desc);
1068 if (ret)
1069 goto out;
1070 for (pcount = 0; pcount < blen; pcount += plen) {
Herbert Xue9d41162006-08-19 21:38:49 +10001071 ret = crypto_hash_update(desc, sg, plen);
1072 if (ret)
1073 goto out;
1074 }
Herbert Xu29059d12007-05-18 16:25:19 +10001075 ret = crypto_hash_final(desc, out);
Herbert Xue9d41162006-08-19 21:38:49 +10001076 if (ret)
1077 goto out;
1078 }
1079
1080 /* The real thing. */
1081 for (i = 0; i < 8; i++) {
1082 cycles_t start, end;
1083
1084 start = get_cycles();
1085
1086 ret = crypto_hash_init(desc);
1087 if (ret)
1088 goto out;
1089 for (pcount = 0; pcount < blen; pcount += plen) {
Herbert Xue9d41162006-08-19 21:38:49 +10001090 ret = crypto_hash_update(desc, sg, plen);
1091 if (ret)
1092 goto out;
1093 }
1094 ret = crypto_hash_final(desc, out);
1095 if (ret)
1096 goto out;
1097
1098 end = get_cycles();
1099
1100 cycles += end - start;
1101 }
1102
1103out:
1104 local_irq_enable();
1105 local_bh_enable();
1106
1107 if (ret)
1108 return ret;
1109
1110 printk("%6lu cycles/operation, %4lu cycles/byte\n",
1111 cycles / 8, cycles / (8 * blen));
1112
1113 return 0;
1114}
1115
Herbert Xu01b32322008-07-31 15:41:55 +08001116static void test_hash_speed(const char *algo, unsigned int sec,
1117 struct hash_speed *speed)
Herbert Xue9d41162006-08-19 21:38:49 +10001118{
Herbert Xuf139cfa2008-07-31 12:23:53 +08001119 struct scatterlist sg[TVMEMSIZE];
Herbert Xue9d41162006-08-19 21:38:49 +10001120 struct crypto_hash *tfm;
1121 struct hash_desc desc;
Michal Ludvige8057922006-05-30 22:04:19 +10001122 char output[1024];
1123 int i;
Herbert Xue9d41162006-08-19 21:38:49 +10001124 int ret;
Michal Ludvige8057922006-05-30 22:04:19 +10001125
1126 printk("\ntesting speed of %s\n", algo);
1127
Herbert Xue9d41162006-08-19 21:38:49 +10001128 tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
Michal Ludvige8057922006-05-30 22:04:19 +10001129
Herbert Xue9d41162006-08-19 21:38:49 +10001130 if (IS_ERR(tfm)) {
1131 printk("failed to load transform for %s: %ld\n", algo,
1132 PTR_ERR(tfm));
Michal Ludvige8057922006-05-30 22:04:19 +10001133 return;
1134 }
1135
Herbert Xue9d41162006-08-19 21:38:49 +10001136 desc.tfm = tfm;
1137 desc.flags = 0;
1138
1139 if (crypto_hash_digestsize(tfm) > sizeof(output)) {
Michal Ludvige8057922006-05-30 22:04:19 +10001140 printk("digestsize(%u) > outputbuffer(%zu)\n",
Herbert Xue9d41162006-08-19 21:38:49 +10001141 crypto_hash_digestsize(tfm), sizeof(output));
Michal Ludvige8057922006-05-30 22:04:19 +10001142 goto out;
1143 }
1144
Herbert Xuf139cfa2008-07-31 12:23:53 +08001145 sg_init_table(sg, TVMEMSIZE);
1146 for (i = 0; i < TVMEMSIZE; i++) {
1147 sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
1148 memset(tvmem[i], 0xff, PAGE_SIZE);
1149 }
1150
Michal Ludvige8057922006-05-30 22:04:19 +10001151 for (i = 0; speed[i].blen != 0; i++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +08001152 if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
1153 printk("template (%u) too big for tvmem (%lu)\n",
1154 speed[i].blen, TVMEMSIZE * PAGE_SIZE);
Michal Ludvige8057922006-05-30 22:04:19 +10001155 goto out;
1156 }
1157
1158 printk("test%3u (%5u byte blocks,%5u bytes per update,%4u updates): ",
1159 i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
1160
Michal Ludvige8057922006-05-30 22:04:19 +10001161 if (sec)
Herbert Xuf139cfa2008-07-31 12:23:53 +08001162 ret = test_hash_jiffies(&desc, sg, speed[i].blen,
Herbert Xue9d41162006-08-19 21:38:49 +10001163 speed[i].plen, output, sec);
Michal Ludvige8057922006-05-30 22:04:19 +10001164 else
Herbert Xuf139cfa2008-07-31 12:23:53 +08001165 ret = test_hash_cycles(&desc, sg, speed[i].blen,
Herbert Xue9d41162006-08-19 21:38:49 +10001166 speed[i].plen, output);
1167
1168 if (ret) {
1169 printk("hashing failed ret=%d\n", ret);
1170 break;
1171 }
Michal Ludvige8057922006-05-30 22:04:19 +10001172 }
1173
1174out:
Herbert Xue9d41162006-08-19 21:38:49 +10001175 crypto_free_hash(tfm);
Michal Ludvige8057922006-05-30 22:04:19 +10001176}
1177
Herbert Xu01b32322008-07-31 15:41:55 +08001178static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
Herbert Xubdecd222008-07-31 14:03:44 +08001179 struct comp_testvec *dtemplate, int ctcount, int dtcount)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180{
Herbert Xu01b32322008-07-31 15:41:55 +08001181 const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182 unsigned int i;
1183 char result[COMP_BUF_SIZE];
Herbert Xubdecd222008-07-31 14:03:44 +08001184 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001185
Zoltan Sogor91755a92007-12-07 16:48:11 +08001186 for (i = 0; i < ctcount; i++) {
Herbert Xubdecd222008-07-31 14:03:44 +08001187 int ilen, dlen = COMP_BUF_SIZE;
Herbert Xuef2736f2005-06-22 13:26:03 -07001188
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189 memset(result, 0, sizeof (result));
1190
Sebastian Siewior562954d2008-03-13 20:20:28 +08001191 ilen = ctemplate[i].inlen;
1192 ret = crypto_comp_compress(tfm, ctemplate[i].input,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193 ilen, result, &dlen);
1194 if (ret) {
Herbert Xubdecd222008-07-31 14:03:44 +08001195 printk(KERN_ERR "alg: comp: compression failed "
1196 "on test %d for %s: ret=%d\n", i + 1, algo,
1197 -ret);
1198 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001199 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200
Herbert Xubdecd222008-07-31 14:03:44 +08001201 if (memcmp(result, ctemplate[i].output, dlen)) {
1202 printk(KERN_ERR "alg: comp: Compression test %d "
1203 "failed for %s\n", i + 1, algo);
1204 hexdump(result, dlen);
1205 ret = -EINVAL;
1206 goto out;
1207 }
1208 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001209
Zoltan Sogor91755a92007-12-07 16:48:11 +08001210 for (i = 0; i < dtcount; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001211 int ilen, ret, dlen = COMP_BUF_SIZE;
Herbert Xuef2736f2005-06-22 13:26:03 -07001212
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213 memset(result, 0, sizeof (result));
1214
Sebastian Siewior562954d2008-03-13 20:20:28 +08001215 ilen = dtemplate[i].inlen;
1216 ret = crypto_comp_decompress(tfm, dtemplate[i].input,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217 ilen, result, &dlen);
1218 if (ret) {
Herbert Xubdecd222008-07-31 14:03:44 +08001219 printk(KERN_ERR "alg: comp: decompression failed "
1220 "on test %d for %s: ret=%d\n", i + 1, algo,
1221 -ret);
1222 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001223 }
Herbert Xubdecd222008-07-31 14:03:44 +08001224
1225 if (memcmp(result, dtemplate[i].output, dlen)) {
1226 printk(KERN_ERR "alg: comp: Decompression test %d "
1227 "failed for %s\n", i + 1, algo);
1228 hexdump(result, dlen);
1229 ret = -EINVAL;
1230 goto out;
1231 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232 }
Herbert Xuf139cfa2008-07-31 12:23:53 +08001233
Herbert Xubdecd222008-07-31 14:03:44 +08001234 ret = 0;
1235
1236out:
Herbert Xubdecd222008-07-31 14:03:44 +08001237 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238}
1239
Herbert Xuef2736f2005-06-22 13:26:03 -07001240static void test_available(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241{
1242 char **name = check;
Herbert Xuef2736f2005-06-22 13:26:03 -07001243
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244 while (*name) {
1245 printk("alg %s ", *name);
Herbert Xu6158efc2007-04-04 17:41:07 +10001246 printk(crypto_has_alg(*name, 0, 0) ?
Herbert Xue4d5b792006-08-26 18:12:40 +10001247 "found\n" : "not found\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001248 name++;
Herbert Xuef2736f2005-06-22 13:26:03 -07001249 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001250}
1251
Herbert Xu01b32322008-07-31 15:41:55 +08001252static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
1253 u32 type, u32 mask)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001254{
Herbert Xu01b32322008-07-31 15:41:55 +08001255 struct crypto_aead *tfm;
1256 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001257
Herbert Xu01b32322008-07-31 15:41:55 +08001258 tfm = crypto_alloc_aead(driver, type, mask);
1259 if (IS_ERR(tfm)) {
1260 printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
1261 "%ld\n", driver, PTR_ERR(tfm));
1262 return PTR_ERR(tfm);
1263 }
1264
1265 if (desc->suite.aead.enc.vecs) {
1266 err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
1267 desc->suite.aead.enc.count);
1268 if (err)
1269 goto out;
1270 }
1271
1272 if (!err && desc->suite.aead.dec.vecs)
1273 err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
1274 desc->suite.aead.dec.count);
1275
1276out:
1277 crypto_free_aead(tfm);
1278 return err;
1279}
1280
1281static int alg_test_cipher(const struct alg_test_desc *desc,
1282 const char *driver, u32 type, u32 mask)
1283{
1284 struct crypto_ablkcipher *tfm;
1285 int err = 0;
1286
1287 tfm = crypto_alloc_ablkcipher(driver, type, mask);
1288 if (IS_ERR(tfm)) {
1289 printk(KERN_ERR "alg: cipher: Failed to load transform for "
1290 "%s: %ld\n", driver, PTR_ERR(tfm));
1291 return PTR_ERR(tfm);
1292 }
1293
1294 if (desc->suite.cipher.enc.vecs) {
1295 err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
1296 desc->suite.cipher.enc.count);
1297 if (err)
1298 goto out;
1299 }
1300
1301 if (desc->suite.cipher.dec.vecs)
1302 err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
1303 desc->suite.cipher.dec.count);
1304
1305out:
1306 crypto_free_ablkcipher(tfm);
1307 return err;
1308}
1309
1310static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
1311 u32 type, u32 mask)
1312{
1313 struct crypto_comp *tfm;
1314 int err;
1315
1316 tfm = crypto_alloc_comp(driver, type, mask);
1317 if (IS_ERR(tfm)) {
1318 printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1319 "%ld\n", driver, PTR_ERR(tfm));
1320 return PTR_ERR(tfm);
1321 }
1322
1323 err = test_comp(tfm, desc->suite.comp.comp.vecs,
1324 desc->suite.comp.decomp.vecs,
1325 desc->suite.comp.comp.count,
1326 desc->suite.comp.decomp.count);
1327
1328 crypto_free_comp(tfm);
1329 return err;
1330}
1331
1332static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
1333 u32 type, u32 mask)
1334{
1335 struct crypto_ahash *tfm;
1336 int err;
1337
1338 tfm = crypto_alloc_ahash(driver, type, mask);
1339 if (IS_ERR(tfm)) {
1340 printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
1341 "%ld\n", driver, PTR_ERR(tfm));
1342 return PTR_ERR(tfm);
1343 }
1344
1345 err = test_hash(tfm, desc->suite.hash.vecs, desc->suite.hash.count);
1346
1347 crypto_free_ahash(tfm);
1348 return err;
1349}
1350
1351/* Please keep this list sorted by algorithm name. */
1352static const struct alg_test_desc alg_test_descs[] = {
1353 {
1354 .alg = "cbc(aes)",
1355 .test = alg_test_cipher,
1356 .suite = {
1357 .cipher = {
1358 .enc = {
1359 .vecs = aes_cbc_enc_tv_template,
1360 .count = AES_CBC_ENC_TEST_VECTORS
1361 },
1362 .dec = {
1363 .vecs = aes_cbc_dec_tv_template,
1364 .count = AES_CBC_DEC_TEST_VECTORS
1365 }
1366 }
1367 }
1368 }, {
1369 .alg = "cbc(anubis)",
1370 .test = alg_test_cipher,
1371 .suite = {
1372 .cipher = {
1373 .enc = {
1374 .vecs = anubis_cbc_enc_tv_template,
1375 .count = ANUBIS_CBC_ENC_TEST_VECTORS
1376 },
1377 .dec = {
1378 .vecs = anubis_cbc_dec_tv_template,
1379 .count = ANUBIS_CBC_DEC_TEST_VECTORS
1380 }
1381 }
1382 }
1383 }, {
1384 .alg = "cbc(blowfish)",
1385 .test = alg_test_cipher,
1386 .suite = {
1387 .cipher = {
1388 .enc = {
1389 .vecs = bf_cbc_enc_tv_template,
1390 .count = BF_CBC_ENC_TEST_VECTORS
1391 },
1392 .dec = {
1393 .vecs = bf_cbc_dec_tv_template,
1394 .count = BF_CBC_DEC_TEST_VECTORS
1395 }
1396 }
1397 }
1398 }, {
1399 .alg = "cbc(camellia)",
1400 .test = alg_test_cipher,
1401 .suite = {
1402 .cipher = {
1403 .enc = {
1404 .vecs = camellia_cbc_enc_tv_template,
1405 .count = CAMELLIA_CBC_ENC_TEST_VECTORS
1406 },
1407 .dec = {
1408 .vecs = camellia_cbc_dec_tv_template,
1409 .count = CAMELLIA_CBC_DEC_TEST_VECTORS
1410 }
1411 }
1412 }
1413 }, {
1414 .alg = "cbc(des)",
1415 .test = alg_test_cipher,
1416 .suite = {
1417 .cipher = {
1418 .enc = {
1419 .vecs = des_cbc_enc_tv_template,
1420 .count = DES_CBC_ENC_TEST_VECTORS
1421 },
1422 .dec = {
1423 .vecs = des_cbc_dec_tv_template,
1424 .count = DES_CBC_DEC_TEST_VECTORS
1425 }
1426 }
1427 }
1428 }, {
1429 .alg = "cbc(des3_ede)",
1430 .test = alg_test_cipher,
1431 .suite = {
1432 .cipher = {
1433 .enc = {
1434 .vecs = des3_ede_cbc_enc_tv_template,
1435 .count = DES3_EDE_CBC_ENC_TEST_VECTORS
1436 },
1437 .dec = {
1438 .vecs = des3_ede_cbc_dec_tv_template,
1439 .count = DES3_EDE_CBC_DEC_TEST_VECTORS
1440 }
1441 }
1442 }
1443 }, {
1444 .alg = "cbc(twofish)",
1445 .test = alg_test_cipher,
1446 .suite = {
1447 .cipher = {
1448 .enc = {
1449 .vecs = tf_cbc_enc_tv_template,
1450 .count = TF_CBC_ENC_TEST_VECTORS
1451 },
1452 .dec = {
1453 .vecs = tf_cbc_dec_tv_template,
1454 .count = TF_CBC_DEC_TEST_VECTORS
1455 }
1456 }
1457 }
1458 }, {
1459 .alg = "ccm(aes)",
1460 .test = alg_test_aead,
1461 .suite = {
1462 .aead = {
1463 .enc = {
1464 .vecs = aes_ccm_enc_tv_template,
1465 .count = AES_CCM_ENC_TEST_VECTORS
1466 },
1467 .dec = {
1468 .vecs = aes_ccm_dec_tv_template,
1469 .count = AES_CCM_DEC_TEST_VECTORS
1470 }
1471 }
1472 }
1473 }, {
1474 .alg = "crc32c",
1475 .test = alg_test_hash,
1476 .suite = {
1477 .hash = {
1478 .vecs = crc32c_tv_template,
1479 .count = CRC32C_TEST_VECTORS
1480 }
1481 }
1482 }, {
1483 .alg = "cts(cbc(aes))",
1484 .test = alg_test_cipher,
1485 .suite = {
1486 .cipher = {
1487 .enc = {
1488 .vecs = cts_mode_enc_tv_template,
1489 .count = CTS_MODE_ENC_TEST_VECTORS
1490 },
1491 .dec = {
1492 .vecs = cts_mode_dec_tv_template,
1493 .count = CTS_MODE_DEC_TEST_VECTORS
1494 }
1495 }
1496 }
1497 }, {
1498 .alg = "deflate",
1499 .test = alg_test_comp,
1500 .suite = {
1501 .comp = {
1502 .comp = {
1503 .vecs = deflate_comp_tv_template,
1504 .count = DEFLATE_COMP_TEST_VECTORS
1505 },
1506 .decomp = {
1507 .vecs = deflate_decomp_tv_template,
1508 .count = DEFLATE_DECOMP_TEST_VECTORS
1509 }
1510 }
1511 }
1512 }, {
1513 .alg = "ecb(aes)",
1514 .test = alg_test_cipher,
1515 .suite = {
1516 .cipher = {
1517 .enc = {
1518 .vecs = aes_enc_tv_template,
1519 .count = AES_ENC_TEST_VECTORS
1520 },
1521 .dec = {
1522 .vecs = aes_dec_tv_template,
1523 .count = AES_DEC_TEST_VECTORS
1524 }
1525 }
1526 }
1527 }, {
1528 .alg = "ecb(anubis)",
1529 .test = alg_test_cipher,
1530 .suite = {
1531 .cipher = {
1532 .enc = {
1533 .vecs = anubis_enc_tv_template,
1534 .count = ANUBIS_ENC_TEST_VECTORS
1535 },
1536 .dec = {
1537 .vecs = anubis_dec_tv_template,
1538 .count = ANUBIS_DEC_TEST_VECTORS
1539 }
1540 }
1541 }
1542 }, {
1543 .alg = "ecb(arc4)",
1544 .test = alg_test_cipher,
1545 .suite = {
1546 .cipher = {
1547 .enc = {
1548 .vecs = arc4_enc_tv_template,
1549 .count = ARC4_ENC_TEST_VECTORS
1550 },
1551 .dec = {
1552 .vecs = arc4_dec_tv_template,
1553 .count = ARC4_DEC_TEST_VECTORS
1554 }
1555 }
1556 }
1557 }, {
1558 .alg = "ecb(blowfish)",
1559 .test = alg_test_cipher,
1560 .suite = {
1561 .cipher = {
1562 .enc = {
1563 .vecs = bf_enc_tv_template,
1564 .count = BF_ENC_TEST_VECTORS
1565 },
1566 .dec = {
1567 .vecs = bf_dec_tv_template,
1568 .count = BF_DEC_TEST_VECTORS
1569 }
1570 }
1571 }
1572 }, {
1573 .alg = "ecb(camellia)",
1574 .test = alg_test_cipher,
1575 .suite = {
1576 .cipher = {
1577 .enc = {
1578 .vecs = camellia_enc_tv_template,
1579 .count = CAMELLIA_ENC_TEST_VECTORS
1580 },
1581 .dec = {
1582 .vecs = camellia_dec_tv_template,
1583 .count = CAMELLIA_DEC_TEST_VECTORS
1584 }
1585 }
1586 }
1587 }, {
1588 .alg = "ecb(cast5)",
1589 .test = alg_test_cipher,
1590 .suite = {
1591 .cipher = {
1592 .enc = {
1593 .vecs = cast5_enc_tv_template,
1594 .count = CAST5_ENC_TEST_VECTORS
1595 },
1596 .dec = {
1597 .vecs = cast5_dec_tv_template,
1598 .count = CAST5_DEC_TEST_VECTORS
1599 }
1600 }
1601 }
1602 }, {
1603 .alg = "ecb(cast6)",
1604 .test = alg_test_cipher,
1605 .suite = {
1606 .cipher = {
1607 .enc = {
1608 .vecs = cast6_enc_tv_template,
1609 .count = CAST6_ENC_TEST_VECTORS
1610 },
1611 .dec = {
1612 .vecs = cast6_dec_tv_template,
1613 .count = CAST6_DEC_TEST_VECTORS
1614 }
1615 }
1616 }
1617 }, {
1618 .alg = "ecb(des)",
1619 .test = alg_test_cipher,
1620 .suite = {
1621 .cipher = {
1622 .enc = {
1623 .vecs = des_enc_tv_template,
1624 .count = DES_ENC_TEST_VECTORS
1625 },
1626 .dec = {
1627 .vecs = des_dec_tv_template,
1628 .count = DES_DEC_TEST_VECTORS
1629 }
1630 }
1631 }
1632 }, {
1633 .alg = "ecb(des3_ede)",
1634 .test = alg_test_cipher,
1635 .suite = {
1636 .cipher = {
1637 .enc = {
1638 .vecs = des3_ede_enc_tv_template,
1639 .count = DES3_EDE_ENC_TEST_VECTORS
1640 },
1641 .dec = {
1642 .vecs = des3_ede_dec_tv_template,
1643 .count = DES3_EDE_DEC_TEST_VECTORS
1644 }
1645 }
1646 }
1647 }, {
1648 .alg = "ecb(khazad)",
1649 .test = alg_test_cipher,
1650 .suite = {
1651 .cipher = {
1652 .enc = {
1653 .vecs = khazad_enc_tv_template,
1654 .count = KHAZAD_ENC_TEST_VECTORS
1655 },
1656 .dec = {
1657 .vecs = khazad_dec_tv_template,
1658 .count = KHAZAD_DEC_TEST_VECTORS
1659 }
1660 }
1661 }
1662 }, {
1663 .alg = "ecb(seed)",
1664 .test = alg_test_cipher,
1665 .suite = {
1666 .cipher = {
1667 .enc = {
1668 .vecs = seed_enc_tv_template,
1669 .count = SEED_ENC_TEST_VECTORS
1670 },
1671 .dec = {
1672 .vecs = seed_dec_tv_template,
1673 .count = SEED_DEC_TEST_VECTORS
1674 }
1675 }
1676 }
1677 }, {
1678 .alg = "ecb(serpent)",
1679 .test = alg_test_cipher,
1680 .suite = {
1681 .cipher = {
1682 .enc = {
1683 .vecs = serpent_enc_tv_template,
1684 .count = SERPENT_ENC_TEST_VECTORS
1685 },
1686 .dec = {
1687 .vecs = serpent_dec_tv_template,
1688 .count = SERPENT_DEC_TEST_VECTORS
1689 }
1690 }
1691 }
1692 }, {
1693 .alg = "ecb(tea)",
1694 .test = alg_test_cipher,
1695 .suite = {
1696 .cipher = {
1697 .enc = {
1698 .vecs = tea_enc_tv_template,
1699 .count = TEA_ENC_TEST_VECTORS
1700 },
1701 .dec = {
1702 .vecs = tea_dec_tv_template,
1703 .count = TEA_DEC_TEST_VECTORS
1704 }
1705 }
1706 }
1707 }, {
1708 .alg = "ecb(tnepres)",
1709 .test = alg_test_cipher,
1710 .suite = {
1711 .cipher = {
1712 .enc = {
1713 .vecs = tnepres_enc_tv_template,
1714 .count = TNEPRES_ENC_TEST_VECTORS
1715 },
1716 .dec = {
1717 .vecs = tnepres_dec_tv_template,
1718 .count = TNEPRES_DEC_TEST_VECTORS
1719 }
1720 }
1721 }
1722 }, {
1723 .alg = "ecb(twofish)",
1724 .test = alg_test_cipher,
1725 .suite = {
1726 .cipher = {
1727 .enc = {
1728 .vecs = tf_enc_tv_template,
1729 .count = TF_ENC_TEST_VECTORS
1730 },
1731 .dec = {
1732 .vecs = tf_dec_tv_template,
1733 .count = TF_DEC_TEST_VECTORS
1734 }
1735 }
1736 }
1737 }, {
1738 .alg = "ecb(xeta)",
1739 .test = alg_test_cipher,
1740 .suite = {
1741 .cipher = {
1742 .enc = {
1743 .vecs = xeta_enc_tv_template,
1744 .count = XETA_ENC_TEST_VECTORS
1745 },
1746 .dec = {
1747 .vecs = xeta_dec_tv_template,
1748 .count = XETA_DEC_TEST_VECTORS
1749 }
1750 }
1751 }
1752 }, {
1753 .alg = "ecb(xtea)",
1754 .test = alg_test_cipher,
1755 .suite = {
1756 .cipher = {
1757 .enc = {
1758 .vecs = xtea_enc_tv_template,
1759 .count = XTEA_ENC_TEST_VECTORS
1760 },
1761 .dec = {
1762 .vecs = xtea_dec_tv_template,
1763 .count = XTEA_DEC_TEST_VECTORS
1764 }
1765 }
1766 }
1767 }, {
1768 .alg = "gcm(aes)",
1769 .test = alg_test_aead,
1770 .suite = {
1771 .aead = {
1772 .enc = {
1773 .vecs = aes_gcm_enc_tv_template,
1774 .count = AES_GCM_ENC_TEST_VECTORS
1775 },
1776 .dec = {
1777 .vecs = aes_gcm_dec_tv_template,
1778 .count = AES_GCM_DEC_TEST_VECTORS
1779 }
1780 }
1781 }
1782 }, {
1783 .alg = "hmac(md5)",
1784 .test = alg_test_hash,
1785 .suite = {
1786 .hash = {
1787 .vecs = hmac_md5_tv_template,
1788 .count = HMAC_MD5_TEST_VECTORS
1789 }
1790 }
1791 }, {
1792 .alg = "hmac(rmd128)",
1793 .test = alg_test_hash,
1794 .suite = {
1795 .hash = {
1796 .vecs = hmac_rmd128_tv_template,
1797 .count = HMAC_RMD128_TEST_VECTORS
1798 }
1799 }
1800 }, {
1801 .alg = "hmac(rmd160)",
1802 .test = alg_test_hash,
1803 .suite = {
1804 .hash = {
1805 .vecs = hmac_rmd160_tv_template,
1806 .count = HMAC_RMD160_TEST_VECTORS
1807 }
1808 }
1809 }, {
1810 .alg = "hmac(sha1)",
1811 .test = alg_test_hash,
1812 .suite = {
1813 .hash = {
1814 .vecs = hmac_sha1_tv_template,
1815 .count = HMAC_SHA1_TEST_VECTORS
1816 }
1817 }
1818 }, {
1819 .alg = "hmac(sha224)",
1820 .test = alg_test_hash,
1821 .suite = {
1822 .hash = {
1823 .vecs = hmac_sha224_tv_template,
1824 .count = HMAC_SHA224_TEST_VECTORS
1825 }
1826 }
1827 }, {
1828 .alg = "hmac(sha256)",
1829 .test = alg_test_hash,
1830 .suite = {
1831 .hash = {
1832 .vecs = hmac_sha256_tv_template,
1833 .count = HMAC_SHA256_TEST_VECTORS
1834 }
1835 }
1836 }, {
1837 .alg = "hmac(sha384)",
1838 .test = alg_test_hash,
1839 .suite = {
1840 .hash = {
1841 .vecs = hmac_sha384_tv_template,
1842 .count = HMAC_SHA384_TEST_VECTORS
1843 }
1844 }
1845 }, {
1846 .alg = "hmac(sha512)",
1847 .test = alg_test_hash,
1848 .suite = {
1849 .hash = {
1850 .vecs = hmac_sha512_tv_template,
1851 .count = HMAC_SHA512_TEST_VECTORS
1852 }
1853 }
1854 }, {
1855 .alg = "lrw(aes)",
1856 .test = alg_test_cipher,
1857 .suite = {
1858 .cipher = {
1859 .enc = {
1860 .vecs = aes_lrw_enc_tv_template,
1861 .count = AES_LRW_ENC_TEST_VECTORS
1862 },
1863 .dec = {
1864 .vecs = aes_lrw_dec_tv_template,
1865 .count = AES_LRW_DEC_TEST_VECTORS
1866 }
1867 }
1868 }
1869 }, {
1870 .alg = "lzo",
1871 .test = alg_test_comp,
1872 .suite = {
1873 .comp = {
1874 .comp = {
1875 .vecs = lzo_comp_tv_template,
1876 .count = LZO_COMP_TEST_VECTORS
1877 },
1878 .decomp = {
1879 .vecs = lzo_decomp_tv_template,
1880 .count = LZO_DECOMP_TEST_VECTORS
1881 }
1882 }
1883 }
1884 }, {
1885 .alg = "md4",
1886 .test = alg_test_hash,
1887 .suite = {
1888 .hash = {
1889 .vecs = md4_tv_template,
1890 .count = MD4_TEST_VECTORS
1891 }
1892 }
1893 }, {
1894 .alg = "md5",
1895 .test = alg_test_hash,
1896 .suite = {
1897 .hash = {
1898 .vecs = md5_tv_template,
1899 .count = MD5_TEST_VECTORS
1900 }
1901 }
1902 }, {
1903 .alg = "michael_mic",
1904 .test = alg_test_hash,
1905 .suite = {
1906 .hash = {
1907 .vecs = michael_mic_tv_template,
1908 .count = MICHAEL_MIC_TEST_VECTORS
1909 }
1910 }
1911 }, {
1912 .alg = "pcbc(fcrypt)",
1913 .test = alg_test_cipher,
1914 .suite = {
1915 .cipher = {
1916 .enc = {
1917 .vecs = fcrypt_pcbc_enc_tv_template,
1918 .count = FCRYPT_ENC_TEST_VECTORS
1919 },
1920 .dec = {
1921 .vecs = fcrypt_pcbc_dec_tv_template,
1922 .count = FCRYPT_DEC_TEST_VECTORS
1923 }
1924 }
1925 }
1926 }, {
1927 .alg = "rfc3686(ctr(aes))",
1928 .test = alg_test_cipher,
1929 .suite = {
1930 .cipher = {
1931 .enc = {
1932 .vecs = aes_ctr_enc_tv_template,
1933 .count = AES_CTR_ENC_TEST_VECTORS
1934 },
1935 .dec = {
1936 .vecs = aes_ctr_dec_tv_template,
1937 .count = AES_CTR_DEC_TEST_VECTORS
1938 }
1939 }
1940 }
1941 }, {
1942 .alg = "rmd128",
1943 .test = alg_test_hash,
1944 .suite = {
1945 .hash = {
1946 .vecs = rmd128_tv_template,
1947 .count = RMD128_TEST_VECTORS
1948 }
1949 }
1950 }, {
1951 .alg = "rmd160",
1952 .test = alg_test_hash,
1953 .suite = {
1954 .hash = {
1955 .vecs = rmd160_tv_template,
1956 .count = RMD160_TEST_VECTORS
1957 }
1958 }
1959 }, {
1960 .alg = "rmd256",
1961 .test = alg_test_hash,
1962 .suite = {
1963 .hash = {
1964 .vecs = rmd256_tv_template,
1965 .count = RMD256_TEST_VECTORS
1966 }
1967 }
1968 }, {
1969 .alg = "rmd320",
1970 .test = alg_test_hash,
1971 .suite = {
1972 .hash = {
1973 .vecs = rmd320_tv_template,
1974 .count = RMD320_TEST_VECTORS
1975 }
1976 }
1977 }, {
1978 .alg = "salsa20",
1979 .test = alg_test_cipher,
1980 .suite = {
1981 .cipher = {
1982 .enc = {
1983 .vecs = salsa20_stream_enc_tv_template,
1984 .count = SALSA20_STREAM_ENC_TEST_VECTORS
1985 }
1986 }
1987 }
1988 }, {
1989 .alg = "sha1",
1990 .test = alg_test_hash,
1991 .suite = {
1992 .hash = {
1993 .vecs = sha1_tv_template,
1994 .count = SHA1_TEST_VECTORS
1995 }
1996 }
1997 }, {
1998 .alg = "sha224",
1999 .test = alg_test_hash,
2000 .suite = {
2001 .hash = {
2002 .vecs = sha224_tv_template,
2003 .count = SHA224_TEST_VECTORS
2004 }
2005 }
2006 }, {
2007 .alg = "sha256",
2008 .test = alg_test_hash,
2009 .suite = {
2010 .hash = {
2011 .vecs = sha256_tv_template,
2012 .count = SHA256_TEST_VECTORS
2013 }
2014 }
2015 }, {
2016 .alg = "sha384",
2017 .test = alg_test_hash,
2018 .suite = {
2019 .hash = {
2020 .vecs = sha384_tv_template,
2021 .count = SHA384_TEST_VECTORS
2022 }
2023 }
2024 }, {
2025 .alg = "sha512",
2026 .test = alg_test_hash,
2027 .suite = {
2028 .hash = {
2029 .vecs = sha512_tv_template,
2030 .count = SHA512_TEST_VECTORS
2031 }
2032 }
2033 }, {
2034 .alg = "tgr128",
2035 .test = alg_test_hash,
2036 .suite = {
2037 .hash = {
2038 .vecs = tgr128_tv_template,
2039 .count = TGR128_TEST_VECTORS
2040 }
2041 }
2042 }, {
2043 .alg = "tgr160",
2044 .test = alg_test_hash,
2045 .suite = {
2046 .hash = {
2047 .vecs = tgr160_tv_template,
2048 .count = TGR160_TEST_VECTORS
2049 }
2050 }
2051 }, {
2052 .alg = "tgr192",
2053 .test = alg_test_hash,
2054 .suite = {
2055 .hash = {
2056 .vecs = tgr192_tv_template,
2057 .count = TGR192_TEST_VECTORS
2058 }
2059 }
2060 }, {
2061 .alg = "wp256",
2062 .test = alg_test_hash,
2063 .suite = {
2064 .hash = {
2065 .vecs = wp256_tv_template,
2066 .count = WP256_TEST_VECTORS
2067 }
2068 }
2069 }, {
2070 .alg = "wp384",
2071 .test = alg_test_hash,
2072 .suite = {
2073 .hash = {
2074 .vecs = wp384_tv_template,
2075 .count = WP384_TEST_VECTORS
2076 }
2077 }
2078 }, {
2079 .alg = "wp512",
2080 .test = alg_test_hash,
2081 .suite = {
2082 .hash = {
2083 .vecs = wp512_tv_template,
2084 .count = WP512_TEST_VECTORS
2085 }
2086 }
2087 }, {
2088 .alg = "xcbc(aes)",
2089 .test = alg_test_hash,
2090 .suite = {
2091 .hash = {
2092 .vecs = aes_xcbc128_tv_template,
2093 .count = XCBC_AES_TEST_VECTORS
2094 }
2095 }
2096 }, {
2097 .alg = "xts(aes)",
2098 .test = alg_test_cipher,
2099 .suite = {
2100 .cipher = {
2101 .enc = {
2102 .vecs = aes_xts_enc_tv_template,
2103 .count = AES_XTS_ENC_TEST_VECTORS
2104 },
2105 .dec = {
2106 .vecs = aes_xts_dec_tv_template,
2107 .count = AES_XTS_DEC_TEST_VECTORS
2108 }
2109 }
2110 }
2111 }
2112};
2113
2114static int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
2115{
2116 int start = 0;
2117 int end = ARRAY_SIZE(alg_test_descs);
2118
2119 while (start < end) {
2120 int i = (start + end) / 2;
2121 int diff = strcmp(alg_test_descs[i].alg, alg);
2122
2123 if (diff > 0) {
2124 end = i;
2125 continue;
2126 }
2127
2128 if (diff < 0) {
2129 start = i + 1;
2130 continue;
2131 }
2132
2133 return alg_test_descs[i].test(alg_test_descs + i, driver,
2134 type, mask);
2135 }
2136
2137 printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
2138 return 0;
2139}
2140
2141static inline int tcrypt_test(const char *alg)
2142{
2143 return alg_test(alg, alg, 0, 0);
2144}
2145
2146static void do_test(int m)
2147{
2148 int i;
2149
2150 switch (m) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 case 0:
Herbert Xu01b32322008-07-31 15:41:55 +08002152 for (i = 1; i < 200; i++)
2153 do_test(i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002154 break;
2155
2156 case 1:
Herbert Xu01b32322008-07-31 15:41:55 +08002157 tcrypt_test("md5");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002158 break;
2159
2160 case 2:
Herbert Xu01b32322008-07-31 15:41:55 +08002161 tcrypt_test("sha1");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002162 break;
2163
2164 case 3:
Herbert Xu01b32322008-07-31 15:41:55 +08002165 tcrypt_test("ecb(des)");
2166 tcrypt_test("cbc(des)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002167 break;
2168
2169 case 4:
Herbert Xu01b32322008-07-31 15:41:55 +08002170 tcrypt_test("ecb(des3_ede)");
2171 tcrypt_test("cbc(des3_ede)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172 break;
2173
2174 case 5:
Herbert Xu01b32322008-07-31 15:41:55 +08002175 tcrypt_test("md4");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002176 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07002177
Linus Torvalds1da177e2005-04-16 15:20:36 -07002178 case 6:
Herbert Xu01b32322008-07-31 15:41:55 +08002179 tcrypt_test("sha256");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002180 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07002181
Linus Torvalds1da177e2005-04-16 15:20:36 -07002182 case 7:
Herbert Xu01b32322008-07-31 15:41:55 +08002183 tcrypt_test("ecb(blowfish)");
2184 tcrypt_test("cbc(blowfish)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002185 break;
2186
2187 case 8:
Herbert Xu01b32322008-07-31 15:41:55 +08002188 tcrypt_test("ecb(twofish)");
2189 tcrypt_test("cbc(twofish)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002190 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07002191
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192 case 9:
Herbert Xu01b32322008-07-31 15:41:55 +08002193 tcrypt_test("ecb(serpent)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002194 break;
2195
2196 case 10:
Herbert Xu01b32322008-07-31 15:41:55 +08002197 tcrypt_test("ecb(aes)");
2198 tcrypt_test("cbc(aes)");
2199 tcrypt_test("lrw(aes)");
2200 tcrypt_test("xts(aes)");
2201 tcrypt_test("rfc3686(ctr(aes))");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002202 break;
2203
2204 case 11:
Herbert Xu01b32322008-07-31 15:41:55 +08002205 tcrypt_test("sha384");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07002207
Linus Torvalds1da177e2005-04-16 15:20:36 -07002208 case 12:
Herbert Xu01b32322008-07-31 15:41:55 +08002209 tcrypt_test("sha512");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002210 break;
2211
2212 case 13:
Herbert Xu01b32322008-07-31 15:41:55 +08002213 tcrypt_test("deflate");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002214 break;
2215
2216 case 14:
Herbert Xu01b32322008-07-31 15:41:55 +08002217 tcrypt_test("ecb(cast5)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002218 break;
2219
2220 case 15:
Herbert Xu01b32322008-07-31 15:41:55 +08002221 tcrypt_test("ecb(cast6)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002222 break;
2223
2224 case 16:
Herbert Xu01b32322008-07-31 15:41:55 +08002225 tcrypt_test("ecb(arc4)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002226 break;
2227
2228 case 17:
Herbert Xu01b32322008-07-31 15:41:55 +08002229 tcrypt_test("michael_mic");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002230 break;
2231
2232 case 18:
Herbert Xu01b32322008-07-31 15:41:55 +08002233 tcrypt_test("crc32c");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002234 break;
2235
2236 case 19:
Herbert Xu01b32322008-07-31 15:41:55 +08002237 tcrypt_test("ecb(tea)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002238 break;
2239
2240 case 20:
Herbert Xu01b32322008-07-31 15:41:55 +08002241 tcrypt_test("ecb(xtea)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002242 break;
2243
2244 case 21:
Herbert Xu01b32322008-07-31 15:41:55 +08002245 tcrypt_test("ecb(khazad)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002246 break;
2247
2248 case 22:
Herbert Xu01b32322008-07-31 15:41:55 +08002249 tcrypt_test("wp512");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250 break;
2251
2252 case 23:
Herbert Xu01b32322008-07-31 15:41:55 +08002253 tcrypt_test("wp384");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002254 break;
2255
2256 case 24:
Herbert Xu01b32322008-07-31 15:41:55 +08002257 tcrypt_test("wp256");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002258 break;
2259
2260 case 25:
Herbert Xu01b32322008-07-31 15:41:55 +08002261 tcrypt_test("ecb(tnepres)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002262 break;
2263
2264 case 26:
Herbert Xu01b32322008-07-31 15:41:55 +08002265 tcrypt_test("ecb(anubis)");
2266 tcrypt_test("cbc(anubis)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002267 break;
2268
2269 case 27:
Herbert Xu01b32322008-07-31 15:41:55 +08002270 tcrypt_test("tgr192");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002271 break;
2272
2273 case 28:
2274
Herbert Xu01b32322008-07-31 15:41:55 +08002275 tcrypt_test("tgr160");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002276 break;
2277
2278 case 29:
Herbert Xu01b32322008-07-31 15:41:55 +08002279 tcrypt_test("tgr128");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002280 break;
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08002281
Aaron Grothefb4f10e2005-09-01 17:42:46 -07002282 case 30:
Herbert Xu01b32322008-07-31 15:41:55 +08002283 tcrypt_test("ecb(xeta)");
Aaron Grothefb4f10e2005-09-01 17:42:46 -07002284 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002285
David Howells90831632006-12-16 12:13:14 +11002286 case 31:
Herbert Xu01b32322008-07-31 15:41:55 +08002287 tcrypt_test("pcbc(fcrypt)");
David Howells90831632006-12-16 12:13:14 +11002288 break;
2289
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11002290 case 32:
Herbert Xu01b32322008-07-31 15:41:55 +08002291 tcrypt_test("ecb(camellia)");
2292 tcrypt_test("cbc(camellia)");
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11002293 break;
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08002294 case 33:
Herbert Xu01b32322008-07-31 15:41:55 +08002295 tcrypt_test("sha224");
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08002296 break;
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11002297
Tan Swee Heng2407d602007-11-23 19:45:00 +08002298 case 34:
Herbert Xu01b32322008-07-31 15:41:55 +08002299 tcrypt_test("salsa20");
Tan Swee Heng2407d602007-11-23 19:45:00 +08002300 break;
2301
Herbert Xu8df213d2007-12-02 14:55:47 +11002302 case 35:
Herbert Xu01b32322008-07-31 15:41:55 +08002303 tcrypt_test("gcm(aes)");
Herbert Xu8df213d2007-12-02 14:55:47 +11002304 break;
2305
Zoltan Sogor0b77abb2007-12-07 16:53:23 +08002306 case 36:
Herbert Xu01b32322008-07-31 15:41:55 +08002307 tcrypt_test("lzo");
Zoltan Sogor0b77abb2007-12-07 16:53:23 +08002308 break;
2309
Joy Latten93cc74e2007-12-12 20:24:22 +08002310 case 37:
Herbert Xu01b32322008-07-31 15:41:55 +08002311 tcrypt_test("ccm(aes)");
Joy Latten93cc74e2007-12-12 20:24:22 +08002312 break;
2313
Kevin Coffman76cb9522008-03-24 21:26:16 +08002314 case 38:
Herbert Xu01b32322008-07-31 15:41:55 +08002315 tcrypt_test("cts(cbc(aes))");
Kevin Coffman76cb9522008-03-24 21:26:16 +08002316 break;
2317
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08002318 case 39:
Herbert Xu01b32322008-07-31 15:41:55 +08002319 tcrypt_test("rmd128");
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08002320 break;
2321
2322 case 40:
Herbert Xu01b32322008-07-31 15:41:55 +08002323 tcrypt_test("rmd160");
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08002324 break;
2325
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08002326 case 41:
Herbert Xu01b32322008-07-31 15:41:55 +08002327 tcrypt_test("rmd256");
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08002328 break;
2329
2330 case 42:
Herbert Xu01b32322008-07-31 15:41:55 +08002331 tcrypt_test("rmd320");
2332 break;
2333
2334 case 43:
2335 tcrypt_test("ecb(seed)");
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08002336 break;
2337
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338 case 100:
Herbert Xu01b32322008-07-31 15:41:55 +08002339 tcrypt_test("hmac(md5)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002340 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07002341
Linus Torvalds1da177e2005-04-16 15:20:36 -07002342 case 101:
Herbert Xu01b32322008-07-31 15:41:55 +08002343 tcrypt_test("hmac(sha1)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002344 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07002345
Linus Torvalds1da177e2005-04-16 15:20:36 -07002346 case 102:
Herbert Xu01b32322008-07-31 15:41:55 +08002347 tcrypt_test("hmac(sha256)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002348 break;
2349
Andrew Donofrioa28091a2006-12-10 12:10:20 +11002350 case 103:
Herbert Xu01b32322008-07-31 15:41:55 +08002351 tcrypt_test("hmac(sha384)");
Andrew Donofrioa28091a2006-12-10 12:10:20 +11002352 break;
2353
2354 case 104:
Herbert Xu01b32322008-07-31 15:41:55 +08002355 tcrypt_test("hmac(sha512)");
Andrew Donofrioa28091a2006-12-10 12:10:20 +11002356 break;
Herbert Xu38ed9ab2008-01-01 15:59:28 +11002357
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08002358 case 105:
Herbert Xu01b32322008-07-31 15:41:55 +08002359 tcrypt_test("hmac(sha224)");
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08002360 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002361
Herbert Xu38ed9ab2008-01-01 15:59:28 +11002362 case 106:
Herbert Xu01b32322008-07-31 15:41:55 +08002363 tcrypt_test("xcbc(aes)");
Herbert Xu38ed9ab2008-01-01 15:59:28 +11002364 break;
2365
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08002366 case 107:
Herbert Xu01b32322008-07-31 15:41:55 +08002367 tcrypt_test("hmac(rmd128)");
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08002368 break;
2369
2370 case 108:
Herbert Xu01b32322008-07-31 15:41:55 +08002371 tcrypt_test("hmac(rmd160)");
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08002372 break;
2373
Harald Welteebfd9bc2005-06-22 13:27:23 -07002374 case 200:
Herbert Xucba83562006-08-13 08:26:09 +10002375 test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002376 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10002377 test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002378 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10002379 test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002380 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10002381 test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002382 speed_template_16_24_32);
Rik Snelf3d10442006-11-29 19:01:41 +11002383 test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002384 speed_template_32_40_48);
Rik Snelf3d10442006-11-29 19:01:41 +11002385 test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002386 speed_template_32_40_48);
Rik Snelf19f5112007-09-19 20:23:13 +08002387 test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002388 speed_template_32_48_64);
Rik Snelf19f5112007-09-19 20:23:13 +08002389 test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002390 speed_template_32_48_64);
Harald Welteebfd9bc2005-06-22 13:27:23 -07002391 break;
2392
2393 case 201:
Herbert Xucba83562006-08-13 08:26:09 +10002394 test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002395 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
2396 speed_template_24);
Herbert Xucba83562006-08-13 08:26:09 +10002397 test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002398 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
2399 speed_template_24);
Herbert Xucba83562006-08-13 08:26:09 +10002400 test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002401 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
2402 speed_template_24);
Herbert Xucba83562006-08-13 08:26:09 +10002403 test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002404 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
2405 speed_template_24);
Harald Welteebfd9bc2005-06-22 13:27:23 -07002406 break;
2407
2408 case 202:
Herbert Xucba83562006-08-13 08:26:09 +10002409 test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002410 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10002411 test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002412 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10002413 test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002414 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10002415 test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002416 speed_template_16_24_32);
Harald Welteebfd9bc2005-06-22 13:27:23 -07002417 break;
2418
2419 case 203:
Herbert Xucba83562006-08-13 08:26:09 +10002420 test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002421 speed_template_8_32);
Herbert Xucba83562006-08-13 08:26:09 +10002422 test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002423 speed_template_8_32);
Herbert Xucba83562006-08-13 08:26:09 +10002424 test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002425 speed_template_8_32);
Herbert Xucba83562006-08-13 08:26:09 +10002426 test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002427 speed_template_8_32);
Harald Welteebfd9bc2005-06-22 13:27:23 -07002428 break;
2429
2430 case 204:
Herbert Xucba83562006-08-13 08:26:09 +10002431 test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002432 speed_template_8);
Herbert Xucba83562006-08-13 08:26:09 +10002433 test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002434 speed_template_8);
Herbert Xucba83562006-08-13 08:26:09 +10002435 test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002436 speed_template_8);
Herbert Xucba83562006-08-13 08:26:09 +10002437 test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002438 speed_template_8);
Harald Welteebfd9bc2005-06-22 13:27:23 -07002439 break;
2440
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11002441 case 205:
2442 test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002443 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11002444 test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002445 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11002446 test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002447 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11002448 test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002449 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11002450 break;
2451
Tan Swee Heng5de8f1b2007-12-07 17:17:43 +08002452 case 206:
2453 test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08002454 speed_template_16_32);
Tan Swee Heng5de8f1b2007-12-07 17:17:43 +08002455 break;
2456
Michal Ludvige8057922006-05-30 22:04:19 +10002457 case 300:
2458 /* fall through */
2459
2460 case 301:
Herbert Xue9d41162006-08-19 21:38:49 +10002461 test_hash_speed("md4", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10002462 if (mode > 300 && mode < 400) break;
2463
2464 case 302:
Herbert Xue9d41162006-08-19 21:38:49 +10002465 test_hash_speed("md5", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10002466 if (mode > 300 && mode < 400) break;
2467
2468 case 303:
Herbert Xue9d41162006-08-19 21:38:49 +10002469 test_hash_speed("sha1", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10002470 if (mode > 300 && mode < 400) break;
2471
2472 case 304:
Herbert Xue9d41162006-08-19 21:38:49 +10002473 test_hash_speed("sha256", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10002474 if (mode > 300 && mode < 400) break;
2475
2476 case 305:
Herbert Xue9d41162006-08-19 21:38:49 +10002477 test_hash_speed("sha384", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10002478 if (mode > 300 && mode < 400) break;
2479
2480 case 306:
Herbert Xue9d41162006-08-19 21:38:49 +10002481 test_hash_speed("sha512", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10002482 if (mode > 300 && mode < 400) break;
2483
2484 case 307:
Herbert Xue9d41162006-08-19 21:38:49 +10002485 test_hash_speed("wp256", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10002486 if (mode > 300 && mode < 400) break;
2487
2488 case 308:
Herbert Xue9d41162006-08-19 21:38:49 +10002489 test_hash_speed("wp384", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10002490 if (mode > 300 && mode < 400) break;
2491
2492 case 309:
Herbert Xue9d41162006-08-19 21:38:49 +10002493 test_hash_speed("wp512", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10002494 if (mode > 300 && mode < 400) break;
2495
2496 case 310:
Herbert Xue9d41162006-08-19 21:38:49 +10002497 test_hash_speed("tgr128", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10002498 if (mode > 300 && mode < 400) break;
2499
2500 case 311:
Herbert Xue9d41162006-08-19 21:38:49 +10002501 test_hash_speed("tgr160", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10002502 if (mode > 300 && mode < 400) break;
2503
2504 case 312:
Herbert Xue9d41162006-08-19 21:38:49 +10002505 test_hash_speed("tgr192", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10002506 if (mode > 300 && mode < 400) break;
2507
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08002508 case 313:
2509 test_hash_speed("sha224", sec, generic_hash_speed_template);
2510 if (mode > 300 && mode < 400) break;
2511
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08002512 case 314:
2513 test_hash_speed("rmd128", sec, generic_hash_speed_template);
2514 if (mode > 300 && mode < 400) break;
2515
2516 case 315:
2517 test_hash_speed("rmd160", sec, generic_hash_speed_template);
2518 if (mode > 300 && mode < 400) break;
2519
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08002520 case 316:
2521 test_hash_speed("rmd256", sec, generic_hash_speed_template);
2522 if (mode > 300 && mode < 400) break;
2523
2524 case 317:
2525 test_hash_speed("rmd320", sec, generic_hash_speed_template);
2526 if (mode > 300 && mode < 400) break;
2527
Michal Ludvige8057922006-05-30 22:04:19 +10002528 case 399:
2529 break;
2530
Linus Torvalds1da177e2005-04-16 15:20:36 -07002531 case 1000:
2532 test_available();
2533 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002534 }
2535}
2536
Kamalesh Babulal3af5b902008-04-05 21:00:57 +08002537static int __init tcrypt_mod_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002538{
Mikko Herranene3a4ea42007-11-26 22:12:07 +08002539 int err = -ENOMEM;
Herbert Xuf139cfa2008-07-31 12:23:53 +08002540 int i;
Mikko Herranene3a4ea42007-11-26 22:12:07 +08002541
Herbert Xuf139cfa2008-07-31 12:23:53 +08002542 for (i = 0; i < TVMEMSIZE; i++) {
2543 tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
2544 if (!tvmem[i])
2545 goto err_free_tv;
2546 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002547
Herbert Xuf139cfa2008-07-31 12:23:53 +08002548 for (i = 0; i < XBUFSIZE; i++) {
2549 xbuf[i] = (void *)__get_free_page(GFP_KERNEL);
2550 if (!xbuf[i])
2551 goto err_free_xbuf;
2552 }
Mikko Herranene3a4ea42007-11-26 22:12:07 +08002553
Herbert Xuf139cfa2008-07-31 12:23:53 +08002554 for (i = 0; i < XBUFSIZE; i++) {
2555 axbuf[i] = (void *)__get_free_page(GFP_KERNEL);
2556 if (!axbuf[i])
2557 goto err_free_axbuf;
2558 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002559
Herbert Xu01b32322008-07-31 15:41:55 +08002560 do_test(mode);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002561
Michal Ludvig14fdf472006-05-30 14:49:38 +10002562 /* We intentionaly return -EAGAIN to prevent keeping
2563 * the module. It does all its work from init()
2564 * and doesn't offer any runtime functionality
2565 * => we don't need it in the memory, do we?
2566 * -- mludvig
2567 */
Mikko Herranene3a4ea42007-11-26 22:12:07 +08002568 err = -EAGAIN;
2569
Herbert Xuf139cfa2008-07-31 12:23:53 +08002570err_free_axbuf:
2571 for (i = 0; i < XBUFSIZE && axbuf[i]; i++)
2572 free_page((unsigned long)axbuf[i]);
2573err_free_xbuf:
2574 for (i = 0; i < XBUFSIZE && xbuf[i]; i++)
2575 free_page((unsigned long)xbuf[i]);
2576err_free_tv:
2577 for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
2578 free_page((unsigned long)tvmem[i]);
Mikko Herranene3a4ea42007-11-26 22:12:07 +08002579
2580 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002581}
2582
2583/*
2584 * If an init function is provided, an exit function must also be provided
2585 * to allow module unload.
2586 */
Kamalesh Babulal3af5b902008-04-05 21:00:57 +08002587static void __exit tcrypt_mod_fini(void) { }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002588
Kamalesh Babulal3af5b902008-04-05 21:00:57 +08002589module_init(tcrypt_mod_init);
2590module_exit(tcrypt_mod_fini);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002591
2592module_param(mode, int, 0);
Harald Welteebfd9bc2005-06-22 13:27:23 -07002593module_param(sec, uint, 0);
Herbert Xu6a179442005-06-22 13:29:03 -07002594MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
2595 "(defaults to zero which uses CPU cycles instead)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002596
2597MODULE_LICENSE("GPL");
2598MODULE_DESCRIPTION("Quick & dirty crypto testing module");
2599MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");