aboutsummaryrefslogtreecommitdiff
path: root/src/rtl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtl')
-rw-r--r--src/rtl/keywrap_core.v113
1 files changed, 84 insertions, 29 deletions
diff --git a/src/rtl/keywrap_core.v b/src/rtl/keywrap_core.v
index eda8459..61f7859 100644
--- a/src/rtl/keywrap_core.v
+++ b/src/rtl/keywrap_core.v
@@ -3,7 +3,8 @@
// keywrap_core.v
// --------------
// Core that tries to implement AES KEY WRAP as specified in
-// RFC 3394. Experimental core at the moment.
+// RFC 3394 and extended with padding in RFC 5649.
+// Experimental core at the moment. Does Not Work.
// The maximum wrap object size is 64 kByte.
//
//
@@ -67,6 +68,8 @@ module keywrap_core (
localparam CTRL_INIT = 3'h1;
localparam CTRL_NEXT = 3'h2;
+ localparam RFC5649_A_IV = 32'ha65959a6;
+
//----------------------------------------------------------------
// Registers and memories including control signals.
@@ -80,23 +83,19 @@ module keywrap_core (
reg ready_new;
reg ready_we;
- reg [12 : 0] block_loop_ctr_reg;
- reg [12 : 0] block_loop_ctr_new;
- reg block_loop_ctr_we;
- reg block_loop_ctr_inc;
- reg block_loop_ctr_rst;
-
- reg [2 : 0] outer_loop_ctr_reg;
- reg [2 : 0] outer_loop_ctr_new;
- reg outer_loop_ctr_we;
- reg outer_loop_ctr_inc;
- reg outer_loop_ctr_dec;
- reg outer_loop_ctr_set;
- reg outer_loop_ctr_rst;
+ reg [12 : 0] block_ctr_reg;
+ reg [12 : 0] block_ctr_new;
+ reg block_ctr_we;
+ reg block_ctr_inc;
+ reg block_ctr_rst;
- reg [12 : 0] core_addr_ctr_reg;
- reg [12 : 0] core_addr_ctr_new;
- reg core_addr_ctr_we;
+ reg [2 : 0] iteration_ctr_reg;
+ reg [2 : 0] iteration_ctr_new;
+ reg iteration_ctr_we;
+ reg iteration_ctr_inc;
+ reg iteration_ctr_dec;
+ reg iteration_ctr_set;
+ reg iteration_ctr_rst;
reg [2 : 0] keywrap_core_ctrl_reg;
reg [2 : 0] keywrap_core_ctrl_new;
@@ -126,8 +125,8 @@ module keywrap_core (
// Instantiations.
//----------------------------------------------------------------
keywrap_mem mem(
- .clk(),
- .reset_n(),
+ .clk(clk),
+ .reset_n(reset_n),
.api_we(api_we),
.api_addr(api_addr),
.api_wr_data(api_wr_data),
@@ -179,20 +178,76 @@ module keywrap_core (
//----------------------------------------------------------------
+ // block_ctr
+ //----------------------------------------------------------------
+ always @*
+ begin : block_ctr
+ block_ctr_new = 13'h0;
+ block_ctr_we = 1'h0;
+
+ if (block_ctr_rst)
+ begin
+ block_ctr_new = 13'h0;
+ block_ctr_we = 1'h1;
+ end
+
+ if (block_ctr_inc)
+ begin
+ block_ctr_new = block_ctr_reg + 1'h1;
+ block_ctr_we = 1'h1;
+ end
+ end
+
+
+ //----------------------------------------------------------------
+ // iteration_ctr
+ //----------------------------------------------------------------
+ always @*
+ begin : iteration_ctr
+ iteration_ctr_new = 3'h0;
+ iteration_ctr_we = 1'h0;
+
+ if (iteration_ctr_rst)
+ begin
+ iteration_ctr_new = 3'h0;
+ iteration_ctr_we = 1'h1;
+ end
+
+ if (iteration_ctr_set)
+ begin
+ iteration_ctr_new = 3'h5;
+ iteration_ctr_we = 1'h1;
+ end
+
+ if (iteration_ctr_dec)
+ begin
+ iteration_ctr_new = iteration_ctr_reg + 1'h1;
+ iteration_ctr_we = 1'h1;
+ end
+
+ if (iteration_ctr_inc)
+ begin
+ iteration_ctr_new = iteration_ctr_reg + 1'h1;
+ iteration_ctr_we = 1'h1;
+ end
+
+ end
+
+
+ //----------------------------------------------------------------
// keywrap_core_ctrl
//----------------------------------------------------------------
always @*
begin : keywrap_core_ctrl
- aes_encdec = 0;
- aes_init = 0;
- aes_next = 0;
- block_loop_ctr_inc = 0;
- block_loop_ctr_rst = 0;
- outer_loop_ctr_inc = 0;
- outer_loop_ctr_dec = 0;
- outer_loop_ctr_set = 0;
- outer_loop_ctr_rst = 0;
-
+ aes_encdec = 0;
+ aes_init = 0;
+ aes_next = 0;
+ block_ctr_inc = 0;
+ block_ctr_rst = 0;
+ iteration_ctr_inc = 0;
+ iteration_ctr_dec = 0;
+ iteration_ctr_set = 0;
+ iteration_ctr_rst = 0;
case (keywrap_core_ctrl_reg)
CTRL_IDLE: