From dc47fffe47a1fc49ad79e4201f219c8a697b7ae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joachim=20Stro=CC=88mbergson?= Date: Tue, 31 May 2016 14:00:00 +0200 Subject: Adding functionality to support both SHA224 and SHA256 digest modes. Note: This update changes the ADDR_CTRL API register since it adds a mode bit. The version major number has been bumped to reflect this API change. The top level testbench contains tests for SHA224 as well as old tests for SHA256. The core level tb still only tests SHA256. --- src/rtl/sha256.v | 23 ++++++++++-- src/rtl/sha256_core.v | 101 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 89 insertions(+), 35 deletions(-) (limited to 'src/rtl') diff --git a/src/rtl/sha256.v b/src/rtl/sha256.v index 1f9e75e..17fcd84 100644 --- a/src/rtl/sha256.v +++ b/src/rtl/sha256.v @@ -64,6 +64,7 @@ module sha256( localparam ADDR_CTRL = 8'h08; localparam CTRL_INIT_BIT = 0; localparam CTRL_NEXT_BIT = 1; + localparam CTRL_MODE_BIT = 2; localparam ADDR_STATUS = 8'h09; localparam STATUS_READY_BIT = 0; @@ -97,7 +98,10 @@ module sha256( localparam CORE_NAME0 = 32'h73686132; // "sha2" localparam CORE_NAME1 = 32'h2d323536; // "-256" - localparam CORE_VERSION = 32'h302e3831; // "0.81" + localparam CORE_VERSION = 32'h312e3830; // "1.80" + + localparam MODE_SHA_224 = 1'h0; + localparam MODE_SHA_256 = 1'h1; //---------------------------------------------------------------- @@ -113,6 +117,10 @@ module sha256( reg next_we; reg next_set; + reg mode_reg; + reg mode_new; + reg mode_we; + reg ready_reg; reg [31 : 0] block0_reg; @@ -201,6 +209,7 @@ module sha256( .init(core_init), .next(core_next), + .mode(mode_reg), .block(core_block), @@ -235,6 +244,7 @@ module sha256( begin init_reg <= 0; next_reg <= 0; + mode_reg <= MODE_SHA_256; ready_reg <= 0; digest_reg <= 256'h0; digest_valid_reg <= 0; @@ -270,6 +280,9 @@ module sha256( next_reg <= next_new; end + if (mode_we) + mode_reg <= mode_new; + if (core_digest_valid) begin digest_reg <= core_digest; @@ -405,6 +418,8 @@ module sha256( begin : api_logic init_set = 0; next_set = 0; + mode_new = 0; + mode_we = 0; block0_we = 0; block1_we = 0; block2_we = 0; @@ -443,6 +458,8 @@ module sha256( begin init_set = write_data[CTRL_INIT_BIT]; next_set = write_data[CTRL_NEXT_BIT]; + mode_new = write_data[CTRL_MODE_BIT]; + mode_we = 1; end ADDR_BLOCK0: @@ -538,10 +555,10 @@ module sha256( tmp_read_data = CORE_VERSION; ADDR_CTRL: - tmp_read_data = {28'h0000000, 2'b00, next_reg, init_reg}; + tmp_read_data = {29'h0, mode_reg, next_reg, init_reg}; ADDR_STATUS: - tmp_read_data = {28'h0000000, 2'b00, digest_valid_reg, ready_reg}; + tmp_read_data = {30'h0, digest_valid_reg, ready_reg}; ADDR_BLOCK0: tmp_read_data = block0_reg; diff --git a/src/rtl/sha256_core.v b/src/rtl/sha256_core.v index 448dfe6..6553aab 100644 --- a/src/rtl/sha256_core.v +++ b/src/rtl/sha256_core.v @@ -44,6 +44,7 @@ module sha256_core( input wire init, input wire next, + input wire mode, input wire [511 : 0] block, @@ -68,20 +69,29 @@ module sha256_core( //---------------------------------------------------------------- // Internal constant and parameter definitions. //---------------------------------------------------------------- - parameter H0_0 = 32'h6a09e667; - parameter H0_1 = 32'hbb67ae85; - parameter H0_2 = 32'h3c6ef372; - parameter H0_3 = 32'ha54ff53a; - parameter H0_4 = 32'h510e527f; - parameter H0_5 = 32'h9b05688c; - parameter H0_6 = 32'h1f83d9ab; - parameter H0_7 = 32'h5be0cd19; - - parameter SHA256_ROUNDS = 63; - - parameter CTRL_IDLE = 0; - parameter CTRL_ROUNDS = 1; - parameter CTRL_DONE = 2; + localparam SHA224_H0_0 = 32'hc1059ed8; + localparam SHA224_H0_1 = 32'h367cd507; + localparam SHA224_H0_2 = 32'h3070dd17; + localparam SHA224_H0_3 = 32'hf70e5939; + localparam SHA224_H0_4 = 32'hffc00b31; + localparam SHA224_H0_5 = 32'h68581511; + localparam SHA224_H0_6 = 32'h64f98fa7; + localparam SHA224_H0_7 = 32'hbefa4fa4; + + localparam SHA256_H0_0 = 32'h6a09e667; + localparam SHA256_H0_1 = 32'hbb67ae85; + localparam SHA256_H0_2 = 32'h3c6ef372; + localparam SHA256_H0_3 = 32'ha54ff53a; + localparam SHA256_H0_4 = 32'h510e527f; + localparam SHA256_H0_5 = 32'h9b05688c; + localparam SHA256_H0_6 = 32'h1f83d9ab; + localparam SHA256_H0_7 = 32'h5be0cd19; + + localparam SHA256_ROUNDS = 63; + + localparam CTRL_IDLE = 0; + localparam CTRL_ROUNDS = 1; + localparam CTRL_DONE = 2; //---------------------------------------------------------------- @@ -311,15 +321,29 @@ module sha256_core( if (digest_init) begin - H0_new = H0_0; - H1_new = H0_1; - H2_new = H0_2; - H3_new = H0_3; - H4_new = H0_4; - H5_new = H0_5; - H6_new = H0_6; - H7_new = H0_7; H_we = 1; + if (mode) + begin + H0_new = SHA256_H0_0; + H1_new = SHA256_H0_1; + H2_new = SHA256_H0_2; + H3_new = SHA256_H0_3; + H4_new = SHA256_H0_4; + H5_new = SHA256_H0_5; + H6_new = SHA256_H0_6; + H7_new = SHA256_H0_7; + end + else + begin + H0_new = SHA224_H0_0; + H1_new = SHA224_H0_1; + H2_new = SHA224_H0_2; + H3_new = SHA224_H0_3; + H4_new = SHA224_H0_4; + H5_new = SHA224_H0_5; + H6_new = SHA224_H0_6; + H7_new = SHA224_H0_7; + end end if (digest_update) @@ -397,17 +421,31 @@ module sha256_core( if (state_init) begin + a_h_we = 1; if (first_block) begin - a_new = H0_0; - b_new = H0_1; - c_new = H0_2; - d_new = H0_3; - e_new = H0_4; - f_new = H0_5; - g_new = H0_6; - h_new = H0_7; - a_h_we = 1; + if (mode) + begin + a_new = SHA256_H0_0; + b_new = SHA256_H0_1; + c_new = SHA256_H0_2; + d_new = SHA256_H0_3; + e_new = SHA256_H0_4; + f_new = SHA256_H0_5; + g_new = SHA256_H0_6; + h_new = SHA256_H0_7; + end + else + begin + a_new = SHA224_H0_0; + b_new = SHA224_H0_1; + c_new = SHA224_H0_2; + d_new = SHA224_H0_3; + e_new = SHA224_H0_4; + f_new = SHA224_H0_5; + g_new = SHA224_H0_6; + h_new = SHA224_H0_7; + end end else begin @@ -419,7 +457,6 @@ module sha256_core( f_new = H5_reg; g_new = H6_reg; h_new = H7_reg; - a_h_we = 1; end end -- cgit v1.2.3