• XSS.stack #1 – первый литературный журнал от юзеров форума

AES-256 encryption/decryption in assembly - FASM

Doisti74

HDD-drive
Пользователь
Регистрация
12.02.2014
Сообщения
47
Реакции
0
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
 
Apocalypse: Just for the cases you dont want to use the Windows API at all.. i didnt test the performance, but I will test and let you known.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх