1use strict; 2use FileHandle; 3 4my $MODULE; 5 6BEGIN { 7 $MODULE = (-d "src") ? "Digest::SHA" : "Digest::SHA::PurePerl"; 8 eval "require $MODULE" || die $@; 9 $MODULE->import(qw()); 10} 11 12BEGIN { 13 if ($ENV{PERL_CORE}) { 14 chdir 't' if -d 't'; 15 @INC = '../lib'; 16 } 17} 18 19my @out = ( 20 "ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0", 21 "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1", 22); 23 24my $numtests = 8 + scalar @out; 25print "1..$numtests\n"; 26 27 # attempt to use an invalid algorithm, and check for failure 28 29my $testnum = 1; 30my $NSA = "SHA-42"; # No Such Algorithm 31print "not " if $MODULE->new($NSA); 32print "ok ", $testnum++, "\n"; 33 34my $tempfile = "methods.tmp"; 35END { 1 while unlink $tempfile } 36 37 # test OO methods using first two SHA-256 vectors from NIST 38 39my $fh = FileHandle->new($tempfile, "w"); 40binmode($fh); 41print $fh "bcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; 42$fh->close; 43 44my $sha = $MODULE->new()->reset("SHA-256")->new(); 45$sha->add_bits("a", 5)->add_bits("001"); 46 47my $rsp = shift(@out); 48print "not " unless $sha->clone->add("b", "c")->b64digest eq $rsp; 49print "ok ", $testnum++, "\n"; 50 51$rsp = shift(@out); 52 53 # test addfile with bareword filehandle 54 55open(FILE, "<$tempfile"); 56binmode(FILE); 57print "not " unless 58 $sha->clone->addfile(*FILE)->hexdigest eq $rsp; 59print "ok ", $testnum++, "\n"; 60close(FILE); 61 62 # test addfile with indirect filehandle 63 64$fh = FileHandle->new($tempfile, "r"); 65binmode($fh); 66print "not " unless $sha->clone->addfile($fh)->hexdigest eq $rsp; 67print "ok ", $testnum++, "\n"; 68$fh->close; 69 70 # test addfile using file name instead of handle 71 72print "not " unless $sha->addfile($tempfile, "b")->hexdigest eq $rsp; 73print "ok ", $testnum++, "\n"; 74 75 # test addfile portable mode 76 77$fh = FileHandle->new($tempfile, "w"); 78binmode($fh); 79print $fh "abc\012" x 2048; # using UNIX newline 80$fh->close; 81 82print "not " unless $sha->new(1)->addfile($tempfile, "p")->hexdigest eq 83 "d449e19c1b0b0c191294c8dc9fa2e4a6ff77fc51"; 84print "ok ", $testnum++, "\n"; 85 86$fh = FileHandle->new($tempfile, "w"); 87binmode($fh); 88print $fh "abc\015\012" x 2048; # using DOS/Windows newline 89$fh->close; 90 91print "not " unless $sha->new(1)->addfile($tempfile, "p")->hexdigest eq 92 "d449e19c1b0b0c191294c8dc9fa2e4a6ff77fc51"; 93print "ok ", $testnum++, "\n"; 94 95$fh = FileHandle->new($tempfile, "w"); 96binmode($fh); 97print $fh "abc\015" x 2048; # using early-Mac newline 98$fh->close; 99 100print "not " unless $sha->new(1)->addfile($tempfile, "p")->hexdigest eq 101 "d449e19c1b0b0c191294c8dc9fa2e4a6ff77fc51"; 102print "ok ", $testnum++, "\n"; 103 104 # test addfile BITS mode 105 106$fh = FileHandle->new($tempfile, "w"); 107print $fh "0100010"; # using NIST 7-bit test vector 108$fh->close; 109 110print "not " unless $sha->new(1)->addfile($tempfile, "0")->hexdigest eq 111 "04f31807151181ad0db278a1660526b0aeef64c2"; 112print "ok ", $testnum++, "\n"; 113 114$fh = FileHandle->new($tempfile, "w"); 115binmode($fh); 116print $fh map(chr, (0..127)); # this is actually NIST 2-bit test 117$fh->close; # vector "01" (other chars ignored) 118 119print "not " unless $sha->new(1)->addfile($tempfile, "0")->hexdigest eq 120 "ec6b39952e1a3ec3ab3507185cf756181c84bbe2"; 121print "ok ", $testnum++, "\n"; 122