From: Stephan Bosch Date: Mon, 7 Nov 2022 23:59:18 +0000 (+0100) Subject: lib: hash-method - Add generic incremental API for hash methods. X-Git-Tag: 2.4.2~148 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fad88e20902089cfc6ef5c970fb4f2480f558e52;p=thirdparty%2Fdovecot%2Fcore.git lib: hash-method - Add generic incremental API for hash methods. --- diff --git a/src/lib/hash-method.h b/src/lib/hash-method.h index c4250de0a7..fd03f79890 100644 --- a/src/lib/hash-method.h +++ b/src/lib/hash-method.h @@ -2,6 +2,9 @@ #define HASH_METHOD_H #include "buffer.h" +#include "sha2.h" + +#define HASH_METHOD_MAX_CONTEXT_SIZE sizeof(struct sha512_ctx) struct hash_method { const char *name; @@ -17,11 +20,40 @@ struct hash_method { void (*result)(void *context, unsigned char *digest_r); }; +struct hash_method_context { + char ctx[HASH_METHOD_MAX_CONTEXT_SIZE]; + const struct hash_method *hash; +}; + const struct hash_method *hash_method_lookup(const char *name); /* NULL-terminated list of all hash methods */ extern const struct hash_method *hash_methods[]; +static inline void +hash_method_init(struct hash_method_context *ctx, + const struct hash_method *meth) +{ + i_assert(meth->context_size <= HASH_METHOD_MAX_CONTEXT_SIZE); + + i_zero(ctx); + ctx->hash = meth; + + ctx->hash->init(ctx->ctx); +} + +static inline void +hash_method_loop(struct hash_method_context *ctx, const void *data, size_t size) +{ + ctx->hash->loop(ctx->ctx, data, size); +} + +static inline void +hash_method_result(struct hash_method_context *ctx, unsigned char *digest_r) +{ + ctx->hash->result(ctx->ctx, digest_r); +} + void hash_method_get_digest(const struct hash_method *meth, const void *data, size_t data_len, unsigned char *result_r); diff --git a/src/lib/hmac.h b/src/lib/hmac.h index b32c0394ba..071ff25fb6 100644 --- a/src/lib/hmac.h +++ b/src/lib/hmac.h @@ -5,7 +5,7 @@ #include "sha1.h" #include "sha2.h" -#define HMAC_MAX_CONTEXT_SIZE sizeof(struct sha512_ctx) +#define HMAC_MAX_CONTEXT_SIZE HASH_METHOD_MAX_CONTEXT_SIZE struct hmac_context_priv { char ctx[HMAC_MAX_CONTEXT_SIZE]; diff --git a/src/lib/sha2.c b/src/lib/sha2.c index 77c16b41bd..1d7116a1f4 100644 --- a/src/lib/sha2.c +++ b/src/lib/sha2.c @@ -32,6 +32,7 @@ */ #include "lib.h" +#include "hash-method.h" #include "sha2.h" #define SHFR(x, n) (x >> n) diff --git a/src/lib/sha2.h b/src/lib/sha2.h index 92bd2c74c6..3e3ff6b8e6 100644 --- a/src/lib/sha2.h +++ b/src/lib/sha2.h @@ -34,9 +34,10 @@ #ifndef SHA2_H #define SHA2_H -#include "hash-method.h" #include "sha-common.h" +struct hash_method; + struct sha256_ctx { uint64_t tot_len; size_t len;