hash.c 1.93 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
	switch (ctx->algo) {
		case GIT_HASH_ALGO_SHA1:
			git_hash_sha1_ctx_cleanup(&ctx->sha1);
			return;
		default:
Edward Thomson committed
34
			/* unreachable */ ;
35
	}
36 37
}

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

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

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

74
int git_hash_buf(git_oid *out, const void *data, size_t len)
75
{
76
	git_hash_ctx ctx;
77
	int error = 0;
78

79
	if (git_hash_ctx_init(&ctx) < 0)
80
		return -1;
81

82 83
	if ((error = git_hash_update(&ctx, data, len)) >= 0)
		error = git_hash_final(out, &ctx);
84

85
	git_hash_ctx_cleanup(&ctx);
Edward Thomson committed
86

87
	return error;
88 89
}

90
int git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n)
91
{
92
	git_hash_ctx ctx;
93 94
	size_t i;
	int error = 0;
95

96
	if (git_hash_ctx_init(&ctx) < 0)
97
		return -1;
98

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

104
	error = git_hash_final(out, &ctx);
105

106
done:
107
	git_hash_ctx_cleanup(&ctx);
108

109
	return error;
110
}