📄 aesecbe.asm
字号:
%assign edi_save ebx_save + 4
%assign esi_save edi_save + 4
%assign ebp_save esi_save + 4
%assign stk_offset ebp_save + 4 ; stack offset used to avoid cache conflicts
%assign stx_spc ks_len + 32 ; stack space needed for locals
do_name _aes_ecb_encrypt_128
mov eax,esp ; use Daniel Bernstein's technique for
sub eax,_aes_etab ; positioning stack based variables
and eax,4095
add eax,stx_spc
sub esp,eax
mov [esp+stk_offset],eax ; save stack offset
mov [esp+ebp_save],ebp
mov [esp+ebx_save],ebx
mov [esp+esi_save],esi
mov [esp+edi_save],edi
mov ebp,[esp+eax+key] ; offset to key
mov ecx,[ebp] ; load 128 bit key into
mov edx,[ebp+4] ; four 32-bit words
mov esi,[ebp+8]
mov edi,[ebp+12]
mov [esp+exp_key],ecx ; store key into expanded
mov [esp+exp_key+4],edx ; key schedule on the stack
mov [esp+exp_key+8],esi
mov [esp+exp_key+12],edi
mov eax,edi ; eax must contain the last 32-bit
; word key from the previous round
step_key 1, 16
step_key 2, 16
step_key 3, 16
step_key 4, 16
step_key 5, 16
step_key 6, 16
step_key 7, 16
step_key 8, 16
step_key 9, 16
step_key 10, 16
mov ebp,[esp+stk_offset] ; pointer to parameters
add ebp,esp
cmp [ebp+n_block],dword 0 ; number of blocks to encrypt
je .1 ; exit if none
.0: mov esi,[ebp+in_blk] ; put current input block into
mov eax,[esi] ; eax, ebx, ecx and edx
xor eax,[esp+exp_key] ; xor in the first round key
mov ebx,[esi+4]
xor ebx,[esp+exp_key+4]
mov ecx,[esi+8]
xor ecx,[esp+exp_key+8]
mov edx,[esi+12]
xor edx,[esp+exp_key+12]
add esi,16 ; increment and store input
mov [ebp+in_blk],esi ; pointer
round 0 ; do 10 rounds for 128-bit key
round 1
round 2
round 3
round 4
round 5
round 6
round 7
round 8
last_round 9
mov ebp,[esp+stk_offset] ; recover output buffer pointer
add ebp,esp
mov esi,[ebp+out_blk]
mov [esi],eax ; store result to the output
mov [esi+4],ebx ; buffer
mov [esi+8],ecx
mov [esi+12],edx
add esi,16
mov [ebp+out_blk],esi ; increment and store new buffer
dec dword [ebp+n_block] ; pointer
jne .0
.1: mov eax,[esp+stk_offset]
mov edi,[esp+edi_save]
mov esi,[esp+esi_save]
mov ebx,[esp+ebx_save]
mov ebp,[esp+ebp_save]
add esp,eax
do_exit
ecb_128_end:
%endif
; AES Encryption Subroutine (192 bit key)
%ifdef AES_192
%assign rc_val 1 ; start value for the round constant
%assign exp_key 0 ; stack offset to expanded key
%assign ks_len 13 * 16 ; length of expanded key
%assign ebx_save ks_len
%assign edi_save ebx_save + 4
%assign esi_save edi_save + 4
%assign ebp_save esi_save + 4
%assign stk_offset ebp_save + 4 ; stack offset used to avoid cache conflicts
%assign stx_spc ks_len + 32 ; stack space needed for locals
do_name _aes_ecb_encrypt_192
mov eax,esp ; use Daniel Bernstein's technique for
sub eax,_aes_etab ; positioning stack based variables
and eax,4095
add eax,stx_spc
sub esp,eax
mov [esp+stk_offset],eax ; save stack offset
mov [esp+ebp_save],ebp
mov [esp+ebx_save],ebx
mov [esp+esi_save],esi
mov [esp+edi_save],edi
mov ebp,[esp+eax+key]
mov ecx,[ebp]
mov edx,[ebp+4]
mov esi,[ebp+8]
mov edi,[ebp+12]
mov [esp+exp_key],ecx
mov [esp+exp_key+4],edx
mov [esp+exp_key+8],esi
mov [esp+exp_key+12],edi
mov eax,[ebp+16]
mov [esp+exp_key+16],eax
mov eax,[ebp+20]
mov [esp+exp_key+20],eax
step_key 1, 24
step_key 2, 24
step_key 3, 24
step_key 4, 24
step_key 5, 24
step_key 6, 24
step_key 7, 24
step_key 8, 24
mov ebp,[esp+stk_offset]
add ebp,esp
cmp [ebp+n_block],dword 0
je .1
.0: mov esi,[ebp+in_blk]
mov eax,[esi]
xor eax,[esp+exp_key]
mov ebx,[esi+4]
xor ebx,[esp+exp_key+4]
mov ecx,[esi+8]
xor ecx,[esp+exp_key+8]
mov edx,[esi+12]
xor edx,[esp+exp_key+12]
add esi,16
mov [ebp+in_blk],esi
round 0
round 1
round 2
round 3
round 4
round 5
round 6
round 7
round 8
round 9
round 10
last_round 11
mov ebp,[esp+stk_offset]
add ebp,esp
mov esi,[ebp+out_blk]
mov [esi],eax
mov [esi+4],ebx
mov [esi+8],ecx
mov [esi+12],edx
add esi,16
mov [ebp+out_blk],esi
dec dword [ebp+n_block]
jne .0
.1: mov eax,[esp+stk_offset]
mov edi,[esp+edi_save]
mov esi,[esp+esi_save]
mov ebx,[esp+ebx_save]
mov ebp,[esp+ebp_save]
add esp,eax
do_exit
ecb_192_end:
%endif
; AES Encryption Subroutine (256 bit key)
%ifdef AES_256
%assign rc_val 1 ; start value for the round constant
%assign exp_key 0 ; stack offset to expanded key
%assign ks_len 15 * 16 ; length of expanded key (128 bits)
%assign ebx_save ks_len
%assign edi_save ebx_save + 4
%assign esi_save edi_save + 4
%assign ebp_save esi_save + 4
%assign stk_offset ebp_save + 4 ; stack offset used to avoid cache conflicts
%assign stx_spc ks_len + 32 ; stack space needed for locals
do_name _aes_ecb_encrypt_256
mov eax,esp ; use Daniel Bernstein's technique for
sub eax,_aes_etab ; positioning stack based variables
and eax,4095
add eax,stx_spc
sub esp,eax
mov [esp+stk_offset],eax ; save stack offset
mov [esp+ebp_save],ebp
mov [esp+ebx_save],ebx
mov [esp+esi_save],esi
mov [esp+edi_save],edi
mov ebp,[esp+eax+key]
mov ecx,[ebp]
mov edx,[ebp+4]
mov esi,[ebp+8]
mov edi,[ebp+12]
mov [esp+exp_key],ecx
mov [esp+exp_key+4],edx
mov [esp+exp_key+8],esi
mov [esp+exp_key+12],edi
mov eax,[ebp+16]
mov [esp+exp_key+16],eax
mov eax,[ebp+20]
mov [esp+exp_key+20],eax
mov eax,[ebp+24]
mov [esp+exp_key+24],eax
mov eax,[ebp+28]
mov [esp+exp_key+28],eax
step_key 1, 32
step_key 2, 32
step_key 3, 32
step_key 4, 32
step_key 5, 32
step_key 6, 32
step_key 7, 32
mov ebp,[esp+stk_offset]
add ebp,esp
cmp [ebp+n_block],dword 0
je .1
.0: mov esi,[ebp+in_blk]
mov eax,[esi]
xor eax,[esp+exp_key]
mov ebx,[esi+4]
xor ebx,[esp+exp_key+4]
mov ecx,[esi+8]
xor ecx,[esp+exp_key+8]
mov edx,[esi+12]
xor edx,[esp+exp_key+12]
add esi,16
mov [ebp+in_blk],esi
round 0
round 1
round 2
round 3
round 4
round 5
round 6
round 7
round 8
round 9
round 10
round 11
round 12
last_round 13
mov ebp,[esp+stk_offset]
add ebp,esp
mov esi,[ebp+out_blk]
mov [esi],eax
mov [esi+4],ebx
mov [esi+8],ecx
mov [esi+12],edx
add esi,16
mov [ebp+out_blk],esi
dec dword [ebp+n_block]
jne .0
.1: mov eax,[esp+stk_offset]
mov edi,[esp+edi_save]
mov esi,[esp+esi_save]
mov ebx,[esp+ebx_save]
mov ebp,[esp+ebp_save]
add esp,eax
do_exit
ecb_256_end:
%endif
%ifdef REPORT_LENGTH
do_name _aes_ecb_128_len
mov eax,ecb_128_end - _aes_ecb_encrypt_128
do_exit
do_name _aes_ecb_192_len
mov eax,ecb_192_end - _aes_ecb_encrypt_192
do_exit
do_name _aes_ecb_256_len
mov eax,ecb_256_end - _aes_ecb_encrypt_256
do_exit
%endif
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -