Skip to content

Commit 99c05fb

Browse files
author
kosaki
committed
* random.c (Init_RandomSeed): move all Random::DEFAULT
construction bits to Init_RandomSeed2. Random::DEFAULT and Ruby internal hashes are no longer shared their seed. * random.c (Init_RandomSeed2): ditto. And, kill evil rb_obj_reveal() stuff. * random.c (init_hashseed): add MT argument. * random.c: (init_siphash): ditto. * test/ruby/test_rand.rb (TestRand#test_default_seed): new test for Random::DEFAULT::seed. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52815 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 052535b commit 99c05fb

File tree

3 files changed

+56
-29
lines changed

3 files changed

+56
-29
lines changed

ChangeLog

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
Thu Oct 22 06:20:48 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
2+
3+
* random.c (Init_RandomSeed): move all Random::DEFAULT
4+
construction bits to Init_RandomSeed2. Random::DEFAULT
5+
and Ruby internal hashes are no longer shared their seed.
6+
* random.c (Init_RandomSeed2): ditto. And, kill evil
7+
rb_obj_reveal() stuff.
8+
9+
* random.c (init_hashseed): add MT argument.
10+
* random.c: (init_siphash): ditto.
11+
12+
* test/ruby/test_rand.rb (TestRand#test_default_seed): new
13+
test for Random::DEFAULT::seed.
14+
115
Thu Oct 22 05:23:48 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
216

317
* random.c (init_hashseed, init_siphash): extract initialize

random.c

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1452,24 +1452,9 @@ static union {
14521452
uint32_t u32[(16 * sizeof(uint8_t) - 1) / sizeof(uint32_t)];
14531453
} sipseed;
14541454

1455-
static VALUE
1456-
init_randomseed(struct MT *mt)
1457-
{
1458-
uint32_t initial[DEFAULT_SEED_CNT];
1459-
VALUE seed;
1460-
1461-
fill_random_seed(initial);
1462-
init_by_array(mt, initial, DEFAULT_SEED_CNT);
1463-
seed = make_seed_value(initial);
1464-
explicit_bzero(initial, DEFAULT_SEED_LEN);
1465-
return seed;
1466-
}
1467-
14681455
static void
1469-
init_hashseed(void)
1456+
init_hashseed(struct MT *mt)
14701457
{
1471-
struct MT *mt = default_mt();
1472-
14731458
hashseed = genrand_int32(mt);
14741459
#if SIZEOF_ST_INDEX_T*CHAR_BIT > 4*8
14751460
hashseed <<= 32;
@@ -1486,9 +1471,8 @@ init_hashseed(void)
14861471
}
14871472

14881473
static void
1489-
init_siphash(void)
1474+
init_siphash(struct MT *mt)
14901475
{
1491-
struct MT *mt = default_mt();
14921476
int i;
14931477

14941478
for (i = 0; i < numberof(sipseed.u32); ++i)
@@ -1512,28 +1496,48 @@ rb_memhash(const void *ptr, long len)
15121496
#endif
15131497
}
15141498

1499+
/* Initialize Ruby internal seeds */
15151500
void
15161501
Init_RandomSeed(void)
15171502
{
1518-
rb_random_t *r = &default_rand;
1519-
struct MT *mt = &r->mt;
1520-
VALUE seed = init_randomseed(mt);
1503+
/*
1504+
Don't reuse this MT for Random::DEFAULT. Random::DEFAULT::seed shouldn't
1505+
provide a hint that an attacker guess siphash's seed.
1506+
*/
1507+
struct MT mt;
1508+
uint32_t initial_seed[DEFAULT_SEED_CNT];
15211509

1522-
init_hashseed();
1523-
init_siphash();
1510+
fill_random_seed(initial_seed);
1511+
init_by_array(&mt, initial_seed, DEFAULT_SEED_CNT);
15241512

1525-
rb_global_variable(&r->seed);
1526-
r->seed = seed;
1513+
init_hashseed(&mt);
1514+
init_siphash(&mt);
1515+
1516+
explicit_bzero(initial_seed, DEFAULT_SEED_LEN);
1517+
}
1518+
1519+
static VALUE
1520+
init_randomseed(struct MT *mt)
1521+
{
1522+
uint32_t initial[DEFAULT_SEED_CNT];
1523+
VALUE seed;
1524+
1525+
fill_random_seed(initial);
1526+
init_by_array(mt, initial, DEFAULT_SEED_CNT);
1527+
seed = make_seed_value(initial);
1528+
explicit_bzero(initial, DEFAULT_SEED_LEN);
1529+
return seed;
15271530
}
15281531

1532+
/* construct Random::DEFAULT bits */
15291533
static void
15301534
Init_RandomSeed2(void)
15311535
{
1532-
VALUE seed = default_rand.seed;
1536+
rb_random_t *r = &default_rand;
1537+
struct MT *mt = &r->mt;
15331538

1534-
if (RB_TYPE_P(seed, T_BIGNUM)) {
1535-
rb_obj_reveal(seed, rb_cBignum);
1536-
}
1539+
r->seed = init_randomseed(mt);
1540+
rb_global_variable(&r->seed);
15371541
}
15381542

15391543
void

test/ruby/test_rand.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,4 +524,13 @@ def rand(limit) @limit = limit; 0 end
524524
[1, 2].sample(1, random: gen)
525525
assert_equal(2, gen.limit, bug7935)
526526
end
527+
528+
def test_default_seed
529+
assert_separately([], <<-End)
530+
seed = Random::DEFAULT::seed
531+
rand1 = Random::DEFAULT::rand
532+
rand2 = Random.new(seed).rand
533+
assert_equal(rand1, rand2)
534+
End
535+
end
527536
end

0 commit comments

Comments
 (0)