From 1779291586f5a12517345e94c0efc8aa343d45c1 Mon Sep 17 00:00:00 2001 From: Justin Hawkins Date: Fri, 14 Jan 2022 09:21:57 +1030 Subject: [PATCH] Fix the way I was using the buffer --- secure/secure.go | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/secure/secure.go b/secure/secure.go index 84fa0f6..2209432 100644 --- a/secure/secure.go +++ b/secure/secure.go @@ -86,18 +86,26 @@ func (s *SecureConnection) Read(p []byte) (int, error) { actualPacketEnd := DeterminePacketSize(s.Buffer.Bytes()) if actualPacketEnd == 0 { - // log.Printf("packet too small?") break - return 0, io.EOF } + // our buffer contains a partial packet if int(actualPacketEnd) > len(s.Buffer.Bytes()) { - // we must have half a packet - // log.Print("partial packet detected") break } - secureMessage := ConstructSecureMessage(s.Buffer.Bytes()[:actualPacketEnd]) + encryptedBytes := make([]byte, actualPacketEnd) + n, err := s.Buffer.Read(encryptedBytes) + if err != nil && err != io.EOF { + log.Printf("failed to get encrypted bytes from buffer?") + return 0, errors.New("failed to get encrypted bytes from buffer") + } + if n != int(actualPacketEnd) { + log.Printf("failed to get right number of encrypted bytes from buffer") + return 0, errors.New("failed to get right number of encrypted bytes from buffer") + + } + secureMessage := ConstructSecureMessage(encryptedBytes) // log.Printf("Secure message from wire bytes: \n nonce: %v\n msg: %v\n size: %d\n", secureMessage.Nonce, secureMessage.Msg, secureMessage.Size) decryptedMessage, ok := box.OpenAfterPrecomputation(nil, secureMessage.Msg, &secureMessage.Nonce, s.SharedKey) @@ -107,13 +115,6 @@ func (s *SecureConnection) Read(p []byte) (int, error) { outputBytes = append(outputBytes, decryptedMessage...) - // log.Printf("OUT now: %d bytes", len(outputBytes)) - // copy(p, decryptedMessage) - - // trim what we used off the buffer - newBuffer := s.Buffer.Bytes()[actualPacketEnd:] - s.Buffer = bytes.NewBuffer(newBuffer) - if eof && s.Buffer.Len() == 0 { log.Printf("returning the final packet") break