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