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)
16 #include <linux/init.h>
17 #include <linux/module.h>
18 #include <linux/string.h>
20 #include <linux/slab.h>
21 #include <asm/scatterlist.h>
22 #include <linux/string.h>
23 #include <linux/crypto.h>
24 #include <linux/highmem.h>
28 * Need to kmalloc() memory for testing kmap().
30 #define TVMEMSIZE 4096
31 #define XBUFSIZE 32768
34 * Indexes into the xbuf to simulate cross-page access.
50 hexdump(unsigned char *buf
, unsigned int len
)
53 printk("%02x", *buf
++);
63 struct scatterlist sg
[2];
65 struct crypto_tfm
*tfm
;
66 struct md5_testvec
*md5_tv
;
67 struct hmac_md5_testvec
*hmac_md5_tv
;
70 printk("\ntesting md5\n");
72 tsize
= sizeof (md5_tv_template
);
73 if (tsize
> TVMEMSIZE
) {
74 printk("template (%u) too big for tvmem (%u)\n", tsize
,
79 memcpy(tvmem
, md5_tv_template
, tsize
);
80 md5_tv
= (void *) tvmem
;
82 tfm
= crypto_alloc_tfm("md5", 0);
84 printk("failed to load transform for md5\n");
88 for (i
= 0; i
< MD5_TEST_VECTORS
; i
++) {
89 printk("test %u:\n", i
+ 1);
90 memset(result
, 0, sizeof (result
));
92 p
= md5_tv
[i
].plaintext
;
93 sg
[0].page
= virt_to_page(p
);
94 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
95 sg
[0].length
= strlen(md5_tv
[i
].plaintext
);
97 crypto_digest_init(tfm
);
98 crypto_digest_update(tfm
, sg
, 1);
99 crypto_digest_final(tfm
, result
);
101 hexdump(result
, crypto_tfm_alg_digestsize(tfm
));
103 memcmp(result
, md5_tv
[i
].digest
,
104 crypto_tfm_alg_digestsize(tfm
)) ? "fail" :
108 printk("\ntesting md5 across pages\n");
110 /* setup the dummy buffer first */
111 memset(xbuf
, 0, sizeof (xbuf
));
112 memcpy(&xbuf
[IDX1
], "abcdefghijklm", 13);
113 memcpy(&xbuf
[IDX2
], "nopqrstuvwxyz", 13);
116 sg
[0].page
= virt_to_page(p
);
117 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
121 sg
[1].page
= virt_to_page(p
);
122 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
125 memset(result
, 0, sizeof (result
));
126 crypto_digest_digest(tfm
, sg
, 2, result
);
127 hexdump(result
, crypto_tfm_alg_digestsize(tfm
));
130 memcmp(result
, md5_tv
[4].digest
,
131 crypto_tfm_alg_digestsize(tfm
)) ? "fail" : "pass");
133 printk("\ntesting hmac_md5\n");
135 tsize
= sizeof (hmac_md5_tv_template
);
136 if (tsize
> TVMEMSIZE
) {
137 printk("template (%u) too big for tvmem (%u)\n", tsize
,
142 memcpy(tvmem
, hmac_md5_tv_template
, tsize
);
143 hmac_md5_tv
= (void *) tvmem
;
145 for (i
= 0; i
< HMAC_MD5_TEST_VECTORS
; i
++) {
146 printk("test %u:\n", i
+ 1);
147 memset(result
, 0, sizeof (result
));
149 p
= hmac_md5_tv
[i
].plaintext
;
150 sg
[0].page
= virt_to_page(p
);
151 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
152 sg
[0].length
= strlen(hmac_md5_tv
[i
].plaintext
);
154 crypto_digest_hmac(tfm
, hmac_md5_tv
[i
].key
,
155 strlen(hmac_md5_tv
[i
].key
), sg
, 1, result
);
157 hexdump(result
, crypto_tfm_alg_digestsize(tfm
));
159 memcmp(result
, hmac_md5_tv
[i
].digest
,
160 crypto_tfm_alg_digestsize(tfm
)) ? "fail" :
164 printk("\ntesting hmac_md5 across pages\n");
166 memset(xbuf
, 0, sizeof (xbuf
));
168 memcpy(&xbuf
[IDX1
], "what do ya want ", 16);
169 memcpy(&xbuf
[IDX2
], "for nothing?", 12);
172 sg
[0].page
= virt_to_page(p
);
173 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
177 sg
[1].page
= virt_to_page(p
);
178 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
181 memset(result
, 0, sizeof (result
));
182 crypto_digest_hmac(tfm
, hmac_md5_tv
[1].key
, strlen(hmac_md5_tv
[1].key
),
184 hexdump(result
, crypto_tfm_alg_digestsize(tfm
));
187 memcmp(result
, hmac_md5_tv
[1].digest
,
188 crypto_tfm_alg_digestsize(tfm
)) ? "fail" : "pass");
190 crypto_free_tfm(tfm
);
198 struct scatterlist sg
[1];
200 struct crypto_tfm
*tfm
;
201 struct md4_testvec
*md4_tv
;
204 printk("\ntesting md4\n");
206 tsize
= sizeof (md4_tv_template
);
207 if (tsize
> TVMEMSIZE
) {
208 printk("template (%u) too big for tvmem (%u)\n", tsize
,
213 memcpy(tvmem
, md4_tv_template
, tsize
);
214 md4_tv
= (void *) tvmem
;
216 tfm
= crypto_alloc_tfm("md4", 0);
218 printk("failed to load transform for md4\n");
222 for (i
= 0; i
< MD4_TEST_VECTORS
; i
++) {
223 printk("test %u:\n", i
+ 1);
224 memset(result
, 0, sizeof (result
));
226 p
= md4_tv
[i
].plaintext
;
227 sg
[0].page
= virt_to_page(p
);
228 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
229 sg
[0].length
= strlen(md4_tv
[i
].plaintext
);
231 crypto_digest_digest(tfm
, sg
, 1, result
);
233 hexdump(result
, crypto_tfm_alg_digestsize(tfm
));
235 memcmp(result
, md4_tv
[i
].digest
,
236 crypto_tfm_alg_digestsize(tfm
)) ? "fail" :
240 crypto_free_tfm(tfm
);
248 struct crypto_tfm
*tfm
;
249 struct sha1_testvec
*sha1_tv
;
250 struct hmac_sha1_testvec
*hmac_sha1_tv
;
251 struct scatterlist sg
[2];
253 char result
[SHA1_DIGEST_SIZE
];
255 printk("\ntesting sha1\n");
257 tsize
= sizeof (sha1_tv_template
);
258 if (tsize
> TVMEMSIZE
) {
259 printk("template (%u) too big for tvmem (%u)\n", tsize
,
264 memcpy(tvmem
, sha1_tv_template
, tsize
);
265 sha1_tv
= (void *) tvmem
;
267 tfm
= crypto_alloc_tfm("sha1", 0);
269 printk("failed to load transform for sha1\n");
273 for (i
= 0; i
< SHA1_TEST_VECTORS
; i
++) {
274 printk("test %u:\n", i
+ 1);
275 memset(result
, 0, sizeof (result
));
277 p
= sha1_tv
[i
].plaintext
;
278 sg
[0].page
= virt_to_page(p
);
279 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
280 sg
[0].length
= strlen(sha1_tv
[i
].plaintext
);
282 crypto_digest_init(tfm
);
283 crypto_digest_update(tfm
, sg
, 1);
284 crypto_digest_final(tfm
, result
);
286 hexdump(result
, crypto_tfm_alg_digestsize(tfm
));
288 memcmp(result
, sha1_tv
[i
].digest
,
289 crypto_tfm_alg_digestsize(tfm
)) ? "fail" :
293 printk("\ntesting sha1 across pages\n");
295 /* setup the dummy buffer first */
296 memset(xbuf
, 0, sizeof (xbuf
));
297 memcpy(&xbuf
[IDX1
], "abcdbcdecdefdefgefghfghighij", 28);
298 memcpy(&xbuf
[IDX2
], "hijkijkljklmklmnlmnomnopnopq", 28);
301 sg
[0].page
= virt_to_page(p
);
302 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
306 sg
[1].page
= virt_to_page(p
);
307 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
310 memset(result
, 0, sizeof (result
));
311 crypto_digest_digest(tfm
, sg
, 2, result
);
312 hexdump(result
, crypto_tfm_alg_digestsize(tfm
));
314 memcmp(result
, sha1_tv
[1].digest
,
315 crypto_tfm_alg_digestsize(tfm
)) ? "fail" : "pass");
317 printk("\ntesting hmac_sha1\n");
319 tsize
= sizeof (hmac_sha1_tv_template
);
320 if (tsize
> TVMEMSIZE
) {
321 printk("template (%u) too big for tvmem (%u)\n", tsize
,
326 memcpy(tvmem
, hmac_sha1_tv_template
, tsize
);
327 hmac_sha1_tv
= (void *) tvmem
;
329 for (i
= 0; i
< HMAC_SHA1_TEST_VECTORS
; i
++) {
330 printk("test %u:\n", i
+ 1);
331 memset(result
, 0, sizeof (result
));
333 p
= hmac_sha1_tv
[i
].plaintext
;
334 sg
[0].page
= virt_to_page(p
);
335 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
336 sg
[0].length
= strlen(hmac_sha1_tv
[i
].plaintext
);
338 crypto_digest_hmac(tfm
, hmac_sha1_tv
[i
].key
,
339 strlen(hmac_sha1_tv
[i
].key
), sg
, 1, result
);
341 hexdump(result
, sizeof (result
));
343 memcmp(result
, hmac_sha1_tv
[i
].digest
,
344 crypto_tfm_alg_digestsize(tfm
)) ? "fail" :
348 printk("\ntesting hmac_sha1 across pages\n");
350 /* setup the dummy buffer first */
351 memset(xbuf
, 0, sizeof (xbuf
));
353 memcpy(&xbuf
[IDX1
], "what do ya want ", 16);
354 memcpy(&xbuf
[IDX2
], "for nothing?", 12);
357 sg
[0].page
= virt_to_page(p
);
358 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
362 sg
[1].page
= virt_to_page(p
);
363 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
366 memset(result
, 0, sizeof (result
));
367 crypto_digest_hmac(tfm
, hmac_sha1_tv
[1].key
,
368 strlen(hmac_sha1_tv
[1].key
), sg
, 2, result
);
369 hexdump(result
, crypto_tfm_alg_digestsize(tfm
));
372 memcmp(result
, hmac_sha1_tv
[1].digest
,
373 crypto_tfm_alg_digestsize(tfm
)) ? "fail" : "pass");
374 crypto_free_tfm(tfm
);
380 unsigned int ret
, i
, len
;
383 struct crypto_tfm
*tfm
;
386 struct des_tv
*des_tv
;
387 struct scatterlist sg
[8];
389 printk("\ntesting des encryption\n");
391 tsize
= sizeof (des_enc_tv_template
);
392 if (tsize
> TVMEMSIZE
) {
393 printk("template (%u) too big for tvmem (%u)\n", tsize
,
398 memcpy(tvmem
, des_enc_tv_template
, tsize
);
399 des_tv
= (void *) tvmem
;
401 tfm
= crypto_alloc_tfm("des", 0);
403 printk("failed to load transform for des (default ecb)\n");
407 for (i
= 0; i
< DES_ENC_TEST_VECTORS
; i
++) {
408 printk("test %u:\n", i
+ 1);
411 tfm
->crt_flags
|= CRYPTO_TFM_REQ_WEAK_KEY
;
413 ret
= crypto_cipher_setkey(tfm
, key
, 8);
415 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
423 p
= des_tv
[i
].plaintext
;
424 sg
[0].page
= virt_to_page(p
);
425 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
427 ret
= crypto_cipher_encrypt(tfm
, sg
, 1);
429 printk("encrypt() failed flags=%x\n", tfm
->crt_flags
);
433 q
= kmap(sg
[0].page
) + sg
[0].offset
;
437 memcmp(q
, des_tv
[i
].result
, len
) ? "fail" : "pass");
441 printk("\ntesting des ecb encryption across pages\n");
449 ret
= crypto_cipher_setkey(tfm
, key
, 8);
451 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
455 /* setup the dummy buffer first */
456 memset(xbuf
, 0, sizeof (xbuf
));
457 memcpy(&xbuf
[IDX1
], des_tv
[i
].plaintext
, 8);
458 memcpy(&xbuf
[IDX2
], des_tv
[i
].plaintext
+ 8, 8);
461 sg
[0].page
= virt_to_page(p
);
462 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
466 sg
[1].page
= virt_to_page(p
);
467 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
470 ret
= crypto_cipher_encrypt(tfm
, sg
, 2);
472 printk("encrypt() failed flags=%x\n", tfm
->crt_flags
);
477 q
= kmap(sg
[0].page
) + sg
[0].offset
;
479 printk("%s\n", memcmp(q
, des_tv
[i
].result
, 8) ? "fail" : "pass");
482 q
= kmap(sg
[1].page
) + sg
[1].offset
;
484 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 8, 8) ? "fail" : "pass");
486 printk("\ntesting des ecb encryption chunking scenario A\n");
492 * [8 + 6] [2 + 8] [8]
496 * Chunking should begin at a, then end with b, and
497 * continue encrypting at an offset of 2 until c.
505 ret
= crypto_cipher_setkey(tfm
, key
, 8);
507 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
511 /* setup the dummy buffer first */
512 memset(xbuf
, 0, sizeof (xbuf
));
515 memcpy(&xbuf
[IDX3
], des_tv
[i
].plaintext
, 14);
518 memcpy(&xbuf
[IDX4
], des_tv
[i
].plaintext
+ 14, 10);
521 memcpy(&xbuf
[IDX5
], des_tv
[i
].plaintext
+ 24, 8);
524 sg
[0].page
= virt_to_page(p
);
525 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
529 sg
[1].page
= virt_to_page(p
);
530 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
534 sg
[2].page
= virt_to_page(p
);
535 sg
[2].offset
= ((long) p
& ~PAGE_MASK
);
538 ret
= crypto_cipher_encrypt(tfm
, sg
, 3);
541 printk("decrypt() failed flags=%x\n", tfm
->crt_flags
);
546 q
= kmap(sg
[0].page
) + sg
[0].offset
;
548 printk("%s\n", memcmp(q
, des_tv
[i
].result
, 14) ? "fail" : "pass");
551 q
= kmap(sg
[1].page
) + sg
[1].offset
;
553 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 14, 10) ? "fail" : "pass");
556 q
= kmap(sg
[2].page
) + sg
[2].offset
;
558 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 24, 8) ? "fail" : "pass");
560 printk("\ntesting des ecb encryption chunking scenario B\n");
566 * [2] [1] [3] [2 + 8 + 8]
573 ret
= crypto_cipher_setkey(tfm
, key
, 8);
575 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
579 /* setup the dummy buffer first */
580 memset(xbuf
, 0, sizeof (xbuf
));
583 memcpy(&xbuf
[IDX3
], des_tv
[i
].plaintext
, 2);
586 memcpy(&xbuf
[IDX4
], des_tv
[i
].plaintext
+ 2, 1);
589 memcpy(&xbuf
[IDX5
], des_tv
[i
].plaintext
+ 3, 3);
591 /* Frag 4: 2 + 8 + 8 */
592 memcpy(&xbuf
[IDX6
], des_tv
[i
].plaintext
+ 6, 18);
595 sg
[0].page
= virt_to_page(p
);
596 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
600 sg
[1].page
= virt_to_page(p
);
601 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
605 sg
[2].page
= virt_to_page(p
);
606 sg
[2].offset
= ((long) p
& ~PAGE_MASK
);
610 sg
[3].page
= virt_to_page(p
);
611 sg
[3].offset
= ((long) p
& ~PAGE_MASK
);
614 ret
= crypto_cipher_encrypt(tfm
, sg
, 4);
617 printk("encrypt() failed flags=%x\n", tfm
->crt_flags
);
622 q
= kmap(sg
[0].page
) + sg
[0].offset
;
624 printk("%s\n", memcmp(q
, des_tv
[i
].result
, 2) ? "fail" : "pass");
627 q
= kmap(sg
[1].page
) + sg
[1].offset
;
629 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 2, 1) ? "fail" : "pass");
632 q
= kmap(sg
[2].page
) + sg
[2].offset
;
634 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 3, 3) ? "fail" : "pass");
637 q
= kmap(sg
[3].page
) + sg
[3].offset
;
639 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 6, 18) ? "fail" : "pass");
641 printk("\ntesting des ecb encryption chunking scenario C\n");
647 * [2] [2] [2] [2] [8]
654 ret
= crypto_cipher_setkey(tfm
, key
, 8);
656 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
660 /* setup the dummy buffer first */
661 memset(xbuf
, 0, sizeof (xbuf
));
664 memcpy(&xbuf
[IDX3
], des_tv
[i
].plaintext
, 2);
667 memcpy(&xbuf
[IDX4
], des_tv
[i
].plaintext
+ 2, 2);
670 memcpy(&xbuf
[IDX5
], des_tv
[i
].plaintext
+ 4, 2);
673 memcpy(&xbuf
[IDX6
], des_tv
[i
].plaintext
+ 6, 2);
676 memcpy(&xbuf
[IDX7
], des_tv
[i
].plaintext
+ 8, 8);
679 sg
[0].page
= virt_to_page(p
);
680 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
684 sg
[1].page
= virt_to_page(p
);
685 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
689 sg
[2].page
= virt_to_page(p
);
690 sg
[2].offset
= ((long) p
& ~PAGE_MASK
);
694 sg
[3].page
= virt_to_page(p
);
695 sg
[3].offset
= ((long) p
& ~PAGE_MASK
);
699 sg
[4].page
= virt_to_page(p
);
700 sg
[4].offset
= ((long) p
& ~PAGE_MASK
);
703 ret
= crypto_cipher_encrypt(tfm
, sg
, 5);
706 printk("encrypt() failed flags=%x\n", tfm
->crt_flags
);
711 q
= kmap(sg
[0].page
) + sg
[0].offset
;
713 printk("%s\n", memcmp(q
, des_tv
[i
].result
, 2) ? "fail" : "pass");
716 q
= kmap(sg
[1].page
) + sg
[1].offset
;
718 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 2, 2) ? "fail" : "pass");
721 q
= kmap(sg
[2].page
) + sg
[2].offset
;
723 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 4, 2) ? "fail" : "pass");
726 q
= kmap(sg
[3].page
) + sg
[3].offset
;
728 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 6, 2) ? "fail" : "pass");
731 q
= kmap(sg
[4].page
) + sg
[4].offset
;
733 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 8, 8) ? "fail" : "pass");
735 printk("\ntesting des ecb encryption chunking scenario D (atomic)\n");
738 * Scenario D, torture test, one byte per frag.
744 ret
= crypto_cipher_setkey(tfm
, key
, 8);
746 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
750 /* setup the dummy buffer first */
751 memset(xbuf
, 0, sizeof (xbuf
));
753 xbuf
[IDX1
] = des_tv
[i
].plaintext
[0];
754 xbuf
[IDX2
] = des_tv
[i
].plaintext
[1];
755 xbuf
[IDX3
] = des_tv
[i
].plaintext
[2];
756 xbuf
[IDX4
] = des_tv
[i
].plaintext
[3];
757 xbuf
[IDX5
] = des_tv
[i
].plaintext
[4];
758 xbuf
[IDX6
] = des_tv
[i
].plaintext
[5];
759 xbuf
[IDX7
] = des_tv
[i
].plaintext
[6];
760 xbuf
[IDX8
] = des_tv
[i
].plaintext
[7];
763 sg
[0].page
= virt_to_page(p
);
764 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
768 sg
[1].page
= virt_to_page(p
);
769 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
773 sg
[2].page
= virt_to_page(p
);
774 sg
[2].offset
= ((long) p
& ~PAGE_MASK
);
778 sg
[3].page
= virt_to_page(p
);
779 sg
[3].offset
= ((long) p
& ~PAGE_MASK
);
783 sg
[4].page
= virt_to_page(p
);
784 sg
[4].offset
= ((long) p
& ~PAGE_MASK
);
788 sg
[5].page
= virt_to_page(p
);
789 sg
[5].offset
= ((long) p
& ~PAGE_MASK
);
793 sg
[6].page
= virt_to_page(p
);
794 sg
[6].offset
= ((long) p
& ~PAGE_MASK
);
798 sg
[7].page
= virt_to_page(p
);
799 sg
[7].offset
= ((long) p
& ~PAGE_MASK
);
802 ret
= crypto_cipher_encrypt(tfm
, sg
, 8);
804 printk("encrypt() failed flags=%x\n", tfm
->crt_flags
);
808 for (i
= 0; i
< 8; i
++)
809 res
[i
] = *(char *) (kmap(sg
[i
].page
) + sg
[i
].offset
);
812 printk("%s\n", memcmp(res
, des_tv
[7].result
, 8) ? "fail" : "pass");
814 printk("\ntesting des decryption\n");
816 tsize
= sizeof (des_dec_tv_template
);
817 if (tsize
> TVMEMSIZE
) {
818 printk("template (%u) too big for tvmem (%u)\n", tsize
,
822 memcpy(tvmem
, des_dec_tv_template
, tsize
);
823 des_tv
= (void *) tvmem
;
825 for (i
= 0; i
< DES_DEC_TEST_VECTORS
; i
++) {
826 printk("test %u:\n", i
+ 1);
831 ret
= crypto_cipher_setkey(tfm
, key
, 8);
833 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
839 p
= des_tv
[i
].plaintext
;
840 sg
[0].page
= virt_to_page(p
);
841 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
844 ret
= crypto_cipher_decrypt(tfm
, sg
, 1);
846 printk("des_decrypt() failed flags=%x\n",
851 q
= kmap(sg
[0].page
) + sg
[0].offset
;
855 memcmp(q
, des_tv
[i
].result
, len
) ? "fail" : "pass");
859 printk("\ntesting des ecb decryption across pages\n");
866 ret
= crypto_cipher_setkey(tfm
, key
, 8);
868 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
872 /* setup the dummy buffer first */
873 memset(xbuf
, 0, sizeof (xbuf
));
874 memcpy(&xbuf
[IDX1
], des_tv
[i
].plaintext
, 8);
875 memcpy(&xbuf
[IDX2
], des_tv
[i
].plaintext
+ 8, 8);
878 sg
[0].page
= virt_to_page(p
);
879 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
883 sg
[1].page
= virt_to_page(p
);
884 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
887 ret
= crypto_cipher_decrypt(tfm
, sg
, 2);
889 printk("decrypt() failed flags=%x\n", tfm
->crt_flags
);
894 q
= kmap(sg
[0].page
) + sg
[0].offset
;
896 printk("%s\n", memcmp(q
, des_tv
[i
].result
, 8) ? "fail" : "pass");
899 q
= kmap(sg
[1].page
) + sg
[1].offset
;
901 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 8, 8) ? "fail" : "pass");
910 printk("\ntesting des ecb decryption chunking scenario E\n");
916 ret
= crypto_cipher_setkey(tfm
, key
, 8);
918 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
922 /* setup the dummy buffer first */
923 memset(xbuf
, 0, sizeof (xbuf
));
925 memcpy(&xbuf
[IDX1
], des_tv
[i
].plaintext
, 3);
926 memcpy(&xbuf
[IDX2
], des_tv
[i
].plaintext
+ 3, 12);
927 memcpy(&xbuf
[IDX3
], des_tv
[i
].plaintext
+ 15, 1);
930 sg
[0].page
= virt_to_page(p
);
931 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
935 sg
[1].page
= virt_to_page(p
);
936 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
940 sg
[2].page
= virt_to_page(p
);
941 sg
[2].offset
= ((long) p
& ~PAGE_MASK
);
944 ret
= crypto_cipher_decrypt(tfm
, sg
, 3);
947 printk("decrypt() failed flags=%x\n", tfm
->crt_flags
);
952 q
= kmap(sg
[0].page
) + sg
[0].offset
;
954 printk("%s\n", memcmp(q
, des_tv
[i
].result
, 3) ? "fail" : "pass");
957 q
= kmap(sg
[1].page
) + sg
[1].offset
;
959 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 3, 12) ? "fail" : "pass");
962 q
= kmap(sg
[2].page
) + sg
[2].offset
;
964 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 15, 1) ? "fail" : "pass");
966 crypto_free_tfm(tfm
);
968 tfm
= crypto_alloc_tfm("des", CRYPTO_TFM_MODE_CBC
);
970 printk("failed to load transform for des cbc\n");
974 printk("\ntesting des cbc encryption (atomic)\n");
976 tsize
= sizeof (des_cbc_enc_tv_template
);
977 if (tsize
> TVMEMSIZE
) {
978 printk("template (%u) too big for tvmem (%u)\n", tsize
,
982 memcpy(tvmem
, des_cbc_enc_tv_template
, tsize
);
983 des_tv
= (void *) tvmem
;
985 crypto_cipher_set_iv(tfm
, des_tv
[i
].iv
, crypto_tfm_alg_ivsize(tfm
));
986 crypto_cipher_get_iv(tfm
, res
, crypto_tfm_alg_ivsize(tfm
));
988 if (memcmp(res
, des_tv
[i
].iv
, sizeof(res
))) {
989 printk("crypto_cipher_[set|get]_iv() failed\n");
993 for (i
= 0; i
< DES_CBC_ENC_TEST_VECTORS
; i
++) {
994 printk("test %u:\n", i
+ 1);
998 ret
= crypto_cipher_setkey(tfm
, key
, 8);
1000 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
1004 len
= des_tv
[i
].len
;
1005 p
= des_tv
[i
].plaintext
;
1007 sg
[0].page
= virt_to_page(p
);
1008 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
1011 crypto_cipher_set_iv(tfm
, des_tv
[i
].iv
,
1012 crypto_tfm_alg_ivsize(tfm
));
1014 ret
= crypto_cipher_encrypt(tfm
, sg
, 1);
1016 printk("des_cbc_encrypt() failed flags=%x\n",
1021 q
= kmap(sg
[0].page
) + sg
[0].offset
;
1025 memcmp(q
, des_tv
[i
].result
, len
) ? "fail" : "pass");
1028 crypto_free_tfm(tfm
);
1037 printk("\ntesting des cbc encryption chunking scenario F\n");
1040 tfm
= crypto_alloc_tfm("des", CRYPTO_TFM_MODE_CBC
);
1042 printk("failed to load transform for CRYPTO_ALG_DES_CCB\n");
1047 key
= des_tv
[i
].key
;
1049 ret
= crypto_cipher_setkey(tfm
, key
, 8);
1051 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
1055 /* setup the dummy buffer first */
1056 memset(xbuf
, 0, sizeof (xbuf
));
1058 memcpy(&xbuf
[IDX1
], des_tv
[i
].plaintext
, 13);
1059 memcpy(&xbuf
[IDX2
], des_tv
[i
].plaintext
+ 13, 11);
1062 sg
[0].page
= virt_to_page(p
);
1063 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
1067 sg
[1].page
= virt_to_page(p
);
1068 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
1071 crypto_cipher_set_iv(tfm
, des_tv
[i
].iv
, crypto_tfm_alg_ivsize(tfm
));
1073 ret
= crypto_cipher_encrypt(tfm
, sg
, 2);
1075 printk("des_cbc_decrypt() failed flags=%x\n", tfm
->crt_flags
);
1080 q
= kmap(sg
[0].page
) + sg
[0].offset
;
1082 printk("%s\n", memcmp(q
, des_tv
[i
].result
, 13) ? "fail" : "pass");
1085 q
= kmap(sg
[1].page
) + sg
[1].offset
;
1087 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 13, 11) ? "fail" : "pass");
1089 tsize
= sizeof (des_cbc_dec_tv_template
);
1090 if (tsize
> TVMEMSIZE
) {
1091 printk("template (%u) too big for tvmem (%u)\n", tsize
,
1095 memcpy(tvmem
, des_cbc_dec_tv_template
, tsize
);
1096 des_tv
= (void *) tvmem
;
1098 printk("\ntesting des cbc decryption\n");
1100 for (i
= 0; i
< DES_CBC_DEC_TEST_VECTORS
; i
++) {
1101 printk("test %u:\n", i
+ 1);
1104 key
= des_tv
[i
].key
;
1106 ret
= crypto_cipher_setkey(tfm
, key
, 8);
1108 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
1112 len
= des_tv
[i
].len
;
1113 p
= des_tv
[i
].plaintext
;
1115 sg
[0].page
= virt_to_page(p
);
1116 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
1119 crypto_cipher_set_iv(tfm
, des_tv
[i
].iv
,
1120 crypto_tfm_alg_blocksize(tfm
));
1122 ret
= crypto_cipher_decrypt(tfm
, sg
, 1);
1124 printk("des_cbc_decrypt() failed flags=%x\n",
1129 hexdump(tfm
->crt_cipher
.cit_iv
, 8);
1131 q
= kmap(sg
[0].page
) + sg
[0].offset
;
1135 memcmp(q
, des_tv
[i
].result
, len
) ? "fail" : "pass");
1145 printk("\ntesting des cbc decryption chunking scenario G\n");
1149 key
= des_tv
[i
].key
;
1151 ret
= crypto_cipher_setkey(tfm
, key
, 8);
1153 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
1157 /* setup the dummy buffer first */
1158 memset(xbuf
, 0, sizeof (xbuf
));
1159 memcpy(&xbuf
[IDX1
], des_tv
[i
].plaintext
, 4);
1160 memcpy(&xbuf
[IDX2
], des_tv
[i
].plaintext
+ 4, 4);
1163 sg
[0].page
= virt_to_page(p
);
1164 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
1168 sg
[1].page
= virt_to_page(p
);
1169 sg
[1].offset
= ((long) p
& ~PAGE_MASK
);
1172 crypto_cipher_set_iv(tfm
, des_tv
[i
].iv
, crypto_tfm_alg_ivsize(tfm
));
1174 ret
= crypto_cipher_decrypt(tfm
, sg
, 2);
1176 printk("des_cbc_decrypt() failed flags=%x\n", tfm
->crt_flags
);
1181 q
= kmap(sg
[0].page
) + sg
[0].offset
;
1183 printk("%s\n", memcmp(q
, des_tv
[i
].result
, 4) ? "fail" : "pass");
1186 q
= kmap(sg
[1].page
) + sg
[1].offset
;
1188 printk("%s\n", memcmp(q
, des_tv
[i
].result
+ 4, 4) ? "fail" : "pass");
1191 crypto_free_tfm(tfm
);
1197 unsigned int ret
, i
, len
;
1200 struct crypto_tfm
*tfm
;
1203 struct des_tv
*des_tv
;
1204 struct scatterlist sg
[8];
1206 printk("\ntesting des3 ede encryption\n");
1208 tsize
= sizeof (des3_ede_enc_tv_template
);
1209 if (tsize
> TVMEMSIZE
) {
1210 printk("template (%u) too big for tvmem (%u)\n", tsize
,
1215 memcpy(tvmem
, des3_ede_enc_tv_template
, tsize
);
1216 des_tv
= (void *) tvmem
;
1218 tfm
= crypto_alloc_tfm("des3_ede", CRYPTO_TFM_MODE_ECB
);
1220 printk("failed to load transform for 3des ecb\n");
1224 for (i
= 0; i
< DES3_EDE_ENC_TEST_VECTORS
; i
++) {
1225 printk("test %u:\n", i
+ 1);
1227 key
= des_tv
[i
].key
;
1228 ret
= crypto_cipher_setkey(tfm
, key
, 24);
1230 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
1232 if (!des_tv
[i
].fail
)
1236 len
= des_tv
[i
].len
;
1238 p
= des_tv
[i
].plaintext
;
1239 sg
[0].page
= virt_to_page(p
);
1240 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
1242 ret
= crypto_cipher_encrypt(tfm
, sg
, 1);
1244 printk("encrypt() failed flags=%x\n", tfm
->crt_flags
);
1248 q
= kmap(sg
[0].page
) + sg
[0].offset
;
1252 memcmp(q
, des_tv
[i
].result
, len
) ? "fail" : "pass");
1255 printk("\ntesting des3 ede decryption\n");
1257 tsize
= sizeof (des3_ede_dec_tv_template
);
1258 if (tsize
> TVMEMSIZE
) {
1259 printk("template (%u) too big for tvmem (%u)\n", tsize
,
1264 memcpy(tvmem
, des3_ede_dec_tv_template
, tsize
);
1265 des_tv
= (void *) tvmem
;
1267 for (i
= 0; i
< DES3_EDE_DEC_TEST_VECTORS
; i
++) {
1268 printk("test %u:\n", i
+ 1);
1270 key
= des_tv
[i
].key
;
1271 ret
= crypto_cipher_setkey(tfm
, key
, 24);
1273 printk("setkey() failed flags=%x\n", tfm
->crt_flags
);
1275 if (!des_tv
[i
].fail
)
1279 len
= des_tv
[i
].len
;
1281 p
= des_tv
[i
].plaintext
;
1282 sg
[0].page
= virt_to_page(p
);
1283 sg
[0].offset
= ((long) p
& ~PAGE_MASK
);
1285 ret
= crypto_cipher_decrypt(tfm
, sg
, 1);
1287 printk("decrypt() failed flags=%x\n", tfm
->crt_flags
);
1291 q
= kmap(sg
[0].page
) + sg
[0].offset
;
1295 memcmp(q
, des_tv
[i
].result
, len
) ? "fail" : "pass");
1299 crypto_free_tfm(tfm
);
1336 /* useful for debugging */
1337 printk("not testing anything\n");
1345 tvmem
= kmalloc(TVMEMSIZE
, GFP_KERNEL
);
1349 xbuf
= kmalloc(XBUFSIZE
, GFP_KERNEL
);
1364 MODULE_PARM(mode
, "i");
1366 MODULE_LICENSE("GPL");
1367 MODULE_DESCRIPTION("Quick & dirty crypto testing module");
1368 MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");