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 5     5   34 use strict;
  5         11  
  5         192  
4 5     5   25 use warnings;
  5         9  
  5         315  
5 5     5   30 use Math::BigInt 1.78 try => 'GMP, Pari';
  5         102  
  5         36  
6 5     5   731 use Carp qw( croak );
  5         11  
  5         327  
7 5     5   2742 use Crypt::DSA::Util qw( bitsize );
  5         18  
  5         466  
8              
9             our $VERSION = '1.20'; #VERSION
10              
11 5     5   55 use vars qw{$VERSION};
  5         11  
  5         989  
12              
13             sub new {
14 5     5 1 704 my $class = shift;
15 5         32 my %param = @_;
16 5         36 my $key = bless { }, $class;
17              
18 5 100 100     84 if ($param{Filename} || $param{Content}) {
19 4 50 66     40 if ($param{Filename} && $param{Content}) {
20 0         0 croak "Filename and Content are mutually exclusive.";
21             }
22 4         34 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 5     5   34 no strict 'refs';
  5         9  
  5         1962  
31 5     5   26 for my $meth (qw( p q g pub_key priv_key r kinv )) {
32             *$meth = sub {
33 106     106   9686 my($key, $value) = @_;
34 106 50 66     801 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         102 $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         6 delete $key->{$meth};
49             }
50 106   100     2582 my $ret = $key->{$meth} || "";
51 106 100       1034 $ret = Math::BigInt->new("$ret") if $ret =~ /^\d+$/;
52 106         15005 $ret;
53 35         3059 };
54             }
55             }
56              
57             sub read {
58 4     4 0 18 my $key = shift;
59 4         16 my %param = @_;
60 4 50       14 my $type = $param{Type} or croak "read: Need a key file 'Type'";
61 4         13 my $class = join '::', __PACKAGE__, $type;
62 4     2   411 eval "use $class;";
  2     1   717  
  2     1   16  
  2         47  
  1         7  
  1         2  
  1         38  
  1         12  
  1         3  
  1         26  
63 4 50       27 croak "Invalid key file type '$type': $@" if $@;
64 4         10 bless $key, $class;
65 4         20 local *FH;
66 4 100       16 if (my $fname = delete $param{Filename}) {
67 3 50       122 open FH, '<', $fname or return;
68 3         8 my $blob = do { local $/; };
  3         26  
  3         97  
69 3         29 close FH;
70 3         11 $param{Content} = $blob;
71             }
72 4         24 $key->deserialize(%param);
73             }
74              
75             sub write {
76 3     3 1 9 my $key = shift;
77 3         74 my %param = @_;
78 3         20 my $type;
79 3 50       15 unless ($type = $param{Type}) {
80 0         0 my $pkg = __PACKAGE__;
81 0         0 ($type) = ref($key) =~ /^${pkg}::(\w+)$/;
82             }
83 3 50       18 croak "write: Need a key file 'Type'" unless $type;
84 3         11 my $class = join '::', __PACKAGE__, $type;
85 3     1   377 eval "use $class;";
  1     1   3280  
  1     1   3  
  1         18  
  1         11  
  1         4  
  1         24  
  1         10  
  1         3  
  1         22  
86 3 50       23 croak "Invalid key file type '$type': $@" if $@;
87 3         10 bless $key, $class;
88 3         21 my $blob = $key->serialize(%param);
89 3 50       34 if (my $fname = delete $param{Filename}) {
90 3         20 local *FH;
91 3 50       522 open FH, '>', $fname or croak "Can't open $fname: $!";
92 3         68 print FH $blob;
93 3         458 close FH;
94             }
95 3         67 $blob;
96             }
97              
98             1;
99             __END__