<p dir="ltr">On 22 Dec 2015 10:40 pm, "Max Skibinsky" <<a href="mailto:max@skibinsky.com">max@skibinsky.com</a>> wrote:<br>
><br>
> double check. I assume server verification function you meant should<br>
> be something like concat(nonce, timestamp, verify_token, HMAC(<br>
> concat(nonce, timestamp, verify_token)) ? difficulty is constant<br>
> value, so it doesn’t add much to verification. what needs to be<br>
> verified is POW nonce joining recent timestamp with given<br>
> verify_token. Relay still will need to cache verify_token while<br>
> handshake is in progress, yet that’s one token less than current<br>
> footprint.</p>
<p dir="ltr">No, include the difficulty in the token and HMAC. And the server shouldn't need to store anything, when it receives the token back it uses the HMAC to ensure that the token was issued by the server. </p>
<p dir="ltr">> One potential issue (need to think more): now POW will be dependent on<br>
> timestamp (which can *not* be removed in this case; contrast with<br>
> current ver where client_token plays the role of static id of client<br>
> request) - at some difficulty setting weaker clients may not finish<br>
> POW in time to complete the handshake.</p>
<p dir="ltr">Just allow the token to last long enough, you just need to increase the size of the "used token" list to compensate.</p>
<p dir="ltr">><br>
> If I understand correctly what you are suggesting:<br>
> - create long-term identity for relay itself<br>
> - let no-TLS relay owners use that identity to verify their own<br>
> self-deployed relay?<br>
> - first message from relay will be effectively an "advertisement" of<br>
> that self-made cert?</p>
<p dir="ltr">No, just have a static c25519 keypair on the relay r_lt_sk, r_lt_pk. When generating the session key the client does DH with both r_lt_pk and r_sess_pk and includes both into the hash. Client also ensures r_lt_pk hasn't changed since last time. You also then need to handle cases where server updates long term keys.</p>
<p dir="ltr">Alternatively, just fully trust TLS and make that explicit. This is probably the better route.</p>
<p dir="ltr">><br>
> > 3) What is the reason to use H2 instead of just a single hash iteration?<br>
><br>
> afaik double hashing was created as protection against length<br>
> extension attacks. Ferguson & Schneier first suggested Hdbl(m) =<br>
> h(h(m) || m) in [1]. Yevgeniy had been researching security of such<br>
> constructs in [2] - they analyzed and proved that sha256(sha256( 0^32<br>
> || msg)) has strong security, so we followed his recommendation.</p>
<p dir="ltr">I'm not sure you care about length extension for much of this (you aren't doing any keyed hashes). And for the parts you would (i.e. HMAC constructions), NACL has a proper HMAC implementation.</p>
<p dir="ltr">> > 5) Why use encryption of a secret as the ZKP of a_comm_pk? A signature would be the more conventional route.<br>
><br>
> That is indeed a gnarly part, good catch. Main reason is the limit of<br>
> a library we had to work with. Nacl uses different key formats for<br>
> encryption (crypto_box) and signatures (crypto_sign). We based our web<br>
> stack on nacl-js, which doesn’t yet support for conversion between<br>
> these 2 types. So the judgment call was to either create<br>
> unproven/untested code that will do sophisticated key converstion, or<br>
> accept slightly bizzare structuring of the protocol, but keep all<br>
> execution paths 100% within proven nacl functions. The latter seemed<br>
> like significantly less risky choice.</p>
<p dir="ltr">Yes, good point. It would still be more idiomatic to use a HMAC instead of the encryption. You use the same key in both. </p>
<p dir="ltr">> endpoint _without_ its own HPK, but who can message another HPK? Any<br>
> specific use cases for such “send only” clients? I’m a bit warry about<br>
> allowing this: if they don’t have own HPK, they are effecitively<br>
> becoming unlimited “anon” users, and zax can not verify anything about<br>
> them before accepting communications. Maybe you have specific use<br>
> cases in mind that would allow to make requirements a bit tighter and<br>
> avoid wide open case of “any anon” => HPK communications?</p>
<p dir="ltr">Anyone can generate a new keypair and HPK, so you allow anon anyway. I was suggesting that since you treat the payload as an opaque blob you may have the option of a small send-only device that just uses, e.g. symmetric key encryption for messages. It would then just add complexity to force it to handle asymmetric crypto just to send a message.<br>
</p>