2 * ---------------------------------------------------------------------------
3 * Copyright (c) 1998-2007, Brian Gladman, Worcester, UK. All rights reserved.
7 * The free distribution and use of this software is allowed (with or without
8 * changes) provided that:
10 * 1. source code distributions include the above copyright notice, this
11 * list of conditions and the following disclaimer;
13 * 2. binary distributions include the above copyright notice, this list
14 * of conditions and the following disclaimer in their documentation;
16 * 3. the name of the copyright holder is not used to endorse products
17 * built using this software without specific written permission.
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
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.
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
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
51 * t_xxx(s, box) => forward S box
52 * t_xxx(i, box) => inverse S box
54 * 256 32-bit word OR 4 x 256 32-bit word tables:
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
63 * Other variables and tables:
65 * t_xxx(r, c) => the rcon table
69 * OpenSolaris OS modifications
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
82 #pragma ident "%Z%%M% %I% %E% SMI"
88 #include <sys/types.h>
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
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
);
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
];
106 d_1(uint8_t, t_dec(s
, box
), sb_data
, h0
);
109 d_1(uint8_t, t_dec(i
, box
), isb_data
, h0
);
113 d_1(uint32_t, t_dec(f
, n
), sb_data
, u0
);
116 d_4(uint32_t, t_dec(f
, n
), sb_data
, u0
, u1
, u2
, u3
);
120 d_1(uint32_t, t_dec(f
, l
), sb_data
, w0
);
123 d_4(uint32_t, t_dec(f
, l
), sb_data
, w0
, w1
, w2
, w3
);
127 d_1(uint32_t, t_dec(i
, n
), isb_data
, v0
);
130 d_4(uint32_t, t_dec(i
, n
), isb_data
, v0
, v1
, v2
, v3
);
134 d_1(uint32_t, t_dec(i
, l
), isb_data
, w0
);
137 d_4(uint32_t, t_dec(i
, l
), isb_data
, w0
, w1
, w2
, w3
);
144 d_1(uint32_t, t_dec(l
, s
), sb_data
, w0
);
152 d_4(uint32_t, t_dec(l
, s
), sb_data
, w0
, w1
, w2
, w3
);
157 d_1(uint32_t, t_dec(i
, m
), mm_data
, v0
);
160 d_4(uint32_t, t_dec(i
, m
), mm_data
, v0
, v1
, v2
, v3
);
167 #endif /* _AESTAB_H */