.file "bf-686.s" .text .globl _BF_encrypt .align 4 _BF_encrypt: L_BF_encrypt_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi # Load the 2 words movl 20(%esp),%eax movl (%eax),%ecx movl 4(%eax),%edx # P pointer, s and enc flag movl 24(%esp),%edi xorl %eax,%eax xorl %ebx,%ebx xorl (%edi),%ecx # Round 0 rorl $16,%ecx movl 4(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 1 rorl $16,%edx movl 8(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 2 rorl $16,%ecx movl 12(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 3 rorl $16,%edx movl 16(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 4 rorl $16,%ecx movl 20(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 5 rorl $16,%edx movl 24(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 6 rorl $16,%ecx movl 28(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 7 rorl $16,%edx movl 32(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 8 rorl $16,%ecx movl 36(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 9 rorl $16,%edx movl 40(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 10 rorl $16,%ecx movl 44(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 11 rorl $16,%edx movl 48(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 12 rorl $16,%ecx movl 52(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 13 rorl $16,%edx movl 56(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 14 rorl $16,%ecx movl 60(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 15 rorl $16,%edx movl 64(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx xorl 68(%edi),%edx movl 20(%esp),%eax movl %edx,(%eax) movl %ecx,4(%eax) popl %edi popl %esi popl %ebx popl %ebp ret .globl _BF_decrypt .align 4 _BF_decrypt: L_BF_decrypt_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi # Load the 2 words movl 20(%esp),%eax movl (%eax),%ecx movl 4(%eax),%edx # P pointer, s and enc flag movl 24(%esp),%edi xorl %eax,%eax xorl %ebx,%ebx xorl 68(%edi),%ecx # Round 16 rorl $16,%ecx movl 64(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 15 rorl $16,%edx movl 60(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 14 rorl $16,%ecx movl 56(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 13 rorl $16,%edx movl 52(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 12 rorl $16,%ecx movl 48(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 11 rorl $16,%edx movl 44(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 10 rorl $16,%ecx movl 40(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 9 rorl $16,%edx movl 36(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 8 rorl $16,%ecx movl 32(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 7 rorl $16,%edx movl 28(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 6 rorl $16,%ecx movl 24(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 5 rorl $16,%edx movl 20(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 4 rorl $16,%ecx movl 16(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 3 rorl $16,%edx movl 12(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx # Round 2 rorl $16,%ecx movl 8(%edi),%esi movb %ch,%al movb %cl,%bl rorl $16,%ecx xorl %esi,%edx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %ch,%al movb %cl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%edx # Round 1 rorl $16,%edx movl 4(%edi),%esi movb %dh,%al movb %dl,%bl rorl $16,%edx xorl %esi,%ecx movl 72(%edi,%eax,4),%esi movl 1096(%edi,%ebx,4),%ebp movb %dh,%al movb %dl,%bl addl %ebp,%esi movl 2120(%edi,%eax,4),%eax xorl %eax,%esi movl 3144(%edi,%ebx,4),%ebp addl %ebp,%esi xorl %eax,%eax xorl %esi,%ecx xorl (%edi),%edx movl 20(%esp),%eax movl %edx,(%eax) movl %ecx,4(%eax) popl %edi popl %esi popl %ebx popl %ebp ret .globl _BF_cbc_encrypt .align 4 _BF_cbc_encrypt: L_BF_cbc_encrypt_begin: pushl %ebp pushl %ebx pushl %esi pushl %edi movl 28(%esp),%ebp # getting iv ptr from parameter 4 movl 36(%esp),%ebx movl (%ebx),%esi movl 4(%ebx),%edi pushl %edi pushl %esi pushl %edi pushl %esi movl %esp,%ebx movl 36(%esp),%esi movl 40(%esp),%edi # getting encrypt flag from parameter 5 movl 56(%esp),%ecx # get and push parameter 3 movl 48(%esp),%eax pushl %eax pushl %ebx cmpl $0,%ecx jz L000decrypt andl $4294967288,%ebp movl 8(%esp),%eax movl 12(%esp),%ebx jz L001encrypt_finish L002encrypt_loop: movl (%esi),%ecx movl 4(%esi),%edx xorl %ecx,%eax xorl %edx,%ebx bswap %eax bswap %ebx movl %eax,8(%esp) movl %ebx,12(%esp) call L_BF_encrypt_begin movl 8(%esp),%eax movl 12(%esp),%ebx bswap %eax bswap %ebx movl %eax,(%edi) movl %ebx,4(%edi) addl $8,%esi addl $8,%edi subl $8,%ebp jnz L002encrypt_loop L001encrypt_finish: movl 52(%esp),%ebp andl $7,%ebp jz L003finish call L004PIC_point L004PIC_point: popl %edx leal L005cbc_enc_jmp_table-L004PIC_point(%edx),%ecx movl (%ecx,%ebp,4),%ebp addl %edx,%ebp xorl %ecx,%ecx xorl %edx,%edx jmp *%ebp L006ej7: movb 6(%esi),%dh shll $8,%edx L007ej6: movb 5(%esi),%dh L008ej5: movb 4(%esi),%dl L009ej4: movl (%esi),%ecx jmp L010ejend L011ej3: movb 2(%esi),%ch shll $8,%ecx L012ej2: movb 1(%esi),%ch L013ej1: movb (%esi),%cl L010ejend: xorl %ecx,%eax xorl %edx,%ebx bswap %eax bswap %ebx movl %eax,8(%esp) movl %ebx,12(%esp) call L_BF_encrypt_begin movl 8(%esp),%eax movl 12(%esp),%ebx bswap %eax bswap %ebx movl %eax,(%edi) movl %ebx,4(%edi) jmp L003finish L000decrypt: andl $4294967288,%ebp movl 16(%esp),%eax movl 20(%esp),%ebx jz L014decrypt_finish L015decrypt_loop: movl (%esi),%eax movl 4(%esi),%ebx bswap %eax bswap %ebx movl %eax,8(%esp) movl %ebx,12(%esp) call L_BF_decrypt_begin movl 8(%esp),%eax movl 12(%esp),%ebx bswap %eax bswap %ebx movl 16(%esp),%ecx movl 20(%esp),%edx xorl %eax,%ecx xorl %ebx,%edx movl (%esi),%eax movl 4(%esi),%ebx movl %ecx,(%edi) movl %edx,4(%edi) movl %eax,16(%esp) movl %ebx,20(%esp) addl $8,%esi addl $8,%edi subl $8,%ebp jnz L015decrypt_loop L014decrypt_finish: movl 52(%esp),%ebp andl $7,%ebp jz L003finish movl (%esi),%eax movl 4(%esi),%ebx bswap %eax bswap %ebx movl %eax,8(%esp) movl %ebx,12(%esp) call L_BF_decrypt_begin movl 8(%esp),%eax movl 12(%esp),%ebx bswap %eax bswap %ebx movl 16(%esp),%ecx movl 20(%esp),%edx xorl %eax,%ecx xorl %ebx,%edx movl (%esi),%eax movl 4(%esi),%ebx L016dj7: rorl $16,%edx movb %dl,6(%edi) shrl $16,%edx L017dj6: movb %dh,5(%edi) L018dj5: movb %dl,4(%edi) L019dj4: movl %ecx,(%edi) jmp L020djend L021dj3: rorl $16,%ecx movb %cl,2(%edi) shll $16,%ecx L022dj2: movb %ch,1(%esi) L023dj1: movb %cl,(%esi) L020djend: jmp L003finish L003finish: movl 60(%esp),%ecx addl $24,%esp movl %eax,(%ecx) movl %ebx,4(%ecx) popl %edi popl %esi popl %ebx popl %ebp ret .align 6,0x90 L005cbc_enc_jmp_table: .long 0 .long L013ej1-L004PIC_point .long L012ej2-L004PIC_point .long L011ej3-L004PIC_point .long L009ej4-L004PIC_point .long L008ej5-L004PIC_point .long L007ej6-L004PIC_point .long L006ej7-L004PIC_point .align 6,0x90