connserial; verify messages with CRC.
diff --git a/newtmgr/transport/conn.go b/newtmgr/transport/conn.go
index b7935ff..a774b38 100644
--- a/newtmgr/transport/conn.go
+++ b/newtmgr/transport/conn.go
@@ -59,6 +59,14 @@
return pkt.buffer.Bytes()
}
+func (pkt *Packet) TrimEnd(count int) {
+
+ if pkt.buffer.Len() < count {
+ count = pkt.buffer.Len()
+ }
+ pkt.buffer.Truncate(pkt.buffer.Len() - count)
+}
+
func NewConn(cp config.NewtmgrConnProfile) (Conn, error) {
// Based on ConnProfile, instantiate the right type of conn object, that
// implements the conn interface.
diff --git a/newtmgr/transport/connserial.go b/newtmgr/transport/connserial.go
index 5e90f80..b221e77 100644
--- a/newtmgr/transport/connserial.go
+++ b/newtmgr/transport/connserial.go
@@ -26,6 +26,7 @@
"fmt"
log "github.com/Sirupsen/logrus"
+ "github.com/joaojeronimo/go-crc16"
"github.com/tarm/serial"
"mynewt.apache.org/newt/newtmgr/config"
@@ -106,6 +107,14 @@
full := cs.currentPacket.AddBytes(data)
if full {
+ if crc16.Crc16(cs.currentPacket.GetBytes()) != 0 {
+ return nil, util.NewNewtError("CRC error")
+ }
+
+ /*
+ * Trim away the 2 bytes of CRC
+ */
+ cs.currentPacket.TrimEnd(2)
pkt := cs.currentPacket
cs.currentPacket = nil
return pkt, nil
@@ -122,10 +131,14 @@
func (cs *ConnSerial) WritePacket(pkt *Packet) error {
data := pkt.GetBytes()
- dLen := uint16(len(data))
pktData := make([]byte, 2)
+ crc := crc16.Crc16(data)
+ binary.BigEndian.PutUint16(pktData, crc)
+ data = append(data, pktData...)
+
+ dLen := uint16(len(data))
binary.BigEndian.PutUint16(pktData, dLen)
pktData = append(pktData, data...)