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   34 use strict;
  7         11  
  7         220  
4 7     7   23 use warnings;
  7         10  
  7         272  
5 7     7   23 use Math::BigInt 1.78 try => 'GMP, Pari';
  7         107  
  7         40  
6 7     7   601 use Carp qw( croak );
  7         12  
  7         338  
7 7     7   2510 use Crypt::DSA::Util qw( bitsize );
  7         16  
  7         463  
8              
9             our $VERSION = '1.23'; #VERSION
10              
11 7     7   36 use vars qw{$VERSION};
  7         11  
  7         876  
12              
13             sub new {
14 5     5 1 482 my $class = shift;
15 5         23 my %param = @_;
16 5         15 my $key = bless { }, $class;
17              
18 5 100 100     43 if ($param{Filename} || $param{Content}) {
19 4 50 66     45 if ($param{Filename} && $param{Content}) {
20 0         0 croak "Filename and Content are mutually exclusive.";
21             }
22 4         19 return $key->read(%param);
23             }
24 1         4 $key;
25             }
26              
27 0     0 1 0 sub size { bitsize($_[0]->p) }
28              
29             BEGIN {
30 7     7   61 no strict 'refs';
  7         45  
  7         1894  
31 7     7   40 for my $meth (qw( p q g pub_key priv_key r kinv )) {
32             *$meth = sub {
33 101     101   4957 my($key, $value) = @_;
34 101 50 66     492 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         53 $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         4 delete $key->{$meth};
49             }
50 101   100     1432 my $ret = $key->{$meth} || "";
51 101 100       602 $ret = Math::BigInt->new("$ret") if $ret =~ /^\d+$/;
52 101         8265 $ret;
53 49         2813 };
54             }
55             }
56              
57             sub read {
58 4     4 0 8 my $key = shift;
59 4         10 my %param = @_;
60 4 50       13 my $type = $param{Type} or croak "read: Need a key file 'Type'";
61 4         11 my $class = join '::', __PACKAGE__, $type;
62 4     2   395 eval "use $class;";
  2     1   497  
  2     1   5  
  2         38  
  1         8  
  1         1  
  1         16  
  1         12  
  1         2  
  1         27  
63 4 50       13 croak "Invalid key file type '$type': $@" if $@;
64 4         7 bless $key, $class;
65 4         8 local *FH;
66 4 100       13 if (my $fname = delete $param{Filename}) {
67 3 50       131 open FH, '<', $fname or return;
68 3         7 my $blob = do { local $/; };
  3         20  
  3         122  
69 3         25 close FH;
70 3         10 $param{Content} = $blob;
71             }
72 4         21 $key->deserialize(%param);
73             }
74              
75             sub write {
76 3     3 1 15 my $key = shift;
77 3         36 my %param = @_;
78 3         8 my $type;
79 3 50       10 unless ($type = $param{Type}) {
80 0         0 my $pkg = __PACKAGE__;
81 0         0 ($type) = ref($key) =~ /^${pkg}::(\w+)$/;
82             }
83 3 50       7 croak "write: Need a key file 'Type'" unless $type;
84 3         8 my $class = join '::', __PACKAGE__, $type;
85 3     1   239 eval "use $class;";
  1     1   1060  
  1     1   3  
  1         48  
  1         7  
  1         2  
  1         14  
  1         7  
  1         14  
  1         16  
86 3 50       10 croak "Invalid key file type '$type': $@" if $@;
87 3         7 bless $key, $class;
88 3         12 my $blob = $key->serialize(%param);
89 3 50       16 if (my $fname = delete $param{Filename}) {
90 3         21 local *FH;
91 3 50       770 open FH, '>', $fname or croak "Can't open $fname: $!";
92 3         68 print FH $blob;
93 3         455 close FH;
94             }
95 3         83 $blob;
96             }
97              
98             1;
99             __END__