summaryrefslogtreecommitdiffstats
path: root/crypto/aes_generic.c
diff options
context:
space:
mode:
authorEric Biggers <ebiggers@google.com>2018-10-18 00:37:59 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2018-11-09 04:36:48 -0500
commit913a3aa07d16e5b302f408d497a4b829910de247 (patch)
tree88e4aadf88930378116f3dd311f076fb6a78276d /crypto/aes_generic.c
parent0a6a40c2a8c184a2fb467efacfb1cd338d719e0b (diff)
crypto: arm/aes - add some hardening against cache-timing attacks
Make the ARM scalar AES implementation closer to constant-time by disabling interrupts and prefetching the tables into L1 cache. This is feasible because due to ARM's "free" rotations, the main tables are only 1024 bytes instead of the usual 4096 used by most AES implementations. On ARM Cortex-A7, the speed loss is only about 5%. The resulting code is still over twice as fast as aes_ti.c. Responsiveness is potentially a concern, but interrupts are only disabled for a single AES block. Note that even after these changes, the implementation still isn't necessarily guaranteed to be constant-time; see https://cr.yp.to/antiforgery/cachetiming-20050414.pdf for a discussion of the many difficulties involved in writing truly constant-time AES software. But it's valuable to make such attacks more difficult. Much of this patch is based on patches suggested by Ard Biesheuvel. Suggested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Eric Biggers <ebiggers@google.com> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/aes_generic.c')
-rw-r--r--crypto/aes_generic.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/crypto/aes_generic.c b/crypto/aes_generic.c
index ca554d57d01e..13df33aca463 100644
--- a/crypto/aes_generic.c
+++ b/crypto/aes_generic.c
@@ -63,7 +63,8 @@ static inline u8 byte(const u32 x, const unsigned n)
63 63
64static const u32 rco_tab[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 }; 64static const u32 rco_tab[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 };
65 65
66__visible const u32 crypto_ft_tab[4][256] = { 66/* cacheline-aligned to facilitate prefetching into cache */
67__visible const u32 crypto_ft_tab[4][256] __cacheline_aligned = {
67 { 68 {
68 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, 69 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6,
69 0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, 70 0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591,
@@ -327,7 +328,7 @@ __visible const u32 crypto_ft_tab[4][256] = {
327 } 328 }
328}; 329};
329 330
330__visible const u32 crypto_fl_tab[4][256] = { 331__visible const u32 crypto_fl_tab[4][256] __cacheline_aligned = {
331 { 332 {
332 0x00000063, 0x0000007c, 0x00000077, 0x0000007b, 333 0x00000063, 0x0000007c, 0x00000077, 0x0000007b,
333 0x000000f2, 0x0000006b, 0x0000006f, 0x000000c5, 334 0x000000f2, 0x0000006b, 0x0000006f, 0x000000c5,
@@ -591,7 +592,7 @@ __visible const u32 crypto_fl_tab[4][256] = {
591 } 592 }
592}; 593};
593 594
594__visible const u32 crypto_it_tab[4][256] = { 595__visible const u32 crypto_it_tab[4][256] __cacheline_aligned = {
595 { 596 {
596 0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a, 597 0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a,
597 0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b, 598 0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b,
@@ -855,7 +856,7 @@ __visible const u32 crypto_it_tab[4][256] = {
855 } 856 }
856}; 857};
857 858
858__visible const u32 crypto_il_tab[4][256] = { 859__visible const u32 crypto_il_tab[4][256] __cacheline_aligned = {
859 { 860 {
860 0x00000052, 0x00000009, 0x0000006a, 0x000000d5, 861 0x00000052, 0x00000009, 0x0000006a, 0x000000d5,
861 0x00000030, 0x00000036, 0x000000a5, 0x00000038, 862 0x00000030, 0x00000036, 0x000000a5, 0x00000038,