• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1%ifidn __OUTPUT_FORMAT__,obj
2section	code	use32 class=code align=64
3%elifidn __OUTPUT_FORMAT__,win32
4$@feat.00 equ 1
5section	.text	code align=64
6%else
7section	.text	code
8%endif
9;extern	_OPENSSL_ia32cap_P
10global	_RC4
11align	16
12_RC4:
13L$_RC4_begin:
14	push	ebp
15	push	ebx
16	push	esi
17	push	edi
18	mov	edi,DWORD [20+esp]
19	mov	edx,DWORD [24+esp]
20	mov	esi,DWORD [28+esp]
21	mov	ebp,DWORD [32+esp]
22	xor	eax,eax
23	xor	ebx,ebx
24	cmp	edx,0
25	je	NEAR L$000abort
26	mov	al,BYTE [edi]
27	mov	bl,BYTE [4+edi]
28	add	edi,8
29	lea	ecx,[edx*1+esi]
30	sub	ebp,esi
31	mov	DWORD [24+esp],ecx
32	inc	al
33	cmp	DWORD [256+edi],-1
34	je	NEAR L$001RC4_CHAR
35	mov	ecx,DWORD [eax*4+edi]
36	and	edx,-4
37	jz	NEAR L$002loop1
38	mov	DWORD [32+esp],ebp
39	test	edx,-8
40	jz	NEAR L$003go4loop4
41	lea	ebp,[_OPENSSL_ia32cap_P]
42	bt	DWORD [ebp],26
43	jnc	NEAR L$003go4loop4
44	mov	ebp,DWORD [32+esp]
45	and	edx,-8
46	lea	edx,[edx*1+esi-8]
47	mov	DWORD [edi-4],edx
48	add	bl,cl
49	mov	edx,DWORD [ebx*4+edi]
50	mov	DWORD [ebx*4+edi],ecx
51	mov	DWORD [eax*4+edi],edx
52	inc	eax
53	add	edx,ecx
54	movzx	eax,al
55	movzx	edx,dl
56	movq	mm0,[esi]
57	mov	ecx,DWORD [eax*4+edi]
58	movd	mm2,DWORD [edx*4+edi]
59	jmp	NEAR L$004loop_mmx_enter
60align	16
61L$005loop_mmx:
62	add	bl,cl
63	psllq	mm1,56
64	mov	edx,DWORD [ebx*4+edi]
65	mov	DWORD [ebx*4+edi],ecx
66	mov	DWORD [eax*4+edi],edx
67	inc	eax
68	add	edx,ecx
69	movzx	eax,al
70	movzx	edx,dl
71	pxor	mm2,mm1
72	movq	mm0,[esi]
73	movq	[esi*1+ebp-8],mm2
74	mov	ecx,DWORD [eax*4+edi]
75	movd	mm2,DWORD [edx*4+edi]
76L$004loop_mmx_enter:
77	add	bl,cl
78	mov	edx,DWORD [ebx*4+edi]
79	mov	DWORD [ebx*4+edi],ecx
80	mov	DWORD [eax*4+edi],edx
81	inc	eax
82	add	edx,ecx
83	movzx	eax,al
84	movzx	edx,dl
85	pxor	mm2,mm0
86	mov	ecx,DWORD [eax*4+edi]
87	movd	mm1,DWORD [edx*4+edi]
88	add	bl,cl
89	psllq	mm1,8
90	mov	edx,DWORD [ebx*4+edi]
91	mov	DWORD [ebx*4+edi],ecx
92	mov	DWORD [eax*4+edi],edx
93	inc	eax
94	add	edx,ecx
95	movzx	eax,al
96	movzx	edx,dl
97	pxor	mm2,mm1
98	mov	ecx,DWORD [eax*4+edi]
99	movd	mm1,DWORD [edx*4+edi]
100	add	bl,cl
101	psllq	mm1,16
102	mov	edx,DWORD [ebx*4+edi]
103	mov	DWORD [ebx*4+edi],ecx
104	mov	DWORD [eax*4+edi],edx
105	inc	eax
106	add	edx,ecx
107	movzx	eax,al
108	movzx	edx,dl
109	pxor	mm2,mm1
110	mov	ecx,DWORD [eax*4+edi]
111	movd	mm1,DWORD [edx*4+edi]
112	add	bl,cl
113	psllq	mm1,24
114	mov	edx,DWORD [ebx*4+edi]
115	mov	DWORD [ebx*4+edi],ecx
116	mov	DWORD [eax*4+edi],edx
117	inc	eax
118	add	edx,ecx
119	movzx	eax,al
120	movzx	edx,dl
121	pxor	mm2,mm1
122	mov	ecx,DWORD [eax*4+edi]
123	movd	mm1,DWORD [edx*4+edi]
124	add	bl,cl
125	psllq	mm1,32
126	mov	edx,DWORD [ebx*4+edi]
127	mov	DWORD [ebx*4+edi],ecx
128	mov	DWORD [eax*4+edi],edx
129	inc	eax
130	add	edx,ecx
131	movzx	eax,al
132	movzx	edx,dl
133	pxor	mm2,mm1
134	mov	ecx,DWORD [eax*4+edi]
135	movd	mm1,DWORD [edx*4+edi]
136	add	bl,cl
137	psllq	mm1,40
138	mov	edx,DWORD [ebx*4+edi]
139	mov	DWORD [ebx*4+edi],ecx
140	mov	DWORD [eax*4+edi],edx
141	inc	eax
142	add	edx,ecx
143	movzx	eax,al
144	movzx	edx,dl
145	pxor	mm2,mm1
146	mov	ecx,DWORD [eax*4+edi]
147	movd	mm1,DWORD [edx*4+edi]
148	add	bl,cl
149	psllq	mm1,48
150	mov	edx,DWORD [ebx*4+edi]
151	mov	DWORD [ebx*4+edi],ecx
152	mov	DWORD [eax*4+edi],edx
153	inc	eax
154	add	edx,ecx
155	movzx	eax,al
156	movzx	edx,dl
157	pxor	mm2,mm1
158	mov	ecx,DWORD [eax*4+edi]
159	movd	mm1,DWORD [edx*4+edi]
160	mov	edx,ebx
161	xor	ebx,ebx
162	mov	bl,dl
163	cmp	esi,DWORD [edi-4]
164	lea	esi,[8+esi]
165	jb	NEAR L$005loop_mmx
166	psllq	mm1,56
167	pxor	mm2,mm1
168	movq	[esi*1+ebp-8],mm2
169	emms
170	cmp	esi,DWORD [24+esp]
171	je	NEAR L$006done
172	jmp	NEAR L$002loop1
173align	16
174L$003go4loop4:
175	lea	edx,[edx*1+esi-4]
176	mov	DWORD [28+esp],edx
177L$007loop4:
178	add	bl,cl
179	mov	edx,DWORD [ebx*4+edi]
180	mov	DWORD [ebx*4+edi],ecx
181	mov	DWORD [eax*4+edi],edx
182	add	edx,ecx
183	inc	al
184	and	edx,255
185	mov	ecx,DWORD [eax*4+edi]
186	mov	ebp,DWORD [edx*4+edi]
187	add	bl,cl
188	mov	edx,DWORD [ebx*4+edi]
189	mov	DWORD [ebx*4+edi],ecx
190	mov	DWORD [eax*4+edi],edx
191	add	edx,ecx
192	inc	al
193	and	edx,255
194	ror	ebp,8
195	mov	ecx,DWORD [eax*4+edi]
196	or	ebp,DWORD [edx*4+edi]
197	add	bl,cl
198	mov	edx,DWORD [ebx*4+edi]
199	mov	DWORD [ebx*4+edi],ecx
200	mov	DWORD [eax*4+edi],edx
201	add	edx,ecx
202	inc	al
203	and	edx,255
204	ror	ebp,8
205	mov	ecx,DWORD [eax*4+edi]
206	or	ebp,DWORD [edx*4+edi]
207	add	bl,cl
208	mov	edx,DWORD [ebx*4+edi]
209	mov	DWORD [ebx*4+edi],ecx
210	mov	DWORD [eax*4+edi],edx
211	add	edx,ecx
212	inc	al
213	and	edx,255
214	ror	ebp,8
215	mov	ecx,DWORD [32+esp]
216	or	ebp,DWORD [edx*4+edi]
217	ror	ebp,8
218	xor	ebp,DWORD [esi]
219	cmp	esi,DWORD [28+esp]
220	mov	DWORD [esi*1+ecx],ebp
221	lea	esi,[4+esi]
222	mov	ecx,DWORD [eax*4+edi]
223	jb	NEAR L$007loop4
224	cmp	esi,DWORD [24+esp]
225	je	NEAR L$006done
226	mov	ebp,DWORD [32+esp]
227align	16
228L$002loop1:
229	add	bl,cl
230	mov	edx,DWORD [ebx*4+edi]
231	mov	DWORD [ebx*4+edi],ecx
232	mov	DWORD [eax*4+edi],edx
233	add	edx,ecx
234	inc	al
235	and	edx,255
236	mov	edx,DWORD [edx*4+edi]
237	xor	dl,BYTE [esi]
238	lea	esi,[1+esi]
239	mov	ecx,DWORD [eax*4+edi]
240	cmp	esi,DWORD [24+esp]
241	mov	BYTE [esi*1+ebp-1],dl
242	jb	NEAR L$002loop1
243	jmp	NEAR L$006done
244align	16
245L$001RC4_CHAR:
246	movzx	ecx,BYTE [eax*1+edi]
247L$008cloop1:
248	add	bl,cl
249	movzx	edx,BYTE [ebx*1+edi]
250	mov	BYTE [ebx*1+edi],cl
251	mov	BYTE [eax*1+edi],dl
252	add	dl,cl
253	movzx	edx,BYTE [edx*1+edi]
254	add	al,1
255	xor	dl,BYTE [esi]
256	lea	esi,[1+esi]
257	movzx	ecx,BYTE [eax*1+edi]
258	cmp	esi,DWORD [24+esp]
259	mov	BYTE [esi*1+ebp-1],dl
260	jb	NEAR L$008cloop1
261L$006done:
262	dec	al
263	mov	DWORD [edi-4],ebx
264	mov	BYTE [edi-8],al
265L$000abort:
266	pop	edi
267	pop	esi
268	pop	ebx
269	pop	ebp
270	ret
271global	_RC4_set_key
272align	16
273_RC4_set_key:
274L$_RC4_set_key_begin:
275	push	ebp
276	push	ebx
277	push	esi
278	push	edi
279	mov	edi,DWORD [20+esp]
280	mov	ebp,DWORD [24+esp]
281	mov	esi,DWORD [28+esp]
282	lea	edx,[_OPENSSL_ia32cap_P]
283	lea	edi,[8+edi]
284	lea	esi,[ebp*1+esi]
285	neg	ebp
286	xor	eax,eax
287	mov	DWORD [edi-4],ebp
288	bt	DWORD [edx],20
289	jc	NEAR L$009c1stloop
290align	16
291L$010w1stloop:
292	mov	DWORD [eax*4+edi],eax
293	add	al,1
294	jnc	NEAR L$010w1stloop
295	xor	ecx,ecx
296	xor	edx,edx
297align	16
298L$011w2ndloop:
299	mov	eax,DWORD [ecx*4+edi]
300	add	dl,BYTE [ebp*1+esi]
301	add	dl,al
302	add	ebp,1
303	mov	ebx,DWORD [edx*4+edi]
304	jnz	NEAR L$012wnowrap
305	mov	ebp,DWORD [edi-4]
306L$012wnowrap:
307	mov	DWORD [edx*4+edi],eax
308	mov	DWORD [ecx*4+edi],ebx
309	add	cl,1
310	jnc	NEAR L$011w2ndloop
311	jmp	NEAR L$013exit
312align	16
313L$009c1stloop:
314	mov	BYTE [eax*1+edi],al
315	add	al,1
316	jnc	NEAR L$009c1stloop
317	xor	ecx,ecx
318	xor	edx,edx
319	xor	ebx,ebx
320align	16
321L$014c2ndloop:
322	mov	al,BYTE [ecx*1+edi]
323	add	dl,BYTE [ebp*1+esi]
324	add	dl,al
325	add	ebp,1
326	mov	bl,BYTE [edx*1+edi]
327	jnz	NEAR L$015cnowrap
328	mov	ebp,DWORD [edi-4]
329L$015cnowrap:
330	mov	BYTE [edx*1+edi],al
331	mov	BYTE [ecx*1+edi],bl
332	add	cl,1
333	jnc	NEAR L$014c2ndloop
334	mov	DWORD [256+edi],-1
335L$013exit:
336	xor	eax,eax
337	mov	DWORD [edi-8],eax
338	mov	DWORD [edi-4],eax
339	pop	edi
340	pop	esi
341	pop	ebx
342	pop	ebp
343	ret
344global	_RC4_options
345align	16
346_RC4_options:
347L$_RC4_options_begin:
348	call	L$016pic_point
349L$016pic_point:
350	pop	eax
351	lea	eax,[(L$017opts-L$016pic_point)+eax]
352	lea	edx,[_OPENSSL_ia32cap_P]
353	mov	edx,DWORD [edx]
354	bt	edx,20
355	jc	NEAR L$0181xchar
356	bt	edx,26
357	jnc	NEAR L$019ret
358	add	eax,25
359	ret
360L$0181xchar:
361	add	eax,12
362L$019ret:
363	ret
364align	64
365L$017opts:
366db	114,99,52,40,52,120,44,105,110,116,41,0
367db	114,99,52,40,49,120,44,99,104,97,114,41,0
368db	114,99,52,40,56,120,44,109,109,120,41,0
369db	82,67,52,32,102,111,114,32,120,56,54,44,32,67,82,89
370db	80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114
371db	111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
372align	64
373segment	.bss
374common	_OPENSSL_ia32cap_P 16
375