commit cf67c0d95b97d5a74575e1061be649435bd88489 from: Omar Polo date: Sat Feb 04 14:00:31 2023 UTC initial sha256 handling for got-read-commit commit - 87a4b05fb8b2ad9ea533436eaf47108b48ba66cf commit + cf67c0d95b97d5a74575e1061be649435bd88489 blob - 9ea57251b69bdb5700e0fd371705a2c201e32769 blob + adfa664a9f434ac0bafc98634b7050c5a28bdf11 --- include/got_object.h +++ include/got_object.h @@ -367,7 +367,7 @@ const char *got_object_tag_get_tagger(struct got_tag_o const char *got_object_tag_get_message(struct got_tag_object *); const struct got_error *got_object_commit_add_parent(struct got_commit_object *, - const char *); + const char *, int); /* Create a new tag object in the repository. */ const struct got_error *got_object_tag_create(struct got_object_id **, blob - 4b96e21f407d84ac399adbccb5d7e21cf86dad1f blob + 4bb7ecf2163c2d7807d4697feab533b7c1e26e1a --- lib/got_lib_object_parse.h +++ lib/got_lib_object_parse.h @@ -28,7 +28,7 @@ struct got_commit_object *got_object_commit_alloc_part struct got_tree_entry *got_alloc_tree_entry_partial(void); const struct got_error *got_object_parse_commit(struct got_commit_object **, - char *, size_t); + char *, size_t, int); const struct got_error *got_object_read_commit(struct got_commit_object **, int, struct got_object_id *, size_t); blob - d55b66e81877a6e05c07a226ffbd0453235a5780 blob + 294a0d3507c5fa97bca600bd2835cdaf5257d91f --- lib/object_parse.c +++ lib/object_parse.c @@ -378,7 +378,7 @@ got_object_commit_alloc_partial(void) const struct got_error * got_object_commit_add_parent(struct got_commit_object *commit, - const char *id_str) + const char *id_str, int algo) { const struct got_error *err = NULL; struct got_object_qid *qid; @@ -387,11 +387,12 @@ got_object_commit_add_parent(struct got_commit_object if (err) return err; - if (!got_parse_sha1_digest(qid->id.hash, id_str)) { + if (!got_parse_hash_digest(qid->id.hash, id_str, algo, NULL)) { err = got_error(GOT_ERR_BAD_OBJ_DATA); got_object_qid_free(qid); return err; } + qid->id.algo = algo; STAILQ_INSERT_TAIL(&commit->parent_ids, qid, entry); commit->nparents++; @@ -617,12 +618,18 @@ got_object_commit_get_logmsg_raw(struct got_commit_obj const struct got_error * got_object_parse_commit(struct got_commit_object **commit, char *buf, - size_t len) + size_t len, int algo) { const struct got_error *err = NULL; char *s = buf; size_t label_len; + size_t digest_strlen; ssize_t remain = (ssize_t)len; + + if (algo == GOT_HASH_SHA256) + digest_strlen = SHA256_DIGEST_STRING_LENGTH; + else + digest_strlen = SHA1_DIGEST_STRING_LENGTH; if (remain == 0) return got_error(GOT_ERR_BAD_OBJ_DATA); @@ -634,17 +641,18 @@ 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 < digest_strlen) { err = got_error(GOT_ERR_BAD_OBJ_DATA); goto done; } s += label_len; - if (!got_parse_sha1_digest((*commit)->tree_id->hash, s)) { + if (!got_parse_hash_digest((*commit)->tree_id->hash, s, + algo, NULL)) { err = got_error(GOT_ERR_BAD_OBJ_DATA); goto done; } - remain -= SHA1_DIGEST_STRING_LENGTH; - s += SHA1_DIGEST_STRING_LENGTH; + remain -= digest_strlen; + s += digest_strlen; } else { err = got_error(GOT_ERR_BAD_OBJ_DATA); goto done; @@ -653,17 +661,17 @@ 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 < digest_strlen) { err = got_error(GOT_ERR_BAD_OBJ_DATA); goto done; } s += label_len; - err = got_object_commit_add_parent(*commit, s); + err = got_object_commit_add_parent(*commit, s, algo); if (err) goto done; - remain -= SHA1_DIGEST_STRING_LENGTH; - s += SHA1_DIGEST_STRING_LENGTH; + remain -= digest_strlen; + s += digest_strlen; } label_len = strlen(GOT_COMMIT_LABEL_AUTHOR); @@ -751,17 +759,28 @@ got_object_read_commit(struct got_commit_object **comm uint8_t *p; struct got_inflate_checksum csum; SHA1_CTX sha1_ctx; + SHA2_CTX sha256_ctx; struct got_object_id id; - SHA1Init(&hash_ctx); memset(&csum, 0, sizeof(csum)); - csum.output_hash = &hash_ctx; + id.algo = expected_id->algo; + if (expected_id->algo == GOT_HASH_SHA256) { + SHA256Init(&sha256_ctx); + csum.output_sha256 = &sha256_ctx; + } else { + SHA1Init(&sha1_ctx); + csum.output_sha1 = &sha1_ctx; + } err = got_inflate_to_mem_fd(&p, &len, NULL, &csum, expected_size, fd); if (err) return err; - SHA1Final(id.hash, &sha1_ctx); + if (expected_id->algo == GOT_HASH_SHA256) + SHA256Final(id.hash, &sha256_ctx); + else + SHA1Final(id.hash, &sha1_ctx); + if (got_object_id_cmp(expected_id, &id) != 0) { err = got_error_checksum(expected_id); goto done; @@ -783,7 +802,8 @@ got_object_read_commit(struct got_commit_object **comm /* Skip object header. */ len -= obj->hdrlen; - err = got_object_parse_commit(commit, p + obj->hdrlen, len); + err = got_object_parse_commit(commit, p + obj->hdrlen, len, + expected_id->algo); done: free(p); if (obj) blob - ca7cac34bcd12c5df8c223e410917d4fb6bb151a blob + a7bc1b886b3ad07fbe8c6c1b889b4c23b1c07c28 --- libexec/got-read-pack/got-read-pack.c +++ libexec/got-read-pack/got-read-pack.c @@ -142,7 +142,7 @@ open_commit(struct got_commit_object **commit, struct obj->size = len; - err = got_object_parse_commit(commit, buf, len); + err = got_object_parse_commit(commit, buf, len, GOT_HASH_SHA1); done: got_object_close(obj); free(buf);