1! Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved.
2!
3! Licensed under the Apache License 2.0 (the "License").  You may not use
4! this file except in compliance with the License.  You can obtain a copy
5! in the file LICENSE in the source distribution or at
6! https://www.openssl.org/source/license.html
7!
8!  To expand the m4 macros: m4 -B 8192 des_enc.m4 > des_enc.S
9!
10!  Global registers 1 to 5 are used. This is the same as done by the
11!  cc compiler. The UltraSPARC load/store little endian feature is used.
12!
13!  Instruction grouping often refers to one CPU cycle.
14!
15!  Assemble through gcc: gcc -c -mcpu=ultrasparc -o des_enc.o des_enc.S
16!
17!  Assemble through cc:  cc -c -xarch=v8plusa -o des_enc.o des_enc.S
18!
19!  Performance improvement according to './apps/openssl speed des'
20!
21!         32-bit build:
22!                   23%  faster than cc-5.2 -xarch=v8plus -xO5
23!                   115% faster than gcc-3.2.1 -m32 -mcpu=ultrasparc -O5
24!         64-bit build:
25!                   50%  faster than cc-5.2 -xarch=v9 -xO5
26!                   100% faster than gcc-3.2.1 -m64 -mcpu=ultrasparc -O5
27!
28
29.ident "des_enc.m4 2.1"
30.file  "des_enc-sparc.S"
31
32#if defined(__SUNPRO_C) && defined(__sparcv9)
33# define ABI64  /* They've said -xarch=v9 at command line */
34#elif defined(__GNUC__) && defined(__arch64__)
35# define ABI64  /* They've said -m64 at command line */
36#endif
37
38#ifdef ABI64
39  .register         %g2,#scratch
40  .register         %g3,#scratch
41# define  FRAME     -192
42# define  BIAS      2047
43# define  LDPTR     ldx
44# define  STPTR     stx
45# define  ARG0      128
46# define  ARGSZ     8
47#else
48# define  FRAME     -96
49# define  BIAS      0
50# define  LDPTR     ld
51# define  STPTR     st
52# define  ARG0      68
53# define  ARGSZ     4
54#endif
55
56#define LOOPS 7
57
58#define global0 %g0
59#define global1 %g1
60#define global2 %g2
61#define global3 %g3
62#define global4 %g4
63#define global5 %g5
64
65#define local0 %l0
66#define local1 %l1
67#define local2 %l2
68#define local3 %l3
69#define local4 %l4
70#define local5 %l5
71#define local7 %l6
72#define local6 %l7
73
74#define in0 %i0
75#define in1 %i1
76#define in2 %i2
77#define in3 %i3
78#define in4 %i4
79#define in5 %i5
80#define in6 %i6
81#define in7 %i7
82
83#define out0 %o0
84#define out1 %o1
85#define out2 %o2
86#define out3 %o3
87#define out4 %o4
88#define out5 %o5
89#define out6 %o6
90#define out7 %o7
91
92#define stub stb
93
94
95
96
97! Macro definitions:
98
99
100! ip_macro
101!
102! The logic used in initial and final permutations is the same as in
103! the C code. The permutations are done with a clever , xor, and
104! technique.
105!
106! The macro also loads address sbox 1 to 5 to global 1 to 5, address
107! sbox 6 to local6, and address sbox 8 to out3.
108!
109! Rotates the halves 3 left to bring the sbox bits in convenient positions.
110!
111! Loads key first round from address in parameter 5 to out0, out1.
112!
113! After the original LibDES initial permutation, the resulting left
114! is in the variable initially used for right and vice versa. The macro
115! implements the possibility to keep the halves in the original registers.
116!
117! parameter 1  left
118! parameter 2  right
119! parameter 3  result left (modify in first round)
120! parameter 4  result right (use in first round)
121! parameter 5  key address
122! parameter 6  1/2 for include encryption/decryption
123! parameter 7  1 for move in1 to in3
124! parameter 8  1 for move in3 to in4, 2 for move in4 to in3
125! parameter 9  1 for load ks3 and ks2 to in4 and in3
126
127
128
129
130! rounds_macro
131!
132! The logic used in the DES rounds is the same as in the C code,
133! except that calculations for sbox 1 and sbox 5 begin before
134! the previous round is finished.
135!
136! In each round one half (work) is modified based on key and the
137! other half (use).
138!
139! In this version we do two rounds in a loop repeated 7 times
140! and two rounds separately.
141!
142! One half has the bits for the sboxes in the following positions:
143!
144!         777777xx555555xx333333xx111111xx
145!
146!         88xx666666xx444444xx222222xx8888
147!
148! The bits for each sbox are xor-ed with the key bits for that box.
149! The above xx bits are cleared, and the result used for lookup in
150! the sbox table. Each sbox entry contains the 4 output bits permuted
151! into 32 bits according to the P permutation.
152!
153! In the description of DES, left and right are switched after
154! each round, except after last round. In this code the original
155! left and right are kept in the same register in all rounds, meaning
156! that after the 16 rounds the result for right is in the register
157! originally used for left.
158!
159! parameter 1  first work (left in first round)
160! parameter 2  first use (right in first round)
161! parameter 3  enc/dec  1/-1
162! parameter 4  loop label
163! parameter 5  key address register
164! parameter 6  optional address for key next encryption/decryption
165! parameter 7  not empty for include retl
166!
167! also compares in2 to 8
168
169
170
171
172! fp_macro
173!
174!  parameter 1   right (original left)
175!  parameter 2   left (original right)
176!  parameter 3   1 for optional store to [in0]
177!  parameter 4   1 for load input/output address to local5/7
178!
179!  The final permutation logic switches the halves, meaning that
180!  left and right ends up the registers originally used.
181
182
183
184
185! fp_ip_macro
186!
187! Does initial permutation for next block mixed with
188! final permutation for current block.
189!
190! parameter 1   original left
191! parameter 2   original right
192! parameter 3   left ip
193! parameter 4   right ip
194! parameter 5   1: load ks1/ks2 to in3/in4, add 120 to in4
195!                2: mov in4 to in3
196!
197! also adds -8 to length in2 and loads loop counter to out4
198
199
200
201
202
203! load_little_endian
204!
205! parameter 1  address
206! parameter 2  destination left
207! parameter 3  destination right
208! parameter 4  temporary
209! parameter 5  label
210
211
212
213
214! load_little_endian_inc
215!
216! parameter 1  address
217! parameter 2  destination left
218! parameter 3  destination right
219! parameter 4  temporary
220! parameter 4  label
221!
222! adds 8 to address
223
224
225
226
227! load_n_bytes
228!
229! Loads 1 to 7 bytes little endian
230! Remaining bytes are zeroed.
231!
232! parameter 1  address
233! parameter 2  length
234! parameter 3  destination register left
235! parameter 4  destination register right
236! parameter 5  temp
237! parameter 6  temp2
238! parameter 7  label
239! parameter 8  return label
240
241
242
243
244! store_little_endian
245!
246! parameter 1  address
247! parameter 2  source left
248! parameter 3  source right
249! parameter 4  temporary
250
251
252
253
254! store_n_bytes
255!
256! Stores 1 to 7 bytes little endian
257!
258! parameter 1  address
259! parameter 2  length
260! parameter 3  source register left
261! parameter 4  source register right
262! parameter 5  temp
263! parameter 6  temp2
264! parameter 7  label
265! parameter 8  return label
266
267
268
269
270
271
272
273
274.section  ".text"
275
276          .align 32
277
278.des_enc:
279
280          ! key address in3
281          ! loads key next encryption/decryption first round from [in4]
282
283
284
285! rounds_macro
286! in5 out5 1 .des_enc.1 in3 in4 retl
287
288          xor       out5, out0, local1
289
290          ld        [out2+284], local5        ! 0x0000FC00
291          ba        .des_enc.1
292          and       local1, 252, local1
293
294          .align 32
295
296.des_enc.1:
297          ! local6 is address sbox 6
298          ! out3   is address sbox 8
299          ! out4   is loop counter
300
301          ld        [global1+local1], local1
302          xor       out5, out1, out1            ! 8642
303          xor       out5, out0, out0            ! 7531
304          ! fmovs   %f0, %f0                  ! fxor used for alignment
305
306          srl       out1, 4, local0           ! rotate 4 right
307          and       out0, local5, local3      ! 3
308          ! fmovs   %f0, %f0
309
310          ld        [in3+1*8], local7         ! key 7531 next round
311          srl       local3, 8, local3         ! 3
312          and       local0, 252, local2       ! 2
313          ! fmovs   %f0, %f0
314
315          ld        [global3+local3],local3   ! 3
316          sll       out1, 28, out1            ! rotate
317          xor       in5, local1, in5            ! 1 finished, local1 now sbox 7
318
319          ld        [global2+local2], local2  ! 2
320          srl       out0, 24, local1          ! 7
321          or        out1, local0, out1        ! rotate
322
323          ldub      [out2+local1], local1     ! 7 (and 0xFC)
324          srl       out1, 24, local0          ! 8
325          and       out1, local5, local4      ! 4
326
327          ldub      [out2+local0], local0     ! 8 (and 0xFC)
328          srl       local4, 8, local4         ! 4
329          xor       in5, local2, in5            ! 2 finished local2 now sbox 6
330
331          ld        [global4+local4],local4   ! 4
332          srl       out1, 16, local2          ! 6
333          xor       in5, local3, in5            ! 3 finished local3 now sbox 5
334
335          ld        [out3+local0],local0      ! 8
336          and       local2, 252, local2       ! 6
337          add       global1, 1536, local5     ! address sbox 7
338
339          ld        [local6+local2], local2   ! 6
340          srl       out0, 16, local3          ! 5
341          xor       in5, local4, in5            ! 4 finished
342
343          ld        [local5+local1],local1    ! 7
344          and       local3, 252, local3       ! 5
345          xor       in5, local0, in5            ! 8 finished
346
347          ld        [global5+local3],local3   ! 5
348          xor       in5, local2, in5            ! 6 finished
349          subcc     out4, 1, out4
350
351          ld        [in3+1*8+4], out0         ! key 8642 next round
352          xor       in5, local7, local2        ! sbox 5 next round
353          xor       in5, local1, in5            ! 7 finished
354
355          srl       local2, 16, local2        ! sbox 5 next round
356          xor       in5, local3, in5            ! 5 finished
357
358          ld        [in3+1*16+4], out1        ! key 8642 next round again
359          and       local2, 252, local2       ! sbox5 next round
360! next round
361          xor       in5, local7, local7        ! 7531
362
363          ld        [global5+local2], local2  ! 5
364          srl       local7, 24, local3        ! 7
365          xor       in5, out0, out0            ! 8642
366
367          ldub      [out2+local3], local3     ! 7 (and 0xFC)
368          srl       out0, 4, local0           ! rotate 4 right
369          and       local7, 252, local1       ! 1
370
371          sll       out0, 28, out0            ! rotate
372          xor       out5, local2, out5            ! 5 finished local2 used
373
374          srl       local0, 8, local4         ! 4
375          and       local0, 252, local2       ! 2
376          ld        [local5+local3], local3   ! 7
377
378          srl       local0, 16, local5        ! 6
379          or        out0, local0, out0        ! rotate
380          ld        [global2+local2], local2  ! 2
381
382          srl       out0, 24, local0
383          ld        [in3+1*16], out0          ! key 7531 next round
384          and       local4, 252, local4   ! 4
385
386          and       local5, 252, local5       ! 6
387          ld        [global4+local4], local4  ! 4
388          xor       out5, local3, out5            ! 7 finished local3 used
389
390          and       local0, 252, local0       ! 8
391          ld        [local6+local5], local5   ! 6
392          xor       out5, local2, out5            ! 2 finished local2 now sbox 3
393
394          srl       local7, 8, local2         ! 3 start
395          ld        [out3+local0], local0     ! 8
396          xor       out5, local4, out5            ! 4 finished
397
398          and       local2, 252, local2       ! 3
399          ld        [global1+local1], local1  ! 1
400          xor       out5, local5, out5            ! 6 finished local5 used
401
402          ld        [global3+local2], local2  ! 3
403          xor       out5, local0, out5            ! 8 finished
404          add       in3, 1*16, in3             ! enc add 8, dec add -8 to key pointer
405
406          ld        [out2+284], local5        ! 0x0000FC00
407          xor       out5, out0, local4          ! sbox 1 next round
408          xor       out5, local1, out5            ! 1 finished
409
410          xor       out5, local2, out5            ! 3 finished
411          bne       .des_enc.1
412          and       local4, 252, local1       ! sbox 1 next round
413
414! two rounds more:
415
416          ld        [global1+local1], local1
417          xor       out5, out1, out1
418          xor       out5, out0, out0
419
420          srl       out1, 4, local0           ! rotate
421          and       out0, local5, local3
422
423          ld        [in3+1*8], local7         ! key 7531
424          srl       local3, 8, local3
425          and       local0, 252, local2
426
427          ld        [global3+local3],local3
428          sll       out1, 28, out1            ! rotate
429          xor       in5, local1, in5            ! 1 finished, local1 now sbox 7
430
431          ld        [global2+local2], local2
432          srl       out0, 24, local1
433          or        out1, local0, out1        ! rotate
434
435          ldub      [out2+local1], local1
436          srl       out1, 24, local0
437          and       out1, local5, local4
438
439          ldub      [out2+local0], local0
440          srl       local4, 8, local4
441          xor       in5, local2, in5            ! 2 finished local2 now sbox 6
442
443          ld        [global4+local4],local4
444          srl       out1, 16, local2
445          xor       in5, local3, in5            ! 3 finished local3 now sbox 5
446
447          ld        [out3+local0],local0
448          and       local2, 252, local2
449          add       global1, 1536, local5     ! address sbox 7
450
451          ld        [local6+local2], local2
452          srl       out0, 16, local3
453          xor       in5, local4, in5            ! 4 finished
454
455          ld        [local5+local1],local1
456          and       local3, 252, local3
457          xor       in5, local0, in5
458
459          ld        [global5+local3],local3
460          xor       in5, local2, in5            ! 6 finished
461          cmp       in2, 8
462
463          ld        [out2+280], out4  ! loop counter
464          xor       in5, local7, local2        ! sbox 5 next round
465          xor       in5, local1, in5            ! 7 finished
466
467          ld        [in3+1*8+4], out0
468          srl       local2, 16, local2        ! sbox 5 next round
469          xor       in5, local3, in5            ! 5 finished
470
471          and       local2, 252, local2
472! next round (two rounds more)
473          xor       in5, local7, local7        ! 7531
474
475          ld        [global5+local2], local2
476          srl       local7, 24, local3
477          xor       in5, out0, out0            ! 8642
478
479          ldub      [out2+local3], local3
480          srl       out0, 4, local0           ! rotate
481          and       local7, 252, local1
482
483          sll       out0, 28, out0            ! rotate
484          xor       out5, local2, out5            ! 5 finished local2 used
485
486          srl       local0, 8, local4
487          and       local0, 252, local2
488          ld        [local5+local3], local3
489
490          srl       local0, 16, local5
491          or        out0, local0, out0        ! rotate
492          ld        [global2+local2], local2
493
494          srl       out0, 24, local0
495          ld        [in4], out0   ! key next encryption/decryption
496          and       local4, 252, local4
497
498          and       local5, 252, local5
499          ld        [global4+local4], local4
500          xor       out5, local3, out5            ! 7 finished local3 used
501
502          and       local0, 252, local0
503          ld        [local6+local5], local5
504          xor       out5, local2, out5            ! 2 finished local2 now sbox 3
505
506          srl       local7, 8, local2         ! 3 start
507          ld        [out3+local0], local0
508          xor       out5, local4, out5
509
510          and       local2, 252, local2
511          ld        [global1+local1], local1
512          xor       out5, local5, out5            ! 6 finished local5 used
513
514          ld        [global3+local2], local2
515          srl       in5, 3, local3
516          xor       out5, local0, out5
517
518          ld        [in4+4], out1 ! key next encryption/decryption
519          sll       in5, 29, local4
520          xor       out5, local1, out5
521
522          retl
523          xor       out5, local2, out5
524
525
526
527          .align 32
528
529.des_dec:
530
531          ! implemented with out5 as first parameter to avoid
532          ! register exchange in ede modes
533
534          ! key address in4
535          ! loads key next encryption/decryption first round from [in3]
536
537
538
539! rounds_macro
540! out5 in5 -1 .des_dec.1 in4 in3 retl
541
542          xor       in5, out0, local1
543
544          ld        [out2+284], local5        ! 0x0000FC00
545          ba        .des_dec.1
546          and       local1, 252, local1
547
548          .align 32
549
550.des_dec.1:
551          ! local6 is address sbox 6
552          ! out3   is address sbox 8
553          ! out4   is loop counter
554
555          ld        [global1+local1], local1
556          xor       in5, out1, out1            ! 8642
557          xor       in5, out0, out0            ! 7531
558          ! fmovs   %f0, %f0                  ! fxor used for alignment
559
560          srl       out1, 4, local0           ! rotate 4 right
561          and       out0, local5, local3      ! 3
562          ! fmovs   %f0, %f0
563
564          ld        [in4+-1*8], local7         ! key 7531 next round
565          srl       local3, 8, local3         ! 3
566          and       local0, 252, local2       ! 2
567          ! fmovs   %f0, %f0
568
569          ld        [global3+local3],local3   ! 3
570          sll       out1, 28, out1            ! rotate
571          xor       out5, local1, out5            ! 1 finished, local1 now sbox 7
572
573          ld        [global2+local2], local2  ! 2
574          srl       out0, 24, local1          ! 7
575          or        out1, local0, out1        ! rotate
576
577          ldub      [out2+local1], local1     ! 7 (and 0xFC)
578          srl       out1, 24, local0          ! 8
579          and       out1, local5, local4      ! 4
580
581          ldub      [out2+local0], local0     ! 8 (and 0xFC)
582          srl       local4, 8, local4         ! 4
583          xor       out5, local2, out5            ! 2 finished local2 now sbox 6
584
585          ld        [global4+local4],local4   ! 4
586          srl       out1, 16, local2          ! 6
587          xor       out5, local3, out5            ! 3 finished local3 now sbox 5
588
589          ld        [out3+local0],local0      ! 8
590          and       local2, 252, local2       ! 6
591          add       global1, 1536, local5     ! address sbox 7
592
593          ld        [local6+local2], local2   ! 6
594          srl       out0, 16, local3          ! 5
595          xor       out5, local4, out5            ! 4 finished
596
597          ld        [local5+local1],local1    ! 7
598          and       local3, 252, local3       ! 5
599          xor       out5, local0, out5            ! 8 finished
600
601          ld        [global5+local3],local3   ! 5
602          xor       out5, local2, out5            ! 6 finished
603          subcc     out4, 1, out4
604
605          ld        [in4+-1*8+4], out0         ! key 8642 next round
606          xor       out5, local7, local2        ! sbox 5 next round
607          xor       out5, local1, out5            ! 7 finished
608
609          srl       local2, 16, local2        ! sbox 5 next round
610          xor       out5, local3, out5            ! 5 finished
611
612          ld        [in4+-1*16+4], out1        ! key 8642 next round again
613          and       local2, 252, local2       ! sbox5 next round
614! next round
615          xor       out5, local7, local7        ! 7531
616
617          ld        [global5+local2], local2  ! 5
618          srl       local7, 24, local3        ! 7
619          xor       out5, out0, out0            ! 8642
620
621          ldub      [out2+local3], local3     ! 7 (and 0xFC)
622          srl       out0, 4, local0           ! rotate 4 right
623          and       local7, 252, local1       ! 1
624
625          sll       out0, 28, out0            ! rotate
626          xor       in5, local2, in5            ! 5 finished local2 used
627
628          srl       local0, 8, local4         ! 4
629          and       local0, 252, local2       ! 2
630          ld        [local5+local3], local3   ! 7
631
632          srl       local0, 16, local5        ! 6
633          or        out0, local0, out0        ! rotate
634          ld        [global2+local2], local2  ! 2
635
636          srl       out0, 24, local0
637          ld        [in4+-1*16], out0          ! key 7531 next round
638          and       local4, 252, local4   ! 4
639
640          and       local5, 252, local5       ! 6
641          ld        [global4+local4], local4  ! 4
642          xor       in5, local3, in5            ! 7 finished local3 used
643
644          and       local0, 252, local0       ! 8
645          ld        [local6+local5], local5   ! 6
646          xor       in5, local2, in5            ! 2 finished local2 now sbox 3
647
648          srl       local7, 8, local2         ! 3 start
649          ld        [out3+local0], local0     ! 8
650          xor       in5, local4, in5            ! 4 finished
651
652          and       local2, 252, local2       ! 3
653          ld        [global1+local1], local1  ! 1
654          xor       in5, local5, in5            ! 6 finished local5 used
655
656          ld        [global3+local2], local2  ! 3
657          xor       in5, local0, in5            ! 8 finished
658          add       in4, -1*16, in4             ! enc add 8, dec add -8 to key pointer
659
660          ld        [out2+284], local5        ! 0x0000FC00
661          xor       in5, out0, local4          ! sbox 1 next round
662          xor       in5, local1, in5            ! 1 finished
663
664          xor       in5, local2, in5            ! 3 finished
665          bne       .des_dec.1
666          and       local4, 252, local1       ! sbox 1 next round
667
668! two rounds more:
669
670          ld        [global1+local1], local1
671          xor       in5, out1, out1
672          xor       in5, out0, out0
673
674          srl       out1, 4, local0           ! rotate
675          and       out0, local5, local3
676
677          ld        [in4+-1*8], local7         ! key 7531
678          srl       local3, 8, local3
679          and       local0, 252, local2
680
681          ld        [global3+local3],local3
682          sll       out1, 28, out1            ! rotate
683          xor       out5, local1, out5            ! 1 finished, local1 now sbox 7
684
685          ld        [global2+local2], local2
686          srl       out0, 24, local1
687          or        out1, local0, out1        ! rotate
688
689          ldub      [out2+local1], local1
690          srl       out1, 24, local0
691          and       out1, local5, local4
692
693          ldub      [out2+local0], local0
694          srl       local4, 8, local4
695          xor       out5, local2, out5            ! 2 finished local2 now sbox 6
696
697          ld        [global4+local4],local4
698          srl       out1, 16, local2
699          xor       out5, local3, out5            ! 3 finished local3 now sbox 5
700
701          ld        [out3+local0],local0
702          and       local2, 252, local2
703          add       global1, 1536, local5     ! address sbox 7
704
705          ld        [local6+local2], local2
706          srl       out0, 16, local3
707          xor       out5, local4, out5            ! 4 finished
708
709          ld        [local5+local1],local1
710          and       local3, 252, local3
711          xor       out5, local0, out5
712
713          ld        [global5+local3],local3
714          xor       out5, local2, out5            ! 6 finished
715          cmp       in2, 8
716
717          ld        [out2+280], out4  ! loop counter
718          xor       out5, local7, local2        ! sbox 5 next round
719          xor       out5, local1, out5            ! 7 finished
720
721          ld        [in4+-1*8+4], out0
722          srl       local2, 16, local2        ! sbox 5 next round
723          xor       out5, local3, out5            ! 5 finished
724
725          and       local2, 252, local2
726! next round (two rounds more)
727          xor       out5, local7, local7        ! 7531
728
729          ld        [global5+local2], local2
730          srl       local7, 24, local3
731          xor       out5, out0, out0            ! 8642
732
733          ldub      [out2+local3], local3
734          srl       out0, 4, local0           ! rotate
735          and       local7, 252, local1
736
737          sll       out0, 28, out0            ! rotate
738          xor       in5, local2, in5            ! 5 finished local2 used
739
740          srl       local0, 8, local4
741          and       local0, 252, local2
742          ld        [local5+local3], local3
743
744          srl       local0, 16, local5
745          or        out0, local0, out0        ! rotate
746          ld        [global2+local2], local2
747
748          srl       out0, 24, local0
749          ld        [in3], out0   ! key next encryption/decryption
750          and       local4, 252, local4
751
752          and       local5, 252, local5
753          ld        [global4+local4], local4
754          xor       in5, local3, in5            ! 7 finished local3 used
755
756          and       local0, 252, local0
757          ld        [local6+local5], local5
758          xor       in5, local2, in5            ! 2 finished local2 now sbox 3
759
760          srl       local7, 8, local2         ! 3 start
761          ld        [out3+local0], local0
762          xor       in5, local4, in5
763
764          and       local2, 252, local2
765          ld        [global1+local1], local1
766          xor       in5, local5, in5            ! 6 finished local5 used
767
768          ld        [global3+local2], local2
769          srl       out5, 3, local3
770          xor       in5, local0, in5
771
772          ld        [in3+4], out1 ! key next encryption/decryption
773          sll       out5, 29, local4
774          xor       in5, local1, in5
775
776          retl
777          xor       in5, local2, in5
778
779
780
781
782! void DES_encrypt1(data, ks, enc)
783! *******************************
784
785          .align 32
786          .global DES_encrypt1
787          .type      DES_encrypt1,#function
788
789DES_encrypt1:
790
791          save      %sp, FRAME, %sp
792
793          sethi     %hi(_PIC_DES_SPtrans-1f),global1
794          or        global1,%lo(_PIC_DES_SPtrans-1f),global1
7951:        call      .+8
796          add       %o7,global1,global1
797          sub       global1,_PIC_DES_SPtrans-.des_and,out2
798
799          ld        [in0], in5                ! left
800          cmp       in2, 0                    ! enc
801
802          be        .encrypt.dec
803          ld        [in0+4], out5             ! right
804
805          ! parameter 6  1/2 for include encryption/decryption
806          ! parameter 7  1 for move in1 to in3
807          ! parameter 8  1 for move in3 to in4, 2 for move in4 to in3
808
809
810
811! ip_macro
812! in5 out5 out5 in5 in3 0 1 1
813
814          ld        [out2+256], local1
815          srl       out5, 4, local4
816
817          xor       local4, in5, local4
818          mov in1, in3
819
820          ld        [out2+260], local2
821          and       local4, local1, local4
822          mov in3, in4
823
824
825          ld        [out2+280], out4          ! loop counter
826          sll       local4, 4, local1
827          xor       in5, local4, in5
828
829          ld        [out2+264], local3
830          srl       in5, 16, local4
831          xor       out5, local1, out5
832
833
834          xor       local4, out5, local4
835          nop       !sethi    %hi(DES_SPtrans), global1 ! sbox addr
836
837
838          and       local4, local2, local4
839          nop       !or       global1, %lo(DES_SPtrans), global1   ! sbox addr
840
841          sll       local4, 16, local1
842          xor       out5, local4, out5
843
844          srl       out5, 2, local4
845          xor       in5, local1, in5
846
847          sethi     %hi(16711680), local5
848          xor       local4, in5, local4
849
850          and       local4, local3, local4
851          or        local5, 255, local5
852
853          sll       local4, 2, local2
854          xor       in5, local4, in5
855
856          srl       in5, 8, local4
857          xor       out5, local2, out5
858
859          xor       local4, out5, local4
860          add       global1, 768, global4
861
862          and       local4, local5, local4
863          add       global1, 1024, global5
864
865          ld        [out2+272], local7
866          sll       local4, 8, local1
867          xor       out5, local4, out5
868
869          srl       out5, 1, local4
870          xor       in5, local1, in5
871
872          ld        [in3], out0                ! key 7531
873          xor       local4, in5, local4
874          add       global1, 256, global2
875
876          ld        [in3+4], out1              ! key 8642
877          and       local4, local7, local4
878          add       global1, 512, global3
879
880          sll       local4, 1, local1
881          xor       in5, local4, in5
882
883          sll       in5, 3, local3
884          xor       out5, local1, out5
885
886          sll       out5, 3, local2
887          add       global1, 1280, local6     ! address sbox 8
888
889          srl       in5, 29, local4
890          add       global1, 1792, out3       ! address sbox 8
891
892          srl       out5, 29, local1
893          or        local4, local3, out5
894
895          or        local2, local1, in5
896
897
898
899
900
901
902
903
904! rounds_macro
905! in5 out5 1 .des_encrypt1.1 in3 in4
906
907          xor       out5, out0, local1
908
909          ld        [out2+284], local5        ! 0x0000FC00
910          ba        .des_encrypt1.1
911          and       local1, 252, local1
912
913          .align 32
914
915.des_encrypt1.1:
916          ! local6 is address sbox 6
917          ! out3   is address sbox 8
918          ! out4   is loop counter
919
920          ld        [global1+local1], local1
921          xor       out5, out1, out1            ! 8642
922          xor       out5, out0, out0            ! 7531
923          ! fmovs   %f0, %f0                  ! fxor used for alignment
924
925          srl       out1, 4, local0           ! rotate 4 right
926          and       out0, local5, local3      ! 3
927          ! fmovs   %f0, %f0
928
929          ld        [in3+1*8], local7         ! key 7531 next round
930          srl       local3, 8, local3         ! 3
931          and       local0, 252, local2       ! 2
932          ! fmovs   %f0, %f0
933
934          ld        [global3+local3],local3   ! 3
935          sll       out1, 28, out1            ! rotate
936          xor       in5, local1, in5            ! 1 finished, local1 now sbox 7
937
938          ld        [global2+local2], local2  ! 2
939          srl       out0, 24, local1          ! 7
940          or        out1, local0, out1        ! rotate
941
942          ldub      [out2+local1], local1     ! 7 (and 0xFC)
943          srl       out1, 24, local0          ! 8
944          and       out1, local5, local4      ! 4
945
946          ldub      [out2+local0], local0     ! 8 (and 0xFC)
947          srl       local4, 8, local4         ! 4
948          xor       in5, local2, in5            ! 2 finished local2 now sbox 6
949
950          ld        [global4+local4],local4   ! 4
951          srl       out1, 16, local2          ! 6
952          xor       in5, local3, in5            ! 3 finished local3 now sbox 5
953
954          ld        [out3+local0],local0      ! 8
955          and       local2, 252, local2       ! 6
956          add       global1, 1536, local5     ! address sbox 7
957
958          ld        [local6+local2], local2   ! 6
959          srl       out0, 16, local3          ! 5
960          xor       in5, local4, in5            ! 4 finished
961
962          ld        [local5+local1],local1    ! 7
963          and       local3, 252, local3       ! 5
964          xor       in5, local0, in5            ! 8 finished
965
966          ld        [global5+local3],local3   ! 5
967          xor       in5, local2, in5            ! 6 finished
968          subcc     out4, 1, out4
969
970          ld        [in3+1*8+4], out0         ! key 8642 next round
971          xor       in5, local7, local2        ! sbox 5 next round
972          xor       in5, local1, in5            ! 7 finished
973
974          srl       local2, 16, local2        ! sbox 5 next round
975          xor       in5, local3, in5            ! 5 finished
976
977          ld        [in3+1*16+4], out1        ! key 8642 next round again
978          and       local2, 252, local2       ! sbox5 next round
979! next round
980          xor       in5, local7, local7        ! 7531
981
982          ld        [global5+local2], local2  ! 5
983          srl       local7, 24, local3        ! 7
984          xor       in5, out0, out0            ! 8642
985
986          ldub      [out2+local3], local3     ! 7 (and 0xFC)
987          srl       out0, 4, local0           ! rotate 4 right
988          and       local7, 252, local1       ! 1
989
990          sll       out0, 28, out0            ! rotate
991          xor       out5, local2, out5            ! 5 finished local2 used
992
993          srl       local0, 8, local4         ! 4
994          and       local0, 252, local2       ! 2
995          ld        [local5+local3], local3   ! 7
996
997          srl       local0, 16, local5        ! 6
998          or        out0, local0, out0        ! rotate
999          ld        [global2+local2], local2  ! 2
1000
1001          srl       out0, 24, local0
1002          ld        [in3+1*16], out0          ! key 7531 next round
1003          and       local4, 252, local4   ! 4
1004
1005          and       local5, 252, local5       ! 6
1006          ld        [global4+local4], local4  ! 4
1007          xor       out5, local3, out5            ! 7 finished local3 used
1008
1009          and       local0, 252, local0       ! 8
1010          ld        [local6+local5], local5   ! 6
1011          xor       out5, local2, out5            ! 2 finished local2 now sbox 3
1012
1013          srl       local7, 8, local2         ! 3 start
1014          ld        [out3+local0], local0     ! 8
1015          xor       out5, local4, out5            ! 4 finished
1016
1017          and       local2, 252, local2       ! 3
1018          ld        [global1+local1], local1  ! 1
1019          xor       out5, local5, out5            ! 6 finished local5 used
1020
1021          ld        [global3+local2], local2  ! 3
1022          xor       out5, local0, out5            ! 8 finished
1023          add       in3, 1*16, in3             ! enc add 8, dec add -8 to key pointer
1024
1025          ld        [out2+284], local5        ! 0x0000FC00
1026          xor       out5, out0, local4          ! sbox 1 next round
1027          xor       out5, local1, out5            ! 1 finished
1028
1029          xor       out5, local2, out5            ! 3 finished
1030          bne       .des_encrypt1.1
1031          and       local4, 252, local1       ! sbox 1 next round
1032
1033! two rounds more:
1034
1035          ld        [global1+local1], local1
1036          xor       out5, out1, out1
1037          xor       out5, out0, out0
1038
1039          srl       out1, 4, local0           ! rotate
1040          and       out0, local5, local3
1041
1042          ld        [in3+1*8], local7         ! key 7531
1043          srl       local3, 8, local3
1044          and       local0, 252, local2
1045
1046          ld        [global3+local3],local3
1047          sll       out1, 28, out1            ! rotate
1048          xor       in5, local1, in5            ! 1 finished, local1 now sbox 7
1049
1050          ld        [global2+local2], local2
1051          srl       out0, 24, local1
1052          or        out1, local0, out1        ! rotate
1053
1054          ldub      [out2+local1], local1
1055          srl       out1, 24, local0
1056          and       out1, local5, local4
1057
1058          ldub      [out2+local0], local0
1059          srl       local4, 8, local4
1060          xor       in5, local2, in5            ! 2 finished local2 now sbox 6
1061
1062          ld        [global4+local4],local4
1063          srl       out1, 16, local2
1064          xor       in5, local3, in5            ! 3 finished local3 now sbox 5
1065
1066          ld        [out3+local0],local0
1067          and       local2, 252, local2
1068          add       global1, 1536, local5     ! address sbox 7
1069
1070          ld        [local6+local2], local2
1071          srl       out0, 16, local3
1072          xor       in5, local4, in5            ! 4 finished
1073
1074          ld        [local5+local1],local1
1075          and       local3, 252, local3
1076          xor       in5, local0, in5
1077
1078          ld        [global5+local3],local3
1079          xor       in5, local2, in5            ! 6 finished
1080          cmp       in2, 8
1081
1082          ld        [out2+280], out4  ! loop counter
1083          xor       in5, local7, local2        ! sbox 5 next round
1084          xor       in5, local1, in5            ! 7 finished
1085
1086          ld        [in3+1*8+4], out0
1087          srl       local2, 16, local2        ! sbox 5 next round
1088          xor       in5, local3, in5            ! 5 finished
1089
1090          and       local2, 252, local2
1091! next round (two rounds more)
1092          xor       in5, local7, local7        ! 7531
1093
1094          ld        [global5+local2], local2
1095          srl       local7, 24, local3
1096          xor       in5, out0, out0            ! 8642
1097
1098          ldub      [out2+local3], local3
1099          srl       out0, 4, local0           ! rotate
1100          and       local7, 252, local1
1101
1102          sll       out0, 28, out0            ! rotate
1103          xor       out5, local2, out5            ! 5 finished local2 used
1104
1105          srl       local0, 8, local4
1106          and       local0, 252, local2
1107          ld        [local5+local3], local3
1108
1109          srl       local0, 16, local5
1110          or        out0, local0, out0        ! rotate
1111          ld        [global2+local2], local2
1112
1113          srl       out0, 24, local0
1114          ld        [in4], out0   ! key next encryption/decryption
1115          and       local4, 252, local4
1116
1117          and       local5, 252, local5
1118          ld        [global4+local4], local4
1119          xor       out5, local3, out5            ! 7 finished local3 used
1120
1121          and       local0, 252, local0
1122          ld        [local6+local5], local5
1123          xor       out5, local2, out5            ! 2 finished local2 now sbox 3
1124
1125          srl       local7, 8, local2         ! 3 start
1126          ld        [out3+local0], local0
1127          xor       out5, local4, out5
1128
1129          and       local2, 252, local2
1130          ld        [global1+local1], local1
1131          xor       out5, local5, out5            ! 6 finished local5 used
1132
1133          ld        [global3+local2], local2
1134          srl       in5, 3, local3
1135          xor       out5, local0, out5
1136
1137          ld        [in4+4], out1 ! key next encryption/decryption
1138          sll       in5, 29, local4
1139          xor       out5, local1, out5
1140
1141
1142          xor       out5, local2, out5
1143 ! in4 not used
1144
1145
1146
1147! fp_macro
1148! in5 out5 1
1149
1150          ! initially undo the rotate 3 left done after initial permutation
1151          ! original left is received shifted 3 right and 29 left in local3/4
1152
1153          sll       out5, 29, local1
1154          or        local3, local4, in5
1155
1156          srl       out5, 3, out5
1157          sethi     %hi(0x55555555), local2
1158
1159          or        out5, local1, out5
1160          or        local2, %lo(0x55555555), local2
1161
1162          srl       out5, 1, local3
1163          sethi     %hi(0x00ff00ff), local1
1164          xor       local3, in5, local3
1165          or        local1, %lo(0x00ff00ff), local1
1166          and       local3, local2, local3
1167          sethi     %hi(0x33333333), local4
1168          sll       local3, 1, local2
1169
1170          xor       in5, local3, in5
1171
1172          srl       in5, 8, local3
1173          xor       out5, local2, out5
1174          xor       local3, out5, local3
1175          or        local4, %lo(0x33333333), local4
1176          and       local3, local1, local3
1177          sethi     %hi(0x0000ffff), local1
1178          sll       local3, 8, local2
1179
1180          xor       out5, local3, out5
1181
1182          srl       out5, 2, local3
1183          xor       in5, local2, in5
1184          xor       local3, in5, local3
1185          or        local1, %lo(0x0000ffff), local1
1186          and       local3, local4, local3
1187          sethi     %hi(0x0f0f0f0f), local4
1188          sll       local3, 2, local2
1189
1190
1191          xor       in5, local3, in5
1192
1193
1194          srl       in5, 16, local3
1195          xor       out5, local2, out5
1196          xor       local3, out5, local3
1197          or        local4, %lo(0x0f0f0f0f), local4
1198          and       local3, local1, local3
1199          sll       local3, 16, local2
1200
1201          xor       out5, local3, local1
1202
1203          srl       local1, 4, local3
1204          xor       in5, local2, in5
1205          xor       local3, in5, local3
1206          and       local3, local4, local3
1207          sll       local3, 4, local2
1208
1209          xor       in5, local3, in5
1210
1211          ! optional store:
1212
1213          st in5, [in0]
1214
1215          xor       local1, local2, out5
1216
1217          st out5, [in0+4]
1218
1219            ! 1 for store to [in0]
1220
1221          ret
1222          restore
1223
1224.encrypt.dec:
1225
1226          add       in1, 120, in3             ! use last subkey for first round
1227
1228          ! parameter 6  1/2 for include encryption/decryption
1229          ! parameter 7  1 for move in1 to in3
1230          ! parameter 8  1 for move in3 to in4, 2 for move in4 to in3
1231
1232
1233
1234! ip_macro
1235! in5 out5 in5 out5 in4 2 0 1
1236
1237          ld        [out2+256], local1
1238          srl       out5, 4, local4
1239
1240          xor       local4, in5, local4
1241          nop
1242
1243          ld        [out2+260], local2
1244          and       local4, local1, local4
1245          mov in3, in4
1246
1247
1248          ld        [out2+280], out4          ! loop counter
1249          sll       local4, 4, local1
1250          xor       in5, local4, in5
1251
1252          ld        [out2+264], local3
1253          srl       in5, 16, local4
1254          xor       out5, local1, out5
1255
1256
1257          xor       local4, out5, local4
1258          nop       !sethi    %hi(DES_SPtrans), global1 ! sbox addr
1259
1260
1261          and       local4, local2, local4
1262          nop       !or       global1, %lo(DES_SPtrans), global1   ! sbox addr
1263
1264          sll       local4, 16, local1
1265          xor       out5, local4, out5
1266
1267          srl       out5, 2, local4
1268          xor       in5, local1, in5
1269
1270          sethi     %hi(16711680), local5
1271          xor       local4, in5, local4
1272
1273          and       local4, local3, local4
1274          or        local5, 255, local5
1275
1276          sll       local4, 2, local2
1277          xor       in5, local4, in5
1278
1279          srl       in5, 8, local4
1280          xor       out5, local2, out5
1281
1282          xor       local4, out5, local4
1283          add       global1, 768, global4
1284
1285          and       local4, local5, local4
1286          add       global1, 1024, global5
1287
1288          ld        [out2+272], local7
1289          sll       local4, 8, local1
1290          xor       out5, local4, out5
1291
1292          srl       out5, 1, local4
1293          xor       in5, local1, in5
1294
1295          ld        [in4], out0                ! key 7531
1296          xor       local4, in5, local4
1297          add       global1, 256, global2
1298
1299          ld        [in4+4], out1              ! key 8642
1300          and       local4, local7, local4
1301          add       global1, 512, global3
1302
1303          sll       local4, 1, local1
1304          xor       in5, local4, in5
1305
1306          sll       in5, 3, local3
1307          xor       out5, local1, out5
1308
1309          sll       out5, 3, local2
1310          add       global1, 1280, local6     ! address sbox 8
1311
1312          srl       in5, 29, local4
1313          add       global1, 1792, out3       ! address sbox 8
1314
1315          srl       out5, 29, local1
1316          or        local4, local3, in5
1317
1318          or        local2, local1, out5
1319
1320
1321
1322
1323
1324                    ld        [out2+284], local5     ! 0x0000FC00 used in the rounds
1325                    or        local2, local1, out5
1326                    xor       in5, out0, local1
1327
1328                    call .des_dec.1
1329                    and       local1, 252, local1
1330
1331
1332 ! include dec,  ks in4
1333
1334
1335
1336! fp_macro
1337! out5 in5 1
1338
1339          ! initially undo the rotate 3 left done after initial permutation
1340          ! original left is received shifted 3 right and 29 left in local3/4
1341
1342          sll       in5, 29, local1
1343          or        local3, local4, out5
1344
1345          srl       in5, 3, in5
1346          sethi     %hi(0x55555555), local2
1347
1348          or        in5, local1, in5
1349          or        local2, %lo(0x55555555), local2
1350
1351          srl       in5, 1, local3
1352          sethi     %hi(0x00ff00ff), local1
1353          xor       local3, out5, local3
1354          or        local1, %lo(0x00ff00ff), local1
1355          and       local3, local2, local3
1356          sethi     %hi(0x33333333), local4
1357          sll       local3, 1, local2
1358
1359          xor       out5, local3, out5
1360
1361          srl       out5, 8, local3
1362          xor       in5, local2, in5
1363          xor       local3, in5, local3
1364          or        local4, %lo(0x33333333), local4
1365          and       local3, local1, local3
1366          sethi     %hi(0x0000ffff), local1
1367          sll       local3, 8, local2
1368
1369          xor       in5, local3, in5
1370
1371          srl       in5, 2, local3
1372          xor       out5, local2, out5
1373          xor       local3, out5, local3
1374          or        local1, %lo(0x0000ffff), local1
1375          and       local3, local4, local3
1376          sethi     %hi(0x0f0f0f0f), local4
1377          sll       local3, 2, local2
1378
1379
1380          xor       out5, local3, out5
1381
1382
1383          srl       out5, 16, local3
1384          xor       in5, local2, in5
1385          xor       local3, in5, local3
1386          or        local4, %lo(0x0f0f0f0f), local4
1387          and       local3, local1, local3
1388          sll       local3, 16, local2
1389
1390          xor       in5, local3, local1
1391
1392          srl       local1, 4, local3
1393          xor       out5, local2, out5
1394          xor       local3, out5, local3
1395          and       local3, local4, local3
1396          sll       local3, 4, local2
1397
1398          xor       out5, local3, out5
1399
1400          ! optional store:
1401
1402          st out5, [in0]
1403
1404          xor       local1, local2, in5
1405
1406          st in5, [in0+4]
1407
1408            ! 1 for store to [in0]
1409
1410          ret
1411          restore
1412
1413.DES_encrypt1.end:
1414          .size      DES_encrypt1,.DES_encrypt1.end-DES_encrypt1
1415
1416
1417! void DES_encrypt2(data, ks, enc)
1418!*********************************
1419
1420          ! encrypts/decrypts without initial/final permutation
1421
1422          .align 32
1423          .global DES_encrypt2
1424          .type      DES_encrypt2,#function
1425
1426DES_encrypt2:
1427
1428          save      %sp, FRAME, %sp
1429
1430          sethi     %hi(_PIC_DES_SPtrans-1f),global1
1431          or        global1,%lo(_PIC_DES_SPtrans-1f),global1
14321:        call      .+8
1433          add       %o7,global1,global1
1434          sub       global1,_PIC_DES_SPtrans-.des_and,out2
1435
1436          ! Set sbox address 1 to 6 and rotate halves 3 left
1437          ! Errors caught by destest? Yes. Still? *NO*
1438
1439          !sethi    %hi(DES_SPtrans), global1 ! address sbox 1
1440
1441          !or       global1, %lo(DES_SPtrans), global1  ! sbox 1
1442
1443          add       global1, 256, global2     ! sbox 2
1444          add       global1, 512, global3     ! sbox 3
1445
1446          ld        [in0], out5               ! right
1447          add       global1, 768, global4     ! sbox 4
1448          add       global1, 1024, global5    ! sbox 5
1449
1450          ld        [in0+4], in5              ! left
1451          add       global1, 1280, local6     ! sbox 6
1452          add       global1, 1792, out3       ! sbox 8
1453
1454          ! rotate
1455
1456          sll       in5, 3, local5
1457          mov       in1, in3                  ! key address to in3
1458
1459          sll       out5, 3, local7
1460          srl       in5, 29, in5
1461
1462          srl       out5, 29, out5
1463          add       in5, local5, in5
1464
1465          add       out5, local7, out5
1466          cmp       in2, 0
1467
1468          ! we use our own stackframe
1469
1470          be        .encrypt2.dec
1471          STPTR     in0, [%sp+BIAS+ARG0+0*ARGSZ]
1472
1473          ld        [in3], out0               ! key 7531 first round
1474          mov       LOOPS, out4               ! loop counter
1475
1476          ld        [in3+4], out1             ! key 8642 first round
1477          sethi     %hi(0x0000FC00), local5
1478
1479          call .des_enc
1480          mov       in3, in4
1481
1482          ! rotate
1483          sll       in5, 29, in0
1484          srl       in5, 3, in5
1485          sll       out5, 29, in1
1486          add       in5, in0, in5
1487          srl       out5, 3, out5
1488          LDPTR     [%sp+BIAS+ARG0+0*ARGSZ], in0
1489          add       out5, in1, out5
1490          st        in5, [in0]
1491          st        out5, [in0+4]
1492
1493          ret
1494          restore
1495
1496
1497.encrypt2.dec:
1498
1499          add in3, 120, in4
1500
1501          ld        [in4], out0               ! key 7531 first round
1502          mov       LOOPS, out4               ! loop counter
1503
1504          ld        [in4+4], out1             ! key 8642 first round
1505          sethi     %hi(0x0000FC00), local5
1506
1507          mov       in5, local1               ! left expected in out5
1508          mov       out5, in5
1509
1510          call .des_dec
1511          mov       local1, out5
1512
1513.encrypt2.finish:
1514
1515          ! rotate
1516          sll       in5, 29, in0
1517          srl       in5, 3, in5
1518          sll       out5, 29, in1
1519          add       in5, in0, in5
1520          srl       out5, 3, out5
1521          LDPTR     [%sp+BIAS+ARG0+0*ARGSZ], in0
1522          add       out5, in1, out5
1523          st        out5, [in0]
1524          st        in5, [in0+4]
1525
1526          ret
1527          restore
1528
1529.DES_encrypt2.end:
1530          .size      DES_encrypt2, .DES_encrypt2.end-DES_encrypt2
1531
1532
1533! void DES_encrypt3(data, ks1, ks2, ks3)
1534! **************************************
1535
1536          .align 32
1537          .global DES_encrypt3
1538          .type      DES_encrypt3,#function
1539
1540DES_encrypt3:
1541
1542          save      %sp, FRAME, %sp
1543
1544          sethi     %hi(_PIC_DES_SPtrans-1f),global1
1545          or        global1,%lo(_PIC_DES_SPtrans-1f),global1
15461:        call      .+8
1547          add       %o7,global1,global1
1548          sub       global1,_PIC_DES_SPtrans-.des_and,out2
1549
1550          ld        [in0], in5                ! left
1551          add       in2, 120, in4             ! ks2
1552
1553          ld        [in0+4], out5             ! right
1554          mov       in3, in2                  ! save ks3
1555
1556          ! parameter 6  1/2 for include encryption/decryption
1557          ! parameter 7  1 for mov in1 to in3
1558          ! parameter 8  1 for mov in3 to in4
1559          ! parameter 9  1 for load ks3 and ks2 to in4 and in3
1560
1561
1562
1563! ip_macro
1564! in5 out5 out5 in5 in3 1 1 0 0
1565
1566          ld        [out2+256], local1
1567          srl       out5, 4, local4
1568
1569          xor       local4, in5, local4
1570          mov in1, in3
1571
1572          ld        [out2+260], local2
1573          and       local4, local1, local4
1574
1575
1576
1577          ld        [out2+280], out4          ! loop counter
1578          sll       local4, 4, local1
1579          xor       in5, local4, in5
1580
1581          ld        [out2+264], local3
1582          srl       in5, 16, local4
1583          xor       out5, local1, out5
1584
1585
1586          xor       local4, out5, local4
1587          nop       !sethi    %hi(DES_SPtrans), global1 ! sbox addr
1588
1589
1590          and       local4, local2, local4
1591          nop       !or       global1, %lo(DES_SPtrans), global1   ! sbox addr
1592
1593          sll       local4, 16, local1
1594          xor       out5, local4, out5
1595
1596          srl       out5, 2, local4
1597          xor       in5, local1, in5
1598
1599          sethi     %hi(16711680), local5
1600          xor       local4, in5, local4
1601
1602          and       local4, local3, local4
1603          or        local5, 255, local5
1604
1605          sll       local4, 2, local2
1606          xor       in5, local4, in5
1607
1608          srl       in5, 8, local4
1609          xor       out5, local2, out5
1610
1611          xor       local4, out5, local4
1612          add       global1, 768, global4
1613
1614          and       local4, local5, local4
1615          add       global1, 1024, global5
1616
1617          ld        [out2+272], local7
1618          sll       local4, 8, local1
1619          xor       out5, local4, out5
1620
1621          srl       out5, 1, local4
1622          xor       in5, local1, in5
1623
1624          ld        [in3], out0                ! key 7531
1625          xor       local4, in5, local4
1626          add       global1, 256, global2
1627
1628          ld        [in3+4], out1              ! key 8642
1629          and       local4, local7, local4
1630          add       global1, 512, global3
1631
1632          sll       local4, 1, local1
1633          xor       in5, local4, in5
1634
1635          sll       in5, 3, local3
1636          xor       out5, local1, out5
1637
1638          sll       out5, 3, local2
1639          add       global1, 1280, local6     ! address sbox 8
1640
1641          srl       in5, 29, local4
1642          add       global1, 1792, out3       ! address sbox 8
1643
1644          srl       out5, 29, local1
1645          or        local4, local3, out5
1646
1647          or        local2, local1, in5
1648
1649
1650
1651                    ld        [out2+284], local5     ! 0x0000FC00 used in the rounds
1652                    or        local2, local1, in5
1653                    xor       out5, out0, local1
1654
1655                    call .des_enc.1
1656                    and       local1, 252, local1
1657
1658
1659
1660
1661
1662
1663          call      .des_dec
1664          mov       in2, in3                  ! preload ks3
1665
1666          call      .des_enc
1667          nop
1668
1669
1670
1671! fp_macro
1672! in5 out5 1
1673
1674          ! initially undo the rotate 3 left done after initial permutation
1675          ! original left is received shifted 3 right and 29 left in local3/4
1676
1677          sll       out5, 29, local1
1678          or        local3, local4, in5
1679
1680          srl       out5, 3, out5
1681          sethi     %hi(0x55555555), local2
1682
1683          or        out5, local1, out5
1684          or        local2, %lo(0x55555555), local2
1685
1686          srl       out5, 1, local3
1687          sethi     %hi(0x00ff00ff), local1
1688          xor       local3, in5, local3
1689          or        local1, %lo(0x00ff00ff), local1
1690          and       local3, local2, local3
1691          sethi     %hi(0x33333333), local4
1692          sll       local3, 1, local2
1693
1694          xor       in5, local3, in5
1695
1696          srl       in5, 8, local3
1697          xor       out5, local2, out5
1698          xor       local3, out5, local3
1699          or        local4, %lo(0x33333333), local4
1700          and       local3, local1, local3
1701          sethi     %hi(0x0000ffff), local1
1702          sll       local3, 8, local2
1703
1704          xor       out5, local3, out5
1705
1706          srl       out5, 2, local3
1707          xor       in5, local2, in5
1708          xor       local3, in5, local3
1709          or        local1, %lo(0x0000ffff), local1
1710          and       local3, local4, local3
1711          sethi     %hi(0x0f0f0f0f), local4
1712          sll       local3, 2, local2
1713
1714
1715          xor       in5, local3, in5
1716
1717
1718          srl       in5, 16, local3
1719          xor       out5, local2, out5
1720          xor       local3, out5, local3
1721          or        local4, %lo(0x0f0f0f0f), local4
1722          and       local3, local1, local3
1723          sll       local3, 16, local2
1724
1725          xor       out5, local3, local1
1726
1727          srl       local1, 4, local3
1728          xor       in5, local2, in5
1729          xor       local3, in5, local3
1730          and       local3, local4, local3
1731          sll       local3, 4, local2
1732
1733          xor       in5, local3, in5
1734
1735          ! optional store:
1736
1737          st in5, [in0]
1738
1739          xor       local1, local2, out5
1740
1741          st out5, [in0+4]
1742
1743
1744
1745          ret
1746          restore
1747
1748.DES_encrypt3.end:
1749          .size      DES_encrypt3,.DES_encrypt3.end-DES_encrypt3
1750
1751
1752! void DES_decrypt3(data, ks1, ks2, ks3)
1753! **************************************
1754
1755          .align 32
1756          .global DES_decrypt3
1757          .type      DES_decrypt3,#function
1758
1759DES_decrypt3:
1760
1761          save      %sp, FRAME, %sp
1762
1763          sethi     %hi(_PIC_DES_SPtrans-1f),global1
1764          or        global1,%lo(_PIC_DES_SPtrans-1f),global1
17651:        call      .+8
1766          add       %o7,global1,global1
1767          sub       global1,_PIC_DES_SPtrans-.des_and,out2
1768
1769          ld        [in0], in5                ! left
1770          add       in3, 120, in4             ! ks3
1771
1772          ld        [in0+4], out5             ! right
1773          mov       in2, in3                  ! ks2
1774
1775          ! parameter 6  1/2 for include encryption/decryption
1776          ! parameter 7  1 for mov in1 to in3
1777          ! parameter 8  1 for mov in3 to in4
1778          ! parameter 9  1 for load ks3 and ks2 to in4 and in3
1779
1780
1781
1782! ip_macro
1783! in5 out5 in5 out5 in4 2 0 0 0
1784
1785          ld        [out2+256], local1
1786          srl       out5, 4, local4
1787
1788          xor       local4, in5, local4
1789          nop
1790
1791          ld        [out2+260], local2
1792          and       local4, local1, local4
1793
1794
1795
1796          ld        [out2+280], out4          ! loop counter
1797          sll       local4, 4, local1
1798          xor       in5, local4, in5
1799
1800          ld        [out2+264], local3
1801          srl       in5, 16, local4
1802          xor       out5, local1, out5
1803
1804
1805          xor       local4, out5, local4
1806          nop       !sethi    %hi(DES_SPtrans), global1 ! sbox addr
1807
1808
1809          and       local4, local2, local4
1810          nop       !or       global1, %lo(DES_SPtrans), global1   ! sbox addr
1811
1812          sll       local4, 16, local1
1813          xor       out5, local4, out5
1814
1815          srl       out5, 2, local4
1816          xor       in5, local1, in5
1817
1818          sethi     %hi(16711680), local5
1819          xor       local4, in5, local4
1820
1821          and       local4, local3, local4
1822          or        local5, 255, local5
1823
1824          sll       local4, 2, local2
1825          xor       in5, local4, in5
1826
1827          srl       in5, 8, local4
1828          xor       out5, local2, out5
1829
1830          xor       local4, out5, local4
1831          add       global1, 768, global4
1832
1833          and       local4, local5, local4
1834          add       global1, 1024, global5
1835
1836          ld        [out2+272], local7
1837          sll       local4, 8, local1
1838          xor       out5, local4, out5
1839
1840          srl       out5, 1, local4
1841          xor       in5, local1, in5
1842
1843          ld        [in4], out0                ! key 7531
1844          xor       local4, in5, local4
1845          add       global1, 256, global2
1846
1847          ld        [in4+4], out1              ! key 8642
1848          and       local4, local7, local4
1849          add       global1, 512, global3
1850
1851          sll       local4, 1, local1
1852          xor       in5, local4, in5
1853
1854          sll       in5, 3, local3
1855          xor       out5, local1, out5
1856
1857          sll       out5, 3, local2
1858          add       global1, 1280, local6     ! address sbox 8
1859
1860          srl       in5, 29, local4
1861          add       global1, 1792, out3       ! address sbox 8
1862
1863          srl       out5, 29, local1
1864          or        local4, local3, in5
1865
1866          or        local2, local1, out5
1867
1868
1869
1870
1871
1872                    ld        [out2+284], local5     ! 0x0000FC00 used in the rounds
1873                    or        local2, local1, out5
1874                    xor       in5, out0, local1
1875
1876                    call .des_dec.1
1877                    and       local1, 252, local1
1878
1879
1880
1881
1882          call      .des_enc
1883          add       in1, 120, in4             ! preload ks1
1884
1885          call      .des_dec
1886          nop
1887
1888
1889
1890! fp_macro
1891! out5 in5 1
1892
1893          ! initially undo the rotate 3 left done after initial permutation
1894          ! original left is received shifted 3 right and 29 left in local3/4
1895
1896          sll       in5, 29, local1
1897          or        local3, local4, out5
1898
1899          srl       in5, 3, in5
1900          sethi     %hi(0x55555555), local2
1901
1902          or        in5, local1, in5
1903          or        local2, %lo(0x55555555), local2
1904
1905          srl       in5, 1, local3
1906          sethi     %hi(0x00ff00ff), local1
1907          xor       local3, out5, local3
1908          or        local1, %lo(0x00ff00ff), local1
1909          and       local3, local2, local3
1910          sethi     %hi(0x33333333), local4
1911          sll       local3, 1, local2
1912
1913          xor       out5, local3, out5
1914
1915          srl       out5, 8, local3
1916          xor       in5, local2, in5
1917          xor       local3, in5, local3
1918          or        local4, %lo(0x33333333), local4
1919          and       local3, local1, local3
1920          sethi     %hi(0x0000ffff), local1
1921          sll       local3, 8, local2
1922
1923          xor       in5, local3, in5
1924
1925          srl       in5, 2, local3
1926          xor       out5, local2, out5
1927          xor       local3, out5, local3
1928          or        local1, %lo(0x0000ffff), local1
1929          and       local3, local4, local3
1930          sethi     %hi(0x0f0f0f0f), local4
1931          sll       local3, 2, local2
1932
1933
1934          xor       out5, local3, out5
1935
1936
1937          srl       out5, 16, local3
1938          xor       in5, local2, in5
1939          xor       local3, in5, local3
1940          or        local4, %lo(0x0f0f0f0f), local4
1941          and       local3, local1, local3
1942          sll       local3, 16, local2
1943
1944          xor       in5, local3, local1
1945
1946          srl       local1, 4, local3
1947          xor       out5, local2, out5
1948          xor       local3, out5, local3
1949          and       local3, local4, local3
1950          sll       local3, 4, local2
1951
1952          xor       out5, local3, out5
1953
1954          ! optional store:
1955
1956          st out5, [in0]
1957
1958          xor       local1, local2, in5
1959
1960          st in5, [in0+4]
1961
1962
1963
1964          ret
1965          restore
1966
1967.DES_decrypt3.end:
1968          .size      DES_decrypt3,.DES_decrypt3.end-DES_decrypt3
1969
1970! void DES_ncbc_encrypt(input, output, length, schedule, ivec, enc)
1971! *****************************************************************
1972
1973
1974          .align 32
1975          .global DES_ncbc_encrypt
1976          .type      DES_ncbc_encrypt,#function
1977
1978DES_ncbc_encrypt:
1979
1980          save      %sp, FRAME, %sp
1981
1982
1983
1984
1985
1986          sethi     %hi(_PIC_DES_SPtrans-1f),global1
1987          or        global1,%lo(_PIC_DES_SPtrans-1f),global1
19881:        call      .+8
1989          add       %o7,global1,global1
1990          sub       global1,_PIC_DES_SPtrans-.des_and,out2
1991
1992          cmp       in5, 0                    ! enc
1993
1994          be        .ncbc.dec
1995          STPTR     in4,  [%sp+BIAS+ARG0+4*ARGSZ]
1996
1997          ! addr  left  right  temp  label
1998
1999
2000! load_little_endian
2001! in4 in5 out5 local3 .LLE1
2002
2003          ! first in memory to rightmost in register
2004
2005.LLE1:
2006          ldub      [in4+3], in5
2007
2008          ldub      [in4+2], local3
2009          sll       in5, 8, in5
2010          or        in5, local3, in5
2011
2012          ldub      [in4+1], local3
2013          sll       in5, 8, in5
2014          or        in5, local3, in5
2015
2016          ldub      [in4+0], local3
2017          sll       in5, 8, in5
2018          or        in5, local3, in5
2019
2020
2021          ldub      [in4+3+4], out5
2022
2023          ldub      [in4+2+4], local3
2024          sll       out5, 8, out5
2025          or        out5, local3, out5
2026
2027          ldub      [in4+1+4], local3
2028          sll       out5, 8, out5
2029          or        out5, local3, out5
2030
2031          ldub      [in4+0+4], local3
2032          sll       out5, 8, out5
2033          or        out5, local3, out5
2034.LLE1a:
2035
2036  ! iv
2037
2038          addcc     in2, -8, in2              ! bytes missing when first block done
2039
2040          bl        .ncbc.enc.seven.or.less
2041          mov       in3, in4                  ! schedule
2042
2043.ncbc.enc.next.block:
2044
2045
2046
2047! load_little_endian
2048! in0 out4 global4 local3 .LLE2
2049
2050          ! first in memory to rightmost in register
2051
2052.LLE2:
2053          ldub      [in0+3], out4
2054
2055          ldub      [in0+2], local3
2056          sll       out4, 8, out4
2057          or        out4, local3, out4
2058
2059          ldub      [in0+1], local3
2060          sll       out4, 8, out4
2061          or        out4, local3, out4
2062
2063          ldub      [in0+0], local3
2064          sll       out4, 8, out4
2065          or        out4, local3, out4
2066
2067
2068          ldub      [in0+3+4], global4
2069
2070          ldub      [in0+2+4], local3
2071          sll       global4, 8, global4
2072          or        global4, local3, global4
2073
2074          ldub      [in0+1+4], local3
2075          sll       global4, 8, global4
2076          or        global4, local3, global4
2077
2078          ldub      [in0+0+4], local3
2079          sll       global4, 8, global4
2080          or        global4, local3, global4
2081.LLE2a:
2082
2083  ! block
2084
2085.ncbc.enc.next.block_1:
2086
2087          xor       in5, out4, in5            ! iv xor
2088          xor       out5, global4, out5       ! iv xor
2089
2090          ! parameter 8  1 for move in3 to in4, 2 for move in4 to in3
2091
2092
2093! ip_macro
2094! in5 out5 out5 in5 in3 0 0 2
2095
2096          ld        [out2+256], local1
2097          srl       out5, 4, local4
2098
2099          xor       local4, in5, local4
2100          nop
2101
2102          ld        [out2+260], local2
2103          and       local4, local1, local4
2104
2105          mov in4, in3
2106
2107          ld        [out2+280], out4          ! loop counter
2108          sll       local4, 4, local1
2109          xor       in5, local4, in5
2110
2111          ld        [out2+264], local3
2112          srl       in5, 16, local4
2113          xor       out5, local1, out5
2114
2115
2116          xor       local4, out5, local4
2117          nop       !sethi    %hi(DES_SPtrans), global1 ! sbox addr
2118
2119
2120          and       local4, local2, local4
2121          nop       !or       global1, %lo(DES_SPtrans), global1   ! sbox addr
2122
2123          sll       local4, 16, local1
2124          xor       out5, local4, out5
2125
2126          srl       out5, 2, local4
2127          xor       in5, local1, in5
2128
2129          sethi     %hi(16711680), local5
2130          xor       local4, in5, local4
2131
2132          and       local4, local3, local4
2133          or        local5, 255, local5
2134
2135          sll       local4, 2, local2
2136          xor       in5, local4, in5
2137
2138          srl       in5, 8, local4
2139          xor       out5, local2, out5
2140
2141          xor       local4, out5, local4
2142          add       global1, 768, global4
2143
2144          and       local4, local5, local4
2145          add       global1, 1024, global5
2146
2147          ld        [out2+272], local7
2148          sll       local4, 8, local1
2149          xor       out5, local4, out5
2150
2151          srl       out5, 1, local4
2152          xor       in5, local1, in5
2153
2154          ld        [in3], out0                ! key 7531
2155          xor       local4, in5, local4
2156          add       global1, 256, global2
2157
2158          ld        [in3+4], out1              ! key 8642
2159          and       local4, local7, local4
2160          add       global1, 512, global3
2161
2162          sll       local4, 1, local1
2163          xor       in5, local4, in5
2164
2165          sll       in5, 3, local3
2166          xor       out5, local1, out5
2167
2168          sll       out5, 3, local2
2169          add       global1, 1280, local6     ! address sbox 8
2170
2171          srl       in5, 29, local4
2172          add       global1, 1792, out3       ! address sbox 8
2173
2174          srl       out5, 29, local1
2175          or        local4, local3, out5
2176
2177          or        local2, local1, in5
2178
2179
2180
2181
2182
2183
2184.ncbc.enc.next.block_2:
2185
2186!//       call .des_enc                     ! compares in2 to 8
2187!         rounds inlined for alignment purposes
2188
2189          add       global1, 768, global4     ! address sbox 4 since register used below
2190
2191
2192
2193! rounds_macro
2194! in5 out5 1 .ncbc.enc.1 in3 in4
2195
2196          xor       out5, out0, local1
2197
2198          ld        [out2+284], local5        ! 0x0000FC00
2199          ba        .ncbc.enc.1
2200          and       local1, 252, local1
2201
2202          .align 32
2203
2204.ncbc.enc.1:
2205          ! local6 is address sbox 6
2206          ! out3   is address sbox 8
2207          ! out4   is loop counter
2208
2209          ld        [global1+local1], local1
2210          xor       out5, out1, out1            ! 8642
2211          xor       out5, out0, out0            ! 7531
2212          ! fmovs   %f0, %f0                  ! fxor used for alignment
2213
2214          srl       out1, 4, local0           ! rotate 4 right
2215          and       out0, local5, local3      ! 3
2216          ! fmovs   %f0, %f0
2217
2218          ld        [in3+1*8], local7         ! key 7531 next round
2219          srl       local3, 8, local3         ! 3
2220          and       local0, 252, local2       ! 2
2221          ! fmovs   %f0, %f0
2222
2223          ld        [global3+local3],local3   ! 3
2224          sll       out1, 28, out1            ! rotate
2225          xor       in5, local1, in5            ! 1 finished, local1 now sbox 7
2226
2227          ld        [global2+local2], local2  ! 2
2228          srl       out0, 24, local1          ! 7
2229          or        out1, local0, out1        ! rotate
2230
2231          ldub      [out2+local1], local1     ! 7 (and 0xFC)
2232          srl       out1, 24, local0          ! 8
2233          and       out1, local5, local4      ! 4
2234
2235          ldub      [out2+local0], local0     ! 8 (and 0xFC)
2236          srl       local4, 8, local4         ! 4
2237          xor       in5, local2, in5            ! 2 finished local2 now sbox 6
2238
2239          ld        [global4+local4],local4   ! 4
2240          srl       out1, 16, local2          ! 6
2241          xor       in5, local3, in5            ! 3 finished local3 now sbox 5
2242
2243          ld        [out3+local0],local0      ! 8
2244          and       local2, 252, local2       ! 6
2245          add       global1, 1536, local5     ! address sbox 7
2246
2247          ld        [local6+local2], local2   ! 6
2248          srl       out0, 16, local3          ! 5
2249          xor       in5, local4, in5            ! 4 finished
2250
2251          ld        [local5+local1],local1    ! 7
2252          and       local3, 252, local3       ! 5
2253          xor       in5, local0, in5            ! 8 finished
2254
2255          ld        [global5+local3],local3   ! 5
2256          xor       in5, local2, in5            ! 6 finished
2257          subcc     out4, 1, out4
2258
2259          ld        [in3+1*8+4], out0         ! key 8642 next round
2260          xor       in5, local7, local2        ! sbox 5 next round
2261          xor       in5, local1, in5            ! 7 finished
2262
2263          srl       local2, 16, local2        ! sbox 5 next round
2264          xor       in5, local3, in5            ! 5 finished
2265
2266          ld        [in3+1*16+4], out1        ! key 8642 next round again
2267          and       local2, 252, local2       ! sbox5 next round
2268! next round
2269          xor       in5, local7, local7        ! 7531
2270
2271          ld        [global5+local2], local2  ! 5
2272          srl       local7, 24, local3        ! 7
2273          xor       in5, out0, out0            ! 8642
2274
2275          ldub      [out2+local3], local3     ! 7 (and 0xFC)
2276          srl       out0, 4, local0           ! rotate 4 right
2277          and       local7, 252, local1       ! 1
2278
2279          sll       out0, 28, out0            ! rotate
2280          xor       out5, local2, out5            ! 5 finished local2 used
2281
2282          srl       local0, 8, local4         ! 4
2283          and       local0, 252, local2       ! 2
2284          ld        [local5+local3], local3   ! 7
2285
2286          srl       local0, 16, local5        ! 6
2287          or        out0, local0, out0        ! rotate
2288          ld        [global2+local2], local2  ! 2
2289
2290          srl       out0, 24, local0
2291          ld        [in3+1*16], out0          ! key 7531 next round
2292          and       local4, 252, local4   ! 4
2293
2294          and       local5, 252, local5       ! 6
2295          ld        [global4+local4], local4  ! 4
2296          xor       out5, local3, out5            ! 7 finished local3 used
2297
2298          and       local0, 252, local0       ! 8
2299          ld        [local6+local5], local5   ! 6
2300          xor       out5, local2, out5            ! 2 finished local2 now sbox 3
2301
2302          srl       local7, 8, local2         ! 3 start
2303          ld        [out3+local0], local0     ! 8
2304          xor       out5, local4, out5            ! 4 finished
2305
2306          and       local2, 252, local2       ! 3
2307          ld        [global1+local1], local1  ! 1
2308          xor       out5, local5, out5            ! 6 finished local5 used
2309
2310          ld        [global3+local2], local2  ! 3
2311          xor       out5, local0, out5            ! 8 finished
2312          add       in3, 1*16, in3             ! enc add 8, dec add -8 to key pointer
2313
2314          ld        [out2+284], local5        ! 0x0000FC00
2315          xor       out5, out0, local4          ! sbox 1 next round
2316          xor       out5, local1, out5            ! 1 finished
2317
2318          xor       out5, local2, out5            ! 3 finished
2319          bne       .ncbc.enc.1
2320          and       local4, 252, local1       ! sbox 1 next round
2321
2322! two rounds more:
2323
2324          ld        [global1+local1], local1
2325          xor       out5, out1, out1
2326          xor       out5, out0, out0
2327
2328          srl       out1, 4, local0           ! rotate
2329          and       out0, local5, local3
2330
2331          ld        [in3+1*8], local7         ! key 7531
2332          srl       local3, 8, local3
2333          and       local0, 252, local2
2334
2335          ld        [global3+local3],local3
2336          sll       out1, 28, out1            ! rotate
2337          xor       in5, local1, in5            ! 1 finished, local1 now sbox 7
2338
2339          ld        [global2+local2], local2
2340          srl       out0, 24, local1
2341          or        out1, local0, out1        ! rotate
2342
2343          ldub      [out2+local1], local1
2344          srl       out1, 24, local0
2345          and       out1, local5, local4
2346
2347          ldub      [out2+local0], local0
2348          srl       local4, 8, local4
2349          xor       in5, local2, in5            ! 2 finished local2 now sbox 6
2350
2351          ld        [global4+local4],local4
2352          srl       out1, 16, local2
2353          xor       in5, local3, in5            ! 3 finished local3 now sbox 5
2354
2355          ld        [out3+local0],local0
2356          and       local2, 252, local2
2357          add       global1, 1536, local5     ! address sbox 7
2358
2359          ld        [local6+local2], local2
2360          srl       out0, 16, local3
2361          xor       in5, local4, in5            ! 4 finished
2362
2363          ld        [local5+local1],local1
2364          and       local3, 252, local3
2365          xor       in5, local0, in5
2366
2367          ld        [global5+local3],local3
2368          xor       in5, local2, in5            ! 6 finished
2369          cmp       in2, 8
2370
2371          ld        [out2+280], out4  ! loop counter
2372          xor       in5, local7, local2        ! sbox 5 next round
2373          xor       in5, local1, in5            ! 7 finished
2374
2375          ld        [in3+1*8+4], out0
2376          srl       local2, 16, local2        ! sbox 5 next round
2377          xor       in5, local3, in5            ! 5 finished
2378
2379          and       local2, 252, local2
2380! next round (two rounds more)
2381          xor       in5, local7, local7        ! 7531
2382
2383          ld        [global5+local2], local2
2384          srl       local7, 24, local3
2385          xor       in5, out0, out0            ! 8642
2386
2387          ldub      [out2+local3], local3
2388          srl       out0, 4, local0           ! rotate
2389          and       local7, 252, local1
2390
2391          sll       out0, 28, out0            ! rotate
2392          xor       out5, local2, out5            ! 5 finished local2 used
2393
2394          srl       local0, 8, local4
2395          and       local0, 252, local2
2396          ld        [local5+local3], local3
2397
2398          srl       local0, 16, local5
2399          or        out0, local0, out0        ! rotate
2400          ld        [global2+local2], local2
2401
2402          srl       out0, 24, local0
2403          ld        [in4], out0   ! key next encryption/decryption
2404          and       local4, 252, local4
2405
2406          and       local5, 252, local5
2407          ld        [global4+local4], local4
2408          xor       out5, local3, out5            ! 7 finished local3 used
2409
2410          and       local0, 252, local0
2411          ld        [local6+local5], local5
2412          xor       out5, local2, out5            ! 2 finished local2 now sbox 3
2413
2414          srl       local7, 8, local2         ! 3 start
2415          ld        [out3+local0], local0
2416          xor       out5, local4, out5
2417
2418          and       local2, 252, local2
2419          ld        [global1+local1], local1
2420          xor       out5, local5, out5            ! 6 finished local5 used
2421
2422          ld        [global3+local2], local2
2423          srl       in5, 3, local3
2424          xor       out5, local0, out5
2425
2426          ld        [in4+4], out1 ! key next encryption/decryption
2427          sll       in5, 29, local4
2428          xor       out5, local1, out5
2429
2430
2431          xor       out5, local2, out5
2432 ! include encryption  ks in3
2433
2434          bl        .ncbc.enc.next.block_fp
2435          add       in0, 8, in0               ! input address
2436
2437          ! If 8 or more bytes are to be encrypted after this block,
2438          ! we combine final permutation for this block with initial
2439          ! permutation for next block. Load next block:
2440
2441
2442
2443! load_little_endian
2444! in0 global3 global4 local5 .LLE12
2445
2446          ! first in memory to rightmost in register
2447
2448.LLE12:
2449          ldub      [in0+3], global3
2450
2451          ldub      [in0+2], local5
2452          sll       global3, 8, global3
2453          or        global3, local5, global3
2454
2455          ldub      [in0+1], local5
2456          sll       global3, 8, global3
2457          or        global3, local5, global3
2458
2459          ldub      [in0+0], local5
2460          sll       global3, 8, global3
2461          or        global3, local5, global3
2462
2463
2464          ldub      [in0+3+4], global4
2465
2466          ldub      [in0+2+4], local5
2467          sll       global4, 8, global4
2468          or        global4, local5, global4
2469
2470          ldub      [in0+1+4], local5
2471          sll       global4, 8, global4
2472          or        global4, local5, global4
2473
2474          ldub      [in0+0+4], local5
2475          sll       global4, 8, global4
2476          or        global4, local5, global4
2477.LLE12a:
2478
2479
2480
2481          !  parameter 1   original left
2482          !  parameter 2   original right
2483          !  parameter 3   left ip
2484          !  parameter 4   right ip
2485          !  parameter 5   1: load ks1/ks2 to in3/in4, add 120 to in4
2486          !                2: mov in4 to in3
2487          !
2488          ! also adds -8 to length in2 and loads loop counter to out4
2489
2490
2491
2492! fp_ip_macro
2493! out0 out1 global3 global4 2
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503          ! out0 in local3, local4
2504
2505          ld        [out2+256], local1
2506          sll       out5, 29, out4
2507          or        local3, local4, out0
2508
2509          srl       out5, 3, out1
2510          mov in4, in3
2511
2512          ld        [out2+272], local5
2513          srl       global4, 4, local0
2514          or        out1, out4, out1
2515
2516          srl       out1, 1, out4
2517          xor       out4, out0, out4
2518
2519          and       out4, local5, out4
2520          xor       local0, global3, local0
2521
2522          sll       out4, 1, local3
2523          xor       out0, out4, out0
2524
2525          and       local0, local1, local0
2526          add       in2, -8, in2
2527
2528          sll       local0, 4, local7
2529          xor       global3, local0, global3
2530
2531          ld        [out2+268], local4
2532          srl       out0, 8, out4
2533          xor       out1, local3, out1
2534          ld        [out2+260], local2
2535          srl       global3, 16, local0
2536          xor       global4, local7, global4
2537          xor       out4, out1, out4
2538          xor       local0, global4, local0
2539          and       out4, local4, out4
2540          and       local0, local2, local0
2541          sll       out4, 8, local3
2542          xor       out1, out4, out1
2543          sll       local0, 16, local7
2544          xor       global4, local0, global4
2545
2546          srl       out1, 2, out4
2547          xor       out0, local3, out0
2548
2549          ld        [out2+264], local3         ! ip3
2550          srl       global4, 2, local0
2551          xor       global3, local7, global3
2552          xor       out4, out0, out4
2553          xor       local0, global3, local0
2554          and       out4, local3, out4
2555          and       local0, local3, local0
2556          sll       out4, 2, local3
2557          xor       out0, out4, out0
2558          sll       local0, 2, local7
2559          xor       global3, local0, global3
2560
2561          srl       out0, 16, out4
2562          xor       out1, local3, out1
2563          srl       global3, 8, local0
2564          xor       global4, local7, global4
2565          xor       out4, out1, out4
2566          xor       local0, global4, local0
2567          and       out4, local2, out4
2568          and       local0, local4, local0
2569          sll       out4, 16, local3
2570          xor       out1, out4, local4
2571          sll       local0, 8, local7
2572          xor       global4, local0, global4
2573
2574          srl       global4, 1, local0
2575          xor       global3, local7, global3
2576
2577          srl       local4, 4, out4
2578          xor       local0, global3, local0
2579
2580          xor       out0, local3, out0
2581          and       local0, local5, local0
2582
2583          sll       local0, 1, local7
2584          xor       out4, out0, out4
2585
2586          xor       global3, local0, global3
2587          xor       global4, local7, global4
2588
2589          sll       global3, 3, local5
2590          and       out4, local1, out4
2591
2592          sll       out4, 4, local3
2593          xor       out0, out4, out0
2594
2595
2596          sll       global4, 3, local2
2597          xor       local4, local3, out1
2598
2599          ! reload since used as temporary:
2600
2601          ld        [out2+280], out4          ! loop counter
2602
2603          srl       global3, 29, local0
2604
2605
2606
2607          srl       global4, 29, local7
2608
2609          or        local0, local5, global4
2610          or        local2, local7, global3
2611
2612
2613
2614
2615
2616! store_little_endian
2617! in1 out0 out1 local3 .SLE10
2618
2619          ! rightmost in register to first in memory
2620
2621.SLE10:
2622          and       out0, 255, local3
2623          stub      local3, [in1+0]
2624
2625          srl       out0, 8, local3
2626          and       local3, 255, local3
2627          stub      local3, [in1+1]
2628
2629          srl       out0, 16, local3
2630          and       local3, 255, local3
2631          stub      local3, [in1+2]
2632
2633          srl       out0, 24, local3
2634          stub      local3, [in1+3]
2635
2636
2637          and       out1, 255, local3
2638          stub      local3, [in1+0+4]
2639
2640          srl       out1, 8, local3
2641          and       local3, 255, local3
2642          stub      local3, [in1+1+4]
2643
2644          srl       out1, 16, local3
2645          and       local3, 255, local3
2646          stub      local3, [in1+2+4]
2647
2648          srl       out1, 24, local3
2649          stub      local3, [in1+3+4]
2650
2651.SLE10a:
2652
2653  ! block
2654
2655          ld        [in3], out0               ! key 7531 first round next block
2656          mov       in5, local1
2657          xor       global3, out5, in5        ! iv xor next block
2658
2659          ld        [in3+4], out1             ! key 8642
2660          add       global1, 512, global3     ! address sbox 3 since register used
2661          xor       global4, local1, out5     ! iv xor next block
2662
2663          ba        .ncbc.enc.next.block_2
2664          add       in1, 8, in1               ! output address
2665
2666.ncbc.enc.next.block_fp:
2667
2668
2669
2670! fp_macro
2671! in5 out5
2672
2673          ! initially undo the rotate 3 left done after initial permutation
2674          ! original left is received shifted 3 right and 29 left in local3/4
2675
2676          sll       out5, 29, local1
2677          or        local3, local4, in5
2678
2679          srl       out5, 3, out5
2680          sethi     %hi(0x55555555), local2
2681
2682          or        out5, local1, out5
2683          or        local2, %lo(0x55555555), local2
2684
2685          srl       out5, 1, local3
2686          sethi     %hi(0x00ff00ff), local1
2687          xor       local3, in5, local3
2688          or        local1, %lo(0x00ff00ff), local1
2689          and       local3, local2, local3
2690          sethi     %hi(0x33333333), local4
2691          sll       local3, 1, local2
2692
2693          xor       in5, local3, in5
2694
2695          srl       in5, 8, local3
2696          xor       out5, local2, out5
2697          xor       local3, out5, local3
2698          or        local4, %lo(0x33333333), local4
2699          and       local3, local1, local3
2700          sethi     %hi(0x0000ffff), local1
2701          sll       local3, 8, local2
2702
2703          xor       out5, local3, out5
2704
2705          srl       out5, 2, local3
2706          xor       in5, local2, in5
2707          xor       local3, in5, local3
2708          or        local1, %lo(0x0000ffff), local1
2709          and       local3, local4, local3
2710          sethi     %hi(0x0f0f0f0f), local4
2711          sll       local3, 2, local2
2712
2713
2714          xor       in5, local3, in5
2715
2716
2717          srl       in5, 16, local3
2718          xor       out5, local2, out5
2719          xor       local3, out5, local3
2720          or        local4, %lo(0x0f0f0f0f), local4
2721          and       local3, local1, local3
2722          sll       local3, 16, local2
2723
2724          xor       out5, local3, local1
2725
2726          srl       local1, 4, local3
2727          xor       in5, local2, in5
2728          xor       local3, in5, local3
2729          and       local3, local4, local3
2730          sll       local3, 4, local2
2731
2732          xor       in5, local3, in5
2733
2734          ! optional store:
2735
2736
2737
2738          xor       local1, local2, out5
2739
2740
2741
2742
2743
2744
2745
2746! store_little_endian
2747! in1 in5 out5 local3 .SLE1
2748
2749          ! rightmost in register to first in memory
2750
2751.SLE1:
2752          and       in5, 255, local3
2753          stub      local3, [in1+0]
2754
2755          srl       in5, 8, local3
2756          and       local3, 255, local3
2757          stub      local3, [in1+1]
2758
2759          srl       in5, 16, local3
2760          and       local3, 255, local3
2761          stub      local3, [in1+2]
2762
2763          srl       in5, 24, local3
2764          stub      local3, [in1+3]
2765
2766
2767          and       out5, 255, local3
2768          stub      local3, [in1+0+4]
2769
2770          srl       out5, 8, local3
2771          and       local3, 255, local3
2772          stub      local3, [in1+1+4]
2773
2774          srl       out5, 16, local3
2775          and       local3, 255, local3
2776          stub      local3, [in1+2+4]
2777
2778          srl       out5, 24, local3
2779          stub      local3, [in1+3+4]
2780
2781.SLE1a:
2782
2783  ! block
2784
2785          addcc   in2, -8, in2              ! bytes missing when next block done
2786
2787          bpos      .ncbc.enc.next.block
2788          add       in1, 8, in1
2789
2790.ncbc.enc.seven.or.less:
2791
2792          cmp       in2, -8
2793
2794          ble       .ncbc.enc.finish
2795          nop
2796
2797          add       in2, 8, local1            ! bytes to load
2798
2799          ! addr, length, dest left, dest right, temp, local3, label, ret label
2800
2801
2802! load_n_bytes
2803! in0 local1 local2 local3 .LNB1 .ncbc.enc.next.block_1 .LNB1 .ncbc.enc.next.block_1
2804
2805.LNB1.0:  call      .+8
2806          sll       local1, 2, local3
2807
2808          add       %o7,.LNB1.jmp.table-.LNB1.0,local2
2809
2810          add       local2, local3, local2
2811          mov       0, out4
2812
2813          ld        [local2], local2
2814
2815          jmp       %o7+local2
2816          mov       0, global4
2817
2818.LNB1.7:
2819          ldub      [in0+6], local2
2820          sll       local2, 16, local2
2821          or        global4, local2, global4
2822.LNB1.6:
2823          ldub      [in0+5], local2
2824          sll       local2, 8, local2
2825          or        global4, local2, global4
2826.LNB1.5:
2827          ldub      [in0+4], local2
2828          or        global4, local2, global4
2829.LNB1.4:
2830          ldub      [in0+3], local2
2831          sll       local2, 24, local2
2832          or        out4, local2, out4
2833.LNB1.3:
2834          ldub      [in0+2], local2
2835          sll       local2, 16, local2
2836          or        out4, local2, out4
2837.LNB1.2:
2838          ldub      [in0+1], local2
2839          sll       local2, 8, local2
2840          or        out4, local2, out4
2841.LNB1.1:
2842          ldub      [in0+0], local2
2843          ba        .ncbc.enc.next.block_1
2844          or        out4, local2, out4
2845
2846          .align 4
2847
2848.LNB1.jmp.table:
2849          .word     0
2850          .word     .LNB1.1-.LNB1.0
2851          .word     .LNB1.2-.LNB1.0
2852          .word     .LNB1.3-.LNB1.0
2853          .word     .LNB1.4-.LNB1.0
2854          .word     .LNB1.5-.LNB1.0
2855          .word     .LNB1.6-.LNB1.0
2856          .word     .LNB1.7-.LNB1.0
2857
2858
2859          ! Loads 1 to 7 bytes little endian to global4, out4
2860
2861
2862.ncbc.enc.finish:
2863
2864          LDPTR      [%sp+BIAS+ARG0+4*ARGSZ] , local4
2865
2866
2867! store_little_endian
2868! local4 in5 out5 local5 .SLE2
2869
2870          ! rightmost in register to first in memory
2871
2872.SLE2:
2873          and       in5, 255, local5
2874          stub      local5, [local4+0]
2875
2876          srl       in5, 8, local5
2877          and       local5, 255, local5
2878          stub      local5, [local4+1]
2879
2880          srl       in5, 16, local5
2881          and       local5, 255, local5
2882          stub      local5, [local4+2]
2883
2884          srl       in5, 24, local5
2885          stub      local5, [local4+3]
2886
2887
2888          and       out5, 255, local5
2889          stub      local5, [local4+0+4]
2890
2891          srl       out5, 8, local5
2892          and       local5, 255, local5
2893          stub      local5, [local4+1+4]
2894
2895          srl       out5, 16, local5
2896          and       local5, 255, local5
2897          stub      local5, [local4+2+4]
2898
2899          srl       out5, 24, local5
2900          stub      local5, [local4+3+4]
2901
2902.SLE2a:
2903
2904  ! ivec
2905
2906          ret
2907          restore
2908
2909
2910.ncbc.dec:
2911
2912          STPTR     in0,  [%sp+BIAS+ARG0+0*ARGSZ]
2913          cmp       in2, 0                    ! length
2914          add       in3, 120, in3
2915
2916          LDPTR      [%sp+BIAS+ARG0+4*ARGSZ] , local7              ! ivec
2917          ble       .ncbc.dec.finish
2918          mov       in3, in4                  ! schedule
2919
2920          STPTR     in1,  [%sp+BIAS+ARG0+1*ARGSZ]
2921          mov       in0, local5               ! input
2922
2923
2924
2925! load_little_endian
2926! local7 in0 in1 local3 .LLE3
2927
2928          ! first in memory to rightmost in register
2929
2930.LLE3:
2931          ldub      [local7+3], in0
2932
2933          ldub      [local7+2], local3
2934          sll       in0, 8, in0
2935          or        in0, local3, in0
2936
2937          ldub      [local7+1], local3
2938          sll       in0, 8, in0
2939          or        in0, local3, in0
2940
2941          ldub      [local7+0], local3
2942          sll       in0, 8, in0
2943          or        in0, local3, in0
2944
2945
2946          ldub      [local7+3+4], in1
2947
2948          ldub      [local7+2+4], local3
2949          sll       in1, 8, in1
2950          or        in1, local3, in1
2951
2952          ldub      [local7+1+4], local3
2953          sll       in1, 8, in1
2954          or        in1, local3, in1
2955
2956          ldub      [local7+0+4], local3
2957          sll       in1, 8, in1
2958          or        in1, local3, in1
2959.LLE3a:
2960
2961   ! ivec
2962
2963.ncbc.dec.next.block:
2964
2965
2966
2967! load_little_endian
2968! local5 in5 out5 local3 .LLE4
2969
2970          ! first in memory to rightmost in register
2971
2972.LLE4:
2973          ldub      [local5+3], in5
2974
2975          ldub      [local5+2], local3
2976          sll       in5, 8, in5
2977          or        in5, local3, in5
2978
2979          ldub      [local5+1], local3
2980          sll       in5, 8, in5
2981          or        in5, local3, in5
2982
2983          ldub      [local5+0], local3
2984          sll       in5, 8, in5
2985          or        in5, local3, in5
2986
2987
2988          ldub      [local5+3+4], out5
2989
2990          ldub      [local5+2+4], local3
2991          sll       out5, 8, out5
2992          or        out5, local3, out5
2993
2994          ldub      [local5+1+4], local3
2995          sll       out5, 8, out5
2996          or        out5, local3, out5
2997
2998          ldub      [local5+0+4], local3
2999          sll       out5, 8, out5
3000          or        out5, local3, out5
3001.LLE4a:
3002
3003  ! block
3004
3005          ! parameter 6  1/2 for include encryption/decryption
3006          ! parameter 7  1 for mov in1 to in3
3007          ! parameter 8  1 for mov in3 to in4
3008
3009
3010
3011! ip_macro
3012! in5 out5 in5 out5 in4 2 0 1
3013
3014          ld        [out2+256], local1
3015          srl       out5, 4, local4
3016
3017          xor       local4, in5, local4
3018          nop
3019
3020          ld        [out2+260], local2
3021          and       local4, local1, local4
3022          mov in3, in4
3023
3024
3025          ld        [out2+280], out4          ! loop counter
3026          sll       local4, 4, local1
3027          xor       in5, local4, in5
3028
3029          ld        [out2+264], local3
3030          srl       in5, 16, local4
3031          xor       out5, local1, out5
3032
3033
3034          xor       local4, out5, local4
3035          nop       !sethi    %hi(DES_SPtrans), global1 ! sbox addr
3036
3037
3038          and       local4, local2, local4
3039          nop       !or       global1, %lo(DES_SPtrans), global1   ! sbox addr
3040
3041          sll       local4, 16, local1
3042          xor       out5, local4, out5
3043
3044          srl       out5, 2, local4
3045          xor       in5, local1, in5
3046
3047          sethi     %hi(16711680), local5
3048          xor       local4, in5, local4
3049
3050          and       local4, local3, local4
3051          or        local5, 255, local5
3052
3053          sll       local4, 2, local2
3054          xor       in5, local4, in5
3055
3056          srl       in5, 8, local4
3057          xor       out5, local2, out5
3058
3059          xor       local4, out5, local4
3060          add       global1, 768, global4
3061
3062          and       local4, local5, local4
3063          add       global1, 1024, global5
3064
3065          ld        [out2+272], local7
3066          sll       local4, 8, local1
3067          xor       out5, local4, out5
3068
3069          srl       out5, 1, local4
3070          xor       in5, local1, in5
3071
3072          ld        [in4], out0                ! key 7531
3073          xor       local4, in5, local4
3074          add       global1, 256, global2
3075
3076          ld        [in4+4], out1              ! key 8642
3077          and       local4, local7, local4
3078          add       global1, 512, global3
3079
3080          sll       local4, 1, local1
3081          xor       in5, local4, in5
3082
3083          sll       in5, 3, local3
3084          xor       out5, local1, out5
3085
3086          sll       out5, 3, local2
3087          add       global1, 1280, local6     ! address sbox 8
3088
3089          srl       in5, 29, local4
3090          add       global1, 1792, out3       ! address sbox 8
3091
3092          srl       out5, 29, local1
3093          or        local4, local3, in5
3094
3095          or        local2, local1, out5
3096
3097
3098
3099
3100
3101                    ld        [out2+284], local5     ! 0x0000FC00 used in the rounds
3102                    or        local2, local1, out5
3103                    xor       in5, out0, local1
3104
3105                    call .des_dec.1
3106                    and       local1, 252, local1
3107
3108
3109 ! include decryption  ks in4
3110
3111
3112
3113! fp_macro
3114! out5 in5 0 1
3115
3116          ! initially undo the rotate 3 left done after initial permutation
3117          ! original left is received shifted 3 right and 29 left in local3/4
3118
3119          sll       in5, 29, local1
3120          or        local3, local4, out5
3121
3122          srl       in5, 3, in5
3123          sethi     %hi(0x55555555), local2
3124
3125          or        in5, local1, in5
3126          or        local2, %lo(0x55555555), local2
3127
3128          srl       in5, 1, local3
3129          sethi     %hi(0x00ff00ff), local1
3130          xor       local3, out5, local3
3131          or        local1, %lo(0x00ff00ff), local1
3132          and       local3, local2, local3
3133          sethi     %hi(0x33333333), local4
3134          sll       local3, 1, local2
3135
3136          xor       out5, local3, out5
3137
3138          srl       out5, 8, local3
3139          xor       in5, local2, in5
3140          xor       local3, in5, local3
3141          or        local4, %lo(0x33333333), local4
3142          and       local3, local1, local3
3143          sethi     %hi(0x0000ffff), local1
3144          sll       local3, 8, local2
3145
3146          xor       in5, local3, in5
3147
3148          srl       in5, 2, local3
3149          xor       out5, local2, out5
3150          xor       local3, out5, local3
3151          or        local1, %lo(0x0000ffff), local1
3152          and       local3, local4, local3
3153          sethi     %hi(0x0f0f0f0f), local4
3154          sll       local3, 2, local2
3155
3156          LDPTR  [%sp+BIAS+ARG0+0*ARGSZ] , local5
3157          xor       out5, local3, out5
3158
3159          LDPTR  [%sp+BIAS+ARG0+1*ARGSZ] , local7
3160          srl       out5, 16, local3
3161          xor       in5, local2, in5
3162          xor       local3, in5, local3
3163          or        local4, %lo(0x0f0f0f0f), local4
3164          and       local3, local1, local3
3165          sll       local3, 16, local2
3166
3167          xor       in5, local3, local1
3168
3169          srl       local1, 4, local3
3170          xor       out5, local2, out5
3171          xor       local3, out5, local3
3172          and       local3, local4, local3
3173          sll       local3, 4, local2
3174
3175          xor       out5, local3, out5
3176
3177          ! optional store:
3178
3179
3180
3181          xor       local1, local2, in5
3182
3183
3184
3185 ! 1 for input and output address to local5/7
3186
3187          ! in2 is bytes left to be stored
3188          ! in2 is compared to 8 in the rounds
3189
3190          xor       out5, in0, out4           ! iv xor
3191          bl        .ncbc.dec.seven.or.less
3192          xor       in5, in1, global4         ! iv xor
3193
3194          ! Load ivec next block now, since input and output address might be the same.
3195
3196
3197
3198! load_little_endian_inc
3199! local5 in0 in1 local3 .LLE5
3200
3201          ! first in memory to rightmost in register
3202
3203.LLE5:
3204          ldub      [local5+3], in0
3205
3206          ldub      [local5+2], local3
3207          sll       in0, 8, in0
3208          or        in0, local3, in0
3209
3210          ldub      [local5+1], local3
3211          sll       in0, 8, in0
3212          or        in0, local3, in0
3213
3214          ldub      [local5+0], local3
3215          sll       in0, 8, in0
3216          or        in0, local3, in0
3217
3218          ldub      [local5+3+4], in1
3219          add       local5, 8, local5
3220
3221          ldub      [local5+2+4-8], local3
3222          sll       in1, 8, in1
3223          or        in1, local3, in1
3224
3225          ldub      [local5+1+4-8], local3
3226          sll       in1, 8, in1
3227          or        in1, local3, in1
3228
3229          ldub      [local5+0+4-8], local3
3230          sll       in1, 8, in1
3231          or        in1, local3, in1
3232.LLE5a:
3233
3234  ! iv
3235
3236
3237
3238! store_little_endian
3239! local7 out4 global4 local3 .SLE3
3240
3241          ! rightmost in register to first in memory
3242
3243.SLE3:
3244          and       out4, 255, local3
3245          stub      local3, [local7+0]
3246
3247          srl       out4, 8, local3
3248          and       local3, 255, local3
3249          stub      local3, [local7+1]
3250
3251          srl       out4, 16, local3
3252          and       local3, 255, local3
3253          stub      local3, [local7+2]
3254
3255          srl       out4, 24, local3
3256          stub      local3, [local7+3]
3257
3258
3259          and       global4, 255, local3
3260          stub      local3, [local7+0+4]
3261
3262          srl       global4, 8, local3
3263          and       local3, 255, local3
3264          stub      local3, [local7+1+4]
3265
3266          srl       global4, 16, local3
3267          and       local3, 255, local3
3268          stub      local3, [local7+2+4]
3269
3270          srl       global4, 24, local3
3271          stub      local3, [local7+3+4]
3272
3273.SLE3a:
3274
3275
3276
3277          STPTR     local5,  [%sp+BIAS+ARG0+0*ARGSZ]
3278          add       local7, 8, local7
3279          addcc   in2, -8, in2
3280
3281          bg        .ncbc.dec.next.block
3282          STPTR     local7,  [%sp+BIAS+ARG0+1*ARGSZ]
3283
3284
3285.ncbc.dec.store.iv:
3286
3287          LDPTR      [%sp+BIAS+ARG0+4*ARGSZ] , local4              ! ivec
3288
3289
3290! store_little_endian
3291! local4 in0 in1 local5 .SLE4
3292
3293          ! rightmost in register to first in memory
3294
3295.SLE4:
3296          and       in0, 255, local5
3297          stub      local5, [local4+0]
3298
3299          srl       in0, 8, local5
3300          and       local5, 255, local5
3301          stub      local5, [local4+1]
3302
3303          srl       in0, 16, local5
3304          and       local5, 255, local5
3305          stub      local5, [local4+2]
3306
3307          srl       in0, 24, local5
3308          stub      local5, [local4+3]
3309
3310
3311          and       in1, 255, local5
3312          stub      local5, [local4+0+4]
3313
3314          srl       in1, 8, local5
3315          and       local5, 255, local5
3316          stub      local5, [local4+1+4]
3317
3318          srl       in1, 16, local5
3319          and       local5, 255, local5
3320          stub      local5, [local4+2+4]
3321
3322          srl       in1, 24, local5
3323          stub      local5, [local4+3+4]
3324
3325.SLE4a:
3326
3327
3328
3329.ncbc.dec.finish:
3330
3331          ret
3332          restore
3333
3334.ncbc.dec.seven.or.less:
3335
3336
3337
3338! load_little_endian_inc
3339! local5 in0 in1 local3 .LLE13
3340
3341          ! first in memory to rightmost in register
3342
3343.LLE13:
3344          ldub      [local5+3], in0
3345
3346          ldub      [local5+2], local3
3347          sll       in0, 8, in0
3348          or        in0, local3, in0
3349
3350          ldub      [local5+1], local3
3351          sll       in0, 8, in0
3352          or        in0, local3, in0
3353
3354          ldub      [local5+0], local3
3355          sll       in0, 8, in0
3356          or        in0, local3, in0
3357
3358          ldub      [local5+3+4], in1
3359          add       local5, 8, local5
3360
3361          ldub      [local5+2+4-8], local3
3362          sll       in1, 8, in1
3363          or        in1, local3, in1
3364
3365          ldub      [local5+1+4-8], local3
3366          sll       in1, 8, in1
3367          or        in1, local3, in1
3368
3369          ldub      [local5+0+4-8], local3
3370          sll       in1, 8, in1
3371          or        in1, local3, in1
3372.LLE13a:
3373
3374     ! ivec
3375
3376
3377
3378! store_n_bytes
3379! local7 in2 local3 local4 .SNB1 .ncbc.dec.store.iv .SNB1 .ncbc.dec.store.iv
3380
3381.SNB1.0:  call      .+8
3382          sll       in2, 2, local4
3383
3384          add       %o7,.SNB1.jmp.table-.SNB1.0,local3
3385
3386          add       local3, local4, local3
3387
3388          ld        [local3], local3
3389
3390          jmp       %o7+local3
3391          nop
3392
3393.SNB1.7:
3394          srl       global4, 16, local3
3395          and       local3, 0xff, local3
3396          stub      local3, [local7+6]
3397.SNB1.6:
3398          srl       global4, 8, local3
3399          and       local3, 0xff, local3
3400          stub      local3, [local7+5]
3401.SNB1.5:
3402          and       global4, 0xff, local3
3403          stub      local3, [local7+4]
3404.SNB1.4:
3405          srl       out4, 24, local3
3406          stub      local3, [local7+3]
3407.SNB1.3:
3408          srl       out4, 16, local3
3409          and       local3, 0xff, local3
3410          stub      local3, [local7+2]
3411.SNB1.2:
3412          srl       out4, 8, local3
3413          and       local3, 0xff, local3
3414          stub      local3, [local7+1]
3415.SNB1.1:
3416          and       out4, 0xff, local3
3417
3418
3419          ba        .ncbc.dec.store.iv
3420          stub      local3, [local7]
3421
3422          .align 4
3423
3424.SNB1.jmp.table:
3425
3426          .word     0
3427          .word     .SNB1.1-.SNB1.0
3428          .word     .SNB1.2-.SNB1.0
3429          .word     .SNB1.3-.SNB1.0
3430          .word     .SNB1.4-.SNB1.0
3431          .word     .SNB1.5-.SNB1.0
3432          .word     .SNB1.6-.SNB1.0
3433          .word     .SNB1.7-.SNB1.0
3434
3435
3436
3437.DES_ncbc_encrypt.end:
3438          .size      DES_ncbc_encrypt, .DES_ncbc_encrypt.end-DES_ncbc_encrypt
3439
3440
3441! void DES_ede3_cbc_encrypt(input, output, length, ks1, ks2, ks3, ivec, enc)
3442! **************************************************************************
3443
3444
3445          .align 32
3446          .global DES_ede3_cbc_encrypt
3447          .type      DES_ede3_cbc_encrypt,#function
3448
3449DES_ede3_cbc_encrypt:
3450
3451          save      %sp, FRAME, %sp
3452
3453
3454
3455
3456
3457          sethi     %hi(_PIC_DES_SPtrans-1f),global1
3458          or        global1,%lo(_PIC_DES_SPtrans-1f),global1
34591:        call      .+8
3460          add       %o7,global1,global1
3461          sub       global1,_PIC_DES_SPtrans-.des_and,out2
3462
3463          LDPTR     [%fp+BIAS+ARG0+7*ARGSZ], local3          ! enc
3464          LDPTR     [%fp+BIAS+ARG0+6*ARGSZ], local4          ! ivec
3465          cmp       local3, 0                 ! enc
3466
3467          be        .ede3.dec
3468          STPTR     in4,  [%sp+BIAS+ARG0+4*ARGSZ]
3469
3470          STPTR     in5,  [%sp+BIAS+ARG0+5*ARGSZ]
3471
3472
3473
3474! load_little_endian
3475! local4 in5 out5 local3 .LLE6
3476
3477          ! first in memory to rightmost in register
3478
3479.LLE6:
3480          ldub      [local4+3], in5
3481
3482          ldub      [local4+2], local3
3483          sll       in5, 8, in5
3484          or        in5, local3, in5
3485
3486          ldub      [local4+1], local3
3487          sll       in5, 8, in5
3488          or        in5, local3, in5
3489
3490          ldub      [local4+0], local3
3491          sll       in5, 8, in5
3492          or        in5, local3, in5
3493
3494
3495          ldub      [local4+3+4], out5
3496
3497          ldub      [local4+2+4], local3
3498          sll       out5, 8, out5
3499          or        out5, local3, out5
3500
3501          ldub      [local4+1+4], local3
3502          sll       out5, 8, out5
3503          or        out5, local3, out5
3504
3505          ldub      [local4+0+4], local3
3506          sll       out5, 8, out5
3507          or        out5, local3, out5
3508.LLE6a:
3509
3510  ! ivec
3511
3512          addcc     in2, -8, in2              ! bytes missing after next block
3513
3514          bl        .ede3.enc.seven.or.less
3515          STPTR     in3,  [%sp+BIAS+ARG0+3*ARGSZ]
3516
3517.ede3.enc.next.block:
3518
3519
3520
3521! load_little_endian
3522! in0 out4 global4 local3 .LLE7
3523
3524          ! first in memory to rightmost in register
3525
3526.LLE7:
3527          ldub      [in0+3], out4
3528
3529          ldub      [in0+2], local3
3530          sll       out4, 8, out4
3531          or        out4, local3, out4
3532
3533          ldub      [in0+1], local3
3534          sll       out4, 8, out4
3535          or        out4, local3, out4
3536
3537          ldub      [in0+0], local3
3538          sll       out4, 8, out4
3539          or        out4, local3, out4
3540
3541
3542          ldub      [in0+3+4], global4
3543
3544          ldub      [in0+2+4], local3
3545          sll       global4, 8, global4
3546          or        global4, local3, global4
3547
3548          ldub      [in0+1+4], local3
3549          sll       global4, 8, global4
3550          or        global4, local3, global4
3551
3552          ldub      [in0+0+4], local3
3553          sll       global4, 8, global4
3554          or        global4, local3, global4
3555.LLE7a:
3556
3557
3558
3559.ede3.enc.next.block_1:
3560
3561          LDPTR      [%sp+BIAS+ARG0+4*ARGSZ] , in4
3562          xor       in5, out4, in5            ! iv xor
3563          xor       out5, global4, out5       ! iv xor
3564
3565          LDPTR      [%sp+BIAS+ARG0+3*ARGSZ] , in3
3566          add       in4, 120, in4             ! for decryption we use last subkey first
3567          nop
3568
3569
3570
3571! ip_macro
3572! in5 out5 out5 in5 in3
3573
3574          ld        [out2+256], local1
3575          srl       out5, 4, local4
3576
3577          xor       local4, in5, local4
3578          nop
3579
3580          ld        [out2+260], local2
3581          and       local4, local1, local4
3582
3583
3584
3585          ld        [out2+280], out4          ! loop counter
3586          sll       local4, 4, local1
3587          xor       in5, local4, in5
3588
3589          ld        [out2+264], local3
3590          srl       in5, 16, local4
3591          xor       out5, local1, out5
3592
3593
3594          xor       local4, out5, local4
3595          nop       !sethi    %hi(DES_SPtrans), global1 ! sbox addr
3596
3597
3598          and       local4, local2, local4
3599          nop       !or       global1, %lo(DES_SPtrans), global1   ! sbox addr
3600
3601          sll       local4, 16, local1
3602          xor       out5, local4, out5
3603
3604          srl       out5, 2, local4
3605          xor       in5, local1, in5
3606
3607          sethi     %hi(16711680), local5
3608          xor       local4, in5, local4
3609
3610          and       local4, local3, local4
3611          or        local5, 255, local5
3612
3613          sll       local4, 2, local2
3614          xor       in5, local4, in5
3615
3616          srl       in5, 8, local4
3617          xor       out5, local2, out5
3618
3619          xor       local4, out5, local4
3620          add       global1, 768, global4
3621
3622          and       local4, local5, local4
3623          add       global1, 1024, global5
3624
3625          ld        [out2+272], local7
3626          sll       local4, 8, local1
3627          xor       out5, local4, out5
3628
3629          srl       out5, 1, local4
3630          xor       in5, local1, in5
3631
3632          ld        [in3], out0                ! key 7531
3633          xor       local4, in5, local4
3634          add       global1, 256, global2
3635
3636          ld        [in3+4], out1              ! key 8642
3637          and       local4, local7, local4
3638          add       global1, 512, global3
3639
3640          sll       local4, 1, local1
3641          xor       in5, local4, in5
3642
3643          sll       in5, 3, local3
3644          xor       out5, local1, out5
3645
3646          sll       out5, 3, local2
3647          add       global1, 1280, local6     ! address sbox 8
3648
3649          srl       in5, 29, local4
3650          add       global1, 1792, out3       ! address sbox 8
3651
3652          srl       out5, 29, local1
3653          or        local4, local3, out5
3654
3655          or        local2, local1, in5
3656
3657
3658
3659
3660
3661
3662.ede3.enc.next.block_2:
3663
3664          call .des_enc                     ! ks1 in3
3665          nop
3666
3667          call .des_dec                     ! ks2 in4
3668          LDPTR      [%sp+BIAS+ARG0+5*ARGSZ] , in3
3669
3670          call .des_enc                     ! ks3 in3  compares in2 to 8
3671          nop
3672
3673          bl        .ede3.enc.next.block_fp
3674          add       in0, 8, in0
3675
3676          ! If 8 or more bytes are to be encrypted after this block,
3677          ! we combine final permutation for this block with initial
3678          ! permutation for next block. Load next block:
3679
3680
3681
3682! load_little_endian
3683! in0 global3 global4 local5 .LLE11
3684
3685          ! first in memory to rightmost in register
3686
3687.LLE11:
3688          ldub      [in0+3], global3
3689
3690          ldub      [in0+2], local5
3691          sll       global3, 8, global3
3692          or        global3, local5, global3
3693
3694          ldub      [in0+1], local5
3695          sll       global3, 8, global3
3696          or        global3, local5, global3
3697
3698          ldub      [in0+0], local5
3699          sll       global3, 8, global3
3700          or        global3, local5, global3
3701
3702
3703          ldub      [in0+3+4], global4
3704
3705          ldub      [in0+2+4], local5
3706          sll       global4, 8, global4
3707          or        global4, local5, global4
3708
3709          ldub      [in0+1+4], local5
3710          sll       global4, 8, global4
3711          or        global4, local5, global4
3712
3713          ldub      [in0+0+4], local5
3714          sll       global4, 8, global4
3715          or        global4, local5, global4
3716.LLE11a:
3717
3718
3719
3720          !  parameter 1   original left
3721          !  parameter 2   original right
3722          !  parameter 3   left ip
3723          !  parameter 4   right ip
3724          !  parameter 5   1: load ks1/ks2 to in3/in4, add 120 to in4
3725          !                2: mov in4 to in3
3726          !
3727          ! also adds -8 to length in2 and loads loop counter to out4
3728
3729
3730
3731! fp_ip_macro
3732! out0 out1 global3 global4 1
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742          ! out0 in local3, local4
3743
3744          ld        [out2+256], local1
3745          sll       out5, 29, out4
3746          or        local3, local4, out0
3747
3748          srl       out5, 3, out1
3749
3750
3751          ld        [out2+272], local5
3752          srl       global4, 4, local0
3753          or        out1, out4, out1
3754
3755          srl       out1, 1, out4
3756          xor       out4, out0, out4
3757
3758          and       out4, local5, out4
3759          xor       local0, global3, local0
3760
3761          sll       out4, 1, local3
3762          xor       out0, out4, out0
3763
3764          and       local0, local1, local0
3765          add       in2, -8, in2
3766
3767          sll       local0, 4, local7
3768          xor       global3, local0, global3
3769
3770          ld        [out2+268], local4
3771          srl       out0, 8, out4
3772          xor       out1, local3, out1
3773          ld        [out2+260], local2
3774          srl       global3, 16, local0
3775          xor       global4, local7, global4
3776          xor       out4, out1, out4
3777          xor       local0, global4, local0
3778          and       out4, local4, out4
3779          and       local0, local2, local0
3780          sll       out4, 8, local3
3781          xor       out1, out4, out1
3782          sll       local0, 16, local7
3783          xor       global4, local0, global4
3784
3785          srl       out1, 2, out4
3786          xor       out0, local3, out0
3787
3788          ld        [out2+264], local3         ! ip3
3789          srl       global4, 2, local0
3790          xor       global3, local7, global3
3791          xor       out4, out0, out4
3792          xor       local0, global3, local0
3793          and       out4, local3, out4
3794          and       local0, local3, local0
3795          sll       out4, 2, local3
3796          xor       out0, out4, out0
3797          sll       local0, 2, local7
3798          xor       global3, local0, global3
3799
3800          srl       out0, 16, out4
3801          xor       out1, local3, out1
3802          srl       global3, 8, local0
3803          xor       global4, local7, global4
3804          xor       out4, out1, out4
3805          xor       local0, global4, local0
3806          and       out4, local2, out4
3807          and       local0, local4, local0
3808          sll       out4, 16, local3
3809          xor       out1, out4, local4
3810          sll       local0, 8, local7
3811          xor       global4, local0, global4
3812
3813          srl       global4, 1, local0
3814          xor       global3, local7, global3
3815
3816          srl       local4, 4, out4
3817          xor       local0, global3, local0
3818
3819          xor       out0, local3, out0
3820          and       local0, local5, local0
3821
3822          sll       local0, 1, local7
3823          xor       out4, out0, out4
3824
3825          xor       global3, local0, global3
3826          xor       global4, local7, global4
3827
3828          sll       global3, 3, local5
3829          and       out4, local1, out4
3830
3831          sll       out4, 4, local3
3832          xor       out0, out4, out0
3833
3834          LDPTR      [%sp+BIAS+ARG0+4*ARGSZ] , in4
3835          sll       global4, 3, local2
3836          xor       local4, local3, out1
3837
3838          ! reload since used as temporary:
3839
3840          ld        [out2+280], out4          ! loop counter
3841
3842          srl       global3, 29, local0
3843          add in4, 120, in4
3844
3845          LDPTR      [%sp+BIAS+ARG0+3*ARGSZ] , in3
3846          srl       global4, 29, local7
3847
3848          or        local0, local5, global4
3849          or        local2, local7, global3
3850
3851
3852
3853
3854
3855! store_little_endian
3856! in1 out0 out1 local3 .SLE9
3857
3858          ! rightmost in register to first in memory
3859
3860.SLE9:
3861          and       out0, 255, local3
3862          stub      local3, [in1+0]
3863
3864          srl       out0, 8, local3
3865          and       local3, 255, local3
3866          stub      local3, [in1+1]
3867
3868          srl       out0, 16, local3
3869          and       local3, 255, local3
3870          stub      local3, [in1+2]
3871
3872          srl       out0, 24, local3
3873          stub      local3, [in1+3]
3874
3875
3876          and       out1, 255, local3
3877          stub      local3, [in1+0+4]
3878
3879          srl       out1, 8, local3
3880          and       local3, 255, local3
3881          stub      local3, [in1+1+4]
3882
3883          srl       out1, 16, local3
3884          and       local3, 255, local3
3885          stub      local3, [in1+2+4]
3886
3887          srl       out1, 24, local3
3888          stub      local3, [in1+3+4]
3889
3890.SLE9a:
3891
3892  ! block
3893
3894          mov       in5, local1
3895          xor       global3, out5, in5        ! iv xor next block
3896
3897          ld        [in3], out0               ! key 7531
3898          add       global1, 512, global3     ! address sbox 3
3899          xor       global4, local1, out5     ! iv xor next block
3900
3901          ld        [in3+4], out1             ! key 8642
3902          add       global1, 768, global4     ! address sbox 4
3903          ba        .ede3.enc.next.block_2
3904          add       in1, 8, in1
3905
3906.ede3.enc.next.block_fp:
3907
3908
3909
3910! fp_macro
3911! in5 out5
3912
3913          ! initially undo the rotate 3 left done after initial permutation
3914          ! original left is received shifted 3 right and 29 left in local3/4
3915
3916          sll       out5, 29, local1
3917          or        local3, local4, in5
3918
3919          srl       out5, 3, out5
3920          sethi     %hi(0x55555555), local2
3921
3922          or        out5, local1, out5
3923          or        local2, %lo(0x55555555), local2
3924
3925          srl       out5, 1, local3
3926          sethi     %hi(0x00ff00ff), local1
3927          xor       local3, in5, local3
3928          or        local1, %lo(0x00ff00ff), local1
3929          and       local3, local2, local3
3930          sethi     %hi(0x33333333), local4
3931          sll       local3, 1, local2
3932
3933          xor       in5, local3, in5
3934
3935          srl       in5, 8, local3
3936          xor       out5, local2, out5
3937          xor       local3, out5, local3
3938          or        local4, %lo(0x33333333), local4
3939          and       local3, local1, local3
3940          sethi     %hi(0x0000ffff), local1
3941          sll       local3, 8, local2
3942
3943          xor       out5, local3, out5
3944
3945          srl       out5, 2, local3
3946          xor       in5, local2, in5
3947          xor       local3, in5, local3
3948          or        local1, %lo(0x0000ffff), local1
3949          and       local3, local4, local3
3950          sethi     %hi(0x0f0f0f0f), local4
3951          sll       local3, 2, local2
3952
3953
3954          xor       in5, local3, in5
3955
3956
3957          srl       in5, 16, local3
3958          xor       out5, local2, out5
3959          xor       local3, out5, local3
3960          or        local4, %lo(0x0f0f0f0f), local4
3961          and       local3, local1, local3
3962          sll       local3, 16, local2
3963
3964          xor       out5, local3, local1
3965
3966          srl       local1, 4, local3
3967          xor       in5, local2, in5
3968          xor       local3, in5, local3
3969          and       local3, local4, local3
3970          sll       local3, 4, local2
3971
3972          xor       in5, local3, in5
3973
3974          ! optional store:
3975
3976
3977
3978          xor       local1, local2, out5
3979
3980
3981
3982
3983
3984
3985
3986! store_little_endian
3987! in1 in5 out5 local3 .SLE5
3988
3989          ! rightmost in register to first in memory
3990
3991.SLE5:
3992          and       in5, 255, local3
3993          stub      local3, [in1+0]
3994
3995          srl       in5, 8, local3
3996          and       local3, 255, local3
3997          stub      local3, [in1+1]
3998
3999          srl       in5, 16, local3
4000          and       local3, 255, local3
4001          stub      local3, [in1+2]
4002
4003          srl       in5, 24, local3
4004          stub      local3, [in1+3]
4005
4006
4007          and       out5, 255, local3
4008          stub      local3, [in1+0+4]
4009
4010          srl       out5, 8, local3
4011          and       local3, 255, local3
4012          stub      local3, [in1+1+4]
4013
4014          srl       out5, 16, local3
4015          and       local3, 255, local3
4016          stub      local3, [in1+2+4]
4017
4018          srl       out5, 24, local3
4019          stub      local3, [in1+3+4]
4020
4021.SLE5a:
4022
4023  ! block
4024
4025          addcc   in2, -8, in2              ! bytes missing when next block done
4026
4027          bpos      .ede3.enc.next.block
4028          add       in1, 8, in1
4029
4030.ede3.enc.seven.or.less:
4031
4032          cmp       in2, -8
4033
4034          ble       .ede3.enc.finish
4035          nop
4036
4037          add       in2, 8, local1            ! bytes to load
4038
4039          ! addr, length, dest left, dest right, temp, local3, label, ret label
4040
4041
4042! load_n_bytes
4043! in0 local1 local2 local3 .LNB2 .ede3.enc.next.block_1 .LNB2 .ede3.enc.next.block_1
4044
4045.LNB2.0:  call      .+8
4046          sll       local1, 2, local3
4047
4048          add       %o7,.LNB2.jmp.table-.LNB2.0,local2
4049
4050          add       local2, local3, local2
4051          mov       0, out4
4052
4053          ld        [local2], local2
4054
4055          jmp       %o7+local2
4056          mov       0, global4
4057
4058.LNB2.7:
4059          ldub      [in0+6], local2
4060          sll       local2, 16, local2
4061          or        global4, local2, global4
4062.LNB2.6:
4063          ldub      [in0+5], local2
4064          sll       local2, 8, local2
4065          or        global4, local2, global4
4066.LNB2.5:
4067          ldub      [in0+4], local2
4068          or        global4, local2, global4
4069.LNB2.4:
4070          ldub      [in0+3], local2
4071          sll       local2, 24, local2
4072          or        out4, local2, out4
4073.LNB2.3:
4074          ldub      [in0+2], local2
4075          sll       local2, 16, local2
4076          or        out4, local2, out4
4077.LNB2.2:
4078          ldub      [in0+1], local2
4079          sll       local2, 8, local2
4080          or        out4, local2, out4
4081.LNB2.1:
4082          ldub      [in0+0], local2
4083          ba        .ede3.enc.next.block_1
4084          or        out4, local2, out4
4085
4086          .align 4
4087
4088.LNB2.jmp.table:
4089          .word     0
4090          .word     .LNB2.1-.LNB2.0
4091          .word     .LNB2.2-.LNB2.0
4092          .word     .LNB2.3-.LNB2.0
4093          .word     .LNB2.4-.LNB2.0
4094          .word     .LNB2.5-.LNB2.0
4095          .word     .LNB2.6-.LNB2.0
4096          .word     .LNB2.7-.LNB2.0
4097
4098
4099.ede3.enc.finish:
4100
4101          LDPTR     [%fp+BIAS+ARG0+6*ARGSZ], local4          ! ivec
4102
4103
4104! store_little_endian
4105! local4 in5 out5 local5 .SLE6
4106
4107          ! rightmost in register to first in memory
4108
4109.SLE6:
4110          and       in5, 255, local5
4111          stub      local5, [local4+0]
4112
4113          srl       in5, 8, local5
4114          and       local5, 255, local5
4115          stub      local5, [local4+1]
4116
4117          srl       in5, 16, local5
4118          and       local5, 255, local5
4119          stub      local5, [local4+2]
4120
4121          srl       in5, 24, local5
4122          stub      local5, [local4+3]
4123
4124
4125          and       out5, 255, local5
4126          stub      local5, [local4+0+4]
4127
4128          srl       out5, 8, local5
4129          and       local5, 255, local5
4130          stub      local5, [local4+1+4]
4131
4132          srl       out5, 16, local5
4133          and       local5, 255, local5
4134          stub      local5, [local4+2+4]
4135
4136          srl       out5, 24, local5
4137          stub      local5, [local4+3+4]
4138
4139.SLE6a:
4140
4141  ! ivec
4142
4143          ret
4144          restore
4145
4146.ede3.dec:
4147
4148          STPTR     in0,  [%sp+BIAS+ARG0+0*ARGSZ]
4149          add       in5, 120, in5
4150
4151          STPTR     in1,  [%sp+BIAS+ARG0+1*ARGSZ]
4152          mov       in0, local5
4153          add       in3, 120, in3
4154
4155          STPTR     in3,  [%sp+BIAS+ARG0+3*ARGSZ]
4156          cmp       in2, 0
4157
4158          ble       .ede3.dec.finish
4159          STPTR     in5,  [%sp+BIAS+ARG0+5*ARGSZ]
4160
4161          LDPTR     [%fp+BIAS+ARG0+6*ARGSZ], local7          ! iv
4162
4163
4164! load_little_endian
4165! local7 in0 in1 local3 .LLE8
4166
4167          ! first in memory to rightmost in register
4168
4169.LLE8:
4170          ldub      [local7+3], in0
4171
4172          ldub      [local7+2], local3
4173          sll       in0, 8, in0
4174          or        in0, local3, in0
4175
4176          ldub      [local7+1], local3
4177          sll       in0, 8, in0
4178          or        in0, local3, in0
4179
4180          ldub      [local7+0], local3
4181          sll       in0, 8, in0
4182          or        in0, local3, in0
4183
4184
4185          ldub      [local7+3+4], in1
4186
4187          ldub      [local7+2+4], local3
4188          sll       in1, 8, in1
4189          or        in1, local3, in1
4190
4191          ldub      [local7+1+4], local3
4192          sll       in1, 8, in1
4193          or        in1, local3, in1
4194
4195          ldub      [local7+0+4], local3
4196          sll       in1, 8, in1
4197          or        in1, local3, in1
4198.LLE8a:
4199
4200
4201
4202.ede3.dec.next.block:
4203
4204
4205
4206! load_little_endian
4207! local5 in5 out5 local3 .LLE9
4208
4209          ! first in memory to rightmost in register
4210
4211.LLE9:
4212          ldub      [local5+3], in5
4213
4214          ldub      [local5+2], local3
4215          sll       in5, 8, in5
4216          or        in5, local3, in5
4217
4218          ldub      [local5+1], local3
4219          sll       in5, 8, in5
4220          or        in5, local3, in5
4221
4222          ldub      [local5+0], local3
4223          sll       in5, 8, in5
4224          or        in5, local3, in5
4225
4226
4227          ldub      [local5+3+4], out5
4228
4229          ldub      [local5+2+4], local3
4230          sll       out5, 8, out5
4231          or        out5, local3, out5
4232
4233          ldub      [local5+1+4], local3
4234          sll       out5, 8, out5
4235          or        out5, local3, out5
4236
4237          ldub      [local5+0+4], local3
4238          sll       out5, 8, out5
4239          or        out5, local3, out5
4240.LLE9a:
4241
4242
4243
4244          ! parameter 6  1/2 for include encryption/decryption
4245          ! parameter 7  1 for mov in1 to in3
4246          ! parameter 8  1 for mov in3 to in4
4247          ! parameter 9  1 for load ks3 and ks2 to in4 and in3
4248
4249
4250
4251! ip_macro
4252! in5 out5 in5 out5 in4 2 0 0 1
4253
4254          ld        [out2+256], local1
4255          srl       out5, 4, local4
4256
4257          xor       local4, in5, local4
4258          nop
4259
4260          ld        [out2+260], local2
4261          and       local4, local1, local4
4262
4263
4264
4265          ld        [out2+280], out4          ! loop counter
4266          sll       local4, 4, local1
4267          xor       in5, local4, in5
4268
4269          ld        [out2+264], local3
4270          srl       in5, 16, local4
4271          xor       out5, local1, out5
4272
4273          LDPTR      [%sp+BIAS+ARG0+5*ARGSZ] , in4
4274          xor       local4, out5, local4
4275          nop       !sethi    %hi(DES_SPtrans), global1 ! sbox addr
4276
4277          LDPTR      [%sp+BIAS+ARG0+4*ARGSZ] , in3
4278          and       local4, local2, local4
4279          nop       !or       global1, %lo(DES_SPtrans), global1   ! sbox addr
4280
4281          sll       local4, 16, local1
4282          xor       out5, local4, out5
4283
4284          srl       out5, 2, local4
4285          xor       in5, local1, in5
4286
4287          sethi     %hi(16711680), local5
4288          xor       local4, in5, local4
4289
4290          and       local4, local3, local4
4291          or        local5, 255, local5
4292
4293          sll       local4, 2, local2
4294          xor       in5, local4, in5
4295
4296          srl       in5, 8, local4
4297          xor       out5, local2, out5
4298
4299          xor       local4, out5, local4
4300          add       global1, 768, global4
4301
4302          and       local4, local5, local4
4303          add       global1, 1024, global5
4304
4305          ld        [out2+272], local7
4306          sll       local4, 8, local1
4307          xor       out5, local4, out5
4308
4309          srl       out5, 1, local4
4310          xor       in5, local1, in5
4311
4312          ld        [in4], out0                ! key 7531
4313          xor       local4, in5, local4
4314          add       global1, 256, global2
4315
4316          ld        [in4+4], out1              ! key 8642
4317          and       local4, local7, local4
4318          add       global1, 512, global3
4319
4320          sll       local4, 1, local1
4321          xor       in5, local4, in5
4322
4323          sll       in5, 3, local3
4324          xor       out5, local1, out5
4325
4326          sll       out5, 3, local2
4327          add       global1, 1280, local6     ! address sbox 8
4328
4329          srl       in5, 29, local4
4330          add       global1, 1792, out3       ! address sbox 8
4331
4332          srl       out5, 29, local1
4333          or        local4, local3, in5
4334
4335          or        local2, local1, out5
4336
4337
4338
4339
4340
4341                    ld        [out2+284], local5     ! 0x0000FC00 used in the rounds
4342                    or        local2, local1, out5
4343                    xor       in5, out0, local1
4344
4345                    call .des_dec.1
4346                    and       local1, 252, local1
4347
4348
4349 ! inc .des_dec ks3 in4
4350
4351          call .des_enc                     ! ks2 in3
4352          LDPTR      [%sp+BIAS+ARG0+3*ARGSZ] , in4
4353
4354          call .des_dec                     ! ks1 in4
4355          nop
4356
4357
4358
4359! fp_macro
4360! out5 in5 0 1
4361
4362          ! initially undo the rotate 3 left done after initial permutation
4363          ! original left is received shifted 3 right and 29 left in local3/4
4364
4365          sll       in5, 29, local1
4366          or        local3, local4, out5
4367
4368          srl       in5, 3, in5
4369          sethi     %hi(0x55555555), local2
4370
4371          or        in5, local1, in5
4372          or        local2, %lo(0x55555555), local2
4373
4374          srl       in5, 1, local3
4375          sethi     %hi(0x00ff00ff), local1
4376          xor       local3, out5, local3
4377          or        local1, %lo(0x00ff00ff), local1
4378          and       local3, local2, local3
4379          sethi     %hi(0x33333333), local4
4380          sll       local3, 1, local2
4381
4382          xor       out5, local3, out5
4383
4384          srl       out5, 8, local3
4385          xor       in5, local2, in5
4386          xor       local3, in5, local3
4387          or        local4, %lo(0x33333333), local4
4388          and       local3, local1, local3
4389          sethi     %hi(0x0000ffff), local1
4390          sll       local3, 8, local2
4391
4392          xor       in5, local3, in5
4393
4394          srl       in5, 2, local3
4395          xor       out5, local2, out5
4396          xor       local3, out5, local3
4397          or        local1, %lo(0x0000ffff), local1
4398          and       local3, local4, local3
4399          sethi     %hi(0x0f0f0f0f), local4
4400          sll       local3, 2, local2
4401
4402          LDPTR  [%sp+BIAS+ARG0+0*ARGSZ] , local5
4403          xor       out5, local3, out5
4404
4405          LDPTR  [%sp+BIAS+ARG0+1*ARGSZ] , local7
4406          srl       out5, 16, local3
4407          xor       in5, local2, in5
4408          xor       local3, in5, local3
4409          or        local4, %lo(0x0f0f0f0f), local4
4410          and       local3, local1, local3
4411          sll       local3, 16, local2
4412
4413          xor       in5, local3, local1
4414
4415          srl       local1, 4, local3
4416          xor       out5, local2, out5
4417          xor       local3, out5, local3
4418          and       local3, local4, local3
4419          sll       local3, 4, local2
4420
4421          xor       out5, local3, out5
4422
4423          ! optional store:
4424
4425
4426
4427          xor       local1, local2, in5
4428
4429
4430
4431   ! 1 for input and output address local5/7
4432
4433          ! in2 is bytes left to be stored
4434          ! in2 is compared to 8 in the rounds
4435
4436          xor       out5, in0, out4
4437          bl        .ede3.dec.seven.or.less
4438          xor       in5, in1, global4
4439
4440
4441
4442! load_little_endian_inc
4443! local5 in0 in1 local3 .LLE10
4444
4445          ! first in memory to rightmost in register
4446
4447.LLE10:
4448          ldub      [local5+3], in0
4449
4450          ldub      [local5+2], local3
4451          sll       in0, 8, in0
4452          or        in0, local3, in0
4453
4454          ldub      [local5+1], local3
4455          sll       in0, 8, in0
4456          or        in0, local3, in0
4457
4458          ldub      [local5+0], local3
4459          sll       in0, 8, in0
4460          or        in0, local3, in0
4461
4462          ldub      [local5+3+4], in1
4463          add       local5, 8, local5
4464
4465          ldub      [local5+2+4-8], local3
4466          sll       in1, 8, in1
4467          or        in1, local3, in1
4468
4469          ldub      [local5+1+4-8], local3
4470          sll       in1, 8, in1
4471          or        in1, local3, in1
4472
4473          ldub      [local5+0+4-8], local3
4474          sll       in1, 8, in1
4475          or        in1, local3, in1
4476.LLE10a:
4477
4478   ! iv next block
4479
4480
4481
4482! store_little_endian
4483! local7 out4 global4 local3 .SLE7
4484
4485          ! rightmost in register to first in memory
4486
4487.SLE7:
4488          and       out4, 255, local3
4489          stub      local3, [local7+0]
4490
4491          srl       out4, 8, local3
4492          and       local3, 255, local3
4493          stub      local3, [local7+1]
4494
4495          srl       out4, 16, local3
4496          and       local3, 255, local3
4497          stub      local3, [local7+2]
4498
4499          srl       out4, 24, local3
4500          stub      local3, [local7+3]
4501
4502
4503          and       global4, 255, local3
4504          stub      local3, [local7+0+4]
4505
4506          srl       global4, 8, local3
4507          and       local3, 255, local3
4508          stub      local3, [local7+1+4]
4509
4510          srl       global4, 16, local3
4511          and       local3, 255, local3
4512          stub      local3, [local7+2+4]
4513
4514          srl       global4, 24, local3
4515          stub      local3, [local7+3+4]
4516
4517.SLE7a:
4518
4519  ! block
4520
4521          STPTR     local5,  [%sp+BIAS+ARG0+0*ARGSZ]
4522          addcc   in2, -8, in2
4523          add       local7, 8, local7
4524
4525          bg        .ede3.dec.next.block
4526          STPTR     local7,  [%sp+BIAS+ARG0+1*ARGSZ]
4527
4528.ede3.dec.store.iv:
4529
4530          LDPTR     [%fp+BIAS+ARG0+6*ARGSZ], local4          ! ivec
4531
4532
4533! store_little_endian
4534! local4 in0 in1 local5 .SLE8
4535
4536          ! rightmost in register to first in memory
4537
4538.SLE8:
4539          and       in0, 255, local5
4540          stub      local5, [local4+0]
4541
4542          srl       in0, 8, local5
4543          and       local5, 255, local5
4544          stub      local5, [local4+1]
4545
4546          srl       in0, 16, local5
4547          and       local5, 255, local5
4548          stub      local5, [local4+2]
4549
4550          srl       in0, 24, local5
4551          stub      local5, [local4+3]
4552
4553
4554          and       in1, 255, local5
4555          stub      local5, [local4+0+4]
4556
4557          srl       in1, 8, local5
4558          and       local5, 255, local5
4559          stub      local5, [local4+1+4]
4560
4561          srl       in1, 16, local5
4562          and       local5, 255, local5
4563          stub      local5, [local4+2+4]
4564
4565          srl       in1, 24, local5
4566          stub      local5, [local4+3+4]
4567
4568.SLE8a:
4569
4570  ! ivec
4571
4572.ede3.dec.finish:
4573
4574          ret
4575          restore
4576
4577.ede3.dec.seven.or.less:
4578
4579
4580
4581! load_little_endian_inc
4582! local5 in0 in1 local3 .LLE14
4583
4584          ! first in memory to rightmost in register
4585
4586.LLE14:
4587          ldub      [local5+3], in0
4588
4589          ldub      [local5+2], local3
4590          sll       in0, 8, in0
4591          or        in0, local3, in0
4592
4593          ldub      [local5+1], local3
4594          sll       in0, 8, in0
4595          or        in0, local3, in0
4596
4597          ldub      [local5+0], local3
4598          sll       in0, 8, in0
4599          or        in0, local3, in0
4600
4601          ldub      [local5+3+4], in1
4602          add       local5, 8, local5
4603
4604          ldub      [local5+2+4-8], local3
4605          sll       in1, 8, in1
4606          or        in1, local3, in1
4607
4608          ldub      [local5+1+4-8], local3
4609          sll       in1, 8, in1
4610          or        in1, local3, in1
4611
4612          ldub      [local5+0+4-8], local3
4613          sll       in1, 8, in1
4614          or        in1, local3, in1
4615.LLE14a:
4616
4617     ! iv
4618
4619
4620
4621! store_n_bytes
4622! local7 in2 local3 local4 .SNB2 .ede3.dec.store.iv .SNB2 .ede3.dec.store.iv
4623
4624.SNB2.0:  call      .+8
4625          sll       in2, 2, local4
4626
4627          add       %o7,.SNB2.jmp.table-.SNB2.0,local3
4628
4629          add       local3, local4, local3
4630
4631          ld        [local3], local3
4632
4633          jmp       %o7+local3
4634          nop
4635
4636.SNB2.7:
4637          srl       global4, 16, local3
4638          and       local3, 0xff, local3
4639          stub      local3, [local7+6]
4640.SNB2.6:
4641          srl       global4, 8, local3
4642          and       local3, 0xff, local3
4643          stub      local3, [local7+5]
4644.SNB2.5:
4645          and       global4, 0xff, local3
4646          stub      local3, [local7+4]
4647.SNB2.4:
4648          srl       out4, 24, local3
4649          stub      local3, [local7+3]
4650.SNB2.3:
4651          srl       out4, 16, local3
4652          and       local3, 0xff, local3
4653          stub      local3, [local7+2]
4654.SNB2.2:
4655          srl       out4, 8, local3
4656          and       local3, 0xff, local3
4657          stub      local3, [local7+1]
4658.SNB2.1:
4659          and       out4, 0xff, local3
4660
4661
4662          ba        .ede3.dec.store.iv
4663          stub      local3, [local7]
4664
4665          .align 4
4666
4667.SNB2.jmp.table:
4668
4669          .word     0
4670          .word     .SNB2.1-.SNB2.0
4671          .word     .SNB2.2-.SNB2.0
4672          .word     .SNB2.3-.SNB2.0
4673          .word     .SNB2.4-.SNB2.0
4674          .word     .SNB2.5-.SNB2.0
4675          .word     .SNB2.6-.SNB2.0
4676          .word     .SNB2.7-.SNB2.0
4677
4678
4679
4680.DES_ede3_cbc_encrypt.end:
4681          .size      DES_ede3_cbc_encrypt,.DES_ede3_cbc_encrypt.end-DES_ede3_cbc_encrypt
4682
4683          .align    256
4684          .type      .des_and,#object
4685          .size      .des_and,284
4686
4687.des_and:
4688
4689! This table is used for AND 0xFC when it is known that register
4690! bits 8-31 are zero. Makes it possible to do three arithmetic
4691! operations in one cycle.
4692
4693          .byte  0, 0, 0, 0, 4, 4, 4, 4
4694          .byte  8, 8, 8, 8, 12, 12, 12, 12
4695          .byte  16, 16, 16, 16, 20, 20, 20, 20
4696          .byte  24, 24, 24, 24, 28, 28, 28, 28
4697          .byte  32, 32, 32, 32, 36, 36, 36, 36
4698          .byte  40, 40, 40, 40, 44, 44, 44, 44
4699          .byte  48, 48, 48, 48, 52, 52, 52, 52
4700          .byte  56, 56, 56, 56, 60, 60, 60, 60
4701          .byte  64, 64, 64, 64, 68, 68, 68, 68
4702          .byte  72, 72, 72, 72, 76, 76, 76, 76
4703          .byte  80, 80, 80, 80, 84, 84, 84, 84
4704          .byte  88, 88, 88, 88, 92, 92, 92, 92
4705          .byte  96, 96, 96, 96, 100, 100, 100, 100
4706          .byte  104, 104, 104, 104, 108, 108, 108, 108
4707          .byte  112, 112, 112, 112, 116, 116, 116, 116
4708          .byte  120, 120, 120, 120, 124, 124, 124, 124
4709          .byte  128, 128, 128, 128, 132, 132, 132, 132
4710          .byte  136, 136, 136, 136, 140, 140, 140, 140
4711          .byte  144, 144, 144, 144, 148, 148, 148, 148
4712          .byte  152, 152, 152, 152, 156, 156, 156, 156
4713          .byte  160, 160, 160, 160, 164, 164, 164, 164
4714          .byte  168, 168, 168, 168, 172, 172, 172, 172
4715          .byte  176, 176, 176, 176, 180, 180, 180, 180
4716          .byte  184, 184, 184, 184, 188, 188, 188, 188
4717          .byte  192, 192, 192, 192, 196, 196, 196, 196
4718          .byte  200, 200, 200, 200, 204, 204, 204, 204
4719          .byte  208, 208, 208, 208, 212, 212, 212, 212
4720          .byte  216, 216, 216, 216, 220, 220, 220, 220
4721          .byte  224, 224, 224, 224, 228, 228, 228, 228
4722          .byte  232, 232, 232, 232, 236, 236, 236, 236
4723          .byte  240, 240, 240, 240, 244, 244, 244, 244
4724          .byte  248, 248, 248, 248, 252, 252, 252, 252
4725
4726          ! 5 numbers for initial/final permutation
4727
4728          .word   0x0f0f0f0f                ! offset 256
4729          .word     0x0000ffff                ! 260
4730          .word     0x33333333                ! 264
4731          .word     0x00ff00ff                ! 268
4732          .word     0x55555555                ! 272
4733
4734          .word     0                         ! 276
4735          .word     LOOPS                     ! 280
4736          .word     0x0000FC00                ! 284
4737
4738          .global   DES_SPtrans
4739          .type     DES_SPtrans,#object
4740          .size     DES_SPtrans,2048
4741.align    64
4742DES_SPtrans:
4743_PIC_DES_SPtrans:
4744          ! nibble 0
4745          .word     0x02080800, 0x00080000, 0x02000002, 0x02080802
4746          .word     0x02000000, 0x00080802, 0x00080002, 0x02000002
4747          .word     0x00080802, 0x02080800, 0x02080000, 0x00000802
4748          .word     0x02000802, 0x02000000, 0x00000000, 0x00080002
4749          .word     0x00080000, 0x00000002, 0x02000800, 0x00080800
4750          .word     0x02080802, 0x02080000, 0x00000802, 0x02000800
4751          .word     0x00000002, 0x00000800, 0x00080800, 0x02080002
4752          .word     0x00000800, 0x02000802, 0x02080002, 0x00000000
4753          .word     0x00000000, 0x02080802, 0x02000800, 0x00080002
4754          .word     0x02080800, 0x00080000, 0x00000802, 0x02000800
4755          .word     0x02080002, 0x00000800, 0x00080800, 0x02000002
4756          .word     0x00080802, 0x00000002, 0x02000002, 0x02080000
4757          .word     0x02080802, 0x00080800, 0x02080000, 0x02000802
4758          .word     0x02000000, 0x00000802, 0x00080002, 0x00000000
4759          .word     0x00080000, 0x02000000, 0x02000802, 0x02080800
4760          .word     0x00000002, 0x02080002, 0x00000800, 0x00080802
4761          ! nibble 1
4762          .word     0x40108010, 0x00000000, 0x00108000, 0x40100000
4763          .word     0x40000010, 0x00008010, 0x40008000, 0x00108000
4764          .word     0x00008000, 0x40100010, 0x00000010, 0x40008000
4765          .word     0x00100010, 0x40108000, 0x40100000, 0x00000010
4766          .word     0x00100000, 0x40008010, 0x40100010, 0x00008000
4767          .word     0x00108010, 0x40000000, 0x00000000, 0x00100010
4768          .word     0x40008010, 0x00108010, 0x40108000, 0x40000010
4769          .word     0x40000000, 0x00100000, 0x00008010, 0x40108010
4770          .word     0x00100010, 0x40108000, 0x40008000, 0x00108010
4771          .word     0x40108010, 0x00100010, 0x40000010, 0x00000000
4772          .word     0x40000000, 0x00008010, 0x00100000, 0x40100010
4773          .word     0x00008000, 0x40000000, 0x00108010, 0x40008010
4774          .word     0x40108000, 0x00008000, 0x00000000, 0x40000010
4775          .word     0x00000010, 0x40108010, 0x00108000, 0x40100000
4776          .word     0x40100010, 0x00100000, 0x00008010, 0x40008000
4777          .word     0x40008010, 0x00000010, 0x40100000, 0x00108000
4778          ! nibble 2
4779          .word     0x04000001, 0x04040100, 0x00000100, 0x04000101
4780          .word     0x00040001, 0x04000000, 0x04000101, 0x00040100
4781          .word     0x04000100, 0x00040000, 0x04040000, 0x00000001
4782          .word     0x04040101, 0x00000101, 0x00000001, 0x04040001
4783          .word     0x00000000, 0x00040001, 0x04040100, 0x00000100
4784          .word     0x00000101, 0x04040101, 0x00040000, 0x04000001
4785          .word     0x04040001, 0x04000100, 0x00040101, 0x04040000
4786          .word     0x00040100, 0x00000000, 0x04000000, 0x00040101
4787          .word     0x04040100, 0x00000100, 0x00000001, 0x00040000
4788          .word     0x00000101, 0x00040001, 0x04040000, 0x04000101
4789          .word     0x00000000, 0x04040100, 0x00040100, 0x04040001
4790          .word     0x00040001, 0x04000000, 0x04040101, 0x00000001
4791          .word     0x00040101, 0x04000001, 0x04000000, 0x04040101
4792          .word     0x00040000, 0x04000100, 0x04000101, 0x00040100
4793          .word     0x04000100, 0x00000000, 0x04040001, 0x00000101
4794          .word     0x04000001, 0x00040101, 0x00000100, 0x04040000
4795          ! nibble 3
4796          .word     0x00401008, 0x10001000, 0x00000008, 0x10401008
4797          .word     0x00000000, 0x10400000, 0x10001008, 0x00400008
4798          .word     0x10401000, 0x10000008, 0x10000000, 0x00001008
4799          .word     0x10000008, 0x00401008, 0x00400000, 0x10000000
4800          .word     0x10400008, 0x00401000, 0x00001000, 0x00000008
4801          .word     0x00401000, 0x10001008, 0x10400000, 0x00001000
4802          .word     0x00001008, 0x00000000, 0x00400008, 0x10401000
4803          .word     0x10001000, 0x10400008, 0x10401008, 0x00400000
4804          .word     0x10400008, 0x00001008, 0x00400000, 0x10000008
4805          .word     0x00401000, 0x10001000, 0x00000008, 0x10400000
4806          .word     0x10001008, 0x00000000, 0x00001000, 0x00400008
4807          .word     0x00000000, 0x10400008, 0x10401000, 0x00001000
4808          .word     0x10000000, 0x10401008, 0x00401008, 0x00400000
4809          .word     0x10401008, 0x00000008, 0x10001000, 0x00401008
4810          .word     0x00400008, 0x00401000, 0x10400000, 0x10001008
4811          .word     0x00001008, 0x10000000, 0x10000008, 0x10401000
4812          ! nibble 4
4813          .word     0x08000000, 0x00010000, 0x00000400, 0x08010420
4814          .word     0x08010020, 0x08000400, 0x00010420, 0x08010000
4815          .word     0x00010000, 0x00000020, 0x08000020, 0x00010400
4816          .word     0x08000420, 0x08010020, 0x08010400, 0x00000000
4817          .word     0x00010400, 0x08000000, 0x00010020, 0x00000420
4818          .word     0x08000400, 0x00010420, 0x00000000, 0x08000020
4819          .word     0x00000020, 0x08000420, 0x08010420, 0x00010020
4820          .word     0x08010000, 0x00000400, 0x00000420, 0x08010400
4821          .word     0x08010400, 0x08000420, 0x00010020, 0x08010000
4822          .word     0x00010000, 0x00000020, 0x08000020, 0x08000400
4823          .word     0x08000000, 0x00010400, 0x08010420, 0x00000000
4824          .word     0x00010420, 0x08000000, 0x00000400, 0x00010020
4825          .word     0x08000420, 0x00000400, 0x00000000, 0x08010420
4826          .word     0x08010020, 0x08010400, 0x00000420, 0x00010000
4827          .word     0x00010400, 0x08010020, 0x08000400, 0x00000420
4828          .word     0x00000020, 0x00010420, 0x08010000, 0x08000020
4829          ! nibble 5
4830          .word     0x80000040, 0x00200040, 0x00000000, 0x80202000
4831          .word     0x00200040, 0x00002000, 0x80002040, 0x00200000
4832          .word     0x00002040, 0x80202040, 0x00202000, 0x80000000
4833          .word     0x80002000, 0x80000040, 0x80200000, 0x00202040
4834          .word     0x00200000, 0x80002040, 0x80200040, 0x00000000
4835          .word     0x00002000, 0x00000040, 0x80202000, 0x80200040
4836          .word     0x80202040, 0x80200000, 0x80000000, 0x00002040
4837          .word     0x00000040, 0x00202000, 0x00202040, 0x80002000
4838          .word     0x00002040, 0x80000000, 0x80002000, 0x00202040
4839          .word     0x80202000, 0x00200040, 0x00000000, 0x80002000
4840          .word     0x80000000, 0x00002000, 0x80200040, 0x00200000
4841          .word     0x00200040, 0x80202040, 0x00202000, 0x00000040
4842          .word     0x80202040, 0x00202000, 0x00200000, 0x80002040
4843          .word     0x80000040, 0x80200000, 0x00202040, 0x00000000
4844          .word     0x00002000, 0x80000040, 0x80002040, 0x80202000
4845          .word     0x80200000, 0x00002040, 0x00000040, 0x80200040
4846          ! nibble 6
4847          .word     0x00004000, 0x00000200, 0x01000200, 0x01000004
4848          .word     0x01004204, 0x00004004, 0x00004200, 0x00000000
4849          .word     0x01000000, 0x01000204, 0x00000204, 0x01004000
4850          .word     0x00000004, 0x01004200, 0x01004000, 0x00000204
4851          .word     0x01000204, 0x00004000, 0x00004004, 0x01004204
4852          .word     0x00000000, 0x01000200, 0x01000004, 0x00004200
4853          .word     0x01004004, 0x00004204, 0x01004200, 0x00000004
4854          .word     0x00004204, 0x01004004, 0x00000200, 0x01000000
4855          .word     0x00004204, 0x01004000, 0x01004004, 0x00000204
4856          .word     0x00004000, 0x00000200, 0x01000000, 0x01004004
4857          .word     0x01000204, 0x00004204, 0x00004200, 0x00000000
4858          .word     0x00000200, 0x01000004, 0x00000004, 0x01000200
4859          .word     0x00000000, 0x01000204, 0x01000200, 0x00004200
4860          .word     0x00000204, 0x00004000, 0x01004204, 0x01000000
4861          .word     0x01004200, 0x00000004, 0x00004004, 0x01004204
4862          .word     0x01000004, 0x01004200, 0x01004000, 0x00004004
4863          ! nibble 7
4864          .word     0x20800080, 0x20820000, 0x00020080, 0x00000000
4865          .word     0x20020000, 0x00800080, 0x20800000, 0x20820080
4866          .word     0x00000080, 0x20000000, 0x00820000, 0x00020080
4867          .word     0x00820080, 0x20020080, 0x20000080, 0x20800000
4868          .word     0x00020000, 0x00820080, 0x00800080, 0x20020000
4869          .word     0x20820080, 0x20000080, 0x00000000, 0x00820000
4870          .word     0x20000000, 0x00800000, 0x20020080, 0x20800080
4871          .word     0x00800000, 0x00020000, 0x20820000, 0x00000080
4872          .word     0x00800000, 0x00020000, 0x20000080, 0x20820080
4873          .word     0x00020080, 0x20000000, 0x00000000, 0x00820000
4874          .word     0x20800080, 0x20020080, 0x20020000, 0x00800080
4875          .word     0x20820000, 0x00000080, 0x00800080, 0x20020000
4876          .word     0x20820080, 0x00800000, 0x20800000, 0x20000080
4877          .word     0x00820000, 0x00020080, 0x20020080, 0x20800000
4878          .word     0x00000080, 0x20820000, 0x00820080, 0x00000000
4879          .word     0x20000000, 0x20800080, 0x00020000, 0x00820080
4880
4881