File Coverage

blib/lib/Crypt/OpenPGP/Key/Secret/ElGamal.pm
Criterion Covered Total %
statement 49 49 100.0
branch 2 2 100.0
condition 1 3 33.3
subroutine 17 17 100.0
pod 0 3 0.0
total 69 74 93.2


line stmt bran cond sub pod time code
1             package Crypt::OpenPGP::Key::Secret::ElGamal;
2 4     4   59 use strict;
  4         10  
  4         297  
3 4     4   21 use warnings;
  4         8  
  4         396  
4              
5             our $VERSION = '1.19'; # VERSION
6              
7 4     4   1372 use Crypt::OpenPGP::Key::Public::ElGamal;
  4         11  
  4         134  
8 4     4   21 use Crypt::OpenPGP::Key::Secret;
  4         9  
  4         125  
9 4     4   20 use Crypt::OpenPGP::ErrorHandler;
  4         8  
  4         102  
10 4     4   20 use base qw( Crypt::OpenPGP::Key::Secret Crypt::OpenPGP::ErrorHandler );
  4         7  
  4         1421  
11              
12 24     24 0 94 sub secret_props { qw( x ) }
13             *public_props = \&Crypt::OpenPGP::Key::Public::ElGamal::public_props;
14             *crypt_props = \&Crypt::OpenPGP::Key::Public::ElGamal::crypt_props;
15             *size = \&Crypt::OpenPGP::Key::Public::ElGamal::size;
16             *keygen = \&Crypt::OpenPGP::Key::Public::ElGamal::keygen;
17             *can_encrypt = \&Crypt::OpenPGP::Key::Public::ElGamal::can_encrypt;
18              
19             sub init {
20 19     19 0 53 my $key = shift;
21 19   33     183 $key->{key_data} = shift || Crypt::OpenPGP::ElGamal::Private->new;
22 19         156 $key;
23             }
24              
25 13     13 0 108 sub decrypt { $_[0]->{key_data}->decrypt(@_[1..$#_]) }
26              
27             package Crypt::OpenPGP::ElGamal::Private;
28 4     4   31 use strict;
  4         10  
  4         150  
29 4     4   25 use warnings;
  4         9  
  4         239  
30              
31 4     4   26 use Crypt::OpenPGP::Util qw( mod_exp mod_inverse );
  4         11  
  4         301  
32 4     4   23 use Math::BigInt;
  4         8  
  4         29  
33              
34 19     19   137 sub new { bless {}, $_[0] }
35              
36             sub decrypt {
37 13     13   28 my $key = shift;
38 13         34 my($C) = @_;
39 13         48 my $p = $key->p;
40 13         57 my $t1 = mod_exp($C->{a}, $key->x, $p);
41 13         59727180 $t1 = mod_inverse($t1, $p);
42 13         4095309 my $n = Math::BigInt->new($C->{b} * $t1);
43 13         90366 $n->bmod($p);
44 13         140234 return $n;
45             }
46              
47             sub _getset {
48 16     16   56 my $e = shift;
49             sub {
50 91     91   205 my $key = shift;
51 91 100       426 $key->{$e} = shift if @_;
52 91         535 $key->{$e};
53             }
54 16         77 }
55              
56             *p = _getset('p');
57             *g = _getset('g');
58             *y = _getset('y');
59             *x = _getset('x');
60              
61             1;