File Coverage

blib/lib/Crypt/DSA/Key.pm
Criterion Covered Total %
statement 87 95 91.5
branch 21 34 61.7
condition 9 11 81.8
subroutine 18 19 94.7
pod 3 4 75.0
total 138 163 84.6


line stmt bran cond sub pod time code
1             package Crypt::DSA::Key;
2              
3 6     6   30 use strict;
  6         9  
  6         166  
4 6     6   18 use warnings;
  6         7  
  6         255  
5 6     6   21 use Math::BigInt 1.78 try => 'GMP, Pari';
  6         115  
  6         37  
6 6     6   531 use Carp qw( croak );
  6         7  
  6         209  
7 6     6   2192 use Crypt::DSA::Util qw( bitsize );
  6         15  
  6         444  
8              
9             our $VERSION = '1.21'; #VERSION
10              
11 6     6   32 use vars qw{$VERSION};
  6         8  
  6         896  
12              
13             sub new {
14 6     6 1 449 my $class = shift;
15 6         47 my %param = @_;
16 6         38 my $key = bless { }, $class;
17              
18 6 100 100     78 if ($param{Filename} || $param{Content}) {
19 4 50 66     25 if ($param{Filename} && $param{Content}) {
20 0         0 croak "Filename and Content are mutually exclusive.";
21             }
22 4         36 return $key->read(%param);
23             }
24 2         16 $key;
25             }
26              
27 0     0 1 0 sub size { bitsize($_[0]->p) }
28              
29             BEGIN {
30 6     6   29 no strict 'refs';
  6         5  
  6         1677  
31 6     6   24 for my $meth (qw( p q g pub_key priv_key r kinv )) {
32             *$meth = sub {
33 151     151   30244 my($key, $value) = @_;
34 151 50 66     672 if (ref $value eq 'Math::Pari') {
    100          
    50          
    100          
35 0         0 $key->{$meth} = Math::Pari::pari2pv($value);
36             }
37             elsif (ref $value) {
38 34         76 $key->{$meth} = "$value";
39             }
40             elsif ($value) {
41 0 0       0 if ($value =~ /^0x/) {
42 0         0 $key->{$meth} = Math::BigInt->new($value)->bstr;
43             }
44             else {
45 0         0 $key->{$meth} = $value;
46             }
47             } elsif (@_ > 1 && !defined $value) {
48 1         2 delete $key->{$meth};
49             }
50 151   100     2107 my $ret = $key->{$meth} || "";
51 151 100       959 $ret = Math::BigInt->new("$ret") if $ret =~ /^\d+$/;
52 151         15121 $ret;
53 42         2414 };
54             }
55             }
56              
57             sub read {
58 4     4 0 4 my $key = shift;
59 4         20 my %param = @_;
60 4 50       19 my $type = $param{Type} or croak "read: Need a key file 'Type'";
61 4         13 my $class = join '::', __PACKAGE__, $type;
62 4     2   402 eval "use $class;";
  2     1   593  
  2     1   9  
  2         43  
  1         9  
  1         14  
  1         23  
  1         26  
  1         1  
  1         19  
63 4 50       13 croak "Invalid key file type '$type': $@" if $@;
64 4         16 bless $key, $class;
65 4         10 local *FH;
66 4 100       15 if (my $fname = delete $param{Filename}) {
67 3 50       126 open FH, '<', $fname or return;
68 3         6 my $blob = do { local $/; };
  3         27  
  3         135  
69 3         30 close FH;
70 3         10 $param{Content} = $blob;
71             }
72 4         21 $key->deserialize(%param);
73             }
74              
75             sub write {
76 3     3 1 8 my $key = shift;
77 3         43 my %param = @_;
78 3         11 my $type;
79 3 50       12 unless ($type = $param{Type}) {
80 0         0 my $pkg = __PACKAGE__;
81 0         0 ($type) = ref($key) =~ /^${pkg}::(\w+)$/;
82             }
83 3 50       9 croak "write: Need a key file 'Type'" unless $type;
84 3         9 my $class = join '::', __PACKAGE__, $type;
85 3     1   358 eval "use $class;";
  1     1   3383  
  1     1   2  
  1         18  
  1         10  
  1         4  
  1         37  
  1         16  
  1         2  
  1         15  
86 3 50       19 croak "Invalid key file type '$type': $@" if $@;
87 3         6 bless $key, $class;
88 3         16 my $blob = $key->serialize(%param);
89 3 50       22 if (my $fname = delete $param{Filename}) {
90 3         18 local *FH;
91 3 50       768 open FH, '>', $fname or croak "Can't open $fname: $!";
92 3         74 print FH $blob;
93 3         675 close FH;
94             }
95 3         79 $blob;
96             }
97              
98             1;
99             __END__