|
@@ -22,7 +22,7 @@ const (
|
|
|
|
|
|
|
|
var ErrOutOfWindow = errors.New("out of window packet")
|
|
var ErrOutOfWindow = errors.New("out of window packet")
|
|
|
|
|
|
|
|
-func (f *Interface) readOutsidePackets(via ViaSender, out []byte, packet []byte, h *header.H, fwPacket *firewall.Packet, lhf *LightHouseHandler, nb []byte, q int, localCache firewall.ConntrackCache) {
|
|
|
|
|
|
|
+func (f *Interface) readOutsidePackets(via ViaSender, packet []byte, h *header.H, fwPacket *firewall.Packet, lhf *LightHouseHandler, nb []byte, q int, localCache firewall.ConntrackCache) {
|
|
|
err := h.Parse(packet)
|
|
err := h.Parse(packet)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
// Hole punch packets are 0 or 1 byte big, so lets ignore printing those errors
|
|
// Hole punch packets are 0 or 1 byte big, so lets ignore printing those errors
|
|
@@ -110,10 +110,11 @@ func (f *Interface) readOutsidePackets(via ViaSender, out []byte, packet []byte,
|
|
|
|
|
|
|
|
// Relay packets are special
|
|
// Relay packets are special
|
|
|
if isMessageRelay {
|
|
if isMessageRelay {
|
|
|
- f.handleOutsideRelayPacket(hostinfo, via, out, packet, h, fwPacket, lhf, nb, q, localCache)
|
|
|
|
|
|
|
+ f.handleOutsideRelayPacket(hostinfo, via, packet, h, fwPacket, lhf, nb, q, localCache)
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ out := f.batchers[q].Reserve(len(packet))
|
|
|
out, err = f.decrypt(hostinfo, h.MessageCounter, out, packet, h, nb)
|
|
out, err = f.decrypt(hostinfo, h.MessageCounter, out, packet, h, nb)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
if f.l.Enabled(context.Background(), slog.LevelDebug) {
|
|
if f.l.Enabled(context.Background(), slog.LevelDebug) {
|
|
@@ -167,7 +168,7 @@ func (f *Interface) readOutsidePackets(via ViaSender, out []byte, packet []byte,
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (f *Interface) handleOutsideRelayPacket(hostinfo *HostInfo, via ViaSender, out []byte, packet []byte, h *header.H, fwPacket *firewall.Packet, lhf *LightHouseHandler, nb []byte, q int, localCache firewall.ConntrackCache) {
|
|
|
|
|
|
|
+func (f *Interface) handleOutsideRelayPacket(hostinfo *HostInfo, via ViaSender, packet []byte, h *header.H, fwPacket *firewall.Packet, lhf *LightHouseHandler, nb []byte, q int, localCache firewall.ConntrackCache) {
|
|
|
// The entire body is sent as AD, not encrypted.
|
|
// The entire body is sent as AD, not encrypted.
|
|
|
// The packet consists of a 16-byte parsed Nebula header, Associated Data-protected payload, and a trailing 16-byte AEAD signature value.
|
|
// The packet consists of a 16-byte parsed Nebula header, Associated Data-protected payload, and a trailing 16-byte AEAD signature value.
|
|
|
// The packet is guaranteed to be at least 16 bytes at this point, b/c it got past the h.Parse() call above. If it's
|
|
// The packet is guaranteed to be at least 16 bytes at this point, b/c it got past the h.Parse() call above. If it's
|
|
@@ -175,9 +176,10 @@ func (f *Interface) handleOutsideRelayPacket(hostinfo *HostInfo, via ViaSender,
|
|
|
// which will gracefully fail in the DecryptDanger call.
|
|
// which will gracefully fail in the DecryptDanger call.
|
|
|
signedPayload := packet[:len(packet)-hostinfo.ConnectionState.dKey.Overhead()]
|
|
signedPayload := packet[:len(packet)-hostinfo.ConnectionState.dKey.Overhead()]
|
|
|
signatureValue := packet[len(packet)-hostinfo.ConnectionState.dKey.Overhead():]
|
|
signatureValue := packet[len(packet)-hostinfo.ConnectionState.dKey.Overhead():]
|
|
|
- var err error
|
|
|
|
|
- out, err = hostinfo.ConnectionState.dKey.DecryptDanger(out, signedPayload, signatureValue, h.MessageCounter, nb)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
|
|
+ // The decrypted output is empty (relay packets carry their payload as AD) and unused.
|
|
|
|
|
+ // The recursive readOutsidePackets call below operates on signedPayload. Passing
|
|
|
|
|
+ // nil avoids reserving an arena slot.
|
|
|
|
|
+ if _, err := hostinfo.ConnectionState.dKey.DecryptDanger(nil, signedPayload, signatureValue, h.MessageCounter, nb); err != nil {
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
// Successfully validated the thing. Get rid of the Relay header.
|
|
// Successfully validated the thing. Get rid of the Relay header.
|
|
@@ -210,7 +212,7 @@ func (f *Interface) handleOutsideRelayPacket(hostinfo *HostInfo, via ViaSender,
|
|
|
relay: relay,
|
|
relay: relay,
|
|
|
IsRelayed: true,
|
|
IsRelayed: true,
|
|
|
}
|
|
}
|
|
|
- f.readOutsidePackets(via, out[:0], signedPayload, h, fwPacket, lhf, nb, q, localCache)
|
|
|
|
|
|
|
+ f.readOutsidePackets(via, signedPayload, h, fwPacket, lhf, nb, q, localCache)
|
|
|
case ForwardingType:
|
|
case ForwardingType:
|
|
|
// Find the target HostInfo relay object
|
|
// Find the target HostInfo relay object
|
|
|
targetHI, targetRelay, err := f.hostMap.QueryVpnAddrsRelayFor(hostinfo.vpnAddrs, relay.PeerAddr)
|
|
targetHI, targetRelay, err := f.hostMap.QueryVpnAddrsRelayFor(hostinfo.vpnAddrs, relay.PeerAddr)
|
|
@@ -229,6 +231,7 @@ func (f *Interface) handleOutsideRelayPacket(hostinfo *HostInfo, via ViaSender,
|
|
|
case ForwardingType:
|
|
case ForwardingType:
|
|
|
// Forward this packet through the relay tunnel
|
|
// Forward this packet through the relay tunnel
|
|
|
// Find the target HostInfo //todo it would potentially be nice to batch these
|
|
// Find the target HostInfo //todo it would potentially be nice to batch these
|
|
|
|
|
+ out := f.batchers[q].Reserve(len(packet) + header.Len + hostinfo.ConnectionState.dKey.Overhead())[:0]
|
|
|
f.SendVia(targetHI, targetRelay, signedPayload, nb, out, false)
|
|
f.SendVia(targetHI, targetRelay, signedPayload, nb, out, false)
|
|
|
case TerminalType:
|
|
case TerminalType:
|
|
|
hostinfo.logger(f.l).Error("Unexpected Relay Type of Terminal")
|
|
hostinfo.logger(f.l).Error("Unexpected Relay Type of Terminal")
|