Annotation of truecrypt/crypto/aes_x64.asm, revision 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.