diff --git a/mshal/ms213x/csum.go b/mshal/ms213x/csum.go new file mode 100644 index 0000000..c3a8a16 --- /dev/null +++ b/mshal/ms213x/csum.go @@ -0,0 +1,42 @@ +package ms213x + +import ( + "encoding/binary" + "errors" + "fmt" +) + +func calcSum(f []byte) uint16 { + var csum uint16 + for _, m := range f { + csum += uint16(m) + } + return csum +} + +func CheckImage(f []byte) error { + if len(f) < 0x30+4 { + return errors.New("file too short (hdr)") + } + + if t := binary.BigEndian.Uint16(f); t != 0x5aa5 && t != 0x6996 && t != 0x3cc3 { + return fmt.Errorf("unknown flash type: %x", t) + } + + codeLen := int(binary.BigEndian.Uint16(f[2:])) + end := 0x30 + codeLen + if len(f) < end+4 { + return errors.New("file too short (code)") + } + + hdrSum := calcSum(f[2:12]) + calcSum(f[16:0x30]) + codeSum := calcSum(f[0x30:end]) + + if hdrImg := binary.BigEndian.Uint16(f[end:]); hdrSum != hdrImg { + return fmt.Errorf("header checksum mismatch: %x != %x", hdrSum, hdrImg) + } else if codeImg := binary.BigEndian.Uint16(f[end+2:]); codeSum != codeImg { + return fmt.Errorf("code checksum mismatch: %x != %x", codeSum, codeImg) + } + + return nil +}