Browse Source

fixed bug: Read deobfuscated the entire read buffer instead of just the bytes read

Rod Hynes 11 years ago
parent
commit
b9435d56a8
1 changed files with 6 additions and 11 deletions
  1. 6 11
      psiphon/obfuscatedSshConn.go

+ 6 - 11
psiphon/obfuscatedSshConn.go

@@ -22,7 +22,6 @@ package psiphon
 import (
 	"bytes"
 	"encoding/binary"
-	"errors"
 	"io"
 	"net"
 )
@@ -78,7 +77,7 @@ func (conn *ObfuscatedSshConn) Read(buffer []byte) (n int, err error) {
 	} else {
 		n, err = conn.Conn.Read(buffer)
 		if conn.state != OBFUSCATION_STATE_FINISHED {
-			conn.obfuscator.ObfuscateServerToClient(buffer)
+			conn.obfuscator.ObfuscateServerToClient(buffer[:n])
 		}
 	}
 	return
@@ -126,6 +125,7 @@ func (conn *ObfuscatedSshConn) readServerIdentification(buffer []byte) (n int, e
 	if conn.serverIdentificationBuffer == nil {
 		for {
 			conn.serverIdentificationBuffer = make([]byte, 0, 512)
+			// TODO: use bufio.Reader?
 			var readBuffer [1]byte
 			var validLine = false
 			for len(conn.serverIdentificationBuffer) < cap(conn.serverIdentificationBuffer) {
@@ -204,22 +204,17 @@ func (conn *ObfuscatedSshConn) updateState(buffer []byte) (err error) {
 		const PREFIX_LENGTH = 5 // uint32 + byte
 		for len(conn.clientMessageBuffer) >= PREFIX_LENGTH {
 			// This parsing repeats for a single packet sent over multiple Write() calls
-			var packetLength uint32
-			reader := bytes.NewReader(conn.clientMessageBuffer)
-			err = binary.Read(reader, binary.BigEndian, &packetLength)
-			if err != nil {
-				return err
-			}
 			// TODO: handle malformed packet [lengths]
-			paddingLength := conn.clientMessageBuffer[PREFIX_LENGTH-1]
+			packetLength := binary.BigEndian.Uint32(conn.clientMessageBuffer[0:4])
+			paddingLength := uint32(conn.clientMessageBuffer[PREFIX_LENGTH-1])
 			payloadLength := packetLength - uint32(paddingLength) - 1
 			messageLength := PREFIX_LENGTH + packetLength - 1
 			if uint32(len(conn.clientMessageBuffer)) < messageLength {
 				break
 			}
 			if payloadLength > 1 {
-				packetType := conn.clientMessageBuffer[PREFIX_LENGTH]
-				if int(packetType) == SSH_MSG_NEWKEYS {
+				packetType := uint32(conn.clientMessageBuffer[PREFIX_LENGTH])
+				if packetType == SSH_MSG_NEWKEYS {
 					conn.state = OBFUSCATION_STATE_FINISHED
 					conn.clientMessageBuffer = nil
 					break