91f340a16abf22d98cdee82340111206e173f8a8
[platform/upstream/nettle.git] / arm / aes.m4
1 C Loads one word, and adds it to the subkey. Uses T0
2 C AES_LOAD(SRC, KEY, REG)
3 define(<AES_LOAD>, <
4         ldrb    $3, [$1], #+1
5         ldrb    T0, [$1], #+1
6         orr     $3, T0, lsl #8
7         ldrb    T0, [$1], #+1
8         orr     $3, T0, lsl #16
9         ldrb    T0, [$1], #+1
10         orr     $3, T0, lsl #24
11         ldr     T0, [$2], #+4
12         eor     $3, T0
13 >)
14 C Stores one word. Destroys input.
15 C AES_STORE(DST, X)
16 define(<AES_STORE>, <
17         strb    $2, [$1], #+1
18         ror     $2, $2, #8
19         strb    $2, [$1], #+1
20         ror     $2, $2, #8
21         strb    $2, [$1], #+1
22         ror     $2, $2, #8
23         strb    $2, [$1], #+1
24 >)
25
26 C AES_FINAL_ROUND_V6(a,b,c,d,key,res)
27 define(<AES_FINAL_ROUND_V6>, <
28         uxtb    T0, $1
29         ldrb    $6, [TABLE, T0]
30         uxtb    T0, $2, ror #8
31         ldrb    T0, [TABLE, T0]
32         eor     $6, $6, T0, lsl #8
33         uxtb    T0, $3, ror #16
34         ldrb    T0, [TABLE, T0]
35         eor     $6, $6, T0, lsl #16
36         ldrb    T0, [TABLE, $4, lsr #24]
37         eor     $6, $6, T0, lsl #24
38         ldr     T0, [$5], #+4
39         eor     $6, $6, T0
40 >)
41
42 C AES_FINAL_ROUND_V5(a,b,c,d,key,res,mask)
43 C Avoids the uxtb instruction, introduced in ARMv6.
44 C The mask argument should hold the constant 0xff
45 define(<AES_FINAL_ROUND_V5>, <
46         and     T0, $7, $1
47         ldrb    $6, [TABLE, T0]
48         and     T0, $7, $2, ror #8
49         ldrb    T0, [TABLE, T0]
50         eor     $6, $6, T0, lsl #8
51         and     T0, $7, $3, ror #16
52         ldrb    T0, [TABLE, T0]
53         eor     $6, $6, T0, lsl #16
54         ldrb    T0, [TABLE, $4, lsr #24]
55         eor     $6, $6, T0, lsl #24
56         ldr     T0, [$5], #+4
57         eor     $6, T0
58 >)