Hi Luke,

Thank you very much for your remarks. Some comments below. As Pieter rightly suggested it, let's go on with the CurveCP mailing list as of now.

Cheers,


Laurent.


Le 18/08/2013 23:43, Lucas Hope a écrit :

Hi Laurent,

I had a think about this, and there are a couple of issues with the logic. If there is a vulnerability where you suggest, then that vulnerability would render the whole encryption scheme useless. I guess what I'm saying is that you've found an incredibly huge leak, or it isn't a leak at all.

Sure, but I prefer raising naively the question.

Here's some points.

 *

    The server *does not* know C a priori. C is actually an important
    secret - we don't want attackers to know who exactly is
    communicating with S. The spec says that S *MAY* authenticate C,
    but it doesn't have to. And the client may choose to generate an
    anonymous throwaway 'long term' C.

In my use case, it is desirable that the client is authenticated by the server. And I have understood that CurveCP enables that. Besides, they consider an IP is a very bad authentication method.

 *

    Having a known signature is important, as it validates the
    client's implementation of the algorithm. A random key is not
    something the server can validate against. That validation assures
    the client is saying what they mean to say.

It could be made later in the protocol I think, especially with the same keys than the ones used for messages.

 *

    If the attack you suggest is feasible, then it is probably trivial
    to determine the server's private key in exactly the same way.
    After all, the message is encrypted using a joint shared secret
    computed from either (c', S) or (s, C') - as described in that
    excellent PDF you shared.

I agree.

 *

    Even if the signature was changed to something random, the
    attacker can just connect to the server with their own c'/C', and
    they'll be able to craft whatever 'random' string they like to
    best attack the server - including the current case of all zeros.

That would implies other modifications of the protocol.

 *

    The above two points mean that the vulnerability you describe
    would be more devastating (you steal the server's long term
    private key!), and nis ot actually protected by the randomized
    signature. I think thus that the protocol is well protected if the
    designer is at all worth their salt.

That's a proof by absurd, and you are certainly right.

 *

    (I agree the spec should always put private keys in lower case, it
    is confusing when you're new to the spec).

Just some points which may be wrong. IANAC (I am not a cryptographer :-) ).

Luke

On Sun, Aug 18, 2013 at 8:31 PM, Laurent Alebarde <[email protected] <mailto:[email protected]>> wrote:

    Hi all,

    Studying CurveZMQ, CurveCP, libsodium and NaCl, I find it good to
    discuss possible weaknesses on the protocol, especially the Hello
    packet :

    Notation, I use the modified notation (C',0,Box[0'](c'->S))
    instead of (C',0,Box[0'](C'->S)) from the original
    (http://curvecp.org/packets.html) since it is more clear onto what
    is performed : encryption with server public key and
    authentication with client short term secret key.

    Problem :
    C' is sent in the clear in (C',0,Box[0'](c'->S)) . In theory, it
    is not a problem as it is the base of asymmetric encryption. But
    here, the content of the box is all zeros, meaning a clear text
    attack can be performed to have information on (c', S). As S is
    public, we have leaks on c'. I don't know how far thought. As it
    is a short term key, it may  not be a problem. Who knows ? I am
    not a cryptography expert but I know that avoiding leaks is good.

    Solutions :
      1) Fill the box with random data. From the CurveCP spec,
    "Current servers enforce the 64-byte length requirement but do not
    enforce the all-zero requirement"
    (http://curvecp.org/packets.html), and "They are also an extension
    mechanism". As CurveZMQ embeds a version of the protocol, this is
    pointless, and we can feel the box with random data. Then, we
    avoid any leak on c'.
      2) Why doing the minimum when we can do the maximum for free ?
    It would be nice to put C' in the box and use c instead of c' to
    sign it. C is already known by the server.
So, the final proposition is to replace (C',0,Box[0'](c'->S)) with (F',0,Box[C',R'](c->S)) or (Box[C',R'](c->S)) or
    (Box[C'](c->S)), F' being a fake key and R' random data. C'
    staying secret prevents any attack on c. For future extension,
    half of the box (R') should be enough.
    Remark : If the client is an enemy with wrong c, the server gets
    the enemy C' but cannot tell if it is friend or foe.

    There might be implications on the next packets. But I would like
    your remarks at this stage first.


    Cheers,


    Laurent.



    _______________________________________________
    zeromq-dev mailing list
    [email protected] <mailto:[email protected]>
    http://lists.zeromq.org/mailman/listinfo/zeromq-dev

--
---------------------------------------------------
Dr Lucas Hope - lucas.r.hope@skype
Machine Learning and Software Engineering Consultant
Melbourne, Australia


_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to