summaryrefslogtreecommitdiff
path: root/lib/securerandom.rb
blob: 6079fdb5c487302eebd5fc34e5a54fa56a0c3764 (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
# -*- coding: us-ascii -*- # frozen_string_literal: true require 'random/formatter' # == Secure random number generator interface. # # This library is an interface to secure random number generators which are # suitable for generating session keys in HTTP cookies, etc. # # You can use this library in your application by requiring it: # # require 'securerandom' # # It supports the following secure random number generators: # # * openssl # * /dev/urandom # * Win32 # # SecureRandom is extended by the Random::Formatter module which # defines the following methods: # # * alphanumeric # * base64 # * choose # * gen_random # * hex # * rand # * random_bytes # * random_number # * urlsafe_base64 # * uuid # # These methods are usable as class methods of SecureRandom such as # +SecureRandom.hex+. # # If a secure random number generator is not available, # +NotImplementedError+ is raised. module SecureRandom # The version VERSION = "0.4.1" class << self # Returns a random binary string containing +size+ bytes. # # See Random.bytes def bytes(n) return gen_random(n) end # Compatibility methods for Ruby 3.2, we can remove this after dropping to support Ruby 3.2 def alphanumeric(n = nil, chars: ALPHANUMERIC) n = 16 if n.nil? choose(chars, n) end if RUBY_VERSION < '3.3' private # :stopdoc: # Implementation using OpenSSL def gen_random_openssl(n) return OpenSSL::Random.random_bytes(n) end # Implementation using system random device def gen_random_urandom(n) ret = Random.urandom(n) unless ret raise NotImplementedError, "No random device" end unless ret.length == n raise NotImplementedError, "Unexpected partial read from random device: only #{ret.length} for #{n} bytes" end ret end begin # Check if Random.urandom is available Random.urandom(1) alias gen_random gen_random_urandom rescue RuntimeError begin require 'openssl' rescue NoMethodError raise NotImplementedError, "No random device" else alias gen_random gen_random_openssl end end # :startdoc: # Generate random data bytes for Random::Formatter public :gen_random end end SecureRandom.extend(Random::Formatter) 
close