return 0;
}
+/*
+ Returns a bitmap of all digests that are set.
+*/
+int pakfire_digest_has_any(const struct pakfire_digests* digests) {
+ int types = PAKFIRE_DIGEST_UNDEFINED;
+
+ if (pakfire_digest_set(digests->sha3_512))
+ types |= PAKFIRE_DIGEST_SHA3_512;
+
+ if (pakfire_digest_set(digests->sha3_256))
+ types |= PAKFIRE_DIGEST_SHA3_256;
+
+ if (pakfire_digest_set(digests->blake2b512))
+ types |= PAKFIRE_DIGEST_BLAKE2B512;
+
+ if (pakfire_digest_set(digests->blake2s256))
+ types |= PAKFIRE_DIGEST_BLAKE2S256;
+
+ if (pakfire_digest_set(digests->sha2_512))
+ types |= PAKFIRE_DIGEST_SHA2_512;
+
+ if (pakfire_digest_set(digests->sha2_256))
+ types |= PAKFIRE_DIGEST_SHA2_256;
+
+ return types;
+}
+
+/*
+ Returns a bitmap of all digests that are not set, yet
+*/
+static int pakfire_digest_needed(const struct pakfire_digests* digests, const int needed) {
+ // Fetch any currently set digests
+ const int have = pakfire_digest_has_any(digests);
+
+ return (~have & needed);
+}
+
void pakfire_digests_reset(struct pakfire_digests* digests, int types) {
if (!types)
types = ~types;
}
int pakfire_digests_compute_from_file(struct pakfire* pakfire,
- struct pakfire_digests* digests, const int types, FILE* f) {
+ struct pakfire_digests* digests, int types, FILE* f) {
EVP_MD_CTX* sha3_512_ctx = NULL;
EVP_MD_CTX* sha3_256_ctx = NULL;
EVP_MD_CTX* blake2b512_ctx = NULL;
char buffer[PAKFIRE_BUFFER_SIZE];
int r = 1;
+ // Check if any digests have been computed before and select only those that we need
+ types = pakfire_digest_needed(digests, types);
+
+ // Nothing to do?
+ if (!types)
+ return 0;
+
// Initialize context for SHA-3-512
if (types & PAKFIRE_DIGEST_SHA3_512) {
sha3_512_ctx = __pakfire_digest_setup(pakfire, EVP_sha3_512());
// Digests
struct pakfire_digests digests;
- unsigned int digests_computed:1;
// Verification Status
int verify_status;
}
int pakfire_file_compute_digests(struct pakfire_file* file, const int types) {
- int r;
-
- // Don't recompute once done
- if (file->digests_computed)
- return 0;
-
- // Compute digests
- r = __pakfire_file_compute_digests(file, &file->digests, types);
- if (r)
- return r;
-
- // Mark as computed
- file->digests_computed = 1;
-
- return 0;
+ return __pakfire_file_compute_digests(file, &file->digests, types);
}
int pakfire_file_remove(struct pakfire_file* file) {
}
// Check if this file has any digests at all
- if (pakfire_digest_set(file->digests.sha3_512))
- digest_types |= PAKFIRE_DIGEST_SHA3_512;
-
- if (pakfire_digest_set(file->digests.sha3_256))
- digest_types |= PAKFIRE_DIGEST_SHA3_256;
-
- if (pakfire_digest_set(file->digests.blake2b512))
- digest_types |= PAKFIRE_DIGEST_BLAKE2B512;
-
- if (pakfire_digest_set(file->digests.blake2s256))
- digest_types |= PAKFIRE_DIGEST_BLAKE2S256;
-
- if (pakfire_digest_set(file->digests.sha2_512))
- digest_types |= PAKFIRE_DIGEST_SHA2_512;
-
- if (pakfire_digest_set(file->digests.sha2_256))
- digest_types |= PAKFIRE_DIGEST_SHA2_256;
+ digest_types = pakfire_digest_has_any(&file->digests);
if (!digest_types) {
ERROR(file->pakfire, "%s: No digests available\n", file->path);
#define pakfire_digest_set(digest) __pakfire_digest_set(digest, sizeof(digest))
int __pakfire_digest_set(const unsigned char* digest, const size_t length);
+int pakfire_digest_has_any(const struct pakfire_digests* digests);
+
void pakfire_digests_reset(struct pakfire_digests* digests, int types);
int pakfire_digests_compute_from_file(struct pakfire* pakfire,
- struct pakfire_digests* digests, int flags, FILE* f);
+ struct pakfire_digests* digests, int types, FILE* f);
int pakfire_digests_compare(struct pakfire* pakfire, const struct pakfire_digests* digests1,
const struct pakfire_digests* digests2, const int types);