📄 aes_x86_v2.asm
字号:
mov eax,-1
jmp .5
.1: enc_round
enc_round
.2: enc_round
enc_round
.3: enc_round
enc_round
enc_round
enc_round
enc_round
enc_round
enc_round
enc_round
enc_round
enc_last_round
mov edx,[esp+out_blk+stk_spc]
mov [edx],eax
mov [edx+4],ebx
mov [edx+8],esi
mov [edx+12],edi
xor eax,eax
.5: mov ebp,[esp+16]
mov ebx,[esp+12]
mov esi,[esp+ 8]
mov edi,[esp+ 4]
add esp,stk_spc
do_exit 12
%endif
%macro f_key 2
l3s_col esi,a,ebx
xor esi,rc_val
mov [ebp+%1*%2],esi
xor edi,esi
mov [ebp+%1*%2+4],edi
xor ecx,edi
mov [ebp+%1*%2+8],ecx
xor edx,ecx
mov [ebp+%1*%2+12],edx
mov eax,edx
%if %2 == 24
%if %1 < 7
xor eax,[ebp+%1*%2+16-%2]
mov [ebp+%1*%2+16],eax
xor eax,[ebp+%1*%2+20-%2]
mov [ebp+%1*%2+20],eax
%endif
%elif %2 == 32
%if %1 < 6
rol eax,8
push edx
mov edx,[ebp+%1*%2+16-%2]
l3s_col edx,a,ebx
mov eax,edx
pop edx
mov [ebp+%1*%2+16],eax
xor eax,[ebp+%1*%2+20-%2]
mov [ebp+%1*%2+20],eax
xor eax,[ebp+%1*%2+24-%2]
mov [ebp+%1*%2+24],eax
xor eax,[ebp+%1*%2+28-%2]
mov [ebp+%1*%2+28],eax
%endif
%endif
%assign rc_val f2(rc_val)
%endmacro
%ifdef ENCRYPTION_KEY_SCHEDULE
%ifdef AES_128
%ifndef ENCRYPTION_TABLE
%define ENCRYPTION_TABLE
%endif
%assign rc_val 1
do_name _aes_encrypt_key128,8
push ebp
push ebx
push esi
push edi
mov ebp,[esp+24]
mov [ebp+4*KS_LENGTH],dword 10*16
mov ebx,[esp+20]
mov esi,[ebx]
mov [ebp],esi
mov edi,[ebx+4]
mov [ebp+4],edi
mov ecx,[ebx+8]
mov [ebp+8],ecx
mov edx,[ebx+12]
mov [ebp+12],edx
add ebp,16
mov eax,edx
f_key 0,16 ; 11 * 4 = 44 unsigned longs
f_key 1,16 ; 4 + 4 * 10 generated = 44
f_key 2,16
f_key 3,16
f_key 4,16
f_key 5,16
f_key 6,16
f_key 7,16
f_key 8,16
f_key 9,16
pop edi
pop esi
pop ebx
pop ebp
xor eax,eax
do_exit 8
%endif
%ifdef AES_192
%ifndef ENCRYPTION_TABLE
%define ENCRYPTION_TABLE
%endif
%assign rc_val 1
do_name _aes_encrypt_key192,8
push ebp
push ebx
push esi
push edi
mov ebp,[esp+24]
mov [ebp+4*KS_LENGTH],dword 12 * 16
mov ebx,[esp+20]
mov esi,[ebx]
mov [ebp],esi
mov edi,[ebx+4]
mov [ebp+4],edi
mov ecx,[ebx+8]
mov [ebp+8],ecx
mov edx,[ebx+12]
mov [ebp+12],edx
mov eax,[ebx+16]
mov [ebp+16],eax
mov eax,[ebx+20]
mov [ebp+20],eax
add ebp,24
f_key 0,24 ; 13 * 4 = 52 unsigned longs
f_key 1,24 ; 6 + 6 * 8 generated = 54
f_key 2,24
f_key 3,24
f_key 4,24
f_key 5,24
f_key 6,24
f_key 7,24
pop edi
pop esi
pop ebx
pop ebp
xor eax,eax
do_exit 8
%endif
%ifdef AES_256
%ifndef ENCRYPTION_TABLE
%define ENCRYPTION_TABLE
%endif
%assign rc_val 1
do_name _aes_encrypt_key256,8
push ebp
push ebx
push esi
push edi
mov ebp,[esp+24]
mov [ebp+4*KS_LENGTH],dword 14 * 16
mov ebx,[esp+20]
mov esi,[ebx]
mov [ebp],esi
mov edi,[ebx+4]
mov [ebp+4],edi
mov ecx,[ebx+8]
mov [ebp+8],ecx
mov edx,[ebx+12]
mov [ebp+12],edx
mov eax,[ebx+16]
mov [ebp+16],eax
mov eax,[ebx+20]
mov [ebp+20],eax
mov eax,[ebx+24]
mov [ebp+24],eax
mov eax,[ebx+28]
mov [ebp+28],eax
add ebp,32
f_key 0,32 ; 15 * 4 = 60 unsigned longs
f_key 1,32 ; 8 + 8 * 7 generated = 64
f_key 2,32
f_key 3,32
f_key 4,32
f_key 5,32
f_key 6,32
pop edi
pop esi
pop ebx
pop ebp
xor eax,eax
do_exit 8
%endif
%ifdef AES_VAR
%ifndef ENCRYPTION_TABLE
%define ENCRYPTION_TABLE
%endif
do_name _aes_encrypt_key,12
mov ecx,[esp+4]
mov eax,[esp+8]
mov edx,[esp+12]
push edx
push ecx
cmp eax,16
je .1
cmp eax,128
je .1
cmp eax,24
je .2
cmp eax,192
je .2
cmp eax,32
je .3
cmp eax,256
je .3
mov eax,-1
add esp,8
do_exit 12
.1: do_call _aes_encrypt_key128,8
do_exit 12
.2: do_call _aes_encrypt_key192,8
do_exit 12
.3: do_call _aes_encrypt_key256,8
do_exit 12
%endif
%endif
%ifdef ENCRYPTION_TABLE
; S-box data - 256 entries
section .data align=32
align 32
%define u8(x) 0, x, x, f3(x), f2(x), x, x, f3(x)
enc_tab:
db u8(0x63),u8(0x7c),u8(0x77),u8(0x7b),u8(0xf2),u8(0x6b),u8(0x6f),u8(0xc5)
db u8(0x30),u8(0x01),u8(0x67),u8(0x2b),u8(0xfe),u8(0xd7),u8(0xab),u8(0x76)
db u8(0xca),u8(0x82),u8(0xc9),u8(0x7d),u8(0xfa),u8(0x59),u8(0x47),u8(0xf0)
db u8(0xad),u8(0xd4),u8(0xa2),u8(0xaf),u8(0x9c),u8(0xa4),u8(0x72),u8(0xc0)
db u8(0xb7),u8(0xfd),u8(0x93),u8(0x26),u8(0x36),u8(0x3f),u8(0xf7),u8(0xcc)
db u8(0x34),u8(0xa5),u8(0xe5),u8(0xf1),u8(0x71),u8(0xd8),u8(0x31),u8(0x15)
db u8(0x04),u8(0xc7),u8(0x23),u8(0xc3),u8(0x18),u8(0x96),u8(0x05),u8(0x9a)
db u8(0x07),u8(0x12),u8(0x80),u8(0xe2),u8(0xeb),u8(0x27),u8(0xb2),u8(0x75)
db u8(0x09),u8(0x83),u8(0x2c),u8(0x1a),u8(0x1b),u8(0x6e),u8(0x5a),u8(0xa0)
db u8(0x52),u8(0x3b),u8(0xd6),u8(0xb3),u8(0x29),u8(0xe3),u8(0x2f),u8(0x84)
db u8(0x53),u8(0xd1),u8(0x00),u8(0xed),u8(0x20),u8(0xfc),u8(0xb1),u8(0x5b)
db u8(0x6a),u8(0xcb),u8(0xbe),u8(0x39),u8(0x4a),u8(0x4c),u8(0x58),u8(0xcf)
db u8(0xd0),u8(0xef),u8(0xaa),u8(0xfb),u8(0x43),u8(0x4d),u8(0x33),u8(0x85)
db u8(0x45),u8(0xf9),u8(0x02),u8(0x7f),u8(0x50),u8(0x3c),u8(0x9f),u8(0xa8)
db u8(0x51),u8(0xa3),u8(0x40),u8(0x8f),u8(0x92),u8(0x9d),u8(0x38),u8(0xf5)
db u8(0xbc),u8(0xb6),u8(0xda),u8(0x21),u8(0x10),u8(0xff),u8(0xf3),u8(0xd2)
db u8(0xcd),u8(0x0c),u8(0x13),u8(0xec),u8(0x5f),u8(0x97),u8(0x44),u8(0x17)
db u8(0xc4),u8(0xa7),u8(0x7e),u8(0x3d),u8(0x64),u8(0x5d),u8(0x19),u8(0x73)
db u8(0x60),u8(0x81),u8(0x4f),u8(0xdc),u8(0x22),u8(0x2a),u8(0x90),u8(0x88)
db u8(0x46),u8(0xee),u8(0xb8),u8(0x14),u8(0xde),u8(0x5e),u8(0x0b),u8(0xdb)
db u8(0xe0),u8(0x32),u8(0x3a),u8(0x0a),u8(0x49),u8(0x06),u8(0x24),u8(0x5c)
db u8(0xc2),u8(0xd3),u8(0xac),u8(0x62),u8(0x91),u8(0x95),u8(0xe4),u8(0x79)
db u8(0xe7),u8(0xc8),u8(0x37),u8(0x6d),u8(0x8d),u8(0xd5),u8(0x4e),u8(0xa9)
db u8(0x6c),u8(0x56),u8(0xf4),u8(0xea),u8(0x65),u8(0x7a),u8(0xae),u8(0x08)
db u8(0xba),u8(0x78),u8(0x25),u8(0x2e),u8(0x1c),u8(0xa6),u8(0xb4),u8(0xc6)
db u8(0xe8),u8(0xdd),u8(0x74),u8(0x1f),u8(0x4b),u8(0xbd),u8(0x8b),u8(0x8a)
db u8(0x70),u8(0x3e),u8(0xb5),u8(0x66),u8(0x48),u8(0x03),u8(0xf6),u8(0x0e)
db u8(0x61),u8(0x35),u8(0x57),u8(0xb9),u8(0x86),u8(0xc1),u8(0x1d),u8(0x9e)
db u8(0xe1),u8(0xf8),u8(0x98),u8(0x11),u8(0x69),u8(0xd9),u8(0x8e),u8(0x94)
db u8(0x9b),u8(0x1e),u8(0x87),u8(0xe9),u8(0xce),u8(0x55),u8(0x28),u8(0xdf)
db u8(0x8c),u8(0xa1),u8(0x89),u8(0x0d),u8(0xbf),u8(0xe6),u8(0x42),u8(0x68)
db u8(0x41),u8(0x99),u8(0x2d),u8(0x0f),u8(0xb0),u8(0x54),u8(0xbb),u8(0x16)
%endif
%ifdef DECRYPTION
%define DECRYPTION_TABLE
%define dtab_0(x) [dec_tab+ 8*x]
%define dtab_1(x) [dec_tab+3+8*x]
%define dtab_2(x) [dec_tab+2+8*x]
%define dtab_3(x) [dec_tab+1+8*x]
%define dtab_x(x) byte [dec_tab+7+8*x]
%macro irn_fun 2
rol eax,16
%1 esi, cl, 0, ebp
%1 esi, bh, 1, ebp
%1 esi, al, 2, ebp
%1 edi, dl, 0, ebp
%1 edi, ch, 1, ebp
%1 edi, ah, 3, ebp
%2 ebp, bl, 0, ebp
shr eax,16
and ebx,0xffff0000
or ebx,eax
shr ecx,16
%1 ebp, bh, 1, eax
%1 ebp, ch, 3, eax
%2 eax, cl, 2, ecx
%1 eax, bl, 0, ecx
%1 eax, dh, 1, ecx
shr ebx,16
shr edx,16
%1 esi, dh, 3, ecx
%1 ebp, dl, 2, ecx
%1 eax, bh, 3, ecx
%1 edi, bl, 2, ecx
%endmacro
; Basic MOV and XOR Operations for normal rounds
%macro ni_xor 4
movzx %4,%2
xor %1,dtab_%3(%4)
%endmacro
%macro ni_mov 4
movzx %4,%2
mov %1,dtab_%3(%4)
%endmacro
; Basic MOV and XOR Operations for last round
%macro li_xor 4
movzx %4,%2
movzx %4,dtab_x(%4)
%if %3 != 0
shl %4,8*%3
%endif
xor %1,%4
%endmacro
%macro li_mov 4
movzx %4,%2
movzx %1,dtab_x(%4)
%if %3 != 0
shl %1,8*%3
%endif
%endmacro
%macro dec_round 0
%ifdef AES_REV_DKS
add ebp,16
%else
sub ebp,16
%endif
save 0,ebp
mov esi,[ebp+8]
mov edi,[ebp+12]
irn_fun ni_xor, ni_mov
mov ebx,ebp
mov ecx,esi
mov edx,edi
restore ebp,0
xor eax,[ebp]
xor ebx,[ebp+4]
%endmacro
%macro dec_last_round 0
%ifdef AES_REV_DKS
add ebp,16
%else
sub ebp,16
%endif
save 0,ebp
mov esi,[ebp+8]
mov edi,[ebp+12]
irn_fun li_xor, li_mov
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -