Mail-DKIM
view release on metacpan or search on metacpan
lib/Mail/DKIM/PrivateKey.pm view on Meta::CPAN
use base 'Mail::DKIM::Key';
use Carp;
*calculate_EM = \&Mail::DKIM::Key::calculate_EM;
use Crypt::OpenSSL::RSA;
use Crypt::PK::Ed25519;
sub load {
my $class = shift;
my %prms = @_;
my $self = bless {}, $class;
$self->{'TYPE'} = ( $prms{'Type'} or 'rsa' );
if ( $prms{'Data'} ) {
$self->{'DATA'} = $prms{'Data'};
}
elsif ( defined $prms{'File'} ) {
my @data;
open my $file, '<', $prms{'File'}
or die "Error: cannot read $prms{File}: $!\n";
while ( my $line = <$file> ) {
chomp $line;
next if $line =~ /^---/;
push @data, $line;
}
$self->{'DATA'} = join '', @data;
close $file;
}
elsif ( $prms{'Cork'} ) {
$self->{'CORK'} = $prms{'Cork'};
}
else {
croak 'missing required argument';
}
return $self;
}
sub _convert_rsa {
my $self = shift;
# have to PKCS1ify the privkey because openssl is too finicky...
my $pkcs = "-----BEGIN RSA PRIVATE KEY-----\n";
for ( my $i = 0 ; $i < length $self->data ; $i += 64 ) {
$pkcs .= substr $self->data, $i, 64;
$pkcs .= "\n";
}
$pkcs .= "-----END RSA PRIVATE KEY-----\n";
my $cork;
eval {
local $SIG{__DIE__};
$cork = new_private_key Crypt::OpenSSL::RSA($pkcs);
1
} || do {
$self->errorstr($@);
return;
};
$cork
or return;
# segfaults on my machine
# $cork->check_key or
# return;
$self->cork($cork);
return 1;
}
sub _convert_ed25519 {
my $self = shift;
my $cork;
eval {
local $SIG{__DIE__};
$cork = new Crypt::PK::Ed25519;
# Prepend/append with PEM boilerplate
my $pem = "-----BEGIN PRIVATE KEY-----\n";
$pem .= $self->data;
$pem .= "\n";
$pem .= "-----END PRIVATE KEY-----\n";
# Pass PEM text buffer
$cork->import_key(\$pem)
or die 'failed to load Ed25519 private key';
# Alternatively, import_raw_key() could be used,
# but requires the 32-byte key, which must be extracted
# from the ASN.1 structure first.
1
} || do {
$self->errorstr($@);
return;
};
$cork
or return;
$self->cork($cork);
return 1;
}
sub convert {
my $self = shift;
$self->data
or return;
return $self->_convert_rsa if $self->{TYPE} eq 'rsa';
return $self->_convert_ed25519 if $self->{TYPE} eq 'ed25519';
( run in 0.804 second using v1.01-cache-2.11-cpan-5a3173703d6 )