From 4b8d3a9da9a1d2639dd5d3adeaad55f338ead612 Mon Sep 17 00:00:00 2001 From: Paul Selkirk Date: Mon, 7 Jun 2021 14:13:23 -0400 Subject: Add mode bits for the various flavors of SHA-3, so that the software driver doesn't have to know that the internal block size is actually 1600 bits. This involves having the "init" state zero-extend the block data, and having "next" only absorb the block bits for that mode. --- src/rtl/sha3.v | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 12 deletions(-) (limited to 'src/rtl/sha3.v') diff --git a/src/rtl/sha3.v b/src/rtl/sha3.v index a8b41bc..31b6465 100644 --- a/src/rtl/sha3.v +++ b/src/rtl/sha3.v @@ -44,20 +44,23 @@ `define SHA3_NUM_ROUNDS 5'd24 module sha3( input wire clk, - input wire nreset, - input wire w, - input wire [ 8:2] addr, - input wire [32-1:0] din, + input wire nreset, + input wire w, + input wire [ 8:2] addr, + input wire [32-1:0] din, output wire [32-1:0] dout, - input wire init, - input wire next, - output wire ready); + input wire init, + input wire next, + input wire [ 1:0] mode, + output wire ready); - /* The SHA-3 algorithm really wants everything to be little-endian, + /* + * The SHA-3 algorithm really wants everything to be little-endian, * which is at odds with everything else in our system (including the * register interface to sha3_wrapper). Rather than trying to rewrite - * Bernd's beautiful code, we'll just byte-swap all I/O. + * Bernd's beautiful code, I'll isolate it in its own little-endian + * universe by byte-swapping all reads and writes. */ reg [31:0] dout_swap; @@ -193,10 +196,69 @@ module sha3( input wire clk, round <= round + 'd1; - end else if (init || next) begin + end else if (init) begin + + /* + * I'd like to have something concise like this, + * but the tools don't like it. + + for (i = 0; i < blksize[mode]; i = i + 1) + st[i] <= st[i]; + + for (i < blksize[mode]; i < 25; i = i + 1) + st[i] <= 64'h0; + + */ + + case (mode) + 0: begin + for (i = 0; i < 18; i = i + 1) + st[i] <= blk[i]; + for (i = 18; i < 25; i = i + 1) + st[i] <= 64'h0; + end + 1: begin + for (i = 0; i < 17; i = i + 1) + st[i] <= blk[i]; + for (i = 17; i < 25; i = i + 1) + st[i] <= 64'h0; + end + 2: begin + for (i = 0; i < 13; i = i + 1) + st[i] <= blk[i]; + for (i = 13; i < 25; i = i + 1) + st[i] <= 64'h0; + end + 3: begin + for (i = 0; i < 9; i = i + 1) + st[i] <= blk[i]; + for (i = 9; i < 25; i = i + 1) + st[i] <= 64'h0; + end + endcase - for (i=0; i<25; i=i+1) - st[i] <= init ? blk[i] : st[i] ^ blk[i]; // init has priority over next + round <= 'd0; + + end else if (next) begin + + case (mode) + 0: begin + for (i = 0; i < 18; i = i + 1) + st[i] <= st[i] ^ blk[i]; + end + 1: begin + for (i = 0; i < 17; i = i + 1) + st[i] <= st[i] ^ blk[i]; + end + 2: begin + for (i = 0; i < 13; i = i + 1) + st[i] <= st[i] ^ blk[i]; + end + 3: begin + for (i = 0; i < 9; i = i + 1) + st[i] <= st[i] ^ blk[i]; + end + endcase round <= 'd0; -- cgit v1.2.3