Blame view

crypto/tcrypt.c 50.3 KB
ef2736fc7   Herbert Xu   [CRYPTO]: White s...
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
6
7
8
   * Quick & dirty crypto testing module.
   *
   * This will only exist until we have a better testing mechanism
   * (e.g. a char device).
   *
   * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
   * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
e3a4ea4fd   Mikko Herranen   [CRYPTO] tcrypt: ...
9
   * Copyright (c) 2007 Nokia Siemens Networks
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
   *
69435b94d   Adrian Hoban   crypto: rfc4106 -...
11
12
13
14
15
16
17
   * Updated RFC4106 AES-GCM testing.
   *    Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
   *             Adrian Hoban <adrian.hoban@intel.com>
   *             Gabriele Paoloni <gabriele.paoloni@intel.com>
   *             Tadeusz Struk (tadeusz.struk@intel.com)
   *             Copyright (c) 2010, Intel Corporation.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
   * This program is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License as published by the Free
ef2736fc7   Herbert Xu   [CRYPTO]: White s...
20
   * Software Foundation; either version 2 of the License, or (at your option)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
   * any later version.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
   */
18e33e6d5   Herbert Xu   crypto: hash - Mo...
24
  #include <crypto/hash.h>
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
25
  #include <linux/err.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
  #include <linux/init.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
27
  #include <linux/gfp.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
  #include <linux/module.h>
378f058cc   David Hardeman   [PATCH] Use sg_se...
29
  #include <linux/scatterlist.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  #include <linux/string.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
  #include <linux/moduleparam.h>
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
32
  #include <linux/jiffies.h>
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
33
34
  #include <linux/timex.h>
  #include <linux/interrupt.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
  #include "tcrypt.h"
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
36
  #include "internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
  
  /*
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
39
   * Need slab memory for testing (size in number of pages).
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
   */
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
41
  #define TVMEMSIZE	4
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
43
  
  /*
da7f033dd   Herbert Xu   crypto: cryptomgr...
44
  * Used by test_cipher_speed()
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
47
  */
  #define ENCRYPT 1
  #define DECRYPT 0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48

ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
49
50
51
  /*
   * Used by test_cipher_speed()
   */
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
52
  static unsigned int sec;
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
53

a873a5f1c   Steffen Klassert   crypto: tcrypt - ...
54
55
  static char *alg = NULL;
  static u32 type;
7be380f72   Herbert Xu   crypto: tcrypt - ...
56
  static u32 mask;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
  static int mode;
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
58
  static char *tvmem[TVMEMSIZE];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
  
  static char *check[] = {
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
61
62
63
  	"des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
  	"blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
  	"cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
90831639a   David Howells   [CRYPTO] fcrypt: ...
64
  	"khazad", "wp512", "wp384", "wp256", "tnepres", "xeta",  "fcrypt",
2998db37b   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
65
  	"camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
0c01aed50   Geert Uytterhoeven   crypto: testmgr -...
66
  	"lzo", "cts", "zlib", NULL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
  };
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
68
69
  static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
  			       struct scatterlist *sg, int blen, int sec)
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
70
  {
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
71
72
73
  	unsigned long start, end;
  	int bcount;
  	int ret;
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
74
75
76
  	for (start = jiffies, end = start + sec * HZ, bcount = 0;
  	     time_before(jiffies, end); bcount++) {
  		if (enc)
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
77
  			ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
78
  		else
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
79
  			ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
80
81
82
83
84
85
86
87
88
89
  
  		if (ret)
  			return ret;
  	}
  
  	printk("%d operations in %d seconds (%ld bytes)
  ",
  	       bcount, sec, (long)bcount * blen);
  	return 0;
  }
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
90
91
  static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
  			      struct scatterlist *sg, int blen)
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
92
  {
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
93
94
95
  	unsigned long cycles = 0;
  	int ret = 0;
  	int i;
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
96
97
98
99
100
  	local_irq_disable();
  
  	/* Warm-up run. */
  	for (i = 0; i < 4; i++) {
  		if (enc)
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
101
  			ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
102
  		else
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
103
  			ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
104
105
106
107
108
109
110
111
112
113
114
  
  		if (ret)
  			goto out;
  	}
  
  	/* The real thing. */
  	for (i = 0; i < 8; i++) {
  		cycles_t start, end;
  
  		start = get_cycles();
  		if (enc)
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
115
  			ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
116
  		else
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
117
  			ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
118
119
120
121
122
123
124
125
126
127
  		end = get_cycles();
  
  		if (ret)
  			goto out;
  
  		cycles += end - start;
  	}
  
  out:
  	local_irq_enable();
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
128
129
130
131
132
133
134
135
  
  	if (ret == 0)
  		printk("1 operation in %lu cycles (%d bytes)
  ",
  		       (cycles + 4) / 8, blen);
  
  	return ret;
  }
53f52d7ae   Tim Chen   crypto: tcrypt - ...
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
  static int test_aead_jiffies(struct aead_request *req, int enc,
  				int blen, int sec)
  {
  	unsigned long start, end;
  	int bcount;
  	int ret;
  
  	for (start = jiffies, end = start + sec * HZ, bcount = 0;
  	     time_before(jiffies, end); bcount++) {
  		if (enc)
  			ret = crypto_aead_encrypt(req);
  		else
  			ret = crypto_aead_decrypt(req);
  
  		if (ret)
  			return ret;
  	}
  
  	printk("%d operations in %d seconds (%ld bytes)
  ",
  	       bcount, sec, (long)bcount * blen);
  	return 0;
  }
  
  static int test_aead_cycles(struct aead_request *req, int enc, int blen)
  {
  	unsigned long cycles = 0;
  	int ret = 0;
  	int i;
  
  	local_irq_disable();
  
  	/* Warm-up run. */
  	for (i = 0; i < 4; i++) {
  		if (enc)
  			ret = crypto_aead_encrypt(req);
  		else
  			ret = crypto_aead_decrypt(req);
  
  		if (ret)
  			goto out;
  	}
  
  	/* The real thing. */
  	for (i = 0; i < 8; i++) {
  		cycles_t start, end;
  
  		start = get_cycles();
  		if (enc)
  			ret = crypto_aead_encrypt(req);
  		else
  			ret = crypto_aead_decrypt(req);
  		end = get_cycles();
  
  		if (ret)
  			goto out;
  
  		cycles += end - start;
  	}
  
  out:
  	local_irq_enable();
  
  	if (ret == 0)
  		printk("1 operation in %lu cycles (%d bytes)
  ",
  		       (cycles + 4) / 8, blen);
  
  	return ret;
  }
d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
206
  static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
53f52d7ae   Tim Chen   crypto: tcrypt - ...
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
  static u32 aead_sizes[] = { 16, 64, 256, 512, 1024, 2048, 4096, 8192, 0 };
  
  #define XBUFSIZE 8
  #define MAX_IVLEN 32
  
  static int testmgr_alloc_buf(char *buf[XBUFSIZE])
  {
  	int i;
  
  	for (i = 0; i < XBUFSIZE; i++) {
  		buf[i] = (void *)__get_free_page(GFP_KERNEL);
  		if (!buf[i])
  			goto err_free_buf;
  	}
  
  	return 0;
  
  err_free_buf:
  	while (i-- > 0)
  		free_page((unsigned long)buf[i]);
  
  	return -ENOMEM;
  }
  
  static void testmgr_free_buf(char *buf[XBUFSIZE])
  {
  	int i;
  
  	for (i = 0; i < XBUFSIZE; i++)
  		free_page((unsigned long)buf[i]);
  }
  
  static void sg_init_aead(struct scatterlist *sg, char *xbuf[XBUFSIZE],
  			unsigned int buflen)
  {
  	int np = (buflen + PAGE_SIZE - 1)/PAGE_SIZE;
  	int k, rem;
  
  	np = (np > XBUFSIZE) ? XBUFSIZE : np;
  	rem = buflen % PAGE_SIZE;
  	if (np > XBUFSIZE) {
  		rem = PAGE_SIZE;
  		np = XBUFSIZE;
  	}
  	sg_init_table(sg, np);
  	for (k = 0; k < np; ++k) {
  		if (k == (np-1))
  			sg_set_buf(&sg[k], xbuf[k], rem);
  		else
  			sg_set_buf(&sg[k], xbuf[k], PAGE_SIZE);
  	}
  }
  
  static void test_aead_speed(const char *algo, int enc, unsigned int sec,
  			    struct aead_speed_template *template,
  			    unsigned int tcount, u8 authsize,
  			    unsigned int aad_size, u8 *keysize)
  {
  	unsigned int i, j;
  	struct crypto_aead *tfm;
  	int ret = -ENOMEM;
  	const char *key;
  	struct aead_request *req;
  	struct scatterlist *sg;
  	struct scatterlist *asg;
  	struct scatterlist *sgout;
  	const char *e;
  	void *assoc;
  	char iv[MAX_IVLEN];
  	char *xbuf[XBUFSIZE];
  	char *xoutbuf[XBUFSIZE];
  	char *axbuf[XBUFSIZE];
  	unsigned int *b_size;
  	unsigned int iv_len;
  
  	if (enc == ENCRYPT)
  		e = "encryption";
  	else
  		e = "decryption";
  
  	if (testmgr_alloc_buf(xbuf))
  		goto out_noxbuf;
  	if (testmgr_alloc_buf(axbuf))
  		goto out_noaxbuf;
  	if (testmgr_alloc_buf(xoutbuf))
  		goto out_nooutbuf;
  
  	sg = kmalloc(sizeof(*sg) * 8 * 3, GFP_KERNEL);
  	if (!sg)
  		goto out_nosg;
  	asg = &sg[8];
  	sgout = &asg[8];
  
  
  	printk(KERN_INFO "
  testing speed of %s %s
  ", algo, e);
  
  	tfm = crypto_alloc_aead(algo, 0, 0);
  
  	if (IS_ERR(tfm)) {
  		pr_err("alg: aead: Failed to load transform for %s: %ld
  ", algo,
  		       PTR_ERR(tfm));
  		return;
  	}
  
  	req = aead_request_alloc(tfm, GFP_KERNEL);
  	if (!req) {
  		pr_err("alg: aead: Failed to allocate request for %s
  ",
  		       algo);
  		goto out;
  	}
  
  	i = 0;
  	do {
  		b_size = aead_sizes;
  		do {
  			assoc = axbuf[0];
  
  			if (aad_size < PAGE_SIZE)
  				memset(assoc, 0xff, aad_size);
  			else {
  				pr_err("associate data length (%u) too big
  ",
  					aad_size);
  				goto out_nosg;
  			}
  			sg_init_one(&asg[0], assoc, aad_size);
  
  			if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
  				pr_err("template (%u) too big for tvmem (%lu)
  ",
  				       *keysize + *b_size,
  					TVMEMSIZE * PAGE_SIZE);
  				goto out;
  			}
  
  			key = tvmem[0];
  			for (j = 0; j < tcount; j++) {
  				if (template[j].klen == *keysize) {
  					key = template[j].key;
  					break;
  				}
  			}
  			ret = crypto_aead_setkey(tfm, key, *keysize);
  			ret = crypto_aead_setauthsize(tfm, authsize);
  
  			iv_len = crypto_aead_ivsize(tfm);
  			if (iv_len)
  				memset(&iv, 0xff, iv_len);
  
  			crypto_aead_clear_flags(tfm, ~0);
  			printk(KERN_INFO "test %u (%d bit key, %d byte blocks): ",
  					i, *keysize * 8, *b_size);
  
  
  			memset(tvmem[0], 0xff, PAGE_SIZE);
  
  			if (ret) {
  				pr_err("setkey() failed flags=%x
  ",
  						crypto_aead_get_flags(tfm));
  				goto out;
  			}
  
  			sg_init_aead(&sg[0], xbuf,
  				    *b_size + (enc ? authsize : 0));
  
  			sg_init_aead(&sgout[0], xoutbuf,
  				    *b_size + (enc ? authsize : 0));
  
  			aead_request_set_crypt(req, sg, sgout, *b_size, iv);
  			aead_request_set_assoc(req, asg, aad_size);
  
  			if (sec)
  				ret = test_aead_jiffies(req, enc, *b_size, sec);
  			else
  				ret = test_aead_cycles(req, enc, *b_size);
  
  			if (ret) {
  				pr_err("%s() failed return code=%d
  ", e, ret);
  				break;
  			}
  			b_size++;
  			i++;
  		} while (*b_size);
  		keysize++;
  	} while (*keysize);
  
  out:
  	crypto_free_aead(tfm);
  	kfree(sg);
  out_nosg:
  	testmgr_free_buf(xoutbuf);
  out_nooutbuf:
  	testmgr_free_buf(axbuf);
  out_noaxbuf:
  	testmgr_free_buf(xbuf);
  out_noxbuf:
  	return;
  }
d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
411

01b323245   Herbert Xu   crypto: tcrypt - ...
412
  static void test_cipher_speed(const char *algo, int enc, unsigned int sec,
da7f033dd   Herbert Xu   crypto: cryptomgr...
413
  			      struct cipher_speed_template *template,
d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
414
  			      unsigned int tcount, u8 *keysize)
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
415
  {
dce907c00   Herbert Xu   [CRYPTO]: Use tem...
416
  	unsigned int ret, i, j, iv_len;
f07ef1de9   David Sterba   crypto: tcrypt - ...
417
418
  	const char *key;
  	char iv[128];
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
419
420
421
  	struct crypto_blkcipher *tfm;
  	struct blkcipher_desc desc;
  	const char *e;
d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
422
  	u32 *b_size;
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
423
424
425
426
427
  
  	if (enc == ENCRYPT)
  	        e = "encryption";
  	else
  		e = "decryption";
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
428

cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
429
430
431
  	printk("
  testing speed of %s %s
  ", algo, e);
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
432

cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
433
  	tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
434

cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
435
436
437
438
  	if (IS_ERR(tfm)) {
  		printk("failed to load transform for %s: %ld
  ", algo,
  		       PTR_ERR(tfm));
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
439
440
  		return;
  	}
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
441
442
  	desc.tfm = tfm;
  	desc.flags = 0;
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
443

d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
444
445
  	i = 0;
  	do {
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
446

d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
447
448
  		b_size = block_sizes;
  		do {
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
449
  			struct scatterlist sg[TVMEMSIZE];
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
450

f139cfa7c   Herbert Xu   crypto: tcrypt - ...
451
452
453
454
455
  			if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
  				printk("template (%u) too big for "
  				       "tvmem (%lu)
  ", *keysize + *b_size,
  				       TVMEMSIZE * PAGE_SIZE);
d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
456
457
  				goto out;
  			}
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
458

d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
459
460
  			printk("test %u (%d bit key, %d byte blocks): ", i,
  					*keysize * 8, *b_size);
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
461
  			memset(tvmem[0], 0xff, PAGE_SIZE);
d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
462
463
  
  			/* set key, plain text and IV */
da7f033dd   Herbert Xu   crypto: cryptomgr...
464
  			key = tvmem[0];
d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
465
466
467
468
469
  			for (j = 0; j < tcount; j++) {
  				if (template[j].klen == *keysize) {
  					key = template[j].key;
  					break;
  				}
dce907c00   Herbert Xu   [CRYPTO]: Use tem...
470
  			}
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
471

d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
472
473
474
475
476
477
478
  			ret = crypto_blkcipher_setkey(tfm, key, *keysize);
  			if (ret) {
  				printk("setkey() failed flags=%x
  ",
  						crypto_blkcipher_get_flags(tfm));
  				goto out;
  			}
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
479

f139cfa7c   Herbert Xu   crypto: tcrypt - ...
480
481
482
483
484
485
486
  			sg_init_table(sg, TVMEMSIZE);
  			sg_set_buf(sg, tvmem[0] + *keysize,
  				   PAGE_SIZE - *keysize);
  			for (j = 1; j < TVMEMSIZE; j++) {
  				sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
  				memset (tvmem[j], 0xff, PAGE_SIZE);
  			}
d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
487
488
489
490
491
  			iv_len = crypto_blkcipher_ivsize(tfm);
  			if (iv_len) {
  				memset(&iv, 0xff, iv_len);
  				crypto_blkcipher_set_iv(tfm, iv, iv_len);
  			}
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
492

d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
493
  			if (sec)
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
494
495
  				ret = test_cipher_jiffies(&desc, enc, sg,
  							  *b_size, sec);
d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
496
  			else
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
497
498
  				ret = test_cipher_cycles(&desc, enc, sg,
  							 *b_size);
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
499

d5dc39274   Sebastian Siewior   [CRYPTO] tcrypt: ...
500
501
502
503
504
505
506
507
508
509
  			if (ret) {
  				printk("%s() failed flags=%x
  ", e, desc.flags);
  				break;
  			}
  			b_size++;
  			i++;
  		} while (*b_size);
  		keysize++;
  	} while (*keysize);
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
510
511
  
  out:
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
512
  	crypto_free_blkcipher(tfm);
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
513
  }
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
514
515
  static int test_hash_jiffies_digest(struct hash_desc *desc,
  				    struct scatterlist *sg, int blen,
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
516
517
  				    char *out, int sec)
  {
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
518
519
520
521
522
523
  	unsigned long start, end;
  	int bcount;
  	int ret;
  
  	for (start = jiffies, end = start + sec * HZ, bcount = 0;
  	     time_before(jiffies, end); bcount++) {
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
524
525
526
527
528
529
530
531
532
533
534
  		ret = crypto_hash_digest(desc, sg, blen, out);
  		if (ret)
  			return ret;
  	}
  
  	printk("%6u opers/sec, %9lu bytes/sec
  ",
  	       bcount / sec, ((long)bcount * blen) / sec);
  
  	return 0;
  }
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
535
536
  static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
  			     int blen, int plen, char *out, int sec)
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
537
  {
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
538
539
  	unsigned long start, end;
  	int bcount, pcount;
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
540
541
542
  	int ret;
  
  	if (plen == blen)
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
543
  		return test_hash_jiffies_digest(desc, sg, blen, out, sec);
a5a613a42   Herbert Xu   [CRYPTO] tcrypt: ...
544

e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
545
546
  	for (start = jiffies, end = start + sec * HZ, bcount = 0;
  	     time_before(jiffies, end); bcount++) {
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
547
548
549
  		ret = crypto_hash_init(desc);
  		if (ret)
  			return ret;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
550
  		for (pcount = 0; pcount < blen; pcount += plen) {
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
551
552
553
  			ret = crypto_hash_update(desc, sg, plen);
  			if (ret)
  				return ret;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
554
555
  		}
  		/* we assume there is enough space in 'out' for the result */
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
556
557
558
  		ret = crypto_hash_final(desc, out);
  		if (ret)
  			return ret;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
559
560
561
562
563
  	}
  
  	printk("%6u opers/sec, %9lu bytes/sec
  ",
  	       bcount / sec, ((long)bcount * blen) / sec);
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
564
565
  	return 0;
  }
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
566
567
  static int test_hash_cycles_digest(struct hash_desc *desc,
  				   struct scatterlist *sg, int blen, char *out)
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
568
  {
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
569
570
571
  	unsigned long cycles = 0;
  	int i;
  	int ret;
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
572
573
574
575
  	local_irq_disable();
  
  	/* Warm-up run. */
  	for (i = 0; i < 4; i++) {
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
576
577
578
579
580
581
582
583
584
585
  		ret = crypto_hash_digest(desc, sg, blen, out);
  		if (ret)
  			goto out;
  	}
  
  	/* The real thing. */
  	for (i = 0; i < 8; i++) {
  		cycles_t start, end;
  
  		start = get_cycles();
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
586
587
588
589
590
591
592
593
594
595
596
  		ret = crypto_hash_digest(desc, sg, blen, out);
  		if (ret)
  			goto out;
  
  		end = get_cycles();
  
  		cycles += end - start;
  	}
  
  out:
  	local_irq_enable();
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
597
598
599
600
601
602
603
604
605
  
  	if (ret)
  		return ret;
  
  	printk("%6lu cycles/operation, %4lu cycles/byte
  ",
  	       cycles / 8, cycles / (8 * blen));
  
  	return 0;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
606
  }
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
607
608
  static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
  			    int blen, int plen, char *out)
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
609
  {
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
610
611
  	unsigned long cycles = 0;
  	int i, pcount;
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
612
613
614
  	int ret;
  
  	if (plen == blen)
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
615
  		return test_hash_cycles_digest(desc, sg, blen, out);
a5a613a42   Herbert Xu   [CRYPTO] tcrypt: ...
616

e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
617
618
619
620
  	local_irq_disable();
  
  	/* Warm-up run. */
  	for (i = 0; i < 4; i++) {
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
621
622
623
  		ret = crypto_hash_init(desc);
  		if (ret)
  			goto out;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
624
  		for (pcount = 0; pcount < blen; pcount += plen) {
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
625
626
627
  			ret = crypto_hash_update(desc, sg, plen);
  			if (ret)
  				goto out;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
628
  		}
29059d12e   Herbert Xu   [CRYPTO] tcrypt: ...
629
  		ret = crypto_hash_final(desc, out);
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
630
631
  		if (ret)
  			goto out;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
632
633
634
635
636
  	}
  
  	/* The real thing. */
  	for (i = 0; i < 8; i++) {
  		cycles_t start, end;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
637
  		start = get_cycles();
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
638
639
640
  		ret = crypto_hash_init(desc);
  		if (ret)
  			goto out;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
641
  		for (pcount = 0; pcount < blen; pcount += plen) {
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
642
643
644
  			ret = crypto_hash_update(desc, sg, plen);
  			if (ret)
  				goto out;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
645
  		}
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
646
647
648
  		ret = crypto_hash_final(desc, out);
  		if (ret)
  			goto out;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
649
650
651
652
653
  
  		end = get_cycles();
  
  		cycles += end - start;
  	}
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
654
  out:
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
655
  	local_irq_enable();
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
656

e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
657
658
  	if (ret)
  		return ret;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
659
660
661
  	printk("%6lu cycles/operation, %4lu cycles/byte
  ",
  	       cycles / 8, cycles / (8 * blen));
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
662
  	return 0;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
663
  }
beb63da73   David S. Miller   crypto: tcrypt - ...
664
665
666
667
668
669
670
671
672
673
  static void test_hash_sg_init(struct scatterlist *sg)
  {
  	int i;
  
  	sg_init_table(sg, TVMEMSIZE);
  	for (i = 0; i < TVMEMSIZE; i++) {
  		sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
  		memset(tvmem[i], 0xff, PAGE_SIZE);
  	}
  }
01b323245   Herbert Xu   crypto: tcrypt - ...
674
675
  static void test_hash_speed(const char *algo, unsigned int sec,
  			    struct hash_speed *speed)
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
676
  {
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
677
  	struct scatterlist sg[TVMEMSIZE];
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
678
679
  	struct crypto_hash *tfm;
  	struct hash_desc desc;
376bacb0a   Frank Seidel   crypto: tcrypt - ...
680
  	static char output[1024];
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
681
  	int i;
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
682
  	int ret;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
683

376bacb0a   Frank Seidel   crypto: tcrypt - ...
684
685
686
  	printk(KERN_INFO "
  testing speed of %s
  ", algo);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
687

e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
688
  	tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
689

e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
690
  	if (IS_ERR(tfm)) {
376bacb0a   Frank Seidel   crypto: tcrypt - ...
691
692
  		printk(KERN_ERR "failed to load transform for %s: %ld
  ", algo,
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
693
  		       PTR_ERR(tfm));
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
694
695
  		return;
  	}
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
696
697
698
699
  	desc.tfm = tfm;
  	desc.flags = 0;
  
  	if (crypto_hash_digestsize(tfm) > sizeof(output)) {
376bacb0a   Frank Seidel   crypto: tcrypt - ...
700
701
  		printk(KERN_ERR "digestsize(%u) > outputbuffer(%zu)
  ",
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
702
  		       crypto_hash_digestsize(tfm), sizeof(output));
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
703
704
  		goto out;
  	}
beb63da73   David S. Miller   crypto: tcrypt - ...
705
  	test_hash_sg_init(sg);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
706
  	for (i = 0; speed[i].blen != 0; i++) {
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
707
  		if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
376bacb0a   Frank Seidel   crypto: tcrypt - ...
708
709
710
  			printk(KERN_ERR
  			       "template (%u) too big for tvmem (%lu)
  ",
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
711
  			       speed[i].blen, TVMEMSIZE * PAGE_SIZE);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
712
713
  			goto out;
  		}
18bcc9194   Huang Ying   crypto: tcrypt - ...
714
715
  		if (speed[i].klen)
  			crypto_hash_setkey(tfm, tvmem[0], speed[i].klen);
376bacb0a   Frank Seidel   crypto: tcrypt - ...
716
717
  		printk(KERN_INFO "test%3u "
  		       "(%5u byte blocks,%5u bytes per update,%4u updates): ",
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
718
  		       i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
719
  		if (sec)
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
720
  			ret = test_hash_jiffies(&desc, sg, speed[i].blen,
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
721
  						speed[i].plen, output, sec);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
722
  		else
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
723
  			ret = test_hash_cycles(&desc, sg, speed[i].blen,
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
724
725
726
  					       speed[i].plen, output);
  
  		if (ret) {
376bacb0a   Frank Seidel   crypto: tcrypt - ...
727
728
  			printk(KERN_ERR "hashing failed ret=%d
  ", ret);
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
729
730
  			break;
  		}
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
731
732
733
  	}
  
  out:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
734
  	crypto_free_hash(tfm);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
735
  }
beb63da73   David S. Miller   crypto: tcrypt - ...
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
  struct tcrypt_result {
  	struct completion completion;
  	int err;
  };
  
  static void tcrypt_complete(struct crypto_async_request *req, int err)
  {
  	struct tcrypt_result *res = req->data;
  
  	if (err == -EINPROGRESS)
  		return;
  
  	res->err = err;
  	complete(&res->completion);
  }
  
  static inline int do_one_ahash_op(struct ahash_request *req, int ret)
  {
  	if (ret == -EINPROGRESS || ret == -EBUSY) {
  		struct tcrypt_result *tr = req->base.data;
  
  		ret = wait_for_completion_interruptible(&tr->completion);
  		if (!ret)
  			ret = tr->err;
16735d022   Wolfram Sang   tree-wide: use re...
760
  		reinit_completion(&tr->completion);
beb63da73   David S. Miller   crypto: tcrypt - ...
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
  	}
  	return ret;
  }
  
  static int test_ahash_jiffies_digest(struct ahash_request *req, int blen,
  				     char *out, int sec)
  {
  	unsigned long start, end;
  	int bcount;
  	int ret;
  
  	for (start = jiffies, end = start + sec * HZ, bcount = 0;
  	     time_before(jiffies, end); bcount++) {
  		ret = do_one_ahash_op(req, crypto_ahash_digest(req));
  		if (ret)
  			return ret;
  	}
  
  	printk("%6u opers/sec, %9lu bytes/sec
  ",
  	       bcount / sec, ((long)bcount * blen) / sec);
  
  	return 0;
  }
  
  static int test_ahash_jiffies(struct ahash_request *req, int blen,
  			      int plen, char *out, int sec)
  {
  	unsigned long start, end;
  	int bcount, pcount;
  	int ret;
  
  	if (plen == blen)
  		return test_ahash_jiffies_digest(req, blen, out, sec);
  
  	for (start = jiffies, end = start + sec * HZ, bcount = 0;
  	     time_before(jiffies, end); bcount++) {
  		ret = crypto_ahash_init(req);
  		if (ret)
  			return ret;
  		for (pcount = 0; pcount < blen; pcount += plen) {
  			ret = do_one_ahash_op(req, crypto_ahash_update(req));
  			if (ret)
  				return ret;
  		}
  		/* we assume there is enough space in 'out' for the result */
  		ret = do_one_ahash_op(req, crypto_ahash_final(req));
  		if (ret)
  			return ret;
  	}
  
  	pr_cont("%6u opers/sec, %9lu bytes/sec
  ",
  		bcount / sec, ((long)bcount * blen) / sec);
  
  	return 0;
  }
  
  static int test_ahash_cycles_digest(struct ahash_request *req, int blen,
  				    char *out)
  {
  	unsigned long cycles = 0;
  	int ret, i;
  
  	/* Warm-up run. */
  	for (i = 0; i < 4; i++) {
  		ret = do_one_ahash_op(req, crypto_ahash_digest(req));
  		if (ret)
  			goto out;
  	}
  
  	/* The real thing. */
  	for (i = 0; i < 8; i++) {
  		cycles_t start, end;
  
  		start = get_cycles();
  
  		ret = do_one_ahash_op(req, crypto_ahash_digest(req));
  		if (ret)
  			goto out;
  
  		end = get_cycles();
  
  		cycles += end - start;
  	}
  
  out:
  	if (ret)
  		return ret;
  
  	pr_cont("%6lu cycles/operation, %4lu cycles/byte
  ",
  		cycles / 8, cycles / (8 * blen));
  
  	return 0;
  }
  
  static int test_ahash_cycles(struct ahash_request *req, int blen,
  			     int plen, char *out)
  {
  	unsigned long cycles = 0;
  	int i, pcount, ret;
  
  	if (plen == blen)
  		return test_ahash_cycles_digest(req, blen, out);
  
  	/* Warm-up run. */
  	for (i = 0; i < 4; i++) {
  		ret = crypto_ahash_init(req);
  		if (ret)
  			goto out;
  		for (pcount = 0; pcount < blen; pcount += plen) {
  			ret = do_one_ahash_op(req, crypto_ahash_update(req));
  			if (ret)
  				goto out;
  		}
  		ret = do_one_ahash_op(req, crypto_ahash_final(req));
  		if (ret)
  			goto out;
  	}
  
  	/* The real thing. */
  	for (i = 0; i < 8; i++) {
  		cycles_t start, end;
  
  		start = get_cycles();
  
  		ret = crypto_ahash_init(req);
  		if (ret)
  			goto out;
  		for (pcount = 0; pcount < blen; pcount += plen) {
  			ret = do_one_ahash_op(req, crypto_ahash_update(req));
  			if (ret)
  				goto out;
  		}
  		ret = do_one_ahash_op(req, crypto_ahash_final(req));
  		if (ret)
  			goto out;
  
  		end = get_cycles();
  
  		cycles += end - start;
  	}
  
  out:
  	if (ret)
  		return ret;
  
  	pr_cont("%6lu cycles/operation, %4lu cycles/byte
  ",
  		cycles / 8, cycles / (8 * blen));
  
  	return 0;
  }
  
  static void test_ahash_speed(const char *algo, unsigned int sec,
  			     struct hash_speed *speed)
  {
  	struct scatterlist sg[TVMEMSIZE];
  	struct tcrypt_result tresult;
  	struct ahash_request *req;
  	struct crypto_ahash *tfm;
  	static char output[1024];
  	int i, ret;
  
  	printk(KERN_INFO "
  testing speed of async %s
  ", algo);
  
  	tfm = crypto_alloc_ahash(algo, 0, 0);
  	if (IS_ERR(tfm)) {
  		pr_err("failed to load transform for %s: %ld
  ",
  		       algo, PTR_ERR(tfm));
  		return;
  	}
  
  	if (crypto_ahash_digestsize(tfm) > sizeof(output)) {
  		pr_err("digestsize(%u) > outputbuffer(%zu)
  ",
  		       crypto_ahash_digestsize(tfm), sizeof(output));
  		goto out;
  	}
  
  	test_hash_sg_init(sg);
  	req = ahash_request_alloc(tfm, GFP_KERNEL);
  	if (!req) {
  		pr_err("ahash request allocation failure
  ");
  		goto out;
  	}
  
  	init_completion(&tresult.completion);
  	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
  				   tcrypt_complete, &tresult);
  
  	for (i = 0; speed[i].blen != 0; i++) {
  		if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
  			pr_err("template (%u) too big for tvmem (%lu)
  ",
  			       speed[i].blen, TVMEMSIZE * PAGE_SIZE);
  			break;
  		}
  
  		pr_info("test%3u "
  			"(%5u byte blocks,%5u bytes per update,%4u updates): ",
  			i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
  
  		ahash_request_set_crypt(req, sg, output, speed[i].plen);
  
  		if (sec)
  			ret = test_ahash_jiffies(req, speed[i].blen,
  						 speed[i].plen, output, sec);
  		else
  			ret = test_ahash_cycles(req, speed[i].blen,
  						speed[i].plen, output);
  
  		if (ret) {
  			pr_err("hashing failed ret=%d
  ", ret);
  			break;
  		}
  	}
  
  	ahash_request_free(req);
  
  out:
  	crypto_free_ahash(tfm);
  }
3f3baf359   Jussi Kivilinna   crypto: tcrypt - ...
990
991
992
993
994
995
996
997
  static inline int do_one_acipher_op(struct ablkcipher_request *req, int ret)
  {
  	if (ret == -EINPROGRESS || ret == -EBUSY) {
  		struct tcrypt_result *tr = req->base.data;
  
  		ret = wait_for_completion_interruptible(&tr->completion);
  		if (!ret)
  			ret = tr->err;
16735d022   Wolfram Sang   tree-wide: use re...
998
  		reinit_completion(&tr->completion);
3f3baf359   Jussi Kivilinna   crypto: tcrypt - ...
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
  	}
  
  	return ret;
  }
  
  static int test_acipher_jiffies(struct ablkcipher_request *req, int enc,
  				int blen, int sec)
  {
  	unsigned long start, end;
  	int bcount;
  	int ret;
  
  	for (start = jiffies, end = start + sec * HZ, bcount = 0;
  	     time_before(jiffies, end); bcount++) {
  		if (enc)
  			ret = do_one_acipher_op(req,
  						crypto_ablkcipher_encrypt(req));
  		else
  			ret = do_one_acipher_op(req,
  						crypto_ablkcipher_decrypt(req));
  
  		if (ret)
  			return ret;
  	}
  
  	pr_cont("%d operations in %d seconds (%ld bytes)
  ",
  		bcount, sec, (long)bcount * blen);
  	return 0;
  }
  
  static int test_acipher_cycles(struct ablkcipher_request *req, int enc,
  			       int blen)
  {
  	unsigned long cycles = 0;
  	int ret = 0;
  	int i;
  
  	/* Warm-up run. */
  	for (i = 0; i < 4; i++) {
  		if (enc)
  			ret = do_one_acipher_op(req,
  						crypto_ablkcipher_encrypt(req));
  		else
  			ret = do_one_acipher_op(req,
  						crypto_ablkcipher_decrypt(req));
  
  		if (ret)
  			goto out;
  	}
  
  	/* The real thing. */
  	for (i = 0; i < 8; i++) {
  		cycles_t start, end;
  
  		start = get_cycles();
  		if (enc)
  			ret = do_one_acipher_op(req,
  						crypto_ablkcipher_encrypt(req));
  		else
  			ret = do_one_acipher_op(req,
  						crypto_ablkcipher_decrypt(req));
  		end = get_cycles();
  
  		if (ret)
  			goto out;
  
  		cycles += end - start;
  	}
  
  out:
  	if (ret == 0)
  		pr_cont("1 operation in %lu cycles (%d bytes)
  ",
  			(cycles + 4) / 8, blen);
  
  	return ret;
  }
  
  static void test_acipher_speed(const char *algo, int enc, unsigned int sec,
  			       struct cipher_speed_template *template,
  			       unsigned int tcount, u8 *keysize)
  {
de1975334   Nicolas Royer   crypto: atmel - a...
1082
  	unsigned int ret, i, j, k, iv_len;
3f3baf359   Jussi Kivilinna   crypto: tcrypt - ...
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
  	struct tcrypt_result tresult;
  	const char *key;
  	char iv[128];
  	struct ablkcipher_request *req;
  	struct crypto_ablkcipher *tfm;
  	const char *e;
  	u32 *b_size;
  
  	if (enc == ENCRYPT)
  		e = "encryption";
  	else
  		e = "decryption";
  
  	pr_info("
  testing speed of async %s %s
  ", algo, e);
  
  	init_completion(&tresult.completion);
  
  	tfm = crypto_alloc_ablkcipher(algo, 0, 0);
  
  	if (IS_ERR(tfm)) {
  		pr_err("failed to load transform for %s: %ld
  ", algo,
  		       PTR_ERR(tfm));
  		return;
  	}
  
  	req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
  	if (!req) {
  		pr_err("tcrypt: skcipher: Failed to allocate request for %s
  ",
  		       algo);
  		goto out;
  	}
  
  	ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
  					tcrypt_complete, &tresult);
  
  	i = 0;
  	do {
  		b_size = block_sizes;
  
  		do {
  			struct scatterlist sg[TVMEMSIZE];
  
  			if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
  				pr_err("template (%u) too big for "
  				       "tvmem (%lu)
  ", *keysize + *b_size,
  				       TVMEMSIZE * PAGE_SIZE);
  				goto out_free_req;
  			}
  
  			pr_info("test %u (%d bit key, %d byte blocks): ", i,
  				*keysize * 8, *b_size);
  
  			memset(tvmem[0], 0xff, PAGE_SIZE);
  
  			/* set key, plain text and IV */
  			key = tvmem[0];
  			for (j = 0; j < tcount; j++) {
  				if (template[j].klen == *keysize) {
  					key = template[j].key;
  					break;
  				}
  			}
  
  			crypto_ablkcipher_clear_flags(tfm, ~0);
  
  			ret = crypto_ablkcipher_setkey(tfm, key, *keysize);
  			if (ret) {
  				pr_err("setkey() failed flags=%x
  ",
  					crypto_ablkcipher_get_flags(tfm));
  				goto out_free_req;
  			}
  
  			sg_init_table(sg, TVMEMSIZE);
de1975334   Nicolas Royer   crypto: atmel - a...
1162
1163
1164
1165
  
  			k = *keysize + *b_size;
  			if (k > PAGE_SIZE) {
  				sg_set_buf(sg, tvmem[0] + *keysize,
3f3baf359   Jussi Kivilinna   crypto: tcrypt - ...
1166
  				   PAGE_SIZE - *keysize);
de1975334   Nicolas Royer   crypto: atmel - a...
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
  				k -= PAGE_SIZE;
  				j = 1;
  				while (k > PAGE_SIZE) {
  					sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
  					memset(tvmem[j], 0xff, PAGE_SIZE);
  					j++;
  					k -= PAGE_SIZE;
  				}
  				sg_set_buf(sg + j, tvmem[j], k);
  				memset(tvmem[j], 0xff, k);
  			} else {
  				sg_set_buf(sg, tvmem[0] + *keysize, *b_size);
3f3baf359   Jussi Kivilinna   crypto: tcrypt - ...
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
  			}
  
  			iv_len = crypto_ablkcipher_ivsize(tfm);
  			if (iv_len)
  				memset(&iv, 0xff, iv_len);
  
  			ablkcipher_request_set_crypt(req, sg, sg, *b_size, iv);
  
  			if (sec)
  				ret = test_acipher_jiffies(req, enc,
  							   *b_size, sec);
  			else
  				ret = test_acipher_cycles(req, enc,
  							  *b_size);
  
  			if (ret) {
  				pr_err("%s() failed flags=%x
  ", e,
  					crypto_ablkcipher_get_flags(tfm));
  				break;
  			}
  			b_size++;
  			i++;
  		} while (*b_size);
  		keysize++;
  	} while (*keysize);
  
  out_free_req:
  	ablkcipher_request_free(req);
  out:
  	crypto_free_ablkcipher(tfm);
  }
ef2736fc7   Herbert Xu   [CRYPTO]: White s...
1211
  static void test_available(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1212
1213
  {
  	char **name = check;
ef2736fc7   Herbert Xu   [CRYPTO]: White s...
1214

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1215
1216
  	while (*name) {
  		printk("alg %s ", *name);
6158efc09   Herbert Xu   [CRYPTO] tcrypt: ...
1217
  		printk(crypto_has_alg(*name, 0, 0) ?
e4d5b79c6   Herbert Xu   [CRYPTO] users: U...
1218
1219
1220
  		       "found
  " : "not found
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1221
  		name++;
ef2736fc7   Herbert Xu   [CRYPTO]: White s...
1222
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1223
  }
01b323245   Herbert Xu   crypto: tcrypt - ...
1224
1225
  static inline int tcrypt_test(const char *alg)
  {
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1226
1227
1228
1229
1230
1231
1232
  	int ret;
  
  	ret = alg_test(alg, alg, 0, 0);
  	/* non-fips algs return -EINVAL in fips mode */
  	if (fips_enabled && ret == -EINVAL)
  		ret = 0;
  	return ret;
01b323245   Herbert Xu   crypto: tcrypt - ...
1233
  }
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1234
  static int do_test(int m)
01b323245   Herbert Xu   crypto: tcrypt - ...
1235
1236
  {
  	int i;
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1237
  	int ret = 0;
01b323245   Herbert Xu   crypto: tcrypt - ...
1238
1239
  
  	switch (m) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1240
  	case 0:
01b323245   Herbert Xu   crypto: tcrypt - ...
1241
  		for (i = 1; i < 200; i++)
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1242
  			ret += do_test(i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1243
1244
1245
  		break;
  
  	case 1:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1246
  		ret += tcrypt_test("md5");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1247
1248
1249
  		break;
  
  	case 2:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1250
  		ret += tcrypt_test("sha1");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1251
1252
1253
  		break;
  
  	case 3:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1254
1255
  		ret += tcrypt_test("ecb(des)");
  		ret += tcrypt_test("cbc(des)");
8163fc30d   Jussi Kivilinna   crypto: testmgr -...
1256
  		ret += tcrypt_test("ctr(des)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1257
1258
1259
  		break;
  
  	case 4:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1260
1261
  		ret += tcrypt_test("ecb(des3_ede)");
  		ret += tcrypt_test("cbc(des3_ede)");
e080b17a8   Jussi Kivilinna   crypto: testmgr -...
1262
  		ret += tcrypt_test("ctr(des3_ede)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1263
1264
1265
  		break;
  
  	case 5:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1266
  		ret += tcrypt_test("md4");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1267
  		break;
ef2736fc7   Herbert Xu   [CRYPTO]: White s...
1268

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1269
  	case 6:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1270
  		ret += tcrypt_test("sha256");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1271
  		break;
ef2736fc7   Herbert Xu   [CRYPTO]: White s...
1272

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1273
  	case 7:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1274
1275
  		ret += tcrypt_test("ecb(blowfish)");
  		ret += tcrypt_test("cbc(blowfish)");
85b63e342   Jussi Kivilinna   crypto: testmgr -...
1276
  		ret += tcrypt_test("ctr(blowfish)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1277
1278
1279
  		break;
  
  	case 8:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1280
1281
  		ret += tcrypt_test("ecb(twofish)");
  		ret += tcrypt_test("cbc(twofish)");
573da6208   Jussi Kivilinna   crypto: testmgr -...
1282
  		ret += tcrypt_test("ctr(twofish)");
bee3a90ef   Jussi Kivilinna   crypto: tcrypt - ...
1283
  		ret += tcrypt_test("lrw(twofish)");
131f75416   Jussi Kivilinna   crypto: tcrypt - ...
1284
  		ret += tcrypt_test("xts(twofish)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1285
  		break;
ef2736fc7   Herbert Xu   [CRYPTO]: White s...
1286

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1287
  	case 9:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1288
  		ret += tcrypt_test("ecb(serpent)");
9d25917d4   Jussi Kivilinna   crypto: testmgr -...
1289
1290
  		ret += tcrypt_test("cbc(serpent)");
  		ret += tcrypt_test("ctr(serpent)");
87aae4bfb   Jussi Kivilinna   crypto: tcrypt - ...
1291
  		ret += tcrypt_test("lrw(serpent)");
5209c07ac   Jussi Kivilinna   crypto: tcrypt - ...
1292
  		ret += tcrypt_test("xts(serpent)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1293
1294
1295
  		break;
  
  	case 10:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1296
1297
1298
1299
1300
1301
  		ret += tcrypt_test("ecb(aes)");
  		ret += tcrypt_test("cbc(aes)");
  		ret += tcrypt_test("lrw(aes)");
  		ret += tcrypt_test("xts(aes)");
  		ret += tcrypt_test("ctr(aes)");
  		ret += tcrypt_test("rfc3686(ctr(aes))");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1302
1303
1304
  		break;
  
  	case 11:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1305
  		ret += tcrypt_test("sha384");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1306
  		break;
ef2736fc7   Herbert Xu   [CRYPTO]: White s...
1307

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1308
  	case 12:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1309
  		ret += tcrypt_test("sha512");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1310
1311
1312
  		break;
  
  	case 13:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1313
  		ret += tcrypt_test("deflate");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1314
1315
1316
  		break;
  
  	case 14:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1317
  		ret += tcrypt_test("ecb(cast5)");
a2c582609   Johannes Goetzfried   crypto: testmgr -...
1318
1319
  		ret += tcrypt_test("cbc(cast5)");
  		ret += tcrypt_test("ctr(cast5)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1320
1321
1322
  		break;
  
  	case 15:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1323
  		ret += tcrypt_test("ecb(cast6)");
9b8b04051   Johannes Goetzfried   crypto: testmgr -...
1324
1325
1326
1327
  		ret += tcrypt_test("cbc(cast6)");
  		ret += tcrypt_test("ctr(cast6)");
  		ret += tcrypt_test("lrw(cast6)");
  		ret += tcrypt_test("xts(cast6)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1328
1329
1330
  		break;
  
  	case 16:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1331
  		ret += tcrypt_test("ecb(arc4)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1332
1333
1334
  		break;
  
  	case 17:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1335
  		ret += tcrypt_test("michael_mic");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1336
1337
1338
  		break;
  
  	case 18:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1339
  		ret += tcrypt_test("crc32c");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1340
1341
1342
  		break;
  
  	case 19:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1343
  		ret += tcrypt_test("ecb(tea)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1344
1345
1346
  		break;
  
  	case 20:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1347
  		ret += tcrypt_test("ecb(xtea)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1348
1349
1350
  		break;
  
  	case 21:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1351
  		ret += tcrypt_test("ecb(khazad)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1352
1353
1354
  		break;
  
  	case 22:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1355
  		ret += tcrypt_test("wp512");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1356
1357
1358
  		break;
  
  	case 23:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1359
  		ret += tcrypt_test("wp384");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1360
1361
1362
  		break;
  
  	case 24:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1363
  		ret += tcrypt_test("wp256");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1364
1365
1366
  		break;
  
  	case 25:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1367
  		ret += tcrypt_test("ecb(tnepres)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1368
1369
1370
  		break;
  
  	case 26:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1371
1372
  		ret += tcrypt_test("ecb(anubis)");
  		ret += tcrypt_test("cbc(anubis)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1373
1374
1375
  		break;
  
  	case 27:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1376
  		ret += tcrypt_test("tgr192");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1377
1378
1379
  		break;
  
  	case 28:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1380
  		ret += tcrypt_test("tgr160");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1381
1382
1383
  		break;
  
  	case 29:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1384
  		ret += tcrypt_test("tgr128");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1385
  		break;
2998db37b   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
1386

fb4f10ed5   Aaron Grothe   [CRYPTO]: Fix XTE...
1387
  	case 30:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1388
  		ret += tcrypt_test("ecb(xeta)");
fb4f10ed5   Aaron Grothe   [CRYPTO]: Fix XTE...
1389
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1390

90831639a   David Howells   [CRYPTO] fcrypt: ...
1391
  	case 31:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1392
  		ret += tcrypt_test("pcbc(fcrypt)");
90831639a   David Howells   [CRYPTO] fcrypt: ...
1393
  		break;
02ab5a705   Noriaki TAKAMIYA   [CRYPTO] camellia...
1394
  	case 32:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1395
1396
  		ret += tcrypt_test("ecb(camellia)");
  		ret += tcrypt_test("cbc(camellia)");
54216bbd7   Jussi Kivilinna   crypto: tcrypt - ...
1397
1398
1399
  		ret += tcrypt_test("ctr(camellia)");
  		ret += tcrypt_test("lrw(camellia)");
  		ret += tcrypt_test("xts(camellia)");
02ab5a705   Noriaki TAKAMIYA   [CRYPTO] camellia...
1400
  		break;
93b5e86a6   Jussi Kivilinna   crypto: add CMAC ...
1401

cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
1402
  	case 33:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1403
  		ret += tcrypt_test("sha224");
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
1404
  		break;
02ab5a705   Noriaki TAKAMIYA   [CRYPTO] camellia...
1405

2407d6087   Tan Swee Heng   [CRYPTO] salsa20:...
1406
  	case 34:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1407
  		ret += tcrypt_test("salsa20");
2407d6087   Tan Swee Heng   [CRYPTO] salsa20:...
1408
  		break;
8df213d9b   Herbert Xu   [CRYPTO] tcrypt: ...
1409
  	case 35:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1410
  		ret += tcrypt_test("gcm(aes)");
8df213d9b   Herbert Xu   [CRYPTO] tcrypt: ...
1411
  		break;
0b77abb3b   Zoltan Sogor   [CRYPTO] lzo: Add...
1412
  	case 36:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1413
  		ret += tcrypt_test("lzo");
0b77abb3b   Zoltan Sogor   [CRYPTO] lzo: Add...
1414
  		break;
93cc74e07   Joy Latten   [CRYPTO] tcrypt: ...
1415
  	case 37:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1416
  		ret += tcrypt_test("ccm(aes)");
93cc74e07   Joy Latten   [CRYPTO] tcrypt: ...
1417
  		break;
76cb95217   Kevin Coffman   [CRYPTO] cts: Add...
1418
  	case 38:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1419
  		ret += tcrypt_test("cts(cbc(aes))");
76cb95217   Kevin Coffman   [CRYPTO] cts: Add...
1420
  		break;
fd4adf1a0   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
1421
          case 39:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1422
  		ret += tcrypt_test("rmd128");
fd4adf1a0   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
1423
1424
1425
  		break;
  
          case 40:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1426
  		ret += tcrypt_test("rmd160");
fd4adf1a0   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
1427
  		break;
2998db37b   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
1428
  	case 41:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1429
  		ret += tcrypt_test("rmd256");
2998db37b   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
1430
1431
1432
  		break;
  
  	case 42:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1433
  		ret += tcrypt_test("rmd320");
01b323245   Herbert Xu   crypto: tcrypt - ...
1434
1435
1436
  		break;
  
  	case 43:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1437
  		ret += tcrypt_test("ecb(seed)");
2998db37b   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
1438
  		break;
0c01aed50   Geert Uytterhoeven   crypto: testmgr -...
1439
  	case 44:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1440
  		ret += tcrypt_test("zlib");
0c01aed50   Geert Uytterhoeven   crypto: testmgr -...
1441
  		break;
5d667322a   Jarod Wilson   crypto: testmgr -...
1442
  	case 45:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1443
  		ret += tcrypt_test("rfc4309(ccm(aes))");
5d667322a   Jarod Wilson   crypto: testmgr -...
1444
  		break;
54216bbd7   Jussi Kivilinna   crypto: tcrypt - ...
1445
1446
1447
  	case 46:
  		ret += tcrypt_test("ghash");
  		break;
68411521c   Herbert Xu   Reinstate "crypto...
1448
1449
1450
  	case 47:
  		ret += tcrypt_test("crct10dif");
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1451
  	case 100:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1452
  		ret += tcrypt_test("hmac(md5)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1453
  		break;
ef2736fc7   Herbert Xu   [CRYPTO]: White s...
1454

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1455
  	case 101:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1456
  		ret += tcrypt_test("hmac(sha1)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1457
  		break;
ef2736fc7   Herbert Xu   [CRYPTO]: White s...
1458

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1459
  	case 102:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1460
  		ret += tcrypt_test("hmac(sha256)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1461
  		break;
a28091ae1   Andrew Donofrio   [CRYPTO] tcrypt: ...
1462
  	case 103:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1463
  		ret += tcrypt_test("hmac(sha384)");
a28091ae1   Andrew Donofrio   [CRYPTO] tcrypt: ...
1464
1465
1466
  		break;
  
  	case 104:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1467
  		ret += tcrypt_test("hmac(sha512)");
a28091ae1   Andrew Donofrio   [CRYPTO] tcrypt: ...
1468
  		break;
38ed9ab23   Herbert Xu   [CRYPTO] tcrypt: ...
1469

cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
1470
  	case 105:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1471
  		ret += tcrypt_test("hmac(sha224)");
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
1472
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1473

38ed9ab23   Herbert Xu   [CRYPTO] tcrypt: ...
1474
  	case 106:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1475
  		ret += tcrypt_test("xcbc(aes)");
38ed9ab23   Herbert Xu   [CRYPTO] tcrypt: ...
1476
  		break;
fd4adf1a0   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
1477
  	case 107:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1478
  		ret += tcrypt_test("hmac(rmd128)");
fd4adf1a0   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
1479
1480
1481
  		break;
  
  	case 108:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1482
  		ret += tcrypt_test("hmac(rmd160)");
fd4adf1a0   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
1483
  		break;
f1939f7c5   Shane Wang   crypto: vmac - Ne...
1484
1485
1486
  	case 109:
  		ret += tcrypt_test("vmac(aes)");
  		break;
93b5e86a6   Jussi Kivilinna   crypto: add CMAC ...
1487

a482b081a   Sonic Zhang   crypto: testmgr -...
1488
1489
1490
  	case 110:
  		ret += tcrypt_test("hmac(crc32)");
  		break;
f1939f7c5   Shane Wang   crypto: vmac - Ne...
1491

e08ca2da3   Jarod Wilson   crypto: testmgr -...
1492
  	case 150:
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
1493
  		ret += tcrypt_test("ansi_cprng");
e08ca2da3   Jarod Wilson   crypto: testmgr -...
1494
  		break;
69435b94d   Adrian Hoban   crypto: rfc4106 -...
1495
1496
1497
  	case 151:
  		ret += tcrypt_test("rfc4106(gcm(aes))");
  		break;
e9b7441a9   Jussi Kivilinna   crypto: testmgr -...
1498
1499
1500
  	case 152:
  		ret += tcrypt_test("rfc4543(gcm(aes))");
  		break;
93b5e86a6   Jussi Kivilinna   crypto: add CMAC ...
1501
1502
1503
1504
1505
1506
1507
  	case 153:
  		ret += tcrypt_test("cmac(aes)");
  		break;
  
  	case 154:
  		ret += tcrypt_test("cmac(des3_ede)");
  		break;
bbf9c8934   Horia Geanta   crypto: caam - fi...
1508
1509
1510
  	case 155:
  		ret += tcrypt_test("authenc(hmac(sha1),cbc(aes))");
  		break;
bca4feb0d   Horia Geanta   crypto: testmgr -...
1511
1512
1513
1514
1515
1516
1517
  	case 156:
  		ret += tcrypt_test("authenc(hmac(md5),ecb(cipher_null))");
  		break;
  
  	case 157:
  		ret += tcrypt_test("authenc(hmac(sha1),ecb(cipher_null))");
  		break;
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
1518
  	case 200:
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1519
  		test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1520
  				speed_template_16_24_32);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1521
  		test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1522
  				speed_template_16_24_32);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1523
  		test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1524
  				speed_template_16_24_32);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1525
  		test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1526
  				speed_template_16_24_32);
f3d1044cd   Rik Snel   [CRYPTO] tcrypt: ...
1527
  		test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1528
  				speed_template_32_40_48);
f3d1044cd   Rik Snel   [CRYPTO] tcrypt: ...
1529
  		test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1530
  				speed_template_32_40_48);
f19f5111c   Rik Snel   [CRYPTO] xts: XTS...
1531
  		test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1532
  				speed_template_32_48_64);
f19f5111c   Rik Snel   [CRYPTO] xts: XTS...
1533
  		test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1534
  				speed_template_32_48_64);
9996e3421   Jan Glauber   crypto: tcrypt - ...
1535
1536
1537
1538
  		test_cipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
  				speed_template_16_24_32);
  		test_cipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
  				speed_template_16_24_32);
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
1539
1540
1541
  		break;
  
  	case 201:
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1542
  		test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
da7f033dd   Herbert Xu   crypto: cryptomgr...
1543
  				des3_speed_template, DES3_SPEED_VECTORS,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1544
  				speed_template_24);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1545
  		test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
da7f033dd   Herbert Xu   crypto: cryptomgr...
1546
  				des3_speed_template, DES3_SPEED_VECTORS,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1547
  				speed_template_24);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1548
  		test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
da7f033dd   Herbert Xu   crypto: cryptomgr...
1549
  				des3_speed_template, DES3_SPEED_VECTORS,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1550
  				speed_template_24);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1551
  		test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
da7f033dd   Herbert Xu   crypto: cryptomgr...
1552
  				des3_speed_template, DES3_SPEED_VECTORS,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1553
  				speed_template_24);
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
1554
1555
1556
  		break;
  
  	case 202:
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1557
  		test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1558
  				speed_template_16_24_32);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1559
  		test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1560
  				speed_template_16_24_32);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1561
  		test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1562
  				speed_template_16_24_32);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1563
  		test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1564
  				speed_template_16_24_32);
ee5002a54   Jussi Kivilinna   crypto: tcrypt - ...
1565
1566
1567
1568
  		test_cipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
  				speed_template_16_24_32);
  		test_cipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
  				speed_template_16_24_32);
bee3a90ef   Jussi Kivilinna   crypto: tcrypt - ...
1569
1570
1571
1572
  		test_cipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
  				speed_template_32_40_48);
  		test_cipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
  				speed_template_32_40_48);
131f75416   Jussi Kivilinna   crypto: tcrypt - ...
1573
1574
1575
1576
  		test_cipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
  				speed_template_32_48_64);
  		test_cipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
  				speed_template_32_48_64);
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
1577
1578
1579
  		break;
  
  	case 203:
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1580
  		test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1581
  				  speed_template_8_32);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1582
  		test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1583
  				  speed_template_8_32);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1584
  		test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1585
  				  speed_template_8_32);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1586
  		test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1587
  				  speed_template_8_32);
7d47b86cf   Jussi Kivilinna   crypto: tcrypt - ...
1588
1589
1590
1591
  		test_cipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
  				  speed_template_8_32);
  		test_cipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
  				  speed_template_8_32);
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
1592
1593
1594
  		break;
  
  	case 204:
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1595
  		test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1596
  				  speed_template_8);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1597
  		test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1598
  				  speed_template_8);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1599
  		test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1600
  				  speed_template_8);
cba83564d   Herbert Xu   [CRYPTO] tcrypt: ...
1601
  		test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1602
  				  speed_template_8);
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
1603
  		break;
02ab5a705   Noriaki TAKAMIYA   [CRYPTO] camellia...
1604
1605
  	case 205:
  		test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1606
  				speed_template_16_24_32);
02ab5a705   Noriaki TAKAMIYA   [CRYPTO] camellia...
1607
  		test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1608
  				speed_template_16_24_32);
02ab5a705   Noriaki TAKAMIYA   [CRYPTO] camellia...
1609
  		test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1610
  				speed_template_16_24_32);
02ab5a705   Noriaki TAKAMIYA   [CRYPTO] camellia...
1611
  		test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1612
  				speed_template_16_24_32);
4de593378   Jussi Kivilinna   crypto: tcrypt - ...
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
  		test_cipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
  				speed_template_16_24_32);
  		test_cipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
  				speed_template_16_24_32);
  		test_cipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
  				speed_template_32_40_48);
  		test_cipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
  				speed_template_32_40_48);
  		test_cipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
  				speed_template_32_48_64);
  		test_cipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
  				speed_template_32_48_64);
02ab5a705   Noriaki TAKAMIYA   [CRYPTO] camellia...
1625
  		break;
5de8f1b56   Tan Swee Heng   [CRYPTO] tcrypt: ...
1626
1627
  	case 206:
  		test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
477035c2a   Sebastian Siewior   [CRYPTO] tcrypt: ...
1628
  				  speed_template_16_32);
5de8f1b56   Tan Swee Heng   [CRYPTO] tcrypt: ...
1629
  		break;
7fb7fe446   Jussi Kivilinna   crypto: tcrypt - ...
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
  	case 207:
  		test_cipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
  				  speed_template_16_32);
  		test_cipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
  				  speed_template_16_32);
  		test_cipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
  				  speed_template_16_32);
  		test_cipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
  				  speed_template_16_32);
  		test_cipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
  				  speed_template_16_32);
  		test_cipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
  				  speed_template_16_32);
87aae4bfb   Jussi Kivilinna   crypto: tcrypt - ...
1643
1644
1645
1646
  		test_cipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
  				  speed_template_32_48);
  		test_cipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
  				  speed_template_32_48);
5209c07ac   Jussi Kivilinna   crypto: tcrypt - ...
1647
1648
1649
1650
  		test_cipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
  				  speed_template_32_64);
  		test_cipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
  				  speed_template_32_64);
7fb7fe446   Jussi Kivilinna   crypto: tcrypt - ...
1651
  		break;
31b4cd290   Jussi Kivilinna   crypto: testmgr -...
1652
1653
1654
1655
  	case 208:
  		test_cipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
  				  speed_template_8);
  		break;
a2c582609   Johannes Goetzfried   crypto: testmgr -...
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
  	case 209:
  		test_cipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
  				  speed_template_8_16);
  		test_cipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
  				  speed_template_8_16);
  		test_cipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
  				  speed_template_8_16);
  		test_cipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
  				  speed_template_8_16);
  		test_cipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
  				  speed_template_8_16);
  		test_cipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
  				  speed_template_8_16);
  		break;
9b8b04051   Johannes Goetzfried   crypto: testmgr -...
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
  	case 210:
  		test_cipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
  				  speed_template_16_32);
  		test_cipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
  				  speed_template_16_32);
  		test_cipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
  				  speed_template_16_32);
  		test_cipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
  				  speed_template_16_32);
  		test_cipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
  				  speed_template_16_32);
  		test_cipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
  				  speed_template_16_32);
  		test_cipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
  				  speed_template_32_48);
  		test_cipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
  				  speed_template_32_48);
  		test_cipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
  				  speed_template_32_64);
  		test_cipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
  				  speed_template_32_64);
  		break;
53f52d7ae   Tim Chen   crypto: tcrypt - ...
1692
1693
1694
1695
  	case 211:
  		test_aead_speed("rfc4106(gcm(aes))", ENCRYPT, sec,
  				NULL, 0, 16, 8, aead_speed_template_20);
  		break;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1696
1697
1698
1699
  	case 300:
  		/* fall through */
  
  	case 301:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
1700
  		test_hash_speed("md4", sec, generic_hash_speed_template);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1701
1702
1703
  		if (mode > 300 && mode < 400) break;
  
  	case 302:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
1704
  		test_hash_speed("md5", sec, generic_hash_speed_template);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1705
1706
1707
  		if (mode > 300 && mode < 400) break;
  
  	case 303:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
1708
  		test_hash_speed("sha1", sec, generic_hash_speed_template);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1709
1710
1711
  		if (mode > 300 && mode < 400) break;
  
  	case 304:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
1712
  		test_hash_speed("sha256", sec, generic_hash_speed_template);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1713
1714
1715
  		if (mode > 300 && mode < 400) break;
  
  	case 305:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
1716
  		test_hash_speed("sha384", sec, generic_hash_speed_template);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1717
1718
1719
  		if (mode > 300 && mode < 400) break;
  
  	case 306:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
1720
  		test_hash_speed("sha512", sec, generic_hash_speed_template);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1721
1722
1723
  		if (mode > 300 && mode < 400) break;
  
  	case 307:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
1724
  		test_hash_speed("wp256", sec, generic_hash_speed_template);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1725
1726
1727
  		if (mode > 300 && mode < 400) break;
  
  	case 308:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
1728
  		test_hash_speed("wp384", sec, generic_hash_speed_template);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1729
1730
1731
  		if (mode > 300 && mode < 400) break;
  
  	case 309:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
1732
  		test_hash_speed("wp512", sec, generic_hash_speed_template);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1733
1734
1735
  		if (mode > 300 && mode < 400) break;
  
  	case 310:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
1736
  		test_hash_speed("tgr128", sec, generic_hash_speed_template);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1737
1738
1739
  		if (mode > 300 && mode < 400) break;
  
  	case 311:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
1740
  		test_hash_speed("tgr160", sec, generic_hash_speed_template);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1741
1742
1743
  		if (mode > 300 && mode < 400) break;
  
  	case 312:
e9d41164e   Herbert Xu   [CRYPTO] tcrypt: ...
1744
  		test_hash_speed("tgr192", sec, generic_hash_speed_template);
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1745
  		if (mode > 300 && mode < 400) break;
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
1746
1747
1748
  	case 313:
  		test_hash_speed("sha224", sec, generic_hash_speed_template);
  		if (mode > 300 && mode < 400) break;
fd4adf1a0   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
1749
1750
1751
1752
1753
1754
1755
  	case 314:
  		test_hash_speed("rmd128", sec, generic_hash_speed_template);
  		if (mode > 300 && mode < 400) break;
  
  	case 315:
  		test_hash_speed("rmd160", sec, generic_hash_speed_template);
  		if (mode > 300 && mode < 400) break;
2998db37b   Adrian-Ken Rueegsegger   [CRYPTO] tcrypt: ...
1756
1757
1758
1759
1760
1761
1762
  	case 316:
  		test_hash_speed("rmd256", sec, generic_hash_speed_template);
  		if (mode > 300 && mode < 400) break;
  
  	case 317:
  		test_hash_speed("rmd320", sec, generic_hash_speed_template);
  		if (mode > 300 && mode < 400) break;
18bcc9194   Huang Ying   crypto: tcrypt - ...
1763
1764
1765
  	case 318:
  		test_hash_speed("ghash-generic", sec, hash_speed_template_16);
  		if (mode > 300 && mode < 400) break;
e3899e4df   Tim Chen   crypto: tcrypt - ...
1766
1767
1768
  	case 319:
  		test_hash_speed("crc32c", sec, generic_hash_speed_template);
  		if (mode > 300 && mode < 400) break;
68411521c   Herbert Xu   Reinstate "crypto...
1769
1770
1771
  	case 320:
  		test_hash_speed("crct10dif", sec, generic_hash_speed_template);
  		if (mode > 300 && mode < 400) break;
e80579285   Michal Ludvig   [CRYPTO] tcrypt: ...
1772
1773
  	case 399:
  		break;
beb63da73   David S. Miller   crypto: tcrypt - ...
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
  	case 400:
  		/* fall through */
  
  	case 401:
  		test_ahash_speed("md4", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 402:
  		test_ahash_speed("md5", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 403:
  		test_ahash_speed("sha1", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 404:
  		test_ahash_speed("sha256", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 405:
  		test_ahash_speed("sha384", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 406:
  		test_ahash_speed("sha512", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 407:
  		test_ahash_speed("wp256", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 408:
  		test_ahash_speed("wp384", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 409:
  		test_ahash_speed("wp512", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 410:
  		test_ahash_speed("tgr128", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 411:
  		test_ahash_speed("tgr160", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 412:
  		test_ahash_speed("tgr192", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 413:
  		test_ahash_speed("sha224", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 414:
  		test_ahash_speed("rmd128", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 415:
  		test_ahash_speed("rmd160", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 416:
  		test_ahash_speed("rmd256", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 417:
  		test_ahash_speed("rmd320", sec, generic_hash_speed_template);
  		if (mode > 400 && mode < 500) break;
  
  	case 499:
  		break;
3f3baf359   Jussi Kivilinna   crypto: tcrypt - ...
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
  	case 500:
  		test_acipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
  				   speed_template_32_40_48);
  		test_acipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
  				   speed_template_32_40_48);
  		test_acipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
  				   speed_template_32_48_64);
  		test_acipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
  				   speed_template_32_48_64);
  		test_acipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
de1975334   Nicolas Royer   crypto: atmel - a...
1868
1869
1870
1871
1872
1873
1874
1875
  		test_acipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("ofb(aes)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("ofb(aes)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
69d3150cf   Jussi Kivilinna   crypto: ctr - mak...
1876
1877
1878
1879
  		test_acipher_speed("rfc3686(ctr(aes))", ENCRYPT, sec, NULL, 0,
  				   speed_template_20_28_36);
  		test_acipher_speed("rfc3686(ctr(aes))", DECRYPT, sec, NULL, 0,
  				   speed_template_20_28_36);
3f3baf359   Jussi Kivilinna   crypto: tcrypt - ...
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
  		break;
  
  	case 501:
  		test_acipher_speed("ecb(des3_ede)", ENCRYPT, sec,
  				   des3_speed_template, DES3_SPEED_VECTORS,
  				   speed_template_24);
  		test_acipher_speed("ecb(des3_ede)", DECRYPT, sec,
  				   des3_speed_template, DES3_SPEED_VECTORS,
  				   speed_template_24);
  		test_acipher_speed("cbc(des3_ede)", ENCRYPT, sec,
  				   des3_speed_template, DES3_SPEED_VECTORS,
  				   speed_template_24);
  		test_acipher_speed("cbc(des3_ede)", DECRYPT, sec,
  				   des3_speed_template, DES3_SPEED_VECTORS,
  				   speed_template_24);
de1975334   Nicolas Royer   crypto: atmel - a...
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
  		test_acipher_speed("cfb(des3_ede)", ENCRYPT, sec,
  				   des3_speed_template, DES3_SPEED_VECTORS,
  				   speed_template_24);
  		test_acipher_speed("cfb(des3_ede)", DECRYPT, sec,
  				   des3_speed_template, DES3_SPEED_VECTORS,
  				   speed_template_24);
  		test_acipher_speed("ofb(des3_ede)", ENCRYPT, sec,
  				   des3_speed_template, DES3_SPEED_VECTORS,
  				   speed_template_24);
  		test_acipher_speed("ofb(des3_ede)", DECRYPT, sec,
  				   des3_speed_template, DES3_SPEED_VECTORS,
  				   speed_template_24);
3f3baf359   Jussi Kivilinna   crypto: tcrypt - ...
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
  		break;
  
  	case 502:
  		test_acipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
  				   speed_template_8);
  		test_acipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
  				   speed_template_8);
  		test_acipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
  				   speed_template_8);
  		test_acipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
  				   speed_template_8);
de1975334   Nicolas Royer   crypto: atmel - a...
1918
1919
1920
1921
1922
1923
1924
1925
  		test_acipher_speed("cfb(des)", ENCRYPT, sec, NULL, 0,
  				   speed_template_8);
  		test_acipher_speed("cfb(des)", DECRYPT, sec, NULL, 0,
  				   speed_template_8);
  		test_acipher_speed("ofb(des)", ENCRYPT, sec, NULL, 0,
  				   speed_template_8);
  		test_acipher_speed("ofb(des)", DECRYPT, sec, NULL, 0,
  				   speed_template_8);
3f3baf359   Jussi Kivilinna   crypto: tcrypt - ...
1926
  		break;
7fb7fe446   Jussi Kivilinna   crypto: tcrypt - ...
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
  	case 503:
  		test_acipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_32);
87aae4bfb   Jussi Kivilinna   crypto: tcrypt - ...
1940
1941
1942
1943
  		test_acipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
  				   speed_template_32_48);
  		test_acipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
  				   speed_template_32_48);
5209c07ac   Jussi Kivilinna   crypto: tcrypt - ...
1944
1945
1946
1947
  		test_acipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
  				   speed_template_32_64);
  		test_acipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
  				   speed_template_32_64);
7fb7fe446   Jussi Kivilinna   crypto: tcrypt - ...
1948
  		break;
107778b59   Johannes Goetzfried   crypto: twofish -...
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
  	case 504:
  		test_acipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_24_32);
  		test_acipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
  				   speed_template_32_40_48);
  		test_acipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
  				   speed_template_32_40_48);
  		test_acipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
  				   speed_template_32_48_64);
  		test_acipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
  				   speed_template_32_48_64);
  		break;
31b4cd290   Jussi Kivilinna   crypto: testmgr -...
1971
1972
1973
1974
  	case 505:
  		test_acipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
  				   speed_template_8);
  		break;
a2c582609   Johannes Goetzfried   crypto: testmgr -...
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
  	case 506:
  		test_acipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
  				   speed_template_8_16);
  		test_acipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
  				   speed_template_8_16);
  		test_acipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
  				   speed_template_8_16);
  		test_acipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
  				   speed_template_8_16);
  		test_acipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
  				   speed_template_8_16);
  		test_acipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
  				   speed_template_8_16);
  		break;
9b8b04051   Johannes Goetzfried   crypto: testmgr -...
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
  	case 507:
  		test_acipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
  				   speed_template_32_48);
  		test_acipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
  				   speed_template_32_48);
  		test_acipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
  				   speed_template_32_64);
  		test_acipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
  				   speed_template_32_64);
  		break;
bf9c51818   Jussi Kivilinna   crypto: tcrypt - ...
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
  	case 508:
  		test_acipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
  				   speed_template_16_32);
  		test_acipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
  				   speed_template_32_48);
  		test_acipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
  				   speed_template_32_48);
  		test_acipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
  				   speed_template_32_64);
  		test_acipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
  				   speed_template_32_64);
  		break;
ad8b7c3e9   Jussi Kivilinna   crypto: tcrypt - ...
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
  	case 509:
  		test_acipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
  				   speed_template_8_32);
  		test_acipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
  				   speed_template_8_32);
  		test_acipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
  				   speed_template_8_32);
  		test_acipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
  				   speed_template_8_32);
  		test_acipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
  				   speed_template_8_32);
  		test_acipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
  				   speed_template_8_32);
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2047
2048
2049
  	case 1000:
  		test_available();
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2050
  	}
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
2051
2052
  
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2053
  }
7be380f72   Herbert Xu   crypto: tcrypt - ...
2054
  static int do_alg_test(const char *alg, u32 type, u32 mask)
a873a5f1c   Steffen Klassert   crypto: tcrypt - ...
2055
  {
7be380f72   Herbert Xu   crypto: tcrypt - ...
2056
2057
  	return crypto_has_alg(alg, type, mask ?: CRYPTO_ALG_TYPE_MASK) ?
  	       0 : -ENOENT;
a873a5f1c   Steffen Klassert   crypto: tcrypt - ...
2058
  }
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
2059
  static int __init tcrypt_mod_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2060
  {
e3a4ea4fd   Mikko Herranen   [CRYPTO] tcrypt: ...
2061
  	int err = -ENOMEM;
f139cfa7c   Herbert Xu   crypto: tcrypt - ...
2062
  	int i;
e3a4ea4fd   Mikko Herranen   [CRYPTO] tcrypt: ...
2063

f139cfa7c   Herbert Xu   crypto: tcrypt - ...
2064
2065
2066
2067
2068
  	for (i = 0; i < TVMEMSIZE; i++) {
  		tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
  		if (!tvmem[i])
  			goto err_free_tv;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2069

a873a5f1c   Steffen Klassert   crypto: tcrypt - ...
2070
  	if (alg)
7be380f72   Herbert Xu   crypto: tcrypt - ...
2071
  		err = do_alg_test(alg, type, mask);
a873a5f1c   Steffen Klassert   crypto: tcrypt - ...
2072
2073
  	else
  		err = do_test(mode);
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
2074
2075
2076
2077
2078
  	if (err) {
  		printk(KERN_ERR "tcrypt: one or more tests failed!
  ");
  		goto err_free_tv;
  	}
14fdf477a   Michal Ludvig   [CRYPTO] tcrypt: ...
2079

4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
2080
2081
2082
2083
  	/* We intentionaly return -EAGAIN to prevent keeping the module,
  	 * unless we're running in fips mode. It does all its work from
  	 * init() and doesn't offer any runtime functionality, but in
  	 * the fips case, checking for a successful load is helpful.
14fdf477a   Michal Ludvig   [CRYPTO] tcrypt: ...
2084
2085
2086
  	 * => we don't need it in the memory, do we?
  	 *                                        -- mludvig
  	 */
4e033a6bc   Jarod Wilson   crypto: tcrypt - ...
2087
2088
  	if (!fips_enabled)
  		err = -EAGAIN;
e3a4ea4fd   Mikko Herranen   [CRYPTO] tcrypt: ...
2089

f139cfa7c   Herbert Xu   crypto: tcrypt - ...
2090
2091
2092
  err_free_tv:
  	for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
  		free_page((unsigned long)tvmem[i]);
e3a4ea4fd   Mikko Herranen   [CRYPTO] tcrypt: ...
2093
2094
  
  	return err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2095
2096
2097
2098
2099
2100
  }
  
  /*
   * If an init function is provided, an exit function must also be provided
   * to allow module unload.
   */
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
2101
  static void __exit tcrypt_mod_fini(void) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2102

3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
2103
2104
  module_init(tcrypt_mod_init);
  module_exit(tcrypt_mod_fini);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2105

a873a5f1c   Steffen Klassert   crypto: tcrypt - ...
2106
2107
  module_param(alg, charp, 0);
  module_param(type, uint, 0);
7be380f72   Herbert Xu   crypto: tcrypt - ...
2108
  module_param(mask, uint, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2109
  module_param(mode, int, 0);
ebfd9bcf1   Harald Welte   [CRYPTO]: Add cip...
2110
  module_param(sec, uint, 0);
6a17944ca   Herbert Xu   [CRYPTO]: Use CPU...
2111
2112
  MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
  		      "(defaults to zero which uses CPU cycles instead)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2113
2114
2115
2116
  
  MODULE_LICENSE("GPL");
  MODULE_DESCRIPTION("Quick & dirty crypto testing module");
  MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");