⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rijndaelimplemetation.vhdl

📁 rijndael算法的一个vhdl语言编写的程序,可供学习者参考交流
💻 VHDL
📖 第 1 页 / 共 4 页
字号:
-- *************************************************************************-- DISCLAIMER. THIS SOFTWARE WAS WRITTEN BY EMPLOYEES OF THE U.S.-- GOVERNMENT AS A PART OF THEIR OFFICIAL DUTIES AND, THEREFORE, IS NOT-- PROTECTED BY COPYRIGHT. HOWEVER, THIS SOFTWARE CODIFIES THE FINALIST-- CANDIDATE ALGORITHMS (i.e., MARS, RC6tm, RIJNDAEL, SERPENT, AND-- TWOFISH) IN THE ADVANCED ENCRYPTION STANDARD (AES) DEVELOPMENT EFFORT-- SPONSORED BY THE NATIONAL INSTITUTE OF STANDARDS AND TECHNOLOGY (NIST)-- AND MAY BE PROTECTED BY ONE OR MORE FORMS OF INTELLECTUAL PROPERTY. THE-- U.S. GOVERNMENT MAKES NO WARRANTY, EITHER EXPRESSED OR IMPLIED,-- INCLUDING BUT NO LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY-- OR FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS SOFTWARE. THE U.S.-- GOVERNMENT FURTHER MAKES NO WARRANTY THAT THIS SOFTWARE WILL NOT-- INFRINGE ANY OTHER UNITED STATES OR FOREIGN PATENT OR OTHER-- INTELLECTUAL PROPERTY RIGHT. IN NO EVENT SHALL THE U.S. GOVERNMENT BE-- LIABLE TO ANYONE FOR COMPENSATORY, PUNITIVE, EXEMPLARY, SPECIAL,-- COLLATERAL, INCIDENTAL, CONSEQUENTIAL, OR ANY OTHER TYPE OF DAMAGES IN-- CONNECTION WITH OR ARISING OUT OF COPY OR USE OF THIS SOFTWARE.-- *************************************************************************-- ===========================================================================-- File Name: rijndael_pkg.vhdl-- Author   : NSA-- Date     : December 1999-- Project  : RIJNDAEL-- Purpose  : This package defines common types, subtypes, constants,--            and functions required to implement various VHDL models--            for the creation of ASIC simulation of RIJNDAEL, an Advanced--            Encryption Standard (AES) candidate algorithm.---- ===========================================================================library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;package rijndael_pack is-- ==========================================================================-- ======= Type, sub-type and function declarations for general use =========-- ==========================================================================type CONTROL_STATES      is ( nop, wait4ks, ready, busy );subtype ROUND_TYPE       is integer range 0 to 63;subtype SBOX_INDEX_TYPE  is integer range 0 to 15;subtype S_BOX_FIELD      is integer range 0 to 255;subtype SLV_2            is std_logic_vector(1 downto 0);subtype SLV_6            is std_logic_vector(5 downto 0);subtype SLV_8            is std_logic_vector(7 downto 0);subtype SLV_16           is std_logic_vector(15 downto 0);subtype SLV_32           is std_logic_vector(31 downto 0);subtype SLV_128          is std_logic_vector(127 downto 0);subtype SLV_256          is std_logic_vector(255 downto 0);constant FIRST_ROUND : ROUND_TYPE := 0;constant LAST_ROUND  : ROUND_TYPE := 13;constant NB          : INTEGER := 4;constant NK          : INTEGER := 7;constant CV128       : SLV_2 := "00";constant CV192       : SLV_2 := "01";constant CV256       : SLV_2 := "10";constant NUM_RUNUP_ROUNDS : integer := 15;   -- used by testbenchtype INDEX_TYPE is array (0 to 12) of integer;constant FAR_INDEX_ENC : INDEX_TYPE := (0, 1, 3, 4, 6, 7, 9, 10, 0, 0, 0, 0, 0);constant FAR_INDEX_DEC : INDEX_TYPE := (0, 2, 3, 5, 6, 8, 9, 11, 0, 0, 0, 0, 0);constant SBOX_INDEX    : INDEX_TYPE := (0, 0, 1, 2, 0, 3, 4,  0, 5, 6, 0, 7, 0);constant NEAR_INDEX    : INDEX_TYPE := (0, 2, 3, 5, 6, 8, 9, 11, 0, 0, 0, 0, 0);constant SBOX_INDEX192 : INDEX_TYPE := (0, 1, 0, 2, 3, 0, 4,  5, 0, 6, 7, 0, 0);-- ==========================================================================-- ============ Declarations for the Encrypt/Decrypt section ================-- ==========================================================================type SBOX_TYPE      is array (0 to 255) of S_BOX_FIELD;type RCON_TYPE      is array (0 to 29) of SLV_8;type SHIFT_ROW_TYPE is array (0 to 1) of integer range 0 to 3;type SHIFT_TYPE     is array (0 to 3) of SHIFT_ROW_TYPE;type STATE_ROW_TYPE is array (0 to NB-1) of SLV_8;type STATE_TYPE     is array (0 to 3) of STATE_ROW_TYPE;type TEMP_TYPE      is array (0 to 3) of SLV_8;type KEY_ROW_TYPE   is array (0 to 3) of SLV_8;type KEY_TYPE       is array (0 to 3) of KEY_ROW_TYPE;type PIPE_DATA_TYPE is array (FIRST_ROUND to LAST_ROUND+1) of STATE_TYPE;type MOD3_TABLE_TYPE is array (0 to 59) of integer range 0 to 3;type MOD6_TABLE_TYPE is array (0 to 59) of integer range 0 to 5;type DIV6_TABLE_TYPE is array (0 to 59) of integer range 0 to 10;-- ==========================================================================-- ================================ SBOX ====================================-- ==========================================================================constant SBOX : SBOX_TYPE := ( 99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254, 215, 171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247, 204,  52, 165, 229, 241, 113, 216,  49,  21,   4, 199,  35, 195,  24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117,   9, 131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,  47, 132,  83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,  57,  74,  76,  88, 207, 208, 239, 170, 251,  67,  77,  51, 133,  69, 249,   2, 127,  80,  60, 159, 168,  81, 163,  64, 143, 146, 157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 205,  12,  19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25, 115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20, 222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92, 194, 211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213,  78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,  46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138, 112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134, 193,  29, 158, 225, 248, 152,  17, 105, 217, 142, 148, 155,  30, 135, 233, 206,  85,  40, 223, 140, 161, 137,  13, 191, 230,  66, 104,  65, 153,  45,  15, 176,  84, 187,  22);-- ==========================================================================-- ============================= INVERSE SBOX ===============================--  Note: Inverse S-Box is specified in reverse order for ease of indexing-- ==========================================================================constant InvSBOX : SBOX_TYPE := ( 82,   9, 106, 213,  48,  54, 165,  56, 191,  64, 163, 158, 129, 243, 215, 251, 124, 227,  57, 130, 155,  47, 255, 135,  52, 142,  67,  68, 196, 222, 233, 203,  84, 123, 148,  50, 166, 194,  35,  61, 238,  76, 149,  11,  66, 250, 195,  78,   8,  46, 161, 102,  40, 217,  36, 178, 118,  91, 162,  73, 109, 139, 209,  37, 114, 248, 246, 100, 134, 104, 152,  22, 212, 164,  92, 204,  93, 101, 182, 146, 108, 112,  72,  80, 253, 237, 185, 218,  94,  21,  70,  87, 167, 141, 157, 132, 144, 216, 171,   0, 140, 188, 211,  10, 247, 228,  88,   5, 184, 179,  69,   6, 208,  44,  30, 143, 202,  63,  15,   2, 193, 175, 189,   3,   1,  19, 138, 107,  58, 145,  17,  65,  79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116,  34, 231, 173,  53, 133, 226, 249,  55, 232,  28, 117, 223, 110,  71, 241,  26, 113,  29,  41, 197, 137, 111, 183,  98,  14, 170,  24, 190,  27, 252,  86,  62,  75, 198, 210, 121,  32, 154, 219, 192, 254, 120, 205,  90, 244,  31, 221, 168,  51, 136,   7, 199,  49, 177,  18,  16,  89,  39, 128, 236,  95,  96,  81, 127, 169,  25, 181,  74,  13,  45, 229, 122, 159, 147, 201, 156, 239, 160, 224,  59,  77, 174,  42, 245, 176, 200, 235, 187,  60, 131,  83, 153,  97,  23,  43,   4, 126, 186, 119, 214,  38, 225, 105,  20,  99,  85,  33,  12, 125);-- ==========================================================================-- Modulo 3 lookup table-- ==========================================================================constant mod3_table : MOD3_TABLE_TYPE := (    0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2,   0, 1, 2 );-- ==========================================================================-- Modulo 6 lookup table-- ==========================================================================constant mod6_table : MOD6_TABLE_TYPE := (    0, 1, 2, 3, 4, 5,   0, 1, 2, 3, 4, 5,   0, 1, 2, 3, 4, 5,   0, 1, 2, 3, 4, 5,   0, 1, 2, 3, 4, 5,   0, 1, 2, 3, 4, 5,   0, 1, 2, 3, 4, 5,   0, 1, 2, 3, 4, 5,   0, 1, 2, 3, 4, 5,   0, 1, 2, 3, 4, 5 );-- ==========================================================================-- Divide by 6 lookup table-- ==========================================================================constant div6_table : DIV6_TABLE_TYPE := (    0,  0,  0,  0,  0,  0,   1,  1,  1,  1,  1,  1,    2,  2,  2,  2,  2,  2,   3,  3,  3,  3,  3,  3,   4,  4,  4,  4,  4,  4,   5,  5,  5,  5,  5,  5,   6,  6,  6,  6,  6,  6,    7,  7,  7,  7,  7,  7,    8,  8,  8,  8,  8,  8,    9,  9,  9,  9,  9,  9 );-- ==========================================================================-- ============================= ROUND CONSTANTS ============================-- ==========================================================================constant Rcon : RCON_TYPE := (X"01", X"02", X"04", X"08", X"10", X"20", X"40", X"80", X"1b", X"36",X"6c", X"d8", X"ab", X"4d", X"9a", X"2f", X"5e", X"bc", X"63", X"c6",X"97", X"35", X"6a", X"d4", X"b3", X"7d", X"fa", X"ef", X"c5", X"91");-- ==========================================================================-- ============================= SHIFT CONSTANTS ============================-- ==========================================================================constant SHIFTS : SHIFT_TYPE := (   (0, 0),   (1, 3),   (2, 2),   (3, 1));-- ==========================================================================function SBOX_LOOKUP ( a : SLV_8 )                       return SLV_8;function SBOX32_FUNCT ( w : SLV_32 )                        return SLV_32;function INV_SBOX_LOOKUP ( a : SLV_8 )                           return SLV_8;function BYTE_SUB_FUNCT ( state : STATE_TYPE )                          return STATE_TYPE;function INV_BYTE_SUB_FUNCT ( state : STATE_TYPE )                              return STATE_TYPE;function SHIFT_ROW_FUNCT ( state : STATE_TYPE )                           return STATE_TYPE;function INV_SHIFT_ROW_FUNCT ( state : STATE_TYPE )                               return STATE_TYPE;function MIX_COLUMN_FUNCT ( state : STATE_TYPE )                            return STATE_TYPE;function INV_MIX_COLUMN_FUNCT ( state : STATE_TYPE )                                return STATE_TYPE;function POLY_MULTE_FUNCT ( a : SLV_8;                           b : SLV_8 )                           return SLV_8;function POLY_MULTD_FUNCT ( a : SLV_8;                           b : SLV_8 )                           return SLV_8;function ADD_ROUNDKEY_FUNCT ( roundkey : KEY_TYPE;                              state    : STATE_TYPE )                              return STATE_TYPE;procedure ADD_ROUNDKEY ( state     : in STATE_TYPE;                         roundkey  : in KEY_TYPE;                  signal state_out : out STATE_TYPE );procedure PRE_ADD ( state     : in STATE_TYPE;                    encrypt   : in std_logic;                    roundkey  : in KEY_TYPE;             signal state_out : out STATE_TYPE );procedure POST_ADD ( state     : in STATE_TYPE;                     encrypt   : in std_logic;                     roundkey  : in KEY_TYPE;              signal state_out : out STATE_TYPE );function RIJNDAEL_ROUND_FUNCT ( encrypt  : std_logic;                                roundkey : KEY_TYPE;                                state    : STATE_TYPE )                                return STATE_TYPE;procedure RIJNDAEL_ROUND ( state     :  in STATE_TYPE;                           encrypt   :  in std_logic;                           roundkey  :  in KEY_TYPE;                    signal state_out :  out STATE_TYPE );function INITIAL_ROUND_FUNCT ( encrypt  : std_logic;                               roundkey : KEY_TYPE;                               state    : STATE_TYPE )                               return STATE_TYPE;procedure INITIAL_ROUND ( state     : in STATE_TYPE;                          encrypt   : in std_logic;                          roundkey  : in KEY_TYPE;                   signal state_out : out STATE_TYPE ); function FINAL_ROUND_FUNCT ( encrypt  : std_logic;                             roundkey : KEY_TYPE;                             state    : STATE_TYPE )                             return STATE_TYPE;procedure FINAL_ROUND ( state     : in STATE_TYPE;                        encrypt   : in std_logic;                        roundkey  : in KEY_TYPE;                 signal state_out : out STATE_TYPE ); -- ==========================================================================-- ============== Declarations for the Key Schedule section =================-- ==========================================================================constant HOLD               : integer := 0;constant LAST_ECVRUNUP_STEP : integer := 1;   -- # of steps for cv runupconstant LAST_DCVRUNUP_128  : integer := 9;   -- # of steps for cv runupconstant LAST_DCVRUNUP_192  : integer := 11;  -- # of steps for cv runupconstant LAST_DCVRUNUP_256  : integer := 13;  -- # of steps for cv runuptype PIPE_KEY_TYPE is array (FIRST_ROUND to LAST_ROUND+2) of KEY_TYPE;type W_TYPE        is array (-8 to -1) of SLV_32;type W_HALF_TYPE   is array (-4 to -1) of SLV_32;type W_FAR_TYPE    is array ( 0 to  9) of SLV_32;type W_NEAR_TYPE   is array ( 0 to  9) of SLV_32;type W_BOX_TYPE    is array ( 0 to 11) of SLV_32;type W_NOBOX_TYPE  is array ( 0 to 13) of W_HALF_TYPE;type W_INPUT_TYPE  is array ( 0 to 18) of W_TYPE;type W_PIPE_TYPE   is array ( 0 to 18) of W_TYPE;type W_ARRAY_TYPE  is array ( 0 to 59) of SLV_32;-- ==========================================================================function EXPANSION_FUNCT ( cv_in   : SLV_256;                            cv_size : SLV_2;                            round   : SLV_6;                            w_in    : W_TYPE )                                 return W_TYPE;function KS_SBOX_FUNCT ( cv_size : SLV_2;                         encrypt : std_logic;                         i       : SLV_16;                         w_far   : SLV_32;                         w_near  : SLV_32 )                         return SLV_32;procedure KS_SBOX( encrypt : std_logic;                   cv_size : SLV_2;                   i       : in  SLV_16;                   w_far   : in  SLV_32;                   w_near  : in  SLV_32;            signal w_box   : out SLV_32 );function KS_ROUND_FUNCT ( cv_size : SLV_2;                          encrypt : std_logic;                          i       : SLV_16;                          w       : W_TYPE )                          return W_TYPE;end rijndael_pack;-- ==========================================================================package body rijndael_pack is-- ==========================================================================-- ============= Definitions for the Encrypt/Decrypt section ================-- ==========================================================================-- ==========================================================================----  function SBOX_LOOKUP----  Performs the sbox function implemented as a lookup table. There--  are 4 copies of the 8-bit sbox to cover 32 bits of input/output.---- ==========================================================================function SBOX_LOOKUP ( a : SLV_8 )                       return SLV_8 is

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -