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