.text .globl _RC4 .p2align 4 _RC4: orq %rsi,%rsi jne L$entry .byte 0xf3,0xc3 L$entry: pushq %rbx pushq %r12 pushq %r13 L$prologue: movq %rsi,%r11 movq %rdx,%r12 movq %rcx,%r13 xorq %r10,%r10 xorq %rcx,%rcx leaq 8(%rdi),%rdi movb -8(%rdi),%r10b movb -4(%rdi),%cl cmpl $-1,256(%rdi) je L$RC4_CHAR movl _OPENSSL_ia32cap_P(%rip),%r8d xorq %rbx,%rbx incb %r10b subq %r10,%rbx subq %r12,%r13 movl (%rdi,%r10,4),%eax testq $-16,%r11 jz L$loop1 btl $30,%r8d jc L$intel andq $7,%rbx leaq 1(%r10),%rsi jz L$oop8 subq %rbx,%r11 L$oop8_warmup: addb %al,%cl movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) movl %edx,(%rdi,%r10,4) addb %dl,%al incb %r10b movl (%rdi,%rax,4),%edx movl (%rdi,%r10,4),%eax xorb (%r12),%dl movb %dl,(%r13,%r12,1) leaq 1(%r12),%r12 decq %rbx jnz L$oop8_warmup leaq 1(%r10),%rsi jmp L$oop8 .p2align 4 L$oop8: addb %al,%cl movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) movl 0(%rdi,%rsi,4),%ebx rorq $8,%r8 movl %edx,0(%rdi,%r10,4) addb %al,%dl movb (%rdi,%rdx,4),%r8b addb %bl,%cl movl (%rdi,%rcx,4),%edx movl %ebx,(%rdi,%rcx,4) movl 4(%rdi,%rsi,4),%eax rorq $8,%r8 movl %edx,4(%rdi,%r10,4) addb %bl,%dl movb (%rdi,%rdx,4),%r8b addb %al,%cl movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) movl 8(%rdi,%rsi,4),%ebx rorq $8,%r8 movl %edx,8(%rdi,%r10,4) addb %al,%dl movb (%rdi,%rdx,4),%r8b addb %bl,%cl movl (%rdi,%rcx,4),%edx movl %ebx,(%rdi,%rcx,4) movl 12(%rdi,%rsi,4),%eax rorq $8,%r8 movl %edx,12(%rdi,%r10,4) addb %bl,%dl movb (%rdi,%rdx,4),%r8b addb %al,%cl movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) movl 16(%rdi,%rsi,4),%ebx rorq $8,%r8 movl %edx,16(%rdi,%r10,4) addb %al,%dl movb (%rdi,%rdx,4),%r8b addb %bl,%cl movl (%rdi,%rcx,4),%edx movl %ebx,(%rdi,%rcx,4) movl 20(%rdi,%rsi,4),%eax rorq $8,%r8 movl %edx,20(%rdi,%r10,4) addb %bl,%dl movb (%rdi,%rdx,4),%r8b addb %al,%cl movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) movl 24(%rdi,%rsi,4),%ebx rorq $8,%r8 movl %edx,24(%rdi,%r10,4) addb %al,%dl movb (%rdi,%rdx,4),%r8b addb $8,%sil addb %bl,%cl movl (%rdi,%rcx,4),%edx movl %ebx,(%rdi,%rcx,4) movl -4(%rdi,%rsi,4),%eax rorq $8,%r8 movl %edx,28(%rdi,%r10,4) addb %bl,%dl movb (%rdi,%rdx,4),%r8b addb $8,%r10b rorq $8,%r8 subq $8,%r11 xorq (%r12),%r8 movq %r8,(%r13,%r12,1) leaq 8(%r12),%r12 testq $-8,%r11 jnz L$oop8 cmpq $0,%r11 jne L$loop1 jmp L$exit .p2align 4 L$intel: testq $-32,%r11 jz L$loop1 andq $15,%rbx jz L$oop16_is_hot subq %rbx,%r11 L$oop16_warmup: addb %al,%cl movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) movl %edx,(%rdi,%r10,4) addb %dl,%al incb %r10b movl (%rdi,%rax,4),%edx movl (%rdi,%r10,4),%eax xorb (%r12),%dl movb %dl,(%r13,%r12,1) leaq 1(%r12),%r12 decq %rbx jnz L$oop16_warmup movq %rcx,%rbx xorq %rcx,%rcx movb %bl,%cl L$oop16_is_hot: leaq (%rdi,%r10,4),%rsi addb %al,%cl movl (%rdi,%rcx,4),%edx pxor %xmm0,%xmm0 movl %eax,(%rdi,%rcx,4) addb %dl,%al movl 4(%rsi),%ebx movzbl %al,%eax movl %edx,0(%rsi) addb %bl,%cl pinsrw $0,(%rdi,%rax,4),%xmm0 jmp L$oop16_enter .p2align 4 L$oop16: addb %al,%cl movl (%rdi,%rcx,4),%edx pxor %xmm0,%xmm2 psllq $8,%xmm1 pxor %xmm0,%xmm0 movl %eax,(%rdi,%rcx,4) addb %dl,%al movl 4(%rsi),%ebx movzbl %al,%eax movl %edx,0(%rsi) pxor %xmm1,%xmm2 addb %bl,%cl pinsrw $0,(%rdi,%rax,4),%xmm0 movdqu %xmm2,(%r13,%r12,1) leaq 16(%r12),%r12 L$oop16_enter: movl (%rdi,%rcx,4),%edx pxor %xmm1,%xmm1 movl %ebx,(%rdi,%rcx,4) addb %dl,%bl movl 8(%rsi),%eax movzbl %bl,%ebx movl %edx,4(%rsi) addb %al,%cl pinsrw $0,(%rdi,%rbx,4),%xmm1 movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) addb %dl,%al movl 12(%rsi),%ebx movzbl %al,%eax movl %edx,8(%rsi) addb %bl,%cl pinsrw $1,(%rdi,%rax,4),%xmm0 movl (%rdi,%rcx,4),%edx movl %ebx,(%rdi,%rcx,4) addb %dl,%bl movl 16(%rsi),%eax movzbl %bl,%ebx movl %edx,12(%rsi) addb %al,%cl pinsrw $1,(%rdi,%rbx,4),%xmm1 movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) addb %dl,%al movl 20(%rsi),%ebx movzbl %al,%eax movl %edx,16(%rsi) addb %bl,%cl pinsrw $2,(%rdi,%rax,4),%xmm0 movl (%rdi,%rcx,4),%edx movl %ebx,(%rdi,%rcx,4) addb %dl,%bl movl 24(%rsi),%eax movzbl %bl,%ebx movl %edx,20(%rsi) addb %al,%cl pinsrw $2,(%rdi,%rbx,4),%xmm1 movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) addb %dl,%al movl 28(%rsi),%ebx movzbl %al,%eax movl %edx,24(%rsi) addb %bl,%cl pinsrw $3,(%rdi,%rax,4),%xmm0 movl (%rdi,%rcx,4),%edx movl %ebx,(%rdi,%rcx,4) addb %dl,%bl movl 32(%rsi),%eax movzbl %bl,%ebx movl %edx,28(%rsi) addb %al,%cl pinsrw $3,(%rdi,%rbx,4),%xmm1 movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) addb %dl,%al movl 36(%rsi),%ebx movzbl %al,%eax movl %edx,32(%rsi) addb %bl,%cl pinsrw $4,(%rdi,%rax,4),%xmm0 movl (%rdi,%rcx,4),%edx movl %ebx,(%rdi,%rcx,4) addb %dl,%bl movl 40(%rsi),%eax movzbl %bl,%ebx movl %edx,36(%rsi) addb %al,%cl pinsrw $4,(%rdi,%rbx,4),%xmm1 movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) addb %dl,%al movl 44(%rsi),%ebx movzbl %al,%eax movl %edx,40(%rsi) addb %bl,%cl pinsrw $5,(%rdi,%rax,4),%xmm0 movl (%rdi,%rcx,4),%edx movl %ebx,(%rdi,%rcx,4) addb %dl,%bl movl 48(%rsi),%eax movzbl %bl,%ebx movl %edx,44(%rsi) addb %al,%cl pinsrw $5,(%rdi,%rbx,4),%xmm1 movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) addb %dl,%al movl 52(%rsi),%ebx movzbl %al,%eax movl %edx,48(%rsi) addb %bl,%cl pinsrw $6,(%rdi,%rax,4),%xmm0 movl (%rdi,%rcx,4),%edx movl %ebx,(%rdi,%rcx,4) addb %dl,%bl movl 56(%rsi),%eax movzbl %bl,%ebx movl %edx,52(%rsi) addb %al,%cl pinsrw $6,(%rdi,%rbx,4),%xmm1 movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) addb %dl,%al movl 60(%rsi),%ebx movzbl %al,%eax movl %edx,56(%rsi) addb %bl,%cl pinsrw $7,(%rdi,%rax,4),%xmm0 addb $16,%r10b movdqu (%r12),%xmm2 movl (%rdi,%rcx,4),%edx movl %ebx,(%rdi,%rcx,4) addb %dl,%bl movzbl %bl,%ebx movl %edx,60(%rsi) leaq (%rdi,%r10,4),%rsi pinsrw $7,(%rdi,%rbx,4),%xmm1 movl (%rsi),%eax movq %rcx,%rbx xorq %rcx,%rcx subq $16,%r11 movb %bl,%cl testq $-16,%r11 jnz L$oop16 psllq $8,%xmm1 pxor %xmm0,%xmm2 pxor %xmm1,%xmm2 movdqu %xmm2,(%r13,%r12,1) leaq 16(%r12),%r12 cmpq $0,%r11 jne L$loop1 jmp L$exit .p2align 4 L$loop1: addb %al,%cl movl (%rdi,%rcx,4),%edx movl %eax,(%rdi,%rcx,4) movl %edx,(%rdi,%r10,4) addb %dl,%al incb %r10b movl (%rdi,%rax,4),%edx movl (%rdi,%r10,4),%eax xorb (%r12),%dl movb %dl,(%r13,%r12,1) leaq 1(%r12),%r12 decq %r11 jnz L$loop1 jmp L$exit .p2align 4 L$RC4_CHAR: addb $1,%r10b movzbl (%rdi,%r10,1),%eax testq $-8,%r11 jz L$cloop1 jmp L$cloop8 .p2align 4 L$cloop8: movl (%r12),%r8d movl 4(%r12),%r9d addb %al,%cl leaq 1(%r10),%rsi movzbl (%rdi,%rcx,1),%edx movzbl %sil,%esi movzbl (%rdi,%rsi,1),%ebx movb %al,(%rdi,%rcx,1) cmpq %rsi,%rcx movb %dl,(%rdi,%r10,1) jne L$cmov0 movq %rax,%rbx L$cmov0: addb %al,%dl xorb (%rdi,%rdx,1),%r8b rorl $8,%r8d addb %bl,%cl leaq 1(%rsi),%r10 movzbl (%rdi,%rcx,1),%edx movzbl %r10b,%r10d movzbl (%rdi,%r10,1),%eax movb %bl,(%rdi,%rcx,1) cmpq %r10,%rcx movb %dl,(%rdi,%rsi,1) jne L$cmov1 movq %rbx,%rax L$cmov1: addb %bl,%dl xorb (%rdi,%rdx,1),%r8b rorl $8,%r8d addb %al,%cl leaq 1(%r10),%rsi movzbl (%rdi,%rcx,1),%edx movzbl %sil,%esi movzbl (%rdi,%rsi,1),%ebx movb %al,(%rdi,%rcx,1) cmpq %rsi,%rcx movb %dl,(%rdi,%r10,1) jne L$cmov2 movq %rax,%rbx L$cmov2: addb %al,%dl xorb (%rdi,%rdx,1),%r8b rorl $8,%r8d addb %bl,%cl leaq 1(%rsi),%r10 movzbl (%rdi,%rcx,1),%edx movzbl %r10b,%r10d movzbl (%rdi,%r10,1),%eax movb %bl,(%rdi,%rcx,1) cmpq %r10,%rcx movb %dl,(%rdi,%rsi,1) jne L$cmov3 movq %rbx,%rax L$cmov3: addb %bl,%dl xorb (%rdi,%rdx,1),%r8b rorl $8,%r8d addb %al,%cl leaq 1(%r10),%rsi movzbl (%rdi,%rcx,1),%edx movzbl %sil,%esi movzbl (%rdi,%rsi,1),%ebx movb %al,(%rdi,%rcx,1) cmpq %rsi,%rcx movb %dl,(%rdi,%r10,1) jne L$cmov4 movq %rax,%rbx L$cmov4: addb %al,%dl xorb (%rdi,%rdx,1),%r9b rorl $8,%r9d addb %bl,%cl leaq 1(%rsi),%r10 movzbl (%rdi,%rcx,1),%edx movzbl %r10b,%r10d movzbl (%rdi,%r10,1),%eax movb %bl,(%rdi,%rcx,1) cmpq %r10,%rcx movb %dl,(%rdi,%rsi,1) jne L$cmov5 movq %rbx,%rax L$cmov5: addb %bl,%dl xorb (%rdi,%rdx,1),%r9b rorl $8,%r9d addb %al,%cl leaq 1(%r10),%rsi movzbl (%rdi,%rcx,1),%edx movzbl %sil,%esi movzbl (%rdi,%rsi,1),%ebx movb %al,(%rdi,%rcx,1) cmpq %rsi,%rcx movb %dl,(%rdi,%r10,1) jne L$cmov6 movq %rax,%rbx L$cmov6: addb %al,%dl xorb (%rdi,%rdx,1),%r9b rorl $8,%r9d addb %bl,%cl leaq 1(%rsi),%r10 movzbl (%rdi,%rcx,1),%edx movzbl %r10b,%r10d movzbl (%rdi,%r10,1),%eax movb %bl,(%rdi,%rcx,1) cmpq %r10,%rcx movb %dl,(%rdi,%rsi,1) jne L$cmov7 movq %rbx,%rax L$cmov7: addb %bl,%dl xorb (%rdi,%rdx,1),%r9b rorl $8,%r9d leaq -8(%r11),%r11 movl %r8d,(%r13) leaq 8(%r12),%r12 movl %r9d,4(%r13) leaq 8(%r13),%r13 testq $-8,%r11 jnz L$cloop8 cmpq $0,%r11 jne L$cloop1 jmp L$exit .p2align 4 L$cloop1: addb %al,%cl movzbl %cl,%ecx movzbl (%rdi,%rcx,1),%edx movb %al,(%rdi,%rcx,1) movb %dl,(%rdi,%r10,1) addb %al,%dl addb $1,%r10b movzbl %dl,%edx movzbl %r10b,%r10d movzbl (%rdi,%rdx,1),%edx movzbl (%rdi,%r10,1),%eax xorb (%r12),%dl leaq 1(%r12),%r12 movb %dl,(%r13) leaq 1(%r13),%r13 subq $1,%r11 jnz L$cloop1 jmp L$exit .p2align 4 L$exit: subb $1,%r10b movl %r10d,-8(%rdi) movl %ecx,-4(%rdi) movq (%rsp),%r13 movq 8(%rsp),%r12 movq 16(%rsp),%rbx addq $24,%rsp L$epilogue: .byte 0xf3,0xc3 .globl _private_RC4_set_key .p2align 4 _private_RC4_set_key: leaq 8(%rdi),%rdi leaq (%rdx,%rsi,1),%rdx negq %rsi movq %rsi,%rcx xorl %eax,%eax xorq %r9,%r9 xorq %r10,%r10 xorq %r11,%r11 movl _OPENSSL_ia32cap_P(%rip),%r8d btl $20,%r8d jc L$c1stloop jmp L$w1stloop .p2align 4 L$w1stloop: movl %eax,(%rdi,%rax,4) addb $1,%al jnc L$w1stloop xorq %r9,%r9 xorq %r8,%r8 .p2align 4 L$w2ndloop: movl (%rdi,%r9,4),%r10d addb (%rdx,%rsi,1),%r8b addb %r10b,%r8b addq $1,%rsi movl (%rdi,%r8,4),%r11d cmovzq %rcx,%rsi movl %r10d,(%rdi,%r8,4) movl %r11d,(%rdi,%r9,4) addb $1,%r9b jnc L$w2ndloop jmp L$exit_key .p2align 4 L$c1stloop: movb %al,(%rdi,%rax,1) addb $1,%al jnc L$c1stloop xorq %r9,%r9 xorq %r8,%r8 .p2align 4 L$c2ndloop: movb (%rdi,%r9,1),%r10b addb (%rdx,%rsi,1),%r8b addb %r10b,%r8b addq $1,%rsi movb (%rdi,%r8,1),%r11b jnz L$cnowrap movq %rcx,%rsi L$cnowrap: movb %r10b,(%rdi,%r8,1) movb %r11b,(%rdi,%r9,1) addb $1,%r9b jnc L$c2ndloop movl $-1,256(%rdi) .p2align 4 L$exit_key: xorl %eax,%eax movl %eax,-8(%rdi) movl %eax,-4(%rdi) .byte 0xf3,0xc3 .globl _RC4_options .p2align 4 _RC4_options: leaq L$opts(%rip),%rax movl _OPENSSL_ia32cap_P(%rip),%edx btl $20,%edx jc L$8xchar btl $30,%edx jnc L$done addq $25,%rax .byte 0xf3,0xc3 L$8xchar: addq $12,%rax L$done: .byte 0xf3,0xc3 .p2align 6 L$opts: .byte 114,99,52,40,56,120,44,105,110,116,41,0 .byte 114,99,52,40,56,120,44,99,104,97,114,41,0 .byte 114,99,52,40,49,54,120,44,105,110,116,41,0 .byte 82,67,52,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .p2align 6