twofish_avx_glue.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086
  1. /*
  2. * Glue Code for AVX assembler version of Twofish Cipher
  3. *
  4. * Copyright (C) 2012 Johannes Goetzfried
  5. * <Johannes.Goetzfried@informatik.stud.uni-erlangen.de>
  6. *
  7. * Glue code based on serpent_sse2_glue.c by:
  8. * Copyright (C) 2011 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  23. * USA
  24. *
  25. */
  26. #include <linux/module.h>
  27. #include <linux/hardirq.h>
  28. #include <linux/types.h>
  29. #include <linux/crypto.h>
  30. #include <linux/err.h>
  31. #include <crypto/algapi.h>
  32. #include <crypto/twofish.h>
  33. #include <crypto/cryptd.h>
  34. #include <crypto/b128ops.h>
  35. #include <crypto/ctr.h>
  36. #include <crypto/lrw.h>
  37. #include <crypto/xts.h>
  38. #include <asm/i387.h>
  39. #include <asm/xcr.h>
  40. #include <asm/xsave.h>
  41. #include <crypto/scatterwalk.h>
  42. #include <linux/workqueue.h>
  43. #include <linux/spinlock.h>
  44. #define TWOFISH_PARALLEL_BLOCKS 8
  45. /* regular block cipher functions from twofish_x86_64 module */
  46. asmlinkage void twofish_enc_blk(struct twofish_ctx *ctx, u8 *dst,
  47. const u8 *src);
  48. asmlinkage void twofish_dec_blk(struct twofish_ctx *ctx, u8 *dst,
  49. const u8 *src);
  50. /* 3-way parallel cipher functions from twofish_x86_64-3way module */
  51. asmlinkage void __twofish_enc_blk_3way(struct twofish_ctx *ctx, u8 *dst,
  52. const u8 *src, bool xor);
  53. asmlinkage void twofish_dec_blk_3way(struct twofish_ctx *ctx, u8 *dst,
  54. const u8 *src);
  55. static inline void twofish_enc_blk_3way(struct twofish_ctx *ctx, u8 *dst,
  56. const u8 *src)
  57. {
  58. __twofish_enc_blk_3way(ctx, dst, src, false);
  59. }
  60. static inline void twofish_enc_blk_3way_xor(struct twofish_ctx *ctx, u8 *dst,
  61. const u8 *src)
  62. {
  63. __twofish_enc_blk_3way(ctx, dst, src, true);
  64. }
  65. /* 8-way parallel cipher functions */
  66. asmlinkage void __twofish_enc_blk_8way(struct twofish_ctx *ctx, u8 *dst,
  67. const u8 *src, bool xor);
  68. asmlinkage void twofish_dec_blk_8way(struct twofish_ctx *ctx, u8 *dst,
  69. const u8 *src);
  70. static inline void twofish_enc_blk_xway(struct twofish_ctx *ctx, u8 *dst,
  71. const u8 *src)
  72. {
  73. __twofish_enc_blk_8way(ctx, dst, src, false);
  74. }
  75. static inline void twofish_enc_blk_xway_xor(struct twofish_ctx *ctx, u8 *dst,
  76. const u8 *src)
  77. {
  78. __twofish_enc_blk_8way(ctx, dst, src, true);
  79. }
  80. static inline void twofish_dec_blk_xway(struct twofish_ctx *ctx, u8 *dst,
  81. const u8 *src)
  82. {
  83. twofish_dec_blk_8way(ctx, dst, src);
  84. }
  85. struct async_twofish_ctx {
  86. struct cryptd_ablkcipher *cryptd_tfm;
  87. };
  88. static inline bool twofish_fpu_begin(bool fpu_enabled, unsigned int nbytes)
  89. {
  90. if (fpu_enabled)
  91. return true;
  92. /* AVX is only used when chunk to be processed is large enough, so
  93. * do not enable FPU until it is necessary.
  94. */
  95. if (nbytes < TF_BLOCK_SIZE * TWOFISH_PARALLEL_BLOCKS)
  96. return false;
  97. kernel_fpu_begin();
  98. return true;
  99. }
  100. static inline void twofish_fpu_end(bool fpu_enabled)
  101. {
  102. if (fpu_enabled)
  103. kernel_fpu_end();
  104. }
  105. static int ecb_crypt(struct blkcipher_desc *desc, struct blkcipher_walk *walk,
  106. bool enc)
  107. {
  108. bool fpu_enabled = false;
  109. struct twofish_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  110. const unsigned int bsize = TF_BLOCK_SIZE;
  111. unsigned int nbytes;
  112. int err;
  113. err = blkcipher_walk_virt(desc, walk);
  114. desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
  115. while ((nbytes = walk->nbytes)) {
  116. u8 *wsrc = walk->src.virt.addr;
  117. u8 *wdst = walk->dst.virt.addr;
  118. fpu_enabled = twofish_fpu_begin(fpu_enabled, nbytes);
  119. /* Process multi-block batch */
  120. if (nbytes >= bsize * TWOFISH_PARALLEL_BLOCKS) {
  121. do {
  122. if (enc)
  123. twofish_enc_blk_xway(ctx, wdst, wsrc);
  124. else
  125. twofish_dec_blk_xway(ctx, wdst, wsrc);
  126. wsrc += bsize * TWOFISH_PARALLEL_BLOCKS;
  127. wdst += bsize * TWOFISH_PARALLEL_BLOCKS;
  128. nbytes -= bsize * TWOFISH_PARALLEL_BLOCKS;
  129. } while (nbytes >= bsize * TWOFISH_PARALLEL_BLOCKS);
  130. if (nbytes < bsize)
  131. goto done;
  132. }
  133. /* Process three block batch */
  134. if (nbytes >= bsize * 3) {
  135. do {
  136. if (enc)
  137. twofish_enc_blk_3way(ctx, wdst, wsrc);
  138. else
  139. twofish_dec_blk_3way(ctx, wdst, wsrc);
  140. wsrc += bsize * 3;
  141. wdst += bsize * 3;
  142. nbytes -= bsize * 3;
  143. } while (nbytes >= bsize * 3);
  144. if (nbytes < bsize)
  145. goto done;
  146. }
  147. /* Handle leftovers */
  148. do {
  149. if (enc)
  150. twofish_enc_blk(ctx, wdst, wsrc);
  151. else
  152. twofish_dec_blk(ctx, wdst, wsrc);
  153. wsrc += bsize;
  154. wdst += bsize;
  155. nbytes -= bsize;
  156. } while (nbytes >= bsize);
  157. done:
  158. err = blkcipher_walk_done(desc, walk, nbytes);
  159. }
  160. twofish_fpu_end(fpu_enabled);
  161. return err;
  162. }
  163. static int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  164. struct scatterlist *src, unsigned int nbytes)
  165. {
  166. struct blkcipher_walk walk;
  167. blkcipher_walk_init(&walk, dst, src, nbytes);
  168. return ecb_crypt(desc, &walk, true);
  169. }
  170. static int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  171. struct scatterlist *src, unsigned int nbytes)
  172. {
  173. struct blkcipher_walk walk;
  174. blkcipher_walk_init(&walk, dst, src, nbytes);
  175. return ecb_crypt(desc, &walk, false);
  176. }
  177. static unsigned int __cbc_encrypt(struct blkcipher_desc *desc,
  178. struct blkcipher_walk *walk)
  179. {
  180. struct twofish_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  181. const unsigned int bsize = TF_BLOCK_SIZE;
  182. unsigned int nbytes = walk->nbytes;
  183. u128 *src = (u128 *)walk->src.virt.addr;
  184. u128 *dst = (u128 *)walk->dst.virt.addr;
  185. u128 *iv = (u128 *)walk->iv;
  186. do {
  187. u128_xor(dst, src, iv);
  188. twofish_enc_blk(ctx, (u8 *)dst, (u8 *)dst);
  189. iv = dst;
  190. src += 1;
  191. dst += 1;
  192. nbytes -= bsize;
  193. } while (nbytes >= bsize);
  194. u128_xor((u128 *)walk->iv, (u128 *)walk->iv, iv);
  195. return nbytes;
  196. }
  197. static int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  198. struct scatterlist *src, unsigned int nbytes)
  199. {
  200. struct blkcipher_walk walk;
  201. int err;
  202. blkcipher_walk_init(&walk, dst, src, nbytes);
  203. err = blkcipher_walk_virt(desc, &walk);
  204. while ((nbytes = walk.nbytes)) {
  205. nbytes = __cbc_encrypt(desc, &walk);
  206. err = blkcipher_walk_done(desc, &walk, nbytes);
  207. }
  208. return err;
  209. }
  210. static unsigned int __cbc_decrypt(struct blkcipher_desc *desc,
  211. struct blkcipher_walk *walk)
  212. {
  213. struct twofish_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  214. const unsigned int bsize = TF_BLOCK_SIZE;
  215. unsigned int nbytes = walk->nbytes;
  216. u128 *src = (u128 *)walk->src.virt.addr;
  217. u128 *dst = (u128 *)walk->dst.virt.addr;
  218. u128 ivs[TWOFISH_PARALLEL_BLOCKS - 1];
  219. u128 last_iv;
  220. int i;
  221. /* Start of the last block. */
  222. src += nbytes / bsize - 1;
  223. dst += nbytes / bsize - 1;
  224. last_iv = *src;
  225. /* Process multi-block batch */
  226. if (nbytes >= bsize * TWOFISH_PARALLEL_BLOCKS) {
  227. do {
  228. nbytes -= bsize * (TWOFISH_PARALLEL_BLOCKS - 1);
  229. src -= TWOFISH_PARALLEL_BLOCKS - 1;
  230. dst -= TWOFISH_PARALLEL_BLOCKS - 1;
  231. for (i = 0; i < TWOFISH_PARALLEL_BLOCKS - 1; i++)
  232. ivs[i] = src[i];
  233. twofish_dec_blk_xway(ctx, (u8 *)dst, (u8 *)src);
  234. for (i = 0; i < TWOFISH_PARALLEL_BLOCKS - 1; i++)
  235. u128_xor(dst + (i + 1), dst + (i + 1), ivs + i);
  236. nbytes -= bsize;
  237. if (nbytes < bsize)
  238. goto done;
  239. u128_xor(dst, dst, src - 1);
  240. src -= 1;
  241. dst -= 1;
  242. } while (nbytes >= bsize * TWOFISH_PARALLEL_BLOCKS);
  243. if (nbytes < bsize)
  244. goto done;
  245. }
  246. /* Process three block batch */
  247. if (nbytes >= bsize * 3) {
  248. do {
  249. nbytes -= bsize * (3 - 1);
  250. src -= 3 - 1;
  251. dst -= 3 - 1;
  252. ivs[0] = src[0];
  253. ivs[1] = src[1];
  254. twofish_dec_blk_3way(ctx, (u8 *)dst, (u8 *)src);
  255. u128_xor(dst + 1, dst + 1, ivs + 0);
  256. u128_xor(dst + 2, dst + 2, ivs + 1);
  257. nbytes -= bsize;
  258. if (nbytes < bsize)
  259. goto done;
  260. u128_xor(dst, dst, src - 1);
  261. src -= 1;
  262. dst -= 1;
  263. } while (nbytes >= bsize * 3);
  264. if (nbytes < bsize)
  265. goto done;
  266. }
  267. /* Handle leftovers */
  268. for (;;) {
  269. twofish_dec_blk(ctx, (u8 *)dst, (u8 *)src);
  270. nbytes -= bsize;
  271. if (nbytes < bsize)
  272. break;
  273. u128_xor(dst, dst, src - 1);
  274. src -= 1;
  275. dst -= 1;
  276. }
  277. done:
  278. u128_xor(dst, dst, (u128 *)walk->iv);
  279. *(u128 *)walk->iv = last_iv;
  280. return nbytes;
  281. }
  282. static int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  283. struct scatterlist *src, unsigned int nbytes)
  284. {
  285. bool fpu_enabled = false;
  286. struct blkcipher_walk walk;
  287. int err;
  288. blkcipher_walk_init(&walk, dst, src, nbytes);
  289. err = blkcipher_walk_virt(desc, &walk);
  290. desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
  291. while ((nbytes = walk.nbytes)) {
  292. fpu_enabled = twofish_fpu_begin(fpu_enabled, nbytes);
  293. nbytes = __cbc_decrypt(desc, &walk);
  294. err = blkcipher_walk_done(desc, &walk, nbytes);
  295. }
  296. twofish_fpu_end(fpu_enabled);
  297. return err;
  298. }
  299. static inline void u128_to_be128(be128 *dst, const u128 *src)
  300. {
  301. dst->a = cpu_to_be64(src->a);
  302. dst->b = cpu_to_be64(src->b);
  303. }
  304. static inline void be128_to_u128(u128 *dst, const be128 *src)
  305. {
  306. dst->a = be64_to_cpu(src->a);
  307. dst->b = be64_to_cpu(src->b);
  308. }
  309. static inline void u128_inc(u128 *i)
  310. {
  311. i->b++;
  312. if (!i->b)
  313. i->a++;
  314. }
  315. static void ctr_crypt_final(struct blkcipher_desc *desc,
  316. struct blkcipher_walk *walk)
  317. {
  318. struct twofish_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  319. u8 *ctrblk = walk->iv;
  320. u8 keystream[TF_BLOCK_SIZE];
  321. u8 *src = walk->src.virt.addr;
  322. u8 *dst = walk->dst.virt.addr;
  323. unsigned int nbytes = walk->nbytes;
  324. twofish_enc_blk(ctx, keystream, ctrblk);
  325. crypto_xor(keystream, src, nbytes);
  326. memcpy(dst, keystream, nbytes);
  327. crypto_inc(ctrblk, TF_BLOCK_SIZE);
  328. }
  329. static unsigned int __ctr_crypt(struct blkcipher_desc *desc,
  330. struct blkcipher_walk *walk)
  331. {
  332. struct twofish_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  333. const unsigned int bsize = TF_BLOCK_SIZE;
  334. unsigned int nbytes = walk->nbytes;
  335. u128 *src = (u128 *)walk->src.virt.addr;
  336. u128 *dst = (u128 *)walk->dst.virt.addr;
  337. u128 ctrblk;
  338. be128 ctrblocks[TWOFISH_PARALLEL_BLOCKS];
  339. int i;
  340. be128_to_u128(&ctrblk, (be128 *)walk->iv);
  341. /* Process multi-block batch */
  342. if (nbytes >= bsize * TWOFISH_PARALLEL_BLOCKS) {
  343. do {
  344. /* create ctrblks for parallel encrypt */
  345. for (i = 0; i < TWOFISH_PARALLEL_BLOCKS; i++) {
  346. if (dst != src)
  347. dst[i] = src[i];
  348. u128_to_be128(&ctrblocks[i], &ctrblk);
  349. u128_inc(&ctrblk);
  350. }
  351. twofish_enc_blk_xway_xor(ctx, (u8 *)dst,
  352. (u8 *)ctrblocks);
  353. src += TWOFISH_PARALLEL_BLOCKS;
  354. dst += TWOFISH_PARALLEL_BLOCKS;
  355. nbytes -= bsize * TWOFISH_PARALLEL_BLOCKS;
  356. } while (nbytes >= bsize * TWOFISH_PARALLEL_BLOCKS);
  357. if (nbytes < bsize)
  358. goto done;
  359. }
  360. /* Process three block batch */
  361. if (nbytes >= bsize * 3) {
  362. do {
  363. if (dst != src) {
  364. dst[0] = src[0];
  365. dst[1] = src[1];
  366. dst[2] = src[2];
  367. }
  368. /* create ctrblks for parallel encrypt */
  369. u128_to_be128(&ctrblocks[0], &ctrblk);
  370. u128_inc(&ctrblk);
  371. u128_to_be128(&ctrblocks[1], &ctrblk);
  372. u128_inc(&ctrblk);
  373. u128_to_be128(&ctrblocks[2], &ctrblk);
  374. u128_inc(&ctrblk);
  375. twofish_enc_blk_3way_xor(ctx, (u8 *)dst,
  376. (u8 *)ctrblocks);
  377. src += 3;
  378. dst += 3;
  379. nbytes -= bsize * 3;
  380. } while (nbytes >= bsize * 3);
  381. if (nbytes < bsize)
  382. goto done;
  383. }
  384. /* Handle leftovers */
  385. do {
  386. if (dst != src)
  387. *dst = *src;
  388. u128_to_be128(&ctrblocks[0], &ctrblk);
  389. u128_inc(&ctrblk);
  390. twofish_enc_blk(ctx, (u8 *)ctrblocks, (u8 *)ctrblocks);
  391. u128_xor(dst, dst, (u128 *)ctrblocks);
  392. src += 1;
  393. dst += 1;
  394. nbytes -= bsize;
  395. } while (nbytes >= bsize);
  396. done:
  397. u128_to_be128((be128 *)walk->iv, &ctrblk);
  398. return nbytes;
  399. }
  400. static int ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  401. struct scatterlist *src, unsigned int nbytes)
  402. {
  403. bool fpu_enabled = false;
  404. struct blkcipher_walk walk;
  405. int err;
  406. blkcipher_walk_init(&walk, dst, src, nbytes);
  407. err = blkcipher_walk_virt_block(desc, &walk, TF_BLOCK_SIZE);
  408. desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
  409. while ((nbytes = walk.nbytes) >= TF_BLOCK_SIZE) {
  410. fpu_enabled = twofish_fpu_begin(fpu_enabled, nbytes);
  411. nbytes = __ctr_crypt(desc, &walk);
  412. err = blkcipher_walk_done(desc, &walk, nbytes);
  413. }
  414. twofish_fpu_end(fpu_enabled);
  415. if (walk.nbytes) {
  416. ctr_crypt_final(desc, &walk);
  417. err = blkcipher_walk_done(desc, &walk, 0);
  418. }
  419. return err;
  420. }
  421. struct crypt_priv {
  422. struct twofish_ctx *ctx;
  423. bool fpu_enabled;
  424. };
  425. static void encrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
  426. {
  427. const unsigned int bsize = TF_BLOCK_SIZE;
  428. struct crypt_priv *ctx = priv;
  429. int i;
  430. ctx->fpu_enabled = twofish_fpu_begin(ctx->fpu_enabled, nbytes);
  431. if (nbytes == bsize * TWOFISH_PARALLEL_BLOCKS) {
  432. twofish_enc_blk_xway(ctx->ctx, srcdst, srcdst);
  433. return;
  434. }
  435. for (i = 0; i < nbytes / (bsize * 3); i++, srcdst += bsize * 3)
  436. twofish_enc_blk_3way(ctx->ctx, srcdst, srcdst);
  437. nbytes %= bsize * 3;
  438. for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
  439. twofish_enc_blk(ctx->ctx, srcdst, srcdst);
  440. }
  441. static void decrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
  442. {
  443. const unsigned int bsize = TF_BLOCK_SIZE;
  444. struct crypt_priv *ctx = priv;
  445. int i;
  446. ctx->fpu_enabled = twofish_fpu_begin(ctx->fpu_enabled, nbytes);
  447. if (nbytes == bsize * TWOFISH_PARALLEL_BLOCKS) {
  448. twofish_dec_blk_xway(ctx->ctx, srcdst, srcdst);
  449. return;
  450. }
  451. for (i = 0; i < nbytes / (bsize * 3); i++, srcdst += bsize * 3)
  452. twofish_dec_blk_3way(ctx->ctx, srcdst, srcdst);
  453. nbytes %= bsize * 3;
  454. for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
  455. twofish_dec_blk(ctx->ctx, srcdst, srcdst);
  456. }
  457. struct twofish_lrw_ctx {
  458. struct lrw_table_ctx lrw_table;
  459. struct twofish_ctx twofish_ctx;
  460. };
  461. static int lrw_twofish_setkey(struct crypto_tfm *tfm, const u8 *key,
  462. unsigned int keylen)
  463. {
  464. struct twofish_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
  465. int err;
  466. err = __twofish_setkey(&ctx->twofish_ctx, key,
  467. keylen - TF_BLOCK_SIZE, &tfm->crt_flags);
  468. if (err)
  469. return err;
  470. return lrw_init_table(&ctx->lrw_table, key + keylen -
  471. TF_BLOCK_SIZE);
  472. }
  473. static int lrw_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  474. struct scatterlist *src, unsigned int nbytes)
  475. {
  476. struct twofish_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  477. be128 buf[TWOFISH_PARALLEL_BLOCKS];
  478. struct crypt_priv crypt_ctx = {
  479. .ctx = &ctx->twofish_ctx,
  480. .fpu_enabled = false,
  481. };
  482. struct lrw_crypt_req req = {
  483. .tbuf = buf,
  484. .tbuflen = sizeof(buf),
  485. .table_ctx = &ctx->lrw_table,
  486. .crypt_ctx = &crypt_ctx,
  487. .crypt_fn = encrypt_callback,
  488. };
  489. int ret;
  490. desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
  491. ret = lrw_crypt(desc, dst, src, nbytes, &req);
  492. twofish_fpu_end(crypt_ctx.fpu_enabled);
  493. return ret;
  494. }
  495. static int lrw_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  496. struct scatterlist *src, unsigned int nbytes)
  497. {
  498. struct twofish_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  499. be128 buf[TWOFISH_PARALLEL_BLOCKS];
  500. struct crypt_priv crypt_ctx = {
  501. .ctx = &ctx->twofish_ctx,
  502. .fpu_enabled = false,
  503. };
  504. struct lrw_crypt_req req = {
  505. .tbuf = buf,
  506. .tbuflen = sizeof(buf),
  507. .table_ctx = &ctx->lrw_table,
  508. .crypt_ctx = &crypt_ctx,
  509. .crypt_fn = decrypt_callback,
  510. };
  511. int ret;
  512. desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
  513. ret = lrw_crypt(desc, dst, src, nbytes, &req);
  514. twofish_fpu_end(crypt_ctx.fpu_enabled);
  515. return ret;
  516. }
  517. static void lrw_exit_tfm(struct crypto_tfm *tfm)
  518. {
  519. struct twofish_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
  520. lrw_free_table(&ctx->lrw_table);
  521. }
  522. struct twofish_xts_ctx {
  523. struct twofish_ctx tweak_ctx;
  524. struct twofish_ctx crypt_ctx;
  525. };
  526. static int xts_twofish_setkey(struct crypto_tfm *tfm, const u8 *key,
  527. unsigned int keylen)
  528. {
  529. struct twofish_xts_ctx *ctx = crypto_tfm_ctx(tfm);
  530. u32 *flags = &tfm->crt_flags;
  531. int err;
  532. /* key consists of keys of equal size concatenated, therefore
  533. * the length must be even
  534. */
  535. if (keylen % 2) {
  536. *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
  537. return -EINVAL;
  538. }
  539. /* first half of xts-key is for crypt */
  540. err = __twofish_setkey(&ctx->crypt_ctx, key, keylen / 2, flags);
  541. if (err)
  542. return err;
  543. /* second half of xts-key is for tweak */
  544. return __twofish_setkey(&ctx->tweak_ctx,
  545. key + keylen / 2, keylen / 2, flags);
  546. }
  547. static int xts_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  548. struct scatterlist *src, unsigned int nbytes)
  549. {
  550. struct twofish_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  551. be128 buf[TWOFISH_PARALLEL_BLOCKS];
  552. struct crypt_priv crypt_ctx = {
  553. .ctx = &ctx->crypt_ctx,
  554. .fpu_enabled = false,
  555. };
  556. struct xts_crypt_req req = {
  557. .tbuf = buf,
  558. .tbuflen = sizeof(buf),
  559. .tweak_ctx = &ctx->tweak_ctx,
  560. .tweak_fn = XTS_TWEAK_CAST(twofish_enc_blk),
  561. .crypt_ctx = &crypt_ctx,
  562. .crypt_fn = encrypt_callback,
  563. };
  564. int ret;
  565. desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
  566. ret = xts_crypt(desc, dst, src, nbytes, &req);
  567. twofish_fpu_end(crypt_ctx.fpu_enabled);
  568. return ret;
  569. }
  570. static int xts_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  571. struct scatterlist *src, unsigned int nbytes)
  572. {
  573. struct twofish_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  574. be128 buf[TWOFISH_PARALLEL_BLOCKS];
  575. struct crypt_priv crypt_ctx = {
  576. .ctx = &ctx->crypt_ctx,
  577. .fpu_enabled = false,
  578. };
  579. struct xts_crypt_req req = {
  580. .tbuf = buf,
  581. .tbuflen = sizeof(buf),
  582. .tweak_ctx = &ctx->tweak_ctx,
  583. .tweak_fn = XTS_TWEAK_CAST(twofish_enc_blk),
  584. .crypt_ctx = &crypt_ctx,
  585. .crypt_fn = decrypt_callback,
  586. };
  587. int ret;
  588. desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
  589. ret = xts_crypt(desc, dst, src, nbytes, &req);
  590. twofish_fpu_end(crypt_ctx.fpu_enabled);
  591. return ret;
  592. }
  593. static int ablk_set_key(struct crypto_ablkcipher *tfm, const u8 *key,
  594. unsigned int key_len)
  595. {
  596. struct async_twofish_ctx *ctx = crypto_ablkcipher_ctx(tfm);
  597. struct crypto_ablkcipher *child = &ctx->cryptd_tfm->base;
  598. int err;
  599. crypto_ablkcipher_clear_flags(child, CRYPTO_TFM_REQ_MASK);
  600. crypto_ablkcipher_set_flags(child, crypto_ablkcipher_get_flags(tfm)
  601. & CRYPTO_TFM_REQ_MASK);
  602. err = crypto_ablkcipher_setkey(child, key, key_len);
  603. crypto_ablkcipher_set_flags(tfm, crypto_ablkcipher_get_flags(child)
  604. & CRYPTO_TFM_RES_MASK);
  605. return err;
  606. }
  607. static int __ablk_encrypt(struct ablkcipher_request *req)
  608. {
  609. struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
  610. struct async_twofish_ctx *ctx = crypto_ablkcipher_ctx(tfm);
  611. struct blkcipher_desc desc;
  612. desc.tfm = cryptd_ablkcipher_child(ctx->cryptd_tfm);
  613. desc.info = req->info;
  614. desc.flags = 0;
  615. return crypto_blkcipher_crt(desc.tfm)->encrypt(
  616. &desc, req->dst, req->src, req->nbytes);
  617. }
  618. static int ablk_encrypt(struct ablkcipher_request *req)
  619. {
  620. struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
  621. struct async_twofish_ctx *ctx = crypto_ablkcipher_ctx(tfm);
  622. if (!irq_fpu_usable()) {
  623. struct ablkcipher_request *cryptd_req =
  624. ablkcipher_request_ctx(req);
  625. memcpy(cryptd_req, req, sizeof(*req));
  626. ablkcipher_request_set_tfm(cryptd_req, &ctx->cryptd_tfm->base);
  627. return crypto_ablkcipher_encrypt(cryptd_req);
  628. } else {
  629. return __ablk_encrypt(req);
  630. }
  631. }
  632. static int ablk_decrypt(struct ablkcipher_request *req)
  633. {
  634. struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
  635. struct async_twofish_ctx *ctx = crypto_ablkcipher_ctx(tfm);
  636. if (!irq_fpu_usable()) {
  637. struct ablkcipher_request *cryptd_req =
  638. ablkcipher_request_ctx(req);
  639. memcpy(cryptd_req, req, sizeof(*req));
  640. ablkcipher_request_set_tfm(cryptd_req, &ctx->cryptd_tfm->base);
  641. return crypto_ablkcipher_decrypt(cryptd_req);
  642. } else {
  643. struct blkcipher_desc desc;
  644. desc.tfm = cryptd_ablkcipher_child(ctx->cryptd_tfm);
  645. desc.info = req->info;
  646. desc.flags = 0;
  647. return crypto_blkcipher_crt(desc.tfm)->decrypt(
  648. &desc, req->dst, req->src, req->nbytes);
  649. }
  650. }
  651. static void ablk_exit(struct crypto_tfm *tfm)
  652. {
  653. struct async_twofish_ctx *ctx = crypto_tfm_ctx(tfm);
  654. cryptd_free_ablkcipher(ctx->cryptd_tfm);
  655. }
  656. static int ablk_init(struct crypto_tfm *tfm)
  657. {
  658. struct async_twofish_ctx *ctx = crypto_tfm_ctx(tfm);
  659. struct cryptd_ablkcipher *cryptd_tfm;
  660. char drv_name[CRYPTO_MAX_ALG_NAME];
  661. snprintf(drv_name, sizeof(drv_name), "__driver-%s",
  662. crypto_tfm_alg_driver_name(tfm));
  663. cryptd_tfm = cryptd_alloc_ablkcipher(drv_name, 0, 0);
  664. if (IS_ERR(cryptd_tfm))
  665. return PTR_ERR(cryptd_tfm);
  666. ctx->cryptd_tfm = cryptd_tfm;
  667. tfm->crt_ablkcipher.reqsize = sizeof(struct ablkcipher_request) +
  668. crypto_ablkcipher_reqsize(&cryptd_tfm->base);
  669. return 0;
  670. }
  671. static struct crypto_alg twofish_algs[10] = { {
  672. .cra_name = "__ecb-twofish-avx",
  673. .cra_driver_name = "__driver-ecb-twofish-avx",
  674. .cra_priority = 0,
  675. .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
  676. .cra_blocksize = TF_BLOCK_SIZE,
  677. .cra_ctxsize = sizeof(struct twofish_ctx),
  678. .cra_alignmask = 0,
  679. .cra_type = &crypto_blkcipher_type,
  680. .cra_module = THIS_MODULE,
  681. .cra_list = LIST_HEAD_INIT(twofish_algs[0].cra_list),
  682. .cra_u = {
  683. .blkcipher = {
  684. .min_keysize = TF_MIN_KEY_SIZE,
  685. .max_keysize = TF_MAX_KEY_SIZE,
  686. .setkey = twofish_setkey,
  687. .encrypt = ecb_encrypt,
  688. .decrypt = ecb_decrypt,
  689. },
  690. },
  691. }, {
  692. .cra_name = "__cbc-twofish-avx",
  693. .cra_driver_name = "__driver-cbc-twofish-avx",
  694. .cra_priority = 0,
  695. .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
  696. .cra_blocksize = TF_BLOCK_SIZE,
  697. .cra_ctxsize = sizeof(struct twofish_ctx),
  698. .cra_alignmask = 0,
  699. .cra_type = &crypto_blkcipher_type,
  700. .cra_module = THIS_MODULE,
  701. .cra_list = LIST_HEAD_INIT(twofish_algs[1].cra_list),
  702. .cra_u = {
  703. .blkcipher = {
  704. .min_keysize = TF_MIN_KEY_SIZE,
  705. .max_keysize = TF_MAX_KEY_SIZE,
  706. .setkey = twofish_setkey,
  707. .encrypt = cbc_encrypt,
  708. .decrypt = cbc_decrypt,
  709. },
  710. },
  711. }, {
  712. .cra_name = "__ctr-twofish-avx",
  713. .cra_driver_name = "__driver-ctr-twofish-avx",
  714. .cra_priority = 0,
  715. .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
  716. .cra_blocksize = 1,
  717. .cra_ctxsize = sizeof(struct twofish_ctx),
  718. .cra_alignmask = 0,
  719. .cra_type = &crypto_blkcipher_type,
  720. .cra_module = THIS_MODULE,
  721. .cra_list = LIST_HEAD_INIT(twofish_algs[2].cra_list),
  722. .cra_u = {
  723. .blkcipher = {
  724. .min_keysize = TF_MIN_KEY_SIZE,
  725. .max_keysize = TF_MAX_KEY_SIZE,
  726. .ivsize = TF_BLOCK_SIZE,
  727. .setkey = twofish_setkey,
  728. .encrypt = ctr_crypt,
  729. .decrypt = ctr_crypt,
  730. },
  731. },
  732. }, {
  733. .cra_name = "__lrw-twofish-avx",
  734. .cra_driver_name = "__driver-lrw-twofish-avx",
  735. .cra_priority = 0,
  736. .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
  737. .cra_blocksize = TF_BLOCK_SIZE,
  738. .cra_ctxsize = sizeof(struct twofish_lrw_ctx),
  739. .cra_alignmask = 0,
  740. .cra_type = &crypto_blkcipher_type,
  741. .cra_module = THIS_MODULE,
  742. .cra_list = LIST_HEAD_INIT(twofish_algs[3].cra_list),
  743. .cra_exit = lrw_exit_tfm,
  744. .cra_u = {
  745. .blkcipher = {
  746. .min_keysize = TF_MIN_KEY_SIZE +
  747. TF_BLOCK_SIZE,
  748. .max_keysize = TF_MAX_KEY_SIZE +
  749. TF_BLOCK_SIZE,
  750. .ivsize = TF_BLOCK_SIZE,
  751. .setkey = lrw_twofish_setkey,
  752. .encrypt = lrw_encrypt,
  753. .decrypt = lrw_decrypt,
  754. },
  755. },
  756. }, {
  757. .cra_name = "__xts-twofish-avx",
  758. .cra_driver_name = "__driver-xts-twofish-avx",
  759. .cra_priority = 0,
  760. .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
  761. .cra_blocksize = TF_BLOCK_SIZE,
  762. .cra_ctxsize = sizeof(struct twofish_xts_ctx),
  763. .cra_alignmask = 0,
  764. .cra_type = &crypto_blkcipher_type,
  765. .cra_module = THIS_MODULE,
  766. .cra_list = LIST_HEAD_INIT(twofish_algs[4].cra_list),
  767. .cra_u = {
  768. .blkcipher = {
  769. .min_keysize = TF_MIN_KEY_SIZE * 2,
  770. .max_keysize = TF_MAX_KEY_SIZE * 2,
  771. .ivsize = TF_BLOCK_SIZE,
  772. .setkey = xts_twofish_setkey,
  773. .encrypt = xts_encrypt,
  774. .decrypt = xts_decrypt,
  775. },
  776. },
  777. }, {
  778. .cra_name = "ecb(twofish)",
  779. .cra_driver_name = "ecb-twofish-avx",
  780. .cra_priority = 400,
  781. .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
  782. .cra_blocksize = TF_BLOCK_SIZE,
  783. .cra_ctxsize = sizeof(struct async_twofish_ctx),
  784. .cra_alignmask = 0,
  785. .cra_type = &crypto_ablkcipher_type,
  786. .cra_module = THIS_MODULE,
  787. .cra_list = LIST_HEAD_INIT(twofish_algs[5].cra_list),
  788. .cra_init = ablk_init,
  789. .cra_exit = ablk_exit,
  790. .cra_u = {
  791. .ablkcipher = {
  792. .min_keysize = TF_MIN_KEY_SIZE,
  793. .max_keysize = TF_MAX_KEY_SIZE,
  794. .setkey = ablk_set_key,
  795. .encrypt = ablk_encrypt,
  796. .decrypt = ablk_decrypt,
  797. },
  798. },
  799. }, {
  800. .cra_name = "cbc(twofish)",
  801. .cra_driver_name = "cbc-twofish-avx",
  802. .cra_priority = 400,
  803. .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
  804. .cra_blocksize = TF_BLOCK_SIZE,
  805. .cra_ctxsize = sizeof(struct async_twofish_ctx),
  806. .cra_alignmask = 0,
  807. .cra_type = &crypto_ablkcipher_type,
  808. .cra_module = THIS_MODULE,
  809. .cra_list = LIST_HEAD_INIT(twofish_algs[6].cra_list),
  810. .cra_init = ablk_init,
  811. .cra_exit = ablk_exit,
  812. .cra_u = {
  813. .ablkcipher = {
  814. .min_keysize = TF_MIN_KEY_SIZE,
  815. .max_keysize = TF_MAX_KEY_SIZE,
  816. .ivsize = TF_BLOCK_SIZE,
  817. .setkey = ablk_set_key,
  818. .encrypt = __ablk_encrypt,
  819. .decrypt = ablk_decrypt,
  820. },
  821. },
  822. }, {
  823. .cra_name = "ctr(twofish)",
  824. .cra_driver_name = "ctr-twofish-avx",
  825. .cra_priority = 400,
  826. .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
  827. .cra_blocksize = 1,
  828. .cra_ctxsize = sizeof(struct async_twofish_ctx),
  829. .cra_alignmask = 0,
  830. .cra_type = &crypto_ablkcipher_type,
  831. .cra_module = THIS_MODULE,
  832. .cra_list = LIST_HEAD_INIT(twofish_algs[7].cra_list),
  833. .cra_init = ablk_init,
  834. .cra_exit = ablk_exit,
  835. .cra_u = {
  836. .ablkcipher = {
  837. .min_keysize = TF_MIN_KEY_SIZE,
  838. .max_keysize = TF_MAX_KEY_SIZE,
  839. .ivsize = TF_BLOCK_SIZE,
  840. .setkey = ablk_set_key,
  841. .encrypt = ablk_encrypt,
  842. .decrypt = ablk_encrypt,
  843. .geniv = "chainiv",
  844. },
  845. },
  846. }, {
  847. .cra_name = "lrw(twofish)",
  848. .cra_driver_name = "lrw-twofish-avx",
  849. .cra_priority = 400,
  850. .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
  851. .cra_blocksize = TF_BLOCK_SIZE,
  852. .cra_ctxsize = sizeof(struct async_twofish_ctx),
  853. .cra_alignmask = 0,
  854. .cra_type = &crypto_ablkcipher_type,
  855. .cra_module = THIS_MODULE,
  856. .cra_list = LIST_HEAD_INIT(twofish_algs[8].cra_list),
  857. .cra_init = ablk_init,
  858. .cra_exit = ablk_exit,
  859. .cra_u = {
  860. .ablkcipher = {
  861. .min_keysize = TF_MIN_KEY_SIZE +
  862. TF_BLOCK_SIZE,
  863. .max_keysize = TF_MAX_KEY_SIZE +
  864. TF_BLOCK_SIZE,
  865. .ivsize = TF_BLOCK_SIZE,
  866. .setkey = ablk_set_key,
  867. .encrypt = ablk_encrypt,
  868. .decrypt = ablk_decrypt,
  869. },
  870. },
  871. }, {
  872. .cra_name = "xts(twofish)",
  873. .cra_driver_name = "xts-twofish-avx",
  874. .cra_priority = 400,
  875. .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
  876. .cra_blocksize = TF_BLOCK_SIZE,
  877. .cra_ctxsize = sizeof(struct async_twofish_ctx),
  878. .cra_alignmask = 0,
  879. .cra_type = &crypto_ablkcipher_type,
  880. .cra_module = THIS_MODULE,
  881. .cra_list = LIST_HEAD_INIT(twofish_algs[9].cra_list),
  882. .cra_init = ablk_init,
  883. .cra_exit = ablk_exit,
  884. .cra_u = {
  885. .ablkcipher = {
  886. .min_keysize = TF_MIN_KEY_SIZE * 2,
  887. .max_keysize = TF_MAX_KEY_SIZE * 2,
  888. .ivsize = TF_BLOCK_SIZE,
  889. .setkey = ablk_set_key,
  890. .encrypt = ablk_encrypt,
  891. .decrypt = ablk_decrypt,
  892. },
  893. },
  894. } };
  895. static int __init twofish_init(void)
  896. {
  897. u64 xcr0;
  898. if (!cpu_has_avx || !cpu_has_osxsave) {
  899. printk(KERN_INFO "AVX instructions are not detected.\n");
  900. return -ENODEV;
  901. }
  902. xcr0 = xgetbv(XCR_XFEATURE_ENABLED_MASK);
  903. if ((xcr0 & (XSTATE_SSE | XSTATE_YMM)) != (XSTATE_SSE | XSTATE_YMM)) {
  904. printk(KERN_INFO "AVX detected but unusable.\n");
  905. return -ENODEV;
  906. }
  907. return crypto_register_algs(twofish_algs, ARRAY_SIZE(twofish_algs));
  908. }
  909. static void __exit twofish_exit(void)
  910. {
  911. crypto_unregister_algs(twofish_algs, ARRAY_SIZE(twofish_algs));
  912. }
  913. module_init(twofish_init);
  914. module_exit(twofish_exit);
  915. MODULE_DESCRIPTION("Twofish Cipher Algorithm, AVX optimized");
  916. MODULE_LICENSE("GPL");
  917. MODULE_ALIAS("twofish");