|
|
@ -0,0 +1,132 @@ |
|
|
|
package crypto |
|
|
|
|
|
|
|
import ( |
|
|
|
"encoding/hex" |
|
|
|
"encoding/json" |
|
|
|
"fmt" |
|
|
|
"io/ioutil" |
|
|
|
"os" |
|
|
|
"testing" |
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert" |
|
|
|
"github.com/tyler-smith/go-bip39" |
|
|
|
|
|
|
|
"github.com/btcsuite/btcd/chaincfg" |
|
|
|
"github.com/btcsuite/btcutil/hdkeychain" |
|
|
|
"github.com/tyler-smith/go-bip32" |
|
|
|
|
|
|
|
"github.com/tendermint/go-crypto" |
|
|
|
) |
|
|
|
|
|
|
|
type addrData struct { |
|
|
|
Mnemonic string |
|
|
|
Seed string |
|
|
|
Priv string |
|
|
|
Pub string |
|
|
|
Addr string |
|
|
|
} |
|
|
|
|
|
|
|
// NOTE: atom fundraiser address
|
|
|
|
var hdPath string = "m/44'/118'/0'/0/0" |
|
|
|
var hdToAddrTable []addrData |
|
|
|
|
|
|
|
/*{ |
|
|
|
{ |
|
|
|
Mnemonic: "spawn essence sudden gown library fire chalk edge start museum glimpse sea", |
|
|
|
Priv: "ab20a81c1b9002538e2269e1f1302d519901633d40408313211598899bc00fc6", |
|
|
|
Pub: "03eb89fb1c4582eed592e09c31c4665d3956154ea66fd269933d3f036e879abfe6", |
|
|
|
Addr: "f7d613738f0a665ec320306d14f5d62a850ff714", |
|
|
|
}, |
|
|
|
}*/ |
|
|
|
|
|
|
|
func init() { |
|
|
|
|
|
|
|
b, err := ioutil.ReadFile("test.json") |
|
|
|
if err != nil { |
|
|
|
fmt.Println(err) |
|
|
|
os.Exit(1) |
|
|
|
} |
|
|
|
|
|
|
|
err = json.Unmarshal(b, &hdToAddrTable) |
|
|
|
if err != nil { |
|
|
|
fmt.Println(err) |
|
|
|
os.Exit(1) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func TestHDToAddr(t *testing.T) { |
|
|
|
|
|
|
|
for i, d := range hdToAddrTable { |
|
|
|
privB, _ := hex.DecodeString(d.Priv) |
|
|
|
pubB, _ := hex.DecodeString(d.Pub) |
|
|
|
addrB, _ := hex.DecodeString(d.Addr) |
|
|
|
seedB, _ := hex.DecodeString(d.Seed) |
|
|
|
|
|
|
|
seed := bip39.NewSeed(d.Mnemonic, "") |
|
|
|
|
|
|
|
fmt.Println(i, d.Mnemonic) |
|
|
|
|
|
|
|
priv, pub := tylerSmith(seed) |
|
|
|
//priv, pub := btcsuite(seed)
|
|
|
|
|
|
|
|
fmt.Printf("\t%X %X\n", seedB, seed) |
|
|
|
fmt.Printf("\t%X %X\n", privB, priv) |
|
|
|
fmt.Printf("\t%X %X\n", pubB, pub) |
|
|
|
assert.Equal(t, priv, privB, "Expected priv keys to match") |
|
|
|
assert.Equal(t, pub, pubB, "Expected pub keys to match") |
|
|
|
|
|
|
|
var pubT crypto.PubKeySecp256k1 |
|
|
|
copy(pubT[:], pub) |
|
|
|
addr := pubT.Address() |
|
|
|
assert.Equal(t, addr, addrB, "Expected addresses to match") |
|
|
|
|
|
|
|
/* if i%10 == 0 { |
|
|
|
fmt.Printf("ADDR %d: %s %X %X\n", i, d.Mnemonic, addr, addrB) |
|
|
|
}*/ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func ifExit(err error, n int) { |
|
|
|
if err != nil { |
|
|
|
fmt.Println(n, err) |
|
|
|
os.Exit(1) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func btcsuite(seed []byte) ([]byte, []byte) { |
|
|
|
masterKey, _ := hdkeychain.NewMaster(seed, &chaincfg.MainNetParams) |
|
|
|
fh := hdkeychain.HardenedKeyStart |
|
|
|
k, err := masterKey.Child(uint32(fh + 44)) |
|
|
|
ifExit(err, 44) |
|
|
|
k, err = k.Child(uint32(fh + 118)) |
|
|
|
ifExit(err, 118) |
|
|
|
k, err = k.Child(uint32(fh + 0)) |
|
|
|
ifExit(err, 1) |
|
|
|
k, err = k.Child(uint32(0)) |
|
|
|
ifExit(err, 2) |
|
|
|
k, err = k.Child(uint32(0)) |
|
|
|
ifExit(err, 3) |
|
|
|
ecpriv, err := k.ECPrivKey() |
|
|
|
ifExit(err, 10) |
|
|
|
ecpub, err := k.ECPubKey() |
|
|
|
ifExit(err, 11) |
|
|
|
|
|
|
|
priv := ecpriv.Serialize() |
|
|
|
pub := ecpub.SerializeCompressed() |
|
|
|
return priv, pub |
|
|
|
} |
|
|
|
|
|
|
|
// return priv and pub
|
|
|
|
func tylerSmith(seed []byte) ([]byte, []byte) { |
|
|
|
masterKey, _ := bip32.NewMasterKey(seed) |
|
|
|
fh := bip32.FirstHardenedChild |
|
|
|
k, _ := masterKey.NewChildKey(fh + 44) |
|
|
|
k, _ = k.NewChildKey(fh + 118) |
|
|
|
k, _ = k.NewChildKey(fh + 0) |
|
|
|
k, _ = k.NewChildKey(0) |
|
|
|
k, _ = k.NewChildKey(0) |
|
|
|
|
|
|
|
priv := k.Key |
|
|
|
pub := k.PublicKey().Key |
|
|
|
return priv, pub |
|
|
|
} |