From b7e8dc4311ce2f819e46c8b377c81f19018eddf4 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 26 Jul 2017 03:56:33 +0200 Subject: CRC --- zsig/zsig.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/zsig/zsig.go b/zsig/zsig.go index 5dd4aab..2eadb96 100644 --- a/zsig/zsig.go +++ b/zsig/zsig.go @@ -4,6 +4,7 @@ import ( "bufio" "encoding/binary" "errors" + "hash" "hash/crc32" "io" "time" @@ -26,13 +27,14 @@ const ( var fake = []byte{gzipID1, gzipID2, gzipDeflate, flagComment, 0, 0, 0, 0, 0, osUnix} type Reader struct { + *bufio.Reader Comment string Extra []byte ModTime time.Time Name string OS byte - Digest uint32 // CRC32 IEEE - *bufio.Reader + CRC uint16 + h hash.Hash32 } func noEOF(err error) error { @@ -65,17 +67,18 @@ func (z *Reader) readHeader() error { z.ModTime = time.Unix(int64(t), 0) } z.OS = buf[9] - z.Digest = crc32.ChecksumIEEE(buf[:10]) + z.h = crc32.NewIEEE() + z.h.Write(buf[:10]) // init CRC if flg&flagExtra != 0 { if _, err := io.ReadFull(z, buf[:2]); err != nil { return noEOF(err) } - z.Digest = crc32.Update(z.Digest, crc32.IEEETable, buf[:2]) + z.h.Write(buf[:2]) // update CRC data := make([]byte, le.Uint16(buf[:2])) if _, err := io.ReadFull(z, data); err != nil { return noEOF(err) } - z.Digest = crc32.Update(z.Digest, crc32.IEEETable, data) + z.h.Write(data) // update CRC z.Extra = data } if flg&flagName != 0 { @@ -96,8 +99,9 @@ func (z *Reader) readHeader() error { if _, err := io.ReadFull(z, buf[:2]); err != nil { return noEOF(err) } - digest := le.Uint16(buf[:2]) - if digest != uint16(z.Digest) { + z.CRC = le.Uint16(buf[:2]) + crc := uint16(z.h.Sum32()) + if z.CRC != crc { return ErrHeader } } @@ -109,6 +113,7 @@ func (z *Reader) readString() (string, error) { if err != nil { return "", err } + io.WriteString(z.h, s) // update CRC if l := len(s); l > 0 && s[l-1] == 0 { s = s[:l-1] // strip last zero } -- cgit v1.2.3