blob: 97ec2bdfcce030c55bfacc1dda6dd0218dd0d6a1 [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 Xubdecd222008-07-31 14:03:44 +0800101static int 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 Hocde0e2c82008-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
Loc Hocde0e2c82008-05-14 21:24:51 +0800113 init_completion(&tresult.completion);
114
115 tfm = crypto_alloc_ahash(algo, 0, 0);
Herbert Xue9d41162006-08-19 21:38:49 +1000116 if (IS_ERR(tfm)) {
Herbert Xubdecd222008-07-31 14:03:44 +0800117 printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
118 "%ld\n", algo, PTR_ERR(tfm));
119 return PTR_ERR(tfm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120 }
121
Loc Hocde0e2c82008-05-14 21:24:51 +0800122 req = ahash_request_alloc(tfm, GFP_KERNEL);
123 if (!req) {
Herbert Xubdecd222008-07-31 14:03:44 +0800124 printk(KERN_ERR "alg: hash: Failed to allocate request for "
125 "%s\n", algo);
126 ret = -ENOMEM;
Loc Hocde0e2c82008-05-14 21:24:51 +0800127 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 memset(result, 0, 64);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134
Herbert Xuf139cfa2008-07-31 12:23:53 +0800135 hash_buff = xbuf[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700136
Sebastian Siewior562954d2008-03-13 20:20:28 +0800137 memcpy(hash_buff, template[i].plaintext, template[i].psize);
138 sg_init_one(&sg[0], hash_buff, template[i].psize);
139
140 if (template[i].ksize) {
Loc Hocde0e2c82008-05-14 21:24:51 +0800141 crypto_ahash_clear_flags(tfm, ~0);
142 ret = crypto_ahash_setkey(tfm, template[i].key,
143 template[i].ksize);
Herbert Xue9d41162006-08-19 21:38:49 +1000144 if (ret) {
Herbert Xubdecd222008-07-31 14:03:44 +0800145 printk(KERN_ERR "alg: hash: setkey failed on "
146 "test %d for %s: ret=%d\n", i + 1, algo,
147 -ret);
Herbert Xue9d41162006-08-19 21:38:49 +1000148 goto out;
149 }
150 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151
Loc Hocde0e2c82008-05-14 21:24:51 +0800152 ahash_request_set_crypt(req, sg, result, template[i].psize);
153 ret = crypto_ahash_digest(req);
154 switch (ret) {
155 case 0:
156 break;
157 case -EINPROGRESS:
158 case -EBUSY:
159 ret = wait_for_completion_interruptible(
160 &tresult.completion);
161 if (!ret && !(ret = tresult.err)) {
162 INIT_COMPLETION(tresult.completion);
163 break;
164 }
165 /* fall through */
166 default:
Herbert Xubdecd222008-07-31 14:03:44 +0800167 printk(KERN_ERR "alg: hash: digest failed on test %d "
168 "for %s: ret=%d\n", i + 1, algo, -ret);
Herbert Xue9d41162006-08-19 21:38:49 +1000169 goto out;
170 }
171
Herbert Xubdecd222008-07-31 14:03:44 +0800172 if (memcmp(result, template[i].digest,
173 crypto_ahash_digestsize(tfm))) {
174 printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
175 i + 1, algo);
176 hexdump(result, crypto_ahash_digestsize(tfm));
177 ret = -EINVAL;
178 goto out;
179 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700180 }
181
Linus Torvalds1da177e2005-04-16 15:20:36 -0700182 j = 0;
183 for (i = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800184 if (template[i].np) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700185 j++;
Herbert Xuef2736f2005-06-22 13:26:03 -0700186 memset(result, 0, 64);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700187
188 temp = 0;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800189 sg_init_table(sg, template[i].np);
190 for (k = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800191 sg_set_buf(&sg[k],
192 memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
193 offset_in_page(IDX[k]),
194 template[i].plaintext + temp,
195 template[i].tap[k]),
196 template[i].tap[k]);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800197 temp += template[i].tap[k];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198 }
199
Sebastian Siewior562954d2008-03-13 20:20:28 +0800200 if (template[i].ksize) {
Loc Hocde0e2c82008-05-14 21:24:51 +0800201 crypto_ahash_clear_flags(tfm, ~0);
202 ret = crypto_ahash_setkey(tfm, template[i].key,
203 template[i].ksize);
Herbert Xuef2736f2005-06-22 13:26:03 -0700204
Herbert Xue9d41162006-08-19 21:38:49 +1000205 if (ret) {
Herbert Xubdecd222008-07-31 14:03:44 +0800206 printk(KERN_ERR "alg: hash: setkey "
207 "failed on chunking test %d "
208 "for %s: ret=%d\n", j, algo,
209 -ret);
Herbert Xue9d41162006-08-19 21:38:49 +1000210 goto out;
211 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700212 }
213
Loc Hocde0e2c82008-05-14 21:24:51 +0800214 ahash_request_set_crypt(req, sg, result,
215 template[i].psize);
216 ret = crypto_ahash_digest(req);
217 switch (ret) {
218 case 0:
219 break;
220 case -EINPROGRESS:
221 case -EBUSY:
222 ret = wait_for_completion_interruptible(
223 &tresult.completion);
224 if (!ret && !(ret = tresult.err)) {
225 INIT_COMPLETION(tresult.completion);
226 break;
227 }
228 /* fall through */
229 default:
Herbert Xubdecd222008-07-31 14:03:44 +0800230 printk(KERN_ERR "alg: hash: digest failed "
231 "on chunking test %d for %s: "
232 "ret=%d\n", j, algo, -ret);
Herbert Xue9d41162006-08-19 21:38:49 +1000233 goto out;
234 }
Herbert Xuef2736f2005-06-22 13:26:03 -0700235
Herbert Xubdecd222008-07-31 14:03:44 +0800236 if (memcmp(result, template[i].digest,
237 crypto_ahash_digestsize(tfm))) {
238 printk(KERN_ERR "alg: hash: Chunking test %d "
239 "failed for %s\n", j, algo);
240 hexdump(result, crypto_ahash_digestsize(tfm));
241 ret = -EINVAL;
242 goto out;
243 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700244 }
245 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246
Herbert Xubdecd222008-07-31 14:03:44 +0800247 ret = 0;
248
Herbert Xue9d41162006-08-19 21:38:49 +1000249out:
Loc Hocde0e2c82008-05-14 21:24:51 +0800250 ahash_request_free(req);
251out_noreq:
252 crypto_free_ahash(tfm);
Herbert Xubdecd222008-07-31 14:03:44 +0800253 return ret;
Herbert Xue9d41162006-08-19 21:38:49 +1000254}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700255
Herbert Xubdecd222008-07-31 14:03:44 +0800256static int test_aead(char *algo, int enc, struct aead_testvec *template,
257 unsigned int tcount)
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800258{
Herbert Xubdecd222008-07-31 14:03:44 +0800259 unsigned int i, j, k, n, temp;
260 int ret = 0;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800261 char *q;
262 struct crypto_aead *tfm;
263 char *key;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800264 struct aead_request *req;
265 struct scatterlist sg[8];
266 struct scatterlist asg[8];
267 const char *e;
268 struct tcrypt_result result;
Herbert Xu6160b282007-12-04 19:17:50 +1100269 unsigned int authsize;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800270 void *input;
271 void *assoc;
272 char iv[MAX_IVLEN];
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800273
274 if (enc == ENCRYPT)
275 e = "encryption";
276 else
277 e = "decryption";
278
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800279 init_completion(&result.completion);
280
281 tfm = crypto_alloc_aead(algo, 0, 0);
282
283 if (IS_ERR(tfm)) {
Herbert Xubdecd222008-07-31 14:03:44 +0800284 printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
285 "%ld\n", algo, PTR_ERR(tfm));
286 return PTR_ERR(tfm);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800287 }
288
289 req = aead_request_alloc(tfm, GFP_KERNEL);
290 if (!req) {
Herbert Xubdecd222008-07-31 14:03:44 +0800291 printk(KERN_ERR "alg: aead: Failed to allocate request for "
292 "%s\n", algo);
293 ret = -ENOMEM;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800294 goto out;
295 }
296
297 aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
298 tcrypt_complete, &result);
299
300 for (i = 0, j = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800301 if (!template[i].np) {
Herbert Xubdecd222008-07-31 14:03:44 +0800302 j++;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800303
304 /* some tepmplates have no input data but they will
305 * touch input
306 */
Herbert Xuf139cfa2008-07-31 12:23:53 +0800307 input = xbuf[0];
308 assoc = axbuf[0];
Sebastian Siewior562954d2008-03-13 20:20:28 +0800309
310 memcpy(input, template[i].input, template[i].ilen);
311 memcpy(assoc, template[i].assoc, template[i].alen);
312 if (template[i].iv)
313 memcpy(iv, template[i].iv, MAX_IVLEN);
314 else
315 memset(iv, 0, MAX_IVLEN);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800316
317 crypto_aead_clear_flags(tfm, ~0);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800318 if (template[i].wk)
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800319 crypto_aead_set_flags(
320 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800321
Herbert Xuf139cfa2008-07-31 12:23:53 +0800322 key = template[i].key;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800323
324 ret = crypto_aead_setkey(tfm, key,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800325 template[i].klen);
Herbert Xubdecd222008-07-31 14:03:44 +0800326 if (!ret == template[i].fail) {
327 printk(KERN_ERR "alg: aead: setkey failed on "
328 "test %d for %s: flags=%x\n", j, algo,
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800329 crypto_aead_get_flags(tfm));
Herbert Xubdecd222008-07-31 14:03:44 +0800330 goto out;
331 } else if (ret)
332 continue;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800333
Sebastian Siewior562954d2008-03-13 20:20:28 +0800334 authsize = abs(template[i].rlen - template[i].ilen);
Joy Latten93cc74e2007-12-12 20:24:22 +0800335 ret = crypto_aead_setauthsize(tfm, authsize);
336 if (ret) {
Herbert Xubdecd222008-07-31 14:03:44 +0800337 printk(KERN_ERR "alg: aead: Failed to set "
338 "authsize to %u on test %d for %s\n",
339 authsize, j, algo);
340 goto out;
Joy Latten93cc74e2007-12-12 20:24:22 +0800341 }
342
Sebastian Siewior562954d2008-03-13 20:20:28 +0800343 sg_init_one(&sg[0], input,
344 template[i].ilen + (enc ? authsize : 0));
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800345
Sebastian Siewior562954d2008-03-13 20:20:28 +0800346 sg_init_one(&asg[0], assoc, template[i].alen);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800347
348 aead_request_set_crypt(req, sg, sg,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800349 template[i].ilen, iv);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800350
Sebastian Siewior562954d2008-03-13 20:20:28 +0800351 aead_request_set_assoc(req, asg, template[i].alen);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800352
Herbert Xu6160b282007-12-04 19:17:50 +1100353 ret = enc ?
354 crypto_aead_encrypt(req) :
355 crypto_aead_decrypt(req);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800356
357 switch (ret) {
358 case 0:
359 break;
360 case -EINPROGRESS:
361 case -EBUSY:
362 ret = wait_for_completion_interruptible(
363 &result.completion);
364 if (!ret && !(ret = result.err)) {
365 INIT_COMPLETION(result.completion);
366 break;
367 }
368 /* fall through */
369 default:
Herbert Xubdecd222008-07-31 14:03:44 +0800370 printk(KERN_ERR "alg: aead: %s failed on test "
371 "%d for %s: ret=%d\n", e, j, algo, -ret);
372 goto out;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800373 }
374
Herbert Xu4b22f0d2008-07-03 14:57:30 +0800375 q = input;
Herbert Xubdecd222008-07-31 14:03:44 +0800376 if (memcmp(q, template[i].result, template[i].rlen)) {
377 printk(KERN_ERR "alg: aead: Test %d failed on "
378 "%s for %s\n", j, e, algo);
379 hexdump(q, template[i].rlen);
380 ret = -EINVAL;
381 goto out;
382 }
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800383 }
384 }
385
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800386 for (i = 0, j = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800387 if (template[i].np) {
Herbert Xubdecd222008-07-31 14:03:44 +0800388 j++;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800389
390 if (template[i].iv)
391 memcpy(iv, template[i].iv, MAX_IVLEN);
392 else
393 memset(iv, 0, MAX_IVLEN);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800394
395 crypto_aead_clear_flags(tfm, ~0);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800396 if (template[i].wk)
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800397 crypto_aead_set_flags(
398 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800399 key = template[i].key;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800400
Sebastian Siewior562954d2008-03-13 20:20:28 +0800401 ret = crypto_aead_setkey(tfm, key, template[i].klen);
Herbert Xubdecd222008-07-31 14:03:44 +0800402 if (!ret == template[i].fail) {
403 printk(KERN_ERR "alg: aead: setkey failed on "
404 "chunk test %d for %s: flags=%x\n", j,
405 algo, crypto_aead_get_flags(tfm));
406 goto out;
407 } else if (ret)
408 continue;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800409
Herbert Xuf139cfa2008-07-31 12:23:53 +0800410 authsize = abs(template[i].rlen - template[i].ilen);
411
Herbert Xubdecd222008-07-31 14:03:44 +0800412 ret = -EINVAL;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800413 sg_init_table(sg, template[i].np);
414 for (k = 0, temp = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800415 if (WARN_ON(offset_in_page(IDX[k]) +
416 template[i].tap[k] > PAGE_SIZE))
417 goto out;
418
419 q = xbuf[IDX[k] >> PAGE_SHIFT] +
420 offset_in_page(IDX[k]);
421
422 memcpy(q, template[i].input + temp,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800423 template[i].tap[k]);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800424
425 n = template[i].tap[k];
426 if (k == template[i].np - 1 && enc)
427 n += authsize;
428 if (offset_in_page(q) + n < PAGE_SIZE)
429 q[n] = 0;
430
431 sg_set_buf(&sg[k], q, template[i].tap[k]);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800432 temp += template[i].tap[k];
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800433 }
434
Joy Latten93cc74e2007-12-12 20:24:22 +0800435 ret = crypto_aead_setauthsize(tfm, authsize);
436 if (ret) {
Herbert Xubdecd222008-07-31 14:03:44 +0800437 printk(KERN_ERR "alg: aead: Failed to set "
438 "authsize to %u on chunk test %d for "
439 "%s\n", authsize, j, algo);
Joy Latten93cc74e2007-12-12 20:24:22 +0800440 goto out;
441 }
442
Herbert Xuf139cfa2008-07-31 12:23:53 +0800443 if (enc) {
444 if (WARN_ON(sg[k - 1].offset +
445 sg[k - 1].length + authsize >
Herbert Xubdecd222008-07-31 14:03:44 +0800446 PAGE_SIZE)) {
447 ret = -EINVAL;
Herbert Xuf139cfa2008-07-31 12:23:53 +0800448 goto out;
Herbert Xubdecd222008-07-31 14:03:44 +0800449 }
Herbert Xuf139cfa2008-07-31 12:23:53 +0800450
Herbert Xu6160b282007-12-04 19:17:50 +1100451 sg[k - 1].length += authsize;
Herbert Xuf139cfa2008-07-31 12:23:53 +0800452 }
Herbert Xu6160b282007-12-04 19:17:50 +1100453
Sebastian Siewior562954d2008-03-13 20:20:28 +0800454 sg_init_table(asg, template[i].anp);
455 for (k = 0, temp = 0; k < template[i].anp; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800456 sg_set_buf(&asg[k],
457 memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
458 offset_in_page(IDX[k]),
459 template[i].assoc + temp,
460 template[i].atap[k]),
Sebastian Siewior562954d2008-03-13 20:20:28 +0800461 template[i].atap[k]);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800462 temp += template[i].atap[k];
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800463 }
464
465 aead_request_set_crypt(req, sg, sg,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800466 template[i].ilen,
467 iv);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800468
Sebastian Siewior562954d2008-03-13 20:20:28 +0800469 aead_request_set_assoc(req, asg, template[i].alen);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800470
Herbert Xu6160b282007-12-04 19:17:50 +1100471 ret = enc ?
472 crypto_aead_encrypt(req) :
473 crypto_aead_decrypt(req);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800474
475 switch (ret) {
476 case 0:
477 break;
478 case -EINPROGRESS:
479 case -EBUSY:
480 ret = wait_for_completion_interruptible(
481 &result.completion);
482 if (!ret && !(ret = result.err)) {
483 INIT_COMPLETION(result.completion);
484 break;
485 }
486 /* fall through */
487 default:
Herbert Xubdecd222008-07-31 14:03:44 +0800488 printk(KERN_ERR "alg: aead: %s failed on "
489 "chunk test %d for %s: ret=%d\n", e, j,
490 algo, -ret);
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800491 goto out;
492 }
493
Herbert Xubdecd222008-07-31 14:03:44 +0800494 ret = -EINVAL;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800495 for (k = 0, temp = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800496 q = xbuf[IDX[k] >> PAGE_SHIFT] +
497 offset_in_page(IDX[k]);
Herbert Xuf176e632008-07-30 16:23:51 +0800498
499 n = template[i].tap[k];
500 if (k == template[i].np - 1)
501 n += enc ? authsize : -authsize;
Herbert Xubdecd222008-07-31 14:03:44 +0800502
503 if (memcmp(q, template[i].result + temp, n)) {
504 printk(KERN_ERR "alg: aead: Chunk "
505 "test %d failed on %s at page "
506 "%u for %s\n", j, e, k, algo);
507 hexdump(q, n);
508 goto out;
509 }
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800510
Herbert Xuf176e632008-07-30 16:23:51 +0800511 q += n;
512 if (k == template[i].np - 1 && !enc) {
513 if (memcmp(q, template[i].input +
514 temp + n, authsize))
515 n = authsize;
516 else
517 n = 0;
518 } else {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800519 for (n = 0; offset_in_page(q + n) &&
520 q[n]; n++)
Herbert Xuf176e632008-07-30 16:23:51 +0800521 ;
522 }
Patrick McHardya558f1d2008-05-08 19:27:47 +0800523 if (n) {
Herbert Xubdecd222008-07-31 14:03:44 +0800524 printk(KERN_ERR "alg: aead: Result "
525 "buffer corruption in chunk "
526 "test %d on %s at page %u for "
527 "%s: %u bytes:\n", j, e, k,
528 algo, n);
Herbert Xuf176e632008-07-30 16:23:51 +0800529 hexdump(q, n);
Herbert Xubdecd222008-07-31 14:03:44 +0800530 goto out;
Patrick McHardya558f1d2008-05-08 19:27:47 +0800531 }
532
Sebastian Siewior562954d2008-03-13 20:20:28 +0800533 temp += template[i].tap[k];
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800534 }
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800535 }
536 }
537
Herbert Xubdecd222008-07-31 14:03:44 +0800538 ret = 0;
539
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800540out:
541 crypto_free_aead(tfm);
542 aead_request_free(req);
Herbert Xubdecd222008-07-31 14:03:44 +0800543 return ret;
Mikko Herranene3a4ea42007-11-26 22:12:07 +0800544}
545
Herbert Xubdecd222008-07-31 14:03:44 +0800546static int test_cipher(char *algo, int enc,
547 struct cipher_testvec *template, unsigned int tcount)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548{
Herbert Xubdecd222008-07-31 14:03:44 +0800549 unsigned int i, j, k, n, temp;
550 int ret;
David Hardeman378f0582005-09-17 17:55:31 +1000551 char *q;
Herbert Xu6158efc2007-04-04 17:41:07 +1000552 struct crypto_ablkcipher *tfm;
Herbert Xu6158efc2007-04-04 17:41:07 +1000553 struct ablkcipher_request *req;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700554 struct scatterlist sg[8];
Herbert Xucba83562006-08-13 08:26:09 +1000555 const char *e;
Herbert Xu6158efc2007-04-04 17:41:07 +1000556 struct tcrypt_result result;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800557 void *data;
558 char iv[MAX_IVLEN];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559
560 if (enc == ENCRYPT)
Herbert Xu3cc38162005-06-22 13:26:36 -0700561 e = "encryption";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562 else
Herbert Xu3cc38162005-06-22 13:26:36 -0700563 e = "decryption";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700564
Herbert Xu6158efc2007-04-04 17:41:07 +1000565 init_completion(&result.completion);
Herbert Xu6158efc2007-04-04 17:41:07 +1000566 tfm = crypto_alloc_ablkcipher(algo, 0, 0);
Herbert Xuef2736f2005-06-22 13:26:03 -0700567
Herbert Xucba83562006-08-13 08:26:09 +1000568 if (IS_ERR(tfm)) {
Herbert Xubdecd222008-07-31 14:03:44 +0800569 printk(KERN_ERR "alg: cipher: Failed to load transform for "
570 "%s: %ld\n", algo, PTR_ERR(tfm));
571 return PTR_ERR(tfm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700572 }
Herbert Xu6158efc2007-04-04 17:41:07 +1000573
574 req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
575 if (!req) {
Herbert Xubdecd222008-07-31 14:03:44 +0800576 printk(KERN_ERR "alg: cipher: Failed to allocate request for "
577 "%s\n", algo);
578 ret = -ENOMEM;
Herbert Xu6158efc2007-04-04 17:41:07 +1000579 goto out;
580 }
581
582 ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
583 tcrypt_complete, &result);
Herbert Xuef2736f2005-06-22 13:26:03 -0700584
Linus Torvalds1da177e2005-04-16 15:20:36 -0700585 j = 0;
586 for (i = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800587 if (template[i].iv)
588 memcpy(iv, template[i].iv, MAX_IVLEN);
589 else
590 memset(iv, 0, MAX_IVLEN);
591
592 if (!(template[i].np)) {
Herbert Xuef2736f2005-06-22 13:26:03 -0700593 j++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700594
Herbert Xuf139cfa2008-07-31 12:23:53 +0800595 data = xbuf[0];
596 memcpy(data, template[i].input, template[i].ilen);
597
Herbert Xu6158efc2007-04-04 17:41:07 +1000598 crypto_ablkcipher_clear_flags(tfm, ~0);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800599 if (template[i].wk)
Herbert Xu6158efc2007-04-04 17:41:07 +1000600 crypto_ablkcipher_set_flags(
Herbert Xucba83562006-08-13 08:26:09 +1000601 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
Herbert Xuef2736f2005-06-22 13:26:03 -0700602
Sebastian Siewior562954d2008-03-13 20:20:28 +0800603 ret = crypto_ablkcipher_setkey(tfm, template[i].key,
604 template[i].klen);
Herbert Xubdecd222008-07-31 14:03:44 +0800605 if (!ret == template[i].fail) {
606 printk(KERN_ERR "alg: cipher: setkey failed "
607 "on test %d for %s: flags=%x\n", j,
608 algo, crypto_ablkcipher_get_flags(tfm));
609 goto out;
610 } else if (ret)
611 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700612
Sebastian Siewior562954d2008-03-13 20:20:28 +0800613 sg_init_one(&sg[0], data, template[i].ilen);
Herbert Xuef2736f2005-06-22 13:26:03 -0700614
Herbert Xu6158efc2007-04-04 17:41:07 +1000615 ablkcipher_request_set_crypt(req, sg, sg,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800616 template[i].ilen, iv);
Herbert Xucba83562006-08-13 08:26:09 +1000617 ret = enc ?
Herbert Xu6158efc2007-04-04 17:41:07 +1000618 crypto_ablkcipher_encrypt(req) :
619 crypto_ablkcipher_decrypt(req);
Herbert Xuef2736f2005-06-22 13:26:03 -0700620
Herbert Xu6158efc2007-04-04 17:41:07 +1000621 switch (ret) {
622 case 0:
623 break;
624 case -EINPROGRESS:
625 case -EBUSY:
626 ret = wait_for_completion_interruptible(
627 &result.completion);
628 if (!ret && !((ret = result.err))) {
629 INIT_COMPLETION(result.completion);
630 break;
631 }
632 /* fall through */
633 default:
Herbert Xubdecd222008-07-31 14:03:44 +0800634 printk(KERN_ERR "alg: cipher: %s failed on "
635 "test %d for %s: ret=%d\n", e, j, algo,
636 -ret);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700637 goto out;
Herbert Xuef2736f2005-06-22 13:26:03 -0700638 }
639
Herbert Xu4b22f0d2008-07-03 14:57:30 +0800640 q = data;
Herbert Xubdecd222008-07-31 14:03:44 +0800641 if (memcmp(q, template[i].result, template[i].rlen)) {
642 printk(KERN_ERR "alg: cipher: Test %d failed "
643 "on %s for %s\n", j, e, algo);
644 hexdump(q, template[i].rlen);
645 ret = -EINVAL;
646 goto out;
647 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648 }
649 }
Herbert Xuef2736f2005-06-22 13:26:03 -0700650
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651 j = 0;
652 for (i = 0; i < tcount; i++) {
Sebastian Siewior562954d2008-03-13 20:20:28 +0800653
Sebastian Siewior562954d2008-03-13 20:20:28 +0800654 if (template[i].iv)
655 memcpy(iv, template[i].iv, MAX_IVLEN);
656 else
657 memset(iv, 0, MAX_IVLEN);
658
659 if (template[i].np) {
Herbert Xuef2736f2005-06-22 13:26:03 -0700660 j++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661
Herbert Xu6158efc2007-04-04 17:41:07 +1000662 crypto_ablkcipher_clear_flags(tfm, ~0);
Sebastian Siewior562954d2008-03-13 20:20:28 +0800663 if (template[i].wk)
Herbert Xu6158efc2007-04-04 17:41:07 +1000664 crypto_ablkcipher_set_flags(
Herbert Xucba83562006-08-13 08:26:09 +1000665 tfm, CRYPTO_TFM_REQ_WEAK_KEY);
Herbert Xuef2736f2005-06-22 13:26:03 -0700666
Sebastian Siewior562954d2008-03-13 20:20:28 +0800667 ret = crypto_ablkcipher_setkey(tfm, template[i].key,
668 template[i].klen);
Herbert Xubdecd222008-07-31 14:03:44 +0800669 if (!ret == template[i].fail) {
670 printk(KERN_ERR "alg: cipher: setkey failed "
671 "on chunk test %d for %s: flags=%x\n",
672 j, algo,
673 crypto_ablkcipher_get_flags(tfm));
674 goto out;
675 } else if (ret)
676 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677
678 temp = 0;
Herbert Xubdecd222008-07-31 14:03:44 +0800679 ret = -EINVAL;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800680 sg_init_table(sg, template[i].np);
681 for (k = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800682 if (WARN_ON(offset_in_page(IDX[k]) +
683 template[i].tap[k] > PAGE_SIZE))
684 goto out;
685
686 q = xbuf[IDX[k] >> PAGE_SHIFT] +
687 offset_in_page(IDX[k]);
688
689 memcpy(q, template[i].input + temp,
690 template[i].tap[k]);
691
692 if (offset_in_page(q) + template[i].tap[k] <
693 PAGE_SIZE)
694 q[template[i].tap[k]] = 0;
695
696 sg_set_buf(&sg[k], q, template[i].tap[k]);
697
Sebastian Siewior562954d2008-03-13 20:20:28 +0800698 temp += template[i].tap[k];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700699 }
Herbert Xuef2736f2005-06-22 13:26:03 -0700700
Herbert Xu6158efc2007-04-04 17:41:07 +1000701 ablkcipher_request_set_crypt(req, sg, sg,
Sebastian Siewior562954d2008-03-13 20:20:28 +0800702 template[i].ilen, iv);
Herbert Xuef2736f2005-06-22 13:26:03 -0700703
Herbert Xucba83562006-08-13 08:26:09 +1000704 ret = enc ?
Herbert Xu6158efc2007-04-04 17:41:07 +1000705 crypto_ablkcipher_encrypt(req) :
706 crypto_ablkcipher_decrypt(req);
Herbert Xuef2736f2005-06-22 13:26:03 -0700707
Herbert Xu6158efc2007-04-04 17:41:07 +1000708 switch (ret) {
709 case 0:
710 break;
711 case -EINPROGRESS:
712 case -EBUSY:
713 ret = wait_for_completion_interruptible(
714 &result.completion);
715 if (!ret && !((ret = result.err))) {
716 INIT_COMPLETION(result.completion);
717 break;
718 }
719 /* fall through */
720 default:
Herbert Xubdecd222008-07-31 14:03:44 +0800721 printk(KERN_ERR "alg: cipher: %s failed on "
722 "chunk test %d for %s: ret=%d\n", e, j,
723 algo, -ret);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700724 goto out;
725 }
726
727 temp = 0;
Herbert Xubdecd222008-07-31 14:03:44 +0800728 ret = -EINVAL;
Sebastian Siewior562954d2008-03-13 20:20:28 +0800729 for (k = 0; k < template[i].np; k++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800730 q = xbuf[IDX[k] >> PAGE_SHIFT] +
731 offset_in_page(IDX[k]);
Herbert Xubdecd222008-07-31 14:03:44 +0800732
733 if (memcmp(q, template[i].result + temp,
734 template[i].tap[k])) {
735 printk(KERN_ERR "alg: cipher: Chunk "
736 "test %d failed on %s at page "
737 "%u for %s\n", j, e, k, algo);
738 hexdump(q, template[i].tap[k]);
739 goto out;
740 }
Patrick McHardya558f1d2008-05-08 19:27:47 +0800741
Herbert Xuf139cfa2008-07-31 12:23:53 +0800742 q += template[i].tap[k];
743 for (n = 0; offset_in_page(q + n) && q[n]; n++)
Patrick McHardya558f1d2008-05-08 19:27:47 +0800744 ;
745 if (n) {
Herbert Xubdecd222008-07-31 14:03:44 +0800746 printk(KERN_ERR "alg: cipher: "
747 "Result buffer corruption in "
748 "chunk test %d on %s at page "
749 "%u for %s: %u bytes:\n", j, e,
750 k, algo, n);
Herbert Xuf139cfa2008-07-31 12:23:53 +0800751 hexdump(q, n);
Herbert Xubdecd222008-07-31 14:03:44 +0800752 goto out;
Patrick McHardya558f1d2008-05-08 19:27:47 +0800753 }
Sebastian Siewior562954d2008-03-13 20:20:28 +0800754 temp += template[i].tap[k];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755 }
756 }
757 }
Herbert Xubdecd222008-07-31 14:03:44 +0800758
759 ret = 0;
760
Linus Torvalds1da177e2005-04-16 15:20:36 -0700761out:
Herbert Xu6158efc2007-04-04 17:41:07 +1000762 crypto_free_ablkcipher(tfm);
763 ablkcipher_request_free(req);
Herbert Xubdecd222008-07-31 14:03:44 +0800764 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700765}
766
Herbert Xuf139cfa2008-07-31 12:23:53 +0800767static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
768 struct scatterlist *sg, int blen, int sec)
Herbert Xu6a179442005-06-22 13:29:03 -0700769{
Herbert Xu6a179442005-06-22 13:29:03 -0700770 unsigned long start, end;
771 int bcount;
772 int ret;
773
Herbert Xu6a179442005-06-22 13:29:03 -0700774 for (start = jiffies, end = start + sec * HZ, bcount = 0;
775 time_before(jiffies, end); bcount++) {
776 if (enc)
Herbert Xucba83562006-08-13 08:26:09 +1000777 ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700778 else
Herbert Xucba83562006-08-13 08:26:09 +1000779 ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700780
781 if (ret)
782 return ret;
783 }
784
785 printk("%d operations in %d seconds (%ld bytes)\n",
786 bcount, sec, (long)bcount * blen);
787 return 0;
788}
789
Herbert Xuf139cfa2008-07-31 12:23:53 +0800790static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
791 struct scatterlist *sg, int blen)
Herbert Xu6a179442005-06-22 13:29:03 -0700792{
Herbert Xu6a179442005-06-22 13:29:03 -0700793 unsigned long cycles = 0;
794 int ret = 0;
795 int i;
796
Herbert Xu6a179442005-06-22 13:29:03 -0700797 local_bh_disable();
798 local_irq_disable();
799
800 /* Warm-up run. */
801 for (i = 0; i < 4; i++) {
802 if (enc)
Herbert Xucba83562006-08-13 08:26:09 +1000803 ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700804 else
Herbert Xucba83562006-08-13 08:26:09 +1000805 ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700806
807 if (ret)
808 goto out;
809 }
810
811 /* The real thing. */
812 for (i = 0; i < 8; i++) {
813 cycles_t start, end;
814
815 start = get_cycles();
816 if (enc)
Herbert Xucba83562006-08-13 08:26:09 +1000817 ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700818 else
Herbert Xucba83562006-08-13 08:26:09 +1000819 ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
Herbert Xu6a179442005-06-22 13:29:03 -0700820 end = get_cycles();
821
822 if (ret)
823 goto out;
824
825 cycles += end - start;
826 }
827
828out:
829 local_irq_enable();
830 local_bh_enable();
831
832 if (ret == 0)
833 printk("1 operation in %lu cycles (%d bytes)\n",
834 (cycles + 4) / 8, blen);
835
836 return ret;
837}
838
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800839static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
840
Herbert Xucba83562006-08-13 08:26:09 +1000841static void test_cipher_speed(char *algo, int enc, unsigned int sec,
Herbert Xudce907c2005-06-22 13:27:51 -0700842 struct cipher_testvec *template,
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800843 unsigned int tcount, u8 *keysize)
Harald Welteebfd9bc2005-06-22 13:27:23 -0700844{
Herbert Xudce907c2005-06-22 13:27:51 -0700845 unsigned int ret, i, j, iv_len;
Herbert Xuf139cfa2008-07-31 12:23:53 +0800846 unsigned char *key, iv[128];
Herbert Xucba83562006-08-13 08:26:09 +1000847 struct crypto_blkcipher *tfm;
848 struct blkcipher_desc desc;
849 const char *e;
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800850 u32 *b_size;
Harald Welteebfd9bc2005-06-22 13:27:23 -0700851
852 if (enc == ENCRYPT)
853 e = "encryption";
854 else
855 e = "decryption";
Harald Welteebfd9bc2005-06-22 13:27:23 -0700856
Herbert Xucba83562006-08-13 08:26:09 +1000857 printk("\ntesting speed of %s %s\n", algo, e);
Harald Welteebfd9bc2005-06-22 13:27:23 -0700858
Herbert Xucba83562006-08-13 08:26:09 +1000859 tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
Harald Welteebfd9bc2005-06-22 13:27:23 -0700860
Herbert Xucba83562006-08-13 08:26:09 +1000861 if (IS_ERR(tfm)) {
862 printk("failed to load transform for %s: %ld\n", algo,
863 PTR_ERR(tfm));
Harald Welteebfd9bc2005-06-22 13:27:23 -0700864 return;
865 }
Herbert Xucba83562006-08-13 08:26:09 +1000866 desc.tfm = tfm;
867 desc.flags = 0;
Harald Welteebfd9bc2005-06-22 13:27:23 -0700868
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800869 i = 0;
870 do {
Harald Welteebfd9bc2005-06-22 13:27:23 -0700871
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800872 b_size = block_sizes;
873 do {
Herbert Xuf139cfa2008-07-31 12:23:53 +0800874 struct scatterlist sg[TVMEMSIZE];
Harald Welteebfd9bc2005-06-22 13:27:23 -0700875
Herbert Xuf139cfa2008-07-31 12:23:53 +0800876 if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
877 printk("template (%u) too big for "
878 "tvmem (%lu)\n", *keysize + *b_size,
879 TVMEMSIZE * PAGE_SIZE);
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800880 goto out;
881 }
Harald Welteebfd9bc2005-06-22 13:27:23 -0700882
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800883 printk("test %u (%d bit key, %d byte blocks): ", i,
884 *keysize * 8, *b_size);
885
Herbert Xuf139cfa2008-07-31 12:23:53 +0800886 memset(tvmem[0], 0xff, PAGE_SIZE);
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800887
888 /* set key, plain text and IV */
Herbert Xuf139cfa2008-07-31 12:23:53 +0800889 key = (unsigned char *)tvmem[0];
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800890 for (j = 0; j < tcount; j++) {
891 if (template[j].klen == *keysize) {
892 key = template[j].key;
893 break;
894 }
895 }
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800896
897 ret = crypto_blkcipher_setkey(tfm, key, *keysize);
898 if (ret) {
899 printk("setkey() failed flags=%x\n",
900 crypto_blkcipher_get_flags(tfm));
901 goto out;
902 }
903
Herbert Xuf139cfa2008-07-31 12:23:53 +0800904 sg_init_table(sg, TVMEMSIZE);
905 sg_set_buf(sg, tvmem[0] + *keysize,
906 PAGE_SIZE - *keysize);
907 for (j = 1; j < TVMEMSIZE; j++) {
908 sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
909 memset (tvmem[j], 0xff, PAGE_SIZE);
910 }
911
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800912 iv_len = crypto_blkcipher_ivsize(tfm);
913 if (iv_len) {
914 memset(&iv, 0xff, iv_len);
915 crypto_blkcipher_set_iv(tfm, iv, iv_len);
916 }
917
918 if (sec)
Herbert Xuf139cfa2008-07-31 12:23:53 +0800919 ret = test_cipher_jiffies(&desc, enc, sg,
920 *b_size, sec);
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800921 else
Herbert Xuf139cfa2008-07-31 12:23:53 +0800922 ret = test_cipher_cycles(&desc, enc, sg,
923 *b_size);
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800924
925 if (ret) {
926 printk("%s() failed flags=%x\n", e, desc.flags);
Herbert Xudce907c2005-06-22 13:27:51 -0700927 break;
928 }
Sebastian Siewiord5dc3922008-03-11 21:27:11 +0800929 b_size++;
930 i++;
931 } while (*b_size);
932 keysize++;
933 } while (*keysize);
Harald Welteebfd9bc2005-06-22 13:27:23 -0700934
935out:
Herbert Xucba83562006-08-13 08:26:09 +1000936 crypto_free_blkcipher(tfm);
Harald Welteebfd9bc2005-06-22 13:27:23 -0700937}
938
Herbert Xuf139cfa2008-07-31 12:23:53 +0800939static int test_hash_jiffies_digest(struct hash_desc *desc,
940 struct scatterlist *sg, int blen,
Herbert Xue9d41162006-08-19 21:38:49 +1000941 char *out, int sec)
Michal Ludvige8057922006-05-30 22:04:19 +1000942{
Michal Ludvige8057922006-05-30 22:04:19 +1000943 unsigned long start, end;
Herbert Xue9d41162006-08-19 21:38:49 +1000944 int bcount;
945 int ret;
Michal Ludvige8057922006-05-30 22:04:19 +1000946
947 for (start = jiffies, end = start + sec * HZ, bcount = 0;
948 time_before(jiffies, end); bcount++) {
Herbert Xue9d41162006-08-19 21:38:49 +1000949 ret = crypto_hash_digest(desc, sg, blen, out);
950 if (ret)
951 return ret;
Michal Ludvige8057922006-05-30 22:04:19 +1000952 }
953
954 printk("%6u opers/sec, %9lu bytes/sec\n",
955 bcount / sec, ((long)bcount * blen) / sec);
956
Herbert Xue9d41162006-08-19 21:38:49 +1000957 return 0;
Michal Ludvige8057922006-05-30 22:04:19 +1000958}
959
Herbert Xuf139cfa2008-07-31 12:23:53 +0800960static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
961 int blen, int plen, char *out, int sec)
Herbert Xue9d41162006-08-19 21:38:49 +1000962{
Herbert Xue9d41162006-08-19 21:38:49 +1000963 unsigned long start, end;
964 int bcount, pcount;
965 int ret;
966
967 if (plen == blen)
Herbert Xuf139cfa2008-07-31 12:23:53 +0800968 return test_hash_jiffies_digest(desc, sg, blen, out, sec);
Herbert Xua5a613a2007-10-27 00:51:21 -0700969
Herbert Xue9d41162006-08-19 21:38:49 +1000970 for (start = jiffies, end = start + sec * HZ, bcount = 0;
971 time_before(jiffies, end); bcount++) {
972 ret = crypto_hash_init(desc);
973 if (ret)
974 return ret;
975 for (pcount = 0; pcount < blen; pcount += plen) {
Herbert Xue9d41162006-08-19 21:38:49 +1000976 ret = crypto_hash_update(desc, sg, plen);
977 if (ret)
978 return ret;
979 }
980 /* we assume there is enough space in 'out' for the result */
981 ret = crypto_hash_final(desc, out);
982 if (ret)
983 return ret;
984 }
985
986 printk("%6u opers/sec, %9lu bytes/sec\n",
987 bcount / sec, ((long)bcount * blen) / sec);
988
989 return 0;
990}
991
Herbert Xuf139cfa2008-07-31 12:23:53 +0800992static int test_hash_cycles_digest(struct hash_desc *desc,
993 struct scatterlist *sg, int blen, char *out)
Michal Ludvige8057922006-05-30 22:04:19 +1000994{
Michal Ludvige8057922006-05-30 22:04:19 +1000995 unsigned long cycles = 0;
Herbert Xue9d41162006-08-19 21:38:49 +1000996 int i;
997 int ret;
Michal Ludvige8057922006-05-30 22:04:19 +1000998
999 local_bh_disable();
1000 local_irq_disable();
1001
1002 /* Warm-up run. */
1003 for (i = 0; i < 4; i++) {
Herbert Xue9d41162006-08-19 21:38:49 +10001004 ret = crypto_hash_digest(desc, sg, blen, out);
1005 if (ret)
1006 goto out;
Michal Ludvige8057922006-05-30 22:04:19 +10001007 }
1008
1009 /* The real thing. */
1010 for (i = 0; i < 8; i++) {
1011 cycles_t start, end;
1012
Michal Ludvige8057922006-05-30 22:04:19 +10001013 start = get_cycles();
1014
Herbert Xue9d41162006-08-19 21:38:49 +10001015 ret = crypto_hash_digest(desc, sg, blen, out);
1016 if (ret)
1017 goto out;
Michal Ludvige8057922006-05-30 22:04:19 +10001018
1019 end = get_cycles();
1020
1021 cycles += end - start;
1022 }
1023
Herbert Xue9d41162006-08-19 21:38:49 +10001024out:
Michal Ludvige8057922006-05-30 22:04:19 +10001025 local_irq_enable();
1026 local_bh_enable();
1027
Herbert Xue9d41162006-08-19 21:38:49 +10001028 if (ret)
1029 return ret;
1030
Michal Ludvige8057922006-05-30 22:04:19 +10001031 printk("%6lu cycles/operation, %4lu cycles/byte\n",
1032 cycles / 8, cycles / (8 * blen));
1033
Herbert Xue9d41162006-08-19 21:38:49 +10001034 return 0;
Michal Ludvige8057922006-05-30 22:04:19 +10001035}
1036
Herbert Xuf139cfa2008-07-31 12:23:53 +08001037static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
1038 int blen, int plen, char *out)
Michal Ludvige8057922006-05-30 22:04:19 +10001039{
Herbert Xue9d41162006-08-19 21:38:49 +10001040 unsigned long cycles = 0;
1041 int i, pcount;
1042 int ret;
1043
1044 if (plen == blen)
Herbert Xuf139cfa2008-07-31 12:23:53 +08001045 return test_hash_cycles_digest(desc, sg, blen, out);
Herbert Xua5a613a2007-10-27 00:51:21 -07001046
Herbert Xue9d41162006-08-19 21:38:49 +10001047 local_bh_disable();
1048 local_irq_disable();
1049
1050 /* Warm-up run. */
1051 for (i = 0; i < 4; i++) {
1052 ret = crypto_hash_init(desc);
1053 if (ret)
1054 goto out;
1055 for (pcount = 0; pcount < blen; pcount += plen) {
Herbert Xue9d41162006-08-19 21:38:49 +10001056 ret = crypto_hash_update(desc, sg, plen);
1057 if (ret)
1058 goto out;
1059 }
Herbert Xu29059d12007-05-18 16:25:19 +10001060 ret = crypto_hash_final(desc, out);
Herbert Xue9d41162006-08-19 21:38:49 +10001061 if (ret)
1062 goto out;
1063 }
1064
1065 /* The real thing. */
1066 for (i = 0; i < 8; i++) {
1067 cycles_t start, end;
1068
1069 start = get_cycles();
1070
1071 ret = crypto_hash_init(desc);
1072 if (ret)
1073 goto out;
1074 for (pcount = 0; pcount < blen; pcount += plen) {
Herbert Xue9d41162006-08-19 21:38:49 +10001075 ret = crypto_hash_update(desc, sg, plen);
1076 if (ret)
1077 goto out;
1078 }
1079 ret = crypto_hash_final(desc, out);
1080 if (ret)
1081 goto out;
1082
1083 end = get_cycles();
1084
1085 cycles += end - start;
1086 }
1087
1088out:
1089 local_irq_enable();
1090 local_bh_enable();
1091
1092 if (ret)
1093 return ret;
1094
1095 printk("%6lu cycles/operation, %4lu cycles/byte\n",
1096 cycles / 8, cycles / (8 * blen));
1097
1098 return 0;
1099}
1100
1101static void test_hash_speed(char *algo, unsigned int sec,
1102 struct hash_speed *speed)
1103{
Herbert Xuf139cfa2008-07-31 12:23:53 +08001104 struct scatterlist sg[TVMEMSIZE];
Herbert Xue9d41162006-08-19 21:38:49 +10001105 struct crypto_hash *tfm;
1106 struct hash_desc desc;
Michal Ludvige8057922006-05-30 22:04:19 +10001107 char output[1024];
1108 int i;
Herbert Xue9d41162006-08-19 21:38:49 +10001109 int ret;
Michal Ludvige8057922006-05-30 22:04:19 +10001110
1111 printk("\ntesting speed of %s\n", algo);
1112
Herbert Xue9d41162006-08-19 21:38:49 +10001113 tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
Michal Ludvige8057922006-05-30 22:04:19 +10001114
Herbert Xue9d41162006-08-19 21:38:49 +10001115 if (IS_ERR(tfm)) {
1116 printk("failed to load transform for %s: %ld\n", algo,
1117 PTR_ERR(tfm));
Michal Ludvige8057922006-05-30 22:04:19 +10001118 return;
1119 }
1120
Herbert Xue9d41162006-08-19 21:38:49 +10001121 desc.tfm = tfm;
1122 desc.flags = 0;
1123
1124 if (crypto_hash_digestsize(tfm) > sizeof(output)) {
Michal Ludvige8057922006-05-30 22:04:19 +10001125 printk("digestsize(%u) > outputbuffer(%zu)\n",
Herbert Xue9d41162006-08-19 21:38:49 +10001126 crypto_hash_digestsize(tfm), sizeof(output));
Michal Ludvige8057922006-05-30 22:04:19 +10001127 goto out;
1128 }
1129
Herbert Xuf139cfa2008-07-31 12:23:53 +08001130 sg_init_table(sg, TVMEMSIZE);
1131 for (i = 0; i < TVMEMSIZE; i++) {
1132 sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
1133 memset(tvmem[i], 0xff, PAGE_SIZE);
1134 }
1135
Michal Ludvige8057922006-05-30 22:04:19 +10001136 for (i = 0; speed[i].blen != 0; i++) {
Herbert Xuf139cfa2008-07-31 12:23:53 +08001137 if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
1138 printk("template (%u) too big for tvmem (%lu)\n",
1139 speed[i].blen, TVMEMSIZE * PAGE_SIZE);
Michal Ludvige8057922006-05-30 22:04:19 +10001140 goto out;
1141 }
1142
1143 printk("test%3u (%5u byte blocks,%5u bytes per update,%4u updates): ",
1144 i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
1145
Michal Ludvige8057922006-05-30 22:04:19 +10001146 if (sec)
Herbert Xuf139cfa2008-07-31 12:23:53 +08001147 ret = test_hash_jiffies(&desc, sg, speed[i].blen,
Herbert Xue9d41162006-08-19 21:38:49 +10001148 speed[i].plen, output, sec);
Michal Ludvige8057922006-05-30 22:04:19 +10001149 else
Herbert Xuf139cfa2008-07-31 12:23:53 +08001150 ret = test_hash_cycles(&desc, sg, speed[i].blen,
Herbert Xue9d41162006-08-19 21:38:49 +10001151 speed[i].plen, output);
1152
1153 if (ret) {
1154 printk("hashing failed ret=%d\n", ret);
1155 break;
1156 }
Michal Ludvige8057922006-05-30 22:04:19 +10001157 }
1158
1159out:
Herbert Xue9d41162006-08-19 21:38:49 +10001160 crypto_free_hash(tfm);
Michal Ludvige8057922006-05-30 22:04:19 +10001161}
1162
Herbert Xubdecd222008-07-31 14:03:44 +08001163static int test_comp(char *algo, struct comp_testvec *ctemplate,
1164 struct comp_testvec *dtemplate, int ctcount, int dtcount)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165{
1166 unsigned int i;
1167 char result[COMP_BUF_SIZE];
Herbert Xue4d5b792006-08-26 18:12:40 +10001168 struct crypto_comp *tfm;
Herbert Xubdecd222008-07-31 14:03:44 +08001169 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170
Zoltan Sogor91755a92007-12-07 16:48:11 +08001171 tfm = crypto_alloc_comp(algo, 0, CRYPTO_ALG_ASYNC);
Sebastian Siewior7bc301e2007-03-21 08:58:43 +11001172 if (IS_ERR(tfm)) {
Herbert Xubdecd222008-07-31 14:03:44 +08001173 printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
1174 "%ld\n", algo, PTR_ERR(tfm));
1175 return PTR_ERR(tfm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001176 }
1177
Zoltan Sogor91755a92007-12-07 16:48:11 +08001178 for (i = 0; i < ctcount; i++) {
Herbert Xubdecd222008-07-31 14:03:44 +08001179 int ilen, dlen = COMP_BUF_SIZE;
Herbert Xuef2736f2005-06-22 13:26:03 -07001180
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181 memset(result, 0, sizeof (result));
1182
Sebastian Siewior562954d2008-03-13 20:20:28 +08001183 ilen = ctemplate[i].inlen;
1184 ret = crypto_comp_compress(tfm, ctemplate[i].input,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001185 ilen, result, &dlen);
1186 if (ret) {
Herbert Xubdecd222008-07-31 14:03:44 +08001187 printk(KERN_ERR "alg: comp: compression failed "
1188 "on test %d for %s: ret=%d\n", i + 1, algo,
1189 -ret);
1190 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192
Herbert Xubdecd222008-07-31 14:03:44 +08001193 if (memcmp(result, ctemplate[i].output, dlen)) {
1194 printk(KERN_ERR "alg: comp: Compression test %d "
1195 "failed for %s\n", i + 1, algo);
1196 hexdump(result, dlen);
1197 ret = -EINVAL;
1198 goto out;
1199 }
1200 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001201
Zoltan Sogor91755a92007-12-07 16:48:11 +08001202 for (i = 0; i < dtcount; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001203 int ilen, ret, dlen = COMP_BUF_SIZE;
Herbert Xuef2736f2005-06-22 13:26:03 -07001204
Linus Torvalds1da177e2005-04-16 15:20:36 -07001205 memset(result, 0, sizeof (result));
1206
Sebastian Siewior562954d2008-03-13 20:20:28 +08001207 ilen = dtemplate[i].inlen;
1208 ret = crypto_comp_decompress(tfm, dtemplate[i].input,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001209 ilen, result, &dlen);
1210 if (ret) {
Herbert Xubdecd222008-07-31 14:03:44 +08001211 printk(KERN_ERR "alg: comp: decompression failed "
1212 "on test %d for %s: ret=%d\n", i + 1, algo,
1213 -ret);
1214 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001215 }
Herbert Xubdecd222008-07-31 14:03:44 +08001216
1217 if (memcmp(result, dtemplate[i].output, dlen)) {
1218 printk(KERN_ERR "alg: comp: Decompression test %d "
1219 "failed for %s\n", i + 1, algo);
1220 hexdump(result, dlen);
1221 ret = -EINVAL;
1222 goto out;
1223 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224 }
Herbert Xuf139cfa2008-07-31 12:23:53 +08001225
Herbert Xubdecd222008-07-31 14:03:44 +08001226 ret = 0;
1227
1228out:
Herbert Xue4d5b792006-08-26 18:12:40 +10001229 crypto_free_comp(tfm);
Herbert Xubdecd222008-07-31 14:03:44 +08001230 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001231}
1232
Herbert Xuef2736f2005-06-22 13:26:03 -07001233static void test_available(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001234{
1235 char **name = check;
Herbert Xuef2736f2005-06-22 13:26:03 -07001236
Linus Torvalds1da177e2005-04-16 15:20:36 -07001237 while (*name) {
1238 printk("alg %s ", *name);
Herbert Xu6158efc2007-04-04 17:41:07 +10001239 printk(crypto_has_alg(*name, 0, 0) ?
Herbert Xue4d5b792006-08-26 18:12:40 +10001240 "found\n" : "not found\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241 name++;
Herbert Xuef2736f2005-06-22 13:26:03 -07001242 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001243}
1244
Herbert Xuef2736f2005-06-22 13:26:03 -07001245static void do_test(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001246{
1247 switch (mode) {
1248
1249 case 0:
1250 test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001251
Linus Torvalds1da177e2005-04-16 15:20:36 -07001252 test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001253
Linus Torvalds1da177e2005-04-16 15:20:36 -07001254 //DES
Herbert Xucba83562006-08-13 08:26:09 +10001255 test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
1256 DES_ENC_TEST_VECTORS);
1257 test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
1258 DES_DEC_TEST_VECTORS);
1259 test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
1260 DES_CBC_ENC_TEST_VECTORS);
1261 test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
1262 DES_CBC_DEC_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001263
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264 //DES3_EDE
Herbert Xucba83562006-08-13 08:26:09 +10001265 test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
1266 DES3_EDE_ENC_TEST_VECTORS);
1267 test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
1268 DES3_EDE_DEC_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001269
Neil Hormand729de22008-06-03 20:00:16 +10001270 test_cipher("cbc(des3_ede)", ENCRYPT,
1271 des3_ede_cbc_enc_tv_template,
1272 DES3_EDE_CBC_ENC_TEST_VECTORS);
1273
1274 test_cipher("cbc(des3_ede)", DECRYPT,
1275 des3_ede_cbc_dec_tv_template,
1276 DES3_EDE_CBC_DEC_TEST_VECTORS);
1277
Linus Torvalds1da177e2005-04-16 15:20:36 -07001278 test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001279
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08001280 test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);
1281
Linus Torvalds1da177e2005-04-16 15:20:36 -07001282 test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001283
Linus Torvalds1da177e2005-04-16 15:20:36 -07001284 //BLOWFISH
Herbert Xucba83562006-08-13 08:26:09 +10001285 test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
1286 BF_ENC_TEST_VECTORS);
1287 test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
1288 BF_DEC_TEST_VECTORS);
1289 test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
1290 BF_CBC_ENC_TEST_VECTORS);
1291 test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
1292 BF_CBC_DEC_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001293
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 //TWOFISH
Herbert Xucba83562006-08-13 08:26:09 +10001295 test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
1296 TF_ENC_TEST_VECTORS);
1297 test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
1298 TF_DEC_TEST_VECTORS);
1299 test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
1300 TF_CBC_ENC_TEST_VECTORS);
1301 test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
1302 TF_CBC_DEC_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001303
Linus Torvalds1da177e2005-04-16 15:20:36 -07001304 //SERPENT
Herbert Xucba83562006-08-13 08:26:09 +10001305 test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
1306 SERPENT_ENC_TEST_VECTORS);
1307 test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
1308 SERPENT_DEC_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001309
Linus Torvalds1da177e2005-04-16 15:20:36 -07001310 //TNEPRES
Herbert Xucba83562006-08-13 08:26:09 +10001311 test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
1312 TNEPRES_ENC_TEST_VECTORS);
1313 test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
1314 TNEPRES_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001315
1316 //AES
Herbert Xucba83562006-08-13 08:26:09 +10001317 test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
1318 AES_ENC_TEST_VECTORS);
1319 test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
1320 AES_DEC_TEST_VECTORS);
1321 test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
1322 AES_CBC_ENC_TEST_VECTORS);
1323 test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
1324 AES_CBC_DEC_TEST_VECTORS);
Rik Snelf3d10442006-11-29 19:01:41 +11001325 test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
1326 AES_LRW_ENC_TEST_VECTORS);
1327 test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
1328 AES_LRW_DEC_TEST_VECTORS);
Rik Snelf19f5112007-09-19 20:23:13 +08001329 test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
1330 AES_XTS_ENC_TEST_VECTORS);
1331 test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
1332 AES_XTS_DEC_TEST_VECTORS);
Herbert Xu5311f242007-12-17 21:34:32 +08001333 test_cipher("rfc3686(ctr(aes))", ENCRYPT, aes_ctr_enc_tv_template,
Joy Latten23e353c2007-10-23 08:50:32 +08001334 AES_CTR_ENC_TEST_VECTORS);
Herbert Xu5311f242007-12-17 21:34:32 +08001335 test_cipher("rfc3686(ctr(aes))", DECRYPT, aes_ctr_dec_tv_template,
Joy Latten23e353c2007-10-23 08:50:32 +08001336 AES_CTR_DEC_TEST_VECTORS);
Mikko Herranen28db8e32007-11-26 22:24:11 +08001337 test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template,
1338 AES_GCM_ENC_TEST_VECTORS);
1339 test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template,
1340 AES_GCM_DEC_TEST_VECTORS);
Joy Latten93cc74e2007-12-12 20:24:22 +08001341 test_aead("ccm(aes)", ENCRYPT, aes_ccm_enc_tv_template,
1342 AES_CCM_ENC_TEST_VECTORS);
1343 test_aead("ccm(aes)", DECRYPT, aes_ccm_dec_tv_template,
1344 AES_CCM_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001345
1346 //CAST5
Herbert Xucba83562006-08-13 08:26:09 +10001347 test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
1348 CAST5_ENC_TEST_VECTORS);
1349 test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
1350 CAST5_DEC_TEST_VECTORS);
Herbert Xuef2736f2005-06-22 13:26:03 -07001351
Linus Torvalds1da177e2005-04-16 15:20:36 -07001352 //CAST6
Herbert Xucba83562006-08-13 08:26:09 +10001353 test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
1354 CAST6_ENC_TEST_VECTORS);
1355 test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
1356 CAST6_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357
1358 //ARC4
Herbert Xucba83562006-08-13 08:26:09 +10001359 test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
1360 ARC4_ENC_TEST_VECTORS);
1361 test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
1362 ARC4_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001363
1364 //TEA
Herbert Xucba83562006-08-13 08:26:09 +10001365 test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
1366 TEA_ENC_TEST_VECTORS);
1367 test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
1368 TEA_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001369
1370
1371 //XTEA
Herbert Xucba83562006-08-13 08:26:09 +10001372 test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
1373 XTEA_ENC_TEST_VECTORS);
1374 test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
1375 XTEA_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376
1377 //KHAZAD
Herbert Xucba83562006-08-13 08:26:09 +10001378 test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
1379 KHAZAD_ENC_TEST_VECTORS);
1380 test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
1381 KHAZAD_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382
1383 //ANUBIS
Herbert Xucba83562006-08-13 08:26:09 +10001384 test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
1385 ANUBIS_ENC_TEST_VECTORS);
1386 test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
1387 ANUBIS_DEC_TEST_VECTORS);
1388 test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
1389 ANUBIS_CBC_ENC_TEST_VECTORS);
1390 test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
1391 ANUBIS_CBC_ENC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392
Aaron Grothefb4f10e2005-09-01 17:42:46 -07001393 //XETA
Herbert Xucba83562006-08-13 08:26:09 +10001394 test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
1395 XETA_ENC_TEST_VECTORS);
1396 test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
1397 XETA_DEC_TEST_VECTORS);
Aaron Grothefb4f10e2005-09-01 17:42:46 -07001398
David Howells90831632006-12-16 12:13:14 +11001399 //FCrypt
1400 test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
1401 FCRYPT_ENC_TEST_VECTORS);
1402 test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
1403 FCRYPT_DEC_TEST_VECTORS);
1404
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001405 //CAMELLIA
1406 test_cipher("ecb(camellia)", ENCRYPT,
1407 camellia_enc_tv_template,
1408 CAMELLIA_ENC_TEST_VECTORS);
1409 test_cipher("ecb(camellia)", DECRYPT,
1410 camellia_dec_tv_template,
1411 CAMELLIA_DEC_TEST_VECTORS);
1412 test_cipher("cbc(camellia)", ENCRYPT,
1413 camellia_cbc_enc_tv_template,
1414 CAMELLIA_CBC_ENC_TEST_VECTORS);
1415 test_cipher("cbc(camellia)", DECRYPT,
1416 camellia_cbc_dec_tv_template,
1417 CAMELLIA_CBC_DEC_TEST_VECTORS);
1418
Hye-Shik Change2ee95b2007-08-21 20:01:03 +08001419 //SEED
1420 test_cipher("ecb(seed)", ENCRYPT, seed_enc_tv_template,
1421 SEED_ENC_TEST_VECTORS);
1422 test_cipher("ecb(seed)", DECRYPT, seed_dec_tv_template,
1423 SEED_DEC_TEST_VECTORS);
1424
Kevin Coffman76cb9522008-03-24 21:26:16 +08001425 //CTS
1426 test_cipher("cts(cbc(aes))", ENCRYPT, cts_mode_enc_tv_template,
1427 CTS_MODE_ENC_TEST_VECTORS);
1428 test_cipher("cts(cbc(aes))", DECRYPT, cts_mode_dec_tv_template,
1429 CTS_MODE_DEC_TEST_VECTORS);
1430
Linus Torvalds1da177e2005-04-16 15:20:36 -07001431 test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
1432 test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
1433 test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
1434 test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
1435 test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
1436 test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
1437 test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
1438 test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
Zoltan Sogor91755a92007-12-07 16:48:11 +08001439 test_comp("deflate", deflate_comp_tv_template,
1440 deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
1441 DEFLATE_DECOMP_TEST_VECTORS);
Zoltan Sogor0b77abb2007-12-07 16:53:23 +08001442 test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template,
1443 LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS);
Herbert Xuc907ee72006-08-21 22:04:03 +10001444 test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
Herbert Xue9d41162006-08-19 21:38:49 +10001445 test_hash("hmac(md5)", hmac_md5_tv_template,
1446 HMAC_MD5_TEST_VECTORS);
1447 test_hash("hmac(sha1)", hmac_sha1_tv_template,
1448 HMAC_SHA1_TEST_VECTORS);
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08001449 test_hash("hmac(sha224)", hmac_sha224_tv_template,
1450 HMAC_SHA224_TEST_VECTORS);
Herbert Xue9d41162006-08-19 21:38:49 +10001451 test_hash("hmac(sha256)", hmac_sha256_tv_template,
1452 HMAC_SHA256_TEST_VECTORS);
Andrew Donofrioa28091a2006-12-10 12:10:20 +11001453 test_hash("hmac(sha384)", hmac_sha384_tv_template,
1454 HMAC_SHA384_TEST_VECTORS);
1455 test_hash("hmac(sha512)", hmac_sha512_tv_template,
1456 HMAC_SHA512_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457
Kazunori MIYAZAWA5b2becf2006-10-28 13:18:53 +10001458 test_hash("xcbc(aes)", aes_xcbc128_tv_template,
1459 XCBC_AES_TEST_VECTORS);
1460
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461 test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
1462 break;
1463
1464 case 1:
1465 test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
1466 break;
1467
1468 case 2:
1469 test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
1470 break;
1471
1472 case 3:
Herbert Xucba83562006-08-13 08:26:09 +10001473 test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
1474 DES_ENC_TEST_VECTORS);
1475 test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
1476 DES_DEC_TEST_VECTORS);
1477 test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
1478 DES_CBC_ENC_TEST_VECTORS);
1479 test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
1480 DES_CBC_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 break;
1482
1483 case 4:
Herbert Xucba83562006-08-13 08:26:09 +10001484 test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
1485 DES3_EDE_ENC_TEST_VECTORS);
1486 test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
1487 DES3_EDE_DEC_TEST_VECTORS);
Neil Hormand729de22008-06-03 20:00:16 +10001488
1489 test_cipher("cbc(des3_ede)", ENCRYPT,
1490 des3_ede_cbc_enc_tv_template,
1491 DES3_EDE_CBC_ENC_TEST_VECTORS);
1492
1493 test_cipher("cbc(des3_ede)", DECRYPT,
1494 des3_ede_cbc_dec_tv_template,
1495 DES3_EDE_CBC_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496 break;
1497
1498 case 5:
1499 test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
1500 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001501
Linus Torvalds1da177e2005-04-16 15:20:36 -07001502 case 6:
1503 test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
1504 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001505
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506 case 7:
Herbert Xucba83562006-08-13 08:26:09 +10001507 test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
1508 BF_ENC_TEST_VECTORS);
1509 test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
1510 BF_DEC_TEST_VECTORS);
1511 test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
1512 BF_CBC_ENC_TEST_VECTORS);
1513 test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
1514 BF_CBC_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001515 break;
1516
1517 case 8:
Herbert Xucba83562006-08-13 08:26:09 +10001518 test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
1519 TF_ENC_TEST_VECTORS);
1520 test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
1521 TF_DEC_TEST_VECTORS);
1522 test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
1523 TF_CBC_ENC_TEST_VECTORS);
1524 test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
1525 TF_CBC_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001526 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001527
Linus Torvalds1da177e2005-04-16 15:20:36 -07001528 case 9:
Herbert Xucba83562006-08-13 08:26:09 +10001529 test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
1530 SERPENT_ENC_TEST_VECTORS);
1531 test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
1532 SERPENT_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001533 break;
1534
1535 case 10:
Herbert Xucba83562006-08-13 08:26:09 +10001536 test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
1537 AES_ENC_TEST_VECTORS);
1538 test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
1539 AES_DEC_TEST_VECTORS);
1540 test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
1541 AES_CBC_ENC_TEST_VECTORS);
1542 test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
1543 AES_CBC_DEC_TEST_VECTORS);
Rik Snelf3d10442006-11-29 19:01:41 +11001544 test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
1545 AES_LRW_ENC_TEST_VECTORS);
1546 test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
1547 AES_LRW_DEC_TEST_VECTORS);
Rik Snelf19f5112007-09-19 20:23:13 +08001548 test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
1549 AES_XTS_ENC_TEST_VECTORS);
1550 test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
1551 AES_XTS_DEC_TEST_VECTORS);
Herbert Xu5311f242007-12-17 21:34:32 +08001552 test_cipher("rfc3686(ctr(aes))", ENCRYPT, aes_ctr_enc_tv_template,
Joy Latten23e353c2007-10-23 08:50:32 +08001553 AES_CTR_ENC_TEST_VECTORS);
Herbert Xu5311f242007-12-17 21:34:32 +08001554 test_cipher("rfc3686(ctr(aes))", DECRYPT, aes_ctr_dec_tv_template,
Joy Latten23e353c2007-10-23 08:50:32 +08001555 AES_CTR_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001556 break;
1557
1558 case 11:
1559 test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
1560 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001561
Linus Torvalds1da177e2005-04-16 15:20:36 -07001562 case 12:
1563 test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
1564 break;
1565
1566 case 13:
Zoltan Sogor91755a92007-12-07 16:48:11 +08001567 test_comp("deflate", deflate_comp_tv_template,
1568 deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
1569 DEFLATE_DECOMP_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570 break;
1571
1572 case 14:
Herbert Xucba83562006-08-13 08:26:09 +10001573 test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
1574 CAST5_ENC_TEST_VECTORS);
1575 test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
1576 CAST5_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001577 break;
1578
1579 case 15:
Herbert Xucba83562006-08-13 08:26:09 +10001580 test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
1581 CAST6_ENC_TEST_VECTORS);
1582 test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
1583 CAST6_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001584 break;
1585
1586 case 16:
Herbert Xucba83562006-08-13 08:26:09 +10001587 test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
1588 ARC4_ENC_TEST_VECTORS);
1589 test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
1590 ARC4_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001591 break;
1592
1593 case 17:
1594 test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
1595 break;
1596
1597 case 18:
Herbert Xuc907ee72006-08-21 22:04:03 +10001598 test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001599 break;
1600
1601 case 19:
Herbert Xucba83562006-08-13 08:26:09 +10001602 test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
1603 TEA_ENC_TEST_VECTORS);
1604 test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
1605 TEA_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001606 break;
1607
1608 case 20:
Herbert Xucba83562006-08-13 08:26:09 +10001609 test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
1610 XTEA_ENC_TEST_VECTORS);
1611 test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
1612 XTEA_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001613 break;
1614
1615 case 21:
Herbert Xucba83562006-08-13 08:26:09 +10001616 test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
1617 KHAZAD_ENC_TEST_VECTORS);
1618 test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
1619 KHAZAD_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620 break;
1621
1622 case 22:
1623 test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
1624 break;
1625
1626 case 23:
1627 test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
1628 break;
1629
1630 case 24:
1631 test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
1632 break;
1633
1634 case 25:
Herbert Xucba83562006-08-13 08:26:09 +10001635 test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
1636 TNEPRES_ENC_TEST_VECTORS);
1637 test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
1638 TNEPRES_DEC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001639 break;
1640
1641 case 26:
Herbert Xucba83562006-08-13 08:26:09 +10001642 test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
1643 ANUBIS_ENC_TEST_VECTORS);
1644 test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
1645 ANUBIS_DEC_TEST_VECTORS);
1646 test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
1647 ANUBIS_CBC_ENC_TEST_VECTORS);
1648 test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
1649 ANUBIS_CBC_ENC_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001650 break;
1651
1652 case 27:
1653 test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
1654 break;
1655
1656 case 28:
1657
1658 test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
1659 break;
1660
1661 case 29:
1662 test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
1663 break;
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08001664
Aaron Grothefb4f10e2005-09-01 17:42:46 -07001665 case 30:
Herbert Xucba83562006-08-13 08:26:09 +10001666 test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
1667 XETA_ENC_TEST_VECTORS);
1668 test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
1669 XETA_DEC_TEST_VECTORS);
Aaron Grothefb4f10e2005-09-01 17:42:46 -07001670 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001671
David Howells90831632006-12-16 12:13:14 +11001672 case 31:
1673 test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
1674 FCRYPT_ENC_TEST_VECTORS);
1675 test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
1676 FCRYPT_DEC_TEST_VECTORS);
1677 break;
1678
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001679 case 32:
1680 test_cipher("ecb(camellia)", ENCRYPT,
1681 camellia_enc_tv_template,
1682 CAMELLIA_ENC_TEST_VECTORS);
1683 test_cipher("ecb(camellia)", DECRYPT,
1684 camellia_dec_tv_template,
1685 CAMELLIA_DEC_TEST_VECTORS);
1686 test_cipher("cbc(camellia)", ENCRYPT,
1687 camellia_cbc_enc_tv_template,
1688 CAMELLIA_CBC_ENC_TEST_VECTORS);
1689 test_cipher("cbc(camellia)", DECRYPT,
1690 camellia_cbc_dec_tv_template,
1691 CAMELLIA_CBC_DEC_TEST_VECTORS);
1692 break;
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08001693 case 33:
1694 test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);
1695 break;
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001696
Tan Swee Heng2407d602007-11-23 19:45:00 +08001697 case 34:
1698 test_cipher("salsa20", ENCRYPT,
1699 salsa20_stream_enc_tv_template,
1700 SALSA20_STREAM_ENC_TEST_VECTORS);
1701 break;
1702
Herbert Xu8df213d2007-12-02 14:55:47 +11001703 case 35:
1704 test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template,
1705 AES_GCM_ENC_TEST_VECTORS);
1706 test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template,
1707 AES_GCM_DEC_TEST_VECTORS);
1708 break;
1709
Zoltan Sogor0b77abb2007-12-07 16:53:23 +08001710 case 36:
1711 test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template,
1712 LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS);
1713 break;
1714
Joy Latten93cc74e2007-12-12 20:24:22 +08001715 case 37:
1716 test_aead("ccm(aes)", ENCRYPT, aes_ccm_enc_tv_template,
1717 AES_CCM_ENC_TEST_VECTORS);
1718 test_aead("ccm(aes)", DECRYPT, aes_ccm_dec_tv_template,
1719 AES_CCM_DEC_TEST_VECTORS);
1720 break;
1721
Kevin Coffman76cb9522008-03-24 21:26:16 +08001722 case 38:
1723 test_cipher("cts(cbc(aes))", ENCRYPT, cts_mode_enc_tv_template,
1724 CTS_MODE_ENC_TEST_VECTORS);
1725 test_cipher("cts(cbc(aes))", DECRYPT, cts_mode_dec_tv_template,
1726 CTS_MODE_DEC_TEST_VECTORS);
1727 break;
1728
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001729 case 39:
1730 test_hash("rmd128", rmd128_tv_template, RMD128_TEST_VECTORS);
1731 break;
1732
1733 case 40:
1734 test_hash("rmd160", rmd160_tv_template, RMD160_TEST_VECTORS);
1735 break;
1736
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08001737 case 41:
1738 test_hash("rmd256", rmd256_tv_template, RMD256_TEST_VECTORS);
1739 break;
1740
1741 case 42:
1742 test_hash("rmd320", rmd320_tv_template, RMD320_TEST_VECTORS);
1743 break;
1744
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745 case 100:
Herbert Xue9d41162006-08-19 21:38:49 +10001746 test_hash("hmac(md5)", hmac_md5_tv_template,
1747 HMAC_MD5_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001748 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001749
Linus Torvalds1da177e2005-04-16 15:20:36 -07001750 case 101:
Herbert Xue9d41162006-08-19 21:38:49 +10001751 test_hash("hmac(sha1)", hmac_sha1_tv_template,
1752 HMAC_SHA1_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001753 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001754
Linus Torvalds1da177e2005-04-16 15:20:36 -07001755 case 102:
Herbert Xue9d41162006-08-19 21:38:49 +10001756 test_hash("hmac(sha256)", hmac_sha256_tv_template,
1757 HMAC_SHA256_TEST_VECTORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001758 break;
1759
Andrew Donofrioa28091a2006-12-10 12:10:20 +11001760 case 103:
1761 test_hash("hmac(sha384)", hmac_sha384_tv_template,
1762 HMAC_SHA384_TEST_VECTORS);
1763 break;
1764
1765 case 104:
1766 test_hash("hmac(sha512)", hmac_sha512_tv_template,
1767 HMAC_SHA512_TEST_VECTORS);
1768 break;
Herbert Xu38ed9ab2008-01-01 15:59:28 +11001769
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08001770 case 105:
1771 test_hash("hmac(sha224)", hmac_sha224_tv_template,
1772 HMAC_SHA224_TEST_VECTORS);
1773 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001774
Herbert Xu38ed9ab2008-01-01 15:59:28 +11001775 case 106:
1776 test_hash("xcbc(aes)", aes_xcbc128_tv_template,
1777 XCBC_AES_TEST_VECTORS);
1778 break;
1779
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001780 case 107:
1781 test_hash("hmac(rmd128)", hmac_rmd128_tv_template,
1782 HMAC_RMD128_TEST_VECTORS);
1783 break;
1784
1785 case 108:
1786 test_hash("hmac(rmd160)", hmac_rmd160_tv_template,
1787 HMAC_RMD160_TEST_VECTORS);
1788 break;
1789
Harald Welteebfd9bc2005-06-22 13:27:23 -07001790 case 200:
Herbert Xucba83562006-08-13 08:26:09 +10001791 test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001792 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001793 test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001794 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001795 test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001796 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001797 test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001798 speed_template_16_24_32);
Rik Snelf3d10442006-11-29 19:01:41 +11001799 test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001800 speed_template_32_40_48);
Rik Snelf3d10442006-11-29 19:01:41 +11001801 test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001802 speed_template_32_40_48);
Rik Snelf19f5112007-09-19 20:23:13 +08001803 test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001804 speed_template_32_48_64);
Rik Snelf19f5112007-09-19 20:23:13 +08001805 test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001806 speed_template_32_48_64);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001807 break;
1808
1809 case 201:
Herbert Xucba83562006-08-13 08:26:09 +10001810 test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001811 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
1812 speed_template_24);
Herbert Xucba83562006-08-13 08:26:09 +10001813 test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001814 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
1815 speed_template_24);
Herbert Xucba83562006-08-13 08:26:09 +10001816 test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001817 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
1818 speed_template_24);
Herbert Xucba83562006-08-13 08:26:09 +10001819 test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001820 des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
1821 speed_template_24);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001822 break;
1823
1824 case 202:
Herbert Xucba83562006-08-13 08:26:09 +10001825 test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001826 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001827 test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001828 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001829 test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001830 speed_template_16_24_32);
Herbert Xucba83562006-08-13 08:26:09 +10001831 test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001832 speed_template_16_24_32);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001833 break;
1834
1835 case 203:
Herbert Xucba83562006-08-13 08:26:09 +10001836 test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001837 speed_template_8_32);
Herbert Xucba83562006-08-13 08:26:09 +10001838 test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001839 speed_template_8_32);
Herbert Xucba83562006-08-13 08:26:09 +10001840 test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001841 speed_template_8_32);
Herbert Xucba83562006-08-13 08:26:09 +10001842 test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001843 speed_template_8_32);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001844 break;
1845
1846 case 204:
Herbert Xucba83562006-08-13 08:26:09 +10001847 test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001848 speed_template_8);
Herbert Xucba83562006-08-13 08:26:09 +10001849 test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001850 speed_template_8);
Herbert Xucba83562006-08-13 08:26:09 +10001851 test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001852 speed_template_8);
Herbert Xucba83562006-08-13 08:26:09 +10001853 test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001854 speed_template_8);
Harald Welteebfd9bc2005-06-22 13:27:23 -07001855 break;
1856
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001857 case 205:
1858 test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001859 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001860 test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001861 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001862 test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001863 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001864 test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001865 speed_template_16_24_32);
Noriaki TAKAMIYA02ab5a72007-01-24 21:48:19 +11001866 break;
1867
Tan Swee Heng5de8f1b2007-12-07 17:17:43 +08001868 case 206:
1869 test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
Sebastian Siewior477035c2008-03-11 21:24:26 +08001870 speed_template_16_32);
Tan Swee Heng5de8f1b2007-12-07 17:17:43 +08001871 break;
1872
Michal Ludvige8057922006-05-30 22:04:19 +10001873 case 300:
1874 /* fall through */
1875
1876 case 301:
Herbert Xue9d41162006-08-19 21:38:49 +10001877 test_hash_speed("md4", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001878 if (mode > 300 && mode < 400) break;
1879
1880 case 302:
Herbert Xue9d41162006-08-19 21:38:49 +10001881 test_hash_speed("md5", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001882 if (mode > 300 && mode < 400) break;
1883
1884 case 303:
Herbert Xue9d41162006-08-19 21:38:49 +10001885 test_hash_speed("sha1", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001886 if (mode > 300 && mode < 400) break;
1887
1888 case 304:
Herbert Xue9d41162006-08-19 21:38:49 +10001889 test_hash_speed("sha256", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001890 if (mode > 300 && mode < 400) break;
1891
1892 case 305:
Herbert Xue9d41162006-08-19 21:38:49 +10001893 test_hash_speed("sha384", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001894 if (mode > 300 && mode < 400) break;
1895
1896 case 306:
Herbert Xue9d41162006-08-19 21:38:49 +10001897 test_hash_speed("sha512", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001898 if (mode > 300 && mode < 400) break;
1899
1900 case 307:
Herbert Xue9d41162006-08-19 21:38:49 +10001901 test_hash_speed("wp256", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001902 if (mode > 300 && mode < 400) break;
1903
1904 case 308:
Herbert Xue9d41162006-08-19 21:38:49 +10001905 test_hash_speed("wp384", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001906 if (mode > 300 && mode < 400) break;
1907
1908 case 309:
Herbert Xue9d41162006-08-19 21:38:49 +10001909 test_hash_speed("wp512", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001910 if (mode > 300 && mode < 400) break;
1911
1912 case 310:
Herbert Xue9d41162006-08-19 21:38:49 +10001913 test_hash_speed("tgr128", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001914 if (mode > 300 && mode < 400) break;
1915
1916 case 311:
Herbert Xue9d41162006-08-19 21:38:49 +10001917 test_hash_speed("tgr160", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001918 if (mode > 300 && mode < 400) break;
1919
1920 case 312:
Herbert Xue9d41162006-08-19 21:38:49 +10001921 test_hash_speed("tgr192", sec, generic_hash_speed_template);
Michal Ludvige8057922006-05-30 22:04:19 +10001922 if (mode > 300 && mode < 400) break;
1923
Jonathan Lynchcd12fb92007-11-10 20:08:25 +08001924 case 313:
1925 test_hash_speed("sha224", sec, generic_hash_speed_template);
1926 if (mode > 300 && mode < 400) break;
1927
Adrian-Ken Rueegseggerfd4adf12008-05-07 22:16:36 +08001928 case 314:
1929 test_hash_speed("rmd128", sec, generic_hash_speed_template);
1930 if (mode > 300 && mode < 400) break;
1931
1932 case 315:
1933 test_hash_speed("rmd160", sec, generic_hash_speed_template);
1934 if (mode > 300 && mode < 400) break;
1935
Adrian-Ken Rueegsegger2998db32008-05-09 21:29:35 +08001936 case 316:
1937 test_hash_speed("rmd256", sec, generic_hash_speed_template);
1938 if (mode > 300 && mode < 400) break;
1939
1940 case 317:
1941 test_hash_speed("rmd320", sec, generic_hash_speed_template);
1942 if (mode > 300 && mode < 400) break;
1943
Michal Ludvige8057922006-05-30 22:04:19 +10001944 case 399:
1945 break;
1946
Linus Torvalds1da177e2005-04-16 15:20:36 -07001947 case 1000:
1948 test_available();
1949 break;
Herbert Xuef2736f2005-06-22 13:26:03 -07001950
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 default:
1952 /* useful for debugging */
1953 printk("not testing anything\n");
1954 break;
1955 }
1956}
1957
Kamalesh Babulal3af5b902008-04-05 21:00:57 +08001958static int __init tcrypt_mod_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001959{
Mikko Herranene3a4ea42007-11-26 22:12:07 +08001960 int err = -ENOMEM;
Herbert Xuf139cfa2008-07-31 12:23:53 +08001961 int i;
Mikko Herranene3a4ea42007-11-26 22:12:07 +08001962
Herbert Xuf139cfa2008-07-31 12:23:53 +08001963 for (i = 0; i < TVMEMSIZE; i++) {
1964 tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
1965 if (!tvmem[i])
1966 goto err_free_tv;
1967 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001968
Herbert Xuf139cfa2008-07-31 12:23:53 +08001969 for (i = 0; i < XBUFSIZE; i++) {
1970 xbuf[i] = (void *)__get_free_page(GFP_KERNEL);
1971 if (!xbuf[i])
1972 goto err_free_xbuf;
1973 }
Mikko Herranene3a4ea42007-11-26 22:12:07 +08001974
Herbert Xuf139cfa2008-07-31 12:23:53 +08001975 for (i = 0; i < XBUFSIZE; i++) {
1976 axbuf[i] = (void *)__get_free_page(GFP_KERNEL);
1977 if (!axbuf[i])
1978 goto err_free_axbuf;
1979 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001980
1981 do_test();
1982
Michal Ludvig14fdf472006-05-30 14:49:38 +10001983 /* We intentionaly return -EAGAIN to prevent keeping
1984 * the module. It does all its work from init()
1985 * and doesn't offer any runtime functionality
1986 * => we don't need it in the memory, do we?
1987 * -- mludvig
1988 */
Mikko Herranene3a4ea42007-11-26 22:12:07 +08001989 err = -EAGAIN;
1990
Herbert Xuf139cfa2008-07-31 12:23:53 +08001991err_free_axbuf:
1992 for (i = 0; i < XBUFSIZE && axbuf[i]; i++)
1993 free_page((unsigned long)axbuf[i]);
1994err_free_xbuf:
1995 for (i = 0; i < XBUFSIZE && xbuf[i]; i++)
1996 free_page((unsigned long)xbuf[i]);
1997err_free_tv:
1998 for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
1999 free_page((unsigned long)tvmem[i]);
Mikko Herranene3a4ea42007-11-26 22:12:07 +08002000
2001 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002002}
2003
2004/*
2005 * If an init function is provided, an exit function must also be provided
2006 * to allow module unload.
2007 */
Kamalesh Babulal3af5b902008-04-05 21:00:57 +08002008static void __exit tcrypt_mod_fini(void) { }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002009
Kamalesh Babulal3af5b902008-04-05 21:00:57 +08002010module_init(tcrypt_mod_init);
2011module_exit(tcrypt_mod_fini);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002012
2013module_param(mode, int, 0);
Harald Welteebfd9bc2005-06-22 13:27:23 -07002014module_param(sec, uint, 0);
Herbert Xu6a179442005-06-22 13:29:03 -07002015MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
2016 "(defaults to zero which uses CPU cycles instead)");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002017
2018MODULE_LICENSE("GPL");
2019MODULE_DESCRIPTION("Quick & dirty crypto testing module");
2020MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");