162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Twofish for CryptoAPI 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Originally Twofish for GPG 662306a36Sopenharmony_ci * By Matthew Skala <mskala@ansuz.sooke.bc.ca>, July 26, 1998 762306a36Sopenharmony_ci * 256-bit key length added March 20, 1999 862306a36Sopenharmony_ci * Some modifications to reduce the text size by Werner Koch, April, 1998 962306a36Sopenharmony_ci * Ported to the kerneli patch by Marc Mutz <Marc@Mutz.com> 1062306a36Sopenharmony_ci * Ported to CryptoAPI by Colin Slater <hoho@tacomeat.net> 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * The original author has disclaimed all copyright interest in this 1362306a36Sopenharmony_ci * code and thus put it in the public domain. The subsequent authors 1462306a36Sopenharmony_ci * have put this under the GNU General Public License. 1562306a36Sopenharmony_ci * 1662306a36Sopenharmony_ci * This code is a "clean room" implementation, written from the paper 1762306a36Sopenharmony_ci * _Twofish: A 128-Bit Block Cipher_ by Bruce Schneier, John Kelsey, 1862306a36Sopenharmony_ci * Doug Whiting, David Wagner, Chris Hall, and Niels Ferguson, available 1962306a36Sopenharmony_ci * through http://www.counterpane.com/twofish.html 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * For background information on multiplication in finite fields, used for 2262306a36Sopenharmony_ci * the matrix operations in the key schedule, see the book _Contemporary 2362306a36Sopenharmony_ci * Abstract Algebra_ by Joseph A. Gallian, especially chapter 22 in the 2462306a36Sopenharmony_ci * Third Edition. 2562306a36Sopenharmony_ci */ 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#include <asm/unaligned.h> 2862306a36Sopenharmony_ci#include <crypto/algapi.h> 2962306a36Sopenharmony_ci#include <crypto/twofish.h> 3062306a36Sopenharmony_ci#include <linux/module.h> 3162306a36Sopenharmony_ci#include <linux/init.h> 3262306a36Sopenharmony_ci#include <linux/types.h> 3362306a36Sopenharmony_ci#include <linux/errno.h> 3462306a36Sopenharmony_ci#include <linux/bitops.h> 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* Macros to compute the g() function in the encryption and decryption 3762306a36Sopenharmony_ci * rounds. G1 is the straight g() function; G2 includes the 8-bit 3862306a36Sopenharmony_ci * rotation for the high 32-bit word. */ 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define G1(a) \ 4162306a36Sopenharmony_ci (ctx->s[0][(a) & 0xFF]) ^ (ctx->s[1][((a) >> 8) & 0xFF]) \ 4262306a36Sopenharmony_ci ^ (ctx->s[2][((a) >> 16) & 0xFF]) ^ (ctx->s[3][(a) >> 24]) 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define G2(b) \ 4562306a36Sopenharmony_ci (ctx->s[1][(b) & 0xFF]) ^ (ctx->s[2][((b) >> 8) & 0xFF]) \ 4662306a36Sopenharmony_ci ^ (ctx->s[3][((b) >> 16) & 0xFF]) ^ (ctx->s[0][(b) >> 24]) 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci/* Encryption and decryption Feistel rounds. Each one calls the two g() 4962306a36Sopenharmony_ci * macros, does the PHT, and performs the XOR and the appropriate bit 5062306a36Sopenharmony_ci * rotations. The parameters are the round number (used to select subkeys), 5162306a36Sopenharmony_ci * and the four 32-bit chunks of the text. */ 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define ENCROUND(n, a, b, c, d) \ 5462306a36Sopenharmony_ci x = G1 (a); y = G2 (b); \ 5562306a36Sopenharmony_ci x += y; y += x + ctx->k[2 * (n) + 1]; \ 5662306a36Sopenharmony_ci (c) ^= x + ctx->k[2 * (n)]; \ 5762306a36Sopenharmony_ci (c) = ror32((c), 1); \ 5862306a36Sopenharmony_ci (d) = rol32((d), 1) ^ y 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define DECROUND(n, a, b, c, d) \ 6162306a36Sopenharmony_ci x = G1 (a); y = G2 (b); \ 6262306a36Sopenharmony_ci x += y; y += x; \ 6362306a36Sopenharmony_ci (d) ^= y + ctx->k[2 * (n) + 1]; \ 6462306a36Sopenharmony_ci (d) = ror32((d), 1); \ 6562306a36Sopenharmony_ci (c) = rol32((c), 1); \ 6662306a36Sopenharmony_ci (c) ^= (x + ctx->k[2 * (n)]) 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci/* Encryption and decryption cycles; each one is simply two Feistel rounds 6962306a36Sopenharmony_ci * with the 32-bit chunks re-ordered to simulate the "swap" */ 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci#define ENCCYCLE(n) \ 7262306a36Sopenharmony_ci ENCROUND (2 * (n), a, b, c, d); \ 7362306a36Sopenharmony_ci ENCROUND (2 * (n) + 1, c, d, a, b) 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci#define DECCYCLE(n) \ 7662306a36Sopenharmony_ci DECROUND (2 * (n) + 1, c, d, a, b); \ 7762306a36Sopenharmony_ci DECROUND (2 * (n), a, b, c, d) 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci/* Macros to convert the input and output bytes into 32-bit words, 8062306a36Sopenharmony_ci * and simultaneously perform the whitening step. INPACK packs word 8162306a36Sopenharmony_ci * number n into the variable named by x, using whitening subkey number m. 8262306a36Sopenharmony_ci * OUTUNPACK unpacks word number n from the variable named by x, using 8362306a36Sopenharmony_ci * whitening subkey number m. */ 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define INPACK(n, x, m) \ 8662306a36Sopenharmony_ci x = get_unaligned_le32(in + (n) * 4) ^ ctx->w[m] 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci#define OUTUNPACK(n, x, m) \ 8962306a36Sopenharmony_ci x ^= ctx->w[m]; \ 9062306a36Sopenharmony_ci put_unaligned_le32(x, out + (n) * 4) 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci/* Encrypt one block. in and out may be the same. */ 9562306a36Sopenharmony_cistatic void twofish_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci struct twofish_ctx *ctx = crypto_tfm_ctx(tfm); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci /* The four 32-bit chunks of the text. */ 10062306a36Sopenharmony_ci u32 a, b, c, d; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci /* Temporaries used by the round function. */ 10362306a36Sopenharmony_ci u32 x, y; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci /* Input whitening and packing. */ 10662306a36Sopenharmony_ci INPACK (0, a, 0); 10762306a36Sopenharmony_ci INPACK (1, b, 1); 10862306a36Sopenharmony_ci INPACK (2, c, 2); 10962306a36Sopenharmony_ci INPACK (3, d, 3); 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci /* Encryption Feistel cycles. */ 11262306a36Sopenharmony_ci ENCCYCLE (0); 11362306a36Sopenharmony_ci ENCCYCLE (1); 11462306a36Sopenharmony_ci ENCCYCLE (2); 11562306a36Sopenharmony_ci ENCCYCLE (3); 11662306a36Sopenharmony_ci ENCCYCLE (4); 11762306a36Sopenharmony_ci ENCCYCLE (5); 11862306a36Sopenharmony_ci ENCCYCLE (6); 11962306a36Sopenharmony_ci ENCCYCLE (7); 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci /* Output whitening and unpacking. */ 12262306a36Sopenharmony_ci OUTUNPACK (0, c, 4); 12362306a36Sopenharmony_ci OUTUNPACK (1, d, 5); 12462306a36Sopenharmony_ci OUTUNPACK (2, a, 6); 12562306a36Sopenharmony_ci OUTUNPACK (3, b, 7); 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci} 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci/* Decrypt one block. in and out may be the same. */ 13062306a36Sopenharmony_cistatic void twofish_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) 13162306a36Sopenharmony_ci{ 13262306a36Sopenharmony_ci struct twofish_ctx *ctx = crypto_tfm_ctx(tfm); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci /* The four 32-bit chunks of the text. */ 13562306a36Sopenharmony_ci u32 a, b, c, d; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci /* Temporaries used by the round function. */ 13862306a36Sopenharmony_ci u32 x, y; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci /* Input whitening and packing. */ 14162306a36Sopenharmony_ci INPACK (0, c, 4); 14262306a36Sopenharmony_ci INPACK (1, d, 5); 14362306a36Sopenharmony_ci INPACK (2, a, 6); 14462306a36Sopenharmony_ci INPACK (3, b, 7); 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci /* Encryption Feistel cycles. */ 14762306a36Sopenharmony_ci DECCYCLE (7); 14862306a36Sopenharmony_ci DECCYCLE (6); 14962306a36Sopenharmony_ci DECCYCLE (5); 15062306a36Sopenharmony_ci DECCYCLE (4); 15162306a36Sopenharmony_ci DECCYCLE (3); 15262306a36Sopenharmony_ci DECCYCLE (2); 15362306a36Sopenharmony_ci DECCYCLE (1); 15462306a36Sopenharmony_ci DECCYCLE (0); 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci /* Output whitening and unpacking. */ 15762306a36Sopenharmony_ci OUTUNPACK (0, a, 0); 15862306a36Sopenharmony_ci OUTUNPACK (1, b, 1); 15962306a36Sopenharmony_ci OUTUNPACK (2, c, 2); 16062306a36Sopenharmony_ci OUTUNPACK (3, d, 3); 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci} 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistatic struct crypto_alg alg = { 16562306a36Sopenharmony_ci .cra_name = "twofish", 16662306a36Sopenharmony_ci .cra_driver_name = "twofish-generic", 16762306a36Sopenharmony_ci .cra_priority = 100, 16862306a36Sopenharmony_ci .cra_flags = CRYPTO_ALG_TYPE_CIPHER, 16962306a36Sopenharmony_ci .cra_blocksize = TF_BLOCK_SIZE, 17062306a36Sopenharmony_ci .cra_ctxsize = sizeof(struct twofish_ctx), 17162306a36Sopenharmony_ci .cra_module = THIS_MODULE, 17262306a36Sopenharmony_ci .cra_u = { .cipher = { 17362306a36Sopenharmony_ci .cia_min_keysize = TF_MIN_KEY_SIZE, 17462306a36Sopenharmony_ci .cia_max_keysize = TF_MAX_KEY_SIZE, 17562306a36Sopenharmony_ci .cia_setkey = twofish_setkey, 17662306a36Sopenharmony_ci .cia_encrypt = twofish_encrypt, 17762306a36Sopenharmony_ci .cia_decrypt = twofish_decrypt } } 17862306a36Sopenharmony_ci}; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_cistatic int __init twofish_mod_init(void) 18162306a36Sopenharmony_ci{ 18262306a36Sopenharmony_ci return crypto_register_alg(&alg); 18362306a36Sopenharmony_ci} 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_cistatic void __exit twofish_mod_fini(void) 18662306a36Sopenharmony_ci{ 18762306a36Sopenharmony_ci crypto_unregister_alg(&alg); 18862306a36Sopenharmony_ci} 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_cisubsys_initcall(twofish_mod_init); 19162306a36Sopenharmony_cimodule_exit(twofish_mod_fini); 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 19462306a36Sopenharmony_ciMODULE_DESCRIPTION ("Twofish Cipher Algorithm"); 19562306a36Sopenharmony_ciMODULE_ALIAS_CRYPTO("twofish"); 19662306a36Sopenharmony_ciMODULE_ALIAS_CRYPTO("twofish-generic"); 197