1
2
3
4
5
6
7
8 #include <asm/ppc_asm.h>
9
10 #ifdef __BIG_ENDIAN__
11 #define LOAD_KEY(d, s, off) \
12 lwz d,off(s);
13 #else
14 #define LOAD_KEY(d, s, off) \
15 li r0,off; \
16 lwbrx d,s,r0;
17 #endif
18
19 #define INITIALIZE_KEY \
20 stwu r1,-32(r1); \
21 stw r14,8(r1); \
22 stw r15,12(r1); \
23 stw r16,16(r1);
24
25 #define FINALIZE_KEY \
26 lwz r14,8(r1); \
27 lwz r15,12(r1); \
28 lwz r16,16(r1); \
29 xor r5,r5,r5; \
30 xor r6,r6,r6; \
31 xor r7,r7,r7; \
32 xor r8,r8,r8; \
33 xor r9,r9,r9; \
34 xor r10,r10,r10; \
35 xor r11,r11,r11; \
36 xor r12,r12,r12; \
37 addi r1,r1,32;
38
39 #define LS_BOX(r, t1, t2) \
40 lis t2,PPC_AES_4K_ENCTAB@h; \
41 ori t2,t2,PPC_AES_4K_ENCTAB@l; \
42 rlwimi t2,r,4,20,27; \
43 lbz t1,8(t2); \
44 rlwimi r,t1,0,24,31; \
45 rlwimi t2,r,28,20,27; \
46 lbz t1,8(t2); \
47 rlwimi r,t1,8,16,23; \
48 rlwimi t2,r,20,20,27; \
49 lbz t1,8(t2); \
50 rlwimi r,t1,16,8,15; \
51 rlwimi t2,r,12,20,27; \
52 lbz t1,8(t2); \
53 rlwimi r,t1,24,0,7;
54
55 #define GF8_MUL(out, in, t1, t2) \
56 lis t1,0x8080; \
57 ori t1,t1,0x8080; \
58 and t1,t1,in; \
59 srwi t1,t1,7; \
60 mulli t1,t1,0x1b; \
61 lis t2,0x7f7f; \
62 ori t2,t2,0x7f7f; \
63 and t2,t2,in; \
64 slwi t2,t2,1; \
65 xor out,t1,t2;
66
67
68
69
70
71
72
73
74 _GLOBAL(ppc_expand_key_128)
75 INITIALIZE_KEY
76 LOAD_KEY(r5,r4,0)
77 LOAD_KEY(r6,r4,4)
78 LOAD_KEY(r7,r4,8)
79 LOAD_KEY(r8,r4,12)
80 stw r5,0(r3)
81 stw r6,4(r3)
82 stw r7,8(r3)
83 stw r8,12(r3)
84 li r16,10
85 lis r0,0x0100
86 ppc_expand_128_loop:
87 addi r3,r3,16
88 mr r14,r8
89 rotlwi r14,r14,8
90 LS_BOX(r14, r15, r4)
91 xor r14,r14,r0
92 xor r5,r5,r14
93 xor r6,r6,r5
94 xor r7,r7,r6
95 xor r8,r8,r7
96 stw r5,0(r3)
97 stw r6,4(r3)
98 stw r7,8(r3)
99 stw r8,12(r3)
100 GF8_MUL(r0, r0, r4, r14)
101 subi r16,r16,1
102 cmpwi r16,0
103 bt eq,ppc_expand_128_end
104 b ppc_expand_128_loop
105 ppc_expand_128_end:
106 FINALIZE_KEY
107 blr
108
109
110
111
112
113
114
115
116 _GLOBAL(ppc_expand_key_192)
117 INITIALIZE_KEY
118 LOAD_KEY(r5,r4,0)
119 LOAD_KEY(r6,r4,4)
120 LOAD_KEY(r7,r4,8)
121 LOAD_KEY(r8,r4,12)
122 LOAD_KEY(r9,r4,16)
123 LOAD_KEY(r10,r4,20)
124 stw r5,0(r3)
125 stw r6,4(r3)
126 stw r7,8(r3)
127 stw r8,12(r3)
128 stw r9,16(r3)
129 stw r10,20(r3)
130 li r16,8
131 lis r0,0x0100
132 ppc_expand_192_loop:
133 addi r3,r3,24
134 mr r14,r10
135 rotlwi r14,r14,8
136 LS_BOX(r14, r15, r4)
137 xor r14,r14,r0
138 xor r5,r5,r14
139 xor r6,r6,r5
140 xor r7,r7,r6
141 xor r8,r8,r7
142 xor r9,r9,r8
143 xor r10,r10,r9
144 stw r5,0(r3)
145 stw r6,4(r3)
146 stw r7,8(r3)
147 stw r8,12(r3)
148 subi r16,r16,1
149 cmpwi r16,0
150 bt eq,ppc_expand_192_end
151 stw r9,16(r3)
152 stw r10,20(r3)
153 GF8_MUL(r0, r0, r4, r14)
154 b ppc_expand_192_loop
155 ppc_expand_192_end:
156 FINALIZE_KEY
157 blr
158
159
160
161
162
163
164
165
166 _GLOBAL(ppc_expand_key_256)
167 INITIALIZE_KEY
168 LOAD_KEY(r5,r4,0)
169 LOAD_KEY(r6,r4,4)
170 LOAD_KEY(r7,r4,8)
171 LOAD_KEY(r8,r4,12)
172 LOAD_KEY(r9,r4,16)
173 LOAD_KEY(r10,r4,20)
174 LOAD_KEY(r11,r4,24)
175 LOAD_KEY(r12,r4,28)
176 stw r5,0(r3)
177 stw r6,4(r3)
178 stw r7,8(r3)
179 stw r8,12(r3)
180 stw r9,16(r3)
181 stw r10,20(r3)
182 stw r11,24(r3)
183 stw r12,28(r3)
184 li r16,7
185 lis r0,0x0100
186 ppc_expand_256_loop:
187 addi r3,r3,32
188 mr r14,r12
189 rotlwi r14,r14,8
190 LS_BOX(r14, r15, r4)
191 xor r14,r14,r0
192 xor r5,r5,r14
193 xor r6,r6,r5
194 xor r7,r7,r6
195 xor r8,r8,r7
196 mr r14,r8
197 LS_BOX(r14, r15, r4)
198 xor r9,r9,r14
199 xor r10,r10,r9
200 xor r11,r11,r10
201 xor r12,r12,r11
202 stw r5,0(r3)
203 stw r6,4(r3)
204 stw r7,8(r3)
205 stw r8,12(r3)
206 subi r16,r16,1
207 cmpwi r16,0
208 bt eq,ppc_expand_256_end
209 stw r9,16(r3)
210 stw r10,20(r3)
211 stw r11,24(r3)
212 stw r12,28(r3)
213 GF8_MUL(r0, r0, r4, r14)
214 b ppc_expand_256_loop
215 ppc_expand_256_end:
216 FINALIZE_KEY
217 blr
218
219
220
221
222
223
224 _GLOBAL(ppc_generate_decrypt_key)
225 addi r6,r5,24
226 slwi r6,r6,2
227 lwzx r7,r4,r6
228 stw r7,0(r3)
229 lwz r7,0(r4)
230 stwx r7,r3,r6
231 addi r6,r6,4
232 lwzx r7,r4,r6
233 stw r7,4(r3)
234 lwz r7,4(r4)
235 stwx r7,r3,r6
236 addi r6,r6,4
237 lwzx r7,r4,r6
238 stw r7,8(r3)
239 lwz r7,8(r4)
240 stwx r7,r3,r6
241 addi r6,r6,4
242 lwzx r7,r4,r6
243 stw r7,12(r3)
244 lwz r7,12(r4)
245 stwx r7,r3,r6
246 addi r3,r3,16
247 add r4,r4,r6
248 subi r4,r4,28
249 addi r5,r5,20
250 srwi r5,r5,2
251 ppc_generate_decrypt_block:
252 li r6,4
253 mtctr r6
254 ppc_generate_decrypt_word:
255 lwz r6,0(r4)
256 GF8_MUL(r7, r6, r0, r7)
257 GF8_MUL(r8, r7, r0, r8)
258 GF8_MUL(r9, r8, r0, r9)
259 xor r10,r9,r6
260 xor r11,r7,r8
261 xor r11,r11,r9
262 xor r12,r7,r10
263 rotrwi r12,r12,24
264 xor r11,r11,r12
265 xor r12,r8,r10
266 rotrwi r12,r12,16
267 xor r11,r11,r12
268 rotrwi r12,r10,8
269 xor r11,r11,r12
270 stw r11,0(r3)
271 addi r3,r3,4
272 addi r4,r4,4
273 bdnz ppc_generate_decrypt_word
274 subi r4,r4,32
275 subi r5,r5,1
276 cmpwi r5,0
277 bt gt,ppc_generate_decrypt_block
278 blr