size_t pakfire_digest_length(const enum pakfire_digest_types digest) {
switch (digest) {
+ case PAKFIRE_DIGEST_SHA3_512:
+ return SHA512_DIGEST_LENGTH;
+
+ case PAKFIRE_DIGEST_SHA3_256:
+ return SHA256_DIGEST_LENGTH;
+
case PAKFIRE_DIGEST_BLAKE2B512:
return BLAKE2B512_DIGEST_LENGTH;
if (!types)
types = ~types;
+ // Reset SHA-3-512
+ if (types & PAKFIRE_DIGEST_SHA3_512)
+ memset(digests->sha3_512, 0, sizeof(digests->sha3_512));
+
+ // Reset SHA-3-256
+ if (types & PAKFIRE_DIGEST_SHA3_256)
+ memset(digests->sha3_256, 0, sizeof(digests->sha3_256));
+
+ // Reset BLAKE2b512
+ if (types & PAKFIRE_DIGEST_BLAKE2B512)
+ memset(digests->blake2b512, 0, sizeof(digests->blake2b512));
+
+ // Reset BLAKE2s256
+ if (types & PAKFIRE_DIGEST_BLAKE2S256)
+ memset(digests->blake2s256, 0, sizeof(digests->blake2s256));
+
// Reset SHA-2-512
if (types & PAKFIRE_DIGEST_SHA2_512)
memset(digests->sha2_512, 0, sizeof(digests->sha2_512));
int pakfire_digests_compute_from_file(struct pakfire* pakfire,
struct pakfire_digests* digests, const int types, FILE* f) {
+ EVP_MD_CTX* sha3_512_ctx = NULL;
+ EVP_MD_CTX* sha3_256_ctx = NULL;
EVP_MD_CTX* blake2b512_ctx = NULL;
EVP_MD_CTX* blake2s256_ctx = NULL;
EVP_MD_CTX* sha2_512_ctx = NULL;
char buffer[PAKFIRE_BUFFER_SIZE];
int r = 1;
+ // Initialize context for SHA-3-512
+ if (types & PAKFIRE_DIGEST_SHA3_512) {
+ sha3_512_ctx = __pakfire_digest_setup(pakfire, EVP_sha3_512());
+ if (!sha3_512_ctx)
+ goto ERROR;
+ }
+
+ // Initialize context for SHA-3-256
+ if (types & PAKFIRE_DIGEST_SHA3_256) {
+ sha3_256_ctx = __pakfire_digest_setup(pakfire, EVP_sha3_256());
+ if (!sha3_256_ctx)
+ goto ERROR;
+ }
+
// Initialize context for BLAKE2B512
if (types & PAKFIRE_DIGEST_BLAKE2B512) {
blake2b512_ctx = __pakfire_digest_setup(pakfire, EVP_blake2b512());
goto ERROR;
}
- // Initialize context for SHA-512
+ // Initialize context for SHA-2-512
if (types & PAKFIRE_DIGEST_SHA2_512) {
sha2_512_ctx = __pakfire_digest_setup(pakfire, EVP_sha512());
if (!sha2_512_ctx)
goto ERROR;
}
- // Initialize context for SHA-256
+ // Initialize context for SHA-2-256
if (types & PAKFIRE_DIGEST_SHA2_256) {
sha2_256_ctx = __pakfire_digest_setup(pakfire, EVP_sha256());
if (!sha2_256_ctx)
goto ERROR;
}
+ // SHA-3-512
+ r = __pakfire_digest_update(pakfire, sha3_512_ctx, buffer, bytes_read);
+ if (r)
+ goto ERROR;
+
+ // SHA-3-256
+ r = __pakfire_digest_update(pakfire, sha3_256_ctx, buffer, bytes_read);
+ if (r)
+ goto ERROR;
+
// BLAKE2B512
r = __pakfire_digest_update(pakfire, blake2b512_ctx, buffer, bytes_read);
if (r)
goto ERROR;
}
+ // Finalize SHA-3-512
+ r = __pakfire_digest_finalize(pakfire, sha3_512_ctx, digests->sha3_512);
+ if (r)
+ goto ERROR;
+
+ // Finalize SHA-3-256
+ r = __pakfire_digest_finalize(pakfire, sha3_256_ctx, digests->sha3_256);
+ if (r)
+ goto ERROR;
+
// Finalize BLAKE2b512
r = __pakfire_digest_finalize(pakfire, blake2b512_ctx, digests->blake2b512);
if (r)
if (r)
goto ERROR;
- // Finalize SHA-512
+ // Finalize SHA-2-512
r = __pakfire_digest_finalize(pakfire, sha2_512_ctx, digests->sha2_512);
if (r)
goto ERROR;
- // Finalize SHA-256
+ // Finalize SHA-2-256
r = __pakfire_digest_finalize(pakfire, sha2_256_ctx, digests->sha2_256);
if (r)
goto ERROR;
r = 0;
ERROR:
+ if (sha3_512_ctx)
+ EVP_MD_CTX_free(sha3_512_ctx);
+ if (sha3_256_ctx)
+ EVP_MD_CTX_free(sha3_256_ctx);
if (blake2b512_ctx)
EVP_MD_CTX_free(blake2b512_ctx);
if (blake2s256_ctx)
return 1;
}
+ // Check SHA-3-512
+ if (types & PAKFIRE_DIGEST_SHA3_512) {
+ r = CRYPTO_memcmp(digests1->sha3_512, digests2->sha3_512, sizeof(digests1->sha3_512));
+ if (r) {
+ pakfire_digests_compare_mismatch(pakfire, "SHA-3-512",
+ digests1->sha3_512, digests2->sha3_512, sizeof(digests1->sha3_512));
+ return 1;
+ }
+ }
+
+ // Check SHA-3-256
+ if (types & PAKFIRE_DIGEST_SHA3_256) {
+ r = CRYPTO_memcmp(digests1->sha3_256, digests2->sha3_256, sizeof(digests1->sha3_256));
+ if (r) {
+ pakfire_digests_compare_mismatch(pakfire, "SHA-3-256",
+ digests1->sha3_256, digests2->sha3_256, sizeof(digests1->sha3_256));
+ return 1;
+ }
+ }
+
// Check BLAKE2b512
if (types & PAKFIRE_DIGEST_BLAKE2B512) {
r = CRYPTO_memcmp(digests1->blake2b512, digests2->blake2b512, sizeof(digests1->blake2b512));
}
}
- // Check SHA-512
+ // Check SHA-2-512
if (types & PAKFIRE_DIGEST_SHA2_512) {
r = CRYPTO_memcmp(digests1->sha2_512, digests2->sha2_512, sizeof(digests1->sha2_512));
if (r) {
}
}
- // Check SHA-256
+ // Check SHA-2-256
if (types & PAKFIRE_DIGEST_SHA2_256) {
r = CRYPTO_memcmp(digests1->sha2_256, digests2->sha2_256, sizeof(digests1->sha2_256));
if (r) {
return r;
switch (type) {
+ case PAKFIRE_DIGEST_SHA3_512:
+ memcpy(digests2.sha3_512, digest, sizeof(digests2.sha3_512));
+ break;
+
+ case PAKFIRE_DIGEST_SHA3_256:
+ memcpy(digests2.sha3_256, digest, sizeof(digests2.sha3_256));
+ break;
+
case PAKFIRE_DIGEST_BLAKE2B512:
memcpy(digests2.blake2b512, digest, sizeof(digests2.blake2b512));
break;
// Read any extended attributes
while (archive_entry_xattr_next(entry, &attr, &value, &size) == ARCHIVE_OK) {
+ // Digest: SHA-3-512
+ if (strcmp(attr, "PAKFIRE.digests.sha3_512") == 0) {
+ r = pakfire_file_set_digest(file, PAKFIRE_DIGEST_SHA3_512, value, size);
+ if (r)
+ goto ERROR;
+
+ // Digest: SHA-3-256
+ } else if (strcmp(attr, "PAKFIRE.digests.sha3_256") == 0) {
+ r = pakfire_file_set_digest(file, PAKFIRE_DIGEST_SHA3_256, value, size);
+ if (r)
+ goto ERROR;
+
// Digest: BLAKE2b512
- if (strcmp(attr, "PAKFIRE.digests.blake2b512") == 0) {
+ } else if (strcmp(attr, "PAKFIRE.digests.blake2b512") == 0) {
r = pakfire_file_set_digest(file, PAKFIRE_DIGEST_BLAKE2B512, value, size);
if (r)
goto ERROR;
// Copy digests
+ // SHA-3-512
+ if (pakfire_digest_set(file->digests.sha3_512))
+ archive_entry_xattr_add_entry(entry, "PAKFIRE.digests.sha3_512",
+ file->digests.sha3_512, sizeof(file->digests.sha3_512));
+
+ // SHA-3-256
+ if (pakfire_digest_set(file->digests.sha3_256))
+ archive_entry_xattr_add_entry(entry, "PAKFIRE.digests.sha3_256",
+ file->digests.sha3_256, sizeof(file->digests.sha3_256));
+
// BLAKE2b512
if (pakfire_digest_set(file->digests.blake2b512))
archive_entry_xattr_add_entry(entry, "PAKFIRE.digests.blake2b512",
struct pakfire_file* file, const enum pakfire_digest_types type, size_t* length) {
switch (type) {
+ case PAKFIRE_DIGEST_SHA3_512:
+ if (!pakfire_digest_set(file->digests.sha3_512))
+ return NULL;
+
+ if (length)
+ *length = sizeof(file->digests.sha3_512);
+
+ return file->digests.sha3_512;
+
+ case PAKFIRE_DIGEST_SHA3_256:
+ if (!pakfire_digest_set(file->digests.sha3_256))
+ return NULL;
+
+ if (length)
+ *length = sizeof(file->digests.sha3_256);
+
+ return file->digests.sha3_256;
+
case PAKFIRE_DIGEST_BLAKE2B512:
if (!pakfire_digest_set(file->digests.blake2b512))
return NULL;
// Store the digest
switch (type) {
+ case PAKFIRE_DIGEST_SHA3_512:
+ memcpy(file->digests.sha3_512, digest, sizeof(file->digests.sha3_512));
+ break;
+
+ case PAKFIRE_DIGEST_SHA3_256:
+ memcpy(file->digests.sha3_256, digest, sizeof(file->digests.sha3_256));
+ break;
+
case PAKFIRE_DIGEST_BLAKE2B512:
memcpy(file->digests.blake2b512, digest, sizeof(file->digests.blake2b512));
break;
}
// 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;