Skip to content

Commit

Permalink
Add DTLS CID client example
Browse files Browse the repository at this point in the history
Adds a DTLS Connection ID client example. Two different "connections"
are used with the second resuming using the state from the first,
allowing it to bypass performing a second DTLS handshake.

Signed-off-by: Daniel Mangum <[email protected]>
  • Loading branch information
hasheddan committed Aug 28, 2023
1 parent f376983 commit 30d59ce
Showing 1 changed file with 77 additions and 0 deletions.
77 changes: 77 additions & 0 deletions examples/dtls/cid/client/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package main

import (
"context"
"fmt"
"log"
"net"

piondtls "github.com/pion/dtls/v2"
"github.com/plgd-dev/go-coap/v3/dtls"
)

func main() {
conf := &piondtls.Config{
PSK: func(hint []byte) ([]byte, error) {
fmt.Printf("Server's hint: %s \n", hint)
return []byte{0xAB, 0xC1, 0x23}, nil
},
PSKIdentityHint: []byte("Pion DTLS Client"),
CipherSuites: []piondtls.CipherSuiteID{piondtls.TLS_PSK_WITH_AES_128_CCM_8},
ConnectionIDGenerator: piondtls.OnlySendCIDGenerator(),
}
raddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:5688")
if err != nil {
log.Fatalf("Error resolving UDP address: %v", err)
}

// Setup first UDP listener.
udpconn, err := net.ListenUDP("udp", nil)
if err != nil {
log.Fatalf("Error establishing UDP listener: %v", err)
}

// Create DTLS client on UDP listener.
client, err := piondtls.Client(udpconn, raddr, conf)
if err != nil {
log.Fatalf("Error establishing DTLS client: %v", err)
}
co := dtls.Client(client)
resp, err := co.Get(context.Background(), "/a")
if err != nil {
log.Fatalf("Error performing request: %v", err)
}
log.Printf("Response payload: %+v", resp)
resp, err = co.Get(context.Background(), "/b")
if err != nil {
log.Fatalf("Error performing request: %v", err)
}
log.Printf("Response payload: %+v", resp)

// Export state to resume connection from another address.
state := client.ConnectionState()

// Setup second UDP listener on a different address.
udpconn, err = net.ListenUDP("udp", nil)
if err != nil {
log.Fatalf("Error establishing UDP listener: %v", err)
}

// Resume connection on new address with previous state.
client, err = piondtls.Resume(&state, udpconn, raddr, conf)
if err != nil {
log.Fatalf("Error resuming DTLS connection: %v", err)
}
co = dtls.Client(client)
// Requests can be performed without performing a second handshake.
resp, err = co.Get(context.Background(), "/a")
if err != nil {
log.Fatalf("Error performing request: %v", err)
}
log.Printf("Response payload: %+v", resp)
resp, err = co.Get(context.Background(), "/b")
if err != nil {
log.Fatalf("Error performing request: %v", err)
}
log.Printf("Response payload: %+v", resp)
}

0 comments on commit 30d59ce

Please sign in to comment.