]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: aes - Remove aes-fixed-time / CONFIG_CRYPTO_AES_TI
authorEric Biggers <ebiggers@kernel.org>
Mon, 12 Jan 2026 19:20:06 +0000 (11:20 -0800)
committerEric Biggers <ebiggers@kernel.org>
Mon, 12 Jan 2026 19:39:58 +0000 (11:39 -0800)
Remove aes-fixed-time, i.e. CONFIG_CRYPTO_AES_TI.  This was a wrapper
around the 256-byte-table-based AES implementation in lib/crypto/aes.c,
with extra code to enable and disable IRQs for constant-time hardening.

While nice in theory, in practice this had the following issues:

- For bulk en/decryption it was 2-4 times slower than aes-generic.  This
  resulted in aes-generic still being needed, creating fragmentation.

- Having both aes-generic and aes-fixed-time punted an AES
  implementation decision to distros and users who are generally
  unprepared to handle it.  In practice, whether aes-fixed-time gets
  used tends to be incidental and not match an explicit distro or user
  intent.  (While aes-fixed-time has a higher priority than aes-generic,
  whether it actually gets enabled, loaded, and used depends on the
  kconfig and whether a modprobe of "aes" happens to be done.  It also
  has a lower priority than aes-arm and aes-arm64.)

- My changes to the generic AES code (in other commits) significantly
  close the gap with aes-fixed-time anyway.  The table size is reduced
  from 8192 bytes to 1024 bytes, and prefetching is added.

- While AES code *should* be constant-time, the real solutions for that
  are AES instructions (which most CPUs have now) or bit-slicing.  arm
  and arm64 already have bit-sliced AES code for many modes; generic
  bit-sliced code could be written but would be very slow for single
  blocks.  Overall, I suggest that trying to write constant-time
  table-based AES code is a bit futile anyway, and in the rare cases
  where a proper AES implementation is still unavailable it's reasonable
  to compromise with an implementation that simply prefetches the table.

Thus, this commit removes aes-fixed-time and CONFIG_CRYPTO_AES_TI.  The
replacement is just the existing CONFIG_CRYPTO_AES, which for now maps
to the existing aes-generic code, but I'll soon be changing to use the
improved AES library code instead.

Acked-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20260112192035.10427-9-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
17 files changed:
arch/m68k/configs/amiga_defconfig
arch/m68k/configs/apollo_defconfig
arch/m68k/configs/atari_defconfig
arch/m68k/configs/bvme6000_defconfig
arch/m68k/configs/hp300_defconfig
arch/m68k/configs/mac_defconfig
arch/m68k/configs/multi_defconfig
arch/m68k/configs/mvme147_defconfig
arch/m68k/configs/mvme16x_defconfig
arch/m68k/configs/q40_defconfig
arch/m68k/configs/sun3_defconfig
arch/m68k/configs/sun3x_defconfig
arch/s390/configs/debug_defconfig
arch/s390/configs/defconfig
crypto/Kconfig
crypto/Makefile
crypto/aes_ti.c [deleted file]

index bfc1ee7c8158d6e165cd2d6ba71415866b5c5625..bffcc417f44c715a543ab6cc96a09f60d76df463 100644 (file)
@@ -555,7 +555,6 @@ CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
 CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index d9d1f3c4c70d7808a74876b3c1faf13d0465da46..3f894c20b13283cc4168ca6bfee5efdbc2db6f8a 100644 (file)
@@ -512,7 +512,6 @@ CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
 CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index 523205adccc89f673bb9f2b3fd65173f377cec1c..5c5603ca16aae2e243cbde4785f5409cf56f9069 100644 (file)
@@ -532,7 +532,6 @@ CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
 CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index 7b0a4ef0b010f21f9762bc5d651c55b9c9c42251..37c747ee395ecfb17cfdeeddd13c373355c6704d 100644 (file)
@@ -504,7 +504,6 @@ CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
 CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index 089c5c394c625fd6d77255f3754376386a35fd57..1a376c2b8c45ecba872e86c5bcd518ec62dd5be1 100644 (file)
@@ -514,7 +514,6 @@ CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
 CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index 5f2484c36733de81f461b5935bc0cd4fbf36af65..2b26450692a538b5cef66e2574893ffaa9b7912b 100644 (file)
@@ -531,7 +531,6 @@ CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
 CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index 74f0a1f6d8717fc0abf2c64dda36d81cbb43b4d0..012e0e1f506fe737aff5569aadfcc8f633eaf524 100644 (file)
@@ -618,7 +618,6 @@ CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
 CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index 4bee18c820e4cf97c543324560800c47d7780663..37634b35bfbd9d761dddf8c554dc21aa2f281730 100644 (file)
@@ -504,7 +504,6 @@ CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
 CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index 322c17e55c9aeddce8a75b4399112cfa701d1b3b..a0d2e0070afaf7f64983922f3ce721f4e9e497bc 100644 (file)
@@ -505,7 +505,6 @@ CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
 CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index 82f9baab8feaa8bbd9fb5c0970ac035e7f4eac77..62cc3964fc343df4004dfa28a66b3a6eb6c4c360 100644 (file)
@@ -521,7 +521,6 @@ CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
 CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index f94ad226cb5b5a6089870a537d110c7c70fb2403..13107aa4a1b49a5bb81fa7086df7f83f6cf1884e 100644 (file)
@@ -502,7 +502,6 @@ CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
 CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index a5ecfc505ab2df43724f532b86cbf2d2b5b718e6..eaab0ba089893e4fd8eaa83876f8b77f4dbd3acd 100644 (file)
@@ -502,7 +502,6 @@ CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
 CONFIG_CRYPTO_AES=y
-CONFIG_CRYPTO_AES_TI=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index 0713914b25b4696449e205e2b1779edc66478c00..09f4bdb9e64fe62179ca65c293d5d0cf739a5862 100644 (file)
@@ -770,7 +770,7 @@ CONFIG_CRYPTO_DH=m
 CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
-CONFIG_CRYPTO_AES_TI=m
+CONFIG_CRYPTO_AES=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index c064e0cacc9897475ea9089b42d0490eb24944e3..823193b9f4c69f2a68931be01fec3c48e7a3eff7 100644 (file)
@@ -754,7 +754,7 @@ CONFIG_CRYPTO_DH=m
 CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=m
 CONFIG_CRYPTO_ECRDSA=m
-CONFIG_CRYPTO_AES_TI=m
+CONFIG_CRYPTO_AES=m
 CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_ARIA=m
 CONFIG_CRYPTO_BLOWFISH=m
index 443fe8e016fd5bb302f2baab42ae140121f2380a..db6b0c2fb50e4e49697a9cb10fb9adb687e20696 100644 (file)
@@ -366,27 +366,6 @@ config CRYPTO_AES
 
          The AES specifies three key sizes: 128, 192 and 256 bits
 
-config CRYPTO_AES_TI
-       tristate "AES (Advanced Encryption Standard) (fixed time)"
-       select CRYPTO_ALGAPI
-       select CRYPTO_LIB_AES
-       help
-         AES cipher algorithms (Rijndael)(FIPS-197, ISO/IEC 18033-3)
-
-         This is a generic implementation of AES that attempts to eliminate
-         data dependent latencies as much as possible without affecting
-         performance too much. It is intended for use by the generic CCM
-         and GCM drivers, and other CTR or CMAC/XCBC based modes that rely
-         solely on encryption (although decryption is supported as well, but
-         with a more dramatic performance hit)
-
-         Instead of using 16 lookup tables of 1 KB each, (8 for encryption and
-         8 for decryption), this implementation only uses just two S-boxes of
-         256 bytes each, and attempts to eliminate data dependent latencies by
-         prefetching the entire table into the cache at the start of each
-         block. Interrupts are also disabled to avoid races where cachelines
-         are evicted when the CPU is interrupted to do something else.
-
 config CRYPTO_ANUBIS
        tristate "Anubis"
        depends on CRYPTO_USER_API_ENABLE_OBSOLETE
index 23d3db7be4257c94f67ed605a996606b8eee8839..be403dc20645412a951a9aa213e61f4fe2960277 100644 (file)
@@ -134,7 +134,6 @@ obj-$(CONFIG_CRYPTO_AES) += aes_generic.o
 CFLAGS_aes_generic.o := $(call cc-option,-fno-code-hoisting) # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83356
 obj-$(CONFIG_CRYPTO_SM4) += sm4.o
 obj-$(CONFIG_CRYPTO_SM4_GENERIC) += sm4_generic.o
-obj-$(CONFIG_CRYPTO_AES_TI) += aes_ti.o
 obj-$(CONFIG_CRYPTO_CAMELLIA) += camellia_generic.o
 obj-$(CONFIG_CRYPTO_CAST_COMMON) += cast_common.o
 obj-$(CONFIG_CRYPTO_CAST5) += cast5_generic.o
diff --git a/crypto/aes_ti.c b/crypto/aes_ti.c
deleted file mode 100644 (file)
index a3b342f..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Scalar fixed time AES core transform
- *
- * Copyright (C) 2017 Linaro Ltd <ard.biesheuvel@linaro.org>
- */
-
-#include <crypto/aes.h>
-#include <crypto/algapi.h>
-#include <linux/module.h>
-
-static int aesti_set_key(struct crypto_tfm *tfm, const u8 *in_key,
-                        unsigned int key_len)
-{
-       struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
-
-       return aes_expandkey(ctx, in_key, key_len);
-}
-
-static void aesti_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
-{
-       const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
-       unsigned long flags;
-
-       /*
-        * Temporarily disable interrupts to avoid races where cachelines are
-        * evicted when the CPU is interrupted to do something else.
-        */
-       local_irq_save(flags);
-
-       aes_encrypt(ctx, out, in);
-
-       local_irq_restore(flags);
-}
-
-static void aesti_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
-{
-       const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
-       unsigned long flags;
-
-       /*
-        * Temporarily disable interrupts to avoid races where cachelines are
-        * evicted when the CPU is interrupted to do something else.
-        */
-       local_irq_save(flags);
-
-       aes_decrypt(ctx, out, in);
-
-       local_irq_restore(flags);
-}
-
-static struct crypto_alg aes_alg = {
-       .cra_name                       = "aes",
-       .cra_driver_name                = "aes-fixed-time",
-       .cra_priority                   = 100 + 1,
-       .cra_flags                      = CRYPTO_ALG_TYPE_CIPHER,
-       .cra_blocksize                  = AES_BLOCK_SIZE,
-       .cra_ctxsize                    = sizeof(struct crypto_aes_ctx),
-       .cra_module                     = THIS_MODULE,
-
-       .cra_cipher.cia_min_keysize     = AES_MIN_KEY_SIZE,
-       .cra_cipher.cia_max_keysize     = AES_MAX_KEY_SIZE,
-       .cra_cipher.cia_setkey          = aesti_set_key,
-       .cra_cipher.cia_encrypt         = aesti_encrypt,
-       .cra_cipher.cia_decrypt         = aesti_decrypt
-};
-
-static int __init aes_init(void)
-{
-       return crypto_register_alg(&aes_alg);
-}
-
-static void __exit aes_fini(void)
-{
-       crypto_unregister_alg(&aes_alg);
-}
-
-module_init(aes_init);
-module_exit(aes_fini);
-
-MODULE_DESCRIPTION("Generic fixed time AES");
-MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
-MODULE_LICENSE("GPL v2");