tcrypt.c 49 KB

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