aboutsummaryrefslogtreecommitdiffstats
path: root/hmac_init.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2019-02-10 18:37:36 +0100
committerMattias Andrée <maandree@kth.se>2019-02-10 18:38:25 +0100
commit958abe25e6882f772ff4bebfe72cca89b4b0ff8c (patch)
treefc57339324c67166d4a94803e136f82b8ff7a0f6 /hmac_init.c
parentImprove makefile (diff)
downloadlibsha2-958abe25e6882f772ff4bebfe72cca89b4b0ff8c.tar.gz
libsha2-958abe25e6882f772ff4bebfe72cca89b4b0ff8c.tar.bz2
libsha2-958abe25e6882f772ff4bebfe72cca89b4b0ff8c.tar.xz
HMAC: fix support for key lengths that are not multiples of 8
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'hmac_init.c')
-rw-r--r--hmac_init.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/hmac_init.c b/hmac_init.c
index 17b31ce..b60ebef 100644
--- a/hmac_init.c
+++ b/hmac_init.c
@@ -29,10 +29,14 @@ libsha2_hmac_init(struct libsha2_hmac_state *restrict state, enum libsha2_algori
if (keylen <= state->sha2_state.chunk_size * 8) {
memset(state->ipad, 0x36, sizeof(state->ipad));
memset(state->opad, 0x5C, sizeof(state->opad));
- for (i = 0, keylen /= 8; i < keylen; i++) {
+ for (i = 0; i < keylen / 8; i++) {
state->ipad[i] ^= key[i];
state->opad[i] ^= key[i];
}
+ if (keylen & 7) {
+ state->ipad[i] ^= (unsigned char)(key[i] << (8 - (keylen & 7)));
+ state->opad[i] ^= (unsigned char)(key[i] << (8 - (keylen & 7)));
+ }
} else {
memset(state->ipad, 0, sizeof(state->ipad));
if (libsha2_init(&state->sha2_state, algorithm))