Exemple #1
0
func (ntor *NtorHandshake) Finish(inTail, outTail string) (shared Secret, tIn, tOut AuthValue) {
	// The DH parts have already been written into ntor.h.
	hTail := bytes.Join([][]byte{ntor.bHat, ntor.x, ntor.y, []byte(ntorSquawk)}, nil)
	ntor.h.Write(hTail)

	var confSeed CValue
	_, _ = ntor.h.Read(confSeed[:])
	_, _ = ntor.h.Read(shared[:])

	hMacMedial := bytes.Join([][]byte{ntor.bHat, ntor.y, ntor.x, []byte(ntorSquawk)}, nil)
	var hMac skein.Hash
	hMac.InitFrom(&ntorInitialHmac)
	hMac.Write(confSeed[:])
	hMac.Write(hMacMedial)

	hMacIn := hMac.Copy()
	hMacIn.Write([]byte(inTail))
	_, _ = hMacIn.Read(tIn[:])
	hMacOut := hMac.Copy()
	hMacOut.Write([]byte(outTail))
	_, _ = hMacOut.Read(tOut[:])

	return
}