crypto: twofish - use unaligned accessors instead of alignmask

Instead of using an alignmask of 0x3 to ensure 32-bit alignment of the
Twofish input and output blocks, which propagates to mode drivers, and
results in pointless copying on architectures that don't care about
alignment, use the unaligned accessors, which will do the right thing on
each respective architecture, avoiding the need for double buffering.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Ard Biesheuvel 2021-02-01 19:02:37 +01:00 committed by Herbert Xu
parent e9cbaef511
commit af1050a4ec

View File

@ -24,7 +24,7 @@
* Third Edition. * Third Edition.
*/ */
#include <asm/byteorder.h> #include <asm/unaligned.h>
#include <crypto/twofish.h> #include <crypto/twofish.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
@ -83,11 +83,11 @@
* whitening subkey number m. */ * whitening subkey number m. */
#define INPACK(n, x, m) \ #define INPACK(n, x, m) \
x = le32_to_cpu(src[n]) ^ ctx->w[m] x = get_unaligned_le32(in + (n) * 4) ^ ctx->w[m]
#define OUTUNPACK(n, x, m) \ #define OUTUNPACK(n, x, m) \
x ^= ctx->w[m]; \ x ^= ctx->w[m]; \
dst[n] = cpu_to_le32(x) put_unaligned_le32(x, out + (n) * 4)
@ -95,8 +95,6 @@
static void twofish_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) static void twofish_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
{ {
struct twofish_ctx *ctx = crypto_tfm_ctx(tfm); struct twofish_ctx *ctx = crypto_tfm_ctx(tfm);
const __le32 *src = (const __le32 *)in;
__le32 *dst = (__le32 *)out;
/* The four 32-bit chunks of the text. */ /* The four 32-bit chunks of the text. */
u32 a, b, c, d; u32 a, b, c, d;
@ -132,8 +130,6 @@ static void twofish_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
static void twofish_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) static void twofish_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
{ {
struct twofish_ctx *ctx = crypto_tfm_ctx(tfm); struct twofish_ctx *ctx = crypto_tfm_ctx(tfm);
const __le32 *src = (const __le32 *)in;
__le32 *dst = (__le32 *)out;
/* The four 32-bit chunks of the text. */ /* The four 32-bit chunks of the text. */
u32 a, b, c, d; u32 a, b, c, d;
@ -172,7 +168,6 @@ static struct crypto_alg alg = {
.cra_flags = CRYPTO_ALG_TYPE_CIPHER, .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
.cra_blocksize = TF_BLOCK_SIZE, .cra_blocksize = TF_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct twofish_ctx), .cra_ctxsize = sizeof(struct twofish_ctx),
.cra_alignmask = 3,
.cra_module = THIS_MODULE, .cra_module = THIS_MODULE,
.cra_u = { .cipher = { .cra_u = { .cipher = {
.cia_min_keysize = TF_MIN_KEY_SIZE, .cia_min_keysize = TF_MIN_KEY_SIZE,