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