lbry.go/schema/address/base58/decode.go

40 lines
929 B
Go
Raw Normal View History

2017-09-12 18:02:30 +02:00
package base58
import (
"errors"
"math/big"
2017-09-12 18:02:30 +02:00
)
func DecodeBase58(value string, size int64) ([]byte, error) {
buf := []byte(value)
2018-02-15 20:51:51 +01:00
longValue := big.NewInt(0)
2017-09-12 18:02:30 +02:00
result := make([]byte, size)
for i := int64(len(buf) - 1); i >= 0; i-- {
to_add := big.NewInt(0)
to_add = to_add.Exp(big.NewInt(58), big.NewInt(i), to_add)
c, err := CharacterIndex(buf[int64(len(buf))-i-1])
2017-09-12 18:02:30 +02:00
if err != nil {
return result, err
}
to_add = to_add.Mul(c, to_add)
2018-02-15 20:51:51 +01:00
longValue = longValue.Add(to_add, longValue)
2017-09-12 18:02:30 +02:00
}
for i := size - 1; i >= 0; i-- {
m := big.NewInt(0)
2018-02-15 20:51:51 +01:00
longValue, m = longValue.DivMod(longValue, big.NewInt(256), m)
2017-09-12 18:02:30 +02:00
bs := m.Bytes()
if len(bs) == 0 {
bs = append(bs, 0x00)
}
b := byte(bs[0])
result[i] = b
}
2018-02-15 20:51:51 +01:00
if longValue.Int64() != 0 {
2017-09-12 18:02:30 +02:00
return result, errors.New("cannot decode to the given size")
}
if size != int64(len(result)) {
return result, errors.New("length mismatch")
}
2017-09-12 18:02:30 +02:00
return result, nil
}