Skip to content

Commit 69e08b6

Browse files
committed
Update to latest dtls library. Fixes #85
1 parent 0666f19 commit 69e08b6

File tree

7 files changed

+115
-34
lines changed

7 files changed

+115
-34
lines changed

address.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ const (
3131
KeyProxy = "proxy"
3232
KeyProtocol = "protocol"
3333
KeyCachedProxyConfiguration = "cachedProxyConfiguration"
34+
35+
KeyHandshakeTimeout = "handshakeTimeout"
36+
KeyCachedHandshakeTimeout = "cachedHandshakeTimeout"
3437
)
3538

3639
type Configuration map[interface{}]interface{}
@@ -84,6 +87,28 @@ func (self Configuration) GetProxyConfiguration() (*ProxyConfiguration, error) {
8487
return result, nil
8588
}
8689

90+
func (self Configuration) GetHandshakeTimeout() (time.Duration, error) {
91+
if val, ok := self[KeyCachedHandshakeTimeout]; ok {
92+
if timeout, ok := val.(time.Duration); ok {
93+
return timeout, nil
94+
}
95+
}
96+
97+
if val, ok := self[KeyHandshakeTimeout]; ok {
98+
if strVal, ok := val.(string); ok {
99+
timeout, err := time.ParseDuration(strVal)
100+
if err == nil {
101+
self[KeyCachedHandshakeTimeout] = timeout
102+
}
103+
return timeout, errors.Wrapf(err, "unable to parse handshake timeout '%s' to duration", strVal)
104+
} else {
105+
return 0, errors.New("invalid handshake timeout, must be string value")
106+
}
107+
}
108+
109+
return 0, nil
110+
}
111+
87112
type ProxyType string
88113

89114
const (

dtls/address.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ func (a *address) DialWithLocalBinding(name string, localBinding string, i *iden
4646
return DialWithLocalBinding(a, name, localBinding, i, timeout)
4747
}
4848

49-
func (a *address) Listen(name string, i *identity.TokenId, acceptF func(transport.Conn), _ transport.Configuration) (io.Closer, error) {
50-
return Listen(a, name, i, acceptF)
49+
func (a *address) Listen(name string, i *identity.TokenId, acceptF func(transport.Conn), tcfg transport.Configuration) (io.Closer, error) {
50+
return Listen(a, name, i, tcfg, acceptF)
5151
}
5252

5353
func (a *address) MustListen(name string, i *identity.TokenId, acceptF func(transport.Conn), tcfg transport.Configuration) io.Closer {
@@ -62,7 +62,7 @@ func (a *address) String() string {
6262
return a.original
6363
}
6464

65-
func (a address) Type() string {
65+
func (a *address) Type() string {
6666
return Type
6767
}
6868

@@ -75,7 +75,7 @@ func (a *address) Hostname() string {
7575
return a.UDPAddr.IP.String()
7676
}
7777

78-
func (a address) Port() uint16 {
78+
func (a *address) Port() uint16 {
7979
return uint16(a.UDPAddr.Port)
8080
}
8181

dtls/connection.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@ package dtls
1919
import (
2020
"crypto/x509"
2121
"github.com/openziti/transport/v2"
22-
"github.com/pion/dtls/v2"
22+
"github.com/pion/dtls/v3"
2323
"github.com/pkg/errors"
2424
)
2525

2626
func getPeerCerts(conn *dtls.Conn) ([]*x509.Certificate, error) {
2727
var certs []*x509.Certificate
28-
for _, certBytes := range conn.ConnectionState().PeerCertificates {
28+
connState, ok := conn.ConnectionState()
29+
if !ok {
30+
return nil, errors.New("unable to get dtls connection state, couldn't get peer certificates")
31+
}
32+
for _, certBytes := range connState.PeerCertificates {
2933
cert, err := x509.ParseCertificate(certBytes)
3034
if err != nil {
3135
return nil, errors.Wrap(err, "couldn't parse peer cert")

dtls/dialer.go

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ import (
2222
"github.com/michaelquigley/pfxlog"
2323
"github.com/openziti/identity"
2424
"github.com/openziti/transport/v2"
25-
"github.com/pion/dtls/v2"
25+
"github.com/pion/dtls/v3"
26+
"github.com/pkg/errors"
2627
"net"
2728
"time"
2829
)
@@ -32,16 +33,17 @@ func Dial(addr *address, name string, i *identity.TokenId, timeout time.Duration
3233
}
3334

3435
func DialWithLocalBinding(addr *address, name, localBinding string, i *identity.TokenId, timeout time.Duration) (transport.Conn, error) {
36+
log := pfxlog.Logger()
37+
log.WithField("address", addr.String()).Debug("dialing")
38+
3539
if addr.err != nil {
3640
return nil, addr.err
3741
}
38-
ip, err := transport.ResolveLocalBinding(localBinding)
39-
if err != nil {
40-
return nil, err
42+
ip, closeErr := transport.ResolveLocalBinding(localBinding)
43+
if closeErr != nil {
44+
return nil, closeErr
4145
}
4246

43-
log := pfxlog.Logger()
44-
4547
cfg := &dtls.Config{
4648
Certificates: []tls.Certificate{*i.Cert()},
4749
//ExtendedMasterSecret: dtls.RequireExtendedMasterSecret,
@@ -53,29 +55,40 @@ func DialWithLocalBinding(addr *address, name, localBinding string, i *identity.
5355
localAddr = &net.UDPAddr{IP: ip}
5456
}
5557

56-
udpConn, err := net.DialUDP("udp", localAddr, &addr.UDPAddr)
57-
if err != nil {
58-
return nil, err
58+
udpConn, closeErr := net.ListenUDP("udp", localAddr)
59+
if closeErr != nil {
60+
return nil, closeErr
61+
}
62+
63+
conn, closeErr := dtls.Client(udpConn, &addr.UDPAddr, cfg)
64+
if closeErr != nil {
65+
return nil, closeErr
5966
}
6067

6168
ctx := context.Background()
6269
cancelF := func() {}
6370
if timeout > 0 {
6471
ctx, cancelF = context.WithTimeout(ctx, timeout)
6572
}
66-
conn, err := dtls.ClientWithContext(ctx, udpConn, cfg)
73+
closeErr = conn.HandshakeContext(ctx)
6774
cancelF()
68-
if err != nil {
69-
return nil, err
75+
if closeErr != nil {
76+
if closeErr := conn.Close(); closeErr != nil {
77+
log.WithError(closeErr).Error("error closing connection")
78+
}
79+
return nil, errors.Wrap(closeErr, "dtls handshake error")
7080
}
7181

72-
log.Debugf("server provided [%d] certificates", len(conn.ConnectionState().PeerCertificates))
73-
74-
certs, err := getPeerCerts(conn)
75-
if err != nil {
76-
return nil, err
82+
certs, closeErr := getPeerCerts(conn)
83+
if closeErr != nil {
84+
if closeErr = conn.Close(); closeErr != nil {
85+
log.WithError(closeErr).Error("error closing connection")
86+
}
87+
return nil, errors.Wrap(closeErr, "error getting peer certificates")
7788
}
7889

90+
log.Debugf("server provided [%d] certificates", len(certs))
91+
7992
return &Connection{
8093
detail: &transport.ConnectionDetail{
8194
Address: addr.String(),

dtls/listener.go

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,30 @@ import (
2222
"github.com/michaelquigley/pfxlog"
2323
"github.com/openziti/identity"
2424
"github.com/openziti/transport/v2"
25-
"github.com/pion/dtls/v2"
25+
"github.com/pion/dtls/v3"
2626
"github.com/sirupsen/logrus"
2727
"io"
2828
"net"
2929
"sync/atomic"
3030
"time"
3131
)
3232

33-
func Listen(addr *address, name string, i *identity.TokenId, acceptF func(transport.Conn)) (io.Closer, error) {
33+
const DefaultHandshakeTimeout = 30 * time.Second
34+
35+
func Listen(addr *address, name string, i *identity.TokenId, tcfg transport.Configuration, acceptF func(transport.Conn)) (io.Closer, error) {
3436
if addr.err != nil {
3537
return nil, addr.err
3638
}
39+
40+
timeout, err := tcfg.GetHandshakeTimeout()
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
if timeout == 0 {
46+
timeout = DefaultHandshakeTimeout
47+
}
48+
3749
log := pfxlog.ContextLogger(name + "/" + addr.String()).Entry
3850

3951
var certs []tls.Certificate
@@ -49,9 +61,6 @@ func Listen(addr *address, name string, i *identity.TokenId, acceptF func(transp
4961
RootCAs: i.CA(),
5062
//CipherSuites: tlz.GetCipherSuites(),
5163
// Create timeout context for accepted connection.
52-
ConnectContextMaker: func() (context.Context, func()) {
53-
return context.WithTimeout(context.Background(), 30*time.Second)
54-
},
5564
}
5665

5766
listener, err := dtls.Listen("udp", &addr.UDPAddr, cfg)
@@ -63,6 +72,7 @@ func Listen(addr *address, name string, i *identity.TokenId, acceptF func(transp
6372
name: name,
6473
listener: listener,
6574
acceptF: acceptF,
75+
timeout: timeout,
6676
}
6777

6878
go result.acceptLoop(log)
@@ -75,6 +85,7 @@ type acceptor struct {
7585
listener net.Listener
7686
acceptF func(transport.Conn)
7787
closed atomic.Bool
88+
timeout time.Duration
7889
}
7990

8091
func (self *acceptor) Close() error {
@@ -99,6 +110,22 @@ func (self *acceptor) acceptLoop(log *logrus.Entry) {
99110
}
100111

101112
conn := socket.(*dtls.Conn)
113+
ctx := context.Background()
114+
cancelF := func() {}
115+
if self.timeout > 0 {
116+
ctx, cancelF = context.WithTimeout(ctx, self.timeout)
117+
}
118+
err = conn.HandshakeContext(ctx)
119+
cancelF()
120+
121+
if err != nil {
122+
log.WithError(err).Error("dtls handshake error")
123+
if err = conn.Close(); err != nil {
124+
log.WithError(err).Error("error closing connection")
125+
}
126+
continue
127+
}
128+
102129
certs, err := getPeerCerts(conn)
103130
if err != nil {
104131
log.WithError(err).Error("unable to parse peer certificates")
@@ -115,7 +142,7 @@ func (self *acceptor) acceptLoop(log *logrus.Entry) {
115142
Name: self.name,
116143
},
117144
certs: certs,
118-
Conn: socket.(*dtls.Conn),
145+
Conn: conn,
119146
}
120147
self.acceptF(connection)
121148
}

go.mod

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ require (
1313
github.com/pkg/errors v0.9.1
1414
github.com/sirupsen/logrus v1.9.3
1515
github.com/stretchr/testify v1.9.0
16-
golang.org/x/net v0.24.0
16+
golang.org/x/net v0.27.0
1717
nhooyr.io/websocket v1.8.11
1818
)
1919

@@ -26,17 +26,19 @@ require (
2626
github.com/nxadm/tail v1.4.8 // indirect
2727
github.com/pion/logging v0.2.2 // indirect
2828
github.com/pion/transport/v2 v2.2.4 // indirect
29-
golang.org/x/crypto v0.22.0 // indirect
30-
golang.org/x/sys v0.21.0 // indirect
31-
golang.org/x/term v0.21.0 // indirect
29+
golang.org/x/crypto v0.25.0 // indirect
30+
golang.org/x/sys v0.22.0 // indirect
31+
golang.org/x/term v0.22.0 // indirect
3232
)
3333

3434
require (
3535
github.com/davecgh/go-spew v1.1.1 // indirect
3636
github.com/mattn/go-colorable v0.1.13 // indirect
3737
github.com/parallaxsecond/parsec-client-go v0.0.0-20221025095442-f0a77d263cf9 // indirect
38+
github.com/pion/dtls/v3 v3.0.1 // indirect
39+
github.com/pion/transport/v3 v3.0.7 // indirect
3840
github.com/pmezard/go-difflib v1.0.0 // indirect
39-
golang.org/x/text v0.14.0 // indirect
41+
golang.org/x/text v0.16.0 // indirect
4042
google.golang.org/protobuf v1.31.0 // indirect
4143
gopkg.in/yaml.v3 v3.0.1 // indirect
4244
)

go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,10 +334,14 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9
334334
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
335335
github.com/pion/dtls/v2 v2.2.10 h1:u2Axk+FyIR1VFTPurktB+1zoEPGIW3bmyj3LEFrXjAA=
336336
github.com/pion/dtls/v2 v2.2.10/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
337+
github.com/pion/dtls/v3 v3.0.1 h1:0kmoaPYLAo0md/VemjcrAXQiSf8U+tuU3nDYVNpEKaw=
338+
github.com/pion/dtls/v3 v3.0.1/go.mod h1:dfIXcFkKoujDQ+jtd8M6RgqKK3DuaUilm3YatAbGp5k=
337339
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
338340
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
339341
github.com/pion/transport/v2 v2.2.4 h1:41JJK6DZQYSeVLxILA2+F4ZkKb4Xd/tFJZRFZQ9QAlo=
340342
github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0=
343+
github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
344+
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
341345
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
342346
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
343347
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -485,6 +489,8 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y
485489
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
486490
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
487491
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
492+
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
493+
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
488494
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
489495
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
490496
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -576,6 +582,7 @@ golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
576582
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
577583
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
578584
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
585+
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
579586
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
580587
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
581588
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -676,6 +683,7 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
676683
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
677684
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
678685
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
686+
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
679687
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
680688
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
681689
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -685,6 +693,7 @@ golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
685693
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
686694
golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA=
687695
golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
696+
golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
688697
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
689698
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
690699
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -699,6 +708,7 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
699708
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
700709
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
701710
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
711+
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
702712
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
703713
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
704714
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=

0 commit comments

Comments
 (0)