mirror of
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git
synced 2025-10-13 20:11:19 -04:00
Add CovertWebRTC API
This commit is contained in:
parent
8caebb484d
commit
5912e2892a
4 changed files with 69 additions and 8 deletions
|
@ -185,17 +185,35 @@ type WebRTCDialer struct {
|
||||||
|
|
||||||
// Deprecated: Use NewWebRTCDialerWithEventsAndProxy instead
|
// Deprecated: Use NewWebRTCDialerWithEventsAndProxy instead
|
||||||
func NewWebRTCDialer(broker *BrokerChannel, iceServers []webrtc.ICEServer, max int) *WebRTCDialer {
|
func NewWebRTCDialer(broker *BrokerChannel, iceServers []webrtc.ICEServer, max int) *WebRTCDialer {
|
||||||
return NewWebRTCDialerWithEventsAndProxy(broker, iceServers, max, nil, nil, false, false)
|
return NewWebRTCDialerWithEventsAndProxy(broker, iceServers, max, nil, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated: Use NewWebRTCDialerWithEventsAndProxy instead
|
// Deprecated: Use NewWebRTCDialerWithEventsAndProxy instead
|
||||||
func NewWebRTCDialerWithEvents(broker *BrokerChannel, iceServers []webrtc.ICEServer, max int, eventLogger event.SnowflakeEventReceiver) *WebRTCDialer {
|
func NewWebRTCDialerWithEvents(broker *BrokerChannel, iceServers []webrtc.ICEServer, max int, eventLogger event.SnowflakeEventReceiver) *WebRTCDialer {
|
||||||
return NewWebRTCDialerWithEventsAndProxy(broker, iceServers, max, eventLogger, nil, false, false)
|
return NewWebRTCDialerWithEventsAndProxy(broker, iceServers, max, eventLogger, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewWebRTCDialerWithEventsAndProxy constructs a new WebRTCDialer.
|
// NewWebRTCDialerWithEventsAndProxy constructs a new WebRTCDialer.
|
||||||
func NewWebRTCDialerWithEventsAndProxy(broker *BrokerChannel, iceServers []webrtc.ICEServer, max int,
|
func NewWebRTCDialerWithEventsAndProxy(broker *BrokerChannel, iceServers []webrtc.ICEServer, max int,
|
||||||
eventLogger event.SnowflakeEventReceiver, proxy *url.URL,
|
eventLogger event.SnowflakeEventReceiver, proxy *url.URL,
|
||||||
|
) *WebRTCDialer {
|
||||||
|
config := webrtc.Configuration{
|
||||||
|
ICEServers: iceServers,
|
||||||
|
}
|
||||||
|
|
||||||
|
return &WebRTCDialer{
|
||||||
|
BrokerChannel: broker,
|
||||||
|
webrtcConfig: &config,
|
||||||
|
max: max,
|
||||||
|
|
||||||
|
eventLogger: eventLogger,
|
||||||
|
proxy: proxy,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWebRTCDialerWithEventsAndProxy constructs a new WebRTCDialer setting DTLS mimicking and randomization.
|
||||||
|
func NewCovertWebRTCDialerWithEventsAndProxy(broker *BrokerChannel, iceServers []webrtc.ICEServer, max int,
|
||||||
|
eventLogger event.SnowflakeEventReceiver, proxy *url.URL,
|
||||||
dtlsRandomize bool, dtlsMimic bool,
|
dtlsRandomize bool, dtlsMimic bool,
|
||||||
) *WebRTCDialer {
|
) *WebRTCDialer {
|
||||||
config := webrtc.Configuration{
|
config := webrtc.Configuration{
|
||||||
|
@ -218,7 +236,10 @@ func NewWebRTCDialerWithEventsAndProxy(broker *BrokerChannel, iceServers []webrt
|
||||||
func (w WebRTCDialer) Catch() (*WebRTCPeer, error) {
|
func (w WebRTCDialer) Catch() (*WebRTCPeer, error) {
|
||||||
// TODO: [#25591] Fetch ICE server information from Broker.
|
// TODO: [#25591] Fetch ICE server information from Broker.
|
||||||
// TODO: [#25596] Consider TURN servers here too.
|
// TODO: [#25596] Consider TURN servers here too.
|
||||||
return NewWebRTCPeerWithEventsAndProxy(w.webrtcConfig, w.BrokerChannel, w.eventLogger, w.proxy, w.dtlsRandomize, w.dtlsMimic)
|
if w.dtlsRandomize || w.dtlsMimic {
|
||||||
|
return NewCovertWebRTCPeerWithEventsAndProxy(w.webrtcConfig, w.BrokerChannel, w.eventLogger, w.proxy, w.dtlsRandomize, w.dtlsMimic)
|
||||||
|
}
|
||||||
|
return NewWebRTCPeerWithEventsAndProxy(w.webrtcConfig, w.BrokerChannel, w.eventLogger, w.proxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetMax returns the maximum number of snowflakes to collect.
|
// GetMax returns the maximum number of snowflakes to collect.
|
||||||
|
|
|
@ -162,8 +162,14 @@ func NewSnowflakeClient(config ClientConfig) (*Transport, error) {
|
||||||
if config.Max > max {
|
if config.Max > max {
|
||||||
max = config.Max
|
max = config.Max
|
||||||
}
|
}
|
||||||
|
|
||||||
eventsLogger := event.NewSnowflakeEventDispatcher()
|
eventsLogger := event.NewSnowflakeEventDispatcher()
|
||||||
transport := &Transport{dialer: NewWebRTCDialerWithEventsAndProxy(broker, iceServers, max, eventsLogger, config.CommunicationProxy, config.DTLSRandomize, config.DTLSMimic), eventDispatcher: eventsLogger}
|
var transport *Transport
|
||||||
|
if config.DTLSRandomize || config.DTLSMimic {
|
||||||
|
transport = &Transport{dialer: NewCovertWebRTCDialerWithEventsAndProxy(broker, iceServers, max, eventsLogger, config.CommunicationProxy, config.DTLSRandomize, config.DTLSMimic), eventDispatcher: eventsLogger}
|
||||||
|
} else {
|
||||||
|
transport = &Transport{dialer: NewWebRTCDialerWithEventsAndProxy(broker, iceServers, max, eventsLogger, config.CommunicationProxy), eventDispatcher: eventsLogger}
|
||||||
|
}
|
||||||
|
|
||||||
return transport, nil
|
return transport, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,6 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/pion/dtls/v3"
|
|
||||||
"github.com/pion/ice/v4"
|
"github.com/pion/ice/v4"
|
||||||
"github.com/pion/transport/v3"
|
"github.com/pion/transport/v3"
|
||||||
"github.com/pion/transport/v3/stdnet"
|
"github.com/pion/transport/v3/stdnet"
|
||||||
|
@ -53,7 +52,7 @@ type WebRTCPeer struct {
|
||||||
func NewWebRTCPeer(
|
func NewWebRTCPeer(
|
||||||
config *webrtc.Configuration, broker *BrokerChannel,
|
config *webrtc.Configuration, broker *BrokerChannel,
|
||||||
) (*WebRTCPeer, error) {
|
) (*WebRTCPeer, error) {
|
||||||
return NewWebRTCPeerWithEventsAndProxy(config, broker, nil, nil, false, false)
|
return NewWebRTCPeerWithEventsAndProxy(config, broker, nil, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated: Use NewWebRTCPeerWithEventsAndProxy Instead.
|
// Deprecated: Use NewWebRTCPeerWithEventsAndProxy Instead.
|
||||||
|
@ -61,7 +60,7 @@ func NewWebRTCPeerWithEvents(
|
||||||
config *webrtc.Configuration, broker *BrokerChannel,
|
config *webrtc.Configuration, broker *BrokerChannel,
|
||||||
eventsLogger event.SnowflakeEventReceiver,
|
eventsLogger event.SnowflakeEventReceiver,
|
||||||
) (*WebRTCPeer, error) {
|
) (*WebRTCPeer, error) {
|
||||||
return NewWebRTCPeerWithEventsAndProxy(config, broker, eventsLogger, nil, false, false)
|
return NewWebRTCPeerWithEventsAndProxy(config, broker, eventsLogger, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewWebRTCPeerWithEventsAndProxy constructs a WebRTC PeerConnection to a snowflake proxy.
|
// NewWebRTCPeerWithEventsAndProxy constructs a WebRTC PeerConnection to a snowflake proxy.
|
||||||
|
@ -72,6 +71,42 @@ func NewWebRTCPeerWithEvents(
|
||||||
func NewWebRTCPeerWithEventsAndProxy(
|
func NewWebRTCPeerWithEventsAndProxy(
|
||||||
config *webrtc.Configuration, broker *BrokerChannel,
|
config *webrtc.Configuration, broker *BrokerChannel,
|
||||||
eventsLogger event.SnowflakeEventReceiver, proxy *url.URL,
|
eventsLogger event.SnowflakeEventReceiver, proxy *url.URL,
|
||||||
|
) (*WebRTCPeer, error) {
|
||||||
|
if eventsLogger == nil {
|
||||||
|
eventsLogger = event.NewSnowflakeEventDispatcher()
|
||||||
|
}
|
||||||
|
|
||||||
|
connection := new(WebRTCPeer)
|
||||||
|
{
|
||||||
|
var buf [8]byte
|
||||||
|
if _, err := rand.Read(buf[:]); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
connection.id = "snowflake-" + hex.EncodeToString(buf[:])
|
||||||
|
}
|
||||||
|
connection.closed = make(chan struct{})
|
||||||
|
|
||||||
|
// Override with something that's not NullLogger to have real logging.
|
||||||
|
connection.bytesLogger = &bytesNullLogger{}
|
||||||
|
|
||||||
|
// Pipes remain the same even when DataChannel gets switched.
|
||||||
|
connection.recvPipe, connection.writePipe = io.Pipe()
|
||||||
|
|
||||||
|
connection.eventsLogger = eventsLogger
|
||||||
|
connection.proxy = proxy
|
||||||
|
|
||||||
|
err := connection.connect(config, broker, false, false)
|
||||||
|
if err != nil {
|
||||||
|
connection.Close()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return connection, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCovertWebRTCPeerWithEventsAndProxy constructs a WebRTC PeerConnection to a snowflake proxy using DTLS mimicking or randomization.
|
||||||
|
func NewCovertWebRTCPeerWithEventsAndProxy(
|
||||||
|
config *webrtc.Configuration, broker *BrokerChannel,
|
||||||
|
eventsLogger event.SnowflakeEventReceiver, proxy *url.URL,
|
||||||
dtlsRandomize bool, dtlsMimic bool,
|
dtlsRandomize bool, dtlsMimic bool,
|
||||||
) (*WebRTCPeer, error) {
|
) (*WebRTCPeer, error) {
|
||||||
if eventsLogger == nil {
|
if eventsLogger == nil {
|
||||||
|
|
|
@ -42,7 +42,6 @@ import (
|
||||||
"github.com/pion/ice/v4"
|
"github.com/pion/ice/v4"
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"github.com/pion/dtls/v3"
|
|
||||||
"github.com/pion/transport/v3/stdnet"
|
"github.com/pion/transport/v3/stdnet"
|
||||||
"github.com/pion/webrtc/v4"
|
"github.com/pion/webrtc/v4"
|
||||||
"github.com/theodorsm/covert-dtls/pkg/mimicry"
|
"github.com/theodorsm/covert-dtls/pkg/mimicry"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue