Skip to content

Commit af44ce2

Browse files
vitaminniybradfitz
authored andcommitted
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 <[email protected]> Run-TryBot: Brad Fitzpatrick <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent df01cb2 commit af44ce2

File tree

1 file changed

+36
-33
lines changed

1 file changed

+36
-33
lines changed

Diff for: blake2b/blake2b_generic.go

+36-33
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44

55
package blake2b
66

7-
import "encoding/binary"
7+
import (
8+
"encoding/binary"
9+
"math/bits"
10+
)
811

912
// the precomputed values for BLAKE2b
1013
// there are 12 16-byte arrays - one for each round
@@ -51,118 +54,118 @@ func hashBlocksGeneric(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) {
5154
v0 += m[s[0]]
5255
v0 += v4
5356
v12 ^= v0
54-
v12 = v12<<(64-32) | v12>>32
57+
v12 = bits.RotateLeft64(v12, -32)
5558
v8 += v12
5659
v4 ^= v8
57-
v4 = v4<<(64-24) | v4>>24
60+
v4 = bits.RotateLeft64(v4, -24)
5861
v1 += m[s[1]]
5962
v1 += v5
6063
v13 ^= v1
61-
v13 = v13<<(64-32) | v13>>32
64+
v13 = bits.RotateLeft64(v13, -32)
6265
v9 += v13
6366
v5 ^= v9
64-
v5 = v5<<(64-24) | v5>>24
67+
v5 = bits.RotateLeft64(v5, -24)
6568
v2 += m[s[2]]
6669
v2 += v6
6770
v14 ^= v2
68-
v14 = v14<<(64-32) | v14>>32
71+
v14 = bits.RotateLeft64(v14, -32)
6972
v10 += v14
7073
v6 ^= v10
71-
v6 = v6<<(64-24) | v6>>24
74+
v6 = bits.RotateLeft64(v6, -24)
7275
v3 += m[s[3]]
7376
v3 += v7
7477
v15 ^= v3
75-
v15 = v15<<(64-32) | v15>>32
78+
v15 = bits.RotateLeft64(v15, -32)
7679
v11 += v15
7780
v7 ^= v11
78-
v7 = v7<<(64-24) | v7>>24
81+
v7 = bits.RotateLeft64(v7, -24)
7982

8083
v0 += m[s[4]]
8184
v0 += v4
8285
v12 ^= v0
83-
v12 = v12<<(64-16) | v12>>16
86+
v12 = bits.RotateLeft64(v12, -16)
8487
v8 += v12
8588
v4 ^= v8
86-
v4 = v4<<(64-63) | v4>>63
89+
v4 = bits.RotateLeft64(v4, -63)
8790
v1 += m[s[5]]
8891
v1 += v5
8992
v13 ^= v1
90-
v13 = v13<<(64-16) | v13>>16
93+
v13 = bits.RotateLeft64(v13, -16)
9194
v9 += v13
9295
v5 ^= v9
93-
v5 = v5<<(64-63) | v5>>63
96+
v5 = bits.RotateLeft64(v5, -63)
9497
v2 += m[s[6]]
9598
v2 += v6
9699
v14 ^= v2
97-
v14 = v14<<(64-16) | v14>>16
100+
v14 = bits.RotateLeft64(v14, -16)
98101
v10 += v14
99102
v6 ^= v10
100-
v6 = v6<<(64-63) | v6>>63
103+
v6 = bits.RotateLeft64(v6, -63)
101104
v3 += m[s[7]]
102105
v3 += v7
103106
v15 ^= v3
104-
v15 = v15<<(64-16) | v15>>16
107+
v15 = bits.RotateLeft64(v15, -16)
105108
v11 += v15
106109
v7 ^= v11
107-
v7 = v7<<(64-63) | v7>>63
110+
v7 = bits.RotateLeft64(v7, -63)
108111

109112
v0 += m[s[8]]
110113
v0 += v5
111114
v15 ^= v0
112-
v15 = v15<<(64-32) | v15>>32
115+
v15 = bits.RotateLeft64(v15, -32)
113116
v10 += v15
114117
v5 ^= v10
115-
v5 = v5<<(64-24) | v5>>24
118+
v5 = bits.RotateLeft64(v5, -24)
116119
v1 += m[s[9]]
117120
v1 += v6
118121
v12 ^= v1
119-
v12 = v12<<(64-32) | v12>>32
122+
v12 = bits.RotateLeft64(v12, -32)
120123
v11 += v12
121124
v6 ^= v11
122-
v6 = v6<<(64-24) | v6>>24
125+
v6 = bits.RotateLeft64(v6, -24)
123126
v2 += m[s[10]]
124127
v2 += v7
125128
v13 ^= v2
126-
v13 = v13<<(64-32) | v13>>32
129+
v13 = bits.RotateLeft64(v13, -32)
127130
v8 += v13
128131
v7 ^= v8
129-
v7 = v7<<(64-24) | v7>>24
132+
v7 = bits.RotateLeft64(v7, -24)
130133
v3 += m[s[11]]
131134
v3 += v4
132135
v14 ^= v3
133-
v14 = v14<<(64-32) | v14>>32
136+
v14 = bits.RotateLeft64(v14, -32)
134137
v9 += v14
135138
v4 ^= v9
136-
v4 = v4<<(64-24) | v4>>24
139+
v4 = bits.RotateLeft64(v4, -24)
137140

138141
v0 += m[s[12]]
139142
v0 += v5
140143
v15 ^= v0
141-
v15 = v15<<(64-16) | v15>>16
144+
v15 = bits.RotateLeft64(v15, -16)
142145
v10 += v15
143146
v5 ^= v10
144-
v5 = v5<<(64-63) | v5>>63
147+
v5 = bits.RotateLeft64(v5, -63)
145148
v1 += m[s[13]]
146149
v1 += v6
147150
v12 ^= v1
148-
v12 = v12<<(64-16) | v12>>16
151+
v12 = bits.RotateLeft64(v12, -16)
149152
v11 += v12
150153
v6 ^= v11
151-
v6 = v6<<(64-63) | v6>>63
154+
v6 = bits.RotateLeft64(v6, -63)
152155
v2 += m[s[14]]
153156
v2 += v7
154157
v13 ^= v2
155-
v13 = v13<<(64-16) | v13>>16
158+
v13 = bits.RotateLeft64(v13, -16)
156159
v8 += v13
157160
v7 ^= v8
158-
v7 = v7<<(64-63) | v7>>63
161+
v7 = bits.RotateLeft64(v7, -63)
159162
v3 += m[s[15]]
160163
v3 += v4
161164
v14 ^= v3
162-
v14 = v14<<(64-16) | v14>>16
165+
v14 = bits.RotateLeft64(v14, -16)
163166
v9 += v14
164167
v4 ^= v9
165-
v4 = v4<<(64-63) | v4>>63
168+
v4 = bits.RotateLeft64(v4, -63)
166169

167170
}
168171

0 commit comments

Comments
 (0)