v5wire

package
v2.0.2+incompatible Latest Latest
Warning

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

Go to latest
Published: Jul 27, 2022 License: GPL-3.0 Imports: 21 Imported by: 0

Documentation

Index

Constants

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

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

Message types.

Variables

View Source
var (
	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.

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) *Codec

NewCodec creates a wire codec.

func (*Codec) Decode

func (c *Codec) Decode(input []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
}

FINDNODE is a query for nodes in the given bucket.

func (*Findnode) Kind

func (*Findnode) Kind() byte

func (*Findnode) Name

func (*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
	Total uint8
	Nodes []*enr.Record
}

NODES is the reply to FINDNODE and TOPICQUERY.

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.
}

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) 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) 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 Regconfirmation

type Regconfirmation struct {
	ReqID      []byte
	Registered bool
}

REGCONFIRMATION is the reply to REGTOPIC.

func (*Regconfirmation) Kind

func (*Regconfirmation) Kind() byte

func (*Regconfirmation) Name

func (*Regconfirmation) Name() string

func (*Regconfirmation) RequestID

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

func (*Regconfirmation) SetRequestID

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

type Regtopic

type Regtopic struct {
	ReqID  []byte
	Ticket []byte
	ENR    *enr.Record
}

REGTOPIC registers the sender in a topic queue using a ticket.

func (*Regtopic) Kind

func (*Regtopic) Kind() byte

func (*Regtopic) Name

func (*Regtopic) Name() string

func (*Regtopic) RequestID

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

func (*Regtopic) SetRequestID

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

type RequestTicket

type RequestTicket struct {
	ReqID []byte
	Topic []byte
}

REQUESTTICKET requests a ticket for a topic queue.

func (*RequestTicket) Kind

func (*RequestTicket) Kind() byte

func (*RequestTicket) Name

func (*RequestTicket) Name() string

func (*RequestTicket) RequestID

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

func (*RequestTicket) SetRequestID

func (p *RequestTicket) 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) 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) 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 Ticket

type Ticket struct {
	ReqID  []byte
	Ticket []byte
}

TICKET is the response to REQUESTTICKET.

func (*Ticket) Kind

func (*Ticket) Kind() byte

func (*Ticket) Name

func (*Ticket) Name() string

func (*Ticket) RequestID

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

func (*Ticket) SetRequestID

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

type TopicQuery

type TopicQuery struct {
	ReqID []byte
	Topic []byte
}

TOPICQUERY asks for nodes with the given topic.

func (*TopicQuery) Kind

func (*TopicQuery) Kind() byte

func (*TopicQuery) Name

func (*TopicQuery) Name() string

func (*TopicQuery) RequestID

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

func (*TopicQuery) SetRequestID

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

type Unknown

type Unknown struct {
	Nonce Nonce
}

Unknown represents any packet that can't be decrypted.

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) 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