File Coverage

blib/lib/Crypt/DSA/Signature.pm
Criterion Covered Total %
statement 48 52 92.3
branch 12 20 60.0
condition 1 2 50.0
subroutine 10 10 100.0
pod 2 4 50.0
total 73 88 82.9


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