2 ---------------------------------------------------------------------------
3 Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved.
5 The redistribution and use of this software (with or without changes)
6 is allowed without the payment of fees or royalties provided that:
8 source code distributions include the above copyright notice, this
9 list of conditions and the following disclaimer;
11 binary distributions include the above copyright notice, this list
12 of conditions and the following disclaimer in their documentation.
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
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 STATIC_TABLES option that uses static global tables.
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
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
44 t_xxx(s,box) => forward S box
45 t_xxx(i,box) => inverse S box
47 256 32-bit word OR 4 x 256 32-bit word tables:
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
56 Other variables and tables:
58 t_xxx(r,c) => the rcon table
61 #if !defined( _AESTAB_H )
64 #if defined(__cplusplus)
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
72 #if defined(STATIC_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
83 #if defined(DO_TABLES)
86 # define EXTERN extern
89 #if defined(_MSC_VER) && defined(TABLE_ALIGN)
90 #define ALIGN __declspec(align(TABLE_ALIGN))
95 #if defined( __WATCOMC__ ) && ( __WATCOMC__ >= 1100 )
96 # define XP_DIR __cdecl
101 #if defined(DO_TABLES) && defined(STATIC_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);
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];
111 #if defined( SBX_SET )
112 d_1(uint8_t, t_dec(s,box), sb_data, h0);
114 #if defined( ISB_SET )
115 d_1(uint8_t, t_dec(i,box), isb_data, h0);
118 #if defined( FT1_SET )
119 d_1(uint32_t, t_dec(f,n), sb_data, u0);
121 #if defined( FT4_SET )
122 d_4(uint32_t, t_dec(f,n), sb_data, u0, u1, u2, u3);
125 #if defined( FL1_SET )
126 d_1(uint32_t, t_dec(f,l), sb_data, w0);
128 #if defined( FL4_SET )
129 d_4(uint32_t, t_dec(f,l), sb_data, w0, w1, w2, w3);
132 #if defined( IT1_SET )
133 d_1(uint32_t, t_dec(i,n), isb_data, v0);
135 #if defined( IT4_SET )
136 d_4(uint32_t, t_dec(i,n), isb_data, v0, v1, v2, v3);
139 #if defined( IL1_SET )
140 d_1(uint32_t, t_dec(i,l), isb_data, w0);
142 #if defined( IL4_SET )
143 d_4(uint32_t, t_dec(i,l), isb_data, w0, w1, w2, w3);
146 #if defined( LS1_SET )
147 #if defined( FL1_SET )
150 d_1(uint32_t, t_dec(l,s), sb_data, w0);
154 #if defined( LS4_SET )
155 #if defined( FL4_SET )
158 d_4(uint32_t, t_dec(l,s), sb_data, w0, w1, w2, w3);
162 #if defined( IM1_SET )
163 d_1(uint32_t, t_dec(i,m), mm_data, v0);
165 #if defined( IM4_SET )
166 d_4(uint32_t, t_dec(i,m), mm_data, v0, v1, v2, v3);
169 #if defined(__cplusplus)