fix: signal key transfer

This commit is contained in:
braginini
2021-04-15 14:57:15 +02:00
parent cb60efef8d
commit 303f955e32
4 changed files with 79 additions and 33 deletions
+21 -2
View File
@@ -21,7 +21,7 @@ type PeerAgent struct {
// Actual peer-to-peer connection
conn *ice.Conn
// a signal.Client to negotiate initial connection
signal signal.Client
signal *signal.Client
// a connection to a local Wireguard instance to proxy data
wgConn net.Conn
// an address of local Wireguard instance
@@ -29,7 +29,7 @@ type PeerAgent struct {
}
// NewPeerAgent creates a new PeerAgent with give local and remote Wireguard public keys and initializes an ICE Agent
func NewPeerAgent(localKey string, remoteKey string, stunTurnURLS []*ice.URL, wgAddr string) (*PeerAgent, error) {
func NewPeerAgent(localKey string, remoteKey string, stunTurnURLS []*ice.URL, wgAddr string, signal *signal.Client) (*PeerAgent, error) {
// init ICE Agent
iceAgent, err := ice.NewAgent(&ice.AgentConfig{
@@ -47,6 +47,7 @@ func NewPeerAgent(localKey string, remoteKey string, stunTurnURLS []*ice.URL, wg
wgAddr: wgAddr,
conn: nil,
wgConn: nil,
signal: signal,
}
err = peerAgent.onConnectionStateChange()
@@ -217,6 +218,24 @@ func (pa *PeerAgent) onConnectionStateChange() error {
})
}
func (pa *PeerAgent) Start() error {
localUFrag, localPwd, err := pa.iceAgent.GetLocalUserCredentials()
if err != nil {
return err
}
offer := signal.MarshalCredential(pa.LocalKey, pa.RemoteKey, &signal.Credential{
UFrag: localUFrag,
Pwd: localPwd}, sProto.Message_OFFER)
err = pa.signal.Send(offer)
if err != nil {
return err
}
return nil
}
// authenticate sets the signal.Credential of the remote peer
// and returns local Credentials
func (pa *PeerAgent) Authenticate(credential *signal.Credential) (*signal.Credential, error) {
+15 -8
View File
@@ -34,12 +34,13 @@ func NewEngine(signal *signal.Client, stunsTurns []*ice.URL, wgIface string, wgA
}
}
func (e *Engine) Start(localKey string, peers []string) error {
func (e *Engine) Start(privateKey string, peers []string) error {
// setup wireguard
myKey, err := wgtypes.ParseKey(localKey)
myKey, err := wgtypes.ParseKey(privateKey)
myPubKey := myKey.PublicKey().String()
if err != nil {
log.Errorf("error parsing Wireguard key %s: [%s]", localKey, err.Error())
log.Errorf("error parsing Wireguard key %s: [%s]", privateKey, err.Error())
return err
}
@@ -63,17 +64,23 @@ func (e *Engine) Start(localKey string, peers []string) error {
// initialize peer agents
for _, peer := range peers {
peerAgent, err := NewPeerAgent(localKey, peer, e.stunsTurns, fmt.Sprintf("127.0.0.1:%d", *wgPort))
peerAgent, err := NewPeerAgent(myPubKey, peer, e.stunsTurns, fmt.Sprintf("127.0.0.1:%d", *wgPort), e.signal)
if err != nil {
log.Fatalf("failed creating peer agent for pair %s - %s", localKey, peer)
log.Fatalf("failed creating peer agent for pair %s - %s", myPubKey, peer)
return err
}
e.agents[localKey] = peerAgent
e.agents[myPubKey] = peerAgent
}
e.receiveSignal(localKey)
e.receiveSignal(myPubKey)
// todo send offer to each peer
for _, pa := range e.agents {
err := pa.Start()
if err != nil {
log.Fatalf("failed starting agent %s %s", myPubKey, err)
return err
}
}
return nil
}