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