18
func _Block(dig *digest, p []byte) int {
20
func block(dig *digest, p []byte) {
22
23
h0, h1, h2, h3, h4 := dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4]
23
for len(p) >= _Chunk {
24
25
// Can interlace the computation of w with the
25
26
// rounds below if needed for speed.
26
27
for i := 0; i < 16; i++ {
28
29
w[i] = uint32(p[j])<<24 | uint32(p[j+1])<<16 | uint32(p[j+2])<<8 | uint32(p[j+3])
30
for i := 16; i < 80; i++ {
31
tmp := w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]
32
w[i] = tmp<<1 | tmp>>(32-1)
35
32
a, b, c, d, e := h0, h1, h2, h3, h4
37
34
// Each of the four 20-iteration rounds
38
35
// differs only in the computation of f and
39
36
// the choice of K (_K0, _K1, etc).
40
for i := 0; i < 20; i++ {
42
a5 := a<<5 | a>>(32-5)
43
b30 := b<<30 | b>>(32-30)
44
t := a5 + f + e + w[i] + _K0
45
a, b, c, d, e = t, a, b30, c, d
47
for i := 20; i < 40; i++ {
49
a5 := a<<5 | a>>(32-5)
50
b30 := b<<30 | b>>(32-30)
51
t := a5 + f + e + w[i] + _K1
52
a, b, c, d, e = t, a, b30, c, d
54
for i := 40; i < 60; i++ {
56
a5 := a<<5 | a>>(32-5)
57
b30 := b<<30 | b>>(32-30)
58
t := a5 + f + e + w[i] + _K2
59
a, b, c, d, e = t, a, b30, c, d
61
for i := 60; i < 80; i++ {
63
a5 := a<<5 | a>>(32-5)
64
b30 := b<<30 | b>>(32-30)
65
t := a5 + f + e + w[i] + _K3
40
a5 := a<<5 | a>>(32-5)
41
b30 := b<<30 | b>>(32-30)
42
t := a5 + f + e + w[i&0xf] + _K0
43
a, b, c, d, e = t, a, b30, c, d
46
tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
47
w[i&0xf] = tmp<<1 | tmp>>(32-1)
50
a5 := a<<5 | a>>(32-5)
51
b30 := b<<30 | b>>(32-30)
52
t := a5 + f + e + w[i&0xf] + _K0
53
a, b, c, d, e = t, a, b30, c, d
56
tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
57
w[i&0xf] = tmp<<1 | tmp>>(32-1)
59
a5 := a<<5 | a>>(32-5)
60
b30 := b<<30 | b>>(32-30)
61
t := a5 + f + e + w[i&0xf] + _K1
62
a, b, c, d, e = t, a, b30, c, d
65
tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
66
w[i&0xf] = tmp<<1 | tmp>>(32-1)
67
f := ((b | c) & d) | (b & c)
69
a5 := a<<5 | a>>(32-5)
70
b30 := b<<30 | b>>(32-30)
71
t := a5 + f + e + w[i&0xf] + _K2
72
a, b, c, d, e = t, a, b30, c, d
75
tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
76
w[i&0xf] = tmp<<1 | tmp>>(32-1)
78
a5 := a<<5 | a>>(32-5)
79
b30 := b<<30 | b>>(32-30)
80
t := a5 + f + e + w[i&0xf] + _K3
66
81
a, b, c, d, e = t, a, b30, c, d