Bytes-Random-Secure-Tiny
view release on metacpan or search on metacpan
lib/Bytes/Random/Secure/Tiny.pm view on Meta::CPAN
}
for (my $i = 0; $i < 256; $i += 8) {
$c += $r->[$i ]; $d += $r->[$i+1];
$e += $r->[$i+2]; $f += $r->[$i+3];
$g += $r->[$i+4]; $h += $r->[$i+5];
$j += $r->[$i+6]; $k += $r->[$i+7];
$c ^= $d << 11; $f += $c; $d += $e;
$d ^= 0x3fffffff & ($e >> 2); $g += $d; $e += $f;
$e ^= $f << 8; $h += $e; $f += $g;
$f ^= 0x0000ffff & ($g >> 16); $j += $f; $g += $h;
$g ^= $h << 10; $k += $g; $h += $j;
$h ^= 0x0fffffff & ($j >> 4); $c += $h; $j += $k;
$j ^= $k << 8; $d += $j; $k += $c;
$k ^= 0x007fffff & ($c >> 9); $e += $k; $c += $d;
$mm->[$i ] = $c; $mm->[$i+1] = $d;
$mm->[$i+2] = $e; $mm->[$i+3] = $f;
$mm->[$i+4] = $g; $mm->[$i+5] = $h;
$mm->[$i+6] = $j; $mm->[$i+7] = $k;
}
for (my $i = 0; $i < 256; $i += 8) {
$c += $mm->[$i ]; $d += $mm->[$i+1];
$e += $mm->[$i+2]; $f += $mm->[$i+3];
$g += $mm->[$i+4]; $h += $mm->[$i+5];
$j += $mm->[$i+6]; $k += $mm->[$i+7];
$c ^= $d << 11; $f += $c; $d += $e;
$d ^= 0x3fffffff & ($e >> 2); $g += $d; $e += $f;
$e ^= $f << 8; $h += $e; $f += $g;
$f ^= 0x0000ffff & ($g >> 16); $j += $f; $g += $h;
$g ^= $h << 10; $k += $g; $h += $j;
$h ^= 0x0fffffff & ($j >> 4); $c += $h; $j += $k;
$j ^= $k << 8; $d += $j; $k += $c;
$k ^= 0x007fffff & ($c >> 9); $e += $k; $c += $d;
$mm->[$i ] = $c; $mm->[$i+1] = $d;
$mm->[$i+2] = $e; $mm->[$i+3] = $f;
$mm->[$i+4] = $g; $mm->[$i+5] = $h;
$mm->[$i+6] = $j; $mm->[$i+7] = $k;
}
$self->_isaac;
$self->[randcnt] = 256;
return;
}
1;
package Math::Random::ISAAC::Embedded;
use strict;
use warnings;
our $VERSION = '1.011';
use constant _backend => 0;
my %CSPRNG = (
XS => 'Math::Random::ISAAC::XS',
PP => 'Math::Random::ISAAC::PP',
EM => 'Math::Random::ISAAC::PP::Embedded',
);
sub new {
my ($class, @seed) = @_;
our $EMBEDDED_CSPRNG =
defined $EMBEDDED_CSPRNG ? $EMBEDDED_CSPRNG :
defined $ENV{'BRST_EMBEDDED_CSPRNG'} ? $ENV{'BRST_EMBEDDED_CSPRNG'} : 0;
my $DRIVER =
$EMBEDDED_CSPRNG ? $CSPRNG{'EM'} :
eval {require Math::Random::ISAAC::XS; 1} ? $CSPRNG{'XS'} :
eval {require Math::Random::ISAAC::PP; 1} ? $CSPRNG{'PP'} :
$CSPRNG{'EM'};
return bless [$DRIVER->new(@seed)], $class;
}
sub irand {shift->[_backend]->irand}
1;
package Bytes::Random::Secure::Tiny;
use strict;
use warnings;
use 5.006000;
use Carp qw(croak);
use Hash::Util;
our $VERSION = '1.011';
# See Math::Random::ISAAC https://rt.cpan.org/Public/Bug/Display.html?id=64324
use constant SEED_SIZE => 256; # bits; eight 32-bit words.
sub new {
my($self, $class, %args) = ({}, @_);
$args{lc $_} = delete $args{$_} for keys %args; # Convert args to lc names
my $bits = SEED_SIZE; # Default: eight 32bit words.
$bits = delete $args{bits} if exists $args{bits};
croak "Number of bits must be 64 <= n <= 8192, and a multipe in 2^n: $bits"
if $bits < 64 || $bits > 8192 || !_ispowerof2($bits);
return Hash::Util::lock_hashref bless {
bits => $bits,
_rng => Math::Random::ISAAC::Embedded->new(do{
my $source = Crypt::Random::Seed::Embedded->new(%args)
or croak 'Could not get a seed source.';
$source->random_values($bits/32);
}),
}, $class;
}
sub _ispowerof2 {my $n = shift; return ($n >= 0) && (($n & ($n-1)) ==0 )}
sub irand {shift->{'_rng'}->irand}
sub bytes_hex {unpack 'H*', shift->bytes(shift)} # lc Hex digits only, no '0x'
sub bytes {
my($self, $bytes) = @_;
$bytes = defined $bytes ? int abs $bytes : 0; # Default 0, coerce to UINT.
my $str = q{};
while ($bytes >= 4) { # Utilize irand()'s 32 bits.
$str .= pack("L", $self->irand);
$bytes -= 4;
}
if ($bytes > 0) { # Handle 16b and 8b respectively.
$str .= pack("S", ($self->irand >> 8) & 0xFFFF) if $bytes >= 2;
$str .= pack("C", $self->irand & 0xFF) if $bytes % 2;
}
return $str;
}
sub string_from {
( run in 0.584 second using v1.01-cache-2.11-cpan-71847e10f99 )