tcrypt.c 33.8 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.
 *
15
 * 2006-12-07 Added SHA384 HMAC and SHA512 HMAC tests
H
Harald Welte 已提交
16 17 18
 * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>)
 * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt
 *
L
Linus Torvalds 已提交
19 20
 */

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

/*
 * Need to kmalloc() memory for testing kmap().
 */
H
Harald Welte 已提交
39
#define TVMEMSIZE	16384
L
Linus Torvalds 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#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 已提交
62 63 64
/*
 * Used by test_cipher_speed()
 */
65
static unsigned int sec;
H
Harald Welte 已提交
66

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

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

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

	printk("\n");
}

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

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

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

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

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

	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 已提交
115 116 117
		return;
	}

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

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

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

127 128 129 130 131 132 133 134 135 136 137 138 139 140
		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 已提交
141

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

L
Linus Torvalds 已提交
341
			if (ret) {
342 343
				printk("%s () failed flags=%x\n", e,
				       desc.flags);
L
Linus Torvalds 已提交
344 345 346 347 348 349 350 351
				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]);
352 353 354
				printk("%s\n",
					memcmp(q, cipher_tv[i].result + temp,
						cipher_tv[i].tap[k]) ? "fail" :
L
Linus Torvalds 已提交
355 356 357 358 359 360 361
					"pass");
				temp += cipher_tv[i].tap[k];
			}
		}
	}

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

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

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

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

		if (ret)
			return ret;
	}

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

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

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

	local_bh_disable();
	local_irq_disable();

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

		if (ret)
			goto out;
	}

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

		start = get_cycles();
		if (enc)
421
			ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
422
		else
423
			ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
		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;
}

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

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

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

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

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

	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;
484 485 486 487 488 489
		for (j = 0; j < tcount; j++) {
			if (template[j].klen == speed[i].klen) {
				key = template[j].key;
				break;
			}
		}
H
Harald Welte 已提交
490 491
		p = (unsigned char *)tvmem + speed[i].klen;

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

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

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

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

out:
518
	crypto_free_blkcipher(tfm);
H
Harald Welte 已提交
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 544
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)
545 546 547 548
{
	struct scatterlist sg[1];
	unsigned long start, end;
	int bcount, pcount;
549 550 551 552
	int ret;

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

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

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

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 622
	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;
623 624
}

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

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

	local_bh_disable();
	local_irq_disable();

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

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

		start = get_cycles();

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

		end = get_cycles();

		cycles += end - start;
	}

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

683 684 685
	if (ret)
		return ret;

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

689
	return 0;
690 691
}

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

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

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

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

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

	if (crypto_hash_digestsize(tfm) > sizeof(output)) {
715
		printk("digestsize(%u) > outputbuffer(%zu)\n",
716
		       crypto_hash_digestsize(tfm), sizeof(output));
717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732
		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)
733 734
			ret = test_hash_jiffies(&desc, tvmem, speed[i].blen,
						speed[i].plen, output, sec);
735
		else
736 737 738 739 740 741 742
			ret = test_hash_cycles(&desc, tvmem, speed[i].blen,
					       speed[i].plen, output);

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

out:
746
	crypto_free_hash(tfm);
747 748
}

749
static void test_deflate(void)
L
Linus Torvalds 已提交
750 751 752
{
	unsigned int i;
	char result[COMP_BUF_SIZE];
753
	struct crypto_comp *tfm;
L
Linus Torvalds 已提交
754 755 756 757 758 759 760 761 762 763 764 765 766
	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);
767
	tv = (void *)tvmem;
L
Linus Torvalds 已提交
768 769 770 771 772 773 774 775 776

	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;
777

L
Linus Torvalds 已提交
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
		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);
804
	tv = (void *)tvmem;
L
Linus Torvalds 已提交
805 806 807

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

L
Linus Torvalds 已提交
809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824
		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:
825
	crypto_free_comp(tfm);
L
Linus Torvalds 已提交
826 827
}

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

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

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

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

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

L
Linus Torvalds 已提交
849
		//DES
850 851 852 853 854 855 856 857
		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);
858

L
Linus Torvalds 已提交
859
		//DES3_EDE
860 861 862 863
		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);
864

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

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

L
Linus Torvalds 已提交
869
		//BLOWFISH
870 871 872 873 874 875 876 877
		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);
878

L
Linus Torvalds 已提交
879
		//TWOFISH
880 881 882 883 884 885 886 887
		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);
888

L
Linus Torvalds 已提交
889
		//SERPENT
890 891 892 893
		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);
894

L
Linus Torvalds 已提交
895
		//TNEPRES
896 897 898 899
		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 已提交
900 901

		//AES
902 903 904 905 906 907 908 909
		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);
R
Rik Snel 已提交
910 911 912 913
		test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
			    AES_LRW_ENC_TEST_VECTORS);
		test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
			    AES_LRW_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
914 915

		//CAST5
916 917 918 919
		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);
920

L
Linus Torvalds 已提交
921
		//CAST6
922 923 924 925
		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 已提交
926 927

		//ARC4
928 929 930 931
		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 已提交
932 933

		//TEA
934 935 936 937
		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 已提交
938 939 940


		//XTEA
941 942 943 944
		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 已提交
945 946

		//KHAZAD
947 948 949 950
		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 已提交
951 952

		//ANUBIS
953 954 955 956 957 958 959 960
		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 已提交
961

A
Aaron Grothe 已提交
962
		//XETA
963 964 965 966
		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 已提交
967

L
Linus Torvalds 已提交
968 969 970 971 972 973 974 975 976
		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();
977
		test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
978 979 980 981 982 983
		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);
984 985 986 987
		test_hash("hmac(sha384)", hmac_sha384_tv_template,
			  HMAC_SHA384_TEST_VECTORS);
		test_hash("hmac(sha512)", hmac_sha512_tv_template,
			  HMAC_SHA512_TEST_VECTORS);
L
Linus Torvalds 已提交
988

989 990 991
		test_hash("xcbc(aes)", aes_xcbc128_tv_template,
			  XCBC_AES_TEST_VECTORS);

L
Linus Torvalds 已提交
992 993 994 995 996 997 998 999 1000 1001 1002 1003
		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:
1004 1005 1006 1007 1008 1009 1010 1011
		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 已提交
1012 1013 1014
		break;

	case 4:
1015 1016 1017 1018
		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 已提交
1019 1020 1021 1022 1023
		break;

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

L
Linus Torvalds 已提交
1025 1026 1027
	case 6:
		test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
		break;
1028

L
Linus Torvalds 已提交
1029
	case 7:
1030 1031 1032 1033 1034 1035 1036 1037
		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 已提交
1038 1039 1040
		break;

	case 8:
1041 1042 1043 1044 1045 1046 1047 1048
		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 已提交
1049
		break;
1050

L
Linus Torvalds 已提交
1051
	case 9:
1052 1053 1054 1055
		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 已提交
1056 1057 1058
		break;

	case 10:
1059 1060 1061 1062 1063 1064 1065 1066
		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);
R
Rik Snel 已提交
1067 1068 1069 1070
		test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
			    AES_LRW_ENC_TEST_VECTORS);
		test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
			    AES_LRW_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1071 1072 1073 1074 1075
		break;

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

L
Linus Torvalds 已提交
1077 1078 1079 1080 1081 1082 1083 1084 1085
	case 12:
		test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
		break;

	case 13:
		test_deflate();
		break;

	case 14:
1086 1087 1088 1089
		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 已提交
1090 1091 1092
		break;

	case 15:
1093 1094 1095 1096
		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 已提交
1097 1098 1099
		break;

	case 16:
1100 1101 1102 1103
		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 已提交
1104 1105 1106 1107 1108 1109 1110
		break;

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

	case 18:
1111
		test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
L
Linus Torvalds 已提交
1112 1113 1114
		break;

	case 19:
1115 1116 1117 1118
		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 已提交
1119 1120 1121
		break;

	case 20:
1122 1123 1124 1125
		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 已提交
1126 1127 1128
		break;

	case 21:
1129 1130 1131 1132
		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 已提交
1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147
		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:
1148 1149 1150 1151
		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 已提交
1152 1153 1154
		break;

	case 26:
1155 1156 1157 1158 1159 1160 1161 1162
		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 已提交
1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176
		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 已提交
1177 1178
		
	case 30:
1179 1180 1181 1182
		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 已提交
1183
		break;
L
Linus Torvalds 已提交
1184 1185

	case 100:
1186 1187
		test_hash("hmac(md5)", hmac_md5_tv_template,
			  HMAC_MD5_TEST_VECTORS);
L
Linus Torvalds 已提交
1188
		break;
1189

L
Linus Torvalds 已提交
1190
	case 101:
1191 1192
		test_hash("hmac(sha1)", hmac_sha1_tv_template,
			  HMAC_SHA1_TEST_VECTORS);
L
Linus Torvalds 已提交
1193
		break;
1194

L
Linus Torvalds 已提交
1195
	case 102:
1196 1197
		test_hash("hmac(sha256)", hmac_sha256_tv_template,
			  HMAC_SHA256_TEST_VECTORS);
L
Linus Torvalds 已提交
1198 1199
		break;

1200 1201 1202 1203 1204 1205 1206 1207 1208 1209
	case 103:
		test_hash("hmac(sha384)", hmac_sha384_tv_template,
			  HMAC_SHA384_TEST_VECTORS);
		break;

	case 104:
		test_hash("hmac(sha512)", hmac_sha512_tv_template,
			  HMAC_SHA512_TEST_VECTORS);
		break;

L
Linus Torvalds 已提交
1210

H
Harald Welte 已提交
1211
	case 200:
1212
		test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
1213
				  aes_speed_template);
1214
		test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
1215
				  aes_speed_template);
1216
		test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
1217
				  aes_speed_template);
1218
		test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
1219
				  aes_speed_template);
R
Rik Snel 已提交
1220 1221 1222 1223
		test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
				  aes_lrw_speed_template);
		test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
				  aes_lrw_speed_template);
H
Harald Welte 已提交
1224 1225 1226
		break;

	case 201:
1227
		test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
1228 1229 1230
				  des3_ede_enc_tv_template,
				  DES3_EDE_ENC_TEST_VECTORS,
				  des3_ede_speed_template);
1231
		test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
1232 1233 1234
				  des3_ede_dec_tv_template,
				  DES3_EDE_DEC_TEST_VECTORS,
				  des3_ede_speed_template);
1235
		test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
1236 1237 1238
				  des3_ede_enc_tv_template,
				  DES3_EDE_ENC_TEST_VECTORS,
				  des3_ede_speed_template);
1239
		test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
1240 1241 1242
				  des3_ede_dec_tv_template,
				  DES3_EDE_DEC_TEST_VECTORS,
				  des3_ede_speed_template);
H
Harald Welte 已提交
1243 1244 1245
		break;

	case 202:
1246
		test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
1247
				  twofish_speed_template);
1248
		test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
1249
				  twofish_speed_template);
1250
		test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
1251
				  twofish_speed_template);
1252
		test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
1253
				  twofish_speed_template);
H
Harald Welte 已提交
1254 1255 1256
		break;

	case 203:
1257
		test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
1258
				  blowfish_speed_template);
1259
		test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
1260
				  blowfish_speed_template);
1261
		test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
1262
				  blowfish_speed_template);
1263
		test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
1264
				  blowfish_speed_template);
H
Harald Welte 已提交
1265 1266 1267
		break;

	case 204:
1268
		test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
1269
				  des_speed_template);
1270
		test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
1271
				  des_speed_template);
1272
		test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
1273
				  des_speed_template);
1274
		test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
1275
				  des_speed_template);
H
Harald Welte 已提交
1276 1277
		break;

1278 1279 1280 1281
	case 300:
		/* fall through */

	case 301:
1282
		test_hash_speed("md4", sec, generic_hash_speed_template);
1283 1284 1285
		if (mode > 300 && mode < 400) break;

	case 302:
1286
		test_hash_speed("md5", sec, generic_hash_speed_template);
1287 1288 1289
		if (mode > 300 && mode < 400) break;

	case 303:
1290
		test_hash_speed("sha1", sec, generic_hash_speed_template);
1291 1292 1293
		if (mode > 300 && mode < 400) break;

	case 304:
1294
		test_hash_speed("sha256", sec, generic_hash_speed_template);
1295 1296 1297
		if (mode > 300 && mode < 400) break;

	case 305:
1298
		test_hash_speed("sha384", sec, generic_hash_speed_template);
1299 1300 1301
		if (mode > 300 && mode < 400) break;

	case 306:
1302
		test_hash_speed("sha512", sec, generic_hash_speed_template);
1303 1304 1305
		if (mode > 300 && mode < 400) break;

	case 307:
1306
		test_hash_speed("wp256", sec, generic_hash_speed_template);
1307 1308 1309
		if (mode > 300 && mode < 400) break;

	case 308:
1310
		test_hash_speed("wp384", sec, generic_hash_speed_template);
1311 1312 1313
		if (mode > 300 && mode < 400) break;

	case 309:
1314
		test_hash_speed("wp512", sec, generic_hash_speed_template);
1315 1316 1317
		if (mode > 300 && mode < 400) break;

	case 310:
1318
		test_hash_speed("tgr128", sec, generic_hash_speed_template);
1319 1320 1321
		if (mode > 300 && mode < 400) break;

	case 311:
1322
		test_hash_speed("tgr160", sec, generic_hash_speed_template);
1323 1324 1325
		if (mode > 300 && mode < 400) break;

	case 312:
1326
		test_hash_speed("tgr192", sec, generic_hash_speed_template);
1327 1328 1329 1330 1331
		if (mode > 300 && mode < 400) break;

	case 399:
		break;

L
Linus Torvalds 已提交
1332 1333 1334
	case 1000:
		test_available();
		break;
1335

L
Linus Torvalds 已提交
1336 1337 1338 1339 1340 1341 1342
	default:
		/* useful for debugging */
		printk("not testing anything\n");
		break;
	}
}

1343
static int __init init(void)
L
Linus Torvalds 已提交
1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358
{
	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);
1359 1360 1361 1362 1363 1364 1365 1366

	/* 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 已提交
1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378
}

/*
 * 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 已提交
1379
module_param(sec, uint, 0);
1380 1381
MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
		      "(defaults to zero which uses CPU cycles instead)");
L
Linus Torvalds 已提交
1382 1383 1384 1385

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