[Affelio-cvs 742] CVS update: affelio/extlib/Crypt

Back to archive index

Tadashi Okoshi slash****@users*****
2005年 11月 4日 (金) 11:08:49 JST


Index: affelio/extlib/Crypt/Random.pm
diff -u /dev/null affelio/extlib/Crypt/Random.pm:1.1
--- /dev/null	Fri Nov  4 11:08:49 2005
+++ affelio/extlib/Crypt/Random.pm	Fri Nov  4 11:08:48 2005
@@ -0,0 +1,267 @@
+#!/usr/bin/perl -s
+##
+## Crypt::Random -- Interface to /dev/random and /dev/urandom.
+##
+## Copyright (c) 1998, Vipul Ved Prakash.  All rights reserved.
+## This code is free software; you can redistribute it and/or modify
+## it under the same terms as Perl itself.
+##
+## $Id: Random.pm,v 1.1 2005/11/04 02:08:48 slash5234 Exp $
+
+package Crypt::Random; 
+require Exporter;
+use vars qw($VERSION @EXPORT_OK); 
+
+BEGIN {
+    *import = \&Exporter::import;
+    @EXPORT_OK = qw( makerandom makerandom_itv makerandom_octet );
+}
+
+use Math::Pari qw(PARI floor Mod pari2pv pari2num lift); 
+use Carp; 
+use Data::Dumper;
+use Class::Loader;
+use Crypt::Random::Generator;
+
+$VERSION     = 1.25;
+
+
+sub _pickprovider { 
+
+    my (%params) = @_;
+
+    return $params{Provider} if $params{Provider};
+    $params{Strength} ||= 0;
+    my $gen = new Crypt::Random::Generator Strength => $params{Strength};
+    return $gen->{Provider};
+
+}
+
+sub makerandom { 
+
+    my ( %params ) = @_;
+
+    $params{Verbosity} = 0 unless $params{Verbosity};
+    my $uniform = $params{Uniform} || 0;
+    local $| = 1;
+
+    my $provider = _pickprovider(%params);
+    my $loader = new Class::Loader;
+    my $po = $loader->_load ( Module => "Crypt::Random::Provider::$provider", 
+                              Args => [ map { $_ => $params{$_} }
+                                qw(Strength Provider) ] )
+
+        or die "Unable to load module Crypt::Random::Provider::$provider - $!";
+    my $r = $po->get_data( %params );
+
+    my $size     = $params{Size};
+    my $down     = $size - 1;
+
+    unless ($uniform) { 
+
+        # We always set the high bit of the random number if 
+        # we want the result to occupy exactly $size bits.
+
+        $y = unpack "H*",     pack "B*", '0' x ( $size%8 ? 8-$size % 8 : 0 ). '1'.
+             unpack "b$down", $r;
+
+    } else { 
+
+        # If $uniform is set $size of 2 could return 00 
+        # and 01 in addition to 10 and 11. 00 and 01 can 
+        # be represented in less than 2 bits, but 
+        # the result of this generation is uniformally 
+        # distributed.
+
+        $y = unpack "H*",     pack "B*", '0' x ( $size%8 ? 8-$size % 8 : 0 ).
+             unpack "b$size", $r;
+
+    }
+
+    return Math::Pari::_hex_cvt ( "0x$y" );
+
+}
+
+
+sub makerandom_itv { 
+
+    my ( %params ) = @_; 
+
+    my $a  = $params{ Lower } || 0; $a = PARI ( $a ); 
+    my $b  = $params{ Upper }; $b = PARI ( $b );
+
+    my $itv    = Mod ( 0, $b - $a );
+    my $size   = length ( $itv ) * 5;
+    my $random = makerandom %params, Size => $size;
+
+    do { $random = makerandom %params, Size => $size } 
+    while ( $random >= (PARI(2)**$size) - ((PARI(2)**$size) % lift($b-$a)));
+
+    $itv += $random; 
+    my $r = PARI ( lift ( $itv ) + $a );
+
+    undef $itv; undef $a; undef $b; 
+    return "$r";
+
+}
+
+
+sub makerandom_octet  {
+
+    my ( %params ) = @_; 
+
+    $params{Verbosity} = 0 unless $params{Verbosity};
+
+    my $provider = _pickprovider(%params); 
+    my $loader = new Class::Loader;
+    my $po = $loader->_load ( Module => "Crypt::Random::Provider::$provider", 
+                              Args => [ %params ] );
+    return $po->get_data( %params );
+
+
+}
+
+
+'True Value';
+
+=head1 NAME
+
+Crypt::Random - Cryptographically Secure, True Random Number Generator. 
+
+=head1 VERSION
+
+ $Revision: 1.1 $
+ $Date: 2005/11/04 02:08:48 $
+
+=head1 SYNOPSIS
+
+ use Crypt::Random qw( makerandom ); 
+ my $r = makerandom ( Size => 512, Strength => 1 ); 
+
+=head1 DESCRIPTION
+
+Crypt::Random is an interface module to the /dev/random device found on
+most modern unix systems. It also interfaces with egd, a user space
+entropy gathering daemon, available for systems where /dev/random (or
+similar) devices are not available. When Math::Pari is installed,
+Crypt::Random can generate random integers of arbritary size of a given
+bitsize or in a specified interval.
+
+=head1 BLOCKING BEHAVIOUR
+
+The /dev/random driver maintains an estimate of true randomness in the
+pool and decreases it every time random strings are requested for use.
+When the estimate goes down to zero, the routine blocks and waits for the
+occurrence of non-deterministic events to refresh the pool.
+
+When the routine is blocked, Crypt::Random's read() will be blocked till
+desired amount of random bytes have been read off of the device. The
+/dev/random kernel module also provides another interface, /dev/urandom,
+that does not wait for the entropy-pool to recharge and returns as many
+bytes as requested. For applications that must not block (for a
+potentially long time) should use /dev/urandom. /dev/random should be
+reserved for instances where very high quality randomness is desired.
+
+=head1 HARDWARE RNG
+
+If there's a hardware random number generator available, for instance the
+Intel i8x0 random number generator, please use it instead of /dev/random!.
+It'll be high quality, a lot faster and it won't block! Usually your OS
+will provide access to the RNG as a device, eg (/dev/intel_rng).
+
+=head1 METHODS 
+
+=over 4
+
+=item B<makerandom()>
+
+Generates a random number of requested bitsize in base 10. Following
+arguments can be specified.
+
+=over 4
+
+=item B<Size> 
+
+Bitsize of the random number. 
+
+=item B<Strength> 0 || 1 
+
+Value of 1 implies that /dev/random should be used
+for requesting random bits while 0 implies /dev/urandom.
+
+=item B<Device> 
+
+Alternate device to request random bits from. 
+
+=item B<Uniform> 0 || 1
+
+Value of 0 (default) implies that the high bit of the generated random
+number is always set, ensuring the bitsize of the generated random will be
+exactly Size bits. For uniformally distributed random numbers, Uniform
+should be set to 1.
+
+=back 
+
+=item B<makerandom_itv()> 
+
+Generates a random number in the specified interval.  In addition 
+to the arguments to makerandom() following attributes can be 
+specified. 
+
+=over 4
+
+=item B<Lower> 
+
+Inclusive Lower limit.  
+
+=item B<Upper> 
+
+Exclusive Upper limit. 
+
+=back 
+
+=item B<makerandom_octet()>
+
+Generates a random octet string of specified length. In addition to
+B<Strength>, B<Device> and B<Verbosity>, following arguments can be
+specified.
+
+=over 4
+
+=item B<Length>
+
+Length of the desired octet string. 
+
+=item B<Skip>
+
+An octet string consisting of characters to be skipped while reading from
+the random device.
+
+=back
+
+=back
+
+=head1 DEPENDENCIES
+
+Crypt::Random needs Math::Pari 2.001802 or higher. As of this writing, the
+latest version of Math::Pari isn't available from CPAN. Fetch it from
+ftp://ftp.math.ohio-state.edu/pub/users/ilya/perl/modules/
+
+=head1 BIBLIOGRAPHY 
+
+=over 4
+
+=item 1 random.c by Theodore Ts'o.  Found in drivers/char directory of 
+the Linux kernel sources.
+
+=item 2 Handbook of Applied Cryptography by Menezes, Paul C. van Oorschot
+and Scott Vanstone.
+
+=back
+
+=head1 AUTHOR
+
+Vipul Ved Prakash, <mail****@vipul*****>
+
+=cut
+


Affelio-cvs メーリングリストの案内
Back to archive index