patch-2.4.25 linux-2.4.25/crypto/tcrypt.c
Next file: linux-2.4.25/crypto/tcrypt.h
Previous file: linux-2.4.25/crypto/sha512.c
Back to the patch index
Back to the overall index
- Lines: 2761
- Date:
2004-02-18 05:36:31.000000000 -0800
- Orig file:
linux-2.4.24/crypto/tcrypt.c
- Orig date:
2003-11-28 10:26:19.000000000 -0800
diff -urN linux-2.4.24/crypto/tcrypt.c linux-2.4.25/crypto/tcrypt.c
@@ -6,16 +6,18 @@
*
* 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
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
+ * 14 - 09 - 2003
+ * Rewritten by Kartikey Mahendra Bhatt
*/
+
#include <linux/init.h>
#include <linux/module.h>
-#include <linux/string.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <asm/scatterlist.h>
@@ -24,6 +26,8 @@
#include <linux/highmem.h>
#include "tcrypt.h"
+#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK)
+
/*
* Need to kmalloc() memory for testing kmap().
*/
@@ -38,2254 +42,375 @@
#define IDX3 1
#define IDX4 8193
#define IDX5 22222
-#define IDX6 17101
-#define IDX7 27333
-#define IDX8 3000
-
-static int mode = 0;
-static char *xbuf;
-static char *tvmem;
-
-static char *check[] = {
- "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
- "twofish", "serpent", "sha384", "sha512", "md4", "aes", "deflate",
- NULL
-};
-
-static void
-hexdump(unsigned char *buf, unsigned int len)
-{
- while (len--)
- printk("%02x", *buf++);
-
- printk("\n");
-}
-
-static void
-test_md5(void)
-{
- char *p;
- unsigned int i;
- struct scatterlist sg[2];
- char result[128];
- struct crypto_tfm *tfm;
- struct md5_testvec *md5_tv;
- unsigned int tsize;
-
- printk("\ntesting md5\n");
-
- tsize = sizeof (md5_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, md5_tv_template, tsize);
- md5_tv = (void *) tvmem;
-
- tfm = crypto_alloc_tfm("md5", 0);
- if (tfm == NULL) {
- printk("failed to load transform for md5\n");
- return;
- }
-
- for (i = 0; i < MD5_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
- memset(result, 0, sizeof (result));
-
- p = md5_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = strlen(md5_tv[i].plaintext);
-
- crypto_digest_init(tfm);
- crypto_digest_update(tfm, sg, 1);
- crypto_digest_final(tfm, result);
-
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
- printk("%s\n",
- memcmp(result, md5_tv[i].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
- "pass");
- }
-
- printk("\ntesting md5 across pages\n");
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, XBUFSIZE);
- memcpy(&xbuf[IDX1], "abcdefghijklm", 13);
- memcpy(&xbuf[IDX2], "nopqrstuvwxyz", 13);
-
- p = &xbuf[IDX1];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 13;
-
- p = &xbuf[IDX2];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 13;
-
- memset(result, 0, sizeof (result));
- crypto_digest_digest(tfm, sg, 2, result);
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-
- printk("%s\n",
- memcmp(result, md5_tv[4].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
- crypto_free_tfm(tfm);
-}
-
-#ifdef CONFIG_CRYPTO_HMAC
-static void
-test_hmac_md5(void)
-{
- char *p;
- unsigned int i, klen;
- struct scatterlist sg[2];
- char result[128];
- struct crypto_tfm *tfm;
- struct hmac_md5_testvec *hmac_md5_tv;
- unsigned int tsize;
-
- tfm = crypto_alloc_tfm("md5", 0);
- if (tfm == NULL) {
- printk("failed to load transform for md5\n");
- return;
- }
-
- printk("\ntesting hmac_md5\n");
-
- tsize = sizeof (hmac_md5_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- goto out;
- }
-
- memcpy(tvmem, hmac_md5_tv_template, tsize);
- hmac_md5_tv = (void *) tvmem;
-
- for (i = 0; i < HMAC_MD5_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
- memset(result, 0, sizeof (result));
-
- p = hmac_md5_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = strlen(hmac_md5_tv[i].plaintext);
-
- klen = strlen(hmac_md5_tv[i].key);
- crypto_hmac(tfm, hmac_md5_tv[i].key, &klen, sg, 1, result);
-
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
- printk("%s\n",
- memcmp(result, hmac_md5_tv[i].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
- "pass");
- }
-
- printk("\ntesting hmac_md5 across pages\n");
-
- memset(xbuf, 0, XBUFSIZE);
-
- memcpy(&xbuf[IDX1], "what do ya want ", 16);
- memcpy(&xbuf[IDX2], "for nothing?", 12);
-
- p = &xbuf[IDX1];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 16;
-
- p = &xbuf[IDX2];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 12;
-
- memset(result, 0, sizeof (result));
- klen = strlen(hmac_md5_tv[7].key);
- crypto_hmac(tfm, hmac_md5_tv[7].key, &klen, sg, 2, result);
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-
- printk("%s\n",
- memcmp(result, hmac_md5_tv[7].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-out:
- crypto_free_tfm(tfm);
-}
-
-static void
-test_hmac_sha1(void)
-{
- char *p;
- unsigned int i, klen;
- struct crypto_tfm *tfm;
- struct hmac_sha1_testvec *hmac_sha1_tv;
- struct scatterlist sg[2];
- unsigned int tsize;
- char result[SHA1_DIGEST_SIZE];
-
- tfm = crypto_alloc_tfm("sha1", 0);
- if (tfm == NULL) {
- printk("failed to load transform for sha1\n");
- return;
- }
-
- printk("\ntesting hmac_sha1\n");
-
- tsize = sizeof (hmac_sha1_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- goto out;
- }
-
- memcpy(tvmem, hmac_sha1_tv_template, tsize);
- hmac_sha1_tv = (void *) tvmem;
-
- for (i = 0; i < HMAC_SHA1_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
- memset(result, 0, sizeof (result));
-
- p = hmac_sha1_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = strlen(hmac_sha1_tv[i].plaintext);
-
- klen = strlen(hmac_sha1_tv[i].key);
-
- crypto_hmac(tfm, hmac_sha1_tv[i].key, &klen, sg, 1, result);
-
- hexdump(result, sizeof (result));
- printk("%s\n",
- memcmp(result, hmac_sha1_tv[i].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
- "pass");
- }
-
- printk("\ntesting hmac_sha1 across pages\n");
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, XBUFSIZE);
-
- memcpy(&xbuf[IDX1], "what do ya want ", 16);
- memcpy(&xbuf[IDX2], "for nothing?", 12);
-
- p = &xbuf[IDX1];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 16;
-
- p = &xbuf[IDX2];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 12;
-
- memset(result, 0, sizeof (result));
- klen = strlen(hmac_sha1_tv[7].key);
- crypto_hmac(tfm, hmac_sha1_tv[7].key, &klen, sg, 2, result);
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-
- printk("%s\n",
- memcmp(result, hmac_sha1_tv[7].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-out:
- crypto_free_tfm(tfm);
-}
-
-static void
-test_hmac_sha256(void)
-{
- char *p;
- unsigned int i, klen;
- struct crypto_tfm *tfm;
- struct hmac_sha256_testvec *hmac_sha256_tv;
- struct scatterlist sg[2];
- unsigned int tsize;
- char result[SHA256_DIGEST_SIZE];
-
- tfm = crypto_alloc_tfm("sha256", 0);
- if (tfm == NULL) {
- printk("failed to load transform for sha256\n");
- return;
- }
-
- printk("\ntesting hmac_sha256\n");
-
- tsize = sizeof (hmac_sha256_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- goto out;
- }
-
- memcpy(tvmem, hmac_sha256_tv_template, tsize);
- hmac_sha256_tv = (void *) tvmem;
-
- for (i = 0; i < HMAC_SHA256_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
- memset(result, 0, sizeof (result));
-
- p = hmac_sha256_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = strlen(hmac_sha256_tv[i].plaintext);
-
- klen = strlen(hmac_sha256_tv[i].key);
-
- hexdump(hmac_sha256_tv[i].key, strlen(hmac_sha256_tv[i].key));
- crypto_hmac(tfm, hmac_sha256_tv[i].key, &klen, sg, 1, result);
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
- printk("%s\n",
- memcmp(result, hmac_sha256_tv[i].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
- }
-
-out:
- crypto_free_tfm(tfm);
-}
-
-#endif /* CONFIG_CRYPTO_HMAC */
-
-static void
-test_md4(void)
-{
- char *p;
- unsigned int i;
- struct scatterlist sg[1];
- char result[128];
- struct crypto_tfm *tfm;
- struct md4_testvec *md4_tv;
- unsigned int tsize;
-
- printk("\ntesting md4\n");
-
- tsize = sizeof (md4_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, md4_tv_template, tsize);
- md4_tv = (void *) tvmem;
-
- tfm = crypto_alloc_tfm("md4", 0);
- if (tfm == NULL) {
- printk("failed to load transform for md4\n");
- return;
- }
-
- for (i = 0; i < MD4_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
- memset(result, 0, sizeof (result));
-
- p = md4_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = strlen(md4_tv[i].plaintext);
-
- crypto_digest_digest(tfm, sg, 1, result);
-
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
- printk("%s\n",
- memcmp(result, md4_tv[i].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
- "pass");
- }
-
- crypto_free_tfm(tfm);
-}
-
-static void
-test_sha1(void)
-{
- char *p;
- unsigned int i;
- struct crypto_tfm *tfm;
- struct sha1_testvec *sha1_tv;
- struct scatterlist sg[2];
- unsigned int tsize;
- char result[SHA1_DIGEST_SIZE];
-
- printk("\ntesting sha1\n");
-
- tsize = sizeof (sha1_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, sha1_tv_template, tsize);
- sha1_tv = (void *) tvmem;
-
- tfm = crypto_alloc_tfm("sha1", 0);
- if (tfm == NULL) {
- printk("failed to load transform for sha1\n");
- return;
- }
-
- for (i = 0; i < SHA1_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
- memset(result, 0, sizeof (result));
-
- p = sha1_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = strlen(sha1_tv[i].plaintext);
-
- crypto_digest_init(tfm);
- crypto_digest_update(tfm, sg, 1);
- crypto_digest_final(tfm, result);
-
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
- printk("%s\n",
- memcmp(result, sha1_tv[i].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
- "pass");
- }
-
- printk("\ntesting sha1 across pages\n");
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, XBUFSIZE);
- memcpy(&xbuf[IDX1], "abcdbcdecdefdefgefghfghighij", 28);
- memcpy(&xbuf[IDX2], "hijkijkljklmklmnlmnomnopnopq", 28);
-
- p = &xbuf[IDX1];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 28;
-
- p = &xbuf[IDX2];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 28;
-
- memset(result, 0, sizeof (result));
- crypto_digest_digest(tfm, sg, 2, result);
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
- printk("%s\n",
- memcmp(result, sha1_tv[1].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
- crypto_free_tfm(tfm);
-}
-
-static void
-test_sha256(void)
-{
- char *p;
- unsigned int i;
- struct crypto_tfm *tfm;
- struct sha256_testvec *sha256_tv;
- struct scatterlist sg[2];
- unsigned int tsize;
- char result[SHA256_DIGEST_SIZE];
-
- printk("\ntesting sha256\n");
-
- tsize = sizeof (sha256_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, sha256_tv_template, tsize);
- sha256_tv = (void *) tvmem;
-
- tfm = crypto_alloc_tfm("sha256", 0);
- if (tfm == NULL) {
- printk("failed to load transform for sha256\n");
- return;
- }
-
- for (i = 0; i < SHA256_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
- memset(result, 0, sizeof (result));
-
- p = sha256_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = strlen(sha256_tv[i].plaintext);
-
- crypto_digest_init(tfm);
- crypto_digest_update(tfm, sg, 1);
- crypto_digest_final(tfm, result);
-
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
- printk("%s\n",
- memcmp(result, sha256_tv[i].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
- "pass");
- }
-
- printk("\ntesting sha256 across pages\n");
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, XBUFSIZE);
- memcpy(&xbuf[IDX1], "abcdbcdecdefdefgefghfghighij", 28);
- memcpy(&xbuf[IDX2], "hijkijkljklmklmnlmnomnopnopq", 28);
-
- p = &xbuf[IDX1];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 28;
-
- p = &xbuf[IDX2];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 28;
-
- memset(result, 0, sizeof (result));
- crypto_digest_digest(tfm, sg, 2, result);
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
- printk("%s\n",
- memcmp(result, sha256_tv[1].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-
- crypto_free_tfm(tfm);
-}
-
-static void
-test_sha384(void)
-{
- char *p;
- unsigned int i;
- struct crypto_tfm *tfm;
- struct sha384_testvec *sha384_tv;
- struct scatterlist sg[2];
- unsigned int tsize;
- char result[SHA384_DIGEST_SIZE];
-
- printk("\ntesting sha384\n");
-
- tsize = sizeof (sha384_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, sha384_tv_template, tsize);
- sha384_tv = (void *) tvmem;
-
- tfm = crypto_alloc_tfm("sha384", 0);
- if (tfm == NULL) {
- printk("failed to load transform for sha384\n");
- return;
- }
-
- for (i = 0; i < SHA384_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
- memset(result, 0, sizeof (result));
-
- p = sha384_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = strlen(sha384_tv[i].plaintext);
-
- crypto_digest_init(tfm);
- crypto_digest_update(tfm, sg, 1);
- crypto_digest_final(tfm, result);
-
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
- printk("%s\n",
- memcmp(result, sha384_tv[i].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
- "pass");
- }
-
- crypto_free_tfm(tfm);
-}
-
-static void
-test_sha512(void)
-{
- char *p;
- unsigned int i;
- struct crypto_tfm *tfm;
- struct sha512_testvec *sha512_tv;
- struct scatterlist sg[2];
- unsigned int tsize;
- char result[SHA512_DIGEST_SIZE];
-
- printk("\ntesting sha512\n");
-
- tsize = sizeof (sha512_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, sha512_tv_template, tsize);
- sha512_tv = (void *) tvmem;
-
- tfm = crypto_alloc_tfm("sha512", 0);
- if (tfm == NULL) {
- printk("failed to load transform for sha512\n");
- return;
- }
-
- for (i = 0; i < SHA512_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
- memset(result, 0, sizeof (result));
-
- p = sha512_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = strlen(sha512_tv[i].plaintext);
-
- crypto_digest_init(tfm);
- crypto_digest_update(tfm, sg, 1);
- crypto_digest_final(tfm, result);
-
- hexdump(result, crypto_tfm_alg_digestsize(tfm));
- printk("%s\n",
- memcmp(result, sha512_tv[i].digest,
- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
- "pass");
- }
-
- crypto_free_tfm(tfm);
-}
-
-void
-test_des(void)
-{
- unsigned int ret, i, len;
- unsigned int tsize;
- char *p, *q;
- struct crypto_tfm *tfm;
- char *key;
- char res[8];
- struct des_tv *des_tv;
- struct scatterlist sg[8];
-
- printk("\ntesting des encryption\n");
-
- tsize = sizeof (des_enc_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, des_enc_tv_template, tsize);
- des_tv = (void *) tvmem;
-
- tfm = crypto_alloc_tfm("des", 0);
- if (tfm == NULL) {
- printk("failed to load transform for des (default ecb)\n");
- return;
- }
-
- for (i = 0; i < DES_ENC_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
-
- key = des_tv[i].key;
- tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
-
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
- if (!des_tv[i].fail)
- goto out;
- }
-
- len = des_tv[i].len;
-
- p = des_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = len;
- ret = crypto_cipher_encrypt(tfm, sg, sg, len);
- if (ret) {
- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, len);
-
- printk("%s\n",
- memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-
- }
-
- printk("\ntesting des ecb encryption across pages\n");
-
- i = 5;
- key = des_tv[i].key;
- tfm->crt_flags = 0;
-
- hexdump(key, 8);
-
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, sizeof (xbuf));
- memcpy(&xbuf[IDX1], des_tv[i].plaintext, 8);
- memcpy(&xbuf[IDX2], des_tv[i].plaintext + 8, 8);
-
- p = &xbuf[IDX1];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 8;
-
- p = &xbuf[IDX2];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 8;
-
- ret = crypto_cipher_encrypt(tfm, sg, sg, 16);
- if (ret) {
- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- printk("page 1\n");
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, 8);
- printk("%s\n", memcmp(q, des_tv[i].result, 8) ? "fail" : "pass");
-
- printk("page 2\n");
- q = kmap(sg[1].page) + sg[1].offset;
- hexdump(q, 8);
- printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
-
- printk("\ntesting des ecb encryption chunking scenario A\n");
-
- /*
- * Scenario A:
- *
- * F1 F2 F3
- * [8 + 6] [2 + 8] [8]
- * ^^^^^^ ^
- * a b c
- *
- * Chunking should begin at a, then end with b, and
- * continue encrypting at an offset of 2 until c.
- *
- */
- i = 7;
-
- key = des_tv[i].key;
- tfm->crt_flags = 0;
-
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, sizeof (xbuf));
-
- /* Frag 1: 8 + 6 */
- memcpy(&xbuf[IDX3], des_tv[i].plaintext, 14);
-
- /* Frag 2: 2 + 8 */
- memcpy(&xbuf[IDX4], des_tv[i].plaintext + 14, 10);
-
- /* Frag 3: 8 */
- memcpy(&xbuf[IDX5], des_tv[i].plaintext + 24, 8);
-
- p = &xbuf[IDX3];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 14;
-
- p = &xbuf[IDX4];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 10;
-
- p = &xbuf[IDX5];
- sg[2].page = virt_to_page(p);
- sg[2].offset = ((long) p & ~PAGE_MASK);
- sg[2].length = 8;
-
- ret = crypto_cipher_encrypt(tfm, sg, sg, 32);
-
- if (ret) {
- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- printk("page 1\n");
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, 14);
- printk("%s\n", memcmp(q, des_tv[i].result, 14) ? "fail" : "pass");
-
- printk("page 2\n");
- q = kmap(sg[1].page) + sg[1].offset;
- hexdump(q, 10);
- printk("%s\n", memcmp(q, des_tv[i].result + 14, 10) ? "fail" : "pass");
-
- printk("page 3\n");
- q = kmap(sg[2].page) + sg[2].offset;
- hexdump(q, 8);
- printk("%s\n", memcmp(q, des_tv[i].result + 24, 8) ? "fail" : "pass");
-
- printk("\ntesting des ecb encryption chunking scenario B\n");
-
- /*
- * Scenario B:
- *
- * F1 F2 F3 F4
- * [2] [1] [3] [2 + 8 + 8]
- */
- i = 7;
-
- key = des_tv[i].key;
- tfm->crt_flags = 0;
-
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, sizeof (xbuf));
-
- /* Frag 1: 2 */
- memcpy(&xbuf[IDX3], des_tv[i].plaintext, 2);
-
- /* Frag 2: 1 */
- memcpy(&xbuf[IDX4], des_tv[i].plaintext + 2, 1);
-
- /* Frag 3: 3 */
- memcpy(&xbuf[IDX5], des_tv[i].plaintext + 3, 3);
-
- /* Frag 4: 2 + 8 + 8 */
- memcpy(&xbuf[IDX6], des_tv[i].plaintext + 6, 18);
-
- p = &xbuf[IDX3];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 2;
-
- p = &xbuf[IDX4];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 1;
-
- p = &xbuf[IDX5];
- sg[2].page = virt_to_page(p);
- sg[2].offset = ((long) p & ~PAGE_MASK);
- sg[2].length = 3;
-
- p = &xbuf[IDX6];
- sg[3].page = virt_to_page(p);
- sg[3].offset = ((long) p & ~PAGE_MASK);
- sg[3].length = 18;
-
- ret = crypto_cipher_encrypt(tfm, sg, sg, 24);
-
- if (ret) {
- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- printk("page 1\n");
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, 2);
- printk("%s\n", memcmp(q, des_tv[i].result, 2) ? "fail" : "pass");
-
- printk("page 2\n");
- q = kmap(sg[1].page) + sg[1].offset;
- hexdump(q, 1);
- printk("%s\n", memcmp(q, des_tv[i].result + 2, 1) ? "fail" : "pass");
-
- printk("page 3\n");
- q = kmap(sg[2].page) + sg[2].offset;
- hexdump(q, 3);
- printk("%s\n", memcmp(q, des_tv[i].result + 3, 3) ? "fail" : "pass");
-
- printk("page 4\n");
- q = kmap(sg[3].page) + sg[3].offset;
- hexdump(q, 18);
- printk("%s\n", memcmp(q, des_tv[i].result + 6, 18) ? "fail" : "pass");
-
- printk("\ntesting des ecb encryption chunking scenario C\n");
-
- /*
- * Scenario B:
- *
- * F1 F2 F3 F4 F5
- * [2] [2] [2] [2] [8]
- */
- i = 7;
-
- key = des_tv[i].key;
- tfm->crt_flags = 0;
-
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, sizeof (xbuf));
-
- /* Frag 1: 2 */
- memcpy(&xbuf[IDX3], des_tv[i].plaintext, 2);
-
- /* Frag 2: 2 */
- memcpy(&xbuf[IDX4], des_tv[i].plaintext + 2, 2);
-
- /* Frag 3: 2 */
- memcpy(&xbuf[IDX5], des_tv[i].plaintext + 4, 2);
-
- /* Frag 4: 2 */
- memcpy(&xbuf[IDX6], des_tv[i].plaintext + 6, 2);
-
- /* Frag 5: 8 */
- memcpy(&xbuf[IDX7], des_tv[i].plaintext + 8, 8);
-
- p = &xbuf[IDX3];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 2;
-
- p = &xbuf[IDX4];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 2;
-
- p = &xbuf[IDX5];
- sg[2].page = virt_to_page(p);
- sg[2].offset = ((long) p & ~PAGE_MASK);
- sg[2].length = 2;
-
- p = &xbuf[IDX6];
- sg[3].page = virt_to_page(p);
- sg[3].offset = ((long) p & ~PAGE_MASK);
- sg[3].length = 2;
-
- p = &xbuf[IDX7];
- sg[4].page = virt_to_page(p);
- sg[4].offset = ((long) p & ~PAGE_MASK);
- sg[4].length = 8;
-
- ret = crypto_cipher_encrypt(tfm, sg, sg, 16);
-
- if (ret) {
- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- printk("page 1\n");
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, 2);
- printk("%s\n", memcmp(q, des_tv[i].result, 2) ? "fail" : "pass");
-
- printk("page 2\n");
- q = kmap(sg[1].page) + sg[1].offset;
- hexdump(q, 2);
- printk("%s\n", memcmp(q, des_tv[i].result + 2, 2) ? "fail" : "pass");
-
- printk("page 3\n");
- q = kmap(sg[2].page) + sg[2].offset;
- hexdump(q, 2);
- printk("%s\n", memcmp(q, des_tv[i].result + 4, 2) ? "fail" : "pass");
-
- printk("page 4\n");
- q = kmap(sg[3].page) + sg[3].offset;
- hexdump(q, 2);
- printk("%s\n", memcmp(q, des_tv[i].result + 6, 2) ? "fail" : "pass");
-
- printk("page 5\n");
- q = kmap(sg[4].page) + sg[4].offset;
- hexdump(q, 8);
- printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
-
- printk("\ntesting des ecb encryption chunking scenario D\n");
-
- /*
- * Scenario D, torture test, one byte per frag.
- */
- i = 7;
- key = des_tv[i].key;
- tfm->crt_flags = 0;
-
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, XBUFSIZE);
-
- xbuf[IDX1] = des_tv[i].plaintext[0];
- xbuf[IDX2] = des_tv[i].plaintext[1];
- xbuf[IDX3] = des_tv[i].plaintext[2];
- xbuf[IDX4] = des_tv[i].plaintext[3];
- xbuf[IDX5] = des_tv[i].plaintext[4];
- xbuf[IDX6] = des_tv[i].plaintext[5];
- xbuf[IDX7] = des_tv[i].plaintext[6];
- xbuf[IDX8] = des_tv[i].plaintext[7];
-
- p = &xbuf[IDX1];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 1;
-
- p = &xbuf[IDX2];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 1;
-
- p = &xbuf[IDX3];
- sg[2].page = virt_to_page(p);
- sg[2].offset = ((long) p & ~PAGE_MASK);
- sg[2].length = 1;
-
- p = &xbuf[IDX4];
- sg[3].page = virt_to_page(p);
- sg[3].offset = ((long) p & ~PAGE_MASK);
- sg[3].length = 1;
-
- p = &xbuf[IDX5];
- sg[4].page = virt_to_page(p);
- sg[4].offset = ((long) p & ~PAGE_MASK);
- sg[4].length = 1;
-
- p = &xbuf[IDX6];
- sg[5].page = virt_to_page(p);
- sg[5].offset = ((long) p & ~PAGE_MASK);
- sg[5].length = 1;
-
- p = &xbuf[IDX7];
- sg[6].page = virt_to_page(p);
- sg[6].offset = ((long) p & ~PAGE_MASK);
- sg[6].length = 1;
-
- p = &xbuf[IDX8];
- sg[7].page = virt_to_page(p);
- sg[7].offset = ((long) p & ~PAGE_MASK);
- sg[7].length = 1;
-
- ret = crypto_cipher_encrypt(tfm, sg, sg, 8);
- if (ret) {
- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- for (i = 0; i < 8; i++)
- res[i] = *(char *) (kmap(sg[i].page) + sg[i].offset);
-
- hexdump(res, 8);
- printk("%s\n", memcmp(res, des_tv[7].result, 8) ? "fail" : "pass");
-
- printk("\ntesting des decryption\n");
-
- tsize = sizeof (des_dec_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
- memcpy(tvmem, des_dec_tv_template, tsize);
- des_tv = (void *) tvmem;
-
- for (i = 0; i < DES_DEC_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
-
- key = des_tv[i].key;
-
- tfm->crt_flags = 0;
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- len = des_tv[i].len;
-
- p = des_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = len;
-
- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("des_decrypt() failed flags=%x\n",
- tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, len);
-
- printk("%s\n",
- memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-
- }
-
- printk("\ntesting des ecb decryption across pages\n");
-
- i = 6;
-
- key = des_tv[i].key;
- tfm->crt_flags = 0;
-
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, sizeof (xbuf));
- memcpy(&xbuf[IDX1], des_tv[i].plaintext, 8);
- memcpy(&xbuf[IDX2], des_tv[i].plaintext + 8, 8);
-
- p = &xbuf[IDX1];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 8;
-
- p = &xbuf[IDX2];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 8;
-
- ret = crypto_cipher_decrypt(tfm, sg, sg, 16);
- if (ret) {
- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- printk("page 1\n");
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, 8);
- printk("%s\n", memcmp(q, des_tv[i].result, 8) ? "fail" : "pass");
-
- printk("page 2\n");
- q = kmap(sg[1].page) + sg[1].offset;
- hexdump(q, 8);
- printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
-
- /*
- * Scenario E:
- *
- * F1 F2 F3
- * [3] [5 + 7] [1]
- *
- */
- printk("\ntesting des ecb decryption chunking scenario E\n");
- i = 2;
-
- key = des_tv[i].key;
- tfm->crt_flags = 0;
-
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, sizeof (xbuf));
-
- memcpy(&xbuf[IDX1], des_tv[i].plaintext, 3);
- memcpy(&xbuf[IDX2], des_tv[i].plaintext + 3, 12);
- memcpy(&xbuf[IDX3], des_tv[i].plaintext + 15, 1);
-
- p = &xbuf[IDX1];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 3;
-
- p = &xbuf[IDX2];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 12;
-
- p = &xbuf[IDX3];
- sg[2].page = virt_to_page(p);
- sg[2].offset = ((long) p & ~PAGE_MASK);
- sg[2].length = 1;
-
- ret = crypto_cipher_decrypt(tfm, sg, sg, 16);
-
- if (ret) {
- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- printk("page 1\n");
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, 3);
- printk("%s\n", memcmp(q, des_tv[i].result, 3) ? "fail" : "pass");
-
- printk("page 2\n");
- q = kmap(sg[1].page) + sg[1].offset;
- hexdump(q, 12);
- printk("%s\n", memcmp(q, des_tv[i].result + 3, 12) ? "fail" : "pass");
-
- printk("page 3\n");
- q = kmap(sg[2].page) + sg[2].offset;
- hexdump(q, 1);
- printk("%s\n", memcmp(q, des_tv[i].result + 15, 1) ? "fail" : "pass");
-
- crypto_free_tfm(tfm);
-
- tfm = crypto_alloc_tfm("des", CRYPTO_TFM_MODE_CBC);
- if (tfm == NULL) {
- printk("failed to load transform for des cbc\n");
- return;
- }
-
- printk("\ntesting des cbc encryption\n");
-
- tsize = sizeof (des_cbc_enc_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
- memcpy(tvmem, des_cbc_enc_tv_template, tsize);
- des_tv = (void *) tvmem;
-
- crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
- crypto_cipher_get_iv(tfm, res, crypto_tfm_alg_ivsize(tfm));
-
- if (memcmp(res, des_tv[i].iv, sizeof(res))) {
- printk("crypto_cipher_[set|get]_iv() failed\n");
- goto out;
- }
-
- for (i = 0; i < DES_CBC_ENC_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
-
- key = des_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- len = des_tv[i].len;
- p = des_tv[i].plaintext;
-
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = len;
-
- crypto_cipher_set_iv(tfm, des_tv[i].iv,
- crypto_tfm_alg_ivsize(tfm));
-
- ret = crypto_cipher_encrypt(tfm, sg, sg, len);
- if (ret) {
- printk("des_cbc_encrypt() failed flags=%x\n",
- tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, len);
-
- printk("%s\n",
- memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
- }
-
- crypto_free_tfm(tfm);
-
- /*
- * Scenario F:
- *
- * F1 F2
- * [8 + 5] [3 + 8]
- *
- */
- printk("\ntesting des cbc encryption chunking scenario F\n");
- i = 4;
-
- tfm = crypto_alloc_tfm("des", CRYPTO_TFM_MODE_CBC);
- if (tfm == NULL) {
- printk("failed to load transform for CRYPTO_ALG_DES_CCB\n");
- return;
- }
-
- tfm->crt_flags = 0;
- key = des_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, sizeof (xbuf));
-
- memcpy(&xbuf[IDX1], des_tv[i].plaintext, 13);
- memcpy(&xbuf[IDX2], des_tv[i].plaintext + 13, 11);
-
- p = &xbuf[IDX1];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 13;
-
- p = &xbuf[IDX2];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 11;
-
- crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
-
- ret = crypto_cipher_encrypt(tfm, sg, sg, 24);
- if (ret) {
- printk("des_cbc_decrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- printk("page 1\n");
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, 13);
- printk("%s\n", memcmp(q, des_tv[i].result, 13) ? "fail" : "pass");
-
- printk("page 2\n");
- q = kmap(sg[1].page) + sg[1].offset;
- hexdump(q, 11);
- printk("%s\n", memcmp(q, des_tv[i].result + 13, 11) ? "fail" : "pass");
-
- tsize = sizeof (des_cbc_dec_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
- memcpy(tvmem, des_cbc_dec_tv_template, tsize);
- des_tv = (void *) tvmem;
-
- printk("\ntesting des cbc decryption\n");
-
- for (i = 0; i < DES_CBC_DEC_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
-
- tfm->crt_flags = 0;
- key = des_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- len = des_tv[i].len;
- p = des_tv[i].plaintext;
-
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = len;
-
- crypto_cipher_set_iv(tfm, des_tv[i].iv,
- crypto_tfm_alg_blocksize(tfm));
-
- ret = crypto_cipher_decrypt(tfm, sg, sg, len);
- if (ret) {
- printk("des_cbc_decrypt() failed flags=%x\n",
- tfm->crt_flags);
- goto out;
- }
-
- hexdump(tfm->crt_cipher.cit_iv, 8);
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, len);
-
- printk("%s\n",
- memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
- }
-
- /*
- * Scenario G:
- *
- * F1 F2
- * [4] [4]
- *
- */
- printk("\ntesting des cbc decryption chunking scenario G\n");
- i = 3;
-
- tfm->crt_flags = 0;
- key = des_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, 8);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- /* setup the dummy buffer first */
- memset(xbuf, 0, sizeof (xbuf));
- memcpy(&xbuf[IDX1], des_tv[i].plaintext, 4);
- memcpy(&xbuf[IDX2], des_tv[i].plaintext + 4, 4);
-
- p = &xbuf[IDX1];
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = 4;
-
- p = &xbuf[IDX2];
- sg[1].page = virt_to_page(p);
- sg[1].offset = ((long) p & ~PAGE_MASK);
- sg[1].length = 4;
-
- crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
-
- ret = crypto_cipher_decrypt(tfm, sg, sg, 8);
- if (ret) {
- printk("des_cbc_decrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- printk("page 1\n");
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, 4);
- printk("%s\n", memcmp(q, des_tv[i].result, 4) ? "fail" : "pass");
-
- printk("page 2\n");
- q = kmap(sg[1].page) + sg[1].offset;
- hexdump(q, 4);
- printk("%s\n", memcmp(q, des_tv[i].result + 4, 4) ? "fail" : "pass");
-
- out:
- crypto_free_tfm(tfm);
-}
-
-void
-test_des3_ede(void)
-{
- unsigned int ret, i, len;
- unsigned int tsize;
- char *p, *q;
- struct crypto_tfm *tfm;
- char *key;
- /*char res[8]; */
- struct des_tv *des_tv;
- struct scatterlist sg[8];
-
- printk("\ntesting des3 ede encryption\n");
-
- tsize = sizeof (des3_ede_enc_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, des3_ede_enc_tv_template, tsize);
- des_tv = (void *) tvmem;
-
- tfm = crypto_alloc_tfm("des3_ede", CRYPTO_TFM_MODE_ECB);
- if (tfm == NULL) {
- printk("failed to load transform for 3des ecb\n");
- return;
- }
-
- for (i = 0; i < DES3_EDE_ENC_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
-
- key = des_tv[i].key;
- ret = crypto_cipher_setkey(tfm, key, 24);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
- if (!des_tv[i].fail)
- goto out;
- }
-
- len = des_tv[i].len;
-
- p = des_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = len;
- ret = crypto_cipher_encrypt(tfm, sg, sg, len);
- if (ret) {
- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, len);
-
- printk("%s\n",
- memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
- }
-
- printk("\ntesting des3 ede decryption\n");
-
- tsize = sizeof (des3_ede_dec_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, des3_ede_dec_tv_template, tsize);
- des_tv = (void *) tvmem;
-
- for (i = 0; i < DES3_EDE_DEC_TEST_VECTORS; i++) {
- printk("test %u:\n", i + 1);
-
- key = des_tv[i].key;
- ret = crypto_cipher_setkey(tfm, key, 24);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
- if (!des_tv[i].fail)
- goto out;
- }
-
- len = des_tv[i].len;
-
- p = des_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = len;
- ret = crypto_cipher_decrypt(tfm, sg, sg, len);
- if (ret) {
- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, len);
-
- printk("%s\n",
- memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
- }
-
- out:
- crypto_free_tfm(tfm);
-}
-
-void
-test_blowfish(void)
-{
- unsigned int ret, i;
- unsigned int tsize;
- char *p, *q;
- struct crypto_tfm *tfm;
- char *key;
- struct bf_tv *bf_tv;
- struct scatterlist sg[1];
-
- printk("\ntesting blowfish encryption\n");
-
- tsize = sizeof (bf_enc_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, bf_enc_tv_template, tsize);
- bf_tv = (void *) tvmem;
-
- tfm = crypto_alloc_tfm("blowfish", 0);
- if (tfm == NULL) {
- printk("failed to load transform for blowfish (default ecb)\n");
- return;
- }
-
- for (i = 0; i < BF_ENC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n",
- i + 1, bf_tv[i].keylen * 8);
- key = bf_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
- if (!bf_tv[i].fail)
- goto out;
- }
-
- p = bf_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = bf_tv[i].plen;
- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, bf_tv[i].rlen);
-
- printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen) ?
- "fail" : "pass");
- }
-
- printk("\ntesting blowfish decryption\n");
-
- tsize = sizeof (bf_dec_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, bf_dec_tv_template, tsize);
- bf_tv = (void *) tvmem;
-
- for (i = 0; i < BF_DEC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n",
- i + 1, bf_tv[i].keylen * 8);
- key = bf_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
- if (!bf_tv[i].fail)
- goto out;
- }
-
- p = bf_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = bf_tv[i].plen;
- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, bf_tv[i].rlen);
-
- printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen) ?
- "fail" : "pass");
- }
-
- crypto_free_tfm(tfm);
-
- tfm = crypto_alloc_tfm("blowfish", CRYPTO_TFM_MODE_CBC);
- if (tfm == NULL) {
- printk("failed to load transform for blowfish cbc\n");
- return;
- }
-
- printk("\ntesting blowfish cbc encryption\n");
-
- tsize = sizeof (bf_cbc_enc_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- goto out;
- }
- memcpy(tvmem, bf_cbc_enc_tv_template, tsize);
- bf_tv = (void *) tvmem;
-
- for (i = 0; i < BF_CBC_ENC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n",
- i + 1, bf_tv[i].keylen * 8);
-
- key = bf_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- p = bf_tv[i].plaintext;
-
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = bf_tv[i].plen;
-
- crypto_cipher_set_iv(tfm, bf_tv[i].iv,
- crypto_tfm_alg_ivsize(tfm));
-
- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("blowfish_cbc_encrypt() failed flags=%x\n",
- tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, bf_tv[i].rlen);
-
- printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen)
- ? "fail" : "pass");
- }
-
- printk("\ntesting blowfish cbc decryption\n");
-
- tsize = sizeof (bf_cbc_dec_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- goto out;
- }
- memcpy(tvmem, bf_cbc_dec_tv_template, tsize);
- bf_tv = (void *) tvmem;
-
- for (i = 0; i < BF_CBC_ENC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n",
- i + 1, bf_tv[i].keylen * 8);
- key = bf_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- p = bf_tv[i].plaintext;
+#define IDX6 17101
+#define IDX7 27333
+#define IDX8 3000
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = bf_tv[i].plen;
+/*
+* Used by test_cipher()
+*/
+#define ENCRYPT 1
+#define DECRYPT 0
+#define MODE_ECB 1
+#define MODE_CBC 0
- crypto_cipher_set_iv(tfm, bf_tv[i].iv,
- crypto_tfm_alg_ivsize(tfm));
+static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("blowfish_cbc_decrypt() failed flags=%x\n",
- tfm->crt_flags);
- goto out;
- }
+static int mode;
+static char *xbuf;
+static char *tvmem;
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, bf_tv[i].rlen);
+static char *check[] = {
+ "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
+ "twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6",
+ "deflate", NULL
+};
- printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen)
- ? "fail" : "pass");
- }
+static void
+hexdump(unsigned char *buf, unsigned int len)
+{
+ while (len--)
+ printk("%02x", *buf++);
-out:
- crypto_free_tfm(tfm);
+ printk("\n");
}
-
-void
-test_twofish(void)
+static void
+test_hash (char * algo, struct hash_testvec * template, unsigned int tcount)
{
- unsigned int ret, i;
- unsigned int tsize;
- char *p, *q;
- struct crypto_tfm *tfm;
- char *key;
- struct tf_tv *tf_tv;
- struct scatterlist sg[1];
-
- printk("\ntesting twofish encryption\n");
+ char *p;
+ unsigned int i, j, k, temp;
+ struct scatterlist sg[8];
+ char result[64];
+ struct crypto_tfm *tfm;
+ struct hash_testvec *hash_tv;
+ unsigned int tsize;
+
+ printk("\ntesting %s\n", algo);
- tsize = sizeof (tf_enc_tv_template);
+ tsize = sizeof (struct hash_testvec);
+ tsize *= tcount;
+
if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
+ printk("template (%u) too big for tvmem (%u)\n", tsize, TVMEMSIZE);
return;
}
- memcpy(tvmem, tf_enc_tv_template, tsize);
- tf_tv = (void *) tvmem;
-
- tfm = crypto_alloc_tfm("twofish", 0);
+ memcpy(tvmem, template, tsize);
+ hash_tv = (void *) tvmem;
+ tfm = crypto_alloc_tfm(algo, 0);
if (tfm == NULL) {
- printk("failed to load transform for blowfish (default ecb)\n");
+ printk("failed to load transform for %s\n", algo);
return;
}
- for (i = 0; i < TF_ENC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n",
- i + 1, tf_tv[i].keylen * 8);
- key = tf_tv[i].key;
+ for (i = 0; i < tcount; i++) {
+ printk ("test %u:\n", i + 1);
+ memset (result, 0, 64);
- ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
- if (!tf_tv[i].fail)
- goto out;
- }
-
- p = tf_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = tf_tv[i].plen;
- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
+ p = hash_tv[i].plaintext;
+ sg[0].page = virt_to_page (p);
+ sg[0].offset = offset_in_page (p);
+ sg[0].length = hash_tv[i].psize;
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, tf_tv[i].rlen);
+ crypto_digest_init (tfm);
+ crypto_digest_update (tfm, sg, 1);
+ crypto_digest_final (tfm, result);
- printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen) ?
- "fail" : "pass");
- }
-
- printk("\ntesting twofish decryption\n");
-
- tsize = sizeof (tf_dec_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
+ hexdump (result, crypto_tfm_alg_digestsize (tfm));
+ printk("%s\n",
+ memcmp(result, hash_tv[i].digest,
+ crypto_tfm_alg_digestsize(tfm)) ? "fail" :
+ "pass");
}
- memcpy(tvmem, tf_dec_tv_template, tsize);
- tf_tv = (void *) tvmem;
+ printk ("testing %s across pages\n", algo);
- for (i = 0; i < TF_DEC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n",
- i + 1, tf_tv[i].keylen * 8);
- key = tf_tv[i].key;
+ /* setup the dummy buffer first */
+ memset(xbuf, 0, XBUFSIZE);
- ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
+ j = 0;
+ for (i = 0; i < tcount; i++) {
+ if (hash_tv[i].np) {
+ j++;
+ printk ("test %u:\n", j);
+ memset (result, 0, 64);
- if (!tf_tv[i].fail)
- goto out;
- }
+ temp = 0;
+ for (k = 0; k < hash_tv[i].np; k++) {
+ memcpy (&xbuf[IDX[k]], hash_tv[i].plaintext + temp,
+ hash_tv[i].tap[k]);
+ temp += hash_tv[i].tap[k];
+ p = &xbuf[IDX[k]];
+ sg[k].page = virt_to_page (p);
+ sg[k].offset = offset_in_page (p);
+ sg[k].length = hash_tv[i].tap[k];
+ }
- p = tf_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = tf_tv[i].plen;
- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
+ crypto_digest_digest (tfm, sg, hash_tv[i].np, result);
+
+ hexdump (result, crypto_tfm_alg_digestsize (tfm));
+ printk("%s\n",
+ memcmp(result, hash_tv[i].digest,
+ crypto_tfm_alg_digestsize(tfm)) ? "fail" :
+ "pass");
}
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, tf_tv[i].rlen);
-
- printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen) ?
- "fail" : "pass");
}
-
- crypto_free_tfm(tfm);
- tfm = crypto_alloc_tfm("twofish", CRYPTO_TFM_MODE_CBC);
- if (tfm == NULL) {
- printk("failed to load transform for twofish cbc\n");
- return;
- }
-
- printk("\ntesting twofish cbc encryption\n");
-
- tsize = sizeof (tf_cbc_enc_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- goto out;
- }
- memcpy(tvmem, tf_cbc_enc_tv_template, tsize);
- tf_tv = (void *) tvmem;
-
- for (i = 0; i < TF_CBC_ENC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n",
- i + 1, tf_tv[i].keylen * 8);
-
- key = tf_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- p = tf_tv[i].plaintext;
-
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = tf_tv[i].plen;
-
- crypto_cipher_set_iv(tfm, tf_tv[i].iv,
- crypto_tfm_alg_ivsize(tfm));
-
- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("blowfish_cbc_encrypt() failed flags=%x\n",
- tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, tf_tv[i].rlen);
-
- printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen)
- ? "fail" : "pass");
- }
-
- printk("\ntesting twofish cbc decryption\n");
-
- tsize = sizeof (tf_cbc_dec_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- goto out;
- }
- memcpy(tvmem, tf_cbc_dec_tv_template, tsize);
- tf_tv = (void *) tvmem;
-
- for (i = 0; i < TF_CBC_DEC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n",
- i + 1, tf_tv[i].keylen * 8);
-
- key = tf_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- p = tf_tv[i].plaintext;
-
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = tf_tv[i].plen;
-
- crypto_cipher_set_iv(tfm, tf_tv[i].iv,
- crypto_tfm_alg_ivsize(tfm));
-
- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("blowfish_cbc_decrypt() failed flags=%x\n",
- tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, tf_tv[i].rlen);
+ crypto_free_tfm (tfm);
+}
- printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen)
- ? "fail" : "pass");
- }
-out:
- crypto_free_tfm(tfm);
-}
+#ifdef CONFIG_CRYPTO_HMAC
-void
-test_serpent(void)
+static void
+test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount)
{
- unsigned int ret, i, tsize;
- u8 *p, *q, *key;
+ char *p;
+ unsigned int i, j, k, temp;
+ struct scatterlist sg[8];
+ char result[64];
struct crypto_tfm *tfm;
- struct serpent_tv *serp_tv;
- struct scatterlist sg[1];
-
- printk("\ntesting serpent encryption\n");
+ struct hmac_testvec *hmac_tv;
+ unsigned int tsize, klen;
- tfm = crypto_alloc_tfm("serpent", 0);
+ tfm = crypto_alloc_tfm(algo, 0);
if (tfm == NULL) {
- printk("failed to load transform for serpent (default ecb)\n");
+ printk("failed to load transform for %s\n", algo);
return;
}
- tsize = sizeof (serpent_enc_tv_template);
+ printk("\ntesting hmac_%s\n", algo);
+
+ tsize = sizeof (struct hmac_testvec);
+ tsize *= tcount;
if (tsize > TVMEMSIZE) {
printk("template (%u) too big for tvmem (%u)\n", tsize,
TVMEMSIZE);
- return;
+ goto out;
}
- memcpy(tvmem, serpent_enc_tv_template, tsize);
- serp_tv = (void *) tvmem;
- for (i = 0; i < SERPENT_ENC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n", i + 1, serp_tv[i].keylen * 8);
- key = serp_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, serp_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
+ memcpy(tvmem, template, tsize);
+ hmac_tv = (void *) tvmem;
- if (!serp_tv[i].fail)
- goto out;
- }
+ for (i = 0; i < tcount; i++) {
+ printk("test %u:\n", i + 1);
+ memset(result, 0, sizeof (result));
- p = serp_tv[i].plaintext;
+ p = hmac_tv[i].plaintext;
+ klen = hmac_tv[i].ksize;
sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = sizeof(serp_tv[i].plaintext);
- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, sizeof(serp_tv[i].result));
-
- printk("%s\n", memcmp(q, serp_tv[i].result,
- sizeof(serp_tv[i].result)) ? "fail" : "pass");
- }
+ sg[0].offset = offset_in_page(p);
+ sg[0].length = hmac_tv[i].psize;
- printk("\ntesting serpent decryption\n");
+ crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, 1, result);
- tsize = sizeof (serpent_dec_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
+ hexdump(result, crypto_tfm_alg_digestsize(tfm));
+ printk("%s\n",
+ memcmp(result, hmac_tv[i].digest,
+ crypto_tfm_alg_digestsize(tfm)) ? "fail" :
+ "pass");
}
- memcpy(tvmem, serpent_dec_tv_template, tsize);
- serp_tv = (void *) tvmem;
- for (i = 0; i < SERPENT_DEC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n", i + 1, serp_tv[i].keylen * 8);
- key = serp_tv[i].key;
+ printk("\ntesting hmac_%s across pages\n", algo);
- ret = crypto_cipher_setkey(tfm, key, serp_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
- if (!serp_tv[i].fail)
- goto out;
- }
-
- p = serp_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = sizeof(serp_tv[i].plaintext);
- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
+ memset(xbuf, 0, XBUFSIZE);
+
+ j = 0;
+ for (i = 0; i < tcount; i++) {
+ if (hmac_tv[i].np) {
+ j++;
+ printk ("test %u:\n",j);
+ memset (result, 0, 64);
+
+ temp = 0;
+ klen = hmac_tv[i].ksize;
+ for (k = 0; k < hmac_tv[i].np; k++) {
+ memcpy (&xbuf[IDX[k]], hmac_tv[i].plaintext + temp,
+ hmac_tv[i].tap[k]);
+ temp += hmac_tv[i].tap[k];
+ p = &xbuf[IDX[k]];
+ sg[k].page = virt_to_page (p);
+ sg[k].offset = offset_in_page (p);
+ sg[k].length = hmac_tv[i].tap[k];
+ }
+
+ crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, hmac_tv[i].np,
+ result);
+ hexdump(result, crypto_tfm_alg_digestsize(tfm));
+
+ printk("%s\n",
+ memcmp(result, hmac_tv[i].digest,
+ crypto_tfm_alg_digestsize(tfm)) ? "fail" :
+ "pass");
}
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, sizeof(serp_tv[i].result));
-
- printk("%s\n", memcmp(q, serp_tv[i].result,
- sizeof(serp_tv[i].result)) ? "fail" : "pass");
}
-
out:
crypto_free_tfm(tfm);
}
+#endif /* CONFIG_CRYPTO_HMAC */
+
void
-test_aes(void)
+test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, unsigned int tcount)
{
- unsigned int ret, i;
+ unsigned int ret, i, j, k, temp;
unsigned int tsize;
char *p, *q;
struct crypto_tfm *tfm;
char *key;
- struct aes_tv *aes_tv;
- struct scatterlist sg[1];
-
- printk("\ntesting aes encryption\n");
-
- tsize = sizeof (aes_enc_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, aes_enc_tv_template, tsize);
- aes_tv = (void *) tvmem;
-
- tfm = crypto_alloc_tfm("aes", 0);
- if (tfm == NULL) {
- printk("failed to load transform for aes (default ecb)\n");
- return;
- }
-
- for (i = 0; i < AES_ENC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n",
- i + 1, aes_tv[i].keylen * 8);
- key = aes_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, aes_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
- if (!aes_tv[i].fail)
- goto out;
- }
+ struct cipher_testvec *cipher_tv;
+ struct scatterlist sg[8];
+ char e[11], m[4];
- p = aes_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = aes_tv[i].plen;
- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
+ if (enc == ENCRYPT)
+ strncpy(e, "encryption", 11);
+ else
+ strncpy(e, "decryption", 11);
+ if (mode == MODE_ECB)
+ strncpy(m, "ECB", 4);
+ else
+ strncpy(m, "CBC", 4);
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, aes_tv[i].rlen);
+ printk("\ntesting %s %s %s \n", algo, m, e);
- printk("%s\n", memcmp(q, aes_tv[i].result, aes_tv[i].rlen) ?
- "fail" : "pass");
- }
+ tsize = sizeof (struct cipher_testvec);
+ tsize *= tcount;
- printk("\ntesting aes decryption\n");
-
- tsize = sizeof (aes_dec_tv_template);
if (tsize > TVMEMSIZE) {
printk("template (%u) too big for tvmem (%u)\n", tsize,
TVMEMSIZE);
return;
}
- memcpy(tvmem, aes_dec_tv_template, tsize);
- aes_tv = (void *) tvmem;
-
- for (i = 0; i < AES_DEC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n",
- i + 1, aes_tv[i].keylen * 8);
- key = aes_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, aes_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
- if (!aes_tv[i].fail)
- goto out;
- }
-
- p = aes_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = aes_tv[i].plen;
- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, aes_tv[i].rlen);
-
- printk("%s\n", memcmp(q, aes_tv[i].result, aes_tv[i].rlen) ?
- "fail" : "pass");
- }
-
-out:
- crypto_free_tfm(tfm);
-}
-
-void
-test_cast5(void)
-{
- unsigned int ret, i, tsize;
- u8 *p, *q, *key;
- struct crypto_tfm *tfm;
- struct cast5_tv *c5_tv;
- struct scatterlist sg[1];
-
- printk("\ntesting cast5 encryption\n");
+ memcpy(tvmem, template, tsize);
+ cipher_tv = (void *) tvmem;
- tfm = crypto_alloc_tfm("cast5", 0);
+ if (mode)
+ tfm = crypto_alloc_tfm (algo, 0);
+ else
+ tfm = crypto_alloc_tfm (algo, CRYPTO_TFM_MODE_CBC);
+
if (tfm == NULL) {
- printk("failed to load transform for cast5 (default ecb)\n");
- return;
- }
-
- tsize = sizeof (cast5_enc_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
+ printk("failed to load transform for %s %s\n", algo, m);
return;
}
+
+ j = 0;
+ for (i = 0; i < tcount; i++) {
+ if (!(cipher_tv[i].np)) {
+ j++;
+ printk("test %u (%d bit key):\n",
+ j, cipher_tv[i].klen * 8);
- memcpy(tvmem, cast5_enc_tv_template, tsize);
- c5_tv = (void *) tvmem;
- for (i = 0; i < CAST5_ENC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n", i + 1, c5_tv[i].keylen * 8);
- key = c5_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, c5_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
+ tfm->crt_flags = 0;
+ if (cipher_tv[i].wk)
+ tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
+ key = cipher_tv[i].key;
+
+ ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
+ if (ret) {
+ printk("setkey() failed flags=%x\n", tfm->crt_flags);
+
+ if (!cipher_tv[i].fail)
+ goto out;
+ }
- if (!c5_tv[i].fail)
+ p = cipher_tv[i].input;
+ sg[0].page = virt_to_page(p);
+ sg[0].offset = offset_in_page(p);
+ sg[0].length = cipher_tv[i].ilen;
+
+ if (!mode) {
+ crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
+ crypto_tfm_alg_ivsize (tfm));
+ }
+
+ if (enc)
+ ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
+ else
+ ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
+
+
+ if (ret) {
+ printk("%s () failed flags=%x\n", e, tfm->crt_flags);
goto out;
+ }
+
+ q = kmap(sg[0].page) + sg[0].offset;
+ hexdump(q, cipher_tv[i].rlen);
+
+ printk("%s\n",
+ memcmp(q, cipher_tv[i].result, cipher_tv[i].rlen) ? "fail" :
+ "pass");
}
-
- p = c5_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = sizeof(c5_tv[i].plaintext);
- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
- }
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, sizeof(c5_tv[i].ciphertext));
-
- printk("%s\n", memcmp(q, c5_tv[i].ciphertext,
- sizeof(c5_tv[i].ciphertext)) ? "fail" : "pass");
}
- tsize = sizeof (cast5_dec_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
- memcpy(tvmem, cast5_dec_tv_template, tsize);
- c5_tv = (void *) tvmem;
- for (i = 0; i < CAST5_DEC_TEST_VECTORS; i++) {
- printk("test %u (%d bit key):\n", i + 1, c5_tv[i].keylen * 8);
- key = c5_tv[i].key;
-
- ret = crypto_cipher_setkey(tfm, key, c5_tv[i].keylen);
- if (ret) {
- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-
- if (!c5_tv[i].fail)
- goto out;
- }
-
- p = c5_tv[i].plaintext;
- sg[0].page = virt_to_page(p);
- sg[0].offset = ((long) p & ~PAGE_MASK);
- sg[0].length = sizeof(c5_tv[i].plaintext);
- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
- if (ret) {
- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
- goto out;
+ printk("\ntesting %s %s %s across pages (chunking) \n", algo, m, e);
+ memset(xbuf, 0, XBUFSIZE);
+
+ j = 0;
+ for (i = 0; i < tcount; i++) {
+ if (cipher_tv[i].np) {
+ j++;
+ printk("test %u (%d bit key):\n",
+ j, cipher_tv[i].klen * 8);
+
+ tfm->crt_flags = 0;
+ if (cipher_tv[i].wk)
+ tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
+ key = cipher_tv[i].key;
+
+ ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
+ if (ret) {
+ printk("setkey() failed flags=%x\n", tfm->crt_flags);
+
+ if (!cipher_tv[i].fail)
+ goto out;
+ }
+
+ temp = 0;
+ for (k = 0; k < cipher_tv[i].np; k++) {
+ memcpy (&xbuf[IDX[k]], cipher_tv[i].input + temp,
+ cipher_tv[i].tap[k]);
+ temp += cipher_tv[i].tap[k];
+ p = &xbuf[IDX[k]];
+ sg[k].page = virt_to_page (p);
+ sg[k].offset = offset_in_page (p);
+ sg[k].length = cipher_tv[i].tap[k];
+ }
+
+ if (!mode) {
+ crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
+ crypto_tfm_alg_ivsize (tfm));
+ }
+
+ if (enc)
+ ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
+ else
+ ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
+
+ if (ret) {
+ printk("%s () failed flags=%x\n", e, tfm->crt_flags);
+ goto out;
+ }
+
+ temp = 0;
+ for (k = 0; k < cipher_tv[i].np; k++) {
+ printk("page %u\n", k);
+ q = kmap(sg[k].page) + sg[k].offset;
+ hexdump(q, cipher_tv[i].tap[k]);
+ printk("%s\n",
+ memcmp(q, cipher_tv[i].result + temp,
+ cipher_tv[i].tap[k]) ? "fail" :
+ "pass");
+ temp += cipher_tv[i].tap[k];
+ }
}
-
- q = kmap(sg[0].page) + sg[0].offset;
- hexdump(q, sizeof(c5_tv[i].ciphertext));
-
- printk("%s\n", memcmp(q, c5_tv[i].ciphertext,
- sizeof(c5_tv[i].ciphertext)) ? "fail" : "pass");
}
+
out:
- crypto_free_tfm (tfm);
+ crypto_free_tfm(tfm);
}
static void
@@ -2387,73 +512,118 @@
switch (mode) {
case 0:
- test_md5();
- test_sha1();
- test_des();
- test_des3_ede();
- test_md4();
- test_sha256();
- test_blowfish();
- test_twofish();
- test_serpent();
- test_aes();
- test_sha384();
- test_sha512();
- test_deflate();
- test_cast5();
+ test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
+
+ test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
+
+ //DES
+ test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS);
+ test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS);
+ test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS);
+ test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
+
+ //DES3_EDE
+ test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS);
+ test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
+
+ test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
+
+ test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
+
+ //BLOWFISH
+ test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS);
+ test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
+ test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS);
+ test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
+
+ //TWOFISH
+ test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS);
+ test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS);
+ test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS);
+ test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
+
+ //SERPENT
+ test_cipher ("serpent", MODE_ECB, ENCRYPT, serpent_enc_tv_template, SERPENT_ENC_TEST_VECTORS);
+ test_cipher ("serpent", MODE_ECB, DECRYPT, serpent_dec_tv_template, SERPENT_DEC_TEST_VECTORS);
+
+ //AES
+ test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS);
+ test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);
+
+ //CAST5
+ test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS);
+ test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
+
+ //CAST6
+ test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS);
+ test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
+
+ test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
+ test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
+ test_deflate();
#ifdef CONFIG_CRYPTO_HMAC
- test_hmac_md5();
- test_hmac_sha1();
- test_hmac_sha256();
+ test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
+ test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
+ test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
#endif
break;
case 1:
- test_md5();
+ test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
break;
case 2:
- test_sha1();
+ test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
break;
case 3:
- test_des();
+ test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS);
+ test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS);
+ test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS);
+ test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
break;
case 4:
- test_des3_ede();
+ test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS);
+ test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
break;
case 5:
- test_md4();
+ test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
break;
case 6:
- test_sha256();
+ test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
break;
case 7:
- test_blowfish();
+ test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS);
+ test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
+ test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS);
+ test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
break;
case 8:
- test_twofish();
+ test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS);
+ test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS);
+ test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS);
+ test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
break;
-
+
case 9:
- test_serpent();
break;
case 10:
- test_aes();
+ test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS);
+ test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);
break;
case 11:
- test_sha384();
+ test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
break;
case 12:
- test_sha512();
+ test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
break;
case 13:
@@ -2461,20 +631,26 @@
break;
case 14:
- test_cast5();
+ test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS);
+ test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
+ break;
+
+ case 15:
+ test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS);
+ test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
break;
#ifdef CONFIG_CRYPTO_HMAC
case 100:
- test_hmac_md5();
+ test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
break;
case 101:
- test_hmac_sha1();
+ test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
break;
case 102:
- test_hmac_sha256();
+ test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
break;
#endif
@@ -2510,7 +686,14 @@
return 0;
}
+/*
+ * 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_PARM(mode, "i");
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)