Skip to content

Commit dead1e0

Browse files
committed
add test derivepublickeyfrompath
1 parent cc29ede commit dead1e0

File tree

1 file changed

+59
-2
lines changed

1 file changed

+59
-2
lines changed

compat/bip32/derive_test.go

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"github.com/stretchr/testify/require"
1212
)
1313

14-
func Test_DerivePathAndDeriveSeed(t *testing.T) {
14+
func TestDerivePathAndDeriveSeed(t *testing.T) {
1515
t.Parallel()
1616
tests := map[string]struct {
1717
counter uint64
@@ -104,7 +104,7 @@ func TestDeriveSeed(t *testing.T) {
104104
}
105105
}
106106

107-
func Test_DeriveChildFromPath(t *testing.T) {
107+
func TestDeriveChildFromPath(t *testing.T) {
108108
t.Parallel()
109109
tests := map[string]struct {
110110
key *compat.ExtendedKey
@@ -176,3 +176,60 @@ func Test_DeriveChildFromPath(t *testing.T) {
176176
})
177177
}
178178
}
179+
180+
func TestDerivePublicKeyFromPath(t *testing.T) {
181+
t.Parallel()
182+
tests := map[string]struct {
183+
key *compat.ExtendedKey
184+
path string
185+
expectedPubKey []byte
186+
expectedErr error
187+
}{
188+
"successful run, 1 level child, should return expected public key": {
189+
key: func() *compat.ExtendedKey {
190+
k, err := compat.NewKeyFromString("xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi")
191+
assert.NoError(t, err)
192+
return k
193+
}(),
194+
path: "0/1",
195+
expectedPubKey: func() []byte {
196+
xpubStr := "xpub6AvUGrnEpfvJBbfx7sQ89Q8hEMPM65UteqEX4yUbUiES2jHfjexmfJoxCGSwFMZiPBaKQT1RiKWrKfuDV4vpgVs4Xn8PpPTR2i79rwHd4Zr"
197+
xpubKey, err := compat.NewKeyFromString(xpubStr)
198+
assert.NoError(t, err)
199+
pubKey, err := xpubKey.ECPubKey()
200+
assert.NoError(t, err)
201+
return pubKey.SerializeCompressed()
202+
}(),
203+
expectedErr: nil,
204+
},
205+
"successful run, 3 level hardened child, should return expected public key": {
206+
key: func() *compat.ExtendedKey {
207+
k, err := compat.NewKeyFromString("xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi")
208+
assert.NoError(t, err)
209+
return k
210+
}(),
211+
path: "10/1'/1000'/15'",
212+
expectedPubKey: func() []byte {
213+
xpubStr := "xpub6EagAesgan9f8xaZrxrDhPXZ1BKeKvNYWS56asqvFmC7CaAZ19TkdLvHDrzubSMiC6tAqTMcumVFkgT2duhZncV3KieshEDHNc4jPWkRMGD"
214+
xpubKey, err := compat.NewKeyFromString(xpubStr)
215+
assert.NoError(t, err)
216+
pubKey, err := xpubKey.ECPubKey()
217+
assert.NoError(t, err)
218+
return pubKey.SerializeCompressed()
219+
}(),
220+
expectedErr: nil,
221+
},
222+
}
223+
224+
for name, test := range tests {
225+
t.Run(name, func(t *testing.T) {
226+
pubKeyBytes, err := test.key.DerivePublicKeyFromPath(test.path)
227+
if test.expectedErr != nil {
228+
require.EqualError(t, err, test.expectedErr.Error())
229+
} else {
230+
require.NoError(t, err)
231+
require.Equal(t, test.expectedPubKey, pubKeyBytes)
232+
}
233+
})
234+
}
235+
}

0 commit comments

Comments
 (0)