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

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

/*
 * Need to kmalloc() memory for testing kmap().
 */
H
Harald Welte 已提交
40
#define TVMEMSIZE	16384
L
Linus Torvalds 已提交
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

61 62 63 64 65
struct tcrypt_result {
	struct completion completion;
	int err;
};

L
Linus Torvalds 已提交
66 67
static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };

H
Harald Welte 已提交
68 69 70
/*
 * Used by test_cipher_speed()
 */
71
static unsigned int sec;
H
Harald Welte 已提交
72

L
Linus Torvalds 已提交
73 74 75 76 77
static int mode;
static char *xbuf;
static char *tvmem;

static char *check[] = {
78 79 80
	"des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
	"blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
	"cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
81
	"arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
82
	"khazad", "wp512", "wp384", "wp256", "tnepres", "xeta",  "fcrypt",
83
	"camellia", "seed", "salsa20", NULL
L
Linus Torvalds 已提交
84 85
};

86
static void hexdump(unsigned char *buf, unsigned int len)
L
Linus Torvalds 已提交
87 88 89 90 91 92 93
{
	while (len--)
		printk("%02x", *buf++);

	printk("\n");
}

94 95 96 97 98 99 100 101 102 103 104
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);
}

105 106
static void test_hash(char *algo, struct hash_testvec *template,
		      unsigned int tcount)
L
Linus Torvalds 已提交
107
{
108 109 110
	unsigned int i, j, k, temp;
	struct scatterlist sg[8];
	char result[64];
111 112
	struct crypto_hash *tfm;
	struct hash_desc desc;
113 114
	struct hash_testvec *hash_tv;
	unsigned int tsize;
115
	int ret;
116 117 118 119

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

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

L
Linus Torvalds 已提交
122 123 124 125 126 127
	if (tsize > TVMEMSIZE) {
		printk("template (%u) too big for tvmem (%u)\n", tsize, TVMEMSIZE);
		return;
	}

	memcpy(tvmem, template, tsize);
128
	hash_tv = (void *)tvmem;
129 130 131 132 133

	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 已提交
134 135 136
		return;
	}

137 138 139
	desc.tfm = tfm;
	desc.flags = 0;

L
Linus Torvalds 已提交
140
	for (i = 0; i < tcount; i++) {
141 142
		printk("test %u:\n", i + 1);
		memset(result, 0, 64);
L
Linus Torvalds 已提交
143

144
		sg_init_one(&sg[0], hash_tv[i].plaintext, hash_tv[i].psize);
L
Linus Torvalds 已提交
145

146 147 148 149 150 151 152 153 154 155 156 157 158 159
		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 已提交
160

161
		hexdump(result, crypto_hash_digestsize(tfm));
L
Linus Torvalds 已提交
162
		printk("%s\n",
163
		       memcmp(result, hash_tv[i].digest,
164
			      crypto_hash_digestsize(tfm)) ?
165
		       "fail" : "pass");
L
Linus Torvalds 已提交
166 167
	}

168
	printk("testing %s across pages\n", algo);
L
Linus Torvalds 已提交
169 170

	/* setup the dummy buffer first */
171
	memset(xbuf, 0, XBUFSIZE);
L
Linus Torvalds 已提交
172 173 174 175 176

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

			temp = 0;
181
			sg_init_table(sg, hash_tv[i].np);
L
Linus Torvalds 已提交
182
			for (k = 0; k < hash_tv[i].np; k++) {
183 184 185
				memcpy(&xbuf[IDX[k]],
				       hash_tv[i].plaintext + temp,
				       hash_tv[i].tap[k]);
L
Linus Torvalds 已提交
186
				temp += hash_tv[i].tap[k];
187 188
				sg_set_buf(&sg[k], &xbuf[IDX[k]],
					    hash_tv[i].tap[k]);
L
Linus Torvalds 已提交
189 190
			}

191 192 193
			if (hash_tv[i].ksize) {
				ret = crypto_hash_setkey(tfm, hash_tv[i].key,
							 hash_tv[i].ksize);
194

195 196 197 198
				if (ret) {
					printk("setkey() failed ret=%d\n", ret);
					goto out;
				}
L
Linus Torvalds 已提交
199 200
			}

201 202 203 204 205 206
			ret = crypto_hash_digest(&desc, sg, hash_tv[i].psize,
						 result);
			if (ret) {
				printk("digest () failed ret=%d\n", ret);
				goto out;
			}
207

208
			hexdump(result, crypto_hash_digestsize(tfm));
L
Linus Torvalds 已提交
209
			printk("%s\n",
210 211
			       memcmp(result, hash_tv[i].digest,
				      crypto_hash_digestsize(tfm)) ?
212
			       "fail" : "pass");
L
Linus Torvalds 已提交
213 214
		}
	}
215

L
Linus Torvalds 已提交
216
out:
217
	crypto_free_hash(tfm);
L
Linus Torvalds 已提交
218 219
}

220
static void test_cipher(char *algo, int enc,
221
			struct cipher_testvec *template, unsigned int tcount)
L
Linus Torvalds 已提交
222 223 224
{
	unsigned int ret, i, j, k, temp;
	unsigned int tsize;
225
	char *q;
226
	struct crypto_ablkcipher *tfm;
L
Linus Torvalds 已提交
227 228
	char *key;
	struct cipher_testvec *cipher_tv;
229
	struct ablkcipher_request *req;
L
Linus Torvalds 已提交
230
	struct scatterlist sg[8];
231
	const char *e;
232
	struct tcrypt_result result;
L
Linus Torvalds 已提交
233 234

	if (enc == ENCRYPT)
235
	        e = "encryption";
L
Linus Torvalds 已提交
236
	else
237
		e = "decryption";
L
Linus Torvalds 已提交
238

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

241
	tsize = sizeof (struct cipher_testvec);
L
Linus Torvalds 已提交
242
	tsize *= tcount;
243

L
Linus Torvalds 已提交
244 245 246 247 248 249 250
	if (tsize > TVMEMSIZE) {
		printk("template (%u) too big for tvmem (%u)\n", tsize,
		       TVMEMSIZE);
		return;
	}

	memcpy(tvmem, template, tsize);
251 252
	cipher_tv = (void *)tvmem;

253 254 255
	init_completion(&result.completion);

	tfm = crypto_alloc_ablkcipher(algo, 0, 0);
L
Linus Torvalds 已提交
256

257 258 259
	if (IS_ERR(tfm)) {
		printk("failed to load transform for %s: %ld\n", algo,
		       PTR_ERR(tfm));
L
Linus Torvalds 已提交
260 261
		return;
	}
262 263 264 265 266 267 268 269 270

	req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
	if (!req) {
		printk("failed to allocate request for %s\n", algo);
		goto out;
	}

	ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
					tcrypt_complete, &result);
271

L
Linus Torvalds 已提交
272 273 274
	j = 0;
	for (i = 0; i < tcount; i++) {
		if (!(cipher_tv[i].np)) {
275
			j++;
L
Linus Torvalds 已提交
276 277 278
			printk("test %u (%d bit key):\n",
			j, cipher_tv[i].klen * 8);

279
			crypto_ablkcipher_clear_flags(tfm, ~0);
280
			if (cipher_tv[i].wk)
281
				crypto_ablkcipher_set_flags(
282
					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
L
Linus Torvalds 已提交
283
			key = cipher_tv[i].key;
284

285 286
			ret = crypto_ablkcipher_setkey(tfm, key,
						       cipher_tv[i].klen);
L
Linus Torvalds 已提交
287
			if (ret) {
288
				printk("setkey() failed flags=%x\n",
289
				       crypto_ablkcipher_get_flags(tfm));
290

L
Linus Torvalds 已提交
291 292
				if (!cipher_tv[i].fail)
					goto out;
293
			}
L
Linus Torvalds 已提交
294

295 296
			sg_init_one(&sg[0], cipher_tv[i].input,
				    cipher_tv[i].ilen);
297

298 299 300
			ablkcipher_request_set_crypt(req, sg, sg,
						     cipher_tv[i].ilen,
						     cipher_tv[i].iv);
301

302
			ret = enc ?
303 304
				crypto_ablkcipher_encrypt(req) :
				crypto_ablkcipher_decrypt(req);
305

306 307 308 309 310 311 312 313 314 315 316 317 318 319
			switch (ret) {
			case 0:
				break;
			case -EINPROGRESS:
			case -EBUSY:
				ret = wait_for_completion_interruptible(
					&result.completion);
				if (!ret && !((ret = result.err))) {
					INIT_COMPLETION(result.completion);
					break;
				}
				/* fall through */
			default:
				printk("%s () failed err=%d\n", e, -ret);
L
Linus Torvalds 已提交
320
				goto out;
321 322
			}

J
Jens Axboe 已提交
323
			q = kmap(sg_page(&sg[0])) + sg[0].offset;
L
Linus Torvalds 已提交
324
			hexdump(q, cipher_tv[i].rlen);
325 326 327 328

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

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

L
Linus Torvalds 已提交
335 336 337
	j = 0;
	for (i = 0; i < tcount; i++) {
		if (cipher_tv[i].np) {
338
			j++;
L
Linus Torvalds 已提交
339 340 341
			printk("test %u (%d bit key):\n",
			j, cipher_tv[i].klen * 8);

342
			crypto_ablkcipher_clear_flags(tfm, ~0);
343
			if (cipher_tv[i].wk)
344
				crypto_ablkcipher_set_flags(
345
					tfm, CRYPTO_TFM_REQ_WEAK_KEY);
L
Linus Torvalds 已提交
346
			key = cipher_tv[i].key;
347

348 349
			ret = crypto_ablkcipher_setkey(tfm, key,
						       cipher_tv[i].klen);
L
Linus Torvalds 已提交
350
			if (ret) {
351
				printk("setkey() failed flags=%x\n",
352
				       crypto_ablkcipher_get_flags(tfm));
353

L
Linus Torvalds 已提交
354 355 356 357 358
				if (!cipher_tv[i].fail)
					goto out;
			}

			temp = 0;
359
			sg_init_table(sg, cipher_tv[i].np);
L
Linus Torvalds 已提交
360
			for (k = 0; k < cipher_tv[i].np; k++) {
361 362 363
				memcpy(&xbuf[IDX[k]],
				       cipher_tv[i].input + temp,
				       cipher_tv[i].tap[k]);
L
Linus Torvalds 已提交
364
				temp += cipher_tv[i].tap[k];
365 366
				sg_set_buf(&sg[k], &xbuf[IDX[k]],
					   cipher_tv[i].tap[k]);
L
Linus Torvalds 已提交
367
			}
368

369 370 371
			ablkcipher_request_set_crypt(req, sg, sg,
						     cipher_tv[i].ilen,
						     cipher_tv[i].iv);
372

373
			ret = enc ?
374 375
				crypto_ablkcipher_encrypt(req) :
				crypto_ablkcipher_decrypt(req);
376

377 378 379 380 381 382 383 384 385 386 387 388 389 390
			switch (ret) {
			case 0:
				break;
			case -EINPROGRESS:
			case -EBUSY:
				ret = wait_for_completion_interruptible(
					&result.completion);
				if (!ret && !((ret = result.err))) {
					INIT_COMPLETION(result.completion);
					break;
				}
				/* fall through */
			default:
				printk("%s () failed err=%d\n", e, -ret);
L
Linus Torvalds 已提交
391 392 393 394 395 396
				goto out;
			}

			temp = 0;
			for (k = 0; k < cipher_tv[i].np; k++) {
				printk("page %u\n", k);
J
Jens Axboe 已提交
397
				q = kmap(sg_page(&sg[k])) + sg[k].offset;
L
Linus Torvalds 已提交
398
				hexdump(q, cipher_tv[i].tap[k]);
399 400 401
				printk("%s\n",
					memcmp(q, cipher_tv[i].result + temp,
						cipher_tv[i].tap[k]) ? "fail" :
L
Linus Torvalds 已提交
402 403 404 405 406 407 408
					"pass");
				temp += cipher_tv[i].tap[k];
			}
		}
	}

out:
409 410
	crypto_free_ablkcipher(tfm);
	ablkcipher_request_free(req);
L
Linus Torvalds 已提交
411 412
}

413
static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc, char *p,
414 415
			       int blen, int sec)
{
416
	struct scatterlist sg[1];
417 418 419 420
	unsigned long start, end;
	int bcount;
	int ret;

421
	sg_init_one(sg, p, blen);
422 423 424 425

	for (start = jiffies, end = start + sec * HZ, bcount = 0;
	     time_before(jiffies, end); bcount++) {
		if (enc)
426
			ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
427
		else
428
			ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
429 430 431 432 433 434 435 436 437 438

		if (ret)
			return ret;
	}

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

439
static int test_cipher_cycles(struct blkcipher_desc *desc, int enc, char *p,
440 441
			      int blen)
{
442
	struct scatterlist sg[1];
443 444 445 446
	unsigned long cycles = 0;
	int ret = 0;
	int i;

447
	sg_init_one(sg, p, blen);
448 449 450 451 452 453 454

	local_bh_disable();
	local_irq_disable();

	/* Warm-up run. */
	for (i = 0; i < 4; i++) {
		if (enc)
455
			ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
456
		else
457
			ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
458 459 460 461 462 463 464 465 466 467 468

		if (ret)
			goto out;
	}

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

		start = get_cycles();
		if (enc)
469
			ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
470
		else
471
			ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490
		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;
}

491
static void test_cipher_speed(char *algo, int enc, unsigned int sec,
492 493
			      struct cipher_testvec *template,
			      unsigned int tcount, struct cipher_speed *speed)
H
Harald Welte 已提交
494
{
495
	unsigned int ret, i, j, iv_len;
H
Harald Welte 已提交
496
	unsigned char *key, *p, iv[128];
497 498 499
	struct crypto_blkcipher *tfm;
	struct blkcipher_desc desc;
	const char *e;
H
Harald Welte 已提交
500 501 502 503 504 505

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

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

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

510 511 512
	if (IS_ERR(tfm)) {
		printk("failed to load transform for %s: %ld\n", algo,
		       PTR_ERR(tfm));
H
Harald Welte 已提交
513 514
		return;
	}
515 516
	desc.tfm = tfm;
	desc.flags = 0;
H
Harald Welte 已提交
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531

	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;
532 533 534 535 536 537
		for (j = 0; j < tcount; j++) {
			if (template[j].klen == speed[i].klen) {
				key = template[j].key;
				break;
			}
		}
H
Harald Welte 已提交
538 539
		p = (unsigned char *)tvmem + speed[i].klen;

540
		ret = crypto_blkcipher_setkey(tfm, key, speed[i].klen);
H
Harald Welte 已提交
541
		if (ret) {
542 543
			printk("setkey() failed flags=%x\n",
			       crypto_blkcipher_get_flags(tfm));
H
Harald Welte 已提交
544 545 546
			goto out;
		}

547 548
		iv_len = crypto_blkcipher_ivsize(tfm);
		if (iv_len) {
H
Harald Welte 已提交
549
			memset(&iv, 0xff, iv_len);
550
			crypto_blkcipher_set_iv(tfm, iv, iv_len);
H
Harald Welte 已提交
551 552
		}

553
		if (sec)
554
			ret = test_cipher_jiffies(&desc, enc, p, speed[i].blen,
555 556
						  sec);
		else
557
			ret = test_cipher_cycles(&desc, enc, p, speed[i].blen);
H
Harald Welte 已提交
558

559
		if (ret) {
560
			printk("%s() failed flags=%x\n", e, desc.flags);
561
			break;
H
Harald Welte 已提交
562 563 564 565
		}
	}

out:
566
	crypto_free_blkcipher(tfm);
H
Harald Welte 已提交
567 568
}

569 570 571 572 573 574 575 576
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;

577 578
	sg_init_table(sg, 1);

579 580
	for (start = jiffies, end = start + sec * HZ, bcount = 0;
	     time_before(jiffies, end); bcount++) {
581
		sg_set_buf(sg, p, blen);
582 583 584 585 586 587 588 589 590 591 592 593 594
		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)
595 596 597 598
{
	struct scatterlist sg[1];
	unsigned long start, end;
	int bcount, pcount;
599 600 601 602
	int ret;

	if (plen == blen)
		return test_hash_jiffies_digest(desc, p, blen, out, sec);
603

604 605
	sg_init_table(sg, 1);

606 607
	for (start = jiffies, end = start + sec * HZ, bcount = 0;
	     time_before(jiffies, end); bcount++) {
608 609 610
		ret = crypto_hash_init(desc);
		if (ret)
			return ret;
611
		for (pcount = 0; pcount < blen; pcount += plen) {
612
			sg_set_buf(sg, p + pcount, plen);
613 614 615
			ret = crypto_hash_update(desc, sg, plen);
			if (ret)
				return ret;
616 617
		}
		/* we assume there is enough space in 'out' for the result */
618 619 620
		ret = crypto_hash_final(desc, out);
		if (ret)
			return ret;
621 622 623 624 625
	}

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

626 627 628 629 630 631 632 633 634 635 636
	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;

637 638
	sg_init_table(sg, 1);

639 640 641 642 643
	local_bh_disable();
	local_irq_disable();

	/* Warm-up run. */
	for (i = 0; i < 4; i++) {
644
		sg_set_buf(sg, p, blen);
645 646 647 648 649 650 651 652 653 654 655
		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();

656
		sg_set_buf(sg, p, blen);
657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676
		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;
677 678
}

679 680
static int test_hash_cycles(struct hash_desc *desc, char *p, int blen,
			    int plen, char *out)
681 682 683 684
{
	struct scatterlist sg[1];
	unsigned long cycles = 0;
	int i, pcount;
685 686 687 688
	int ret;

	if (plen == blen)
		return test_hash_cycles_digest(desc, p, blen, out);
689

690 691
	sg_init_table(sg, 1);

692 693 694 695 696
	local_bh_disable();
	local_irq_disable();

	/* Warm-up run. */
	for (i = 0; i < 4; i++) {
697 698 699
		ret = crypto_hash_init(desc);
		if (ret)
			goto out;
700
		for (pcount = 0; pcount < blen; pcount += plen) {
701
			sg_set_buf(sg, p + pcount, plen);
702 703 704
			ret = crypto_hash_update(desc, sg, plen);
			if (ret)
				goto out;
705
		}
706
		ret = crypto_hash_final(desc, out);
707 708
		if (ret)
			goto out;
709 710 711 712 713 714 715 716
	}

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

		start = get_cycles();

717 718 719
		ret = crypto_hash_init(desc);
		if (ret)
			goto out;
720
		for (pcount = 0; pcount < blen; pcount += plen) {
721
			sg_set_buf(sg, p + pcount, plen);
722 723 724
			ret = crypto_hash_update(desc, sg, plen);
			if (ret)
				goto out;
725
		}
726 727 728
		ret = crypto_hash_final(desc, out);
		if (ret)
			goto out;
729 730 731 732 733 734

		end = get_cycles();

		cycles += end - start;
	}

735
out:
736 737 738
	local_irq_enable();
	local_bh_enable();

739 740 741
	if (ret)
		return ret;

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

745
	return 0;
746 747
}

748 749
static void test_hash_speed(char *algo, unsigned int sec,
			      struct hash_speed *speed)
750
{
751 752
	struct crypto_hash *tfm;
	struct hash_desc desc;
753 754
	char output[1024];
	int i;
755
	int ret;
756 757 758

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

759
	tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
760

761 762 763
	if (IS_ERR(tfm)) {
		printk("failed to load transform for %s: %ld\n", algo,
		       PTR_ERR(tfm));
764 765 766
		return;
	}

767 768 769 770
	desc.tfm = tfm;
	desc.flags = 0;

	if (crypto_hash_digestsize(tfm) > sizeof(output)) {
771
		printk("digestsize(%u) > outputbuffer(%zu)\n",
772
		       crypto_hash_digestsize(tfm), sizeof(output));
773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
		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)
789 790
			ret = test_hash_jiffies(&desc, tvmem, speed[i].blen,
						speed[i].plen, output, sec);
791
		else
792 793 794 795 796 797 798
			ret = test_hash_cycles(&desc, tvmem, speed[i].blen,
					       speed[i].plen, output);

		if (ret) {
			printk("hashing failed ret=%d\n", ret);
			break;
		}
799 800 801
	}

out:
802
	crypto_free_hash(tfm);
803 804
}

805
static void test_deflate(void)
L
Linus Torvalds 已提交
806 807 808
{
	unsigned int i;
	char result[COMP_BUF_SIZE];
809
	struct crypto_comp *tfm;
L
Linus Torvalds 已提交
810 811 812 813 814 815 816 817 818 819 820 821 822
	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);
823
	tv = (void *)tvmem;
L
Linus Torvalds 已提交
824

825
	tfm = crypto_alloc_comp("deflate", 0, CRYPTO_ALG_ASYNC);
826
	if (IS_ERR(tfm)) {
L
Linus Torvalds 已提交
827 828 829 830 831 832
		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;
833

L
Linus Torvalds 已提交
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
		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);
860
	tv = (void *)tvmem;
L
Linus Torvalds 已提交
861 862 863

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

L
Linus Torvalds 已提交
865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880
		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:
881
	crypto_free_comp(tfm);
L
Linus Torvalds 已提交
882 883
}

884
static void test_available(void)
L
Linus Torvalds 已提交
885 886
{
	char **name = check;
887

L
Linus Torvalds 已提交
888 889
	while (*name) {
		printk("alg %s ", *name);
890
		printk(crypto_has_alg(*name, 0, 0) ?
891
		       "found\n" : "not found\n");
L
Linus Torvalds 已提交
892
		name++;
893
	}
L
Linus Torvalds 已提交
894 895
}

896
static void do_test(void)
L
Linus Torvalds 已提交
897 898 899 900 901
{
	switch (mode) {

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

L
Linus Torvalds 已提交
903
		test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
904

L
Linus Torvalds 已提交
905
		//DES
906 907 908 909 910 911 912 913
		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);
914

L
Linus Torvalds 已提交
915
		//DES3_EDE
916 917 918 919
		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);
920

L
Linus Torvalds 已提交
921
		test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
922

923 924
		test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);

L
Linus Torvalds 已提交
925
		test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
926

L
Linus Torvalds 已提交
927
		//BLOWFISH
928 929 930 931 932 933 934 935
		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);
936

L
Linus Torvalds 已提交
937
		//TWOFISH
938 939 940 941 942 943 944 945
		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);
946

L
Linus Torvalds 已提交
947
		//SERPENT
948 949 950 951
		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);
952

L
Linus Torvalds 已提交
953
		//TNEPRES
954 955 956 957
		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 已提交
958 959

		//AES
960 961 962 963 964 965 966 967
		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 已提交
968 969 970 971
		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);
972 973 974 975
		test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
			    AES_XTS_ENC_TEST_VECTORS);
		test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
			    AES_XTS_DEC_TEST_VECTORS);
J
Joy Latten 已提交
976
		test_cipher("ctr(aes,4,8,4)", ENCRYPT, aes_ctr_enc_tv_template,
977
			    AES_CTR_ENC_TEST_VECTORS);
J
Joy Latten 已提交
978
		test_cipher("ctr(aes,4,8,4)", DECRYPT, aes_ctr_dec_tv_template,
979
			    AES_CTR_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
980 981

		//CAST5
982 983 984 985
		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);
986

L
Linus Torvalds 已提交
987
		//CAST6
988 989 990 991
		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 已提交
992 993

		//ARC4
994 995 996 997
		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 已提交
998 999

		//TEA
1000 1001 1002 1003
		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 已提交
1004 1005 1006


		//XTEA
1007 1008 1009 1010
		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 已提交
1011 1012

		//KHAZAD
1013 1014 1015 1016
		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 已提交
1017 1018

		//ANUBIS
1019 1020 1021 1022 1023 1024 1025 1026
		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 已提交
1027

A
Aaron Grothe 已提交
1028
		//XETA
1029 1030 1031 1032
		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 已提交
1033

1034 1035 1036 1037 1038 1039
		//FCrypt
		test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
			    FCRYPT_ENC_TEST_VECTORS);
		test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
			    FCRYPT_DEC_TEST_VECTORS);

1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053
		//CAMELLIA
		test_cipher("ecb(camellia)", ENCRYPT,
			    camellia_enc_tv_template,
			    CAMELLIA_ENC_TEST_VECTORS);
		test_cipher("ecb(camellia)", DECRYPT,
			    camellia_dec_tv_template,
			    CAMELLIA_DEC_TEST_VECTORS);
		test_cipher("cbc(camellia)", ENCRYPT,
			    camellia_cbc_enc_tv_template,
			    CAMELLIA_CBC_ENC_TEST_VECTORS);
		test_cipher("cbc(camellia)", DECRYPT,
			    camellia_cbc_dec_tv_template,
			    CAMELLIA_CBC_DEC_TEST_VECTORS);

1054 1055 1056 1057 1058 1059
		//SEED
		test_cipher("ecb(seed)", ENCRYPT, seed_enc_tv_template,
			    SEED_ENC_TEST_VECTORS);
		test_cipher("ecb(seed)", DECRYPT, seed_dec_tv_template,
			    SEED_DEC_TEST_VECTORS);

L
Linus Torvalds 已提交
1060 1061 1062 1063 1064 1065 1066 1067 1068
		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();
1069
		test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
1070 1071 1072 1073
		test_hash("hmac(md5)", hmac_md5_tv_template,
			  HMAC_MD5_TEST_VECTORS);
		test_hash("hmac(sha1)", hmac_sha1_tv_template,
			  HMAC_SHA1_TEST_VECTORS);
1074 1075
		test_hash("hmac(sha224)", hmac_sha224_tv_template,
			  HMAC_SHA224_TEST_VECTORS);
1076 1077
		test_hash("hmac(sha256)", hmac_sha256_tv_template,
			  HMAC_SHA256_TEST_VECTORS);
1078 1079 1080 1081
		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 已提交
1082

1083 1084 1085
		test_hash("xcbc(aes)", aes_xcbc128_tv_template,
			  XCBC_AES_TEST_VECTORS);

L
Linus Torvalds 已提交
1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097
		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:
1098 1099 1100 1101 1102 1103 1104 1105
		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 已提交
1106 1107 1108
		break;

	case 4:
1109 1110 1111 1112
		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 已提交
1113 1114 1115 1116 1117
		break;

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

L
Linus Torvalds 已提交
1119 1120 1121
	case 6:
		test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
		break;
1122

L
Linus Torvalds 已提交
1123
	case 7:
1124 1125 1126 1127 1128 1129 1130 1131
		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 已提交
1132 1133 1134
		break;

	case 8:
1135 1136 1137 1138 1139 1140 1141 1142
		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 已提交
1143
		break;
1144

L
Linus Torvalds 已提交
1145
	case 9:
1146 1147 1148 1149
		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 已提交
1150 1151 1152
		break;

	case 10:
1153 1154 1155 1156 1157 1158 1159 1160
		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 已提交
1161 1162 1163 1164
		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);
1165 1166 1167 1168
		test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
			    AES_XTS_ENC_TEST_VECTORS);
		test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
			    AES_XTS_DEC_TEST_VECTORS);
J
Joy Latten 已提交
1169
		test_cipher("ctr(aes,4,8,4)", ENCRYPT, aes_ctr_enc_tv_template,
1170
			    AES_CTR_ENC_TEST_VECTORS);
J
Joy Latten 已提交
1171
		test_cipher("ctr(aes,4,8,4)", DECRYPT, aes_ctr_dec_tv_template,
1172
			    AES_CTR_DEC_TEST_VECTORS);
L
Linus Torvalds 已提交
1173 1174 1175 1176 1177
		break;

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

L
Linus Torvalds 已提交
1179 1180 1181 1182 1183 1184 1185 1186 1187
	case 12:
		test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
		break;

	case 13:
		test_deflate();
		break;

	case 14:
1188 1189 1190 1191
		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 已提交
1192 1193 1194
		break;

	case 15:
1195 1196 1197 1198
		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 已提交
1199 1200 1201
		break;

	case 16:
1202 1203 1204 1205
		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 已提交
1206 1207 1208 1209 1210 1211 1212
		break;

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

	case 18:
1213
		test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
L
Linus Torvalds 已提交
1214 1215 1216
		break;

	case 19:
1217 1218 1219 1220
		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 已提交
1221 1222 1223
		break;

	case 20:
1224 1225 1226 1227
		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 已提交
1228 1229 1230
		break;

	case 21:
1231 1232 1233 1234
		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 已提交
1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249
		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:
1250 1251 1252 1253
		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 已提交
1254 1255 1256
		break;

	case 26:
1257 1258 1259 1260 1261 1262 1263 1264
		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 已提交
1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278
		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 已提交
1279 1280
		
	case 30:
1281 1282 1283 1284
		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 已提交
1285
		break;
L
Linus Torvalds 已提交
1286

1287 1288 1289 1290 1291 1292 1293
	case 31:
		test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
			    FCRYPT_ENC_TEST_VECTORS);
		test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
			    FCRYPT_DEC_TEST_VECTORS);
		break;

1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307
	case 32:
		test_cipher("ecb(camellia)", ENCRYPT,
			    camellia_enc_tv_template,
			    CAMELLIA_ENC_TEST_VECTORS);
		test_cipher("ecb(camellia)", DECRYPT,
			    camellia_dec_tv_template,
			    CAMELLIA_DEC_TEST_VECTORS);
		test_cipher("cbc(camellia)", ENCRYPT,
			    camellia_cbc_enc_tv_template,
			    CAMELLIA_CBC_ENC_TEST_VECTORS);
		test_cipher("cbc(camellia)", DECRYPT,
			    camellia_cbc_dec_tv_template,
			    CAMELLIA_CBC_DEC_TEST_VECTORS);
		break;
1308 1309 1310
	case 33:
		test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);
		break;
1311

1312 1313 1314 1315 1316 1317
	case 34:
		test_cipher("salsa20", ENCRYPT,
			    salsa20_stream_enc_tv_template,
			    SALSA20_STREAM_ENC_TEST_VECTORS);
		break;

L
Linus Torvalds 已提交
1318
	case 100:
1319 1320
		test_hash("hmac(md5)", hmac_md5_tv_template,
			  HMAC_MD5_TEST_VECTORS);
L
Linus Torvalds 已提交
1321
		break;
1322

L
Linus Torvalds 已提交
1323
	case 101:
1324 1325
		test_hash("hmac(sha1)", hmac_sha1_tv_template,
			  HMAC_SHA1_TEST_VECTORS);
L
Linus Torvalds 已提交
1326
		break;
1327

L
Linus Torvalds 已提交
1328
	case 102:
1329 1330
		test_hash("hmac(sha256)", hmac_sha256_tv_template,
			  HMAC_SHA256_TEST_VECTORS);
L
Linus Torvalds 已提交
1331 1332
		break;

1333 1334 1335 1336 1337 1338 1339 1340 1341
	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;
1342 1343 1344 1345
	case 105:
		test_hash("hmac(sha224)", hmac_sha224_tv_template,
			  HMAC_SHA224_TEST_VECTORS);
		break;
L
Linus Torvalds 已提交
1346

H
Harald Welte 已提交
1347
	case 200:
1348
		test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
1349
				  aes_speed_template);
1350
		test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
1351
				  aes_speed_template);
1352
		test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
1353
				  aes_speed_template);
1354
		test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
1355
				  aes_speed_template);
R
Rik Snel 已提交
1356 1357 1358 1359
		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);
1360 1361 1362 1363
		test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
				  aes_xts_speed_template);
		test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
				  aes_xts_speed_template);
H
Harald Welte 已提交
1364 1365 1366
		break;

	case 201:
1367
		test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
1368 1369 1370
				  des3_ede_enc_tv_template,
				  DES3_EDE_ENC_TEST_VECTORS,
				  des3_ede_speed_template);
1371
		test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
1372 1373 1374
				  des3_ede_dec_tv_template,
				  DES3_EDE_DEC_TEST_VECTORS,
				  des3_ede_speed_template);
1375
		test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
1376 1377 1378
				  des3_ede_enc_tv_template,
				  DES3_EDE_ENC_TEST_VECTORS,
				  des3_ede_speed_template);
1379
		test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
1380 1381 1382
				  des3_ede_dec_tv_template,
				  DES3_EDE_DEC_TEST_VECTORS,
				  des3_ede_speed_template);
H
Harald Welte 已提交
1383 1384 1385
		break;

	case 202:
1386
		test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
1387
				  twofish_speed_template);
1388
		test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
1389
				  twofish_speed_template);
1390
		test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
1391
				  twofish_speed_template);
1392
		test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
1393
				  twofish_speed_template);
H
Harald Welte 已提交
1394 1395 1396
		break;

	case 203:
1397
		test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
1398
				  blowfish_speed_template);
1399
		test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
1400
				  blowfish_speed_template);
1401
		test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
1402
				  blowfish_speed_template);
1403
		test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
1404
				  blowfish_speed_template);
H
Harald Welte 已提交
1405 1406 1407
		break;

	case 204:
1408
		test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
1409
				  des_speed_template);
1410
		test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
1411
				  des_speed_template);
1412
		test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
1413
				  des_speed_template);
1414
		test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
1415
				  des_speed_template);
H
Harald Welte 已提交
1416 1417
		break;

1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428
	case 205:
		test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
				camellia_speed_template);
		test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
				camellia_speed_template);
		test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
				camellia_speed_template);
		test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
				camellia_speed_template);
		break;

1429 1430 1431 1432
	case 300:
		/* fall through */

	case 301:
1433
		test_hash_speed("md4", sec, generic_hash_speed_template);
1434 1435 1436
		if (mode > 300 && mode < 400) break;

	case 302:
1437
		test_hash_speed("md5", sec, generic_hash_speed_template);
1438 1439 1440
		if (mode > 300 && mode < 400) break;

	case 303:
1441
		test_hash_speed("sha1", sec, generic_hash_speed_template);
1442 1443 1444
		if (mode > 300 && mode < 400) break;

	case 304:
1445
		test_hash_speed("sha256", sec, generic_hash_speed_template);
1446 1447 1448
		if (mode > 300 && mode < 400) break;

	case 305:
1449
		test_hash_speed("sha384", sec, generic_hash_speed_template);
1450 1451 1452
		if (mode > 300 && mode < 400) break;

	case 306:
1453
		test_hash_speed("sha512", sec, generic_hash_speed_template);
1454 1455 1456
		if (mode > 300 && mode < 400) break;

	case 307:
1457
		test_hash_speed("wp256", sec, generic_hash_speed_template);
1458 1459 1460
		if (mode > 300 && mode < 400) break;

	case 308:
1461
		test_hash_speed("wp384", sec, generic_hash_speed_template);
1462 1463 1464
		if (mode > 300 && mode < 400) break;

	case 309:
1465
		test_hash_speed("wp512", sec, generic_hash_speed_template);
1466 1467 1468
		if (mode > 300 && mode < 400) break;

	case 310:
1469
		test_hash_speed("tgr128", sec, generic_hash_speed_template);
1470 1471 1472
		if (mode > 300 && mode < 400) break;

	case 311:
1473
		test_hash_speed("tgr160", sec, generic_hash_speed_template);
1474 1475 1476
		if (mode > 300 && mode < 400) break;

	case 312:
1477
		test_hash_speed("tgr192", sec, generic_hash_speed_template);
1478 1479
		if (mode > 300 && mode < 400) break;

1480 1481 1482 1483
	case 313:
		test_hash_speed("sha224", sec, generic_hash_speed_template);
		if (mode > 300 && mode < 400) break;

1484 1485 1486
	case 399:
		break;

L
Linus Torvalds 已提交
1487 1488 1489
	case 1000:
		test_available();
		break;
1490

L
Linus Torvalds 已提交
1491 1492 1493 1494 1495 1496 1497
	default:
		/* useful for debugging */
		printk("not testing anything\n");
		break;
	}
}

1498
static int __init init(void)
L
Linus Torvalds 已提交
1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513
{
	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);
1514 1515 1516 1517 1518 1519 1520 1521

	/* 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 已提交
1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533
}

/*
 * 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 已提交
1534
module_param(sec, uint, 0);
1535 1536
MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
		      "(defaults to zero which uses CPU cycles instead)");
L
Linus Torvalds 已提交
1537 1538 1539 1540

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