forked from yinghuocho/gotun2socks
/
common.go
39 lines (35 loc) · 858 Bytes
/
common.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package packet
var lotsOfZeros [1024]byte
//func Checksum(data []byte) uint16 {
// var csum uint32
// length := len(data) - 1
// for i := 0; i < length; i += 2 {
// csum += uint32(data[i]) << 8
// csum += uint32(data[i+1])
// }
// if len(data)%2 == 1 {
// csum += uint32(data[length]) << 8
// }
// for csum > 0xffff {
// csum = (csum >> 16) + (csum & 0xffff)
// }
// return ^uint16(csum + (csum >> 16))
//}
func Checksum(fields ...[]byte) uint16 {
var csum uint32
for _, field := range fields {
length := len(field) - 1
for i := 0; i < length; i += 2 {
csum += uint32(field[i]) << 8
csum += uint32(field[i+1])
}
if len(field)%2 == 1 {
// only last field may have odd number of bytes
csum += uint32(field[length]) << 8
}
}
for csum > 0xffff {
csum = (csum >> 16) + (csum & 0xffff)
}
return ^uint16(csum + (csum >> 16))
}