github.com/mit-dci/lit@v0.0.0-20221102210550-8c3d3b49f2ce/btcutil/base58/base58check.go (about) 1 // Copyright (c) 2013-2014 The btcsuite developers 2 // Use of this source code is governed by an ISC 3 // license that can be found in the LICENSE file. 4 5 package base58 6 7 import ( 8 "crypto/sha256" 9 "errors" 10 ) 11 12 // ErrChecksum indicates that the checksum of a check-encoded string does not verify against 13 // the checksum. 14 var ErrChecksum = errors.New("checksum error") 15 16 // ErrInvalidFormat indicates that the check-encoded string has an invalid format. 17 var ErrInvalidFormat = errors.New("invalid format: version and/or checksum bytes missing") 18 19 // checksum: first four bytes of sha256^2 20 func checksum(input []byte) (cksum [4]byte) { 21 h := sha256.Sum256(input) 22 h2 := sha256.Sum256(h[:]) 23 copy(cksum[:], h2[:4]) 24 return 25 } 26 27 // CheckEncode prepends a version byte and appends a four byte checksum. 28 func CheckEncode(input []byte, version byte) string { 29 b := make([]byte, 0, 1+len(input)+4) 30 b = append(b, version) 31 b = append(b, input[:]...) 32 cksum := checksum(b) 33 b = append(b, cksum[:]...) 34 return Encode(b) 35 } 36 37 // CheckDecode decodes a string that was encoded with CheckEncode and verifies the checksum. 38 func CheckDecode(input string) (result []byte, version byte, err error) { 39 decoded := Decode(input) 40 if len(decoded) < 5 { 41 return nil, 0, ErrInvalidFormat 42 } 43 version = decoded[0] 44 var cksum [4]byte 45 copy(cksum[:], decoded[len(decoded)-4:]) 46 if checksum(decoded[:len(decoded)-4]) != cksum { 47 return nil, 0, ErrChecksum 48 } 49 payload := decoded[1 : len(decoded)-4] 50 result = append(result, payload...) 51 return 52 }