]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: hmac - Support different hash algorithms
authorAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 3 Dec 2020 14:33:06 +0000 (16:33 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 7 Dec 2020 10:09:56 +0000 (10:09 +0000)
Code was hardcoded for MD4,MD5,SHA-1.

src/lib/hmac.c

index 6d743c961dccb99d81920123862f5df49a7a5355..0138a4a61a43d40331fd302cd74eb9d5deba5ab2 100644 (file)
@@ -18,16 +18,16 @@ void hmac_init(struct hmac_context *_ctx, const unsigned char *key,
                size_t key_len, const struct hash_method *meth)
 {
        struct hmac_context_priv *ctx = &_ctx->u.priv;
-       int i;
-       unsigned char k_ipad[64];
-       unsigned char k_opad[64];
+       unsigned int i;
+       unsigned char k_ipad[meth->block_size];
+       unsigned char k_opad[meth->block_size];
        unsigned char hashedkey[meth->digest_size];
 
        i_assert(meth->context_size <= HMAC_MAX_CONTEXT_SIZE);
 
        ctx->hash = meth;
 
-       if (key_len > 64) {
+       if (key_len > meth->block_size) {
                meth->init(ctx->ctx);
                meth->loop(ctx->ctx, key, key_len);
                meth->result(ctx->ctx, hashedkey);
@@ -36,21 +36,21 @@ void hmac_init(struct hmac_context *_ctx, const unsigned char *key,
        }
 
        memcpy(k_ipad, key, key_len);
-       memset(k_ipad + key_len, 0, 64 - key_len);
-       memcpy(k_opad, k_ipad, 64);
+       memset(k_ipad + key_len, 0, meth->block_size - key_len);
+       memcpy(k_opad, k_ipad, meth->block_size);
 
-       for (i = 0; i < 64; i++) {
+       for (i = 0; i < meth->block_size; i++) {
                k_ipad[i] ^= 0x36;
                k_opad[i] ^= 0x5c;
        }
 
        meth->init(ctx->ctx);
-       meth->loop(ctx->ctx, k_ipad, 64);
+       meth->loop(ctx->ctx, k_ipad, meth->block_size);
        meth->init(ctx->ctxo);
-       meth->loop(ctx->ctxo, k_opad, 64);
+       meth->loop(ctx->ctxo, k_opad, meth->block_size);
 
-       safe_memset(k_ipad, 0, 64);
-       safe_memset(k_opad, 0, 64);
+       safe_memset(k_ipad, 0, meth->block_size);
+       safe_memset(k_opad, 0, meth->block_size);
 }
 
 void hmac_final(struct hmac_context *_ctx, unsigned char *digest)