59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
package android
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"crypto/sha1"
|
|
"encoding/hex"
|
|
)
|
|
|
|
// CalcMsgCrc calc msg hash
|
|
func CalcMsgCrc(data []byte) int {
|
|
|
|
salt1 := [16]byte{0x5c, 0x50, 0x7b, 0x6b, 0x65, 0x4a, 0x13, 0x09, 0x45, 0x58, 0x7e, 0x11, 0x0c, 0x1f, 0x68, 0x79}
|
|
salt2 := [16]byte{0x36, 0x3a, 0x11, 0x01, 0x0f, 0x20, 0x79, 0x63, 0x2f, 0x32, 0x14, 0x7b, 0x66, 0x75, 0x02, 0x13}
|
|
|
|
pad1 := [0x30]byte{
|
|
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
|
|
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
|
|
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
|
|
}
|
|
|
|
pad2 := [0x30]byte{
|
|
0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
|
|
0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
|
|
0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
|
|
}
|
|
|
|
md5hash := md5.Sum(data)
|
|
hashstr := hex.EncodeToString(md5hash[:])
|
|
|
|
hash1Data := make([]byte, 16)
|
|
copy(hash1Data, salt1[:])
|
|
hash1Data = append(hash1Data, pad1[:]...)
|
|
|
|
hash1 := sha1.New()
|
|
hash1.Write(hash1Data)
|
|
hash1.Write([]byte(hashstr))
|
|
h1 := hash1.Sum(nil)
|
|
|
|
hash2Data := make([]byte, 16)
|
|
copy(hash2Data, salt2[:])
|
|
hash2Data = append(hash2Data, pad2[:]...)
|
|
|
|
hash2 := sha1.New()
|
|
hash2.Write(hash2Data)
|
|
hash2.Write(h1)
|
|
h2 := hash2.Sum(nil)
|
|
|
|
var b1, b2, b3 byte
|
|
size := len(h2)
|
|
|
|
for i := 0; i < size-2; i++ {
|
|
b1 = h2[i+0] - b1*0x7d
|
|
b2 = h2[i+1] - b2*0x7d
|
|
b3 = h2[i+2] - b3*0x7d
|
|
}
|
|
|
|
return (int(0x21) << 24) | ((int(b3) & 0x7f) << 16) | ((int(b2) & 0x7f) << 8) | (int(b1) & 0x7f)
|
|
}
|