Skip to content

Commit 75cce11

Browse files
authored
crypto.ripemd160: improve block() performance *a lot*, update tests (#26547)
1 parent 1ea3279 commit 75cce11

3 files changed

Lines changed: 23 additions & 33 deletions

File tree

‎vlib/crypto/ripemd160/ripemd160.v‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ pub fn (mut d Digest) free() {
3333
$if prealloc {
3434
return
3535
}
36-
unsafe { d.x.free() }
36+
unsafe {
37+
d.s.free()
38+
d.x.free()
39+
}
3740
}
3841

3942
fn (mut d Digest) init() {
@@ -61,7 +64,7 @@ fn (d &Digest) clone() &Digest {
6164
}
6265
}
6366

64-
// new returns a new Digest (implementing hash.Hash) computing the MD5 checksum.
67+
// new returns a new Digest (implementing hash.Hash) computing the RIPEMD-160 checksum.
6568
pub fn new() &Digest {
6669
mut d := &Digest{}
6770
d.init()
@@ -81,7 +84,6 @@ pub fn (d &Digest) block_size() int {
8184
// hexhash returns a hexadecimal RIPEMD-160 hash sum `string` of `s`.
8285
pub fn hexhash(s string) string {
8386
mut d := new()
84-
d.init()
8587
d.write(s.bytes()) or { panic(err) }
8688
return d.sum([]).hex()
8789
}

‎vlib/crypto/ripemd160/ripemd160_test.v‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ fn test_vectors() {
2929
md.write(tv.i.bytes()[tv.i.len / 2..]) or { panic(err) }
3030
}
3131
assert md.sum([]).hex() == tv.o
32+
assert ripemd160.hexhash(tv.i) == tv.o
3233
md.reset()
3334
}
3435
}

‎vlib/crypto/ripemd160/ripemd160block.v‎

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,66 +7,62 @@ import math.bits
77

88
// vfmt off
99
const n__ = [
10-
u32(0), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
10+
u8(0), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
1111
7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
1212
3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
1313
1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
1414
4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13,
1515
]
1616

1717
const r__ = [
18-
u32(11), 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
18+
u8(11), 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
1919
7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
2020
11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
2121
11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
2222
9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6,
2323
]
2424

2525
const n_ = [
26-
u32(5), 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
26+
u8(5), 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
2727
6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
2828
15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
2929
8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
3030
12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11,
3131
]
3232

3333
const r_ = [
34-
u32(8), 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
34+
u8(8), 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
3535
9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
3636
9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
3737
15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
3838
8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11,
3939
]
4040
// vfmt on
4141
@[direct_array_access]
42-
fn block(mut md Digest, p0 []u8) int {
43-
mut p := p0.clone()
42+
fn block(mut md Digest, p []u8) int {
4443
mut n := 0
4544
mut x := []u32{len: 16}
4645
mut alpha := u32(0)
4746
mut beta := u32(0)
4847

49-
for p.len >= block_size {
48+
for n + block_size <= p.len {
5049
mut a, mut b, mut c, mut d, mut e := md.s[0], md.s[1], md.s[2], md.s[3], md.s[4]
5150
mut aa, mut bb, mut cc, mut dd, mut ee := a, b, c, d, e
52-
mut j := 0
5351

5452
for i := 0; i < 16; i++ {
53+
j := n + i * 4
5554
x[i] = u32(p[j]) | u32(p[j + 1]) << 8 | u32(p[j + 2]) << 16 | u32(p[j + 3]) << 24
56-
j += 4
5755
}
5856

5957
mut i := 0
6058
for i < 16 {
6159
alpha = a + (b ^ c ^ d) + x[n__[i]]
62-
mut s := int(r__[i])
63-
alpha = bits.rotate_left_32(alpha, s) + e
60+
alpha = bits.rotate_left_32(alpha, r__[i]) + e
6461
beta = bits.rotate_left_32(c, 10)
6562
a, b, c, d, e = e, alpha, b, beta, d
6663

6764
alpha = aa + (bb ^ (cc | ~dd)) + x[n_[i]] + 0x50a28be6
68-
s = int(r_[i])
69-
alpha = bits.rotate_left_32(alpha, s) + ee
65+
alpha = bits.rotate_left_32(alpha, r_[i]) + ee
7066
beta = bits.rotate_left_32(cc, 10)
7167
aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
7268

@@ -75,15 +71,13 @@ fn block(mut md Digest, p0 []u8) int {
7571

7672
for i < 32 {
7773
alpha = a + (b & c | ~b & d) + x[n__[i]] + 0x5a827999
78-
mut s := int(r__[i])
79-
alpha = bits.rotate_left_32(alpha, s) + e
74+
alpha = bits.rotate_left_32(alpha, r__[i]) + e
8075
beta = bits.rotate_left_32(c, 10)
8176
a, b, c, d, e = e, alpha, b, beta, d
8277

8378
// parallel line
8479
alpha = aa + (bb & dd | cc & ~dd) + x[n_[i]] + 0x5c4dd124
85-
s = int(r_[i])
86-
alpha = bits.rotate_left_32(alpha, s) + ee
80+
alpha = bits.rotate_left_32(alpha, r_[i]) + ee
8781
beta = bits.rotate_left_32(cc, 10)
8882
aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
8983

@@ -92,15 +86,13 @@ fn block(mut md Digest, p0 []u8) int {
9286

9387
for i < 48 {
9488
alpha = a + (b | ~c ^ d) + x[n__[i]] + 0x6ed9eba1
95-
mut s := int(r__[i])
96-
alpha = bits.rotate_left_32(alpha, s) + e
89+
alpha = bits.rotate_left_32(alpha, r__[i]) + e
9790
beta = bits.rotate_left_32(c, 10)
9891
a, b, c, d, e = e, alpha, b, beta, d
9992

10093
// parallel line
10194
alpha = aa + (bb | ~cc ^ dd) + x[n_[i]] + 0x6d703ef3
102-
s = int(r_[i])
103-
alpha = bits.rotate_left_32(alpha, s) + ee
95+
alpha = bits.rotate_left_32(alpha, r_[i]) + ee
10496
beta = bits.rotate_left_32(cc, 10)
10597
aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
10698

@@ -109,15 +101,13 @@ fn block(mut md Digest, p0 []u8) int {
109101

110102
for i < 64 {
111103
alpha = a + (b & d | c & ~d) + x[n__[i]] + 0x8f1bbcdc
112-
mut s := int(r__[i])
113-
alpha = bits.rotate_left_32(alpha, s) + e
104+
alpha = bits.rotate_left_32(alpha, r__[i]) + e
114105
beta = bits.rotate_left_32(c, 10)
115106
a, b, c, d, e = e, alpha, b, beta, d
116107

117108
// parallel line
118109
alpha = aa + (bb & cc | ~bb & dd) + x[n_[i]] + 0x7a6d76e9
119-
s = int(r_[i])
120-
alpha = bits.rotate_left_32(alpha, s) + ee
110+
alpha = bits.rotate_left_32(alpha, r_[i]) + ee
121111
beta = bits.rotate_left_32(cc, 10)
122112
aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
123113

@@ -126,15 +116,13 @@ fn block(mut md Digest, p0 []u8) int {
126116

127117
for i < 80 {
128118
alpha = a + (b ^ (c | ~d)) + x[n__[i]] + 0xa953fd4e
129-
mut s := int(r__[i])
130-
alpha = bits.rotate_left_32(alpha, s) + e
119+
alpha = bits.rotate_left_32(alpha, r__[i]) + e
131120
beta = bits.rotate_left_32(c, 10)
132121
a, b, c, d, e = e, alpha, b, beta, d
133122

134123
// parallel line
135124
alpha = aa + (bb ^ cc ^ dd) + x[n_[i]]
136-
s = int(r_[i])
137-
alpha = bits.rotate_left_32(alpha, s) + ee
125+
alpha = bits.rotate_left_32(alpha, r_[i]) + ee
138126
beta = bits.rotate_left_32(cc, 10)
139127
aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd
140128

@@ -148,7 +136,6 @@ fn block(mut md Digest, p0 []u8) int {
148136
md.s[4] = md.s[0] + b + cc
149137
md.s[0] = dd
150138

151-
p = p[block_size..].clone()
152139
n += block_size
153140
}
154141
return n

0 commit comments

Comments
 (0)