blob: b6d4b5ce00a365e89a57a2433db0a4a876aa033c [file] [log] [blame]
Herbert Xuef2736f2005-06-22 13:26:03 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * Quick & dirty crypto testing module.
3 *
4 * This will only exist until we have a better testing mechanism
5 * (e.g. a char device).
6 *
7 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
8 * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
Mikko Herranene3a4ea42007-11-26 22:12:07 +08009 * Copyright (c) 2007 Nokia Siemens Networks
Linus Torvalds1da177e2005-04-16 15:20:36 -070010 *
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the Free
Herbert Xuef2736f2005-06-22 13:26:03 -070013 * Software Foundation; either version 2 of the License, or (at your option)
Linus Torvalds1da177e2005-04-16 15:20:36 -070014 * any later version.
15 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070016 */
17
Herbert Xu18e33e62008-07-10 16:01:22 +080018#include <crypto/hash.h>
Herbert Xucba83562006-08-13 08:26:09 +100019#include <linux/err.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070020#include <linux/init.h>
21#include <linux/module.h>
22#include <linux/mm.h>
23#include <linux/slab.h>
David Hardeman378f0582005-09-17 17:55:31 +100024#include <linux/scatterlist.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070025#include <linux/string.h>
26#include <linux/crypto.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <linux/moduleparam.h>
Harald Welteebfd9bc2005-06-22 13:27:23 -070028#include <linux/jiffies.h>
Herbert Xu6a179442005-06-22 13:29:03 -070029#include <linux/timex.h>
30#include <linux/interrupt.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include "tcrypt.h"
32
33/*
Herbert Xuf139cfa2008-07-31 12:23:53 +080034 * Need slab memory for testing (size in number of pages).
Linus Torvalds1da177e2005-04-16 15:20:36 -070035 */
Herbert Xuf139cfa2008-07-31 12:23:53 +080036#define TVMEMSIZE 4
37#define XBUFSIZE 8
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
39/*
40 * Indexes into the xbuf to simulate cross-page access.
41 */
Patrick McHardya558f1d2008-05-08 19:27:47 +080042#define IDX1 32
Linus Torvalds1da177e2005-04-16 15:20:36 -070043#define IDX2 32400
44#define IDX3 1
45#define IDX4 8193
46#define IDX5 22222
47#define IDX6 17101
48#define IDX7 27333
49#define IDX8 3000
50
51/*
52* Used by test_cipher()
53*/
54#define ENCRYPT 1
55#define DECRYPT 0
Linus Torvalds1da177e2005-04-16 15:20:36 -070056
Herbert Xu6158efc2007-04-04 17:41:07 +100057struct tcrypt_result {
58 struct completion completion;
59 int err;
60};
61
Linus Torvalds1da177e2005-04-16 15:20:36 -070062static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
63
Harald Welteebfd9bc2005-06-22 13:27:23 -070064/*
65 * Used by test_cipher_speed()
66 */
Herbert Xu6a179442005-06-22 13:29:03 -070067static unsigned int sec;
Harald Welteebfd9bc2005-06-22 13:27:23 -070068
Linus Torvalds1da177e2005-04-16 15:20:36 -070069static int mode;
Herbert Xuf139cfa2008-07-31 12:23:53 +080070static char *xbuf[XBUFSIZE];
71static char *axbuf[XBUFSIZE];
72static char *tvmem[TVMEMSIZE];
Linus Torvalds1da177e2005-04-16 15:20:36 -070073
74static char *check[] = {
Jonathan Lynchcd12fb92007-11-10 20:08:25 +080075 "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
76 "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
77 "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
David Howells90831632006-12-16 12:13:14 +110078 "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +080079 "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
80 "lzo", "cts", NULL
Linus Torvalds1da177e2005-04-16 15:20:36 -070081};
82
Herbert Xuef2736f2005-06-22 13:26:03 -070083static void hexdump(unsigned char *buf, unsigned int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -070084{
Denis Chenga10e1192007-11-30 16:59:30 +110085 print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
86 16, 1,
87 buf, len, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -070088}
89
Herbert Xu6158efc2007-04-04 17:41:07 +100090static void tcrypt_complete(struct crypto_async_request *req, int err)
91{
92 struct tcrypt_result *res = req->data;
93
94 if (err == -EINPROGRESS)
95 return;
96
97 res->err = err;
98 complete(&res->completion);
99}
100
Herbert Xuef2736f2005-06-22 13:26:03 -0700101static void test_hash(char *algo, struct hash_testvec *template,
102 unsigned int tcount)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103{
Herbert Xuef2736f2005-06-22 13:26:03 -0700104 unsigned int i, j, k, temp;
105 struct scatterlist sg[8];
106 char result[64];
Loc Hocde0e2c2008-05-14 21:24:51 +0800107 struct crypto_ahash *tfm;
108 struct ahash_request *req;
109 struct tcrypt_result tresult;
Herbert Xue9d41162006-08-19 21:38:49 +1000110 int ret;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800111 void *hash_buff;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112
Herbert Xuef2736f2005-06-22 13:26:03 -0700113 printk("\ntesting %s\n", algo);
114
Loc Hocde0e2c2008-05-14 21:24:51 +0800115 init_completion(&tresult.completion);
116
117 tfm = crypto_alloc_ahash(algo, 0, 0);
Herbert Xue9d41162006-08-19 21:38:49 +1000118 if (IS_ERR(tfm)) {
119 printk("failed to load transform for %s: %ld\n", algo,
120 PTR_ERR(tfm));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121 return;
122 }
123
Loc Hocde0e2c2008-05-14 21:24:51 +0800124 req = ahash_request_alloc(tfm, GFP_KERNEL);
125 if (!req) {
126 printk(KERN_ERR "failed to allocate request for %s\n", algo);
127 goto out_noreq;
128 }
129 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
130 tcrypt_complete, &tresult);
Herbert Xue9d41162006-08-19 21:38:49 +1000131
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132 for (i = 0; i < tcount; i++) {
Herbert Xuef2736f2005-06-22 13:26:03 -0700133 printk("test %u:\n", i + 1);
134 memset(result, 0, 64);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135
Herbert Xuf139cfa2008-07-31 12:23:53 +0800136 hash_buff = xbuf[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700137
Sebastian Siewior562954d2008-03-13 20:20:28 +0800138 memcpy(hash_buff, template[i].plaintext, template[i].psize);
139 sg_init_one(&sg[0], hash_buff, template[i].psize);
140
141 if (template[i].ksize) {
Loc Hocde0e2c2008-05-14 21:24:51 +0800142 crypto_ahash_clear_flags(tfm, ~0);
143 ret = crypto_ahash_setkey(tfm, template[i].key,
144 template[i].ksize);
Herbert Xue9d41162006-08-19 21:38:49 +1000145 if (ret) {
146 printk("setkey() failed ret=%d\n", ret);
147 goto out;
148 }
149 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150
Loc Hocde0e2c2008-05-14 21:24:51 +0800151 ahash_request_set_crypt(req, sg, result, template[i].psize);
152 ret = crypto_ahash_digest(req);
153 switch (ret) {
154 case 0:
155 break;
156 case -EINPROGRESS:
157 case -EBUSY:
158 ret = wait_for_completion_interruptible(
159 &tresult.completion);
160 if (!ret && !(ret = tresult.err)) {
161 INIT_COMPLETION(tresult.completion);
162 break;
163 }
164 /* fall through */
165 default:
Herbert Xue9d41162006-08-19 21:38:49 +1000166 printk("digest () failed ret=%d\n", ret);
167 goto out;
168 }
169
Loc Hocde0e2c2008-05-14 21:24:51 +0800170 hexdump(result, crypto_ahash_digestsize(tfm));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700171 printk("%s\n",
Sebastian Siewior562954d2008-03-13 20:20:28 +0800172 memcmp(result, template[i].digest,
Loc Hocde0e2c2008-05-14 21:24:51 +0800173 crypto_ahash_digestsize(tfm)) ?
Herbert Xuef2736f2005-06-22 13:26:03 -0700174 "fail" : "pass");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175 }
176
Herbert Xuef2736f2005-06-22 13:26:03 -0700177 printk("testing %s across pages\n", algo);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178
Linus Torvalds1da177e2005-04-16 15:20:36 -0700179 j = 0;
180 for (i = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800181 if (template[i].np) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700182 j++;
Herbert Xuef2736f2005-06-22 13:26:03 -0700183 printk("test %u:\n", j);
184 memset(result, 0, 64);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700185
186 temp = 0;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800187 sg_init_table(sg, template[i].np);
188 for (k = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800189 sg_set_buf(&sg[k],
190 memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
191 offset_in_page(IDX[k]),
192 template[i].plaintext + temp,
193 template[i].tap[k]),
194 template[i].tap[k]);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800195 temp += template[i].tap[k];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700196 }
197
Sebastian Siewior562954d2008-03-13 20:20:28 +0800198 if (template[i].ksize) {
Loc Hocde0e2c2008-05-14 21:24:51 +0800199 crypto_ahash_clear_flags(tfm, ~0);
200 ret = crypto_ahash_setkey(tfm, template[i].key,
201 template[i].ksize);
Herbert Xuef2736f2005-06-22 13:26:03 -0700202
Herbert Xue9d41162006-08-19 21:38:49 +1000203 if (ret) {
204 printk("setkey() failed ret=%d\n", ret);
205 goto out;
206 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700207 }
208
Loc Hocde0e2c2008-05-14 21:24:51 +0800209 ahash_request_set_crypt(req, sg, result,
210 template[i].psize);
211 ret = crypto_ahash_digest(req);
212 switch (ret) {
213 case 0:
214 break;
215 case -EINPROGRESS:
216 case -EBUSY:
217 ret = wait_for_completion_interruptible(
218 &tresult.completion);
219 if (!ret && !(ret = tresult.err)) {
220 INIT_COMPLETION(tresult.completion);
221 break;
222 }
223 /* fall through */
224 default:
Herbert Xue9d41162006-08-19 21:38:49 +1000225 printk("digest () failed ret=%d\n", ret);
226 goto out;
227 }
Herbert Xuef2736f2005-06-22 13:26:03 -0700228
Loc Hocde0e2c2008-05-14 21:24:51 +0800229 hexdump(result, crypto_ahash_digestsize(tfm));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700230 printk("%s\n",
Sebastian Siewior562954d2008-03-13 20:20:28 +0800231 memcmp(result, template[i].digest,
Loc Hocde0e2c2008-05-14 21:24:51 +0800232 crypto_ahash_digestsize(tfm)) ?
Herbert Xuef2736f2005-06-22 13:26:03 -0700233 "fail" : "pass");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700234 }
235 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236
Herbert Xue9d41162006-08-19 21:38:49 +1000237out:
Loc Hocde0e2c2008-05-14 21:24:51 +0800238 ahash_request_free(req);
239out_noreq:
240 crypto_free_ahash(tfm);
Herbert Xue9d41162006-08-19 21:38:49 +1000241}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700242
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800243static void test_aead(char *algo, int enc, struct aead_testvec *template,
244 unsigned int tcount)
245{
Patrick McHardya558f1d2008-05-08 19:27:47 +0800246 unsigned int ret, i, j, k, n, temp;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800247 char *q;
248 struct crypto_aead *tfm;
249 char *key;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800250 struct aead_request *req;
251 struct scatterlist sg[8];
252 struct scatterlist asg[8];
253 const char *e;
254 struct tcrypt_result result;
Herbert Xu6160b282007-12-04 19:17:50 +1100255 unsigned int authsize;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800256 void *input;
257 void *assoc;
258 char iv[MAX_IVLEN];
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800259
260 if (enc == ENCRYPT)
261 e = "encryption";
262 else
263 e = "decryption";
264
265 printk(KERN_INFO "\ntesting %s %s\n", algo, e);
266
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800267 init_completion(&result.completion);
268
269 tfm = crypto_alloc_aead(algo, 0, 0);
270
271 if (IS_ERR(tfm)) {
272 printk(KERN_INFO "failed to load transform for %s: %ld\n",
273 algo, PTR_ERR(tfm));
274 return;
275 }
276
277 req = aead_request_alloc(tfm, GFP_KERNEL);
278 if (!req) {
279 printk(KERN_INFO "failed to allocate request for %s\n", algo);
280 goto out;
281 }
282
283 aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
284 tcrypt_complete, &result);
285
286 for (i = 0, j = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800287 if (!template[i].np) {
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800288 printk(KERN_INFO "test %u (%d bit key):\n",
Sebastian Siewior562954d2008-03-13 20:20:28 +0800289 ++j, template[i].klen * 8);
290
291 /* some tepmplates have no input data but they will
292 * touch input
293 */
Herbert Xuf139cfa2008-07-31 12:23:53 +0800294 input = xbuf[0];
295 assoc = axbuf[0];
Sebastian Siewior562954d2008-03-13 20:20:28 +0800296
297 memcpy(input, template[i].input, template[i].ilen);
298 memcpy(assoc, template[i].assoc, template[i].alen);
299 if (template[i].iv)
300 memcpy(iv, template[i].iv, MAX_IVLEN);
301 else
302 memset(iv, 0, MAX_IVLEN);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800303
304 crypto_aead_clear_flags(tfm, ~0);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800305 if (template[i].wk)
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800306 crypto_aead_set_flags(
307 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800308
Herbert Xuf139cfa2008-07-31 12:23:53 +0800309 key = template[i].key;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800310
311 ret = crypto_aead_setkey(tfm, key,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800312 template[i].klen);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800313 if (ret) {
314 printk(KERN_INFO "setkey() failed flags=%x\n",
315 crypto_aead_get_flags(tfm));
316
Sebastian Siewior562954d2008-03-13 20:20:28 +0800317 if (!template[i].fail)
Herbert Xuf139cfa2008-07-31 12:23:53 +0800318 continue;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800319 }
320
Sebastian Siewior562954d2008-03-13 20:20:28 +0800321 authsize = abs(template[i].rlen - template[i].ilen);
Joy Latten93cc74e2007-12-12 20:24:22 +0800322 ret = crypto_aead_setauthsize(tfm, authsize);
323 if (ret) {
324 printk(KERN_INFO
325 "failed to set authsize = %u\n",
326 authsize);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800327 continue;
Joy Latten93cc74e2007-12-12 20:24:22 +0800328 }
329
Sebastian Siewior562954d2008-03-13 20:20:28 +0800330 sg_init_one(&sg[0], input,
331 template[i].ilen + (enc ? authsize : 0));
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800332
Sebastian Siewior562954d2008-03-13 20:20:28 +0800333 sg_init_one(&asg[0], assoc, template[i].alen);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800334
335 aead_request_set_crypt(req, sg, sg,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800336 template[i].ilen, iv);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800337
Sebastian Siewior562954d2008-03-13 20:20:28 +0800338 aead_request_set_assoc(req, asg, template[i].alen);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800339
Herbert Xu6160b282007-12-04 19:17:50 +1100340 ret = enc ?
341 crypto_aead_encrypt(req) :
342 crypto_aead_decrypt(req);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800343
344 switch (ret) {
345 case 0:
346 break;
347 case -EINPROGRESS:
348 case -EBUSY:
349 ret = wait_for_completion_interruptible(
350 &result.completion);
351 if (!ret && !(ret = result.err)) {
352 INIT_COMPLETION(result.completion);
353 break;
354 }
355 /* fall through */
356 default:
357 printk(KERN_INFO "%s () failed err=%d\n",
358 e, -ret);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800359 continue;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800360 }
361
Herbert Xu4b22f0d2008-07-03 14:57:30 +0800362 q = input;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800363 hexdump(q, template[i].rlen);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800364
365 printk(KERN_INFO "enc/dec: %s\n",
Sebastian Siewior562954d2008-03-13 20:20:28 +0800366 memcmp(q, template[i].result,
367 template[i].rlen) ? "fail" : "pass");
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800368 }
369 }
370
371 printk(KERN_INFO "\ntesting %s %s across pages (chunking)\n", algo, e);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800372
373 for (i = 0, j = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800374 if (template[i].np) {
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800375 printk(KERN_INFO "test %u (%d bit key):\n",
Sebastian Siewior562954d2008-03-13 20:20:28 +0800376 ++j, template[i].klen * 8);
377
378 if (template[i].iv)
379 memcpy(iv, template[i].iv, MAX_IVLEN);
380 else
381 memset(iv, 0, MAX_IVLEN);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800382
383 crypto_aead_clear_flags(tfm, ~0);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800384 if (template[i].wk)
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800385 crypto_aead_set_flags(
386 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800387 key = template[i].key;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800388
Sebastian Siewior562954d2008-03-13 20:20:28 +0800389 ret = crypto_aead_setkey(tfm, key, template[i].klen);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800390 if (ret) {
391 printk(KERN_INFO "setkey() failed flags=%x\n",
392 crypto_aead_get_flags(tfm));
393
Sebastian Siewior562954d2008-03-13 20:20:28 +0800394 if (!template[i].fail)
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800395 goto out;
396 }
397
Herbert Xuf139cfa2008-07-31 12:23:53 +0800398 authsize = abs(template[i].rlen - template[i].ilen);
399
Sebastian Siewior562954d2008-03-13 20:20:28 +0800400 sg_init_table(sg, template[i].np);
401 for (k = 0, temp = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800402 if (WARN_ON(offset_in_page(IDX[k]) +
403 template[i].tap[k] > PAGE_SIZE))
404 goto out;
405
406 q = xbuf[IDX[k] >> PAGE_SHIFT] +
407 offset_in_page(IDX[k]);
408
409 memcpy(q, template[i].input + temp,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800410 template[i].tap[k]);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800411
412 n = template[i].tap[k];
413 if (k == template[i].np - 1 && enc)
414 n += authsize;
415 if (offset_in_page(q) + n < PAGE_SIZE)
416 q[n] = 0;
417
418 sg_set_buf(&sg[k], q, template[i].tap[k]);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800419 temp += template[i].tap[k];
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800420 }
421
Joy Latten93cc74e2007-12-12 20:24:22 +0800422 ret = crypto_aead_setauthsize(tfm, authsize);
423 if (ret) {
424 printk(KERN_INFO
425 "failed to set authsize = %u\n",
426 authsize);
427 goto out;
428 }
429
Herbert Xuf139cfa2008-07-31 12:23:53 +0800430 if (enc) {
431 if (WARN_ON(sg[k - 1].offset +
432 sg[k - 1].length + authsize >
433 PAGE_SIZE))
434 goto out;
435
Herbert Xu6160b282007-12-04 19:17:50 +1100436 sg[k - 1].length += authsize;
Herbert Xuf139cfa2008-07-31 12:23:53 +0800437 }
Herbert Xu6160b282007-12-04 19:17:50 +1100438
Sebastian Siewior562954d2008-03-13 20:20:28 +0800439 sg_init_table(asg, template[i].anp);
440 for (k = 0, temp = 0; k < template[i].anp; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800441 sg_set_buf(&asg[k],
442 memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
443 offset_in_page(IDX[k]),
444 template[i].assoc + temp,
445 template[i].atap[k]),
Sebastian Siewior562954d2008-03-13 20:20:28 +0800446 template[i].atap[k]);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800447 temp += template[i].atap[k];
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800448 }
449
450 aead_request_set_crypt(req, sg, sg,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800451 template[i].ilen,
452 iv);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800453
Sebastian Siewior562954d2008-03-13 20:20:28 +0800454 aead_request_set_assoc(req, asg, template[i].alen);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800455
Herbert Xu6160b282007-12-04 19:17:50 +1100456 ret = enc ?
457 crypto_aead_encrypt(req) :
458 crypto_aead_decrypt(req);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800459
460 switch (ret) {
461 case 0:
462 break;
463 case -EINPROGRESS:
464 case -EBUSY:
465 ret = wait_for_completion_interruptible(
466 &result.completion);
467 if (!ret && !(ret = result.err)) {
468 INIT_COMPLETION(result.completion);
469 break;
470 }
471 /* fall through */
472 default:
473 printk(KERN_INFO "%s () failed err=%d\n",
474 e, -ret);
475 goto out;
476 }
477
Sebastian Siewior562954d2008-03-13 20:20:28 +0800478 for (k = 0, temp = 0; k < template[i].np; k++) {
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800479 printk(KERN_INFO "page %u\n", k);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800480 q = xbuf[IDX[k] >> PAGE_SHIFT] +
481 offset_in_page(IDX[k]);
Herbert Xuf176e632008-07-30 16:23:51 +0800482
483 n = template[i].tap[k];
484 if (k == template[i].np - 1)
485 n += enc ? authsize : -authsize;
486 hexdump(q, n);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800487 printk(KERN_INFO "%s\n",
Herbert Xuf176e632008-07-30 16:23:51 +0800488 memcmp(q, template[i].result + temp, n) ?
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800489 "fail" : "pass");
490
Herbert Xuf176e632008-07-30 16:23:51 +0800491 q += n;
492 if (k == template[i].np - 1 && !enc) {
493 if (memcmp(q, template[i].input +
494 temp + n, authsize))
495 n = authsize;
496 else
497 n = 0;
498 } else {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800499 for (n = 0; offset_in_page(q + n) &&
500 q[n]; n++)
Herbert Xuf176e632008-07-30 16:23:51 +0800501 ;
502 }
Patrick McHardya558f1d2008-05-08 19:27:47 +0800503 if (n) {
504 printk("Result buffer corruption %u "
505 "bytes:\n", n);
Herbert Xuf176e632008-07-30 16:23:51 +0800506 hexdump(q, n);
Patrick McHardya558f1d2008-05-08 19:27:47 +0800507 }
508
Sebastian Siewior562954d2008-03-13 20:20:28 +0800509 temp += template[i].tap[k];
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800510 }
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800511 }
512 }
513
514out:
515 crypto_free_aead(tfm);
516 aead_request_free(req);
517}
518
Herbert Xucba83562006-08-13 08:26:09 +1000519static void test_cipher(char *algo, int enc,
Herbert Xuef2736f2005-06-22 13:26:03 -0700520 struct cipher_testvec *template, unsigned int tcount)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700521{
Patrick McHardya558f1d2008-05-08 19:27:47 +0800522 unsigned int ret, i, j, k, n, temp;
David Hardeman378f0582005-09-17 17:55:31 +1000523 char *q;
Herbert Xu6158efc2007-04-04 17:41:07 +1000524 struct crypto_ablkcipher *tfm;
Herbert Xu6158efc2007-04-04 17:41:07 +1000525 struct ablkcipher_request *req;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526 struct scatterlist sg[8];
Herbert Xucba83562006-08-13 08:26:09 +1000527 const char *e;
Herbert Xu6158efc2007-04-04 17:41:07 +1000528 struct tcrypt_result result;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800529 void *data;
530 char iv[MAX_IVLEN];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700531
532 if (enc == ENCRYPT)
Herbert Xu3cc38162005-06-22 13:26:36 -0700533 e = "encryption";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 else
Herbert Xu3cc38162005-06-22 13:26:36 -0700535 e = "decryption";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536
Herbert Xucba83562006-08-13 08:26:09 +1000537 printk("\ntesting %s %s\n", algo, e);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700538
Herbert Xu6158efc2007-04-04 17:41:07 +1000539 init_completion(&result.completion);
Herbert Xu6158efc2007-04-04 17:41:07 +1000540 tfm = crypto_alloc_ablkcipher(algo, 0, 0);
Herbert Xuef2736f2005-06-22 13:26:03 -0700541
Herbert Xucba83562006-08-13 08:26:09 +1000542 if (IS_ERR(tfm)) {
543 printk("failed to load transform for %s: %ld\n", algo,
544 PTR_ERR(tfm));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545 return;
546 }
Herbert Xu6158efc2007-04-04 17:41:07 +1000547
548 req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
549 if (!req) {
550 printk("failed to allocate request for %s\n", algo);
551 goto out;
552 }
553
554 ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
555 tcrypt_complete, &result);
Herbert Xuef2736f2005-06-22 13:26:03 -0700556
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557 j = 0;
558 for (i = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800559 if (template[i].iv)
560 memcpy(iv, template[i].iv, MAX_IVLEN);
561 else
562 memset(iv, 0, MAX_IVLEN);
563
564 if (!(template[i].np)) {
Herbert Xuef2736f2005-06-22 13:26:03 -0700565 j++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700566 printk("test %u (%d bit key):\n",
Sebastian Siewior562954d2008-03-13 20:20:28 +0800567 j, template[i].klen * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568
Herbert Xuf139cfa2008-07-31 12:23:53 +0800569 data = xbuf[0];
570 memcpy(data, template[i].input, template[i].ilen);
571
Herbert Xu6158efc2007-04-04 17:41:07 +1000572 crypto_ablkcipher_clear_flags(tfm, ~0);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800573 if (template[i].wk)
Herbert Xu6158efc2007-04-04 17:41:07 +1000574 crypto_ablkcipher_set_flags(
Herbert Xucba83562006-08-13 08:26:09 +1000575 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
Herbert Xuef2736f2005-06-22 13:26:03 -0700576
Sebastian Siewior562954d2008-03-13 20:20:28 +0800577 ret = crypto_ablkcipher_setkey(tfm, template[i].key,
578 template[i].klen);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700579 if (ret) {
Herbert Xucba83562006-08-13 08:26:09 +1000580 printk("setkey() failed flags=%x\n",
Herbert Xu6158efc2007-04-04 17:41:07 +1000581 crypto_ablkcipher_get_flags(tfm));
Herbert Xuef2736f2005-06-22 13:26:03 -0700582
Herbert Xuf139cfa2008-07-31 12:23:53 +0800583 if (!template[i].fail)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700584 goto out;
Herbert Xuef2736f2005-06-22 13:26:03 -0700585 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700586
Sebastian Siewior562954d2008-03-13 20:20:28 +0800587 sg_init_one(&sg[0], data, template[i].ilen);
Herbert Xuef2736f2005-06-22 13:26:03 -0700588
Herbert Xu6158efc2007-04-04 17:41:07 +1000589 ablkcipher_request_set_crypt(req, sg, sg,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800590 template[i].ilen, iv);
Herbert Xucba83562006-08-13 08:26:09 +1000591 ret = enc ?
Herbert Xu6158efc2007-04-04 17:41:07 +1000592 crypto_ablkcipher_encrypt(req) :
593 crypto_ablkcipher_decrypt(req);
Herbert Xuef2736f2005-06-22 13:26:03 -0700594
Herbert Xu6158efc2007-04-04 17:41:07 +1000595 switch (ret) {
596 case 0:
597 break;
598 case -EINPROGRESS:
599 case -EBUSY:
600 ret = wait_for_completion_interruptible(
601 &result.completion);
602 if (!ret && !((ret = result.err))) {
603 INIT_COMPLETION(result.completion);
604 break;
605 }
606 /* fall through */
607 default:
608 printk("%s () failed err=%d\n", e, -ret);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700609 goto out;
Herbert Xuef2736f2005-06-22 13:26:03 -0700610 }
611
Herbert Xu4b22f0d2008-07-03 14:57:30 +0800612 q = data;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800613 hexdump(q, template[i].rlen);
Herbert Xuef2736f2005-06-22 13:26:03 -0700614
615 printk("%s\n",
Sebastian Siewior562954d2008-03-13 20:20:28 +0800616 memcmp(q, template[i].result,
617 template[i].rlen) ? "fail" : "pass");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618 }
619 }
Herbert Xuef2736f2005-06-22 13:26:03 -0700620
Herbert Xucba83562006-08-13 08:26:09 +1000621 printk("\ntesting %s %s across pages (chunking)\n", algo, e);
Herbert Xuef2736f2005-06-22 13:26:03 -0700622
Linus Torvalds1da177e2005-04-16 15:20:36 -0700623 j = 0;
624 for (i = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800625
Sebastian Siewior562954d2008-03-13 20:20:28 +0800626 if (template[i].iv)
627 memcpy(iv, template[i].iv, MAX_IVLEN);
628 else
629 memset(iv, 0, MAX_IVLEN);
630
631 if (template[i].np) {
Herbert Xuef2736f2005-06-22 13:26:03 -0700632 j++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633 printk("test %u (%d bit key):\n",
Sebastian Siewior562954d2008-03-13 20:20:28 +0800634 j, template[i].klen * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700635
Herbert Xu6158efc2007-04-04 17:41:07 +1000636 crypto_ablkcipher_clear_flags(tfm, ~0);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800637 if (template[i].wk)
Herbert Xu6158efc2007-04-04 17:41:07 +1000638 crypto_ablkcipher_set_flags(
Herbert Xucba83562006-08-13 08:26:09 +1000639 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
Herbert Xuef2736f2005-06-22 13:26:03 -0700640
Sebastian Siewior562954d2008-03-13 20:20:28 +0800641 ret = crypto_ablkcipher_setkey(tfm, template[i].key,
642 template[i].klen);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700643 if (ret) {
Herbert Xucba83562006-08-13 08:26:09 +1000644 printk("setkey() failed flags=%x\n",
Sebastian Siewior562954d2008-03-13 20:20:28 +0800645 crypto_ablkcipher_get_flags(tfm));
Herbert Xuef2736f2005-06-22 13:26:03 -0700646
Darren Jenkinsdbb018c2008-07-08 15:51:44 +0800647 if (!template[i].fail)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648 goto out;
649 }
650
651 temp = 0;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800652 sg_init_table(sg, template[i].np);
653 for (k = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800654 if (WARN_ON(offset_in_page(IDX[k]) +
655 template[i].tap[k] > PAGE_SIZE))
656 goto out;
657
658 q = xbuf[IDX[k] >> PAGE_SHIFT] +
659 offset_in_page(IDX[k]);
660
661 memcpy(q, template[i].input + temp,
662 template[i].tap[k]);
663
664 if (offset_in_page(q) + template[i].tap[k] <
665 PAGE_SIZE)
666 q[template[i].tap[k]] = 0;
667
668 sg_set_buf(&sg[k], q, template[i].tap[k]);
669
Sebastian Siewior562954d2008-03-13 20:20:28 +0800670 temp += template[i].tap[k];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671 }
Herbert Xuef2736f2005-06-22 13:26:03 -0700672
Herbert Xu6158efc2007-04-04 17:41:07 +1000673 ablkcipher_request_set_crypt(req, sg, sg,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800674 template[i].ilen, iv);
Herbert Xuef2736f2005-06-22 13:26:03 -0700675
Herbert Xucba83562006-08-13 08:26:09 +1000676 ret = enc ?
Herbert Xu6158efc2007-04-04 17:41:07 +1000677 crypto_ablkcipher_encrypt(req) :
678 crypto_ablkcipher_decrypt(req);
Herbert Xuef2736f2005-06-22 13:26:03 -0700679
Herbert Xu6158efc2007-04-04 17:41:07 +1000680 switch (ret) {
681 case 0:
682 break;
683 case -EINPROGRESS:
684 case -EBUSY:
685 ret = wait_for_completion_interruptible(
686 &result.completion);
687 if (!ret && !((ret = result.err))) {
688 INIT_COMPLETION(result.completion);
689 break;
690 }
691 /* fall through */
692 default:
693 printk("%s () failed err=%d\n", e, -ret);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694 goto out;
695 }
696
697 temp = 0;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800698 for (k = 0; k < template[i].np; k++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700699 printk("page %u\n", k);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800700 q = xbuf[IDX[k] >> PAGE_SHIFT] +
701 offset_in_page(IDX[k]);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800702 hexdump(q, template[i].tap[k]);
Herbert Xuef2736f2005-06-22 13:26:03 -0700703 printk("%s\n",
Sebastian Siewior562954d2008-03-13 20:20:28 +0800704 memcmp(q, template[i].result + temp,
705 template[i].tap[k]) ? "fail" :
Linus Torvalds1da177e2005-04-16 15:20:36 -0700706 "pass");
Patrick McHardya558f1d2008-05-08 19:27:47 +0800707
Herbert Xuf139cfa2008-07-31 12:23:53 +0800708 q += template[i].tap[k];
709 for (n = 0; offset_in_page(q + n) && q[n]; n++)
Patrick McHardya558f1d2008-05-08 19:27:47 +0800710 ;
711 if (n) {
712 printk("Result buffer corruption %u "
713 "bytes:\n", n);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800714 hexdump(q, n);
Patrick McHardya558f1d2008-05-08 19:27:47 +0800715 }
Sebastian Siewior562954d2008-03-13 20:20:28 +0800716 temp += template[i].tap[k];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700717 }
718 }
719 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700720out:
Herbert Xu6158efc2007-04-04 17:41:07 +1000721 crypto_free_ablkcipher(tfm);
722 ablkcipher_request_free(req);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723}
724
Herbert Xuf139cfa2008-07-31 12:23:53 +0800725static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
726 struct scatterlist *sg, int blen, int sec)
Herbert Xu6a179442005-06-22 13:29:03 -0700727{
Herbert Xu6a179442005-06-22 13:29:03 -0700728 unsigned long start, end;
729 int bcount;
730 int ret;
731
Herbert Xu6a179442005-06-22 13:29:03 -0700732 for (start = jiffies, end = start + sec * HZ, bcount = 0;
733 time_before(jiffies, end); bcount++) {
734 if (enc)
Herbert Xucba83562006-08-13 08:26:09 +1000735 ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700736 else
Herbert Xucba83562006-08-13 08:26:09 +1000737 ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700738
739 if (ret)
740 return ret;
741 }
742
743 printk("%d operations in %d seconds (%ld bytes)\n",
744 bcount, sec, (long)bcount * blen);
745 return 0;
746}
747
Herbert Xuf139cfa2008-07-31 12:23:53 +0800748static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
749 struct scatterlist *sg, int blen)
Herbert Xu6a179442005-06-22 13:29:03 -0700750{
Herbert Xu6a179442005-06-22 13:29:03 -0700751 unsigned long cycles = 0;
752 int ret = 0;
753 int i;
754
Herbert Xu6a179442005-06-22 13:29:03 -0700755 local_bh_disable();
756 local_irq_disable();
757
758 /* Warm-up run. */
759 for (i = 0; i < 4; i++) {
760 if (enc)
Herbert Xucba83562006-08-13 08:26:09 +1000761 ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700762 else
Herbert Xucba83562006-08-13 08:26:09 +1000763 ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700764
765 if (ret)
766 goto out;
767 }
768
769 /* The real thing. */
770 for (i = 0; i < 8; i++) {
771 cycles_t start, end;
772
773 start = get_cycles();
774 if (enc)
Herbert Xucba83562006-08-13 08:26:09 +1000775 ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700776 else
Herbert Xucba83562006-08-13 08:26:09 +1000777 ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700778 end = get_cycles();
779
780 if (ret)
781 goto out;
782
783 cycles += end - start;
784 }
785
786out:
787 local_irq_enable();
788 local_bh_enable();
789
790 if (ret == 0)
791 printk("1 operation in %lu cycles (%d bytes)\n",
792 (cycles + 4) / 8, blen);
793
794 return ret;
795}
796
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800797static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
798
Herbert Xucba83562006-08-13 08:26:09 +1000799static void test_cipher_speed(char *algo, int enc, unsigned int sec,
Herbert Xudce907c2005-06-22 13:27:51 -0700800 struct cipher_testvec *template,
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800801 unsigned int tcount, u8 *keysize)
Harald Welteebfd9bc2005-06-22 13:27:23 -0700802{
Herbert Xudce907c2005-06-22 13:27:51 -0700803 unsigned int ret, i, j, iv_len;
Herbert Xuf139cfa2008-07-31 12:23:53 +0800804 unsigned char *key, iv[128];
Herbert Xucba83562006-08-13 08:26:09 +1000805 struct crypto_blkcipher *tfm;
806 struct blkcipher_desc desc;
807 const char *e;
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800808 u32 *b_size;
Harald Welteebfd9bc2005-06-22 13:27:23 -0700809
810 if (enc == ENCRYPT)
811 e = "encryption";
812 else
813 e = "decryption";
Harald Welteebfd9bc2005-06-22 13:27:23 -0700814
Herbert Xucba83562006-08-13 08:26:09 +1000815 printk("\ntesting speed of %s %s\n", algo, e);
Harald Welteebfd9bc2005-06-22 13:27:23 -0700816
Herbert Xucba83562006-08-13 08:26:09 +1000817 tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
Harald Welteebfd9bc2005-06-22 13:27:23 -0700818
Herbert Xucba83562006-08-13 08:26:09 +1000819 if (IS_ERR(tfm)) {
820 printk("failed to load transform for %s: %ld\n", algo,
821 PTR_ERR(tfm));
Harald Welteebfd9bc2005-06-22 13:27:23 -0700822 return;
823 }
Herbert Xucba83562006-08-13 08:26:09 +1000824 desc.tfm = tfm;
825 desc.flags = 0;
Harald Welteebfd9bc2005-06-22 13:27:23 -0700826
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800827 i = 0;
828 do {
Harald Welteebfd9bc2005-06-22 13:27:23 -0700829
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800830 b_size = block_sizes;
831 do {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800832 struct scatterlist sg[TVMEMSIZE];
Harald Welteebfd9bc2005-06-22 13:27:23 -0700833
Herbert Xuf139cfa2008-07-31 12:23:53 +0800834 if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
835 printk("template (%u) too big for "
836 "tvmem (%lu)\n", *keysize + *b_size,
837 TVMEMSIZE * PAGE_SIZE);
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800838 goto out;
839 }
Harald Welteebfd9bc2005-06-22 13:27:23 -0700840
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800841 printk("test %u (%d bit key, %d byte blocks): ", i,
842 *keysize * 8, *b_size);
843
Herbert Xuf139cfa2008-07-31 12:23:53 +0800844 memset(tvmem[0], 0xff, PAGE_SIZE);
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800845
846 /* set key, plain text and IV */
Herbert Xuf139cfa2008-07-31 12:23:53 +0800847 key = (unsigned char *)tvmem[0];
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800848 for (j = 0; j < tcount; j++) {
849 if (template[j].klen == *keysize) {
850 key = template[j].key;
851 break;
852 }
853 }
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800854
855 ret = crypto_blkcipher_setkey(tfm, key, *keysize);
856 if (ret) {
857 printk("setkey() failed flags=%x\n",
858 crypto_blkcipher_get_flags(tfm));
859 goto out;
860 }
861
Herbert Xuf139cfa2008-07-31 12:23:53 +0800862 sg_init_table(sg, TVMEMSIZE);
863 sg_set_buf(sg, tvmem[0] + *keysize,
864 PAGE_SIZE - *keysize);
865 for (j = 1; j < TVMEMSIZE; j++) {
866 sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
867 memset (tvmem[j], 0xff, PAGE_SIZE);
868 }
869
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800870 iv_len = crypto_blkcipher_ivsize(tfm);
871 if (iv_len) {
872 memset(&iv, 0xff, iv_len);
873 crypto_blkcipher_set_iv(tfm, iv, iv_len);
874 }
875
876 if (sec)
Herbert Xuf139cfa2008-07-31 12:23:53 +0800877 ret = test_cipher_jiffies(&desc, enc, sg,
878 *b_size, sec);
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800879 else
Herbert Xuf139cfa2008-07-31 12:23:53 +0800880 ret = test_cipher_cycles(&desc, enc, sg,
881 *b_size);
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800882
883 if (ret) {
884 printk("%s() failed flags=%x\n", e, desc.flags);
Herbert Xudce907c2005-06-22 13:27:51 -0700885 break;
886 }
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800887 b_size++;
888 i++;
889 } while (*b_size);
890 keysize++;
891 } while (*keysize);
Harald Welteebfd9bc2005-06-22 13:27:23 -0700892
893out:
Herbert Xucba83562006-08-13 08:26:09 +1000894 crypto_free_blkcipher(tfm);
Harald Welteebfd9bc2005-06-22 13:27:23 -0700895}
896
Herbert Xuf139cfa2008-07-31 12:23:53 +0800897static int test_hash_jiffies_digest(struct hash_desc *desc,
898 struct scatterlist *sg, int blen,
Herbert Xue9d41162006-08-19 21:38:49 +1000899 char *out, int sec)
Michal Ludvige8057922006-05-30 22:04:19 +1000900{
Michal Ludvige8057922006-05-30 22:04:19 +1000901 unsigned long start, end;
Herbert Xue9d41162006-08-19 21:38:49 +1000902 int bcount;
903 int ret;
Michal Ludvige8057922006-05-30 22:04:19 +1000904
905 for (start = jiffies, end = start + sec * HZ, bcount = 0;
906 time_before(jiffies, end); bcount++) {
Herbert Xue9d41162006-08-19 21:38:49 +1000907 ret = crypto_hash_digest(desc, sg, blen, out);
908 if (ret)
909 return ret;
Michal Ludvige8057922006-05-30 22:04:19 +1000910 }
911
912 printk("%6u opers/sec, %9lu bytes/sec\n",
913 bcount / sec, ((long)bcount * blen) / sec);
914
Herbert Xue9d41162006-08-19 21:38:49 +1000915 return 0;
Michal Ludvige8057922006-05-30 22:04:19 +1000916}
917
Herbert Xuf139cfa2008-07-31 12:23:53 +0800918static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
919 int blen, int plen, char *out, int sec)
Herbert Xue9d41162006-08-19 21:38:49 +1000920{
Herbert Xue9d41162006-08-19 21:38:49 +1000921 unsigned long start, end;
922 int bcount, pcount;
923 int ret;
924
925 if (plen == blen)
Herbert Xuf139cfa2008-07-31 12:23:53 +0800926 return test_hash_jiffies_digest(desc, sg, blen, out, sec);
Herbert Xua5a613a2007-10-27 00:51:21 -0700927
Herbert Xue9d41162006-08-19 21:38:49 +1000928 for (start = jiffies, end = start + sec * HZ, bcount = 0;
929 time_before(jiffies, end); bcount++) {
930 ret = crypto_hash_init(desc);
931 if (ret)
932 return ret;
933 for (pcount = 0; pcount < blen; pcount += plen) {
Herbert Xue9d41162006-08-19 21:38:49 +1000934 ret = crypto_hash_update(desc, sg, plen);
935 if (ret)
936 return ret;
937 }
938 /* we assume there is enough space in 'out' for the result */
939 ret = crypto_hash_final(desc, out);
940 if (ret)
941 return ret;
942 }
943
944 printk("%6u opers/sec, %9lu bytes/sec\n",
945 bcount / sec, ((long)bcount * blen) / sec);
946
947 return 0;
948}
949
Herbert Xuf139cfa2008-07-31 12:23:53 +0800950static int test_hash_cycles_digest(struct hash_desc *desc,
951 struct scatterlist *sg, int blen, char *out)
Michal Ludvige8057922006-05-30 22:04:19 +1000952{
Michal Ludvige8057922006-05-30 22:04:19 +1000953 unsigned long cycles = 0;
Herbert Xue9d41162006-08-19 21:38:49 +1000954 int i;
955 int ret;
Michal Ludvige8057922006-05-30 22:04:19 +1000956
957 local_bh_disable();
958 local_irq_disable();
959
960 /* Warm-up run. */
961 for (i = 0; i < 4; i++) {
Herbert Xue9d41162006-08-19 21:38:49 +1000962 ret = crypto_hash_digest(desc, sg, blen, out);
963 if (ret)
964 goto out;
Michal Ludvige8057922006-05-30 22:04:19 +1000965 }
966
967 /* The real thing. */
968 for (i = 0; i < 8; i++) {
969 cycles_t start, end;
970
Michal Ludvige8057922006-05-30 22:04:19 +1000971 start = get_cycles();
972
Herbert Xue9d41162006-08-19 21:38:49 +1000973 ret = crypto_hash_digest(desc, sg, blen, out);
974 if (ret)
975 goto out;
Michal Ludvige8057922006-05-30 22:04:19 +1000976
977 end = get_cycles();
978
979 cycles += end - start;
980 }
981
Herbert Xue9d41162006-08-19 21:38:49 +1000982out:
Michal Ludvige8057922006-05-30 22:04:19 +1000983 local_irq_enable();
984 local_bh_enable();
985
Herbert Xue9d41162006-08-19 21:38:49 +1000986 if (ret)
987 return ret;
988
Michal Ludvige8057922006-05-30 22:04:19 +1000989 printk("%6lu cycles/operation, %4lu cycles/byte\n",
990 cycles / 8, cycles / (8 * blen));
991
Herbert Xue9d41162006-08-19 21:38:49 +1000992 return 0;
Michal Ludvige8057922006-05-30 22:04:19 +1000993}
994
Herbert Xuf139cfa2008-07-31 12:23:53 +0800995static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
996 int blen, int plen, char *out)
Michal Ludvige8057922006-05-30 22:04:19 +1000997{
Herbert Xue9d41162006-08-19 21:38:49 +1000998 unsigned long cycles = 0;
999 int i, pcount;
1000 int ret;
1001
1002 if (plen == blen)
Herbert Xuf139cfa2008-07-31 12:23:53 +08001003 return test_hash_cycles_digest(desc, sg, blen, out);
Herbert Xua5a613a2007-10-27 00:51:21 -07001004
Herbert Xue9d41162006-08-19 21:38:49 +10001005 local_bh_disable();
1006 local_irq_disable();
1007
1008 /* Warm-up run. */
1009 for (i = 0; i < 4; i++) {
1010 ret = crypto_hash_init(desc);
1011 if (ret)
1012 goto out;
1013 for (pcount = 0; pcount < blen; pcount += plen) {
Herbert Xue9d41162006-08-19 21:38:49 +10001014 ret = crypto_hash_update(desc, sg, plen);
1015 if (ret)
1016 goto out;
1017 }
Herbert Xu29059d12007-05-18 16:25:19 +10001018 ret = crypto_hash_final(desc, out);
Herbert Xue9d41162006-08-19 21:38:49 +10001019 if (ret)
1020 goto out;
1021 }
1022
1023 /* The real thing. */
1024 for (i = 0; i < 8; i++) {
1025 cycles_t start, end;
1026
1027 start = get_cycles();
1028
1029 ret = crypto_hash_init(desc);
1030 if (ret)
1031 goto out;
1032 for (pcount = 0; pcount < blen; pcount += plen) {
Herbert Xue9d41162006-08-19 21:38:49 +10001033 ret = crypto_hash_update(desc, sg, plen);
1034 if (ret)
1035 goto out;
1036 }
1037 ret = crypto_hash_final(desc, out);
1038 if (ret)
1039 goto out;
1040
1041 end = get_cycles();
1042
1043 cycles += end - start;
1044 }
1045
1046out:
1047 local_irq_enable();
1048 local_bh_enable();
1049
1050 if (ret)
1051 return ret;
1052
1053 printk("%6lu cycles/operation, %4lu cycles/byte\n",
1054 cycles / 8, cycles / (8 * blen));
1055
1056 return 0;
1057}
1058
1059static void test_hash_speed(char *algo, unsigned int sec,
1060 struct hash_speed *speed)
1061{
Herbert Xuf139cfa2008-07-31 12:23:53 +08001062 struct scatterlist sg[TVMEMSIZE];
Herbert Xue9d41162006-08-19 21:38:49 +10001063 struct crypto_hash *tfm;
1064 struct hash_desc desc;
Michal Ludvige8057922006-05-30 22:04:19 +10001065 char output[1024];
1066 int i;
Herbert Xue9d41162006-08-19 21:38:49 +10001067 int ret;
Michal Ludvige8057922006-05-30 22:04:19 +10001068
1069 printk("\ntesting speed of %s\n", algo);
1070
Herbert Xue9d41162006-08-19 21:38:49 +10001071 tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
Michal Ludvige8057922006-05-30 22:04:19 +10001072
Herbert Xue9d41162006-08-19 21:38:49 +10001073 if (IS_ERR(tfm)) {
1074 printk("failed to load transform for %s: %ld\n", algo,
1075 PTR_ERR(tfm));
Michal Ludvige8057922006-05-30 22:04:19 +10001076 return;
1077 }
1078
Herbert Xue9d41162006-08-19 21:38:49 +10001079 desc.tfm = tfm;
1080 desc.flags = 0;
1081
1082 if (crypto_hash_digestsize(tfm) > sizeof(output)) {
Michal Ludvige8057922006-05-30 22:04:19 +10001083 printk("digestsize(%u) > outputbuffer(%zu)\n",
Herbert Xue9d41162006-08-19 21:38:49 +10001084 crypto_hash_digestsize(tfm), sizeof(output));
Michal Ludvige8057922006-05-30 22:04:19 +10001085 goto out;
1086 }
1087
Herbert Xuf139cfa2008-07-31 12:23:53 +08001088 sg_init_table(sg, TVMEMSIZE);
1089 for (i = 0; i < TVMEMSIZE; i++) {
1090 sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
1091 memset(tvmem[i], 0xff, PAGE_SIZE);
1092 }
1093
Michal Ludvige8057922006-05-30 22:04:19 +10001094 for (i = 0; speed[i].blen != 0; i++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +08001095 if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
1096 printk("template (%u) too big for tvmem (%lu)\n",
1097 speed[i].blen, TVMEMSIZE * PAGE_SIZE);
Michal Ludvige8057922006-05-30 22:04:19 +10001098 goto out;
1099 }
1100
1101 printk("test%3u (%5u byte blocks,%5u bytes per update,%4u updates): ",
1102 i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
1103
Michal Ludvige8057922006-05-30 22:04:19 +10001104 if (sec)
Herbert Xuf139cfa2008-07-31 12:23:53 +08001105 ret = test_hash_jiffies(&desc, sg, speed[i].blen,
Herbert Xue9d41162006-08-19 21:38:49 +10001106 speed[i].plen, output, sec);
Michal Ludvige8057922006-05-30 22:04:19 +10001107 else
Herbert Xuf139cfa2008-07-31 12:23:53 +08001108 ret = test_hash_cycles(&desc, sg, speed[i].blen,
Herbert Xue9d41162006-08-19 21:38:49 +10001109 speed[i].plen, output);
1110
1111 if (ret) {
1112 printk("hashing failed ret=%d\n", ret);
1113 break;
1114 }
Michal Ludvige8057922006-05-30 22:04:19 +10001115 }
1116
1117out:
Herbert Xue9d41162006-08-19 21:38:49 +10001118 crypto_free_hash(tfm);
Michal Ludvige8057922006-05-30 22:04:19 +10001119}
1120
Zoltan Sogor91755a92007-12-07 16:48:11 +08001121static void test_comp(char *algo, struct comp_testvec *ctemplate,
1122 struct comp_testvec *dtemplate, int ctcount, int dtcount)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001123{
1124 unsigned int i;
1125 char result[COMP_BUF_SIZE];
Herbert Xue4d5b792006-08-26 18:12:40 +10001126 struct crypto_comp *tfm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001127
Zoltan Sogor91755a92007-12-07 16:48:11 +08001128 printk("\ntesting %s compression\n", algo);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001129
Zoltan Sogor91755a92007-12-07 16:48:11 +08001130 tfm = crypto_alloc_comp(algo, 0, CRYPTO_ALG_ASYNC);
Sebastian Siewior7bc301e2007-03-21 08:58:43 +11001131 if (IS_ERR(tfm)) {
Zoltan Sogor91755a92007-12-07 16:48:11 +08001132 printk("failed to load transform for %s\n", algo);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001133 return;
1134 }
1135
Zoltan Sogor91755a92007-12-07 16:48:11 +08001136 for (i = 0; i < ctcount; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001137 int ilen, ret, dlen = COMP_BUF_SIZE;
Herbert Xuef2736f2005-06-22 13:26:03 -07001138
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139 printk("test %u:\n", i + 1);
1140 memset(result, 0, sizeof (result));
1141
Sebastian Siewior562954d2008-03-13 20:20:28 +08001142 ilen = ctemplate[i].inlen;
1143 ret = crypto_comp_compress(tfm, ctemplate[i].input,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001144 ilen, result, &dlen);
1145 if (ret) {
1146 printk("fail: ret=%d\n", ret);
1147 continue;
1148 }
1149 hexdump(result, dlen);
1150 printk("%s (ratio %d:%d)\n",
Sebastian Siewior562954d2008-03-13 20:20:28 +08001151 memcmp(result, ctemplate[i].output, dlen) ? "fail" : "pass",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152 ilen, dlen);
1153 }
1154
Zoltan Sogor91755a92007-12-07 16:48:11 +08001155 printk("\ntesting %s decompression\n", algo);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156
Zoltan Sogor91755a92007-12-07 16:48:11 +08001157 for (i = 0; i < dtcount; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158 int ilen, ret, dlen = COMP_BUF_SIZE;
Herbert Xuef2736f2005-06-22 13:26:03 -07001159
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160 printk("test %u:\n", i + 1);
1161 memset(result, 0, sizeof (result));
1162
Sebastian Siewior562954d2008-03-13 20:20:28 +08001163 ilen = dtemplate[i].inlen;
1164 ret = crypto_comp_decompress(tfm, dtemplate[i].input,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 ilen, result, &dlen);
1166 if (ret) {
1167 printk("fail: ret=%d\n", ret);
1168 continue;
1169 }
1170 hexdump(result, dlen);
1171 printk("%s (ratio %d:%d)\n",
Sebastian Siewior562954d2008-03-13 20:20:28 +08001172 memcmp(result, dtemplate[i].output, dlen) ? "fail" : "pass",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173 ilen, dlen);
1174 }
Herbert Xuf139cfa2008-07-31 12:23:53 +08001175
Herbert Xue4d5b792006-08-26 18:12:40 +10001176 crypto_free_comp(tfm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177}
1178
Herbert Xuef2736f2005-06-22 13:26:03 -07001179static void test_available(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180{
1181 char **name = check;
Herbert Xuef2736f2005-06-22 13:26:03 -07001182
Linus Torvalds1da177e2005-04-16 15:20:36 -07001183 while (*name) {
1184 printk("alg %s ", *name);
Herbert Xu6158efc2007-04-04 17:41:07 +10001185 printk(crypto_has_alg(*name, 0, 0) ?
Herbert Xue4d5b792006-08-26 18:12:40 +10001186 "found\n" : "not found\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001187 name++;
Herbert Xuef2736f2005-06-22 13:26:03 -07001188 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189}
1190
Herbert Xuef2736f2005-06-22 13:26:03 -07001191static void do_test(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192{
1193 switch (mode) {
1194
1195 case 0:
1196 test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001197
Linus Torvalds1da177e2005-04-16 15:20:36 -07001198 test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001199
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200 //DES
Herbert Xucba83562006-08-13 08:26:09 +10001201 test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
1202 DES_ENC_TEST_VECTORS);
1203 test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
1204 DES_DEC_TEST_VECTORS);
1205 test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
1206 DES_CBC_ENC_TEST_VECTORS);
1207 test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
1208 DES_CBC_DEC_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001209
Linus Torvalds1da177e2005-04-16 15:20:36 -07001210 //DES3_EDE
Herbert Xucba83562006-08-13 08:26:09 +10001211 test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
1212 DES3_EDE_ENC_TEST_VECTORS);
1213 test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
1214 DES3_EDE_DEC_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001215
Neil Hormand729de22008-06-03 20:00:16 +10001216 test_cipher("cbc(des3_ede)", ENCRYPT,
1217 des3_ede_cbc_enc_tv_template,
1218 DES3_EDE_CBC_ENC_TEST_VECTORS);
1219
1220 test_cipher("cbc(des3_ede)", DECRYPT,
1221 des3_ede_cbc_dec_tv_template,
1222 DES3_EDE_CBC_DEC_TEST_VECTORS);
1223
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224 test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001225
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08001226 test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);
1227
Linus Torvalds1da177e2005-04-16 15:20:36 -07001228 test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001229
Linus Torvalds1da177e2005-04-16 15:20:36 -07001230 //BLOWFISH
Herbert Xucba83562006-08-13 08:26:09 +10001231 test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
1232 BF_ENC_TEST_VECTORS);
1233 test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
1234 BF_DEC_TEST_VECTORS);
1235 test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
1236 BF_CBC_ENC_TEST_VECTORS);
1237 test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
1238 BF_CBC_DEC_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001239
Linus Torvalds1da177e2005-04-16 15:20:36 -07001240 //TWOFISH
Herbert Xucba83562006-08-13 08:26:09 +10001241 test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
1242 TF_ENC_TEST_VECTORS);
1243 test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
1244 TF_DEC_TEST_VECTORS);
1245 test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
1246 TF_CBC_ENC_TEST_VECTORS);
1247 test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
1248 TF_CBC_DEC_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001249
Linus Torvalds1da177e2005-04-16 15:20:36 -07001250 //SERPENT
Herbert Xucba83562006-08-13 08:26:09 +10001251 test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
1252 SERPENT_ENC_TEST_VECTORS);
1253 test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
1254 SERPENT_DEC_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001255
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256 //TNEPRES
Herbert Xucba83562006-08-13 08:26:09 +10001257 test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
1258 TNEPRES_ENC_TEST_VECTORS);
1259 test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
1260 TNEPRES_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261
1262 //AES
Herbert Xucba83562006-08-13 08:26:09 +10001263 test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
1264 AES_ENC_TEST_VECTORS);
1265 test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
1266 AES_DEC_TEST_VECTORS);
1267 test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
1268 AES_CBC_ENC_TEST_VECTORS);
1269 test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
1270 AES_CBC_DEC_TEST_VECTORS);
Rik Snelf3d10442006-11-29 19:01:41 +11001271 test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
1272 AES_LRW_ENC_TEST_VECTORS);
1273 test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
1274 AES_LRW_DEC_TEST_VECTORS);
Rik Snelf19f5112007-09-19 20:23:13 +08001275 test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
1276 AES_XTS_ENC_TEST_VECTORS);
1277 test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
1278 AES_XTS_DEC_TEST_VECTORS);
Herbert Xu5311f242007-12-17 21:34:32 +08001279 test_cipher("rfc3686(ctr(aes))", ENCRYPT, aes_ctr_enc_tv_template,
Joy Latten23e353c2007-10-23 08:50:32 +08001280 AES_CTR_ENC_TEST_VECTORS);
Herbert Xu5311f242007-12-17 21:34:32 +08001281 test_cipher("rfc3686(ctr(aes))", DECRYPT, aes_ctr_dec_tv_template,
Joy Latten23e353c2007-10-23 08:50:32 +08001282 AES_CTR_DEC_TEST_VECTORS);
Mikko Herranen28db8e32007-11-26 22:24:11 +08001283 test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template,
1284 AES_GCM_ENC_TEST_VECTORS);
1285 test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template,
1286 AES_GCM_DEC_TEST_VECTORS);
Joy Latten93cc74e2007-12-12 20:24:22 +08001287 test_aead("ccm(aes)", ENCRYPT, aes_ccm_enc_tv_template,
1288 AES_CCM_ENC_TEST_VECTORS);
1289 test_aead("ccm(aes)", DECRYPT, aes_ccm_dec_tv_template,
1290 AES_CCM_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001291
1292 //CAST5
Herbert Xucba83562006-08-13 08:26:09 +10001293 test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
1294 CAST5_ENC_TEST_VECTORS);
1295 test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
1296 CAST5_DEC_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001297
Linus Torvalds1da177e2005-04-16 15:20:36 -07001298 //CAST6
Herbert Xucba83562006-08-13 08:26:09 +10001299 test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
1300 CAST6_ENC_TEST_VECTORS);
1301 test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
1302 CAST6_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001303
1304 //ARC4
Herbert Xucba83562006-08-13 08:26:09 +10001305 test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
1306 ARC4_ENC_TEST_VECTORS);
1307 test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
1308 ARC4_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001309
1310 //TEA
Herbert Xucba83562006-08-13 08:26:09 +10001311 test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
1312 TEA_ENC_TEST_VECTORS);
1313 test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
1314 TEA_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001315
1316
1317 //XTEA
Herbert Xucba83562006-08-13 08:26:09 +10001318 test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
1319 XTEA_ENC_TEST_VECTORS);
1320 test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
1321 XTEA_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322
1323 //KHAZAD
Herbert Xucba83562006-08-13 08:26:09 +10001324 test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
1325 KHAZAD_ENC_TEST_VECTORS);
1326 test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
1327 KHAZAD_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328
1329 //ANUBIS
Herbert Xucba83562006-08-13 08:26:09 +10001330 test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
1331 ANUBIS_ENC_TEST_VECTORS);
1332 test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
1333 ANUBIS_DEC_TEST_VECTORS);
1334 test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
1335 ANUBIS_CBC_ENC_TEST_VECTORS);
1336 test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
1337 ANUBIS_CBC_ENC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001338
Aaron Grothefb4f10e2005-09-01 17:42:46 -07001339 //XETA
Herbert Xucba83562006-08-13 08:26:09 +10001340 test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
1341 XETA_ENC_TEST_VECTORS);
1342 test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
1343 XETA_DEC_TEST_VECTORS);
Aaron Grothefb4f10e2005-09-01 17:42:46 -07001344
David Howells90831632006-12-16 12:13:14 +11001345 //FCrypt
1346 test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
1347 FCRYPT_ENC_TEST_VECTORS);
1348 test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
1349 FCRYPT_DEC_TEST_VECTORS);
1350
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001351 //CAMELLIA
1352 test_cipher("ecb(camellia)", ENCRYPT,
1353 camellia_enc_tv_template,
1354 CAMELLIA_ENC_TEST_VECTORS);
1355 test_cipher("ecb(camellia)", DECRYPT,
1356 camellia_dec_tv_template,
1357 CAMELLIA_DEC_TEST_VECTORS);
1358 test_cipher("cbc(camellia)", ENCRYPT,
1359 camellia_cbc_enc_tv_template,
1360 CAMELLIA_CBC_ENC_TEST_VECTORS);
1361 test_cipher("cbc(camellia)", DECRYPT,
1362 camellia_cbc_dec_tv_template,
1363 CAMELLIA_CBC_DEC_TEST_VECTORS);
1364
Hye-Shik Change2ee95b2007-08-21 20:01:03 +08001365 //SEED
1366 test_cipher("ecb(seed)", ENCRYPT, seed_enc_tv_template,
1367 SEED_ENC_TEST_VECTORS);
1368 test_cipher("ecb(seed)", DECRYPT, seed_dec_tv_template,
1369 SEED_DEC_TEST_VECTORS);
1370
Kevin Coffman76cb9522008-03-24 21:26:16 +08001371 //CTS
1372 test_cipher("cts(cbc(aes))", ENCRYPT, cts_mode_enc_tv_template,
1373 CTS_MODE_ENC_TEST_VECTORS);
1374 test_cipher("cts(cbc(aes))", DECRYPT, cts_mode_dec_tv_template,
1375 CTS_MODE_DEC_TEST_VECTORS);
1376
Linus Torvalds1da177e2005-04-16 15:20:36 -07001377 test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
1378 test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
1379 test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
1380 test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
1381 test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
1382 test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
1383 test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
1384 test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
Zoltan Sogor91755a92007-12-07 16:48:11 +08001385 test_comp("deflate", deflate_comp_tv_template,
1386 deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
1387 DEFLATE_DECOMP_TEST_VECTORS);
Zoltan Sogor0b77abb2007-12-07 16:53:23 +08001388 test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template,
1389 LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS);
Herbert Xuc907ee72006-08-21 22:04:03 +10001390 test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
Herbert Xue9d41162006-08-19 21:38:49 +10001391 test_hash("hmac(md5)", hmac_md5_tv_template,
1392 HMAC_MD5_TEST_VECTORS);
1393 test_hash("hmac(sha1)", hmac_sha1_tv_template,
1394 HMAC_SHA1_TEST_VECTORS);
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08001395 test_hash("hmac(sha224)", hmac_sha224_tv_template,
1396 HMAC_SHA224_TEST_VECTORS);
Herbert Xue9d41162006-08-19 21:38:49 +10001397 test_hash("hmac(sha256)", hmac_sha256_tv_template,
1398 HMAC_SHA256_TEST_VECTORS);
Andrew Donofrioa28091a2006-12-10 12:10:20 +11001399 test_hash("hmac(sha384)", hmac_sha384_tv_template,
1400 HMAC_SHA384_TEST_VECTORS);
1401 test_hash("hmac(sha512)", hmac_sha512_tv_template,
1402 HMAC_SHA512_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001403
Kazunori MIYAZAWA5b2becf2006-10-28 13:18:53 +10001404 test_hash("xcbc(aes)", aes_xcbc128_tv_template,
1405 XCBC_AES_TEST_VECTORS);
1406
Linus Torvalds1da177e2005-04-16 15:20:36 -07001407 test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
1408 break;
1409
1410 case 1:
1411 test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
1412 break;
1413
1414 case 2:
1415 test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
1416 break;
1417
1418 case 3:
Herbert Xucba83562006-08-13 08:26:09 +10001419 test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
1420 DES_ENC_TEST_VECTORS);
1421 test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
1422 DES_DEC_TEST_VECTORS);
1423 test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
1424 DES_CBC_ENC_TEST_VECTORS);
1425 test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
1426 DES_CBC_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001427 break;
1428
1429 case 4:
Herbert Xucba83562006-08-13 08:26:09 +10001430 test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
1431 DES3_EDE_ENC_TEST_VECTORS);
1432 test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
1433 DES3_EDE_DEC_TEST_VECTORS);
Neil Hormand729de22008-06-03 20:00:16 +10001434
1435 test_cipher("cbc(des3_ede)", ENCRYPT,
1436 des3_ede_cbc_enc_tv_template,
1437 DES3_EDE_CBC_ENC_TEST_VECTORS);
1438
1439 test_cipher("cbc(des3_ede)", DECRYPT,
1440 des3_ede_cbc_dec_tv_template,
1441 DES3_EDE_CBC_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001442 break;
1443
1444 case 5:
1445 test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
1446 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001447
Linus Torvalds1da177e2005-04-16 15:20:36 -07001448 case 6:
1449 test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
1450 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001451
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452 case 7:
Herbert Xucba83562006-08-13 08:26:09 +10001453 test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
1454 BF_ENC_TEST_VECTORS);
1455 test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
1456 BF_DEC_TEST_VECTORS);
1457 test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
1458 BF_CBC_ENC_TEST_VECTORS);
1459 test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
1460 BF_CBC_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461 break;
1462
1463 case 8:
Herbert Xucba83562006-08-13 08:26:09 +10001464 test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
1465 TF_ENC_TEST_VECTORS);
1466 test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
1467 TF_DEC_TEST_VECTORS);
1468 test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
1469 TF_CBC_ENC_TEST_VECTORS);
1470 test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
1471 TF_CBC_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001472 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001473
Linus Torvalds1da177e2005-04-16 15:20:36 -07001474 case 9:
Herbert Xucba83562006-08-13 08:26:09 +10001475 test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
1476 SERPENT_ENC_TEST_VECTORS);
1477 test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
1478 SERPENT_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001479 break;
1480
1481 case 10:
Herbert Xucba83562006-08-13 08:26:09 +10001482 test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
1483 AES_ENC_TEST_VECTORS);
1484 test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
1485 AES_DEC_TEST_VECTORS);
1486 test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
1487 AES_CBC_ENC_TEST_VECTORS);
1488 test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
1489 AES_CBC_DEC_TEST_VECTORS);
Rik Snelf3d10442006-11-29 19:01:41 +11001490 test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
1491 AES_LRW_ENC_TEST_VECTORS);
1492 test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
1493 AES_LRW_DEC_TEST_VECTORS);
Rik Snelf19f5112007-09-19 20:23:13 +08001494 test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
1495 AES_XTS_ENC_TEST_VECTORS);
1496 test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
1497 AES_XTS_DEC_TEST_VECTORS);
Herbert Xu5311f242007-12-17 21:34:32 +08001498 test_cipher("rfc3686(ctr(aes))", ENCRYPT, aes_ctr_enc_tv_template,
Joy Latten23e353c2007-10-23 08:50:32 +08001499 AES_CTR_ENC_TEST_VECTORS);
Herbert Xu5311f242007-12-17 21:34:32 +08001500 test_cipher("rfc3686(ctr(aes))", DECRYPT, aes_ctr_dec_tv_template,
Joy Latten23e353c2007-10-23 08:50:32 +08001501 AES_CTR_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001502 break;
1503
1504 case 11:
1505 test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
1506 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001507
Linus Torvalds1da177e2005-04-16 15:20:36 -07001508 case 12:
1509 test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
1510 break;
1511
1512 case 13:
Zoltan Sogor91755a92007-12-07 16:48:11 +08001513 test_comp("deflate", deflate_comp_tv_template,
1514 deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
1515 DEFLATE_DECOMP_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001516 break;
1517
1518 case 14:
Herbert Xucba83562006-08-13 08:26:09 +10001519 test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
1520 CAST5_ENC_TEST_VECTORS);
1521 test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
1522 CAST5_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001523 break;
1524
1525 case 15:
Herbert Xucba83562006-08-13 08:26:09 +10001526 test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
1527 CAST6_ENC_TEST_VECTORS);
1528 test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
1529 CAST6_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530 break;
1531
1532 case 16:
Herbert Xucba83562006-08-13 08:26:09 +10001533 test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
1534 ARC4_ENC_TEST_VECTORS);
1535 test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
1536 ARC4_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001537 break;
1538
1539 case 17:
1540 test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
1541 break;
1542
1543 case 18:
Herbert Xuc907ee72006-08-21 22:04:03 +10001544 test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001545 break;
1546
1547 case 19:
Herbert Xucba83562006-08-13 08:26:09 +10001548 test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
1549 TEA_ENC_TEST_VECTORS);
1550 test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
1551 TEA_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001552 break;
1553
1554 case 20:
Herbert Xucba83562006-08-13 08:26:09 +10001555 test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
1556 XTEA_ENC_TEST_VECTORS);
1557 test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
1558 XTEA_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001559 break;
1560
1561 case 21:
Herbert Xucba83562006-08-13 08:26:09 +10001562 test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
1563 KHAZAD_ENC_TEST_VECTORS);
1564 test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
1565 KHAZAD_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001566 break;
1567
1568 case 22:
1569 test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
1570 break;
1571
1572 case 23:
1573 test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
1574 break;
1575
1576 case 24:
1577 test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
1578 break;
1579
1580 case 25:
Herbert Xucba83562006-08-13 08:26:09 +10001581 test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
1582 TNEPRES_ENC_TEST_VECTORS);
1583 test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
1584 TNEPRES_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001585 break;
1586
1587 case 26:
Herbert Xucba83562006-08-13 08:26:09 +10001588 test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
1589 ANUBIS_ENC_TEST_VECTORS);
1590 test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
1591 ANUBIS_DEC_TEST_VECTORS);
1592 test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
1593 ANUBIS_CBC_ENC_TEST_VECTORS);
1594 test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
1595 ANUBIS_CBC_ENC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001596 break;
1597
1598 case 27:
1599 test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
1600 break;
1601
1602 case 28:
1603
1604 test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
1605 break;
1606
1607 case 29:
1608 test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
1609 break;
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08001610
Aaron Grothefb4f10e2005-09-01 17:42:46 -07001611 case 30:
Herbert Xucba83562006-08-13 08:26:09 +10001612 test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
1613 XETA_ENC_TEST_VECTORS);
1614 test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
1615 XETA_DEC_TEST_VECTORS);
Aaron Grothefb4f10e2005-09-01 17:42:46 -07001616 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001617
David Howells90831632006-12-16 12:13:14 +11001618 case 31:
1619 test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
1620 FCRYPT_ENC_TEST_VECTORS);
1621 test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
1622 FCRYPT_DEC_TEST_VECTORS);
1623 break;
1624
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001625 case 32:
1626 test_cipher("ecb(camellia)", ENCRYPT,
1627 camellia_enc_tv_template,
1628 CAMELLIA_ENC_TEST_VECTORS);
1629 test_cipher("ecb(camellia)", DECRYPT,
1630 camellia_dec_tv_template,
1631 CAMELLIA_DEC_TEST_VECTORS);
1632 test_cipher("cbc(camellia)", ENCRYPT,
1633 camellia_cbc_enc_tv_template,
1634 CAMELLIA_CBC_ENC_TEST_VECTORS);
1635 test_cipher("cbc(camellia)", DECRYPT,
1636 camellia_cbc_dec_tv_template,
1637 CAMELLIA_CBC_DEC_TEST_VECTORS);
1638 break;
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08001639 case 33:
1640 test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);
1641 break;
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001642
Tan Swee Heng2407d602007-11-23 19:45:00 +08001643 case 34:
1644 test_cipher("salsa20", ENCRYPT,
1645 salsa20_stream_enc_tv_template,
1646 SALSA20_STREAM_ENC_TEST_VECTORS);
1647 break;
1648
Herbert Xu8df213d2007-12-02 14:55:47 +11001649 case 35:
1650 test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template,
1651 AES_GCM_ENC_TEST_VECTORS);
1652 test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template,
1653 AES_GCM_DEC_TEST_VECTORS);
1654 break;
1655
Zoltan Sogor0b77abb2007-12-07 16:53:23 +08001656 case 36:
1657 test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template,
1658 LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS);
1659 break;
1660
Joy Latten93cc74e2007-12-12 20:24:22 +08001661 case 37:
1662 test_aead("ccm(aes)", ENCRYPT, aes_ccm_enc_tv_template,
1663 AES_CCM_ENC_TEST_VECTORS);
1664 test_aead("ccm(aes)", DECRYPT, aes_ccm_dec_tv_template,
1665 AES_CCM_DEC_TEST_VECTORS);
1666 break;
1667
Kevin Coffman76cb9522008-03-24 21:26:16 +08001668 case 38:
1669 test_cipher("cts(cbc(aes))", ENCRYPT, cts_mode_enc_tv_template,
1670 CTS_MODE_ENC_TEST_VECTORS);
1671 test_cipher("cts(cbc(aes))", DECRYPT, cts_mode_dec_tv_template,
1672 CTS_MODE_DEC_TEST_VECTORS);
1673 break;
1674
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001675 case 39:
1676 test_hash("rmd128", rmd128_tv_template, RMD128_TEST_VECTORS);
1677 break;
1678
1679 case 40:
1680 test_hash("rmd160", rmd160_tv_template, RMD160_TEST_VECTORS);
1681 break;
1682
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08001683 case 41:
1684 test_hash("rmd256", rmd256_tv_template, RMD256_TEST_VECTORS);
1685 break;
1686
1687 case 42:
1688 test_hash("rmd320", rmd320_tv_template, RMD320_TEST_VECTORS);
1689 break;
1690
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691 case 100:
Herbert Xue9d41162006-08-19 21:38:49 +10001692 test_hash("hmac(md5)", hmac_md5_tv_template,
1693 HMAC_MD5_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001694 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001695
Linus Torvalds1da177e2005-04-16 15:20:36 -07001696 case 101:
Herbert Xue9d41162006-08-19 21:38:49 +10001697 test_hash("hmac(sha1)", hmac_sha1_tv_template,
1698 HMAC_SHA1_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001699 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001700
Linus Torvalds1da177e2005-04-16 15:20:36 -07001701 case 102:
Herbert Xue9d41162006-08-19 21:38:49 +10001702 test_hash("hmac(sha256)", hmac_sha256_tv_template,
1703 HMAC_SHA256_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001704 break;
1705
Andrew Donofrioa28091a2006-12-10 12:10:20 +11001706 case 103:
1707 test_hash("hmac(sha384)", hmac_sha384_tv_template,
1708 HMAC_SHA384_TEST_VECTORS);
1709 break;
1710
1711 case 104:
1712 test_hash("hmac(sha512)", hmac_sha512_tv_template,
1713 HMAC_SHA512_TEST_VECTORS);
1714 break;
Herbert Xu38ed9ab2008-01-01 15:59:28 +11001715
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08001716 case 105:
1717 test_hash("hmac(sha224)", hmac_sha224_tv_template,
1718 HMAC_SHA224_TEST_VECTORS);
1719 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001720
Herbert Xu38ed9ab2008-01-01 15:59:28 +11001721 case 106:
1722 test_hash("xcbc(aes)", aes_xcbc128_tv_template,
1723 XCBC_AES_TEST_VECTORS);
1724 break;
1725
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001726 case 107:
1727 test_hash("hmac(rmd128)", hmac_rmd128_tv_template,
1728 HMAC_RMD128_TEST_VECTORS);
1729 break;
1730
1731 case 108:
1732 test_hash("hmac(rmd160)", hmac_rmd160_tv_template,
1733 HMAC_RMD160_TEST_VECTORS);
1734 break;
1735
Harald Welteebfd9bc2005-06-22 13:27:23 -07001736 case 200:
Herbert Xucba83562006-08-13 08:26:09 +10001737 test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001738 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001739 test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001740 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001741 test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001742 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001743 test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001744 speed_template_16_24_32);
Rik Snelf3d10442006-11-29 19:01:41 +11001745 test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001746 speed_template_32_40_48);
Rik Snelf3d10442006-11-29 19:01:41 +11001747 test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001748 speed_template_32_40_48);
Rik Snelf19f5112007-09-19 20:23:13 +08001749 test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001750 speed_template_32_48_64);
Rik Snelf19f5112007-09-19 20:23:13 +08001751 test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001752 speed_template_32_48_64);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001753 break;
1754
1755 case 201:
Herbert Xucba83562006-08-13 08:26:09 +10001756 test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001757 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
1758 speed_template_24);
Herbert Xucba83562006-08-13 08:26:09 +10001759 test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001760 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
1761 speed_template_24);
Herbert Xucba83562006-08-13 08:26:09 +10001762 test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001763 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
1764 speed_template_24);
Herbert Xucba83562006-08-13 08:26:09 +10001765 test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001766 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
1767 speed_template_24);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001768 break;
1769
1770 case 202:
Herbert Xucba83562006-08-13 08:26:09 +10001771 test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001772 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001773 test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001774 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001775 test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001776 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001777 test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001778 speed_template_16_24_32);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001779 break;
1780
1781 case 203:
Herbert Xucba83562006-08-13 08:26:09 +10001782 test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001783 speed_template_8_32);
Herbert Xucba83562006-08-13 08:26:09 +10001784 test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001785 speed_template_8_32);
Herbert Xucba83562006-08-13 08:26:09 +10001786 test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001787 speed_template_8_32);
Herbert Xucba83562006-08-13 08:26:09 +10001788 test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001789 speed_template_8_32);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001790 break;
1791
1792 case 204:
Herbert Xucba83562006-08-13 08:26:09 +10001793 test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001794 speed_template_8);
Herbert Xucba83562006-08-13 08:26:09 +10001795 test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001796 speed_template_8);
Herbert Xucba83562006-08-13 08:26:09 +10001797 test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001798 speed_template_8);
Herbert Xucba83562006-08-13 08:26:09 +10001799 test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001800 speed_template_8);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001801 break;
1802
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001803 case 205:
1804 test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001805 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001806 test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001807 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001808 test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001809 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001810 test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001811 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001812 break;
1813
Tan Swee Heng5de8f1b2007-12-07 17:17:43 +08001814 case 206:
1815 test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001816 speed_template_16_32);
Tan Swee Heng5de8f1b2007-12-07 17:17:43 +08001817 break;
1818
Michal Ludvige8057922006-05-30 22:04:19 +10001819 case 300:
1820 /* fall through */
1821
1822 case 301:
Herbert Xue9d41162006-08-19 21:38:49 +10001823 test_hash_speed("md4", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001824 if (mode > 300 && mode < 400) break;
1825
1826 case 302:
Herbert Xue9d41162006-08-19 21:38:49 +10001827 test_hash_speed("md5", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001828 if (mode > 300 && mode < 400) break;
1829
1830 case 303:
Herbert Xue9d41162006-08-19 21:38:49 +10001831 test_hash_speed("sha1", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001832 if (mode > 300 && mode < 400) break;
1833
1834 case 304:
Herbert Xue9d41162006-08-19 21:38:49 +10001835 test_hash_speed("sha256", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001836 if (mode > 300 && mode < 400) break;
1837
1838 case 305:
Herbert Xue9d41162006-08-19 21:38:49 +10001839 test_hash_speed("sha384", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001840 if (mode > 300 && mode < 400) break;
1841
1842 case 306:
Herbert Xue9d41162006-08-19 21:38:49 +10001843 test_hash_speed("sha512", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001844 if (mode > 300 && mode < 400) break;
1845
1846 case 307:
Herbert Xue9d41162006-08-19 21:38:49 +10001847 test_hash_speed("wp256", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001848 if (mode > 300 && mode < 400) break;
1849
1850 case 308:
Herbert Xue9d41162006-08-19 21:38:49 +10001851 test_hash_speed("wp384", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001852 if (mode > 300 && mode < 400) break;
1853
1854 case 309:
Herbert Xue9d41162006-08-19 21:38:49 +10001855 test_hash_speed("wp512", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001856 if (mode > 300 && mode < 400) break;
1857
1858 case 310:
Herbert Xue9d41162006-08-19 21:38:49 +10001859 test_hash_speed("tgr128", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001860 if (mode > 300 && mode < 400) break;
1861
1862 case 311:
Herbert Xue9d41162006-08-19 21:38:49 +10001863 test_hash_speed("tgr160", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001864 if (mode > 300 && mode < 400) break;
1865
1866 case 312:
Herbert Xue9d41162006-08-19 21:38:49 +10001867 test_hash_speed("tgr192", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001868 if (mode > 300 && mode < 400) break;
1869
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08001870 case 313:
1871 test_hash_speed("sha224", sec, generic_hash_speed_template);
1872 if (mode > 300 && mode < 400) break;
1873
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001874 case 314:
1875 test_hash_speed("rmd128", sec, generic_hash_speed_template);
1876 if (mode > 300 && mode < 400) break;
1877
1878 case 315:
1879 test_hash_speed("rmd160", sec, generic_hash_speed_template);
1880 if (mode > 300 && mode < 400) break;
1881
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08001882 case 316:
1883 test_hash_speed("rmd256", sec, generic_hash_speed_template);
1884 if (mode > 300 && mode < 400) break;
1885
1886 case 317:
1887 test_hash_speed("rmd320", sec, generic_hash_speed_template);
1888 if (mode > 300 && mode < 400) break;
1889
Michal Ludvige8057922006-05-30 22:04:19 +10001890 case 399:
1891 break;
1892
Linus Torvalds1da177e2005-04-16 15:20:36 -07001893 case 1000:
1894 test_available();
1895 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001896
Linus Torvalds1da177e2005-04-16 15:20:36 -07001897 default:
1898 /* useful for debugging */
1899 printk("not testing anything\n");
1900 break;
1901 }
1902}
1903
Kamalesh Babulal3af5b902008-04-05 21:00:57 +08001904static int __init tcrypt_mod_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001905{
Mikko Herranene3a4ea42007-11-26 22:12:07 +08001906 int err = -ENOMEM;
Herbert Xuf139cfa2008-07-31 12:23:53 +08001907 int i;
Mikko Herranene3a4ea42007-11-26 22:12:07 +08001908
Herbert Xuf139cfa2008-07-31 12:23:53 +08001909 for (i = 0; i < TVMEMSIZE; i++) {
1910 tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
1911 if (!tvmem[i])
1912 goto err_free_tv;
1913 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001914
Herbert Xuf139cfa2008-07-31 12:23:53 +08001915 for (i = 0; i < XBUFSIZE; i++) {
1916 xbuf[i] = (void *)__get_free_page(GFP_KERNEL);
1917 if (!xbuf[i])
1918 goto err_free_xbuf;
1919 }
Mikko Herranene3a4ea42007-11-26 22:12:07 +08001920
Herbert Xuf139cfa2008-07-31 12:23:53 +08001921 for (i = 0; i < XBUFSIZE; i++) {
1922 axbuf[i] = (void *)__get_free_page(GFP_KERNEL);
1923 if (!axbuf[i])
1924 goto err_free_axbuf;
1925 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001926
1927 do_test();
1928
Michal Ludvig14fdf472006-05-30 14:49:38 +10001929 /* We intentionaly return -EAGAIN to prevent keeping
1930 * the module. It does all its work from init()
1931 * and doesn't offer any runtime functionality
1932 * => we don't need it in the memory, do we?
1933 * -- mludvig
1934 */
Mikko Herranene3a4ea42007-11-26 22:12:07 +08001935 err = -EAGAIN;
1936
Herbert Xuf139cfa2008-07-31 12:23:53 +08001937err_free_axbuf:
1938 for (i = 0; i < XBUFSIZE && axbuf[i]; i++)
1939 free_page((unsigned long)axbuf[i]);
1940err_free_xbuf:
1941 for (i = 0; i < XBUFSIZE && xbuf[i]; i++)
1942 free_page((unsigned long)xbuf[i]);
1943err_free_tv:
1944 for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
1945 free_page((unsigned long)tvmem[i]);
Mikko Herranene3a4ea42007-11-26 22:12:07 +08001946
1947 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001948}
1949
1950/*
1951 * If an init function is provided, an exit function must also be provided
1952 * to allow module unload.
1953 */
Kamalesh Babulal3af5b902008-04-05 21:00:57 +08001954static void __exit tcrypt_mod_fini(void) { }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001955
Kamalesh Babulal3af5b902008-04-05 21:00:57 +08001956module_init(tcrypt_mod_init);
1957module_exit(tcrypt_mod_fini);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001958
1959module_param(mode, int, 0);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001960module_param(sec, uint, 0);
Herbert Xu6a179442005-06-22 13:29:03 -07001961MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
1962 "(defaults to zero which uses CPU cycles instead)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001963
1964MODULE_LICENSE("GPL");
1965MODULE_DESCRIPTION("Quick & dirty crypto testing module");
1966MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");