<div dir="ltr"><div class="gmail_quote">Thanks for the comments, Trevor, this is incredibly helpful. I have<br>
some followup questions if you have time.<br>
<span class=""><br>
> (1) If two recipient public keys are identical, this fact would leak<br>
> in the ciphertext.  If I'm one of the recipients I could possibly use<br>
> this to confirm guesses as to other recipients, by providing their<br>
> public keys as mine.<br>
<br>
</span>Good catch, we should totally fix that. It looks like there's two<br>
places where sharing a nonce among the recipients causes this problem:<br>
1) when we box the payload encryption key for each recipient, and 2)<br>
when we compute each recipient's MAC key. I think we could fix both<br>
cases by putting a 4-byte counter at the end of each of the nonces.<br>
(MessagePack's biggest array type has a 4-byte length, so this is<br>
already the theoretical limit on our number of recipients.) Out of<br>
curiosity, since we're relying on random nonce #2 to avoid nonce reuse<br>
between two static keys, is there a size that's generally considered<br>
safe for that? This change would drop us from 24 random bytes down to<br>
20.<br>
<br>
Thinking about this attack brought up a related problem: currently<br>
there's no way for Keybase users to publicly prove that they own a<br>
particular encryption key. Instead, they just claim ownership with a<br>
signed statement from one of their signing keys. So the only<br>
protection I have against you claiming my encryption key as your own,<br>
is that the server can refuse to allow repeats (and make that policy<br>
auditable through our Merkle tree). That's not great. How risky would<br>
it be to use an approach like <a href="https://github.com/dchest/ed2curve-js" rel="noreferrer" target="_blank">https://github.com/dchest/ed2curve-js</a> to<br>
convert a Curve25519 encryption key into an Ed25519 signing key, just<br>
one time when the key is created, to sign a statement about who owns<br>
it?<br>
<span class=""><br>
> (2) The MAC keys only depend on the static-static DH output, not the<br>
> ephemeral-static DH output.  So if I compromise Alice's private key, I<br>
> can tamper with the ciphertext of messages she's previously produced.<br>
> This would be easy to avoid, if the ephemeral-static DH outputs<br>
> contributed to the MAC keys.<br>
<br>
</span>Could you help me picture the attack here? If I've stolen Alice's<br>
private key, I can always generate entirely new messages that appear<br>
to be from her. Is there a situation where reusing one of Alice's old<br>
message headers / ephemeral keys is required?<br>
<span class=""><br>
> (3) On a similar note, it wouldn't hurt if the static-static DH<br>
> outputs contributed to the key used for encrypting payloads.  That<br>
> *might* help in the case where a weak RNG is generating bad ephemeral<br>
> private keys, but somehow the sender's static private key was good.<br>
> But that's a pretty weird case.<br>
<br>
</span>The static-static DH outputs are unique for each recipient, but the<br>
payload encryption key needs to be shared. Is there a way to make that<br>
work?<br>
<br>
Thanks again, Trevor. I'm really glad this list is here.<br>
<span class="HOEnZb"><font color="#888888"><br>
- Jack<br>
</font></span></div><br></div>