| 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;
|