summaryrefslogtreecommitdiff
path: root/src/hash
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2019-06-14 14:21:32 +0200
committerPatrick Steinhardt <ps@pks.im>2019-06-24 18:26:32 +0200
commitbd48bf3fb9368541bafda7877cf159f94884c187 (patch)
tree4d3a0c761cc6810791f9f9ec2858e41318be999c /src/hash
parentbbf034ab931cd6346420066cbb00cf16ae893510 (diff)
downloadlibgit2-bd48bf3fb9368541bafda7877cf159f94884c187.tar.gz
hash: introduce source files to break include circles
The hash source files have circular include dependencies right now, which shows by our broken generic hash implementation. The "hash.h" header declares two functions and the `git_hash_ctx` typedef before actually including the hash backend header and can only declare the remaining hash functions after the include due to possibly static function declarations inside of the implementation includes. Let's break this cycle and help maintainability by creating a real implementation file for each of the hash implementations. Instead of relying on the exact include order, we now especially avoid the use of `GIT_INLINE` for function declarations.
Diffstat (limited to 'src/hash')
-rw-r--r--src/hash/hash_collisiondetect.c48
-rw-r--r--src/hash/hash_collisiondetect.h34
-rw-r--r--src/hash/hash_common_crypto.c57
-rw-r--r--src/hash/hash_common_crypto.h42
-rw-r--r--src/hash/hash_generic.c18
-rw-r--r--src/hash/hash_generic.h10
-rw-r--r--src/hash/hash_mbedtls.c10
-rw-r--r--src/hash/hash_mbedtls.h9
-rw-r--r--src/hash/hash_openssl.c59
-rw-r--r--src/hash/hash_openssl.h46
-rw-r--r--src/hash/hash_win32.c16
-rw-r--r--src/hash/hash_win32.h13
12 files changed, 207 insertions, 155 deletions
diff --git a/src/hash/hash_collisiondetect.c b/src/hash/hash_collisiondetect.c
new file mode 100644
index 000000000..baf278981
--- /dev/null
+++ b/src/hash/hash_collisiondetect.c
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) the libgit2 contributors. All rights reserved.
+ *
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
+ * a Linking Exception. For full terms see the included COPYING file.
+ */
+
+#include "hash_collisiondetect.h"
+
+int git_hash_global_init(void)
+{
+ return 0;
+}
+
+int git_hash_ctx_init(git_hash_ctx *ctx)
+{
+ return git_hash_init(ctx);
+}
+
+void git_hash_ctx_cleanup(git_hash_ctx *ctx)
+{
+ GIT_UNUSED(ctx);
+}
+
+int git_hash_init(git_hash_ctx *ctx)
+{
+ assert(ctx);
+ SHA1DCInit(&ctx->c);
+ return 0;
+}
+
+int git_hash_update(git_hash_ctx *ctx, const void *data, size_t len)
+{
+ assert(ctx);
+ SHA1DCUpdate(&ctx->c, data, len);
+ return 0;
+}
+
+int git_hash_final(git_oid *out, git_hash_ctx *ctx)
+{
+ assert(ctx);
+ if (SHA1DCFinal(out->id, &ctx->c)) {
+ git_error_set(GIT_ERROR_SHA1, "SHA1 collision attack detected");
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/src/hash/hash_collisiondetect.h b/src/hash/hash_collisiondetect.h
index 743209802..8cba5fe8c 100644
--- a/src/hash/hash_collisiondetect.h
+++ b/src/hash/hash_collisiondetect.h
@@ -9,43 +9,11 @@
#define INCLUDE_hash_hash_collisiondetect_h__
#include "hash.h"
+
#include "sha1dc/sha1.h"
struct git_hash_ctx {
SHA1_CTX c;
};
-#define git_hash_ctx_init(ctx) git_hash_init(ctx)
-#define git_hash_ctx_cleanup(ctx)
-
-GIT_INLINE(int) git_hash_global_init(void)
-{
- return 0;
-}
-
-GIT_INLINE(int) git_hash_init(git_hash_ctx *ctx)
-{
- assert(ctx);
- SHA1DCInit(&ctx->c);
- return 0;
-}
-
-GIT_INLINE(int) git_hash_update(git_hash_ctx *ctx, const void *data, size_t len)
-{
- assert(ctx);
- SHA1DCUpdate(&ctx->c, data, len);
- return 0;
-}
-
-GIT_INLINE(int) git_hash_final(git_oid *out, git_hash_ctx *ctx)
-{
- assert(ctx);
- if (SHA1DCFinal(out->id, &ctx->c)) {
- git_error_set(GIT_ERROR_SHA1, "SHA1 collision attack detected");
- return -1;
- }
-
- return 0;
-}
-
#endif
diff --git a/src/hash/hash_common_crypto.c b/src/hash/hash_common_crypto.c
new file mode 100644
index 000000000..1ad6f4a01
--- /dev/null
+++ b/src/hash/hash_common_crypto.c
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) the libgit2 contributors. All rights reserved.
+ *
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
+ * a Linking Exception. For full terms see the included COPYING file.
+ */
+
+#include "hash_common_crypto.h"
+
+#define CC_LONG_MAX ((CC_LONG)-1)
+
+int git_hash_global_init(void)
+{
+ return 0;
+}
+
+int git_hash_ctx_init(git_hash_ctx *ctx)
+{
+ return git_hash_init(ctx);
+}
+
+void git_hash_ctx_cleanup(git_hash_ctx *ctx)
+{
+ GIT_UNUSED(ctx);
+}
+
+int git_hash_init(git_hash_ctx *ctx)
+{
+ assert(ctx);
+ CC_SHA1_Init(&ctx->c);
+ return 0;
+}
+
+int git_hash_update(git_hash_ctx *ctx, const void *_data, size_t len)
+{
+ const unsigned char *data = _data;
+
+ assert(ctx);
+
+ while (len > 0) {
+ CC_LONG chunk = (len > CC_LONG_MAX) ? CC_LONG_MAX : (CC_LONG)len;
+
+ CC_SHA1_Update(&ctx->c, data, chunk);
+
+ data += chunk;
+ len -= chunk;
+ }
+
+ return 0;
+}
+
+int git_hash_final(git_oid *out, git_hash_ctx *ctx)
+{
+ assert(ctx);
+ CC_SHA1_Final(out->id, &ctx->c);
+ return 0;
+}
diff --git a/src/hash/hash_common_crypto.h b/src/hash/hash_common_crypto.h
index ce352a633..55bec2c1a 100644
--- a/src/hash/hash_common_crypto.h
+++ b/src/hash/hash_common_crypto.h
@@ -16,46 +16,4 @@ struct git_hash_ctx {
CC_SHA1_CTX c;
};
-#define CC_LONG_MAX ((CC_LONG)-1)
-
-#define git_hash_ctx_init(ctx) git_hash_init(ctx)
-#define git_hash_ctx_cleanup(ctx)
-
-GIT_INLINE(int) git_hash_global_init(void)
-{
- return 0;
-}
-
-GIT_INLINE(int) git_hash_init(git_hash_ctx *ctx)
-{
- assert(ctx);
- CC_SHA1_Init(&ctx->c);
- return 0;
-}
-
-GIT_INLINE(int) git_hash_update(git_hash_ctx *ctx, const void *_data, size_t len)
-{
- const unsigned char *data = _data;
-
- assert(ctx);
-
- while (len > 0) {
- CC_LONG chunk = (len > CC_LONG_MAX) ? CC_LONG_MAX : (CC_LONG)len;
-
- CC_SHA1_Update(&ctx->c, data, chunk);
-
- data += chunk;
- len -= chunk;
- }
-
- return 0;
-}
-
-GIT_INLINE(int) git_hash_final(git_oid *out, git_hash_ctx *ctx)
-{
- assert(ctx);
- CC_SHA1_Final(out->id, &ctx->c);
- return 0;
-}
-
#endif
diff --git a/src/hash/hash_generic.c b/src/hash/hash_generic.c
index 7b33b6194..55fbf8de5 100644
--- a/src/hash/hash_generic.c
+++ b/src/hash/hash_generic.c
@@ -7,8 +7,6 @@
#include "hash_generic.h"
-#include "hash.h"
-
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
/*
@@ -221,6 +219,21 @@ static void hash__block(git_hash_ctx *ctx, const unsigned int *data)
ctx->H[4] += E;
}
+int git_hash_global_init(void)
+{
+ return 0;
+}
+
+int git_hash_ctx_init(git_hash_ctx *ctx)
+{
+ return git_hash_init(ctx);
+}
+
+void git_hash_ctx_cleanup(git_hash_ctx *ctx)
+{
+ GIT_UNUSED(ctx);
+}
+
int git_hash_init(git_hash_ctx *ctx)
{
ctx->size = 0;
@@ -285,4 +298,3 @@ int git_hash_final(git_oid *out, git_hash_ctx *ctx)
return 0;
}
-
diff --git a/src/hash/hash_generic.h b/src/hash/hash_generic.h
index fb0009ccf..b97796ce1 100644
--- a/src/hash/hash_generic.h
+++ b/src/hash/hash_generic.h
@@ -8,8 +8,6 @@
#ifndef INCLUDE_hash_hash_generic_h__
#define INCLUDE_hash_hash_generic_h__
-#include "common.h"
-
#include "hash.h"
struct git_hash_ctx {
@@ -18,12 +16,4 @@ struct git_hash_ctx {
unsigned int W[16];
};
-#define git_hash_ctx_init(ctx) git_hash_init(ctx)
-#define git_hash_ctx_cleanup(ctx)
-
-GIT_INLINE(int) git_hash_global_init(void)
-{
- return 0;
-}
-
#endif
diff --git a/src/hash/hash_mbedtls.c b/src/hash/hash_mbedtls.c
index a19d76308..b29226c38 100644
--- a/src/hash/hash_mbedtls.c
+++ b/src/hash/hash_mbedtls.c
@@ -9,6 +9,16 @@
#include "hash.h"
#include "hash/hash_mbedtls.h"
+int git_hash_global_init(void)
+{
+ return 0;
+}
+
+int git_hash_ctx_init(git_hash_ctx *ctx)
+{
+ return git_hash_init(ctx);
+}
+
void git_hash_ctx_cleanup(git_hash_ctx *ctx)
{
assert(ctx);
diff --git a/src/hash/hash_mbedtls.h b/src/hash/hash_mbedtls.h
index 7f3decd7d..834b79dcf 100644
--- a/src/hash/hash_mbedtls.h
+++ b/src/hash/hash_mbedtls.h
@@ -8,17 +8,12 @@
#ifndef INCLUDE_hash_mbedtld_h__
#define INCLUDE_hash_mbedtld_h__
+#include "hash.h"
+
#include <mbedtls/sha1.h>
struct git_hash_ctx {
mbedtls_sha1_context c;
};
-#define git_hash_ctx_init(ctx) git_hash_init(ctx)
-
-GIT_INLINE(int) git_hash_global_init(void)
-{
- return 0;
-}
-
#endif /* INCLUDE_hash_mbedtld_h__ */
diff --git a/src/hash/hash_openssl.c b/src/hash/hash_openssl.c
new file mode 100644
index 000000000..8a6dd7a22
--- /dev/null
+++ b/src/hash/hash_openssl.c
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) the libgit2 contributors. All rights reserved.
+ *
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
+ * a Linking Exception. For full terms see the included COPYING file.
+ */
+
+#include "hash_openssl.h"
+
+int git_hash_global_init(void)
+{
+ return 0;
+}
+
+int git_hash_ctx_init(git_hash_ctx *ctx)
+{
+ return git_hash_init(ctx);
+}
+
+void git_hash_ctx_cleanup(git_hash_ctx *ctx)
+{
+ GIT_UNUSED(ctx);
+}
+
+int git_hash_init(git_hash_ctx *ctx)
+{
+ assert(ctx);
+
+ if (SHA1_Init(&ctx->c) != 1) {
+ git_error_set(GIT_ERROR_SHA1, "hash_openssl: failed to initialize hash context");
+ return -1;
+ }
+
+ return 0;
+}
+
+int git_hash_update(git_hash_ctx *ctx, const void *data, size_t len)
+{
+ assert(ctx);
+
+ if (SHA1_Update(&ctx->c, data, len) != 1) {
+ git_error_set(GIT_ERROR_SHA1, "hash_openssl: failed to update hash");
+ return -1;
+ }
+
+ return 0;
+}
+
+int git_hash_final(git_oid *out, git_hash_ctx *ctx)
+{
+ assert(ctx);
+
+ if (SHA1_Final(out->id, &ctx->c) != 1) {
+ git_error_set(GIT_ERROR_SHA1, "hash_openssl: failed to finalize hash");
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/src/hash/hash_openssl.h b/src/hash/hash_openssl.h
index 8dbfd5ad5..c08ae1008 100644
--- a/src/hash/hash_openssl.h
+++ b/src/hash/hash_openssl.h
@@ -8,6 +8,8 @@
#ifndef INCLUDE_hash_hash_openssl_h__
#define INCLUDE_hash_hash_openssl_h__
+#include "common.h"
+
#include "hash.h"
#include <openssl/sha.h>
@@ -16,48 +18,4 @@ struct git_hash_ctx {
SHA_CTX c;
};
-#define git_hash_ctx_init(ctx) git_hash_init(ctx)
-#define git_hash_ctx_cleanup(ctx)
-
-GIT_INLINE(int) git_hash_global_init(void)
-{
- return 0;
-}
-
-GIT_INLINE(int) git_hash_init(git_hash_ctx *ctx)
-{
- assert(ctx);
-
- if (SHA1_Init(&ctx->c) != 1) {
- git_error_set(GIT_ERROR_SHA1, "hash_openssl: failed to initialize hash context");
- return -1;
- }
-
- return 0;
-}
-
-GIT_INLINE(int) git_hash_update(git_hash_ctx *ctx, const void *data, size_t len)
-{
- assert(ctx);
-
- if (SHA1_Update(&ctx->c, data, len) != 1) {
- git_error_set(GIT_ERROR_SHA1, "hash_openssl: failed to update hash");
- return -1;
- }
-
- return 0;
-}
-
-GIT_INLINE(int) git_hash_final(git_oid *out, git_hash_ctx *ctx)
-{
- assert(ctx);
-
- if (SHA1_Final(out->id, &ctx->c) != 1) {
- git_error_set(GIT_ERROR_SHA1, "hash_openssl: failed to finalize hash");
- return -1;
- }
-
- return 0;
-}
-
#endif
diff --git a/src/hash/hash_win32.c b/src/hash/hash_win32.c
index 4b6830358..4d00c54d3 100644
--- a/src/hash/hash_win32.c
+++ b/src/hash/hash_win32.c
@@ -8,11 +8,21 @@
#include "hash_win32.h"
#include "global.h"
-#include "hash.h"
#include <wincrypt.h>
#include <strsafe.h>
+#define GIT_HASH_CNG_DLL_NAME "bcrypt.dll"
+
+/* BCRYPT_SHA1_ALGORITHM */
+#define GIT_HASH_CNG_HASH_TYPE L"SHA1"
+
+/* BCRYPT_OBJECT_LENGTH */
+#define GIT_HASH_CNG_HASH_OBJECT_LEN L"ObjectLength"
+
+/* BCRYPT_HASH_REUSEABLE_FLAGS */
+#define GIT_HASH_CNG_HASH_REUSABLE 0x00000020
+
static struct git_hash_prov hash_prov = {0};
/* Hash initialization */
@@ -101,7 +111,7 @@ GIT_INLINE(void) hash_cryptoapi_prov_shutdown(void)
hash_prov.type = INVALID;
}
-static void git_hash_global_shutdown(void)
+static void sha1_shutdown(void)
{
if (hash_prov.type == CNG)
hash_cng_prov_shutdown();
@@ -119,7 +129,7 @@ int git_hash_global_init(void)
if ((error = hash_cng_prov_init()) < 0)
error = hash_cryptoapi_prov_init();
- git__on_shutdown(git_hash_global_shutdown);
+ git__on_shutdown(sha1_shutdown);
return error;
}
diff --git a/src/hash/hash_win32.h b/src/hash/hash_win32.h
index b9a85f8dc..e4970ce28 100644
--- a/src/hash/hash_win32.h
+++ b/src/hash/hash_win32.h
@@ -36,17 +36,6 @@ struct hash_cryptoapi_prov {
* would not exist when building in pre-Windows 2008 environments.
*/
-#define GIT_HASH_CNG_DLL_NAME "bcrypt.dll"
-
-/* BCRYPT_SHA1_ALGORITHM */
-#define GIT_HASH_CNG_HASH_TYPE L"SHA1"
-
-/* BCRYPT_OBJECT_LENGTH */
-#define GIT_HASH_CNG_HASH_OBJECT_LEN L"ObjectLength"
-
-/* BCRYPT_HASH_REUSEABLE_FLAGS */
-#define GIT_HASH_CNG_HASH_REUSABLE 0x00000020
-
/* Function declarations for CNG */
typedef NTSTATUS (WINAPI *hash_win32_cng_open_algorithm_provider_fn)(
HANDLE /* BCRYPT_ALG_HANDLE */ *phAlgorithm,
@@ -138,6 +127,4 @@ struct git_hash_ctx {
} ctx;
};
-extern int git_hash_global_init(void);
-
#endif