OLD | NEW |
| (Empty) |
1 ! des_enc.m4 | |
2 ! des_enc.S (generated from des_enc.m4) | |
3 ! | |
4 ! UltraSPARC assembler version of the LibDES/SSLeay/OpenSSL des_enc.c file. | |
5 ! | |
6 ! Version 1.0. 32-bit version. | |
7 ! | |
8 ! June 8, 2000. | |
9 ! | |
10 ! Version 2.0. 32/64-bit, PIC-ification, blended CPU adaptation | |
11 ! by Andy Polyakov. | |
12 ! | |
13 ! January 1, 2003. | |
14 ! | |
15 ! Assembler version: Copyright Svend Olaf Mikkelsen. | |
16 ! | |
17 ! Original C code: Copyright Eric A. Young. | |
18 ! | |
19 ! This code can be freely used by LibDES/SSLeay/OpenSSL users. | |
20 ! | |
21 ! The LibDES/SSLeay/OpenSSL copyright notices must be respected. | |
22 ! | |
23 ! This version can be redistributed. | |
24 ! | |
25 ! To expand the m4 macros: m4 -B 8192 des_enc.m4 > des_enc.S | |
26 ! | |
27 ! Global registers 1 to 5 are used. This is the same as done by the | |
28 ! cc compiler. The UltraSPARC load/store little endian feature is used. | |
29 ! | |
30 ! Instruction grouping often refers to one CPU cycle. | |
31 ! | |
32 ! Assemble through gcc: gcc -c -mcpu=ultrasparc -o des_enc.o des_enc.S | |
33 ! | |
34 ! Assemble through cc: cc -c -xarch=v8plusa -o des_enc.o des_enc.S | |
35 ! | |
36 ! Performance improvement according to './apps/openssl speed des' | |
37 ! | |
38 ! 32-bit build: | |
39 ! 23% faster than cc-5.2 -xarch=v8plus -xO5 | |
40 ! 115% faster than gcc-3.2.1 -m32 -mcpu=ultrasparc -O5 | |
41 ! 64-bit build: | |
42 ! 50% faster than cc-5.2 -xarch=v9 -xO5 | |
43 ! 100% faster than gcc-3.2.1 -m64 -mcpu=ultrasparc -O5 | |
44 ! | |
45 | |
46 .ident "des_enc.m4 2.1" | |
47 .file "des_enc-sparc.S" | |
48 | |
49 #if defined(__SUNPRO_C) && defined(__sparcv9) | |
50 # define ABI64 /* They've said -xarch=v9 at command line */ | |
51 #elif defined(__GNUC__) && defined(__arch64__) | |
52 # define ABI64 /* They've said -m64 at command line */ | |
53 #endif | |
54 | |
55 #ifdef ABI64 | |
56 .register %g2,#scratch | |
57 .register %g3,#scratch | |
58 # define FRAME -192 | |
59 # define BIAS 2047 | |
60 # define LDPTR ldx | |
61 # define STPTR stx | |
62 # define ARG0 128 | |
63 # define ARGSZ 8 | |
64 # ifndef OPENSSL_SYSNAME_ULTRASPARC | |
65 # define OPENSSL_SYSNAME_ULTRASPARC | |
66 # endif | |
67 #else | |
68 # define FRAME -96 | |
69 # define BIAS 0 | |
70 # define LDPTR ld | |
71 # define STPTR st | |
72 # define ARG0 68 | |
73 # define ARGSZ 4 | |
74 #endif | |
75 | |
76 #define LOOPS 7 | |
77 | |
78 #define global0 %g0 | |
79 #define global1 %g1 | |
80 #define global2 %g2 | |
81 #define global3 %g3 | |
82 #define global4 %g4 | |
83 #define global5 %g5 | |
84 | |
85 #define local0 %l0 | |
86 #define local1 %l1 | |
87 #define local2 %l2 | |
88 #define local3 %l3 | |
89 #define local4 %l4 | |
90 #define local5 %l5 | |
91 #define local7 %l6 | |
92 #define local6 %l7 | |
93 | |
94 #define in0 %i0 | |
95 #define in1 %i1 | |
96 #define in2 %i2 | |
97 #define in3 %i3 | |
98 #define in4 %i4 | |
99 #define in5 %i5 | |
100 #define in6 %i6 | |
101 #define in7 %i7 | |
102 | |
103 #define out0 %o0 | |
104 #define out1 %o1 | |
105 #define out2 %o2 | |
106 #define out3 %o3 | |
107 #define out4 %o4 | |
108 #define out5 %o5 | |
109 #define out6 %o6 | |
110 #define out7 %o7 | |
111 | |
112 #define stub stb | |
113 | |
114 changequote({,}) | |
115 | |
116 | |
117 ! Macro definitions: | |
118 | |
119 | |
120 ! {ip_macro} | |
121 ! | |
122 ! The logic used in initial and final permutations is the same as in | |
123 ! the C code. The permutations are done with a clever shift, xor, and | |
124 ! technique. | |
125 ! | |
126 ! The macro also loads address sbox 1 to 5 to global 1 to 5, address | |
127 ! sbox 6 to local6, and addres sbox 8 to out3. | |
128 ! | |
129 ! Rotates the halfs 3 left to bring the sbox bits in convenient positions. | |
130 ! | |
131 ! Loads key first round from address in parameter 5 to out0, out1. | |
132 ! | |
133 ! After the the original LibDES initial permutation, the resulting left | |
134 ! is in the variable initially used for right and vice versa. The macro | |
135 ! implements the possibility to keep the halfs in the original registers. | |
136 ! | |
137 ! parameter 1 left | |
138 ! parameter 2 right | |
139 ! parameter 3 result left (modify in first round) | |
140 ! parameter 4 result right (use in first round) | |
141 ! parameter 5 key address | |
142 ! parameter 6 1/2 for include encryption/decryption | |
143 ! parameter 7 1 for move in1 to in3 | |
144 ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 | |
145 ! parameter 9 1 for load ks3 and ks2 to in4 and in3 | |
146 | |
147 define(ip_macro, { | |
148 | |
149 ! {ip_macro} | |
150 ! $1 $2 $4 $3 $5 $6 $7 $8 $9 | |
151 | |
152 ld [out2+256], local1 | |
153 srl $2, 4, local4 | |
154 | |
155 xor local4, $1, local4 | |
156 ifelse($7,1,{mov in1, in3},{nop}) | |
157 | |
158 ld [out2+260], local2 | |
159 and local4, local1, local4 | |
160 ifelse($8,1,{mov in3, in4},{}) | |
161 ifelse($8,2,{mov in4, in3},{}) | |
162 | |
163 ld [out2+280], out4 ! loop counter | |
164 sll local4, 4, local1 | |
165 xor $1, local4, $1 | |
166 | |
167 ld [out2+264], local3 | |
168 srl $1, 16, local4 | |
169 xor $2, local1, $2 | |
170 | |
171 ifelse($9,1,{LDPTR KS3, in4},{}) | |
172 xor local4, $2, local4 | |
173 nop !sethi %hi(DES_SPtrans), global1 ! sbox addr | |
174 | |
175 ifelse($9,1,{LDPTR KS2, in3},{}) | |
176 and local4, local2, local4 | |
177 nop !or global1, %lo(DES_SPtrans), global1 ! sbox addr | |
178 | |
179 sll local4, 16, local1 | |
180 xor $2, local4, $2 | |
181 | |
182 srl $2, 2, local4 | |
183 xor $1, local1, $1 | |
184 | |
185 sethi %hi(16711680), local5 | |
186 xor local4, $1, local4 | |
187 | |
188 and local4, local3, local4 | |
189 or local5, 255, local5 | |
190 | |
191 sll local4, 2, local2 | |
192 xor $1, local4, $1 | |
193 | |
194 srl $1, 8, local4 | |
195 xor $2, local2, $2 | |
196 | |
197 xor local4, $2, local4 | |
198 add global1, 768, global4 | |
199 | |
200 and local4, local5, local4 | |
201 add global1, 1024, global5 | |
202 | |
203 ld [out2+272], local7 | |
204 sll local4, 8, local1 | |
205 xor $2, local4, $2 | |
206 | |
207 srl $2, 1, local4 | |
208 xor $1, local1, $1 | |
209 | |
210 ld [$5], out0 ! key 7531 | |
211 xor local4, $1, local4 | |
212 add global1, 256, global2 | |
213 | |
214 ld [$5+4], out1 ! key 8642 | |
215 and local4, local7, local4 | |
216 add global1, 512, global3 | |
217 | |
218 sll local4, 1, local1 | |
219 xor $1, local4, $1 | |
220 | |
221 sll $1, 3, local3 | |
222 xor $2, local1, $2 | |
223 | |
224 sll $2, 3, local2 | |
225 add global1, 1280, local6 ! address sbox 8 | |
226 | |
227 srl $1, 29, local4 | |
228 add global1, 1792, out3 ! address sbox 8 | |
229 | |
230 srl $2, 29, local1 | |
231 or local4, local3, $4 | |
232 | |
233 or local2, local1, $3 | |
234 | |
235 ifelse($6, 1, { | |
236 | |
237 ld [out2+284], local5 ! 0x0000FC00 used in the rounds | |
238 or local2, local1, $3 | |
239 xor $4, out0, local1 | |
240 | |
241 call .des_enc.1 | |
242 and local1, 252, local1 | |
243 | |
244 },{}) | |
245 | |
246 ifelse($6, 2, { | |
247 | |
248 ld [out2+284], local5 ! 0x0000FC00 used in the rounds | |
249 or local2, local1, $3 | |
250 xor $4, out0, local1 | |
251 | |
252 call .des_dec.1 | |
253 and local1, 252, local1 | |
254 | |
255 },{}) | |
256 }) | |
257 | |
258 | |
259 ! {rounds_macro} | |
260 ! | |
261 ! The logic used in the DES rounds is the same as in the C code, | |
262 ! except that calculations for sbox 1 and sbox 5 begin before | |
263 ! the previous round is finished. | |
264 ! | |
265 ! In each round one half (work) is modified based on key and the | |
266 ! other half (use). | |
267 ! | |
268 ! In this version we do two rounds in a loop repeated 7 times | |
269 ! and two rounds seperately. | |
270 ! | |
271 ! One half has the bits for the sboxes in the following positions: | |
272 ! | |
273 ! 777777xx555555xx333333xx111111xx | |
274 ! | |
275 ! 88xx666666xx444444xx222222xx8888 | |
276 ! | |
277 ! The bits for each sbox are xor-ed with the key bits for that box. | |
278 ! The above xx bits are cleared, and the result used for lookup in | |
279 ! the sbox table. Each sbox entry contains the 4 output bits permuted | |
280 ! into 32 bits according to the P permutation. | |
281 ! | |
282 ! In the description of DES, left and right are switched after | |
283 ! each round, except after last round. In this code the original | |
284 ! left and right are kept in the same register in all rounds, meaning | |
285 ! that after the 16 rounds the result for right is in the register | |
286 ! originally used for left. | |
287 ! | |
288 ! parameter 1 first work (left in first round) | |
289 ! parameter 2 first use (right in first round) | |
290 ! parameter 3 enc/dec 1/-1 | |
291 ! parameter 4 loop label | |
292 ! parameter 5 key address register | |
293 ! parameter 6 optional address for key next encryption/decryption | |
294 ! parameter 7 not empty for include retl | |
295 ! | |
296 ! also compares in2 to 8 | |
297 | |
298 define(rounds_macro, { | |
299 | |
300 ! {rounds_macro} | |
301 ! $1 $2 $3 $4 $5 $6 $7 $8 $9 | |
302 | |
303 xor $2, out0, local1 | |
304 | |
305 ld [out2+284], local5 ! 0x0000FC00 | |
306 ba $4 | |
307 and local1, 252, local1 | |
308 | |
309 .align 32 | |
310 | |
311 $4: | |
312 ! local6 is address sbox 6 | |
313 ! out3 is address sbox 8 | |
314 ! out4 is loop counter | |
315 | |
316 ld [global1+local1], local1 | |
317 xor $2, out1, out1 ! 8642 | |
318 xor $2, out0, out0 ! 7531 | |
319 ! fmovs %f0, %f0 ! fxor used for alignment | |
320 | |
321 srl out1, 4, local0 ! rotate 4 right | |
322 and out0, local5, local3 ! 3 | |
323 ! fmovs %f0, %f0 | |
324 | |
325 ld [$5+$3*8], local7 ! key 7531 next round | |
326 srl local3, 8, local3 ! 3 | |
327 and local0, 252, local2 ! 2 | |
328 ! fmovs %f0, %f0 | |
329 | |
330 ld [global3+local3],local3 ! 3 | |
331 sll out1, 28, out1 ! rotate | |
332 xor $1, local1, $1 ! 1 finished, local1 now sbox 7 | |
333 | |
334 ld [global2+local2], local2 ! 2 | |
335 srl out0, 24, local1 ! 7 | |
336 or out1, local0, out1 ! rotate | |
337 | |
338 ldub [out2+local1], local1 ! 7 (and 0xFC) | |
339 srl out1, 24, local0 ! 8 | |
340 and out1, local5, local4 ! 4 | |
341 | |
342 ldub [out2+local0], local0 ! 8 (and 0xFC) | |
343 srl local4, 8, local4 ! 4 | |
344 xor $1, local2, $1 ! 2 finished local2 now sbox 6 | |
345 | |
346 ld [global4+local4],local4 ! 4 | |
347 srl out1, 16, local2 ! 6 | |
348 xor $1, local3, $1 ! 3 finished local3 now sbox 5 | |
349 | |
350 ld [out3+local0],local0 ! 8 | |
351 and local2, 252, local2 ! 6 | |
352 add global1, 1536, local5 ! address sbox 7 | |
353 | |
354 ld [local6+local2], local2 ! 6 | |
355 srl out0, 16, local3 ! 5 | |
356 xor $1, local4, $1 ! 4 finished | |
357 | |
358 ld [local5+local1],local1 ! 7 | |
359 and local3, 252, local3 ! 5 | |
360 xor $1, local0, $1 ! 8 finished | |
361 | |
362 ld [global5+local3],local3 ! 5 | |
363 xor $1, local2, $1 ! 6 finished | |
364 subcc out4, 1, out4 | |
365 | |
366 ld [$5+$3*8+4], out0 ! key 8642 next round | |
367 xor $1, local7, local2 ! sbox 5 next round | |
368 xor $1, local1, $1 ! 7 finished | |
369 | |
370 srl local2, 16, local2 ! sbox 5 next round | |
371 xor $1, local3, $1 ! 5 finished | |
372 | |
373 ld [$5+$3*16+4], out1 ! key 8642 next round again | |
374 and local2, 252, local2 ! sbox5 next round | |
375 ! next round | |
376 xor $1, local7, local7 ! 7531 | |
377 | |
378 ld [global5+local2], local2 ! 5 | |
379 srl local7, 24, local3 ! 7 | |
380 xor $1, out0, out0 ! 8642 | |
381 | |
382 ldub [out2+local3], local3 ! 7 (and 0xFC) | |
383 srl out0, 4, local0 ! rotate 4 right | |
384 and local7, 252, local1 ! 1 | |
385 | |
386 sll out0, 28, out0 ! rotate | |
387 xor $2, local2, $2 ! 5 finished local2 used | |
388 | |
389 srl local0, 8, local4 ! 4 | |
390 and local0, 252, local2 ! 2 | |
391 ld [local5+local3], local3 ! 7 | |
392 | |
393 srl local0, 16, local5 ! 6 | |
394 or out0, local0, out0 ! rotate | |
395 ld [global2+local2], local2 ! 2 | |
396 | |
397 srl out0, 24, local0 | |
398 ld [$5+$3*16], out0 ! key 7531 next round | |
399 and local4, 252, local4 ! 4 | |
400 | |
401 and local5, 252, local5 ! 6 | |
402 ld [global4+local4], local4 ! 4 | |
403 xor $2, local3, $2 ! 7 finished local3 used | |
404 | |
405 and local0, 252, local0 ! 8 | |
406 ld [local6+local5], local5 ! 6 | |
407 xor $2, local2, $2 ! 2 finished local2 now sbox 3 | |
408 | |
409 srl local7, 8, local2 ! 3 start | |
410 ld [out3+local0], local0 ! 8 | |
411 xor $2, local4, $2 ! 4 finished | |
412 | |
413 and local2, 252, local2 ! 3 | |
414 ld [global1+local1], local1 ! 1 | |
415 xor $2, local5, $2 ! 6 finished local5 used | |
416 | |
417 ld [global3+local2], local2 ! 3 | |
418 xor $2, local0, $2 ! 8 finished | |
419 add $5, $3*16, $5 ! enc add 8, dec add -8 to key pointer | |
420 | |
421 ld [out2+284], local5 ! 0x0000FC00 | |
422 xor $2, out0, local4 ! sbox 1 next round | |
423 xor $2, local1, $2 ! 1 finished | |
424 | |
425 xor $2, local2, $2 ! 3 finished | |
426 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
427 bne,pt %icc, $4 | |
428 #else | |
429 bne $4 | |
430 #endif | |
431 and local4, 252, local1 ! sbox 1 next round | |
432 | |
433 ! two rounds more: | |
434 | |
435 ld [global1+local1], local1 | |
436 xor $2, out1, out1 | |
437 xor $2, out0, out0 | |
438 | |
439 srl out1, 4, local0 ! rotate | |
440 and out0, local5, local3 | |
441 | |
442 ld [$5+$3*8], local7 ! key 7531 | |
443 srl local3, 8, local3 | |
444 and local0, 252, local2 | |
445 | |
446 ld [global3+local3],local3 | |
447 sll out1, 28, out1 ! rotate | |
448 xor $1, local1, $1 ! 1 finished, local1 now sbox 7 | |
449 | |
450 ld [global2+local2], local2 | |
451 srl out0, 24, local1 | |
452 or out1, local0, out1 ! rotate | |
453 | |
454 ldub [out2+local1], local1 | |
455 srl out1, 24, local0 | |
456 and out1, local5, local4 | |
457 | |
458 ldub [out2+local0], local0 | |
459 srl local4, 8, local4 | |
460 xor $1, local2, $1 ! 2 finished local2 now sbox 6 | |
461 | |
462 ld [global4+local4],local4 | |
463 srl out1, 16, local2 | |
464 xor $1, local3, $1 ! 3 finished local3 now sbox 5 | |
465 | |
466 ld [out3+local0],local0 | |
467 and local2, 252, local2 | |
468 add global1, 1536, local5 ! address sbox 7 | |
469 | |
470 ld [local6+local2], local2 | |
471 srl out0, 16, local3 | |
472 xor $1, local4, $1 ! 4 finished | |
473 | |
474 ld [local5+local1],local1 | |
475 and local3, 252, local3 | |
476 xor $1, local0, $1 | |
477 | |
478 ld [global5+local3],local3 | |
479 xor $1, local2, $1 ! 6 finished | |
480 cmp in2, 8 | |
481 | |
482 ifelse($6,{}, {}, {ld [out2+280], out4}) ! loop counter | |
483 xor $1, local7, local2 ! sbox 5 next round | |
484 xor $1, local1, $1 ! 7 finished | |
485 | |
486 ld [$5+$3*8+4], out0 | |
487 srl local2, 16, local2 ! sbox 5 next round | |
488 xor $1, local3, $1 ! 5 finished | |
489 | |
490 and local2, 252, local2 | |
491 ! next round (two rounds more) | |
492 xor $1, local7, local7 ! 7531 | |
493 | |
494 ld [global5+local2], local2 | |
495 srl local7, 24, local3 | |
496 xor $1, out0, out0 ! 8642 | |
497 | |
498 ldub [out2+local3], local3 | |
499 srl out0, 4, local0 ! rotate | |
500 and local7, 252, local1 | |
501 | |
502 sll out0, 28, out0 ! rotate | |
503 xor $2, local2, $2 ! 5 finished local2 used | |
504 | |
505 srl local0, 8, local4 | |
506 and local0, 252, local2 | |
507 ld [local5+local3], local3 | |
508 | |
509 srl local0, 16, local5 | |
510 or out0, local0, out0 ! rotate | |
511 ld [global2+local2], local2 | |
512 | |
513 srl out0, 24, local0 | |
514 ifelse($6,{}, {}, {ld [$6], out0}) ! key next encryption/decryption | |
515 and local4, 252, local4 | |
516 | |
517 and local5, 252, local5 | |
518 ld [global4+local4], local4 | |
519 xor $2, local3, $2 ! 7 finished local3 used | |
520 | |
521 and local0, 252, local0 | |
522 ld [local6+local5], local5 | |
523 xor $2, local2, $2 ! 2 finished local2 now sbox 3 | |
524 | |
525 srl local7, 8, local2 ! 3 start | |
526 ld [out3+local0], local0 | |
527 xor $2, local4, $2 | |
528 | |
529 and local2, 252, local2 | |
530 ld [global1+local1], local1 | |
531 xor $2, local5, $2 ! 6 finished local5 used | |
532 | |
533 ld [global3+local2], local2 | |
534 srl $1, 3, local3 | |
535 xor $2, local0, $2 | |
536 | |
537 ifelse($6,{}, {}, {ld [$6+4], out1}) ! key next encryption/decryption | |
538 sll $1, 29, local4 | |
539 xor $2, local1, $2 | |
540 | |
541 ifelse($7,{}, {}, {retl}) | |
542 xor $2, local2, $2 | |
543 }) | |
544 | |
545 | |
546 ! {fp_macro} | |
547 ! | |
548 ! parameter 1 right (original left) | |
549 ! parameter 2 left (original right) | |
550 ! parameter 3 1 for optional store to [in0] | |
551 ! parameter 4 1 for load input/output address to local5/7 | |
552 ! | |
553 ! The final permutation logic switches the halfes, meaning that | |
554 ! left and right ends up the the registers originally used. | |
555 | |
556 define(fp_macro, { | |
557 | |
558 ! {fp_macro} | |
559 ! $1 $2 $3 $4 $5 $6 $7 $8 $9 | |
560 | |
561 ! initially undo the rotate 3 left done after initial permutation | |
562 ! original left is received shifted 3 right and 29 left in local3/4 | |
563 | |
564 sll $2, 29, local1 | |
565 or local3, local4, $1 | |
566 | |
567 srl $2, 3, $2 | |
568 sethi %hi(0x55555555), local2 | |
569 | |
570 or $2, local1, $2 | |
571 or local2, %lo(0x55555555), local2 | |
572 | |
573 srl $2, 1, local3 | |
574 sethi %hi(0x00ff00ff), local1 | |
575 xor local3, $1, local3 | |
576 or local1, %lo(0x00ff00ff), local1 | |
577 and local3, local2, local3 | |
578 sethi %hi(0x33333333), local4 | |
579 sll local3, 1, local2 | |
580 | |
581 xor $1, local3, $1 | |
582 | |
583 srl $1, 8, local3 | |
584 xor $2, local2, $2 | |
585 xor local3, $2, local3 | |
586 or local4, %lo(0x33333333), local4 | |
587 and local3, local1, local3 | |
588 sethi %hi(0x0000ffff), local1 | |
589 sll local3, 8, local2 | |
590 | |
591 xor $2, local3, $2 | |
592 | |
593 srl $2, 2, local3 | |
594 xor $1, local2, $1 | |
595 xor local3, $1, local3 | |
596 or local1, %lo(0x0000ffff), local1 | |
597 and local3, local4, local3 | |
598 sethi %hi(0x0f0f0f0f), local4 | |
599 sll local3, 2, local2 | |
600 | |
601 ifelse($4,1, {LDPTR INPUT, local5}) | |
602 xor $1, local3, $1 | |
603 | |
604 ifelse($4,1, {LDPTR OUTPUT, local7}) | |
605 srl $1, 16, local3 | |
606 xor $2, local2, $2 | |
607 xor local3, $2, local3 | |
608 or local4, %lo(0x0f0f0f0f), local4 | |
609 and local3, local1, local3 | |
610 sll local3, 16, local2 | |
611 | |
612 xor $2, local3, local1 | |
613 | |
614 srl local1, 4, local3 | |
615 xor $1, local2, $1 | |
616 xor local3, $1, local3 | |
617 and local3, local4, local3 | |
618 sll local3, 4, local2 | |
619 | |
620 xor $1, local3, $1 | |
621 | |
622 ! optional store: | |
623 | |
624 ifelse($3,1, {st $1, [in0]}) | |
625 | |
626 xor local1, local2, $2 | |
627 | |
628 ifelse($3,1, {st $2, [in0+4]}) | |
629 | |
630 }) | |
631 | |
632 | |
633 ! {fp_ip_macro} | |
634 ! | |
635 ! Does initial permutation for next block mixed with | |
636 ! final permutation for current block. | |
637 ! | |
638 ! parameter 1 original left | |
639 ! parameter 2 original right | |
640 ! parameter 3 left ip | |
641 ! parameter 4 right ip | |
642 ! parameter 5 1: load ks1/ks2 to in3/in4, add 120 to in4 | |
643 ! 2: mov in4 to in3 | |
644 ! | |
645 ! also adds -8 to length in2 and loads loop counter to out4 | |
646 | |
647 define(fp_ip_macro, { | |
648 | |
649 ! {fp_ip_macro} | |
650 ! $1 $2 $3 $4 $5 $6 $7 $8 $9 | |
651 | |
652 define({temp1},{out4}) | |
653 define({temp2},{local3}) | |
654 | |
655 define({ip1},{local1}) | |
656 define({ip2},{local2}) | |
657 define({ip4},{local4}) | |
658 define({ip5},{local5}) | |
659 | |
660 ! $1 in local3, local4 | |
661 | |
662 ld [out2+256], ip1 | |
663 sll out5, 29, temp1 | |
664 or local3, local4, $1 | |
665 | |
666 srl out5, 3, $2 | |
667 ifelse($5,2,{mov in4, in3}) | |
668 | |
669 ld [out2+272], ip5 | |
670 srl $4, 4, local0 | |
671 or $2, temp1, $2 | |
672 | |
673 srl $2, 1, temp1 | |
674 xor temp1, $1, temp1 | |
675 | |
676 and temp1, ip5, temp1 | |
677 xor local0, $3, local0 | |
678 | |
679 sll temp1, 1, temp2 | |
680 xor $1, temp1, $1 | |
681 | |
682 and local0, ip1, local0 | |
683 add in2, -8, in2 | |
684 | |
685 sll local0, 4, local7 | |
686 xor $3, local0, $3 | |
687 | |
688 ld [out2+268], ip4 | |
689 srl $1, 8, temp1 | |
690 xor $2, temp2, $2 | |
691 ld [out2+260], ip2 | |
692 srl $3, 16, local0 | |
693 xor $4, local7, $4 | |
694 xor temp1, $2, temp1 | |
695 xor local0, $4, local0 | |
696 and temp1, ip4, temp1 | |
697 and local0, ip2, local0 | |
698 sll temp1, 8, temp2 | |
699 xor $2, temp1, $2 | |
700 sll local0, 16, local7 | |
701 xor $4, local0, $4 | |
702 | |
703 srl $2, 2, temp1 | |
704 xor $1, temp2, $1 | |
705 | |
706 ld [out2+264], temp2 ! ip3 | |
707 srl $4, 2, local0 | |
708 xor $3, local7, $3 | |
709 xor temp1, $1, temp1 | |
710 xor local0, $3, local0 | |
711 and temp1, temp2, temp1 | |
712 and local0, temp2, local0 | |
713 sll temp1, 2, temp2 | |
714 xor $1, temp1, $1 | |
715 sll local0, 2, local7 | |
716 xor $3, local0, $3 | |
717 | |
718 srl $1, 16, temp1 | |
719 xor $2, temp2, $2 | |
720 srl $3, 8, local0 | |
721 xor $4, local7, $4 | |
722 xor temp1, $2, temp1 | |
723 xor local0, $4, local0 | |
724 and temp1, ip2, temp1 | |
725 and local0, ip4, local0 | |
726 sll temp1, 16, temp2 | |
727 xor $2, temp1, local4 | |
728 sll local0, 8, local7 | |
729 xor $4, local0, $4 | |
730 | |
731 srl $4, 1, local0 | |
732 xor $3, local7, $3 | |
733 | |
734 srl local4, 4, temp1 | |
735 xor local0, $3, local0 | |
736 | |
737 xor $1, temp2, $1 | |
738 and local0, ip5, local0 | |
739 | |
740 sll local0, 1, local7 | |
741 xor temp1, $1, temp1 | |
742 | |
743 xor $3, local0, $3 | |
744 xor $4, local7, $4 | |
745 | |
746 sll $3, 3, local5 | |
747 and temp1, ip1, temp1 | |
748 | |
749 sll temp1, 4, temp2 | |
750 xor $1, temp1, $1 | |
751 | |
752 ifelse($5,1,{LDPTR KS2, in4}) | |
753 sll $4, 3, local2 | |
754 xor local4, temp2, $2 | |
755 | |
756 ! reload since used as temporar: | |
757 | |
758 ld [out2+280], out4 ! loop counter | |
759 | |
760 srl $3, 29, local0 | |
761 ifelse($5,1,{add in4, 120, in4}) | |
762 | |
763 ifelse($5,1,{LDPTR KS1, in3}) | |
764 srl $4, 29, local7 | |
765 | |
766 or local0, local5, $4 | |
767 or local2, local7, $3 | |
768 | |
769 }) | |
770 | |
771 | |
772 | |
773 ! {load_little_endian} | |
774 ! | |
775 ! parameter 1 address | |
776 ! parameter 2 destination left | |
777 ! parameter 3 destination right | |
778 ! parameter 4 temporar | |
779 ! parameter 5 label | |
780 | |
781 define(load_little_endian, { | |
782 | |
783 ! {load_little_endian} | |
784 ! $1 $2 $3 $4 $5 $6 $7 $8 $9 | |
785 | |
786 ! first in memory to rightmost in register | |
787 | |
788 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
789 andcc $1, 3, global0 | |
790 bne,pn %icc, $5 | |
791 nop | |
792 | |
793 lda [$1] 0x88, $2 | |
794 add $1, 4, $4 | |
795 | |
796 ba,pt %icc, $5a | |
797 lda [$4] 0x88, $3 | |
798 #endif | |
799 | |
800 $5: | |
801 ldub [$1+3], $2 | |
802 | |
803 ldub [$1+2], $4 | |
804 sll $2, 8, $2 | |
805 or $2, $4, $2 | |
806 | |
807 ldub [$1+1], $4 | |
808 sll $2, 8, $2 | |
809 or $2, $4, $2 | |
810 | |
811 ldub [$1+0], $4 | |
812 sll $2, 8, $2 | |
813 or $2, $4, $2 | |
814 | |
815 | |
816 ldub [$1+3+4], $3 | |
817 | |
818 ldub [$1+2+4], $4 | |
819 sll $3, 8, $3 | |
820 or $3, $4, $3 | |
821 | |
822 ldub [$1+1+4], $4 | |
823 sll $3, 8, $3 | |
824 or $3, $4, $3 | |
825 | |
826 ldub [$1+0+4], $4 | |
827 sll $3, 8, $3 | |
828 or $3, $4, $3 | |
829 $5a: | |
830 | |
831 }) | |
832 | |
833 | |
834 ! {load_little_endian_inc} | |
835 ! | |
836 ! parameter 1 address | |
837 ! parameter 2 destination left | |
838 ! parameter 3 destination right | |
839 ! parameter 4 temporar | |
840 ! parameter 4 label | |
841 ! | |
842 ! adds 8 to address | |
843 | |
844 define(load_little_endian_inc, { | |
845 | |
846 ! {load_little_endian_inc} | |
847 ! $1 $2 $3 $4 $5 $6 $7 $8 $9 | |
848 | |
849 ! first in memory to rightmost in register | |
850 | |
851 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
852 andcc $1, 3, global0 | |
853 bne,pn %icc, $5 | |
854 nop | |
855 | |
856 lda [$1] 0x88, $2 | |
857 add $1, 4, $1 | |
858 | |
859 lda [$1] 0x88, $3 | |
860 ba,pt %icc, $5a | |
861 add $1, 4, $1 | |
862 #endif | |
863 | |
864 $5: | |
865 ldub [$1+3], $2 | |
866 | |
867 ldub [$1+2], $4 | |
868 sll $2, 8, $2 | |
869 or $2, $4, $2 | |
870 | |
871 ldub [$1+1], $4 | |
872 sll $2, 8, $2 | |
873 or $2, $4, $2 | |
874 | |
875 ldub [$1+0], $4 | |
876 sll $2, 8, $2 | |
877 or $2, $4, $2 | |
878 | |
879 ldub [$1+3+4], $3 | |
880 add $1, 8, $1 | |
881 | |
882 ldub [$1+2+4-8], $4 | |
883 sll $3, 8, $3 | |
884 or $3, $4, $3 | |
885 | |
886 ldub [$1+1+4-8], $4 | |
887 sll $3, 8, $3 | |
888 or $3, $4, $3 | |
889 | |
890 ldub [$1+0+4-8], $4 | |
891 sll $3, 8, $3 | |
892 or $3, $4, $3 | |
893 $5a: | |
894 | |
895 }) | |
896 | |
897 | |
898 ! {load_n_bytes} | |
899 ! | |
900 ! Loads 1 to 7 bytes little endian | |
901 ! Remaining bytes are zeroed. | |
902 ! | |
903 ! parameter 1 address | |
904 ! parameter 2 length | |
905 ! parameter 3 destination register left | |
906 ! parameter 4 destination register right | |
907 ! parameter 5 temp | |
908 ! parameter 6 temp2 | |
909 ! parameter 7 label | |
910 ! parameter 8 return label | |
911 | |
912 define(load_n_bytes, { | |
913 | |
914 ! {load_n_bytes} | |
915 ! $1 $2 $5 $6 $7 $8 $7 $8 $9 | |
916 | |
917 $7.0: call .+8 | |
918 sll $2, 2, $6 | |
919 | |
920 add %o7,$7.jmp.table-$7.0,$5 | |
921 | |
922 add $5, $6, $5 | |
923 mov 0, $4 | |
924 | |
925 ld [$5], $5 | |
926 | |
927 jmp %o7+$5 | |
928 mov 0, $3 | |
929 | |
930 $7.7: | |
931 ldub [$1+6], $5 | |
932 sll $5, 16, $5 | |
933 or $3, $5, $3 | |
934 $7.6: | |
935 ldub [$1+5], $5 | |
936 sll $5, 8, $5 | |
937 or $3, $5, $3 | |
938 $7.5: | |
939 ldub [$1+4], $5 | |
940 or $3, $5, $3 | |
941 $7.4: | |
942 ldub [$1+3], $5 | |
943 sll $5, 24, $5 | |
944 or $4, $5, $4 | |
945 $7.3: | |
946 ldub [$1+2], $5 | |
947 sll $5, 16, $5 | |
948 or $4, $5, $4 | |
949 $7.2: | |
950 ldub [$1+1], $5 | |
951 sll $5, 8, $5 | |
952 or $4, $5, $4 | |
953 $7.1: | |
954 ldub [$1+0], $5 | |
955 ba $8 | |
956 or $4, $5, $4 | |
957 | |
958 .align 4 | |
959 | |
960 $7.jmp.table: | |
961 .word 0 | |
962 .word $7.1-$7.0 | |
963 .word $7.2-$7.0 | |
964 .word $7.3-$7.0 | |
965 .word $7.4-$7.0 | |
966 .word $7.5-$7.0 | |
967 .word $7.6-$7.0 | |
968 .word $7.7-$7.0 | |
969 }) | |
970 | |
971 | |
972 ! {store_little_endian} | |
973 ! | |
974 ! parameter 1 address | |
975 ! parameter 2 source left | |
976 ! parameter 3 source right | |
977 ! parameter 4 temporar | |
978 | |
979 define(store_little_endian, { | |
980 | |
981 ! {store_little_endian} | |
982 ! $1 $2 $3 $4 $5 $6 $7 $8 $9 | |
983 | |
984 ! rightmost in register to first in memory | |
985 | |
986 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
987 andcc $1, 3, global0 | |
988 bne,pn %icc, $5 | |
989 nop | |
990 | |
991 sta $2, [$1] 0x88 | |
992 add $1, 4, $4 | |
993 | |
994 ba,pt %icc, $5a | |
995 sta $3, [$4] 0x88 | |
996 #endif | |
997 | |
998 $5: | |
999 and $2, 255, $4 | |
1000 stub $4, [$1+0] | |
1001 | |
1002 srl $2, 8, $4 | |
1003 and $4, 255, $4 | |
1004 stub $4, [$1+1] | |
1005 | |
1006 srl $2, 16, $4 | |
1007 and $4, 255, $4 | |
1008 stub $4, [$1+2] | |
1009 | |
1010 srl $2, 24, $4 | |
1011 stub $4, [$1+3] | |
1012 | |
1013 | |
1014 and $3, 255, $4 | |
1015 stub $4, [$1+0+4] | |
1016 | |
1017 srl $3, 8, $4 | |
1018 and $4, 255, $4 | |
1019 stub $4, [$1+1+4] | |
1020 | |
1021 srl $3, 16, $4 | |
1022 and $4, 255, $4 | |
1023 stub $4, [$1+2+4] | |
1024 | |
1025 srl $3, 24, $4 | |
1026 stub $4, [$1+3+4] | |
1027 | |
1028 $5a: | |
1029 | |
1030 }) | |
1031 | |
1032 | |
1033 ! {store_n_bytes} | |
1034 ! | |
1035 ! Stores 1 to 7 bytes little endian | |
1036 ! | |
1037 ! parameter 1 address | |
1038 ! parameter 2 length | |
1039 ! parameter 3 source register left | |
1040 ! parameter 4 source register right | |
1041 ! parameter 5 temp | |
1042 ! parameter 6 temp2 | |
1043 ! parameter 7 label | |
1044 ! parameter 8 return label | |
1045 | |
1046 define(store_n_bytes, { | |
1047 | |
1048 ! {store_n_bytes} | |
1049 ! $1 $2 $5 $6 $7 $8 $7 $8 $9 | |
1050 | |
1051 $7.0: call .+8 | |
1052 sll $2, 2, $6 | |
1053 | |
1054 add %o7,$7.jmp.table-$7.0,$5 | |
1055 | |
1056 add $5, $6, $5 | |
1057 | |
1058 ld [$5], $5 | |
1059 | |
1060 jmp %o7+$5 | |
1061 nop | |
1062 | |
1063 $7.7: | |
1064 srl $3, 16, $5 | |
1065 and $5, 0xff, $5 | |
1066 stub $5, [$1+6] | |
1067 $7.6: | |
1068 srl $3, 8, $5 | |
1069 and $5, 0xff, $5 | |
1070 stub $5, [$1+5] | |
1071 $7.5: | |
1072 and $3, 0xff, $5 | |
1073 stub $5, [$1+4] | |
1074 $7.4: | |
1075 srl $4, 24, $5 | |
1076 stub $5, [$1+3] | |
1077 $7.3: | |
1078 srl $4, 16, $5 | |
1079 and $5, 0xff, $5 | |
1080 stub $5, [$1+2] | |
1081 $7.2: | |
1082 srl $4, 8, $5 | |
1083 and $5, 0xff, $5 | |
1084 stub $5, [$1+1] | |
1085 $7.1: | |
1086 and $4, 0xff, $5 | |
1087 | |
1088 | |
1089 ba $8 | |
1090 stub $5, [$1] | |
1091 | |
1092 .align 4 | |
1093 | |
1094 $7.jmp.table: | |
1095 | |
1096 .word 0 | |
1097 .word $7.1-$7.0 | |
1098 .word $7.2-$7.0 | |
1099 .word $7.3-$7.0 | |
1100 .word $7.4-$7.0 | |
1101 .word $7.5-$7.0 | |
1102 .word $7.6-$7.0 | |
1103 .word $7.7-$7.0 | |
1104 }) | |
1105 | |
1106 | |
1107 define(testvalue,{1}) | |
1108 | |
1109 define(register_init, { | |
1110 | |
1111 ! For test purposes: | |
1112 | |
1113 sethi %hi(testvalue), local0 | |
1114 or local0, %lo(testvalue), local0 | |
1115 | |
1116 ifelse($1,{},{}, {mov local0, $1}) | |
1117 ifelse($2,{},{}, {mov local0, $2}) | |
1118 ifelse($3,{},{}, {mov local0, $3}) | |
1119 ifelse($4,{},{}, {mov local0, $4}) | |
1120 ifelse($5,{},{}, {mov local0, $5}) | |
1121 ifelse($6,{},{}, {mov local0, $6}) | |
1122 ifelse($7,{},{}, {mov local0, $7}) | |
1123 ifelse($8,{},{}, {mov local0, $8}) | |
1124 | |
1125 mov local0, local1 | |
1126 mov local0, local2 | |
1127 mov local0, local3 | |
1128 mov local0, local4 | |
1129 mov local0, local5 | |
1130 mov local0, local7 | |
1131 mov local0, local6 | |
1132 mov local0, out0 | |
1133 mov local0, out1 | |
1134 mov local0, out2 | |
1135 mov local0, out3 | |
1136 mov local0, out4 | |
1137 mov local0, out5 | |
1138 mov local0, global1 | |
1139 mov local0, global2 | |
1140 mov local0, global3 | |
1141 mov local0, global4 | |
1142 mov local0, global5 | |
1143 | |
1144 }) | |
1145 | |
1146 .section ".text" | |
1147 | |
1148 .align 32 | |
1149 | |
1150 .des_enc: | |
1151 | |
1152 ! key address in3 | |
1153 ! loads key next encryption/decryption first round from [in4] | |
1154 | |
1155 rounds_macro(in5, out5, 1, .des_enc.1, in3, in4, retl) | |
1156 | |
1157 | |
1158 .align 32 | |
1159 | |
1160 .des_dec: | |
1161 | |
1162 ! implemented with out5 as first parameter to avoid | |
1163 ! register exchange in ede modes | |
1164 | |
1165 ! key address in4 | |
1166 ! loads key next encryption/decryption first round from [in3] | |
1167 | |
1168 rounds_macro(out5, in5, -1, .des_dec.1, in4, in3, retl) | |
1169 | |
1170 | |
1171 | |
1172 ! void DES_encrypt1(data, ks, enc) | |
1173 ! ******************************* | |
1174 | |
1175 .align 32 | |
1176 .global DES_encrypt1 | |
1177 .type DES_encrypt1,#function | |
1178 | |
1179 DES_encrypt1: | |
1180 | |
1181 save %sp, FRAME, %sp | |
1182 | |
1183 sethi %hi(.PIC.DES_SPtrans-1f),global1 | |
1184 or global1,%lo(.PIC.DES_SPtrans-1f),global1 | |
1185 1: call .+8 | |
1186 add %o7,global1,global1 | |
1187 sub global1,.PIC.DES_SPtrans-.des_and,out2 | |
1188 | |
1189 ld [in0], in5 ! left | |
1190 cmp in2, 0 ! enc | |
1191 | |
1192 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1193 be,pn %icc, .encrypt.dec ! enc/dec | |
1194 #else | |
1195 be .encrypt.dec | |
1196 #endif | |
1197 ld [in0+4], out5 ! right | |
1198 | |
1199 ! parameter 6 1/2 for include encryption/decryption | |
1200 ! parameter 7 1 for move in1 to in3 | |
1201 ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 | |
1202 | |
1203 ip_macro(in5, out5, in5, out5, in3, 0, 1, 1) | |
1204 | |
1205 rounds_macro(in5, out5, 1, .des_encrypt1.1, in3, in4) ! in4 not used | |
1206 | |
1207 fp_macro(in5, out5, 1) ! 1 for store to [in0] | |
1208 | |
1209 ret | |
1210 restore | |
1211 | |
1212 .encrypt.dec: | |
1213 | |
1214 add in1, 120, in3 ! use last subkey for first round | |
1215 | |
1216 ! parameter 6 1/2 for include encryption/decryption | |
1217 ! parameter 7 1 for move in1 to in3 | |
1218 ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 | |
1219 | |
1220 ip_macro(in5, out5, out5, in5, in4, 2, 0, 1) ! include dec, ks in4 | |
1221 | |
1222 fp_macro(out5, in5, 1) ! 1 for store to [in0] | |
1223 | |
1224 ret | |
1225 restore | |
1226 | |
1227 .DES_encrypt1.end: | |
1228 .size DES_encrypt1,.DES_encrypt1.end-DES_encrypt1 | |
1229 | |
1230 | |
1231 ! void DES_encrypt2(data, ks, enc) | |
1232 !********************************* | |
1233 | |
1234 ! encrypts/decrypts without initial/final permutation | |
1235 | |
1236 .align 32 | |
1237 .global DES_encrypt2 | |
1238 .type DES_encrypt2,#function | |
1239 | |
1240 DES_encrypt2: | |
1241 | |
1242 save %sp, FRAME, %sp | |
1243 | |
1244 sethi %hi(.PIC.DES_SPtrans-1f),global1 | |
1245 or global1,%lo(.PIC.DES_SPtrans-1f),global1 | |
1246 1: call .+8 | |
1247 add %o7,global1,global1 | |
1248 sub global1,.PIC.DES_SPtrans-.des_and,out2 | |
1249 | |
1250 ! Set sbox address 1 to 6 and rotate halfs 3 left | |
1251 ! Errors caught by destest? Yes. Still? *NO* | |
1252 | |
1253 !sethi %hi(DES_SPtrans), global1 ! address sbox 1 | |
1254 | |
1255 !or global1, %lo(DES_SPtrans), global1 ! sbox 1 | |
1256 | |
1257 add global1, 256, global2 ! sbox 2 | |
1258 add global1, 512, global3 ! sbox 3 | |
1259 | |
1260 ld [in0], out5 ! right | |
1261 add global1, 768, global4 ! sbox 4 | |
1262 add global1, 1024, global5 ! sbox 5 | |
1263 | |
1264 ld [in0+4], in5 ! left | |
1265 add global1, 1280, local6 ! sbox 6 | |
1266 add global1, 1792, out3 ! sbox 8 | |
1267 | |
1268 ! rotate | |
1269 | |
1270 sll in5, 3, local5 | |
1271 mov in1, in3 ! key address to in3 | |
1272 | |
1273 sll out5, 3, local7 | |
1274 srl in5, 29, in5 | |
1275 | |
1276 srl out5, 29, out5 | |
1277 add in5, local5, in5 | |
1278 | |
1279 add out5, local7, out5 | |
1280 cmp in2, 0 | |
1281 | |
1282 ! we use our own stackframe | |
1283 | |
1284 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1285 be,pn %icc, .encrypt2.dec ! decryption | |
1286 #else | |
1287 be .encrypt2.dec | |
1288 #endif | |
1289 STPTR in0, [%sp+BIAS+ARG0+0*ARGSZ] | |
1290 | |
1291 ld [in3], out0 ! key 7531 first round | |
1292 mov LOOPS, out4 ! loop counter | |
1293 | |
1294 ld [in3+4], out1 ! key 8642 first round | |
1295 sethi %hi(0x0000FC00), local5 | |
1296 | |
1297 call .des_enc | |
1298 mov in3, in4 | |
1299 | |
1300 ! rotate | |
1301 sll in5, 29, in0 | |
1302 srl in5, 3, in5 | |
1303 sll out5, 29, in1 | |
1304 add in5, in0, in5 | |
1305 srl out5, 3, out5 | |
1306 LDPTR [%sp+BIAS+ARG0+0*ARGSZ], in0 | |
1307 add out5, in1, out5 | |
1308 st in5, [in0] | |
1309 st out5, [in0+4] | |
1310 | |
1311 ret | |
1312 restore | |
1313 | |
1314 | |
1315 .encrypt2.dec: | |
1316 | |
1317 add in3, 120, in4 | |
1318 | |
1319 ld [in4], out0 ! key 7531 first round | |
1320 mov LOOPS, out4 ! loop counter | |
1321 | |
1322 ld [in4+4], out1 ! key 8642 first round | |
1323 sethi %hi(0x0000FC00), local5 | |
1324 | |
1325 mov in5, local1 ! left expected in out5 | |
1326 mov out5, in5 | |
1327 | |
1328 call .des_dec | |
1329 mov local1, out5 | |
1330 | |
1331 .encrypt2.finish: | |
1332 | |
1333 ! rotate | |
1334 sll in5, 29, in0 | |
1335 srl in5, 3, in5 | |
1336 sll out5, 29, in1 | |
1337 add in5, in0, in5 | |
1338 srl out5, 3, out5 | |
1339 LDPTR [%sp+BIAS+ARG0+0*ARGSZ], in0 | |
1340 add out5, in1, out5 | |
1341 st out5, [in0] | |
1342 st in5, [in0+4] | |
1343 | |
1344 ret | |
1345 restore | |
1346 | |
1347 .DES_encrypt2.end: | |
1348 .size DES_encrypt2, .DES_encrypt2.end-DES_encrypt2 | |
1349 | |
1350 | |
1351 ! void DES_encrypt3(data, ks1, ks2, ks3) | |
1352 ! ************************************** | |
1353 | |
1354 .align 32 | |
1355 .global DES_encrypt3 | |
1356 .type DES_encrypt3,#function | |
1357 | |
1358 DES_encrypt3: | |
1359 | |
1360 save %sp, FRAME, %sp | |
1361 | |
1362 sethi %hi(.PIC.DES_SPtrans-1f),global1 | |
1363 or global1,%lo(.PIC.DES_SPtrans-1f),global1 | |
1364 1: call .+8 | |
1365 add %o7,global1,global1 | |
1366 sub global1,.PIC.DES_SPtrans-.des_and,out2 | |
1367 | |
1368 ld [in0], in5 ! left | |
1369 add in2, 120, in4 ! ks2 | |
1370 | |
1371 ld [in0+4], out5 ! right | |
1372 mov in3, in2 ! save ks3 | |
1373 | |
1374 ! parameter 6 1/2 for include encryption/decryption | |
1375 ! parameter 7 1 for mov in1 to in3 | |
1376 ! parameter 8 1 for mov in3 to in4 | |
1377 ! parameter 9 1 for load ks3 and ks2 to in4 and in3 | |
1378 | |
1379 ip_macro(in5, out5, in5, out5, in3, 1, 1, 0, 0) | |
1380 | |
1381 call .des_dec | |
1382 mov in2, in3 ! preload ks3 | |
1383 | |
1384 call .des_enc | |
1385 nop | |
1386 | |
1387 fp_macro(in5, out5, 1) | |
1388 | |
1389 ret | |
1390 restore | |
1391 | |
1392 .DES_encrypt3.end: | |
1393 .size DES_encrypt3,.DES_encrypt3.end-DES_encrypt3 | |
1394 | |
1395 | |
1396 ! void DES_decrypt3(data, ks1, ks2, ks3) | |
1397 ! ************************************** | |
1398 | |
1399 .align 32 | |
1400 .global DES_decrypt3 | |
1401 .type DES_decrypt3,#function | |
1402 | |
1403 DES_decrypt3: | |
1404 | |
1405 save %sp, FRAME, %sp | |
1406 | |
1407 sethi %hi(.PIC.DES_SPtrans-1f),global1 | |
1408 or global1,%lo(.PIC.DES_SPtrans-1f),global1 | |
1409 1: call .+8 | |
1410 add %o7,global1,global1 | |
1411 sub global1,.PIC.DES_SPtrans-.des_and,out2 | |
1412 | |
1413 ld [in0], in5 ! left | |
1414 add in3, 120, in4 ! ks3 | |
1415 | |
1416 ld [in0+4], out5 ! right | |
1417 mov in2, in3 ! ks2 | |
1418 | |
1419 ! parameter 6 1/2 for include encryption/decryption | |
1420 ! parameter 7 1 for mov in1 to in3 | |
1421 ! parameter 8 1 for mov in3 to in4 | |
1422 ! parameter 9 1 for load ks3 and ks2 to in4 and in3 | |
1423 | |
1424 ip_macro(in5, out5, out5, in5, in4, 2, 0, 0, 0) | |
1425 | |
1426 call .des_enc | |
1427 add in1, 120, in4 ! preload ks1 | |
1428 | |
1429 call .des_dec | |
1430 nop | |
1431 | |
1432 fp_macro(out5, in5, 1) | |
1433 | |
1434 ret | |
1435 restore | |
1436 | |
1437 .DES_decrypt3.end: | |
1438 .size DES_decrypt3,.DES_decrypt3.end-DES_decrypt3 | |
1439 | |
1440 ! void DES_ncbc_encrypt(input, output, length, schedule, ivec, enc) | |
1441 ! ***************************************************************** | |
1442 | |
1443 | |
1444 .align 32 | |
1445 .global DES_ncbc_encrypt | |
1446 .type DES_ncbc_encrypt,#function | |
1447 | |
1448 DES_ncbc_encrypt: | |
1449 | |
1450 save %sp, FRAME, %sp | |
1451 | |
1452 define({INPUT}, { [%sp+BIAS+ARG0+0*ARGSZ] }) | |
1453 define({OUTPUT}, { [%sp+BIAS+ARG0+1*ARGSZ] }) | |
1454 define({IVEC}, { [%sp+BIAS+ARG0+4*ARGSZ] }) | |
1455 | |
1456 sethi %hi(.PIC.DES_SPtrans-1f),global1 | |
1457 or global1,%lo(.PIC.DES_SPtrans-1f),global1 | |
1458 1: call .+8 | |
1459 add %o7,global1,global1 | |
1460 sub global1,.PIC.DES_SPtrans-.des_and,out2 | |
1461 | |
1462 cmp in5, 0 ! enc | |
1463 | |
1464 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1465 be,pn %icc, .ncbc.dec | |
1466 #else | |
1467 be .ncbc.dec | |
1468 #endif | |
1469 STPTR in4, IVEC | |
1470 | |
1471 ! addr left right temp label | |
1472 load_little_endian(in4, in5, out5, local3, .LLE1) ! iv | |
1473 | |
1474 addcc in2, -8, in2 ! bytes missing when first block done | |
1475 | |
1476 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1477 bl,pn %icc, .ncbc.enc.seven.or.less | |
1478 #else | |
1479 bl .ncbc.enc.seven.or.less | |
1480 #endif | |
1481 mov in3, in4 ! schedule | |
1482 | |
1483 .ncbc.enc.next.block: | |
1484 | |
1485 load_little_endian(in0, out4, global4, local3, .LLE2) ! block | |
1486 | |
1487 .ncbc.enc.next.block_1: | |
1488 | |
1489 xor in5, out4, in5 ! iv xor | |
1490 xor out5, global4, out5 ! iv xor | |
1491 | |
1492 ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 | |
1493 ip_macro(in5, out5, in5, out5, in3, 0, 0, 2) | |
1494 | |
1495 .ncbc.enc.next.block_2: | |
1496 | |
1497 !// call .des_enc ! compares in2 to 8 | |
1498 ! rounds inlined for alignment purposes | |
1499 | |
1500 add global1, 768, global4 ! address sbox 4 since register used b
elow | |
1501 | |
1502 rounds_macro(in5, out5, 1, .ncbc.enc.1, in3, in4) ! include encryption
ks in3 | |
1503 | |
1504 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1505 bl,pn %icc, .ncbc.enc.next.block_fp | |
1506 #else | |
1507 bl .ncbc.enc.next.block_fp | |
1508 #endif | |
1509 add in0, 8, in0 ! input address | |
1510 | |
1511 ! If 8 or more bytes are to be encrypted after this block, | |
1512 ! we combine final permutation for this block with initial | |
1513 ! permutation for next block. Load next block: | |
1514 | |
1515 load_little_endian(in0, global3, global4, local5, .LLE12) | |
1516 | |
1517 ! parameter 1 original left | |
1518 ! parameter 2 original right | |
1519 ! parameter 3 left ip | |
1520 ! parameter 4 right ip | |
1521 ! parameter 5 1: load ks1/ks2 to in3/in4, add 120 to in4 | |
1522 ! 2: mov in4 to in3 | |
1523 ! | |
1524 ! also adds -8 to length in2 and loads loop counter to out4 | |
1525 | |
1526 fp_ip_macro(out0, out1, global3, global4, 2) | |
1527 | |
1528 store_little_endian(in1, out0, out1, local3, .SLE10) ! block | |
1529 | |
1530 ld [in3], out0 ! key 7531 first round next block | |
1531 mov in5, local1 | |
1532 xor global3, out5, in5 ! iv xor next block | |
1533 | |
1534 ld [in3+4], out1 ! key 8642 | |
1535 add global1, 512, global3 ! address sbox 3 since register used | |
1536 xor global4, local1, out5 ! iv xor next block | |
1537 | |
1538 ba .ncbc.enc.next.block_2 | |
1539 add in1, 8, in1 ! output adress | |
1540 | |
1541 .ncbc.enc.next.block_fp: | |
1542 | |
1543 fp_macro(in5, out5) | |
1544 | |
1545 store_little_endian(in1, in5, out5, local3, .SLE1) ! block | |
1546 | |
1547 addcc in2, -8, in2 ! bytes missing when next block done | |
1548 | |
1549 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1550 bpos,pt %icc, .ncbc.enc.next.block ! also jumps if 0 | |
1551 #else | |
1552 bpos .ncbc.enc.next.block | |
1553 #endif | |
1554 add in1, 8, in1 | |
1555 | |
1556 .ncbc.enc.seven.or.less: | |
1557 | |
1558 cmp in2, -8 | |
1559 | |
1560 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1561 ble,pt %icc, .ncbc.enc.finish | |
1562 #else | |
1563 ble .ncbc.enc.finish | |
1564 #endif | |
1565 nop | |
1566 | |
1567 add in2, 8, local1 ! bytes to load | |
1568 | |
1569 ! addr, length, dest left, dest right, temp, temp2, label, ret label | |
1570 load_n_bytes(in0, local1, global4, out4, local2, local3, .LNB1, .ncbc.en
c.next.block_1) | |
1571 | |
1572 ! Loads 1 to 7 bytes little endian to global4, out4 | |
1573 | |
1574 | |
1575 .ncbc.enc.finish: | |
1576 | |
1577 LDPTR IVEC, local4 | |
1578 store_little_endian(local4, in5, out5, local5, .SLE2) ! ivec | |
1579 | |
1580 ret | |
1581 restore | |
1582 | |
1583 | |
1584 .ncbc.dec: | |
1585 | |
1586 STPTR in0, INPUT | |
1587 cmp in2, 0 ! length | |
1588 add in3, 120, in3 | |
1589 | |
1590 LDPTR IVEC, local7 ! ivec | |
1591 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1592 ble,pn %icc, .ncbc.dec.finish | |
1593 #else | |
1594 ble .ncbc.dec.finish | |
1595 #endif | |
1596 mov in3, in4 ! schedule | |
1597 | |
1598 STPTR in1, OUTPUT | |
1599 mov in0, local5 ! input | |
1600 | |
1601 load_little_endian(local7, in0, in1, local3, .LLE3) ! ivec | |
1602 | |
1603 .ncbc.dec.next.block: | |
1604 | |
1605 load_little_endian(local5, in5, out5, local3, .LLE4) ! block | |
1606 | |
1607 ! parameter 6 1/2 for include encryption/decryption | |
1608 ! parameter 7 1 for mov in1 to in3 | |
1609 ! parameter 8 1 for mov in3 to in4 | |
1610 | |
1611 ip_macro(in5, out5, out5, in5, in4, 2, 0, 1) ! include decryprion ks in
4 | |
1612 | |
1613 fp_macro(out5, in5, 0, 1) ! 1 for input and output address to local5/7 | |
1614 | |
1615 ! in2 is bytes left to be stored | |
1616 ! in2 is compared to 8 in the rounds | |
1617 | |
1618 xor out5, in0, out4 ! iv xor | |
1619 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1620 bl,pn %icc, .ncbc.dec.seven.or.less | |
1621 #else | |
1622 bl .ncbc.dec.seven.or.less | |
1623 #endif | |
1624 xor in5, in1, global4 ! iv xor | |
1625 | |
1626 ! Load ivec next block now, since input and output address might be the
same. | |
1627 | |
1628 load_little_endian_inc(local5, in0, in1, local3, .LLE5) ! iv | |
1629 | |
1630 store_little_endian(local7, out4, global4, local3, .SLE3) | |
1631 | |
1632 STPTR local5, INPUT | |
1633 add local7, 8, local7 | |
1634 addcc in2, -8, in2 | |
1635 | |
1636 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1637 bg,pt %icc, .ncbc.dec.next.block | |
1638 #else | |
1639 bg .ncbc.dec.next.block | |
1640 #endif | |
1641 STPTR local7, OUTPUT | |
1642 | |
1643 | |
1644 .ncbc.dec.store.iv: | |
1645 | |
1646 LDPTR IVEC, local4 ! ivec | |
1647 store_little_endian(local4, in0, in1, local5, .SLE4) | |
1648 | |
1649 .ncbc.dec.finish: | |
1650 | |
1651 ret | |
1652 restore | |
1653 | |
1654 .ncbc.dec.seven.or.less: | |
1655 | |
1656 load_little_endian_inc(local5, in0, in1, local3, .LLE13) ! ivec | |
1657 | |
1658 store_n_bytes(local7, in2, global4, out4, local3, local4, .SNB1, .ncbc.d
ec.store.iv) | |
1659 | |
1660 | |
1661 .DES_ncbc_encrypt.end: | |
1662 .size DES_ncbc_encrypt, .DES_ncbc_encrypt.end-DES_ncbc_encrypt | |
1663 | |
1664 | |
1665 ! void DES_ede3_cbc_encrypt(input, output, lenght, ks1, ks2, ks3, ivec, enc) | |
1666 ! ************************************************************************** | |
1667 | |
1668 | |
1669 .align 32 | |
1670 .global DES_ede3_cbc_encrypt | |
1671 .type DES_ede3_cbc_encrypt,#function | |
1672 | |
1673 DES_ede3_cbc_encrypt: | |
1674 | |
1675 save %sp, FRAME, %sp | |
1676 | |
1677 define({KS1}, { [%sp+BIAS+ARG0+3*ARGSZ] }) | |
1678 define({KS2}, { [%sp+BIAS+ARG0+4*ARGSZ] }) | |
1679 define({KS3}, { [%sp+BIAS+ARG0+5*ARGSZ] }) | |
1680 | |
1681 sethi %hi(.PIC.DES_SPtrans-1f),global1 | |
1682 or global1,%lo(.PIC.DES_SPtrans-1f),global1 | |
1683 1: call .+8 | |
1684 add %o7,global1,global1 | |
1685 sub global1,.PIC.DES_SPtrans-.des_and,out2 | |
1686 | |
1687 LDPTR [%fp+BIAS+ARG0+7*ARGSZ], local3 ! enc | |
1688 LDPTR [%fp+BIAS+ARG0+6*ARGSZ], local4 ! ivec | |
1689 cmp local3, 0 ! enc | |
1690 | |
1691 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1692 be,pn %icc, .ede3.dec | |
1693 #else | |
1694 be .ede3.dec | |
1695 #endif | |
1696 STPTR in4, KS2 | |
1697 | |
1698 STPTR in5, KS3 | |
1699 | |
1700 load_little_endian(local4, in5, out5, local3, .LLE6) ! ivec | |
1701 | |
1702 addcc in2, -8, in2 ! bytes missing after next block | |
1703 | |
1704 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1705 bl,pn %icc, .ede3.enc.seven.or.less | |
1706 #else | |
1707 bl .ede3.enc.seven.or.less | |
1708 #endif | |
1709 STPTR in3, KS1 | |
1710 | |
1711 .ede3.enc.next.block: | |
1712 | |
1713 load_little_endian(in0, out4, global4, local3, .LLE7) | |
1714 | |
1715 .ede3.enc.next.block_1: | |
1716 | |
1717 LDPTR KS2, in4 | |
1718 xor in5, out4, in5 ! iv xor | |
1719 xor out5, global4, out5 ! iv xor | |
1720 | |
1721 LDPTR KS1, in3 | |
1722 add in4, 120, in4 ! for decryption we use last subkey fi
rst | |
1723 nop | |
1724 | |
1725 ip_macro(in5, out5, in5, out5, in3) | |
1726 | |
1727 .ede3.enc.next.block_2: | |
1728 | |
1729 call .des_enc ! ks1 in3 | |
1730 nop | |
1731 | |
1732 call .des_dec ! ks2 in4 | |
1733 LDPTR KS3, in3 | |
1734 | |
1735 call .des_enc ! ks3 in3 compares in2 to 8 | |
1736 nop | |
1737 | |
1738 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1739 bl,pn %icc, .ede3.enc.next.block_fp | |
1740 #else | |
1741 bl .ede3.enc.next.block_fp | |
1742 #endif | |
1743 add in0, 8, in0 | |
1744 | |
1745 ! If 8 or more bytes are to be encrypted after this block, | |
1746 ! we combine final permutation for this block with initial | |
1747 ! permutation for next block. Load next block: | |
1748 | |
1749 load_little_endian(in0, global3, global4, local5, .LLE11) | |
1750 | |
1751 ! parameter 1 original left | |
1752 ! parameter 2 original right | |
1753 ! parameter 3 left ip | |
1754 ! parameter 4 right ip | |
1755 ! parameter 5 1: load ks1/ks2 to in3/in4, add 120 to in4 | |
1756 ! 2: mov in4 to in3 | |
1757 ! | |
1758 ! also adds -8 to length in2 and loads loop counter to out4 | |
1759 | |
1760 fp_ip_macro(out0, out1, global3, global4, 1) | |
1761 | |
1762 store_little_endian(in1, out0, out1, local3, .SLE9) ! block | |
1763 | |
1764 mov in5, local1 | |
1765 xor global3, out5, in5 ! iv xor next block | |
1766 | |
1767 ld [in3], out0 ! key 7531 | |
1768 add global1, 512, global3 ! address sbox 3 | |
1769 xor global4, local1, out5 ! iv xor next block | |
1770 | |
1771 ld [in3+4], out1 ! key 8642 | |
1772 add global1, 768, global4 ! address sbox 4 | |
1773 ba .ede3.enc.next.block_2 | |
1774 add in1, 8, in1 | |
1775 | |
1776 .ede3.enc.next.block_fp: | |
1777 | |
1778 fp_macro(in5, out5) | |
1779 | |
1780 store_little_endian(in1, in5, out5, local3, .SLE5) ! block | |
1781 | |
1782 addcc in2, -8, in2 ! bytes missing when next block done | |
1783 | |
1784 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1785 bpos,pt %icc, .ede3.enc.next.block | |
1786 #else | |
1787 bpos .ede3.enc.next.block | |
1788 #endif | |
1789 add in1, 8, in1 | |
1790 | |
1791 .ede3.enc.seven.or.less: | |
1792 | |
1793 cmp in2, -8 | |
1794 | |
1795 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1796 ble,pt %icc, .ede3.enc.finish | |
1797 #else | |
1798 ble .ede3.enc.finish | |
1799 #endif | |
1800 nop | |
1801 | |
1802 add in2, 8, local1 ! bytes to load | |
1803 | |
1804 ! addr, length, dest left, dest right, temp, temp2, label, ret label | |
1805 load_n_bytes(in0, local1, global4, out4, local2, local3, .LNB2, .ede3.en
c.next.block_1) | |
1806 | |
1807 .ede3.enc.finish: | |
1808 | |
1809 LDPTR [%fp+BIAS+ARG0+6*ARGSZ], local4 ! ivec | |
1810 store_little_endian(local4, in5, out5, local5, .SLE6) ! ivec | |
1811 | |
1812 ret | |
1813 restore | |
1814 | |
1815 .ede3.dec: | |
1816 | |
1817 STPTR in0, INPUT | |
1818 add in5, 120, in5 | |
1819 | |
1820 STPTR in1, OUTPUT | |
1821 mov in0, local5 | |
1822 add in3, 120, in3 | |
1823 | |
1824 STPTR in3, KS1 | |
1825 cmp in2, 0 | |
1826 | |
1827 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1828 ble %icc, .ede3.dec.finish | |
1829 #else | |
1830 ble .ede3.dec.finish | |
1831 #endif | |
1832 STPTR in5, KS3 | |
1833 | |
1834 LDPTR [%fp+BIAS+ARG0+6*ARGSZ], local7 ! iv | |
1835 load_little_endian(local7, in0, in1, local3, .LLE8) | |
1836 | |
1837 .ede3.dec.next.block: | |
1838 | |
1839 load_little_endian(local5, in5, out5, local3, .LLE9) | |
1840 | |
1841 ! parameter 6 1/2 for include encryption/decryption | |
1842 ! parameter 7 1 for mov in1 to in3 | |
1843 ! parameter 8 1 for mov in3 to in4 | |
1844 ! parameter 9 1 for load ks3 and ks2 to in4 and in3 | |
1845 | |
1846 ip_macro(in5, out5, out5, in5, in4, 2, 0, 0, 1) ! inc .des_dec ks3 in4 | |
1847 | |
1848 call .des_enc ! ks2 in3 | |
1849 LDPTR KS1, in4 | |
1850 | |
1851 call .des_dec ! ks1 in4 | |
1852 nop | |
1853 | |
1854 fp_macro(out5, in5, 0, 1) ! 1 for input and output address local5/7 | |
1855 | |
1856 ! in2 is bytes left to be stored | |
1857 ! in2 is compared to 8 in the rounds | |
1858 | |
1859 xor out5, in0, out4 | |
1860 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1861 bl,pn %icc, .ede3.dec.seven.or.less | |
1862 #else | |
1863 bl .ede3.dec.seven.or.less | |
1864 #endif | |
1865 xor in5, in1, global4 | |
1866 | |
1867 load_little_endian_inc(local5, in0, in1, local3, .LLE10) ! iv next blo
ck | |
1868 | |
1869 store_little_endian(local7, out4, global4, local3, .SLE7) ! block | |
1870 | |
1871 STPTR local5, INPUT | |
1872 addcc in2, -8, in2 | |
1873 add local7, 8, local7 | |
1874 | |
1875 #ifdef OPENSSL_SYSNAME_ULTRASPARC | |
1876 bg,pt %icc, .ede3.dec.next.block | |
1877 #else | |
1878 bg .ede3.dec.next.block | |
1879 #endif | |
1880 STPTR local7, OUTPUT | |
1881 | |
1882 .ede3.dec.store.iv: | |
1883 | |
1884 LDPTR [%fp+BIAS+ARG0+6*ARGSZ], local4 ! ivec | |
1885 store_little_endian(local4, in0, in1, local5, .SLE8) ! ivec | |
1886 | |
1887 .ede3.dec.finish: | |
1888 | |
1889 ret | |
1890 restore | |
1891 | |
1892 .ede3.dec.seven.or.less: | |
1893 | |
1894 load_little_endian_inc(local5, in0, in1, local3, .LLE14) ! iv | |
1895 | |
1896 store_n_bytes(local7, in2, global4, out4, local3, local4, .SNB2, .ede3.d
ec.store.iv) | |
1897 | |
1898 | |
1899 .DES_ede3_cbc_encrypt.end: | |
1900 .size DES_ede3_cbc_encrypt,.DES_ede3_cbc_encrypt.end-DES_ede3_cbc_enc
rypt | |
1901 | |
1902 .align 256 | |
1903 .type .des_and,#object | |
1904 .size .des_and,284 | |
1905 | |
1906 .des_and: | |
1907 | |
1908 ! This table is used for AND 0xFC when it is known that register | |
1909 ! bits 8-31 are zero. Makes it possible to do three arithmetic | |
1910 ! operations in one cycle. | |
1911 | |
1912 .byte 0, 0, 0, 0, 4, 4, 4, 4 | |
1913 .byte 8, 8, 8, 8, 12, 12, 12, 12 | |
1914 .byte 16, 16, 16, 16, 20, 20, 20, 20 | |
1915 .byte 24, 24, 24, 24, 28, 28, 28, 28 | |
1916 .byte 32, 32, 32, 32, 36, 36, 36, 36 | |
1917 .byte 40, 40, 40, 40, 44, 44, 44, 44 | |
1918 .byte 48, 48, 48, 48, 52, 52, 52, 52 | |
1919 .byte 56, 56, 56, 56, 60, 60, 60, 60 | |
1920 .byte 64, 64, 64, 64, 68, 68, 68, 68 | |
1921 .byte 72, 72, 72, 72, 76, 76, 76, 76 | |
1922 .byte 80, 80, 80, 80, 84, 84, 84, 84 | |
1923 .byte 88, 88, 88, 88, 92, 92, 92, 92 | |
1924 .byte 96, 96, 96, 96, 100, 100, 100, 100 | |
1925 .byte 104, 104, 104, 104, 108, 108, 108, 108 | |
1926 .byte 112, 112, 112, 112, 116, 116, 116, 116 | |
1927 .byte 120, 120, 120, 120, 124, 124, 124, 124 | |
1928 .byte 128, 128, 128, 128, 132, 132, 132, 132 | |
1929 .byte 136, 136, 136, 136, 140, 140, 140, 140 | |
1930 .byte 144, 144, 144, 144, 148, 148, 148, 148 | |
1931 .byte 152, 152, 152, 152, 156, 156, 156, 156 | |
1932 .byte 160, 160, 160, 160, 164, 164, 164, 164 | |
1933 .byte 168, 168, 168, 168, 172, 172, 172, 172 | |
1934 .byte 176, 176, 176, 176, 180, 180, 180, 180 | |
1935 .byte 184, 184, 184, 184, 188, 188, 188, 188 | |
1936 .byte 192, 192, 192, 192, 196, 196, 196, 196 | |
1937 .byte 200, 200, 200, 200, 204, 204, 204, 204 | |
1938 .byte 208, 208, 208, 208, 212, 212, 212, 212 | |
1939 .byte 216, 216, 216, 216, 220, 220, 220, 220 | |
1940 .byte 224, 224, 224, 224, 228, 228, 228, 228 | |
1941 .byte 232, 232, 232, 232, 236, 236, 236, 236 | |
1942 .byte 240, 240, 240, 240, 244, 244, 244, 244 | |
1943 .byte 248, 248, 248, 248, 252, 252, 252, 252 | |
1944 | |
1945 ! 5 numbers for initil/final permutation | |
1946 | |
1947 .word 0x0f0f0f0f ! offset 256 | |
1948 .word 0x0000ffff ! 260 | |
1949 .word 0x33333333 ! 264 | |
1950 .word 0x00ff00ff ! 268 | |
1951 .word 0x55555555 ! 272 | |
1952 | |
1953 .word 0 ! 276 | |
1954 .word LOOPS ! 280 | |
1955 .word 0x0000FC00 ! 284 | |
1956 | |
1957 .global DES_SPtrans | |
1958 .type DES_SPtrans,#object | |
1959 .size DES_SPtrans,2048 | |
1960 .align 64 | |
1961 DES_SPtrans: | |
1962 .PIC.DES_SPtrans: | |
1963 ! nibble 0 | |
1964 .word 0x02080800, 0x00080000, 0x02000002, 0x02080802 | |
1965 .word 0x02000000, 0x00080802, 0x00080002, 0x02000002 | |
1966 .word 0x00080802, 0x02080800, 0x02080000, 0x00000802 | |
1967 .word 0x02000802, 0x02000000, 0x00000000, 0x00080002 | |
1968 .word 0x00080000, 0x00000002, 0x02000800, 0x00080800 | |
1969 .word 0x02080802, 0x02080000, 0x00000802, 0x02000800 | |
1970 .word 0x00000002, 0x00000800, 0x00080800, 0x02080002 | |
1971 .word 0x00000800, 0x02000802, 0x02080002, 0x00000000 | |
1972 .word 0x00000000, 0x02080802, 0x02000800, 0x00080002 | |
1973 .word 0x02080800, 0x00080000, 0x00000802, 0x02000800 | |
1974 .word 0x02080002, 0x00000800, 0x00080800, 0x02000002 | |
1975 .word 0x00080802, 0x00000002, 0x02000002, 0x02080000 | |
1976 .word 0x02080802, 0x00080800, 0x02080000, 0x02000802 | |
1977 .word 0x02000000, 0x00000802, 0x00080002, 0x00000000 | |
1978 .word 0x00080000, 0x02000000, 0x02000802, 0x02080800 | |
1979 .word 0x00000002, 0x02080002, 0x00000800, 0x00080802 | |
1980 ! nibble 1 | |
1981 .word 0x40108010, 0x00000000, 0x00108000, 0x40100000 | |
1982 .word 0x40000010, 0x00008010, 0x40008000, 0x00108000 | |
1983 .word 0x00008000, 0x40100010, 0x00000010, 0x40008000 | |
1984 .word 0x00100010, 0x40108000, 0x40100000, 0x00000010 | |
1985 .word 0x00100000, 0x40008010, 0x40100010, 0x00008000 | |
1986 .word 0x00108010, 0x40000000, 0x00000000, 0x00100010 | |
1987 .word 0x40008010, 0x00108010, 0x40108000, 0x40000010 | |
1988 .word 0x40000000, 0x00100000, 0x00008010, 0x40108010 | |
1989 .word 0x00100010, 0x40108000, 0x40008000, 0x00108010 | |
1990 .word 0x40108010, 0x00100010, 0x40000010, 0x00000000 | |
1991 .word 0x40000000, 0x00008010, 0x00100000, 0x40100010 | |
1992 .word 0x00008000, 0x40000000, 0x00108010, 0x40008010 | |
1993 .word 0x40108000, 0x00008000, 0x00000000, 0x40000010 | |
1994 .word 0x00000010, 0x40108010, 0x00108000, 0x40100000 | |
1995 .word 0x40100010, 0x00100000, 0x00008010, 0x40008000 | |
1996 .word 0x40008010, 0x00000010, 0x40100000, 0x00108000 | |
1997 ! nibble 2 | |
1998 .word 0x04000001, 0x04040100, 0x00000100, 0x04000101 | |
1999 .word 0x00040001, 0x04000000, 0x04000101, 0x00040100 | |
2000 .word 0x04000100, 0x00040000, 0x04040000, 0x00000001 | |
2001 .word 0x04040101, 0x00000101, 0x00000001, 0x04040001 | |
2002 .word 0x00000000, 0x00040001, 0x04040100, 0x00000100 | |
2003 .word 0x00000101, 0x04040101, 0x00040000, 0x04000001 | |
2004 .word 0x04040001, 0x04000100, 0x00040101, 0x04040000 | |
2005 .word 0x00040100, 0x00000000, 0x04000000, 0x00040101 | |
2006 .word 0x04040100, 0x00000100, 0x00000001, 0x00040000 | |
2007 .word 0x00000101, 0x00040001, 0x04040000, 0x04000101 | |
2008 .word 0x00000000, 0x04040100, 0x00040100, 0x04040001 | |
2009 .word 0x00040001, 0x04000000, 0x04040101, 0x00000001 | |
2010 .word 0x00040101, 0x04000001, 0x04000000, 0x04040101 | |
2011 .word 0x00040000, 0x04000100, 0x04000101, 0x00040100 | |
2012 .word 0x04000100, 0x00000000, 0x04040001, 0x00000101 | |
2013 .word 0x04000001, 0x00040101, 0x00000100, 0x04040000 | |
2014 ! nibble 3 | |
2015 .word 0x00401008, 0x10001000, 0x00000008, 0x10401008 | |
2016 .word 0x00000000, 0x10400000, 0x10001008, 0x00400008 | |
2017 .word 0x10401000, 0x10000008, 0x10000000, 0x00001008 | |
2018 .word 0x10000008, 0x00401008, 0x00400000, 0x10000000 | |
2019 .word 0x10400008, 0x00401000, 0x00001000, 0x00000008 | |
2020 .word 0x00401000, 0x10001008, 0x10400000, 0x00001000 | |
2021 .word 0x00001008, 0x00000000, 0x00400008, 0x10401000 | |
2022 .word 0x10001000, 0x10400008, 0x10401008, 0x00400000 | |
2023 .word 0x10400008, 0x00001008, 0x00400000, 0x10000008 | |
2024 .word 0x00401000, 0x10001000, 0x00000008, 0x10400000 | |
2025 .word 0x10001008, 0x00000000, 0x00001000, 0x00400008 | |
2026 .word 0x00000000, 0x10400008, 0x10401000, 0x00001000 | |
2027 .word 0x10000000, 0x10401008, 0x00401008, 0x00400000 | |
2028 .word 0x10401008, 0x00000008, 0x10001000, 0x00401008 | |
2029 .word 0x00400008, 0x00401000, 0x10400000, 0x10001008 | |
2030 .word 0x00001008, 0x10000000, 0x10000008, 0x10401000 | |
2031 ! nibble 4 | |
2032 .word 0x08000000, 0x00010000, 0x00000400, 0x08010420 | |
2033 .word 0x08010020, 0x08000400, 0x00010420, 0x08010000 | |
2034 .word 0x00010000, 0x00000020, 0x08000020, 0x00010400 | |
2035 .word 0x08000420, 0x08010020, 0x08010400, 0x00000000 | |
2036 .word 0x00010400, 0x08000000, 0x00010020, 0x00000420 | |
2037 .word 0x08000400, 0x00010420, 0x00000000, 0x08000020 | |
2038 .word 0x00000020, 0x08000420, 0x08010420, 0x00010020 | |
2039 .word 0x08010000, 0x00000400, 0x00000420, 0x08010400 | |
2040 .word 0x08010400, 0x08000420, 0x00010020, 0x08010000 | |
2041 .word 0x00010000, 0x00000020, 0x08000020, 0x08000400 | |
2042 .word 0x08000000, 0x00010400, 0x08010420, 0x00000000 | |
2043 .word 0x00010420, 0x08000000, 0x00000400, 0x00010020 | |
2044 .word 0x08000420, 0x00000400, 0x00000000, 0x08010420 | |
2045 .word 0x08010020, 0x08010400, 0x00000420, 0x00010000 | |
2046 .word 0x00010400, 0x08010020, 0x08000400, 0x00000420 | |
2047 .word 0x00000020, 0x00010420, 0x08010000, 0x08000020 | |
2048 ! nibble 5 | |
2049 .word 0x80000040, 0x00200040, 0x00000000, 0x80202000 | |
2050 .word 0x00200040, 0x00002000, 0x80002040, 0x00200000 | |
2051 .word 0x00002040, 0x80202040, 0x00202000, 0x80000000 | |
2052 .word 0x80002000, 0x80000040, 0x80200000, 0x00202040 | |
2053 .word 0x00200000, 0x80002040, 0x80200040, 0x00000000 | |
2054 .word 0x00002000, 0x00000040, 0x80202000, 0x80200040 | |
2055 .word 0x80202040, 0x80200000, 0x80000000, 0x00002040 | |
2056 .word 0x00000040, 0x00202000, 0x00202040, 0x80002000 | |
2057 .word 0x00002040, 0x80000000, 0x80002000, 0x00202040 | |
2058 .word 0x80202000, 0x00200040, 0x00000000, 0x80002000 | |
2059 .word 0x80000000, 0x00002000, 0x80200040, 0x00200000 | |
2060 .word 0x00200040, 0x80202040, 0x00202000, 0x00000040 | |
2061 .word 0x80202040, 0x00202000, 0x00200000, 0x80002040 | |
2062 .word 0x80000040, 0x80200000, 0x00202040, 0x00000000 | |
2063 .word 0x00002000, 0x80000040, 0x80002040, 0x80202000 | |
2064 .word 0x80200000, 0x00002040, 0x00000040, 0x80200040 | |
2065 ! nibble 6 | |
2066 .word 0x00004000, 0x00000200, 0x01000200, 0x01000004 | |
2067 .word 0x01004204, 0x00004004, 0x00004200, 0x00000000 | |
2068 .word 0x01000000, 0x01000204, 0x00000204, 0x01004000 | |
2069 .word 0x00000004, 0x01004200, 0x01004000, 0x00000204 | |
2070 .word 0x01000204, 0x00004000, 0x00004004, 0x01004204 | |
2071 .word 0x00000000, 0x01000200, 0x01000004, 0x00004200 | |
2072 .word 0x01004004, 0x00004204, 0x01004200, 0x00000004 | |
2073 .word 0x00004204, 0x01004004, 0x00000200, 0x01000000 | |
2074 .word 0x00004204, 0x01004000, 0x01004004, 0x00000204 | |
2075 .word 0x00004000, 0x00000200, 0x01000000, 0x01004004 | |
2076 .word 0x01000204, 0x00004204, 0x00004200, 0x00000000 | |
2077 .word 0x00000200, 0x01000004, 0x00000004, 0x01000200 | |
2078 .word 0x00000000, 0x01000204, 0x01000200, 0x00004200 | |
2079 .word 0x00000204, 0x00004000, 0x01004204, 0x01000000 | |
2080 .word 0x01004200, 0x00000004, 0x00004004, 0x01004204 | |
2081 .word 0x01000004, 0x01004200, 0x01004000, 0x00004004 | |
2082 ! nibble 7 | |
2083 .word 0x20800080, 0x20820000, 0x00020080, 0x00000000 | |
2084 .word 0x20020000, 0x00800080, 0x20800000, 0x20820080 | |
2085 .word 0x00000080, 0x20000000, 0x00820000, 0x00020080 | |
2086 .word 0x00820080, 0x20020080, 0x20000080, 0x20800000 | |
2087 .word 0x00020000, 0x00820080, 0x00800080, 0x20020000 | |
2088 .word 0x20820080, 0x20000080, 0x00000000, 0x00820000 | |
2089 .word 0x20000000, 0x00800000, 0x20020080, 0x20800080 | |
2090 .word 0x00800000, 0x00020000, 0x20820000, 0x00000080 | |
2091 .word 0x00800000, 0x00020000, 0x20000080, 0x20820080 | |
2092 .word 0x00020080, 0x20000000, 0x00000000, 0x00820000 | |
2093 .word 0x20800080, 0x20020080, 0x20020000, 0x00800080 | |
2094 .word 0x20820000, 0x00000080, 0x00800080, 0x20020000 | |
2095 .word 0x20820080, 0x00800000, 0x20800000, 0x20000080 | |
2096 .word 0x00820000, 0x00020080, 0x20020080, 0x20800000 | |
2097 .word 0x00000080, 0x20820000, 0x00820080, 0x00000000 | |
2098 .word 0x20000000, 0x20800080, 0x00020000, 0x00820080 | |
2099 | |
OLD | NEW |