Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(298)

Side by Side Diff: board/tegra2/common/crypto/aes_ref.c

Issue 4841001: Tegra2: implement Warmboot code and lp0_vec (Closed) Base URL: http://git.chromium.org/git/u-boot-next.git@chromeos-v2010.09
Patch Set: Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698