commit - 3f81ccbdc1260ec6bd1465a10f6cc3a530a991b3
commit + 82f7e4c89aedcb1b224d85a6a5f2ae78b16bc943
blob - c70734016d6453f21cfe4275495824160a6b0fd2
blob + 97afd08273862cc0e32014ef9809da10290c701e
--- lib/got_lib_hash.h
+++ lib/got_lib_hash.h
char *got_sha256_digest_to_str(const uint8_t *, char *, size_t);
int got_parse_hash_digest(uint8_t *, const char *, enum got_hash_algorithm);
+char *got_hash_digest_to_str(const uint8_t *, char *, size_t,
+ enum got_hash_algorithm);
+size_t got_hash_digest_length(enum got_hash_algorithm);
+size_t got_hash_digest_string_length(enum got_hash_algorithm);
+
struct got_hash {
SHA1_CTX sha1_ctx;
SHA2_CTX sha256_ctx;
blob - 21a5c5b28f97a2360115141697b94ec051b7d467
blob + 0544fe160bd4f810e990e5d3f7d284f68b9e7123
--- lib/hash.c
+++ lib/hash.c
}
}
+char *
+got_hash_digest_to_str(const uint8_t *digest, char *buf, size_t size,
+ enum got_hash_algorithm algo)
+{
+ switch (algo) {
+ case GOT_HASH_SHA1:
+ return got_sha1_digest_to_str(digest, buf, size);
+ case GOT_HASH_SHA256:
+ return got_sha256_digest_to_str(digest, buf, size);
+ default:
+ return NULL;
+ }
+}
+
+size_t
+got_hash_digest_length(enum got_hash_algorithm algo)
+{
+ switch (algo) {
+ case GOT_HASH_SHA1:
+ return SHA1_DIGEST_LENGTH;
+ case GOT_HASH_SHA256:
+ return SHA256_DIGEST_LENGTH;
+ default:
+ return 0;
+ }
+}
+
+size_t
+got_hash_digest_string_length(enum got_hash_algorithm algo)
+{
+ switch (algo) {
+ case GOT_HASH_SHA1:
+ return SHA1_DIGEST_STRING_LENGTH;
+ case GOT_HASH_SHA256:
+ return SHA256_DIGEST_STRING_LENGTH;
+ default:
+ return 0;
+ }
+}
+
void
got_hash_init(struct got_hash *hash, enum got_hash_algorithm algo)
{
blob - daec14e2a587f99d1ec39131795c9a0f39b2d29b
blob + 0c0ec97bfd02838440149781f11c2183bc65419f
--- lib/object_parse.c
+++ lib/object_parse.c
const struct got_error *err = NULL;
enum got_hash_algorithm algo = GOT_HASH_SHA1;
char *s = buf;
- size_t label_len;
+ size_t label_len, idlen;
ssize_t remain = (ssize_t)len;
+
+ idlen = got_hash_digest_string_length(algo);
if (remain == 0)
return got_error(GOT_ERR_BAD_OBJ_DATA);
label_len = strlen(GOT_COMMIT_LABEL_TREE);
if (strncmp(s, GOT_COMMIT_LABEL_TREE, label_len) == 0) {
remain -= label_len;
- if (remain < SHA1_DIGEST_STRING_LENGTH) {
+ if (remain < idlen) {
err = got_error(GOT_ERR_BAD_OBJ_DATA);
goto done;
}
err = got_error(GOT_ERR_BAD_OBJ_DATA);
goto done;
}
- remain -= SHA1_DIGEST_STRING_LENGTH;
- s += SHA1_DIGEST_STRING_LENGTH;
+ remain -= idlen;
+ s += idlen;
} else {
err = got_error(GOT_ERR_BAD_OBJ_DATA);
goto done;
label_len = strlen(GOT_COMMIT_LABEL_PARENT);
while (strncmp(s, GOT_COMMIT_LABEL_PARENT, label_len) == 0) {
remain -= label_len;
- if (remain < SHA1_DIGEST_STRING_LENGTH) {
+ if (remain < idlen) {
err = got_error(GOT_ERR_BAD_OBJ_DATA);
goto done;
}
if (err)
goto done;
- remain -= SHA1_DIGEST_STRING_LENGTH;
- s += SHA1_DIGEST_STRING_LENGTH;
+ remain -= idlen;
+ s += idlen;
}
label_len = strlen(GOT_COMMIT_LABEL_AUTHOR);
enum got_hash_algorithm algo = GOT_HASH_SHA1;
size_t remain = len;
char *s = buf;
- size_t label_len;
+ size_t label_len, id_len;
+
+ id_len = got_hash_digest_string_length(algo);
if (remain == 0)
return got_error(GOT_ERR_BAD_OBJ_DATA);
label_len = strlen(GOT_TAG_LABEL_OBJECT);
if (strncmp(s, GOT_TAG_LABEL_OBJECT, label_len) == 0) {
remain -= label_len;
- if (remain < SHA1_DIGEST_STRING_LENGTH) {
+ if (remain < id_len) {
err = got_error(GOT_ERR_BAD_OBJ_DATA);
goto done;
}
err = got_error(GOT_ERR_BAD_OBJ_DATA);
goto done;
}
- remain -= SHA1_DIGEST_STRING_LENGTH;
- s += SHA1_DIGEST_STRING_LENGTH;
+ remain -= id_len;
+ s += id_len;
} else {
err = got_error(GOT_ERR_BAD_OBJ_DATA);
goto done;
blob - 2a89d71d16ccc445d75c986691f8a7d73085ab30
blob + 49c486d59d228e9e64cdacaa00c1cdbcd30296d7
--- lib/pack.c
+++ lib/pack.c
}
if (verify) {
got_hash_update(&ctx, h->trailer->packfile_sha1,
- SHA1_DIGEST_LENGTH);
+ got_hash_digest_length(algo));
got_hash_final(&ctx, hash);
if (got_hash_cmp(&ctx, hash, h->trailer->packidx_sha1) != 0)
err = got_error(GOT_ERR_PACKIDX_CSUM);
struct got_packidx *packidx, const char *id_str_prefix)
{
const struct got_error *err = NULL;
+ enum got_hash_algorithm algo = GOT_HASH_SHA1;
u_int8_t id0;
uint32_t totobj = be32toh(packidx->hdr.fanout_table[0xff]);
char hex[3];
i = be32toh(packidx->hdr.fanout_table[id0 - 1]);
oid = &packidx->hdr.sorted_ids[i];
while (i < totobj && oid->sha1[0] == id0) {
- char id_str[SHA1_DIGEST_STRING_LENGTH];
+ char id_str[GOT_OBJECT_ID_HEX_MAXLEN];
struct got_object_qid *qid;
int cmp;
- if (!got_sha1_digest_to_str(oid->sha1, id_str, sizeof(id_str)))
+ if (!got_hash_digest_to_str(oid->sha1, id_str, sizeof(id_str),
+ algo))
return got_error(GOT_ERR_NO_SPACE);
cmp = strncmp(id_str, id_str_prefix, prefix_len);