📄 aes-x86_64.pl
字号:
shl \$24,$acc1 xor $acc0,$t2 xor $acc1,$t3 mov 16+4($key),$s1 mov 16+8($key),$s2 xor $t0,$s0 xor $t1,$s1 xor $t2,$s2 xor $t3,$s3___}sub decstep(){ my ($i,@s) = @_; my $tmp0=$acc0; my $tmp1=$acc1; my $tmp2=$acc2; my $out=($t0,$t1,$t2,$s[0])[$i]; $code.=" mov $s[0],$out\n" if ($i!=3); $tmp1=$s[2] if ($i==3); $code.=" mov $s[2],$tmp1\n" if ($i!=3); $code.=" and \$0xFF,$out\n"; $code.=" mov 0($sbox,$out,8),$out\n"; $code.=" shr \$16,$tmp1\n"; $tmp2=$s[3] if ($i==3); $code.=" mov $s[3],$tmp2\n" if ($i!=3); $tmp0=$s[1] if ($i==3); $code.=" movzb ".&hi($s[1]).",$tmp0\n"; $code.=" and \$0xFF,$tmp1\n"; $code.=" shr \$24,$tmp2\n"; $code.=" xor 3($sbox,$tmp0,8),$out\n"; $code.=" xor 2($sbox,$tmp1,8),$out\n"; $code.=" xor 1($sbox,$tmp2,8),$out\n"; $code.=" mov $t2,$s[1]\n" if ($i==3); $code.=" mov $t1,$s[2]\n" if ($i==3); $code.=" mov $t0,$s[3]\n" if ($i==3); $code.="\n";}sub declast(){ my ($i,@s)=@_; my $tmp0=$acc0; my $tmp1=$acc1; my $tmp2=$acc2; my $out=($t0,$t1,$t2,$s[0])[$i]; $code.=" mov $s[0],$out\n" if ($i!=3); $tmp1=$s[2] if ($i==3); $code.=" mov $s[2],$tmp1\n" if ($i!=3); $code.=" and \$0xFF,$out\n"; $code.=" movzb 2048($sbox,$out,1),$out\n"; $code.=" shr \$16,$tmp1\n"; $tmp2=$s[3] if ($i==3); $code.=" mov $s[3],$tmp2\n" if ($i!=3); $tmp0=$s[1] if ($i==3); $code.=" movzb ".&hi($s[1]).",$tmp0\n"; $code.=" and \$0xFF,$tmp1\n"; $code.=" shr \$24,$tmp2\n"; $code.=" movzb 2048($sbox,$tmp0,1),$tmp0\n"; $code.=" movzb 2048($sbox,$tmp1,1),$tmp1\n"; $code.=" movzb 2048($sbox,$tmp2,1),$tmp2\n"; $code.=" shl \$8,$tmp0\n"; $code.=" shl \$16,$tmp1\n"; $code.=" shl \$24,$tmp2\n"; $code.=" xor $tmp0,$out\n"; $code.=" mov $t2,$s[1]\n" if ($i==3); $code.=" xor $tmp1,$out\n"; $code.=" mov $t1,$s[2]\n" if ($i==3); $code.=" xor $tmp2,$out\n"; $code.=" mov $t0,$s[3]\n" if ($i==3); $code.="\n";}$code.=<<___;.type _x86_64_AES_decrypt,\@abi-omnipotent.align 16_x86_64_AES_decrypt: xor 0($key),$s0 # xor with key xor 4($key),$s1 xor 8($key),$s2 xor 12($key),$s3 mov 240($key),$rnds # load key->rounds sub \$1,$rnds jmp .Ldec_loop.align 16.Ldec_loop:___ if ($verticalspin) { &decvert(); } else { &decstep(0,$s0,$s3,$s2,$s1); &decstep(1,$s1,$s0,$s3,$s2); &decstep(2,$s2,$s1,$s0,$s3); &decstep(3,$s3,$s2,$s1,$s0); $code.=<<___; lea 16($key),$key xor 0($key),$s0 # xor with key xor 4($key),$s1 xor 8($key),$s2 xor 12($key),$s3___ }$code.=<<___; sub \$1,$rnds jnz .Ldec_loop___ if ($verticalspin) { &declastvert(); } else { &declast(0,$s0,$s3,$s2,$s1); &declast(1,$s1,$s0,$s3,$s2); &declast(2,$s2,$s1,$s0,$s3); &declast(3,$s3,$s2,$s1,$s0); $code.=<<___; xor 16+0($key),$s0 # xor with key xor 16+4($key),$s1 xor 16+8($key),$s2 xor 16+12($key),$s3___ }$code.=<<___; .byte 0xf3,0xc3 # rep ret.size _x86_64_AES_decrypt,.-_x86_64_AES_decrypt___# void AES_decrypt (const void *inp,void *out,const AES_KEY *key);$code.=<<___;.globl AES_decrypt.type AES_decrypt,\@function,3.align 16AES_decrypt: push %rbx push %rbp push %r12 push %r13 push %r14 push %r15 mov %rdx,$key mov %rdi,$inp mov %rsi,$out .picmeup $sbox lea AES_Td-.($sbox),$sbox # prefetch Td4 lea 2048+128($sbox),$sbox; mov 0-128($sbox),$s0 mov 32-128($sbox),$s1 mov 64-128($sbox),$s2 mov 96-128($sbox),$s3 mov 128-128($sbox),$s0 mov 160-128($sbox),$s1 mov 192-128($sbox),$s2 mov 224-128($sbox),$s3 lea -2048-128($sbox),$sbox; mov 0($inp),$s0 mov 4($inp),$s1 mov 8($inp),$s2 mov 12($inp),$s3 call _x86_64_AES_decrypt mov $s0,0($out) mov $s1,4($out) mov $s2,8($out) mov $s3,12($out) pop %r15 pop %r14 pop %r13 pop %r12 pop %rbp pop %rbx ret.size AES_decrypt,.-AES_decrypt___#------------------------------------------------------------------#sub enckey(){$code.=<<___; movz %dl,%esi # rk[i]>>0 mov 2(%rbp,%rsi,8),%ebx movz %dh,%esi # rk[i]>>8 and \$0xFF000000,%ebx xor %ebx,%eax mov 2(%rbp,%rsi,8),%ebx shr \$16,%edx and \$0x000000FF,%ebx movz %dl,%esi # rk[i]>>16 xor %ebx,%eax mov 0(%rbp,%rsi,8),%ebx movz %dh,%esi # rk[i]>>24 and \$0x0000FF00,%ebx xor %ebx,%eax mov 0(%rbp,%rsi,8),%ebx and \$0x00FF0000,%ebx xor %ebx,%eax xor 2048(%rbp,%rcx,4),%eax # rcon___}# int AES_set_encrypt_key(const unsigned char *userKey, const int bits,# AES_KEY *key)$code.=<<___;.globl AES_set_encrypt_key.type AES_set_encrypt_key,\@function,3.align 16AES_set_encrypt_key: push %rbx push %rbp mov %esi,%ecx # %ecx=bits mov %rdi,%rsi # %rsi=userKey mov %rdx,%rdi # %rdi=key test \$-1,%rsi jz .Lbadpointer test \$-1,%rdi jz .Lbadpointer .picmeup %rbp lea AES_Te-.(%rbp),%rbp cmp \$128,%ecx je .L10rounds cmp \$192,%ecx je .L12rounds cmp \$256,%ecx je .L14rounds mov \$-2,%rax # invalid number of bits jmp .Lexit.L10rounds: mov 0(%rsi),%eax # copy first 4 dwords mov 4(%rsi),%ebx mov 8(%rsi),%ecx mov 12(%rsi),%edx mov %eax,0(%rdi) mov %ebx,4(%rdi) mov %ecx,8(%rdi) mov %edx,12(%rdi) xor %ecx,%ecx jmp .L10shortcut.align 4.L10loop: mov 0(%rdi),%eax # rk[0] mov 12(%rdi),%edx # rk[3].L10shortcut:___ &enckey ();$code.=<<___; mov %eax,16(%rdi) # rk[4] xor 4(%rdi),%eax mov %eax,20(%rdi) # rk[5] xor 8(%rdi),%eax mov %eax,24(%rdi) # rk[6] xor 12(%rdi),%eax mov %eax,28(%rdi) # rk[7] add \$1,%ecx lea 16(%rdi),%rdi cmp \$10,%ecx jl .L10loop movl \$10,80(%rdi) # setup number of rounds xor %rax,%rax jmp .Lexit.L12rounds: mov 0(%rsi),%eax # copy first 6 dwords mov 4(%rsi),%ebx mov 8(%rsi),%ecx mov 12(%rsi),%edx mov %eax,0(%rdi) mov %ebx,4(%rdi) mov %ecx,8(%rdi) mov %edx,12(%rdi) mov 16(%rsi),%ecx mov 20(%rsi),%edx mov %ecx,16(%rdi) mov %edx,20(%rdi) xor %ecx,%ecx jmp .L12shortcut.align 4.L12loop: mov 0(%rdi),%eax # rk[0] mov 20(%rdi),%edx # rk[5].L12shortcut:___ &enckey ();$code.=<<___; mov %eax,24(%rdi) # rk[6] xor 4(%rdi),%eax mov %eax,28(%rdi) # rk[7] xor 8(%rdi),%eax mov %eax,32(%rdi) # rk[8] xor 12(%rdi),%eax mov %eax,36(%rdi) # rk[9] cmp \$7,%ecx je .L12break add \$1,%ecx xor 16(%rdi),%eax mov %eax,40(%rdi) # rk[10] xor 20(%rdi),%eax mov %eax,44(%rdi) # rk[11] lea 24(%rdi),%rdi jmp .L12loop.L12break: movl \$12,72(%rdi) # setup number of rounds xor %rax,%rax jmp .Lexit.L14rounds: mov 0(%rsi),%eax # copy first 8 dwords mov 4(%rsi),%ebx mov 8(%rsi),%ecx mov 12(%rsi),%edx mov %eax,0(%rdi) mov %ebx,4(%rdi) mov %ecx,8(%rdi) mov %edx,12(%rdi) mov 16(%rsi),%eax mov 20(%rsi),%ebx mov 24(%rsi),%ecx mov 28(%rsi),%edx mov %eax,16(%rdi) mov %ebx,20(%rdi) mov %ecx,24(%rdi) mov %edx,28(%rdi) xor %ecx,%ecx jmp .L14shortcut.align 4.L14loop: mov 28(%rdi),%edx # rk[4].L14shortcut: mov 0(%rdi),%eax # rk[0]___ &enckey ();$code.=<<___; mov %eax,32(%rdi) # rk[8] xor 4(%rdi),%eax mov %eax,36(%rdi) # rk[9] xor 8(%rdi),%eax mov %eax,40(%rdi) # rk[10] xor 12(%rdi),%eax mov %eax,44(%rdi) # rk[11] cmp \$6,%ecx je .L14break add \$1,%ecx mov %eax,%edx mov 16(%rdi),%eax # rk[4] movz %dl,%esi # rk[11]>>0 mov 2(%rbp,%rsi,8),%ebx movz %dh,%esi # rk[11]>>8 and \$0x000000FF,%ebx xor %ebx,%eax mov 0(%rbp,%rsi,8),%ebx shr \$16,%edx and \$0x0000FF00,%ebx movz %dl,%esi # rk[11]>>16 xor %ebx,%eax mov 0(%rbp,%rsi,8),%ebx movz %dh,%esi # rk[11]>>24 and \$0x00FF0000,%ebx xor %ebx,%eax mov 2(%rbp,%rsi,8),%ebx and \$0xFF000000,%ebx xor %ebx,%eax mov %eax,48(%rdi) # rk[12] xor 20(%rdi),%eax mov %eax,52(%rdi) # rk[13] xor 24(%rdi),%eax mov %eax,56(%rdi) # rk[14] xor 28(%rdi),%eax mov %eax,60(%rdi) # rk[15] lea 32(%rdi),%rdi jmp .L14loop.L14break: movl \$14,48(%rdi) # setup number of rounds xor %rax,%rax jmp .Lexit.Lbadpointer: mov \$-1,%rax.Lexit: pop %rbp pop %rbx ret.size AES_set_encrypt_key,.-AES_set_encrypt_key___sub deckey(){ my ($i,$ptr,$te,$td) = @_;$code.=<<___; mov $i($ptr),%eax mov %eax,%edx movz %ah,%ebx shr \$16,%edx and \$0xFF,%eax movzb 2($te,%rax,8),%rax movzb 2($te,%rbx,8),%rbx mov 0($td,%rax,8),%eax xor 3($td,%rbx,8),%eax movzb %dh,%ebx and \$0xFF,%edx movzb 2($te,%rdx,8),%rdx movzb 2($te,%rbx,8),%rbx xor 2($td,%rdx,8),%eax xor 1($td,%rbx,8),%eax mov %eax,$i($ptr)___}# int AES_set_decrypt_key(const unsigned char *userKey, const int bits,# AES_KEY *key)$code.=<<___;.globl AES_set_decrypt_key.type AES_set_decrypt_key,\@function,3.align 16AES_set_decrypt_key: push %rdx call AES_set_encrypt_key cmp \$0,%eax je .Lproceed lea 24(%rsp),%rsp ret.Lproceed: mov (%rsp),%r8 # restore key schedule mov %rbx,(%rsp) mov 240(%r8),%ecx # pull number of rounds xor %rdi,%rdi lea (%rdi,%rcx,4),%rcx mov %r8,%rsi lea (%r8,%rcx,4),%rdi # pointer to last chunk.align 4.Linvert: mov 0(%rsi),%rax mov 8(%rsi),%rbx mov 0(%rdi),%rcx mov 8(%rdi),%rdx mov %rax,0(%rdi) mov %rbx,8(%rdi) mov %rcx,0(%rsi) mov %rdx,8(%rsi) lea 16(%rsi),%rsi lea -16(%rdi),%rdi cmp %rsi,%rdi jne .Linvert .picmeup %r9 lea AES_Td-.(%r9),%rdi lea AES_Te-AES_Td(%rdi),%r9 mov %r8,%rsi mov 240(%r8),%ecx # pull number of rounds sub \$1,%ecx.align 4.Lpermute: lea 16(%rsi),%rsi___ &deckey (0,"%rsi","%r9","%rdi"); &deckey (4,"%rsi","%r9","%rdi"); &deckey (8,"%rsi","%r9","%rdi"); &deckey (12,"%rsi","%r9","%rdi");$code.=<<___; sub \$1,%ecx jnz .Lpermute xor %rax,%rax pop %rbx ret.size AES_set_decrypt_key,.-AES_set_decrypt_key___# void AES_cbc_encrypt (const void char *inp, unsigned char *out,# size_t length, const AES_KEY *key,# unsigned char *ivp,const int enc);{# stack frame layout# -8(%rsp) return addressmy $_rsp="0(%rsp)"; # saved %rspmy $_len="8(%rsp)"; # copy of 3rd parameter, lengthmy $_key="16(%rsp)"; # copy of 4th parameter, keymy $_ivp="24(%rsp)"; # copy of 5th parameter, ivpmy $keyp="32(%rsp)"; # one to pass as $keymy $ivec="40(%rsp)"; # ivec[16]my $aes_key="56(%rsp)"; # copy of aes_keymy $mark="56+240(%rsp)"; # copy of aes_key->rounds$code.=<<___;.globl AES_cbc_encrypt.type AES_cbc_encrypt,\@function,6.align 16AES_cbc_encrypt: cmp \$0,%rdx # check length je .Lcbc_just_ret push %rbx push %rbp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -