%PDF- %PDF-
Direktori : /proc/25810/root/usr/share/perl5/vendor_perl/Mail/DKIM/ |
Current File : //proc/25810/root/usr/share/perl5/vendor_perl/Mail/DKIM/PrivateKey.pm |
#!/usr/bin/perl # Copyright 2005-2007 Messiah College. All rights reserved. # Jason Long <jlong@messiah.edu> # # Copyright (c) 2004 Anthony D. Urso. All rights reserved. # This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. use strict; use warnings; =head1 NAME Mail::DKIM::PrivateKey - a private key loaded in memory for DKIM signing =head1 SYNOPSIS my $key1 = Mail::DKIM::PrivateKey->load( File => "/path/to/private.key"); my $key2 = Mail::DKIM::PrivateKey->load( Data => $base64); # use the loaded key in a DKIM signing object my $dkim = Mail::DKIM::Signer->new( Key => $key2, ); =cut package Mail::DKIM::PrivateKey; use base "Mail::DKIM::Key"; use Carp; *calculate_EM = \&Mail::DKIM::Key::calculate_EM; =head1 CONSTRUCTOR =head2 load() - loads a private key into memory my $key1 = Mail::DKIM::PrivateKey->load( File => "/path/to/private.key"); Loads the Base64-encoded key from the specified file. my $key2 = Mail::DKIM::PrivateKey->load(Data => $base64); Loads the Base64-encoded key from a string already in memory. my $key3 = Mail::DKIM::PrivateKey->load(Cork => $openssl_object); Creates a Mail::DKIM::PrivateKey wrapper object for the given OpenSSL key object. The key object should be of type L<Crypt::OpenSSL::RSA>. =cut 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 FILE, "<", $prms{'File'} or die "Error: cannot read $prms{File}: $!\n"; while (<FILE>) { chomp; /^---/ and next; push @data, $_; } $self->{'DATA'} = join '', @data; } elsif ($prms{'Cork'}) { $self->{'CORK'} = $prms{'Cork'}; } else { croak "missing required argument"; } return $self; } =head1 METHODS =head2 cork() - access the underlying OpenSSL key object $openssl_object = $key->cork; The returned object is of type L<Crypt::OpenSSL::RSA>. =cut sub convert { use Crypt::OpenSSL::RSA; my $self = shift; $self->data or return; # 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 { $cork = new_private_key Crypt::OpenSSL::RSA($pkcs); }; $@ and $self->errorstr($@), return; $cork or return; # segfaults on my machine # $cork->check_key or # return; $self->cork($cork); return 1; } #deprecated sub sign { my $self = shift; my $mail = shift; return $self->cork->sign($mail); } #deprecated- use sign_digest() instead sub sign_sha1_digest { my $self = shift; my ($digest) = @_; return $self->sign_digest("SHA-1", $digest); } =head2 sign_digest() Cryptographically sign the given message digest. $key->sign_digest("SHA-1", sha1("my message text")); The first parameter is the name of the digest: one of "SHA-1", "SHA-256". The second parameter is the message digest as a binary string. The result should be the signed digest as a binary string. =cut sub sign_digest { my $self = shift; my ($digest_algorithm, $digest) = @_; my $rsa_priv = $self->cork; $rsa_priv->use_no_padding; my $k = $rsa_priv->size; my $EM = calculate_EM($digest_algorithm, $digest, $k); return $rsa_priv->decrypt($EM); } =head1 AUTHOR Jason Long, E<lt>jlong@messiah.eduE<gt> =head1 COPYRIGHT AND LICENSE Copyright (C) 2006-2008 by Messiah College This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.6 or, at your option, any later version of Perl 5 you may have available. =cut 1;