use
vars
qw($VERSION @ISA @EXPORT_OK)
;
(
$VERSION
) =
sprintf
'%i.%03i'
,
split
(/\./,(
'$Revision: 0.1 $'
=~ /Revision: (\S+)\s/)[0]);
@EXPORT_OK
=
qw(opensslpbekdf_generate)
;
@ISA
=
qw{ Crypt::KDF::_base }
;
sub
opensslpbekdf_generate
{
my
(
$digest
,
$seed
,
$iv
,
$len
) =
@_
;
my
$kdf
= Crypt::KDF::OpenSSLPBEGenerator->new(
-digest
=>
$digest
,
-seed
=>
$seed
,
-iv
=>
$iv
);
return
$kdf
->kdf(
$len
);
}
sub
new
{
my
$class
=
shift
@_
;
my
$self
= {};
bless
(
$self
, (
ref
(
$class
) ?
ref
(
$class
) :
$class
));
my
%opts
=
@_
;
if
(
exists
$opts
{-digest})
{
$self
->{-digest} = (
ref
(
$opts
{-digest}) ?
ref
(
$opts
{-digest}) :
$opts
{-digest});
}
if
(
exists
$opts
{-digestparam})
{
$self
->{-digestparam} =
$opts
{-digestparam};
}
if
(
exists
$opts
{-seed})
{
$self
->{-seed} =
$opts
{-seed};
}
if
(
exists
$opts
{-iv})
{
$self
->{-iv} =
$opts
{-iv};
}
return
$self
;
}
sub
init
{
my
$self
=
shift
@_
;
my
%opts
=
@_
;
if
(
exists
$opts
{-digest})
{
$self
->{-digest} = (
ref
(
$opts
{-digest}) ?
ref
(
$opts
{-digest}) :
$opts
{-digest});
}
if
(
exists
$opts
{-digestparam})
{
$self
->{-digestparam} =
$opts
{-digestparam};
}
if
(
exists
$opts
{-seed})
{
$self
->{-seed} =
$opts
{-seed};
}
if
(
exists
$opts
{-iv})
{
$self
->{-iv} =
$opts
{-iv};
}
return
$self
;
}
sub
kdf
{
my
$self
=
shift
@_
;
my
$len
= 16;
if
(
$_
[0])
{
$len
=
$_
[0];
}
my
$out
=
''
;
my
$last
=
''
;
while
(
length
(
$out
)<
$len
)
{
my
$d
;
if
(!
exists
$self
->{-digest})
{
$self
->{-digest} =
'Digest::MD5'
;
}
if
(
exists
$self
->{-digestparam})
{
$d
=
$self
->{-digest}->new(@{
$self
->{-digestparam} });
}
else
{
$d
=
$self
->{-digest}->new();
}
if
(
$last
ne
''
)
{
$d
->add(
$last
);
}
$d
->add(
$self
->{-seed});
if
(
exists
$self
->{-iv})
{
$d
->add(
$self
->{-iv});
}
$last
=
$d
->digest();
$out
.=
$last
;
}
return
substr
(
$out
,0,
$len
);
}
1;