aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/siphash/siphash.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/siphash/siphash.c')
-rw-r--r--crypto/siphash/siphash.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/crypto/siphash/siphash.c b/crypto/siphash/siphash.c
index ff84a29f8215..be74a38d934d 100644
--- a/crypto/siphash/siphash.c
+++ b/crypto/siphash/siphash.c
@@ -94,7 +94,19 @@ int SipHash_set_hash_size(SIPHASH *ctx, size_t hash_size)
&& hash_size != SIPHASH_MAX_DIGEST_SIZE)
return 0;
- ctx->hash_size = hash_size;
+ /*
+ * It's possible that the key was set first. If the hash size changes,
+ * we need to adjust v1 (see SipHash_Init().
+ */
+
+ /* Start by adjusting the stored size, to make things easier */
+ ctx->hash_size = siphash_adjust_hash_size(ctx->hash_size);
+
+ /* Now, adjust ctx->v1 if the old and the new size differ */
+ if ((size_t)ctx->hash_size != hash_size) {
+ ctx->v1 ^= 0xee;
+ ctx->hash_size = hash_size;
+ }
return 1;
}