Commit | Line | Data |
747da336 |
1 | # Test against SHA-1 Sample Vectors from NIST |
2 | # |
3 | # ref: http://csrc.nist.gov/cryptval/shs.html |
4 | |
5 | use strict; |
6 | |
7 | my $MODULE; |
8 | |
9 | BEGIN { |
72aa8e26 |
10 | $MODULE = ($ENV{PERL_CORE} || -e "SHA.pm") ? "Digest::SHA" : "Digest::SHA::PurePerl"; |
747da336 |
11 | eval "require $MODULE" || die $@; |
12 | $MODULE->import(qw()); |
13 | } |
14 | |
15 | BEGIN { |
16 | if ($ENV{PERL_CORE}) { |
17 | chdir 't' if -d 't'; |
18 | @INC = '../lib'; |
19 | } |
20 | } |
21 | |
22 | my $nist_hashes = <<END_OF_NIST_HASHES; |
23 | DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 ^ |
24 | 3CDF2936DA2FC556BFA533AB1EB59CE710AC80E5 ^ |
25 | 19C1E2048FA7393CFBF2D310AD8209EC11D996E5 ^ |
26 | CA775D8C80FAA6F87FA62BECA6CA6089D63B56E5 ^ |
27 | 71AC973D0E4B50AE9E5043FF4D615381120A25A0 ^ |
28 | A6B5B9F854CFB76701C3BDDBF374B3094EA49CBA ^ |
29 | D87A0EE74E4B9AD72E6847C87BDEEB3D07844380 ^ |
30 | 1976B8DD509FE66BF09C9A8D33534D4EF4F63BFD ^ |
31 | 5A78F439B6DB845BB8A558E4CEB106CD7B7FF783 ^ |
32 | F871BCE62436C1E280357416695EE2EF9B83695C ^ |
33 | END_OF_NIST_HASHES |
34 | |
35 | my @hashes = $nist_hashes =~ /\b[0-9A-F]{40}\b/g; |
36 | |
37 | my $nist_messages = <<END_OF_NIST_MESSAGES; |
38 | 0 1 ^ |
39 | 5 0 2 1 2 1 2 ^ |
40 | 5 0 1 3 4 4 4 ^ |
41 | 7 0 4 3 4 4 1 4 4 ^ |
42 | 10 0 4 1 5 3 4 4 3 1 3 4 ^ |
43 | 10 0 3 1 6 5 5 1 3 6 6 4 ^ |
44 | 13 1 3 2 5 3 3 3 4 6 6 1 4 6 2 ^ |
45 | 16 1 3 5 5 1 2 1 3 3 6 3 5 2 3 5 7 2 ^ |
46 | 15 1 8 1 5 3 2 7 4 5 6 7 3 3 1 6 3 ^ |
47 | 15 1 4 6 8 2 1 4 2 5 1 6 8 8 6 4 7 ^ |
48 | END_OF_NIST_MESSAGES |
49 | |
50 | my @lines = split(/\n/, $nist_messages); |
51 | |
52 | print "1..", scalar(@hashes), "\n"; |
53 | my $testnum = 1; |
54 | |
55 | my $message = ""; |
56 | my $sha = $MODULE->new(1); |
57 | for (@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 | } |