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