xref: /plan9/sys/src/cmd/unix/drawterm/posix-386/sha1block.spp (revision 96cbc34f1b36a29efdcfd47b10e70703a690febc)
1.text
2
3.p2align 2,0x90
4#ifdef __APPLE__
5.globl __sha1block
6__sha1block:
7#else
8.globl _sha1block
9_sha1block:
10#endif
11
12/* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
13 * wp[off] = x;
14 * x += A <<< 5;
15 * E += 0xca62c1d6 + x;
16 * x = FN(B,C,D);
17 * E += x;
18 * B >>> 2
19 */
20#define BSWAPDI	BYTE $0x0f; BYTE $0xcf;
21
22#define BODY(off,FN,V,A,B,C,D,E)\
23	movl (off-64)(%ebp), %edi;\
24	xorl (off-56)(%ebp), %edi;\
25	xorl (off-32)(%ebp), %edi;\
26	xorl (off-12)(%ebp), %edi;\
27	roll $1, %edi;\
28	movl %edi, off(%ebp);\
29	leal V(%edi, E, 1), E;\
30	movl A, %edi;\
31	roll $5, %edi;\
32	addl %edi, E;\
33	FN(B,C,D)\
34	addl %edi, E;\
35	rorl $2, B;\
36
37#define BODY0(off,FN,V,A,B,C,D,E)\
38	movl off(%ebx), %edi;\
39	bswap %edi;\
40	movl %edi, off(%ebp);\
41	leal V(%edi,E,1), E;\
42	movl A, %edi;\
43	roll $5,%edi;\
44	addl %edi,E;\
45	FN(B,C,D)\
46	addl %edi,E;\
47	rorl $2,B;\
48
49/*
50 * fn1 = (((C^D)&B)^D);
51 */
52#define FN1(B,C,D)\
53	movl C, %edi;\
54	xorl D, %edi;\
55	andl B, %edi;\
56	xorl D, %edi;\
57
58/*
59 * fn24 = B ^ C ^ D
60 */
61#define FN24(B,C,D)\
62	movl B, %edi;\
63	xorl C, %edi;\
64	xorl D, %edi;\
65
66/*
67 * fn3 = ((B ^ C) & (D ^= B)) ^ B
68 * D ^= B to restore D
69 */
70#define FN3(B,C,D)\
71	movl B, %edi;\
72	xorl C, %edi;\
73	xorl B, D;\
74	andl D, %edi;\
75	xorl B, %edi;\
76	xorl B, D;\
77
78/*
79 * stack offsets
80 * void sha1block(uchar *DATA, int LEN, ulong *STATE)
81 */
82#define STACKSIZE (48+80*4)
83#define	DATA	(STACKSIZE+8)
84#define	LEN	(STACKSIZE+12)
85#define	STATE	(STACKSIZE+16)
86
87/*
88 * stack offsets for locals
89 * ulong w[80];
90 * uchar *edata;
91 * ulong *w15, *w40, *w60, *w80;
92 * register local
93 * ulong *wp = %ebp
94 * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi
95 * ulong tmp = edi
96 */
97#define WARRAY	(STACKSIZE-4-(80*4))
98#define TMP1	(STACKSIZE-8-(80*4))
99#define TMP2	(STACKSIZE-12-(80*4))
100#define W15	(STACKSIZE-16-(80*4))
101#define W40	(STACKSIZE-20-(80*4))
102#define W60	(STACKSIZE-24-(80*4))
103#define W80	(STACKSIZE-28-(80*4))
104#define EDATA	(STACKSIZE-32-(80*4))
105#define OLDEBX	(STACKSIZE-36-(80*4))
106#define OLDESI	(STACKSIZE-40-(80*4))
107#define OLDEDI	(STACKSIZE-44-(80*4))
108
109	/* Prelude */
110	pushl %ebp
111	subl $(STACKSIZE), %esp
112
113	mov %ebx, OLDEBX(%esp)
114	mov %esi, OLDESI(%esp)
115	mov %edi, OLDEDI(%esp)
116
117	movl DATA(%esp), %eax
118	addl LEN(%esp), %eax
119	movl %eax, EDATA(%esp)
120
121	leal (WARRAY+15*4)(%esp), %edi	/* aw15 */
122	movl %edi, W15(%esp)
123	leal (WARRAY+40*4)(%esp), %edx	/* aw40 */
124	movl %edx, W40(%esp)
125	leal (WARRAY+60*4)(%esp), %ecx	/* aw60 */
126	movl %ecx, W60(%esp)
127	leal (WARRAY+80*4)(%esp), %edi	/* aw80 */
128	movl %edi, W80(%esp)
129
1300:
131	leal WARRAY(%esp), %ebp		/* warray */
132
133	movl STATE(%esp), %edi		/* state */
134	movl (%edi),%eax
135	movl 4(%edi),%ebx
136	movl %ebx, TMP1(%esp)		/* tmp1 */
137	movl 8(%edi), %ecx
138	movl 12(%edi), %edx
139	movl 16(%edi), %esi
140
141	movl DATA(%esp), %ebx		/* data */
142
1431:
144	BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi)
145	movl %esi,TMP2(%esp)
146	BODY0(4,FN1,0x5a827999,%esi,%eax,TMP1(%esp),%ecx,%edx)
147	movl TMP1(%esp),%esi
148	BODY0(8,FN1,0x5a827999,%edx,TMP2(%esp),%eax,%esi,%ecx)
149	BODY0(12,FN1,0x5a827999,%ecx,%edx,TMP2(%esp),%eax,%esi)
150	movl %esi,TMP1(%esp)
151	BODY0(16,FN1,0x5a827999,%esi,%ecx,%edx,TMP2(%esp),%eax)
152	movl TMP2(%esp),%esi
153
154	addl $20, %ebx
155	addl $20, %ebp
156	cmpl W15(%esp), %ebp	/* w15 */
157	jb 1b
158
159	BODY0(0,FN1,0x5a827999,%eax,TMP1(%esp),%ecx,%edx,%esi)
160	addl $4, %ebx
161	MOVL %ebx, DATA(%esp)	/* data */
162	MOVL TMP1(%esp),%ebx
163
164	BODY(4,FN1,0x5a827999,%esi,%eax,%ebx,%ecx,%edx)
165	BODY(8,FN1,0x5a827999,%edx,%esi,%eax,%ebx,%ecx)
166	BODY(12,FN1,0x5a827999,%ecx,%edx,%esi,%eax,%ebx)
167	BODY(16,FN1,0x5a827999,%ebx,%ecx,%edx,%esi,%eax)
168
169	addl $20, %ebp
170
1712:
172	BODY(0,FN24,0x6ed9eba1,%eax,%ebx,%ecx,%edx,%esi)
173	BODY(4,FN24,0x6ed9eba1,%esi,%eax,%ebx,%ecx,%edx)
174	BODY(8,FN24,0x6ed9eba1,%edx,%esi,%eax,%ebx,%ecx)
175	BODY(12,FN24,0x6ed9eba1,%ecx,%edx,%esi,%eax,%ebx)
176	BODY(16,FN24,0x6ed9eba1,%ebx,%ecx,%edx,%esi,%eax)
177
178	addl $20,%ebp
179	cmpl W40(%esp), %ebp
180	jb 2b
181
1823:
183	BODY(0,FN3,0x8f1bbcdc,%eax,%ebx,%ecx,%edx,%esi)
184	BODY(4,FN3,0x8f1bbcdc,%esi,%eax,%ebx,%ecx,%edx)
185	BODY(8,FN3,0x8f1bbcdc,%edx,%esi,%eax,%ebx,%ecx)
186	BODY(12,FN3,0x8f1bbcdc,%ecx,%edx,%esi,%eax,%ebx)
187	BODY(16,FN3,0x8f1bbcdc,%ebx,%ecx,%edx,%esi,%eax)
188
189	addl $20, %ebp
190	cmpl W60(%esp), %ebp 	/* w60 */
191	jb 3b
192
1934:
194	BODY(0,FN24,0xca62c1d6,%eax,%ebx,%ecx,%edx,%esi)
195	BODY(4,FN24,0xca62c1d6,%esi,%eax,%ebx,%ecx,%edx)
196	BODY(8,FN24,0xca62c1d6,%edx,%esi,%eax,%ebx,%ecx)
197	BODY(12,FN24,0xca62c1d6,%ecx,%edx,%esi,%eax,%ebx)
198	BODY(16,FN24,0xca62c1d6,%ebx,%ecx,%edx,%esi,%eax)
199
200	addl $20, %ebp
201	cmpl W80(%esp), %ebp 	/* w80 */
202	jb 4b
203
204	movl STATE(%esp), %edi	/* state */
205	addl %eax, 0(%edi)
206	addl %ebx, 4(%edi)
207	addl %ecx, 8(%edi)
208	addl %edx, 12(%edi)
209	addl %esi, 16(%edi)
210
211	movl EDATA(%esp), %edi	/* edata */
212	cmpl %edi, DATA(%esp)	/* data */
213	jb 0b
214
215	/* Postlude */
216	mov OLDEBX(%esp), %ebx
217	mov OLDESI(%esp), %esi
218	mov OLDEDI(%esp), %edi
219	addl $(STACKSIZE), %esp
220	popl %ebp
221	ret
222