File Coverage

blib/lib/Crypt/DSA/Signature.pm
Criterion Covered Total %
statement 51 55 92.7
branch 12 20 60.0
condition 1 2 50.0
subroutine 11 11 100.0
pod 2 4 50.0
total 77 92 83.7


line stmt bran cond sub pod time code
1             package Crypt::DSA::Signature;
2              
3 7     7   38 use strict;
  7         8  
  7         186  
4 7     7   31 use warnings;
  7         9  
  7         301  
5 7     7   23 use Carp qw( croak );
  7         7  
  7         449  
6              
7             our $VERSION = '1.23'; #VERSION
8             #
9 7     7   28 use vars qw{$VERSION};
  7         8  
  7         744  
10              
11             sub new {
12 4     4 1 692 my $class = shift;
13 4         16 my %param = @_;
14 4         9 my $sig = bless { }, $class;
15 4 100       13 if ($param{Content}) {
16 3         14 return $sig->deserialize(%param);
17             }
18 1         2 $sig;
19             }
20              
21             BEGIN {
22 7     7   29 no strict 'refs';
  7         9  
  7         1432  
23 7     7   25 for my $meth (qw( r s )) {
24             *$meth = sub {
25 19     19   585 my($key, $value) = @_;
26 19 50       58 if (ref $value eq 'Math::Pari') {
    100          
    50          
27 0         0 $key->{$meth} = Math::Pari::pari2pv($value);
28             }
29             elsif (ref $value) {
30 8         18 $key->{$meth} = "$value";
31             }
32             elsif ($value) {
33 0 0       0 if ($value =~ /^0x/) {
34 0         0 $key->{$meth} = Math::BigInt->new($value)->bstr;
35             }
36             else {
37 0         0 $key->{$meth} = $value;
38             }
39             }
40 19   50     316 my $ret = $key->{$meth} || "";
41 19 50       121 $ret = Math::BigInt->new("$ret") if $ret =~ /^\d+$/;
42 19         1412 $ret;
43 14         1845 };
44             }
45             }
46              
47             sub asn {
48 4     4 0 67 require Convert::ASN1;
49 4         42 my $asn = Convert::ASN1->new;
50 4 50       182 $asn->prepare('SEQUENCE { r INTEGER, s INTEGER }') or croak $asn->{error};
51 4         4288 $asn;
52             }
53              
54             sub deserialize {
55 3     3 0 5 my $sig = shift;
56 3         6 my %param = @_;
57 3         9 my $asn = __PACKAGE__->asn;
58 3         4 my $ref;
59 3         26 require MIME::Base64;
60             ## Turn off warnings, because we're attempting to base64-decode content
61             ## that may not be base64-encoded.
62 3         26 local $^W = 0;
63 3         23 for ($param{Content}, MIME::Base64::decode_base64($param{Content})) {
64 4         11 my $out = $asn->decode($_);
65 4 100       30421 $ref = $out, last if $out;
66             }
67 3 50       16 croak "Invalid Content" unless $ref;
68 3         11 $sig->s($ref->{s});
69 3         9 $sig->r($ref->{r});
70 3         30 $sig;
71             }
72              
73             sub serialize {
74 1     1 1 1322 my $sig = shift;
75 1         3 my %param = @_;
76 1         5 my $asn = __PACKAGE__->asn;
77             my $buf = $asn->encode({ s => $sig->s, r => $sig->r })
78 1 50       3 or croak $asn->{error};
79 1         21280 $buf;
80             }
81              
82             1;
83             __END__