<div dir="ltr">In case it helps at all in deciding, here's a practical point of view on the complexity added:<div><br></div><div><div class="" style="font-weight:bold;margin-top:1em;color:black;font-family:monospace;font-size:13.3333px;white-space:pre">diff --git a/src/crypto/blake2b.c b/src/crypto/blake2b.c<br>index a87e714..e45e71a 100644<br>--- a/<a href="http://git.zx2c4.com/WireGuard/tree/src/crypto/blake2b.c?id=cb3a2550d4111325b4a101fb0fdf2bed3d82313c" style="color:blue;text-decoration:none">src/crypto/blake2b.c</a><br>+++ b/<a href="http://git.zx2c4.com/WireGuard/tree/src/crypto/blake2b.c?id=b2a846defbde29cab1f0d4fbdfe898cd96ead855" style="color:blue;text-decoration:none">src/crypto/blake2b.c</a></div><div class="" style="color:rgb(0,0,153);font-family:monospace;font-size:13.3333px;white-space:pre">@@ -290,6 +290,45 @@ void blake2b(uint8_t *out, const uint8_t *in, const uint8_t *key, const uint8_t</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre">         blake2b_final(&state, out, outlen);</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> }</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> </div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+void blake2b_hmac(uint8_t *out, const uint8_t *in, const uint8_t *key, const uint8_t outlen, const uint64_t inlen, const uint64_t keylen)</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+{</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+      blake2b_state state;</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+      uint8_t o_key[BLAKE2B_BLOCKBYTES] = { 0 };</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+        uint8_t i_key[BLAKE2B_BLOCKBYTES] = { 0 };</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+        uint8_t i_hash[BLAKE2B_OUTBYTES];</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+ uint8_t i;</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+  if (keylen > BLAKE2B_BLOCKBYTES) {</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+             blake2b_init(&state, BLAKE2B_OUTBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+               blake2b_update(&state, key, keylen);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+          blake2b_final(&state, o_key, BLAKE2B_OUTBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+               memcpy(i_key, o_key, BLAKE2B_OUTBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+   } else {</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+          memcpy(o_key, key, keylen);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+               memcpy(i_key, key, keylen);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+       }</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+   for (i = 0; i < BLAKE2B_BLOCKBYTES; ++i) {</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+             o_key[i] ^= 0x5c;</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+         i_key[i] ^= 0x36;</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+ }</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+   blake2b_init(&state, BLAKE2B_OUTBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+       blake2b_update(&state, i_key, BLAKE2B_BLOCKBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+    blake2b_update(&state, in, inlen);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+    blake2b_final(&state, i_hash, BLAKE2B_OUTBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+        blake2b_init(&state, BLAKE2B_OUTBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+       blake2b_update(&state, o_key, BLAKE2B_BLOCKBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+    blake2b_update(&state, i_hash, BLAKE2B_OUTBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+     blake2b_final(&state, i_hash, BLAKE2B_OUTBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+        memcpy(out, i_hash, outlen);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+      memzero_explicit(o_key, BLAKE2B_BLOCKBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+      memzero_explicit(i_key, BLAKE2B_BLOCKBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+      memzero_explicit(i_hash, BLAKE2B_OUTBYTES);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+}</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> #ifdef DEBUG</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> </div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> #include "blake2b_selftest.h"</div><div class="" style="font-weight:bold;margin-top:1em;color:black;font-family:monospace;font-size:13.3333px;white-space:pre">diff --git a/src/crypto/blake2b.h b/src/crypto/blake2b.h<br>index 7a2180f..1b4e659 100644<br>--- a/<a href="http://git.zx2c4.com/WireGuard/tree/src/crypto/blake2b.h?id=cb3a2550d4111325b4a101fb0fdf2bed3d82313c" style="color:blue;text-decoration:none">src/crypto/blake2b.h</a><br>+++ b/<a href="http://git.zx2c4.com/WireGuard/tree/src/crypto/blake2b.h?id=b2a846defbde29cab1f0d4fbdfe898cd96ead855" style="color:blue;text-decoration:none">src/crypto/blake2b.h</a></div><div class="" style="color:rgb(0,0,153);font-family:monospace;font-size:13.3333px;white-space:pre">@@ -30,6 +30,8 @@ void blake2b_init_key(blake2b_state *state, const uint8_t outlen, const void *ke</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> void blake2b_update(blake2b_state *state, const uint8_t *in, uint64_t inlen);</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> void blake2b_final(blake2b_state *state, uint8_t *out, uint8_t outlen);</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> </div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+void blake2b_hmac(uint8_t *out, const uint8_t *in, const uint8_t *key, const uint8_t outlen, const uint64_t inlen, const uint64_t keylen);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> #ifdef DEBUG</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> void blake2b_selftest(void);</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> #endif</div><div class="" style="font-weight:bold;margin-top:1em;color:black;font-family:monospace;font-size:13.3333px;white-space:pre">diff --git a/src/noise/key.c b/src/noise/key.c<br>index f005dbf..ca59c5d 100644<br>--- a/<a href="http://git.zx2c4.com/WireGuard/tree/src/noise/key.c?id=cb3a2550d4111325b4a101fb0fdf2bed3d82313c" style="color:blue;text-decoration:none">src/noise/key.c</a><br>+++ b/<a href="http://git.zx2c4.com/WireGuard/tree/src/noise/key.c?id=b2a846defbde29cab1f0d4fbdfe898cd96ead855" style="color:blue;text-decoration:none">src/noise/key.c</a></div><div class="" style="color:rgb(0,0,153);font-family:monospace;font-size:13.3333px;white-space:pre">@@ -8,8 +8,10 @@</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> static inline void kdf(u8 first_dst[NOISE_SYMMETRIC_KEY_LEN], u8 second_dst[NOISE_SYMMETRIC_KEY_LEN],</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre">                   const u8 chaining_key[NOISE_SYMMETRIC_KEY_LEN], const u8 *data, size_t data_len)</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre"> {</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+       static const u8 one = 1;</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre">      u8 temp_key[BLAKE2B_OUTBYTES];</div><div class="" style="color:red;font-family:monospace;font-size:13.3333px;white-space:pre">- blake2b(temp_key, data, chaining_key, BLAKE2B_OUTBYTES, data_len, NOISE_SYMMETRIC_KEY_LEN);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+       blake2b_hmac(temp_key, data, chaining_key, BLAKE2B_OUTBYTES, data_len, NOISE_SYMMETRIC_KEY_LEN);</div><div class="" style="color:green;font-family:monospace;font-size:13.3333px;line-height:normal;white-space:pre">+  blake2b_hmac(temp_key, &one, temp_key, BLAKE2B_OUTBYTES, 1, BLAKE2B_OUTBYTES);</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre">    memcpy(first_dst, temp_key, NOISE_SYMMETRIC_KEY_LEN);</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre">         memcpy(second_dst, temp_key + NOISE_SYMMETRIC_KEY_LEN, NOISE_SYMMETRIC_KEY_LEN);</div><div class="" style="color:rgb(51,51,51);font-family:monospace;font-size:13.3333px;white-space:pre">      memzero_explicit(temp_key, BLAKE2B_OUTBYTES);</div></div></div>