twofish_avx_glue.c 24 KB

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