diff options
Diffstat (limited to 'arch/sparc/crypto/camellia_asm.S')
-rw-r--r-- | arch/sparc/crypto/camellia_asm.S | 563 |
1 files changed, 563 insertions, 0 deletions
diff --git a/arch/sparc/crypto/camellia_asm.S b/arch/sparc/crypto/camellia_asm.S new file mode 100644 index 000000000000..cc39553a4e43 --- /dev/null +++ b/arch/sparc/crypto/camellia_asm.S | |||
@@ -0,0 +1,563 @@ | |||
1 | #include <linux/linkage.h> | ||
2 | #include <asm/visasm.h> | ||
3 | |||
4 | #include "opcodes.h" | ||
5 | |||
6 | #define CAMELLIA_6ROUNDS(KEY_BASE, I0, I1) \ | ||
7 | CAMELLIA_F(KEY_BASE + 0, I1, I0, I1) \ | ||
8 | CAMELLIA_F(KEY_BASE + 2, I0, I1, I0) \ | ||
9 | CAMELLIA_F(KEY_BASE + 4, I1, I0, I1) \ | ||
10 | CAMELLIA_F(KEY_BASE + 6, I0, I1, I0) \ | ||
11 | CAMELLIA_F(KEY_BASE + 8, I1, I0, I1) \ | ||
12 | CAMELLIA_F(KEY_BASE + 10, I0, I1, I0) | ||
13 | |||
14 | #define CAMELLIA_6ROUNDS_FL_FLI(KEY_BASE, I0, I1) \ | ||
15 | CAMELLIA_6ROUNDS(KEY_BASE, I0, I1) \ | ||
16 | CAMELLIA_FL(KEY_BASE + 12, I0, I0) \ | ||
17 | CAMELLIA_FLI(KEY_BASE + 14, I1, I1) | ||
18 | |||
19 | .data | ||
20 | |||
21 | .align 8 | ||
22 | SIGMA: .xword 0xA09E667F3BCC908B | ||
23 | .xword 0xB67AE8584CAA73B2 | ||
24 | .xword 0xC6EF372FE94F82BE | ||
25 | .xword 0x54FF53A5F1D36F1C | ||
26 | .xword 0x10E527FADE682D1D | ||
27 | .xword 0xB05688C2B3E6C1FD | ||
28 | |||
29 | .text | ||
30 | |||
31 | .align 32 | ||
32 | ENTRY(camellia_sparc64_key_expand) | ||
33 | /* %o0=in_key, %o1=encrypt_key, %o2=key_len, %o3=decrypt_key */ | ||
34 | VISEntry | ||
35 | ld [%o0 + 0x00], %f0 ! i0, k[0] | ||
36 | ld [%o0 + 0x04], %f1 ! i1, k[1] | ||
37 | ld [%o0 + 0x08], %f2 ! i2, k[2] | ||
38 | ld [%o0 + 0x0c], %f3 ! i3, k[3] | ||
39 | std %f0, [%o1 + 0x00] ! k[0, 1] | ||
40 | fsrc2 %f0, %f28 | ||
41 | std %f2, [%o1 + 0x08] ! k[2, 3] | ||
42 | cmp %o2, 16 | ||
43 | be 10f | ||
44 | fsrc2 %f2, %f30 | ||
45 | |||
46 | ld [%o0 + 0x10], %f0 | ||
47 | ld [%o0 + 0x14], %f1 | ||
48 | std %f0, [%o1 + 0x20] ! k[8, 9] | ||
49 | cmp %o2, 24 | ||
50 | fone %f10 | ||
51 | be,a 1f | ||
52 | fxor %f10, %f0, %f2 | ||
53 | ld [%o0 + 0x18], %f2 | ||
54 | ld [%o0 + 0x1c], %f3 | ||
55 | 1: | ||
56 | std %f2, [%o1 + 0x28] ! k[10, 11] | ||
57 | fxor %f28, %f0, %f0 | ||
58 | fxor %f30, %f2, %f2 | ||
59 | |||
60 | 10: | ||
61 | sethi %hi(SIGMA), %g3 | ||
62 | or %g3, %lo(SIGMA), %g3 | ||
63 | ldd [%g3 + 0x00], %f16 | ||
64 | ldd [%g3 + 0x08], %f18 | ||
65 | ldd [%g3 + 0x10], %f20 | ||
66 | ldd [%g3 + 0x18], %f22 | ||
67 | ldd [%g3 + 0x20], %f24 | ||
68 | ldd [%g3 + 0x28], %f26 | ||
69 | CAMELLIA_F(16, 2, 0, 2) | ||
70 | CAMELLIA_F(18, 0, 2, 0) | ||
71 | fxor %f28, %f0, %f0 | ||
72 | fxor %f30, %f2, %f2 | ||
73 | CAMELLIA_F(20, 2, 0, 2) | ||
74 | CAMELLIA_F(22, 0, 2, 0) | ||
75 | |||
76 | #define ROTL128(S01, S23, TMP1, TMP2, N) \ | ||
77 | srlx S01, (64 - N), TMP1; \ | ||
78 | sllx S01, N, S01; \ | ||
79 | srlx S23, (64 - N), TMP2; \ | ||
80 | sllx S23, N, S23; \ | ||
81 | or S01, TMP2, S01; \ | ||
82 | or S23, TMP1, S23 | ||
83 | |||
84 | cmp %o2, 16 | ||
85 | bne 1f | ||
86 | nop | ||
87 | /* 128-bit key */ | ||
88 | std %f0, [%o1 + 0x10] ! k[ 4, 5] | ||
89 | std %f2, [%o1 + 0x18] ! k[ 6, 7] | ||
90 | MOVDTOX_F0_O4 | ||
91 | MOVDTOX_F2_O5 | ||
92 | ROTL128(%o4, %o5, %g2, %g3, 15) | ||
93 | stx %o4, [%o1 + 0x30] ! k[12, 13] | ||
94 | stx %o5, [%o1 + 0x38] ! k[14, 15] | ||
95 | ROTL128(%o4, %o5, %g2, %g3, 15) | ||
96 | stx %o4, [%o1 + 0x40] ! k[16, 17] | ||
97 | stx %o5, [%o1 + 0x48] ! k[18, 19] | ||
98 | ROTL128(%o4, %o5, %g2, %g3, 15) | ||
99 | stx %o4, [%o1 + 0x60] ! k[24, 25] | ||
100 | ROTL128(%o4, %o5, %g2, %g3, 15) | ||
101 | stx %o4, [%o1 + 0x70] ! k[28, 29] | ||
102 | stx %o5, [%o1 + 0x78] ! k[30, 31] | ||
103 | ROTL128(%o4, %o5, %g2, %g3, 34) | ||
104 | stx %o4, [%o1 + 0xa0] ! k[40, 41] | ||
105 | stx %o5, [%o1 + 0xa8] ! k[42, 43] | ||
106 | ROTL128(%o4, %o5, %g2, %g3, 17) | ||
107 | stx %o4, [%o1 + 0xc0] ! k[48, 49] | ||
108 | stx %o5, [%o1 + 0xc8] ! k[50, 51] | ||
109 | |||
110 | ldx [%o1 + 0x00], %o4 ! k[ 0, 1] | ||
111 | ldx [%o1 + 0x08], %o5 ! k[ 2, 3] | ||
112 | ROTL128(%o4, %o5, %g2, %g3, 15) | ||
113 | stx %o4, [%o1 + 0x20] ! k[ 8, 9] | ||
114 | stx %o5, [%o1 + 0x28] ! k[10, 11] | ||
115 | ROTL128(%o4, %o5, %g2, %g3, 30) | ||
116 | stx %o4, [%o1 + 0x50] ! k[20, 21] | ||
117 | stx %o5, [%o1 + 0x58] ! k[22, 23] | ||
118 | ROTL128(%o4, %o5, %g2, %g3, 15) | ||
119 | stx %o5, [%o1 + 0x68] ! k[26, 27] | ||
120 | ROTL128(%o4, %o5, %g2, %g3, 17) | ||
121 | stx %o4, [%o1 + 0x80] ! k[32, 33] | ||
122 | stx %o5, [%o1 + 0x88] ! k[34, 35] | ||
123 | ROTL128(%o4, %o5, %g2, %g3, 17) | ||
124 | stx %o4, [%o1 + 0x90] ! k[36, 37] | ||
125 | stx %o5, [%o1 + 0x98] ! k[38, 39] | ||
126 | ROTL128(%o4, %o5, %g2, %g3, 17) | ||
127 | stx %o4, [%o1 + 0xb0] ! k[44, 45] | ||
128 | stx %o5, [%o1 + 0xb8] ! k[46, 47] | ||
129 | |||
130 | ba,pt %xcc, 2f | ||
131 | mov (3 * 16 * 4), %o0 | ||
132 | |||
133 | 1: | ||
134 | /* 192-bit or 256-bit key */ | ||
135 | std %f0, [%o1 + 0x30] ! k[12, 13] | ||
136 | std %f2, [%o1 + 0x38] ! k[14, 15] | ||
137 | ldd [%o1 + 0x20], %f4 ! k[ 8, 9] | ||
138 | ldd [%o1 + 0x28], %f6 ! k[10, 11] | ||
139 | fxor %f0, %f4, %f0 | ||
140 | fxor %f2, %f6, %f2 | ||
141 | CAMELLIA_F(24, 2, 0, 2) | ||
142 | CAMELLIA_F(26, 0, 2, 0) | ||
143 | std %f0, [%o1 + 0x10] ! k[ 4, 5] | ||
144 | std %f2, [%o1 + 0x18] ! k[ 6, 7] | ||
145 | MOVDTOX_F0_O4 | ||
146 | MOVDTOX_F2_O5 | ||
147 | ROTL128(%o4, %o5, %g2, %g3, 30) | ||
148 | stx %o4, [%o1 + 0x50] ! k[20, 21] | ||
149 | stx %o5, [%o1 + 0x58] ! k[22, 23] | ||
150 | ROTL128(%o4, %o5, %g2, %g3, 30) | ||
151 | stx %o4, [%o1 + 0xa0] ! k[40, 41] | ||
152 | stx %o5, [%o1 + 0xa8] ! k[42, 43] | ||
153 | ROTL128(%o4, %o5, %g2, %g3, 51) | ||
154 | stx %o4, [%o1 + 0x100] ! k[64, 65] | ||
155 | stx %o5, [%o1 + 0x108] ! k[66, 67] | ||
156 | ldx [%o1 + 0x20], %o4 ! k[ 8, 9] | ||
157 | ldx [%o1 + 0x28], %o5 ! k[10, 11] | ||
158 | ROTL128(%o4, %o5, %g2, %g3, 15) | ||
159 | stx %o4, [%o1 + 0x20] ! k[ 8, 9] | ||
160 | stx %o5, [%o1 + 0x28] ! k[10, 11] | ||
161 | ROTL128(%o4, %o5, %g2, %g3, 15) | ||
162 | stx %o4, [%o1 + 0x40] ! k[16, 17] | ||
163 | stx %o5, [%o1 + 0x48] ! k[18, 19] | ||
164 | ROTL128(%o4, %o5, %g2, %g3, 30) | ||
165 | stx %o4, [%o1 + 0x90] ! k[36, 37] | ||
166 | stx %o5, [%o1 + 0x98] ! k[38, 39] | ||
167 | ROTL128(%o4, %o5, %g2, %g3, 34) | ||
168 | stx %o4, [%o1 + 0xd0] ! k[52, 53] | ||
169 | stx %o5, [%o1 + 0xd8] ! k[54, 55] | ||
170 | ldx [%o1 + 0x30], %o4 ! k[12, 13] | ||
171 | ldx [%o1 + 0x38], %o5 ! k[14, 15] | ||
172 | ROTL128(%o4, %o5, %g2, %g3, 15) | ||
173 | stx %o4, [%o1 + 0x30] ! k[12, 13] | ||
174 | stx %o5, [%o1 + 0x38] ! k[14, 15] | ||
175 | ROTL128(%o4, %o5, %g2, %g3, 30) | ||
176 | stx %o4, [%o1 + 0x70] ! k[28, 29] | ||
177 | stx %o5, [%o1 + 0x78] ! k[30, 31] | ||
178 | srlx %o4, 32, %g2 | ||
179 | srlx %o5, 32, %g3 | ||
180 | stw %o4, [%o1 + 0xc0] ! k[48] | ||
181 | stw %g3, [%o1 + 0xc4] ! k[49] | ||
182 | stw %o5, [%o1 + 0xc8] ! k[50] | ||
183 | stw %g2, [%o1 + 0xcc] ! k[51] | ||
184 | ROTL128(%o4, %o5, %g2, %g3, 49) | ||
185 | stx %o4, [%o1 + 0xe0] ! k[56, 57] | ||
186 | stx %o5, [%o1 + 0xe8] ! k[58, 59] | ||
187 | ldx [%o1 + 0x00], %o4 ! k[ 0, 1] | ||
188 | ldx [%o1 + 0x08], %o5 ! k[ 2, 3] | ||
189 | ROTL128(%o4, %o5, %g2, %g3, 45) | ||
190 | stx %o4, [%o1 + 0x60] ! k[24, 25] | ||
191 | stx %o5, [%o1 + 0x68] ! k[26, 27] | ||
192 | ROTL128(%o4, %o5, %g2, %g3, 15) | ||
193 | stx %o4, [%o1 + 0x80] ! k[32, 33] | ||
194 | stx %o5, [%o1 + 0x88] ! k[34, 35] | ||
195 | ROTL128(%o4, %o5, %g2, %g3, 17) | ||
196 | stx %o4, [%o1 + 0xb0] ! k[44, 45] | ||
197 | stx %o5, [%o1 + 0xb8] ! k[46, 47] | ||
198 | ROTL128(%o4, %o5, %g2, %g3, 34) | ||
199 | stx %o4, [%o1 + 0xf0] ! k[60, 61] | ||
200 | stx %o5, [%o1 + 0xf8] ! k[62, 63] | ||
201 | mov (4 * 16 * 4), %o0 | ||
202 | 2: | ||
203 | add %o1, %o0, %o1 | ||
204 | ldd [%o1 + 0x00], %f0 | ||
205 | ldd [%o1 + 0x08], %f2 | ||
206 | std %f0, [%o3 + 0x00] | ||
207 | std %f2, [%o3 + 0x08] | ||
208 | add %o3, 0x10, %o3 | ||
209 | 1: | ||
210 | sub %o1, (16 * 4), %o1 | ||
211 | ldd [%o1 + 0x38], %f0 | ||
212 | ldd [%o1 + 0x30], %f2 | ||
213 | ldd [%o1 + 0x28], %f4 | ||
214 | ldd [%o1 + 0x20], %f6 | ||
215 | ldd [%o1 + 0x18], %f8 | ||
216 | ldd [%o1 + 0x10], %f10 | ||
217 | std %f0, [%o3 + 0x00] | ||
218 | std %f2, [%o3 + 0x08] | ||
219 | std %f4, [%o3 + 0x10] | ||
220 | std %f6, [%o3 + 0x18] | ||
221 | std %f8, [%o3 + 0x20] | ||
222 | std %f10, [%o3 + 0x28] | ||
223 | |||
224 | ldd [%o1 + 0x08], %f0 | ||
225 | ldd [%o1 + 0x00], %f2 | ||
226 | std %f0, [%o3 + 0x30] | ||
227 | std %f2, [%o3 + 0x38] | ||
228 | subcc %o0, (16 * 4), %o0 | ||
229 | bne,pt %icc, 1b | ||
230 | add %o3, (16 * 4), %o3 | ||
231 | |||
232 | std %f2, [%o3 - 0x10] | ||
233 | std %f0, [%o3 - 0x08] | ||
234 | |||
235 | retl | ||
236 | VISExit | ||
237 | ENDPROC(camellia_sparc64_key_expand) | ||
238 | |||
239 | .align 32 | ||
240 | ENTRY(camellia_sparc64_crypt) | ||
241 | /* %o0=key, %o1=input, %o2=output, %o3=key_len */ | ||
242 | VISEntry | ||
243 | |||
244 | ld [%o1 + 0x00], %f0 | ||
245 | ld [%o1 + 0x04], %f1 | ||
246 | ld [%o1 + 0x08], %f2 | ||
247 | ld [%o1 + 0x0c], %f3 | ||
248 | |||
249 | ldd [%o0 + 0x00], %f4 | ||
250 | ldd [%o0 + 0x08], %f6 | ||
251 | |||
252 | cmp %o3, 16 | ||
253 | fxor %f4, %f0, %f0 | ||
254 | be 1f | ||
255 | fxor %f6, %f2, %f2 | ||
256 | |||
257 | ldd [%o0 + 0x10], %f8 | ||
258 | ldd [%o0 + 0x18], %f10 | ||
259 | ldd [%o0 + 0x20], %f12 | ||
260 | ldd [%o0 + 0x28], %f14 | ||
261 | ldd [%o0 + 0x30], %f16 | ||
262 | ldd [%o0 + 0x38], %f18 | ||
263 | ldd [%o0 + 0x40], %f20 | ||
264 | ldd [%o0 + 0x48], %f22 | ||
265 | add %o0, 0x40, %o0 | ||
266 | |||
267 | CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) | ||
268 | |||
269 | 1: | ||
270 | ldd [%o0 + 0x10], %f8 | ||
271 | ldd [%o0 + 0x18], %f10 | ||
272 | ldd [%o0 + 0x20], %f12 | ||
273 | ldd [%o0 + 0x28], %f14 | ||
274 | ldd [%o0 + 0x30], %f16 | ||
275 | ldd [%o0 + 0x38], %f18 | ||
276 | ldd [%o0 + 0x40], %f20 | ||
277 | ldd [%o0 + 0x48], %f22 | ||
278 | ldd [%o0 + 0x50], %f24 | ||
279 | ldd [%o0 + 0x58], %f26 | ||
280 | ldd [%o0 + 0x60], %f28 | ||
281 | ldd [%o0 + 0x68], %f30 | ||
282 | ldd [%o0 + 0x70], %f32 | ||
283 | ldd [%o0 + 0x78], %f34 | ||
284 | ldd [%o0 + 0x80], %f36 | ||
285 | ldd [%o0 + 0x88], %f38 | ||
286 | ldd [%o0 + 0x90], %f40 | ||
287 | ldd [%o0 + 0x98], %f42 | ||
288 | ldd [%o0 + 0xa0], %f44 | ||
289 | ldd [%o0 + 0xa8], %f46 | ||
290 | ldd [%o0 + 0xb0], %f48 | ||
291 | ldd [%o0 + 0xb8], %f50 | ||
292 | ldd [%o0 + 0xc0], %f52 | ||
293 | ldd [%o0 + 0xc8], %f54 | ||
294 | |||
295 | CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) | ||
296 | CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) | ||
297 | CAMELLIA_6ROUNDS(40, 0, 2) | ||
298 | fxor %f52, %f2, %f2 | ||
299 | fxor %f54, %f0, %f0 | ||
300 | |||
301 | st %f2, [%o2 + 0x00] | ||
302 | st %f3, [%o2 + 0x04] | ||
303 | st %f0, [%o2 + 0x08] | ||
304 | st %f1, [%o2 + 0x0c] | ||
305 | |||
306 | retl | ||
307 | VISExit | ||
308 | ENDPROC(camellia_sparc64_crypt) | ||
309 | |||
310 | .align 32 | ||
311 | ENTRY(camellia_sparc64_load_keys) | ||
312 | /* %o0=key, %o1=key_len */ | ||
313 | VISEntry | ||
314 | ldd [%o0 + 0x00], %f4 | ||
315 | ldd [%o0 + 0x08], %f6 | ||
316 | ldd [%o0 + 0x10], %f8 | ||
317 | ldd [%o0 + 0x18], %f10 | ||
318 | ldd [%o0 + 0x20], %f12 | ||
319 | ldd [%o0 + 0x28], %f14 | ||
320 | ldd [%o0 + 0x30], %f16 | ||
321 | ldd [%o0 + 0x38], %f18 | ||
322 | ldd [%o0 + 0x40], %f20 | ||
323 | ldd [%o0 + 0x48], %f22 | ||
324 | ldd [%o0 + 0x50], %f24 | ||
325 | ldd [%o0 + 0x58], %f26 | ||
326 | ldd [%o0 + 0x60], %f28 | ||
327 | ldd [%o0 + 0x68], %f30 | ||
328 | ldd [%o0 + 0x70], %f32 | ||
329 | ldd [%o0 + 0x78], %f34 | ||
330 | ldd [%o0 + 0x80], %f36 | ||
331 | ldd [%o0 + 0x88], %f38 | ||
332 | ldd [%o0 + 0x90], %f40 | ||
333 | ldd [%o0 + 0x98], %f42 | ||
334 | ldd [%o0 + 0xa0], %f44 | ||
335 | ldd [%o0 + 0xa8], %f46 | ||
336 | ldd [%o0 + 0xb0], %f48 | ||
337 | ldd [%o0 + 0xb8], %f50 | ||
338 | ldd [%o0 + 0xc0], %f52 | ||
339 | retl | ||
340 | ldd [%o0 + 0xc8], %f54 | ||
341 | ENDPROC(camellia_sparc64_load_keys) | ||
342 | |||
343 | .align 32 | ||
344 | ENTRY(camellia_sparc64_ecb_crypt_3_grand_rounds) | ||
345 | /* %o0=input, %o1=output, %o2=len, %o3=key */ | ||
346 | 1: ldd [%o0 + 0x00], %f0 | ||
347 | ldd [%o0 + 0x08], %f2 | ||
348 | add %o0, 0x10, %o0 | ||
349 | fxor %f4, %f0, %f0 | ||
350 | fxor %f6, %f2, %f2 | ||
351 | CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) | ||
352 | CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) | ||
353 | CAMELLIA_6ROUNDS(40, 0, 2) | ||
354 | fxor %f52, %f2, %f2 | ||
355 | fxor %f54, %f0, %f0 | ||
356 | std %f2, [%o1 + 0x00] | ||
357 | std %f0, [%o1 + 0x08] | ||
358 | subcc %o2, 0x10, %o2 | ||
359 | bne,pt %icc, 1b | ||
360 | add %o1, 0x10, %o1 | ||
361 | retl | ||
362 | nop | ||
363 | ENDPROC(camellia_sparc64_ecb_crypt_3_grand_rounds) | ||
364 | |||
365 | .align 32 | ||
366 | ENTRY(camellia_sparc64_ecb_crypt_4_grand_rounds) | ||
367 | /* %o0=input, %o1=output, %o2=len, %o3=key */ | ||
368 | 1: ldd [%o0 + 0x00], %f0 | ||
369 | ldd [%o0 + 0x08], %f2 | ||
370 | add %o0, 0x10, %o0 | ||
371 | fxor %f4, %f0, %f0 | ||
372 | fxor %f6, %f2, %f2 | ||
373 | CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) | ||
374 | ldd [%o3 + 0xd0], %f8 | ||
375 | ldd [%o3 + 0xd8], %f10 | ||
376 | ldd [%o3 + 0xe0], %f12 | ||
377 | ldd [%o3 + 0xe8], %f14 | ||
378 | ldd [%o3 + 0xf0], %f16 | ||
379 | ldd [%o3 + 0xf8], %f18 | ||
380 | ldd [%o3 + 0x100], %f20 | ||
381 | ldd [%o3 + 0x108], %f22 | ||
382 | CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) | ||
383 | CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2) | ||
384 | CAMELLIA_F(8, 2, 0, 2) | ||
385 | CAMELLIA_F(10, 0, 2, 0) | ||
386 | ldd [%o3 + 0x10], %f8 | ||
387 | ldd [%o3 + 0x18], %f10 | ||
388 | CAMELLIA_F(12, 2, 0, 2) | ||
389 | CAMELLIA_F(14, 0, 2, 0) | ||
390 | ldd [%o3 + 0x20], %f12 | ||
391 | ldd [%o3 + 0x28], %f14 | ||
392 | CAMELLIA_F(16, 2, 0, 2) | ||
393 | CAMELLIA_F(18, 0, 2, 0) | ||
394 | ldd [%o3 + 0x30], %f16 | ||
395 | ldd [%o3 + 0x38], %f18 | ||
396 | fxor %f20, %f2, %f2 | ||
397 | fxor %f22, %f0, %f0 | ||
398 | ldd [%o3 + 0x40], %f20 | ||
399 | ldd [%o3 + 0x48], %f22 | ||
400 | std %f2, [%o1 + 0x00] | ||
401 | std %f0, [%o1 + 0x08] | ||
402 | subcc %o2, 0x10, %o2 | ||
403 | bne,pt %icc, 1b | ||
404 | add %o1, 0x10, %o1 | ||
405 | retl | ||
406 | nop | ||
407 | ENDPROC(camellia_sparc64_ecb_crypt_4_grand_rounds) | ||
408 | |||
409 | .align 32 | ||
410 | ENTRY(camellia_sparc64_cbc_encrypt_3_grand_rounds) | ||
411 | /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */ | ||
412 | ldd [%o4 + 0x00], %f60 | ||
413 | ldd [%o4 + 0x08], %f62 | ||
414 | 1: ldd [%o0 + 0x00], %f0 | ||
415 | ldd [%o0 + 0x08], %f2 | ||
416 | add %o0, 0x10, %o0 | ||
417 | fxor %f60, %f0, %f0 | ||
418 | fxor %f62, %f2, %f2 | ||
419 | fxor %f4, %f0, %f0 | ||
420 | fxor %f6, %f2, %f2 | ||
421 | CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) | ||
422 | CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) | ||
423 | CAMELLIA_6ROUNDS(40, 0, 2) | ||
424 | fxor %f52, %f2, %f60 | ||
425 | fxor %f54, %f0, %f62 | ||
426 | std %f60, [%o1 + 0x00] | ||
427 | std %f62, [%o1 + 0x08] | ||
428 | subcc %o2, 0x10, %o2 | ||
429 | bne,pt %icc, 1b | ||
430 | add %o1, 0x10, %o1 | ||
431 | std %f60, [%o4 + 0x00] | ||
432 | retl | ||
433 | std %f62, [%o4 + 0x08] | ||
434 | ENDPROC(camellia_sparc64_cbc_encrypt_3_grand_rounds) | ||
435 | |||
436 | .align 32 | ||
437 | ENTRY(camellia_sparc64_cbc_encrypt_4_grand_rounds) | ||
438 | /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */ | ||
439 | ldd [%o4 + 0x00], %f60 | ||
440 | ldd [%o4 + 0x08], %f62 | ||
441 | 1: ldd [%o0 + 0x00], %f0 | ||
442 | ldd [%o0 + 0x08], %f2 | ||
443 | add %o0, 0x10, %o0 | ||
444 | fxor %f60, %f0, %f0 | ||
445 | fxor %f62, %f2, %f2 | ||
446 | fxor %f4, %f0, %f0 | ||
447 | fxor %f6, %f2, %f2 | ||
448 | CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) | ||
449 | ldd [%o3 + 0xd0], %f8 | ||
450 | ldd [%o3 + 0xd8], %f10 | ||
451 | ldd [%o3 + 0xe0], %f12 | ||
452 | ldd [%o3 + 0xe8], %f14 | ||
453 | ldd [%o3 + 0xf0], %f16 | ||
454 | ldd [%o3 + 0xf8], %f18 | ||
455 | ldd [%o3 + 0x100], %f20 | ||
456 | ldd [%o3 + 0x108], %f22 | ||
457 | CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) | ||
458 | CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2) | ||
459 | CAMELLIA_F(8, 2, 0, 2) | ||
460 | CAMELLIA_F(10, 0, 2, 0) | ||
461 | ldd [%o3 + 0x10], %f8 | ||
462 | ldd [%o3 + 0x18], %f10 | ||
463 | CAMELLIA_F(12, 2, 0, 2) | ||
464 | CAMELLIA_F(14, 0, 2, 0) | ||
465 | ldd [%o3 + 0x20], %f12 | ||
466 | ldd [%o3 + 0x28], %f14 | ||
467 | CAMELLIA_F(16, 2, 0, 2) | ||
468 | CAMELLIA_F(18, 0, 2, 0) | ||
469 | ldd [%o3 + 0x30], %f16 | ||
470 | ldd [%o3 + 0x38], %f18 | ||
471 | fxor %f20, %f2, %f60 | ||
472 | fxor %f22, %f0, %f62 | ||
473 | ldd [%o3 + 0x40], %f20 | ||
474 | ldd [%o3 + 0x48], %f22 | ||
475 | std %f60, [%o1 + 0x00] | ||
476 | std %f62, [%o1 + 0x08] | ||
477 | subcc %o2, 0x10, %o2 | ||
478 | bne,pt %icc, 1b | ||
479 | add %o1, 0x10, %o1 | ||
480 | std %f60, [%o4 + 0x00] | ||
481 | retl | ||
482 | std %f62, [%o4 + 0x08] | ||
483 | ENDPROC(camellia_sparc64_cbc_encrypt_4_grand_rounds) | ||
484 | |||
485 | .align 32 | ||
486 | ENTRY(camellia_sparc64_cbc_decrypt_3_grand_rounds) | ||
487 | /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */ | ||
488 | ldd [%o4 + 0x00], %f60 | ||
489 | ldd [%o4 + 0x08], %f62 | ||
490 | 1: ldd [%o0 + 0x00], %f56 | ||
491 | ldd [%o0 + 0x08], %f58 | ||
492 | add %o0, 0x10, %o0 | ||
493 | fxor %f4, %f56, %f0 | ||
494 | fxor %f6, %f58, %f2 | ||
495 | CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) | ||
496 | CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) | ||
497 | CAMELLIA_6ROUNDS(40, 0, 2) | ||
498 | fxor %f52, %f2, %f2 | ||
499 | fxor %f54, %f0, %f0 | ||
500 | fxor %f60, %f2, %f2 | ||
501 | fxor %f62, %f0, %f0 | ||
502 | fsrc2 %f56, %f60 | ||
503 | fsrc2 %f58, %f62 | ||
504 | std %f2, [%o1 + 0x00] | ||
505 | std %f0, [%o1 + 0x08] | ||
506 | subcc %o2, 0x10, %o2 | ||
507 | bne,pt %icc, 1b | ||
508 | add %o1, 0x10, %o1 | ||
509 | std %f60, [%o4 + 0x00] | ||
510 | retl | ||
511 | std %f62, [%o4 + 0x08] | ||
512 | ENDPROC(camellia_sparc64_cbc_decrypt_3_grand_rounds) | ||
513 | |||
514 | .align 32 | ||
515 | ENTRY(camellia_sparc64_cbc_decrypt_4_grand_rounds) | ||
516 | /* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */ | ||
517 | ldd [%o4 + 0x00], %f60 | ||
518 | ldd [%o4 + 0x08], %f62 | ||
519 | 1: ldd [%o0 + 0x00], %f56 | ||
520 | ldd [%o0 + 0x08], %f58 | ||
521 | add %o0, 0x10, %o0 | ||
522 | fxor %f4, %f56, %f0 | ||
523 | fxor %f6, %f58, %f2 | ||
524 | CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2) | ||
525 | ldd [%o3 + 0xd0], %f8 | ||
526 | ldd [%o3 + 0xd8], %f10 | ||
527 | ldd [%o3 + 0xe0], %f12 | ||
528 | ldd [%o3 + 0xe8], %f14 | ||
529 | ldd [%o3 + 0xf0], %f16 | ||
530 | ldd [%o3 + 0xf8], %f18 | ||
531 | ldd [%o3 + 0x100], %f20 | ||
532 | ldd [%o3 + 0x108], %f22 | ||
533 | CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2) | ||
534 | CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2) | ||
535 | CAMELLIA_F(8, 2, 0, 2) | ||
536 | CAMELLIA_F(10, 0, 2, 0) | ||
537 | ldd [%o3 + 0x10], %f8 | ||
538 | ldd [%o3 + 0x18], %f10 | ||
539 | CAMELLIA_F(12, 2, 0, 2) | ||
540 | CAMELLIA_F(14, 0, 2, 0) | ||
541 | ldd [%o3 + 0x20], %f12 | ||
542 | ldd [%o3 + 0x28], %f14 | ||
543 | CAMELLIA_F(16, 2, 0, 2) | ||
544 | CAMELLIA_F(18, 0, 2, 0) | ||
545 | ldd [%o3 + 0x30], %f16 | ||
546 | ldd [%o3 + 0x38], %f18 | ||
547 | fxor %f20, %f2, %f2 | ||
548 | fxor %f22, %f0, %f0 | ||
549 | ldd [%o3 + 0x40], %f20 | ||
550 | ldd [%o3 + 0x48], %f22 | ||
551 | fxor %f60, %f2, %f2 | ||
552 | fxor %f62, %f0, %f0 | ||
553 | fsrc2 %f56, %f60 | ||
554 | fsrc2 %f58, %f62 | ||
555 | std %f2, [%o1 + 0x00] | ||
556 | std %f0, [%o1 + 0x08] | ||
557 | subcc %o2, 0x10, %o2 | ||
558 | bne,pt %icc, 1b | ||
559 | add %o1, 0x10, %o1 | ||
560 | std %f60, [%o4 + 0x00] | ||
561 | retl | ||
562 | std %f62, [%o4 + 0x08] | ||
563 | ENDPROC(camellia_sparc64_cbc_decrypt_4_grand_rounds) | ||