Source file
src/crypto/sha1/sha1block.go
1
2
3
4
5 package sha1
6
7 const (
8 _K0 = 0x5A827999
9 _K1 = 0x6ED9EBA1
10 _K2 = 0x8F1BBCDC
11 _K3 = 0xCA62C1D6
12 )
13
14
15
16 func blockGeneric(dig *digest, p []byte) {
17 var w [16]uint32
18
19 h0, h1, h2, h3, h4 := dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4]
20 for len(p) >= chunk {
21
22
23 for i := 0; i < 16; i++ {
24 j := i * 4
25 w[i] = uint32(p[j])<<24 | uint32(p[j+1])<<16 | uint32(p[j+2])<<8 | uint32(p[j+3])
26 }
27
28 a, b, c, d, e := h0, h1, h2, h3, h4
29
30
31
32
33 i := 0
34 for ; i < 16; i++ {
35 f := b&c | (^b)&d
36 a5 := a<<5 | a>>(32-5)
37 b30 := b<<30 | b>>(32-30)
38 t := a5 + f + e + w[i&0xf] + _K0
39 a, b, c, d, e = t, a, b30, c, d
40 }
41 for ; i < 20; i++ {
42 tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
43 w[i&0xf] = tmp<<1 | tmp>>(32-1)
44
45 f := b&c | (^b)&d
46 a5 := a<<5 | a>>(32-5)
47 b30 := b<<30 | b>>(32-30)
48 t := a5 + f + e + w[i&0xf] + _K0
49 a, b, c, d, e = t, a, b30, c, d
50 }
51 for ; i < 40; i++ {
52 tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
53 w[i&0xf] = tmp<<1 | tmp>>(32-1)
54 f := b ^ c ^ d
55 a5 := a<<5 | a>>(32-5)
56 b30 := b<<30 | b>>(32-30)
57 t := a5 + f + e + w[i&0xf] + _K1
58 a, b, c, d, e = t, a, b30, c, d
59 }
60 for ; i < 60; i++ {
61 tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
62 w[i&0xf] = tmp<<1 | tmp>>(32-1)
63 f := ((b | c) & d) | (b & c)
64
65 a5 := a<<5 | a>>(32-5)
66 b30 := b<<30 | b>>(32-30)
67 t := a5 + f + e + w[i&0xf] + _K2
68 a, b, c, d, e = t, a, b30, c, d
69 }
70 for ; i < 80; i++ {
71 tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
72 w[i&0xf] = tmp<<1 | tmp>>(32-1)
73 f := b ^ c ^ d
74 a5 := a<<5 | a>>(32-5)
75 b30 := b<<30 | b>>(32-30)
76 t := a5 + f + e + w[i&0xf] + _K3
77 a, b, c, d, e = t, a, b30, c, d
78 }
79
80 h0 += a
81 h1 += b
82 h2 += c
83 h3 += d
84 h4 += e
85
86 p = p[chunk:]
87 }
88
89 dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4] = h0, h1, h2, h3, h4
90 }
91
View as plain text