diff options
Diffstat (limited to 'scripts/conf-w32brg/cipher/aescrypt.asm')
-rw-r--r-- | scripts/conf-w32brg/cipher/aescrypt.asm | 404 |
1 files changed, 0 insertions, 404 deletions
diff --git a/scripts/conf-w32brg/cipher/aescrypt.asm b/scripts/conf-w32brg/cipher/aescrypt.asm deleted file mode 100644 index 90beaaabf..000000000 --- a/scripts/conf-w32brg/cipher/aescrypt.asm +++ /dev/null @@ -1,404 +0,0 @@ - -; --------------------------------------------------------------------------- -; Copyright (c) 2002, Dr Brian Gladman <[email protected]>, Worcester, UK. -; All rights reserved. -; -; LICENSE TERMS -; -; The free distribution and use of this software in both source and binary -; form is allowed (with or without changes) provided that: -; -; 1. distributions of this source code include the above copyright -; notice, this list of conditions and the following disclaimer; -; -; 2. distributions in binary form include the above copyright -; notice, this list of conditions and the following disclaimer -; in the documentation and/or other associated materials; -; -; 3. the copyright holder's name is not used to endorse products -; built using this software without specific written permission. -; -; ALTERNATIVELY, provided that this notice is retained in full, this product -; may be distributed under the terms of the GNU General Public License (GPL), -; in which case the provisions of the GPL apply INSTEAD OF those given above. -; -; DISCLAIMER -; -; This software is provided 'as is' with no explicit or implied warranties -; in respect of its properties, including, but not limited to, correctness -; and/or fitness for purpose. -; --------------------------------------------------------------------------- -; Issue Date: 1/06/2003 - -; An AES implementation for Pentium processors using the NASM assembler (see -; <http://sourceforge.net/projects/nasm>).This version provides the standard -; AES block length (128 bits, 16 bytes) with the same interface as that used -; in my C implementation. The eax, ecx and edx registers and the artihmetic -; status flags are not preserved. The ebx, esi, edi, and ebp registers are -; preserved across calls. Only encryption and decryption are provided here, -; here, the key scheduling code being that in aeskey.c compiled with USE_ASM -; defined. This code uses the VC++ register saving conentions; if it is used -; with another compiler, its conventions for using and saving registers will -; need to be checked (and calling conventions). The NASM command line for -; the VC++ custom build step is: -; -; nasm -O2 -f win32 -o "$(TargetDir)\$(InputName).obj" "$(InputPath)" - - section .text ; use32 - -; aes_rval aes_encrypt(const unsigned char in_blk[], -; unsigned char out_blk[], const aes_encrypt_ctx cx[1]); -; aes_rval aes_decrypt(const unsigned char in_blk[], -; unsigned char out_blk[], const aes_decrypt_ctx cx[1]); -; -; comment in/out the following lines to obtain the desired subroutines - -%define ENCRYPTION ; define if encryption is needed -%define DECRYPTION ; define if decryption is needed - -; The DLL interface must use the _stdcall convention in which the number -; of bytes of parameter space is added after an @ to the sutine's name. -; We must also remove our parameters from the stack before return (see -; the do_ret macro). Define AES_DLL for the Dynamic Link Library version. - -;%define AES_DLL - -tlen: equ 1024 ; length of each of 4 'xor' arrays (256 32-bit words) - -; offsets to parameters with one register pushed onto stack - -in_blk: equ 4 ; input byte array address parameter -out_blk:equ 8 ; output byte array address parameter -ctx: equ 12 ; AES context structure -stk_spc:equ 24 ; stack space - -; register mapping for encrypt and decrypt subroutines - -%define r0 eax -%define r1 ebx -%define r2 esi -%define r3 edi -%define r4 ecx -%define r5 edx -%define r6 ebp - -%define eaxl al -%define eaxh ah -%define ebxl bl -%define ebxh bh -%define ecxl cl -%define ecxh ch -%define edxl dl -%define edxh dh - -; These macros take a 32-bit word representing a column and use each -; of its 4 bytes to index a table of 256 32-bit words which are xored -; into each of the four output columns. The output values are in the -; registers %1, %2, %3 and %4 and the column input is in %5 with %6 -; as a scratch register. - -; Parameters: -; %1 out_state[0] -; %2 out_state[1] -; %3 out_state[2] -; %4 out_state[3] -; %5 input register for the round (destroyed) -; %6 scratch register for the round -; %7 key schedule address for round (in form r6 + offset) - -%macro do_fcol 8 ; first column forward round - - movzx %6,%5l - mov %1,[%8] - xor %1,[4*%6+%7] - movzx %6,%5h - shr %5,16 - mov %2,[%8+12] - xor %2,[4*%6+%7+tlen] - movzx %6,%5l - mov %3,[%8+ 8] - xor %3,[4*%6+%7+2*tlen] - movzx %6,%5h - mov %5,%4 ; save an input register value - mov %4,[%8+ 4] - xor %4,[4*%6+%7+3*tlen] - -%endmacro - -%macro do_icol 8 ; first column for inverse round - - movzx %6,%5l - mov %1,[%8] - xor %1,[4*%6+%7] - movzx %6,%5h - shr %5,16 - mov %2,[%8+ 4] - xor %2,[4*%6+%7+tlen] - movzx %6,%5l - mov %3,[%8+ 8] - xor %3,[4*%6+%7+2*tlen] - movzx %6,%5h - mov %5,%4 ; save an input register value - mov %4,[%8+12] - xor %4,[4*%6+%7+3*tlen] - -%endmacro - -%macro do_col 7 ; other columns for forward and inverse rounds - - movzx %6,%5l - xor %1,[4*%6+%7] - movzx %6,%5h - shr %5,16 - xor %2,[4*%6+%7+tlen] - movzx %6,%5l - xor %3,[4*%6+%7+2*tlen] - movzx %6,%5h - xor %4,[4*%6+%7+3*tlen] - -%endmacro - -; These macros implement stack based local variables - -%macro save 2 - mov [esp+4*%1],%2 -%endmacro - -%macro restore 2 - mov %1,[esp+4*%2] -%endmacro - -; This macro performs a forward encryption cycle. It is entered with -; the first previous round column values in r0, r1, r2 and r3 and -; exits with the final values in the same registers. - -%macro fwd_rnd 1-2 _t_fn ; normal forward rounds - - mov r4,r0 - save 0,r2 - save 1,r3 - -; compute new column values - - do_fcol r0,r3,r2,r1, r4,r5, %2, %1 ; r4 = input r0 - do_col r1,r0,r3,r2, r4,r5, %2 ; r4 = input r1 (saved in fcol_f) - restore r4,0 - do_col r2,r1,r0,r3, r4,r5, %2 ; r4 = input r2 - restore r4,1 - do_col r3,r2,r1,r0, r4,r5, %2 ; r4 = input r3 - -%endmacro - -; This macro performs an inverse encryption cycle. It is entered with -; the first previous round column values in r0, r1, r2 and r3 and -; exits with the final values in the same registers. - -%macro inv_rnd 1-2 _t_in ; normal inverse round - - mov r4,r0 - save 0,r1 - save 1,r2 - -; compute new column values - - do_icol r0,r1,r2,r3, r4,r5, %2, %1 ; r4 = r0 - do_col r3,r0,r1,r2, r4,r5, %2 ; r4 = r3 (saved in icol_f) - restore r4,1 - do_col r2,r3,r0,r1, r4,r5, %2 ; r4 = r2 - restore r4,0 - do_col r1,r2,r3,r0, r4,r5, %2 ; r4 = r1 - -%endmacro - -; the DLL has to implement the _stdcall calling interface on return -; In this case we have to take our parameters (3 4-byte pointers) -; off the stack - -%macro do_ret 0 -%ifdef AES_DLL - ret 12 -%else - ret -%endif -%endmacro - -%macro do_name 1 -%ifndef AES_DLL - global %1 -%1: -%else - global %1@12 - export %1@12 -%1@12: -%endif -%endmacro - -; AES Encryption Subroutine - -%ifdef ENCRYPTION - - extern _t_fn - extern _t_fl - - do_name _aes_encrypt - - sub esp,stk_spc - mov [esp+20],ebp - mov [esp+16],ebx - mov [esp+12],esi - mov [esp+ 8],edi - mov r4,[esp+in_blk+stk_spc] ; input pointer - mov r6,[esp+ctx+stk_spc] ; key pointer - -; input four columns and xor in first round key - - mov r0,[r4 ] - mov r1,[r4+ 4] - xor r0,[r6 ] - xor r1,[r6+ 4] - mov r2,[r4+ 8] - mov r3,[r4+12] - xor r2,[r6+ 8] - xor r3,[r6+12] - -; determine the number of rounds - - mov r4,[r6+4*45] - mov r5,[r6+4*52] - xor r4,[r6+4*53] - xor r4,r5 - je .1 - cmp r5,10 - je .3 - cmp r5,12 - je .2 - mov ebp,[esp+20] - mov ebx,[esp+16] - mov esi,[esp+12] - mov edi,[esp+ 8] - lea esp,[esp+stk_spc] - mov eax,-1 - do_ret - -.1: fwd_rnd r6+ 16 ; 14 rounds for 256-bit key - fwd_rnd r6+ 32 - lea r6,[r6+32] -.2: fwd_rnd r6+ 16 ; 12 rounds for 192-bit key - fwd_rnd r6+ 32 - lea r6,[r6+32] -.3: fwd_rnd r6+ 16 ; 10 rounds for 128-bit key - fwd_rnd r6+ 32 - fwd_rnd r6+ 48 - fwd_rnd r6+ 64 - fwd_rnd r6+ 80 - fwd_rnd r6+ 96 - fwd_rnd r6+112 - fwd_rnd r6+128 - fwd_rnd r6+144 - fwd_rnd r6+160, _t_fl ; last round uses a different table - -; move final values to the output array - - mov r6,[esp+out_blk+stk_spc] - mov [r6+12],r3 - mov [r6+8],r2 - mov [r6+4],r1 - mov [r6],r0 - mov ebp,[esp+20] - mov ebx,[esp+16] - mov esi,[esp+12] - mov edi,[esp+ 8] - lea esp,[esp+stk_spc] - xor eax,eax - do_ret - -%endif - -; AES Decryption Subroutine - -%ifdef DECRYPTION - - extern _t_in - extern _t_il - - do_name _aes_decrypt - - sub esp,stk_spc - mov [esp+20],ebp - mov [esp+16],ebx - mov [esp+12],esi - mov [esp+ 8],edi - mov r4,[esp+in_blk+stk_spc] ; input pointer - mov r6,[esp+ctx+stk_spc] ; context pointer - -; input four columns - - mov r0,[r4] - mov r1,[r4+4] - mov r2,[r4+8] - mov r3,[r4+12] - -; determine the number of rounds - - mov r5,[r6+4*52] - mov r4,[r6+4*45] - xor r4,[r6+4*53] - xor r4,r5 - jne .1 - mov r5,14 - -; xor in initial keys - -.1: lea r4,[4*r5] - xor r0,[r6+4*r4 ] - xor r1,[r6+4*r4+ 4] - xor r2,[r6+4*r4+ 8] - xor r3,[r6+4*r4+12] - cmp r5,10 - je .3 - cmp r5,12 - je .2 - cmp r5,14 - jne .4 - - inv_rnd r6+208 ; 14 rounds for 256-bit key - inv_rnd r6+192 -.2: inv_rnd r6+176 ; 12 rounds for 192-bit key - inv_rnd r6+160 -.3: inv_rnd r6+144 ; 10 rounds for 128-bit key - inv_rnd r6+128 - inv_rnd r6+112 - inv_rnd r6+ 96 - inv_rnd r6+ 80 - inv_rnd r6+ 64 - inv_rnd r6+ 48 - inv_rnd r6+ 32 - inv_rnd r6+ 16 - inv_rnd r6, _t_il ; last round uses a different table - -; move final values to the output array. - - mov r6,[esp+out_blk+stk_spc] - mov [r6+12],r3 - mov [r6+8],r2 - mov [r6+4],r1 - mov [r6],r0 - mov ebp,[esp+20] - mov ebx,[esp+16] - mov esi,[esp+12] - mov edi,[esp+ 8] - lea esp,[esp+stk_spc] - xor eax,eax - do_ret - -.4: mov ebp,[esp+20] - mov ebx,[esp+16] - mov esi,[esp+12] - mov edi,[esp+ 8] - lea esp,[esp+stk_spc] - mov eax,-1 - do_ret - -%endif - - end |