| 1 | #!/usr/bin/perl |
|---|
| 2 | # $Id$ |
|---|
| 3 | use strict; |
|---|
| 4 | use warnings; |
|---|
| 5 | |
|---|
| 6 | use lib 't/lib'; |
|---|
| 7 | use lib 'lib'; |
|---|
| 8 | use lib 'extlib'; |
|---|
| 9 | |
|---|
| 10 | use Test::More tests => 8; |
|---|
| 11 | |
|---|
| 12 | use MT; |
|---|
| 13 | use MT::Test; |
|---|
| 14 | use MT::Builder; |
|---|
| 15 | use MT::Util qw(dsa_verify perl_sha1_digest_hex dec2bin); |
|---|
| 16 | |
|---|
| 17 | use lib 't'; |
|---|
| 18 | |
|---|
| 19 | my $msg = 'nina@blues.org::Nina Simone::1072216494'; |
|---|
| 20 | my $sig = { |
|---|
| 21 | r => "527791435593304577725339030118988880225606145248", |
|---|
| 22 | s => "856186764515774026930421996711007369328400857333", |
|---|
| 23 | }; |
|---|
| 24 | my $dsa_key = { |
|---|
| 25 | p => '11671236708387678327224206536086899180337891539414163231548040398520841845883184000627860280911468857014406210406182985401875818712804278750455023001090753', |
|---|
| 26 | g => '8390523802553664927497849579280285206671739131891639945934584937465879937204060160958306281843225586442674344146773393578506632957361175802992793531760152', |
|---|
| 27 | q => '1096416736263180470838402356096058638299098593011', |
|---|
| 28 | pub_key => '10172504425160158571454141863297493878195176114077274329624884017831109225358009830193460871698707783589128269392033962133593624636454152482919340057145639' |
|---|
| 29 | }; |
|---|
| 30 | |
|---|
| 31 | is(perl_sha1_digest_hex("abc"), |
|---|
| 32 | 'a9993e364706816aba3e25717850c26c9cd0d89d', |
|---|
| 33 | 'perl_sha1_digest_hex(abc)' |
|---|
| 34 | ); |
|---|
| 35 | is(perl_sha1_digest_hex('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'), |
|---|
| 36 | '84983e441c3bd26ebaae4aa1f95129e5e54670f1', |
|---|
| 37 | 'perl_sha1_digest_hex(abcd...)' |
|---|
| 38 | ); |
|---|
| 39 | is(perl_sha1_digest_hex("This is a ::long string:\"\nincluding some f^nk3 ch\rcts\]\n"), |
|---|
| 40 | 'a691f6e0777123f70fb8613b0cbd98c0d62dce6b', |
|---|
| 41 | 'perl_sha1_digest_hex(This is a ::long string...}' |
|---|
| 42 | ); |
|---|
| 43 | is(perl_sha1_digest_hex(''), |
|---|
| 44 | 'da39a3ee5e6b4b0d3255bfef95601890afd80709', |
|---|
| 45 | 'perl_sha1_digest_hex()' |
|---|
| 46 | ); |
|---|
| 47 | |
|---|
| 48 | ok(dsa_verify(Message => $msg, Signature => $sig, Key => $dsa_key), |
|---|
| 49 | 'dsa_verify()' |
|---|
| 50 | ); |
|---|
| 51 | |
|---|
| 52 | if ($@) { |
|---|
| 53 | skip(1, "ERROR: $@"); |
|---|
| 54 | } else { |
|---|
| 55 | ok(dsa_verify( |
|---|
| 56 | Message => $msg, |
|---|
| 57 | Signature => bless($sig, 'Crypt::DSA::Signature'), |
|---|
| 58 | Key => bless($dsa_key, 'Crypt::DSA::Key') |
|---|
| 59 | ), |
|---|
| 60 | 'blessed dsa_verify()' |
|---|
| 61 | ); |
|---|
| 62 | } |
|---|
| 63 | |
|---|
| 64 | $dsa_key->{g} = 1; |
|---|
| 65 | |
|---|
| 66 | ok(!dsa_verify( |
|---|
| 67 | Message => $msg, |
|---|
| 68 | Signature => bless($sig,'Crypt::DSA::Signature'), |
|---|
| 69 | Key => bless($dsa_key, 'Crypt::DSA::Key') |
|---|
| 70 | ), |
|---|
| 71 | 'not(dsa_verify)' |
|---|
| 72 | ); |
|---|
| 73 | |
|---|
| 74 | # my $dsa_key = bless( { |
|---|
| 75 | # 'p' => '11671236708387678327224206536086899180337891539414163231548040398520841845883184000627860280911468857014406210406182985401875818712804278750455023001090753', |
|---|
| 76 | # 'g' => '8390523802553664927497849579280285206671739131891639945934584937465879937204060160958306281843225586442674344146773393578506632957361175802992793531760152', |
|---|
| 77 | # 'q' => '1096416736263180470838402356096058638299098593011', |
|---|
| 78 | # 'pub_key' => '10172504425160158571454141863297493878195176114077274329624884017831109225358009830193460871698707783589128269392033962133593624636454152482919340057145639' |
|---|
| 79 | # }, 'Crypt::DSA::Key' ); |
|---|
| 80 | |
|---|
| 81 | # print dsa_verify(Message => 'nina@blues.org::Nina Simone::1072137320', |
|---|
| 82 | # Key => $dsa_key, |
|---|
| 83 | # Signature => new Crypt::DSA::Signature( |
|---|
| 84 | # r => "179524654873292192810669641349818294463683984472", |
|---|
| 85 | # s => "32636895355904099107265678275162258563954033951")) |
|---|
| 86 | # ? "verified\n" : "incorrect\n"; |
|---|
| 87 | |
|---|
| 88 | # use Math::Pari qw( PARI ); |
|---|
| 89 | # use Crypt::DSA::Util qw( bitsize bin2mp mod_inverse mod_exp ); |
|---|
| 90 | # sub verify { |
|---|
| 91 | # my %param = @_; |
|---|
| 92 | # my($key, $dgst, $sig); |
|---|
| 93 | # #croak __PACKAGE__, "->verify: Need a Key" unless |
|---|
| 94 | # $key = $param{Key}; |
|---|
| 95 | # unless ($dgst = $param{Digest}) { |
|---|
| 96 | # # croak __PACKAGE__, "->verify: Need either Message or Digest" |
|---|
| 97 | # # unless $param{Message}; |
|---|
| 98 | # $dgst = sha1($param{Message}); |
|---|
| 99 | # } |
|---|
| 100 | # #croak __PACKAGE__, "->verify: Need a Signature" |
|---|
| 101 | # # unless |
|---|
| 102 | # $sig = $param{Signature}; |
|---|
| 103 | # my $u2 = mod_inverse($sig->s, $key->q); |
|---|
| 104 | # #print "u2 = $u2\n"; |
|---|
| 105 | # my $u1 = bin2mp($dgst); |
|---|
| 106 | # $u1 = ($u1 * $u2) % $key->q; |
|---|
| 107 | |
|---|
| 108 | # $u2 = ($sig->r * $u2) % $key->q; |
|---|
| 109 | # my $t1 = mod_exp($key->g, $u1, $key->p); |
|---|
| 110 | # my $t2 = mod_exp($key->pub_key, $u2, $key->p); |
|---|
| 111 | # print "pub_key = " . $key->pub_key . "\n"; |
|---|
| 112 | # print "u2 = " . $u2 . "\n"; |
|---|
| 113 | # print "p = " . $key->p . "\n"; |
|---|
| 114 | # print "t2 = $t2\n"; |
|---|
| 115 | # $u1 = ($t1 * $t2) % $key->p; |
|---|
| 116 | # $u1 %= $key->q; |
|---|
| 117 | # $u1 == $sig->r; |
|---|
| 118 | # } |
|---|
| 119 | |
|---|
| 120 | # print verify(Message => 'nina@blues.org::Nina Simone::1072137320', |
|---|
| 121 | # Key => $dsa_key, |
|---|
| 122 | # Signature => new Crypt::DSA::Signature( |
|---|
| 123 | # r => "179524654873292192810669641349818294463683984472", |
|---|
| 124 | # s => "32636895355904099107265678275162258563954033951")) |
|---|
| 125 | # ? "verified\n" : "incorrect\n"; |
|---|
| 126 | |
|---|
| 127 | SKIP: { |
|---|
| 128 | my $package = 'Math::Pari'; |
|---|
| 129 | eval { require $package }; |
|---|
| 130 | skip("$package not installed", 1); |
|---|
| 131 | |
|---|
| 132 | sub mp2bin { |
|---|
| 133 | my($p) = @_; |
|---|
| 134 | $p = PARI($p); |
|---|
| 135 | my $base = PARI(1) << PARI(4*8); |
|---|
| 136 | my $res = ''; |
|---|
| 137 | while ($p != 0) { |
|---|
| 138 | my $r = $p % $base; |
|---|
| 139 | $p = ($p-$r) / $base; |
|---|
| 140 | my $buf = pack 'N', $r; |
|---|
| 141 | if ($p == 0) { |
|---|
| 142 | $buf = $r >= 16777216 ? $buf : |
|---|
| 143 | $r >= 65536 ? substr($buf, -3, 3) : |
|---|
| 144 | $r >= 256 ? substr($buf, -2, 2) : |
|---|
| 145 | substr($buf, -1, 1); |
|---|
| 146 | } |
|---|
| 147 | $res = $buf . $res; |
|---|
| 148 | } |
|---|
| 149 | $res; |
|---|
| 150 | } |
|---|
| 151 | |
|---|
| 152 | my $test = "45625656646468483212118818097681354668381384573545315"; |
|---|
| 153 | is(dec2bin($test), mp2bin($test), 'dec2bin'); |
|---|
| 154 | } |
|---|