149 lines
2.1 KiB
Go
149 lines
2.1 KiB
Go
// +build !arm,!amd64 appengine gccgo
|
|
|
|
package siphash
|
|
|
|
func once(d *digest) {
|
|
blocks(d, d.x[:])
|
|
}
|
|
|
|
func finalize(d *digest) uint64 {
|
|
d0 := *d
|
|
once(&d0)
|
|
|
|
v0, v1, v2, v3 := d0.v0, d0.v1, d0.v2, d0.v3
|
|
v2 ^= 0xff
|
|
|
|
// Round 1.
|
|
v0 += v1
|
|
v1 = v1<<13 | v1>>(64-13)
|
|
v1 ^= v0
|
|
v0 = v0<<32 | v0>>(64-32)
|
|
|
|
v2 += v3
|
|
v3 = v3<<16 | v3>>(64-16)
|
|
v3 ^= v2
|
|
|
|
v0 += v3
|
|
v3 = v3<<21 | v3>>(64-21)
|
|
v3 ^= v0
|
|
|
|
v2 += v1
|
|
v1 = v1<<17 | v1>>(64-17)
|
|
v1 ^= v2
|
|
v2 = v2<<32 | v2>>(64-32)
|
|
|
|
// Round 2.
|
|
v0 += v1
|
|
v1 = v1<<13 | v1>>(64-13)
|
|
v1 ^= v0
|
|
v0 = v0<<32 | v0>>(64-32)
|
|
|
|
v2 += v3
|
|
v3 = v3<<16 | v3>>(64-16)
|
|
v3 ^= v2
|
|
|
|
v0 += v3
|
|
v3 = v3<<21 | v3>>(64-21)
|
|
v3 ^= v0
|
|
|
|
v2 += v1
|
|
v1 = v1<<17 | v1>>(64-17)
|
|
v1 ^= v2
|
|
v2 = v2<<32 | v2>>(64-32)
|
|
|
|
// Round 3.
|
|
v0 += v1
|
|
v1 = v1<<13 | v1>>(64-13)
|
|
v1 ^= v0
|
|
v0 = v0<<32 | v0>>(64-32)
|
|
|
|
v2 += v3
|
|
v3 = v3<<16 | v3>>(64-16)
|
|
v3 ^= v2
|
|
|
|
v0 += v3
|
|
v3 = v3<<21 | v3>>(64-21)
|
|
v3 ^= v0
|
|
|
|
v2 += v1
|
|
v1 = v1<<17 | v1>>(64-17)
|
|
v1 ^= v2
|
|
v2 = v2<<32 | v2>>(64-32)
|
|
|
|
// Round 4.
|
|
v0 += v1
|
|
v1 = v1<<13 | v1>>(64-13)
|
|
v1 ^= v0
|
|
v0 = v0<<32 | v0>>(64-32)
|
|
|
|
v2 += v3
|
|
v3 = v3<<16 | v3>>(64-16)
|
|
v3 ^= v2
|
|
|
|
v0 += v3
|
|
v3 = v3<<21 | v3>>(64-21)
|
|
v3 ^= v0
|
|
|
|
v2 += v1
|
|
v1 = v1<<17 | v1>>(64-17)
|
|
v1 ^= v2
|
|
v2 = v2<<32 | v2>>(64-32)
|
|
|
|
return v0 ^ v1 ^ v2 ^ v3
|
|
}
|
|
|
|
func blocks(d *digest, p []uint8) {
|
|
v0, v1, v2, v3 := d.v0, d.v1, d.v2, d.v3
|
|
|
|
for len(p) >= BlockSize {
|
|
m := uint64(p[0]) | uint64(p[1])<<8 | uint64(p[2])<<16 | uint64(p[3])<<24 |
|
|
uint64(p[4])<<32 | uint64(p[5])<<40 | uint64(p[6])<<48 | uint64(p[7])<<56
|
|
|
|
v3 ^= m
|
|
|
|
// Round 1.
|
|
v0 += v1
|
|
v1 = v1<<13 | v1>>(64-13)
|
|
v1 ^= v0
|
|
v0 = v0<<32 | v0>>(64-32)
|
|
|
|
v2 += v3
|
|
v3 = v3<<16 | v3>>(64-16)
|
|
v3 ^= v2
|
|
|
|
v0 += v3
|
|
v3 = v3<<21 | v3>>(64-21)
|
|
v3 ^= v0
|
|
|
|
v2 += v1
|
|
v1 = v1<<17 | v1>>(64-17)
|
|
v1 ^= v2
|
|
v2 = v2<<32 | v2>>(64-32)
|
|
|
|
// Round 2.
|
|
v0 += v1
|
|
v1 = v1<<13 | v1>>(64-13)
|
|
v1 ^= v0
|
|
v0 = v0<<32 | v0>>(64-32)
|
|
|
|
v2 += v3
|
|
v3 = v3<<16 | v3>>(64-16)
|
|
v3 ^= v2
|
|
|
|
v0 += v3
|
|
v3 = v3<<21 | v3>>(64-21)
|
|
v3 ^= v0
|
|
|
|
v2 += v1
|
|
v1 = v1<<17 | v1>>(64-17)
|
|
v1 ^= v2
|
|
v2 = v2<<32 | v2>>(64-32)
|
|
|
|
v0 ^= m
|
|
|
|
p = p[BlockSize:]
|
|
}
|
|
|
|
d.v0, d.v1, d.v2, d.v3 = v0, v1, v2, v3
|
|
}
|