tcrypt.c 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046
  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. * Updated RFC4106 AES-GCM testing.
  12. * Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
  13. * Adrian Hoban <adrian.hoban@intel.com>
  14. * Gabriele Paoloni <gabriele.paoloni@intel.com>
  15. * Tadeusz Struk (tadeusz.struk@intel.com)
  16. * Copyright (c) 2010, Intel Corporation.
  17. *
  18. * This program is free software; you can redistribute it and/or modify it
  19. * under the terms of the GNU General Public License as published by the Free
  20. * Software Foundation; either version 2 of the License, or (at your option)
  21. * any later version.
  22. *
  23. */
  24. #include <crypto/aead.h>
  25. #include <crypto/hash.h>
  26. #include <linux/err.h>
  27. #include <linux/fips.h>
  28. #include <linux/init.h>
  29. #include <linux/gfp.h>
  30. #include <linux/module.h>
  31. #include <linux/scatterlist.h>
  32. #include <linux/string.h>
  33. #include <linux/moduleparam.h>
  34. #include <linux/jiffies.h>
  35. #include <linux/timex.h>
  36. #include <linux/interrupt.h>
  37. #include "tcrypt.h"
  38. /*
  39. * Need slab memory for testing (size in number of pages).
  40. */
  41. #define TVMEMSIZE 4
  42. /*
  43. * Used by test_cipher_speed()
  44. */
  45. #define ENCRYPT 1
  46. #define DECRYPT 0
  47. #define MAX_DIGEST_SIZE 64
  48. /*
  49. * return a string with the driver name
  50. */
  51. #define get_driver_name(tfm_type, tfm) crypto_tfm_alg_driver_name(tfm_type ## _tfm(tfm))
  52. /*
  53. * Used by test_cipher_speed()
  54. */
  55. static unsigned int sec;
  56. static char *alg = NULL;
  57. static u32 type;
  58. static u32 mask;
  59. static int mode;
  60. static char *tvmem[TVMEMSIZE];
  61. static char *check[] = {
  62. "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
  63. "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
  64. "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
  65. "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
  66. "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
  67. "lzo", "cts", "zlib", NULL
  68. };
  69. struct tcrypt_result {
  70. struct completion completion;
  71. int err;
  72. };
  73. static void tcrypt_complete(struct crypto_async_request *req, int err)
  74. {
  75. struct tcrypt_result *res = req->data;
  76. if (err == -EINPROGRESS)
  77. return;
  78. res->err = err;
  79. complete(&res->completion);
  80. }
  81. static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc,
  82. struct scatterlist *sg, int blen, int secs)
  83. {
  84. unsigned long start, end;
  85. int bcount;
  86. int ret;
  87. for (start = jiffies, end = start + secs * HZ, bcount = 0;
  88. time_before(jiffies, end); bcount++) {
  89. if (enc)
  90. ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
  91. else
  92. ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
  93. if (ret)
  94. return ret;
  95. }
  96. printk("%d operations in %d seconds (%ld bytes)\n",
  97. bcount, secs, (long)bcount * blen);
  98. return 0;
  99. }
  100. static int test_cipher_cycles(struct blkcipher_desc *desc, int enc,
  101. struct scatterlist *sg, int blen)
  102. {
  103. unsigned long cycles = 0;
  104. int ret = 0;
  105. int i;
  106. local_irq_disable();
  107. /* Warm-up run. */
  108. for (i = 0; i < 4; i++) {
  109. if (enc)
  110. ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
  111. else
  112. ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
  113. if (ret)
  114. goto out;
  115. }
  116. /* The real thing. */
  117. for (i = 0; i < 8; i++) {
  118. cycles_t start, end;
  119. start = get_cycles();
  120. if (enc)
  121. ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
  122. else
  123. ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
  124. end = get_cycles();
  125. if (ret)
  126. goto out;
  127. cycles += end - start;
  128. }
  129. out:
  130. local_irq_enable();
  131. if (ret == 0)
  132. printk("1 operation in %lu cycles (%d bytes)\n",
  133. (cycles + 4) / 8, blen);
  134. return ret;
  135. }
  136. static inline int do_one_aead_op(struct aead_request *req, int ret)
  137. {
  138. if (ret == -EINPROGRESS || ret == -EBUSY) {
  139. struct tcrypt_result *tr = req->base.data;
  140. ret = wait_for_completion_interruptible(&tr->completion);
  141. if (!ret)
  142. ret = tr->err;
  143. reinit_completion(&tr->completion);
  144. }
  145. return ret;
  146. }
  147. static int test_aead_jiffies(struct aead_request *req, int enc,
  148. int blen, int secs)
  149. {
  150. unsigned long start, end;
  151. int bcount;
  152. int ret;
  153. for (start = jiffies, end = start + secs * HZ, bcount = 0;
  154. time_before(jiffies, end); bcount++) {
  155. if (enc)
  156. ret = do_one_aead_op(req, crypto_aead_encrypt(req));
  157. else
  158. ret = do_one_aead_op(req, crypto_aead_decrypt(req));
  159. if (ret)
  160. return ret;
  161. }
  162. printk("%d operations in %d seconds (%ld bytes)\n",
  163. bcount, secs, (long)bcount * blen);
  164. return 0;
  165. }
  166. static int test_aead_cycles(struct aead_request *req, int enc, int blen)
  167. {
  168. unsigned long cycles = 0;
  169. int ret = 0;
  170. int i;
  171. local_irq_disable();
  172. /* Warm-up run. */
  173. for (i = 0; i < 4; i++) {
  174. if (enc)
  175. ret = do_one_aead_op(req, crypto_aead_encrypt(req));
  176. else
  177. ret = do_one_aead_op(req, crypto_aead_decrypt(req));
  178. if (ret)
  179. goto out;
  180. }
  181. /* The real thing. */
  182. for (i = 0; i < 8; i++) {
  183. cycles_t start, end;
  184. start = get_cycles();
  185. if (enc)
  186. ret = do_one_aead_op(req, crypto_aead_encrypt(req));
  187. else
  188. ret = do_one_aead_op(req, crypto_aead_decrypt(req));
  189. end = get_cycles();
  190. if (ret)
  191. goto out;
  192. cycles += end - start;
  193. }
  194. out:
  195. local_irq_enable();
  196. if (ret == 0)
  197. printk("1 operation in %lu cycles (%d bytes)\n",
  198. (cycles + 4) / 8, blen);
  199. return ret;
  200. }
  201. static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
  202. static u32 aead_sizes[] = { 16, 64, 256, 512, 1024, 2048, 4096, 8192, 0 };
  203. #define XBUFSIZE 8
  204. #define MAX_IVLEN 32
  205. static int testmgr_alloc_buf(char *buf[XBUFSIZE])
  206. {
  207. int i;
  208. for (i = 0; i < XBUFSIZE; i++) {
  209. buf[i] = (void *)__get_free_page(GFP_KERNEL);
  210. if (!buf[i])
  211. goto err_free_buf;
  212. }
  213. return 0;
  214. err_free_buf:
  215. while (i-- > 0)
  216. free_page((unsigned long)buf[i]);
  217. return -ENOMEM;
  218. }
  219. static void testmgr_free_buf(char *buf[XBUFSIZE])
  220. {
  221. int i;
  222. for (i = 0; i < XBUFSIZE; i++)
  223. free_page((unsigned long)buf[i]);
  224. }
  225. static void sg_init_aead(struct scatterlist *sg, char *xbuf[XBUFSIZE],
  226. unsigned int buflen)
  227. {
  228. int np = (buflen + PAGE_SIZE - 1)/PAGE_SIZE;
  229. int k, rem;
  230. if (np > XBUFSIZE) {
  231. rem = PAGE_SIZE;
  232. np = XBUFSIZE;
  233. } else {
  234. rem = buflen % PAGE_SIZE;
  235. }
  236. sg_init_table(sg, np + 1);
  237. np--;
  238. for (k = 0; k < np; k++)
  239. sg_set_buf(&sg[k + 1], xbuf[k], PAGE_SIZE);
  240. sg_set_buf(&sg[k + 1], xbuf[k], rem);
  241. }
  242. static void test_aead_speed(const char *algo, int enc, unsigned int secs,
  243. struct aead_speed_template *template,
  244. unsigned int tcount, u8 authsize,
  245. unsigned int aad_size, u8 *keysize)
  246. {
  247. unsigned int i, j;
  248. struct crypto_aead *tfm;
  249. int ret = -ENOMEM;
  250. const char *key;
  251. struct aead_request *req;
  252. struct scatterlist *sg;
  253. struct scatterlist *sgout;
  254. const char *e;
  255. void *assoc;
  256. char *iv;
  257. char *xbuf[XBUFSIZE];
  258. char *xoutbuf[XBUFSIZE];
  259. char *axbuf[XBUFSIZE];
  260. unsigned int *b_size;
  261. unsigned int iv_len;
  262. struct tcrypt_result result;
  263. iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
  264. if (!iv)
  265. return;
  266. if (aad_size >= PAGE_SIZE) {
  267. pr_err("associate data length (%u) too big\n", aad_size);
  268. goto out_noxbuf;
  269. }
  270. if (enc == ENCRYPT)
  271. e = "encryption";
  272. else
  273. e = "decryption";
  274. if (testmgr_alloc_buf(xbuf))
  275. goto out_noxbuf;
  276. if (testmgr_alloc_buf(axbuf))
  277. goto out_noaxbuf;
  278. if (testmgr_alloc_buf(xoutbuf))
  279. goto out_nooutbuf;
  280. sg = kmalloc(sizeof(*sg) * 9 * 2, GFP_KERNEL);
  281. if (!sg)
  282. goto out_nosg;
  283. sgout = &sg[9];
  284. tfm = crypto_alloc_aead(algo, 0, 0);
  285. if (IS_ERR(tfm)) {
  286. pr_err("alg: aead: Failed to load transform for %s: %ld\n", algo,
  287. PTR_ERR(tfm));
  288. goto out_notfm;
  289. }
  290. init_completion(&result.completion);
  291. printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo,
  292. get_driver_name(crypto_aead, tfm), e);
  293. req = aead_request_alloc(tfm, GFP_KERNEL);
  294. if (!req) {
  295. pr_err("alg: aead: Failed to allocate request for %s\n",
  296. algo);
  297. goto out_noreq;
  298. }
  299. aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
  300. tcrypt_complete, &result);
  301. i = 0;
  302. do {
  303. b_size = aead_sizes;
  304. do {
  305. assoc = axbuf[0];
  306. memset(assoc, 0xff, aad_size);
  307. if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
  308. pr_err("template (%u) too big for tvmem (%lu)\n",
  309. *keysize + *b_size,
  310. TVMEMSIZE * PAGE_SIZE);
  311. goto out;
  312. }
  313. key = tvmem[0];
  314. for (j = 0; j < tcount; j++) {
  315. if (template[j].klen == *keysize) {
  316. key = template[j].key;
  317. break;
  318. }
  319. }
  320. ret = crypto_aead_setkey(tfm, key, *keysize);
  321. ret = crypto_aead_setauthsize(tfm, authsize);
  322. iv_len = crypto_aead_ivsize(tfm);
  323. if (iv_len)
  324. memset(iv, 0xff, iv_len);
  325. crypto_aead_clear_flags(tfm, ~0);
  326. printk(KERN_INFO "test %u (%d bit key, %d byte blocks): ",
  327. i, *keysize * 8, *b_size);
  328. memset(tvmem[0], 0xff, PAGE_SIZE);
  329. if (ret) {
  330. pr_err("setkey() failed flags=%x\n",
  331. crypto_aead_get_flags(tfm));
  332. goto out;
  333. }
  334. sg_init_aead(sg, xbuf,
  335. *b_size + (enc ? authsize : 0));
  336. sg_init_aead(sgout, xoutbuf,
  337. *b_size + (enc ? authsize : 0));
  338. sg_set_buf(&sg[0], assoc, aad_size);
  339. sg_set_buf(&sgout[0], assoc, aad_size);
  340. aead_request_set_crypt(req, sg, sgout, *b_size, iv);
  341. aead_request_set_ad(req, aad_size);
  342. if (secs)
  343. ret = test_aead_jiffies(req, enc, *b_size,
  344. secs);
  345. else
  346. ret = test_aead_cycles(req, enc, *b_size);
  347. if (ret) {
  348. pr_err("%s() failed return code=%d\n", e, ret);
  349. break;
  350. }
  351. b_size++;
  352. i++;
  353. } while (*b_size);
  354. keysize++;
  355. } while (*keysize);
  356. out:
  357. aead_request_free(req);
  358. out_noreq:
  359. crypto_free_aead(tfm);
  360. out_notfm:
  361. kfree(sg);
  362. out_nosg:
  363. testmgr_free_buf(xoutbuf);
  364. out_nooutbuf:
  365. testmgr_free_buf(axbuf);
  366. out_noaxbuf:
  367. testmgr_free_buf(xbuf);
  368. out_noxbuf:
  369. kfree(iv);
  370. return;
  371. }
  372. static void test_cipher_speed(const char *algo, int enc, unsigned int secs,
  373. struct cipher_speed_template *template,
  374. unsigned int tcount, u8 *keysize)
  375. {
  376. unsigned int ret, i, j, iv_len;
  377. const char *key;
  378. char iv[128];
  379. struct crypto_blkcipher *tfm;
  380. struct blkcipher_desc desc;
  381. const char *e;
  382. u32 *b_size;
  383. if (enc == ENCRYPT)
  384. e = "encryption";
  385. else
  386. e = "decryption";
  387. tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
  388. if (IS_ERR(tfm)) {
  389. printk("failed to load transform for %s: %ld\n", algo,
  390. PTR_ERR(tfm));
  391. return;
  392. }
  393. desc.tfm = tfm;
  394. desc.flags = 0;
  395. printk(KERN_INFO "\ntesting speed of %s (%s) %s\n", algo,
  396. get_driver_name(crypto_blkcipher, tfm), e);
  397. i = 0;
  398. do {
  399. b_size = block_sizes;
  400. do {
  401. struct scatterlist sg[TVMEMSIZE];
  402. if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
  403. printk("template (%u) too big for "
  404. "tvmem (%lu)\n", *keysize + *b_size,
  405. TVMEMSIZE * PAGE_SIZE);
  406. goto out;
  407. }
  408. printk("test %u (%d bit key, %d byte blocks): ", i,
  409. *keysize * 8, *b_size);
  410. memset(tvmem[0], 0xff, PAGE_SIZE);
  411. /* set key, plain text and IV */
  412. key = tvmem[0];
  413. for (j = 0; j < tcount; j++) {
  414. if (template[j].klen == *keysize) {
  415. key = template[j].key;
  416. break;
  417. }
  418. }
  419. ret = crypto_blkcipher_setkey(tfm, key, *keysize);
  420. if (ret) {
  421. printk("setkey() failed flags=%x\n",
  422. crypto_blkcipher_get_flags(tfm));
  423. goto out;
  424. }
  425. sg_init_table(sg, TVMEMSIZE);
  426. sg_set_buf(sg, tvmem[0] + *keysize,
  427. PAGE_SIZE - *keysize);
  428. for (j = 1; j < TVMEMSIZE; j++) {
  429. sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
  430. memset (tvmem[j], 0xff, PAGE_SIZE);
  431. }
  432. iv_len = crypto_blkcipher_ivsize(tfm);
  433. if (iv_len) {
  434. memset(&iv, 0xff, iv_len);
  435. crypto_blkcipher_set_iv(tfm, iv, iv_len);
  436. }
  437. if (secs)
  438. ret = test_cipher_jiffies(&desc, enc, sg,
  439. *b_size, secs);
  440. else
  441. ret = test_cipher_cycles(&desc, enc, sg,
  442. *b_size);
  443. if (ret) {
  444. printk("%s() failed flags=%x\n", e, desc.flags);
  445. break;
  446. }
  447. b_size++;
  448. i++;
  449. } while (*b_size);
  450. keysize++;
  451. } while (*keysize);
  452. out:
  453. crypto_free_blkcipher(tfm);
  454. }
  455. static void test_hash_sg_init(struct scatterlist *sg)
  456. {
  457. int i;
  458. sg_init_table(sg, TVMEMSIZE);
  459. for (i = 0; i < TVMEMSIZE; i++) {
  460. sg_set_buf(sg + i, tvmem[i], PAGE_SIZE);
  461. memset(tvmem[i], 0xff, PAGE_SIZE);
  462. }
  463. }
  464. static inline int do_one_ahash_op(struct ahash_request *req, int ret)
  465. {
  466. if (ret == -EINPROGRESS || ret == -EBUSY) {
  467. struct tcrypt_result *tr = req->base.data;
  468. wait_for_completion(&tr->completion);
  469. reinit_completion(&tr->completion);
  470. ret = tr->err;
  471. }
  472. return ret;
  473. }
  474. static int test_ahash_jiffies_digest(struct ahash_request *req, int blen,
  475. char *out, int secs)
  476. {
  477. unsigned long start, end;
  478. int bcount;
  479. int ret;
  480. for (start = jiffies, end = start + secs * HZ, bcount = 0;
  481. time_before(jiffies, end); bcount++) {
  482. ret = do_one_ahash_op(req, crypto_ahash_digest(req));
  483. if (ret)
  484. return ret;
  485. }
  486. printk("%6u opers/sec, %9lu bytes/sec\n",
  487. bcount / secs, ((long)bcount * blen) / secs);
  488. return 0;
  489. }
  490. static int test_ahash_jiffies(struct ahash_request *req, int blen,
  491. int plen, char *out, int secs)
  492. {
  493. unsigned long start, end;
  494. int bcount, pcount;
  495. int ret;
  496. if (plen == blen)
  497. return test_ahash_jiffies_digest(req, blen, out, secs);
  498. for (start = jiffies, end = start + secs * HZ, bcount = 0;
  499. time_before(jiffies, end); bcount++) {
  500. ret = do_one_ahash_op(req, crypto_ahash_init(req));
  501. if (ret)
  502. return ret;
  503. for (pcount = 0; pcount < blen; pcount += plen) {
  504. ret = do_one_ahash_op(req, crypto_ahash_update(req));
  505. if (ret)
  506. return ret;
  507. }
  508. /* we assume there is enough space in 'out' for the result */
  509. ret = do_one_ahash_op(req, crypto_ahash_final(req));
  510. if (ret)
  511. return ret;
  512. }
  513. pr_cont("%6u opers/sec, %9lu bytes/sec\n",
  514. bcount / secs, ((long)bcount * blen) / secs);
  515. return 0;
  516. }
  517. static int test_ahash_cycles_digest(struct ahash_request *req, int blen,
  518. char *out)
  519. {
  520. unsigned long cycles = 0;
  521. int ret, i;
  522. /* Warm-up run. */
  523. for (i = 0; i < 4; i++) {
  524. ret = do_one_ahash_op(req, crypto_ahash_digest(req));
  525. if (ret)
  526. goto out;
  527. }
  528. /* The real thing. */
  529. for (i = 0; i < 8; i++) {
  530. cycles_t start, end;
  531. start = get_cycles();
  532. ret = do_one_ahash_op(req, crypto_ahash_digest(req));
  533. if (ret)
  534. goto out;
  535. end = get_cycles();
  536. cycles += end - start;
  537. }
  538. out:
  539. if (ret)
  540. return ret;
  541. pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
  542. cycles / 8, cycles / (8 * blen));
  543. return 0;
  544. }
  545. static int test_ahash_cycles(struct ahash_request *req, int blen,
  546. int plen, char *out)
  547. {
  548. unsigned long cycles = 0;
  549. int i, pcount, ret;
  550. if (plen == blen)
  551. return test_ahash_cycles_digest(req, blen, out);
  552. /* Warm-up run. */
  553. for (i = 0; i < 4; i++) {
  554. ret = do_one_ahash_op(req, crypto_ahash_init(req));
  555. if (ret)
  556. goto out;
  557. for (pcount = 0; pcount < blen; pcount += plen) {
  558. ret = do_one_ahash_op(req, crypto_ahash_update(req));
  559. if (ret)
  560. goto out;
  561. }
  562. ret = do_one_ahash_op(req, crypto_ahash_final(req));
  563. if (ret)
  564. goto out;
  565. }
  566. /* The real thing. */
  567. for (i = 0; i < 8; i++) {
  568. cycles_t start, end;
  569. start = get_cycles();
  570. ret = do_one_ahash_op(req, crypto_ahash_init(req));
  571. if (ret)
  572. goto out;
  573. for (pcount = 0; pcount < blen; pcount += plen) {
  574. ret = do_one_ahash_op(req, crypto_ahash_update(req));
  575. if (ret)
  576. goto out;
  577. }
  578. ret = do_one_ahash_op(req, crypto_ahash_final(req));
  579. if (ret)
  580. goto out;
  581. end = get_cycles();
  582. cycles += end - start;
  583. }
  584. out:
  585. if (ret)
  586. return ret;
  587. pr_cont("%6lu cycles/operation, %4lu cycles/byte\n",
  588. cycles / 8, cycles / (8 * blen));
  589. return 0;
  590. }
  591. static void test_ahash_speed_common(const char *algo, unsigned int secs,
  592. struct hash_speed *speed, unsigned mask)
  593. {
  594. struct scatterlist sg[TVMEMSIZE];
  595. struct tcrypt_result tresult;
  596. struct ahash_request *req;
  597. struct crypto_ahash *tfm;
  598. char *output;
  599. int i, ret;
  600. tfm = crypto_alloc_ahash(algo, 0, mask);
  601. if (IS_ERR(tfm)) {
  602. pr_err("failed to load transform for %s: %ld\n",
  603. algo, PTR_ERR(tfm));
  604. return;
  605. }
  606. printk(KERN_INFO "\ntesting speed of async %s (%s)\n", algo,
  607. get_driver_name(crypto_ahash, tfm));
  608. if (crypto_ahash_digestsize(tfm) > MAX_DIGEST_SIZE) {
  609. pr_err("digestsize(%u) > %d\n", crypto_ahash_digestsize(tfm),
  610. MAX_DIGEST_SIZE);
  611. goto out;
  612. }
  613. test_hash_sg_init(sg);
  614. req = ahash_request_alloc(tfm, GFP_KERNEL);
  615. if (!req) {
  616. pr_err("ahash request allocation failure\n");
  617. goto out;
  618. }
  619. init_completion(&tresult.completion);
  620. ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
  621. tcrypt_complete, &tresult);
  622. output = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
  623. if (!output)
  624. goto out_nomem;
  625. for (i = 0; speed[i].blen != 0; i++) {
  626. if (speed[i].blen > TVMEMSIZE * PAGE_SIZE) {
  627. pr_err("template (%u) too big for tvmem (%lu)\n",
  628. speed[i].blen, TVMEMSIZE * PAGE_SIZE);
  629. break;
  630. }
  631. pr_info("test%3u "
  632. "(%5u byte blocks,%5u bytes per update,%4u updates): ",
  633. i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
  634. ahash_request_set_crypt(req, sg, output, speed[i].plen);
  635. if (secs)
  636. ret = test_ahash_jiffies(req, speed[i].blen,
  637. speed[i].plen, output, secs);
  638. else
  639. ret = test_ahash_cycles(req, speed[i].blen,
  640. speed[i].plen, output);
  641. if (ret) {
  642. pr_err("hashing failed ret=%d\n", ret);
  643. break;
  644. }
  645. }
  646. kfree(output);
  647. out_nomem:
  648. ahash_request_free(req);
  649. out:
  650. crypto_free_ahash(tfm);
  651. }
  652. static void test_ahash_speed(const char *algo, unsigned int secs,
  653. struct hash_speed *speed)
  654. {
  655. return test_ahash_speed_common(algo, secs, speed, 0);
  656. }
  657. static void test_hash_speed(const char *algo, unsigned int secs,
  658. struct hash_speed *speed)
  659. {
  660. return test_ahash_speed_common(algo, secs, speed, CRYPTO_ALG_ASYNC);
  661. }
  662. static inline int do_one_acipher_op(struct ablkcipher_request *req, int ret)
  663. {
  664. if (ret == -EINPROGRESS || ret == -EBUSY) {
  665. struct tcrypt_result *tr = req->base.data;
  666. wait_for_completion(&tr->completion);
  667. reinit_completion(&tr->completion);
  668. ret = tr->err;
  669. }
  670. return ret;
  671. }
  672. static int test_acipher_jiffies(struct ablkcipher_request *req, int enc,
  673. int blen, int secs)
  674. {
  675. unsigned long start, end;
  676. int bcount;
  677. int ret;
  678. for (start = jiffies, end = start + secs * HZ, bcount = 0;
  679. time_before(jiffies, end); bcount++) {
  680. if (enc)
  681. ret = do_one_acipher_op(req,
  682. crypto_ablkcipher_encrypt(req));
  683. else
  684. ret = do_one_acipher_op(req,
  685. crypto_ablkcipher_decrypt(req));
  686. if (ret)
  687. return ret;
  688. }
  689. pr_cont("%d operations in %d seconds (%ld bytes)\n",
  690. bcount, secs, (long)bcount * blen);
  691. return 0;
  692. }
  693. static int test_acipher_cycles(struct ablkcipher_request *req, int enc,
  694. int blen)
  695. {
  696. unsigned long cycles = 0;
  697. int ret = 0;
  698. int i;
  699. /* Warm-up run. */
  700. for (i = 0; i < 4; i++) {
  701. if (enc)
  702. ret = do_one_acipher_op(req,
  703. crypto_ablkcipher_encrypt(req));
  704. else
  705. ret = do_one_acipher_op(req,
  706. crypto_ablkcipher_decrypt(req));
  707. if (ret)
  708. goto out;
  709. }
  710. /* The real thing. */
  711. for (i = 0; i < 8; i++) {
  712. cycles_t start, end;
  713. start = get_cycles();
  714. if (enc)
  715. ret = do_one_acipher_op(req,
  716. crypto_ablkcipher_encrypt(req));
  717. else
  718. ret = do_one_acipher_op(req,
  719. crypto_ablkcipher_decrypt(req));
  720. end = get_cycles();
  721. if (ret)
  722. goto out;
  723. cycles += end - start;
  724. }
  725. out:
  726. if (ret == 0)
  727. pr_cont("1 operation in %lu cycles (%d bytes)\n",
  728. (cycles + 4) / 8, blen);
  729. return ret;
  730. }
  731. static void test_acipher_speed(const char *algo, int enc, unsigned int secs,
  732. struct cipher_speed_template *template,
  733. unsigned int tcount, u8 *keysize)
  734. {
  735. unsigned int ret, i, j, k, iv_len;
  736. struct tcrypt_result tresult;
  737. const char *key;
  738. char iv[128];
  739. struct ablkcipher_request *req;
  740. struct crypto_ablkcipher *tfm;
  741. const char *e;
  742. u32 *b_size;
  743. if (enc == ENCRYPT)
  744. e = "encryption";
  745. else
  746. e = "decryption";
  747. init_completion(&tresult.completion);
  748. tfm = crypto_alloc_ablkcipher(algo, 0, 0);
  749. if (IS_ERR(tfm)) {
  750. pr_err("failed to load transform for %s: %ld\n", algo,
  751. PTR_ERR(tfm));
  752. return;
  753. }
  754. pr_info("\ntesting speed of async %s (%s) %s\n", algo,
  755. get_driver_name(crypto_ablkcipher, tfm), e);
  756. req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
  757. if (!req) {
  758. pr_err("tcrypt: skcipher: Failed to allocate request for %s\n",
  759. algo);
  760. goto out;
  761. }
  762. ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
  763. tcrypt_complete, &tresult);
  764. i = 0;
  765. do {
  766. b_size = block_sizes;
  767. do {
  768. struct scatterlist sg[TVMEMSIZE];
  769. if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
  770. pr_err("template (%u) too big for "
  771. "tvmem (%lu)\n", *keysize + *b_size,
  772. TVMEMSIZE * PAGE_SIZE);
  773. goto out_free_req;
  774. }
  775. pr_info("test %u (%d bit key, %d byte blocks): ", i,
  776. *keysize * 8, *b_size);
  777. memset(tvmem[0], 0xff, PAGE_SIZE);
  778. /* set key, plain text and IV */
  779. key = tvmem[0];
  780. for (j = 0; j < tcount; j++) {
  781. if (template[j].klen == *keysize) {
  782. key = template[j].key;
  783. break;
  784. }
  785. }
  786. crypto_ablkcipher_clear_flags(tfm, ~0);
  787. ret = crypto_ablkcipher_setkey(tfm, key, *keysize);
  788. if (ret) {
  789. pr_err("setkey() failed flags=%x\n",
  790. crypto_ablkcipher_get_flags(tfm));
  791. goto out_free_req;
  792. }
  793. k = *keysize + *b_size;
  794. sg_init_table(sg, DIV_ROUND_UP(k, PAGE_SIZE));
  795. if (k > PAGE_SIZE) {
  796. sg_set_buf(sg, tvmem[0] + *keysize,
  797. PAGE_SIZE - *keysize);
  798. k -= PAGE_SIZE;
  799. j = 1;
  800. while (k > PAGE_SIZE) {
  801. sg_set_buf(sg + j, tvmem[j], PAGE_SIZE);
  802. memset(tvmem[j], 0xff, PAGE_SIZE);
  803. j++;
  804. k -= PAGE_SIZE;
  805. }
  806. sg_set_buf(sg + j, tvmem[j], k);
  807. memset(tvmem[j], 0xff, k);
  808. } else {
  809. sg_set_buf(sg, tvmem[0] + *keysize, *b_size);
  810. }
  811. iv_len = crypto_ablkcipher_ivsize(tfm);
  812. if (iv_len)
  813. memset(&iv, 0xff, iv_len);
  814. ablkcipher_request_set_crypt(req, sg, sg, *b_size, iv);
  815. if (secs)
  816. ret = test_acipher_jiffies(req, enc,
  817. *b_size, secs);
  818. else
  819. ret = test_acipher_cycles(req, enc,
  820. *b_size);
  821. if (ret) {
  822. pr_err("%s() failed flags=%x\n", e,
  823. crypto_ablkcipher_get_flags(tfm));
  824. break;
  825. }
  826. b_size++;
  827. i++;
  828. } while (*b_size);
  829. keysize++;
  830. } while (*keysize);
  831. out_free_req:
  832. ablkcipher_request_free(req);
  833. out:
  834. crypto_free_ablkcipher(tfm);
  835. }
  836. static void test_available(void)
  837. {
  838. char **name = check;
  839. while (*name) {
  840. printk("alg %s ", *name);
  841. printk(crypto_has_alg(*name, 0, 0) ?
  842. "found\n" : "not found\n");
  843. name++;
  844. }
  845. }
  846. static inline int tcrypt_test(const char *alg)
  847. {
  848. int ret;
  849. ret = alg_test(alg, alg, 0, 0);
  850. /* non-fips algs return -EINVAL in fips mode */
  851. if (fips_enabled && ret == -EINVAL)
  852. ret = 0;
  853. return ret;
  854. }
  855. static int do_test(const char *alg, u32 type, u32 mask, int m)
  856. {
  857. int i;
  858. int ret = 0;
  859. switch (m) {
  860. case 0:
  861. if (alg) {
  862. if (!crypto_has_alg(alg, type,
  863. mask ?: CRYPTO_ALG_TYPE_MASK))
  864. ret = -ENOENT;
  865. break;
  866. }
  867. for (i = 1; i < 200; i++)
  868. ret += do_test(NULL, 0, 0, i);
  869. break;
  870. case 1:
  871. ret += tcrypt_test("md5");
  872. break;
  873. case 2:
  874. ret += tcrypt_test("sha1");
  875. break;
  876. case 3:
  877. ret += tcrypt_test("ecb(des)");
  878. ret += tcrypt_test("cbc(des)");
  879. ret += tcrypt_test("ctr(des)");
  880. break;
  881. case 4:
  882. ret += tcrypt_test("ecb(des3_ede)");
  883. ret += tcrypt_test("cbc(des3_ede)");
  884. ret += tcrypt_test("ctr(des3_ede)");
  885. break;
  886. case 5:
  887. ret += tcrypt_test("md4");
  888. break;
  889. case 6:
  890. ret += tcrypt_test("sha256");
  891. break;
  892. case 7:
  893. ret += tcrypt_test("ecb(blowfish)");
  894. ret += tcrypt_test("cbc(blowfish)");
  895. ret += tcrypt_test("ctr(blowfish)");
  896. break;
  897. case 8:
  898. ret += tcrypt_test("ecb(twofish)");
  899. ret += tcrypt_test("cbc(twofish)");
  900. ret += tcrypt_test("ctr(twofish)");
  901. ret += tcrypt_test("lrw(twofish)");
  902. ret += tcrypt_test("xts(twofish)");
  903. break;
  904. case 9:
  905. ret += tcrypt_test("ecb(serpent)");
  906. ret += tcrypt_test("cbc(serpent)");
  907. ret += tcrypt_test("ctr(serpent)");
  908. ret += tcrypt_test("lrw(serpent)");
  909. ret += tcrypt_test("xts(serpent)");
  910. break;
  911. case 10:
  912. ret += tcrypt_test("ecb(aes)");
  913. ret += tcrypt_test("cbc(aes)");
  914. ret += tcrypt_test("lrw(aes)");
  915. ret += tcrypt_test("xts(aes)");
  916. ret += tcrypt_test("ctr(aes)");
  917. ret += tcrypt_test("rfc3686(ctr(aes))");
  918. break;
  919. case 11:
  920. ret += tcrypt_test("sha384");
  921. break;
  922. case 12:
  923. ret += tcrypt_test("sha512");
  924. break;
  925. case 13:
  926. ret += tcrypt_test("deflate");
  927. break;
  928. case 14:
  929. ret += tcrypt_test("ecb(cast5)");
  930. ret += tcrypt_test("cbc(cast5)");
  931. ret += tcrypt_test("ctr(cast5)");
  932. break;
  933. case 15:
  934. ret += tcrypt_test("ecb(cast6)");
  935. ret += tcrypt_test("cbc(cast6)");
  936. ret += tcrypt_test("ctr(cast6)");
  937. ret += tcrypt_test("lrw(cast6)");
  938. ret += tcrypt_test("xts(cast6)");
  939. break;
  940. case 16:
  941. ret += tcrypt_test("ecb(arc4)");
  942. break;
  943. case 17:
  944. ret += tcrypt_test("michael_mic");
  945. break;
  946. case 18:
  947. ret += tcrypt_test("crc32c");
  948. break;
  949. case 19:
  950. ret += tcrypt_test("ecb(tea)");
  951. break;
  952. case 20:
  953. ret += tcrypt_test("ecb(xtea)");
  954. break;
  955. case 21:
  956. ret += tcrypt_test("ecb(khazad)");
  957. break;
  958. case 22:
  959. ret += tcrypt_test("wp512");
  960. break;
  961. case 23:
  962. ret += tcrypt_test("wp384");
  963. break;
  964. case 24:
  965. ret += tcrypt_test("wp256");
  966. break;
  967. case 25:
  968. ret += tcrypt_test("ecb(tnepres)");
  969. break;
  970. case 26:
  971. ret += tcrypt_test("ecb(anubis)");
  972. ret += tcrypt_test("cbc(anubis)");
  973. break;
  974. case 27:
  975. ret += tcrypt_test("tgr192");
  976. break;
  977. case 28:
  978. ret += tcrypt_test("tgr160");
  979. break;
  980. case 29:
  981. ret += tcrypt_test("tgr128");
  982. break;
  983. case 30:
  984. ret += tcrypt_test("ecb(xeta)");
  985. break;
  986. case 31:
  987. ret += tcrypt_test("pcbc(fcrypt)");
  988. break;
  989. case 32:
  990. ret += tcrypt_test("ecb(camellia)");
  991. ret += tcrypt_test("cbc(camellia)");
  992. ret += tcrypt_test("ctr(camellia)");
  993. ret += tcrypt_test("lrw(camellia)");
  994. ret += tcrypt_test("xts(camellia)");
  995. break;
  996. case 33:
  997. ret += tcrypt_test("sha224");
  998. break;
  999. case 34:
  1000. ret += tcrypt_test("salsa20");
  1001. break;
  1002. case 35:
  1003. ret += tcrypt_test("gcm(aes)");
  1004. break;
  1005. case 36:
  1006. ret += tcrypt_test("lzo");
  1007. break;
  1008. case 37:
  1009. ret += tcrypt_test("ccm(aes)");
  1010. break;
  1011. case 38:
  1012. ret += tcrypt_test("cts(cbc(aes))");
  1013. break;
  1014. case 39:
  1015. ret += tcrypt_test("rmd128");
  1016. break;
  1017. case 40:
  1018. ret += tcrypt_test("rmd160");
  1019. break;
  1020. case 41:
  1021. ret += tcrypt_test("rmd256");
  1022. break;
  1023. case 42:
  1024. ret += tcrypt_test("rmd320");
  1025. break;
  1026. case 43:
  1027. ret += tcrypt_test("ecb(seed)");
  1028. break;
  1029. case 44:
  1030. ret += tcrypt_test("zlib");
  1031. break;
  1032. case 45:
  1033. ret += tcrypt_test("rfc4309(ccm(aes))");
  1034. break;
  1035. case 46:
  1036. ret += tcrypt_test("ghash");
  1037. break;
  1038. case 47:
  1039. ret += tcrypt_test("crct10dif");
  1040. break;
  1041. case 100:
  1042. ret += tcrypt_test("hmac(md5)");
  1043. break;
  1044. case 101:
  1045. ret += tcrypt_test("hmac(sha1)");
  1046. break;
  1047. case 102:
  1048. ret += tcrypt_test("hmac(sha256)");
  1049. break;
  1050. case 103:
  1051. ret += tcrypt_test("hmac(sha384)");
  1052. break;
  1053. case 104:
  1054. ret += tcrypt_test("hmac(sha512)");
  1055. break;
  1056. case 105:
  1057. ret += tcrypt_test("hmac(sha224)");
  1058. break;
  1059. case 106:
  1060. ret += tcrypt_test("xcbc(aes)");
  1061. break;
  1062. case 107:
  1063. ret += tcrypt_test("hmac(rmd128)");
  1064. break;
  1065. case 108:
  1066. ret += tcrypt_test("hmac(rmd160)");
  1067. break;
  1068. case 109:
  1069. ret += tcrypt_test("vmac(aes)");
  1070. break;
  1071. case 110:
  1072. ret += tcrypt_test("hmac(crc32)");
  1073. break;
  1074. case 150:
  1075. ret += tcrypt_test("ansi_cprng");
  1076. break;
  1077. case 151:
  1078. ret += tcrypt_test("rfc4106(gcm(aes))");
  1079. break;
  1080. case 152:
  1081. ret += tcrypt_test("rfc4543(gcm(aes))");
  1082. break;
  1083. case 153:
  1084. ret += tcrypt_test("cmac(aes)");
  1085. break;
  1086. case 154:
  1087. ret += tcrypt_test("cmac(des3_ede)");
  1088. break;
  1089. case 155:
  1090. ret += tcrypt_test("authenc(hmac(sha1),cbc(aes))");
  1091. break;
  1092. case 156:
  1093. ret += tcrypt_test("authenc(hmac(md5),ecb(cipher_null))");
  1094. break;
  1095. case 157:
  1096. ret += tcrypt_test("authenc(hmac(sha1),ecb(cipher_null))");
  1097. break;
  1098. case 181:
  1099. ret += tcrypt_test("authenc(hmac(sha1),cbc(des))");
  1100. break;
  1101. case 182:
  1102. ret += tcrypt_test("authenc(hmac(sha1),cbc(des3_ede))");
  1103. break;
  1104. case 183:
  1105. ret += tcrypt_test("authenc(hmac(sha224),cbc(des))");
  1106. break;
  1107. case 184:
  1108. ret += tcrypt_test("authenc(hmac(sha224),cbc(des3_ede))");
  1109. break;
  1110. case 185:
  1111. ret += tcrypt_test("authenc(hmac(sha256),cbc(des))");
  1112. break;
  1113. case 186:
  1114. ret += tcrypt_test("authenc(hmac(sha256),cbc(des3_ede))");
  1115. break;
  1116. case 187:
  1117. ret += tcrypt_test("authenc(hmac(sha384),cbc(des))");
  1118. break;
  1119. case 188:
  1120. ret += tcrypt_test("authenc(hmac(sha384),cbc(des3_ede))");
  1121. break;
  1122. case 189:
  1123. ret += tcrypt_test("authenc(hmac(sha512),cbc(des))");
  1124. break;
  1125. case 190:
  1126. ret += tcrypt_test("authenc(hmac(sha512),cbc(des3_ede))");
  1127. break;
  1128. case 200:
  1129. test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
  1130. speed_template_16_24_32);
  1131. test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
  1132. speed_template_16_24_32);
  1133. test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
  1134. speed_template_16_24_32);
  1135. test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
  1136. speed_template_16_24_32);
  1137. test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
  1138. speed_template_32_40_48);
  1139. test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
  1140. speed_template_32_40_48);
  1141. test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
  1142. speed_template_32_48_64);
  1143. test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
  1144. speed_template_32_48_64);
  1145. test_cipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
  1146. speed_template_16_24_32);
  1147. test_cipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
  1148. speed_template_16_24_32);
  1149. break;
  1150. case 201:
  1151. test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
  1152. des3_speed_template, DES3_SPEED_VECTORS,
  1153. speed_template_24);
  1154. test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
  1155. des3_speed_template, DES3_SPEED_VECTORS,
  1156. speed_template_24);
  1157. test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
  1158. des3_speed_template, DES3_SPEED_VECTORS,
  1159. speed_template_24);
  1160. test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
  1161. des3_speed_template, DES3_SPEED_VECTORS,
  1162. speed_template_24);
  1163. test_cipher_speed("ctr(des3_ede)", ENCRYPT, sec,
  1164. des3_speed_template, DES3_SPEED_VECTORS,
  1165. speed_template_24);
  1166. test_cipher_speed("ctr(des3_ede)", DECRYPT, sec,
  1167. des3_speed_template, DES3_SPEED_VECTORS,
  1168. speed_template_24);
  1169. break;
  1170. case 202:
  1171. test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
  1172. speed_template_16_24_32);
  1173. test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
  1174. speed_template_16_24_32);
  1175. test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
  1176. speed_template_16_24_32);
  1177. test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
  1178. speed_template_16_24_32);
  1179. test_cipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
  1180. speed_template_16_24_32);
  1181. test_cipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
  1182. speed_template_16_24_32);
  1183. test_cipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
  1184. speed_template_32_40_48);
  1185. test_cipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
  1186. speed_template_32_40_48);
  1187. test_cipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
  1188. speed_template_32_48_64);
  1189. test_cipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
  1190. speed_template_32_48_64);
  1191. break;
  1192. case 203:
  1193. test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
  1194. speed_template_8_32);
  1195. test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
  1196. speed_template_8_32);
  1197. test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
  1198. speed_template_8_32);
  1199. test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
  1200. speed_template_8_32);
  1201. test_cipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
  1202. speed_template_8_32);
  1203. test_cipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
  1204. speed_template_8_32);
  1205. break;
  1206. case 204:
  1207. test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
  1208. speed_template_8);
  1209. test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
  1210. speed_template_8);
  1211. test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
  1212. speed_template_8);
  1213. test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
  1214. speed_template_8);
  1215. break;
  1216. case 205:
  1217. test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
  1218. speed_template_16_24_32);
  1219. test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
  1220. speed_template_16_24_32);
  1221. test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
  1222. speed_template_16_24_32);
  1223. test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
  1224. speed_template_16_24_32);
  1225. test_cipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
  1226. speed_template_16_24_32);
  1227. test_cipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
  1228. speed_template_16_24_32);
  1229. test_cipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
  1230. speed_template_32_40_48);
  1231. test_cipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
  1232. speed_template_32_40_48);
  1233. test_cipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
  1234. speed_template_32_48_64);
  1235. test_cipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
  1236. speed_template_32_48_64);
  1237. break;
  1238. case 206:
  1239. test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
  1240. speed_template_16_32);
  1241. break;
  1242. case 207:
  1243. test_cipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
  1244. speed_template_16_32);
  1245. test_cipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
  1246. speed_template_16_32);
  1247. test_cipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
  1248. speed_template_16_32);
  1249. test_cipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
  1250. speed_template_16_32);
  1251. test_cipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
  1252. speed_template_16_32);
  1253. test_cipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
  1254. speed_template_16_32);
  1255. test_cipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
  1256. speed_template_32_48);
  1257. test_cipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
  1258. speed_template_32_48);
  1259. test_cipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
  1260. speed_template_32_64);
  1261. test_cipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
  1262. speed_template_32_64);
  1263. break;
  1264. case 208:
  1265. test_cipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
  1266. speed_template_8);
  1267. break;
  1268. case 209:
  1269. test_cipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
  1270. speed_template_8_16);
  1271. test_cipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
  1272. speed_template_8_16);
  1273. test_cipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
  1274. speed_template_8_16);
  1275. test_cipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
  1276. speed_template_8_16);
  1277. test_cipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
  1278. speed_template_8_16);
  1279. test_cipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
  1280. speed_template_8_16);
  1281. break;
  1282. case 210:
  1283. test_cipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
  1284. speed_template_16_32);
  1285. test_cipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
  1286. speed_template_16_32);
  1287. test_cipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
  1288. speed_template_16_32);
  1289. test_cipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
  1290. speed_template_16_32);
  1291. test_cipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
  1292. speed_template_16_32);
  1293. test_cipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
  1294. speed_template_16_32);
  1295. test_cipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
  1296. speed_template_32_48);
  1297. test_cipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
  1298. speed_template_32_48);
  1299. test_cipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
  1300. speed_template_32_64);
  1301. test_cipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
  1302. speed_template_32_64);
  1303. break;
  1304. case 211:
  1305. test_aead_speed("rfc4106(gcm(aes))", ENCRYPT, sec,
  1306. NULL, 0, 16, 16, aead_speed_template_20);
  1307. test_aead_speed("gcm(aes)", ENCRYPT, sec,
  1308. NULL, 0, 16, 8, speed_template_16_24_32);
  1309. break;
  1310. case 212:
  1311. test_aead_speed("rfc4309(ccm(aes))", ENCRYPT, sec,
  1312. NULL, 0, 16, 16, aead_speed_template_19);
  1313. break;
  1314. case 213:
  1315. test_aead_speed("rfc7539esp(chacha20,poly1305)", ENCRYPT, sec,
  1316. NULL, 0, 16, 8, aead_speed_template_36);
  1317. break;
  1318. case 214:
  1319. test_cipher_speed("chacha20", ENCRYPT, sec, NULL, 0,
  1320. speed_template_32);
  1321. break;
  1322. case 300:
  1323. if (alg) {
  1324. test_hash_speed(alg, sec, generic_hash_speed_template);
  1325. break;
  1326. }
  1327. /* fall through */
  1328. case 301:
  1329. test_hash_speed("md4", sec, generic_hash_speed_template);
  1330. if (mode > 300 && mode < 400) break;
  1331. case 302:
  1332. test_hash_speed("md5", sec, generic_hash_speed_template);
  1333. if (mode > 300 && mode < 400) break;
  1334. case 303:
  1335. test_hash_speed("sha1", sec, generic_hash_speed_template);
  1336. if (mode > 300 && mode < 400) break;
  1337. case 304:
  1338. test_hash_speed("sha256", sec, generic_hash_speed_template);
  1339. if (mode > 300 && mode < 400) break;
  1340. case 305:
  1341. test_hash_speed("sha384", sec, generic_hash_speed_template);
  1342. if (mode > 300 && mode < 400) break;
  1343. case 306:
  1344. test_hash_speed("sha512", sec, generic_hash_speed_template);
  1345. if (mode > 300 && mode < 400) break;
  1346. case 307:
  1347. test_hash_speed("wp256", sec, generic_hash_speed_template);
  1348. if (mode > 300 && mode < 400) break;
  1349. case 308:
  1350. test_hash_speed("wp384", sec, generic_hash_speed_template);
  1351. if (mode > 300 && mode < 400) break;
  1352. case 309:
  1353. test_hash_speed("wp512", sec, generic_hash_speed_template);
  1354. if (mode > 300 && mode < 400) break;
  1355. case 310:
  1356. test_hash_speed("tgr128", sec, generic_hash_speed_template);
  1357. if (mode > 300 && mode < 400) break;
  1358. case 311:
  1359. test_hash_speed("tgr160", sec, generic_hash_speed_template);
  1360. if (mode > 300 && mode < 400) break;
  1361. case 312:
  1362. test_hash_speed("tgr192", sec, generic_hash_speed_template);
  1363. if (mode > 300 && mode < 400) break;
  1364. case 313:
  1365. test_hash_speed("sha224", sec, generic_hash_speed_template);
  1366. if (mode > 300 && mode < 400) break;
  1367. case 314:
  1368. test_hash_speed("rmd128", sec, generic_hash_speed_template);
  1369. if (mode > 300 && mode < 400) break;
  1370. case 315:
  1371. test_hash_speed("rmd160", sec, generic_hash_speed_template);
  1372. if (mode > 300 && mode < 400) break;
  1373. case 316:
  1374. test_hash_speed("rmd256", sec, generic_hash_speed_template);
  1375. if (mode > 300 && mode < 400) break;
  1376. case 317:
  1377. test_hash_speed("rmd320", sec, generic_hash_speed_template);
  1378. if (mode > 300 && mode < 400) break;
  1379. case 318:
  1380. test_hash_speed("ghash-generic", sec, hash_speed_template_16);
  1381. if (mode > 300 && mode < 400) break;
  1382. case 319:
  1383. test_hash_speed("crc32c", sec, generic_hash_speed_template);
  1384. if (mode > 300 && mode < 400) break;
  1385. case 320:
  1386. test_hash_speed("crct10dif", sec, generic_hash_speed_template);
  1387. if (mode > 300 && mode < 400) break;
  1388. case 321:
  1389. test_hash_speed("poly1305", sec, poly1305_speed_template);
  1390. if (mode > 300 && mode < 400) break;
  1391. case 399:
  1392. break;
  1393. case 400:
  1394. if (alg) {
  1395. test_ahash_speed(alg, sec, generic_hash_speed_template);
  1396. break;
  1397. }
  1398. /* fall through */
  1399. case 401:
  1400. test_ahash_speed("md4", sec, generic_hash_speed_template);
  1401. if (mode > 400 && mode < 500) break;
  1402. case 402:
  1403. test_ahash_speed("md5", sec, generic_hash_speed_template);
  1404. if (mode > 400 && mode < 500) break;
  1405. case 403:
  1406. test_ahash_speed("sha1", sec, generic_hash_speed_template);
  1407. if (mode > 400 && mode < 500) break;
  1408. case 404:
  1409. test_ahash_speed("sha256", sec, generic_hash_speed_template);
  1410. if (mode > 400 && mode < 500) break;
  1411. case 405:
  1412. test_ahash_speed("sha384", sec, generic_hash_speed_template);
  1413. if (mode > 400 && mode < 500) break;
  1414. case 406:
  1415. test_ahash_speed("sha512", sec, generic_hash_speed_template);
  1416. if (mode > 400 && mode < 500) break;
  1417. case 407:
  1418. test_ahash_speed("wp256", sec, generic_hash_speed_template);
  1419. if (mode > 400 && mode < 500) break;
  1420. case 408:
  1421. test_ahash_speed("wp384", sec, generic_hash_speed_template);
  1422. if (mode > 400 && mode < 500) break;
  1423. case 409:
  1424. test_ahash_speed("wp512", sec, generic_hash_speed_template);
  1425. if (mode > 400 && mode < 500) break;
  1426. case 410:
  1427. test_ahash_speed("tgr128", sec, generic_hash_speed_template);
  1428. if (mode > 400 && mode < 500) break;
  1429. case 411:
  1430. test_ahash_speed("tgr160", sec, generic_hash_speed_template);
  1431. if (mode > 400 && mode < 500) break;
  1432. case 412:
  1433. test_ahash_speed("tgr192", sec, generic_hash_speed_template);
  1434. if (mode > 400 && mode < 500) break;
  1435. case 413:
  1436. test_ahash_speed("sha224", sec, generic_hash_speed_template);
  1437. if (mode > 400 && mode < 500) break;
  1438. case 414:
  1439. test_ahash_speed("rmd128", sec, generic_hash_speed_template);
  1440. if (mode > 400 && mode < 500) break;
  1441. case 415:
  1442. test_ahash_speed("rmd160", sec, generic_hash_speed_template);
  1443. if (mode > 400 && mode < 500) break;
  1444. case 416:
  1445. test_ahash_speed("rmd256", sec, generic_hash_speed_template);
  1446. if (mode > 400 && mode < 500) break;
  1447. case 417:
  1448. test_ahash_speed("rmd320", sec, generic_hash_speed_template);
  1449. if (mode > 400 && mode < 500) break;
  1450. case 499:
  1451. break;
  1452. case 500:
  1453. test_acipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
  1454. speed_template_16_24_32);
  1455. test_acipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
  1456. speed_template_16_24_32);
  1457. test_acipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
  1458. speed_template_16_24_32);
  1459. test_acipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
  1460. speed_template_16_24_32);
  1461. test_acipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
  1462. speed_template_32_40_48);
  1463. test_acipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
  1464. speed_template_32_40_48);
  1465. test_acipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
  1466. speed_template_32_48_64);
  1467. test_acipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
  1468. speed_template_32_48_64);
  1469. test_acipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
  1470. speed_template_16_24_32);
  1471. test_acipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
  1472. speed_template_16_24_32);
  1473. test_acipher_speed("cfb(aes)", ENCRYPT, sec, NULL, 0,
  1474. speed_template_16_24_32);
  1475. test_acipher_speed("cfb(aes)", DECRYPT, sec, NULL, 0,
  1476. speed_template_16_24_32);
  1477. test_acipher_speed("ofb(aes)", ENCRYPT, sec, NULL, 0,
  1478. speed_template_16_24_32);
  1479. test_acipher_speed("ofb(aes)", DECRYPT, sec, NULL, 0,
  1480. speed_template_16_24_32);
  1481. test_acipher_speed("rfc3686(ctr(aes))", ENCRYPT, sec, NULL, 0,
  1482. speed_template_20_28_36);
  1483. test_acipher_speed("rfc3686(ctr(aes))", DECRYPT, sec, NULL, 0,
  1484. speed_template_20_28_36);
  1485. break;
  1486. case 501:
  1487. test_acipher_speed("ecb(des3_ede)", ENCRYPT, sec,
  1488. des3_speed_template, DES3_SPEED_VECTORS,
  1489. speed_template_24);
  1490. test_acipher_speed("ecb(des3_ede)", DECRYPT, sec,
  1491. des3_speed_template, DES3_SPEED_VECTORS,
  1492. speed_template_24);
  1493. test_acipher_speed("cbc(des3_ede)", ENCRYPT, sec,
  1494. des3_speed_template, DES3_SPEED_VECTORS,
  1495. speed_template_24);
  1496. test_acipher_speed("cbc(des3_ede)", DECRYPT, sec,
  1497. des3_speed_template, DES3_SPEED_VECTORS,
  1498. speed_template_24);
  1499. test_acipher_speed("cfb(des3_ede)", ENCRYPT, sec,
  1500. des3_speed_template, DES3_SPEED_VECTORS,
  1501. speed_template_24);
  1502. test_acipher_speed("cfb(des3_ede)", DECRYPT, sec,
  1503. des3_speed_template, DES3_SPEED_VECTORS,
  1504. speed_template_24);
  1505. test_acipher_speed("ofb(des3_ede)", ENCRYPT, sec,
  1506. des3_speed_template, DES3_SPEED_VECTORS,
  1507. speed_template_24);
  1508. test_acipher_speed("ofb(des3_ede)", DECRYPT, sec,
  1509. des3_speed_template, DES3_SPEED_VECTORS,
  1510. speed_template_24);
  1511. break;
  1512. case 502:
  1513. test_acipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
  1514. speed_template_8);
  1515. test_acipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
  1516. speed_template_8);
  1517. test_acipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
  1518. speed_template_8);
  1519. test_acipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
  1520. speed_template_8);
  1521. test_acipher_speed("cfb(des)", ENCRYPT, sec, NULL, 0,
  1522. speed_template_8);
  1523. test_acipher_speed("cfb(des)", DECRYPT, sec, NULL, 0,
  1524. speed_template_8);
  1525. test_acipher_speed("ofb(des)", ENCRYPT, sec, NULL, 0,
  1526. speed_template_8);
  1527. test_acipher_speed("ofb(des)", DECRYPT, sec, NULL, 0,
  1528. speed_template_8);
  1529. break;
  1530. case 503:
  1531. test_acipher_speed("ecb(serpent)", ENCRYPT, sec, NULL, 0,
  1532. speed_template_16_32);
  1533. test_acipher_speed("ecb(serpent)", DECRYPT, sec, NULL, 0,
  1534. speed_template_16_32);
  1535. test_acipher_speed("cbc(serpent)", ENCRYPT, sec, NULL, 0,
  1536. speed_template_16_32);
  1537. test_acipher_speed("cbc(serpent)", DECRYPT, sec, NULL, 0,
  1538. speed_template_16_32);
  1539. test_acipher_speed("ctr(serpent)", ENCRYPT, sec, NULL, 0,
  1540. speed_template_16_32);
  1541. test_acipher_speed("ctr(serpent)", DECRYPT, sec, NULL, 0,
  1542. speed_template_16_32);
  1543. test_acipher_speed("lrw(serpent)", ENCRYPT, sec, NULL, 0,
  1544. speed_template_32_48);
  1545. test_acipher_speed("lrw(serpent)", DECRYPT, sec, NULL, 0,
  1546. speed_template_32_48);
  1547. test_acipher_speed("xts(serpent)", ENCRYPT, sec, NULL, 0,
  1548. speed_template_32_64);
  1549. test_acipher_speed("xts(serpent)", DECRYPT, sec, NULL, 0,
  1550. speed_template_32_64);
  1551. break;
  1552. case 504:
  1553. test_acipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
  1554. speed_template_16_24_32);
  1555. test_acipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
  1556. speed_template_16_24_32);
  1557. test_acipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
  1558. speed_template_16_24_32);
  1559. test_acipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
  1560. speed_template_16_24_32);
  1561. test_acipher_speed("ctr(twofish)", ENCRYPT, sec, NULL, 0,
  1562. speed_template_16_24_32);
  1563. test_acipher_speed("ctr(twofish)", DECRYPT, sec, NULL, 0,
  1564. speed_template_16_24_32);
  1565. test_acipher_speed("lrw(twofish)", ENCRYPT, sec, NULL, 0,
  1566. speed_template_32_40_48);
  1567. test_acipher_speed("lrw(twofish)", DECRYPT, sec, NULL, 0,
  1568. speed_template_32_40_48);
  1569. test_acipher_speed("xts(twofish)", ENCRYPT, sec, NULL, 0,
  1570. speed_template_32_48_64);
  1571. test_acipher_speed("xts(twofish)", DECRYPT, sec, NULL, 0,
  1572. speed_template_32_48_64);
  1573. break;
  1574. case 505:
  1575. test_acipher_speed("ecb(arc4)", ENCRYPT, sec, NULL, 0,
  1576. speed_template_8);
  1577. break;
  1578. case 506:
  1579. test_acipher_speed("ecb(cast5)", ENCRYPT, sec, NULL, 0,
  1580. speed_template_8_16);
  1581. test_acipher_speed("ecb(cast5)", DECRYPT, sec, NULL, 0,
  1582. speed_template_8_16);
  1583. test_acipher_speed("cbc(cast5)", ENCRYPT, sec, NULL, 0,
  1584. speed_template_8_16);
  1585. test_acipher_speed("cbc(cast5)", DECRYPT, sec, NULL, 0,
  1586. speed_template_8_16);
  1587. test_acipher_speed("ctr(cast5)", ENCRYPT, sec, NULL, 0,
  1588. speed_template_8_16);
  1589. test_acipher_speed("ctr(cast5)", DECRYPT, sec, NULL, 0,
  1590. speed_template_8_16);
  1591. break;
  1592. case 507:
  1593. test_acipher_speed("ecb(cast6)", ENCRYPT, sec, NULL, 0,
  1594. speed_template_16_32);
  1595. test_acipher_speed("ecb(cast6)", DECRYPT, sec, NULL, 0,
  1596. speed_template_16_32);
  1597. test_acipher_speed("cbc(cast6)", ENCRYPT, sec, NULL, 0,
  1598. speed_template_16_32);
  1599. test_acipher_speed("cbc(cast6)", DECRYPT, sec, NULL, 0,
  1600. speed_template_16_32);
  1601. test_acipher_speed("ctr(cast6)", ENCRYPT, sec, NULL, 0,
  1602. speed_template_16_32);
  1603. test_acipher_speed("ctr(cast6)", DECRYPT, sec, NULL, 0,
  1604. speed_template_16_32);
  1605. test_acipher_speed("lrw(cast6)", ENCRYPT, sec, NULL, 0,
  1606. speed_template_32_48);
  1607. test_acipher_speed("lrw(cast6)", DECRYPT, sec, NULL, 0,
  1608. speed_template_32_48);
  1609. test_acipher_speed("xts(cast6)", ENCRYPT, sec, NULL, 0,
  1610. speed_template_32_64);
  1611. test_acipher_speed("xts(cast6)", DECRYPT, sec, NULL, 0,
  1612. speed_template_32_64);
  1613. break;
  1614. case 508:
  1615. test_acipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
  1616. speed_template_16_32);
  1617. test_acipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
  1618. speed_template_16_32);
  1619. test_acipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
  1620. speed_template_16_32);
  1621. test_acipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
  1622. speed_template_16_32);
  1623. test_acipher_speed("ctr(camellia)", ENCRYPT, sec, NULL, 0,
  1624. speed_template_16_32);
  1625. test_acipher_speed("ctr(camellia)", DECRYPT, sec, NULL, 0,
  1626. speed_template_16_32);
  1627. test_acipher_speed("lrw(camellia)", ENCRYPT, sec, NULL, 0,
  1628. speed_template_32_48);
  1629. test_acipher_speed("lrw(camellia)", DECRYPT, sec, NULL, 0,
  1630. speed_template_32_48);
  1631. test_acipher_speed("xts(camellia)", ENCRYPT, sec, NULL, 0,
  1632. speed_template_32_64);
  1633. test_acipher_speed("xts(camellia)", DECRYPT, sec, NULL, 0,
  1634. speed_template_32_64);
  1635. break;
  1636. case 509:
  1637. test_acipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
  1638. speed_template_8_32);
  1639. test_acipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
  1640. speed_template_8_32);
  1641. test_acipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
  1642. speed_template_8_32);
  1643. test_acipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
  1644. speed_template_8_32);
  1645. test_acipher_speed("ctr(blowfish)", ENCRYPT, sec, NULL, 0,
  1646. speed_template_8_32);
  1647. test_acipher_speed("ctr(blowfish)", DECRYPT, sec, NULL, 0,
  1648. speed_template_8_32);
  1649. break;
  1650. case 1000:
  1651. test_available();
  1652. break;
  1653. }
  1654. return ret;
  1655. }
  1656. static int __init tcrypt_mod_init(void)
  1657. {
  1658. int err = -ENOMEM;
  1659. int i;
  1660. for (i = 0; i < TVMEMSIZE; i++) {
  1661. tvmem[i] = (void *)__get_free_page(GFP_KERNEL);
  1662. if (!tvmem[i])
  1663. goto err_free_tv;
  1664. }
  1665. err = do_test(alg, type, mask, mode);
  1666. if (err) {
  1667. printk(KERN_ERR "tcrypt: one or more tests failed!\n");
  1668. goto err_free_tv;
  1669. }
  1670. /* We intentionaly return -EAGAIN to prevent keeping the module,
  1671. * unless we're running in fips mode. It does all its work from
  1672. * init() and doesn't offer any runtime functionality, but in
  1673. * the fips case, checking for a successful load is helpful.
  1674. * => we don't need it in the memory, do we?
  1675. * -- mludvig
  1676. */
  1677. if (!fips_enabled)
  1678. err = -EAGAIN;
  1679. err_free_tv:
  1680. for (i = 0; i < TVMEMSIZE && tvmem[i]; i++)
  1681. free_page((unsigned long)tvmem[i]);
  1682. return err;
  1683. }
  1684. /*
  1685. * If an init function is provided, an exit function must also be provided
  1686. * to allow module unload.
  1687. */
  1688. static void __exit tcrypt_mod_fini(void) { }
  1689. module_init(tcrypt_mod_init);
  1690. module_exit(tcrypt_mod_fini);
  1691. module_param(alg, charp, 0);
  1692. module_param(type, uint, 0);
  1693. module_param(mask, uint, 0);
  1694. module_param(mode, int, 0);
  1695. module_param(sec, uint, 0);
  1696. MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
  1697. "(defaults to zero which uses CPU cycles instead)");
  1698. MODULE_LICENSE("GPL");
  1699. MODULE_DESCRIPTION("Quick & dirty crypto testing module");
  1700. MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");