//======================================================================
//
// sha512_h_constants.v
// ---------------------
// The H initial constants for the different modes in SHA-512.
//
//
// Author: Joachim Strombergson
// Copyright (c) 2014, NORDUnet A/S
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
// - Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// - Neither the name of the NORDUnet nor the names of its contributors may
// be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//======================================================================
module sha512_h_constants(
input wire [1 : 0] mode,
output wire [63 : 0] H0,
output wire [63 : 0] H1,
output wire [63 : 0] H2,
output wire [63 : 0] H3,
output wire [63 : 0] H4,
output wire [63 : 0] H5,
output wire [63 : 0] H6,
output wire [63 : 0] H7
);
//----------------------------------------------------------------
// Wires.
//----------------------------------------------------------------
reg [63 : 0] tmp_H0;
reg [63 : 0] tmp_H1;
reg [63 : 0] tmp_H2;
reg [63 : 0] tmp_H3;
reg [63 : 0] tmp_H4;
reg [63 : 0] tmp_H5;
reg [63 : 0] tmp_H6;
reg [63 : 0] tmp_H7;
//----------------------------------------------------------------
// Concurrent connectivity for ports etc.
//----------------------------------------------------------------
assign H0 = tmp_H0;
assign H1 = tmp_H1;
assign H2 = tmp_H2;
assign H3 = tmp_H3;
assign H4 = tmp_H4;
assign H5 = tmp_H5;
assign H6 = tmp_H6;
assign H7 = tmp_H7;
//----------------------------------------------------------------
// mode_mux
//
// Based on the given mode, the correct H constants are selected.
//----------------------------------------------------------------
always @*
begin : mode_mux
case(mode)
0:
begin
// SHA-512/224
tmp_H0 = 64'h8c3d37c819544da2;
tmp_H1 = 64'h73e1996689dcd4d6;
tmp_H2 = 64'h1dfab7ae32ff9c82;
tmp_H3 = 64'h679dd514582f9fcf;
tmp_H4 = 64'h0f6d2b697bd44da8;
tmp_H5 = 64'h77e36f7304c48942;
tmp_H6 = 64'h3f9d85a86a1d36c8;
tmp_H7 = 64'h1112e6ad91d692a1;
end
1:
begin
// SHA-512/256
tmp_H0 = 64'h22312194fc2bf72c;
tmp_H1 = 64'h9f555fa3c84c64c2;
tmp_H2 = 64'h2393b86b6f53b151;
tmp_H3 = 64'h963877195940eabd;
tmp_H4 = 64'h96283ee2a88effe3;
tmp_H5 = 64'hbe5e1e2553863992;
tmp_H6 = 64'h2b0199fc2c85b8aa;
tmp_H7 = 64'h0eb72ddc81c52ca2;
end
2:
begin
// SHA-384
tmp_H0 = 64'hcbbb9d5dc1059ed8;
tmp_H1 = 64'h629a292a367cd507;
tmp_H2 = 64'h9159015a3070dd17;
tmp_H3 = 64'h152fecd8f70e5939;
tmp_H4 = 64'h67332667ffc00b31;
tmp_H5 = 64'h8eb44a8768581511;
tmp_H6 = 64'hdb0c2e0d64f98fa7;
tmp_H7 = 64'h47b5481dbefa4fa4;
end
3:
begin
// SHA-512
tmp_H0 = 64'h6a09e667f3bcc908;
tmp_H1 = 64'hbb67ae8584caa73b;
tmp_H2 = 64'h3c6ef372fe94f82b;
tmp_H3 = 64'ha54ff53a5f1d36f1;
tmp_H4 = 64'h510e527fade682d1;
tmp_H5 = 64'h9b05688c2b3e6c1f;
tmp_H6 = 64'h1f83d9abfb41bd6b;
tmp_H7 = 64'h5be0cd19137e2179;
end
endcase // case (addr)
end // block: mode_mux
endmodule // sha512_h_constants
//======================================================================
// sha512_h_constants.v
//======================================================================