key256 db 0x96,0x10,0x8f,0x88,0x03,0x2e,0x6e,0x21,0xfd,0x1c,0xed,0xf4,0x8c,0x7d,0x38,0xe1,0x07,0x6f,0x08,0x4a,0x6b,0x3a,0x51,0xd4,0x91,0xdc,0xd1,0x51,0xd6,0x51,0xd2,0xd5
Код:
;encryption:
push key256; AES-256 key (32 bytes)
push ebx; where content will be encrypted
push esi; pointer to clear content
push eax; size of content to be encrypted in bytes
call encAES
;decryption:
push key256; AES-256 key (32 bytes)
push decrypted; where content will be decrypted
push encrypted; pointer to encrypted content
push eax; size of content to be decrypted in bytes
call decAES
;past file below to aes.asm
;START AES.ASM
;select an AES mode
;AES128 equ 1
;AES192 equ 1
AES256 equ 1
;internal constants, don't change them
;static for AES
BLOCK_SIZE equ 16
COLUMN_SIZE equ 4
if defined AES128
KEY_SIZE = 16
EXTENDED_KEY_SIZE = 176
ROW_SIZE = 4
ENCRYPTION_ROUNDS = 10
end if
if defined AES192
KEY_SIZE = 24
EXTENDED_KEY_SIZE = 208
ROW_SIZE = 6
ENCRYPTION_ROUNDS = 12
end if
if defined AES256
KEY_SIZE = 32
EXTENDED_KEY_SIZE = 240
ROW_SIZE = 8
ENCRYPTION_ROUNDS = 14
end if
;size of the sbox
SBOX_SIZE equ 256
;size of the rcon table
RCON_SIZE equ 256
;size of the Galois multiplication
;lookup tables
GALOIS_SIZE equ 256
macro CreateSBox target, [char]
{
mov byte [target], char
inc target
}
;dynamically generate the sbox in memory
;uses hard coded values, no algorithm
proc createSBox sbox_ptr:DWORD
push eax
mov eax, [sbox_ptr]
CreateSBox eax, 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,\
0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,\
0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,\
0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,\
0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,\
0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,\
0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,\
0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,\
0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,\
0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,\
0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,\
0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,\
0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,\
0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,\
0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,\
0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
pop eax
ret
endp
;the inverted sbox for decryption
proc createInvertSBox sbox_ptr:DWORD
push eax
mov eax, [sbox_ptr]
CreateSBox eax, 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,\
0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,\
0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,\
0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,\
0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,\
0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,\
0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,\
0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,\
0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,\
0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,\
0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,\
0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,\
0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,\
0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,\
0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,\
0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
pop eax
ret
endp
macro CreateRcon target, [char]
{
mov byte [target], char
inc target
}
;dynamically generate the rcon in memory
;uses hard coded values, no algorithm
proc createRcon rcon_ptr:DWORD
push eax
mov eax, [rcon_ptr]
CreateRcon eax, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,\
0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39,\
0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,\
0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,\
0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef,\
0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,\
0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b,\
0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,\
0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,\
0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,\
0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,\
0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,\
0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,\
0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63,\
0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,\
0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d
pop eax
ret
endp
;creates the round keys in keychain_ptr
if defined AES128
proc createKeyChain keychain_ptr:DWORD, sbox_ptr:DWORD,\
rcon_ptr:DWORD
local current_row:DWORD
;current column in ecx
mov ecx, ROW_SIZE-1
;current rcon index in edx
mov edx, 1
key_schedule_round:
;-------------------
;get current column, apply key schedule core and
;xor the result with ecx-ROW_SIZE-1
stdcall loadColumn, [keychain_ptr], ecx
;shift rows
rol eax,8
;substitute with sbox
stdcall subBytes, eax, [sbox_ptr]
;xor with rcon
stdcall xorRcon, eax, [rcon_ptr], edx
inc edx
;xor with column at index-ROW_SIZE-1
mov ebx,eax
push ecx
sub ecx,ROW_SIZE-1
stdcall loadColumn, [keychain_ptr],ecx
pop ecx
xor eax,ebx
;store at index+1
inc ecx
stdcall storeColumn, eax, [keychain_ptr], ecx
;-------------------
;-------------------
;three times: get current column and
;xor it with ecx-ROW_SIZE-1
rept 3{
stdcall loadColumn, [keychain_ptr], ecx;can be removed
mov ebx, eax
push ecx
sub ecx,ROW_SIZE-1
stdcall loadColumn, [keychain_ptr],ecx
pop ecx
xor eax,ebx
inc ecx
stdcall storeColumn, eax, [keychain_ptr], ecx
}
;-------------------
;check for end of keychain generation
cmp ecx, EXTENDED_KEY_SIZE/COLUMN_SIZE - 1
jne key_schedule_round
ret
endp
end if
if defined AES192
proc createKeyChain keychain_ptr:DWORD, sbox_ptr:DWORD,\
rcon_ptr:DWORD
local current_row:DWORD
;current column in ecx
mov ecx, ROW_SIZE-1
;current rcon index in edx
mov edx, 1
key_schedule_round:
;-------------------
;get current column, apply key schedule core and
;xor the result with ecx-ROW_SIZE-1
stdcall loadColumn, [keychain_ptr], ecx
;shift rows
rol eax,8
;substitute with sbox
stdcall subBytes, eax, [sbox_ptr]
;xor with rcon
stdcall xorRcon, eax, [rcon_ptr], edx
inc edx
;xor with column at index-ROW_SIZE-1
mov ebx,eax
push ecx
sub ecx,ROW_SIZE-1
stdcall loadColumn, [keychain_ptr],ecx
pop ecx
xor eax,ebx
;store at index+1
inc ecx
stdcall storeColumn, eax, [keychain_ptr], ecx
;-------------------
;-------------------
;three times: get current column and
;xor it with ecx-ROW_SIZE-1
rept 3{
stdcall loadColumn, [keychain_ptr], ecx;can be removed
mov ebx, eax
push ecx
sub ecx,ROW_SIZE-1
stdcall loadColumn, [keychain_ptr],ecx
pop ecx
xor eax,ebx
inc ecx
stdcall storeColumn, eax, [keychain_ptr], ecx
}
;-------------------
;check for end of keychain generation
cmp ecx, EXTENDED_KEY_SIZE/COLUMN_SIZE - 1
je exit_key_schedule_round
;-------------------
;two times: get current column and
;xor it with ecx-ROW_SIZE-1
rept 2{
stdcall loadColumn, [keychain_ptr], ecx;can be removed
mov ebx, eax
push ecx
sub ecx,ROW_SIZE-1
stdcall loadColumn, [keychain_ptr],ecx
pop ecx
xor eax,ebx
inc ecx
stdcall storeColumn, eax, [keychain_ptr], ecx
}
;-------------------
jmp key_schedule_round
exit_key_schedule_round:
ret
endp
end if
if defined AES256
proc createKeyChain keychain_ptr:DWORD, sbox_ptr:DWORD,\
rcon_ptr:DWORD
local current_row:DWORD
;current column in ecx
mov ecx, ROW_SIZE-1
;current rcon index in edx
mov edx, 1
key_schedule_round:
;-------------------
;get current column, apply key schedule core and
;xor the result with ecx-ROW_SIZE-1
stdcall loadColumn, [keychain_ptr], ecx
;shift rows
rol eax,8
;substitute with sbox
stdcall subBytes, eax, [sbox_ptr]
;xor with rcon
stdcall xorRcon, eax, [rcon_ptr], edx
inc edx
;xor with column at index-ROW_SIZE-1
mov ebx,eax
push ecx
sub ecx,ROW_SIZE-1
stdcall loadColumn, [keychain_ptr],ecx
pop ecx
xor eax,ebx
;store at index+1
inc ecx
stdcall storeColumn, eax, [keychain_ptr], ecx
;-------------------
;-------------------
;three times: get current column and
;xor it with ecx-ROW_SIZE-1
rept 3{
stdcall loadColumn, [keychain_ptr], ecx;can be removed
mov ebx, eax
push ecx
sub ecx,ROW_SIZE-1
stdcall loadColumn, [keychain_ptr],ecx
pop ecx
xor eax,ebx
inc ecx
stdcall storeColumn, eax, [keychain_ptr], ecx
}
;-------------------
;check for end of keychain generation
cmp ecx, EXTENDED_KEY_SIZE/COLUMN_SIZE - 1
je exit_key_schedule_round
;-------------------
;one times: get current column, subsitute with
;sbox and xor it with ecx-ROW_SIZE-1
;three times: get current column and
;xor it with ecx-ROW_SIZE-1
stdcall loadColumn, [keychain_ptr], ecx;can be removed
stdcall subBytes, eax, [sbox_ptr]
mov ebx, eax
push ecx
sub ecx,ROW_SIZE-1
stdcall loadColumn, [keychain_ptr],ecx
pop ecx
xor eax,ebx
inc ecx
stdcall storeColumn, eax, [keychain_ptr], ecx
;three times
rept 3{
stdcall loadColumn, [keychain_ptr], ecx;can be removed
mov ebx, eax
push ecx
sub ecx,ROW_SIZE-1
stdcall loadColumn, [keychain_ptr],ecx
pop ecx
xor eax,ebx
inc ecx
stdcall storeColumn, eax, [keychain_ptr], ecx
}
;-------------------
jmp key_schedule_round
exit_key_schedule_round:
ret
endp
end if
;store a column at column_index in keychain
proc storeColumn column:DWORD, keychain_ptr:DWORD, column_index:DWORD
push eax
push ebx
push edx
;create pointer to first byte of the column
;and store column there
mov eax, [column_index]
mov ebx, COLUMN_SIZE
mul ebx
add eax, [keychain_ptr]
mov ebx, [column]
mov [eax], ebx
pop edx
pop ebx
pop eax
ret
endp
;xor key dword with (rcon(index) 00 00 00)
proc xorRcon key:DWORD, rcon_ptr:DWORD, rcon_index:DWORD
push ebx
mov eax,[rcon_index]
mov ebx,[rcon_ptr]
xlatb
shl eax,24
mov ebx,[key]
xor eax,ebx
pop ebx
ret
endp
;returns in eax the column at column_index in the key chain
proc loadColumn keychain_ptr:DWORD, column_index:DWORD
push ebx
push edx
;create pointer to first byte of the colum
mov eax, [column_index]
mov ebx, COLUMN_SIZE
mul ebx
add eax, [keychain_ptr]
;return dword and exit
mov eax,[eax]
pop edx
pop ebx
ret
endp
;substitute subkey's bytes with the sbox
proc subBytes subkey:DWORD, sbox_ptr:DWORD
push ebx
mov eax, [subkey]
mov ebx, [sbox_ptr]
xlatb
ror eax, 8
xlatb
ror eax, 8
xlatb
ror eax, 8
xlatb
ror eax, 8
pop ebx
ret
endp
;uses the generated round keys to encrypt an aes block
proc encryptionRounds encryption_ptr:DWORD,\
roundkeys_ptr:DWORD, sbox_ptr:DWORD, mul2_table_ptr:DWORD, \
mul3_table_ptr:DWORD
pushad
;roundkey and encryption in eax and ebx
mov eax,[roundkeys_ptr]
mov ebx,[encryption_ptr]
;initial round
stdcall addRoundKey, ebx, eax
;main round
add eax,BLOCK_SIZE
mov ecx,ENCRYPTION_ROUNDS - 1
er_main:
stdcall subBlockBytes, ebx, [sbox_ptr]
stdcall shiftRows, ebx
stdcall mixColumns23, ebx, [mul2_table_ptr], [mul3_table_ptr]
stdcall addRoundKey, ebx, eax
add eax,BLOCK_SIZE
dec ecx
jnz er_main
;final round
stdcall subBlockBytes, ebx, [sbox_ptr]
stdcall shiftRows, ebx
stdcall addRoundKey, ebx, eax
popad
ret
endp
;mix columns operation is a column matrix
;multiplication
proc mixColumns23, data_ptr:DWORD, mul2_table_ptr:DWORD,\
mul3_table_ptr:DWORD
local current_column:DWORD
push edx
push eax
push ebx
push ecx
mov edx, [data_ptr]
rept 4{
;element 3
mov eax, [edx]
mov cl, al
shr eax,8
xor cl, al
shr eax,8
mov ebx, [mul3_table_ptr]
xlatb
xor cl, al
shr eax,8
mov ebx, [mul2_table_ptr]
xlatb
xor cl, al
mov [current_column], ecx
;element 2
mov eax, [edx]
mov cl, al
shr eax, 8
mov ebx, [mul3_table_ptr]
xlatb
xor cl, al
shr eax, 8
mov ebx, [mul2_table_ptr]
xlatb
xor cl, al
shr eax, 8
xor cl, al
mov eax, [current_column]
shl eax, 8
mov al, cl
mov [current_column], eax
;element 1
mov eax, [edx]
mov ebx, [mul3_table_ptr]
xlatb
mov cl, al
shr eax, 8
mov ebx, [mul2_table_ptr]
xlatb
xor cl, al
shr eax, 8
xor cl, al
shr eax, 8
xor cl, al
mov eax, [current_column]
shl eax, 8
mov al, cl
mov [current_column], eax
;element 0
mov eax, [edx]
mov ebx, [mul2_table_ptr]
xlatb
mov cl, al
shr eax, 8
xor cl, al
shr eax, 8
xor cl, al
shr eax, 8
mov ebx, [mul3_table_ptr]
xlatb
xor cl, al
mov eax, [current_column]
shl eax, 8
mov al, cl
;finished, store it
mov [edx], eax
add edx, COLUMN_SIZE
}
pop ecx
pop ebx
pop eax
pop edx
ret
endp
;shifts the rows as desrcibed in the AES specification
;the shift process is in the reversed order because of the
;endiannes
macro loadRow{
mov al, byte [ebx+00]
shl eax,8
mov al, byte [ebx+04]
shl eax,8
mov al, byte [ebx+08]
shl eax,8
mov al, byte [ebx+12]
}
macro storeRow{
mov byte [ebx+12], al
shr eax,8
mov byte [ebx+08], al
shr eax,8
mov byte [ebx+04], al
shr eax,8
mov byte [ebx+00], al
}
proc shiftRows, data_ptr:DWORD
push eax
push ebx
mov ebx,[data_ptr]
loadRow
rol eax, 24
storeRow
inc ebx
loadRow
rol eax, 16
storeRow
inc ebx
loadRow
rol eax, 8
storeRow
pop ebx
pop eax
ret
endp
;xors the data with the round key and stores result
;in data
proc addRoundKey data_ptr:DWORD, round_key_ptr:DWORD
push eax
push ebx
push edx
mov eax,[data_ptr]
mov ebx,[round_key_ptr]
rept 4{
mov edx,[eax]
xor edx,[ebx]
mov [eax],edx
add eax,COLUMN_SIZE
add ebx,COLUMN_SIZE
}
pop edx
pop ebx
pop eax
ret
endp
;substitute aes block with s-box
proc subBlockBytes data_ptr:DWORD, sbox_ptr:DWORD
push eax
push ebx
push edx
mov ebx, [sbox_ptr]
mov edx, [data_ptr]
rept 4{
mov eax, [edx]
xlatb
ror eax, 8
xlatb
ror eax, 8
xlatb
ror eax, 8
xlatb
ror eax, 8
mov [edx], eax
add edx, COLUMN_SIZE
}
pop edx
pop ebx
pop eax
ret
endp
;uses the generated round keys to decrypt an aes block
proc decryptionRounds decryption_ptr:DWORD,\
roundkeys_ptr:DWORD, inverse_sbox_ptr:DWORD, mul9_table_ptr:DWORD, \
mul11_table_ptr:DWORD, mul13_table_ptr:DWORD,\
mul14_table_ptr:DWORD
pushad
;roundkey and decryption in eax and ebx
mov eax, [roundkeys_ptr]
add eax, BLOCK_SIZE*ENCRYPTION_ROUNDS
mov ebx, [decryption_ptr]
;final round
stdcall addRoundKey, ebx, eax
stdcall inverseShiftRows, ebx
stdcall subBlockBytes, ebx, [inverse_sbox_ptr]
sub eax,BLOCK_SIZE
;main round
dr_main:
stdcall addRoundKey, ebx, eax
stdcall mixColumns9111314, ebx, [mul9_table_ptr], [mul11_table_ptr],\
[mul13_table_ptr], [mul14_table_ptr]
stdcall inverseShiftRows, ebx
stdcall subBlockBytes, ebx, [inverse_sbox_ptr]
sub eax, BLOCK_SIZE
cmp eax, [roundkeys_ptr]
jne dr_main
;initial_round
stdcall addRoundKey, ebx, eax
popad
ret
endp
;mix columns operation is a column matrix
;multiplication
proc mixColumns9111314, data_ptr:DWORD, mul9_table_ptr:DWORD,\
mul11_table_ptr:DWORD, mul13_table_ptr:DWORD, mul14_table_ptr:DWORD
local current_column:DWORD
push edx
push eax
push ebx
push ecx
mov edx, [data_ptr]
rept 4{
;element 3
mov eax, [edx]
mov ebx, [mul9_table_ptr]
xlatb
mov cl, al
shr eax,8
mov ebx, [mul13_table_ptr]
xlatb
xor cl, al
shr eax,8
mov ebx, [mul11_table_ptr]
xlatb
xor cl, al
shr eax,8
mov ebx, [mul14_table_ptr]
xlatb
xor cl, al
mov [current_column], ecx
;element 2
mov eax, [edx]
mov ebx, [mul13_table_ptr]
xlatb
mov cl, al
shr eax,8
mov ebx, [mul11_table_ptr]
xlatb
xor cl, al
shr eax,8
mov ebx, [mul14_table_ptr]
xlatb
xor cl, al
shr eax,8
mov ebx, [mul9_table_ptr]
xlatb
xor cl, al
mov eax, [current_column]
shl eax, 8
mov al, cl
mov [current_column], eax
;element 1
mov eax, [edx]
mov ebx, [mul11_table_ptr]
xlatb
mov cl, al
shr eax,8
mov ebx, [mul14_table_ptr]
xlatb
xor cl, al
shr eax,8
mov ebx, [mul9_table_ptr]
xlatb
xor cl, al
shr eax,8
mov ebx, [mul13_table_ptr]
xlatb
xor cl, al
mov eax, [current_column]
shl eax, 8
mov al, cl
mov [current_column], eax
;element 0
mov eax, [edx]
mov ebx, [mul14_table_ptr]
xlatb
mov cl, al
shr eax,8
mov ebx, [mul9_table_ptr]
xlatb
xor cl, al
shr eax,8
mov ebx, [mul13_table_ptr]
xlatb
xor cl, al
shr eax,8
mov ebx, [mul11_table_ptr]
xlatb
xor cl, al
mov eax, [current_column]
shl eax, 8
mov al, cl
;finished, store it
mov [edx], eax
add edx, COLUMN_SIZE
}
pop ecx
pop ebx
pop eax
pop edx
ret
endp
;reverse shift operation for decryption
proc inverseShiftRows, data_ptr:DWORD
push eax
push ebx
mov ebx,[data_ptr]
loadRow
rol eax, 8
storeRow
inc ebx
loadRow
rol eax, 16
storeRow
inc ebx
loadRow
rol eax, 24
storeRow
pop ebx
pop eax
ret
endp
macro CreateGalois target, [char]
{
mov byte [target], char
inc target
}
;create 2 lookup tables for multiplication in the
;galois field with 2 and 3
proc createGaloisEncryption mul2_ptr:DWORD, mul3_ptr:DWORD
push eax
mov eax, [mul2_ptr]
CreateGalois eax, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e,\
0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e,\
0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e,\
0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e,\
0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e,\
0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe,\
0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde,\
0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe,\
0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f, 0x0d, 0x03, 0x01, 0x07, 0x05,\
0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d, 0x23, 0x21, 0x27, 0x25,\
0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, 0x45,\
0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65,\
0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85,\
0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5,\
0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5,\
0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5
mov eax, [mul3_ptr]
CreateGalois eax, 0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11,\
0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21,\
0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71,\
0x50, 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, 0x42, 0x41,\
0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9, 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1,\
0xf0, 0xf3, 0xf6, 0xf5, 0xfc, 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1,\
0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa, 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1,\
0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88, 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81,\
0x9b, 0x98, 0x9d, 0x9e, 0x97, 0x94, 0x91, 0x92, 0x83, 0x80, 0x85, 0x86, 0x8f, 0x8c, 0x89, 0x8a,\
0xab, 0xa8, 0xad, 0xae, 0xa7, 0xa4, 0xa1, 0xa2, 0xb3, 0xb0, 0xb5, 0xb6, 0xbf, 0xbc, 0xb9, 0xba,\
0xfb, 0xf8, 0xfd, 0xfe, 0xf7, 0xf4, 0xf1, 0xf2, 0xe3, 0xe0, 0xe5, 0xe6, 0xef, 0xec, 0xe9, 0xea,\
0xcb, 0xc8, 0xcd, 0xce, 0xc7, 0xc4, 0xc1, 0xc2, 0xd3, 0xd0, 0xd5, 0xd6, 0xdf, 0xdc, 0xd9, 0xda,\
0x5b, 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46, 0x4f, 0x4c, 0x49, 0x4a,\
0x6b, 0x68, 0x6d, 0x6e, 0x67, 0x64, 0x61, 0x62, 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a,\
0x3b, 0x38, 0x3d, 0x3e, 0x37, 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a,\
0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, 0x02, 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a
pop eax
ret
endp
;create 4 lookup tables for multiplication in the
;galois field with 9, 11, 13 and 14
proc createGaloisDecryption mul9_ptr:DWORD, mul11_ptr:DWORD,\
mul13_ptr:DWORD, mul14_ptr:DWORD
push eax
mov eax, [mul9_ptr]
CreateGalois eax, 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, \
0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, \
0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, \
0xab, 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, 0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc, \
0x76, 0x7f, 0x64, 0x6d, 0x52, 0x5b, 0x40, 0x49, 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01, \
0xe6, 0xef, 0xf4, 0xfd, 0xc2, 0xcb, 0xd0, 0xd9, 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91, \
0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, 0x72, 0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a, \
0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2, 0x95, 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa, \
0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3, 0xa4, 0xad, 0xb6, 0xbf, 0x80, 0x89, 0x92, 0x9b, \
0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, 0x34, 0x3d, 0x26, 0x2f, 0x10, 0x19, 0x02, 0x0b, \
0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0, \
0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, \
0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed, \
0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35, 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, \
0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6, \
0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46
mov eax, [mul11_ptr]
CreateGalois eax, 0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69, \
0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, \
0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12, \
0xcb, 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, 0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2, \
0xf6, 0xfd, 0xe0, 0xeb, 0xda, 0xd1, 0xcc, 0xc7, 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f, \
0x46, 0x4d, 0x50, 0x5b, 0x6a, 0x61, 0x7c, 0x77, 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f, \
0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, 0xbc, 0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4, \
0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c, 0x65, 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54, \
0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6, 0xaf, 0xa4, 0xb9, 0xb2, 0x83, 0x88, 0x95, 0x9e, \
0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, 0x1f, 0x14, 0x09, 0x02, 0x33, 0x38, 0x25, 0x2e, \
0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd, 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, 0xe5, \
0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d, 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55, \
0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, \
0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, \
0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13, \
0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3
mov eax, [mul13_ptr]
CreateGalois eax, 0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b, \
0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, \
0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0, \
0x6b, 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, 0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20, \
0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e, 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, \
0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, \
0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, 0xf5, 0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d, \
0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25, 0x6e, 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d, \
0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91, \
0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41, \
0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42, 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, 0x2a, \
0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92, 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa, \
0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, \
0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, \
0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47, \
0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97
mov eax, [mul14_ptr]
CreateGalois eax, 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, \
0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, \
0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81, \
0x3b, 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, 0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61, \
0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87, 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, \
0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, \
0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, 0x5c, 0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c, \
0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc, 0xe6, 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc, \
0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b, 0x31, 0x3f, 0x2d, 0x23, 0x09, 0x07, 0x15, 0x1b, \
0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, 0xd1, 0xdf, 0xcd, 0xc3, 0xe9, 0xe7, 0xf5, 0xfb, \
0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0, \
0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, \
0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6, \
0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26, 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, \
0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, \
0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d
pop eax
ret
endp
;encrypts cleartext and stores the result at enctext
proc encAES size:DWORD, cleartext_ptr:DWORD, enctext_ptr:DWORD,\
aeskey_ptr:DWORD
local keychain[(ENCRYPTION_ROUNDS+1)*BLOCK_SIZE]:BYTE, sbox[SBOX_SIZE]:BYTE,\
rcon[RCON_SIZE]:BYTE, galois_mul2[GALOIS_SIZE]:BYTE,\
galois_mul3[GALOIS_SIZE]:BYTE, mul2_table_ptr:DWORD,\
mul3_table_ptr:DWORD, sbox_ptr:DWORD, keychain_ptr:DWORD,\
rcon_ptr:DWORD
pushad
;sbox and rcon are created in memory
;galois lookup tables too
lea eax,[sbox]
mov [sbox_ptr], eax
stdcall createSBox, eax
lea eax,[rcon]
mov [rcon_ptr], eax
stdcall createRcon, eax
lea eax,[galois_mul2]
mov [mul2_table_ptr], eax
lea ebx,[galois_mul3]
mov [mul3_table_ptr], ebx
stdcall createGaloisEncryption, eax, ebx
;copy the key into the round key buffer
mov ecx, KEY_SIZE
mov esi, [aeskey_ptr]
lea edi, [keychain]
mov [keychain_ptr], edi
rep movsb
;create the round keys
stdcall createKeyChain, [keychain_ptr], [sbox_ptr],\
[rcon_ptr]
;copy clear text to encryption buffer
mov ecx, [size]
mov esi, [cleartext_ptr]
mov edi, [enctext_ptr]
rep movsb
;eax == current to be encrypted block
;ebx == end of cleartext
mov eax,[enctext_ptr]
mov ebx,eax
add ebx,[size]
eaes_block_loop:
stdcall encryptionRounds, eax, [keychain_ptr], \
[sbox_ptr], [mul2_table_ptr], [mul3_table_ptr]
add eax,BLOCK_SIZE
cmp eax,ebx
jnge eaes_block_loop
popad
mov eax,1
ret
endp
;decrypts cleartext and stores the result at enctext
proc decAES size:DWORD, enctext_ptr:DWORD, cleartext_ptr:DWORD,\
aeskey_ptr:DWORD
local keychain[(ENCRYPTION_ROUNDS+1)*BLOCK_SIZE]:BYTE,\
sbox[SBOX_SIZE]:BYTE, invert_sbox[SBOX_SIZE]:BYTE,\
rcon[RCON_SIZE]:BYTE,\
galois_mul9[GALOIS_SIZE]:BYTE, galois_mul11[GALOIS_SIZE]:BYTE, \
galois_mul13[GALOIS_SIZE]:BYTE, galois_mul14[GALOIS_SIZE]:BYTE,\
mul9_table_ptr:DWORD, mul11_table_ptr:DWORD, mul13_table_ptr:DWORD,\
mul14_table_ptr:DWORD, sbox_ptr:DWORD, invert_sbox_ptr:DWORD,\
keychain_ptr:DWORD, rcon_ptr:DWORD
pushad
;sbox, invert sbox
;and rcon are created in memory
lea eax,[sbox]
mov [sbox_ptr], eax
stdcall createSBox, eax
lea eax,[rcon]
mov [rcon_ptr], eax
stdcall createRcon, eax
lea eax, [invert_sbox]
mov [invert_sbox_ptr], eax
stdcall createInvertSBox, eax
;create galois lookup tables for
;9, 11, 13 and 14
lea eax,[galois_mul9]
mov [mul9_table_ptr], eax
lea ebx,[galois_mul11]
mov [mul11_table_ptr], ebx
lea ecx,[galois_mul13]
mov [mul13_table_ptr], ecx
lea edx,[galois_mul14]
mov [mul14_table_ptr], edx
stdcall createGaloisDecryption, eax, ebx, ecx, edx
;copy the key into the round key buffer
mov ecx, KEY_SIZE
mov esi, [aeskey_ptr]
lea edi, [keychain]
mov [keychain_ptr], edi
rep movsb
;create the round keys
stdcall createKeyChain, [keychain_ptr], [sbox_ptr],\
[rcon_ptr]
;copy encrypted text to decryption buffer
mov ecx, [size]
mov esi, [enctext_ptr]
mov edi, [cleartext_ptr]
rep movsb
;eax == current to be decrypted block
;ebx == end of cleartext
mov eax,[cleartext_ptr]
mov ebx,eax
add ebx,[size]
daes_block_loop:
stdcall decryptionRounds, eax, [keychain_ptr],\
[invert_sbox_ptr], [mul9_table_ptr], [mul11_table_ptr],\
[mul13_table_ptr], [mul14_table_ptr]
add eax,BLOCK_SIZE
cmp eax,ebx
jnge daes_block_loop
popad
mov eax,1
ret
endp
;END AES.ASM