2 * Quick & dirty crypto testing module.
4 * This will only exist until we have a better testing mechanism
5 * (e.g. a char device).
7 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
8 * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
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)
15 * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>)
16 * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt
20 #include <linux/init.h>
21 #include <linux/module.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>
35 * Need to kmalloc() memory for testing kmap().
37 #define TVMEMSIZE 16384
38 #define XBUFSIZE 32768
41 * Indexes into the xbuf to simulate cross-page access.
53 * Used by test_cipher()
60 static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
63 * Used by test_cipher_speed()
65 static unsigned int sec;
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", NULL
78 static void hexdump(unsigned char *buf, unsigned int len)
81 printk("%02x", *buf++);
86 static void test_hash(char *algo, struct hash_testvec *template,
90 unsigned int i, j, k, temp;
91 struct scatterlist sg[8];
93 struct crypto_tfm *tfm;
94 struct hash_testvec *hash_tv;
97 printk("\ntesting %s\n", algo);
99 tsize = sizeof(struct hash_testvec);
102 if (tsize > TVMEMSIZE) {
103 printk("template (%u) too big for tvmem (%u)\n", tsize, TVMEMSIZE);
107 memcpy(tvmem, template, tsize);
108 hash_tv = (void *)tvmem;
109 tfm = crypto_alloc_tfm(algo, 0);
111 printk("failed to load transform for %s\n", algo);
115 for (i = 0; i < tcount; i++) {
116 printk("test %u:\n", i + 1);
117 memset(result, 0, 64);
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;
124 crypto_digest_init(tfm);
125 if (tfm->crt_u.digest.dit_setkey) {
126 crypto_digest_setkey(tfm, hash_tv[i].key,
129 crypto_digest_update(tfm, sg, 1);
130 crypto_digest_final(tfm, result);
132 hexdump(result, crypto_tfm_alg_digestsize(tfm));
134 memcmp(result, hash_tv[i].digest,
135 crypto_tfm_alg_digestsize(tfm)) ?
139 printk("testing %s across pages\n", algo);
141 /* setup the dummy buffer first */
142 memset(xbuf, 0, XBUFSIZE);
145 for (i = 0; i < tcount; i++) {
148 printk("test %u:\n", j);
149 memset(result, 0, 64);
152 for (k = 0; k < hash_tv[i].np; k++) {
153 memcpy(&xbuf[IDX[k]],
154 hash_tv[i].plaintext + temp,
156 temp += hash_tv[i].tap[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];
163 crypto_digest_digest(tfm, sg, hash_tv[i].np, result);
165 hexdump(result, crypto_tfm_alg_digestsize(tfm));
167 memcmp(result, hash_tv[i].digest,
168 crypto_tfm_alg_digestsize(tfm)) ?
173 crypto_free_tfm(tfm);
177 #ifdef CONFIG_CRYPTO_HMAC
179 static void test_hmac(char *algo, struct hmac_testvec *template,
183 unsigned int i, j, k, temp;
184 struct scatterlist sg[8];
186 struct crypto_tfm *tfm;
187 struct hmac_testvec *hmac_tv;
188 unsigned int tsize, klen;
190 tfm = crypto_alloc_tfm(algo, 0);
192 printk("failed to load transform for %s\n", algo);
196 printk("\ntesting hmac_%s\n", algo);
198 tsize = sizeof(struct hmac_testvec);
200 if (tsize > TVMEMSIZE) {
201 printk("template (%u) too big for tvmem (%u)\n", tsize,
206 memcpy(tvmem, template, tsize);
207 hmac_tv = (void *)tvmem;
209 for (i = 0; i < tcount; i++) {
210 printk("test %u:\n", i + 1);
211 memset(result, 0, sizeof (result));
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;
219 crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, 1, result);
221 hexdump(result, crypto_tfm_alg_digestsize(tfm));
223 memcmp(result, hmac_tv[i].digest,
224 crypto_tfm_alg_digestsize(tfm)) ? "fail" :
228 printk("\ntesting hmac_%s across pages\n", algo);
230 memset(xbuf, 0, XBUFSIZE);
233 for (i = 0; i < tcount; i++) {
236 printk("test %u:\n",j);
237 memset(result, 0, 64);
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,
245 temp += hmac_tv[i].tap[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];
252 crypto_hmac(tfm, hmac_tv[i].key, &klen, sg,
253 hmac_tv[i].np, result);
254 hexdump(result, crypto_tfm_alg_digestsize(tfm));
257 memcmp(result, hmac_tv[i].digest,
258 crypto_tfm_alg_digestsize(tfm)) ?
263 crypto_free_tfm(tfm);
266 #endif /* CONFIG_CRYPTO_HMAC */
268 static void test_cipher(char *algo, int mode, int enc,
269 struct cipher_testvec *template, unsigned int tcount)
271 unsigned int ret, i, j, k, temp;
274 struct crypto_tfm *tfm;
276 struct cipher_testvec *cipher_tv;
277 struct scatterlist sg[8];
284 if (mode == MODE_ECB)
289 printk("\ntesting %s %s %s\n", algo, m, e);
291 tsize = sizeof (struct cipher_testvec);
294 if (tsize > TVMEMSIZE) {
295 printk("template (%u) too big for tvmem (%u)\n", tsize,
300 memcpy(tvmem, template, tsize);
301 cipher_tv = (void *)tvmem;
304 tfm = crypto_alloc_tfm(algo, 0);
306 tfm = crypto_alloc_tfm(algo, CRYPTO_TFM_MODE_CBC);
309 printk("failed to load transform for %s %s\n", algo, m);
314 for (i = 0; i < tcount; i++) {
315 if (!(cipher_tv[i].np)) {
317 printk("test %u (%d bit key):\n",
318 j, cipher_tv[i].klen * 8);
322 tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
323 key = cipher_tv[i].key;
325 ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
327 printk("setkey() failed flags=%x\n", tfm->crt_flags);
329 if (!cipher_tv[i].fail)
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;
339 crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
340 crypto_tfm_alg_ivsize(tfm));
344 ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
346 ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
350 printk("%s () failed flags=%x\n", e, tfm->crt_flags);
354 q = kmap(sg[0].page) + sg[0].offset;
355 hexdump(q, cipher_tv[i].rlen);
358 memcmp(q, cipher_tv[i].result,
359 cipher_tv[i].rlen) ? "fail" : "pass");
363 printk("\ntesting %s %s %s across pages (chunking)\n", algo, m, e);
364 memset(xbuf, 0, XBUFSIZE);
367 for (i = 0; i < tcount; i++) {
368 if (cipher_tv[i].np) {
370 printk("test %u (%d bit key):\n",
371 j, cipher_tv[i].klen * 8);
375 tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
376 key = cipher_tv[i].key;
378 ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
380 printk("setkey() failed flags=%x\n", tfm->crt_flags);
382 if (!cipher_tv[i].fail)
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];
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];
399 crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
400 crypto_tfm_alg_ivsize(tfm));
404 ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
406 ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
409 printk("%s () failed flags=%x\n", e, tfm->crt_flags);
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]);
419 memcmp(q, cipher_tv[i].result + temp,
420 cipher_tv[i].tap[k]) ? "fail" :
422 temp += cipher_tv[i].tap[k];
428 crypto_free_tfm(tfm);
431 static int test_cipher_jiffies(struct crypto_tfm *tfm, int enc, char *p,
434 struct scatterlist sg[8];
435 unsigned long start, end;
439 sg[0].page = virt_to_page(p);
440 sg[0].offset = offset_in_page(p);
443 for (start = jiffies, end = start + sec * HZ, bcount = 0;
444 time_before(jiffies, end); bcount++) {
446 ret = crypto_cipher_encrypt(tfm, sg, sg, blen);
448 ret = crypto_cipher_decrypt(tfm, sg, sg, blen);
454 printk("%d operations in %d seconds (%ld bytes)\n",
455 bcount, sec, (long)bcount * blen);
459 static int test_cipher_cycles(struct crypto_tfm *tfm, int enc, char *p,
462 struct scatterlist sg[8];
463 unsigned long cycles = 0;
467 sg[0].page = virt_to_page(p);
468 sg[0].offset = offset_in_page(p);
475 for (i = 0; i < 4; i++) {
477 ret = crypto_cipher_encrypt(tfm, sg, sg, blen);
479 ret = crypto_cipher_decrypt(tfm, sg, sg, blen);
485 /* The real thing. */
486 for (i = 0; i < 8; i++) {
489 start = get_cycles();
491 ret = crypto_cipher_encrypt(tfm, sg, sg, blen);
493 ret = crypto_cipher_decrypt(tfm, sg, sg, blen);
499 cycles += end - start;
507 printk("1 operation in %lu cycles (%d bytes)\n",
508 (cycles + 4) / 8, blen);
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)
517 unsigned int ret, i, j, iv_len;
518 unsigned char *key, *p, iv[128];
519 struct crypto_tfm *tfm;
526 if (mode == MODE_ECB)
531 printk("\ntesting speed of %s %s %s\n", algo, m, e);
534 tfm = crypto_alloc_tfm(algo, 0);
536 tfm = crypto_alloc_tfm(algo, CRYPTO_TFM_MODE_CBC);
539 printk("failed to load transform for %s %s\n", algo, m);
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);
550 printk("test %u (%d bit key, %d byte blocks): ", i,
551 speed[i].klen * 8, speed[i].blen);
553 memset(tvmem, 0xff, speed[i].klen + speed[i].blen);
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;
563 p = (unsigned char *)tvmem + speed[i].klen;
565 ret = crypto_cipher_setkey(tfm, key, speed[i].klen);
567 printk("setkey() failed flags=%x\n", tfm->crt_flags);
572 iv_len = crypto_tfm_alg_ivsize(tfm);
573 memset(&iv, 0xff, iv_len);
574 crypto_cipher_set_iv(tfm, iv, iv_len);
578 ret = test_cipher_jiffies(tfm, enc, p, speed[i].blen,
581 ret = test_cipher_cycles(tfm, enc, p, speed[i].blen);
584 printk("%s() failed flags=%x\n", e, tfm->crt_flags);
590 crypto_free_tfm(tfm);
593 static void test_deflate(void)
596 char result[COMP_BUF_SIZE];
597 struct crypto_tfm *tfm;
598 struct comp_testvec *tv;
601 printk("\ntesting deflate compression\n");
603 tsize = sizeof (deflate_comp_tv_template);
604 if (tsize > TVMEMSIZE) {
605 printk("template (%u) too big for tvmem (%u)\n", tsize,
610 memcpy(tvmem, deflate_comp_tv_template, tsize);
613 tfm = crypto_alloc_tfm("deflate", 0);
615 printk("failed to load transform for deflate\n");
619 for (i = 0; i < DEFLATE_COMP_TEST_VECTORS; i++) {
620 int ilen, ret, dlen = COMP_BUF_SIZE;
622 printk("test %u:\n", i + 1);
623 memset(result, 0, sizeof (result));
626 ret = crypto_comp_compress(tfm, tv[i].input,
627 ilen, result, &dlen);
629 printk("fail: ret=%d\n", ret);
632 hexdump(result, dlen);
633 printk("%s (ratio %d:%d)\n",
634 memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
638 printk("\ntesting deflate decompression\n");
640 tsize = sizeof (deflate_decomp_tv_template);
641 if (tsize > TVMEMSIZE) {
642 printk("template (%u) too big for tvmem (%u)\n", tsize,
647 memcpy(tvmem, deflate_decomp_tv_template, tsize);
650 for (i = 0; i < DEFLATE_DECOMP_TEST_VECTORS; i++) {
651 int ilen, ret, dlen = COMP_BUF_SIZE;
653 printk("test %u:\n", i + 1);
654 memset(result, 0, sizeof (result));
657 ret = crypto_comp_decompress(tfm, tv[i].input,
658 ilen, result, &dlen);
660 printk("fail: ret=%d\n", ret);
663 hexdump(result, dlen);
664 printk("%s (ratio %d:%d)\n",
665 memcmp(result, tv[i].output, dlen) ? "fail" : "pass",
669 crypto_free_tfm(tfm);
672 static void test_crc32c(void)
679 u8 b, test_vec[NUMVEC][VECSIZE];
680 static u32 vec_results[NUMVEC] = {
681 0x0e2c157f, 0xe980ebf6, 0xde74bded,
682 0xd579c862, 0xba979ad0, 0x2b29d913
684 static u32 tot_vec_results = 0x24c5d375;
686 struct scatterlist sg[NUMVEC];
687 struct crypto_tfm *tfm;
688 char *fmtdata = "testing crc32c initialized to %08x: %s\n";
689 #define SEEDTESTVAL 0xedcba987
692 printk("\ntesting crc32c\n");
694 tfm = crypto_alloc_tfm("crc32c", 0);
696 printk("failed to load transform for crc32c\n");
700 crypto_digest_init(tfm);
701 crypto_digest_final(tfm, (u8*)&crc);
702 printk(fmtdata, crc, (crc == 0) ? "pass" : "ERROR");
705 * stuff test_vec with known values, simple incrementing
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;
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)) ?
723 printk("testing crc32c using update/final:\n");
725 pass = 1; /* assume all is well */
727 for (i = 0; i < NUMVEC; i++) {
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);
735 printk(" %08x:BAD, wanted %08x\n", crc, vec_results[i]);
740 printk("\ntesting crc32c using incremental accumulator:\n");
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);
748 if (crc == tot_vec_results) {
749 printk(" %08x:OK", crc);
751 printk(" %08x:BAD, wanted %08x\n", crc, tot_vec_results);
755 printk("\ntesting crc32c using digest:\n");
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);
762 printk(" %08x:BAD, wanted %08x\n", crc, tot_vec_results);
766 printk("\n%s\n", pass ? "pass" : "ERROR");
768 crypto_free_tfm(tfm);
769 printk("crc32c test complete\n");
772 static void test_available(void)
777 printk("alg %s ", *name);
778 printk((crypto_alg_available(*name, 0)) ?
779 "found\n" : "not found\n");
784 static void do_test(void)
789 test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
791 test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
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);
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);
803 test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
805 test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
862 test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
863 test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
864 test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
865 test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
866 test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
867 test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
868 test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
869 test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
872 #ifdef CONFIG_CRYPTO_HMAC
873 test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
874 test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
875 test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
878 test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
882 test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
886 test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
890 test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS);
891 test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS);
892 test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS);
893 test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
897 test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS);
898 test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
902 test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
906 test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
910 test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS);
911 test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
912 test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS);
913 test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
917 test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS);
918 test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS);
919 test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS);
920 test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
924 test_cipher ("serpent", MODE_ECB, ENCRYPT, serpent_enc_tv_template, SERPENT_ENC_TEST_VECTORS);
925 test_cipher ("serpent", MODE_ECB, DECRYPT, serpent_dec_tv_template, SERPENT_DEC_TEST_VECTORS);
929 test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS);
930 test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);
934 test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
938 test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
946 test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS);
947 test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
951 test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS);
952 test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
956 test_cipher ("arc4", MODE_ECB, ENCRYPT, arc4_enc_tv_template, ARC4_ENC_TEST_VECTORS);
957 test_cipher ("arc4", MODE_ECB, DECRYPT, arc4_dec_tv_template, ARC4_DEC_TEST_VECTORS);
961 test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
969 test_cipher ("tea", MODE_ECB, ENCRYPT, tea_enc_tv_template, TEA_ENC_TEST_VECTORS);
970 test_cipher ("tea", MODE_ECB, DECRYPT, tea_dec_tv_template, TEA_DEC_TEST_VECTORS);
974 test_cipher ("xtea", MODE_ECB, ENCRYPT, xtea_enc_tv_template, XTEA_ENC_TEST_VECTORS);
975 test_cipher ("xtea", MODE_ECB, DECRYPT, xtea_dec_tv_template, XTEA_DEC_TEST_VECTORS);
979 test_cipher ("khazad", MODE_ECB, ENCRYPT, khazad_enc_tv_template, KHAZAD_ENC_TEST_VECTORS);
980 test_cipher ("khazad", MODE_ECB, DECRYPT, khazad_dec_tv_template, KHAZAD_DEC_TEST_VECTORS);
984 test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
988 test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
992 test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
996 test_cipher ("tnepres", MODE_ECB, ENCRYPT, tnepres_enc_tv_template, TNEPRES_ENC_TEST_VECTORS);
997 test_cipher ("tnepres", MODE_ECB, DECRYPT, tnepres_dec_tv_template, TNEPRES_DEC_TEST_VECTORS);
1001 test_cipher ("anubis", MODE_ECB, ENCRYPT, anubis_enc_tv_template, ANUBIS_ENC_TEST_VECTORS);
1002 test_cipher ("anubis", MODE_ECB, DECRYPT, anubis_dec_tv_template, ANUBIS_DEC_TEST_VECTORS);
1003 test_cipher ("anubis", MODE_CBC, ENCRYPT, anubis_cbc_enc_tv_template, ANUBIS_CBC_ENC_TEST_VECTORS);
1004 test_cipher ("anubis", MODE_CBC, DECRYPT, anubis_cbc_dec_tv_template, ANUBIS_CBC_ENC_TEST_VECTORS);
1008 test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
1013 test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
1017 test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
1020 #ifdef CONFIG_CRYPTO_HMAC
1022 test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
1026 test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
1030 test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
1036 test_cipher_speed("aes", MODE_ECB, ENCRYPT, sec, NULL, 0,
1037 aes_speed_template);
1038 test_cipher_speed("aes", MODE_ECB, DECRYPT, sec, NULL, 0,
1039 aes_speed_template);
1040 test_cipher_speed("aes", MODE_CBC, ENCRYPT, sec, NULL, 0,
1041 aes_speed_template);
1042 test_cipher_speed("aes", MODE_CBC, DECRYPT, sec, NULL, 0,
1043 aes_speed_template);
1047 test_cipher_speed("des3_ede", MODE_ECB, ENCRYPT, sec,
1048 des3_ede_enc_tv_template,
1049 DES3_EDE_ENC_TEST_VECTORS,
1050 des3_ede_speed_template);
1051 test_cipher_speed("des3_ede", MODE_ECB, DECRYPT, sec,
1052 des3_ede_dec_tv_template,
1053 DES3_EDE_DEC_TEST_VECTORS,
1054 des3_ede_speed_template);
1055 test_cipher_speed("des3_ede", MODE_CBC, ENCRYPT, sec,
1056 des3_ede_enc_tv_template,
1057 DES3_EDE_ENC_TEST_VECTORS,
1058 des3_ede_speed_template);
1059 test_cipher_speed("des3_ede", MODE_CBC, DECRYPT, sec,
1060 des3_ede_dec_tv_template,
1061 DES3_EDE_DEC_TEST_VECTORS,
1062 des3_ede_speed_template);
1066 test_cipher_speed("twofish", MODE_ECB, ENCRYPT, sec, NULL, 0,
1067 twofish_speed_template);
1068 test_cipher_speed("twofish", MODE_ECB, DECRYPT, sec, NULL, 0,
1069 twofish_speed_template);
1070 test_cipher_speed("twofish", MODE_CBC, ENCRYPT, sec, NULL, 0,
1071 twofish_speed_template);
1072 test_cipher_speed("twofish", MODE_CBC, DECRYPT, sec, NULL, 0,
1073 twofish_speed_template);
1077 test_cipher_speed("blowfish", MODE_ECB, ENCRYPT, sec, NULL, 0,
1078 blowfish_speed_template);
1079 test_cipher_speed("blowfish", MODE_ECB, DECRYPT, sec, NULL, 0,
1080 blowfish_speed_template);
1081 test_cipher_speed("blowfish", MODE_CBC, ENCRYPT, sec, NULL, 0,
1082 blowfish_speed_template);
1083 test_cipher_speed("blowfish", MODE_CBC, DECRYPT, sec, NULL, 0,
1084 blowfish_speed_template);
1088 test_cipher_speed("des", MODE_ECB, ENCRYPT, sec, NULL, 0,
1089 des_speed_template);
1090 test_cipher_speed("des", MODE_ECB, DECRYPT, sec, NULL, 0,
1091 des_speed_template);
1092 test_cipher_speed("des", MODE_CBC, ENCRYPT, sec, NULL, 0,
1093 des_speed_template);
1094 test_cipher_speed("des", MODE_CBC, DECRYPT, sec, NULL, 0,
1095 des_speed_template);
1103 /* useful for debugging */
1104 printk("not testing anything\n");
1109 static int __init init(void)
1111 tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL);
1115 xbuf = kmalloc(XBUFSIZE, GFP_KERNEL);
1129 * If an init function is provided, an exit function must also be provided
1130 * to allow module unload.
1132 static void __exit fini(void) { }
1137 module_param(mode, int, 0);
1138 module_param(sec, uint, 0);
1139 MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
1140 "(defaults to zero which uses CPU cycles instead)");
1142 MODULE_LICENSE("GPL");
1143 MODULE_DESCRIPTION("Quick & dirty crypto testing module");
1144 MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");