From 29c02d2724743f26a9015c05d2e55f493098dde6 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Mon, 27 Apr 2015 07:12:21 +0100 Subject: [PATCH] refactor: lift error handling out of Encryptor.Bytes() in order to reduce dependency on LocalConnection --- router/crypto.go | 22 ++++++++++++---------- router/forwarder.go | 6 +++++- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/router/crypto.go b/router/crypto.go index 10544ef0..f8f86add 100644 --- a/router/crypto.go +++ b/router/crypto.go @@ -105,7 +105,7 @@ type Encryptor interface { FrameOverhead() int PacketOverhead() int IsEmpty() bool - Bytes() []byte + Bytes() ([]byte, error) AppendFrame(src []byte, dst []byte, frame []byte) TotalLen() int } @@ -150,11 +150,11 @@ func (ne *NonEncryptor) IsEmpty() bool { return ne.buffered == ne.prefixLen } -func (ne *NonEncryptor) Bytes() []byte { +func (ne *NonEncryptor) Bytes() ([]byte, error) { buf := ne.buf[:ne.buffered] ne.buffered = ne.prefixLen ne.bufTail = ne.buf[ne.prefixLen:] - return buf + return buf, nil } func (ne *NonEncryptor) AppendFrame(src []byte, dst []byte, frame []byte) { @@ -185,11 +185,15 @@ func NewNaClEncryptor(prefix []byte, conn *LocalConnection, df bool) *NaClEncryp nonceChan: make(chan *[24]byte, ChannelSize), prefixLen: prefixLen, conn: conn, + sessionKey: sessionKey, df: df} } -func (ne *NaClEncryptor) Bytes() []byte { - plaintext := ne.NonEncryptor.Bytes() +func (ne *NaClEncryptor) Bytes() ([]byte, error) { + plaintext, err := ne.NonEncryptor.Bytes() + if err != nil { + return nil, err + } offsetFlags := ne.offset // We carry the DF flag in the (unencrypted portion of the) // payload, rather than just extracting it from the packet headers @@ -206,8 +210,7 @@ func (ne *NaClEncryptor) Bytes() []byte { if nonce == nil { freshNonce, encodedNonce, err := EncodeNonce(ne.df) if err != nil { - ne.conn.Shutdown(err) - return []byte{} + return nil, err } ne.conn.SendProtocolMsg(ProtocolMsg{ProtocolNonce, encodedNonce}) ne.nonce = freshNonce @@ -225,15 +228,14 @@ func (ne *NaClEncryptor) Bytes() []byte { } else if offset == 1<<14 { // half way through range, send new nonce nonce, encodedNonce, err := EncodeNonce(ne.df) if err != nil { - ne.conn.Shutdown(err) - return []byte{} + return nil, err } ne.nonceChan <- nonce ne.conn.SendProtocolMsg(ProtocolMsg{ProtocolNonce, encodedNonce}) } ne.offset = offset - return ciphertext + return ciphertext, nil } func (ne *NaClEncryptor) PacketOverhead() int { diff --git a/router/forwarder.go b/router/forwarder.go index 337f41a1..6c05e151 100644 --- a/router/forwarder.go +++ b/router/forwarder.go @@ -287,7 +287,11 @@ func (fwd *Forwarder) appendFrame(frame *ForwardedFrame) bool { } func (fwd *Forwarder) flush() { - err := fwd.processSendError(fwd.udpSender.Send(fwd.enc.Bytes())) + msg, err := fwd.enc.Bytes() + if err != nil { + fwd.conn.Shutdown(err) + } + err = fwd.processSendError(fwd.udpSender.Send(msg)) if err != nil && PosixError(err) != syscall.ENOBUFS { fwd.conn.Shutdown(err) }