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 )