File Coverage

blib/lib/Crypt/OpenPGP/Key/Public/RSA.pm
Criterion Covered Total %
statement 52 63 82.5
branch 3 6 50.0
condition 4 6 66.6
subroutine 14 20 70.0
pod 5 13 38.4
total 78 108 72.2


line stmt bran cond sub pod time code
1             package Crypt::OpenPGP::Key::Public::RSA;
2 8     8   56 use strict;
  8         23  
  8         539  
3              
4             our $VERSION = '1.19'; # VERSION
5              
6 8     8   5337 use Crypt::RSA::Key::Public;
  8         96271  
  8         382  
7 8     8   65 use Crypt::OpenPGP::Digest;
  8         19  
  8         265  
8 8     8   41 use Crypt::OpenPGP::Util qw( bitsize bin2mp mp2bin );
  8         18  
  8         626  
9 8     8   52 use Crypt::OpenPGP::Key::Public;
  8         16  
  8         267  
10 8     8   57 use Crypt::OpenPGP::ErrorHandler;
  8         19  
  8         225  
11 8     8   54 use base qw( Crypt::OpenPGP::Key::Public Crypt::OpenPGP::ErrorHandler );
  8         18  
  8         7657  
12              
13 0     0 1 0 sub can_encrypt { 1 }
14 0     0 1 0 sub can_sign { 1 }
15 0     0 0 0 sub abbrev { 'R' }
16              
17 77     77 0 363 sub public_props { qw( n e ) }
18 0     0 0 0 sub crypt_props { qw( c ) }
19 27     27 0 89 sub sig_props { qw( c ) }
20              
21             sub init {
22 45     45 0 107 my $key = shift;
23 45   66     511 $key->{key_data} = shift || Crypt::RSA::Key::Public->new;
24 45         1150 $key;
25             }
26              
27             sub keygen {
28 2     2 1 3 my $class = shift;
29 2         15 my %param = @_;
30 2         4 $param{Password} = $param{Passphrase};
31 2         607 require Crypt::RSA::Key;
32 2         39038 my $chain = Crypt::RSA::Key->new;
33 2         130 my($pub, $sec) = $chain->generate( %param );
34 2 100 66     45879700 return $class->error( $chain->errstr ) unless $pub && $sec;
35 1         41 ($pub, $sec);
36             }
37              
38 5     5 1 101 sub size { bitsize($_[0]->{key_data}->n) }
39              
40 0     0 1 0 sub check { $_[0]->{key_data}->check }
41              
42             sub encrypt {
43 0     0 0 0 my $key = shift;
44 0         0 my($M) = @_;
45 0         0 require Crypt::RSA::Primitives;
46 0         0 my $prim = Crypt::RSA::Primitives->new;
47 0 0       0 my $c = $prim->core_encrypt( Key => $key->{key_data}, Plaintext => $M ) or
48             return $key->error($prim->errstr);
49 0         0 { c => $c }
50             }
51              
52             sub verify {
53 2     2 0 8 my $key = shift;
54 2         8 my($sig, $dgst) = @_;
55 2         28 my $k = $key->bytesize;
56 2         15256 require Crypt::RSA::Primitives;
57 2         3118 my $prim = Crypt::RSA::Primitives->new;
58 2         18 my $c = $sig->{c};
59 2 50       14 my $m = $prim->core_verify( Key => $key->{key_data}, Signature => $c) or
60             return;
61 2         720034 $m = mp2bin($m, $k - 1);
62 2         46 my $hash_alg = Crypt::OpenPGP::Digest->alg($sig->{hash_alg});
63 2         13 my $M = encode($dgst, $hash_alg, $k - 1);
64 2         333 $m eq $M;
65             }
66              
67             {
68             my %ENCODING = (
69             MD2 => pack('H*', '3020300C06082A864886F70D020205000410'),
70             MD5 => pack('H*', '3020300C06082A864886F70D020505000410'),
71             SHA1 => pack('H*', '3021300906052B0E03021A05000414'),
72             SHA256 => pack('H*', '3031300d060960864801650304020105000420'),
73             SHA224 => pack('H*', '302d300d06096086480165030402040500041c'),
74             SHA384 => pack('H*', '3041300d060960864801650304020205000430'),
75             SHA512 => pack('H*', '3051300d060960864801650304020305000440'),
76             RIPEMD160 => pack('H*', '3021300906052b2403020105000414'),
77             );
78              
79             sub encode {
80 3     3 0 5542 my($dgst, $hash_alg, $mlen) = @_;
81 3         33 my $alg = $ENCODING{$hash_alg};
82 3         10 my $m = $alg . $dgst;
83 3         15 my $padlen = $mlen - length($m) - 2;
84 3         2771 my $pad = chr(255) x $padlen;
85 3         162 chr(1) . $pad . chr(0) . $m;
86             }
87             }
88              
89             1;