From: Michael Tremer Date: Fri, 26 Aug 2022 10:34:15 +0000 (+0000) Subject: digest: Move caching into digests X-Git-Tag: 0.9.28~360 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b32db112bfe0858d6c59c04c495755a06205914;p=pakfire.git digest: Move caching into digests Multiple calls to compute will skip any digests that have already been computed. Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/digest.c b/src/libpakfire/digest.c index e57ffc972..b73646007 100644 --- a/src/libpakfire/digest.c +++ b/src/libpakfire/digest.c @@ -70,6 +70,43 @@ int __pakfire_digest_set(const unsigned char* digest, const size_t length) { 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; @@ -184,7 +221,7 @@ static int __pakfire_digest_finalize(struct pakfire* pakfire, } 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; @@ -194,6 +231,13 @@ int pakfire_digests_compute_from_file(struct pakfire* pakfire, 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()); diff --git a/src/libpakfire/file.c b/src/libpakfire/file.c index 80454ab40..23d1ddc07 100644 --- a/src/libpakfire/file.c +++ b/src/libpakfire/file.c @@ -75,7 +75,6 @@ struct pakfire_file { // Digests struct pakfire_digests digests; - unsigned int digests_computed:1; // Verification Status int verify_status; @@ -677,21 +676,7 @@ ERROR: } 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) { @@ -878,23 +863,7 @@ static int pakfire_file_verify_payload(struct pakfire_file* file, const struct s } // 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); diff --git a/src/libpakfire/include/pakfire/digest.h b/src/libpakfire/include/pakfire/digest.h index e427cda10..c0ac04e54 100644 --- a/src/libpakfire/include/pakfire/digest.h +++ b/src/libpakfire/include/pakfire/digest.h @@ -90,10 +90,12 @@ size_t pakfire_digest_length(const enum pakfire_digest_types digest); #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);