v5wire

package
v0.0.0-...-ee2f6cb Latest Latest
Warning

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

Go to latest
Published: May 9, 2023 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.

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

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