blob: 291f11cd3b7309aad8a97a5a2654ee754df0c392 (
plain) (
tree)
|
|
`timescale 1ns / 1ps
module streebog_tb;
localparam STREEBOG_MODE_SHORT = 1;
localparam STREEBOG_MODE_LONG = 0;
// short message that fits into one block
localparam [511:0] MSG_SINGLE = 512'h01323130393837363534333231303938373635343332313039383736353433323130393837363534333231303938373635343332313039383736353433323130;
// length of short message in bits
localparam [ 9:0] MSG_SINGLE_LENGTH = 10'd504;
// correct 512-bit digest of short message
localparam [511:0] MSG_SINGLE_DIGEST_LONG = 512'h486f64c1917879417fef082b3381a4e211c324f074654c38823a7b76f830ad00fa1fbae42b1285c0352f227524bc9ab16254288dd6863dccd5b9f54a1ad0541b;
// correct 256-bit digest of short message
localparam [255:0] MSG_SINGLE_DIGEST_SHORT = 256'h00557be5e584fd52a449b16b0251d05d27f94ab76cbaa6da890b59d8ef1e159d;
// first block of long message
localparam [511:0] MSG_DOUBLE_FIRST = 512'hfbeafaebef20fffbf0e1e0f0f520e0ed20e8ece0ebe5f0f2f120fff0eeec20f120faf2fee5e2202ce8f6f3ede220e8e6eee1e8f0f2d1202ce8f0f2e5e220e5d1;
// second block of long message
localparam [511:0] MSG_DOUBLE_SECOND = 512'h0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fbe2e5f0eee3c820;
// length of first part of long message in bits
localparam [ 9:0] MSG_DOUBLE_FIRST_LENGTH = 10'd512;
// length of second part of long message in bits
localparam [ 9:0] MSG_DOUBLE_SECOND_LENGTH = 10'd64;
// correct 512-bit digest of long message
localparam [511:0] MSG_DOUBLE_DIGEST_LONG = 512'h28fbc9bada033b1460642bdcddb90c3fb3e56c497ccd0f62b8a2ad4935e85f037613966de4ee00531ae60f3b5a47f8dae06915d5f2f194996fcabf2622e6881e;
// correct 256-bit digest of short message
localparam [511:0] MSG_DOUBLE_DIGEST_SHORT = 256'h508f7e553c06501d749a66fc28c6cac0b005746d97537fa85d9e40904efed29d;
//
// Inputs
//
reg clock;
reg [511:0] block;
reg [ 9:0] block_length;
reg init = 0;
reg update = 0;
reg final = 0;
reg short_mode;
//
// Outputs
//
wire [511:0] digest;
wire digest_valid;
wire ready;
//
// UUT
//
streebog_hash_top uut
(
.clock (clock),
.block (block),
.block_length (block_length),
.init (init),
.update (update),
.final (final),
.short_mode (short_mode),
.digest (digest),
.digest_valid (digest_valid),
.ready (ready)
);
//
// Clock
//
initial clock = 1'b0;
always #5 clock = ~clock;
reg [511:0] hash;
wire [255:0] hash_short = hash[511:256];
initial begin
//
#100;
//
$display("Checking 512-bit mode on short message...");
//
streebog_init(STREEBOG_MODE_LONG);
streebog_set_block(MSG_SINGLE, MSG_SINGLE_LENGTH);
streebog_update();
streebog_final();
//
if (hash == MSG_SINGLE_DIGEST_LONG) $display("OK");
else $display("ERROR: hash == %0128h", hash);
//
#100;
//
$display("Checking 256-bit mode on short message...");
//
streebog_init(STREEBOG_MODE_SHORT);
streebog_set_block(MSG_SINGLE, MSG_SINGLE_LENGTH);
streebog_update();
streebog_final();
//
if (hash_short == MSG_SINGLE_DIGEST_SHORT) $display("OK");
else $display("ERROR: hash_short == %064h", hash_short);
//
#100;
//
$display("Checking 512-bit mode on long message...");
//
streebog_init(STREEBOG_MODE_LONG);
streebog_set_block(MSG_DOUBLE_FIRST, MSG_DOUBLE_FIRST_LENGTH);
streebog_update();
streebog_set_block(MSG_DOUBLE_SECOND, MSG_DOUBLE_SECOND_LENGTH);
streebog_update();
streebog_final();
//
if (hash == MSG_DOUBLE_DIGEST_LONG) $display("OK");
else $display("ERROR: hash == %0128h", hash);
//
#100;
//
$display("Checking 256-bit mode on long message...");
//
streebog_init(STREEBOG_MODE_SHORT);
streebog_set_block(MSG_DOUBLE_FIRST, MSG_DOUBLE_FIRST_LENGTH);
streebog_update();
streebog_set_block(MSG_DOUBLE_SECOND, MSG_DOUBLE_SECOND_LENGTH);
streebog_update();
streebog_final();
//
if (hash_short == MSG_DOUBLE_DIGEST_SHORT) $display("OK");
else $display("ERROR: hash_short == %064h", hash_short);
//
#100;
//
$finish;
end
task streebog_init;
input use_short_mode;
begin
short_mode = use_short_mode;
init = 1;
#10;
init = 0;
#10;
end
endtask
task streebog_set_block;
input [511:0] new_block;
input [ 9:0] new_block_length;
begin
block = new_block;
block_length = new_block_length;
end
endtask;
task streebog_update;
begin
update = 1;
#10;
update = 0;
#10
while (!ready) #10;
#10;
end
endtask
task streebog_final;
begin
final = 1;
#10;
final = 0;
#10
while (!digest_valid) #10;
hash = digest;
#10;
while (!ready) #10;
#10;
end
endtask
endmodule
|