twofish_glue_3way.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. /*
  2. * Glue Code for 3-way parallel assembler optimized version of Twofish
  3. *
  4. * Copyright (c) 2011 Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
  5. *
  6. * CBC & ECB parts based on code (crypto/cbc.c,ecb.c) by:
  7. * Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au>
  8. * CTR part based on code (crypto/ctr.c) by:
  9. * (C) Copyright IBM Corp. 2007 - Joy Latten <latten@us.ibm.com>
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with this program; if not, write to the Free Software
  23. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  24. * USA
  25. *
  26. */
  27. #include <linux/crypto.h>
  28. #include <linux/init.h>
  29. #include <linux/module.h>
  30. #include <linux/types.h>
  31. #include <crypto/algapi.h>
  32. #include <crypto/twofish.h>
  33. #include <crypto/b128ops.h>
  34. #include <crypto/lrw.h>
  35. #include <crypto/xts.h>
  36. /* regular block cipher functions from twofish_x86_64 module */
  37. asmlinkage void twofish_enc_blk(struct twofish_ctx *ctx, u8 *dst,
  38. const u8 *src);
  39. asmlinkage void twofish_dec_blk(struct twofish_ctx *ctx, u8 *dst,
  40. const u8 *src);
  41. /* 3-way parallel cipher functions */
  42. asmlinkage void __twofish_enc_blk_3way(struct twofish_ctx *ctx, u8 *dst,
  43. const u8 *src, bool xor);
  44. asmlinkage void twofish_dec_blk_3way(struct twofish_ctx *ctx, u8 *dst,
  45. const u8 *src);
  46. static inline void twofish_enc_blk_3way(struct twofish_ctx *ctx, u8 *dst,
  47. const u8 *src)
  48. {
  49. __twofish_enc_blk_3way(ctx, dst, src, false);
  50. }
  51. static inline void twofish_enc_blk_xor_3way(struct twofish_ctx *ctx, u8 *dst,
  52. const u8 *src)
  53. {
  54. __twofish_enc_blk_3way(ctx, dst, src, true);
  55. }
  56. static int ecb_crypt(struct blkcipher_desc *desc, struct blkcipher_walk *walk,
  57. void (*fn)(struct twofish_ctx *, u8 *, const u8 *),
  58. void (*fn_3way)(struct twofish_ctx *, u8 *, const u8 *))
  59. {
  60. struct twofish_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  61. unsigned int bsize = TF_BLOCK_SIZE;
  62. unsigned int nbytes;
  63. int err;
  64. err = blkcipher_walk_virt(desc, walk);
  65. while ((nbytes = walk->nbytes)) {
  66. u8 *wsrc = walk->src.virt.addr;
  67. u8 *wdst = walk->dst.virt.addr;
  68. /* Process three block batch */
  69. if (nbytes >= bsize * 3) {
  70. do {
  71. fn_3way(ctx, wdst, wsrc);
  72. wsrc += bsize * 3;
  73. wdst += bsize * 3;
  74. nbytes -= bsize * 3;
  75. } while (nbytes >= bsize * 3);
  76. if (nbytes < bsize)
  77. goto done;
  78. }
  79. /* Handle leftovers */
  80. do {
  81. fn(ctx, wdst, wsrc);
  82. wsrc += bsize;
  83. wdst += bsize;
  84. nbytes -= bsize;
  85. } while (nbytes >= bsize);
  86. done:
  87. err = blkcipher_walk_done(desc, walk, nbytes);
  88. }
  89. return err;
  90. }
  91. static int ecb_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  92. struct scatterlist *src, unsigned int nbytes)
  93. {
  94. struct blkcipher_walk walk;
  95. blkcipher_walk_init(&walk, dst, src, nbytes);
  96. return ecb_crypt(desc, &walk, twofish_enc_blk, twofish_enc_blk_3way);
  97. }
  98. static int ecb_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  99. struct scatterlist *src, unsigned int nbytes)
  100. {
  101. struct blkcipher_walk walk;
  102. blkcipher_walk_init(&walk, dst, src, nbytes);
  103. return ecb_crypt(desc, &walk, twofish_dec_blk, twofish_dec_blk_3way);
  104. }
  105. static struct crypto_alg blk_ecb_alg = {
  106. .cra_name = "ecb(twofish)",
  107. .cra_driver_name = "ecb-twofish-3way",
  108. .cra_priority = 300,
  109. .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
  110. .cra_blocksize = TF_BLOCK_SIZE,
  111. .cra_ctxsize = sizeof(struct twofish_ctx),
  112. .cra_alignmask = 0,
  113. .cra_type = &crypto_blkcipher_type,
  114. .cra_module = THIS_MODULE,
  115. .cra_list = LIST_HEAD_INIT(blk_ecb_alg.cra_list),
  116. .cra_u = {
  117. .blkcipher = {
  118. .min_keysize = TF_MIN_KEY_SIZE,
  119. .max_keysize = TF_MAX_KEY_SIZE,
  120. .setkey = twofish_setkey,
  121. .encrypt = ecb_encrypt,
  122. .decrypt = ecb_decrypt,
  123. },
  124. },
  125. };
  126. static unsigned int __cbc_encrypt(struct blkcipher_desc *desc,
  127. struct blkcipher_walk *walk)
  128. {
  129. struct twofish_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  130. unsigned int bsize = TF_BLOCK_SIZE;
  131. unsigned int nbytes = walk->nbytes;
  132. u128 *src = (u128 *)walk->src.virt.addr;
  133. u128 *dst = (u128 *)walk->dst.virt.addr;
  134. u128 *iv = (u128 *)walk->iv;
  135. do {
  136. u128_xor(dst, src, iv);
  137. twofish_enc_blk(ctx, (u8 *)dst, (u8 *)dst);
  138. iv = dst;
  139. src += 1;
  140. dst += 1;
  141. nbytes -= bsize;
  142. } while (nbytes >= bsize);
  143. u128_xor((u128 *)walk->iv, (u128 *)walk->iv, iv);
  144. return nbytes;
  145. }
  146. static int cbc_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  147. struct scatterlist *src, unsigned int nbytes)
  148. {
  149. struct blkcipher_walk walk;
  150. int err;
  151. blkcipher_walk_init(&walk, dst, src, nbytes);
  152. err = blkcipher_walk_virt(desc, &walk);
  153. while ((nbytes = walk.nbytes)) {
  154. nbytes = __cbc_encrypt(desc, &walk);
  155. err = blkcipher_walk_done(desc, &walk, nbytes);
  156. }
  157. return err;
  158. }
  159. static unsigned int __cbc_decrypt(struct blkcipher_desc *desc,
  160. struct blkcipher_walk *walk)
  161. {
  162. struct twofish_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  163. unsigned int bsize = TF_BLOCK_SIZE;
  164. unsigned int nbytes = walk->nbytes;
  165. u128 *src = (u128 *)walk->src.virt.addr;
  166. u128 *dst = (u128 *)walk->dst.virt.addr;
  167. u128 ivs[3 - 1];
  168. u128 last_iv;
  169. /* Start of the last block. */
  170. src += nbytes / bsize - 1;
  171. dst += nbytes / bsize - 1;
  172. last_iv = *src;
  173. /* Process three block batch */
  174. if (nbytes >= bsize * 3) {
  175. do {
  176. nbytes -= bsize * (3 - 1);
  177. src -= 3 - 1;
  178. dst -= 3 - 1;
  179. ivs[0] = src[0];
  180. ivs[1] = src[1];
  181. twofish_dec_blk_3way(ctx, (u8 *)dst, (u8 *)src);
  182. u128_xor(dst + 1, dst + 1, ivs + 0);
  183. u128_xor(dst + 2, dst + 2, ivs + 1);
  184. nbytes -= bsize;
  185. if (nbytes < bsize)
  186. goto done;
  187. u128_xor(dst, dst, src - 1);
  188. src -= 1;
  189. dst -= 1;
  190. } while (nbytes >= bsize * 3);
  191. if (nbytes < bsize)
  192. goto done;
  193. }
  194. /* Handle leftovers */
  195. for (;;) {
  196. twofish_dec_blk(ctx, (u8 *)dst, (u8 *)src);
  197. nbytes -= bsize;
  198. if (nbytes < bsize)
  199. break;
  200. u128_xor(dst, dst, src - 1);
  201. src -= 1;
  202. dst -= 1;
  203. }
  204. done:
  205. u128_xor(dst, dst, (u128 *)walk->iv);
  206. *(u128 *)walk->iv = last_iv;
  207. return nbytes;
  208. }
  209. static int cbc_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  210. struct scatterlist *src, unsigned int nbytes)
  211. {
  212. struct blkcipher_walk walk;
  213. int err;
  214. blkcipher_walk_init(&walk, dst, src, nbytes);
  215. err = blkcipher_walk_virt(desc, &walk);
  216. while ((nbytes = walk.nbytes)) {
  217. nbytes = __cbc_decrypt(desc, &walk);
  218. err = blkcipher_walk_done(desc, &walk, nbytes);
  219. }
  220. return err;
  221. }
  222. static struct crypto_alg blk_cbc_alg = {
  223. .cra_name = "cbc(twofish)",
  224. .cra_driver_name = "cbc-twofish-3way",
  225. .cra_priority = 300,
  226. .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
  227. .cra_blocksize = TF_BLOCK_SIZE,
  228. .cra_ctxsize = sizeof(struct twofish_ctx),
  229. .cra_alignmask = 0,
  230. .cra_type = &crypto_blkcipher_type,
  231. .cra_module = THIS_MODULE,
  232. .cra_list = LIST_HEAD_INIT(blk_cbc_alg.cra_list),
  233. .cra_u = {
  234. .blkcipher = {
  235. .min_keysize = TF_MIN_KEY_SIZE,
  236. .max_keysize = TF_MAX_KEY_SIZE,
  237. .ivsize = TF_BLOCK_SIZE,
  238. .setkey = twofish_setkey,
  239. .encrypt = cbc_encrypt,
  240. .decrypt = cbc_decrypt,
  241. },
  242. },
  243. };
  244. static inline void u128_to_be128(be128 *dst, const u128 *src)
  245. {
  246. dst->a = cpu_to_be64(src->a);
  247. dst->b = cpu_to_be64(src->b);
  248. }
  249. static inline void be128_to_u128(u128 *dst, const be128 *src)
  250. {
  251. dst->a = be64_to_cpu(src->a);
  252. dst->b = be64_to_cpu(src->b);
  253. }
  254. static inline void u128_inc(u128 *i)
  255. {
  256. i->b++;
  257. if (!i->b)
  258. i->a++;
  259. }
  260. static void ctr_crypt_final(struct blkcipher_desc *desc,
  261. struct blkcipher_walk *walk)
  262. {
  263. struct twofish_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  264. u8 *ctrblk = walk->iv;
  265. u8 keystream[TF_BLOCK_SIZE];
  266. u8 *src = walk->src.virt.addr;
  267. u8 *dst = walk->dst.virt.addr;
  268. unsigned int nbytes = walk->nbytes;
  269. twofish_enc_blk(ctx, keystream, ctrblk);
  270. crypto_xor(keystream, src, nbytes);
  271. memcpy(dst, keystream, nbytes);
  272. crypto_inc(ctrblk, TF_BLOCK_SIZE);
  273. }
  274. static unsigned int __ctr_crypt(struct blkcipher_desc *desc,
  275. struct blkcipher_walk *walk)
  276. {
  277. struct twofish_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  278. unsigned int bsize = TF_BLOCK_SIZE;
  279. unsigned int nbytes = walk->nbytes;
  280. u128 *src = (u128 *)walk->src.virt.addr;
  281. u128 *dst = (u128 *)walk->dst.virt.addr;
  282. u128 ctrblk;
  283. be128 ctrblocks[3];
  284. be128_to_u128(&ctrblk, (be128 *)walk->iv);
  285. /* Process three block batch */
  286. if (nbytes >= bsize * 3) {
  287. do {
  288. if (dst != src) {
  289. dst[0] = src[0];
  290. dst[1] = src[1];
  291. dst[2] = src[2];
  292. }
  293. /* create ctrblks for parallel encrypt */
  294. u128_to_be128(&ctrblocks[0], &ctrblk);
  295. u128_inc(&ctrblk);
  296. u128_to_be128(&ctrblocks[1], &ctrblk);
  297. u128_inc(&ctrblk);
  298. u128_to_be128(&ctrblocks[2], &ctrblk);
  299. u128_inc(&ctrblk);
  300. twofish_enc_blk_xor_3way(ctx, (u8 *)dst,
  301. (u8 *)ctrblocks);
  302. src += 3;
  303. dst += 3;
  304. nbytes -= bsize * 3;
  305. } while (nbytes >= bsize * 3);
  306. if (nbytes < bsize)
  307. goto done;
  308. }
  309. /* Handle leftovers */
  310. do {
  311. if (dst != src)
  312. *dst = *src;
  313. u128_to_be128(&ctrblocks[0], &ctrblk);
  314. u128_inc(&ctrblk);
  315. twofish_enc_blk(ctx, (u8 *)ctrblocks, (u8 *)ctrblocks);
  316. u128_xor(dst, dst, (u128 *)ctrblocks);
  317. src += 1;
  318. dst += 1;
  319. nbytes -= bsize;
  320. } while (nbytes >= bsize);
  321. done:
  322. u128_to_be128((be128 *)walk->iv, &ctrblk);
  323. return nbytes;
  324. }
  325. static int ctr_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  326. struct scatterlist *src, unsigned int nbytes)
  327. {
  328. struct blkcipher_walk walk;
  329. int err;
  330. blkcipher_walk_init(&walk, dst, src, nbytes);
  331. err = blkcipher_walk_virt_block(desc, &walk, TF_BLOCK_SIZE);
  332. while ((nbytes = walk.nbytes) >= TF_BLOCK_SIZE) {
  333. nbytes = __ctr_crypt(desc, &walk);
  334. err = blkcipher_walk_done(desc, &walk, nbytes);
  335. }
  336. if (walk.nbytes) {
  337. ctr_crypt_final(desc, &walk);
  338. err = blkcipher_walk_done(desc, &walk, 0);
  339. }
  340. return err;
  341. }
  342. static struct crypto_alg blk_ctr_alg = {
  343. .cra_name = "ctr(twofish)",
  344. .cra_driver_name = "ctr-twofish-3way",
  345. .cra_priority = 300,
  346. .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
  347. .cra_blocksize = 1,
  348. .cra_ctxsize = sizeof(struct twofish_ctx),
  349. .cra_alignmask = 0,
  350. .cra_type = &crypto_blkcipher_type,
  351. .cra_module = THIS_MODULE,
  352. .cra_list = LIST_HEAD_INIT(blk_ctr_alg.cra_list),
  353. .cra_u = {
  354. .blkcipher = {
  355. .min_keysize = TF_MIN_KEY_SIZE,
  356. .max_keysize = TF_MAX_KEY_SIZE,
  357. .ivsize = TF_BLOCK_SIZE,
  358. .setkey = twofish_setkey,
  359. .encrypt = ctr_crypt,
  360. .decrypt = ctr_crypt,
  361. },
  362. },
  363. };
  364. static void encrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
  365. {
  366. const unsigned int bsize = TF_BLOCK_SIZE;
  367. struct twofish_ctx *ctx = priv;
  368. int i;
  369. if (nbytes == 3 * bsize) {
  370. twofish_enc_blk_3way(ctx, srcdst, srcdst);
  371. return;
  372. }
  373. for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
  374. twofish_enc_blk(ctx, srcdst, srcdst);
  375. }
  376. static void decrypt_callback(void *priv, u8 *srcdst, unsigned int nbytes)
  377. {
  378. const unsigned int bsize = TF_BLOCK_SIZE;
  379. struct twofish_ctx *ctx = priv;
  380. int i;
  381. if (nbytes == 3 * bsize) {
  382. twofish_dec_blk_3way(ctx, srcdst, srcdst);
  383. return;
  384. }
  385. for (i = 0; i < nbytes / bsize; i++, srcdst += bsize)
  386. twofish_dec_blk(ctx, srcdst, srcdst);
  387. }
  388. struct twofish_lrw_ctx {
  389. struct lrw_table_ctx lrw_table;
  390. struct twofish_ctx twofish_ctx;
  391. };
  392. static int lrw_twofish_setkey(struct crypto_tfm *tfm, const u8 *key,
  393. unsigned int keylen)
  394. {
  395. struct twofish_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
  396. int err;
  397. err = __twofish_setkey(&ctx->twofish_ctx, key, keylen - TF_BLOCK_SIZE,
  398. &tfm->crt_flags);
  399. if (err)
  400. return err;
  401. return lrw_init_table(&ctx->lrw_table, key + keylen - TF_BLOCK_SIZE);
  402. }
  403. static int lrw_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  404. struct scatterlist *src, unsigned int nbytes)
  405. {
  406. struct twofish_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  407. be128 buf[3];
  408. struct lrw_crypt_req req = {
  409. .tbuf = buf,
  410. .tbuflen = sizeof(buf),
  411. .table_ctx = &ctx->lrw_table,
  412. .crypt_ctx = &ctx->twofish_ctx,
  413. .crypt_fn = encrypt_callback,
  414. };
  415. return lrw_crypt(desc, dst, src, nbytes, &req);
  416. }
  417. static int lrw_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  418. struct scatterlist *src, unsigned int nbytes)
  419. {
  420. struct twofish_lrw_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  421. be128 buf[3];
  422. struct lrw_crypt_req req = {
  423. .tbuf = buf,
  424. .tbuflen = sizeof(buf),
  425. .table_ctx = &ctx->lrw_table,
  426. .crypt_ctx = &ctx->twofish_ctx,
  427. .crypt_fn = decrypt_callback,
  428. };
  429. return lrw_crypt(desc, dst, src, nbytes, &req);
  430. }
  431. static void lrw_exit_tfm(struct crypto_tfm *tfm)
  432. {
  433. struct twofish_lrw_ctx *ctx = crypto_tfm_ctx(tfm);
  434. lrw_free_table(&ctx->lrw_table);
  435. }
  436. static struct crypto_alg blk_lrw_alg = {
  437. .cra_name = "lrw(twofish)",
  438. .cra_driver_name = "lrw-twofish-3way",
  439. .cra_priority = 300,
  440. .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
  441. .cra_blocksize = TF_BLOCK_SIZE,
  442. .cra_ctxsize = sizeof(struct twofish_lrw_ctx),
  443. .cra_alignmask = 0,
  444. .cra_type = &crypto_blkcipher_type,
  445. .cra_module = THIS_MODULE,
  446. .cra_list = LIST_HEAD_INIT(blk_lrw_alg.cra_list),
  447. .cra_exit = lrw_exit_tfm,
  448. .cra_u = {
  449. .blkcipher = {
  450. .min_keysize = TF_MIN_KEY_SIZE + TF_BLOCK_SIZE,
  451. .max_keysize = TF_MAX_KEY_SIZE + TF_BLOCK_SIZE,
  452. .ivsize = TF_BLOCK_SIZE,
  453. .setkey = lrw_twofish_setkey,
  454. .encrypt = lrw_encrypt,
  455. .decrypt = lrw_decrypt,
  456. },
  457. },
  458. };
  459. struct twofish_xts_ctx {
  460. struct twofish_ctx tweak_ctx;
  461. struct twofish_ctx crypt_ctx;
  462. };
  463. static int xts_twofish_setkey(struct crypto_tfm *tfm, const u8 *key,
  464. unsigned int keylen)
  465. {
  466. struct twofish_xts_ctx *ctx = crypto_tfm_ctx(tfm);
  467. u32 *flags = &tfm->crt_flags;
  468. int err;
  469. /* key consists of keys of equal size concatenated, therefore
  470. * the length must be even
  471. */
  472. if (keylen % 2) {
  473. *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
  474. return -EINVAL;
  475. }
  476. /* first half of xts-key is for crypt */
  477. err = __twofish_setkey(&ctx->crypt_ctx, key, keylen / 2, flags);
  478. if (err)
  479. return err;
  480. /* second half of xts-key is for tweak */
  481. return __twofish_setkey(&ctx->tweak_ctx, key + keylen / 2, keylen / 2,
  482. flags);
  483. }
  484. static int xts_encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  485. struct scatterlist *src, unsigned int nbytes)
  486. {
  487. struct twofish_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  488. be128 buf[3];
  489. struct xts_crypt_req req = {
  490. .tbuf = buf,
  491. .tbuflen = sizeof(buf),
  492. .tweak_ctx = &ctx->tweak_ctx,
  493. .tweak_fn = XTS_TWEAK_CAST(twofish_enc_blk),
  494. .crypt_ctx = &ctx->crypt_ctx,
  495. .crypt_fn = encrypt_callback,
  496. };
  497. return xts_crypt(desc, dst, src, nbytes, &req);
  498. }
  499. static int xts_decrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
  500. struct scatterlist *src, unsigned int nbytes)
  501. {
  502. struct twofish_xts_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
  503. be128 buf[3];
  504. struct xts_crypt_req req = {
  505. .tbuf = buf,
  506. .tbuflen = sizeof(buf),
  507. .tweak_ctx = &ctx->tweak_ctx,
  508. .tweak_fn = XTS_TWEAK_CAST(twofish_enc_blk),
  509. .crypt_ctx = &ctx->crypt_ctx,
  510. .crypt_fn = decrypt_callback,
  511. };
  512. return xts_crypt(desc, dst, src, nbytes, &req);
  513. }
  514. static struct crypto_alg blk_xts_alg = {
  515. .cra_name = "xts(twofish)",
  516. .cra_driver_name = "xts-twofish-3way",
  517. .cra_priority = 300,
  518. .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
  519. .cra_blocksize = TF_BLOCK_SIZE,
  520. .cra_ctxsize = sizeof(struct twofish_xts_ctx),
  521. .cra_alignmask = 0,
  522. .cra_type = &crypto_blkcipher_type,
  523. .cra_module = THIS_MODULE,
  524. .cra_list = LIST_HEAD_INIT(blk_xts_alg.cra_list),
  525. .cra_u = {
  526. .blkcipher = {
  527. .min_keysize = TF_MIN_KEY_SIZE * 2,
  528. .max_keysize = TF_MAX_KEY_SIZE * 2,
  529. .ivsize = TF_BLOCK_SIZE,
  530. .setkey = xts_twofish_setkey,
  531. .encrypt = xts_encrypt,
  532. .decrypt = xts_decrypt,
  533. },
  534. },
  535. };
  536. int __init init(void)
  537. {
  538. int err;
  539. err = crypto_register_alg(&blk_ecb_alg);
  540. if (err)
  541. goto ecb_err;
  542. err = crypto_register_alg(&blk_cbc_alg);
  543. if (err)
  544. goto cbc_err;
  545. err = crypto_register_alg(&blk_ctr_alg);
  546. if (err)
  547. goto ctr_err;
  548. err = crypto_register_alg(&blk_lrw_alg);
  549. if (err)
  550. goto blk_lrw_err;
  551. err = crypto_register_alg(&blk_xts_alg);
  552. if (err)
  553. goto blk_xts_err;
  554. return 0;
  555. crypto_unregister_alg(&blk_xts_alg);
  556. blk_xts_err:
  557. crypto_unregister_alg(&blk_lrw_alg);
  558. blk_lrw_err:
  559. crypto_unregister_alg(&blk_ctr_alg);
  560. ctr_err:
  561. crypto_unregister_alg(&blk_cbc_alg);
  562. cbc_err:
  563. crypto_unregister_alg(&blk_ecb_alg);
  564. ecb_err:
  565. return err;
  566. }
  567. void __exit fini(void)
  568. {
  569. crypto_unregister_alg(&blk_xts_alg);
  570. crypto_unregister_alg(&blk_lrw_alg);
  571. crypto_unregister_alg(&blk_ctr_alg);
  572. crypto_unregister_alg(&blk_cbc_alg);
  573. crypto_unregister_alg(&blk_ecb_alg);
  574. }
  575. module_init(init);
  576. module_exit(fini);
  577. MODULE_LICENSE("GPL");
  578. MODULE_DESCRIPTION("Twofish Cipher Algorithm, 3-way parallel asm optimized");
  579. MODULE_ALIAS("twofish");
  580. MODULE_ALIAS("twofish-asm");