testmgr.c 40 KB

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