OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * (C) Copyright 2010 | |
3 * NVIDIA Corporation <www.nvidia.com> | |
4 * | |
5 * See file CREDITS for list of people who contributed to this | |
6 * project. | |
7 * | |
8 * This program is free software; you can redistribute it and/or | |
9 * modify it under the terms of the GNU General Public License as | |
10 * published by the Free Software Foundation; either version 2 of | |
11 * the License, or (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
21 * MA 02111-1307 USA | |
22 */ | |
23 | |
24 /* advanced encryption standard | |
25 * author: karl malbrain, malbrain@yahoo.com | |
26 */ | |
27 | |
28 /* | |
29 This work, including the source code, documentation | |
30 and related data, is placed into the public domain. | |
31 | |
32 The orginal author is Karl Malbrain. | |
33 | |
Tom Warren
2010/11/12 00:12:40
If Karl wrote this, his copyright should be includ
yelin
2010/11/15 23:21:21
Can not find any copyright from Karl on the web.
| |
34 THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY | |
35 OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF | |
36 MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, | |
37 ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE | |
38 RESULTING FROM THE USE, MODIFICATION, OR | |
39 REDISTRIBUTION OF THIS SOFTWARE. | |
40 */ | |
41 | |
42 /* | |
43 * Modifications by NVIDIA: | |
44 * - Created nvaes_ref.h header. | |
45 * - Replaced type definitions with NVIDIA standard types. | |
46 * - Removed unneeded code that turns this source file into an executable. | |
47 * - Created function prototypes for some of the functions. | |
48 * - Reformatted the code to conform to coding conventions. | |
49 */ | |
50 | |
51 #include <common.h> | |
52 #include "nvaes_ref.h" | |
53 | |
54 static void shift_rows (NvU8 *state); | |
55 static void inv_shift_rows (NvU8 *state); | |
56 static void mix_sub_columns (NvU8 *state); | |
57 static void inv_mix_sub_columns(NvU8 *state); | |
58 static void add_round_key (NvU32 *state, NvU32 *key); | |
59 | |
60 static NvU8 s_Sbox[256] = | |
61 { /* forward s-box */ | |
62 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, | |
63 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, | |
64 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, | |
65 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, | |
66 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, | |
67 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, | |
68 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, | |
69 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, | |
70 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, | |
71 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, | |
72 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, | |
73 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, | |
74 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, | |
75 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, | |
76 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, | |
77 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, | |
78 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, | |
79 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, | |
80 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, | |
81 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, | |
82 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, | |
83 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, | |
84 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, | |
85 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, | |
86 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, | |
87 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, | |
88 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, | |
89 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, | |
90 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, | |
91 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, | |
92 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, | |
93 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 | |
94 }; | |
95 | |
96 static NvU8 s_InvSbox[256] = | |
97 { /* inverse s-box */ | |
98 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, | |
99 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, | |
100 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, | |
101 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, | |
102 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, | |
103 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, | |
104 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, | |
105 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, | |
106 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, | |
107 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, | |
108 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, | |
109 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, | |
110 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, | |
111 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, | |
112 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, | |
113 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, | |
114 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, | |
115 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, | |
116 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, | |
117 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, | |
118 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, | |
119 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, | |
120 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, | |
121 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, | |
122 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, | |
123 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, | |
124 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, | |
125 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, | |
126 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, | |
127 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, | |
128 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, | |
129 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d | |
130 }; | |
131 | |
132 /* combined Xtimes2[Sbox[]] */ | |
133 static NvU8 s_Xtime2Sbox[256] = | |
134 { | |
135 0xc6, 0xf8, 0xee, 0xf6, 0xff, 0xd6, 0xde, 0x91, | |
136 0x60, 0x02, 0xce, 0x56, 0xe7, 0xb5, 0x4d, 0xec, | |
137 0x8f, 0x1f, 0x89, 0xfa, 0xef, 0xb2, 0x8e, 0xfb, | |
138 0x41, 0xb3, 0x5f, 0x45, 0x23, 0x53, 0xe4, 0x9b, | |
139 0x75, 0xe1, 0x3d, 0x4c, 0x6c, 0x7e, 0xf5, 0x83, | |
140 0x68, 0x51, 0xd1, 0xf9, 0xe2, 0xab, 0x62, 0x2a, | |
141 0x08, 0x95, 0x46, 0x9d, 0x30, 0x37, 0x0a, 0x2f, | |
142 0x0e, 0x24, 0x1b, 0xdf, 0xcd, 0x4e, 0x7f, 0xea, | |
143 0x12, 0x1d, 0x58, 0x34, 0x36, 0xdc, 0xb4, 0x5b, | |
144 0xa4, 0x76, 0xb7, 0x7d, 0x52, 0xdd, 0x5e, 0x13, | |
145 0xa6, 0xb9, 0x00, 0xc1, 0x40, 0xe3, 0x79, 0xb6, | |
146 0xd4, 0x8d, 0x67, 0x72, 0x94, 0x98, 0xb0, 0x85, | |
147 0xbb, 0xc5, 0x4f, 0xed, 0x86, 0x9a, 0x66, 0x11, | |
148 0x8a, 0xe9, 0x04, 0xfe, 0xa0, 0x78, 0x25, 0x4b, | |
149 0xa2, 0x5d, 0x80, 0x05, 0x3f, 0x21, 0x70, 0xf1, | |
150 0x63, 0x77, 0xaf, 0x42, 0x20, 0xe5, 0xfd, 0xbf, | |
151 0x81, 0x18, 0x26, 0xc3, 0xbe, 0x35, 0x88, 0x2e, | |
152 0x93, 0x55, 0xfc, 0x7a, 0xc8, 0xba, 0x32, 0xe6, | |
153 0xc0, 0x19, 0x9e, 0xa3, 0x44, 0x54, 0x3b, 0x0b, | |
154 0x8c, 0xc7, 0x6b, 0x28, 0xa7, 0xbc, 0x16, 0xad, | |
155 0xdb, 0x64, 0x74, 0x14, 0x92, 0x0c, 0x48, 0xb8, | |
156 0x9f, 0xbd, 0x43, 0xc4, 0x39, 0x31, 0xd3, 0xf2, | |
157 0xd5, 0x8b, 0x6e, 0xda, 0x01, 0xb1, 0x9c, 0x49, | |
158 0xd8, 0xac, 0xf3, 0xcf, 0xca, 0xf4, 0x47, 0x10, | |
159 0x6f, 0xf0, 0x4a, 0x5c, 0x38, 0x57, 0x73, 0x97, | |
160 0xcb, 0xa1, 0xe8, 0x3e, 0x96, 0x61, 0x0d, 0x0f, | |
161 0xe0, 0x7c, 0x71, 0xcc, 0x90, 0x06, 0xf7, 0x1c, | |
162 0xc2, 0x6a, 0xae, 0x69, 0x17, 0x99, 0x3a, 0x27, | |
163 0xd9, 0xeb, 0x2b, 0x22, 0xd2, 0xa9, 0x07, 0x33, | |
164 0x2d, 0x3c, 0x15, 0xc9, 0x87, 0xaa, 0x50, 0xa5, | |
165 0x03, 0x59, 0x09, 0x1a, 0x65, 0xd7, 0x84, 0xd0, | |
166 0x82, 0x29, 0x5a, 0x1e, 0x7b, 0xa8, 0x6d, 0x2c | |
167 }; | |
168 | |
169 /* combined Xtimes3[Sbox[]] */ | |
170 static NvU8 s_Xtime3Sbox[256] = | |
171 { | |
172 0xa5, 0x84, 0x99, 0x8d, 0x0d, 0xbd, 0xb1, 0x54, | |
173 0x50, 0x03, 0xa9, 0x7d, 0x19, 0x62, 0xe6, 0x9a, | |
174 0x45, 0x9d, 0x40, 0x87, 0x15, 0xeb, 0xc9, 0x0b, | |
175 0xec, 0x67, 0xfd, 0xea, 0xbf, 0xf7, 0x96, 0x5b, | |
176 0xc2, 0x1c, 0xae, 0x6a, 0x5a, 0x41, 0x02, 0x4f, | |
177 0x5c, 0xf4, 0x34, 0x08, 0x93, 0x73, 0x53, 0x3f, | |
178 0x0c, 0x52, 0x65, 0x5e, 0x28, 0xa1, 0x0f, 0xb5, | |
179 0x09, 0x36, 0x9b, 0x3d, 0x26, 0x69, 0xcd, 0x9f, | |
180 0x1b, 0x9e, 0x74, 0x2e, 0x2d, 0xb2, 0xee, 0xfb, | |
181 0xf6, 0x4d, 0x61, 0xce, 0x7b, 0x3e, 0x71, 0x97, | |
182 0xf5, 0x68, 0x00, 0x2c, 0x60, 0x1f, 0xc8, 0xed, | |
183 0xbe, 0x46, 0xd9, 0x4b, 0xde, 0xd4, 0xe8, 0x4a, | |
184 0x6b, 0x2a, 0xe5, 0x16, 0xc5, 0xd7, 0x55, 0x94, | |
185 0xcf, 0x10, 0x06, 0x81, 0xf0, 0x44, 0xba, 0xe3, | |
186 0xf3, 0xfe, 0xc0, 0x8a, 0xad, 0xbc, 0x48, 0x04, | |
187 0xdf, 0xc1, 0x75, 0x63, 0x30, 0x1a, 0x0e, 0x6d, | |
188 0x4c, 0x14, 0x35, 0x2f, 0xe1, 0xa2, 0xcc, 0x39, | |
189 0x57, 0xf2, 0x82, 0x47, 0xac, 0xe7, 0x2b, 0x95, | |
190 0xa0, 0x98, 0xd1, 0x7f, 0x66, 0x7e, 0xab, 0x83, | |
191 0xca, 0x29, 0xd3, 0x3c, 0x79, 0xe2, 0x1d, 0x76, | |
192 0x3b, 0x56, 0x4e, 0x1e, 0xdb, 0x0a, 0x6c, 0xe4, | |
193 0x5d, 0x6e, 0xef, 0xa6, 0xa8, 0xa4, 0x37, 0x8b, | |
194 0x32, 0x43, 0x59, 0xb7, 0x8c, 0x64, 0xd2, 0xe0, | |
195 0xb4, 0xfa, 0x07, 0x25, 0xaf, 0x8e, 0xe9, 0x18, | |
196 0xd5, 0x88, 0x6f, 0x72, 0x24, 0xf1, 0xc7, 0x51, | |
197 0x23, 0x7c, 0x9c, 0x21, 0xdd, 0xdc, 0x86, 0x85, | |
198 0x90, 0x42, 0xc4, 0xaa, 0xd8, 0x05, 0x01, 0x12, | |
199 0xa3, 0x5f, 0xf9, 0xd0, 0x91, 0x58, 0x27, 0xb9, | |
200 0x38, 0x13, 0xb3, 0x33, 0xbb, 0x70, 0x89, 0xa7, | |
201 0xb6, 0x22, 0x92, 0x20, 0x49, 0xff, 0x78, 0x7a, | |
202 0x8f, 0xf8, 0x80, 0x17, 0xda, 0x31, 0xc6, 0xb8, | |
203 0xc3, 0xb0, 0x77, 0x11, 0xcb, 0xfc, 0xd6, 0x3a | |
204 }; | |
205 | |
206 /* modular multiplication tables | |
207 * based on: | |
208 */ | |
209 | |
210 static NvU8 s_Xtime9[256] = | |
211 { | |
212 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, | |
213 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, | |
214 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, | |
215 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, | |
216 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, | |
217 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, | |
218 0xab, 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, | |
219 0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc, | |
220 0x76, 0x7f, 0x64, 0x6d, 0x52, 0x5b, 0x40, 0x49, | |
221 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01, | |
222 0xe6, 0xef, 0xf4, 0xfd, 0xc2, 0xcb, 0xd0, 0xd9, | |
223 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91, | |
224 0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, 0x72, | |
225 0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a, | |
226 0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2, | |
227 0x95, 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa, | |
228 0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3, | |
229 0xa4, 0xad, 0xb6, 0xbf, 0x80, 0x89, 0x92, 0x9b, | |
230 0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, | |
231 0x34, 0x3d, 0x26, 0x2f, 0x10, 0x19, 0x02, 0x0b, | |
232 0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, | |
233 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0, | |
234 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, | |
235 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, | |
236 0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, | |
237 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed, | |
238 0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35, | |
239 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, | |
240 0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e, | |
241 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6, | |
242 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, | |
243 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46 | |
244 }; | |
245 | |
246 static NvU8 s_XtimeB[256] = | |
247 { | |
248 0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, | |
249 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69, | |
250 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, | |
251 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, | |
252 0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, | |
253 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12, | |
254 0xcb, 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, | |
255 0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2, | |
256 0xf6, 0xfd, 0xe0, 0xeb, 0xda, 0xd1, 0xcc, 0xc7, | |
257 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f, | |
258 0x46, 0x4d, 0x50, 0x5b, 0x6a, 0x61, 0x7c, 0x77, | |
259 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f, | |
260 0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, 0xbc, | |
261 0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4, | |
262 0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c, | |
263 0x65, 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54, | |
264 0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6, | |
265 0xaf, 0xa4, 0xb9, 0xb2, 0x83, 0x88, 0x95, 0x9e, | |
266 0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, | |
267 0x1f, 0x14, 0x09, 0x02, 0x33, 0x38, 0x25, 0x2e, | |
268 0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd, | |
269 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, 0xe5, | |
270 0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d, | |
271 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55, | |
272 0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, | |
273 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, | |
274 0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, | |
275 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, | |
276 0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b, | |
277 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13, | |
278 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, | |
279 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3 | |
280 }; | |
281 | |
282 static NvU8 s_XtimeD[256] = | |
283 { | |
284 0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, | |
285 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b, | |
286 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, | |
287 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, | |
288 0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, | |
289 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0, | |
290 0x6b, 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, | |
291 0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20, | |
292 0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e, | |
293 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, | |
294 0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, | |
295 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, | |
296 0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, 0xf5, | |
297 0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d, | |
298 0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25, | |
299 0x6e, 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d, | |
300 0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, | |
301 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91, | |
302 0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, | |
303 0x62, 0x6f, 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41, | |
304 0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42, | |
305 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, 0x2a, | |
306 0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92, | |
307 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa, | |
308 0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, | |
309 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, | |
310 0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, | |
311 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, | |
312 0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f, | |
313 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47, | |
314 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, | |
315 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97 | |
316 }; | |
317 | |
318 static NvU8 s_XtimeE[256] = | |
319 { | |
320 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, | |
321 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, | |
322 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, | |
323 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, | |
324 0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, | |
325 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81, | |
326 0x3b, 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, | |
327 0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61, | |
328 0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87, | |
329 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, | |
330 0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, | |
331 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, | |
332 0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, 0x5c, | |
333 0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c, | |
334 0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc, | |
335 0xe6, 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc, | |
336 0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b, | |
337 0x31, 0x3f, 0x2d, 0x23, 0x09, 0x07, 0x15, 0x1b, | |
338 0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, | |
339 0xd1, 0xdf, 0xcd, 0xc3, 0xe9, 0xe7, 0xf5, 0xfb, | |
340 0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, | |
341 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0, | |
342 0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, | |
343 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, | |
344 0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, | |
345 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6, | |
346 0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26, | |
347 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, | |
348 0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, | |
349 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, | |
350 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, | |
351 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d | |
352 }; | |
353 | |
354 /* exchanges columns in each of 4 rows | |
355 * row0 - unchanged, row1- shifted left 1, | |
356 * row2 - shifted left 2 and row3 - shifted left 3 | |
357 */ | |
358 void | |
359 shift_rows(NvU8 *state) | |
360 { | |
361 NvU8 tmp; | |
362 | |
363 /* just substitute row 0 */ | |
364 state[ 0] = s_Sbox[state[ 0]]; | |
365 state[ 4] = s_Sbox[state[ 4]]; | |
366 state[ 8] = s_Sbox[state[ 8]]; | |
367 state[12] = s_Sbox[state[12]]; | |
368 | |
369 /* rotate row 1 */ | |
370 tmp = s_Sbox[state[ 1]]; | |
371 state[ 1] = s_Sbox[state[ 5]]; | |
372 state[ 5] = s_Sbox[state[ 9]]; | |
373 state[ 9] = s_Sbox[state[13]]; | |
374 state[13] = tmp; | |
375 | |
376 /* rotate row 2 */ | |
377 tmp = s_Sbox[state[ 2]]; | |
378 state[ 2] = s_Sbox[state[10]]; | |
379 state[10] = tmp; | |
380 tmp = s_Sbox[state[ 6]]; | |
381 state[ 6] = s_Sbox[state[14]]; | |
382 state[14] = tmp; | |
383 | |
384 /* rotate row 3 */ | |
385 tmp = s_Sbox[state[15]]; | |
386 state[15] = s_Sbox[state[11]]; | |
387 state[11] = s_Sbox[state[ 7]]; | |
388 state[ 7] = s_Sbox[state[ 3]]; | |
389 state[ 3] = tmp; | |
390 } | |
391 | |
392 /* restores columns in each of 4 rows | |
393 * row0 - unchanged, row1- shifted right 1, | |
394 * row2 - shifted right 2 and row3 - shifted right 3 | |
395 */ | |
396 void | |
397 inv_shift_rows(NvU8 *state) | |
398 { | |
399 NvU8 tmp; | |
400 | |
401 /* restore row 0 */ | |
402 state[ 0] = s_InvSbox[state[ 0]]; | |
403 state[ 4] = s_InvSbox[state[ 4]]; | |
404 state[ 8] = s_InvSbox[state[ 8]]; | |
405 state[12] = s_InvSbox[state[12]]; | |
406 | |
407 /* restore row 1 */ | |
408 tmp = s_InvSbox[state[13]]; | |
409 state[13] = s_InvSbox[state[ 9]]; | |
410 state[ 9] = s_InvSbox[state[ 5]]; | |
411 state[ 5] = s_InvSbox[state[ 1]]; | |
412 state[ 1] = tmp; | |
413 | |
414 /* restore row 2 */ | |
415 tmp = s_InvSbox[state[ 2]]; | |
416 state[ 2] = s_InvSbox[state[10]]; | |
417 state[10] = tmp; | |
418 tmp = s_InvSbox[state[ 6]]; | |
419 state[ 6] = s_InvSbox[state[14]]; | |
420 state[14] = tmp; | |
421 | |
422 /* restore row 3 */ | |
423 tmp = s_InvSbox[state[ 3]]; | |
424 state[ 3] = s_InvSbox[state[ 7]]; | |
425 state[ 7] = s_InvSbox[state[11]]; | |
426 state[11] = s_InvSbox[state[15]]; | |
427 state[15] = tmp; | |
428 } | |
429 | |
430 /* recombine and mix each row in a column */ | |
431 void | |
432 mix_sub_columns(NvU8 *state) | |
433 { | |
434 NvU8 tmp[4 * NVAES_STATECOLS]; | |
435 | |
436 /* mixing column 0 */ | |
437 tmp[ 0] = s_Xtime2Sbox[state[ 0]] ^ s_Xtime3Sbox[state[ 5]] ^ | |
438 s_Sbox[state[10]] ^ s_Sbox[state[15]]; | |
439 tmp[ 1] = s_Sbox[state[ 0]] ^ s_Xtime2Sbox[state[ 5]] ^ | |
440 s_Xtime3Sbox[state[10]] ^ s_Sbox[state[15]]; | |
441 tmp[ 2] = s_Sbox[state[ 0]] ^ s_Sbox[state[ 5]] ^ | |
442 s_Xtime2Sbox[state[10]] ^ s_Xtime3Sbox[state[15]]; | |
443 tmp[ 3] = s_Xtime3Sbox[state[ 0]] ^ s_Sbox[state[ 5]] ^ | |
444 s_Sbox[state[10]] ^ s_Xtime2Sbox[state[15]]; | |
445 | |
446 /* mixing column 1 */ | |
447 tmp[ 4] = s_Xtime2Sbox[state[ 4]] ^ s_Xtime3Sbox[state[ 9]] ^ | |
448 s_Sbox[state[14]] ^ s_Sbox[state[ 3]]; | |
449 tmp[ 5] = s_Sbox[state[ 4]] ^ s_Xtime2Sbox[state[ 9]] ^ | |
450 s_Xtime3Sbox[state[14]] ^ s_Sbox[state[ 3]]; | |
451 tmp[ 6] = s_Sbox[state[ 4]] ^ s_Sbox[state[ 9]] ^ | |
452 s_Xtime2Sbox[state[14]] ^ s_Xtime3Sbox[state[ 3]]; | |
453 tmp[ 7] = s_Xtime3Sbox[state[ 4]] ^ s_Sbox[state[ 9]] ^ | |
454 s_Sbox[state[14]] ^ s_Xtime2Sbox[state[ 3]]; | |
455 | |
456 /* mixing column 2 */ | |
457 tmp[ 8] = s_Xtime2Sbox[state[ 8]] ^ s_Xtime3Sbox[state[13]] ^ | |
458 s_Sbox[state[ 2]] ^ s_Sbox[state[ 7]]; | |
459 tmp[ 9] = s_Sbox[state[ 8]] ^ s_Xtime2Sbox[state[13]] ^ | |
460 s_Xtime3Sbox[state[ 2]] ^ s_Sbox[state[ 7]]; | |
461 tmp[10] = s_Sbox[state[ 8]] ^ s_Sbox[state[13]] ^ | |
462 s_Xtime2Sbox[state[ 2]] ^ s_Xtime3Sbox[state[ 7]]; | |
463 tmp[11] = s_Xtime3Sbox[state[ 8]] ^ s_Sbox[state[13]] ^ | |
464 s_Sbox[state[ 2]] ^ s_Xtime2Sbox[state[ 7]]; | |
465 | |
466 /* mixing column 3 */ | |
467 tmp[12] = s_Xtime2Sbox[state[12]] ^ s_Xtime3Sbox[state[ 1]] ^ | |
468 s_Sbox[state[ 6]] ^ s_Sbox[state[11]]; | |
469 tmp[13] = s_Sbox[state[12]] ^ s_Xtime2Sbox[state[ 1]] ^ | |
470 s_Xtime3Sbox[state[ 6]] ^ s_Sbox[state[11]]; | |
471 tmp[14] = s_Sbox[state[12]] ^ s_Sbox[state[ 1]] ^ | |
472 s_Xtime2Sbox[state[ 6]] ^ s_Xtime3Sbox[state[11]]; | |
473 tmp[15] = s_Xtime3Sbox[state[12]] ^ s_Sbox[state[ 1]] ^ | |
474 s_Sbox[state[ 6]] ^ s_Xtime2Sbox[state[11]]; | |
475 | |
476 memcpy (state, tmp, sizeof(tmp)); | |
477 } | |
478 | |
479 /* restore and un-mix each row in a column */ | |
480 void inv_mix_sub_columns (NvU8 *state) | |
481 { | |
482 NvU8 tmp[4 * NVAES_STATECOLS]; | |
483 int i; | |
484 | |
485 /* restore column 0 */ | |
486 tmp[ 0] = s_XtimeE[state[ 0]] ^ s_XtimeB[state[ 1]] ^ | |
487 s_XtimeD[state[ 2]] ^ s_Xtime9[state[ 3]]; | |
488 tmp[ 5] = s_Xtime9[state[ 0]] ^ s_XtimeE[state[ 1]] ^ | |
489 s_XtimeB[state[ 2]] ^ s_XtimeD[state[ 3]]; | |
490 tmp[10] = s_XtimeD[state[ 0]] ^ s_Xtime9[state[ 1]] ^ | |
491 s_XtimeE[state[ 2]] ^ s_XtimeB[state[ 3]]; | |
492 tmp[15] = s_XtimeB[state[ 0]] ^ s_XtimeD[state[ 1]] ^ | |
493 s_Xtime9[state[ 2]] ^ s_XtimeE[state[ 3]]; | |
494 | |
495 /* restore column 1 */ | |
496 tmp[ 4] = s_XtimeE[state[ 4]] ^ s_XtimeB[state[ 5]] ^ | |
497 s_XtimeD[state[ 6]] ^ s_Xtime9[state[ 7]]; | |
498 tmp[ 9] = s_Xtime9[state[ 4]] ^ s_XtimeE[state[ 5]] ^ | |
499 s_XtimeB[state[ 6]] ^ s_XtimeD[state[ 7]]; | |
500 tmp[14] = s_XtimeD[state[ 4]] ^ s_Xtime9[state[ 5]] ^ | |
501 s_XtimeE[state[ 6]] ^ s_XtimeB[state[ 7]]; | |
502 tmp[ 3] = s_XtimeB[state[ 4]] ^ s_XtimeD[state[ 5]] ^ | |
503 s_Xtime9[state[ 6]] ^ s_XtimeE[state[ 7]]; | |
504 | |
505 /* restore column 2 */ | |
506 tmp[ 8] = s_XtimeE[state[ 8]] ^ s_XtimeB[state[ 9]] ^ | |
507 s_XtimeD[state[10]] ^ s_Xtime9[state[11]]; | |
508 tmp[13] = s_Xtime9[state[ 8]] ^ s_XtimeE[state[ 9]] ^ | |
509 s_XtimeB[state[10]] ^ s_XtimeD[state[11]]; | |
510 tmp[ 2] = s_XtimeD[state[ 8]] ^ s_Xtime9[state[ 9]] ^ | |
511 s_XtimeE[state[10]] ^ s_XtimeB[state[11]]; | |
512 tmp[ 7] = s_XtimeB[state[ 8]] ^ s_XtimeD[state[ 9]] ^ | |
513 s_Xtime9[state[10]] ^ s_XtimeE[state[11]]; | |
514 | |
515 /* restore column 3 */ | |
516 tmp[12] = s_XtimeE[state[12]] ^ s_XtimeB[state[13]] ^ | |
517 s_XtimeD[state[14]] ^ s_Xtime9[state[15]]; | |
518 tmp[ 1] = s_Xtime9[state[12]] ^ s_XtimeE[state[13]] ^ | |
519 s_XtimeB[state[14]] ^ s_XtimeD[state[15]]; | |
520 tmp[ 6] = s_XtimeD[state[12]] ^ s_Xtime9[state[13]] ^ | |
521 s_XtimeE[state[14]] ^ s_XtimeB[state[15]]; | |
522 tmp[11] = s_XtimeB[state[12]] ^ s_XtimeD[state[13]] ^ | |
523 s_Xtime9[state[14]] ^ s_XtimeE[state[15]]; | |
524 | |
525 for (i=0; i < 4 * NVAES_STATECOLS; i++) | |
526 state[i] = s_InvSbox[tmp[i]]; | |
527 } | |
528 | |
529 /* encrypt/decrypt columns of the key | |
530 * n.b. you can replace this with | |
531 * byte-wise xor if you wish. | |
532 */ | |
533 | |
534 void | |
535 add_round_key(NvU32 *state, NvU32 *key) | |
536 { | |
537 int idx; | |
538 | |
539 for (idx = 0; idx < 4; idx++) | |
540 state[idx] ^= key[idx]; | |
541 } | |
542 | |
543 static NvU8 s_Rcon[11] = | |
544 { | |
545 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 | |
546 }; | |
547 | |
548 /* produce NVAES_STATECOLS bytes for each round */ | |
549 void | |
550 nv_aes_expand_key(NvU8 *key, NvU8 *expkey) | |
551 { | |
552 NvU8 tmp0, tmp1, tmp2, tmp3, tmp4; | |
553 NvU32 idx; | |
554 | |
555 memcpy(expkey, key, NVAES_KEYCOLS * 4); | |
556 | |
557 for (idx = NVAES_KEYCOLS; | |
558 idx < NVAES_STATECOLS * (NVAES_ROUNDS + 1); | |
559 idx++) { | |
560 tmp0 = expkey[4*idx - 4]; | |
561 tmp1 = expkey[4*idx - 3]; | |
562 tmp2 = expkey[4*idx - 2]; | |
563 tmp3 = expkey[4*idx - 1]; | |
564 if (!(idx % NVAES_KEYCOLS)) { | |
565 tmp4 = tmp3; | |
566 tmp3 = s_Sbox[tmp0]; | |
567 tmp0 = s_Sbox[tmp1] ^ s_Rcon[idx/NVAES_KEYCOLS]; | |
568 tmp1 = s_Sbox[tmp2]; | |
569 tmp2 = s_Sbox[tmp4]; | |
570 } | |
571 else if (NVAES_KEYCOLS > 6 && idx % NVAES_KEYCOLS == 4 ) { | |
572 tmp0 = s_Sbox[tmp0]; | |
573 tmp1 = s_Sbox[tmp1]; | |
574 tmp2 = s_Sbox[tmp2]; | |
575 tmp3 = s_Sbox[tmp3]; | |
576 } | |
577 | |
578 expkey[4*idx+0] = expkey[4*idx - 4*NVAES_KEYCOLS + 0] ^ tmp0; | |
579 expkey[4*idx+1] = expkey[4*idx - 4*NVAES_KEYCOLS + 1] ^ tmp1; | |
580 expkey[4*idx+2] = expkey[4*idx - 4*NVAES_KEYCOLS + 2] ^ tmp2; | |
581 expkey[4*idx+3] = expkey[4*idx - 4*NVAES_KEYCOLS + 3] ^ tmp3; | |
582 } | |
583 } | |
584 | |
585 /* encrypt one 128 bit block */ | |
586 void | |
587 nv_aes_encrypt(NvU8 *in, NvU8 *expkey, NvU8 *out) | |
588 { | |
589 NvU8 state[NVAES_STATECOLS * 4]; | |
590 NvU32 round; | |
591 | |
592 memcpy(state, in, NVAES_STATECOLS * 4); | |
593 add_round_key((NvU32 *)state, (NvU32 *)expkey); | |
594 | |
595 for (round = 1; round < NVAES_ROUNDS + 1; round++) { | |
596 if( round < NVAES_ROUNDS ) | |
597 mix_sub_columns (state); | |
598 else | |
599 shift_rows (state); | |
600 | |
601 add_round_key((NvU32 *)state, (NvU32 *)expkey + round * NVAES_ST ATECOLS); | |
602 } | |
603 | |
604 memcpy(out, state, sizeof(state)); | |
605 } | |
606 | |
607 void | |
608 nv_aes_decrypt(NvU8 *in, NvU8 *expkey, NvU8 *out) | |
609 { | |
610 NvU8 state[NVAES_STATECOLS * 4]; | |
611 NvU32 round; | |
612 | |
613 memcpy(state, in, sizeof(state)); | |
614 | |
615 add_round_key((NvU32 *)state, | |
616 (NvU32 *)expkey + NVAES_ROUNDS * NVAES_STATECOLS ); | |
617 inv_shift_rows(state); | |
618 | |
619 for (round = NVAES_ROUNDS; round--; ) { | |
620 add_round_key((NvU32 *)state, (NvU32 *)expkey + round * NVAES_ST ATECOLS); | |
621 if (round) | |
622 inv_mix_sub_columns (state); | |
623 } | |
624 | |
625 memcpy (out, state, sizeof(state)); | |
626 } | |
OLD | NEW |