diff options
Diffstat (limited to 'drivers/net/wireguard/noise.c')
| -rw-r--r-- | drivers/net/wireguard/noise.c | 45 | 
1 files changed, 39 insertions, 6 deletions
| diff --git a/drivers/net/wireguard/noise.c b/drivers/net/wireguard/noise.c index c0cfd9b36c0b..720952b92e78 100644 --- a/drivers/net/wireguard/noise.c +++ b/drivers/net/wireguard/noise.c @@ -302,6 +302,41 @@ void wg_noise_set_static_identity_private_key(  		static_identity->static_public, private_key);  } +static void hmac(u8 *out, const u8 *in, const u8 *key, const size_t inlen, const size_t keylen) +{ +	struct blake2s_state state; +	u8 x_key[BLAKE2S_BLOCK_SIZE] __aligned(__alignof__(u32)) = { 0 }; +	u8 i_hash[BLAKE2S_HASH_SIZE] __aligned(__alignof__(u32)); +	int i; + +	if (keylen > BLAKE2S_BLOCK_SIZE) { +		blake2s_init(&state, BLAKE2S_HASH_SIZE); +		blake2s_update(&state, key, keylen); +		blake2s_final(&state, x_key); +	} else +		memcpy(x_key, key, keylen); + +	for (i = 0; i < BLAKE2S_BLOCK_SIZE; ++i) +		x_key[i] ^= 0x36; + +	blake2s_init(&state, BLAKE2S_HASH_SIZE); +	blake2s_update(&state, x_key, BLAKE2S_BLOCK_SIZE); +	blake2s_update(&state, in, inlen); +	blake2s_final(&state, i_hash); + +	for (i = 0; i < BLAKE2S_BLOCK_SIZE; ++i) +		x_key[i] ^= 0x5c ^ 0x36; + +	blake2s_init(&state, BLAKE2S_HASH_SIZE); +	blake2s_update(&state, x_key, BLAKE2S_BLOCK_SIZE); +	blake2s_update(&state, i_hash, BLAKE2S_HASH_SIZE); +	blake2s_final(&state, i_hash); + +	memcpy(out, i_hash, BLAKE2S_HASH_SIZE); +	memzero_explicit(x_key, BLAKE2S_BLOCK_SIZE); +	memzero_explicit(i_hash, BLAKE2S_HASH_SIZE); +} +  /* This is Hugo Krawczyk's HKDF:   *  - https://eprint.iacr.org/2010/264.pdf   *  - https://tools.ietf.org/html/rfc5869 @@ -322,14 +357,14 @@ static void kdf(u8 *first_dst, u8 *second_dst, u8 *third_dst, const u8 *data,  		 ((third_len || third_dst) && (!second_len || !second_dst))));  	/* Extract entropy from data into secret */ -	blake2s256_hmac(secret, data, chaining_key, data_len, NOISE_HASH_LEN); +	hmac(secret, data, chaining_key, data_len, NOISE_HASH_LEN);  	if (!first_dst || !first_len)  		goto out;  	/* Expand first key: key = secret, data = 0x1 */  	output[0] = 1; -	blake2s256_hmac(output, output, secret, 1, BLAKE2S_HASH_SIZE); +	hmac(output, output, secret, 1, BLAKE2S_HASH_SIZE);  	memcpy(first_dst, output, first_len);  	if (!second_dst || !second_len) @@ -337,8 +372,7 @@ static void kdf(u8 *first_dst, u8 *second_dst, u8 *third_dst, const u8 *data,  	/* Expand second key: key = secret, data = first-key || 0x2 */  	output[BLAKE2S_HASH_SIZE] = 2; -	blake2s256_hmac(output, output, secret, BLAKE2S_HASH_SIZE + 1, -			BLAKE2S_HASH_SIZE); +	hmac(output, output, secret, BLAKE2S_HASH_SIZE + 1, BLAKE2S_HASH_SIZE);  	memcpy(second_dst, output, second_len);  	if (!third_dst || !third_len) @@ -346,8 +380,7 @@ static void kdf(u8 *first_dst, u8 *second_dst, u8 *third_dst, const u8 *data,  	/* Expand third key: key = secret, data = second-key || 0x3 */  	output[BLAKE2S_HASH_SIZE] = 3; -	blake2s256_hmac(output, output, secret, BLAKE2S_HASH_SIZE + 1, -			BLAKE2S_HASH_SIZE); +	hmac(output, output, secret, BLAKE2S_HASH_SIZE + 1, BLAKE2S_HASH_SIZE);  	memcpy(third_dst, output, third_len);  out: |