Alt-Crypt-RSA-BigInt
view release on metacpan or search on metacpan
lib/Crypt/RSA.pm view on Meta::CPAN
package Crypt::RSA;
use strict;
use warnings;
##
## Crypt::RSA - Pure-perl implementation of RSA encryption/signing
## algorithms.
##
## Copyright (c) 2000-2001, Vipul Ved Prakash. All rights reserved.
## This code is free software; you can redistribute it and/or modify
## it under the same terms as Perl itself.
use base 'Class::Loader';
use base 'Crypt::RSA::Errorhandler';
use Crypt::RSA::Key;
use Crypt::RSA::DataFormat qw(steak octet_len);
use Convert::ASCII::Armour;
use Carp;
$Crypt::RSA::VERSION = '1.99'; # change this elsewhere too!
my %DEFAULTS = (
'ES' => { Name => 'OAEP_ES' },
'SS' => { Name => 'PSS_SS' },
'PP' => { Name => 'ASCII_PP' },
);
my %KNOWNMAP = (
# ENCRYPTION SCHEMES
OAEP_ES => { Module => "Crypt::RSA::ES::OAEP" },
PKCS1v21_ES => { Module => "Crypt::RSA::ES::OAEP" },
PKCS1v15_ES => { Module => "Crypt::RSA::ES::PKCS1v15" },
# SIGNATURE SCHEMES
PSS_SS => { Module => "Crypt::RSA::SS::PSS" },
PKCS1v21_SS => { Module => "Crypt::RSA::SS::PSS" },
PKCS1v15_SS => { Module => "Crypt::RSA::SS::PKCS1v15" },
# POST PROCESSORS
ASCII_PP => { Module => "Convert::ASCII::Armour" },
);
sub new {
my ($class, %params) = @_;
my %self = (%DEFAULTS, %params);
my $self = bless \%self, $class;
$self->_storemap (%KNOWNMAP);
for (qw(ES SS PP)) {
$$self{$_} = { Name => $$self{$_} . "_$_" } unless ref $$self{$_};
$$self{lc($_)} = $self->_load ( %{$$self{$_}} );
}
$$self{keychain} = new Crypt::RSA::Key;
return bless \%self, $class;
}
sub keygen {
my ($self, %params) = @_;
$params{KF} = $$self{KF} if $$self{KF};
my @keys;
return (@keys = $self->{keychain}->generate (%params))
? @keys
: $self->error ($self->{keychain}->errstr);
}
sub encrypt {
my ($self, %params) = @_;
my $plaintext = $params{Message} || $params{Plaintext};
my $key = $params{Key};
return $self->error ($key->errstr, \%params, $key, \$plaintext)
unless $key->check();
my $blocksize = blocksize ( $$self{es}->encryptblock (Key => $key),
length($plaintext)
);
return $self->error("Message too long.", \$key, \%params) if $blocksize <= 0;
my $cyphertext;
my @segments = steak ($plaintext, $blocksize);
for (@segments) {
$cyphertext .= $self->{es}->encrypt (Message => $_, Key => $key)
|| return $self->error ($self->{es}->errstr, \$key, \%params);
}
if ($params{Armour} || $params{Armor}) {
$cyphertext = $self->{pp}->armour (
Object => 'RSA ENCRYPTED MESSAGE',
Headers => {
Scheme => $$self{ES}{Module} || ${$KNOWNMAP{$$self{ES}{Name}}}{Module},
Version => $self->{es}->version()
},
Content => { Cyphertext => $cyphertext },
Compress => 1,
);
}
return $cyphertext;
}
sub decrypt {
my ($self , %params) = @_;
my $cyphertext = $params{Cyphertext} || $params{Ciphertext};
( run in 2.429 seconds using v1.01-cache-2.11-cpan-d7f47b0818f )