Skip to content

Commit c7dcf10

Browse files
committed
ripemd160: use bits.Rotate for rotates
Replace x << k | x >> (32 - k) with bits.RotateLeft32 and add benchmark to check performance. This makes code cleaner and improves performance: MillionA-6 34.8ms ± 1% 26.7ms ± 1% -23.41% (p=0.000 n=10+10) Change-Id: I1b0c45f5ea12c7b53ab1ec5a26efc1903555fa66 Reviewed-on: https://go-review.googlesource.com/97915 Run-TryBot: Ilya Tocar <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Brad Fitzpatrick <[email protected]>
1 parent 7effd64 commit c7dcf10

File tree

2 files changed

+47
-35
lines changed

2 files changed

+47
-35
lines changed

ripemd160/ripemd160_test.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,23 @@ func TestVectors(t *testing.T) {
5050
}
5151
}
5252

53-
func TestMillionA(t *testing.T) {
53+
func millionA() string {
5454
md := New()
5555
for i := 0; i < 100000; i++ {
5656
io.WriteString(md, "aaaaaaaaaa")
5757
}
58-
out := "52783243c1697bdbe16d37f97f68f08325dc1528"
59-
s := fmt.Sprintf("%x", md.Sum(nil))
60-
if s != out {
58+
return fmt.Sprintf("%x", md.Sum(nil))
59+
}
60+
61+
func TestMillionA(t *testing.T) {
62+
const out = "52783243c1697bdbe16d37f97f68f08325dc1528"
63+
if s := millionA(); s != out {
6164
t.Fatalf("RIPEMD-160 (1 million 'a') = %s, expected %s", s, out)
6265
}
63-
md.Reset()
66+
}
67+
68+
func BenchmarkMillionA(b *testing.B) {
69+
for i := 0; i < b.N; i++ {
70+
millionA()
71+
}
6472
}

ripemd160/ripemd160block.go

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88

99
package ripemd160
1010

11+
import (
12+
"math/bits"
13+
)
14+
1115
// work buffer indices and roll amounts for one line
1216
var _n = [80]uint{
1317
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
@@ -59,16 +63,16 @@ func _Block(md *digest, p []byte) int {
5963
i := 0
6064
for i < 16 {
6165
alpha = a + (b ^ c ^ d) + x[_n[i]]
62-
s := _r[i]
63-
alpha = (alpha<<s | alpha>>(32-s)) + e
64-
beta = c<<10 | c>>22
66+
s := int(_r[i])
67+
alpha = bits.RotateLeft32(alpha, s) + e
68+
beta = bits.RotateLeft32(c, 10)
6569
a, b, c, d, e = e, alpha, b, beta, d
6670

6771
// parallel line
6872
alpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6
69-
s = r_[i]
70-
alpha = (alpha<<s | alpha>>(32-s)) + ee
71-
beta = cc<<10 | cc>>22
73+
s = int(r_[i])
74+
alpha = bits.RotateLeft32(alpha, s) + ee
75+
beta = bits.RotateLeft32(cc, 10)
7276
aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
7377

7478
i++
@@ -77,16 +81,16 @@ func _Block(md *digest, p []byte) int {
7781
// round 2
7882
for i < 32 {
7983
alpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999
80-
s := _r[i]
81-
alpha = (alpha<<s | alpha>>(32-s)) + e
82-
beta = c<<10 | c>>22
84+
s := int(_r[i])
85+
alpha = bits.RotateLeft32(alpha, s) + e
86+
beta = bits.RotateLeft32(c, 10)
8387
a, b, c, d, e = e, alpha, b, beta, d
8488

8589
// parallel line
8690
alpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124
87-
s = r_[i]
88-
alpha = (alpha<<s | alpha>>(32-s)) + ee
89-
beta = cc<<10 | cc>>22
91+
s = int(r_[i])
92+
alpha = bits.RotateLeft32(alpha, s) + ee
93+
beta = bits.RotateLeft32(cc, 10)
9094
aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
9195

9296
i++
@@ -95,16 +99,16 @@ func _Block(md *digest, p []byte) int {
9599
// round 3
96100
for i < 48 {
97101
alpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1
98-
s := _r[i]
99-
alpha = (alpha<<s | alpha>>(32-s)) + e
100-
beta = c<<10 | c>>22
102+
s := int(_r[i])
103+
alpha = bits.RotateLeft32(alpha, s) + e
104+
beta = bits.RotateLeft32(c, 10)
101105
a, b, c, d, e = e, alpha, b, beta, d
102106

103107
// parallel line
104108
alpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3
105-
s = r_[i]
106-
alpha = (alpha<<s | alpha>>(32-s)) + ee
107-
beta = cc<<10 | cc>>22
109+
s = int(r_[i])
110+
alpha = bits.RotateLeft32(alpha, s) + ee
111+
beta = bits.RotateLeft32(cc, 10)
108112
aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
109113

110114
i++
@@ -113,16 +117,16 @@ func _Block(md *digest, p []byte) int {
113117
// round 4
114118
for i < 64 {
115119
alpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc
116-
s := _r[i]
117-
alpha = (alpha<<s | alpha>>(32-s)) + e
118-
beta = c<<10 | c>>22
120+
s := int(_r[i])
121+
alpha = bits.RotateLeft32(alpha, s) + e
122+
beta = bits.RotateLeft32(c, 10)
119123
a, b, c, d, e = e, alpha, b, beta, d
120124

121125
// parallel line
122126
alpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9
123-
s = r_[i]
124-
alpha = (alpha<<s | alpha>>(32-s)) + ee
125-
beta = cc<<10 | cc>>22
127+
s = int(r_[i])
128+
alpha = bits.RotateLeft32(alpha, s) + ee
129+
beta = bits.RotateLeft32(cc, 10)
126130
aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
127131

128132
i++
@@ -131,16 +135,16 @@ func _Block(md *digest, p []byte) int {
131135
// round 5
132136
for i < 80 {
133137
alpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e
134-
s := _r[i]
135-
alpha = (alpha<<s | alpha>>(32-s)) + e
136-
beta = c<<10 | c>>22
138+
s := int(_r[i])
139+
alpha = bits.RotateLeft32(alpha, s) + e
140+
beta = bits.RotateLeft32(c, 10)
137141
a, b, c, d, e = e, alpha, b, beta, d
138142

139143
// parallel line
140144
alpha = aa + (bb ^ cc ^ dd) + x[n_[i]]
141-
s = r_[i]
142-
alpha = (alpha<<s | alpha>>(32-s)) + ee
143-
beta = cc<<10 | cc>>22
145+
s = int(r_[i])
146+
alpha = bits.RotateLeft32(alpha, s) + ee
147+
beta = bits.RotateLeft32(cc, 10)
144148
aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
145149

146150
i++

0 commit comments

Comments
 (0)