[zeromq-dev] CurveZMQ comments

Trevor Perrin trevp at trevp.net
Wed Sep 25 22:03:28 CEST 2013

On Wed, Sep 25, 2013 at 1:08 AM, Pieter Hintjens <ph at imatix.com> wrote:
> On Wed, Sep 25, 2013 at 1:04 AM, Trevor Perrin <trevp at trevp.net> wrote:
>> 1) Since it's running over TCP (not UDP), are the "anti-amplication
>> padding" and "cookie" from CurveCP still needed?
> You can do amplification attacks over TCP,

I believe the "anti-amplification padding" is intended to prevent
"blind amplication attacks" [1], i.e. distributed denial-of-service
attacks where responses are sent to a victim based on forging of
source IPs (eg DNS).

TCP prevents this.  With TCP, all you can do is a "self-DoS" of your
own network by, say, downloading large files, or opening huge numbers
of TCP connections.

DJB argues that his *UDP-based* CurveCP resists this better than TCP
due to its different handling of congestion, retransmits, etc [1].
But I don't believe the anti-amplification padding is relevant to
that.  There are plenty of other ways a client can send small TCP
requests that generate enormous responses (downloading webpages or
movies, for example).

> and the cookie reduces the
> state the server has to hold for unknown clients.  The cookiie
> mechanism might be simplified but at this stage I don't see a problem
> with sticking closely to CurveCP where possible.

The cookie mechanism avoids server state for new-connection requests.
So it's relevant to Dan's UDP-based CurveCP.  But once you're
exchanging TCP data you've already paid that cost.

The downside of the cookie mechanism, aside from bandwidth/complexity,
is that the server's response containing the cookie has to be

If you did without cookies, and also simplified the key agreement
along the "triple-Diffie Hellman" lines I suggested, then you could
have a much simpler first round trip.  Only ephemeral keys would need
to be exchanged (no cryptoboxes, cookies, etc.):

Client -> Server: C'
Client <- Server: S'
Client -> Server: <Encrypted stuff>

>> 2) Assuming the exchange of messages happens over an in-order
>> transport like TCP, would it be possible to "rekey" for forward
>> secrecy as messages are exchanged, so a key compromise at time T would
>> not affect earlier data?  (See discussion of such mechanisms here
>> [1]).
> Presumably, yes. Are you volunteering to do the design work? :)

If you have a stream of ordered messages this is easy (and of course,
you could view a TCP connection as a pair of such streams, once you
add message framing):

  K[i]  : 32-byte keys, where K[0] is from the key agreement
  MK[i] : 32-byte message keys used to encrypt/decrypt the i-th message

  MK[i], K[i] = Salsa20(K[i-1], nonce=0)

In other words:
 * Use Salsa20 with a 32-byte K[i-i] to generate 64 bytes of output
 * Divide that output into MK[i] and K[i]
 * Upon encrypting or decrypting Message[i], securely delete the old
keys and generate MK[i+1].

>> 3) If the client doesn't already have the server's public key, it
>> would presumably need to retrieve it, which would add a 3rd round-trip
>> to the CurveZMQ handshake before data could be sent, on top of the TCP
>> handshake.  That's a lot of latency, would you consider alternatives
>> like:
>>  - Allowing the server's long-term key to be sent in the WELCOME command
>>  - Allowing sending of client data in the INITIATE command
> The client can send data immediately after sending INITIATE, without
> waiting for a reply. It just sends INITIATE and then MESSAGE.

OK, I missed that.

> Why would sending the server key in WELCOME help? The client already
> needs that to send a valid HELLO.

That's an oddity of CurveCP.  I don't see any reason for the HELLO to
encrypt zero padding (perhaps its some anti-DoS measure?).

It would seem fine to return the server's long-term key in the
WELCOME, and would have various benefits:
 - client can detect key changes and notify the user or go query the
directory again
 - cients can use "Trust-on-First-Use" auth methods
 - the handshake could later be extended to return certificates in the
server response

>> 4) While the modifications to the CurveCP key agreement seem to fix
>> the known security problems, the key agreement still seems a bit
>> complicated, and I'm not aware of any security proofs for it.
> Sure. Sticking close to CurveCP means that as more people use that,
> and critique it, we benefit.

Maybe, but I don't know how much other use it's getting, I'm expecting
something like QUIC to draw more attention.

> If you have alternative security mechanisms to propose, that's
> excellent. You may want to read http://hintjens.com/blog:45.
> Concretely, for a new security mechanism for ZeroMQ, we need to:
> * write an RFC (use http://rfc.zeromq.org/spec:24 as a basis, perhaps)
> * write a reference codec
> * write a mechanism in libzmq.
> * build the API for clients and servers to use that.

I'm probably not going to do all that, as I have other projects :-).

But I'd be happy to provide advice / review.


[1] http://curvecp.org/availability.html

More information about the zeromq-dev mailing list