This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Harden hashes against hash seed discovery by randomizing hash iteration
authorYves Orton <demerphq@gmail.com>
Sun, 17 Mar 2013 19:19:09 +0000 (20:19 +0100)
committerYves Orton <demerphq@gmail.com>
Mon, 18 Mar 2013 23:23:11 +0000 (00:23 +0100)
commit0e0ab62106f892a1b7f00ad117493064bf9d72d1
treefdd83225227f4b59da3cb0fbb7e21e702f515e56
parentb716320d9d4e3483bbddcbf6c6977a2a6a0efa1e
Harden hashes against hash seed discovery by randomizing hash iteration

Adds:

S_ptr_hash() - A new static function in hv.c which can be used to
hash a pointer or integer.

PL_hash_rand_bits - A new interpreter variable used as a cheap
provider of "semi-random" state for use by the hash infrastructure.

xpvhv_aux.xhv_rand - Used as a mask which is xored against the
xpvhv_aux.riter during iteration to randomize the order the actual
buckets are visited.

PL_hash_rand_bits is initialized as interpreter start from the random
hash seed, and then modified by "mixing in" the result of ptr_hash()
on the bucket array pointer in the hv (HvARRAY(hv)) every time
hv_auxinit() allocates a new iterator structure.

The net result is that every hash has its own iteration order, which
should make it much more difficult to determine what the current hash
seed is.

This required some test to be restructured, as they tested for something
that was not necessarily true, we never guaranteed that two hashes with
the same keys would produce the same key order, we merely promised that
using keys(), values(), or each() on the same hash, without any
insertions in between, would produce the same order of visiting the
key/values.
embed.fnc
embed.h
embedvar.h
hv.c
hv.h
intrpvar.h
proto.h
t/op/smartkve.t
util.c