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