| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- //go:build (!arm && !amd64) || appengine || gccgo
- // +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
- }
|