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

Subversion Repositories camellia-vhdl

[/] [camellia-vhdl/] [trunk/] [pipelining/] [6round256.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/14/2007
6 7 pfulgoni
-- Last Update:   04/09/2008
7 2 pfulgoni
-- Project Name:  camellia-vhdl
8
-- Description:   Six rounds of F, for 128/192/256-bit key en/decryption
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 SIXROUND256 is
32
    generic (
33
            k1e128_offset  : INTEGER; -- encryption 128bit
34
            k1e128_shift   : INTEGER;
35
            k2e128_offset  : INTEGER;
36
            k2e128_shift   : INTEGER;
37
            k3e128_offset  : INTEGER;
38
            k3e128_shift   : INTEGER;
39
            k4e128_offset  : INTEGER;
40
            k4e128_shift   : INTEGER;
41
            k5e128_offset  : INTEGER;
42
            k5e128_shift   : INTEGER;
43
            k6e128_offset  : INTEGER;
44
            k6e128_shift   : INTEGER;
45
            k1d128_offset  : INTEGER; -- decryption 128bit
46
            k1d128_shift   : INTEGER;
47
            k2d128_offset  : INTEGER;
48
            k2d128_shift   : INTEGER;
49
            k3d128_offset  : INTEGER;
50
            k3d128_shift   : INTEGER;
51
            k4d128_offset  : INTEGER;
52
            k4d128_shift   : INTEGER;
53
            k5d128_offset  : INTEGER;
54
            k5d128_shift   : INTEGER;
55
            k6d128_offset  : INTEGER;
56
            k6d128_shift   : INTEGER;
57
            k1e256_offset  : INTEGER; -- encryption 192/256bit
58
            k1e256_shift   : INTEGER;
59
            k2e256_offset  : INTEGER;
60
            k2e256_shift   : INTEGER;
61
            k3e256_offset  : INTEGER;
62
            k3e256_shift   : INTEGER;
63
            k4e256_offset  : INTEGER;
64
            k4e256_shift   : INTEGER;
65
            k5e256_offset  : INTEGER;
66
            k5e256_shift   : INTEGER;
67
            k6e256_offset  : INTEGER;
68
            k6e256_shift   : INTEGER;
69
            k1d256_offset  : INTEGER; -- decryption 192/256bit
70
            k1d256_shift   : INTEGER;
71
            k2d256_offset  : INTEGER;
72
            k2d256_shift   : INTEGER;
73
            k3d256_offset  : INTEGER;
74
            k3d256_shift   : INTEGER;
75
            k4d256_offset  : INTEGER;
76
            k4d256_shift   : INTEGER;
77
            k5d256_offset  : INTEGER;
78
            k5d256_shift   : INTEGER;
79
            k6d256_offset  : INTEGER;
80
            k6d256_shift   : INTEGER
81
            );
82
    port(
83
            reset   : in  STD_LOGIC;
84
            clk     : in  STD_LOGIC;
85
            dec1    : in  STD_LOGIC;
86
            k_len1  : in  STD_LOGIC_VECTOR (0 to 1);
87
            k1      : in  STD_LOGIC_VECTOR (0 to 511);
88
            dec2    : in  STD_LOGIC;
89
            k_len2  : in  STD_LOGIC_VECTOR (0 to 1);
90
            k2      : in  STD_LOGIC_VECTOR (0 to 511);
91
            dec3    : in  STD_LOGIC;
92
            k_len3  : in  STD_LOGIC_VECTOR (0 to 1);
93
            k3      : in  STD_LOGIC_VECTOR (0 to 511);
94
            dec4    : in  STD_LOGIC;
95
            k_len4  : in  STD_LOGIC_VECTOR (0 to 1);
96
            k4      : in  STD_LOGIC_VECTOR (0 to 511);
97
            dec5    : in  STD_LOGIC;
98
            k_len5  : in  STD_LOGIC_VECTOR (0 to 1);
99
            k5      : in  STD_LOGIC_VECTOR (0 to 511);
100
            dec6    : in  STD_LOGIC;
101
            k_len6  : in  STD_LOGIC_VECTOR (0 to 1);
102
            k6      : in  STD_LOGIC_VECTOR (0 to 511);
103
            l_in    : in  STD_LOGIC_VECTOR (0 to 63);
104
            r_in    : in  STD_LOGIC_VECTOR (0 to 63);
105
            l_out   : out STD_LOGIC_VECTOR (0 to 63);
106
            r_out   : out STD_LOGIC_VECTOR (0 to 63)
107
            );
108
end SIXROUND256;
109
 
110
architecture RTL of SIXROUND256 is
111
 
112
    component F is
113
        port    (
114
                reset : in STD_LOGIC;
115
                clk   : in STD_LOGIC;
116
                x     : in STD_LOGIC_VECTOR (0 to 63);
117
                k     : in STD_LOGIC_VECTOR (0 to 63);
118
                z     : out STD_LOGIC_VECTOR (0 to 63)
119
                );
120
    end component;
121
 
122
    -- subkeys
123
    signal t1_enc128 : STD_LOGIC_VECTOR (0 to 127);
124
    signal t2_enc128 : STD_LOGIC_VECTOR (0 to 127);
125
    signal t3_enc128 : STD_LOGIC_VECTOR (0 to 127);
126
    signal t4_enc128 : STD_LOGIC_VECTOR (0 to 127);
127
    signal t5_enc128 : STD_LOGIC_VECTOR (0 to 127);
128
    signal t6_enc128 : STD_LOGIC_VECTOR (0 to 127);
129
    signal t1_dec128 : STD_LOGIC_VECTOR (0 to 127);
130
    signal t2_dec128 : STD_LOGIC_VECTOR (0 to 127);
131
    signal t3_dec128 : STD_LOGIC_VECTOR (0 to 127);
132
    signal t4_dec128 : STD_LOGIC_VECTOR (0 to 127);
133
    signal t5_dec128 : STD_LOGIC_VECTOR (0 to 127);
134
    signal t6_dec128 : STD_LOGIC_VECTOR (0 to 127);
135
    signal t1_enc256 : STD_LOGIC_VECTOR (0 to 127);
136
    signal t2_enc256 : STD_LOGIC_VECTOR (0 to 127);
137
    signal t3_enc256 : STD_LOGIC_VECTOR (0 to 127);
138
    signal t4_enc256 : STD_LOGIC_VECTOR (0 to 127);
139
    signal t5_enc256 : STD_LOGIC_VECTOR (0 to 127);
140
    signal t6_enc256 : STD_LOGIC_VECTOR (0 to 127);
141
    signal t1_dec256 : STD_LOGIC_VECTOR (0 to 127);
142
    signal t2_dec256 : STD_LOGIC_VECTOR (0 to 127);
143
    signal t3_dec256 : STD_LOGIC_VECTOR (0 to 127);
144
    signal t4_dec256 : STD_LOGIC_VECTOR (0 to 127);
145
    signal t5_dec256 : STD_LOGIC_VECTOR (0 to 127);
146
    signal t6_dec256 : STD_LOGIC_VECTOR (0 to 127);
147
    signal int_k1     : STD_LOGIC_VECTOR (0 to 63);
148
    signal int_k2     : STD_LOGIC_VECTOR (0 to 63);
149
    signal int_k3     : STD_LOGIC_VECTOR (0 to 63);
150
    signal int_k4     : STD_LOGIC_VECTOR (0 to 63);
151
    signal int_k5     : STD_LOGIC_VECTOR (0 to 63);
152
    signal int_k6     : STD_LOGIC_VECTOR (0 to 63);
153
 
154
    -- f inputs
155
    signal f1_in  : STD_LOGIC_VECTOR (0 to 63);
156
    signal f2_in  : STD_LOGIC_VECTOR (0 to 63);
157
    signal f3_in  : STD_LOGIC_VECTOR (0 to 63);
158
    signal f4_in  : STD_LOGIC_VECTOR (0 to 63);
159
    signal f5_in  : STD_LOGIC_VECTOR (0 to 63);
160
    signal f6_in  : STD_LOGIC_VECTOR (0 to 63);
161
 
162
    -- f outputs
163
    signal f1_out : STD_LOGIC_VECTOR (0 to 63);
164
    signal f2_out : STD_LOGIC_VECTOR (0 to 63);
165
    signal f3_out : STD_LOGIC_VECTOR (0 to 63);
166
    signal f4_out : STD_LOGIC_VECTOR (0 to 63);
167
    signal f5_out : STD_LOGIC_VECTOR (0 to 63);
168
    signal f6_out : STD_LOGIC_VECTOR (0 to 63);
169
 
170
    -- intermediate registers
171
    signal reg1_l : STD_LOGIC_VECTOR (0 to 63);
172
    signal reg1_r : STD_LOGIC_VECTOR (0 to 63);
173
    signal reg2_l : STD_LOGIC_VECTOR (0 to 63);
174
    signal reg2_r : STD_LOGIC_VECTOR (0 to 63);
175
    signal reg3_l : STD_LOGIC_VECTOR (0 to 63);
176
    signal reg3_r : STD_LOGIC_VECTOR (0 to 63);
177
    signal reg4_l : STD_LOGIC_VECTOR (0 to 63);
178
    signal reg4_r : STD_LOGIC_VECTOR (0 to 63);
179
    signal reg5_l : STD_LOGIC_VECTOR (0 to 63);
180
    signal reg5_r : STD_LOGIC_VECTOR (0 to 63);
181
    signal reg6_l : STD_LOGIC_VECTOR (0 to 63);
182
    signal reg6_r : STD_LOGIC_VECTOR (0 to 63);
183
 
184
begin
185
 
186
    -- shift of kl, kr, ka, kb
187
    t1_enc128 <= k1(k1e128_offset+k1e128_shift to k1e128_offset+127) &
188
                k1(k1e128_offset to k1e128_offset+k1e128_shift-1);
189
    t2_enc128 <= k2(k2e128_offset+k2e128_shift to k2e128_offset+127) &
190
                k2(k2e128_offset to k2e128_offset+k2e128_shift-1);
191
    t3_enc128 <= k3(k3e128_offset+k3e128_shift to k3e128_offset+127) &
192
                k3(k3e128_offset to k3e128_offset+k3e128_shift-1);
193
    t4_enc128 <= k4(k4e128_offset+k4e128_shift to k4e128_offset+127) &
194
                k4(k4e128_offset to k4e128_offset+k4e128_shift-1);
195
    t5_enc128 <= k5(k5e128_offset+k5e128_shift to k5e128_offset+127) &
196
                k5(k5e128_offset to k5e128_offset+k5e128_shift-1);
197
    t6_enc128 <= k6(k6e128_offset+k6e128_shift to k6e128_offset+127) &
198
                k6(k6e128_offset to k6e128_offset+k6e128_shift-1);
199
 
200
    t1_dec128 <= k1(k1d128_offset+k1d128_shift to k1d128_offset+127) &
201
                k1(k1d128_offset to k1d128_offset+k1d128_shift-1);
202
    t2_dec128 <= k2(k2d128_offset+k2d128_shift to k2d128_offset+127) &
203
                k2(k2d128_offset to k2d128_offset+k2d128_shift-1);
204
    t3_dec128 <= k3(k3d128_offset+k3d128_shift to k3d128_offset+127) &
205
                k3(k3d128_offset to k3d128_offset+k3d128_shift-1);
206
    t4_dec128 <= k4(k4d128_offset+k4d128_shift to k4d128_offset+127) &
207
                k4(k4d128_offset to k4d128_offset+k4d128_shift-1);
208
    t5_dec128 <= k5(k5d128_offset+k5d128_shift to k5d128_offset+127) &
209
                k5(k5d128_offset to k5d128_offset+k5d128_shift-1);
210
    t6_dec128 <= k6(k6d128_offset+k6d128_shift to k6d128_offset+127) &
211
                k6(k6d128_offset to k6d128_offset+k6d128_shift-1);
212
 
213
    t1_enc256 <= k1(k1e256_offset+k1e256_shift to k1e256_offset+127) &
214
                k1(k1e256_offset to k1e256_offset+k1e256_shift-1);
215
    t2_enc256 <= k2(k2e256_offset+k2e256_shift to k2e256_offset+127) &
216
                k2(k2e256_offset to k2e256_offset+k2e256_shift-1);
217
    t3_enc256 <= k3(k3e256_offset+k3e256_shift to k3e256_offset+127) &
218
                k3(k3e256_offset to k3e256_offset+k3e256_shift-1);
219
    t4_enc256 <= k4(k4e256_offset+k4e256_shift to k4e256_offset+127) &
220
                k4(k4e256_offset to k4e256_offset+k4e256_shift-1);
221
    t5_enc256 <= k5(k5e256_offset+k5e256_shift to k5e256_offset+127) &
222
                k5(k5e256_offset to k5e256_offset+k5e256_shift-1);
223
    t6_enc256 <= k6(k6e256_offset+k6e256_shift to k6e256_offset+127) &
224
                k6(k6e256_offset to k6e256_offset+k6e256_shift-1);
225
 
226
    t1_dec256 <= k1(k1d256_offset+k1d256_shift to k1d256_offset+127) &
227
                k1(k1d256_offset to k1d256_offset+k1d256_shift-1);
228
    t2_dec256 <= k2(k2d256_offset+k2d256_shift to k2d256_offset+127) &
229
                k2(k2d256_offset to k2d256_offset+k2d256_shift-1);
230
    t3_dec256 <= k3(k3d256_offset+k3d256_shift to k3d256_offset+127) &
231
                k3(k3d256_offset to k3d256_offset+k3d256_shift-1);
232
    t4_dec256 <= k4(k4d256_offset+k4d256_shift to k4d256_offset+127) &
233
                k4(k4d256_offset to k4d256_offset+k4d256_shift-1);
234
    t5_dec256 <= k5(k5d256_offset+k5d256_shift to k5d256_offset+127) &
235
                k5(k5d256_offset to k5d256_offset+k5d256_shift-1);
236
    t6_dec256 <= k6(k6d256_offset+k6d256_shift to k6d256_offset+127) &
237
                k6(k6d256_offset to k6d256_offset+k6d256_shift-1);
238
 
239
    -- subkeys generation
240
    -- int_k1, int_k3, int_k5 get always the left/right slice when en/decrypting
241
    -- int_k2, int_k4, int_k6 get always the right/left slice when en/decrypting
242
    int_k1 <= t1_enc128(0 to 63)   when dec1='0' and k_len1(0)='0' else
243
              t1_dec128(64 to 127) when dec1='1' and k_len1(0)='0' else
244
              t1_enc256(0 to 63)   when dec1='0' and k_len1(0)='1' else
245
              t1_dec256(64 to 127);
246
    int_k2 <= t2_enc128(64 to 127) when dec2='0' and k_len2(0)='0' else
247
              t2_dec128(0 to 63)   when dec2='1' and k_len2(0)='0' else
248
              t2_enc256(64 to 127) when dec2='0' and k_len2(0)='1' else
249
              t2_dec256(0 to 63);
250
    int_k3 <= t3_enc128(0 to 63)   when dec3='0' and k_len3(0)='0' else
251
              t3_dec128(64 to 127) when dec3='1' and k_len3(0)='0' else
252
              t3_enc256(0 to 63)   when dec3='0' and k_len3(0)='1' else
253
              t3_dec256(64 to 127);
254
    int_k4 <= t4_enc128(64 to 127) when dec4='0' and k_len4(0)='0' else
255
              t4_dec128(0 to 63)   when dec4='1' and k_len4(0)='0' else
256
              t4_enc256(64 to 127) when dec4='0' and k_len4(0)='1' else
257
              t4_dec256(0 to 63);
258
    int_k5 <= t5_enc128(0 to 63)   when dec5='0' and k_len5(0)='0' else
259
              t5_dec128(64 to 127) when dec5='1' and k_len5(0)='0' else
260
              t5_enc256(0 to 63)   when dec5='0' and k_len5(0)='1' else
261
              t5_dec256(64 to 127);
262
    int_k6 <= t6_enc128(64 to 127) when dec6='0' and k_len6(0)='0' else
263
              t6_dec128(0 to 63)   when dec6='1' and k_len6(0)='0' else
264
              t6_enc256(64 to 127) when dec6='0' and k_len6(0)='1' else
265
              t6_dec256(0 to 63);
266
 
267
    -- f inputs
268
    f1_in <= l_in;
269
    f2_in <= f1_out xor reg1_r;
270
    f3_in <= f2_out xor reg2_r;
271
    f4_in <= f3_out xor reg3_r;
272
    f5_in <= f4_out xor reg4_r;
273
    f6_in <= f5_out xor reg5_r;
274
 
275
    F1  : F
276
        port map(reset, clk, f1_in, int_k1, f1_out);
277
    F2  : F
278
        port map(reset, clk, f2_in, int_k2, f2_out);
279
    F3  : F
280
        port map(reset, clk, f3_in, int_k3, f3_out);
281
    F4  : F
282
        port map(reset, clk, f4_in, int_k4, f4_out);
283
    F5  : F
284
        port map(reset, clk, f5_in, int_k5, f5_out);
285
    F6  : F
286
        port map(reset, clk, f6_in, int_k6, f6_out);
287
 
288
 
289
    REG : process(reset, clk)
290
    begin
291
 
292
        if (reset = '1') then
293
            reg1_l <= (others=>'0');
294
            reg1_r <= (others=>'0');
295
            reg2_l <= (others=>'0');
296
            reg2_r <= (others=>'0');
297
            reg3_l <= (others=>'0');
298
            reg3_r <= (others=>'0');
299
            reg4_l <= (others=>'0');
300
            reg4_r <= (others=>'0');
301
            reg5_l <= (others=>'0');
302
            reg5_r <= (others=>'0');
303
            reg6_l <= (others=>'0');
304
            reg6_r <= (others=>'0');
305
        else
306 7 pfulgoni
            if (rising_edge(clk)) then -- rising clock edge
307 2 pfulgoni
                reg1_l <= f1_in;
308
                reg1_r <= r_in;
309
                reg2_l <= f2_in;
310
                reg2_r <= reg1_l;
311
                reg3_l <= f3_in;
312
                reg3_r <= reg2_l;
313
                reg4_l <= f4_in;
314
                reg4_r <= reg3_l;
315
                reg5_l <= f5_in;
316
                reg5_r <= reg4_l;
317
                reg6_l <= f6_in;
318
                reg6_r <= reg5_l;
319
            end if;
320
        end if;
321
    end process;
322
 
323
    -- there isn't an output register
324
    l_out   <= f6_out xor reg6_r;
325
    r_out   <= reg6_l;
326
 
327
end RTL;

powered by: WebSVN 2.1.0

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