aboutsummaryrefslogtreecommitdiff
path: root/src/rtl/sha256_core.v
diff options
context:
space:
mode:
authorJoachim StroĢˆmbergson <joachim@secworks.se>2016-05-31 14:00:00 +0200
committerJoachim StroĢˆmbergson <joachim@secworks.se>2016-05-31 14:00:00 +0200
commitdc47fffe47a1fc49ad79e4201f219c8a697b7ae5 (patch)
tree581058cea1d58978871636e66e48787f545e38cc /src/rtl/sha256_core.v
parent0e90cfa1f076b8660610dfd3930ef1b37a1fb41e (diff)
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.
Diffstat (limited to 'src/rtl/sha256_core.v')
-rw-r--r--src/rtl/sha256_core.v101
1 files changed, 69 insertions, 32 deletions
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