library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
package des_lib is
component des
port (clk :in std_logic;
reset :in std_logic;
encrypt :in std_logic;
key_in :in std_logic_vector (55 downto 0);
din :in std_logic_vector (63 downto 0);
din_valid :in std_logic;
busy :buffer std_logic;
dout :out std_logic_vector (63 downto 0);
dout_valid :out std_logic
);
end component;
component des_round
port (clk :in std_logic;
reset :in std_logic;
stall :in std_logic;
encrypt_in :in std_logic;
encrypt_shift :in std_logic_vector (4 downto 0);
decrypt_shift :in std_logic_vector (4 downto 0);
key_in :in std_logic_vector (55 downto 0);
din :in std_logic_vector (63 downto 0);
din_valid :in std_logic;
encrypt_out :out std_logic;
key_out :out std_logic_vector (55 downto 0);
dout :out std_logic_vector (63 downto 0);
dout_valid :out std_logic
);
end component;
-- Inital permutation
function des_ip(din :std_logic_vector(63 downto 0))
return std_logic_vector;
-- Final permutation
function des_fp(din :std_logic_vector(63 downto 0))
return std_logic_vector;
-- Key permutation, converts a 64 bit key into a 56 bit key, ignoring parity
function des_kp(din :std_logic_vector (63 downto 0))
return std_logic_vector;
-- Compression Permutation, converts a 56 bit key into a 48 bits.
function des_cp(din :std_logic_vector (55 downto 0))
return std_logic_vector;
-- Expansion permutation
function des_ep(din :std_logic_vector (31 downto 0))
return std_logic_vector;
-- S-Box Substitution, 48 bits in, 32 bits out.
function des_sbox(din :std_logic_vector (47 downto 0))
return std_logic_vector;
-- P-Box Permutation
function des_pbox(din :std_logic_vector (31 downto 0))
return std_logic_vector;
-- Key Shift
function des_keyshift (din :std_logic_vector (55 downto 0);
n :std_logic_vector (4 downto 0))
return std_logic_vector;
end des_lib;
----------------------------------------------------------------------------
----------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
library work;
use work.des_lib.all;
package body des_lib is
--------------------------------------------------------
-- Inital permutation
function des_ip(din :std_logic_vector(63 downto 0))
return std_logic_vector is
variable val :std_logic_vector (63 downto 0);
begin
val := din(64-58) & din(64-50) & din(64-42) & din(64-34) & din(64-26) & din(64-18) & din(64-10) & din(64- 2) &
din(64-60) & din(64-52) & din(64-44) & din(64-36) & din(64-28) & din(64-20) & din(64-12) & din(64- 4) &
din(64-62) & din(64-54) & din(64-46) & din(64-38) & din(64-30) & din(64-22) & din(64-14) & din(64- 6) &
din(64-64) & din(64-56) & din(64-48) & din(64-40) & din(64-32) & din(64-24) & din(64-16) & din(64- 8) &
din(64-57) & din(64-49) & din(64-41) & din(64-33) & din(64-25) & din(64-17) & din(64- 9) & din(64- 1) &
din(64-59) & din(64-51) & din(64-43) & din(64-35) & din(64-27) & din(64-19) & din(64-11) & din(64- 3) &
din(64-61) & din(64-53) & din(64-45) & din(64-37) & din(64-29) & din(64-21) & din(64-13) & din(64- 5) &
din(64-63) & din(64-55) & din(64-47) & din(64-39) & din(64-31) & din(64-23) & din(64-15) & din(64- 7);
return val;
end des_ip;
--------------------------------------------------------
-- Final permutation
function des_fp(din :std_logic_vector(63 downto 0))
return std_logic_vector is
variable val :std_logic_vector (63 downto 0);
begin
val := din(64-40) & din(64- 8) & din(64-48) & din(64-16) & din(64-56) & din(64-24) & din(64-64) & din(64-32) &
din(64-39) & din(64- 7) & din(64-47) & din(64-15) & din(64-55) & din(64-23) & din(64-63) & din(64-31) &
din(64-38) & din(64- 6) & din(64-46) & din(64-14) & din(64-54) & din(64-22) & din(64-62) & din(64-30) &
din(64-37) & din(64- 5) & din(64-45) & din(64-13) & din(64-53) & din(64-21) & din(64-61) & din(64-29) &
din(64-36) & din(64- 4) & din(64-44) & din(64-12) & din(64-52) & din(64-20) & din(64-60) & din(64-28) &
din(64-35) & din(64- 3) & din(64-43) & din(64-11) & din(64-51) & din(64-19) & din(64-59) & din(64-27) &
din(64-34) & din(64- 2) & din(64-42) & din(64-10) & din(64-50) & din(64-18) & din(64-58) & din(64-26) &
din(64-33) & din(64- 1) & din(64-41) & din(64- 9) & din(64-49) & din(64-17) & din(64-57) & din(64-25);
return val;
end des_fp;
--------------------------------------------------------
-- Key permutation, converts a 64 bit key into a 56 bit key, ignoring parity
function des_kp(din :std_logic_vector (63 downto 0))
return std_logic_vector is
variable val :std_logic_vector (55 downto 0);
begin
val := din(64-57) & din(64-49) & din(64-41) & din(64-33) & din(64-25) & din(64-17) & din(64- 9) & din(64- 1) &
din(64-58) & din(64-50) & din(64-42) & din(64-34) & din(64-26) & din(64-18) & din(64-10) & din(64- 2) &
din(64-59) & din(64-51) & din(64-43) & din(64-35) & din(64-27) & din(64-19) & din(64-11) & din(64- 3) &
din(64-60) & din(64-52) & din(64-44) & din(64-36) &
din(64-63) & din(64-55) & din(64-47) & din(64-39) & din(64-31) & din(64-23) & din(64-15) & din(64- 7) &
din(64-62) & din(64-54) & din(64-46) & din(64-38) & din(64-30) & din(64-22) & din(64-14) & din(64- 6) &
din(64-61) & din(64-53) & din(64-45) & din(64-37) & din(64-29) & din(64-21) & din(64-13) & din(64- 5) &
din(64-28) & din(64-20) & din(64-12) & din(64- 4);
return val;
end des_kp;
--------------------------------------------------------
-- Compression Permutation, converts a 56 bit key into a 48 bits.
function des_cp(din :std_logic_vector (55 downto 0))
return std_logic_vector is
variable val :std_logic_vector (47 downto 0);
begin
val := din(56-14) & din(56-17) & din(56-11) & din(56-24) & din(56- 1) & din(56- 5) &
din(56- 3) & din(56-28) & din(56-15) & din(56- 6) & din(56-21) & din(56-10) &
din(56-23) & din(56-19) & din(56-12) & din(56- 4) & din(56-26) & din(56- 8) &
din(56-16) & din(56- 7) & din(56-27) & din(56-20) & din(56-13) & din(56- 2) &
din(56-41) & din(56-52) & din(56-31) & din(56-37) & din(56-47) & din(56-55) &
din(56-30) & din(56-40) & din(56-51) & din(56-45) & din(56-33) & din(56-48) &
din(56-44) & din(56-49) & din(56-39) & din(56-56) & din(56-34) & din(56-53) &
din(56-46) & din(56-42) & din(56-50) & din(56-36) & din(56-29) & din(56-32);
return val;
end des_cp;
--------------------------------------------------------
-- Expansion permutation
function des_ep(din :std_logic_vector (31 downto 0))
return std_logic_vector is
variable val :std_logic_vector (47 downto 0);
begin
val := din(32-32) & din(32- 1) & din(32- 2) & din(32- 3) & din(32- 4) & din(32- 5) &
din(32- 4) & din(32- 5) & din(32- 6) & din(32- 7) & din(32- 8) & din(32- 9) &
din(32- 8) & din(32- 9) & din(32-10) & din(32-11) & din(32-12) & din(3