| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Crypt::OpenPGP; |
|
2
|
7
|
|
|
7
|
|
131540
|
use strict; |
|
|
7
|
|
|
|
|
12
|
|
|
|
7
|
|
|
|
|
256
|
|
|
3
|
7
|
|
|
7
|
|
173
|
use 5.008_001; |
|
|
7
|
|
|
|
|
18
|
|
|
4
|
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
our $VERSION = '1.12'; # VERSION |
|
6
|
|
|
|
|
|
|
|
|
7
|
7
|
|
|
7
|
|
3166
|
use Crypt::OpenPGP::Constants qw( DEFAULT_CIPHER ); |
|
|
7
|
|
|
|
|
16
|
|
|
|
7
|
|
|
|
|
38
|
|
|
8
|
7
|
|
|
7
|
|
3242
|
use Crypt::OpenPGP::KeyRing; |
|
|
7
|
|
|
|
|
19
|
|
|
|
7
|
|
|
|
|
259
|
|
|
9
|
7
|
|
|
7
|
|
3438
|
use Crypt::OpenPGP::Plaintext; |
|
|
7
|
|
|
|
|
17
|
|
|
|
7
|
|
|
|
|
190
|
|
|
10
|
7
|
|
|
7
|
|
3084
|
use Crypt::OpenPGP::Message; |
|
|
7
|
|
|
|
|
18
|
|
|
|
7
|
|
|
|
|
234
|
|
|
11
|
7
|
|
|
7
|
|
41
|
use Crypt::OpenPGP::PacketFactory; |
|
|
7
|
|
|
|
|
11
|
|
|
|
7
|
|
|
|
|
156
|
|
|
12
|
7
|
|
|
7
|
|
3072
|
use Crypt::OpenPGP::Config; |
|
|
7
|
|
|
|
|
14
|
|
|
|
7
|
|
|
|
|
232
|
|
|
13
|
7
|
|
|
7
|
|
42
|
use Crypt::OpenPGP::Util; |
|
|
7
|
|
|
|
|
11
|
|
|
|
7
|
|
|
|
|
379
|
|
|
14
|
|
|
|
|
|
|
|
|
15
|
7
|
|
|
7
|
|
40
|
use Crypt::OpenPGP::ErrorHandler; |
|
|
7
|
|
|
|
|
12
|
|
|
|
7
|
|
|
|
|
181
|
|
|
16
|
7
|
|
|
7
|
|
68
|
use base qw( Crypt::OpenPGP::ErrorHandler ); |
|
|
7
|
|
|
|
|
9
|
|
|
|
7
|
|
|
|
|
524
|
|
|
17
|
|
|
|
|
|
|
|
|
18
|
7
|
|
|
7
|
|
4384
|
use File::HomeDir; |
|
|
7
|
|
|
|
|
40818
|
|
|
|
7
|
|
|
|
|
513
|
|
|
19
|
7
|
|
|
7
|
|
50
|
use File::Spec; |
|
|
7
|
|
|
|
|
13
|
|
|
|
7
|
|
|
|
|
172
|
|
|
20
|
|
|
|
|
|
|
|
|
21
|
7
|
|
|
7
|
|
30
|
use vars qw( %COMPAT ); |
|
|
7
|
|
|
|
|
11
|
|
|
|
7
|
|
|
|
|
3143
|
|
|
22
|
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
## pgp2 and pgp5 do not trim trailing whitespace from "canonical text" |
|
24
|
|
|
|
|
|
|
## signatures, only from cleartext signatures. |
|
25
|
|
|
|
|
|
|
## See: |
|
26
|
|
|
|
|
|
|
## http://cert.uni-stuttgart.de/archive/ietf-openpgp/2000/01/msg00033.html |
|
27
|
|
|
|
|
|
|
$Crypt::OpenPGP::Globals::Trim_trailing_ws = 1; |
|
28
|
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
{ |
|
30
|
|
|
|
|
|
|
my $env = sub { |
|
31
|
|
|
|
|
|
|
my $dir = shift; my @paths; |
|
32
|
|
|
|
|
|
|
if (exists $ENV{$dir}) { for (@_) { push @paths, "$ENV{$dir}/$_" } } |
|
33
|
|
|
|
|
|
|
return @paths ? @paths : (); |
|
34
|
|
|
|
|
|
|
}; |
|
35
|
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
my $home = sub { |
|
37
|
|
|
|
|
|
|
my( @path ) = @_; |
|
38
|
|
|
|
|
|
|
my $home_dir = File::HomeDir->my_home or return; |
|
39
|
|
|
|
|
|
|
return File::Spec->catfile( $home_dir, @path ); |
|
40
|
|
|
|
|
|
|
}; |
|
41
|
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
%COMPAT = ( |
|
43
|
|
|
|
|
|
|
PGP2 => { |
|
44
|
|
|
|
|
|
|
'sign' => { Digest => 'MD5', Version => 3 }, |
|
45
|
|
|
|
|
|
|
'encrypt' => { Cipher => 'IDEA', Compress => 'ZIP' }, |
|
46
|
|
|
|
|
|
|
'keygen' => { Type => 'RSA', Cipher => 'IDEA', |
|
47
|
|
|
|
|
|
|
Version => 3, Digest => 'MD5' }, |
|
48
|
|
|
|
|
|
|
'PubRing' => [ |
|
49
|
|
|
|
|
|
|
$env->('PGPPATH','pubring.pgp'), |
|
50
|
|
|
|
|
|
|
$home->( '.pgp', 'pubring.pgp' ), |
|
51
|
|
|
|
|
|
|
], |
|
52
|
|
|
|
|
|
|
'SecRing' => [ |
|
53
|
|
|
|
|
|
|
$env->('PGPPATH','secring.pgp'), |
|
54
|
|
|
|
|
|
|
$home->( '.pgp', 'secring.pgp' ), |
|
55
|
|
|
|
|
|
|
], |
|
56
|
|
|
|
|
|
|
'Config' => [ |
|
57
|
|
|
|
|
|
|
$env->('PGPPATH', 'config.txt'), |
|
58
|
|
|
|
|
|
|
$home->( '.pgp', 'config.txt' ), |
|
59
|
|
|
|
|
|
|
], |
|
60
|
|
|
|
|
|
|
}, |
|
61
|
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
PGP5 => { |
|
63
|
|
|
|
|
|
|
'sign' => { Digest => 'SHA1', Version => 3 }, |
|
64
|
|
|
|
|
|
|
'encrypt' => { Cipher => 'DES3', Compress => 'ZIP' }, |
|
65
|
|
|
|
|
|
|
'keygen' => { Type => 'DSA', Cipher => 'DES3', |
|
66
|
|
|
|
|
|
|
Version => 4, Digest => 'SHA1' }, |
|
67
|
|
|
|
|
|
|
'PubRing' => [ |
|
68
|
|
|
|
|
|
|
$env->('PGPPATH','pubring.pkr'), |
|
69
|
|
|
|
|
|
|
$home->( '.pgp', 'pubring.pkr' ), |
|
70
|
|
|
|
|
|
|
], |
|
71
|
|
|
|
|
|
|
'SecRing' => [ |
|
72
|
|
|
|
|
|
|
$env->('PGPPATH','secring.skr'), |
|
73
|
|
|
|
|
|
|
$home->( '.pgp', 'secring.skr' ), |
|
74
|
|
|
|
|
|
|
], |
|
75
|
|
|
|
|
|
|
'Config' => [ |
|
76
|
|
|
|
|
|
|
$env->('PGPPATH', 'pgp.cfg'), |
|
77
|
|
|
|
|
|
|
$home->( '.pgp', 'pgp.cfg' ), |
|
78
|
|
|
|
|
|
|
], |
|
79
|
|
|
|
|
|
|
}, |
|
80
|
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
GnuPG => { |
|
82
|
|
|
|
|
|
|
'sign' => { Digest => 'SHA256', Version => 4 }, |
|
83
|
|
|
|
|
|
|
'encrypt' => { Cipher => 'Rijndael', Compress => 'Zlib', |
|
84
|
|
|
|
|
|
|
MDC => 1 }, |
|
85
|
|
|
|
|
|
|
'keygen' => { Type => 'RSA', Cipher => 'Rijndael', |
|
86
|
|
|
|
|
|
|
Version => 4, Digest => 'SHA256' }, |
|
87
|
|
|
|
|
|
|
'Config' => [ |
|
88
|
|
|
|
|
|
|
$env->('GNUPGHOME', 'options'), |
|
89
|
|
|
|
|
|
|
$home->( '.gnupg', 'options' ), |
|
90
|
|
|
|
|
|
|
], |
|
91
|
|
|
|
|
|
|
'PubRing' => [ |
|
92
|
|
|
|
|
|
|
$env->('GNUPGHOME', 'pubring.gpg'), |
|
93
|
|
|
|
|
|
|
$home->( '.gnupg', 'pubring.gpg' ), |
|
94
|
|
|
|
|
|
|
], |
|
95
|
|
|
|
|
|
|
'SecRing' => [ |
|
96
|
|
|
|
|
|
|
$env->('GNUPGHOME', 'secring.gpg'), |
|
97
|
|
|
|
|
|
|
$home->( '.gnupg', 'secring.gpg' ), |
|
98
|
|
|
|
|
|
|
], |
|
99
|
|
|
|
|
|
|
}, |
|
100
|
|
|
|
|
|
|
); |
|
101
|
|
|
|
|
|
|
} |
|
102
|
|
|
|
|
|
|
|
|
103
|
9
|
|
|
9
|
0
|
1761
|
sub version_string { __PACKAGE__ . ' ' . $VERSION } |
|
104
|
|
|
|
|
|
|
|
|
105
|
16
|
|
|
16
|
0
|
50
|
sub pubrings { $_[0]->{pubrings} } |
|
106
|
14
|
|
|
14
|
0
|
75
|
sub secrings { $_[0]->{secrings} } |
|
107
|
|
|
|
|
|
|
|
|
108
|
7
|
|
|
7
|
|
41
|
use constant PUBLIC => 1; |
|
|
7
|
|
|
|
|
10
|
|
|
|
7
|
|
|
|
|
480
|
|
|
109
|
7
|
|
|
7
|
|
47
|
use constant SECRET => 2; |
|
|
7
|
|
|
|
|
11
|
|
|
|
7
|
|
|
|
|
35938
|
|
|
110
|
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
sub add_ring { |
|
112
|
5
|
|
|
5
|
0
|
11
|
my $pgp = shift; |
|
113
|
5
|
|
|
|
|
10
|
my($type, $ring) = @_; |
|
114
|
5
|
50
|
|
|
|
19
|
unless (ref($ring) eq 'Crypt::OpenPGP::KeyRing') { |
|
115
|
5
|
100
|
|
|
|
51
|
$ring = Crypt::OpenPGP::KeyRing->new( Filename => $ring ) |
|
116
|
|
|
|
|
|
|
or return Crypt::OpenPGP::KeyRing->errstr; |
|
117
|
|
|
|
|
|
|
} |
|
118
|
4
|
100
|
|
|
|
12
|
if ($type == SECRET) { |
|
119
|
2
|
|
|
|
|
3
|
push @{ $pgp->{secrings} }, $ring; |
|
|
2
|
|
|
|
|
8
|
|
|
120
|
|
|
|
|
|
|
} else { |
|
121
|
2
|
|
|
|
|
5
|
push @{ $pgp->{pubrings} }, $ring; |
|
|
2
|
|
|
|
|
9
|
|
|
122
|
|
|
|
|
|
|
} |
|
123
|
4
|
|
|
|
|
10
|
$ring; |
|
124
|
|
|
|
|
|
|
} |
|
125
|
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
sub new { |
|
127
|
6
|
|
|
6
|
1
|
9087
|
my $class = shift; |
|
128
|
6
|
|
|
|
|
28
|
my $pgp = bless { }, $class; |
|
129
|
6
|
|
|
|
|
42
|
$pgp->init(@_); |
|
130
|
|
|
|
|
|
|
} |
|
131
|
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
sub _first_exists { |
|
133
|
15
|
|
|
15
|
|
21
|
my($list) = @_; |
|
134
|
15
|
|
|
|
|
25
|
for my $f (@$list) { |
|
135
|
15
|
50
|
|
|
|
32
|
next unless $f; |
|
136
|
15
|
50
|
|
|
|
234
|
return $f if -e $f; |
|
137
|
|
|
|
|
|
|
} |
|
138
|
|
|
|
|
|
|
} |
|
139
|
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
sub init { |
|
141
|
6
|
|
|
6
|
0
|
14
|
my $pgp = shift; |
|
142
|
6
|
|
|
|
|
55
|
$pgp->{pubrings} = []; |
|
143
|
6
|
|
|
|
|
25
|
$pgp->{secrings} = []; |
|
144
|
6
|
|
|
|
|
30
|
my %param = @_; |
|
145
|
6
|
|
|
|
|
20
|
my $cfg_file = delete $param{ConfigFile}; |
|
146
|
6
|
50
|
|
|
|
75
|
my $cfg = $pgp->{cfg} = Crypt::OpenPGP::Config->new(%param) or |
|
147
|
|
|
|
|
|
|
return Crypt::OpenPGP::Config->errstr; |
|
148
|
6
|
50
|
66
|
|
|
51
|
if (!$cfg_file && (my $compat = $cfg->get('Compat'))) { |
|
149
|
0
|
|
|
|
|
0
|
$cfg_file = _first_exists($COMPAT{$compat}{Config}); |
|
150
|
|
|
|
|
|
|
} |
|
151
|
6
|
100
|
|
|
|
21
|
if ($cfg_file) { |
|
152
|
2
|
|
|
|
|
8
|
$cfg->read_config($param{Compat}, $cfg_file); |
|
153
|
|
|
|
|
|
|
} |
|
154
|
|
|
|
|
|
|
## Load public and secret keyrings. |
|
155
|
6
|
|
|
|
|
24
|
for my $s (qw( PubRing SecRing )) { |
|
156
|
12
|
100
|
|
|
|
41
|
unless (defined $cfg->get($s)) { |
|
157
|
7
|
100
|
|
|
|
38
|
my @compats = $param{Compat} ? ($param{Compat}) : keys %COMPAT; |
|
158
|
7
|
|
|
|
|
14
|
for my $compat (@compats) { |
|
159
|
15
|
|
|
|
|
44
|
my $ring = _first_exists($COMPAT{$compat}{$s}); |
|
160
|
15
|
50
|
|
|
|
43
|
$cfg->set($s, $ring), last if $ring; |
|
161
|
|
|
|
|
|
|
} |
|
162
|
|
|
|
|
|
|
} |
|
163
|
12
|
100
|
|
|
|
37
|
if (my $ring = $cfg->get($s)) { |
|
164
|
5
|
100
|
|
|
|
40
|
$pgp->add_ring($s eq 'PubRing' ? PUBLIC : SECRET, $ring); |
|
165
|
|
|
|
|
|
|
} |
|
166
|
|
|
|
|
|
|
} |
|
167
|
6
|
|
|
|
|
24
|
$pgp; |
|
168
|
|
|
|
|
|
|
} |
|
169
|
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
sub handle { |
|
171
|
0
|
|
|
0
|
1
|
0
|
my $pgp = shift; |
|
172
|
0
|
|
|
|
|
0
|
my %param = @_; |
|
173
|
0
|
|
|
|
|
0
|
my($data); |
|
174
|
0
|
0
|
|
|
|
0
|
unless ($data = $param{Data}) { |
|
175
|
|
|
|
|
|
|
my $file = $param{Filename} or |
|
176
|
0
|
0
|
|
|
|
0
|
return $pgp->error("Need either 'Data' or 'Filename' to decrypt"); |
|
177
|
0
|
0
|
|
|
|
0
|
$data = $pgp->_read_files($file) or return $pgp->error($pgp->errstr); |
|
178
|
|
|
|
|
|
|
} |
|
179
|
0
|
0
|
|
|
|
0
|
my $msg = Crypt::OpenPGP::Message->new( Data => $data ) or |
|
180
|
|
|
|
|
|
|
return $pgp->error("Reading data packets failed: " . |
|
181
|
|
|
|
|
|
|
Crypt::OpenPGP::Message->errstr); |
|
182
|
0
|
|
|
|
|
0
|
my @pieces = $msg->pieces; |
|
183
|
0
|
0
|
|
|
|
0
|
return $pgp->error("No packets found in message") unless @pieces; |
|
184
|
0
|
|
|
|
|
0
|
while (ref($pieces[0]) eq 'Crypt::OpenPGP::Marker') { |
|
185
|
0
|
|
|
|
|
0
|
shift @pieces; |
|
186
|
|
|
|
|
|
|
} |
|
187
|
0
|
0
|
|
|
|
0
|
if (ref($pieces[0]) eq 'Crypt::OpenPGP::Compressed') { |
|
188
|
0
|
0
|
|
|
|
0
|
$data = $pieces[0]->decompress or |
|
189
|
|
|
|
|
|
|
return $pgp->error("Decompression error: " . $pieces[0]->errstr); |
|
190
|
0
|
0
|
|
|
|
0
|
$msg = Crypt::OpenPGP::Message->new( Data => $data ) or |
|
191
|
|
|
|
|
|
|
return $pgp->error("Reading decompressed data failed: " . |
|
192
|
|
|
|
|
|
|
Crypt::OpenPGP::Message->errstr); |
|
193
|
0
|
|
|
|
|
0
|
@pieces = $msg->pieces; |
|
194
|
|
|
|
|
|
|
} |
|
195
|
0
|
|
|
|
|
0
|
my $class = ref($pieces[0]); |
|
196
|
0
|
|
|
|
|
0
|
my(%res); |
|
197
|
0
|
0
|
0
|
|
|
0
|
if ($class eq 'Crypt::OpenPGP::OnePassSig' || |
|
198
|
|
|
|
|
|
|
$class eq 'Crypt::OpenPGP::Signature') { |
|
199
|
0
|
|
|
|
|
0
|
my($valid, $sig) = $pgp->verify( Signature => $data ); |
|
200
|
0
|
0
|
|
|
|
0
|
return $pgp->error("Error verifying signature: " . $pgp->errstr) |
|
201
|
|
|
|
|
|
|
if !defined $valid; |
|
202
|
0
|
|
|
|
|
0
|
$res{Validity} = $valid; |
|
203
|
0
|
|
|
|
|
0
|
$res{Signature} = $sig; |
|
204
|
|
|
|
|
|
|
} else { |
|
205
|
0
|
|
0
|
|
|
0
|
my $cb = $param{PassphraseCallback} || \&_default_passphrase_cb; |
|
206
|
0
|
|
|
|
|
0
|
my($pt, $valid, $sig) = $pgp->decrypt( |
|
207
|
|
|
|
|
|
|
Data => $data, |
|
208
|
|
|
|
|
|
|
PassphraseCallback => $cb, |
|
209
|
|
|
|
|
|
|
); |
|
210
|
0
|
0
|
|
|
|
0
|
return $pgp->error("Decryption failed: " . $pgp->errstr) |
|
211
|
|
|
|
|
|
|
unless defined $pt; |
|
212
|
0
|
0
|
0
|
|
|
0
|
return $pgp->error("Error verifying signature: " . $pgp->errstr) |
|
213
|
|
|
|
|
|
|
if !defined($valid) && $pgp->errstr !~ /^No Signature/; |
|
214
|
0
|
|
|
|
|
0
|
$res{Plaintext} = $pt; |
|
215
|
0
|
0
|
|
|
|
0
|
$res{Validity} = $valid if defined $valid; |
|
216
|
0
|
0
|
|
|
|
0
|
$res{Signature} = $sig if defined $sig; |
|
217
|
|
|
|
|
|
|
} |
|
218
|
0
|
|
|
|
|
0
|
\%res; |
|
219
|
|
|
|
|
|
|
} |
|
220
|
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
sub _default_passphrase_cb { |
|
222
|
0
|
|
|
0
|
|
0
|
my($cert) = @_; |
|
223
|
0
|
|
|
|
|
0
|
my $prompt; |
|
224
|
0
|
0
|
|
|
|
0
|
if ($cert) { |
|
225
|
0
|
|
|
|
|
0
|
$prompt = sprintf qq( |
|
226
|
|
|
|
|
|
|
You need a passphrase to unlock the secret key for |
|
227
|
|
|
|
|
|
|
user "%s". |
|
228
|
|
|
|
|
|
|
%d-bit %s key, ID %s |
|
229
|
|
|
|
|
|
|
|
|
230
|
|
|
|
|
|
|
Enter passphrase: ), $cert->uid, |
|
231
|
|
|
|
|
|
|
$cert->key->size, |
|
232
|
|
|
|
|
|
|
$cert->key->alg, |
|
233
|
|
|
|
|
|
|
substr($cert->key_id_hex, -8, 8); |
|
234
|
|
|
|
|
|
|
} else { |
|
235
|
0
|
|
|
|
|
0
|
$prompt = "Enter passphrase: "; |
|
236
|
|
|
|
|
|
|
} |
|
237
|
0
|
|
|
|
|
0
|
_prompt($prompt, '', 1); |
|
238
|
|
|
|
|
|
|
} |
|
239
|
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
sub _prompt { |
|
241
|
0
|
|
|
0
|
|
0
|
my($prompt, $def, $noecho) = @_; |
|
242
|
0
|
|
|
|
|
0
|
require Term::ReadKey; |
|
243
|
0
|
|
|
|
|
0
|
Term::ReadKey->import; |
|
244
|
0
|
0
|
|
|
|
0
|
print STDERR $prompt . ($def ? "[$def] " : ""); |
|
245
|
0
|
0
|
|
|
|
0
|
if ($noecho) { |
|
246
|
0
|
|
|
|
|
0
|
ReadMode('noecho'); |
|
247
|
|
|
|
|
|
|
} |
|
248
|
0
|
|
|
|
|
0
|
chomp(my $ans = ReadLine(0)); |
|
249
|
0
|
|
|
|
|
0
|
ReadMode('restore'); |
|
250
|
0
|
|
|
|
|
0
|
print STDERR "\n"; |
|
251
|
0
|
0
|
|
|
|
0
|
$ans ? $ans : $def; |
|
252
|
|
|
|
|
|
|
} |
|
253
|
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
sub sign { |
|
255
|
6
|
|
|
6
|
1
|
4861
|
my $pgp = shift; |
|
256
|
6
|
|
|
|
|
47
|
my %param = @_; |
|
257
|
6
|
50
|
|
|
|
34
|
$pgp->_merge_compat(\%param, 'sign') or |
|
258
|
|
|
|
|
|
|
return $pgp->error( $pgp->errstr ); |
|
259
|
6
|
|
|
|
|
14
|
my($cert, $data); |
|
260
|
6
|
|
|
|
|
991
|
require Crypt::OpenPGP::Signature; |
|
261
|
6
|
50
|
|
|
|
33
|
unless ($data = $param{Data}) { |
|
262
|
|
|
|
|
|
|
my $file = $param{Filename} or |
|
263
|
0
|
0
|
|
|
|
0
|
return $pgp->error("Need either 'Data' or 'Filename' to sign"); |
|
264
|
0
|
0
|
|
|
|
0
|
$data = $pgp->_read_files($file) or return $pgp->error($pgp->errstr); |
|
265
|
|
|
|
|
|
|
} |
|
266
|
6
|
100
|
|
|
|
28
|
unless ($cert = $param{Key}) { |
|
267
|
5
|
50
|
|
|
|
21
|
my $kid = $param{KeyID} or return $pgp->error("No KeyID specified"); |
|
268
|
5
|
50
|
|
|
|
21
|
my $ring = $pgp->secrings->[0] |
|
269
|
|
|
|
|
|
|
or return $pgp->error("No secret keyrings"); |
|
270
|
5
|
50
|
|
|
|
61
|
my $kb = $ring->find_keyblock_by_keyid(pack 'H*', $kid) or |
|
271
|
|
|
|
|
|
|
return $pgp->error("Could not find secret key with KeyID $kid"); |
|
272
|
5
|
|
|
|
|
31
|
$cert = $kb->signing_key; |
|
273
|
5
|
|
|
|
|
23
|
$cert->uid($kb->primary_uid); |
|
274
|
|
|
|
|
|
|
} |
|
275
|
6
|
100
|
|
|
|
26
|
if ($cert->is_protected) { |
|
276
|
2
|
|
|
|
|
7
|
my $pass = $param{Passphrase}; |
|
277
|
2
|
50
|
33
|
|
|
11
|
if (!defined $pass && (my $cb = $param{PassphraseCallback})) { |
|
278
|
0
|
|
|
|
|
0
|
$pass = $cb->($cert); |
|
279
|
|
|
|
|
|
|
} |
|
280
|
2
|
50
|
|
|
|
24
|
return $pgp->error("Need passphrase to unlock secret key") |
|
281
|
|
|
|
|
|
|
unless $pass; |
|
282
|
2
|
50
|
|
|
|
12
|
$cert->unlock($pass) or |
|
283
|
|
|
|
|
|
|
return $pgp->error("Secret key unlock failed: " . $cert->errstr); |
|
284
|
|
|
|
|
|
|
} |
|
285
|
6
|
|
|
|
|
20
|
my @ptarg; |
|
286
|
6
|
50
|
|
|
|
27
|
push @ptarg, ( Filename => $param{Filename} ) if $param{Filename}; |
|
287
|
6
|
100
|
|
|
|
39
|
if ($param{Clearsign}) { |
|
288
|
1
|
|
|
|
|
6
|
push @ptarg, ( Mode => 't' ); |
|
289
|
|
|
|
|
|
|
## In clear-signed messages, the line ending before the signature |
|
290
|
|
|
|
|
|
|
## is not considered part of the signed text. |
|
291
|
1
|
|
|
|
|
12
|
(my $tmp = $data) =~ s!\r?\n$!!; |
|
292
|
1
|
|
|
|
|
3
|
push @ptarg, ( Data => $tmp ); |
|
293
|
|
|
|
|
|
|
} else { |
|
294
|
5
|
|
|
|
|
16
|
push @ptarg, ( Data => $data ); |
|
295
|
|
|
|
|
|
|
} |
|
296
|
6
|
|
|
|
|
59
|
my $pt = Crypt::OpenPGP::Plaintext->new(@ptarg); |
|
297
|
6
|
|
|
|
|
13
|
my @sigarg; |
|
298
|
6
|
50
|
|
|
|
27
|
if (my $hash_alg = $param{Digest}) { |
|
299
|
0
|
0
|
|
|
|
0
|
my $dgst = Crypt::OpenPGP::Digest->new($hash_alg) or |
|
300
|
|
|
|
|
|
|
return $pgp->error( Crypt::OpenPGP::Digest->errstr ); |
|
301
|
0
|
|
|
|
|
0
|
@sigarg = ( Digest => $dgst->alg_id ); |
|
302
|
|
|
|
|
|
|
} |
|
303
|
6
|
100
|
|
|
|
72
|
push @sigarg, (Type => 0x01) if $param{Clearsign}; |
|
304
|
|
|
|
|
|
|
my $sig = Crypt::OpenPGP::Signature->new( |
|
305
|
|
|
|
|
|
|
Data => $pt, |
|
306
|
|
|
|
|
|
|
Key => $cert, |
|
307
|
|
|
|
|
|
|
Version => $param{Version}, |
|
308
|
6
|
|
|
|
|
85
|
@sigarg, |
|
309
|
|
|
|
|
|
|
); |
|
310
|
6
|
100
|
|
|
|
42
|
if ($param{Clearsign}) { |
|
311
|
1
|
|
|
|
|
3
|
$param{Armour} = $param{Detach} = 1; |
|
312
|
|
|
|
|
|
|
} |
|
313
|
|
|
|
|
|
|
my $sig_data = Crypt::OpenPGP::PacketFactory->save($sig, |
|
314
|
6
|
100
|
|
|
|
74
|
$param{Detach} ? () : ($pt)); |
|
315
|
6
|
100
|
|
|
|
33
|
if ($param{Armour}) { |
|
316
|
3
|
|
|
|
|
764
|
require Crypt::OpenPGP::Armour; |
|
317
|
|
|
|
|
|
|
$sig_data = Crypt::OpenPGP::Armour->armour( |
|
318
|
|
|
|
|
|
|
Data => $sig_data, |
|
319
|
3
|
100
|
|
|
|
41
|
Object => ($param{Detach} ? 'SIGNATURE' : 'MESSAGE'), |
|
|
|
50
|
|
|
|
|
|
|
320
|
|
|
|
|
|
|
) or return $pgp->error( Crypt::OpenPGP::Armour->errstr ); |
|
321
|
|
|
|
|
|
|
} |
|
322
|
6
|
100
|
|
|
|
24
|
if ($param{Clearsign}) { |
|
323
|
1
|
|
|
|
|
7
|
require Crypt::OpenPGP::Util; |
|
324
|
1
|
|
|
|
|
8
|
my $hash = Crypt::OpenPGP::Digest->alg($sig->{hash_alg}); |
|
325
|
1
|
|
|
|
|
6
|
my $data = Crypt::OpenPGP::Util::dash_escape($data); |
|
326
|
1
|
50
|
|
|
|
7
|
$data .= "\n" unless $data =~ /\n$/; |
|
327
|
1
|
50
|
|
|
|
8
|
$sig_data = "-----BEGIN PGP SIGNED MESSAGE-----\n" . |
|
328
|
|
|
|
|
|
|
($hash eq 'MD5' ? '' : "Hash: $hash\n") . |
|
329
|
|
|
|
|
|
|
"\n" . |
|
330
|
|
|
|
|
|
|
$data . |
|
331
|
|
|
|
|
|
|
$sig_data; |
|
332
|
|
|
|
|
|
|
} |
|
333
|
6
|
|
|
|
|
136
|
$sig_data; |
|
334
|
|
|
|
|
|
|
} |
|
335
|
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
sub verify { |
|
337
|
7
|
|
|
7
|
1
|
3931
|
my $pgp = shift; |
|
338
|
7
|
|
|
|
|
34
|
my %param = @_; |
|
339
|
7
|
|
|
|
|
16
|
my $wants_object = wantarray; |
|
340
|
7
|
|
|
|
|
14
|
my($data, $sig); |
|
341
|
7
|
|
|
|
|
61
|
require Crypt::OpenPGP::Signature; |
|
342
|
|
|
|
|
|
|
$param{Signature} or $param{SigFile} or |
|
343
|
7
|
0
|
33
|
|
|
36
|
return $pgp->error("Need Signature or SigFile to verify"); |
|
344
|
|
|
|
|
|
|
my %arg = $param{Signature} ? (Data => $param{Signature}) : |
|
345
|
7
|
50
|
|
|
|
38
|
(Filename => $param{SigFile}); |
|
346
|
7
|
100
|
|
|
|
29
|
$arg{IsPacketStream} = 1 if $param{IsPacketStream}; |
|
347
|
7
|
50
|
|
|
|
65
|
my $msg = Crypt::OpenPGP::Message->new( %arg ) or |
|
348
|
|
|
|
|
|
|
return $pgp->error("Reading signature failed: " . |
|
349
|
|
|
|
|
|
|
Crypt::OpenPGP::Message->errstr); |
|
350
|
7
|
|
|
|
|
31
|
my @pieces = $msg->pieces; |
|
351
|
7
|
50
|
|
|
|
33
|
if (ref($pieces[0]) eq 'Crypt::OpenPGP::Compressed') { |
|
352
|
0
|
0
|
|
|
|
0
|
$data = $pieces[0]->decompress or |
|
353
|
|
|
|
|
|
|
return $pgp->error("Decompression error: " . $pieces[0]->errstr); |
|
354
|
0
|
0
|
|
|
|
0
|
$msg = Crypt::OpenPGP::Message->new( Data => $data ) or |
|
355
|
|
|
|
|
|
|
return $pgp->error("Reading decompressed data failed: " . |
|
356
|
|
|
|
|
|
|
Crypt::OpenPGP::Message->errstr); |
|
357
|
0
|
|
|
|
|
0
|
@pieces = $msg->pieces; |
|
358
|
|
|
|
|
|
|
} |
|
359
|
7
|
50
|
|
|
|
42
|
if (ref($pieces[0]) eq 'Crypt::OpenPGP::OnePassSig') { |
|
|
|
50
|
|
|
|
|
|
|
360
|
0
|
|
|
|
|
0
|
($data, $sig) = @pieces[1,2]; |
|
361
|
|
|
|
|
|
|
} elsif (ref($pieces[0]) eq 'Crypt::OpenPGP::Signature') { |
|
362
|
7
|
|
|
|
|
21
|
($sig, $data) = @pieces[0,1]; |
|
363
|
|
|
|
|
|
|
} else { |
|
364
|
0
|
|
|
|
|
0
|
return $pgp->error("SigFile contents are strange"); |
|
365
|
|
|
|
|
|
|
} |
|
366
|
7
|
100
|
|
|
|
21
|
unless ($data) { |
|
367
|
2
|
100
|
|
|
|
9
|
if ($param{Data}) { |
|
368
|
1
|
|
|
|
|
12
|
$data = Crypt::OpenPGP::Plaintext->new( Data => $param{Data} ); |
|
369
|
|
|
|
|
|
|
} |
|
370
|
|
|
|
|
|
|
else { |
|
371
|
|
|
|
|
|
|
## if no Signature or detached sig in SigFile |
|
372
|
0
|
|
|
|
|
0
|
my @files = ref($param{Files}) eq 'ARRAY' ? @{ $param{Files} } : |
|
373
|
1
|
50
|
|
|
|
16
|
$param{Files}; |
|
374
|
1
|
|
|
|
|
6
|
my $fdata = $pgp->_read_files(@files); |
|
375
|
1
|
50
|
|
|
|
11
|
return $pgp->error("Reading data files failed: " . $pgp->errstr) |
|
376
|
|
|
|
|
|
|
unless defined $fdata; |
|
377
|
0
|
|
|
|
|
0
|
$data = Crypt::OpenPGP::Plaintext->new( Data => $fdata ); |
|
378
|
|
|
|
|
|
|
} |
|
379
|
|
|
|
|
|
|
} |
|
380
|
6
|
|
|
|
|
13
|
my($cert, $kb); |
|
381
|
6
|
100
|
|
|
|
21
|
unless ($cert = $param{Key}) { |
|
382
|
5
|
|
|
|
|
68
|
my $key_id = $sig->key_id; |
|
383
|
5
|
|
|
|
|
24
|
my $ring = $pgp->pubrings->[0]; |
|
384
|
5
|
50
|
33
|
|
|
48
|
unless ($ring && ($kb = $ring->find_keyblock_by_keyid($key_id))) { |
|
385
|
0
|
|
|
|
|
0
|
my $cfg = $pgp->{cfg}; |
|
386
|
0
|
0
|
0
|
|
|
0
|
if ($cfg->get('AutoKeyRetrieve') && $cfg->get('KeyServer')) { |
|
387
|
0
|
|
|
|
|
0
|
require Crypt::OpenPGP::KeyServer; |
|
388
|
0
|
|
|
|
|
0
|
my $server = Crypt::OpenPGP::KeyServer->new( |
|
389
|
|
|
|
|
|
|
Server => $cfg->get('KeyServer'), |
|
390
|
|
|
|
|
|
|
); |
|
391
|
0
|
|
|
|
|
0
|
$kb = $server->find_keyblock_by_keyid($key_id); |
|
392
|
|
|
|
|
|
|
} |
|
393
|
0
|
0
|
|
|
|
0
|
return $pgp->error("Could not find public key with KeyID " . |
|
394
|
|
|
|
|
|
|
unpack('H*', $key_id)) |
|
395
|
|
|
|
|
|
|
unless $kb; |
|
396
|
|
|
|
|
|
|
} |
|
397
|
5
|
|
|
|
|
30
|
$cert = $kb->signing_key; |
|
398
|
|
|
|
|
|
|
} |
|
399
|
|
|
|
|
|
|
|
|
400
|
|
|
|
|
|
|
## pgp2 and pgp5 do not trim trailing whitespace from "canonical text" |
|
401
|
|
|
|
|
|
|
## signatures, only from cleartext signatures. So we first try to verify |
|
402
|
|
|
|
|
|
|
## the signature using proper RFC4880 canonical text, then if that fails, |
|
403
|
|
|
|
|
|
|
## retry without trimming trailing whitespace. |
|
404
|
|
|
|
|
|
|
## See: |
|
405
|
|
|
|
|
|
|
## http://cert.uni-stuttgart.de/archive/ietf-openpgp/2000/01/msg00033.html |
|
406
|
6
|
|
|
|
|
16
|
my($dgst, $found); |
|
407
|
6
|
|
|
|
|
14
|
for (1, 0) { |
|
408
|
6
|
|
|
|
|
14
|
local $Crypt::OpenPGP::Globals::Trim_trailing_ws = $_; |
|
409
|
6
|
50
|
|
|
|
37
|
$dgst = $sig->hash_data($data) or |
|
410
|
|
|
|
|
|
|
return $pgp->error( $sig->errstr ); |
|
411
|
6
|
50
|
|
|
|
47
|
$found++, last if substr($dgst, 0, 2) eq $sig->{chk}; |
|
412
|
|
|
|
|
|
|
} |
|
413
|
6
|
50
|
|
|
|
20
|
return $pgp->error("Message hash does not match signature checkbytes") |
|
414
|
|
|
|
|
|
|
unless $found; |
|
415
|
6
|
100
|
66
|
|
|
38
|
my $valid = $cert->key->public_key->verify($sig, $dgst) ? |
|
|
|
50
|
|
|
|
|
|
|
416
|
|
|
|
|
|
|
($kb && $kb->primary_uid ? $kb->primary_uid : 1) : 0; |
|
417
|
|
|
|
|
|
|
|
|
418
|
6
|
100
|
|
|
|
2303859
|
$wants_object ? ($valid, $sig) : $valid; |
|
419
|
|
|
|
|
|
|
} |
|
420
|
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
sub encrypt { |
|
422
|
23
|
|
|
23
|
1
|
14665
|
my $pgp = shift; |
|
423
|
23
|
|
|
|
|
111
|
my %param = @_; |
|
424
|
23
|
50
|
|
|
|
108
|
$pgp->_merge_compat(\%param, 'encrypt') or |
|
425
|
|
|
|
|
|
|
return $pgp->error( $pgp->errstr ); |
|
426
|
23
|
|
|
|
|
42
|
my($data); |
|
427
|
23
|
|
|
|
|
1406
|
require Crypt::OpenPGP::Cipher; |
|
428
|
23
|
|
|
|
|
909
|
require Crypt::OpenPGP::Ciphertext; |
|
429
|
23
|
50
|
|
|
|
84
|
unless ($data = $param{Data}) { |
|
430
|
|
|
|
|
|
|
my $file = $param{Filename} or |
|
431
|
0
|
0
|
|
|
|
0
|
return $pgp->error("Need either 'Data' or 'Filename' to encrypt"); |
|
432
|
0
|
0
|
|
|
|
0
|
$data = $pgp->_read_files($file) or return $pgp->error($pgp->errstr); |
|
433
|
|
|
|
|
|
|
} |
|
434
|
23
|
|
|
|
|
38
|
my $ptdata; |
|
435
|
23
|
100
|
|
|
|
65
|
if ($param{SignKeyID}) { |
|
436
|
|
|
|
|
|
|
$ptdata = $pgp->sign( |
|
437
|
|
|
|
|
|
|
Data => $data, |
|
438
|
|
|
|
|
|
|
KeyID => $param{SignKeyID}, |
|
439
|
|
|
|
|
|
|
Compat => $param{Compat}, |
|
440
|
|
|
|
|
|
|
Armour => 0, |
|
441
|
|
|
|
|
|
|
Passphrase => $param{SignPassphrase}, |
|
442
|
|
|
|
|
|
|
PassphraseCallback => $param{SignPassphraseCallback}, |
|
443
|
|
|
|
|
|
|
) |
|
444
|
1
|
50
|
|
|
|
8
|
or return; |
|
445
|
|
|
|
|
|
|
} else { |
|
446
|
|
|
|
|
|
|
my $pt = Crypt::OpenPGP::Plaintext->new( Data => $data, |
|
447
|
22
|
50
|
|
|
|
139
|
$param{Filename} ? (Filename => $param{Filename}) : () ); |
|
448
|
22
|
|
|
|
|
108
|
$ptdata = Crypt::OpenPGP::PacketFactory->save($pt); |
|
449
|
|
|
|
|
|
|
} |
|
450
|
23
|
100
|
|
|
|
85
|
if (my $alg = $param{Compress}) { |
|
451
|
1
|
|
|
|
|
593
|
require Crypt::OpenPGP::Compressed; |
|
452
|
1
|
|
|
|
|
5
|
$alg = Crypt::OpenPGP::Compressed->alg_id($alg); |
|
453
|
1
|
50
|
|
|
|
4
|
my $cdata = Crypt::OpenPGP::Compressed->new( Data => $ptdata, |
|
454
|
|
|
|
|
|
|
Alg => $alg ) or return $pgp->error("Compression error: " . |
|
455
|
|
|
|
|
|
|
Crypt::OpenPGP::Compressed->errstr); |
|
456
|
1
|
|
|
|
|
12
|
$ptdata = Crypt::OpenPGP::PacketFactory->save($cdata); |
|
457
|
|
|
|
|
|
|
} |
|
458
|
23
|
|
|
|
|
100
|
my $key_data = Crypt::OpenPGP::Util::get_random_bytes(32); |
|
459
|
|
|
|
|
|
|
my $sym_alg = $param{Cipher} ? |
|
460
|
23
|
50
|
|
|
|
462470172
|
Crypt::OpenPGP::Cipher->alg_id($param{Cipher}) : DEFAULT_CIPHER; |
|
461
|
23
|
|
|
|
|
34
|
my(@sym_keys); |
|
462
|
23
|
100
|
100
|
|
|
136
|
if ($param{Recipients} && !ref($param{Recipients})) { |
|
463
|
3
|
|
|
|
|
10
|
$param{Recipients} = [ $param{Recipients} ]; |
|
464
|
|
|
|
|
|
|
} |
|
465
|
23
|
100
|
|
|
|
84
|
if (my $kid = delete $param{KeyID}) { |
|
466
|
4
|
50
|
|
|
|
16
|
my @kid = ref $kid eq 'ARRAY' ? @$kid : $kid; |
|
467
|
4
|
|
|
|
|
6
|
push @{ $param{Recipients} }, @kid; |
|
|
4
|
|
|
|
|
18
|
|
|
468
|
|
|
|
|
|
|
} |
|
469
|
23
|
100
|
66
|
|
|
152
|
if ($param{Key} || $param{Recipients}) { |
|
|
|
50
|
|
|
|
|
|
|
470
|
12
|
|
|
|
|
489
|
require Crypt::OpenPGP::SessionKey; |
|
471
|
12
|
|
|
|
|
21
|
my @keys; |
|
472
|
12
|
100
|
|
|
|
51
|
if (my $recips = $param{Recipients}) { |
|
473
|
11
|
50
|
|
|
|
63
|
my @recips = ref $recips eq 'ARRAY' ? @$recips : $recips; |
|
474
|
11
|
|
|
|
|
50
|
my $ring = $pgp->pubrings->[0]; |
|
475
|
11
|
|
|
|
|
19
|
my %seen; |
|
476
|
|
|
|
|
|
|
my $server; |
|
477
|
11
|
|
|
|
|
40
|
my $cfg = $pgp->{cfg}; |
|
478
|
11
|
50
|
33
|
|
|
41
|
if ($cfg->get('AutoKeyRetrieve') && $cfg->get('KeyServer')) { |
|
479
|
0
|
|
|
|
|
0
|
require Crypt::OpenPGP::KeyServer; |
|
480
|
0
|
|
|
|
|
0
|
$server = Crypt::OpenPGP::KeyServer->new( |
|
481
|
|
|
|
|
|
|
Server => $cfg->get('KeyServer'), |
|
482
|
|
|
|
|
|
|
); |
|
483
|
|
|
|
|
|
|
} |
|
484
|
11
|
|
|
|
|
32
|
for my $r (@recips) { |
|
485
|
15
|
|
|
|
|
41
|
my($lr, @kb) = (length($r)); |
|
486
|
15
|
100
|
100
|
|
|
150
|
if (($lr == 8 || $lr == 16) && $r !~ /[^\da-fA-F]/) { |
|
|
|
|
66
|
|
|
|
|
|
487
|
14
|
|
|
|
|
65
|
my $id = pack 'H*', $r; |
|
488
|
14
|
50
|
|
|
|
84
|
@kb = $ring->find_keyblock_by_keyid($id) if $ring; |
|
489
|
14
|
50
|
33
|
|
|
74
|
@kb = $server->find_keyblock_by_keyid($id) |
|
490
|
|
|
|
|
|
|
if !@kb && $server; |
|
491
|
|
|
|
|
|
|
} else { |
|
492
|
1
|
50
|
|
|
|
9
|
@kb = $ring->find_keyblock_by_uid($r) if $ring; |
|
493
|
1
|
50
|
33
|
|
|
8
|
@kb = $server->find_keyblock_by_uid($r) |
|
494
|
|
|
|
|
|
|
if !@kb && $server; |
|
495
|
|
|
|
|
|
|
} |
|
496
|
15
|
|
|
|
|
37
|
for my $kb (@kb) { |
|
497
|
15
|
50
|
|
|
|
79
|
next unless my $cert = $kb->encrypting_key; |
|
498
|
15
|
100
|
|
|
|
65
|
next if $seen{ $cert->key_id }++; |
|
499
|
14
|
|
|
|
|
66
|
$cert->uid($kb->primary_uid); |
|
500
|
14
|
|
|
|
|
75
|
push @keys, $cert; |
|
501
|
|
|
|
|
|
|
} |
|
502
|
|
|
|
|
|
|
} |
|
503
|
11
|
50
|
|
|
|
51
|
if (my $cb = $param{RecipientsCallback}) { |
|
504
|
0
|
|
|
|
|
0
|
@keys = @{ $cb->(\@keys) }; |
|
|
0
|
|
|
|
|
0
|
|
|
505
|
|
|
|
|
|
|
} |
|
506
|
|
|
|
|
|
|
} |
|
507
|
12
|
100
|
|
|
|
39
|
if ($param{Key}) { |
|
508
|
0
|
|
|
|
|
0
|
push @keys, ref $param{Key} eq 'ARRAY' ? @{$param{Key}} : |
|
509
|
1
|
50
|
|
|
|
8
|
$param{Key}; |
|
510
|
|
|
|
|
|
|
} |
|
511
|
12
|
50
|
|
|
|
43
|
return $pgp->error("No known recipients for encryption") |
|
512
|
|
|
|
|
|
|
unless @keys; |
|
513
|
12
|
|
|
|
|
32
|
for my $key (@keys) { |
|
514
|
15
|
50
|
|
|
|
131
|
push @sym_keys, Crypt::OpenPGP::SessionKey->new( |
|
515
|
|
|
|
|
|
|
Key => $key, |
|
516
|
|
|
|
|
|
|
SymKey => $key_data, |
|
517
|
|
|
|
|
|
|
Cipher => $sym_alg, |
|
518
|
|
|
|
|
|
|
) or |
|
519
|
|
|
|
|
|
|
return $pgp->error( Crypt::OpenPGP::SessionKey->errstr ); |
|
520
|
|
|
|
|
|
|
} |
|
521
|
|
|
|
|
|
|
} |
|
522
|
|
|
|
|
|
|
elsif (my $pass = $param{Passphrase}) { |
|
523
|
11
|
|
|
|
|
1509
|
require Crypt::OpenPGP::SKSessionKey; |
|
524
|
11
|
|
|
|
|
38
|
require Crypt::OpenPGP::S2k; |
|
525
|
11
|
|
|
|
|
25
|
my $s2k; |
|
526
|
11
|
50
|
33
|
|
|
39
|
if ($param{Compat} && $param{Compat} eq 'PGP2') { |
|
527
|
0
|
|
|
|
|
0
|
$s2k = Crypt::OpenPGP::S2k->new('Simple'); |
|
528
|
0
|
|
|
|
|
0
|
$s2k->{hash} = Crypt::OpenPGP::Digest->new('MD5'); |
|
529
|
|
|
|
|
|
|
} else { |
|
530
|
11
|
|
|
|
|
44
|
$s2k = Crypt::OpenPGP::S2k->new('Salt_Iter'); |
|
531
|
|
|
|
|
|
|
} |
|
532
|
11
|
50
|
|
|
|
42
|
my $cipher = Crypt::OpenPGP::Cipher->new($sym_alg) or |
|
533
|
|
|
|
|
|
|
return $pgp->error( Crypt::OpenPGP::Cipher->errstr ); |
|
534
|
11
|
|
|
|
|
31
|
my $keysize = $cipher->keysize; |
|
535
|
11
|
|
|
|
|
39
|
$key_data = $s2k->generate($pass, $keysize); |
|
536
|
11
|
50
|
|
|
|
83
|
push @sym_keys, Crypt::OpenPGP::SKSessionKey->new( |
|
537
|
|
|
|
|
|
|
Passphrase => $pass, |
|
538
|
|
|
|
|
|
|
SymKey => $key_data, |
|
539
|
|
|
|
|
|
|
Cipher => $sym_alg, |
|
540
|
|
|
|
|
|
|
S2k => $s2k, |
|
541
|
|
|
|
|
|
|
) or |
|
542
|
|
|
|
|
|
|
return $pgp->error( Crypt::OpenPGP::SKSessionKey->errstr ); |
|
543
|
|
|
|
|
|
|
} else { |
|
544
|
0
|
|
|
|
|
0
|
return $pgp->error("Need something to encrypt with"); |
|
545
|
|
|
|
|
|
|
} |
|
546
|
|
|
|
|
|
|
my $enc = Crypt::OpenPGP::Ciphertext->new( |
|
547
|
|
|
|
|
|
|
MDC => $param{MDC}, |
|
548
|
23
|
|
|
|
|
265
|
SymKey => $key_data, |
|
549
|
|
|
|
|
|
|
Data => $ptdata, |
|
550
|
|
|
|
|
|
|
Cipher => $sym_alg, |
|
551
|
|
|
|
|
|
|
); |
|
552
|
|
|
|
|
|
|
my $enc_data = Crypt::OpenPGP::PacketFactory->save( |
|
553
|
23
|
50
|
33
|
|
|
259
|
$param{Passphrase} && $param{Compat} && $param{Compat} eq 'PGP2' ? |
|
554
|
|
|
|
|
|
|
$enc : (@sym_keys, $enc) |
|
555
|
|
|
|
|
|
|
); |
|
556
|
23
|
100
|
|
|
|
97
|
if ($param{Armour}) { |
|
557
|
1
|
|
|
|
|
583
|
require Crypt::OpenPGP::Armour; |
|
558
|
1
|
50
|
|
|
|
6
|
$enc_data = Crypt::OpenPGP::Armour->armour( |
|
559
|
|
|
|
|
|
|
Data => $enc_data, |
|
560
|
|
|
|
|
|
|
Object => 'MESSAGE', |
|
561
|
|
|
|
|
|
|
) or return $pgp->error( Crypt::OpenPGP::Armour->errstr ); |
|
562
|
|
|
|
|
|
|
} |
|
563
|
23
|
|
|
|
|
402
|
$enc_data; |
|
564
|
|
|
|
|
|
|
} |
|
565
|
|
|
|
|
|
|
|
|
566
|
|
|
|
|
|
|
sub decrypt { |
|
567
|
23
|
|
|
23
|
1
|
11285
|
my $pgp = shift; |
|
568
|
23
|
|
|
|
|
104
|
my %param = @_; |
|
569
|
23
|
|
|
|
|
44
|
my $wants_verify = wantarray; |
|
570
|
23
|
|
|
|
|
40
|
my($data); |
|
571
|
23
|
50
|
|
|
|
93
|
unless ($data = $param{Data}) { |
|
572
|
|
|
|
|
|
|
my $file = $param{Filename} or |
|
573
|
0
|
0
|
|
|
|
0
|
return $pgp->error("Need either 'Data' or 'Filename' to decrypt"); |
|
574
|
0
|
0
|
|
|
|
0
|
$data = $pgp->_read_files($file) or return $pgp->error($pgp->errstr); |
|
575
|
|
|
|
|
|
|
} |
|
576
|
23
|
50
|
|
|
|
202
|
my $msg = Crypt::OpenPGP::Message->new( Data => $data ) or |
|
577
|
|
|
|
|
|
|
return $pgp->error("Reading data packets failed: " . |
|
578
|
|
|
|
|
|
|
Crypt::OpenPGP::Message->errstr); |
|
579
|
23
|
|
|
|
|
84
|
my @pieces = $msg->pieces; |
|
580
|
23
|
50
|
|
|
|
73
|
return $pgp->error("No packets found in message") unless @pieces; |
|
581
|
23
|
|
|
|
|
93
|
while (ref($pieces[0]) eq 'Crypt::OpenPGP::Marker') { |
|
582
|
0
|
|
|
|
|
0
|
shift @pieces; |
|
583
|
|
|
|
|
|
|
} |
|
584
|
23
|
|
|
|
|
29
|
my($key, $alg); |
|
585
|
23
|
100
|
|
|
|
120
|
if (ref($pieces[0]) eq 'Crypt::OpenPGP::SessionKey') { |
|
|
|
50
|
|
|
|
|
|
|
586
|
12
|
|
|
|
|
27
|
my($sym_key, $cert, $ring) = (shift @pieces); |
|
587
|
12
|
100
|
|
|
|
49
|
unless ($cert = $param{Key}) { |
|
588
|
9
|
50
|
|
|
|
42
|
$ring = $pgp->secrings->[0] |
|
589
|
|
|
|
|
|
|
or return $pgp->error("No secret keyrings"); |
|
590
|
|
|
|
|
|
|
} |
|
591
|
12
|
|
|
|
|
27
|
my($kb); |
|
592
|
12
|
|
|
|
|
43
|
while (ref($sym_key) eq 'Crypt::OpenPGP::SessionKey') { |
|
593
|
14
|
100
|
|
|
|
35
|
if ($cert) { |
|
594
|
4
|
100
|
|
|
|
24
|
if ($cert->key_id eq $sym_key->key_id) { |
|
595
|
|
|
|
|
|
|
shift @pieces |
|
596
|
3
|
|
|
|
|
16
|
while ref($pieces[0]) eq 'Crypt::OpenPGP::SessionKey'; |
|
597
|
3
|
|
|
|
|
6
|
last; |
|
598
|
|
|
|
|
|
|
} |
|
599
|
|
|
|
|
|
|
} else { |
|
600
|
10
|
100
|
|
|
|
44
|
if ($kb = $ring->find_keyblock_by_keyid($sym_key->key_id)) { |
|
601
|
|
|
|
|
|
|
shift @pieces |
|
602
|
9
|
|
|
|
|
40
|
while ref($pieces[0]) eq 'Crypt::OpenPGP::SessionKey'; |
|
603
|
9
|
|
|
|
|
18
|
last; |
|
604
|
|
|
|
|
|
|
} |
|
605
|
|
|
|
|
|
|
} |
|
606
|
2
|
|
|
|
|
12
|
$sym_key = shift @pieces; |
|
607
|
|
|
|
|
|
|
} |
|
608
|
12
|
50
|
66
|
|
|
77
|
return $pgp->error("Can't find a secret key to decrypt message") |
|
609
|
|
|
|
|
|
|
unless $kb || $cert; |
|
610
|
12
|
100
|
|
|
|
54
|
if ($kb) { |
|
611
|
9
|
|
|
|
|
53
|
$cert = $kb->encrypting_key; |
|
612
|
9
|
|
|
|
|
44
|
$cert->uid($kb->primary_uid); |
|
613
|
|
|
|
|
|
|
} |
|
614
|
12
|
100
|
|
|
|
64
|
if ($cert->is_protected) { |
|
615
|
1
|
|
|
|
|
7
|
my $pass = $param{Passphrase}; |
|
616
|
1
|
50
|
33
|
|
|
5
|
if (!defined $pass && (my $cb = $param{PassphraseCallback})) { |
|
617
|
0
|
|
|
|
|
0
|
$pass = $cb->($cert); |
|
618
|
|
|
|
|
|
|
} |
|
619
|
1
|
50
|
|
|
|
5
|
return $pgp->error("Need passphrase to unlock secret key") |
|
620
|
|
|
|
|
|
|
unless $pass; |
|
621
|
1
|
50
|
|
|
|
6
|
$cert->unlock($pass) or |
|
622
|
|
|
|
|
|
|
return $pgp->error("Seckey unlock failed: " . $cert->errstr); |
|
623
|
|
|
|
|
|
|
} |
|
624
|
12
|
50
|
|
|
|
71
|
($key, $alg) = $sym_key->decrypt($cert) or |
|
625
|
|
|
|
|
|
|
return $pgp->error("Symkey decrypt failed: " . $sym_key->errstr); |
|
626
|
|
|
|
|
|
|
} |
|
627
|
|
|
|
|
|
|
elsif (ref($pieces[0]) eq 'Crypt::OpenPGP::SKSessionKey') { |
|
628
|
11
|
|
|
|
|
17
|
my $sym_key = shift @pieces; |
|
629
|
11
|
|
|
|
|
19
|
my $pass = $param{Passphrase}; |
|
630
|
11
|
50
|
33
|
|
|
51
|
if (!defined $pass && (my $cb = $param{PassphraseCallback})) { |
|
631
|
0
|
|
|
|
|
0
|
$pass = $cb->(); |
|
632
|
|
|
|
|
|
|
} |
|
633
|
11
|
50
|
|
|
|
23
|
return $pgp->error("Need passphrase to decrypt session key") |
|
634
|
|
|
|
|
|
|
unless $pass; |
|
635
|
11
|
50
|
|
|
|
32
|
($key, $alg) = $sym_key->decrypt($pass) or |
|
636
|
|
|
|
|
|
|
return $pgp->error("Symkey decrypt failed: " . $sym_key->errstr); |
|
637
|
|
|
|
|
|
|
} |
|
638
|
23
|
|
|
|
|
58
|
my $enc = $pieces[0]; |
|
639
|
|
|
|
|
|
|
|
|
640
|
|
|
|
|
|
|
## If there is still no symkey and symmetric algorithm, *and* the |
|
641
|
|
|
|
|
|
|
## first packet is a Crypt::OpenPGP::Ciphertext packet, assume that |
|
642
|
|
|
|
|
|
|
## the packet is encrypted using a symmetric key, using a 'Simple' s2k. |
|
643
|
23
|
50
|
33
|
|
|
113
|
if (!$key && !$alg && ref($enc) eq 'Crypt::OpenPGP::Ciphertext') { |
|
|
|
|
33
|
|
|
|
|
|
644
|
|
|
|
|
|
|
my $pass = $param{Passphrase} or |
|
645
|
0
|
0
|
|
|
|
0
|
return $pgp->error("Need passphrase to decrypt session key"); |
|
646
|
0
|
|
|
|
|
0
|
require Crypt::OpenPGP::Cipher; |
|
647
|
0
|
|
|
|
|
0
|
require Crypt::OpenPGP::S2k; |
|
648
|
0
|
|
|
|
|
0
|
my $ciph = Crypt::OpenPGP::Cipher->new('IDEA'); |
|
649
|
0
|
|
|
|
|
0
|
my $s2k = Crypt::OpenPGP::S2k->new('Simple'); |
|
650
|
0
|
|
|
|
|
0
|
$s2k->{hash} = Crypt::OpenPGP::Digest->new('MD5'); |
|
651
|
0
|
|
|
|
|
0
|
$key = $s2k->generate($pass, $ciph->keysize); |
|
652
|
0
|
|
|
|
|
0
|
$alg = $ciph->alg_id; |
|
653
|
|
|
|
|
|
|
} |
|
654
|
|
|
|
|
|
|
|
|
655
|
23
|
50
|
|
|
|
138
|
$data = $enc->decrypt($key, $alg) or |
|
656
|
|
|
|
|
|
|
return $pgp->error("Ciphertext decrypt failed: " . $enc->errstr); |
|
657
|
|
|
|
|
|
|
|
|
658
|
|
|
|
|
|
|
## This is a special hack: if decrypt gets a signed, encrypted message, |
|
659
|
|
|
|
|
|
|
## it needs to be able to pass back the decrypted text *and* a flag |
|
660
|
|
|
|
|
|
|
## saying whether the signature is valid or not. But in some cases, |
|
661
|
|
|
|
|
|
|
## you don't know ahead of time if there is a signature at all--and if |
|
662
|
|
|
|
|
|
|
## there isn't, there is no way of knowing whether the signature is valid, |
|
663
|
|
|
|
|
|
|
## or if there isn't a signature at all. So this prepopulates the internal |
|
664
|
|
|
|
|
|
|
## errstr with the string "No Signature\n"--if there is a signature, and |
|
665
|
|
|
|
|
|
|
## there is an error during verification, the second return value will be |
|
666
|
|
|
|
|
|
|
## undef, and the errstr will contain the error that occurred. If there is |
|
667
|
|
|
|
|
|
|
## *not* a signature, the second return value will still be undef, but |
|
668
|
|
|
|
|
|
|
## the errstr is guaranteed to be "No Signature\n". |
|
669
|
23
|
|
|
|
|
137
|
$pgp->error("No Signature"); |
|
670
|
|
|
|
|
|
|
|
|
671
|
23
|
|
|
|
|
34
|
my($valid, $sig); |
|
672
|
23
|
|
|
|
|
139
|
$msg = Crypt::OpenPGP::Message->new( Data => $data, |
|
673
|
|
|
|
|
|
|
IsPacketStream => 1 ); |
|
674
|
23
|
|
|
|
|
202
|
@pieces = $msg->pieces; |
|
675
|
|
|
|
|
|
|
|
|
676
|
|
|
|
|
|
|
## If the first packet in the decrypted data is compressed, |
|
677
|
|
|
|
|
|
|
## decompress it and set the list of packets to the result. |
|
678
|
23
|
100
|
|
|
|
99
|
if (ref($pieces[0]) eq 'Crypt::OpenPGP::Compressed') { |
|
679
|
1
|
50
|
|
|
|
5
|
$data = $pieces[0]->decompress or |
|
680
|
|
|
|
|
|
|
return $pgp->error("Decompression error: " . $pieces[0]->errstr); |
|
681
|
1
|
|
|
|
|
5
|
$msg = Crypt::OpenPGP::Message->new( Data => $data, |
|
682
|
|
|
|
|
|
|
IsPacketStream => 1 ); |
|
683
|
1
|
|
|
|
|
5
|
@pieces = $msg->pieces; |
|
684
|
|
|
|
|
|
|
} |
|
685
|
|
|
|
|
|
|
|
|
686
|
23
|
|
|
|
|
40
|
my($pt); |
|
687
|
23
|
100
|
66
|
|
|
151
|
if (ref($pieces[0]) eq 'Crypt::OpenPGP::OnePassSig' || |
|
688
|
|
|
|
|
|
|
ref($pieces[0]) eq 'Crypt::OpenPGP::Signature') { |
|
689
|
1
|
|
|
|
|
4
|
$pt = $pieces[1]; |
|
690
|
1
|
50
|
|
|
|
5
|
if ($wants_verify) { |
|
691
|
1
|
|
|
|
|
8
|
($valid, $sig) = |
|
692
|
|
|
|
|
|
|
$pgp->verify( Signature => $data, IsPacketStream => 1 ); |
|
693
|
|
|
|
|
|
|
} |
|
694
|
|
|
|
|
|
|
} else { |
|
695
|
22
|
|
|
|
|
33
|
$pt = $pieces[0]; |
|
696
|
|
|
|
|
|
|
} |
|
697
|
|
|
|
|
|
|
|
|
698
|
23
|
100
|
|
|
|
107
|
$wants_verify ? ($pt->data, $valid, $sig) : $pt->data; |
|
699
|
|
|
|
|
|
|
} |
|
700
|
|
|
|
|
|
|
|
|
701
|
|
|
|
|
|
|
sub keygen { |
|
702
|
2
|
|
|
2
|
1
|
1830
|
my $pgp = shift; |
|
703
|
2
|
|
|
|
|
17
|
my %param = @_; |
|
704
|
2
|
|
|
|
|
749
|
require Crypt::OpenPGP::Certificate; |
|
705
|
2
|
|
|
|
|
20
|
require Crypt::OpenPGP::Key; |
|
706
|
2
|
|
|
|
|
22
|
require Crypt::OpenPGP::KeyBlock; |
|
707
|
2
|
|
|
|
|
822
|
require Crypt::OpenPGP::Signature; |
|
708
|
2
|
|
|
|
|
782
|
require Crypt::OpenPGP::UserID; |
|
709
|
|
|
|
|
|
|
|
|
710
|
|
|
|
|
|
|
$param{Type} or |
|
711
|
2
|
50
|
|
|
|
17
|
return $pgp->error("Need a Type of key to generate"); |
|
712
|
2
|
|
50
|
|
|
8
|
$param{Size} ||= 1024; |
|
713
|
2
|
|
50
|
|
|
21
|
$param{Version} ||= 4; |
|
714
|
2
|
100
|
|
|
|
10
|
$param{Version} = 3 if $param{Type} eq 'RSA'; |
|
715
|
|
|
|
|
|
|
|
|
716
|
2
|
|
|
|
|
24
|
my $kb_pub = Crypt::OpenPGP::KeyBlock->new; |
|
717
|
2
|
|
|
|
|
9
|
my $kb_sec = Crypt::OpenPGP::KeyBlock->new; |
|
718
|
|
|
|
|
|
|
|
|
719
|
2
|
|
|
|
|
27
|
my($pub, $sec) = Crypt::OpenPGP::Key->keygen($param{Type}, %param); |
|
720
|
2
|
50
|
33
|
|
|
24
|
die Crypt::OpenPGP::Key->errstr unless $pub && $sec; |
|
721
|
|
|
|
|
|
|
my $pubcert = Crypt::OpenPGP::Certificate->new( |
|
722
|
|
|
|
|
|
|
Key => $pub, |
|
723
|
|
|
|
|
|
|
Version => $param{Version} |
|
724
|
2
|
50
|
|
|
|
25
|
) or |
|
725
|
|
|
|
|
|
|
die Crypt::OpenPGP::Certificate->errstr; |
|
726
|
|
|
|
|
|
|
my $seccert = Crypt::OpenPGP::Certificate->new( |
|
727
|
|
|
|
|
|
|
Key => $sec, |
|
728
|
|
|
|
|
|
|
Passphrase => $param{Passphrase}, |
|
729
|
|
|
|
|
|
|
Version => $param{Version} |
|
730
|
2
|
50
|
|
|
|
19
|
) or |
|
731
|
|
|
|
|
|
|
die Crypt::OpenPGP::Certificate->errstr; |
|
732
|
2
|
|
|
|
|
15
|
$kb_pub->add($pubcert); |
|
733
|
2
|
|
|
|
|
11
|
$kb_sec->add($seccert); |
|
734
|
|
|
|
|
|
|
|
|
735
|
2
|
|
|
|
|
36
|
my $id = Crypt::OpenPGP::UserID->new( Identity => $param{Identity} ); |
|
736
|
2
|
|
|
|
|
12
|
$kb_pub->add($id); |
|
737
|
2
|
|
|
|
|
9
|
$kb_sec->add($id); |
|
738
|
|
|
|
|
|
|
|
|
739
|
|
|
|
|
|
|
my $sig = Crypt::OpenPGP::Signature->new( |
|
740
|
|
|
|
|
|
|
Data => [ $pubcert, $id ], |
|
741
|
|
|
|
|
|
|
Key => $seccert, |
|
742
|
|
|
|
|
|
|
Version => $param{Version}, |
|
743
|
2
|
|
|
|
|
32
|
Type => 0x13, |
|
744
|
|
|
|
|
|
|
); |
|
745
|
2
|
|
|
|
|
15
|
$kb_pub->add($sig); |
|
746
|
2
|
|
|
|
|
6
|
$kb_sec->add($sig); |
|
747
|
|
|
|
|
|
|
|
|
748
|
2
|
|
|
|
|
22
|
($kb_pub, $kb_sec); |
|
749
|
|
|
|
|
|
|
} |
|
750
|
|
|
|
|
|
|
|
|
751
|
|
|
|
|
|
|
sub _read_files { |
|
752
|
1
|
|
|
1
|
|
3
|
my $pgp = shift; |
|
753
|
1
|
50
|
|
|
|
4
|
return $pgp->error("No files specified") unless @_; |
|
754
|
1
|
|
|
|
|
3
|
my @files = @_; |
|
755
|
1
|
|
|
|
|
2
|
my $data = ''; |
|
756
|
1
|
|
|
|
|
6
|
for my $file (@files) { |
|
757
|
1
|
|
50
|
|
|
9
|
$file ||= ''; |
|
758
|
1
|
|
|
|
|
4
|
local *FH; |
|
759
|
1
|
50
|
|
|
|
43
|
open FH, $file or return $pgp->error("Error opening $file: $!"); |
|
760
|
0
|
|
|
|
|
0
|
binmode FH; |
|
761
|
0
|
|
|
|
|
0
|
{ local $/; $data .= <FH> } |
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
762
|
0
|
0
|
|
|
|
0
|
close FH or warn "Warning: Got error closing $file: $!"; |
|
763
|
|
|
|
|
|
|
} |
|
764
|
0
|
|
|
|
|
0
|
$data; |
|
765
|
|
|
|
|
|
|
} |
|
766
|
|
|
|
|
|
|
|
|
767
|
|
|
|
|
|
|
{ |
|
768
|
|
|
|
|
|
|
my @MERGE_CONFIG = qw( Cipher Armour Digest ); |
|
769
|
|
|
|
|
|
|
sub _merge_compat { |
|
770
|
29
|
|
|
29
|
|
60
|
my $pgp = shift; |
|
771
|
29
|
|
|
|
|
71
|
my($param, $meth) = @_; |
|
772
|
29
|
|
50
|
|
|
263
|
my $compat = $param->{Compat} || $pgp->{cfg}->get('Compat') || return 1; |
|
773
|
0
|
0
|
|
|
|
|
my $ref = $COMPAT{$compat}{$meth} or |
|
774
|
|
|
|
|
|
|
return $pgp->error("No settings for Compat class '$compat'"); |
|
775
|
0
|
|
|
|
|
|
for my $arg (keys %$ref) { |
|
776
|
0
|
0
|
|
|
|
|
$param->{$arg} = $ref->{$arg} unless exists $param->{$arg}; |
|
777
|
|
|
|
|
|
|
} |
|
778
|
0
|
|
|
|
|
|
for my $key (@MERGE_CONFIG) { |
|
779
|
|
|
|
|
|
|
$param->{$key} = $pgp->{cfg}->get($key) |
|
780
|
0
|
0
|
|
|
|
|
unless exists $param->{$key}; |
|
781
|
|
|
|
|
|
|
} |
|
782
|
0
|
|
|
|
|
|
1; |
|
783
|
|
|
|
|
|
|
} |
|
784
|
|
|
|
|
|
|
} |
|
785
|
|
|
|
|
|
|
|
|
786
|
|
|
|
|
|
|
1; |
|
787
|
|
|
|
|
|
|
|
|
788
|
|
|
|
|
|
|
__END__ |
|
789
|
|
|
|
|
|
|
|
|
790
|
|
|
|
|
|
|
=head1 NAME |
|
791
|
|
|
|
|
|
|
|
|
792
|
|
|
|
|
|
|
Crypt::OpenPGP - Pure-Perl OpenPGP implementation |
|
793
|
|
|
|
|
|
|
|
|
794
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
795
|
|
|
|
|
|
|
|
|
796
|
|
|
|
|
|
|
my $pgp = Crypt::OpenPGP->new; |
|
797
|
|
|
|
|
|
|
|
|
798
|
|
|
|
|
|
|
# Given an input stream (could be a signature, ciphertext, etc), |
|
799
|
|
|
|
|
|
|
# do the "right thing" to it. |
|
800
|
|
|
|
|
|
|
my $message_body; $message_body .= $_ while <STDIN>; |
|
801
|
|
|
|
|
|
|
my $result = $pgp->handle( Data => $message_body ); |
|
802
|
|
|
|
|
|
|
|
|
803
|
|
|
|
|
|
|
# Create a detached, ASCII-armoured signature of $file using the |
|
804
|
|
|
|
|
|
|
# secret key $key_id, protected with the passphrase $pass. |
|
805
|
|
|
|
|
|
|
my $file = 'really-from-me.txt'; |
|
806
|
|
|
|
|
|
|
my $key_id = '...'; |
|
807
|
|
|
|
|
|
|
my $pass = 'foo bar'; |
|
808
|
|
|
|
|
|
|
my $signature = $pgp->sign( |
|
809
|
|
|
|
|
|
|
Filename => $file, |
|
810
|
|
|
|
|
|
|
KeyID => $key_id, |
|
811
|
|
|
|
|
|
|
Passphrase => $pass, |
|
812
|
|
|
|
|
|
|
Detach => 1, |
|
813
|
|
|
|
|
|
|
Armour => 1, |
|
814
|
|
|
|
|
|
|
); |
|
815
|
|
|
|
|
|
|
|
|
816
|
|
|
|
|
|
|
# Verify the detached signature $signature, which should be of the |
|
817
|
|
|
|
|
|
|
# source file $file. |
|
818
|
|
|
|
|
|
|
my $is_valid = $pgp->verify( |
|
819
|
|
|
|
|
|
|
Signature => $signature, |
|
820
|
|
|
|
|
|
|
Files => [ $file ], |
|
821
|
|
|
|
|
|
|
); |
|
822
|
|
|
|
|
|
|
|
|
823
|
|
|
|
|
|
|
# Using the public key associated with $key_id, encrypt the contents |
|
824
|
|
|
|
|
|
|
# of the file $file, and ASCII-armour the ciphertext. |
|
825
|
|
|
|
|
|
|
my $ciphertext = $pgp->encrypt( |
|
826
|
|
|
|
|
|
|
Filename => $file, |
|
827
|
|
|
|
|
|
|
Recipients => $key_id, |
|
828
|
|
|
|
|
|
|
Armour => 1, |
|
829
|
|
|
|
|
|
|
); |
|
830
|
|
|
|
|
|
|
|
|
831
|
|
|
|
|
|
|
# Decrypt $ciphertext using the secret key used to encrypt it, |
|
832
|
|
|
|
|
|
|
# which key is protected with the passphrase $pass. |
|
833
|
|
|
|
|
|
|
my $plaintext = $pgp->decrypt( |
|
834
|
|
|
|
|
|
|
Data => $ciphertext, |
|
835
|
|
|
|
|
|
|
Passphrase => $pass, |
|
836
|
|
|
|
|
|
|
); |
|
837
|
|
|
|
|
|
|
|
|
838
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
839
|
|
|
|
|
|
|
|
|
840
|
|
|
|
|
|
|
I<Crypt::OpenPGP> is a pure-Perl implementation of the OpenPGP |
|
841
|
|
|
|
|
|
|
standard[1]. In addition to support for the standard itself, |
|
842
|
|
|
|
|
|
|
I<Crypt::OpenPGP> claims compatibility with many other PGP implementations, |
|
843
|
|
|
|
|
|
|
both those that support the standard and those that preceded it. |
|
844
|
|
|
|
|
|
|
|
|
845
|
|
|
|
|
|
|
I<Crypt::OpenPGP> provides signing/verification, encryption/decryption, |
|
846
|
|
|
|
|
|
|
keyring management, and key-pair generation; in short it should provide |
|
847
|
|
|
|
|
|
|
you with everything you need to PGP-enable yourself. Alternatively it |
|
848
|
|
|
|
|
|
|
can be used as part of a larger system; for example, perhaps you have |
|
849
|
|
|
|
|
|
|
a web-form-to-email generator written in Perl, and you'd like to encrypt |
|
850
|
|
|
|
|
|
|
outgoing messages, because they contain sensitive information. |
|
851
|
|
|
|
|
|
|
I<Crypt::OpenPGP> can be plugged into such a scenario, given your public |
|
852
|
|
|
|
|
|
|
key, and told to encrypt all messages; they will then be readable only |
|
853
|
|
|
|
|
|
|
by you. |
|
854
|
|
|
|
|
|
|
|
|
855
|
|
|
|
|
|
|
This module currently supports C<RSA> and C<DSA> for digital signatures, |
|
856
|
|
|
|
|
|
|
and C<RSA> and C<ElGamal> for encryption/decryption. It supports the |
|
857
|
|
|
|
|
|
|
symmetric ciphers C<3DES>, C<Blowfish>, C<IDEA>, C<Twofish>, C<CAST5>, and |
|
858
|
|
|
|
|
|
|
C<Rijndael> (C<AES>). C<Rijndael> is supported for key sizes of C<128>, |
|
859
|
|
|
|
|
|
|
C<192>, and C<256> bits. I<Crypt::OpenPGP> supports the digest algorithms |
|
860
|
|
|
|
|
|
|
C<MD5>, C<SHA-1>, and C<RIPE-MD/160>. And it supports C<ZIP> and C<Zlib> |
|
861
|
|
|
|
|
|
|
compression. |
|
862
|
|
|
|
|
|
|
|
|
863
|
|
|
|
|
|
|
=head1 COMPATIBILITY |
|
864
|
|
|
|
|
|
|
|
|
865
|
|
|
|
|
|
|
One of the highest priorities for I<Crypt::OpenPGP> is compatibility with |
|
866
|
|
|
|
|
|
|
other PGP implementations, including PGP implementations that existed |
|
867
|
|
|
|
|
|
|
before the OpenPGP standard. |
|
868
|
|
|
|
|
|
|
|
|
869
|
|
|
|
|
|
|
As a means towards that end, some of the high-level I<Crypt::OpenPGP> |
|
870
|
|
|
|
|
|
|
methods can be used in compatibility mode; given an argument I<Compat> |
|
871
|
|
|
|
|
|
|
and a PGP implementation with which they should be compatible, these |
|
872
|
|
|
|
|
|
|
method will do their best to choose ciphers, digest algorithms, etc. that |
|
873
|
|
|
|
|
|
|
are compatible with that implementation. For example, PGP2 only supports |
|
874
|
|
|
|
|
|
|
C<IDEA> encryption, C<MD5> digests, and version 3 signature formats; if |
|
875
|
|
|
|
|
|
|
you tell I<Crypt::OpenPGP> that it must be compatible with PGP2, it will |
|
876
|
|
|
|
|
|
|
only use these algorithms/formats when encrypting and signing data. |
|
877
|
|
|
|
|
|
|
|
|
878
|
|
|
|
|
|
|
To use this feature, supply either I<sign> or I<encrypt> with the |
|
879
|
|
|
|
|
|
|
I<Compat> parameter, giving it one of the values from the list below. |
|
880
|
|
|
|
|
|
|
For example: |
|
881
|
|
|
|
|
|
|
|
|
882
|
|
|
|
|
|
|
my $ct = $pgp->encrypt( |
|
883
|
|
|
|
|
|
|
Compat => 'PGP2', |
|
884
|
|
|
|
|
|
|
Filename => 'foo.pl', |
|
885
|
|
|
|
|
|
|
Recipients => $key_id, |
|
886
|
|
|
|
|
|
|
); |
|
887
|
|
|
|
|
|
|
|
|
888
|
|
|
|
|
|
|
Because I<PGP2> was specified, the data will automatically be encrypted |
|
889
|
|
|
|
|
|
|
using the C<IDEA> cipher, and will be compressed using C<ZIP>. |
|
890
|
|
|
|
|
|
|
|
|
891
|
|
|
|
|
|
|
Here is a list of the current compatibility sets and the algorithms and |
|
892
|
|
|
|
|
|
|
formats they support. |
|
893
|
|
|
|
|
|
|
|
|
894
|
|
|
|
|
|
|
=over 4 |
|
895
|
|
|
|
|
|
|
|
|
896
|
|
|
|
|
|
|
=item * PGP2 |
|
897
|
|
|
|
|
|
|
|
|
898
|
|
|
|
|
|
|
Encryption: symmetric cipher = C<IDEA>, compression = C<ZIP>, |
|
899
|
|
|
|
|
|
|
modification detection code (MDC) = C<0> |
|
900
|
|
|
|
|
|
|
|
|
901
|
|
|
|
|
|
|
Signing: digest = C<MD5>, packet format = version 3 |
|
902
|
|
|
|
|
|
|
|
|
903
|
|
|
|
|
|
|
=item * PGP5 |
|
904
|
|
|
|
|
|
|
|
|
905
|
|
|
|
|
|
|
Encryption: symmetric cipher = C<3DES>, compression = C<ZIP>, |
|
906
|
|
|
|
|
|
|
modification detection code (MDC) = C<0> |
|
907
|
|
|
|
|
|
|
|
|
908
|
|
|
|
|
|
|
Signing: digest = C<SHA-1>, packet format = version 3 |
|
909
|
|
|
|
|
|
|
|
|
910
|
|
|
|
|
|
|
=item * GnuPG |
|
911
|
|
|
|
|
|
|
|
|
912
|
|
|
|
|
|
|
Encryption: symmetric cipher = C<Rijndael>, compression = C<Zlib>, |
|
913
|
|
|
|
|
|
|
modification detection code (MDC) = C<1> |
|
914
|
|
|
|
|
|
|
|
|
915
|
|
|
|
|
|
|
Signing: digest = C<RIPE-MD/160>, packet format = version 4 |
|
916
|
|
|
|
|
|
|
|
|
917
|
|
|
|
|
|
|
=back |
|
918
|
|
|
|
|
|
|
|
|
919
|
|
|
|
|
|
|
If the compatibility setting is unspecified (that is, if no I<Compat> |
|
920
|
|
|
|
|
|
|
argument is supplied), the settings (ciphers, digests, etc.) fall |
|
921
|
|
|
|
|
|
|
back to their default settings. |
|
922
|
|
|
|
|
|
|
|
|
923
|
|
|
|
|
|
|
=head1 USAGE |
|
924
|
|
|
|
|
|
|
|
|
925
|
|
|
|
|
|
|
I<Crypt::OpenPGP> has the following high-level interface. On failure, |
|
926
|
|
|
|
|
|
|
all methods will return C<undef> and set the I<errstr> for the object; |
|
927
|
|
|
|
|
|
|
look below at the I<ERROR HANDLING> section for more information. |
|
928
|
|
|
|
|
|
|
|
|
929
|
|
|
|
|
|
|
=head2 Crypt::OpenPGP->new( %args ) |
|
930
|
|
|
|
|
|
|
|
|
931
|
|
|
|
|
|
|
Constructs a new I<Crypt::OpenPGP> instance and returns that object. |
|
932
|
|
|
|
|
|
|
Returns C<undef> on failure. |
|
933
|
|
|
|
|
|
|
|
|
934
|
|
|
|
|
|
|
I<%args> can contain: |
|
935
|
|
|
|
|
|
|
|
|
936
|
|
|
|
|
|
|
=over 4 |
|
937
|
|
|
|
|
|
|
|
|
938
|
|
|
|
|
|
|
=item * Compat |
|
939
|
|
|
|
|
|
|
|
|
940
|
|
|
|
|
|
|
The compatibility mode for this I<Crypt::OpenPGP> object. This value will |
|
941
|
|
|
|
|
|
|
propagate down into method calls upon this object, meaning that it will be |
|
942
|
|
|
|
|
|
|
applied for all method calls invoked on this object. For example, if you set |
|
943
|
|
|
|
|
|
|
I<Compat> here, you do not have to set it again when calling I<encrypt> |
|
944
|
|
|
|
|
|
|
or I<sign> (below), unless, of course, you want to set I<Compat> to a |
|
945
|
|
|
|
|
|
|
different value for those methods. |
|
946
|
|
|
|
|
|
|
|
|
947
|
|
|
|
|
|
|
I<Compat> influences several factors upon object creation, unless otherwise |
|
948
|
|
|
|
|
|
|
overridden in the constructor arguments: if you have a configuration file |
|
949
|
|
|
|
|
|
|
for this compatibility mode (eg. F<~/.gnupg/options> for GnuPG), it will |
|
950
|
|
|
|
|
|
|
be automatically read in, and I<Crypt::OpenPGP> will set any options |
|
951
|
|
|
|
|
|
|
relevant to its execution (symmetric cipher algorithm, etc.); I<PubRing> |
|
952
|
|
|
|
|
|
|
and I<SecRing> (below) are set according to the default values for this |
|
953
|
|
|
|
|
|
|
compatibility mode (eg. F<~/.gnupg/pubring.gpg> for the GnuPG public |
|
954
|
|
|
|
|
|
|
keyring). |
|
955
|
|
|
|
|
|
|
|
|
956
|
|
|
|
|
|
|
=item * SecRing |
|
957
|
|
|
|
|
|
|
|
|
958
|
|
|
|
|
|
|
Path to your secret keyring. If unspecified, I<Crypt::OpenPGP> will look |
|
959
|
|
|
|
|
|
|
for your keyring in a number of default places. |
|
960
|
|
|
|
|
|
|
|
|
961
|
|
|
|
|
|
|
As an alternative to passing in a path to the keyring file, you can pass in |
|
962
|
|
|
|
|
|
|
a I<Crypt::OpenPGP::KeyRing> object representing a secret keyring. |
|
963
|
|
|
|
|
|
|
|
|
964
|
|
|
|
|
|
|
=item * PubRing |
|
965
|
|
|
|
|
|
|
|
|
966
|
|
|
|
|
|
|
Path to your public keyring. If unspecified, I<Crypt::OpenPGP> will look |
|
967
|
|
|
|
|
|
|
for your keyring in a number of default places. |
|
968
|
|
|
|
|
|
|
|
|
969
|
|
|
|
|
|
|
As an alternative to passing in a path to the keyring file, you can pass in |
|
970
|
|
|
|
|
|
|
a I<Crypt::OpenPGP::KeyRing> object representing a public keyring. |
|
971
|
|
|
|
|
|
|
|
|
972
|
|
|
|
|
|
|
=item * ConfigFile |
|
973
|
|
|
|
|
|
|
|
|
974
|
|
|
|
|
|
|
Path to a PGP/GnuPG config file. If specified, you must also pass in a |
|
975
|
|
|
|
|
|
|
value for the I<Compat> parameter, stating what format config file you are |
|
976
|
|
|
|
|
|
|
passing in. For example, if you are passing in the path to a GnuPG config |
|
977
|
|
|
|
|
|
|
file, you should give a value of C<GnuPG> for the I<Compat> flag. |
|
978
|
|
|
|
|
|
|
|
|
979
|
|
|
|
|
|
|
If you leave I<ConfigFile> unspecified, but you have specified a value for |
|
980
|
|
|
|
|
|
|
I<Compat>, I<Crypt::OpenPGP> will try to find your config file, based on |
|
981
|
|
|
|
|
|
|
the value of I<Compat> that you pass in (eg. F<~/.gnupg/options> if |
|
982
|
|
|
|
|
|
|
I<Compat> is C<GnuPG>). |
|
983
|
|
|
|
|
|
|
|
|
984
|
|
|
|
|
|
|
NOTE: if you do not specify a I<Compat> flag, I<Crypt::OpenPGP> cannot read |
|
985
|
|
|
|
|
|
|
any configuration files, even if you I<have> specified a value for the |
|
986
|
|
|
|
|
|
|
I<ConfigFile> parameter, because it will not be able to determine the proper |
|
987
|
|
|
|
|
|
|
config file format. |
|
988
|
|
|
|
|
|
|
|
|
989
|
|
|
|
|
|
|
=item * KeyServer |
|
990
|
|
|
|
|
|
|
|
|
991
|
|
|
|
|
|
|
The hostname of the HKP keyserver. You can get a list of keyservers through |
|
992
|
|
|
|
|
|
|
|
|
993
|
|
|
|
|
|
|
% host -l pgp.net | grep wwwkeys |
|
994
|
|
|
|
|
|
|
|
|
995
|
|
|
|
|
|
|
If I<AutoKeyRetrieve> is set to a true value, |
|
996
|
|
|
|
|
|
|
keys will be automatically retrieved from the keyserver if they are not found |
|
997
|
|
|
|
|
|
|
in your local keyring. |
|
998
|
|
|
|
|
|
|
|
|
999
|
|
|
|
|
|
|
=item * AutoKeyRetrieve |
|
1000
|
|
|
|
|
|
|
|
|
1001
|
|
|
|
|
|
|
If set to a true value, and if I<KeyServer> is set to a keyserver name, |
|
1002
|
|
|
|
|
|
|
I<encrypt> and I<verify> will automatically try to fetch public keys from |
|
1003
|
|
|
|
|
|
|
the keyserver if they are not found in your local keyring. |
|
1004
|
|
|
|
|
|
|
|
|
1005
|
|
|
|
|
|
|
=back |
|
1006
|
|
|
|
|
|
|
|
|
1007
|
|
|
|
|
|
|
=head2 $pgp->handle( %args ) |
|
1008
|
|
|
|
|
|
|
|
|
1009
|
|
|
|
|
|
|
A do-what-I-mean wrapper around I<decrypt> and I<verify>. Given either a |
|
1010
|
|
|
|
|
|
|
filename or a block of data--for example, data from an incoming email |
|
1011
|
|
|
|
|
|
|
message--I<handle> "handles" it as appropriate for whatever encryption or |
|
1012
|
|
|
|
|
|
|
signing the message contains. For example, if the data is encrypted, I<handle> |
|
1013
|
|
|
|
|
|
|
will return the decrypted data (after prompting you for the passphrase). If |
|
1014
|
|
|
|
|
|
|
the data is signed, I<handle> will check the validity of the signature and |
|
1015
|
|
|
|
|
|
|
return indication of the validity of the signature. |
|
1016
|
|
|
|
|
|
|
|
|
1017
|
|
|
|
|
|
|
The return value is a reference to a hash, which may contain the following |
|
1018
|
|
|
|
|
|
|
keys, depending on the data passed to the method: |
|
1019
|
|
|
|
|
|
|
|
|
1020
|
|
|
|
|
|
|
=over 4 |
|
1021
|
|
|
|
|
|
|
|
|
1022
|
|
|
|
|
|
|
=item * Plaintext |
|
1023
|
|
|
|
|
|
|
|
|
1024
|
|
|
|
|
|
|
If the data is encrypted, the decrypted message. |
|
1025
|
|
|
|
|
|
|
|
|
1026
|
|
|
|
|
|
|
=item * Validity |
|
1027
|
|
|
|
|
|
|
|
|
1028
|
|
|
|
|
|
|
If the data is signed, a true value if the signature is valid, a false value |
|
1029
|
|
|
|
|
|
|
otherwise. The true value will be either the signer's email address, if |
|
1030
|
|
|
|
|
|
|
available, or C<1>, if not. |
|
1031
|
|
|
|
|
|
|
|
|
1032
|
|
|
|
|
|
|
=item * Signature |
|
1033
|
|
|
|
|
|
|
|
|
1034
|
|
|
|
|
|
|
If the data is signed, the I<Crypt::OpenPGP::Signature> object representing |
|
1035
|
|
|
|
|
|
|
the signature. |
|
1036
|
|
|
|
|
|
|
|
|
1037
|
|
|
|
|
|
|
=back |
|
1038
|
|
|
|
|
|
|
|
|
1039
|
|
|
|
|
|
|
If an error occurs, the return value will be C<undef>, and the error message |
|
1040
|
|
|
|
|
|
|
can be obtained by calling I<errstr> on the I<Crypt::OpenPGP> object. |
|
1041
|
|
|
|
|
|
|
|
|
1042
|
|
|
|
|
|
|
I<%args> can contain: |
|
1043
|
|
|
|
|
|
|
|
|
1044
|
|
|
|
|
|
|
=over 4 |
|
1045
|
|
|
|
|
|
|
|
|
1046
|
|
|
|
|
|
|
=item * Data |
|
1047
|
|
|
|
|
|
|
|
|
1048
|
|
|
|
|
|
|
The data to be "handled". This should be a simple scalar containing an |
|
1049
|
|
|
|
|
|
|
arbitrary amount of data. |
|
1050
|
|
|
|
|
|
|
|
|
1051
|
|
|
|
|
|
|
I<Data> is optional; if unspecified, you should specify a filename (see |
|
1052
|
|
|
|
|
|
|
I<Filename>, below). |
|
1053
|
|
|
|
|
|
|
|
|
1054
|
|
|
|
|
|
|
=item * Filename |
|
1055
|
|
|
|
|
|
|
|
|
1056
|
|
|
|
|
|
|
The path to a file to "handle". |
|
1057
|
|
|
|
|
|
|
|
|
1058
|
|
|
|
|
|
|
I<Filename> is optional; if unspecified, you should specify the data |
|
1059
|
|
|
|
|
|
|
in I<Data>, above. If both I<Data> and I<Filename> are specified, the |
|
1060
|
|
|
|
|
|
|
data in I<Data> overrides that in I<Filename>. |
|
1061
|
|
|
|
|
|
|
|
|
1062
|
|
|
|
|
|
|
=item * PassphraseCallback |
|
1063
|
|
|
|
|
|
|
|
|
1064
|
|
|
|
|
|
|
If the data is encrypted, you will need to supply I<handle> with the proper |
|
1065
|
|
|
|
|
|
|
passphrase to unlock the private key, or the password to decrypt the |
|
1066
|
|
|
|
|
|
|
symmetrically-encrypted data (depending on the method of encryption used). |
|
1067
|
|
|
|
|
|
|
If you do not specify this parameter, this default passphrase callback will be |
|
1068
|
|
|
|
|
|
|
used: |
|
1069
|
|
|
|
|
|
|
|
|
1070
|
|
|
|
|
|
|
sub _default_passphrase_cb { |
|
1071
|
|
|
|
|
|
|
my($cert) = @_; |
|
1072
|
|
|
|
|
|
|
my $prompt; |
|
1073
|
|
|
|
|
|
|
if ($cert) { |
|
1074
|
|
|
|
|
|
|
$prompt = sprintf qq( |
|
1075
|
|
|
|
|
|
|
You need a passphrase to unlock the secret key for |
|
1076
|
|
|
|
|
|
|
user "%s". |
|
1077
|
|
|
|
|
|
|
%d-bit %s key, ID %s |
|
1078
|
|
|
|
|
|
|
|
|
1079
|
|
|
|
|
|
|
Enter passphrase: ), $cert->uid, |
|
1080
|
|
|
|
|
|
|
$cert->key->size, |
|
1081
|
|
|
|
|
|
|
$cert->key->alg, |
|
1082
|
|
|
|
|
|
|
substr($cert->key_id_hex, -8, 8); |
|
1083
|
|
|
|
|
|
|
} else { |
|
1084
|
|
|
|
|
|
|
$prompt = "Enter passphrase: "; |
|
1085
|
|
|
|
|
|
|
} |
|
1086
|
|
|
|
|
|
|
_prompt($prompt, '', 1); |
|
1087
|
|
|
|
|
|
|
} |
|
1088
|
|
|
|
|
|
|
|
|
1089
|
|
|
|
|
|
|
If you do specify this parameter, make sure that your callback function can |
|
1090
|
|
|
|
|
|
|
handle both asymmetric and symmetric encryption. |
|
1091
|
|
|
|
|
|
|
|
|
1092
|
|
|
|
|
|
|
See the I<PassphraseCallback> parameter for I<decrypt>, below. |
|
1093
|
|
|
|
|
|
|
|
|
1094
|
|
|
|
|
|
|
=back |
|
1095
|
|
|
|
|
|
|
|
|
1096
|
|
|
|
|
|
|
=head2 $pgp->encrypt( %args ) |
|
1097
|
|
|
|
|
|
|
|
|
1098
|
|
|
|
|
|
|
Encrypts a block of data. The encryption is actually done with a symmetric |
|
1099
|
|
|
|
|
|
|
cipher; the key for the symmetric cipher is then encrypted with either |
|
1100
|
|
|
|
|
|
|
the public key of the recipient or using a passphrase that you enter. The |
|
1101
|
|
|
|
|
|
|
former case is using public-key cryptography, the latter, standard |
|
1102
|
|
|
|
|
|
|
symmetric ciphers. In the first case, the session key can only be |
|
1103
|
|
|
|
|
|
|
unlocked by someone with the corresponding secret key; in the second, it |
|
1104
|
|
|
|
|
|
|
can only be unlocked by someone who knows the passphrase. |
|
1105
|
|
|
|
|
|
|
|
|
1106
|
|
|
|
|
|
|
Given the parameter I<SignKeyID> (see below), I<encrypt> will first sign |
|
1107
|
|
|
|
|
|
|
the message before encrypting it, adding a Signature packet to the |
|
1108
|
|
|
|
|
|
|
encrypted plaintext. |
|
1109
|
|
|
|
|
|
|
|
|
1110
|
|
|
|
|
|
|
Returns a block of data containing two PGP packets: the encrypted |
|
1111
|
|
|
|
|
|
|
symmetric key and the encrypted data. |
|
1112
|
|
|
|
|
|
|
|
|
1113
|
|
|
|
|
|
|
On failure returns C<undef>. |
|
1114
|
|
|
|
|
|
|
|
|
1115
|
|
|
|
|
|
|
I<%args> can contain: |
|
1116
|
|
|
|
|
|
|
|
|
1117
|
|
|
|
|
|
|
=over 4 |
|
1118
|
|
|
|
|
|
|
|
|
1119
|
|
|
|
|
|
|
=item * Compat |
|
1120
|
|
|
|
|
|
|
|
|
1121
|
|
|
|
|
|
|
Specifies the PGP compatibility setting. See I<COMPATIBILITY>, above. |
|
1122
|
|
|
|
|
|
|
|
|
1123
|
|
|
|
|
|
|
=item * Data |
|
1124
|
|
|
|
|
|
|
|
|
1125
|
|
|
|
|
|
|
The plaintext to be encrypted. This should be a simple scalar containing |
|
1126
|
|
|
|
|
|
|
an arbitrary amount of data. |
|
1127
|
|
|
|
|
|
|
|
|
1128
|
|
|
|
|
|
|
I<Data> is optional; if unspecified, you should specify a filename (see |
|
1129
|
|
|
|
|
|
|
I<Filename>, below). |
|
1130
|
|
|
|
|
|
|
|
|
1131
|
|
|
|
|
|
|
=item * Filename |
|
1132
|
|
|
|
|
|
|
|
|
1133
|
|
|
|
|
|
|
The path to a file to encrypt. |
|
1134
|
|
|
|
|
|
|
|
|
1135
|
|
|
|
|
|
|
I<Filename> is optional; if unspecified, you should specify the data |
|
1136
|
|
|
|
|
|
|
in I<Data>, above. If both I<Data> and I<Filename> are specified, the |
|
1137
|
|
|
|
|
|
|
data in I<Data> overrides that in I<Filename>. |
|
1138
|
|
|
|
|
|
|
|
|
1139
|
|
|
|
|
|
|
=item * Recipients |
|
1140
|
|
|
|
|
|
|
|
|
1141
|
|
|
|
|
|
|
The intended recipients of the encrypted message. In other words, |
|
1142
|
|
|
|
|
|
|
either the key IDs or user IDs of the public keys that should be used |
|
1143
|
|
|
|
|
|
|
to encrypt the message. Each recipient specified should be either a |
|
1144
|
|
|
|
|
|
|
key ID--an 8-digit or 16-digit hexadecimal number--or part of a user |
|
1145
|
|
|
|
|
|
|
ID that can be used to look up the user's public key in your keyring. |
|
1146
|
|
|
|
|
|
|
Examples: |
|
1147
|
|
|
|
|
|
|
|
|
1148
|
|
|
|
|
|
|
8-digit hex key ID: 123ABC45 |
|
1149
|
|
|
|
|
|
|
16-digit hex key ID: 678DEF90123ABC45 |
|
1150
|
|
|
|
|
|
|
(Part of) User ID: foo@bar |
|
1151
|
|
|
|
|
|
|
|
|
1152
|
|
|
|
|
|
|
Note that the 8-digit hex key ID is the last 8 digits of the (long) |
|
1153
|
|
|
|
|
|
|
16-digit hex key ID. |
|
1154
|
|
|
|
|
|
|
|
|
1155
|
|
|
|
|
|
|
If you wish to encrypt the message for multiple recipients, the value |
|
1156
|
|
|
|
|
|
|
of I<Recipients> should be a reference to a list of recipients (as |
|
1157
|
|
|
|
|
|
|
defined above). For each recipient in the list, the public key will be |
|
1158
|
|
|
|
|
|
|
looked up in your public keyring, and an encrypted session key packet |
|
1159
|
|
|
|
|
|
|
will be added to the encrypted message. |
|
1160
|
|
|
|
|
|
|
|
|
1161
|
|
|
|
|
|
|
This argument is optional; if not provided you should provide the |
|
1162
|
|
|
|
|
|
|
I<Passphrase> option (below) to perform symmetric-key encryption when |
|
1163
|
|
|
|
|
|
|
encrypting the session key. |
|
1164
|
|
|
|
|
|
|
|
|
1165
|
|
|
|
|
|
|
=item * KeyID |
|
1166
|
|
|
|
|
|
|
|
|
1167
|
|
|
|
|
|
|
A deprecated alias for I<Recipients> (above). There is no need to use |
|
1168
|
|
|
|
|
|
|
I<KeyID>, as its functionality has been completely subsumed into the |
|
1169
|
|
|
|
|
|
|
I<Recipients> parameter. |
|
1170
|
|
|
|
|
|
|
|
|
1171
|
|
|
|
|
|
|
=item * Passphrase |
|
1172
|
|
|
|
|
|
|
|
|
1173
|
|
|
|
|
|
|
The mechanism to use symmetric-key, or "conventional", encryption, |
|
1174
|
|
|
|
|
|
|
when encrypting the session key. In other words, this allows you to |
|
1175
|
|
|
|
|
|
|
use I<Crypt::OpenPGP> for encryption/decryption without using public-key |
|
1176
|
|
|
|
|
|
|
cryptography; this can be useful in certain circumstances (for example, |
|
1177
|
|
|
|
|
|
|
when encrypting data locally on disk). |
|
1178
|
|
|
|
|
|
|
|
|
1179
|
|
|
|
|
|
|
This argument is optional; if not provided you should provide the |
|
1180
|
|
|
|
|
|
|
I<Recipients> option (above) to perform public-key encryption when |
|
1181
|
|
|
|
|
|
|
encrypting the session key. |
|
1182
|
|
|
|
|
|
|
|
|
1183
|
|
|
|
|
|
|
=item * RecipientsCallback |
|
1184
|
|
|
|
|
|
|
|
|
1185
|
|
|
|
|
|
|
After the list of recipients for a message (as given in I<Recipients>, |
|
1186
|
|
|
|
|
|
|
above) has been mapped into a set of keys from your public keyring, |
|
1187
|
|
|
|
|
|
|
you can use I<RecipientsCallback> to review/modify that list of keys. |
|
1188
|
|
|
|
|
|
|
The value of I<RecipientsCallback> should be a reference to a |
|
1189
|
|
|
|
|
|
|
subroutine; when invoked that routine will be handed a reference to |
|
1190
|
|
|
|
|
|
|
an array of I<Crypt::OpenPGP::Certificate> objects. It should then |
|
1191
|
|
|
|
|
|
|
return a reference to a list of such objects. |
|
1192
|
|
|
|
|
|
|
|
|
1193
|
|
|
|
|
|
|
This can be useful particularly when supplying user IDs in the list |
|
1194
|
|
|
|
|
|
|
of I<Recipients> for an encrypted message. Since user IDs are looked |
|
1195
|
|
|
|
|
|
|
up using partial matches (eg. I<b> could match I<b>, I<abc>, I<bar>, |
|
1196
|
|
|
|
|
|
|
etc.), one intended recipient may actually turn up multiple keys. |
|
1197
|
|
|
|
|
|
|
You can use I<RecipientsCallback> to audit that list before actually |
|
1198
|
|
|
|
|
|
|
encrypting the message: |
|
1199
|
|
|
|
|
|
|
|
|
1200
|
|
|
|
|
|
|
my %BAD_KEYS = ( |
|
1201
|
|
|
|
|
|
|
ABCDEF1234567890 => 1, |
|
1202
|
|
|
|
|
|
|
1234567890ABCDEF => 1, |
|
1203
|
|
|
|
|
|
|
); |
|
1204
|
|
|
|
|
|
|
my $cb = sub { |
|
1205
|
|
|
|
|
|
|
my $keys = shift; |
|
1206
|
|
|
|
|
|
|
my @return; |
|
1207
|
|
|
|
|
|
|
for my $cert (@$keys) { |
|
1208
|
|
|
|
|
|
|
push @return, $cert unless $BAD_KEYS{ $cert->key_id_hex }; |
|
1209
|
|
|
|
|
|
|
} |
|
1210
|
|
|
|
|
|
|
\@returns; |
|
1211
|
|
|
|
|
|
|
}; |
|
1212
|
|
|
|
|
|
|
my $ct = $pgp->encrypt( ..., RecipientsCallback => $cb, ... ); |
|
1213
|
|
|
|
|
|
|
|
|
1214
|
|
|
|
|
|
|
=item * Cipher |
|
1215
|
|
|
|
|
|
|
|
|
1216
|
|
|
|
|
|
|
The name of a symmetric cipher with which the plaintext will be |
|
1217
|
|
|
|
|
|
|
encrypted. Valid arguments are C<DES3>, C<CAST5>, C<Blowfish>, C<IDEA>, |
|
1218
|
|
|
|
|
|
|
C<Twofish>, C<Rijndael>, C<Rijndael192>, and C<Rijndael256> (the last |
|
1219
|
|
|
|
|
|
|
two are C<Rijndael> with key sizes of 192 and 256 bits, respectively). |
|
1220
|
|
|
|
|
|
|
|
|
1221
|
|
|
|
|
|
|
This argument is optional; if you have provided a I<Compat> parameter, |
|
1222
|
|
|
|
|
|
|
I<Crypt::OpenPGP> will use the appropriate cipher for the supplied |
|
1223
|
|
|
|
|
|
|
compatibility mode. Otherwise, I<Crypt::OpenPGP> currently defaults to |
|
1224
|
|
|
|
|
|
|
C<DES3>; this could change in the future. |
|
1225
|
|
|
|
|
|
|
|
|
1226
|
|
|
|
|
|
|
=item * Compress |
|
1227
|
|
|
|
|
|
|
|
|
1228
|
|
|
|
|
|
|
The name of a compression algorithm with which the plaintext will be |
|
1229
|
|
|
|
|
|
|
compressed before it is encrypted. Valid values are C<ZIP> and |
|
1230
|
|
|
|
|
|
|
C<Zlib>. |
|
1231
|
|
|
|
|
|
|
|
|
1232
|
|
|
|
|
|
|
By default text is not compressed. |
|
1233
|
|
|
|
|
|
|
|
|
1234
|
|
|
|
|
|
|
=item * Armour |
|
1235
|
|
|
|
|
|
|
|
|
1236
|
|
|
|
|
|
|
If true, the data returned from I<encrypt> will be ASCII-armoured. This |
|
1237
|
|
|
|
|
|
|
can be useful when you need to send data through email, for example. |
|
1238
|
|
|
|
|
|
|
|
|
1239
|
|
|
|
|
|
|
By default the returned data is not armoured. |
|
1240
|
|
|
|
|
|
|
|
|
1241
|
|
|
|
|
|
|
=item * SignKeyID |
|
1242
|
|
|
|
|
|
|
|
|
1243
|
|
|
|
|
|
|
If you wish to sign the plaintext message before encrypting it, provide |
|
1244
|
|
|
|
|
|
|
I<encrypt> with the I<SignKeyID> parameter and give it a key ID with |
|
1245
|
|
|
|
|
|
|
which the message can be signed. This allows recipients of your message |
|
1246
|
|
|
|
|
|
|
to verify its validity. |
|
1247
|
|
|
|
|
|
|
|
|
1248
|
|
|
|
|
|
|
By default messages not signed. |
|
1249
|
|
|
|
|
|
|
|
|
1250
|
|
|
|
|
|
|
=item * SignPassphrase |
|
1251
|
|
|
|
|
|
|
|
|
1252
|
|
|
|
|
|
|
The passphrase to unlock the secret key to be used when signing the |
|
1253
|
|
|
|
|
|
|
message. |
|
1254
|
|
|
|
|
|
|
|
|
1255
|
|
|
|
|
|
|
If you are signing the message--that is, if you have provided the |
|
1256
|
|
|
|
|
|
|
I<SignKeyID> parameter--either this argument or I<SignPassphraseCallback> |
|
1257
|
|
|
|
|
|
|
is required. |
|
1258
|
|
|
|
|
|
|
|
|
1259
|
|
|
|
|
|
|
=item * SignPassphraseCallback |
|
1260
|
|
|
|
|
|
|
|
|
1261
|
|
|
|
|
|
|
The callback routine to enable the passphrase being passed in through |
|
1262
|
|
|
|
|
|
|
some user-defined routine. See the I<PassphraseCallback> parameter for |
|
1263
|
|
|
|
|
|
|
I<sign>, below. |
|
1264
|
|
|
|
|
|
|
|
|
1265
|
|
|
|
|
|
|
If you are signing the message--that is, if you have provided the |
|
1266
|
|
|
|
|
|
|
I<SignKeyID> parameter--either this argument or I<SignPassphrase> is |
|
1267
|
|
|
|
|
|
|
required. |
|
1268
|
|
|
|
|
|
|
|
|
1269
|
|
|
|
|
|
|
=item * MDC |
|
1270
|
|
|
|
|
|
|
|
|
1271
|
|
|
|
|
|
|
When set to a true value, instructs I<encrypt> to use encrypted MDC |
|
1272
|
|
|
|
|
|
|
(modification detection code) packets instead of standard encrypted |
|
1273
|
|
|
|
|
|
|
data packets. These are a newer form of encrypted data packets that |
|
1274
|
|
|
|
|
|
|
are followed by a C<SHA-1> hash of the plaintext data. This prevents |
|
1275
|
|
|
|
|
|
|
attacks that modify the encrypted text by using a message digest to |
|
1276
|
|
|
|
|
|
|
detect changes. |
|
1277
|
|
|
|
|
|
|
|
|
1278
|
|
|
|
|
|
|
By default I<MDC> is set to C<0>, and I<encrypt> generates standard |
|
1279
|
|
|
|
|
|
|
encrypted data packets. Set it to a true value to turn on MDC packets. |
|
1280
|
|
|
|
|
|
|
Note that I<MDC> will automatically be turned on if you are using a |
|
1281
|
|
|
|
|
|
|
I<Compat> mode that is known to support it. |
|
1282
|
|
|
|
|
|
|
|
|
1283
|
|
|
|
|
|
|
=back |
|
1284
|
|
|
|
|
|
|
|
|
1285
|
|
|
|
|
|
|
=head2 $pgp->decrypt( %args ) |
|
1286
|
|
|
|
|
|
|
|
|
1287
|
|
|
|
|
|
|
Decrypts a block of ciphertext. The ciphertext should be of the sort |
|
1288
|
|
|
|
|
|
|
returned from I<encrypt>, in either armoured or non-armoured form. |
|
1289
|
|
|
|
|
|
|
This is compatible with all other implementations of PGP: the output |
|
1290
|
|
|
|
|
|
|
of their encryption should serves as the input to this method. |
|
1291
|
|
|
|
|
|
|
|
|
1292
|
|
|
|
|
|
|
When called in scalar context, returns the plaintext (that is, the |
|
1293
|
|
|
|
|
|
|
decrypted ciphertext), or C<undef> on failure. When called in list |
|
1294
|
|
|
|
|
|
|
context, returns a three-element list containing the plaintext and the |
|
1295
|
|
|
|
|
|
|
result of signature verification (see next paragraph), or the empty |
|
1296
|
|
|
|
|
|
|
list on failure. Either of the failure conditions listed here indicates |
|
1297
|
|
|
|
|
|
|
that decryption failed. |
|
1298
|
|
|
|
|
|
|
|
|
1299
|
|
|
|
|
|
|
If I<decrypt> is called in list context, and the encrypted text |
|
1300
|
|
|
|
|
|
|
contains a signature over the plaintext, I<decrypt> will attempt to |
|
1301
|
|
|
|
|
|
|
verify the signature and will return the result of that verification |
|
1302
|
|
|
|
|
|
|
as the second element in the return list, and the actual |
|
1303
|
|
|
|
|
|
|
I<Crypt::OpenPGP::Signature> object as the third element in the return |
|
1304
|
|
|
|
|
|
|
list. If you call I<decrypt> in |
|
1305
|
|
|
|
|
|
|
list context and the ciphertext does I<not> contain a signature, that |
|
1306
|
|
|
|
|
|
|
second element will be C<undef>, and the I<errstr> will be set to |
|
1307
|
|
|
|
|
|
|
the string C<No Signature\n>. The second element in the return list can |
|
1308
|
|
|
|
|
|
|
have one of three possible values: C<undef>, meaning that either an |
|
1309
|
|
|
|
|
|
|
error occurred in verifying the signature, I<or> the ciphertext did |
|
1310
|
|
|
|
|
|
|
not contain a signature; C<0>, meaning that the signature is invalid; |
|
1311
|
|
|
|
|
|
|
or a true value of either the signer's user ID or C<1>, if the user ID |
|
1312
|
|
|
|
|
|
|
cannot be determined. Note that these are the same values returned from |
|
1313
|
|
|
|
|
|
|
I<verify> (below). |
|
1314
|
|
|
|
|
|
|
|
|
1315
|
|
|
|
|
|
|
For example, to decrypt a message that may contain a signature that you |
|
1316
|
|
|
|
|
|
|
want verified, you might use code like this: |
|
1317
|
|
|
|
|
|
|
|
|
1318
|
|
|
|
|
|
|
my($pt, $valid, $sig) = $pgp->decrypt( ... ); |
|
1319
|
|
|
|
|
|
|
die "Decryption failed: ", $pgp->errstr unless $pt; |
|
1320
|
|
|
|
|
|
|
die "Signature verification failed: ", $pgp->errstr |
|
1321
|
|
|
|
|
|
|
unless defined $valid || $pgp->errstr !~ /^No Signature/; |
|
1322
|
|
|
|
|
|
|
print "Signature created at ", $sig->timestamp, "\n"; |
|
1323
|
|
|
|
|
|
|
|
|
1324
|
|
|
|
|
|
|
This checks for errors in decryption, as well as errors in signature |
|
1325
|
|
|
|
|
|
|
verification, excluding the error denoting that the plaintext was |
|
1326
|
|
|
|
|
|
|
not signed. |
|
1327
|
|
|
|
|
|
|
|
|
1328
|
|
|
|
|
|
|
I<%args> can contain: |
|
1329
|
|
|
|
|
|
|
|
|
1330
|
|
|
|
|
|
|
=over 4 |
|
1331
|
|
|
|
|
|
|
|
|
1332
|
|
|
|
|
|
|
=item * Data |
|
1333
|
|
|
|
|
|
|
|
|
1334
|
|
|
|
|
|
|
The ciphertext to be decrypted. This should be a simple scalar containing |
|
1335
|
|
|
|
|
|
|
an arbitrary amount of data. |
|
1336
|
|
|
|
|
|
|
|
|
1337
|
|
|
|
|
|
|
I<Data> is optional; if unspecified, you should specify a filename (see |
|
1338
|
|
|
|
|
|
|
I<Filename>, below). |
|
1339
|
|
|
|
|
|
|
|
|
1340
|
|
|
|
|
|
|
=item * Filename |
|
1341
|
|
|
|
|
|
|
|
|
1342
|
|
|
|
|
|
|
The path to a file to decrypt. |
|
1343
|
|
|
|
|
|
|
|
|
1344
|
|
|
|
|
|
|
I<Filename> is optional; if unspecified, you should specify the data |
|
1345
|
|
|
|
|
|
|
in I<Data>, above. If both I<Data> and I<Filename> are specified, the |
|
1346
|
|
|
|
|
|
|
data in I<Data> overrides that in I<Filename>. |
|
1347
|
|
|
|
|
|
|
|
|
1348
|
|
|
|
|
|
|
=item * Passphrase |
|
1349
|
|
|
|
|
|
|
|
|
1350
|
|
|
|
|
|
|
The passphrase to unlock your secret key, or to decrypt a |
|
1351
|
|
|
|
|
|
|
symmetrically-encrypted message; the usage depends on how the message is |
|
1352
|
|
|
|
|
|
|
encrypted. |
|
1353
|
|
|
|
|
|
|
|
|
1354
|
|
|
|
|
|
|
This argument is optional if your secret key is protected; if not |
|
1355
|
|
|
|
|
|
|
provided you should supply the I<PassphraseCallback> parameter (below). |
|
1356
|
|
|
|
|
|
|
|
|
1357
|
|
|
|
|
|
|
=item * PassphraseCallback |
|
1358
|
|
|
|
|
|
|
|
|
1359
|
|
|
|
|
|
|
A callback routine to allow interactive users (for example) to enter the |
|
1360
|
|
|
|
|
|
|
passphrase for the specific key being used to decrypt the ciphertext, or |
|
1361
|
|
|
|
|
|
|
the passphrase used to encrypt a symmetrically-encrypted message. This |
|
1362
|
|
|
|
|
|
|
is useful when your ciphertext is encrypted to several recipients, if |
|
1363
|
|
|
|
|
|
|
you do not necessarily know ahead of time the secret key that will be used |
|
1364
|
|
|
|
|
|
|
to decrypt it. It is also useful when you wish to provide an interactive |
|
1365
|
|
|
|
|
|
|
user with some feedback about the key being used to decrypt the message, |
|
1366
|
|
|
|
|
|
|
or when you don't know what type of encryption (symmetric or public-key) |
|
1367
|
|
|
|
|
|
|
will be used to encrypt a message. |
|
1368
|
|
|
|
|
|
|
|
|
1369
|
|
|
|
|
|
|
The value of this parameter should be a reference to a subroutine. This |
|
1370
|
|
|
|
|
|
|
routine will be called when a passphrase is needed from the user, and |
|
1371
|
|
|
|
|
|
|
it will be given either zero arguments or one argument, depending on |
|
1372
|
|
|
|
|
|
|
whether the message is encrypted symmetrically (zero arguments) or using |
|
1373
|
|
|
|
|
|
|
public-key encryption (one argument). If the latter, the one argument is |
|
1374
|
|
|
|
|
|
|
a I<Crypt::OpenPGP::Certificate> object representing the secret key. You |
|
1375
|
|
|
|
|
|
|
can use the information in this object to present details about the key to |
|
1376
|
|
|
|
|
|
|
the user. |
|
1377
|
|
|
|
|
|
|
|
|
1378
|
|
|
|
|
|
|
In either case, the callback routine should return the passphrase, a |
|
1379
|
|
|
|
|
|
|
scalar string. |
|
1380
|
|
|
|
|
|
|
|
|
1381
|
|
|
|
|
|
|
Your callback routine can use the number of arguments to determine how to |
|
1382
|
|
|
|
|
|
|
prompt the user for a passphrase; for example: |
|
1383
|
|
|
|
|
|
|
|
|
1384
|
|
|
|
|
|
|
sub passphrase_cb { |
|
1385
|
|
|
|
|
|
|
if (my $cert = $_[0]) { |
|
1386
|
|
|
|
|
|
|
printf "Enter passphrase for secret key %s: ", |
|
1387
|
|
|
|
|
|
|
$cert->key_id_hex; |
|
1388
|
|
|
|
|
|
|
} else { |
|
1389
|
|
|
|
|
|
|
print "Enter passphrase: "; |
|
1390
|
|
|
|
|
|
|
} |
|
1391
|
|
|
|
|
|
|
} |
|
1392
|
|
|
|
|
|
|
|
|
1393
|
|
|
|
|
|
|
This argument is optional if your secret key is protected; if not |
|
1394
|
|
|
|
|
|
|
provided you should supply the I<Passphrase> parameter (above). |
|
1395
|
|
|
|
|
|
|
|
|
1396
|
|
|
|
|
|
|
=back |
|
1397
|
|
|
|
|
|
|
|
|
1398
|
|
|
|
|
|
|
=head2 $pgp->sign( %args ) |
|
1399
|
|
|
|
|
|
|
|
|
1400
|
|
|
|
|
|
|
Creates and returns a digital signature on a block of data. |
|
1401
|
|
|
|
|
|
|
|
|
1402
|
|
|
|
|
|
|
On failure returns C<undef>. |
|
1403
|
|
|
|
|
|
|
|
|
1404
|
|
|
|
|
|
|
I<%args> can contain: |
|
1405
|
|
|
|
|
|
|
|
|
1406
|
|
|
|
|
|
|
=over 4 |
|
1407
|
|
|
|
|
|
|
|
|
1408
|
|
|
|
|
|
|
=item * Compat |
|
1409
|
|
|
|
|
|
|
|
|
1410
|
|
|
|
|
|
|
Specifies the PGP compatibility setting. See I<COMPATIBILITY>, above. |
|
1411
|
|
|
|
|
|
|
|
|
1412
|
|
|
|
|
|
|
=item * Data |
|
1413
|
|
|
|
|
|
|
|
|
1414
|
|
|
|
|
|
|
The text to be signed. This should be a simple scalar containing an |
|
1415
|
|
|
|
|
|
|
arbitrary amount of data. |
|
1416
|
|
|
|
|
|
|
|
|
1417
|
|
|
|
|
|
|
I<Data> is optional; if unspecified, you should specify a filename (see |
|
1418
|
|
|
|
|
|
|
I<Filename>, below). |
|
1419
|
|
|
|
|
|
|
|
|
1420
|
|
|
|
|
|
|
=item * Filename |
|
1421
|
|
|
|
|
|
|
|
|
1422
|
|
|
|
|
|
|
The path to a file to sign. |
|
1423
|
|
|
|
|
|
|
|
|
1424
|
|
|
|
|
|
|
I<Filename> is optional; if unspecified, you should specify the data |
|
1425
|
|
|
|
|
|
|
in I<Data>, above. If both I<Data> and I<Filename> are specified, the |
|
1426
|
|
|
|
|
|
|
data in I<Data> overrides that in I<Filename>. |
|
1427
|
|
|
|
|
|
|
|
|
1428
|
|
|
|
|
|
|
=item * Detach |
|
1429
|
|
|
|
|
|
|
|
|
1430
|
|
|
|
|
|
|
If set to a true value the signature created will be a detached |
|
1431
|
|
|
|
|
|
|
signature; that is, a signature that does not contain the original |
|
1432
|
|
|
|
|
|
|
text. This assumes that the person who will be verifying the signature |
|
1433
|
|
|
|
|
|
|
can somehow obtain the original text (for example, if you sign the text |
|
1434
|
|
|
|
|
|
|
of an email message, the original text is the message). |
|
1435
|
|
|
|
|
|
|
|
|
1436
|
|
|
|
|
|
|
By default signatures are not detached. |
|
1437
|
|
|
|
|
|
|
|
|
1438
|
|
|
|
|
|
|
=item * Armour |
|
1439
|
|
|
|
|
|
|
|
|
1440
|
|
|
|
|
|
|
If true, the data returned from I<sign> will be ASCII-armoured. This |
|
1441
|
|
|
|
|
|
|
can be useful when you need to send data through email, for example. |
|
1442
|
|
|
|
|
|
|
|
|
1443
|
|
|
|
|
|
|
By default the returned signature is not armoured. |
|
1444
|
|
|
|
|
|
|
|
|
1445
|
|
|
|
|
|
|
=item * Clearsign |
|
1446
|
|
|
|
|
|
|
|
|
1447
|
|
|
|
|
|
|
If true, the signature created on the data is a clear-text signature. |
|
1448
|
|
|
|
|
|
|
This form of signature displays the clear text of the signed data, |
|
1449
|
|
|
|
|
|
|
followed by the ASCII-armoured signature on that data. Such a format |
|
1450
|
|
|
|
|
|
|
is desirable when sending signed messages to groups of users who may |
|
1451
|
|
|
|
|
|
|
or may not have PGP, because it allows the text of the message to be |
|
1452
|
|
|
|
|
|
|
readable without special software. |
|
1453
|
|
|
|
|
|
|
|
|
1454
|
|
|
|
|
|
|
When I<Clearsign> is set to true, I<Armour> and I<Detach> are |
|
1455
|
|
|
|
|
|
|
automatically turned on, because the signature created is a detached, |
|
1456
|
|
|
|
|
|
|
armoured signature. |
|
1457
|
|
|
|
|
|
|
|
|
1458
|
|
|
|
|
|
|
By default I<Clearsign> is false. |
|
1459
|
|
|
|
|
|
|
|
|
1460
|
|
|
|
|
|
|
=item * KeyID |
|
1461
|
|
|
|
|
|
|
|
|
1462
|
|
|
|
|
|
|
The ID of the secret key that should be used to sign the message. The |
|
1463
|
|
|
|
|
|
|
value of the key ID should be specified as a 16-digit hexadecimal number. |
|
1464
|
|
|
|
|
|
|
|
|
1465
|
|
|
|
|
|
|
This argument is mandatory. |
|
1466
|
|
|
|
|
|
|
|
|
1467
|
|
|
|
|
|
|
=item * Passphrase |
|
1468
|
|
|
|
|
|
|
|
|
1469
|
|
|
|
|
|
|
The passphrase to unlock your secret key. |
|
1470
|
|
|
|
|
|
|
|
|
1471
|
|
|
|
|
|
|
This argument is optional if your secret key is protected; if not |
|
1472
|
|
|
|
|
|
|
provided you should supply the I<PassphraseCallback> parameter (below). |
|
1473
|
|
|
|
|
|
|
|
|
1474
|
|
|
|
|
|
|
=item * PassphraseCallback |
|
1475
|
|
|
|
|
|
|
|
|
1476
|
|
|
|
|
|
|
A callback routine to allow interactive users (for example) to enter the |
|
1477
|
|
|
|
|
|
|
passphrase for the specific key being used to sign the message. This is |
|
1478
|
|
|
|
|
|
|
useful when you wish to provide an interactive user with some feedback |
|
1479
|
|
|
|
|
|
|
about the key being used to sign the message. |
|
1480
|
|
|
|
|
|
|
|
|
1481
|
|
|
|
|
|
|
The value of this parameter should be a reference to a subroutine. This |
|
1482
|
|
|
|
|
|
|
routine will be called when a passphrase is needed from the user, and |
|
1483
|
|
|
|
|
|
|
it will be given one argument: a I<Crypt::OpenPGP::Certificate> object |
|
1484
|
|
|
|
|
|
|
representing the secret key. You can use the information in this object |
|
1485
|
|
|
|
|
|
|
to present details about the key to the user. The callback routine |
|
1486
|
|
|
|
|
|
|
should return the passphrase, a scalar string. |
|
1487
|
|
|
|
|
|
|
|
|
1488
|
|
|
|
|
|
|
This argument is optional if your secret key is protected; if not |
|
1489
|
|
|
|
|
|
|
provided you should supply the I<Passphrase> parameter (above). |
|
1490
|
|
|
|
|
|
|
|
|
1491
|
|
|
|
|
|
|
=item * Digest |
|
1492
|
|
|
|
|
|
|
|
|
1493
|
|
|
|
|
|
|
The digest algorithm to use when creating the signature; the data to be |
|
1494
|
|
|
|
|
|
|
signed is hashed by a message digest algorithm, then signed. Possible |
|
1495
|
|
|
|
|
|
|
values are C<MD5>, C<SHA1>, and C<RIPEMD160>. |
|
1496
|
|
|
|
|
|
|
|
|
1497
|
|
|
|
|
|
|
This argument is optional; if not provided, the digest algorithm will be |
|
1498
|
|
|
|
|
|
|
set based on the I<Compat> setting provided to I<sign> or I<new>. If you |
|
1499
|
|
|
|
|
|
|
have not provided a I<Compat> setting, I<SHA1> will be used. |
|
1500
|
|
|
|
|
|
|
|
|
1501
|
|
|
|
|
|
|
=item * Version |
|
1502
|
|
|
|
|
|
|
|
|
1503
|
|
|
|
|
|
|
The format version of the created signature. The two possible values |
|
1504
|
|
|
|
|
|
|
are C<3> and C<4>; version 4 signatures will not be compatible with |
|
1505
|
|
|
|
|
|
|
older PGP implementations. |
|
1506
|
|
|
|
|
|
|
|
|
1507
|
|
|
|
|
|
|
The default value is C<4>, although this could change in the future. |
|
1508
|
|
|
|
|
|
|
|
|
1509
|
|
|
|
|
|
|
=back |
|
1510
|
|
|
|
|
|
|
|
|
1511
|
|
|
|
|
|
|
=head2 $pgp->verify( %args ) |
|
1512
|
|
|
|
|
|
|
|
|
1513
|
|
|
|
|
|
|
Verifies a digital signature. Returns true for a valid signature, C<0> |
|
1514
|
|
|
|
|
|
|
for an invalid signature, and C<undef> if an error occurs (in which |
|
1515
|
|
|
|
|
|
|
case you should call I<errstr> to determine the source of the error). |
|
1516
|
|
|
|
|
|
|
The 'true' value returned for a successful signature will be, if available, |
|
1517
|
|
|
|
|
|
|
the PGP User ID of the person who created the signature. If that |
|
1518
|
|
|
|
|
|
|
value is unavailable, the return value will be C<1>. |
|
1519
|
|
|
|
|
|
|
|
|
1520
|
|
|
|
|
|
|
If called in list context, the second element returned in the return list |
|
1521
|
|
|
|
|
|
|
will be the I<Crypt::OpenPGP::Signature> object representing the actual |
|
1522
|
|
|
|
|
|
|
signature. |
|
1523
|
|
|
|
|
|
|
|
|
1524
|
|
|
|
|
|
|
I<%args> can contain: |
|
1525
|
|
|
|
|
|
|
|
|
1526
|
|
|
|
|
|
|
=over 4 |
|
1527
|
|
|
|
|
|
|
|
|
1528
|
|
|
|
|
|
|
=item * Signature |
|
1529
|
|
|
|
|
|
|
|
|
1530
|
|
|
|
|
|
|
The signature data, as returned from I<sign>. This data can be either |
|
1531
|
|
|
|
|
|
|
a detached signature or a non-detached signature. If the former, you |
|
1532
|
|
|
|
|
|
|
will need to specify the list of files comprising the original signed |
|
1533
|
|
|
|
|
|
|
data (see I<Data> or I<Files>, below). |
|
1534
|
|
|
|
|
|
|
|
|
1535
|
|
|
|
|
|
|
Either this argument or I<SigFile> is required. |
|
1536
|
|
|
|
|
|
|
|
|
1537
|
|
|
|
|
|
|
=item * SigFile |
|
1538
|
|
|
|
|
|
|
|
|
1539
|
|
|
|
|
|
|
The path to a file containing the signature data. This data can be either |
|
1540
|
|
|
|
|
|
|
a detached signature or a non-detached signature. If the former, you |
|
1541
|
|
|
|
|
|
|
will need to specify the list of files comprising the original signed |
|
1542
|
|
|
|
|
|
|
data (see I<Data> or I<Files>, below). |
|
1543
|
|
|
|
|
|
|
|
|
1544
|
|
|
|
|
|
|
Either this argument or I<SigFile> is required. |
|
1545
|
|
|
|
|
|
|
|
|
1546
|
|
|
|
|
|
|
=item * Data |
|
1547
|
|
|
|
|
|
|
|
|
1548
|
|
|
|
|
|
|
Specifies the original signed data. |
|
1549
|
|
|
|
|
|
|
|
|
1550
|
|
|
|
|
|
|
If the signature (in either I<Signature> or I<SigFile>) is a detached |
|
1551
|
|
|
|
|
|
|
signature, either I<Data> or I<Files> is a mandatory argument. |
|
1552
|
|
|
|
|
|
|
|
|
1553
|
|
|
|
|
|
|
=item * Files |
|
1554
|
|
|
|
|
|
|
|
|
1555
|
|
|
|
|
|
|
Specifies a list of files comprising the original signed data. The |
|
1556
|
|
|
|
|
|
|
value should be a reference to a list of file paths; if there is only |
|
1557
|
|
|
|
|
|
|
one file, the value can be specified as a scalar string, rather than |
|
1558
|
|
|
|
|
|
|
a reference to a list. |
|
1559
|
|
|
|
|
|
|
|
|
1560
|
|
|
|
|
|
|
If the signature (in either I<Signature> or I<SigFile>) is a detached |
|
1561
|
|
|
|
|
|
|
signature, either I<Data> or I<Files> is a mandatory argument. |
|
1562
|
|
|
|
|
|
|
|
|
1563
|
|
|
|
|
|
|
=back |
|
1564
|
|
|
|
|
|
|
|
|
1565
|
|
|
|
|
|
|
=head2 $pgp->keygen( %args ) |
|
1566
|
|
|
|
|
|
|
|
|
1567
|
|
|
|
|
|
|
NOTE: this interface is alpha and could change in future releases! |
|
1568
|
|
|
|
|
|
|
|
|
1569
|
|
|
|
|
|
|
Generates a public/secret PGP keypair. Returns two keyblocks (objects |
|
1570
|
|
|
|
|
|
|
of type I<Crypt::OpenPGP::KeyBlock>), a public and a secret keyblock, |
|
1571
|
|
|
|
|
|
|
respectively. A keyblock is essentially a block of keys, subkeys, |
|
1572
|
|
|
|
|
|
|
signatures, and user ID PGP packets. |
|
1573
|
|
|
|
|
|
|
|
|
1574
|
|
|
|
|
|
|
I<%args> can contain: |
|
1575
|
|
|
|
|
|
|
|
|
1576
|
|
|
|
|
|
|
=over 4 |
|
1577
|
|
|
|
|
|
|
|
|
1578
|
|
|
|
|
|
|
=item * Type |
|
1579
|
|
|
|
|
|
|
|
|
1580
|
|
|
|
|
|
|
The type of key to generate. Currently there are two valid values: |
|
1581
|
|
|
|
|
|
|
C<RSA> and C<DSA>. C<ElGamal> key generation is not supported at the |
|
1582
|
|
|
|
|
|
|
moment. |
|
1583
|
|
|
|
|
|
|
|
|
1584
|
|
|
|
|
|
|
This is a required argument. |
|
1585
|
|
|
|
|
|
|
|
|
1586
|
|
|
|
|
|
|
=item * Size |
|
1587
|
|
|
|
|
|
|
|
|
1588
|
|
|
|
|
|
|
Bitsize of the key to be generated. This should be an even integer; |
|
1589
|
|
|
|
|
|
|
there is no low end currently implemented in I<Crypt::OpenPGP>, but |
|
1590
|
|
|
|
|
|
|
for the sake of security I<Size> should be at least 1024 bits. |
|
1591
|
|
|
|
|
|
|
|
|
1592
|
|
|
|
|
|
|
This is a required argument. |
|
1593
|
|
|
|
|
|
|
|
|
1594
|
|
|
|
|
|
|
=item * Identity |
|
1595
|
|
|
|
|
|
|
|
|
1596
|
|
|
|
|
|
|
A string that identifies the owner of the key. Typically this is the |
|
1597
|
|
|
|
|
|
|
combination of the user's name and an email address; for example, |
|
1598
|
|
|
|
|
|
|
|
|
1599
|
|
|
|
|
|
|
Foo Bar <foo@bar.com> |
|
1600
|
|
|
|
|
|
|
|
|
1601
|
|
|
|
|
|
|
The I<Identity> is used to build a User ID packet that is stored in |
|
1602
|
|
|
|
|
|
|
each of the returned keyblocks. |
|
1603
|
|
|
|
|
|
|
|
|
1604
|
|
|
|
|
|
|
This is a required argument. |
|
1605
|
|
|
|
|
|
|
|
|
1606
|
|
|
|
|
|
|
=item * Passphrase |
|
1607
|
|
|
|
|
|
|
|
|
1608
|
|
|
|
|
|
|
String with which the secret key will be encrypted. When read in from |
|
1609
|
|
|
|
|
|
|
disk, the key can then only be unlocked using this string. |
|
1610
|
|
|
|
|
|
|
|
|
1611
|
|
|
|
|
|
|
This is a required argument. |
|
1612
|
|
|
|
|
|
|
|
|
1613
|
|
|
|
|
|
|
=item * Version |
|
1614
|
|
|
|
|
|
|
|
|
1615
|
|
|
|
|
|
|
Specifies the key version; defaults to version C<4> keys. You should |
|
1616
|
|
|
|
|
|
|
only set this to version C<3> if you know why you are doing so (for |
|
1617
|
|
|
|
|
|
|
backwards compatibility, most likely). Version C<3> keys only support |
|
1618
|
|
|
|
|
|
|
RSA. |
|
1619
|
|
|
|
|
|
|
|
|
1620
|
|
|
|
|
|
|
=item * Verbosity |
|
1621
|
|
|
|
|
|
|
|
|
1622
|
|
|
|
|
|
|
Set to a true value to enable a status display during key generation; |
|
1623
|
|
|
|
|
|
|
since key generation is a relatively lengthy process, it is helpful |
|
1624
|
|
|
|
|
|
|
to have an indication that some action is occurring. |
|
1625
|
|
|
|
|
|
|
|
|
1626
|
|
|
|
|
|
|
I<Verbosity> is 0 by default. |
|
1627
|
|
|
|
|
|
|
|
|
1628
|
|
|
|
|
|
|
=back |
|
1629
|
|
|
|
|
|
|
|
|
1630
|
|
|
|
|
|
|
=head1 ERROR HANDLING |
|
1631
|
|
|
|
|
|
|
|
|
1632
|
|
|
|
|
|
|
If an error occurs in any of the above methods, the method will return |
|
1633
|
|
|
|
|
|
|
C<undef>. You should then call the method I<errstr> to determine the |
|
1634
|
|
|
|
|
|
|
source of the error: |
|
1635
|
|
|
|
|
|
|
|
|
1636
|
|
|
|
|
|
|
$pgp->errstr |
|
1637
|
|
|
|
|
|
|
|
|
1638
|
|
|
|
|
|
|
In the case that you do not yet have a I<Crypt::OpenPGP> object (that |
|
1639
|
|
|
|
|
|
|
is, if an error occurs while creating a I<Crypt::OpenPGP> object), |
|
1640
|
|
|
|
|
|
|
the error can be obtained as a class method: |
|
1641
|
|
|
|
|
|
|
|
|
1642
|
|
|
|
|
|
|
Crypt::OpenPGP->errstr |
|
1643
|
|
|
|
|
|
|
|
|
1644
|
|
|
|
|
|
|
For example, if you try to decrypt some encrypted text, and you do |
|
1645
|
|
|
|
|
|
|
not give a passphrase to unlock your secret key: |
|
1646
|
|
|
|
|
|
|
|
|
1647
|
|
|
|
|
|
|
my $pt = $pgp->decrypt( Filename => "encrypted_data" ) |
|
1648
|
|
|
|
|
|
|
or die "Decryption failed: ", $pgp->errstr; |
|
1649
|
|
|
|
|
|
|
|
|
1650
|
|
|
|
|
|
|
=head1 SAMPLES/TUTORIALS |
|
1651
|
|
|
|
|
|
|
|
|
1652
|
|
|
|
|
|
|
Take a look at F<bin/pgplet> for an example of usage of I<Crypt::OpenPGP>. |
|
1653
|
|
|
|
|
|
|
It gives you an example of using the four main major methods (I<encrypt>, |
|
1654
|
|
|
|
|
|
|
I<sign>, I<decrypt>, and I<verify>), as well as the various parameters to |
|
1655
|
|
|
|
|
|
|
those methods. It also demonstrates usage of the callback parameters (eg. |
|
1656
|
|
|
|
|
|
|
I<PassphraseCallback>). |
|
1657
|
|
|
|
|
|
|
|
|
1658
|
|
|
|
|
|
|
F<bin/pgplet> currently does not have any documentation, but its interface |
|
1659
|
|
|
|
|
|
|
mirrors that of I<gpg>. |
|
1660
|
|
|
|
|
|
|
|
|
1661
|
|
|
|
|
|
|
=head1 LICENSE |
|
1662
|
|
|
|
|
|
|
|
|
1663
|
|
|
|
|
|
|
Crypt::OpenPGP is free software; you may redistribute it and/or modify |
|
1664
|
|
|
|
|
|
|
it under the same terms as Perl itself. |
|
1665
|
|
|
|
|
|
|
|
|
1666
|
|
|
|
|
|
|
=head1 AUTHOR & COPYRIGHT |
|
1667
|
|
|
|
|
|
|
|
|
1668
|
|
|
|
|
|
|
Except where otherwise noted, Crypt::OpenPGP is Copyright 2001 Benjamin |
|
1669
|
|
|
|
|
|
|
Trott, cpan@stupidfool.org. All rights reserved. |
|
1670
|
|
|
|
|
|
|
|
|
1671
|
|
|
|
|
|
|
=head1 REFERENCES |
|
1672
|
|
|
|
|
|
|
|
|
1673
|
|
|
|
|
|
|
=over 4 |
|
1674
|
|
|
|
|
|
|
|
|
1675
|
|
|
|
|
|
|
=item 1 RFC4880 - OpenPGP Message Format (2007). http://www.faqs.org/rfcs/rfc4880.html |
|
1676
|
|
|
|
|
|
|
|
|
1677
|
|
|
|
|
|
|
=back |
|
1678
|
|
|
|
|
|
|
|
|
1679
|
|
|
|
|
|
|
=cut |