tcrypt.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938
  1. /*
  2. * 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>
  9. * Copyright (c) 2007 Nokia Siemens Networks
  10. *
  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
  13. * Software Foundation; either version 2 of the License, or (at your option)
  14. * any later version.
  15. *
  16. */
  17. #include <crypto/hash.h>
  18. #include <linux/err.h>
  19. #include <linux/init.h>
  20. #include <linux/module.h>
  21. #include <linux/slab.h>
  22. #include <linux/scatterlist.h>
  23. #include <linux/string.h>
  24. #include <linux/moduleparam.h>
  25. #include <linux/jiffies.h>
  26. #include <linux/timex.h>
  27. #include <linux/interrupt.h>
  28. #include "tcrypt.h"
  29. #include "internal.h"
  30. /*
  31. * Need slab memory for testing (size in number of pages).
  32. */
  33. #define TVMEMSIZE 4
  34. /*
  35. * Used by test_cipher_speed()
  36. */
  37. #define ENCRYPT 1
  38. #define DECRYPT 0
  39. /*
  40. * Used by test_cipher_speed()
  41. */
  42. static unsigned int sec;
  43. static int mode;
  44. static char *tvmem[TVMEMSIZE];
  45. static char *check[] = {
  46. "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
  47. "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
  48. "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
  49. "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
  50. "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
  51. "lzo", "cts", "zlib", NULL
  52. };
  53. static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
  54. struct scatterlist *sg, int blen, int sec)
  55. {
  56. unsigned long start, end;
  57. int bcount;
  58. int ret;
  59. for (start = jiffies, end = start + sec * HZ, bcount = 0;
  60. time_before(jiffies, end); bcount++) {
  61. if (enc)
  62. ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
  63. else
  64. ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
  65. if (ret)
  66. return ret;
  67. }
  68. printk("%d operations in %d seconds (%ld bytes)\n",
  69. bcount, sec, (long)bcount * blen);
  70. return 0;
  71. }
  72. static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
  73. struct scatterlist *sg, int blen)
  74. {
  75. unsigned long cycles = 0;
  76. int ret = 0;
  77. int i;
  78. local_bh_disable();
  79. local_irq_disable();
  80. /* Warm-up run. */
  81. for (i = 0; i < 4; i++) {
  82. if (enc)
  83. ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
  84. else
  85. ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
  86. if (ret)
  87. goto out;
  88. }
  89. /* The real thing. */
  90. for (i = 0; i < 8; i++) {
  91. cycles_t start, end;
  92. start = get_cycles();
  93. if (enc)
  94. ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
  95. else
  96. ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
  97. end = get_cycles();
  98. if (ret)
  99. goto out;
  100. cycles += end - start;
  101. }
  102. out:
  103. local_irq_enable();
  104. local_bh_enable();
  105. if (ret == 0)
  106. printk("1 operation in %lu cycles (%d bytes)\n",
  107. (cycles + 4) / 8, blen);
  108. return ret;
  109. }
  110. static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
  111. static void test_cipher_speed(const char *algo, int enc, unsigned int sec,
  112. struct cipher_speed_template *template,
  113. unsigned int tcount, u8 *keysize)
  114. {
  115. unsigned int ret, i, j, iv_len;
  116. const char *key, iv[128];
  117. struct crypto_blkcipher *tfm;
  118. struct blkcipher_desc desc;
  119. const char *e;
  120. u32 *b_size;
  121. if (enc == ENCRYPT)
  122. e = "encryption";
  123. else
  124. e = "decryption";
  125. printk("\ntesting speed of %s %s\n", algo, e);
  126. tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
  127. if (IS_ERR(tfm)) {
  128. printk("failed to load transform for %s: %ld\n", algo,
  129. PTR_ERR(tfm));
  130. return;
  131. }
  132. desc.tfm = tfm;
  133. desc.flags = 0;
  134. i = 0;
  135. do {
  136. b_size = block_sizes;
  137. do {
  138. struct scatterlist sg[TVMEMSIZE];
  139. if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
  140. printk("template (%u) too big for "
  141. "tvmem (%lu)\n", *keysize + *b_size,
  142. TVMEMSIZE * PAGE_SIZE);
  143. goto out;
  144. }
  145. printk("test %u (%d bit key, %d byte blocks): ", i,
  146. *keysize * 8, *b_size);
  147. memset(tvmem[0], 0xff, PAGE_SIZE);
  148. /* set key, plain text and IV */
  149. key = tvmem[0];
  150. for (j = 0; j < tcount; j++) {
  151. if (template[j].klen == *keysize) {
  152. key = template[j].key;
  153. break;
  154. }
  155. }
  156. ret = crypto_blkcipher_setkey(tfm, key, *keysize);
  157. if (ret) {
  158. printk("setkey() failed flags=%x\n",
  159. crypto_blkcipher_get_flags(tfm));
  160. goto out;
  161. }
  162. sg_init_table(sg, TVMEMSIZE);
  163. sg_set_buf(sg, tvmem[0] + *keysize,
  164. PAGE_SIZE - *keysize);
  165. for (j = 1; j < TVMEMSIZE; j++) {
  166. sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
  167. memset (tvmem[j], 0xff, PAGE_SIZE);
  168. }
  169. iv_len = crypto_blkcipher_ivsize(tfm);
  170. if (iv_len) {
  171. memset(&iv, 0xff, iv_len);
  172. crypto_blkcipher_set_iv(tfm, iv, iv_len);
  173. }
  174. if (sec)
  175. ret = test_cipher_jiffies(&desc, enc, sg,
  176. *b_size, sec);
  177. else
  178. ret = test_cipher_cycles(&desc, enc, sg,
  179. *b_size);
  180. if (ret) {
  181. printk("%s() failed flags=%x\n", e, desc.flags);
  182. break;
  183. }
  184. b_size++;
  185. i++;
  186. } while (*b_size);
  187. keysize++;
  188. } while (*keysize);
  189. out:
  190. crypto_free_blkcipher(tfm);
  191. }
  192. static int test_hash_jiffies_digest(struct hash_desc *desc,
  193. struct scatterlist *sg, int blen,
  194. char *out, int sec)
  195. {
  196. unsigned long start, end;
  197. int bcount;
  198. int ret;
  199. for (start = jiffies, end = start + sec * HZ, bcount = 0;
  200. time_before(jiffies, end); bcount++) {
  201. ret = crypto_hash_digest(desc, sg, blen, out);
  202. if (ret)
  203. return ret;
  204. }
  205. printk("%6u opers/sec, %9lu bytes/sec\n",
  206. bcount / sec, ((long)bcount * blen) / sec);
  207. return 0;
  208. }
  209. static int test_hash_jiffies(struct hash_desc *desc, struct scatterlist *sg,
  210. int blen, int plen, char *out, int sec)
  211. {
  212. unsigned long start, end;
  213. int bcount, pcount;
  214. int ret;
  215. if (plen == blen)
  216. return test_hash_jiffies_digest(desc, sg, blen, out, sec);
  217. for (start = jiffies, end = start + sec * HZ, bcount = 0;
  218. time_before(jiffies, end); bcount++) {
  219. ret = crypto_hash_init(desc);
  220. if (ret)
  221. return ret;
  222. for (pcount = 0; pcount < blen; pcount += plen) {
  223. ret = crypto_hash_update(desc, sg, plen);
  224. if (ret)
  225. return ret;
  226. }
  227. /* we assume there is enough space in 'out' for the result */
  228. ret = crypto_hash_final(desc, out);
  229. if (ret)
  230. return ret;
  231. }
  232. printk("%6u opers/sec, %9lu bytes/sec\n",
  233. bcount / sec, ((long)bcount * blen) / sec);
  234. return 0;
  235. }
  236. static int test_hash_cycles_digest(struct hash_desc *desc,
  237. struct scatterlist *sg, int blen, char *out)
  238. {
  239. unsigned long cycles = 0;
  240. int i;
  241. int ret;
  242. local_bh_disable();
  243. local_irq_disable();
  244. /* Warm-up run. */
  245. for (i = 0; i < 4; i++) {
  246. ret = crypto_hash_digest(desc, sg, blen, out);
  247. if (ret)
  248. goto out;
  249. }
  250. /* The real thing. */
  251. for (i = 0; i < 8; i++) {
  252. cycles_t start, end;
  253. start = get_cycles();
  254. ret = crypto_hash_digest(desc, sg, blen, out);
  255. if (ret)
  256. goto out;
  257. end = get_cycles();
  258. cycles += end - start;
  259. }
  260. out:
  261. local_irq_enable();
  262. local_bh_enable();
  263. if (ret)
  264. return ret;
  265. printk("%6lu cycles/operation, %4lu cycles/byte\n",
  266. cycles / 8, cycles / (8 * blen));
  267. return 0;
  268. }
  269. static int test_hash_cycles(struct hash_desc *desc, struct scatterlist *sg,
  270. int blen, int plen, char *out)
  271. {
  272. unsigned long cycles = 0;
  273. int i, pcount;
  274. int ret;
  275. if (plen == blen)
  276. return test_hash_cycles_digest(desc, sg, blen, out);
  277. local_bh_disable();
  278. local_irq_disable();
  279. /* Warm-up run. */
  280. for (i = 0; i < 4; i++) {
  281. ret = crypto_hash_init(desc);
  282. if (ret)
  283. goto out;
  284. for (pcount = 0; pcount < blen; pcount += plen) {
  285. ret = crypto_hash_update(desc, sg, plen);
  286. if (ret)
  287. goto out;
  288. }
  289. ret = crypto_hash_final(desc, out);
  290. if (ret)
  291. goto out;
  292. }
  293. /* The real thing. */
  294. for (i = 0; i < 8; i++) {
  295. cycles_t start, end;
  296. start = get_cycles();
  297. ret = crypto_hash_init(desc);
  298. if (ret)
  299. goto out;
  300. for (pcount = 0; pcount < blen; pcount += plen) {
  301. ret = crypto_hash_update(desc, sg, plen);
  302. if (ret)
  303. goto out;
  304. }
  305. ret = crypto_hash_final(desc, out);
  306. if (ret)
  307. goto out;
  308. end = get_cycles();
  309. cycles += end - start;
  310. }
  311. out:
  312. local_irq_enable();
  313. local_bh_enable();
  314. if (ret)
  315. return ret;
  316. printk("%6lu cycles/operation, %4lu cycles/byte\n",
  317. cycles / 8, cycles / (8 * blen));
  318. return 0;
  319. }
  320. static void test_hash_speed(const char *algo, unsigned int sec,
  321. struct hash_speed *speed)
  322. {
  323. struct scatterlist sg[TVMEMSIZE];
  324. struct crypto_hash *tfm;
  325. struct hash_desc desc;
  326. static char output[1024];
  327. int i;
  328. int ret;
  329. printk(KERN_INFO "\ntesting speed of %s\n", algo);
  330. tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
  331. if (IS_ERR(tfm)) {
  332. printk(KERN_ERR "failed to load transform for %s: %ld\n", algo,
  333. PTR_ERR(tfm));
  334. return;
  335. }
  336. desc.tfm = tfm;
  337. desc.flags = 0;
  338. if (crypto_hash_digestsize(tfm) > sizeof(output)) {
  339. printk(KERN_ERR "digestsize(%u) > outputbuffer(%zu)\n",
  340. crypto_hash_digestsize(tfm), sizeof(output));
  341. goto out;
  342. }
  343. sg_init_table(sg, TVMEMSIZE);
  344. for (i = 0; i < TVMEMSIZE; i++) {
  345. sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
  346. memset(tvmem[i], 0xff, PAGE_SIZE);
  347. }
  348. for (i = 0; speed[i].blen != 0; i++) {
  349. if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
  350. printk(KERN_ERR
  351. "template (%u) too big for tvmem (%lu)\n",
  352. speed[i].blen, TVMEMSIZE * PAGE_SIZE);
  353. goto out;
  354. }
  355. printk(KERN_INFO "test%3u "
  356. "(%5u byte blocks,%5u bytes per update,%4u updates): ",
  357. i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
  358. if (sec)
  359. ret = test_hash_jiffies(&desc, sg, speed[i].blen,
  360. speed[i].plen, output, sec);
  361. else
  362. ret = test_hash_cycles(&desc, sg, speed[i].blen,
  363. speed[i].plen, output);
  364. if (ret) {
  365. printk(KERN_ERR "hashing failed ret=%d\n", ret);
  366. break;
  367. }
  368. }
  369. out:
  370. crypto_free_hash(tfm);
  371. }
  372. static void test_available(void)
  373. {
  374. char **name = check;
  375. while (*name) {
  376. printk("alg %s ", *name);
  377. printk(crypto_has_alg(*name, 0, 0) ?
  378. "found\n" : "not found\n");
  379. name++;
  380. }
  381. }
  382. static inline int tcrypt_test(const char *alg)
  383. {
  384. int ret;
  385. ret = alg_test(alg, alg, 0, 0);
  386. /* non-fips algs return -EINVAL in fips mode */
  387. if (fips_enabled && ret == -EINVAL)
  388. ret = 0;
  389. return ret;
  390. }
  391. static int do_test(int m)
  392. {
  393. int i;
  394. int ret = 0;
  395. switch (m) {
  396. case 0:
  397. for (i = 1; i < 200; i++)
  398. ret += do_test(i);
  399. break;
  400. case 1:
  401. ret += tcrypt_test("md5");
  402. break;
  403. case 2:
  404. ret += tcrypt_test("sha1");
  405. break;
  406. case 3:
  407. ret += tcrypt_test("ecb(des)");
  408. ret += tcrypt_test("cbc(des)");
  409. break;
  410. case 4:
  411. ret += tcrypt_test("ecb(des3_ede)");
  412. ret += tcrypt_test("cbc(des3_ede)");
  413. break;
  414. case 5:
  415. ret += tcrypt_test("md4");
  416. break;
  417. case 6:
  418. ret += tcrypt_test("sha256");
  419. break;
  420. case 7:
  421. ret += tcrypt_test("ecb(blowfish)");
  422. ret += tcrypt_test("cbc(blowfish)");
  423. break;
  424. case 8:
  425. ret += tcrypt_test("ecb(twofish)");
  426. ret += tcrypt_test("cbc(twofish)");
  427. break;
  428. case 9:
  429. ret += tcrypt_test("ecb(serpent)");
  430. break;
  431. case 10:
  432. ret += tcrypt_test("ecb(aes)");
  433. ret += tcrypt_test("cbc(aes)");
  434. ret += tcrypt_test("lrw(aes)");
  435. ret += tcrypt_test("xts(aes)");
  436. ret += tcrypt_test("ctr(aes)");
  437. ret += tcrypt_test("rfc3686(ctr(aes))");
  438. break;
  439. case 11:
  440. ret += tcrypt_test("sha384");
  441. break;
  442. case 12:
  443. ret += tcrypt_test("sha512");
  444. break;
  445. case 13:
  446. ret += tcrypt_test("deflate");
  447. break;
  448. case 14:
  449. ret += tcrypt_test("ecb(cast5)");
  450. break;
  451. case 15:
  452. ret += tcrypt_test("ecb(cast6)");
  453. break;
  454. case 16:
  455. ret += tcrypt_test("ecb(arc4)");
  456. break;
  457. case 17:
  458. ret += tcrypt_test("michael_mic");
  459. break;
  460. case 18:
  461. ret += tcrypt_test("crc32c");
  462. break;
  463. case 19:
  464. ret += tcrypt_test("ecb(tea)");
  465. break;
  466. case 20:
  467. ret += tcrypt_test("ecb(xtea)");
  468. break;
  469. case 21:
  470. ret += tcrypt_test("ecb(khazad)");
  471. break;
  472. case 22:
  473. ret += tcrypt_test("wp512");
  474. break;
  475. case 23:
  476. ret += tcrypt_test("wp384");
  477. break;
  478. case 24:
  479. ret += tcrypt_test("wp256");
  480. break;
  481. case 25:
  482. ret += tcrypt_test("ecb(tnepres)");
  483. break;
  484. case 26:
  485. ret += tcrypt_test("ecb(anubis)");
  486. ret += tcrypt_test("cbc(anubis)");
  487. break;
  488. case 27:
  489. ret += tcrypt_test("tgr192");
  490. break;
  491. case 28:
  492. ret += tcrypt_test("tgr160");
  493. break;
  494. case 29:
  495. ret += tcrypt_test("tgr128");
  496. break;
  497. case 30:
  498. ret += tcrypt_test("ecb(xeta)");
  499. break;
  500. case 31:
  501. ret += tcrypt_test("pcbc(fcrypt)");
  502. break;
  503. case 32:
  504. ret += tcrypt_test("ecb(camellia)");
  505. ret += tcrypt_test("cbc(camellia)");
  506. break;
  507. case 33:
  508. ret += tcrypt_test("sha224");
  509. break;
  510. case 34:
  511. ret += tcrypt_test("salsa20");
  512. break;
  513. case 35:
  514. ret += tcrypt_test("gcm(aes)");
  515. break;
  516. case 36:
  517. ret += tcrypt_test("lzo");
  518. break;
  519. case 37:
  520. ret += tcrypt_test("ccm(aes)");
  521. break;
  522. case 38:
  523. ret += tcrypt_test("cts(cbc(aes))");
  524. break;
  525. case 39:
  526. ret += tcrypt_test("rmd128");
  527. break;
  528. case 40:
  529. ret += tcrypt_test("rmd160");
  530. break;
  531. case 41:
  532. ret += tcrypt_test("rmd256");
  533. break;
  534. case 42:
  535. ret += tcrypt_test("rmd320");
  536. break;
  537. case 43:
  538. ret += tcrypt_test("ecb(seed)");
  539. break;
  540. case 44:
  541. ret += tcrypt_test("zlib");
  542. break;
  543. case 45:
  544. ret += tcrypt_test("rfc4309(ccm(aes))");
  545. break;
  546. case 100:
  547. ret += tcrypt_test("hmac(md5)");
  548. break;
  549. case 101:
  550. ret += tcrypt_test("hmac(sha1)");
  551. break;
  552. case 102:
  553. ret += tcrypt_test("hmac(sha256)");
  554. break;
  555. case 103:
  556. ret += tcrypt_test("hmac(sha384)");
  557. break;
  558. case 104:
  559. ret += tcrypt_test("hmac(sha512)");
  560. break;
  561. case 105:
  562. ret += tcrypt_test("hmac(sha224)");
  563. break;
  564. case 106:
  565. ret += tcrypt_test("xcbc(aes)");
  566. break;
  567. case 107:
  568. ret += tcrypt_test("hmac(rmd128)");
  569. break;
  570. case 108:
  571. ret += tcrypt_test("hmac(rmd160)");
  572. break;
  573. case 150:
  574. ret += tcrypt_test("ansi_cprng");
  575. break;
  576. case 200:
  577. test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
  578. speed_template_16_24_32);
  579. test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
  580. speed_template_16_24_32);
  581. test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
  582. speed_template_16_24_32);
  583. test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
  584. speed_template_16_24_32);
  585. test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
  586. speed_template_32_40_48);
  587. test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
  588. speed_template_32_40_48);
  589. test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
  590. speed_template_32_48_64);
  591. test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
  592. speed_template_32_48_64);
  593. break;
  594. case 201:
  595. test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
  596. des3_speed_template, DES3_SPEED_VECTORS,
  597. speed_template_24);
  598. test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
  599. des3_speed_template, DES3_SPEED_VECTORS,
  600. speed_template_24);
  601. test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
  602. des3_speed_template, DES3_SPEED_VECTORS,
  603. speed_template_24);
  604. test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
  605. des3_speed_template, DES3_SPEED_VECTORS,
  606. speed_template_24);
  607. break;
  608. case 202:
  609. test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
  610. speed_template_16_24_32);
  611. test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
  612. speed_template_16_24_32);
  613. test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
  614. speed_template_16_24_32);
  615. test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
  616. speed_template_16_24_32);
  617. break;
  618. case 203:
  619. test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
  620. speed_template_8_32);
  621. test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
  622. speed_template_8_32);
  623. test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
  624. speed_template_8_32);
  625. test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
  626. speed_template_8_32);
  627. break;
  628. case 204:
  629. test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
  630. speed_template_8);
  631. test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
  632. speed_template_8);
  633. test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
  634. speed_template_8);
  635. test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
  636. speed_template_8);
  637. break;
  638. case 205:
  639. test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
  640. speed_template_16_24_32);
  641. test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
  642. speed_template_16_24_32);
  643. test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
  644. speed_template_16_24_32);
  645. test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
  646. speed_template_16_24_32);
  647. break;
  648. case 206:
  649. test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
  650. speed_template_16_32);
  651. break;
  652. case 300:
  653. /* fall through */
  654. case 301:
  655. test_hash_speed("md4", sec, generic_hash_speed_template);
  656. if (mode > 300 && mode < 400) break;
  657. case 302:
  658. test_hash_speed("md5", sec, generic_hash_speed_template);
  659. if (mode > 300 && mode < 400) break;
  660. case 303:
  661. test_hash_speed("sha1", sec, generic_hash_speed_template);
  662. if (mode > 300 && mode < 400) break;
  663. case 304:
  664. test_hash_speed("sha256", sec, generic_hash_speed_template);
  665. if (mode > 300 && mode < 400) break;
  666. case 305:
  667. test_hash_speed("sha384", sec, generic_hash_speed_template);
  668. if (mode > 300 && mode < 400) break;
  669. case 306:
  670. test_hash_speed("sha512", sec, generic_hash_speed_template);
  671. if (mode > 300 && mode < 400) break;
  672. case 307:
  673. test_hash_speed("wp256", sec, generic_hash_speed_template);
  674. if (mode > 300 && mode < 400) break;
  675. case 308:
  676. test_hash_speed("wp384", sec, generic_hash_speed_template);
  677. if (mode > 300 && mode < 400) break;
  678. case 309:
  679. test_hash_speed("wp512", sec, generic_hash_speed_template);
  680. if (mode > 300 && mode < 400) break;
  681. case 310:
  682. test_hash_speed("tgr128", sec, generic_hash_speed_template);
  683. if (mode > 300 && mode < 400) break;
  684. case 311:
  685. test_hash_speed("tgr160", sec, generic_hash_speed_template);
  686. if (mode > 300 && mode < 400) break;
  687. case 312:
  688. test_hash_speed("tgr192", sec, generic_hash_speed_template);
  689. if (mode > 300 && mode < 400) break;
  690. case 313:
  691. test_hash_speed("sha224", sec, generic_hash_speed_template);
  692. if (mode > 300 && mode < 400) break;
  693. case 314:
  694. test_hash_speed("rmd128", sec, generic_hash_speed_template);
  695. if (mode > 300 && mode < 400) break;
  696. case 315:
  697. test_hash_speed("rmd160", sec, generic_hash_speed_template);
  698. if (mode > 300 && mode < 400) break;
  699. case 316:
  700. test_hash_speed("rmd256", sec, generic_hash_speed_template);
  701. if (mode > 300 && mode < 400) break;
  702. case 317:
  703. test_hash_speed("rmd320", sec, generic_hash_speed_template);
  704. if (mode > 300 && mode < 400) break;
  705. case 399:
  706. break;
  707. case 1000:
  708. test_available();
  709. break;
  710. }
  711. return ret;
  712. }
  713. static int __init tcrypt_mod_init(void)
  714. {
  715. int err = -ENOMEM;
  716. int i;
  717. for (i = 0; i < TVMEMSIZE; i++) {
  718. tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
  719. if (!tvmem[i])
  720. goto err_free_tv;
  721. }
  722. err = do_test(mode);
  723. if (err) {
  724. printk(KERN_ERR "tcrypt: one or more tests failed!\n");
  725. goto err_free_tv;
  726. }
  727. /* We intentionaly return -EAGAIN to prevent keeping the module,
  728. * unless we're running in fips mode. It does all its work from
  729. * init() and doesn't offer any runtime functionality, but in
  730. * the fips case, checking for a successful load is helpful.
  731. * => we don't need it in the memory, do we?
  732. * -- mludvig
  733. */
  734. if (!fips_enabled)
  735. err = -EAGAIN;
  736. err_free_tv:
  737. for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
  738. free_page((unsigned long)tvmem[i]);
  739. return err;
  740. }
  741. /*
  742. * If an init function is provided, an exit function must also be provided
  743. * to allow module unload.
  744. */
  745. static void __exit tcrypt_mod_fini(void) { }
  746. module_init(tcrypt_mod_init);
  747. module_exit(tcrypt_mod_fini);
  748. module_param(mode, int, 0);
  749. module_param(sec, uint, 0);
  750. MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
  751. "(defaults to zero which uses CPU cycles instead)");
  752. MODULE_LICENSE("GPL");
  753. MODULE_DESCRIPTION("Quick & dirty crypto testing module");
  754. MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");