aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rtl/keywrap_core.v86
1 files changed, 57 insertions, 29 deletions
diff --git a/src/rtl/keywrap_core.v b/src/rtl/keywrap_core.v
index 91e5161..99736f2 100644
--- a/src/rtl/keywrap_core.v
+++ b/src/rtl/keywrap_core.v
@@ -73,13 +73,15 @@ module keywrap_core (
localparam CTRL_IDLE = 4'h0;
localparam CTRL_INIT_WAIT = 4'h1;
- localparam CTRL_NEXT_LOOP = 4'h2;
- localparam CTRL_NEXT_WAIT0 = 4'h3;
- localparam CTRL_NEXT_WAIT = 4'h4;
- localparam CTRL_NEXT_UPDATE = 4'h5;
- localparam CTRL_NEXT_WRAP = 4'h6;
- localparam CTRL_NEXT_UNWRAP = 4'h7;
- localparam CTRL_NEXT_FINALIZE = 4'h8;
+ localparam CTRL_NEXT_WSTART = 4'h2;
+ localparam CTRL_NEXT_USTART = 4'h3;
+ localparam CTRL_NEXT_LOOP = 4'h4;
+ localparam CTRL_NEXT_WAIT0 = 4'h5;
+ localparam CTRL_NEXT_WAIT = 4'h6;
+ localparam CTRL_NEXT_UPDATE = 4'h7;
+ localparam CTRL_NEXT_WCHECK = 4'h8;
+ localparam CTRL_NEXT_UCHECK = 4'h9;
+ localparam CTRL_NEXT_FINALIZE = 4'ha;
//----------------------------------------------------------------
@@ -221,23 +223,28 @@ module keywrap_core (
//----------------------------------------------------------------
- // keywrap_dp
+ // keywrap_logic
//
// Main logic for the key wrap functionality.
//----------------------------------------------------------------
always @*
- begin : keywrap_dp
+ begin : keywrap_logic
reg [63 : 0] xor_val;
a_new = 64'h0;
a_we = 1'h0;
core_addr = block_ctr_reg - 1'h1;
- core_we = 1'h0;
+ core_we = 1'h0;
- aes_block = {a_reg, core_rd_data};
- core_wr_data = aes_result[63 : 0];
xor_val = (rlen * iteration_ctr_reg) + {51'h0, block_ctr_reg};
+ if (encdec)
+ aes_block = {a_reg, core_rd_data};
+ else
+ aes_block = {(a_reg ^ xor_val), core_rd_data};
+
+ core_wr_data = aes_result[63 : 0];
+
if (init_a)
begin
a_new = a_init;
@@ -246,9 +253,13 @@ module keywrap_core (
if (update_state)
begin
- a_new = aes_result[127 : 64] ^ xor_val;
- a_we = 1'h1;
core_we = 1'h1;
+
+ if (encdec)
+ a_new = aes_result[127 : 64] ^ xor_val;
+ else
+ a_new = aes_result[127 : 64];
+ a_we = 1'h1;
end
end
@@ -258,7 +269,7 @@ module keywrap_core (
//----------------------------------------------------------------
always @*
begin : block_ctr
- block_ctr_new = 13'h1;
+ block_ctr_new = 13'h0;
block_ctr_we = 1'h0;
if (block_ctr_rst)
@@ -363,18 +374,21 @@ module keywrap_core (
if (next)
begin
- block_ctr_rst = 1'h1;
- iteration_ctr_rst = 1'h1;
ready_new = 1'h0;
ready_we = 1'h1;
valid_new = 1'h0;
valid_we = 1'h1;
init_a = 1'h1;
- keywrap_core_ctrl_new = CTRL_NEXT_LOOP;
+
+ if (encdec)
+ keywrap_core_ctrl_new = CTRL_NEXT_WSTART;
+ else
+ keywrap_core_ctrl_new = CTRL_NEXT_USTART;
keywrap_core_ctrl_we = 1'h1;
end
end
+
CTRL_INIT_WAIT:
begin
if (aes_ready)
@@ -387,6 +401,24 @@ module keywrap_core (
end
+ CTRL_NEXT_WSTART:
+ begin
+ block_ctr_rst = 1'h1;
+ iteration_ctr_rst = 1'h1;
+ keywrap_core_ctrl_new = CTRL_NEXT_LOOP;
+ keywrap_core_ctrl_we = 1'h1;
+ end
+
+
+ CTRL_NEXT_USTART:
+ begin
+ block_ctr_set = 1'h1;
+ iteration_ctr_set = 1'h1;
+ keywrap_core_ctrl_new = CTRL_NEXT_LOOP;
+ keywrap_core_ctrl_we = 1'h1;
+ end
+
+
CTRL_NEXT_LOOP:
begin
aes_next = 1'h1;
@@ -414,21 +446,17 @@ module keywrap_core (
CTRL_NEXT_UPDATE:
begin
- update_state = 1'h1;
+ update_state = 1'h1;
+
if (encdec)
- begin
- keywrap_core_ctrl_new = CTRL_NEXT_WRAP;
- keywrap_core_ctrl_we = 1'h1;
- end
+ keywrap_core_ctrl_new = CTRL_NEXT_WCHECK;
else
- begin
- keywrap_core_ctrl_new = CTRL_NEXT_UNWRAP;
- keywrap_core_ctrl_we = 1'h1;
- end
+ keywrap_core_ctrl_new = CTRL_NEXT_UCHECK;
+ keywrap_core_ctrl_we = 1'h1;
end
- CTRL_NEXT_WRAP:
+ CTRL_NEXT_WCHECK:
begin
if (block_ctr_reg < rlen)
begin
@@ -453,7 +481,7 @@ module keywrap_core (
end
- CTRL_NEXT_UNWRAP:
+ CTRL_NEXT_UCHECK:
begin
if (block_ctr_reg > 0)
begin