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