mirror of
https://github.com/fluencelabs/tendermint
synced 2025-06-13 05:11:21 +00:00
Add crc16 support
This commit is contained in:
24
glide.lock
generated
24
glide.lock
generated
@ -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
|
||||
|
@ -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
|
||||
|
63
keys/ecc.go
63
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
|
||||
|
@ -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(),
|
||||
|
Reference in New Issue
Block a user