1# Test against SHA-1 Sample Vectors from NIST 2 3use strict; 4use Digest::SHA; 5 6my $nist_hashes = <<END_OF_NIST_HASHES; 7DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 ^ 859C4526AA2CC59F9A5F56B5579BA7108E7CCB61A ^ 96E42FB84067CFF056C43A49E484997AF23190879 ^ 10C63FBB9A87171A176E6E054890E29A8C5F125F6C ^ 113109E33C1C4B9A0169D1599169D0E5A520A1E71C ^ 129195E1E73CC68D7170F44BD1D83CB624BC87FA0B ^ 1364F7C374527278C0436DBC8DE5AABEC2BBF634BC ^ 14154B622EA426FB151B1FF1BE1CE871752B9EDEB4 ^ 1512BDD00FD4038756CBCF8ECDAD1B0CD862603CD8 ^ 166700F93E1691E83735279E167F67AF61FEE9813B ^ 17END_OF_NIST_HASHES 18 19my @hashes = $nist_hashes =~ /\b[0-9A-F]{40}\b/g; 20 21my $nist_messages = <<END_OF_NIST_MESSAGES; 220 1 ^ 231 1 1 ^ 242 1 1 1 ^ 253 0 1 1 1 ^ 262 0 2 2 ^ 274 1 1 1 2 1 ^ 283 0 2 2 2 ^ 294 1 1 2 2 2 ^ 305 1 2 2 1 1 2 ^ 315 0 2 2 1 1 3 ^ 32END_OF_NIST_MESSAGES 33 34my @lines = split(/\n/, $nist_messages); 35 36print "1..", scalar(@hashes), "\n"; 37my $testnum = 1; 38 39my $message = ""; 40my $sha = Digest::SHA->new(1); 41for (@lines) { 42 next unless /^[\d ^]/; 43 $message .= $_; 44 next unless /\^\s*$/; 45 my @vals = $message =~ /\d+/g; $message = ""; 46 my $count = shift(@vals); 47 my $bit = shift(@vals); 48 my $bitstr = ""; 49 while (@vals) { 50 $bitstr .= $bit x shift(@vals); 51 $bit = 1 - $bit; 52 } 53 print "not " unless uc($sha->add_bits($bitstr)->hexdigest) 54 eq shift(@hashes); 55 print "ok ", $testnum++, "\n"; 56} 57