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

Subversion Repositories nfcc

[/] [nfcc/] [trunk/] [snow/] [snow.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
entity snow is
35
  port (
36
  key              : in  bit_vector ( 31 downto 0);
37
  IV               : in  bit_vector ( 31 downto 0);
38
  n                : in  bit_vector ( 31 downto 0);
39
  zt               : out bit_vector ( 31 downto 0);
40
  ld               : in  bit;
41
  init             : in  bit;
42
  shift            : in  bit;
43
  clk              : in  bit;
44
  rst              : in  bit
45
  );
46
end snow;
47
 
48
architecture phy of snow is
49
 
50
  signal lsfr      :     bit_vector (511 downto 0);
51
  signal s0        :     bit_vector ( 31 downto 0);
52
  signal s1        :     bit_vector ( 31 downto 0);
53
  signal s2        :     bit_vector ( 31 downto 0);
54
  signal s3        :     bit_vector ( 31 downto 0);
55
  signal s4        :     bit_vector ( 31 downto 0);
56
  signal s5        :     bit_vector ( 31 downto 0);
57
  signal s6        :     bit_vector ( 31 downto 0);
58
  signal s7        :     bit_vector ( 31 downto 0);
59
  signal s8        :     bit_vector ( 31 downto 0);
60
  signal s9        :     bit_vector ( 31 downto 0);
61
  signal sa        :     bit_vector ( 31 downto 0);
62
  signal sb        :     bit_vector ( 31 downto 0);
63
  signal sc        :     bit_vector ( 31 downto 0);
64
  signal sd        :     bit_vector ( 31 downto 0);
65
  signal se        :     bit_vector ( 31 downto 0);
66
  signal sf        :     bit_vector ( 31 downto 0);
67
 
68
  signal v         :     bit_vector ( 31 downto 0);
69
 
70
  signal ss1i      :     bit_vector ( 31 downto 0); -- S1
71
  signal ss1o      :     bit_vector ( 31 downto 0); -- S1
72
  signal ss2i      :     bit_vector ( 31 downto 0); -- S2
73
  signal ss2o      :     bit_vector ( 31 downto 0); -- S2
74
 
75
  signal F         :     bit_vector ( 31 downto 0); -- F  = (sf +) xor R2
76
  signal r         :     bit_vector ( 31 downto 0); -- r  = R2 + (R3 xor s5)
77
  signal R1        :     bit_vector ( 31 downto 0); -- R1 = r
78
  signal R2        :     bit_vector ( 31 downto 0); -- R2 = S1(R1)
79
  signal R3        :     bit_vector ( 31 downto 0); -- R3 = S2(R2)
80
 
81
  signal mli       :     bit_vector (  7 downto 0);
82
  signal mlo       :     bit_vector ( 31 downto 0);
83
  signal dvi       :     bit_vector (  7 downto 0);
84
  signal dvo       :     bit_vector ( 31 downto 0);
85
 
86
  signal ivma      :     bit_vector (127 downto 0) := X"ffffffffffffffff0000000000000000";
87
  signal ivmb      :     bit_vector (127 downto 0) := X"0000000000000000ffffffff00000000";
88
  signal ivmc      :     bit_vector (127 downto 0) := X"000000000000000000000000ffffffff";
89
 
90
  component sboxs1
91
  port (
92
  w                :     bit_vector ( 31 downto 0);
93
  r                :     bit_vector ( 31 downto 0)
94
  );
95
  end component;
96
 
97
  component sboxs2
98
  port (
99
  w                :     bit_vector ( 31 downto 0);
100
  r                :     bit_vector ( 31 downto 0)
101
  );
102
  end component;
103
 
104
  component mula
105
  port (
106
  c                :     bit_vector (  7 downto 0);
107
  w                :     bit_vector ( 31 downto 0)
108
  );
109
  end component;
110
 
111
  component diva
112
  port (
113
  c                :     bit_vector (  7 downto 0);
114
  w                :     bit_vector ( 31 downto 0)
115
  );
116
  end component;
117
 
118
begin
119
 
120
  ss1              : sboxs1
121
  port map (
122
  w                => ss1i,
123
  r                => ss1o
124
  );
125
  ss2              : sboxs2
126
  port map (
127
  w                => ss2i,
128
  r                => ss2o
129
  );
130
  ml               : mula
131
  port map (
132
  c                => mli,
133
  w                => mlo
134
  );
135
  dv               : diva
136
  port map (
137
  c                => dvi,
138
  w                => dvo
139
  );
140
--persistent connection
141
  s0               <= lsfr(511 downto 480);
142
  s1               <= lsfr(479 downto 448);
143
  s2               <= lsfr(447 downto 416);
144
  s3               <= lsfr(415 downto 384);
145
  s4               <= lsfr(383 downto 352);
146
  s5               <= lsfr(351 downto 320);
147
  s6               <= lsfr(319 downto 288);
148
  s7               <= lsfr(287 downto 256);
149
  s8               <= lsfr(255 downto 224);
150
  s9               <= lsfr(223 downto 192);
151
  sa               <= lsfr(191 downto 160);
152
  sb               <= lsfr(159 downto 128);
153
  sc               <= lsfr(127 downto  96);
154
  sd               <= lsfr( 95 downto  64);
155
  se               <= lsfr( 63 downto  32);
156
  sf               <= lsfr( 31 downto   0);
157
--persistent connection
158
 
159
--FSM-Network
160
  F                <= (sf + R1) xor R2 ; -- CAVEATS: THIS LINE IS NOT PORTABLE CODE
161
  r                <=  R2 + (R3 xor s5); -- CAVEATS: THIS LINE IS NOT PORTABLE CODE
162
  R1               <= r;
163
  ss1i             <= R1;
164
  R2               <= ss1o;
165
  ss2i             <= R2;
166
  R3               <= ss2o;
167
--FSM-Network
168
 
169
  mli              <= s0(31 downto 24);
170
  dvi              <= sb( 7 downto  0);
171
--v                == (S0,1||S0,2||S0,3||0x00)  xor MULa(S0,0) xor S2 xor (0x00||S11,0||S11,1||S11,2) xor DIVa(S11,3)
172
  v                <= (s0(23 downto 0) & X"00") xor mlo        xor s2 xor (X"00" & sb(31 downto 8))   xor dvo xor F when init = '1' else
173
                      (s0(23 downto 0) & X"00") xor mlo        xor s2 xor (X"00" & sb(31 downto 8))   xor dvo;
174
 
175
  process (clk)
176
  begin
177
    if((clk = '1') and clk'event) then
178
      if (rst = '1') then
179
        lsfr       <= (others => '0');
180
        ivma       <= X"ffffffffffffffff0000000000000000";
181
        ivmb       <= X"0000000000000000ffffffff00000000";
182
        ivmc       <= X"000000000000000000000000ffffffff";
183
      elsif (ld   = '1') then
184
        ivma(127 downto   0) <= ivma( 95 downto   0) & ivma(127 downto  96);   -- IV mask a
185
        ivmb(127 downto   0) <= ivmb( 95 downto   0) & ivmb(127 downto  96);   -- IV mask b
186
        ivmc(127 downto   0) <= ivmc( 95 downto   0) & ivmc(127 downto  96);   -- IV mask c
187
--rotate in each block
188
        lsfr(127 downto   0) <= lsfr( 95 downto   0) & lsfr(127 downto  96);   -- sc...sf
189
        lsfr(255 downto 128) <= lsfr(223 downto 128) & lsfr(255 downto 224);   -- s8...sb
190
        lsfr(383 downto 256) <= lsfr(351 downto 256) & lsfr(383 downto 352);   -- s4...s7
191
        lsfr(511 downto 384) <= lsfr(479 downto 384) & lsfr(511 downto 448);   -- s0...s3
192
--key
193
        lsfr(127 downto  96) <= key;                                           -- sc == key
194
        lsfr(255 downto 224) <= key xor X"ffffffff";                           -- s8 == key xor 1
195
        lsfr(383 downto 352) <= key;                                           -- s4 == key
196
        lsfr(511 downto 448) <= key xor X"ffffffff";                           -- s0 == key xor 1
197
--special cases for IV, the sequences is quite peculiar: sf, sc, and sa, s9
198
        lsfr( 31 downto   0) <= IV and ivma(127 downto  96);                   -- first 2 clock go to sf then sc
199
        lsfr(255 downto 224) <= IV and ivmb(127 downto  96);                   -- next  1 clock go to sa
200
        lsfr(191 downto 160) <= IV and ivmc(127 downto  96);                   -- last  1 clock go to s9
201
      elsif (shift = '1') then
202
        lsfr       <= lsfr(479 downto   0) & v;
203
      end if;
204
    end if;
205
  end process;
206
 
207
  zt               <= F xor s0;
208
 
209
end phy;

powered by: WebSVN 2.1.0

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