From 7cfb79cfc161bea240beebbb933f0cdac1f7f5d8 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 28 Dec 2014 19:52:56 +0000 Subject: [PATCH] close connection when failing to decrypt packets Since we may never recover from that if nonces got out of sync. Closes #274. --- router/crypto.go | 2 +- router/router.go | 6 +++++- router/types.go | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/router/crypto.go b/router/crypto.go index 8b83f81b..803858aa 100644 --- a/router/crypto.go +++ b/router/crypto.go @@ -286,7 +286,7 @@ func (nd *NaClDecryptor) ReceiveNonce(msg []byte) { func (nd *NaClDecryptor) IterateFrames(fun FrameConsumer, packet *UDPPacket) error { buf, err := nd.decrypt(packet.Packet) if err != nil { - return PacketDecodingError{Desc: fmt.Sprint("decryption failed; ", err)} + return PacketDecodingError{Fatal: true, Desc: fmt.Sprint("decryption failed; ", err)} } packet.Packet = buf return nd.NonDecryptor.IterateFrames(fun, packet) diff --git a/router/router.go b/router/router.go index 08825bd5..f9736641 100644 --- a/router/router.go +++ b/router/router.go @@ -209,7 +209,11 @@ func (router *Router) udpReader(conn *net.UDPConn, po PacketSink) { } err = relayConn.Decryptor.IterateFrames(handleUDPPacket, udpPacket) if pde, ok := err.(PacketDecodingError); ok { - relayConn.log(pde.Error()) + if pde.Fatal { + relayConn.CheckFatal(pde) + } else { + relayConn.log(pde.Error()) + } } else { checkWarn(err) } diff --git a/router/types.go b/router/types.go index e6acb90b..5c236c24 100644 --- a/router/types.go +++ b/router/types.go @@ -114,7 +114,8 @@ type NameCollisionError struct { } type PacketDecodingError struct { - Desc string + Fatal bool + Desc string } type LocalAddress struct {