hash.c 1.86 KB
Newer Older
1
/*
Edward Thomson committed
2
 * Copyright (C) the libgit2 contributors. All rights reserved.
3
 *
Vicent Marti committed
4 5
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 * a Linking Exception. For full terms see the included COPYING file.
6 7 8
 */

#include "hash.h"
9

10 11 12 13 14 15 16
int git_hash_global_init(void)
{
	return git_hash_sha1_global_init();
}

int git_hash_ctx_init(git_hash_ctx *ctx)
{
17 18 19 20 21 22 23 24
	int error;

	if ((error = git_hash_sha1_ctx_init(&ctx->sha1)) < 0)
		return error;

	ctx->algo = GIT_HASH_ALGO_SHA1;

	return 0;
25 26 27 28
}

void git_hash_ctx_cleanup(git_hash_ctx *ctx)
{
29 30 31 32 33 34 35
	switch (ctx->algo) {
		case GIT_HASH_ALGO_SHA1:
			git_hash_sha1_ctx_cleanup(&ctx->sha1);
			return;
		default:
			assert(0);
	}
36 37
}

38
int git_hash_init(git_hash_ctx *ctx)
39
{
40 41 42 43 44
	switch (ctx->algo) {
		case GIT_HASH_ALGO_SHA1:
			return git_hash_sha1_init(&ctx->sha1);
		default:
			assert(0);
45
			return -1;
46
	}
47 48
}

49
int git_hash_update(git_hash_ctx *ctx, const void *data, size_t len)
50
{
51 52 53 54 55
	switch (ctx->algo) {
		case GIT_HASH_ALGO_SHA1:
			return git_hash_sha1_update(&ctx->sha1, data, len);
		default:
			assert(0);
56
			return -1;
57
	}
58 59
}

60
int git_hash_final(git_oid *out, git_hash_ctx *ctx)
61
{
62 63 64 65 66
	switch (ctx->algo) {
		case GIT_HASH_ALGO_SHA1:
			return git_hash_sha1_final(out, &ctx->sha1);
		default:
			assert(0);
67
			return -1;
68
	}
69 70
}

71
int git_hash_buf(git_oid *out, const void *data, size_t len)
72
{
73
	git_hash_ctx ctx;
74
	int error = 0;
75

76
	if (git_hash_ctx_init(&ctx) < 0)
77
		return -1;
78

79 80
	if ((error = git_hash_update(&ctx, data, len)) >= 0)
		error = git_hash_final(out, &ctx);
81

82
	git_hash_ctx_cleanup(&ctx);
83 84
	
	return error;
85 86
}

87
int git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n)
88
{
89
	git_hash_ctx ctx;
90 91
	size_t i;
	int error = 0;
92

93
	if (git_hash_ctx_init(&ctx) < 0)
94
		return -1;
95

96
	for (i = 0; i < n; i++) {
97
		if ((error = git_hash_update(&ctx, vec[i].data, vec[i].len)) < 0)
98 99
			goto done;
	}
100

101
	error = git_hash_final(out, &ctx);
102

103
done:
104
	git_hash_ctx_cleanup(&ctx);
105

106
	return error;
107
}