2 # Copyright (c) 2016 The Bitcoin Core developers
3 # Distributed under the MIT software license, see the accompanying
4 # file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 """Specialized SipHash-2-4 implementations.
7 This implements SipHash-2-4 for 256-bit integers.
11 return n
>> (64 - b
) |
(n
& ((1 << (64 - b
)) - 1)) << b
13 def siphash_round(v0
, v1
, v2
, v3
):
14 v0
= (v0
+ v1
) & ((1 << 64) - 1)
18 v2
= (v2
+ v3
) & ((1 << 64) - 1)
21 v0
= (v0
+ v3
) & ((1 << 64) - 1)
24 v2
= (v2
+ v1
) & ((1 << 64) - 1)
28 return (v0
, v1
, v2
, v3
)
30 def siphash256(k0
, k1
, h
):
31 n0
= h
& ((1 << 64) - 1)
32 n1
= (h
>> 64) & ((1 << 64) - 1)
33 n2
= (h
>> 128) & ((1 << 64) - 1)
34 n3
= (h
>> 192) & ((1 << 64) - 1)
35 v0
= 0x736f6d6570736575 ^ k0
36 v1
= 0x646f72616e646f6d ^ k1
37 v2
= 0x6c7967656e657261 ^ k0
38 v3
= 0x7465646279746573 ^ k1 ^ n0
39 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
40 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
43 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
44 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
47 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
48 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
51 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
52 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
54 v3 ^
= 0x2000000000000000
55 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
56 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
57 v0 ^
= 0x2000000000000000
59 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
60 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
61 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
62 v0
, v1
, v2
, v3
= siphash_round(v0
, v1
, v2
, v3
)
63 return v0 ^ v1 ^ v2 ^ v3