]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: hash-method - Add generic incremental API for hash methods.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Mon, 7 Nov 2022 23:59:18 +0000 (00:59 +0100)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Thu, 9 Oct 2025 08:41:22 +0000 (08:41 +0000)
src/lib/hash-method.h
src/lib/hmac.h
src/lib/sha2.c
src/lib/sha2.h

index c4250de0a7c4ebb468bd77539491f4bcd2add625..fd03f7989056f4f770c5d46d889c8690f83ac511 100644 (file)
@@ -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);
index b32c0394bab9d3a76a2031ce92296d23ac5d783c..071ff25fb690f258bbbaafdb8962fcb14a8af9e4 100644 (file)
@@ -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];
index 77c16b41bdcb2cab346765d21a728520315042c8..1d7116a1f487934179a90a91a8373f52c9bda608 100644 (file)
@@ -32,6 +32,7 @@
  */
 
 #include "lib.h"
+#include "hash-method.h"
 #include "sha2.h"
 
 #define SHFR(x, n)    (x >> n)
index 92bd2c74c68b851335b78c21236db4a1fee53d5c..3e3ff6b8e62b5c1ffa05f48e13003aec76595894 100644 (file)
 #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;