1 /* 2 --------------------------------------------------------------------------- 3 Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. 4 5 The redistribution and use of this software (with or without changes) 6 is allowed without the payment of fees or royalties provided that: 7 8 source code distributions include the above copyright notice, this 9 list of conditions and the following disclaimer; 10 11 binary distributions include the above copyright notice, this list 12 of conditions and the following disclaimer in their documentation. 13 14 This software is provided 'as is' with no explicit or implied warranties 15 in respect of its operation, including, but not limited to, correctness 16 and fitness for purpose. 17 --------------------------------------------------------------------------- 18 Issue Date: 20/12/2007 19 20 This file contains the code for declaring the tables needed to implement 21 AES. The file aesopt.h is assumed to be included before this header file. 22 If there are no global variables, the definitions here can be used to put 23 the AES tables in a structure so that a pointer can then be added to the 24 AES context to pass them to the AES routines that need them. If this 25 facility is used, the calling program has to ensure that this pointer is 26 managed appropriately. In particular, the value of the t_dec(in,it) item 27 in the table structure must be set to zero in order to ensure that the 28 tables are initialised. In practice the three code sequences in aeskey.c 29 that control the calls to aes_init() and the aes_init() routine itself will 30 have to be changed for a specific implementation. If global variables are 31 available it will generally be preferable to use them with the precomputed 32 FIXED_TABLES option that uses static global tables. 33 34 The following defines can be used to control the way the tables 35 are defined, initialised and used in embedded environments that 36 require special features for these purposes 37 38 the 't_dec' construction is used to declare fixed table arrays 39 the 't_set' construction is used to set fixed table values 40 the 't_use' construction is used to access fixed table values 41 42 256 byte tables: 43 44 t_xxx(s,box) => forward S box 45 t_xxx(i,box) => inverse S box 46 47 256 32-bit word OR 4 x 256 32-bit word tables: 48 49 t_xxx(f,n) => forward normal round 50 t_xxx(f,l) => forward last round 51 t_xxx(i,n) => inverse normal round 52 t_xxx(i,l) => inverse last round 53 t_xxx(l,s) => key schedule table 54 t_xxx(i,m) => key schedule table 55 56 Other variables and tables: 57 58 t_xxx(r,c) => the rcon table 59 */ 60 61 #if !defined( _AESTAB_H ) 62 #define _AESTAB_H 63 64 #if defined(__cplusplus) 65 extern "C" { 66 #endif 67 68 #define t_dec(m,n) t_##m##n 69 #define t_set(m,n) t_##m##n 70 #define t_use(m,n) t_##m##n 71 72 #if defined(FIXED_TABLES) 73 # if !defined( __GNUC__ ) && (defined( __MSDOS__ ) || defined( __WIN16__ )) 74 /* make tables far data to avoid using too much DGROUP space (PG) */ 75 # define CONST const far 76 # else 77 # define CONST const 78 # endif 79 #else 80 # define CONST 81 #endif 82 83 #if defined(DO_TABLES) 84 # define EXTERN 85 #else 86 # define EXTERN extern 87 #endif 88 89 #if defined(_MSC_VER) && defined(TABLE_ALIGN) 90 #define ALIGN __declspec(align(TABLE_ALIGN)) 91 #else 92 #define ALIGN 93 #endif 94 95 #if defined( __WATCOMC__ ) && ( __WATCOMC__ >= 1100 ) 96 # define XP_DIR __cdecl 97 #else 98 # define XP_DIR 99 #endif 100 101 #if defined(DO_TABLES) && defined(FIXED_TABLES) 102 #define d_1(t,n,b,e) EXTERN ALIGN CONST XP_DIR t n[256] = b(e) 103 #define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256] = { b(e), b(f), b(g), b(h) } 104 EXTERN ALIGN CONST uint32_t t_dec(r,c)[RC_LENGTH] = rc_data(w0); 105 #else 106 #define d_1(t,n,b,e) EXTERN ALIGN CONST XP_DIR t n[256] 107 #define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256] 108 EXTERN ALIGN CONST uint32_t t_dec(r,c)[RC_LENGTH]; 109 #endif 110 111 #if defined( SBX_SET ) 112 d_1(uint8_t, t_dec(s,box), sb_data, h0); 113 #endif 114 #if defined( ISB_SET ) 115 d_1(uint8_t, t_dec(i,box), isb_data, h0); 116 #endif 117 118 #if defined( FT1_SET ) 119 d_1(uint32_t, t_dec(f,n), sb_data, u0); 120 #endif 121 #if defined( FT4_SET ) 122 d_4(uint32_t, t_dec(f,n), sb_data, u0, u1, u2, u3); 123 #endif 124 125 #if defined( FL1_SET ) 126 d_1(uint32_t, t_dec(f,l), sb_data, w0); 127 #endif 128 #if defined( FL4_SET ) 129 d_4(uint32_t, t_dec(f,l), sb_data, w0, w1, w2, w3); 130 #endif 131 132 #if defined( IT1_SET ) 133 d_1(uint32_t, t_dec(i,n), isb_data, v0); 134 #endif 135 #if defined( IT4_SET ) 136 d_4(uint32_t, t_dec(i,n), isb_data, v0, v1, v2, v3); 137 #endif 138 139 #if defined( IL1_SET ) 140 d_1(uint32_t, t_dec(i,l), isb_data, w0); 141 #endif 142 #if defined( IL4_SET ) 143 d_4(uint32_t, t_dec(i,l), isb_data, w0, w1, w2, w3); 144 #endif 145 146 #if defined( LS1_SET ) 147 #if defined( FL1_SET ) 148 #undef LS1_SET 149 #else 150 d_1(uint32_t, t_dec(l,s), sb_data, w0); 151 #endif 152 #endif 153 154 #if defined( LS4_SET ) 155 #if defined( FL4_SET ) 156 #undef LS4_SET 157 #else 158 d_4(uint32_t, t_dec(l,s), sb_data, w0, w1, w2, w3); 159 #endif 160 #endif 161 162 #if defined( IM1_SET ) 163 d_1(uint32_t, t_dec(i,m), mm_data, v0); 164 #endif 165 #if defined( IM4_SET ) 166 d_4(uint32_t, t_dec(i,m), mm_data, v0, v1, v2, v3); 167 #endif 168 169 #if defined(__cplusplus) 170 } 171 #endif 172 173 #endif 174