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 }