[OTR-dev] The mpOTR diary: multiparty tripleDH

George Kadianakis desnacked at riseup.net
Wed Dec 18 10:52:34 EST 2013


I've been thinking of modifying tripleDH for the multiparty scenario
since I read:
https://whispersystems.org/blog/simplifying-otr-deniability/

Doing tripleDH pairwise is definitely possible, but a broadcast
variant is more fun.

My naive idea: Let's assume n participants P_1...P_n. Each participant
P_i has long-term Diffie-Hellman (public key, private key) as (PK_i,
SK_i).

a) Each participant P_i generates ephemeral DH keypair (pk_i, sk_i).

b) Each participant publishes their public keys (both ephemeral and
   long-term). That is, they publish (PK_i, pk_i).         [0]

c) Each participant collects public keys till all n are received (or
   timeout happens XXX).

d) Each participant generates a group key by doing a tripleDH with
   each other participant, concatenating the resulting secrets and
   plugging them in a KDF. That is, for participant P_1, we have:
            k = KDF[DH(PK_1, pk_2), DH(pk_1, PK_2), DH(pk_1, pk_2),
                    DH(PK_1, pk_3), DH(pk_1, PK_3), DH(pk_1, pk_3),
                    DH(PK_1, pk_4), DH(pk_1, PK_4), DH(pk_1, pk_4),
                    ...,
                    DH(PK_1, pk_N), DH(pk_1, PK_N), DH(pk_1, pk_N)]

e) Optional but probably needed: Each participant sends key
   confirmation using the key 'k'.

Trevor, have you played around with this idea?

(Alternatively, maybe the tripleDH scheme could be combined with the
Burmester-Desmedt broadcast cyclic group key agreement scheme [1] to
make a broadcast protocol.)

[0]: Even though it's not required, we need to send our long-term
     public key in that message, otherwise the other party won't know
     which long-term key to use to do the DH operations.

     This is unfortunate, because a protocol that doesn't reveal
     public keys to a passive adversary is quite interesting (I think
     this property is called 'identity hiding' or 'unlinkability' or
     'anonymity'). With such a protocol, the server (or Eve) wouldn't
     be able to know who communicates with whom. XMPP/IRC-layer
     nicknames could become useless and nyms could be assigned based
     on the public key in the OTR layer. Fun times.

     Unfortunately, I don't see a nice & simple way of avoiding to
     send the long-term public key in the first message, except if the
     receiver brute-forces keys using all the public keys in her
     keychain. This is terrible in large keychains.

     A half-assed solution would be to negotiate an identifier in each
     session, that can be used in the next session instead of the
     long-term public key. So instead of (PK_i, pk_i), the participant
     would send (identifier, pk_i), and the receiver would match the
     identifier to a specific public key. If this is combined with the
     Elligator scheme, (PK_i, pk_i) will be indistinguishalbe from
     (identifier, pk_i).

     Still the above idea is not too good. In the first session, the
     PK_i of the other end is sent in the clear. Also, it doesn't work
     well with people who chat from multiple devices. Also, it's not
     very resistant to compromise (if you get owned, your stored
     identifiers are revealed). Still, I find it interesting to think
     about.
     
[1]: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.50.2268



More information about the OTR-dev mailing list