%ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 %ifdef __YASM_VERSION_ID__ %if __YASM_VERSION_ID__ < 01010000h %error yasm version 1.1.0 or later needed. %endif ; Yasm automatically includes .00 and complains about redefining it. ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html %else $@feat.00 equ 1 %endif section .text code align=64 %else section .text code %endif ;extern _OPENSSL_ia32cap_P global _asm_RC4 align 16 _asm_RC4: L$_asm_RC4_begin: push ebp push ebx push esi push edi mov edi,DWORD [20+esp] mov edx,DWORD [24+esp] mov esi,DWORD [28+esp] mov ebp,DWORD [32+esp] xor eax,eax xor ebx,ebx cmp edx,0 je NEAR L$000abort mov al,BYTE [edi] mov bl,BYTE [4+edi] add edi,8 lea ecx,[edx*1+esi] sub ebp,esi mov DWORD [24+esp],ecx inc al cmp DWORD [256+edi],-1 je NEAR L$001RC4_CHAR mov ecx,DWORD [eax*4+edi] and edx,-4 jz NEAR L$002loop1 mov DWORD [32+esp],ebp test edx,-8 jz NEAR L$003go4loop4 lea ebp,[_OPENSSL_ia32cap_P] bt DWORD [ebp],26 jnc NEAR L$003go4loop4 mov ebp,DWORD [32+esp] and edx,-8 lea edx,[edx*1+esi-8] mov DWORD [edi-4],edx add bl,cl mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx inc eax add edx,ecx movzx eax,al movzx edx,dl movq mm0,[esi] mov ecx,DWORD [eax*4+edi] movd mm2,DWORD [edx*4+edi] jmp NEAR L$004loop_mmx_enter align 16 L$005loop_mmx: add bl,cl psllq mm1,56 mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx inc eax add edx,ecx movzx eax,al movzx edx,dl pxor mm2,mm1 movq mm0,[esi] movq [esi*1+ebp-8],mm2 mov ecx,DWORD [eax*4+edi] movd mm2,DWORD [edx*4+edi] L$004loop_mmx_enter: add bl,cl mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx inc eax add edx,ecx movzx eax,al movzx edx,dl pxor mm2,mm0 mov ecx,DWORD [eax*4+edi] movd mm1,DWORD [edx*4+edi] add bl,cl psllq mm1,8 mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx inc eax add edx,ecx movzx eax,al movzx edx,dl pxor mm2,mm1 mov ecx,DWORD [eax*4+edi] movd mm1,DWORD [edx*4+edi] add bl,cl psllq mm1,16 mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx inc eax add edx,ecx movzx eax,al movzx edx,dl pxor mm2,mm1 mov ecx,DWORD [eax*4+edi] movd mm1,DWORD [edx*4+edi] add bl,cl psllq mm1,24 mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx inc eax add edx,ecx movzx eax,al movzx edx,dl pxor mm2,mm1 mov ecx,DWORD [eax*4+edi] movd mm1,DWORD [edx*4+edi] add bl,cl psllq mm1,32 mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx inc eax add edx,ecx movzx eax,al movzx edx,dl pxor mm2,mm1 mov ecx,DWORD [eax*4+edi] movd mm1,DWORD [edx*4+edi] add bl,cl psllq mm1,40 mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx inc eax add edx,ecx movzx eax,al movzx edx,dl pxor mm2,mm1 mov ecx,DWORD [eax*4+edi] movd mm1,DWORD [edx*4+edi] add bl,cl psllq mm1,48 mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx inc eax add edx,ecx movzx eax,al movzx edx,dl pxor mm2,mm1 mov ecx,DWORD [eax*4+edi] movd mm1,DWORD [edx*4+edi] mov edx,ebx xor ebx,ebx mov bl,dl cmp esi,DWORD [edi-4] lea esi,[8+esi] jb NEAR L$005loop_mmx psllq mm1,56 pxor mm2,mm1 movq [esi*1+ebp-8],mm2 emms cmp esi,DWORD [24+esp] je NEAR L$006done jmp NEAR L$002loop1 align 16 L$003go4loop4: lea edx,[edx*1+esi-4] mov DWORD [28+esp],edx L$007loop4: add bl,cl mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx add edx,ecx inc al and edx,255 mov ecx,DWORD [eax*4+edi] mov ebp,DWORD [edx*4+edi] add bl,cl mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx add edx,ecx inc al and edx,255 ror ebp,8 mov ecx,DWORD [eax*4+edi] or ebp,DWORD [edx*4+edi] add bl,cl mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx add edx,ecx inc al and edx,255 ror ebp,8 mov ecx,DWORD [eax*4+edi] or ebp,DWORD [edx*4+edi] add bl,cl mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx add edx,ecx inc al and edx,255 ror ebp,8 mov ecx,DWORD [32+esp] or ebp,DWORD [edx*4+edi] ror ebp,8 xor ebp,DWORD [esi] cmp esi,DWORD [28+esp] mov DWORD [esi*1+ecx],ebp lea esi,[4+esi] mov ecx,DWORD [eax*4+edi] jb NEAR L$007loop4 cmp esi,DWORD [24+esp] je NEAR L$006done mov ebp,DWORD [32+esp] align 16 L$002loop1: add bl,cl mov edx,DWORD [ebx*4+edi] mov DWORD [ebx*4+edi],ecx mov DWORD [eax*4+edi],edx add edx,ecx inc al and edx,255 mov edx,DWORD [edx*4+edi] xor dl,BYTE [esi] lea esi,[1+esi] mov ecx,DWORD [eax*4+edi] cmp esi,DWORD [24+esp] mov BYTE [esi*1+ebp-1],dl jb NEAR L$002loop1 jmp NEAR L$006done align 16 L$001RC4_CHAR: movzx ecx,BYTE [eax*1+edi] L$008cloop1: add bl,cl movzx edx,BYTE [ebx*1+edi] mov BYTE [ebx*1+edi],cl mov BYTE [eax*1+edi],dl add dl,cl movzx edx,BYTE [edx*1+edi] add al,1 xor dl,BYTE [esi] lea esi,[1+esi] movzx ecx,BYTE [eax*1+edi] cmp esi,DWORD [24+esp] mov BYTE [esi*1+ebp-1],dl jb NEAR L$008cloop1 L$006done: dec al mov DWORD [edi-4],ebx mov BYTE [edi-8],al L$000abort: pop edi pop esi pop ebx pop ebp ret global _asm_RC4_set_key align 16 _asm_RC4_set_key: L$_asm_RC4_set_key_begin: push ebp push ebx push esi push edi mov edi,DWORD [20+esp] mov ebp,DWORD [24+esp] mov esi,DWORD [28+esp] lea edx,[_OPENSSL_ia32cap_P] lea edi,[8+edi] lea esi,[ebp*1+esi] neg ebp xor eax,eax mov DWORD [edi-4],ebp bt DWORD [edx],20 jc NEAR L$009c1stloop align 16 L$010w1stloop: mov DWORD [eax*4+edi],eax add al,1 jnc NEAR L$010w1stloop xor ecx,ecx xor edx,edx align 16 L$011w2ndloop: mov eax,DWORD [ecx*4+edi] add dl,BYTE [ebp*1+esi] add dl,al add ebp,1 mov ebx,DWORD [edx*4+edi] jnz NEAR L$012wnowrap mov ebp,DWORD [edi-4] L$012wnowrap: mov DWORD [edx*4+edi],eax mov DWORD [ecx*4+edi],ebx add cl,1 jnc NEAR L$011w2ndloop jmp NEAR L$013exit align 16 L$009c1stloop: mov BYTE [eax*1+edi],al add al,1 jnc NEAR L$009c1stloop xor ecx,ecx xor edx,edx xor ebx,ebx align 16 L$014c2ndloop: mov al,BYTE [ecx*1+edi] add dl,BYTE [ebp*1+esi] add dl,al add ebp,1 mov bl,BYTE [edx*1+edi] jnz NEAR L$015cnowrap mov ebp,DWORD [edi-4] L$015cnowrap: mov BYTE [edx*1+edi],al mov BYTE [ecx*1+edi],bl add cl,1 jnc NEAR L$014c2ndloop mov DWORD [256+edi],-1 L$013exit: xor eax,eax mov DWORD [edi-8],eax mov DWORD [edi-4],eax pop edi pop esi pop ebx pop ebp ret global _RC4_options align 16 _RC4_options: L$_RC4_options_begin: call L$016pic_point L$016pic_point: pop eax lea eax,[(L$017opts-L$016pic_point)+eax] lea edx,[_OPENSSL_ia32cap_P] mov edx,DWORD [edx] bt edx,20 jc NEAR L$0181xchar bt edx,26 jnc NEAR L$019ret add eax,25 ret L$0181xchar: add eax,12 L$019ret: ret align 64 L$017opts: db 114,99,52,40,52,120,44,105,110,116,41,0 db 114,99,52,40,49,120,44,99,104,97,114,41,0 db 114,99,52,40,56,120,44,109,109,120,41,0 db 82,67,52,32,102,111,114,32,120,56,54,44,32,67,82,89 db 80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114 db 111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 align 64 segment .bss common _OPENSSL_ia32cap_P 16