v5wire

package
v0.0.0-...-0ecfc99 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 27, 2024 License: GPL-3.0 Imports: 22 Imported by: 0

Documentation

Index

Constants

View Source
const (
	PingMsg byte = iota + 1
	PongMsg
	FindnodeMsg
	NodesMsg
	TalkRequestMsg
	TalkResponseMsg
	RequestTicketMsg
	TicketMsg

	UnknownPacket   = byte(255) // any non-decryptable packet
	WhoareyouPacket = byte(254) // the WHOAREYOU packet
)

Message types.

Variables

View Source
var DefaultProtocolID = [6]byte{'d', 'i', 's', 'c', 'v', '5'}
View Source
var (
	// ErrInvalidReqID represents error when the ID is invalid.
	ErrInvalidReqID = errors.New("request ID larger than 8 bytes")
)

Public errors.

Functions

func DecodePubkey

func DecodePubkey(curve elliptic.Curve, e []byte) (*ecdsa.PublicKey, error)

DecodePubkey decodes a public key in compressed format.

func EncodePubkey

func EncodePubkey(key *ecdsa.PublicKey) []byte

EncodePubkey encodes a public key.

func IsInvalidHeader

func IsInvalidHeader(err error) bool

IsInvalidHeader reports whether 'err' is related to an invalid packet header. When it returns false, it is pretty certain that the packet causing the error does not belong to discv5.

Types

type Codec

type Codec struct {
	// contains filtered or unexported fields
}

Codec encodes and decodes Discovery v5 packets. This type is not safe for concurrent use.

func NewCodec

func NewCodec(ln *enode.LocalNode, key *ecdsa.PrivateKey, clock mclock.Clock, protocolID *[6]byte) *Codec

NewCodec creates a wire codec.

func (*Codec) Decode

func (c *Codec) Decode(inputData []byte, addr string) (src enode.ID, n *enode.Node, p Packet, err error)

Decode decodes a discovery packet.

func (*Codec) Encode

func (c *Codec) Encode(id enode.ID, addr string, packet Packet, challenge *Whoareyou) ([]byte, Nonce, error)

Encode encodes a packet to a node. 'id' and 'addr' specify the destination node. The 'challenge' parameter should be the most recently received WHOAREYOU packet from that node.

func (*Codec) EncodeRaw

func (c *Codec) EncodeRaw(id enode.ID, head Header, msgdata []byte) ([]byte, error)

EncodeRaw encodes a packet with the given header.

type Findnode

type Findnode struct {
	ReqID     []byte
	Distances []uint

	// OpID is for debugging purposes and is not part of the packet encoding.
	// It identifies the 'operation' on behalf of which the request was sent.
	OpID uint64 `rlp:"-"`
}

FINDNODE is a query for nodes in the given bucket.

func (*Findnode) AppendLogInfo

func (p *Findnode) AppendLogInfo(ctx []interface{}) []interface{}

func (*Findnode) Kind

func (p *Findnode) Kind() byte

func (*Findnode) Name

func (p *Findnode) Name() string

func (*Findnode) RequestID

func (p *Findnode) RequestID() []byte

func (*Findnode) SetRequestID

func (p *Findnode) SetRequestID(id []byte)
type Header struct {
	IV [sizeofMaskingIV]byte
	StaticHeader
	AuthData []byte
	// contains filtered or unexported fields
}

Header represents a packet header.

type Nodes

type Nodes struct {
	ReqID     []byte
	RespCount uint8 // total number of responses to the request
	Nodes     []*enr.Record
}

NODES is a response to FINDNODE.

func (*Nodes) AppendLogInfo

func (p *Nodes) AppendLogInfo(ctx []interface{}) []interface{}

func (*Nodes) Kind

func (*Nodes) Kind() byte

func (*Nodes) Name

func (*Nodes) Name() string

func (*Nodes) RequestID

func (p *Nodes) RequestID() []byte

func (*Nodes) SetRequestID

func (p *Nodes) SetRequestID(id []byte)

type Nonce

type Nonce [gcmNonceSize]byte

Nonce represents a nonce used for AES/GCM.

type Packet

type Packet interface {
	Name() string        // Name returns a string corresponding to the message type.
	Kind() byte          // Kind returns the message type.
	RequestID() []byte   // Returns the request ID.
	SetRequestID([]byte) // Sets the request ID.

	// AppendLogInfo returns its argument 'ctx' with additional fields
	// appended for logging purposes.
	AppendLogInfo(ctx []interface{}) []interface{}
}

Packet is implemented by all message types.

func DecodeMessage

func DecodeMessage(ptype byte, body []byte) (Packet, error)

DecodeMessage decodes the message body of a packet.

type Ping

type Ping struct {
	ReqID  []byte
	ENRSeq uint64
}

PING is sent during liveness checks.

func (*Ping) AppendLogInfo

func (p *Ping) AppendLogInfo(ctx []interface{}) []interface{}

func (*Ping) Kind

func (*Ping) Kind() byte

func (*Ping) Name

func (*Ping) Name() string

func (*Ping) RequestID

func (p *Ping) RequestID() []byte

func (*Ping) SetRequestID

func (p *Ping) SetRequestID(id []byte)

type Pong

type Pong struct {
	ReqID  []byte
	ENRSeq uint64
	ToIP   net.IP // These fields should mirror the UDP envelope address of the ping
	ToPort uint16 // packet, which provides a way to discover the external address (after NAT).
}

PONG is the reply to PING.

func (*Pong) AppendLogInfo

func (p *Pong) AppendLogInfo(ctx []interface{}) []interface{}

func (*Pong) Kind

func (*Pong) Kind() byte

func (*Pong) Name

func (*Pong) Name() string

func (*Pong) RequestID

func (p *Pong) RequestID() []byte

func (*Pong) SetRequestID

func (p *Pong) SetRequestID(id []byte)

type SessionCache

type SessionCache struct {
	// contains filtered or unexported fields
}

The SessionCache keeps negotiated encryption keys and state for in-progress handshakes in the Discovery v5 wire protocol.

func NewSessionCache

func NewSessionCache(maxItems int, clock mclock.Clock) *SessionCache

type StaticHeader

type StaticHeader struct {
	ProtocolID [6]byte
	Version    uint16
	Flag       byte
	Nonce      Nonce
	AuthSize   uint16
}

StaticHeader contains the static fields of a packet header.

type TalkRequest

type TalkRequest struct {
	ReqID    []byte
	Protocol string
	Message  []byte
}

TALKREQ is an application-level request.

func (*TalkRequest) AppendLogInfo

func (p *TalkRequest) AppendLogInfo(ctx []interface{}) []interface{}

func (*TalkRequest) Kind

func (*TalkRequest) Kind() byte

func (*TalkRequest) Name

func (*TalkRequest) Name() string

func (*TalkRequest) RequestID

func (p *TalkRequest) RequestID() []byte

func (*TalkRequest) SetRequestID

func (p *TalkRequest) SetRequestID(id []byte)

type TalkResponse

type TalkResponse struct {
	ReqID   []byte
	Message []byte
}

TALKRESP is the reply to TALKREQ.

func (*TalkResponse) AppendLogInfo

func (p *TalkResponse) AppendLogInfo(ctx []interface{}) []interface{}

func (*TalkResponse) Kind

func (*TalkResponse) Kind() byte

func (*TalkResponse) Name

func (*TalkResponse) Name() string

func (*TalkResponse) RequestID

func (p *TalkResponse) RequestID() []byte

func (*TalkResponse) SetRequestID

func (p *TalkResponse) SetRequestID(id []byte)

type Unknown

type Unknown struct {
	Nonce Nonce
}

Unknown represents any packet that can't be decrypted.

func (*Unknown) AppendLogInfo

func (*Unknown) AppendLogInfo(ctx []interface{}) []interface{}

func (*Unknown) Kind

func (*Unknown) Kind() byte

func (*Unknown) Name

func (*Unknown) Name() string

func (*Unknown) RequestID

func (*Unknown) RequestID() []byte

func (*Unknown) SetRequestID

func (*Unknown) SetRequestID([]byte)

type Whoareyou

type Whoareyou struct {
	ChallengeData []byte   // Encoded challenge
	Nonce         Nonce    // Nonce of request packet
	IDNonce       [16]byte // Identity proof data
	RecordSeq     uint64   // ENR sequence number of recipient

	// Node is the locally known node record of recipient.
	// This must be set by the caller of Encode.
	Node *enode.Node
	// contains filtered or unexported fields
}

WHOAREYOU contains the handshake challenge.

func (*Whoareyou) AppendLogInfo

func (*Whoareyou) AppendLogInfo(ctx []interface{}) []interface{}

func (*Whoareyou) Kind

func (*Whoareyou) Kind() byte

func (*Whoareyou) Name

func (*Whoareyou) Name() string

func (*Whoareyou) RequestID

func (*Whoareyou) RequestID() []byte

func (*Whoareyou) SetRequestID

func (*Whoareyou) SetRequestID([]byte)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL