sha1_name: add get_sha1_with_context()
[gitweb.git] / pack-check.c
index f596bf2db5e0a0065e6856b8caa3ded8a134f74d..395fb9527a3bc6dd8ca648233911a1c35604440d 100644 (file)
@@ -47,9 +47,9 @@ static int verify_packfile(struct packed_git *p,
 {
        off_t index_size = p->index_size;
        const unsigned char *index_base = p->index_data;
-       SHA_CTX ctx;
+       git_SHA_CTX ctx;
        unsigned char sha1[20], *pack_sig;
-       off_t offset = 0, pack_sig_ofs = p->pack_size - 20;
+       off_t offset = 0, pack_sig_ofs = 0;
        uint32_t nr_objects, i;
        int err = 0;
        struct idx_entry *entries;
@@ -60,16 +60,18 @@ static int verify_packfile(struct packed_git *p,
         * immediately.
         */
 
-       SHA1_Init(&ctx);
-       while (offset < pack_sig_ofs) {
+       git_SHA1_Init(&ctx);
+       do {
                unsigned int remaining;
                unsigned char *in = use_pack(p, w_curs, offset, &remaining);
                offset += remaining;
+               if (!pack_sig_ofs)
+                       pack_sig_ofs = p->pack_size - 20;
                if (offset > pack_sig_ofs)
                        remaining -= (unsigned int)(offset - pack_sig_ofs);
-               SHA1_Update(&ctx, in, remaining);
-       }
-       SHA1_Final(sha1, &ctx);
+               git_SHA1_Update(&ctx, in, remaining);
+       } while (offset < pack_sig_ofs);
+       git_SHA1_Final(sha1, &ctx);
        pack_sig = use_pack(p, w_curs, pack_sig_ofs, NULL);
        if (hashcmp(sha1, pack_sig))
                err = error("%s SHA1 checksum mismatch",
@@ -131,14 +133,13 @@ static int verify_packfile(struct packed_git *p,
        return err;
 }
 
-int verify_pack(struct packed_git *p)
+int verify_pack_index(struct packed_git *p)
 {
        off_t index_size;
        const unsigned char *index_base;
-       SHA_CTX ctx;
+       git_SHA_CTX ctx;
        unsigned char sha1[20];
        int err = 0;
-       struct pack_window *w_curs = NULL;
 
        if (open_pack_index(p))
                return error("packfile %s index not opened", p->pack_name);
@@ -146,14 +147,24 @@ int verify_pack(struct packed_git *p)
        index_base = p->index_data;
 
        /* Verify SHA1 sum of the index file */
-       SHA1_Init(&ctx);
-       SHA1_Update(&ctx, index_base, (unsigned int)(index_size - 20));
-       SHA1_Final(sha1, &ctx);
+       git_SHA1_Init(&ctx);
+       git_SHA1_Update(&ctx, index_base, (unsigned int)(index_size - 20));
+       git_SHA1_Final(sha1, &ctx);
        if (hashcmp(sha1, index_base + index_size - 20))
                err = error("Packfile index for %s SHA1 mismatch",
                            p->pack_name);
+       return err;
+}
+
+int verify_pack(struct packed_git *p)
+{
+       int err = 0;
+       struct pack_window *w_curs = NULL;
+
+       err |= verify_pack_index(p);
+       if (!p->index_data)
+               return -1;
 
-       /* Verify pack file */
        err |= verify_packfile(p, &w_curs);
        unuse_pack(&w_curs);