/
checksum.go
44 lines (35 loc) · 870 Bytes
/
checksum.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
40
41
42
43
44
// take idea from https://github.com/tyler-smith/go-bip32/blob/master/utils.go
package utils
import "errors"
var (
// ErrInvalidChecksum is returned when deserializing a key with an incorrect
// checksum
ErrInvalidChecksum = errors.New("Checksum doesn't match")
)
func Checksum(data []byte) ([]byte, error) {
hash, err := HashDoubleSha256(data)
if err != nil {
return nil, err
}
return hash[:4], nil
}
func AddChecksumToBytes(data []byte) ([]byte, error) {
checksum, err := Checksum(data)
if err != nil {
return nil, err
}
return append(data, checksum...), nil
}
func ValidateChecksum(data []byte) ([]byte, error) {
cs1, err := Checksum(data[0 : len(data)-4])
if err != nil {
return nil, err
}
cs2 := data[len(data)-4:]
for i := range cs1 {
if cs1[i] != cs2[i] {
return nil, ErrInvalidChecksum
}
}
return data[:len(data)-4], nil
}