OpenCores
URL https://opencores.org/ocsvn/camellia-vhdl/camellia-vhdl/trunk

Subversion Repositories camellia-vhdl

[/] [camellia-vhdl/] [trunk/] [pipelining/] [keysched256.vhd] - Blame information for rev 10

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

Line No. Rev Author Line
1 2 pfulgoni
 
2
--------------------------------------------------------------------------------
3
-- Designer:      Paolo Fulgoni <pfulgoni@opencores.org>
4
--
5
-- Create Date:   09/15/2007
6 7 pfulgoni
-- Last Update:   04/09/2008
7 2 pfulgoni
-- Project Name:  camellia-vhdl
8
-- Description:   Key schedule for 128/192/256-bit keys
9
--
10
-- Copyright (C) 2007  Paolo Fulgoni
11
-- This file is part of camellia-vhdl.
12
-- camellia-vhdl is free software; you can redistribute it and/or modify
13
-- it under the terms of the GNU General Public License as published by
14
-- the Free Software Foundation; either version 3 of the License, or
15
-- (at your option) any later version.
16
-- camellia-vhdl is distributed in the hope that it will be useful,
17
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
-- GNU General Public License for more details.
20
-- You should have received a copy of the GNU General Public License
21
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
--
23
-- The Camellia cipher algorithm is 128 bit cipher developed by NTT and
24
-- Mitsubishi Electric researchers.
25
-- http://info.isl.ntt.co.jp/crypt/eng/camellia/
26
--------------------------------------------------------------------------------
27
library IEEE;
28
use IEEE.std_logic_1164.all;
29
 
30
 
31
entity KEYSCHED256 is
32
    port(
33
            reset  : in STD_LOGIC;
34
            clk    : in STD_LOGIC;
35
            kl_in  : in STD_LOGIC_VECTOR (0 to 127);
36
            kr_in  : in STD_LOGIC_VECTOR (0 to 127);
37
            kl_out : out STD_LOGIC_VECTOR (0 to 127);
38
            kr_out : out STD_LOGIC_VECTOR (0 to 127);
39
            ka_out : out STD_LOGIC_VECTOR (0 to 127);
40
            kb_out : out STD_LOGIC_VECTOR (0 to 127)
41
            );
42
end KEYSCHED256;
43
 
44
architecture RTL of KEYSCHED256 is
45
 
46
    component F is
47
        port    (
48
                reset : in STD_LOGIC;
49
                clk   : in STD_LOGIC;
50
                x     : in STD_LOGIC_VECTOR (0 to 63);
51
                k     : in STD_LOGIC_VECTOR (0 to 63);
52
                z     : out STD_LOGIC_VECTOR (0 to 63)
53
                );
54
    end component;
55
 
56
    -- f inputs
57
    signal f1_in  : STD_LOGIC_VECTOR (0 to 63);
58
    signal f2_in  : STD_LOGIC_VECTOR (0 to 63);
59
    signal f3_in  : STD_LOGIC_VECTOR (0 to 63);
60
    signal f4_in  : STD_LOGIC_VECTOR (0 to 63);
61
    signal f5_in  : STD_LOGIC_VECTOR (0 to 63);
62
    signal f6_in  : STD_LOGIC_VECTOR (0 to 63);
63
 
64
    -- f outputs
65
    signal f1_out : STD_LOGIC_VECTOR (0 to 63);
66
    signal f2_out : STD_LOGIC_VECTOR (0 to 63);
67
    signal f3_out : STD_LOGIC_VECTOR (0 to 63);
68
    signal f4_out : STD_LOGIC_VECTOR (0 to 63);
69
    signal f5_out : STD_LOGIC_VECTOR (0 to 63);
70
    signal f6_out : STD_LOGIC_VECTOR (0 to 63);
71
 
72
    -- intermediate registers
73
    signal reg1_l  : STD_LOGIC_VECTOR (0 to 63);
74
    signal reg1_r  : STD_LOGIC_VECTOR (0 to 63);
75
    signal reg1_kl : STD_LOGIC_VECTOR (0 to 127);
76
    signal reg1_kr : STD_LOGIC_VECTOR (0 to 127);
77
    signal reg2_l  : STD_LOGIC_VECTOR (0 to 63);
78
    signal reg2_r  : STD_LOGIC_VECTOR (0 to 63);
79
    signal reg2_kl : STD_LOGIC_VECTOR (0 to 127);
80
    signal reg2_kr : STD_LOGIC_VECTOR (0 to 127);
81
    signal reg3_l  : STD_LOGIC_VECTOR (0 to 63);
82
    signal reg3_r  : STD_LOGIC_VECTOR (0 to 63);
83
    signal reg3_kl : STD_LOGIC_VECTOR (0 to 127);
84
    signal reg3_kr : STD_LOGIC_VECTOR (0 to 127);
85
    signal reg4_l  : STD_LOGIC_VECTOR (0 to 63);
86
    signal reg4_r  : STD_LOGIC_VECTOR (0 to 63);
87
    signal reg4_kl : STD_LOGIC_VECTOR (0 to 127);
88
    signal reg4_kr : STD_LOGIC_VECTOR (0 to 127);
89
    signal reg5_l  : STD_LOGIC_VECTOR (0 to 63);
90
    signal reg5_r  : STD_LOGIC_VECTOR (0 to 63);
91
    signal reg5_kl : STD_LOGIC_VECTOR (0 to 127);
92
    signal reg5_kr : STD_LOGIC_VECTOR (0 to 127);
93
    signal reg5_ka : STD_LOGIC_VECTOR (0 to 127);
94
    signal reg6_l  : STD_LOGIC_VECTOR (0 to 63);
95
    signal reg6_r  : STD_LOGIC_VECTOR (0 to 63);
96
    signal reg6_kl : STD_LOGIC_VECTOR (0 to 127);
97
    signal reg6_kr : STD_LOGIC_VECTOR (0 to 127);
98
    signal reg6_ka : STD_LOGIC_VECTOR (0 to 127);
99
 
100
    -- constant keys
101
    constant k1 : STD_LOGIC_VECTOR (0 to 63) := X"A09E667F3BCC908B";
102
    constant k2 : STD_LOGIC_VECTOR (0 to 63) := X"B67AE8584CAA73B2";
103
    constant k3 : STD_LOGIC_VECTOR (0 to 63) := X"C6EF372FE94F82BE";
104
    constant k4 : STD_LOGIC_VECTOR (0 to 63) := X"54FF53A5F1D36F1C";
105
    constant k5 : STD_LOGIC_VECTOR (0 to 63) := X"10E527FADE682D1D";
106
    constant k6 : STD_LOGIC_VECTOR (0 to 63) := X"B05688C2B3E6C1FD";
107
 
108
    -- intermediate signals
109
    signal inter1  : STD_LOGIC_VECTOR (0 to 127);
110
    signal inter2  : STD_LOGIC_VECTOR (0 to 127);
111
    signal ka_tmp  : STD_LOGIC_VECTOR (0 to 127);
112
 
113
begin
114
 
115
    F1 : F
116
        port map(reset, clk, f1_in, k1, f1_out);
117
    F2 : F
118
        port map(reset, clk, f2_in, k2, f2_out);
119
    F3 : F
120
        port map(reset, clk, f3_in, k3, f3_out);
121
    F4 : F
122
        port map(reset, clk, f4_in, k4, f4_out);
123
    F5 : F
124
        port map(reset, clk, f5_in, k5, f5_out);
125
    F6 : F
126
        port map(reset, clk, f6_in, k6, f6_out);
127
 
128
    REG : process(reset, clk)
129
    begin
130
 
131
        if (reset = '1') then
132
            reg1_l  <= (others=>'0');
133
            reg1_r  <= (others=>'0');
134
            reg1_kl <= (others=>'0');
135
            reg1_kr <= (others=>'0');
136
            reg2_l  <= (others=>'0');
137
            reg2_r  <= (others=>'0');
138
            reg2_kl <= (others=>'0');
139
            reg2_kr <= (others=>'0');
140
            reg3_l  <= (others=>'0');
141
            reg3_r  <= (others=>'0');
142
            reg3_kl <= (others=>'0');
143
            reg3_kr <= (others=>'0');
144
            reg4_l  <= (others=>'0');
145
            reg4_r  <= (others=>'0');
146
            reg4_kl <= (others=>'0');
147
            reg4_kr <= (others=>'0');
148
            reg5_l  <= (others=>'0');
149
            reg5_r  <= (others=>'0');
150
            reg5_kl <= (others=>'0');
151
            reg5_kr <= (others=>'0');
152
            reg5_ka <= (others=>'0');
153
            reg6_l  <= (others=>'0');
154
            reg6_r  <= (others=>'0');
155
            reg6_kl <= (others=>'0');
156
            reg6_kr <= (others=>'0');
157
            reg6_ka <= (others=>'0');
158
        else
159 7 pfulgoni
            if (rising_edge(clk)) then -- rising clock edge
160 2 pfulgoni
                reg1_l  <= f1_in;
161
                reg1_r  <= kl_in(64 to 127) xor kr_in(64 to 127);
162
                reg1_kl <= kl_in;
163
                reg1_kr <= kr_in;
164
                reg2_l  <= f2_in;
165
                reg2_r  <= reg1_l;
166
                reg2_kl <= reg1_kl;
167
                reg2_kr <= reg1_kr;
168
                reg3_l  <= f3_in;
169
                reg3_r  <= inter1(64 to 127);
170
                reg3_kl <= reg2_kl;
171
                reg3_kr <= reg2_kr;
172
                reg4_l  <= f4_in;
173
                reg4_r  <= reg3_l;
174
                reg4_kl <= reg3_kl;
175
                reg4_kr <= reg3_kr;
176
                reg5_l  <= f5_in;
177
                reg5_r  <= inter2(64 to 127);
178
                reg5_kl <= reg4_kl;
179
                reg5_kr <= reg4_kr;
180
                reg5_ka <= ka_tmp;
181
                reg6_l  <= f6_in;
182
                reg6_r  <= reg5_l;
183
                reg6_kl <= reg5_kl;
184
                reg6_kr <= reg5_kr;
185
                reg6_ka <= reg5_ka;
186
            end if;
187
        end if;
188
    end process;
189
 
190
    inter1  <= ((f2_out xor reg2_r) & reg2_l) xor reg2_kl;
191
    ka_tmp <= (f4_out xor reg4_r) & reg4_l;
192
    inter2  <= ka_tmp xor reg4_kr;
193
 
194
    -- f inputs
195
    f1_in <= kl_in(0 to 63) xor kr_in(0 to 63);
196
    f2_in <= f1_out xor reg1_r;
197
    f3_in <= inter1(0 to 63);
198
    f4_in <= f3_out xor reg3_r;
199
    f5_in <= inter2(0 to 63);
200
    f6_in <= f5_out xor reg5_r;
201
 
202
    -- output
203
    kl_out <= reg6_kl;
204
    kr_out <= reg6_kr;
205
    ka_out <= reg6_ka;
206
    kb_out <= (f6_out xor reg6_r) & reg6_l;
207
 
208
end RTL;

powered by: WebSVN 2.1.0

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