diff --git a/chain/address/address.go b/chain/address/address.go index 07ff47851..56a64f4eb 100644 --- a/chain/address/address.go +++ b/chain/address/address.go @@ -8,9 +8,9 @@ import ( "strconv" "github.com/filecoin-project/go-bls-sigs" - "github.com/filecoin-project/go-leb128" cbor "github.com/ipfs/go-ipld-cbor" "github.com/minio/blake2b-simd" + "github.com/multiformats/go-varint" "github.com/polydawn/refmt/obj/atlas" "golang.org/x/xerrors" @@ -166,7 +166,7 @@ func (a *Address) Scan(value interface{}) error { // NewIDAddress returns an address using the ID protocol. func NewIDAddress(id uint64) (Address, error) { - return newAddress(ID, leb128.FromUInt64(id)) + return newAddress(ID, varint.ToUvarint(id)) } // NewSecp256k1Address returns an address using the SECP256K1 protocol. @@ -218,6 +218,14 @@ func addressHash(ingest []byte) []byte { func newAddress(protocol Protocol, payload []byte) (Address, error) { switch protocol { case ID: + _, n, err := varint.FromUvarint(payload) + if err != nil { + return Undef, xerrors.Errorf("could not decode: %v: %w", err, ErrInvalidPayload) + } + if n != len(payload) { + return Undef, xerrors.Errorf("different varint length (v:%d != p:%d): %w", + n, len(payload), ErrInvalidPayload) + } case SECP256K1, Actor: if len(payload) != PayloadHashLength { return Undef, ErrInvalidPayload @@ -258,7 +266,14 @@ func encode(network Network, addr Address) (string, error) { cksm := Checksum(append([]byte{addr.Protocol()}, addr.Payload()...)) strAddr = ntwk + fmt.Sprintf("%d", addr.Protocol()) + AddressEncoding.WithPadding(-1).EncodeToString(append(addr.Payload(), cksm[:]...)) case ID: - strAddr = ntwk + fmt.Sprintf("%d", addr.Protocol()) + fmt.Sprintf("%d", leb128.ToUInt64(addr.Payload())) + i, n, err := varint.FromUvarint(addr.Payload()) + if err != nil { + return UndefAddressString, xerrors.Errorf("could not decode varint: %w", err) + } + if n != len(addr.Payload()) { + return UndefAddressString, xerrors.Errorf("payload contains additional bytes") + } + strAddr = fmt.Sprintf("%s%d%d", ntwk, addr.Protocol(), i) default: return UndefAddressString, ErrUnknownProtocol } @@ -304,7 +319,7 @@ func decode(a string) (Address, error) { if err != nil { return Undef, ErrInvalidPayload } - return newAddress(protocol, leb128.FromUInt64(id)) + return newAddress(protocol, varint.ToUvarint(id)) } payloadcksm, err := AddressEncoding.WithPadding(-1).DecodeString(raw) diff --git a/chain/address/address_test.go b/chain/address/address_test.go index 1c666ee7c..3ca351a8d 100644 --- a/chain/address/address_test.go +++ b/chain/address/address_test.go @@ -11,7 +11,7 @@ import ( "time" "github.com/filecoin-project/go-bls-sigs" - "github.com/filecoin-project/go-leb128" + "github.com/multiformats/go-varint" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -94,7 +94,9 @@ func TestVectorsIDAddress(t *testing.T) { maybeAddr, err := NewFromString(tc.expected) assert.NoError(err) assert.Equal(ID, maybeAddr.Protocol()) - assert.Equal(tc.input, leb128.ToUInt64(maybeAddr.Payload())) + id, _, err := varint.FromUvarint(maybeAddr.Payload()) + assert.NoError(err) + assert.Equal(tc.input, id) // Round trip to and from bytes maybeAddrBytes, err := NewFromBytes(maybeAddr.Bytes()) @@ -532,3 +534,9 @@ func BenchmarkCborUnmarshal(b *testing.B) { } } } + +func TestIDEdgeCase(t *testing.T) { + a, err := NewFromBytes([]byte{0, 0x80}) + _ = a.String() + assert.Error(t, err) +} diff --git a/go.mod b/go.mod index 6c3377878..349ee3900 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,6 @@ require ( github.com/filecoin-project/chain-validation v0.0.0-20191106200742-11986803c0f7 github.com/filecoin-project/go-amt-ipld v0.0.0-20190919045431-3650716fff16 github.com/filecoin-project/go-bls-sigs v0.0.0-20190718224239-4bc4b8a7bbf8 - github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543 github.com/filecoin-project/go-sectorbuilder v0.0.0-00010101000000-000000000000 github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 github.com/go-ole/go-ole v1.2.4 // indirect @@ -71,7 +70,6 @@ require ( github.com/mattn/go-isatty v0.0.9 // indirect github.com/mattn/go-runewidth v0.0.4 // indirect github.com/mattn/go-sqlite3 v1.12.0 - github.com/miekg/dns v1.1.16 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/minio/sha256-simd v0.1.1 github.com/mitchellh/go-homedir v1.1.0 @@ -80,6 +78,7 @@ require ( github.com/multiformats/go-multiaddr-dns v0.2.0 github.com/multiformats/go-multiaddr-net v0.1.0 github.com/multiformats/go-multihash v0.0.9 + github.com/multiformats/go-varint v0.0.1 github.com/onsi/ginkgo v1.9.0 // indirect github.com/onsi/gomega v1.6.0 // indirect github.com/opentracing/opentracing-go v1.1.0 diff --git a/go.sum b/go.sum index 25d5744af..cad68d76c 100644 --- a/go.sum +++ b/go.sum @@ -450,8 +450,6 @@ github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsO github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.16 h1:iMEQ/IVHxPTtx2Q07JP/k4CKRvSjiAZjZ0hnhgYEDmE= -github.com/miekg/dns v1.1.16/go.mod h1:YNV562EiewvSmpCB6/W4c6yqjK7Z+M/aIS1JHsIVeg8= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= @@ -499,6 +497,8 @@ github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/multiformats/go-varint v0.0.1 h1:TR/0rdQtnNxuN2IhiB639xC3tWM4IUi7DkTBVTdGW/M= +github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= @@ -628,7 +628,6 @@ go4.org v0.0.0-20190313082347-94abd6928b1d h1:JkRdGP3zvTtTbabWSAC6n67ka30y7gOzWA go4.org v0.0.0-20190313082347-94abd6928b1d/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181001203147-e3636079e1a4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -651,7 +650,6 @@ golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180926154720-4dfa2610cdf3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -678,7 +676,6 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180928133829-e4b3c5e90611/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=