summaryrefslogtreecommitdiff
path: root/src/hash.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/hash.c')
-rw-r--r--src/hash.c86
1 files changed, 51 insertions, 35 deletions
diff --git a/src/hash.c b/src/hash.c
index 5a7278e42..92e7ff219 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -12,71 +12,83 @@ int git_hash_global_init(void)
return git_hash_sha1_global_init();
}
-int git_hash_ctx_init(git_hash_ctx *ctx)
+int git_hash_ctx_init(git_hash_ctx *ctx, git_hash_algorithm_t algorithm)
{
int error;
- if ((error = git_hash_sha1_ctx_init(&ctx->ctx.sha1)) < 0)
- return error;
-
- ctx->algo = GIT_HASH_ALGO_SHA1;
+ switch (algorithm) {
+ case GIT_HASH_ALGORITHM_SHA1:
+ error = git_hash_sha1_ctx_init(&ctx->ctx.sha1);
+ break;
+ default:
+ git_error_set(GIT_ERROR_INTERNAL, "unknown hash algorithm");
+ error = -1;
+ }
- return 0;
+ ctx->algorithm = algorithm;
+ return error;
}
void git_hash_ctx_cleanup(git_hash_ctx *ctx)
{
- switch (ctx->algo) {
- case GIT_HASH_ALGO_SHA1:
- git_hash_sha1_ctx_cleanup(&ctx->ctx.sha1);
- return;
- default:
- /* unreachable */ ;
+ switch (ctx->algorithm) {
+ case GIT_HASH_ALGORITHM_SHA1:
+ git_hash_sha1_ctx_cleanup(&ctx->ctx.sha1);
+ return;
+ default:
+ /* unreachable */ ;
}
}
int git_hash_init(git_hash_ctx *ctx)
{
- switch (ctx->algo) {
- case GIT_HASH_ALGO_SHA1:
- return git_hash_sha1_init(&ctx->ctx.sha1);
- default:
- /* unreachable */ ;
+ switch (ctx->algorithm) {
+ case GIT_HASH_ALGORITHM_SHA1:
+ return git_hash_sha1_init(&ctx->ctx.sha1);
+ default:
+ /* unreachable */ ;
}
- GIT_ASSERT(0);
+
+ git_error_set(GIT_ERROR_INTERNAL, "unknown hash algorithm");
return -1;
}
int git_hash_update(git_hash_ctx *ctx, const void *data, size_t len)
{
- switch (ctx->algo) {
- case GIT_HASH_ALGO_SHA1:
- return git_hash_sha1_update(&ctx->ctx.sha1, data, len);
- default:
- /* unreachable */ ;
+ switch (ctx->algorithm) {
+ case GIT_HASH_ALGORITHM_SHA1:
+ return git_hash_sha1_update(&ctx->ctx.sha1, data, len);
+ default:
+ /* unreachable */ ;
}
- GIT_ASSERT(0);
+
+ git_error_set(GIT_ERROR_INTERNAL, "unknown hash algorithm");
return -1;
}
-int git_hash_final(git_oid *out, git_hash_ctx *ctx)
+int git_hash_final(unsigned char *out, git_hash_ctx *ctx)
{
- switch (ctx->algo) {
- case GIT_HASH_ALGO_SHA1:
- return git_hash_sha1_final(out, &ctx->ctx.sha1);
- default:
- /* unreachable */ ;
+ switch (ctx->algorithm) {
+ case GIT_HASH_ALGORITHM_SHA1:
+ return git_hash_sha1_final(out, &ctx->ctx.sha1);
+ default:
+ /* unreachable */ ;
}
- GIT_ASSERT(0);
+
+ git_error_set(GIT_ERROR_INTERNAL, "unknown hash algorithm");
return -1;
}
-int git_hash_buf(git_oid *out, const void *data, size_t len)
+int git_hash_buf(
+ unsigned char *out,
+ const void *data,
+ size_t len,
+ git_hash_algorithm_t algorithm)
{
git_hash_ctx ctx;
int error = 0;
- if (git_hash_ctx_init(&ctx) < 0)
+ if (git_hash_ctx_init(&ctx, algorithm) < 0)
return -1;
if ((error = git_hash_update(&ctx, data, len)) >= 0)
@@ -87,13 +99,17 @@ int git_hash_buf(git_oid *out, const void *data, size_t len)
return error;
}
-int git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n)
+int git_hash_vec(
+ unsigned char *out,
+ git_str_vec *vec,
+ size_t n,
+ git_hash_algorithm_t algorithm)
{
git_hash_ctx ctx;
size_t i;
int error = 0;
- if (git_hash_ctx_init(&ctx) < 0)
+ if (git_hash_ctx_init(&ctx, algorithm) < 0)
return -1;
for (i = 0; i < n; i++) {