xref: /illumos-gate/usr/src/common/crypto/aes/amd64/aestab.h (revision 598f4ceed9327d2d6c2325dd67cae3aa06f7fea6)
1 /*
2  * ---------------------------------------------------------------------------
3  * Copyright (c) 1998-2007, Brian Gladman, Worcester, UK. All rights reserved.
4  *
5  * LICENSE TERMS
6  *
7  * The free distribution and use of this software is allowed (with or without
8  * changes) provided that:
9  *
10  *  1. source code distributions include the above copyright notice, this
11  *     list of conditions and the following disclaimer;
12  *
13  *  2. binary distributions include the above copyright notice, this list
14  *     of conditions and the following disclaimer in their documentation;
15  *
16  *  3. the name of the copyright holder is not used to endorse products
17  *     built using this software without specific written permission.
18  *
19  * DISCLAIMER
20  *
21  * This software is provided 'as is' with no explicit or implied warranties
22  * in respect of its properties, including, but not limited to, correctness
23  * and/or fitness for purpose.
24  * ---------------------------------------------------------------------------
25  * Issue Date: 20/12/2007
26  *
27  * This file contains the code for declaring the tables needed to implement
28  * AES. The file aesopt.h is assumed to be included before this header file.
29  * If there are no global variables, the definitions here can be used to put
30  * the AES tables in a structure so that a pointer can then be added to the
31  * AES context to pass them to the AES routines that need them.   If this
32  * facility is used, the calling program has to ensure that this pointer is
33  * managed appropriately.  In particular, the value of the t_dec(in, it) item
34  * in the table structure must be set to zero in order to ensure that the
35  * tables are initialised. In practice the three code sequences in aeskey.c
36  * that control the calls to aes_init() and the aes_init() routine itself will
37  * have to be changed for a specific implementation. If global variables are
38  * available it will generally be preferable to use them with the precomputed
39  * FIXED_TABLES option that uses static global tables.
40  *
41  * The following defines can be used to control the way the tables
42  * are defined, initialised and used in embedded environments that
43  * require special features for these purposes
44  *
45  *    the 't_dec' construction is used to declare fixed table arrays
46  *    the 't_set' construction is used to set fixed table values
47  *    the 't_use' construction is used to access fixed table values
48  *
49  *    256 byte tables:
50  *
51  *        t_xxx(s, box)    => forward S box
52  *        t_xxx(i, box)    => inverse S box
53  *
54  *    256 32-bit word OR 4 x 256 32-bit word tables:
55  *
56  *        t_xxx(f, n)      => forward normal round
57  *        t_xxx(f, l)      => forward last round
58  *        t_xxx(i, n)      => inverse normal round
59  *        t_xxx(i, l)      => inverse last round
60  *        t_xxx(l, s)      => key schedule table
61  *        t_xxx(i, m)      => key schedule table
62  *
63  *    Other variables and tables:
64  *
65  *        t_xxx(r, c)      => the rcon table
66  */
67 
68 /*
69  * OpenSolaris OS modifications
70  *
71  * 1. Added __cplusplus and _AESTAB_H header guards
72  * 2. Added header file sys/types.h
73  * 3. Remove code defined for _MSC_VER
74  * 4. Changed all variables to "static const"
75  * 5. Changed uint_8t and uint_32t to uint8_t and uint32_t
76  * 6. Cstyled and hdrchk code
77  */
78 
79 #ifndef _AESTAB_H
80 #define	_AESTAB_H
81 
82 #pragma ident	"%Z%%M%	%I%	%E% SMI"
83 
84 #ifdef	__cplusplus
85 extern "C" {
86 #endif
87 
88 #include <sys/types.h>
89 
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
93 
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);
99 #else
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];
103 #endif
104 
105 #if defined(SBX_SET)
106 	d_1(uint8_t, t_dec(s, box), sb_data, h0);
107 #endif
108 #if defined(ISB_SET)
109 	d_1(uint8_t, t_dec(i, box), isb_data, h0);
110 #endif
111 
112 #if defined(FT1_SET)
113 	d_1(uint32_t, t_dec(f, n), sb_data, u0);
114 #endif
115 #if defined(FT4_SET)
116 	d_4(uint32_t, t_dec(f, n), sb_data, u0, u1, u2, u3);
117 #endif
118 
119 #if defined(FL1_SET)
120 	d_1(uint32_t, t_dec(f, l), sb_data, w0);
121 #endif
122 #if defined(FL4_SET)
123 	d_4(uint32_t, t_dec(f, l), sb_data, w0, w1, w2, w3);
124 #endif
125 
126 #if defined(IT1_SET)
127 	d_1(uint32_t, t_dec(i, n), isb_data, v0);
128 #endif
129 #if defined(IT4_SET)
130 	d_4(uint32_t, t_dec(i, n), isb_data, v0, v1, v2, v3);
131 #endif
132 
133 #if defined(IL1_SET)
134 	d_1(uint32_t, t_dec(i, l), isb_data, w0);
135 #endif
136 #if defined(IL4_SET)
137 	d_4(uint32_t, t_dec(i, l), isb_data, w0, w1, w2, w3);
138 #endif
139 
140 #if defined(LS1_SET)
141 #if defined(FL1_SET)
142 #undef  LS1_SET
143 #else
144 	d_1(uint32_t, t_dec(l, s), sb_data, w0);
145 #endif
146 #endif
147 
148 #if defined(LS4_SET)
149 #if defined(FL4_SET)
150 #undef  LS4_SET
151 #else
152 	d_4(uint32_t, t_dec(l, s), sb_data, w0, w1, w2, w3);
153 #endif
154 #endif
155 
156 #if defined(IM1_SET)
157 	d_1(uint32_t, t_dec(i, m), mm_data, v0);
158 #endif
159 #if defined(IM4_SET)
160 	d_4(uint32_t, t_dec(i, m), mm_data, v0, v1, v2, v3);
161 #endif
162 
163 #ifdef	__cplusplus
164 }
165 #endif
166 
167 #endif	/* _AESTAB_H */
168