|
|
@@ -222,10 +222,14 @@ func (p *Peer) loop() (reason DiscReason, err error) {
|
|
|
defer close(p.closed)
|
|
|
defer p.conn.Close()
|
|
|
|
|
|
+ var readLoop func(chan Msg, chan error, chan bool)
|
|
|
if p.cryptoHandshake {
|
|
|
- if err := p.handleCryptoHandshake(); err != nil {
|
|
|
+ if readLoop, err := p.handleCryptoHandshake(); err != nil {
|
|
|
+ // from here on everything can be encrypted, authenticated
|
|
|
return DiscProtocolError, err // no graceful disconnect
|
|
|
}
|
|
|
+ } else {
|
|
|
+ readLoop = p.readLoop
|
|
|
}
|
|
|
|
|
|
// read loop
|
|
|
@@ -233,7 +237,7 @@ func (p *Peer) loop() (reason DiscReason, err error) {
|
|
|
readErr := make(chan error)
|
|
|
readNext := make(chan bool, 1)
|
|
|
protoDone := make(chan struct{}, 1)
|
|
|
- go p.readLoop(readMsg, readErr, readNext)
|
|
|
+ go readLoop(readMsg, readErr, readNext)
|
|
|
readNext <- true
|
|
|
|
|
|
if p.runBaseProtocol {
|
|
|
@@ -329,8 +333,19 @@ func (p *Peer) dispatch(msg Msg, protoDone chan struct{}) (wait bool, err error)
|
|
|
}
|
|
|
|
|
|
func (p *Peer) handleCryptoHandshake() (err error) {
|
|
|
+ // cryptoId is just created for the lifecycle of the handshake
|
|
|
+ // it is survived by an encrypted readwriter
|
|
|
+ if p.dialAddr != 0 { // this should have its own method Outgoing() bool
|
|
|
+ initiator = true
|
|
|
+ }
|
|
|
+ // create crypto layer
|
|
|
+ cryptoId := newCryptoId(p.identity, initiator, sessionToken)
|
|
|
+ // run on peer
|
|
|
+ if rw, err := cryptoId.Run(p.Pubkey()); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ p.conn = rw.Run(p.conn)
|
|
|
|
|
|
- return nil
|
|
|
}
|
|
|
|
|
|
func (p *Peer) startBaseProtocol() {
|