Annotation of truecrypt/crypto/aes_x64.asm, revision 1.1.1.1

1.1       root        1: 
                      2: ; ---------------------------------------------------------------------------
                      3: ; Copyright (c) 1998-2007, Brian Gladman, Worcester, UK. All rights reserved.
                      4: ; 
                      5: ; LICENSE TERMS
                      6: ; 
                      7: ; The free distribution and use of this software is allowed (with or without
                      8: ; changes) provided that:
                      9: ; 
                     10: ;  1. source code distributions include the above copyright notice, this
                     11: ;     list of conditions and the following disclaimer;
                     12: ; 
                     13: ;  2. binary distributions include the above copyright notice, this list
                     14: ;     of conditions and the following disclaimer in their documentation;
                     15: ; 
                     16: ;  3. the name of the copyright holder is not used to endorse products
                     17: ;     built using this software without specific written permission.
                     18: ; 
                     19: ; DISCLAIMER
                     20: ; 
                     21: ; This software is provided 'as is' with no explicit or implied warranties
                     22: ; in respect of its properties, including, but not limited to, correctness
                     23: ; and/or fitness for purpose.
                     24: ; ---------------------------------------------------------------------------
                     25: ; Issue 20/12/2007
                     26: ;
                     27: ; I am grateful to Dag Arne Osvik for many discussions of the techniques that
                     28: ; can be used to optimise AES assembler code on AMD64/EM64T architectures.
                     29: ; Some of the techniques used in this implementation are the result of
                     30: ; suggestions made by him for which I am most grateful.
                     31: 
                     32: ; An AES implementation for AMD64 processors using the YASM assembler.  This
                     33: ; implemetation provides only encryption, decryption and hence requires key
                     34: ; scheduling support in C. It uses 8k bytes of tables but its encryption and
                     35: ; decryption performance is very close to that obtained using large tables.
                     36: ; It can use either Windows or Gnu/Linux calling conventions, which are as
                     37: ; follows:
                     38: ;               windows  gnu/linux
                     39: ;
                     40: ;   in_blk          rcx     rdi
                     41: ;   out_blk         rdx     rsi
                     42: ;   context (cx)     r8     rdx
                     43: ;
                     44: ;   preserved       rsi      -    + rbx, rbp, rsp, r12, r13, r14 & r15
                     45: ;   registers       rdi      -      on both
                     46: ;
                     47: ;   destroyed        -      rsi   + rax, rcx, rdx, r8, r9, r10 & r11
                     48: ;   registers        -      rdi     on both
                     49: ;
                     50: ; The default convention is that for windows, the gnu/linux convention being
                     51: ; used if __GNUC__ is defined.
                     52: ;
                     53: ; Define _SEH_ to include support for Win64 structured exception handling
                     54: ; (this requires YASM version 0.6 or later).
                     55: ;
                     56: ; This code provides the standard AES block size (128 bits, 16 bytes) and the
                     57: ; three standard AES key sizes (128, 192 and 256 bits). It has the same call
                     58: ; interface as my C implementation.  It uses the Microsoft C AMD64 calling
                     59: ; conventions in which the three parameters are placed in  rcx, rdx and r8
                     60: ; respectively.  The rbx, rsi, rdi, rbp and r12..r15 registers are preserved.
                     61: ;
                     62: ;     AES_RETURN aes_encrypt(const unsigned char in_blk[],
                     63: ;                   unsigned char out_blk[], const aes_encrypt_ctx cx[1]);
                     64: ;
                     65: ;     AES_RETURN aes_decrypt(const unsigned char in_blk[],
                     66: ;                   unsigned char out_blk[], const aes_decrypt_ctx cx[1]);
                     67: ;
                     68: ;     AES_RETURN aes_encrypt_key<NNN>(const unsigned char key[],
                     69: ;                                            const aes_encrypt_ctx cx[1]);
                     70: ;
                     71: ;     AES_RETURN aes_decrypt_key<NNN>(const unsigned char key[],
                     72: ;                                            const aes_decrypt_ctx cx[1]);
                     73: ;
                     74: ;     AES_RETURN aes_encrypt_key(const unsigned char key[],
                     75: ;                           unsigned int len, const aes_decrypt_ctx cx[1]);
                     76: ;
                     77: ;     AES_RETURN aes_decrypt_key(const unsigned char key[],
                     78: ;                           unsigned int len, const aes_decrypt_ctx cx[1]);
                     79: ;
                     80: ; where <NNN> is 128, 102 or 256.  In the last two calls the length can be in
                     81: ; either bits or bytes.
                     82: ;
                     83: ; Comment in/out the following lines to obtain the desired subroutines. These
                     84: ; selections MUST match those in the C header file aes.h
                     85: 
                     86: ; %define AES_128                 ; define if AES with 128 bit keys is needed
                     87: ; %define AES_192                 ; define if AES with 192 bit keys is needed
                     88: %define AES_256                 ; define if AES with 256 bit keys is needed
                     89: ; %define AES_VAR                 ; define if a variable key size is needed
                     90: %define ENCRYPTION              ; define if encryption is needed
                     91: %define DECRYPTION              ; define if decryption is needed
                     92: %define AES_REV_DKS             ; define if key decryption schedule is reversed
                     93: %define LAST_ROUND_TABLES       ; define for the faster version using extra tables
                     94: 
                     95: ; The encryption key schedule has the following in memory layout where N is the
                     96: ; number of rounds (10, 12 or 14):
                     97: ;
                     98: ; lo: | input key (round 0)  |  ; each round is four 32-bit words
                     99: ;     | encryption round 1   |
                    100: ;     | encryption round 2   |
                    101: ;     ....
                    102: ;     | encryption round N-1 |
                    103: ; hi: | encryption round N   |
                    104: ;
                    105: ; The decryption key schedule is normally set up so that it has the same
                    106: ; layout as above by actually reversing the order of the encryption key
                    107: ; schedule in memory (this happens when AES_REV_DKS is set):
                    108: ;
                    109: ; lo: | decryption round 0   | =              | encryption round N   |
                    110: ;     | decryption round 1   | = INV_MIX_COL[ | encryption round N-1 | ]
                    111: ;     | decryption round 2   | = INV_MIX_COL[ | encryption round N-2 | ]
                    112: ;     ....                       ....
                    113: ;     | decryption round N-1 | = INV_MIX_COL[ | encryption round 1   | ]
                    114: ; hi: | decryption round N   | =              | input key (round 0)  |
                    115: ;
                    116: ; with rounds except the first and last modified using inv_mix_column()
                    117: ; But if AES_REV_DKS is NOT set the order of keys is left as it is for
                    118: ; encryption so that it has to be accessed in reverse when used for
                    119: ; decryption (although the inverse mix column modifications are done)
                    120: ;
                    121: ; lo: | decryption round 0   | =              | input key (round 0)  |
                    122: ;     | decryption round 1   | = INV_MIX_COL[ | encryption round 1   | ]
                    123: ;     | decryption round 2   | = INV_MIX_COL[ | encryption round 2   | ]
                    124: ;     ....                       ....
                    125: ;     | decryption round N-1 | = INV_MIX_COL[ | encryption round N-1 | ]
                    126: ; hi: | decryption round N   | =              | encryption round N   |
                    127: ;
                    128: ; This layout is faster when the assembler key scheduling provided here
                    129: ; is used.
                    130: ;
                    131: ; The DLL interface must use the _stdcall convention in which the number
                    132: ; of bytes of parameter space is added after an @ to the sutine's name.
                    133: ; We must also remove our parameters from the stack before return (see
                    134: ; the do_exit macro). Define DLL_EXPORT for the Dynamic Link Library version.
                    135: 
                    136: ;%define DLL_EXPORT
                    137: 
                    138: ; End of user defines
                    139: 
                    140: %ifdef AES_VAR
                    141: %ifndef AES_128
                    142: %define AES_128
                    143: %endif
                    144: %ifndef AES_192
                    145: %define AES_192
                    146: %endif
                    147: %ifndef AES_256
                    148: %define AES_256
                    149: %endif
                    150: %endif
                    151: 
                    152: %ifdef AES_VAR
                    153: %define KS_LENGTH       60
                    154: %elifdef AES_256
                    155: %define KS_LENGTH       60
                    156: %elifdef AES_192
                    157: %define KS_LENGTH       52
                    158: %else
                    159: %define KS_LENGTH       44
                    160: %endif
                    161: 
                    162: %define     r0  rax
                    163: %define     r1  rdx
                    164: %define     r2  rcx
                    165: %define     r3  rbx
                    166: %define     r4  rsi
                    167: %define     r5  rdi
                    168: %define     r6  rbp
                    169: %define     r7  rsp
                    170: 
                    171: %define     raxd    eax
                    172: %define     rdxd    edx
                    173: %define     rcxd    ecx
                    174: %define     rbxd    ebx
                    175: %define     rsid    esi
                    176: %define     rdid    edi
                    177: %define     rbpd    ebp
                    178: %define     rspd    esp
                    179: 
                    180: %define     raxb    al
                    181: %define     rdxb    dl
                    182: %define     rcxb    cl
                    183: %define     rbxb    bl
                    184: %define     rsib    sil
                    185: %define     rdib    dil
                    186: %define     rbpb    bpl
                    187: %define     rspb    spl
                    188: 
                    189: %define     r0h ah
                    190: %define     r1h dh
                    191: %define     r2h ch
                    192: %define     r3h bh
                    193: 
                    194: %define     r0d eax
                    195: %define     r1d edx
                    196: %define     r2d ecx
                    197: %define     r3d ebx
                    198: 
                    199: ; finite field multiplies by {02}, {04} and {08}
                    200: 
                    201: %define f2(x)   ((x<<1)^(((x>>7)&1)*0x11b))
                    202: %define f4(x)   ((x<<2)^(((x>>6)&1)*0x11b)^(((x>>6)&2)*0x11b))
                    203: %define f8(x)   ((x<<3)^(((x>>5)&1)*0x11b)^(((x>>5)&2)*0x11b)^(((x>>5)&4)*0x11b))
                    204: 
                    205: ; finite field multiplies required in table generation
                    206: 
                    207: %define f3(x)   (f2(x) ^ x)
                    208: %define f9(x)   (f8(x) ^ x)
                    209: %define fb(x)   (f8(x) ^ f2(x) ^ x)
                    210: %define fd(x)   (f8(x) ^ f4(x) ^ x)
                    211: %define fe(x)   (f8(x) ^ f4(x) ^ f2(x))
                    212: 
                    213: ; macro for expanding S-box data
                    214: 
                    215: %macro enc_vals 1
                    216:     db  %1(0x63),%1(0x7c),%1(0x77),%1(0x7b),%1(0xf2),%1(0x6b),%1(0x6f),%1(0xc5)
                    217:     db  %1(0x30),%1(0x01),%1(0x67),%1(0x2b),%1(0xfe),%1(0xd7),%1(0xab),%1(0x76)
                    218:     db  %1(0xca),%1(0x82),%1(0xc9),%1(0x7d),%1(0xfa),%1(0x59),%1(0x47),%1(0xf0)
                    219:     db  %1(0xad),%1(0xd4),%1(0xa2),%1(0xaf),%1(0x9c),%1(0xa4),%1(0x72),%1(0xc0)
                    220:     db  %1(0xb7),%1(0xfd),%1(0x93),%1(0x26),%1(0x36),%1(0x3f),%1(0xf7),%1(0xcc)
                    221:     db  %1(0x34),%1(0xa5),%1(0xe5),%1(0xf1),%1(0x71),%1(0xd8),%1(0x31),%1(0x15)
                    222:     db  %1(0x04),%1(0xc7),%1(0x23),%1(0xc3),%1(0x18),%1(0x96),%1(0x05),%1(0x9a)
                    223:     db  %1(0x07),%1(0x12),%1(0x80),%1(0xe2),%1(0xeb),%1(0x27),%1(0xb2),%1(0x75)
                    224:     db  %1(0x09),%1(0x83),%1(0x2c),%1(0x1a),%1(0x1b),%1(0x6e),%1(0x5a),%1(0xa0)
                    225:     db  %1(0x52),%1(0x3b),%1(0xd6),%1(0xb3),%1(0x29),%1(0xe3),%1(0x2f),%1(0x84)
                    226:     db  %1(0x53),%1(0xd1),%1(0x00),%1(0xed),%1(0x20),%1(0xfc),%1(0xb1),%1(0x5b)
                    227:     db  %1(0x6a),%1(0xcb),%1(0xbe),%1(0x39),%1(0x4a),%1(0x4c),%1(0x58),%1(0xcf)
                    228:     db  %1(0xd0),%1(0xef),%1(0xaa),%1(0xfb),%1(0x43),%1(0x4d),%1(0x33),%1(0x85)
                    229:     db  %1(0x45),%1(0xf9),%1(0x02),%1(0x7f),%1(0x50),%1(0x3c),%1(0x9f),%1(0xa8)
                    230:     db  %1(0x51),%1(0xa3),%1(0x40),%1(0x8f),%1(0x92),%1(0x9d),%1(0x38),%1(0xf5)
                    231:     db  %1(0xbc),%1(0xb6),%1(0xda),%1(0x21),%1(0x10),%1(0xff),%1(0xf3),%1(0xd2)
                    232:     db  %1(0xcd),%1(0x0c),%1(0x13),%1(0xec),%1(0x5f),%1(0x97),%1(0x44),%1(0x17)
                    233:     db  %1(0xc4),%1(0xa7),%1(0x7e),%1(0x3d),%1(0x64),%1(0x5d),%1(0x19),%1(0x73)
                    234:     db  %1(0x60),%1(0x81),%1(0x4f),%1(0xdc),%1(0x22),%1(0x2a),%1(0x90),%1(0x88)
                    235:     db  %1(0x46),%1(0xee),%1(0xb8),%1(0x14),%1(0xde),%1(0x5e),%1(0x0b),%1(0xdb)
                    236:     db  %1(0xe0),%1(0x32),%1(0x3a),%1(0x0a),%1(0x49),%1(0x06),%1(0x24),%1(0x5c)
                    237:     db  %1(0xc2),%1(0xd3),%1(0xac),%1(0x62),%1(0x91),%1(0x95),%1(0xe4),%1(0x79)
                    238:     db  %1(0xe7),%1(0xc8),%1(0x37),%1(0x6d),%1(0x8d),%1(0xd5),%1(0x4e),%1(0xa9)
                    239:     db  %1(0x6c),%1(0x56),%1(0xf4),%1(0xea),%1(0x65),%1(0x7a),%1(0xae),%1(0x08)
                    240:     db  %1(0xba),%1(0x78),%1(0x25),%1(0x2e),%1(0x1c),%1(0xa6),%1(0xb4),%1(0xc6)
                    241:     db  %1(0xe8),%1(0xdd),%1(0x74),%1(0x1f),%1(0x4b),%1(0xbd),%1(0x8b),%1(0x8a)
                    242:     db  %1(0x70),%1(0x3e),%1(0xb5),%1(0x66),%1(0x48),%1(0x03),%1(0xf6),%1(0x0e)
                    243:     db  %1(0x61),%1(0x35),%1(0x57),%1(0xb9),%1(0x86),%1(0xc1),%1(0x1d),%1(0x9e)
                    244:     db  %1(0xe1),%1(0xf8),%1(0x98),%1(0x11),%1(0x69),%1(0xd9),%1(0x8e),%1(0x94)
                    245:     db  %1(0x9b),%1(0x1e),%1(0x87),%1(0xe9),%1(0xce),%1(0x55),%1(0x28),%1(0xdf)
                    246:     db  %1(0x8c),%1(0xa1),%1(0x89),%1(0x0d),%1(0xbf),%1(0xe6),%1(0x42),%1(0x68)
                    247:     db  %1(0x41),%1(0x99),%1(0x2d),%1(0x0f),%1(0xb0),%1(0x54),%1(0xbb),%1(0x16)
                    248: %endmacro
                    249: 
                    250: %macro dec_vals 1
                    251:     db  %1(0x52),%1(0x09),%1(0x6a),%1(0xd5),%1(0x30),%1(0x36),%1(0xa5),%1(0x38)
                    252:     db  %1(0xbf),%1(0x40),%1(0xa3),%1(0x9e),%1(0x81),%1(0xf3),%1(0xd7),%1(0xfb)
                    253:     db  %1(0x7c),%1(0xe3),%1(0x39),%1(0x82),%1(0x9b),%1(0x2f),%1(0xff),%1(0x87)
                    254:     db  %1(0x34),%1(0x8e),%1(0x43),%1(0x44),%1(0xc4),%1(0xde),%1(0xe9),%1(0xcb)
                    255:     db  %1(0x54),%1(0x7b),%1(0x94),%1(0x32),%1(0xa6),%1(0xc2),%1(0x23),%1(0x3d)
                    256:     db  %1(0xee),%1(0x4c),%1(0x95),%1(0x0b),%1(0x42),%1(0xfa),%1(0xc3),%1(0x4e)
                    257:     db  %1(0x08),%1(0x2e),%1(0xa1),%1(0x66),%1(0x28),%1(0xd9),%1(0x24),%1(0xb2)
                    258:     db  %1(0x76),%1(0x5b),%1(0xa2),%1(0x49),%1(0x6d),%1(0x8b),%1(0xd1),%1(0x25)
                    259:     db  %1(0x72),%1(0xf8),%1(0xf6),%1(0x64),%1(0x86),%1(0x68),%1(0x98),%1(0x16)
                    260:     db  %1(0xd4),%1(0xa4),%1(0x5c),%1(0xcc),%1(0x5d),%1(0x65),%1(0xb6),%1(0x92)
                    261:     db  %1(0x6c),%1(0x70),%1(0x48),%1(0x50),%1(0xfd),%1(0xed),%1(0xb9),%1(0xda)
                    262:     db  %1(0x5e),%1(0x15),%1(0x46),%1(0x57),%1(0xa7),%1(0x8d),%1(0x9d),%1(0x84)
                    263:     db  %1(0x90),%1(0xd8),%1(0xab),%1(0x00),%1(0x8c),%1(0xbc),%1(0xd3),%1(0x0a)
                    264:     db  %1(0xf7),%1(0xe4),%1(0x58),%1(0x05),%1(0xb8),%1(0xb3),%1(0x45),%1(0x06)
                    265:     db  %1(0xd0),%1(0x2c),%1(0x1e),%1(0x8f),%1(0xca),%1(0x3f),%1(0x0f),%1(0x02)
                    266:     db  %1(0xc1),%1(0xaf),%1(0xbd),%1(0x03),%1(0x01),%1(0x13),%1(0x8a),%1(0x6b)
                    267:     db  %1(0x3a),%1(0x91),%1(0x11),%1(0x41),%1(0x4f),%1(0x67),%1(0xdc),%1(0xea)
                    268:     db  %1(0x97),%1(0xf2),%1(0xcf),%1(0xce),%1(0xf0),%1(0xb4),%1(0xe6),%1(0x73)
                    269:     db  %1(0x96),%1(0xac),%1(0x74),%1(0x22),%1(0xe7),%1(0xad),%1(0x35),%1(0x85)
                    270:     db  %1(0xe2),%1(0xf9),%1(0x37),%1(0xe8),%1(0x1c),%1(0x75),%1(0xdf),%1(0x6e)
                    271:     db  %1(0x47),%1(0xf1),%1(0x1a),%1(0x71),%1(0x1d),%1(0x29),%1(0xc5),%1(0x89)
                    272:     db  %1(0x6f),%1(0xb7),%1(0x62),%1(0x0e),%1(0xaa),%1(0x18),%1(0xbe),%1(0x1b)
                    273:     db  %1(0xfc),%1(0x56),%1(0x3e),%1(0x4b),%1(0xc6),%1(0xd2),%1(0x79),%1(0x20)
                    274:     db  %1(0x9a),%1(0xdb),%1(0xc0),%1(0xfe),%1(0x78),%1(0xcd),%1(0x5a),%1(0xf4)
                    275:     db  %1(0x1f),%1(0xdd),%1(0xa8),%1(0x33),%1(0x88),%1(0x07),%1(0xc7),%1(0x31)
                    276:     db  %1(0xb1),%1(0x12),%1(0x10),%1(0x59),%1(0x27),%1(0x80),%1(0xec),%1(0x5f)
                    277:     db  %1(0x60),%1(0x51),%1(0x7f),%1(0xa9),%1(0x19),%1(0xb5),%1(0x4a),%1(0x0d)
                    278:     db  %1(0x2d),%1(0xe5),%1(0x7a),%1(0x9f),%1(0x93),%1(0xc9),%1(0x9c),%1(0xef)
                    279:     db  %1(0xa0),%1(0xe0),%1(0x3b),%1(0x4d),%1(0xae),%1(0x2a),%1(0xf5),%1(0xb0)
                    280:     db  %1(0xc8),%1(0xeb),%1(0xbb),%1(0x3c),%1(0x83),%1(0x53),%1(0x99),%1(0x61)
                    281:     db  %1(0x17),%1(0x2b),%1(0x04),%1(0x7e),%1(0xba),%1(0x77),%1(0xd6),%1(0x26)
                    282:     db  %1(0xe1),%1(0x69),%1(0x14),%1(0x63),%1(0x55),%1(0x21),%1(0x0c),%1(0x7d)
                    283: %endmacro
                    284: 
                    285: %define u8(x)   f2(x), x, x, f3(x), f2(x), x, x, f3(x)
                    286: %define v8(x)   fe(x), f9(x), fd(x), fb(x), fe(x), f9(x), fd(x), x
                    287: %define w8(x)   x, 0, 0, 0, x, 0, 0, 0
                    288: 
                    289: %define tptr    rbp     ; table pointer
                    290: %define kptr    r8      ; key schedule pointer
                    291: %define fofs    128     ; adjust offset in key schedule to keep |disp| < 128
                    292: %define fk_ref(x,y) [kptr-16*x+fofs+4*y]
                    293: %ifdef  AES_REV_DKS
                    294: %define rofs    128
                    295: %define ik_ref(x,y) [kptr-16*x+rofs+4*y]
                    296: %else
                    297: %define rofs    -128
                    298: %define ik_ref(x,y) [kptr+16*x+rofs+4*y]
                    299: %endif
                    300: 
                    301: %define tab_0(x)   [tptr+8*x]
                    302: %define tab_1(x)   [tptr+8*x+3]
                    303: %define tab_2(x)   [tptr+8*x+2]
                    304: %define tab_3(x)   [tptr+8*x+1]
                    305: %define tab_f(x)   byte [tptr+8*x+1]
                    306: %define tab_i(x)   byte [tptr+8*x+7]
                    307: %define t_ref(x,r) tab_ %+ x(r)
                    308: 
                    309: %macro ff_rnd 5                 ; normal forward round
                    310:     mov     %1d, fk_ref(%5,0)
                    311:     mov     %2d, fk_ref(%5,1)
                    312:     mov     %3d, fk_ref(%5,2)
                    313:     mov     %4d, fk_ref(%5,3)
                    314: 
                    315:     movzx   esi, al
                    316:     movzx   edi, ah
                    317:     shr     eax, 16
                    318:     xor     %1d, t_ref(0,rsi)
                    319:     xor     %4d, t_ref(1,rdi)
                    320:     movzx   esi, al
                    321:     movzx   edi, ah
                    322:     xor     %3d, t_ref(2,rsi)
                    323:     xor     %2d, t_ref(3,rdi)
                    324: 
                    325:     movzx   esi, bl
                    326:     movzx   edi, bh
                    327:     shr     ebx, 16
                    328:     xor     %2d, t_ref(0,rsi)
                    329:     xor     %1d, t_ref(1,rdi)
                    330:     movzx   esi, bl
                    331:     movzx   edi, bh
                    332:     xor     %4d, t_ref(2,rsi)
                    333:     xor     %3d, t_ref(3,rdi)
                    334: 
                    335:     movzx   esi, cl
                    336:     movzx   edi, ch
                    337:     shr     ecx, 16
                    338:     xor     %3d, t_ref(0,rsi)
                    339:     xor     %2d, t_ref(1,rdi)
                    340:     movzx   esi, cl
                    341:     movzx   edi, ch
                    342:     xor     %1d, t_ref(2,rsi)
                    343:     xor     %4d, t_ref(3,rdi)
                    344: 
                    345:     movzx   esi, dl
                    346:     movzx   edi, dh
                    347:     shr     edx, 16
                    348:     xor     %4d, t_ref(0,rsi)
                    349:     xor     %3d, t_ref(1,rdi)
                    350:     movzx   esi, dl
                    351:     movzx   edi, dh
                    352:     xor     %2d, t_ref(2,rsi)
                    353:     xor     %1d, t_ref(3,rdi)
                    354: 
                    355:     mov     eax,%1d
                    356:     mov     ebx,%2d
                    357:     mov     ecx,%3d
                    358:     mov     edx,%4d
                    359: %endmacro
                    360: 
                    361: %ifdef LAST_ROUND_TABLES
                    362: 
                    363: %macro fl_rnd 5                 ; last forward round
                    364:     add     tptr, 2048
                    365:     mov     %1d, fk_ref(%5,0)
                    366:     mov     %2d, fk_ref(%5,1)
                    367:     mov     %3d, fk_ref(%5,2)
                    368:     mov     %4d, fk_ref(%5,3)
                    369: 
                    370:     movzx   esi, al
                    371:     movzx   edi, ah
                    372:     shr     eax, 16
                    373:     xor     %1d, t_ref(0,rsi)
                    374:     xor     %4d, t_ref(1,rdi)
                    375:     movzx   esi, al
                    376:     movzx   edi, ah
                    377:     xor     %3d, t_ref(2,rsi)
                    378:     xor     %2d, t_ref(3,rdi)
                    379: 
                    380:     movzx   esi, bl
                    381:     movzx   edi, bh
                    382:     shr     ebx, 16
                    383:     xor     %2d, t_ref(0,rsi)
                    384:     xor     %1d, t_ref(1,rdi)
                    385:     movzx   esi, bl
                    386:     movzx   edi, bh
                    387:     xor     %4d, t_ref(2,rsi)
                    388:     xor     %3d, t_ref(3,rdi)
                    389: 
                    390:     movzx   esi, cl
                    391:     movzx   edi, ch
                    392:     shr     ecx, 16
                    393:     xor     %3d, t_ref(0,rsi)
                    394:     xor     %2d, t_ref(1,rdi)
                    395:     movzx   esi, cl
                    396:     movzx   edi, ch
                    397:     xor     %1d, t_ref(2,rsi)
                    398:     xor     %4d, t_ref(3,rdi)
                    399: 
                    400:     movzx   esi, dl
                    401:     movzx   edi, dh
                    402:     shr     edx, 16
                    403:     xor     %4d, t_ref(0,rsi)
                    404:     xor     %3d, t_ref(1,rdi)
                    405:     movzx   esi, dl
                    406:     movzx   edi, dh
                    407:     xor     %2d, t_ref(2,rsi)
                    408:     xor     %1d, t_ref(3,rdi)
                    409: %endmacro
                    410: 
                    411: %else
                    412: 
                    413: %macro fl_rnd 5                 ; last forward round
                    414:     mov     %1d, fk_ref(%5,0)
                    415:     mov     %2d, fk_ref(%5,1)
                    416:     mov     %3d, fk_ref(%5,2)
                    417:     mov     %4d, fk_ref(%5,3)
                    418: 
                    419:     movzx   esi, al
                    420:     movzx   edi, ah
                    421:     shr     eax, 16
                    422:     movzx   esi, t_ref(f,rsi)
                    423:     movzx   edi, t_ref(f,rdi)
                    424:     xor     %1d, esi
                    425:     rol     edi, 8
                    426:     xor     %4d, edi
                    427:     movzx   esi, al
                    428:     movzx   edi, ah
                    429:     movzx   esi, t_ref(f,rsi)
                    430:     movzx   edi, t_ref(f,rdi)
                    431:     rol     esi, 16
                    432:     rol     edi, 24
                    433:     xor     %3d, esi
                    434:     xor     %2d, edi
                    435: 
                    436:     movzx   esi, bl
                    437:     movzx   edi, bh
                    438:     shr     ebx, 16
                    439:     movzx   esi, t_ref(f,rsi)
                    440:     movzx   edi, t_ref(f,rdi)
                    441:     xor     %2d, esi
                    442:     rol     edi, 8
                    443:     xor     %1d, edi
                    444:     movzx   esi, bl
                    445:     movzx   edi, bh
                    446:     movzx   esi, t_ref(f,rsi)
                    447:     movzx   edi, t_ref(f,rdi)
                    448:     rol     esi, 16
                    449:     rol     edi, 24
                    450:     xor     %4d, esi
                    451:     xor     %3d, edi
                    452: 
                    453:     movzx   esi, cl
                    454:     movzx   edi, ch
                    455:     movzx   esi, t_ref(f,rsi)
                    456:     movzx   edi, t_ref(f,rdi)
                    457:     shr     ecx, 16
                    458:     xor     %3d, esi
                    459:     rol     edi, 8
                    460:     xor     %2d, edi
                    461:     movzx   esi, cl
                    462:     movzx   edi, ch
                    463:     movzx   esi, t_ref(f,rsi)
                    464:     movzx   edi, t_ref(f,rdi)
                    465:     rol     esi, 16
                    466:     rol     edi, 24
                    467:     xor     %1d, esi
                    468:     xor     %4d, edi
                    469: 
                    470:     movzx   esi, dl
                    471:     movzx   edi, dh
                    472:     movzx   esi, t_ref(f,rsi)
                    473:     movzx   edi, t_ref(f,rdi)
                    474:     shr     edx, 16
                    475:     xor     %4d, esi
                    476:     rol     edi, 8
                    477:     xor     %3d, edi
                    478:     movzx   esi, dl
                    479:     movzx   edi, dh
                    480:     movzx   esi, t_ref(f,rsi)
                    481:     movzx   edi, t_ref(f,rdi)
                    482:     rol     esi, 16
                    483:     rol     edi, 24
                    484:     xor     %2d, esi
                    485:     xor     %1d, edi
                    486: %endmacro
                    487: 
                    488: %endif
                    489: 
                    490: %macro ii_rnd 5                 ; normal inverse round
                    491:     mov     %1d, ik_ref(%5,0)
                    492:     mov     %2d, ik_ref(%5,1)
                    493:     mov     %3d, ik_ref(%5,2)
                    494:     mov     %4d, ik_ref(%5,3)
                    495: 
                    496:     movzx   esi, al
                    497:     movzx   edi, ah
                    498:     shr     eax, 16
                    499:     xor     %1d, t_ref(0,rsi)
                    500:     xor     %2d, t_ref(1,rdi)
                    501:     movzx   esi, al
                    502:     movzx   edi, ah
                    503:     xor     %3d, t_ref(2,rsi)
                    504:     xor     %4d, t_ref(3,rdi)
                    505: 
                    506:     movzx   esi, bl
                    507:     movzx   edi, bh
                    508:     shr     ebx, 16
                    509:     xor     %2d, t_ref(0,rsi)
                    510:     xor     %3d, t_ref(1,rdi)
                    511:     movzx   esi, bl
                    512:     movzx   edi, bh
                    513:     xor     %4d, t_ref(2,rsi)
                    514:     xor     %1d, t_ref(3,rdi)
                    515: 
                    516:     movzx   esi, cl
                    517:     movzx   edi, ch
                    518:     shr     ecx, 16
                    519:     xor     %3d, t_ref(0,rsi)
                    520:     xor     %4d, t_ref(1,rdi)
                    521:     movzx   esi, cl
                    522:     movzx   edi, ch
                    523:     xor     %1d, t_ref(2,rsi)
                    524:     xor     %2d, t_ref(3,rdi)
                    525: 
                    526:     movzx   esi, dl
                    527:     movzx   edi, dh
                    528:     shr     edx, 16
                    529:     xor     %4d, t_ref(0,rsi)
                    530:     xor     %1d, t_ref(1,rdi)
                    531:     movzx   esi, dl
                    532:     movzx   edi, dh
                    533:     xor     %2d, t_ref(2,rsi)
                    534:     xor     %3d, t_ref(3,rdi)
                    535: 
                    536:     mov     eax,%1d
                    537:     mov     ebx,%2d
                    538:     mov     ecx,%3d
                    539:     mov     edx,%4d
                    540: %endmacro
                    541: 
                    542: %ifdef LAST_ROUND_TABLES
                    543: 
                    544: %macro il_rnd 5                 ; last inverse round
                    545:     add     tptr, 2048
                    546:     mov     %1d, ik_ref(%5,0)
                    547:     mov     %2d, ik_ref(%5,1)
                    548:     mov     %3d, ik_ref(%5,2)
                    549:     mov     %4d, ik_ref(%5,3)
                    550: 
                    551:     movzx   esi, al
                    552:     movzx   edi, ah
                    553:     shr     eax, 16
                    554:     xor     %1d, t_ref(0,rsi)
                    555:     xor     %2d, t_ref(1,rdi)
                    556:     movzx   esi, al
                    557:     movzx   edi, ah
                    558:     xor     %3d, t_ref(2,rsi)
                    559:     xor     %4d, t_ref(3,rdi)
                    560: 
                    561:     movzx   esi, bl
                    562:     movzx   edi, bh
                    563:     shr     ebx, 16
                    564:     xor     %2d, t_ref(0,rsi)
                    565:     xor     %3d, t_ref(1,rdi)
                    566:     movzx   esi, bl
                    567:     movzx   edi, bh
                    568:     xor     %4d, t_ref(2,rsi)
                    569:     xor     %1d, t_ref(3,rdi)
                    570: 
                    571:     movzx   esi, cl
                    572:     movzx   edi, ch
                    573:     shr     ecx, 16
                    574:     xor     %3d, t_ref(0,rsi)
                    575:     xor     %4d, t_ref(1,rdi)
                    576:     movzx   esi, cl
                    577:     movzx   edi, ch
                    578:     xor     %1d, t_ref(2,rsi)
                    579:     xor     %2d, t_ref(3,rdi)
                    580: 
                    581:     movzx   esi, dl
                    582:     movzx   edi, dh
                    583:     shr     edx, 16
                    584:     xor     %4d, t_ref(0,rsi)
                    585:     xor     %1d, t_ref(1,rdi)
                    586:     movzx   esi, dl
                    587:     movzx   edi, dh
                    588:     xor     %2d, t_ref(2,rsi)
                    589:     xor     %3d, t_ref(3,rdi)
                    590: %endmacro
                    591: 
                    592: %else
                    593: 
                    594: %macro il_rnd 5                 ; last inverse round
                    595:     mov     %1d, ik_ref(%5,0)
                    596:     mov     %2d, ik_ref(%5,1)
                    597:     mov     %3d, ik_ref(%5,2)
                    598:     mov     %4d, ik_ref(%5,3)
                    599: 
                    600:     movzx   esi, al
                    601:     movzx   edi, ah
                    602:     movzx   esi, t_ref(i,rsi)
                    603:     movzx   edi, t_ref(i,rdi)
                    604:     shr     eax, 16
                    605:     xor     %1d, esi
                    606:     rol     edi, 8
                    607:     xor     %2d, edi
                    608:     movzx   esi, al
                    609:     movzx   edi, ah
                    610:     movzx   esi, t_ref(i,rsi)
                    611:     movzx   edi, t_ref(i,rdi)
                    612:     rol     esi, 16
                    613:     rol     edi, 24
                    614:     xor     %3d, esi
                    615:     xor     %4d, edi
                    616: 
                    617:     movzx   esi, bl
                    618:     movzx   edi, bh
                    619:     movzx   esi, t_ref(i,rsi)
                    620:     movzx   edi, t_ref(i,rdi)
                    621:     shr     ebx, 16
                    622:     xor     %2d, esi
                    623:     rol     edi, 8
                    624:     xor     %3d, edi
                    625:     movzx   esi, bl
                    626:     movzx   edi, bh
                    627:     movzx   esi, t_ref(i,rsi)
                    628:     movzx   edi, t_ref(i,rdi)
                    629:     rol     esi, 16
                    630:     rol     edi, 24
                    631:     xor     %4d, esi
                    632:     xor     %1d, edi
                    633: 
                    634:     movzx   esi, cl
                    635:     movzx   edi, ch
                    636:     movzx   esi, t_ref(i,rsi)
                    637:     movzx   edi, t_ref(i,rdi)
                    638:     shr     ecx, 16
                    639:     xor     %3d, esi
                    640:     rol     edi, 8
                    641:     xor     %4d, edi
                    642:     movzx   esi, cl
                    643:     movzx   edi, ch
                    644:     movzx   esi, t_ref(i,rsi)
                    645:     movzx   edi, t_ref(i,rdi)
                    646:     rol     esi, 16
                    647:     rol     edi, 24
                    648:     xor     %1d, esi
                    649:     xor     %2d, edi
                    650: 
                    651:     movzx   esi, dl
                    652:     movzx   edi, dh
                    653:     movzx   esi, t_ref(i,rsi)
                    654:     movzx   edi, t_ref(i,rdi)
                    655:     shr     edx, 16
                    656:     xor     %4d, esi
                    657:     rol     edi, 8
                    658:     xor     %1d, edi
                    659:     movzx   esi, dl
                    660:     movzx   edi, dh
                    661:     movzx   esi, t_ref(i,rsi)
                    662:     movzx   edi, t_ref(i,rdi)
                    663:     rol     esi, 16
                    664:     rol     edi, 24
                    665:     xor     %2d, esi
                    666:     xor     %3d, edi
                    667: %endmacro
                    668: 
                    669: %endif
                    670: 
                    671: %ifdef ENCRYPTION
                    672: 
                    673:     global  aes_encrypt
                    674: %ifdef DLL_EXPORT
                    675:     export  aes_encrypt
                    676: %endif
                    677: 
                    678:     section .data align=64
                    679:     align   64
                    680: enc_tab:
                    681:     enc_vals u8
                    682: %ifdef LAST_ROUND_TABLES
                    683:     enc_vals w8
                    684: %endif
                    685: 
                    686:     section .text align=16
                    687:     align   16
                    688: 
                    689: %ifdef _SEH_
                    690: proc_frame aes_encrypt
                    691:        alloc_stack     7*8                     ; 7 to align stack to 16 bytes
                    692:        save_reg        rsi,4*8
                    693:        save_reg        rdi,5*8
                    694:        save_reg        rbx,1*8
                    695:        save_reg        rbp,2*8
                    696:        save_reg        r12,3*8
                    697: end_prologue
                    698:     mov     rdi, rcx        ; input pointer
                    699:     mov     [rsp+0*8], rdx  ; output pointer
                    700: %else
                    701:        aes_encrypt:
                    702:        %ifdef __GNUC__
                    703:                sub     rsp, 4*8        ; gnu/linux binary interface
                    704:                mov     [rsp+0*8], rsi  ; output pointer
                    705:                mov     r8, rdx         ; context
                    706:        %else
                    707:                sub     rsp, 6*8        ; windows binary interface
                    708:                mov     [rsp+4*8], rsi
                    709:                mov     [rsp+5*8], rdi
                    710:                mov     rdi, rcx        ; input pointer
                    711:                mov     [rsp+0*8], rdx  ; output pointer
                    712:        %endif
                    713:                mov     [rsp+1*8], rbx  ; input pointer in rdi
                    714:                mov     [rsp+2*8], rbp  ; output pointer in [rsp]
                    715:                mov     [rsp+3*8], r12  ; context in r8
                    716: %endif
                    717: 
                    718:     movzx   esi, byte [kptr+4*KS_LENGTH]
                    719:     lea     tptr,[enc_tab wrt rip]
                    720:     sub     kptr, fofs
                    721: 
                    722:     mov     eax, [rdi+0*4]
                    723:     mov     ebx, [rdi+1*4]
                    724:     mov     ecx, [rdi+2*4]
                    725:     mov     edx, [rdi+3*4]
                    726: 
                    727:     xor     eax, [kptr+fofs]
                    728:     xor     ebx, [kptr+fofs+4]
                    729:     xor     ecx, [kptr+fofs+8]
                    730:     xor     edx, [kptr+fofs+12]
                    731: 
                    732:     lea     kptr,[kptr+rsi]
                    733:     cmp     esi, 10*16
                    734:     je      .3
                    735:     cmp     esi, 12*16
                    736:     je      .2
                    737:     cmp     esi, 14*16
                    738:     je      .1
                    739:     mov     rax, -1
                    740:     jmp     .4
                    741: 
                    742: .1: ff_rnd  r9, r10, r11, r12, 13
                    743:     ff_rnd  r9, r10, r11, r12, 12
                    744: .2: ff_rnd  r9, r10, r11, r12, 11
                    745:     ff_rnd  r9, r10, r11, r12, 10
                    746: .3: ff_rnd  r9, r10, r11, r12, 9
                    747:     ff_rnd  r9, r10, r11, r12, 8
                    748:     ff_rnd  r9, r10, r11, r12, 7
                    749:     ff_rnd  r9, r10, r11, r12, 6
                    750:     ff_rnd  r9, r10, r11, r12, 5
                    751:     ff_rnd  r9, r10, r11, r12, 4
                    752:     ff_rnd  r9, r10, r11, r12, 3
                    753:     ff_rnd  r9, r10, r11, r12, 2
                    754:     ff_rnd  r9, r10, r11, r12, 1
                    755:     fl_rnd  r9, r10, r11, r12, 0
                    756: 
                    757:     mov     rbx, [rsp]
                    758:     mov     [rbx], r9d
                    759:     mov     [rbx+4], r10d
                    760:     mov     [rbx+8], r11d
                    761:     mov     [rbx+12], r12d
                    762:     xor     rax, rax
                    763: .4:
                    764:     mov     rbx, [rsp+1*8]
                    765:     mov     rbp, [rsp+2*8]
                    766:     mov     r12, [rsp+3*8]
                    767: %ifdef __GNUC__
                    768:     add     rsp, 4*8
                    769:     ret
                    770: %else
                    771:                mov     rsi, [rsp+4*8]
                    772:                mov     rdi, [rsp+5*8]
                    773:        %ifdef _SEH_
                    774:                add     rsp, 7*8
                    775:                ret
                    776:        endproc_frame
                    777:        %else
                    778:                add     rsp, 6*8
                    779:                ret
                    780:        %endif
                    781: %endif
                    782: 
                    783: %endif
                    784: 
                    785: %ifdef DECRYPTION
                    786: 
                    787:     global  aes_decrypt
                    788: %ifdef DLL_EXPORT
                    789:     export  aes_decrypt
                    790: %endif
                    791: 
                    792:     section .data
                    793:     align   64
                    794: dec_tab:
                    795:     dec_vals v8
                    796: %ifdef LAST_ROUND_TABLES
                    797:     dec_vals w8
                    798: %endif
                    799: 
                    800:     section .text
                    801:     align   16
                    802: 
                    803: %ifdef _SEH_
                    804: proc_frame aes_decrypt
                    805:        alloc_stack     7*8                     ; 7 to align stack to 16 bytes
                    806:        save_reg        rsi,4*8
                    807:        save_reg        rdi,5*8
                    808:        save_reg        rbx,1*8
                    809:        save_reg        rbp,2*8
                    810:        save_reg        r12,3*8
                    811: end_prologue
                    812:     mov     rdi, rcx        ; input pointer
                    813:     mov     [rsp+0*8], rdx  ; output pointer
                    814: %else
                    815:        aes_decrypt:
                    816:        %ifdef __GNUC__
                    817:                sub     rsp, 4*8        ; gnu/linux binary interface
                    818:                mov     [rsp+0*8], rsi  ; output pointer
                    819:                mov     r8, rdx         ; context
                    820:        %else
                    821:                sub     rsp, 6*8        ; windows binary interface
                    822:                mov     [rsp+4*8], rsi
                    823:                mov     [rsp+5*8], rdi
                    824:                mov     rdi, rcx        ; input pointer
                    825:                mov     [rsp+0*8], rdx  ; output pointer
                    826:        %endif
                    827:                mov     [rsp+1*8], rbx  ; input pointer in rdi
                    828:                mov     [rsp+2*8], rbp  ; output pointer in [rsp]
                    829:                mov     [rsp+3*8], r12  ; context in r8
                    830: %endif
                    831: 
                    832:     movzx   esi,byte[kptr+4*KS_LENGTH]
                    833:     lea     tptr,[dec_tab wrt rip]
                    834:     sub     kptr, rofs
                    835: 
                    836:     mov     eax, [rdi+0*4]
                    837:     mov     ebx, [rdi+1*4]
                    838:     mov     ecx, [rdi+2*4]
                    839:     mov     edx, [rdi+3*4]
                    840: 
                    841: %ifdef      AES_REV_DKS
                    842:     mov     rdi, kptr
                    843:     lea     kptr,[kptr+rsi]
                    844: %else
                    845:     lea     rdi,[kptr+rsi]
                    846: %endif
                    847: 
                    848:     xor     eax, [rdi+rofs]
                    849:     xor     ebx, [rdi+rofs+4]
                    850:     xor     ecx, [rdi+rofs+8]
                    851:     xor     edx, [rdi+rofs+12]
                    852: 
                    853:     cmp     esi, 10*16
                    854:     je      .3
                    855:     cmp     esi, 12*16
                    856:     je      .2
                    857:     cmp     esi, 14*16
                    858:     je      .1
                    859:     mov     rax, -1
                    860:     jmp     .4
                    861: 
                    862: .1: ii_rnd  r9, r10, r11, r12, 13
                    863:     ii_rnd  r9, r10, r11, r12, 12
                    864: .2: ii_rnd  r9, r10, r11, r12, 11
                    865:     ii_rnd  r9, r10, r11, r12, 10
                    866: .3: ii_rnd  r9, r10, r11, r12, 9
                    867:     ii_rnd  r9, r10, r11, r12, 8
                    868:     ii_rnd  r9, r10, r11, r12, 7
                    869:     ii_rnd  r9, r10, r11, r12, 6
                    870:     ii_rnd  r9, r10, r11, r12, 5
                    871:     ii_rnd  r9, r10, r11, r12, 4
                    872:     ii_rnd  r9, r10, r11, r12, 3
                    873:     ii_rnd  r9, r10, r11, r12, 2
                    874:     ii_rnd  r9, r10, r11, r12, 1
                    875:     il_rnd  r9, r10, r11, r12, 0
                    876: 
                    877:     mov     rbx, [rsp]
                    878:     mov     [rbx], r9d
                    879:     mov     [rbx+4], r10d
                    880:     mov     [rbx+8], r11d
                    881:     mov     [rbx+12], r12d
                    882:     xor     rax, rax
                    883: .4: mov     rbx, [rsp+1*8]
                    884:     mov     rbp, [rsp+2*8]
                    885:     mov     r12, [rsp+3*8]
                    886: %ifdef __GNUC__
                    887:     add     rsp, 4*8
                    888:     ret
                    889: %else
                    890:                mov     rsi, [rsp+4*8]
                    891:                mov     rdi, [rsp+5*8]
                    892:        %ifdef _SEH_
                    893:                add     rsp, 7*8
                    894:                ret
                    895:        endproc_frame
                    896:        %else
                    897:                add     rsp, 6*8
                    898:                ret
                    899:        %endif
                    900: %endif
                    901: 
                    902: %endif
                    903: 
                    904:     end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.