Re: CORE Key Exchange

Willow Liquorice <[email protected]> Wed, 6 Nov 2024 11:37:11 +0000
Newsgroups gmane.network.gnunet.devel
Message-ID <[email protected]>
I was really asking more generally about how the key exchange fits in 
with CONG.

Regards,
	Willow Liquorice

On 06/11/2024 11:32, Martin Schanzenbach wrote:
> Am Mittwoch, dem 06.11.2024 um 11:21 +0000 schrieb Willow Liquorice:
>> I am a little surprised that GNUnet's transport layer relies on
>> bidirectional communication between peers. Hypothetical
>> steganographic
>> communicators, or sneakernet connections, may not have that luxury.
> 
> Communicators may be uni-directional. But a virtual link that is of any
> use for CORE connections MUST have a bi-directional communication
> channel.
> That may go via two different communicators. For example, you may have
> a UDP communicator that only allows you to send messages, and an
> incoming communicator via Sattelite (we have no such communicator atm)
> the allows you to receive.
> 
> IF you can establish a send/receive connection (Think SYN, ACK) via any
> communicator combination with a peer, it becomes a "confirmed" virtual
> link that is usable for CORE to do a KX and offer this connection to
> higher layers.
> 
> See also:
> https://docs.gnunet.org/latest/users/subsystems.html#design-goals-of-tng
> 
>>
>> How does this fit in with the GNUnet-CONG project to interoperate
>> with
>> libp2p?
> 
> I do not know. Is libp2p not always bi-directional?
> 
> BR
> Martin
> 
>>
>> Regards,
>> 	Willow Liquorice
>>
>> On 06/11/2024 10:39, Martin Schanzenbach wrote:
>>> Hi,
>>>
>>> I would like to restart the discussion on the ML here again as I
>>> keep
>>> forgetting what we established and what the way forward is and I
>>> think
>>> it is better to discuss this "out in the open".
>>>
>>> Our current "PingPong" KX in CORE seems quite odd and complex to me
>>> and
>>> the requirements fuzzy.
>>> In a nutshell, the protocol tries to establish a DH secret and it
>>> goes
>>> something like:
>>>
>>>
>>> 0. MyPeerID: Generate an "ephemeral" DH key pair and sign it with
>>> PeerID private key. Lets call this "cert"
>>> 1. MyPeerID: If MyPeerID > OtherPeerID goto 2; otherwise wait T
>>> time
>>> and then goto 2
>>> 2. PyPeerID: Send "cert" to OtherPeerID (Ping)
>>> 3. OtherPeerID: Calculates the DH secret from ephemeral public key
>>> in
>>> "cert" and its own ephemeral DH key (from 0)
>>> 4. OtherPeerID: Confirms handshake by sending message back; sending
>>> its
>>> own "cert" (Pong).
>>> 5. MyPeerID calculates the DH secret from ephemeral public key of
>>> OtherPeerID in "cert".
>>>
>>> Now, I have various issues with the protocol:
>>>
>>> a. Freshness: We should use nonces, which we don't and can't for
>>> reasons including the following
>>> b. Static DH key: The "ephemeral" DH key is actually static across
>>> handshakes with other peers and across the rekey interval (or key
>>> validity period, whatever you want to call it).
>>> c. The KX transcript is not signed/verified
>>> d. The roles are not clear.
>>>
>>> Now, the issues seem to stem from the idea that we do not know
>>> which
>>> peer initiates the handshake, so we cannot know which role a peer
>>> is
>>> in.
>>> In fact, the KX could be initiatet theoretically from both peers at
>>> the
>>> same time, and we need to take this into account.
>>> Peers determine a KX initiation based on various factors, for
>>> example a
>>> peer may just have learned of the existance of the other peer, just
>>> started, etc.
>>> This is why the protocol (Steps 0-5) may (within the key validity
>>> period overlap of both PeerIDs) converge to the same DH secret
>>> regardless of role and KX flow (and yes, this is bad from
>>> security/crypto view).
>>> The state machine to make this happen is implemented, as far as I
>>> can
>>> see, but I am not sure how well this actually works in practice
>>> given
>>> that we see some erratic behaviour from CORE and regular bug
>>> reports
>>> regarding connectivity (even to the bootstrap peer).
>>>
>>>
>>> Now, I would really like to converge to a semi-standard, known
>>> secure
>>> KX protocol for CORE that has clear requirements and is much more
>>> streamlined.
>>> As already discussed, I have drafted a KEMTLS-inspired handshake
>>> here
>>> with 1.5 RTT:
>>> https://docs.gnunet.org/master/developers/apis/cong.html#handshake-protocol-draft
>>>
>>>
>>> I also started to document the current protocol, but it is very
>>> complex
>>> due to its state machine and 3RTT+.
>>>
>>> My Idea: IF we can agree that transport only notifies CORE of a
>>> connection if it can send AND receive messages from that peer (bi-
>>> directional connectivity, which afair is the case in transport
>>> right
>>> now), I strongly believe that we can simply rely on protocol Step 1
>>> that a KX is initiated _at all_.
>>> It can still happen that two KX are initiated one from each peer at
>>> the
>>> same time.
>>> But in this case, since we assume that we have bi-directional
>>> comms, we
>>> can simply drop the "late" initiator message on one side based on
>>> the
>>> same condition in Step 1.
>>>
>>> Wdyt? Any comments?
>>>
>>> BR
>>> Martin
>>
>