"golang.org/x/crypto/poly1305"
"golang.org/x/crypto/salsa20"
"golang.org/x/crypto/salsa20/salsa"
+ "golang.org/x/crypto/xtea"
)
type Handshake struct {
return k
}
+func NewNonceCipher(key *[32]byte) *xtea.Cipher {
+ nonceKey := make([]byte, 16)
+ salsa20.XORKeyStream(nonceKey, make([]byte, 32), make([]byte, 8), key)
+ ciph, err := xtea.NewCipher(nonceKey)
+ if err != nil {
+ panic(err)
+ }
+ return ciph
+}
+
// Check if it is valid handshake-related message
// Minimal size and last 16 zero bytes
func isValidHandshakePkt(pkt []byte) bool {
// Switch peer
peer := Peer{
- addr: h.addr,
- nonceOur: noncediff + 0,
+ addr: h.addr,
+ nonceOur: noncediff + 0,
nonceRecv: noncediff + 0,
+ key: KeyFromSecrets(h.sServer[:], decRs[8+8:]),
}
- peer.key = KeyFromSecrets(h.sServer[:], decRs[8+8:])
+ peer.nonceCipher = NewNonceCipher(peer.key)
fmt.Print("[OK]")
return &peer
default:
// Switch peer
peer := Peer{
- addr: h.addr,
- nonceOur: noncediff + 1,
+ addr: h.addr,
+ nonceOur: noncediff + 1,
nonceRecv: noncediff + 0,
+ key: KeyFromSecrets(h.sServer[:], h.sClient[:]),
}
- peer.key = KeyFromSecrets(h.sServer[:], h.sClient[:])
+ peer.nonceCipher = NewNonceCipher(peer.key)
fmt.Print("[OK]")
return &peer
default: