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

Subversion Repositories avs_aes

[/] [avs_aes/] [trunk/] [rtl/] [VHDL/] [mixcol_inv.vhd] - Blame information for rev 13

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ruschi
--------------------------------------------------------------------------------
2 10 ruschi
-- This file is part of the project  avs_aes
3
-- see: http://opencores.org/project,avs_aes
4 2 ruschi
--
5
-- description:
6
-- Mix the columns of the AES Block (decryption version)
7
-- Invert what was computed in mixcol_fwd.vhd
8
-- For decrytion the inverse matrix is needed:
9
--
10
--              | E B D 9 |       a(n,0)
11
--              | 9 E B D | x a(n,1)  
12
--              | D 9 E B |       a(n,2)
13
--              | B D 9 E |       a(n,3)
14
--
15
-------------------------------------------------------------------------------
16
--
17
-- Author(s):
18
--         Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de)
19
--
20
--------------------------------------------------------------------------------
21
-- Copyright (c) 2009, Authors and opencores.org
22
-- All rights reserved.
23
--
24
-- Redistribution and use in source and binary forms, with or without modification,
25
-- are permitted provided that the following conditions are met:
26
--    * Redistributions of source code must retain the above copyright notice,
27
--    this list of conditions and the following disclaimer.
28
--    * Redistributions in binary form must reproduce the above copyright notice,
29
--    this list of conditions and the following disclaimer in the documentation
30
--    and/or other materials provided with the distribution.
31
--    * Neither the name of the organization nor the names of its contributors
32
--    may be used to endorse or promote products derived from this software without
33
--    specific prior written permission.
34
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
35
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36
-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37
-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
38
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
39
-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
40
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
41
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
42
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
43
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
44
-- THE POSSIBILITY OF SUCH DAMAGE
45
-------------------------------------------------------------------------------
46
-- version management:
47
-- $Author$
48
-- $Date$
49
-- $Revision$                   
50
-------------------------------------------------------------------------------
51
 
52
 
53
library IEEE;
54
use IEEE.std_logic_1164.all;
55
use ieee.numeric_std.all;
56
 
57 11 ruschi
library avs_aes_lib;
58
use avs_aes_lib.avs_aes_pkg.all;
59 2 ruschi
 
60
 
61
architecture inv of mixcol
62
is
63
        signal byte0 : BYTE;
64
        signal byte1 : BYTE;
65
        signal byte2 : BYTE;
66
        signal byte3 : BYTE;
67
begin  -- architecture ARCH1
68
 
69
        -- Easier handling of the single cells of the column
70
        byte0 <= col_in(31 downto 24);
71
        byte1 <= col_in(23 downto 16);
72
        byte2 <= col_in(15 downto 8);
73
        byte3 <= col_in(7 downto 0);
74
 
75
        -- purpose: multiplies the column of the input block with the matrix
76
        -- type   : combinational
77
        -- inputs : direction,byte0,byte1,byte2,byte3
78
        -- outputs: col_out
79
        matrix_mult : process ( byte0, byte1, byte2, byte3) is
80
                -- temporary results for the row-col multiplication have to be 9 Bits
81
                -- long because the input is shifted left
82
                variable tmp_res0 : STD_LOGIC_VECTOR(10 downto 0);       -- result of row1*col
83
                variable tmp_res1 : STD_LOGIC_VECTOR(10 downto 0);       -- result of row2*col
84
                variable tmp_res2 : STD_LOGIC_VECTOR(10 downto 0);       -- result of row3*col
85
                variable tmp_res3 : STD_LOGIC_VECTOR(10 downto 0);       -- result of row4*col
86
        begin  -- process matrix_mult
87
                -- Multiply by 1st row of the inverse matrix ( E B D 9 )
88
                tmp_res0 := byte0 & "000" xor '0' & byte0 & "00" xor "00" & byte0 & '0' xor        -- byte0*8+byte0*4+byte0*2 +
89
                                        byte1 & "000" xor "00" & byte1 & '0' xor "000" & byte1 xor       -- byte1*8      +  byte1*2 + byte1
90
                                        byte2 & "000" xor "0" & byte2 & "00" xor "000" & byte2 xor       -- byte2*8      +  byte2*4 + byte2
91
                                        byte3 & "000" xor "000" & byte3;  -- byte3*8 + byte3*1
92
 
93
                -- check if bits>7 = 1 and XOR with magic numbers to make it 8 BIT
94
                if tmp_res0(10) = '1' then
95
                        tmp_res0 := tmp_res0 xor "10001101100";
96
                end if;
97
                if tmp_res0(9) = '1' then
98
                        tmp_res0 := tmp_res0 xor "01000110110";
99
                end if;
100
                if tmp_res0(8) = '1' then
101
                        tmp_res0 := tmp_res0 xor "00100011011";
102
                end if;
103
 
104
                -- Multiply by 2nd row of the inverse matrix ( 9 E B D )
105
                tmp_res1 := byte0 & "000" xor "000" & byte0 xor
106
                                        byte1 & "000" xor "0" & byte1 & "00" xor "00" & byte1 & '0' xor
107
                                        byte2 & "000" xor "00" & byte2 & '0' xor "000" & byte2 xor
108
                                        byte3 & "000" xor '0' & byte3 & "00" xor "000" & byte3;
109
 
110
                -- check if bits>7 = 1 and XOR with magic numbers to make it 8 BIT
111
                if tmp_res1(10) = '1' then
112
                        tmp_res1 := tmp_res1 xor "10001101100";
113
                end if;
114
                if tmp_res1(9) = '1' then
115
                        tmp_res1 := tmp_res1 xor "01000110110";
116
                end if;
117
                if tmp_res1(8) = '1' then
118
                        tmp_res1 := tmp_res1 xor "00100011011";
119
                end if;
120
 
121
                -- Multiply by 3rd row of the inverse matrix    (D 9 E B) 
122
                tmp_res2 := byte0 & "000" xor "0" & byte0 & "00" xor "000" & byte0 xor   --      byte0*8 +  byte0*4 + byte0
123
                                        byte1 & "000" xor "000" & byte1 xor      -- byte1*8       +      byte1
124
                                        byte2 & "000" xor "0" & byte2 & "00" xor "00" & byte2 &'0' xor    -- byte2*8      +  byte2*4 +   byte2*2
125
                                        byte3 & "000" xor "00" & byte3 & '0' xor "000" & byte3;   -- byte3*8      +      byte3*2 + byte3
126
                -- check if bits>7 = 1 and XOR with magic numbers to make it 8 BIT
127
                if tmp_res2(10) = '1' then
128
                        tmp_res2 := tmp_res2 xor "10001101100";
129
                end if;
130
                if tmp_res2(9) = '1' then
131
                        tmp_res2 := tmp_res2 xor "01000110110";
132
                end if;
133
                if tmp_res2(8) = '1' then
134
                        tmp_res2 := tmp_res2 xor "00100011011";
135
                end if;
136
 
137
                -- Multiply by 4th row of the inverse matrix (B D 9 E)
138
                tmp_res3 := byte0 & "000" xor "00" & byte0 & '0' xor "000" & byte0 xor   --      byte0*8 +  byte0*2 + byte0*1
139
                                        byte1 & "000" xor '0' & byte1 &"00" xor "000" & byte1 xor  -- byte1*8 + byte1*4 + byte1
140
                                        byte2 & "000" xor "000" & byte2 xor      -- byte2*8 + byte2
141
                                        byte3 & "000" xor "0" & byte3 & "00" xor "00" & byte3 &'0';        -- byte3*8      +       byte3*4 + byte3*2
142
 
143
                -- check if bits>7 = 1 and XOR with magic numbers to make it 8 BIT
144
                if tmp_res3(10) = '1' then
145
                        tmp_res3 := tmp_res3 xor "10001101100";
146
                end if;
147
                if tmp_res3(9) = '1' then
148
                        tmp_res3 := tmp_res3 xor "01000110110";
149
                end if;
150
                if tmp_res3(8) = '1' then
151
                        tmp_res3 := tmp_res3 xor "00100011011";
152
                end if;
153
 
154
                -- build output signal (BYTE_RANGE =7 downto 0 see util_pkg.vhd)
155
                col_out(31 downto 24) <= tmp_res0(BYTE_RANGE);
156
                col_out(23 downto 16) <= tmp_res1(BYTE_RANGE);
157
                col_out(15 downto 8)  <= tmp_res2(BYTE_RANGE);
158
                col_out(7 downto 0)        <= tmp_res3(BYTE_RANGE);
159
        end process matrix_mult;
160
 
161
end architecture inv;
162
 

powered by: WebSVN 2.1.0

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