code: func receiverEncHandshake(conn io.ReadWriter, prv *ecdsa.PrivateKey) (s secrets, err error) {
  	authMsg := new(authMsgV4)
  	authPacket, err := readHandshakeMsg(authMsg, encAuthMsgLen, prv, conn)
  	if err != nil {
  		return s, err
  	}
  	h := new(encHandshake)
  	if err := h.handleAuthMsg(authMsg, prv); err != nil {
  		return s, err
  	}
  
  	authRespMsg, err := h.makeAuthResp()
  	if err != nil {
  		return s, err
  	}
  	var authRespPacket []byte
  	if authMsg.gotPlain {
  		authRespPacket, err = authRespMsg.sealPlain(h)
  	} else {
  		authRespPacket, err = sealEIP8(authRespMsg, h)
  	}
  	if err != nil {
  		return s, err
  	}
  	if _, err = conn.Write(authRespPacket); err != nil {
  		return s, err
  	}
  	return h.secrets(authPacket, authRespPacket)
  }
docs: // receiverEncHandshake negotiates a session token on conn.
  // it should be called on the listening side of the connection.
  //
  // prv is the local client's private key.