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 #ifdef __cplusplus 83 extern "C" { 84 #endif 85 86 #include <sys/types.h> 87 88 #define t_dec(m, n) t_##m##n 89 #define t_set(m, n) t_##m##n 90 #define t_use(m, n) t_##m##n 91 92 #if defined(DO_TABLES) && defined(FIXED_TABLES) 93 #define d_1(t, n, b, e) static const t n[256] = b(e) 94 #define d_4(t, n, b, e, f, g, h) static const t n[4][256] = \ 95 {b(e), b(f), b(g), b(h)} 96 static const uint32_t t_dec(r, c)[RC_LENGTH] = rc_data(w0); 97 #else 98 #define d_1(t, n, b, e) static const t n[256] 99 #define d_4(t, n, b, e, f, g, h) static const t n[4][256] 100 static const uint32_t t_dec(r, c)[RC_LENGTH]; 101 #endif 102 103 #if defined(SBX_SET) 104 d_1(uint8_t, t_dec(s, box), sb_data, h0); 105 #endif 106 #if defined(ISB_SET) 107 d_1(uint8_t, t_dec(i, box), isb_data, h0); 108 #endif 109 110 #if defined(FT1_SET) 111 d_1(uint32_t, t_dec(f, n), sb_data, u0); 112 #endif 113 #if defined(FT4_SET) 114 d_4(uint32_t, t_dec(f, n), sb_data, u0, u1, u2, u3); 115 #endif 116 117 #if defined(FL1_SET) 118 d_1(uint32_t, t_dec(f, l), sb_data, w0); 119 #endif 120 #if defined(FL4_SET) 121 d_4(uint32_t, t_dec(f, l), sb_data, w0, w1, w2, w3); 122 #endif 123 124 #if defined(IT1_SET) 125 d_1(uint32_t, t_dec(i, n), isb_data, v0); 126 #endif 127 #if defined(IT4_SET) 128 d_4(uint32_t, t_dec(i, n), isb_data, v0, v1, v2, v3); 129 #endif 130 131 #if defined(IL1_SET) 132 d_1(uint32_t, t_dec(i, l), isb_data, w0); 133 #endif 134 #if defined(IL4_SET) 135 d_4(uint32_t, t_dec(i, l), isb_data, w0, w1, w2, w3); 136 #endif 137 138 #if defined(LS1_SET) 139 #if defined(FL1_SET) 140 #undef LS1_SET 141 #else 142 d_1(uint32_t, t_dec(l, s), sb_data, w0); 143 #endif 144 #endif 145 146 #if defined(LS4_SET) 147 #if defined(FL4_SET) 148 #undef LS4_SET 149 #else 150 d_4(uint32_t, t_dec(l, s), sb_data, w0, w1, w2, w3); 151 #endif 152 #endif 153 154 #if defined(IM1_SET) 155 d_1(uint32_t, t_dec(i, m), mm_data, v0); 156 #endif 157 #if defined(IM4_SET) 158 d_4(uint32_t, t_dec(i, m), mm_data, v0, v1, v2, v3); 159 #endif 160 161 #ifdef __cplusplus 162 } 163 #endif 164 165 #endif /* _AESTAB_H */ 166