"golang.org/x/crypto/poly1305"
"golang.org/x/crypto/salsa20"
+ "golang.org/x/crypto/xtea"
)
var (
}
type Peer struct {
- addr *net.UDPAddr
- key *[KeySize]byte // encryption key
- nonceOur uint64 // nonce for our messages
- nonceRecv uint64 // latest received nonce from remote peer
+ addr *net.UDPAddr
+ key *[KeySize]byte // encryption key
+ nonceOur uint64 // nonce for our messages
+ nonceRecv uint64 // latest received nonce from remote peer
+ nonceCipher *xtea.Cipher // nonce cipher
}
type UDPPkt struct {
udpSinkReady <- true
continue
}
- nonceRecv, _ = binary.Uvarint(udpPktData[:8])
- if nonceRecv < peer.nonceRecv-noncediff {
- fmt.Print("R")
- udpSinkReady <- true
- continue
- }
copy(buf[:KeySize], emptyKey)
copy(tag[:], udpPktData[udpPkt.size-poly1305.TagSize:])
copy(buf[S20BS:], udpPktData[NonceSize:udpPkt.size-poly1305.TagSize])
fmt.Print("T")
continue
}
+ peer.nonceCipher.Decrypt(buf, udpPktData[:NonceSize])
+ nonceRecv, _ = binary.Uvarint(buf[:NonceSize])
+ if nonceRecv < peer.nonceRecv-noncediff {
+ fmt.Print("R")
+ udpSinkReady <- true
+ continue
+ }
udpSinkReady <- true
peer.nonceRecv = nonceRecv
timeouts = 0
ethSinkReady <- true
continue
}
+
peer.nonceOur = peer.nonceOur + 2
+ for i := 0; i < NonceSize; i++ {
+ nonce[i] = '\x00'
+ }
binary.PutUvarint(nonce, peer.nonceOur)
+ peer.nonceCipher.Encrypt(nonce, nonce)
+
copy(buf[:KeySize], emptyKey)
if ethPktSize > -1 {
copy(buf[S20BS:], ethBuf[:ethPktSize])