tcrypt.c 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962
  1. /*
  2. * Quick & dirty crypto testing module.
  3. *
  4. * This will only exist until we have a better testing mechanism
  5. * (e.g. a char device).
  6. *
  7. * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
  8. * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
  9. * Copyright (c) 2007 Nokia Siemens Networks
  10. *
  11. * This program is free software; you can redistribute it and/or modify it
  12. * under the terms of the GNU General Public License as published by the Free
  13. * Software Foundation; either version 2 of the License, or (at your option)
  14. * any later version.
  15. *
  16. */
  17. #include <linux/err.h>
  18. #include <linux/init.h>
  19. #include <linux/module.h>
  20. #include <linux/mm.h>
  21. #include <linux/slab.h>
  22. #include <linux/scatterlist.h>
  23. #include <linux/string.h>
  24. #include <linux/crypto.h>
  25. #include <linux/highmem.h>
  26. #include <linux/moduleparam.h>
  27. #include <linux/jiffies.h>
  28. #include <linux/timex.h>
  29. #include <linux/interrupt.h>
  30. #include "tcrypt.h"
  31. /*
  32. * Need to kmalloc() memory for testing kmap().
  33. */
  34. #define TVMEMSIZE 16384
  35. #define XBUFSIZE 32768
  36. /*
  37. * Indexes into the xbuf to simulate cross-page access.
  38. */
  39. #define IDX1 32
  40. #define IDX2 32400
  41. #define IDX3 1
  42. #define IDX4 8193
  43. #define IDX5 22222
  44. #define IDX6 17101
  45. #define IDX7 27333
  46. #define IDX8 3000
  47. /*
  48. * Used by test_cipher()
  49. */
  50. #define ENCRYPT 1
  51. #define DECRYPT 0
  52. struct tcrypt_result {
  53. struct completion completion;
  54. int err;
  55. };
  56. static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
  57. /*
  58. * Used by test_cipher_speed()
  59. */
  60. static unsigned int sec;
  61. static int mode;
  62. static char *xbuf;
  63. static char *axbuf;
  64. static char *tvmem;
  65. static char *check[] = {
  66. "des", "md5", "des3_ede", "rot13", "sha1", "sha224", "sha256",
  67. "blowfish", "twofish", "serpent", "sha384", "sha512", "md4", "aes",
  68. "cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
  69. "khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
  70. "camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
  71. "lzo", "cts", NULL
  72. };
  73. static void hexdump(unsigned char *buf, unsigned int len)
  74. {
  75. print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
  76. 16, 1,
  77. buf, len, false);
  78. }
  79. static void tcrypt_complete(struct crypto_async_request *req, int err)
  80. {
  81. struct tcrypt_result *res = req->data;
  82. if (err == -EINPROGRESS)
  83. return;
  84. res->err = err;
  85. complete(&res->completion);
  86. }
  87. static void test_hash(char *algo, struct hash_testvec *template,
  88. unsigned int tcount)
  89. {
  90. unsigned int i, j, k, temp;
  91. struct scatterlist sg[8];
  92. char result[64];
  93. struct crypto_ahash *tfm;
  94. struct ahash_request *req;
  95. struct tcrypt_result tresult;
  96. int ret;
  97. void *hash_buff;
  98. printk("\ntesting %s\n", algo);
  99. init_completion(&tresult.completion);
  100. tfm = crypto_alloc_ahash(algo, 0, 0);
  101. if (IS_ERR(tfm)) {
  102. printk("failed to load transform for %s: %ld\n", algo,
  103. PTR_ERR(tfm));
  104. return;
  105. }
  106. req = ahash_request_alloc(tfm, GFP_KERNEL);
  107. if (!req) {
  108. printk(KERN_ERR "failed to allocate request for %s\n", algo);
  109. goto out_noreq;
  110. }
  111. ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
  112. tcrypt_complete, &tresult);
  113. for (i = 0; i < tcount; i++) {
  114. printk("test %u:\n", i + 1);
  115. memset(result, 0, 64);
  116. hash_buff = kzalloc(template[i].psize, GFP_KERNEL);
  117. if (!hash_buff)
  118. continue;
  119. memcpy(hash_buff, template[i].plaintext, template[i].psize);
  120. sg_init_one(&sg[0], hash_buff, template[i].psize);
  121. if (template[i].ksize) {
  122. crypto_ahash_clear_flags(tfm, ~0);
  123. ret = crypto_ahash_setkey(tfm, template[i].key,
  124. template[i].ksize);
  125. if (ret) {
  126. printk("setkey() failed ret=%d\n", ret);
  127. kfree(hash_buff);
  128. goto out;
  129. }
  130. }
  131. ahash_request_set_crypt(req, sg, result, template[i].psize);
  132. ret = crypto_ahash_digest(req);
  133. switch (ret) {
  134. case 0:
  135. break;
  136. case -EINPROGRESS:
  137. case -EBUSY:
  138. ret = wait_for_completion_interruptible(
  139. &tresult.completion);
  140. if (!ret && !(ret = tresult.err)) {
  141. INIT_COMPLETION(tresult.completion);
  142. break;
  143. }
  144. /* fall through */
  145. default:
  146. printk("digest () failed ret=%d\n", ret);
  147. kfree(hash_buff);
  148. goto out;
  149. }
  150. hexdump(result, crypto_ahash_digestsize(tfm));
  151. printk("%s\n",
  152. memcmp(result, template[i].digest,
  153. crypto_ahash_digestsize(tfm)) ?
  154. "fail" : "pass");
  155. kfree(hash_buff);
  156. }
  157. printk("testing %s across pages\n", algo);
  158. /* setup the dummy buffer first */
  159. memset(xbuf, 0, XBUFSIZE);
  160. j = 0;
  161. for (i = 0; i < tcount; i++) {
  162. if (template[i].np) {
  163. j++;
  164. printk("test %u:\n", j);
  165. memset(result, 0, 64);
  166. temp = 0;
  167. sg_init_table(sg, template[i].np);
  168. for (k = 0; k < template[i].np; k++) {
  169. memcpy(&xbuf[IDX[k]],
  170. template[i].plaintext + temp,
  171. template[i].tap[k]);
  172. temp += template[i].tap[k];
  173. sg_set_buf(&sg[k], &xbuf[IDX[k]],
  174. template[i].tap[k]);
  175. }
  176. if (template[i].ksize) {
  177. crypto_ahash_clear_flags(tfm, ~0);
  178. ret = crypto_ahash_setkey(tfm, template[i].key,
  179. template[i].ksize);
  180. if (ret) {
  181. printk("setkey() failed ret=%d\n", ret);
  182. goto out;
  183. }
  184. }
  185. ahash_request_set_crypt(req, sg, result,
  186. template[i].psize);
  187. ret = crypto_ahash_digest(req);
  188. switch (ret) {
  189. case 0:
  190. break;
  191. case -EINPROGRESS:
  192. case -EBUSY:
  193. ret = wait_for_completion_interruptible(
  194. &tresult.completion);
  195. if (!ret && !(ret = tresult.err)) {
  196. INIT_COMPLETION(tresult.completion);
  197. break;
  198. }
  199. /* fall through */
  200. default:
  201. printk("digest () failed ret=%d\n", ret);
  202. goto out;
  203. }
  204. hexdump(result, crypto_ahash_digestsize(tfm));
  205. printk("%s\n",
  206. memcmp(result, template[i].digest,
  207. crypto_ahash_digestsize(tfm)) ?
  208. "fail" : "pass");
  209. }
  210. }
  211. out:
  212. ahash_request_free(req);
  213. out_noreq:
  214. crypto_free_ahash(tfm);
  215. }
  216. static void test_aead(char *algo, int enc, struct aead_testvec *template,
  217. unsigned int tcount)
  218. {
  219. unsigned int ret, i, j, k, n, temp;
  220. char *q;
  221. struct crypto_aead *tfm;
  222. char *key;
  223. struct aead_request *req;
  224. struct scatterlist sg[8];
  225. struct scatterlist asg[8];
  226. const char *e;
  227. struct tcrypt_result result;
  228. unsigned int authsize;
  229. void *input;
  230. void *assoc;
  231. char iv[MAX_IVLEN];
  232. if (enc == ENCRYPT)
  233. e = "encryption";
  234. else
  235. e = "decryption";
  236. printk(KERN_INFO "\ntesting %s %s\n", algo, e);
  237. init_completion(&result.completion);
  238. tfm = crypto_alloc_aead(algo, 0, 0);
  239. if (IS_ERR(tfm)) {
  240. printk(KERN_INFO "failed to load transform for %s: %ld\n",
  241. algo, PTR_ERR(tfm));
  242. return;
  243. }
  244. req = aead_request_alloc(tfm, GFP_KERNEL);
  245. if (!req) {
  246. printk(KERN_INFO "failed to allocate request for %s\n", algo);
  247. goto out;
  248. }
  249. aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
  250. tcrypt_complete, &result);
  251. for (i = 0, j = 0; i < tcount; i++) {
  252. if (!template[i].np) {
  253. printk(KERN_INFO "test %u (%d bit key):\n",
  254. ++j, template[i].klen * 8);
  255. /* some tepmplates have no input data but they will
  256. * touch input
  257. */
  258. input = kzalloc(template[i].ilen + template[i].rlen, GFP_KERNEL);
  259. if (!input)
  260. continue;
  261. assoc = kzalloc(template[i].alen, GFP_KERNEL);
  262. if (!assoc) {
  263. kfree(input);
  264. continue;
  265. }
  266. memcpy(input, template[i].input, template[i].ilen);
  267. memcpy(assoc, template[i].assoc, template[i].alen);
  268. if (template[i].iv)
  269. memcpy(iv, template[i].iv, MAX_IVLEN);
  270. else
  271. memset(iv, 0, MAX_IVLEN);
  272. crypto_aead_clear_flags(tfm, ~0);
  273. if (template[i].wk)
  274. crypto_aead_set_flags(
  275. tfm, CRYPTO_TFM_REQ_WEAK_KEY);
  276. if (template[i].key)
  277. key = template[i].key;
  278. else
  279. key = kzalloc(template[i].klen, GFP_KERNEL);
  280. ret = crypto_aead_setkey(tfm, key,
  281. template[i].klen);
  282. if (ret) {
  283. printk(KERN_INFO "setkey() failed flags=%x\n",
  284. crypto_aead_get_flags(tfm));
  285. if (!template[i].fail)
  286. goto next_one;
  287. }
  288. authsize = abs(template[i].rlen - template[i].ilen);
  289. ret = crypto_aead_setauthsize(tfm, authsize);
  290. if (ret) {
  291. printk(KERN_INFO
  292. "failed to set authsize = %u\n",
  293. authsize);
  294. goto next_one;
  295. }
  296. sg_init_one(&sg[0], input,
  297. template[i].ilen + (enc ? authsize : 0));
  298. sg_init_one(&asg[0], assoc, template[i].alen);
  299. aead_request_set_crypt(req, sg, sg,
  300. template[i].ilen, iv);
  301. aead_request_set_assoc(req, asg, template[i].alen);
  302. ret = enc ?
  303. crypto_aead_encrypt(req) :
  304. crypto_aead_decrypt(req);
  305. switch (ret) {
  306. case 0:
  307. break;
  308. case -EINPROGRESS:
  309. case -EBUSY:
  310. ret = wait_for_completion_interruptible(
  311. &result.completion);
  312. if (!ret && !(ret = result.err)) {
  313. INIT_COMPLETION(result.completion);
  314. break;
  315. }
  316. /* fall through */
  317. default:
  318. printk(KERN_INFO "%s () failed err=%d\n",
  319. e, -ret);
  320. goto next_one;
  321. }
  322. q = kmap(sg_page(&sg[0])) + sg[0].offset;
  323. hexdump(q, template[i].rlen);
  324. printk(KERN_INFO "enc/dec: %s\n",
  325. memcmp(q, template[i].result,
  326. template[i].rlen) ? "fail" : "pass");
  327. kunmap(sg_page(&sg[0]));
  328. next_one:
  329. if (!template[i].key)
  330. kfree(key);
  331. kfree(assoc);
  332. kfree(input);
  333. }
  334. }
  335. printk(KERN_INFO "\ntesting %s %s across pages (chunking)\n", algo, e);
  336. memset(axbuf, 0, XBUFSIZE);
  337. for (i = 0, j = 0; i < tcount; i++) {
  338. if (template[i].np) {
  339. printk(KERN_INFO "test %u (%d bit key):\n",
  340. ++j, template[i].klen * 8);
  341. if (template[i].iv)
  342. memcpy(iv, template[i].iv, MAX_IVLEN);
  343. else
  344. memset(iv, 0, MAX_IVLEN);
  345. crypto_aead_clear_flags(tfm, ~0);
  346. if (template[i].wk)
  347. crypto_aead_set_flags(
  348. tfm, CRYPTO_TFM_REQ_WEAK_KEY);
  349. key = template[i].key;
  350. ret = crypto_aead_setkey(tfm, key, template[i].klen);
  351. if (ret) {
  352. printk(KERN_INFO "setkey() failed flags=%x\n",
  353. crypto_aead_get_flags(tfm));
  354. if (!template[i].fail)
  355. goto out;
  356. }
  357. memset(xbuf, 0, XBUFSIZE);
  358. sg_init_table(sg, template[i].np);
  359. for (k = 0, temp = 0; k < template[i].np; k++) {
  360. memcpy(&xbuf[IDX[k]],
  361. template[i].input + temp,
  362. template[i].tap[k]);
  363. temp += template[i].tap[k];
  364. sg_set_buf(&sg[k], &xbuf[IDX[k]],
  365. template[i].tap[k]);
  366. }
  367. authsize = abs(template[i].rlen - template[i].ilen);
  368. ret = crypto_aead_setauthsize(tfm, authsize);
  369. if (ret) {
  370. printk(KERN_INFO
  371. "failed to set authsize = %u\n",
  372. authsize);
  373. goto out;
  374. }
  375. if (enc)
  376. sg[k - 1].length += authsize;
  377. sg_init_table(asg, template[i].anp);
  378. for (k = 0, temp = 0; k < template[i].anp; k++) {
  379. memcpy(&axbuf[IDX[k]],
  380. template[i].assoc + temp,
  381. template[i].atap[k]);
  382. temp += template[i].atap[k];
  383. sg_set_buf(&asg[k], &axbuf[IDX[k]],
  384. template[i].atap[k]);
  385. }
  386. aead_request_set_crypt(req, sg, sg,
  387. template[i].ilen,
  388. iv);
  389. aead_request_set_assoc(req, asg, template[i].alen);
  390. ret = enc ?
  391. crypto_aead_encrypt(req) :
  392. crypto_aead_decrypt(req);
  393. switch (ret) {
  394. case 0:
  395. break;
  396. case -EINPROGRESS:
  397. case -EBUSY:
  398. ret = wait_for_completion_interruptible(
  399. &result.completion);
  400. if (!ret && !(ret = result.err)) {
  401. INIT_COMPLETION(result.completion);
  402. break;
  403. }
  404. /* fall through */
  405. default:
  406. printk(KERN_INFO "%s () failed err=%d\n",
  407. e, -ret);
  408. goto out;
  409. }
  410. for (k = 0, temp = 0; k < template[i].np; k++) {
  411. printk(KERN_INFO "page %u\n", k);
  412. q = kmap(sg_page(&sg[k])) + sg[k].offset;
  413. hexdump(q, template[i].tap[k]);
  414. printk(KERN_INFO "%s\n",
  415. memcmp(q, template[i].result + temp,
  416. template[i].tap[k] -
  417. (k < template[i].np - 1 || enc ?
  418. 0 : authsize)) ?
  419. "fail" : "pass");
  420. for (n = 0; q[template[i].tap[k] + n]; n++)
  421. ;
  422. if (n) {
  423. printk("Result buffer corruption %u "
  424. "bytes:\n", n);
  425. hexdump(&q[template[i].tap[k]], n);
  426. }
  427. temp += template[i].tap[k];
  428. kunmap(sg_page(&sg[k]));
  429. }
  430. }
  431. }
  432. out:
  433. crypto_free_aead(tfm);
  434. aead_request_free(req);
  435. }
  436. static void test_cipher(char *algo, int enc,
  437. struct cipher_testvec *template, unsigned int tcount)
  438. {
  439. unsigned int ret, i, j, k, n, temp;
  440. char *q;
  441. struct crypto_ablkcipher *tfm;
  442. struct ablkcipher_request *req;
  443. struct scatterlist sg[8];
  444. const char *e;
  445. struct tcrypt_result result;
  446. void *data;
  447. char iv[MAX_IVLEN];
  448. if (enc == ENCRYPT)
  449. e = "encryption";
  450. else
  451. e = "decryption";
  452. printk("\ntesting %s %s\n", algo, e);
  453. init_completion(&result.completion);
  454. tfm = crypto_alloc_ablkcipher(algo, 0, 0);
  455. if (IS_ERR(tfm)) {
  456. printk("failed to load transform for %s: %ld\n", algo,
  457. PTR_ERR(tfm));
  458. return;
  459. }
  460. req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
  461. if (!req) {
  462. printk("failed to allocate request for %s\n", algo);
  463. goto out;
  464. }
  465. ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
  466. tcrypt_complete, &result);
  467. j = 0;
  468. for (i = 0; i < tcount; i++) {
  469. data = kzalloc(template[i].ilen, GFP_KERNEL);
  470. if (!data)
  471. continue;
  472. memcpy(data, template[i].input, template[i].ilen);
  473. if (template[i].iv)
  474. memcpy(iv, template[i].iv, MAX_IVLEN);
  475. else
  476. memset(iv, 0, MAX_IVLEN);
  477. if (!(template[i].np)) {
  478. j++;
  479. printk("test %u (%d bit key):\n",
  480. j, template[i].klen * 8);
  481. crypto_ablkcipher_clear_flags(tfm, ~0);
  482. if (template[i].wk)
  483. crypto_ablkcipher_set_flags(
  484. tfm, CRYPTO_TFM_REQ_WEAK_KEY);
  485. ret = crypto_ablkcipher_setkey(tfm, template[i].key,
  486. template[i].klen);
  487. if (ret) {
  488. printk("setkey() failed flags=%x\n",
  489. crypto_ablkcipher_get_flags(tfm));
  490. if (!template[i].fail) {
  491. kfree(data);
  492. goto out;
  493. }
  494. }
  495. sg_init_one(&sg[0], data, template[i].ilen);
  496. ablkcipher_request_set_crypt(req, sg, sg,
  497. template[i].ilen, iv);
  498. ret = enc ?
  499. crypto_ablkcipher_encrypt(req) :
  500. crypto_ablkcipher_decrypt(req);
  501. switch (ret) {
  502. case 0:
  503. break;
  504. case -EINPROGRESS:
  505. case -EBUSY:
  506. ret = wait_for_completion_interruptible(
  507. &result.completion);
  508. if (!ret && !((ret = result.err))) {
  509. INIT_COMPLETION(result.completion);
  510. break;
  511. }
  512. /* fall through */
  513. default:
  514. printk("%s () failed err=%d\n", e, -ret);
  515. kfree(data);
  516. goto out;
  517. }
  518. q = kmap(sg_page(&sg[0])) + sg[0].offset;
  519. hexdump(q, template[i].rlen);
  520. printk("%s\n",
  521. memcmp(q, template[i].result,
  522. template[i].rlen) ? "fail" : "pass");
  523. kunmap(sg_page(&sg[0]));
  524. }
  525. kfree(data);
  526. }
  527. printk("\ntesting %s %s across pages (chunking)\n", algo, e);
  528. j = 0;
  529. for (i = 0; i < tcount; i++) {
  530. if (template[i].iv)
  531. memcpy(iv, template[i].iv, MAX_IVLEN);
  532. else
  533. memset(iv, 0, MAX_IVLEN);
  534. if (template[i].np) {
  535. j++;
  536. printk("test %u (%d bit key):\n",
  537. j, template[i].klen * 8);
  538. memset(xbuf, 0, XBUFSIZE);
  539. crypto_ablkcipher_clear_flags(tfm, ~0);
  540. if (template[i].wk)
  541. crypto_ablkcipher_set_flags(
  542. tfm, CRYPTO_TFM_REQ_WEAK_KEY);
  543. ret = crypto_ablkcipher_setkey(tfm, template[i].key,
  544. template[i].klen);
  545. if (ret) {
  546. printk("setkey() failed flags=%x\n",
  547. crypto_ablkcipher_get_flags(tfm));
  548. if (!template[i].fail)
  549. goto out;
  550. }
  551. temp = 0;
  552. sg_init_table(sg, template[i].np);
  553. for (k = 0; k < template[i].np; k++) {
  554. memcpy(&xbuf[IDX[k]],
  555. template[i].input + temp,
  556. template[i].tap[k]);
  557. temp += template[i].tap[k];
  558. sg_set_buf(&sg[k], &xbuf[IDX[k]],
  559. template[i].tap[k]);
  560. }
  561. ablkcipher_request_set_crypt(req, sg, sg,
  562. template[i].ilen, iv);
  563. ret = enc ?
  564. crypto_ablkcipher_encrypt(req) :
  565. crypto_ablkcipher_decrypt(req);
  566. switch (ret) {
  567. case 0:
  568. break;
  569. case -EINPROGRESS:
  570. case -EBUSY:
  571. ret = wait_for_completion_interruptible(
  572. &result.completion);
  573. if (!ret && !((ret = result.err))) {
  574. INIT_COMPLETION(result.completion);
  575. break;
  576. }
  577. /* fall through */
  578. default:
  579. printk("%s () failed err=%d\n", e, -ret);
  580. goto out;
  581. }
  582. temp = 0;
  583. for (k = 0; k < template[i].np; k++) {
  584. printk("page %u\n", k);
  585. q = kmap(sg_page(&sg[k])) + sg[k].offset;
  586. hexdump(q, template[i].tap[k]);
  587. printk("%s\n",
  588. memcmp(q, template[i].result + temp,
  589. template[i].tap[k]) ? "fail" :
  590. "pass");
  591. for (n = 0; q[template[i].tap[k] + n]; n++)
  592. ;
  593. if (n) {
  594. printk("Result buffer corruption %u "
  595. "bytes:\n", n);
  596. hexdump(&q[template[i].tap[k]], n);
  597. }
  598. temp += template[i].tap[k];
  599. kunmap(sg_page(&sg[k]));
  600. }
  601. }
  602. }
  603. out:
  604. crypto_free_ablkcipher(tfm);
  605. ablkcipher_request_free(req);
  606. }
  607. static int test_cipher_jiffies(struct blkcipher_desc *desc, int enc, char *p,
  608. int blen, int sec)
  609. {
  610. struct scatterlist sg[1];
  611. unsigned long start, end;
  612. int bcount;
  613. int ret;
  614. sg_init_one(sg, p, blen);
  615. for (start = jiffies, end = start + sec * HZ, bcount = 0;
  616. time_before(jiffies, end); bcount++) {
  617. if (enc)
  618. ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
  619. else
  620. ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
  621. if (ret)
  622. return ret;
  623. }
  624. printk("%d operations in %d seconds (%ld bytes)\n",
  625. bcount, sec, (long)bcount * blen);
  626. return 0;
  627. }
  628. static int test_cipher_cycles(struct blkcipher_desc *desc, int enc, char *p,
  629. int blen)
  630. {
  631. struct scatterlist sg[1];
  632. unsigned long cycles = 0;
  633. int ret = 0;
  634. int i;
  635. sg_init_one(sg, p, blen);
  636. local_bh_disable();
  637. local_irq_disable();
  638. /* Warm-up run. */
  639. for (i = 0; i < 4; i++) {
  640. if (enc)
  641. ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
  642. else
  643. ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
  644. if (ret)
  645. goto out;
  646. }
  647. /* The real thing. */
  648. for (i = 0; i < 8; i++) {
  649. cycles_t start, end;
  650. start = get_cycles();
  651. if (enc)
  652. ret = crypto_blkcipher_encrypt(desc, sg, sg, blen);
  653. else
  654. ret = crypto_blkcipher_decrypt(desc, sg, sg, blen);
  655. end = get_cycles();
  656. if (ret)
  657. goto out;
  658. cycles += end - start;
  659. }
  660. out:
  661. local_irq_enable();
  662. local_bh_enable();
  663. if (ret == 0)
  664. printk("1 operation in %lu cycles (%d bytes)\n",
  665. (cycles + 4) / 8, blen);
  666. return ret;
  667. }
  668. static u32 block_sizes[] = { 16, 64, 256, 1024, 8192, 0 };
  669. static void test_cipher_speed(char *algo, int enc, unsigned int sec,
  670. struct cipher_testvec *template,
  671. unsigned int tcount, u8 *keysize)
  672. {
  673. unsigned int ret, i, j, iv_len;
  674. unsigned char *key, *p, iv[128];
  675. struct crypto_blkcipher *tfm;
  676. struct blkcipher_desc desc;
  677. const char *e;
  678. u32 *b_size;
  679. if (enc == ENCRYPT)
  680. e = "encryption";
  681. else
  682. e = "decryption";
  683. printk("\ntesting speed of %s %s\n", algo, e);
  684. tfm = crypto_alloc_blkcipher(algo, 0, CRYPTO_ALG_ASYNC);
  685. if (IS_ERR(tfm)) {
  686. printk("failed to load transform for %s: %ld\n", algo,
  687. PTR_ERR(tfm));
  688. return;
  689. }
  690. desc.tfm = tfm;
  691. desc.flags = 0;
  692. i = 0;
  693. do {
  694. b_size = block_sizes;
  695. do {
  696. if ((*keysize + *b_size) > TVMEMSIZE) {
  697. printk("template (%u) too big for tvmem (%u)\n",
  698. *keysize + *b_size, TVMEMSIZE);
  699. goto out;
  700. }
  701. printk("test %u (%d bit key, %d byte blocks): ", i,
  702. *keysize * 8, *b_size);
  703. memset(tvmem, 0xff, *keysize + *b_size);
  704. /* set key, plain text and IV */
  705. key = (unsigned char *)tvmem;
  706. for (j = 0; j < tcount; j++) {
  707. if (template[j].klen == *keysize) {
  708. key = template[j].key;
  709. break;
  710. }
  711. }
  712. p = (unsigned char *)tvmem + *keysize;
  713. ret = crypto_blkcipher_setkey(tfm, key, *keysize);
  714. if (ret) {
  715. printk("setkey() failed flags=%x\n",
  716. crypto_blkcipher_get_flags(tfm));
  717. goto out;
  718. }
  719. iv_len = crypto_blkcipher_ivsize(tfm);
  720. if (iv_len) {
  721. memset(&iv, 0xff, iv_len);
  722. crypto_blkcipher_set_iv(tfm, iv, iv_len);
  723. }
  724. if (sec)
  725. ret = test_cipher_jiffies(&desc, enc, p, *b_size, sec);
  726. else
  727. ret = test_cipher_cycles(&desc, enc, p, *b_size);
  728. if (ret) {
  729. printk("%s() failed flags=%x\n", e, desc.flags);
  730. break;
  731. }
  732. b_size++;
  733. i++;
  734. } while (*b_size);
  735. keysize++;
  736. } while (*keysize);
  737. out:
  738. crypto_free_blkcipher(tfm);
  739. }
  740. static int test_hash_jiffies_digest(struct hash_desc *desc, char *p, int blen,
  741. char *out, int sec)
  742. {
  743. struct scatterlist sg[1];
  744. unsigned long start, end;
  745. int bcount;
  746. int ret;
  747. sg_init_table(sg, 1);
  748. for (start = jiffies, end = start + sec * HZ, bcount = 0;
  749. time_before(jiffies, end); bcount++) {
  750. sg_set_buf(sg, p, blen);
  751. ret = crypto_hash_digest(desc, sg, blen, out);
  752. if (ret)
  753. return ret;
  754. }
  755. printk("%6u opers/sec, %9lu bytes/sec\n",
  756. bcount / sec, ((long)bcount * blen) / sec);
  757. return 0;
  758. }
  759. static int test_hash_jiffies(struct hash_desc *desc, char *p, int blen,
  760. int plen, char *out, int sec)
  761. {
  762. struct scatterlist sg[1];
  763. unsigned long start, end;
  764. int bcount, pcount;
  765. int ret;
  766. if (plen == blen)
  767. return test_hash_jiffies_digest(desc, p, blen, out, sec);
  768. sg_init_table(sg, 1);
  769. for (start = jiffies, end = start + sec * HZ, bcount = 0;
  770. time_before(jiffies, end); bcount++) {
  771. ret = crypto_hash_init(desc);
  772. if (ret)
  773. return ret;
  774. for (pcount = 0; pcount < blen; pcount += plen) {
  775. sg_set_buf(sg, p + pcount, plen);
  776. ret = crypto_hash_update(desc, sg, plen);
  777. if (ret)
  778. return ret;
  779. }
  780. /* we assume there is enough space in 'out' for the result */
  781. ret = crypto_hash_final(desc, out);
  782. if (ret)
  783. return ret;
  784. }
  785. printk("%6u opers/sec, %9lu bytes/sec\n",
  786. bcount / sec, ((long)bcount * blen) / sec);
  787. return 0;
  788. }
  789. static int test_hash_cycles_digest(struct hash_desc *desc, char *p, int blen,
  790. char *out)
  791. {
  792. struct scatterlist sg[1];
  793. unsigned long cycles = 0;
  794. int i;
  795. int ret;
  796. sg_init_table(sg, 1);
  797. local_bh_disable();
  798. local_irq_disable();
  799. /* Warm-up run. */
  800. for (i = 0; i < 4; i++) {
  801. sg_set_buf(sg, p, blen);
  802. ret = crypto_hash_digest(desc, sg, blen, out);
  803. if (ret)
  804. goto out;
  805. }
  806. /* The real thing. */
  807. for (i = 0; i < 8; i++) {
  808. cycles_t start, end;
  809. start = get_cycles();
  810. sg_set_buf(sg, p, blen);
  811. ret = crypto_hash_digest(desc, sg, blen, out);
  812. if (ret)
  813. goto out;
  814. end = get_cycles();
  815. cycles += end - start;
  816. }
  817. out:
  818. local_irq_enable();
  819. local_bh_enable();
  820. if (ret)
  821. return ret;
  822. printk("%6lu cycles/operation, %4lu cycles/byte\n",
  823. cycles / 8, cycles / (8 * blen));
  824. return 0;
  825. }
  826. static int test_hash_cycles(struct hash_desc *desc, char *p, int blen,
  827. int plen, char *out)
  828. {
  829. struct scatterlist sg[1];
  830. unsigned long cycles = 0;
  831. int i, pcount;
  832. int ret;
  833. if (plen == blen)
  834. return test_hash_cycles_digest(desc, p, blen, out);
  835. sg_init_table(sg, 1);
  836. local_bh_disable();
  837. local_irq_disable();
  838. /* Warm-up run. */
  839. for (i = 0; i < 4; i++) {
  840. ret = crypto_hash_init(desc);
  841. if (ret)
  842. goto out;
  843. for (pcount = 0; pcount < blen; pcount += plen) {
  844. sg_set_buf(sg, p + pcount, plen);
  845. ret = crypto_hash_update(desc, sg, plen);
  846. if (ret)
  847. goto out;
  848. }
  849. ret = crypto_hash_final(desc, out);
  850. if (ret)
  851. goto out;
  852. }
  853. /* The real thing. */
  854. for (i = 0; i < 8; i++) {
  855. cycles_t start, end;
  856. start = get_cycles();
  857. ret = crypto_hash_init(desc);
  858. if (ret)
  859. goto out;
  860. for (pcount = 0; pcount < blen; pcount += plen) {
  861. sg_set_buf(sg, p + pcount, plen);
  862. ret = crypto_hash_update(desc, sg, plen);
  863. if (ret)
  864. goto out;
  865. }
  866. ret = crypto_hash_final(desc, out);
  867. if (ret)
  868. goto out;
  869. end = get_cycles();
  870. cycles += end - start;
  871. }
  872. out:
  873. local_irq_enable();
  874. local_bh_enable();
  875. if (ret)
  876. return ret;
  877. printk("%6lu cycles/operation, %4lu cycles/byte\n",
  878. cycles / 8, cycles / (8 * blen));
  879. return 0;
  880. }
  881. static void test_hash_speed(char *algo, unsigned int sec,
  882. struct hash_speed *speed)
  883. {
  884. struct crypto_hash *tfm;
  885. struct hash_desc desc;
  886. char output[1024];
  887. int i;
  888. int ret;
  889. printk("\ntesting speed of %s\n", algo);
  890. tfm = crypto_alloc_hash(algo, 0, CRYPTO_ALG_ASYNC);
  891. if (IS_ERR(tfm)) {
  892. printk("failed to load transform for %s: %ld\n", algo,
  893. PTR_ERR(tfm));
  894. return;
  895. }
  896. desc.tfm = tfm;
  897. desc.flags = 0;
  898. if (crypto_hash_digestsize(tfm) > sizeof(output)) {
  899. printk("digestsize(%u) > outputbuffer(%zu)\n",
  900. crypto_hash_digestsize(tfm), sizeof(output));
  901. goto out;
  902. }
  903. for (i = 0; speed[i].blen != 0; i++) {
  904. if (speed[i].blen > TVMEMSIZE) {
  905. printk("template (%u) too big for tvmem (%u)\n",
  906. speed[i].blen, TVMEMSIZE);
  907. goto out;
  908. }
  909. printk("test%3u (%5u byte blocks,%5u bytes per update,%4u updates): ",
  910. i, speed[i].blen, speed[i].plen, speed[i].blen / speed[i].plen);
  911. memset(tvmem, 0xff, speed[i].blen);
  912. if (sec)
  913. ret = test_hash_jiffies(&desc, tvmem, speed[i].blen,
  914. speed[i].plen, output, sec);
  915. else
  916. ret = test_hash_cycles(&desc, tvmem, speed[i].blen,
  917. speed[i].plen, output);
  918. if (ret) {
  919. printk("hashing failed ret=%d\n", ret);
  920. break;
  921. }
  922. }
  923. out:
  924. crypto_free_hash(tfm);
  925. }
  926. static void test_comp(char *algo, struct comp_testvec *ctemplate,
  927. struct comp_testvec *dtemplate, int ctcount, int dtcount)
  928. {
  929. unsigned int i;
  930. char result[COMP_BUF_SIZE];
  931. struct crypto_comp *tfm;
  932. unsigned int tsize;
  933. printk("\ntesting %s compression\n", algo);
  934. tfm = crypto_alloc_comp(algo, 0, CRYPTO_ALG_ASYNC);
  935. if (IS_ERR(tfm)) {
  936. printk("failed to load transform for %s\n", algo);
  937. return;
  938. }
  939. for (i = 0; i < ctcount; i++) {
  940. int ilen, ret, dlen = COMP_BUF_SIZE;
  941. printk("test %u:\n", i + 1);
  942. memset(result, 0, sizeof (result));
  943. ilen = ctemplate[i].inlen;
  944. ret = crypto_comp_compress(tfm, ctemplate[i].input,
  945. ilen, result, &dlen);
  946. if (ret) {
  947. printk("fail: ret=%d\n", ret);
  948. continue;
  949. }
  950. hexdump(result, dlen);
  951. printk("%s (ratio %d:%d)\n",
  952. memcmp(result, ctemplate[i].output, dlen) ? "fail" : "pass",
  953. ilen, dlen);
  954. }
  955. printk("\ntesting %s decompression\n", algo);
  956. tsize = sizeof(struct comp_testvec);
  957. tsize *= dtcount;
  958. if (tsize > TVMEMSIZE) {
  959. printk("template (%u) too big for tvmem (%u)\n", tsize,
  960. TVMEMSIZE);
  961. goto out;
  962. }
  963. for (i = 0; i < dtcount; i++) {
  964. int ilen, ret, dlen = COMP_BUF_SIZE;
  965. printk("test %u:\n", i + 1);
  966. memset(result, 0, sizeof (result));
  967. ilen = dtemplate[i].inlen;
  968. ret = crypto_comp_decompress(tfm, dtemplate[i].input,
  969. ilen, result, &dlen);
  970. if (ret) {
  971. printk("fail: ret=%d\n", ret);
  972. continue;
  973. }
  974. hexdump(result, dlen);
  975. printk("%s (ratio %d:%d)\n",
  976. memcmp(result, dtemplate[i].output, dlen) ? "fail" : "pass",
  977. ilen, dlen);
  978. }
  979. out:
  980. crypto_free_comp(tfm);
  981. }
  982. static void test_available(void)
  983. {
  984. char **name = check;
  985. while (*name) {
  986. printk("alg %s ", *name);
  987. printk(crypto_has_alg(*name, 0, 0) ?
  988. "found\n" : "not found\n");
  989. name++;
  990. }
  991. }
  992. static void do_test(void)
  993. {
  994. switch (mode) {
  995. case 0:
  996. test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
  997. test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
  998. //DES
  999. test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
  1000. DES_ENC_TEST_VECTORS);
  1001. test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
  1002. DES_DEC_TEST_VECTORS);
  1003. test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
  1004. DES_CBC_ENC_TEST_VECTORS);
  1005. test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
  1006. DES_CBC_DEC_TEST_VECTORS);
  1007. //DES3_EDE
  1008. test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
  1009. DES3_EDE_ENC_TEST_VECTORS);
  1010. test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
  1011. DES3_EDE_DEC_TEST_VECTORS);
  1012. test_cipher("cbc(des3_ede)", ENCRYPT,
  1013. des3_ede_cbc_enc_tv_template,
  1014. DES3_EDE_CBC_ENC_TEST_VECTORS);
  1015. test_cipher("cbc(des3_ede)", DECRYPT,
  1016. des3_ede_cbc_dec_tv_template,
  1017. DES3_EDE_CBC_DEC_TEST_VECTORS);
  1018. test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
  1019. test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);
  1020. test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
  1021. //BLOWFISH
  1022. test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
  1023. BF_ENC_TEST_VECTORS);
  1024. test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
  1025. BF_DEC_TEST_VECTORS);
  1026. test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
  1027. BF_CBC_ENC_TEST_VECTORS);
  1028. test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
  1029. BF_CBC_DEC_TEST_VECTORS);
  1030. //TWOFISH
  1031. test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
  1032. TF_ENC_TEST_VECTORS);
  1033. test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
  1034. TF_DEC_TEST_VECTORS);
  1035. test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
  1036. TF_CBC_ENC_TEST_VECTORS);
  1037. test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
  1038. TF_CBC_DEC_TEST_VECTORS);
  1039. //SERPENT
  1040. test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
  1041. SERPENT_ENC_TEST_VECTORS);
  1042. test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
  1043. SERPENT_DEC_TEST_VECTORS);
  1044. //TNEPRES
  1045. test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
  1046. TNEPRES_ENC_TEST_VECTORS);
  1047. test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
  1048. TNEPRES_DEC_TEST_VECTORS);
  1049. //AES
  1050. test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
  1051. AES_ENC_TEST_VECTORS);
  1052. test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
  1053. AES_DEC_TEST_VECTORS);
  1054. test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
  1055. AES_CBC_ENC_TEST_VECTORS);
  1056. test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
  1057. AES_CBC_DEC_TEST_VECTORS);
  1058. test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
  1059. AES_LRW_ENC_TEST_VECTORS);
  1060. test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
  1061. AES_LRW_DEC_TEST_VECTORS);
  1062. test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
  1063. AES_XTS_ENC_TEST_VECTORS);
  1064. test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
  1065. AES_XTS_DEC_TEST_VECTORS);
  1066. test_cipher("rfc3686(ctr(aes))", ENCRYPT, aes_ctr_enc_tv_template,
  1067. AES_CTR_ENC_TEST_VECTORS);
  1068. test_cipher("rfc3686(ctr(aes))", DECRYPT, aes_ctr_dec_tv_template,
  1069. AES_CTR_DEC_TEST_VECTORS);
  1070. test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template,
  1071. AES_GCM_ENC_TEST_VECTORS);
  1072. test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template,
  1073. AES_GCM_DEC_TEST_VECTORS);
  1074. test_aead("ccm(aes)", ENCRYPT, aes_ccm_enc_tv_template,
  1075. AES_CCM_ENC_TEST_VECTORS);
  1076. test_aead("ccm(aes)", DECRYPT, aes_ccm_dec_tv_template,
  1077. AES_CCM_DEC_TEST_VECTORS);
  1078. //CAST5
  1079. test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
  1080. CAST5_ENC_TEST_VECTORS);
  1081. test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
  1082. CAST5_DEC_TEST_VECTORS);
  1083. //CAST6
  1084. test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
  1085. CAST6_ENC_TEST_VECTORS);
  1086. test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
  1087. CAST6_DEC_TEST_VECTORS);
  1088. //ARC4
  1089. test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
  1090. ARC4_ENC_TEST_VECTORS);
  1091. test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
  1092. ARC4_DEC_TEST_VECTORS);
  1093. //TEA
  1094. test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
  1095. TEA_ENC_TEST_VECTORS);
  1096. test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
  1097. TEA_DEC_TEST_VECTORS);
  1098. //XTEA
  1099. test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
  1100. XTEA_ENC_TEST_VECTORS);
  1101. test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
  1102. XTEA_DEC_TEST_VECTORS);
  1103. //KHAZAD
  1104. test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
  1105. KHAZAD_ENC_TEST_VECTORS);
  1106. test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
  1107. KHAZAD_DEC_TEST_VECTORS);
  1108. //ANUBIS
  1109. test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
  1110. ANUBIS_ENC_TEST_VECTORS);
  1111. test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
  1112. ANUBIS_DEC_TEST_VECTORS);
  1113. test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
  1114. ANUBIS_CBC_ENC_TEST_VECTORS);
  1115. test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
  1116. ANUBIS_CBC_ENC_TEST_VECTORS);
  1117. //XETA
  1118. test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
  1119. XETA_ENC_TEST_VECTORS);
  1120. test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
  1121. XETA_DEC_TEST_VECTORS);
  1122. //FCrypt
  1123. test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
  1124. FCRYPT_ENC_TEST_VECTORS);
  1125. test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
  1126. FCRYPT_DEC_TEST_VECTORS);
  1127. //CAMELLIA
  1128. test_cipher("ecb(camellia)", ENCRYPT,
  1129. camellia_enc_tv_template,
  1130. CAMELLIA_ENC_TEST_VECTORS);
  1131. test_cipher("ecb(camellia)", DECRYPT,
  1132. camellia_dec_tv_template,
  1133. CAMELLIA_DEC_TEST_VECTORS);
  1134. test_cipher("cbc(camellia)", ENCRYPT,
  1135. camellia_cbc_enc_tv_template,
  1136. CAMELLIA_CBC_ENC_TEST_VECTORS);
  1137. test_cipher("cbc(camellia)", DECRYPT,
  1138. camellia_cbc_dec_tv_template,
  1139. CAMELLIA_CBC_DEC_TEST_VECTORS);
  1140. //SEED
  1141. test_cipher("ecb(seed)", ENCRYPT, seed_enc_tv_template,
  1142. SEED_ENC_TEST_VECTORS);
  1143. test_cipher("ecb(seed)", DECRYPT, seed_dec_tv_template,
  1144. SEED_DEC_TEST_VECTORS);
  1145. //CTS
  1146. test_cipher("cts(cbc(aes))", ENCRYPT, cts_mode_enc_tv_template,
  1147. CTS_MODE_ENC_TEST_VECTORS);
  1148. test_cipher("cts(cbc(aes))", DECRYPT, cts_mode_dec_tv_template,
  1149. CTS_MODE_DEC_TEST_VECTORS);
  1150. test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
  1151. test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
  1152. test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
  1153. test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
  1154. test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
  1155. test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
  1156. test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
  1157. test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
  1158. test_comp("deflate", deflate_comp_tv_template,
  1159. deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
  1160. DEFLATE_DECOMP_TEST_VECTORS);
  1161. test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template,
  1162. LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS);
  1163. test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
  1164. test_hash("hmac(md5)", hmac_md5_tv_template,
  1165. HMAC_MD5_TEST_VECTORS);
  1166. test_hash("hmac(sha1)", hmac_sha1_tv_template,
  1167. HMAC_SHA1_TEST_VECTORS);
  1168. test_hash("hmac(sha224)", hmac_sha224_tv_template,
  1169. HMAC_SHA224_TEST_VECTORS);
  1170. test_hash("hmac(sha256)", hmac_sha256_tv_template,
  1171. HMAC_SHA256_TEST_VECTORS);
  1172. test_hash("hmac(sha384)", hmac_sha384_tv_template,
  1173. HMAC_SHA384_TEST_VECTORS);
  1174. test_hash("hmac(sha512)", hmac_sha512_tv_template,
  1175. HMAC_SHA512_TEST_VECTORS);
  1176. test_hash("xcbc(aes)", aes_xcbc128_tv_template,
  1177. XCBC_AES_TEST_VECTORS);
  1178. test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
  1179. break;
  1180. case 1:
  1181. test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
  1182. break;
  1183. case 2:
  1184. test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
  1185. break;
  1186. case 3:
  1187. test_cipher("ecb(des)", ENCRYPT, des_enc_tv_template,
  1188. DES_ENC_TEST_VECTORS);
  1189. test_cipher("ecb(des)", DECRYPT, des_dec_tv_template,
  1190. DES_DEC_TEST_VECTORS);
  1191. test_cipher("cbc(des)", ENCRYPT, des_cbc_enc_tv_template,
  1192. DES_CBC_ENC_TEST_VECTORS);
  1193. test_cipher("cbc(des)", DECRYPT, des_cbc_dec_tv_template,
  1194. DES_CBC_DEC_TEST_VECTORS);
  1195. break;
  1196. case 4:
  1197. test_cipher("ecb(des3_ede)", ENCRYPT, des3_ede_enc_tv_template,
  1198. DES3_EDE_ENC_TEST_VECTORS);
  1199. test_cipher("ecb(des3_ede)", DECRYPT, des3_ede_dec_tv_template,
  1200. DES3_EDE_DEC_TEST_VECTORS);
  1201. test_cipher("cbc(des3_ede)", ENCRYPT,
  1202. des3_ede_cbc_enc_tv_template,
  1203. DES3_EDE_CBC_ENC_TEST_VECTORS);
  1204. test_cipher("cbc(des3_ede)", DECRYPT,
  1205. des3_ede_cbc_dec_tv_template,
  1206. DES3_EDE_CBC_DEC_TEST_VECTORS);
  1207. break;
  1208. case 5:
  1209. test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
  1210. break;
  1211. case 6:
  1212. test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
  1213. break;
  1214. case 7:
  1215. test_cipher("ecb(blowfish)", ENCRYPT, bf_enc_tv_template,
  1216. BF_ENC_TEST_VECTORS);
  1217. test_cipher("ecb(blowfish)", DECRYPT, bf_dec_tv_template,
  1218. BF_DEC_TEST_VECTORS);
  1219. test_cipher("cbc(blowfish)", ENCRYPT, bf_cbc_enc_tv_template,
  1220. BF_CBC_ENC_TEST_VECTORS);
  1221. test_cipher("cbc(blowfish)", DECRYPT, bf_cbc_dec_tv_template,
  1222. BF_CBC_DEC_TEST_VECTORS);
  1223. break;
  1224. case 8:
  1225. test_cipher("ecb(twofish)", ENCRYPT, tf_enc_tv_template,
  1226. TF_ENC_TEST_VECTORS);
  1227. test_cipher("ecb(twofish)", DECRYPT, tf_dec_tv_template,
  1228. TF_DEC_TEST_VECTORS);
  1229. test_cipher("cbc(twofish)", ENCRYPT, tf_cbc_enc_tv_template,
  1230. TF_CBC_ENC_TEST_VECTORS);
  1231. test_cipher("cbc(twofish)", DECRYPT, tf_cbc_dec_tv_template,
  1232. TF_CBC_DEC_TEST_VECTORS);
  1233. break;
  1234. case 9:
  1235. test_cipher("ecb(serpent)", ENCRYPT, serpent_enc_tv_template,
  1236. SERPENT_ENC_TEST_VECTORS);
  1237. test_cipher("ecb(serpent)", DECRYPT, serpent_dec_tv_template,
  1238. SERPENT_DEC_TEST_VECTORS);
  1239. break;
  1240. case 10:
  1241. test_cipher("ecb(aes)", ENCRYPT, aes_enc_tv_template,
  1242. AES_ENC_TEST_VECTORS);
  1243. test_cipher("ecb(aes)", DECRYPT, aes_dec_tv_template,
  1244. AES_DEC_TEST_VECTORS);
  1245. test_cipher("cbc(aes)", ENCRYPT, aes_cbc_enc_tv_template,
  1246. AES_CBC_ENC_TEST_VECTORS);
  1247. test_cipher("cbc(aes)", DECRYPT, aes_cbc_dec_tv_template,
  1248. AES_CBC_DEC_TEST_VECTORS);
  1249. test_cipher("lrw(aes)", ENCRYPT, aes_lrw_enc_tv_template,
  1250. AES_LRW_ENC_TEST_VECTORS);
  1251. test_cipher("lrw(aes)", DECRYPT, aes_lrw_dec_tv_template,
  1252. AES_LRW_DEC_TEST_VECTORS);
  1253. test_cipher("xts(aes)", ENCRYPT, aes_xts_enc_tv_template,
  1254. AES_XTS_ENC_TEST_VECTORS);
  1255. test_cipher("xts(aes)", DECRYPT, aes_xts_dec_tv_template,
  1256. AES_XTS_DEC_TEST_VECTORS);
  1257. test_cipher("rfc3686(ctr(aes))", ENCRYPT, aes_ctr_enc_tv_template,
  1258. AES_CTR_ENC_TEST_VECTORS);
  1259. test_cipher("rfc3686(ctr(aes))", DECRYPT, aes_ctr_dec_tv_template,
  1260. AES_CTR_DEC_TEST_VECTORS);
  1261. break;
  1262. case 11:
  1263. test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
  1264. break;
  1265. case 12:
  1266. test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
  1267. break;
  1268. case 13:
  1269. test_comp("deflate", deflate_comp_tv_template,
  1270. deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
  1271. DEFLATE_DECOMP_TEST_VECTORS);
  1272. break;
  1273. case 14:
  1274. test_cipher("ecb(cast5)", ENCRYPT, cast5_enc_tv_template,
  1275. CAST5_ENC_TEST_VECTORS);
  1276. test_cipher("ecb(cast5)", DECRYPT, cast5_dec_tv_template,
  1277. CAST5_DEC_TEST_VECTORS);
  1278. break;
  1279. case 15:
  1280. test_cipher("ecb(cast6)", ENCRYPT, cast6_enc_tv_template,
  1281. CAST6_ENC_TEST_VECTORS);
  1282. test_cipher("ecb(cast6)", DECRYPT, cast6_dec_tv_template,
  1283. CAST6_DEC_TEST_VECTORS);
  1284. break;
  1285. case 16:
  1286. test_cipher("ecb(arc4)", ENCRYPT, arc4_enc_tv_template,
  1287. ARC4_ENC_TEST_VECTORS);
  1288. test_cipher("ecb(arc4)", DECRYPT, arc4_dec_tv_template,
  1289. ARC4_DEC_TEST_VECTORS);
  1290. break;
  1291. case 17:
  1292. test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS);
  1293. break;
  1294. case 18:
  1295. test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
  1296. break;
  1297. case 19:
  1298. test_cipher("ecb(tea)", ENCRYPT, tea_enc_tv_template,
  1299. TEA_ENC_TEST_VECTORS);
  1300. test_cipher("ecb(tea)", DECRYPT, tea_dec_tv_template,
  1301. TEA_DEC_TEST_VECTORS);
  1302. break;
  1303. case 20:
  1304. test_cipher("ecb(xtea)", ENCRYPT, xtea_enc_tv_template,
  1305. XTEA_ENC_TEST_VECTORS);
  1306. test_cipher("ecb(xtea)", DECRYPT, xtea_dec_tv_template,
  1307. XTEA_DEC_TEST_VECTORS);
  1308. break;
  1309. case 21:
  1310. test_cipher("ecb(khazad)", ENCRYPT, khazad_enc_tv_template,
  1311. KHAZAD_ENC_TEST_VECTORS);
  1312. test_cipher("ecb(khazad)", DECRYPT, khazad_dec_tv_template,
  1313. KHAZAD_DEC_TEST_VECTORS);
  1314. break;
  1315. case 22:
  1316. test_hash("wp512", wp512_tv_template, WP512_TEST_VECTORS);
  1317. break;
  1318. case 23:
  1319. test_hash("wp384", wp384_tv_template, WP384_TEST_VECTORS);
  1320. break;
  1321. case 24:
  1322. test_hash("wp256", wp256_tv_template, WP256_TEST_VECTORS);
  1323. break;
  1324. case 25:
  1325. test_cipher("ecb(tnepres)", ENCRYPT, tnepres_enc_tv_template,
  1326. TNEPRES_ENC_TEST_VECTORS);
  1327. test_cipher("ecb(tnepres)", DECRYPT, tnepres_dec_tv_template,
  1328. TNEPRES_DEC_TEST_VECTORS);
  1329. break;
  1330. case 26:
  1331. test_cipher("ecb(anubis)", ENCRYPT, anubis_enc_tv_template,
  1332. ANUBIS_ENC_TEST_VECTORS);
  1333. test_cipher("ecb(anubis)", DECRYPT, anubis_dec_tv_template,
  1334. ANUBIS_DEC_TEST_VECTORS);
  1335. test_cipher("cbc(anubis)", ENCRYPT, anubis_cbc_enc_tv_template,
  1336. ANUBIS_CBC_ENC_TEST_VECTORS);
  1337. test_cipher("cbc(anubis)", DECRYPT, anubis_cbc_dec_tv_template,
  1338. ANUBIS_CBC_ENC_TEST_VECTORS);
  1339. break;
  1340. case 27:
  1341. test_hash("tgr192", tgr192_tv_template, TGR192_TEST_VECTORS);
  1342. break;
  1343. case 28:
  1344. test_hash("tgr160", tgr160_tv_template, TGR160_TEST_VECTORS);
  1345. break;
  1346. case 29:
  1347. test_hash("tgr128", tgr128_tv_template, TGR128_TEST_VECTORS);
  1348. break;
  1349. case 30:
  1350. test_cipher("ecb(xeta)", ENCRYPT, xeta_enc_tv_template,
  1351. XETA_ENC_TEST_VECTORS);
  1352. test_cipher("ecb(xeta)", DECRYPT, xeta_dec_tv_template,
  1353. XETA_DEC_TEST_VECTORS);
  1354. break;
  1355. case 31:
  1356. test_cipher("pcbc(fcrypt)", ENCRYPT, fcrypt_pcbc_enc_tv_template,
  1357. FCRYPT_ENC_TEST_VECTORS);
  1358. test_cipher("pcbc(fcrypt)", DECRYPT, fcrypt_pcbc_dec_tv_template,
  1359. FCRYPT_DEC_TEST_VECTORS);
  1360. break;
  1361. case 32:
  1362. test_cipher("ecb(camellia)", ENCRYPT,
  1363. camellia_enc_tv_template,
  1364. CAMELLIA_ENC_TEST_VECTORS);
  1365. test_cipher("ecb(camellia)", DECRYPT,
  1366. camellia_dec_tv_template,
  1367. CAMELLIA_DEC_TEST_VECTORS);
  1368. test_cipher("cbc(camellia)", ENCRYPT,
  1369. camellia_cbc_enc_tv_template,
  1370. CAMELLIA_CBC_ENC_TEST_VECTORS);
  1371. test_cipher("cbc(camellia)", DECRYPT,
  1372. camellia_cbc_dec_tv_template,
  1373. CAMELLIA_CBC_DEC_TEST_VECTORS);
  1374. break;
  1375. case 33:
  1376. test_hash("sha224", sha224_tv_template, SHA224_TEST_VECTORS);
  1377. break;
  1378. case 34:
  1379. test_cipher("salsa20", ENCRYPT,
  1380. salsa20_stream_enc_tv_template,
  1381. SALSA20_STREAM_ENC_TEST_VECTORS);
  1382. break;
  1383. case 35:
  1384. test_aead("gcm(aes)", ENCRYPT, aes_gcm_enc_tv_template,
  1385. AES_GCM_ENC_TEST_VECTORS);
  1386. test_aead("gcm(aes)", DECRYPT, aes_gcm_dec_tv_template,
  1387. AES_GCM_DEC_TEST_VECTORS);
  1388. break;
  1389. case 36:
  1390. test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template,
  1391. LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS);
  1392. break;
  1393. case 37:
  1394. test_aead("ccm(aes)", ENCRYPT, aes_ccm_enc_tv_template,
  1395. AES_CCM_ENC_TEST_VECTORS);
  1396. test_aead("ccm(aes)", DECRYPT, aes_ccm_dec_tv_template,
  1397. AES_CCM_DEC_TEST_VECTORS);
  1398. break;
  1399. case 38:
  1400. test_cipher("cts(cbc(aes))", ENCRYPT, cts_mode_enc_tv_template,
  1401. CTS_MODE_ENC_TEST_VECTORS);
  1402. test_cipher("cts(cbc(aes))", DECRYPT, cts_mode_dec_tv_template,
  1403. CTS_MODE_DEC_TEST_VECTORS);
  1404. break;
  1405. case 39:
  1406. test_hash("rmd128", rmd128_tv_template, RMD128_TEST_VECTORS);
  1407. break;
  1408. case 40:
  1409. test_hash("rmd160", rmd160_tv_template, RMD160_TEST_VECTORS);
  1410. break;
  1411. case 41:
  1412. test_hash("rmd256", rmd256_tv_template, RMD256_TEST_VECTORS);
  1413. break;
  1414. case 42:
  1415. test_hash("rmd320", rmd320_tv_template, RMD320_TEST_VECTORS);
  1416. break;
  1417. case 100:
  1418. test_hash("hmac(md5)", hmac_md5_tv_template,
  1419. HMAC_MD5_TEST_VECTORS);
  1420. break;
  1421. case 101:
  1422. test_hash("hmac(sha1)", hmac_sha1_tv_template,
  1423. HMAC_SHA1_TEST_VECTORS);
  1424. break;
  1425. case 102:
  1426. test_hash("hmac(sha256)", hmac_sha256_tv_template,
  1427. HMAC_SHA256_TEST_VECTORS);
  1428. break;
  1429. case 103:
  1430. test_hash("hmac(sha384)", hmac_sha384_tv_template,
  1431. HMAC_SHA384_TEST_VECTORS);
  1432. break;
  1433. case 104:
  1434. test_hash("hmac(sha512)", hmac_sha512_tv_template,
  1435. HMAC_SHA512_TEST_VECTORS);
  1436. break;
  1437. case 105:
  1438. test_hash("hmac(sha224)", hmac_sha224_tv_template,
  1439. HMAC_SHA224_TEST_VECTORS);
  1440. break;
  1441. case 106:
  1442. test_hash("xcbc(aes)", aes_xcbc128_tv_template,
  1443. XCBC_AES_TEST_VECTORS);
  1444. break;
  1445. case 107:
  1446. test_hash("hmac(rmd128)", hmac_rmd128_tv_template,
  1447. HMAC_RMD128_TEST_VECTORS);
  1448. break;
  1449. case 108:
  1450. test_hash("hmac(rmd160)", hmac_rmd160_tv_template,
  1451. HMAC_RMD160_TEST_VECTORS);
  1452. break;
  1453. case 200:
  1454. test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
  1455. speed_template_16_24_32);
  1456. test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
  1457. speed_template_16_24_32);
  1458. test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
  1459. speed_template_16_24_32);
  1460. test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
  1461. speed_template_16_24_32);
  1462. test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
  1463. speed_template_32_40_48);
  1464. test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
  1465. speed_template_32_40_48);
  1466. test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
  1467. speed_template_32_48_64);
  1468. test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
  1469. speed_template_32_48_64);
  1470. break;
  1471. case 201:
  1472. test_cipher_speed("ecb(des3_ede)", ENCRYPT, sec,
  1473. des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
  1474. speed_template_24);
  1475. test_cipher_speed("ecb(des3_ede)", DECRYPT, sec,
  1476. des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
  1477. speed_template_24);
  1478. test_cipher_speed("cbc(des3_ede)", ENCRYPT, sec,
  1479. des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
  1480. speed_template_24);
  1481. test_cipher_speed("cbc(des3_ede)", DECRYPT, sec,
  1482. des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS,
  1483. speed_template_24);
  1484. break;
  1485. case 202:
  1486. test_cipher_speed("ecb(twofish)", ENCRYPT, sec, NULL, 0,
  1487. speed_template_16_24_32);
  1488. test_cipher_speed("ecb(twofish)", DECRYPT, sec, NULL, 0,
  1489. speed_template_16_24_32);
  1490. test_cipher_speed("cbc(twofish)", ENCRYPT, sec, NULL, 0,
  1491. speed_template_16_24_32);
  1492. test_cipher_speed("cbc(twofish)", DECRYPT, sec, NULL, 0,
  1493. speed_template_16_24_32);
  1494. break;
  1495. case 203:
  1496. test_cipher_speed("ecb(blowfish)", ENCRYPT, sec, NULL, 0,
  1497. speed_template_8_32);
  1498. test_cipher_speed("ecb(blowfish)", DECRYPT, sec, NULL, 0,
  1499. speed_template_8_32);
  1500. test_cipher_speed("cbc(blowfish)", ENCRYPT, sec, NULL, 0,
  1501. speed_template_8_32);
  1502. test_cipher_speed("cbc(blowfish)", DECRYPT, sec, NULL, 0,
  1503. speed_template_8_32);
  1504. break;
  1505. case 204:
  1506. test_cipher_speed("ecb(des)", ENCRYPT, sec, NULL, 0,
  1507. speed_template_8);
  1508. test_cipher_speed("ecb(des)", DECRYPT, sec, NULL, 0,
  1509. speed_template_8);
  1510. test_cipher_speed("cbc(des)", ENCRYPT, sec, NULL, 0,
  1511. speed_template_8);
  1512. test_cipher_speed("cbc(des)", DECRYPT, sec, NULL, 0,
  1513. speed_template_8);
  1514. break;
  1515. case 205:
  1516. test_cipher_speed("ecb(camellia)", ENCRYPT, sec, NULL, 0,
  1517. speed_template_16_24_32);
  1518. test_cipher_speed("ecb(camellia)", DECRYPT, sec, NULL, 0,
  1519. speed_template_16_24_32);
  1520. test_cipher_speed("cbc(camellia)", ENCRYPT, sec, NULL, 0,
  1521. speed_template_16_24_32);
  1522. test_cipher_speed("cbc(camellia)", DECRYPT, sec, NULL, 0,
  1523. speed_template_16_24_32);
  1524. break;
  1525. case 206:
  1526. test_cipher_speed("salsa20", ENCRYPT, sec, NULL, 0,
  1527. speed_template_16_32);
  1528. break;
  1529. case 300:
  1530. /* fall through */
  1531. case 301:
  1532. test_hash_speed("md4", sec, generic_hash_speed_template);
  1533. if (mode > 300 && mode < 400) break;
  1534. case 302:
  1535. test_hash_speed("md5", sec, generic_hash_speed_template);
  1536. if (mode > 300 && mode < 400) break;
  1537. case 303:
  1538. test_hash_speed("sha1", sec, generic_hash_speed_template);
  1539. if (mode > 300 && mode < 400) break;
  1540. case 304:
  1541. test_hash_speed("sha256", sec, generic_hash_speed_template);
  1542. if (mode > 300 && mode < 400) break;
  1543. case 305:
  1544. test_hash_speed("sha384", sec, generic_hash_speed_template);
  1545. if (mode > 300 && mode < 400) break;
  1546. case 306:
  1547. test_hash_speed("sha512", sec, generic_hash_speed_template);
  1548. if (mode > 300 && mode < 400) break;
  1549. case 307:
  1550. test_hash_speed("wp256", sec, generic_hash_speed_template);
  1551. if (mode > 300 && mode < 400) break;
  1552. case 308:
  1553. test_hash_speed("wp384", sec, generic_hash_speed_template);
  1554. if (mode > 300 && mode < 400) break;
  1555. case 309:
  1556. test_hash_speed("wp512", sec, generic_hash_speed_template);
  1557. if (mode > 300 && mode < 400) break;
  1558. case 310:
  1559. test_hash_speed("tgr128", sec, generic_hash_speed_template);
  1560. if (mode > 300 && mode < 400) break;
  1561. case 311:
  1562. test_hash_speed("tgr160", sec, generic_hash_speed_template);
  1563. if (mode > 300 && mode < 400) break;
  1564. case 312:
  1565. test_hash_speed("tgr192", sec, generic_hash_speed_template);
  1566. if (mode > 300 && mode < 400) break;
  1567. case 313:
  1568. test_hash_speed("sha224", sec, generic_hash_speed_template);
  1569. if (mode > 300 && mode < 400) break;
  1570. case 314:
  1571. test_hash_speed("rmd128", sec, generic_hash_speed_template);
  1572. if (mode > 300 && mode < 400) break;
  1573. case 315:
  1574. test_hash_speed("rmd160", sec, generic_hash_speed_template);
  1575. if (mode > 300 && mode < 400) break;
  1576. case 316:
  1577. test_hash_speed("rmd256", sec, generic_hash_speed_template);
  1578. if (mode > 300 && mode < 400) break;
  1579. case 317:
  1580. test_hash_speed("rmd320", sec, generic_hash_speed_template);
  1581. if (mode > 300 && mode < 400) break;
  1582. case 399:
  1583. break;
  1584. case 1000:
  1585. test_available();
  1586. break;
  1587. default:
  1588. /* useful for debugging */
  1589. printk("not testing anything\n");
  1590. break;
  1591. }
  1592. }
  1593. static int __init tcrypt_mod_init(void)
  1594. {
  1595. int err = -ENOMEM;
  1596. tvmem = kmalloc(TVMEMSIZE, GFP_KERNEL);
  1597. if (tvmem == NULL)
  1598. return err;
  1599. xbuf = kmalloc(XBUFSIZE, GFP_KERNEL);
  1600. if (xbuf == NULL)
  1601. goto err_free_tv;
  1602. axbuf = kmalloc(XBUFSIZE, GFP_KERNEL);
  1603. if (axbuf == NULL)
  1604. goto err_free_xbuf;
  1605. do_test();
  1606. /* We intentionaly return -EAGAIN to prevent keeping
  1607. * the module. It does all its work from init()
  1608. * and doesn't offer any runtime functionality
  1609. * => we don't need it in the memory, do we?
  1610. * -- mludvig
  1611. */
  1612. err = -EAGAIN;
  1613. kfree(axbuf);
  1614. err_free_xbuf:
  1615. kfree(xbuf);
  1616. err_free_tv:
  1617. kfree(tvmem);
  1618. return err;
  1619. }
  1620. /*
  1621. * If an init function is provided, an exit function must also be provided
  1622. * to allow module unload.
  1623. */
  1624. static void __exit tcrypt_mod_fini(void) { }
  1625. module_init(tcrypt_mod_init);
  1626. module_exit(tcrypt_mod_fini);
  1627. module_param(mode, int, 0);
  1628. module_param(sec, uint, 0);
  1629. MODULE_PARM_DESC(sec, "Length in seconds of speed tests "
  1630. "(defaults to zero which uses CPU cycles instead)");
  1631. MODULE_LICENSE("GPL");
  1632. MODULE_DESCRIPTION("Quick & dirty crypto testing module");
  1633. MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");