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 ^ 223CDF2936DA2FC556BFA533AB1EB59CE710AC80E5 ^ 2319C1E2048FA7393CFBF2D310AD8209EC11D996E5 ^ 24CA775D8C80FAA6F87FA62BECA6CA6089D63B56E5 ^ 2571AC973D0E4B50AE9E5043FF4D615381120A25A0 ^ 26A6B5B9F854CFB76701C3BDDBF374B3094EA49CBA ^ 27D87A0EE74E4B9AD72E6847C87BDEEB3D07844380 ^ 281976B8DD509FE66BF09C9A8D33534D4EF4F63BFD ^ 295A78F439B6DB845BB8A558E4CEB106CD7B7FF783 ^ 30F871BCE62436C1E280357416695EE2EF9B83695C ^ 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 ^ 375 0 2 1 2 1 2 ^ 385 0 1 3 4 4 4 ^ 397 0 4 3 4 4 1 4 4 ^ 4010 0 4 1 5 3 4 4 3 1 3 4 ^ 4110 0 3 1 6 5 5 1 3 6 6 4 ^ 4213 1 3 2 5 3 3 3 4 6 6 1 4 6 2 ^ 4316 1 3 5 5 1 2 1 3 3 6 3 5 2 3 5 7 2 ^ 4415 1 8 1 5 3 2 7 4 5 6 7 3 3 1 6 3 ^ 4515 1 4 6 8 2 1 4 2 5 1 6 8 8 6 4 7 ^ 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 68 uc($sha->add(pack("B*", $bitstr))->hexdigest) 69 eq shift(@hashes); 70 print "ok ", $testnum++, "\n"; 71} 72