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

Subversion Repositories BasicDES

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 3 to Rev 4
    Reverse comparison

Rev 3 → Rev 4

/trunk/rtl/vhdl/des56.vhd
40,7 → 40,10
-- CVS Revision History
--
-- $Log: not supported by cvs2svn $
-- Revision 1.1.1.1 2003/10/20 03:51:08 srmcqueen
-- First Upload, working module
--
--
 
-- This module implements the DES 56-bit Key Block Cypher. It expects to receive the 64-bit
-- data block to be encrypted or decrypted on the indata bus, and the 64-bit key on the inKey
52,29 → 55,49
--
-- Comments, questions and suggestions may be directed to the author at srmcqueen@mcqueentech.com.
 
-- 2005/09/02
-- Optimized key handling
-- added optional signals, changed RDY to be low on reset
-- Perttu Fagerlund
 
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
-- 2005/10/15
-- Added comments
-- Steven R. McQueen
--
--
 
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.all;
 
-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;
ENTITY des56 IS
PORT(
indata : IN std_logic_vector (0 TO 63);
inkey : IN std_logic_vector (0 TO 63);
outdata : OUT std_logic_vector (0 TO 63);
decipher : IN std_logic;
ds : IN std_logic;
clk : IN std_logic;
rst : IN std_logic;
rdy_next_next_cycle : OUT std_logic; -- output will be ready in two clock cycles - optional signal
rdy_next_cycle : OUT std_logic; -- output will be ready in one clock cycle - optional signal
rdy : OUT std_logic -- output is ready NOW
);
 
entity des56 is
Port ( indata : in std_logic_vector(0 to 63);
inkey : in std_logic_vector(0 to 63);
outdata : out std_logic_vector(0 to 63);
decipher: in std_logic;
ds : in std_logic;
clk : in std_logic;
rst : in std_logic;
rdy : out std_logic);
end des56;
 
END des56 ;
 
architecture des of des56 is
-- ***********************************************************
-- * The following attributes are useful in Xilinx ISE
-- * for debugging purposes. They have been commented
-- * out to permit logic optimization.
-- ***********************************************************
--attribute keep: string;
--attribute nodelay: string;
--attribute s: string;
100,23 → 123,6
--signal xclk: std_logic;
--attribute keep of xclk: signal is "true";
 
-- These signals hold the round keys - they are loaded on the first clock
signal K01: std_logic_vector(0 to 47);
signal K02: std_logic_vector(0 to 47);
signal K03: std_logic_vector(0 to 47);
signal K04: std_logic_vector(0 to 47);
signal K05: std_logic_vector(0 to 47);
signal K06: std_logic_vector(0 to 47);
signal K07: std_logic_vector(0 to 47);
signal K08: std_logic_vector(0 to 47);
signal K09: std_logic_vector(0 to 47);
signal K10: std_logic_vector(0 to 47);
signal K11: std_logic_vector(0 to 47);
signal K12: std_logic_vector(0 to 47);
signal K13: std_logic_vector(0 to 47);
signal K14: std_logic_vector(0 to 47);
signal K15: std_logic_vector(0 to 47);
 
-- mykey and inmsg are inputs to the encryption round logic
-- they will get new values on each clock
-- outmsg is the result of the encryption round, it will become inmsg for the next round
139,8 → 145,17
signal decrypt: std_logic;
signal ready: std_logic;
 
-- various work signals. I want most of them to be wires, but
-- they may be registers or latches, depending on the synthesizer
-- **********************************************
-- * New key registers.
-- **********************************************
signal key_l : std_logic_vector(0 to 27);
signal key_r : std_logic_vector(0 to 27);
signal keylr : std_logic_vector(0 to 55);
 
-- ******************************************************************
-- * various work signals. I want most of them to be wires, but
-- * they may be registers or latches, depending on the synthesizer
-- ******************************************************************
signal d: std_logic_vector(0 to 47);
signal f: std_logic_vector(0 to 31);
signal b1: std_logic_vector(0 to 5);
160,329 → 175,179
signal s7: std_logic_vector(0 to 3);
signal s8: std_logic_vector(0 to 3);
 
 
 
begin
 
-- Register Input Data
--
-- When data strobe is high and clock is on the rising edge,
-- load the round key registers.
RegData: process (clk, ds, decipher)
 
-- ***************************************************************************************************
-- * Route wires to copy the key value for the next encryption round
-- ***************************************************************************************************
keylr <= key_l & key_r;
mykey <= keylr(13) & keylr(16) & keylr(10) & keylr(23) & keylr(0) & keylr(4) & keylr(2) & keylr(27) &
keylr(14) & keylr(5) & keylr(20) & keylr(9) & keylr(22) & keylr(18) & keylr(11) & keylr(3) &
keylr(25) & keylr(7) & keylr(15) & keylr(6) & keylr(26) & keylr(19) & keylr(12) & keylr(1) &
keylr(40) & keylr(51) & keylr(30) & keylr(36) & keylr(46) & keylr(54) & keylr(29) & keylr(39) &
keylr(50) & keylr(44) & keylr(32) & keylr(47) & keylr(43) & keylr(48) & keylr(38) & keylr(55) &
keylr(33) & keylr(52) & keylr(45) & keylr(41) & keylr(49) & keylr(35) & keylr(28) & keylr(31);
SetKey: process (clk, countup, decipher)
-- *********************************************************************************************
-- * New key management logic by Perttu Fagerlund
-- * On the first clock, the first round key is registered. Thereafter, the round key is simply
-- * shifted by the necessary number of bits. This saves more than 57% of the required register
-- * logic cells over the previous code, which directly registered all of the round keys at once.
-- *
-- * A very slight speed increase may be realized due to shorter signal paths in the final fit.
-- *
-- * Use the current value of COUNTUP to determine which round of encryption is next.
-- * Load the KEY_L and KEY_R registers with the appropriate round key value.
-- * Note that on the first pass, the round key is not available, and must be
-- * loaded directly from the input signals. The correct value is determined by
-- * the state of the DECIPHER signal.
-- *********************************************************************************************
begin
 
if rising_edge(clk) then
if ds = '1' then
if decipher = '1' then
K15 <=
inkey(9) & inkey(50) & inkey(33) & inkey(59) & inkey(48) & inkey(16) & inkey(32) & inkey(56) &
inkey(1) & inkey(8) & inkey(18) & inkey(41) & inkey(2) & inkey(34) & inkey(25) & inkey(24) &
inkey(43) & inkey(57) & inkey(58) & inkey(0) & inkey(35) & inkey(26) & inkey(17) & inkey(40) &
inkey(21) & inkey(27) & inkey(38) & inkey(53) & inkey(36) & inkey(3) & inkey(46) & inkey(29) &
inkey(4) & inkey(52) & inkey(22) & inkey(28) & inkey(60) & inkey(20) & inkey(37) & inkey(62) &
inkey(14) & inkey(19) & inkey(44) & inkey(13) & inkey(12) & inkey(61) & inkey(54) & inkey(30);
 
K14 <=
inkey(1) & inkey(42) & inkey(25) & inkey(51) & inkey(40) & inkey(8) & inkey(24) & inkey(48) &
inkey(58) & inkey(0) & inkey(10) & inkey(33) & inkey(59) & inkey(26) & inkey(17) & inkey(16) &
inkey(35) & inkey(49) & inkey(50) & inkey(57) & inkey(56) & inkey(18) & inkey(9) & inkey(32) &
inkey(13) & inkey(19) & inkey(30) & inkey(45) & inkey(28) & inkey(62) & inkey(38) & inkey(21) &
inkey(27) & inkey(44) & inkey(14) & inkey(20) & inkey(52) & inkey(12) & inkey(29) & inkey(54) &
inkey(6) & inkey(11) & inkey(36) & inkey(5) & inkey(4) & inkey(53) & inkey(46) & inkey(22);
K13 <=
inkey(50) & inkey(26) & inkey(9) & inkey(35) & inkey(24) & inkey(57) & inkey(8) & inkey(32) &
inkey(42) & inkey(49) & inkey(59) & inkey(17) & inkey(43) & inkey(10) & inkey(1) & inkey(0) &
inkey(48) & inkey(33) & inkey(34) & inkey(41) & inkey(40) & inkey(2) & inkey(58) & inkey(16) &
inkey(60) & inkey(3) & inkey(14) & inkey(29) & inkey(12) & inkey(46) & inkey(22) & inkey(5) &
inkey(11) & inkey(28) & inkey(61) & inkey(4) & inkey(36) & inkey(27) & inkey(13) & inkey(38) &
inkey(53) & inkey(62) & inkey(20) & inkey(52) & inkey(19) & inkey(37) & inkey(30) & inkey(6);
 
K12 <=
inkey(34) & inkey(10) & inkey(58) & inkey(48) & inkey(8) & inkey(41) & inkey(57) & inkey(16) &
inkey(26) & inkey(33) & inkey(43) & inkey(1) & inkey(56) & inkey(59) & inkey(50) & inkey(49) &
inkey(32) & inkey(17) & inkey(18) & inkey(25) & inkey(24) & inkey(51) & inkey(42) & inkey(0) &
inkey(44) & inkey(54) & inkey(61) & inkey(13) & inkey(27) & inkey(30) & inkey(6) & inkey(52) &
inkey(62) & inkey(12) & inkey(45) & inkey(19) & inkey(20) & inkey(11) & inkey(60) & inkey(22) &
inkey(37) & inkey(46) & inkey(4) & inkey(36) & inkey(3) & inkey(21) & inkey(14) & inkey(53);
 
K11 <=
inkey(18) & inkey(59) & inkey(42) & inkey(32) & inkey(57) & inkey(25) & inkey(41) & inkey(0) &
inkey(10) & inkey(17) & inkey(56) & inkey(50) & inkey(40) & inkey(43) & inkey(34) & inkey(33) &
inkey(16) & inkey(1) & inkey(2) & inkey(9) & inkey(8) & inkey(35) & inkey(26) & inkey(49) &
inkey(28) & inkey(38) & inkey(45) & inkey(60) & inkey(11) & inkey(14) & inkey(53) & inkey(36) &
inkey(46) & inkey(27) & inkey(29) & inkey(3) & inkey(4) & inkey(62) & inkey(44) & inkey(6) &
inkey(21) & inkey(30) & inkey(19) & inkey(20) & inkey(54) & inkey(5) & inkey(61) & inkey(37);
 
K10 <=
inkey(2) & inkey(43) & inkey(26) & inkey(16) & inkey(41) & inkey(9) & inkey(25) & inkey(49) &
inkey(59) & inkey(1) & inkey(40) & inkey(34) & inkey(24) & inkey(56) & inkey(18) & inkey(17) &
inkey(0) & inkey(50) & inkey(51) & inkey(58) & inkey(57) & inkey(48) & inkey(10) & inkey(33) &
inkey(12) & inkey(22) & inkey(29) & inkey(44) & inkey(62) & inkey(61) & inkey(37) & inkey(20) &
inkey(30) & inkey(11) & inkey(13) & inkey(54) & inkey(19) & inkey(46) & inkey(28) & inkey(53) &
inkey(5) & inkey(14) & inkey(3) & inkey(4) & inkey(38) & inkey(52) & inkey(45) & inkey(21);
 
K09 <=
inkey(51) & inkey(56) & inkey(10) & inkey(0) & inkey(25) & inkey(58) & inkey(9) & inkey(33) &
inkey(43) & inkey(50) & inkey(24) & inkey(18) & inkey(8) & inkey(40) & inkey(2) & inkey(1) &
inkey(49) & inkey(34) & inkey(35) & inkey(42) & inkey(41) & inkey(32) & inkey(59) & inkey(17) &
inkey(27) & inkey(6) & inkey(13) & inkey(28) & inkey(46) & inkey(45) & inkey(21) & inkey(4) &
inkey(14) & inkey(62) & inkey(60) & inkey(38) & inkey(3) & inkey(30) & inkey(12) & inkey(37) &
inkey(52) & inkey(61) & inkey(54) & inkey(19) & inkey(22) & inkey(36) & inkey(29) & inkey(5);
 
K08 <=
inkey(35) & inkey(40) & inkey(59) & inkey(49) & inkey(9) & inkey(42) & inkey(58) & inkey(17) &
inkey(56) & inkey(34) & inkey(8) & inkey(2) & inkey(57) & inkey(24) & inkey(51) & inkey(50) &
inkey(33) & inkey(18) & inkey(48) & inkey(26) & inkey(25) & inkey(16) & inkey(43) & inkey(1) &
inkey(11) & inkey(53) & inkey(60) & inkey(12) & inkey(30) & inkey(29) & inkey(5) & inkey(19) &
inkey(61) & inkey(46) & inkey(44) & inkey(22) & inkey(54) & inkey(14) & inkey(27) & inkey(21) &
inkey(36) & inkey(45) & inkey(38) & inkey(3) & inkey(6) & inkey(20) & inkey(13) & inkey(52);
 
K07 <=
inkey(56) & inkey(32) & inkey(51) & inkey(41) & inkey(1) & inkey(34) & inkey(50) & inkey(9) &
inkey(48) & inkey(26) & inkey(0) & inkey(59) & inkey(49) & inkey(16) & inkey(43) & inkey(42) &
inkey(25) & inkey(10) & inkey(40) & inkey(18) & inkey(17) & inkey(8) & inkey(35) & inkey(58) &
inkey(3) & inkey(45) & inkey(52) & inkey(4) & inkey(22) & inkey(21) & inkey(60) & inkey(11) &
inkey(53) & inkey(38) & inkey(36) & inkey(14) & inkey(46) & inkey(6) & inkey(19) & inkey(13) &
inkey(28) & inkey(37) & inkey(30) & inkey(62) & inkey(61) & inkey(12) & inkey(5) & inkey(44);
K06 <=
inkey(40) & inkey(16) & inkey(35) & inkey(25) & inkey(50) & inkey(18) & inkey(34) & inkey(58) &
inkey(32) & inkey(10) & inkey(49) & inkey(43) & inkey(33) & inkey(0) & inkey(56) & inkey(26) &
inkey(9) & inkey(59) & inkey(24) & inkey(2) & inkey(1) & inkey(57) & inkey(48) & inkey(42) &
inkey(54) & inkey(29) & inkey(36) & inkey(19) & inkey(6) & inkey(5) & inkey(44) & inkey(62) &
inkey(37) & inkey(22) & inkey(20) & inkey(61) & inkey(30) & inkey(53) & inkey(3) & inkey(60) &
inkey(12) & inkey(21) & inkey(14) & inkey(46) & inkey(45) & inkey(27) & inkey(52) & inkey(28);
 
K05 <=
inkey(24) & inkey(0) & inkey(48) & inkey(9) & inkey(34) & inkey(2) & inkey(18) & inkey(42) &
inkey(16) & inkey(59) & inkey(33) & inkey(56) & inkey(17) & inkey(49) & inkey(40) & inkey(10) &
inkey(58) & inkey(43) & inkey(8) & inkey(51) & inkey(50) & inkey(41) & inkey(32) & inkey(26) &
inkey(38) & inkey(13) & inkey(20) & inkey(3) & inkey(53) & inkey(52) & inkey(28) & inkey(46) &
inkey(21) & inkey(6) & inkey(4) & inkey(45) & inkey(14) & inkey(37) & inkey(54) & inkey(44) &
inkey(27) & inkey(5) & inkey(61) & inkey(30) & inkey(29) & inkey(11) & inkey(36) & inkey(12);
 
K04 <=
inkey(8) & inkey(49) & inkey(32) & inkey(58) & inkey(18) & inkey(51) & inkey(2) & inkey(26) &
inkey(0) & inkey(43) & inkey(17) & inkey(40) & inkey(1) & inkey(33) & inkey(24) & inkey(59) &
inkey(42) & inkey(56) & inkey(57) & inkey(35) & inkey(34) & inkey(25) & inkey(16) & inkey(10) &
inkey(22) & inkey(60) & inkey(4) & inkey(54) & inkey(37) & inkey(36) & inkey(12) & inkey(30) &
inkey(5) & inkey(53) & inkey(19) & inkey(29) & inkey(61) & inkey(21) & inkey(38) & inkey(28) &
inkey(11) & inkey(52) & inkey(45) & inkey(14) & inkey(13) & inkey(62) & inkey(20) & inkey(27);
 
K03 <=
inkey(57) & inkey(33) & inkey(16) & inkey(42) & inkey(2) & inkey(35) & inkey(51) & inkey(10) &
inkey(49) & inkey(56) & inkey(1) & inkey(24) & inkey(50) & inkey(17) & inkey(8) & inkey(43) &
inkey(26) & inkey(40) & inkey(41) & inkey(48) & inkey(18) & inkey(9) & inkey(0) & inkey(59) &
inkey(6) & inkey(44) & inkey(19) & inkey(38) & inkey(21) & inkey(20) & inkey(27) & inkey(14) &
inkey(52) & inkey(37) & inkey(3) & inkey(13) & inkey(45) & inkey(5) & inkey(22) & inkey(12) &
inkey(62) & inkey(36) & inkey(29) & inkey(61) & inkey(60) & inkey(46) & inkey(4) & inkey(11);
 
K02 <=
inkey(41) & inkey(17) & inkey(0) & inkey(26) & inkey(51) & inkey(48) & inkey(35) & inkey(59) &
inkey(33) & inkey(40) & inkey(50) & inkey(8) & inkey(34) & inkey(1) & inkey(57) & inkey(56) &
inkey(10) & inkey(24) & inkey(25) & inkey(32) & inkey(2) & inkey(58) & inkey(49) & inkey(43) &
inkey(53) & inkey(28) & inkey(3) & inkey(22) & inkey(5) & inkey(4) & inkey(11) & inkey(61) &
inkey(36) & inkey(21) & inkey(54) & inkey(60) & inkey(29) & inkey(52) & inkey(6) & inkey(27) &
inkey(46) & inkey(20) & inkey(13) & inkey(45) & inkey(44) & inkey(30) & inkey(19) & inkey(62);
 
K01 <=
inkey(25) & inkey(1) & inkey(49) & inkey(10) & inkey(35) & inkey(32) & inkey(48) & inkey(43) &
inkey(17) & inkey(24) & inkey(34) & inkey(57) & inkey(18) & inkey(50) & inkey(41) & inkey(40) &
inkey(59) & inkey(8) & inkey(9) & inkey(16) & inkey(51) & inkey(42) & inkey(33) & inkey(56) &
inkey(37) & inkey(12) & inkey(54) & inkey(6) & inkey(52) & inkey(19) & inkey(62) & inkey(45) &
inkey(20) & inkey(5) & inkey(38) & inkey(44) & inkey(13) & inkey(36) & inkey(53) & inkey(11) &
inkey(30) & inkey(4) & inkey(60) & inkey(29) & inkey(28) & inkey(14) & inkey(3) & inkey(46);
 
else
 
K01 <=
inkey(1) & inkey(42) & inkey(25) & inkey(51) & inkey(40) & inkey(8) & inkey(24) & inkey(48) &
inkey(58) & inkey(0) & inkey(10) & inkey(33) & inkey(59) & inkey(26) & inkey(17) & inkey(16) &
inkey(35) & inkey(49) & inkey(50) & inkey(57) & inkey(56) & inkey(18) & inkey(9) & inkey(32) &
inkey(13) & inkey(19) & inkey(30) & inkey(45) & inkey(28) & inkey(62) & inkey(38) & inkey(21) &
inkey(27) & inkey(44) & inkey(14) & inkey(20) & inkey(52) & inkey(12) & inkey(29) & inkey(54) &
inkey(6) & inkey(11) & inkey(36) & inkey(5) & inkey(4) & inkey(53) & inkey(46) & inkey(22);
K02 <=
inkey(50) & inkey(26) & inkey(9) & inkey(35) & inkey(24) & inkey(57) & inkey(8) & inkey(32) &
inkey(42) & inkey(49) & inkey(59) & inkey(17) & inkey(43) & inkey(10) & inkey(1) & inkey(0) &
inkey(48) & inkey(33) & inkey(34) & inkey(41) & inkey(40) & inkey(2) & inkey(58) & inkey(16) &
inkey(60) & inkey(3) & inkey(14) & inkey(29) & inkey(12) & inkey(46) & inkey(22) & inkey(5) &
inkey(11) & inkey(28) & inkey(61) & inkey(4) & inkey(36) & inkey(27) & inkey(13) & inkey(38) &
inkey(53) & inkey(62) & inkey(20) & inkey(52) & inkey(19) & inkey(37) & inkey(30) & inkey(6);
 
K03 <=
inkey(34) & inkey(10) & inkey(58) & inkey(48) & inkey(8) & inkey(41) & inkey(57) & inkey(16) &
inkey(26) & inkey(33) & inkey(43) & inkey(1) & inkey(56) & inkey(59) & inkey(50) & inkey(49) &
inkey(32) & inkey(17) & inkey(18) & inkey(25) & inkey(24) & inkey(51) & inkey(42) & inkey(0) &
inkey(44) & inkey(54) & inkey(61) & inkey(13) & inkey(27) & inkey(30) & inkey(6) & inkey(52) &
inkey(62) & inkey(12) & inkey(45) & inkey(19) & inkey(20) & inkey(11) & inkey(60) & inkey(22) &
inkey(37) & inkey(46) & inkey(4) & inkey(36) & inkey(3) & inkey(21) & inkey(14) & inkey(53);
 
K04 <=
inkey(18) & inkey(59) & inkey(42) & inkey(32) & inkey(57) & inkey(25) & inkey(41) & inkey(0) &
inkey(10) & inkey(17) & inkey(56) & inkey(50) & inkey(40) & inkey(43) & inkey(34) & inkey(33) &
inkey(16) & inkey(1) & inkey(2) & inkey(9) & inkey(8) & inkey(35) & inkey(26) & inkey(49) &
inkey(28) & inkey(38) & inkey(45) & inkey(60) & inkey(11) & inkey(14) & inkey(53) & inkey(36) &
inkey(46) & inkey(27) & inkey(29) & inkey(3) & inkey(4) & inkey(62) & inkey(44) & inkey(6) &
inkey(21) & inkey(30) & inkey(19) & inkey(20) & inkey(54) & inkey(5) & inkey(61) & inkey(37);
 
K05 <=
inkey(2) & inkey(43) & inkey(26) & inkey(16) & inkey(41) & inkey(9) & inkey(25) & inkey(49) &
inkey(59) & inkey(1) & inkey(40) & inkey(34) & inkey(24) & inkey(56) & inkey(18) & inkey(17) &
inkey(0) & inkey(50) & inkey(51) & inkey(58) & inkey(57) & inkey(48) & inkey(10) & inkey(33) &
inkey(12) & inkey(22) & inkey(29) & inkey(44) & inkey(62) & inkey(61) & inkey(37) & inkey(20) &
inkey(30) & inkey(11) & inkey(13) & inkey(54) & inkey(19) & inkey(46) & inkey(28) & inkey(53) &
inkey(5) & inkey(14) & inkey(3) & inkey(4) & inkey(38) & inkey(52) & inkey(45) & inkey(21);
 
K06 <=
inkey(51) & inkey(56) & inkey(10) & inkey(0) & inkey(25) & inkey(58) & inkey(9) & inkey(33) &
inkey(43) & inkey(50) & inkey(24) & inkey(18) & inkey(8) & inkey(40) & inkey(2) & inkey(1) &
inkey(49) & inkey(34) & inkey(35) & inkey(42) & inkey(41) & inkey(32) & inkey(59) & inkey(17) &
inkey(27) & inkey(6) & inkey(13) & inkey(28) & inkey(46) & inkey(45) & inkey(21) & inkey(4) &
inkey(14) & inkey(62) & inkey(60) & inkey(38) & inkey(3) & inkey(30) & inkey(12) & inkey(37) &
inkey(52) & inkey(61) & inkey(54) & inkey(19) & inkey(22) & inkey(36) & inkey(29) & inkey(5);
 
K07 <=
inkey(35) & inkey(40) & inkey(59) & inkey(49) & inkey(9) & inkey(42) & inkey(58) & inkey(17) &
inkey(56) & inkey(34) & inkey(8) & inkey(2) & inkey(57) & inkey(24) & inkey(51) & inkey(50) &
inkey(33) & inkey(18) & inkey(48) & inkey(26) & inkey(25) & inkey(16) & inkey(43) & inkey(1) &
inkey(11) & inkey(53) & inkey(60) & inkey(12) & inkey(30) & inkey(29) & inkey(5) & inkey(19) &
inkey(61) & inkey(46) & inkey(44) & inkey(22) & inkey(54) & inkey(14) & inkey(27) & inkey(21) &
inkey(36) & inkey(45) & inkey(38) & inkey(3) & inkey(6) & inkey(20) & inkey(13) & inkey(52);
 
K08 <=
inkey(56) & inkey(32) & inkey(51) & inkey(41) & inkey(1) & inkey(34) & inkey(50) & inkey(9) &
inkey(48) & inkey(26) & inkey(0) & inkey(59) & inkey(49) & inkey(16) & inkey(43) & inkey(42) &
inkey(25) & inkey(10) & inkey(40) & inkey(18) & inkey(17) & inkey(8) & inkey(35) & inkey(58) &
inkey(3) & inkey(45) & inkey(52) & inkey(4) & inkey(22) & inkey(21) & inkey(60) & inkey(11) &
inkey(53) & inkey(38) & inkey(36) & inkey(14) & inkey(46) & inkey(6) & inkey(19) & inkey(13) &
inkey(28) & inkey(37) & inkey(30) & inkey(62) & inkey(61) & inkey(12) & inkey(5) & inkey(44);
K09 <=
inkey(40) & inkey(16) & inkey(35) & inkey(25) & inkey(50) & inkey(18) & inkey(34) & inkey(58) &
inkey(32) & inkey(10) & inkey(49) & inkey(43) & inkey(33) & inkey(0) & inkey(56) & inkey(26) &
inkey(9) & inkey(59) & inkey(24) & inkey(2) & inkey(1) & inkey(57) & inkey(48) & inkey(42) &
inkey(54) & inkey(29) & inkey(36) & inkey(19) & inkey(6) & inkey(5) & inkey(44) & inkey(62) &
inkey(37) & inkey(22) & inkey(20) & inkey(61) & inkey(30) & inkey(53) & inkey(3) & inkey(60) &
inkey(12) & inkey(21) & inkey(14) & inkey(46) & inkey(45) & inkey(27) & inkey(52) & inkey(28);
 
K10 <=
inkey(24) & inkey(0) & inkey(48) & inkey(9) & inkey(34) & inkey(2) & inkey(18) & inkey(42) &
inkey(16) & inkey(59) & inkey(33) & inkey(56) & inkey(17) & inkey(49) & inkey(40) & inkey(10) &
inkey(58) & inkey(43) & inkey(8) & inkey(51) & inkey(50) & inkey(41) & inkey(32) & inkey(26) &
inkey(38) & inkey(13) & inkey(20) & inkey(3) & inkey(53) & inkey(52) & inkey(28) & inkey(46) &
inkey(21) & inkey(6) & inkey(4) & inkey(45) & inkey(14) & inkey(37) & inkey(54) & inkey(44) &
inkey(27) & inkey(5) & inkey(61) & inkey(30) & inkey(29) & inkey(11) & inkey(36) & inkey(12);
 
K11 <=
inkey(8) & inkey(49) & inkey(32) & inkey(58) & inkey(18) & inkey(51) & inkey(2) & inkey(26) &
inkey(0) & inkey(43) & inkey(17) & inkey(40) & inkey(1) & inkey(33) & inkey(24) & inkey(59) &
inkey(42) & inkey(56) & inkey(57) & inkey(35) & inkey(34) & inkey(25) & inkey(16) & inkey(10) &
inkey(22) & inkey(60) & inkey(4) & inkey(54) & inkey(37) & inkey(36) & inkey(12) & inkey(30) &
inkey(5) & inkey(53) & inkey(19) & inkey(29) & inkey(61) & inkey(21) & inkey(38) & inkey(28) &
inkey(11) & inkey(52) & inkey(45) & inkey(14) & inkey(13) & inkey(62) & inkey(20) & inkey(27);
 
K12 <=
inkey(57) & inkey(33) & inkey(16) & inkey(42) & inkey(2) & inkey(35) & inkey(51) & inkey(10) &
inkey(49) & inkey(56) & inkey(1) & inkey(24) & inkey(50) & inkey(17) & inkey(8) & inkey(43) &
inkey(26) & inkey(40) & inkey(41) & inkey(48) & inkey(18) & inkey(9) & inkey(0) & inkey(59) &
inkey(6) & inkey(44) & inkey(19) & inkey(38) & inkey(21) & inkey(20) & inkey(27) & inkey(14) &
inkey(52) & inkey(37) & inkey(3) & inkey(13) & inkey(45) & inkey(5) & inkey(22) & inkey(12) &
inkey(62) & inkey(36) & inkey(29) & inkey(61) & inkey(60) & inkey(46) & inkey(4) & inkey(11);
 
K13 <=
inkey(41) & inkey(17) & inkey(0) & inkey(26) & inkey(51) & inkey(48) & inkey(35) & inkey(59) &
inkey(33) & inkey(40) & inkey(50) & inkey(8) & inkey(34) & inkey(1) & inkey(57) & inkey(56) &
inkey(10) & inkey(24) & inkey(25) & inkey(32) & inkey(2) & inkey(58) & inkey(49) & inkey(43) &
inkey(53) & inkey(28) & inkey(3) & inkey(22) & inkey(5) & inkey(4) & inkey(11) & inkey(61) &
inkey(36) & inkey(21) & inkey(54) & inkey(60) & inkey(29) & inkey(52) & inkey(6) & inkey(27) &
inkey(46) & inkey(20) & inkey(13) & inkey(45) & inkey(44) & inkey(30) & inkey(19) & inkey(62);
 
K14 <=
inkey(25) & inkey(1) & inkey(49) & inkey(10) & inkey(35) & inkey(32) & inkey(48) & inkey(43) &
inkey(17) & inkey(24) & inkey(34) & inkey(57) & inkey(18) & inkey(50) & inkey(41) & inkey(40) &
inkey(59) & inkey(8) & inkey(9) & inkey(16) & inkey(51) & inkey(42) & inkey(33) & inkey(56) &
inkey(37) & inkey(12) & inkey(54) & inkey(6) & inkey(52) & inkey(19) & inkey(62) & inkey(45) &
inkey(20) & inkey(5) & inkey(38) & inkey(44) & inkey(13) & inkey(36) & inkey(53) & inkey(11) &
inkey(30) & inkey(4) & inkey(60) & inkey(29) & inkey(28) & inkey(14) & inkey(3) & inkey(46);
 
K15 <=
inkey(17) & inkey(58) & inkey(41) & inkey(2) & inkey(56) & inkey(24) & inkey(40) & inkey(35) &
inkey(9) & inkey(16) & inkey(26) & inkey(49) & inkey(10) & inkey(42) & inkey(33) & inkey(32) &
inkey(51) & inkey(0) & inkey(1) & inkey(8) & inkey(43) & inkey(34) & inkey(25) & inkey(48) &
inkey(29) & inkey(4) & inkey(46) & inkey(61) & inkey(44) & inkey(11) & inkey(54) & inkey(37) &
inkey(12) & inkey(60) & inkey(30) & inkey(36) & inkey(5) & inkey(28) & inkey(45) & inkey(3) &
inkey(22) & inkey(27) & inkey(52) & inkey(21) & inkey(20) & inkey(6) & inkey(62) & inkey(38);
end if;
end if;
end if;
end process RegData;
 
 
-- Select the key value for the next encryption round
-- Use the current value of COUNTUP to determine which round of encryption is next.
-- Load the MYKEY register with the appropriate round key value.
-- Note that on the first pass, the round key is not available, and must be
-- loaded directly from the input signals. The correct value is determined by
-- the state of the DECIPHER signal.
SetKey: process (clk, countup, decipher)
-- NOTE: according to ModelSim, the output value of some of these multiplexers
-- is not stable for enough time before the clock is propagated. What can I do
-- about that?
begin
if rising_edge(clk) then
case countup is
when 0 =>
if decipher = '1' then
mykey <=
inkey(17) & inkey(58) & inkey(41) & inkey(2) & inkey(56) & inkey(24) & inkey(40) & inkey(35) &
inkey(9) & inkey(16) & inkey(26) & inkey(49) & inkey(10) & inkey(42) & inkey(33) & inkey(32) &
inkey(51) & inkey(0) & inkey(1) & inkey(8) & inkey(43) & inkey(34) & inkey(25) & inkey(48) &
inkey(29) & inkey(4) & inkey(46) & inkey(61) & inkey(44) & inkey(11) & inkey(54) & inkey(37) &
inkey(12) & inkey(60) & inkey(30) & inkey(36) & inkey(5) & inkey(28) & inkey(45) & inkey(3) &
inkey(22) & inkey(27) & inkey(52) & inkey(21) & inkey(20) & inkey(6) & inkey(62) & inkey(38);
else
mykey <=
inkey(9) & inkey(50) & inkey(33) & inkey(59) & inkey(48) & inkey(16) & inkey(32) & inkey(56) &
inkey(1) & inkey(8) & inkey(18) & inkey(41) & inkey(2) & inkey(34) & inkey(25) & inkey(24) &
inkey(43) & inkey(57) & inkey(58) & inkey(0) & inkey(35) & inkey(26) & inkey(17) & inkey(40) &
inkey(21) & inkey(27) & inkey(38) & inkey(53) & inkey(36) & inkey(3) & inkey(46) & inkey(29) &
inkey(4) & inkey(52) & inkey(22) & inkey(28) & inkey(60) & inkey(20) & inkey(37) & inkey(62) &
inkey(14) & inkey(19) & inkey(44) & inkey(13) & inkey(12) & inkey(61) & inkey(54) & inkey(30);
end if;
if (decipher = '0') then
-- these are readily shifted left by one !
key_l <= inkey(48) & inkey(40) & inkey(32) & inkey(24) & inkey(16) & inkey(8) & inkey(0) &
inkey(57) & inkey(49) & inkey(41) & inkey(33) & inkey(25) & inkey(17) & inkey(9) & inkey(1) &
inkey(58) & inkey(50) & inkey(42) & inkey(34) & inkey(26) & inkey(18) & inkey(10) & inkey(2) &
inkey(59) & inkey(51) & inkey(43) & inkey(35) & inkey(56);
key_r <= inkey(54) & inkey(46) & inkey(38) & inkey(30) & inkey(22) & inkey(14) & inkey(6) &
inkey(61) & inkey(53) & inkey(45) & inkey(37) & inkey(29) & inkey(21) & inkey(13) & inkey(5) &
inkey(60) & inkey(52) & inkey(44) & inkey(36) & inkey(28) & inkey(20) & inkey(12) & inkey(4) &
inkey(27) & inkey(19) & inkey(11) & inkey(3) & inkey(62);
else
key_l <= inkey(56) & inkey(48) & inkey(40) & inkey(32) & inkey(24) & inkey(16) & inkey(8) & inkey(0) &
inkey(57) & inkey(49) & inkey(41) & inkey(33) & inkey(25) & inkey(17) & inkey(9) & inkey(1) &
inkey(58) & inkey(50) & inkey(42) & inkey(34) & inkey(26) & inkey(18) & inkey(10) & inkey(2) &
inkey(59) & inkey(51) & inkey(43) & inkey(35);
key_r <= inkey(62) & inkey(54) & inkey(46) & inkey(38) & inkey(30) & inkey(22) & inkey(14) & inkey(6) &
inkey(61) & inkey(53) & inkey(45) & inkey(37) & inkey(29) & inkey(21) & inkey(13) & inkey(5) &
inkey(60) & inkey(52) & inkey(44) & inkey(36) & inkey(28) & inkey(20) & inkey(12) & inkey(4) &
inkey(27) & inkey(19) & inkey(11) & inkey(3);
end if;
when 1 =>
mykey <= K01;
if (decipher = '1') then
key_l(0 to 27) <= key_l(27) & key_l(0 to 26);
key_r(0 to 27) <= key_r(27) & key_r(0 to 26);
else
key_l(0 to 27) <= key_l(1 to 27) & key_l(0);
key_r(0 to 27) <= key_r(1 to 27) & key_r(0);
end if;
when 2 =>
mykey <= K02;
if (decipher = '1') then
key_l(0 to 27) <= key_l(26 to 27) & key_l(0 to 25);
key_r(0 to 27) <= key_r(26 to 27) & key_r(0 to 25);
else
key_l(0 to 27) <= key_l(2 to 27) & key_l(0 to 1);
key_r(0 to 27) <= key_r(2 to 27) & key_r(0 to 1);
end if;
when 3 =>
mykey <= K03;
if (decipher = '1') then
key_l(0 to 27) <= key_l(26 to 27) & key_l(0 to 25);
key_r(0 to 27) <= key_r(26 to 27) & key_r(0 to 25);
else
key_l(0 to 27) <= key_l(2 to 27) & key_l(0 to 1);
key_r(0 to 27) <= key_r(2 to 27) & key_r(0 to 1);
end if;
when 4 =>
mykey <= K04;
if (decipher = '1') then
key_l(0 to 27) <= key_l(26 to 27) & key_l(0 to 25);
key_r(0 to 27) <= key_r(26 to 27) & key_r(0 to 25);
else
key_l(0 to 27) <= key_l(2 to 27) & key_l(0 to 1);
key_r(0 to 27) <= key_r(2 to 27) & key_r(0 to 1);
end if;
when 5 =>
mykey <= K05;
if (decipher = '1') then
key_l(0 to 27) <= key_l(26 to 27) & key_l(0 to 25);
key_r(0 to 27) <= key_r(26 to 27) & key_r(0 to 25);
else
key_l(0 to 27) <= key_l(2 to 27) & key_l(0 to 1);
key_r(0 to 27) <= key_r(2 to 27) & key_r(0 to 1);
end if;
when 6 =>
mykey <= K06;
if (decipher = '1') then
key_l(0 to 27) <= key_l(26 to 27) & key_l(0 to 25);
key_r(0 to 27) <= key_r(26 to 27) & key_r(0 to 25);
else
key_l(0 to 27) <= key_l(2 to 27) & key_l(0 to 1);
key_r(0 to 27) <= key_r(2 to 27) & key_r(0 to 1);
end if;
when 7 =>
mykey <= K07;
if (decipher = '1') then
key_l(0 to 27) <= key_l(26 to 27) & key_l(0 to 25);
key_r(0 to 27) <= key_r(26 to 27) & key_r(0 to 25);
else
key_l(0 to 27) <= key_l(2 to 27) & key_l(0 to 1);
key_r(0 to 27) <= key_r(2 to 27) & key_r(0 to 1);
end if;
when 8 =>
mykey <= K08;
if (decipher = '1') then
key_l(0 to 27) <= key_l(27) & key_l(0 to 26);
key_r(0 to 27) <= key_r(27) & key_r(0 to 26);
else
key_l(0 to 27) <= key_l(1 to 27) & key_l(0);
key_r(0 to 27) <= key_r(1 to 27) & key_r(0);
end if;
when 9 =>
mykey <= K09;
if (decipher = '1') then
key_l(0 to 27) <= key_l(26 to 27) & key_l(0 to 25);
key_r(0 to 27) <= key_r(26 to 27) & key_r(0 to 25);
else
key_l(0 to 27) <= key_l(2 to 27) & key_l(0 to 1);
key_r(0 to 27) <= key_r(2 to 27) & key_r(0 to 1);
end if;
when 10 =>
mykey <= K10;
if (decipher = '1') then
key_l(0 to 27) <= key_l(26 to 27) & key_l(0 to 25);
key_r(0 to 27) <= key_r(26 to 27) & key_r(0 to 25);
else
key_l(0 to 27) <= key_l(2 to 27) & key_l(0 to 1);
key_r(0 to 27) <= key_r(2 to 27) & key_r(0 to 1);
end if;
when 11 =>
mykey <= K11;
if (decipher = '1') then
key_l(0 to 27) <= key_l(26 to 27) & key_l(0 to 25);
key_r(0 to 27) <= key_r(26 to 27) & key_r(0 to 25);
else
key_l(0 to 27) <= key_l(2 to 27) & key_l(0 to 1);
key_r(0 to 27) <= key_r(2 to 27) & key_r(0 to 1);
end if;
when 12 =>
mykey <= K12;
if (decipher = '1') then
key_l(0 to 27) <= key_l(26 to 27) & key_l(0 to 25);
key_r(0 to 27) <= key_r(26 to 27) & key_r(0 to 25);
else
key_l(0 to 27) <= key_l(2 to 27) & key_l(0 to 1);
key_r(0 to 27) <= key_r(2 to 27) & key_r(0 to 1);
end if;
when 13 =>
mykey <= K13;
if (decipher = '1') then
key_l(0 to 27) <= key_l(26 to 27) & key_l(0 to 25);
key_r(0 to 27) <= key_r(26 to 27) & key_r(0 to 25);
else
key_l(0 to 27) <= key_l(2 to 27) & key_l(0 to 1);
key_r(0 to 27) <= key_r(2 to 27) & key_r(0 to 1);
end if;
when 14 =>
mykey <= K14;
if (decipher = '1') then
key_l(0 to 27) <= key_l(26 to 27) & key_l(0 to 25);
key_r(0 to 27) <= key_r(26 to 27) & key_r(0 to 25);
else
key_l(0 to 27) <= key_l(2 to 27) & key_l(0 to 1);
key_r(0 to 27) <= key_r(2 to 27) & key_r(0 to 1);
end if;
when 15 =>
mykey <= K15;
if (decipher = '1') then
key_l(0 to 27) <= key_l(27) & key_l(0 to 26);
key_r(0 to 27) <= key_r(27) & key_r(0 to 26);
else
key_l(0 to 27) <= key_l(1 to 27) & key_l(0);
key_r(0 to 27) <= key_r(1 to 27) & key_r(0);
end if;
when others =>
end case;
end if;
490,25 → 355,29
end process SetKey;
 
 
-- Load the message word for the next encryption round
-- As in SetKey, the data must be taken from the input ports on the first round.
-- For all other rounds, the data value is taken from the OUTMSG signal. This signal
-- is produced by combinatorial logic.
--
-- The first round of this cycle can be the last round of the previous cycle. Output is
-- driven at this time.
 
-- **********************************************************************************************
-- * Load the message word for the next encryption round
-- * As in SetKey, the data must be taken from the input ports on the first round.
-- * For all other rounds, the data value is taken from the OUTMSG signal. This signal
-- * is produced by combinatorial logic.
-- *
-- * The first round of this cycle can be the last round of the previous cycle. Output is
-- * driven at this time.
-- **********************************************************************************************
SetData: process (clk, countup, rst, ds)
variable C17: std_logic_vector(1 to 64);
begin
if rst = '1' then
rdy <= '1';
-- rdy <= '1'; -- Original implementation - rdy is set high at reset
rdy <= '0'; -- Optional implementation - rdy is set low at reset
elsif rising_edge(clk) then
-- NOTE: INMSG is driven by a multiplexer. It seems that the output signal
-- for this mux is not always stable before the clock is propagated. Same
-- problem as above. Should I be using another construct?
rdy <= '0';
case countup is
when 0 =>
if ds = '1' then
-- new data: clock INMSG values directly from input signal
inmsg <= indata(57) & indata(49) & indata(41) & indata(33) & indata(25) & indata(17) & indata(9) & indata(1) &
indata(59) & indata(51) & indata(43) & indata(35) & indata(27) & indata(19) & indata(11) & indata(3) &
indata(61) & indata(53) & indata(45) & indata(37) & indata(29) & indata(21) & indata(13) & indata(5) &
520,9 → 389,11
rdy <= '0'; -- Manage the "Data ready" signal
end if;
if ready = '0' then --ready is really a "crypto in progress" signal
-- Copy previous round output message data into local wire
C17(1 to 32) := outmsg(32 to 63);
C17(33 to 64) := outmsg(0 to 31);
 
-- clock output message data to output vector. C17 was not strictly required but it made things easier for me.
outdata <= C17(40) & C17(8) & C17(48) & C17(16) & C17(56) & C17(24) & C17(64) & C17(32) &
C17(39) & C17(7) & C17(47) & C17(15) & C17(55) & C17(23) & C17(63) & C17(31) &
C17(38) & C17(6) & C17(46) & C17(14) & C17(54) & C17(22) & C17(62) & C17(30) &
531,11 → 402,11
C17(35) & C17(3) & C17(43) & C17(11) & C17(51) & C17(19) & C17(59) & C17(27) &
C17(34) & C17(2) & C17(42) & C17(10) & C17(50) & C17(18) & C17(58) & C17(26) &
C17(33) & C17(1) & C17(41) & C17(9) & C17(49) & C17(17) & C17(57) & C17(25);
rdy <= '1';
rdy <= '1'; -- indicate that valid output is on the bus
end if;
when others =>
inmsg <= outmsg;
rdy <= '0';
inmsg <= outmsg; -- clock previous round output into next round input vector
rdy <= '0'; -- manage the "data ready" signal
end case;
end if;
 
542,30 → 413,49
end process setdata;
 
 
-- This handles the READY signal and counts the counters
-- *************************************************************
-- * This handles the READY signal and counts the counters
-- *************************************************************
Control: process (clk, ready, ds, RST, countup)
begin
 
if RST = '1' then
-- assign reset values
ready <= '1';
countup <= 0;
rdy_next_cycle <= '0';
rdy_next_next_cycle <= '0';
 
elsif rising_edge(clk) then
rdy_next_cycle <= '0';
rdy_next_next_cycle <= '0';
if ready = '1' then
if ds = '1' then
-- data is being accepted. Assign starting clock and Data Ready values
ready <= '0';
countup <= 1;
end if;
else
if countup = 0 then
-- if counter is cleared and no input data, then
-- indicate that device is waiting for work
if ds = '0' then
ready <= '1';
end if;
elsif countup < 15 then
elsif countup < 14 then
-- for counter = 1-13, just increment the counter
countup <= countup + 1;
elsif countup < 15 then
-- for counter = 14, increment the counter and
-- indicate that data will be ready in two clocks
countup <= countup + 1;
rdy_next_next_cycle <= '1';
else
-- for counter = 15, increment the counter and
-- indicate that data will be ready on the next clock
countup <= 0;
rdy_next_cycle <= '1';
end if;
end if;
end if;
1136,3 → 1026,4
outmsg(0 to 31) <= inmsg(32 to 63);
 
end des;
 

powered by: WebSVN 2.1.0

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