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

Subversion Repositories nfcc

[/] [nfcc/] [trunk/] [camellia/] [camellia.vhdl] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 arif_endro
-- ------------------------------------------------------------------------
2
-- Copyright (C) 2010 Arif Endro Nugroho
3
-- All rights reserved.
4
-- 
5
-- Redistribution and use in source and binary forms, with or without
6
-- modification, are permitted provided that the following conditions
7
-- are met:
8
-- 
9
-- 1. Redistributions of source code must retain the above copyright
10
--    notice, this list of conditions and the following disclaimer.
11
-- 2. Redistributions in binary form must reproduce the above copyright
12
--    notice, this list of conditions and the following disclaimer in the
13
--    documentation and/or other materials provided with the distribution.
14
-- 
15
-- THIS SOFTWARE IS PROVIDED BY ARIF ENDRO NUGROHO "AS IS" AND ANY EXPRESS
16
-- OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
-- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
-- DISCLAIMED. IN NO EVENT SHALL ARIF ENDRO NUGROHO BE LIABLE FOR ANY
19
-- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21
-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22
-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23
-- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24
-- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25
-- POSSIBILITY OF SUCH DAMAGE.
26
-- 
27
-- End Of License.
28
-- ------------------------------------------------------------------------
29
 
30
library ieee;
31
use ieee.std_logic_1164.all;
32
use ieee.std_logic_unsigned.all;
33
 
34
-- 128  64  0 
35
--    Ln  Rn
36
--
37
-- L_{r} = R_{r-1} xor F(L_{r-1}, k_r)
38
-- R_{r} = L_{r-1}
39
 
40
-- because P-function working in 64 bit field, then the minimum block is 64.
41
entity camellia is
42
  port (
43
  pt               : in  bit_vector ( 63 downto 0);
44
  key              : in  bit_vector ( 63 downto 0);
45
  Nk               : in  bit_vector (  3 downto 0);
46
  ldpt             : in  bit;
47
  ct               : out bit_vector ( 63 downto 0);
48
--probe
49
--r_prb            : out bit_vector ( 63 downto 0);
50
--l_prb            : out bit_vector ( 63 downto 0);
51
--s_prb            : out bit_vector ( 63 downto 0);
52
--z_prb            : out bit_vector ( 63 downto 0);
53
--fla_prb          : out bit_vector ( 63 downto 0);
54
--ir_prb           : out bit_vector ( 63 downto 0);
55
--il_prb           : out bit_vector ( 63 downto 0);
56
--rc_prb           : out bit_vector (  2 downto 0);
57
--probe
58
  v                : out bit;
59
  clk              : in  bit;
60
  rst              : in  bit
61
  );
62
end camellia;
63
 
64
architecture phy of camellia is
65
 
66
  signal ireg1     :     bit_vector (127 downto 0);
67
  signal ikey      :     bit_vector ( 63 downto 0);
68
  signal ipt       :     bit_vector ( 63 downto 0);
69
  signal iptt      :     bit_vector ( 63 downto 0);
70
  signal f         :     bit_vector ( 63 downto 0);
71
  signal l         :     bit_vector ( 63 downto 0);
72
  signal r         :     bit_vector ( 63 downto 0);
73
  signal ri        :     bit_vector ( 63 downto 0);
74
  signal il        :     bit_vector ( 63 downto 0);
75
  signal ir        :     bit_vector ( 63 downto 0);
76
  signal fl1       :     bit_vector ( 63 downto 0);
77
  signal fl1i      :     bit_vector ( 63 downto 0);
78
  signal fl2       :     bit_vector ( 63 downto 0);
79
  signal flx       :     bit_vector ( 31 downto 0);
80
  signal fla       :     bit_vector ( 63 downto 0);
81
  signal flb       :     bit_vector ( 63 downto 0);
82
  signal s1i       :     bit_vector (  7 downto 0);
83
  signal s2i       :     bit_vector (  7 downto 0);
84
  signal s2t       :     bit_vector (  7 downto 0);
85
  signal s3i       :     bit_vector (  7 downto 0);
86
  signal s4i       :     bit_vector (  7 downto 0);
87
  signal s5i       :     bit_vector (  7 downto 0);
88
  signal s5t       :     bit_vector (  7 downto 0);
89
  signal s6i       :     bit_vector (  7 downto 0);
90
  signal s7i       :     bit_vector (  7 downto 0);
91
  signal s8i       :     bit_vector (  7 downto 0);
92
  signal s1o       :     bit_vector (  7 downto 0);
93
  signal s2o       :     bit_vector (  7 downto 0);
94
  signal s3o       :     bit_vector (  7 downto 0);
95
  signal s4o       :     bit_vector (  7 downto 0);
96
  signal s5o       :     bit_vector (  7 downto 0);
97
  signal s6o       :     bit_vector (  7 downto 0);
98
  signal s7o       :     bit_vector (  7 downto 0);
99
  signal s8o       :     bit_vector (  7 downto 0);
100
  signal z1        :     bit_vector (  7 downto 0);
101
  signal z2        :     bit_vector (  7 downto 0);
102
  signal z3        :     bit_vector (  7 downto 0);
103
  signal z4        :     bit_vector (  7 downto 0);
104
  signal z5        :     bit_vector (  7 downto 0);
105
  signal z6        :     bit_vector (  7 downto 0);
106
  signal z7        :     bit_vector (  7 downto 0);
107
  signal z8        :     bit_vector (  7 downto 0);
108
  signal c2b       :     bit_vector (  1 downto 0);
109
  signal c2b_cr    :     bit_vector (  1 downto 0);
110
  signal c3b       :     bit_vector (  2 downto 0);
111
  signal c3b_cr    :     bit_vector (  2 downto 0);
112
  signal c3b_rst   :     bit;
113
  signal c2b_rst   :     bit;
114
  signal rc        :     bit;
115
  signal vld4      :     bit;
116
  signal vld8      :     bit;
117
  signal ildpt     :     bit;
118
  signal ildptt    :     bit;
119
  signal ildpt_rst :     bit;
120
 
121
  component sbox
122
    port (
123
    di             : in  bit_vector (  7 downto 0);
124
    do             : out bit_vector (  7 downto 0)
125
    );
126
  end component;
127
 
128
begin
129
 
130
  sb1 : sbox
131
  port map (
132
    di             => s1i,
133
    do             => s1o
134
    );
135
  sb2 : sbox
136
  port map (
137
    di             => s2i,
138
    do             => s2o
139
    );
140
  sb3 : sbox
141
  port map (
142
    di             => s3i,
143
    do             => s3o
144
    );
145
  sb4 : sbox
146
  port map (
147
    di             => s4i,
148
    do             => s4o
149
    );
150
  sb5 : sbox
151
  port map (
152
    di             => s5i,
153
    do             => s5o
154
    );
155
  sb6 : sbox
156
  port map (
157
    di             => s6i,
158
    do             => s6o
159
    );
160
  sb7 : sbox
161
  port map (
162
    di             => s7i,
163
    do             => s7o
164
    );
165
  sb8 : sbox
166
  port map (
167
    di             => s8i,
168
    do             => s8o
169
    );
170
 
171
--probe
172
--r_prb            <=   r;
173
--l_prb            <=   l;
174
--fla_prb          <= fla;
175
--ir_prb           <=  ir;
176
--il_prb           <=  il;
177
--rc_prb           <= c3b;
178
--s_prb            <= s8i & s7i & s6i & s5i & s4i & s3i & s2i & s1i;
179
--z_prb            <= z1  & z2  & z3  & z4  & z5  & z6  & z7  & z8 ;
180
--probe
181
 
182
  c3b_cr(0)            <= '0'; -- LSB always zero
183
  c3b_cr( 2 downto  1) <= ( ((c3b( 1 downto  0) and B"01") or (c3b( 1 downto  0) and c3b_cr( 1 downto  0))) or (B"01" and c3b_cr( 1 downto  0)) );
184
 
185
  process (clk)
186
  begin
187
    if (clk = '1' and clk'event) then
188
      if (c3b_rst = '1') then
189
        c3b <= B"000";
190
      else
191
        c3b <= ((c3b xor B"001") xor c3b_cr);
192
      end if;
193
    end if;
194
  end process;
195
 
196
  c2b_cr(0)            <= '0'; -- LSB always zero
197
  c2b_cr(1)            <= c2b(0);
198
 
199
  process (clk)
200
  begin
201
    if (clk = '1' and clk'event) then
202
      if (c2b_rst = '1') then
203
        c2b <= B"00";
204
      elsif (rc = '1') then
205
        c2b <= ((c2b xor B"01") xor c2b_cr);
206
      end if;
207
    end if;
208
  end process;
209
 
210
  process (clk)
211
  begin
212
    if ((clk = '1') and clk'event) then
213
      if (rst = '1') then
214
        ildpt      <=  '0';
215
        ildptt     <=  '0';
216
        ipt        <= (others => '0');
217
        ikey       <= (others => '0');
218
        fl1i       <= (others => '0');
219
        iptt       <= (others => '0');
220
        ri         <= (others => '0');
221
      else
222
        ildptt     <= ldpt;
223
        ildpt      <= ildptt;
224
        fl1i       <=  fl1;
225
        iptt       <=   pt;
226
        ipt        <= iptt;
227
        ikey       <=  key;
228
        ri         <=    r;
229
      end if;
230
    end if;
231
  end process;
232
 
233
  rc               <= not(not(c3b(2)) or not(c3b(1)) or not(c3b(0))); -- B"111" -- count until 7 ( 8 clock cycle)
234
  ildpt_rst        <= ((ildpt xor ildptt) and ildpt);
235
  c3b_rst          <= rst or ildpt_rst or rc ;
236
  c2b_rst          <= rst or ildpt_rst;
237
 
238
--L_{r}            == R_{r-1} xor F(L_{r-1}, kr)
239
--R_{r}            == L_{r-1}
240
 
241
  l                <= ireg1(127 downto 64)      ;
242
  r                <= ireg1( 63 downto  0)      ;
243
 
244
  s1i              <=   l  (  7 downto   0) xor ikey( 7 downto  0);
245
  s2t              <=   l  ( 15 downto   8) xor ikey(15 downto  8);
246
  s2i              <= s2t(6 downto 0) & s2t(7);
247
  s3i              <=   l  ( 23 downto  16) xor ikey(23 downto 16);
248
  s4i              <=   l  ( 31 downto  24) xor ikey(31 downto 24);-- SBOX4(ROTL1x)
249
  s5t              <=   l  ( 39 downto  32) xor ikey(39 downto 32);
250
  s5i              <= s5t(6 downto 0) & s5t(7);
251
  s6i              <=   l  ( 47 downto  40) xor ikey(47 downto 40);
252
  s7i              <=   l  ( 55 downto  48) xor ikey(55 downto 48);-- SBOX4(ROTL1x)
253
  s8i              <=   l  ( 63 downto  56) xor ikey(63 downto 56);
254
 
255
--S-function
256
 
257
  z8               <= s1o;                                   -- SBOX1  
258
  z7               <= s2o;                                   -- SBOX4(ROTL1x)
259
  z6               <= s3o(0) & s3o(7 downto 1);              -- SBOX3 ROTR1
260
  z5               <= s4o(6 downto 0) & s4o(7);              -- SBOX2 ROTL1  
261
  z4               <= s5o;                                   -- SBOX4(ROTL1x)
262
  z3               <= s6o(0) & s6o(7 downto 1);              -- SBOX3 ROTR1
263
  z2               <= s7o(6 downto 0) & s7o(7);              -- SBOX2 ROTL1  
264
  z1               <= s8o;                                   -- SBOX1
265
 
266
--P-function
267
--z'1              == z1  xor z3  xor z4  xor z6  xor z7  xor z8
268
--z'2              == z1  xor z2  xor z4  xor z5  xor z7  xor z8
269
--z'3              == z1  xor z2  xor z3  xor z5  xor z6  xor z8
270
--z'4              == z2  xor z3  xor z4  xor z5  xor z6  xor z7
271
--z'5              == z1  xor z2  xor z6  xor z7  xor z8
272
--z'6              == z2  xor z3  xor z5  xor z7  xor z8
273
--z'7              == z3  xor z4  xor z5  xor z6  xor z8
274
--z'8              == z1  xor z4  xor z5  xor z6  xor z7
275
 
276
  f (63 downto 56) <= z1  xor z3  xor z4  xor z6  xor z7  xor z8 ;
277
  f (55 downto 48) <= z1  xor z2  xor z4  xor z5  xor z7  xor z8 ;
278
  f (47 downto 40) <= z1  xor z2  xor z3  xor z5  xor z6  xor z8 ;
279
  f (39 downto 32) <= z2  xor z3  xor z4  xor z5  xor z6  xor z7 ;
280
  f (31 downto 24) <= z1  xor z2  xor z6  xor z7  xor z8         ;
281
  f (23 downto 16) <= z2  xor z3  xor z5  xor z7  xor z8         ;
282
  f (15 downto  8) <= z3  xor z4  xor z5  xor z6  xor z8         ;
283
  f ( 7 downto  0) <= z1  xor z4  xor z5  xor z6  xor z7         ;
284
 
285
--F-function
286
 
287
  fla              <= r xor f;
288
 
289
--FL1-function
290
--Xi(64) == XL(32) & XR(32)
291
--Ki(64) == KL(32) & KR(32)
292
--Yr(32) == ((XL and Kl) <<< 1) xor XR
293
--Yl(32) == ( Yr or  Kr)        xor XL
294
--Yi(64) == Yl(32) & Yr(32)
295
  fl1(31 downto  0)<=  ((( l (62 downto 32) and ikey(62 downto 32)) & ( l (63) and ikey(63))) xor  l (31 downto  0));
296
--fl1(31 downto  0)<= ((((fla(62 downto 32) and ikey(62 downto 32)) & (fla(63) and ikey(32))) xor fla(31 downto  0)) or ikey(31 downto  0)) xor fla(63 downto 32);
297
  fl1(63 downto 32)<=    (fl1(31 downto  0) or  ikey(31 downto  0)) xor l (63 downto 32);
298
 
299
  il               <= fla when rc  = '0' else fl1i;
300
 
301
--FL2-function
302
--Yi(64) == YL(32) & YR(32)
303
--Ki(64) == KL(32) & KR(32)
304
--Xl(32) == ( Yr or  Kr)        xor YL
305
--Xr(32) == ((Xl and Kl) <<< 1) xor YR
306
--Xi(64) == Xl(32) & Xr(32)
307
  fl2(63 downto 32)<=  ((ri(31 downto  0) or ikey(31 downto  0)) xor ri(63 downto 32));
308
  flx(31 downto  0)<= (((ri(31 downto  0) or ikey(31 downto  0)) xor ri(63 downto 32)) and ikey(63 downto 32));
309
  fl2(31 downto  0)<=  ((   flx(30 downto  0) & flx(31)   )      xor ri(31 downto  0));
310
 
311
  ir               <= l  when rc  = '0' else fl2;
312
 
313
  process (clk)
314
  begin
315
    if ((clk = '1') and clk'event) then
316
      if (rst = '1') then
317
        ireg1(127 downto  0) <= (others => '0') ;
318
      elsif (ildpt = '1') then
319
        ireg1(127 downto  0) <= ireg1( 63 downto  0) & (ipt xor ikey);    -- initial round 2 clock
320
      else
321
        ireg1( 63 downto  0) <= ir              ;
322
        ireg1(127 downto 64) <= il              ;
323
      end if;
324
    end if;
325
  end process;
326
 
327
-- this valid signal for Nk=4   2 round (8 clock) plus the next 6-7 (the last two clock of its round) approx: 24 clock for each block
328
  vld4             <=  not(not(c2b(1)) or     c2b(0) ) and (not(not(c3b(2)) or not(c3b(1)) or not(c3b(0))) or not(not(c3b(2)) or not(c3b(1)) or c3b(0)));
329
-- this valid signal for Nk=6/8 3 round (8 clock) plus the next 6-7 (the last two clock of its round) aprrox: 32 clock for each block
330
  vld8             <=  not(not(c2b(1)) or not(c2b(0))) and (not(not(c3b(2)) or not(c3b(1)) or not(c3b(0))) or not(not(c3b(2)) or not(c3b(1)) or c3b(0)));
331
  ct               <= r xor ikey                ;
332
  v                <= vld4 when (not(Nk(3) or not(Nk(2)) or Nk(1) or Nk(0)) = '1') else vld8;
333
 
334
end phy;

powered by: WebSVN 2.1.0

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