File Coverage

blib/lib/Crypt/OpenPGP/SKSessionKey.pm
Criterion Covered Total %
statement 62 66 93.9
branch 5 8 62.5
condition 4 9 44.4
subroutine 12 12 100.0
pod 4 5 80.0
total 87 100 87.0


line stmt bran cond sub pod time code
1             package Crypt::OpenPGP::SKSessionKey;
2 2     2   15 use strict;
  2         5  
  2         89  
3 2     2   11 use warnings;
  2         5  
  2         192  
4              
5             our $VERSION = '1.19'; # VERSION
6              
7 2     2   12 use Crypt::OpenPGP::Constants qw( DEFAULT_CIPHER );
  2         4  
  2         14  
8 2     2   10 use Crypt::OpenPGP::Buffer;
  2         4  
  2         50  
9 2     2   557 use Crypt::OpenPGP::S2k;
  2         4  
  2         46  
10 2     2   27 use Crypt::OpenPGP::ErrorHandler;
  2         3  
  2         66  
11 2     2   9 use base qw( Crypt::OpenPGP::ErrorHandler );
  2         5  
  2         1477  
12              
13             sub new {
14 23     23 1 65 my $class = shift;
15 23         67 my $key = bless { }, $class;
16 23         104 $key->init(@_);
17             }
18              
19             sub init {
20 23     23 0 45 my $key = shift;
21 23         171 my %param = @_;
22 23         106 $key->{version} = 4;
23 23 100 66     133 if ((my $sym_key = $param{SymKey}) && (my $pass = $param{Passphrase})) {
24 11   33     44 my $alg = $param{Cipher} || DEFAULT_CIPHER;
25 11         96 my $cipher = Crypt::OpenPGP::Cipher->new($alg);
26 11         43 my $keysize = $cipher->keysize;
27 11         56 $key->{s2k_ciph} = $cipher->alg_id;
28 11   33     47 $key->{s2k} = $param{S2k} || Crypt::OpenPGP::S2k->new('Salt_Iter');
29 11         30 $sym_key = substr $sym_key, 0, $keysize;
30 11         51 my $s2k_key = $key->{s2k}->generate($pass, $keysize);
31 11         103 $cipher->init($s2k_key);
32             }
33 23         273 $key;
34             }
35              
36             sub parse {
37 12     12 1 28 my $class = shift;
38 12         32 my($buf) = @_;
39 12         43 my $key = $class->new;
40 12         53 $key->{version} = $buf->get_int8;
41             return $class->error("Unsupported version ($key->{version})")
42 12 50       334 unless $key->{version} == 4;
43 12         37 $key->{s2k_ciph} = $buf->get_int8;
44 12         291 $key->{s2k} = Crypt::OpenPGP::S2k->parse($buf);
45 12 50       44 if ($buf->offset < $buf->length) {
46 0         0 $key->{encrypted} = $buf->get_bytes( $buf->length - $buf->offset );
47             }
48 12         111 $key;
49             }
50              
51             sub save {
52 11     11 1 20 my $key = shift;
53 11         96 my $buf = Crypt::OpenPGP::Buffer->new;
54 11         191 $buf->put_int8($key->{version});
55 11         138 $buf->put_int8($key->{s2k_ciph});
56 11         112 $buf->put_bytes( $key->{s2k}->save );
57 11         279 $buf->bytes;
58             }
59              
60             sub decrypt {
61 11     11 1 23 my $key = shift;
62 11         26 my($passphrase) = @_;
63 11         54 my $cipher = Crypt::OpenPGP::Cipher->new($key->{s2k_ciph});
64 11         43 my $keysize = $cipher->keysize;
65 11         52 my $s2k_key = $key->{s2k}->generate($passphrase, $keysize);
66 11         34 my($sym_key, $alg);
67 11 50       53 if ($key->{encrypted}) {
68 0         0 $cipher->init($s2k_key);
69 0         0 $sym_key = $cipher->decrypt($key->{encrypted});
70 0         0 $alg = ord substr $sym_key, 0, 1, '';
71             } else {
72 11         26 $sym_key = $s2k_key;
73 11         143 $alg = $cipher->alg_id;
74             }
75 11         224 ($sym_key, $alg);
76             }
77              
78             1;
79             __END__