remove FactomProject dependencies

Replace FactomProject/basen and FactomProject/btcutilecc with:
- Custom base58 encoding/decoding implementation
- github.com/decred/dcrd/dcrec/secp256k1/v4 for curve operations

Eliminates ancient, unmaintained dependencies from binary.
This commit is contained in:
Zach Kelling
2025-12-21 18:39:55 -08:00
parent 08766a3fda
commit cdf8712bfa
3 changed files with 93 additions and 36 deletions
+2 -8
View File
@@ -1,21 +1,15 @@
module github.com/luxfi/go-bip32
go 1.25.5
go 1.23.5
require (
github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e
github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0
github.com/stretchr/testify v1.10.0
golang.org/x/crypto v0.40.0
)
require (
github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
launchpad.net/gocheck v0.0.0-20140225173054-000000000087 // indirect
)
replace launchpad.net/gocheck => gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b
+2 -13
View File
@@ -1,16 +1,7 @@
github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc=
github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw=
github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc=
github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U=
github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw=
github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
@@ -19,7 +10,5 @@ golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+89 -15
View File
@@ -8,17 +8,16 @@ import (
"io"
"math/big"
"github.com/FactomProject/basen"
"github.com/FactomProject/btcutilecc"
"github.com/decred/dcrd/dcrec/secp256k1/v4"
"golang.org/x/crypto/ripemd160"
)
var (
curve = btcutil.Secp256k1()
curve = secp256k1.S256()
curveParams = curve.Params()
// BitcoinBase58Encoding is the encoding used for bitcoin addresses
BitcoinBase58Encoding = basen.NewEncoding("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")
// Base58 alphabet used for Bitcoin addresses
base58Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
)
//
@@ -70,6 +69,87 @@ func hash160(data []byte) ([]byte, error) {
return hash2, nil
}
//
// Base58 Encoding (Bitcoin style)
//
func base58Encode(data []byte) string {
// Count leading zeros
var zeros int
for _, b := range data {
if b == 0 {
zeros++
} else {
break
}
}
// Convert to big integer
num := new(big.Int).SetBytes(data)
base := big.NewInt(58)
zero := big.NewInt(0)
mod := new(big.Int)
var result []byte
for num.Cmp(zero) > 0 {
num.DivMod(num, base, mod)
result = append(result, base58Alphabet[mod.Int64()])
}
// Add leading '1's for each leading zero byte
for i := 0; i < zeros; i++ {
result = append(result, '1')
}
// Reverse the result
for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 {
result[i], result[j] = result[j], result[i]
}
return string(result)
}
func base58Decode(data string) ([]byte, error) {
// Count leading '1's (zeros in output)
var zeros int
for _, c := range data {
if c == '1' {
zeros++
} else {
break
}
}
// Build alphabet index map
alphabetMap := make(map[rune]int64)
for i, c := range base58Alphabet {
alphabetMap[c] = int64(i)
}
// Convert from base58
num := big.NewInt(0)
base := big.NewInt(58)
for _, c := range data {
idx, ok := alphabetMap[c]
if !ok {
return nil, fmt.Errorf("invalid base58 character: %c", c)
}
num.Mul(num, base)
num.Add(num, big.NewInt(idx))
}
// Convert to bytes
result := num.Bytes()
// Add leading zeros
if zeros > 0 {
prefix := make([]byte, zeros)
result = append(prefix, result...)
}
return result, nil
}
//
// Encoding
//
@@ -91,23 +171,17 @@ func addChecksumToBytes(data []byte) ([]byte, error) {
return append(data, checksum...), nil
}
func base58Encode(data []byte) string {
return BitcoinBase58Encoding.EncodeToString(data)
}
func base58Decode(data string) ([]byte, error) {
return BitcoinBase58Encoding.DecodeString(data)
}
// Keys
func publicKeyForPrivateKey(key []byte) []byte {
return compressPublicKey(curve.ScalarBaseMult(key))
x, y := curve.ScalarBaseMult(key)
return compressPublicKey(x, y)
}
func addPublicKeys(key1 []byte, key2 []byte) []byte {
x1, y1 := expandPublicKey(key1)
x2, y2 := expandPublicKey(key2)
return compressPublicKey(curve.Add(x1, y1, x2, y2))
x, y := curve.Add(x1, y1, x2, y2)
return compressPublicKey(x, y)
}
func addPrivateKeys(key1 []byte, key2 []byte) []byte {