tcrypt.c 32.7 KB
Newer Older
1
/*
L
Linus Torvalds 已提交
2 3 4 5 6 7 8 9 10 11
 * 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>
 *
 * 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
12
 * Software Foundation; either version 2 of the License, or (at your option)
L
Linus Torvalds 已提交
13 14
 * any later version.
 *
H
Harald Welte 已提交
15 16 17
 * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>)
 * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt
 *
L
Linus Torvalds 已提交
18 19
 */

20
#include <linux/err.h>
L
Linus Torvalds 已提交
21 22 23 24
#include <linux/init.h>
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/slab.h>
25
#include <linux/scatterlist.h>
L
Linus Torvalds 已提交
26 27 28 29
#include <linux/string.h>
#include <linux/crypto.h>
#include <linux/highmem.h>
#include <linux/moduleparam.h>
H
Harald Welte 已提交
30
#include <linux/jiffies.h>
31 32
#include <linux/timex.h>
#include <linux/interrupt.h>
L
Linus Torvalds 已提交
33 34 35 36 37
#include "tcrypt.h"

/*
 * Need to kmalloc() memory for testing kmap().
 */
H
Harald Welte 已提交
38
#define TVMEMSIZE	16384
L
Linus Torvalds 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
#define XBUFSIZE	32768

/*
 * Indexes into the xbuf to simulate cross-page access.
 */
#define IDX1		37
#define IDX2		32400
#define IDX3		1
#define IDX4		8193
#define IDX5		22222
#define IDX6		17101
#define IDX7		27333
#define IDX8		3000

/*
* Used by test_cipher()
*/
#define ENCRYPT 1
#define DECRYPT 0

static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };

H
Harald Welte 已提交
61 62 63
/*
 * Used by test_cipher_speed()
 */
64
static unsigned int sec;
H
Harald Welte 已提交
65

L
Linus Torvalds 已提交
66 67 68 69 70 71
static int mode;
static char *xbuf;
static char *tvmem;

static char *check[] = {
	"des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
72 73
	"twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6",
	"arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
A
Aaron Grothe 已提交
74
	"khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", NULL
L
Linus Torvalds 已提交
75 76
};

77
static void hexdump(unsigned char *buf, unsigned int len)
L
Linus Torvalds 已提交
78 79 80 81 82 83 84
{
	while (len--)
		printk("%02x", *buf++);

	printk("\n");
}

85 86
static void test_hash(char *algo, struct hash_testvec *template,
		      unsigned int tcount)
L
Linus Torvalds 已提交
87
{
88 89 90
	unsigned int i, j, k, temp;
	struct scatterlist sg[8];
	char result[64];
91 92
	struct crypto_hash *tfm;
	struct hash_desc desc;
93 94
	struct hash_testvec *hash_tv;
	unsigned int tsize;
95
	int ret;
96 97 98 99

	printk("\ntesting %s\n", algo);

	tsize = sizeof(struct hash_testvec);
L
Linus Torvalds 已提交
100
	tsize *= tcount;
101

L
Linus Torvalds 已提交
102 103 104 105 106 107
	if (tsize > TVMEMSIZE) {
		printk("template (%u) too big for tvmem (%u)\n", tsize, TVMEMSIZE);
		return;
	}

	memcpy(tvmem, template, tsize);
108
	hash_tv = (void *)tvmem;
109 110 111 112 113

	tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
	if (IS_ERR(tfm)) {
		printk("failed to load transform for %s: %ld\n", algo,
		       PTR_ERR(tfm));
L
Linus Torvalds 已提交
114 115 116
		return;
	}

117 118 119
	desc.tfm = tfm;
	desc.flags = 0;

L
Linus Torvalds 已提交
120
	for (i = 0; i < tcount; i++) {
121 122
		printk("test %u:\n", i + 1);
		memset(result, 0, 64);
L
Linus Torvalds 已提交
123

124
		sg_set_buf(&sg[0], hash_tv[i].plaintext, hash_tv[i].psize);
L
Linus Torvalds 已提交
125

126 127 128 129 130 131 132 133 134 135 136 137 138 139
		if (hash_tv[i].ksize) {
			ret = crypto_hash_setkey(tfm, hash_tv[i].key,
						 hash_tv[i].ksize);
			if (ret) {
				printk("setkey() failed ret=%d\n", ret);
				goto out;
			}
		}

		ret = crypto_hash_digest(&desc, sg, hash_tv[i].psize, result);
		if (ret) {
			printk("digest () failed ret=%d\n", ret);
			goto out;
		}
L
Linus Torvalds 已提交
140

141
		hexdump(result, crypto_hash_digestsize(tfm));
L
Linus Torvalds 已提交
142
		printk("%s\n",
143
		       memcmp(result, hash_tv[i].digest,
144
			      crypto_hash_digestsize(tfm)) ?
145
		       "fail" : "pass");
L
Linus Torvalds 已提交
146 147
	}

148
	printk("testing %s across pages\n", algo);
L
Linus Torvalds 已提交
149 150

	/* setup the dummy buffer first */
151
	memset(xbuf, 0, XBUFSIZE);
L
Linus Torvalds 已提交
152 153 154 155 156

	j = 0;
	for (i = 0; i < tcount; i++) {
		if (hash_tv[i].np) {
			j++;
157 158
			printk("test %u:\n", j);
			memset(result, 0, 64);
L
Linus Torvalds 已提交
159 160 161

			temp = 0;
			for (k = 0; k < hash_tv[i].np; k++) {
162 163 164
				memcpy(&xbuf[IDX[k]],
				       hash_tv[i].plaintext + temp,
				       hash_tv[i].tap[k]);
L
Linus Torvalds 已提交
165
				temp += hash_tv[i].tap[k];
166 167
				sg_set_buf(&sg[k], &xbuf[IDX[k]],
					    hash_tv[i].tap[k]);
L
Linus Torvalds 已提交
168 169
			}

170 171 172
			if (hash_tv[i].ksize) {
				ret = crypto_hash_setkey(tfm, hash_tv[i].key,
							 hash_tv[i].ksize);
173

174 175 176 177
				if (ret) {
					printk("setkey() failed ret=%d\n", ret);
					goto out;
				}
L
Linus Torvalds 已提交
178 179
			}

180 181 182 183 184 185
			ret = crypto_hash_digest(&desc, sg, hash_tv[i].psize,
						 result);
			if (ret) {
				printk("digest () failed ret=%d\n", ret);
				goto out;
			}
186

187
			hexdump(result, crypto_hash_digestsize(tfm));
L
Linus Torvalds 已提交
188
			printk("%s\n",
189 190
			       memcmp(result, hash_tv[i].digest,
				      crypto_hash_digestsize(tfm)) ?
191
			       "fail" : "pass");
L
Linus Torvalds 已提交
192 193
		}
	}
194

L
Linus Torvalds 已提交
195
out:
196
	crypto_free_hash(tfm);
L
Linus Torvalds 已提交
197 198
}

199
static void test_cipher(char *algo, int enc,
200
			struct cipher_testvec *template, unsigned int tcount)
L
Linus Torvalds 已提交
201 202 203
{
	unsigned int ret, i, j, k, temp;
	unsigned int tsize;
204 205
	unsigned int iv_len;
	unsigned int len;
206
	char *q;
207
	struct crypto_blkcipher *tfm;
L
Linus Torvalds 已提交
208 209
	char *key;
	struct cipher_testvec *cipher_tv;
210
	struct blkcipher_desc desc;
L
Linus Torvalds 已提交
211
	struct scatterlist sg[8];
212
	const char *e;
L
Linus Torvalds 已提交
213 214

	if (enc == ENCRYPT)
215
	        e = "encryption";
L
Linus Torvalds 已提交
216
	else
217
		e = "decryption";
L
Linus Torvalds 已提交
218

219
	printk("\ntesting %s %s\n", algo, e);
L
Linus Torvalds 已提交
220

221
	tsize = sizeof (struct cipher_testvec);
L
Linus Torvalds 已提交
222
	tsize *= tcount;
223

L
Linus Torvalds 已提交
224 225 226 227 228 229 230
	if (tsize > TVMEMSIZE) {
		printk("template (%u) too big for tvmem (%u)\n", tsize,
		       TVMEMSIZE);
		return;
	}

	memcpy(tvmem, template, tsize);
231 232
	cipher_tv = (void *)tvmem;

233
	tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
L
Linus Torvalds 已提交
234

235 236 237
	if (IS_ERR(tfm)) {
		printk("failed to load transform for %s: %ld\n", algo,
		       PTR_ERR(tfm));
L
Linus Torvalds 已提交
238 239
		return;
	}
240 241
	desc.tfm = tfm;
	desc.flags = 0;
242

L
Linus Torvalds 已提交
243 244 245
	j = 0;
	for (i = 0; i < tcount; i++) {
		if (!(cipher_tv[i].np)) {
246
			j++;
L
Linus Torvalds 已提交
247 248 249
			printk("test %u (%d bit key):\n",
			j, cipher_tv[i].klen * 8);

250
			crypto_blkcipher_clear_flags(tfm, ~0);
251
			if (cipher_tv[i].wk)
252 253
				crypto_blkcipher_set_flags(
					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
L
Linus Torvalds 已提交
254
			key = cipher_tv[i].key;
255

256 257
			ret = crypto_blkcipher_setkey(tfm, key,
						      cipher_tv[i].klen);
L
Linus Torvalds 已提交
258
			if (ret) {
259 260
				printk("setkey() failed flags=%x\n",
				       crypto_blkcipher_get_flags(tfm));
261

L
Linus Torvalds 已提交
262 263
				if (!cipher_tv[i].fail)
					goto out;
264
			}
L
Linus Torvalds 已提交
265

266 267
			sg_set_buf(&sg[0], cipher_tv[i].input,
				   cipher_tv[i].ilen);
268

269 270 271 272
			iv_len = crypto_blkcipher_ivsize(tfm);
			if (iv_len)
				crypto_blkcipher_set_iv(tfm, cipher_tv[i].iv,
							iv_len);
273

274 275 276 277
			len = cipher_tv[i].ilen;
			ret = enc ?
				crypto_blkcipher_encrypt(&desc, sg, sg, len) :
				crypto_blkcipher_decrypt(&desc, sg, sg, len);
278

L
Linus Torvalds 已提交
279
			if (ret) {
280 281
				printk("%s () failed flags=%x\n", e,
				       desc.flags);
L
Linus Torvalds 已提交
282
				goto out;
283 284
			}

L
Linus Torvalds 已提交
285 286
			q = kmap(sg[0].page) + sg[0].offset;
			hexdump(q, cipher_tv[i].rlen);
287 288 289 290

			printk("%s\n",
			       memcmp(q, cipher_tv[i].result,
				      cipher_tv[i].rlen) ? "fail" : "pass");
L
Linus Torvalds 已提交
291 292
		}
	}
293

294
	printk("\ntesting %s %s across pages (chunking)\n", algo, e);
L
Linus Torvalds 已提交
295
	memset(xbuf, 0, XBUFSIZE);
296

L
Linus Torvalds 已提交
297 298 299
	j = 0;
	for (i = 0; i < tcount; i++) {
		if (cipher_tv[i].np) {
300
			j++;
L
Linus Torvalds 已提交
301 302 303
			printk("test %u (%d bit key):\n",
			j, cipher_tv[i].klen * 8);

304
			crypto_blkcipher_clear_flags(tfm, ~0);
305
			if (cipher_tv[i].wk)
306 307
				crypto_blkcipher_set_flags(
					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
L
Linus Torvalds 已提交
308
			key = cipher_tv[i].key;
309

310 311
			ret = crypto_blkcipher_setkey(tfm, key,
						      cipher_tv[i].klen);
L
Linus Torvalds 已提交
312
			if (ret) {
313 314
				printk("setkey() failed flags=%x\n",
				       crypto_blkcipher_get_flags(tfm));
315

L
Linus Torvalds 已提交
316 317 318 319 320 321
				if (!cipher_tv[i].fail)
					goto out;
			}

			temp = 0;
			for (k = 0; k < cipher_tv[i].np; k++) {
322 323 324
				memcpy(&xbuf[IDX[k]],
				       cipher_tv[i].input + temp,
				       cipher_tv[i].tap[k]);
L
Linus Torvalds 已提交
325
				temp += cipher_tv[i].tap[k];
326 327
				sg_set_buf(&sg[k], &xbuf[IDX[k]],
					   cipher_tv[i].tap[k]);
L
Linus Torvalds 已提交
328
			}
329

330 331 332 333
			iv_len = crypto_blkcipher_ivsize(tfm);
			if (iv_len)
				crypto_blkcipher_set_iv(tfm, cipher_tv[i].iv,
							iv_len);
334

335 336 337 338
			len = cipher_tv[i].ilen;
			ret = enc ?
				crypto_blkcipher_encrypt(&desc, sg, sg, len) :
				crypto_blkcipher_decrypt(&desc, sg, sg, len);
339

L
Linus Torvalds 已提交
340
			if (ret) {
341 342
				printk("%s () failed flags=%x\n", e,
				       desc.flags);
L
Linus Torvalds 已提交
343 344 345 346 347 348 349 350
				goto out;
			}

			temp = 0;
			for (k = 0; k < cipher_tv[i].np; k++) {
				printk("page %u\n", k);
				q = kmap(sg[k].page) + sg[k].offset;
				hexdump(q, cipher_tv[i].tap[k]);
351 352 353
				printk("%s\n",
					memcmp(q, cipher_tv[i].result + temp,
						cipher_tv[i].tap[k]) ? "fail" :
L
Linus Torvalds 已提交
354 355 356 357 358 359 360
					"pass");
				temp += cipher_tv[i].tap[k];
			}
		}
	}

out:
361
	crypto_free_blkcipher(tfm);
L
Linus Torvalds 已提交
362 363
}

364
static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc, char *p,
365 366
			       int blen, int sec)
{
367
	struct scatterlist sg[1];
368 369 370 371
	unsigned long start, end;
	int bcount;
	int ret;

372
	sg_set_buf(sg, p, blen);
373 374 375 376

	for (start = jiffies, end = start + sec * HZ, bcount = 0;
	     time_before(jiffies, end); bcount++) {
		if (enc)
377
			ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
378
		else
379
			ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
380 381 382 383 384 385 386 387 388 389

		if (ret)
			return ret;
	}

	printk("%d operations in %d seconds (%ld bytes)\n",
	       bcount, sec, (long)bcount * blen);
	return 0;
}

390
static int test_cipher_cycles(struct blkcipher_desc *desc, int enc, char *p,
391 392
			      int blen)
{
393
	struct scatterlist sg[1];
394 395 396 397
	unsigned long cycles = 0;
	int ret = 0;
	int i;

398
	sg_set_buf(sg, p, blen);
399 400 401 402 403 404 405

	local_bh_disable();
	local_irq_disable();

	/* Warm-up run. */
	for (i = 0; i < 4; i++) {
		if (enc)
406
			ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
407
		else
408
			ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
409 410 411 412 413 414 415 416 417 418 419

		if (ret)
			goto out;
	}

	/* The real thing. */
	for (i = 0; i < 8; i++) {
		cycles_t start, end;

		start = get_cycles();
		if (enc)
420
			ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
421
		else
422
			ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441
		end = get_cycles();

		if (ret)
			goto out;

		cycles += end - start;
	}

out:
	local_irq_enable();
	local_bh_enable();

	if (ret == 0)
		printk("1 operation in %lu cycles (%d bytes)\n",
		       (cycles + 4) / 8, blen);

	return ret;
}

442
static void test_cipher_speed(char *algo, int enc, unsigned int sec,
443 444
			      struct cipher_testvec *template,
			      unsigned int tcount, struct cipher_speed *speed)
H
Harald Welte 已提交
445
{
446
	unsigned int ret, i, j, iv_len;
H
Harald Welte 已提交
447
	unsigned char *key, *p, iv[128];
448 449 450
	struct crypto_blkcipher *tfm;
	struct blkcipher_desc desc;
	const char *e;
H
Harald Welte 已提交
451 452 453 454 455 456

	if (enc == ENCRYPT)
	        e = "encryption";
	else
		e = "decryption";

457
	printk("\ntesting speed of %s %s\n", algo, e);
H
Harald Welte 已提交
458

459
	tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
H
Harald Welte 已提交
460

461 462 463
	if (IS_ERR(tfm)) {
		printk("failed to load transform for %s: %ld\n", algo,
		       PTR_ERR(tfm));
H
Harald Welte 已提交
464 465
		return;
	}
466 467
	desc.tfm = tfm;
	desc.flags = 0;
H
Harald Welte 已提交
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482

	for (i = 0; speed[i].klen != 0; i++) {
		if ((speed[i].blen + speed[i].klen) > TVMEMSIZE) {
			printk("template (%u) too big for tvmem (%u)\n",
			       speed[i].blen + speed[i].klen, TVMEMSIZE);
			goto out;
		}

		printk("test %u (%d bit key, %d byte blocks): ", i,
		       speed[i].klen * 8, speed[i].blen);

		memset(tvmem, 0xff, speed[i].klen + speed[i].blen);

		/* set key, plain text and IV */
		key = (unsigned char *)tvmem;
483 484 485 486 487 488
		for (j = 0; j < tcount; j++) {
			if (template[j].klen == speed[i].klen) {
				key = template[j].key;
				break;
			}
		}
H
Harald Welte 已提交
489 490
		p = (unsigned char *)tvmem + speed[i].klen;

491
		ret = crypto_blkcipher_setkey(tfm, key, speed[i].klen);
H
Harald Welte 已提交
492
		if (ret) {
493 494
			printk("setkey() failed flags=%x\n",
			       crypto_blkcipher_get_flags(tfm));
H
Harald Welte 已提交
495 496 497
			goto out;
		}

498 499
		iv_len = crypto_blkcipher_ivsize(tfm);
		if (iv_len) {
H
Harald Welte 已提交
500
			memset(&iv, 0xff, iv_len);
501
			crypto_blkcipher_set_iv(tfm, iv, iv_len);
H
Harald Welte 已提交
502 503
		}

504
		if (sec)
505
			ret = test_cipher_jiffies(&desc, enc, p, speed[i].blen,
506 507
						  sec);
		else
508
			ret = test_cipher_cycles(&desc, enc, p, speed[i].blen);
H
Harald Welte 已提交
509

510
		if (ret) {
511
			printk("%s() failed flags=%x\n", e, desc.flags);
512
			break;
H
Harald Welte 已提交
513 514 515 516
		}
	}

out:
517
	crypto_free_blkcipher(tfm);
H
Harald Welte 已提交
518 519
}

520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
static int test_hash_jiffies_digest(struct hash_desc *desc, char *p, int blen,
				    char *out, int sec)
{
	struct scatterlist sg[1];
	unsigned long start, end;
	int bcount;
	int ret;

	for (start = jiffies, end = start + sec * HZ, bcount = 0;
	     time_before(jiffies, end); bcount++) {
		sg_set_buf(sg, p, blen);
		ret = crypto_hash_digest(desc, sg, blen, out);
		if (ret)
			return ret;
	}

	printk("%6u opers/sec, %9lu bytes/sec\n",
	       bcount / sec, ((long)bcount * blen) / sec);

	return 0;
}

static int test_hash_jiffies(struct hash_desc *desc, char *p, int blen,
			     int plen, char *out, int sec)
544 545 546 547
{
	struct scatterlist sg[1];
	unsigned long start, end;
	int bcount, pcount;
548 549 550 551
	int ret;

	if (plen == blen)
		return test_hash_jiffies_digest(desc, p, blen, out, sec);
552 553 554

	for (start = jiffies, end = start + sec * HZ, bcount = 0;
	     time_before(jiffies, end); bcount++) {
555 556 557
		ret = crypto_hash_init(desc);
		if (ret)
			return ret;
558 559
		for (pcount = 0; pcount < blen; pcount += plen) {
			sg_set_buf(sg, p + pcount, plen);
560 561 562
			ret = crypto_hash_update(desc, sg, plen);
			if (ret)
				return ret;
563 564
		}
		/* we assume there is enough space in 'out' for the result */
565 566 567
		ret = crypto_hash_final(desc, out);
		if (ret)
			return ret;
568 569 570 571 572
	}

	printk("%6u opers/sec, %9lu bytes/sec\n",
	       bcount / sec, ((long)bcount * blen) / sec);

573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621
	return 0;
}

static int test_hash_cycles_digest(struct hash_desc *desc, char *p, int blen,
				   char *out)
{
	struct scatterlist sg[1];
	unsigned long cycles = 0;
	int i;
	int ret;

	local_bh_disable();
	local_irq_disable();

	/* Warm-up run. */
	for (i = 0; i < 4; i++) {
		sg_set_buf(sg, p, blen);
		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();

		sg_set_buf(sg, p, blen);
		ret = crypto_hash_digest(desc, sg, blen, out);
		if (ret)
			goto out;

		end = get_cycles();

		cycles += end - start;
	}

out:
	local_irq_enable();
	local_bh_enable();

	if (ret)
		return ret;

	printk("%6lu cycles/operation, %4lu cycles/byte\n",
	       cycles / 8, cycles / (8 * blen));

	return 0;
622 623
}

624 625
static int test_hash_cycles(struct hash_desc *desc, char *p, int blen,
			    int plen, char *out)
626 627 628 629
{
	struct scatterlist sg[1];
	unsigned long cycles = 0;
	int i, pcount;
630 631 632 633
	int ret;

	if (plen == blen)
		return test_hash_cycles_digest(desc, p, blen, out);
634 635 636 637 638 639

	local_bh_disable();
	local_irq_disable();

	/* Warm-up run. */
	for (i = 0; i < 4; i++) {
640 641 642
		ret = crypto_hash_init(desc);
		if (ret)
			goto out;
643 644
		for (pcount = 0; pcount < blen; pcount += plen) {
			sg_set_buf(sg, p + pcount, plen);
645 646 647
			ret = crypto_hash_update(desc, sg, plen);
			if (ret)
				goto out;
648
		}
649 650 651
		crypto_hash_final(desc, out);
		if (ret)
			goto out;
652 653 654 655 656 657 658 659
	}

	/* The real thing. */
	for (i = 0; i < 8; i++) {
		cycles_t start, end;

		start = get_cycles();

660 661 662
		ret = crypto_hash_init(desc);
		if (ret)
			goto out;
663 664
		for (pcount = 0; pcount < blen; pcount += plen) {
			sg_set_buf(sg, p + pcount, plen);
665 666 667
			ret = crypto_hash_update(desc, sg, plen);
			if (ret)
				goto out;
668
		}
669 670 671
		ret = crypto_hash_final(desc, out);
		if (ret)
			goto out;
672 673 674 675 676 677

		end = get_cycles();

		cycles += end - start;
	}

678
out:
679 680 681
	local_irq_enable();
	local_bh_enable();

682 683 684
	if (ret)
		return ret;

685 686 687
	printk("%6lu cycles/operation, %4lu cycles/byte\n",
	       cycles / 8, cycles / (8 * blen));

688
	return 0;
689 690
}

691 692
static void test_hash_speed(char *algo, unsigned int sec,
			      struct hash_speed *speed)
693
{
694 695
	struct crypto_hash *tfm;
	struct hash_desc desc;
696 697
	char output[1024];
	int i;
698
	int ret;
699 700 701

	printk("\ntesting speed of %s\n", algo);

702
	tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
703

704 705 706
	if (IS_ERR(tfm)) {
		printk("failed to load transform for %s: %ld\n", algo,
		       PTR_ERR(tfm));
707 708 709
		return;
	}

710 711 712 713
	desc.tfm = tfm;
	desc.flags = 0;

	if (crypto_hash_digestsize(tfm) > sizeof(output)) {
714
		printk("digestsize(%u) > outputbuffer(%zu)\n",
715
		       crypto_hash_digestsize(tfm), sizeof(output));
716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731
		goto out;
	}

	for (i = 0; speed[i].blen != 0; i++) {
		if (speed[i].blen > TVMEMSIZE) {
			printk("template (%u) too big for tvmem (%u)\n",
			       speed[i].blen, TVMEMSIZE);
			goto out;
		}

		printk("test%3u (%5u byte blocks,%5u bytes per update,%4u updates): ",
		       i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);

		memset(tvmem, 0xff, speed[i].blen);

		if (sec)
732 733
			ret = test_hash_jiffies(&desc, tvmem, speed[i].blen,
						speed[i].plen, output, sec);
734
		else
735 736 737 738 739 740 741
			ret = test_hash_cycles(&desc, tvmem, speed[i].blen,
					       speed[i].plen, output);

		if (ret) {
			printk("hashing failed ret=%d\n", ret);
			break;
		}
742 743 744
	}

out:
745
	crypto_free_hash(tfm);
746 747
}

748
static void test_deflate(void)
L
Linus Torvalds 已提交
749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765
{
	unsigned int i;
	char result[COMP_BUF_SIZE];
	struct crypto_tfm *tfm;
	struct comp_testvec *tv;
	unsigned int tsize;

	printk("\ntesting deflate compression\n");

	tsize = sizeof (deflate_comp_tv_template);
	if (tsize > TVMEMSIZE) {
		printk("template (%u) too big for tvmem (%u)\n", tsize,
		       TVMEMSIZE);
		return;
	}

	memcpy(tvmem, deflate_comp_tv_template, tsize);
766
	tv = (void *)tvmem;
L
Linus Torvalds 已提交
767 768 769 770 771 772 773 774 775

	tfm = crypto_alloc_tfm("deflate", 0);
	if (tfm == NULL) {
		printk("failed to load transform for deflate\n");
		return;
	}

	for (i = 0; i < DEFLATE_COMP_TEST_VECTORS; i++) {
		int ilen, ret, dlen = COMP_BUF_SIZE;
776

L
Linus Torvalds 已提交
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
		printk("test %u:\n", i + 1);
		memset(result, 0, sizeof (result));

		ilen = tv[i].inlen;
		ret = crypto_comp_compress(tfm, tv[i].input,
		                           ilen, result, &dlen);
		if (ret) {
			printk("fail: ret=%d\n", ret);
			continue;
		}
		hexdump(result, dlen);
		printk("%s (ratio %d:%d)\n",
		       memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
		       ilen, dlen);
	}

	printk("\ntesting deflate decompression\n");

	tsize = sizeof (deflate_decomp_tv_template);
	if (tsize > TVMEMSIZE) {
		printk("template (%u) too big for tvmem (%u)\n", tsize,
		       TVMEMSIZE);
		goto out;
	}

	memcpy(tvmem, deflate_decomp_tv_template, tsize);
803
	tv = (void *)tvmem;
L
Linus Torvalds 已提交
804 805 806

	for (i = 0; i < DEFLATE_DECOMP_TEST_VECTORS; i++) {
		int ilen, ret, dlen = COMP_BUF_SIZE;
807

L
Linus Torvalds 已提交
808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826
		printk("test %u:\n", i + 1);
		memset(result, 0, sizeof (result));

		ilen = tv[i].inlen;
		ret = crypto_comp_decompress(tfm, tv[i].input,
		                             ilen, result, &dlen);
		if (ret) {
			printk("fail: ret=%d\n", ret);
			continue;
		}
		hexdump(result, dlen);
		printk("%s (ratio %d:%d)\n",
		       memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
		       ilen, dlen);
	}
out:
	crypto_free_tfm(tfm);
}

827
static void test_available(void)
L
Linus Torvalds 已提交
828 829
{
	char **name = check;
830

L
Linus Torvalds 已提交
831 832 833 834 835
	while (*name) {
		printk("alg %s ", *name);
		printk((crypto_alg_available(*name, 0)) ?
			"found\n" : "not found\n");
		name++;
836
	}
L
Linus Torvalds 已提交
837 838
}

839
static void do_test(void)
L
Linus Torvalds 已提交
840 841 842 843 844
{
	switch (mode) {

	case 0:
		test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
845

L
Linus Torvalds 已提交
846
		test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
847

L
Linus Torvalds 已提交
848
		//DES
849 850 851 852 853 854 855 856
		test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
			    DES_ENC_TEST_VECTORS);
		test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
			    DES_DEC_TEST_VECTORS);
		test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
			    DES_CBC_ENC_TEST_VECTORS);
		test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
			    DES_CBC_DEC_TEST_VECTORS);
857

L
Linus Torvalds 已提交
858
		//DES3_EDE
859 860 861 862
		test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
			    DES3_EDE_ENC_TEST_VECTORS);
		test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
			    DES3_EDE_DEC_TEST_VECTORS);
863

L
Linus Torvalds 已提交
864
		test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
865

L
Linus Torvalds 已提交
866
		test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
867

L
Linus Torvalds 已提交
868
		//BLOWFISH
869 870 871 872 873 874 875 876
		test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
			    BF_ENC_TEST_VECTORS);
		test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
			    BF_DEC_TEST_VECTORS);
		test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
			    BF_CBC_ENC_TEST_VECTORS);
		test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
			    BF_CBC_DEC_TEST_VECTORS);
877

L
Linus Torvalds 已提交
878
		//TWOFISH
879 880 881 882 883 884 885 886
		test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
			    TF_ENC_TEST_VECTORS);
		test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
			    TF_DEC_TEST_VECTORS);
		test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
			    TF_CBC_ENC_TEST_VECTORS);
		test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
			    TF_CBC_DEC_TEST_VECTORS);
887

L
Linus Torvalds 已提交
888
		//SERPENT
889 890 891 892
		test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
			    SERPENT_ENC_TEST_VECTORS);
		test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
			    SERPENT_DEC_TEST_VECTORS);
893

L
Linus Torvalds 已提交
894
		//TNEPRES
895 896 897 898
		test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
			    TNEPRES_ENC_TEST_VECTORS);
		test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
			    TNEPRES_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
899 900

		//AES
901 902 903 904 905 906 907 908
		test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
			    AES_ENC_TEST_VECTORS);
		test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
			    AES_DEC_TEST_VECTORS);
		test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
			    AES_CBC_ENC_TEST_VECTORS);
		test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
			    AES_CBC_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
909 910

		//CAST5
911 912 913 914
		test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
			    CAST5_ENC_TEST_VECTORS);
		test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
			    CAST5_DEC_TEST_VECTORS);
915

L
Linus Torvalds 已提交
916
		//CAST6
917 918 919 920
		test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
			    CAST6_ENC_TEST_VECTORS);
		test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
			    CAST6_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
921 922

		//ARC4
923 924 925 926
		test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
			    ARC4_ENC_TEST_VECTORS);
		test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
			    ARC4_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
927 928

		//TEA
929 930 931 932
		test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
			    TEA_ENC_TEST_VECTORS);
		test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
			    TEA_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
933 934 935


		//XTEA
936 937 938 939
		test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
			    XTEA_ENC_TEST_VECTORS);
		test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
			    XTEA_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
940 941

		//KHAZAD
942 943 944 945
		test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
			    KHAZAD_ENC_TEST_VECTORS);
		test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
			    KHAZAD_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
946 947

		//ANUBIS
948 949 950 951 952 953 954 955
		test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
			    ANUBIS_ENC_TEST_VECTORS);
		test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
			    ANUBIS_DEC_TEST_VECTORS);
		test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
			    ANUBIS_CBC_ENC_TEST_VECTORS);
		test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
			    ANUBIS_CBC_ENC_TEST_VECTORS);
L
Linus Torvalds 已提交
956

A
Aaron Grothe 已提交
957
		//XETA
958 959 960 961
		test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
			    XETA_ENC_TEST_VECTORS);
		test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
			    XETA_DEC_TEST_VECTORS);
A
Aaron Grothe 已提交
962

L
Linus Torvalds 已提交
963 964 965 966 967 968 969 970 971
		test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
		test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
		test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
		test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
		test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
		test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
		test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
		test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
		test_deflate();
972
		test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
973 974 975 976 977 978
		test_hash("hmac(md5)", hmac_md5_tv_template,
			  HMAC_MD5_TEST_VECTORS);
		test_hash("hmac(sha1)", hmac_sha1_tv_template,
			  HMAC_SHA1_TEST_VECTORS);
		test_hash("hmac(sha256)", hmac_sha256_tv_template,
			  HMAC_SHA256_TEST_VECTORS);
L
Linus Torvalds 已提交
979 980 981 982 983 984 985 986 987 988 989 990 991

		test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
		break;

	case 1:
		test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
		break;

	case 2:
		test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
		break;

	case 3:
992 993 994 995 996 997 998 999
		test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
			    DES_ENC_TEST_VECTORS);
		test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
			    DES_DEC_TEST_VECTORS);
		test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
			    DES_CBC_ENC_TEST_VECTORS);
		test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
			    DES_CBC_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1000 1001 1002
		break;

	case 4:
1003 1004 1005 1006
		test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
			    DES3_EDE_ENC_TEST_VECTORS);
		test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
			    DES3_EDE_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1007 1008 1009 1010 1011
		break;

	case 5:
		test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
		break;
1012

L
Linus Torvalds 已提交
1013 1014 1015
	case 6:
		test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
		break;
1016

L
Linus Torvalds 已提交
1017
	case 7:
1018 1019 1020 1021 1022 1023 1024 1025
		test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
			    BF_ENC_TEST_VECTORS);
		test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
			    BF_DEC_TEST_VECTORS);
		test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
			    BF_CBC_ENC_TEST_VECTORS);
		test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
			    BF_CBC_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1026 1027 1028
		break;

	case 8:
1029 1030 1031 1032 1033 1034 1035 1036
		test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
			    TF_ENC_TEST_VECTORS);
		test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
			    TF_DEC_TEST_VECTORS);
		test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
			    TF_CBC_ENC_TEST_VECTORS);
		test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
			    TF_CBC_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1037
		break;
1038

L
Linus Torvalds 已提交
1039
	case 9:
1040 1041 1042 1043
		test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
			    SERPENT_ENC_TEST_VECTORS);
		test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
			    SERPENT_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1044 1045 1046
		break;

	case 10:
1047 1048 1049 1050 1051 1052 1053 1054
		test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
			    AES_ENC_TEST_VECTORS);
		test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
			    AES_DEC_TEST_VECTORS);
		test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
			    AES_CBC_ENC_TEST_VECTORS);
		test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
			    AES_CBC_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1055 1056 1057 1058 1059
		break;

	case 11:
		test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
		break;
1060

L
Linus Torvalds 已提交
1061 1062 1063 1064 1065 1066 1067 1068 1069
	case 12:
		test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
		break;

	case 13:
		test_deflate();
		break;

	case 14:
1070 1071 1072 1073
		test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
			    CAST5_ENC_TEST_VECTORS);
		test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
			    CAST5_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1074 1075 1076
		break;

	case 15:
1077 1078 1079 1080
		test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
			    CAST6_ENC_TEST_VECTORS);
		test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
			    CAST6_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1081 1082 1083
		break;

	case 16:
1084 1085 1086 1087
		test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
			    ARC4_ENC_TEST_VECTORS);
		test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
			    ARC4_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1088 1089 1090 1091 1092 1093 1094
		break;

	case 17:
		test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
		break;

	case 18:
1095
		test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
L
Linus Torvalds 已提交
1096 1097 1098
		break;

	case 19:
1099 1100 1101 1102
		test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
			    TEA_ENC_TEST_VECTORS);
		test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
			    TEA_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1103 1104 1105
		break;

	case 20:
1106 1107 1108 1109
		test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
			    XTEA_ENC_TEST_VECTORS);
		test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
			    XTEA_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1110 1111 1112
		break;

	case 21:
1113 1114 1115 1116
		test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
			    KHAZAD_ENC_TEST_VECTORS);
		test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
			    KHAZAD_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131
		break;

	case 22:
		test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
		break;

	case 23:
		test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
		break;

	case 24:
		test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
		break;

	case 25:
1132 1133 1134 1135
		test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
			    TNEPRES_ENC_TEST_VECTORS);
		test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
			    TNEPRES_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1136 1137 1138
		break;

	case 26:
1139 1140 1141 1142 1143 1144 1145 1146
		test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
			    ANUBIS_ENC_TEST_VECTORS);
		test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
			    ANUBIS_DEC_TEST_VECTORS);
		test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
			    ANUBIS_CBC_ENC_TEST_VECTORS);
		test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
			    ANUBIS_CBC_ENC_TEST_VECTORS);
L
Linus Torvalds 已提交
1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160
		break;

	case 27:
		test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
		break;

	case 28:

		test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
		break;

	case 29:
		test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
		break;
A
Aaron Grothe 已提交
1161 1162
		
	case 30:
1163 1164 1165 1166
		test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
			    XETA_ENC_TEST_VECTORS);
		test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
			    XETA_DEC_TEST_VECTORS);
A
Aaron Grothe 已提交
1167
		break;
L
Linus Torvalds 已提交
1168 1169

	case 100:
1170 1171
		test_hash("hmac(md5)", hmac_md5_tv_template,
			  HMAC_MD5_TEST_VECTORS);
L
Linus Torvalds 已提交
1172
		break;
1173

L
Linus Torvalds 已提交
1174
	case 101:
1175 1176
		test_hash("hmac(sha1)", hmac_sha1_tv_template,
			  HMAC_SHA1_TEST_VECTORS);
L
Linus Torvalds 已提交
1177
		break;
1178

L
Linus Torvalds 已提交
1179
	case 102:
1180 1181
		test_hash("hmac(sha256)", hmac_sha256_tv_template,
			  HMAC_SHA256_TEST_VECTORS);
L
Linus Torvalds 已提交
1182 1183 1184
		break;


H
Harald Welte 已提交
1185
	case 200:
1186
		test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
1187
				  aes_speed_template);
1188
		test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
1189
				  aes_speed_template);
1190
		test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
1191
				  aes_speed_template);
1192
		test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
1193
				  aes_speed_template);
H
Harald Welte 已提交
1194 1195 1196
		break;

	case 201:
1197
		test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
1198 1199 1200
				  des3_ede_enc_tv_template,
				  DES3_EDE_ENC_TEST_VECTORS,
				  des3_ede_speed_template);
1201
		test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
1202 1203 1204
				  des3_ede_dec_tv_template,
				  DES3_EDE_DEC_TEST_VECTORS,
				  des3_ede_speed_template);
1205
		test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
1206 1207 1208
				  des3_ede_enc_tv_template,
				  DES3_EDE_ENC_TEST_VECTORS,
				  des3_ede_speed_template);
1209
		test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
1210 1211 1212
				  des3_ede_dec_tv_template,
				  DES3_EDE_DEC_TEST_VECTORS,
				  des3_ede_speed_template);
H
Harald Welte 已提交
1213 1214 1215
		break;

	case 202:
1216
		test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
1217
				  twofish_speed_template);
1218
		test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
1219
				  twofish_speed_template);
1220
		test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
1221
				  twofish_speed_template);
1222
		test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
1223
				  twofish_speed_template);
H
Harald Welte 已提交
1224 1225 1226
		break;

	case 203:
1227
		test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
1228
				  blowfish_speed_template);
1229
		test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
1230
				  blowfish_speed_template);
1231
		test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
1232
				  blowfish_speed_template);
1233
		test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
1234
				  blowfish_speed_template);
H
Harald Welte 已提交
1235 1236 1237
		break;

	case 204:
1238
		test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
1239
				  des_speed_template);
1240
		test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
1241
				  des_speed_template);
1242
		test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
1243
				  des_speed_template);
1244
		test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
1245
				  des_speed_template);
H
Harald Welte 已提交
1246 1247
		break;

1248 1249 1250 1251
	case 300:
		/* fall through */

	case 301:
1252
		test_hash_speed("md4", sec, generic_hash_speed_template);
1253 1254 1255
		if (mode > 300 && mode < 400) break;

	case 302:
1256
		test_hash_speed("md5", sec, generic_hash_speed_template);
1257 1258 1259
		if (mode > 300 && mode < 400) break;

	case 303:
1260
		test_hash_speed("sha1", sec, generic_hash_speed_template);
1261 1262 1263
		if (mode > 300 && mode < 400) break;

	case 304:
1264
		test_hash_speed("sha256", sec, generic_hash_speed_template);
1265 1266 1267
		if (mode > 300 && mode < 400) break;

	case 305:
1268
		test_hash_speed("sha384", sec, generic_hash_speed_template);
1269 1270 1271
		if (mode > 300 && mode < 400) break;

	case 306:
1272
		test_hash_speed("sha512", sec, generic_hash_speed_template);
1273 1274 1275
		if (mode > 300 && mode < 400) break;

	case 307:
1276
		test_hash_speed("wp256", sec, generic_hash_speed_template);
1277 1278 1279
		if (mode > 300 && mode < 400) break;

	case 308:
1280
		test_hash_speed("wp384", sec, generic_hash_speed_template);
1281 1282 1283
		if (mode > 300 && mode < 400) break;

	case 309:
1284
		test_hash_speed("wp512", sec, generic_hash_speed_template);
1285 1286 1287
		if (mode > 300 && mode < 400) break;

	case 310:
1288
		test_hash_speed("tgr128", sec, generic_hash_speed_template);
1289 1290 1291
		if (mode > 300 && mode < 400) break;

	case 311:
1292
		test_hash_speed("tgr160", sec, generic_hash_speed_template);
1293 1294 1295
		if (mode > 300 && mode < 400) break;

	case 312:
1296
		test_hash_speed("tgr192", sec, generic_hash_speed_template);
1297 1298 1299 1300 1301
		if (mode > 300 && mode < 400) break;

	case 399:
		break;

L
Linus Torvalds 已提交
1302 1303 1304
	case 1000:
		test_available();
		break;
1305

L
Linus Torvalds 已提交
1306 1307 1308 1309 1310 1311 1312
	default:
		/* useful for debugging */
		printk("not testing anything\n");
		break;
	}
}

1313
static int __init init(void)
L
Linus Torvalds 已提交
1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328
{
	tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL);
	if (tvmem == NULL)
		return -ENOMEM;

	xbuf = kmalloc(XBUFSIZE, GFP_KERNEL);
	if (xbuf == NULL) {
		kfree(tvmem);
		return -ENOMEM;
	}

	do_test();

	kfree(xbuf);
	kfree(tvmem);
1329 1330 1331 1332 1333 1334 1335 1336

	/* We intentionaly return -EAGAIN to prevent keeping
	 * the module. It does all its work from init()
	 * and doesn't offer any runtime functionality 
	 * => we don't need it in the memory, do we?
	 *                                        -- mludvig
	 */
	return -EAGAIN;
L
Linus Torvalds 已提交
1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348
}

/*
 * If an init function is provided, an exit function must also be provided
 * to allow module unload.
 */
static void __exit fini(void) { }

module_init(init);
module_exit(fini);

module_param(mode, int, 0);
H
Harald Welte 已提交
1349
module_param(sec, uint, 0);
1350 1351
MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
		      "(defaults to zero which uses CPU cycles instead)");
L
Linus Torvalds 已提交
1352 1353 1354 1355

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Quick & dirty crypto testing module");
MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");