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 Date: 20/12/2007
  26  *
  27  * This file contains the code for declaring the tables needed to implement
  28  * AES. The file aesopt.h is assumed to be included before this header file.
  29  * If there are no global variables, the definitions here can be used to put
  30  * the AES tables in a structure so that a pointer can then be added to the
  31  * AES context to pass them to the AES routines that need them.   If this
  32  * facility is used, the calling program has to ensure that this pointer is
  33  * managed appropriately.  In particular, the value of the t_dec(in, it) item
  34  * in the table structure must be set to zero in order to ensure that the
  35  * tables are initialised. In practice the three code sequences in aeskey.c
  36  * that control the calls to aes_init() and the aes_init() routine itself will
  37  * have to be changed for a specific implementation. If global variables are
  38  * available it will generally be preferable to use them with the precomputed
  39  * FIXED_TABLES option that uses static global tables.
  40  *
  41  * The following defines can be used to control the way the tables
  42  * are defined, initialised and used in embedded environments that
  43  * require special features for these purposes
  44  *
  45  *    the 't_dec' construction is used to declare fixed table arrays
  46  *    the 't_set' construction is used to set fixed table values
  47  *    the 't_use' construction is used to access fixed table values
  48  *
  49  *    256 byte tables:
  50  *
  51  *        t_xxx(s, box)    => forward S box
  52  *        t_xxx(i, box)    => inverse S box
  53  *
  54  *    256 32-bit word OR 4 x 256 32-bit word tables:
  55  *
  56  *        t_xxx(f, n)      => forward normal round
  57  *        t_xxx(f, l)      => forward last round
  58  *        t_xxx(i, n)      => inverse normal round
  59  *        t_xxx(i, l)      => inverse last round
  60  *        t_xxx(l, s)      => key schedule table
  61  *        t_xxx(i, m)      => key schedule table
  62  *
  63  *    Other variables and tables:
  64  *
  65  *        t_xxx(r, c)      => the rcon table
  66  */
  67 
  68 /*
  69  * OpenSolaris OS modifications
  70  *
  71  * 1. Added __cplusplus and _AESTAB_H header guards
  72  * 2. Added header file sys/types.h
  73  * 3. Remove code defined for _MSC_VER
  74  * 4. Changed all variables to "static const"
  75  * 5. Changed uint_8t and uint_32t to uint8_t and uint32_t
  76  * 6. Cstyled and hdrchk code
  77  */
  78 
  79 #ifndef _AESTAB_H
  80 #define _AESTAB_H
  81 
  82 #pragma ident   "@(#)aestab.h   1.1     08/05/21 SMI"
  83 
  84 #ifdef  __cplusplus
  85 extern "C" {
  86 #endif
  87 
  88 #include <sys/types.h>
  89 
  90 #define t_dec(m, n) t_##m##n
  91 #define t_set(m, n) t_##m##n
  92 #define t_use(m, n) t_##m##n
  93 
  94 #if defined(DO_TABLES) && defined(FIXED_TABLES)
  95 #define d_1(t, n, b, e)          static const t n[256]    =   b(e)
  96 #define d_4(t, n, b, e, f, g, h) static const t n[4][256] = \
  97                                         {b(e), b(f), b(g), b(h)}
  98 static const uint32_t t_dec(r, c)[RC_LENGTH] = rc_data(w0);
  99 #else
 100 #define d_1(t, n, b, e)                 static const t n[256]
 101 #define d_4(t, n, b, e, f, g, h)        static const t n[4][256]
 102 static const uint32_t t_dec(r, c)[RC_LENGTH];
 103 #endif
 104 
 105 #if defined(SBX_SET)
 106         d_1(uint8_t, t_dec(s, box), sb_data, h0);
 107 #endif
 108 #if defined(ISB_SET)
 109         d_1(uint8_t, t_dec(i, box), isb_data, h0);
 110 #endif
 111 
 112 #if defined(FT1_SET)
 113         d_1(uint32_t, t_dec(f, n), sb_data, u0);
 114 #endif
 115 #if defined(FT4_SET)
 116         d_4(uint32_t, t_dec(f, n), sb_data, u0, u1, u2, u3);
 117 #endif
 118 
 119 #if defined(FL1_SET)
 120         d_1(uint32_t, t_dec(f, l), sb_data, w0);
 121 #endif
 122 #if defined(FL4_SET)
 123         d_4(uint32_t, t_dec(f, l), sb_data, w0, w1, w2, w3);
 124 #endif
 125 
 126 #if defined(IT1_SET)
 127         d_1(uint32_t, t_dec(i, n), isb_data, v0);
 128 #endif
 129 #if defined(IT4_SET)
 130         d_4(uint32_t, t_dec(i, n), isb_data, v0, v1, v2, v3);
 131 #endif
 132 
 133 #if defined(IL1_SET)
 134         d_1(uint32_t, t_dec(i, l), isb_data, w0);
 135 #endif
 136 #if defined(IL4_SET)
 137         d_4(uint32_t, t_dec(i, l), isb_data, w0, w1, w2, w3);
 138 #endif
 139 
 140 #if defined(LS1_SET)
 141 #if defined(FL1_SET)
 142 #undef  LS1_SET
 143 #else
 144         d_1(uint32_t, t_dec(l, s), sb_data, w0);
 145 #endif
 146 #endif
 147 
 148 #if defined(LS4_SET)
 149 #if defined(FL4_SET)
 150 #undef  LS4_SET
 151 #else
 152         d_4(uint32_t, t_dec(l, s), sb_data, w0, w1, w2, w3);
 153 #endif
 154 #endif
 155 
 156 #if defined(IM1_SET)
 157         d_1(uint32_t, t_dec(i, m), mm_data, v0);
 158 #endif
 159 #if defined(IM4_SET)
 160         d_4(uint32_t, t_dec(i, m), mm_data, v0, v1, v2, v3);
 161 #endif
 162 
 163 #ifdef  __cplusplus
 164 }
 165 #endif
 166 
 167 #endif  /* _AESTAB_H */