Annotation of truecrypt/crypto/aesopt.h, revision 1.1

1.1     ! root        1: /*
        !             2:  ---------------------------------------------------------------------------
        !             3:  Copyright (c) 2003, Dr Brian Gladman, Worcester, UK.   All rights reserved.
        !             4: 
        !             5:  LICENSE TERMS
        !             6: 
        !             7:  The free distribution and use of this software in both source and binary
        !             8:  form is allowed (with or without changes) provided that:
        !             9: 
        !            10:    1. distributions of this source code include the above copyright
        !            11:       notice, this list of conditions and the following disclaimer;
        !            12: 
        !            13:    2. distributions in binary form include the above copyright
        !            14:       notice, this list of conditions and the following disclaimer
        !            15:       in the documentation and/or other associated materials;
        !            16: 
        !            17:    3. the copyright holder's name is not used to endorse products
        !            18:       built using this software without specific written permission.
        !            19: 
        !            20:  ALTERNATIVELY, provided that this notice is retained in full, this product
        !            21:  may be distributed under the terms of the GNU General Public License (GPL),
        !            22:  in which case the provisions of the GPL apply INSTEAD OF those given above.
        !            23: 
        !            24:  DISCLAIMER
        !            25: 
        !            26:  This software is provided 'as is' with no explicit or implied warranties
        !            27:  in respect of its properties, including, but not limited to, correctness
        !            28:  and/or fitness for purpose.
        !            29:  ---------------------------------------------------------------------------
        !            30:  Issue 28/01/2004
        !            31: 
        !            32:  My thanks go to Dag Arne Osvik for devising the schemes used here for key
        !            33:  length derivation from the form of the key schedule
        !            34: 
        !            35:  This file contains the compilation options for AES (Rijndael) and code
        !            36:  that is common across encryption, key scheduling and table generation.
        !            37: 
        !            38:  OPERATION
        !            39: 
        !            40:  These source code files implement the AES algorithm Rijndael designed by
        !            41:  Joan Daemen and Vincent Rijmen. This version is designed for the standard
        !            42:  block size of 16 bytes and for key sizes of 128, 192 and 256 bits (16, 24
        !            43:  and 32 bytes).
        !            44: 
        !            45:  This version is designed for flexibility and speed using operations on
        !            46:  32-bit words rather than operations on bytes.  It can be compiled with
        !            47:  either big or little endian internal byte order but is faster when the
        !            48:  native byte order for the processor is used.
        !            49: 
        !            50:  THE CIPHER INTERFACE
        !            51: 
        !            52:  The cipher interface is implemented as an array of bytes in which lower
        !            53:  AES bit sequence indexes map to higher numeric significance within bytes.
        !            54: 
        !            55:   aes_08t                 (an unsigned  8-bit type)
        !            56:   aes_32t                 (an unsigned 32-bit type)
        !            57:   struct aes_encrypt_ctx  (structure for the cipher encryption context)
        !            58:   struct aes_decrypt_ctx  (structure for the cipher decryption context)
        !            59:   aes_rval                the function return type
        !            60: 
        !            61:   C subroutine calls:
        !            62: 
        !            63:   aes_rval aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]);
        !            64:   aes_rval aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]);
        !            65:   aes_rval aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]);
        !            66:   aes_rval aes_encrypt(const unsigned char *in, unsigned char *out,
        !            67:                                                   const aes_encrypt_ctx cx[1]);
        !            68: 
        !            69:   aes_rval aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]);
        !            70:   aes_rval aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]);
        !            71:   aes_rval aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]);
        !            72:   aes_rval aes_decrypt(const unsigned char *in, unsigned char *out,
        !            73:                                                   const aes_decrypt_ctx cx[1]);
        !            74: 
        !            75:  IMPORTANT NOTE: If you are using this C interface with dynamic tables make sure that
        !            76:  you call genTabs() before AES is used so that the tables are initialised.
        !            77: 
        !            78:  C++ aes class subroutines:
        !            79: 
        !            80:      Class AESencrypt  for encryption
        !            81: 
        !            82:       Construtors:
        !            83:           AESencrypt(void)
        !            84:           AESencrypt(const unsigned char *key) - 128 bit key
        !            85:       Members:
        !            86:           aes_rval key128(const unsigned char *key)
        !            87:           aes_rval key192(const unsigned char *key)
        !            88:           aes_rval key256(const unsigned char *key)
        !            89:           aes_rval encrypt(const unsigned char *in, unsigned char *out) const
        !            90: 
        !            91:       Class AESdecrypt  for encryption
        !            92:       Construtors:
        !            93:           AESdecrypt(void)
        !            94:           AESdecrypt(const unsigned char *key) - 128 bit key
        !            95:       Members:
        !            96:           aes_rval key128(const unsigned char *key)
        !            97:           aes_rval key192(const unsigned char *key)
        !            98:           aes_rval key256(const unsigned char *key)
        !            99:           aes_rval decrypt(const unsigned char *in, unsigned char *out) const
        !           100: 
        !           101:     COMPILATION
        !           102: 
        !           103:     The files used to provide AES (Rijndael) are
        !           104: 
        !           105:     a. aes.h for the definitions needed for use in C.
        !           106:     b. aescpp.h for the definitions needed for use in C++.
        !           107:     c. aesopt.h for setting compilation options (also includes common code).
        !           108:     d. aescrypt.c for encryption and decrytpion, or
        !           109:     e. aeskey.c for key scheduling.
        !           110:     f. aestab.c for table loading or generation.
        !           111:     g. aescrypt.asm for encryption and decryption using assembler code.
        !           112:     h. aescrypt.mmx.asm for encryption and decryption using MMX assembler.
        !           113: 
        !           114:     To compile AES (Rijndael) for use in C code use aes.h and set the
        !           115:     defines here for the facilities you need (key lengths, encryption
        !           116:     and/or decryption). Do not define AES_DLL or AES_CPP.  Set the options
        !           117:     for optimisations and table sizes here.
        !           118: 
        !           119:     To compile AES (Rijndael) for use in in C++ code use aescpp.h but do
        !           120:     not define AES_DLL
        !           121: 
        !           122:     To compile AES (Rijndael) in C as a Dynamic Link Library DLL) use
        !           123:     aes.h and include the AES_DLL define.
        !           124: 
        !           125:     CONFIGURATION OPTIONS (here and in aes.h)
        !           126: 
        !           127:     a. set AES_DLL in aes.h if AES (Rijndael) is to be compiled as a DLL
        !           128:     b. You may need to set PLATFORM_BYTE_ORDER to define the byte order.
        !           129:     c. If you want the code to run in a specific internal byte order, then
        !           130:        ALGORITHM_BYTE_ORDER must be set accordingly.
        !           131:     d. set other configuration options decribed below.
        !           132: */
        !           133: 
        !           134: #if !defined( _AESOPT_H )
        !           135: #define _AESOPT_H
        !           136: 
        !           137: #include "aes.h"
        !           138: 
        !           139: /*  CONFIGURATION - USE OF DEFINES
        !           140: 
        !           141:     Later in this section there are a number of defines that control the
        !           142:     operation of the code.  In each section, the purpose of each define is
        !           143:     explained so that the relevant form can be included or excluded by
        !           144:     setting either 1's or 0's respectively on the branches of the related
        !           145:     #if clauses.
        !           146: 
        !           147:     PLATFORM SPECIFIC INCLUDES AND BYTE ORDER IN 32-BIT WORDS
        !           148: 
        !           149:     To obtain the highest speed on processors with 32-bit words, this code
        !           150:     needs to determine the byte order of the target machine. The following
        !           151:     block of code is an attempt to capture the most obvious ways in which
        !           152:     various environemnts define byte order. It may well fail, in which case
        !           153:     the definitions will need to be set by editing at the points marked
        !           154:     **** EDIT HERE IF NECESSARY **** below.  My thanks go to Peter Gutmann
        !           155:     for his assistance with this endian detection nightmare.
        !           156: */
        !           157: 
        !           158: #define BRG_LITTLE_ENDIAN   1234 /* byte 0 is least significant (i386) */
        !           159: #define BRG_BIG_ENDIAN      4321 /* byte 0 is most significant (mc68k) */
        !           160: 
        !           161: #if defined(__GNUC__) || defined(__GNU_LIBRARY__)
        !           162: #  if defined(__FreeBSD__) || defined(__OpenBSD__)
        !           163: #    include <sys/endian.h>
        !           164: #  elif defined( BSD ) && BSD >= 199103
        !           165: #      include <machine/endian.h>
        !           166: #  elif defined(__APPLE__)
        !           167: #    if defined(__BIG_ENDIAN__) && !defined( BIG_ENDIAN )
        !           168: #      define BIG_ENDIAN
        !           169: #    elif defined(__LITTLE_ENDIAN__) && !defined( LITTLE_ENDIAN )
        !           170: #      define LITTLE_ENDIAN
        !           171: #    endif
        !           172: #  else
        !           173: #    include <endian.h>
        !           174: #    if defined(__BEOS__)
        !           175: #      include <byteswap.h>
        !           176: #    endif
        !           177: #  endif
        !           178: #endif
        !           179: 
        !           180: #if !defined(PLATFORM_BYTE_ORDER)
        !           181: #  if defined(LITTLE_ENDIAN) || defined(BIG_ENDIAN)
        !           182: #    if    defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
        !           183: #      define PLATFORM_BYTE_ORDER BRG_LITTLE_ENDIAN
        !           184: #    elif !defined(LITTLE_ENDIAN) &&  defined(BIG_ENDIAN)
        !           185: #      define PLATFORM_BYTE_ORDER BRG_BIG_ENDIAN
        !           186: #    elif defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN)
        !           187: #      define PLATFORM_BYTE_ORDER BRG_LITTLE_ENDIAN
        !           188: #    elif defined(BYTE_ORDER) && (BYTE_ORDER == BIG_ENDIAN)
        !           189: #      define PLATFORM_BYTE_ORDER BRG_BIG_ENDIAN
        !           190: #    endif
        !           191: #  elif defined(_LITTLE_ENDIAN) || defined(_BIG_ENDIAN)
        !           192: #    if    defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
        !           193: #      define PLATFORM_BYTE_ORDER BRG_LITTLE_ENDIAN
        !           194: #    elif !defined(_LITTLE_ENDIAN) &&  defined(_BIG_ENDIAN)
        !           195: #      define PLATFORM_BYTE_ORDER BRG_BIG_ENDIAN
        !           196: #    elif defined(_BYTE_ORDER) && (_BYTE_ORDER == _LITTLE_ENDIAN)
        !           197: #      define PLATFORM_BYTE_ORDER BRG_LITTLE_ENDIAN
        !           198: #    elif defined(_BYTE_ORDER) && (_BYTE_ORDER == _BIG_ENDIAN)
        !           199: #      define PLATFORM_BYTE_ORDER BRG_BIG_ENDIAN
        !           200: #   endif
        !           201: #  elif defined(__LITTLE_ENDIAN__) || defined(__BIG_ENDIAN__)
        !           202: #    if    defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
        !           203: #      define PLATFORM_BYTE_ORDER BRG_LITTLE_ENDIAN
        !           204: #    elif !defined(__LITTLE_ENDIAN__) &&  defined(__BIG_ENDIAN__)
        !           205: #      define PLATFORM_BYTE_ORDER BRG_BIG_ENDIAN
        !           206: #    elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __LITTLE_ENDIAN__)
        !           207: #      define PLATFORM_BYTE_ORDER BRG_LITTLE_ENDIAN
        !           208: #    elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __BIG_ENDIAN__)
        !           209: #      define PLATFORM_BYTE_ORDER BRG_BIG_ENDIAN
        !           210: #    endif
        !           211: #  endif
        !           212: #endif
        !           213: 
        !           214: /*  if the platform is still unknown, try to find its byte order    */
        !           215: /*  from commonly used machine defines                              */
        !           216: 
        !           217: #if !defined(PLATFORM_BYTE_ORDER)
        !           218: 
        !           219: #if   defined( __alpha__ ) || defined( __alpha ) || defined( i386 )       || \
        !           220:       defined( __i386__ )  || defined( _M_I86 )  || defined( _M_IX86 )    || \
        !           221:       defined( __OS2__ )   || defined( sun386 )  || defined( __TURBOC__ ) || \
        !           222:       defined( vax )       || defined( vms )     || defined( VMS )        || \
        !           223:       defined( __VMS )
        !           224: #  define PLATFORM_BYTE_ORDER BRG_LITTLE_ENDIAN
        !           225: 
        !           226: #elif defined( AMIGA )    || defined( applec )  || defined( __AS400__ )  || \
        !           227:       defined( _CRAY )    || defined( __hppa )  || defined( __hp9000 )   || \
        !           228:       defined( ibm370 )   || defined( mc68000 ) || defined( m68k )       || \
        !           229:       defined( __MRC__ )  || defined( __MVS__ ) || defined( __MWERKS__ ) || \
        !           230:       defined( sparc )    || defined( __sparc)  || defined( SYMANTEC_C ) || \
        !           231:       defined( __TANDEM ) || defined( THINK_C ) || defined( __VMCMS__ )
        !           232: #  define PLATFORM_BYTE_ORDER BRG_BIG_ENDIAN
        !           233: 
        !           234: #elif 0     /* **** EDIT HERE IF NECESSARY **** */
        !           235: #  define PLATFORM_BYTE_ORDER BRG_LITTLE_ENDIAN
        !           236: #elif 0     /* **** EDIT HERE IF NECESSARY **** */
        !           237: #  define PLATFORM_BYTE_ORDER BRG_BIG_ENDIAN
        !           238: #else
        !           239: #  error Please edit aesopt.h (line 234 or 236) to set the platform byte order
        !           240: #endif
        !           241: 
        !           242: #endif
        !           243: 
        !           244: /*  SOME LOCAL DEFINITIONS  */
        !           245: 
        !           246: #define NO_TABLES              0
        !           247: #define ONE_TABLE              1
        !           248: #define FOUR_TABLES            4
        !           249: #define NONE                   0
        !           250: #define PARTIAL                1
        !           251: #define FULL                   2
        !           252: 
        !           253: #if defined(bswap32)
        !           254: #define aes_sw32    bswap32
        !           255: #elif defined(bswap_32)
        !           256: #define aes_sw32    bswap_32
        !           257: #else
        !           258: #define brot(x,n)   (((aes_32t)(x) <<  n) | ((aes_32t)(x) >> (32 - n)))
        !           259: #define aes_sw32(x) ((brot((x),8) & 0x00ff00ff) | (brot((x),24) & 0xff00ff00))
        !           260: #endif
        !           261: 
        !           262: /*  1. FUNCTIONS REQUIRED
        !           263: 
        !           264:     This implementation provides subroutines for encryption, decryption
        !           265:     and for setting the three key lengths (separately) for encryption
        !           266:     and decryption. When the assembler code is not being used the following
        !           267:     definition blocks allow the selection of the routines that are to be
        !           268:     included in the compilation.
        !           269: */
        !           270: #if defined( AES_ENCRYPT )
        !           271: #define ENCRYPTION
        !           272: #define ENCRYPTION_KEY_SCHEDULE
        !           273: #endif
        !           274: 
        !           275: #if defined( AES_DECRYPT )
        !           276: #define DECRYPTION
        !           277: #define DECRYPTION_KEY_SCHEDULE
        !           278: #endif
        !           279: 
        !           280: /*  2. ASSEMBLER SUPPORT
        !           281: 
        !           282:     This define (which can be on the command line) enables the use of the
        !           283:     assembler code routines for encryption and decryption with the C code
        !           284:     only providing key scheduling
        !           285: */
        !           286: #if 0 && !defined(AES_ASM)
        !           287: #define AES_ASM
        !           288: #endif
        !           289: 
        !           290: /*  3. BYTE ORDER WITHIN 32 BIT WORDS
        !           291: 
        !           292:     The fundamental data processing units in Rijndael are 8-bit bytes. The
        !           293:     input, output and key input are all enumerated arrays of bytes in which
        !           294:     bytes are numbered starting at zero and increasing to one less than the
        !           295:     number of bytes in the array in question. This enumeration is only used
        !           296:     for naming bytes and does not imply any adjacency or order relationship
        !           297:     from one byte to another. When these inputs and outputs are considered
        !           298:     as bit sequences, bits 8*n to 8*n+7 of the bit sequence are mapped to
        !           299:     byte[n] with bit 8n+i in the sequence mapped to bit 7-i within the byte.
        !           300:     In this implementation bits are numbered from 0 to 7 starting at the
        !           301:     numerically least significant end of each byte (bit n represents 2^n).
        !           302: 
        !           303:     However, Rijndael can be implemented more efficiently using 32-bit
        !           304:     words by packing bytes into words so that bytes 4*n to 4*n+3 are placed
        !           305:     into word[n]. While in principle these bytes can be assembled into words
        !           306:     in any positions, this implementation only supports the two formats in
        !           307:     which bytes in adjacent positions within words also have adjacent byte
        !           308:     numbers. This order is called big-endian if the lowest numbered bytes
        !           309:     in words have the highest numeric significance and little-endian if the
        !           310:     opposite applies.
        !           311: 
        !           312:     This code can work in either order irrespective of the order used by the
        !           313:     machine on which it runs. Normally the internal byte order will be set
        !           314:     to the order of the processor on which the code is to be run but this
        !           315:     define can be used to reverse this in special situations
        !           316: 
        !           317:     NOTE: Assembler code versions rely on PLATFORM_BYTE_ORDER being set
        !           318: */
        !           319: #if 1 || defined(AES_ASM)
        !           320: #define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER
        !           321: #elif 0
        !           322: #define ALGORITHM_BYTE_ORDER BRG_LITTLE_ENDIAN
        !           323: #elif 0
        !           324: #define ALGORITHM_BYTE_ORDER BRG_BIG_ENDIAN
        !           325: #else
        !           326: #error The algorithm byte order is not defined
        !           327: #endif
        !           328: 
        !           329: /*  4. FAST INPUT/OUTPUT OPERATIONS.
        !           330: 
        !           331:     On some machines it is possible to improve speed by transferring the
        !           332:     bytes in the input and output arrays to and from the internal 32-bit
        !           333:     variables by addressing these arrays as if they are arrays of 32-bit
        !           334:     words.  On some machines this will always be possible but there may
        !           335:     be a large performance penalty if the byte arrays are not aligned on
        !           336:     the normal word boundaries. On other machines this technique will
        !           337:     lead to memory access errors when such 32-bit word accesses are not
        !           338:     properly aligned. The option SAFE_IO avoids such problems but will
        !           339:     often be slower on those machines that support misaligned access
        !           340:     (especially so if care is taken to align the input  and output byte
        !           341:     arrays on 32-bit word boundaries). If SAFE_IO is not defined it is
        !           342:     assumed that access to byte arrays as if they are arrays of 32-bit
        !           343:     words will not cause problems when such accesses are misaligned.
        !           344: */
        !           345: #if 1 && !defined(_MSC_VER)
        !           346: #define SAFE_IO
        !           347: #endif
        !           348: 
        !           349: /*  5. LOOP UNROLLING
        !           350: 
        !           351:     The code for encryption and decrytpion cycles through a number of rounds
        !           352:     that can be implemented either in a loop or by expanding the code into a
        !           353:     long sequence of instructions, the latter producing a larger program but
        !           354:     one that will often be much faster. The latter is called loop unrolling.
        !           355:     There are also potential speed advantages in expanding two iterations in
        !           356:     a loop with half the number of iterations, which is called partial loop
        !           357:     unrolling.  The following options allow partial or full loop unrolling
        !           358:     to be set independently for encryption and decryption
        !           359: */
        !           360: #if 1
        !           361: #define ENC_UNROLL  FULL
        !           362: #elif 0
        !           363: #define ENC_UNROLL  PARTIAL
        !           364: #else
        !           365: #define ENC_UNROLL  NONE
        !           366: #endif
        !           367: 
        !           368: #if 1
        !           369: #define DEC_UNROLL  FULL
        !           370: #elif 0
        !           371: #define DEC_UNROLL  PARTIAL
        !           372: #else
        !           373: #define DEC_UNROLL  NONE
        !           374: #endif
        !           375: 
        !           376: /*  6. FAST FINITE FIELD OPERATIONS
        !           377: 
        !           378:     If this section is included, tables are used to provide faster finite
        !           379:     field arithmetic (this has no effect if FIXED_TABLES is defined).
        !           380: */
        !           381: #if 1
        !           382: #define FF_TABLES
        !           383: #endif
        !           384: 
        !           385: /*  7. INTERNAL STATE VARIABLE FORMAT
        !           386: 
        !           387:     The internal state of Rijndael is stored in a number of local 32-bit
        !           388:     word varaibles which can be defined either as an array or as individual
        !           389:     names variables. Include this section if you want to store these local
        !           390:     varaibles in arrays. Otherwise individual local variables will be used.
        !           391: */
        !           392: #if 1
        !           393: #define ARRAYS
        !           394: #endif
        !           395: 
        !           396: /* In this implementation the columns of the state array are each held in
        !           397:    32-bit words. The state array can be held in various ways: in an array
        !           398:    of words, in a number of individual word variables or in a number of
        !           399:    processor registers. The following define maps a variable name x and
        !           400:    a column number c to the way the state array variable is to be held.
        !           401:    The first define below maps the state into an array x[c] whereas the
        !           402:    second form maps the state into a number of individual variables x0,
        !           403:    x1, etc.  Another form could map individual state colums to machine
        !           404:    register names.
        !           405: */
        !           406: 
        !           407: #if defined(ARRAYS)
        !           408: #define s(x,c) x[c]
        !           409: #else
        !           410: #define s(x,c) x##c
        !           411: #endif
        !           412: 
        !           413: /*  8. FIXED OR DYNAMIC TABLES
        !           414: 
        !           415:     When this section is included the tables used by the code are compiled
        !           416:     statically into the binary file.  Otherwise the subroutine gen_tabs()
        !           417:     must be called to compute them before the code is first used.
        !           418: */
        !           419: #if 1
        !           420: #define FIXED_TABLES
        !           421: #endif
        !           422: 
        !           423: /*  9. TABLE ALIGNMENT
        !           424: 
        !           425:     On some sytsems speed will be improved by aligning the AES large lookup
        !           426:     tables on particular boundaries. This define should be set to a power of
        !           427:     two giving the desired alignment. It can be left undefined if alignment
        !           428:     is not needed.  This option is specific to the Microsft VC++ compiler -
        !           429:     it seems to sometimes cause trouble for the VC++ version 6 compiler.
        !           430: */
        !           431: 
        !           432: #if 0 && defined(_MSC_VER) && (_MSC_VER >= 1300)
        !           433: #define TABLE_ALIGN 64
        !           434: #endif
        !           435: 
        !           436: /*  10. INTERNAL TABLE CONFIGURATION
        !           437: 
        !           438:     This cipher proceeds by repeating in a number of cycles known as 'rounds'
        !           439:     which are implemented by a round function which can optionally be speeded
        !           440:     up using tables.  The basic tables are each 256 32-bit words, with either
        !           441:     one or four tables being required for each round function depending on
        !           442:     how much speed is required. The encryption and decryption round functions
        !           443:     are different and the last encryption and decrytpion round functions are
        !           444:     different again making four different round functions in all.
        !           445: 
        !           446:     This means that:
        !           447:       1. Normal encryption and decryption rounds can each use either 0, 1
        !           448:          or 4 tables and table spaces of 0, 1024 or 4096 bytes each.
        !           449:       2. The last encryption and decryption rounds can also use either 0, 1
        !           450:          or 4 tables and table spaces of 0, 1024 or 4096 bytes each.
        !           451: 
        !           452:     Include or exclude the appropriate definitions below to set the number
        !           453:     of tables used by this implementation.
        !           454: */
        !           455: 
        !           456: #if 1   /* set tables for the normal encryption round */
        !           457: #define ENC_ROUND   FOUR_TABLES
        !           458: #elif 0
        !           459: #define ENC_ROUND   ONE_TABLE
        !           460: #else
        !           461: #define ENC_ROUND   NO_TABLES
        !           462: #endif
        !           463: 
        !           464: #if 1   /* set tables for the last encryption round */
        !           465: #define LAST_ENC_ROUND  FOUR_TABLES
        !           466: #elif 0
        !           467: #define LAST_ENC_ROUND  ONE_TABLE
        !           468: #else
        !           469: #define LAST_ENC_ROUND  NO_TABLES
        !           470: #endif
        !           471: 
        !           472: #if 1   /* set tables for the normal decryption round */
        !           473: #define DEC_ROUND   FOUR_TABLES
        !           474: #elif 0
        !           475: #define DEC_ROUND   ONE_TABLE
        !           476: #else
        !           477: #define DEC_ROUND   NO_TABLES
        !           478: #endif
        !           479: 
        !           480: #if 1   /* set tables for the last decryption round */
        !           481: #define LAST_DEC_ROUND  FOUR_TABLES
        !           482: #elif 0
        !           483: #define LAST_DEC_ROUND  ONE_TABLE
        !           484: #else
        !           485: #define LAST_DEC_ROUND  NO_TABLES
        !           486: #endif
        !           487: 
        !           488: /*  The decryption key schedule can be speeded up with tables in the same
        !           489:     way that the round functions can.  Include or exclude the following
        !           490:     defines to set this requirement.
        !           491: */
        !           492: #if 1
        !           493: #define KEY_SCHED   FOUR_TABLES
        !           494: #elif 0
        !           495: #define KEY_SCHED   ONE_TABLE
        !           496: #else
        !           497: #define KEY_SCHED   NO_TABLES
        !           498: #endif
        !           499: 
        !           500: /* END OF CONFIGURATION OPTIONS */
        !           501: 
        !           502: #define RC_LENGTH   (5 * (AES_BLOCK_SIZE / 4 - 2))
        !           503: 
        !           504: /* Disable or report errors on some combinations of options */
        !           505: 
        !           506: #if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES
        !           507: #undef  LAST_ENC_ROUND
        !           508: #define LAST_ENC_ROUND  NO_TABLES
        !           509: #elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES
        !           510: #undef  LAST_ENC_ROUND
        !           511: #define LAST_ENC_ROUND  ONE_TABLE
        !           512: #endif
        !           513: 
        !           514: #if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE
        !           515: #undef  ENC_UNROLL
        !           516: #define ENC_UNROLL  NONE
        !           517: #endif
        !           518: 
        !           519: #if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES
        !           520: #undef  LAST_DEC_ROUND
        !           521: #define LAST_DEC_ROUND  NO_TABLES
        !           522: #elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES
        !           523: #undef  LAST_DEC_ROUND
        !           524: #define LAST_DEC_ROUND  ONE_TABLE
        !           525: #endif
        !           526: 
        !           527: #if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE
        !           528: #undef  DEC_UNROLL
        !           529: #define DEC_UNROLL  NONE
        !           530: #endif
        !           531: 
        !           532: /*  upr(x,n):  rotates bytes within words by n positions, moving bytes to
        !           533:                higher index positions with wrap around into low positions
        !           534:     ups(x,n):  moves bytes by n positions to higher index positions in
        !           535:                words but without wrap around
        !           536:     bval(x,n): extracts a byte from a word
        !           537: 
        !           538:     NOTE:      The definitions given here are intended only for use with
        !           539:                unsigned variables and with shift counts that are compile
        !           540:                time constants
        !           541: */
        !           542: 
        !           543: #if (ALGORITHM_BYTE_ORDER == BRG_LITTLE_ENDIAN)
        !           544: #define upr(x,n)        (((aes_32t)(x) << (8 * (n))) | ((aes_32t)(x) >> (32 - 8 * (n))))
        !           545: #define ups(x,n)        ((aes_32t) (x) << (8 * (n)))
        !           546: #define bval(x,n)       ((aes_08t)((x) >> (8 * (n))))
        !           547: #define bytes2word(b0, b1, b2, b3)  \
        !           548:         (((aes_32t)(b3) << 24) | ((aes_32t)(b2) << 16) | ((aes_32t)(b1) << 8) | (b0))
        !           549: #endif
        !           550: 
        !           551: #if (ALGORITHM_BYTE_ORDER == BRG_BIG_ENDIAN)
        !           552: #define upr(x,n)        (((aes_32t)(x) >> (8 * (n))) | ((aes_32t)(x) << (32 - 8 * (n))))
        !           553: #define ups(x,n)        ((aes_32t) (x) >> (8 * (n))))
        !           554: #define bval(x,n)       ((aes_08t)((x) >> (24 - 8 * (n))))
        !           555: #define bytes2word(b0, b1, b2, b3)  \
        !           556:         (((aes_32t)(b0) << 24) | ((aes_32t)(b1) << 16) | ((aes_32t)(b2) << 8) | (b3))
        !           557: #endif
        !           558: 
        !           559: #if defined(SAFE_IO)
        !           560: 
        !           561: #define word_in(x,c)    bytes2word(((aes_08t*)(x)+4*c)[0], ((aes_08t*)(x)+4*c)[1], \
        !           562:                                    ((aes_08t*)(x)+4*c)[2], ((aes_08t*)(x)+4*c)[3])
        !           563: #define word_out(x,c,v) { ((aes_08t*)(x)+4*c)[0] = bval(v,0); ((aes_08t*)(x)+4*c)[1] = bval(v,1); \
        !           564:                           ((aes_08t*)(x)+4*c)[2] = bval(v,2); ((aes_08t*)(x)+4*c)[3] = bval(v,3); }
        !           565: 
        !           566: #elif (ALGORITHM_BYTE_ORDER == PLATFORM_BYTE_ORDER)
        !           567: 
        !           568: #define word_in(x,c)    (*((aes_32t*)(x)+(c)))
        !           569: #define word_out(x,c,v) (*((aes_32t*)(x)+(c)) = (v))
        !           570: 
        !           571: #else
        !           572: 
        !           573: #define word_in(x,c)    aes_sw32(*((aes_32t*)(x)+(c)))
        !           574: #define word_out(x,c,v) (*((aes_32t*)(x)+(c)) = aes_sw32(v))
        !           575: 
        !           576: #endif
        !           577: 
        !           578: /* the finite field modular polynomial and elements */
        !           579: 
        !           580: #define WPOLY   0x011b
        !           581: #define BPOLY     0x1b
        !           582: 
        !           583: /* multiply four bytes in GF(2^8) by 'x' {02} in parallel */
        !           584: 
        !           585: #define m1  0x80808080
        !           586: #define m2  0x7f7f7f7f
        !           587: #define gf_mulx(x)  ((((x) & m2) << 1) ^ ((((x) & m1) >> 7) * BPOLY))
        !           588: 
        !           589: /* The following defines provide alternative definitions of gf_mulx that might
        !           590:    give improved performance if a fast 32-bit multiply is not available. Note
        !           591:    that a temporary variable u needs to be defined where gf_mulx is used.
        !           592: 
        !           593: #define gf_mulx(x) (u = (x) & m1, u |= (u >> 1), ((x) & m2) << 1) ^ ((u >> 3) | (u >> 6))
        !           594: #define m4  (0x01010101 * BPOLY)
        !           595: #define gf_mulx(x) (u = (x) & m1, ((x) & m2) << 1) ^ ((u - (u >> 7)) & m4)
        !           596: */
        !           597: 
        !           598: /* Work out which tables are needed for the different options   */
        !           599: 
        !           600: #if defined( AES_ASM )
        !           601: #if defined( ENC_ROUND )
        !           602: #undef  ENC_ROUND
        !           603: #endif
        !           604: #define ENC_ROUND   FOUR_TABLES
        !           605: #if defined( LAST_ENC_ROUND )
        !           606: #undef  LAST_ENC_ROUND
        !           607: #endif
        !           608: #define LAST_ENC_ROUND  FOUR_TABLES
        !           609: #if defined( DEC_ROUND )
        !           610: #undef  DEC_ROUND
        !           611: #endif
        !           612: #define DEC_ROUND   FOUR_TABLES
        !           613: #if defined( LAST_DEC_ROUND )
        !           614: #undef  LAST_DEC_ROUND
        !           615: #endif
        !           616: #define LAST_DEC_ROUND  FOUR_TABLES
        !           617: #if defined( KEY_SCHED )
        !           618: #undef  KEY_SCHED
        !           619: #define KEY_SCHED   FOUR_TABLES
        !           620: #endif
        !           621: #endif
        !           622: 
        !           623: #if defined(ENCRYPTION) || defined(AES_ASM)
        !           624: #if ENC_ROUND == ONE_TABLE
        !           625: #define FT1_SET
        !           626: #elif ENC_ROUND == FOUR_TABLES
        !           627: #define FT4_SET
        !           628: #else
        !           629: #define SBX_SET
        !           630: #endif
        !           631: #if LAST_ENC_ROUND == ONE_TABLE
        !           632: #define FL1_SET
        !           633: #elif LAST_ENC_ROUND == FOUR_TABLES
        !           634: #define FL4_SET
        !           635: #elif !defined(SBX_SET)
        !           636: #define SBX_SET
        !           637: #endif
        !           638: #endif
        !           639: 
        !           640: #if defined(DECRYPTION) || defined(AES_ASM)
        !           641: #if DEC_ROUND == ONE_TABLE
        !           642: #define IT1_SET
        !           643: #elif DEC_ROUND == FOUR_TABLES
        !           644: #define IT4_SET
        !           645: #else
        !           646: #define ISB_SET
        !           647: #endif
        !           648: #if LAST_DEC_ROUND == ONE_TABLE
        !           649: #define IL1_SET
        !           650: #elif LAST_DEC_ROUND == FOUR_TABLES
        !           651: #define IL4_SET
        !           652: #elif !defined(ISB_SET)
        !           653: #define ISB_SET
        !           654: #endif
        !           655: #endif
        !           656: 
        !           657: #if defined(ENCRYPTION_KEY_SCHEDULE) || defined(DECRYPTION_KEY_SCHEDULE)
        !           658: #if KEY_SCHED == ONE_TABLE
        !           659: #define LS1_SET
        !           660: #define IM1_SET
        !           661: #elif KEY_SCHED == FOUR_TABLES
        !           662: #define LS4_SET
        !           663: #define IM4_SET
        !           664: #elif !defined(SBX_SET)
        !           665: #define SBX_SET
        !           666: #endif
        !           667: #endif
        !           668: 
        !           669: /* generic definitions of Rijndael macros that use tables    */
        !           670: 
        !           671: #define no_table(x,box,vf,rf,c) bytes2word( \
        !           672:     box[bval(vf(x,0,c),rf(0,c))], \
        !           673:     box[bval(vf(x,1,c),rf(1,c))], \
        !           674:     box[bval(vf(x,2,c),rf(2,c))], \
        !           675:     box[bval(vf(x,3,c),rf(3,c))])
        !           676: 
        !           677: #define one_table(x,op,tab,vf,rf,c) \
        !           678:  (     tab[bval(vf(x,0,c),rf(0,c))] \
        !           679:   ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \
        !           680:   ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \
        !           681:   ^ op(tab[bval(vf(x,3,c),rf(3,c))],3))
        !           682: 
        !           683: #define four_tables(x,tab,vf,rf,c) \
        !           684:  (  tab[0][bval(vf(x,0,c),rf(0,c))] \
        !           685:   ^ tab[1][bval(vf(x,1,c),rf(1,c))] \
        !           686:   ^ tab[2][bval(vf(x,2,c),rf(2,c))] \
        !           687:   ^ tab[3][bval(vf(x,3,c),rf(3,c))])
        !           688: 
        !           689: #define vf1(x,r,c)  (x)
        !           690: #define rf1(r,c)    (r)
        !           691: #define rf2(r,c)    ((8+r-c)&3)
        !           692: 
        !           693: /* perform forward and inverse column mix operation on four bytes in long word x in */
        !           694: /* parallel. NOTE: x must be a simple variable, NOT an expression in these macros.  */
        !           695: 
        !           696: #if defined(FM4_SET)    /* not currently used */
        !           697: #define fwd_mcol(x)     four_tables(x,t_use(f,m),vf1,rf1,0)
        !           698: #elif defined(FM1_SET)  /* not currently used */
        !           699: #define fwd_mcol(x)     one_table(x,upr,t_use(f,m),vf1,rf1,0)
        !           700: #else
        !           701: #define dec_fmvars      aes_32t g2
        !           702: #define fwd_mcol(x)     (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1))
        !           703: #endif
        !           704: 
        !           705: #if defined(IM4_SET)
        !           706: #define inv_mcol(x)     four_tables(x,t_use(i,m),vf1,rf1,0)
        !           707: #elif defined(IM1_SET)
        !           708: #define inv_mcol(x)     one_table(x,upr,t_use(i,m),vf1,rf1,0)
        !           709: #else
        !           710: #define dec_imvars      aes_32t g2, g4, g9
        !           711: #define inv_mcol(x)     (g2 = gf_mulx(x), g4 = gf_mulx(g2), g9 = (x) ^ gf_mulx(g4), g4 ^= g9, \
        !           712:                         (x) ^ g2 ^ g4 ^ upr(g2 ^ g9, 3) ^ upr(g4, 2) ^ upr(g9, 1))
        !           713: #endif
        !           714: 
        !           715: #if defined(FL4_SET)
        !           716: #define ls_box(x,c)     four_tables(x,t_use(f,l),vf1,rf2,c)
        !           717: #elif   defined(LS4_SET)
        !           718: #define ls_box(x,c)     four_tables(x,t_use(l,s),vf1,rf2,c)
        !           719: #elif defined(FL1_SET)
        !           720: #define ls_box(x,c)     one_table(x,upr,t_use(f,l),vf1,rf2,c)
        !           721: #elif defined(LS1_SET)
        !           722: #define ls_box(x,c)     one_table(x,upr,t_use(l,s),vf1,rf2,c)
        !           723: #else
        !           724: #define ls_box(x,c)     no_table(x,t_use(s,box),vf1,rf2,c)
        !           725: #endif
        !           726: 
        !           727: #endif

unix.superglobalmegacorp.com

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