aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-07-26 03:56:33 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-07-26 03:56:33 +0200
commitb7e8dc4311ce2f819e46c8b377c81f19018eddf4 (patch)
tree7a71a92697c27f8bd577aa62f998ef9a1bb8526d
parent94a5055f41edd9226c4342d396fa093306ea567f (diff)
CRC
-rw-r--r--zsig/zsig.go19
1 files 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
}