xref: /linux/crypto/tcrypt.c (revision 2624f124b3b5d550ab2fbef7ee3bc0e1fed09722)
1 /*
2  * Quick & dirty crypto testing module.
3  *
4  * This will only exist until we have a better testing mechanism
5  * (e.g. a char device).
6  *
7  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
8  * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
9  *
10  * This program is free software; you can redistribute it and/or modify it
11  * 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)
13  * any later version.
14  *
15  * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>)
16  * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt
17  *
18  */
19 
20 #include <linux/init.h>
21 #include <linux/module.h>
22 #include <linux/mm.h>
23 #include <linux/slab.h>
24 #include <asm/scatterlist.h>
25 #include <linux/string.h>
26 #include <linux/crypto.h>
27 #include <linux/highmem.h>
28 #include <linux/moduleparam.h>
29 #include <linux/jiffies.h>
30 #include <linux/timex.h>
31 #include <linux/interrupt.h>
32 #include "tcrypt.h"
33 
34 /*
35  * Need to kmalloc() memory for testing kmap().
36  */
37 #define TVMEMSIZE	16384
38 #define XBUFSIZE	32768
39 
40 /*
41  * Indexes into the xbuf to simulate cross-page access.
42  */
43 #define IDX1		37
44 #define IDX2		32400
45 #define IDX3		1
46 #define IDX4		8193
47 #define IDX5		22222
48 #define IDX6		17101
49 #define IDX7		27333
50 #define IDX8		3000
51 
52 /*
53 * Used by test_cipher()
54 */
55 #define ENCRYPT 1
56 #define DECRYPT 0
57 #define MODE_ECB 1
58 #define MODE_CBC 0
59 
60 static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
61 
62 /*
63  * Used by test_cipher_speed()
64  */
65 static unsigned int sec;
66 
67 static int mode;
68 static char *xbuf;
69 static char *tvmem;
70 
71 static char *check[] = {
72 	"des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
73 	"twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6",
74 	"arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
75 	"khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", NULL
76 };
77 
78 static void hexdump(unsigned char *buf, unsigned int len)
79 {
80 	while (len--)
81 		printk("%02x", *buf++);
82 
83 	printk("\n");
84 }
85 
86 static void test_hash(char *algo, struct hash_testvec *template,
87 		      unsigned int tcount)
88 {
89 	char *p;
90 	unsigned int i, j, k, temp;
91 	struct scatterlist sg[8];
92 	char result[64];
93 	struct crypto_tfm *tfm;
94 	struct hash_testvec *hash_tv;
95 	unsigned int tsize;
96 
97 	printk("\ntesting %s\n", algo);
98 
99 	tsize = sizeof(struct hash_testvec);
100 	tsize *= tcount;
101 
102 	if (tsize > TVMEMSIZE) {
103 		printk("template (%u) too big for tvmem (%u)\n", tsize, TVMEMSIZE);
104 		return;
105 	}
106 
107 	memcpy(tvmem, template, tsize);
108 	hash_tv = (void *)tvmem;
109 	tfm = crypto_alloc_tfm(algo, 0);
110 	if (tfm == NULL) {
111 		printk("failed to load transform for %s\n", algo);
112 		return;
113 	}
114 
115 	for (i = 0; i < tcount; i++) {
116 		printk("test %u:\n", i + 1);
117 		memset(result, 0, 64);
118 
119 		p = hash_tv[i].plaintext;
120 		sg[0].page = virt_to_page(p);
121 		sg[0].offset = offset_in_page(p);
122 		sg[0].length = hash_tv[i].psize;
123 
124 		crypto_digest_init(tfm);
125 		if (tfm->crt_u.digest.dit_setkey) {
126 			crypto_digest_setkey(tfm, hash_tv[i].key,
127 					     hash_tv[i].ksize);
128 		}
129 		crypto_digest_update(tfm, sg, 1);
130 		crypto_digest_final(tfm, result);
131 
132 		hexdump(result, crypto_tfm_alg_digestsize(tfm));
133 		printk("%s\n",
134 		       memcmp(result, hash_tv[i].digest,
135 			      crypto_tfm_alg_digestsize(tfm)) ?
136 		       "fail" : "pass");
137 	}
138 
139 	printk("testing %s across pages\n", algo);
140 
141 	/* setup the dummy buffer first */
142 	memset(xbuf, 0, XBUFSIZE);
143 
144 	j = 0;
145 	for (i = 0; i < tcount; i++) {
146 		if (hash_tv[i].np) {
147 			j++;
148 			printk("test %u:\n", j);
149 			memset(result, 0, 64);
150 
151 			temp = 0;
152 			for (k = 0; k < hash_tv[i].np; k++) {
153 				memcpy(&xbuf[IDX[k]],
154 				       hash_tv[i].plaintext + temp,
155 				       hash_tv[i].tap[k]);
156 				temp += hash_tv[i].tap[k];
157 				p = &xbuf[IDX[k]];
158 				sg[k].page = virt_to_page(p);
159 				sg[k].offset = offset_in_page(p);
160 				sg[k].length = hash_tv[i].tap[k];
161 			}
162 
163 			crypto_digest_digest(tfm, sg, hash_tv[i].np, result);
164 
165 			hexdump(result, crypto_tfm_alg_digestsize(tfm));
166 			printk("%s\n",
167 			       memcmp(result, hash_tv[i].digest,
168 				      crypto_tfm_alg_digestsize(tfm)) ?
169 			       "fail" : "pass");
170 		}
171 	}
172 
173 	crypto_free_tfm(tfm);
174 }
175 
176 
177 #ifdef CONFIG_CRYPTO_HMAC
178 
179 static void test_hmac(char *algo, struct hmac_testvec *template,
180 		      unsigned int tcount)
181 {
182 	char *p;
183 	unsigned int i, j, k, temp;
184 	struct scatterlist sg[8];
185 	char result[64];
186 	struct crypto_tfm *tfm;
187 	struct hmac_testvec *hmac_tv;
188 	unsigned int tsize, klen;
189 
190 	tfm = crypto_alloc_tfm(algo, 0);
191 	if (tfm == NULL) {
192 		printk("failed to load transform for %s\n", algo);
193 		return;
194 	}
195 
196 	printk("\ntesting hmac_%s\n", algo);
197 
198 	tsize = sizeof(struct hmac_testvec);
199 	tsize *= tcount;
200 	if (tsize > TVMEMSIZE) {
201 		printk("template (%u) too big for tvmem (%u)\n", tsize,
202 		       TVMEMSIZE);
203 		goto out;
204 	}
205 
206 	memcpy(tvmem, template, tsize);
207 	hmac_tv = (void *)tvmem;
208 
209 	for (i = 0; i < tcount; i++) {
210 		printk("test %u:\n", i + 1);
211 		memset(result, 0, sizeof (result));
212 
213 		p = hmac_tv[i].plaintext;
214 		klen = hmac_tv[i].ksize;
215 		sg[0].page = virt_to_page(p);
216 		sg[0].offset = offset_in_page(p);
217 		sg[0].length = hmac_tv[i].psize;
218 
219 		crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, 1, result);
220 
221 		hexdump(result, crypto_tfm_alg_digestsize(tfm));
222 		printk("%s\n",
223 		       memcmp(result, hmac_tv[i].digest,
224 			      crypto_tfm_alg_digestsize(tfm)) ? "fail" :
225 		       "pass");
226 	}
227 
228 	printk("\ntesting hmac_%s across pages\n", algo);
229 
230 	memset(xbuf, 0, XBUFSIZE);
231 
232 	j = 0;
233 	for (i = 0; i < tcount; i++) {
234 		if (hmac_tv[i].np) {
235 			j++;
236 			printk("test %u:\n",j);
237 			memset(result, 0, 64);
238 
239 			temp = 0;
240 			klen = hmac_tv[i].ksize;
241 			for (k = 0; k < hmac_tv[i].np; k++) {
242 				memcpy(&xbuf[IDX[k]],
243 				       hmac_tv[i].plaintext + temp,
244 				       hmac_tv[i].tap[k]);
245 				temp += hmac_tv[i].tap[k];
246 				p = &xbuf[IDX[k]];
247 				sg[k].page = virt_to_page(p);
248 				sg[k].offset = offset_in_page(p);
249 				sg[k].length = hmac_tv[i].tap[k];
250 			}
251 
252 			crypto_hmac(tfm, hmac_tv[i].key, &klen, sg,
253 				    hmac_tv[i].np, result);
254 			hexdump(result, crypto_tfm_alg_digestsize(tfm));
255 
256 			printk("%s\n",
257 			       memcmp(result, hmac_tv[i].digest,
258 				      crypto_tfm_alg_digestsize(tfm)) ?
259 			       "fail" : "pass");
260 		}
261 	}
262 out:
263 	crypto_free_tfm(tfm);
264 }
265 
266 #endif	/* CONFIG_CRYPTO_HMAC */
267 
268 static void test_cipher(char *algo, int mode, int enc,
269 			struct cipher_testvec *template, unsigned int tcount)
270 {
271 	unsigned int ret, i, j, k, temp;
272 	unsigned int tsize;
273 	char *p, *q;
274 	struct crypto_tfm *tfm;
275 	char *key;
276 	struct cipher_testvec *cipher_tv;
277 	struct scatterlist sg[8];
278 	const char *e, *m;
279 
280 	if (enc == ENCRYPT)
281 	        e = "encryption";
282 	else
283 		e = "decryption";
284 	if (mode == MODE_ECB)
285 		m = "ECB";
286 	else
287 		m = "CBC";
288 
289 	printk("\ntesting %s %s %s\n", algo, m, e);
290 
291 	tsize = sizeof (struct cipher_testvec);
292 	tsize *= tcount;
293 
294 	if (tsize > TVMEMSIZE) {
295 		printk("template (%u) too big for tvmem (%u)\n", tsize,
296 		       TVMEMSIZE);
297 		return;
298 	}
299 
300 	memcpy(tvmem, template, tsize);
301 	cipher_tv = (void *)tvmem;
302 
303 	if (mode)
304 		tfm = crypto_alloc_tfm(algo, 0);
305 	else
306 		tfm = crypto_alloc_tfm(algo, CRYPTO_TFM_MODE_CBC);
307 
308 	if (tfm == NULL) {
309 		printk("failed to load transform for %s %s\n", algo, m);
310 		return;
311 	}
312 
313 	j = 0;
314 	for (i = 0; i < tcount; i++) {
315 		if (!(cipher_tv[i].np)) {
316 			j++;
317 			printk("test %u (%d bit key):\n",
318 			j, cipher_tv[i].klen * 8);
319 
320 			tfm->crt_flags = 0;
321 			if (cipher_tv[i].wk)
322 				tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
323 			key = cipher_tv[i].key;
324 
325 			ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
326 			if (ret) {
327 				printk("setkey() failed flags=%x\n", tfm->crt_flags);
328 
329 				if (!cipher_tv[i].fail)
330 					goto out;
331 			}
332 
333 			p = cipher_tv[i].input;
334 			sg[0].page = virt_to_page(p);
335 			sg[0].offset = offset_in_page(p);
336 			sg[0].length = cipher_tv[i].ilen;
337 
338 			if (!mode) {
339 				crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
340 					crypto_tfm_alg_ivsize(tfm));
341 			}
342 
343 			if (enc)
344 				ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
345 			else
346 				ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
347 
348 
349 			if (ret) {
350 				printk("%s () failed flags=%x\n", e, tfm->crt_flags);
351 				goto out;
352 			}
353 
354 			q = kmap(sg[0].page) + sg[0].offset;
355 			hexdump(q, cipher_tv[i].rlen);
356 
357 			printk("%s\n",
358 			       memcmp(q, cipher_tv[i].result,
359 				      cipher_tv[i].rlen) ? "fail" : "pass");
360 		}
361 	}
362 
363 	printk("\ntesting %s %s %s across pages (chunking)\n", algo, m, e);
364 	memset(xbuf, 0, XBUFSIZE);
365 
366 	j = 0;
367 	for (i = 0; i < tcount; i++) {
368 		if (cipher_tv[i].np) {
369 			j++;
370 			printk("test %u (%d bit key):\n",
371 			j, cipher_tv[i].klen * 8);
372 
373 			tfm->crt_flags = 0;
374 			if (cipher_tv[i].wk)
375 				tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
376 			key = cipher_tv[i].key;
377 
378 			ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
379 			if (ret) {
380 				printk("setkey() failed flags=%x\n", tfm->crt_flags);
381 
382 				if (!cipher_tv[i].fail)
383 					goto out;
384 			}
385 
386 			temp = 0;
387 			for (k = 0; k < cipher_tv[i].np; k++) {
388 				memcpy(&xbuf[IDX[k]],
389 				       cipher_tv[i].input + temp,
390 				       cipher_tv[i].tap[k]);
391 				temp += cipher_tv[i].tap[k];
392 				p = &xbuf[IDX[k]];
393 				sg[k].page = virt_to_page(p);
394 				sg[k].offset = offset_in_page(p);
395 				sg[k].length = cipher_tv[i].tap[k];
396 			}
397 
398 			if (!mode) {
399 				crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
400 						crypto_tfm_alg_ivsize(tfm));
401 			}
402 
403 			if (enc)
404 				ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
405 			else
406 				ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
407 
408 			if (ret) {
409 				printk("%s () failed flags=%x\n", e, tfm->crt_flags);
410 				goto out;
411 			}
412 
413 			temp = 0;
414 			for (k = 0; k < cipher_tv[i].np; k++) {
415 				printk("page %u\n", k);
416 				q = kmap(sg[k].page) + sg[k].offset;
417 				hexdump(q, cipher_tv[i].tap[k]);
418 				printk("%s\n",
419 					memcmp(q, cipher_tv[i].result + temp,
420 						cipher_tv[i].tap[k]) ? "fail" :
421 					"pass");
422 				temp += cipher_tv[i].tap[k];
423 			}
424 		}
425 	}
426 
427 out:
428 	crypto_free_tfm(tfm);
429 }
430 
431 static int test_cipher_jiffies(struct crypto_tfm *tfm, int enc, char *p,
432 			       int blen, int sec)
433 {
434 	struct scatterlist sg[8];
435 	unsigned long start, end;
436 	int bcount;
437 	int ret;
438 
439 	sg[0].page = virt_to_page(p);
440 	sg[0].offset = offset_in_page(p);
441 	sg[0].length = blen;
442 
443 	for (start = jiffies, end = start + sec * HZ, bcount = 0;
444 	     time_before(jiffies, end); bcount++) {
445 		if (enc)
446 			ret = crypto_cipher_encrypt(tfm, sg, sg, blen);
447 		else
448 			ret = crypto_cipher_decrypt(tfm, sg, sg, blen);
449 
450 		if (ret)
451 			return ret;
452 	}
453 
454 	printk("%d operations in %d seconds (%ld bytes)\n",
455 	       bcount, sec, (long)bcount * blen);
456 	return 0;
457 }
458 
459 static int test_cipher_cycles(struct crypto_tfm *tfm, int enc, char *p,
460 			      int blen)
461 {
462 	struct scatterlist sg[8];
463 	unsigned long cycles = 0;
464 	int ret = 0;
465 	int i;
466 
467 	sg[0].page = virt_to_page(p);
468 	sg[0].offset = offset_in_page(p);
469 	sg[0].length = blen;
470 
471 	local_bh_disable();
472 	local_irq_disable();
473 
474 	/* Warm-up run. */
475 	for (i = 0; i < 4; i++) {
476 		if (enc)
477 			ret = crypto_cipher_encrypt(tfm, sg, sg, blen);
478 		else
479 			ret = crypto_cipher_decrypt(tfm, sg, sg, blen);
480 
481 		if (ret)
482 			goto out;
483 	}
484 
485 	/* The real thing. */
486 	for (i = 0; i < 8; i++) {
487 		cycles_t start, end;
488 
489 		start = get_cycles();
490 		if (enc)
491 			ret = crypto_cipher_encrypt(tfm, sg, sg, blen);
492 		else
493 			ret = crypto_cipher_decrypt(tfm, sg, sg, blen);
494 		end = get_cycles();
495 
496 		if (ret)
497 			goto out;
498 
499 		cycles += end - start;
500 	}
501 
502 out:
503 	local_irq_enable();
504 	local_bh_enable();
505 
506 	if (ret == 0)
507 		printk("1 operation in %lu cycles (%d bytes)\n",
508 		       (cycles + 4) / 8, blen);
509 
510 	return ret;
511 }
512 
513 static void test_cipher_speed(char *algo, int mode, int enc, unsigned int sec,
514 			      struct cipher_testvec *template,
515 			      unsigned int tcount, struct cipher_speed *speed)
516 {
517 	unsigned int ret, i, j, iv_len;
518 	unsigned char *key, *p, iv[128];
519 	struct crypto_tfm *tfm;
520 	const char *e, *m;
521 
522 	if (enc == ENCRYPT)
523 	        e = "encryption";
524 	else
525 		e = "decryption";
526 	if (mode == MODE_ECB)
527 		m = "ECB";
528 	else
529 		m = "CBC";
530 
531 	printk("\ntesting speed of %s %s %s\n", algo, m, e);
532 
533 	if (mode)
534 		tfm = crypto_alloc_tfm(algo, 0);
535 	else
536 		tfm = crypto_alloc_tfm(algo, CRYPTO_TFM_MODE_CBC);
537 
538 	if (tfm == NULL) {
539 		printk("failed to load transform for %s %s\n", algo, m);
540 		return;
541 	}
542 
543 	for (i = 0; speed[i].klen != 0; i++) {
544 		if ((speed[i].blen + speed[i].klen) > TVMEMSIZE) {
545 			printk("template (%u) too big for tvmem (%u)\n",
546 			       speed[i].blen + speed[i].klen, TVMEMSIZE);
547 			goto out;
548 		}
549 
550 		printk("test %u (%d bit key, %d byte blocks): ", i,
551 		       speed[i].klen * 8, speed[i].blen);
552 
553 		memset(tvmem, 0xff, speed[i].klen + speed[i].blen);
554 
555 		/* set key, plain text and IV */
556 		key = (unsigned char *)tvmem;
557 		for (j = 0; j < tcount; j++) {
558 			if (template[j].klen == speed[i].klen) {
559 				key = template[j].key;
560 				break;
561 			}
562 		}
563 		p = (unsigned char *)tvmem + speed[i].klen;
564 
565 		ret = crypto_cipher_setkey(tfm, key, speed[i].klen);
566 		if (ret) {
567 			printk("setkey() failed flags=%x\n", tfm->crt_flags);
568 			goto out;
569 		}
570 
571 		if (!mode) {
572 			iv_len = crypto_tfm_alg_ivsize(tfm);
573 			memset(&iv, 0xff, iv_len);
574 			crypto_cipher_set_iv(tfm, iv, iv_len);
575 		}
576 
577 		if (sec)
578 			ret = test_cipher_jiffies(tfm, enc, p, speed[i].blen,
579 						  sec);
580 		else
581 			ret = test_cipher_cycles(tfm, enc, p, speed[i].blen);
582 
583 		if (ret) {
584 			printk("%s() failed flags=%x\n", e, tfm->crt_flags);
585 			break;
586 		}
587 	}
588 
589 out:
590 	crypto_free_tfm(tfm);
591 }
592 
593 static void test_deflate(void)
594 {
595 	unsigned int i;
596 	char result[COMP_BUF_SIZE];
597 	struct crypto_tfm *tfm;
598 	struct comp_testvec *tv;
599 	unsigned int tsize;
600 
601 	printk("\ntesting deflate compression\n");
602 
603 	tsize = sizeof (deflate_comp_tv_template);
604 	if (tsize > TVMEMSIZE) {
605 		printk("template (%u) too big for tvmem (%u)\n", tsize,
606 		       TVMEMSIZE);
607 		return;
608 	}
609 
610 	memcpy(tvmem, deflate_comp_tv_template, tsize);
611 	tv = (void *)tvmem;
612 
613 	tfm = crypto_alloc_tfm("deflate", 0);
614 	if (tfm == NULL) {
615 		printk("failed to load transform for deflate\n");
616 		return;
617 	}
618 
619 	for (i = 0; i < DEFLATE_COMP_TEST_VECTORS; i++) {
620 		int ilen, ret, dlen = COMP_BUF_SIZE;
621 
622 		printk("test %u:\n", i + 1);
623 		memset(result, 0, sizeof (result));
624 
625 		ilen = tv[i].inlen;
626 		ret = crypto_comp_compress(tfm, tv[i].input,
627 		                           ilen, result, &dlen);
628 		if (ret) {
629 			printk("fail: ret=%d\n", ret);
630 			continue;
631 		}
632 		hexdump(result, dlen);
633 		printk("%s (ratio %d:%d)\n",
634 		       memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
635 		       ilen, dlen);
636 	}
637 
638 	printk("\ntesting deflate decompression\n");
639 
640 	tsize = sizeof (deflate_decomp_tv_template);
641 	if (tsize > TVMEMSIZE) {
642 		printk("template (%u) too big for tvmem (%u)\n", tsize,
643 		       TVMEMSIZE);
644 		goto out;
645 	}
646 
647 	memcpy(tvmem, deflate_decomp_tv_template, tsize);
648 	tv = (void *)tvmem;
649 
650 	for (i = 0; i < DEFLATE_DECOMP_TEST_VECTORS; i++) {
651 		int ilen, ret, dlen = COMP_BUF_SIZE;
652 
653 		printk("test %u:\n", i + 1);
654 		memset(result, 0, sizeof (result));
655 
656 		ilen = tv[i].inlen;
657 		ret = crypto_comp_decompress(tfm, tv[i].input,
658 		                             ilen, result, &dlen);
659 		if (ret) {
660 			printk("fail: ret=%d\n", ret);
661 			continue;
662 		}
663 		hexdump(result, dlen);
664 		printk("%s (ratio %d:%d)\n",
665 		       memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
666 		       ilen, dlen);
667 	}
668 out:
669 	crypto_free_tfm(tfm);
670 }
671 
672 static void test_crc32c(void)
673 {
674 #define NUMVEC 6
675 #define VECSIZE 40
676 
677 	int i, j, pass;
678 	u32 crc;
679 	u8 b, test_vec[NUMVEC][VECSIZE];
680 	static u32 vec_results[NUMVEC] = {
681 		0x0e2c157f, 0xe980ebf6, 0xde74bded,
682 		0xd579c862, 0xba979ad0, 0x2b29d913
683 	};
684 	static u32 tot_vec_results = 0x24c5d375;
685 
686 	struct scatterlist sg[NUMVEC];
687 	struct crypto_tfm *tfm;
688 	char *fmtdata = "testing crc32c initialized to %08x: %s\n";
689 #define SEEDTESTVAL 0xedcba987
690 	u32 seed;
691 
692 	printk("\ntesting crc32c\n");
693 
694 	tfm = crypto_alloc_tfm("crc32c", 0);
695 	if (tfm == NULL) {
696 		printk("failed to load transform for crc32c\n");
697 		return;
698 	}
699 
700 	crypto_digest_init(tfm);
701 	crypto_digest_final(tfm, (u8*)&crc);
702 	printk(fmtdata, crc, (crc == 0) ? "pass" : "ERROR");
703 
704 	/*
705 	 * stuff test_vec with known values, simple incrementing
706 	 * byte values.
707 	 */
708 	b = 0;
709 	for (i = 0; i < NUMVEC; i++) {
710 		for (j = 0; j < VECSIZE; j++)
711 			test_vec[i][j] = ++b;
712 		sg[i].page = virt_to_page(test_vec[i]);
713 		sg[i].offset = offset_in_page(test_vec[i]);
714 		sg[i].length = VECSIZE;
715 	}
716 
717 	seed = SEEDTESTVAL;
718 	(void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32));
719 	crypto_digest_final(tfm, (u8*)&crc);
720 	printk("testing crc32c setkey returns %08x : %s\n", crc, (crc == (SEEDTESTVAL ^ ~(u32)0)) ?
721 	       "pass" : "ERROR");
722 
723 	printk("testing crc32c using update/final:\n");
724 
725 	pass = 1;		    /* assume all is well */
726 
727 	for (i = 0; i < NUMVEC; i++) {
728 		seed = ~(u32)0;
729 		(void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32));
730 		crypto_digest_update(tfm, &sg[i], 1);
731 		crypto_digest_final(tfm, (u8*)&crc);
732 		if (crc == vec_results[i]) {
733 			printk(" %08x:OK", crc);
734 		} else {
735 			printk(" %08x:BAD, wanted %08x\n", crc, vec_results[i]);
736 			pass = 0;
737 		}
738 	}
739 
740 	printk("\ntesting crc32c using incremental accumulator:\n");
741 	crc = 0;
742 	for (i = 0; i < NUMVEC; i++) {
743 		seed = (crc ^ ~(u32)0);
744 		(void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32));
745 		crypto_digest_update(tfm, &sg[i], 1);
746 		crypto_digest_final(tfm, (u8*)&crc);
747 	}
748 	if (crc == tot_vec_results) {
749 		printk(" %08x:OK", crc);
750 	} else {
751 		printk(" %08x:BAD, wanted %08x\n", crc, tot_vec_results);
752 		pass = 0;
753 	}
754 
755 	printk("\ntesting crc32c using digest:\n");
756 	seed = ~(u32)0;
757 	(void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32));
758 	crypto_digest_digest(tfm, sg, NUMVEC, (u8*)&crc);
759 	if (crc == tot_vec_results) {
760 		printk(" %08x:OK", crc);
761 	} else {
762 		printk(" %08x:BAD, wanted %08x\n", crc, tot_vec_results);
763 		pass = 0;
764 	}
765 
766 	printk("\n%s\n", pass ? "pass" : "ERROR");
767 
768 	crypto_free_tfm(tfm);
769 	printk("crc32c test complete\n");
770 }
771 
772 static void test_available(void)
773 {
774 	char **name = check;
775 
776 	while (*name) {
777 		printk("alg %s ", *name);
778 		printk((crypto_alg_available(*name, 0)) ?
779 			"found\n" : "not found\n");
780 		name++;
781 	}
782 }
783 
784 static void do_test(void)
785 {
786 	switch (mode) {
787 
788 	case 0:
789 		test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
790 
791 		test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
792 
793 		//DES
794 		test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS);
795 		test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS);
796 		test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS);
797 		test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
798 
799 		//DES3_EDE
800 		test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS);
801 		test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
802 
803 		test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
804 
805 		test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
806 
807 		//BLOWFISH
808 		test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS);
809 		test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
810 		test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS);
811 		test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
812 
813 		//TWOFISH
814 		test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS);
815 		test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS);
816 		test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS);
817 		test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
818 
819 		//SERPENT
820 		test_cipher ("serpent", MODE_ECB, ENCRYPT, serpent_enc_tv_template, SERPENT_ENC_TEST_VECTORS);
821 		test_cipher ("serpent", MODE_ECB, DECRYPT, serpent_dec_tv_template, SERPENT_DEC_TEST_VECTORS);
822 
823 		//TNEPRES
824 		test_cipher ("tnepres", MODE_ECB, ENCRYPT, tnepres_enc_tv_template, TNEPRES_ENC_TEST_VECTORS);
825 		test_cipher ("tnepres", MODE_ECB, DECRYPT, tnepres_dec_tv_template, TNEPRES_DEC_TEST_VECTORS);
826 
827 		//AES
828 		test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS);
829 		test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);
830 
831 		//CAST5
832 		test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS);
833 		test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
834 
835 		//CAST6
836 		test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS);
837 		test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
838 
839 		//ARC4
840 		test_cipher ("arc4", MODE_ECB, ENCRYPT, arc4_enc_tv_template, ARC4_ENC_TEST_VECTORS);
841 		test_cipher ("arc4", MODE_ECB, DECRYPT, arc4_dec_tv_template, ARC4_DEC_TEST_VECTORS);
842 
843 		//TEA
844 		test_cipher ("tea", MODE_ECB, ENCRYPT, tea_enc_tv_template, TEA_ENC_TEST_VECTORS);
845 		test_cipher ("tea", MODE_ECB, DECRYPT, tea_dec_tv_template, TEA_DEC_TEST_VECTORS);
846 
847 
848 		//XTEA
849 		test_cipher ("xtea", MODE_ECB, ENCRYPT, xtea_enc_tv_template, XTEA_ENC_TEST_VECTORS);
850 		test_cipher ("xtea", MODE_ECB, DECRYPT, xtea_dec_tv_template, XTEA_DEC_TEST_VECTORS);
851 
852 		//KHAZAD
853 		test_cipher ("khazad", MODE_ECB, ENCRYPT, khazad_enc_tv_template, KHAZAD_ENC_TEST_VECTORS);
854 		test_cipher ("khazad", MODE_ECB, DECRYPT, khazad_dec_tv_template, KHAZAD_DEC_TEST_VECTORS);
855 
856 		//ANUBIS
857 		test_cipher ("anubis", MODE_ECB, ENCRYPT, anubis_enc_tv_template, ANUBIS_ENC_TEST_VECTORS);
858 		test_cipher ("anubis", MODE_ECB, DECRYPT, anubis_dec_tv_template, ANUBIS_DEC_TEST_VECTORS);
859 		test_cipher ("anubis", MODE_CBC, ENCRYPT, anubis_cbc_enc_tv_template, ANUBIS_CBC_ENC_TEST_VECTORS);
860 		test_cipher ("anubis", MODE_CBC, DECRYPT, anubis_cbc_dec_tv_template, ANUBIS_CBC_ENC_TEST_VECTORS);
861 
862 		//XETA
863 		test_cipher ("xeta", MODE_ECB, ENCRYPT, xeta_enc_tv_template, XETA_ENC_TEST_VECTORS);
864 		test_cipher ("xeta", MODE_ECB, DECRYPT, xeta_dec_tv_template, XETA_DEC_TEST_VECTORS);
865 
866 		test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
867 		test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
868 		test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
869 		test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
870 		test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
871 		test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
872 		test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
873 		test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
874 		test_deflate();
875 		test_crc32c();
876 #ifdef CONFIG_CRYPTO_HMAC
877 		test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
878 		test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
879 		test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
880 #endif
881 
882 		test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
883 		break;
884 
885 	case 1:
886 		test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
887 		break;
888 
889 	case 2:
890 		test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
891 		break;
892 
893 	case 3:
894 		test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS);
895 		test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS);
896 		test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS);
897 		test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
898 		break;
899 
900 	case 4:
901 		test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS);
902 		test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
903 		break;
904 
905 	case 5:
906 		test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
907 		break;
908 
909 	case 6:
910 		test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
911 		break;
912 
913 	case 7:
914 		test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS);
915 		test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
916 		test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS);
917 		test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
918 		break;
919 
920 	case 8:
921 		test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS);
922 		test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS);
923 		test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS);
924 		test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
925 		break;
926 
927 	case 9:
928 		test_cipher ("serpent", MODE_ECB, ENCRYPT, serpent_enc_tv_template, SERPENT_ENC_TEST_VECTORS);
929 		test_cipher ("serpent", MODE_ECB, DECRYPT, serpent_dec_tv_template, SERPENT_DEC_TEST_VECTORS);
930 		break;
931 
932 	case 10:
933 		test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS);
934 		test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);
935 		break;
936 
937 	case 11:
938 		test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
939 		break;
940 
941 	case 12:
942 		test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
943 		break;
944 
945 	case 13:
946 		test_deflate();
947 		break;
948 
949 	case 14:
950 		test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS);
951 		test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
952 		break;
953 
954 	case 15:
955 		test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS);
956 		test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
957 		break;
958 
959 	case 16:
960 		test_cipher ("arc4", MODE_ECB, ENCRYPT, arc4_enc_tv_template, ARC4_ENC_TEST_VECTORS);
961 		test_cipher ("arc4", MODE_ECB, DECRYPT, arc4_dec_tv_template, ARC4_DEC_TEST_VECTORS);
962 		break;
963 
964 	case 17:
965 		test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
966 		break;
967 
968 	case 18:
969 		test_crc32c();
970 		break;
971 
972 	case 19:
973 		test_cipher ("tea", MODE_ECB, ENCRYPT, tea_enc_tv_template, TEA_ENC_TEST_VECTORS);
974 		test_cipher ("tea", MODE_ECB, DECRYPT, tea_dec_tv_template, TEA_DEC_TEST_VECTORS);
975 		break;
976 
977 	case 20:
978 		test_cipher ("xtea", MODE_ECB, ENCRYPT, xtea_enc_tv_template, XTEA_ENC_TEST_VECTORS);
979 		test_cipher ("xtea", MODE_ECB, DECRYPT, xtea_dec_tv_template, XTEA_DEC_TEST_VECTORS);
980 		break;
981 
982 	case 21:
983 		test_cipher ("khazad", MODE_ECB, ENCRYPT, khazad_enc_tv_template, KHAZAD_ENC_TEST_VECTORS);
984 		test_cipher ("khazad", MODE_ECB, DECRYPT, khazad_dec_tv_template, KHAZAD_DEC_TEST_VECTORS);
985 		break;
986 
987 	case 22:
988 		test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
989 		break;
990 
991 	case 23:
992 		test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
993 		break;
994 
995 	case 24:
996 		test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
997 		break;
998 
999 	case 25:
1000 		test_cipher ("tnepres", MODE_ECB, ENCRYPT, tnepres_enc_tv_template, TNEPRES_ENC_TEST_VECTORS);
1001 		test_cipher ("tnepres", MODE_ECB, DECRYPT, tnepres_dec_tv_template, TNEPRES_DEC_TEST_VECTORS);
1002 		break;
1003 
1004 	case 26:
1005 		test_cipher ("anubis", MODE_ECB, ENCRYPT, anubis_enc_tv_template, ANUBIS_ENC_TEST_VECTORS);
1006 		test_cipher ("anubis", MODE_ECB, DECRYPT, anubis_dec_tv_template, ANUBIS_DEC_TEST_VECTORS);
1007 		test_cipher ("anubis", MODE_CBC, ENCRYPT, anubis_cbc_enc_tv_template, ANUBIS_CBC_ENC_TEST_VECTORS);
1008 		test_cipher ("anubis", MODE_CBC, DECRYPT, anubis_cbc_dec_tv_template, ANUBIS_CBC_ENC_TEST_VECTORS);
1009 		break;
1010 
1011 	case 27:
1012 		test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
1013 		break;
1014 
1015 	case 28:
1016 
1017 		test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
1018 		break;
1019 
1020 	case 29:
1021 		test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
1022 		break;
1023 
1024 	case 30:
1025 		test_cipher ("xeta", MODE_ECB, ENCRYPT, xeta_enc_tv_template, XETA_ENC_TEST_VECTORS);
1026 		test_cipher ("xeta", MODE_ECB, DECRYPT, xeta_dec_tv_template, XETA_DEC_TEST_VECTORS);
1027 		break;
1028 
1029 #ifdef CONFIG_CRYPTO_HMAC
1030 	case 100:
1031 		test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
1032 		break;
1033 
1034 	case 101:
1035 		test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
1036 		break;
1037 
1038 	case 102:
1039 		test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
1040 		break;
1041 
1042 #endif
1043 
1044 	case 200:
1045 		test_cipher_speed("aes", MODE_ECB, ENCRYPT, sec, NULL, 0,
1046 				  aes_speed_template);
1047 		test_cipher_speed("aes", MODE_ECB, DECRYPT, sec, NULL, 0,
1048 				  aes_speed_template);
1049 		test_cipher_speed("aes", MODE_CBC, ENCRYPT, sec, NULL, 0,
1050 				  aes_speed_template);
1051 		test_cipher_speed("aes", MODE_CBC, DECRYPT, sec, NULL, 0,
1052 				  aes_speed_template);
1053 		break;
1054 
1055 	case 201:
1056 		test_cipher_speed("des3_ede", MODE_ECB, ENCRYPT, sec,
1057 				  des3_ede_enc_tv_template,
1058 				  DES3_EDE_ENC_TEST_VECTORS,
1059 				  des3_ede_speed_template);
1060 		test_cipher_speed("des3_ede", MODE_ECB, DECRYPT, sec,
1061 				  des3_ede_dec_tv_template,
1062 				  DES3_EDE_DEC_TEST_VECTORS,
1063 				  des3_ede_speed_template);
1064 		test_cipher_speed("des3_ede", MODE_CBC, ENCRYPT, sec,
1065 				  des3_ede_enc_tv_template,
1066 				  DES3_EDE_ENC_TEST_VECTORS,
1067 				  des3_ede_speed_template);
1068 		test_cipher_speed("des3_ede", MODE_CBC, DECRYPT, sec,
1069 				  des3_ede_dec_tv_template,
1070 				  DES3_EDE_DEC_TEST_VECTORS,
1071 				  des3_ede_speed_template);
1072 		break;
1073 
1074 	case 202:
1075 		test_cipher_speed("twofish", MODE_ECB, ENCRYPT, sec, NULL, 0,
1076 				  twofish_speed_template);
1077 		test_cipher_speed("twofish", MODE_ECB, DECRYPT, sec, NULL, 0,
1078 				  twofish_speed_template);
1079 		test_cipher_speed("twofish", MODE_CBC, ENCRYPT, sec, NULL, 0,
1080 				  twofish_speed_template);
1081 		test_cipher_speed("twofish", MODE_CBC, DECRYPT, sec, NULL, 0,
1082 				  twofish_speed_template);
1083 		break;
1084 
1085 	case 203:
1086 		test_cipher_speed("blowfish", MODE_ECB, ENCRYPT, sec, NULL, 0,
1087 				  blowfish_speed_template);
1088 		test_cipher_speed("blowfish", MODE_ECB, DECRYPT, sec, NULL, 0,
1089 				  blowfish_speed_template);
1090 		test_cipher_speed("blowfish", MODE_CBC, ENCRYPT, sec, NULL, 0,
1091 				  blowfish_speed_template);
1092 		test_cipher_speed("blowfish", MODE_CBC, DECRYPT, sec, NULL, 0,
1093 				  blowfish_speed_template);
1094 		break;
1095 
1096 	case 204:
1097 		test_cipher_speed("des", MODE_ECB, ENCRYPT, sec, NULL, 0,
1098 				  des_speed_template);
1099 		test_cipher_speed("des", MODE_ECB, DECRYPT, sec, NULL, 0,
1100 				  des_speed_template);
1101 		test_cipher_speed("des", MODE_CBC, ENCRYPT, sec, NULL, 0,
1102 				  des_speed_template);
1103 		test_cipher_speed("des", MODE_CBC, DECRYPT, sec, NULL, 0,
1104 				  des_speed_template);
1105 		break;
1106 
1107 	case 1000:
1108 		test_available();
1109 		break;
1110 
1111 	default:
1112 		/* useful for debugging */
1113 		printk("not testing anything\n");
1114 		break;
1115 	}
1116 }
1117 
1118 static int __init init(void)
1119 {
1120 	tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL);
1121 	if (tvmem == NULL)
1122 		return -ENOMEM;
1123 
1124 	xbuf = kmalloc(XBUFSIZE, GFP_KERNEL);
1125 	if (xbuf == NULL) {
1126 		kfree(tvmem);
1127 		return -ENOMEM;
1128 	}
1129 
1130 	do_test();
1131 
1132 	kfree(xbuf);
1133 	kfree(tvmem);
1134 	return 0;
1135 }
1136 
1137 /*
1138  * If an init function is provided, an exit function must also be provided
1139  * to allow module unload.
1140  */
1141 static void __exit fini(void) { }
1142 
1143 module_init(init);
1144 module_exit(fini);
1145 
1146 module_param(mode, int, 0);
1147 module_param(sec, uint, 0);
1148 MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
1149 		      "(defaults to zero which uses CPU cycles instead)");
1150 
1151 MODULE_LICENSE("GPL");
1152 MODULE_DESCRIPTION("Quick & dirty crypto testing module");
1153 MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");
1154