Remove unused Python imports
[bitcoinplatinum.git] / test / functional / test_framework / siphash.py
blobf68ecad36bbbdb0016d6039fb7c711ba38285792
1 #!/usr/bin/env python3
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.
8 """
10 def rotl64(n, b):
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)
15 v1 = rotl64(v1, 13)
16 v1 ^= v0
17 v0 = rotl64(v0, 32)
18 v2 = (v2 + v3) & ((1 << 64) - 1)
19 v3 = rotl64(v3, 16)
20 v3 ^= v2
21 v0 = (v0 + v3) & ((1 << 64) - 1)
22 v3 = rotl64(v3, 21)
23 v3 ^= v0
24 v2 = (v2 + v1) & ((1 << 64) - 1)
25 v1 = rotl64(v1, 17)
26 v1 ^= v2
27 v2 = rotl64(v2, 32)
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)
41 v0 ^= n0
42 v3 ^= n1
43 v0, v1, v2, v3 = siphash_round(v0, v1, v2, v3)
44 v0, v1, v2, v3 = siphash_round(v0, v1, v2, v3)
45 v0 ^= n1
46 v3 ^= n2
47 v0, v1, v2, v3 = siphash_round(v0, v1, v2, v3)
48 v0, v1, v2, v3 = siphash_round(v0, v1, v2, v3)
49 v0 ^= n2
50 v3 ^= n3
51 v0, v1, v2, v3 = siphash_round(v0, v1, v2, v3)
52 v0, v1, v2, v3 = siphash_round(v0, v1, v2, v3)
53 v0 ^= n3
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
58 v2 ^= 0xFF
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