diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-01-20 08:00:00 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-01-20 08:00:00 +0000 |
commit | abae70d6ed63054d7d01bd6cd80c1b5b98b93ba3 (patch) | |
tree | 3de590fcf8f22217987675fbc5eea399597c8fca /random.c | |
parent | e95eb9584ac85b728734d77e07fa27f23c91f38d (diff) | |
download | bundler-abae70d6ed63054d7d01bd6cd80c1b5b98b93ba3.tar.gz |
SecureRandom should try /dev/urandom first [Bug #9569]
* random.c (InitVM_Random): rename Random.raw_seed to
Random.urandom. A quick search seems there are no practical use
of this method than securerandom.rb so I think it's OK to rename
but if there are users of it, this hunk is subject to revert.
* test/ruby/test_rand.rb (TestRand#test_urandom): test for it.
* lib/securerandom.rb (SecureRandom.gen_random): Prefer OS-
provided CSPRNG if available. Otherwise falls back to OpenSSL.
Current preference is:
1. CSPRNG routine that the OS has; one of
- getrandom(2),
- arc4random(3), or
- CryptGenRandom()
2. /dev/urandom device
3. OpenSSL's RAND_bytes(3)
If none of above random number generators are available, you
cannot use this module. An exception is raised that case.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57384 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'random.c')
-rw-r--r-- | random.c | 15 |
1 files changed, 11 insertions, 4 deletions
@@ -603,11 +603,18 @@ random_seed(void) } /* - * call-seq: Random.raw_seed(size) -> string + * call-seq: Random.urandom(size) -> string * - * Returns a raw seed string, using platform providing features. + * Returns a string, using platform providing features. + * Returned value expected to be a cryptographically secure + * pseudo-random number in binary form. * - * Random.raw_seed(8) #=> "\x78\x41\xBA\xAF\x7D\xEA\xD8\xEA" + * In 2017, Linux manpage random(7) writes that "no cryptographic + * primitive available today can hope to promise more than 256 bits of + * security". So it might be questionable to pass size > 32 to this + * method. + * + * Random.urandom(8) #=> "\x78\x41\xBA\xAF\x7D\xEA\xD8\xEA" */ static VALUE random_raw_seed(VALUE self, VALUE size) @@ -1616,7 +1623,7 @@ InitVM_Random(void) rb_define_singleton_method(rb_cRandom, "srand", rb_f_srand, -1); rb_define_singleton_method(rb_cRandom, "rand", random_s_rand, -1); rb_define_singleton_method(rb_cRandom, "new_seed", random_seed, 0); - rb_define_singleton_method(rb_cRandom, "raw_seed", random_raw_seed, 1); + rb_define_singleton_method(rb_cRandom, "urandom", random_raw_seed, 1); rb_define_private_method(CLASS_OF(rb_cRandom), "state", random_s_state, 0); rb_define_private_method(CLASS_OF(rb_cRandom), "left", random_s_left, 0); |