package pex import ( "net" "os" "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/libs/service" "github.com/tendermint/tendermint/p2p" "github.com/tendermint/tendermint/p2p/pex" "github.com/tendermint/tendermint/version" ) var ( pexR *pex.Reactor peer p2p.Peer logger = log.NewTMLogger(log.NewSyncWriter(os.Stdout)) ) func init() { addrB := pex.NewAddrBook("./testdata/addrbook1", false) pexR = pex.NewReactor(addrB, &pex.ReactorConfig{SeedMode: false}) pexR.SetLogger(logger) peer = newFuzzPeer() pexR.AddPeer(peer) cfg := config.DefaultP2PConfig() cfg.PexReactor = true sw := p2p.MakeSwitch(cfg, 0, "127.0.0.1", "123.123.123", func(i int, sw *p2p.Switch) *p2p.Switch { return sw }, logger) pexR.SetSwitch(sw) } func Fuzz(data []byte) int { if len(data) == 0 { return -1 } pexR.Receive(pex.PexChannel, peer, data) if !peer.IsRunning() { // do not increase priority for msgs which lead to peer being stopped return 0 } return 1 } type fuzzPeer struct { *service.BaseService m map[string]interface{} } var _ p2p.Peer = (*fuzzPeer)(nil) func newFuzzPeer() *fuzzPeer { fp := &fuzzPeer{m: make(map[string]interface{})} fp.BaseService = service.NewBaseService(nil, "fuzzPeer", fp) return fp } var privKey = ed25519.GenPrivKey() var nodeID = p2p.NodeIDFromPubKey(privKey.PubKey()) var defaultNodeInfo = p2p.NodeInfo{ ProtocolVersion: p2p.NewProtocolVersion( version.P2PProtocol, version.BlockProtocol, 0, ), NodeID: nodeID, ListenAddr: "127.0.0.1:0", Moniker: "foo1", } func (fp *fuzzPeer) FlushStop() {} func (fp *fuzzPeer) ID() p2p.NodeID { return nodeID } func (fp *fuzzPeer) RemoteIP() net.IP { return net.IPv4(198, 163, 190, 214) } func (fp *fuzzPeer) RemoteAddr() net.Addr { return &net.TCPAddr{IP: fp.RemoteIP(), Port: 26656, Zone: ""} } func (fp *fuzzPeer) IsOutbound() bool { return false } func (fp *fuzzPeer) IsPersistent() bool { return false } func (fp *fuzzPeer) CloseConn() error { return nil } func (fp *fuzzPeer) NodeInfo() p2p.NodeInfo { return defaultNodeInfo } func (fp *fuzzPeer) Status() p2p.ConnectionStatus { var cs p2p.ConnectionStatus; return cs } func (fp *fuzzPeer) SocketAddr() *p2p.NetAddress { return p2p.NewNetAddress(fp.ID(), fp.RemoteAddr()) } func (fp *fuzzPeer) Send(byte, []byte) bool { return true } func (fp *fuzzPeer) TrySend(byte, []byte) bool { return true } func (fp *fuzzPeer) Set(key string, value interface{}) { fp.m[key] = value } func (fp *fuzzPeer) Get(key string) interface{} { return fp.m[key] }