summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/PKCS1v15.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/PKCS1v15.pm')
-rwxr-xr-xMaster/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/PKCS1v15.pm215
1 files changed, 215 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/PKCS1v15.pm b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/PKCS1v15.pm
new file mode 100755
index 00000000000..345c8dc4e14
--- /dev/null
+++ b/Master/tlpkg/tlperl.straw/lib/Crypt/RSA/ES/PKCS1v15.pm
@@ -0,0 +1,215 @@
+#!/usr/bin/perl -sw
+##
+## Crypt::RSA::ES::PKCS1v15
+##
+## Copyright (c) 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.
+##
+## $Id: PKCS1v15.pm,v 1.10 2001/06/22 23:27:37 vipul Exp $
+
+package Crypt::RSA::ES::PKCS1v15;
+use strict;
+use base 'Crypt::RSA::Errorhandler';
+use Crypt::Random qw(makerandom_octet);
+use Crypt::RSA::DataFormat qw(bitsize octet_len os2ip i2osp);
+use Crypt::RSA::Primitives;
+use Crypt::RSA::Debug qw(debug);
+use Math::Pari qw(floor);
+use Sort::Versions qw(versioncmp);
+use Carp;
+
+$Crypt::RSA::ES::PKCS1v15::VERSION = '1.99';
+
+sub new {
+ my ($class, %params) = @_;
+ my $self = bless { primitives => new Crypt::RSA::Primitives,
+ VERSION => $Crypt::RSA::ES::PKCS1v15::VERSION,
+ }, $class;
+ if ($params{Version}) {
+ # do versioning here.
+ }
+ return $self;
+}
+
+
+sub encrypt {
+ my ($self, %params) = @_;
+ my $key = $params{Key}; my $M = $params{Message} || $params{Plaintext};
+ return $self->error ("No Message or Plaintext parameter", \$key, \%params) unless $M;
+ return $self->error ($key->errstr, \$M, $key, \%params) unless $key->check;
+ my $k = octet_len ($key->n); debug ("octet_len of modulus: $k");
+ my $em = $self->encode ($M, $k-1) ||
+ return $self->error ($self->errstr, \$M, $key, \%params);
+ debug ("encoded: $em");
+ my $m = os2ip ($em);
+ my $c = $self->{primitives}->core_encrypt (Plaintext => $m, Key => $key);
+ my $ec = i2osp ($c, $k); debug ("cyphertext: $ec");
+ return $ec;
+}
+
+
+sub decrypt {
+ my ($self, %params) = @_;
+ my $key = $params{Key}; my $C = $params{Cyphertext} || $params{Ciphertext};
+ return $self->error ("No Cyphertext or Ciphertext parameter", \$key, \%params) unless $C;
+ return $self->error ($key->errstr, $key, \%params) unless $key->check;
+ my $k = octet_len ($key->n);
+ my $c = os2ip ($C);
+ debug ("bitsize(c): " . bitsize($c));
+ debug ("bitsize(n): " . bitsize($key->n));
+ if (bitsize($c) > bitsize($key->n)) {
+ return $self->error ("Decryption error.", $key, \%params)
+ }
+ my $m = $self->{primitives}->core_decrypt (Cyphertext => $c, Key => $key) ||
+ return $self->error ("Decryption error.", $key, \%params);
+ my $em = i2osp ($m, $k-1) ||
+ return $self->error ("Decryption error.", $key, \%params);
+ my $M; $self->errstrrst; # reset the errstr
+ unless ($M = $self->decode ($em)) {
+ return $self->error ("Decryption error.", $key, \%params) if $self->errstr();
+ return $M;
+ }
+ return $M;
+}
+
+
+sub encode {
+ my ($self, $M, $emlen) = @_;
+ $M = $M || ""; my $mlen = length($M);
+ return $self->error ("Message too long.", \$M) if $mlen > $emlen-10;
+ my ($PS, $pslen) = ("", 0);
+
+ $pslen = $emlen-$mlen-2;
+ $PS = makerandom_octet (Length => $pslen, Skip => chr(0));
+ my $em = chr(2).$PS.chr(0).$M;
+ return $em;
+}
+
+
+sub decode {
+ my ($self, $em) = @_;
+
+ return $self->error ("Decoding error.") if length($em) < 10;
+
+ debug ("to decode: $em");
+ my ($chr0, $chr2) = (chr(0), chr(2));
+ my ($ps, $M);
+ unless ( ($ps, $M) = $em =~ /^$chr2(.*?)$chr0(.*)$/s ) {
+ return $self->error ("Decoding error.");
+ }
+ return $self->error ("Decoding error.") if length($ps) < 8;
+ return $M;
+}
+
+
+sub encryptblock {
+ my ($self, %params) = @_;
+ return octet_len ($params{Key}->n) - 11;
+}
+
+
+sub decryptblock {
+ my ($self, %params) = @_;
+ return octet_len ($params{Key}->n);
+}
+
+
+sub version {
+ my $self = shift;
+ return $self->{VERSION};
+}
+
+
+1;
+
+=head1 NAME
+
+Crypt::RSA::ES::PKCS1v15 - PKCS #1 v1.5 padded encryption scheme based on RSA.
+
+=head1 SYNOPSIS
+
+ my $pkcs = new Crypt::RSA::ES::PKCS1v15;
+
+ my $ct = $pkcs->encrypt( Key => $key, Message => $message ) ||
+ die $pkcs->errstr;
+
+ my $pt = $pkcs->decrypt( Key => $key, Cyphertext => $ct ) ||
+ die $pkcs->errstr;
+
+=head1 DESCRIPTION
+
+This module implements PKCS #1 v1.5 padded encryption scheme based on RSA.
+See [13] for details on the encryption scheme.
+
+=head1 METHODS
+
+=head2 B<new()>
+
+Constructor.
+
+=head2 B<version()>
+
+Returns the version number of the module.
+
+=head2 B<encrypt()>
+
+Encrypts a string with a public key and returns the encrypted string
+on success. encrypt() takes a hash argument with the following
+mandatory keys:
+
+=over 4
+
+=item B<Message>
+
+A string to be encrypted. The length of this string should not exceed k-10
+octets, where k is the octet length of the RSA modulus. If Message is
+longer than k-10, the method will fail and set $self->errstr to "Message
+too long."
+
+=item B<Key>
+
+Public key of the recipient, a Crypt::RSA::Key::Public object.
+
+=back
+
+=head2 B<decrypt()>
+
+Decrypts cyphertext with a private key and returns plaintext on
+success. $self->errstr is set to "Decryption Error." or appropriate
+error on failure. decrypt() takes a hash argument with the following
+mandatory keys:
+
+=over 4
+
+=item B<Cyphertext>
+
+A string encrypted with encrypt(). The length of the cyphertext must be k
+octets, where k is the length of the RSA modulus.
+
+=item B<Key>
+
+Private key of the receiver, a Crypt::RSA::Key::Private object.
+
+=back
+
+=head1 ERROR HANDLING
+
+See ERROR HANDLING in Crypt::RSA(3) manpage.
+
+=head1 BIBLIOGRAPHY
+
+See BIBLIOGRAPHY in Crypt::RSA(3) manpage.
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, E<lt>mail@vipul.netE<gt>
+
+=head1 SEE ALSO
+
+Crypt::RSA(3), Crypt::RSA::Primitives(3), Crypt::RSA::Keys(3),
+Crypt::RSA::SSA::PSS(3)
+
+=cut
+
+