int pakfire_archive_check_digest(struct pakfire_archive* archive,
const enum pakfire_digest_types type, const unsigned char* digest, const size_t length) {
+ size_t computed_length = 0;
int r;
// Compute the digest
r = pakfire_digests_compare_one(archive->pakfire, &archive->digests,
type, digest, length);
if (r) {
- ERROR(archive->pakfire, "Archive digest does not match");
+ const unsigned char* computed_digest = pakfire_digest_get(
+ &archive->digests, type, &computed_length);
+
+ char* expected_hexdigest = __pakfire_hexlify(digest, length);
+ char* computed_hexdigest = __pakfire_hexlify(computed_digest, computed_length);
+
+ ERROR(archive->pakfire, "Archive digest does not match for %s:\n", archive->path);
+ ERROR(archive->pakfire, " Expected: %s\n", expected_hexdigest);
+ ERROR(archive->pakfire, " Computed: %s\n", computed_hexdigest);
+
+ if (expected_hexdigest)
+ free(expected_hexdigest);
+ if (computed_hexdigest)
+ free(computed_hexdigest);
+
+ return r;
}
return r;