testmgr.c 81 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783
  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. * Updated RFC4106 AES-GCM testing.
  10. * Authors: Aidan O'Mahony (aidan.o.mahony@intel.com)
  11. * Adrian Hoban <adrian.hoban@intel.com>
  12. * Gabriele Paoloni <gabriele.paoloni@intel.com>
  13. * Tadeusz Struk (tadeusz.struk@intel.com)
  14. * Copyright (c) 2010, Intel Corporation.
  15. *
  16. * This program is free software; you can redistribute it and/or modify it
  17. * under the terms of the GNU General Public License as published by the Free
  18. * Software Foundation; either version 2 of the License, or (at your option)
  19. * any later version.
  20. *
  21. */
  22. #include <crypto/aead.h>
  23. #include <crypto/hash.h>
  24. #include <linux/err.h>
  25. #include <linux/fips.h>
  26. #include <linux/module.h>
  27. #include <linux/scatterlist.h>
  28. #include <linux/slab.h>
  29. #include <linux/string.h>
  30. #include <crypto/rng.h>
  31. #include <crypto/drbg.h>
  32. #include "internal.h"
  33. #ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
  34. /* a perfect nop */
  35. int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
  36. {
  37. return 0;
  38. }
  39. #else
  40. #include "testmgr.h"
  41. /*
  42. * Need slab memory for testing (size in number of pages).
  43. */
  44. #define XBUFSIZE 8
  45. /*
  46. * Indexes into the xbuf to simulate cross-page access.
  47. */
  48. #define IDX1 32
  49. #define IDX2 32400
  50. #define IDX3 1
  51. #define IDX4 8193
  52. #define IDX5 22222
  53. #define IDX6 17101
  54. #define IDX7 27333
  55. #define IDX8 3000
  56. /*
  57. * Used by test_cipher()
  58. */
  59. #define ENCRYPT 1
  60. #define DECRYPT 0
  61. struct tcrypt_result {
  62. struct completion completion;
  63. int err;
  64. };
  65. struct aead_test_suite {
  66. struct {
  67. struct aead_testvec *vecs;
  68. unsigned int count;
  69. } enc, dec;
  70. };
  71. struct cipher_test_suite {
  72. struct {
  73. struct cipher_testvec *vecs;
  74. unsigned int count;
  75. } enc, dec;
  76. };
  77. struct comp_test_suite {
  78. struct {
  79. struct comp_testvec *vecs;
  80. unsigned int count;
  81. } comp, decomp;
  82. };
  83. struct pcomp_test_suite {
  84. struct {
  85. struct pcomp_testvec *vecs;
  86. unsigned int count;
  87. } comp, decomp;
  88. };
  89. struct hash_test_suite {
  90. struct hash_testvec *vecs;
  91. unsigned int count;
  92. };
  93. struct cprng_test_suite {
  94. struct cprng_testvec *vecs;
  95. unsigned int count;
  96. };
  97. struct drbg_test_suite {
  98. struct drbg_testvec *vecs;
  99. unsigned int count;
  100. };
  101. struct alg_test_desc {
  102. const char *alg;
  103. int (*test)(const struct alg_test_desc *desc, const char *driver,
  104. u32 type, u32 mask);
  105. int fips_allowed; /* set if alg is allowed in fips mode */
  106. union {
  107. struct aead_test_suite aead;
  108. struct cipher_test_suite cipher;
  109. struct comp_test_suite comp;
  110. struct pcomp_test_suite pcomp;
  111. struct hash_test_suite hash;
  112. struct cprng_test_suite cprng;
  113. struct drbg_test_suite drbg;
  114. } suite;
  115. };
  116. static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
  117. static void hexdump(unsigned char *buf, unsigned int len)
  118. {
  119. print_hex_dump(KERN_CONT, "", DUMP_PREFIX_OFFSET,
  120. 16, 1,
  121. buf, len, false);
  122. }
  123. static void tcrypt_complete(struct crypto_async_request *req, int err)
  124. {
  125. struct tcrypt_result *res = req->data;
  126. if (err == -EINPROGRESS)
  127. return;
  128. res->err = err;
  129. complete(&res->completion);
  130. }
  131. static int testmgr_alloc_buf(char *buf[XBUFSIZE])
  132. {
  133. int i;
  134. for (i = 0; i < XBUFSIZE; i++) {
  135. buf[i] = (void *)__get_free_page(GFP_KERNEL);
  136. if (!buf[i])
  137. goto err_free_buf;
  138. }
  139. return 0;
  140. err_free_buf:
  141. while (i-- > 0)
  142. free_page((unsigned long)buf[i]);
  143. return -ENOMEM;
  144. }
  145. static void testmgr_free_buf(char *buf[XBUFSIZE])
  146. {
  147. int i;
  148. for (i = 0; i < XBUFSIZE; i++)
  149. free_page((unsigned long)buf[i]);
  150. }
  151. static int wait_async_op(struct tcrypt_result *tr, int ret)
  152. {
  153. if (ret == -EINPROGRESS || ret == -EBUSY) {
  154. wait_for_completion(&tr->completion);
  155. reinit_completion(&tr->completion);
  156. ret = tr->err;
  157. }
  158. return ret;
  159. }
  160. static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
  161. unsigned int tcount, bool use_digest,
  162. const int align_offset)
  163. {
  164. const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm));
  165. unsigned int i, j, k, temp;
  166. struct scatterlist sg[8];
  167. char *result;
  168. char *key;
  169. struct ahash_request *req;
  170. struct tcrypt_result tresult;
  171. void *hash_buff;
  172. char *xbuf[XBUFSIZE];
  173. int ret = -ENOMEM;
  174. result = kmalloc(MAX_DIGEST_SIZE, GFP_KERNEL);
  175. if (!result)
  176. return ret;
  177. key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
  178. if (!key)
  179. goto out_nobuf;
  180. if (testmgr_alloc_buf(xbuf))
  181. goto out_nobuf;
  182. init_completion(&tresult.completion);
  183. req = ahash_request_alloc(tfm, GFP_KERNEL);
  184. if (!req) {
  185. printk(KERN_ERR "alg: hash: Failed to allocate request for "
  186. "%s\n", algo);
  187. goto out_noreq;
  188. }
  189. ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
  190. tcrypt_complete, &tresult);
  191. j = 0;
  192. for (i = 0; i < tcount; i++) {
  193. if (template[i].np)
  194. continue;
  195. ret = -EINVAL;
  196. if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE))
  197. goto out;
  198. j++;
  199. memset(result, 0, MAX_DIGEST_SIZE);
  200. hash_buff = xbuf[0];
  201. hash_buff += align_offset;
  202. memcpy(hash_buff, template[i].plaintext, template[i].psize);
  203. sg_init_one(&sg[0], hash_buff, template[i].psize);
  204. if (template[i].ksize) {
  205. crypto_ahash_clear_flags(tfm, ~0);
  206. if (template[i].ksize > MAX_KEYLEN) {
  207. pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
  208. j, algo, template[i].ksize, MAX_KEYLEN);
  209. ret = -EINVAL;
  210. goto out;
  211. }
  212. memcpy(key, template[i].key, template[i].ksize);
  213. ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
  214. if (ret) {
  215. printk(KERN_ERR "alg: hash: setkey failed on "
  216. "test %d for %s: ret=%d\n", j, algo,
  217. -ret);
  218. goto out;
  219. }
  220. }
  221. ahash_request_set_crypt(req, sg, result, template[i].psize);
  222. if (use_digest) {
  223. ret = wait_async_op(&tresult, crypto_ahash_digest(req));
  224. if (ret) {
  225. pr_err("alg: hash: digest failed on test %d "
  226. "for %s: ret=%d\n", j, algo, -ret);
  227. goto out;
  228. }
  229. } else {
  230. ret = wait_async_op(&tresult, crypto_ahash_init(req));
  231. if (ret) {
  232. pr_err("alt: hash: init failed on test %d "
  233. "for %s: ret=%d\n", j, algo, -ret);
  234. goto out;
  235. }
  236. ret = wait_async_op(&tresult, crypto_ahash_update(req));
  237. if (ret) {
  238. pr_err("alt: hash: update failed on test %d "
  239. "for %s: ret=%d\n", j, algo, -ret);
  240. goto out;
  241. }
  242. ret = wait_async_op(&tresult, crypto_ahash_final(req));
  243. if (ret) {
  244. pr_err("alt: hash: final failed on test %d "
  245. "for %s: ret=%d\n", j, algo, -ret);
  246. goto out;
  247. }
  248. }
  249. if (memcmp(result, template[i].digest,
  250. crypto_ahash_digestsize(tfm))) {
  251. printk(KERN_ERR "alg: hash: Test %d failed for %s\n",
  252. j, algo);
  253. hexdump(result, crypto_ahash_digestsize(tfm));
  254. ret = -EINVAL;
  255. goto out;
  256. }
  257. }
  258. j = 0;
  259. for (i = 0; i < tcount; i++) {
  260. /* alignment tests are only done with continuous buffers */
  261. if (align_offset != 0)
  262. break;
  263. if (!template[i].np)
  264. continue;
  265. j++;
  266. memset(result, 0, MAX_DIGEST_SIZE);
  267. temp = 0;
  268. sg_init_table(sg, template[i].np);
  269. ret = -EINVAL;
  270. for (k = 0; k < template[i].np; k++) {
  271. if (WARN_ON(offset_in_page(IDX[k]) +
  272. template[i].tap[k] > PAGE_SIZE))
  273. goto out;
  274. sg_set_buf(&sg[k],
  275. memcpy(xbuf[IDX[k] >> PAGE_SHIFT] +
  276. offset_in_page(IDX[k]),
  277. template[i].plaintext + temp,
  278. template[i].tap[k]),
  279. template[i].tap[k]);
  280. temp += template[i].tap[k];
  281. }
  282. if (template[i].ksize) {
  283. if (template[i].ksize > MAX_KEYLEN) {
  284. pr_err("alg: hash: setkey failed on test %d for %s: key size %d > %d\n",
  285. j, algo, template[i].ksize, MAX_KEYLEN);
  286. ret = -EINVAL;
  287. goto out;
  288. }
  289. crypto_ahash_clear_flags(tfm, ~0);
  290. memcpy(key, template[i].key, template[i].ksize);
  291. ret = crypto_ahash_setkey(tfm, key, template[i].ksize);
  292. if (ret) {
  293. printk(KERN_ERR "alg: hash: setkey "
  294. "failed on chunking test %d "
  295. "for %s: ret=%d\n", j, algo, -ret);
  296. goto out;
  297. }
  298. }
  299. ahash_request_set_crypt(req, sg, result, template[i].psize);
  300. ret = crypto_ahash_digest(req);
  301. switch (ret) {
  302. case 0:
  303. break;
  304. case -EINPROGRESS:
  305. case -EBUSY:
  306. wait_for_completion(&tresult.completion);
  307. reinit_completion(&tresult.completion);
  308. ret = tresult.err;
  309. if (!ret)
  310. break;
  311. /* fall through */
  312. default:
  313. printk(KERN_ERR "alg: hash: digest failed "
  314. "on chunking test %d for %s: "
  315. "ret=%d\n", j, algo, -ret);
  316. goto out;
  317. }
  318. if (memcmp(result, template[i].digest,
  319. crypto_ahash_digestsize(tfm))) {
  320. printk(KERN_ERR "alg: hash: Chunking test %d "
  321. "failed for %s\n", j, algo);
  322. hexdump(result, crypto_ahash_digestsize(tfm));
  323. ret = -EINVAL;
  324. goto out;
  325. }
  326. }
  327. ret = 0;
  328. out:
  329. ahash_request_free(req);
  330. out_noreq:
  331. testmgr_free_buf(xbuf);
  332. out_nobuf:
  333. kfree(key);
  334. kfree(result);
  335. return ret;
  336. }
  337. static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template,
  338. unsigned int tcount, bool use_digest)
  339. {
  340. unsigned int alignmask;
  341. int ret;
  342. ret = __test_hash(tfm, template, tcount, use_digest, 0);
  343. if (ret)
  344. return ret;
  345. /* test unaligned buffers, check with one byte offset */
  346. ret = __test_hash(tfm, template, tcount, use_digest, 1);
  347. if (ret)
  348. return ret;
  349. alignmask = crypto_tfm_alg_alignmask(&tfm->base);
  350. if (alignmask) {
  351. /* Check if alignment mask for tfm is correctly set. */
  352. ret = __test_hash(tfm, template, tcount, use_digest,
  353. alignmask + 1);
  354. if (ret)
  355. return ret;
  356. }
  357. return 0;
  358. }
  359. static int __test_aead(struct crypto_aead *tfm, int enc,
  360. struct aead_testvec *template, unsigned int tcount,
  361. const bool diff_dst, const int align_offset)
  362. {
  363. const char *algo = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm));
  364. unsigned int i, j, k, n, temp;
  365. int ret = -ENOMEM;
  366. char *q;
  367. char *key;
  368. struct aead_request *req;
  369. struct scatterlist *sg;
  370. struct scatterlist *sgout;
  371. const char *e, *d;
  372. struct tcrypt_result result;
  373. unsigned int authsize, iv_len;
  374. void *input;
  375. void *output;
  376. void *assoc;
  377. char *iv;
  378. char *xbuf[XBUFSIZE];
  379. char *xoutbuf[XBUFSIZE];
  380. char *axbuf[XBUFSIZE];
  381. iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
  382. if (!iv)
  383. return ret;
  384. key = kmalloc(MAX_KEYLEN, GFP_KERNEL);
  385. if (!key)
  386. goto out_noxbuf;
  387. if (testmgr_alloc_buf(xbuf))
  388. goto out_noxbuf;
  389. if (testmgr_alloc_buf(axbuf))
  390. goto out_noaxbuf;
  391. if (diff_dst && testmgr_alloc_buf(xoutbuf))
  392. goto out_nooutbuf;
  393. /* avoid "the frame size is larger than 1024 bytes" compiler warning */
  394. sg = kmalloc(sizeof(*sg) * 8 * (diff_dst ? 4 : 2), GFP_KERNEL);
  395. if (!sg)
  396. goto out_nosg;
  397. sgout = &sg[16];
  398. if (diff_dst)
  399. d = "-ddst";
  400. else
  401. d = "";
  402. if (enc == ENCRYPT)
  403. e = "encryption";
  404. else
  405. e = "decryption";
  406. init_completion(&result.completion);
  407. req = aead_request_alloc(tfm, GFP_KERNEL);
  408. if (!req) {
  409. pr_err("alg: aead%s: Failed to allocate request for %s\n",
  410. d, algo);
  411. goto out;
  412. }
  413. aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
  414. tcrypt_complete, &result);
  415. for (i = 0, j = 0; i < tcount; i++) {
  416. if (template[i].np)
  417. continue;
  418. j++;
  419. /* some templates have no input data but they will
  420. * touch input
  421. */
  422. input = xbuf[0];
  423. input += align_offset;
  424. assoc = axbuf[0];
  425. ret = -EINVAL;
  426. if (WARN_ON(align_offset + template[i].ilen >
  427. PAGE_SIZE || template[i].alen > PAGE_SIZE))
  428. goto out;
  429. memcpy(input, template[i].input, template[i].ilen);
  430. memcpy(assoc, template[i].assoc, template[i].alen);
  431. iv_len = crypto_aead_ivsize(tfm);
  432. if (template[i].iv)
  433. memcpy(iv, template[i].iv, iv_len);
  434. else
  435. memset(iv, 0, iv_len);
  436. crypto_aead_clear_flags(tfm, ~0);
  437. if (template[i].wk)
  438. crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
  439. if (template[i].klen > MAX_KEYLEN) {
  440. pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
  441. d, j, algo, template[i].klen,
  442. MAX_KEYLEN);
  443. ret = -EINVAL;
  444. goto out;
  445. }
  446. memcpy(key, template[i].key, template[i].klen);
  447. ret = crypto_aead_setkey(tfm, key, template[i].klen);
  448. if (!ret == template[i].fail) {
  449. pr_err("alg: aead%s: setkey failed on test %d for %s: flags=%x\n",
  450. d, j, algo, crypto_aead_get_flags(tfm));
  451. goto out;
  452. } else if (ret)
  453. continue;
  454. authsize = abs(template[i].rlen - template[i].ilen);
  455. ret = crypto_aead_setauthsize(tfm, authsize);
  456. if (ret) {
  457. pr_err("alg: aead%s: Failed to set authsize to %u on test %d for %s\n",
  458. d, authsize, j, algo);
  459. goto out;
  460. }
  461. k = !!template[i].alen;
  462. sg_init_table(sg, k + 1);
  463. sg_set_buf(&sg[0], assoc, template[i].alen);
  464. sg_set_buf(&sg[k], input,
  465. template[i].ilen + (enc ? authsize : 0));
  466. output = input;
  467. if (diff_dst) {
  468. sg_init_table(sgout, k + 1);
  469. sg_set_buf(&sgout[0], assoc, template[i].alen);
  470. output = xoutbuf[0];
  471. output += align_offset;
  472. sg_set_buf(&sgout[k], output,
  473. template[i].rlen + (enc ? 0 : authsize));
  474. }
  475. aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
  476. template[i].ilen, iv);
  477. aead_request_set_ad(req, template[i].alen);
  478. ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
  479. switch (ret) {
  480. case 0:
  481. if (template[i].novrfy) {
  482. /* verification was supposed to fail */
  483. pr_err("alg: aead%s: %s failed on test %d for %s: ret was 0, expected -EBADMSG\n",
  484. d, e, j, algo);
  485. /* so really, we got a bad message */
  486. ret = -EBADMSG;
  487. goto out;
  488. }
  489. break;
  490. case -EINPROGRESS:
  491. case -EBUSY:
  492. wait_for_completion(&result.completion);
  493. reinit_completion(&result.completion);
  494. ret = result.err;
  495. if (!ret)
  496. break;
  497. case -EBADMSG:
  498. if (template[i].novrfy)
  499. /* verification failure was expected */
  500. continue;
  501. /* fall through */
  502. default:
  503. pr_err("alg: aead%s: %s failed on test %d for %s: ret=%d\n",
  504. d, e, j, algo, -ret);
  505. goto out;
  506. }
  507. q = output;
  508. if (memcmp(q, template[i].result, template[i].rlen)) {
  509. pr_err("alg: aead%s: Test %d failed on %s for %s\n",
  510. d, j, e, algo);
  511. hexdump(q, template[i].rlen);
  512. ret = -EINVAL;
  513. goto out;
  514. }
  515. }
  516. for (i = 0, j = 0; i < tcount; i++) {
  517. /* alignment tests are only done with continuous buffers */
  518. if (align_offset != 0)
  519. break;
  520. if (!template[i].np)
  521. continue;
  522. j++;
  523. if (template[i].iv)
  524. memcpy(iv, template[i].iv, MAX_IVLEN);
  525. else
  526. memset(iv, 0, MAX_IVLEN);
  527. crypto_aead_clear_flags(tfm, ~0);
  528. if (template[i].wk)
  529. crypto_aead_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
  530. if (template[i].klen > MAX_KEYLEN) {
  531. pr_err("alg: aead%s: setkey failed on test %d for %s: key size %d > %d\n",
  532. d, j, algo, template[i].klen, MAX_KEYLEN);
  533. ret = -EINVAL;
  534. goto out;
  535. }
  536. memcpy(key, template[i].key, template[i].klen);
  537. ret = crypto_aead_setkey(tfm, key, template[i].klen);
  538. if (!ret == template[i].fail) {
  539. pr_err("alg: aead%s: setkey failed on chunk test %d for %s: flags=%x\n",
  540. d, j, algo, crypto_aead_get_flags(tfm));
  541. goto out;
  542. } else if (ret)
  543. continue;
  544. authsize = abs(template[i].rlen - template[i].ilen);
  545. ret = -EINVAL;
  546. sg_init_table(sg, template[i].anp + template[i].np);
  547. if (diff_dst)
  548. sg_init_table(sgout, template[i].anp + template[i].np);
  549. ret = -EINVAL;
  550. for (k = 0, temp = 0; k < template[i].anp; k++) {
  551. if (WARN_ON(offset_in_page(IDX[k]) +
  552. template[i].atap[k] > PAGE_SIZE))
  553. goto out;
  554. sg_set_buf(&sg[k],
  555. memcpy(axbuf[IDX[k] >> PAGE_SHIFT] +
  556. offset_in_page(IDX[k]),
  557. template[i].assoc + temp,
  558. template[i].atap[k]),
  559. template[i].atap[k]);
  560. if (diff_dst)
  561. sg_set_buf(&sgout[k],
  562. axbuf[IDX[k] >> PAGE_SHIFT] +
  563. offset_in_page(IDX[k]),
  564. template[i].atap[k]);
  565. temp += template[i].atap[k];
  566. }
  567. for (k = 0, temp = 0; k < template[i].np; k++) {
  568. if (WARN_ON(offset_in_page(IDX[k]) +
  569. template[i].tap[k] > PAGE_SIZE))
  570. goto out;
  571. q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
  572. memcpy(q, template[i].input + temp, template[i].tap[k]);
  573. sg_set_buf(&sg[template[i].anp + k],
  574. q, template[i].tap[k]);
  575. if (diff_dst) {
  576. q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
  577. offset_in_page(IDX[k]);
  578. memset(q, 0, template[i].tap[k]);
  579. sg_set_buf(&sgout[template[i].anp + k],
  580. q, template[i].tap[k]);
  581. }
  582. n = template[i].tap[k];
  583. if (k == template[i].np - 1 && enc)
  584. n += authsize;
  585. if (offset_in_page(q) + n < PAGE_SIZE)
  586. q[n] = 0;
  587. temp += template[i].tap[k];
  588. }
  589. ret = crypto_aead_setauthsize(tfm, authsize);
  590. if (ret) {
  591. pr_err("alg: aead%s: Failed to set authsize to %u on chunk test %d for %s\n",
  592. d, authsize, j, algo);
  593. goto out;
  594. }
  595. if (enc) {
  596. if (WARN_ON(sg[template[i].anp + k - 1].offset +
  597. sg[template[i].anp + k - 1].length +
  598. authsize > PAGE_SIZE)) {
  599. ret = -EINVAL;
  600. goto out;
  601. }
  602. if (diff_dst)
  603. sgout[template[i].anp + k - 1].length +=
  604. authsize;
  605. sg[template[i].anp + k - 1].length += authsize;
  606. }
  607. aead_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
  608. template[i].ilen,
  609. iv);
  610. aead_request_set_ad(req, template[i].alen);
  611. ret = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
  612. switch (ret) {
  613. case 0:
  614. if (template[i].novrfy) {
  615. /* verification was supposed to fail */
  616. pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret was 0, expected -EBADMSG\n",
  617. d, e, j, algo);
  618. /* so really, we got a bad message */
  619. ret = -EBADMSG;
  620. goto out;
  621. }
  622. break;
  623. case -EINPROGRESS:
  624. case -EBUSY:
  625. wait_for_completion(&result.completion);
  626. reinit_completion(&result.completion);
  627. ret = result.err;
  628. if (!ret)
  629. break;
  630. case -EBADMSG:
  631. if (template[i].novrfy)
  632. /* verification failure was expected */
  633. continue;
  634. /* fall through */
  635. default:
  636. pr_err("alg: aead%s: %s failed on chunk test %d for %s: ret=%d\n",
  637. d, e, j, algo, -ret);
  638. goto out;
  639. }
  640. ret = -EINVAL;
  641. for (k = 0, temp = 0; k < template[i].np; k++) {
  642. if (diff_dst)
  643. q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
  644. offset_in_page(IDX[k]);
  645. else
  646. q = xbuf[IDX[k] >> PAGE_SHIFT] +
  647. offset_in_page(IDX[k]);
  648. n = template[i].tap[k];
  649. if (k == template[i].np - 1)
  650. n += enc ? authsize : -authsize;
  651. if (memcmp(q, template[i].result + temp, n)) {
  652. pr_err("alg: aead%s: Chunk test %d failed on %s at page %u for %s\n",
  653. d, j, e, k, algo);
  654. hexdump(q, n);
  655. goto out;
  656. }
  657. q += n;
  658. if (k == template[i].np - 1 && !enc) {
  659. if (!diff_dst &&
  660. memcmp(q, template[i].input +
  661. temp + n, authsize))
  662. n = authsize;
  663. else
  664. n = 0;
  665. } else {
  666. for (n = 0; offset_in_page(q + n) && q[n]; n++)
  667. ;
  668. }
  669. if (n) {
  670. pr_err("alg: aead%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
  671. d, j, e, k, algo, n);
  672. hexdump(q, n);
  673. goto out;
  674. }
  675. temp += template[i].tap[k];
  676. }
  677. }
  678. ret = 0;
  679. out:
  680. aead_request_free(req);
  681. kfree(sg);
  682. out_nosg:
  683. if (diff_dst)
  684. testmgr_free_buf(xoutbuf);
  685. out_nooutbuf:
  686. testmgr_free_buf(axbuf);
  687. out_noaxbuf:
  688. testmgr_free_buf(xbuf);
  689. out_noxbuf:
  690. kfree(key);
  691. kfree(iv);
  692. return ret;
  693. }
  694. static int test_aead(struct crypto_aead *tfm, int enc,
  695. struct aead_testvec *template, unsigned int tcount)
  696. {
  697. unsigned int alignmask;
  698. int ret;
  699. /* test 'dst == src' case */
  700. ret = __test_aead(tfm, enc, template, tcount, false, 0);
  701. if (ret)
  702. return ret;
  703. /* test 'dst != src' case */
  704. ret = __test_aead(tfm, enc, template, tcount, true, 0);
  705. if (ret)
  706. return ret;
  707. /* test unaligned buffers, check with one byte offset */
  708. ret = __test_aead(tfm, enc, template, tcount, true, 1);
  709. if (ret)
  710. return ret;
  711. alignmask = crypto_tfm_alg_alignmask(&tfm->base);
  712. if (alignmask) {
  713. /* Check if alignment mask for tfm is correctly set. */
  714. ret = __test_aead(tfm, enc, template, tcount, true,
  715. alignmask + 1);
  716. if (ret)
  717. return ret;
  718. }
  719. return 0;
  720. }
  721. static int test_cipher(struct crypto_cipher *tfm, int enc,
  722. struct cipher_testvec *template, unsigned int tcount)
  723. {
  724. const char *algo = crypto_tfm_alg_driver_name(crypto_cipher_tfm(tfm));
  725. unsigned int i, j, k;
  726. char *q;
  727. const char *e;
  728. void *data;
  729. char *xbuf[XBUFSIZE];
  730. int ret = -ENOMEM;
  731. if (testmgr_alloc_buf(xbuf))
  732. goto out_nobuf;
  733. if (enc == ENCRYPT)
  734. e = "encryption";
  735. else
  736. e = "decryption";
  737. j = 0;
  738. for (i = 0; i < tcount; i++) {
  739. if (template[i].np)
  740. continue;
  741. j++;
  742. ret = -EINVAL;
  743. if (WARN_ON(template[i].ilen > PAGE_SIZE))
  744. goto out;
  745. data = xbuf[0];
  746. memcpy(data, template[i].input, template[i].ilen);
  747. crypto_cipher_clear_flags(tfm, ~0);
  748. if (template[i].wk)
  749. crypto_cipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
  750. ret = crypto_cipher_setkey(tfm, template[i].key,
  751. template[i].klen);
  752. if (!ret == template[i].fail) {
  753. printk(KERN_ERR "alg: cipher: setkey failed "
  754. "on test %d for %s: flags=%x\n", j,
  755. algo, crypto_cipher_get_flags(tfm));
  756. goto out;
  757. } else if (ret)
  758. continue;
  759. for (k = 0; k < template[i].ilen;
  760. k += crypto_cipher_blocksize(tfm)) {
  761. if (enc)
  762. crypto_cipher_encrypt_one(tfm, data + k,
  763. data + k);
  764. else
  765. crypto_cipher_decrypt_one(tfm, data + k,
  766. data + k);
  767. }
  768. q = data;
  769. if (memcmp(q, template[i].result, template[i].rlen)) {
  770. printk(KERN_ERR "alg: cipher: Test %d failed "
  771. "on %s for %s\n", j, e, algo);
  772. hexdump(q, template[i].rlen);
  773. ret = -EINVAL;
  774. goto out;
  775. }
  776. }
  777. ret = 0;
  778. out:
  779. testmgr_free_buf(xbuf);
  780. out_nobuf:
  781. return ret;
  782. }
  783. static int __test_skcipher(struct crypto_ablkcipher *tfm, int enc,
  784. struct cipher_testvec *template, unsigned int tcount,
  785. const bool diff_dst, const int align_offset)
  786. {
  787. const char *algo =
  788. crypto_tfm_alg_driver_name(crypto_ablkcipher_tfm(tfm));
  789. unsigned int i, j, k, n, temp;
  790. char *q;
  791. struct ablkcipher_request *req;
  792. struct scatterlist sg[8];
  793. struct scatterlist sgout[8];
  794. const char *e, *d;
  795. struct tcrypt_result result;
  796. void *data;
  797. char iv[MAX_IVLEN];
  798. char *xbuf[XBUFSIZE];
  799. char *xoutbuf[XBUFSIZE];
  800. int ret = -ENOMEM;
  801. if (testmgr_alloc_buf(xbuf))
  802. goto out_nobuf;
  803. if (diff_dst && testmgr_alloc_buf(xoutbuf))
  804. goto out_nooutbuf;
  805. if (diff_dst)
  806. d = "-ddst";
  807. else
  808. d = "";
  809. if (enc == ENCRYPT)
  810. e = "encryption";
  811. else
  812. e = "decryption";
  813. init_completion(&result.completion);
  814. req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
  815. if (!req) {
  816. pr_err("alg: skcipher%s: Failed to allocate request for %s\n",
  817. d, algo);
  818. goto out;
  819. }
  820. ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
  821. tcrypt_complete, &result);
  822. j = 0;
  823. for (i = 0; i < tcount; i++) {
  824. if (template[i].np && !template[i].also_non_np)
  825. continue;
  826. if (template[i].iv)
  827. memcpy(iv, template[i].iv, MAX_IVLEN);
  828. else
  829. memset(iv, 0, MAX_IVLEN);
  830. j++;
  831. ret = -EINVAL;
  832. if (WARN_ON(align_offset + template[i].ilen > PAGE_SIZE))
  833. goto out;
  834. data = xbuf[0];
  835. data += align_offset;
  836. memcpy(data, template[i].input, template[i].ilen);
  837. crypto_ablkcipher_clear_flags(tfm, ~0);
  838. if (template[i].wk)
  839. crypto_ablkcipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
  840. ret = crypto_ablkcipher_setkey(tfm, template[i].key,
  841. template[i].klen);
  842. if (!ret == template[i].fail) {
  843. pr_err("alg: skcipher%s: setkey failed on test %d for %s: flags=%x\n",
  844. d, j, algo, crypto_ablkcipher_get_flags(tfm));
  845. goto out;
  846. } else if (ret)
  847. continue;
  848. sg_init_one(&sg[0], data, template[i].ilen);
  849. if (diff_dst) {
  850. data = xoutbuf[0];
  851. data += align_offset;
  852. sg_init_one(&sgout[0], data, template[i].ilen);
  853. }
  854. ablkcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
  855. template[i].ilen, iv);
  856. ret = enc ? crypto_ablkcipher_encrypt(req) :
  857. crypto_ablkcipher_decrypt(req);
  858. switch (ret) {
  859. case 0:
  860. break;
  861. case -EINPROGRESS:
  862. case -EBUSY:
  863. wait_for_completion(&result.completion);
  864. reinit_completion(&result.completion);
  865. ret = result.err;
  866. if (!ret)
  867. break;
  868. /* fall through */
  869. default:
  870. pr_err("alg: skcipher%s: %s failed on test %d for %s: ret=%d\n",
  871. d, e, j, algo, -ret);
  872. goto out;
  873. }
  874. q = data;
  875. if (memcmp(q, template[i].result, template[i].rlen)) {
  876. pr_err("alg: skcipher%s: Test %d failed on %s for %s\n",
  877. d, j, e, algo);
  878. hexdump(q, template[i].rlen);
  879. ret = -EINVAL;
  880. goto out;
  881. }
  882. }
  883. j = 0;
  884. for (i = 0; i < tcount; i++) {
  885. /* alignment tests are only done with continuous buffers */
  886. if (align_offset != 0)
  887. break;
  888. if (!template[i].np)
  889. continue;
  890. if (template[i].iv)
  891. memcpy(iv, template[i].iv, MAX_IVLEN);
  892. else
  893. memset(iv, 0, MAX_IVLEN);
  894. j++;
  895. crypto_ablkcipher_clear_flags(tfm, ~0);
  896. if (template[i].wk)
  897. crypto_ablkcipher_set_flags(tfm, CRYPTO_TFM_REQ_WEAK_KEY);
  898. ret = crypto_ablkcipher_setkey(tfm, template[i].key,
  899. template[i].klen);
  900. if (!ret == template[i].fail) {
  901. pr_err("alg: skcipher%s: setkey failed on chunk test %d for %s: flags=%x\n",
  902. d, j, algo, crypto_ablkcipher_get_flags(tfm));
  903. goto out;
  904. } else if (ret)
  905. continue;
  906. temp = 0;
  907. ret = -EINVAL;
  908. sg_init_table(sg, template[i].np);
  909. if (diff_dst)
  910. sg_init_table(sgout, template[i].np);
  911. for (k = 0; k < template[i].np; k++) {
  912. if (WARN_ON(offset_in_page(IDX[k]) +
  913. template[i].tap[k] > PAGE_SIZE))
  914. goto out;
  915. q = xbuf[IDX[k] >> PAGE_SHIFT] + offset_in_page(IDX[k]);
  916. memcpy(q, template[i].input + temp, template[i].tap[k]);
  917. if (offset_in_page(q) + template[i].tap[k] < PAGE_SIZE)
  918. q[template[i].tap[k]] = 0;
  919. sg_set_buf(&sg[k], q, template[i].tap[k]);
  920. if (diff_dst) {
  921. q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
  922. offset_in_page(IDX[k]);
  923. sg_set_buf(&sgout[k], q, template[i].tap[k]);
  924. memset(q, 0, template[i].tap[k]);
  925. if (offset_in_page(q) +
  926. template[i].tap[k] < PAGE_SIZE)
  927. q[template[i].tap[k]] = 0;
  928. }
  929. temp += template[i].tap[k];
  930. }
  931. ablkcipher_request_set_crypt(req, sg, (diff_dst) ? sgout : sg,
  932. template[i].ilen, iv);
  933. ret = enc ? crypto_ablkcipher_encrypt(req) :
  934. crypto_ablkcipher_decrypt(req);
  935. switch (ret) {
  936. case 0:
  937. break;
  938. case -EINPROGRESS:
  939. case -EBUSY:
  940. wait_for_completion(&result.completion);
  941. reinit_completion(&result.completion);
  942. ret = result.err;
  943. if (!ret)
  944. break;
  945. /* fall through */
  946. default:
  947. pr_err("alg: skcipher%s: %s failed on chunk test %d for %s: ret=%d\n",
  948. d, e, j, algo, -ret);
  949. goto out;
  950. }
  951. temp = 0;
  952. ret = -EINVAL;
  953. for (k = 0; k < template[i].np; k++) {
  954. if (diff_dst)
  955. q = xoutbuf[IDX[k] >> PAGE_SHIFT] +
  956. offset_in_page(IDX[k]);
  957. else
  958. q = xbuf[IDX[k] >> PAGE_SHIFT] +
  959. offset_in_page(IDX[k]);
  960. if (memcmp(q, template[i].result + temp,
  961. template[i].tap[k])) {
  962. pr_err("alg: skcipher%s: Chunk test %d failed on %s at page %u for %s\n",
  963. d, j, e, k, algo);
  964. hexdump(q, template[i].tap[k]);
  965. goto out;
  966. }
  967. q += template[i].tap[k];
  968. for (n = 0; offset_in_page(q + n) && q[n]; n++)
  969. ;
  970. if (n) {
  971. pr_err("alg: skcipher%s: Result buffer corruption in chunk test %d on %s at page %u for %s: %u bytes:\n",
  972. d, j, e, k, algo, n);
  973. hexdump(q, n);
  974. goto out;
  975. }
  976. temp += template[i].tap[k];
  977. }
  978. }
  979. ret = 0;
  980. out:
  981. ablkcipher_request_free(req);
  982. if (diff_dst)
  983. testmgr_free_buf(xoutbuf);
  984. out_nooutbuf:
  985. testmgr_free_buf(xbuf);
  986. out_nobuf:
  987. return ret;
  988. }
  989. static int test_skcipher(struct crypto_ablkcipher *tfm, int enc,
  990. struct cipher_testvec *template, unsigned int tcount)
  991. {
  992. unsigned int alignmask;
  993. int ret;
  994. /* test 'dst == src' case */
  995. ret = __test_skcipher(tfm, enc, template, tcount, false, 0);
  996. if (ret)
  997. return ret;
  998. /* test 'dst != src' case */
  999. ret = __test_skcipher(tfm, enc, template, tcount, true, 0);
  1000. if (ret)
  1001. return ret;
  1002. /* test unaligned buffers, check with one byte offset */
  1003. ret = __test_skcipher(tfm, enc, template, tcount, true, 1);
  1004. if (ret)
  1005. return ret;
  1006. alignmask = crypto_tfm_alg_alignmask(&tfm->base);
  1007. if (alignmask) {
  1008. /* Check if alignment mask for tfm is correctly set. */
  1009. ret = __test_skcipher(tfm, enc, template, tcount, true,
  1010. alignmask + 1);
  1011. if (ret)
  1012. return ret;
  1013. }
  1014. return 0;
  1015. }
  1016. static int test_comp(struct crypto_comp *tfm, struct comp_testvec *ctemplate,
  1017. struct comp_testvec *dtemplate, int ctcount, int dtcount)
  1018. {
  1019. const char *algo = crypto_tfm_alg_driver_name(crypto_comp_tfm(tfm));
  1020. unsigned int i;
  1021. char result[COMP_BUF_SIZE];
  1022. int ret;
  1023. for (i = 0; i < ctcount; i++) {
  1024. int ilen;
  1025. unsigned int dlen = COMP_BUF_SIZE;
  1026. memset(result, 0, sizeof (result));
  1027. ilen = ctemplate[i].inlen;
  1028. ret = crypto_comp_compress(tfm, ctemplate[i].input,
  1029. ilen, result, &dlen);
  1030. if (ret) {
  1031. printk(KERN_ERR "alg: comp: compression failed "
  1032. "on test %d for %s: ret=%d\n", i + 1, algo,
  1033. -ret);
  1034. goto out;
  1035. }
  1036. if (dlen != ctemplate[i].outlen) {
  1037. printk(KERN_ERR "alg: comp: Compression test %d "
  1038. "failed for %s: output len = %d\n", i + 1, algo,
  1039. dlen);
  1040. ret = -EINVAL;
  1041. goto out;
  1042. }
  1043. if (memcmp(result, ctemplate[i].output, dlen)) {
  1044. printk(KERN_ERR "alg: comp: Compression test %d "
  1045. "failed for %s\n", i + 1, algo);
  1046. hexdump(result, dlen);
  1047. ret = -EINVAL;
  1048. goto out;
  1049. }
  1050. }
  1051. for (i = 0; i < dtcount; i++) {
  1052. int ilen;
  1053. unsigned int dlen = COMP_BUF_SIZE;
  1054. memset(result, 0, sizeof (result));
  1055. ilen = dtemplate[i].inlen;
  1056. ret = crypto_comp_decompress(tfm, dtemplate[i].input,
  1057. ilen, result, &dlen);
  1058. if (ret) {
  1059. printk(KERN_ERR "alg: comp: decompression failed "
  1060. "on test %d for %s: ret=%d\n", i + 1, algo,
  1061. -ret);
  1062. goto out;
  1063. }
  1064. if (dlen != dtemplate[i].outlen) {
  1065. printk(KERN_ERR "alg: comp: Decompression test %d "
  1066. "failed for %s: output len = %d\n", i + 1, algo,
  1067. dlen);
  1068. ret = -EINVAL;
  1069. goto out;
  1070. }
  1071. if (memcmp(result, dtemplate[i].output, dlen)) {
  1072. printk(KERN_ERR "alg: comp: Decompression test %d "
  1073. "failed for %s\n", i + 1, algo);
  1074. hexdump(result, dlen);
  1075. ret = -EINVAL;
  1076. goto out;
  1077. }
  1078. }
  1079. ret = 0;
  1080. out:
  1081. return ret;
  1082. }
  1083. static int test_pcomp(struct crypto_pcomp *tfm,
  1084. struct pcomp_testvec *ctemplate,
  1085. struct pcomp_testvec *dtemplate, int ctcount,
  1086. int dtcount)
  1087. {
  1088. const char *algo = crypto_tfm_alg_driver_name(crypto_pcomp_tfm(tfm));
  1089. unsigned int i;
  1090. char result[COMP_BUF_SIZE];
  1091. int res;
  1092. for (i = 0; i < ctcount; i++) {
  1093. struct comp_request req;
  1094. unsigned int produced = 0;
  1095. res = crypto_compress_setup(tfm, ctemplate[i].params,
  1096. ctemplate[i].paramsize);
  1097. if (res) {
  1098. pr_err("alg: pcomp: compression setup failed on test "
  1099. "%d for %s: error=%d\n", i + 1, algo, res);
  1100. return res;
  1101. }
  1102. res = crypto_compress_init(tfm);
  1103. if (res) {
  1104. pr_err("alg: pcomp: compression init failed on test "
  1105. "%d for %s: error=%d\n", i + 1, algo, res);
  1106. return res;
  1107. }
  1108. memset(result, 0, sizeof(result));
  1109. req.next_in = ctemplate[i].input;
  1110. req.avail_in = ctemplate[i].inlen / 2;
  1111. req.next_out = result;
  1112. req.avail_out = ctemplate[i].outlen / 2;
  1113. res = crypto_compress_update(tfm, &req);
  1114. if (res < 0 && (res != -EAGAIN || req.avail_in)) {
  1115. pr_err("alg: pcomp: compression update failed on test "
  1116. "%d for %s: error=%d\n", i + 1, algo, res);
  1117. return res;
  1118. }
  1119. if (res > 0)
  1120. produced += res;
  1121. /* Add remaining input data */
  1122. req.avail_in += (ctemplate[i].inlen + 1) / 2;
  1123. res = crypto_compress_update(tfm, &req);
  1124. if (res < 0 && (res != -EAGAIN || req.avail_in)) {
  1125. pr_err("alg: pcomp: compression update failed on test "
  1126. "%d for %s: error=%d\n", i + 1, algo, res);
  1127. return res;
  1128. }
  1129. if (res > 0)
  1130. produced += res;
  1131. /* Provide remaining output space */
  1132. req.avail_out += COMP_BUF_SIZE - ctemplate[i].outlen / 2;
  1133. res = crypto_compress_final(tfm, &req);
  1134. if (res < 0) {
  1135. pr_err("alg: pcomp: compression final failed on test "
  1136. "%d for %s: error=%d\n", i + 1, algo, res);
  1137. return res;
  1138. }
  1139. produced += res;
  1140. if (COMP_BUF_SIZE - req.avail_out != ctemplate[i].outlen) {
  1141. pr_err("alg: comp: Compression test %d failed for %s: "
  1142. "output len = %d (expected %d)\n", i + 1, algo,
  1143. COMP_BUF_SIZE - req.avail_out,
  1144. ctemplate[i].outlen);
  1145. return -EINVAL;
  1146. }
  1147. if (produced != ctemplate[i].outlen) {
  1148. pr_err("alg: comp: Compression test %d failed for %s: "
  1149. "returned len = %u (expected %d)\n", i + 1,
  1150. algo, produced, ctemplate[i].outlen);
  1151. return -EINVAL;
  1152. }
  1153. if (memcmp(result, ctemplate[i].output, ctemplate[i].outlen)) {
  1154. pr_err("alg: pcomp: Compression test %d failed for "
  1155. "%s\n", i + 1, algo);
  1156. hexdump(result, ctemplate[i].outlen);
  1157. return -EINVAL;
  1158. }
  1159. }
  1160. for (i = 0; i < dtcount; i++) {
  1161. struct comp_request req;
  1162. unsigned int produced = 0;
  1163. res = crypto_decompress_setup(tfm, dtemplate[i].params,
  1164. dtemplate[i].paramsize);
  1165. if (res) {
  1166. pr_err("alg: pcomp: decompression setup failed on "
  1167. "test %d for %s: error=%d\n", i + 1, algo, res);
  1168. return res;
  1169. }
  1170. res = crypto_decompress_init(tfm);
  1171. if (res) {
  1172. pr_err("alg: pcomp: decompression init failed on test "
  1173. "%d for %s: error=%d\n", i + 1, algo, res);
  1174. return res;
  1175. }
  1176. memset(result, 0, sizeof(result));
  1177. req.next_in = dtemplate[i].input;
  1178. req.avail_in = dtemplate[i].inlen / 2;
  1179. req.next_out = result;
  1180. req.avail_out = dtemplate[i].outlen / 2;
  1181. res = crypto_decompress_update(tfm, &req);
  1182. if (res < 0 && (res != -EAGAIN || req.avail_in)) {
  1183. pr_err("alg: pcomp: decompression update failed on "
  1184. "test %d for %s: error=%d\n", i + 1, algo, res);
  1185. return res;
  1186. }
  1187. if (res > 0)
  1188. produced += res;
  1189. /* Add remaining input data */
  1190. req.avail_in += (dtemplate[i].inlen + 1) / 2;
  1191. res = crypto_decompress_update(tfm, &req);
  1192. if (res < 0 && (res != -EAGAIN || req.avail_in)) {
  1193. pr_err("alg: pcomp: decompression update failed on "
  1194. "test %d for %s: error=%d\n", i + 1, algo, res);
  1195. return res;
  1196. }
  1197. if (res > 0)
  1198. produced += res;
  1199. /* Provide remaining output space */
  1200. req.avail_out += COMP_BUF_SIZE - dtemplate[i].outlen / 2;
  1201. res = crypto_decompress_final(tfm, &req);
  1202. if (res < 0 && (res != -EAGAIN || req.avail_in)) {
  1203. pr_err("alg: pcomp: decompression final failed on "
  1204. "test %d for %s: error=%d\n", i + 1, algo, res);
  1205. return res;
  1206. }
  1207. if (res > 0)
  1208. produced += res;
  1209. if (COMP_BUF_SIZE - req.avail_out != dtemplate[i].outlen) {
  1210. pr_err("alg: comp: Decompression test %d failed for "
  1211. "%s: output len = %d (expected %d)\n", i + 1,
  1212. algo, COMP_BUF_SIZE - req.avail_out,
  1213. dtemplate[i].outlen);
  1214. return -EINVAL;
  1215. }
  1216. if (produced != dtemplate[i].outlen) {
  1217. pr_err("alg: comp: Decompression test %d failed for "
  1218. "%s: returned len = %u (expected %d)\n", i + 1,
  1219. algo, produced, dtemplate[i].outlen);
  1220. return -EINVAL;
  1221. }
  1222. if (memcmp(result, dtemplate[i].output, dtemplate[i].outlen)) {
  1223. pr_err("alg: pcomp: Decompression test %d failed for "
  1224. "%s\n", i + 1, algo);
  1225. hexdump(result, dtemplate[i].outlen);
  1226. return -EINVAL;
  1227. }
  1228. }
  1229. return 0;
  1230. }
  1231. static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template,
  1232. unsigned int tcount)
  1233. {
  1234. const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm));
  1235. int err = 0, i, j, seedsize;
  1236. u8 *seed;
  1237. char result[32];
  1238. seedsize = crypto_rng_seedsize(tfm);
  1239. seed = kmalloc(seedsize, GFP_KERNEL);
  1240. if (!seed) {
  1241. printk(KERN_ERR "alg: cprng: Failed to allocate seed space "
  1242. "for %s\n", algo);
  1243. return -ENOMEM;
  1244. }
  1245. for (i = 0; i < tcount; i++) {
  1246. memset(result, 0, 32);
  1247. memcpy(seed, template[i].v, template[i].vlen);
  1248. memcpy(seed + template[i].vlen, template[i].key,
  1249. template[i].klen);
  1250. memcpy(seed + template[i].vlen + template[i].klen,
  1251. template[i].dt, template[i].dtlen);
  1252. err = crypto_rng_reset(tfm, seed, seedsize);
  1253. if (err) {
  1254. printk(KERN_ERR "alg: cprng: Failed to reset rng "
  1255. "for %s\n", algo);
  1256. goto out;
  1257. }
  1258. for (j = 0; j < template[i].loops; j++) {
  1259. err = crypto_rng_get_bytes(tfm, result,
  1260. template[i].rlen);
  1261. if (err < 0) {
  1262. printk(KERN_ERR "alg: cprng: Failed to obtain "
  1263. "the correct amount of random data for "
  1264. "%s (requested %d)\n", algo,
  1265. template[i].rlen);
  1266. goto out;
  1267. }
  1268. }
  1269. err = memcmp(result, template[i].result,
  1270. template[i].rlen);
  1271. if (err) {
  1272. printk(KERN_ERR "alg: cprng: Test %d failed for %s\n",
  1273. i, algo);
  1274. hexdump(result, template[i].rlen);
  1275. err = -EINVAL;
  1276. goto out;
  1277. }
  1278. }
  1279. out:
  1280. kfree(seed);
  1281. return err;
  1282. }
  1283. static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
  1284. u32 type, u32 mask)
  1285. {
  1286. struct crypto_aead *tfm;
  1287. int err = 0;
  1288. tfm = crypto_alloc_aead(driver, type | CRYPTO_ALG_INTERNAL, mask);
  1289. if (IS_ERR(tfm)) {
  1290. printk(KERN_ERR "alg: aead: Failed to load transform for %s: "
  1291. "%ld\n", driver, PTR_ERR(tfm));
  1292. return PTR_ERR(tfm);
  1293. }
  1294. if (desc->suite.aead.enc.vecs) {
  1295. err = test_aead(tfm, ENCRYPT, desc->suite.aead.enc.vecs,
  1296. desc->suite.aead.enc.count);
  1297. if (err)
  1298. goto out;
  1299. }
  1300. if (!err && desc->suite.aead.dec.vecs)
  1301. err = test_aead(tfm, DECRYPT, desc->suite.aead.dec.vecs,
  1302. desc->suite.aead.dec.count);
  1303. out:
  1304. crypto_free_aead(tfm);
  1305. return err;
  1306. }
  1307. static int alg_test_cipher(const struct alg_test_desc *desc,
  1308. const char *driver, u32 type, u32 mask)
  1309. {
  1310. struct crypto_cipher *tfm;
  1311. int err = 0;
  1312. tfm = crypto_alloc_cipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
  1313. if (IS_ERR(tfm)) {
  1314. printk(KERN_ERR "alg: cipher: Failed to load transform for "
  1315. "%s: %ld\n", driver, PTR_ERR(tfm));
  1316. return PTR_ERR(tfm);
  1317. }
  1318. if (desc->suite.cipher.enc.vecs) {
  1319. err = test_cipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
  1320. desc->suite.cipher.enc.count);
  1321. if (err)
  1322. goto out;
  1323. }
  1324. if (desc->suite.cipher.dec.vecs)
  1325. err = test_cipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
  1326. desc->suite.cipher.dec.count);
  1327. out:
  1328. crypto_free_cipher(tfm);
  1329. return err;
  1330. }
  1331. static int alg_test_skcipher(const struct alg_test_desc *desc,
  1332. const char *driver, u32 type, u32 mask)
  1333. {
  1334. struct crypto_ablkcipher *tfm;
  1335. int err = 0;
  1336. tfm = crypto_alloc_ablkcipher(driver, type | CRYPTO_ALG_INTERNAL, mask);
  1337. if (IS_ERR(tfm)) {
  1338. printk(KERN_ERR "alg: skcipher: Failed to load transform for "
  1339. "%s: %ld\n", driver, PTR_ERR(tfm));
  1340. return PTR_ERR(tfm);
  1341. }
  1342. if (desc->suite.cipher.enc.vecs) {
  1343. err = test_skcipher(tfm, ENCRYPT, desc->suite.cipher.enc.vecs,
  1344. desc->suite.cipher.enc.count);
  1345. if (err)
  1346. goto out;
  1347. }
  1348. if (desc->suite.cipher.dec.vecs)
  1349. err = test_skcipher(tfm, DECRYPT, desc->suite.cipher.dec.vecs,
  1350. desc->suite.cipher.dec.count);
  1351. out:
  1352. crypto_free_ablkcipher(tfm);
  1353. return err;
  1354. }
  1355. static int alg_test_comp(const struct alg_test_desc *desc, const char *driver,
  1356. u32 type, u32 mask)
  1357. {
  1358. struct crypto_comp *tfm;
  1359. int err;
  1360. tfm = crypto_alloc_comp(driver, type, mask);
  1361. if (IS_ERR(tfm)) {
  1362. printk(KERN_ERR "alg: comp: Failed to load transform for %s: "
  1363. "%ld\n", driver, PTR_ERR(tfm));
  1364. return PTR_ERR(tfm);
  1365. }
  1366. err = test_comp(tfm, desc->suite.comp.comp.vecs,
  1367. desc->suite.comp.decomp.vecs,
  1368. desc->suite.comp.comp.count,
  1369. desc->suite.comp.decomp.count);
  1370. crypto_free_comp(tfm);
  1371. return err;
  1372. }
  1373. static int alg_test_pcomp(const struct alg_test_desc *desc, const char *driver,
  1374. u32 type, u32 mask)
  1375. {
  1376. struct crypto_pcomp *tfm;
  1377. int err;
  1378. tfm = crypto_alloc_pcomp(driver, type, mask);
  1379. if (IS_ERR(tfm)) {
  1380. pr_err("alg: pcomp: Failed to load transform for %s: %ld\n",
  1381. driver, PTR_ERR(tfm));
  1382. return PTR_ERR(tfm);
  1383. }
  1384. err = test_pcomp(tfm, desc->suite.pcomp.comp.vecs,
  1385. desc->suite.pcomp.decomp.vecs,
  1386. desc->suite.pcomp.comp.count,
  1387. desc->suite.pcomp.decomp.count);
  1388. crypto_free_pcomp(tfm);
  1389. return err;
  1390. }
  1391. static int alg_test_hash(const struct alg_test_desc *desc, const char *driver,
  1392. u32 type, u32 mask)
  1393. {
  1394. struct crypto_ahash *tfm;
  1395. int err;
  1396. tfm = crypto_alloc_ahash(driver, type | CRYPTO_ALG_INTERNAL, mask);
  1397. if (IS_ERR(tfm)) {
  1398. printk(KERN_ERR "alg: hash: Failed to load transform for %s: "
  1399. "%ld\n", driver, PTR_ERR(tfm));
  1400. return PTR_ERR(tfm);
  1401. }
  1402. err = test_hash(tfm, desc->suite.hash.vecs,
  1403. desc->suite.hash.count, true);
  1404. if (!err)
  1405. err = test_hash(tfm, desc->suite.hash.vecs,
  1406. desc->suite.hash.count, false);
  1407. crypto_free_ahash(tfm);
  1408. return err;
  1409. }
  1410. static int alg_test_crc32c(const struct alg_test_desc *desc,
  1411. const char *driver, u32 type, u32 mask)
  1412. {
  1413. struct crypto_shash *tfm;
  1414. u32 val;
  1415. int err;
  1416. err = alg_test_hash(desc, driver, type, mask);
  1417. if (err)
  1418. goto out;
  1419. tfm = crypto_alloc_shash(driver, type | CRYPTO_ALG_INTERNAL, mask);
  1420. if (IS_ERR(tfm)) {
  1421. printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: "
  1422. "%ld\n", driver, PTR_ERR(tfm));
  1423. err = PTR_ERR(tfm);
  1424. goto out;
  1425. }
  1426. do {
  1427. SHASH_DESC_ON_STACK(shash, tfm);
  1428. u32 *ctx = (u32 *)shash_desc_ctx(shash);
  1429. shash->tfm = tfm;
  1430. shash->flags = 0;
  1431. *ctx = le32_to_cpu(420553207);
  1432. err = crypto_shash_final(shash, (u8 *)&val);
  1433. if (err) {
  1434. printk(KERN_ERR "alg: crc32c: Operation failed for "
  1435. "%s: %d\n", driver, err);
  1436. break;
  1437. }
  1438. if (val != ~420553207) {
  1439. printk(KERN_ERR "alg: crc32c: Test failed for %s: "
  1440. "%d\n", driver, val);
  1441. err = -EINVAL;
  1442. }
  1443. } while (0);
  1444. crypto_free_shash(tfm);
  1445. out:
  1446. return err;
  1447. }
  1448. static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver,
  1449. u32 type, u32 mask)
  1450. {
  1451. struct crypto_rng *rng;
  1452. int err;
  1453. rng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
  1454. if (IS_ERR(rng)) {
  1455. printk(KERN_ERR "alg: cprng: Failed to load transform for %s: "
  1456. "%ld\n", driver, PTR_ERR(rng));
  1457. return PTR_ERR(rng);
  1458. }
  1459. err = test_cprng(rng, desc->suite.cprng.vecs, desc->suite.cprng.count);
  1460. crypto_free_rng(rng);
  1461. return err;
  1462. }
  1463. static int drbg_cavs_test(struct drbg_testvec *test, int pr,
  1464. const char *driver, u32 type, u32 mask)
  1465. {
  1466. int ret = -EAGAIN;
  1467. struct crypto_rng *drng;
  1468. struct drbg_test_data test_data;
  1469. struct drbg_string addtl, pers, testentropy;
  1470. unsigned char *buf = kzalloc(test->expectedlen, GFP_KERNEL);
  1471. if (!buf)
  1472. return -ENOMEM;
  1473. drng = crypto_alloc_rng(driver, type | CRYPTO_ALG_INTERNAL, mask);
  1474. if (IS_ERR(drng)) {
  1475. printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
  1476. "%s\n", driver);
  1477. kzfree(buf);
  1478. return -ENOMEM;
  1479. }
  1480. test_data.testentropy = &testentropy;
  1481. drbg_string_fill(&testentropy, test->entropy, test->entropylen);
  1482. drbg_string_fill(&pers, test->pers, test->perslen);
  1483. ret = crypto_drbg_reset_test(drng, &pers, &test_data);
  1484. if (ret) {
  1485. printk(KERN_ERR "alg: drbg: Failed to reset rng\n");
  1486. goto outbuf;
  1487. }
  1488. drbg_string_fill(&addtl, test->addtla, test->addtllen);
  1489. if (pr) {
  1490. drbg_string_fill(&testentropy, test->entpra, test->entprlen);
  1491. ret = crypto_drbg_get_bytes_addtl_test(drng,
  1492. buf, test->expectedlen, &addtl, &test_data);
  1493. } else {
  1494. ret = crypto_drbg_get_bytes_addtl(drng,
  1495. buf, test->expectedlen, &addtl);
  1496. }
  1497. if (ret < 0) {
  1498. printk(KERN_ERR "alg: drbg: could not obtain random data for "
  1499. "driver %s\n", driver);
  1500. goto outbuf;
  1501. }
  1502. drbg_string_fill(&addtl, test->addtlb, test->addtllen);
  1503. if (pr) {
  1504. drbg_string_fill(&testentropy, test->entprb, test->entprlen);
  1505. ret = crypto_drbg_get_bytes_addtl_test(drng,
  1506. buf, test->expectedlen, &addtl, &test_data);
  1507. } else {
  1508. ret = crypto_drbg_get_bytes_addtl(drng,
  1509. buf, test->expectedlen, &addtl);
  1510. }
  1511. if (ret < 0) {
  1512. printk(KERN_ERR "alg: drbg: could not obtain random data for "
  1513. "driver %s\n", driver);
  1514. goto outbuf;
  1515. }
  1516. ret = memcmp(test->expected, buf, test->expectedlen);
  1517. outbuf:
  1518. crypto_free_rng(drng);
  1519. kzfree(buf);
  1520. return ret;
  1521. }
  1522. static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
  1523. u32 type, u32 mask)
  1524. {
  1525. int err = 0;
  1526. int pr = 0;
  1527. int i = 0;
  1528. struct drbg_testvec *template = desc->suite.drbg.vecs;
  1529. unsigned int tcount = desc->suite.drbg.count;
  1530. if (0 == memcmp(driver, "drbg_pr_", 8))
  1531. pr = 1;
  1532. for (i = 0; i < tcount; i++) {
  1533. err = drbg_cavs_test(&template[i], pr, driver, type, mask);
  1534. if (err) {
  1535. printk(KERN_ERR "alg: drbg: Test %d failed for %s\n",
  1536. i, driver);
  1537. err = -EINVAL;
  1538. break;
  1539. }
  1540. }
  1541. return err;
  1542. }
  1543. static int alg_test_null(const struct alg_test_desc *desc,
  1544. const char *driver, u32 type, u32 mask)
  1545. {
  1546. return 0;
  1547. }
  1548. /* Please keep this list sorted by algorithm name. */
  1549. static const struct alg_test_desc alg_test_descs[] = {
  1550. {
  1551. .alg = "__cbc-cast5-avx",
  1552. .test = alg_test_null,
  1553. }, {
  1554. .alg = "__cbc-cast6-avx",
  1555. .test = alg_test_null,
  1556. }, {
  1557. .alg = "__cbc-serpent-avx",
  1558. .test = alg_test_null,
  1559. }, {
  1560. .alg = "__cbc-serpent-avx2",
  1561. .test = alg_test_null,
  1562. }, {
  1563. .alg = "__cbc-serpent-sse2",
  1564. .test = alg_test_null,
  1565. }, {
  1566. .alg = "__cbc-twofish-avx",
  1567. .test = alg_test_null,
  1568. }, {
  1569. .alg = "__driver-cbc-aes-aesni",
  1570. .test = alg_test_null,
  1571. .fips_allowed = 1,
  1572. }, {
  1573. .alg = "__driver-cbc-camellia-aesni",
  1574. .test = alg_test_null,
  1575. }, {
  1576. .alg = "__driver-cbc-camellia-aesni-avx2",
  1577. .test = alg_test_null,
  1578. }, {
  1579. .alg = "__driver-cbc-cast5-avx",
  1580. .test = alg_test_null,
  1581. }, {
  1582. .alg = "__driver-cbc-cast6-avx",
  1583. .test = alg_test_null,
  1584. }, {
  1585. .alg = "__driver-cbc-serpent-avx",
  1586. .test = alg_test_null,
  1587. }, {
  1588. .alg = "__driver-cbc-serpent-avx2",
  1589. .test = alg_test_null,
  1590. }, {
  1591. .alg = "__driver-cbc-serpent-sse2",
  1592. .test = alg_test_null,
  1593. }, {
  1594. .alg = "__driver-cbc-twofish-avx",
  1595. .test = alg_test_null,
  1596. }, {
  1597. .alg = "__driver-ecb-aes-aesni",
  1598. .test = alg_test_null,
  1599. .fips_allowed = 1,
  1600. }, {
  1601. .alg = "__driver-ecb-camellia-aesni",
  1602. .test = alg_test_null,
  1603. }, {
  1604. .alg = "__driver-ecb-camellia-aesni-avx2",
  1605. .test = alg_test_null,
  1606. }, {
  1607. .alg = "__driver-ecb-cast5-avx",
  1608. .test = alg_test_null,
  1609. }, {
  1610. .alg = "__driver-ecb-cast6-avx",
  1611. .test = alg_test_null,
  1612. }, {
  1613. .alg = "__driver-ecb-serpent-avx",
  1614. .test = alg_test_null,
  1615. }, {
  1616. .alg = "__driver-ecb-serpent-avx2",
  1617. .test = alg_test_null,
  1618. }, {
  1619. .alg = "__driver-ecb-serpent-sse2",
  1620. .test = alg_test_null,
  1621. }, {
  1622. .alg = "__driver-ecb-twofish-avx",
  1623. .test = alg_test_null,
  1624. }, {
  1625. .alg = "__ghash-pclmulqdqni",
  1626. .test = alg_test_null,
  1627. .fips_allowed = 1,
  1628. }, {
  1629. .alg = "ansi_cprng",
  1630. .test = alg_test_cprng,
  1631. .fips_allowed = 1,
  1632. .suite = {
  1633. .cprng = {
  1634. .vecs = ansi_cprng_aes_tv_template,
  1635. .count = ANSI_CPRNG_AES_TEST_VECTORS
  1636. }
  1637. }
  1638. }, {
  1639. .alg = "authenc(hmac(md5),ecb(cipher_null))",
  1640. .test = alg_test_aead,
  1641. .fips_allowed = 1,
  1642. .suite = {
  1643. .aead = {
  1644. .enc = {
  1645. .vecs = hmac_md5_ecb_cipher_null_enc_tv_template,
  1646. .count = HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS
  1647. },
  1648. .dec = {
  1649. .vecs = hmac_md5_ecb_cipher_null_dec_tv_template,
  1650. .count = HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS
  1651. }
  1652. }
  1653. }
  1654. }, {
  1655. .alg = "authenc(hmac(sha1),cbc(aes))",
  1656. .test = alg_test_aead,
  1657. .fips_allowed = 1,
  1658. .suite = {
  1659. .aead = {
  1660. .enc = {
  1661. .vecs =
  1662. hmac_sha1_aes_cbc_enc_tv_temp,
  1663. .count =
  1664. HMAC_SHA1_AES_CBC_ENC_TEST_VEC
  1665. }
  1666. }
  1667. }
  1668. }, {
  1669. .alg = "authenc(hmac(sha1),cbc(des))",
  1670. .test = alg_test_aead,
  1671. .fips_allowed = 1,
  1672. .suite = {
  1673. .aead = {
  1674. .enc = {
  1675. .vecs =
  1676. hmac_sha1_des_cbc_enc_tv_temp,
  1677. .count =
  1678. HMAC_SHA1_DES_CBC_ENC_TEST_VEC
  1679. }
  1680. }
  1681. }
  1682. }, {
  1683. .alg = "authenc(hmac(sha1),cbc(des3_ede))",
  1684. .test = alg_test_aead,
  1685. .fips_allowed = 1,
  1686. .suite = {
  1687. .aead = {
  1688. .enc = {
  1689. .vecs =
  1690. hmac_sha1_des3_ede_cbc_enc_tv_temp,
  1691. .count =
  1692. HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
  1693. }
  1694. }
  1695. }
  1696. }, {
  1697. .alg = "authenc(hmac(sha1),ecb(cipher_null))",
  1698. .test = alg_test_aead,
  1699. .fips_allowed = 1,
  1700. .suite = {
  1701. .aead = {
  1702. .enc = {
  1703. .vecs =
  1704. hmac_sha1_ecb_cipher_null_enc_tv_temp,
  1705. .count =
  1706. HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
  1707. },
  1708. .dec = {
  1709. .vecs =
  1710. hmac_sha1_ecb_cipher_null_dec_tv_temp,
  1711. .count =
  1712. HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
  1713. }
  1714. }
  1715. }
  1716. }, {
  1717. .alg = "authenc(hmac(sha224),cbc(des))",
  1718. .test = alg_test_aead,
  1719. .fips_allowed = 1,
  1720. .suite = {
  1721. .aead = {
  1722. .enc = {
  1723. .vecs =
  1724. hmac_sha224_des_cbc_enc_tv_temp,
  1725. .count =
  1726. HMAC_SHA224_DES_CBC_ENC_TEST_VEC
  1727. }
  1728. }
  1729. }
  1730. }, {
  1731. .alg = "authenc(hmac(sha224),cbc(des3_ede))",
  1732. .test = alg_test_aead,
  1733. .fips_allowed = 1,
  1734. .suite = {
  1735. .aead = {
  1736. .enc = {
  1737. .vecs =
  1738. hmac_sha224_des3_ede_cbc_enc_tv_temp,
  1739. .count =
  1740. HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
  1741. }
  1742. }
  1743. }
  1744. }, {
  1745. .alg = "authenc(hmac(sha256),cbc(aes))",
  1746. .test = alg_test_aead,
  1747. .fips_allowed = 1,
  1748. .suite = {
  1749. .aead = {
  1750. .enc = {
  1751. .vecs =
  1752. hmac_sha256_aes_cbc_enc_tv_temp,
  1753. .count =
  1754. HMAC_SHA256_AES_CBC_ENC_TEST_VEC
  1755. }
  1756. }
  1757. }
  1758. }, {
  1759. .alg = "authenc(hmac(sha256),cbc(des))",
  1760. .test = alg_test_aead,
  1761. .fips_allowed = 1,
  1762. .suite = {
  1763. .aead = {
  1764. .enc = {
  1765. .vecs =
  1766. hmac_sha256_des_cbc_enc_tv_temp,
  1767. .count =
  1768. HMAC_SHA256_DES_CBC_ENC_TEST_VEC
  1769. }
  1770. }
  1771. }
  1772. }, {
  1773. .alg = "authenc(hmac(sha256),cbc(des3_ede))",
  1774. .test = alg_test_aead,
  1775. .fips_allowed = 1,
  1776. .suite = {
  1777. .aead = {
  1778. .enc = {
  1779. .vecs =
  1780. hmac_sha256_des3_ede_cbc_enc_tv_temp,
  1781. .count =
  1782. HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
  1783. }
  1784. }
  1785. }
  1786. }, {
  1787. .alg = "authenc(hmac(sha384),cbc(des))",
  1788. .test = alg_test_aead,
  1789. .fips_allowed = 1,
  1790. .suite = {
  1791. .aead = {
  1792. .enc = {
  1793. .vecs =
  1794. hmac_sha384_des_cbc_enc_tv_temp,
  1795. .count =
  1796. HMAC_SHA384_DES_CBC_ENC_TEST_VEC
  1797. }
  1798. }
  1799. }
  1800. }, {
  1801. .alg = "authenc(hmac(sha384),cbc(des3_ede))",
  1802. .test = alg_test_aead,
  1803. .fips_allowed = 1,
  1804. .suite = {
  1805. .aead = {
  1806. .enc = {
  1807. .vecs =
  1808. hmac_sha384_des3_ede_cbc_enc_tv_temp,
  1809. .count =
  1810. HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC
  1811. }
  1812. }
  1813. }
  1814. }, {
  1815. .alg = "authenc(hmac(sha512),cbc(aes))",
  1816. .test = alg_test_aead,
  1817. .fips_allowed = 1,
  1818. .suite = {
  1819. .aead = {
  1820. .enc = {
  1821. .vecs =
  1822. hmac_sha512_aes_cbc_enc_tv_temp,
  1823. .count =
  1824. HMAC_SHA512_AES_CBC_ENC_TEST_VEC
  1825. }
  1826. }
  1827. }
  1828. }, {
  1829. .alg = "authenc(hmac(sha512),cbc(des))",
  1830. .test = alg_test_aead,
  1831. .fips_allowed = 1,
  1832. .suite = {
  1833. .aead = {
  1834. .enc = {
  1835. .vecs =
  1836. hmac_sha512_des_cbc_enc_tv_temp,
  1837. .count =
  1838. HMAC_SHA512_DES_CBC_ENC_TEST_VEC
  1839. }
  1840. }
  1841. }
  1842. }, {
  1843. .alg = "authenc(hmac(sha512),cbc(des3_ede))",
  1844. .test = alg_test_aead,
  1845. .fips_allowed = 1,
  1846. .suite = {
  1847. .aead = {
  1848. .enc = {
  1849. .vecs =
  1850. hmac_sha512_des3_ede_cbc_enc_tv_temp,
  1851. .count =
  1852. HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
  1853. }
  1854. }
  1855. }
  1856. }, {
  1857. .alg = "cbc(aes)",
  1858. .test = alg_test_skcipher,
  1859. .fips_allowed = 1,
  1860. .suite = {
  1861. .cipher = {
  1862. .enc = {
  1863. .vecs = aes_cbc_enc_tv_template,
  1864. .count = AES_CBC_ENC_TEST_VECTORS
  1865. },
  1866. .dec = {
  1867. .vecs = aes_cbc_dec_tv_template,
  1868. .count = AES_CBC_DEC_TEST_VECTORS
  1869. }
  1870. }
  1871. }
  1872. }, {
  1873. .alg = "cbc(anubis)",
  1874. .test = alg_test_skcipher,
  1875. .suite = {
  1876. .cipher = {
  1877. .enc = {
  1878. .vecs = anubis_cbc_enc_tv_template,
  1879. .count = ANUBIS_CBC_ENC_TEST_VECTORS
  1880. },
  1881. .dec = {
  1882. .vecs = anubis_cbc_dec_tv_template,
  1883. .count = ANUBIS_CBC_DEC_TEST_VECTORS
  1884. }
  1885. }
  1886. }
  1887. }, {
  1888. .alg = "cbc(blowfish)",
  1889. .test = alg_test_skcipher,
  1890. .suite = {
  1891. .cipher = {
  1892. .enc = {
  1893. .vecs = bf_cbc_enc_tv_template,
  1894. .count = BF_CBC_ENC_TEST_VECTORS
  1895. },
  1896. .dec = {
  1897. .vecs = bf_cbc_dec_tv_template,
  1898. .count = BF_CBC_DEC_TEST_VECTORS
  1899. }
  1900. }
  1901. }
  1902. }, {
  1903. .alg = "cbc(camellia)",
  1904. .test = alg_test_skcipher,
  1905. .suite = {
  1906. .cipher = {
  1907. .enc = {
  1908. .vecs = camellia_cbc_enc_tv_template,
  1909. .count = CAMELLIA_CBC_ENC_TEST_VECTORS
  1910. },
  1911. .dec = {
  1912. .vecs = camellia_cbc_dec_tv_template,
  1913. .count = CAMELLIA_CBC_DEC_TEST_VECTORS
  1914. }
  1915. }
  1916. }
  1917. }, {
  1918. .alg = "cbc(cast5)",
  1919. .test = alg_test_skcipher,
  1920. .suite = {
  1921. .cipher = {
  1922. .enc = {
  1923. .vecs = cast5_cbc_enc_tv_template,
  1924. .count = CAST5_CBC_ENC_TEST_VECTORS
  1925. },
  1926. .dec = {
  1927. .vecs = cast5_cbc_dec_tv_template,
  1928. .count = CAST5_CBC_DEC_TEST_VECTORS
  1929. }
  1930. }
  1931. }
  1932. }, {
  1933. .alg = "cbc(cast6)",
  1934. .test = alg_test_skcipher,
  1935. .suite = {
  1936. .cipher = {
  1937. .enc = {
  1938. .vecs = cast6_cbc_enc_tv_template,
  1939. .count = CAST6_CBC_ENC_TEST_VECTORS
  1940. },
  1941. .dec = {
  1942. .vecs = cast6_cbc_dec_tv_template,
  1943. .count = CAST6_CBC_DEC_TEST_VECTORS
  1944. }
  1945. }
  1946. }
  1947. }, {
  1948. .alg = "cbc(des)",
  1949. .test = alg_test_skcipher,
  1950. .suite = {
  1951. .cipher = {
  1952. .enc = {
  1953. .vecs = des_cbc_enc_tv_template,
  1954. .count = DES_CBC_ENC_TEST_VECTORS
  1955. },
  1956. .dec = {
  1957. .vecs = des_cbc_dec_tv_template,
  1958. .count = DES_CBC_DEC_TEST_VECTORS
  1959. }
  1960. }
  1961. }
  1962. }, {
  1963. .alg = "cbc(des3_ede)",
  1964. .test = alg_test_skcipher,
  1965. .fips_allowed = 1,
  1966. .suite = {
  1967. .cipher = {
  1968. .enc = {
  1969. .vecs = des3_ede_cbc_enc_tv_template,
  1970. .count = DES3_EDE_CBC_ENC_TEST_VECTORS
  1971. },
  1972. .dec = {
  1973. .vecs = des3_ede_cbc_dec_tv_template,
  1974. .count = DES3_EDE_CBC_DEC_TEST_VECTORS
  1975. }
  1976. }
  1977. }
  1978. }, {
  1979. .alg = "cbc(serpent)",
  1980. .test = alg_test_skcipher,
  1981. .suite = {
  1982. .cipher = {
  1983. .enc = {
  1984. .vecs = serpent_cbc_enc_tv_template,
  1985. .count = SERPENT_CBC_ENC_TEST_VECTORS
  1986. },
  1987. .dec = {
  1988. .vecs = serpent_cbc_dec_tv_template,
  1989. .count = SERPENT_CBC_DEC_TEST_VECTORS
  1990. }
  1991. }
  1992. }
  1993. }, {
  1994. .alg = "cbc(twofish)",
  1995. .test = alg_test_skcipher,
  1996. .suite = {
  1997. .cipher = {
  1998. .enc = {
  1999. .vecs = tf_cbc_enc_tv_template,
  2000. .count = TF_CBC_ENC_TEST_VECTORS
  2001. },
  2002. .dec = {
  2003. .vecs = tf_cbc_dec_tv_template,
  2004. .count = TF_CBC_DEC_TEST_VECTORS
  2005. }
  2006. }
  2007. }
  2008. }, {
  2009. .alg = "ccm(aes)",
  2010. .test = alg_test_aead,
  2011. .fips_allowed = 1,
  2012. .suite = {
  2013. .aead = {
  2014. .enc = {
  2015. .vecs = aes_ccm_enc_tv_template,
  2016. .count = AES_CCM_ENC_TEST_VECTORS
  2017. },
  2018. .dec = {
  2019. .vecs = aes_ccm_dec_tv_template,
  2020. .count = AES_CCM_DEC_TEST_VECTORS
  2021. }
  2022. }
  2023. }
  2024. }, {
  2025. .alg = "chacha20",
  2026. .test = alg_test_skcipher,
  2027. .suite = {
  2028. .cipher = {
  2029. .enc = {
  2030. .vecs = chacha20_enc_tv_template,
  2031. .count = CHACHA20_ENC_TEST_VECTORS
  2032. },
  2033. .dec = {
  2034. .vecs = chacha20_enc_tv_template,
  2035. .count = CHACHA20_ENC_TEST_VECTORS
  2036. },
  2037. }
  2038. }
  2039. }, {
  2040. .alg = "cmac(aes)",
  2041. .test = alg_test_hash,
  2042. .suite = {
  2043. .hash = {
  2044. .vecs = aes_cmac128_tv_template,
  2045. .count = CMAC_AES_TEST_VECTORS
  2046. }
  2047. }
  2048. }, {
  2049. .alg = "cmac(des3_ede)",
  2050. .test = alg_test_hash,
  2051. .suite = {
  2052. .hash = {
  2053. .vecs = des3_ede_cmac64_tv_template,
  2054. .count = CMAC_DES3_EDE_TEST_VECTORS
  2055. }
  2056. }
  2057. }, {
  2058. .alg = "compress_null",
  2059. .test = alg_test_null,
  2060. }, {
  2061. .alg = "crc32",
  2062. .test = alg_test_hash,
  2063. .suite = {
  2064. .hash = {
  2065. .vecs = crc32_tv_template,
  2066. .count = CRC32_TEST_VECTORS
  2067. }
  2068. }
  2069. }, {
  2070. .alg = "crc32c",
  2071. .test = alg_test_crc32c,
  2072. .fips_allowed = 1,
  2073. .suite = {
  2074. .hash = {
  2075. .vecs = crc32c_tv_template,
  2076. .count = CRC32C_TEST_VECTORS
  2077. }
  2078. }
  2079. }, {
  2080. .alg = "crct10dif",
  2081. .test = alg_test_hash,
  2082. .fips_allowed = 1,
  2083. .suite = {
  2084. .hash = {
  2085. .vecs = crct10dif_tv_template,
  2086. .count = CRCT10DIF_TEST_VECTORS
  2087. }
  2088. }
  2089. }, {
  2090. .alg = "cryptd(__driver-cbc-aes-aesni)",
  2091. .test = alg_test_null,
  2092. .fips_allowed = 1,
  2093. }, {
  2094. .alg = "cryptd(__driver-cbc-camellia-aesni)",
  2095. .test = alg_test_null,
  2096. }, {
  2097. .alg = "cryptd(__driver-cbc-camellia-aesni-avx2)",
  2098. .test = alg_test_null,
  2099. }, {
  2100. .alg = "cryptd(__driver-cbc-serpent-avx2)",
  2101. .test = alg_test_null,
  2102. }, {
  2103. .alg = "cryptd(__driver-ecb-aes-aesni)",
  2104. .test = alg_test_null,
  2105. .fips_allowed = 1,
  2106. }, {
  2107. .alg = "cryptd(__driver-ecb-camellia-aesni)",
  2108. .test = alg_test_null,
  2109. }, {
  2110. .alg = "cryptd(__driver-ecb-camellia-aesni-avx2)",
  2111. .test = alg_test_null,
  2112. }, {
  2113. .alg = "cryptd(__driver-ecb-cast5-avx)",
  2114. .test = alg_test_null,
  2115. }, {
  2116. .alg = "cryptd(__driver-ecb-cast6-avx)",
  2117. .test = alg_test_null,
  2118. }, {
  2119. .alg = "cryptd(__driver-ecb-serpent-avx)",
  2120. .test = alg_test_null,
  2121. }, {
  2122. .alg = "cryptd(__driver-ecb-serpent-avx2)",
  2123. .test = alg_test_null,
  2124. }, {
  2125. .alg = "cryptd(__driver-ecb-serpent-sse2)",
  2126. .test = alg_test_null,
  2127. }, {
  2128. .alg = "cryptd(__driver-ecb-twofish-avx)",
  2129. .test = alg_test_null,
  2130. }, {
  2131. .alg = "cryptd(__driver-gcm-aes-aesni)",
  2132. .test = alg_test_null,
  2133. .fips_allowed = 1,
  2134. }, {
  2135. .alg = "cryptd(__ghash-pclmulqdqni)",
  2136. .test = alg_test_null,
  2137. .fips_allowed = 1,
  2138. }, {
  2139. .alg = "ctr(aes)",
  2140. .test = alg_test_skcipher,
  2141. .fips_allowed = 1,
  2142. .suite = {
  2143. .cipher = {
  2144. .enc = {
  2145. .vecs = aes_ctr_enc_tv_template,
  2146. .count = AES_CTR_ENC_TEST_VECTORS
  2147. },
  2148. .dec = {
  2149. .vecs = aes_ctr_dec_tv_template,
  2150. .count = AES_CTR_DEC_TEST_VECTORS
  2151. }
  2152. }
  2153. }
  2154. }, {
  2155. .alg = "ctr(blowfish)",
  2156. .test = alg_test_skcipher,
  2157. .suite = {
  2158. .cipher = {
  2159. .enc = {
  2160. .vecs = bf_ctr_enc_tv_template,
  2161. .count = BF_CTR_ENC_TEST_VECTORS
  2162. },
  2163. .dec = {
  2164. .vecs = bf_ctr_dec_tv_template,
  2165. .count = BF_CTR_DEC_TEST_VECTORS
  2166. }
  2167. }
  2168. }
  2169. }, {
  2170. .alg = "ctr(camellia)",
  2171. .test = alg_test_skcipher,
  2172. .suite = {
  2173. .cipher = {
  2174. .enc = {
  2175. .vecs = camellia_ctr_enc_tv_template,
  2176. .count = CAMELLIA_CTR_ENC_TEST_VECTORS
  2177. },
  2178. .dec = {
  2179. .vecs = camellia_ctr_dec_tv_template,
  2180. .count = CAMELLIA_CTR_DEC_TEST_VECTORS
  2181. }
  2182. }
  2183. }
  2184. }, {
  2185. .alg = "ctr(cast5)",
  2186. .test = alg_test_skcipher,
  2187. .suite = {
  2188. .cipher = {
  2189. .enc = {
  2190. .vecs = cast5_ctr_enc_tv_template,
  2191. .count = CAST5_CTR_ENC_TEST_VECTORS
  2192. },
  2193. .dec = {
  2194. .vecs = cast5_ctr_dec_tv_template,
  2195. .count = CAST5_CTR_DEC_TEST_VECTORS
  2196. }
  2197. }
  2198. }
  2199. }, {
  2200. .alg = "ctr(cast6)",
  2201. .test = alg_test_skcipher,
  2202. .suite = {
  2203. .cipher = {
  2204. .enc = {
  2205. .vecs = cast6_ctr_enc_tv_template,
  2206. .count = CAST6_CTR_ENC_TEST_VECTORS
  2207. },
  2208. .dec = {
  2209. .vecs = cast6_ctr_dec_tv_template,
  2210. .count = CAST6_CTR_DEC_TEST_VECTORS
  2211. }
  2212. }
  2213. }
  2214. }, {
  2215. .alg = "ctr(des)",
  2216. .test = alg_test_skcipher,
  2217. .suite = {
  2218. .cipher = {
  2219. .enc = {
  2220. .vecs = des_ctr_enc_tv_template,
  2221. .count = DES_CTR_ENC_TEST_VECTORS
  2222. },
  2223. .dec = {
  2224. .vecs = des_ctr_dec_tv_template,
  2225. .count = DES_CTR_DEC_TEST_VECTORS
  2226. }
  2227. }
  2228. }
  2229. }, {
  2230. .alg = "ctr(des3_ede)",
  2231. .test = alg_test_skcipher,
  2232. .suite = {
  2233. .cipher = {
  2234. .enc = {
  2235. .vecs = des3_ede_ctr_enc_tv_template,
  2236. .count = DES3_EDE_CTR_ENC_TEST_VECTORS
  2237. },
  2238. .dec = {
  2239. .vecs = des3_ede_ctr_dec_tv_template,
  2240. .count = DES3_EDE_CTR_DEC_TEST_VECTORS
  2241. }
  2242. }
  2243. }
  2244. }, {
  2245. .alg = "ctr(serpent)",
  2246. .test = alg_test_skcipher,
  2247. .suite = {
  2248. .cipher = {
  2249. .enc = {
  2250. .vecs = serpent_ctr_enc_tv_template,
  2251. .count = SERPENT_CTR_ENC_TEST_VECTORS
  2252. },
  2253. .dec = {
  2254. .vecs = serpent_ctr_dec_tv_template,
  2255. .count = SERPENT_CTR_DEC_TEST_VECTORS
  2256. }
  2257. }
  2258. }
  2259. }, {
  2260. .alg = "ctr(twofish)",
  2261. .test = alg_test_skcipher,
  2262. .suite = {
  2263. .cipher = {
  2264. .enc = {
  2265. .vecs = tf_ctr_enc_tv_template,
  2266. .count = TF_CTR_ENC_TEST_VECTORS
  2267. },
  2268. .dec = {
  2269. .vecs = tf_ctr_dec_tv_template,
  2270. .count = TF_CTR_DEC_TEST_VECTORS
  2271. }
  2272. }
  2273. }
  2274. }, {
  2275. .alg = "cts(cbc(aes))",
  2276. .test = alg_test_skcipher,
  2277. .suite = {
  2278. .cipher = {
  2279. .enc = {
  2280. .vecs = cts_mode_enc_tv_template,
  2281. .count = CTS_MODE_ENC_TEST_VECTORS
  2282. },
  2283. .dec = {
  2284. .vecs = cts_mode_dec_tv_template,
  2285. .count = CTS_MODE_DEC_TEST_VECTORS
  2286. }
  2287. }
  2288. }
  2289. }, {
  2290. .alg = "deflate",
  2291. .test = alg_test_comp,
  2292. .fips_allowed = 1,
  2293. .suite = {
  2294. .comp = {
  2295. .comp = {
  2296. .vecs = deflate_comp_tv_template,
  2297. .count = DEFLATE_COMP_TEST_VECTORS
  2298. },
  2299. .decomp = {
  2300. .vecs = deflate_decomp_tv_template,
  2301. .count = DEFLATE_DECOMP_TEST_VECTORS
  2302. }
  2303. }
  2304. }
  2305. }, {
  2306. .alg = "digest_null",
  2307. .test = alg_test_null,
  2308. }, {
  2309. .alg = "drbg_nopr_ctr_aes128",
  2310. .test = alg_test_drbg,
  2311. .fips_allowed = 1,
  2312. .suite = {
  2313. .drbg = {
  2314. .vecs = drbg_nopr_ctr_aes128_tv_template,
  2315. .count = ARRAY_SIZE(drbg_nopr_ctr_aes128_tv_template)
  2316. }
  2317. }
  2318. }, {
  2319. .alg = "drbg_nopr_ctr_aes192",
  2320. .test = alg_test_drbg,
  2321. .fips_allowed = 1,
  2322. .suite = {
  2323. .drbg = {
  2324. .vecs = drbg_nopr_ctr_aes192_tv_template,
  2325. .count = ARRAY_SIZE(drbg_nopr_ctr_aes192_tv_template)
  2326. }
  2327. }
  2328. }, {
  2329. .alg = "drbg_nopr_ctr_aes256",
  2330. .test = alg_test_drbg,
  2331. .fips_allowed = 1,
  2332. .suite = {
  2333. .drbg = {
  2334. .vecs = drbg_nopr_ctr_aes256_tv_template,
  2335. .count = ARRAY_SIZE(drbg_nopr_ctr_aes256_tv_template)
  2336. }
  2337. }
  2338. }, {
  2339. /*
  2340. * There is no need to specifically test the DRBG with every
  2341. * backend cipher -- covered by drbg_nopr_hmac_sha256 test
  2342. */
  2343. .alg = "drbg_nopr_hmac_sha1",
  2344. .fips_allowed = 1,
  2345. .test = alg_test_null,
  2346. }, {
  2347. .alg = "drbg_nopr_hmac_sha256",
  2348. .test = alg_test_drbg,
  2349. .fips_allowed = 1,
  2350. .suite = {
  2351. .drbg = {
  2352. .vecs = drbg_nopr_hmac_sha256_tv_template,
  2353. .count =
  2354. ARRAY_SIZE(drbg_nopr_hmac_sha256_tv_template)
  2355. }
  2356. }
  2357. }, {
  2358. /* covered by drbg_nopr_hmac_sha256 test */
  2359. .alg = "drbg_nopr_hmac_sha384",
  2360. .fips_allowed = 1,
  2361. .test = alg_test_null,
  2362. }, {
  2363. .alg = "drbg_nopr_hmac_sha512",
  2364. .test = alg_test_null,
  2365. .fips_allowed = 1,
  2366. }, {
  2367. .alg = "drbg_nopr_sha1",
  2368. .fips_allowed = 1,
  2369. .test = alg_test_null,
  2370. }, {
  2371. .alg = "drbg_nopr_sha256",
  2372. .test = alg_test_drbg,
  2373. .fips_allowed = 1,
  2374. .suite = {
  2375. .drbg = {
  2376. .vecs = drbg_nopr_sha256_tv_template,
  2377. .count = ARRAY_SIZE(drbg_nopr_sha256_tv_template)
  2378. }
  2379. }
  2380. }, {
  2381. /* covered by drbg_nopr_sha256 test */
  2382. .alg = "drbg_nopr_sha384",
  2383. .fips_allowed = 1,
  2384. .test = alg_test_null,
  2385. }, {
  2386. .alg = "drbg_nopr_sha512",
  2387. .fips_allowed = 1,
  2388. .test = alg_test_null,
  2389. }, {
  2390. .alg = "drbg_pr_ctr_aes128",
  2391. .test = alg_test_drbg,
  2392. .fips_allowed = 1,
  2393. .suite = {
  2394. .drbg = {
  2395. .vecs = drbg_pr_ctr_aes128_tv_template,
  2396. .count = ARRAY_SIZE(drbg_pr_ctr_aes128_tv_template)
  2397. }
  2398. }
  2399. }, {
  2400. /* covered by drbg_pr_ctr_aes128 test */
  2401. .alg = "drbg_pr_ctr_aes192",
  2402. .fips_allowed = 1,
  2403. .test = alg_test_null,
  2404. }, {
  2405. .alg = "drbg_pr_ctr_aes256",
  2406. .fips_allowed = 1,
  2407. .test = alg_test_null,
  2408. }, {
  2409. .alg = "drbg_pr_hmac_sha1",
  2410. .fips_allowed = 1,
  2411. .test = alg_test_null,
  2412. }, {
  2413. .alg = "drbg_pr_hmac_sha256",
  2414. .test = alg_test_drbg,
  2415. .fips_allowed = 1,
  2416. .suite = {
  2417. .drbg = {
  2418. .vecs = drbg_pr_hmac_sha256_tv_template,
  2419. .count = ARRAY_SIZE(drbg_pr_hmac_sha256_tv_template)
  2420. }
  2421. }
  2422. }, {
  2423. /* covered by drbg_pr_hmac_sha256 test */
  2424. .alg = "drbg_pr_hmac_sha384",
  2425. .fips_allowed = 1,
  2426. .test = alg_test_null,
  2427. }, {
  2428. .alg = "drbg_pr_hmac_sha512",
  2429. .test = alg_test_null,
  2430. .fips_allowed = 1,
  2431. }, {
  2432. .alg = "drbg_pr_sha1",
  2433. .fips_allowed = 1,
  2434. .test = alg_test_null,
  2435. }, {
  2436. .alg = "drbg_pr_sha256",
  2437. .test = alg_test_drbg,
  2438. .fips_allowed = 1,
  2439. .suite = {
  2440. .drbg = {
  2441. .vecs = drbg_pr_sha256_tv_template,
  2442. .count = ARRAY_SIZE(drbg_pr_sha256_tv_template)
  2443. }
  2444. }
  2445. }, {
  2446. /* covered by drbg_pr_sha256 test */
  2447. .alg = "drbg_pr_sha384",
  2448. .fips_allowed = 1,
  2449. .test = alg_test_null,
  2450. }, {
  2451. .alg = "drbg_pr_sha512",
  2452. .fips_allowed = 1,
  2453. .test = alg_test_null,
  2454. }, {
  2455. .alg = "ecb(__aes-aesni)",
  2456. .test = alg_test_null,
  2457. .fips_allowed = 1,
  2458. }, {
  2459. .alg = "ecb(aes)",
  2460. .test = alg_test_skcipher,
  2461. .fips_allowed = 1,
  2462. .suite = {
  2463. .cipher = {
  2464. .enc = {
  2465. .vecs = aes_enc_tv_template,
  2466. .count = AES_ENC_TEST_VECTORS
  2467. },
  2468. .dec = {
  2469. .vecs = aes_dec_tv_template,
  2470. .count = AES_DEC_TEST_VECTORS
  2471. }
  2472. }
  2473. }
  2474. }, {
  2475. .alg = "ecb(anubis)",
  2476. .test = alg_test_skcipher,
  2477. .suite = {
  2478. .cipher = {
  2479. .enc = {
  2480. .vecs = anubis_enc_tv_template,
  2481. .count = ANUBIS_ENC_TEST_VECTORS
  2482. },
  2483. .dec = {
  2484. .vecs = anubis_dec_tv_template,
  2485. .count = ANUBIS_DEC_TEST_VECTORS
  2486. }
  2487. }
  2488. }
  2489. }, {
  2490. .alg = "ecb(arc4)",
  2491. .test = alg_test_skcipher,
  2492. .suite = {
  2493. .cipher = {
  2494. .enc = {
  2495. .vecs = arc4_enc_tv_template,
  2496. .count = ARC4_ENC_TEST_VECTORS
  2497. },
  2498. .dec = {
  2499. .vecs = arc4_dec_tv_template,
  2500. .count = ARC4_DEC_TEST_VECTORS
  2501. }
  2502. }
  2503. }
  2504. }, {
  2505. .alg = "ecb(blowfish)",
  2506. .test = alg_test_skcipher,
  2507. .suite = {
  2508. .cipher = {
  2509. .enc = {
  2510. .vecs = bf_enc_tv_template,
  2511. .count = BF_ENC_TEST_VECTORS
  2512. },
  2513. .dec = {
  2514. .vecs = bf_dec_tv_template,
  2515. .count = BF_DEC_TEST_VECTORS
  2516. }
  2517. }
  2518. }
  2519. }, {
  2520. .alg = "ecb(camellia)",
  2521. .test = alg_test_skcipher,
  2522. .suite = {
  2523. .cipher = {
  2524. .enc = {
  2525. .vecs = camellia_enc_tv_template,
  2526. .count = CAMELLIA_ENC_TEST_VECTORS
  2527. },
  2528. .dec = {
  2529. .vecs = camellia_dec_tv_template,
  2530. .count = CAMELLIA_DEC_TEST_VECTORS
  2531. }
  2532. }
  2533. }
  2534. }, {
  2535. .alg = "ecb(cast5)",
  2536. .test = alg_test_skcipher,
  2537. .suite = {
  2538. .cipher = {
  2539. .enc = {
  2540. .vecs = cast5_enc_tv_template,
  2541. .count = CAST5_ENC_TEST_VECTORS
  2542. },
  2543. .dec = {
  2544. .vecs = cast5_dec_tv_template,
  2545. .count = CAST5_DEC_TEST_VECTORS
  2546. }
  2547. }
  2548. }
  2549. }, {
  2550. .alg = "ecb(cast6)",
  2551. .test = alg_test_skcipher,
  2552. .suite = {
  2553. .cipher = {
  2554. .enc = {
  2555. .vecs = cast6_enc_tv_template,
  2556. .count = CAST6_ENC_TEST_VECTORS
  2557. },
  2558. .dec = {
  2559. .vecs = cast6_dec_tv_template,
  2560. .count = CAST6_DEC_TEST_VECTORS
  2561. }
  2562. }
  2563. }
  2564. }, {
  2565. .alg = "ecb(cipher_null)",
  2566. .test = alg_test_null,
  2567. }, {
  2568. .alg = "ecb(des)",
  2569. .test = alg_test_skcipher,
  2570. .fips_allowed = 1,
  2571. .suite = {
  2572. .cipher = {
  2573. .enc = {
  2574. .vecs = des_enc_tv_template,
  2575. .count = DES_ENC_TEST_VECTORS
  2576. },
  2577. .dec = {
  2578. .vecs = des_dec_tv_template,
  2579. .count = DES_DEC_TEST_VECTORS
  2580. }
  2581. }
  2582. }
  2583. }, {
  2584. .alg = "ecb(des3_ede)",
  2585. .test = alg_test_skcipher,
  2586. .fips_allowed = 1,
  2587. .suite = {
  2588. .cipher = {
  2589. .enc = {
  2590. .vecs = des3_ede_enc_tv_template,
  2591. .count = DES3_EDE_ENC_TEST_VECTORS
  2592. },
  2593. .dec = {
  2594. .vecs = des3_ede_dec_tv_template,
  2595. .count = DES3_EDE_DEC_TEST_VECTORS
  2596. }
  2597. }
  2598. }
  2599. }, {
  2600. .alg = "ecb(fcrypt)",
  2601. .test = alg_test_skcipher,
  2602. .suite = {
  2603. .cipher = {
  2604. .enc = {
  2605. .vecs = fcrypt_pcbc_enc_tv_template,
  2606. .count = 1
  2607. },
  2608. .dec = {
  2609. .vecs = fcrypt_pcbc_dec_tv_template,
  2610. .count = 1
  2611. }
  2612. }
  2613. }
  2614. }, {
  2615. .alg = "ecb(khazad)",
  2616. .test = alg_test_skcipher,
  2617. .suite = {
  2618. .cipher = {
  2619. .enc = {
  2620. .vecs = khazad_enc_tv_template,
  2621. .count = KHAZAD_ENC_TEST_VECTORS
  2622. },
  2623. .dec = {
  2624. .vecs = khazad_dec_tv_template,
  2625. .count = KHAZAD_DEC_TEST_VECTORS
  2626. }
  2627. }
  2628. }
  2629. }, {
  2630. .alg = "ecb(seed)",
  2631. .test = alg_test_skcipher,
  2632. .suite = {
  2633. .cipher = {
  2634. .enc = {
  2635. .vecs = seed_enc_tv_template,
  2636. .count = SEED_ENC_TEST_VECTORS
  2637. },
  2638. .dec = {
  2639. .vecs = seed_dec_tv_template,
  2640. .count = SEED_DEC_TEST_VECTORS
  2641. }
  2642. }
  2643. }
  2644. }, {
  2645. .alg = "ecb(serpent)",
  2646. .test = alg_test_skcipher,
  2647. .suite = {
  2648. .cipher = {
  2649. .enc = {
  2650. .vecs = serpent_enc_tv_template,
  2651. .count = SERPENT_ENC_TEST_VECTORS
  2652. },
  2653. .dec = {
  2654. .vecs = serpent_dec_tv_template,
  2655. .count = SERPENT_DEC_TEST_VECTORS
  2656. }
  2657. }
  2658. }
  2659. }, {
  2660. .alg = "ecb(tea)",
  2661. .test = alg_test_skcipher,
  2662. .suite = {
  2663. .cipher = {
  2664. .enc = {
  2665. .vecs = tea_enc_tv_template,
  2666. .count = TEA_ENC_TEST_VECTORS
  2667. },
  2668. .dec = {
  2669. .vecs = tea_dec_tv_template,
  2670. .count = TEA_DEC_TEST_VECTORS
  2671. }
  2672. }
  2673. }
  2674. }, {
  2675. .alg = "ecb(tnepres)",
  2676. .test = alg_test_skcipher,
  2677. .suite = {
  2678. .cipher = {
  2679. .enc = {
  2680. .vecs = tnepres_enc_tv_template,
  2681. .count = TNEPRES_ENC_TEST_VECTORS
  2682. },
  2683. .dec = {
  2684. .vecs = tnepres_dec_tv_template,
  2685. .count = TNEPRES_DEC_TEST_VECTORS
  2686. }
  2687. }
  2688. }
  2689. }, {
  2690. .alg = "ecb(twofish)",
  2691. .test = alg_test_skcipher,
  2692. .suite = {
  2693. .cipher = {
  2694. .enc = {
  2695. .vecs = tf_enc_tv_template,
  2696. .count = TF_ENC_TEST_VECTORS
  2697. },
  2698. .dec = {
  2699. .vecs = tf_dec_tv_template,
  2700. .count = TF_DEC_TEST_VECTORS
  2701. }
  2702. }
  2703. }
  2704. }, {
  2705. .alg = "ecb(xeta)",
  2706. .test = alg_test_skcipher,
  2707. .suite = {
  2708. .cipher = {
  2709. .enc = {
  2710. .vecs = xeta_enc_tv_template,
  2711. .count = XETA_ENC_TEST_VECTORS
  2712. },
  2713. .dec = {
  2714. .vecs = xeta_dec_tv_template,
  2715. .count = XETA_DEC_TEST_VECTORS
  2716. }
  2717. }
  2718. }
  2719. }, {
  2720. .alg = "ecb(xtea)",
  2721. .test = alg_test_skcipher,
  2722. .suite = {
  2723. .cipher = {
  2724. .enc = {
  2725. .vecs = xtea_enc_tv_template,
  2726. .count = XTEA_ENC_TEST_VECTORS
  2727. },
  2728. .dec = {
  2729. .vecs = xtea_dec_tv_template,
  2730. .count = XTEA_DEC_TEST_VECTORS
  2731. }
  2732. }
  2733. }
  2734. }, {
  2735. .alg = "gcm(aes)",
  2736. .test = alg_test_aead,
  2737. .fips_allowed = 1,
  2738. .suite = {
  2739. .aead = {
  2740. .enc = {
  2741. .vecs = aes_gcm_enc_tv_template,
  2742. .count = AES_GCM_ENC_TEST_VECTORS
  2743. },
  2744. .dec = {
  2745. .vecs = aes_gcm_dec_tv_template,
  2746. .count = AES_GCM_DEC_TEST_VECTORS
  2747. }
  2748. }
  2749. }
  2750. }, {
  2751. .alg = "ghash",
  2752. .test = alg_test_hash,
  2753. .fips_allowed = 1,
  2754. .suite = {
  2755. .hash = {
  2756. .vecs = ghash_tv_template,
  2757. .count = GHASH_TEST_VECTORS
  2758. }
  2759. }
  2760. }, {
  2761. .alg = "hmac(crc32)",
  2762. .test = alg_test_hash,
  2763. .suite = {
  2764. .hash = {
  2765. .vecs = bfin_crc_tv_template,
  2766. .count = BFIN_CRC_TEST_VECTORS
  2767. }
  2768. }
  2769. }, {
  2770. .alg = "hmac(md5)",
  2771. .test = alg_test_hash,
  2772. .suite = {
  2773. .hash = {
  2774. .vecs = hmac_md5_tv_template,
  2775. .count = HMAC_MD5_TEST_VECTORS
  2776. }
  2777. }
  2778. }, {
  2779. .alg = "hmac(rmd128)",
  2780. .test = alg_test_hash,
  2781. .suite = {
  2782. .hash = {
  2783. .vecs = hmac_rmd128_tv_template,
  2784. .count = HMAC_RMD128_TEST_VECTORS
  2785. }
  2786. }
  2787. }, {
  2788. .alg = "hmac(rmd160)",
  2789. .test = alg_test_hash,
  2790. .suite = {
  2791. .hash = {
  2792. .vecs = hmac_rmd160_tv_template,
  2793. .count = HMAC_RMD160_TEST_VECTORS
  2794. }
  2795. }
  2796. }, {
  2797. .alg = "hmac(sha1)",
  2798. .test = alg_test_hash,
  2799. .fips_allowed = 1,
  2800. .suite = {
  2801. .hash = {
  2802. .vecs = hmac_sha1_tv_template,
  2803. .count = HMAC_SHA1_TEST_VECTORS
  2804. }
  2805. }
  2806. }, {
  2807. .alg = "hmac(sha224)",
  2808. .test = alg_test_hash,
  2809. .fips_allowed = 1,
  2810. .suite = {
  2811. .hash = {
  2812. .vecs = hmac_sha224_tv_template,
  2813. .count = HMAC_SHA224_TEST_VECTORS
  2814. }
  2815. }
  2816. }, {
  2817. .alg = "hmac(sha256)",
  2818. .test = alg_test_hash,
  2819. .fips_allowed = 1,
  2820. .suite = {
  2821. .hash = {
  2822. .vecs = hmac_sha256_tv_template,
  2823. .count = HMAC_SHA256_TEST_VECTORS
  2824. }
  2825. }
  2826. }, {
  2827. .alg = "hmac(sha384)",
  2828. .test = alg_test_hash,
  2829. .fips_allowed = 1,
  2830. .suite = {
  2831. .hash = {
  2832. .vecs = hmac_sha384_tv_template,
  2833. .count = HMAC_SHA384_TEST_VECTORS
  2834. }
  2835. }
  2836. }, {
  2837. .alg = "hmac(sha512)",
  2838. .test = alg_test_hash,
  2839. .fips_allowed = 1,
  2840. .suite = {
  2841. .hash = {
  2842. .vecs = hmac_sha512_tv_template,
  2843. .count = HMAC_SHA512_TEST_VECTORS
  2844. }
  2845. }
  2846. }, {
  2847. .alg = "jitterentropy_rng",
  2848. .fips_allowed = 1,
  2849. .test = alg_test_null,
  2850. }, {
  2851. .alg = "lrw(aes)",
  2852. .test = alg_test_skcipher,
  2853. .suite = {
  2854. .cipher = {
  2855. .enc = {
  2856. .vecs = aes_lrw_enc_tv_template,
  2857. .count = AES_LRW_ENC_TEST_VECTORS
  2858. },
  2859. .dec = {
  2860. .vecs = aes_lrw_dec_tv_template,
  2861. .count = AES_LRW_DEC_TEST_VECTORS
  2862. }
  2863. }
  2864. }
  2865. }, {
  2866. .alg = "lrw(camellia)",
  2867. .test = alg_test_skcipher,
  2868. .suite = {
  2869. .cipher = {
  2870. .enc = {
  2871. .vecs = camellia_lrw_enc_tv_template,
  2872. .count = CAMELLIA_LRW_ENC_TEST_VECTORS
  2873. },
  2874. .dec = {
  2875. .vecs = camellia_lrw_dec_tv_template,
  2876. .count = CAMELLIA_LRW_DEC_TEST_VECTORS
  2877. }
  2878. }
  2879. }
  2880. }, {
  2881. .alg = "lrw(cast6)",
  2882. .test = alg_test_skcipher,
  2883. .suite = {
  2884. .cipher = {
  2885. .enc = {
  2886. .vecs = cast6_lrw_enc_tv_template,
  2887. .count = CAST6_LRW_ENC_TEST_VECTORS
  2888. },
  2889. .dec = {
  2890. .vecs = cast6_lrw_dec_tv_template,
  2891. .count = CAST6_LRW_DEC_TEST_VECTORS
  2892. }
  2893. }
  2894. }
  2895. }, {
  2896. .alg = "lrw(serpent)",
  2897. .test = alg_test_skcipher,
  2898. .suite = {
  2899. .cipher = {
  2900. .enc = {
  2901. .vecs = serpent_lrw_enc_tv_template,
  2902. .count = SERPENT_LRW_ENC_TEST_VECTORS
  2903. },
  2904. .dec = {
  2905. .vecs = serpent_lrw_dec_tv_template,
  2906. .count = SERPENT_LRW_DEC_TEST_VECTORS
  2907. }
  2908. }
  2909. }
  2910. }, {
  2911. .alg = "lrw(twofish)",
  2912. .test = alg_test_skcipher,
  2913. .suite = {
  2914. .cipher = {
  2915. .enc = {
  2916. .vecs = tf_lrw_enc_tv_template,
  2917. .count = TF_LRW_ENC_TEST_VECTORS
  2918. },
  2919. .dec = {
  2920. .vecs = tf_lrw_dec_tv_template,
  2921. .count = TF_LRW_DEC_TEST_VECTORS
  2922. }
  2923. }
  2924. }
  2925. }, {
  2926. .alg = "lz4",
  2927. .test = alg_test_comp,
  2928. .fips_allowed = 1,
  2929. .suite = {
  2930. .comp = {
  2931. .comp = {
  2932. .vecs = lz4_comp_tv_template,
  2933. .count = LZ4_COMP_TEST_VECTORS
  2934. },
  2935. .decomp = {
  2936. .vecs = lz4_decomp_tv_template,
  2937. .count = LZ4_DECOMP_TEST_VECTORS
  2938. }
  2939. }
  2940. }
  2941. }, {
  2942. .alg = "lz4hc",
  2943. .test = alg_test_comp,
  2944. .fips_allowed = 1,
  2945. .suite = {
  2946. .comp = {
  2947. .comp = {
  2948. .vecs = lz4hc_comp_tv_template,
  2949. .count = LZ4HC_COMP_TEST_VECTORS
  2950. },
  2951. .decomp = {
  2952. .vecs = lz4hc_decomp_tv_template,
  2953. .count = LZ4HC_DECOMP_TEST_VECTORS
  2954. }
  2955. }
  2956. }
  2957. }, {
  2958. .alg = "lzo",
  2959. .test = alg_test_comp,
  2960. .fips_allowed = 1,
  2961. .suite = {
  2962. .comp = {
  2963. .comp = {
  2964. .vecs = lzo_comp_tv_template,
  2965. .count = LZO_COMP_TEST_VECTORS
  2966. },
  2967. .decomp = {
  2968. .vecs = lzo_decomp_tv_template,
  2969. .count = LZO_DECOMP_TEST_VECTORS
  2970. }
  2971. }
  2972. }
  2973. }, {
  2974. .alg = "md4",
  2975. .test = alg_test_hash,
  2976. .suite = {
  2977. .hash = {
  2978. .vecs = md4_tv_template,
  2979. .count = MD4_TEST_VECTORS
  2980. }
  2981. }
  2982. }, {
  2983. .alg = "md5",
  2984. .test = alg_test_hash,
  2985. .suite = {
  2986. .hash = {
  2987. .vecs = md5_tv_template,
  2988. .count = MD5_TEST_VECTORS
  2989. }
  2990. }
  2991. }, {
  2992. .alg = "michael_mic",
  2993. .test = alg_test_hash,
  2994. .suite = {
  2995. .hash = {
  2996. .vecs = michael_mic_tv_template,
  2997. .count = MICHAEL_MIC_TEST_VECTORS
  2998. }
  2999. }
  3000. }, {
  3001. .alg = "ofb(aes)",
  3002. .test = alg_test_skcipher,
  3003. .fips_allowed = 1,
  3004. .suite = {
  3005. .cipher = {
  3006. .enc = {
  3007. .vecs = aes_ofb_enc_tv_template,
  3008. .count = AES_OFB_ENC_TEST_VECTORS
  3009. },
  3010. .dec = {
  3011. .vecs = aes_ofb_dec_tv_template,
  3012. .count = AES_OFB_DEC_TEST_VECTORS
  3013. }
  3014. }
  3015. }
  3016. }, {
  3017. .alg = "pcbc(fcrypt)",
  3018. .test = alg_test_skcipher,
  3019. .suite = {
  3020. .cipher = {
  3021. .enc = {
  3022. .vecs = fcrypt_pcbc_enc_tv_template,
  3023. .count = FCRYPT_ENC_TEST_VECTORS
  3024. },
  3025. .dec = {
  3026. .vecs = fcrypt_pcbc_dec_tv_template,
  3027. .count = FCRYPT_DEC_TEST_VECTORS
  3028. }
  3029. }
  3030. }
  3031. }, {
  3032. .alg = "poly1305",
  3033. .test = alg_test_hash,
  3034. .suite = {
  3035. .hash = {
  3036. .vecs = poly1305_tv_template,
  3037. .count = POLY1305_TEST_VECTORS
  3038. }
  3039. }
  3040. }, {
  3041. .alg = "rfc3686(ctr(aes))",
  3042. .test = alg_test_skcipher,
  3043. .fips_allowed = 1,
  3044. .suite = {
  3045. .cipher = {
  3046. .enc = {
  3047. .vecs = aes_ctr_rfc3686_enc_tv_template,
  3048. .count = AES_CTR_3686_ENC_TEST_VECTORS
  3049. },
  3050. .dec = {
  3051. .vecs = aes_ctr_rfc3686_dec_tv_template,
  3052. .count = AES_CTR_3686_DEC_TEST_VECTORS
  3053. }
  3054. }
  3055. }
  3056. }, {
  3057. .alg = "rfc4106(gcm(aes))",
  3058. .test = alg_test_aead,
  3059. .fips_allowed = 1,
  3060. .suite = {
  3061. .aead = {
  3062. .enc = {
  3063. .vecs = aes_gcm_rfc4106_enc_tv_template,
  3064. .count = AES_GCM_4106_ENC_TEST_VECTORS
  3065. },
  3066. .dec = {
  3067. .vecs = aes_gcm_rfc4106_dec_tv_template,
  3068. .count = AES_GCM_4106_DEC_TEST_VECTORS
  3069. }
  3070. }
  3071. }
  3072. }, {
  3073. .alg = "rfc4309(ccm(aes))",
  3074. .test = alg_test_aead,
  3075. .fips_allowed = 1,
  3076. .suite = {
  3077. .aead = {
  3078. .enc = {
  3079. .vecs = aes_ccm_rfc4309_enc_tv_template,
  3080. .count = AES_CCM_4309_ENC_TEST_VECTORS
  3081. },
  3082. .dec = {
  3083. .vecs = aes_ccm_rfc4309_dec_tv_template,
  3084. .count = AES_CCM_4309_DEC_TEST_VECTORS
  3085. }
  3086. }
  3087. }
  3088. }, {
  3089. .alg = "rfc4543(gcm(aes))",
  3090. .test = alg_test_aead,
  3091. .suite = {
  3092. .aead = {
  3093. .enc = {
  3094. .vecs = aes_gcm_rfc4543_enc_tv_template,
  3095. .count = AES_GCM_4543_ENC_TEST_VECTORS
  3096. },
  3097. .dec = {
  3098. .vecs = aes_gcm_rfc4543_dec_tv_template,
  3099. .count = AES_GCM_4543_DEC_TEST_VECTORS
  3100. },
  3101. }
  3102. }
  3103. }, {
  3104. .alg = "rfc7539(chacha20,poly1305)",
  3105. .test = alg_test_aead,
  3106. .suite = {
  3107. .aead = {
  3108. .enc = {
  3109. .vecs = rfc7539_enc_tv_template,
  3110. .count = RFC7539_ENC_TEST_VECTORS
  3111. },
  3112. .dec = {
  3113. .vecs = rfc7539_dec_tv_template,
  3114. .count = RFC7539_DEC_TEST_VECTORS
  3115. },
  3116. }
  3117. }
  3118. }, {
  3119. .alg = "rmd128",
  3120. .test = alg_test_hash,
  3121. .suite = {
  3122. .hash = {
  3123. .vecs = rmd128_tv_template,
  3124. .count = RMD128_TEST_VECTORS
  3125. }
  3126. }
  3127. }, {
  3128. .alg = "rmd160",
  3129. .test = alg_test_hash,
  3130. .suite = {
  3131. .hash = {
  3132. .vecs = rmd160_tv_template,
  3133. .count = RMD160_TEST_VECTORS
  3134. }
  3135. }
  3136. }, {
  3137. .alg = "rmd256",
  3138. .test = alg_test_hash,
  3139. .suite = {
  3140. .hash = {
  3141. .vecs = rmd256_tv_template,
  3142. .count = RMD256_TEST_VECTORS
  3143. }
  3144. }
  3145. }, {
  3146. .alg = "rmd320",
  3147. .test = alg_test_hash,
  3148. .suite = {
  3149. .hash = {
  3150. .vecs = rmd320_tv_template,
  3151. .count = RMD320_TEST_VECTORS
  3152. }
  3153. }
  3154. }, {
  3155. .alg = "salsa20",
  3156. .test = alg_test_skcipher,
  3157. .suite = {
  3158. .cipher = {
  3159. .enc = {
  3160. .vecs = salsa20_stream_enc_tv_template,
  3161. .count = SALSA20_STREAM_ENC_TEST_VECTORS
  3162. }
  3163. }
  3164. }
  3165. }, {
  3166. .alg = "sha1",
  3167. .test = alg_test_hash,
  3168. .fips_allowed = 1,
  3169. .suite = {
  3170. .hash = {
  3171. .vecs = sha1_tv_template,
  3172. .count = SHA1_TEST_VECTORS
  3173. }
  3174. }
  3175. }, {
  3176. .alg = "sha224",
  3177. .test = alg_test_hash,
  3178. .fips_allowed = 1,
  3179. .suite = {
  3180. .hash = {
  3181. .vecs = sha224_tv_template,
  3182. .count = SHA224_TEST_VECTORS
  3183. }
  3184. }
  3185. }, {
  3186. .alg = "sha256",
  3187. .test = alg_test_hash,
  3188. .fips_allowed = 1,
  3189. .suite = {
  3190. .hash = {
  3191. .vecs = sha256_tv_template,
  3192. .count = SHA256_TEST_VECTORS
  3193. }
  3194. }
  3195. }, {
  3196. .alg = "sha384",
  3197. .test = alg_test_hash,
  3198. .fips_allowed = 1,
  3199. .suite = {
  3200. .hash = {
  3201. .vecs = sha384_tv_template,
  3202. .count = SHA384_TEST_VECTORS
  3203. }
  3204. }
  3205. }, {
  3206. .alg = "sha512",
  3207. .test = alg_test_hash,
  3208. .fips_allowed = 1,
  3209. .suite = {
  3210. .hash = {
  3211. .vecs = sha512_tv_template,
  3212. .count = SHA512_TEST_VECTORS
  3213. }
  3214. }
  3215. }, {
  3216. .alg = "tgr128",
  3217. .test = alg_test_hash,
  3218. .suite = {
  3219. .hash = {
  3220. .vecs = tgr128_tv_template,
  3221. .count = TGR128_TEST_VECTORS
  3222. }
  3223. }
  3224. }, {
  3225. .alg = "tgr160",
  3226. .test = alg_test_hash,
  3227. .suite = {
  3228. .hash = {
  3229. .vecs = tgr160_tv_template,
  3230. .count = TGR160_TEST_VECTORS
  3231. }
  3232. }
  3233. }, {
  3234. .alg = "tgr192",
  3235. .test = alg_test_hash,
  3236. .suite = {
  3237. .hash = {
  3238. .vecs = tgr192_tv_template,
  3239. .count = TGR192_TEST_VECTORS
  3240. }
  3241. }
  3242. }, {
  3243. .alg = "vmac(aes)",
  3244. .test = alg_test_hash,
  3245. .suite = {
  3246. .hash = {
  3247. .vecs = aes_vmac128_tv_template,
  3248. .count = VMAC_AES_TEST_VECTORS
  3249. }
  3250. }
  3251. }, {
  3252. .alg = "wp256",
  3253. .test = alg_test_hash,
  3254. .suite = {
  3255. .hash = {
  3256. .vecs = wp256_tv_template,
  3257. .count = WP256_TEST_VECTORS
  3258. }
  3259. }
  3260. }, {
  3261. .alg = "wp384",
  3262. .test = alg_test_hash,
  3263. .suite = {
  3264. .hash = {
  3265. .vecs = wp384_tv_template,
  3266. .count = WP384_TEST_VECTORS
  3267. }
  3268. }
  3269. }, {
  3270. .alg = "wp512",
  3271. .test = alg_test_hash,
  3272. .suite = {
  3273. .hash = {
  3274. .vecs = wp512_tv_template,
  3275. .count = WP512_TEST_VECTORS
  3276. }
  3277. }
  3278. }, {
  3279. .alg = "xcbc(aes)",
  3280. .test = alg_test_hash,
  3281. .suite = {
  3282. .hash = {
  3283. .vecs = aes_xcbc128_tv_template,
  3284. .count = XCBC_AES_TEST_VECTORS
  3285. }
  3286. }
  3287. }, {
  3288. .alg = "xts(aes)",
  3289. .test = alg_test_skcipher,
  3290. .fips_allowed = 1,
  3291. .suite = {
  3292. .cipher = {
  3293. .enc = {
  3294. .vecs = aes_xts_enc_tv_template,
  3295. .count = AES_XTS_ENC_TEST_VECTORS
  3296. },
  3297. .dec = {
  3298. .vecs = aes_xts_dec_tv_template,
  3299. .count = AES_XTS_DEC_TEST_VECTORS
  3300. }
  3301. }
  3302. }
  3303. }, {
  3304. .alg = "xts(camellia)",
  3305. .test = alg_test_skcipher,
  3306. .suite = {
  3307. .cipher = {
  3308. .enc = {
  3309. .vecs = camellia_xts_enc_tv_template,
  3310. .count = CAMELLIA_XTS_ENC_TEST_VECTORS
  3311. },
  3312. .dec = {
  3313. .vecs = camellia_xts_dec_tv_template,
  3314. .count = CAMELLIA_XTS_DEC_TEST_VECTORS
  3315. }
  3316. }
  3317. }
  3318. }, {
  3319. .alg = "xts(cast6)",
  3320. .test = alg_test_skcipher,
  3321. .suite = {
  3322. .cipher = {
  3323. .enc = {
  3324. .vecs = cast6_xts_enc_tv_template,
  3325. .count = CAST6_XTS_ENC_TEST_VECTORS
  3326. },
  3327. .dec = {
  3328. .vecs = cast6_xts_dec_tv_template,
  3329. .count = CAST6_XTS_DEC_TEST_VECTORS
  3330. }
  3331. }
  3332. }
  3333. }, {
  3334. .alg = "xts(serpent)",
  3335. .test = alg_test_skcipher,
  3336. .suite = {
  3337. .cipher = {
  3338. .enc = {
  3339. .vecs = serpent_xts_enc_tv_template,
  3340. .count = SERPENT_XTS_ENC_TEST_VECTORS
  3341. },
  3342. .dec = {
  3343. .vecs = serpent_xts_dec_tv_template,
  3344. .count = SERPENT_XTS_DEC_TEST_VECTORS
  3345. }
  3346. }
  3347. }
  3348. }, {
  3349. .alg = "xts(twofish)",
  3350. .test = alg_test_skcipher,
  3351. .suite = {
  3352. .cipher = {
  3353. .enc = {
  3354. .vecs = tf_xts_enc_tv_template,
  3355. .count = TF_XTS_ENC_TEST_VECTORS
  3356. },
  3357. .dec = {
  3358. .vecs = tf_xts_dec_tv_template,
  3359. .count = TF_XTS_DEC_TEST_VECTORS
  3360. }
  3361. }
  3362. }
  3363. }, {
  3364. .alg = "zlib",
  3365. .test = alg_test_pcomp,
  3366. .fips_allowed = 1,
  3367. .suite = {
  3368. .pcomp = {
  3369. .comp = {
  3370. .vecs = zlib_comp_tv_template,
  3371. .count = ZLIB_COMP_TEST_VECTORS
  3372. },
  3373. .decomp = {
  3374. .vecs = zlib_decomp_tv_template,
  3375. .count = ZLIB_DECOMP_TEST_VECTORS
  3376. }
  3377. }
  3378. }
  3379. }
  3380. };
  3381. static bool alg_test_descs_checked;
  3382. static void alg_test_descs_check_order(void)
  3383. {
  3384. int i;
  3385. /* only check once */
  3386. if (alg_test_descs_checked)
  3387. return;
  3388. alg_test_descs_checked = true;
  3389. for (i = 1; i < ARRAY_SIZE(alg_test_descs); i++) {
  3390. int diff = strcmp(alg_test_descs[i - 1].alg,
  3391. alg_test_descs[i].alg);
  3392. if (WARN_ON(diff > 0)) {
  3393. pr_warn("testmgr: alg_test_descs entries in wrong order: '%s' before '%s'\n",
  3394. alg_test_descs[i - 1].alg,
  3395. alg_test_descs[i].alg);
  3396. }
  3397. if (WARN_ON(diff == 0)) {
  3398. pr_warn("testmgr: duplicate alg_test_descs entry: '%s'\n",
  3399. alg_test_descs[i].alg);
  3400. }
  3401. }
  3402. }
  3403. static int alg_find_test(const char *alg)
  3404. {
  3405. int start = 0;
  3406. int end = ARRAY_SIZE(alg_test_descs);
  3407. while (start < end) {
  3408. int i = (start + end) / 2;
  3409. int diff = strcmp(alg_test_descs[i].alg, alg);
  3410. if (diff > 0) {
  3411. end = i;
  3412. continue;
  3413. }
  3414. if (diff < 0) {
  3415. start = i + 1;
  3416. continue;
  3417. }
  3418. return i;
  3419. }
  3420. return -1;
  3421. }
  3422. int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
  3423. {
  3424. int i;
  3425. int j;
  3426. int rc;
  3427. alg_test_descs_check_order();
  3428. if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
  3429. char nalg[CRYPTO_MAX_ALG_NAME];
  3430. if (snprintf(nalg, sizeof(nalg), "ecb(%s)", alg) >=
  3431. sizeof(nalg))
  3432. return -ENAMETOOLONG;
  3433. i = alg_find_test(nalg);
  3434. if (i < 0)
  3435. goto notest;
  3436. if (fips_enabled && !alg_test_descs[i].fips_allowed)
  3437. goto non_fips_alg;
  3438. rc = alg_test_cipher(alg_test_descs + i, driver, type, mask);
  3439. goto test_done;
  3440. }
  3441. i = alg_find_test(alg);
  3442. j = alg_find_test(driver);
  3443. if (i < 0 && j < 0)
  3444. goto notest;
  3445. if (fips_enabled && ((i >= 0 && !alg_test_descs[i].fips_allowed) ||
  3446. (j >= 0 && !alg_test_descs[j].fips_allowed)))
  3447. goto non_fips_alg;
  3448. rc = 0;
  3449. if (i >= 0)
  3450. rc |= alg_test_descs[i].test(alg_test_descs + i, driver,
  3451. type, mask);
  3452. if (j >= 0 && j != i)
  3453. rc |= alg_test_descs[j].test(alg_test_descs + j, driver,
  3454. type, mask);
  3455. test_done:
  3456. if (fips_enabled && rc)
  3457. panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
  3458. if (fips_enabled && !rc)
  3459. pr_info("alg: self-tests for %s (%s) passed\n", driver, alg);
  3460. return rc;
  3461. notest:
  3462. printk(KERN_INFO "alg: No test for %s (%s)\n", alg, driver);
  3463. return 0;
  3464. non_fips_alg:
  3465. return -EINVAL;
  3466. }
  3467. #endif /* CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
  3468. EXPORT_SYMBOL_GPL(alg_test);