blake2b: use math.bits rotate functions instead of ad-hoc implementations
This makes code more readable and idiomatic and slightly improves performance.
Updates golang/go#31456
Benchstat:
name old time/op new time/op delta
Write128-4 271ns ± 4% 250ns ± 2% -7.78% (p=0.000 n=10+9)
Write1K-4 2.01µs ± 6% 1.97µs ± 5% ~ (p=0.393 n=10+10)
Sum128-4 271ns ± 6% 276ns ± 5% ~ (p=0.342 n=10+10)
Sum1K-4 1.98µs ±11% 2.03µs ± 4% ~ (p=0.093 n=10+10)
name old speed new speed delta
Write128-4 471MB/s ± 4% 511MB/s ± 2% +8.34% (p=0.000 n=10+9)
Write1K-4 511MB/s ± 6% 521MB/s ± 5% ~ (p=0.393 n=10+10)
Sum128-4 472MB/s ± 6% 463MB/s ± 6% ~ (p=0.315 n=10+10)
Sum1K-4 520MB/s ±10% 504MB/s ± 4% ~ (p=0.105 n=10+10)
Change-Id: I7e18379c02a78c77afcf8195d42307f71bc49fe0
Reviewed-on: https://go-review.googlesource.com/c/crypto/+/173277
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/blake2b/blake2b_generic.go b/blake2b/blake2b_generic.go
index 4bd2abc..3168a8a 100644
--- a/blake2b/blake2b_generic.go
+++ b/blake2b/blake2b_generic.go
@@ -4,7 +4,10 @@
package blake2b
-import "encoding/binary"
+import (
+ "encoding/binary"
+ "math/bits"
+)
// the precomputed values for BLAKE2b
// there are 12 16-byte arrays - one for each round
@@ -51,118 +54,118 @@
v0 += m[s[0]]
v0 += v4
v12 ^= v0
- v12 = v12<<(64-32) | v12>>32
+ v12 = bits.RotateLeft64(v12, -32)
v8 += v12
v4 ^= v8
- v4 = v4<<(64-24) | v4>>24
+ v4 = bits.RotateLeft64(v4, -24)
v1 += m[s[1]]
v1 += v5
v13 ^= v1
- v13 = v13<<(64-32) | v13>>32
+ v13 = bits.RotateLeft64(v13, -32)
v9 += v13
v5 ^= v9
- v5 = v5<<(64-24) | v5>>24
+ v5 = bits.RotateLeft64(v5, -24)
v2 += m[s[2]]
v2 += v6
v14 ^= v2
- v14 = v14<<(64-32) | v14>>32
+ v14 = bits.RotateLeft64(v14, -32)
v10 += v14
v6 ^= v10
- v6 = v6<<(64-24) | v6>>24
+ v6 = bits.RotateLeft64(v6, -24)
v3 += m[s[3]]
v3 += v7
v15 ^= v3
- v15 = v15<<(64-32) | v15>>32
+ v15 = bits.RotateLeft64(v15, -32)
v11 += v15
v7 ^= v11
- v7 = v7<<(64-24) | v7>>24
+ v7 = bits.RotateLeft64(v7, -24)
v0 += m[s[4]]
v0 += v4
v12 ^= v0
- v12 = v12<<(64-16) | v12>>16
+ v12 = bits.RotateLeft64(v12, -16)
v8 += v12
v4 ^= v8
- v4 = v4<<(64-63) | v4>>63
+ v4 = bits.RotateLeft64(v4, -63)
v1 += m[s[5]]
v1 += v5
v13 ^= v1
- v13 = v13<<(64-16) | v13>>16
+ v13 = bits.RotateLeft64(v13, -16)
v9 += v13
v5 ^= v9
- v5 = v5<<(64-63) | v5>>63
+ v5 = bits.RotateLeft64(v5, -63)
v2 += m[s[6]]
v2 += v6
v14 ^= v2
- v14 = v14<<(64-16) | v14>>16
+ v14 = bits.RotateLeft64(v14, -16)
v10 += v14
v6 ^= v10
- v6 = v6<<(64-63) | v6>>63
+ v6 = bits.RotateLeft64(v6, -63)
v3 += m[s[7]]
v3 += v7
v15 ^= v3
- v15 = v15<<(64-16) | v15>>16
+ v15 = bits.RotateLeft64(v15, -16)
v11 += v15
v7 ^= v11
- v7 = v7<<(64-63) | v7>>63
+ v7 = bits.RotateLeft64(v7, -63)
v0 += m[s[8]]
v0 += v5
v15 ^= v0
- v15 = v15<<(64-32) | v15>>32
+ v15 = bits.RotateLeft64(v15, -32)
v10 += v15
v5 ^= v10
- v5 = v5<<(64-24) | v5>>24
+ v5 = bits.RotateLeft64(v5, -24)
v1 += m[s[9]]
v1 += v6
v12 ^= v1
- v12 = v12<<(64-32) | v12>>32
+ v12 = bits.RotateLeft64(v12, -32)
v11 += v12
v6 ^= v11
- v6 = v6<<(64-24) | v6>>24
+ v6 = bits.RotateLeft64(v6, -24)
v2 += m[s[10]]
v2 += v7
v13 ^= v2
- v13 = v13<<(64-32) | v13>>32
+ v13 = bits.RotateLeft64(v13, -32)
v8 += v13
v7 ^= v8
- v7 = v7<<(64-24) | v7>>24
+ v7 = bits.RotateLeft64(v7, -24)
v3 += m[s[11]]
v3 += v4
v14 ^= v3
- v14 = v14<<(64-32) | v14>>32
+ v14 = bits.RotateLeft64(v14, -32)
v9 += v14
v4 ^= v9
- v4 = v4<<(64-24) | v4>>24
+ v4 = bits.RotateLeft64(v4, -24)
v0 += m[s[12]]
v0 += v5
v15 ^= v0
- v15 = v15<<(64-16) | v15>>16
+ v15 = bits.RotateLeft64(v15, -16)
v10 += v15
v5 ^= v10
- v5 = v5<<(64-63) | v5>>63
+ v5 = bits.RotateLeft64(v5, -63)
v1 += m[s[13]]
v1 += v6
v12 ^= v1
- v12 = v12<<(64-16) | v12>>16
+ v12 = bits.RotateLeft64(v12, -16)
v11 += v12
v6 ^= v11
- v6 = v6<<(64-63) | v6>>63
+ v6 = bits.RotateLeft64(v6, -63)
v2 += m[s[14]]
v2 += v7
v13 ^= v2
- v13 = v13<<(64-16) | v13>>16
+ v13 = bits.RotateLeft64(v13, -16)
v8 += v13
v7 ^= v8
- v7 = v7<<(64-63) | v7>>63
+ v7 = bits.RotateLeft64(v7, -63)
v3 += m[s[15]]
v3 += v4
v14 ^= v3
- v14 = v14<<(64-16) | v14>>16
+ v14 = bits.RotateLeft64(v14, -16)
v9 += v14
v4 ^= v9
- v4 = v4<<(64-63) | v4>>63
+ v4 = bits.RotateLeft64(v4, -63)
}