aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2017-07-24 06:28:19 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2017-08-03 21:27:25 -0400
commit0d149ce67d4409d7ff13c2d08c3474f3319e1b7e (patch)
treeb2c91109014d2e376f4931aceb9194443dc7a73c
parent03c9a333fef1bb0a67615b686a7342d853f1a460 (diff)
crypto: arm/aes - avoid expanded lookup tables in the final round
For the final round, avoid the expanded and padded lookup tables exported by the generic AES driver. Instead, for encryption, we can perform byte loads from the same table we used for the inner rounds, which will still be hot in the caches. For decryption, use the inverse AES Sbox directly, which is 4x smaller than the inverse lookup table exported by the generic driver. This should significantly reduce the Dcache footprint of our code, which makes the code more robust against timing attacks. It does not introduce any additional module dependencies, given that we already rely on the core AES module for the shared key expansion routines. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--arch/arm/crypto/aes-cipher-core.S88
1 files changed, 65 insertions, 23 deletions
diff --git a/arch/arm/crypto/aes-cipher-core.S b/arch/arm/crypto/aes-cipher-core.S
index c817a86c4ca8..54b384084637 100644
--- a/arch/arm/crypto/aes-cipher-core.S
+++ b/arch/arm/crypto/aes-cipher-core.S
@@ -10,6 +10,7 @@
10 */ 10 */
11 11
12#include <linux/linkage.h> 12#include <linux/linkage.h>
13#include <asm/cache.h>
13 14
14 .text 15 .text
15 .align 5 16 .align 5
@@ -32,19 +33,19 @@
32 .endif 33 .endif
33 .endm 34 .endm
34 35
35 .macro __load, out, in, idx 36 .macro __load, out, in, idx, sz, op
36 .if __LINUX_ARM_ARCH__ < 7 && \idx > 0 37 .if __LINUX_ARM_ARCH__ < 7 && \idx > 0
37 ldr \out, [ttab, \in, lsr #(8 * \idx) - 2] 38 ldr\op \out, [ttab, \in, lsr #(8 * \idx) - \sz]
38 .else 39 .else
39 ldr \out, [ttab, \in, lsl #2] 40 ldr\op \out, [ttab, \in, lsl #\sz]
40 .endif 41 .endif
41 .endm 42 .endm
42 43
43 .macro __hround, out0, out1, in0, in1, in2, in3, t3, t4, enc 44 .macro __hround, out0, out1, in0, in1, in2, in3, t3, t4, enc, sz, op
44 __select \out0, \in0, 0 45 __select \out0, \in0, 0
45 __select t0, \in1, 1 46 __select t0, \in1, 1
46 __load \out0, \out0, 0 47 __load \out0, \out0, 0, \sz, \op
47 __load t0, t0, 1 48 __load t0, t0, 1, \sz, \op
48 49
49 .if \enc 50 .if \enc
50 __select \out1, \in1, 0 51 __select \out1, \in1, 0
@@ -53,10 +54,10 @@
53 __select \out1, \in3, 0 54 __select \out1, \in3, 0
54 __select t1, \in0, 1 55 __select t1, \in0, 1
55 .endif 56 .endif
56 __load \out1, \out1, 0 57 __load \out1, \out1, 0, \sz, \op
57 __select t2, \in2, 2 58 __select t2, \in2, 2
58 __load t1, t1, 1 59 __load t1, t1, 1, \sz, \op
59 __load t2, t2, 2 60 __load t2, t2, 2, \sz, \op
60 61
61 eor \out0, \out0, t0, ror #24 62 eor \out0, \out0, t0, ror #24
62 63
@@ -68,9 +69,9 @@
68 __select \t3, \in1, 2 69 __select \t3, \in1, 2
69 __select \t4, \in2, 3 70 __select \t4, \in2, 3
70 .endif 71 .endif
71 __load \t3, \t3, 2 72 __load \t3, \t3, 2, \sz, \op
72 __load t0, t0, 3 73 __load t0, t0, 3, \sz, \op
73 __load \t4, \t4, 3 74 __load \t4, \t4, 3, \sz, \op
74 75
75 eor \out1, \out1, t1, ror #24 76 eor \out1, \out1, t1, ror #24
76 eor \out0, \out0, t2, ror #16 77 eor \out0, \out0, t2, ror #16
@@ -82,14 +83,14 @@
82 eor \out1, \out1, t2 83 eor \out1, \out1, t2
83 .endm 84 .endm
84 85
85 .macro fround, out0, out1, out2, out3, in0, in1, in2, in3 86 .macro fround, out0, out1, out2, out3, in0, in1, in2, in3, sz=2, op
86 __hround \out0, \out1, \in0, \in1, \in2, \in3, \out2, \out3, 1 87 __hround \out0, \out1, \in0, \in1, \in2, \in3, \out2, \out3, 1, \sz, \op
87 __hround \out2, \out3, \in2, \in3, \in0, \in1, \in1, \in2, 1 88 __hround \out2, \out3, \in2, \in3, \in0, \in1, \in1, \in2, 1, \sz, \op
88 .endm 89 .endm
89 90
90 .macro iround, out0, out1, out2, out3, in0, in1, in2, in3 91 .macro iround, out0, out1, out2, out3, in0, in1, in2, in3, sz=2, op
91 __hround \out0, \out1, \in0, \in3, \in2, \in1, \out2, \out3, 0 92 __hround \out0, \out1, \in0, \in3, \in2, \in1, \out2, \out3, 0, \sz, \op
92 __hround \out2, \out3, \in2, \in1, \in0, \in3, \in1, \in0, 0 93 __hround \out2, \out3, \in2, \in1, \in0, \in3, \in1, \in0, 0, \sz, \op
93 .endm 94 .endm
94 95
95 .macro __rev, out, in 96 .macro __rev, out, in
@@ -114,7 +115,7 @@
114 .endif 115 .endif
115 .endm 116 .endm
116 117
117 .macro do_crypt, round, ttab, ltab 118 .macro do_crypt, round, ttab, ltab, bsz
118 push {r3-r11, lr} 119 push {r3-r11, lr}
119 120
120 ldr r4, [in] 121 ldr r4, [in]
@@ -146,9 +147,12 @@
146 147
1471: subs rounds, rounds, #4 1481: subs rounds, rounds, #4
148 \round r8, r9, r10, r11, r4, r5, r6, r7 149 \round r8, r9, r10, r11, r4, r5, r6, r7
149 __adrl ttab, \ltab, ls 150 bls 2f
150 \round r4, r5, r6, r7, r8, r9, r10, r11 151 \round r4, r5, r6, r7, r8, r9, r10, r11
151 bhi 0b 152 b 0b
153
1542: __adrl ttab, \ltab
155 \round r4, r5, r6, r7, r8, r9, r10, r11, \bsz, b
152 156
153#ifdef CONFIG_CPU_BIG_ENDIAN 157#ifdef CONFIG_CPU_BIG_ENDIAN
154 __rev r4, r4 158 __rev r4, r4
@@ -170,10 +174,48 @@
170 .ltorg 174 .ltorg
171 .endm 175 .endm
172 176
177 .align L1_CACHE_SHIFT
178 .type __aes_arm_inverse_sbox, %object
179__aes_arm_inverse_sbox:
180 .byte 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
181 .byte 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
182 .byte 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
183 .byte 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
184 .byte 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
185 .byte 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
186 .byte 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
187 .byte 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
188 .byte 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
189 .byte 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
190 .byte 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
191 .byte 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
192 .byte 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
193 .byte 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
194 .byte 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
195 .byte 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
196 .byte 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
197 .byte 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
198 .byte 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
199 .byte 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
200 .byte 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
201 .byte 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
202 .byte 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
203 .byte 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
204 .byte 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
205 .byte 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
206 .byte 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
207 .byte 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
208 .byte 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
209 .byte 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
210 .byte 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
211 .byte 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
212 .size __aes_arm_inverse_sbox, . - __aes_arm_inverse_sbox
213
173ENTRY(__aes_arm_encrypt) 214ENTRY(__aes_arm_encrypt)
174 do_crypt fround, crypto_ft_tab, crypto_fl_tab 215 do_crypt fround, crypto_ft_tab, crypto_ft_tab + 1, 2
175ENDPROC(__aes_arm_encrypt) 216ENDPROC(__aes_arm_encrypt)
176 217
218 .align 5
177ENTRY(__aes_arm_decrypt) 219ENTRY(__aes_arm_decrypt)
178 do_crypt iround, crypto_it_tab, crypto_il_tab 220 do_crypt iround, crypto_it_tab, __aes_arm_inverse_sbox, 0
179ENDPROC(__aes_arm_decrypt) 221ENDPROC(__aes_arm_decrypt)