return h.Do()
}
-func ReceiveHandshake(rw io.ReadWriter, skeys SecretKeyIter, selectCrypto CryptoSelector) (ret io.ReadWriter, method CryptoMethod, err error) {
+type HandshakeResult struct {
+ io.ReadWriter
+ CryptoMethod
+ error
+ SecretKey []byte
+}
+
+func ReceiveHandshake(rw io.ReadWriter, skeys SecretKeyIter, selectCrypto CryptoSelector) (io.ReadWriter, CryptoMethod, error) {
+ res := ReceiveHandshakeEx(rw, skeys, selectCrypto)
+ return res.ReadWriter, res.CryptoMethod, res.error
+}
+
+func ReceiveHandshakeEx(rw io.ReadWriter, skeys SecretKeyIter, selectCrypto CryptoSelector) (ret HandshakeResult) {
h := handshake{
conn: rw,
initer: false,
skeys: skeys,
chooseMethod: selectCrypto,
}
- return h.Do()
+ ret.ReadWriter, ret.CryptoMethod, ret.error = h.Do()
+ ret.SecretKey = h.skey
+ return
}
// A function that given a function, calls it with secret keys until it
}()
go func() {
defer wg.Done()
- b, cm, err := ReceiveHandshake(b, sliceIter([][]byte{[]byte("nope"), []byte("yep"), []byte("maybe")}), cryptoSelect)
- require.NoError(t, err)
- assert.Equal(t, cryptoSelect(cryptoProvides), cm)
+ res := ReceiveHandshakeEx(b, sliceIter([][]byte{[]byte("nope"), []byte("yep"), []byte("maybe")}), cryptoSelect)
+ require.NoError(t, res.error)
+ assert.EqualValues(t, "yep", res.SecretKey)
+ b := res.ReadWriter
+ assert.Equal(t, cryptoSelect(cryptoProvides), res.CryptoMethod)
go b.Write([]byte(bData))
- // Need to be exact here, as there are several reads, and net.Pipe is
- // most synchronous.
+ // Need to be exact here, as there are several reads, and net.Pipe is most synchronous.
msg := make([]byte, len(ia)+len(aData))
n, _ := io.ReadFull(b, msg[:])
if n != len(msg) {