1# Test against SHA-1 Sample Vectors from NIST
2
3use strict;
4
5my $MODULE;
6
7BEGIN {
8	$MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl";
9	eval "require $MODULE" || die $@;
10	$MODULE->import(qw());
11}
12
13BEGIN {
14	if ($ENV{PERL_CORE}) {
15		chdir 't' if -d 't';
16		@INC = '../lib';
17	}
18}
19
20my $nist_hashes = <<END_OF_NIST_HASHES;
21DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 ^
2259C4526AA2CC59F9A5F56B5579BA7108E7CCB61A ^
236E42FB84067CFF056C43A49E484997AF23190879 ^
24C63FBB9A87171A176E6E054890E29A8C5F125F6C ^
253109E33C1C4B9A0169D1599169D0E5A520A1E71C ^
269195E1E73CC68D7170F44BD1D83CB624BC87FA0B ^
2764F7C374527278C0436DBC8DE5AABEC2BBF634BC ^
28154B622EA426FB151B1FF1BE1CE871752B9EDEB4 ^
2912BDD00FD4038756CBCF8ECDAD1B0CD862603CD8 ^
306700F93E1691E83735279E167F67AF61FEE9813B ^
31END_OF_NIST_HASHES
32
33my @hashes = $nist_hashes =~ /\b[0-9A-F]{40}\b/g;
34
35my $nist_messages = <<END_OF_NIST_MESSAGES;
360 1 ^
371 1 1 ^
382 1 1 1 ^
393 0 1 1 1 ^
402 0 2 2 ^
414 1 1 1 2 1 ^
423 0 2 2 2 ^
434 1 1 2 2 2 ^
445 1 2 2 1 1 2 ^
455 0 2 2 1 1 3 ^
46END_OF_NIST_MESSAGES
47
48my @lines = split(/\n/, $nist_messages);
49
50print "1..", scalar(@hashes), "\n";
51my $testnum = 1;
52
53my $message = "";
54my $sha = $MODULE->new(1);
55for (@lines) {
56	next unless /^[\d ^]/;
57	$message .= $_;
58	next unless /\^\s*$/;
59	my @vals = $message =~ /\d+/g; $message = "";
60	my $count = shift(@vals);
61	my $bit = shift(@vals);
62	my $bitstr = "";
63	while (@vals) {
64		$bitstr .= $bit x shift(@vals);
65		$bit = 1 - $bit;
66	}
67	print "not " unless uc($sha->add_bits($bitstr)->hexdigest)
68		eq shift(@hashes);
69	print "ok ", $testnum++, "\n";
70}
71