root/branches/release-40/t/12-dsa.t @ 2562

Revision 2562, 5.2 kB (checked in by bchoate, 18 months ago)

Test suite cleanup. Use MT::Test to force t/ based configuration file for all tests. Fixed several tests that had incorrect expected values.

  • Property svn:mime-type set to text/plain
  • Property svn:keywords set to Author Date Id Revision
Line 
1#!/usr/bin/perl
2# $Id$
3use strict;
4use warnings;
5
6use lib 't/lib';
7use lib 'lib';
8use lib 'extlib';
9
10use Test::More tests => 8;
11
12use MT;
13use MT::Test;
14use MT::Builder;
15use MT::Util qw(dsa_verify perl_sha1_digest_hex dec2bin);
16
17use lib 't';
18
19my $msg = 'nina@blues.org::Nina Simone::1072216494';
20my $sig = {
21    r => "527791435593304577725339030118988880225606145248",
22    s => "856186764515774026930421996711007369328400857333",
23};
24my $dsa_key = {
25    p => '11671236708387678327224206536086899180337891539414163231548040398520841845883184000627860280911468857014406210406182985401875818712804278750455023001090753',
26    g => '8390523802553664927497849579280285206671739131891639945934584937465879937204060160958306281843225586442674344146773393578506632957361175802992793531760152',
27    q => '1096416736263180470838402356096058638299098593011',
28    pub_key => '10172504425160158571454141863297493878195176114077274329624884017831109225358009830193460871698707783589128269392033962133593624636454152482919340057145639'
29};
30
31is(perl_sha1_digest_hex("abc"),
32    'a9993e364706816aba3e25717850c26c9cd0d89d',
33    'perl_sha1_digest_hex(abc)'
34);
35is(perl_sha1_digest_hex('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'),
36    '84983e441c3bd26ebaae4aa1f95129e5e54670f1',
37    'perl_sha1_digest_hex(abcd...)'
38);
39is(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);
43is(perl_sha1_digest_hex(''),
44    'da39a3ee5e6b4b0d3255bfef95601890afd80709',
45    'perl_sha1_digest_hex()'
46);
47
48ok(dsa_verify(Message => $msg, Signature => $sig, Key => $dsa_key),
49    'dsa_verify()'
50);
51
52if ($@) {
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
66ok(!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
127SKIP: {
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}
Note: See TracBrowser for help on using the browser.