uuuuuuuuuuuuuuuuuuuuuuuuuuuuugh"

Change-Id: I5567ec3b708a28f35e807407afdaec0795f9a77e
diff --git a/examples/secure-tcp/client/.client.go.swp b/examples/secure-tcp/client/.client.go.swp
index 1fd0ba4..3fb46c7 100644
--- a/examples/secure-tcp/client/.client.go.swp
+++ b/examples/secure-tcp/client/.client.go.swp
Binary files differ
diff --git a/examples/secure-tcp/client/client.go b/examples/secure-tcp/client/client.go
index 4fb6f99..9ef9d98 100644
--- a/examples/secure-tcp/client/client.go
+++ b/examples/secure-tcp/client/client.go
@@ -29,4 +29,10 @@
 	fmt.Fprintf(conn, "Hello.")
 	status, err := bufio.NewReader(conn).ReadString('\n')
 	log.Printf("Client received: %s\n", status)
+
+	time.Sleep(5 * time.Second)
+
+	fmt.Fprintf(conn, "World.")
+	status, err = bufio.NewReader(conn).ReadString('\n')
+	log.Printf("Client received: %s\n", status)
 }
diff --git a/examples/secure-tcp/server/.server.go.swp b/examples/secure-tcp/server/.server.go.swp
index 12e89fb..bfec12f 100644
--- a/examples/secure-tcp/server/.server.go.swp
+++ b/examples/secure-tcp/server/.server.go.swp
Binary files differ
diff --git a/examples/secure-tcp/server/server.go b/examples/secure-tcp/server/server.go
index db23317..3989888 100644
--- a/examples/secure-tcp/server/server.go
+++ b/examples/secure-tcp/server/server.go
@@ -33,5 +33,9 @@
 		status, err := bufio.NewReader(conn).ReadString('.')
 		// log.Printf("Server received: %s\n", status)
 		fmt.Fprintf(conn, "I heard: '%s'\n", status)
+
+		status, err = bufio.NewReader(conn).ReadString('.')
+		// log.Printf("Server received: %s\n", status)
+		fmt.Fprintf(conn, "I heard: '%s'\n", status)
 	}
 }
diff --git a/runtime/internal/flow/conn/grpc/conn.go b/runtime/internal/flow/conn/grpc/conn.go
index 28834f8..67a1f6e 100644
--- a/runtime/internal/flow/conn/grpc/conn.go
+++ b/runtime/internal/flow/conn/grpc/conn.go
@@ -39,31 +39,41 @@
 	mu        sync.Mutex
 }
 
+// TODO: what if bytesRead < 3? = 3?
 func (c *conn) Read(b []byte) (n int, err error) {
 	c.mu.Lock()
 	defer c.mu.Unlock()
 	log.Printf("Beginning to Read.\n")
-	resBuf := make([]byte, 4096*4096) // TODO better (dynamic) size or way of reading?
 
+	frame := [3]byte{}
+	frameCopied, err := c.rawConn.Read(frame[:])
+	if frameCopied != 3 {
+		return -1, errors.New("Did not copy 3 frame bytes.")
+	}
+	msgSize := read3ByteUint(frame)
+
+	resBuf := make([]byte, msgSize) // TODO better (dynamic) size or way of reading?
 	bytesRead, err := c.rawConn.Read(resBuf)
-	log.Printf("Read %d bytes: %v\n", bytesRead, resBuf[:bytesRead])
+	// log.Printf("Read %d bytes: %v\n", bytesRead, resBuf)
 	if err != nil {
-		log.Printf("Failed to read.\n")
+		// log.Printf("Failed to read.\n")
 		log.Fatal(err)
 		return bytesRead, err
 	}
 
 	// tmp := make([]byte, 0, bytesRead-box.Overhead) // TODO: is this enough? Also, why do we need both of tmp and out?
-	out, ok := box.OpenAfterPrecomputation(nil, resBuf[:bytesRead], c.currentNonce(), c.sharedKey)
+	out, ok := box.OpenAfterPrecomputation(nil, resBuf, c.currentNonce(), c.sharedKey)
+	log.Printf("%d bytes after opening: %v\n", len(out), out)
+	log.Printf("%d bytes after opening: %v\n", len(out), string(out))
 	c.advanceNonce() // TODO: defer? Is there harm in advancing often than necessary (i.e. on error)?
 	if !ok {
-		log.Printf("Failed to decrypt.\n")
+		// log.Printf("Failed to decrypt.\n")
 		//log.Fatal(err)
 		return 0, err
 	}
 	copy(b, out)
 	// should we return bytesRead or len(b)?
-	log.Printf("cap(b): %d, len(b) %d, \ncap(out): %d, len(out): %d\n", cap(b), len(b), cap(out), len(out))
+	// log.Printf("cap(b): %d, len(b) %d, \ncap(out): %d, len(out): %d\n", cap(b), len(b), cap(out), len(out))
 	log.Printf("Succeeded in reading.\n\n")
 	// return bytesRead, nil
 	return len(b), nil
@@ -75,20 +85,18 @@
 	c.mu.Lock()
 	defer c.mu.Unlock()
 	log.Printf("Beginning to write.\n")
+	log.Printf("%d bytes before sealing: %v\n", len(b), b)
 	tmp := make([]byte, 3, 3+len(b)+box.Overhead) // TODO: is this enough? Also, why do we need both of tmp and out?
-	tmp[0] = 5
-	tmp[1] = 7
-	tmp[2] = 14
+	err = write3ByteUint(tmp[:3], len(b)+box.Overhead)
+	if err != nil {
+		return -1, err
+	}
 	out := box.SealAfterPrecomputation(tmp, b, c.currentNonce(), c.sharedKey)
-	log.Printf("tmp: %v", tmp)
-	log.Printf("out: %v", out)
-	log.Printf("tmp[0]: %p", &tmp[0])
-	log.Printf("tmp[1]: %p", &tmp[1])
-	log.Printf("tmp[2]: %p", &tmp[2])
-	log.Printf("out[0]: %p", &out[0])
+	// log.Printf("tmp: %v", tmp)
+	// log.Printf("out: %v", out)
 	c.advanceNonce()
 	bytesCopied, err := io.Copy(c.rawConn, bytes.NewReader(out))
-	log.Printf("Wrote %d bytes.\n", bytesCopied)
+	// log.Printf("Wrote %d bytes.\n", bytesCopied)
 	if err != nil {
 		log.Printf("Failed to copy to rawConn.\n")
 		log.Fatal(err)
@@ -101,7 +109,7 @@
 		log.Fatal(err)
 		return -1, errors.New(errMsg)
 	}
-	log.Printf("cap(b): %d, len(b) %d, cap(out): %d, len(out): %d\n", cap(b), len(b), cap(out), len(out))
+	// log.Printf("cap(b): %d, len(b) %d, cap(out): %d, len(out): %d\n", cap(b), len(b), cap(out), len(out))
 	log.Printf("Succeeded in writing!\n\n")
 	// return int(bytesCopied), nil
 	return len(b), nil