1
2
3
4
5
6
7
8
9 package sha1
10
11 const (
12 _K0 = 0x5A827999
13 _K1 = 0x6ED9EBA1
14 _K2 = 0x8F1BBCDC
15 _K3 = 0xCA62C1D6
16 )
17
18 func _Block(dig *digest, p []byte) int {
19 var w [80]uint32
20
21 n := 0
22 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
26 for i := 0; i < 16; i++ {
27 j := i * 4
28 w[i] = uint32(p[j])<<24 | uint32(p[j+1])<<16 | uint32(p[j+2])<<8 | uint32(p[j+3])
29 }
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)
33 }
34
35 a, b, c, d, e := h0, h1, h2, h3, h4
36
37
38
39
40 for i := 0; i < 20; i++ {
41 f := b&c | (^b)&d
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
46 }
47 for i := 20; i < 40; i++ {
48 f := b ^ c ^ d
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
53 }
54 for i := 40; i < 60; i++ {
55 f := b&c | b&d | c&d
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
60 }
61 for i := 60; i < 80; i++ {
62 f := b ^ c ^ d
63 a5 := a<<5 | a>>(32-5)
64 b30 := b<<30 | b>>(32-30)
65 t := a5 + f + e + w[i] + _K3
66 a, b, c, d, e = t, a, b30, c, d
67 }
68
69 h0 += a
70 h1 += b
71 h2 += c
72 h3 += d
73 h4 += e
74
75 p = p[_Chunk:]
76 n += _Chunk
77 }
78
79 dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4] = h0, h1, h2, h3, h4
80 return n
81 }