Codebase list libcryptx-perl / befdfb1 _generators / Mode.pm.tt
befdfb1

Tree @befdfb1 (Download .tar.gz)

Mode.pm.tt @befdfb1raw · history · blame

package Crypt::Mode::[%orig_name%];

[%comment%]

use strict;
use warnings;
our $VERSION = '[%(pmver || "0.000")%]';

use Crypt::Cipher;

sub encrypt {
  my ($self, $pt) = (shift, shift);
  local $SIG{__DIE__} = \&CryptX::_croak;
[%-IF lc_name == 'ecb' or lc_name == 'cbc' %]
  $self->start_encrypt(@_)->add($pt) . $self->finish;
[%-ELSE%]
  $self->start_encrypt(@_)->add($pt);
[%-END%]
}

sub decrypt {
  my ($self, $ct) = (shift, shift);
  local $SIG{__DIE__} = \&CryptX::_croak;
[%-IF lc_name == 'ecb' or lc_name == 'cbc' %]
  $self->start_decrypt(@_)->add($ct) . $self->finish;
[%-ELSE%]
  $self->start_decrypt(@_)->add($ct);
[%-END%]
}

sub CLONE_SKIP { 1 } # prevent cloning

1;

=pod

=head1 NAME

Crypt::Mode::[%orig_name%] - [%info%]

=head1 SYNOPSIS

   use Crypt::Mode::[%orig_name%];
   my $m = Crypt::Mode::[%orig_name%]->new('AES');

   #(en|de)crypt at once
[%-IF lc_name == 'ecb' %]
   my $ciphertext = $m->encrypt($plaintext, $key);
   my $plaintext = $m->decrypt($ciphertext, $key);
[%-ELSE%]
   my $ciphertext = $m->encrypt($plaintext, $key, $iv);
   my $plaintext = $m->decrypt($ciphertext, $key, $iv);
[%-END%]

   #encrypt more chunks
[%-IF lc_name == 'ecb' %]
   $m->start_encrypt($key);
[%-ELSE%]
   $m->start_encrypt($key, $iv);
[%-END%]
   my $ciphertext = $m->add('some data');
   $ciphertext .= $m->add('more data');
[%-IF lc_name == 'ecb' or lc_name == 'cbc' %]
   $ciphertext .= $m->finish;
[%-END%]

   #decrypt more chunks
[%-IF lc_name == 'ecb' %]
   $m->start_decrypt($key);
[%-ELSE%]
   $m->start_decrypt($key, $iv);
[%-END%]
   my $plaintext = $m->add($some_ciphertext);
   $plaintext .= $m->add($more_ciphertext);
[%-IF lc_name == 'ecb' or lc_name == 'cbc' %]
   $plaintext .= $m->finish;
[%-END%]

=head1 DESCRIPTION

[%desc%]

=head1 METHODS

=head2 new

[%-IF lc_name == 'ctr' %]
 my $m = Crypt::Mode::[%orig_name%]->new($cipher_name);
 #or
 my $m = Crypt::Mode::[%orig_name%]->new($cipher_name, $ctr_mode, $ctr_width);
 #or
 my $m = Crypt::Mode::[%orig_name%]->new($cipher_name, $ctr_mode, $ctr_width, $cipher_rounds);

 # $cipher_name .. one of 'AES', 'Anubis', 'Blowfish', 'CAST5', 'Camellia', 'DES', 'DES_EDE',
 #                 'KASUMI', 'Khazad', 'MULTI2', 'Noekeon', 'RC2', 'RC5', 'RC6',
 #                 'SAFERP', 'SAFER_K128', 'SAFER_K64', 'SAFER_SK128', 'SAFER_SK64',
 #                 'SEED', 'Skipjack', 'Twofish', 'XTEA', 'IDEA', 'Serpent'
 #                 simply any <NAME> for which there exists Crypt::Cipher::<NAME>
 # $ctr_mode ..... 0 little-endian counter (DEFAULT)
 #                 1 big-endian counter
 #                 2 little-endian + RFC3686 incrementing
 #                 3 big-endian + RFC3686 incrementing
 # $ctr_width .... counter width in bytes (DEFAULT = full block width)
 # $cipher_rounds ... optional num of rounds for given cipher
[%-ELSIF lc_name == 'ecb' or lc_name == 'cbc' %]
 my $m = Crypt::Mode::[%orig_name%]->new($name);
 #or
 my $m = Crypt::Mode::[%orig_name%]->new($name, $padding);
 #or
 my $m = Crypt::Mode::[%orig_name%]->new($name, $padding, $cipher_rounds);

 # $name ....... one of 'AES', 'Anubis', 'Blowfish', 'CAST5', 'Camellia', 'DES', 'DES_EDE',
 #               'KASUMI', 'Khazad', 'MULTI2', 'Noekeon', 'RC2', 'RC5', 'RC6',
 #               'SAFERP', 'SAFER_K128', 'SAFER_K64', 'SAFER_SK128', 'SAFER_SK64',
 #               'SEED', 'Skipjack', 'Twofish', 'XTEA', 'IDEA', 'Serpent'
 #               simply any <NAME> for which there exists Crypt::Cipher::<NAME>
 # $padding .... 0 no padding (plaintext size has to be multiple of block length)
 #               1 PKCS5 padding, Crypt::CBC's "standard" - DEFAULT
 #               2 Crypt::CBC's "oneandzeroes"
 #               3 ANSI X.923 padding
 #               4 zero padding
 #               5 zero padding (+a block of zeros if the output length is divisible by the blocksize)
 # $cipher_rounds ... optional num of rounds for given cipher
[%-ELSE%]
 my $m = Crypt::Mode::[%orig_name%]->new($name);
 #or
 my $m = Crypt::Mode::[%orig_name%]->new($name, $cipher_rounds);

 # $name ............ one of 'AES', 'Anubis', 'Blowfish', 'CAST5', 'Camellia', 'DES', 'DES_EDE',
 #                    'KASUMI', 'Khazad', 'MULTI2', 'Noekeon', 'RC2', 'RC5', 'RC6',
 #                    'SAFERP', 'SAFER_K128', 'SAFER_K64', 'SAFER_SK128', 'SAFER_SK64',
 #                    'SEED', 'Skipjack', 'Twofish', 'XTEA', 'IDEA', 'Serpent'
 #                    simply any <NAME> for which there exists Crypt::Cipher::<NAME>
 # $cipher_rounds ... optional num of rounds for given cipher
[%-END%]

=head2 encrypt

[%-IF lc_name == 'ecb' %]
   my $ciphertext = $m->encrypt($plaintext, $key);
[%-ELSE%]
   my $ciphertext = $m->encrypt($plaintext, $key, $iv);
[%-END%]

=head2 decrypt

[%-IF lc_name == 'ecb' %]
   my $plaintext = $m->decrypt($ciphertext, $key);
[%-ELSE%]
   my $plaintext = $m->decrypt($ciphertext, $key, $iv);
[%-END%]

=head2 start_encrypt

[%-IF lc_name == 'ecb' %]
   $m->start_encrypt($key);
[%-ELSE%]
   $m->start_encrypt($key, $iv);
[%-END%]

=head2 start_decrypt

[%-IF lc_name == 'ecb' %]
   $m->start_decrypt($key);
[%-ELSE%]
   $m->start_decrypt($key, $iv);
[%-END%]

=head2 add

   # in encrypt mode
   my $plaintext = $m->add($ciphertext);

   # in decrypt mode
   my $ciphertext = $m->add($plaintext);

[%-IF lc_name == 'ecb' or lc_name == 'cbc' %]
=head2 finish

   #encrypt more chunks
[%-IF lc_name == 'ecb' %]
   $m->start_encrypt($key);
[%-ELSE%]
   $m->start_encrypt($key, $iv);
[%-END%]
   my $ciphertext = '';
   $ciphertext .= $m->add('some data');
   $ciphertext .= $m->add('more data');
[%-IF lc_name == 'ecb' or lc_name == 'cbc' %]
   $ciphertext .= $m->finish;
[%-END%]

   #decrypt more chunks
[%-IF lc_name == 'ecb' %]
   $m->start_decrypt($key);
[%-ELSE%]
   $m->start_decrypt($key, $iv);
[%-END%]
   my $plaintext = '';
   $plaintext .= $m->add($some_ciphertext);
   $plaintext .= $m->add($more_ciphertext);
[%-IF lc_name == 'ecb' or lc_name == 'cbc' %]
   $plaintext .= $m->finish;
[%-END%]

[%-END%]
=head1 SEE ALSO

=over

=item * L<CryptX|CryptX>, L<Crypt::Cipher>

=item * L<Crypt::Cipher::AES>, L<Crypt::Cipher::Blowfish>, ...
[% FOREACH v IN urls %]
=item * L<[%v%]>
[% END %]
=back

=cut