File: PBKDF.pm

package info (click to toggle)
libcrypt-cbc-perl 3.07-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 364 kB
  • sloc: perl: 2,074; makefile: 2
file content (52 lines) | stat: -rw-r--r-- 1,218 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package Crypt::CBC::PBKDF;

our $VERSION = '3.07';
# just a virtual base class for passphrase=>key derivation functions
use strict;
use File::Basename 'dirname','basename';
use Carp 'croak';

sub new {
    my $class    = shift;
    my $subclass = shift;
    my $options  = shift;

    my $package = __PACKAGE__."::$subclass";
    eval "use $package; 1" or
	croak "Could not load $subclass: $@";

    return $package->create(%$options);
}

# returns a series of subclasses
sub list {
    my $self = shift;
    my $dir      = dirname(__FILE__);
    my @pm_files = <$dir/PBKDF/*.pm>;
    my @subclasses;
    foreach (@pm_files) {
	my $base =  basename($_);
	$base    =~ s/\.pm$//;
	push @subclasses,$base;
    }
    return @subclasses;
}

sub generate_hash {
    my $self = shift;
    my ($salt,$passphrase) = @_;
    croak "generate() method not implemented in this class. Use one of the subclasses",join(',',$self->list);
}

sub key_and_iv {
    my $self = shift;
    croak 'usage $obj->salt_key_iv($salt,$passphrase)' unless @_ == 2;

    my $hash = $self->generate_hash(@_);

    my $key  = substr($hash,0,$self->{key_len});
    my $iv   = substr($hash,$self->{key_len},$self->{iv_len});
    return ($key,$iv);
}

1;