]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
hmac: Fixed crashes on CPUs that don't allow unaligned memory access.
authorTimo Sirainen <tss@iki.fi>
Sun, 8 Sep 2013 16:20:39 +0000 (19:20 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 8 Sep 2013 16:20:39 +0000 (19:20 +0300)
src/lib/hmac-cram-md5.c
src/lib/hmac.c
src/lib/hmac.h

index f0d9213924fc78be74bee19bec59461db669b010..8738a8ed51c48eb4c66509c9d6a624f2b66e9c61 100644 (file)
@@ -9,9 +9,10 @@
 #include "md5.h"
 #include "hmac-cram-md5.h"
 
-void hmac_md5_get_cram_context(struct hmac_context *hmac_ctx,
+void hmac_md5_get_cram_context(struct hmac_context *_hmac_ctx,
                        unsigned char context_digest[CRAM_MD5_CONTEXTLEN])
 {
+       struct hmac_context_priv *hmac_ctx = &_hmac_ctx->u.priv;
        unsigned char *cdp;
 
        struct md5_context *ctx = (void*)hmac_ctx->ctx;
@@ -34,9 +35,10 @@ void hmac_md5_get_cram_context(struct hmac_context *hmac_ctx,
        CDPUT(cdp, ctx->d);
 }
 
-void hmac_md5_set_cram_context(struct hmac_context *hmac_ctx,
+void hmac_md5_set_cram_context(struct hmac_context *_hmac_ctx,
                        const unsigned char context_digest[CRAM_MD5_CONTEXTLEN])
 {
+       struct hmac_context_priv *hmac_ctx = &_hmac_ctx->u.priv;
        const unsigned char *cdp;
 
        struct md5_context *ctx = (void*)hmac_ctx->ctx;
index baeded5498ca9d147e213e4b05c3c99f34a95174..2d380433ef119ae5ecf2278e1da211f2fc2295ac 100644 (file)
 #include "hmac.h"
 #include "safe-memset.h"
 
-void hmac_init(struct hmac_context *ctx, const unsigned char *key,
+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];
@@ -49,8 +50,10 @@ void hmac_init(struct hmac_context *ctx, const unsigned char *key,
        safe_memset(k_opad, 0, 64);
 }
 
-void hmac_final(struct hmac_context *ctx, unsigned char *digest)
+void hmac_final(struct hmac_context *_ctx, unsigned char *digest)
 {
+       struct hmac_context_priv *ctx = &_ctx->u.priv;
+
        ctx->hash->result(ctx->ctx, digest);
 
        ctx->hash->loop(ctx->ctxo, digest, ctx->hash->digest_size);
index 375f195e03e6cf021f45d0c0cf7084ee85b40dbe..7e68cd0966199b43767816215f334d2665374132 100644 (file)
@@ -6,20 +6,29 @@
 
 #define HMAC_MAX_CONTEXT_SIZE 256
 
-struct hmac_context {
+struct hmac_context_priv {
        char ctx[HMAC_MAX_CONTEXT_SIZE];
        char ctxo[HMAC_MAX_CONTEXT_SIZE];
        const struct hash_method *hash;
 };
 
+struct hmac_context {
+       union {
+               struct hmac_context_priv priv;
+               uint64_t padding_requirement;
+       } u;
+};
+
 void hmac_init(struct hmac_context *ctx, const unsigned char *key,
                size_t key_len, const struct hash_method *meth);
 void hmac_final(struct hmac_context *ctx, unsigned char *digest);
 
 
 static inline void
-hmac_update(struct hmac_context *ctx, const void *data, size_t size)
+hmac_update(struct hmac_context *_ctx, const void *data, size_t size)
 {
+       struct hmac_context_priv *ctx = &_ctx->u.priv;
+
        ctx->hash->loop(ctx->ctx, data, size);
 }