xref: /plan9-contrib/sys/src/libsec/386/sha1block.s (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
1	TEXT	_sha1block+0(SB),$352
2
3/* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1;
4 * wp[off] = x;
5 * x += A <<< 5;
6 * E += 0xca62c1d6 + x;
7 * x = FN(B,C,D);
8 * E += x;
9 * B >>> 2
10 */
11#define BSWAPDI	BYTE $0x0f; BYTE $0xcf;
12
13#define BODY(off,FN,V,A,B,C,D,E)\
14	MOVL (off-64)(BP),DI;\
15	XORL (off-56)(BP),DI;\
16	XORL (off-32)(BP),DI;\
17	XORL (off-12)(BP),DI;\
18	ROLL $1,DI;\
19	MOVL DI,off(BP);\
20	LEAL V(DI)(E*1),E;\
21	MOVL A,DI;\
22	ROLL $5,DI;\
23	ADDL DI,E;\
24	FN(B,C,D)\
25	ADDL DI,E;\
26	RORL $2,B;\
27
28#define BODY0(off,FN,V,A,B,C,D,E)\
29	MOVL off(BX),DI;\
30	BSWAPDI;\
31	MOVL DI,off(BP);\
32	LEAL V(DI)(E*1),E;\
33	MOVL A,DI;\
34	ROLL $5,DI;\
35	ADDL DI,E;\
36	FN(B,C,D)\
37	ADDL DI,E;\
38	RORL $2,B;\
39
40/*
41 * fn1 = (((C^D)&B)^D);
42 */
43#define FN1(B,C,D)\
44	MOVL C,DI;\
45	XORL D,DI;\
46	ANDL B,DI;\
47	XORL D,DI;\
48
49/*
50 * fn24 = B ^ C ^ D
51 */
52#define FN24(B,C,D)\
53	MOVL B,DI;\
54	XORL C,DI;\
55	XORL D,DI;\
56
57/*
58 * fn3 = ((B ^ C) & (D ^= B)) ^ B
59 * D ^= B to restore D
60 */
61#define FN3(B,C,D)\
62	MOVL B,DI;\
63	XORL C,DI;\
64	XORL B,D;\
65	ANDL D,DI;\
66	XORL B,DI;\
67	XORL B,D;\
68
69/*
70 * stack offsets
71 * void sha1block(uchar *DATA, int LEN, ulong *STATE)
72 */
73#define	DATA	0
74#define	LEN	4
75#define	STATE	8
76
77/*
78 * stack offsets for locals
79 * ulong w[80];
80 * uchar *edata;
81 * ulong *w15, *w40, *w60, *w80;
82 * register local
83 * ulong *wp = BP
84 * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi
85 * ulong tmp = edi
86 */
87#define WARRAY	(-4-(80*4))
88#define TMP1	(-8-(80*4))
89#define TMP2	(-12-(80*4))
90#define W15	(-16-(80*4))
91#define W40	(-20-(80*4))
92#define W60	(-24-(80*4))
93#define W80	(-28-(80*4))
94#define EDATA	(-32-(80*4))
95
96	MOVL data+DATA(FP),AX
97	ADDL len+LEN(FP),AX
98	MOVL AX,edata+EDATA(SP)
99
100	LEAL aw15+(WARRAY+15*4)(SP),DI
101	MOVL DI,w15+W15(SP)
102	LEAL aw40+(WARRAY+40*4)(SP),DX
103	MOVL DX,w40+W40(SP)
104	LEAL aw60+(WARRAY+60*4)(SP),CX
105	MOVL CX,w60+W60(SP)
106	LEAL aw80+(WARRAY+80*4)(SP),DI
107	MOVL DI,w80+W80(SP)
108
109mainloop:
110	LEAL warray+WARRAY(SP),BP
111
112	MOVL state+STATE(FP),DI
113	MOVL (DI),AX
114	MOVL 4(DI),BX
115	MOVL BX,tmp1+TMP1(SP)
116	MOVL 8(DI),CX
117	MOVL 12(DI),DX
118	MOVL 16(DI),SI
119
120	MOVL data+DATA(FP),BX
121
122loop1:
123	BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI)
124	MOVL SI,tmp2+TMP2(SP)
125	BODY0(4,FN1,0x5a827999,SI,AX,tmp1+TMP1(SP),CX,DX)
126	MOVL tmp1+TMP1(SP),SI
127	BODY0(8,FN1,0x5a827999,DX,tmp2+TMP2(SP),AX,SI,CX)
128	BODY0(12,FN1,0x5a827999,CX,DX,tmp2+TMP2(SP),AX,SI)
129	MOVL SI,tmp1+TMP1(SP)
130	BODY0(16,FN1,0x5a827999,SI,CX,DX,tmp2+TMP2(SP),AX)
131	MOVL tmp2+TMP2(SP),SI
132
133	ADDL $20,BX
134	ADDL $20,BP
135	CMPL BP,w15+W15(SP)
136	JCS loop1
137
138	BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI)
139	ADDL $4,BX
140	MOVL BX,data+DATA(FP)
141	MOVL tmp1+TMP1(SP),BX
142
143	BODY(4,FN1,0x5a827999,SI,AX,BX,CX,DX)
144	BODY(8,FN1,0x5a827999,DX,SI,AX,BX,CX)
145	BODY(12,FN1,0x5a827999,CX,DX,SI,AX,BX)
146	BODY(16,FN1,0x5a827999,BX,CX,DX,SI,AX)
147
148	ADDL $20,BP
149
150loop2:
151	BODY(0,FN24,0x6ed9eba1,AX,BX,CX,DX,SI)
152	BODY(4,FN24,0x6ed9eba1,SI,AX,BX,CX,DX)
153	BODY(8,FN24,0x6ed9eba1,DX,SI,AX,BX,CX)
154	BODY(12,FN24,0x6ed9eba1,CX,DX,SI,AX,BX)
155	BODY(16,FN24,0x6ed9eba1,BX,CX,DX,SI,AX)
156
157	ADDL $20,BP
158	CMPL BP,w40+W40(SP)
159	JCS loop2
160
161loop3:
162	BODY(0,FN3,0x8f1bbcdc,AX,BX,CX,DX,SI)
163	BODY(4,FN3,0x8f1bbcdc,SI,AX,BX,CX,DX)
164	BODY(8,FN3,0x8f1bbcdc,DX,SI,AX,BX,CX)
165	BODY(12,FN3,0x8f1bbcdc,CX,DX,SI,AX,BX)
166	BODY(16,FN3,0x8f1bbcdc,BX,CX,DX,SI,AX)
167
168	ADDL $20,BP
169	CMPL BP,w60+W60(SP)
170	JCS loop3
171
172loop4:
173	BODY(0,FN24,0xca62c1d6,AX,BX,CX,DX,SI)
174	BODY(4,FN24,0xca62c1d6,SI,AX,BX,CX,DX)
175	BODY(8,FN24,0xca62c1d6,DX,SI,AX,BX,CX)
176	BODY(12,FN24,0xca62c1d6,CX,DX,SI,AX,BX)
177	BODY(16,FN24,0xca62c1d6,BX,CX,DX,SI,AX)
178
179	ADDL $20,BP
180	CMPL BP,w80+W80(SP)
181	JCS loop4
182
183	MOVL state+STATE(FP),DI
184	ADDL AX,0(DI)
185	ADDL BX,4(DI)
186	ADDL CX,8(DI)
187	ADDL DX,12(DI)
188	ADDL SI,16(DI)
189
190	MOVL edata+EDATA(SP),DI
191	CMPL data+DATA(FP),DI
192	JCS mainloop
193
194	RET
195	END
196