diff options
Diffstat (limited to 'src/hash.c')
-rw-r--r-- | src/hash.c | 86 |
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++) { |