2005-06-23 04:26:03 +08:00
|
|
|
/*
|
2005-04-17 06:20:36 +08:00
|
|
|
* Quick & dirty crypto testing module.
|
|
|
|
*
|
|
|
|
* This will only exist until we have a better testing mechanism
|
|
|
|
* (e.g. a char device).
|
|
|
|
*
|
|
|
|
* Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
|
|
|
|
* Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
|
2007-11-26 22:12:07 +08:00
|
|
|
* Copyright (c) 2007 Nokia Siemens Networks
|
2005-04-17 06:20:36 +08:00
|
|
|
*
|
|
|
|
* 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
|
2005-06-23 04:26:03 +08:00
|
|
|
* Software Foundation; either version 2 of the License, or (at your option)
|
2005-04-17 06:20:36 +08:00
|
|
|
* any later version.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2008-07-10 16:01:22 +08:00
|
|
|
#include <crypto/hash.h>
|
2006-08-13 06:26:09 +08:00
|
|
|
#include <linux/err.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/mm.h>
|
|
|
|
#include <linux/slab.h>
|
2005-09-17 15:55:31 +08:00
|
|
|
#include <linux/scatterlist.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
#include <linux/string.h>
|
|
|
|
#include <linux/crypto.h>
|
|
|
|
#include <linux/moduleparam.h>
|
2005-06-23 04:27:23 +08:00
|
|
|
#include <linux/jiffies.h>
|
2005-06-23 04:29:03 +08:00
|
|
|
#include <linux/timex.h>
|
|
|
|
#include <linux/interrupt.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
#include "tcrypt.h"
|
|
|
|
|
|
|
|
/*
|
2008-07-31 12:23:53 +08:00
|
|
|
* Need slab memory for testing (size in number of pages).
|
2005-04-17 06:20:36 +08:00
|
|
|
*/
|
2008-07-31 12:23:53 +08:00
|
|
|
#define TVMEMSIZE 4
|
|
|
|
#define XBUFSIZE 8
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Indexes into the xbuf to simulate cross-page access.
|
|
|
|
*/
|
2008-05-08 19:27:47 +08:00
|
|
|
#define IDX1 32
|
2005-04-17 06:20:36 +08:00
|
|
|
#define IDX2 32400
|
|
|
|
#define IDX3 1
|
|
|
|
#define IDX4 8193
|
|
|
|
#define IDX5 22222
|
|
|
|
#define IDX6 17101
|
|
|
|
#define IDX7 27333
|
|
|
|
#define IDX8 3000
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Used by test_cipher()
|
|
|
|
*/
|
|
|
|
#define ENCRYPT 1
|
|
|
|
#define DECRYPT 0
|
|
|
|
|
2007-04-04 15:41:07 +08:00
|
|
|
struct tcrypt_result {
|
|
|
|
struct completion completion;
|
|
|
|
int err;
|
|
|
|
};
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
|
|
|
|
|
2005-06-23 04:27:23 +08:00
|
|
|
/*
|
|
|
|
* Used by test_cipher_speed()
|
|
|
|
*/
|
2005-06-23 04:29:03 +08:00
|
|
|
static unsigned int sec;
|
2005-06-23 04:27:23 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
static int mode;
|
2008-07-31 12:23:53 +08:00
|
|
|
static char *xbuf[XBUFSIZE];
|
|
|
|
static char *axbuf[XBUFSIZE];
|
|
|
|
static char *tvmem[TVMEMSIZE];
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
static char *check[] = {
|
2007-11-10 20:08:25 +08:00
|
|
|
"des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
|
|
|
|
"blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
|
|
|
|
"cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
|
2006-12-16 09:13:14 +08:00
|
|
|
"khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
|
2008-05-09 21:29:35 +08:00
|
|
|
"camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
|
|
|
|
"lzo", "cts", NULL
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2005-06-23 04:26:03 +08:00
|
|
|
static void hexdump(unsigned char *buf, unsigned int len)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2007-11-30 13:59:30 +08:00
|
|
|
print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
|
|
|
|
16, 1,
|
|
|
|
buf, len, false);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2007-04-04 15:41:07 +08:00
|
|
|
static void tcrypt_complete(struct crypto_async_request *req, int err)
|
|
|
|
{
|
|
|
|
struct tcrypt_result *res = req->data;
|
|
|
|
|
|
|
|
if (err == -EINPROGRESS)
|
|
|
|
return;
|
|
|
|
|
|
|
|
res->err = err;
|
|
|
|
complete(&res->completion);
|
|
|
|
}
|
|
|
|
|
2008-07-31 14:03:44 +08:00
|
|
|
static int test_hash(char *algo, struct hash_testvec *template,
|
|
|
|
unsigned int tcount)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2005-06-23 04:26:03 +08:00
|
|
|
unsigned int i, j, k, temp;
|
|
|
|
struct scatterlist sg[8];
|
|
|
|
char result[64];
|
2008-05-14 21:24:51 +08:00
|
|
|
struct crypto_ahash *tfm;
|
|
|
|
struct ahash_request *req;
|
|
|
|
struct tcrypt_result tresult;
|
2006-08-19 19:38:49 +08:00
|
|
|
int ret;
|
2008-03-13 20:20:28 +08:00
|
|
|
void *hash_buff;
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2008-05-14 21:24:51 +08:00
|
|
|
init_completion(&tresult.completion);
|
|
|
|
|
|
|
|
tfm = crypto_alloc_ahash(algo, 0, 0);
|
2006-08-19 19:38:49 +08:00
|
|
|
if (IS_ERR(tfm)) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
|
|
|
|
"%ld\n", algo, PTR_ERR(tfm));
|
|
|
|
return PTR_ERR(tfm);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2008-05-14 21:24:51 +08:00
|
|
|
req = ahash_request_alloc(tfm, GFP_KERNEL);
|
|
|
|
if (!req) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: hash: Failed to allocate request for "
|
|
|
|
"%s\n", algo);
|
|
|
|
ret = -ENOMEM;
|
2008-05-14 21:24:51 +08:00
|
|
|
goto out_noreq;
|
|
|
|
}
|
|
|
|
ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
|
|
|
tcrypt_complete, &tresult);
|
2006-08-19 19:38:49 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
for (i = 0; i < tcount; i++) {
|
2005-06-23 04:26:03 +08:00
|
|
|
memset(result, 0, 64);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
hash_buff = xbuf[0];
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
memcpy(hash_buff, template[i].plaintext, template[i].psize);
|
|
|
|
sg_init_one(&sg[0], hash_buff, template[i].psize);
|
|
|
|
|
|
|
|
if (template[i].ksize) {
|
2008-05-14 21:24:51 +08:00
|
|
|
crypto_ahash_clear_flags(tfm, ~0);
|
|
|
|
ret = crypto_ahash_setkey(tfm, template[i].key,
|
|
|
|
template[i].ksize);
|
2006-08-19 19:38:49 +08:00
|
|
|
if (ret) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: hash: setkey failed on "
|
|
|
|
"test %d for %s: ret=%d\n", i + 1, algo,
|
|
|
|
-ret);
|
2006-08-19 19:38:49 +08:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-05-14 21:24:51 +08:00
|
|
|
ahash_request_set_crypt(req, sg, result, template[i].psize);
|
|
|
|
ret = crypto_ahash_digest(req);
|
|
|
|
switch (ret) {
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
case -EINPROGRESS:
|
|
|
|
case -EBUSY:
|
|
|
|
ret = wait_for_completion_interruptible(
|
|
|
|
&tresult.completion);
|
|
|
|
if (!ret && !(ret = tresult.err)) {
|
|
|
|
INIT_COMPLETION(tresult.completion);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/* fall through */
|
|
|
|
default:
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: hash: digest failed on test %d "
|
|
|
|
"for %s: ret=%d\n", i + 1, algo, -ret);
|
2006-08-19 19:38:49 +08:00
|
|
|
goto out;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-07-31 14:03:44 +08:00
|
|
|
if (memcmp(result, template[i].digest,
|
|
|
|
crypto_ahash_digestsize(tfm))) {
|
|
|
|
printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
|
|
|
|
i + 1, algo);
|
|
|
|
hexdump(result, crypto_ahash_digestsize(tfm));
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
j = 0;
|
|
|
|
for (i = 0; i < tcount; i++) {
|
2008-03-13 20:20:28 +08:00
|
|
|
if (template[i].np) {
|
2005-04-17 06:20:36 +08:00
|
|
|
j++;
|
2005-06-23 04:26:03 +08:00
|
|
|
memset(result, 0, 64);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
temp = 0;
|
2008-03-13 20:20:28 +08:00
|
|
|
sg_init_table(sg, template[i].np);
|
|
|
|
for (k = 0; k < template[i].np; k++) {
|
2008-07-31 12:23:53 +08:00
|
|
|
sg_set_buf(&sg[k],
|
|
|
|
memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]),
|
|
|
|
template[i].plaintext + temp,
|
|
|
|
template[i].tap[k]),
|
|
|
|
template[i].tap[k]);
|
2008-03-13 20:20:28 +08:00
|
|
|
temp += template[i].tap[k];
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
if (template[i].ksize) {
|
2008-05-14 21:24:51 +08:00
|
|
|
crypto_ahash_clear_flags(tfm, ~0);
|
|
|
|
ret = crypto_ahash_setkey(tfm, template[i].key,
|
|
|
|
template[i].ksize);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2006-08-19 19:38:49 +08:00
|
|
|
if (ret) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: hash: setkey "
|
|
|
|
"failed on chunking test %d "
|
|
|
|
"for %s: ret=%d\n", j, algo,
|
|
|
|
-ret);
|
2006-08-19 19:38:49 +08:00
|
|
|
goto out;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2008-05-14 21:24:51 +08:00
|
|
|
ahash_request_set_crypt(req, sg, result,
|
|
|
|
template[i].psize);
|
|
|
|
ret = crypto_ahash_digest(req);
|
|
|
|
switch (ret) {
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
case -EINPROGRESS:
|
|
|
|
case -EBUSY:
|
|
|
|
ret = wait_for_completion_interruptible(
|
|
|
|
&tresult.completion);
|
|
|
|
if (!ret && !(ret = tresult.err)) {
|
|
|
|
INIT_COMPLETION(tresult.completion);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/* fall through */
|
|
|
|
default:
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: hash: digest failed "
|
|
|
|
"on chunking test %d for %s: "
|
|
|
|
"ret=%d\n", j, algo, -ret);
|
2006-08-19 19:38:49 +08:00
|
|
|
goto out;
|
|
|
|
}
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2008-07-31 14:03:44 +08:00
|
|
|
if (memcmp(result, template[i].digest,
|
|
|
|
crypto_ahash_digestsize(tfm))) {
|
|
|
|
printk(KERN_ERR "alg: hash: Chunking test %d "
|
|
|
|
"failed for %s\n", j, algo);
|
|
|
|
hexdump(result, crypto_ahash_digestsize(tfm));
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
}
|
2006-08-19 19:38:49 +08:00
|
|
|
|
2008-07-31 14:03:44 +08:00
|
|
|
ret = 0;
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
out:
|
2008-05-14 21:24:51 +08:00
|
|
|
ahash_request_free(req);
|
|
|
|
out_noreq:
|
|
|
|
crypto_free_ahash(tfm);
|
2008-07-31 14:03:44 +08:00
|
|
|
return ret;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2008-07-31 14:03:44 +08:00
|
|
|
static int test_aead(char *algo, int enc, struct aead_testvec *template,
|
|
|
|
unsigned int tcount)
|
2007-11-26 22:12:07 +08:00
|
|
|
{
|
2008-07-31 14:03:44 +08:00
|
|
|
unsigned int i, j, k, n, temp;
|
|
|
|
int ret = 0;
|
2007-11-26 22:12:07 +08:00
|
|
|
char *q;
|
|
|
|
struct crypto_aead *tfm;
|
|
|
|
char *key;
|
|
|
|
struct aead_request *req;
|
|
|
|
struct scatterlist sg[8];
|
|
|
|
struct scatterlist asg[8];
|
|
|
|
const char *e;
|
|
|
|
struct tcrypt_result result;
|
2007-12-04 16:17:50 +08:00
|
|
|
unsigned int authsize;
|
2008-03-13 20:20:28 +08:00
|
|
|
void *input;
|
|
|
|
void *assoc;
|
|
|
|
char iv[MAX_IVLEN];
|
2007-11-26 22:12:07 +08:00
|
|
|
|
|
|
|
if (enc == ENCRYPT)
|
|
|
|
e = "encryption";
|
|
|
|
else
|
|
|
|
e = "decryption";
|
|
|
|
|
|
|
|
init_completion(&result.completion);
|
|
|
|
|
|
|
|
tfm = crypto_alloc_aead(algo, 0, 0);
|
|
|
|
|
|
|
|
if (IS_ERR(tfm)) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
|
|
|
|
"%ld\n", algo, PTR_ERR(tfm));
|
|
|
|
return PTR_ERR(tfm);
|
2007-11-26 22:12:07 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
req = aead_request_alloc(tfm, GFP_KERNEL);
|
|
|
|
if (!req) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: aead: Failed to allocate request for "
|
|
|
|
"%s\n", algo);
|
|
|
|
ret = -ENOMEM;
|
2007-11-26 22:12:07 +08:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
|
|
|
tcrypt_complete, &result);
|
|
|
|
|
|
|
|
for (i = 0, j = 0; i < tcount; i++) {
|
2008-03-13 20:20:28 +08:00
|
|
|
if (!template[i].np) {
|
2008-07-31 14:03:44 +08:00
|
|
|
j++;
|
2008-03-13 20:20:28 +08:00
|
|
|
|
|
|
|
/* some tepmplates have no input data but they will
|
|
|
|
* touch input
|
|
|
|
*/
|
2008-07-31 12:23:53 +08:00
|
|
|
input = xbuf[0];
|
|
|
|
assoc = axbuf[0];
|
2008-03-13 20:20:28 +08:00
|
|
|
|
|
|
|
memcpy(input, template[i].input, template[i].ilen);
|
|
|
|
memcpy(assoc, template[i].assoc, template[i].alen);
|
|
|
|
if (template[i].iv)
|
|
|
|
memcpy(iv, template[i].iv, MAX_IVLEN);
|
|
|
|
else
|
|
|
|
memset(iv, 0, MAX_IVLEN);
|
2007-11-26 22:12:07 +08:00
|
|
|
|
|
|
|
crypto_aead_clear_flags(tfm, ~0);
|
2008-03-13 20:20:28 +08:00
|
|
|
if (template[i].wk)
|
2007-11-26 22:12:07 +08:00
|
|
|
crypto_aead_set_flags(
|
|
|
|
tfm, CRYPTO_TFM_REQ_WEAK_KEY);
|
2008-03-13 20:20:28 +08:00
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
key = template[i].key;
|
2007-11-26 22:12:07 +08:00
|
|
|
|
|
|
|
ret = crypto_aead_setkey(tfm, key,
|
2008-03-13 20:20:28 +08:00
|
|
|
template[i].klen);
|
2008-07-31 14:03:44 +08:00
|
|
|
if (!ret == template[i].fail) {
|
|
|
|
printk(KERN_ERR "alg: aead: setkey failed on "
|
|
|
|
"test %d for %s: flags=%x\n", j, algo,
|
2007-11-26 22:12:07 +08:00
|
|
|
crypto_aead_get_flags(tfm));
|
2008-07-31 14:03:44 +08:00
|
|
|
goto out;
|
|
|
|
} else if (ret)
|
|
|
|
continue;
|
2007-11-26 22:12:07 +08:00
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
authsize = abs(template[i].rlen - template[i].ilen);
|
2007-12-12 20:24:22 +08:00
|
|
|
ret = crypto_aead_setauthsize(tfm, authsize);
|
|
|
|
if (ret) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: aead: Failed to set "
|
|
|
|
"authsize to %u on test %d for %s\n",
|
|
|
|
authsize, j, algo);
|
|
|
|
goto out;
|
2007-12-12 20:24:22 +08:00
|
|
|
}
|
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
sg_init_one(&sg[0], input,
|
|
|
|
template[i].ilen + (enc ? authsize : 0));
|
2007-11-26 22:12:07 +08:00
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
sg_init_one(&asg[0], assoc, template[i].alen);
|
2007-11-26 22:12:07 +08:00
|
|
|
|
|
|
|
aead_request_set_crypt(req, sg, sg,
|
2008-03-13 20:20:28 +08:00
|
|
|
template[i].ilen, iv);
|
2007-11-26 22:12:07 +08:00
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
aead_request_set_assoc(req, asg, template[i].alen);
|
2007-11-26 22:12:07 +08:00
|
|
|
|
2007-12-04 16:17:50 +08:00
|
|
|
ret = enc ?
|
|
|
|
crypto_aead_encrypt(req) :
|
|
|
|
crypto_aead_decrypt(req);
|
2007-11-26 22:12:07 +08:00
|
|
|
|
|
|
|
switch (ret) {
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
case -EINPROGRESS:
|
|
|
|
case -EBUSY:
|
|
|
|
ret = wait_for_completion_interruptible(
|
|
|
|
&result.completion);
|
|
|
|
if (!ret && !(ret = result.err)) {
|
|
|
|
INIT_COMPLETION(result.completion);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/* fall through */
|
|
|
|
default:
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: aead: %s failed on test "
|
|
|
|
"%d for %s: ret=%d\n", e, j, algo, -ret);
|
|
|
|
goto out;
|
2007-11-26 22:12:07 +08:00
|
|
|
}
|
|
|
|
|
2008-07-03 14:57:30 +08:00
|
|
|
q = input;
|
2008-07-31 14:03:44 +08:00
|
|
|
if (memcmp(q, template[i].result, template[i].rlen)) {
|
|
|
|
printk(KERN_ERR "alg: aead: Test %d failed on "
|
|
|
|
"%s for %s\n", j, e, algo);
|
|
|
|
hexdump(q, template[i].rlen);
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
2007-11-26 22:12:07 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0, j = 0; i < tcount; i++) {
|
2008-03-13 20:20:28 +08:00
|
|
|
if (template[i].np) {
|
2008-07-31 14:03:44 +08:00
|
|
|
j++;
|
2008-03-13 20:20:28 +08:00
|
|
|
|
|
|
|
if (template[i].iv)
|
|
|
|
memcpy(iv, template[i].iv, MAX_IVLEN);
|
|
|
|
else
|
|
|
|
memset(iv, 0, MAX_IVLEN);
|
2007-11-26 22:12:07 +08:00
|
|
|
|
|
|
|
crypto_aead_clear_flags(tfm, ~0);
|
2008-03-13 20:20:28 +08:00
|
|
|
if (template[i].wk)
|
2007-11-26 22:12:07 +08:00
|
|
|
crypto_aead_set_flags(
|
|
|
|
tfm, CRYPTO_TFM_REQ_WEAK_KEY);
|
2008-03-13 20:20:28 +08:00
|
|
|
key = template[i].key;
|
2007-11-26 22:12:07 +08:00
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
ret = crypto_aead_setkey(tfm, key, template[i].klen);
|
2008-07-31 14:03:44 +08:00
|
|
|
if (!ret == template[i].fail) {
|
|
|
|
printk(KERN_ERR "alg: aead: setkey failed on "
|
|
|
|
"chunk test %d for %s: flags=%x\n", j,
|
|
|
|
algo, crypto_aead_get_flags(tfm));
|
|
|
|
goto out;
|
|
|
|
} else if (ret)
|
|
|
|
continue;
|
2007-11-26 22:12:07 +08:00
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
authsize = abs(template[i].rlen - template[i].ilen);
|
|
|
|
|
2008-07-31 14:03:44 +08:00
|
|
|
ret = -EINVAL;
|
2008-03-13 20:20:28 +08:00
|
|
|
sg_init_table(sg, template[i].np);
|
|
|
|
for (k = 0, temp = 0; k < template[i].np; k++) {
|
2008-07-31 12:23:53 +08:00
|
|
|
if (WARN_ON(offset_in_page(IDX[k]) +
|
|
|
|
template[i].tap[k] > PAGE_SIZE))
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
q = xbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]);
|
|
|
|
|
|
|
|
memcpy(q, template[i].input + temp,
|
2008-03-13 20:20:28 +08:00
|
|
|
template[i].tap[k]);
|
2008-07-31 12:23:53 +08:00
|
|
|
|
|
|
|
n = template[i].tap[k];
|
|
|
|
if (k == template[i].np - 1 && enc)
|
|
|
|
n += authsize;
|
|
|
|
if (offset_in_page(q) + n < PAGE_SIZE)
|
|
|
|
q[n] = 0;
|
|
|
|
|
|
|
|
sg_set_buf(&sg[k], q, template[i].tap[k]);
|
2008-03-13 20:20:28 +08:00
|
|
|
temp += template[i].tap[k];
|
2007-11-26 22:12:07 +08:00
|
|
|
}
|
|
|
|
|
2007-12-12 20:24:22 +08:00
|
|
|
ret = crypto_aead_setauthsize(tfm, authsize);
|
|
|
|
if (ret) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: aead: Failed to set "
|
|
|
|
"authsize to %u on chunk test %d for "
|
|
|
|
"%s\n", authsize, j, algo);
|
2007-12-12 20:24:22 +08:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
if (enc) {
|
|
|
|
if (WARN_ON(sg[k - 1].offset +
|
|
|
|
sg[k - 1].length + authsize >
|
2008-07-31 14:03:44 +08:00
|
|
|
PAGE_SIZE)) {
|
|
|
|
ret = -EINVAL;
|
2008-07-31 12:23:53 +08:00
|
|
|
goto out;
|
2008-07-31 14:03:44 +08:00
|
|
|
}
|
2008-07-31 12:23:53 +08:00
|
|
|
|
2007-12-04 16:17:50 +08:00
|
|
|
sg[k - 1].length += authsize;
|
2008-07-31 12:23:53 +08:00
|
|
|
}
|
2007-12-04 16:17:50 +08:00
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
sg_init_table(asg, template[i].anp);
|
|
|
|
for (k = 0, temp = 0; k < template[i].anp; k++) {
|
2008-07-31 12:23:53 +08:00
|
|
|
sg_set_buf(&asg[k],
|
|
|
|
memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]),
|
|
|
|
template[i].assoc + temp,
|
|
|
|
template[i].atap[k]),
|
2008-03-13 20:20:28 +08:00
|
|
|
template[i].atap[k]);
|
2008-07-31 12:23:53 +08:00
|
|
|
temp += template[i].atap[k];
|
2007-11-26 22:12:07 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
aead_request_set_crypt(req, sg, sg,
|
2008-03-13 20:20:28 +08:00
|
|
|
template[i].ilen,
|
|
|
|
iv);
|
2007-11-26 22:12:07 +08:00
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
aead_request_set_assoc(req, asg, template[i].alen);
|
2007-11-26 22:12:07 +08:00
|
|
|
|
2007-12-04 16:17:50 +08:00
|
|
|
ret = enc ?
|
|
|
|
crypto_aead_encrypt(req) :
|
|
|
|
crypto_aead_decrypt(req);
|
2007-11-26 22:12:07 +08:00
|
|
|
|
|
|
|
switch (ret) {
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
case -EINPROGRESS:
|
|
|
|
case -EBUSY:
|
|
|
|
ret = wait_for_completion_interruptible(
|
|
|
|
&result.completion);
|
|
|
|
if (!ret && !(ret = result.err)) {
|
|
|
|
INIT_COMPLETION(result.completion);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/* fall through */
|
|
|
|
default:
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: aead: %s failed on "
|
|
|
|
"chunk test %d for %s: ret=%d\n", e, j,
|
|
|
|
algo, -ret);
|
2007-11-26 22:12:07 +08:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2008-07-31 14:03:44 +08:00
|
|
|
ret = -EINVAL;
|
2008-03-13 20:20:28 +08:00
|
|
|
for (k = 0, temp = 0; k < template[i].np; k++) {
|
2008-07-31 12:23:53 +08:00
|
|
|
q = xbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]);
|
2008-07-30 16:23:51 +08:00
|
|
|
|
|
|
|
n = template[i].tap[k];
|
|
|
|
if (k == template[i].np - 1)
|
|
|
|
n += enc ? authsize : -authsize;
|
2008-07-31 14:03:44 +08:00
|
|
|
|
|
|
|
if (memcmp(q, template[i].result + temp, n)) {
|
|
|
|
printk(KERN_ERR "alg: aead: Chunk "
|
|
|
|
"test %d failed on %s at page "
|
|
|
|
"%u for %s\n", j, e, k, algo);
|
|
|
|
hexdump(q, n);
|
|
|
|
goto out;
|
|
|
|
}
|
2007-11-26 22:12:07 +08:00
|
|
|
|
2008-07-30 16:23:51 +08:00
|
|
|
q += n;
|
|
|
|
if (k == template[i].np - 1 && !enc) {
|
|
|
|
if (memcmp(q, template[i].input +
|
|
|
|
temp + n, authsize))
|
|
|
|
n = authsize;
|
|
|
|
else
|
|
|
|
n = 0;
|
|
|
|
} else {
|
2008-07-31 12:23:53 +08:00
|
|
|
for (n = 0; offset_in_page(q + n) &&
|
|
|
|
q[n]; n++)
|
2008-07-30 16:23:51 +08:00
|
|
|
;
|
|
|
|
}
|
2008-05-08 19:27:47 +08:00
|
|
|
if (n) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: aead: Result "
|
|
|
|
"buffer corruption in chunk "
|
|
|
|
"test %d on %s at page %u for "
|
|
|
|
"%s: %u bytes:\n", j, e, k,
|
|
|
|
algo, n);
|
2008-07-30 16:23:51 +08:00
|
|
|
hexdump(q, n);
|
2008-07-31 14:03:44 +08:00
|
|
|
goto out;
|
2008-05-08 19:27:47 +08:00
|
|
|
}
|
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
temp += template[i].tap[k];
|
2007-11-26 22:12:07 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-07-31 14:03:44 +08:00
|
|
|
ret = 0;
|
|
|
|
|
2007-11-26 22:12:07 +08:00
|
|
|
out:
|
|
|
|
crypto_free_aead(tfm);
|
|
|
|
aead_request_free(req);
|
2008-07-31 14:03:44 +08:00
|
|
|
return ret;
|
2007-11-26 22:12:07 +08:00
|
|
|
}
|
|
|
|
|
2008-07-31 14:03:44 +08:00
|
|
|
static int test_cipher(char *algo, int enc,
|
|
|
|
struct cipher_testvec *template, unsigned int tcount)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2008-07-31 14:03:44 +08:00
|
|
|
unsigned int i, j, k, n, temp;
|
|
|
|
int ret;
|
2005-09-17 15:55:31 +08:00
|
|
|
char *q;
|
2007-04-04 15:41:07 +08:00
|
|
|
struct crypto_ablkcipher *tfm;
|
|
|
|
struct ablkcipher_request *req;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct scatterlist sg[8];
|
2006-08-13 06:26:09 +08:00
|
|
|
const char *e;
|
2007-04-04 15:41:07 +08:00
|
|
|
struct tcrypt_result result;
|
2008-03-13 20:20:28 +08:00
|
|
|
void *data;
|
|
|
|
char iv[MAX_IVLEN];
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
if (enc == ENCRYPT)
|
2005-06-23 04:26:36 +08:00
|
|
|
e = "encryption";
|
2005-04-17 06:20:36 +08:00
|
|
|
else
|
2005-06-23 04:26:36 +08:00
|
|
|
e = "decryption";
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-04-04 15:41:07 +08:00
|
|
|
init_completion(&result.completion);
|
|
|
|
tfm = crypto_alloc_ablkcipher(algo, 0, 0);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2006-08-13 06:26:09 +08:00
|
|
|
if (IS_ERR(tfm)) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: cipher: Failed to load transform for "
|
|
|
|
"%s: %ld\n", algo, PTR_ERR(tfm));
|
|
|
|
return PTR_ERR(tfm);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
2007-04-04 15:41:07 +08:00
|
|
|
|
|
|
|
req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
|
|
|
|
if (!req) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: cipher: Failed to allocate request for "
|
|
|
|
"%s\n", algo);
|
|
|
|
ret = -ENOMEM;
|
2007-04-04 15:41:07 +08:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
|
|
|
tcrypt_complete, &result);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
j = 0;
|
|
|
|
for (i = 0; i < tcount; i++) {
|
2008-03-13 20:20:28 +08:00
|
|
|
if (template[i].iv)
|
|
|
|
memcpy(iv, template[i].iv, MAX_IVLEN);
|
|
|
|
else
|
|
|
|
memset(iv, 0, MAX_IVLEN);
|
|
|
|
|
|
|
|
if (!(template[i].np)) {
|
2005-06-23 04:26:03 +08:00
|
|
|
j++;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
data = xbuf[0];
|
|
|
|
memcpy(data, template[i].input, template[i].ilen);
|
|
|
|
|
2007-04-04 15:41:07 +08:00
|
|
|
crypto_ablkcipher_clear_flags(tfm, ~0);
|
2008-03-13 20:20:28 +08:00
|
|
|
if (template[i].wk)
|
2007-04-04 15:41:07 +08:00
|
|
|
crypto_ablkcipher_set_flags(
|
2006-08-13 06:26:09 +08:00
|
|
|
tfm, CRYPTO_TFM_REQ_WEAK_KEY);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
ret = crypto_ablkcipher_setkey(tfm, template[i].key,
|
|
|
|
template[i].klen);
|
2008-07-31 14:03:44 +08:00
|
|
|
if (!ret == template[i].fail) {
|
|
|
|
printk(KERN_ERR "alg: cipher: setkey failed "
|
|
|
|
"on test %d for %s: flags=%x\n", j,
|
|
|
|
algo, crypto_ablkcipher_get_flags(tfm));
|
|
|
|
goto out;
|
|
|
|
} else if (ret)
|
|
|
|
continue;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
sg_init_one(&sg[0], data, template[i].ilen);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2007-04-04 15:41:07 +08:00
|
|
|
ablkcipher_request_set_crypt(req, sg, sg,
|
2008-03-13 20:20:28 +08:00
|
|
|
template[i].ilen, iv);
|
2006-08-13 06:26:09 +08:00
|
|
|
ret = enc ?
|
2007-04-04 15:41:07 +08:00
|
|
|
crypto_ablkcipher_encrypt(req) :
|
|
|
|
crypto_ablkcipher_decrypt(req);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2007-04-04 15:41:07 +08:00
|
|
|
switch (ret) {
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
case -EINPROGRESS:
|
|
|
|
case -EBUSY:
|
|
|
|
ret = wait_for_completion_interruptible(
|
|
|
|
&result.completion);
|
|
|
|
if (!ret && !((ret = result.err))) {
|
|
|
|
INIT_COMPLETION(result.completion);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/* fall through */
|
|
|
|
default:
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: cipher: %s failed on "
|
|
|
|
"test %d for %s: ret=%d\n", e, j, algo,
|
|
|
|
-ret);
|
2005-04-17 06:20:36 +08:00
|
|
|
goto out;
|
2005-06-23 04:26:03 +08:00
|
|
|
}
|
|
|
|
|
2008-07-03 14:57:30 +08:00
|
|
|
q = data;
|
2008-07-31 14:03:44 +08:00
|
|
|
if (memcmp(q, template[i].result, template[i].rlen)) {
|
|
|
|
printk(KERN_ERR "alg: cipher: Test %d failed "
|
|
|
|
"on %s for %s\n", j, e, algo);
|
|
|
|
hexdump(q, template[i].rlen);
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
}
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
j = 0;
|
|
|
|
for (i = 0; i < tcount; i++) {
|
2008-03-13 20:20:28 +08:00
|
|
|
|
|
|
|
if (template[i].iv)
|
|
|
|
memcpy(iv, template[i].iv, MAX_IVLEN);
|
|
|
|
else
|
|
|
|
memset(iv, 0, MAX_IVLEN);
|
|
|
|
|
|
|
|
if (template[i].np) {
|
2005-06-23 04:26:03 +08:00
|
|
|
j++;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-04-04 15:41:07 +08:00
|
|
|
crypto_ablkcipher_clear_flags(tfm, ~0);
|
2008-03-13 20:20:28 +08:00
|
|
|
if (template[i].wk)
|
2007-04-04 15:41:07 +08:00
|
|
|
crypto_ablkcipher_set_flags(
|
2006-08-13 06:26:09 +08:00
|
|
|
tfm, CRYPTO_TFM_REQ_WEAK_KEY);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
ret = crypto_ablkcipher_setkey(tfm, template[i].key,
|
|
|
|
template[i].klen);
|
2008-07-31 14:03:44 +08:00
|
|
|
if (!ret == template[i].fail) {
|
|
|
|
printk(KERN_ERR "alg: cipher: setkey failed "
|
|
|
|
"on chunk test %d for %s: flags=%x\n",
|
|
|
|
j, algo,
|
|
|
|
crypto_ablkcipher_get_flags(tfm));
|
|
|
|
goto out;
|
|
|
|
} else if (ret)
|
|
|
|
continue;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
temp = 0;
|
2008-07-31 14:03:44 +08:00
|
|
|
ret = -EINVAL;
|
2008-03-13 20:20:28 +08:00
|
|
|
sg_init_table(sg, template[i].np);
|
|
|
|
for (k = 0; k < template[i].np; k++) {
|
2008-07-31 12:23:53 +08:00
|
|
|
if (WARN_ON(offset_in_page(IDX[k]) +
|
|
|
|
template[i].tap[k] > PAGE_SIZE))
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
q = xbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]);
|
|
|
|
|
|
|
|
memcpy(q, template[i].input + temp,
|
|
|
|
template[i].tap[k]);
|
|
|
|
|
|
|
|
if (offset_in_page(q) + template[i].tap[k] <
|
|
|
|
PAGE_SIZE)
|
|
|
|
q[template[i].tap[k]] = 0;
|
|
|
|
|
|
|
|
sg_set_buf(&sg[k], q, template[i].tap[k]);
|
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
temp += template[i].tap[k];
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2007-04-04 15:41:07 +08:00
|
|
|
ablkcipher_request_set_crypt(req, sg, sg,
|
2008-03-13 20:20:28 +08:00
|
|
|
template[i].ilen, iv);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2006-08-13 06:26:09 +08:00
|
|
|
ret = enc ?
|
2007-04-04 15:41:07 +08:00
|
|
|
crypto_ablkcipher_encrypt(req) :
|
|
|
|
crypto_ablkcipher_decrypt(req);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2007-04-04 15:41:07 +08:00
|
|
|
switch (ret) {
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
case -EINPROGRESS:
|
|
|
|
case -EBUSY:
|
|
|
|
ret = wait_for_completion_interruptible(
|
|
|
|
&result.completion);
|
|
|
|
if (!ret && !((ret = result.err))) {
|
|
|
|
INIT_COMPLETION(result.completion);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/* fall through */
|
|
|
|
default:
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: cipher: %s failed on "
|
|
|
|
"chunk test %d for %s: ret=%d\n", e, j,
|
|
|
|
algo, -ret);
|
2005-04-17 06:20:36 +08:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
temp = 0;
|
2008-07-31 14:03:44 +08:00
|
|
|
ret = -EINVAL;
|
2008-03-13 20:20:28 +08:00
|
|
|
for (k = 0; k < template[i].np; k++) {
|
2008-07-31 12:23:53 +08:00
|
|
|
q = xbuf[IDX[k] >> PAGE_SHIFT] +
|
|
|
|
offset_in_page(IDX[k]);
|
2008-07-31 14:03:44 +08:00
|
|
|
|
|
|
|
if (memcmp(q, template[i].result + temp,
|
|
|
|
template[i].tap[k])) {
|
|
|
|
printk(KERN_ERR "alg: cipher: Chunk "
|
|
|
|
"test %d failed on %s at page "
|
|
|
|
"%u for %s\n", j, e, k, algo);
|
|
|
|
hexdump(q, template[i].tap[k]);
|
|
|
|
goto out;
|
|
|
|
}
|
2008-05-08 19:27:47 +08:00
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
q += template[i].tap[k];
|
|
|
|
for (n = 0; offset_in_page(q + n) && q[n]; n++)
|
2008-05-08 19:27:47 +08:00
|
|
|
;
|
|
|
|
if (n) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: cipher: "
|
|
|
|
"Result buffer corruption in "
|
|
|
|
"chunk test %d on %s at page "
|
|
|
|
"%u for %s: %u bytes:\n", j, e,
|
|
|
|
k, algo, n);
|
2008-07-31 12:23:53 +08:00
|
|
|
hexdump(q, n);
|
2008-07-31 14:03:44 +08:00
|
|
|
goto out;
|
2008-05-08 19:27:47 +08:00
|
|
|
}
|
2008-03-13 20:20:28 +08:00
|
|
|
temp += template[i].tap[k];
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-07-31 14:03:44 +08:00
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
out:
|
2007-04-04 15:41:07 +08:00
|
|
|
crypto_free_ablkcipher(tfm);
|
|
|
|
ablkcipher_request_free(req);
|
2008-07-31 14:03:44 +08:00
|
|
|
return ret;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
|
|
|
|
struct scatterlist *sg, int blen, int sec)
|
2005-06-23 04:29:03 +08:00
|
|
|
{
|
|
|
|
unsigned long start, end;
|
|
|
|
int bcount;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
for (start = jiffies, end = start + sec * HZ, bcount = 0;
|
|
|
|
time_before(jiffies, end); bcount++) {
|
|
|
|
if (enc)
|
2006-08-13 06:26:09 +08:00
|
|
|
ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
|
2005-06-23 04:29:03 +08:00
|
|
|
else
|
2006-08-13 06:26:09 +08:00
|
|
|
ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
|
2005-06-23 04:29:03 +08:00
|
|
|
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
printk("%d operations in %d seconds (%ld bytes)\n",
|
|
|
|
bcount, sec, (long)bcount * blen);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
|
|
|
|
struct scatterlist *sg, int blen)
|
2005-06-23 04:29:03 +08:00
|
|
|
{
|
|
|
|
unsigned long cycles = 0;
|
|
|
|
int ret = 0;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
local_bh_disable();
|
|
|
|
local_irq_disable();
|
|
|
|
|
|
|
|
/* Warm-up run. */
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
|
|
if (enc)
|
2006-08-13 06:26:09 +08:00
|
|
|
ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
|
2005-06-23 04:29:03 +08:00
|
|
|
else
|
2006-08-13 06:26:09 +08:00
|
|
|
ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
|
2005-06-23 04:29:03 +08:00
|
|
|
|
|
|
|
if (ret)
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The real thing. */
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
|
cycles_t start, end;
|
|
|
|
|
|
|
|
start = get_cycles();
|
|
|
|
if (enc)
|
2006-08-13 06:26:09 +08:00
|
|
|
ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
|
2005-06-23 04:29:03 +08:00
|
|
|
else
|
2006-08-13 06:26:09 +08:00
|
|
|
ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
|
2005-06-23 04:29:03 +08:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2008-03-11 21:27:11 +08:00
|
|
|
static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
|
|
|
|
|
2006-08-13 06:26:09 +08:00
|
|
|
static void test_cipher_speed(char *algo, int enc, unsigned int sec,
|
2005-06-23 04:27:51 +08:00
|
|
|
struct cipher_testvec *template,
|
2008-03-11 21:27:11 +08:00
|
|
|
unsigned int tcount, u8 *keysize)
|
2005-06-23 04:27:23 +08:00
|
|
|
{
|
2005-06-23 04:27:51 +08:00
|
|
|
unsigned int ret, i, j, iv_len;
|
2008-07-31 12:23:53 +08:00
|
|
|
unsigned char *key, iv[128];
|
2006-08-13 06:26:09 +08:00
|
|
|
struct crypto_blkcipher *tfm;
|
|
|
|
struct blkcipher_desc desc;
|
|
|
|
const char *e;
|
2008-03-11 21:27:11 +08:00
|
|
|
u32 *b_size;
|
2005-06-23 04:27:23 +08:00
|
|
|
|
|
|
|
if (enc == ENCRYPT)
|
|
|
|
e = "encryption";
|
|
|
|
else
|
|
|
|
e = "decryption";
|
|
|
|
|
2006-08-13 06:26:09 +08:00
|
|
|
printk("\ntesting speed of %s %s\n", algo, e);
|
2005-06-23 04:27:23 +08:00
|
|
|
|
2006-08-13 06:26:09 +08:00
|
|
|
tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
|
2005-06-23 04:27:23 +08:00
|
|
|
|
2006-08-13 06:26:09 +08:00
|
|
|
if (IS_ERR(tfm)) {
|
|
|
|
printk("failed to load transform for %s: %ld\n", algo,
|
|
|
|
PTR_ERR(tfm));
|
2005-06-23 04:27:23 +08:00
|
|
|
return;
|
|
|
|
}
|
2006-08-13 06:26:09 +08:00
|
|
|
desc.tfm = tfm;
|
|
|
|
desc.flags = 0;
|
2005-06-23 04:27:23 +08:00
|
|
|
|
2008-03-11 21:27:11 +08:00
|
|
|
i = 0;
|
|
|
|
do {
|
2005-06-23 04:27:23 +08:00
|
|
|
|
2008-03-11 21:27:11 +08:00
|
|
|
b_size = block_sizes;
|
|
|
|
do {
|
2008-07-31 12:23:53 +08:00
|
|
|
struct scatterlist sg[TVMEMSIZE];
|
2005-06-23 04:27:23 +08:00
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
|
|
|
|
printk("template (%u) too big for "
|
|
|
|
"tvmem (%lu)\n", *keysize + *b_size,
|
|
|
|
TVMEMSIZE * PAGE_SIZE);
|
2008-03-11 21:27:11 +08:00
|
|
|
goto out;
|
|
|
|
}
|
2005-06-23 04:27:23 +08:00
|
|
|
|
2008-03-11 21:27:11 +08:00
|
|
|
printk("test %u (%d bit key, %d byte blocks): ", i,
|
|
|
|
*keysize * 8, *b_size);
|
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
memset(tvmem[0], 0xff, PAGE_SIZE);
|
2008-03-11 21:27:11 +08:00
|
|
|
|
|
|
|
/* set key, plain text and IV */
|
2008-07-31 12:23:53 +08:00
|
|
|
key = (unsigned char *)tvmem[0];
|
2008-03-11 21:27:11 +08:00
|
|
|
for (j = 0; j < tcount; j++) {
|
|
|
|
if (template[j].klen == *keysize) {
|
|
|
|
key = template[j].key;
|
|
|
|
break;
|
|
|
|
}
|
2005-06-23 04:27:51 +08:00
|
|
|
}
|
2005-06-23 04:27:23 +08:00
|
|
|
|
2008-03-11 21:27:11 +08:00
|
|
|
ret = crypto_blkcipher_setkey(tfm, key, *keysize);
|
|
|
|
if (ret) {
|
|
|
|
printk("setkey() failed flags=%x\n",
|
|
|
|
crypto_blkcipher_get_flags(tfm));
|
|
|
|
goto out;
|
|
|
|
}
|
2005-06-23 04:27:23 +08:00
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
sg_init_table(sg, TVMEMSIZE);
|
|
|
|
sg_set_buf(sg, tvmem[0] + *keysize,
|
|
|
|
PAGE_SIZE - *keysize);
|
|
|
|
for (j = 1; j < TVMEMSIZE; j++) {
|
|
|
|
sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
|
|
|
|
memset (tvmem[j], 0xff, PAGE_SIZE);
|
|
|
|
}
|
|
|
|
|
2008-03-11 21:27:11 +08:00
|
|
|
iv_len = crypto_blkcipher_ivsize(tfm);
|
|
|
|
if (iv_len) {
|
|
|
|
memset(&iv, 0xff, iv_len);
|
|
|
|
crypto_blkcipher_set_iv(tfm, iv, iv_len);
|
|
|
|
}
|
2005-06-23 04:27:23 +08:00
|
|
|
|
2008-03-11 21:27:11 +08:00
|
|
|
if (sec)
|
2008-07-31 12:23:53 +08:00
|
|
|
ret = test_cipher_jiffies(&desc, enc, sg,
|
|
|
|
*b_size, sec);
|
2008-03-11 21:27:11 +08:00
|
|
|
else
|
2008-07-31 12:23:53 +08:00
|
|
|
ret = test_cipher_cycles(&desc, enc, sg,
|
|
|
|
*b_size);
|
2005-06-23 04:27:23 +08:00
|
|
|
|
2008-03-11 21:27:11 +08:00
|
|
|
if (ret) {
|
|
|
|
printk("%s() failed flags=%x\n", e, desc.flags);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
b_size++;
|
|
|
|
i++;
|
|
|
|
} while (*b_size);
|
|
|
|
keysize++;
|
|
|
|
} while (*keysize);
|
2005-06-23 04:27:23 +08:00
|
|
|
|
|
|
|
out:
|
2006-08-13 06:26:09 +08:00
|
|
|
crypto_free_blkcipher(tfm);
|
2005-06-23 04:27:23 +08:00
|
|
|
}
|
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
static int test_hash_jiffies_digest(struct hash_desc *desc,
|
|
|
|
struct scatterlist *sg, int blen,
|
2006-08-19 19:38:49 +08:00
|
|
|
char *out, int sec)
|
|
|
|
{
|
|
|
|
unsigned long start, end;
|
|
|
|
int bcount;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
for (start = jiffies, end = start + sec * HZ, bcount = 0;
|
|
|
|
time_before(jiffies, end); bcount++) {
|
|
|
|
ret = crypto_hash_digest(desc, sg, blen, out);
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
printk("%6u opers/sec, %9lu bytes/sec\n",
|
|
|
|
bcount / sec, ((long)bcount * blen) / sec);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
|
|
|
|
int blen, int plen, char *out, int sec)
|
2006-05-30 20:04:19 +08:00
|
|
|
{
|
|
|
|
unsigned long start, end;
|
|
|
|
int bcount, pcount;
|
2006-08-19 19:38:49 +08:00
|
|
|
int ret;
|
|
|
|
|
|
|
|
if (plen == blen)
|
2008-07-31 12:23:53 +08:00
|
|
|
return test_hash_jiffies_digest(desc, sg, blen, out, sec);
|
2007-10-27 15:51:21 +08:00
|
|
|
|
2006-05-30 20:04:19 +08:00
|
|
|
for (start = jiffies, end = start + sec * HZ, bcount = 0;
|
|
|
|
time_before(jiffies, end); bcount++) {
|
2006-08-19 19:38:49 +08:00
|
|
|
ret = crypto_hash_init(desc);
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
2006-05-30 20:04:19 +08:00
|
|
|
for (pcount = 0; pcount < blen; pcount += plen) {
|
2006-08-19 19:38:49 +08:00
|
|
|
ret = crypto_hash_update(desc, sg, plen);
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
2006-05-30 20:04:19 +08:00
|
|
|
}
|
|
|
|
/* we assume there is enough space in 'out' for the result */
|
2006-08-19 19:38:49 +08:00
|
|
|
ret = crypto_hash_final(desc, out);
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
2006-05-30 20:04:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
printk("%6u opers/sec, %9lu bytes/sec\n",
|
|
|
|
bcount / sec, ((long)bcount * blen) / sec);
|
|
|
|
|
2006-08-19 19:38:49 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
static int test_hash_cycles_digest(struct hash_desc *desc,
|
|
|
|
struct scatterlist *sg, int blen, char *out)
|
2006-08-19 19:38:49 +08:00
|
|
|
{
|
|
|
|
unsigned long cycles = 0;
|
|
|
|
int i;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
local_bh_disable();
|
|
|
|
local_irq_disable();
|
|
|
|
|
|
|
|
/* Warm-up run. */
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
|
|
ret = crypto_hash_digest(desc, sg, blen, out);
|
|
|
|
if (ret)
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The real thing. */
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
|
cycles_t start, end;
|
|
|
|
|
|
|
|
start = get_cycles();
|
|
|
|
|
|
|
|
ret = crypto_hash_digest(desc, sg, blen, out);
|
|
|
|
if (ret)
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
end = get_cycles();
|
|
|
|
|
|
|
|
cycles += end - start;
|
|
|
|
}
|
|
|
|
|
|
|
|
out:
|
|
|
|
local_irq_enable();
|
|
|
|
local_bh_enable();
|
|
|
|
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
printk("%6lu cycles/operation, %4lu cycles/byte\n",
|
|
|
|
cycles / 8, cycles / (8 * blen));
|
|
|
|
|
|
|
|
return 0;
|
2006-05-30 20:04:19 +08:00
|
|
|
}
|
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
|
|
|
|
int blen, int plen, char *out)
|
2006-05-30 20:04:19 +08:00
|
|
|
{
|
|
|
|
unsigned long cycles = 0;
|
|
|
|
int i, pcount;
|
2006-08-19 19:38:49 +08:00
|
|
|
int ret;
|
|
|
|
|
|
|
|
if (plen == blen)
|
2008-07-31 12:23:53 +08:00
|
|
|
return test_hash_cycles_digest(desc, sg, blen, out);
|
2007-10-27 15:51:21 +08:00
|
|
|
|
2006-05-30 20:04:19 +08:00
|
|
|
local_bh_disable();
|
|
|
|
local_irq_disable();
|
|
|
|
|
|
|
|
/* Warm-up run. */
|
|
|
|
for (i = 0; i < 4; i++) {
|
2006-08-19 19:38:49 +08:00
|
|
|
ret = crypto_hash_init(desc);
|
|
|
|
if (ret)
|
|
|
|
goto out;
|
2006-05-30 20:04:19 +08:00
|
|
|
for (pcount = 0; pcount < blen; pcount += plen) {
|
2006-08-19 19:38:49 +08:00
|
|
|
ret = crypto_hash_update(desc, sg, plen);
|
|
|
|
if (ret)
|
|
|
|
goto out;
|
2006-05-30 20:04:19 +08:00
|
|
|
}
|
2007-05-18 14:25:19 +08:00
|
|
|
ret = crypto_hash_final(desc, out);
|
2006-08-19 19:38:49 +08:00
|
|
|
if (ret)
|
|
|
|
goto out;
|
2006-05-30 20:04:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* The real thing. */
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
|
cycles_t start, end;
|
|
|
|
|
|
|
|
start = get_cycles();
|
|
|
|
|
2006-08-19 19:38:49 +08:00
|
|
|
ret = crypto_hash_init(desc);
|
|
|
|
if (ret)
|
|
|
|
goto out;
|
2006-05-30 20:04:19 +08:00
|
|
|
for (pcount = 0; pcount < blen; pcount += plen) {
|
2006-08-19 19:38:49 +08:00
|
|
|
ret = crypto_hash_update(desc, sg, plen);
|
|
|
|
if (ret)
|
|
|
|
goto out;
|
2006-05-30 20:04:19 +08:00
|
|
|
}
|
2006-08-19 19:38:49 +08:00
|
|
|
ret = crypto_hash_final(desc, out);
|
|
|
|
if (ret)
|
|
|
|
goto out;
|
2006-05-30 20:04:19 +08:00
|
|
|
|
|
|
|
end = get_cycles();
|
|
|
|
|
|
|
|
cycles += end - start;
|
|
|
|
}
|
|
|
|
|
2006-08-19 19:38:49 +08:00
|
|
|
out:
|
2006-05-30 20:04:19 +08:00
|
|
|
local_irq_enable();
|
|
|
|
local_bh_enable();
|
|
|
|
|
2006-08-19 19:38:49 +08:00
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
|
2006-05-30 20:04:19 +08:00
|
|
|
printk("%6lu cycles/operation, %4lu cycles/byte\n",
|
|
|
|
cycles / 8, cycles / (8 * blen));
|
|
|
|
|
2006-08-19 19:38:49 +08:00
|
|
|
return 0;
|
2006-05-30 20:04:19 +08:00
|
|
|
}
|
|
|
|
|
2006-08-19 19:38:49 +08:00
|
|
|
static void test_hash_speed(char *algo, unsigned int sec,
|
|
|
|
struct hash_speed *speed)
|
2006-05-30 20:04:19 +08:00
|
|
|
{
|
2008-07-31 12:23:53 +08:00
|
|
|
struct scatterlist sg[TVMEMSIZE];
|
2006-08-19 19:38:49 +08:00
|
|
|
struct crypto_hash *tfm;
|
|
|
|
struct hash_desc desc;
|
2006-05-30 20:04:19 +08:00
|
|
|
char output[1024];
|
|
|
|
int i;
|
2006-08-19 19:38:49 +08:00
|
|
|
int ret;
|
2006-05-30 20:04:19 +08:00
|
|
|
|
|
|
|
printk("\ntesting speed of %s\n", algo);
|
|
|
|
|
2006-08-19 19:38:49 +08:00
|
|
|
tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
|
2006-05-30 20:04:19 +08:00
|
|
|
|
2006-08-19 19:38:49 +08:00
|
|
|
if (IS_ERR(tfm)) {
|
|
|
|
printk("failed to load transform for %s: %ld\n", algo,
|
|
|
|
PTR_ERR(tfm));
|
2006-05-30 20:04:19 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2006-08-19 19:38:49 +08:00
|
|
|
desc.tfm = tfm;
|
|
|
|
desc.flags = 0;
|
|
|
|
|
|
|
|
if (crypto_hash_digestsize(tfm) > sizeof(output)) {
|
2006-05-30 20:04:19 +08:00
|
|
|
printk("digestsize(%u) > outputbuffer(%zu)\n",
|
2006-08-19 19:38:49 +08:00
|
|
|
crypto_hash_digestsize(tfm), sizeof(output));
|
2006-05-30 20:04:19 +08:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
sg_init_table(sg, TVMEMSIZE);
|
|
|
|
for (i = 0; i < TVMEMSIZE; i++) {
|
|
|
|
sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
|
|
|
|
memset(tvmem[i], 0xff, PAGE_SIZE);
|
|
|
|
}
|
|
|
|
|
2006-05-30 20:04:19 +08:00
|
|
|
for (i = 0; speed[i].blen != 0; i++) {
|
2008-07-31 12:23:53 +08:00
|
|
|
if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
|
|
|
|
printk("template (%u) too big for tvmem (%lu)\n",
|
|
|
|
speed[i].blen, TVMEMSIZE * PAGE_SIZE);
|
2006-05-30 20:04:19 +08:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
printk("test%3u (%5u byte blocks,%5u bytes per update,%4u updates): ",
|
|
|
|
i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
|
|
|
|
|
|
|
|
if (sec)
|
2008-07-31 12:23:53 +08:00
|
|
|
ret = test_hash_jiffies(&desc, sg, speed[i].blen,
|
2006-08-19 19:38:49 +08:00
|
|
|
speed[i].plen, output, sec);
|
2006-05-30 20:04:19 +08:00
|
|
|
else
|
2008-07-31 12:23:53 +08:00
|
|
|
ret = test_hash_cycles(&desc, sg, speed[i].blen,
|
2006-08-19 19:38:49 +08:00
|
|
|
speed[i].plen, output);
|
|
|
|
|
|
|
|
if (ret) {
|
|
|
|
printk("hashing failed ret=%d\n", ret);
|
|
|
|
break;
|
|
|
|
}
|
2006-05-30 20:04:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
out:
|
2006-08-19 19:38:49 +08:00
|
|
|
crypto_free_hash(tfm);
|
2006-05-30 20:04:19 +08:00
|
|
|
}
|
|
|
|
|
2008-07-31 14:03:44 +08:00
|
|
|
static int test_comp(char *algo, struct comp_testvec *ctemplate,
|
|
|
|
struct comp_testvec *dtemplate, int ctcount, int dtcount)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
|
|
|
unsigned int i;
|
|
|
|
char result[COMP_BUF_SIZE];
|
2006-08-26 16:12:40 +08:00
|
|
|
struct crypto_comp *tfm;
|
2008-07-31 14:03:44 +08:00
|
|
|
int ret;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-12-07 16:48:11 +08:00
|
|
|
tfm = crypto_alloc_comp(algo, 0, CRYPTO_ALG_ASYNC);
|
2007-03-21 05:58:43 +08:00
|
|
|
if (IS_ERR(tfm)) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
|
|
|
|
"%ld\n", algo, PTR_ERR(tfm));
|
|
|
|
return PTR_ERR(tfm);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2007-12-07 16:48:11 +08:00
|
|
|
for (i = 0; i < ctcount; i++) {
|
2008-07-31 14:03:44 +08:00
|
|
|
int ilen, dlen = COMP_BUF_SIZE;
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
memset(result, 0, sizeof (result));
|
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
ilen = ctemplate[i].inlen;
|
|
|
|
ret = crypto_comp_compress(tfm, ctemplate[i].input,
|
2005-04-17 06:20:36 +08:00
|
|
|
ilen, result, &dlen);
|
|
|
|
if (ret) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: comp: compression failed "
|
|
|
|
"on test %d for %s: ret=%d\n", i + 1, algo,
|
|
|
|
-ret);
|
|
|
|
goto out;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2008-07-31 14:03:44 +08:00
|
|
|
if (memcmp(result, ctemplate[i].output, dlen)) {
|
|
|
|
printk(KERN_ERR "alg: comp: Compression test %d "
|
|
|
|
"failed for %s\n", i + 1, algo);
|
|
|
|
hexdump(result, dlen);
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-12-07 16:48:11 +08:00
|
|
|
for (i = 0; i < dtcount; i++) {
|
2005-04-17 06:20:36 +08:00
|
|
|
int ilen, ret, dlen = COMP_BUF_SIZE;
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
memset(result, 0, sizeof (result));
|
|
|
|
|
2008-03-13 20:20:28 +08:00
|
|
|
ilen = dtemplate[i].inlen;
|
|
|
|
ret = crypto_comp_decompress(tfm, dtemplate[i].input,
|
2005-04-17 06:20:36 +08:00
|
|
|
ilen, result, &dlen);
|
|
|
|
if (ret) {
|
2008-07-31 14:03:44 +08:00
|
|
|
printk(KERN_ERR "alg: comp: decompression failed "
|
|
|
|
"on test %d for %s: ret=%d\n", i + 1, algo,
|
|
|
|
-ret);
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (memcmp(result, dtemplate[i].output, dlen)) {
|
|
|
|
printk(KERN_ERR "alg: comp: Decompression test %d "
|
|
|
|
"failed for %s\n", i + 1, algo);
|
|
|
|
hexdump(result, dlen);
|
|
|
|
ret = -EINVAL;
|
|
|
|
goto out;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
}
|
2008-07-31 12:23:53 +08:00
|
|
|
|
2008-07-31 14:03:44 +08:00
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
out:
|
2006-08-26 16:12:40 +08:00
|
|
|
crypto_free_comp(tfm);
|
2008-07-31 14:03:44 +08:00
|
|
|
return ret;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2005-06-23 04:26:03 +08:00
|
|
|
static void test_available(void)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
|
|
|
char **name = check;
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
while (*name) {
|
|
|
|
printk("alg %s ", *name);
|
2007-04-04 15:41:07 +08:00
|
|
|
printk(crypto_has_alg(*name, 0, 0) ?
|
2006-08-26 16:12:40 +08:00
|
|
|
"found\n" : "not found\n");
|
2005-04-17 06:20:36 +08:00
|
|
|
name++;
|
2005-06-23 04:26:03 +08:00
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2005-06-23 04:26:03 +08:00
|
|
|
static void do_test(void)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
|
|
|
switch (mode) {
|
|
|
|
|
|
|
|
case 0:
|
|
|
|
test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
//DES
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
|
|
|
|
DES_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
|
|
|
|
DES_DEC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
|
|
|
|
DES_CBC_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
|
|
|
|
DES_CBC_DEC_TEST_VECTORS);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
//DES3_EDE
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
|
|
|
|
DES3_EDE_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
|
|
|
|
DES3_EDE_DEC_TEST_VECTORS);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2008-06-03 18:00:16 +08:00
|
|
|
test_cipher("cbc(des3_ede)", ENCRYPT,
|
|
|
|
des3_ede_cbc_enc_tv_template,
|
|
|
|
DES3_EDE_CBC_ENC_TEST_VECTORS);
|
|
|
|
|
|
|
|
test_cipher("cbc(des3_ede)", DECRYPT,
|
|
|
|
des3_ede_cbc_dec_tv_template,
|
|
|
|
DES3_EDE_CBC_DEC_TEST_VECTORS);
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2007-11-10 20:08:25 +08:00
|
|
|
test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
//BLOWFISH
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
|
|
|
|
BF_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
|
|
|
|
BF_DEC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
|
|
|
|
BF_CBC_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
|
|
|
|
BF_CBC_DEC_TEST_VECTORS);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
//TWOFISH
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
|
|
|
|
TF_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
|
|
|
|
TF_DEC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
|
|
|
|
TF_CBC_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
|
|
|
|
TF_CBC_DEC_TEST_VECTORS);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
//SERPENT
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
|
|
|
|
SERPENT_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
|
|
|
|
SERPENT_DEC_TEST_VECTORS);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
//TNEPRES
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
|
|
|
|
TNEPRES_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
|
|
|
|
TNEPRES_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
//AES
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
|
|
|
|
AES_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
|
|
|
|
AES_DEC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
|
|
|
|
AES_CBC_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
|
|
|
|
AES_CBC_DEC_TEST_VECTORS);
|
2006-11-29 16:01:41 +08:00
|
|
|
test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
|
|
|
|
AES_LRW_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
|
|
|
|
AES_LRW_DEC_TEST_VECTORS);
|
2007-09-19 20:23:13 +08:00
|
|
|
test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
|
|
|
|
AES_XTS_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
|
|
|
|
AES_XTS_DEC_TEST_VECTORS);
|
2007-12-17 21:34:32 +08:00
|
|
|
test_cipher("rfc3686(ctr(aes))", ENCRYPT, aes_ctr_enc_tv_template,
|
[CRYPTO] ctr: Add CTR (Counter) block cipher mode
This patch implements CTR mode for IPsec.
It is based off of RFC 3686.
Please note:
1. CTR turns a block cipher into a stream cipher.
Encryption is done in blocks, however the last block
may be a partial block.
A "counter block" is encrypted, creating a keystream
that is xor'ed with the plaintext. The counter portion
of the counter block is incremented after each block
of plaintext is encrypted.
Decryption is performed in same manner.
2. The CTR counterblock is composed of,
nonce + IV + counter
The size of the counterblock is equivalent to the
blocksize of the cipher.
sizeof(nonce) + sizeof(IV) + sizeof(counter) = blocksize
The CTR template requires the name of the cipher
algorithm, the sizeof the nonce, and the sizeof the iv.
ctr(cipher,sizeof_nonce,sizeof_iv)
So for example,
ctr(aes,4,8)
specifies the counterblock will be composed of 4 bytes
from a nonce, 8 bytes from the iv, and 4 bytes for counter
since aes has a blocksize of 16 bytes.
3. The counter portion of the counter block is stored
in big endian for conformance to rfc 3686.
Signed-off-by: Joy Latten <latten@austin.ibm.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2007-10-23 08:50:32 +08:00
|
|
|
AES_CTR_ENC_TEST_VECTORS);
|
2007-12-17 21:34:32 +08:00
|
|
|
test_cipher("rfc3686(ctr(aes))", DECRYPT, aes_ctr_dec_tv_template,
|
[CRYPTO] ctr: Add CTR (Counter) block cipher mode
This patch implements CTR mode for IPsec.
It is based off of RFC 3686.
Please note:
1. CTR turns a block cipher into a stream cipher.
Encryption is done in blocks, however the last block
may be a partial block.
A "counter block" is encrypted, creating a keystream
that is xor'ed with the plaintext. The counter portion
of the counter block is incremented after each block
of plaintext is encrypted.
Decryption is performed in same manner.
2. The CTR counterblock is composed of,
nonce + IV + counter
The size of the counterblock is equivalent to the
blocksize of the cipher.
sizeof(nonce) + sizeof(IV) + sizeof(counter) = blocksize
The CTR template requires the name of the cipher
algorithm, the sizeof the nonce, and the sizeof the iv.
ctr(cipher,sizeof_nonce,sizeof_iv)
So for example,
ctr(aes,4,8)
specifies the counterblock will be composed of 4 bytes
from a nonce, 8 bytes from the iv, and 4 bytes for counter
since aes has a blocksize of 16 bytes.
3. The counter portion of the counter block is stored
in big endian for conformance to rfc 3686.
Signed-off-by: Joy Latten <latten@austin.ibm.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2007-10-23 08:50:32 +08:00
|
|
|
AES_CTR_DEC_TEST_VECTORS);
|
2007-11-26 22:24:11 +08:00
|
|
|
test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template,
|
|
|
|
AES_GCM_ENC_TEST_VECTORS);
|
|
|
|
test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template,
|
|
|
|
AES_GCM_DEC_TEST_VECTORS);
|
2007-12-12 20:24:22 +08:00
|
|
|
test_aead("ccm(aes)", ENCRYPT, aes_ccm_enc_tv_template,
|
|
|
|
AES_CCM_ENC_TEST_VECTORS);
|
|
|
|
test_aead("ccm(aes)", DECRYPT, aes_ccm_dec_tv_template,
|
|
|
|
AES_CCM_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
//CAST5
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
|
|
|
|
CAST5_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
|
|
|
|
CAST5_DEC_TEST_VECTORS);
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
//CAST6
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
|
|
|
|
CAST6_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
|
|
|
|
CAST6_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
//ARC4
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
|
|
|
|
ARC4_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
|
|
|
|
ARC4_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
//TEA
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
|
|
|
|
TEA_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
|
|
|
|
TEA_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
|
|
|
|
//XTEA
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
|
|
|
|
XTEA_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
|
|
|
|
XTEA_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
//KHAZAD
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
|
|
|
|
KHAZAD_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
|
|
|
|
KHAZAD_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
//ANUBIS
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
|
|
|
|
ANUBIS_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
|
|
|
|
ANUBIS_DEC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
|
|
|
|
ANUBIS_CBC_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
|
|
|
|
ANUBIS_CBC_ENC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2005-09-02 08:42:46 +08:00
|
|
|
//XETA
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
|
|
|
|
XETA_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
|
|
|
|
XETA_DEC_TEST_VECTORS);
|
2005-09-02 08:42:46 +08:00
|
|
|
|
2006-12-16 09:13:14 +08:00
|
|
|
//FCrypt
|
|
|
|
test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
|
|
|
|
FCRYPT_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
|
|
|
|
FCRYPT_DEC_TEST_VECTORS);
|
|
|
|
|
2007-01-24 18:48:19 +08:00
|
|
|
//CAMELLIA
|
|
|
|
test_cipher("ecb(camellia)", ENCRYPT,
|
|
|
|
camellia_enc_tv_template,
|
|
|
|
CAMELLIA_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(camellia)", DECRYPT,
|
|
|
|
camellia_dec_tv_template,
|
|
|
|
CAMELLIA_DEC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(camellia)", ENCRYPT,
|
|
|
|
camellia_cbc_enc_tv_template,
|
|
|
|
CAMELLIA_CBC_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(camellia)", DECRYPT,
|
|
|
|
camellia_cbc_dec_tv_template,
|
|
|
|
CAMELLIA_CBC_DEC_TEST_VECTORS);
|
|
|
|
|
2007-08-21 20:01:03 +08:00
|
|
|
//SEED
|
|
|
|
test_cipher("ecb(seed)", ENCRYPT, seed_enc_tv_template,
|
|
|
|
SEED_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(seed)", DECRYPT, seed_dec_tv_template,
|
|
|
|
SEED_DEC_TEST_VECTORS);
|
|
|
|
|
2008-03-24 21:26:16 +08:00
|
|
|
//CTS
|
|
|
|
test_cipher("cts(cbc(aes))", ENCRYPT, cts_mode_enc_tv_template,
|
|
|
|
CTS_MODE_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cts(cbc(aes))", DECRYPT, cts_mode_dec_tv_template,
|
|
|
|
CTS_MODE_DEC_TEST_VECTORS);
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
|
|
|
|
test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
|
|
|
|
test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
|
|
|
|
test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
|
|
|
|
test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
|
|
|
|
test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
|
|
|
|
test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
|
|
|
|
test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
|
2007-12-07 16:48:11 +08:00
|
|
|
test_comp("deflate", deflate_comp_tv_template,
|
|
|
|
deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
|
|
|
|
DEFLATE_DECOMP_TEST_VECTORS);
|
2007-12-07 16:53:23 +08:00
|
|
|
test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template,
|
|
|
|
LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS);
|
2006-08-21 20:04:03 +08:00
|
|
|
test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash("hmac(md5)", hmac_md5_tv_template,
|
|
|
|
HMAC_MD5_TEST_VECTORS);
|
|
|
|
test_hash("hmac(sha1)", hmac_sha1_tv_template,
|
|
|
|
HMAC_SHA1_TEST_VECTORS);
|
2007-11-10 20:08:25 +08:00
|
|
|
test_hash("hmac(sha224)", hmac_sha224_tv_template,
|
|
|
|
HMAC_SHA224_TEST_VECTORS);
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash("hmac(sha256)", hmac_sha256_tv_template,
|
|
|
|
HMAC_SHA256_TEST_VECTORS);
|
2006-12-10 09:10:20 +08:00
|
|
|
test_hash("hmac(sha384)", hmac_sha384_tv_template,
|
|
|
|
HMAC_SHA384_TEST_VECTORS);
|
|
|
|
test_hash("hmac(sha512)", hmac_sha512_tv_template,
|
|
|
|
HMAC_SHA512_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2006-10-28 11:18:53 +08:00
|
|
|
test_hash("xcbc(aes)", aes_xcbc128_tv_template,
|
|
|
|
XCBC_AES_TEST_VECTORS);
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 1:
|
|
|
|
test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 2:
|
|
|
|
test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 3:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
|
|
|
|
DES_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
|
|
|
|
DES_DEC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
|
|
|
|
DES_CBC_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
|
|
|
|
DES_CBC_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 4:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
|
|
|
|
DES3_EDE_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
|
|
|
|
DES3_EDE_DEC_TEST_VECTORS);
|
2008-06-03 18:00:16 +08:00
|
|
|
|
|
|
|
test_cipher("cbc(des3_ede)", ENCRYPT,
|
|
|
|
des3_ede_cbc_enc_tv_template,
|
|
|
|
DES3_EDE_CBC_ENC_TEST_VECTORS);
|
|
|
|
|
|
|
|
test_cipher("cbc(des3_ede)", DECRYPT,
|
|
|
|
des3_ede_cbc_dec_tv_template,
|
|
|
|
DES3_EDE_CBC_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 5:
|
|
|
|
test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
|
|
|
|
break;
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
case 6:
|
|
|
|
test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
|
|
|
|
break;
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
case 7:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
|
|
|
|
BF_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
|
|
|
|
BF_DEC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
|
|
|
|
BF_CBC_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
|
|
|
|
BF_CBC_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 8:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
|
|
|
|
TF_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
|
|
|
|
TF_DEC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
|
|
|
|
TF_CBC_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
|
|
|
|
TF_CBC_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
case 9:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
|
|
|
|
SERPENT_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
|
|
|
|
SERPENT_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 10:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
|
|
|
|
AES_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
|
|
|
|
AES_DEC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
|
|
|
|
AES_CBC_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
|
|
|
|
AES_CBC_DEC_TEST_VECTORS);
|
2006-11-29 16:01:41 +08:00
|
|
|
test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
|
|
|
|
AES_LRW_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
|
|
|
|
AES_LRW_DEC_TEST_VECTORS);
|
2007-09-19 20:23:13 +08:00
|
|
|
test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
|
|
|
|
AES_XTS_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
|
|
|
|
AES_XTS_DEC_TEST_VECTORS);
|
2007-12-17 21:34:32 +08:00
|
|
|
test_cipher("rfc3686(ctr(aes))", ENCRYPT, aes_ctr_enc_tv_template,
|
[CRYPTO] ctr: Add CTR (Counter) block cipher mode
This patch implements CTR mode for IPsec.
It is based off of RFC 3686.
Please note:
1. CTR turns a block cipher into a stream cipher.
Encryption is done in blocks, however the last block
may be a partial block.
A "counter block" is encrypted, creating a keystream
that is xor'ed with the plaintext. The counter portion
of the counter block is incremented after each block
of plaintext is encrypted.
Decryption is performed in same manner.
2. The CTR counterblock is composed of,
nonce + IV + counter
The size of the counterblock is equivalent to the
blocksize of the cipher.
sizeof(nonce) + sizeof(IV) + sizeof(counter) = blocksize
The CTR template requires the name of the cipher
algorithm, the sizeof the nonce, and the sizeof the iv.
ctr(cipher,sizeof_nonce,sizeof_iv)
So for example,
ctr(aes,4,8)
specifies the counterblock will be composed of 4 bytes
from a nonce, 8 bytes from the iv, and 4 bytes for counter
since aes has a blocksize of 16 bytes.
3. The counter portion of the counter block is stored
in big endian for conformance to rfc 3686.
Signed-off-by: Joy Latten <latten@austin.ibm.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2007-10-23 08:50:32 +08:00
|
|
|
AES_CTR_ENC_TEST_VECTORS);
|
2007-12-17 21:34:32 +08:00
|
|
|
test_cipher("rfc3686(ctr(aes))", DECRYPT, aes_ctr_dec_tv_template,
|
[CRYPTO] ctr: Add CTR (Counter) block cipher mode
This patch implements CTR mode for IPsec.
It is based off of RFC 3686.
Please note:
1. CTR turns a block cipher into a stream cipher.
Encryption is done in blocks, however the last block
may be a partial block.
A "counter block" is encrypted, creating a keystream
that is xor'ed with the plaintext. The counter portion
of the counter block is incremented after each block
of plaintext is encrypted.
Decryption is performed in same manner.
2. The CTR counterblock is composed of,
nonce + IV + counter
The size of the counterblock is equivalent to the
blocksize of the cipher.
sizeof(nonce) + sizeof(IV) + sizeof(counter) = blocksize
The CTR template requires the name of the cipher
algorithm, the sizeof the nonce, and the sizeof the iv.
ctr(cipher,sizeof_nonce,sizeof_iv)
So for example,
ctr(aes,4,8)
specifies the counterblock will be composed of 4 bytes
from a nonce, 8 bytes from the iv, and 4 bytes for counter
since aes has a blocksize of 16 bytes.
3. The counter portion of the counter block is stored
in big endian for conformance to rfc 3686.
Signed-off-by: Joy Latten <latten@austin.ibm.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2007-10-23 08:50:32 +08:00
|
|
|
AES_CTR_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 11:
|
|
|
|
test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
|
|
|
|
break;
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
case 12:
|
|
|
|
test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 13:
|
2007-12-07 16:48:11 +08:00
|
|
|
test_comp("deflate", deflate_comp_tv_template,
|
|
|
|
deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
|
|
|
|
DEFLATE_DECOMP_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 14:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
|
|
|
|
CAST5_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
|
|
|
|
CAST5_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 15:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
|
|
|
|
CAST6_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
|
|
|
|
CAST6_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 16:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
|
|
|
|
ARC4_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
|
|
|
|
ARC4_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 17:
|
|
|
|
test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 18:
|
2006-08-21 20:04:03 +08:00
|
|
|
test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 19:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
|
|
|
|
TEA_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
|
|
|
|
TEA_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 20:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
|
|
|
|
XTEA_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
|
|
|
|
XTEA_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 21:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
|
|
|
|
KHAZAD_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
|
|
|
|
KHAZAD_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 22:
|
|
|
|
test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 23:
|
|
|
|
test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 24:
|
|
|
|
test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 25:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
|
|
|
|
TNEPRES_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
|
|
|
|
TNEPRES_DEC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 26:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
|
|
|
|
ANUBIS_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
|
|
|
|
ANUBIS_DEC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
|
|
|
|
ANUBIS_CBC_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
|
|
|
|
ANUBIS_CBC_ENC_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 27:
|
|
|
|
test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 28:
|
|
|
|
|
|
|
|
test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 29:
|
|
|
|
test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
|
|
|
|
break;
|
2008-05-09 21:29:35 +08:00
|
|
|
|
2005-09-02 08:42:46 +08:00
|
|
|
case 30:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
|
|
|
|
XETA_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
|
|
|
|
XETA_DEC_TEST_VECTORS);
|
2005-09-02 08:42:46 +08:00
|
|
|
break;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2006-12-16 09:13:14 +08:00
|
|
|
case 31:
|
|
|
|
test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
|
|
|
|
FCRYPT_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
|
|
|
|
FCRYPT_DEC_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
2007-01-24 18:48:19 +08:00
|
|
|
case 32:
|
|
|
|
test_cipher("ecb(camellia)", ENCRYPT,
|
|
|
|
camellia_enc_tv_template,
|
|
|
|
CAMELLIA_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("ecb(camellia)", DECRYPT,
|
|
|
|
camellia_dec_tv_template,
|
|
|
|
CAMELLIA_DEC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(camellia)", ENCRYPT,
|
|
|
|
camellia_cbc_enc_tv_template,
|
|
|
|
CAMELLIA_CBC_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cbc(camellia)", DECRYPT,
|
|
|
|
camellia_cbc_dec_tv_template,
|
|
|
|
CAMELLIA_CBC_DEC_TEST_VECTORS);
|
|
|
|
break;
|
2007-11-10 20:08:25 +08:00
|
|
|
case 33:
|
|
|
|
test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);
|
|
|
|
break;
|
2007-01-24 18:48:19 +08:00
|
|
|
|
2007-11-23 19:45:00 +08:00
|
|
|
case 34:
|
|
|
|
test_cipher("salsa20", ENCRYPT,
|
|
|
|
salsa20_stream_enc_tv_template,
|
|
|
|
SALSA20_STREAM_ENC_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
2007-12-02 11:55:47 +08:00
|
|
|
case 35:
|
|
|
|
test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template,
|
|
|
|
AES_GCM_ENC_TEST_VECTORS);
|
|
|
|
test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template,
|
|
|
|
AES_GCM_DEC_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
2007-12-07 16:53:23 +08:00
|
|
|
case 36:
|
|
|
|
test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template,
|
|
|
|
LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
2007-12-12 20:24:22 +08:00
|
|
|
case 37:
|
|
|
|
test_aead("ccm(aes)", ENCRYPT, aes_ccm_enc_tv_template,
|
|
|
|
AES_CCM_ENC_TEST_VECTORS);
|
|
|
|
test_aead("ccm(aes)", DECRYPT, aes_ccm_dec_tv_template,
|
|
|
|
AES_CCM_DEC_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
2008-03-24 21:26:16 +08:00
|
|
|
case 38:
|
|
|
|
test_cipher("cts(cbc(aes))", ENCRYPT, cts_mode_enc_tv_template,
|
|
|
|
CTS_MODE_ENC_TEST_VECTORS);
|
|
|
|
test_cipher("cts(cbc(aes))", DECRYPT, cts_mode_dec_tv_template,
|
|
|
|
CTS_MODE_DEC_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
2008-05-07 22:16:36 +08:00
|
|
|
case 39:
|
|
|
|
test_hash("rmd128", rmd128_tv_template, RMD128_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 40:
|
|
|
|
test_hash("rmd160", rmd160_tv_template, RMD160_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
2008-05-09 21:29:35 +08:00
|
|
|
case 41:
|
|
|
|
test_hash("rmd256", rmd256_tv_template, RMD256_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 42:
|
|
|
|
test_hash("rmd320", rmd320_tv_template, RMD320_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
case 100:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash("hmac(md5)", hmac_md5_tv_template,
|
|
|
|
HMAC_MD5_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
case 101:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash("hmac(sha1)", hmac_sha1_tv_template,
|
|
|
|
HMAC_SHA1_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
case 102:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash("hmac(sha256)", hmac_sha256_tv_template,
|
|
|
|
HMAC_SHA256_TEST_VECTORS);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
|
2006-12-10 09:10:20 +08:00
|
|
|
case 103:
|
|
|
|
test_hash("hmac(sha384)", hmac_sha384_tv_template,
|
|
|
|
HMAC_SHA384_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 104:
|
|
|
|
test_hash("hmac(sha512)", hmac_sha512_tv_template,
|
|
|
|
HMAC_SHA512_TEST_VECTORS);
|
|
|
|
break;
|
2008-01-01 12:59:28 +08:00
|
|
|
|
2007-11-10 20:08:25 +08:00
|
|
|
case 105:
|
|
|
|
test_hash("hmac(sha224)", hmac_sha224_tv_template,
|
|
|
|
HMAC_SHA224_TEST_VECTORS);
|
|
|
|
break;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-01-01 12:59:28 +08:00
|
|
|
case 106:
|
|
|
|
test_hash("xcbc(aes)", aes_xcbc128_tv_template,
|
|
|
|
XCBC_AES_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
2008-05-07 22:16:36 +08:00
|
|
|
case 107:
|
|
|
|
test_hash("hmac(rmd128)", hmac_rmd128_tv_template,
|
|
|
|
HMAC_RMD128_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 108:
|
|
|
|
test_hash("hmac(rmd160)", hmac_rmd160_tv_template,
|
|
|
|
HMAC_RMD160_TEST_VECTORS);
|
|
|
|
break;
|
|
|
|
|
2005-06-23 04:27:23 +08:00
|
|
|
case 200:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_24_32);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_24_32);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_24_32);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_24_32);
|
2006-11-29 16:01:41 +08:00
|
|
|
test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_32_40_48);
|
2006-11-29 16:01:41 +08:00
|
|
|
test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_32_40_48);
|
2007-09-19 20:23:13 +08:00
|
|
|
test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_32_48_64);
|
2007-09-19 20:23:13 +08:00
|
|
|
test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_32_48_64);
|
2005-06-23 04:27:23 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 201:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
|
2008-03-11 21:24:26 +08:00
|
|
|
des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
|
|
|
|
speed_template_24);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
|
2008-03-11 21:24:26 +08:00
|
|
|
des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
|
|
|
|
speed_template_24);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
|
2008-03-11 21:24:26 +08:00
|
|
|
des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
|
|
|
|
speed_template_24);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
|
2008-03-11 21:24:26 +08:00
|
|
|
des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
|
|
|
|
speed_template_24);
|
2005-06-23 04:27:23 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 202:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_24_32);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_24_32);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_24_32);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_24_32);
|
2005-06-23 04:27:23 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 203:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_8_32);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_8_32);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_8_32);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_8_32);
|
2005-06-23 04:27:23 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 204:
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_8);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_8);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_8);
|
2006-08-13 06:26:09 +08:00
|
|
|
test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_8);
|
2005-06-23 04:27:23 +08:00
|
|
|
break;
|
|
|
|
|
2007-01-24 18:48:19 +08:00
|
|
|
case 205:
|
|
|
|
test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_24_32);
|
2007-01-24 18:48:19 +08:00
|
|
|
test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_24_32);
|
2007-01-24 18:48:19 +08:00
|
|
|
test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_24_32);
|
2007-01-24 18:48:19 +08:00
|
|
|
test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_24_32);
|
2007-01-24 18:48:19 +08:00
|
|
|
break;
|
|
|
|
|
2007-12-07 17:17:43 +08:00
|
|
|
case 206:
|
|
|
|
test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
|
2008-03-11 21:24:26 +08:00
|
|
|
speed_template_16_32);
|
2007-12-07 17:17:43 +08:00
|
|
|
break;
|
|
|
|
|
2006-05-30 20:04:19 +08:00
|
|
|
case 300:
|
|
|
|
/* fall through */
|
|
|
|
|
|
|
|
case 301:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash_speed("md4", sec, generic_hash_speed_template);
|
2006-05-30 20:04:19 +08:00
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 302:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash_speed("md5", sec, generic_hash_speed_template);
|
2006-05-30 20:04:19 +08:00
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 303:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash_speed("sha1", sec, generic_hash_speed_template);
|
2006-05-30 20:04:19 +08:00
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 304:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash_speed("sha256", sec, generic_hash_speed_template);
|
2006-05-30 20:04:19 +08:00
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 305:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash_speed("sha384", sec, generic_hash_speed_template);
|
2006-05-30 20:04:19 +08:00
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 306:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash_speed("sha512", sec, generic_hash_speed_template);
|
2006-05-30 20:04:19 +08:00
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 307:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash_speed("wp256", sec, generic_hash_speed_template);
|
2006-05-30 20:04:19 +08:00
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 308:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash_speed("wp384", sec, generic_hash_speed_template);
|
2006-05-30 20:04:19 +08:00
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 309:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash_speed("wp512", sec, generic_hash_speed_template);
|
2006-05-30 20:04:19 +08:00
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 310:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash_speed("tgr128", sec, generic_hash_speed_template);
|
2006-05-30 20:04:19 +08:00
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 311:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash_speed("tgr160", sec, generic_hash_speed_template);
|
2006-05-30 20:04:19 +08:00
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 312:
|
2006-08-19 19:38:49 +08:00
|
|
|
test_hash_speed("tgr192", sec, generic_hash_speed_template);
|
2006-05-30 20:04:19 +08:00
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
2007-11-10 20:08:25 +08:00
|
|
|
case 313:
|
|
|
|
test_hash_speed("sha224", sec, generic_hash_speed_template);
|
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
2008-05-07 22:16:36 +08:00
|
|
|
case 314:
|
|
|
|
test_hash_speed("rmd128", sec, generic_hash_speed_template);
|
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 315:
|
|
|
|
test_hash_speed("rmd160", sec, generic_hash_speed_template);
|
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
2008-05-09 21:29:35 +08:00
|
|
|
case 316:
|
|
|
|
test_hash_speed("rmd256", sec, generic_hash_speed_template);
|
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
|
|
|
case 317:
|
|
|
|
test_hash_speed("rmd320", sec, generic_hash_speed_template);
|
|
|
|
if (mode > 300 && mode < 400) break;
|
|
|
|
|
2006-05-30 20:04:19 +08:00
|
|
|
case 399:
|
|
|
|
break;
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
case 1000:
|
|
|
|
test_available();
|
|
|
|
break;
|
2005-06-23 04:26:03 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
default:
|
|
|
|
/* useful for debugging */
|
|
|
|
printk("not testing anything\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-04-05 21:00:57 +08:00
|
|
|
static int __init tcrypt_mod_init(void)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2007-11-26 22:12:07 +08:00
|
|
|
int err = -ENOMEM;
|
2008-07-31 12:23:53 +08:00
|
|
|
int i;
|
2007-11-26 22:12:07 +08:00
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
for (i = 0; i < TVMEMSIZE; i++) {
|
|
|
|
tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
|
|
|
|
if (!tvmem[i])
|
|
|
|
goto err_free_tv;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
for (i = 0; i < XBUFSIZE; i++) {
|
|
|
|
xbuf[i] = (void *)__get_free_page(GFP_KERNEL);
|
|
|
|
if (!xbuf[i])
|
|
|
|
goto err_free_xbuf;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
for (i = 0; i < XBUFSIZE; i++) {
|
|
|
|
axbuf[i] = (void *)__get_free_page(GFP_KERNEL);
|
|
|
|
if (!axbuf[i])
|
|
|
|
goto err_free_axbuf;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-11-26 22:12:07 +08:00
|
|
|
do_test();
|
2006-05-30 12:49:38 +08:00
|
|
|
|
|
|
|
/* We intentionaly return -EAGAIN to prevent keeping
|
|
|
|
* the module. It does all its work from init()
|
|
|
|
* and doesn't offer any runtime functionality
|
|
|
|
* => we don't need it in the memory, do we?
|
|
|
|
* -- mludvig
|
|
|
|
*/
|
2007-11-26 22:12:07 +08:00
|
|
|
err = -EAGAIN;
|
|
|
|
|
2008-07-31 12:23:53 +08:00
|
|
|
err_free_axbuf:
|
|
|
|
for (i = 0; i < XBUFSIZE && axbuf[i]; i++)
|
|
|
|
free_page((unsigned long)axbuf[i]);
|
|
|
|
err_free_xbuf:
|
|
|
|
for (i = 0; i < XBUFSIZE && xbuf[i]; i++)
|
|
|
|
free_page((unsigned long)xbuf[i]);
|
|
|
|
err_free_tv:
|
|
|
|
for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
|
|
|
|
free_page((unsigned long)tvmem[i]);
|
2007-11-26 22:12:07 +08:00
|
|
|
|
|
|
|
return err;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If an init function is provided, an exit function must also be provided
|
|
|
|
* to allow module unload.
|
|
|
|
*/
|
2008-04-05 21:00:57 +08:00
|
|
|
static void __exit tcrypt_mod_fini(void) { }
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-04-05 21:00:57 +08:00
|
|
|
module_init(tcrypt_mod_init);
|
|
|
|
module_exit(tcrypt_mod_fini);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
module_param(mode, int, 0);
|
2005-06-23 04:27:23 +08:00
|
|
|
module_param(sec, uint, 0);
|
2005-06-23 04:29:03 +08:00
|
|
|
MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
|
|
|
|
"(defaults to zero which uses CPU cycles instead)");
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
MODULE_LICENSE("GPL");
|
|
|
|
MODULE_DESCRIPTION("Quick & dirty crypto testing module");
|
|
|
|
MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");
|