Skip to content

Commit 597ea81

Browse files
authored
Optimize registration payload size for DNS registrar (#163)
* Stop anypb from reading type url during unmarshal * Fix test * Add tests * Check non-nil typeurl * Check err
1 parent 9ef2d51 commit 597ea81

File tree

4 files changed

+85
-4
lines changed

4 files changed

+85
-4
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package transports
2+
3+
import (
4+
"fmt"
5+
6+
"google.golang.org/protobuf/proto"
7+
"google.golang.org/protobuf/reflect/protoreflect"
8+
"google.golang.org/protobuf/types/known/anypb"
9+
)
10+
11+
// UnmarshalAnypbTo unmarshals the src anypb to dst without reading the src type url.
12+
// Used to unmarshal TransportParams in the registration message for saving space from
13+
// the type url so that the registration payload is small enough for the DNS registrar.
14+
func UnmarshalAnypbTo(src *anypb.Any, dst protoreflect.ProtoMessage) error {
15+
expected, err := anypb.New(dst)
16+
if err != nil {
17+
return fmt.Errorf("error reading src type: %v", err)
18+
}
19+
20+
if src.TypeUrl != "" && src.TypeUrl != expected.TypeUrl {
21+
return fmt.Errorf("incorrect non-empty TypeUrl: %v != %v", src.TypeUrl, expected.TypeUrl)
22+
}
23+
24+
src.TypeUrl = expected.TypeUrl
25+
return anypb.UnmarshalTo(src, dst, proto.UnmarshalOptions{})
26+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package transports_test
2+
3+
import (
4+
"math/rand"
5+
"testing"
6+
7+
"github.com/refraction-networking/conjure/application/transports"
8+
pb "github.com/refraction-networking/gotapdance/protobuf"
9+
"github.com/stretchr/testify/require"
10+
"google.golang.org/protobuf/proto"
11+
"google.golang.org/protobuf/types/known/anypb"
12+
)
13+
14+
func TestUnmarshall(t *testing.T) {
15+
src, err := anypb.New(&pb.GenericTransportParams{RandomizeDstPort: proto.Bool(true)})
16+
require.Nil(t, err)
17+
src.TypeUrl = ""
18+
19+
dst := &pb.GenericTransportParams{}
20+
err = transports.UnmarshalAnypbTo(src, dst)
21+
require.Nil(t, err)
22+
23+
require.True(t, dst.GetRandomizeDstPort())
24+
}
25+
26+
func TestMissingTypeURL(t *testing.T) {
27+
src, err := anypb.New(&pb.GenericTransportParams{RandomizeDstPort: proto.Bool(true)})
28+
require.Nil(t, err)
29+
src.TypeUrl = ""
30+
31+
dst := &pb.GenericTransportParams{}
32+
err = anypb.UnmarshalTo(src, dst, proto.UnmarshalOptions{})
33+
require.NotNil(t, err)
34+
}
35+
36+
func TestWrongType(t *testing.T) {
37+
src, err := anypb.New(&pb.ClientToStation{Padding: []byte{0, 1}})
38+
require.Nil(t, err)
39+
40+
dst := &pb.GenericTransportParams{}
41+
err = transports.UnmarshalAnypbTo(src, dst)
42+
require.NotNil(t, err)
43+
}
44+
45+
func TestGarbage(t *testing.T) {
46+
src, err := anypb.New(&pb.GenericTransportParams{RandomizeDstPort: proto.Bool(true)})
47+
require.Nil(t, err)
48+
garbagebytes, err := proto.Marshal(src)
49+
require.Nil(t, err)
50+
_, err = rand.Read(garbagebytes)
51+
require.Nil(t, err)
52+
53+
dstAnypb := &anypb.Any{}
54+
55+
err = proto.Unmarshal(garbagebytes, dstAnypb)
56+
require.NotNil(t, err)
57+
}

application/transports/wrapping/min/min.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
dd "github.com/refraction-networking/conjure/application/lib"
99
"github.com/refraction-networking/conjure/application/transports"
1010
pb "github.com/refraction-networking/gotapdance/protobuf"
11-
"google.golang.org/protobuf/proto"
1211
"google.golang.org/protobuf/types/known/anypb"
1312
)
1413

@@ -65,7 +64,7 @@ func (Transport) ParseParams(libVersion uint, data *anypb.Any) (any, error) {
6564
}
6665

6766
var m = &pb.GenericTransportParams{}
68-
err := anypb.UnmarshalTo(data, m, proto.UnmarshalOptions{})
67+
err := transports.UnmarshalAnypbTo(data, m)
6968
return m, err
7069
}
7170

application/transports/wrapping/obfs4/obfs4.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"gitlab.com/yawning/obfs4.git/common/drbg"
1313
"gitlab.com/yawning/obfs4.git/common/ntor"
1414
"gitlab.com/yawning/obfs4.git/transports/obfs4"
15-
"google.golang.org/protobuf/proto"
1615
"google.golang.org/protobuf/types/known/anypb"
1716
)
1817

@@ -62,7 +61,7 @@ func (Transport) ParseParams(libVersion uint, data *anypb.Any) (any, error) {
6261
}
6362

6463
var m = &pb.GenericTransportParams{}
65-
err := anypb.UnmarshalTo(data, m, proto.UnmarshalOptions{})
64+
err := transports.UnmarshalAnypbTo(data, m)
6665
return m, err
6766
}
6867

0 commit comments

Comments
 (0)