The generic table based AES implementation uses 16 KB worth of lookup tables, where 4 base tables of 1 KB each are emitted three additional times with the coefficients rotated by 1, 2 and 3 bytes, respectively. Given that many architectures tolerate unaligned accesses at moderate cost, we can sacrifice a bit of performance and reduce the D-cache footprint of these tables by 50%, by merging the prerotated coefficients into a single table consisting of entries of double width. For instance, the first entry of crypto_ft_tab, is currently emitted four times, each 1024 bytes apart, as 0xa56363c6 0x6363c6a5 0x63c6a563 0xc6a56363 Instead, we can emit a single entry 0xa56363c6a56363c6 and replace the 1024 byte offset with a 1 byte offset. Since the performance penalty of using unaligned accesses is not data dependent, reducing the D-cache footprint like this should hopefully reduce the time variance of this code, i.e., the correlation between bits of the key and the processing latency. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx> --- This is mostly a discussion piece, since it won't apply cleanly at the moment, and it lacks some handling for other users of the lookup tables exported by this driver (ARM/arm64 scalar AES and AEGIS). However, since it looks like we will be dropping the x86 AES asm drivers, systems without AES-NI instructions will be falling back to this generic driver instead. The assumption is that the reduced D-cache footprint will make it harder to infer key bits from processing latency, based on the fact that more table lookups will hit cachelines that were brought in by prior table lookups, hence reducing the colleration between timing and data. I'd be interested in comments, and if you care about the performance of this code on your system, please come back with benchmark numbers (tcrypt mode 200) crypto/Kconfig | 11 + crypto/aes_generic.c | 583 ++++++++++---------- include/crypto/aes.h | 14 +- 3 files changed, 324 insertions(+), 284 deletions(-) diff --git a/crypto/Kconfig b/crypto/Kconfig index c4b96f2e1344..f16934e0efb7 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig @@ -1084,6 +1084,17 @@ config CRYPTO_AES See <http://csrc.nist.gov/CryptoToolkit/aes/> for more information. +config CRYPTO_AES_REDUCED_TABLES + bool "Use reduced AES table set" + depends on CRYPTO_AES && HAVE_EFFICIENT_UNALIGNED_ACCESS + default y + help + Use a set of AES lookup tables that is only half the size, but + uses unaligned accesses to fetch the data. Given that the D-cache + pressure of table based AES induces timing variances that can + sometimes be exploited to infer key bits when the plaintext is + known, this should typically be left enabled. + config CRYPTO_AES_TI tristate "Fixed time AES cipher" select CRYPTO_ALGAPI diff --git a/crypto/aes_generic.c b/crypto/aes_generic.c index f217568917e4..4fbf04c84604 100644 --- a/crypto/aes_generic.c +++ b/crypto/aes_generic.c @@ -56,6 +56,12 @@ #include <asm/byteorder.h> #include <asm/unaligned.h> +#ifdef CONFIG_CRYPTO_AES_REDUCED_TABLES +#define W(w) (((u64)(w) << 32) | (w)) +#else +#define W(w) (w) +#endif + static inline u8 byte(const u32 x, const unsigned n) { return x >> (n << 3); @@ -64,72 +70,73 @@ static inline u8 byte(const u32 x, const unsigned n) static const u32 rco_tab[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 }; /* cacheline-aligned to facilitate prefetching into cache */ -__visible const u32 crypto_ft_tab[4][256] ____cacheline_aligned = { +__visible const aes_table_word_t crypto_ft_tab[][256] ____cacheline_aligned = { { - 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, - 0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, - 0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56, - 0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec, - 0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa, - 0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb, - 0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, - 0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b, - 0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c, - 0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83, - 0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9, - 0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a, - 0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d, - 0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f, - 0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df, - 0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, - 0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34, - 0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b, - 0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d, - 0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413, - 0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1, - 0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6, - 0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972, - 0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85, - 0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed, - 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, - 0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe, - 0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b, - 0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05, - 0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1, - 0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, - 0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf, - 0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3, - 0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e, - 0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a, - 0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6, - 0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3, - 0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b, - 0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428, - 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad, - 0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, - 0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8, - 0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4, - 0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2, - 0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda, - 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, - 0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf, - 0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810, - 0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c, - 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697, - 0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, - 0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, - 0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc, - 0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c, - 0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969, - 0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27, - 0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122, - 0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433, - 0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9, - 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5, - 0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, - 0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0, - 0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e, - 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c, + W(0xa56363c6), W(0x847c7cf8), W(0x997777ee), W(0x8d7b7bf6), + W(0x0df2f2ff), W(0xbd6b6bd6), W(0xb16f6fde), W(0x54c5c591), + W(0x50303060), W(0x03010102), W(0xa96767ce), W(0x7d2b2b56), + W(0x19fefee7), W(0x62d7d7b5), W(0xe6abab4d), W(0x9a7676ec), + W(0x45caca8f), W(0x9d82821f), W(0x40c9c989), W(0x877d7dfa), + W(0x15fafaef), W(0xeb5959b2), W(0xc947478e), W(0x0bf0f0fb), + W(0xecadad41), W(0x67d4d4b3), W(0xfda2a25f), W(0xeaafaf45), + W(0xbf9c9c23), W(0xf7a4a453), W(0x967272e4), W(0x5bc0c09b), + W(0xc2b7b775), W(0x1cfdfde1), W(0xae93933d), W(0x6a26264c), + W(0x5a36366c), W(0x413f3f7e), W(0x02f7f7f5), W(0x4fcccc83), + W(0x5c343468), W(0xf4a5a551), W(0x34e5e5d1), W(0x08f1f1f9), + W(0x937171e2), W(0x73d8d8ab), W(0x53313162), W(0x3f15152a), + W(0x0c040408), W(0x52c7c795), W(0x65232346), W(0x5ec3c39d), + W(0x28181830), W(0xa1969637), W(0x0f05050a), W(0xb59a9a2f), + W(0x0907070e), W(0x36121224), W(0x9b80801b), W(0x3de2e2df), + W(0x26ebebcd), W(0x6927274e), W(0xcdb2b27f), W(0x9f7575ea), + W(0x1b090912), W(0x9e83831d), W(0x742c2c58), W(0x2e1a1a34), + W(0x2d1b1b36), W(0xb26e6edc), W(0xee5a5ab4), W(0xfba0a05b), + W(0xf65252a4), W(0x4d3b3b76), W(0x61d6d6b7), W(0xceb3b37d), + W(0x7b292952), W(0x3ee3e3dd), W(0x712f2f5e), W(0x97848413), + W(0xf55353a6), W(0x68d1d1b9), W(0x00000000), W(0x2cededc1), + W(0x60202040), W(0x1ffcfce3), W(0xc8b1b179), W(0xed5b5bb6), + W(0xbe6a6ad4), W(0x46cbcb8d), W(0xd9bebe67), W(0x4b393972), + W(0xde4a4a94), W(0xd44c4c98), W(0xe85858b0), W(0x4acfcf85), + W(0x6bd0d0bb), W(0x2aefefc5), W(0xe5aaaa4f), W(0x16fbfbed), + W(0xc5434386), W(0xd74d4d9a), W(0x55333366), W(0x94858511), + W(0xcf45458a), W(0x10f9f9e9), W(0x06020204), W(0x817f7ffe), + W(0xf05050a0), W(0x443c3c78), W(0xba9f9f25), W(0xe3a8a84b), + W(0xf35151a2), W(0xfea3a35d), W(0xc0404080), W(0x8a8f8f05), + W(0xad92923f), W(0xbc9d9d21), W(0x48383870), W(0x04f5f5f1), + W(0xdfbcbc63), W(0xc1b6b677), W(0x75dadaaf), W(0x63212142), + W(0x30101020), W(0x1affffe5), W(0x0ef3f3fd), W(0x6dd2d2bf), + W(0x4ccdcd81), W(0x140c0c18), W(0x35131326), W(0x2fececc3), + W(0xe15f5fbe), W(0xa2979735), W(0xcc444488), W(0x3917172e), + W(0x57c4c493), W(0xf2a7a755), W(0x827e7efc), W(0x473d3d7a), + W(0xac6464c8), W(0xe75d5dba), W(0x2b191932), W(0x957373e6), + W(0xa06060c0), W(0x98818119), W(0xd14f4f9e), W(0x7fdcdca3), + W(0x66222244), W(0x7e2a2a54), W(0xab90903b), W(0x8388880b), + W(0xca46468c), W(0x29eeeec7), W(0xd3b8b86b), W(0x3c141428), + W(0x79dedea7), W(0xe25e5ebc), W(0x1d0b0b16), W(0x76dbdbad), + W(0x3be0e0db), W(0x56323264), W(0x4e3a3a74), W(0x1e0a0a14), + W(0xdb494992), W(0x0a06060c), W(0x6c242448), W(0xe45c5cb8), + W(0x5dc2c29f), W(0x6ed3d3bd), W(0xefacac43), W(0xa66262c4), + W(0xa8919139), W(0xa4959531), W(0x37e4e4d3), W(0x8b7979f2), + W(0x32e7e7d5), W(0x43c8c88b), W(0x5937376e), W(0xb76d6dda), + W(0x8c8d8d01), W(0x64d5d5b1), W(0xd24e4e9c), W(0xe0a9a949), + W(0xb46c6cd8), W(0xfa5656ac), W(0x07f4f4f3), W(0x25eaeacf), + W(0xaf6565ca), W(0x8e7a7af4), W(0xe9aeae47), W(0x18080810), + W(0xd5baba6f), W(0x887878f0), W(0x6f25254a), W(0x722e2e5c), + W(0x241c1c38), W(0xf1a6a657), W(0xc7b4b473), W(0x51c6c697), + W(0x23e8e8cb), W(0x7cdddda1), W(0x9c7474e8), W(0x211f1f3e), + W(0xdd4b4b96), W(0xdcbdbd61), W(0x868b8b0d), W(0x858a8a0f), + W(0x907070e0), W(0x423e3e7c), W(0xc4b5b571), W(0xaa6666cc), + W(0xd8484890), W(0x05030306), W(0x01f6f6f7), W(0x120e0e1c), + W(0xa36161c2), W(0x5f35356a), W(0xf95757ae), W(0xd0b9b969), + W(0x91868617), W(0x58c1c199), W(0x271d1d3a), W(0xb99e9e27), + W(0x38e1e1d9), W(0x13f8f8eb), W(0xb398982b), W(0x33111122), + W(0xbb6969d2), W(0x70d9d9a9), W(0x898e8e07), W(0xa7949433), + W(0xb69b9b2d), W(0x221e1e3c), W(0x92878715), W(0x20e9e9c9), + W(0x49cece87), W(0xff5555aa), W(0x78282850), W(0x7adfdfa5), + W(0x8f8c8c03), W(0xf8a1a159), W(0x80898909), W(0x170d0d1a), + W(0xdabfbf65), W(0x31e6e6d7), W(0xc6424284), W(0xb86868d0), + W(0xc3414182), W(0xb0999929), W(0x772d2d5a), W(0x110f0f1e), + W(0xcbb0b07b), W(0xfc5454a8), W(0xd6bbbb6d), W(0x3a16162c), +#ifndef CONFIG_CRYPTO_AES_REDUCED_TABLES }, { 0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d, 0xf2f2ff0d, 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154, @@ -325,75 +332,77 @@ __visible const u32 crypto_ft_tab[4][256] ____cacheline_aligned = { 0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868, 0x82c34141, 0x29b09999, 0x5a772d2d, 0x1e110f0f, 0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616, +#endif } }; -__visible const u32 crypto_fl_tab[4][256] ____cacheline_aligned = { +__visible const aes_table_word_t crypto_fl_tab[][256] ____cacheline_aligned = { { - 0x00000063, 0x0000007c, 0x00000077, 0x0000007b, - 0x000000f2, 0x0000006b, 0x0000006f, 0x000000c5, - 0x00000030, 0x00000001, 0x00000067, 0x0000002b, - 0x000000fe, 0x000000d7, 0x000000ab, 0x00000076, - 0x000000ca, 0x00000082, 0x000000c9, 0x0000007d, - 0x000000fa, 0x00000059, 0x00000047, 0x000000f0, - 0x000000ad, 0x000000d4, 0x000000a2, 0x000000af, - 0x0000009c, 0x000000a4, 0x00000072, 0x000000c0, - 0x000000b7, 0x000000fd, 0x00000093, 0x00000026, - 0x00000036, 0x0000003f, 0x000000f7, 0x000000cc, - 0x00000034, 0x000000a5, 0x000000e5, 0x000000f1, - 0x00000071, 0x000000d8, 0x00000031, 0x00000015, - 0x00000004, 0x000000c7, 0x00000023, 0x000000c3, - 0x00000018, 0x00000096, 0x00000005, 0x0000009a, - 0x00000007, 0x00000012, 0x00000080, 0x000000e2, - 0x000000eb, 0x00000027, 0x000000b2, 0x00000075, - 0x00000009, 0x00000083, 0x0000002c, 0x0000001a, - 0x0000001b, 0x0000006e, 0x0000005a, 0x000000a0, - 0x00000052, 0x0000003b, 0x000000d6, 0x000000b3, - 0x00000029, 0x000000e3, 0x0000002f, 0x00000084, - 0x00000053, 0x000000d1, 0x00000000, 0x000000ed, - 0x00000020, 0x000000fc, 0x000000b1, 0x0000005b, - 0x0000006a, 0x000000cb, 0x000000be, 0x00000039, - 0x0000004a, 0x0000004c, 0x00000058, 0x000000cf, - 0x000000d0, 0x000000ef, 0x000000aa, 0x000000fb, - 0x00000043, 0x0000004d, 0x00000033, 0x00000085, - 0x00000045, 0x000000f9, 0x00000002, 0x0000007f, - 0x00000050, 0x0000003c, 0x0000009f, 0x000000a8, - 0x00000051, 0x000000a3, 0x00000040, 0x0000008f, - 0x00000092, 0x0000009d, 0x00000038, 0x000000f5, - 0x000000bc, 0x000000b6, 0x000000da, 0x00000021, - 0x00000010, 0x000000ff, 0x000000f3, 0x000000d2, - 0x000000cd, 0x0000000c, 0x00000013, 0x000000ec, - 0x0000005f, 0x00000097, 0x00000044, 0x00000017, - 0x000000c4, 0x000000a7, 0x0000007e, 0x0000003d, - 0x00000064, 0x0000005d, 0x00000019, 0x00000073, - 0x00000060, 0x00000081, 0x0000004f, 0x000000dc, - 0x00000022, 0x0000002a, 0x00000090, 0x00000088, - 0x00000046, 0x000000ee, 0x000000b8, 0x00000014, - 0x000000de, 0x0000005e, 0x0000000b, 0x000000db, - 0x000000e0, 0x00000032, 0x0000003a, 0x0000000a, - 0x00000049, 0x00000006, 0x00000024, 0x0000005c, - 0x000000c2, 0x000000d3, 0x000000ac, 0x00000062, - 0x00000091, 0x00000095, 0x000000e4, 0x00000079, - 0x000000e7, 0x000000c8, 0x00000037, 0x0000006d, - 0x0000008d, 0x000000d5, 0x0000004e, 0x000000a9, - 0x0000006c, 0x00000056, 0x000000f4, 0x000000ea, - 0x00000065, 0x0000007a, 0x000000ae, 0x00000008, - 0x000000ba, 0x00000078, 0x00000025, 0x0000002e, - 0x0000001c, 0x000000a6, 0x000000b4, 0x000000c6, - 0x000000e8, 0x000000dd, 0x00000074, 0x0000001f, - 0x0000004b, 0x000000bd, 0x0000008b, 0x0000008a, - 0x00000070, 0x0000003e, 0x000000b5, 0x00000066, - 0x00000048, 0x00000003, 0x000000f6, 0x0000000e, - 0x00000061, 0x00000035, 0x00000057, 0x000000b9, - 0x00000086, 0x000000c1, 0x0000001d, 0x0000009e, - 0x000000e1, 0x000000f8, 0x00000098, 0x00000011, - 0x00000069, 0x000000d9, 0x0000008e, 0x00000094, - 0x0000009b, 0x0000001e, 0x00000087, 0x000000e9, - 0x000000ce, 0x00000055, 0x00000028, 0x000000df, - 0x0000008c, 0x000000a1, 0x00000089, 0x0000000d, - 0x000000bf, 0x000000e6, 0x00000042, 0x00000068, - 0x00000041, 0x00000099, 0x0000002d, 0x0000000f, - 0x000000b0, 0x00000054, 0x000000bb, 0x00000016, + W(0x00000063), W(0x0000007c), W(0x00000077), W(0x0000007b), + W(0x000000f2), W(0x0000006b), W(0x0000006f), W(0x000000c5), + W(0x00000030), W(0x00000001), W(0x00000067), W(0x0000002b), + W(0x000000fe), W(0x000000d7), W(0x000000ab), W(0x00000076), + W(0x000000ca), W(0x00000082), W(0x000000c9), W(0x0000007d), + W(0x000000fa), W(0x00000059), W(0x00000047), W(0x000000f0), + W(0x000000ad), W(0x000000d4), W(0x000000a2), W(0x000000af), + W(0x0000009c), W(0x000000a4), W(0x00000072), W(0x000000c0), + W(0x000000b7), W(0x000000fd), W(0x00000093), W(0x00000026), + W(0x00000036), W(0x0000003f), W(0x000000f7), W(0x000000cc), + W(0x00000034), W(0x000000a5), W(0x000000e5), W(0x000000f1), + W(0x00000071), W(0x000000d8), W(0x00000031), W(0x00000015), + W(0x00000004), W(0x000000c7), W(0x00000023), W(0x000000c3), + W(0x00000018), W(0x00000096), W(0x00000005), W(0x0000009a), + W(0x00000007), W(0x00000012), W(0x00000080), W(0x000000e2), + W(0x000000eb), W(0x00000027), W(0x000000b2), W(0x00000075), + W(0x00000009), W(0x00000083), W(0x0000002c), W(0x0000001a), + W(0x0000001b), W(0x0000006e), W(0x0000005a), W(0x000000a0), + W(0x00000052), W(0x0000003b), W(0x000000d6), W(0x000000b3), + W(0x00000029), W(0x000000e3), W(0x0000002f), W(0x00000084), + W(0x00000053), W(0x000000d1), W(0x00000000), W(0x000000ed), + W(0x00000020), W(0x000000fc), W(0x000000b1), W(0x0000005b), + W(0x0000006a), W(0x000000cb), W(0x000000be), W(0x00000039), + W(0x0000004a), W(0x0000004c), W(0x00000058), W(0x000000cf), + W(0x000000d0), W(0x000000ef), W(0x000000aa), W(0x000000fb), + W(0x00000043), W(0x0000004d), W(0x00000033), W(0x00000085), + W(0x00000045), W(0x000000f9), W(0x00000002), W(0x0000007f), + W(0x00000050), W(0x0000003c), W(0x0000009f), W(0x000000a8), + W(0x00000051), W(0x000000a3), W(0x00000040), W(0x0000008f), + W(0x00000092), W(0x0000009d), W(0x00000038), W(0x000000f5), + W(0x000000bc), W(0x000000b6), W(0x000000da), W(0x00000021), + W(0x00000010), W(0x000000ff), W(0x000000f3), W(0x000000d2), + W(0x000000cd), W(0x0000000c), W(0x00000013), W(0x000000ec), + W(0x0000005f), W(0x00000097), W(0x00000044), W(0x00000017), + W(0x000000c4), W(0x000000a7), W(0x0000007e), W(0x0000003d), + W(0x00000064), W(0x0000005d), W(0x00000019), W(0x00000073), + W(0x00000060), W(0x00000081), W(0x0000004f), W(0x000000dc), + W(0x00000022), W(0x0000002a), W(0x00000090), W(0x00000088), + W(0x00000046), W(0x000000ee), W(0x000000b8), W(0x00000014), + W(0x000000de), W(0x0000005e), W(0x0000000b), W(0x000000db), + W(0x000000e0), W(0x00000032), W(0x0000003a), W(0x0000000a), + W(0x00000049), W(0x00000006), W(0x00000024), W(0x0000005c), + W(0x000000c2), W(0x000000d3), W(0x000000ac), W(0x00000062), + W(0x00000091), W(0x00000095), W(0x000000e4), W(0x00000079), + W(0x000000e7), W(0x000000c8), W(0x00000037), W(0x0000006d), + W(0x0000008d), W(0x000000d5), W(0x0000004e), W(0x000000a9), + W(0x0000006c), W(0x00000056), W(0x000000f4), W(0x000000ea), + W(0x00000065), W(0x0000007a), W(0x000000ae), W(0x00000008), + W(0x000000ba), W(0x00000078), W(0x00000025), W(0x0000002e), + W(0x0000001c), W(0x000000a6), W(0x000000b4), W(0x000000c6), + W(0x000000e8), W(0x000000dd), W(0x00000074), W(0x0000001f), + W(0x0000004b), W(0x000000bd), W(0x0000008b), W(0x0000008a), + W(0x00000070), W(0x0000003e), W(0x000000b5), W(0x00000066), + W(0x00000048), W(0x00000003), W(0x000000f6), W(0x0000000e), + W(0x00000061), W(0x00000035), W(0x00000057), W(0x000000b9), + W(0x00000086), W(0x000000c1), W(0x0000001d), W(0x0000009e), + W(0x000000e1), W(0x000000f8), W(0x00000098), W(0x00000011), + W(0x00000069), W(0x000000d9), W(0x0000008e), W(0x00000094), + W(0x0000009b), W(0x0000001e), W(0x00000087), W(0x000000e9), + W(0x000000ce), W(0x00000055), W(0x00000028), W(0x000000df), + W(0x0000008c), W(0x000000a1), W(0x00000089), W(0x0000000d), + W(0x000000bf), W(0x000000e6), W(0x00000042), W(0x00000068), + W(0x00000041), W(0x00000099), W(0x0000002d), W(0x0000000f), + W(0x000000b0), W(0x00000054), W(0x000000bb), W(0x00000016), +#ifndef CONFIG_CRYPTO_AES_REDUCED_TABLES }, { 0x00006300, 0x00007c00, 0x00007700, 0x00007b00, 0x0000f200, 0x00006b00, 0x00006f00, 0x0000c500, @@ -589,75 +598,77 @@ __visible const u32 crypto_fl_tab[4][256] ____cacheline_aligned = { 0xbf000000, 0xe6000000, 0x42000000, 0x68000000, 0x41000000, 0x99000000, 0x2d000000, 0x0f000000, 0xb0000000, 0x54000000, 0xbb000000, 0x16000000, +#endif } }; -__visible const u32 crypto_it_tab[4][256] ____cacheline_aligned = { +__visible const aes_table_word_t crypto_it_tab[][256] ____cacheline_aligned = { { - 0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a, - 0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b, - 0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5, - 0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5, - 0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d, - 0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b, - 0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295, - 0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e, - 0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927, - 0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d, - 0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362, - 0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9, - 0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52, - 0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566, - 0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3, - 0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed, - 0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e, - 0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4, - 0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4, - 0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd, - 0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d, - 0xb58d5491, 0x055dc471, 0x6fd40604, 0xff155060, - 0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967, - 0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879, - 0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000, - 0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c, - 0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36, - 0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624, - 0xb1670a0c, 0x0fe75793, 0xd296eeb4, 0x9e919b1b, - 0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c, - 0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12, - 0x0b0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14, - 0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3, - 0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b, - 0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8, - 0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684, - 0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7, - 0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177, - 0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947, - 0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322, - 0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498, - 0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f, - 0xe49d3a2c, 0x0d927850, 0x9bcc5f6a, 0x62467e54, - 0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382, - 0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf, - 0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb, - 0x097826cd, 0xf418596e, 0x01b79aec, 0xa89a4f83, - 0x656e95e6, 0x7ee6ffaa, 0x08cfbc21, 0xe6e815ef, - 0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029, - 0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235, - 0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733, - 0x4a9804f1, 0xf7daec41, 0x0e50cd7f, 0x2ff69117, - 0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4, - 0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546, - 0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb, - 0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d, - 0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb, - 0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a, - 0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773, - 0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478, - 0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2, - 0x72c31d16, 0x0c25e2bc, 0x8b493c28, 0x41950dff, - 0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664, - 0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0, + W(0x50a7f451), W(0x5365417e), W(0xc3a4171a), W(0x965e273a), + W(0xcb6bab3b), W(0xf1459d1f), W(0xab58faac), W(0x9303e34b), + W(0x55fa3020), W(0xf66d76ad), W(0x9176cc88), W(0x254c02f5), + W(0xfcd7e54f), W(0xd7cb2ac5), W(0x80443526), W(0x8fa362b5), + W(0x495ab1de), W(0x671bba25), W(0x980eea45), W(0xe1c0fe5d), + W(0x02752fc3), W(0x12f04c81), W(0xa397468d), W(0xc6f9d36b), + W(0xe75f8f03), W(0x959c9215), W(0xeb7a6dbf), W(0xda595295), + W(0x2d83bed4), W(0xd3217458), W(0x2969e049), W(0x44c8c98e), + W(0x6a89c275), W(0x78798ef4), W(0x6b3e5899), W(0xdd71b927), + W(0xb64fe1be), W(0x17ad88f0), W(0x66ac20c9), W(0xb43ace7d), + W(0x184adf63), W(0x82311ae5), W(0x60335197), W(0x457f5362), + W(0xe07764b1), W(0x84ae6bbb), W(0x1ca081fe), W(0x942b08f9), + W(0x58684870), W(0x19fd458f), W(0x876cde94), W(0xb7f87b52), + W(0x23d373ab), W(0xe2024b72), W(0x578f1fe3), W(0x2aab5566), + W(0x0728ebb2), W(0x03c2b52f), W(0x9a7bc586), W(0xa50837d3), + W(0xf2872830), W(0xb2a5bf23), W(0xba6a0302), W(0x5c8216ed), + W(0x2b1ccf8a), W(0x92b479a7), W(0xf0f207f3), W(0xa1e2694e), + W(0xcdf4da65), W(0xd5be0506), W(0x1f6234d1), W(0x8afea6c4), + W(0x9d532e34), W(0xa055f3a2), W(0x32e18a05), W(0x75ebf6a4), + W(0x39ec830b), W(0xaaef6040), W(0x069f715e), W(0x51106ebd), + W(0xf98a213e), W(0x3d06dd96), W(0xae053edd), W(0x46bde64d), + W(0xb58d5491), W(0x055dc471), W(0x6fd40604), W(0xff155060), + W(0x24fb9819), W(0x97e9bdd6), W(0xcc434089), W(0x779ed967), + W(0xbd42e8b0), W(0x888b8907), W(0x385b19e7), W(0xdbeec879), + W(0x470a7ca1), W(0xe90f427c), W(0xc91e84f8), W(0x00000000), + W(0x83868009), W(0x48ed2b32), W(0xac70111e), W(0x4e725a6c), + W(0xfbff0efd), W(0x5638850f), W(0x1ed5ae3d), W(0x27392d36), + W(0x64d90f0a), W(0x21a65c68), W(0xd1545b9b), W(0x3a2e3624), + W(0xb1670a0c), W(0x0fe75793), W(0xd296eeb4), W(0x9e919b1b), + W(0x4fc5c080), W(0xa220dc61), W(0x694b775a), W(0x161a121c), + W(0x0aba93e2), W(0xe52aa0c0), W(0x43e0223c), W(0x1d171b12), + W(0x0b0d090e), W(0xadc78bf2), W(0xb9a8b62d), W(0xc8a91e14), + W(0x8519f157), W(0x4c0775af), W(0xbbdd99ee), W(0xfd607fa3), + W(0x9f2601f7), W(0xbcf5725c), W(0xc53b6644), W(0x347efb5b), + W(0x7629438b), W(0xdcc623cb), W(0x68fcedb6), W(0x63f1e4b8), + W(0xcadc31d7), W(0x10856342), W(0x40229713), W(0x2011c684), + W(0x7d244a85), W(0xf83dbbd2), W(0x1132f9ae), W(0x6da129c7), + W(0x4b2f9e1d), W(0xf330b2dc), W(0xec52860d), W(0xd0e3c177), + W(0x6c16b32b), W(0x99b970a9), W(0xfa489411), W(0x2264e947), + W(0xc48cfca8), W(0x1a3ff0a0), W(0xd82c7d56), W(0xef903322), + W(0xc74e4987), W(0xc1d138d9), W(0xfea2ca8c), W(0x360bd498), + W(0xcf81f5a6), W(0x28de7aa5), W(0x268eb7da), W(0xa4bfad3f), + W(0xe49d3a2c), W(0x0d927850), W(0x9bcc5f6a), W(0x62467e54), + W(0xc2138df6), W(0xe8b8d890), W(0x5ef7392e), W(0xf5afc382), + W(0xbe805d9f), W(0x7c93d069), W(0xa92dd56f), W(0xb31225cf), + W(0x3b99acc8), W(0xa77d1810), W(0x6e639ce8), W(0x7bbb3bdb), + W(0x097826cd), W(0xf418596e), W(0x01b79aec), W(0xa89a4f83), + W(0x656e95e6), W(0x7ee6ffaa), W(0x08cfbc21), W(0xe6e815ef), + W(0xd99be7ba), W(0xce366f4a), W(0xd4099fea), W(0xd67cb029), + W(0xafb2a431), W(0x31233f2a), W(0x3094a5c6), W(0xc066a235), + W(0x37bc4e74), W(0xa6ca82fc), W(0xb0d090e0), W(0x15d8a733), + W(0x4a9804f1), W(0xf7daec41), W(0x0e50cd7f), W(0x2ff69117), + W(0x8dd64d76), W(0x4db0ef43), W(0x544daacc), W(0xdf0496e4), + W(0xe3b5d19e), W(0x1b886a4c), W(0xb81f2cc1), W(0x7f516546), + W(0x04ea5e9d), W(0x5d358c01), W(0x737487fa), W(0x2e410bfb), + W(0x5a1d67b3), W(0x52d2db92), W(0x335610e9), W(0x1347d66d), + W(0x8c61d79a), W(0x7a0ca137), W(0x8e14f859), W(0x893c13eb), + W(0xee27a9ce), W(0x35c961b7), W(0xede51ce1), W(0x3cb1477a), + W(0x59dfd29c), W(0x3f73f255), W(0x79ce1418), W(0xbf37c773), + W(0xeacdf753), W(0x5baafd5f), W(0x146f3ddf), W(0x86db4478), + W(0x81f3afca), W(0x3ec468b9), W(0x2c342438), W(0x5f40a3c2), + W(0x72c31d16), W(0x0c25e2bc), W(0x8b493c28), W(0x41950dff), + W(0x7101a839), W(0xdeb30c08), W(0x9ce4b4d8), W(0x90c15664), + W(0x6184cb7b), W(0x70b632d5), W(0x745c6c48), W(0x4257b8d0), +#ifndef CONFIG_CRYPTO_AES_REDUCED_TABLES }, { 0xa7f45150, 0x65417e53, 0xa4171ac3, 0x5e273a96, 0x6bab3bcb, 0x459d1ff1, 0x58faacab, 0x03e34b93, @@ -853,75 +864,77 @@ __visible const u32 crypto_it_tab[4][256] ____cacheline_aligned = { 0x1672c31d, 0xbc0c25e2, 0x288b493c, 0xff41950d, 0x397101a8, 0x08deb30c, 0xd89ce4b4, 0x6490c156, 0x7b6184cb, 0xd570b632, 0x48745c6c, 0xd04257b8, +#endif } }; -__visible const u32 crypto_il_tab[4][256] ____cacheline_aligned = { +__visible const aes_table_word_t crypto_il_tab[][256] ____cacheline_aligned = { { - 0x00000052, 0x00000009, 0x0000006a, 0x000000d5, - 0x00000030, 0x00000036, 0x000000a5, 0x00000038, - 0x000000bf, 0x00000040, 0x000000a3, 0x0000009e, - 0x00000081, 0x000000f3, 0x000000d7, 0x000000fb, - 0x0000007c, 0x000000e3, 0x00000039, 0x00000082, - 0x0000009b, 0x0000002f, 0x000000ff, 0x00000087, - 0x00000034, 0x0000008e, 0x00000043, 0x00000044, - 0x000000c4, 0x000000de, 0x000000e9, 0x000000cb, - 0x00000054, 0x0000007b, 0x00000094, 0x00000032, - 0x000000a6, 0x000000c2, 0x00000023, 0x0000003d, - 0x000000ee, 0x0000004c, 0x00000095, 0x0000000b, - 0x00000042, 0x000000fa, 0x000000c3, 0x0000004e, - 0x00000008, 0x0000002e, 0x000000a1, 0x00000066, - 0x00000028, 0x000000d9, 0x00000024, 0x000000b2, - 0x00000076, 0x0000005b, 0x000000a2, 0x00000049, - 0x0000006d, 0x0000008b, 0x000000d1, 0x00000025, - 0x00000072, 0x000000f8, 0x000000f6, 0x00000064, - 0x00000086, 0x00000068, 0x00000098, 0x00000016, - 0x000000d4, 0x000000a4, 0x0000005c, 0x000000cc, - 0x0000005d, 0x00000065, 0x000000b6, 0x00000092, - 0x0000006c, 0x00000070, 0x00000048, 0x00000050, - 0x000000fd, 0x000000ed, 0x000000b9, 0x000000da, - 0x0000005e, 0x00000015, 0x00000046, 0x00000057, - 0x000000a7, 0x0000008d, 0x0000009d, 0x00000084, - 0x00000090, 0x000000d8, 0x000000ab, 0x00000000, - 0x0000008c, 0x000000bc, 0x000000d3, 0x0000000a, - 0x000000f7, 0x000000e4, 0x00000058, 0x00000005, - 0x000000b8, 0x000000b3, 0x00000045, 0x00000006, - 0x000000d0, 0x0000002c, 0x0000001e, 0x0000008f, - 0x000000ca, 0x0000003f, 0x0000000f, 0x00000002, - 0x000000c1, 0x000000af, 0x000000bd, 0x00000003, - 0x00000001, 0x00000013, 0x0000008a, 0x0000006b, - 0x0000003a, 0x00000091, 0x00000011, 0x00000041, - 0x0000004f, 0x00000067, 0x000000dc, 0x000000ea, - 0x00000097, 0x000000f2, 0x000000cf, 0x000000ce, - 0x000000f0, 0x000000b4, 0x000000e6, 0x00000073, - 0x00000096, 0x000000ac, 0x00000074, 0x00000022, - 0x000000e7, 0x000000ad, 0x00000035, 0x00000085, - 0x000000e2, 0x000000f9, 0x00000037, 0x000000e8, - 0x0000001c, 0x00000075, 0x000000df, 0x0000006e, - 0x00000047, 0x000000f1, 0x0000001a, 0x00000071, - 0x0000001d, 0x00000029, 0x000000c5, 0x00000089, - 0x0000006f, 0x000000b7, 0x00000062, 0x0000000e, - 0x000000aa, 0x00000018, 0x000000be, 0x0000001b, - 0x000000fc, 0x00000056, 0x0000003e, 0x0000004b, - 0x000000c6, 0x000000d2, 0x00000079, 0x00000020, - 0x0000009a, 0x000000db, 0x000000c0, 0x000000fe, - 0x00000078, 0x000000cd, 0x0000005a, 0x000000f4, - 0x0000001f, 0x000000dd, 0x000000a8, 0x00000033, - 0x00000088, 0x00000007, 0x000000c7, 0x00000031, - 0x000000b1, 0x00000012, 0x00000010, 0x00000059, - 0x00000027, 0x00000080, 0x000000ec, 0x0000005f, - 0x00000060, 0x00000051, 0x0000007f, 0x000000a9, - 0x00000019, 0x000000b5, 0x0000004a, 0x0000000d, - 0x0000002d, 0x000000e5, 0x0000007a, 0x0000009f, - 0x00000093, 0x000000c9, 0x0000009c, 0x000000ef, - 0x000000a0, 0x000000e0, 0x0000003b, 0x0000004d, - 0x000000ae, 0x0000002a, 0x000000f5, 0x000000b0, - 0x000000c8, 0x000000eb, 0x000000bb, 0x0000003c, - 0x00000083, 0x00000053, 0x00000099, 0x00000061, - 0x00000017, 0x0000002b, 0x00000004, 0x0000007e, - 0x000000ba, 0x00000077, 0x000000d6, 0x00000026, - 0x000000e1, 0x00000069, 0x00000014, 0x00000063, - 0x00000055, 0x00000021, 0x0000000c, 0x0000007d, + W(0x00000052), W(0x00000009), W(0x0000006a), W(0x000000d5), + W(0x00000030), W(0x00000036), W(0x000000a5), W(0x00000038), + W(0x000000bf), W(0x00000040), W(0x000000a3), W(0x0000009e), + W(0x00000081), W(0x000000f3), W(0x000000d7), W(0x000000fb), + W(0x0000007c), W(0x000000e3), W(0x00000039), W(0x00000082), + W(0x0000009b), W(0x0000002f), W(0x000000ff), W(0x00000087), + W(0x00000034), W(0x0000008e), W(0x00000043), W(0x00000044), + W(0x000000c4), W(0x000000de), W(0x000000e9), W(0x000000cb), + W(0x00000054), W(0x0000007b), W(0x00000094), W(0x00000032), + W(0x000000a6), W(0x000000c2), W(0x00000023), W(0x0000003d), + W(0x000000ee), W(0x0000004c), W(0x00000095), W(0x0000000b), + W(0x00000042), W(0x000000fa), W(0x000000c3), W(0x0000004e), + W(0x00000008), W(0x0000002e), W(0x000000a1), W(0x00000066), + W(0x00000028), W(0x000000d9), W(0x00000024), W(0x000000b2), + W(0x00000076), W(0x0000005b), W(0x000000a2), W(0x00000049), + W(0x0000006d), W(0x0000008b), W(0x000000d1), W(0x00000025), + W(0x00000072), W(0x000000f8), W(0x000000f6), W(0x00000064), + W(0x00000086), W(0x00000068), W(0x00000098), W(0x00000016), + W(0x000000d4), W(0x000000a4), W(0x0000005c), W(0x000000cc), + W(0x0000005d), W(0x00000065), W(0x000000b6), W(0x00000092), + W(0x0000006c), W(0x00000070), W(0x00000048), W(0x00000050), + W(0x000000fd), W(0x000000ed), W(0x000000b9), W(0x000000da), + W(0x0000005e), W(0x00000015), W(0x00000046), W(0x00000057), + W(0x000000a7), W(0x0000008d), W(0x0000009d), W(0x00000084), + W(0x00000090), W(0x000000d8), W(0x000000ab), W(0x00000000), + W(0x0000008c), W(0x000000bc), W(0x000000d3), W(0x0000000a), + W(0x000000f7), W(0x000000e4), W(0x00000058), W(0x00000005), + W(0x000000b8), W(0x000000b3), W(0x00000045), W(0x00000006), + W(0x000000d0), W(0x0000002c), W(0x0000001e), W(0x0000008f), + W(0x000000ca), W(0x0000003f), W(0x0000000f), W(0x00000002), + W(0x000000c1), W(0x000000af), W(0x000000bd), W(0x00000003), + W(0x00000001), W(0x00000013), W(0x0000008a), W(0x0000006b), + W(0x0000003a), W(0x00000091), W(0x00000011), W(0x00000041), + W(0x0000004f), W(0x00000067), W(0x000000dc), W(0x000000ea), + W(0x00000097), W(0x000000f2), W(0x000000cf), W(0x000000ce), + W(0x000000f0), W(0x000000b4), W(0x000000e6), W(0x00000073), + W(0x00000096), W(0x000000ac), W(0x00000074), W(0x00000022), + W(0x000000e7), W(0x000000ad), W(0x00000035), W(0x00000085), + W(0x000000e2), W(0x000000f9), W(0x00000037), W(0x000000e8), + W(0x0000001c), W(0x00000075), W(0x000000df), W(0x0000006e), + W(0x00000047), W(0x000000f1), W(0x0000001a), W(0x00000071), + W(0x0000001d), W(0x00000029), W(0x000000c5), W(0x00000089), + W(0x0000006f), W(0x000000b7), W(0x00000062), W(0x0000000e), + W(0x000000aa), W(0x00000018), W(0x000000be), W(0x0000001b), + W(0x000000fc), W(0x00000056), W(0x0000003e), W(0x0000004b), + W(0x000000c6), W(0x000000d2), W(0x00000079), W(0x00000020), + W(0x0000009a), W(0x000000db), W(0x000000c0), W(0x000000fe), + W(0x00000078), W(0x000000cd), W(0x0000005a), W(0x000000f4), + W(0x0000001f), W(0x000000dd), W(0x000000a8), W(0x00000033), + W(0x00000088), W(0x00000007), W(0x000000c7), W(0x00000031), + W(0x000000b1), W(0x00000012), W(0x00000010), W(0x00000059), + W(0x00000027), W(0x00000080), W(0x000000ec), W(0x0000005f), + W(0x00000060), W(0x00000051), W(0x0000007f), W(0x000000a9), + W(0x00000019), W(0x000000b5), W(0x0000004a), W(0x0000000d), + W(0x0000002d), W(0x000000e5), W(0x0000007a), W(0x0000009f), + W(0x00000093), W(0x000000c9), W(0x0000009c), W(0x000000ef), + W(0x000000a0), W(0x000000e0), W(0x0000003b), W(0x0000004d), + W(0x000000ae), W(0x0000002a), W(0x000000f5), W(0x000000b0), + W(0x000000c8), W(0x000000eb), W(0x000000bb), W(0x0000003c), + W(0x00000083), W(0x00000053), W(0x00000099), W(0x00000061), + W(0x00000017), W(0x0000002b), W(0x00000004), W(0x0000007e), + W(0x000000ba), W(0x00000077), W(0x000000d6), W(0x00000026), + W(0x000000e1), W(0x00000069), W(0x00000014), W(0x00000063), + W(0x00000055), W(0x00000021), W(0x0000000c), W(0x0000007d), +#ifndef CONFIG_CRYPTO_AES_REDUCED_TABLES }, { 0x00005200, 0x00000900, 0x00006a00, 0x0000d500, 0x00003000, 0x00003600, 0x0000a500, 0x00003800, @@ -1117,6 +1130,7 @@ __visible const u32 crypto_il_tab[4][256] ____cacheline_aligned = { 0xba000000, 0x77000000, 0xd6000000, 0x26000000, 0xe1000000, 0x69000000, 0x14000000, 0x63000000, 0x55000000, 0x21000000, 0x0c000000, 0x7d000000, +#endif } }; @@ -1125,6 +1139,15 @@ EXPORT_SYMBOL_GPL(crypto_fl_tab); EXPORT_SYMBOL_GPL(crypto_it_tab); EXPORT_SYMBOL_GPL(crypto_il_tab); +#ifndef CONFIG_CRYPTO_AES_REDUCED_TABLES +#define aes_tab(t,x,y) crypto_##t##_tab[x][y] +#elif defined(CONFIG_CPU_BIG_ENDIAN) +#else +#define aes_tab(t,x,y) get_unaligned((u32 *)((u8 *)&crypto_##t##_tab[0][y] + (x))) +#else +#define aes_tab(t,x,y) get_unaligned((u32 *)((u8 *)&crypto_##t##_tab[0][y] + 4 - (x))) +#endif + /* initialise the key schedule from the user supplied key */ #define star_x(x) (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 7) * 0x1b) @@ -1141,10 +1164,10 @@ EXPORT_SYMBOL_GPL(crypto_il_tab); } while (0) #define ls_box(x) \ - crypto_fl_tab[0][byte(x, 0)] ^ \ - crypto_fl_tab[1][byte(x, 1)] ^ \ - crypto_fl_tab[2][byte(x, 2)] ^ \ - crypto_fl_tab[3][byte(x, 3)] + aes_tab(fl, 0, byte(x, 0)) ^ \ + aes_tab(fl, 1, byte(x, 1)) ^ \ + aes_tab(fl, 2, byte(x, 2)) ^ \ + aes_tab(fl, 3, byte(x, 3)) #define loop4(i) do { \ t = ror32(t, 8); \ @@ -1304,10 +1327,10 @@ EXPORT_SYMBOL_GPL(crypto_aes_set_key); /* encrypt a block of text */ #define f_rn(bo, bi, n, k) do { \ - bo[n] = crypto_ft_tab[0][byte(bi[n], 0)] ^ \ - crypto_ft_tab[1][byte(bi[(n + 1) & 3], 1)] ^ \ - crypto_ft_tab[2][byte(bi[(n + 2) & 3], 2)] ^ \ - crypto_ft_tab[3][byte(bi[(n + 3) & 3], 3)] ^ *(k + n); \ + bo[n] = aes_tab(ft, 0, byte(bi[n], 0)) ^ \ + aes_tab(ft, 1, byte(bi[(n + 1) & 3], 1)) ^ \ + aes_tab(ft, 2, byte(bi[(n + 2) & 3], 2)) ^ \ + aes_tab(ft, 3, byte(bi[(n + 3) & 3], 3)) ^ *(k + n); \ } while (0) #define f_nround(bo, bi, k) do {\ @@ -1319,10 +1342,10 @@ EXPORT_SYMBOL_GPL(crypto_aes_set_key); } while (0) #define f_rl(bo, bi, n, k) do { \ - bo[n] = crypto_fl_tab[0][byte(bi[n], 0)] ^ \ - crypto_fl_tab[1][byte(bi[(n + 1) & 3], 1)] ^ \ - crypto_fl_tab[2][byte(bi[(n + 2) & 3], 2)] ^ \ - crypto_fl_tab[3][byte(bi[(n + 3) & 3], 3)] ^ *(k + n); \ + bo[n] = aes_tab(fl, 0, byte(bi[n], 0)) ^ \ + aes_tab(fl, 1, byte(bi[(n + 1) & 3], 1)) ^ \ + aes_tab(fl, 2, byte(bi[(n + 2) & 3], 2)) ^ \ + aes_tab(fl, 3, byte(bi[(n + 3) & 3], 3)) ^ *(k + n); \ } while (0) #define f_lround(bo, bi, k) do {\ @@ -1374,10 +1397,10 @@ static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) /* decrypt a block of text */ #define i_rn(bo, bi, n, k) do { \ - bo[n] = crypto_it_tab[0][byte(bi[n], 0)] ^ \ - crypto_it_tab[1][byte(bi[(n + 3) & 3], 1)] ^ \ - crypto_it_tab[2][byte(bi[(n + 2) & 3], 2)] ^ \ - crypto_it_tab[3][byte(bi[(n + 1) & 3], 3)] ^ *(k + n); \ + bo[n] = aes_tab(it, 0, byte(bi[n], 0)) ^ \ + aes_tab(it, 1, byte(bi[(n + 3) & 3], 1)) ^ \ + aes_tab(it, 2, byte(bi[(n + 2) & 3], 2)) ^ \ + aes_tab(it, 3, byte(bi[(n + 1) & 3], 3)) ^ *(k + n); \ } while (0) #define i_nround(bo, bi, k) do {\ @@ -1389,10 +1412,10 @@ static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) } while (0) #define i_rl(bo, bi, n, k) do { \ - bo[n] = crypto_il_tab[0][byte(bi[n], 0)] ^ \ - crypto_il_tab[1][byte(bi[(n + 3) & 3], 1)] ^ \ - crypto_il_tab[2][byte(bi[(n + 2) & 3], 2)] ^ \ - crypto_il_tab[3][byte(bi[(n + 1) & 3], 3)] ^ *(k + n); \ + bo[n] = aes_tab(il, 0, byte(bi[n], 0)) ^ \ + aes_tab(il, 1, byte(bi[(n + 3) & 3], 1)) ^ \ + aes_tab(il, 2, byte(bi[(n + 2) & 3], 2)) ^ \ + aes_tab(il, 3, byte(bi[(n + 1) & 3], 3)) ^ *(k + n); \ } while (0) #define i_lround(bo, bi, k) do {\ diff --git a/include/crypto/aes.h b/include/crypto/aes.h index 0fdb542c70cd..f8ff8f2c52b8 100644 --- a/include/crypto/aes.h +++ b/include/crypto/aes.h @@ -28,10 +28,16 @@ struct crypto_aes_ctx { u32 key_length; }; -extern const u32 crypto_ft_tab[4][256] ____cacheline_aligned; -extern const u32 crypto_fl_tab[4][256] ____cacheline_aligned; -extern const u32 crypto_it_tab[4][256] ____cacheline_aligned; -extern const u32 crypto_il_tab[4][256] ____cacheline_aligned; +#ifdef CONFIG_CRYPTO_AES_REDUCED_TABLES +typedef u64 aes_table_word_t; +#else +typedef u32 aes_table_word_t; +#endif + +extern const aes_table_word_t crypto_ft_tab[][256] ____cacheline_aligned; +extern const aes_table_word_t crypto_fl_tab[][256] ____cacheline_aligned; +extern const aes_table_word_t crypto_it_tab[][256] ____cacheline_aligned; +extern const aes_table_word_t crypto_il_tab[][256] ____cacheline_aligned; int crypto_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, unsigned int key_len); -- 2.20.1