diff --git a/glide.lock b/glide.lock index 71292ce11..4cd7c5670 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 3bcee9fbccf29d21217b24b6a83ec51e1514f37b2ae5d8718cf6c5df80f4fb2c -updated: 2017-06-19T17:16:58.037568333+02:00 +hash: c0a2db1b80c6b1b8aab31c526ce43e22e49b23c893c78b8fdb8546aa2e7b7cc6 +updated: 2017-07-22T05:24:42.82932575-04:00 imports: - name: github.com/bgentry/speakeasy version: 4aabc24848ce5fd31929f7d1e4ea74d3709c14cd @@ -38,11 +38,11 @@ imports: - name: github.com/gorilla/context version: 08b5f424b9271eedf6f9f0ce86cb9396ed337a42 - name: github.com/gorilla/handlers - version: 3a5767ca75ece5f7f1440b1d16975247f8d8b221 + version: a4043c62cc2329bacda331d33fc908ab11ef0ec3 - name: github.com/gorilla/mux - version: 392c28fe23e1c45ddba891b0320b3b5df220beea + version: bcd8bc72b08df0f70df986b97f95590779502d31 - name: github.com/hashicorp/hcl - version: a4b07c25de5ff55ad3b8936cea69a79a3d95a855 + version: 392dba7d905ed5d04a5794ba89f558b27e2ba1ca subpackages: - hcl/ast - hcl/parser @@ -52,6 +52,8 @@ imports: - json/parser - json/scanner - json/token +- name: github.com/howeyc/crc16 + version: 58da63c846043d0bea709c8d47039df06577d6d9 - name: github.com/inconshreveable/mousetrap version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 - name: github.com/kr/logfmt @@ -67,7 +69,7 @@ imports: - name: github.com/pelletier/go-toml version: 13d49d4606eb801b8f01ae542b4afc4c6ee3d84a - name: github.com/pkg/errors - version: ff09b135c25aae272398c51a07235b90a75aa4f0 + version: 645ef00459ed84a119197bfb8d8205042c6df63d - name: github.com/spf13/afero version: 9be650865eab0c12963d8753212f4f9c66cdcf12 subpackages: @@ -75,11 +77,11 @@ imports: - name: github.com/spf13/cast version: acbeb36b902d72a7a4c18e8f3241075e7ab763e4 - name: github.com/spf13/cobra - version: db6b9a8b3f3f400c8ecb4a4d7d02245b8facad66 + version: 4cdb38c072b86bf795d2c81de50784d9fdd6eb77 - name: github.com/spf13/jwalterweatherman - version: fa7ca7e836cf3a8bb4ebf799f472c12d7e903d66 + version: 8f07c835e5cc1450c082fe3a439cf87b0cbb2d99 - name: github.com/spf13/pflag - version: 80fe0fb4eba54167e2ccae1c6c950e72abf61b73 + version: e57e3eeb33f795204c1ca35f56c44f83227c6e66 - name: github.com/spf13/viper version: 0967fc9aceab2ce9da34061253ac10fb99bba5b2 - name: github.com/tendermint/ed25519 @@ -93,7 +95,7 @@ imports: - data - data/base58 - name: github.com/tendermint/tmlibs - version: bd9d0d1637dadf1330e167189d5e5031aadcda6f + version: 2f6f3e6aa70bb19b70a6e73210273fa127041070 subpackages: - cli - common @@ -111,7 +113,7 @@ imports: - ripemd160 - salsa20/salsa - name: golang.org/x/sys - version: 9ccfe848b9db8435a24c424abbc07a921adf1df5 + version: e62c3de784db939836898e5c19ffd41bece347da subpackages: - unix - name: golang.org/x/text diff --git a/glide.yaml b/glide.yaml index 58e3aecca..a99d3b63f 100644 --- a/glide.yaml +++ b/glide.yaml @@ -29,6 +29,7 @@ import: - package: github.com/spf13/cobra - package: github.com/spf13/viper - package: gopkg.in/go-playground/validator.v9 +- package: github.com/howeyc/crc16 testImport: - package: github.com/mndrix/btcutil - package: github.com/stretchr/testify diff --git a/keys/ecc.go b/keys/ecc.go index 96590cd91..b94bf1fb9 100644 --- a/keys/ecc.go +++ b/keys/ecc.go @@ -5,6 +5,8 @@ import ( "errors" "hash/crc32" "hash/crc64" + + "github.com/howeyc/crc16" ) // ECC is used for anything that calculates an error-correcting code @@ -26,6 +28,67 @@ var _ ECC = NoECC{} func (_ NoECC) AddECC(input []byte) []byte { return input } func (_ NoECC) CheckECC(input []byte) ([]byte, error) { return input, nil } +// CRC16 does the ieee crc16 polynomial check +type CRC16 struct { + Poly uint16 + table *crc16.Table +} + +var _ ECC = &CRC16{} + +const crc16Size = 2 + +func NewIBMCRC16() *CRC16 { + return &CRC16{Poly: crc16.IBM} +} + +func NewSCSICRC16() *CRC16 { + return &CRC16{Poly: crc16.SCSI} +} + +func NewCCITTCRC16() *CRC16 { + return &CRC16{Poly: crc16.CCITT} +} + +func (c *CRC16) AddECC(input []byte) []byte { + table := c.getTable() + + // get crc and convert to some bytes... + crc := crc16.Checksum(input, table) + check := make([]byte, crc16Size) + binary.BigEndian.PutUint16(check, crc) + + // append it to the input + output := append(input, check...) + return output +} + +func (c *CRC16) CheckECC(input []byte) ([]byte, error) { + table := c.getTable() + + if len(input) <= crc16Size { + return nil, errors.New("input too short, no checksum present") + } + cut := len(input) - crc16Size + data, check := input[:cut], input[cut:] + crc := binary.BigEndian.Uint16(check) + calc := crc16.Checksum(data, table) + if crc != calc { + return nil, errors.New("Checksum does not match") + } + return data, nil +} + +func (c *CRC16) getTable() *crc16.Table { + if c.table == nil { + if c.Poly == 0 { + c.Poly = crc16.IBM + } + c.table = crc16.MakeTable(c.Poly) + } + return c.table +} + // CRC32 does the ieee crc32 polynomial check type CRC32 struct { Poly uint32 diff --git a/keys/ecc_test.go b/keys/ecc_test.go index 334c49423..930422b98 100644 --- a/keys/ecc_test.go +++ b/keys/ecc_test.go @@ -14,6 +14,9 @@ func TestECCPasses(t *testing.T) { checks := []ECC{ NoECC{}, + NewIBMCRC16(), + NewSCSICRC16(), + NewCCITTCRC16(), NewIEEECRC32(), NewCastagnoliCRC32(), NewKoopmanCRC32(), @@ -40,6 +43,9 @@ func TestECCFails(t *testing.T) { assert := assert.New(t) checks := []ECC{ + NewIBMCRC16(), + NewSCSICRC16(), + NewCCITTCRC16(), NewIEEECRC32(), NewCastagnoliCRC32(), NewKoopmanCRC32(),