1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

documented.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12478 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2007-06-08 06:12:49 +00:00
parent 4d43632852
commit bfe9063990

View file

@ -1,9 +1,48 @@
# = Secure random number generator interface.
#
# This library is a interface for secure random number generator which is
# suitable for HTTP cookies, etc.
#
# It supports following secure random number generators.
#
# * openssl
# * /dev/urandom
#
# == Example
#
# # random hexadecimal string.
# p SecRand.hex(10) #=> "52750b30ffbc7de3b362"
# p SecRand.hex(10) #=> "92b15d6c8dc4beb5f559"
# p SecRand.hex(11) #=> "6aca1b5c58e4863e6b81b8"
# p SecRand.hex(12) #=> "94b2fff3e7fd9b9c391a2306"
# p SecRand.hex(13) #=> "39b290146bea6ce975c37cfc23"
#
# # random base64 string.
# p SecRand.base64(10) #=> "EcmTPZwWRAozdA=="
# p SecRand.base64(10) #=> "9b0nsevdwNuM/w=="
# p SecRand.base64(10) #=> "KO1nIU+p9DKxGg=="
# p SecRand.base64(11) #=> "l7XEiFja+8EKEtY="
# p SecRand.base64(12) #=> "7kJSM/MzBJI+75j8"
# p SecRand.base64(13) #=> "vKLJ0tXBHqQOuIcSIg=="
# ...
#
# # random binary string.
# p SecRand.random_bytes(10) #=> "\016\t{\370g\310pbr\301"
# p SecRand.random_bytes(10) #=> "\323U\030TO\234\357\020\a\337"
# ...
begin begin
require 'openssl' require 'openssl'
rescue LoadError rescue LoadError
end end
module SecRand module SecRand
# SecRand.random_bytes generates a random binary string.
#
# The argument n specifies the length of the result string.
#
# If secure random number generator is not available,
# NotImplementedError is raised.
def self.random_bytes(n=nil) def self.random_bytes(n=nil)
n ||= 16 n ||= 16
if defined? OpenSSL::Random if defined? OpenSSL::Random
@ -34,16 +73,36 @@ module SecRand
raise NotImplementedError, "No random device" raise NotImplementedError, "No random device"
end end
# SecRand.hex generates a random hex string.
#
# The argument n specifies the length of the random length.
# The length of the result string is twice of n.
#
# If secure random number generator is not available,
# NotImplementedError is raised.
def self.hex(n=nil) def self.hex(n=nil)
random_bytes(n).unpack("H*")[0] random_bytes(n).unpack("H*")[0]
end end
# SecRand.base64 generates a random base64 string.
#
# The argument n specifies the length of the random length.
# The length of the result string is about 4/3 of n.
#
# If secure random number generator is not available,
# NotImplementedError is raised.
def self.base64(n=nil) def self.base64(n=nil)
[random_bytes(n)].pack("m*").delete("\n") [random_bytes(n)].pack("m*").delete("\n")
end end
end end
# SecRand() generates a random number.
#
# If an positive integer is given as n,
# SecRand() returns an integer: 0 <= SecRand(n) < n.
#
# If 0 is given or an argument is not given,
# SecRand() returns an float: 0.0 <= SecRand() < 1.0.
def SecRand(n=0) def SecRand(n=0)
if 0 < n if 0 < n
hex = n.to_s(16) hex = n.to_s(16)