OpenCores
URL https://opencores.org/ocsvn/aes_crypto_core/aes_crypto_core/trunk

Subversion Repositories aes_crypto_core

[/] [aes_crypto_core/] [trunk/] [rtl/] [aes_package.vhd] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 hemanth
--*************************************************************************
2
-- Project    : AES128                                                    *
3
--                                                                        *
4
-- Block Name : aes_package.vhd                                           *
5
--                                                                        *
6
-- Author     : Hemanth Satyanarayana                                     *
7
--                                                                        *
8
-- Email      : hemanth@opencores.org                                     *
9
--                                                                        *
10
-- Description: Package containing state array type declaration,          *
11
--              S-box functions and Mix columns routine for               *
12
--              rtl modules.                                              *
13
--                                                                        *
14
-- Revision History                                                       *
15
-- |-----------|-------------|---------|---------------------------------|*
16
-- |   Name    |    Date     | Version |          Revision details       |*
17
-- |-----------|-------------|---------|---------------------------------|*
18
-- | Hemanth   | 15-Dec-2004 | 1.1.1.1 |            Uploaded             |*
19
-- |-----------|-------------|---------|---------------------------------|*
20
--                                                                        *
21
--  Refer FIPS-197 document for details                                   *
22
--*************************************************************************
23
--                                                                        *
24
-- Copyright (C) 2004 Author                                              *
25
--                                                                        *
26
-- This source file may be used and distributed without                   *
27
-- restriction provided that this copyright statement is not              *
28
-- removed from the file and that any derivative work contains            *
29
-- the original copyright notice and the associated disclaimer.           *
30
--                                                                        *
31
-- This source file is free software; you can redistribute it             *
32
-- and/or modify it under the terms of the GNU Lesser General             *
33
-- Public License as published by the Free Software Foundation;           *
34
-- either version 2.1 of the License, or (at your option) any             *
35
-- later version.                                                         *
36
--                                                                        *
37
-- This source is distributed in the hope that it will be                 *
38
-- useful, but WITHOUT ANY WARRANTY; without even the implied             *
39
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR                *
40
-- PURPOSE.  See the GNU Lesser General Public License for more           *
41
-- details.                                                               *
42
--                                                                        *
43
-- You should have received a copy of the GNU Lesser General              *
44
-- Public License along with this source; if not, download it             *
45
-- from http://www.opencores.org/lgpl.shtml                               *
46
--                                                                        *
47
--*************************************************************************
48
 
49
library ieee;
50
use ieee.std_logic_1164.all;
51
use ieee.std_logic_unsigned.all;
52
 
53
package aes_package is
54
 
55
-- This data type is declared to make all operations on a vector of 4 bytes ecach
56
-- refer fips-197 doc, sec 3.5
57
type state_array_type is array (0 to 3) of std_logic_vector(7 downto 0);
58
 
59
-- S-Box look up function
60
function sbox_val(address: std_logic_vector(7 downto 0)) return std_logic_vector;
61
-- Inverse S-Box look up function
62
function inv_sbox_val(address: std_logic_vector(7 downto 0)) return std_logic_vector;
63
-- column generation fucntion for Mix columns routine
64
function col_transform(p: state_array_type) return std_logic_vector;
65
-- column generation fucntion for Inverse Mix columns routine
66
function col_inv_transform(s: state_array_type) return std_logic_vector;
67
-- Mix Columns function
68
function mix_cols_routine
69
     (
70
       a_r0 : state_array_type;
71
       a_r1 : state_array_type;
72
       a_r2 : state_array_type;
73
       a_r3 : state_array_type;
74
       mode : std_logic
75
     )
76
return std_logic_vector;
77
 
78
end aes_package;
79
 
80
package body aes_package is
81
 
82
function sbox_val(address: std_logic_vector(7 downto 0)) return std_logic_vector is
83
variable data: bit_vector(7 downto 0);
84
variable data_stdlogic: std_logic_vector(7 downto 0);
85
begin
86
case address is
87
 
88
  when "00000000" => data := X"63";
89
  when "00000001" => data := X"7C";
90
  when "00000010" => data := X"77";
91
  when "00000011" => data := X"7B";
92
  when "00000100" => data := X"F2";
93
  when "00000101" => data := X"6B";
94
  when "00000110" => data := X"6F";
95
  when "00000111" => data := X"C5";
96
  when "00001000" => data := X"30";
97
  when "00001001" => data := X"01";
98
  when "00001010" => data := X"67";
99
  when "00001011" => data := X"2B";
100
  when "00001100" => data := X"FE";
101
  when "00001101" => data := X"D7";
102
  when "00001110" => data := X"AB";
103
  when "00001111" => data := X"76";
104
  when "00010000" => data := X"CA";
105
  when "00010001" => data := X"82";
106
  when "00010010" => data := X"C9";
107
  when "00010011" => data := X"7D";
108
  when "00010100" => data := X"FA";
109
  when "00010101" => data := X"59";
110
  when "00010110" => data := X"47";
111
  when "00010111" => data := X"F0";
112
  when "00011000" => data := X"AD";
113
  when "00011001" => data := X"D4";
114
  when "00011010" => data := X"A2";
115
  when "00011011" => data := X"AF";
116
  when "00011100" => data := X"9C";
117
  when "00011101" => data := X"A4";
118
  when "00011110" => data := X"72";
119
  when "00011111" => data := X"C0";
120
  when "00100000" => data := X"B7";
121
  when "00100001" => data := X"FD";
122
  when "00100010" => data := X"93";
123
  when "00100011" => data := X"26";
124
  when "00100100" => data := X"36";
125
  when "00100101" => data := X"3F";
126
  when "00100110" => data := X"F7";
127
  when "00100111" => data := X"CC";
128
  when "00101000" => data := X"34";
129
  when "00101001" => data := X"A5";
130
  when "00101010" => data := X"E5";
131
  when "00101011" => data := X"F1";
132
  when "00101100" => data := X"71";
133
  when "00101101" => data := X"D8";
134
  when "00101110" => data := X"31";
135
  when "00101111" => data := X"15";
136
  when "00110000" => data := X"04";
137
  when "00110001" => data := X"C7";
138
  when "00110010" => data := X"23";
139
  when "00110011" => data := X"C3";
140
  when "00110100" => data := X"18";
141
  when "00110101" => data := X"96";
142
  when "00110110" => data := X"05";
143
  when "00110111" => data := X"9A";
144
  when "00111000" => data := X"07";
145
  when "00111001" => data := X"12";
146
  when "00111010" => data := X"80";
147
  when "00111011" => data := X"E2";
148
  when "00111100" => data := X"EB";
149
  when "00111101" => data := X"27";
150
  when "00111110" => data := X"B2";
151
  when "00111111" => data := X"75";
152
  when "01000000" => data := X"09";
153
  when "01000001" => data := X"83";
154
  when "01000010" => data := X"2C";
155
  when "01000011" => data := X"1A";
156
  when "01000100" => data := X"1B";
157
  when "01000101" => data := X"6E";
158
  when "01000110" => data := X"5A";
159
  when "01000111" => data := X"A0";
160
  when "01001000" => data := X"52";
161
  when "01001001" => data := X"3B";
162
  when "01001010" => data := X"D6";
163
  when "01001011" => data := X"B3";
164
  when "01001100" => data := X"29";
165
  when "01001101" => data := X"E3";
166
  when "01001110" => data := X"2F";
167
  when "01001111" => data := X"84";
168
  when "01010000" => data := X"53";
169
  when "01010001" => data := X"D1";
170
  when "01010010" => data := X"00";
171
  when "01010011" => data := X"ED";
172
  when "01010100" => data := X"20";
173
  when "01010101" => data := X"FC";
174
  when "01010110" => data := X"B1";
175
  when "01010111" => data := X"5B";
176
  when "01011000" => data := X"6A";
177
  when "01011001" => data := X"CB";
178
  when "01011010" => data := X"BE";
179
  when "01011011" => data := X"39";
180
  when "01011100" => data := X"4A";
181
  when "01011101" => data := X"4C";
182
  when "01011110" => data := X"58";
183
  when "01011111" => data := X"CF";
184
  when "01100000" => data := X"D0";
185
  when "01100001" => data := X"EF";
186
  when "01100010" => data := X"AA";
187
  when "01100011" => data := X"FB";
188
  when "01100100" => data := X"43";
189
  when "01100101" => data := X"4D";
190
  when "01100110" => data := X"33";
191
  when "01100111" => data := X"85";
192
  when "01101000" => data := X"45";
193
  when "01101001" => data := X"F9";
194
  when "01101010" => data := X"02";
195
  when "01101011" => data := X"7F";
196
  when "01101100" => data := X"50";
197
  when "01101101" => data := X"3C";
198
  when "01101110" => data := X"9F";
199
  when "01101111" => data := X"A8";
200
  when "01110000" => data := X"51";
201
  when "01110001" => data := X"A3";
202
  when "01110010" => data := X"40";
203
  when "01110011" => data := X"8F";
204
  when "01110100" => data := X"92";
205
  when "01110101" => data := X"9D";
206
  when "01110110" => data := X"38";
207
  when "01110111" => data := X"F5";
208
  when "01111000" => data := X"BC";
209
  when "01111001" => data := X"B6";
210
  when "01111010" => data := X"DA";
211
  when "01111011" => data := X"21";
212
  when "01111100" => data := X"10";
213
  when "01111101" => data := X"FF";
214
  when "01111110" => data := X"F3";
215
  when "01111111" => data := X"D2";
216
  when "10000000" => data := X"CD";
217
  when "10000001" => data := X"0C";
218
  when "10000010" => data := X"13";
219
  when "10000011" => data := X"EC";
220
  when "10000100" => data := X"5F";
221
  when "10000101" => data := X"97";
222
  when "10000110" => data := X"44";
223
  when "10000111" => data := X"17";
224
  when "10001000" => data := X"C4";
225
  when "10001001" => data := X"A7";
226
  when "10001010" => data := X"7E";
227
  when "10001011" => data := X"3D";
228
  when "10001100" => data := X"64";
229
  when "10001101" => data := X"5D";
230
  when "10001110" => data := X"19";
231
  when "10001111" => data := X"73";
232
  when "10010000" => data := X"60";
233
  when "10010001" => data := X"81";
234
  when "10010010" => data := X"4F";
235
  when "10010011" => data := X"DC";
236
  when "10010100" => data := X"22";
237
  when "10010101" => data := X"2A";
238
  when "10010110" => data := X"90";
239
  when "10010111" => data := X"88";
240
  when "10011000" => data := X"46";
241
  when "10011001" => data := X"EE";
242
  when "10011010" => data := X"B8";
243
  when "10011011" => data := X"14";
244
  when "10011100" => data := X"DE";
245
  when "10011101" => data := X"5E";
246
  when "10011110" => data := X"0B";
247
  when "10011111" => data := X"DB";
248
  when "10100000" => data := X"E0";
249
  when "10100001" => data := X"32";
250
  when "10100010" => data := X"3A";
251
  when "10100011" => data := X"0A";
252
  when "10100100" => data := X"49";
253
  when "10100101" => data := X"06";
254
  when "10100110" => data := X"24";
255
  when "10100111" => data := X"5C";
256
  when "10101000" => data := X"C2";
257
  when "10101001" => data := X"D3";
258
  when "10101010" => data := X"AC";
259
  when "10101011" => data := X"62";
260
  when "10101100" => data := X"91";
261
  when "10101101" => data := X"95";
262
  when "10101110" => data := X"E4";
263
  when "10101111" => data := X"79";
264
  when "10110000" => data := X"E7";
265
  when "10110001" => data := X"C8";
266
  when "10110010" => data := X"37";
267
  when "10110011" => data := X"6D";
268
  when "10110100" => data := X"8D";
269
  when "10110101" => data := X"D5";
270
  when "10110110" => data := X"4E";
271
  when "10110111" => data := X"A9";
272
  when "10111000" => data := X"6C";
273
  when "10111001" => data := X"56";
274
  when "10111010" => data := X"F4";
275
  when "10111011" => data := X"EA";
276
  when "10111100" => data := X"65";
277
  when "10111101" => data := X"7A";
278
  when "10111110" => data := X"AE";
279
  when "10111111" => data := X"08";
280
  when "11000000" => data := X"BA";
281
  when "11000001" => data := X"78";
282
  when "11000010" => data := X"25";
283
  when "11000011" => data := X"2E";
284
  when "11000100" => data := X"1C";
285
  when "11000101" => data := X"A6";
286
  when "11000110" => data := X"B4";
287
  when "11000111" => data := X"C6";
288
  when "11001000" => data := X"E8";
289
  when "11001001" => data := X"DD";
290
  when "11001010" => data := X"74";
291
  when "11001011" => data := X"1F";
292
  when "11001100" => data := X"4B";
293
  when "11001101" => data := X"BD";
294
  when "11001110" => data := X"8B";
295
  when "11001111" => data := X"8A";
296
  when "11010000" => data := X"70";
297
  when "11010001" => data := X"3E";
298
  when "11010010" => data := X"B5";
299
  when "11010011" => data := X"66";
300
  when "11010100" => data := X"48";
301
  when "11010101" => data := X"03";
302
  when "11010110" => data := X"F6";
303
  when "11010111" => data := X"0E";
304
  when "11011000" => data := X"61";
305
  when "11011001" => data := X"35";
306
  when "11011010" => data := X"57";
307
  when "11011011" => data := X"B9";
308
  when "11011100" => data := X"86";
309
  when "11011101" => data := X"C1";
310
  when "11011110" => data := X"1D";
311
  when "11011111" => data := X"9E";
312
  when "11100000" => data := X"E1";
313
  when "11100001" => data := X"F8";
314
  when "11100010" => data := X"98";
315
  when "11100011" => data := X"11";
316
  when "11100100" => data := X"69";
317
  when "11100101" => data := X"D9";
318
  when "11100110" => data := X"8E";
319
  when "11100111" => data := X"94";
320
  when "11101000" => data := X"9B";
321
  when "11101001" => data := X"1E";
322
  when "11101010" => data := X"87";
323
  when "11101011" => data := X"E9";
324
  when "11101100" => data := X"CE";
325
  when "11101101" => data := X"55";
326
  when "11101110" => data := X"28";
327
  when "11101111" => data := X"DF";
328
  when "11110000" => data := X"8C";
329
  when "11110001" => data := X"A1";
330
  when "11110010" => data := X"89";
331
  when "11110011" => data := X"0D";
332
  when "11110100" => data := X"BF";
333
  when "11110101" => data := X"E6";
334
  when "11110110" => data := X"42";
335
  when "11110111" => data := X"68";
336
  when "11111000" => data := X"41";
337
  when "11111001" => data := X"99";
338
  when "11111010" => data := X"2D";
339
  when "11111011" => data := X"0F";
340
  when "11111100" => data := X"B0";
341
  when "11111101" => data := X"54";
342
  when "11111110" => data := X"BB";
343
  when "11111111" => data := X"16";
344
  when others => null;
345
end case;
346
data_stdlogic := to_StdLogicVector(data);
347
return data_stdlogic;
348
end function sbox_val;
349
 
350
function inv_sbox_val(address: std_logic_vector(7 downto 0)) return std_logic_vector is
351
variable inv_data: bit_vector(7 downto 0);
352
variable inv_data_stdlogic: std_logic_vector(7 downto 0);
353
begin
354
case address is
355
 
356
  when "00000000" => inv_data := X"52";
357
  when "00000001" => inv_data := X"09";
358
  when "00000010" => inv_data := X"6a";
359
  when "00000011" => inv_data := X"d5";
360
  when "00000100" => inv_data := X"30";
361
  when "00000101" => inv_data := X"36";
362
  when "00000110" => inv_data := X"a5";
363
  when "00000111" => inv_data := X"38";
364
  when "00001000" => inv_data := X"bf";
365
  when "00001001" => inv_data := X"40";
366
  when "00001010" => inv_data := X"a3";
367
  when "00001011" => inv_data := X"9e";
368
  when "00001100" => inv_data := X"81";
369
  when "00001101" => inv_data := X"f3";
370
  when "00001110" => inv_data := X"d7";
371
  when "00001111" => inv_data := X"fb";
372
  when "00010000" => inv_data := X"7c";
373
  when "00010001" => inv_data := X"e3";
374
  when "00010010" => inv_data := X"39";
375
  when "00010011" => inv_data := X"82";
376
  when "00010100" => inv_data := X"9b";
377
  when "00010101" => inv_data := X"2f";
378
  when "00010110" => inv_data := X"ff";
379
  when "00010111" => inv_data := X"87";
380
  when "00011000" => inv_data := X"34";
381
  when "00011001" => inv_data := X"8e";
382
  when "00011010" => inv_data := X"43";
383
  when "00011011" => inv_data := X"44";
384
  when "00011100" => inv_data := X"c4";
385
  when "00011101" => inv_data := X"de";
386
  when "00011110" => inv_data := X"e9";
387
  when "00011111" => inv_data := X"cb";
388
  when "00100000" => inv_data := X"54";
389
  when "00100001" => inv_data := X"7b";
390
  when "00100010" => inv_data := X"94";
391
  when "00100011" => inv_data := X"32";
392
  when "00100100" => inv_data := X"a6";
393
  when "00100101" => inv_data := X"c2";
394
  when "00100110" => inv_data := X"23";
395
  when "00100111" => inv_data := X"3d";
396
  when "00101000" => inv_data := X"ee";
397
  when "00101001" => inv_data := X"4c";
398
  when "00101010" => inv_data := X"95";
399
  when "00101011" => inv_data := X"0b";
400
  when "00101100" => inv_data := X"42";
401
  when "00101101" => inv_data := X"fa";
402
  when "00101110" => inv_data := X"c3";
403
  when "00101111" => inv_data := X"4e";
404
  when "00110000" => inv_data := X"08";
405
  when "00110001" => inv_data := X"2e";
406
  when "00110010" => inv_data := X"a1";
407
  when "00110011" => inv_data := X"66";
408
  when "00110100" => inv_data := X"28";
409
  when "00110101" => inv_data := X"d9";
410
  when "00110110" => inv_data := X"24";
411
  when "00110111" => inv_data := X"b2";
412
  when "00111000" => inv_data := X"76";
413
  when "00111001" => inv_data := X"5b";
414
  when "00111010" => inv_data := X"a2";
415
  when "00111011" => inv_data := X"49";
416
  when "00111100" => inv_data := X"6d";
417
  when "00111101" => inv_data := X"8b";
418
  when "00111110" => inv_data := X"d1";
419
  when "00111111" => inv_data := X"25";
420
  when "01000000" => inv_data := X"72";
421
  when "01000001" => inv_data := X"f8";
422
  when "01000010" => inv_data := X"f6";
423
  when "01000011" => inv_data := X"64";
424
  when "01000100" => inv_data := X"86";
425
  when "01000101" => inv_data := X"68";
426
  when "01000110" => inv_data := X"98";
427
  when "01000111" => inv_data := X"16";
428
  when "01001000" => inv_data := X"d4";
429
  when "01001001" => inv_data := X"a4";
430
  when "01001010" => inv_data := X"5c";
431
  when "01001011" => inv_data := X"cc";
432
  when "01001100" => inv_data := X"5d";
433
  when "01001101" => inv_data := X"65";
434
  when "01001110" => inv_data := X"b6";
435
  when "01001111" => inv_data := X"92";
436
  when "01010000" => inv_data := X"6c";
437
  when "01010001" => inv_data := X"70";
438
  when "01010010" => inv_data := X"48";
439
  when "01010011" => inv_data := X"50";
440
  when "01010100" => inv_data := X"fd";
441
  when "01010101" => inv_data := X"ed";
442
  when "01010110" => inv_data := X"b9";
443
  when "01010111" => inv_data := X"da";
444
  when "01011000" => inv_data := X"5e";
445
  when "01011001" => inv_data := X"15";
446
  when "01011010" => inv_data := X"46";
447
  when "01011011" => inv_data := X"57";
448
  when "01011100" => inv_data := X"a7";
449
  when "01011101" => inv_data := X"8d";
450
  when "01011110" => inv_data := X"9d";
451
  when "01011111" => inv_data := X"84";
452
  when "01100000" => inv_data := X"90";
453
  when "01100001" => inv_data := X"d8";
454
  when "01100010" => inv_data := X"ab";
455
  when "01100011" => inv_data := X"00";
456
  when "01100100" => inv_data := X"8c";
457
  when "01100101" => inv_data := X"bc";
458
  when "01100110" => inv_data := X"d3";
459
  when "01100111" => inv_data := X"0a";
460
  when "01101000" => inv_data := X"f7";
461
  when "01101001" => inv_data := X"e4";
462
  when "01101010" => inv_data := X"58";
463
  when "01101011" => inv_data := X"05";
464
  when "01101100" => inv_data := X"b8";
465
  when "01101101" => inv_data := X"b3";
466
  when "01101110" => inv_data := X"45";
467
  when "01101111" => inv_data := X"06";
468
  when "01110000" => inv_data := X"d0";
469
  when "01110001" => inv_data := X"2c";
470
  when "01110010" => inv_data := X"1e";
471
  when "01110011" => inv_data := X"8f";
472
  when "01110100" => inv_data := X"ca";
473
  when "01110101" => inv_data := X"3f";
474
  when "01110110" => inv_data := X"0f";
475
  when "01110111" => inv_data := X"02";
476
  when "01111000" => inv_data := X"c1";
477
  when "01111001" => inv_data := X"af";
478
  when "01111010" => inv_data := X"bd";
479
  when "01111011" => inv_data := X"03";
480
  when "01111100" => inv_data := X"01";
481
  when "01111101" => inv_data := X"13";
482
  when "01111110" => inv_data := X"8a";
483
  when "01111111" => inv_data := X"6b";
484
  when "10000000" => inv_data := X"3a";
485
  when "10000001" => inv_data := X"91";
486
  when "10000010" => inv_data := X"11";
487
  when "10000011" => inv_data := X"41";
488
  when "10000100" => inv_data := X"4f";
489
  when "10000101" => inv_data := X"67";
490
  when "10000110" => inv_data := X"dc";
491
  when "10000111" => inv_data := X"ea";
492
  when "10001000" => inv_data := X"97";
493
  when "10001001" => inv_data := X"f2";
494
  when "10001010" => inv_data := X"cf";
495
  when "10001011" => inv_data := X"ce";
496
  when "10001100" => inv_data := X"f0";
497
  when "10001101" => inv_data := X"b4";
498
  when "10001110" => inv_data := X"e6";
499
  when "10001111" => inv_data := X"73";
500
  when "10010000" => inv_data := X"96";
501
  when "10010001" => inv_data := X"ac";
502
  when "10010010" => inv_data := X"74";
503
  when "10010011" => inv_data := X"22";
504
  when "10010100" => inv_data := X"e7";
505
  when "10010101" => inv_data := X"ad";
506
  when "10010110" => inv_data := X"35";
507
  when "10010111" => inv_data := X"85";
508
  when "10011000" => inv_data := X"e2";
509
  when "10011001" => inv_data := X"f9";
510
  when "10011010" => inv_data := X"37";
511
  when "10011011" => inv_data := X"e8";
512
  when "10011100" => inv_data := X"1c";
513
  when "10011101" => inv_data := X"75";
514
  when "10011110" => inv_data := X"df";
515
  when "10011111" => inv_data := X"6e";
516
  when "10100000" => inv_data := X"47";
517
  when "10100001" => inv_data := X"f1";
518
  when "10100010" => inv_data := X"1a";
519
  when "10100011" => inv_data := X"71";
520
  when "10100100" => inv_data := X"1d";
521
  when "10100101" => inv_data := X"29";
522
  when "10100110" => inv_data := X"c5";
523
  when "10100111" => inv_data := X"89";
524
  when "10101000" => inv_data := X"6f";
525
  when "10101001" => inv_data := X"b7";
526
  when "10101010" => inv_data := X"62";
527
  when "10101011" => inv_data := X"0e";
528
  when "10101100" => inv_data := X"aa";
529
  when "10101101" => inv_data := X"18";
530
  when "10101110" => inv_data := X"be";
531
  when "10101111" => inv_data := X"1b";
532
  when "10110000" => inv_data := X"fc";
533
  when "10110001" => inv_data := X"56";
534
  when "10110010" => inv_data := X"3e";
535
  when "10110011" => inv_data := X"4b";
536
  when "10110100" => inv_data := X"c6";
537
  when "10110101" => inv_data := X"d2";
538
  when "10110110" => inv_data := X"79";
539
  when "10110111" => inv_data := X"20";
540
  when "10111000" => inv_data := X"9a";
541
  when "10111001" => inv_data := X"db";
542
  when "10111010" => inv_data := X"c0";
543
  when "10111011" => inv_data := X"fe";
544
  when "10111100" => inv_data := X"78";
545
  when "10111101" => inv_data := X"cd";
546
  when "10111110" => inv_data := X"5a";
547
  when "10111111" => inv_data := X"f4";
548
  when "11000000" => inv_data := X"1f";
549
  when "11000001" => inv_data := X"dd";
550
  when "11000010" => inv_data := X"a8";
551
  when "11000011" => inv_data := X"33";
552
  when "11000100" => inv_data := X"88";
553
  when "11000101" => inv_data := X"07";
554
  when "11000110" => inv_data := X"c7";
555
  when "11000111" => inv_data := X"31";
556
  when "11001000" => inv_data := X"b1";
557
  when "11001001" => inv_data := X"12";
558
  when "11001010" => inv_data := X"10";
559
  when "11001011" => inv_data := X"59";
560
  when "11001100" => inv_data := X"27";
561
  when "11001101" => inv_data := X"80";
562
  when "11001110" => inv_data := X"ec";
563
  when "11001111" => inv_data := X"5f";
564
  when "11010000" => inv_data := X"60";
565
  when "11010001" => inv_data := X"51";
566
  when "11010010" => inv_data := X"7f";
567
  when "11010011" => inv_data := X"a9";
568
  when "11010100" => inv_data := X"19";
569
  when "11010101" => inv_data := X"b5";
570
  when "11010110" => inv_data := X"4a";
571
  when "11010111" => inv_data := X"0d";
572
  when "11011000" => inv_data := X"2d";
573
  when "11011001" => inv_data := X"e5";
574
  when "11011010" => inv_data := X"7a";
575
  when "11011011" => inv_data := X"9f";
576
  when "11011100" => inv_data := X"93";
577
  when "11011101" => inv_data := X"c9";
578
  when "11011110" => inv_data := X"9c";
579
  when "11011111" => inv_data := X"ef";
580
  when "11100000" => inv_data := X"a0";
581
  when "11100001" => inv_data := X"e0";
582
  when "11100010" => inv_data := X"3b";
583
  when "11100011" => inv_data := X"4d";
584
  when "11100100" => inv_data := X"ae";
585
  when "11100101" => inv_data := X"2a";
586
  when "11100110" => inv_data := X"f5";
587
  when "11100111" => inv_data := X"b0";
588
  when "11101000" => inv_data := X"c8";
589
  when "11101001" => inv_data := X"eb";
590
  when "11101010" => inv_data := X"bb";
591
  when "11101011" => inv_data := X"3c";
592
  when "11101100" => inv_data := X"83";
593
  when "11101101" => inv_data := X"53";
594
  when "11101110" => inv_data := X"99";
595
  when "11101111" => inv_data := X"61";
596
  when "11110000" => inv_data := X"17";
597
  when "11110001" => inv_data := X"2b";
598
  when "11110010" => inv_data := X"04";
599
  when "11110011" => inv_data := X"7e";
600
  when "11110100" => inv_data := X"ba";
601
  when "11110101" => inv_data := X"77";
602
  when "11110110" => inv_data := X"d6";
603
  when "11110111" => inv_data := X"26";
604
  when "11111000" => inv_data := X"e1";
605
  when "11111001" => inv_data := X"69";
606
  when "11111010" => inv_data := X"14";
607
  when "11111011" => inv_data := X"63";
608
  when "11111100" => inv_data := X"55";
609
  when "11111101" => inv_data := X"21";
610
  when "11111110" => inv_data := X"0c";
611
  when "11111111" => inv_data := X"7d";
612
  when others => null;
613
end case;
614
inv_data_stdlogic := to_StdLogicVector(inv_data);
615
return inv_data_stdlogic;
616
end function inv_sbox_val;
617
 
618
function col_transform(p: state_array_type) return std_logic_vector is
619
 variable result: std_logic_vector(7 downto 0);
620
 variable m,n: std_logic_vector(7 downto 0);
621
 begin
622
   if(p(0)(7) = '1') then
623
     m := (p(0)(6 downto 0) & '0') xor "00011011";
624
   else
625
     m := (p(0)(6 downto 0) & '0');
626
   end if;
627
   if(p(1)(7) = '1') then
628
     n := (p(1)(6 downto 0) & '0') xor "00011011" xor p(1);
629
   else
630
     n := (p(1)(6 downto 0) & '0') xor p(1);
631
   end if;
632
   result := m xor n xor p(2) xor p(3);
633
   return result;
634
end function col_transform;
635
 
636
function col_inv_transform(s: state_array_type) return std_logic_vector is
637
variable result: std_logic_vector(7 downto 0);
638
variable sub0,sub1,sub2,sub3: std_logic_vector(7 downto 0);
639
variable x0,y0,z0: std_logic_vector(7 downto 0);
640
variable x1,y1,z1: std_logic_vector(7 downto 0);
641
variable x2,y2,z2: std_logic_vector(7 downto 0);
642
variable x3,y3,z3: std_logic_vector(7 downto 0);
643
begin
644
  if(s(0)(7) = '1') then
645
    x0 := (s(0)(6 downto 0) & '0') xor "00011011";
646
  else
647
    x0 := (s(0)(6 downto 0) & '0');
648
  end if;
649
  if(x0(7) = '1') then
650
    y0 := (x0(6 downto 0) & '0') xor "00011011";
651
  else
652
    y0 := (x0(6 downto 0) & '0');
653
  end if;
654
  if(y0(7) = '1') then
655
    z0 := (y0(6 downto 0) & '0') xor "00011011";
656
  else
657
    z0 := (y0(6 downto 0) & '0');
658
  end if;
659
  sub0 := (x0 xor y0 xor z0);----------
660
 
661
  if(s(1)(7) = '1') then
662
    x1 := (s(1)(6 downto 0) & '0') xor "00011011";
663
  else
664
    x1 := (s(1)(6 downto 0) & '0');
665
  end if;
666
  if(x1(7) = '1') then
667
    y1 := (x1(6 downto 0) & '0') xor "00011011";
668
  else
669
    y1 := (x1(6 downto 0) & '0');
670
  end if;
671
  if(y1(7) = '1') then
672
    z1 := (y1(6 downto 0) & '0') xor "00011011";
673
  else
674
    z1 := (y1(6 downto 0) & '0');
675
  end if;
676
  sub1 := (x1 xor z1 xor s(1));----------
677
 
678
  if(s(2)(7) = '1') then
679
    x2 := (s(2)(6 downto 0) & '0') xor "00011011";
680
  else
681
    x2 := (s(2)(6 downto 0) & '0');
682
  end if;
683
  if(x2(7) = '1') then
684
    y2 := (x2(6 downto 0) & '0') xor "00011011";
685
  else
686
    y2 := (x2(6 downto 0) & '0');
687
  end if;
688
  if(y2(7) = '1') then
689
    z2 := (y2(6 downto 0) & '0') xor "00011011";
690
  else
691
    z2 := (y2(6 downto 0) & '0');
692
  end if;
693
  sub2 := (y2 xor z2 xor s(2));----------
694
 
695
  if(s(3)(7) = '1') then
696
    x3 := (s(3)(6 downto 0) & '0') xor "00011011";
697
  else
698
    x3 := (s(3)(6 downto 0) & '0');
699
  end if;
700
  if(x3(7) = '1') then
701
    y3 := (x3(6 downto 0) & '0') xor "00011011";
702
  else
703
    y3 := (x3(6 downto 0) & '0');
704
  end if;
705
  if(y3(7) = '1') then
706
    z3 := (y3(6 downto 0) & '0') xor "00011011";
707
  else
708
    z3 := (y3(6 downto 0) & '0');
709
  end if;
710
  sub3 := (z3 xor s(3));----------
711
 
712
  result := sub0 xor sub1 xor sub2 xor sub3;
713
  return result;
714
end function col_inv_transform;
715
 
716
-- combo logic for mix columns
717
function mix_cols_routine
718
     (
719
       a_r0 :state_array_type;
720
       a_r1 :state_array_type;
721
       a_r2 :state_array_type;
722
       a_r3 :state_array_type;
723
       mode :std_logic
724
     )
725
return std_logic_vector is
726
variable b      : std_logic_vector(0 to 127);
727
variable b0     : state_array_type;
728
variable b1     : state_array_type;
729
variable b2     : state_array_type;
730
variable b3     : state_array_type;
731
-------------------------------------------------
732
variable b_0_0  : std_logic_vector(7 downto 0);
733
variable s_0_0  : state_array_type;
734
--------------------------------------------------
735
variable b_0_1  : std_logic_vector(7 downto 0);
736
variable s_0_1  : state_array_type;
737
--------------------------------------------------
738
variable b_0_2  : std_logic_vector(7 downto 0);
739
variable s_0_2  : state_array_type;
740
----------------------------------------------
741
variable b_0_3  : std_logic_vector(7 downto 0);
742
variable s_0_3  : state_array_type;
743
----------------------------------------------
744
variable b_1_0  : std_logic_vector(7 downto 0);
745
variable s_1_0  : state_array_type;
746
----------------------------------------------
747
variable b_1_1  : std_logic_vector(7 downto 0);
748
variable s_1_1  : state_array_type;
749
----------------------------------------------
750
variable b_1_2  : std_logic_vector(7 downto 0);
751
variable s_1_2  : state_array_type;
752
----------------------------------------------
753
variable b_1_3  : std_logic_vector(7 downto 0);
754
variable s_1_3  : state_array_type;
755
----------------------------------------------
756
variable b_2_0  : std_logic_vector(7 downto 0);
757
variable s_2_0  : state_array_type;
758
----------------------------------------------
759
variable b_2_1  : std_logic_vector(7 downto 0);
760
variable s_2_1  : state_array_type;
761
----------------------------------------------
762
variable b_2_2  : std_logic_vector(7 downto 0);
763
variable s_2_2  : state_array_type;
764
----------------------------------------------
765
variable b_2_3  : std_logic_vector(7 downto 0);
766
variable s_2_3  : state_array_type;
767
----------------------------------------------
768
variable b_3_0  : std_logic_vector(7 downto 0);
769
variable s_3_0  : state_array_type;
770
----------------------------------------------
771
variable b_3_1  : std_logic_vector(7 downto 0);
772
variable s_3_1  : state_array_type;
773
----------------------------------------------
774
variable b_3_2  : std_logic_vector(7 downto 0);
775
variable s_3_2  : state_array_type;
776
----------------------------------------------
777
variable b_3_3  : std_logic_vector(7 downto 0);
778
variable s_3_3  : state_array_type;
779
--------------------------------------------------
780
begin
781
if(mode = '1') then
782
  s_0_0 := a_r0;
783
  b_0_0 := col_transform(s_0_0);
784
------------------------------------------------------
785
  s_0_1 := a_r1;
786
  b_0_1 := col_transform(s_0_1);
787
------------------------------------------------------
788
  s_0_2 := a_r2;
789
  b_0_2 := col_transform(s_0_2);
790
------------------------------------------------------
791
  s_0_3 := a_r3;
792
  b_0_3 := col_transform(s_0_3);
793
--****************************************************************
794
  s_1_0 := (a_r0(1),a_r0(2),a_r0(3),a_r0(0));
795
  b_1_0 := col_transform(s_1_0);
796
------------------------------------------------------
797
  s_1_1 := (a_r1(1),a_r1(2),a_r1(3),a_r1(0));
798
  b_1_1 := col_transform(s_1_1);
799
------------------------------------------------------
800
  s_1_2 := (a_r2(1),a_r2(2),a_r2(3),a_r2(0));
801
  b_1_2 := col_transform(s_1_2);
802
------------------------------------------------------
803
  s_1_3 := (a_r3(1),a_r3(2),a_r3(3),a_r3(0));
804
  b_1_3 := col_transform(s_1_3);
805
--****************************************************************
806
  s_2_0 := (a_r0(2),a_r0(3),a_r0(0),a_r0(1));
807
  b_2_0 := col_transform(s_2_0);
808
------------------------------------------------------
809
  s_2_1 := (a_r1(2),a_r1(3),a_r1(0),a_r1(1));
810
  b_2_1 := col_transform(s_2_1);
811
------------------------------------------------------
812
  s_2_2 := (a_r2(2),a_r2(3),a_r2(0),a_r2(1));
813
  b_2_2 := col_transform(s_2_2);
814
------------------------------------------------------
815
  s_2_3 := (a_r3(2),a_r3(3),a_r3(0),a_r3(1));
816
  b_2_3 := col_transform(s_2_3);
817
--****************************************************************
818
  s_3_0 := (a_r0(3),a_r0(0),a_r0(1),a_r0(2));
819
  b_3_0 := col_transform(s_3_0);
820
------------------------------------------------------
821
  s_3_1 := (a_r1(3),a_r1(0),a_r1(1),a_r1(2));
822
  b_3_1 := col_transform(s_3_1);
823
------------------------------------------------------
824
  s_3_2 := (a_r2(3),a_r2(0),a_r2(1),a_r2(2));
825
  b_3_2 := col_transform(s_3_2);
826
------------------------------------------------------
827
  s_3_3 := (a_r3(3),a_r3(0),a_r3(1),a_r3(2));
828
  b_3_3 := col_transform(s_3_3);
829
--****************************************************************
830
else
831
  s_0_0 := a_r0;
832
  b_0_0 := col_inv_transform(s_0_0);
833
------------------------------------------------------
834
  s_0_1 := a_r1;
835
  b_0_1 := col_inv_transform(s_0_1);
836
------------------------------------------------------
837
  s_0_2 := a_r2;
838
  b_0_2 := col_inv_transform(s_0_2);
839
------------------------------------------------------
840
  s_0_3 := a_r3;
841
  b_0_3 := col_inv_transform(s_0_3);
842
--****************************************************************
843
  s_1_0 := (a_r0(1),a_r0(2),a_r0(3),a_r0(0));
844
  b_1_0 := col_inv_transform(s_1_0);
845
------------------------------------------------------
846
  s_1_1 := (a_r1(1),a_r1(2),a_r1(3),a_r1(0));
847
  b_1_1 := col_inv_transform(s_1_1);
848
------------------------------------------------------
849
  s_1_2 := (a_r2(1),a_r2(2),a_r2(3),a_r2(0));
850
  b_1_2 := col_inv_transform(s_1_2);
851
------------------------------------------------------
852
  s_1_3 := (a_r3(1),a_r3(2),a_r3(3),a_r3(0));
853
  b_1_3 := col_inv_transform(s_1_3);
854
--****************************************************************
855
  s_2_0 := (a_r0(2),a_r0(3),a_r0(0),a_r0(1));
856
  b_2_0 := col_inv_transform(s_2_0);
857
------------------------------------------------------
858
  s_2_1 := (a_r1(2),a_r1(3),a_r1(0),a_r1(1));
859
  b_2_1 := col_inv_transform(s_2_1);
860
------------------------------------------------------
861
  s_2_2 := (a_r2(2),a_r2(3),a_r2(0),a_r2(1));
862
  b_2_2 := col_inv_transform(s_2_2);
863
------------------------------------------------------
864
  s_2_3 := (a_r3(2),a_r3(3),a_r3(0),a_r3(1));
865
  b_2_3 := col_inv_transform(s_2_3);
866
--****************************************************************
867
  s_3_0 := (a_r0(3),a_r0(0),a_r0(1),a_r0(2));
868
  b_3_0 := col_inv_transform(s_3_0);
869
------------------------------------------------------
870
  s_3_1 := (a_r1(3),a_r1(0),a_r1(1),a_r1(2));
871
  b_3_1 := col_inv_transform(s_3_1);
872
------------------------------------------------------
873
  s_3_2 := (a_r2(3),a_r2(0),a_r2(1),a_r2(2));
874
  b_3_2 := col_inv_transform(s_3_2);
875
------------------------------------------------------
876
  s_3_3 := (a_r3(3),a_r3(0),a_r3(1),a_r3(2));
877
  b_3_3 := col_inv_transform(s_3_3);
878
--****************************************************************
879
end if;
880
b := (b_0_0 & b_1_0 & b_2_0 & b_3_0 & b_0_1 & b_1_1 & b_2_1 & b_3_1 &
881
      b_0_2 & b_1_2 & b_2_2 & b_3_2 & b_0_3 & b_1_3 & b_2_3 & b_3_3);
882
return b;
883
end function mix_cols_routine;
884
 
885
end package body aes_package;
886
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.