root/branches/boomer/t/12-dsa.t @ 1100

Revision 1100, 5.2 kB (checked in by hachi, 2 years ago)

Merging release-20 to boomer branch: svn merge -r62323:63659 http://svn.sixapart.com/repos/eng/movabletype/branches/release-20 .

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