public static InitiatorHandshakeMessageV1 create(
      final SECPPublicKey ourPubKey,
      final KeyPair ephKeyPair,
      final Bytes32 staticSharedSecret,
      final Bytes32 nonce,
      final boolean token) {
    final Bytes32 ephPubKeyHash = Hash.keccak256(ephKeyPair.getPublicKey().getEncodedBytes());

    // XOR of the static shared secret and the generated nonce.
    final SECPSignature signature =
        SIGNATURE_ALGORITHM.get().sign(staticSharedSecret.xor(nonce), ephKeyPair);
    return new InitiatorHandshakeMessageV1(
        ourPubKey, signature, ephKeyPair.getPublicKey(), ephPubKeyHash, nonce, token);
  }
The initiator's handshake message.

<p>This message must be sent by the party that initiates the RLPX connection, as the first
message in the handshake protocol.

<h3>Message structure</h3>

The following describes the message structure:

<pre>
  authInitiator -&gt; E(remote-pubk,
                     S(ephemeral-privk, static-shared-secret ^ nonce)
                      || H(ephemeral-pubk)
                     || pubk
                     || nonce
                     || 0x0)
</pre>

@see <a href=
    "https://github.com/ethereum/devp2p/blob/master/rlpx.md#encrypted-handshake">Structure of the
    initiator request</a>
ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/handshake/ecies/InitiatorHandshakeMessageV1.java