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 7     7   44 use strict;
  7         11  
  7         231  
4 7     7   22 use warnings;
  7         10  
  7         365  
5 7     7   28 use Math::BigInt 1.78 try => 'GMP, Pari';
  7         109  
  7         40  
6 7     7   706 use Carp qw( croak );
  7         9  
  7         324  
7 7     7   2805 use Crypt::DSA::Util qw( bitsize );
  7         18  
  7         491  
8              
9             our $VERSION = '1.24'; #VERSION
10              
11 7     7   37 use vars qw{$VERSION};
  7         8  
  7         911  
12              
13             sub new {
14 5     5 1 580 my $class = shift;
15 5         43 my %param = @_;
16 5         18 my $key = bless { }, $class;
17              
18 5 100 100     58 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         38 return $key->read(%param);
23             }
24 1         6 $key;
25             }
26              
27 0     0 1 0 sub size { bitsize($_[0]->p) }
28              
29             BEGIN {
30 7     7   39 no strict 'refs';
  7         9  
  7         1868  
31 7     7   28 for my $meth (qw( p q g pub_key priv_key r kinv )) {
32             *$meth = sub {
33 101     101   5056 my($key, $value) = @_;
34 101 50 66     468 if (ref $value eq 'Math::Pari') {
    100          
    50          
    100          
35 0         0 $key->{$meth} = Math::Pari::pari2pv($value);
36             }
37             elsif (ref $value) {
38 25         58 $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         18 delete $key->{$meth};
49             }
50 101   100     1601 my $ret = $key->{$meth} || "";
51 101 100       630 $ret = Math::BigInt->new("$ret") if $ret =~ /^\d+$/;
52 101         8448 $ret;
53 49         4750 };
54             }
55             }
56              
57             sub read {
58 4     4 0 6 my $key = shift;
59 4         11 my %param = @_;
60 4 50       12 my $type = $param{Type} or croak "read: Need a key file 'Type'";
61 4         11 my $class = join '::', __PACKAGE__, $type;
62 4     2   392 eval "use $class;";
  2     1   583  
  2     1   4  
  2         50  
  1         8  
  1         1  
  1         15  
  1         16  
  1         2  
  1         17  
63 4 50       13 croak "Invalid key file type '$type': $@" if $@;
64 4         9 bless $key, $class;
65 4         20 local *FH;
66 4 100       18 if (my $fname = delete $param{Filename}) {
67 3 50       107 open FH, '<', $fname or return;
68 3         5 my $blob = do { local $/; };
  3         31  
  3         181  
69 3         40 close FH;
70 3         8 $param{Content} = $blob;
71             }
72 4         21 $key->deserialize(%param);
73             }
74              
75             sub write {
76 3     3 1 16 my $key = shift;
77 3         51 my %param = @_;
78 3         11 my $type;
79 3 50       18 unless ($type = $param{Type}) {
80 0         0 my $pkg = __PACKAGE__;
81 0         0 ($type) = ref($key) =~ /^${pkg}::(\w+)$/;
82             }
83 3 50       6 croak "write: Need a key file 'Type'" unless $type;
84 3         10 my $class = join '::', __PACKAGE__, $type;
85 3     1   260 eval "use $class;";
  1     1   2787  
  1     1   13  
  1         21  
  1         7  
  1         10  
  1         15  
  1         7  
  1         2  
  1         14  
86 3 50       21 croak "Invalid key file type '$type': $@" if $@;
87 3         7 bless $key, $class;
88 3         12 my $blob = $key->serialize(%param);
89 3 50       26 if (my $fname = delete $param{Filename}) {
90 3         23 local *FH;
91 3 50       832 open FH, '>', $fname or croak "Can't open $fname: $!";
92 3         42 print FH $blob;
93 3         372 close FH;
94             }
95 3         43 $blob;
96             }
97              
98             1;
99             __END__