File Coverage

blib/lib/Crypt/PRNG/Fortuna.pm
Criterion Covered Total %
statement 23 23 100.0
branch n/a
condition n/a
subroutine 13 13 100.0
pod 9 9 100.0
total 45 45 100.0


line stmt bran cond sub pod time code
1             package Crypt::PRNG::Fortuna;
2              
3 3     3   142345 use strict;
  3         5  
  3         96  
4 3     3   19 use warnings;
  3         4  
  3         194  
5             our $VERSION = '0.089';
6              
7 3     3   18 use base qw(Crypt::PRNG Exporter);
  3         21  
  3         1009  
8             our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] );
9             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
10             our @EXPORT = qw();
11              
12 3     3   16 use CryptX;
  3         3  
  3         839  
13              
14             sub new {
15 5     5 1 280796 my ($class, @args) = @_;
16 5         408 my $obj = Crypt::PRNG->new('Fortuna', @args);
17 5         37 return bless $obj, $class;
18             }
19              
20             {
21             ### stolen from Bytes::Random::Secure
22             my $RNG_object = undef;
23             my $fetch_RNG = sub { # Lazily, instantiate the RNG object, but only once.
24             $RNG_object = Crypt::PRNG::Fortuna->new unless defined $RNG_object && ref($RNG_object) ne 'SCALAR';
25             return $RNG_object;
26             };
27 2000     2000 1 8626 sub rand { return $fetch_RNG->()->double(@_) }
28 1000     1000 1 1662 sub irand { return $fetch_RNG->()->int32(@_) }
29 1     1 1 3 sub random_bytes { return $fetch_RNG->()->bytes(@_) }
30 1     1 1 4 sub random_bytes_hex { return $fetch_RNG->()->bytes_hex(@_) }
31 1     1 1 3 sub random_bytes_b64 { return $fetch_RNG->()->bytes_b64(@_) }
32 1     1 1 3 sub random_bytes_b64u { return $fetch_RNG->()->bytes_b64u(@_) }
33 1     1 1 4 sub random_string_from { return $fetch_RNG->()->string_from(@_) }
34 1     1 1 3 sub random_string { return $fetch_RNG->()->string(@_) }
35             }
36              
37              
38             1;
39              
40             =pod
41              
42             =head1 NAME
43              
44             Crypt::PRNG::Fortuna - Cryptographically secure PRNG based on Fortuna algorithm
45              
46             =head1 SYNOPSIS
47              
48             ### Functional interface:
49             use Crypt::PRNG::Fortuna qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u
50             random_string random_string_from rand irand);
51              
52             my $octets = random_bytes(45);
53             my $hex_string = random_bytes_hex(45);
54             my $base64_string = random_bytes_b64(45);
55             my $base64url_string = random_bytes_b64u(45);
56             my $alphanumeric_string = random_string(30);
57             my $string = random_string_from('ACGT', 64);
58             my $floating_point_number_0_to_1 = rand;
59             my $floating_point_number_0_to_88 = rand(88);
60             my $unsigned_32bit_int = irand;
61              
62             ### OO interface:
63             use Crypt::PRNG::Fortuna;
64              
65             my $prng = Crypt::PRNG::Fortuna->new;
66             my $seeded_prng = Crypt::PRNG::Fortuna->new("some data used for seeding PRNG");
67              
68             my $octets = $prng->bytes(45);
69             my $hex_string = $prng->bytes_hex(45);
70             my $base64_string = $prng->bytes_b64(45);
71             my $base64url_string = $prng->bytes_b64u(45);
72             my $alphanumeric_string = $prng->string(30);
73             my $string = $prng->string_from('ACGT', 64);
74             my $floating_point_number_0_to_1 = $prng->double;
75             my $floating_point_number_0_to_88 = $prng->double(88);
76             my $unsigned_32bit_int = $prng->int32;
77              
78             =head1 DESCRIPTION
79              
80             Provides an interface to the Fortuna-based pseudo-random number generator.
81              
82             This is a thin wrapper around L with the algorithm fixed to
83             Fortuna. All functions and methods accept the same arguments and return the
84             same values as the corresponding L entries.
85              
86             =head1 EXPORT
87              
88             Nothing is exported by default.
89              
90             You can export selected functions:
91              
92             use Crypt::PRNG::Fortuna qw(random_bytes random_string);
93              
94             Or all of them at once:
95              
96             use Crypt::PRNG::Fortuna ':all';
97              
98             =head1 FUNCTIONS
99              
100             All functions below behave exactly like the corresponding L
101             functions, but use a hidden C object internally.
102              
103             =head2 random_bytes
104              
105             See L.
106              
107             =head2 random_bytes_hex
108              
109             See L.
110              
111             =head2 random_bytes_b64
112              
113             See L.
114              
115             =head2 random_bytes_b64u
116              
117             See L.
118              
119             =head2 random_string
120              
121             See L.
122              
123             =head2 random_string_from
124              
125             See L.
126              
127             =head2 rand
128              
129             See L.
130              
131             =head2 irand
132              
133             See L.
134              
135             =head1 METHODS
136              
137             Unless noted otherwise, assume C<$prng> is an existing
138             C object created via C.
139              
140             =head2 new
141              
142             my $prng = Crypt::PRNG::Fortuna->new;
143             my $seeded_prng = Crypt::PRNG::Fortuna->new($seed);
144              
145             Creates a PRNG object using the Fortuna algorithm. If C<$seed> is omitted, the
146             object is automatically seeded by the underlying L logic.
147              
148             =head2 bytes
149              
150             See L.
151              
152             =head2 bytes_hex
153              
154             See L.
155              
156             =head2 bytes_b64
157              
158             See L.
159              
160             =head2 bytes_b64u
161              
162             See L.
163              
164             =head2 string
165              
166             See L.
167              
168             =head2 string_from
169              
170             See L.
171              
172             =head2 double
173              
174             See L.
175              
176             =head2 int32
177              
178             See L.
179              
180             =head1 SEE ALSO
181              
182             =over
183              
184             =item * L
185              
186             =item * L
187              
188             =back
189              
190             =cut