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 6     6   32 use strict;
  6         11  
  6         172  
4 6     6   21 use warnings;
  6         6  
  6         292  
5 6     6   46 use Carp qw( croak );
  6         39  
  6         355  
6              
7             our $VERSION = '1.21'; #VERSION
8             #
9 6     6   23 use vars qw{$VERSION};
  6         9  
  6         680  
10              
11             sub new {
12 6     6 1 721 my $class = shift;
13 6         43 my %param = @_;
14 6         13 my $sig = bless { }, $class;
15 6 100       21 if ($param{Content}) {
16 3         17 return $sig->deserialize(%param);
17             }
18 3         21 $sig;
19             }
20              
21             BEGIN {
22 6     6   27 no strict 'refs';
  6         7  
  6         1317  
23 6     6   20 for my $meth (qw( r s )) {
24             *$meth = sub {
25 27     27   1020 my($key, $value) = @_;
26 27 50       95 if (ref $value eq 'Math::Pari') {
    100          
    50          
27 0         0 $key->{$meth} = Math::Pari::pari2pv($value);
28             }
29             elsif (ref $value) {
30 12         25 $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 27   50     492 my $ret = $key->{$meth} || "";
41 27 50       148 $ret = Math::BigInt->new("$ret") if $ret =~ /^\d+$/;
42 27         2016 $ret;
43 12         1599 };
44             }
45             }
46              
47             sub asn {
48 4     4 0 96 require Convert::ASN1;
49 4         159 my $asn = Convert::ASN1->new;
50 4 50       379 $asn->prepare('SEQUENCE { r INTEGER, s INTEGER }') or croak $asn->{error};
51 4         7385 $asn;
52             }
53              
54             sub deserialize {
55 3     3 0 6 my $sig = shift;
56 3         8 my %param = @_;
57 3         10 my $asn = __PACKAGE__->asn;
58 3         14 my $ref;
59 3         30 require MIME::Base64;
60             ## Turn off warnings, because we're attempting to base64-decode content
61             ## that may not be base64-encoded.
62 3         41 local $^W = 0;
63 3         36 for ($param{Content}, MIME::Base64::decode_base64($param{Content})) {
64 4         23 my $out = $asn->decode($_);
65 4 100       30860 $ref = $out, last if $out;
66             }
67 3 50       9 croak "Invalid Content" unless $ref;
68 3         11 $sig->s($ref->{s});
69 3         8 $sig->r($ref->{r});
70 3         35 $sig;
71             }
72              
73             sub serialize {
74 1     1 1 3058 my $sig = shift;
75 1         67 my %param = @_;
76 1         16 my $asn = __PACKAGE__->asn;
77             my $buf = $asn->encode({ s => $sig->s, r => $sig->r })
78 1 50       4 or croak $asn->{error};
79 1         22163 $buf;
80             }
81              
82             1;
83             __END__