Skip to content

Commit

Permalink
Merge pull request #971 from wladh/crc32castagnoli
Browse files Browse the repository at this point in the history
Add support for Castagnoli polynomial for CRC32 computation
  • Loading branch information
eapache authored Oct 25, 2017
2 parents 630b33c + 07a5840 commit 34f7aff
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 4 deletions.
36 changes: 34 additions & 2 deletions crc32_field.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,19 @@ import (
"hash/crc32"
)

type crcPolynomial int8

const (
crcIEEE crcPolynomial = iota
crcCastagnoli
)

var castagnoliTable = crc32.MakeTable(crc32.Castagnoli)

// crc32Field implements the pushEncoder and pushDecoder interfaces for calculating CRC32s.
type crc32Field struct {
startOffset int
polynomial crcPolynomial
}

func (c *crc32Field) saveOffset(in int) {
Expand All @@ -19,14 +29,24 @@ func (c *crc32Field) reserveLength() int {
return 4
}

func newCRC32Field(polynomial crcPolynomial) *crc32Field {
return &crc32Field{polynomial: polynomial}
}

func (c *crc32Field) run(curOffset int, buf []byte) error {
crc := crc32.ChecksumIEEE(buf[c.startOffset+4 : curOffset])
crc, err := c.crc(curOffset, buf)
if err != nil {
return err
}
binary.BigEndian.PutUint32(buf[c.startOffset:], crc)
return nil
}

func (c *crc32Field) check(curOffset int, buf []byte) error {
crc := crc32.ChecksumIEEE(buf[c.startOffset+4 : curOffset])
crc, err := c.crc(curOffset, buf)
if err != nil {
return err
}

expected := binary.BigEndian.Uint32(buf[c.startOffset:])
if crc != expected {
Expand All @@ -35,3 +55,15 @@ func (c *crc32Field) check(curOffset int, buf []byte) error {

return nil
}
func (c *crc32Field) crc(curOffset int, buf []byte) (uint32, error) {
var tab *crc32.Table
switch c.polynomial {
case crcIEEE:
tab = crc32.IEEETable
case crcCastagnoli:
tab = castagnoliTable
default:
return 0, PacketDecodingError{"invalid CRC type"}
}
return crc32.Checksum(buf[c.startOffset+4:curOffset], tab), nil
}
4 changes: 2 additions & 2 deletions message.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ type Message struct {
}

func (m *Message) encode(pe packetEncoder) error {
pe.push(&crc32Field{})
pe.push(newCRC32Field(crcIEEE))

pe.putInt8(m.Version)

Expand Down Expand Up @@ -112,7 +112,7 @@ func (m *Message) encode(pe packetEncoder) error {
}

func (m *Message) decode(pd packetDecoder) (err error) {
err = pd.push(&crc32Field{})
err = pd.push(newCRC32Field(crcIEEE))
if err != nil {
return err
}
Expand Down

0 comments on commit 34f7aff

Please sign in to comment.