From 4935585998d53e36d6b72b2c764143c77874e179 Mon Sep 17 00:00:00 2001 From: jmwample Date: Wed, 4 Oct 2023 16:25:20 -0600 Subject: [PATCH 01/10] first pass on port randomization fixes --- pkg/core/interfaces/interfaces.go | 2 +- pkg/regserver/regprocessor/regprocessor.go | 12 ++++-------- pkg/transports/connecting/dtls/client.go | 5 ++++- pkg/transports/wrapping/min/client.go | 4 ++-- pkg/transports/wrapping/obfs4/client.go | 4 ++-- pkg/transports/wrapping/prefix/client.go | 10 ++++++++-- pkg/transports/wrapping/prefix/prefix_test.go | 4 ++-- 7 files changed, 23 insertions(+), 18 deletions(-) diff --git a/pkg/core/interfaces/interfaces.go b/pkg/core/interfaces/interfaces.go index f086d86c..27b1f5a7 100644 --- a/pkg/core/interfaces/interfaces.go +++ b/pkg/core/interfaces/interfaces.go @@ -44,7 +44,7 @@ type Transport interface { Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error // GetDstPort returns the destination port that the client should open the phantom connection with. - GetDstPort(seed []byte) (uint16, error) + GetDstPort(seed []byte, randomizeDstPorSupported bool) (uint16, error) // PrepareKeys provides an opportunity for the transport to integrate the station public key // as well as bytes from the deterministic random generator associated with the registration diff --git a/pkg/regserver/regprocessor/regprocessor.go b/pkg/regserver/regprocessor/regprocessor.go index 1926a521..4d03228d 100644 --- a/pkg/regserver/regprocessor/regprocessor.go +++ b/pkg/regserver/regprocessor/regprocessor.go @@ -276,7 +276,7 @@ func (p *RegProcessor) processBdReq(c2sPayload *pb.C2SWrapper) (*pb.Registration return nil, ErrRegProcessFailed } - phantomSubnetSupportsRandPort := false + phantomSubnetSupportsRandPort := true if c2s.GetV4Support() { p.selectorMutex.RLock() defer p.selectorMutex.RUnlock() @@ -310,7 +310,7 @@ func (p *RegProcessor) processBdReq(c2sPayload *pb.C2SWrapper) (*pb.Registration } regResp.Ipv6Addr = *phantom6.IP - phantomSubnetSupportsRandPort = phantom6.SupportsPortRand + phantomSubnetSupportsRandPort = phantomSubnetSupportsRandPort && phantom6.SupportsPortRand } transportType := c2s.GetTransport() @@ -333,13 +333,9 @@ func (p *RegProcessor) processBdReq(c2sPayload *pb.C2SWrapper) (*pb.Registration // we have to cast to uint32 because protobuf using varint for all int / uint types and doesn't // have an outward facing uint16 type. - - port := uint32(dstPort) - regResp.DstPort = &port + regResp.DstPort = proto.Uint32(uint32(dstPort)) } else { - port := uint32(443) - regResp.DstPort = &port - + regResp.DstPort = proto.Uint32(443) } // Overrides will modify the C2SWrapper and put the updated registrationResponse inside to be diff --git a/pkg/transports/connecting/dtls/client.go b/pkg/transports/connecting/dtls/client.go index 0c0fe428..88d1a68a 100644 --- a/pkg/transports/connecting/dtls/client.go +++ b/pkg/transports/connecting/dtls/client.go @@ -158,7 +158,10 @@ func (*ClientTransport) DisableRegDelay() bool { } // GetDstPort returns the destination port that the client should open the phantom connection to -func (t *ClientTransport) GetDstPort(seed []byte) (uint16, error) { +func (t *ClientTransport) GetDstPort(seed []byte, phantomSubnetSupportsRandPort bool) (uint16, error) { + if !phantomSubnetSupportsRandPort { + return 443, nil + } return transports.PortSelectorRange(portRangeMin, portRangeMax, seed) } diff --git a/pkg/transports/wrapping/min/client.go b/pkg/transports/wrapping/min/client.go index 2cd42d22..8ffdf993 100644 --- a/pkg/transports/wrapping/min/client.go +++ b/pkg/transports/wrapping/min/client.go @@ -78,8 +78,8 @@ func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { } // GetDstPort returns the destination port that the client should open the phantom connection to -func (t *ClientTransport) GetDstPort(seed []byte) (uint16, error) { - if t.Parameters == nil || !t.Parameters.GetRandomizeDstPort() { +func (t *ClientTransport) GetDstPort(seed []byte, phantomSubnetSupportsRandPort bool) (uint16, error) { + if t.Parameters == nil || !t.Parameters.GetRandomizeDstPort() || !phantomSubnetSupportsRandPort { return 443, nil } diff --git a/pkg/transports/wrapping/obfs4/client.go b/pkg/transports/wrapping/obfs4/client.go index b1b0709d..58956c95 100644 --- a/pkg/transports/wrapping/obfs4/client.go +++ b/pkg/transports/wrapping/obfs4/client.go @@ -78,8 +78,8 @@ func (t ClientTransport) ParseParams(data *anypb.Any) (any, error) { } // GetDstPort returns the destination port that the client should open the phantom connection to -func (t *ClientTransport) GetDstPort(seed []byte) (uint16, error) { - if t.Parameters == nil || !t.Parameters.GetRandomizeDstPort() { +func (t *ClientTransport) GetDstPort(seed []byte, phantomSubnetSupportsRandPort bool) (uint16, error) { + if t.Parameters == nil || !t.Parameters.GetRandomizeDstPort() || !phantomSubnetSupportsRandPort { return 443, nil } diff --git a/pkg/transports/wrapping/prefix/client.go b/pkg/transports/wrapping/prefix/client.go index 0c1091d3..37d3f809 100644 --- a/pkg/transports/wrapping/prefix/client.go +++ b/pkg/transports/wrapping/prefix/client.go @@ -10,6 +10,7 @@ import ( "net" "github.com/refraction-networking/conjure/pkg/core" + "github.com/refraction-networking/conjure/pkg/station/log" "github.com/refraction-networking/conjure/pkg/transports" pb "github.com/refraction-networking/conjure/proto" "google.golang.org/protobuf/proto" @@ -150,6 +151,9 @@ func defaultParams() *pb.PrefixTransportParams { // error if the provided generic message is not compatible or the parameters are otherwise invalid func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { if genericParams, ok := p.(*pb.GenericTransportParams); ok { + // If the parameters are nil, set them to the default otherwise leave them alone so that + // this can be used to override the RandomizeDstPort parameter for phantoms that do not + // support it. HOWEVER, THAT WILL PERSIST if the Params are re-used. if t.parameters == nil { t.parameters = defaultParams() } @@ -228,7 +232,9 @@ func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { } // GetDstPort returns the destination port that the client should open the phantom connection to -func (t *ClientTransport) GetDstPort(seed []byte) (uint16, error) { +func (t *ClientTransport) GetDstPort(seed []byte, randomizeDstPorSupported bool) (uint16, error) { + + log.Infof("%t, %t", t.parameters.GetRandomizeDstPort(), randomizeDstPorSupported) if t == nil { return 0, ErrBadParams @@ -249,7 +255,7 @@ func (t *ClientTransport) GetDstPort(seed []byte) (uint16, error) { t.parameters = &pb.PrefixTransportParams{PrefixId: &p} } - if t.parameters.GetRandomizeDstPort() { + if t.parameters.GetRandomizeDstPort() && randomizeDstPorSupported { return transports.PortSelectorRange(portRangeMin, portRangeMax, seed) } diff --git a/pkg/transports/wrapping/prefix/prefix_test.go b/pkg/transports/wrapping/prefix/prefix_test.go index 8016c5c2..59f56184 100644 --- a/pkg/transports/wrapping/prefix/prefix_test.go +++ b/pkg/transports/wrapping/prefix/prefix_test.go @@ -245,7 +245,7 @@ func TestPrefixGetDstPortClient(t *testing.T) { // Check nil ClientParams ct := &ClientTransport{Prefix: DefaultPrefixes[0], parameters: nil} - port, err := ct.GetDstPort(seed) + port, err := ct.GetDstPort(seed, true) require.Nil(t, err) require.Equal(t, uint16(443), port) @@ -253,7 +253,7 @@ func TestPrefixGetDstPortClient(t *testing.T) { ct := &ClientTransport{Prefix: testCase.x, parameters: testCase.r} // check client get destination. - clientPort, err := ct.GetDstPort(seed) + clientPort, err := ct.GetDstPort(seed, true) if testCase.e != nil { require.ErrorIs(t, err, testCase.e, testCase.d) } else { From 5052567b971c64aa74eb231abc347883dc58d84b Mon Sep 17 00:00:00 2001 From: jmwample Date: Wed, 4 Oct 2023 17:13:41 -0600 Subject: [PATCH 02/10] SetParams clones param objects so that no re-used param modifications carry across sessions --- pkg/transports/connecting/dtls/client.go | 3 ++- pkg/transports/wrapping/min/client.go | 3 ++- pkg/transports/wrapping/obfs4/client.go | 3 ++- pkg/transports/wrapping/prefix/client.go | 18 ++++++++---------- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/pkg/transports/connecting/dtls/client.go b/pkg/transports/connecting/dtls/client.go index 88d1a68a..a3bb57eb 100644 --- a/pkg/transports/connecting/dtls/client.go +++ b/pkg/transports/connecting/dtls/client.go @@ -92,7 +92,8 @@ func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { t.Parameters.RandomizeDstPort = proto.Bool(params.GetRandomizeDstPort()) case *pb.DTLSTransportParams: - t.Parameters = params + // make a copy of params so that we don't modify the original during an active session. + t.Parameters = proto.Clone(params).(*pb.DTLSTransportParams) case *ClientConfig: t.stunServer = params.STUNServer t.disableIRWorkaround = params.DisableIRWorkaround diff --git a/pkg/transports/wrapping/min/client.go b/pkg/transports/wrapping/min/client.go index 8ffdf993..fc99d30c 100644 --- a/pkg/transports/wrapping/min/client.go +++ b/pkg/transports/wrapping/min/client.go @@ -66,7 +66,8 @@ func (t ClientTransport) ParseParams(data *anypb.Any) (any, error) { func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { var parsedParams *pb.GenericTransportParams if params, ok := p.(*pb.GenericTransportParams); ok { - parsedParams = params + // make a copy of params so that we don't modify the original during an active session. + parsedParams = proto.Clone(params).(*pb.GenericTransportParams) } else if p == nil { parsedParams = &pb.GenericTransportParams{} parsedParams.RandomizeDstPort = proto.Bool(true) diff --git a/pkg/transports/wrapping/obfs4/client.go b/pkg/transports/wrapping/obfs4/client.go index 58956c95..756c93c4 100644 --- a/pkg/transports/wrapping/obfs4/client.go +++ b/pkg/transports/wrapping/obfs4/client.go @@ -54,7 +54,8 @@ func (t *ClientTransport) GetParams() (proto.Message, error) { func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { var parsedParams *pb.GenericTransportParams if params, ok := p.(*pb.GenericTransportParams); ok { - parsedParams = params + // make a copy of params so that we don't modify the original during an active session. + parsedParams = proto.Clone(params).(*pb.GenericTransportParams) } else if p == nil { parsedParams = &pb.GenericTransportParams{} parsedParams.RandomizeDstPort = proto.Bool(true) diff --git a/pkg/transports/wrapping/prefix/client.go b/pkg/transports/wrapping/prefix/client.go index 37d3f809..a5f82418 100644 --- a/pkg/transports/wrapping/prefix/client.go +++ b/pkg/transports/wrapping/prefix/client.go @@ -10,7 +10,6 @@ import ( "net" "github.com/refraction-networking/conjure/pkg/core" - "github.com/refraction-networking/conjure/pkg/station/log" "github.com/refraction-networking/conjure/pkg/transports" pb "github.com/refraction-networking/conjure/proto" "google.golang.org/protobuf/proto" @@ -163,18 +162,19 @@ func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { var prefixParams *pb.PrefixTransportParams if clientParams, ok := p.(*pb.PrefixTransportParams); ok { - prefixParams = clientParams + // make a copy of params so that we don't modify the original during an active session. + prefixParams = proto.Clone(clientParams).(*pb.PrefixTransportParams) } else if clientParams, ok := p.(*ClientParams); ok { prefixParams = &pb.PrefixTransportParams{ - PrefixId: &clientParams.PrefixID, - CustomFlushPolicy: &clientParams.FlushPolicy, - RandomizeDstPort: &clientParams.RandomizeDstPort, + PrefixId: proto.Int32(clientParams.PrefixID), + CustomFlushPolicy: proto.Int32(clientParams.FlushPolicy), + RandomizeDstPort: proto.Bool(clientParams.RandomizeDstPort), } } else if clientParams, ok := p.(ClientParams); ok { prefixParams = &pb.PrefixTransportParams{ - PrefixId: &clientParams.PrefixID, - CustomFlushPolicy: &clientParams.FlushPolicy, - RandomizeDstPort: &clientParams.RandomizeDstPort, + PrefixId: proto.Int32(clientParams.PrefixID), + CustomFlushPolicy: proto.Int32(clientParams.FlushPolicy), + RandomizeDstPort: proto.Bool(clientParams.RandomizeDstPort), } } else if p == nil { prefixParams = defaultParams() @@ -234,8 +234,6 @@ func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { // GetDstPort returns the destination port that the client should open the phantom connection to func (t *ClientTransport) GetDstPort(seed []byte, randomizeDstPorSupported bool) (uint16, error) { - log.Infof("%t, %t", t.parameters.GetRandomizeDstPort(), randomizeDstPorSupported) - if t == nil { return 0, ErrBadParams } From 6a6520413b904b4b21c990f66385c69b30d72862 Mon Sep 17 00:00:00 2001 From: jmwample Date: Thu, 5 Oct 2023 16:04:31 -0600 Subject: [PATCH 03/10] changes to internal library interfaces --- go.mod | 2 +- go.sum | 4 +- go.work.sum | 1 + internal/transport_integration_test.go | 4 + pkg/core/interfaces/interfaces.go | 15 +- pkg/transports/client/transports_test.go | 34 ++++- pkg/transports/connecting/dtls/client.go | 54 +++++-- pkg/transports/wrapping/min/client.go | 47 +++++- pkg/transports/wrapping/min/min_test.go | 3 + pkg/transports/wrapping/obfs4/client.go | 49 +++++- pkg/transports/wrapping/obfs4/obfs4_test.go | 3 + pkg/transports/wrapping/prefix/client.go | 139 ++++++++++++++---- pkg/transports/wrapping/prefix/prefix_test.go | 5 + 13 files changed, 305 insertions(+), 55 deletions(-) diff --git a/go.mod b/go.mod index ee99955c..f12d63e3 100644 --- a/go.mod +++ b/go.mod @@ -54,4 +54,4 @@ replace github.com/pion/dtls/v2 => github.com/mingyech/dtls/v2 v2.0.0 replace github.com/pion/transport/v2 => github.com/mingyech/transport/v2 v2.0.0 -replace github.com/refraction-networking/gotapdance => github.com/refraction-networking/gotapdance v1.7.3-0.20230914182507-7d8ccbce6eb2 +replace github.com/refraction-networking/gotapdance => github.com/refraction-networking/gotapdance v1.7.5-0.20231005212606-d502537b1f19 diff --git a/go.sum b/go.sum index e9958738..52b7d217 100644 --- a/go.sum +++ b/go.sum @@ -69,8 +69,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/refraction-networking/ed25519 v0.1.2 h1:08kJZUkAlY7a7cZGosl1teGytV+QEoNxPO7NnRvAB+g= github.com/refraction-networking/ed25519 v0.1.2/go.mod h1:nxYLUAYt/hmNpAh64PNSQ/tQ9gTIB89wCaGKJlRtZ9I= -github.com/refraction-networking/gotapdance v1.7.3-0.20230914182507-7d8ccbce6eb2 h1:bjm9kj/WjSHJyEi6pxNrviGv90N7+LtlrTtE/s3KIVU= -github.com/refraction-networking/gotapdance v1.7.3-0.20230914182507-7d8ccbce6eb2/go.mod h1:svhsxN8LGv3FSL1RKLFXG74tWEXQ8m1xb9rFEZF2abk= +github.com/refraction-networking/gotapdance v1.7.5-0.20231005212606-d502537b1f19 h1:n0dLMJzhufvFggNrDICpDdU1yqpdLwiXmb0FaUAuGb8= +github.com/refraction-networking/gotapdance v1.7.5-0.20231005212606-d502537b1f19/go.mod h1:uUZDICZjk37aExgntA92OPL5Q7LrZgvpQncYNrO4sKg= github.com/refraction-networking/obfs4 v0.1.2 h1:J842O4fGSkd2W8ogYj0KN6gqVVY+Cpqodw9qFGL7wVU= github.com/refraction-networking/obfs4 v0.1.2/go.mod h1:wAl/+gWiLsrcykJA3nKJHx89f5/gXGM8UKvty7+mvbM= github.com/refraction-networking/utls v1.3.3 h1:f/TBLX7KBciRyFH3bwupp+CE4fzoYKCirhdRcC490sw= diff --git a/go.work.sum b/go.work.sum index 78fd0c56..5d4608cd 100644 --- a/go.work.sum +++ b/go.work.sum @@ -44,6 +44,7 @@ github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/refraction-networking/gotapdance v1.6.2 h1:pDC12wdSCE4Afh31NcNAIcjIhO6Mb/qiIscwbGOhhRA= github.com/refraction-networking/gotapdance v1.6.2/go.mod h1:m82n2v+yNr3+E/dttji+qO2hEjcXgIYj2szuieEMTts= +github.com/refraction-networking/gotapdance v1.7.5-0.20231005212606-d502537b1f19/go.mod h1:uUZDICZjk37aExgntA92OPL5Q7LrZgvpQncYNrO4sKg= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= diff --git a/internal/transport_integration_test.go b/internal/transport_integration_test.go index dccdca71..3510c7f7 100644 --- a/internal/transport_integration_test.go +++ b/internal/transport_integration_test.go @@ -2,6 +2,7 @@ package integration_test import ( "bytes" + "context" "crypto/rand" "errors" "flag" @@ -116,6 +117,9 @@ func testTransportsEndToEnd(t *testing.T, builder stationBuilder, clientTranspor err = clientTransport.SetParams(params) require.Nil(t, err) + err = clientTransport.Prepare(context.Background(), nil) + require.Nil(t, err) + protoParams, err := clientTransport.GetParams() require.Nil(t, err) t.Logf("running %s w/ %s", clientTransport.Name(), testParams.String()) diff --git a/pkg/core/interfaces/interfaces.go b/pkg/core/interfaces/interfaces.go index 27b1f5a7..6b555e40 100644 --- a/pkg/core/interfaces/interfaces.go +++ b/pkg/core/interfaces/interfaces.go @@ -33,11 +33,16 @@ type Transport interface { ParseParams(data *anypb.Any) (any, error) // SetParams allows the caller to set parameters associated with the transport, returning an - // error if the provided generic message is not compatible. the variadic bool parameter is used - // to indicate whether the client should sanity check the params or just apply them. This is - // useful in cases where the registrar may provide options to the client that it is able to - // handle, but are outside of the clients sanity checks. (see prefix transport for an example) - SetParams(any, ...bool) error + // error if the provided generic message is not compatible. + SetParams(any) error + + // SetSessionParams allows the session to apply updated params that are only used within an + // individual dial, returning an error if the provided generic message is not compatible. the + // variadic bool parameter is used to indicate whether the client should sanity check the params + // or just apply them. This is useful in cases where the registrar may provide options to the + // client that it is able to handle, but are outside of the clients sanity checks. (see prefix + // transport for an example) + SetSessionParams(incoming *anypb.Any, unchecked ...bool) error // Prepare lets the transport use the dialer to prepare. This is called before GetParams to let the // transport prepare stuff such as nat traversal. diff --git a/pkg/transports/client/transports_test.go b/pkg/transports/client/transports_test.go index 8959deed..b6fd2459 100644 --- a/pkg/transports/client/transports_test.go +++ b/pkg/transports/client/transports_test.go @@ -2,12 +2,15 @@ package transports import ( // "net/pipe" + "context" "testing" cj "github.com/refraction-networking/conjure/pkg/core/interfaces" "github.com/refraction-networking/conjure/pkg/transports/wrapping/min" pb "github.com/refraction-networking/conjure/proto" "github.com/stretchr/testify/require" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/anypb" ) func TestTransportParameterFunctionality(t *testing.T) { @@ -28,6 +31,8 @@ func TestTransportParameterFunctionality(t *testing.T) { require.Nil(t, params) transport.Parameters = paramsRandomize + err = transport.Prepare(context.Background(), nil) + require.Nil(t, err) // Once params are set it returns a protobuf message that can be cast and parsed or otherwise // operated upon @@ -35,18 +40,43 @@ func TestTransportParameterFunctionality(t *testing.T) { require.Nil(t, err) require.Equal(t, true, params.(*pb.GenericTransportParams).GetRandomizeDstPort()) - // We can then set the parameters if the proper parameters structure is provided even using - // the generic transport interface. + // We can then set the parameters if the proper parameters structure is provided even using the + // generic transport interface. This should only be done on init (i.e in + // NewTransport{FromID, FromName, etc.}) as it will not change the params used in active session + // unless Prepare is called again. var gt cj.Transport = transport err = gt.SetParams(paramsStatic) require.Nil(t, err) // The updated parameters are reflected when we get the parameters, again returning a protobuf // message that can be cast and parsed or otherwise operated upon. + params, err = transport.GetParams() + require.Nil(t, err) + require.Equal(t, true, params.(*pb.GenericTransportParams).GetRandomizeDstPort()) + + err = transport.Prepare(context.Background(), nil) + require.Nil(t, err) + params, err = transport.GetParams() require.Nil(t, err) require.Equal(t, false, params.(*pb.GenericTransportParams).GetRandomizeDstPort()) + // We can then set the parameters if the proper parameters structure is provided even using the + // generic transport interface. This should only be done on init (i.e in + // NewTransport{FromID, FromName, etc.}) as it will not change the params used in active session + // unless Prepare is called again. + gt = transport + sp, err := anypb.New(&pb.GenericTransportParams{RandomizeDstPort: proto.Bool(true)}) + require.Nil(t, err) + err = gt.SetSessionParams(sp) + require.Nil(t, err) + + // The updated parameters are reflected when we get the parameters, again returning a protobuf + // message that can be cast and parsed or otherwise operated upon. + params, err = transport.GetParams() + require.Nil(t, err) + require.Equal(t, true, params.(*pb.GenericTransportParams).GetRandomizeDstPort()) + // if an improper object (any) is provided the cast in min will fail and SetParams will return // an error. badParams := struct{}{} diff --git a/pkg/transports/connecting/dtls/client.go b/pkg/transports/connecting/dtls/client.go index a3bb57eb..5f5baea8 100644 --- a/pkg/transports/connecting/dtls/client.go +++ b/pkg/transports/connecting/dtls/client.go @@ -30,8 +30,12 @@ const ( // significant difference is that there is an instance of this structure per client session, where // the station side Transport struct has one instance to be re-used for all sessions. type ClientTransport struct { - // Parameters are fields that will be shared with the station in the registration + // Parameters are fields that will be shared with the station in the registration. This object + // should be considered immutable after initialization otherwise changes will persist across + // subsequent dials. Parameters *pb.DTLSTransportParams + // SessionParams are fields that will be used for the current session only + sessionParams *pb.DTLSTransportParams privAddr4 *net.UDPAddr pubAddr4 *net.UDPAddr @@ -78,12 +82,43 @@ func (*ClientTransport) ID() pb.TransportType { // GetParams returns a generic protobuf with any parameters from both the registration and the // transport. func (t *ClientTransport) GetParams() (proto.Message, error) { - return t.Parameters, nil + return t.sessionParams, nil +} + +// SetSessionParams allows the session to apply updated params that are only used within an +// individual dial, returning an error if the provided generic message is not compatible. the +// variadic bool parameter is used to indicate whether the client should sanity check the params +// or just apply them. This is useful in cases where the registrar may provide options to the +// client that it is able to handle, but are outside of the clients sanity checks. (see prefix +// transport for an example) +func (t *ClientTransport) SetSessionParams(incoming *anypb.Any, unchecked ...bool) error { + if incoming == nil { + return nil + } + + p, err := t.ParseParams(incoming) + if err != nil { + return err + } + + switch params := p.(type) { + case *pb.GenericTransportParams: + if t.sessionParams == nil { + t.sessionParams = &pb.DTLSTransportParams{} + } + + t.sessionParams.RandomizeDstPort = proto.Bool(params.GetRandomizeDstPort()) + case *pb.DTLSTransportParams: + // make a copy of params so that we don't modify the original during an active session. + t.sessionParams = proto.Clone(params).(*pb.DTLSTransportParams) + } + + return nil } // SetParams allows the caller to set parameters associated with the transport, returning an // error if the provided generic message is not compatible. -func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { +func (t *ClientTransport) SetParams(p any) error { switch params := p.(type) { case *pb.GenericTransportParams: if t.Parameters == nil { @@ -117,6 +152,11 @@ func (t *ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.C var err4 error var err6 error + if t.Parameters == nil { + t.Parameters = &pb.DTLSTransportParams{} + } + t.sessionParams = proto.Clone(t.Parameters).(*pb.DTLSTransportParams) + wg := sync.WaitGroup{} wg.Add(2) @@ -136,19 +176,15 @@ func (t *ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.C return fmt.Errorf("error getting v4 public address: %v; error getting v6 public address: %v", err4, err6) } - if t.Parameters == nil { - t.Parameters = &pb.DTLSTransportParams{} - } - if err4 == nil { t.privAddr4 = privAddr4 t.pubAddr4 = pubAddr4 - t.Parameters.SrcAddr4 = &pb.Addr{IP: pubAddr4.IP.To4(), Port: proto.Uint32(uint32(pubAddr4.Port))} + t.sessionParams.SrcAddr4 = &pb.Addr{IP: pubAddr4.IP.To4(), Port: proto.Uint32(uint32(pubAddr4.Port))} } if err6 == nil { t.privAddr6 = privAddr6 t.pubAddr6 = pubAddr6 - t.Parameters.SrcAddr6 = &pb.Addr{IP: pubAddr6.IP.To16(), Port: proto.Uint32(uint32(pubAddr6.Port))} + t.sessionParams.SrcAddr6 = &pb.Addr{IP: pubAddr6.IP.To16(), Port: proto.Uint32(uint32(pubAddr6.Port))} } return nil diff --git a/pkg/transports/wrapping/min/client.go b/pkg/transports/wrapping/min/client.go index fc99d30c..e087e4f4 100644 --- a/pkg/transports/wrapping/min/client.go +++ b/pkg/transports/wrapping/min/client.go @@ -17,8 +17,12 @@ import ( // significant difference is that there is an instance of this structure per client session, where // the station side Transport struct has one instance to be re-used for all sessions. type ClientTransport struct { - // Parameters are fields that will be shared with the station in the registration + // Parameters are fields that will be shared with the station in the registration. This object + // should be considered immutable after initialization otherwise changes will persist across + // subsequent dials. Parameters *pb.GenericTransportParams + // SessionParams are fields that will be used for the current session only + sessionParams *pb.GenericTransportParams connectTag []byte } @@ -39,14 +43,16 @@ func (*ClientTransport) ID() pb.TransportType { return pb.TransportType_Min } -func (*ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error { +func (t *ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error { + // make a fresh copy of the parameters so that we don't modify the original during an active session. + t.sessionParams = proto.Clone(t.Parameters).(*pb.GenericTransportParams) return nil } // GetParams returns a generic protobuf with any parameters from both the registration and the // transport. func (t *ClientTransport) GetParams() (proto.Message, error) { - return t.Parameters, nil + return t.sessionParams, nil } // ParseParams gives the specific transport an option to parse a generic object into parameters @@ -61,9 +67,40 @@ func (t ClientTransport) ParseParams(data *anypb.Any) (any, error) { return m, err } +// SetSessionParams allows the session to apply updated params that are only used within an +// individual dial, returning an error if the provided generic message is not compatible. the +// variadic bool parameter is used to indicate whether the client should sanity check the params +// or just apply them. This is useful in cases where the registrar may provide options to the +// client that it is able to handle, but are outside of the clients sanity checks. (see prefix +// transport for an example) +func (t *ClientTransport) SetSessionParams(incoming *anypb.Any, unchecked ...bool) error { + if incoming == nil { + return nil + } + + if t.sessionParams == nil { + if t.Parameters == nil { + t.Parameters = &pb.GenericTransportParams{} + } + // make a fresh copy of the parameters so that we don't modify the original during an active session. + t.sessionParams = proto.Clone(t.Parameters).(*pb.GenericTransportParams) + } + p, err := t.ParseParams(incoming) + if err != nil { + return err + } + + if p == nil { + return nil + } + + t.sessionParams = proto.Clone(p.(*pb.GenericTransportParams)).(*pb.GenericTransportParams) + return nil +} + // SetParams allows the caller to set parameters associated with the transport, returning an // error if the provided generic message is not compatible. -func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { +func (t *ClientTransport) SetParams(p any) error { var parsedParams *pb.GenericTransportParams if params, ok := p.(*pb.GenericTransportParams); ok { // make a copy of params so that we don't modify the original during an active session. @@ -80,7 +117,7 @@ func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { // GetDstPort returns the destination port that the client should open the phantom connection to func (t *ClientTransport) GetDstPort(seed []byte, phantomSubnetSupportsRandPort bool) (uint16, error) { - if t.Parameters == nil || !t.Parameters.GetRandomizeDstPort() || !phantomSubnetSupportsRandPort { + if t.sessionParams == nil || !t.sessionParams.GetRandomizeDstPort() || !phantomSubnetSupportsRandPort { return 443, nil } diff --git a/pkg/transports/wrapping/min/min_test.go b/pkg/transports/wrapping/min/min_test.go index fcffe5d1..69c956b2 100644 --- a/pkg/transports/wrapping/min/min_test.go +++ b/pkg/transports/wrapping/min/min_test.go @@ -2,6 +2,7 @@ package min import ( "bytes" + "context" "encoding/hex" "errors" "io" @@ -118,6 +119,8 @@ func TestTryParamsToDstPort(t *testing.T) { for _, testCase := range cases { ct := ClientTransport{Parameters: &pb.GenericTransportParams{RandomizeDstPort: &testCase.r}} var transport Transport + err := ct.Prepare(context.Background(), nil) + require.Nil(t, err) params, err := ct.GetParams() require.Nil(t, err) diff --git a/pkg/transports/wrapping/obfs4/client.go b/pkg/transports/wrapping/obfs4/client.go index 756c93c4..4df9cc23 100644 --- a/pkg/transports/wrapping/obfs4/client.go +++ b/pkg/transports/wrapping/obfs4/client.go @@ -19,8 +19,14 @@ import ( // significant difference is that there is an instance of this structure per client session, where // the station side Transport struct has one instance to be re-used for all sessions. type ClientTransport struct { + // Parameters are fields that will be shared with the station in the registration. This object + // should be considered immutable after initialization otherwise changes will persist across + // subsequent dials. Parameters *pb.GenericTransportParams - keys Obfs4Keys + // SessionParams are fields that will be used for the current session only + sessionParams *pb.GenericTransportParams + + keys Obfs4Keys } // Name returns a string identifier for the Transport for logging @@ -39,19 +45,52 @@ func (*ClientTransport) ID() pb.TransportType { return pb.TransportType_Obfs4 } -func (*ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error { +func (t *ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error { + // make a fresh copy of the parameters so that we don't modify the original during an active session. + t.sessionParams = proto.Clone(t.Parameters).(*pb.GenericTransportParams) return nil } // GetParams returns a generic protobuf with any parameters from both the registration and the // transport. func (t *ClientTransport) GetParams() (proto.Message, error) { - return t.Parameters, nil + return t.sessionParams, nil +} + +// SetSessionParams allows the session to apply updated params that are only used within an +// individual dial, returning an error if the provided generic message is not compatible. the +// variadic bool parameter is used to indicate whether the client should sanity check the params +// or just apply them. This is useful in cases where the registrar may provide options to the +// client that it is able to handle, but are outside of the clients sanity checks. (see prefix +// transport for an example) +func (t *ClientTransport) SetSessionParams(incoming *anypb.Any, unchecked ...bool) error { + if incoming == nil { + return nil + } + + if t.sessionParams == nil { + if t.Parameters == nil { + t.Parameters = &pb.GenericTransportParams{} + } + // make a fresh copy of the parameters so that we don't modify the original during an active session. + t.sessionParams = proto.Clone(t.Parameters).(*pb.GenericTransportParams) + } + p, err := t.ParseParams(incoming) + if err != nil { + return err + } + + if p == nil { + return nil + } + + t.sessionParams = proto.Clone(p.(*pb.GenericTransportParams)).(*pb.GenericTransportParams) + return nil } // SetParams allows the caller to set parameters associated with the transport, returning an // error if the provided generic message is not compatible. -func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { +func (t *ClientTransport) SetParams(p any) error { var parsedParams *pb.GenericTransportParams if params, ok := p.(*pb.GenericTransportParams); ok { // make a copy of params so that we don't modify the original during an active session. @@ -80,7 +119,7 @@ func (t ClientTransport) ParseParams(data *anypb.Any) (any, error) { // GetDstPort returns the destination port that the client should open the phantom connection to func (t *ClientTransport) GetDstPort(seed []byte, phantomSubnetSupportsRandPort bool) (uint16, error) { - if t.Parameters == nil || !t.Parameters.GetRandomizeDstPort() || !phantomSubnetSupportsRandPort { + if t.sessionParams == nil || !t.sessionParams.GetRandomizeDstPort() || !phantomSubnetSupportsRandPort { return 443, nil } diff --git a/pkg/transports/wrapping/obfs4/obfs4_test.go b/pkg/transports/wrapping/obfs4/obfs4_test.go index 84aab1f3..f61dbccc 100644 --- a/pkg/transports/wrapping/obfs4/obfs4_test.go +++ b/pkg/transports/wrapping/obfs4/obfs4_test.go @@ -2,6 +2,7 @@ package obfs4 import ( "bytes" + "context" "encoding/hex" "errors" "io" @@ -288,6 +289,8 @@ func TestTryParamsToDstPort(t *testing.T) { for _, testCase := range cases { ct := ClientTransport{Parameters: &pb.GenericTransportParams{RandomizeDstPort: &testCase.r}} var transport Transport + err := ct.Prepare(context.Background(), nil) + require.Nil(t, err) params, err := ct.GetParams() require.Nil(t, err) diff --git a/pkg/transports/wrapping/prefix/client.go b/pkg/transports/wrapping/prefix/client.go index a5f82418..0b1f0bfb 100644 --- a/pkg/transports/wrapping/prefix/client.go +++ b/pkg/transports/wrapping/prefix/client.go @@ -22,7 +22,8 @@ import ( // // External libraries must set parameters through SetParams using PrefixTransportParams. type ClientTransport struct { - parameters *pb.PrefixTransportParams + parameters *pb.PrefixTransportParams + sessionParams *pb.PrefixTransportParams // // state tracks fields internal to the registrar that survive for the lifetime // // of the transport session without being shared - i.e. local derived keys. @@ -94,7 +95,9 @@ func (*ClientTransport) ID() pb.TransportType { // Prepare lets the transport use the dialer to prepare. This is called before GetParams to let the // transport prepare stuff such as nat traversal. -func (*ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error { +func (t *ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error { + // make a fresh copy of the parameters so that we don't modify the original during an active session. + t.sessionParams = proto.Clone(t.parameters).(*pb.PrefixTransportParams) return nil } @@ -109,11 +112,14 @@ func (t *ClientTransport) GetParams() (proto.Message, error) { return nil, fmt.Errorf("%w: empty or invalid Prefix provided", ErrBadParams) } - if t.parameters == nil { - t.parameters = defaultParams() + if t.sessionParams == nil { + if t.parameters != nil { + t.sessionParams = proto.Clone(t.parameters).(*pb.PrefixTransportParams) + } else { + t.sessionParams = defaultParams() + } } - - return t.parameters, nil + return t.sessionParams, nil } // ParseParams gives the specific transport an option to parse a generic object into parameters @@ -146,9 +152,99 @@ func defaultParams() *pb.PrefixTransportParams { } } +// SetSessionParams allows the session to apply updated params that are only used within an +// individual dial, returning an error if the provided generic message is not compatible. the +// variadic bool parameter is used to indicate whether the client should sanity check the params +// or just apply them. This is useful in cases where the registrar may provide options to the +// client that it is able to handle, but are outside of the clients sanity checks. (see prefix +// transport for an example) +func (t *ClientTransport) SetSessionParams(incoming *anypb.Any, unchecked ...bool) error { + if incoming == nil { + return nil + } + + p, err := t.ParseParams(incoming) + if err != nil { + return err + } + + if t.sessionParams == nil { + t.sessionParams = proto.Clone(defaultParams()).(*pb.PrefixTransportParams) + } + + var prefixParams *pb.PrefixTransportParams + switch px := p.(type) { + case *pb.GenericTransportParams: + // If the parameters are nil, set them to the default otherwise leave them alone so that + // this can be used to override the RandomizeDstPort parameter for phantoms that do not + // support it. HOWEVER, THAT WILL PERSIST if the Params are re-used. + if t.sessionParams == nil { + t.sessionParams = defaultParams() + } + t.sessionParams.RandomizeDstPort = proto.Bool(p.(*pb.GenericTransportParams).GetRandomizeDstPort()) + return nil + case *pb.PrefixTransportParams: + // make a copy of params so that we don't modify the original during an active session. + prefixParams = proto.Clone(px).(*pb.PrefixTransportParams) + } + + if prefixParams == nil { + return fmt.Errorf("%w, nil params", ErrBadParams) + } + + if len(unchecked) != 0 && unchecked[0] { + // Overwrite the prefix bytes and type without checking the default set. This is used for + // RegResponse where the registrar may override the chosen prefix with a prefix outside of + // the prefixes that the client known about. + t.sessionParams = prefixParams + t.Prefix = &clientPrefix{ + bytes: prefixParams.GetPrefix(), + id: PrefixID(prefixParams.GetPrefixId()), + flushPolicy: prefixParams.GetCustomFlushPolicy(), + } + + return nil + } + + if prefix, ok := DefaultPrefixes[PrefixID(prefixParams.GetPrefixId())]; ok { + t.Prefix = prefix + t.sessionParams = prefixParams + + // clear the prefix if it was set. this is used only when we don't have a known prefix + t.sessionParams.Prefix = []byte{} + return nil + } + + if prefixParams.GetPrefixId() == int32(Rand) { + newPrefix, err := pickRandomPrefix(rand.Reader) + if err != nil { + return err + } + + t.Prefix = newPrefix + + if t.sessionParams == nil { + if t.parameters != nil { + t.sessionParams = proto.Clone(t.parameters).(*pb.PrefixTransportParams) + } else { + t.parameters = &pb.PrefixTransportParams{} + } + } + + id := int32(t.Prefix.ID()) + t.sessionParams.PrefixId = &id + t.sessionParams.RandomizeDstPort = prefixParams.RandomizeDstPort + + return nil + } + + return ErrUnknownPrefix + +} + // SetParams allows the caller to set parameters associated with the transport, returning an // error if the provided generic message is not compatible or the parameters are otherwise invalid -func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { +func (t *ClientTransport) SetParams(p any) error { if genericParams, ok := p.(*pb.GenericTransportParams); ok { // If the parameters are nil, set them to the default otherwise leave them alone so that // this can be used to override the RandomizeDstPort parameter for phantoms that do not @@ -186,19 +282,7 @@ func (t *ClientTransport) SetParams(p any, unchecked ...bool) error { return fmt.Errorf("%w, nil params", ErrBadParams) } - if len(unchecked) != 0 && unchecked[0] { - // Overwrite the prefix bytes and type without checking the default set. This is used for - // RegResponse where the registrar may override the chosen prefix with a prefix outside of - // the prefixes that the client known about. - t.parameters = prefixParams - t.Prefix = &clientPrefix{ - bytes: prefixParams.GetPrefix(), - id: PrefixID(prefixParams.GetPrefixId()), - flushPolicy: prefixParams.GetCustomFlushPolicy(), - } - - return nil - } + // Parameters set by user SetParams must either be random or known Prefix ID. if prefix, ok := DefaultPrefixes[PrefixID(prefixParams.GetPrefixId())]; ok { t.Prefix = prefix @@ -248,12 +332,12 @@ func (t *ClientTransport) GetDstPort(seed []byte, randomizeDstPorSupported bool) return 0, fmt.Errorf("%w: use SetParams or FromID if using Rand prefix", ErrUnknownPrefix) } - if t.parameters == nil { + if t.sessionParams == nil { p := int32(prefixID) - t.parameters = &pb.PrefixTransportParams{PrefixId: &p} + t.sessionParams = &pb.PrefixTransportParams{PrefixId: &p} } - if t.parameters.GetRandomizeDstPort() && randomizeDstPorSupported { + if t.sessionParams.GetRandomizeDstPort() && randomizeDstPorSupported { return transports.PortSelectorRange(portRangeMin, portRangeMax, seed) } @@ -280,8 +364,11 @@ func (t *ClientTransport) WrapConn(conn net.Conn) (net.Conn, error) { t.TagObfuscator = transports.CTRObfuscator{} } - if t.parameters == nil { - t.parameters = defaultParams() + if t.sessionParams == nil { + if t.parameters == nil { + t.sessionParams = defaultParams() + } + t.sessionParams = proto.Clone(t.parameters).(*pb.PrefixTransportParams) } obfuscatedID, err := t.TagObfuscator.Obfuscate(t.connectTag, t.stationPublicKey[:]) @@ -298,7 +385,7 @@ func (t *ClientTransport) WrapConn(conn net.Conn) (net.Conn, error) { } // Maybe flush based on prefix spec and client param override - switch t.parameters.GetCustomFlushPolicy() { + switch t.sessionParams.GetCustomFlushPolicy() { case NoAddedFlush: break case FlushAfterPrefix: diff --git a/pkg/transports/wrapping/prefix/prefix_test.go b/pkg/transports/wrapping/prefix/prefix_test.go index 59f56184..90cd76ae 100644 --- a/pkg/transports/wrapping/prefix/prefix_test.go +++ b/pkg/transports/wrapping/prefix/prefix_test.go @@ -2,6 +2,7 @@ package prefix import ( "bytes" + "context" "crypto/rand" "encoding/hex" "errors" @@ -245,12 +246,16 @@ func TestPrefixGetDstPortClient(t *testing.T) { // Check nil ClientParams ct := &ClientTransport{Prefix: DefaultPrefixes[0], parameters: nil} + err := ct.Prepare(context.Background(), nil) + require.Nil(t, err) port, err := ct.GetDstPort(seed, true) require.Nil(t, err) require.Equal(t, uint16(443), port) for _, testCase := range _cases { ct := &ClientTransport{Prefix: testCase.x, parameters: testCase.r} + err := ct.Prepare(context.Background(), nil) + require.Nil(t, err) // check client get destination. clientPort, err := ct.GetDstPort(seed, true) From 935042e1c3487d862837aba4f482471525fd8a90 Mon Sep 17 00:00:00 2001 From: jmwample Date: Thu, 5 Oct 2023 19:11:43 -0600 Subject: [PATCH 04/10] prefix param handling so rand prefix is random for each re-dial --- pkg/transports/wrapping/prefix/client.go | 30 ++++++++++++------- pkg/transports/wrapping/prefix/prefix_test.go | 15 ++++++---- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/pkg/transports/wrapping/prefix/client.go b/pkg/transports/wrapping/prefix/client.go index 0b1f0bfb..87e7af4c 100644 --- a/pkg/transports/wrapping/prefix/client.go +++ b/pkg/transports/wrapping/prefix/client.go @@ -98,6 +98,23 @@ func (*ClientTransport) ID() pb.TransportType { func (t *ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error { // make a fresh copy of the parameters so that we don't modify the original during an active session. t.sessionParams = proto.Clone(t.parameters).(*pb.PrefixTransportParams) + + if t.sessionParams == nil { + t.sessionParams = &pb.PrefixTransportParams{} + } + + // If the user set random Prefix ID in the immutable params then we need to pick a random prefix + // for the sessions. + if t.sessionParams.GetPrefixId() == int32(Rand) { + newPrefix, err := pickRandomPrefix(rand.Reader) + if err != nil { + return err + } + + t.Prefix = newPrefix + t.sessionParams.PrefixId = proto.Int32(int32(newPrefix.ID())) + } + return nil } @@ -291,24 +308,15 @@ func (t *ClientTransport) SetParams(p any) error { // clear the prefix if it was set. this is used for RegResponse only. t.parameters.Prefix = []byte{} return nil - } + } else if prefixParams.GetPrefixId() == int32(Rand) { - if prefixParams.GetPrefixId() == int32(Rand) { newPrefix, err := pickRandomPrefix(rand.Reader) if err != nil { return err } t.Prefix = newPrefix - - if t.parameters == nil { - t.parameters = &pb.PrefixTransportParams{} - } - - id := int32(t.Prefix.ID()) - t.parameters.PrefixId = &id - t.parameters.RandomizeDstPort = prefixParams.RandomizeDstPort - + t.parameters = prefixParams return nil } diff --git a/pkg/transports/wrapping/prefix/prefix_test.go b/pkg/transports/wrapping/prefix/prefix_test.go index 90cd76ae..00ccbd05 100644 --- a/pkg/transports/wrapping/prefix/prefix_test.go +++ b/pkg/transports/wrapping/prefix/prefix_test.go @@ -173,7 +173,7 @@ type ptp = pb.PrefixTransportParams var f = false var t = true var i1 int32 = 1 -var in1 int32 = -1 +var in1 int32 = int32(Rand) var i22 int32 = 22 var _cases = []struct { @@ -211,10 +211,10 @@ var _cases = []struct { {"9", &clientPrefix{[]byte{}, -2, 1025, NoAddedFlush}, nil, 1025, 0, nil, ErrBadParams, ErrUnknownPrefix}, {"10", &clientPrefix{[]byte{}, -2, 443, NoAddedFlush}, nil, 443, 0, nil, ErrBadParams, nil}, - // Random prefix, resolved by client into another prefix BEFORE calling GetParams. This means - // that none of ClientTransport.GetParams, ClientTransport.DstPort, or Transport.GetDstPort are - // aware of a PrefixID of -1 (Rand) - {"11", &clientPrefix{[]byte{}, -1, 1025, NoAddedFlush}, &ptp{RandomizeDstPort: &t, PrefixId: &in1}, 0, 0, ErrUnknownPrefix, ErrUnknownPrefix, ErrUnknownPrefix}, + // Random prefix, resolved by client into another prefix _after_ calling GetParams. This means + // that ClientTransport.GetParams, and ClientTransport.DstPort are aware of a PrefixID of -1 + // (Rand), but the server side functions (e.g Transport.GetDstPort) are not. + {"11", &clientPrefix{[]byte{}, -1, 1025, NoAddedFlush}, &ptp{RandomizeDstPort: &t, PrefixId: &in1}, 58047, 58047, nil, ErrUnknownPrefix, nil}, } func TestPrefixGetDstPortServer(t *testing.T) { @@ -296,8 +296,11 @@ func TestPrefixSetParamsClient(t *testing.T) { ct := &ClientTransport{} err := ct.SetParams(params) require.Nil(t, err) + err = ct.Prepare(context.Background(), nil) + require.Nil(t, err) require.NotEqual(t, -1, int(ct.Prefix.ID())) - require.Equal(t, ct.Prefix.ID(), PrefixID(ct.parameters.GetPrefixId())) + require.Equal(t, ct.Prefix.ID(), PrefixID(ct.sessionParams.GetPrefixId())) + require.Equal(t, Rand, PrefixID(ct.parameters.GetPrefixId())) id = int32(Min) params = &pb.PrefixTransportParams{PrefixId: &id} From 6d07d1a62f03d595dbfe62fe656e49e74c6a869c Mon Sep 17 00:00:00 2001 From: jmwample Date: Fri, 6 Oct 2023 12:54:54 -0600 Subject: [PATCH 05/10] found issue, incomplete fix --- go.mod | 1 + go.sum | 3 + go.work.sum | 2 +- pkg/regserver/overrides/prefix_transport.go | 14 +- .../overrides/prefix_transport_test.go | 37 +- proto/signalling.pb.go | 184 ++- proto/signalling.proto | 6 + proto/signalling.rs | 1472 ++++++++++------- src/signalling.rs | 1472 ++++++++++------- 9 files changed, 1932 insertions(+), 1259 deletions(-) diff --git a/go.mod b/go.mod index f12d63e3..b4fe4358 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/BurntSushi/toml v1.3.2 github.com/flynn/noise v1.0.0 github.com/go-redis/redis/v8 v8.11.5 + github.com/golang/protobuf v1.5.3 github.com/google/gopacket v1.1.19 github.com/gorilla/mux v1.8.0 github.com/hashicorp/golang-lru v1.0.2 diff --git a/go.sum b/go.sum index 52b7d217..5cee2965 100644 --- a/go.sum +++ b/go.sum @@ -19,6 +19,8 @@ github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67d github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= @@ -150,6 +152,7 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/go.work.sum b/go.work.sum index 5d4608cd..721c6ca8 100644 --- a/go.work.sum +++ b/go.work.sum @@ -20,6 +20,7 @@ github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNu github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y= @@ -44,7 +45,6 @@ github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/refraction-networking/gotapdance v1.6.2 h1:pDC12wdSCE4Afh31NcNAIcjIhO6Mb/qiIscwbGOhhRA= github.com/refraction-networking/gotapdance v1.6.2/go.mod h1:m82n2v+yNr3+E/dttji+qO2hEjcXgIYj2szuieEMTts= -github.com/refraction-networking/gotapdance v1.7.5-0.20231005212606-d502537b1f19/go.mod h1:uUZDICZjk37aExgntA92OPL5Q7LrZgvpQncYNrO4sKg= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= diff --git a/pkg/regserver/overrides/prefix_transport.go b/pkg/regserver/overrides/prefix_transport.go index 1318a32f..df8df0f3 100644 --- a/pkg/regserver/overrides/prefix_transport.go +++ b/pkg/regserver/overrides/prefix_transport.go @@ -17,6 +17,7 @@ import ( "strconv" "strings" + "github.com/golang/protobuf/proto" "github.com/refraction-networking/conjure/pkg/core/interfaces" "github.com/refraction-networking/conjure/pkg/transports" "github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix" @@ -200,9 +201,16 @@ func (po *PrefixOverride) Override(reg *pb.C2SWrapper, randReader io.Reader) err reg.RegistrationResponse = &pb.RegistrationResponse{} } - if fields.port > 0 { - p := uint32(fields.port) - reg.RegistrationResponse.DstPort = &p + if reg.GetRegistrationResponse().GetPhantomsSupportPortRand() { + if !params.GetRandomizeDstPort() || reg.GetRegistrationResponse().GetDstPort() == 0 { + if fields.port > 0 { + reg.RegistrationResponse.DstPort = proto.Uint32(uint32(fields.port)) + } + } + } else { + if reg.GetRegistrationResponse().GetDstPort() != 443 { + reg.RegistrationResponse.DstPort = proto.Uint32(443) + } } anypbParams, err := anypb.New(params) diff --git a/pkg/regserver/overrides/prefix_transport_test.go b/pkg/regserver/overrides/prefix_transport_test.go index 4f53444d..4979cc57 100644 --- a/pkg/regserver/overrides/prefix_transport_test.go +++ b/pkg/regserver/overrides/prefix_transport_test.go @@ -12,6 +12,7 @@ import ( pb "github.com/refraction-networking/conjure/proto" "github.com/stretchr/testify/require" + "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/anypb" ) @@ -138,7 +139,7 @@ func TestPrefixOverride_Override(t *testing.T) { c = &pb.C2SWrapper{} F := false - params := &pb.GenericTransportParams{} + params := &pb.GenericTransportParams{RandomizeDstPort: proto.Bool(false)} p, err := anypb.New(params) require.Nil(t, err) @@ -154,9 +155,12 @@ func TestPrefixOverride_Override(t *testing.T) { t.Run("registration wrong tt and params", test) ttPrefix := pb.TransportType_Prefix - paramsPref, _ := anypb.New(&pb.PrefixTransportParams{}) + paramsPref, _ := anypb.New(&pb.PrefixTransportParams{RandomizeDstPort: proto.Bool(false)}) c.RegistrationPayload.Transport = &ttPrefix c.RegistrationPayload.TransportParams = paramsPref + c.RegistrationResponse = &pb.RegistrationResponse{ + PhantomsSupportPortRand: proto.Bool(true), + } out = expected{true, nil, 0, []byte{}} t.Run("empty prefix override set", test) @@ -176,6 +180,35 @@ func TestPrefixOverride_Override(t *testing.T) { out = expected{false, nil, 1024, []byte("ABC")} t.Run("select prefix with port override disabled", test) + + // Phantom supports random port, but user disabled it - use default port from prefix + c.RegistrationResponse = &pb.RegistrationResponse{ + PhantomsSupportPortRand: proto.Bool(true), + } + paramsPref, _ = anypb.New(&pb.PrefixTransportParams{RandomizeDstPort: proto.Bool(false)}) + c.RegistrationPayload.TransportParams = paramsPref + out = expected{false, nil, 1024, []byte("ABC")} + t.Run("select prefix with port override disabled", test) + + // Phantom supports random port, and user enables it - use port set in the registration response + c.RegistrationResponse = &pb.RegistrationResponse{ + PhantomsSupportPortRand: proto.Bool(true), + DstPort: proto.Uint32(12345), + } + paramsPref, _ = anypb.New(&pb.PrefixTransportParams{RandomizeDstPort: proto.Bool(true)}) + c.RegistrationPayload.TransportParams = paramsPref + out = expected{false, nil, 12345, []byte("ABC")} + t.Run("select prefix with port override disabled", test) + + // Phantom does not support random port, user enables it - use port set in the registration response + c.RegistrationResponse = &pb.RegistrationResponse{ + PhantomsSupportPortRand: proto.Bool(true), + DstPort: proto.Uint32(12345), + } + paramsPref, _ = anypb.New(&pb.PrefixTransportParams{RandomizeDstPort: proto.Bool(true)}) + c.RegistrationPayload.TransportParams = paramsPref + out = expected{false, nil, 12345, []byte("ABC")} + t.Run("select prefix with port override disabled", test) } func d(s string) []byte { diff --git a/proto/signalling.pb.go b/proto/signalling.pb.go index 8e1c8a8f..a1ca1812 100644 --- a/proto/signalling.pb.go +++ b/proto/signalling.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 -// protoc v4.24.2 +// protoc-gen-go v1.27.1 +// protoc v3.12.4 // source: signalling.proto // TODO: We're using proto2 because it's the default on Ubuntu 16.04. @@ -11,9 +11,9 @@ package proto import ( + any "github.com/golang/protobuf/ptypes/any" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - anypb "google.golang.org/protobuf/types/known/anypb" reflect "reflect" sync "sync" ) @@ -1654,7 +1654,7 @@ type ClientToStation struct { Stats *SessionStats `protobuf:"bytes,11,opt,name=stats" json:"stats,omitempty"` // NullTransport, MinTransport, Obfs4Transport, etc. Transport type we want from phantom proxy Transport *TransportType `protobuf:"varint,12,opt,name=transport,enum=proto.TransportType" json:"transport,omitempty"` - TransportParams *anypb.Any `protobuf:"bytes,13,opt,name=transport_params,json=transportParams" json:"transport_params,omitempty"` + TransportParams *any.Any `protobuf:"bytes,13,opt,name=transport_params,json=transportParams" json:"transport_params,omitempty"` // Station is only required to check this variable during session initialization. // If set, station must facilitate connection to said target by itself, i.e. write into squid // socket an HTTP/SOCKS/any other connection request. @@ -1771,7 +1771,7 @@ func (x *ClientToStation) GetTransport() TransportType { return TransportType_Null } -func (x *ClientToStation) GetTransportParams() *anypb.Any { +func (x *ClientToStation) GetTransportParams() *any.Any { if x != nil { return x.TransportParams } @@ -2264,7 +2264,10 @@ type RegistrationResponse struct { // ClientConf field (optional) ClientConf *ClientConf `protobuf:"bytes,6,opt,name=clientConf" json:"clientConf,omitempty"` // Transport Params to if `allow_registrar_overrides` is set. - TransportParams *anypb.Any `protobuf:"bytes,10,opt,name=transport_params,json=transportParams" json:"transport_params,omitempty"` + TransportParams *any.Any `protobuf:"bytes,10,opt,name=transport_params,json=transportParams" json:"transport_params,omitempty"` + // PhantomsSupportPortRand is a flag that indicates whether the selected phantoms are able to + // handle phantom connections to randomized ports. + PhantomsSupportPortRand *bool `protobuf:"varint,11,opt,name=phantoms_support_port_rand,json=phantomsSupportPortRand" json:"phantoms_support_port_rand,omitempty"` } func (x *RegistrationResponse) Reset() { @@ -2341,13 +2344,20 @@ func (x *RegistrationResponse) GetClientConf() *ClientConf { return nil } -func (x *RegistrationResponse) GetTransportParams() *anypb.Any { +func (x *RegistrationResponse) GetTransportParams() *any.Any { if x != nil { return x.TransportParams } return nil } +func (x *RegistrationResponse) GetPhantomsSupportPortRand() bool { + if x != nil && x.PhantomsSupportPortRand != nil { + return *x.PhantomsSupportPortRand + } + return false +} + // response from dns type DnsResponse struct { state protoimpl.MessageState @@ -2673,7 +2683,7 @@ var file_signalling_proto_rawDesc = []byte{ 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x50, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x02, 0x0a, 0x14, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd4, 0x02, 0x0a, 0x14, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x70, 0x76, 0x34, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, 0x52, 0x08, 0x69, 0x70, 0x76, 0x34, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x70, @@ -2690,82 +2700,86 @@ var file_signalling_proto_rawDesc = []byte{ 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, - 0xac, 0x01, 0x0a, 0x0b, 0x44, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x6f, 0x75, 0x74, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x63, 0x6f, - 0x6e, 0x66, 0x4f, 0x75, 0x74, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x16, 0x62, 0x69, - 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x15, 0x62, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x2b, - 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x53, - 0x5f, 0x47, 0x43, 0x4d, 0x5f, 0x31, 0x32, 0x38, 0x10, 0x5a, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, - 0x53, 0x5f, 0x47, 0x43, 0x4d, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x5b, 0x2a, 0x29, 0x0a, 0x0c, 0x44, - 0x6e, 0x73, 0x52, 0x65, 0x67, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x07, 0x0a, 0x03, 0x55, - 0x44, 0x50, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4f, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, - 0x03, 0x44, 0x4f, 0x48, 0x10, 0x03, 0x2a, 0xe7, 0x01, 0x0a, 0x0e, 0x43, 0x32, 0x53, 0x5f, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x32, 0x53, - 0x5f, 0x4e, 0x4f, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, - 0x43, 0x32, 0x53, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x49, 0x54, - 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x32, 0x53, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, - 0x4e, 0x5f, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x0b, 0x12, - 0x18, 0x0a, 0x14, 0x43, 0x32, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x45, 0x43, 0x54, 0x5f, 0x52, 0x45, - 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x32, 0x53, - 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x03, - 0x12, 0x14, 0x0a, 0x10, 0x43, 0x32, 0x53, 0x5f, 0x59, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x50, - 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x32, 0x53, 0x5f, 0x41, 0x43, - 0x51, 0x55, 0x49, 0x52, 0x45, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x05, 0x12, 0x20, - 0x0a, 0x1c, 0x43, 0x32, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x45, 0x43, 0x54, 0x5f, 0x55, 0x50, 0x4c, - 0x4f, 0x41, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x4e, 0x10, 0x06, - 0x12, 0x0e, 0x0a, 0x09, 0x43, 0x32, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xff, 0x01, - 0x2a, 0x98, 0x01, 0x0a, 0x0e, 0x53, 0x32, 0x43, 0x5f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x32, 0x43, 0x5f, 0x4e, 0x4f, 0x5f, 0x43, 0x48, - 0x41, 0x4e, 0x47, 0x45, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x32, 0x43, 0x5f, 0x53, 0x45, - 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, - 0x53, 0x32, 0x43, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x56, 0x45, - 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x0b, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x32, 0x43, - 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x4e, 0x45, - 0x43, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x32, 0x43, 0x5f, 0x53, 0x45, 0x53, 0x53, - 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x09, 0x53, - 0x32, 0x43, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xff, 0x01, 0x2a, 0xac, 0x01, 0x0a, 0x0e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x53, 0x32, 0x43, 0x12, 0x0c, - 0x0a, 0x08, 0x4e, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, - 0x43, 0x4f, 0x56, 0x45, 0x52, 0x54, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x10, 0x01, 0x12, - 0x13, 0x0a, 0x0f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, - 0x45, 0x44, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x50, - 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x04, 0x12, - 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x43, 0x4f, 0x59, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x4c, 0x4f, 0x41, - 0x44, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, - 0x52, 0x45, 0x41, 0x4d, 0x10, 0x64, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x65, 0x2a, 0x82, 0x01, 0x0a, 0x0d, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, - 0x4e, 0x75, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x69, 0x6e, 0x10, 0x01, 0x12, - 0x09, 0x0a, 0x05, 0x4f, 0x62, 0x66, 0x73, 0x34, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x54, - 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x04, - 0x12, 0x08, 0x0a, 0x04, 0x75, 0x54, 0x4c, 0x53, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x53, 0x4d, 0x10, 0x07, - 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x45, 0x10, 0x08, 0x12, 0x08, 0x0a, 0x04, 0x51, 0x75, 0x69, - 0x63, 0x10, 0x09, 0x12, 0x0a, 0x0a, 0x06, 0x57, 0x65, 0x62, 0x72, 0x74, 0x63, 0x10, 0x63, 0x2a, - 0x86, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x50, 0x49, 0x10, 0x02, 0x12, 0x13, - 0x0a, 0x0f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x73, 0x63, 0x61, - 0x6e, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x50, 0x49, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4e, 0x53, - 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x44, 0x4e, 0x53, 0x10, 0x06, 0x2a, 0x40, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0b, 0x0a, - 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4e, 0x65, - 0x77, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x10, 0x02, 0x12, - 0x09, 0x0a, 0x05, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x10, 0x03, 0x2a, 0x24, 0x0a, 0x07, 0x49, 0x50, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x6e, 0x6b, 0x10, 0x00, 0x12, 0x07, - 0x0a, 0x03, 0x54, 0x63, 0x70, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x64, 0x70, 0x10, 0x02, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x3b, 0x0a, 0x1a, 0x70, 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x73, 0x5f, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x17, 0x70, 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x73, 0x53, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x22, 0xac, 0x01, 0x0a, + 0x0b, 0x44, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x6f, 0x75, 0x74, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x4f, + 0x75, 0x74, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x16, 0x62, 0x69, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x15, 0x62, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x2b, 0x0a, 0x07, 0x4b, + 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x47, 0x43, + 0x4d, 0x5f, 0x31, 0x32, 0x38, 0x10, 0x5a, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x47, + 0x43, 0x4d, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x5b, 0x2a, 0x29, 0x0a, 0x0c, 0x44, 0x6e, 0x73, 0x52, + 0x65, 0x67, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x44, 0x50, 0x10, + 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4f, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4f, + 0x48, 0x10, 0x03, 0x2a, 0xe7, 0x01, 0x0a, 0x0e, 0x43, 0x32, 0x53, 0x5f, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x32, 0x53, 0x5f, 0x4e, 0x4f, + 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x32, 0x53, + 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x01, 0x12, + 0x1b, 0x0a, 0x17, 0x43, 0x32, 0x53, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x43, + 0x4f, 0x56, 0x45, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x0b, 0x12, 0x18, 0x0a, 0x14, + 0x43, 0x32, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x45, 0x43, 0x54, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, + 0x4e, 0x45, 0x43, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x32, 0x53, 0x5f, 0x53, 0x45, + 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, + 0x10, 0x43, 0x32, 0x53, 0x5f, 0x59, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, + 0x44, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x32, 0x53, 0x5f, 0x41, 0x43, 0x51, 0x55, 0x49, + 0x52, 0x45, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x05, 0x12, 0x20, 0x0a, 0x1c, 0x43, + 0x32, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x45, 0x43, 0x54, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, + 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x4e, 0x10, 0x06, 0x12, 0x0e, 0x0a, + 0x09, 0x43, 0x32, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xff, 0x01, 0x2a, 0x98, 0x01, + 0x0a, 0x0e, 0x53, 0x32, 0x43, 0x5f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x32, 0x43, 0x5f, 0x4e, 0x4f, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, + 0x45, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x32, 0x43, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, + 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x32, 0x43, + 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x54, 0x5f, + 0x49, 0x4e, 0x49, 0x54, 0x10, 0x0b, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x32, 0x43, 0x5f, 0x43, 0x4f, + 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, + 0x02, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x32, 0x43, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, + 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x09, 0x53, 0x32, 0x43, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xff, 0x01, 0x2a, 0xac, 0x01, 0x0a, 0x0e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x53, 0x32, 0x43, 0x12, 0x0c, 0x0a, 0x08, 0x4e, + 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x56, + 0x45, 0x52, 0x54, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, + 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, + 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x54, + 0x4f, 0x43, 0x4f, 0x4c, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, + 0x44, 0x45, 0x43, 0x4f, 0x59, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x05, + 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, + 0x4d, 0x10, 0x64, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x49, + 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x65, 0x2a, 0x82, 0x01, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x75, 0x6c, + 0x6c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x69, 0x6e, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, + 0x4f, 0x62, 0x66, 0x73, 0x34, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x54, 0x4c, 0x53, 0x10, + 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x04, 0x12, 0x08, 0x0a, + 0x04, 0x75, 0x54, 0x4c, 0x53, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x53, 0x4d, 0x10, 0x07, 0x12, 0x07, 0x0a, + 0x03, 0x46, 0x54, 0x45, 0x10, 0x08, 0x12, 0x08, 0x0a, 0x04, 0x51, 0x75, 0x69, 0x63, 0x10, 0x09, + 0x12, 0x0a, 0x0a, 0x06, 0x57, 0x65, 0x62, 0x72, 0x74, 0x63, 0x10, 0x63, 0x2a, 0x86, 0x01, 0x0a, + 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x50, 0x49, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x73, 0x63, 0x61, 0x6e, 0x10, 0x03, + 0x12, 0x14, 0x0a, 0x10, 0x42, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x41, 0x50, 0x49, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4e, 0x53, 0x10, 0x05, 0x12, + 0x14, 0x0a, 0x10, 0x42, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x44, 0x4e, 0x53, 0x10, 0x06, 0x2a, 0x40, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4e, 0x65, 0x77, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, + 0x43, 0x6c, 0x65, 0x61, 0x72, 0x10, 0x03, 0x2a, 0x24, 0x0a, 0x07, 0x49, 0x50, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x6e, 0x6b, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x54, + 0x63, 0x70, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x64, 0x70, 0x10, 0x02, } var ( @@ -2814,7 +2828,7 @@ var file_signalling_proto_goTypes = []interface{}{ (*StationToDetector)(nil), // 28: proto.StationToDetector (*RegistrationResponse)(nil), // 29: proto.RegistrationResponse (*DnsResponse)(nil), // 30: proto.DnsResponse - (*anypb.Any)(nil), // 31: google.protobuf.Any + (*any.Any)(nil), // 31: google.protobuf.Any } var file_signalling_proto_depIdxs = []int32{ 0, // 0: proto.PubKey.type:type_name -> proto.KeyType diff --git a/proto/signalling.proto b/proto/signalling.proto index 28936f45..1870e0f4 100644 --- a/proto/signalling.proto +++ b/proto/signalling.proto @@ -360,6 +360,8 @@ message C2SWrapper { optional RegistrationResponse registration_response = 8; optional bytes RegRespBytes = 9; optional bytes RegRespSignature = 10; + + } message SessionStats { @@ -423,6 +425,10 @@ message RegistrationResponse { // Transport Params to if `allow_registrar_overrides` is set. optional google.protobuf.Any transport_params = 10; + + // PhantomsSupportPortRand is a flag that indicates whether the selected phantoms are able to + // handle phantom connections to randomized ports. + optional bool phantoms_support_port_rand = 11; } // response from dns diff --git a/proto/signalling.rs b/proto/signalling.rs index 22fee424..f70cc7c1 100644 --- a/proto/signalling.rs +++ b/proto/signalling.rs @@ -2301,14 +2301,214 @@ impl ::protobuf::reflect::ProtobufValue for WebRTCSignal { type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; } +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.Addr) +pub struct Addr { + // message fields + // @@protoc_insertion_point(field:proto.Addr.IP) + pub IP: ::std::option::Option<::std::vec::Vec>, + // @@protoc_insertion_point(field:proto.Addr.Port) + pub Port: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:proto.Addr.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a Addr { + fn default() -> &'a Addr { + ::default_instance() + } +} + +impl Addr { + pub fn new() -> Addr { + ::std::default::Default::default() + } + + // optional bytes IP = 1; + + pub fn IP(&self) -> &[u8] { + match self.IP.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_IP(&mut self) { + self.IP = ::std::option::Option::None; + } + + pub fn has_IP(&self) -> bool { + self.IP.is_some() + } + + // Param is passed by value, moved + pub fn set_IP(&mut self, v: ::std::vec::Vec) { + self.IP = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_IP(&mut self) -> &mut ::std::vec::Vec { + if self.IP.is_none() { + self.IP = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.IP.as_mut().unwrap() + } + + // Take field + pub fn take_IP(&mut self) -> ::std::vec::Vec { + self.IP.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional uint32 Port = 2; + + pub fn Port(&self) -> u32 { + self.Port.unwrap_or(0) + } + + pub fn clear_Port(&mut self) { + self.Port = ::std::option::Option::None; + } + + pub fn has_Port(&self) -> bool { + self.Port.is_some() + } + + // Param is passed by value, moved + pub fn set_Port(&mut self, v: u32) { + self.Port = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(2); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "IP", + |m: &Addr| { &m.IP }, + |m: &mut Addr| { &mut m.IP }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "Port", + |m: &Addr| { &m.Port }, + |m: &mut Addr| { &mut m.Port }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "Addr", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for Addr { + const NAME: &'static str = "Addr"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + self.IP = ::std::option::Option::Some(is.read_bytes()?); + }, + 16 => { + self.Port = ::std::option::Option::Some(is.read_uint32()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.IP.as_ref() { + my_size += ::protobuf::rt::bytes_size(1, &v); + } + if let Some(v) = self.Port { + my_size += ::protobuf::rt::uint32_size(2, v); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.IP.as_ref() { + os.write_bytes(1, v)?; + } + if let Some(v) = self.Port { + os.write_uint32(2, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> Addr { + Addr::new() + } + + fn clear(&mut self) { + self.IP = ::std::option::Option::None; + self.Port = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static Addr { + static instance: Addr = Addr { + IP: ::std::option::Option::None, + Port: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for Addr { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("Addr").unwrap()).clone() + } +} + +impl ::std::fmt::Display for Addr { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for Addr { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + #[derive(PartialEq,Clone,Default,Debug)] // @@protoc_insertion_point(message:proto.DTLSTransportParams) pub struct DTLSTransportParams { // message fields - // @@protoc_insertion_point(field:proto.DTLSTransportParams.src_port) - pub src_port: ::std::option::Option, + // @@protoc_insertion_point(field:proto.DTLSTransportParams.src_addr4) + pub src_addr4: ::protobuf::MessageField, + // @@protoc_insertion_point(field:proto.DTLSTransportParams.src_addr6) + pub src_addr6: ::protobuf::MessageField, // @@protoc_insertion_point(field:proto.DTLSTransportParams.randomize_dst_port) pub randomize_dst_port: ::std::option::Option, + /// Unordered sets the reliability of the DTLS stream to unordered + // @@protoc_insertion_point(field:proto.DTLSTransportParams.unordered) + pub unordered: ::std::option::Option, // special fields // @@protoc_insertion_point(special_field:proto.DTLSTransportParams.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -2325,57 +2525,67 @@ impl DTLSTransportParams { ::std::default::Default::default() } - // optional uint32 src_port = 1; + // optional bool randomize_dst_port = 3; - pub fn src_port(&self) -> u32 { - self.src_port.unwrap_or(0) + pub fn randomize_dst_port(&self) -> bool { + self.randomize_dst_port.unwrap_or(false) } - pub fn clear_src_port(&mut self) { - self.src_port = ::std::option::Option::None; + pub fn clear_randomize_dst_port(&mut self) { + self.randomize_dst_port = ::std::option::Option::None; } - pub fn has_src_port(&self) -> bool { - self.src_port.is_some() + pub fn has_randomize_dst_port(&self) -> bool { + self.randomize_dst_port.is_some() } // Param is passed by value, moved - pub fn set_src_port(&mut self, v: u32) { - self.src_port = ::std::option::Option::Some(v); + pub fn set_randomize_dst_port(&mut self, v: bool) { + self.randomize_dst_port = ::std::option::Option::Some(v); } - // optional bool randomize_dst_port = 2; + // optional bool unordered = 4; - pub fn randomize_dst_port(&self) -> bool { - self.randomize_dst_port.unwrap_or(false) + pub fn unordered(&self) -> bool { + self.unordered.unwrap_or(false) } - pub fn clear_randomize_dst_port(&mut self) { - self.randomize_dst_port = ::std::option::Option::None; + pub fn clear_unordered(&mut self) { + self.unordered = ::std::option::Option::None; } - pub fn has_randomize_dst_port(&self) -> bool { - self.randomize_dst_port.is_some() + pub fn has_unordered(&self) -> bool { + self.unordered.is_some() } // Param is passed by value, moved - pub fn set_randomize_dst_port(&mut self, v: bool) { - self.randomize_dst_port = ::std::option::Option::Some(v); + pub fn set_unordered(&mut self, v: bool) { + self.unordered = ::std::option::Option::Some(v); } fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { - let mut fields = ::std::vec::Vec::with_capacity(2); + let mut fields = ::std::vec::Vec::with_capacity(4); let mut oneofs = ::std::vec::Vec::with_capacity(0); - fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( - "src_port", - |m: &DTLSTransportParams| { &m.src_port }, - |m: &mut DTLSTransportParams| { &mut m.src_port }, + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Addr>( + "src_addr4", + |m: &DTLSTransportParams| { &m.src_addr4 }, + |m: &mut DTLSTransportParams| { &mut m.src_addr4 }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Addr>( + "src_addr6", + |m: &DTLSTransportParams| { &m.src_addr6 }, + |m: &mut DTLSTransportParams| { &mut m.src_addr6 }, )); fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( "randomize_dst_port", |m: &DTLSTransportParams| { &m.randomize_dst_port }, |m: &mut DTLSTransportParams| { &mut m.randomize_dst_port }, )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "unordered", + |m: &DTLSTransportParams| { &m.unordered }, + |m: &mut DTLSTransportParams| { &mut m.unordered }, + )); ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( "DTLSTransportParams", fields, @@ -2394,12 +2604,18 @@ impl ::protobuf::Message for DTLSTransportParams { fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { while let Some(tag) = is.read_raw_tag_or_eof()? { match tag { - 8 => { - self.src_port = ::std::option::Option::Some(is.read_uint32()?); + 10 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.src_addr4)?; }, - 16 => { + 18 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.src_addr6)?; + }, + 24 => { self.randomize_dst_port = ::std::option::Option::Some(is.read_bool()?); }, + 32 => { + self.unordered = ::std::option::Option::Some(is.read_bool()?); + }, tag => { ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; }, @@ -2412,23 +2628,37 @@ impl ::protobuf::Message for DTLSTransportParams { #[allow(unused_variables)] fn compute_size(&self) -> u64 { let mut my_size = 0; - if let Some(v) = self.src_port { - my_size += ::protobuf::rt::uint32_size(1, v); + if let Some(v) = self.src_addr4.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.src_addr6.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; } if let Some(v) = self.randomize_dst_port { my_size += 1 + 1; } + if let Some(v) = self.unordered { + my_size += 1 + 1; + } my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); self.special_fields.cached_size().set(my_size as u32); my_size } fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { - if let Some(v) = self.src_port { - os.write_uint32(1, v)?; + if let Some(v) = self.src_addr4.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?; + } + if let Some(v) = self.src_addr6.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?; } if let Some(v) = self.randomize_dst_port { - os.write_bool(2, v)?; + os.write_bool(3, v)?; + } + if let Some(v) = self.unordered { + os.write_bool(4, v)?; } os.write_unknown_fields(self.special_fields.unknown_fields())?; ::std::result::Result::Ok(()) @@ -2447,15 +2677,19 @@ impl ::protobuf::Message for DTLSTransportParams { } fn clear(&mut self) { - self.src_port = ::std::option::Option::None; + self.src_addr4.clear(); + self.src_addr6.clear(); self.randomize_dst_port = ::std::option::Option::None; + self.unordered = ::std::option::Option::None; self.special_fields.clear(); } fn default_instance() -> &'static DTLSTransportParams { static instance: DTLSTransportParams = DTLSTransportParams { - src_port: ::std::option::Option::None, + src_addr4: ::protobuf::MessageField::none(), + src_addr6: ::protobuf::MessageField::none(), randomize_dst_port: ::std::option::Option::None, + unordered: ::std::option::Option::None, special_fields: ::protobuf::SpecialFields::new(), }; &instance @@ -5524,6 +5758,10 @@ pub struct RegistrationResponse { /// Transport Params to if `allow_registrar_overrides` is set. // @@protoc_insertion_point(field:proto.RegistrationResponse.transport_params) pub transport_params: ::protobuf::MessageField<::protobuf::well_known_types::any::Any>, + /// PhantomsSupportPortRand is a flag that indicates whether the selected phantoms are able to + /// handle phantom connections to randomized ports. + // @@protoc_insertion_point(field:proto.RegistrationResponse.phantoms_support_port_rand) + pub phantoms_support_port_rand: ::std::option::Option, // special fields // @@protoc_insertion_point(special_field:proto.RegistrationResponse.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -5686,8 +5924,27 @@ impl RegistrationResponse { self.error.take().unwrap_or_else(|| ::std::string::String::new()) } + // optional bool phantoms_support_port_rand = 11; + + pub fn phantoms_support_port_rand(&self) -> bool { + self.phantoms_support_port_rand.unwrap_or(false) + } + + pub fn clear_phantoms_support_port_rand(&mut self) { + self.phantoms_support_port_rand = ::std::option::Option::None; + } + + pub fn has_phantoms_support_port_rand(&self) -> bool { + self.phantoms_support_port_rand.is_some() + } + + // Param is passed by value, moved + pub fn set_phantoms_support_port_rand(&mut self, v: bool) { + self.phantoms_support_port_rand = ::std::option::Option::Some(v); + } + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { - let mut fields = ::std::vec::Vec::with_capacity(7); + let mut fields = ::std::vec::Vec::with_capacity(8); let mut oneofs = ::std::vec::Vec::with_capacity(0); fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( "ipv4addr", @@ -5724,6 +5981,11 @@ impl RegistrationResponse { |m: &RegistrationResponse| { &m.transport_params }, |m: &mut RegistrationResponse| { &mut m.transport_params }, )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "phantoms_support_port_rand", + |m: &RegistrationResponse| { &m.phantoms_support_port_rand }, + |m: &mut RegistrationResponse| { &mut m.phantoms_support_port_rand }, + )); ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( "RegistrationResponse", fields, @@ -5773,6 +6035,9 @@ impl ::protobuf::Message for RegistrationResponse { 82 => { ::protobuf::rt::read_singular_message_into_field(is, &mut self.transport_params)?; }, + 88 => { + self.phantoms_support_port_rand = ::std::option::Option::Some(is.read_bool()?); + }, tag => { ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; }, @@ -5808,6 +6073,9 @@ impl ::protobuf::Message for RegistrationResponse { let len = v.compute_size(); my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; } + if let Some(v) = self.phantoms_support_port_rand { + my_size += 1 + 1; + } my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); self.special_fields.cached_size().set(my_size as u32); my_size @@ -5835,6 +6103,9 @@ impl ::protobuf::Message for RegistrationResponse { if let Some(v) = self.transport_params.as_ref() { ::protobuf::rt::write_message_field_with_cached_size(10, v, os)?; } + if let Some(v) = self.phantoms_support_port_rand { + os.write_bool(11, v)?; + } os.write_unknown_fields(self.special_fields.unknown_fields())?; ::std::result::Result::Ok(()) } @@ -5859,6 +6130,7 @@ impl ::protobuf::Message for RegistrationResponse { self.error = ::std::option::Option::None; self.clientConf.clear(); self.transport_params.clear(); + self.phantoms_support_port_rand = ::std::option::Option::None; self.special_fields.clear(); } @@ -5871,6 +6143,7 @@ impl ::protobuf::Message for RegistrationResponse { error: ::std::option::Option::None, clientConf: ::protobuf::MessageField::none(), transport_params: ::protobuf::MessageField::none(), + phantoms_support_port_rand: ::std::option::Option::None, special_fields: ::protobuf::SpecialFields::new(), }; &instance @@ -6806,211 +7079,216 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \x01\x20\x02(\rR\x04type\x129\n\ncandidates\x18\x02\x20\x03(\x0b2\x19.pr\ oto.WebRTCICECandidateR\ncandidates\"F\n\x0cWebRTCSignal\x12\x12\n\x04se\ ed\x18\x01\x20\x02(\tR\x04seed\x12\"\n\x03sdp\x18\x02\x20\x02(\x0b2\x10.\ - proto.WebRTCSDPR\x03sdp\"^\n\x13DTLSTransportParams\x12\x19\n\x08src_por\ - t\x18\x01\x20\x01(\rR\x07srcPort\x12,\n\x12randomize_dst_port\x18\x02\ - \x20\x01(\x08R\x10randomizeDstPort\"\xc2\x02\n\x0fStationToClient\x12)\n\ - \x10protocol_version\x18\x01\x20\x01(\rR\x0fprotocolVersion\x12@\n\x10st\ - ate_transition\x18\x02\x20\x01(\x0e2\x15.proto.S2C_TransitionR\x0fstateT\ - ransition\x122\n\x0bconfig_info\x18\x03\x20\x01(\x0b2\x11.proto.ClientCo\ - nfR\nconfigInfo\x124\n\nerr_reason\x18\x04\x20\x01(\x0e2\x15.proto.Error\ - ReasonS2CR\terrReason\x12\x1f\n\x0btmp_backoff\x18\x05\x20\x01(\rR\ntmpB\ - ackoff\x12\x1d\n\nstation_id\x18\x06\x20\x01(\tR\tstationId\x12\x18\n\ - \x07padding\x18d\x20\x01(\x0cR\x07padding\"\xaf\x01\n\x11RegistrationFla\ - gs\x12\x1f\n\x0bupload_only\x18\x01\x20\x01(\x08R\nuploadOnly\x12\x1d\n\ - \ndark_decoy\x18\x02\x20\x01(\x08R\tdarkDecoy\x12!\n\x0cproxy_header\x18\ - \x03\x20\x01(\x08R\x0bproxyHeader\x12\x17\n\x07use_TIL\x18\x04\x20\x01(\ - \x08R\x06useTIL\x12\x1e\n\nprescanned\x18\x05\x20\x01(\x08R\nprescanned\ - \"\xa8\x06\n\x0fClientToStation\x12)\n\x10protocol_version\x18\x01\x20\ - \x01(\rR\x0fprotocolVersion\x122\n\x15decoy_list_generation\x18\x02\x20\ - \x01(\rR\x13decoyListGeneration\x12@\n\x10state_transition\x18\x03\x20\ - \x01(\x0e2\x15.proto.C2S_TransitionR\x0fstateTransition\x12\x1f\n\x0bupl\ - oad_sync\x18\x04\x20\x01(\x04R\nuploadSync\x12,\n\x12client_lib_version\ - \x18\x05\x20\x01(\rR\x10clientLibVersion\x12>\n\x1bdisable_registrar_ove\ - rrides\x18\x06\x20\x01(\x08R\x19disableRegistrarOverrides\x12#\n\rfailed\ - _decoys\x18\n\x20\x03(\tR\x0cfailedDecoys\x12)\n\x05stats\x18\x0b\x20\ - \x01(\x0b2\x13.proto.SessionStatsR\x05stats\x122\n\ttransport\x18\x0c\ - \x20\x01(\x0e2\x14.proto.TransportTypeR\ttransport\x12?\n\x10transport_p\ - arams\x18\r\x20\x01(\x0b2\x14.google.protobuf.AnyR\x0ftransportParams\ - \x12%\n\x0ecovert_address\x18\x14\x20\x01(\tR\rcovertAddress\x127\n\x18m\ - asked_decoy_server_name\x18\x15\x20\x01(\tR\x15maskedDecoyServerName\x12\ - \x1d\n\nv6_support\x18\x16\x20\x01(\x08R\tv6Support\x12\x1d\n\nv4_suppor\ - t\x18\x17\x20\x01(\x08R\tv4Support\x12.\n\x05flags\x18\x18\x20\x01(\x0b2\ - \x18.proto.RegistrationFlagsR\x05flags\x128\n\rwebrtc_signal\x18\x1f\x20\ - \x01(\x0b2\x13.proto.WebRTCSignalR\x0cwebrtcSignal\x12\x18\n\x07padding\ - \x18d\x20\x01(\x0cR\x07padding\"\xaa\x01\n\x15PrefixTransportParams\x12\ - \x1b\n\tprefix_id\x18\x01\x20\x01(\x05R\x08prefixId\x12\x16\n\x06prefix\ - \x18\x02\x20\x01(\x0cR\x06prefix\x12.\n\x13custom_flush_policy\x18\x03\ - \x20\x01(\x05R\x11customFlushPolicy\x12,\n\x12randomize_dst_port\x18\r\ - \x20\x01(\x08R\x10randomizeDstPort\"F\n\x16GenericTransportParams\x12,\n\ - \x12randomize_dst_port\x18\r\x20\x01(\x08R\x10randomizeDstPort\"\xc2\x03\ - \n\nC2SWrapper\x12#\n\rshared_secret\x18\x01\x20\x01(\x0cR\x0csharedSecr\ - et\x12I\n\x14registration_payload\x18\x03\x20\x01(\x0b2\x16.proto.Client\ - ToStationR\x13registrationPayload\x12J\n\x13registration_source\x18\x04\ - \x20\x01(\x0e2\x19.proto.RegistrationSourceR\x12registrationSource\x121\ - \n\x14registration_address\x18\x06\x20\x01(\x0cR\x13registrationAddress\ - \x12#\n\rdecoy_address\x18\x07\x20\x01(\x0cR\x0cdecoyAddress\x12P\n\x15r\ - egistration_response\x18\x08\x20\x01(\x0b2\x1b.proto.RegistrationRespons\ - eR\x14registrationResponse\x12\"\n\x0cRegRespBytes\x18\t\x20\x01(\x0cR\ - \x0cRegRespBytes\x12*\n\x10RegRespSignature\x18\n\x20\x01(\x0cR\x10RegRe\ - spSignature\"\xdd\x01\n\x0cSessionStats\x120\n\x14failed_decoys_amount\ - \x18\x14\x20\x01(\rR\x12failedDecoysAmount\x121\n\x15total_time_to_conne\ - ct\x18\x1f\x20\x01(\rR\x12totalTimeToConnect\x12$\n\x0ertt_to_station\ - \x18!\x20\x01(\rR\x0crttToStation\x12\x20\n\x0ctls_to_decoy\x18&\x20\x01\ - (\rR\ntlsToDecoy\x12\x20\n\x0ctcp_to_decoy\x18'\x20\x01(\rR\ntcpToDecoy\ - \"\x82\x02\n\x11StationToDetector\x12\x1d\n\nphantom_ip\x18\x01\x20\x01(\ - \tR\tphantomIp\x12\x1b\n\tclient_ip\x18\x02\x20\x01(\tR\x08clientIp\x12\ - \x1d\n\ntimeout_ns\x18\x03\x20\x01(\x04R\ttimeoutNs\x126\n\toperation\ - \x18\x04\x20\x01(\x0e2\x18.proto.StationOperationsR\toperation\x12\x19\n\ - \x08dst_port\x18\n\x20\x01(\rR\x07dstPort\x12\x19\n\x08src_port\x18\x0b\ - \x20\x01(\rR\x07srcPort\x12$\n\x05proto\x18\x0c\x20\x01(\x0e2\x0e.proto.\ - IPProtoR\x05proto\"\x97\x02\n\x14RegistrationResponse\x12\x1a\n\x08ipv4a\ - ddr\x18\x01\x20\x01(\x07R\x08ipv4addr\x12\x1a\n\x08ipv6addr\x18\x02\x20\ - \x01(\x0cR\x08ipv6addr\x12\x19\n\x08dst_port\x18\x03\x20\x01(\rR\x07dstP\ - ort\x12\"\n\x0cserverRandom\x18\x04\x20\x01(\x0cR\x0cserverRandom\x12\ - \x14\n\x05error\x18\x05\x20\x01(\tR\x05error\x121\n\nclientConf\x18\x06\ - \x20\x01(\x0b2\x11.proto.ClientConfR\nclientConf\x12?\n\x10transport_par\ - ams\x18\n\x20\x01(\x0b2\x14.google.protobuf.AnyR\x0ftransportParams\"\ - \xac\x01\n\x0bDnsResponse\x12\x18\n\x07success\x18\x01\x20\x01(\x08R\x07\ - success\x12/\n\x13clientconf_outdated\x18\x02\x20\x01(\x08R\x12clientcon\ - fOutdated\x12R\n\x16bidirectional_response\x18\x03\x20\x01(\x0b2\x1b.pro\ - to.RegistrationResponseR\x15bidirectionalResponse*+\n\x07KeyType\x12\x0f\ - \n\x0bAES_GCM_128\x10Z\x12\x0f\n\x0bAES_GCM_256\x10[*)\n\x0cDnsRegMethod\ - \x12\x07\n\x03UDP\x10\x01\x12\x07\n\x03DOT\x10\x02\x12\x07\n\x03DOH\x10\ - \x03*\xe7\x01\n\x0eC2S_Transition\x12\x11\n\rC2S_NO_CHANGE\x10\0\x12\x14\ - \n\x10C2S_SESSION_INIT\x10\x01\x12\x1b\n\x17C2S_SESSION_COVERT_INIT\x10\ - \x0b\x12\x18\n\x14C2S_EXPECT_RECONNECT\x10\x02\x12\x15\n\x11C2S_SESSION_\ - CLOSE\x10\x03\x12\x14\n\x10C2S_YIELD_UPLOAD\x10\x04\x12\x16\n\x12C2S_ACQ\ - UIRE_UPLOAD\x10\x05\x12\x20\n\x1cC2S_EXPECT_UPLOADONLY_RECONN\x10\x06\ - \x12\x0e\n\tC2S_ERROR\x10\xff\x01*\x98\x01\n\x0eS2C_Transition\x12\x11\n\ - \rS2C_NO_CHANGE\x10\0\x12\x14\n\x10S2C_SESSION_INIT\x10\x01\x12\x1b\n\ - \x17S2C_SESSION_COVERT_INIT\x10\x0b\x12\x19\n\x15S2C_CONFIRM_RECONNECT\ - \x10\x02\x12\x15\n\x11S2C_SESSION_CLOSE\x10\x03\x12\x0e\n\tS2C_ERROR\x10\ - \xff\x01*\xac\x01\n\x0eErrorReasonS2C\x12\x0c\n\x08NO_ERROR\x10\0\x12\ - \x11\n\rCOVERT_STREAM\x10\x01\x12\x13\n\x0fCLIENT_REPORTED\x10\x02\x12\ - \x13\n\x0fCLIENT_PROTOCOL\x10\x03\x12\x14\n\x10STATION_INTERNAL\x10\x04\ - \x12\x12\n\x0eDECOY_OVERLOAD\x10\x05\x12\x11\n\rCLIENT_STREAM\x10d\x12\ - \x12\n\x0eCLIENT_TIMEOUT\x10e*\x82\x01\n\rTransportType\x12\x08\n\x04Nul\ - l\x10\0\x12\x07\n\x03Min\x10\x01\x12\t\n\x05Obfs4\x10\x02\x12\x08\n\x04D\ - TLS\x10\x03\x12\n\n\x06Prefix\x10\x04\x12\x08\n\x04uTLS\x10\x05\x12\n\n\ - \x06Format\x10\x06\x12\x08\n\x04WASM\x10\x07\x12\x07\n\x03FTE\x10\x08\ - \x12\x08\n\x04Quic\x10\t\x12\n\n\x06Webrtc\x10c*\x86\x01\n\x12Registrati\ - onSource\x12\x0f\n\x0bUnspecified\x10\0\x12\x0c\n\x08Detector\x10\x01\ - \x12\x07\n\x03API\x10\x02\x12\x13\n\x0fDetectorPrescan\x10\x03\x12\x14\n\ - \x10BidirectionalAPI\x10\x04\x12\x07\n\x03DNS\x10\x05\x12\x14\n\x10Bidir\ - ectionalDNS\x10\x06*@\n\x11StationOperations\x12\x0b\n\x07Unknown\x10\0\ - \x12\x07\n\x03New\x10\x01\x12\n\n\x06Update\x10\x02\x12\t\n\x05Clear\x10\ - \x03*$\n\x07IPProto\x12\x07\n\x03Unk\x10\0\x12\x07\n\x03Tcp\x10\x01\x12\ - \x07\n\x03Udp\x10\x02J\x81\x90\x01\n\x07\x12\x05\0\0\xa8\x03\x01\n\x08\n\ - \x01\x0c\x12\x03\0\0\x12\n\xb0\x01\n\x01\x02\x12\x03\x06\0\x0e2\xa5\x01\ - \x20TODO:\x20We're\x20using\x20proto2\x20because\x20it's\x20the\x20defau\ - lt\x20on\x20Ubuntu\x2016.04.\n\x20At\x20some\x20point\x20we\x20will\x20w\ - ant\x20to\x20migrate\x20to\x20proto3,\x20but\x20we\x20are\x20not\n\x20us\ - ing\x20any\x20proto3\x20features\x20yet.\n\n\t\n\x02\x03\0\x12\x03\x08\0\ - #\n\n\n\x02\x05\0\x12\x04\n\0\r\x01\n\n\n\x03\x05\0\x01\x12\x03\n\x05\ - \x0c\n\x0b\n\x04\x05\0\x02\0\x12\x03\x0b\x04\x15\n\x0c\n\x05\x05\0\x02\0\ - \x01\x12\x03\x0b\x04\x0f\n\x0c\n\x05\x05\0\x02\0\x02\x12\x03\x0b\x12\x14\ - \n\x20\n\x04\x05\0\x02\x01\x12\x03\x0c\x04\x15\"\x13\x20not\x20supported\ - \x20atm\n\n\x0c\n\x05\x05\0\x02\x01\x01\x12\x03\x0c\x04\x0f\n\x0c\n\x05\ - \x05\0\x02\x01\x02\x12\x03\x0c\x12\x14\n\n\n\x02\x04\0\x12\x04\x0f\0\x14\ - \x01\n\n\n\x03\x04\0\x01\x12\x03\x0f\x08\x0e\n4\n\x04\x04\0\x02\0\x12\ - \x03\x11\x04\x1b\x1a'\x20A\x20public\x20key,\x20as\x20used\x20by\x20the\ - \x20station.\n\n\x0c\n\x05\x04\0\x02\0\x04\x12\x03\x11\x04\x0c\n\x0c\n\ - \x05\x04\0\x02\0\x05\x12\x03\x11\r\x12\n\x0c\n\x05\x04\0\x02\0\x01\x12\ - \x03\x11\x13\x16\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x11\x19\x1a\n\x0b\n\ - \x04\x04\0\x02\x01\x12\x03\x13\x04\x1e\n\x0c\n\x05\x04\0\x02\x01\x04\x12\ - \x03\x13\x04\x0c\n\x0c\n\x05\x04\0\x02\x01\x06\x12\x03\x13\r\x14\n\x0c\n\ - \x05\x04\0\x02\x01\x01\x12\x03\x13\x15\x19\n\x0c\n\x05\x04\0\x02\x01\x03\ - \x12\x03\x13\x1c\x1d\n\n\n\x02\x04\x01\x12\x04\x16\0<\x01\n\n\n\x03\x04\ - \x01\x01\x12\x03\x16\x08\x14\n\xa1\x01\n\x04\x04\x01\x02\0\x12\x03\x1b\ - \x04!\x1a\x93\x01\x20The\x20hostname/SNI\x20to\x20use\x20for\x20this\x20\ - host\n\n\x20The\x20hostname\x20is\x20the\x20only\x20required\x20field,\ - \x20although\x20other\n\x20fields\x20are\x20expected\x20to\x20be\x20pres\ - ent\x20in\x20most\x20cases.\n\n\x0c\n\x05\x04\x01\x02\0\x04\x12\x03\x1b\ - \x04\x0c\n\x0c\n\x05\x04\x01\x02\0\x05\x12\x03\x1b\r\x13\n\x0c\n\x05\x04\ - \x01\x02\0\x01\x12\x03\x1b\x14\x1c\n\x0c\n\x05\x04\x01\x02\0\x03\x12\x03\ - \x1b\x1f\x20\n\xf7\x01\n\x04\x04\x01\x02\x01\x12\x03\"\x04\"\x1a\xe9\x01\ - \x20The\x2032-bit\x20ipv4\x20address,\x20in\x20network\x20byte\x20order\ - \n\n\x20If\x20the\x20IPv4\x20address\x20is\x20absent,\x20then\x20it\x20m\ - ay\x20be\x20resolved\x20via\n\x20DNS\x20by\x20the\x20client,\x20or\x20th\ - e\x20client\x20may\x20discard\x20this\x20decoy\x20spec\n\x20if\x20local\ - \x20DNS\x20is\x20untrusted,\x20or\x20the\x20service\x20may\x20be\x20mult\ - ihomed.\n\n\x0c\n\x05\x04\x01\x02\x01\x04\x12\x03\"\x04\x0c\n\x0c\n\x05\ - \x04\x01\x02\x01\x05\x12\x03\"\r\x14\n\x0c\n\x05\x04\x01\x02\x01\x01\x12\ - \x03\"\x15\x1d\n\x0c\n\x05\x04\x01\x02\x01\x03\x12\x03\"\x20!\n>\n\x04\ - \x04\x01\x02\x02\x12\x03%\x04\x20\x1a1\x20The\x20128-bit\x20ipv6\x20addr\ - ess,\x20in\x20network\x20byte\x20order\n\n\x0c\n\x05\x04\x01\x02\x02\x04\ - \x12\x03%\x04\x0c\n\x0c\n\x05\x04\x01\x02\x02\x05\x12\x03%\r\x12\n\x0c\n\ - \x05\x04\x01\x02\x02\x01\x12\x03%\x13\x1b\n\x0c\n\x05\x04\x01\x02\x02\ - \x03\x12\x03%\x1e\x1f\n\x91\x01\n\x04\x04\x01\x02\x03\x12\x03+\x04\x1f\ - \x1a\x83\x01\x20The\x20Tapdance\x20station\x20public\x20key\x20to\x20use\ - \x20when\x20contacting\x20this\n\x20decoy\n\n\x20If\x20omitted,\x20the\ - \x20default\x20station\x20public\x20key\x20(if\x20any)\x20is\x20used.\n\ - \n\x0c\n\x05\x04\x01\x02\x03\x04\x12\x03+\x04\x0c\n\x0c\n\x05\x04\x01\ - \x02\x03\x06\x12\x03+\r\x13\n\x0c\n\x05\x04\x01\x02\x03\x01\x12\x03+\x14\ - \x1a\n\x0c\n\x05\x04\x01\x02\x03\x03\x12\x03+\x1d\x1e\n\xee\x01\n\x04\ - \x04\x01\x02\x04\x12\x032\x04\x20\x1a\xe0\x01\x20The\x20maximum\x20durat\ - ion,\x20in\x20milliseconds,\x20to\x20maintain\x20an\x20open\n\x20connect\ - ion\x20to\x20this\x20decoy\x20(because\x20the\x20decoy\x20may\x20close\ - \x20the\n\x20connection\x20itself\x20after\x20this\x20length\x20of\x20ti\ - me)\n\n\x20If\x20omitted,\x20a\x20default\x20of\x2030,000\x20millisecond\ - s\x20is\x20assumed.\n\n\x0c\n\x05\x04\x01\x02\x04\x04\x12\x032\x04\x0c\n\ - \x0c\n\x05\x04\x01\x02\x04\x05\x12\x032\r\x13\n\x0c\n\x05\x04\x01\x02\ - \x04\x01\x12\x032\x14\x1b\n\x0c\n\x05\x04\x01\x02\x04\x03\x12\x032\x1e\ - \x1f\n\xb0\x02\n\x04\x04\x01\x02\x05\x12\x03;\x04\x1f\x1a\xa2\x02\x20The\ - \x20maximum\x20TCP\x20window\x20size\x20to\x20attempt\x20to\x20use\x20fo\ - r\x20this\x20decoy.\n\n\x20If\x20omitted,\x20a\x20default\x20of\x2015360\ - \x20is\x20assumed.\n\n\x20TODO:\x20the\x20default\x20is\x20based\x20on\ - \x20the\x20current\x20heuristic\x20of\x20only\n\x20using\x20decoys\x20th\ - at\x20permit\x20windows\x20of\x2015KB\x20or\x20larger.\x20\x20If\x20this\ - \n\x20heuristic\x20changes,\x20then\x20this\x20default\x20doesn't\x20mak\ - e\x20sense.\n\n\x0c\n\x05\x04\x01\x02\x05\x04\x12\x03;\x04\x0c\n\x0c\n\ - \x05\x04\x01\x02\x05\x05\x12\x03;\r\x13\n\x0c\n\x05\x04\x01\x02\x05\x01\ - \x12\x03;\x14\x1a\n\x0c\n\x05\x04\x01\x02\x05\x03\x12\x03;\x1d\x1e\n\x83\ - \x08\n\x02\x04\x02\x12\x04S\0Z\x012\xf6\x07\x20In\x20version\x201,\x20th\ - e\x20request\x20is\x20very\x20simple:\x20when\n\x20the\x20client\x20send\ - s\x20a\x20MSG_PROTO\x20to\x20the\x20station,\x20if\x20the\n\x20generatio\ - n\x20number\x20is\x20present,\x20then\x20this\x20request\x20includes\n\ - \x20(in\x20addition\x20to\x20whatever\x20other\x20operations\x20are\x20p\ - art\x20of\x20the\n\x20request)\x20a\x20request\x20for\x20the\x20station\ - \x20to\x20send\x20a\x20copy\x20of\n\x20the\x20current\x20decoy\x20set\ - \x20that\x20has\x20a\x20generation\x20number\x20greater\n\x20than\x20the\ - \x20generation\x20number\x20in\x20its\x20request.\n\n\x20If\x20the\x20re\ - sponse\x20contains\x20a\x20DecoyListUpdate\x20with\x20a\x20generation\ - \x20number\x20equal\n\x20to\x20that\x20which\x20the\x20client\x20sent,\ - \x20then\x20the\x20client\x20is\x20\"caught\x20up\"\x20with\n\x20the\x20\ - station\x20and\x20the\x20response\x20contains\x20no\x20new\x20informatio\ - n\n\x20(and\x20all\x20other\x20fields\x20may\x20be\x20omitted\x20or\x20e\ - mpty).\x20\x20Otherwise,\n\x20the\x20station\x20will\x20send\x20the\x20l\ - atest\x20configuration\x20information,\n\x20along\x20with\x20its\x20gene\ - ration\x20number.\n\n\x20The\x20station\x20can\x20also\x20send\x20Client\ - Conf\x20messages\n\x20(as\x20part\x20of\x20Station2Client\x20messages)\ - \x20whenever\x20it\x20wants.\n\x20The\x20client\x20is\x20expected\x20to\ - \x20react\x20as\x20if\x20it\x20had\x20requested\n\x20such\x20messages\ - \x20--\x20possibly\x20by\x20ignoring\x20them,\x20if\x20the\x20client\n\ - \x20is\x20already\x20up-to-date\x20according\x20to\x20the\x20generation\ - \x20number.\n\n\n\n\x03\x04\x02\x01\x12\x03S\x08\x12\n\x0b\n\x04\x04\x02\ - \x02\0\x12\x03T\x04&\n\x0c\n\x05\x04\x02\x02\0\x04\x12\x03T\x04\x0c\n\ - \x0c\n\x05\x04\x02\x02\0\x06\x12\x03T\r\x16\n\x0c\n\x05\x04\x02\x02\0\ - \x01\x12\x03T\x17!\n\x0c\n\x05\x04\x02\x02\0\x03\x12\x03T$%\n\x0b\n\x04\ - \x04\x02\x02\x01\x12\x03U\x04#\n\x0c\n\x05\x04\x02\x02\x01\x04\x12\x03U\ - \x04\x0c\n\x0c\n\x05\x04\x02\x02\x01\x05\x12\x03U\r\x13\n\x0c\n\x05\x04\ - \x02\x02\x01\x01\x12\x03U\x14\x1e\n\x0c\n\x05\x04\x02\x02\x01\x03\x12\ - \x03U!\"\n\x0b\n\x04\x04\x02\x02\x02\x12\x03V\x04'\n\x0c\n\x05\x04\x02\ - \x02\x02\x04\x12\x03V\x04\x0c\n\x0c\n\x05\x04\x02\x02\x02\x06\x12\x03V\r\ - \x13\n\x0c\n\x05\x04\x02\x02\x02\x01\x12\x03V\x14\"\n\x0c\n\x05\x04\x02\ - \x02\x02\x03\x12\x03V%&\n\x0b\n\x04\x04\x02\x02\x03\x12\x03W\x049\n\x0c\ - \n\x05\x04\x02\x02\x03\x04\x12\x03W\x04\x0c\n\x0c\n\x05\x04\x02\x02\x03\ - \x06\x12\x03W\r\x1f\n\x0c\n\x05\x04\x02\x02\x03\x01\x12\x03W\x204\n\x0c\ - \n\x05\x04\x02\x02\x03\x03\x12\x03W78\n\x0b\n\x04\x04\x02\x02\x04\x12\ - \x03X\x04'\n\x0c\n\x05\x04\x02\x02\x04\x04\x12\x03X\x04\x0c\n\x0c\n\x05\ - \x04\x02\x02\x04\x06\x12\x03X\r\x13\n\x0c\n\x05\x04\x02\x02\x04\x01\x12\ - \x03X\x14\"\n\x0c\n\x05\x04\x02\x02\x04\x03\x12\x03X%&\n\x0b\n\x04\x04\ - \x02\x02\x05\x12\x03Y\x04)\n\x0c\n\x05\x04\x02\x02\x05\x04\x12\x03Y\x04\ - \x0c\n\x0c\n\x05\x04\x02\x02\x05\x06\x12\x03Y\r\x17\n\x0c\n\x05\x04\x02\ - \x02\x05\x01\x12\x03Y\x18$\n\x0c\n\x05\x04\x02\x02\x05\x03\x12\x03Y'(\n-\ - \n\x02\x04\x03\x12\x04]\0d\x01\x1a!\x20Configuration\x20for\x20DNS\x20re\ - gistrar\n\n\n\n\x03\x04\x03\x01\x12\x03]\x08\x12\n\x0b\n\x04\x04\x03\x02\ - \0\x12\x03^\x04-\n\x0c\n\x05\x04\x03\x02\0\x04\x12\x03^\x04\x0c\n\x0c\n\ + proto.WebRTCSDPR\x03sdp\"*\n\x04Addr\x12\x0e\n\x02IP\x18\x01\x20\x01(\ + \x0cR\x02IP\x12\x12\n\x04Port\x18\x02\x20\x01(\rR\x04Port\"\xb5\x01\n\ + \x13DTLSTransportParams\x12(\n\tsrc_addr4\x18\x01\x20\x01(\x0b2\x0b.prot\ + o.AddrR\x08srcAddr4\x12(\n\tsrc_addr6\x18\x02\x20\x01(\x0b2\x0b.proto.Ad\ + drR\x08srcAddr6\x12,\n\x12randomize_dst_port\x18\x03\x20\x01(\x08R\x10ra\ + ndomizeDstPort\x12\x1c\n\tunordered\x18\x04\x20\x01(\x08R\tunordered\"\ + \xc2\x02\n\x0fStationToClient\x12)\n\x10protocol_version\x18\x01\x20\x01\ + (\rR\x0fprotocolVersion\x12@\n\x10state_transition\x18\x02\x20\x01(\x0e2\ + \x15.proto.S2C_TransitionR\x0fstateTransition\x122\n\x0bconfig_info\x18\ + \x03\x20\x01(\x0b2\x11.proto.ClientConfR\nconfigInfo\x124\n\nerr_reason\ + \x18\x04\x20\x01(\x0e2\x15.proto.ErrorReasonS2CR\terrReason\x12\x1f\n\ + \x0btmp_backoff\x18\x05\x20\x01(\rR\ntmpBackoff\x12\x1d\n\nstation_id\ + \x18\x06\x20\x01(\tR\tstationId\x12\x18\n\x07padding\x18d\x20\x01(\x0cR\ + \x07padding\"\xaf\x01\n\x11RegistrationFlags\x12\x1f\n\x0bupload_only\ + \x18\x01\x20\x01(\x08R\nuploadOnly\x12\x1d\n\ndark_decoy\x18\x02\x20\x01\ + (\x08R\tdarkDecoy\x12!\n\x0cproxy_header\x18\x03\x20\x01(\x08R\x0bproxyH\ + eader\x12\x17\n\x07use_TIL\x18\x04\x20\x01(\x08R\x06useTIL\x12\x1e\n\npr\ + escanned\x18\x05\x20\x01(\x08R\nprescanned\"\xa8\x06\n\x0fClientToStatio\ + n\x12)\n\x10protocol_version\x18\x01\x20\x01(\rR\x0fprotocolVersion\x122\ + \n\x15decoy_list_generation\x18\x02\x20\x01(\rR\x13decoyListGeneration\ + \x12@\n\x10state_transition\x18\x03\x20\x01(\x0e2\x15.proto.C2S_Transiti\ + onR\x0fstateTransition\x12\x1f\n\x0bupload_sync\x18\x04\x20\x01(\x04R\nu\ + ploadSync\x12,\n\x12client_lib_version\x18\x05\x20\x01(\rR\x10clientLibV\ + ersion\x12>\n\x1bdisable_registrar_overrides\x18\x06\x20\x01(\x08R\x19di\ + sableRegistrarOverrides\x12#\n\rfailed_decoys\x18\n\x20\x03(\tR\x0cfaile\ + dDecoys\x12)\n\x05stats\x18\x0b\x20\x01(\x0b2\x13.proto.SessionStatsR\ + \x05stats\x122\n\ttransport\x18\x0c\x20\x01(\x0e2\x14.proto.TransportTyp\ + eR\ttransport\x12?\n\x10transport_params\x18\r\x20\x01(\x0b2\x14.google.\ + protobuf.AnyR\x0ftransportParams\x12%\n\x0ecovert_address\x18\x14\x20\ + \x01(\tR\rcovertAddress\x127\n\x18masked_decoy_server_name\x18\x15\x20\ + \x01(\tR\x15maskedDecoyServerName\x12\x1d\n\nv6_support\x18\x16\x20\x01(\ + \x08R\tv6Support\x12\x1d\n\nv4_support\x18\x17\x20\x01(\x08R\tv4Support\ + \x12.\n\x05flags\x18\x18\x20\x01(\x0b2\x18.proto.RegistrationFlagsR\x05f\ + lags\x128\n\rwebrtc_signal\x18\x1f\x20\x01(\x0b2\x13.proto.WebRTCSignalR\ + \x0cwebrtcSignal\x12\x18\n\x07padding\x18d\x20\x01(\x0cR\x07padding\"\ + \xaa\x01\n\x15PrefixTransportParams\x12\x1b\n\tprefix_id\x18\x01\x20\x01\ + (\x05R\x08prefixId\x12\x16\n\x06prefix\x18\x02\x20\x01(\x0cR\x06prefix\ + \x12.\n\x13custom_flush_policy\x18\x03\x20\x01(\x05R\x11customFlushPolic\ + y\x12,\n\x12randomize_dst_port\x18\r\x20\x01(\x08R\x10randomizeDstPort\"\ + F\n\x16GenericTransportParams\x12,\n\x12randomize_dst_port\x18\r\x20\x01\ + (\x08R\x10randomizeDstPort\"\xc2\x03\n\nC2SWrapper\x12#\n\rshared_secret\ + \x18\x01\x20\x01(\x0cR\x0csharedSecret\x12I\n\x14registration_payload\ + \x18\x03\x20\x01(\x0b2\x16.proto.ClientToStationR\x13registrationPayload\ + \x12J\n\x13registration_source\x18\x04\x20\x01(\x0e2\x19.proto.Registrat\ + ionSourceR\x12registrationSource\x121\n\x14registration_address\x18\x06\ + \x20\x01(\x0cR\x13registrationAddress\x12#\n\rdecoy_address\x18\x07\x20\ + \x01(\x0cR\x0cdecoyAddress\x12P\n\x15registration_response\x18\x08\x20\ + \x01(\x0b2\x1b.proto.RegistrationResponseR\x14registrationResponse\x12\"\ + \n\x0cRegRespBytes\x18\t\x20\x01(\x0cR\x0cRegRespBytes\x12*\n\x10RegResp\ + Signature\x18\n\x20\x01(\x0cR\x10RegRespSignature\"\xdd\x01\n\x0cSession\ + Stats\x120\n\x14failed_decoys_amount\x18\x14\x20\x01(\rR\x12failedDecoys\ + Amount\x121\n\x15total_time_to_connect\x18\x1f\x20\x01(\rR\x12totalTimeT\ + oConnect\x12$\n\x0ertt_to_station\x18!\x20\x01(\rR\x0crttToStation\x12\ + \x20\n\x0ctls_to_decoy\x18&\x20\x01(\rR\ntlsToDecoy\x12\x20\n\x0ctcp_to_\ + decoy\x18'\x20\x01(\rR\ntcpToDecoy\"\x82\x02\n\x11StationToDetector\x12\ + \x1d\n\nphantom_ip\x18\x01\x20\x01(\tR\tphantomIp\x12\x1b\n\tclient_ip\ + \x18\x02\x20\x01(\tR\x08clientIp\x12\x1d\n\ntimeout_ns\x18\x03\x20\x01(\ + \x04R\ttimeoutNs\x126\n\toperation\x18\x04\x20\x01(\x0e2\x18.proto.Stati\ + onOperationsR\toperation\x12\x19\n\x08dst_port\x18\n\x20\x01(\rR\x07dstP\ + ort\x12\x19\n\x08src_port\x18\x0b\x20\x01(\rR\x07srcPort\x12$\n\x05proto\ + \x18\x0c\x20\x01(\x0e2\x0e.proto.IPProtoR\x05proto\"\xd4\x02\n\x14Regist\ + rationResponse\x12\x1a\n\x08ipv4addr\x18\x01\x20\x01(\x07R\x08ipv4addr\ + \x12\x1a\n\x08ipv6addr\x18\x02\x20\x01(\x0cR\x08ipv6addr\x12\x19\n\x08ds\ + t_port\x18\x03\x20\x01(\rR\x07dstPort\x12\"\n\x0cserverRandom\x18\x04\ + \x20\x01(\x0cR\x0cserverRandom\x12\x14\n\x05error\x18\x05\x20\x01(\tR\ + \x05error\x121\n\nclientConf\x18\x06\x20\x01(\x0b2\x11.proto.ClientConfR\ + \nclientConf\x12?\n\x10transport_params\x18\n\x20\x01(\x0b2\x14.google.p\ + rotobuf.AnyR\x0ftransportParams\x12;\n\x1aphantoms_support_port_rand\x18\ + \x0b\x20\x01(\x08R\x17phantomsSupportPortRand\"\xac\x01\n\x0bDnsResponse\ + \x12\x18\n\x07success\x18\x01\x20\x01(\x08R\x07success\x12/\n\x13clientc\ + onf_outdated\x18\x02\x20\x01(\x08R\x12clientconfOutdated\x12R\n\x16bidir\ + ectional_response\x18\x03\x20\x01(\x0b2\x1b.proto.RegistrationResponseR\ + \x15bidirectionalResponse*+\n\x07KeyType\x12\x0f\n\x0bAES_GCM_128\x10Z\ + \x12\x0f\n\x0bAES_GCM_256\x10[*)\n\x0cDnsRegMethod\x12\x07\n\x03UDP\x10\ + \x01\x12\x07\n\x03DOT\x10\x02\x12\x07\n\x03DOH\x10\x03*\xe7\x01\n\x0eC2S\ + _Transition\x12\x11\n\rC2S_NO_CHANGE\x10\0\x12\x14\n\x10C2S_SESSION_INIT\ + \x10\x01\x12\x1b\n\x17C2S_SESSION_COVERT_INIT\x10\x0b\x12\x18\n\x14C2S_E\ + XPECT_RECONNECT\x10\x02\x12\x15\n\x11C2S_SESSION_CLOSE\x10\x03\x12\x14\n\ + \x10C2S_YIELD_UPLOAD\x10\x04\x12\x16\n\x12C2S_ACQUIRE_UPLOAD\x10\x05\x12\ + \x20\n\x1cC2S_EXPECT_UPLOADONLY_RECONN\x10\x06\x12\x0e\n\tC2S_ERROR\x10\ + \xff\x01*\x98\x01\n\x0eS2C_Transition\x12\x11\n\rS2C_NO_CHANGE\x10\0\x12\ + \x14\n\x10S2C_SESSION_INIT\x10\x01\x12\x1b\n\x17S2C_SESSION_COVERT_INIT\ + \x10\x0b\x12\x19\n\x15S2C_CONFIRM_RECONNECT\x10\x02\x12\x15\n\x11S2C_SES\ + SION_CLOSE\x10\x03\x12\x0e\n\tS2C_ERROR\x10\xff\x01*\xac\x01\n\x0eErrorR\ + easonS2C\x12\x0c\n\x08NO_ERROR\x10\0\x12\x11\n\rCOVERT_STREAM\x10\x01\ + \x12\x13\n\x0fCLIENT_REPORTED\x10\x02\x12\x13\n\x0fCLIENT_PROTOCOL\x10\ + \x03\x12\x14\n\x10STATION_INTERNAL\x10\x04\x12\x12\n\x0eDECOY_OVERLOAD\ + \x10\x05\x12\x11\n\rCLIENT_STREAM\x10d\x12\x12\n\x0eCLIENT_TIMEOUT\x10e*\ + \x82\x01\n\rTransportType\x12\x08\n\x04Null\x10\0\x12\x07\n\x03Min\x10\ + \x01\x12\t\n\x05Obfs4\x10\x02\x12\x08\n\x04DTLS\x10\x03\x12\n\n\x06Prefi\ + x\x10\x04\x12\x08\n\x04uTLS\x10\x05\x12\n\n\x06Format\x10\x06\x12\x08\n\ + \x04WASM\x10\x07\x12\x07\n\x03FTE\x10\x08\x12\x08\n\x04Quic\x10\t\x12\n\ + \n\x06Webrtc\x10c*\x86\x01\n\x12RegistrationSource\x12\x0f\n\x0bUnspecif\ + ied\x10\0\x12\x0c\n\x08Detector\x10\x01\x12\x07\n\x03API\x10\x02\x12\x13\ + \n\x0fDetectorPrescan\x10\x03\x12\x14\n\x10BidirectionalAPI\x10\x04\x12\ + \x07\n\x03DNS\x10\x05\x12\x14\n\x10BidirectionalDNS\x10\x06*@\n\x11Stati\ + onOperations\x12\x0b\n\x07Unknown\x10\0\x12\x07\n\x03New\x10\x01\x12\n\n\ + \x06Update\x10\x02\x12\t\n\x05Clear\x10\x03*$\n\x07IPProto\x12\x07\n\x03\ + Unk\x10\0\x12\x07\n\x03Tcp\x10\x01\x12\x07\n\x03Udp\x10\x02J\xe1\x94\x01\ + \n\x07\x12\x05\0\0\xb6\x03\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\xb0\x01\ + \n\x01\x02\x12\x03\x06\0\x0e2\xa5\x01\x20TODO:\x20We're\x20using\x20prot\ + o2\x20because\x20it's\x20the\x20default\x20on\x20Ubuntu\x2016.04.\n\x20A\ + t\x20some\x20point\x20we\x20will\x20want\x20to\x20migrate\x20to\x20proto\ + 3,\x20but\x20we\x20are\x20not\n\x20using\x20any\x20proto3\x20features\ + \x20yet.\n\n\t\n\x02\x03\0\x12\x03\x08\0#\n\n\n\x02\x05\0\x12\x04\n\0\r\ + \x01\n\n\n\x03\x05\0\x01\x12\x03\n\x05\x0c\n\x0b\n\x04\x05\0\x02\0\x12\ + \x03\x0b\x04\x15\n\x0c\n\x05\x05\0\x02\0\x01\x12\x03\x0b\x04\x0f\n\x0c\n\ + \x05\x05\0\x02\0\x02\x12\x03\x0b\x12\x14\n\x20\n\x04\x05\0\x02\x01\x12\ + \x03\x0c\x04\x15\"\x13\x20not\x20supported\x20atm\n\n\x0c\n\x05\x05\0\ + \x02\x01\x01\x12\x03\x0c\x04\x0f\n\x0c\n\x05\x05\0\x02\x01\x02\x12\x03\ + \x0c\x12\x14\n\n\n\x02\x04\0\x12\x04\x0f\0\x14\x01\n\n\n\x03\x04\0\x01\ + \x12\x03\x0f\x08\x0e\n4\n\x04\x04\0\x02\0\x12\x03\x11\x04\x1b\x1a'\x20A\ + \x20public\x20key,\x20as\x20used\x20by\x20the\x20station.\n\n\x0c\n\x05\ + \x04\0\x02\0\x04\x12\x03\x11\x04\x0c\n\x0c\n\x05\x04\0\x02\0\x05\x12\x03\ + \x11\r\x12\n\x0c\n\x05\x04\0\x02\0\x01\x12\x03\x11\x13\x16\n\x0c\n\x05\ + \x04\0\x02\0\x03\x12\x03\x11\x19\x1a\n\x0b\n\x04\x04\0\x02\x01\x12\x03\ + \x13\x04\x1e\n\x0c\n\x05\x04\0\x02\x01\x04\x12\x03\x13\x04\x0c\n\x0c\n\ + \x05\x04\0\x02\x01\x06\x12\x03\x13\r\x14\n\x0c\n\x05\x04\0\x02\x01\x01\ + \x12\x03\x13\x15\x19\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x03\x13\x1c\x1d\n\ + \n\n\x02\x04\x01\x12\x04\x16\0<\x01\n\n\n\x03\x04\x01\x01\x12\x03\x16\ + \x08\x14\n\xa1\x01\n\x04\x04\x01\x02\0\x12\x03\x1b\x04!\x1a\x93\x01\x20T\ + he\x20hostname/SNI\x20to\x20use\x20for\x20this\x20host\n\n\x20The\x20hos\ + tname\x20is\x20the\x20only\x20required\x20field,\x20although\x20other\n\ + \x20fields\x20are\x20expected\x20to\x20be\x20present\x20in\x20most\x20ca\ + ses.\n\n\x0c\n\x05\x04\x01\x02\0\x04\x12\x03\x1b\x04\x0c\n\x0c\n\x05\x04\ + \x01\x02\0\x05\x12\x03\x1b\r\x13\n\x0c\n\x05\x04\x01\x02\0\x01\x12\x03\ + \x1b\x14\x1c\n\x0c\n\x05\x04\x01\x02\0\x03\x12\x03\x1b\x1f\x20\n\xf7\x01\ + \n\x04\x04\x01\x02\x01\x12\x03\"\x04\"\x1a\xe9\x01\x20The\x2032-bit\x20i\ + pv4\x20address,\x20in\x20network\x20byte\x20order\n\n\x20If\x20the\x20IP\ + v4\x20address\x20is\x20absent,\x20then\x20it\x20may\x20be\x20resolved\ + \x20via\n\x20DNS\x20by\x20the\x20client,\x20or\x20the\x20client\x20may\ + \x20discard\x20this\x20decoy\x20spec\n\x20if\x20local\x20DNS\x20is\x20un\ + trusted,\x20or\x20the\x20service\x20may\x20be\x20multihomed.\n\n\x0c\n\ + \x05\x04\x01\x02\x01\x04\x12\x03\"\x04\x0c\n\x0c\n\x05\x04\x01\x02\x01\ + \x05\x12\x03\"\r\x14\n\x0c\n\x05\x04\x01\x02\x01\x01\x12\x03\"\x15\x1d\n\ + \x0c\n\x05\x04\x01\x02\x01\x03\x12\x03\"\x20!\n>\n\x04\x04\x01\x02\x02\ + \x12\x03%\x04\x20\x1a1\x20The\x20128-bit\x20ipv6\x20address,\x20in\x20ne\ + twork\x20byte\x20order\n\n\x0c\n\x05\x04\x01\x02\x02\x04\x12\x03%\x04\ + \x0c\n\x0c\n\x05\x04\x01\x02\x02\x05\x12\x03%\r\x12\n\x0c\n\x05\x04\x01\ + \x02\x02\x01\x12\x03%\x13\x1b\n\x0c\n\x05\x04\x01\x02\x02\x03\x12\x03%\ + \x1e\x1f\n\x91\x01\n\x04\x04\x01\x02\x03\x12\x03+\x04\x1f\x1a\x83\x01\ + \x20The\x20Tapdance\x20station\x20public\x20key\x20to\x20use\x20when\x20\ + contacting\x20this\n\x20decoy\n\n\x20If\x20omitted,\x20the\x20default\ + \x20station\x20public\x20key\x20(if\x20any)\x20is\x20used.\n\n\x0c\n\x05\ + \x04\x01\x02\x03\x04\x12\x03+\x04\x0c\n\x0c\n\x05\x04\x01\x02\x03\x06\ + \x12\x03+\r\x13\n\x0c\n\x05\x04\x01\x02\x03\x01\x12\x03+\x14\x1a\n\x0c\n\ + \x05\x04\x01\x02\x03\x03\x12\x03+\x1d\x1e\n\xee\x01\n\x04\x04\x01\x02\ + \x04\x12\x032\x04\x20\x1a\xe0\x01\x20The\x20maximum\x20duration,\x20in\ + \x20milliseconds,\x20to\x20maintain\x20an\x20open\n\x20connection\x20to\ + \x20this\x20decoy\x20(because\x20the\x20decoy\x20may\x20close\x20the\n\ + \x20connection\x20itself\x20after\x20this\x20length\x20of\x20time)\n\n\ + \x20If\x20omitted,\x20a\x20default\x20of\x2030,000\x20milliseconds\x20is\ + \x20assumed.\n\n\x0c\n\x05\x04\x01\x02\x04\x04\x12\x032\x04\x0c\n\x0c\n\ + \x05\x04\x01\x02\x04\x05\x12\x032\r\x13\n\x0c\n\x05\x04\x01\x02\x04\x01\ + \x12\x032\x14\x1b\n\x0c\n\x05\x04\x01\x02\x04\x03\x12\x032\x1e\x1f\n\xb0\ + \x02\n\x04\x04\x01\x02\x05\x12\x03;\x04\x1f\x1a\xa2\x02\x20The\x20maximu\ + m\x20TCP\x20window\x20size\x20to\x20attempt\x20to\x20use\x20for\x20this\ + \x20decoy.\n\n\x20If\x20omitted,\x20a\x20default\x20of\x2015360\x20is\ + \x20assumed.\n\n\x20TODO:\x20the\x20default\x20is\x20based\x20on\x20the\ + \x20current\x20heuristic\x20of\x20only\n\x20using\x20decoys\x20that\x20p\ + ermit\x20windows\x20of\x2015KB\x20or\x20larger.\x20\x20If\x20this\n\x20h\ + euristic\x20changes,\x20then\x20this\x20default\x20doesn't\x20make\x20se\ + nse.\n\n\x0c\n\x05\x04\x01\x02\x05\x04\x12\x03;\x04\x0c\n\x0c\n\x05\x04\ + \x01\x02\x05\x05\x12\x03;\r\x13\n\x0c\n\x05\x04\x01\x02\x05\x01\x12\x03;\ + \x14\x1a\n\x0c\n\x05\x04\x01\x02\x05\x03\x12\x03;\x1d\x1e\n\x83\x08\n\ + \x02\x04\x02\x12\x04S\0Z\x012\xf6\x07\x20In\x20version\x201,\x20the\x20r\ + equest\x20is\x20very\x20simple:\x20when\n\x20the\x20client\x20sends\x20a\ + \x20MSG_PROTO\x20to\x20the\x20station,\x20if\x20the\n\x20generation\x20n\ + umber\x20is\x20present,\x20then\x20this\x20request\x20includes\n\x20(in\ + \x20addition\x20to\x20whatever\x20other\x20operations\x20are\x20part\x20\ + of\x20the\n\x20request)\x20a\x20request\x20for\x20the\x20station\x20to\ + \x20send\x20a\x20copy\x20of\n\x20the\x20current\x20decoy\x20set\x20that\ + \x20has\x20a\x20generation\x20number\x20greater\n\x20than\x20the\x20gene\ + ration\x20number\x20in\x20its\x20request.\n\n\x20If\x20the\x20response\ + \x20contains\x20a\x20DecoyListUpdate\x20with\x20a\x20generation\x20numbe\ + r\x20equal\n\x20to\x20that\x20which\x20the\x20client\x20sent,\x20then\ + \x20the\x20client\x20is\x20\"caught\x20up\"\x20with\n\x20the\x20station\ + \x20and\x20the\x20response\x20contains\x20no\x20new\x20information\n\x20\ + (and\x20all\x20other\x20fields\x20may\x20be\x20omitted\x20or\x20empty).\ + \x20\x20Otherwise,\n\x20the\x20station\x20will\x20send\x20the\x20latest\ + \x20configuration\x20information,\n\x20along\x20with\x20its\x20generatio\ + n\x20number.\n\n\x20The\x20station\x20can\x20also\x20send\x20ClientConf\ + \x20messages\n\x20(as\x20part\x20of\x20Station2Client\x20messages)\x20wh\ + enever\x20it\x20wants.\n\x20The\x20client\x20is\x20expected\x20to\x20rea\ + ct\x20as\x20if\x20it\x20had\x20requested\n\x20such\x20messages\x20--\x20\ + possibly\x20by\x20ignoring\x20them,\x20if\x20the\x20client\n\x20is\x20al\ + ready\x20up-to-date\x20according\x20to\x20the\x20generation\x20number.\n\ + \n\n\n\x03\x04\x02\x01\x12\x03S\x08\x12\n\x0b\n\x04\x04\x02\x02\0\x12\ + \x03T\x04&\n\x0c\n\x05\x04\x02\x02\0\x04\x12\x03T\x04\x0c\n\x0c\n\x05\ + \x04\x02\x02\0\x06\x12\x03T\r\x16\n\x0c\n\x05\x04\x02\x02\0\x01\x12\x03T\ + \x17!\n\x0c\n\x05\x04\x02\x02\0\x03\x12\x03T$%\n\x0b\n\x04\x04\x02\x02\ + \x01\x12\x03U\x04#\n\x0c\n\x05\x04\x02\x02\x01\x04\x12\x03U\x04\x0c\n\ + \x0c\n\x05\x04\x02\x02\x01\x05\x12\x03U\r\x13\n\x0c\n\x05\x04\x02\x02\ + \x01\x01\x12\x03U\x14\x1e\n\x0c\n\x05\x04\x02\x02\x01\x03\x12\x03U!\"\n\ + \x0b\n\x04\x04\x02\x02\x02\x12\x03V\x04'\n\x0c\n\x05\x04\x02\x02\x02\x04\ + \x12\x03V\x04\x0c\n\x0c\n\x05\x04\x02\x02\x02\x06\x12\x03V\r\x13\n\x0c\n\ + \x05\x04\x02\x02\x02\x01\x12\x03V\x14\"\n\x0c\n\x05\x04\x02\x02\x02\x03\ + \x12\x03V%&\n\x0b\n\x04\x04\x02\x02\x03\x12\x03W\x049\n\x0c\n\x05\x04\ + \x02\x02\x03\x04\x12\x03W\x04\x0c\n\x0c\n\x05\x04\x02\x02\x03\x06\x12\ + \x03W\r\x1f\n\x0c\n\x05\x04\x02\x02\x03\x01\x12\x03W\x204\n\x0c\n\x05\ + \x04\x02\x02\x03\x03\x12\x03W78\n\x0b\n\x04\x04\x02\x02\x04\x12\x03X\x04\ + '\n\x0c\n\x05\x04\x02\x02\x04\x04\x12\x03X\x04\x0c\n\x0c\n\x05\x04\x02\ + \x02\x04\x06\x12\x03X\r\x13\n\x0c\n\x05\x04\x02\x02\x04\x01\x12\x03X\x14\ + \"\n\x0c\n\x05\x04\x02\x02\x04\x03\x12\x03X%&\n\x0b\n\x04\x04\x02\x02\ + \x05\x12\x03Y\x04)\n\x0c\n\x05\x04\x02\x02\x05\x04\x12\x03Y\x04\x0c\n\ + \x0c\n\x05\x04\x02\x02\x05\x06\x12\x03Y\r\x17\n\x0c\n\x05\x04\x02\x02\ + \x05\x01\x12\x03Y\x18$\n\x0c\n\x05\x04\x02\x02\x05\x03\x12\x03Y'(\n-\n\ + \x02\x04\x03\x12\x04]\0d\x01\x1a!\x20Configuration\x20for\x20DNS\x20regi\ + strar\n\n\n\n\x03\x04\x03\x01\x12\x03]\x08\x12\n\x0b\n\x04\x04\x03\x02\0\ + \x12\x03^\x04-\n\x0c\n\x05\x04\x03\x02\0\x04\x12\x03^\x04\x0c\n\x0c\n\ \x05\x04\x03\x02\0\x06\x12\x03^\r\x19\n\x0c\n\x05\x04\x03\x02\0\x01\x12\ \x03^\x1a(\n\x0c\n\x05\x04\x03\x02\0\x03\x12\x03^+,\n\x0b\n\x04\x04\x03\ \x02\x01\x12\x03_\x04\x1f\n\x0c\n\x05\x04\x03\x02\x01\x04\x12\x03_\x04\ @@ -7192,241 +7470,260 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \n\r\n\x05\x04\t\x02\x01\x06\x12\x04\xbf\x01\r\x16\n\r\n\x05\x04\t\x02\ \x01\x01\x12\x04\xbf\x01\x17\x1a\n\r\n\x05\x04\t\x02\x01\x03\x12\x04\xbf\ \x01\x1d\x1e\n\x0c\n\x02\x04\n\x12\x06\xc2\x01\0\xc5\x01\x01\n\x0b\n\x03\ - \x04\n\x01\x12\x04\xc2\x01\x08\x1b\n\x0c\n\x04\x04\n\x02\0\x12\x04\xc3\ - \x01\x04!\n\r\n\x05\x04\n\x02\0\x04\x12\x04\xc3\x01\x04\x0c\n\r\n\x05\ - \x04\n\x02\0\x05\x12\x04\xc3\x01\r\x13\n\r\n\x05\x04\n\x02\0\x01\x12\x04\ - \xc3\x01\x14\x1c\n\r\n\x05\x04\n\x02\0\x03\x12\x04\xc3\x01\x1f\x20\n\x0c\ - \n\x04\x04\n\x02\x01\x12\x04\xc4\x01\x04)\n\r\n\x05\x04\n\x02\x01\x04\ + \x04\n\x01\x12\x04\xc2\x01\x08\x0c\n\x0c\n\x04\x04\n\x02\0\x12\x04\xc3\ + \x01\x04\x1a\n\r\n\x05\x04\n\x02\0\x04\x12\x04\xc3\x01\x04\x0c\n\r\n\x05\ + \x04\n\x02\0\x05\x12\x04\xc3\x01\r\x12\n\r\n\x05\x04\n\x02\0\x01\x12\x04\ + \xc3\x01\x13\x15\n\r\n\x05\x04\n\x02\0\x03\x12\x04\xc3\x01\x18\x19\n\x0c\ + \n\x04\x04\n\x02\x01\x12\x04\xc4\x01\x04\x1d\n\r\n\x05\x04\n\x02\x01\x04\ \x12\x04\xc4\x01\x04\x0c\n\r\n\x05\x04\n\x02\x01\x05\x12\x04\xc4\x01\r\ - \x11\n\r\n\x05\x04\n\x02\x01\x01\x12\x04\xc4\x01\x12$\n\r\n\x05\x04\n\ - \x02\x01\x03\x12\x04\xc4\x01'(\n\x0c\n\x02\x04\x0b\x12\x06\xc7\x01\0\xde\ - \x01\x01\n\x0b\n\x03\x04\x0b\x01\x12\x04\xc7\x01\x08\x17\nO\n\x04\x04\ - \x0b\x02\0\x12\x04\xc9\x01\x04)\x1aA\x20Should\x20accompany\x20(at\x20le\ - ast)\x20SESSION_INIT\x20and\x20CONFIRM_RECONNECT.\n\n\r\n\x05\x04\x0b\ - \x02\0\x04\x12\x04\xc9\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\0\x05\x12\x04\ - \xc9\x01\r\x13\n\r\n\x05\x04\x0b\x02\0\x01\x12\x04\xc9\x01\x14$\n\r\n\ - \x05\x04\x0b\x02\0\x03\x12\x04\xc9\x01'(\nv\n\x04\x04\x0b\x02\x01\x12\ - \x04\xcd\x01\x041\x1ah\x20There\x20might\x20be\x20a\x20state\x20transiti\ - on.\x20May\x20be\x20absent;\x20absence\x20should\x20be\n\x20treated\x20i\ - dentically\x20to\x20NO_CHANGE.\n\n\r\n\x05\x04\x0b\x02\x01\x04\x12\x04\ - \xcd\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\x01\x06\x12\x04\xcd\x01\r\x1b\n\r\ - \n\x05\x04\x0b\x02\x01\x01\x12\x04\xcd\x01\x1c,\n\r\n\x05\x04\x0b\x02\ - \x01\x03\x12\x04\xcd\x01/0\nc\n\x04\x04\x0b\x02\x02\x12\x04\xd1\x01\x04(\ - \x1aU\x20The\x20station\x20can\x20send\x20client\x20config\x20info\x20pi\ - ggybacked\n\x20on\x20any\x20message,\x20as\x20it\x20sees\x20fit\n\n\r\n\ - \x05\x04\x0b\x02\x02\x04\x12\x04\xd1\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\ - \x02\x06\x12\x04\xd1\x01\r\x17\n\r\n\x05\x04\x0b\x02\x02\x01\x12\x04\xd1\ - \x01\x18#\n\r\n\x05\x04\x0b\x02\x02\x03\x12\x04\xd1\x01&'\nP\n\x04\x04\ - \x0b\x02\x03\x12\x04\xd4\x01\x04+\x1aB\x20If\x20state_transition\x20==\ - \x20S2C_ERROR,\x20this\x20field\x20is\x20the\x20explanation.\n\n\r\n\x05\ - \x04\x0b\x02\x03\x04\x12\x04\xd4\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\x03\ - \x06\x12\x04\xd4\x01\r\x1b\n\r\n\x05\x04\x0b\x02\x03\x01\x12\x04\xd4\x01\ - \x1c&\n\r\n\x05\x04\x0b\x02\x03\x03\x12\x04\xd4\x01)*\nQ\n\x04\x04\x0b\ - \x02\x04\x12\x04\xd7\x01\x04$\x1aC\x20Signals\x20client\x20to\x20stop\ - \x20connecting\x20for\x20following\x20amount\x20of\x20seconds\n\n\r\n\ - \x05\x04\x0b\x02\x04\x04\x12\x04\xd7\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\ - \x04\x05\x12\x04\xd7\x01\r\x13\n\r\n\x05\x04\x0b\x02\x04\x01\x12\x04\xd7\ - \x01\x14\x1f\n\r\n\x05\x04\x0b\x02\x04\x03\x12\x04\xd7\x01\"#\nK\n\x04\ - \x04\x0b\x02\x05\x12\x04\xda\x01\x04#\x1a=\x20Sent\x20in\x20SESSION_INIT\ - ,\x20identifies\x20the\x20station\x20that\x20picked\x20up\n\n\r\n\x05\ - \x04\x0b\x02\x05\x04\x12\x04\xda\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\x05\ - \x05\x12\x04\xda\x01\r\x13\n\r\n\x05\x04\x0b\x02\x05\x01\x12\x04\xda\x01\ - \x14\x1e\n\r\n\x05\x04\x0b\x02\x05\x03\x12\x04\xda\x01!\"\nG\n\x04\x04\ - \x0b\x02\x06\x12\x04\xdd\x01\x04!\x1a9\x20Random-sized\x20junk\x20to\x20\ - defeat\x20packet\x20size\x20fingerprinting.\n\n\r\n\x05\x04\x0b\x02\x06\ - \x04\x12\x04\xdd\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\x06\x05\x12\x04\xdd\ - \x01\r\x12\n\r\n\x05\x04\x0b\x02\x06\x01\x12\x04\xdd\x01\x13\x1a\n\r\n\ - \x05\x04\x0b\x02\x06\x03\x12\x04\xdd\x01\x1d\x20\n\x0c\n\x02\x04\x0c\x12\ - \x06\xe0\x01\0\xe6\x01\x01\n\x0b\n\x03\x04\x0c\x01\x12\x04\xe0\x01\x08\ - \x19\n\x0c\n\x04\x04\x0c\x02\0\x12\x04\xe1\x01\x08&\n\r\n\x05\x04\x0c\ - \x02\0\x04\x12\x04\xe1\x01\x08\x10\n\r\n\x05\x04\x0c\x02\0\x05\x12\x04\ - \xe1\x01\x11\x15\n\r\n\x05\x04\x0c\x02\0\x01\x12\x04\xe1\x01\x16!\n\r\n\ - \x05\x04\x0c\x02\0\x03\x12\x04\xe1\x01$%\n\x0c\n\x04\x04\x0c\x02\x01\x12\ - \x04\xe2\x01\x08%\n\r\n\x05\x04\x0c\x02\x01\x04\x12\x04\xe2\x01\x08\x10\ - \n\r\n\x05\x04\x0c\x02\x01\x05\x12\x04\xe2\x01\x11\x15\n\r\n\x05\x04\x0c\ - \x02\x01\x01\x12\x04\xe2\x01\x16\x20\n\r\n\x05\x04\x0c\x02\x01\x03\x12\ - \x04\xe2\x01#$\n\x0c\n\x04\x04\x0c\x02\x02\x12\x04\xe3\x01\x08'\n\r\n\ - \x05\x04\x0c\x02\x02\x04\x12\x04\xe3\x01\x08\x10\n\r\n\x05\x04\x0c\x02\ - \x02\x05\x12\x04\xe3\x01\x11\x15\n\r\n\x05\x04\x0c\x02\x02\x01\x12\x04\ - \xe3\x01\x16\"\n\r\n\x05\x04\x0c\x02\x02\x03\x12\x04\xe3\x01%&\n\x0c\n\ - \x04\x04\x0c\x02\x03\x12\x04\xe4\x01\x04\x1e\n\r\n\x05\x04\x0c\x02\x03\ - \x04\x12\x04\xe4\x01\x04\x0c\n\r\n\x05\x04\x0c\x02\x03\x05\x12\x04\xe4\ - \x01\r\x11\n\r\n\x05\x04\x0c\x02\x03\x01\x12\x04\xe4\x01\x12\x19\n\r\n\ - \x05\x04\x0c\x02\x03\x03\x12\x04\xe4\x01\x1c\x1d\n\x0c\n\x04\x04\x0c\x02\ - \x04\x12\x04\xe5\x01\x04!\n\r\n\x05\x04\x0c\x02\x04\x04\x12\x04\xe5\x01\ - \x04\x0c\n\r\n\x05\x04\x0c\x02\x04\x05\x12\x04\xe5\x01\r\x11\n\r\n\x05\ - \x04\x0c\x02\x04\x01\x12\x04\xe5\x01\x12\x1c\n\r\n\x05\x04\x0c\x02\x04\ - \x03\x12\x04\xe5\x01\x1f\x20\n\x0c\n\x02\x04\r\x12\x06\xe8\x01\0\xa2\x02\ - \x01\n\x0b\n\x03\x04\r\x01\x12\x04\xe8\x01\x08\x17\n\x0c\n\x04\x04\r\x02\ - \0\x12\x04\xe9\x01\x04)\n\r\n\x05\x04\r\x02\0\x04\x12\x04\xe9\x01\x04\ - \x0c\n\r\n\x05\x04\r\x02\0\x05\x12\x04\xe9\x01\r\x13\n\r\n\x05\x04\r\x02\ - \0\x01\x12\x04\xe9\x01\x14$\n\r\n\x05\x04\r\x02\0\x03\x12\x04\xe9\x01'(\ - \n\xd0\x01\n\x04\x04\r\x02\x01\x12\x04\xee\x01\x04.\x1a\xc1\x01\x20The\ - \x20client\x20reports\x20its\x20decoy\x20list's\x20version\x20number\x20\ - here,\x20which\x20the\n\x20station\x20can\x20use\x20to\x20decide\x20whet\ - her\x20to\x20send\x20an\x20updated\x20one.\x20The\x20station\n\x20should\ - \x20always\x20send\x20a\x20list\x20if\x20this\x20field\x20is\x20set\x20t\ - o\x200.\n\n\r\n\x05\x04\r\x02\x01\x04\x12\x04\xee\x01\x04\x0c\n\r\n\x05\ - \x04\r\x02\x01\x05\x12\x04\xee\x01\r\x13\n\r\n\x05\x04\r\x02\x01\x01\x12\ - \x04\xee\x01\x14)\n\r\n\x05\x04\r\x02\x01\x03\x12\x04\xee\x01,-\n\x0c\n\ - \x04\x04\r\x02\x02\x12\x04\xf0\x01\x041\n\r\n\x05\x04\r\x02\x02\x04\x12\ - \x04\xf0\x01\x04\x0c\n\r\n\x05\x04\r\x02\x02\x06\x12\x04\xf0\x01\r\x1b\n\ - \r\n\x05\x04\r\x02\x02\x01\x12\x04\xf0\x01\x1c,\n\r\n\x05\x04\r\x02\x02\ - \x03\x12\x04\xf0\x01/0\n\x80\x01\n\x04\x04\r\x02\x03\x12\x04\xf4\x01\x04\ - $\x1ar\x20The\x20position\x20in\x20the\x20overall\x20session's\x20upload\ - \x20sequence\x20where\x20the\x20current\n\x20YIELD=>ACQUIRE\x20switchove\ - r\x20is\x20happening.\n\n\r\n\x05\x04\r\x02\x03\x04\x12\x04\xf4\x01\x04\ - \x0c\n\r\n\x05\x04\r\x02\x03\x05\x12\x04\xf4\x01\r\x13\n\r\n\x05\x04\r\ - \x02\x03\x01\x12\x04\xf4\x01\x14\x1f\n\r\n\x05\x04\r\x02\x03\x03\x12\x04\ - \xf4\x01\"#\ng\n\x04\x04\r\x02\x04\x12\x04\xf8\x01\x04+\x1aY\x20High\x20\ - level\x20client\x20library\x20version\x20used\x20for\x20indicating\x20fe\ - ature\x20support,\x20or\n\x20lack\x20therof.\n\n\r\n\x05\x04\r\x02\x04\ - \x04\x12\x04\xf8\x01\x04\x0c\n\r\n\x05\x04\r\x02\x04\x05\x12\x04\xf8\x01\ - \r\x13\n\r\n\x05\x04\r\x02\x04\x01\x12\x04\xf8\x01\x14&\n\r\n\x05\x04\r\ - \x02\x04\x03\x12\x04\xf8\x01)*\n\xa5\x02\n\x04\x04\r\x02\x05\x12\x04\xfd\ - \x01\x042\x1a\x96\x02\x20Indicates\x20whether\x20the\x20client\x20will\ - \x20allow\x20the\x20registrar\x20to\x20provide\x20alternative\x20paramet\ - ers\x20that\n\x20may\x20work\x20better\x20in\x20substitute\x20for\x20the\ - \x20deterministically\x20selected\x20parameters.\x20This\x20only\x20work\ - s\n\x20for\x20bidirectional\x20registration\x20methods\x20where\x20the\ - \x20client\x20receives\x20a\x20RegistrationResponse.\n\n\r\n\x05\x04\r\ - \x02\x05\x04\x12\x04\xfd\x01\x04\x0c\n\r\n\x05\x04\r\x02\x05\x05\x12\x04\ - \xfd\x01\r\x11\n\r\n\x05\x04\r\x02\x05\x01\x12\x04\xfd\x01\x12-\n\r\n\ - \x05\x04\r\x02\x05\x03\x12\x04\xfd\x0101\nq\n\x04\x04\r\x02\x06\x12\x04\ - \x81\x02\x04'\x1ac\x20List\x20of\x20decoys\x20that\x20client\x20have\x20\ - unsuccessfully\x20tried\x20in\x20current\x20session.\n\x20Could\x20be\ - \x20sent\x20in\x20chunks\n\n\r\n\x05\x04\r\x02\x06\x04\x12\x04\x81\x02\ - \x04\x0c\n\r\n\x05\x04\r\x02\x06\x05\x12\x04\x81\x02\r\x13\n\r\n\x05\x04\ - \r\x02\x06\x01\x12\x04\x81\x02\x14!\n\r\n\x05\x04\r\x02\x06\x03\x12\x04\ - \x81\x02$&\n\x0c\n\x04\x04\r\x02\x07\x12\x04\x83\x02\x04%\n\r\n\x05\x04\ - \r\x02\x07\x04\x12\x04\x83\x02\x04\x0c\n\r\n\x05\x04\r\x02\x07\x06\x12\ - \x04\x83\x02\r\x19\n\r\n\x05\x04\r\x02\x07\x01\x12\x04\x83\x02\x1a\x1f\n\ - \r\n\x05\x04\r\x02\x07\x03\x12\x04\x83\x02\"$\nk\n\x04\x04\r\x02\x08\x12\ - \x04\x86\x02\x04*\x1a]\x20NullTransport,\x20MinTransport,\x20Obfs4Transp\ - ort,\x20etc.\x20Transport\x20type\x20we\x20want\x20from\x20phantom\x20pr\ - oxy\n\n\r\n\x05\x04\r\x02\x08\x04\x12\x04\x86\x02\x04\x0c\n\r\n\x05\x04\ - \r\x02\x08\x06\x12\x04\x86\x02\r\x1a\n\r\n\x05\x04\r\x02\x08\x01\x12\x04\ - \x86\x02\x1b$\n\r\n\x05\x04\r\x02\x08\x03\x12\x04\x86\x02')\n\x0c\n\x04\ - \x04\r\x02\t\x12\x04\x88\x02\x047\n\r\n\x05\x04\r\x02\t\x04\x12\x04\x88\ - \x02\x04\x0c\n\r\n\x05\x04\r\x02\t\x06\x12\x04\x88\x02\r\x20\n\r\n\x05\ - \x04\r\x02\t\x01\x12\x04\x88\x02!1\n\r\n\x05\x04\r\x02\t\x03\x12\x04\x88\ - \x0246\n\xc8\x03\n\x04\x04\r\x02\n\x12\x04\x90\x02\x04(\x1a\xb9\x03\x20S\ - tation\x20is\x20only\x20required\x20to\x20check\x20this\x20variable\x20d\ - uring\x20session\x20initialization.\n\x20If\x20set,\x20station\x20must\ - \x20facilitate\x20connection\x20to\x20said\x20target\x20by\x20itself,\ - \x20i.e.\x20write\x20into\x20squid\n\x20socket\x20an\x20HTTP/SOCKS/any\ - \x20other\x20connection\x20request.\n\x20covert_address\x20must\x20have\ - \x20exactly\x20one\x20':'\x20colon,\x20that\x20separates\x20host\x20(lit\ - eral\x20IP\x20address\x20or\n\x20resolvable\x20hostname)\x20and\x20port\ - \n\x20TODO:\x20make\x20it\x20required\x20for\x20initialization,\x20and\ - \x20stop\x20connecting\x20any\x20client\x20straight\x20to\x20squid?\n\n\ - \r\n\x05\x04\r\x02\n\x04\x12\x04\x90\x02\x04\x0c\n\r\n\x05\x04\r\x02\n\ - \x05\x12\x04\x90\x02\r\x13\n\r\n\x05\x04\r\x02\n\x01\x12\x04\x90\x02\x14\ - \"\n\r\n\x05\x04\r\x02\n\x03\x12\x04\x90\x02%'\nR\n\x04\x04\r\x02\x0b\ - \x12\x04\x93\x02\x042\x1aD\x20Used\x20in\x20dark\x20decoys\x20to\x20sign\ - al\x20which\x20dark\x20decoy\x20it\x20will\x20connect\x20to.\n\n\r\n\x05\ - \x04\r\x02\x0b\x04\x12\x04\x93\x02\x04\x0c\n\r\n\x05\x04\r\x02\x0b\x05\ - \x12\x04\x93\x02\r\x13\n\r\n\x05\x04\r\x02\x0b\x01\x12\x04\x93\x02\x14,\ - \n\r\n\x05\x04\r\x02\x0b\x03\x12\x04\x93\x02/1\nR\n\x04\x04\r\x02\x0c\ - \x12\x04\x96\x02\x04\"\x1aD\x20Used\x20to\x20indicate\x20to\x20server\ - \x20if\x20client\x20is\x20registering\x20v4,\x20v6\x20or\x20both\n\n\r\n\ - \x05\x04\r\x02\x0c\x04\x12\x04\x96\x02\x04\x0c\n\r\n\x05\x04\r\x02\x0c\ - \x05\x12\x04\x96\x02\r\x11\n\r\n\x05\x04\r\x02\x0c\x01\x12\x04\x96\x02\ - \x12\x1c\n\r\n\x05\x04\r\x02\x0c\x03\x12\x04\x96\x02\x1f!\n\x0c\n\x04\ - \x04\r\x02\r\x12\x04\x97\x02\x04\"\n\r\n\x05\x04\r\x02\r\x04\x12\x04\x97\ - \x02\x04\x0c\n\r\n\x05\x04\r\x02\r\x05\x12\x04\x97\x02\r\x11\n\r\n\x05\ - \x04\r\x02\r\x01\x12\x04\x97\x02\x12\x1c\n\r\n\x05\x04\r\x02\r\x03\x12\ - \x04\x97\x02\x1f!\nD\n\x04\x04\r\x02\x0e\x12\x04\x9a\x02\x04*\x1a6\x20A\ - \x20collection\x20of\x20optional\x20flags\x20for\x20the\x20registration.\ - \n\n\r\n\x05\x04\r\x02\x0e\x04\x12\x04\x9a\x02\x04\x0c\n\r\n\x05\x04\r\ - \x02\x0e\x06\x12\x04\x9a\x02\r\x1e\n\r\n\x05\x04\r\x02\x0e\x01\x12\x04\ - \x9a\x02\x1f$\n\r\n\x05\x04\r\x02\x0e\x03\x12\x04\x9a\x02')\nq\n\x04\x04\ - \r\x02\x0f\x12\x04\x9e\x02\x04-\x1ac\x20Transport\x20Extensions\n\x20TOD\ - O(jmwample)\x20-\x20move\x20to\x20WebRTC\x20specific\x20transport\x20par\ - ams\x20protobuf\x20message.\n\n\r\n\x05\x04\r\x02\x0f\x04\x12\x04\x9e\ - \x02\x04\x0c\n\r\n\x05\x04\r\x02\x0f\x06\x12\x04\x9e\x02\r\x19\n\r\n\x05\ - \x04\r\x02\x0f\x01\x12\x04\x9e\x02\x1a'\n\r\n\x05\x04\r\x02\x0f\x03\x12\ - \x04\x9e\x02*,\nG\n\x04\x04\r\x02\x10\x12\x04\xa1\x02\x04!\x1a9\x20Rando\ - m-sized\x20junk\x20to\x20defeat\x20packet\x20size\x20fingerprinting.\n\n\ - \r\n\x05\x04\r\x02\x10\x04\x12\x04\xa1\x02\x04\x0c\n\r\n\x05\x04\r\x02\ - \x10\x05\x12\x04\xa1\x02\r\x12\n\r\n\x05\x04\r\x02\x10\x01\x12\x04\xa1\ - \x02\x13\x1a\n\r\n\x05\x04\r\x02\x10\x03\x12\x04\xa1\x02\x1d\x20\n\x0c\n\ - \x02\x04\x0e\x12\x06\xa5\x02\0\xb7\x02\x01\n\x0b\n\x03\x04\x0e\x01\x12\ - \x04\xa5\x02\x08\x1d\n!\n\x04\x04\x0e\x02\0\x12\x04\xa7\x02\x04!\x1a\x13\ - \x20Prefix\x20Identifier\n\n\r\n\x05\x04\x0e\x02\0\x04\x12\x04\xa7\x02\ - \x04\x0c\n\r\n\x05\x04\x0e\x02\0\x05\x12\x04\xa7\x02\r\x12\n\r\n\x05\x04\ - \x0e\x02\0\x01\x12\x04\xa7\x02\x13\x1c\n\r\n\x05\x04\x0e\x02\0\x03\x12\ - \x04\xa7\x02\x1f\x20\n\xc4\x01\n\x04\x04\x0e\x02\x01\x12\x04\xab\x02\x04\ + \x13\n\r\n\x05\x04\n\x02\x01\x01\x12\x04\xc4\x01\x14\x18\n\r\n\x05\x04\n\ + \x02\x01\x03\x12\x04\xc4\x01\x1b\x1c\n\x0c\n\x02\x04\x0b\x12\x06\xc7\x01\ + \0\xcd\x01\x01\n\x0b\n\x03\x04\x0b\x01\x12\x04\xc7\x01\x08\x1b\n\x0c\n\ + \x04\x04\x0b\x02\0\x12\x04\xc8\x01\x04\x20\n\r\n\x05\x04\x0b\x02\0\x04\ + \x12\x04\xc8\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\0\x06\x12\x04\xc8\x01\r\ + \x11\n\r\n\x05\x04\x0b\x02\0\x01\x12\x04\xc8\x01\x12\x1b\n\r\n\x05\x04\ + \x0b\x02\0\x03\x12\x04\xc8\x01\x1e\x1f\n\x0c\n\x04\x04\x0b\x02\x01\x12\ + \x04\xc9\x01\x04\x20\n\r\n\x05\x04\x0b\x02\x01\x04\x12\x04\xc9\x01\x04\ + \x0c\n\r\n\x05\x04\x0b\x02\x01\x06\x12\x04\xc9\x01\r\x11\n\r\n\x05\x04\ + \x0b\x02\x01\x01\x12\x04\xc9\x01\x12\x1b\n\r\n\x05\x04\x0b\x02\x01\x03\ + \x12\x04\xc9\x01\x1e\x1f\n\x0c\n\x04\x04\x0b\x02\x02\x12\x04\xca\x01\x04\ + )\n\r\n\x05\x04\x0b\x02\x02\x04\x12\x04\xca\x01\x04\x0c\n\r\n\x05\x04\ + \x0b\x02\x02\x05\x12\x04\xca\x01\r\x11\n\r\n\x05\x04\x0b\x02\x02\x01\x12\ + \x04\xca\x01\x12$\n\r\n\x05\x04\x0b\x02\x02\x03\x12\x04\xca\x01'(\nN\n\ + \x04\x04\x0b\x02\x03\x12\x04\xcc\x01\x04\x20\x1a@\x20Unordered\x20sets\ + \x20the\x20reliability\x20of\x20the\x20DTLS\x20stream\x20to\x20unordered\ + \n\n\r\n\x05\x04\x0b\x02\x03\x04\x12\x04\xcc\x01\x04\x0c\n\r\n\x05\x04\ + \x0b\x02\x03\x05\x12\x04\xcc\x01\r\x11\n\r\n\x05\x04\x0b\x02\x03\x01\x12\ + \x04\xcc\x01\x12\x1b\n\r\n\x05\x04\x0b\x02\x03\x03\x12\x04\xcc\x01\x1e\ + \x1f\n\x0c\n\x02\x04\x0c\x12\x06\xcf\x01\0\xe6\x01\x01\n\x0b\n\x03\x04\ + \x0c\x01\x12\x04\xcf\x01\x08\x17\nO\n\x04\x04\x0c\x02\0\x12\x04\xd1\x01\ + \x04)\x1aA\x20Should\x20accompany\x20(at\x20least)\x20SESSION_INIT\x20an\ + d\x20CONFIRM_RECONNECT.\n\n\r\n\x05\x04\x0c\x02\0\x04\x12\x04\xd1\x01\ + \x04\x0c\n\r\n\x05\x04\x0c\x02\0\x05\x12\x04\xd1\x01\r\x13\n\r\n\x05\x04\ + \x0c\x02\0\x01\x12\x04\xd1\x01\x14$\n\r\n\x05\x04\x0c\x02\0\x03\x12\x04\ + \xd1\x01'(\nv\n\x04\x04\x0c\x02\x01\x12\x04\xd5\x01\x041\x1ah\x20There\ + \x20might\x20be\x20a\x20state\x20transition.\x20May\x20be\x20absent;\x20\ + absence\x20should\x20be\n\x20treated\x20identically\x20to\x20NO_CHANGE.\ + \n\n\r\n\x05\x04\x0c\x02\x01\x04\x12\x04\xd5\x01\x04\x0c\n\r\n\x05\x04\ + \x0c\x02\x01\x06\x12\x04\xd5\x01\r\x1b\n\r\n\x05\x04\x0c\x02\x01\x01\x12\ + \x04\xd5\x01\x1c,\n\r\n\x05\x04\x0c\x02\x01\x03\x12\x04\xd5\x01/0\nc\n\ + \x04\x04\x0c\x02\x02\x12\x04\xd9\x01\x04(\x1aU\x20The\x20station\x20can\ + \x20send\x20client\x20config\x20info\x20piggybacked\n\x20on\x20any\x20me\ + ssage,\x20as\x20it\x20sees\x20fit\n\n\r\n\x05\x04\x0c\x02\x02\x04\x12\ + \x04\xd9\x01\x04\x0c\n\r\n\x05\x04\x0c\x02\x02\x06\x12\x04\xd9\x01\r\x17\ + \n\r\n\x05\x04\x0c\x02\x02\x01\x12\x04\xd9\x01\x18#\n\r\n\x05\x04\x0c\ + \x02\x02\x03\x12\x04\xd9\x01&'\nP\n\x04\x04\x0c\x02\x03\x12\x04\xdc\x01\ + \x04+\x1aB\x20If\x20state_transition\x20==\x20S2C_ERROR,\x20this\x20fiel\ + d\x20is\x20the\x20explanation.\n\n\r\n\x05\x04\x0c\x02\x03\x04\x12\x04\ + \xdc\x01\x04\x0c\n\r\n\x05\x04\x0c\x02\x03\x06\x12\x04\xdc\x01\r\x1b\n\r\ + \n\x05\x04\x0c\x02\x03\x01\x12\x04\xdc\x01\x1c&\n\r\n\x05\x04\x0c\x02\ + \x03\x03\x12\x04\xdc\x01)*\nQ\n\x04\x04\x0c\x02\x04\x12\x04\xdf\x01\x04$\ + \x1aC\x20Signals\x20client\x20to\x20stop\x20connecting\x20for\x20followi\ + ng\x20amount\x20of\x20seconds\n\n\r\n\x05\x04\x0c\x02\x04\x04\x12\x04\ + \xdf\x01\x04\x0c\n\r\n\x05\x04\x0c\x02\x04\x05\x12\x04\xdf\x01\r\x13\n\r\ + \n\x05\x04\x0c\x02\x04\x01\x12\x04\xdf\x01\x14\x1f\n\r\n\x05\x04\x0c\x02\ + \x04\x03\x12\x04\xdf\x01\"#\nK\n\x04\x04\x0c\x02\x05\x12\x04\xe2\x01\x04\ + #\x1a=\x20Sent\x20in\x20SESSION_INIT,\x20identifies\x20the\x20station\ + \x20that\x20picked\x20up\n\n\r\n\x05\x04\x0c\x02\x05\x04\x12\x04\xe2\x01\ + \x04\x0c\n\r\n\x05\x04\x0c\x02\x05\x05\x12\x04\xe2\x01\r\x13\n\r\n\x05\ + \x04\x0c\x02\x05\x01\x12\x04\xe2\x01\x14\x1e\n\r\n\x05\x04\x0c\x02\x05\ + \x03\x12\x04\xe2\x01!\"\nG\n\x04\x04\x0c\x02\x06\x12\x04\xe5\x01\x04!\ + \x1a9\x20Random-sized\x20junk\x20to\x20defeat\x20packet\x20size\x20finge\ + rprinting.\n\n\r\n\x05\x04\x0c\x02\x06\x04\x12\x04\xe5\x01\x04\x0c\n\r\n\ + \x05\x04\x0c\x02\x06\x05\x12\x04\xe5\x01\r\x12\n\r\n\x05\x04\x0c\x02\x06\ + \x01\x12\x04\xe5\x01\x13\x1a\n\r\n\x05\x04\x0c\x02\x06\x03\x12\x04\xe5\ + \x01\x1d\x20\n\x0c\n\x02\x04\r\x12\x06\xe8\x01\0\xee\x01\x01\n\x0b\n\x03\ + \x04\r\x01\x12\x04\xe8\x01\x08\x19\n\x0c\n\x04\x04\r\x02\0\x12\x04\xe9\ + \x01\x08&\n\r\n\x05\x04\r\x02\0\x04\x12\x04\xe9\x01\x08\x10\n\r\n\x05\ + \x04\r\x02\0\x05\x12\x04\xe9\x01\x11\x15\n\r\n\x05\x04\r\x02\0\x01\x12\ + \x04\xe9\x01\x16!\n\r\n\x05\x04\r\x02\0\x03\x12\x04\xe9\x01$%\n\x0c\n\ + \x04\x04\r\x02\x01\x12\x04\xea\x01\x08%\n\r\n\x05\x04\r\x02\x01\x04\x12\ + \x04\xea\x01\x08\x10\n\r\n\x05\x04\r\x02\x01\x05\x12\x04\xea\x01\x11\x15\ + \n\r\n\x05\x04\r\x02\x01\x01\x12\x04\xea\x01\x16\x20\n\r\n\x05\x04\r\x02\ + \x01\x03\x12\x04\xea\x01#$\n\x0c\n\x04\x04\r\x02\x02\x12\x04\xeb\x01\x08\ + '\n\r\n\x05\x04\r\x02\x02\x04\x12\x04\xeb\x01\x08\x10\n\r\n\x05\x04\r\ + \x02\x02\x05\x12\x04\xeb\x01\x11\x15\n\r\n\x05\x04\r\x02\x02\x01\x12\x04\ + \xeb\x01\x16\"\n\r\n\x05\x04\r\x02\x02\x03\x12\x04\xeb\x01%&\n\x0c\n\x04\ + \x04\r\x02\x03\x12\x04\xec\x01\x04\x1e\n\r\n\x05\x04\r\x02\x03\x04\x12\ + \x04\xec\x01\x04\x0c\n\r\n\x05\x04\r\x02\x03\x05\x12\x04\xec\x01\r\x11\n\ + \r\n\x05\x04\r\x02\x03\x01\x12\x04\xec\x01\x12\x19\n\r\n\x05\x04\r\x02\ + \x03\x03\x12\x04\xec\x01\x1c\x1d\n\x0c\n\x04\x04\r\x02\x04\x12\x04\xed\ + \x01\x04!\n\r\n\x05\x04\r\x02\x04\x04\x12\x04\xed\x01\x04\x0c\n\r\n\x05\ + \x04\r\x02\x04\x05\x12\x04\xed\x01\r\x11\n\r\n\x05\x04\r\x02\x04\x01\x12\ + \x04\xed\x01\x12\x1c\n\r\n\x05\x04\r\x02\x04\x03\x12\x04\xed\x01\x1f\x20\ + \n\x0c\n\x02\x04\x0e\x12\x06\xf0\x01\0\xaa\x02\x01\n\x0b\n\x03\x04\x0e\ + \x01\x12\x04\xf0\x01\x08\x17\n\x0c\n\x04\x04\x0e\x02\0\x12\x04\xf1\x01\ + \x04)\n\r\n\x05\x04\x0e\x02\0\x04\x12\x04\xf1\x01\x04\x0c\n\r\n\x05\x04\ + \x0e\x02\0\x05\x12\x04\xf1\x01\r\x13\n\r\n\x05\x04\x0e\x02\0\x01\x12\x04\ + \xf1\x01\x14$\n\r\n\x05\x04\x0e\x02\0\x03\x12\x04\xf1\x01'(\n\xd0\x01\n\ + \x04\x04\x0e\x02\x01\x12\x04\xf6\x01\x04.\x1a\xc1\x01\x20The\x20client\ + \x20reports\x20its\x20decoy\x20list's\x20version\x20number\x20here,\x20w\ + hich\x20the\n\x20station\x20can\x20use\x20to\x20decide\x20whether\x20to\ + \x20send\x20an\x20updated\x20one.\x20The\x20station\n\x20should\x20alway\ + s\x20send\x20a\x20list\x20if\x20this\x20field\x20is\x20set\x20to\x200.\n\ + \n\r\n\x05\x04\x0e\x02\x01\x04\x12\x04\xf6\x01\x04\x0c\n\r\n\x05\x04\x0e\ + \x02\x01\x05\x12\x04\xf6\x01\r\x13\n\r\n\x05\x04\x0e\x02\x01\x01\x12\x04\ + \xf6\x01\x14)\n\r\n\x05\x04\x0e\x02\x01\x03\x12\x04\xf6\x01,-\n\x0c\n\ + \x04\x04\x0e\x02\x02\x12\x04\xf8\x01\x041\n\r\n\x05\x04\x0e\x02\x02\x04\ + \x12\x04\xf8\x01\x04\x0c\n\r\n\x05\x04\x0e\x02\x02\x06\x12\x04\xf8\x01\r\ + \x1b\n\r\n\x05\x04\x0e\x02\x02\x01\x12\x04\xf8\x01\x1c,\n\r\n\x05\x04\ + \x0e\x02\x02\x03\x12\x04\xf8\x01/0\n\x80\x01\n\x04\x04\x0e\x02\x03\x12\ + \x04\xfc\x01\x04$\x1ar\x20The\x20position\x20in\x20the\x20overall\x20ses\ + sion's\x20upload\x20sequence\x20where\x20the\x20current\n\x20YIELD=>ACQU\ + IRE\x20switchover\x20is\x20happening.\n\n\r\n\x05\x04\x0e\x02\x03\x04\ + \x12\x04\xfc\x01\x04\x0c\n\r\n\x05\x04\x0e\x02\x03\x05\x12\x04\xfc\x01\r\ + \x13\n\r\n\x05\x04\x0e\x02\x03\x01\x12\x04\xfc\x01\x14\x1f\n\r\n\x05\x04\ + \x0e\x02\x03\x03\x12\x04\xfc\x01\"#\ng\n\x04\x04\x0e\x02\x04\x12\x04\x80\ + \x02\x04+\x1aY\x20High\x20level\x20client\x20library\x20version\x20used\ + \x20for\x20indicating\x20feature\x20support,\x20or\n\x20lack\x20therof.\ + \n\n\r\n\x05\x04\x0e\x02\x04\x04\x12\x04\x80\x02\x04\x0c\n\r\n\x05\x04\ + \x0e\x02\x04\x05\x12\x04\x80\x02\r\x13\n\r\n\x05\x04\x0e\x02\x04\x01\x12\ + \x04\x80\x02\x14&\n\r\n\x05\x04\x0e\x02\x04\x03\x12\x04\x80\x02)*\n\xa5\ + \x02\n\x04\x04\x0e\x02\x05\x12\x04\x85\x02\x042\x1a\x96\x02\x20Indicates\ + \x20whether\x20the\x20client\x20will\x20allow\x20the\x20registrar\x20to\ + \x20provide\x20alternative\x20parameters\x20that\n\x20may\x20work\x20bet\ + ter\x20in\x20substitute\x20for\x20the\x20deterministically\x20selected\ + \x20parameters.\x20This\x20only\x20works\n\x20for\x20bidirectional\x20re\ + gistration\x20methods\x20where\x20the\x20client\x20receives\x20a\x20Regi\ + strationResponse.\n\n\r\n\x05\x04\x0e\x02\x05\x04\x12\x04\x85\x02\x04\ + \x0c\n\r\n\x05\x04\x0e\x02\x05\x05\x12\x04\x85\x02\r\x11\n\r\n\x05\x04\ + \x0e\x02\x05\x01\x12\x04\x85\x02\x12-\n\r\n\x05\x04\x0e\x02\x05\x03\x12\ + \x04\x85\x0201\nq\n\x04\x04\x0e\x02\x06\x12\x04\x89\x02\x04'\x1ac\x20Lis\ + t\x20of\x20decoys\x20that\x20client\x20have\x20unsuccessfully\x20tried\ + \x20in\x20current\x20session.\n\x20Could\x20be\x20sent\x20in\x20chunks\n\ + \n\r\n\x05\x04\x0e\x02\x06\x04\x12\x04\x89\x02\x04\x0c\n\r\n\x05\x04\x0e\ + \x02\x06\x05\x12\x04\x89\x02\r\x13\n\r\n\x05\x04\x0e\x02\x06\x01\x12\x04\ + \x89\x02\x14!\n\r\n\x05\x04\x0e\x02\x06\x03\x12\x04\x89\x02$&\n\x0c\n\ + \x04\x04\x0e\x02\x07\x12\x04\x8b\x02\x04%\n\r\n\x05\x04\x0e\x02\x07\x04\ + \x12\x04\x8b\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\x07\x06\x12\x04\x8b\x02\r\ + \x19\n\r\n\x05\x04\x0e\x02\x07\x01\x12\x04\x8b\x02\x1a\x1f\n\r\n\x05\x04\ + \x0e\x02\x07\x03\x12\x04\x8b\x02\"$\nk\n\x04\x04\x0e\x02\x08\x12\x04\x8e\ + \x02\x04*\x1a]\x20NullTransport,\x20MinTransport,\x20Obfs4Transport,\x20\ + etc.\x20Transport\x20type\x20we\x20want\x20from\x20phantom\x20proxy\n\n\ + \r\n\x05\x04\x0e\x02\x08\x04\x12\x04\x8e\x02\x04\x0c\n\r\n\x05\x04\x0e\ + \x02\x08\x06\x12\x04\x8e\x02\r\x1a\n\r\n\x05\x04\x0e\x02\x08\x01\x12\x04\ + \x8e\x02\x1b$\n\r\n\x05\x04\x0e\x02\x08\x03\x12\x04\x8e\x02')\n\x0c\n\ + \x04\x04\x0e\x02\t\x12\x04\x90\x02\x047\n\r\n\x05\x04\x0e\x02\t\x04\x12\ + \x04\x90\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\t\x06\x12\x04\x90\x02\r\x20\n\ + \r\n\x05\x04\x0e\x02\t\x01\x12\x04\x90\x02!1\n\r\n\x05\x04\x0e\x02\t\x03\ + \x12\x04\x90\x0246\n\xc8\x03\n\x04\x04\x0e\x02\n\x12\x04\x98\x02\x04(\ + \x1a\xb9\x03\x20Station\x20is\x20only\x20required\x20to\x20check\x20this\ + \x20variable\x20during\x20session\x20initialization.\n\x20If\x20set,\x20\ + station\x20must\x20facilitate\x20connection\x20to\x20said\x20target\x20b\ + y\x20itself,\x20i.e.\x20write\x20into\x20squid\n\x20socket\x20an\x20HTTP\ + /SOCKS/any\x20other\x20connection\x20request.\n\x20covert_address\x20mus\ + t\x20have\x20exactly\x20one\x20':'\x20colon,\x20that\x20separates\x20hos\ + t\x20(literal\x20IP\x20address\x20or\n\x20resolvable\x20hostname)\x20and\ + \x20port\n\x20TODO:\x20make\x20it\x20required\x20for\x20initialization,\ + \x20and\x20stop\x20connecting\x20any\x20client\x20straight\x20to\x20squi\ + d?\n\n\r\n\x05\x04\x0e\x02\n\x04\x12\x04\x98\x02\x04\x0c\n\r\n\x05\x04\ + \x0e\x02\n\x05\x12\x04\x98\x02\r\x13\n\r\n\x05\x04\x0e\x02\n\x01\x12\x04\ + \x98\x02\x14\"\n\r\n\x05\x04\x0e\x02\n\x03\x12\x04\x98\x02%'\nR\n\x04\ + \x04\x0e\x02\x0b\x12\x04\x9b\x02\x042\x1aD\x20Used\x20in\x20dark\x20deco\ + ys\x20to\x20signal\x20which\x20dark\x20decoy\x20it\x20will\x20connect\ + \x20to.\n\n\r\n\x05\x04\x0e\x02\x0b\x04\x12\x04\x9b\x02\x04\x0c\n\r\n\ + \x05\x04\x0e\x02\x0b\x05\x12\x04\x9b\x02\r\x13\n\r\n\x05\x04\x0e\x02\x0b\ + \x01\x12\x04\x9b\x02\x14,\n\r\n\x05\x04\x0e\x02\x0b\x03\x12\x04\x9b\x02/\ + 1\nR\n\x04\x04\x0e\x02\x0c\x12\x04\x9e\x02\x04\"\x1aD\x20Used\x20to\x20i\ + ndicate\x20to\x20server\x20if\x20client\x20is\x20registering\x20v4,\x20v\ + 6\x20or\x20both\n\n\r\n\x05\x04\x0e\x02\x0c\x04\x12\x04\x9e\x02\x04\x0c\ + \n\r\n\x05\x04\x0e\x02\x0c\x05\x12\x04\x9e\x02\r\x11\n\r\n\x05\x04\x0e\ + \x02\x0c\x01\x12\x04\x9e\x02\x12\x1c\n\r\n\x05\x04\x0e\x02\x0c\x03\x12\ + \x04\x9e\x02\x1f!\n\x0c\n\x04\x04\x0e\x02\r\x12\x04\x9f\x02\x04\"\n\r\n\ + \x05\x04\x0e\x02\r\x04\x12\x04\x9f\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\r\ + \x05\x12\x04\x9f\x02\r\x11\n\r\n\x05\x04\x0e\x02\r\x01\x12\x04\x9f\x02\ + \x12\x1c\n\r\n\x05\x04\x0e\x02\r\x03\x12\x04\x9f\x02\x1f!\nD\n\x04\x04\ + \x0e\x02\x0e\x12\x04\xa2\x02\x04*\x1a6\x20A\x20collection\x20of\x20optio\ + nal\x20flags\x20for\x20the\x20registration.\n\n\r\n\x05\x04\x0e\x02\x0e\ + \x04\x12\x04\xa2\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\x0e\x06\x12\x04\xa2\ + \x02\r\x1e\n\r\n\x05\x04\x0e\x02\x0e\x01\x12\x04\xa2\x02\x1f$\n\r\n\x05\ + \x04\x0e\x02\x0e\x03\x12\x04\xa2\x02')\nq\n\x04\x04\x0e\x02\x0f\x12\x04\ + \xa6\x02\x04-\x1ac\x20Transport\x20Extensions\n\x20TODO(jmwample)\x20-\ + \x20move\x20to\x20WebRTC\x20specific\x20transport\x20params\x20protobuf\ + \x20message.\n\n\r\n\x05\x04\x0e\x02\x0f\x04\x12\x04\xa6\x02\x04\x0c\n\r\ + \n\x05\x04\x0e\x02\x0f\x06\x12\x04\xa6\x02\r\x19\n\r\n\x05\x04\x0e\x02\ + \x0f\x01\x12\x04\xa6\x02\x1a'\n\r\n\x05\x04\x0e\x02\x0f\x03\x12\x04\xa6\ + \x02*,\nG\n\x04\x04\x0e\x02\x10\x12\x04\xa9\x02\x04!\x1a9\x20Random-size\ + d\x20junk\x20to\x20defeat\x20packet\x20size\x20fingerprinting.\n\n\r\n\ + \x05\x04\x0e\x02\x10\x04\x12\x04\xa9\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\ + \x10\x05\x12\x04\xa9\x02\r\x12\n\r\n\x05\x04\x0e\x02\x10\x01\x12\x04\xa9\ + \x02\x13\x1a\n\r\n\x05\x04\x0e\x02\x10\x03\x12\x04\xa9\x02\x1d\x20\n\x0c\ + \n\x02\x04\x0f\x12\x06\xad\x02\0\xbf\x02\x01\n\x0b\n\x03\x04\x0f\x01\x12\ + \x04\xad\x02\x08\x1d\n!\n\x04\x04\x0f\x02\0\x12\x04\xaf\x02\x04!\x1a\x13\ + \x20Prefix\x20Identifier\n\n\r\n\x05\x04\x0f\x02\0\x04\x12\x04\xaf\x02\ + \x04\x0c\n\r\n\x05\x04\x0f\x02\0\x05\x12\x04\xaf\x02\r\x12\n\r\n\x05\x04\ + \x0f\x02\0\x01\x12\x04\xaf\x02\x13\x1c\n\r\n\x05\x04\x0f\x02\0\x03\x12\ + \x04\xaf\x02\x1f\x20\n\xc4\x01\n\x04\x04\x0f\x02\x01\x12\x04\xb3\x02\x04\ \x1e\x1a\xb5\x01\x20Prefix\x20bytes\x20(optional\x20-\x20usually\x20sent\ \x20from\x20station\x20to\x20client\x20as\x20override\x20if\x20allowed\ \x20by\x20C2S)\n\x20as\x20the\x20station\x20cannot\x20take\x20this\x20in\ to\x20account\x20when\x20attempting\x20to\x20identify\x20a\x20connection\ - .\n\n\r\n\x05\x04\x0e\x02\x01\x04\x12\x04\xab\x02\x04\x0c\n\r\n\x05\x04\ - \x0e\x02\x01\x05\x12\x04\xab\x02\r\x12\n\r\n\x05\x04\x0e\x02\x01\x01\x12\ - \x04\xab\x02\x13\x19\n\r\n\x05\x04\x0e\x02\x01\x03\x12\x04\xab\x02\x1c\ - \x1d\n\x0c\n\x04\x04\x0e\x02\x02\x12\x04\xac\x02\x04+\n\r\n\x05\x04\x0e\ - \x02\x02\x04\x12\x04\xac\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\x02\x05\x12\ - \x04\xac\x02\r\x12\n\r\n\x05\x04\x0e\x02\x02\x01\x12\x04\xac\x02\x13&\n\ - \r\n\x05\x04\x0e\x02\x02\x03\x12\x04\xac\x02)*\n\xed\x02\n\x04\x04\x0e\ - \x02\x03\x12\x04\xb6\x02\x04*\x1a\xbc\x01\x20Indicates\x20whether\x20the\ + .\n\n\r\n\x05\x04\x0f\x02\x01\x04\x12\x04\xb3\x02\x04\x0c\n\r\n\x05\x04\ + \x0f\x02\x01\x05\x12\x04\xb3\x02\r\x12\n\r\n\x05\x04\x0f\x02\x01\x01\x12\ + \x04\xb3\x02\x13\x19\n\r\n\x05\x04\x0f\x02\x01\x03\x12\x04\xb3\x02\x1c\ + \x1d\n\x0c\n\x04\x04\x0f\x02\x02\x12\x04\xb4\x02\x04+\n\r\n\x05\x04\x0f\ + \x02\x02\x04\x12\x04\xb4\x02\x04\x0c\n\r\n\x05\x04\x0f\x02\x02\x05\x12\ + \x04\xb4\x02\r\x12\n\r\n\x05\x04\x0f\x02\x02\x01\x12\x04\xb4\x02\x13&\n\ + \r\n\x05\x04\x0f\x02\x02\x03\x12\x04\xb4\x02)*\n\xed\x02\n\x04\x04\x0f\ + \x02\x03\x12\x04\xbe\x02\x04*\x1a\xbc\x01\x20Indicates\x20whether\x20the\ \x20client\x20has\x20elected\x20to\x20use\x20destination\x20port\x20rand\ omization.\x20Should\x20be\n\x20checked\x20against\x20selected\x20transp\ ort\x20to\x20ensure\x20that\x20destination\x20port\x20randomization\x20i\ s\n\x20supported.\n2\x9f\x01\x20//\x20potential\x20future\x20fields\n\ \x20obfuscator\x20ID\n\x20tagEncoder\x20ID\x20(¶ms?,\x20e.g.\x20form\ at-base64\x20/\x20padding)\n\x20streamEncoder\x20ID\x20(¶ms?,\x20e.g\ - .\x20foramat-base64\x20/\x20padding)\n\n\r\n\x05\x04\x0e\x02\x03\x04\x12\ - \x04\xb6\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\x03\x05\x12\x04\xb6\x02\r\x11\ - \n\r\n\x05\x04\x0e\x02\x03\x01\x12\x04\xb6\x02\x12$\n\r\n\x05\x04\x0e\ - \x02\x03\x03\x12\x04\xb6\x02')\n\x0c\n\x02\x04\x0f\x12\x06\xb9\x02\0\xbe\ - \x02\x01\n\x0b\n\x03\x04\x0f\x01\x12\x04\xb9\x02\x08\x1e\n\xcb\x01\n\x04\ - \x04\x0f\x02\0\x12\x04\xbd\x02\x04*\x1a\xbc\x01\x20Indicates\x20whether\ + .\x20foramat-base64\x20/\x20padding)\n\n\r\n\x05\x04\x0f\x02\x03\x04\x12\ + \x04\xbe\x02\x04\x0c\n\r\n\x05\x04\x0f\x02\x03\x05\x12\x04\xbe\x02\r\x11\ + \n\r\n\x05\x04\x0f\x02\x03\x01\x12\x04\xbe\x02\x12$\n\r\n\x05\x04\x0f\ + \x02\x03\x03\x12\x04\xbe\x02')\n\x0c\n\x02\x04\x10\x12\x06\xc1\x02\0\xc6\ + \x02\x01\n\x0b\n\x03\x04\x10\x01\x12\x04\xc1\x02\x08\x1e\n\xcb\x01\n\x04\ + \x04\x10\x02\0\x12\x04\xc5\x02\x04*\x1a\xbc\x01\x20Indicates\x20whether\ \x20the\x20client\x20has\x20elected\x20to\x20use\x20destination\x20port\ \x20randomization.\x20Should\x20be\n\x20checked\x20against\x20selected\ \x20transport\x20to\x20ensure\x20that\x20destination\x20port\x20randomiz\ - ation\x20is\n\x20supported.\n\n\r\n\x05\x04\x0f\x02\0\x04\x12\x04\xbd\ - \x02\x04\x0c\n\r\n\x05\x04\x0f\x02\0\x05\x12\x04\xbd\x02\r\x11\n\r\n\x05\ - \x04\x0f\x02\0\x01\x12\x04\xbd\x02\x12$\n\r\n\x05\x04\x0f\x02\0\x03\x12\ - \x04\xbd\x02')\n\x0c\n\x02\x05\x06\x12\x06\xc0\x02\0\xc8\x02\x01\n\x0b\n\ - \x03\x05\x06\x01\x12\x04\xc0\x02\x05\x17\n\x0c\n\x04\x05\x06\x02\0\x12\ - \x04\xc1\x02\x02\x12\n\r\n\x05\x05\x06\x02\0\x01\x12\x04\xc1\x02\x02\r\n\ - \r\n\x05\x05\x06\x02\0\x02\x12\x04\xc1\x02\x10\x11\n\x0c\n\x04\x05\x06\ - \x02\x01\x12\x04\xc2\x02\x08\x15\n\r\n\x05\x05\x06\x02\x01\x01\x12\x04\ - \xc2\x02\x08\x10\n\r\n\x05\x05\x06\x02\x01\x02\x12\x04\xc2\x02\x13\x14\n\ - \x0c\n\x04\x05\x06\x02\x02\x12\x04\xc3\x02\x08\x10\n\r\n\x05\x05\x06\x02\ - \x02\x01\x12\x04\xc3\x02\x08\x0b\n\r\n\x05\x05\x06\x02\x02\x02\x12\x04\ - \xc3\x02\x0e\x0f\n\x0c\n\x04\x05\x06\x02\x03\x12\x04\xc4\x02\x02\x16\n\r\ - \n\x05\x05\x06\x02\x03\x01\x12\x04\xc4\x02\x02\x11\n\r\n\x05\x05\x06\x02\ - \x03\x02\x12\x04\xc4\x02\x14\x15\n\x0c\n\x04\x05\x06\x02\x04\x12\x04\xc5\ - \x02\x02\x17\n\r\n\x05\x05\x06\x02\x04\x01\x12\x04\xc5\x02\x02\x12\n\r\n\ - \x05\x05\x06\x02\x04\x02\x12\x04\xc5\x02\x15\x16\n\x0c\n\x04\x05\x06\x02\ - \x05\x12\x04\xc6\x02\x02\n\n\r\n\x05\x05\x06\x02\x05\x01\x12\x04\xc6\x02\ - \x02\x05\n\r\n\x05\x05\x06\x02\x05\x02\x12\x04\xc6\x02\x08\t\n\x0c\n\x04\ - \x05\x06\x02\x06\x12\x04\xc7\x02\x02\x17\n\r\n\x05\x05\x06\x02\x06\x01\ - \x12\x04\xc7\x02\x02\x12\n\r\n\x05\x05\x06\x02\x06\x02\x12\x04\xc7\x02\ - \x15\x16\n\x0c\n\x02\x04\x10\x12\x06\xca\x02\0\xe2\x02\x01\n\x0b\n\x03\ - \x04\x10\x01\x12\x04\xca\x02\x08\x12\n\x0c\n\x04\x04\x10\x02\0\x12\x04\ - \xcb\x02\x02#\n\r\n\x05\x04\x10\x02\0\x04\x12\x04\xcb\x02\x02\n\n\r\n\ - \x05\x04\x10\x02\0\x05\x12\x04\xcb\x02\x0b\x10\n\r\n\x05\x04\x10\x02\0\ - \x01\x12\x04\xcb\x02\x11\x1e\n\r\n\x05\x04\x10\x02\0\x03\x12\x04\xcb\x02\ - !\"\n\x0c\n\x04\x04\x10\x02\x01\x12\x04\xcc\x02\x024\n\r\n\x05\x04\x10\ - \x02\x01\x04\x12\x04\xcc\x02\x02\n\n\r\n\x05\x04\x10\x02\x01\x06\x12\x04\ - \xcc\x02\x0b\x1a\n\r\n\x05\x04\x10\x02\x01\x01\x12\x04\xcc\x02\x1b/\n\r\ - \n\x05\x04\x10\x02\x01\x03\x12\x04\xcc\x0223\n\x0c\n\x04\x04\x10\x02\x02\ - \x12\x04\xcd\x02\x026\n\r\n\x05\x04\x10\x02\x02\x04\x12\x04\xcd\x02\x02\ - \n\n\r\n\x05\x04\x10\x02\x02\x06\x12\x04\xcd\x02\x0b\x1d\n\r\n\x05\x04\ - \x10\x02\x02\x01\x12\x04\xcd\x02\x1e1\n\r\n\x05\x04\x10\x02\x02\x03\x12\ - \x04\xcd\x0245\nC\n\x04\x04\x10\x02\x03\x12\x04\xd0\x02\x02*\x1a5\x20cli\ + ation\x20is\n\x20supported.\n\n\r\n\x05\x04\x10\x02\0\x04\x12\x04\xc5\ + \x02\x04\x0c\n\r\n\x05\x04\x10\x02\0\x05\x12\x04\xc5\x02\r\x11\n\r\n\x05\ + \x04\x10\x02\0\x01\x12\x04\xc5\x02\x12$\n\r\n\x05\x04\x10\x02\0\x03\x12\ + \x04\xc5\x02')\n\x0c\n\x02\x05\x06\x12\x06\xc8\x02\0\xd0\x02\x01\n\x0b\n\ + \x03\x05\x06\x01\x12\x04\xc8\x02\x05\x17\n\x0c\n\x04\x05\x06\x02\0\x12\ + \x04\xc9\x02\x02\x12\n\r\n\x05\x05\x06\x02\0\x01\x12\x04\xc9\x02\x02\r\n\ + \r\n\x05\x05\x06\x02\0\x02\x12\x04\xc9\x02\x10\x11\n\x0c\n\x04\x05\x06\ + \x02\x01\x12\x04\xca\x02\x08\x15\n\r\n\x05\x05\x06\x02\x01\x01\x12\x04\ + \xca\x02\x08\x10\n\r\n\x05\x05\x06\x02\x01\x02\x12\x04\xca\x02\x13\x14\n\ + \x0c\n\x04\x05\x06\x02\x02\x12\x04\xcb\x02\x08\x10\n\r\n\x05\x05\x06\x02\ + \x02\x01\x12\x04\xcb\x02\x08\x0b\n\r\n\x05\x05\x06\x02\x02\x02\x12\x04\ + \xcb\x02\x0e\x0f\n\x0c\n\x04\x05\x06\x02\x03\x12\x04\xcc\x02\x02\x16\n\r\ + \n\x05\x05\x06\x02\x03\x01\x12\x04\xcc\x02\x02\x11\n\r\n\x05\x05\x06\x02\ + \x03\x02\x12\x04\xcc\x02\x14\x15\n\x0c\n\x04\x05\x06\x02\x04\x12\x04\xcd\ + \x02\x02\x17\n\r\n\x05\x05\x06\x02\x04\x01\x12\x04\xcd\x02\x02\x12\n\r\n\ + \x05\x05\x06\x02\x04\x02\x12\x04\xcd\x02\x15\x16\n\x0c\n\x04\x05\x06\x02\ + \x05\x12\x04\xce\x02\x02\n\n\r\n\x05\x05\x06\x02\x05\x01\x12\x04\xce\x02\ + \x02\x05\n\r\n\x05\x05\x06\x02\x05\x02\x12\x04\xce\x02\x08\t\n\x0c\n\x04\ + \x05\x06\x02\x06\x12\x04\xcf\x02\x02\x17\n\r\n\x05\x05\x06\x02\x06\x01\ + \x12\x04\xcf\x02\x02\x12\n\r\n\x05\x05\x06\x02\x06\x02\x12\x04\xcf\x02\ + \x15\x16\n\x0c\n\x02\x04\x11\x12\x06\xd2\x02\0\xec\x02\x01\n\x0b\n\x03\ + \x04\x11\x01\x12\x04\xd2\x02\x08\x12\n\x0c\n\x04\x04\x11\x02\0\x12\x04\ + \xd3\x02\x02#\n\r\n\x05\x04\x11\x02\0\x04\x12\x04\xd3\x02\x02\n\n\r\n\ + \x05\x04\x11\x02\0\x05\x12\x04\xd3\x02\x0b\x10\n\r\n\x05\x04\x11\x02\0\ + \x01\x12\x04\xd3\x02\x11\x1e\n\r\n\x05\x04\x11\x02\0\x03\x12\x04\xd3\x02\ + !\"\n\x0c\n\x04\x04\x11\x02\x01\x12\x04\xd4\x02\x024\n\r\n\x05\x04\x11\ + \x02\x01\x04\x12\x04\xd4\x02\x02\n\n\r\n\x05\x04\x11\x02\x01\x06\x12\x04\ + \xd4\x02\x0b\x1a\n\r\n\x05\x04\x11\x02\x01\x01\x12\x04\xd4\x02\x1b/\n\r\ + \n\x05\x04\x11\x02\x01\x03\x12\x04\xd4\x0223\n\x0c\n\x04\x04\x11\x02\x02\ + \x12\x04\xd5\x02\x026\n\r\n\x05\x04\x11\x02\x02\x04\x12\x04\xd5\x02\x02\ + \n\n\r\n\x05\x04\x11\x02\x02\x06\x12\x04\xd5\x02\x0b\x1d\n\r\n\x05\x04\ + \x11\x02\x02\x01\x12\x04\xd5\x02\x1e1\n\r\n\x05\x04\x11\x02\x02\x03\x12\ + \x04\xd5\x0245\nC\n\x04\x04\x11\x02\x03\x12\x04\xd8\x02\x02*\x1a5\x20cli\ ent\x20source\x20address\x20when\x20receiving\x20a\x20registration\n\n\r\ - \n\x05\x04\x10\x02\x03\x04\x12\x04\xd0\x02\x02\n\n\r\n\x05\x04\x10\x02\ - \x03\x05\x12\x04\xd0\x02\x0b\x10\n\r\n\x05\x04\x10\x02\x03\x01\x12\x04\ - \xd0\x02\x11%\n\r\n\x05\x04\x10\x02\x03\x03\x12\x04\xd0\x02()\nH\n\x04\ - \x04\x10\x02\x04\x12\x04\xd3\x02\x02#\x1a:\x20Decoy\x20address\x20used\ + \n\x05\x04\x11\x02\x03\x04\x12\x04\xd8\x02\x02\n\n\r\n\x05\x04\x11\x02\ + \x03\x05\x12\x04\xd8\x02\x0b\x10\n\r\n\x05\x04\x11\x02\x03\x01\x12\x04\ + \xd8\x02\x11%\n\r\n\x05\x04\x11\x02\x03\x03\x12\x04\xd8\x02()\nH\n\x04\ + \x04\x11\x02\x04\x12\x04\xdb\x02\x02#\x1a:\x20Decoy\x20address\x20used\ \x20when\x20registering\x20over\x20Decoy\x20registrar\n\n\r\n\x05\x04\ - \x10\x02\x04\x04\x12\x04\xd3\x02\x02\n\n\r\n\x05\x04\x10\x02\x04\x05\x12\ - \x04\xd3\x02\x0b\x10\n\r\n\x05\x04\x10\x02\x04\x01\x12\x04\xd3\x02\x11\ - \x1e\n\r\n\x05\x04\x10\x02\x04\x03\x12\x04\xd3\x02!\"\n\xeb\x05\n\x04\ - \x04\x10\x02\x05\x12\x04\xdf\x02\x02:\x1a\xdc\x05\x20The\x20next\x20thre\ + \x11\x02\x04\x04\x12\x04\xdb\x02\x02\n\n\r\n\x05\x04\x11\x02\x04\x05\x12\ + \x04\xdb\x02\x0b\x10\n\r\n\x05\x04\x11\x02\x04\x01\x12\x04\xdb\x02\x11\ + \x1e\n\r\n\x05\x04\x11\x02\x04\x03\x12\x04\xdb\x02!\"\n\xeb\x05\n\x04\ + \x04\x11\x02\x05\x12\x04\xe7\x02\x02:\x1a\xdc\x05\x20The\x20next\x20thre\ e\x20fields\x20allow\x20an\x20independent\x20registrar\x20(trusted\x20by\ \x20a\x20station\x20w/\x20a\x20zmq\x20keypair)\x20to\n\x20share\x20the\ \x20registration\x20overrides\x20that\x20it\x20assigned\x20to\x20the\x20\ @@ -7442,135 +7739,141 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \x20might\n\x20make\x20sense\x20to\x20make\x20the\x20RegistrationRespons\ e\x20that\x20is\x20sent\x20to\x20the\x20client\x20a\x20distinct\x20messa\ ge\x20from\n\x20the\x20one\x20that\x20gets\x20sent\x20to\x20the\x20stati\ - ons.\n\n\r\n\x05\x04\x10\x02\x05\x04\x12\x04\xdf\x02\x02\n\n\r\n\x05\x04\ - \x10\x02\x05\x06\x12\x04\xdf\x02\x0b\x1f\n\r\n\x05\x04\x10\x02\x05\x01\ - \x12\x04\xdf\x02\x205\n\r\n\x05\x04\x10\x02\x05\x03\x12\x04\xdf\x0289\n\ - \x0c\n\x04\x04\x10\x02\x06\x12\x04\xe0\x02\x02\"\n\r\n\x05\x04\x10\x02\ - \x06\x04\x12\x04\xe0\x02\x02\n\n\r\n\x05\x04\x10\x02\x06\x05\x12\x04\xe0\ - \x02\x0b\x10\n\r\n\x05\x04\x10\x02\x06\x01\x12\x04\xe0\x02\x11\x1d\n\r\n\ - \x05\x04\x10\x02\x06\x03\x12\x04\xe0\x02\x20!\n\x0c\n\x04\x04\x10\x02\ - \x07\x12\x04\xe1\x02\x02'\n\r\n\x05\x04\x10\x02\x07\x04\x12\x04\xe1\x02\ - \x02\n\n\r\n\x05\x04\x10\x02\x07\x05\x12\x04\xe1\x02\x0b\x10\n\r\n\x05\ - \x04\x10\x02\x07\x01\x12\x04\xe1\x02\x11!\n\r\n\x05\x04\x10\x02\x07\x03\ - \x12\x04\xe1\x02$&\n\x0c\n\x02\x04\x11\x12\x06\xe4\x02\0\xf0\x02\x01\n\ - \x0b\n\x03\x04\x11\x01\x12\x04\xe4\x02\x08\x14\n9\n\x04\x04\x11\x02\0\ - \x12\x04\xe5\x02\x04.\"+\x20how\x20many\x20decoys\x20were\x20tried\x20be\ - fore\x20success\n\n\r\n\x05\x04\x11\x02\0\x04\x12\x04\xe5\x02\x04\x0c\n\ - \r\n\x05\x04\x11\x02\0\x05\x12\x04\xe5\x02\r\x13\n\r\n\x05\x04\x11\x02\0\ - \x01\x12\x04\xe5\x02\x14(\n\r\n\x05\x04\x11\x02\0\x03\x12\x04\xe5\x02+-\ - \nm\n\x04\x04\x11\x02\x01\x12\x04\xea\x02\x04/\x1a\x1e\x20Applicable\x20\ + ons.\n\n\r\n\x05\x04\x11\x02\x05\x04\x12\x04\xe7\x02\x02\n\n\r\n\x05\x04\ + \x11\x02\x05\x06\x12\x04\xe7\x02\x0b\x1f\n\r\n\x05\x04\x11\x02\x05\x01\ + \x12\x04\xe7\x02\x205\n\r\n\x05\x04\x11\x02\x05\x03\x12\x04\xe7\x0289\n\ + \x0c\n\x04\x04\x11\x02\x06\x12\x04\xe8\x02\x02\"\n\r\n\x05\x04\x11\x02\ + \x06\x04\x12\x04\xe8\x02\x02\n\n\r\n\x05\x04\x11\x02\x06\x05\x12\x04\xe8\ + \x02\x0b\x10\n\r\n\x05\x04\x11\x02\x06\x01\x12\x04\xe8\x02\x11\x1d\n\r\n\ + \x05\x04\x11\x02\x06\x03\x12\x04\xe8\x02\x20!\n\x0c\n\x04\x04\x11\x02\ + \x07\x12\x04\xe9\x02\x02'\n\r\n\x05\x04\x11\x02\x07\x04\x12\x04\xe9\x02\ + \x02\n\n\r\n\x05\x04\x11\x02\x07\x05\x12\x04\xe9\x02\x0b\x10\n\r\n\x05\ + \x04\x11\x02\x07\x01\x12\x04\xe9\x02\x11!\n\r\n\x05\x04\x11\x02\x07\x03\ + \x12\x04\xe9\x02$&\n\x0c\n\x02\x04\x12\x12\x06\xee\x02\0\xfa\x02\x01\n\ + \x0b\n\x03\x04\x12\x01\x12\x04\xee\x02\x08\x14\n9\n\x04\x04\x12\x02\0\ + \x12\x04\xef\x02\x04.\"+\x20how\x20many\x20decoys\x20were\x20tried\x20be\ + fore\x20success\n\n\r\n\x05\x04\x12\x02\0\x04\x12\x04\xef\x02\x04\x0c\n\ + \r\n\x05\x04\x12\x02\0\x05\x12\x04\xef\x02\r\x13\n\r\n\x05\x04\x12\x02\0\ + \x01\x12\x04\xef\x02\x14(\n\r\n\x05\x04\x12\x02\0\x03\x12\x04\xef\x02+-\ + \nm\n\x04\x04\x12\x02\x01\x12\x04\xf4\x02\x04/\x1a\x1e\x20Applicable\x20\ to\x20whole\x20session:\n\"\x1a\x20includes\x20failed\x20attempts\n2#\ - \x20Timings\x20below\x20are\x20in\x20milliseconds\n\n\r\n\x05\x04\x11\ - \x02\x01\x04\x12\x04\xea\x02\x04\x0c\n\r\n\x05\x04\x11\x02\x01\x05\x12\ - \x04\xea\x02\r\x13\n\r\n\x05\x04\x11\x02\x01\x01\x12\x04\xea\x02\x14)\n\ - \r\n\x05\x04\x11\x02\x01\x03\x12\x04\xea\x02,.\nR\n\x04\x04\x11\x02\x02\ - \x12\x04\xed\x02\x04(\x1a\x1f\x20Last\x20(i.e.\x20successful)\x20decoy:\ - \n\"#\x20measured\x20during\x20initial\x20handshake\n\n\r\n\x05\x04\x11\ - \x02\x02\x04\x12\x04\xed\x02\x04\x0c\n\r\n\x05\x04\x11\x02\x02\x05\x12\ - \x04\xed\x02\r\x13\n\r\n\x05\x04\x11\x02\x02\x01\x12\x04\xed\x02\x14\"\n\ - \r\n\x05\x04\x11\x02\x02\x03\x12\x04\xed\x02%'\n%\n\x04\x04\x11\x02\x03\ - \x12\x04\xee\x02\x04&\"\x17\x20includes\x20tcp\x20to\x20decoy\n\n\r\n\ - \x05\x04\x11\x02\x03\x04\x12\x04\xee\x02\x04\x0c\n\r\n\x05\x04\x11\x02\ - \x03\x05\x12\x04\xee\x02\r\x13\n\r\n\x05\x04\x11\x02\x03\x01\x12\x04\xee\ - \x02\x14\x20\n\r\n\x05\x04\x11\x02\x03\x03\x12\x04\xee\x02#%\nB\n\x04\ - \x04\x11\x02\x04\x12\x04\xef\x02\x04&\"4\x20measured\x20when\x20establis\ - hing\x20tcp\x20connection\x20to\x20decot\n\n\r\n\x05\x04\x11\x02\x04\x04\ - \x12\x04\xef\x02\x04\x0c\n\r\n\x05\x04\x11\x02\x04\x05\x12\x04\xef\x02\r\ - \x13\n\r\n\x05\x04\x11\x02\x04\x01\x12\x04\xef\x02\x14\x20\n\r\n\x05\x04\ - \x11\x02\x04\x03\x12\x04\xef\x02#%\n\x0c\n\x02\x05\x07\x12\x06\xf2\x02\0\ - \xf7\x02\x01\n\x0b\n\x03\x05\x07\x01\x12\x04\xf2\x02\x05\x16\n\x0c\n\x04\ - \x05\x07\x02\0\x12\x04\xf3\x02\x04\x10\n\r\n\x05\x05\x07\x02\0\x01\x12\ - \x04\xf3\x02\x04\x0b\n\r\n\x05\x05\x07\x02\0\x02\x12\x04\xf3\x02\x0e\x0f\ - \n\x0c\n\x04\x05\x07\x02\x01\x12\x04\xf4\x02\x04\x0c\n\r\n\x05\x05\x07\ - \x02\x01\x01\x12\x04\xf4\x02\x04\x07\n\r\n\x05\x05\x07\x02\x01\x02\x12\ - \x04\xf4\x02\n\x0b\n\x0c\n\x04\x05\x07\x02\x02\x12\x04\xf5\x02\x04\x0f\n\ - \r\n\x05\x05\x07\x02\x02\x01\x12\x04\xf5\x02\x04\n\n\r\n\x05\x05\x07\x02\ - \x02\x02\x12\x04\xf5\x02\r\x0e\n\x0c\n\x04\x05\x07\x02\x03\x12\x04\xf6\ - \x02\x04\x0e\n\r\n\x05\x05\x07\x02\x03\x01\x12\x04\xf6\x02\x04\t\n\r\n\ - \x05\x05\x07\x02\x03\x02\x12\x04\xf6\x02\x0c\r\n\x0c\n\x02\x05\x08\x12\ - \x06\xf9\x02\0\xfd\x02\x01\n\x0b\n\x03\x05\x08\x01\x12\x04\xf9\x02\x05\ - \x0c\n\x0c\n\x04\x05\x08\x02\0\x12\x04\xfa\x02\x04\x0c\n\r\n\x05\x05\x08\ - \x02\0\x01\x12\x04\xfa\x02\x04\x07\n\r\n\x05\x05\x08\x02\0\x02\x12\x04\ - \xfa\x02\n\x0b\n\x0c\n\x04\x05\x08\x02\x01\x12\x04\xfb\x02\x04\x0c\n\r\n\ - \x05\x05\x08\x02\x01\x01\x12\x04\xfb\x02\x04\x07\n\r\n\x05\x05\x08\x02\ - \x01\x02\x12\x04\xfb\x02\n\x0b\n\x0c\n\x04\x05\x08\x02\x02\x12\x04\xfc\ - \x02\x04\x0c\n\r\n\x05\x05\x08\x02\x02\x01\x12\x04\xfc\x02\x04\x07\n\r\n\ - \x05\x05\x08\x02\x02\x02\x12\x04\xfc\x02\n\x0b\n\x0c\n\x02\x04\x12\x12\ - \x06\xff\x02\0\x8a\x03\x01\n\x0b\n\x03\x04\x12\x01\x12\x04\xff\x02\x08\ - \x19\n\x0c\n\x04\x04\x12\x02\0\x12\x04\x80\x03\x04#\n\r\n\x05\x04\x12\ - \x02\0\x04\x12\x04\x80\x03\x04\x0c\n\r\n\x05\x04\x12\x02\0\x05\x12\x04\ - \x80\x03\r\x13\n\r\n\x05\x04\x12\x02\0\x01\x12\x04\x80\x03\x14\x1e\n\r\n\ - \x05\x04\x12\x02\0\x03\x12\x04\x80\x03!\"\n\x0c\n\x04\x04\x12\x02\x01\ - \x12\x04\x81\x03\x04\"\n\r\n\x05\x04\x12\x02\x01\x04\x12\x04\x81\x03\x04\ - \x0c\n\r\n\x05\x04\x12\x02\x01\x05\x12\x04\x81\x03\r\x13\n\r\n\x05\x04\ - \x12\x02\x01\x01\x12\x04\x81\x03\x14\x1d\n\r\n\x05\x04\x12\x02\x01\x03\ - \x12\x04\x81\x03\x20!\n\x0c\n\x04\x04\x12\x02\x02\x12\x04\x83\x03\x04#\n\ - \r\n\x05\x04\x12\x02\x02\x04\x12\x04\x83\x03\x04\x0c\n\r\n\x05\x04\x12\ - \x02\x02\x05\x12\x04\x83\x03\r\x13\n\r\n\x05\x04\x12\x02\x02\x01\x12\x04\ - \x83\x03\x14\x1e\n\r\n\x05\x04\x12\x02\x02\x03\x12\x04\x83\x03!\"\n\x0c\ - \n\x04\x04\x12\x02\x03\x12\x04\x85\x03\x04-\n\r\n\x05\x04\x12\x02\x03\ - \x04\x12\x04\x85\x03\x04\x0c\n\r\n\x05\x04\x12\x02\x03\x06\x12\x04\x85\ - \x03\r\x1e\n\r\n\x05\x04\x12\x02\x03\x01\x12\x04\x85\x03\x1f(\n\r\n\x05\ - \x04\x12\x02\x03\x03\x12\x04\x85\x03+,\n\x0c\n\x04\x04\x12\x02\x04\x12\ - \x04\x87\x03\x04\"\n\r\n\x05\x04\x12\x02\x04\x04\x12\x04\x87\x03\x04\x0c\ - \n\r\n\x05\x04\x12\x02\x04\x05\x12\x04\x87\x03\r\x13\n\r\n\x05\x04\x12\ - \x02\x04\x01\x12\x04\x87\x03\x14\x1c\n\r\n\x05\x04\x12\x02\x04\x03\x12\ - \x04\x87\x03\x1f!\n\x0c\n\x04\x04\x12\x02\x05\x12\x04\x88\x03\x04\"\n\r\ - \n\x05\x04\x12\x02\x05\x04\x12\x04\x88\x03\x04\x0c\n\r\n\x05\x04\x12\x02\ - \x05\x05\x12\x04\x88\x03\r\x13\n\r\n\x05\x04\x12\x02\x05\x01\x12\x04\x88\ - \x03\x14\x1c\n\r\n\x05\x04\x12\x02\x05\x03\x12\x04\x88\x03\x1f!\n\x0c\n\ - \x04\x04\x12\x02\x06\x12\x04\x89\x03\x04\x20\n\r\n\x05\x04\x12\x02\x06\ - \x04\x12\x04\x89\x03\x04\x0c\n\r\n\x05\x04\x12\x02\x06\x06\x12\x04\x89\ - \x03\r\x14\n\r\n\x05\x04\x12\x02\x06\x01\x12\x04\x89\x03\x15\x1a\n\r\n\ - \x05\x04\x12\x02\x06\x03\x12\x04\x89\x03\x1d\x1f\nT\n\x02\x04\x13\x12\ - \x06\x8d\x03\0\xa1\x03\x01\x1aF\x20Adding\x20message\x20response\x20from\ + \x20Timings\x20below\x20are\x20in\x20milliseconds\n\n\r\n\x05\x04\x12\ + \x02\x01\x04\x12\x04\xf4\x02\x04\x0c\n\r\n\x05\x04\x12\x02\x01\x05\x12\ + \x04\xf4\x02\r\x13\n\r\n\x05\x04\x12\x02\x01\x01\x12\x04\xf4\x02\x14)\n\ + \r\n\x05\x04\x12\x02\x01\x03\x12\x04\xf4\x02,.\nR\n\x04\x04\x12\x02\x02\ + \x12\x04\xf7\x02\x04(\x1a\x1f\x20Last\x20(i.e.\x20successful)\x20decoy:\ + \n\"#\x20measured\x20during\x20initial\x20handshake\n\n\r\n\x05\x04\x12\ + \x02\x02\x04\x12\x04\xf7\x02\x04\x0c\n\r\n\x05\x04\x12\x02\x02\x05\x12\ + \x04\xf7\x02\r\x13\n\r\n\x05\x04\x12\x02\x02\x01\x12\x04\xf7\x02\x14\"\n\ + \r\n\x05\x04\x12\x02\x02\x03\x12\x04\xf7\x02%'\n%\n\x04\x04\x12\x02\x03\ + \x12\x04\xf8\x02\x04&\"\x17\x20includes\x20tcp\x20to\x20decoy\n\n\r\n\ + \x05\x04\x12\x02\x03\x04\x12\x04\xf8\x02\x04\x0c\n\r\n\x05\x04\x12\x02\ + \x03\x05\x12\x04\xf8\x02\r\x13\n\r\n\x05\x04\x12\x02\x03\x01\x12\x04\xf8\ + \x02\x14\x20\n\r\n\x05\x04\x12\x02\x03\x03\x12\x04\xf8\x02#%\nB\n\x04\ + \x04\x12\x02\x04\x12\x04\xf9\x02\x04&\"4\x20measured\x20when\x20establis\ + hing\x20tcp\x20connection\x20to\x20decot\n\n\r\n\x05\x04\x12\x02\x04\x04\ + \x12\x04\xf9\x02\x04\x0c\n\r\n\x05\x04\x12\x02\x04\x05\x12\x04\xf9\x02\r\ + \x13\n\r\n\x05\x04\x12\x02\x04\x01\x12\x04\xf9\x02\x14\x20\n\r\n\x05\x04\ + \x12\x02\x04\x03\x12\x04\xf9\x02#%\n\x0c\n\x02\x05\x07\x12\x06\xfc\x02\0\ + \x81\x03\x01\n\x0b\n\x03\x05\x07\x01\x12\x04\xfc\x02\x05\x16\n\x0c\n\x04\ + \x05\x07\x02\0\x12\x04\xfd\x02\x04\x10\n\r\n\x05\x05\x07\x02\0\x01\x12\ + \x04\xfd\x02\x04\x0b\n\r\n\x05\x05\x07\x02\0\x02\x12\x04\xfd\x02\x0e\x0f\ + \n\x0c\n\x04\x05\x07\x02\x01\x12\x04\xfe\x02\x04\x0c\n\r\n\x05\x05\x07\ + \x02\x01\x01\x12\x04\xfe\x02\x04\x07\n\r\n\x05\x05\x07\x02\x01\x02\x12\ + \x04\xfe\x02\n\x0b\n\x0c\n\x04\x05\x07\x02\x02\x12\x04\xff\x02\x04\x0f\n\ + \r\n\x05\x05\x07\x02\x02\x01\x12\x04\xff\x02\x04\n\n\r\n\x05\x05\x07\x02\ + \x02\x02\x12\x04\xff\x02\r\x0e\n\x0c\n\x04\x05\x07\x02\x03\x12\x04\x80\ + \x03\x04\x0e\n\r\n\x05\x05\x07\x02\x03\x01\x12\x04\x80\x03\x04\t\n\r\n\ + \x05\x05\x07\x02\x03\x02\x12\x04\x80\x03\x0c\r\n\x0c\n\x02\x05\x08\x12\ + \x06\x83\x03\0\x87\x03\x01\n\x0b\n\x03\x05\x08\x01\x12\x04\x83\x03\x05\ + \x0c\n\x0c\n\x04\x05\x08\x02\0\x12\x04\x84\x03\x04\x0c\n\r\n\x05\x05\x08\ + \x02\0\x01\x12\x04\x84\x03\x04\x07\n\r\n\x05\x05\x08\x02\0\x02\x12\x04\ + \x84\x03\n\x0b\n\x0c\n\x04\x05\x08\x02\x01\x12\x04\x85\x03\x04\x0c\n\r\n\ + \x05\x05\x08\x02\x01\x01\x12\x04\x85\x03\x04\x07\n\r\n\x05\x05\x08\x02\ + \x01\x02\x12\x04\x85\x03\n\x0b\n\x0c\n\x04\x05\x08\x02\x02\x12\x04\x86\ + \x03\x04\x0c\n\r\n\x05\x05\x08\x02\x02\x01\x12\x04\x86\x03\x04\x07\n\r\n\ + \x05\x05\x08\x02\x02\x02\x12\x04\x86\x03\n\x0b\n\x0c\n\x02\x04\x13\x12\ + \x06\x89\x03\0\x94\x03\x01\n\x0b\n\x03\x04\x13\x01\x12\x04\x89\x03\x08\ + \x19\n\x0c\n\x04\x04\x13\x02\0\x12\x04\x8a\x03\x04#\n\r\n\x05\x04\x13\ + \x02\0\x04\x12\x04\x8a\x03\x04\x0c\n\r\n\x05\x04\x13\x02\0\x05\x12\x04\ + \x8a\x03\r\x13\n\r\n\x05\x04\x13\x02\0\x01\x12\x04\x8a\x03\x14\x1e\n\r\n\ + \x05\x04\x13\x02\0\x03\x12\x04\x8a\x03!\"\n\x0c\n\x04\x04\x13\x02\x01\ + \x12\x04\x8b\x03\x04\"\n\r\n\x05\x04\x13\x02\x01\x04\x12\x04\x8b\x03\x04\ + \x0c\n\r\n\x05\x04\x13\x02\x01\x05\x12\x04\x8b\x03\r\x13\n\r\n\x05\x04\ + \x13\x02\x01\x01\x12\x04\x8b\x03\x14\x1d\n\r\n\x05\x04\x13\x02\x01\x03\ + \x12\x04\x8b\x03\x20!\n\x0c\n\x04\x04\x13\x02\x02\x12\x04\x8d\x03\x04#\n\ + \r\n\x05\x04\x13\x02\x02\x04\x12\x04\x8d\x03\x04\x0c\n\r\n\x05\x04\x13\ + \x02\x02\x05\x12\x04\x8d\x03\r\x13\n\r\n\x05\x04\x13\x02\x02\x01\x12\x04\ + \x8d\x03\x14\x1e\n\r\n\x05\x04\x13\x02\x02\x03\x12\x04\x8d\x03!\"\n\x0c\ + \n\x04\x04\x13\x02\x03\x12\x04\x8f\x03\x04-\n\r\n\x05\x04\x13\x02\x03\ + \x04\x12\x04\x8f\x03\x04\x0c\n\r\n\x05\x04\x13\x02\x03\x06\x12\x04\x8f\ + \x03\r\x1e\n\r\n\x05\x04\x13\x02\x03\x01\x12\x04\x8f\x03\x1f(\n\r\n\x05\ + \x04\x13\x02\x03\x03\x12\x04\x8f\x03+,\n\x0c\n\x04\x04\x13\x02\x04\x12\ + \x04\x91\x03\x04\"\n\r\n\x05\x04\x13\x02\x04\x04\x12\x04\x91\x03\x04\x0c\ + \n\r\n\x05\x04\x13\x02\x04\x05\x12\x04\x91\x03\r\x13\n\r\n\x05\x04\x13\ + \x02\x04\x01\x12\x04\x91\x03\x14\x1c\n\r\n\x05\x04\x13\x02\x04\x03\x12\ + \x04\x91\x03\x1f!\n\x0c\n\x04\x04\x13\x02\x05\x12\x04\x92\x03\x04\"\n\r\ + \n\x05\x04\x13\x02\x05\x04\x12\x04\x92\x03\x04\x0c\n\r\n\x05\x04\x13\x02\ + \x05\x05\x12\x04\x92\x03\r\x13\n\r\n\x05\x04\x13\x02\x05\x01\x12\x04\x92\ + \x03\x14\x1c\n\r\n\x05\x04\x13\x02\x05\x03\x12\x04\x92\x03\x1f!\n\x0c\n\ + \x04\x04\x13\x02\x06\x12\x04\x93\x03\x04\x20\n\r\n\x05\x04\x13\x02\x06\ + \x04\x12\x04\x93\x03\x04\x0c\n\r\n\x05\x04\x13\x02\x06\x06\x12\x04\x93\ + \x03\r\x14\n\r\n\x05\x04\x13\x02\x06\x01\x12\x04\x93\x03\x15\x1a\n\r\n\ + \x05\x04\x13\x02\x06\x03\x12\x04\x93\x03\x1d\x1f\nT\n\x02\x04\x14\x12\ + \x06\x97\x03\0\xaf\x03\x01\x1aF\x20Adding\x20message\x20response\x20from\ \x20Station\x20to\x20Client\x20for\x20bidirectional\x20API\n\n\x0b\n\x03\ - \x04\x13\x01\x12\x04\x8d\x03\x08\x1c\n\x0c\n\x04\x04\x13\x02\0\x12\x04\ - \x8e\x03\x02\x20\n\r\n\x05\x04\x13\x02\0\x04\x12\x04\x8e\x03\x02\n\n\r\n\ - \x05\x04\x13\x02\0\x05\x12\x04\x8e\x03\x0b\x12\n\r\n\x05\x04\x13\x02\0\ - \x01\x12\x04\x8e\x03\x13\x1b\n\r\n\x05\x04\x13\x02\0\x03\x12\x04\x8e\x03\ - \x1e\x1f\n?\n\x04\x04\x13\x02\x01\x12\x04\x90\x03\x02\x1e\x1a1\x20The\ + \x04\x14\x01\x12\x04\x97\x03\x08\x1c\n\x0c\n\x04\x04\x14\x02\0\x12\x04\ + \x98\x03\x02\x20\n\r\n\x05\x04\x14\x02\0\x04\x12\x04\x98\x03\x02\n\n\r\n\ + \x05\x04\x14\x02\0\x05\x12\x04\x98\x03\x0b\x12\n\r\n\x05\x04\x14\x02\0\ + \x01\x12\x04\x98\x03\x13\x1b\n\r\n\x05\x04\x14\x02\0\x03\x12\x04\x98\x03\ + \x1e\x1f\n?\n\x04\x04\x14\x02\x01\x12\x04\x9a\x03\x02\x1e\x1a1\x20The\ \x20128-bit\x20ipv6\x20address,\x20in\x20network\x20byte\x20order\n\n\r\ - \n\x05\x04\x13\x02\x01\x04\x12\x04\x90\x03\x02\n\n\r\n\x05\x04\x13\x02\ - \x01\x05\x12\x04\x90\x03\x0b\x10\n\r\n\x05\x04\x13\x02\x01\x01\x12\x04\ - \x90\x03\x11\x19\n\r\n\x05\x04\x13\x02\x01\x03\x12\x04\x90\x03\x1c\x1d\n\ - ,\n\x04\x04\x13\x02\x02\x12\x04\x93\x03\x02\x1f\x1a\x1e\x20Respond\x20wi\ - th\x20randomized\x20port\n\n\r\n\x05\x04\x13\x02\x02\x04\x12\x04\x93\x03\ - \x02\n\n\r\n\x05\x04\x13\x02\x02\x05\x12\x04\x93\x03\x0b\x11\n\r\n\x05\ - \x04\x13\x02\x02\x01\x12\x04\x93\x03\x12\x1a\n\r\n\x05\x04\x13\x02\x02\ - \x03\x12\x04\x93\x03\x1d\x1e\nd\n\x04\x04\x13\x02\x03\x12\x04\x97\x03\ + \n\x05\x04\x14\x02\x01\x04\x12\x04\x9a\x03\x02\n\n\r\n\x05\x04\x14\x02\ + \x01\x05\x12\x04\x9a\x03\x0b\x10\n\r\n\x05\x04\x14\x02\x01\x01\x12\x04\ + \x9a\x03\x11\x19\n\r\n\x05\x04\x14\x02\x01\x03\x12\x04\x9a\x03\x1c\x1d\n\ + ,\n\x04\x04\x14\x02\x02\x12\x04\x9d\x03\x02\x1f\x1a\x1e\x20Respond\x20wi\ + th\x20randomized\x20port\n\n\r\n\x05\x04\x14\x02\x02\x04\x12\x04\x9d\x03\ + \x02\n\n\r\n\x05\x04\x14\x02\x02\x05\x12\x04\x9d\x03\x0b\x11\n\r\n\x05\ + \x04\x14\x02\x02\x01\x12\x04\x9d\x03\x12\x1a\n\r\n\x05\x04\x14\x02\x02\ + \x03\x12\x04\x9d\x03\x1d\x1e\nd\n\x04\x04\x14\x02\x03\x12\x04\xa1\x03\ \x02\"\x1aV\x20Future:\x20station\x20provides\x20client\x20with\x20secre\ t,\x20want\x20chanel\x20present\n\x20Leave\x20null\x20for\x20now\n\n\r\n\ - \x05\x04\x13\x02\x03\x04\x12\x04\x97\x03\x02\n\n\r\n\x05\x04\x13\x02\x03\ - \x05\x12\x04\x97\x03\x0b\x10\n\r\n\x05\x04\x13\x02\x03\x01\x12\x04\x97\ - \x03\x11\x1d\n\r\n\x05\x04\x13\x02\x03\x03\x12\x04\x97\x03\x20!\nA\n\x04\ - \x04\x13\x02\x04\x12\x04\x9a\x03\x02\x1c\x1a3\x20If\x20registration\x20w\ - rong,\x20populate\x20this\x20error\x20string\n\n\r\n\x05\x04\x13\x02\x04\ - \x04\x12\x04\x9a\x03\x02\n\n\r\n\x05\x04\x13\x02\x04\x05\x12\x04\x9a\x03\ - \x0b\x11\n\r\n\x05\x04\x13\x02\x04\x01\x12\x04\x9a\x03\x12\x17\n\r\n\x05\ - \x04\x13\x02\x04\x03\x12\x04\x9a\x03\x1a\x1b\n+\n\x04\x04\x13\x02\x05\ - \x12\x04\x9d\x03\x02%\x1a\x1d\x20ClientConf\x20field\x20(optional)\n\n\r\ - \n\x05\x04\x13\x02\x05\x04\x12\x04\x9d\x03\x02\n\n\r\n\x05\x04\x13\x02\ - \x05\x06\x12\x04\x9d\x03\x0b\x15\n\r\n\x05\x04\x13\x02\x05\x01\x12\x04\ - \x9d\x03\x16\x20\n\r\n\x05\x04\x13\x02\x05\x03\x12\x04\x9d\x03#$\nJ\n\ - \x04\x04\x13\x02\x06\x12\x04\xa0\x03\x025\x1a<\x20Transport\x20Params\ + \x05\x04\x14\x02\x03\x04\x12\x04\xa1\x03\x02\n\n\r\n\x05\x04\x14\x02\x03\ + \x05\x12\x04\xa1\x03\x0b\x10\n\r\n\x05\x04\x14\x02\x03\x01\x12\x04\xa1\ + \x03\x11\x1d\n\r\n\x05\x04\x14\x02\x03\x03\x12\x04\xa1\x03\x20!\nA\n\x04\ + \x04\x14\x02\x04\x12\x04\xa4\x03\x02\x1c\x1a3\x20If\x20registration\x20w\ + rong,\x20populate\x20this\x20error\x20string\n\n\r\n\x05\x04\x14\x02\x04\ + \x04\x12\x04\xa4\x03\x02\n\n\r\n\x05\x04\x14\x02\x04\x05\x12\x04\xa4\x03\ + \x0b\x11\n\r\n\x05\x04\x14\x02\x04\x01\x12\x04\xa4\x03\x12\x17\n\r\n\x05\ + \x04\x14\x02\x04\x03\x12\x04\xa4\x03\x1a\x1b\n+\n\x04\x04\x14\x02\x05\ + \x12\x04\xa7\x03\x02%\x1a\x1d\x20ClientConf\x20field\x20(optional)\n\n\r\ + \n\x05\x04\x14\x02\x05\x04\x12\x04\xa7\x03\x02\n\n\r\n\x05\x04\x14\x02\ + \x05\x06\x12\x04\xa7\x03\x0b\x15\n\r\n\x05\x04\x14\x02\x05\x01\x12\x04\ + \xa7\x03\x16\x20\n\r\n\x05\x04\x14\x02\x05\x03\x12\x04\xa7\x03#$\nJ\n\ + \x04\x04\x14\x02\x06\x12\x04\xaa\x03\x025\x1a<\x20Transport\x20Params\ \x20to\x20if\x20`allow_registrar_overrides`\x20is\x20set.\n\n\r\n\x05\ - \x04\x13\x02\x06\x04\x12\x04\xa0\x03\x02\n\n\r\n\x05\x04\x13\x02\x06\x06\ - \x12\x04\xa0\x03\x0b\x1e\n\r\n\x05\x04\x13\x02\x06\x01\x12\x04\xa0\x03\ - \x1f/\n\r\n\x05\x04\x13\x02\x06\x03\x12\x04\xa0\x0324\n!\n\x02\x04\x14\ - \x12\x06\xa4\x03\0\xa8\x03\x01\x1a\x13\x20response\x20from\x20dns\n\n\ - \x0b\n\x03\x04\x14\x01\x12\x04\xa4\x03\x08\x13\n\x0c\n\x04\x04\x14\x02\0\ - \x12\x04\xa5\x03\x04\x1e\n\r\n\x05\x04\x14\x02\0\x04\x12\x04\xa5\x03\x04\ - \x0c\n\r\n\x05\x04\x14\x02\0\x05\x12\x04\xa5\x03\r\x11\n\r\n\x05\x04\x14\ - \x02\0\x01\x12\x04\xa5\x03\x12\x19\n\r\n\x05\x04\x14\x02\0\x03\x12\x04\ - \xa5\x03\x1c\x1d\n\x0c\n\x04\x04\x14\x02\x01\x12\x04\xa6\x03\x04*\n\r\n\ - \x05\x04\x14\x02\x01\x04\x12\x04\xa6\x03\x04\x0c\n\r\n\x05\x04\x14\x02\ - \x01\x05\x12\x04\xa6\x03\r\x11\n\r\n\x05\x04\x14\x02\x01\x01\x12\x04\xa6\ - \x03\x12%\n\r\n\x05\x04\x14\x02\x01\x03\x12\x04\xa6\x03()\n\x0c\n\x04\ - \x04\x14\x02\x02\x12\x04\xa7\x03\x04=\n\r\n\x05\x04\x14\x02\x02\x04\x12\ - \x04\xa7\x03\x04\x0c\n\r\n\x05\x04\x14\x02\x02\x06\x12\x04\xa7\x03\r!\n\ - \r\n\x05\x04\x14\x02\x02\x01\x12\x04\xa7\x03\"8\n\r\n\x05\x04\x14\x02\ - \x02\x03\x12\x04\xa7\x03;<\ + \x04\x14\x02\x06\x04\x12\x04\xaa\x03\x02\n\n\r\n\x05\x04\x14\x02\x06\x06\ + \x12\x04\xaa\x03\x0b\x1e\n\r\n\x05\x04\x14\x02\x06\x01\x12\x04\xaa\x03\ + \x1f/\n\r\n\x05\x04\x14\x02\x06\x03\x12\x04\xaa\x0324\n\x9c\x01\n\x04\ + \x04\x14\x02\x07\x12\x04\xae\x03\x020\x1a\x8d\x01\x20PhantomsSupportPort\ + Rand\x20is\x20a\x20flag\x20that\x20indicates\x20whether\x20the\x20select\ + ed\x20phantoms\x20are\x20able\x20to\n\x20handle\x20phantom\x20connection\ + s\x20to\x20randomized\x20ports.\n\n\r\n\x05\x04\x14\x02\x07\x04\x12\x04\ + \xae\x03\x02\n\n\r\n\x05\x04\x14\x02\x07\x05\x12\x04\xae\x03\x0b\x0f\n\r\ + \n\x05\x04\x14\x02\x07\x01\x12\x04\xae\x03\x10*\n\r\n\x05\x04\x14\x02\ + \x07\x03\x12\x04\xae\x03-/\n!\n\x02\x04\x15\x12\x06\xb2\x03\0\xb6\x03\ + \x01\x1a\x13\x20response\x20from\x20dns\n\n\x0b\n\x03\x04\x15\x01\x12\ + \x04\xb2\x03\x08\x13\n\x0c\n\x04\x04\x15\x02\0\x12\x04\xb3\x03\x04\x1e\n\ + \r\n\x05\x04\x15\x02\0\x04\x12\x04\xb3\x03\x04\x0c\n\r\n\x05\x04\x15\x02\ + \0\x05\x12\x04\xb3\x03\r\x11\n\r\n\x05\x04\x15\x02\0\x01\x12\x04\xb3\x03\ + \x12\x19\n\r\n\x05\x04\x15\x02\0\x03\x12\x04\xb3\x03\x1c\x1d\n\x0c\n\x04\ + \x04\x15\x02\x01\x12\x04\xb4\x03\x04*\n\r\n\x05\x04\x15\x02\x01\x04\x12\ + \x04\xb4\x03\x04\x0c\n\r\n\x05\x04\x15\x02\x01\x05\x12\x04\xb4\x03\r\x11\ + \n\r\n\x05\x04\x15\x02\x01\x01\x12\x04\xb4\x03\x12%\n\r\n\x05\x04\x15\ + \x02\x01\x03\x12\x04\xb4\x03()\n\x0c\n\x04\x04\x15\x02\x02\x12\x04\xb5\ + \x03\x04=\n\r\n\x05\x04\x15\x02\x02\x04\x12\x04\xb5\x03\x04\x0c\n\r\n\ + \x05\x04\x15\x02\x02\x06\x12\x04\xb5\x03\r!\n\r\n\x05\x04\x15\x02\x02\ + \x01\x12\x04\xb5\x03\"8\n\r\n\x05\x04\x15\x02\x02\x03\x12\x04\xb5\x03;<\ "; /// `FileDescriptorProto` object which was a source for this generated file @@ -7589,7 +7892,7 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor { let generated_file_descriptor = generated_file_descriptor_lazy.get(|| { let mut deps = ::std::vec::Vec::with_capacity(1); deps.push(::protobuf::well_known_types::any::file_descriptor().clone()); - let mut messages = ::std::vec::Vec::with_capacity(21); + let mut messages = ::std::vec::Vec::with_capacity(22); messages.push(PubKey::generated_message_descriptor_data()); messages.push(TLSDecoySpec::generated_message_descriptor_data()); messages.push(ClientConf::generated_message_descriptor_data()); @@ -7600,6 +7903,7 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor { messages.push(WebRTCICECandidate::generated_message_descriptor_data()); messages.push(WebRTCSDP::generated_message_descriptor_data()); messages.push(WebRTCSignal::generated_message_descriptor_data()); + messages.push(Addr::generated_message_descriptor_data()); messages.push(DTLSTransportParams::generated_message_descriptor_data()); messages.push(StationToClient::generated_message_descriptor_data()); messages.push(RegistrationFlags::generated_message_descriptor_data()); diff --git a/src/signalling.rs b/src/signalling.rs index 22fee424..f70cc7c1 100644 --- a/src/signalling.rs +++ b/src/signalling.rs @@ -2301,14 +2301,214 @@ impl ::protobuf::reflect::ProtobufValue for WebRTCSignal { type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; } +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.Addr) +pub struct Addr { + // message fields + // @@protoc_insertion_point(field:proto.Addr.IP) + pub IP: ::std::option::Option<::std::vec::Vec>, + // @@protoc_insertion_point(field:proto.Addr.Port) + pub Port: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:proto.Addr.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a Addr { + fn default() -> &'a Addr { + ::default_instance() + } +} + +impl Addr { + pub fn new() -> Addr { + ::std::default::Default::default() + } + + // optional bytes IP = 1; + + pub fn IP(&self) -> &[u8] { + match self.IP.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_IP(&mut self) { + self.IP = ::std::option::Option::None; + } + + pub fn has_IP(&self) -> bool { + self.IP.is_some() + } + + // Param is passed by value, moved + pub fn set_IP(&mut self, v: ::std::vec::Vec) { + self.IP = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_IP(&mut self) -> &mut ::std::vec::Vec { + if self.IP.is_none() { + self.IP = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.IP.as_mut().unwrap() + } + + // Take field + pub fn take_IP(&mut self) -> ::std::vec::Vec { + self.IP.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional uint32 Port = 2; + + pub fn Port(&self) -> u32 { + self.Port.unwrap_or(0) + } + + pub fn clear_Port(&mut self) { + self.Port = ::std::option::Option::None; + } + + pub fn has_Port(&self) -> bool { + self.Port.is_some() + } + + // Param is passed by value, moved + pub fn set_Port(&mut self, v: u32) { + self.Port = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(2); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "IP", + |m: &Addr| { &m.IP }, + |m: &mut Addr| { &mut m.IP }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "Port", + |m: &Addr| { &m.Port }, + |m: &mut Addr| { &mut m.Port }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "Addr", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for Addr { + const NAME: &'static str = "Addr"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + self.IP = ::std::option::Option::Some(is.read_bytes()?); + }, + 16 => { + self.Port = ::std::option::Option::Some(is.read_uint32()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.IP.as_ref() { + my_size += ::protobuf::rt::bytes_size(1, &v); + } + if let Some(v) = self.Port { + my_size += ::protobuf::rt::uint32_size(2, v); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.IP.as_ref() { + os.write_bytes(1, v)?; + } + if let Some(v) = self.Port { + os.write_uint32(2, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> Addr { + Addr::new() + } + + fn clear(&mut self) { + self.IP = ::std::option::Option::None; + self.Port = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static Addr { + static instance: Addr = Addr { + IP: ::std::option::Option::None, + Port: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for Addr { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("Addr").unwrap()).clone() + } +} + +impl ::std::fmt::Display for Addr { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for Addr { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + #[derive(PartialEq,Clone,Default,Debug)] // @@protoc_insertion_point(message:proto.DTLSTransportParams) pub struct DTLSTransportParams { // message fields - // @@protoc_insertion_point(field:proto.DTLSTransportParams.src_port) - pub src_port: ::std::option::Option, + // @@protoc_insertion_point(field:proto.DTLSTransportParams.src_addr4) + pub src_addr4: ::protobuf::MessageField, + // @@protoc_insertion_point(field:proto.DTLSTransportParams.src_addr6) + pub src_addr6: ::protobuf::MessageField, // @@protoc_insertion_point(field:proto.DTLSTransportParams.randomize_dst_port) pub randomize_dst_port: ::std::option::Option, + /// Unordered sets the reliability of the DTLS stream to unordered + // @@protoc_insertion_point(field:proto.DTLSTransportParams.unordered) + pub unordered: ::std::option::Option, // special fields // @@protoc_insertion_point(special_field:proto.DTLSTransportParams.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -2325,57 +2525,67 @@ impl DTLSTransportParams { ::std::default::Default::default() } - // optional uint32 src_port = 1; + // optional bool randomize_dst_port = 3; - pub fn src_port(&self) -> u32 { - self.src_port.unwrap_or(0) + pub fn randomize_dst_port(&self) -> bool { + self.randomize_dst_port.unwrap_or(false) } - pub fn clear_src_port(&mut self) { - self.src_port = ::std::option::Option::None; + pub fn clear_randomize_dst_port(&mut self) { + self.randomize_dst_port = ::std::option::Option::None; } - pub fn has_src_port(&self) -> bool { - self.src_port.is_some() + pub fn has_randomize_dst_port(&self) -> bool { + self.randomize_dst_port.is_some() } // Param is passed by value, moved - pub fn set_src_port(&mut self, v: u32) { - self.src_port = ::std::option::Option::Some(v); + pub fn set_randomize_dst_port(&mut self, v: bool) { + self.randomize_dst_port = ::std::option::Option::Some(v); } - // optional bool randomize_dst_port = 2; + // optional bool unordered = 4; - pub fn randomize_dst_port(&self) -> bool { - self.randomize_dst_port.unwrap_or(false) + pub fn unordered(&self) -> bool { + self.unordered.unwrap_or(false) } - pub fn clear_randomize_dst_port(&mut self) { - self.randomize_dst_port = ::std::option::Option::None; + pub fn clear_unordered(&mut self) { + self.unordered = ::std::option::Option::None; } - pub fn has_randomize_dst_port(&self) -> bool { - self.randomize_dst_port.is_some() + pub fn has_unordered(&self) -> bool { + self.unordered.is_some() } // Param is passed by value, moved - pub fn set_randomize_dst_port(&mut self, v: bool) { - self.randomize_dst_port = ::std::option::Option::Some(v); + pub fn set_unordered(&mut self, v: bool) { + self.unordered = ::std::option::Option::Some(v); } fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { - let mut fields = ::std::vec::Vec::with_capacity(2); + let mut fields = ::std::vec::Vec::with_capacity(4); let mut oneofs = ::std::vec::Vec::with_capacity(0); - fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( - "src_port", - |m: &DTLSTransportParams| { &m.src_port }, - |m: &mut DTLSTransportParams| { &mut m.src_port }, + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Addr>( + "src_addr4", + |m: &DTLSTransportParams| { &m.src_addr4 }, + |m: &mut DTLSTransportParams| { &mut m.src_addr4 }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Addr>( + "src_addr6", + |m: &DTLSTransportParams| { &m.src_addr6 }, + |m: &mut DTLSTransportParams| { &mut m.src_addr6 }, )); fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( "randomize_dst_port", |m: &DTLSTransportParams| { &m.randomize_dst_port }, |m: &mut DTLSTransportParams| { &mut m.randomize_dst_port }, )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "unordered", + |m: &DTLSTransportParams| { &m.unordered }, + |m: &mut DTLSTransportParams| { &mut m.unordered }, + )); ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( "DTLSTransportParams", fields, @@ -2394,12 +2604,18 @@ impl ::protobuf::Message for DTLSTransportParams { fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { while let Some(tag) = is.read_raw_tag_or_eof()? { match tag { - 8 => { - self.src_port = ::std::option::Option::Some(is.read_uint32()?); + 10 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.src_addr4)?; }, - 16 => { + 18 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.src_addr6)?; + }, + 24 => { self.randomize_dst_port = ::std::option::Option::Some(is.read_bool()?); }, + 32 => { + self.unordered = ::std::option::Option::Some(is.read_bool()?); + }, tag => { ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; }, @@ -2412,23 +2628,37 @@ impl ::protobuf::Message for DTLSTransportParams { #[allow(unused_variables)] fn compute_size(&self) -> u64 { let mut my_size = 0; - if let Some(v) = self.src_port { - my_size += ::protobuf::rt::uint32_size(1, v); + if let Some(v) = self.src_addr4.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.src_addr6.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; } if let Some(v) = self.randomize_dst_port { my_size += 1 + 1; } + if let Some(v) = self.unordered { + my_size += 1 + 1; + } my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); self.special_fields.cached_size().set(my_size as u32); my_size } fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { - if let Some(v) = self.src_port { - os.write_uint32(1, v)?; + if let Some(v) = self.src_addr4.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?; + } + if let Some(v) = self.src_addr6.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?; } if let Some(v) = self.randomize_dst_port { - os.write_bool(2, v)?; + os.write_bool(3, v)?; + } + if let Some(v) = self.unordered { + os.write_bool(4, v)?; } os.write_unknown_fields(self.special_fields.unknown_fields())?; ::std::result::Result::Ok(()) @@ -2447,15 +2677,19 @@ impl ::protobuf::Message for DTLSTransportParams { } fn clear(&mut self) { - self.src_port = ::std::option::Option::None; + self.src_addr4.clear(); + self.src_addr6.clear(); self.randomize_dst_port = ::std::option::Option::None; + self.unordered = ::std::option::Option::None; self.special_fields.clear(); } fn default_instance() -> &'static DTLSTransportParams { static instance: DTLSTransportParams = DTLSTransportParams { - src_port: ::std::option::Option::None, + src_addr4: ::protobuf::MessageField::none(), + src_addr6: ::protobuf::MessageField::none(), randomize_dst_port: ::std::option::Option::None, + unordered: ::std::option::Option::None, special_fields: ::protobuf::SpecialFields::new(), }; &instance @@ -5524,6 +5758,10 @@ pub struct RegistrationResponse { /// Transport Params to if `allow_registrar_overrides` is set. // @@protoc_insertion_point(field:proto.RegistrationResponse.transport_params) pub transport_params: ::protobuf::MessageField<::protobuf::well_known_types::any::Any>, + /// PhantomsSupportPortRand is a flag that indicates whether the selected phantoms are able to + /// handle phantom connections to randomized ports. + // @@protoc_insertion_point(field:proto.RegistrationResponse.phantoms_support_port_rand) + pub phantoms_support_port_rand: ::std::option::Option, // special fields // @@protoc_insertion_point(special_field:proto.RegistrationResponse.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -5686,8 +5924,27 @@ impl RegistrationResponse { self.error.take().unwrap_or_else(|| ::std::string::String::new()) } + // optional bool phantoms_support_port_rand = 11; + + pub fn phantoms_support_port_rand(&self) -> bool { + self.phantoms_support_port_rand.unwrap_or(false) + } + + pub fn clear_phantoms_support_port_rand(&mut self) { + self.phantoms_support_port_rand = ::std::option::Option::None; + } + + pub fn has_phantoms_support_port_rand(&self) -> bool { + self.phantoms_support_port_rand.is_some() + } + + // Param is passed by value, moved + pub fn set_phantoms_support_port_rand(&mut self, v: bool) { + self.phantoms_support_port_rand = ::std::option::Option::Some(v); + } + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { - let mut fields = ::std::vec::Vec::with_capacity(7); + let mut fields = ::std::vec::Vec::with_capacity(8); let mut oneofs = ::std::vec::Vec::with_capacity(0); fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( "ipv4addr", @@ -5724,6 +5981,11 @@ impl RegistrationResponse { |m: &RegistrationResponse| { &m.transport_params }, |m: &mut RegistrationResponse| { &mut m.transport_params }, )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "phantoms_support_port_rand", + |m: &RegistrationResponse| { &m.phantoms_support_port_rand }, + |m: &mut RegistrationResponse| { &mut m.phantoms_support_port_rand }, + )); ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( "RegistrationResponse", fields, @@ -5773,6 +6035,9 @@ impl ::protobuf::Message for RegistrationResponse { 82 => { ::protobuf::rt::read_singular_message_into_field(is, &mut self.transport_params)?; }, + 88 => { + self.phantoms_support_port_rand = ::std::option::Option::Some(is.read_bool()?); + }, tag => { ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; }, @@ -5808,6 +6073,9 @@ impl ::protobuf::Message for RegistrationResponse { let len = v.compute_size(); my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; } + if let Some(v) = self.phantoms_support_port_rand { + my_size += 1 + 1; + } my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); self.special_fields.cached_size().set(my_size as u32); my_size @@ -5835,6 +6103,9 @@ impl ::protobuf::Message for RegistrationResponse { if let Some(v) = self.transport_params.as_ref() { ::protobuf::rt::write_message_field_with_cached_size(10, v, os)?; } + if let Some(v) = self.phantoms_support_port_rand { + os.write_bool(11, v)?; + } os.write_unknown_fields(self.special_fields.unknown_fields())?; ::std::result::Result::Ok(()) } @@ -5859,6 +6130,7 @@ impl ::protobuf::Message for RegistrationResponse { self.error = ::std::option::Option::None; self.clientConf.clear(); self.transport_params.clear(); + self.phantoms_support_port_rand = ::std::option::Option::None; self.special_fields.clear(); } @@ -5871,6 +6143,7 @@ impl ::protobuf::Message for RegistrationResponse { error: ::std::option::Option::None, clientConf: ::protobuf::MessageField::none(), transport_params: ::protobuf::MessageField::none(), + phantoms_support_port_rand: ::std::option::Option::None, special_fields: ::protobuf::SpecialFields::new(), }; &instance @@ -6806,211 +7079,216 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \x01\x20\x02(\rR\x04type\x129\n\ncandidates\x18\x02\x20\x03(\x0b2\x19.pr\ oto.WebRTCICECandidateR\ncandidates\"F\n\x0cWebRTCSignal\x12\x12\n\x04se\ ed\x18\x01\x20\x02(\tR\x04seed\x12\"\n\x03sdp\x18\x02\x20\x02(\x0b2\x10.\ - proto.WebRTCSDPR\x03sdp\"^\n\x13DTLSTransportParams\x12\x19\n\x08src_por\ - t\x18\x01\x20\x01(\rR\x07srcPort\x12,\n\x12randomize_dst_port\x18\x02\ - \x20\x01(\x08R\x10randomizeDstPort\"\xc2\x02\n\x0fStationToClient\x12)\n\ - \x10protocol_version\x18\x01\x20\x01(\rR\x0fprotocolVersion\x12@\n\x10st\ - ate_transition\x18\x02\x20\x01(\x0e2\x15.proto.S2C_TransitionR\x0fstateT\ - ransition\x122\n\x0bconfig_info\x18\x03\x20\x01(\x0b2\x11.proto.ClientCo\ - nfR\nconfigInfo\x124\n\nerr_reason\x18\x04\x20\x01(\x0e2\x15.proto.Error\ - ReasonS2CR\terrReason\x12\x1f\n\x0btmp_backoff\x18\x05\x20\x01(\rR\ntmpB\ - ackoff\x12\x1d\n\nstation_id\x18\x06\x20\x01(\tR\tstationId\x12\x18\n\ - \x07padding\x18d\x20\x01(\x0cR\x07padding\"\xaf\x01\n\x11RegistrationFla\ - gs\x12\x1f\n\x0bupload_only\x18\x01\x20\x01(\x08R\nuploadOnly\x12\x1d\n\ - \ndark_decoy\x18\x02\x20\x01(\x08R\tdarkDecoy\x12!\n\x0cproxy_header\x18\ - \x03\x20\x01(\x08R\x0bproxyHeader\x12\x17\n\x07use_TIL\x18\x04\x20\x01(\ - \x08R\x06useTIL\x12\x1e\n\nprescanned\x18\x05\x20\x01(\x08R\nprescanned\ - \"\xa8\x06\n\x0fClientToStation\x12)\n\x10protocol_version\x18\x01\x20\ - \x01(\rR\x0fprotocolVersion\x122\n\x15decoy_list_generation\x18\x02\x20\ - \x01(\rR\x13decoyListGeneration\x12@\n\x10state_transition\x18\x03\x20\ - \x01(\x0e2\x15.proto.C2S_TransitionR\x0fstateTransition\x12\x1f\n\x0bupl\ - oad_sync\x18\x04\x20\x01(\x04R\nuploadSync\x12,\n\x12client_lib_version\ - \x18\x05\x20\x01(\rR\x10clientLibVersion\x12>\n\x1bdisable_registrar_ove\ - rrides\x18\x06\x20\x01(\x08R\x19disableRegistrarOverrides\x12#\n\rfailed\ - _decoys\x18\n\x20\x03(\tR\x0cfailedDecoys\x12)\n\x05stats\x18\x0b\x20\ - \x01(\x0b2\x13.proto.SessionStatsR\x05stats\x122\n\ttransport\x18\x0c\ - \x20\x01(\x0e2\x14.proto.TransportTypeR\ttransport\x12?\n\x10transport_p\ - arams\x18\r\x20\x01(\x0b2\x14.google.protobuf.AnyR\x0ftransportParams\ - \x12%\n\x0ecovert_address\x18\x14\x20\x01(\tR\rcovertAddress\x127\n\x18m\ - asked_decoy_server_name\x18\x15\x20\x01(\tR\x15maskedDecoyServerName\x12\ - \x1d\n\nv6_support\x18\x16\x20\x01(\x08R\tv6Support\x12\x1d\n\nv4_suppor\ - t\x18\x17\x20\x01(\x08R\tv4Support\x12.\n\x05flags\x18\x18\x20\x01(\x0b2\ - \x18.proto.RegistrationFlagsR\x05flags\x128\n\rwebrtc_signal\x18\x1f\x20\ - \x01(\x0b2\x13.proto.WebRTCSignalR\x0cwebrtcSignal\x12\x18\n\x07padding\ - \x18d\x20\x01(\x0cR\x07padding\"\xaa\x01\n\x15PrefixTransportParams\x12\ - \x1b\n\tprefix_id\x18\x01\x20\x01(\x05R\x08prefixId\x12\x16\n\x06prefix\ - \x18\x02\x20\x01(\x0cR\x06prefix\x12.\n\x13custom_flush_policy\x18\x03\ - \x20\x01(\x05R\x11customFlushPolicy\x12,\n\x12randomize_dst_port\x18\r\ - \x20\x01(\x08R\x10randomizeDstPort\"F\n\x16GenericTransportParams\x12,\n\ - \x12randomize_dst_port\x18\r\x20\x01(\x08R\x10randomizeDstPort\"\xc2\x03\ - \n\nC2SWrapper\x12#\n\rshared_secret\x18\x01\x20\x01(\x0cR\x0csharedSecr\ - et\x12I\n\x14registration_payload\x18\x03\x20\x01(\x0b2\x16.proto.Client\ - ToStationR\x13registrationPayload\x12J\n\x13registration_source\x18\x04\ - \x20\x01(\x0e2\x19.proto.RegistrationSourceR\x12registrationSource\x121\ - \n\x14registration_address\x18\x06\x20\x01(\x0cR\x13registrationAddress\ - \x12#\n\rdecoy_address\x18\x07\x20\x01(\x0cR\x0cdecoyAddress\x12P\n\x15r\ - egistration_response\x18\x08\x20\x01(\x0b2\x1b.proto.RegistrationRespons\ - eR\x14registrationResponse\x12\"\n\x0cRegRespBytes\x18\t\x20\x01(\x0cR\ - \x0cRegRespBytes\x12*\n\x10RegRespSignature\x18\n\x20\x01(\x0cR\x10RegRe\ - spSignature\"\xdd\x01\n\x0cSessionStats\x120\n\x14failed_decoys_amount\ - \x18\x14\x20\x01(\rR\x12failedDecoysAmount\x121\n\x15total_time_to_conne\ - ct\x18\x1f\x20\x01(\rR\x12totalTimeToConnect\x12$\n\x0ertt_to_station\ - \x18!\x20\x01(\rR\x0crttToStation\x12\x20\n\x0ctls_to_decoy\x18&\x20\x01\ - (\rR\ntlsToDecoy\x12\x20\n\x0ctcp_to_decoy\x18'\x20\x01(\rR\ntcpToDecoy\ - \"\x82\x02\n\x11StationToDetector\x12\x1d\n\nphantom_ip\x18\x01\x20\x01(\ - \tR\tphantomIp\x12\x1b\n\tclient_ip\x18\x02\x20\x01(\tR\x08clientIp\x12\ - \x1d\n\ntimeout_ns\x18\x03\x20\x01(\x04R\ttimeoutNs\x126\n\toperation\ - \x18\x04\x20\x01(\x0e2\x18.proto.StationOperationsR\toperation\x12\x19\n\ - \x08dst_port\x18\n\x20\x01(\rR\x07dstPort\x12\x19\n\x08src_port\x18\x0b\ - \x20\x01(\rR\x07srcPort\x12$\n\x05proto\x18\x0c\x20\x01(\x0e2\x0e.proto.\ - IPProtoR\x05proto\"\x97\x02\n\x14RegistrationResponse\x12\x1a\n\x08ipv4a\ - ddr\x18\x01\x20\x01(\x07R\x08ipv4addr\x12\x1a\n\x08ipv6addr\x18\x02\x20\ - \x01(\x0cR\x08ipv6addr\x12\x19\n\x08dst_port\x18\x03\x20\x01(\rR\x07dstP\ - ort\x12\"\n\x0cserverRandom\x18\x04\x20\x01(\x0cR\x0cserverRandom\x12\ - \x14\n\x05error\x18\x05\x20\x01(\tR\x05error\x121\n\nclientConf\x18\x06\ - \x20\x01(\x0b2\x11.proto.ClientConfR\nclientConf\x12?\n\x10transport_par\ - ams\x18\n\x20\x01(\x0b2\x14.google.protobuf.AnyR\x0ftransportParams\"\ - \xac\x01\n\x0bDnsResponse\x12\x18\n\x07success\x18\x01\x20\x01(\x08R\x07\ - success\x12/\n\x13clientconf_outdated\x18\x02\x20\x01(\x08R\x12clientcon\ - fOutdated\x12R\n\x16bidirectional_response\x18\x03\x20\x01(\x0b2\x1b.pro\ - to.RegistrationResponseR\x15bidirectionalResponse*+\n\x07KeyType\x12\x0f\ - \n\x0bAES_GCM_128\x10Z\x12\x0f\n\x0bAES_GCM_256\x10[*)\n\x0cDnsRegMethod\ - \x12\x07\n\x03UDP\x10\x01\x12\x07\n\x03DOT\x10\x02\x12\x07\n\x03DOH\x10\ - \x03*\xe7\x01\n\x0eC2S_Transition\x12\x11\n\rC2S_NO_CHANGE\x10\0\x12\x14\ - \n\x10C2S_SESSION_INIT\x10\x01\x12\x1b\n\x17C2S_SESSION_COVERT_INIT\x10\ - \x0b\x12\x18\n\x14C2S_EXPECT_RECONNECT\x10\x02\x12\x15\n\x11C2S_SESSION_\ - CLOSE\x10\x03\x12\x14\n\x10C2S_YIELD_UPLOAD\x10\x04\x12\x16\n\x12C2S_ACQ\ - UIRE_UPLOAD\x10\x05\x12\x20\n\x1cC2S_EXPECT_UPLOADONLY_RECONN\x10\x06\ - \x12\x0e\n\tC2S_ERROR\x10\xff\x01*\x98\x01\n\x0eS2C_Transition\x12\x11\n\ - \rS2C_NO_CHANGE\x10\0\x12\x14\n\x10S2C_SESSION_INIT\x10\x01\x12\x1b\n\ - \x17S2C_SESSION_COVERT_INIT\x10\x0b\x12\x19\n\x15S2C_CONFIRM_RECONNECT\ - \x10\x02\x12\x15\n\x11S2C_SESSION_CLOSE\x10\x03\x12\x0e\n\tS2C_ERROR\x10\ - \xff\x01*\xac\x01\n\x0eErrorReasonS2C\x12\x0c\n\x08NO_ERROR\x10\0\x12\ - \x11\n\rCOVERT_STREAM\x10\x01\x12\x13\n\x0fCLIENT_REPORTED\x10\x02\x12\ - \x13\n\x0fCLIENT_PROTOCOL\x10\x03\x12\x14\n\x10STATION_INTERNAL\x10\x04\ - \x12\x12\n\x0eDECOY_OVERLOAD\x10\x05\x12\x11\n\rCLIENT_STREAM\x10d\x12\ - \x12\n\x0eCLIENT_TIMEOUT\x10e*\x82\x01\n\rTransportType\x12\x08\n\x04Nul\ - l\x10\0\x12\x07\n\x03Min\x10\x01\x12\t\n\x05Obfs4\x10\x02\x12\x08\n\x04D\ - TLS\x10\x03\x12\n\n\x06Prefix\x10\x04\x12\x08\n\x04uTLS\x10\x05\x12\n\n\ - \x06Format\x10\x06\x12\x08\n\x04WASM\x10\x07\x12\x07\n\x03FTE\x10\x08\ - \x12\x08\n\x04Quic\x10\t\x12\n\n\x06Webrtc\x10c*\x86\x01\n\x12Registrati\ - onSource\x12\x0f\n\x0bUnspecified\x10\0\x12\x0c\n\x08Detector\x10\x01\ - \x12\x07\n\x03API\x10\x02\x12\x13\n\x0fDetectorPrescan\x10\x03\x12\x14\n\ - \x10BidirectionalAPI\x10\x04\x12\x07\n\x03DNS\x10\x05\x12\x14\n\x10Bidir\ - ectionalDNS\x10\x06*@\n\x11StationOperations\x12\x0b\n\x07Unknown\x10\0\ - \x12\x07\n\x03New\x10\x01\x12\n\n\x06Update\x10\x02\x12\t\n\x05Clear\x10\ - \x03*$\n\x07IPProto\x12\x07\n\x03Unk\x10\0\x12\x07\n\x03Tcp\x10\x01\x12\ - \x07\n\x03Udp\x10\x02J\x81\x90\x01\n\x07\x12\x05\0\0\xa8\x03\x01\n\x08\n\ - \x01\x0c\x12\x03\0\0\x12\n\xb0\x01\n\x01\x02\x12\x03\x06\0\x0e2\xa5\x01\ - \x20TODO:\x20We're\x20using\x20proto2\x20because\x20it's\x20the\x20defau\ - lt\x20on\x20Ubuntu\x2016.04.\n\x20At\x20some\x20point\x20we\x20will\x20w\ - ant\x20to\x20migrate\x20to\x20proto3,\x20but\x20we\x20are\x20not\n\x20us\ - ing\x20any\x20proto3\x20features\x20yet.\n\n\t\n\x02\x03\0\x12\x03\x08\0\ - #\n\n\n\x02\x05\0\x12\x04\n\0\r\x01\n\n\n\x03\x05\0\x01\x12\x03\n\x05\ - \x0c\n\x0b\n\x04\x05\0\x02\0\x12\x03\x0b\x04\x15\n\x0c\n\x05\x05\0\x02\0\ - \x01\x12\x03\x0b\x04\x0f\n\x0c\n\x05\x05\0\x02\0\x02\x12\x03\x0b\x12\x14\ - \n\x20\n\x04\x05\0\x02\x01\x12\x03\x0c\x04\x15\"\x13\x20not\x20supported\ - \x20atm\n\n\x0c\n\x05\x05\0\x02\x01\x01\x12\x03\x0c\x04\x0f\n\x0c\n\x05\ - \x05\0\x02\x01\x02\x12\x03\x0c\x12\x14\n\n\n\x02\x04\0\x12\x04\x0f\0\x14\ - \x01\n\n\n\x03\x04\0\x01\x12\x03\x0f\x08\x0e\n4\n\x04\x04\0\x02\0\x12\ - \x03\x11\x04\x1b\x1a'\x20A\x20public\x20key,\x20as\x20used\x20by\x20the\ - \x20station.\n\n\x0c\n\x05\x04\0\x02\0\x04\x12\x03\x11\x04\x0c\n\x0c\n\ - \x05\x04\0\x02\0\x05\x12\x03\x11\r\x12\n\x0c\n\x05\x04\0\x02\0\x01\x12\ - \x03\x11\x13\x16\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x11\x19\x1a\n\x0b\n\ - \x04\x04\0\x02\x01\x12\x03\x13\x04\x1e\n\x0c\n\x05\x04\0\x02\x01\x04\x12\ - \x03\x13\x04\x0c\n\x0c\n\x05\x04\0\x02\x01\x06\x12\x03\x13\r\x14\n\x0c\n\ - \x05\x04\0\x02\x01\x01\x12\x03\x13\x15\x19\n\x0c\n\x05\x04\0\x02\x01\x03\ - \x12\x03\x13\x1c\x1d\n\n\n\x02\x04\x01\x12\x04\x16\0<\x01\n\n\n\x03\x04\ - \x01\x01\x12\x03\x16\x08\x14\n\xa1\x01\n\x04\x04\x01\x02\0\x12\x03\x1b\ - \x04!\x1a\x93\x01\x20The\x20hostname/SNI\x20to\x20use\x20for\x20this\x20\ - host\n\n\x20The\x20hostname\x20is\x20the\x20only\x20required\x20field,\ - \x20although\x20other\n\x20fields\x20are\x20expected\x20to\x20be\x20pres\ - ent\x20in\x20most\x20cases.\n\n\x0c\n\x05\x04\x01\x02\0\x04\x12\x03\x1b\ - \x04\x0c\n\x0c\n\x05\x04\x01\x02\0\x05\x12\x03\x1b\r\x13\n\x0c\n\x05\x04\ - \x01\x02\0\x01\x12\x03\x1b\x14\x1c\n\x0c\n\x05\x04\x01\x02\0\x03\x12\x03\ - \x1b\x1f\x20\n\xf7\x01\n\x04\x04\x01\x02\x01\x12\x03\"\x04\"\x1a\xe9\x01\ - \x20The\x2032-bit\x20ipv4\x20address,\x20in\x20network\x20byte\x20order\ - \n\n\x20If\x20the\x20IPv4\x20address\x20is\x20absent,\x20then\x20it\x20m\ - ay\x20be\x20resolved\x20via\n\x20DNS\x20by\x20the\x20client,\x20or\x20th\ - e\x20client\x20may\x20discard\x20this\x20decoy\x20spec\n\x20if\x20local\ - \x20DNS\x20is\x20untrusted,\x20or\x20the\x20service\x20may\x20be\x20mult\ - ihomed.\n\n\x0c\n\x05\x04\x01\x02\x01\x04\x12\x03\"\x04\x0c\n\x0c\n\x05\ - \x04\x01\x02\x01\x05\x12\x03\"\r\x14\n\x0c\n\x05\x04\x01\x02\x01\x01\x12\ - \x03\"\x15\x1d\n\x0c\n\x05\x04\x01\x02\x01\x03\x12\x03\"\x20!\n>\n\x04\ - \x04\x01\x02\x02\x12\x03%\x04\x20\x1a1\x20The\x20128-bit\x20ipv6\x20addr\ - ess,\x20in\x20network\x20byte\x20order\n\n\x0c\n\x05\x04\x01\x02\x02\x04\ - \x12\x03%\x04\x0c\n\x0c\n\x05\x04\x01\x02\x02\x05\x12\x03%\r\x12\n\x0c\n\ - \x05\x04\x01\x02\x02\x01\x12\x03%\x13\x1b\n\x0c\n\x05\x04\x01\x02\x02\ - \x03\x12\x03%\x1e\x1f\n\x91\x01\n\x04\x04\x01\x02\x03\x12\x03+\x04\x1f\ - \x1a\x83\x01\x20The\x20Tapdance\x20station\x20public\x20key\x20to\x20use\ - \x20when\x20contacting\x20this\n\x20decoy\n\n\x20If\x20omitted,\x20the\ - \x20default\x20station\x20public\x20key\x20(if\x20any)\x20is\x20used.\n\ - \n\x0c\n\x05\x04\x01\x02\x03\x04\x12\x03+\x04\x0c\n\x0c\n\x05\x04\x01\ - \x02\x03\x06\x12\x03+\r\x13\n\x0c\n\x05\x04\x01\x02\x03\x01\x12\x03+\x14\ - \x1a\n\x0c\n\x05\x04\x01\x02\x03\x03\x12\x03+\x1d\x1e\n\xee\x01\n\x04\ - \x04\x01\x02\x04\x12\x032\x04\x20\x1a\xe0\x01\x20The\x20maximum\x20durat\ - ion,\x20in\x20milliseconds,\x20to\x20maintain\x20an\x20open\n\x20connect\ - ion\x20to\x20this\x20decoy\x20(because\x20the\x20decoy\x20may\x20close\ - \x20the\n\x20connection\x20itself\x20after\x20this\x20length\x20of\x20ti\ - me)\n\n\x20If\x20omitted,\x20a\x20default\x20of\x2030,000\x20millisecond\ - s\x20is\x20assumed.\n\n\x0c\n\x05\x04\x01\x02\x04\x04\x12\x032\x04\x0c\n\ - \x0c\n\x05\x04\x01\x02\x04\x05\x12\x032\r\x13\n\x0c\n\x05\x04\x01\x02\ - \x04\x01\x12\x032\x14\x1b\n\x0c\n\x05\x04\x01\x02\x04\x03\x12\x032\x1e\ - \x1f\n\xb0\x02\n\x04\x04\x01\x02\x05\x12\x03;\x04\x1f\x1a\xa2\x02\x20The\ - \x20maximum\x20TCP\x20window\x20size\x20to\x20attempt\x20to\x20use\x20fo\ - r\x20this\x20decoy.\n\n\x20If\x20omitted,\x20a\x20default\x20of\x2015360\ - \x20is\x20assumed.\n\n\x20TODO:\x20the\x20default\x20is\x20based\x20on\ - \x20the\x20current\x20heuristic\x20of\x20only\n\x20using\x20decoys\x20th\ - at\x20permit\x20windows\x20of\x2015KB\x20or\x20larger.\x20\x20If\x20this\ - \n\x20heuristic\x20changes,\x20then\x20this\x20default\x20doesn't\x20mak\ - e\x20sense.\n\n\x0c\n\x05\x04\x01\x02\x05\x04\x12\x03;\x04\x0c\n\x0c\n\ - \x05\x04\x01\x02\x05\x05\x12\x03;\r\x13\n\x0c\n\x05\x04\x01\x02\x05\x01\ - \x12\x03;\x14\x1a\n\x0c\n\x05\x04\x01\x02\x05\x03\x12\x03;\x1d\x1e\n\x83\ - \x08\n\x02\x04\x02\x12\x04S\0Z\x012\xf6\x07\x20In\x20version\x201,\x20th\ - e\x20request\x20is\x20very\x20simple:\x20when\n\x20the\x20client\x20send\ - s\x20a\x20MSG_PROTO\x20to\x20the\x20station,\x20if\x20the\n\x20generatio\ - n\x20number\x20is\x20present,\x20then\x20this\x20request\x20includes\n\ - \x20(in\x20addition\x20to\x20whatever\x20other\x20operations\x20are\x20p\ - art\x20of\x20the\n\x20request)\x20a\x20request\x20for\x20the\x20station\ - \x20to\x20send\x20a\x20copy\x20of\n\x20the\x20current\x20decoy\x20set\ - \x20that\x20has\x20a\x20generation\x20number\x20greater\n\x20than\x20the\ - \x20generation\x20number\x20in\x20its\x20request.\n\n\x20If\x20the\x20re\ - sponse\x20contains\x20a\x20DecoyListUpdate\x20with\x20a\x20generation\ - \x20number\x20equal\n\x20to\x20that\x20which\x20the\x20client\x20sent,\ - \x20then\x20the\x20client\x20is\x20\"caught\x20up\"\x20with\n\x20the\x20\ - station\x20and\x20the\x20response\x20contains\x20no\x20new\x20informatio\ - n\n\x20(and\x20all\x20other\x20fields\x20may\x20be\x20omitted\x20or\x20e\ - mpty).\x20\x20Otherwise,\n\x20the\x20station\x20will\x20send\x20the\x20l\ - atest\x20configuration\x20information,\n\x20along\x20with\x20its\x20gene\ - ration\x20number.\n\n\x20The\x20station\x20can\x20also\x20send\x20Client\ - Conf\x20messages\n\x20(as\x20part\x20of\x20Station2Client\x20messages)\ - \x20whenever\x20it\x20wants.\n\x20The\x20client\x20is\x20expected\x20to\ - \x20react\x20as\x20if\x20it\x20had\x20requested\n\x20such\x20messages\ - \x20--\x20possibly\x20by\x20ignoring\x20them,\x20if\x20the\x20client\n\ - \x20is\x20already\x20up-to-date\x20according\x20to\x20the\x20generation\ - \x20number.\n\n\n\n\x03\x04\x02\x01\x12\x03S\x08\x12\n\x0b\n\x04\x04\x02\ - \x02\0\x12\x03T\x04&\n\x0c\n\x05\x04\x02\x02\0\x04\x12\x03T\x04\x0c\n\ - \x0c\n\x05\x04\x02\x02\0\x06\x12\x03T\r\x16\n\x0c\n\x05\x04\x02\x02\0\ - \x01\x12\x03T\x17!\n\x0c\n\x05\x04\x02\x02\0\x03\x12\x03T$%\n\x0b\n\x04\ - \x04\x02\x02\x01\x12\x03U\x04#\n\x0c\n\x05\x04\x02\x02\x01\x04\x12\x03U\ - \x04\x0c\n\x0c\n\x05\x04\x02\x02\x01\x05\x12\x03U\r\x13\n\x0c\n\x05\x04\ - \x02\x02\x01\x01\x12\x03U\x14\x1e\n\x0c\n\x05\x04\x02\x02\x01\x03\x12\ - \x03U!\"\n\x0b\n\x04\x04\x02\x02\x02\x12\x03V\x04'\n\x0c\n\x05\x04\x02\ - \x02\x02\x04\x12\x03V\x04\x0c\n\x0c\n\x05\x04\x02\x02\x02\x06\x12\x03V\r\ - \x13\n\x0c\n\x05\x04\x02\x02\x02\x01\x12\x03V\x14\"\n\x0c\n\x05\x04\x02\ - \x02\x02\x03\x12\x03V%&\n\x0b\n\x04\x04\x02\x02\x03\x12\x03W\x049\n\x0c\ - \n\x05\x04\x02\x02\x03\x04\x12\x03W\x04\x0c\n\x0c\n\x05\x04\x02\x02\x03\ - \x06\x12\x03W\r\x1f\n\x0c\n\x05\x04\x02\x02\x03\x01\x12\x03W\x204\n\x0c\ - \n\x05\x04\x02\x02\x03\x03\x12\x03W78\n\x0b\n\x04\x04\x02\x02\x04\x12\ - \x03X\x04'\n\x0c\n\x05\x04\x02\x02\x04\x04\x12\x03X\x04\x0c\n\x0c\n\x05\ - \x04\x02\x02\x04\x06\x12\x03X\r\x13\n\x0c\n\x05\x04\x02\x02\x04\x01\x12\ - \x03X\x14\"\n\x0c\n\x05\x04\x02\x02\x04\x03\x12\x03X%&\n\x0b\n\x04\x04\ - \x02\x02\x05\x12\x03Y\x04)\n\x0c\n\x05\x04\x02\x02\x05\x04\x12\x03Y\x04\ - \x0c\n\x0c\n\x05\x04\x02\x02\x05\x06\x12\x03Y\r\x17\n\x0c\n\x05\x04\x02\ - \x02\x05\x01\x12\x03Y\x18$\n\x0c\n\x05\x04\x02\x02\x05\x03\x12\x03Y'(\n-\ - \n\x02\x04\x03\x12\x04]\0d\x01\x1a!\x20Configuration\x20for\x20DNS\x20re\ - gistrar\n\n\n\n\x03\x04\x03\x01\x12\x03]\x08\x12\n\x0b\n\x04\x04\x03\x02\ - \0\x12\x03^\x04-\n\x0c\n\x05\x04\x03\x02\0\x04\x12\x03^\x04\x0c\n\x0c\n\ + proto.WebRTCSDPR\x03sdp\"*\n\x04Addr\x12\x0e\n\x02IP\x18\x01\x20\x01(\ + \x0cR\x02IP\x12\x12\n\x04Port\x18\x02\x20\x01(\rR\x04Port\"\xb5\x01\n\ + \x13DTLSTransportParams\x12(\n\tsrc_addr4\x18\x01\x20\x01(\x0b2\x0b.prot\ + o.AddrR\x08srcAddr4\x12(\n\tsrc_addr6\x18\x02\x20\x01(\x0b2\x0b.proto.Ad\ + drR\x08srcAddr6\x12,\n\x12randomize_dst_port\x18\x03\x20\x01(\x08R\x10ra\ + ndomizeDstPort\x12\x1c\n\tunordered\x18\x04\x20\x01(\x08R\tunordered\"\ + \xc2\x02\n\x0fStationToClient\x12)\n\x10protocol_version\x18\x01\x20\x01\ + (\rR\x0fprotocolVersion\x12@\n\x10state_transition\x18\x02\x20\x01(\x0e2\ + \x15.proto.S2C_TransitionR\x0fstateTransition\x122\n\x0bconfig_info\x18\ + \x03\x20\x01(\x0b2\x11.proto.ClientConfR\nconfigInfo\x124\n\nerr_reason\ + \x18\x04\x20\x01(\x0e2\x15.proto.ErrorReasonS2CR\terrReason\x12\x1f\n\ + \x0btmp_backoff\x18\x05\x20\x01(\rR\ntmpBackoff\x12\x1d\n\nstation_id\ + \x18\x06\x20\x01(\tR\tstationId\x12\x18\n\x07padding\x18d\x20\x01(\x0cR\ + \x07padding\"\xaf\x01\n\x11RegistrationFlags\x12\x1f\n\x0bupload_only\ + \x18\x01\x20\x01(\x08R\nuploadOnly\x12\x1d\n\ndark_decoy\x18\x02\x20\x01\ + (\x08R\tdarkDecoy\x12!\n\x0cproxy_header\x18\x03\x20\x01(\x08R\x0bproxyH\ + eader\x12\x17\n\x07use_TIL\x18\x04\x20\x01(\x08R\x06useTIL\x12\x1e\n\npr\ + escanned\x18\x05\x20\x01(\x08R\nprescanned\"\xa8\x06\n\x0fClientToStatio\ + n\x12)\n\x10protocol_version\x18\x01\x20\x01(\rR\x0fprotocolVersion\x122\ + \n\x15decoy_list_generation\x18\x02\x20\x01(\rR\x13decoyListGeneration\ + \x12@\n\x10state_transition\x18\x03\x20\x01(\x0e2\x15.proto.C2S_Transiti\ + onR\x0fstateTransition\x12\x1f\n\x0bupload_sync\x18\x04\x20\x01(\x04R\nu\ + ploadSync\x12,\n\x12client_lib_version\x18\x05\x20\x01(\rR\x10clientLibV\ + ersion\x12>\n\x1bdisable_registrar_overrides\x18\x06\x20\x01(\x08R\x19di\ + sableRegistrarOverrides\x12#\n\rfailed_decoys\x18\n\x20\x03(\tR\x0cfaile\ + dDecoys\x12)\n\x05stats\x18\x0b\x20\x01(\x0b2\x13.proto.SessionStatsR\ + \x05stats\x122\n\ttransport\x18\x0c\x20\x01(\x0e2\x14.proto.TransportTyp\ + eR\ttransport\x12?\n\x10transport_params\x18\r\x20\x01(\x0b2\x14.google.\ + protobuf.AnyR\x0ftransportParams\x12%\n\x0ecovert_address\x18\x14\x20\ + \x01(\tR\rcovertAddress\x127\n\x18masked_decoy_server_name\x18\x15\x20\ + \x01(\tR\x15maskedDecoyServerName\x12\x1d\n\nv6_support\x18\x16\x20\x01(\ + \x08R\tv6Support\x12\x1d\n\nv4_support\x18\x17\x20\x01(\x08R\tv4Support\ + \x12.\n\x05flags\x18\x18\x20\x01(\x0b2\x18.proto.RegistrationFlagsR\x05f\ + lags\x128\n\rwebrtc_signal\x18\x1f\x20\x01(\x0b2\x13.proto.WebRTCSignalR\ + \x0cwebrtcSignal\x12\x18\n\x07padding\x18d\x20\x01(\x0cR\x07padding\"\ + \xaa\x01\n\x15PrefixTransportParams\x12\x1b\n\tprefix_id\x18\x01\x20\x01\ + (\x05R\x08prefixId\x12\x16\n\x06prefix\x18\x02\x20\x01(\x0cR\x06prefix\ + \x12.\n\x13custom_flush_policy\x18\x03\x20\x01(\x05R\x11customFlushPolic\ + y\x12,\n\x12randomize_dst_port\x18\r\x20\x01(\x08R\x10randomizeDstPort\"\ + F\n\x16GenericTransportParams\x12,\n\x12randomize_dst_port\x18\r\x20\x01\ + (\x08R\x10randomizeDstPort\"\xc2\x03\n\nC2SWrapper\x12#\n\rshared_secret\ + \x18\x01\x20\x01(\x0cR\x0csharedSecret\x12I\n\x14registration_payload\ + \x18\x03\x20\x01(\x0b2\x16.proto.ClientToStationR\x13registrationPayload\ + \x12J\n\x13registration_source\x18\x04\x20\x01(\x0e2\x19.proto.Registrat\ + ionSourceR\x12registrationSource\x121\n\x14registration_address\x18\x06\ + \x20\x01(\x0cR\x13registrationAddress\x12#\n\rdecoy_address\x18\x07\x20\ + \x01(\x0cR\x0cdecoyAddress\x12P\n\x15registration_response\x18\x08\x20\ + \x01(\x0b2\x1b.proto.RegistrationResponseR\x14registrationResponse\x12\"\ + \n\x0cRegRespBytes\x18\t\x20\x01(\x0cR\x0cRegRespBytes\x12*\n\x10RegResp\ + Signature\x18\n\x20\x01(\x0cR\x10RegRespSignature\"\xdd\x01\n\x0cSession\ + Stats\x120\n\x14failed_decoys_amount\x18\x14\x20\x01(\rR\x12failedDecoys\ + Amount\x121\n\x15total_time_to_connect\x18\x1f\x20\x01(\rR\x12totalTimeT\ + oConnect\x12$\n\x0ertt_to_station\x18!\x20\x01(\rR\x0crttToStation\x12\ + \x20\n\x0ctls_to_decoy\x18&\x20\x01(\rR\ntlsToDecoy\x12\x20\n\x0ctcp_to_\ + decoy\x18'\x20\x01(\rR\ntcpToDecoy\"\x82\x02\n\x11StationToDetector\x12\ + \x1d\n\nphantom_ip\x18\x01\x20\x01(\tR\tphantomIp\x12\x1b\n\tclient_ip\ + \x18\x02\x20\x01(\tR\x08clientIp\x12\x1d\n\ntimeout_ns\x18\x03\x20\x01(\ + \x04R\ttimeoutNs\x126\n\toperation\x18\x04\x20\x01(\x0e2\x18.proto.Stati\ + onOperationsR\toperation\x12\x19\n\x08dst_port\x18\n\x20\x01(\rR\x07dstP\ + ort\x12\x19\n\x08src_port\x18\x0b\x20\x01(\rR\x07srcPort\x12$\n\x05proto\ + \x18\x0c\x20\x01(\x0e2\x0e.proto.IPProtoR\x05proto\"\xd4\x02\n\x14Regist\ + rationResponse\x12\x1a\n\x08ipv4addr\x18\x01\x20\x01(\x07R\x08ipv4addr\ + \x12\x1a\n\x08ipv6addr\x18\x02\x20\x01(\x0cR\x08ipv6addr\x12\x19\n\x08ds\ + t_port\x18\x03\x20\x01(\rR\x07dstPort\x12\"\n\x0cserverRandom\x18\x04\ + \x20\x01(\x0cR\x0cserverRandom\x12\x14\n\x05error\x18\x05\x20\x01(\tR\ + \x05error\x121\n\nclientConf\x18\x06\x20\x01(\x0b2\x11.proto.ClientConfR\ + \nclientConf\x12?\n\x10transport_params\x18\n\x20\x01(\x0b2\x14.google.p\ + rotobuf.AnyR\x0ftransportParams\x12;\n\x1aphantoms_support_port_rand\x18\ + \x0b\x20\x01(\x08R\x17phantomsSupportPortRand\"\xac\x01\n\x0bDnsResponse\ + \x12\x18\n\x07success\x18\x01\x20\x01(\x08R\x07success\x12/\n\x13clientc\ + onf_outdated\x18\x02\x20\x01(\x08R\x12clientconfOutdated\x12R\n\x16bidir\ + ectional_response\x18\x03\x20\x01(\x0b2\x1b.proto.RegistrationResponseR\ + \x15bidirectionalResponse*+\n\x07KeyType\x12\x0f\n\x0bAES_GCM_128\x10Z\ + \x12\x0f\n\x0bAES_GCM_256\x10[*)\n\x0cDnsRegMethod\x12\x07\n\x03UDP\x10\ + \x01\x12\x07\n\x03DOT\x10\x02\x12\x07\n\x03DOH\x10\x03*\xe7\x01\n\x0eC2S\ + _Transition\x12\x11\n\rC2S_NO_CHANGE\x10\0\x12\x14\n\x10C2S_SESSION_INIT\ + \x10\x01\x12\x1b\n\x17C2S_SESSION_COVERT_INIT\x10\x0b\x12\x18\n\x14C2S_E\ + XPECT_RECONNECT\x10\x02\x12\x15\n\x11C2S_SESSION_CLOSE\x10\x03\x12\x14\n\ + \x10C2S_YIELD_UPLOAD\x10\x04\x12\x16\n\x12C2S_ACQUIRE_UPLOAD\x10\x05\x12\ + \x20\n\x1cC2S_EXPECT_UPLOADONLY_RECONN\x10\x06\x12\x0e\n\tC2S_ERROR\x10\ + \xff\x01*\x98\x01\n\x0eS2C_Transition\x12\x11\n\rS2C_NO_CHANGE\x10\0\x12\ + \x14\n\x10S2C_SESSION_INIT\x10\x01\x12\x1b\n\x17S2C_SESSION_COVERT_INIT\ + \x10\x0b\x12\x19\n\x15S2C_CONFIRM_RECONNECT\x10\x02\x12\x15\n\x11S2C_SES\ + SION_CLOSE\x10\x03\x12\x0e\n\tS2C_ERROR\x10\xff\x01*\xac\x01\n\x0eErrorR\ + easonS2C\x12\x0c\n\x08NO_ERROR\x10\0\x12\x11\n\rCOVERT_STREAM\x10\x01\ + \x12\x13\n\x0fCLIENT_REPORTED\x10\x02\x12\x13\n\x0fCLIENT_PROTOCOL\x10\ + \x03\x12\x14\n\x10STATION_INTERNAL\x10\x04\x12\x12\n\x0eDECOY_OVERLOAD\ + \x10\x05\x12\x11\n\rCLIENT_STREAM\x10d\x12\x12\n\x0eCLIENT_TIMEOUT\x10e*\ + \x82\x01\n\rTransportType\x12\x08\n\x04Null\x10\0\x12\x07\n\x03Min\x10\ + \x01\x12\t\n\x05Obfs4\x10\x02\x12\x08\n\x04DTLS\x10\x03\x12\n\n\x06Prefi\ + x\x10\x04\x12\x08\n\x04uTLS\x10\x05\x12\n\n\x06Format\x10\x06\x12\x08\n\ + \x04WASM\x10\x07\x12\x07\n\x03FTE\x10\x08\x12\x08\n\x04Quic\x10\t\x12\n\ + \n\x06Webrtc\x10c*\x86\x01\n\x12RegistrationSource\x12\x0f\n\x0bUnspecif\ + ied\x10\0\x12\x0c\n\x08Detector\x10\x01\x12\x07\n\x03API\x10\x02\x12\x13\ + \n\x0fDetectorPrescan\x10\x03\x12\x14\n\x10BidirectionalAPI\x10\x04\x12\ + \x07\n\x03DNS\x10\x05\x12\x14\n\x10BidirectionalDNS\x10\x06*@\n\x11Stati\ + onOperations\x12\x0b\n\x07Unknown\x10\0\x12\x07\n\x03New\x10\x01\x12\n\n\ + \x06Update\x10\x02\x12\t\n\x05Clear\x10\x03*$\n\x07IPProto\x12\x07\n\x03\ + Unk\x10\0\x12\x07\n\x03Tcp\x10\x01\x12\x07\n\x03Udp\x10\x02J\xe1\x94\x01\ + \n\x07\x12\x05\0\0\xb6\x03\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\xb0\x01\ + \n\x01\x02\x12\x03\x06\0\x0e2\xa5\x01\x20TODO:\x20We're\x20using\x20prot\ + o2\x20because\x20it's\x20the\x20default\x20on\x20Ubuntu\x2016.04.\n\x20A\ + t\x20some\x20point\x20we\x20will\x20want\x20to\x20migrate\x20to\x20proto\ + 3,\x20but\x20we\x20are\x20not\n\x20using\x20any\x20proto3\x20features\ + \x20yet.\n\n\t\n\x02\x03\0\x12\x03\x08\0#\n\n\n\x02\x05\0\x12\x04\n\0\r\ + \x01\n\n\n\x03\x05\0\x01\x12\x03\n\x05\x0c\n\x0b\n\x04\x05\0\x02\0\x12\ + \x03\x0b\x04\x15\n\x0c\n\x05\x05\0\x02\0\x01\x12\x03\x0b\x04\x0f\n\x0c\n\ + \x05\x05\0\x02\0\x02\x12\x03\x0b\x12\x14\n\x20\n\x04\x05\0\x02\x01\x12\ + \x03\x0c\x04\x15\"\x13\x20not\x20supported\x20atm\n\n\x0c\n\x05\x05\0\ + \x02\x01\x01\x12\x03\x0c\x04\x0f\n\x0c\n\x05\x05\0\x02\x01\x02\x12\x03\ + \x0c\x12\x14\n\n\n\x02\x04\0\x12\x04\x0f\0\x14\x01\n\n\n\x03\x04\0\x01\ + \x12\x03\x0f\x08\x0e\n4\n\x04\x04\0\x02\0\x12\x03\x11\x04\x1b\x1a'\x20A\ + \x20public\x20key,\x20as\x20used\x20by\x20the\x20station.\n\n\x0c\n\x05\ + \x04\0\x02\0\x04\x12\x03\x11\x04\x0c\n\x0c\n\x05\x04\0\x02\0\x05\x12\x03\ + \x11\r\x12\n\x0c\n\x05\x04\0\x02\0\x01\x12\x03\x11\x13\x16\n\x0c\n\x05\ + \x04\0\x02\0\x03\x12\x03\x11\x19\x1a\n\x0b\n\x04\x04\0\x02\x01\x12\x03\ + \x13\x04\x1e\n\x0c\n\x05\x04\0\x02\x01\x04\x12\x03\x13\x04\x0c\n\x0c\n\ + \x05\x04\0\x02\x01\x06\x12\x03\x13\r\x14\n\x0c\n\x05\x04\0\x02\x01\x01\ + \x12\x03\x13\x15\x19\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x03\x13\x1c\x1d\n\ + \n\n\x02\x04\x01\x12\x04\x16\0<\x01\n\n\n\x03\x04\x01\x01\x12\x03\x16\ + \x08\x14\n\xa1\x01\n\x04\x04\x01\x02\0\x12\x03\x1b\x04!\x1a\x93\x01\x20T\ + he\x20hostname/SNI\x20to\x20use\x20for\x20this\x20host\n\n\x20The\x20hos\ + tname\x20is\x20the\x20only\x20required\x20field,\x20although\x20other\n\ + \x20fields\x20are\x20expected\x20to\x20be\x20present\x20in\x20most\x20ca\ + ses.\n\n\x0c\n\x05\x04\x01\x02\0\x04\x12\x03\x1b\x04\x0c\n\x0c\n\x05\x04\ + \x01\x02\0\x05\x12\x03\x1b\r\x13\n\x0c\n\x05\x04\x01\x02\0\x01\x12\x03\ + \x1b\x14\x1c\n\x0c\n\x05\x04\x01\x02\0\x03\x12\x03\x1b\x1f\x20\n\xf7\x01\ + \n\x04\x04\x01\x02\x01\x12\x03\"\x04\"\x1a\xe9\x01\x20The\x2032-bit\x20i\ + pv4\x20address,\x20in\x20network\x20byte\x20order\n\n\x20If\x20the\x20IP\ + v4\x20address\x20is\x20absent,\x20then\x20it\x20may\x20be\x20resolved\ + \x20via\n\x20DNS\x20by\x20the\x20client,\x20or\x20the\x20client\x20may\ + \x20discard\x20this\x20decoy\x20spec\n\x20if\x20local\x20DNS\x20is\x20un\ + trusted,\x20or\x20the\x20service\x20may\x20be\x20multihomed.\n\n\x0c\n\ + \x05\x04\x01\x02\x01\x04\x12\x03\"\x04\x0c\n\x0c\n\x05\x04\x01\x02\x01\ + \x05\x12\x03\"\r\x14\n\x0c\n\x05\x04\x01\x02\x01\x01\x12\x03\"\x15\x1d\n\ + \x0c\n\x05\x04\x01\x02\x01\x03\x12\x03\"\x20!\n>\n\x04\x04\x01\x02\x02\ + \x12\x03%\x04\x20\x1a1\x20The\x20128-bit\x20ipv6\x20address,\x20in\x20ne\ + twork\x20byte\x20order\n\n\x0c\n\x05\x04\x01\x02\x02\x04\x12\x03%\x04\ + \x0c\n\x0c\n\x05\x04\x01\x02\x02\x05\x12\x03%\r\x12\n\x0c\n\x05\x04\x01\ + \x02\x02\x01\x12\x03%\x13\x1b\n\x0c\n\x05\x04\x01\x02\x02\x03\x12\x03%\ + \x1e\x1f\n\x91\x01\n\x04\x04\x01\x02\x03\x12\x03+\x04\x1f\x1a\x83\x01\ + \x20The\x20Tapdance\x20station\x20public\x20key\x20to\x20use\x20when\x20\ + contacting\x20this\n\x20decoy\n\n\x20If\x20omitted,\x20the\x20default\ + \x20station\x20public\x20key\x20(if\x20any)\x20is\x20used.\n\n\x0c\n\x05\ + \x04\x01\x02\x03\x04\x12\x03+\x04\x0c\n\x0c\n\x05\x04\x01\x02\x03\x06\ + \x12\x03+\r\x13\n\x0c\n\x05\x04\x01\x02\x03\x01\x12\x03+\x14\x1a\n\x0c\n\ + \x05\x04\x01\x02\x03\x03\x12\x03+\x1d\x1e\n\xee\x01\n\x04\x04\x01\x02\ + \x04\x12\x032\x04\x20\x1a\xe0\x01\x20The\x20maximum\x20duration,\x20in\ + \x20milliseconds,\x20to\x20maintain\x20an\x20open\n\x20connection\x20to\ + \x20this\x20decoy\x20(because\x20the\x20decoy\x20may\x20close\x20the\n\ + \x20connection\x20itself\x20after\x20this\x20length\x20of\x20time)\n\n\ + \x20If\x20omitted,\x20a\x20default\x20of\x2030,000\x20milliseconds\x20is\ + \x20assumed.\n\n\x0c\n\x05\x04\x01\x02\x04\x04\x12\x032\x04\x0c\n\x0c\n\ + \x05\x04\x01\x02\x04\x05\x12\x032\r\x13\n\x0c\n\x05\x04\x01\x02\x04\x01\ + \x12\x032\x14\x1b\n\x0c\n\x05\x04\x01\x02\x04\x03\x12\x032\x1e\x1f\n\xb0\ + \x02\n\x04\x04\x01\x02\x05\x12\x03;\x04\x1f\x1a\xa2\x02\x20The\x20maximu\ + m\x20TCP\x20window\x20size\x20to\x20attempt\x20to\x20use\x20for\x20this\ + \x20decoy.\n\n\x20If\x20omitted,\x20a\x20default\x20of\x2015360\x20is\ + \x20assumed.\n\n\x20TODO:\x20the\x20default\x20is\x20based\x20on\x20the\ + \x20current\x20heuristic\x20of\x20only\n\x20using\x20decoys\x20that\x20p\ + ermit\x20windows\x20of\x2015KB\x20or\x20larger.\x20\x20If\x20this\n\x20h\ + euristic\x20changes,\x20then\x20this\x20default\x20doesn't\x20make\x20se\ + nse.\n\n\x0c\n\x05\x04\x01\x02\x05\x04\x12\x03;\x04\x0c\n\x0c\n\x05\x04\ + \x01\x02\x05\x05\x12\x03;\r\x13\n\x0c\n\x05\x04\x01\x02\x05\x01\x12\x03;\ + \x14\x1a\n\x0c\n\x05\x04\x01\x02\x05\x03\x12\x03;\x1d\x1e\n\x83\x08\n\ + \x02\x04\x02\x12\x04S\0Z\x012\xf6\x07\x20In\x20version\x201,\x20the\x20r\ + equest\x20is\x20very\x20simple:\x20when\n\x20the\x20client\x20sends\x20a\ + \x20MSG_PROTO\x20to\x20the\x20station,\x20if\x20the\n\x20generation\x20n\ + umber\x20is\x20present,\x20then\x20this\x20request\x20includes\n\x20(in\ + \x20addition\x20to\x20whatever\x20other\x20operations\x20are\x20part\x20\ + of\x20the\n\x20request)\x20a\x20request\x20for\x20the\x20station\x20to\ + \x20send\x20a\x20copy\x20of\n\x20the\x20current\x20decoy\x20set\x20that\ + \x20has\x20a\x20generation\x20number\x20greater\n\x20than\x20the\x20gene\ + ration\x20number\x20in\x20its\x20request.\n\n\x20If\x20the\x20response\ + \x20contains\x20a\x20DecoyListUpdate\x20with\x20a\x20generation\x20numbe\ + r\x20equal\n\x20to\x20that\x20which\x20the\x20client\x20sent,\x20then\ + \x20the\x20client\x20is\x20\"caught\x20up\"\x20with\n\x20the\x20station\ + \x20and\x20the\x20response\x20contains\x20no\x20new\x20information\n\x20\ + (and\x20all\x20other\x20fields\x20may\x20be\x20omitted\x20or\x20empty).\ + \x20\x20Otherwise,\n\x20the\x20station\x20will\x20send\x20the\x20latest\ + \x20configuration\x20information,\n\x20along\x20with\x20its\x20generatio\ + n\x20number.\n\n\x20The\x20station\x20can\x20also\x20send\x20ClientConf\ + \x20messages\n\x20(as\x20part\x20of\x20Station2Client\x20messages)\x20wh\ + enever\x20it\x20wants.\n\x20The\x20client\x20is\x20expected\x20to\x20rea\ + ct\x20as\x20if\x20it\x20had\x20requested\n\x20such\x20messages\x20--\x20\ + possibly\x20by\x20ignoring\x20them,\x20if\x20the\x20client\n\x20is\x20al\ + ready\x20up-to-date\x20according\x20to\x20the\x20generation\x20number.\n\ + \n\n\n\x03\x04\x02\x01\x12\x03S\x08\x12\n\x0b\n\x04\x04\x02\x02\0\x12\ + \x03T\x04&\n\x0c\n\x05\x04\x02\x02\0\x04\x12\x03T\x04\x0c\n\x0c\n\x05\ + \x04\x02\x02\0\x06\x12\x03T\r\x16\n\x0c\n\x05\x04\x02\x02\0\x01\x12\x03T\ + \x17!\n\x0c\n\x05\x04\x02\x02\0\x03\x12\x03T$%\n\x0b\n\x04\x04\x02\x02\ + \x01\x12\x03U\x04#\n\x0c\n\x05\x04\x02\x02\x01\x04\x12\x03U\x04\x0c\n\ + \x0c\n\x05\x04\x02\x02\x01\x05\x12\x03U\r\x13\n\x0c\n\x05\x04\x02\x02\ + \x01\x01\x12\x03U\x14\x1e\n\x0c\n\x05\x04\x02\x02\x01\x03\x12\x03U!\"\n\ + \x0b\n\x04\x04\x02\x02\x02\x12\x03V\x04'\n\x0c\n\x05\x04\x02\x02\x02\x04\ + \x12\x03V\x04\x0c\n\x0c\n\x05\x04\x02\x02\x02\x06\x12\x03V\r\x13\n\x0c\n\ + \x05\x04\x02\x02\x02\x01\x12\x03V\x14\"\n\x0c\n\x05\x04\x02\x02\x02\x03\ + \x12\x03V%&\n\x0b\n\x04\x04\x02\x02\x03\x12\x03W\x049\n\x0c\n\x05\x04\ + \x02\x02\x03\x04\x12\x03W\x04\x0c\n\x0c\n\x05\x04\x02\x02\x03\x06\x12\ + \x03W\r\x1f\n\x0c\n\x05\x04\x02\x02\x03\x01\x12\x03W\x204\n\x0c\n\x05\ + \x04\x02\x02\x03\x03\x12\x03W78\n\x0b\n\x04\x04\x02\x02\x04\x12\x03X\x04\ + '\n\x0c\n\x05\x04\x02\x02\x04\x04\x12\x03X\x04\x0c\n\x0c\n\x05\x04\x02\ + \x02\x04\x06\x12\x03X\r\x13\n\x0c\n\x05\x04\x02\x02\x04\x01\x12\x03X\x14\ + \"\n\x0c\n\x05\x04\x02\x02\x04\x03\x12\x03X%&\n\x0b\n\x04\x04\x02\x02\ + \x05\x12\x03Y\x04)\n\x0c\n\x05\x04\x02\x02\x05\x04\x12\x03Y\x04\x0c\n\ + \x0c\n\x05\x04\x02\x02\x05\x06\x12\x03Y\r\x17\n\x0c\n\x05\x04\x02\x02\ + \x05\x01\x12\x03Y\x18$\n\x0c\n\x05\x04\x02\x02\x05\x03\x12\x03Y'(\n-\n\ + \x02\x04\x03\x12\x04]\0d\x01\x1a!\x20Configuration\x20for\x20DNS\x20regi\ + strar\n\n\n\n\x03\x04\x03\x01\x12\x03]\x08\x12\n\x0b\n\x04\x04\x03\x02\0\ + \x12\x03^\x04-\n\x0c\n\x05\x04\x03\x02\0\x04\x12\x03^\x04\x0c\n\x0c\n\ \x05\x04\x03\x02\0\x06\x12\x03^\r\x19\n\x0c\n\x05\x04\x03\x02\0\x01\x12\ \x03^\x1a(\n\x0c\n\x05\x04\x03\x02\0\x03\x12\x03^+,\n\x0b\n\x04\x04\x03\ \x02\x01\x12\x03_\x04\x1f\n\x0c\n\x05\x04\x03\x02\x01\x04\x12\x03_\x04\ @@ -7192,241 +7470,260 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \n\r\n\x05\x04\t\x02\x01\x06\x12\x04\xbf\x01\r\x16\n\r\n\x05\x04\t\x02\ \x01\x01\x12\x04\xbf\x01\x17\x1a\n\r\n\x05\x04\t\x02\x01\x03\x12\x04\xbf\ \x01\x1d\x1e\n\x0c\n\x02\x04\n\x12\x06\xc2\x01\0\xc5\x01\x01\n\x0b\n\x03\ - \x04\n\x01\x12\x04\xc2\x01\x08\x1b\n\x0c\n\x04\x04\n\x02\0\x12\x04\xc3\ - \x01\x04!\n\r\n\x05\x04\n\x02\0\x04\x12\x04\xc3\x01\x04\x0c\n\r\n\x05\ - \x04\n\x02\0\x05\x12\x04\xc3\x01\r\x13\n\r\n\x05\x04\n\x02\0\x01\x12\x04\ - \xc3\x01\x14\x1c\n\r\n\x05\x04\n\x02\0\x03\x12\x04\xc3\x01\x1f\x20\n\x0c\ - \n\x04\x04\n\x02\x01\x12\x04\xc4\x01\x04)\n\r\n\x05\x04\n\x02\x01\x04\ + \x04\n\x01\x12\x04\xc2\x01\x08\x0c\n\x0c\n\x04\x04\n\x02\0\x12\x04\xc3\ + \x01\x04\x1a\n\r\n\x05\x04\n\x02\0\x04\x12\x04\xc3\x01\x04\x0c\n\r\n\x05\ + \x04\n\x02\0\x05\x12\x04\xc3\x01\r\x12\n\r\n\x05\x04\n\x02\0\x01\x12\x04\ + \xc3\x01\x13\x15\n\r\n\x05\x04\n\x02\0\x03\x12\x04\xc3\x01\x18\x19\n\x0c\ + \n\x04\x04\n\x02\x01\x12\x04\xc4\x01\x04\x1d\n\r\n\x05\x04\n\x02\x01\x04\ \x12\x04\xc4\x01\x04\x0c\n\r\n\x05\x04\n\x02\x01\x05\x12\x04\xc4\x01\r\ - \x11\n\r\n\x05\x04\n\x02\x01\x01\x12\x04\xc4\x01\x12$\n\r\n\x05\x04\n\ - \x02\x01\x03\x12\x04\xc4\x01'(\n\x0c\n\x02\x04\x0b\x12\x06\xc7\x01\0\xde\ - \x01\x01\n\x0b\n\x03\x04\x0b\x01\x12\x04\xc7\x01\x08\x17\nO\n\x04\x04\ - \x0b\x02\0\x12\x04\xc9\x01\x04)\x1aA\x20Should\x20accompany\x20(at\x20le\ - ast)\x20SESSION_INIT\x20and\x20CONFIRM_RECONNECT.\n\n\r\n\x05\x04\x0b\ - \x02\0\x04\x12\x04\xc9\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\0\x05\x12\x04\ - \xc9\x01\r\x13\n\r\n\x05\x04\x0b\x02\0\x01\x12\x04\xc9\x01\x14$\n\r\n\ - \x05\x04\x0b\x02\0\x03\x12\x04\xc9\x01'(\nv\n\x04\x04\x0b\x02\x01\x12\ - \x04\xcd\x01\x041\x1ah\x20There\x20might\x20be\x20a\x20state\x20transiti\ - on.\x20May\x20be\x20absent;\x20absence\x20should\x20be\n\x20treated\x20i\ - dentically\x20to\x20NO_CHANGE.\n\n\r\n\x05\x04\x0b\x02\x01\x04\x12\x04\ - \xcd\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\x01\x06\x12\x04\xcd\x01\r\x1b\n\r\ - \n\x05\x04\x0b\x02\x01\x01\x12\x04\xcd\x01\x1c,\n\r\n\x05\x04\x0b\x02\ - \x01\x03\x12\x04\xcd\x01/0\nc\n\x04\x04\x0b\x02\x02\x12\x04\xd1\x01\x04(\ - \x1aU\x20The\x20station\x20can\x20send\x20client\x20config\x20info\x20pi\ - ggybacked\n\x20on\x20any\x20message,\x20as\x20it\x20sees\x20fit\n\n\r\n\ - \x05\x04\x0b\x02\x02\x04\x12\x04\xd1\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\ - \x02\x06\x12\x04\xd1\x01\r\x17\n\r\n\x05\x04\x0b\x02\x02\x01\x12\x04\xd1\ - \x01\x18#\n\r\n\x05\x04\x0b\x02\x02\x03\x12\x04\xd1\x01&'\nP\n\x04\x04\ - \x0b\x02\x03\x12\x04\xd4\x01\x04+\x1aB\x20If\x20state_transition\x20==\ - \x20S2C_ERROR,\x20this\x20field\x20is\x20the\x20explanation.\n\n\r\n\x05\ - \x04\x0b\x02\x03\x04\x12\x04\xd4\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\x03\ - \x06\x12\x04\xd4\x01\r\x1b\n\r\n\x05\x04\x0b\x02\x03\x01\x12\x04\xd4\x01\ - \x1c&\n\r\n\x05\x04\x0b\x02\x03\x03\x12\x04\xd4\x01)*\nQ\n\x04\x04\x0b\ - \x02\x04\x12\x04\xd7\x01\x04$\x1aC\x20Signals\x20client\x20to\x20stop\ - \x20connecting\x20for\x20following\x20amount\x20of\x20seconds\n\n\r\n\ - \x05\x04\x0b\x02\x04\x04\x12\x04\xd7\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\ - \x04\x05\x12\x04\xd7\x01\r\x13\n\r\n\x05\x04\x0b\x02\x04\x01\x12\x04\xd7\ - \x01\x14\x1f\n\r\n\x05\x04\x0b\x02\x04\x03\x12\x04\xd7\x01\"#\nK\n\x04\ - \x04\x0b\x02\x05\x12\x04\xda\x01\x04#\x1a=\x20Sent\x20in\x20SESSION_INIT\ - ,\x20identifies\x20the\x20station\x20that\x20picked\x20up\n\n\r\n\x05\ - \x04\x0b\x02\x05\x04\x12\x04\xda\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\x05\ - \x05\x12\x04\xda\x01\r\x13\n\r\n\x05\x04\x0b\x02\x05\x01\x12\x04\xda\x01\ - \x14\x1e\n\r\n\x05\x04\x0b\x02\x05\x03\x12\x04\xda\x01!\"\nG\n\x04\x04\ - \x0b\x02\x06\x12\x04\xdd\x01\x04!\x1a9\x20Random-sized\x20junk\x20to\x20\ - defeat\x20packet\x20size\x20fingerprinting.\n\n\r\n\x05\x04\x0b\x02\x06\ - \x04\x12\x04\xdd\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\x06\x05\x12\x04\xdd\ - \x01\r\x12\n\r\n\x05\x04\x0b\x02\x06\x01\x12\x04\xdd\x01\x13\x1a\n\r\n\ - \x05\x04\x0b\x02\x06\x03\x12\x04\xdd\x01\x1d\x20\n\x0c\n\x02\x04\x0c\x12\ - \x06\xe0\x01\0\xe6\x01\x01\n\x0b\n\x03\x04\x0c\x01\x12\x04\xe0\x01\x08\ - \x19\n\x0c\n\x04\x04\x0c\x02\0\x12\x04\xe1\x01\x08&\n\r\n\x05\x04\x0c\ - \x02\0\x04\x12\x04\xe1\x01\x08\x10\n\r\n\x05\x04\x0c\x02\0\x05\x12\x04\ - \xe1\x01\x11\x15\n\r\n\x05\x04\x0c\x02\0\x01\x12\x04\xe1\x01\x16!\n\r\n\ - \x05\x04\x0c\x02\0\x03\x12\x04\xe1\x01$%\n\x0c\n\x04\x04\x0c\x02\x01\x12\ - \x04\xe2\x01\x08%\n\r\n\x05\x04\x0c\x02\x01\x04\x12\x04\xe2\x01\x08\x10\ - \n\r\n\x05\x04\x0c\x02\x01\x05\x12\x04\xe2\x01\x11\x15\n\r\n\x05\x04\x0c\ - \x02\x01\x01\x12\x04\xe2\x01\x16\x20\n\r\n\x05\x04\x0c\x02\x01\x03\x12\ - \x04\xe2\x01#$\n\x0c\n\x04\x04\x0c\x02\x02\x12\x04\xe3\x01\x08'\n\r\n\ - \x05\x04\x0c\x02\x02\x04\x12\x04\xe3\x01\x08\x10\n\r\n\x05\x04\x0c\x02\ - \x02\x05\x12\x04\xe3\x01\x11\x15\n\r\n\x05\x04\x0c\x02\x02\x01\x12\x04\ - \xe3\x01\x16\"\n\r\n\x05\x04\x0c\x02\x02\x03\x12\x04\xe3\x01%&\n\x0c\n\ - \x04\x04\x0c\x02\x03\x12\x04\xe4\x01\x04\x1e\n\r\n\x05\x04\x0c\x02\x03\ - \x04\x12\x04\xe4\x01\x04\x0c\n\r\n\x05\x04\x0c\x02\x03\x05\x12\x04\xe4\ - \x01\r\x11\n\r\n\x05\x04\x0c\x02\x03\x01\x12\x04\xe4\x01\x12\x19\n\r\n\ - \x05\x04\x0c\x02\x03\x03\x12\x04\xe4\x01\x1c\x1d\n\x0c\n\x04\x04\x0c\x02\ - \x04\x12\x04\xe5\x01\x04!\n\r\n\x05\x04\x0c\x02\x04\x04\x12\x04\xe5\x01\ - \x04\x0c\n\r\n\x05\x04\x0c\x02\x04\x05\x12\x04\xe5\x01\r\x11\n\r\n\x05\ - \x04\x0c\x02\x04\x01\x12\x04\xe5\x01\x12\x1c\n\r\n\x05\x04\x0c\x02\x04\ - \x03\x12\x04\xe5\x01\x1f\x20\n\x0c\n\x02\x04\r\x12\x06\xe8\x01\0\xa2\x02\ - \x01\n\x0b\n\x03\x04\r\x01\x12\x04\xe8\x01\x08\x17\n\x0c\n\x04\x04\r\x02\ - \0\x12\x04\xe9\x01\x04)\n\r\n\x05\x04\r\x02\0\x04\x12\x04\xe9\x01\x04\ - \x0c\n\r\n\x05\x04\r\x02\0\x05\x12\x04\xe9\x01\r\x13\n\r\n\x05\x04\r\x02\ - \0\x01\x12\x04\xe9\x01\x14$\n\r\n\x05\x04\r\x02\0\x03\x12\x04\xe9\x01'(\ - \n\xd0\x01\n\x04\x04\r\x02\x01\x12\x04\xee\x01\x04.\x1a\xc1\x01\x20The\ - \x20client\x20reports\x20its\x20decoy\x20list's\x20version\x20number\x20\ - here,\x20which\x20the\n\x20station\x20can\x20use\x20to\x20decide\x20whet\ - her\x20to\x20send\x20an\x20updated\x20one.\x20The\x20station\n\x20should\ - \x20always\x20send\x20a\x20list\x20if\x20this\x20field\x20is\x20set\x20t\ - o\x200.\n\n\r\n\x05\x04\r\x02\x01\x04\x12\x04\xee\x01\x04\x0c\n\r\n\x05\ - \x04\r\x02\x01\x05\x12\x04\xee\x01\r\x13\n\r\n\x05\x04\r\x02\x01\x01\x12\ - \x04\xee\x01\x14)\n\r\n\x05\x04\r\x02\x01\x03\x12\x04\xee\x01,-\n\x0c\n\ - \x04\x04\r\x02\x02\x12\x04\xf0\x01\x041\n\r\n\x05\x04\r\x02\x02\x04\x12\ - \x04\xf0\x01\x04\x0c\n\r\n\x05\x04\r\x02\x02\x06\x12\x04\xf0\x01\r\x1b\n\ - \r\n\x05\x04\r\x02\x02\x01\x12\x04\xf0\x01\x1c,\n\r\n\x05\x04\r\x02\x02\ - \x03\x12\x04\xf0\x01/0\n\x80\x01\n\x04\x04\r\x02\x03\x12\x04\xf4\x01\x04\ - $\x1ar\x20The\x20position\x20in\x20the\x20overall\x20session's\x20upload\ - \x20sequence\x20where\x20the\x20current\n\x20YIELD=>ACQUIRE\x20switchove\ - r\x20is\x20happening.\n\n\r\n\x05\x04\r\x02\x03\x04\x12\x04\xf4\x01\x04\ - \x0c\n\r\n\x05\x04\r\x02\x03\x05\x12\x04\xf4\x01\r\x13\n\r\n\x05\x04\r\ - \x02\x03\x01\x12\x04\xf4\x01\x14\x1f\n\r\n\x05\x04\r\x02\x03\x03\x12\x04\ - \xf4\x01\"#\ng\n\x04\x04\r\x02\x04\x12\x04\xf8\x01\x04+\x1aY\x20High\x20\ - level\x20client\x20library\x20version\x20used\x20for\x20indicating\x20fe\ - ature\x20support,\x20or\n\x20lack\x20therof.\n\n\r\n\x05\x04\r\x02\x04\ - \x04\x12\x04\xf8\x01\x04\x0c\n\r\n\x05\x04\r\x02\x04\x05\x12\x04\xf8\x01\ - \r\x13\n\r\n\x05\x04\r\x02\x04\x01\x12\x04\xf8\x01\x14&\n\r\n\x05\x04\r\ - \x02\x04\x03\x12\x04\xf8\x01)*\n\xa5\x02\n\x04\x04\r\x02\x05\x12\x04\xfd\ - \x01\x042\x1a\x96\x02\x20Indicates\x20whether\x20the\x20client\x20will\ - \x20allow\x20the\x20registrar\x20to\x20provide\x20alternative\x20paramet\ - ers\x20that\n\x20may\x20work\x20better\x20in\x20substitute\x20for\x20the\ - \x20deterministically\x20selected\x20parameters.\x20This\x20only\x20work\ - s\n\x20for\x20bidirectional\x20registration\x20methods\x20where\x20the\ - \x20client\x20receives\x20a\x20RegistrationResponse.\n\n\r\n\x05\x04\r\ - \x02\x05\x04\x12\x04\xfd\x01\x04\x0c\n\r\n\x05\x04\r\x02\x05\x05\x12\x04\ - \xfd\x01\r\x11\n\r\n\x05\x04\r\x02\x05\x01\x12\x04\xfd\x01\x12-\n\r\n\ - \x05\x04\r\x02\x05\x03\x12\x04\xfd\x0101\nq\n\x04\x04\r\x02\x06\x12\x04\ - \x81\x02\x04'\x1ac\x20List\x20of\x20decoys\x20that\x20client\x20have\x20\ - unsuccessfully\x20tried\x20in\x20current\x20session.\n\x20Could\x20be\ - \x20sent\x20in\x20chunks\n\n\r\n\x05\x04\r\x02\x06\x04\x12\x04\x81\x02\ - \x04\x0c\n\r\n\x05\x04\r\x02\x06\x05\x12\x04\x81\x02\r\x13\n\r\n\x05\x04\ - \r\x02\x06\x01\x12\x04\x81\x02\x14!\n\r\n\x05\x04\r\x02\x06\x03\x12\x04\ - \x81\x02$&\n\x0c\n\x04\x04\r\x02\x07\x12\x04\x83\x02\x04%\n\r\n\x05\x04\ - \r\x02\x07\x04\x12\x04\x83\x02\x04\x0c\n\r\n\x05\x04\r\x02\x07\x06\x12\ - \x04\x83\x02\r\x19\n\r\n\x05\x04\r\x02\x07\x01\x12\x04\x83\x02\x1a\x1f\n\ - \r\n\x05\x04\r\x02\x07\x03\x12\x04\x83\x02\"$\nk\n\x04\x04\r\x02\x08\x12\ - \x04\x86\x02\x04*\x1a]\x20NullTransport,\x20MinTransport,\x20Obfs4Transp\ - ort,\x20etc.\x20Transport\x20type\x20we\x20want\x20from\x20phantom\x20pr\ - oxy\n\n\r\n\x05\x04\r\x02\x08\x04\x12\x04\x86\x02\x04\x0c\n\r\n\x05\x04\ - \r\x02\x08\x06\x12\x04\x86\x02\r\x1a\n\r\n\x05\x04\r\x02\x08\x01\x12\x04\ - \x86\x02\x1b$\n\r\n\x05\x04\r\x02\x08\x03\x12\x04\x86\x02')\n\x0c\n\x04\ - \x04\r\x02\t\x12\x04\x88\x02\x047\n\r\n\x05\x04\r\x02\t\x04\x12\x04\x88\ - \x02\x04\x0c\n\r\n\x05\x04\r\x02\t\x06\x12\x04\x88\x02\r\x20\n\r\n\x05\ - \x04\r\x02\t\x01\x12\x04\x88\x02!1\n\r\n\x05\x04\r\x02\t\x03\x12\x04\x88\ - \x0246\n\xc8\x03\n\x04\x04\r\x02\n\x12\x04\x90\x02\x04(\x1a\xb9\x03\x20S\ - tation\x20is\x20only\x20required\x20to\x20check\x20this\x20variable\x20d\ - uring\x20session\x20initialization.\n\x20If\x20set,\x20station\x20must\ - \x20facilitate\x20connection\x20to\x20said\x20target\x20by\x20itself,\ - \x20i.e.\x20write\x20into\x20squid\n\x20socket\x20an\x20HTTP/SOCKS/any\ - \x20other\x20connection\x20request.\n\x20covert_address\x20must\x20have\ - \x20exactly\x20one\x20':'\x20colon,\x20that\x20separates\x20host\x20(lit\ - eral\x20IP\x20address\x20or\n\x20resolvable\x20hostname)\x20and\x20port\ - \n\x20TODO:\x20make\x20it\x20required\x20for\x20initialization,\x20and\ - \x20stop\x20connecting\x20any\x20client\x20straight\x20to\x20squid?\n\n\ - \r\n\x05\x04\r\x02\n\x04\x12\x04\x90\x02\x04\x0c\n\r\n\x05\x04\r\x02\n\ - \x05\x12\x04\x90\x02\r\x13\n\r\n\x05\x04\r\x02\n\x01\x12\x04\x90\x02\x14\ - \"\n\r\n\x05\x04\r\x02\n\x03\x12\x04\x90\x02%'\nR\n\x04\x04\r\x02\x0b\ - \x12\x04\x93\x02\x042\x1aD\x20Used\x20in\x20dark\x20decoys\x20to\x20sign\ - al\x20which\x20dark\x20decoy\x20it\x20will\x20connect\x20to.\n\n\r\n\x05\ - \x04\r\x02\x0b\x04\x12\x04\x93\x02\x04\x0c\n\r\n\x05\x04\r\x02\x0b\x05\ - \x12\x04\x93\x02\r\x13\n\r\n\x05\x04\r\x02\x0b\x01\x12\x04\x93\x02\x14,\ - \n\r\n\x05\x04\r\x02\x0b\x03\x12\x04\x93\x02/1\nR\n\x04\x04\r\x02\x0c\ - \x12\x04\x96\x02\x04\"\x1aD\x20Used\x20to\x20indicate\x20to\x20server\ - \x20if\x20client\x20is\x20registering\x20v4,\x20v6\x20or\x20both\n\n\r\n\ - \x05\x04\r\x02\x0c\x04\x12\x04\x96\x02\x04\x0c\n\r\n\x05\x04\r\x02\x0c\ - \x05\x12\x04\x96\x02\r\x11\n\r\n\x05\x04\r\x02\x0c\x01\x12\x04\x96\x02\ - \x12\x1c\n\r\n\x05\x04\r\x02\x0c\x03\x12\x04\x96\x02\x1f!\n\x0c\n\x04\ - \x04\r\x02\r\x12\x04\x97\x02\x04\"\n\r\n\x05\x04\r\x02\r\x04\x12\x04\x97\ - \x02\x04\x0c\n\r\n\x05\x04\r\x02\r\x05\x12\x04\x97\x02\r\x11\n\r\n\x05\ - \x04\r\x02\r\x01\x12\x04\x97\x02\x12\x1c\n\r\n\x05\x04\r\x02\r\x03\x12\ - \x04\x97\x02\x1f!\nD\n\x04\x04\r\x02\x0e\x12\x04\x9a\x02\x04*\x1a6\x20A\ - \x20collection\x20of\x20optional\x20flags\x20for\x20the\x20registration.\ - \n\n\r\n\x05\x04\r\x02\x0e\x04\x12\x04\x9a\x02\x04\x0c\n\r\n\x05\x04\r\ - \x02\x0e\x06\x12\x04\x9a\x02\r\x1e\n\r\n\x05\x04\r\x02\x0e\x01\x12\x04\ - \x9a\x02\x1f$\n\r\n\x05\x04\r\x02\x0e\x03\x12\x04\x9a\x02')\nq\n\x04\x04\ - \r\x02\x0f\x12\x04\x9e\x02\x04-\x1ac\x20Transport\x20Extensions\n\x20TOD\ - O(jmwample)\x20-\x20move\x20to\x20WebRTC\x20specific\x20transport\x20par\ - ams\x20protobuf\x20message.\n\n\r\n\x05\x04\r\x02\x0f\x04\x12\x04\x9e\ - \x02\x04\x0c\n\r\n\x05\x04\r\x02\x0f\x06\x12\x04\x9e\x02\r\x19\n\r\n\x05\ - \x04\r\x02\x0f\x01\x12\x04\x9e\x02\x1a'\n\r\n\x05\x04\r\x02\x0f\x03\x12\ - \x04\x9e\x02*,\nG\n\x04\x04\r\x02\x10\x12\x04\xa1\x02\x04!\x1a9\x20Rando\ - m-sized\x20junk\x20to\x20defeat\x20packet\x20size\x20fingerprinting.\n\n\ - \r\n\x05\x04\r\x02\x10\x04\x12\x04\xa1\x02\x04\x0c\n\r\n\x05\x04\r\x02\ - \x10\x05\x12\x04\xa1\x02\r\x12\n\r\n\x05\x04\r\x02\x10\x01\x12\x04\xa1\ - \x02\x13\x1a\n\r\n\x05\x04\r\x02\x10\x03\x12\x04\xa1\x02\x1d\x20\n\x0c\n\ - \x02\x04\x0e\x12\x06\xa5\x02\0\xb7\x02\x01\n\x0b\n\x03\x04\x0e\x01\x12\ - \x04\xa5\x02\x08\x1d\n!\n\x04\x04\x0e\x02\0\x12\x04\xa7\x02\x04!\x1a\x13\ - \x20Prefix\x20Identifier\n\n\r\n\x05\x04\x0e\x02\0\x04\x12\x04\xa7\x02\ - \x04\x0c\n\r\n\x05\x04\x0e\x02\0\x05\x12\x04\xa7\x02\r\x12\n\r\n\x05\x04\ - \x0e\x02\0\x01\x12\x04\xa7\x02\x13\x1c\n\r\n\x05\x04\x0e\x02\0\x03\x12\ - \x04\xa7\x02\x1f\x20\n\xc4\x01\n\x04\x04\x0e\x02\x01\x12\x04\xab\x02\x04\ + \x13\n\r\n\x05\x04\n\x02\x01\x01\x12\x04\xc4\x01\x14\x18\n\r\n\x05\x04\n\ + \x02\x01\x03\x12\x04\xc4\x01\x1b\x1c\n\x0c\n\x02\x04\x0b\x12\x06\xc7\x01\ + \0\xcd\x01\x01\n\x0b\n\x03\x04\x0b\x01\x12\x04\xc7\x01\x08\x1b\n\x0c\n\ + \x04\x04\x0b\x02\0\x12\x04\xc8\x01\x04\x20\n\r\n\x05\x04\x0b\x02\0\x04\ + \x12\x04\xc8\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\0\x06\x12\x04\xc8\x01\r\ + \x11\n\r\n\x05\x04\x0b\x02\0\x01\x12\x04\xc8\x01\x12\x1b\n\r\n\x05\x04\ + \x0b\x02\0\x03\x12\x04\xc8\x01\x1e\x1f\n\x0c\n\x04\x04\x0b\x02\x01\x12\ + \x04\xc9\x01\x04\x20\n\r\n\x05\x04\x0b\x02\x01\x04\x12\x04\xc9\x01\x04\ + \x0c\n\r\n\x05\x04\x0b\x02\x01\x06\x12\x04\xc9\x01\r\x11\n\r\n\x05\x04\ + \x0b\x02\x01\x01\x12\x04\xc9\x01\x12\x1b\n\r\n\x05\x04\x0b\x02\x01\x03\ + \x12\x04\xc9\x01\x1e\x1f\n\x0c\n\x04\x04\x0b\x02\x02\x12\x04\xca\x01\x04\ + )\n\r\n\x05\x04\x0b\x02\x02\x04\x12\x04\xca\x01\x04\x0c\n\r\n\x05\x04\ + \x0b\x02\x02\x05\x12\x04\xca\x01\r\x11\n\r\n\x05\x04\x0b\x02\x02\x01\x12\ + \x04\xca\x01\x12$\n\r\n\x05\x04\x0b\x02\x02\x03\x12\x04\xca\x01'(\nN\n\ + \x04\x04\x0b\x02\x03\x12\x04\xcc\x01\x04\x20\x1a@\x20Unordered\x20sets\ + \x20the\x20reliability\x20of\x20the\x20DTLS\x20stream\x20to\x20unordered\ + \n\n\r\n\x05\x04\x0b\x02\x03\x04\x12\x04\xcc\x01\x04\x0c\n\r\n\x05\x04\ + \x0b\x02\x03\x05\x12\x04\xcc\x01\r\x11\n\r\n\x05\x04\x0b\x02\x03\x01\x12\ + \x04\xcc\x01\x12\x1b\n\r\n\x05\x04\x0b\x02\x03\x03\x12\x04\xcc\x01\x1e\ + \x1f\n\x0c\n\x02\x04\x0c\x12\x06\xcf\x01\0\xe6\x01\x01\n\x0b\n\x03\x04\ + \x0c\x01\x12\x04\xcf\x01\x08\x17\nO\n\x04\x04\x0c\x02\0\x12\x04\xd1\x01\ + \x04)\x1aA\x20Should\x20accompany\x20(at\x20least)\x20SESSION_INIT\x20an\ + d\x20CONFIRM_RECONNECT.\n\n\r\n\x05\x04\x0c\x02\0\x04\x12\x04\xd1\x01\ + \x04\x0c\n\r\n\x05\x04\x0c\x02\0\x05\x12\x04\xd1\x01\r\x13\n\r\n\x05\x04\ + \x0c\x02\0\x01\x12\x04\xd1\x01\x14$\n\r\n\x05\x04\x0c\x02\0\x03\x12\x04\ + \xd1\x01'(\nv\n\x04\x04\x0c\x02\x01\x12\x04\xd5\x01\x041\x1ah\x20There\ + \x20might\x20be\x20a\x20state\x20transition.\x20May\x20be\x20absent;\x20\ + absence\x20should\x20be\n\x20treated\x20identically\x20to\x20NO_CHANGE.\ + \n\n\r\n\x05\x04\x0c\x02\x01\x04\x12\x04\xd5\x01\x04\x0c\n\r\n\x05\x04\ + \x0c\x02\x01\x06\x12\x04\xd5\x01\r\x1b\n\r\n\x05\x04\x0c\x02\x01\x01\x12\ + \x04\xd5\x01\x1c,\n\r\n\x05\x04\x0c\x02\x01\x03\x12\x04\xd5\x01/0\nc\n\ + \x04\x04\x0c\x02\x02\x12\x04\xd9\x01\x04(\x1aU\x20The\x20station\x20can\ + \x20send\x20client\x20config\x20info\x20piggybacked\n\x20on\x20any\x20me\ + ssage,\x20as\x20it\x20sees\x20fit\n\n\r\n\x05\x04\x0c\x02\x02\x04\x12\ + \x04\xd9\x01\x04\x0c\n\r\n\x05\x04\x0c\x02\x02\x06\x12\x04\xd9\x01\r\x17\ + \n\r\n\x05\x04\x0c\x02\x02\x01\x12\x04\xd9\x01\x18#\n\r\n\x05\x04\x0c\ + \x02\x02\x03\x12\x04\xd9\x01&'\nP\n\x04\x04\x0c\x02\x03\x12\x04\xdc\x01\ + \x04+\x1aB\x20If\x20state_transition\x20==\x20S2C_ERROR,\x20this\x20fiel\ + d\x20is\x20the\x20explanation.\n\n\r\n\x05\x04\x0c\x02\x03\x04\x12\x04\ + \xdc\x01\x04\x0c\n\r\n\x05\x04\x0c\x02\x03\x06\x12\x04\xdc\x01\r\x1b\n\r\ + \n\x05\x04\x0c\x02\x03\x01\x12\x04\xdc\x01\x1c&\n\r\n\x05\x04\x0c\x02\ + \x03\x03\x12\x04\xdc\x01)*\nQ\n\x04\x04\x0c\x02\x04\x12\x04\xdf\x01\x04$\ + \x1aC\x20Signals\x20client\x20to\x20stop\x20connecting\x20for\x20followi\ + ng\x20amount\x20of\x20seconds\n\n\r\n\x05\x04\x0c\x02\x04\x04\x12\x04\ + \xdf\x01\x04\x0c\n\r\n\x05\x04\x0c\x02\x04\x05\x12\x04\xdf\x01\r\x13\n\r\ + \n\x05\x04\x0c\x02\x04\x01\x12\x04\xdf\x01\x14\x1f\n\r\n\x05\x04\x0c\x02\ + \x04\x03\x12\x04\xdf\x01\"#\nK\n\x04\x04\x0c\x02\x05\x12\x04\xe2\x01\x04\ + #\x1a=\x20Sent\x20in\x20SESSION_INIT,\x20identifies\x20the\x20station\ + \x20that\x20picked\x20up\n\n\r\n\x05\x04\x0c\x02\x05\x04\x12\x04\xe2\x01\ + \x04\x0c\n\r\n\x05\x04\x0c\x02\x05\x05\x12\x04\xe2\x01\r\x13\n\r\n\x05\ + \x04\x0c\x02\x05\x01\x12\x04\xe2\x01\x14\x1e\n\r\n\x05\x04\x0c\x02\x05\ + \x03\x12\x04\xe2\x01!\"\nG\n\x04\x04\x0c\x02\x06\x12\x04\xe5\x01\x04!\ + \x1a9\x20Random-sized\x20junk\x20to\x20defeat\x20packet\x20size\x20finge\ + rprinting.\n\n\r\n\x05\x04\x0c\x02\x06\x04\x12\x04\xe5\x01\x04\x0c\n\r\n\ + \x05\x04\x0c\x02\x06\x05\x12\x04\xe5\x01\r\x12\n\r\n\x05\x04\x0c\x02\x06\ + \x01\x12\x04\xe5\x01\x13\x1a\n\r\n\x05\x04\x0c\x02\x06\x03\x12\x04\xe5\ + \x01\x1d\x20\n\x0c\n\x02\x04\r\x12\x06\xe8\x01\0\xee\x01\x01\n\x0b\n\x03\ + \x04\r\x01\x12\x04\xe8\x01\x08\x19\n\x0c\n\x04\x04\r\x02\0\x12\x04\xe9\ + \x01\x08&\n\r\n\x05\x04\r\x02\0\x04\x12\x04\xe9\x01\x08\x10\n\r\n\x05\ + \x04\r\x02\0\x05\x12\x04\xe9\x01\x11\x15\n\r\n\x05\x04\r\x02\0\x01\x12\ + \x04\xe9\x01\x16!\n\r\n\x05\x04\r\x02\0\x03\x12\x04\xe9\x01$%\n\x0c\n\ + \x04\x04\r\x02\x01\x12\x04\xea\x01\x08%\n\r\n\x05\x04\r\x02\x01\x04\x12\ + \x04\xea\x01\x08\x10\n\r\n\x05\x04\r\x02\x01\x05\x12\x04\xea\x01\x11\x15\ + \n\r\n\x05\x04\r\x02\x01\x01\x12\x04\xea\x01\x16\x20\n\r\n\x05\x04\r\x02\ + \x01\x03\x12\x04\xea\x01#$\n\x0c\n\x04\x04\r\x02\x02\x12\x04\xeb\x01\x08\ + '\n\r\n\x05\x04\r\x02\x02\x04\x12\x04\xeb\x01\x08\x10\n\r\n\x05\x04\r\ + \x02\x02\x05\x12\x04\xeb\x01\x11\x15\n\r\n\x05\x04\r\x02\x02\x01\x12\x04\ + \xeb\x01\x16\"\n\r\n\x05\x04\r\x02\x02\x03\x12\x04\xeb\x01%&\n\x0c\n\x04\ + \x04\r\x02\x03\x12\x04\xec\x01\x04\x1e\n\r\n\x05\x04\r\x02\x03\x04\x12\ + \x04\xec\x01\x04\x0c\n\r\n\x05\x04\r\x02\x03\x05\x12\x04\xec\x01\r\x11\n\ + \r\n\x05\x04\r\x02\x03\x01\x12\x04\xec\x01\x12\x19\n\r\n\x05\x04\r\x02\ + \x03\x03\x12\x04\xec\x01\x1c\x1d\n\x0c\n\x04\x04\r\x02\x04\x12\x04\xed\ + \x01\x04!\n\r\n\x05\x04\r\x02\x04\x04\x12\x04\xed\x01\x04\x0c\n\r\n\x05\ + \x04\r\x02\x04\x05\x12\x04\xed\x01\r\x11\n\r\n\x05\x04\r\x02\x04\x01\x12\ + \x04\xed\x01\x12\x1c\n\r\n\x05\x04\r\x02\x04\x03\x12\x04\xed\x01\x1f\x20\ + \n\x0c\n\x02\x04\x0e\x12\x06\xf0\x01\0\xaa\x02\x01\n\x0b\n\x03\x04\x0e\ + \x01\x12\x04\xf0\x01\x08\x17\n\x0c\n\x04\x04\x0e\x02\0\x12\x04\xf1\x01\ + \x04)\n\r\n\x05\x04\x0e\x02\0\x04\x12\x04\xf1\x01\x04\x0c\n\r\n\x05\x04\ + \x0e\x02\0\x05\x12\x04\xf1\x01\r\x13\n\r\n\x05\x04\x0e\x02\0\x01\x12\x04\ + \xf1\x01\x14$\n\r\n\x05\x04\x0e\x02\0\x03\x12\x04\xf1\x01'(\n\xd0\x01\n\ + \x04\x04\x0e\x02\x01\x12\x04\xf6\x01\x04.\x1a\xc1\x01\x20The\x20client\ + \x20reports\x20its\x20decoy\x20list's\x20version\x20number\x20here,\x20w\ + hich\x20the\n\x20station\x20can\x20use\x20to\x20decide\x20whether\x20to\ + \x20send\x20an\x20updated\x20one.\x20The\x20station\n\x20should\x20alway\ + s\x20send\x20a\x20list\x20if\x20this\x20field\x20is\x20set\x20to\x200.\n\ + \n\r\n\x05\x04\x0e\x02\x01\x04\x12\x04\xf6\x01\x04\x0c\n\r\n\x05\x04\x0e\ + \x02\x01\x05\x12\x04\xf6\x01\r\x13\n\r\n\x05\x04\x0e\x02\x01\x01\x12\x04\ + \xf6\x01\x14)\n\r\n\x05\x04\x0e\x02\x01\x03\x12\x04\xf6\x01,-\n\x0c\n\ + \x04\x04\x0e\x02\x02\x12\x04\xf8\x01\x041\n\r\n\x05\x04\x0e\x02\x02\x04\ + \x12\x04\xf8\x01\x04\x0c\n\r\n\x05\x04\x0e\x02\x02\x06\x12\x04\xf8\x01\r\ + \x1b\n\r\n\x05\x04\x0e\x02\x02\x01\x12\x04\xf8\x01\x1c,\n\r\n\x05\x04\ + \x0e\x02\x02\x03\x12\x04\xf8\x01/0\n\x80\x01\n\x04\x04\x0e\x02\x03\x12\ + \x04\xfc\x01\x04$\x1ar\x20The\x20position\x20in\x20the\x20overall\x20ses\ + sion's\x20upload\x20sequence\x20where\x20the\x20current\n\x20YIELD=>ACQU\ + IRE\x20switchover\x20is\x20happening.\n\n\r\n\x05\x04\x0e\x02\x03\x04\ + \x12\x04\xfc\x01\x04\x0c\n\r\n\x05\x04\x0e\x02\x03\x05\x12\x04\xfc\x01\r\ + \x13\n\r\n\x05\x04\x0e\x02\x03\x01\x12\x04\xfc\x01\x14\x1f\n\r\n\x05\x04\ + \x0e\x02\x03\x03\x12\x04\xfc\x01\"#\ng\n\x04\x04\x0e\x02\x04\x12\x04\x80\ + \x02\x04+\x1aY\x20High\x20level\x20client\x20library\x20version\x20used\ + \x20for\x20indicating\x20feature\x20support,\x20or\n\x20lack\x20therof.\ + \n\n\r\n\x05\x04\x0e\x02\x04\x04\x12\x04\x80\x02\x04\x0c\n\r\n\x05\x04\ + \x0e\x02\x04\x05\x12\x04\x80\x02\r\x13\n\r\n\x05\x04\x0e\x02\x04\x01\x12\ + \x04\x80\x02\x14&\n\r\n\x05\x04\x0e\x02\x04\x03\x12\x04\x80\x02)*\n\xa5\ + \x02\n\x04\x04\x0e\x02\x05\x12\x04\x85\x02\x042\x1a\x96\x02\x20Indicates\ + \x20whether\x20the\x20client\x20will\x20allow\x20the\x20registrar\x20to\ + \x20provide\x20alternative\x20parameters\x20that\n\x20may\x20work\x20bet\ + ter\x20in\x20substitute\x20for\x20the\x20deterministically\x20selected\ + \x20parameters.\x20This\x20only\x20works\n\x20for\x20bidirectional\x20re\ + gistration\x20methods\x20where\x20the\x20client\x20receives\x20a\x20Regi\ + strationResponse.\n\n\r\n\x05\x04\x0e\x02\x05\x04\x12\x04\x85\x02\x04\ + \x0c\n\r\n\x05\x04\x0e\x02\x05\x05\x12\x04\x85\x02\r\x11\n\r\n\x05\x04\ + \x0e\x02\x05\x01\x12\x04\x85\x02\x12-\n\r\n\x05\x04\x0e\x02\x05\x03\x12\ + \x04\x85\x0201\nq\n\x04\x04\x0e\x02\x06\x12\x04\x89\x02\x04'\x1ac\x20Lis\ + t\x20of\x20decoys\x20that\x20client\x20have\x20unsuccessfully\x20tried\ + \x20in\x20current\x20session.\n\x20Could\x20be\x20sent\x20in\x20chunks\n\ + \n\r\n\x05\x04\x0e\x02\x06\x04\x12\x04\x89\x02\x04\x0c\n\r\n\x05\x04\x0e\ + \x02\x06\x05\x12\x04\x89\x02\r\x13\n\r\n\x05\x04\x0e\x02\x06\x01\x12\x04\ + \x89\x02\x14!\n\r\n\x05\x04\x0e\x02\x06\x03\x12\x04\x89\x02$&\n\x0c\n\ + \x04\x04\x0e\x02\x07\x12\x04\x8b\x02\x04%\n\r\n\x05\x04\x0e\x02\x07\x04\ + \x12\x04\x8b\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\x07\x06\x12\x04\x8b\x02\r\ + \x19\n\r\n\x05\x04\x0e\x02\x07\x01\x12\x04\x8b\x02\x1a\x1f\n\r\n\x05\x04\ + \x0e\x02\x07\x03\x12\x04\x8b\x02\"$\nk\n\x04\x04\x0e\x02\x08\x12\x04\x8e\ + \x02\x04*\x1a]\x20NullTransport,\x20MinTransport,\x20Obfs4Transport,\x20\ + etc.\x20Transport\x20type\x20we\x20want\x20from\x20phantom\x20proxy\n\n\ + \r\n\x05\x04\x0e\x02\x08\x04\x12\x04\x8e\x02\x04\x0c\n\r\n\x05\x04\x0e\ + \x02\x08\x06\x12\x04\x8e\x02\r\x1a\n\r\n\x05\x04\x0e\x02\x08\x01\x12\x04\ + \x8e\x02\x1b$\n\r\n\x05\x04\x0e\x02\x08\x03\x12\x04\x8e\x02')\n\x0c\n\ + \x04\x04\x0e\x02\t\x12\x04\x90\x02\x047\n\r\n\x05\x04\x0e\x02\t\x04\x12\ + \x04\x90\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\t\x06\x12\x04\x90\x02\r\x20\n\ + \r\n\x05\x04\x0e\x02\t\x01\x12\x04\x90\x02!1\n\r\n\x05\x04\x0e\x02\t\x03\ + \x12\x04\x90\x0246\n\xc8\x03\n\x04\x04\x0e\x02\n\x12\x04\x98\x02\x04(\ + \x1a\xb9\x03\x20Station\x20is\x20only\x20required\x20to\x20check\x20this\ + \x20variable\x20during\x20session\x20initialization.\n\x20If\x20set,\x20\ + station\x20must\x20facilitate\x20connection\x20to\x20said\x20target\x20b\ + y\x20itself,\x20i.e.\x20write\x20into\x20squid\n\x20socket\x20an\x20HTTP\ + /SOCKS/any\x20other\x20connection\x20request.\n\x20covert_address\x20mus\ + t\x20have\x20exactly\x20one\x20':'\x20colon,\x20that\x20separates\x20hos\ + t\x20(literal\x20IP\x20address\x20or\n\x20resolvable\x20hostname)\x20and\ + \x20port\n\x20TODO:\x20make\x20it\x20required\x20for\x20initialization,\ + \x20and\x20stop\x20connecting\x20any\x20client\x20straight\x20to\x20squi\ + d?\n\n\r\n\x05\x04\x0e\x02\n\x04\x12\x04\x98\x02\x04\x0c\n\r\n\x05\x04\ + \x0e\x02\n\x05\x12\x04\x98\x02\r\x13\n\r\n\x05\x04\x0e\x02\n\x01\x12\x04\ + \x98\x02\x14\"\n\r\n\x05\x04\x0e\x02\n\x03\x12\x04\x98\x02%'\nR\n\x04\ + \x04\x0e\x02\x0b\x12\x04\x9b\x02\x042\x1aD\x20Used\x20in\x20dark\x20deco\ + ys\x20to\x20signal\x20which\x20dark\x20decoy\x20it\x20will\x20connect\ + \x20to.\n\n\r\n\x05\x04\x0e\x02\x0b\x04\x12\x04\x9b\x02\x04\x0c\n\r\n\ + \x05\x04\x0e\x02\x0b\x05\x12\x04\x9b\x02\r\x13\n\r\n\x05\x04\x0e\x02\x0b\ + \x01\x12\x04\x9b\x02\x14,\n\r\n\x05\x04\x0e\x02\x0b\x03\x12\x04\x9b\x02/\ + 1\nR\n\x04\x04\x0e\x02\x0c\x12\x04\x9e\x02\x04\"\x1aD\x20Used\x20to\x20i\ + ndicate\x20to\x20server\x20if\x20client\x20is\x20registering\x20v4,\x20v\ + 6\x20or\x20both\n\n\r\n\x05\x04\x0e\x02\x0c\x04\x12\x04\x9e\x02\x04\x0c\ + \n\r\n\x05\x04\x0e\x02\x0c\x05\x12\x04\x9e\x02\r\x11\n\r\n\x05\x04\x0e\ + \x02\x0c\x01\x12\x04\x9e\x02\x12\x1c\n\r\n\x05\x04\x0e\x02\x0c\x03\x12\ + \x04\x9e\x02\x1f!\n\x0c\n\x04\x04\x0e\x02\r\x12\x04\x9f\x02\x04\"\n\r\n\ + \x05\x04\x0e\x02\r\x04\x12\x04\x9f\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\r\ + \x05\x12\x04\x9f\x02\r\x11\n\r\n\x05\x04\x0e\x02\r\x01\x12\x04\x9f\x02\ + \x12\x1c\n\r\n\x05\x04\x0e\x02\r\x03\x12\x04\x9f\x02\x1f!\nD\n\x04\x04\ + \x0e\x02\x0e\x12\x04\xa2\x02\x04*\x1a6\x20A\x20collection\x20of\x20optio\ + nal\x20flags\x20for\x20the\x20registration.\n\n\r\n\x05\x04\x0e\x02\x0e\ + \x04\x12\x04\xa2\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\x0e\x06\x12\x04\xa2\ + \x02\r\x1e\n\r\n\x05\x04\x0e\x02\x0e\x01\x12\x04\xa2\x02\x1f$\n\r\n\x05\ + \x04\x0e\x02\x0e\x03\x12\x04\xa2\x02')\nq\n\x04\x04\x0e\x02\x0f\x12\x04\ + \xa6\x02\x04-\x1ac\x20Transport\x20Extensions\n\x20TODO(jmwample)\x20-\ + \x20move\x20to\x20WebRTC\x20specific\x20transport\x20params\x20protobuf\ + \x20message.\n\n\r\n\x05\x04\x0e\x02\x0f\x04\x12\x04\xa6\x02\x04\x0c\n\r\ + \n\x05\x04\x0e\x02\x0f\x06\x12\x04\xa6\x02\r\x19\n\r\n\x05\x04\x0e\x02\ + \x0f\x01\x12\x04\xa6\x02\x1a'\n\r\n\x05\x04\x0e\x02\x0f\x03\x12\x04\xa6\ + \x02*,\nG\n\x04\x04\x0e\x02\x10\x12\x04\xa9\x02\x04!\x1a9\x20Random-size\ + d\x20junk\x20to\x20defeat\x20packet\x20size\x20fingerprinting.\n\n\r\n\ + \x05\x04\x0e\x02\x10\x04\x12\x04\xa9\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\ + \x10\x05\x12\x04\xa9\x02\r\x12\n\r\n\x05\x04\x0e\x02\x10\x01\x12\x04\xa9\ + \x02\x13\x1a\n\r\n\x05\x04\x0e\x02\x10\x03\x12\x04\xa9\x02\x1d\x20\n\x0c\ + \n\x02\x04\x0f\x12\x06\xad\x02\0\xbf\x02\x01\n\x0b\n\x03\x04\x0f\x01\x12\ + \x04\xad\x02\x08\x1d\n!\n\x04\x04\x0f\x02\0\x12\x04\xaf\x02\x04!\x1a\x13\ + \x20Prefix\x20Identifier\n\n\r\n\x05\x04\x0f\x02\0\x04\x12\x04\xaf\x02\ + \x04\x0c\n\r\n\x05\x04\x0f\x02\0\x05\x12\x04\xaf\x02\r\x12\n\r\n\x05\x04\ + \x0f\x02\0\x01\x12\x04\xaf\x02\x13\x1c\n\r\n\x05\x04\x0f\x02\0\x03\x12\ + \x04\xaf\x02\x1f\x20\n\xc4\x01\n\x04\x04\x0f\x02\x01\x12\x04\xb3\x02\x04\ \x1e\x1a\xb5\x01\x20Prefix\x20bytes\x20(optional\x20-\x20usually\x20sent\ \x20from\x20station\x20to\x20client\x20as\x20override\x20if\x20allowed\ \x20by\x20C2S)\n\x20as\x20the\x20station\x20cannot\x20take\x20this\x20in\ to\x20account\x20when\x20attempting\x20to\x20identify\x20a\x20connection\ - .\n\n\r\n\x05\x04\x0e\x02\x01\x04\x12\x04\xab\x02\x04\x0c\n\r\n\x05\x04\ - \x0e\x02\x01\x05\x12\x04\xab\x02\r\x12\n\r\n\x05\x04\x0e\x02\x01\x01\x12\ - \x04\xab\x02\x13\x19\n\r\n\x05\x04\x0e\x02\x01\x03\x12\x04\xab\x02\x1c\ - \x1d\n\x0c\n\x04\x04\x0e\x02\x02\x12\x04\xac\x02\x04+\n\r\n\x05\x04\x0e\ - \x02\x02\x04\x12\x04\xac\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\x02\x05\x12\ - \x04\xac\x02\r\x12\n\r\n\x05\x04\x0e\x02\x02\x01\x12\x04\xac\x02\x13&\n\ - \r\n\x05\x04\x0e\x02\x02\x03\x12\x04\xac\x02)*\n\xed\x02\n\x04\x04\x0e\ - \x02\x03\x12\x04\xb6\x02\x04*\x1a\xbc\x01\x20Indicates\x20whether\x20the\ + .\n\n\r\n\x05\x04\x0f\x02\x01\x04\x12\x04\xb3\x02\x04\x0c\n\r\n\x05\x04\ + \x0f\x02\x01\x05\x12\x04\xb3\x02\r\x12\n\r\n\x05\x04\x0f\x02\x01\x01\x12\ + \x04\xb3\x02\x13\x19\n\r\n\x05\x04\x0f\x02\x01\x03\x12\x04\xb3\x02\x1c\ + \x1d\n\x0c\n\x04\x04\x0f\x02\x02\x12\x04\xb4\x02\x04+\n\r\n\x05\x04\x0f\ + \x02\x02\x04\x12\x04\xb4\x02\x04\x0c\n\r\n\x05\x04\x0f\x02\x02\x05\x12\ + \x04\xb4\x02\r\x12\n\r\n\x05\x04\x0f\x02\x02\x01\x12\x04\xb4\x02\x13&\n\ + \r\n\x05\x04\x0f\x02\x02\x03\x12\x04\xb4\x02)*\n\xed\x02\n\x04\x04\x0f\ + \x02\x03\x12\x04\xbe\x02\x04*\x1a\xbc\x01\x20Indicates\x20whether\x20the\ \x20client\x20has\x20elected\x20to\x20use\x20destination\x20port\x20rand\ omization.\x20Should\x20be\n\x20checked\x20against\x20selected\x20transp\ ort\x20to\x20ensure\x20that\x20destination\x20port\x20randomization\x20i\ s\n\x20supported.\n2\x9f\x01\x20//\x20potential\x20future\x20fields\n\ \x20obfuscator\x20ID\n\x20tagEncoder\x20ID\x20(¶ms?,\x20e.g.\x20form\ at-base64\x20/\x20padding)\n\x20streamEncoder\x20ID\x20(¶ms?,\x20e.g\ - .\x20foramat-base64\x20/\x20padding)\n\n\r\n\x05\x04\x0e\x02\x03\x04\x12\ - \x04\xb6\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\x03\x05\x12\x04\xb6\x02\r\x11\ - \n\r\n\x05\x04\x0e\x02\x03\x01\x12\x04\xb6\x02\x12$\n\r\n\x05\x04\x0e\ - \x02\x03\x03\x12\x04\xb6\x02')\n\x0c\n\x02\x04\x0f\x12\x06\xb9\x02\0\xbe\ - \x02\x01\n\x0b\n\x03\x04\x0f\x01\x12\x04\xb9\x02\x08\x1e\n\xcb\x01\n\x04\ - \x04\x0f\x02\0\x12\x04\xbd\x02\x04*\x1a\xbc\x01\x20Indicates\x20whether\ + .\x20foramat-base64\x20/\x20padding)\n\n\r\n\x05\x04\x0f\x02\x03\x04\x12\ + \x04\xbe\x02\x04\x0c\n\r\n\x05\x04\x0f\x02\x03\x05\x12\x04\xbe\x02\r\x11\ + \n\r\n\x05\x04\x0f\x02\x03\x01\x12\x04\xbe\x02\x12$\n\r\n\x05\x04\x0f\ + \x02\x03\x03\x12\x04\xbe\x02')\n\x0c\n\x02\x04\x10\x12\x06\xc1\x02\0\xc6\ + \x02\x01\n\x0b\n\x03\x04\x10\x01\x12\x04\xc1\x02\x08\x1e\n\xcb\x01\n\x04\ + \x04\x10\x02\0\x12\x04\xc5\x02\x04*\x1a\xbc\x01\x20Indicates\x20whether\ \x20the\x20client\x20has\x20elected\x20to\x20use\x20destination\x20port\ \x20randomization.\x20Should\x20be\n\x20checked\x20against\x20selected\ \x20transport\x20to\x20ensure\x20that\x20destination\x20port\x20randomiz\ - ation\x20is\n\x20supported.\n\n\r\n\x05\x04\x0f\x02\0\x04\x12\x04\xbd\ - \x02\x04\x0c\n\r\n\x05\x04\x0f\x02\0\x05\x12\x04\xbd\x02\r\x11\n\r\n\x05\ - \x04\x0f\x02\0\x01\x12\x04\xbd\x02\x12$\n\r\n\x05\x04\x0f\x02\0\x03\x12\ - \x04\xbd\x02')\n\x0c\n\x02\x05\x06\x12\x06\xc0\x02\0\xc8\x02\x01\n\x0b\n\ - \x03\x05\x06\x01\x12\x04\xc0\x02\x05\x17\n\x0c\n\x04\x05\x06\x02\0\x12\ - \x04\xc1\x02\x02\x12\n\r\n\x05\x05\x06\x02\0\x01\x12\x04\xc1\x02\x02\r\n\ - \r\n\x05\x05\x06\x02\0\x02\x12\x04\xc1\x02\x10\x11\n\x0c\n\x04\x05\x06\ - \x02\x01\x12\x04\xc2\x02\x08\x15\n\r\n\x05\x05\x06\x02\x01\x01\x12\x04\ - \xc2\x02\x08\x10\n\r\n\x05\x05\x06\x02\x01\x02\x12\x04\xc2\x02\x13\x14\n\ - \x0c\n\x04\x05\x06\x02\x02\x12\x04\xc3\x02\x08\x10\n\r\n\x05\x05\x06\x02\ - \x02\x01\x12\x04\xc3\x02\x08\x0b\n\r\n\x05\x05\x06\x02\x02\x02\x12\x04\ - \xc3\x02\x0e\x0f\n\x0c\n\x04\x05\x06\x02\x03\x12\x04\xc4\x02\x02\x16\n\r\ - \n\x05\x05\x06\x02\x03\x01\x12\x04\xc4\x02\x02\x11\n\r\n\x05\x05\x06\x02\ - \x03\x02\x12\x04\xc4\x02\x14\x15\n\x0c\n\x04\x05\x06\x02\x04\x12\x04\xc5\ - \x02\x02\x17\n\r\n\x05\x05\x06\x02\x04\x01\x12\x04\xc5\x02\x02\x12\n\r\n\ - \x05\x05\x06\x02\x04\x02\x12\x04\xc5\x02\x15\x16\n\x0c\n\x04\x05\x06\x02\ - \x05\x12\x04\xc6\x02\x02\n\n\r\n\x05\x05\x06\x02\x05\x01\x12\x04\xc6\x02\ - \x02\x05\n\r\n\x05\x05\x06\x02\x05\x02\x12\x04\xc6\x02\x08\t\n\x0c\n\x04\ - \x05\x06\x02\x06\x12\x04\xc7\x02\x02\x17\n\r\n\x05\x05\x06\x02\x06\x01\ - \x12\x04\xc7\x02\x02\x12\n\r\n\x05\x05\x06\x02\x06\x02\x12\x04\xc7\x02\ - \x15\x16\n\x0c\n\x02\x04\x10\x12\x06\xca\x02\0\xe2\x02\x01\n\x0b\n\x03\ - \x04\x10\x01\x12\x04\xca\x02\x08\x12\n\x0c\n\x04\x04\x10\x02\0\x12\x04\ - \xcb\x02\x02#\n\r\n\x05\x04\x10\x02\0\x04\x12\x04\xcb\x02\x02\n\n\r\n\ - \x05\x04\x10\x02\0\x05\x12\x04\xcb\x02\x0b\x10\n\r\n\x05\x04\x10\x02\0\ - \x01\x12\x04\xcb\x02\x11\x1e\n\r\n\x05\x04\x10\x02\0\x03\x12\x04\xcb\x02\ - !\"\n\x0c\n\x04\x04\x10\x02\x01\x12\x04\xcc\x02\x024\n\r\n\x05\x04\x10\ - \x02\x01\x04\x12\x04\xcc\x02\x02\n\n\r\n\x05\x04\x10\x02\x01\x06\x12\x04\ - \xcc\x02\x0b\x1a\n\r\n\x05\x04\x10\x02\x01\x01\x12\x04\xcc\x02\x1b/\n\r\ - \n\x05\x04\x10\x02\x01\x03\x12\x04\xcc\x0223\n\x0c\n\x04\x04\x10\x02\x02\ - \x12\x04\xcd\x02\x026\n\r\n\x05\x04\x10\x02\x02\x04\x12\x04\xcd\x02\x02\ - \n\n\r\n\x05\x04\x10\x02\x02\x06\x12\x04\xcd\x02\x0b\x1d\n\r\n\x05\x04\ - \x10\x02\x02\x01\x12\x04\xcd\x02\x1e1\n\r\n\x05\x04\x10\x02\x02\x03\x12\ - \x04\xcd\x0245\nC\n\x04\x04\x10\x02\x03\x12\x04\xd0\x02\x02*\x1a5\x20cli\ + ation\x20is\n\x20supported.\n\n\r\n\x05\x04\x10\x02\0\x04\x12\x04\xc5\ + \x02\x04\x0c\n\r\n\x05\x04\x10\x02\0\x05\x12\x04\xc5\x02\r\x11\n\r\n\x05\ + \x04\x10\x02\0\x01\x12\x04\xc5\x02\x12$\n\r\n\x05\x04\x10\x02\0\x03\x12\ + \x04\xc5\x02')\n\x0c\n\x02\x05\x06\x12\x06\xc8\x02\0\xd0\x02\x01\n\x0b\n\ + \x03\x05\x06\x01\x12\x04\xc8\x02\x05\x17\n\x0c\n\x04\x05\x06\x02\0\x12\ + \x04\xc9\x02\x02\x12\n\r\n\x05\x05\x06\x02\0\x01\x12\x04\xc9\x02\x02\r\n\ + \r\n\x05\x05\x06\x02\0\x02\x12\x04\xc9\x02\x10\x11\n\x0c\n\x04\x05\x06\ + \x02\x01\x12\x04\xca\x02\x08\x15\n\r\n\x05\x05\x06\x02\x01\x01\x12\x04\ + \xca\x02\x08\x10\n\r\n\x05\x05\x06\x02\x01\x02\x12\x04\xca\x02\x13\x14\n\ + \x0c\n\x04\x05\x06\x02\x02\x12\x04\xcb\x02\x08\x10\n\r\n\x05\x05\x06\x02\ + \x02\x01\x12\x04\xcb\x02\x08\x0b\n\r\n\x05\x05\x06\x02\x02\x02\x12\x04\ + \xcb\x02\x0e\x0f\n\x0c\n\x04\x05\x06\x02\x03\x12\x04\xcc\x02\x02\x16\n\r\ + \n\x05\x05\x06\x02\x03\x01\x12\x04\xcc\x02\x02\x11\n\r\n\x05\x05\x06\x02\ + \x03\x02\x12\x04\xcc\x02\x14\x15\n\x0c\n\x04\x05\x06\x02\x04\x12\x04\xcd\ + \x02\x02\x17\n\r\n\x05\x05\x06\x02\x04\x01\x12\x04\xcd\x02\x02\x12\n\r\n\ + \x05\x05\x06\x02\x04\x02\x12\x04\xcd\x02\x15\x16\n\x0c\n\x04\x05\x06\x02\ + \x05\x12\x04\xce\x02\x02\n\n\r\n\x05\x05\x06\x02\x05\x01\x12\x04\xce\x02\ + \x02\x05\n\r\n\x05\x05\x06\x02\x05\x02\x12\x04\xce\x02\x08\t\n\x0c\n\x04\ + \x05\x06\x02\x06\x12\x04\xcf\x02\x02\x17\n\r\n\x05\x05\x06\x02\x06\x01\ + \x12\x04\xcf\x02\x02\x12\n\r\n\x05\x05\x06\x02\x06\x02\x12\x04\xcf\x02\ + \x15\x16\n\x0c\n\x02\x04\x11\x12\x06\xd2\x02\0\xec\x02\x01\n\x0b\n\x03\ + \x04\x11\x01\x12\x04\xd2\x02\x08\x12\n\x0c\n\x04\x04\x11\x02\0\x12\x04\ + \xd3\x02\x02#\n\r\n\x05\x04\x11\x02\0\x04\x12\x04\xd3\x02\x02\n\n\r\n\ + \x05\x04\x11\x02\0\x05\x12\x04\xd3\x02\x0b\x10\n\r\n\x05\x04\x11\x02\0\ + \x01\x12\x04\xd3\x02\x11\x1e\n\r\n\x05\x04\x11\x02\0\x03\x12\x04\xd3\x02\ + !\"\n\x0c\n\x04\x04\x11\x02\x01\x12\x04\xd4\x02\x024\n\r\n\x05\x04\x11\ + \x02\x01\x04\x12\x04\xd4\x02\x02\n\n\r\n\x05\x04\x11\x02\x01\x06\x12\x04\ + \xd4\x02\x0b\x1a\n\r\n\x05\x04\x11\x02\x01\x01\x12\x04\xd4\x02\x1b/\n\r\ + \n\x05\x04\x11\x02\x01\x03\x12\x04\xd4\x0223\n\x0c\n\x04\x04\x11\x02\x02\ + \x12\x04\xd5\x02\x026\n\r\n\x05\x04\x11\x02\x02\x04\x12\x04\xd5\x02\x02\ + \n\n\r\n\x05\x04\x11\x02\x02\x06\x12\x04\xd5\x02\x0b\x1d\n\r\n\x05\x04\ + \x11\x02\x02\x01\x12\x04\xd5\x02\x1e1\n\r\n\x05\x04\x11\x02\x02\x03\x12\ + \x04\xd5\x0245\nC\n\x04\x04\x11\x02\x03\x12\x04\xd8\x02\x02*\x1a5\x20cli\ ent\x20source\x20address\x20when\x20receiving\x20a\x20registration\n\n\r\ - \n\x05\x04\x10\x02\x03\x04\x12\x04\xd0\x02\x02\n\n\r\n\x05\x04\x10\x02\ - \x03\x05\x12\x04\xd0\x02\x0b\x10\n\r\n\x05\x04\x10\x02\x03\x01\x12\x04\ - \xd0\x02\x11%\n\r\n\x05\x04\x10\x02\x03\x03\x12\x04\xd0\x02()\nH\n\x04\ - \x04\x10\x02\x04\x12\x04\xd3\x02\x02#\x1a:\x20Decoy\x20address\x20used\ + \n\x05\x04\x11\x02\x03\x04\x12\x04\xd8\x02\x02\n\n\r\n\x05\x04\x11\x02\ + \x03\x05\x12\x04\xd8\x02\x0b\x10\n\r\n\x05\x04\x11\x02\x03\x01\x12\x04\ + \xd8\x02\x11%\n\r\n\x05\x04\x11\x02\x03\x03\x12\x04\xd8\x02()\nH\n\x04\ + \x04\x11\x02\x04\x12\x04\xdb\x02\x02#\x1a:\x20Decoy\x20address\x20used\ \x20when\x20registering\x20over\x20Decoy\x20registrar\n\n\r\n\x05\x04\ - \x10\x02\x04\x04\x12\x04\xd3\x02\x02\n\n\r\n\x05\x04\x10\x02\x04\x05\x12\ - \x04\xd3\x02\x0b\x10\n\r\n\x05\x04\x10\x02\x04\x01\x12\x04\xd3\x02\x11\ - \x1e\n\r\n\x05\x04\x10\x02\x04\x03\x12\x04\xd3\x02!\"\n\xeb\x05\n\x04\ - \x04\x10\x02\x05\x12\x04\xdf\x02\x02:\x1a\xdc\x05\x20The\x20next\x20thre\ + \x11\x02\x04\x04\x12\x04\xdb\x02\x02\n\n\r\n\x05\x04\x11\x02\x04\x05\x12\ + \x04\xdb\x02\x0b\x10\n\r\n\x05\x04\x11\x02\x04\x01\x12\x04\xdb\x02\x11\ + \x1e\n\r\n\x05\x04\x11\x02\x04\x03\x12\x04\xdb\x02!\"\n\xeb\x05\n\x04\ + \x04\x11\x02\x05\x12\x04\xe7\x02\x02:\x1a\xdc\x05\x20The\x20next\x20thre\ e\x20fields\x20allow\x20an\x20independent\x20registrar\x20(trusted\x20by\ \x20a\x20station\x20w/\x20a\x20zmq\x20keypair)\x20to\n\x20share\x20the\ \x20registration\x20overrides\x20that\x20it\x20assigned\x20to\x20the\x20\ @@ -7442,135 +7739,141 @@ static file_descriptor_proto_data: &'static [u8] = b"\ \x20might\n\x20make\x20sense\x20to\x20make\x20the\x20RegistrationRespons\ e\x20that\x20is\x20sent\x20to\x20the\x20client\x20a\x20distinct\x20messa\ ge\x20from\n\x20the\x20one\x20that\x20gets\x20sent\x20to\x20the\x20stati\ - ons.\n\n\r\n\x05\x04\x10\x02\x05\x04\x12\x04\xdf\x02\x02\n\n\r\n\x05\x04\ - \x10\x02\x05\x06\x12\x04\xdf\x02\x0b\x1f\n\r\n\x05\x04\x10\x02\x05\x01\ - \x12\x04\xdf\x02\x205\n\r\n\x05\x04\x10\x02\x05\x03\x12\x04\xdf\x0289\n\ - \x0c\n\x04\x04\x10\x02\x06\x12\x04\xe0\x02\x02\"\n\r\n\x05\x04\x10\x02\ - \x06\x04\x12\x04\xe0\x02\x02\n\n\r\n\x05\x04\x10\x02\x06\x05\x12\x04\xe0\ - \x02\x0b\x10\n\r\n\x05\x04\x10\x02\x06\x01\x12\x04\xe0\x02\x11\x1d\n\r\n\ - \x05\x04\x10\x02\x06\x03\x12\x04\xe0\x02\x20!\n\x0c\n\x04\x04\x10\x02\ - \x07\x12\x04\xe1\x02\x02'\n\r\n\x05\x04\x10\x02\x07\x04\x12\x04\xe1\x02\ - \x02\n\n\r\n\x05\x04\x10\x02\x07\x05\x12\x04\xe1\x02\x0b\x10\n\r\n\x05\ - \x04\x10\x02\x07\x01\x12\x04\xe1\x02\x11!\n\r\n\x05\x04\x10\x02\x07\x03\ - \x12\x04\xe1\x02$&\n\x0c\n\x02\x04\x11\x12\x06\xe4\x02\0\xf0\x02\x01\n\ - \x0b\n\x03\x04\x11\x01\x12\x04\xe4\x02\x08\x14\n9\n\x04\x04\x11\x02\0\ - \x12\x04\xe5\x02\x04.\"+\x20how\x20many\x20decoys\x20were\x20tried\x20be\ - fore\x20success\n\n\r\n\x05\x04\x11\x02\0\x04\x12\x04\xe5\x02\x04\x0c\n\ - \r\n\x05\x04\x11\x02\0\x05\x12\x04\xe5\x02\r\x13\n\r\n\x05\x04\x11\x02\0\ - \x01\x12\x04\xe5\x02\x14(\n\r\n\x05\x04\x11\x02\0\x03\x12\x04\xe5\x02+-\ - \nm\n\x04\x04\x11\x02\x01\x12\x04\xea\x02\x04/\x1a\x1e\x20Applicable\x20\ + ons.\n\n\r\n\x05\x04\x11\x02\x05\x04\x12\x04\xe7\x02\x02\n\n\r\n\x05\x04\ + \x11\x02\x05\x06\x12\x04\xe7\x02\x0b\x1f\n\r\n\x05\x04\x11\x02\x05\x01\ + \x12\x04\xe7\x02\x205\n\r\n\x05\x04\x11\x02\x05\x03\x12\x04\xe7\x0289\n\ + \x0c\n\x04\x04\x11\x02\x06\x12\x04\xe8\x02\x02\"\n\r\n\x05\x04\x11\x02\ + \x06\x04\x12\x04\xe8\x02\x02\n\n\r\n\x05\x04\x11\x02\x06\x05\x12\x04\xe8\ + \x02\x0b\x10\n\r\n\x05\x04\x11\x02\x06\x01\x12\x04\xe8\x02\x11\x1d\n\r\n\ + \x05\x04\x11\x02\x06\x03\x12\x04\xe8\x02\x20!\n\x0c\n\x04\x04\x11\x02\ + \x07\x12\x04\xe9\x02\x02'\n\r\n\x05\x04\x11\x02\x07\x04\x12\x04\xe9\x02\ + \x02\n\n\r\n\x05\x04\x11\x02\x07\x05\x12\x04\xe9\x02\x0b\x10\n\r\n\x05\ + \x04\x11\x02\x07\x01\x12\x04\xe9\x02\x11!\n\r\n\x05\x04\x11\x02\x07\x03\ + \x12\x04\xe9\x02$&\n\x0c\n\x02\x04\x12\x12\x06\xee\x02\0\xfa\x02\x01\n\ + \x0b\n\x03\x04\x12\x01\x12\x04\xee\x02\x08\x14\n9\n\x04\x04\x12\x02\0\ + \x12\x04\xef\x02\x04.\"+\x20how\x20many\x20decoys\x20were\x20tried\x20be\ + fore\x20success\n\n\r\n\x05\x04\x12\x02\0\x04\x12\x04\xef\x02\x04\x0c\n\ + \r\n\x05\x04\x12\x02\0\x05\x12\x04\xef\x02\r\x13\n\r\n\x05\x04\x12\x02\0\ + \x01\x12\x04\xef\x02\x14(\n\r\n\x05\x04\x12\x02\0\x03\x12\x04\xef\x02+-\ + \nm\n\x04\x04\x12\x02\x01\x12\x04\xf4\x02\x04/\x1a\x1e\x20Applicable\x20\ to\x20whole\x20session:\n\"\x1a\x20includes\x20failed\x20attempts\n2#\ - \x20Timings\x20below\x20are\x20in\x20milliseconds\n\n\r\n\x05\x04\x11\ - \x02\x01\x04\x12\x04\xea\x02\x04\x0c\n\r\n\x05\x04\x11\x02\x01\x05\x12\ - \x04\xea\x02\r\x13\n\r\n\x05\x04\x11\x02\x01\x01\x12\x04\xea\x02\x14)\n\ - \r\n\x05\x04\x11\x02\x01\x03\x12\x04\xea\x02,.\nR\n\x04\x04\x11\x02\x02\ - \x12\x04\xed\x02\x04(\x1a\x1f\x20Last\x20(i.e.\x20successful)\x20decoy:\ - \n\"#\x20measured\x20during\x20initial\x20handshake\n\n\r\n\x05\x04\x11\ - \x02\x02\x04\x12\x04\xed\x02\x04\x0c\n\r\n\x05\x04\x11\x02\x02\x05\x12\ - \x04\xed\x02\r\x13\n\r\n\x05\x04\x11\x02\x02\x01\x12\x04\xed\x02\x14\"\n\ - \r\n\x05\x04\x11\x02\x02\x03\x12\x04\xed\x02%'\n%\n\x04\x04\x11\x02\x03\ - \x12\x04\xee\x02\x04&\"\x17\x20includes\x20tcp\x20to\x20decoy\n\n\r\n\ - \x05\x04\x11\x02\x03\x04\x12\x04\xee\x02\x04\x0c\n\r\n\x05\x04\x11\x02\ - \x03\x05\x12\x04\xee\x02\r\x13\n\r\n\x05\x04\x11\x02\x03\x01\x12\x04\xee\ - \x02\x14\x20\n\r\n\x05\x04\x11\x02\x03\x03\x12\x04\xee\x02#%\nB\n\x04\ - \x04\x11\x02\x04\x12\x04\xef\x02\x04&\"4\x20measured\x20when\x20establis\ - hing\x20tcp\x20connection\x20to\x20decot\n\n\r\n\x05\x04\x11\x02\x04\x04\ - \x12\x04\xef\x02\x04\x0c\n\r\n\x05\x04\x11\x02\x04\x05\x12\x04\xef\x02\r\ - \x13\n\r\n\x05\x04\x11\x02\x04\x01\x12\x04\xef\x02\x14\x20\n\r\n\x05\x04\ - \x11\x02\x04\x03\x12\x04\xef\x02#%\n\x0c\n\x02\x05\x07\x12\x06\xf2\x02\0\ - \xf7\x02\x01\n\x0b\n\x03\x05\x07\x01\x12\x04\xf2\x02\x05\x16\n\x0c\n\x04\ - \x05\x07\x02\0\x12\x04\xf3\x02\x04\x10\n\r\n\x05\x05\x07\x02\0\x01\x12\ - \x04\xf3\x02\x04\x0b\n\r\n\x05\x05\x07\x02\0\x02\x12\x04\xf3\x02\x0e\x0f\ - \n\x0c\n\x04\x05\x07\x02\x01\x12\x04\xf4\x02\x04\x0c\n\r\n\x05\x05\x07\ - \x02\x01\x01\x12\x04\xf4\x02\x04\x07\n\r\n\x05\x05\x07\x02\x01\x02\x12\ - \x04\xf4\x02\n\x0b\n\x0c\n\x04\x05\x07\x02\x02\x12\x04\xf5\x02\x04\x0f\n\ - \r\n\x05\x05\x07\x02\x02\x01\x12\x04\xf5\x02\x04\n\n\r\n\x05\x05\x07\x02\ - \x02\x02\x12\x04\xf5\x02\r\x0e\n\x0c\n\x04\x05\x07\x02\x03\x12\x04\xf6\ - \x02\x04\x0e\n\r\n\x05\x05\x07\x02\x03\x01\x12\x04\xf6\x02\x04\t\n\r\n\ - \x05\x05\x07\x02\x03\x02\x12\x04\xf6\x02\x0c\r\n\x0c\n\x02\x05\x08\x12\ - \x06\xf9\x02\0\xfd\x02\x01\n\x0b\n\x03\x05\x08\x01\x12\x04\xf9\x02\x05\ - \x0c\n\x0c\n\x04\x05\x08\x02\0\x12\x04\xfa\x02\x04\x0c\n\r\n\x05\x05\x08\ - \x02\0\x01\x12\x04\xfa\x02\x04\x07\n\r\n\x05\x05\x08\x02\0\x02\x12\x04\ - \xfa\x02\n\x0b\n\x0c\n\x04\x05\x08\x02\x01\x12\x04\xfb\x02\x04\x0c\n\r\n\ - \x05\x05\x08\x02\x01\x01\x12\x04\xfb\x02\x04\x07\n\r\n\x05\x05\x08\x02\ - \x01\x02\x12\x04\xfb\x02\n\x0b\n\x0c\n\x04\x05\x08\x02\x02\x12\x04\xfc\ - \x02\x04\x0c\n\r\n\x05\x05\x08\x02\x02\x01\x12\x04\xfc\x02\x04\x07\n\r\n\ - \x05\x05\x08\x02\x02\x02\x12\x04\xfc\x02\n\x0b\n\x0c\n\x02\x04\x12\x12\ - \x06\xff\x02\0\x8a\x03\x01\n\x0b\n\x03\x04\x12\x01\x12\x04\xff\x02\x08\ - \x19\n\x0c\n\x04\x04\x12\x02\0\x12\x04\x80\x03\x04#\n\r\n\x05\x04\x12\ - \x02\0\x04\x12\x04\x80\x03\x04\x0c\n\r\n\x05\x04\x12\x02\0\x05\x12\x04\ - \x80\x03\r\x13\n\r\n\x05\x04\x12\x02\0\x01\x12\x04\x80\x03\x14\x1e\n\r\n\ - \x05\x04\x12\x02\0\x03\x12\x04\x80\x03!\"\n\x0c\n\x04\x04\x12\x02\x01\ - \x12\x04\x81\x03\x04\"\n\r\n\x05\x04\x12\x02\x01\x04\x12\x04\x81\x03\x04\ - \x0c\n\r\n\x05\x04\x12\x02\x01\x05\x12\x04\x81\x03\r\x13\n\r\n\x05\x04\ - \x12\x02\x01\x01\x12\x04\x81\x03\x14\x1d\n\r\n\x05\x04\x12\x02\x01\x03\ - \x12\x04\x81\x03\x20!\n\x0c\n\x04\x04\x12\x02\x02\x12\x04\x83\x03\x04#\n\ - \r\n\x05\x04\x12\x02\x02\x04\x12\x04\x83\x03\x04\x0c\n\r\n\x05\x04\x12\ - \x02\x02\x05\x12\x04\x83\x03\r\x13\n\r\n\x05\x04\x12\x02\x02\x01\x12\x04\ - \x83\x03\x14\x1e\n\r\n\x05\x04\x12\x02\x02\x03\x12\x04\x83\x03!\"\n\x0c\ - \n\x04\x04\x12\x02\x03\x12\x04\x85\x03\x04-\n\r\n\x05\x04\x12\x02\x03\ - \x04\x12\x04\x85\x03\x04\x0c\n\r\n\x05\x04\x12\x02\x03\x06\x12\x04\x85\ - \x03\r\x1e\n\r\n\x05\x04\x12\x02\x03\x01\x12\x04\x85\x03\x1f(\n\r\n\x05\ - \x04\x12\x02\x03\x03\x12\x04\x85\x03+,\n\x0c\n\x04\x04\x12\x02\x04\x12\ - \x04\x87\x03\x04\"\n\r\n\x05\x04\x12\x02\x04\x04\x12\x04\x87\x03\x04\x0c\ - \n\r\n\x05\x04\x12\x02\x04\x05\x12\x04\x87\x03\r\x13\n\r\n\x05\x04\x12\ - \x02\x04\x01\x12\x04\x87\x03\x14\x1c\n\r\n\x05\x04\x12\x02\x04\x03\x12\ - \x04\x87\x03\x1f!\n\x0c\n\x04\x04\x12\x02\x05\x12\x04\x88\x03\x04\"\n\r\ - \n\x05\x04\x12\x02\x05\x04\x12\x04\x88\x03\x04\x0c\n\r\n\x05\x04\x12\x02\ - \x05\x05\x12\x04\x88\x03\r\x13\n\r\n\x05\x04\x12\x02\x05\x01\x12\x04\x88\ - \x03\x14\x1c\n\r\n\x05\x04\x12\x02\x05\x03\x12\x04\x88\x03\x1f!\n\x0c\n\ - \x04\x04\x12\x02\x06\x12\x04\x89\x03\x04\x20\n\r\n\x05\x04\x12\x02\x06\ - \x04\x12\x04\x89\x03\x04\x0c\n\r\n\x05\x04\x12\x02\x06\x06\x12\x04\x89\ - \x03\r\x14\n\r\n\x05\x04\x12\x02\x06\x01\x12\x04\x89\x03\x15\x1a\n\r\n\ - \x05\x04\x12\x02\x06\x03\x12\x04\x89\x03\x1d\x1f\nT\n\x02\x04\x13\x12\ - \x06\x8d\x03\0\xa1\x03\x01\x1aF\x20Adding\x20message\x20response\x20from\ + \x20Timings\x20below\x20are\x20in\x20milliseconds\n\n\r\n\x05\x04\x12\ + \x02\x01\x04\x12\x04\xf4\x02\x04\x0c\n\r\n\x05\x04\x12\x02\x01\x05\x12\ + \x04\xf4\x02\r\x13\n\r\n\x05\x04\x12\x02\x01\x01\x12\x04\xf4\x02\x14)\n\ + \r\n\x05\x04\x12\x02\x01\x03\x12\x04\xf4\x02,.\nR\n\x04\x04\x12\x02\x02\ + \x12\x04\xf7\x02\x04(\x1a\x1f\x20Last\x20(i.e.\x20successful)\x20decoy:\ + \n\"#\x20measured\x20during\x20initial\x20handshake\n\n\r\n\x05\x04\x12\ + \x02\x02\x04\x12\x04\xf7\x02\x04\x0c\n\r\n\x05\x04\x12\x02\x02\x05\x12\ + \x04\xf7\x02\r\x13\n\r\n\x05\x04\x12\x02\x02\x01\x12\x04\xf7\x02\x14\"\n\ + \r\n\x05\x04\x12\x02\x02\x03\x12\x04\xf7\x02%'\n%\n\x04\x04\x12\x02\x03\ + \x12\x04\xf8\x02\x04&\"\x17\x20includes\x20tcp\x20to\x20decoy\n\n\r\n\ + \x05\x04\x12\x02\x03\x04\x12\x04\xf8\x02\x04\x0c\n\r\n\x05\x04\x12\x02\ + \x03\x05\x12\x04\xf8\x02\r\x13\n\r\n\x05\x04\x12\x02\x03\x01\x12\x04\xf8\ + \x02\x14\x20\n\r\n\x05\x04\x12\x02\x03\x03\x12\x04\xf8\x02#%\nB\n\x04\ + \x04\x12\x02\x04\x12\x04\xf9\x02\x04&\"4\x20measured\x20when\x20establis\ + hing\x20tcp\x20connection\x20to\x20decot\n\n\r\n\x05\x04\x12\x02\x04\x04\ + \x12\x04\xf9\x02\x04\x0c\n\r\n\x05\x04\x12\x02\x04\x05\x12\x04\xf9\x02\r\ + \x13\n\r\n\x05\x04\x12\x02\x04\x01\x12\x04\xf9\x02\x14\x20\n\r\n\x05\x04\ + \x12\x02\x04\x03\x12\x04\xf9\x02#%\n\x0c\n\x02\x05\x07\x12\x06\xfc\x02\0\ + \x81\x03\x01\n\x0b\n\x03\x05\x07\x01\x12\x04\xfc\x02\x05\x16\n\x0c\n\x04\ + \x05\x07\x02\0\x12\x04\xfd\x02\x04\x10\n\r\n\x05\x05\x07\x02\0\x01\x12\ + \x04\xfd\x02\x04\x0b\n\r\n\x05\x05\x07\x02\0\x02\x12\x04\xfd\x02\x0e\x0f\ + \n\x0c\n\x04\x05\x07\x02\x01\x12\x04\xfe\x02\x04\x0c\n\r\n\x05\x05\x07\ + \x02\x01\x01\x12\x04\xfe\x02\x04\x07\n\r\n\x05\x05\x07\x02\x01\x02\x12\ + \x04\xfe\x02\n\x0b\n\x0c\n\x04\x05\x07\x02\x02\x12\x04\xff\x02\x04\x0f\n\ + \r\n\x05\x05\x07\x02\x02\x01\x12\x04\xff\x02\x04\n\n\r\n\x05\x05\x07\x02\ + \x02\x02\x12\x04\xff\x02\r\x0e\n\x0c\n\x04\x05\x07\x02\x03\x12\x04\x80\ + \x03\x04\x0e\n\r\n\x05\x05\x07\x02\x03\x01\x12\x04\x80\x03\x04\t\n\r\n\ + \x05\x05\x07\x02\x03\x02\x12\x04\x80\x03\x0c\r\n\x0c\n\x02\x05\x08\x12\ + \x06\x83\x03\0\x87\x03\x01\n\x0b\n\x03\x05\x08\x01\x12\x04\x83\x03\x05\ + \x0c\n\x0c\n\x04\x05\x08\x02\0\x12\x04\x84\x03\x04\x0c\n\r\n\x05\x05\x08\ + \x02\0\x01\x12\x04\x84\x03\x04\x07\n\r\n\x05\x05\x08\x02\0\x02\x12\x04\ + \x84\x03\n\x0b\n\x0c\n\x04\x05\x08\x02\x01\x12\x04\x85\x03\x04\x0c\n\r\n\ + \x05\x05\x08\x02\x01\x01\x12\x04\x85\x03\x04\x07\n\r\n\x05\x05\x08\x02\ + \x01\x02\x12\x04\x85\x03\n\x0b\n\x0c\n\x04\x05\x08\x02\x02\x12\x04\x86\ + \x03\x04\x0c\n\r\n\x05\x05\x08\x02\x02\x01\x12\x04\x86\x03\x04\x07\n\r\n\ + \x05\x05\x08\x02\x02\x02\x12\x04\x86\x03\n\x0b\n\x0c\n\x02\x04\x13\x12\ + \x06\x89\x03\0\x94\x03\x01\n\x0b\n\x03\x04\x13\x01\x12\x04\x89\x03\x08\ + \x19\n\x0c\n\x04\x04\x13\x02\0\x12\x04\x8a\x03\x04#\n\r\n\x05\x04\x13\ + \x02\0\x04\x12\x04\x8a\x03\x04\x0c\n\r\n\x05\x04\x13\x02\0\x05\x12\x04\ + \x8a\x03\r\x13\n\r\n\x05\x04\x13\x02\0\x01\x12\x04\x8a\x03\x14\x1e\n\r\n\ + \x05\x04\x13\x02\0\x03\x12\x04\x8a\x03!\"\n\x0c\n\x04\x04\x13\x02\x01\ + \x12\x04\x8b\x03\x04\"\n\r\n\x05\x04\x13\x02\x01\x04\x12\x04\x8b\x03\x04\ + \x0c\n\r\n\x05\x04\x13\x02\x01\x05\x12\x04\x8b\x03\r\x13\n\r\n\x05\x04\ + \x13\x02\x01\x01\x12\x04\x8b\x03\x14\x1d\n\r\n\x05\x04\x13\x02\x01\x03\ + \x12\x04\x8b\x03\x20!\n\x0c\n\x04\x04\x13\x02\x02\x12\x04\x8d\x03\x04#\n\ + \r\n\x05\x04\x13\x02\x02\x04\x12\x04\x8d\x03\x04\x0c\n\r\n\x05\x04\x13\ + \x02\x02\x05\x12\x04\x8d\x03\r\x13\n\r\n\x05\x04\x13\x02\x02\x01\x12\x04\ + \x8d\x03\x14\x1e\n\r\n\x05\x04\x13\x02\x02\x03\x12\x04\x8d\x03!\"\n\x0c\ + \n\x04\x04\x13\x02\x03\x12\x04\x8f\x03\x04-\n\r\n\x05\x04\x13\x02\x03\ + \x04\x12\x04\x8f\x03\x04\x0c\n\r\n\x05\x04\x13\x02\x03\x06\x12\x04\x8f\ + \x03\r\x1e\n\r\n\x05\x04\x13\x02\x03\x01\x12\x04\x8f\x03\x1f(\n\r\n\x05\ + \x04\x13\x02\x03\x03\x12\x04\x8f\x03+,\n\x0c\n\x04\x04\x13\x02\x04\x12\ + \x04\x91\x03\x04\"\n\r\n\x05\x04\x13\x02\x04\x04\x12\x04\x91\x03\x04\x0c\ + \n\r\n\x05\x04\x13\x02\x04\x05\x12\x04\x91\x03\r\x13\n\r\n\x05\x04\x13\ + \x02\x04\x01\x12\x04\x91\x03\x14\x1c\n\r\n\x05\x04\x13\x02\x04\x03\x12\ + \x04\x91\x03\x1f!\n\x0c\n\x04\x04\x13\x02\x05\x12\x04\x92\x03\x04\"\n\r\ + \n\x05\x04\x13\x02\x05\x04\x12\x04\x92\x03\x04\x0c\n\r\n\x05\x04\x13\x02\ + \x05\x05\x12\x04\x92\x03\r\x13\n\r\n\x05\x04\x13\x02\x05\x01\x12\x04\x92\ + \x03\x14\x1c\n\r\n\x05\x04\x13\x02\x05\x03\x12\x04\x92\x03\x1f!\n\x0c\n\ + \x04\x04\x13\x02\x06\x12\x04\x93\x03\x04\x20\n\r\n\x05\x04\x13\x02\x06\ + \x04\x12\x04\x93\x03\x04\x0c\n\r\n\x05\x04\x13\x02\x06\x06\x12\x04\x93\ + \x03\r\x14\n\r\n\x05\x04\x13\x02\x06\x01\x12\x04\x93\x03\x15\x1a\n\r\n\ + \x05\x04\x13\x02\x06\x03\x12\x04\x93\x03\x1d\x1f\nT\n\x02\x04\x14\x12\ + \x06\x97\x03\0\xaf\x03\x01\x1aF\x20Adding\x20message\x20response\x20from\ \x20Station\x20to\x20Client\x20for\x20bidirectional\x20API\n\n\x0b\n\x03\ - \x04\x13\x01\x12\x04\x8d\x03\x08\x1c\n\x0c\n\x04\x04\x13\x02\0\x12\x04\ - \x8e\x03\x02\x20\n\r\n\x05\x04\x13\x02\0\x04\x12\x04\x8e\x03\x02\n\n\r\n\ - \x05\x04\x13\x02\0\x05\x12\x04\x8e\x03\x0b\x12\n\r\n\x05\x04\x13\x02\0\ - \x01\x12\x04\x8e\x03\x13\x1b\n\r\n\x05\x04\x13\x02\0\x03\x12\x04\x8e\x03\ - \x1e\x1f\n?\n\x04\x04\x13\x02\x01\x12\x04\x90\x03\x02\x1e\x1a1\x20The\ + \x04\x14\x01\x12\x04\x97\x03\x08\x1c\n\x0c\n\x04\x04\x14\x02\0\x12\x04\ + \x98\x03\x02\x20\n\r\n\x05\x04\x14\x02\0\x04\x12\x04\x98\x03\x02\n\n\r\n\ + \x05\x04\x14\x02\0\x05\x12\x04\x98\x03\x0b\x12\n\r\n\x05\x04\x14\x02\0\ + \x01\x12\x04\x98\x03\x13\x1b\n\r\n\x05\x04\x14\x02\0\x03\x12\x04\x98\x03\ + \x1e\x1f\n?\n\x04\x04\x14\x02\x01\x12\x04\x9a\x03\x02\x1e\x1a1\x20The\ \x20128-bit\x20ipv6\x20address,\x20in\x20network\x20byte\x20order\n\n\r\ - \n\x05\x04\x13\x02\x01\x04\x12\x04\x90\x03\x02\n\n\r\n\x05\x04\x13\x02\ - \x01\x05\x12\x04\x90\x03\x0b\x10\n\r\n\x05\x04\x13\x02\x01\x01\x12\x04\ - \x90\x03\x11\x19\n\r\n\x05\x04\x13\x02\x01\x03\x12\x04\x90\x03\x1c\x1d\n\ - ,\n\x04\x04\x13\x02\x02\x12\x04\x93\x03\x02\x1f\x1a\x1e\x20Respond\x20wi\ - th\x20randomized\x20port\n\n\r\n\x05\x04\x13\x02\x02\x04\x12\x04\x93\x03\ - \x02\n\n\r\n\x05\x04\x13\x02\x02\x05\x12\x04\x93\x03\x0b\x11\n\r\n\x05\ - \x04\x13\x02\x02\x01\x12\x04\x93\x03\x12\x1a\n\r\n\x05\x04\x13\x02\x02\ - \x03\x12\x04\x93\x03\x1d\x1e\nd\n\x04\x04\x13\x02\x03\x12\x04\x97\x03\ + \n\x05\x04\x14\x02\x01\x04\x12\x04\x9a\x03\x02\n\n\r\n\x05\x04\x14\x02\ + \x01\x05\x12\x04\x9a\x03\x0b\x10\n\r\n\x05\x04\x14\x02\x01\x01\x12\x04\ + \x9a\x03\x11\x19\n\r\n\x05\x04\x14\x02\x01\x03\x12\x04\x9a\x03\x1c\x1d\n\ + ,\n\x04\x04\x14\x02\x02\x12\x04\x9d\x03\x02\x1f\x1a\x1e\x20Respond\x20wi\ + th\x20randomized\x20port\n\n\r\n\x05\x04\x14\x02\x02\x04\x12\x04\x9d\x03\ + \x02\n\n\r\n\x05\x04\x14\x02\x02\x05\x12\x04\x9d\x03\x0b\x11\n\r\n\x05\ + \x04\x14\x02\x02\x01\x12\x04\x9d\x03\x12\x1a\n\r\n\x05\x04\x14\x02\x02\ + \x03\x12\x04\x9d\x03\x1d\x1e\nd\n\x04\x04\x14\x02\x03\x12\x04\xa1\x03\ \x02\"\x1aV\x20Future:\x20station\x20provides\x20client\x20with\x20secre\ t,\x20want\x20chanel\x20present\n\x20Leave\x20null\x20for\x20now\n\n\r\n\ - \x05\x04\x13\x02\x03\x04\x12\x04\x97\x03\x02\n\n\r\n\x05\x04\x13\x02\x03\ - \x05\x12\x04\x97\x03\x0b\x10\n\r\n\x05\x04\x13\x02\x03\x01\x12\x04\x97\ - \x03\x11\x1d\n\r\n\x05\x04\x13\x02\x03\x03\x12\x04\x97\x03\x20!\nA\n\x04\ - \x04\x13\x02\x04\x12\x04\x9a\x03\x02\x1c\x1a3\x20If\x20registration\x20w\ - rong,\x20populate\x20this\x20error\x20string\n\n\r\n\x05\x04\x13\x02\x04\ - \x04\x12\x04\x9a\x03\x02\n\n\r\n\x05\x04\x13\x02\x04\x05\x12\x04\x9a\x03\ - \x0b\x11\n\r\n\x05\x04\x13\x02\x04\x01\x12\x04\x9a\x03\x12\x17\n\r\n\x05\ - \x04\x13\x02\x04\x03\x12\x04\x9a\x03\x1a\x1b\n+\n\x04\x04\x13\x02\x05\ - \x12\x04\x9d\x03\x02%\x1a\x1d\x20ClientConf\x20field\x20(optional)\n\n\r\ - \n\x05\x04\x13\x02\x05\x04\x12\x04\x9d\x03\x02\n\n\r\n\x05\x04\x13\x02\ - \x05\x06\x12\x04\x9d\x03\x0b\x15\n\r\n\x05\x04\x13\x02\x05\x01\x12\x04\ - \x9d\x03\x16\x20\n\r\n\x05\x04\x13\x02\x05\x03\x12\x04\x9d\x03#$\nJ\n\ - \x04\x04\x13\x02\x06\x12\x04\xa0\x03\x025\x1a<\x20Transport\x20Params\ + \x05\x04\x14\x02\x03\x04\x12\x04\xa1\x03\x02\n\n\r\n\x05\x04\x14\x02\x03\ + \x05\x12\x04\xa1\x03\x0b\x10\n\r\n\x05\x04\x14\x02\x03\x01\x12\x04\xa1\ + \x03\x11\x1d\n\r\n\x05\x04\x14\x02\x03\x03\x12\x04\xa1\x03\x20!\nA\n\x04\ + \x04\x14\x02\x04\x12\x04\xa4\x03\x02\x1c\x1a3\x20If\x20registration\x20w\ + rong,\x20populate\x20this\x20error\x20string\n\n\r\n\x05\x04\x14\x02\x04\ + \x04\x12\x04\xa4\x03\x02\n\n\r\n\x05\x04\x14\x02\x04\x05\x12\x04\xa4\x03\ + \x0b\x11\n\r\n\x05\x04\x14\x02\x04\x01\x12\x04\xa4\x03\x12\x17\n\r\n\x05\ + \x04\x14\x02\x04\x03\x12\x04\xa4\x03\x1a\x1b\n+\n\x04\x04\x14\x02\x05\ + \x12\x04\xa7\x03\x02%\x1a\x1d\x20ClientConf\x20field\x20(optional)\n\n\r\ + \n\x05\x04\x14\x02\x05\x04\x12\x04\xa7\x03\x02\n\n\r\n\x05\x04\x14\x02\ + \x05\x06\x12\x04\xa7\x03\x0b\x15\n\r\n\x05\x04\x14\x02\x05\x01\x12\x04\ + \xa7\x03\x16\x20\n\r\n\x05\x04\x14\x02\x05\x03\x12\x04\xa7\x03#$\nJ\n\ + \x04\x04\x14\x02\x06\x12\x04\xaa\x03\x025\x1a<\x20Transport\x20Params\ \x20to\x20if\x20`allow_registrar_overrides`\x20is\x20set.\n\n\r\n\x05\ - \x04\x13\x02\x06\x04\x12\x04\xa0\x03\x02\n\n\r\n\x05\x04\x13\x02\x06\x06\ - \x12\x04\xa0\x03\x0b\x1e\n\r\n\x05\x04\x13\x02\x06\x01\x12\x04\xa0\x03\ - \x1f/\n\r\n\x05\x04\x13\x02\x06\x03\x12\x04\xa0\x0324\n!\n\x02\x04\x14\ - \x12\x06\xa4\x03\0\xa8\x03\x01\x1a\x13\x20response\x20from\x20dns\n\n\ - \x0b\n\x03\x04\x14\x01\x12\x04\xa4\x03\x08\x13\n\x0c\n\x04\x04\x14\x02\0\ - \x12\x04\xa5\x03\x04\x1e\n\r\n\x05\x04\x14\x02\0\x04\x12\x04\xa5\x03\x04\ - \x0c\n\r\n\x05\x04\x14\x02\0\x05\x12\x04\xa5\x03\r\x11\n\r\n\x05\x04\x14\ - \x02\0\x01\x12\x04\xa5\x03\x12\x19\n\r\n\x05\x04\x14\x02\0\x03\x12\x04\ - \xa5\x03\x1c\x1d\n\x0c\n\x04\x04\x14\x02\x01\x12\x04\xa6\x03\x04*\n\r\n\ - \x05\x04\x14\x02\x01\x04\x12\x04\xa6\x03\x04\x0c\n\r\n\x05\x04\x14\x02\ - \x01\x05\x12\x04\xa6\x03\r\x11\n\r\n\x05\x04\x14\x02\x01\x01\x12\x04\xa6\ - \x03\x12%\n\r\n\x05\x04\x14\x02\x01\x03\x12\x04\xa6\x03()\n\x0c\n\x04\ - \x04\x14\x02\x02\x12\x04\xa7\x03\x04=\n\r\n\x05\x04\x14\x02\x02\x04\x12\ - \x04\xa7\x03\x04\x0c\n\r\n\x05\x04\x14\x02\x02\x06\x12\x04\xa7\x03\r!\n\ - \r\n\x05\x04\x14\x02\x02\x01\x12\x04\xa7\x03\"8\n\r\n\x05\x04\x14\x02\ - \x02\x03\x12\x04\xa7\x03;<\ + \x04\x14\x02\x06\x04\x12\x04\xaa\x03\x02\n\n\r\n\x05\x04\x14\x02\x06\x06\ + \x12\x04\xaa\x03\x0b\x1e\n\r\n\x05\x04\x14\x02\x06\x01\x12\x04\xaa\x03\ + \x1f/\n\r\n\x05\x04\x14\x02\x06\x03\x12\x04\xaa\x0324\n\x9c\x01\n\x04\ + \x04\x14\x02\x07\x12\x04\xae\x03\x020\x1a\x8d\x01\x20PhantomsSupportPort\ + Rand\x20is\x20a\x20flag\x20that\x20indicates\x20whether\x20the\x20select\ + ed\x20phantoms\x20are\x20able\x20to\n\x20handle\x20phantom\x20connection\ + s\x20to\x20randomized\x20ports.\n\n\r\n\x05\x04\x14\x02\x07\x04\x12\x04\ + \xae\x03\x02\n\n\r\n\x05\x04\x14\x02\x07\x05\x12\x04\xae\x03\x0b\x0f\n\r\ + \n\x05\x04\x14\x02\x07\x01\x12\x04\xae\x03\x10*\n\r\n\x05\x04\x14\x02\ + \x07\x03\x12\x04\xae\x03-/\n!\n\x02\x04\x15\x12\x06\xb2\x03\0\xb6\x03\ + \x01\x1a\x13\x20response\x20from\x20dns\n\n\x0b\n\x03\x04\x15\x01\x12\ + \x04\xb2\x03\x08\x13\n\x0c\n\x04\x04\x15\x02\0\x12\x04\xb3\x03\x04\x1e\n\ + \r\n\x05\x04\x15\x02\0\x04\x12\x04\xb3\x03\x04\x0c\n\r\n\x05\x04\x15\x02\ + \0\x05\x12\x04\xb3\x03\r\x11\n\r\n\x05\x04\x15\x02\0\x01\x12\x04\xb3\x03\ + \x12\x19\n\r\n\x05\x04\x15\x02\0\x03\x12\x04\xb3\x03\x1c\x1d\n\x0c\n\x04\ + \x04\x15\x02\x01\x12\x04\xb4\x03\x04*\n\r\n\x05\x04\x15\x02\x01\x04\x12\ + \x04\xb4\x03\x04\x0c\n\r\n\x05\x04\x15\x02\x01\x05\x12\x04\xb4\x03\r\x11\ + \n\r\n\x05\x04\x15\x02\x01\x01\x12\x04\xb4\x03\x12%\n\r\n\x05\x04\x15\ + \x02\x01\x03\x12\x04\xb4\x03()\n\x0c\n\x04\x04\x15\x02\x02\x12\x04\xb5\ + \x03\x04=\n\r\n\x05\x04\x15\x02\x02\x04\x12\x04\xb5\x03\x04\x0c\n\r\n\ + \x05\x04\x15\x02\x02\x06\x12\x04\xb5\x03\r!\n\r\n\x05\x04\x15\x02\x02\ + \x01\x12\x04\xb5\x03\"8\n\r\n\x05\x04\x15\x02\x02\x03\x12\x04\xb5\x03;<\ "; /// `FileDescriptorProto` object which was a source for this generated file @@ -7589,7 +7892,7 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor { let generated_file_descriptor = generated_file_descriptor_lazy.get(|| { let mut deps = ::std::vec::Vec::with_capacity(1); deps.push(::protobuf::well_known_types::any::file_descriptor().clone()); - let mut messages = ::std::vec::Vec::with_capacity(21); + let mut messages = ::std::vec::Vec::with_capacity(22); messages.push(PubKey::generated_message_descriptor_data()); messages.push(TLSDecoySpec::generated_message_descriptor_data()); messages.push(ClientConf::generated_message_descriptor_data()); @@ -7600,6 +7903,7 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor { messages.push(WebRTCICECandidate::generated_message_descriptor_data()); messages.push(WebRTCSDP::generated_message_descriptor_data()); messages.push(WebRTCSignal::generated_message_descriptor_data()); + messages.push(Addr::generated_message_descriptor_data()); messages.push(DTLSTransportParams::generated_message_descriptor_data()); messages.push(StationToClient::generated_message_descriptor_data()); messages.push(RegistrationFlags::generated_message_descriptor_data()); From 2372bc7d75edf8752ec3655e968239c88c70aeb0 Mon Sep 17 00:00:00 2001 From: jmwample Date: Fri, 6 Oct 2023 13:41:56 -0600 Subject: [PATCH 06/10] overrides fix for prefix transport - now respects port randomization --- .../overrides/prefix_transport_test.go | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/pkg/regserver/overrides/prefix_transport_test.go b/pkg/regserver/overrides/prefix_transport_test.go index 4979cc57..79625aff 100644 --- a/pkg/regserver/overrides/prefix_transport_test.go +++ b/pkg/regserver/overrides/prefix_transport_test.go @@ -182,13 +182,16 @@ func TestPrefixOverride_Override(t *testing.T) { t.Run("select prefix with port override disabled", test) // Phantom supports random port, but user disabled it - use default port from prefix + conf = strings.NewReader("100 1 0x22 22 SSH") + po, err = ParsePrefixes(conf) + require.Nil(t, err) c.RegistrationResponse = &pb.RegistrationResponse{ PhantomsSupportPortRand: proto.Bool(true), } paramsPref, _ = anypb.New(&pb.PrefixTransportParams{RandomizeDstPort: proto.Bool(false)}) c.RegistrationPayload.TransportParams = paramsPref - out = expected{false, nil, 1024, []byte("ABC")} - t.Run("select prefix with port override disabled", test) + out = expected{false, nil, 22, []byte("SSH")} + t.Run("select prefix with user disabled port randomization", test) // Phantom supports random port, and user enables it - use port set in the registration response c.RegistrationResponse = &pb.RegistrationResponse{ @@ -197,18 +200,28 @@ func TestPrefixOverride_Override(t *testing.T) { } paramsPref, _ = anypb.New(&pb.PrefixTransportParams{RandomizeDstPort: proto.Bool(true)}) c.RegistrationPayload.TransportParams = paramsPref - out = expected{false, nil, 12345, []byte("ABC")} - t.Run("select prefix with port override disabled", test) + out = expected{false, nil, 12345, []byte("SSH")} + t.Run("select prefix with randomization already applied", test) // Phantom does not support random port, user enables it - use port set in the registration response c.RegistrationResponse = &pb.RegistrationResponse{ - PhantomsSupportPortRand: proto.Bool(true), + PhantomsSupportPortRand: proto.Bool(false), DstPort: proto.Uint32(12345), } paramsPref, _ = anypb.New(&pb.PrefixTransportParams{RandomizeDstPort: proto.Bool(true)}) c.RegistrationPayload.TransportParams = paramsPref - out = expected{false, nil, 12345, []byte("ABC")} - t.Run("select prefix with port override disabled", test) + out = expected{false, nil, 443, []byte("SSH")} + t.Run("select prefix with where random has been applied, but phantom doesnt support", test) + + // Phantom does not support random port, user enables it - use port set in the registration response + c.RegistrationResponse = &pb.RegistrationResponse{ + PhantomsSupportPortRand: proto.Bool(false), + DstPort: proto.Uint32(12345), + } + paramsPref, _ = anypb.New(&pb.PrefixTransportParams{RandomizeDstPort: proto.Bool(false)}) + c.RegistrationPayload.TransportParams = paramsPref + out = expected{false, nil, 443, []byte("SSH")} + t.Run("select prefix with where random has been incorrectly applied, but phantom doesnt support", test) } func d(s string) []byte { From 674e2eea791eba466e630b5a6bf499868115e466 Mon Sep 17 00:00:00 2001 From: Mingye Chen Date: Fri, 6 Oct 2023 07:49:12 -0400 Subject: [PATCH 07/10] Fix lint --- go.mod | 1 - go.sum | 3 --- pkg/regserver/overrides/prefix_transport.go | 2 +- proto/signalling.pb.go | 16 ++++++++-------- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index b4fe4358..f12d63e3 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,6 @@ require ( github.com/BurntSushi/toml v1.3.2 github.com/flynn/noise v1.0.0 github.com/go-redis/redis/v8 v8.11.5 - github.com/golang/protobuf v1.5.3 github.com/google/gopacket v1.1.19 github.com/gorilla/mux v1.8.0 github.com/hashicorp/golang-lru v1.0.2 diff --git a/go.sum b/go.sum index 5cee2965..52b7d217 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,6 @@ github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67d github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= @@ -152,7 +150,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/regserver/overrides/prefix_transport.go b/pkg/regserver/overrides/prefix_transport.go index df8df0f3..8f99ec90 100644 --- a/pkg/regserver/overrides/prefix_transport.go +++ b/pkg/regserver/overrides/prefix_transport.go @@ -17,11 +17,11 @@ import ( "strconv" "strings" - "github.com/golang/protobuf/proto" "github.com/refraction-networking/conjure/pkg/core/interfaces" "github.com/refraction-networking/conjure/pkg/transports" "github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix" pb "github.com/refraction-networking/conjure/proto" + "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/anypb" ) diff --git a/proto/signalling.pb.go b/proto/signalling.pb.go index a1ca1812..95441d05 100644 --- a/proto/signalling.pb.go +++ b/proto/signalling.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.12.4 +// protoc-gen-go v1.30.0 +// protoc v4.24.2 // source: signalling.proto // TODO: We're using proto2 because it's the default on Ubuntu 16.04. @@ -11,9 +11,9 @@ package proto import ( - any "github.com/golang/protobuf/ptypes/any" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" reflect "reflect" sync "sync" ) @@ -1654,7 +1654,7 @@ type ClientToStation struct { Stats *SessionStats `protobuf:"bytes,11,opt,name=stats" json:"stats,omitempty"` // NullTransport, MinTransport, Obfs4Transport, etc. Transport type we want from phantom proxy Transport *TransportType `protobuf:"varint,12,opt,name=transport,enum=proto.TransportType" json:"transport,omitempty"` - TransportParams *any.Any `protobuf:"bytes,13,opt,name=transport_params,json=transportParams" json:"transport_params,omitempty"` + TransportParams *anypb.Any `protobuf:"bytes,13,opt,name=transport_params,json=transportParams" json:"transport_params,omitempty"` // Station is only required to check this variable during session initialization. // If set, station must facilitate connection to said target by itself, i.e. write into squid // socket an HTTP/SOCKS/any other connection request. @@ -1771,7 +1771,7 @@ func (x *ClientToStation) GetTransport() TransportType { return TransportType_Null } -func (x *ClientToStation) GetTransportParams() *any.Any { +func (x *ClientToStation) GetTransportParams() *anypb.Any { if x != nil { return x.TransportParams } @@ -2264,7 +2264,7 @@ type RegistrationResponse struct { // ClientConf field (optional) ClientConf *ClientConf `protobuf:"bytes,6,opt,name=clientConf" json:"clientConf,omitempty"` // Transport Params to if `allow_registrar_overrides` is set. - TransportParams *any.Any `protobuf:"bytes,10,opt,name=transport_params,json=transportParams" json:"transport_params,omitempty"` + TransportParams *anypb.Any `protobuf:"bytes,10,opt,name=transport_params,json=transportParams" json:"transport_params,omitempty"` // PhantomsSupportPortRand is a flag that indicates whether the selected phantoms are able to // handle phantom connections to randomized ports. PhantomsSupportPortRand *bool `protobuf:"varint,11,opt,name=phantoms_support_port_rand,json=phantomsSupportPortRand" json:"phantoms_support_port_rand,omitempty"` @@ -2344,7 +2344,7 @@ func (x *RegistrationResponse) GetClientConf() *ClientConf { return nil } -func (x *RegistrationResponse) GetTransportParams() *any.Any { +func (x *RegistrationResponse) GetTransportParams() *anypb.Any { if x != nil { return x.TransportParams } @@ -2828,7 +2828,7 @@ var file_signalling_proto_goTypes = []interface{}{ (*StationToDetector)(nil), // 28: proto.StationToDetector (*RegistrationResponse)(nil), // 29: proto.RegistrationResponse (*DnsResponse)(nil), // 30: proto.DnsResponse - (*any.Any)(nil), // 31: google.protobuf.Any + (*anypb.Any)(nil), // 31: google.protobuf.Any } var file_signalling_proto_depIdxs = []int32{ 0, // 0: proto.PubKey.type:type_name -> proto.KeyType From 4703d998409d260294f070006d8d9678a31bb9cc Mon Sep 17 00:00:00 2001 From: jmwample Date: Fri, 6 Oct 2023 15:18:22 -0600 Subject: [PATCH 08/10] fix other prefix overrides --- pkg/regserver/overrides/prefix_transport.go | 26 ++++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/pkg/regserver/overrides/prefix_transport.go b/pkg/regserver/overrides/prefix_transport.go index 8f99ec90..81f411d7 100644 --- a/pkg/regserver/overrides/prefix_transport.go +++ b/pkg/regserver/overrides/prefix_transport.go @@ -270,9 +270,16 @@ func (rpo *RandPrefixOverride) Override(reg *pb.C2SWrapper, randReader io.Reader } port := newPrefix.DstPort(reg.GetSharedSecret()) - if port > 0 { - p := uint32(port) - reg.RegistrationResponse.DstPort = &p + if reg.GetRegistrationResponse().GetPhantomsSupportPortRand() { + if !params.GetRandomizeDstPort() || reg.GetRegistrationResponse().GetDstPort() == 0 { + if port > 0 { + reg.RegistrationResponse.DstPort = proto.Uint32(uint32(port)) + } + } + } else { + if reg.GetRegistrationResponse().GetDstPort() != 443 { + reg.RegistrationResponse.DstPort = proto.Uint32(443) + } } anypbParams, err := anypb.New(params) @@ -326,9 +333,16 @@ func (fpo *FixedPrefixOverride) Override(reg *pb.C2SWrapper, randReader io.Reade } port := fpo.p.DstPort(reg.GetSharedSecret()) - if port > 0 { - p := uint32(port) - reg.RegistrationResponse.DstPort = &p + if reg.GetRegistrationResponse().GetPhantomsSupportPortRand() { + if !params.GetRandomizeDstPort() || reg.GetRegistrationResponse().GetDstPort() == 0 { + if port > 0 { + reg.RegistrationResponse.DstPort = proto.Uint32(uint32(port)) + } + } + } else { + if reg.GetRegistrationResponse().GetDstPort() != 443 { + reg.RegistrationResponse.DstPort = proto.Uint32(443) + } } anypbParams, err := anypb.New(params) From 5d252d55dda7fb8311edadca08e0bdf256c23430 Mon Sep 17 00:00:00 2001 From: Mingye Chen Date: Fri, 6 Oct 2023 09:46:21 -0400 Subject: [PATCH 09/10] Move port randomization after overrides --- pkg/regserver/regprocessor/regprocessor.go | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pkg/regserver/regprocessor/regprocessor.go b/pkg/regserver/regprocessor/regprocessor.go index 4d03228d..c6963655 100644 --- a/pkg/regserver/regprocessor/regprocessor.go +++ b/pkg/regserver/regprocessor/regprocessor.go @@ -325,19 +325,6 @@ func (p *RegProcessor) processBdReq(c2sPayload *pb.C2SWrapper) (*pb.Registration return nil, fmt.Errorf("failed to parse transport parameters: %w", err) } - if phantomSubnetSupportsRandPort { - dstPort, err := t.GetDstPort(uint(c2s.GetClientLibVersion()), cjkeys.ConjureSeed, params) - if err != nil { - return nil, fmt.Errorf("error determining destination port: %w", err) - } - - // we have to cast to uint32 because protobuf using varint for all int / uint types and doesn't - // have an outward facing uint16 type. - regResp.DstPort = proto.Uint32(uint32(dstPort)) - } else { - regResp.DstPort = proto.Uint32(443) - } - // Overrides will modify the C2SWrapper and put the updated registrationResponse inside to be // forwarded to the station. c2sPayload.RegistrationResponse = regResp @@ -355,6 +342,19 @@ func (p *RegProcessor) processBdReq(c2sPayload *pb.C2SWrapper) (*pb.Registration regResp = c2sPayload.GetRegistrationResponse() } + if phantomSubnetSupportsRandPort { + dstPort, err := t.GetDstPort(uint(c2s.GetClientLibVersion()), cjkeys.ConjureSeed, params) + if err != nil { + return nil, fmt.Errorf("error determining destination port: %w", err) + } + + // we have to cast to uint32 because protobuf using varint for all int / uint types and doesn't + // have an outward facing uint16 type. + regResp.DstPort = proto.Uint32(uint32(dstPort)) + } else { + regResp.DstPort = proto.Uint32(443) + } + return regResp, nil } From 34668b073f94bd0d1dca12568581e6390dff8b28 Mon Sep 17 00:00:00 2001 From: jmwample <8297368+jmwample@users.noreply.github.com> Date: Sat, 7 Oct 2023 13:26:05 -0600 Subject: [PATCH 10/10] gotapdnce version --- go.mod | 4 +--- go.sum | 4 ++-- go.work.sum | 2 ++ 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index f12d63e3..2a59c88b 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/pion/stun v0.6.1 github.com/pion/transport/v2 v2.2.3 github.com/refraction-networking/ed25519 v0.1.2 - github.com/refraction-networking/gotapdance v1.7.1 + github.com/refraction-networking/gotapdance v1.7.5-0.20231007192233-6c0352155207 github.com/refraction-networking/obfs4 v0.1.2 github.com/refraction-networking/utls v1.3.3 github.com/sirupsen/logrus v1.9.3 @@ -53,5 +53,3 @@ require ( replace github.com/pion/dtls/v2 => github.com/mingyech/dtls/v2 v2.0.0 replace github.com/pion/transport/v2 => github.com/mingyech/transport/v2 v2.0.0 - -replace github.com/refraction-networking/gotapdance => github.com/refraction-networking/gotapdance v1.7.5-0.20231005212606-d502537b1f19 diff --git a/go.sum b/go.sum index 52b7d217..79d0ba10 100644 --- a/go.sum +++ b/go.sum @@ -69,8 +69,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/refraction-networking/ed25519 v0.1.2 h1:08kJZUkAlY7a7cZGosl1teGytV+QEoNxPO7NnRvAB+g= github.com/refraction-networking/ed25519 v0.1.2/go.mod h1:nxYLUAYt/hmNpAh64PNSQ/tQ9gTIB89wCaGKJlRtZ9I= -github.com/refraction-networking/gotapdance v1.7.5-0.20231005212606-d502537b1f19 h1:n0dLMJzhufvFggNrDICpDdU1yqpdLwiXmb0FaUAuGb8= -github.com/refraction-networking/gotapdance v1.7.5-0.20231005212606-d502537b1f19/go.mod h1:uUZDICZjk37aExgntA92OPL5Q7LrZgvpQncYNrO4sKg= +github.com/refraction-networking/gotapdance v1.7.5-0.20231007192233-6c0352155207 h1:j13eRL4998NZSroZyz5E795cCQj2E/USmHLot+nr+G8= +github.com/refraction-networking/gotapdance v1.7.5-0.20231007192233-6c0352155207/go.mod h1:w40UUCQH18Z2pWVLAGqj6L9d3t3YpAhW4w5r0YgGptY= github.com/refraction-networking/obfs4 v0.1.2 h1:J842O4fGSkd2W8ogYj0KN6gqVVY+Cpqodw9qFGL7wVU= github.com/refraction-networking/obfs4 v0.1.2/go.mod h1:wAl/+gWiLsrcykJA3nKJHx89f5/gXGM8UKvty7+mvbM= github.com/refraction-networking/utls v1.3.3 h1:f/TBLX7KBciRyFH3bwupp+CE4fzoYKCirhdRcC490sw= diff --git a/go.work.sum b/go.work.sum index 721c6ca8..e34b29e2 100644 --- a/go.work.sum +++ b/go.work.sum @@ -45,6 +45,8 @@ github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/refraction-networking/gotapdance v1.6.2 h1:pDC12wdSCE4Afh31NcNAIcjIhO6Mb/qiIscwbGOhhRA= github.com/refraction-networking/gotapdance v1.6.2/go.mod h1:m82n2v+yNr3+E/dttji+qO2hEjcXgIYj2szuieEMTts= +github.com/refraction-networking/gotapdance v1.7.5-0.20231007192233-6c0352155207 h1:j13eRL4998NZSroZyz5E795cCQj2E/USmHLot+nr+G8= +github.com/refraction-networking/gotapdance v1.7.5-0.20231007192233-6c0352155207/go.mod h1:w40UUCQH18Z2pWVLAGqj6L9d3t3YpAhW4w5r0YgGptY= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=