]> git.ipfire.org Git - pakfire.git/commitdiff
digest: Move caching into digests
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 26 Aug 2022 10:34:15 +0000 (10:34 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 26 Aug 2022 10:34:15 +0000 (10:34 +0000)
Multiple calls to compute will skip any digests that have already been
computed.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/digest.c
src/libpakfire/file.c
src/libpakfire/include/pakfire/digest.h

index e57ffc97255af0c66118b936144e224aebaee174..b7364600758135306e600c5ce4fdfdd1a669d641 100644 (file)
@@ -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());
index 80454ab40cafec63bdb0c79971c735598b294fcf..23d1ddc073d18411314cadc768ad03dd91f54a8b 100644 (file)
@@ -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);
index e427cda10fd7d39c6f64d9647de54f9e2920f169..c0ac04e54fb536df0cd1a2973188b7f2570232fd 100644 (file)
@@ -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);