📄 aes-s390x.pl
字号:
llgf $s0,0($inp) llgf $s1,4($inp) llgf $s2,8($inp) llgf $s3,12($inp) llill $mask,`0xff<<3` bras $ra,_s390x_AES_decrypt lg $out,24($sp) st $s0,0($out) st $s1,4($out) st $s2,8($out) st $s3,12($out) lmg %r6,$ra,48($sp) br $ra.size AES_decrypt,.-AES_decrypt.type _s390x_AES_decrypt,\@function.align 16_s390x_AES_decrypt: x $s0,0($key) x $s1,4($key) x $s2,8($key) x $s3,12($key) l $rounds,240($key) aghi $rounds,-1.Ldec_loop: srlg $i1,$s0,`16-3` srlg $i2,$s0,`8-3` sllg $i3,$s0,`0+3` srl $s0,`24-3` nr $s0,$mask nr $i1,$mask nr $i2,$mask ngr $i3,$mask l $s0,0($s0,$tbl) # Td0[s0>>24] l $t1,3($i1,$tbl) # Td1[s0>>16] l $t2,2($i2,$tbl) # Td2[s0>>8] l $t3,1($i3,$tbl) # Td3[s0>>0] sllg $i1,$s1,`0+3` # i0 srlg $i2,$s1,`16-3` srlg $i3,$s1,`8-3` srl $s1,`24-3` ngr $i1,$mask nr $s1,$mask nr $i2,$mask nr $i3,$mask x $s0,1($i1,$tbl) # Td3[s1>>0] l $s1,0($s1,$tbl) # Td0[s1>>24] x $t2,3($i2,$tbl) # Td1[s1>>16] x $t3,2($i3,$tbl) # Td2[s1>>8] xr $s1,$t1 srlg $i1,$s2,`8-3` # i0 sllg $i2,$s2,`0+3` # i1 srlg $i3,$s2,`16-3` srl $s2,`24-3` nr $i1,$mask ngr $i2,$mask nr $s2,$mask nr $i3,$mask x $s0,2($i1,$tbl) # Td2[s2>>8] x $s1,1($i2,$tbl) # Td3[s2>>0] l $s2,0($s2,$tbl) # Td0[s2>>24] x $t3,3($i3,$tbl) # Td1[s2>>16] xr $s2,$t2 srlg $i1,$s3,`16-3` # i0 srlg $i2,$s3,`8-3` # i1 sllg $i3,$s3,`0+3` # i2 srl $s3,`24-3` nr $i1,$mask nr $i2,$mask ngr $i3,$mask nr $s3,$mask x $s0,3($i1,$tbl) # Td1[s3>>16] x $s1,2($i2,$tbl) # Td2[s3>>8] x $s2,1($i3,$tbl) # Td3[s3>>0] l $s3,0($s3,$tbl) # Td0[s3>>24] xr $s3,$t3 la $key,16($key) x $s0,0($key) x $s1,4($key) x $s2,8($key) x $s3,12($key) brct $rounds,.Ldec_loop l $t1,`2048+0`($tbl) # prefetch Td4 l $t2,`2048+32`($tbl) l $t3,`2048+64`($tbl) l $i1,`2048+96`($tbl) l $i2,`2048+128`($tbl) l $i3,`2048+160`($tbl) l $t1,`2048+192`($tbl) l $t2,`2048+224`($tbl) llill $mask,0xff srlg $i3,$s0,24 # i0 srlg $i1,$s0,16 srlg $i2,$s0,8 nr $s0,$mask # i3 nr $i1,$mask nr $i2,$mask llgc $i3,2048($i3,$tbl) # Td4[s0>>24] llgc $t1,2048($i1,$tbl) # Td4[s0>>16] llgc $t2,2048($i2,$tbl) # Td4[s0>>8] llgc $t3,2048($s0,$tbl) # Td4[s0>>0] sllg $s0,$i3,24 sll $t1,16 sll $t2,8 srlg $i1,$s1,24 srlg $i2,$s1,16 srlg $i3,$s1,8 nr $s1,$mask # i0 nr $i2,$mask nr $i3,$mask llgc $s1,2048($s1,$tbl) # Td4[s1>>0] llgc $i1,2048($i1,$tbl) # Td4[s1>>24] llgc $i2,2048($i2,$tbl) # Td4[s1>>16] llgc $i3,2048($i3,$tbl) # Td4[s1>>8] sll $i1,24 sll $i2,16 sll $i3,8 or $s0,$s1 or $t1,$i1 or $t2,$i2 or $t3,$i3 srlg $i1,$s2,8 # i0 srlg $i2,$s2,24 srlg $i3,$s2,16 nr $s2,$mask # i1 nr $i1,$mask nr $i3,$mask llgc $i1,2048($i1,$tbl) # Td4[s2>>8] llgc $s1,2048($s2,$tbl) # Td4[s2>>0] llgc $i2,2048($i2,$tbl) # Td4[s2>>24] llgc $i3,2048($i3,$tbl) # Td4[s2>>16] sll $i1,8 sll $i2,24 sll $i3,16 or $s0,$i1 or $s1,$t1 or $t2,$i2 or $t3,$i3 srlg $i1,$s3,16 # i0 srlg $i2,$s3,8 # i1 srlg $i3,$s3,24 nr $s3,$mask # i2 nr $i1,$mask nr $i2,$mask llgc $i1,2048($i1,$tbl) # Td4[s3>>16] llgc $i2,2048($i2,$tbl) # Td4[s3>>8] llgc $s2,2048($s3,$tbl) # Td4[s3>>0] llgc $s3,2048($i3,$tbl) # Td4[s3>>24] sll $i1,16 sll $i2,8 sll $s3,24 or $s0,$i1 or $s1,$i2 or $s2,$t2 or $s3,$t3 x $s0,16($key) x $s1,20($key) x $s2,24($key) x $s3,28($key) br $ra .size _s390x_AES_decrypt,.-_s390x_AES_decrypt# void AES_set_encrypt_key(const unsigned char *in, int bits,# AES_KEY *key) {.globl AES_set_encrypt_key.type AES_set_encrypt_key,\@function.align 16AES_set_encrypt_key: lghi $t1,0 clgr $inp,$t1 je .Lminus1 clgr $key,$t1 je .Lminus1 lghi $t1,128 clr $bits,$t1 je .Lproceed128 lghi $t1,192 clr $bits,$t1 je .Lekey_internal lghi $t1,256 clr $bits,$t1 je .Lekey_internal lghi %r2,-2 br %r14.align 4.Lproceed128:___$code.=<<___ if (!$softonly); lghi %r0,0 # query capability vector la %r1,16($sp) .long 0xb92e0042 # km %r4,%r2 lg %r0,16($sp) tmhl %r0,`0x8000>>2` jz .Lekey_internal lmg $t1,$t2,0($inp) # just copy 128 bits... stmg $t1,$t2,0($key) lghi $t1,10 st $t1,236($key) # ... postpone key setup st $t1,240($key) lghi %r2,0 br %r14___$code.=<<___;.align 16.Lekey_internal: stmg %r6,%r13,48($sp) # all non-volatile regs larl $tbl,AES_Te+2048 llgf $s0,0($inp) llgf $s1,4($inp) llgf $s2,8($inp) llgf $s3,12($inp) st $s0,0($key) st $s1,4($key) st $s2,8($key) st $s3,12($key) lghi $t1,128 cr $bits,$t1 jne .Lnot128 llill $mask,0xff lghi $t3,0 # i=0 lghi $rounds,10 st $t3,236($key) # mark as set up st $rounds,240($key).align 8.L128_loop: llgfr $t2,$s3 # temp=rk[3] srlg $i1,$s3,8 srlg $i2,$s3,16 srlg $i3,$s3,24 nr $t2,$mask nr $i1,$mask nr $i2,$mask la $t2,0($t2,$tbl) la $i1,0($i1,$tbl) la $i2,0($i2,$tbl) la $i3,0($i3,$tbl) icm $t2,2,0($t2) # Te4[rk[3]>>0]<<8 icm $t2,4,0($i1) # Te4[rk[3]>>8]<<16 icm $t2,8,0($i2) # Te4[rk[3]>>16]<<24 icm $t2,1,0($i3) # Te4[rk[3]>>24] x $t2,256($t3,$tbl) # rcon[i] xr $s0,$t2 # rk[4]=rk[0]^... xr $s1,$s0 # rk[5]=rk[1]^rk[4] xr $s2,$s1 # rk[6]=rk[2]^rk[5] xr $s3,$s2 # rk[7]=rk[3]^rk[6] st $s0,16($key) st $s1,20($key) st $s2,24($key) st $s3,28($key) la $key,16($key) # key+=4 la $t3,4($t3) # i++ brct $rounds,.L128_loop lghi %r2,0 lmg %r6,%r13,48($sp) br $ra.align 4.Lnot128: llgf $t1,16($inp) llgf $t2,20($inp) st $t1,16($key) st $t2,20($key) lghi $t1,192 cr $bits,$t1 jne .Lnot192 llill $mask,0xff lghi $t3,0 # i=0 lghi $rounds,12 st $rounds,240($key) lghi $rounds,8.align 8.L192_loop: srlg $i1,$t2,8 srlg $i2,$t2,16 srlg $i3,$t2,24 nr $t2,$mask nr $i1,$mask nr $i2,$mask la $t2,0($t2,$tbl) la $i1,0($i1,$tbl) la $i2,0($i2,$tbl) la $i3,0($i3,$tbl) icm $t2,2,0($t2) # Te4[rk[5]>>0]<<8 icm $t2,4,0($i1) # Te4[rk[5]>>8]<<16 icm $t2,8,0($i2) # Te4[rk[5]>>16]<<24 icm $t2,1,0($i3) # Te4[rk[5]>>24] x $t2,256($t3,$tbl) # rcon[i] xr $s0,$t2 # rk[6]=rk[0]^... xr $s1,$s0 # rk[7]=rk[1]^rk[6] xr $s2,$s1 # rk[8]=rk[2]^rk[7] xr $s3,$s2 # rk[9]=rk[3]^rk[8] st $s0,24($key) st $s1,28($key) st $s2,32($key) st $s3,36($key) brct $rounds,.L192_continue lghi %r2,0 lmg %r6,%r13,48($sp) br $ra.align 4.L192_continue: lgr $t2,$s3 x $t2,16($key) # rk[10]=rk[4]^rk[9] st $t2,40($key) x $t2,20($key) # rk[11]=rk[5]^rk[10] st $t2,44($key) la $key,24($key) # key+=6 la $t3,4($t3) # i++ j .L192_loop.align 4.Lnot192: llgf $t1,24($inp) llgf $t2,28($inp) st $t1,24($key) st $t2,28($key) llill $mask,0xff lghi $t3,0 # i=0 lghi $rounds,14 st $rounds,240($key) lghi $rounds,7.align 8.L256_loop: srlg $i1,$t2,8 srlg $i2,$t2,16 srlg $i3,$t2,24 nr $t2,$mask nr $i1,$mask nr $i2,$mask la $t2,0($t2,$tbl) la $i1,0($i1,$tbl) la $i2,0($i2,$tbl) la $i3,0($i3,$tbl) icm $t2,2,0($t2) # Te4[rk[7]>>0]<<8 icm $t2,4,0($i1) # Te4[rk[7]>>8]<<16 icm $t2,8,0($i2) # Te4[rk[7]>>16]<<24 icm $t2,1,0($i3) # Te4[rk[7]>>24] x $t2,256($t3,$tbl) # rcon[i] xr $s0,$t2 # rk[8]=rk[0]^... xr $s1,$s0 # rk[9]=rk[1]^rk[8] xr $s2,$s1 # rk[10]=rk[2]^rk[9] xr $s3,$s2 # rk[11]=rk[3]^rk[10] st $s0,32($key) st $s1,36($key) st $s2,40($key) st $s3,44($key) brct $rounds,.L256_continue lghi %r2,0 lmg %r6,%r13,48($sp) br $ra.align 4.L256_continue: lgr $t2,$s3 # temp=rk[11] srlg $i1,$s3,8 srlg $i2,$s3,16 srlg $i3,$s3,24 nr $t2,$mask nr $i1,$mask nr $i2,$mask la $t2,0($t2,$tbl) la $i1,0($i1,$tbl) la $i2,0($i2,$tbl) la $i3,0($i3,$tbl) llgc $t2,0($t2) # Te4[rk[11]>>0] icm $t2,2,0($i1) # Te4[rk[11]>>8]<<8 icm $t2,4,0($i2) # Te4[rk[11]>>16]<<16 icm $t2,8,0($i3) # Te4[rk[11]>>24]<<24 x $t2,16($key) # rk[12]=rk[4]^... st $t2,48($key) x $t2,20($key) # rk[13]=rk[5]^rk[12] st $t2,52($key) x $t2,24($key) # rk[14]=rk[6]^rk[13] st $t2,56($key) x $t2,28($key) # rk[15]=rk[7]^rk[14] st $t2,60($key) la $key,32($key) # key+=8 la $t3,4($t3) # i++ j .L256_loop.align 4.Lminus1: lghi %r2,-1 br %r14.size AES_set_encrypt_key,.-AES_set_encrypt_key# void AES_set_decrypt_key(const unsigned char *in, int bits,# AES_KEY *key) {.globl AES_set_decrypt_key.type AES_set_decrypt_key,\@function.align 16AES_set_decrypt_key: stg $key,32($sp) # I rely on AES_set_encrypt_key to stg $ra,112($sp) # save non-volatile registers! bras $ra,AES_set_encrypt_key lg $key,32($sp) lg $ra,112($sp) ltgr %r2,%r2 bnzr $ra___$code.=<<___ if (!$softonly); lghi $t1,10 c $t1,240($key) jne .Lgo lghi $t1,0 c $t1,236($key) je .Lgo lmg $t1,$t2,0($key) # just copy 128 bits otherwise stmg $t1,$t2,160($key) lghi %r2,0 br $ra.align 16.Ldkey_internal: stg $key,32($sp) stg $ra,40($sp) bras $ra,.Lekey_internal lg $key,32($sp) lg $ra,40($sp)___$code.=<<___;.Lgo: llgf $rounds,240($key) la $i1,0($key) sllg $i2,$rounds,4 la $i2,0($i2,$key) srl $rounds,1.align 8.Linv: lmg $s0,$s1,0($i1) lmg $s2,$s3,0($i2) stmg $s0,$s1,0($i2) stmg $s2,$s3,0($i1) aghi $i1,16 aghi $i2,-16 brct $rounds,.Linv___$mask80=$i1;$mask1b=$i2;$maskfe=$i3;$code.=<<___; llgf $rounds,240($key) aghi $rounds,-1 sll $rounds,2 # (rounds-1)*4 llilh $mask80,0x8080 oill $mask80,0x8080 llilh $mask1b,0x1b1b oill $mask1b,0x1b1b llilh $maskfe,0xfefe oill $maskfe,0xfefe.align 8.Lmix: l $s0,16($key) # tp1 lr $s1,$s0 ngr $s1,$mask80 srlg $t1,$s1,7 slr $s1,$t1 nr $s1,$mask1b sllg $t1,$s0,1 nr $t1,$maskfe xr $s1,$t1 # tp2 lr $s2,$s1 ngr $s2,$mask80 srlg $t1,$s2,7 slr $s2,$t1 nr $s2,$mask1b sllg $t1,$s1,1 nr $t1,$maskfe xr $s2,$t1 # tp4 lr $s3,$s2 ngr $s3,$mask80 srlg $t1,$s3,7 slr $s3,$t1 nr $s3,$mask1b sllg $t1,$s2,1 nr $t1,$maskfe xr $s3,$t1 # tp8 xr $s1,$s0 # tp2^tp1 xr $s2,$s0 # tp4^tp1 rll $s0,$s0,24 # = ROTATE(tp1,8) xr $s0,$s1 # ^=tp2^tp1 xr $s0,$s2 # ^=tp4^tp1 xr $s0,$s3 # ^= tp8[^(tp4^tp1)^(tp2^tp1)=tp4^tp2] xr $s1,$s3 # tp2^tp1^tp8 rll $s1,$s1,8 xr $s0,$s1 # ^= ROTATE(tp8^tp2^tp1,24) xr $s2,$s3 # tp4^tp1^tp8 rll $s2,$s2,16 xr $s0,$s2 # ^= ROTATE(tp8^tp4^tp1,16) rll $s3,$s3,24 xr $s0,$s3 # ^= ROTATE(tp8,8) st $s0,16($key) la $key,4($key) brct $rounds,.Lmix lmg %r6,%r13,48($sp)# as was saved by AES_set_encrypt_key! lghi %r2,0 br $ra.size AES_set_decrypt_key,.-AES_set_decrypt_key.string "AES for s390x, CRYPTOGAMS by <appro\@openssl.org>"___$code =~ s/\`([^\`]*)\`/eval $1/gem;print $code;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -