commit 82f7e4c89aedcb1b224d85a6a5f2ae78b16bc943 from: Omar Polo date: Sun Feb 12 11:16:23 2023 UTC introduce more helpers to deal with different hash digests commit - 3f81ccbdc1260ec6bd1465a10f6cc3a530a991b3 commit + 82f7e4c89aedcb1b224d85a6a5f2ae78b16bc943 blob - c70734016d6453f21cfe4275495824160a6b0fd2 blob + 97afd08273862cc0e32014ef9809da10290c701e --- lib/got_lib_hash.h +++ lib/got_lib_hash.h @@ -26,7 +26,12 @@ int got_parse_sha256_digest(uint8_t *, const char *); 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 @@ -146,6 +146,46 @@ got_parse_hash_digest(uint8_t *digest, const char *lin } } +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 @@ -622,8 +622,10 @@ got_object_parse_commit(struct got_commit_object **com 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); @@ -635,7 +637,7 @@ got_object_parse_commit(struct got_commit_object **com 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; } @@ -644,8 +646,8 @@ got_object_parse_commit(struct got_commit_object **com 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; @@ -654,7 +656,7 @@ got_object_parse_commit(struct got_commit_object **com 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; } @@ -663,8 +665,8 @@ got_object_parse_commit(struct got_commit_object **com 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); @@ -978,7 +980,9 @@ got_object_parse_tag(struct got_tag_object **tag, uint 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); @@ -990,7 +994,7 @@ got_object_parse_tag(struct got_tag_object **tag, uint 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; } @@ -999,8 +1003,8 @@ got_object_parse_tag(struct got_tag_object **tag, uint 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 @@ -326,7 +326,7 @@ checksum: } 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); @@ -667,6 +667,7 @@ got_packidx_match_id_str_prefix(struct got_object_id_q 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]; @@ -689,11 +690,12 @@ got_packidx_match_id_str_prefix(struct got_object_id_q 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);