1# Test against SHA-1 Sample Vectors from NIST 2# 3# ref: http://csrc.nist.gov/cryptval/shs.html 4 5use strict; 6 7my $MODULE; 8 9BEGIN { 10 $MODULE = (-e "SHA.pm") ? "Digest::SHA" : "Digest::SHA::PurePerl"; 11 eval "require $MODULE" || die $@; 12 $MODULE->import(qw()); 13} 14 15BEGIN { 16 if ($ENV{PERL_CORE}) { 17 chdir 't' if -d 't'; 18 @INC = '../lib'; 19 } 20} 21 22my $nist_hashes = <<END_OF_NIST_HASHES; 23DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 ^ 243CDF2936DA2FC556BFA533AB1EB59CE710AC80E5 ^ 2519C1E2048FA7393CFBF2D310AD8209EC11D996E5 ^ 26CA775D8C80FAA6F87FA62BECA6CA6089D63B56E5 ^ 2771AC973D0E4B50AE9E5043FF4D615381120A25A0 ^ 28A6B5B9F854CFB76701C3BDDBF374B3094EA49CBA ^ 29D87A0EE74E4B9AD72E6847C87BDEEB3D07844380 ^ 301976B8DD509FE66BF09C9A8D33534D4EF4F63BFD ^ 315A78F439B6DB845BB8A558E4CEB106CD7B7FF783 ^ 32F871BCE62436C1E280357416695EE2EF9B83695C ^ 33END_OF_NIST_HASHES 34 35my @hashes = $nist_hashes =~ /\b[0-9A-F]{40}\b/g; 36 37my $nist_messages = <<END_OF_NIST_MESSAGES; 380 1 ^ 395 0 2 1 2 1 2 ^ 405 0 1 3 4 4 4 ^ 417 0 4 3 4 4 1 4 4 ^ 4210 0 4 1 5 3 4 4 3 1 3 4 ^ 4310 0 3 1 6 5 5 1 3 6 6 4 ^ 4413 1 3 2 5 3 3 3 4 6 6 1 4 6 2 ^ 4516 1 3 5 5 1 2 1 3 3 6 3 5 2 3 5 7 2 ^ 4615 1 8 1 5 3 2 7 4 5 6 7 3 3 1 6 3 ^ 4715 1 4 6 8 2 1 4 2 5 1 6 8 8 6 4 7 ^ 48END_OF_NIST_MESSAGES 49 50my @lines = split(/\n/, $nist_messages); 51 52print "1..", scalar(@hashes), "\n"; 53my $testnum = 1; 54 55my $message = ""; 56my $sha = $MODULE->new(1); 57for (@lines) { 58 next unless /^[\d ^]/; 59 $message .= $_; 60 next unless /\^\s*$/; 61 my @vals = $message =~ /\d+/g; $message = ""; 62 my $count = shift(@vals); 63 my $bit = shift(@vals); 64 my $bitstr = ""; 65 while (@vals) { 66 $bitstr .= $bit x shift(@vals); 67 $bit = 1 - $bit; 68 } 69 print "not " unless 70 uc($sha->add(pack("B*", $bitstr))->hexdigest) 71 eq shift(@hashes); 72 print "ok ", $testnum++, "\n"; 73} 74