File Coverage

blib/lib/Crypt/OpenPGP/Key.pm
Criterion Covered Total %
statement 192 192 100.0
branch 6 8 75.0
condition 5 9 55.5
subroutine 64 64 100.0
pod 10 12 83.3
total 277 285 97.1


line stmt bran cond sub pod time code
1             package Crypt::OpenPGP::Key;
2 18     18   2201 use strict;
  18         52  
  18         606  
3 18     18   1055 use warnings;
  18         62  
  18         2308  
4              
5             our $VERSION = '1.19'; # VERSION
6              
7 18     18   167 use Carp qw( confess );
  18         43  
  18         1395  
8 18     18   141 use Crypt::OpenPGP::ErrorHandler;
  18         41  
  18         571  
9 17     17   168 use base qw( Crypt::OpenPGP::ErrorHandler );
  17         39  
  17         9271  
10              
11             our %ALG = (
12             1 => 'RSA',
13             16 => 'ElGamal',
14             17 => 'DSA',
15             );
16             our %ALG_BY_NAME = map { $ALG{$_} => $_ } keys %ALG;
17              
18             sub new {
19 207     207 0 1594 my $class = shift;
20 207         563 my $alg = shift;
21 207   66     1333 $alg = $ALG{$alg} || $alg;
22 206         795 my $pkg = join '::', $class, $alg;
23 17     17   7353 eval "use $pkg;";
  17     16   75  
  17     15   490  
  16     15   4047  
  16     15   53  
  16     2   379  
  15     1   2678  
  14     1   40  
  14     1   351  
  15     1   2459  
  15     1   40  
  15     1   321  
  15     1   156  
  15     1   37  
  15     1   404  
  206     1   20722  
  2     1   665  
  2     1   29  
  2     1   30  
  1     1   3  
  1     1   20  
  1     1   12  
  1     1   3  
  1     1   23  
  1     1   10  
  1     1   2  
  1     1   27  
  1     1   8  
  1     1   3  
  1     1   24  
  1     1   10  
  1     1   3  
  1     1   28  
  1     1   10  
  1     1   3  
  1     1   28  
  1     1   11  
  1     1   3  
  1     1   25  
  1     1   10  
  1     1   2  
  1     1   26  
  1     1   8  
  1     1   32  
  1     1   30  
  1         10  
  1         3  
  1         25  
  1         8  
  1         3  
  1         23  
  1         11  
  1         3  
  1         26  
  1         9  
  1         3  
  1         27  
  1         11  
  1         2  
  1         28  
  1         5  
  1         2  
  1         15  
  1         10  
  1         2  
  1         28  
  1         8  
  1         2  
  1         24  
  1         9  
  1         3  
  1         21  
  1         11  
  1         2  
  1         29  
  1         7  
  1         3  
  1         22  
  1         9  
  1         3  
  1         29  
  1         11  
  1         3  
  1         27  
  1         9  
  1         3  
  1         25  
  1         9  
  1         3  
  1         24  
  1         27  
  1         2  
  1         27  
  1         7  
  1         2  
  1         16  
  1         4  
  1         2  
  1         18  
  1         7  
  1         2  
  1         15  
  1         8  
  1         3  
  1         22  
  1         10  
  1         1  
  1         36  
  1         38  
  1         3  
  1         31  
  1         7  
  1         2  
  1         18  
  1         4  
  1         2  
  1         16  
  1         5  
  1         2  
  1         18  
  1         5  
  1         2  
  1         19  
  1         5  
  1         2  
  1         16  
  1         5  
  1         17  
  1         21  
  1         9  
  1         3  
  1         54  
  1         10  
  1         2  
  1         26  
  1         9  
  1         3  
  1         55  
  1         7  
  1         6  
  1         28  
24 206 100       1144 return $class->error("Unsupported algorithm '$alg': $@") if $@;
25 205         1673 my @valid = $pkg->all_props;
26 205         662 my %valid = map { $_ => 1 } @valid;
  707         2265  
27             my $key = bless { __valid => \%valid, __alg => $alg,
28 205         1770 __alg_id => $ALG_BY_NAME{$alg} }, $pkg;
29 205         999 $key->init(@_);
30             }
31              
32             sub keygen {
33 8     8 1 929 my $class = shift;
34 8         52 my $alg = shift;
35 8   33     43 $alg = $ALG{$alg} || $alg;
36 8         306 my $pkg = join '::', __PACKAGE__, 'Public', $alg;
37 7         331 eval "use $pkg;";
38 7 50       27 return $class->error("Unsupported algorithm '$alg': $@") if $@;
39 7         133 my($pub_data, $sec_data) = $pkg->keygen(@_);
40 7 100 66     125 return $class->error("Key generation failed: " . $class->errstr)
41             unless $pub_data && $sec_data;
42 6         27 my $pub_pkg = join '::', __PACKAGE__, 'Public';
43 6         226 my $pub = $pub_pkg->new($alg, $pub_data);
44 3         11 my $sec_pkg = join '::', __PACKAGE__, 'Secret';
45 3         25 my $sec = $sec_pkg->new($alg, $sec_data);
46 3         54 ($pub, $sec);
47             }
48              
49 1     5 0 6 sub init { $_[0] }
50              
51 1     5 1 1 sub check { 1 }
52              
53 6     10 1 49 sub alg { $_[0]->{__alg} }
54 29     32 1 489 sub alg_id { $_[0]->{__alg_id} }
55              
56 1     4 1 417 sub size { 0 }
57 16     16 1 145 sub bytesize { int(($_[0]->size + 7) / 8) }
58              
59       1 1   sub public_key { }
60 1     1 1 9 sub is_secret { 0 }
61              
62 16     16 1 92 sub can_encrypt { 0 }
63 1     1 1 25 sub can_sign { 0 }
64              
65       1     sub DESTROY { }
66              
67             our $AUTOLOAD;
68             sub AUTOLOAD {
69 348     348   43574 my $key = shift;
70 348         2672 (my $meth = $AUTOLOAD) =~ s/.*:://;
71             confess "Can't call method $meth on Key $key"
72 348 50       2006 unless $key->{__valid}{$meth};
73 348         2575 $key->{key_data}->$meth(@_);
74             }
75              
76             1;
77             __END__