35 lines
838 B
Go
35 lines
838 B
Go
//go:build gofuzz || go1.18
|
|
|
|
package tests
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
|
bip39 "github.com/cosmos/go-bip39"
|
|
)
|
|
|
|
func mnemonicToSeed(mnemonic string) []byte {
|
|
return bip39.NewSeed(mnemonic, "" /* Default passphrase */)
|
|
}
|
|
|
|
func FuzzCryptoHDDerivePrivateKeyForPath(f *testing.F) {
|
|
f.Fuzz(func(t *testing.T, in []byte) {
|
|
splits := bytes.Split(in, []byte("*"))
|
|
if len(splits) == 1 {
|
|
return
|
|
}
|
|
mnemonic, path := splits[0], splits[1]
|
|
if len(path) > 1e5 {
|
|
// Deriving a private key takes non-trivial time proportional
|
|
// to the path length. Skip the longer ones that trigger timeouts
|
|
// on fuzzing infrastructure.
|
|
return
|
|
}
|
|
seed := mnemonicToSeed(string(mnemonic))
|
|
master, ch := hd.ComputeMastersFromSeed(seed)
|
|
hd.DerivePrivateKeyForPath(master, ch, string(path))
|
|
})
|
|
}
|