Browse Source

Improve crc32

pull/1782/head
Ethan Frey 8 years ago
parent
commit
ce6b08761e
2 changed files with 29 additions and 11 deletions
  1. +26
    -9
      keys/ecc.go
  2. +3
    -2
      keys/ecc_test.go

+ 26
- 9
keys/ecc.go View File

@ -26,14 +26,19 @@ func (_ NoECC) AddECC(input []byte) []byte { return input }
func (_ NoECC) CheckECC(input []byte) ([]byte, error) { return input, nil } func (_ NoECC) CheckECC(input []byte) ([]byte, error) { return input, nil }
// CRC32 does the ieee crc32 polynomial check // CRC32 does the ieee crc32 polynomial check
type CRC32 struct{}
type CRC32 struct {
Poly uint32
table *crc32.Table
}
var _ ECC = &CRC32{}
var _ ECC = CRC32{}
func (c *CRC32) AddECC(input []byte) []byte {
table := c.getTable()
func (_ CRC32) AddECC(input []byte) []byte {
// get crc and convert to some bytes... // get crc and convert to some bytes...
crc := crc32.ChecksumIEEE(input)
check := make([]byte, 4)
crc := crc32.Checksum(input, table)
check := make([]byte, crc32.Size)
binary.BigEndian.PutUint32(check, crc) binary.BigEndian.PutUint32(check, crc)
// append it to the input // append it to the input
@ -41,16 +46,28 @@ func (_ CRC32) AddECC(input []byte) []byte {
return output return output
} }
func (_ CRC32) CheckECC(input []byte) ([]byte, error) {
if len(input) <= 4 {
func (c *CRC32) CheckECC(input []byte) ([]byte, error) {
table := c.getTable()
if len(input) <= crc32.Size {
return nil, errors.New("input too short, no checksum present") return nil, errors.New("input too short, no checksum present")
} }
cut := len(input) - 4
cut := len(input) - crc32.Size
data, check := input[:cut], input[cut:] data, check := input[:cut], input[cut:]
crc := binary.BigEndian.Uint32(check) crc := binary.BigEndian.Uint32(check)
calc := crc32.ChecksumIEEE(data)
calc := crc32.Checksum(data, table)
if crc != calc { if crc != calc {
return nil, errors.New("Checksum does not match") return nil, errors.New("Checksum does not match")
} }
return data, nil return data, nil
} }
func (c *CRC32) getTable() *crc32.Table {
if c.table == nil {
if c.Poly == 0 {
c.Poly = crc32.IEEE
}
c.table = crc32.MakeTable(c.Poly)
}
return c.table
}

+ 3
- 2
keys/ecc_test.go View File

@ -1,6 +1,7 @@
package keys package keys
import ( import (
"hash/crc32"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -12,7 +13,7 @@ import (
func TestECCPasses(t *testing.T) { func TestECCPasses(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
checks := []ECC{NoECC{}, CRC32{}}
checks := []ECC{NoECC{}, &CRC32{}, &CRC32{Poly: crc32.Castagnoli}}
for _, check := range checks { for _, check := range checks {
for i := 0; i < 2000; i++ { for i := 0; i < 2000; i++ {
@ -32,7 +33,7 @@ func TestECCPasses(t *testing.T) {
func TestECCFails(t *testing.T) { func TestECCFails(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
checks := []ECC{CRC32{}}
checks := []ECC{&CRC32{}, &CRC32{Poly: crc32.Castagnoli}}
attempts := 2000 attempts := 2000


Loading…
Cancel
Save