code: func initiatorEncHandshake(conn io.ReadWriter, prv *ecdsa.PrivateKey, remote *ecdsa.PublicKey) (s secrets, err error) {
  	h := &encHandshake{initiator: true, remote: ecies.ImportECDSAPublic(remote)}
  	authMsg, err := h.makeAuthMsg(prv)
  	if err != nil {
  		return s, err
  	}
  	authPacket, err := sealEIP8(authMsg, h)
  	if err != nil {
  		return s, err
  	}
  	if _, err = conn.Write(authPacket); err != nil {
  		return s, err
  	}
  
  	authRespMsg := new(authRespV4)
  	authRespPacket, err := readHandshakeMsg(authRespMsg, encAuthRespLen, prv, conn)
  	if err != nil {
  		return s, err
  	}
  	if err := h.handleAuthResp(authRespMsg); err != nil {
  		return s, err
  	}
  	return h.secrets(authPacket, authRespPacket)
  }
docs: // initiatorEncHandshake negotiates a session token on conn.
  // it should be called on the dialing side of the connection.
  //
  // prv is the local client's private key.