File Coverage

blib/lib/Crypt/DSA/Key.pm
Criterion Covered Total %
statement 84 92 91.3
branch 21 34 61.7
condition 9 11 81.8
subroutine 17 18 94.4
pod 3 4 75.0
total 134 159 84.2


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