diff options
Diffstat (limited to '')
-rw-r--r-- | libraries/irrlicht-1.8/source/Irrlicht/aesGladman/aesopt.h | 1898 |
1 files changed, 949 insertions, 949 deletions
diff --git a/libraries/irrlicht-1.8/source/Irrlicht/aesGladman/aesopt.h b/libraries/irrlicht-1.8/source/Irrlicht/aesGladman/aesopt.h index 45daa38..2dc58be 100644 --- a/libraries/irrlicht-1.8/source/Irrlicht/aesGladman/aesopt.h +++ b/libraries/irrlicht-1.8/source/Irrlicht/aesGladman/aesopt.h | |||
@@ -1,949 +1,949 @@ | |||
1 | /* | 1 | /* |
2 | --------------------------------------------------------------------------- | 2 | --------------------------------------------------------------------------- |
3 | Copyright (c) 2003, Dr Brian Gladman < >, Worcester, UK. | 3 | Copyright (c) 2003, Dr Brian Gladman < >, Worcester, UK. |
4 | All rights reserved. | 4 | All rights reserved. |
5 | 5 | ||
6 | LICENSE TERMS | 6 | LICENSE TERMS |
7 | 7 | ||
8 | The free distribution and use of this software in both source and binary | 8 | The free distribution and use of this software in both source and binary |
9 | form is allowed (with or without changes) provided that: | 9 | form is allowed (with or without changes) provided that: |
10 | 10 | ||
11 | 1. distributions of this source code include the above copyright | 11 | 1. distributions of this source code include the above copyright |
12 | notice, this list of conditions and the following disclaimer; | 12 | notice, this list of conditions and the following disclaimer; |
13 | 13 | ||
14 | 2. distributions in binary form include the above copyright | 14 | 2. distributions in binary form include the above copyright |
15 | notice, this list of conditions and the following disclaimer | 15 | notice, this list of conditions and the following disclaimer |
16 | in the documentation and/or other associated materials; | 16 | in the documentation and/or other associated materials; |
17 | 17 | ||
18 | 3. the copyright holder's name is not used to endorse products | 18 | 3. the copyright holder's name is not used to endorse products |
19 | built using this software without specific written permission. | 19 | built using this software without specific written permission. |
20 | 20 | ||
21 | ALTERNATIVELY, provided that this notice is retained in full, this product | 21 | ALTERNATIVELY, provided that this notice is retained in full, this product |
22 | may be distributed under the terms of the GNU General Public License (GPL), | 22 | may be distributed under the terms of the GNU General Public License (GPL), |
23 | in which case the provisions of the GPL apply INSTEAD OF those given above. | 23 | in which case the provisions of the GPL apply INSTEAD OF those given above. |
24 | 24 | ||
25 | DISCLAIMER | 25 | DISCLAIMER |
26 | 26 | ||
27 | This software is provided 'as is' with no explicit or implied warranties | 27 | This software is provided 'as is' with no explicit or implied warranties |
28 | in respect of its properties, including, but not limited to, correctness | 28 | in respect of its properties, including, but not limited to, correctness |
29 | and/or fitness for purpose. | 29 | and/or fitness for purpose. |
30 | --------------------------------------------------------------------------- | 30 | --------------------------------------------------------------------------- |
31 | Issue Date: 26/08/2003 | 31 | Issue Date: 26/08/2003 |
32 | 32 | ||
33 | My thanks go to Dag Arne Osvik for devising the schemes used here for key | 33 | My thanks go to Dag Arne Osvik for devising the schemes used here for key |
34 | length derivation from the form of the key schedule | 34 | length derivation from the form of the key schedule |
35 | 35 | ||
36 | This file contains the compilation options for AES (Rijndael) and code | 36 | This file contains the compilation options for AES (Rijndael) and code |
37 | that is common across encryption, key scheduling and table generation. | 37 | that is common across encryption, key scheduling and table generation. |
38 | 38 | ||
39 | OPERATION | 39 | OPERATION |
40 | 40 | ||
41 | These source code files implement the AES algorithm Rijndael designed by | 41 | These source code files implement the AES algorithm Rijndael designed by |
42 | Joan Daemen and Vincent Rijmen. This version is designed for the standard | 42 | Joan Daemen and Vincent Rijmen. This version is designed for the standard |
43 | block size of 16 bytes and for key sizes of 128, 192 and 256 bits (16, 24 | 43 | block size of 16 bytes and for key sizes of 128, 192 and 256 bits (16, 24 |
44 | and 32 bytes). | 44 | and 32 bytes). |
45 | 45 | ||
46 | This version is designed for flexibility and speed using operations on | 46 | This version is designed for flexibility and speed using operations on |
47 | 32-bit words rather than operations on bytes. It can be compiled with | 47 | 32-bit words rather than operations on bytes. It can be compiled with |
48 | either big or little endian internal byte order but is faster when the | 48 | either big or little endian internal byte order but is faster when the |
49 | native byte order for the processor is used. | 49 | native byte order for the processor is used. |
50 | 50 | ||
51 | THE CIPHER INTERFACE | 51 | THE CIPHER INTERFACE |
52 | 52 | ||
53 | The cipher interface is implemented as an array of bytes in which lower | 53 | The cipher interface is implemented as an array of bytes in which lower |
54 | AES bit sequence indexes map to higher numeric significance within bytes. | 54 | AES bit sequence indexes map to higher numeric significance within bytes. |
55 | 55 | ||
56 | aes_08t (an unsigned 8-bit type) | 56 | aes_08t (an unsigned 8-bit type) |
57 | aes_32t (an unsigned 32-bit type) | 57 | aes_32t (an unsigned 32-bit type) |
58 | struct aes_encrypt_ctx (structure for the cipher encryption context) | 58 | struct aes_encrypt_ctx (structure for the cipher encryption context) |
59 | struct aes_decrypt_ctx (structure for the cipher decryption context) | 59 | struct aes_decrypt_ctx (structure for the cipher decryption context) |
60 | aes_rval the function return type | 60 | aes_rval the function return type |
61 | 61 | ||
62 | C subroutine calls: | 62 | C subroutine calls: |
63 | 63 | ||
64 | aes_rval aes_encrypt_key128(const void *in_key, aes_encrypt_ctx cx[1]); | 64 | aes_rval aes_encrypt_key128(const void *in_key, aes_encrypt_ctx cx[1]); |
65 | aes_rval aes_encrypt_key192(const void *in_key, aes_encrypt_ctx cx[1]); | 65 | aes_rval aes_encrypt_key192(const void *in_key, aes_encrypt_ctx cx[1]); |
66 | aes_rval aes_encrypt_key256(const void *in_key, aes_encrypt_ctx cx[1]); | 66 | aes_rval aes_encrypt_key256(const void *in_key, aes_encrypt_ctx cx[1]); |
67 | aes_rval aes_encrypt(const void *in_blk, | 67 | aes_rval aes_encrypt(const void *in_blk, |
68 | void *out_blk, const aes_encrypt_ctx cx[1]); | 68 | void *out_blk, const aes_encrypt_ctx cx[1]); |
69 | 69 | ||
70 | aes_rval aes_decrypt_key128(const void *in_key, aes_decrypt_ctx cx[1]); | 70 | aes_rval aes_decrypt_key128(const void *in_key, aes_decrypt_ctx cx[1]); |
71 | aes_rval aes_decrypt_key192(const void *in_key, aes_decrypt_ctx cx[1]); | 71 | aes_rval aes_decrypt_key192(const void *in_key, aes_decrypt_ctx cx[1]); |
72 | aes_rval aes_decrypt_key256(const void *in_key, aes_decrypt_ctx cx[1]); | 72 | aes_rval aes_decrypt_key256(const void *in_key, aes_decrypt_ctx cx[1]); |
73 | aes_rval aes_decrypt(const void *in_blk, | 73 | aes_rval aes_decrypt(const void *in_blk, |
74 | void *out_blk, const aes_decrypt_ctx cx[1]); | 74 | void *out_blk, const aes_decrypt_ctx cx[1]); |
75 | 75 | ||
76 | IMPORTANT NOTE: If you are using this C interface with dynamic tables make sure that | 76 | IMPORTANT NOTE: If you are using this C interface with dynamic tables make sure that |
77 | you call genTabs() before AES is used so that the tables are initialised. | 77 | you call genTabs() before AES is used so that the tables are initialised. |
78 | 78 | ||
79 | C++ aes class subroutines: | 79 | C++ aes class subroutines: |
80 | 80 | ||
81 | Class AESencrypt for encryption | 81 | Class AESencrypt for encryption |
82 | 82 | ||
83 | Construtors: | 83 | Construtors: |
84 | AESencrypt(void) | 84 | AESencrypt(void) |
85 | AESencrypt(const void *in_key) - 128 bit key | 85 | AESencrypt(const void *in_key) - 128 bit key |
86 | Members: | 86 | Members: |
87 | void key128(const void *in_key) | 87 | void key128(const void *in_key) |
88 | void key192(const void *in_key) | 88 | void key192(const void *in_key) |
89 | void key256(const void *in_key) | 89 | void key256(const void *in_key) |
90 | void encrypt(const void *in_blk, void *out_blk) const | 90 | void encrypt(const void *in_blk, void *out_blk) const |
91 | 91 | ||
92 | Class AESdecrypt for encryption | 92 | Class AESdecrypt for encryption |
93 | Construtors: | 93 | Construtors: |
94 | AESdecrypt(void) | 94 | AESdecrypt(void) |
95 | AESdecrypt(const void *in_key) - 128 bit key | 95 | AESdecrypt(const void *in_key) - 128 bit key |
96 | Members: | 96 | Members: |
97 | void key128(const void *in_key) | 97 | void key128(const void *in_key) |
98 | void key192(const void *in_key) | 98 | void key192(const void *in_key) |
99 | void key256(const void *in_key) | 99 | void key256(const void *in_key) |
100 | void decrypt(const void *in_blk, void *out_blk) const | 100 | void decrypt(const void *in_blk, void *out_blk) const |
101 | 101 | ||
102 | COMPILATION | 102 | COMPILATION |
103 | 103 | ||
104 | The files used to provide AES (Rijndael) are | 104 | The files used to provide AES (Rijndael) are |
105 | 105 | ||
106 | a. aes.h for the definitions needed for use in C. | 106 | a. aes.h for the definitions needed for use in C. |
107 | b. aescpp.h for the definitions needed for use in C++. | 107 | b. aescpp.h for the definitions needed for use in C++. |
108 | c. aesopt.h for setting compilation options (also includes common code). | 108 | c. aesopt.h for setting compilation options (also includes common code). |
109 | d. aescrypt.c for encryption and decrytpion, or | 109 | d. aescrypt.c for encryption and decrytpion, or |
110 | e. aeskey.c for key scheduling. | 110 | e. aeskey.c for key scheduling. |
111 | f. aestab.c for table loading or generation. | 111 | f. aestab.c for table loading or generation. |
112 | g. aescrypt.asm for encryption and decryption using assembler code. | 112 | g. aescrypt.asm for encryption and decryption using assembler code. |
113 | h. aescrypt.mmx.asm for encryption and decryption using MMX assembler. | 113 | h. aescrypt.mmx.asm for encryption and decryption using MMX assembler. |
114 | 114 | ||
115 | To compile AES (Rijndael) for use in C code use aes.h and set the | 115 | To compile AES (Rijndael) for use in C code use aes.h and set the |
116 | defines here for the facilities you need (key lengths, encryption | 116 | defines here for the facilities you need (key lengths, encryption |
117 | and/or decryption). Do not define AES_DLL or AES_CPP. Set the options | 117 | and/or decryption). Do not define AES_DLL or AES_CPP. Set the options |
118 | for optimisations and table sizes here. | 118 | for optimisations and table sizes here. |
119 | 119 | ||
120 | To compile AES (Rijndael) for use in in C++ code use aescpp.h but do | 120 | To compile AES (Rijndael) for use in in C++ code use aescpp.h but do |
121 | not define AES_DLL | 121 | not define AES_DLL |
122 | 122 | ||
123 | To compile AES (Rijndael) in C as a Dynamic Link Library DLL) use | 123 | To compile AES (Rijndael) in C as a Dynamic Link Library DLL) use |
124 | aes.h and include the AES_DLL define. | 124 | aes.h and include the AES_DLL define. |
125 | 125 | ||
126 | CONFIGURATION OPTIONS (here and in aes.h) | 126 | CONFIGURATION OPTIONS (here and in aes.h) |
127 | 127 | ||
128 | a. set AES_DLL in aes.h if AES (Rijndael) is to be compiled as a DLL | 128 | a. set AES_DLL in aes.h if AES (Rijndael) is to be compiled as a DLL |
129 | b. You may need to set PLATFORM_BYTE_ORDER to define the byte order. | 129 | b. You may need to set PLATFORM_BYTE_ORDER to define the byte order. |
130 | c. If you want the code to run in a specific internal byte order, then | 130 | c. If you want the code to run in a specific internal byte order, then |
131 | ALGORITHM_BYTE_ORDER must be set accordingly. | 131 | ALGORITHM_BYTE_ORDER must be set accordingly. |
132 | d. set other configuration options decribed below. | 132 | d. set other configuration options decribed below. |
133 | */ | 133 | */ |
134 | 134 | ||
135 | #ifndef _AESOPT_H | 135 | #ifndef _AESOPT_H |
136 | #define _AESOPT_H | 136 | #define _AESOPT_H |
137 | 137 | ||
138 | #include "aes.h" | 138 | #include "aes.h" |
139 | 139 | ||
140 | /* CONFIGURATION - USE OF DEFINES | 140 | /* CONFIGURATION - USE OF DEFINES |
141 | 141 | ||
142 | Later in this section there are a number of defines that control the | 142 | Later in this section there are a number of defines that control the |
143 | operation of the code. In each section, the purpose of each define is | 143 | operation of the code. In each section, the purpose of each define is |
144 | explained so that the relevant form can be included or excluded by | 144 | explained so that the relevant form can be included or excluded by |
145 | setting either 1's or 0's respectively on the branches of the related | 145 | setting either 1's or 0's respectively on the branches of the related |
146 | #if clauses. | 146 | #if clauses. |
147 | */ | 147 | */ |
148 | 148 | ||
149 | /* BYTE ORDER IN 32-BIT WORDS | 149 | /* BYTE ORDER IN 32-BIT WORDS |
150 | 150 | ||
151 | To obtain the highest speed on processors with 32-bit words, this code | 151 | To obtain the highest speed on processors with 32-bit words, this code |
152 | needs to determine the byte order of the target machine. The following | 152 | needs to determine the byte order of the target machine. The following |
153 | block of code is an attempt to capture the most obvious ways in which | 153 | block of code is an attempt to capture the most obvious ways in which |
154 | various environemnts define byte order. It may well fail, in which case | 154 | various environemnts define byte order. It may well fail, in which case |
155 | the definitions will need to be set by editing at the points marked | 155 | the definitions will need to be set by editing at the points marked |
156 | **** EDIT HERE IF NECESSARY **** below. My thanks to Peter Gutmann for | 156 | **** EDIT HERE IF NECESSARY **** below. My thanks to Peter Gutmann for |
157 | some of these defines (from cryptlib). | 157 | some of these defines (from cryptlib). |
158 | */ | 158 | */ |
159 | 159 | ||
160 | #define BRG_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */ | 160 | #define BRG_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */ |
161 | #define BRG_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */ | 161 | #define BRG_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */ |
162 | 162 | ||
163 | #ifdef __BIG_ENDIAN__ | 163 | #ifdef __BIG_ENDIAN__ |
164 | #define PLATFORM_BYTE_ORDER BRG_BIG_ENDIAN | 164 | #define PLATFORM_BYTE_ORDER BRG_BIG_ENDIAN |
165 | #else | 165 | #else |
166 | #define PLATFORM_BYTE_ORDER BRG_LITTLE_ENDIAN | 166 | #define PLATFORM_BYTE_ORDER BRG_LITTLE_ENDIAN |
167 | #endif | 167 | #endif |
168 | 168 | ||
169 | /* SOME LOCAL DEFINITIONS */ | 169 | /* SOME LOCAL DEFINITIONS */ |
170 | 170 | ||
171 | #define NO_TABLES 0 | 171 | #define NO_TABLES 0 |
172 | #define ONE_TABLE 1 | 172 | #define ONE_TABLE 1 |
173 | #define FOUR_TABLES 4 | 173 | #define FOUR_TABLES 4 |
174 | #define NONE 0 | 174 | #define NONE 0 |
175 | #define PARTIAL 1 | 175 | #define PARTIAL 1 |
176 | #define FULL 2 | 176 | #define FULL 2 |
177 | 177 | ||
178 | #define aes_sw32 Byteswap::byteswap | 178 | #define aes_sw32 Byteswap::byteswap |
179 | 179 | ||
180 | /* 1. FUNCTIONS REQUIRED | 180 | /* 1. FUNCTIONS REQUIRED |
181 | 181 | ||
182 | This implementation provides subroutines for encryption, decryption | 182 | This implementation provides subroutines for encryption, decryption |
183 | and for setting the three key lengths (separately) for encryption | 183 | and for setting the three key lengths (separately) for encryption |
184 | and decryption. When the assembler code is not being used the following | 184 | and decryption. When the assembler code is not being used the following |
185 | definition blocks allow the selection of the routines that are to be | 185 | definition blocks allow the selection of the routines that are to be |
186 | included in the compilation. | 186 | included in the compilation. |
187 | */ | 187 | */ |
188 | #ifdef AES_ENCRYPT | 188 | #ifdef AES_ENCRYPT |
189 | #define ENCRYPTION | 189 | #define ENCRYPTION |
190 | #define ENCRYPTION_KEY_SCHEDULE | 190 | #define ENCRYPTION_KEY_SCHEDULE |
191 | #endif | 191 | #endif |
192 | 192 | ||
193 | #ifdef AES_DECRYPT | 193 | #ifdef AES_DECRYPT |
194 | #define DECRYPTION | 194 | #define DECRYPTION |
195 | #define DECRYPTION_KEY_SCHEDULE | 195 | #define DECRYPTION_KEY_SCHEDULE |
196 | #endif | 196 | #endif |
197 | 197 | ||
198 | /* 2. ASSEMBLER SUPPORT | 198 | /* 2. ASSEMBLER SUPPORT |
199 | 199 | ||
200 | This define (which can be on the command line) enables the use of the | 200 | This define (which can be on the command line) enables the use of the |
201 | assembler code routines for encryption and decryption with the C code | 201 | assembler code routines for encryption and decryption with the C code |
202 | only providing key scheduling | 202 | only providing key scheduling |
203 | */ | 203 | */ |
204 | #if 0 | 204 | #if 0 |
205 | #define AES_ASM | 205 | #define AES_ASM |
206 | #endif | 206 | #endif |
207 | 207 | ||
208 | /* 3. BYTE ORDER WITHIN 32 BIT WORDS | 208 | /* 3. BYTE ORDER WITHIN 32 BIT WORDS |
209 | 209 | ||
210 | The fundamental data processing units in Rijndael are 8-bit bytes. The | 210 | The fundamental data processing units in Rijndael are 8-bit bytes. The |
211 | input, output and key input are all enumerated arrays of bytes in which | 211 | input, output and key input are all enumerated arrays of bytes in which |
212 | bytes are numbered starting at zero and increasing to one less than the | 212 | bytes are numbered starting at zero and increasing to one less than the |
213 | number of bytes in the array in question. This enumeration is only used | 213 | number of bytes in the array in question. This enumeration is only used |
214 | for naming bytes and does not imply any adjacency or order relationship | 214 | for naming bytes and does not imply any adjacency or order relationship |
215 | from one byte to another. When these inputs and outputs are considered | 215 | from one byte to another. When these inputs and outputs are considered |
216 | as bit sequences, bits 8*n to 8*n+7 of the bit sequence are mapped to | 216 | as bit sequences, bits 8*n to 8*n+7 of the bit sequence are mapped to |
217 | byte[n] with bit 8n+i in the sequence mapped to bit 7-i within the byte. | 217 | byte[n] with bit 8n+i in the sequence mapped to bit 7-i within the byte. |
218 | In this implementation bits are numbered from 0 to 7 starting at the | 218 | In this implementation bits are numbered from 0 to 7 starting at the |
219 | numerically least significant end of each byte (bit n represents 2^n). | 219 | numerically least significant end of each byte (bit n represents 2^n). |
220 | 220 | ||
221 | However, Rijndael can be implemented more efficiently using 32-bit | 221 | However, Rijndael can be implemented more efficiently using 32-bit |
222 | words by packing bytes into words so that bytes 4*n to 4*n+3 are placed | 222 | words by packing bytes into words so that bytes 4*n to 4*n+3 are placed |
223 | into word[n]. While in principle these bytes can be assembled into words | 223 | into word[n]. While in principle these bytes can be assembled into words |
224 | in any positions, this implementation only supports the two formats in | 224 | in any positions, this implementation only supports the two formats in |
225 | which bytes in adjacent positions within words also have adjacent byte | 225 | which bytes in adjacent positions within words also have adjacent byte |
226 | numbers. This order is called big-endian if the lowest numbered bytes | 226 | numbers. This order is called big-endian if the lowest numbered bytes |
227 | in words have the highest numeric significance and little-endian if the | 227 | in words have the highest numeric significance and little-endian if the |
228 | opposite applies. | 228 | opposite applies. |
229 | 229 | ||
230 | This code can work in either order irrespective of the order used by the | 230 | This code can work in either order irrespective of the order used by the |
231 | machine on which it runs. Normally the internal byte order will be set | 231 | machine on which it runs. Normally the internal byte order will be set |
232 | to the order of the processor on which the code is to be run but this | 232 | to the order of the processor on which the code is to be run but this |
233 | define can be used to reverse this in special situations | 233 | define can be used to reverse this in special situations |
234 | 234 | ||
235 | NOTE: Assembler code versions rely on PLATFORM_BYTE_ORDER being set | 235 | NOTE: Assembler code versions rely on PLATFORM_BYTE_ORDER being set |
236 | */ | 236 | */ |
237 | #if 1 || defined(AES_ASM) | 237 | #if 1 || defined(AES_ASM) |
238 | #define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER | 238 | #define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER |
239 | #elif 0 | 239 | #elif 0 |
240 | #define ALGORITHM_BYTE_ORDER BRG_LITTLE_ENDIAN | 240 | #define ALGORITHM_BYTE_ORDER BRG_LITTLE_ENDIAN |
241 | #elif 0 | 241 | #elif 0 |
242 | #define ALGORITHM_BYTE_ORDER BRG_BIG_ENDIAN | 242 | #define ALGORITHM_BYTE_ORDER BRG_BIG_ENDIAN |
243 | #else | 243 | #else |
244 | #error The algorithm byte order is not defined | 244 | #error The algorithm byte order is not defined |
245 | #endif | 245 | #endif |
246 | 246 | ||
247 | /* 4. FAST INPUT/OUTPUT OPERATIONS. | 247 | /* 4. FAST INPUT/OUTPUT OPERATIONS. |
248 | 248 | ||
249 | On some machines it is possible to improve speed by transferring the | 249 | On some machines it is possible to improve speed by transferring the |
250 | bytes in the input and output arrays to and from the internal 32-bit | 250 | bytes in the input and output arrays to and from the internal 32-bit |
251 | variables by addressing these arrays as if they are arrays of 32-bit | 251 | variables by addressing these arrays as if they are arrays of 32-bit |
252 | words. On some machines this will always be possible but there may | 252 | words. On some machines this will always be possible but there may |
253 | be a large performance penalty if the byte arrays are not aligned on | 253 | be a large performance penalty if the byte arrays are not aligned on |
254 | the normal word boundaries. On other machines this technique will | 254 | the normal word boundaries. On other machines this technique will |
255 | lead to memory access errors when such 32-bit word accesses are not | 255 | lead to memory access errors when such 32-bit word accesses are not |
256 | properly aligned. The option SAFE_IO avoids such problems but will | 256 | properly aligned. The option SAFE_IO avoids such problems but will |
257 | often be slower on those machines that support misaligned access | 257 | often be slower on those machines that support misaligned access |
258 | (especially so if care is taken to align the input and output byte | 258 | (especially so if care is taken to align the input and output byte |
259 | arrays on 32-bit word boundaries). If SAFE_IO is not defined it is | 259 | arrays on 32-bit word boundaries). If SAFE_IO is not defined it is |
260 | assumed that access to byte arrays as if they are arrays of 32-bit | 260 | assumed that access to byte arrays as if they are arrays of 32-bit |
261 | words will not cause problems when such accesses are misaligned. | 261 | words will not cause problems when such accesses are misaligned. |
262 | */ | 262 | */ |
263 | #if 1 && !defined(_MSC_VER) | 263 | #if 1 && !defined(_MSC_VER) |
264 | #define SAFE_IO | 264 | #define SAFE_IO |
265 | #endif | 265 | #endif |
266 | 266 | ||
267 | /* 5. LOOP UNROLLING | 267 | /* 5. LOOP UNROLLING |
268 | 268 | ||
269 | The code for encryption and decrytpion cycles through a number of rounds | 269 | The code for encryption and decrytpion cycles through a number of rounds |
270 | that can be implemented either in a loop or by expanding the code into a | 270 | that can be implemented either in a loop or by expanding the code into a |
271 | long sequence of instructions, the latter producing a larger program but | 271 | long sequence of instructions, the latter producing a larger program but |
272 | one that will often be much faster. The latter is called loop unrolling. | 272 | one that will often be much faster. The latter is called loop unrolling. |
273 | There are also potential speed advantages in expanding two iterations in | 273 | There are also potential speed advantages in expanding two iterations in |
274 | a loop with half the number of iterations, which is called partial loop | 274 | a loop with half the number of iterations, which is called partial loop |
275 | unrolling. The following options allow partial or full loop unrolling | 275 | unrolling. The following options allow partial or full loop unrolling |
276 | to be set independently for encryption and decryption | 276 | to be set independently for encryption and decryption |
277 | */ | 277 | */ |
278 | #if 1 | 278 | #if 1 |
279 | #define ENC_UNROLL FULL | 279 | #define ENC_UNROLL FULL |
280 | #elif 0 | 280 | #elif 0 |
281 | #define ENC_UNROLL PARTIAL | 281 | #define ENC_UNROLL PARTIAL |
282 | #else | 282 | #else |
283 | #define ENC_UNROLL NONE | 283 | #define ENC_UNROLL NONE |
284 | #endif | 284 | #endif |
285 | 285 | ||
286 | #if 1 | 286 | #if 1 |
287 | #define DEC_UNROLL FULL | 287 | #define DEC_UNROLL FULL |
288 | #elif 0 | 288 | #elif 0 |
289 | #define DEC_UNROLL PARTIAL | 289 | #define DEC_UNROLL PARTIAL |
290 | #else | 290 | #else |
291 | #define DEC_UNROLL NONE | 291 | #define DEC_UNROLL NONE |
292 | #endif | 292 | #endif |
293 | 293 | ||
294 | /* 6. FAST FINITE FIELD OPERATIONS | 294 | /* 6. FAST FINITE FIELD OPERATIONS |
295 | 295 | ||
296 | If this section is included, tables are used to provide faster finite | 296 | If this section is included, tables are used to provide faster finite |
297 | field arithmetic (this has no effect if FIXED_TABLES is defined). | 297 | field arithmetic (this has no effect if FIXED_TABLES is defined). |
298 | */ | 298 | */ |
299 | #if 0 | 299 | #if 0 |
300 | #define FF_TABLES | 300 | #define FF_TABLES |
301 | #endif | 301 | #endif |
302 | 302 | ||
303 | /* 7. INTERNAL STATE VARIABLE FORMAT | 303 | /* 7. INTERNAL STATE VARIABLE FORMAT |
304 | 304 | ||
305 | The internal state of Rijndael is stored in a number of local 32-bit | 305 | The internal state of Rijndael is stored in a number of local 32-bit |
306 | word varaibles which can be defined either as an array or as individual | 306 | word varaibles which can be defined either as an array or as individual |
307 | names variables. Include this section if you want to store these local | 307 | names variables. Include this section if you want to store these local |
308 | varaibles in arrays. Otherwise individual local variables will be used. | 308 | varaibles in arrays. Otherwise individual local variables will be used. |
309 | */ | 309 | */ |
310 | #if 1 | 310 | #if 1 |
311 | #define ARRAYS | 311 | #define ARRAYS |
312 | #endif | 312 | #endif |
313 | 313 | ||
314 | /* In this implementation the columns of the state array are each held in | 314 | /* In this implementation the columns of the state array are each held in |
315 | 32-bit words. The state array can be held in various ways: in an array | 315 | 32-bit words. The state array can be held in various ways: in an array |
316 | of words, in a number of individual word variables or in a number of | 316 | of words, in a number of individual word variables or in a number of |
317 | processor registers. The following define maps a variable name x and | 317 | processor registers. The following define maps a variable name x and |
318 | a column number c to the way the state array variable is to be held. | 318 | a column number c to the way the state array variable is to be held. |
319 | The first define below maps the state into an array x[c] whereas the | 319 | The first define below maps the state into an array x[c] whereas the |
320 | second form maps the state into a number of individual variables x0, | 320 | second form maps the state into a number of individual variables x0, |
321 | x1, etc. Another form could map individual state colums to machine | 321 | x1, etc. Another form could map individual state colums to machine |
322 | register names. | 322 | register names. |
323 | */ | 323 | */ |
324 | 324 | ||
325 | #if defined(ARRAYS) | 325 | #if defined(ARRAYS) |
326 | #define s(x,c) x[c] | 326 | #define s(x,c) x[c] |
327 | #else | 327 | #else |
328 | #define s(x,c) x##c | 328 | #define s(x,c) x##c |
329 | #endif | 329 | #endif |
330 | 330 | ||
331 | /* 8. FIXED OR DYNAMIC TABLES | 331 | /* 8. FIXED OR DYNAMIC TABLES |
332 | 332 | ||
333 | When this section is included the tables used by the code are compiled | 333 | When this section is included the tables used by the code are compiled |
334 | statically into the binary file. Otherwise the subroutine gen_tabs() | 334 | statically into the binary file. Otherwise the subroutine gen_tabs() |
335 | must be called to compute them before the code is first used. | 335 | must be called to compute them before the code is first used. |
336 | */ | 336 | */ |
337 | #if 1 | 337 | #if 1 |
338 | #define FIXED_TABLES | 338 | #define FIXED_TABLES |
339 | #define DO_TABLES | 339 | #define DO_TABLES |
340 | #endif | 340 | #endif |
341 | 341 | ||
342 | /* 9. TABLE ALIGNMENT | 342 | /* 9. TABLE ALIGNMENT |
343 | 343 | ||
344 | On some systems speed will be improved by aligning the AES large lookup | 344 | On some systems speed will be improved by aligning the AES large lookup |
345 | tables on particular boundaries. This define should be set to a power of | 345 | tables on particular boundaries. This define should be set to a power of |
346 | two giving the desired alignment. It can be left undefined if alignment | 346 | two giving the desired alignment. It can be left undefined if alignment |
347 | is not needed. This option is specific to the Microsft VC++ compiler - | 347 | is not needed. This option is specific to the Microsft VC++ compiler - |
348 | it seems to sometimes cause trouble for the VC++ version 6 compiler. | 348 | it seems to sometimes cause trouble for the VC++ version 6 compiler. |
349 | */ | 349 | */ |
350 | 350 | ||
351 | #if 0 && defined(_MSC_VER) && (_MSC_VER >= 1300) | 351 | #if 0 && defined(_MSC_VER) && (_MSC_VER >= 1300) |
352 | #define TABLE_ALIGN 64 | 352 | #define TABLE_ALIGN 64 |
353 | #endif | 353 | #endif |
354 | 354 | ||
355 | /* 10. INTERNAL TABLE CONFIGURATION | 355 | /* 10. INTERNAL TABLE CONFIGURATION |
356 | 356 | ||
357 | This cipher proceeds by repeating in a number of cycles known as 'rounds' | 357 | This cipher proceeds by repeating in a number of cycles known as 'rounds' |
358 | which are implemented by a round function which can optionally be speeded | 358 | which are implemented by a round function which can optionally be speeded |
359 | up using tables. The basic tables are each 256 32-bit words, with either | 359 | up using tables. The basic tables are each 256 32-bit words, with either |
360 | one or four tables being required for each round function depending on | 360 | one or four tables being required for each round function depending on |
361 | how much speed is required. The encryption and decryption round functions | 361 | how much speed is required. The encryption and decryption round functions |
362 | are different and the last encryption and decrytpion round functions are | 362 | are different and the last encryption and decrytpion round functions are |
363 | different again making four different round functions in all. | 363 | different again making four different round functions in all. |
364 | 364 | ||
365 | This means that: | 365 | This means that: |
366 | 1. Normal encryption and decryption rounds can each use either 0, 1 | 366 | 1. Normal encryption and decryption rounds can each use either 0, 1 |
367 | or 4 tables and table spaces of 0, 1024 or 4096 bytes each. | 367 | or 4 tables and table spaces of 0, 1024 or 4096 bytes each. |
368 | 2. The last encryption and decryption rounds can also use either 0, 1 | 368 | 2. The last encryption and decryption rounds can also use either 0, 1 |
369 | or 4 tables and table spaces of 0, 1024 or 4096 bytes each. | 369 | or 4 tables and table spaces of 0, 1024 or 4096 bytes each. |
370 | 370 | ||
371 | Include or exclude the appropriate definitions below to set the number | 371 | Include or exclude the appropriate definitions below to set the number |
372 | of tables used by this implementation. | 372 | of tables used by this implementation. |
373 | */ | 373 | */ |
374 | 374 | ||
375 | #if 1 /* set tables for the normal encryption round */ | 375 | #if 1 /* set tables for the normal encryption round */ |
376 | #define ENC_ROUND FOUR_TABLES | 376 | #define ENC_ROUND FOUR_TABLES |
377 | #elif 0 | 377 | #elif 0 |
378 | #define ENC_ROUND ONE_TABLE | 378 | #define ENC_ROUND ONE_TABLE |
379 | #else | 379 | #else |
380 | #define ENC_ROUND NO_TABLES | 380 | #define ENC_ROUND NO_TABLES |
381 | #endif | 381 | #endif |
382 | 382 | ||
383 | #if 1 /* set tables for the last encryption round */ | 383 | #if 1 /* set tables for the last encryption round */ |
384 | #define LAST_ENC_ROUND FOUR_TABLES | 384 | #define LAST_ENC_ROUND FOUR_TABLES |
385 | #elif 0 | 385 | #elif 0 |
386 | #define LAST_ENC_ROUND ONE_TABLE | 386 | #define LAST_ENC_ROUND ONE_TABLE |
387 | #else | 387 | #else |
388 | #define LAST_ENC_ROUND NO_TABLES | 388 | #define LAST_ENC_ROUND NO_TABLES |
389 | #endif | 389 | #endif |
390 | 390 | ||
391 | #if 1 /* set tables for the normal decryption round */ | 391 | #if 1 /* set tables for the normal decryption round */ |
392 | #define DEC_ROUND FOUR_TABLES | 392 | #define DEC_ROUND FOUR_TABLES |
393 | #elif 0 | 393 | #elif 0 |
394 | #define DEC_ROUND ONE_TABLE | 394 | #define DEC_ROUND ONE_TABLE |
395 | #else | 395 | #else |
396 | #define DEC_ROUND NO_TABLES | 396 | #define DEC_ROUND NO_TABLES |
397 | #endif | 397 | #endif |
398 | 398 | ||
399 | #if 1 /* set tables for the last decryption round */ | 399 | #if 1 /* set tables for the last decryption round */ |
400 | #define LAST_DEC_ROUND FOUR_TABLES | 400 | #define LAST_DEC_ROUND FOUR_TABLES |
401 | #elif 0 | 401 | #elif 0 |
402 | #define LAST_DEC_ROUND ONE_TABLE | 402 | #define LAST_DEC_ROUND ONE_TABLE |
403 | #else | 403 | #else |
404 | #define LAST_DEC_ROUND NO_TABLES | 404 | #define LAST_DEC_ROUND NO_TABLES |
405 | #endif | 405 | #endif |
406 | 406 | ||
407 | /* The decryption key schedule can be speeded up with tables in the same | 407 | /* The decryption key schedule can be speeded up with tables in the same |
408 | way that the round functions can. Include or exclude the following | 408 | way that the round functions can. Include or exclude the following |
409 | defines to set this requirement. | 409 | defines to set this requirement. |
410 | */ | 410 | */ |
411 | #if 1 | 411 | #if 1 |
412 | #define KEY_SCHED FOUR_TABLES | 412 | #define KEY_SCHED FOUR_TABLES |
413 | #elif 0 | 413 | #elif 0 |
414 | #define KEY_SCHED ONE_TABLE | 414 | #define KEY_SCHED ONE_TABLE |
415 | #else | 415 | #else |
416 | #define KEY_SCHED NO_TABLES | 416 | #define KEY_SCHED NO_TABLES |
417 | #endif | 417 | #endif |
418 | 418 | ||
419 | /* END OF CONFIGURATION OPTIONS */ | 419 | /* END OF CONFIGURATION OPTIONS */ |
420 | 420 | ||
421 | #define RC_LENGTH (5 * (AES_BLOCK_SIZE / 4 - 2)) | 421 | #define RC_LENGTH (5 * (AES_BLOCK_SIZE / 4 - 2)) |
422 | 422 | ||
423 | /* Disable or report errors on some combinations of options */ | 423 | /* Disable or report errors on some combinations of options */ |
424 | 424 | ||
425 | #if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES | 425 | #if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES |
426 | #undef LAST_ENC_ROUND | 426 | #undef LAST_ENC_ROUND |
427 | #define LAST_ENC_ROUND NO_TABLES | 427 | #define LAST_ENC_ROUND NO_TABLES |
428 | #elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES | 428 | #elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES |
429 | #undef LAST_ENC_ROUND | 429 | #undef LAST_ENC_ROUND |
430 | #define LAST_ENC_ROUND ONE_TABLE | 430 | #define LAST_ENC_ROUND ONE_TABLE |
431 | #endif | 431 | #endif |
432 | 432 | ||
433 | #if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE | 433 | #if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE |
434 | #undef ENC_UNROLL | 434 | #undef ENC_UNROLL |
435 | #define ENC_UNROLL NONE | 435 | #define ENC_UNROLL NONE |
436 | #endif | 436 | #endif |
437 | 437 | ||
438 | #if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES | 438 | #if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES |
439 | #undef LAST_DEC_ROUND | 439 | #undef LAST_DEC_ROUND |
440 | #define LAST_DEC_ROUND NO_TABLES | 440 | #define LAST_DEC_ROUND NO_TABLES |
441 | #elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES | 441 | #elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES |
442 | #undef LAST_DEC_ROUND | 442 | #undef LAST_DEC_ROUND |
443 | #define LAST_DEC_ROUND ONE_TABLE | 443 | #define LAST_DEC_ROUND ONE_TABLE |
444 | #endif | 444 | #endif |
445 | 445 | ||
446 | #if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE | 446 | #if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE |
447 | #undef DEC_UNROLL | 447 | #undef DEC_UNROLL |
448 | #define DEC_UNROLL NONE | 448 | #define DEC_UNROLL NONE |
449 | #endif | 449 | #endif |
450 | 450 | ||
451 | /* upr(x,n): rotates bytes within words by n positions, moving bytes to | 451 | /* upr(x,n): rotates bytes within words by n positions, moving bytes to |
452 | higher index positions with wrap around into low positions | 452 | higher index positions with wrap around into low positions |
453 | ups(x,n): moves bytes by n positions to higher index positions in | 453 | ups(x,n): moves bytes by n positions to higher index positions in |
454 | words but without wrap around | 454 | words but without wrap around |
455 | bval(x,n): extracts a byte from a word | 455 | bval(x,n): extracts a byte from a word |
456 | 456 | ||
457 | NOTE: The definitions given here are intended only for use with | 457 | NOTE: The definitions given here are intended only for use with |
458 | unsigned variables and with shift counts that are compile | 458 | unsigned variables and with shift counts that are compile |
459 | time constants | 459 | time constants |
460 | */ | 460 | */ |
461 | 461 | ||
462 | #if (ALGORITHM_BYTE_ORDER == BRG_LITTLE_ENDIAN) | 462 | #if (ALGORITHM_BYTE_ORDER == BRG_LITTLE_ENDIAN) |
463 | #define upr(x,n) (((aes_32t)(x) << (8 * (n))) | ((aes_32t)(x) >> (32 - 8 * (n)))) | 463 | #define upr(x,n) (((aes_32t)(x) << (8 * (n))) | ((aes_32t)(x) >> (32 - 8 * (n)))) |
464 | #define ups(x,n) ((aes_32t) (x) << (8 * (n))) | 464 | #define ups(x,n) ((aes_32t) (x) << (8 * (n))) |
465 | #define bval(x,n) ((aes_08t)((x) >> (8 * (n)))) | 465 | #define bval(x,n) ((aes_08t)((x) >> (8 * (n)))) |
466 | #define bytes2word(b0, b1, b2, b3) \ | 466 | #define bytes2word(b0, b1, b2, b3) \ |
467 | (((aes_32t)(b3) << 24) | ((aes_32t)(b2) << 16) | ((aes_32t)(b1) << 8) | (b0)) | 467 | (((aes_32t)(b3) << 24) | ((aes_32t)(b2) << 16) | ((aes_32t)(b1) << 8) | (b0)) |
468 | #endif | 468 | #endif |
469 | 469 | ||
470 | #if (ALGORITHM_BYTE_ORDER == BRG_BIG_ENDIAN) | 470 | #if (ALGORITHM_BYTE_ORDER == BRG_BIG_ENDIAN) |
471 | #define upr(x,n) (((aes_32t)(x) >> (8 * (n))) | ((aes_32t)(x) << (32 - 8 * (n)))) | 471 | #define upr(x,n) (((aes_32t)(x) >> (8 * (n))) | ((aes_32t)(x) << (32 - 8 * (n)))) |
472 | #define ups(x,n) ((aes_32t) (x) >> (8 * (n)))) | 472 | #define ups(x,n) ((aes_32t) (x) >> (8 * (n)))) |
473 | #define bval(x,n) ((aes_08t)((x) >> (24 - 8 * (n)))) | 473 | #define bval(x,n) ((aes_08t)((x) >> (24 - 8 * (n)))) |
474 | #define bytes2word(b0, b1, b2, b3) \ | 474 | #define bytes2word(b0, b1, b2, b3) \ |
475 | (((aes_32t)(b0) << 24) | ((aes_32t)(b1) << 16) | ((aes_32t)(b2) << 8) | (b3)) | 475 | (((aes_32t)(b0) << 24) | ((aes_32t)(b1) << 16) | ((aes_32t)(b2) << 8) | (b3)) |
476 | #endif | 476 | #endif |
477 | 477 | ||
478 | #if defined(SAFE_IO) | 478 | #if defined(SAFE_IO) |
479 | 479 | ||
480 | #define word_in(x,c) bytes2word(((aes_08t*)(x)+4*c)[0], ((aes_08t*)(x)+4*c)[1], \ | 480 | #define word_in(x,c) bytes2word(((aes_08t*)(x)+4*c)[0], ((aes_08t*)(x)+4*c)[1], \ |
481 | ((aes_08t*)(x)+4*c)[2], ((aes_08t*)(x)+4*c)[3]) | 481 | ((aes_08t*)(x)+4*c)[2], ((aes_08t*)(x)+4*c)[3]) |
482 | #define word_out(x,c,v) { ((aes_08t*)(x)+4*c)[0] = bval(v,0); ((aes_08t*)(x)+4*c)[1] = bval(v,1); \ | 482 | #define word_out(x,c,v) { ((aes_08t*)(x)+4*c)[0] = bval(v,0); ((aes_08t*)(x)+4*c)[1] = bval(v,1); \ |
483 | ((aes_08t*)(x)+4*c)[2] = bval(v,2); ((aes_08t*)(x)+4*c)[3] = bval(v,3); } | 483 | ((aes_08t*)(x)+4*c)[2] = bval(v,2); ((aes_08t*)(x)+4*c)[3] = bval(v,3); } |
484 | 484 | ||
485 | #elif (ALGORITHM_BYTE_ORDER == PLATFORM_BYTE_ORDER) | 485 | #elif (ALGORITHM_BYTE_ORDER == PLATFORM_BYTE_ORDER) |
486 | 486 | ||
487 | #define word_in(x,c) (*((aes_32t*)(x)+(c))) | 487 | #define word_in(x,c) (*((aes_32t*)(x)+(c))) |
488 | #define word_out(x,c,v) (*((aes_32t*)(x)+(c)) = (v)) | 488 | #define word_out(x,c,v) (*((aes_32t*)(x)+(c)) = (v)) |
489 | 489 | ||
490 | #else | 490 | #else |
491 | 491 | ||
492 | #define word_in(x,c) aes_sw32(*((aes_32t*)(x)+(c))) | 492 | #define word_in(x,c) aes_sw32(*((aes_32t*)(x)+(c))) |
493 | #define word_out(x,c,v) (*((aes_32t*)(x)+(c)) = aes_sw32(v)) | 493 | #define word_out(x,c,v) (*((aes_32t*)(x)+(c)) = aes_sw32(v)) |
494 | 494 | ||
495 | #endif | 495 | #endif |
496 | 496 | ||
497 | /* the finite field modular polynomial and elements */ | 497 | /* the finite field modular polynomial and elements */ |
498 | 498 | ||
499 | #define WPOLY 0x011b | 499 | #define WPOLY 0x011b |
500 | #define BPOLY 0x1b | 500 | #define BPOLY 0x1b |
501 | 501 | ||
502 | /* multiply four bytes in GF(2^8) by 'x' {02} in parallel */ | 502 | /* multiply four bytes in GF(2^8) by 'x' {02} in parallel */ |
503 | 503 | ||
504 | #define m1 0x80808080 | 504 | #define m1 0x80808080 |
505 | #define m2 0x7f7f7f7f | 505 | #define m2 0x7f7f7f7f |
506 | #define gf_mulx(x) ((((x) & m2) << 1) ^ ((((x) & m1) >> 7) * BPOLY)) | 506 | #define gf_mulx(x) ((((x) & m2) << 1) ^ ((((x) & m1) >> 7) * BPOLY)) |
507 | 507 | ||
508 | /* The following defines provide alternative definitions of gf_mulx that might | 508 | /* The following defines provide alternative definitions of gf_mulx that might |
509 | give improved performance if a fast 32-bit multiply is not available. Note | 509 | give improved performance if a fast 32-bit multiply is not available. Note |
510 | that a temporary variable u needs to be defined where gf_mulx is used. | 510 | that a temporary variable u needs to be defined where gf_mulx is used. |
511 | 511 | ||
512 | #define gf_mulx(x) (u = (x) & m1, u |= (u >> 1), ((x) & m2) << 1) ^ ((u >> 3) | (u >> 6)) | 512 | #define gf_mulx(x) (u = (x) & m1, u |= (u >> 1), ((x) & m2) << 1) ^ ((u >> 3) | (u >> 6)) |
513 | #define m4 (0x01010101 * BPOLY) | 513 | #define m4 (0x01010101 * BPOLY) |
514 | #define gf_mulx(x) (u = (x) & m1, ((x) & m2) << 1) ^ ((u - (u >> 7)) & m4) | 514 | #define gf_mulx(x) (u = (x) & m1, ((x) & m2) << 1) ^ ((u - (u >> 7)) & m4) |
515 | */ | 515 | */ |
516 | 516 | ||
517 | /* Work out which tables are needed for the different options */ | 517 | /* Work out which tables are needed for the different options */ |
518 | 518 | ||
519 | #ifdef AES_ASM | 519 | #ifdef AES_ASM |
520 | #ifdef ENC_ROUND | 520 | #ifdef ENC_ROUND |
521 | #undef ENC_ROUND | 521 | #undef ENC_ROUND |
522 | #endif | 522 | #endif |
523 | #define ENC_ROUND FOUR_TABLES | 523 | #define ENC_ROUND FOUR_TABLES |
524 | #ifdef LAST_ENC_ROUND | 524 | #ifdef LAST_ENC_ROUND |
525 | #undef LAST_ENC_ROUND | 525 | #undef LAST_ENC_ROUND |
526 | #endif | 526 | #endif |
527 | #define LAST_ENC_ROUND FOUR_TABLES | 527 | #define LAST_ENC_ROUND FOUR_TABLES |
528 | #ifdef DEC_ROUND | 528 | #ifdef DEC_ROUND |
529 | #undef DEC_ROUND | 529 | #undef DEC_ROUND |
530 | #endif | 530 | #endif |
531 | #define DEC_ROUND FOUR_TABLES | 531 | #define DEC_ROUND FOUR_TABLES |
532 | #ifdef LAST_DEC_ROUND | 532 | #ifdef LAST_DEC_ROUND |
533 | #undef LAST_DEC_ROUND | 533 | #undef LAST_DEC_ROUND |
534 | #endif | 534 | #endif |
535 | #define LAST_DEC_ROUND FOUR_TABLES | 535 | #define LAST_DEC_ROUND FOUR_TABLES |
536 | #ifdef KEY_SCHED | 536 | #ifdef KEY_SCHED |
537 | #undef KEY_SCHED | 537 | #undef KEY_SCHED |
538 | #define KEY_SCHED FOUR_TABLES | 538 | #define KEY_SCHED FOUR_TABLES |
539 | #endif | 539 | #endif |
540 | #endif | 540 | #endif |
541 | 541 | ||
542 | #if defined(ENCRYPTION) || defined(AES_ASM) | 542 | #if defined(ENCRYPTION) || defined(AES_ASM) |
543 | #if ENC_ROUND == ONE_TABLE | 543 | #if ENC_ROUND == ONE_TABLE |
544 | #define FT1_SET | 544 | #define FT1_SET |
545 | #elif ENC_ROUND == FOUR_TABLES | 545 | #elif ENC_ROUND == FOUR_TABLES |
546 | #define FT4_SET | 546 | #define FT4_SET |
547 | #else | 547 | #else |
548 | #define SBX_SET | 548 | #define SBX_SET |
549 | #endif | 549 | #endif |
550 | #if LAST_ENC_ROUND == ONE_TABLE | 550 | #if LAST_ENC_ROUND == ONE_TABLE |
551 | #define FL1_SET | 551 | #define FL1_SET |
552 | #elif LAST_ENC_ROUND == FOUR_TABLES | 552 | #elif LAST_ENC_ROUND == FOUR_TABLES |
553 | #define FL4_SET | 553 | #define FL4_SET |
554 | #elif !defined(SBX_SET) | 554 | #elif !defined(SBX_SET) |
555 | #define SBX_SET | 555 | #define SBX_SET |
556 | #endif | 556 | #endif |
557 | #endif | 557 | #endif |
558 | 558 | ||
559 | #if defined(DECRYPTION) || defined(AES_ASM) | 559 | #if defined(DECRYPTION) || defined(AES_ASM) |
560 | #if DEC_ROUND == ONE_TABLE | 560 | #if DEC_ROUND == ONE_TABLE |
561 | #define IT1_SET | 561 | #define IT1_SET |
562 | #elif DEC_ROUND == FOUR_TABLES | 562 | #elif DEC_ROUND == FOUR_TABLES |
563 | #define IT4_SET | 563 | #define IT4_SET |
564 | #else | 564 | #else |
565 | #define ISB_SET | 565 | #define ISB_SET |
566 | #endif | 566 | #endif |
567 | #if LAST_DEC_ROUND == ONE_TABLE | 567 | #if LAST_DEC_ROUND == ONE_TABLE |
568 | #define IL1_SET | 568 | #define IL1_SET |
569 | #elif LAST_DEC_ROUND == FOUR_TABLES | 569 | #elif LAST_DEC_ROUND == FOUR_TABLES |
570 | #define IL4_SET | 570 | #define IL4_SET |
571 | #elif !defined(ISB_SET) | 571 | #elif !defined(ISB_SET) |
572 | #define ISB_SET | 572 | #define ISB_SET |
573 | #endif | 573 | #endif |
574 | #endif | 574 | #endif |
575 | 575 | ||
576 | #if defined(ENCRYPTION_KEY_SCHEDULE) || defined(DECRYPTION_KEY_SCHEDULE) | 576 | #if defined(ENCRYPTION_KEY_SCHEDULE) || defined(DECRYPTION_KEY_SCHEDULE) |
577 | #if KEY_SCHED == ONE_TABLE | 577 | #if KEY_SCHED == ONE_TABLE |
578 | #define LS1_SET | 578 | #define LS1_SET |
579 | #define IM1_SET | 579 | #define IM1_SET |
580 | #elif KEY_SCHED == FOUR_TABLES | 580 | #elif KEY_SCHED == FOUR_TABLES |
581 | #define LS4_SET | 581 | #define LS4_SET |
582 | #define IM4_SET | 582 | #define IM4_SET |
583 | #elif !defined(SBX_SET) | 583 | #elif !defined(SBX_SET) |
584 | #define SBX_SET | 584 | #define SBX_SET |
585 | #endif | 585 | #endif |
586 | #endif | 586 | #endif |
587 | 587 | ||
588 | /* generic definitions of Rijndael macros that use tables */ | 588 | /* generic definitions of Rijndael macros that use tables */ |
589 | 589 | ||
590 | #define no_table(x,box,vf,rf,c) bytes2word( \ | 590 | #define no_table(x,box,vf,rf,c) bytes2word( \ |
591 | box[bval(vf(x,0,c),rf(0,c))], \ | 591 | box[bval(vf(x,0,c),rf(0,c))], \ |
592 | box[bval(vf(x,1,c),rf(1,c))], \ | 592 | box[bval(vf(x,1,c),rf(1,c))], \ |
593 | box[bval(vf(x,2,c),rf(2,c))], \ | 593 | box[bval(vf(x,2,c),rf(2,c))], \ |
594 | box[bval(vf(x,3,c),rf(3,c))]) | 594 | box[bval(vf(x,3,c),rf(3,c))]) |
595 | 595 | ||
596 | #define one_table(x,op,tab,vf,rf,c) \ | 596 | #define one_table(x,op,tab,vf,rf,c) \ |
597 | ( tab[bval(vf(x,0,c),rf(0,c))] \ | 597 | ( tab[bval(vf(x,0,c),rf(0,c))] \ |
598 | ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \ | 598 | ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \ |
599 | ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \ | 599 | ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \ |
600 | ^ op(tab[bval(vf(x,3,c),rf(3,c))],3)) | 600 | ^ op(tab[bval(vf(x,3,c),rf(3,c))],3)) |
601 | 601 | ||
602 | #define four_tables(x,tab,vf,rf,c) \ | 602 | #define four_tables(x,tab,vf,rf,c) \ |
603 | ( tab[0][bval(vf(x,0,c),rf(0,c))] \ | 603 | ( tab[0][bval(vf(x,0,c),rf(0,c))] \ |
604 | ^ tab[1][bval(vf(x,1,c),rf(1,c))] \ | 604 | ^ tab[1][bval(vf(x,1,c),rf(1,c))] \ |
605 | ^ tab[2][bval(vf(x,2,c),rf(2,c))] \ | 605 | ^ tab[2][bval(vf(x,2,c),rf(2,c))] \ |
606 | ^ tab[3][bval(vf(x,3,c),rf(3,c))]) | 606 | ^ tab[3][bval(vf(x,3,c),rf(3,c))]) |
607 | 607 | ||
608 | #define vf1(x,r,c) (x) | 608 | #define vf1(x,r,c) (x) |
609 | #define rf1(r,c) (r) | 609 | #define rf1(r,c) (r) |
610 | #define rf2(r,c) ((8+r-c)&3) | 610 | #define rf2(r,c) ((8+r-c)&3) |
611 | 611 | ||
612 | /* perform forward and inverse column mix operation on four bytes in long word x in */ | 612 | /* perform forward and inverse column mix operation on four bytes in long word x in */ |
613 | /* parallel. NOTE: x must be a simple variable, NOT an expression in these macros. */ | 613 | /* parallel. NOTE: x must be a simple variable, NOT an expression in these macros. */ |
614 | 614 | ||
615 | #if defined(FM4_SET) /* not currently used */ | 615 | #if defined(FM4_SET) /* not currently used */ |
616 | #define fwd_mcol(x) four_tables(x,t_use(f,m),vf1,rf1,0) | 616 | #define fwd_mcol(x) four_tables(x,t_use(f,m),vf1,rf1,0) |
617 | #elif defined(FM1_SET) /* not currently used */ | 617 | #elif defined(FM1_SET) /* not currently used */ |
618 | #define fwd_mcol(x) one_table(x,upr,t_use(f,m),vf1,rf1,0) | 618 | #define fwd_mcol(x) one_table(x,upr,t_use(f,m),vf1,rf1,0) |
619 | #else | 619 | #else |
620 | #define dec_fmvars aes_32t g2 | 620 | #define dec_fmvars aes_32t g2 |
621 | #define fwd_mcol(x) (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1)) | 621 | #define fwd_mcol(x) (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1)) |
622 | #endif | 622 | #endif |
623 | 623 | ||
624 | #if defined(IM4_SET) | 624 | #if defined(IM4_SET) |
625 | #define inv_mcol(x) four_tables(x,t_use(i,m),vf1,rf1,0) | 625 | #define inv_mcol(x) four_tables(x,t_use(i,m),vf1,rf1,0) |
626 | #elif defined(IM1_SET) | 626 | #elif defined(IM1_SET) |
627 | #define inv_mcol(x) one_table(x,upr,t_use(i,m),vf1,rf1,0) | 627 | #define inv_mcol(x) one_table(x,upr,t_use(i,m),vf1,rf1,0) |
628 | #else | 628 | #else |
629 | #define dec_imvars aes_32t g2, g4, g9 | 629 | #define dec_imvars aes_32t g2, g4, g9 |
630 | #define inv_mcol(x) (g2 = gf_mulx(x), g4 = gf_mulx(g2), g9 = (x) ^ gf_mulx(g4), g4 ^= g9, \ | 630 | #define inv_mcol(x) (g2 = gf_mulx(x), g4 = gf_mulx(g2), g9 = (x) ^ gf_mulx(g4), g4 ^= g9, \ |
631 | (x) ^ g2 ^ g4 ^ upr(g2 ^ g9, 3) ^ upr(g4, 2) ^ upr(g9, 1)) | 631 | (x) ^ g2 ^ g4 ^ upr(g2 ^ g9, 3) ^ upr(g4, 2) ^ upr(g9, 1)) |
632 | #endif | 632 | #endif |
633 | 633 | ||
634 | #if defined(FL4_SET) | 634 | #if defined(FL4_SET) |
635 | #define ls_box(x,c) four_tables(x,t_use(f,l),vf1,rf2,c) | 635 | #define ls_box(x,c) four_tables(x,t_use(f,l),vf1,rf2,c) |
636 | #elif defined(LS4_SET) | 636 | #elif defined(LS4_SET) |
637 | #define ls_box(x,c) four_tables(x,t_use(l,s),vf1,rf2,c) | 637 | #define ls_box(x,c) four_tables(x,t_use(l,s),vf1,rf2,c) |
638 | #elif defined(FL1_SET) | 638 | #elif defined(FL1_SET) |
639 | #define ls_box(x,c) one_table(x,upr,t_use(f,l),vf1,rf2,c) | 639 | #define ls_box(x,c) one_table(x,upr,t_use(f,l),vf1,rf2,c) |
640 | #elif defined(LS1_SET) | 640 | #elif defined(LS1_SET) |
641 | #define ls_box(x,c) one_table(x,upr,t_use(l,s),vf1,rf2,c) | 641 | #define ls_box(x,c) one_table(x,upr,t_use(l,s),vf1,rf2,c) |
642 | #else | 642 | #else |
643 | #define ls_box(x,c) no_table(x,t_use(s,box),vf1,rf2,c) | 643 | #define ls_box(x,c) no_table(x,t_use(s,box),vf1,rf2,c) |
644 | #endif | 644 | #endif |
645 | 645 | ||
646 | /* If there are no global variables, the definitions here can be | 646 | /* If there are no global variables, the definitions here can be |
647 | used to put the AES tables in a structure so that a pointer | 647 | used to put the AES tables in a structure so that a pointer |
648 | can then be added to the AES context to pass them to the AES | 648 | can then be added to the AES context to pass them to the AES |
649 | routines that need them. If this facility is used, the calling | 649 | routines that need them. If this facility is used, the calling |
650 | program has to ensure that this pointer is managed appropriately. | 650 | program has to ensure that this pointer is managed appropriately. |
651 | In particular, the value of the t_dec(in,it) item in the table | 651 | In particular, the value of the t_dec(in,it) item in the table |
652 | structure must be set to zero in order to ensure that the tables | 652 | structure must be set to zero in order to ensure that the tables |
653 | are initialised. In practice the three code sequences in aeskey.c | 653 | are initialised. In practice the three code sequences in aeskey.c |
654 | that control the calls to gen_tabs() and the gen_tabs() routine | 654 | that control the calls to gen_tabs() and the gen_tabs() routine |
655 | itself will have to be changed for a specific implementation. If | 655 | itself will have to be changed for a specific implementation. If |
656 | global variables are available it will generally be preferable to | 656 | global variables are available it will generally be preferable to |
657 | use them with the precomputed FIXED_TABLES option that uses static | 657 | use them with the precomputed FIXED_TABLES option that uses static |
658 | global tables. | 658 | global tables. |
659 | 659 | ||
660 | The following defines can be used to control the way the tables | 660 | The following defines can be used to control the way the tables |
661 | are defined, initialised and used in embedded environments that | 661 | are defined, initialised and used in embedded environments that |
662 | require special features for these purposes | 662 | require special features for these purposes |
663 | 663 | ||
664 | the 't_dec' construction is used to declare fixed table arrays | 664 | the 't_dec' construction is used to declare fixed table arrays |
665 | the 't_set' construction is used to set fixed table values | 665 | the 't_set' construction is used to set fixed table values |
666 | the 't_use' construction is used to access fixed table values | 666 | the 't_use' construction is used to access fixed table values |
667 | 667 | ||
668 | 256 byte tables: | 668 | 256 byte tables: |
669 | 669 | ||
670 | t_xxx(s,box) => forward S box | 670 | t_xxx(s,box) => forward S box |
671 | t_xxx(i,box) => inverse S box | 671 | t_xxx(i,box) => inverse S box |
672 | 672 | ||
673 | 256 32-bit word OR 4 x 256 32-bit word tables: | 673 | 256 32-bit word OR 4 x 256 32-bit word tables: |
674 | 674 | ||
675 | t_xxx(f,n) => forward normal round | 675 | t_xxx(f,n) => forward normal round |
676 | t_xxx(f,l) => forward last round | 676 | t_xxx(f,l) => forward last round |
677 | t_xxx(i,n) => inverse normal round | 677 | t_xxx(i,n) => inverse normal round |
678 | t_xxx(i,l) => inverse last round | 678 | t_xxx(i,l) => inverse last round |
679 | t_xxx(l,s) => key schedule table | 679 | t_xxx(l,s) => key schedule table |
680 | t_xxx(i,m) => key schedule table | 680 | t_xxx(i,m) => key schedule table |
681 | 681 | ||
682 | Other variables and tables: | 682 | Other variables and tables: |
683 | 683 | ||
684 | t_xxx(r,c) => the rcon table | 684 | t_xxx(r,c) => the rcon table |
685 | */ | 685 | */ |
686 | 686 | ||
687 | #define t_dec(m,n) t_##m##n | 687 | #define t_dec(m,n) t_##m##n |
688 | #define t_set(m,n) t_##m##n | 688 | #define t_set(m,n) t_##m##n |
689 | #define t_use(m,n) t_##m##n | 689 | #define t_use(m,n) t_##m##n |
690 | 690 | ||
691 | #if defined(DO_TABLES) /* declare and instantiate tables */ | 691 | #if defined(DO_TABLES) /* declare and instantiate tables */ |
692 | 692 | ||
693 | /* finite field arithmetic operations for table generation */ | 693 | /* finite field arithmetic operations for table generation */ |
694 | 694 | ||
695 | #if defined(FIXED_TABLES) || !defined(FF_TABLES) | 695 | #if defined(FIXED_TABLES) || !defined(FF_TABLES) |
696 | 696 | ||
697 | #define f2(x) ((x<<1) ^ (((x>>7) & 1) * WPOLY)) | 697 | #define f2(x) ((x<<1) ^ (((x>>7) & 1) * WPOLY)) |
698 | #define f4(x) ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY)) | 698 | #define f4(x) ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY)) |
699 | #define f8(x) ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) \ | 699 | #define f8(x) ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) \ |
700 | ^ (((x>>5) & 4) * WPOLY)) | 700 | ^ (((x>>5) & 4) * WPOLY)) |
701 | #define f3(x) (f2(x) ^ x) | 701 | #define f3(x) (f2(x) ^ x) |
702 | #define f9(x) (f8(x) ^ x) | 702 | #define f9(x) (f8(x) ^ x) |
703 | #define fb(x) (f8(x) ^ f2(x) ^ x) | 703 | #define fb(x) (f8(x) ^ f2(x) ^ x) |
704 | #define fd(x) (f8(x) ^ f4(x) ^ x) | 704 | #define fd(x) (f8(x) ^ f4(x) ^ x) |
705 | #define fe(x) (f8(x) ^ f4(x) ^ f2(x)) | 705 | #define fe(x) (f8(x) ^ f4(x) ^ f2(x)) |
706 | 706 | ||
707 | #else | 707 | #else |
708 | 708 | ||
709 | #define f2(x) ((x) ? pow[log[x] + 0x19] : 0) | 709 | #define f2(x) ((x) ? pow[log[x] + 0x19] : 0) |
710 | #define f3(x) ((x) ? pow[log[x] + 0x01] : 0) | 710 | #define f3(x) ((x) ? pow[log[x] + 0x01] : 0) |
711 | #define f9(x) ((x) ? pow[log[x] + 0xc7] : 0) | 711 | #define f9(x) ((x) ? pow[log[x] + 0xc7] : 0) |
712 | #define fb(x) ((x) ? pow[log[x] + 0x68] : 0) | 712 | #define fb(x) ((x) ? pow[log[x] + 0x68] : 0) |
713 | #define fd(x) ((x) ? pow[log[x] + 0xee] : 0) | 713 | #define fd(x) ((x) ? pow[log[x] + 0xee] : 0) |
714 | #define fe(x) ((x) ? pow[log[x] + 0xdf] : 0) | 714 | #define fe(x) ((x) ? pow[log[x] + 0xdf] : 0) |
715 | #define fi(x) ((x) ? pow[ 255 - log[x]] : 0) | 715 | #define fi(x) ((x) ? pow[ 255 - log[x]] : 0) |
716 | 716 | ||
717 | #endif | 717 | #endif |
718 | 718 | ||
719 | #if defined(FIXED_TABLES) /* declare and set values for static tables */ | 719 | #if defined(FIXED_TABLES) /* declare and set values for static tables */ |
720 | 720 | ||
721 | #define sb_data(w) \ | 721 | #define sb_data(w) \ |
722 | w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\ | 722 | w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\ |
723 | w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\ | 723 | w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\ |
724 | w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\ | 724 | w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\ |
725 | w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\ | 725 | w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\ |
726 | w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\ | 726 | w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\ |
727 | w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\ | 727 | w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\ |
728 | w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\ | 728 | w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\ |
729 | w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\ | 729 | w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\ |
730 | w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\ | 730 | w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\ |
731 | w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\ | 731 | w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\ |
732 | w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\ | 732 | w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\ |
733 | w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\ | 733 | w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\ |
734 | w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\ | 734 | w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\ |
735 | w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\ | 735 | w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\ |
736 | w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\ | 736 | w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\ |
737 | w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\ | 737 | w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\ |
738 | w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\ | 738 | w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\ |
739 | w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\ | 739 | w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\ |
740 | w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\ | 740 | w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\ |
741 | w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\ | 741 | w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\ |
742 | w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\ | 742 | w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\ |
743 | w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\ | 743 | w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\ |
744 | w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\ | 744 | w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\ |
745 | w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\ | 745 | w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\ |
746 | w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\ | 746 | w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\ |
747 | w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\ | 747 | w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\ |
748 | w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\ | 748 | w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\ |
749 | w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\ | 749 | w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\ |
750 | w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\ | 750 | w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\ |
751 | w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\ | 751 | w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\ |
752 | w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\ | 752 | w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\ |
753 | w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) | 753 | w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) |
754 | 754 | ||
755 | #define isb_data(w) \ | 755 | #define isb_data(w) \ |
756 | w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\ | 756 | w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\ |
757 | w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\ | 757 | w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\ |
758 | w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\ | 758 | w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\ |
759 | w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\ | 759 | w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\ |
760 | w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\ | 760 | w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\ |
761 | w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\ | 761 | w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\ |
762 | w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\ | 762 | w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\ |
763 | w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\ | 763 | w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\ |
764 | w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\ | 764 | w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\ |
765 | w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\ | 765 | w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\ |
766 | w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\ | 766 | w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\ |
767 | w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\ | 767 | w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\ |
768 | w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\ | 768 | w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\ |
769 | w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\ | 769 | w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\ |
770 | w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\ | 770 | w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\ |
771 | w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\ | 771 | w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\ |
772 | w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\ | 772 | w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\ |
773 | w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\ | 773 | w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\ |
774 | w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\ | 774 | w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\ |
775 | w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\ | 775 | w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\ |
776 | w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\ | 776 | w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\ |
777 | w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\ | 777 | w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\ |
778 | w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\ | 778 | w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\ |
779 | w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\ | 779 | w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\ |
780 | w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\ | 780 | w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\ |
781 | w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\ | 781 | w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\ |
782 | w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\ | 782 | w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\ |
783 | w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\ | 783 | w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\ |
784 | w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\ | 784 | w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\ |
785 | w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\ | 785 | w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\ |
786 | w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\ | 786 | w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\ |
787 | w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d), | 787 | w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d), |
788 | 788 | ||
789 | #define mm_data(w) \ | 789 | #define mm_data(w) \ |
790 | w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\ | 790 | w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\ |
791 | w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\ | 791 | w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\ |
792 | w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\ | 792 | w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\ |
793 | w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\ | 793 | w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\ |
794 | w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\ | 794 | w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\ |
795 | w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\ | 795 | w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\ |
796 | w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\ | 796 | w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\ |
797 | w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\ | 797 | w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\ |
798 | w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\ | 798 | w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\ |
799 | w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\ | 799 | w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\ |
800 | w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\ | 800 | w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\ |
801 | w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\ | 801 | w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\ |
802 | w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\ | 802 | w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\ |
803 | w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\ | 803 | w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\ |
804 | w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\ | 804 | w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\ |
805 | w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\ | 805 | w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\ |
806 | w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\ | 806 | w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\ |
807 | w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\ | 807 | w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\ |
808 | w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\ | 808 | w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\ |
809 | w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\ | 809 | w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\ |
810 | w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\ | 810 | w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\ |
811 | w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\ | 811 | w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\ |
812 | w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\ | 812 | w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\ |
813 | w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\ | 813 | w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\ |
814 | w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\ | 814 | w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\ |
815 | w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\ | 815 | w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\ |
816 | w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\ | 816 | w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\ |
817 | w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\ | 817 | w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\ |
818 | w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\ | 818 | w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\ |
819 | w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\ | 819 | w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\ |
820 | w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\ | 820 | w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\ |
821 | w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) | 821 | w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) |
822 | 822 | ||
823 | #define h0(x) (x) | 823 | #define h0(x) (x) |
824 | 824 | ||
825 | /* These defines are used to ensure tables are generated in the | 825 | /* These defines are used to ensure tables are generated in the |
826 | right format depending on the internal byte order required | 826 | right format depending on the internal byte order required |
827 | */ | 827 | */ |
828 | 828 | ||
829 | #define w0(p) bytes2word(p, 0, 0, 0) | 829 | #define w0(p) bytes2word(p, 0, 0, 0) |
830 | #define w1(p) bytes2word(0, p, 0, 0) | 830 | #define w1(p) bytes2word(0, p, 0, 0) |
831 | #define w2(p) bytes2word(0, 0, p, 0) | 831 | #define w2(p) bytes2word(0, 0, p, 0) |
832 | #define w3(p) bytes2word(0, 0, 0, p) | 832 | #define w3(p) bytes2word(0, 0, 0, p) |
833 | 833 | ||
834 | #define u0(p) bytes2word(f2(p), p, p, f3(p)) | 834 | #define u0(p) bytes2word(f2(p), p, p, f3(p)) |
835 | #define u1(p) bytes2word(f3(p), f2(p), p, p) | 835 | #define u1(p) bytes2word(f3(p), f2(p), p, p) |
836 | #define u2(p) bytes2word(p, f3(p), f2(p), p) | 836 | #define u2(p) bytes2word(p, f3(p), f2(p), p) |
837 | #define u3(p) bytes2word(p, p, f3(p), f2(p)) | 837 | #define u3(p) bytes2word(p, p, f3(p), f2(p)) |
838 | 838 | ||
839 | #define v0(p) bytes2word(fe(p), f9(p), fd(p), fb(p)) | 839 | #define v0(p) bytes2word(fe(p), f9(p), fd(p), fb(p)) |
840 | #define v1(p) bytes2word(fb(p), fe(p), f9(p), fd(p)) | 840 | #define v1(p) bytes2word(fb(p), fe(p), f9(p), fd(p)) |
841 | #define v2(p) bytes2word(fd(p), fb(p), fe(p), f9(p)) | 841 | #define v2(p) bytes2word(fd(p), fb(p), fe(p), f9(p)) |
842 | #define v3(p) bytes2word(f9(p), fd(p), fb(p), fe(p)) | 842 | #define v3(p) bytes2word(f9(p), fd(p), fb(p), fe(p)) |
843 | 843 | ||
844 | const aes_32t t_dec(r,c)[RC_LENGTH] = | 844 | const aes_32t t_dec(r,c)[RC_LENGTH] = |
845 | { | 845 | { |
846 | w0(0x01), w0(0x02), w0(0x04), w0(0x08), w0(0x10), | 846 | w0(0x01), w0(0x02), w0(0x04), w0(0x08), w0(0x10), |
847 | w0(0x20), w0(0x40), w0(0x80), w0(0x1b), w0(0x36) | 847 | w0(0x20), w0(0x40), w0(0x80), w0(0x1b), w0(0x36) |
848 | }; | 848 | }; |
849 | 849 | ||
850 | #define d_1(t,n,b,v) const t n[256] = { b(v##0) } | 850 | #define d_1(t,n,b,v) const t n[256] = { b(v##0) } |
851 | #define d_4(t,n,b,v) const t n[4][256] = { { b(v##0) }, { b(v##1) }, { b(v##2) }, { b(v##3) } } | 851 | #define d_4(t,n,b,v) const t n[4][256] = { { b(v##0) }, { b(v##1) }, { b(v##2) }, { b(v##3) } } |
852 | 852 | ||
853 | #else /* declare and instantiate tables for dynamic value generation in in tab.c */ | 853 | #else /* declare and instantiate tables for dynamic value generation in in tab.c */ |
854 | 854 | ||
855 | aes_32t t_dec(r,c)[RC_LENGTH]; | 855 | aes_32t t_dec(r,c)[RC_LENGTH]; |
856 | 856 | ||
857 | #define d_1(t,n,b,v) t n[256] | 857 | #define d_1(t,n,b,v) t n[256] |
858 | #define d_4(t,n,b,v) t n[4][256] | 858 | #define d_4(t,n,b,v) t n[4][256] |
859 | 859 | ||
860 | #endif | 860 | #endif |
861 | 861 | ||
862 | #else /* declare tables without instantiation */ | 862 | #else /* declare tables without instantiation */ |
863 | 863 | ||
864 | #if defined(FIXED_TABLES) | 864 | #if defined(FIXED_TABLES) |
865 | 865 | ||
866 | extern const aes_32t t_dec(r,c)[RC_LENGTH]; | 866 | extern const aes_32t t_dec(r,c)[RC_LENGTH]; |
867 | 867 | ||
868 | #if defined(_MSC_VER) && defined(TABLE_ALIGN) | 868 | #if defined(_MSC_VER) && defined(TABLE_ALIGN) |
869 | #define d_1(t,n,b,v) extern __declspec(align(TABLE_ALIGN)) const t n[256] | 869 | #define d_1(t,n,b,v) extern __declspec(align(TABLE_ALIGN)) const t n[256] |
870 | #define d_4(t,n,b,v) extern __declspec(align(TABLE_ALIGN)) const t n[4][256] | 870 | #define d_4(t,n,b,v) extern __declspec(align(TABLE_ALIGN)) const t n[4][256] |
871 | #else | 871 | #else |
872 | #define d_1(t,n,b,v) extern const t n[256] | 872 | #define d_1(t,n,b,v) extern const t n[256] |
873 | #define d_4(t,n,b,v) extern const t n[4][256] | 873 | #define d_4(t,n,b,v) extern const t n[4][256] |
874 | #endif | 874 | #endif |
875 | #else | 875 | #else |
876 | 876 | ||
877 | extern aes_32t t_dec(r,c)[RC_LENGTH]; | 877 | extern aes_32t t_dec(r,c)[RC_LENGTH]; |
878 | 878 | ||
879 | #if defined(_MSC_VER) && defined(TABLE_ALIGN) | 879 | #if defined(_MSC_VER) && defined(TABLE_ALIGN) |
880 | #define d_1(t,n,b,v) extern __declspec(align(TABLE_ALIGN)) t n[256] | 880 | #define d_1(t,n,b,v) extern __declspec(align(TABLE_ALIGN)) t n[256] |
881 | #define d_4(t,n,b,v) extern __declspec(align(TABLE_ALIGN)) t n[4][256] | 881 | #define d_4(t,n,b,v) extern __declspec(align(TABLE_ALIGN)) t n[4][256] |
882 | #else | 882 | #else |
883 | #define d_1(t,n,b,v) extern t n[256] | 883 | #define d_1(t,n,b,v) extern t n[256] |
884 | #define d_4(t,n,b,v) extern t n[4][256] | 884 | #define d_4(t,n,b,v) extern t n[4][256] |
885 | #endif | 885 | #endif |
886 | #endif | 886 | #endif |
887 | 887 | ||
888 | #endif | 888 | #endif |
889 | 889 | ||
890 | #ifdef SBX_SET | 890 | #ifdef SBX_SET |
891 | d_1(aes_08t, t_dec(s,box), sb_data, h); | 891 | d_1(aes_08t, t_dec(s,box), sb_data, h); |
892 | #endif | 892 | #endif |
893 | #ifdef ISB_SET | 893 | #ifdef ISB_SET |
894 | d_1(aes_08t, t_dec(i,box), isb_data, h); | 894 | d_1(aes_08t, t_dec(i,box), isb_data, h); |
895 | #endif | 895 | #endif |
896 | 896 | ||
897 | #ifdef FT1_SET | 897 | #ifdef FT1_SET |
898 | d_1(aes_32t, t_dec(f,n), sb_data, u); | 898 | d_1(aes_32t, t_dec(f,n), sb_data, u); |
899 | #endif | 899 | #endif |
900 | #ifdef FT4_SET | 900 | #ifdef FT4_SET |
901 | d_4(aes_32t, t_dec(f,n), sb_data, u); | 901 | d_4(aes_32t, t_dec(f,n), sb_data, u); |
902 | #endif | 902 | #endif |
903 | 903 | ||
904 | #ifdef FL1_SET | 904 | #ifdef FL1_SET |
905 | d_1(aes_32t, t_dec(f,l), sb_data, w); | 905 | d_1(aes_32t, t_dec(f,l), sb_data, w); |
906 | #endif | 906 | #endif |
907 | #ifdef FL4_SET | 907 | #ifdef FL4_SET |
908 | d_4(aes_32t, t_dec(f,l), sb_data, w); | 908 | d_4(aes_32t, t_dec(f,l), sb_data, w); |
909 | #endif | 909 | #endif |
910 | 910 | ||
911 | #ifdef IT1_SET | 911 | #ifdef IT1_SET |
912 | d_1(aes_32t, t_dec(i,n), isb_data, v); | 912 | d_1(aes_32t, t_dec(i,n), isb_data, v); |
913 | #endif | 913 | #endif |
914 | #ifdef IT4_SET | 914 | #ifdef IT4_SET |
915 | d_4(aes_32t, t_dec(i,n), isb_data, v); | 915 | d_4(aes_32t, t_dec(i,n), isb_data, v); |
916 | #endif | 916 | #endif |
917 | 917 | ||
918 | #ifdef IL1_SET | 918 | #ifdef IL1_SET |
919 | d_1(aes_32t, t_dec(i,l), isb_data, w); | 919 | d_1(aes_32t, t_dec(i,l), isb_data, w); |
920 | #endif | 920 | #endif |
921 | #ifdef IL4_SET | 921 | #ifdef IL4_SET |
922 | d_4(aes_32t, t_dec(i,l), isb_data, w); | 922 | d_4(aes_32t, t_dec(i,l), isb_data, w); |
923 | #endif | 923 | #endif |
924 | 924 | ||
925 | #ifdef LS1_SET | 925 | #ifdef LS1_SET |
926 | #ifdef FL1_SET | 926 | #ifdef FL1_SET |
927 | #undef LS1_SET | 927 | #undef LS1_SET |
928 | #else | 928 | #else |
929 | d_1(aes_32t, t_dec(l,s), sb_data, w); | 929 | d_1(aes_32t, t_dec(l,s), sb_data, w); |
930 | #endif | 930 | #endif |
931 | #endif | 931 | #endif |
932 | 932 | ||
933 | #ifdef LS4_SET | 933 | #ifdef LS4_SET |
934 | #ifdef FL4_SET | 934 | #ifdef FL4_SET |
935 | #undef LS4_SET | 935 | #undef LS4_SET |
936 | #else | 936 | #else |
937 | d_4(aes_32t, t_dec(l,s), sb_data, w); | 937 | d_4(aes_32t, t_dec(l,s), sb_data, w); |
938 | #endif | 938 | #endif |
939 | #endif | 939 | #endif |
940 | 940 | ||
941 | #ifdef IM1_SET | 941 | #ifdef IM1_SET |
942 | d_1(aes_32t, t_dec(i,m), mm_data, v); | 942 | d_1(aes_32t, t_dec(i,m), mm_data, v); |
943 | #endif | 943 | #endif |
944 | #ifdef IM4_SET | 944 | #ifdef IM4_SET |
945 | d_4(aes_32t, t_dec(i,m), mm_data, v); | 945 | d_4(aes_32t, t_dec(i,m), mm_data, v); |
946 | #endif | 946 | #endif |
947 | 947 | ||
948 | #endif | 948 | #endif |
949 | 949 | ||