<div dir="ltr"><div><div>Just to beat this dead horse one more time before I shut up. :-)<br><br></div>I wrote a test to investigate the impact of null keys (ephemeral or static) on the chaining key.  For this purpose I classify "entropy collapse" as a scenario where all DH outputs are the null value, making the chaining key completely deterministic even if some of the inputs were non-null.<br><br></div>I found about 40 scenarios in the existing handshake patterns where entropy collapse can occur, listed at the end of this message.  An example:<br><div><div><br>Noise_XK(s, rs): e s<br><br></div><div>In this case, if "e" and "s" are both null, then all DH outputs will be null even if "re" and "rs" were non-null.  Some of the scenarios require mutual collaboration (e.g. "e re") but quite a lot occur when only one side is outputting nulls.  No matter what the other side does, it doesn't help get back to an unpredictable chaining key.<br><br></div><div>If null ephemeral keys are banned, then the list reduces to only 3 scenarios, all one-way patterns.<br></div><div><br>Cheers,<br><br>Rhys.<br><br>Scenarios where entropy collapse occurs if null ephemeral keys are banned:<br><br>Noise_N(rs): rs<br>Noise_X(s, rs): rs<br>Noise_K(s, rs): rs<br><br>Scenarios where entropy collapse can occur due to null keys:<br><br>Noise_N(rs): e<br>Noise_N(rs): rs<br><br>Noise_X(s, rs): e s<br>Noise_X(s, rs): rs<br><br>Noise_K(s, rs): e s<br>Noise_K(s, rs): rs<br><br>Noise_NN(): e<br>Noise_NN(): re<br><br>Noise_NK(rs): e<br>Noise_NK(rs): re rs<br><br>Noise_NX(rs): e<br>Noise_NX(rs): re rs<br><br>Noise_XN(s): e s<br>Noise_XN(s): re<br><br>Noise_XK(s, rs): e s<br>Noise_XK(s, rs): e re<br>Noise_XK(s, rs): re rs<br><br>Noise_XX(s, rs): e s<br>Noise_XX(s, rs): e re<br>Noise_XX(s, rs): re rs<br><br>Noise_XR(s, rs): e s<br>Noise_XR(s, rs): e re<br>Noise_XR(s, rs): re rs<br><br>Noise_KN(s): e s<br>Noise_KN(s): re<br><br>Noise_KK(s, rs): e s<br>Noise_KK(s, rs): re rs<br><br>Noise_KX(s, rs): e s<br>Noise_KX(s, rs): e re<br>Noise_KX(s, rs): re rs<br><br>Noise_IN(s): e s<br>Noise_IN(s): re<br><br>Noise_IK(s, rs): e s<br>Noise_IK(s, rs): re rs<br><br>Noise_IX(s, rs): e s<br>Noise_IX(s, rs): e re<br>Noise_IX(s, rs): re rs<br><br>Noise_XXfallback(s, rs, re): e s<br>Noise_XXfallback(s, rs, re): e re<br>Noise_XXfallback(s, rs, re): re rs<br><br></div></div></div>