tcrypt.c 53 KB

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