Commit 060de20e authored by Linus Torvalds's avatar Linus Torvalds
parents b7c84c6a 2c4ee8f9
/* /*
* Quick & dirty crypto testing module. * Quick & dirty crypto testing module.
* *
* This will only exist until we have a better testing mechanism * This will only exist until we have a better testing mechanism
...@@ -9,11 +9,12 @@ ...@@ -9,11 +9,12 @@
* *
* This program is free software; you can redistribute it and/or modify it * 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 * 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) * Software Foundation; either version 2 of the License, or (at your option)
* any later version. * any later version.
* *
* 14 - 09 - 2003 * 2004-08-09 Added cipher speed tests (Reyk Floeter <reyk@vantronix.net>)
* Rewritten by Kartikey Mahendra Bhatt * 2003-09-14 Rewritten by Kartikey Mahendra Bhatt
*
*/ */
#include <linux/init.h> #include <linux/init.h>
...@@ -25,12 +26,15 @@ ...@@ -25,12 +26,15 @@
#include <linux/crypto.h> #include <linux/crypto.h>
#include <linux/highmem.h> #include <linux/highmem.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/jiffies.h>
#include <linux/timex.h>
#include <linux/interrupt.h>
#include "tcrypt.h" #include "tcrypt.h"
/* /*
* Need to kmalloc() memory for testing kmap(). * Need to kmalloc() memory for testing kmap().
*/ */
#define TVMEMSIZE 4096 #define TVMEMSIZE 16384
#define XBUFSIZE 32768 #define XBUFSIZE 32768
/* /*
...@@ -55,19 +59,23 @@ ...@@ -55,19 +59,23 @@
static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 }; static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
/*
* Used by test_cipher_speed()
*/
static unsigned int sec;
static int mode; static int mode;
static char *xbuf; static char *xbuf;
static char *tvmem; static char *tvmem;
static char *check[] = { static char *check[] = {
"des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish", "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
"twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6", "twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6",
"arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
"khazad", "wp512", "wp384", "wp256", "tnepres", NULL "khazad", "wp512", "wp384", "wp256", "tnepres", NULL
}; };
static void static void hexdump(unsigned char *buf, unsigned int len)
hexdump(unsigned char *buf, unsigned int len)
{ {
while (len--) while (len--)
printk("%02x", *buf++); printk("%02x", *buf++);
...@@ -75,29 +83,29 @@ hexdump(unsigned char *buf, unsigned int len) ...@@ -75,29 +83,29 @@ hexdump(unsigned char *buf, unsigned int len)
printk("\n"); printk("\n");
} }
static void static void test_hash(char *algo, struct hash_testvec *template,
test_hash (char * algo, struct hash_testvec * template, unsigned int tcount) unsigned int tcount)
{ {
char *p; char *p;
unsigned int i, j, k, temp; unsigned int i, j, k, temp;
struct scatterlist sg[8]; struct scatterlist sg[8];
char result[64]; char result[64];
struct crypto_tfm *tfm; struct crypto_tfm *tfm;
struct hash_testvec *hash_tv; struct hash_testvec *hash_tv;
unsigned int tsize; unsigned int tsize;
printk("\ntesting %s\n", algo); printk("\ntesting %s\n", algo);
tsize = sizeof (struct hash_testvec); tsize = sizeof(struct hash_testvec);
tsize *= tcount; tsize *= tcount;
if (tsize > TVMEMSIZE) { 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; return;
} }
memcpy(tvmem, template, tsize); memcpy(tvmem, template, tsize);
hash_tv = (void *) tvmem; hash_tv = (void *)tvmem;
tfm = crypto_alloc_tfm(algo, 0); tfm = crypto_alloc_tfm(algo, 0);
if (tfm == NULL) { if (tfm == NULL) {
printk("failed to load transform for %s\n", algo); printk("failed to load transform for %s\n", algo);
...@@ -105,70 +113,71 @@ test_hash (char * algo, struct hash_testvec * template, unsigned int tcount) ...@@ -105,70 +113,71 @@ test_hash (char * algo, struct hash_testvec * template, unsigned int tcount)
} }
for (i = 0; i < tcount; i++) { for (i = 0; i < tcount; i++) {
printk ("test %u:\n", i + 1); printk("test %u:\n", i + 1);
memset (result, 0, 64); memset(result, 0, 64);
p = hash_tv[i].plaintext; p = hash_tv[i].plaintext;
sg[0].page = virt_to_page (p); sg[0].page = virt_to_page(p);
sg[0].offset = offset_in_page (p); sg[0].offset = offset_in_page(p);
sg[0].length = hash_tv[i].psize; sg[0].length = hash_tv[i].psize;
crypto_digest_init (tfm); crypto_digest_init(tfm);
if (tfm->crt_u.digest.dit_setkey) { if (tfm->crt_u.digest.dit_setkey) {
crypto_digest_setkey (tfm, hash_tv[i].key, crypto_digest_setkey(tfm, hash_tv[i].key,
hash_tv[i].ksize); hash_tv[i].ksize);
} }
crypto_digest_update (tfm, sg, 1); crypto_digest_update(tfm, sg, 1);
crypto_digest_final (tfm, result); crypto_digest_final(tfm, result);
hexdump (result, crypto_tfm_alg_digestsize (tfm)); hexdump(result, crypto_tfm_alg_digestsize(tfm));
printk("%s\n", printk("%s\n",
memcmp(result, hash_tv[i].digest, memcmp(result, hash_tv[i].digest,
crypto_tfm_alg_digestsize(tfm)) ? "fail" : crypto_tfm_alg_digestsize(tfm)) ?
"pass"); "fail" : "pass");
} }
printk ("testing %s across pages\n", algo); printk("testing %s across pages\n", algo);
/* setup the dummy buffer first */ /* setup the dummy buffer first */
memset(xbuf, 0, XBUFSIZE); memset(xbuf, 0, XBUFSIZE);
j = 0; j = 0;
for (i = 0; i < tcount; i++) { for (i = 0; i < tcount; i++) {
if (hash_tv[i].np) { if (hash_tv[i].np) {
j++; j++;
printk ("test %u:\n", j); printk("test %u:\n", j);
memset (result, 0, 64); memset(result, 0, 64);
temp = 0; temp = 0;
for (k = 0; k < hash_tv[i].np; k++) { for (k = 0; k < hash_tv[i].np; k++) {
memcpy (&xbuf[IDX[k]], hash_tv[i].plaintext + temp, memcpy(&xbuf[IDX[k]],
hash_tv[i].tap[k]); hash_tv[i].plaintext + temp,
hash_tv[i].tap[k]);
temp += hash_tv[i].tap[k]; temp += hash_tv[i].tap[k];
p = &xbuf[IDX[k]]; p = &xbuf[IDX[k]];
sg[k].page = virt_to_page (p); sg[k].page = virt_to_page(p);
sg[k].offset = offset_in_page (p); sg[k].offset = offset_in_page(p);
sg[k].length = hash_tv[i].tap[k]; sg[k].length = hash_tv[i].tap[k];
} }
crypto_digest_digest (tfm, sg, hash_tv[i].np, result); crypto_digest_digest(tfm, sg, hash_tv[i].np, result);
hexdump (result, crypto_tfm_alg_digestsize (tfm)); hexdump(result, crypto_tfm_alg_digestsize(tfm));
printk("%s\n", printk("%s\n",
memcmp(result, hash_tv[i].digest, memcmp(result, hash_tv[i].digest,
crypto_tfm_alg_digestsize(tfm)) ? "fail" : crypto_tfm_alg_digestsize(tfm)) ?
"pass"); "fail" : "pass");
} }
} }
crypto_free_tfm (tfm); crypto_free_tfm(tfm);
} }
#ifdef CONFIG_CRYPTO_HMAC #ifdef CONFIG_CRYPTO_HMAC
static void static void test_hmac(char *algo, struct hmac_testvec *template,
test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount) unsigned int tcount)
{ {
char *p; char *p;
unsigned int i, j, k, temp; unsigned int i, j, k, temp;
...@@ -185,8 +194,8 @@ test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount) ...@@ -185,8 +194,8 @@ test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount)
} }
printk("\ntesting hmac_%s\n", algo); printk("\ntesting hmac_%s\n", algo);
tsize = sizeof (struct hmac_testvec); tsize = sizeof(struct hmac_testvec);
tsize *= tcount; tsize *= tcount;
if (tsize > TVMEMSIZE) { if (tsize > TVMEMSIZE) {
printk("template (%u) too big for tvmem (%u)\n", tsize, printk("template (%u) too big for tvmem (%u)\n", tsize,
...@@ -195,7 +204,7 @@ test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount) ...@@ -195,7 +204,7 @@ test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount)
} }
memcpy(tvmem, template, tsize); memcpy(tvmem, template, tsize);
hmac_tv = (void *) tvmem; hmac_tv = (void *)tvmem;
for (i = 0; i < tcount; i++) { for (i = 0; i < tcount; i++) {
printk("test %u:\n", i + 1); printk("test %u:\n", i + 1);
...@@ -219,34 +228,35 @@ test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount) ...@@ -219,34 +228,35 @@ test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount)
printk("\ntesting hmac_%s across pages\n", algo); printk("\ntesting hmac_%s across pages\n", algo);
memset(xbuf, 0, XBUFSIZE); memset(xbuf, 0, XBUFSIZE);
j = 0; j = 0;
for (i = 0; i < tcount; i++) { for (i = 0; i < tcount; i++) {
if (hmac_tv[i].np) { if (hmac_tv[i].np) {
j++; j++;
printk ("test %u:\n",j); printk("test %u:\n",j);
memset (result, 0, 64); memset(result, 0, 64);
temp = 0; temp = 0;
klen = hmac_tv[i].ksize; klen = hmac_tv[i].ksize;
for (k = 0; k < hmac_tv[i].np; k++) { for (k = 0; k < hmac_tv[i].np; k++) {
memcpy (&xbuf[IDX[k]], hmac_tv[i].plaintext + temp, memcpy(&xbuf[IDX[k]],
hmac_tv[i].tap[k]); hmac_tv[i].plaintext + temp,
hmac_tv[i].tap[k]);
temp += hmac_tv[i].tap[k]; temp += hmac_tv[i].tap[k];
p = &xbuf[IDX[k]]; p = &xbuf[IDX[k]];
sg[k].page = virt_to_page (p); sg[k].page = virt_to_page(p);
sg[k].offset = offset_in_page (p); sg[k].offset = offset_in_page(p);
sg[k].length = hmac_tv[i].tap[k]; sg[k].length = hmac_tv[i].tap[k];
} }
crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, hmac_tv[i].np, crypto_hmac(tfm, hmac_tv[i].key, &klen, sg,
result); hmac_tv[i].np, result);
hexdump(result, crypto_tfm_alg_digestsize(tfm)); hexdump(result, crypto_tfm_alg_digestsize(tfm));
printk("%s\n", printk("%s\n",
memcmp(result, hmac_tv[i].digest, memcmp(result, hmac_tv[i].digest,
crypto_tfm_alg_digestsize(tfm)) ? "fail" : crypto_tfm_alg_digestsize(tfm)) ?
"pass"); "fail" : "pass");
} }
} }
out: out:
...@@ -255,8 +265,8 @@ test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount) ...@@ -255,8 +265,8 @@ test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount)
#endif /* CONFIG_CRYPTO_HMAC */ #endif /* CONFIG_CRYPTO_HMAC */
static void static void test_cipher(char *algo, int mode, int enc,
test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, unsigned int tcount) struct cipher_testvec *template, unsigned int tcount)
{ {
unsigned int ret, i, j, k, temp; unsigned int ret, i, j, k, temp;
unsigned int tsize; unsigned int tsize;
...@@ -265,22 +275,22 @@ test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, un ...@@ -265,22 +275,22 @@ test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, un
char *key; char *key;
struct cipher_testvec *cipher_tv; struct cipher_testvec *cipher_tv;
struct scatterlist sg[8]; struct scatterlist sg[8];
char e[11], m[4]; const char *e, *m;
if (enc == ENCRYPT) if (enc == ENCRYPT)
strncpy(e, "encryption", 11); e = "encryption";
else else
strncpy(e, "decryption", 11); e = "decryption";
if (mode == MODE_ECB) if (mode == MODE_ECB)
strncpy(m, "ECB", 4); m = "ECB";
else else
strncpy(m, "CBC", 4); m = "CBC";
printk("\ntesting %s %s %s \n", algo, m, e); printk("\ntesting %s %s %s\n", algo, m, e);
tsize = sizeof (struct cipher_testvec); tsize = sizeof (struct cipher_testvec);
tsize *= tcount; tsize *= tcount;
if (tsize > TVMEMSIZE) { if (tsize > TVMEMSIZE) {
printk("template (%u) too big for tvmem (%u)\n", tsize, printk("template (%u) too big for tvmem (%u)\n", tsize,
TVMEMSIZE); TVMEMSIZE);
...@@ -288,112 +298,113 @@ test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, un ...@@ -288,112 +298,113 @@ test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, un
} }
memcpy(tvmem, template, tsize); memcpy(tvmem, template, tsize);
cipher_tv = (void *) tvmem; cipher_tv = (void *)tvmem;
if (mode)
tfm = crypto_alloc_tfm(algo, 0);
else
tfm = crypto_alloc_tfm(algo, CRYPTO_TFM_MODE_CBC);
if (mode)
tfm = crypto_alloc_tfm (algo, 0);
else
tfm = crypto_alloc_tfm (algo, CRYPTO_TFM_MODE_CBC);
if (tfm == NULL) { if (tfm == NULL) {
printk("failed to load transform for %s %s\n", algo, m); printk("failed to load transform for %s %s\n", algo, m);
return; return;
} }
j = 0; j = 0;
for (i = 0; i < tcount; i++) { for (i = 0; i < tcount; i++) {
if (!(cipher_tv[i].np)) { if (!(cipher_tv[i].np)) {
j++; j++;
printk("test %u (%d bit key):\n", printk("test %u (%d bit key):\n",
j, cipher_tv[i].klen * 8); j, cipher_tv[i].klen * 8);
tfm->crt_flags = 0; tfm->crt_flags = 0;
if (cipher_tv[i].wk) if (cipher_tv[i].wk)
tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY; tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
key = cipher_tv[i].key; key = cipher_tv[i].key;
ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen); ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
if (ret) { if (ret) {
printk("setkey() failed flags=%x\n", tfm->crt_flags); printk("setkey() failed flags=%x\n", tfm->crt_flags);
if (!cipher_tv[i].fail) if (!cipher_tv[i].fail)
goto out; goto out;
} }
p = cipher_tv[i].input; p = cipher_tv[i].input;
sg[0].page = virt_to_page(p); sg[0].page = virt_to_page(p);
sg[0].offset = offset_in_page(p); sg[0].offset = offset_in_page(p);
sg[0].length = cipher_tv[i].ilen; sg[0].length = cipher_tv[i].ilen;
if (!mode) { if (!mode) {
crypto_cipher_set_iv(tfm, cipher_tv[i].iv, crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
crypto_tfm_alg_ivsize (tfm)); crypto_tfm_alg_ivsize(tfm));
} }
if (enc) if (enc)
ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen); ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
else else
ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen); ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
if (ret) { if (ret) {
printk("%s () failed flags=%x\n", e, tfm->crt_flags); printk("%s () failed flags=%x\n", e, tfm->crt_flags);
goto out; goto out;
} }
q = kmap(sg[0].page) + sg[0].offset; q = kmap(sg[0].page) + sg[0].offset;
hexdump(q, cipher_tv[i].rlen); hexdump(q, cipher_tv[i].rlen);
printk("%s\n", printk("%s\n",
memcmp(q, cipher_tv[i].result, cipher_tv[i].rlen) ? "fail" : memcmp(q, cipher_tv[i].result,
"pass"); cipher_tv[i].rlen) ? "fail" : "pass");
} }
} }
printk("\ntesting %s %s %s across pages (chunking) \n", algo, m, e); printk("\ntesting %s %s %s across pages (chunking)\n", algo, m, e);
memset(xbuf, 0, XBUFSIZE); memset(xbuf, 0, XBUFSIZE);
j = 0; j = 0;
for (i = 0; i < tcount; i++) { for (i = 0; i < tcount; i++) {
if (cipher_tv[i].np) { if (cipher_tv[i].np) {
j++; j++;
printk("test %u (%d bit key):\n", printk("test %u (%d bit key):\n",
j, cipher_tv[i].klen * 8); j, cipher_tv[i].klen * 8);
tfm->crt_flags = 0; tfm->crt_flags = 0;
if (cipher_tv[i].wk) if (cipher_tv[i].wk)
tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY; tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
key = cipher_tv[i].key; key = cipher_tv[i].key;
ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen); ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
if (ret) { if (ret) {
printk("setkey() failed flags=%x\n", tfm->crt_flags); printk("setkey() failed flags=%x\n", tfm->crt_flags);
if (!cipher_tv[i].fail) if (!cipher_tv[i].fail)
goto out; goto out;
} }
temp = 0; temp = 0;
for (k = 0; k < cipher_tv[i].np; k++) { for (k = 0; k < cipher_tv[i].np; k++) {
memcpy (&xbuf[IDX[k]], cipher_tv[i].input + temp, memcpy(&xbuf[IDX[k]],
cipher_tv[i].tap[k]); cipher_tv[i].input + temp,
cipher_tv[i].tap[k]);
temp += cipher_tv[i].tap[k]; temp += cipher_tv[i].tap[k];
p = &xbuf[IDX[k]]; p = &xbuf[IDX[k]];
sg[k].page = virt_to_page (p); sg[k].page = virt_to_page(p);
sg[k].offset = offset_in_page (p); sg[k].offset = offset_in_page(p);
sg[k].length = cipher_tv[i].tap[k]; sg[k].length = cipher_tv[i].tap[k];
} }
if (!mode) { if (!mode) {
crypto_cipher_set_iv(tfm, cipher_tv[i].iv, crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
crypto_tfm_alg_ivsize (tfm)); crypto_tfm_alg_ivsize(tfm));
} }
if (enc) if (enc)
ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen); ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
else else
ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen); ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
if (ret) { if (ret) {
printk("%s () failed flags=%x\n", e, tfm->crt_flags); printk("%s () failed flags=%x\n", e, tfm->crt_flags);
goto out; goto out;
...@@ -404,9 +415,9 @@ test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, un ...@@ -404,9 +415,9 @@ test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, un
printk("page %u\n", k); printk("page %u\n", k);
q = kmap(sg[k].page) + sg[k].offset; q = kmap(sg[k].page) + sg[k].offset;
hexdump(q, cipher_tv[i].tap[k]); hexdump(q, cipher_tv[i].tap[k]);
printk("%s\n", printk("%s\n",
memcmp(q, cipher_tv[i].result + temp, memcmp(q, cipher_tv[i].result + temp,
cipher_tv[i].tap[k]) ? "fail" : cipher_tv[i].tap[k]) ? "fail" :
"pass"); "pass");
temp += cipher_tv[i].tap[k]; temp += cipher_tv[i].tap[k];
} }
...@@ -417,8 +428,169 @@ test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, un ...@@ -417,8 +428,169 @@ test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, un
crypto_free_tfm(tfm); crypto_free_tfm(tfm);
} }
static void static int test_cipher_jiffies(struct crypto_tfm *tfm, int enc, char *p,
test_deflate(void) int blen, int sec)
{
struct scatterlist sg[8];
unsigned long start, end;
int bcount;
int ret;
sg[0].page = virt_to_page(p);
sg[0].offset = offset_in_page(p);
sg[0].length = blen;
for (start = jiffies, end = start + sec * HZ, bcount = 0;
time_before(jiffies, end); bcount++) {
if (enc)
ret = crypto_cipher_encrypt(tfm, sg, sg, blen);
else
ret = crypto_cipher_decrypt(tfm, sg, sg, blen);
if (ret)
return ret;
}
printk("%d operations in %d seconds (%ld bytes)\n",
bcount, sec, (long)bcount * blen);
return 0;
}
static int test_cipher_cycles(struct crypto_tfm *tfm, int enc, char *p,
int blen)
{
struct scatterlist sg[8];
unsigned long cycles = 0;
int ret = 0;
int i;
sg[0].page = virt_to_page(p);
sg[0].offset = offset_in_page(p);
sg[0].length = blen;
local_bh_disable();
local_irq_disable();
/* Warm-up run. */
for (i = 0; i < 4; i++) {
if (enc)
ret = crypto_cipher_encrypt(tfm, sg, sg, blen);
else
ret = crypto_cipher_decrypt(tfm, sg, sg, blen);
if (ret)
goto out;
}
/* The real thing. */
for (i = 0; i < 8; i++) {
cycles_t start, end;
start = get_cycles();
if (enc)
ret = crypto_cipher_encrypt(tfm, sg, sg, blen);
else
ret = crypto_cipher_decrypt(tfm, sg, sg, blen);
end = get_cycles();
if (ret)
goto out;
cycles += end - start;
}
out:
local_irq_enable();
local_bh_enable();
if (ret == 0)
printk("1 operation in %lu cycles (%d bytes)\n",
(cycles + 4) / 8, blen);
return ret;
}
static void test_cipher_speed(char *algo, int mode, int enc, unsigned int sec,
struct cipher_testvec *template,
unsigned int tcount, struct cipher_speed *speed)
{
unsigned int ret, i, j, iv_len;
unsigned char *key, *p, iv[128];
struct crypto_tfm *tfm;
const char *e, *m;
if (enc == ENCRYPT)
e = "encryption";
else
e = "decryption";
if (mode == MODE_ECB)
m = "ECB";
else
m = "CBC";
printk("\ntesting speed of %s %s %s\n", algo, m, e);
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 %s %s\n", algo, m);
return;
}
for (i = 0; speed[i].klen != 0; i++) {
if ((speed[i].blen + speed[i].klen) > TVMEMSIZE) {
printk("template (%u) too big for tvmem (%u)\n",
speed[i].blen + speed[i].klen, TVMEMSIZE);
goto out;
}
printk("test %u (%d bit key, %d byte blocks): ", i,
speed[i].klen * 8, speed[i].blen);
memset(tvmem, 0xff, speed[i].klen + speed[i].blen);
/* set key, plain text and IV */
key = (unsigned char *)tvmem;
for (j = 0; j < tcount; j++) {
if (template[j].klen == speed[i].klen) {
key = template[j].key;
break;
}
}
p = (unsigned char *)tvmem + speed[i].klen;
ret = crypto_cipher_setkey(tfm, key, speed[i].klen);
if (ret) {
printk("setkey() failed flags=%x\n", tfm->crt_flags);
goto out;
}
if (!mode) {
iv_len = crypto_tfm_alg_ivsize(tfm);
memset(&iv, 0xff, iv_len);
crypto_cipher_set_iv(tfm, iv, iv_len);
}
if (sec)
ret = test_cipher_jiffies(tfm, enc, p, speed[i].blen,
sec);
else
ret = test_cipher_cycles(tfm, enc, p, speed[i].blen);
if (ret) {
printk("%s() failed flags=%x\n", e, tfm->crt_flags);
break;
}
}
out:
crypto_free_tfm(tfm);
}
static void test_deflate(void)
{ {
unsigned int i; unsigned int i;
char result[COMP_BUF_SIZE]; char result[COMP_BUF_SIZE];
...@@ -436,7 +608,7 @@ test_deflate(void) ...@@ -436,7 +608,7 @@ test_deflate(void)
} }
memcpy(tvmem, deflate_comp_tv_template, tsize); memcpy(tvmem, deflate_comp_tv_template, tsize);
tv = (void *) tvmem; tv = (void *)tvmem;
tfm = crypto_alloc_tfm("deflate", 0); tfm = crypto_alloc_tfm("deflate", 0);
if (tfm == NULL) { if (tfm == NULL) {
...@@ -446,7 +618,7 @@ test_deflate(void) ...@@ -446,7 +618,7 @@ test_deflate(void)
for (i = 0; i < DEFLATE_COMP_TEST_VECTORS; i++) { for (i = 0; i < DEFLATE_COMP_TEST_VECTORS; i++) {
int ilen, ret, dlen = COMP_BUF_SIZE; int ilen, ret, dlen = COMP_BUF_SIZE;
printk("test %u:\n", i + 1); printk("test %u:\n", i + 1);
memset(result, 0, sizeof (result)); memset(result, 0, sizeof (result));
...@@ -473,11 +645,11 @@ test_deflate(void) ...@@ -473,11 +645,11 @@ test_deflate(void)
} }
memcpy(tvmem, deflate_decomp_tv_template, tsize); memcpy(tvmem, deflate_decomp_tv_template, tsize);
tv = (void *) tvmem; tv = (void *)tvmem;
for (i = 0; i < DEFLATE_DECOMP_TEST_VECTORS; i++) { for (i = 0; i < DEFLATE_DECOMP_TEST_VECTORS; i++) {
int ilen, ret, dlen = COMP_BUF_SIZE; int ilen, ret, dlen = COMP_BUF_SIZE;
printk("test %u:\n", i + 1); printk("test %u:\n", i + 1);
memset(result, 0, sizeof (result)); memset(result, 0, sizeof (result));
...@@ -497,8 +669,7 @@ test_deflate(void) ...@@ -497,8 +669,7 @@ test_deflate(void)
crypto_free_tfm(tfm); crypto_free_tfm(tfm);
} }
static void static void test_crc32c(void)
test_crc32c(void)
{ {
#define NUMVEC 6 #define NUMVEC 6
#define VECSIZE 40 #define VECSIZE 40
...@@ -511,7 +682,7 @@ test_crc32c(void) ...@@ -511,7 +682,7 @@ test_crc32c(void)
0xd579c862, 0xba979ad0, 0x2b29d913 0xd579c862, 0xba979ad0, 0x2b29d913
}; };
static u32 tot_vec_results = 0x24c5d375; static u32 tot_vec_results = 0x24c5d375;
struct scatterlist sg[NUMVEC]; struct scatterlist sg[NUMVEC];
struct crypto_tfm *tfm; struct crypto_tfm *tfm;
char *fmtdata = "testing crc32c initialized to %08x: %s\n"; char *fmtdata = "testing crc32c initialized to %08x: %s\n";
...@@ -525,18 +696,18 @@ test_crc32c(void) ...@@ -525,18 +696,18 @@ test_crc32c(void)
printk("failed to load transform for crc32c\n"); printk("failed to load transform for crc32c\n");
return; return;
} }
crypto_digest_init(tfm); crypto_digest_init(tfm);
crypto_digest_final(tfm, (u8*)&crc); crypto_digest_final(tfm, (u8*)&crc);
printk(fmtdata, crc, (crc == 0) ? "pass" : "ERROR"); printk(fmtdata, crc, (crc == 0) ? "pass" : "ERROR");
/* /*
* stuff test_vec with known values, simple incrementing * stuff test_vec with known values, simple incrementing
* byte values. * byte values.
*/ */
b = 0; b = 0;
for (i = 0; i < NUMVEC; i++) { for (i = 0; i < NUMVEC; i++) {
for (j = 0; j < VECSIZE; j++) for (j = 0; j < VECSIZE; j++)
test_vec[i][j] = ++b; test_vec[i][j] = ++b;
sg[i].page = virt_to_page(test_vec[i]); sg[i].page = virt_to_page(test_vec[i]);
sg[i].offset = offset_in_page(test_vec[i]); sg[i].offset = offset_in_page(test_vec[i]);
...@@ -548,11 +719,11 @@ test_crc32c(void) ...@@ -548,11 +719,11 @@ test_crc32c(void)
crypto_digest_final(tfm, (u8*)&crc); crypto_digest_final(tfm, (u8*)&crc);
printk("testing crc32c setkey returns %08x : %s\n", crc, (crc == (SEEDTESTVAL ^ ~(u32)0)) ? printk("testing crc32c setkey returns %08x : %s\n", crc, (crc == (SEEDTESTVAL ^ ~(u32)0)) ?
"pass" : "ERROR"); "pass" : "ERROR");
printk("testing crc32c using update/final:\n"); printk("testing crc32c using update/final:\n");
pass = 1; /* assume all is well */ pass = 1; /* assume all is well */
for (i = 0; i < NUMVEC; i++) { for (i = 0; i < NUMVEC; i++) {
seed = ~(u32)0; seed = ~(u32)0;
(void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32)); (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32));
...@@ -591,66 +762,64 @@ test_crc32c(void) ...@@ -591,66 +762,64 @@ test_crc32c(void)
printk(" %08x:BAD, wanted %08x\n", crc, tot_vec_results); printk(" %08x:BAD, wanted %08x\n", crc, tot_vec_results);
pass = 0; pass = 0;
} }
printk("\n%s\n", pass ? "pass" : "ERROR"); printk("\n%s\n", pass ? "pass" : "ERROR");
crypto_free_tfm(tfm); crypto_free_tfm(tfm);
printk("crc32c test complete\n"); printk("crc32c test complete\n");
} }
static void static void test_available(void)
test_available(void)
{ {
char **name = check; char **name = check;
while (*name) { while (*name) {
printk("alg %s ", *name); printk("alg %s ", *name);
printk((crypto_alg_available(*name, 0)) ? printk((crypto_alg_available(*name, 0)) ?
"found\n" : "not found\n"); "found\n" : "not found\n");
name++; name++;
} }
} }
static void static void do_test(void)
do_test(void)
{ {
switch (mode) { switch (mode) {
case 0: case 0:
test_hash("md5", md5_tv_template, MD5_TEST_VECTORS); test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS); test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
//DES //DES
test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS); 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_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, 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); test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
//DES3_EDE //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, 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_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("md4", md4_tv_template, MD4_TEST_VECTORS);
test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS); test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
//BLOWFISH //BLOWFISH
test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS); 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_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, 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); test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
//TWOFISH //TWOFISH
test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS); 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_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, 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); test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
//SERPENT //SERPENT
test_cipher ("serpent", MODE_ECB, ENCRYPT, serpent_enc_tv_template, SERPENT_ENC_TEST_VECTORS); 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); test_cipher ("serpent", MODE_ECB, DECRYPT, serpent_dec_tv_template, SERPENT_DEC_TEST_VECTORS);
//TNEPRES //TNEPRES
test_cipher ("tnepres", MODE_ECB, ENCRYPT, tnepres_enc_tv_template, TNEPRES_ENC_TEST_VECTORS); test_cipher ("tnepres", MODE_ECB, ENCRYPT, tnepres_enc_tv_template, TNEPRES_ENC_TEST_VECTORS);
test_cipher ("tnepres", MODE_ECB, DECRYPT, tnepres_dec_tv_template, TNEPRES_DEC_TEST_VECTORS); test_cipher ("tnepres", MODE_ECB, DECRYPT, tnepres_dec_tv_template, TNEPRES_DEC_TEST_VECTORS);
...@@ -662,7 +831,7 @@ do_test(void) ...@@ -662,7 +831,7 @@ do_test(void)
//CAST5 //CAST5
test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS); 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); test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
//CAST6 //CAST6
test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS); 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_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
...@@ -702,9 +871,9 @@ do_test(void) ...@@ -702,9 +871,9 @@ do_test(void)
test_crc32c(); test_crc32c();
#ifdef CONFIG_CRYPTO_HMAC #ifdef CONFIG_CRYPTO_HMAC
test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS); test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS); test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS); test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
#endif #endif
test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS); test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
break; break;
...@@ -726,17 +895,17 @@ do_test(void) ...@@ -726,17 +895,17 @@ do_test(void)
case 4: case 4:
test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS); 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_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
break; break;
case 5: case 5:
test_hash("md4", md4_tv_template, MD4_TEST_VECTORS); test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
break; break;
case 6: case 6:
test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS); test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
break; break;
case 7: case 7:
test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS); 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_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
...@@ -750,7 +919,7 @@ do_test(void) ...@@ -750,7 +919,7 @@ do_test(void)
test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_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); test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
break; break;
case 9: case 9:
test_cipher ("serpent", MODE_ECB, ENCRYPT, serpent_enc_tv_template, SERPENT_ENC_TEST_VECTORS); 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); test_cipher ("serpent", MODE_ECB, DECRYPT, serpent_dec_tv_template, SERPENT_DEC_TEST_VECTORS);
...@@ -758,13 +927,13 @@ do_test(void) ...@@ -758,13 +927,13 @@ do_test(void)
case 10: case 10:
test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS); 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); test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);
break; break;
case 11: case 11:
test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS); test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
break; break;
case 12: case 12:
test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS); test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
break; break;
...@@ -852,21 +1021,84 @@ do_test(void) ...@@ -852,21 +1021,84 @@ do_test(void)
case 100: case 100:
test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS); test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
break; break;
case 101: case 101:
test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS); test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
break; break;
case 102: case 102:
test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS); test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
break; break;
#endif #endif
case 200:
test_cipher_speed("aes", MODE_ECB, ENCRYPT, sec, NULL, 0,
aes_speed_template);
test_cipher_speed("aes", MODE_ECB, DECRYPT, sec, NULL, 0,
aes_speed_template);
test_cipher_speed("aes", MODE_CBC, ENCRYPT, sec, NULL, 0,
aes_speed_template);
test_cipher_speed("aes", MODE_CBC, DECRYPT, sec, NULL, 0,
aes_speed_template);
break;
case 201:
test_cipher_speed("des3_ede", MODE_ECB, ENCRYPT, sec,
des3_ede_enc_tv_template,
DES3_EDE_ENC_TEST_VECTORS,
des3_ede_speed_template);
test_cipher_speed("des3_ede", MODE_ECB, DECRYPT, sec,
des3_ede_dec_tv_template,
DES3_EDE_DEC_TEST_VECTORS,
des3_ede_speed_template);
test_cipher_speed("des3_ede", MODE_CBC, ENCRYPT, sec,
des3_ede_enc_tv_template,
DES3_EDE_ENC_TEST_VECTORS,
des3_ede_speed_template);
test_cipher_speed("des3_ede", MODE_CBC, DECRYPT, sec,
des3_ede_dec_tv_template,
DES3_EDE_DEC_TEST_VECTORS,
des3_ede_speed_template);
break;
case 202:
test_cipher_speed("twofish", MODE_ECB, ENCRYPT, sec, NULL, 0,
twofish_speed_template);
test_cipher_speed("twofish", MODE_ECB, DECRYPT, sec, NULL, 0,
twofish_speed_template);
test_cipher_speed("twofish", MODE_CBC, ENCRYPT, sec, NULL, 0,
twofish_speed_template);
test_cipher_speed("twofish", MODE_CBC, DECRYPT, sec, NULL, 0,
twofish_speed_template);
break;
case 203:
test_cipher_speed("blowfish", MODE_ECB, ENCRYPT, sec, NULL, 0,
blowfish_speed_template);
test_cipher_speed("blowfish", MODE_ECB, DECRYPT, sec, NULL, 0,
blowfish_speed_template);
test_cipher_speed("blowfish", MODE_CBC, ENCRYPT, sec, NULL, 0,
blowfish_speed_template);
test_cipher_speed("blowfish", MODE_CBC, DECRYPT, sec, NULL, 0,
blowfish_speed_template);
break;
case 204:
test_cipher_speed("des", MODE_ECB, ENCRYPT, sec, NULL, 0,
des_speed_template);
test_cipher_speed("des", MODE_ECB, DECRYPT, sec, NULL, 0,
des_speed_template);
test_cipher_speed("des", MODE_CBC, ENCRYPT, sec, NULL, 0,
des_speed_template);
test_cipher_speed("des", MODE_CBC, DECRYPT, sec, NULL, 0,
des_speed_template);
break;
case 1000: case 1000:
test_available(); test_available();
break; break;
default: default:
/* useful for debugging */ /* useful for debugging */
printk("not testing anything\n"); printk("not testing anything\n");
...@@ -874,8 +1106,7 @@ do_test(void) ...@@ -874,8 +1106,7 @@ do_test(void)
} }
} }
static int __init static int __init init(void)
init(void)
{ {
tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL); tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL);
if (tvmem == NULL) if (tvmem == NULL)
...@@ -904,6 +1135,9 @@ module_init(init); ...@@ -904,6 +1135,9 @@ module_init(init);
module_exit(fini); module_exit(fini);
module_param(mode, int, 0); module_param(mode, int, 0);
module_param(sec, uint, 0);
MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
"(defaults to zero which uses CPU cycles instead)");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Quick & dirty crypto testing module"); MODULE_DESCRIPTION("Quick & dirty crypto testing module");
......
...@@ -9,10 +9,11 @@ ...@@ -9,10 +9,11 @@
* *
* This program is free software; you can redistribute it and/or modify it * 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 * 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) * Software Foundation; either version 2 of the License, or (at your option)
* any later version. * any later version.
* *
* 14 - 09 - 2003 Changes by Kartikey Mahendra Bhatt * 2004-08-09 Cipher speed tests by Reyk Floeter <reyk@vantronix.net>
* 2003-09-14 Changes by Kartikey Mahendra Bhatt
* *
*/ */
#ifndef _CRYPTO_TCRYPT_H #ifndef _CRYPTO_TCRYPT_H
...@@ -29,19 +30,19 @@ struct hash_testvec { ...@@ -29,19 +30,19 @@ struct hash_testvec {
unsigned char psize; unsigned char psize;
char digest[MAX_DIGEST_SIZE]; char digest[MAX_DIGEST_SIZE];
unsigned char np; unsigned char np;
unsigned char tap[MAX_TAP]; unsigned char tap[MAX_TAP];
char key[128]; /* only used with keyed hash algorithms */ char key[128]; /* only used with keyed hash algorithms */
unsigned char ksize; unsigned char ksize;
}; };
struct hmac_testvec { struct hmac_testvec {
char key[128]; char key[128];
unsigned char ksize; unsigned char ksize;
char plaintext[128]; char plaintext[128];
unsigned char psize; unsigned char psize;
char digest[MAX_DIGEST_SIZE]; char digest[MAX_DIGEST_SIZE];
unsigned char np; unsigned char np;
unsigned char tap[MAX_TAP]; unsigned char tap[MAX_TAP];
}; };
struct cipher_testvec { struct cipher_testvec {
...@@ -55,7 +56,12 @@ struct cipher_testvec { ...@@ -55,7 +56,12 @@ struct cipher_testvec {
char result[48]; char result[48];
unsigned char rlen; unsigned char rlen;
int np; int np;
unsigned char tap[MAX_TAP]; unsigned char tap[MAX_TAP];
};
struct cipher_speed {
unsigned char klen;
unsigned int blen;
}; };
/* /*
...@@ -155,7 +161,7 @@ static struct hash_testvec md5_tv_template[] = { ...@@ -155,7 +161,7 @@ static struct hash_testvec md5_tv_template[] = {
#define SHA1_TEST_VECTORS 2 #define SHA1_TEST_VECTORS 2
static struct hash_testvec sha1_tv_template[] = { static struct hash_testvec sha1_tv_template[] = {
{ {
.plaintext = "abc", .plaintext = "abc",
.psize = 3, .psize = 3,
.digest = { 0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e, .digest = { 0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e,
...@@ -175,8 +181,8 @@ static struct hash_testvec sha1_tv_template[] = { ...@@ -175,8 +181,8 @@ static struct hash_testvec sha1_tv_template[] = {
*/ */
#define SHA256_TEST_VECTORS 2 #define SHA256_TEST_VECTORS 2
static struct hash_testvec sha256_tv_template[] = { static struct hash_testvec sha256_tv_template[] = {
{ {
.plaintext = "abc", .plaintext = "abc",
.psize = 3, .psize = 3,
.digest = { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, .digest = { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
...@@ -201,7 +207,7 @@ static struct hash_testvec sha256_tv_template[] = { ...@@ -201,7 +207,7 @@ static struct hash_testvec sha256_tv_template[] = {
#define SHA384_TEST_VECTORS 4 #define SHA384_TEST_VECTORS 4
static struct hash_testvec sha384_tv_template[] = { static struct hash_testvec sha384_tv_template[] = {
{ {
.plaintext= "abc", .plaintext= "abc",
.psize = 3, .psize = 3,
.digest = { 0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b, .digest = { 0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
...@@ -221,7 +227,7 @@ static struct hash_testvec sha384_tv_template[] = { ...@@ -221,7 +227,7 @@ static struct hash_testvec sha384_tv_template[] = {
0x5f, 0xe9, 0x5b, 0x1f, 0xe3, 0xc8, 0x45, 0x2b}, 0x5f, 0xe9, 0x5b, 0x1f, 0xe3, 0xc8, 0x45, 0x2b},
}, { }, {
.plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
"hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
.psize = 112, .psize = 112,
.digest = { 0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8, .digest = { 0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47, 0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
...@@ -250,7 +256,7 @@ static struct hash_testvec sha384_tv_template[] = { ...@@ -250,7 +256,7 @@ static struct hash_testvec sha384_tv_template[] = {
#define SHA512_TEST_VECTORS 4 #define SHA512_TEST_VECTORS 4
static struct hash_testvec sha512_tv_template[] = { static struct hash_testvec sha512_tv_template[] = {
{ {
.plaintext = "abc", .plaintext = "abc",
.psize = 3, .psize = 3,
.digest = { 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, .digest = { 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba,
...@@ -303,14 +309,14 @@ static struct hash_testvec sha512_tv_template[] = { ...@@ -303,14 +309,14 @@ static struct hash_testvec sha512_tv_template[] = {
/* /*
* WHIRLPOOL test vectors from Whirlpool package * WHIRLPOOL test vectors from Whirlpool package
* by Vincent Rijmen and Paulo S. L. M. Barreto as part of the NESSIE * by Vincent Rijmen and Paulo S. L. M. Barreto as part of the NESSIE
* submission * submission
*/ */
#define WP512_TEST_VECTORS 8 #define WP512_TEST_VECTORS 8
static struct hash_testvec wp512_tv_template[] = { static struct hash_testvec wp512_tv_template[] = {
{ {
.plaintext = "", .plaintext = "",
.psize = 0, .psize = 0,
.digest = { 0x19, 0xFA, 0x61, 0xD7, 0x55, 0x22, 0xA4, 0x66, .digest = { 0x19, 0xFA, 0x61, 0xD7, 0x55, 0x22, 0xA4, 0x66,
...@@ -348,13 +354,13 @@ static struct hash_testvec wp512_tv_template[] = { ...@@ -348,13 +354,13 @@ static struct hash_testvec wp512_tv_template[] = {
}, { }, {
.plaintext = "message digest", .plaintext = "message digest",
.psize = 14, .psize = 14,
.digest = { 0x37, 0x8C, 0x84, 0xA4, 0x12, 0x6E, 0x2D, 0xC6, .digest = { 0x37, 0x8C, 0x84, 0xA4, 0x12, 0x6E, 0x2D, 0xC6,
0xE5, 0x6D, 0xCC, 0x74, 0x58, 0x37, 0x7A, 0xAC, 0xE5, 0x6D, 0xCC, 0x74, 0x58, 0x37, 0x7A, 0xAC,
0x83, 0x8D, 0x00, 0x03, 0x22, 0x30, 0xF5, 0x3C, 0x83, 0x8D, 0x00, 0x03, 0x22, 0x30, 0xF5, 0x3C,
0xE1, 0xF5, 0x70, 0x0C, 0x0F, 0xFB, 0x4D, 0x3B, 0xE1, 0xF5, 0x70, 0x0C, 0x0F, 0xFB, 0x4D, 0x3B,
0x84, 0x21, 0x55, 0x76, 0x59, 0xEF, 0x55, 0xC1, 0x84, 0x21, 0x55, 0x76, 0x59, 0xEF, 0x55, 0xC1,
0x06, 0xB4, 0xB5, 0x2A, 0xC5, 0xA4, 0xAA, 0xA6, 0x06, 0xB4, 0xB5, 0x2A, 0xC5, 0xA4, 0xAA, 0xA6,
0x92, 0xED, 0x92, 0x00, 0x52, 0x83, 0x8F, 0x33, 0x92, 0xED, 0x92, 0x00, 0x52, 0x83, 0x8F, 0x33,
0x62, 0xE8, 0x6D, 0xBD, 0x37, 0xA8, 0x90, 0x3E }, 0x62, 0xE8, 0x6D, 0xBD, 0x37, 0xA8, 0x90, 0x3E },
}, { }, {
.plaintext = "abcdefghijklmnopqrstuvwxyz", .plaintext = "abcdefghijklmnopqrstuvwxyz",
...@@ -394,7 +400,7 @@ static struct hash_testvec wp512_tv_template[] = { ...@@ -394,7 +400,7 @@ static struct hash_testvec wp512_tv_template[] = {
}, { }, {
.plaintext = "abcdbcdecdefdefgefghfghighijhijk", .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
.psize = 32, .psize = 32,
.digest = { 0x2A, 0x98, 0x7E, 0xA4, 0x0F, 0x91, 0x70, 0x61, .digest = { 0x2A, 0x98, 0x7E, 0xA4, 0x0F, 0x91, 0x70, 0x61,
0xF5, 0xD6, 0xF0, 0xA0, 0xE4, 0x64, 0x4F, 0x48, 0xF5, 0xD6, 0xF0, 0xA0, 0xE4, 0x64, 0x4F, 0x48,
0x8A, 0x7A, 0x5A, 0x52, 0xDE, 0xEE, 0x65, 0x62, 0x8A, 0x7A, 0x5A, 0x52, 0xDE, 0xEE, 0x65, 0x62,
0x07, 0xC5, 0x62, 0xF9, 0x88, 0xE9, 0x5C, 0x69, 0x07, 0xC5, 0x62, 0xF9, 0x88, 0xE9, 0x5C, 0x69,
...@@ -408,7 +414,7 @@ static struct hash_testvec wp512_tv_template[] = { ...@@ -408,7 +414,7 @@ static struct hash_testvec wp512_tv_template[] = {
#define WP384_TEST_VECTORS 8 #define WP384_TEST_VECTORS 8
static struct hash_testvec wp384_tv_template[] = { static struct hash_testvec wp384_tv_template[] = {
{ {
.plaintext = "", .plaintext = "",
.psize = 0, .psize = 0,
.digest = { 0x19, 0xFA, 0x61, 0xD7, 0x55, 0x22, 0xA4, 0x66, .digest = { 0x19, 0xFA, 0x61, 0xD7, 0x55, 0x22, 0xA4, 0x66,
...@@ -440,11 +446,11 @@ static struct hash_testvec wp384_tv_template[] = { ...@@ -440,11 +446,11 @@ static struct hash_testvec wp384_tv_template[] = {
}, { }, {
.plaintext = "message digest", .plaintext = "message digest",
.psize = 14, .psize = 14,
.digest = { 0x37, 0x8C, 0x84, 0xA4, 0x12, 0x6E, 0x2D, 0xC6, .digest = { 0x37, 0x8C, 0x84, 0xA4, 0x12, 0x6E, 0x2D, 0xC6,
0xE5, 0x6D, 0xCC, 0x74, 0x58, 0x37, 0x7A, 0xAC, 0xE5, 0x6D, 0xCC, 0x74, 0x58, 0x37, 0x7A, 0xAC,
0x83, 0x8D, 0x00, 0x03, 0x22, 0x30, 0xF5, 0x3C, 0x83, 0x8D, 0x00, 0x03, 0x22, 0x30, 0xF5, 0x3C,
0xE1, 0xF5, 0x70, 0x0C, 0x0F, 0xFB, 0x4D, 0x3B, 0xE1, 0xF5, 0x70, 0x0C, 0x0F, 0xFB, 0x4D, 0x3B,
0x84, 0x21, 0x55, 0x76, 0x59, 0xEF, 0x55, 0xC1, 0x84, 0x21, 0x55, 0x76, 0x59, 0xEF, 0x55, 0xC1,
0x06, 0xB4, 0xB5, 0x2A, 0xC5, 0xA4, 0xAA, 0xA6 }, 0x06, 0xB4, 0xB5, 0x2A, 0xC5, 0xA4, 0xAA, 0xA6 },
}, { }, {
.plaintext = "abcdefghijklmnopqrstuvwxyz", .plaintext = "abcdefghijklmnopqrstuvwxyz",
...@@ -478,7 +484,7 @@ static struct hash_testvec wp384_tv_template[] = { ...@@ -478,7 +484,7 @@ static struct hash_testvec wp384_tv_template[] = {
}, { }, {
.plaintext = "abcdbcdecdefdefgefghfghighijhijk", .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
.psize = 32, .psize = 32,
.digest = { 0x2A, 0x98, 0x7E, 0xA4, 0x0F, 0x91, 0x70, 0x61, .digest = { 0x2A, 0x98, 0x7E, 0xA4, 0x0F, 0x91, 0x70, 0x61,
0xF5, 0xD6, 0xF0, 0xA0, 0xE4, 0x64, 0x4F, 0x48, 0xF5, 0xD6, 0xF0, 0xA0, 0xE4, 0x64, 0x4F, 0x48,
0x8A, 0x7A, 0x5A, 0x52, 0xDE, 0xEE, 0x65, 0x62, 0x8A, 0x7A, 0x5A, 0x52, 0xDE, 0xEE, 0x65, 0x62,
0x07, 0xC5, 0x62, 0xF9, 0x88, 0xE9, 0x5C, 0x69, 0x07, 0xC5, 0x62, 0xF9, 0x88, 0xE9, 0x5C, 0x69,
...@@ -490,7 +496,7 @@ static struct hash_testvec wp384_tv_template[] = { ...@@ -490,7 +496,7 @@ static struct hash_testvec wp384_tv_template[] = {
#define WP256_TEST_VECTORS 8 #define WP256_TEST_VECTORS 8
static struct hash_testvec wp256_tv_template[] = { static struct hash_testvec wp256_tv_template[] = {
{ {
.plaintext = "", .plaintext = "",
.psize = 0, .psize = 0,
.digest = { 0x19, 0xFA, 0x61, 0xD7, 0x55, 0x22, 0xA4, 0x66, .digest = { 0x19, 0xFA, 0x61, 0xD7, 0x55, 0x22, 0xA4, 0x66,
...@@ -516,9 +522,9 @@ static struct hash_testvec wp256_tv_template[] = { ...@@ -516,9 +522,9 @@ static struct hash_testvec wp256_tv_template[] = {
}, { }, {
.plaintext = "message digest", .plaintext = "message digest",
.psize = 14, .psize = 14,
.digest = { 0x37, 0x8C, 0x84, 0xA4, 0x12, 0x6E, 0x2D, 0xC6, .digest = { 0x37, 0x8C, 0x84, 0xA4, 0x12, 0x6E, 0x2D, 0xC6,
0xE5, 0x6D, 0xCC, 0x74, 0x58, 0x37, 0x7A, 0xAC, 0xE5, 0x6D, 0xCC, 0x74, 0x58, 0x37, 0x7A, 0xAC,
0x83, 0x8D, 0x00, 0x03, 0x22, 0x30, 0xF5, 0x3C, 0x83, 0x8D, 0x00, 0x03, 0x22, 0x30, 0xF5, 0x3C,
0xE1, 0xF5, 0x70, 0x0C, 0x0F, 0xFB, 0x4D, 0x3B }, 0xE1, 0xF5, 0x70, 0x0C, 0x0F, 0xFB, 0x4D, 0x3B },
}, { }, {
.plaintext = "abcdefghijklmnopqrstuvwxyz", .plaintext = "abcdefghijklmnopqrstuvwxyz",
...@@ -546,7 +552,7 @@ static struct hash_testvec wp256_tv_template[] = { ...@@ -546,7 +552,7 @@ static struct hash_testvec wp256_tv_template[] = {
}, { }, {
.plaintext = "abcdbcdecdefdefgefghfghighijhijk", .plaintext = "abcdbcdecdefdefgefghfghighijhijk",
.psize = 32, .psize = 32,
.digest = { 0x2A, 0x98, 0x7E, 0xA4, 0x0F, 0x91, 0x70, 0x61, .digest = { 0x2A, 0x98, 0x7E, 0xA4, 0x0F, 0x91, 0x70, 0x61,
0xF5, 0xD6, 0xF0, 0xA0, 0xE4, 0x64, 0x4F, 0x48, 0xF5, 0xD6, 0xF0, 0xA0, 0xE4, 0x64, 0x4F, 0x48,
0x8A, 0x7A, 0x5A, 0x52, 0xDE, 0xEE, 0x65, 0x62, 0x8A, 0x7A, 0x5A, 0x52, 0xDE, 0xEE, 0x65, 0x62,
0x07, 0xC5, 0x62, 0xF9, 0x88, 0xE9, 0x5C, 0x69 }, 0x07, 0xC5, 0x62, 0xF9, 0x88, 0xE9, 0x5C, 0x69 },
...@@ -554,7 +560,7 @@ static struct hash_testvec wp256_tv_template[] = { ...@@ -554,7 +560,7 @@ static struct hash_testvec wp256_tv_template[] = {
}; };
/* /*
* TIGER test vectors from Tiger website * TIGER test vectors from Tiger website
*/ */
#define TGR192_TEST_VECTORS 6 #define TGR192_TEST_VECTORS 6
...@@ -693,7 +699,7 @@ static struct hash_testvec tgr128_tv_template[] = { ...@@ -693,7 +699,7 @@ static struct hash_testvec tgr128_tv_template[] = {
#define HMAC_MD5_TEST_VECTORS 7 #define HMAC_MD5_TEST_VECTORS 7
static struct hmac_testvec hmac_md5_tv_template[] = static struct hmac_testvec hmac_md5_tv_template[] =
{ {
{ {
.key = { [0 ... 15] = 0x0b }, .key = { [0 ... 15] = 0x0b },
.ksize = 16, .ksize = 16,
...@@ -756,7 +762,7 @@ static struct hmac_testvec hmac_md5_tv_template[] = ...@@ -756,7 +762,7 @@ static struct hmac_testvec hmac_md5_tv_template[] =
*/ */
#define HMAC_SHA1_TEST_VECTORS 7 #define HMAC_SHA1_TEST_VECTORS 7
static struct hmac_testvec hmac_sha1_tv_template[] = { static struct hmac_testvec hmac_sha1_tv_template[] = {
{ {
.key = { [0 ... 19] = 0x0b }, .key = { [0 ... 19] = 0x0b },
.ksize = 20, .ksize = 20,
...@@ -766,11 +772,11 @@ static struct hmac_testvec hmac_sha1_tv_template[] = { ...@@ -766,11 +772,11 @@ static struct hmac_testvec hmac_sha1_tv_template[] = {
0xe2, 0x8b, 0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e, 0xf1, 0xe2, 0x8b, 0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e, 0xf1,
0x46, 0xbe }, 0x46, 0xbe },
}, { }, {
.key = { 'J', 'e', 'f', 'e' }, .key = { 'J', 'e', 'f', 'e' },
.ksize = 4, .ksize = 4,
.plaintext = "what do ya want for nothing?", .plaintext = "what do ya want for nothing?",
.psize = 28, .psize = 28,
.digest = { 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74, .digest = { 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74,
0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 }, 0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 },
.np = 2, .np = 2,
.tap = { 14, 14 } .tap = { 14, 14 }
...@@ -779,30 +785,30 @@ static struct hmac_testvec hmac_sha1_tv_template[] = { ...@@ -779,30 +785,30 @@ static struct hmac_testvec hmac_sha1_tv_template[] = {
.ksize = 20, .ksize = 20,
.plaintext = { [0 ... 49] = 0xdd }, .plaintext = { [0 ... 49] = 0xdd },
.psize = 50, .psize = 50,
.digest = { 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 0x91, 0xa3, .digest = { 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 0x91, 0xa3,
0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 0x63, 0xf1, 0x75, 0xd3 }, 0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 0x63, 0xf1, 0x75, 0xd3 },
}, { }, {
.key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, .key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19 }, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19 },
.ksize = 25, .ksize = 25,
.plaintext = { [0 ... 49] = 0xcd }, .plaintext = { [0 ... 49] = 0xcd },
.psize = 50, .psize = 50,
.digest = { 0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 0xbc, 0x84, .digest = { 0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 0xbc, 0x84,
0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 0x2d, 0x72, 0x35, 0xda }, 0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 0x2d, 0x72, 0x35, 0xda },
}, { }, {
.key = { [0 ... 19] = 0x0c }, .key = { [0 ... 19] = 0x0c },
.ksize = 20, .ksize = 20,
.plaintext = "Test With Truncation", .plaintext = "Test With Truncation",
.psize = 20, .psize = 20,
.digest = { 0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2, .digest = { 0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2,
0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04 }, 0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04 },
}, { }, {
.key = { [0 ... 79] = 0xaa }, .key = { [0 ... 79] = 0xaa },
.ksize = 80, .ksize = 80,
.plaintext = "Test Using Larger Than Block-Size Key - Hash Key First", .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
.psize = 54, .psize = 54,
.digest = { 0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 0x95, 0x70, .digest = { 0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 0x95, 0x70,
0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 0xed, 0x40, 0x21, 0x12 }, 0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 0xed, 0x40, 0x21, 0x12 },
}, { }, {
.key = { [0 ... 79] = 0xaa }, .key = { [0 ... 79] = 0xaa },
...@@ -810,7 +816,7 @@ static struct hmac_testvec hmac_sha1_tv_template[] = { ...@@ -810,7 +816,7 @@ static struct hmac_testvec hmac_sha1_tv_template[] = {
.plaintext = "Test Using Larger Than Block-Size Key and Larger Than One " .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
"Block-Size Data", "Block-Size Data",
.psize = 73, .psize = 73,
.digest = { 0xe8, 0xe9, 0x9d, 0x0f, 0x45, 0x23, 0x7d, 0x78, 0x6d, 0x6b, .digest = { 0xe8, 0xe9, 0x9d, 0x0f, 0x45, 0x23, 0x7d, 0x78, 0x6d, 0x6b,
0xba, 0xa7, 0x96, 0x5c, 0x78, 0x08, 0xbb, 0xff, 0x1a, 0x91 }, 0xba, 0xa7, 0x96, 0x5c, 0x78, 0x08, 0xbb, 0xff, 0x1a, 0x91 },
}, },
}; };
...@@ -1011,7 +1017,7 @@ static struct cipher_testvec des_enc_tv_template[] = { ...@@ -1011,7 +1017,7 @@ static struct cipher_testvec des_enc_tv_template[] = {
0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b }, 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
.rlen = 32, .rlen = 32,
.np = 3, .np = 3,
.tap = { 14, 10, 8 } .tap = { 14, 10, 8 }
}, { }, {
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
.klen = 8, .klen = 8,
...@@ -1024,7 +1030,7 @@ static struct cipher_testvec des_enc_tv_template[] = { ...@@ -1024,7 +1030,7 @@ static struct cipher_testvec des_enc_tv_template[] = {
0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90 }, 0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90 },
.rlen = 24, .rlen = 24,
.np = 4, .np = 4,
.tap = { 2, 1, 3, 18 } .tap = { 2, 1, 3, 18 }
}, { }, {
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
.klen = 8, .klen = 8,
...@@ -1035,7 +1041,7 @@ static struct cipher_testvec des_enc_tv_template[] = { ...@@ -1035,7 +1041,7 @@ static struct cipher_testvec des_enc_tv_template[] = {
0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b }, 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
.rlen = 16, .rlen = 16,
.np = 5, .np = 5,
.tap = { 2, 2, 2, 2, 8 } .tap = { 2, 2, 2, 2, 8 }
}, { }, {
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
.klen = 8, .klen = 8,
...@@ -1044,7 +1050,7 @@ static struct cipher_testvec des_enc_tv_template[] = { ...@@ -1044,7 +1050,7 @@ static struct cipher_testvec des_enc_tv_template[] = {
.result = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d }, .result = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
.rlen = 8, .rlen = 8,
.np = 8, .np = 8,
.tap = { 1, 1, 1, 1, 1, 1, 1, 1 } .tap = { 1, 1, 1, 1, 1, 1, 1, 1 }
}, },
}; };
...@@ -1057,7 +1063,7 @@ static struct cipher_testvec des_dec_tv_template[] = { ...@@ -1057,7 +1063,7 @@ static struct cipher_testvec des_dec_tv_template[] = {
.result = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 }, .result = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
.rlen = 8, .rlen = 8,
}, { /* Sbox test from NBS */ }, { /* Sbox test from NBS */
.key = { 0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57 }, .key = { 0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57 },
.klen = 8, .klen = 8,
.input = { 0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b }, .input = { 0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
.ilen = 8, .ilen = 8,
...@@ -1092,19 +1098,19 @@ static struct cipher_testvec des_cbc_enc_tv_template[] = { ...@@ -1092,19 +1098,19 @@ static struct cipher_testvec des_cbc_enc_tv_template[] = {
{ /* From OpenSSL */ { /* From OpenSSL */
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
.klen = 8, .klen = 8,
.iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10}, .iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
.input = { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, .input = { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 }, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
.ilen = 24, .ilen = 24,
.result = { 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, .result = { 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb, 0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb,
0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68 }, 0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68 },
.rlen = 24, .rlen = 24,
}, { /* FIPS Pub 81 */ }, { /* FIPS Pub 81 */
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
.klen = 8, .klen = 8,
.iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef }, .iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },
.input = { 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 }, .input = { 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
.ilen = 8, .ilen = 8,
.result = { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c }, .result = { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
...@@ -1117,7 +1123,7 @@ static struct cipher_testvec des_cbc_enc_tv_template[] = { ...@@ -1117,7 +1123,7 @@ static struct cipher_testvec des_cbc_enc_tv_template[] = {
.ilen = 8, .ilen = 8,
.result = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f }, .result = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
.rlen = 8, .rlen = 8,
}, { }, {
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
.klen = 8, .klen = 8,
.iv = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f }, .iv = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
...@@ -1125,18 +1131,18 @@ static struct cipher_testvec des_cbc_enc_tv_template[] = { ...@@ -1125,18 +1131,18 @@ static struct cipher_testvec des_cbc_enc_tv_template[] = {
.ilen = 8, .ilen = 8,
.result = { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 }, .result = { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
.rlen = 8, .rlen = 8,
}, { /* Copy of openssl vector for chunk testing */ }, { /* Copy of openssl vector for chunk testing */
/* From OpenSSL */ /* From OpenSSL */
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
.klen = 8, .klen = 8,
.iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10}, .iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
.input = { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, .input = { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 }, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
.ilen = 24, .ilen = 24,
.result = { 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4, .result = { 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb, 0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb,
0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68 }, 0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68 },
.rlen = 24, .rlen = 24,
.np = 2, .np = 2,
.tap = { 13, 11 } .tap = { 13, 11 }
...@@ -1155,24 +1161,24 @@ static struct cipher_testvec des_cbc_dec_tv_template[] = { ...@@ -1155,24 +1161,24 @@ static struct cipher_testvec des_cbc_dec_tv_template[] = {
}, { }, {
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
.klen = 8, .klen = 8,
.iv = { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c }, .iv = { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
.input = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f }, .input = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
.ilen = 8, .ilen = 8,
.result = { 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 }, .result = { 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
.rlen = 8, .rlen = 8,
}, { }, {
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
.klen = 8, .klen = 8,
.iv = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f }, .iv = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
.input = { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 }, .input = { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
.ilen = 8, .ilen = 8,
.result = { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 }, .result = { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
.rlen = 8, .rlen = 8,
}, { /* Copy of above, for chunk testing */ }, { /* Copy of above, for chunk testing */
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
.klen = 8, .klen = 8,
.iv = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f }, .iv = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
.input = { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 }, .input = { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
.ilen = 8, .ilen = 8,
.result = { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 }, .result = { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
.rlen = 8, .rlen = 8,
...@@ -1276,7 +1282,7 @@ static struct cipher_testvec bf_enc_tv_template[] = { ...@@ -1276,7 +1282,7 @@ static struct cipher_testvec bf_enc_tv_template[] = {
.ilen = 8, .ilen = 8,
.result = { 0xe8, 0x7a, 0x24, 0x4e, 0x2c, 0xc8, 0x5e, 0x82 }, .result = { 0xe8, 0x7a, 0x24, 0x4e, 0x2c, 0xc8, 0x5e, 0x82 },
.rlen = 8, .rlen = 8,
}, { /* Vary the keylength... */ }, { /* Vary the keylength... */
.key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87, .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f }, 0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f },
.klen = 16, .klen = 16,
...@@ -1297,9 +1303,9 @@ static struct cipher_testvec bf_enc_tv_template[] = { ...@@ -1297,9 +1303,9 @@ static struct cipher_testvec bf_enc_tv_template[] = {
.key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87, .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f, 0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f, 0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f,
0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76, 0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76,
0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e, 0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
.klen = 56, .klen = 56,
.input = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, .input = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
...@@ -1331,7 +1337,7 @@ static struct cipher_testvec bf_dec_tv_template[] = { ...@@ -1331,7 +1337,7 @@ static struct cipher_testvec bf_dec_tv_template[] = {
.ilen = 8, .ilen = 8,
.result = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, .result = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
.rlen = 8, .rlen = 8,
}, { /* Vary the keylength... */ }, { /* Vary the keylength... */
.key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87, .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f }, 0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f },
.klen = 16, .klen = 16,
...@@ -1352,9 +1358,9 @@ static struct cipher_testvec bf_dec_tv_template[] = { ...@@ -1352,9 +1358,9 @@ static struct cipher_testvec bf_dec_tv_template[] = {
.key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87, .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f, 0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f, 0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f,
0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76, 0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76,
0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e, 0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
.klen = 56, .klen = 56,
.input = { 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 }, .input = { 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 },
...@@ -1369,7 +1375,7 @@ static struct cipher_testvec bf_cbc_enc_tv_template[] = { ...@@ -1369,7 +1375,7 @@ static struct cipher_testvec bf_cbc_enc_tv_template[] = {
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 }, 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
.klen = 16, .klen = 16,
.iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, .iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
.input = { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20, .input = { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20,
...@@ -1388,7 +1394,7 @@ static struct cipher_testvec bf_cbc_dec_tv_template[] = { ...@@ -1388,7 +1394,7 @@ static struct cipher_testvec bf_cbc_dec_tv_template[] = {
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 }, 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
.klen = 16, .klen = 16,
.iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, .iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
.input = { 0x6b, 0x77, 0xb4, 0xd6, 0x30, 0x06, 0xde, 0xe6, .input = { 0x6b, 0x77, 0xb4, 0xd6, 0x30, 0x06, 0xde, 0xe6,
0x05, 0xb1, 0x56, 0xe2, 0x74, 0x03, 0x97, 0x93, 0x05, 0xb1, 0x56, 0xe2, 0x74, 0x03, 0x97, 0x93,
0x58, 0xde, 0xb9, 0xe7, 0x15, 0x46, 0x16, 0xd9, 0x58, 0xde, 0xb9, 0xe7, 0x15, 0x46, 0x16, 0xd9,
...@@ -1490,7 +1496,7 @@ static struct cipher_testvec tf_cbc_enc_tv_template[] = { ...@@ -1490,7 +1496,7 @@ static struct cipher_testvec tf_cbc_enc_tv_template[] = {
.key = { [0 ... 15] = 0x00 }, .key = { [0 ... 15] = 0x00 },
.klen = 16, .klen = 16,
.iv = { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32, .iv = { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a }, 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
.input = { [0 ... 15] = 0x00 }, .input = { [0 ... 15] = 0x00 },
.ilen = 16, .ilen = 16,
.result = { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e, .result = { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
...@@ -1528,7 +1534,7 @@ static struct cipher_testvec tf_cbc_dec_tv_template[] = { ...@@ -1528,7 +1534,7 @@ static struct cipher_testvec tf_cbc_dec_tv_template[] = {
.klen = 16, .klen = 16,
.iv = { [0 ... 15] = 0x00 }, .iv = { [0 ... 15] = 0x00 },
.input = { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32, .input = { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a }, 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
.ilen = 16, .ilen = 16,
.result = { [0 ... 15] = 0x00 }, .result = { [0 ... 15] = 0x00 },
.rlen = 16, .rlen = 16,
...@@ -1578,8 +1584,7 @@ static struct cipher_testvec tf_cbc_dec_tv_template[] = { ...@@ -1578,8 +1584,7 @@ static struct cipher_testvec tf_cbc_dec_tv_template[] = {
#define TNEPRES_ENC_TEST_VECTORS 4 #define TNEPRES_ENC_TEST_VECTORS 4
#define TNEPRES_DEC_TEST_VECTORS 4 #define TNEPRES_DEC_TEST_VECTORS 4
static struct cipher_testvec serpent_enc_tv_template[] = static struct cipher_testvec serpent_enc_tv_template[] = {
{
{ {
.input = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, .input = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
...@@ -1620,8 +1625,7 @@ static struct cipher_testvec serpent_enc_tv_template[] = ...@@ -1620,8 +1625,7 @@ static struct cipher_testvec serpent_enc_tv_template[] =
}, },
}; };
static struct cipher_testvec tnepres_enc_tv_template[] = static struct cipher_testvec tnepres_enc_tv_template[] = {
{
{ /* KeySize=128, PT=0, I=1 */ { /* KeySize=128, PT=0, I=1 */
.input = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, .input = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
...@@ -1629,7 +1633,7 @@ static struct cipher_testvec tnepres_enc_tv_template[] = ...@@ -1629,7 +1633,7 @@ static struct cipher_testvec tnepres_enc_tv_template[] =
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
.klen = 16, .klen = 16,
.ilen = 16, .ilen = 16,
.result = { 0x49, 0xaf, 0xbf, 0xad, 0x9d, 0x5a, 0x34, 0x05, .result = { 0x49, 0xaf, 0xbf, 0xad, 0x9d, 0x5a, 0x34, 0x05,
0x2c, 0xd8, 0xff, 0xa5, 0x98, 0x6b, 0xd2, 0xdd }, 0x2c, 0xd8, 0xff, 0xa5, 0x98, 0x6b, 0xd2, 0xdd },
.rlen = 16, .rlen = 16,
}, { /* KeySize=192, PT=0, I=1 */ }, { /* KeySize=192, PT=0, I=1 */
...@@ -1640,7 +1644,7 @@ static struct cipher_testvec tnepres_enc_tv_template[] = ...@@ -1640,7 +1644,7 @@ static struct cipher_testvec tnepres_enc_tv_template[] =
.input = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, .input = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
.ilen = 16, .ilen = 16,
.result = { 0xe7, 0x8e, 0x54, 0x02, 0xc7, 0x19, 0x55, 0x68, .result = { 0xe7, 0x8e, 0x54, 0x02, 0xc7, 0x19, 0x55, 0x68,
0xac, 0x36, 0x78, 0xf7, 0xa3, 0xf6, 0x0c, 0x66 }, 0xac, 0x36, 0x78, 0xf7, 0xa3, 0xf6, 0x0c, 0x66 },
.rlen = 16, .rlen = 16,
}, { /* KeySize=256, PT=0, I=1 */ }, { /* KeySize=256, PT=0, I=1 */
...@@ -1652,7 +1656,7 @@ static struct cipher_testvec tnepres_enc_tv_template[] = ...@@ -1652,7 +1656,7 @@ static struct cipher_testvec tnepres_enc_tv_template[] =
.input = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, .input = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
.ilen = 16, .ilen = 16,
.result = { 0xab, 0xed, 0x96, 0xe7, 0x66, 0xbf, 0x28, 0xcb, .result = { 0xab, 0xed, 0x96, 0xe7, 0x66, 0xbf, 0x28, 0xcb,
0xc0, 0xeb, 0xd2, 0x1a, 0x82, 0xef, 0x08, 0x19 }, 0xc0, 0xeb, 0xd2, 0x1a, 0x82, 0xef, 0x08, 0x19 },
.rlen = 16, .rlen = 16,
}, { /* KeySize=256, I=257 */ }, { /* KeySize=256, I=257 */
...@@ -1664,15 +1668,14 @@ static struct cipher_testvec tnepres_enc_tv_template[] = ...@@ -1664,15 +1668,14 @@ static struct cipher_testvec tnepres_enc_tv_template[] =
.input = { 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, .input = { 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08,
0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 },
.ilen = 16, .ilen = 16,
.result = { 0x5c, 0xe7, 0x1c, 0x70, 0xd2, 0x88, 0x2e, 0x5b, .result = { 0x5c, 0xe7, 0x1c, 0x70, 0xd2, 0x88, 0x2e, 0x5b,
0xb8, 0x32, 0xe4, 0x33, 0xf8, 0x9f, 0x26, 0xde }, 0xb8, 0x32, 0xe4, 0x33, 0xf8, 0x9f, 0x26, 0xde },
.rlen = 16, .rlen = 16,
}, },
}; };
static struct cipher_testvec serpent_dec_tv_template[] = static struct cipher_testvec serpent_dec_tv_template[] = {
{
{ {
.input = { 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47, .input = { 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 }, 0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 },
...@@ -1713,8 +1716,7 @@ static struct cipher_testvec serpent_dec_tv_template[] = ...@@ -1713,8 +1716,7 @@ static struct cipher_testvec serpent_dec_tv_template[] =
}, },
}; };
static struct cipher_testvec tnepres_dec_tv_template[] = static struct cipher_testvec tnepres_dec_tv_template[] = {
{
{ {
.input = { 0x41, 0xcc, 0x6b, 0x31, 0x59, 0x31, 0x45, 0x97, .input = { 0x41, 0xcc, 0x6b, 0x31, 0x59, 0x31, 0x45, 0x97,
0x6d, 0x6f, 0xbb, 0x38, 0x4b, 0x37, 0x21, 0x28 }, 0x6d, 0x6f, 0xbb, 0x38, 0x4b, 0x37, 0x21, 0x28 },
...@@ -1726,7 +1728,7 @@ static struct cipher_testvec tnepres_dec_tv_template[] = ...@@ -1726,7 +1728,7 @@ static struct cipher_testvec tnepres_dec_tv_template[] =
.key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
.klen = 16, .klen = 16,
.input = { 0xea, 0xf4, 0xd7, 0xfc, 0xd8, 0x01, 0x34, 0x47, .input = { 0xea, 0xf4, 0xd7, 0xfc, 0xd8, 0x01, 0x34, 0x47,
0x81, 0x45, 0x0b, 0xfa, 0x0c, 0xd6, 0xad, 0x6e }, 0x81, 0x45, 0x0b, 0xfa, 0x0c, 0xd6, 0xad, 0x6e },
.ilen = 16, .ilen = 16,
.result = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, .result = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
...@@ -1738,7 +1740,7 @@ static struct cipher_testvec tnepres_dec_tv_template[] = ...@@ -1738,7 +1740,7 @@ static struct cipher_testvec tnepres_dec_tv_template[] =
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
.klen = 32, .klen = 32,
.input = { 0x64, 0xa9, 0x1a, 0x37, 0xed, 0x9f, 0xe7, 0x49, .input = { 0x64, 0xa9, 0x1a, 0x37, 0xed, 0x9f, 0xe7, 0x49,
0xa8, 0x4e, 0x76, 0xd6, 0xf5, 0x0d, 0x78, 0xee }, 0xa8, 0x4e, 0x76, 0xd6, 0xf5, 0x0d, 0x78, 0xee },
.ilen = 16, .ilen = 16,
.result = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, .result = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
...@@ -1747,7 +1749,7 @@ static struct cipher_testvec tnepres_dec_tv_template[] = ...@@ -1747,7 +1749,7 @@ static struct cipher_testvec tnepres_dec_tv_template[] =
}, { /* KeySize=128, I=121 */ }, { /* KeySize=128, I=121 */
.key = { [15] = 0x80 }, .key = { [15] = 0x80 },
.klen = 16, .klen = 16,
.input = { 0x3d, 0xda, 0xbf, 0xc0, 0x06, 0xda, 0xab, 0x06, .input = { 0x3d, 0xda, 0xbf, 0xc0, 0x06, 0xda, 0xab, 0x06,
0x46, 0x2a, 0xf4, 0xef, 0x81, 0x54, 0x4e, 0x26 }, 0x46, 0x2a, 0xf4, 0xef, 0x81, 0x54, 0x4e, 0x26 },
.ilen = 16, .ilen = 16,
.result = { [0 ... 15] = 0x00 }, .result = { [0 ... 15] = 0x00 },
...@@ -1760,58 +1762,56 @@ static struct cipher_testvec tnepres_dec_tv_template[] = ...@@ -1760,58 +1762,56 @@ static struct cipher_testvec tnepres_dec_tv_template[] =
#define CAST6_ENC_TEST_VECTORS 3 #define CAST6_ENC_TEST_VECTORS 3
#define CAST6_DEC_TEST_VECTORS 3 #define CAST6_DEC_TEST_VECTORS 3
static struct cipher_testvec cast6_enc_tv_template[] = static struct cipher_testvec cast6_enc_tv_template[] = {
{
{ {
.key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, .key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d }, 0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
.klen = 16, .klen = 16,
.input = { [0 ... 15] = 0x00 }, .input = { [0 ... 15] = 0x00 },
.ilen = 16, .ilen = 16,
.result = { 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20, .result = { 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20,
0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b }, 0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
.rlen = 16, .rlen = 16,
}, { }, {
.key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, .key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98, 0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 }, 0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
.klen = 24, .klen = 24,
.input = { [0 ... 15] = 0x00 }, .input = { [0 ... 15] = 0x00 },
.ilen = 16, .ilen = 16,
.result = { 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb, .result = { 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb,
0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 }, 0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
.rlen = 16, .rlen = 16,
}, { }, {
.key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, .key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98, 0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46, 0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 }, 0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },
.klen = 32, .klen = 32,
.input = { [0 ... 15] = 0x00 }, .input = { [0 ... 15] = 0x00 },
.ilen = 16, .ilen = 16,
.result = { 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9, .result = { 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9,
0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa }, 0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
.rlen = 16, .rlen = 16,
}, },
}; };
static struct cipher_testvec cast6_dec_tv_template[] = static struct cipher_testvec cast6_dec_tv_template[] = {
{
{ {
.key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, .key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d }, 0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
.klen = 16, .klen = 16,
.input = { 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20, .input = { 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20,
0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b }, 0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
.ilen = 16, .ilen = 16,
.result = { [0 ... 15] = 0x00 }, .result = { [0 ... 15] = 0x00 },
.rlen = 16, .rlen = 16,
}, { }, {
.key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, .key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98, 0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 }, 0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
.klen = 24, .klen = 24,
.input = { 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb, .input = { 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb,
0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 }, 0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
.ilen = 16, .ilen = 16,
.result = { [0 ... 15] = 0x00 }, .result = { [0 ... 15] = 0x00 },
...@@ -1820,9 +1820,9 @@ static struct cipher_testvec cast6_dec_tv_template[] = ...@@ -1820,9 +1820,9 @@ static struct cipher_testvec cast6_dec_tv_template[] =
.key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c, .key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98, 0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46, 0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 }, 0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },
.klen = 32, .klen = 32,
.input = { 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9, .input = { 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9,
0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa }, 0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
.ilen = 16, .ilen = 16,
.result = { [0 ... 15] = 0x00 }, .result = { [0 ... 15] = 0x00 },
...@@ -1837,9 +1837,9 @@ static struct cipher_testvec cast6_dec_tv_template[] = ...@@ -1837,9 +1837,9 @@ static struct cipher_testvec cast6_dec_tv_template[] =
#define AES_ENC_TEST_VECTORS 3 #define AES_ENC_TEST_VECTORS 3
#define AES_DEC_TEST_VECTORS 3 #define AES_DEC_TEST_VECTORS 3
static struct cipher_testvec aes_enc_tv_template[] = { static struct cipher_testvec aes_enc_tv_template[] = {
{ /* From FIPS-197 */ { /* From FIPS-197 */
.key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
.klen = 16, .klen = 16,
.input = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, .input = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
...@@ -1853,7 +1853,7 @@ static struct cipher_testvec aes_enc_tv_template[] = { ...@@ -1853,7 +1853,7 @@ static struct cipher_testvec aes_enc_tv_template[] = {
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 }, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
.klen = 24, .klen = 24,
.input = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, .input = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
.ilen = 16, .ilen = 16,
.result = { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0, .result = { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
...@@ -1865,7 +1865,7 @@ static struct cipher_testvec aes_enc_tv_template[] = { ...@@ -1865,7 +1865,7 @@ static struct cipher_testvec aes_enc_tv_template[] = {
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
.klen = 32, .klen = 32,
.input = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, .input = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
.ilen = 16, .ilen = 16,
.result = { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf, .result = { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
...@@ -1874,9 +1874,9 @@ static struct cipher_testvec aes_enc_tv_template[] = { ...@@ -1874,9 +1874,9 @@ static struct cipher_testvec aes_enc_tv_template[] = {
}, },
}; };
static struct cipher_testvec aes_dec_tv_template[] = { static struct cipher_testvec aes_dec_tv_template[] = {
{ /* From FIPS-197 */ { /* From FIPS-197 */
.key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
.klen = 16, .klen = 16,
.input = { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30, .input = { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
...@@ -1893,8 +1893,8 @@ static struct cipher_testvec aes_dec_tv_template[] = { ...@@ -1893,8 +1893,8 @@ static struct cipher_testvec aes_dec_tv_template[] = {
.input = { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0, .input = { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 }, 0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
.ilen = 16, .ilen = 16,
.result = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, .result = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
.rlen = 16, .rlen = 16,
}, { }, {
.key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
...@@ -1905,7 +1905,7 @@ static struct cipher_testvec aes_dec_tv_template[] = { ...@@ -1905,7 +1905,7 @@ static struct cipher_testvec aes_dec_tv_template[] = {
.input = { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf, .input = { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 }, 0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
.ilen = 16, .ilen = 16,
.result = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, .result = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
.rlen = 16, .rlen = 16,
}, },
...@@ -1915,8 +1915,7 @@ static struct cipher_testvec aes_dec_tv_template[] = { ...@@ -1915,8 +1915,7 @@ static struct cipher_testvec aes_dec_tv_template[] = {
#define CAST5_ENC_TEST_VECTORS 3 #define CAST5_ENC_TEST_VECTORS 3
#define CAST5_DEC_TEST_VECTORS 3 #define CAST5_DEC_TEST_VECTORS 3
static struct cipher_testvec cast5_enc_tv_template[] = static struct cipher_testvec cast5_enc_tv_template[] = {
{
{ {
.key = { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, .key = { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a }, 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a },
...@@ -1943,8 +1942,7 @@ static struct cipher_testvec cast5_enc_tv_template[] = ...@@ -1943,8 +1942,7 @@ static struct cipher_testvec cast5_enc_tv_template[] =
}, },
}; };
static struct cipher_testvec cast5_dec_tv_template[] = static struct cipher_testvec cast5_dec_tv_template[] = {
{
{ {
.key = { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, .key = { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a }, 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a },
...@@ -1971,14 +1969,13 @@ static struct cipher_testvec cast5_dec_tv_template[] = ...@@ -1971,14 +1969,13 @@ static struct cipher_testvec cast5_dec_tv_template[] =
}, },
}; };
/* /*
* ARC4 test vectors from OpenSSL * ARC4 test vectors from OpenSSL
*/ */
#define ARC4_ENC_TEST_VECTORS 7 #define ARC4_ENC_TEST_VECTORS 7
#define ARC4_DEC_TEST_VECTORS 7 #define ARC4_DEC_TEST_VECTORS 7
static struct cipher_testvec arc4_enc_tv_template[] = static struct cipher_testvec arc4_enc_tv_template[] = {
{
{ {
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
.klen = 8, .klen = 8,
...@@ -2044,8 +2041,7 @@ static struct cipher_testvec arc4_enc_tv_template[] = ...@@ -2044,8 +2041,7 @@ static struct cipher_testvec arc4_enc_tv_template[] =
}, },
}; };
static struct cipher_testvec arc4_dec_tv_template[] = static struct cipher_testvec arc4_dec_tv_template[] = {
{
{ {
.key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
.klen = 8, .klen = 8,
...@@ -2111,14 +2107,13 @@ static struct cipher_testvec arc4_dec_tv_template[] = ...@@ -2111,14 +2107,13 @@ static struct cipher_testvec arc4_dec_tv_template[] =
}, },
}; };
/* /*
* TEA test vectors * TEA test vectors
*/ */
#define TEA_ENC_TEST_VECTORS 4 #define TEA_ENC_TEST_VECTORS 4
#define TEA_DEC_TEST_VECTORS 4 #define TEA_DEC_TEST_VECTORS 4
static struct cipher_testvec tea_enc_tv_template[] = static struct cipher_testvec tea_enc_tv_template[] = {
{
{ {
.key = { [0 ... 15] = 0x00 }, .key = { [0 ... 15] = 0x00 },
.klen = 16, .klen = 16,
...@@ -2138,31 +2133,30 @@ static struct cipher_testvec tea_enc_tv_template[] = ...@@ -2138,31 +2133,30 @@ static struct cipher_testvec tea_enc_tv_template[] =
.key = { 0x09, 0x65, 0x43, 0x11, 0x66, 0x44, 0x39, 0x25, .key = { 0x09, 0x65, 0x43, 0x11, 0x66, 0x44, 0x39, 0x25,
0x51, 0x3a, 0x16, 0x10, 0x0a, 0x08, 0x12, 0x6e }, 0x51, 0x3a, 0x16, 0x10, 0x0a, 0x08, 0x12, 0x6e },
.klen = 16, .klen = 16,
.input = { 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x74, .input = { 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x74,
0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x63, 0x74 }, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x63, 0x74 },
.ilen = 16, .ilen = 16,
.result = { 0xbe, 0x7a, 0xbb, 0x81, 0x95, 0x2d, 0x1f, 0x1e, .result = { 0xbe, 0x7a, 0xbb, 0x81, 0x95, 0x2d, 0x1f, 0x1e,
0xdd, 0x89, 0xa1, 0x25, 0x04, 0x21, 0xdf, 0x95 }, 0xdd, 0x89, 0xa1, 0x25, 0x04, 0x21, 0xdf, 0x95 },
.rlen = 16, .rlen = 16,
}, { }, {
.key = { 0x4d, 0x76, 0x32, 0x17, 0x05, 0x3f, 0x75, 0x2c, .key = { 0x4d, 0x76, 0x32, 0x17, 0x05, 0x3f, 0x75, 0x2c,
0x5d, 0x04, 0x16, 0x36, 0x15, 0x72, 0x63, 0x2f }, 0x5d, 0x04, 0x16, 0x36, 0x15, 0x72, 0x63, 0x2f },
.klen = 16, .klen = 16,
.input = { 0x54, 0x65, 0x61, 0x20, 0x69, 0x73, 0x20, 0x67, .input = { 0x54, 0x65, 0x61, 0x20, 0x69, 0x73, 0x20, 0x67,
0x6f, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20,
0x79, 0x6f, 0x75, 0x21, 0x21, 0x21, 0x20, 0x72, 0x79, 0x6f, 0x75, 0x21, 0x21, 0x21, 0x20, 0x72,
0x65, 0x61, 0x6c, 0x6c, 0x79, 0x21, 0x21, 0x21 }, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x21, 0x21, 0x21 },
.ilen = 32, .ilen = 32,
.result = { 0xe0, 0x4d, 0x5d, 0x3c, 0xb7, 0x8c, 0x36, 0x47, .result = { 0xe0, 0x4d, 0x5d, 0x3c, 0xb7, 0x8c, 0x36, 0x47,
0x94, 0x18, 0x95, 0x91, 0xa9, 0xfc, 0x49, 0xf8, 0x94, 0x18, 0x95, 0x91, 0xa9, 0xfc, 0x49, 0xf8,
0x44, 0xd1, 0x2d, 0xc2, 0x99, 0xb8, 0x08, 0x2a, 0x44, 0xd1, 0x2d, 0xc2, 0x99, 0xb8, 0x08, 0x2a,
0x07, 0x89, 0x73, 0xc2, 0x45, 0x92, 0xc6, 0x90 }, 0x07, 0x89, 0x73, 0xc2, 0x45, 0x92, 0xc6, 0x90 },
.rlen = 32, .rlen = 32,
} }
}; };
static struct cipher_testvec tea_dec_tv_template[] = static struct cipher_testvec tea_dec_tv_template[] = {
{
{ {
.key = { [0 ... 15] = 0x00 }, .key = { [0 ... 15] = 0x00 },
.klen = 16, .klen = 16,
...@@ -2183,9 +2177,9 @@ static struct cipher_testvec tea_dec_tv_template[] = ...@@ -2183,9 +2177,9 @@ static struct cipher_testvec tea_dec_tv_template[] =
0x51, 0x3a, 0x16, 0x10, 0x0a, 0x08, 0x12, 0x6e }, 0x51, 0x3a, 0x16, 0x10, 0x0a, 0x08, 0x12, 0x6e },
.klen = 16, .klen = 16,
.input = { 0xbe, 0x7a, 0xbb, 0x81, 0x95, 0x2d, 0x1f, 0x1e, .input = { 0xbe, 0x7a, 0xbb, 0x81, 0x95, 0x2d, 0x1f, 0x1e,
0xdd, 0x89, 0xa1, 0x25, 0x04, 0x21, 0xdf, 0x95 }, 0xdd, 0x89, 0xa1, 0x25, 0x04, 0x21, 0xdf, 0x95 },
.ilen = 16, .ilen = 16,
.result = { 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x74, .result = { 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x74,
0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x63, 0x74 }, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x63, 0x74 },
.rlen = 16, .rlen = 16,
}, { }, {
...@@ -2193,26 +2187,25 @@ static struct cipher_testvec tea_dec_tv_template[] = ...@@ -2193,26 +2187,25 @@ static struct cipher_testvec tea_dec_tv_template[] =
0x5d, 0x04, 0x16, 0x36, 0x15, 0x72, 0x63, 0x2f }, 0x5d, 0x04, 0x16, 0x36, 0x15, 0x72, 0x63, 0x2f },
.klen = 16, .klen = 16,
.input = { 0xe0, 0x4d, 0x5d, 0x3c, 0xb7, 0x8c, 0x36, 0x47, .input = { 0xe0, 0x4d, 0x5d, 0x3c, 0xb7, 0x8c, 0x36, 0x47,
0x94, 0x18, 0x95, 0x91, 0xa9, 0xfc, 0x49, 0xf8, 0x94, 0x18, 0x95, 0x91, 0xa9, 0xfc, 0x49, 0xf8,
0x44, 0xd1, 0x2d, 0xc2, 0x99, 0xb8, 0x08, 0x2a, 0x44, 0xd1, 0x2d, 0xc2, 0x99, 0xb8, 0x08, 0x2a,
0x07, 0x89, 0x73, 0xc2, 0x45, 0x92, 0xc6, 0x90 }, 0x07, 0x89, 0x73, 0xc2, 0x45, 0x92, 0xc6, 0x90 },
.ilen = 32, .ilen = 32,
.result = { 0x54, 0x65, 0x61, 0x20, 0x69, 0x73, 0x20, 0x67, .result = { 0x54, 0x65, 0x61, 0x20, 0x69, 0x73, 0x20, 0x67,
0x6f, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20,
0x79, 0x6f, 0x75, 0x21, 0x21, 0x21, 0x20, 0x72, 0x79, 0x6f, 0x75, 0x21, 0x21, 0x21, 0x20, 0x72,
0x65, 0x61, 0x6c, 0x6c, 0x79, 0x21, 0x21, 0x21 }, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x21, 0x21, 0x21 },
.rlen = 32, .rlen = 32,
} }
}; };
/* /*
* XTEA test vectors * XTEA test vectors
*/ */
#define XTEA_ENC_TEST_VECTORS 4 #define XTEA_ENC_TEST_VECTORS 4
#define XTEA_DEC_TEST_VECTORS 4 #define XTEA_DEC_TEST_VECTORS 4
static struct cipher_testvec xtea_enc_tv_template[] = static struct cipher_testvec xtea_enc_tv_template[] = {
{
{ {
.key = { [0 ... 15] = 0x00 }, .key = { [0 ... 15] = 0x00 },
.klen = 16, .klen = 16,
...@@ -2232,31 +2225,30 @@ static struct cipher_testvec xtea_enc_tv_template[] = ...@@ -2232,31 +2225,30 @@ static struct cipher_testvec xtea_enc_tv_template[] =
.key = { 0x09, 0x65, 0x43, 0x11, 0x66, 0x44, 0x39, 0x25, .key = { 0x09, 0x65, 0x43, 0x11, 0x66, 0x44, 0x39, 0x25,
0x51, 0x3a, 0x16, 0x10, 0x0a, 0x08, 0x12, 0x6e }, 0x51, 0x3a, 0x16, 0x10, 0x0a, 0x08, 0x12, 0x6e },
.klen = 16, .klen = 16,
.input = { 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x74, .input = { 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x74,
0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x63, 0x74 }, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x63, 0x74 },
.ilen = 16, .ilen = 16,
.result = { 0xe2, 0x04, 0xdb, 0xf2, 0x89, 0x85, 0x9e, 0xea, .result = { 0xe2, 0x04, 0xdb, 0xf2, 0x89, 0x85, 0x9e, 0xea,
0x61, 0x35, 0xaa, 0xed, 0xb5, 0xcb, 0x71, 0x2c }, 0x61, 0x35, 0xaa, 0xed, 0xb5, 0xcb, 0x71, 0x2c },
.rlen = 16, .rlen = 16,
}, { }, {
.key = { 0x4d, 0x76, 0x32, 0x17, 0x05, 0x3f, 0x75, 0x2c, .key = { 0x4d, 0x76, 0x32, 0x17, 0x05, 0x3f, 0x75, 0x2c,
0x5d, 0x04, 0x16, 0x36, 0x15, 0x72, 0x63, 0x2f }, 0x5d, 0x04, 0x16, 0x36, 0x15, 0x72, 0x63, 0x2f },
.klen = 16, .klen = 16,
.input = { 0x54, 0x65, 0x61, 0x20, 0x69, 0x73, 0x20, 0x67, .input = { 0x54, 0x65, 0x61, 0x20, 0x69, 0x73, 0x20, 0x67,
0x6f, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20,
0x79, 0x6f, 0x75, 0x21, 0x21, 0x21, 0x20, 0x72, 0x79, 0x6f, 0x75, 0x21, 0x21, 0x21, 0x20, 0x72,
0x65, 0x61, 0x6c, 0x6c, 0x79, 0x21, 0x21, 0x21 }, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x21, 0x21, 0x21 },
.ilen = 32, .ilen = 32,
.result = { 0x0b, 0x03, 0xcd, 0x8a, 0xbe, 0x95, 0xfd, 0xb1, .result = { 0x0b, 0x03, 0xcd, 0x8a, 0xbe, 0x95, 0xfd, 0xb1,
0xc1, 0x44, 0x91, 0x0b, 0xa5, 0xc9, 0x1b, 0xb4, 0xc1, 0x44, 0x91, 0x0b, 0xa5, 0xc9, 0x1b, 0xb4,
0xa9, 0xda, 0x1e, 0x9e, 0xb1, 0x3e, 0x2a, 0x8f, 0xa9, 0xda, 0x1e, 0x9e, 0xb1, 0x3e, 0x2a, 0x8f,
0xea, 0xa5, 0x6a, 0x85, 0xd1, 0xf4, 0xa8, 0xa5 }, 0xea, 0xa5, 0x6a, 0x85, 0xd1, 0xf4, 0xa8, 0xa5 },
.rlen = 32, .rlen = 32,
} }
}; };
static struct cipher_testvec xtea_dec_tv_template[] = static struct cipher_testvec xtea_dec_tv_template[] = {
{
{ {
.key = { [0 ... 15] = 0x00 }, .key = { [0 ... 15] = 0x00 },
.klen = 16, .klen = 16,
...@@ -2276,24 +2268,24 @@ static struct cipher_testvec xtea_dec_tv_template[] = ...@@ -2276,24 +2268,24 @@ static struct cipher_testvec xtea_dec_tv_template[] =
.key = { 0x09, 0x65, 0x43, 0x11, 0x66, 0x44, 0x39, 0x25, .key = { 0x09, 0x65, 0x43, 0x11, 0x66, 0x44, 0x39, 0x25,
0x51, 0x3a, 0x16, 0x10, 0x0a, 0x08, 0x12, 0x6e }, 0x51, 0x3a, 0x16, 0x10, 0x0a, 0x08, 0x12, 0x6e },
.klen = 16, .klen = 16,
.input = { 0xe2, 0x04, 0xdb, 0xf2, 0x89, 0x85, 0x9e, 0xea, .input = { 0xe2, 0x04, 0xdb, 0xf2, 0x89, 0x85, 0x9e, 0xea,
0x61, 0x35, 0xaa, 0xed, 0xb5, 0xcb, 0x71, 0x2c }, 0x61, 0x35, 0xaa, 0xed, 0xb5, 0xcb, 0x71, 0x2c },
.ilen = 16, .ilen = 16,
.result = { 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x74, .result = { 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x74,
0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x63, 0x74 }, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x63, 0x74 },
.rlen = 16, .rlen = 16,
}, { }, {
.key = { 0x4d, 0x76, 0x32, 0x17, 0x05, 0x3f, 0x75, 0x2c, .key = { 0x4d, 0x76, 0x32, 0x17, 0x05, 0x3f, 0x75, 0x2c,
0x5d, 0x04, 0x16, 0x36, 0x15, 0x72, 0x63, 0x2f }, 0x5d, 0x04, 0x16, 0x36, 0x15, 0x72, 0x63, 0x2f },
.klen = 16, .klen = 16,
.input = { 0x0b, 0x03, 0xcd, 0x8a, 0xbe, 0x95, 0xfd, 0xb1, .input = { 0x0b, 0x03, 0xcd, 0x8a, 0xbe, 0x95, 0xfd, 0xb1,
0xc1, 0x44, 0x91, 0x0b, 0xa5, 0xc9, 0x1b, 0xb4, 0xc1, 0x44, 0x91, 0x0b, 0xa5, 0xc9, 0x1b, 0xb4,
0xa9, 0xda, 0x1e, 0x9e, 0xb1, 0x3e, 0x2a, 0x8f, 0xa9, 0xda, 0x1e, 0x9e, 0xb1, 0x3e, 0x2a, 0x8f,
0xea, 0xa5, 0x6a, 0x85, 0xd1, 0xf4, 0xa8, 0xa5 }, 0xea, 0xa5, 0x6a, 0x85, 0xd1, 0xf4, 0xa8, 0xa5 },
.ilen = 32, .ilen = 32,
.result = { 0x54, 0x65, 0x61, 0x20, 0x69, 0x73, 0x20, 0x67, .result = { 0x54, 0x65, 0x61, 0x20, 0x69, 0x73, 0x20, 0x67,
0x6f, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20,
0x79, 0x6f, 0x75, 0x21, 0x21, 0x21, 0x20, 0x72, 0x79, 0x6f, 0x75, 0x21, 0x21, 0x21, 0x20, 0x72,
0x65, 0x61, 0x6c, 0x6c, 0x79, 0x21, 0x21, 0x21 }, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x21, 0x21, 0x21 },
.rlen = 32, .rlen = 32,
} }
...@@ -2305,9 +2297,9 @@ static struct cipher_testvec xtea_dec_tv_template[] = ...@@ -2305,9 +2297,9 @@ static struct cipher_testvec xtea_dec_tv_template[] =
#define KHAZAD_ENC_TEST_VECTORS 5 #define KHAZAD_ENC_TEST_VECTORS 5
#define KHAZAD_DEC_TEST_VECTORS 5 #define KHAZAD_DEC_TEST_VECTORS 5
static struct cipher_testvec khazad_enc_tv_template[] = { static struct cipher_testvec khazad_enc_tv_template[] = {
{ {
.key = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, .key = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
.klen = 16, .klen = 16,
.input = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, .input = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
...@@ -2351,9 +2343,9 @@ static struct cipher_testvec khazad_enc_tv_template[] = { ...@@ -2351,9 +2343,9 @@ static struct cipher_testvec khazad_enc_tv_template[] = {
}, },
}; };
static struct cipher_testvec khazad_dec_tv_template[] = { static struct cipher_testvec khazad_dec_tv_template[] = {
{ {
.key = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, .key = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
.klen = 16, .klen = 16,
.input = { 0X49, 0Xa4, 0Xce, 0X32, 0Xac, 0X19, 0X0e, 0X3f }, .input = { 0X49, 0Xa4, 0Xce, 0X32, 0Xac, 0X19, 0X0e, 0X3f },
...@@ -2697,8 +2689,7 @@ static struct comp_testvec deflate_decomp_tv_template[] = { ...@@ -2697,8 +2689,7 @@ static struct comp_testvec deflate_decomp_tv_template[] = {
*/ */
#define MICHAEL_MIC_TEST_VECTORS 6 #define MICHAEL_MIC_TEST_VECTORS 6
static struct hash_testvec michael_mic_tv_template[] = static struct hash_testvec michael_mic_tv_template[] = {
{
{ {
.key = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, .key = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
.ksize = 8, .ksize = 8,
...@@ -2743,4 +2734,88 @@ static struct hash_testvec michael_mic_tv_template[] = ...@@ -2743,4 +2734,88 @@ static struct hash_testvec michael_mic_tv_template[] =
} }
}; };
/*
* Cipher speed tests
*/
static struct cipher_speed aes_speed_template[] = {
{ .klen = 16, .blen = 16, },
{ .klen = 16, .blen = 64, },
{ .klen = 16, .blen = 256, },
{ .klen = 16, .blen = 1024, },
{ .klen = 16, .blen = 8192, },
{ .klen = 24, .blen = 16, },
{ .klen = 24, .blen = 64, },
{ .klen = 24, .blen = 256, },
{ .klen = 24, .blen = 1024, },
{ .klen = 24, .blen = 8192, },
{ .klen = 32, .blen = 16, },
{ .klen = 32, .blen = 64, },
{ .klen = 32, .blen = 256, },
{ .klen = 32, .blen = 1024, },
{ .klen = 32, .blen = 8192, },
/* End marker */
{ .klen = 0, .blen = 0, }
};
static struct cipher_speed des3_ede_speed_template[] = {
{ .klen = 24, .blen = 16, },
{ .klen = 24, .blen = 64, },
{ .klen = 24, .blen = 256, },
{ .klen = 24, .blen = 1024, },
{ .klen = 24, .blen = 8192, },
/* End marker */
{ .klen = 0, .blen = 0, }
};
static struct cipher_speed twofish_speed_template[] = {
{ .klen = 16, .blen = 16, },
{ .klen = 16, .blen = 64, },
{ .klen = 16, .blen = 256, },
{ .klen = 16, .blen = 1024, },
{ .klen = 16, .blen = 8192, },
{ .klen = 24, .blen = 16, },
{ .klen = 24, .blen = 64, },
{ .klen = 24, .blen = 256, },
{ .klen = 24, .blen = 1024, },
{ .klen = 24, .blen = 8192, },
{ .klen = 32, .blen = 16, },
{ .klen = 32, .blen = 64, },
{ .klen = 32, .blen = 256, },
{ .klen = 32, .blen = 1024, },
{ .klen = 32, .blen = 8192, },
/* End marker */
{ .klen = 0, .blen = 0, }
};
static struct cipher_speed blowfish_speed_template[] = {
/* Don't support blowfish keys > 256 bit in this test */
{ .klen = 8, .blen = 16, },
{ .klen = 8, .blen = 64, },
{ .klen = 8, .blen = 256, },
{ .klen = 8, .blen = 1024, },
{ .klen = 8, .blen = 8192, },
{ .klen = 32, .blen = 16, },
{ .klen = 32, .blen = 64, },
{ .klen = 32, .blen = 256, },
{ .klen = 32, .blen = 1024, },
{ .klen = 32, .blen = 8192, },
/* End marker */
{ .klen = 0, .blen = 0, }
};
static struct cipher_speed des_speed_template[] = {
{ .klen = 8, .blen = 16, },
{ .klen = 8, .blen = 64, },
{ .klen = 8, .blen = 256, },
{ .klen = 8, .blen = 1024, },
{ .klen = 8, .blen = 8192, },
/* End marker */
{ .klen = 0, .blen = 0, }
};
#endif /* _CRYPTO_TCRYPT_H */ #endif /* _CRYPTO_TCRYPT_H */
...@@ -1109,8 +1109,7 @@ struct net_device * __init ltpc_probe(void) ...@@ -1109,8 +1109,7 @@ struct net_device * __init ltpc_probe(void)
inb_p(io+1); inb_p(io+1);
inb_p(io+3); inb_p(io+3);
set_current_state(TASK_UNINTERRUPTIBLE); msleep(20);
schedule_timeout(2*HZ/100);
inb_p(io+0); inb_p(io+0);
inb_p(io+2); inb_p(io+2);
...@@ -1120,8 +1119,7 @@ struct net_device * __init ltpc_probe(void) ...@@ -1120,8 +1119,7 @@ struct net_device * __init ltpc_probe(void)
inb_p(io+5); /* enable dma */ inb_p(io+5); /* enable dma */
inb_p(io+6); /* tri-state interrupt line */ inb_p(io+6); /* tri-state interrupt line */
set_current_state(TASK_UNINTERRUPTIBLE); ssleep(1);
schedule_timeout(HZ);
/* now, figure out which dma channel we're using, unless it's /* now, figure out which dma channel we're using, unless it's
already been specified */ already been specified */
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
struct divert_blk; struct divert_blk;
struct vlan_group; struct vlan_group;
struct ethtool_ops; struct ethtool_ops;
struct netpoll; struct netpoll_info;
/* source back-compat hooks */ /* source back-compat hooks */
#define SET_ETHTOOL_OPS(netdev,ops) \ #define SET_ETHTOOL_OPS(netdev,ops) \
( (netdev)->ethtool_ops = (ops) ) ( (netdev)->ethtool_ops = (ops) )
...@@ -468,7 +468,7 @@ struct net_device ...@@ -468,7 +468,7 @@ struct net_device
unsigned char *haddr); unsigned char *haddr);
int (*neigh_setup)(struct net_device *dev, struct neigh_parms *); int (*neigh_setup)(struct net_device *dev, struct neigh_parms *);
#ifdef CONFIG_NETPOLL #ifdef CONFIG_NETPOLL
struct netpoll *np; struct netpoll_info *npinfo;
#endif #endif
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
void (*poll_controller)(struct net_device *dev); void (*poll_controller)(struct net_device *dev);
......
...@@ -18,7 +18,6 @@ struct clusterip_config; ...@@ -18,7 +18,6 @@ struct clusterip_config;
struct ipt_clusterip_tgt_info { struct ipt_clusterip_tgt_info {
u_int32_t flags; u_int32_t flags;
struct clusterip_config *config;
/* only relevant for new ones */ /* only relevant for new ones */
u_int8_t clustermac[6]; u_int8_t clustermac[6];
...@@ -27,6 +26,8 @@ struct ipt_clusterip_tgt_info { ...@@ -27,6 +26,8 @@ struct ipt_clusterip_tgt_info {
u_int16_t local_nodes[CLUSTERIP_MAX_NODES]; u_int16_t local_nodes[CLUSTERIP_MAX_NODES];
enum clusterip_hashmode hash_mode; enum clusterip_hashmode hash_mode;
u_int32_t hash_initval; u_int32_t hash_initval;
struct clusterip_config *config;
}; };
#endif /*_IPT_CLUSTERIP_H_target*/ #endif /*_IPT_CLUSTERIP_H_target*/
...@@ -16,14 +16,19 @@ struct netpoll; ...@@ -16,14 +16,19 @@ struct netpoll;
struct netpoll { struct netpoll {
struct net_device *dev; struct net_device *dev;
char dev_name[16], *name; char dev_name[16], *name;
int rx_flags;
void (*rx_hook)(struct netpoll *, int, char *, int); void (*rx_hook)(struct netpoll *, int, char *, int);
void (*drop)(struct sk_buff *skb); void (*drop)(struct sk_buff *skb);
u32 local_ip, remote_ip; u32 local_ip, remote_ip;
u16 local_port, remote_port; u16 local_port, remote_port;
unsigned char local_mac[6], remote_mac[6]; unsigned char local_mac[6], remote_mac[6];
};
struct netpoll_info {
spinlock_t poll_lock; spinlock_t poll_lock;
int poll_owner; int poll_owner;
int rx_flags;
spinlock_t rx_lock;
struct netpoll *rx_np; /* netpoll that registered an rx_hook */
}; };
void netpoll_poll(struct netpoll *np); void netpoll_poll(struct netpoll *np);
...@@ -39,22 +44,35 @@ void netpoll_queue(struct sk_buff *skb); ...@@ -39,22 +44,35 @@ void netpoll_queue(struct sk_buff *skb);
#ifdef CONFIG_NETPOLL #ifdef CONFIG_NETPOLL
static inline int netpoll_rx(struct sk_buff *skb) static inline int netpoll_rx(struct sk_buff *skb)
{ {
return skb->dev->np && skb->dev->np->rx_flags && __netpoll_rx(skb); struct netpoll_info *npinfo = skb->dev->npinfo;
unsigned long flags;
int ret = 0;
if (!npinfo || (!npinfo->rx_np && !npinfo->rx_flags))
return 0;
spin_lock_irqsave(&npinfo->rx_lock, flags);
/* check rx_flags again with the lock held */
if (npinfo->rx_flags && __netpoll_rx(skb))
ret = 1;
spin_unlock_irqrestore(&npinfo->rx_lock, flags);
return ret;
} }
static inline void netpoll_poll_lock(struct net_device *dev) static inline void netpoll_poll_lock(struct net_device *dev)
{ {
if (dev->np) { if (dev->npinfo) {
spin_lock(&dev->np->poll_lock); spin_lock(&dev->npinfo->poll_lock);
dev->np->poll_owner = smp_processor_id(); dev->npinfo->poll_owner = smp_processor_id();
} }
} }
static inline void netpoll_poll_unlock(struct net_device *dev) static inline void netpoll_poll_unlock(struct net_device *dev)
{ {
if (dev->np) { if (dev->npinfo) {
spin_unlock(&dev->np->poll_lock); dev->npinfo->poll_owner = -1;
dev->np->poll_owner = -1; spin_unlock(&dev->npinfo->poll_lock);
} }
} }
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
* History * History
* mar/20/00 Daniela Squassoni Disabling/enabling of facilities * mar/20/00 Daniela Squassoni Disabling/enabling of facilities
* negotiation. * negotiation.
* apr/02/05 Shaun Pereira Selective sub address matching with
* call user data
*/ */
#ifndef X25_KERNEL_H #ifndef X25_KERNEL_H
...@@ -16,6 +18,9 @@ ...@@ -16,6 +18,9 @@
#define SIOCX25GCALLUSERDATA (SIOCPROTOPRIVATE + 4) #define SIOCX25GCALLUSERDATA (SIOCPROTOPRIVATE + 4)
#define SIOCX25SCALLUSERDATA (SIOCPROTOPRIVATE + 5) #define SIOCX25SCALLUSERDATA (SIOCPROTOPRIVATE + 5)
#define SIOCX25GCAUSEDIAG (SIOCPROTOPRIVATE + 6) #define SIOCX25GCAUSEDIAG (SIOCPROTOPRIVATE + 6)
#define SIOCX25SCUDMATCHLEN (SIOCPROTOPRIVATE + 7)
#define SIOCX25CALLACCPTAPPRV (SIOCPROTOPRIVATE + 8)
#define SIOCX25SENDCALLACCPT (SIOCPROTOPRIVATE + 9)
/* /*
* Values for {get,set}sockopt. * Values for {get,set}sockopt.
...@@ -109,4 +114,11 @@ struct x25_causediag { ...@@ -109,4 +114,11 @@ struct x25_causediag {
unsigned char diagnostic; unsigned char diagnostic;
}; };
/*
* Further optional call user data match length selection
*/
struct x25_subaddr {
unsigned int cudmatchlength;
};
#endif #endif
...@@ -79,6 +79,8 @@ enum { ...@@ -79,6 +79,8 @@ enum {
#define X25_DEFAULT_PACKET_SIZE X25_PS128 /* Default Packet Size */ #define X25_DEFAULT_PACKET_SIZE X25_PS128 /* Default Packet Size */
#define X25_DEFAULT_THROUGHPUT 0x0A /* Deafult Throughput */ #define X25_DEFAULT_THROUGHPUT 0x0A /* Deafult Throughput */
#define X25_DEFAULT_REVERSE 0x00 /* Default Reverse Charging */ #define X25_DEFAULT_REVERSE 0x00 /* Default Reverse Charging */
#define X25_DENY_ACCPT_APPRV 0x01 /* Default value */
#define X25_ALLOW_ACCPT_APPRV 0x00 /* Control enabled */
#define X25_SMODULUS 8 #define X25_SMODULUS 8
#define X25_EMODULUS 128 #define X25_EMODULUS 128
...@@ -94,7 +96,7 @@ enum { ...@@ -94,7 +96,7 @@ enum {
#define X25_FAC_CLASS_C 0x80 #define X25_FAC_CLASS_C 0x80
#define X25_FAC_CLASS_D 0xC0 #define X25_FAC_CLASS_D 0xC0
#define X25_FAC_REVERSE 0x01 #define X25_FAC_REVERSE 0x01 /* also fast select */
#define X25_FAC_THROUGHPUT 0x02 #define X25_FAC_THROUGHPUT 0x02
#define X25_FAC_PACKET_SIZE 0x42 #define X25_FAC_PACKET_SIZE 0x42
#define X25_FAC_WINDOW_SIZE 0x43 #define X25_FAC_WINDOW_SIZE 0x43
...@@ -134,8 +136,8 @@ struct x25_sock { ...@@ -134,8 +136,8 @@ struct x25_sock {
struct sock sk; struct sock sk;
struct x25_address source_addr, dest_addr; struct x25_address source_addr, dest_addr;
struct x25_neigh *neighbour; struct x25_neigh *neighbour;
unsigned int lci; unsigned int lci, cudmatchlength;
unsigned char state, condition, qbitincl, intflag; unsigned char state, condition, qbitincl, intflag, accptapprv;
unsigned short vs, vr, va, vl; unsigned short vs, vr, va, vl;
unsigned long t2, t21, t22, t23; unsigned long t2, t21, t22, t23;
unsigned short fraglen; unsigned short fraglen;
...@@ -242,7 +244,6 @@ extern int x25_validate_nr(struct sock *, unsigned short); ...@@ -242,7 +244,6 @@ extern int x25_validate_nr(struct sock *, unsigned short);
extern void x25_write_internal(struct sock *, int); extern void x25_write_internal(struct sock *, int);
extern int x25_decode(struct sock *, struct sk_buff *, int *, int *, int *, int *, int *); extern int x25_decode(struct sock *, struct sk_buff *, int *, int *, int *, int *, int *);
extern void x25_disconnect(struct sock *, int, unsigned char, unsigned char); extern void x25_disconnect(struct sock *, int, unsigned char, unsigned char);
extern int x25_check_calluserdata(struct x25_calluserdata *,struct x25_calluserdata *);
/* x25_timer.c */ /* x25_timer.c */
extern void x25_start_heartbeat(struct sock *); extern void x25_start_heartbeat(struct sock *);
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <net/datalink.h> #include <net/datalink.h>
#include <net/psnap.h> #include <net/psnap.h>
#include <linux/atalk.h> #include <linux/atalk.h>
#include <linux/delay.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
...@@ -462,8 +463,7 @@ void aarp_probe_network(struct atalk_iface *atif) ...@@ -462,8 +463,7 @@ void aarp_probe_network(struct atalk_iface *atif)
aarp_send_probe(atif->dev, &atif->address); aarp_send_probe(atif->dev, &atif->address);
/* Defer 1/10th */ /* Defer 1/10th */
current->state = TASK_INTERRUPTIBLE; msleep(100);
schedule_timeout(HZ / 10);
if (atif->status & ATIF_PROBE_FAIL) if (atif->status & ATIF_PROBE_FAIL)
break; break;
...@@ -510,9 +510,8 @@ int aarp_proxy_probe_network(struct atalk_iface *atif, struct atalk_addr *sa) ...@@ -510,9 +510,8 @@ int aarp_proxy_probe_network(struct atalk_iface *atif, struct atalk_addr *sa)
aarp_send_probe(atif->dev, sa); aarp_send_probe(atif->dev, sa);
/* Defer 1/10th */ /* Defer 1/10th */
current->state = TASK_INTERRUPTIBLE;
write_unlock_bh(&aarp_lock); write_unlock_bh(&aarp_lock);
schedule_timeout(HZ / 10); msleep(100);
write_lock_bh(&aarp_lock); write_lock_bh(&aarp_lock);
if (entry->status & ATIF_PROBE_FAIL) if (entry->status & ATIF_PROBE_FAIL)
......
...@@ -859,8 +859,7 @@ static int translate_table(struct ebt_replace *repl, ...@@ -859,8 +859,7 @@ static int translate_table(struct ebt_replace *repl,
if (repl->valid_hooks & (1 << i)) if (repl->valid_hooks & (1 << i))
if (check_chainloops(newinfo->hook_entry[i], if (check_chainloops(newinfo->hook_entry[i],
cl_s, udc_cnt, i, newinfo->entries)) { cl_s, udc_cnt, i, newinfo->entries)) {
if (cl_s) vfree(cl_s);
vfree(cl_s);
return -EINVAL; return -EINVAL;
} }
...@@ -883,8 +882,7 @@ static int translate_table(struct ebt_replace *repl, ...@@ -883,8 +882,7 @@ static int translate_table(struct ebt_replace *repl,
EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size, EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
ebt_cleanup_entry, &i); ebt_cleanup_entry, &i);
} }
if (cl_s) vfree(cl_s);
vfree(cl_s);
return ret; return ret;
} }
...@@ -1030,8 +1028,7 @@ static int do_replace(void __user *user, unsigned int len) ...@@ -1030,8 +1028,7 @@ static int do_replace(void __user *user, unsigned int len)
} }
vfree(table); vfree(table);
if (counterstmp) vfree(counterstmp);
vfree(counterstmp);
return ret; return ret;
free_unlock: free_unlock:
...@@ -1040,8 +1037,7 @@ static int do_replace(void __user *user, unsigned int len) ...@@ -1040,8 +1037,7 @@ static int do_replace(void __user *user, unsigned int len)
EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size, EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
ebt_cleanup_entry, NULL); ebt_cleanup_entry, NULL);
free_counterstmp: free_counterstmp:
if (counterstmp) vfree(counterstmp);
vfree(counterstmp);
/* can be initialized in translate_table() */ /* can be initialized in translate_table() */
if (newinfo->chainstack) { if (newinfo->chainstack) {
for (i = 0; i < num_possible_cpus(); i++) for (i = 0; i < num_possible_cpus(); i++)
...@@ -1049,11 +1045,9 @@ static int do_replace(void __user *user, unsigned int len) ...@@ -1049,11 +1045,9 @@ static int do_replace(void __user *user, unsigned int len)
vfree(newinfo->chainstack); vfree(newinfo->chainstack);
} }
free_entries: free_entries:
if (newinfo->entries) vfree(newinfo->entries);
vfree(newinfo->entries);
free_newinfo: free_newinfo:
if (newinfo) vfree(newinfo);
vfree(newinfo);
return ret; return ret;
} }
...@@ -1213,8 +1207,7 @@ void ebt_unregister_table(struct ebt_table *table) ...@@ -1213,8 +1207,7 @@ void ebt_unregister_table(struct ebt_table *table)
down(&ebt_mutex); down(&ebt_mutex);
LIST_DELETE(&ebt_tables, table); LIST_DELETE(&ebt_tables, table);
up(&ebt_mutex); up(&ebt_mutex);
if (table->private->entries) vfree(table->private->entries);
vfree(table->private->entries);
if (table->private->chainstack) { if (table->private->chainstack) {
for (i = 0; i < num_possible_cpus(); i++) for (i = 0; i < num_possible_cpus(); i++)
vfree(table->private->chainstack[i]); vfree(table->private->chainstack[i]);
......
...@@ -130,19 +130,20 @@ static int checksum_udp(struct sk_buff *skb, struct udphdr *uh, ...@@ -130,19 +130,20 @@ static int checksum_udp(struct sk_buff *skb, struct udphdr *uh,
*/ */
static void poll_napi(struct netpoll *np) static void poll_napi(struct netpoll *np)
{ {
struct netpoll_info *npinfo = np->dev->npinfo;
int budget = 16; int budget = 16;
if (test_bit(__LINK_STATE_RX_SCHED, &np->dev->state) && if (test_bit(__LINK_STATE_RX_SCHED, &np->dev->state) &&
np->poll_owner != smp_processor_id() && npinfo->poll_owner != smp_processor_id() &&
spin_trylock(&np->poll_lock)) { spin_trylock(&npinfo->poll_lock)) {
np->rx_flags |= NETPOLL_RX_DROP; npinfo->rx_flags |= NETPOLL_RX_DROP;
atomic_inc(&trapped); atomic_inc(&trapped);
np->dev->poll(np->dev, &budget); np->dev->poll(np->dev, &budget);
atomic_dec(&trapped); atomic_dec(&trapped);
np->rx_flags &= ~NETPOLL_RX_DROP; npinfo->rx_flags &= ~NETPOLL_RX_DROP;
spin_unlock(&np->poll_lock); spin_unlock(&npinfo->poll_lock);
} }
} }
...@@ -245,6 +246,7 @@ static struct sk_buff * find_skb(struct netpoll *np, int len, int reserve) ...@@ -245,6 +246,7 @@ static struct sk_buff * find_skb(struct netpoll *np, int len, int reserve)
static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb) static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
{ {
int status; int status;
struct netpoll_info *npinfo;
repeat: repeat:
if(!np || !np->dev || !netif_running(np->dev)) { if(!np || !np->dev || !netif_running(np->dev)) {
...@@ -253,8 +255,9 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb) ...@@ -253,8 +255,9 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
} }
/* avoid recursion */ /* avoid recursion */
if(np->poll_owner == smp_processor_id() || npinfo = np->dev->npinfo;
np->dev->xmit_lock_owner == smp_processor_id()) { if (npinfo->poll_owner == smp_processor_id() ||
np->dev->xmit_lock_owner == smp_processor_id()) {
if (np->drop) if (np->drop)
np->drop(skb); np->drop(skb);
else else
...@@ -341,14 +344,22 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len) ...@@ -341,14 +344,22 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
static void arp_reply(struct sk_buff *skb) static void arp_reply(struct sk_buff *skb)
{ {
struct netpoll_info *npinfo = skb->dev->npinfo;
struct arphdr *arp; struct arphdr *arp;
unsigned char *arp_ptr; unsigned char *arp_ptr;
int size, type = ARPOP_REPLY, ptype = ETH_P_ARP; int size, type = ARPOP_REPLY, ptype = ETH_P_ARP;
u32 sip, tip; u32 sip, tip;
unsigned long flags;
struct sk_buff *send_skb; struct sk_buff *send_skb;
struct netpoll *np = skb->dev->np; struct netpoll *np = NULL;
spin_lock_irqsave(&npinfo->rx_lock, flags);
if (npinfo->rx_np && npinfo->rx_np->dev == skb->dev)
np = npinfo->rx_np;
spin_unlock_irqrestore(&npinfo->rx_lock, flags);
if (!np) return; if (!np)
return;
/* No arp on this interface */ /* No arp on this interface */
if (skb->dev->flags & IFF_NOARP) if (skb->dev->flags & IFF_NOARP)
...@@ -429,9 +440,9 @@ int __netpoll_rx(struct sk_buff *skb) ...@@ -429,9 +440,9 @@ int __netpoll_rx(struct sk_buff *skb)
int proto, len, ulen; int proto, len, ulen;
struct iphdr *iph; struct iphdr *iph;
struct udphdr *uh; struct udphdr *uh;
struct netpoll *np = skb->dev->np; struct netpoll *np = skb->dev->npinfo->rx_np;
if (!np->rx_hook) if (!np)
goto out; goto out;
if (skb->dev->type != ARPHRD_ETHER) if (skb->dev->type != ARPHRD_ETHER)
goto out; goto out;
...@@ -611,9 +622,8 @@ int netpoll_setup(struct netpoll *np) ...@@ -611,9 +622,8 @@ int netpoll_setup(struct netpoll *np)
{ {
struct net_device *ndev = NULL; struct net_device *ndev = NULL;
struct in_device *in_dev; struct in_device *in_dev;
struct netpoll_info *npinfo;
np->poll_lock = SPIN_LOCK_UNLOCKED; unsigned long flags;
np->poll_owner = -1;
if (np->dev_name) if (np->dev_name)
ndev = dev_get_by_name(np->dev_name); ndev = dev_get_by_name(np->dev_name);
...@@ -624,7 +634,17 @@ int netpoll_setup(struct netpoll *np) ...@@ -624,7 +634,17 @@ int netpoll_setup(struct netpoll *np)
} }
np->dev = ndev; np->dev = ndev;
ndev->np = np; if (!ndev->npinfo) {
npinfo = kmalloc(sizeof(*npinfo), GFP_KERNEL);
if (!npinfo)
goto release;
npinfo->rx_np = NULL;
npinfo->poll_lock = SPIN_LOCK_UNLOCKED;
npinfo->poll_owner = -1;
npinfo->rx_lock = SPIN_LOCK_UNLOCKED;
} else
npinfo = ndev->npinfo;
if (!ndev->poll_controller) { if (!ndev->poll_controller) {
printk(KERN_ERR "%s: %s doesn't support polling, aborting.\n", printk(KERN_ERR "%s: %s doesn't support polling, aborting.\n",
...@@ -692,13 +712,20 @@ int netpoll_setup(struct netpoll *np) ...@@ -692,13 +712,20 @@ int netpoll_setup(struct netpoll *np)
np->name, HIPQUAD(np->local_ip)); np->name, HIPQUAD(np->local_ip));
} }
if(np->rx_hook) if (np->rx_hook) {
np->rx_flags = NETPOLL_RX_ENABLED; spin_lock_irqsave(&npinfo->rx_lock, flags);
npinfo->rx_flags |= NETPOLL_RX_ENABLED;
npinfo->rx_np = np;
spin_unlock_irqrestore(&npinfo->rx_lock, flags);
}
/* last thing to do is link it to the net device structure */
ndev->npinfo = npinfo;
return 0; return 0;
release: release:
ndev->np = NULL; if (!ndev->npinfo)
kfree(npinfo);
np->dev = NULL; np->dev = NULL;
dev_put(ndev); dev_put(ndev);
return -1; return -1;
...@@ -706,9 +733,20 @@ int netpoll_setup(struct netpoll *np) ...@@ -706,9 +733,20 @@ int netpoll_setup(struct netpoll *np)
void netpoll_cleanup(struct netpoll *np) void netpoll_cleanup(struct netpoll *np)
{ {
if (np->dev) struct netpoll_info *npinfo;
np->dev->np = NULL; unsigned long flags;
dev_put(np->dev);
if (np->dev) {
npinfo = np->dev->npinfo;
if (npinfo && npinfo->rx_np == np) {
spin_lock_irqsave(&npinfo->rx_lock, flags);
npinfo->rx_np = NULL;
npinfo->rx_flags &= ~NETPOLL_RX_ENABLED;
spin_unlock_irqrestore(&npinfo->rx_lock, flags);
}
dev_put(np->dev);
}
np->dev = NULL; np->dev = NULL;
} }
......
...@@ -339,7 +339,7 @@ target(struct sk_buff **pskb, ...@@ -339,7 +339,7 @@ target(struct sk_buff **pskb,
* error messages (RELATED) and information requests (see below) */ * error messages (RELATED) and information requests (see below) */
if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP
&& (ctinfo == IP_CT_RELATED && (ctinfo == IP_CT_RELATED
|| ctinfo == IP_CT_IS_REPLY+IP_CT_IS_REPLY)) || ctinfo == IP_CT_RELATED+IP_CT_IS_REPLY))
return IPT_CONTINUE; return IPT_CONTINUE;
/* ip_conntrack_icmp guarantees us that we only have ICMP_ECHO, /* ip_conntrack_icmp guarantees us that we only have ICMP_ECHO,
......
...@@ -1767,7 +1767,7 @@ static inline int ip_mkroute_input_def(struct sk_buff *skb, ...@@ -1767,7 +1767,7 @@ static inline int ip_mkroute_input_def(struct sk_buff *skb,
struct in_device *in_dev, struct in_device *in_dev,
u32 daddr, u32 saddr, u32 tos) u32 daddr, u32 saddr, u32 tos)
{ {
struct rtable* rth; struct rtable* rth = NULL;
int err; int err;
unsigned hash; unsigned hash;
...@@ -1794,7 +1794,7 @@ static inline int ip_mkroute_input(struct sk_buff *skb, ...@@ -1794,7 +1794,7 @@ static inline int ip_mkroute_input(struct sk_buff *skb,
u32 daddr, u32 saddr, u32 tos) u32 daddr, u32 saddr, u32 tos)
{ {
#ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED #ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED
struct rtable* rth; struct rtable* rth = NULL;
unsigned char hop, hopcount, lasthop; unsigned char hop, hopcount, lasthop;
int err = -EINVAL; int err = -EINVAL;
unsigned int hash; unsigned int hash;
...@@ -2239,7 +2239,7 @@ static inline int ip_mkroute_output_def(struct rtable **rp, ...@@ -2239,7 +2239,7 @@ static inline int ip_mkroute_output_def(struct rtable **rp,
struct net_device *dev_out, struct net_device *dev_out,
unsigned flags) unsigned flags)
{ {
struct rtable *rth; struct rtable *rth = NULL;
int err = __mkroute_output(&rth, res, fl, oldflp, dev_out, flags); int err = __mkroute_output(&rth, res, fl, oldflp, dev_out, flags);
unsigned hash; unsigned hash;
if (err == 0) { if (err == 0) {
...@@ -2267,7 +2267,7 @@ static inline int ip_mkroute_output(struct rtable** rp, ...@@ -2267,7 +2267,7 @@ static inline int ip_mkroute_output(struct rtable** rp,
unsigned char hop; unsigned char hop;
unsigned hash; unsigned hash;
int err = -EINVAL; int err = -EINVAL;
struct rtable *rth; struct rtable *rth = NULL;
if (res->fi && res->fi->fib_nhs > 1) { if (res->fi && res->fi->fib_nhs > 1) {
unsigned char hopcount = res->fi->fib_nhs; unsigned char hopcount = res->fi->fib_nhs;
......
...@@ -383,9 +383,8 @@ int sock_map_fd(struct socket *sock) ...@@ -383,9 +383,8 @@ int sock_map_fd(struct socket *sock)
goto out; goto out;
} }
sprintf(name, "[%lu]", SOCK_INODE(sock)->i_ino); this.len = sprintf(name, "[%lu]", SOCK_INODE(sock)->i_ino);
this.name = name; this.name = name;
this.len = strlen(name);
this.hash = SOCK_INODE(sock)->i_ino; this.hash = SOCK_INODE(sock)->i_ino;
file->f_dentry = d_alloc(sock_mnt->mnt_sb->s_root, &this); file->f_dentry = d_alloc(sock_mnt->mnt_sb->s_root, &this);
......
...@@ -29,6 +29,10 @@ ...@@ -29,6 +29,10 @@
* 2000-11-14 Henner Eisen Closing datalink from NETDEV_GOING_DOWN * 2000-11-14 Henner Eisen Closing datalink from NETDEV_GOING_DOWN
* 2002-10-06 Arnaldo C. Melo Get rid of cli/sti, move proc stuff to * 2002-10-06 Arnaldo C. Melo Get rid of cli/sti, move proc stuff to
* x25_proc.c, using seq_file * x25_proc.c, using seq_file
* 2005-04-02 Shaun Pereira Selective sub address matching
* with call user data
* 2005-04-15 Shaun Pereira Fast select with no restriction on
* response
*/ */
#include <linux/config.h> #include <linux/config.h>
...@@ -219,7 +223,8 @@ static void x25_insert_socket(struct sock *sk) ...@@ -219,7 +223,8 @@ static void x25_insert_socket(struct sock *sk)
* Note: if a listening socket has cud set it must only get calls * Note: if a listening socket has cud set it must only get calls
* with matching cud. * with matching cud.
*/ */
static struct sock *x25_find_listener(struct x25_address *addr, struct x25_calluserdata *calluserdata) static struct sock *x25_find_listener(struct x25_address *addr,
struct sk_buff *skb)
{ {
struct sock *s; struct sock *s;
struct sock *next_best; struct sock *next_best;
...@@ -230,22 +235,23 @@ static struct sock *x25_find_listener(struct x25_address *addr, struct x25_callu ...@@ -230,22 +235,23 @@ static struct sock *x25_find_listener(struct x25_address *addr, struct x25_callu
sk_for_each(s, node, &x25_list) sk_for_each(s, node, &x25_list)
if ((!strcmp(addr->x25_addr, if ((!strcmp(addr->x25_addr,
x25_sk(s)->source_addr.x25_addr) || x25_sk(s)->source_addr.x25_addr) ||
!strcmp(addr->x25_addr, !strcmp(addr->x25_addr,
null_x25_address.x25_addr)) && null_x25_address.x25_addr)) &&
s->sk_state == TCP_LISTEN) { s->sk_state == TCP_LISTEN) {
/* /*
* Found a listening socket, now check the incoming * Found a listening socket, now check the incoming
* call user data vs this sockets call user data * call user data vs this sockets call user data
*/ */
if (x25_check_calluserdata(&x25_sk(s)->calluserdata, calluserdata)) { if(skb->len > 0 && x25_sk(s)->cudmatchlength > 0) {
sock_hold(s); if((memcmp(x25_sk(s)->calluserdata.cuddata,
goto found; skb->data,
} x25_sk(s)->cudmatchlength)) == 0) {
if (x25_sk(s)->calluserdata.cudlength == 0) { sock_hold(s);
goto found;
}
} else
next_best = s; next_best = s;
}
} }
if (next_best) { if (next_best) {
s = next_best; s = next_best;
...@@ -497,6 +503,9 @@ static int x25_create(struct socket *sock, int protocol) ...@@ -497,6 +503,9 @@ static int x25_create(struct socket *sock, int protocol)
x25->t23 = sysctl_x25_clear_request_timeout; x25->t23 = sysctl_x25_clear_request_timeout;
x25->t2 = sysctl_x25_ack_holdback_timeout; x25->t2 = sysctl_x25_ack_holdback_timeout;
x25->state = X25_STATE_0; x25->state = X25_STATE_0;
x25->cudmatchlength = 0;
x25->accptapprv = X25_DENY_ACCPT_APPRV; /* normally no cud */
/* on call accept */
x25->facilities.winsize_in = X25_DEFAULT_WINDOW_SIZE; x25->facilities.winsize_in = X25_DEFAULT_WINDOW_SIZE;
x25->facilities.winsize_out = X25_DEFAULT_WINDOW_SIZE; x25->facilities.winsize_out = X25_DEFAULT_WINDOW_SIZE;
...@@ -545,6 +554,8 @@ static struct sock *x25_make_new(struct sock *osk) ...@@ -545,6 +554,8 @@ static struct sock *x25_make_new(struct sock *osk)
x25->t2 = ox25->t2; x25->t2 = ox25->t2;
x25->facilities = ox25->facilities; x25->facilities = ox25->facilities;
x25->qbitincl = ox25->qbitincl; x25->qbitincl = ox25->qbitincl;
x25->cudmatchlength = ox25->cudmatchlength;
x25->accptapprv = ox25->accptapprv;
x25_init_timers(sk); x25_init_timers(sk);
out: out:
...@@ -822,7 +833,6 @@ int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb, ...@@ -822,7 +833,6 @@ int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
struct x25_sock *makex25; struct x25_sock *makex25;
struct x25_address source_addr, dest_addr; struct x25_address source_addr, dest_addr;
struct x25_facilities facilities; struct x25_facilities facilities;
struct x25_calluserdata calluserdata;
int len, rc; int len, rc;
/* /*
...@@ -844,20 +854,11 @@ int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb, ...@@ -844,20 +854,11 @@ int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
len = skb->data[0] + 1; len = skb->data[0] + 1;
skb_pull(skb,len); skb_pull(skb,len);
/*
* Incoming Call User Data.
*/
if (skb->len >= 0) {
memcpy(calluserdata.cuddata, skb->data, skb->len);
calluserdata.cudlength = skb->len;
}
skb_push(skb,len);
/* /*
* Find a listener for the particular address/cud pair. * Find a listener for the particular address/cud pair.
*/ */
sk = x25_find_listener(&source_addr,&calluserdata); sk = x25_find_listener(&source_addr,skb);
skb_push(skb,len);
/* /*
* We can't accept the Call Request. * We can't accept the Call Request.
...@@ -900,11 +901,23 @@ int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb, ...@@ -900,11 +901,23 @@ int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
makex25->neighbour = nb; makex25->neighbour = nb;
makex25->facilities = facilities; makex25->facilities = facilities;
makex25->vc_facil_mask = x25_sk(sk)->vc_facil_mask; makex25->vc_facil_mask = x25_sk(sk)->vc_facil_mask;
makex25->calluserdata = calluserdata; /* ensure no reverse facil on accept */
makex25->vc_facil_mask &= ~X25_MASK_REVERSE;
x25_write_internal(make, X25_CALL_ACCEPTED); makex25->cudmatchlength = x25_sk(sk)->cudmatchlength;
/* Normally all calls are accepted immediatly */
if(makex25->accptapprv & X25_DENY_ACCPT_APPRV) {
x25_write_internal(make, X25_CALL_ACCEPTED);
makex25->state = X25_STATE_3;
}
makex25->state = X25_STATE_3; /*
* Incoming Call User Data.
*/
if (skb->len >= 0) {
memcpy(makex25->calluserdata.cuddata, skb->data, skb->len);
makex25->calluserdata.cudlength = skb->len;
}
sk->sk_ack_backlog++; sk->sk_ack_backlog++;
...@@ -1288,7 +1301,8 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) ...@@ -1288,7 +1301,8 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
if (facilities.throughput < 0x03 || if (facilities.throughput < 0x03 ||
facilities.throughput > 0xDD) facilities.throughput > 0xDD)
break; break;
if (facilities.reverse && facilities.reverse != 1) if (facilities.reverse &&
(facilities.reverse | 0x81)!= 0x81)
break; break;
x25->facilities = facilities; x25->facilities = facilities;
rc = 0; rc = 0;
...@@ -1325,6 +1339,44 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) ...@@ -1325,6 +1339,44 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
break; break;
} }
case SIOCX25SCUDMATCHLEN: {
struct x25_subaddr sub_addr;
rc = -EINVAL;
if(sk->sk_state != TCP_CLOSE)
break;
rc = -EFAULT;
if (copy_from_user(&sub_addr, argp,
sizeof(sub_addr)))
break;
rc = -EINVAL;
if(sub_addr.cudmatchlength > X25_MAX_CUD_LEN)
break;
x25->cudmatchlength = sub_addr.cudmatchlength;
rc = 0;
break;
}
case SIOCX25CALLACCPTAPPRV: {
rc = -EINVAL;
if (sk->sk_state != TCP_CLOSE)
break;
x25->accptapprv = X25_ALLOW_ACCPT_APPRV;
rc = 0;
break;
}
case SIOCX25SENDCALLACCPT: {
rc = -EINVAL;
if (sk->sk_state != TCP_ESTABLISHED)
break;
if (x25->accptapprv) /* must call accptapprv above */
break;
x25_write_internal(sk, X25_CALL_ACCEPTED);
x25->state = X25_STATE_3;
rc = 0;
break;
}
default: default:
rc = dev_ioctl(cmd, argp); rc = dev_ioctl(cmd, argp);
break; break;
......
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
* X.25 001 Split from x25_subr.c * X.25 001 Split from x25_subr.c
* mar/20/00 Daniela Squassoni Disabling/enabling of facilities * mar/20/00 Daniela Squassoni Disabling/enabling of facilities
* negotiation. * negotiation.
* apr/14/05 Shaun Pereira - Allow fast select with no restriction
* on response.
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -43,9 +45,31 @@ int x25_parse_facilities(struct sk_buff *skb, ...@@ -43,9 +45,31 @@ int x25_parse_facilities(struct sk_buff *skb,
case X25_FAC_CLASS_A: case X25_FAC_CLASS_A:
switch (*p) { switch (*p) {
case X25_FAC_REVERSE: case X25_FAC_REVERSE:
facilities->reverse = p[1] & 0x01; if((p[1] & 0x81) == 0x81) {
*vc_fac_mask |= X25_MASK_REVERSE; facilities->reverse = p[1] & 0x81;
break; *vc_fac_mask |= X25_MASK_REVERSE;
break;
}
if((p[1] & 0x01) == 0x01) {
facilities->reverse = p[1] & 0x01;
*vc_fac_mask |= X25_MASK_REVERSE;
break;
}
if((p[1] & 0x80) == 0x80) {
facilities->reverse = p[1] & 0x80;
*vc_fac_mask |= X25_MASK_REVERSE;
break;
}
if(p[1] == 0x00) {
facilities->reverse
= X25_DEFAULT_REVERSE;
*vc_fac_mask |= X25_MASK_REVERSE;
break;
}
case X25_FAC_THROUGHPUT: case X25_FAC_THROUGHPUT:
facilities->throughput = p[1]; facilities->throughput = p[1];
*vc_fac_mask |= X25_MASK_THROUGHPUT; *vc_fac_mask |= X25_MASK_THROUGHPUT;
...@@ -122,7 +146,7 @@ int x25_create_facilities(unsigned char *buffer, ...@@ -122,7 +146,7 @@ int x25_create_facilities(unsigned char *buffer,
if (facilities->reverse && (facil_mask & X25_MASK_REVERSE)) { if (facilities->reverse && (facil_mask & X25_MASK_REVERSE)) {
*p++ = X25_FAC_REVERSE; *p++ = X25_FAC_REVERSE;
*p++ = !!facilities->reverse; *p++ = facilities->reverse;
} }
if (facilities->throughput && (facil_mask & X25_MASK_THROUGHPUT)) { if (facilities->throughput && (facil_mask & X25_MASK_THROUGHPUT)) {
...@@ -171,7 +195,7 @@ int x25_negotiate_facilities(struct sk_buff *skb, struct sock *sk, ...@@ -171,7 +195,7 @@ int x25_negotiate_facilities(struct sk_buff *skb, struct sock *sk,
/* /*
* They want reverse charging, we won't accept it. * They want reverse charging, we won't accept it.
*/ */
if (theirs.reverse && ours->reverse) { if ((theirs.reverse & 0x01 ) && (ours->reverse & 0x01)) {
SOCK_DEBUG(sk, "X.25: rejecting reverse charging request"); SOCK_DEBUG(sk, "X.25: rejecting reverse charging request");
return -1; return -1;
} }
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
* mar/20/00 Daniela Squassoni Disabling/enabling of facilities * mar/20/00 Daniela Squassoni Disabling/enabling of facilities
* negotiation. * negotiation.
* jun/24/01 Arnaldo C. Melo use skb_queue_purge, cleanups * jun/24/01 Arnaldo C. Melo use skb_queue_purge, cleanups
* apr/04/15 Shaun Pereira Fast select with no
* restriction on response.
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -127,8 +129,12 @@ void x25_write_internal(struct sock *sk, int frametype) ...@@ -127,8 +129,12 @@ void x25_write_internal(struct sock *sk, int frametype)
len += 1 + X25_ADDR_LEN + X25_MAX_FAC_LEN + len += 1 + X25_ADDR_LEN + X25_MAX_FAC_LEN +
X25_MAX_CUD_LEN; X25_MAX_CUD_LEN;
break; break;
case X25_CALL_ACCEPTED: case X25_CALL_ACCEPTED: /* fast sel with no restr on resp */
len += 1 + X25_MAX_FAC_LEN + X25_MAX_CUD_LEN; if(x25->facilities.reverse & 0x80) {
len += 1 + X25_MAX_FAC_LEN + X25_MAX_CUD_LEN;
} else {
len += 1 + X25_MAX_FAC_LEN;
}
break; break;
case X25_CLEAR_REQUEST: case X25_CLEAR_REQUEST:
case X25_RESET_REQUEST: case X25_RESET_REQUEST:
...@@ -203,9 +209,16 @@ void x25_write_internal(struct sock *sk, int frametype) ...@@ -203,9 +209,16 @@ void x25_write_internal(struct sock *sk, int frametype)
x25->vc_facil_mask); x25->vc_facil_mask);
dptr = skb_put(skb, len); dptr = skb_put(skb, len);
memcpy(dptr, facilities, len); memcpy(dptr, facilities, len);
dptr = skb_put(skb, x25->calluserdata.cudlength);
memcpy(dptr, x25->calluserdata.cuddata, /* fast select with no restriction on response
x25->calluserdata.cudlength); allows call user data. Userland must
ensure it is ours and not theirs */
if(x25->facilities.reverse & 0x80) {
dptr = skb_put(skb,
x25->calluserdata.cudlength);
memcpy(dptr, x25->calluserdata.cuddata,
x25->calluserdata.cudlength);
}
x25->calluserdata.cudlength = 0; x25->calluserdata.cudlength = 0;
break; break;
...@@ -354,21 +367,3 @@ void x25_check_rbuf(struct sock *sk) ...@@ -354,21 +367,3 @@ void x25_check_rbuf(struct sock *sk)
} }
} }
/*
* Compare 2 calluserdata structures, used to find correct listening sockets
* when call user data is used.
*/
int x25_check_calluserdata(struct x25_calluserdata *ours, struct x25_calluserdata *theirs)
{
int i;
if (ours->cudlength != theirs->cudlength)
return 0;
for (i=0;i<ours->cudlength;i++) {
if (ours->cuddata[i] != theirs->cuddata[i]) {
return 0;
}
}
return 1;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment