diff --git a/include/aaruformat/context.h b/include/aaruformat/context.h index 5725c2e..f67c234 100644 --- a/include/aaruformat/context.h +++ b/include/aaruformat/context.h @@ -25,6 +25,7 @@ #include "md5.h" #include "sha1.h" #include "sha256.h" +#include "spamsum.h" #include "structs.h" #include "utarray.h" @@ -213,14 +214,16 @@ typedef struct aaruformatContext hash_map_t *sectorHashMap; ///< Deduplication hash map (fingerprint->entry mapping). bool deduplicate; ///< Storage deduplication active (duplicates coalesce). - bool rewinded; ///< True if stream has been rewound after open (write path). - uint64_t last_written_block; ///< Last written block number (write path). - bool calculating_md5; ///< True if whole-image MD5 being calculated on-the-fly. - md5_ctx md5_context; ///< Opaque MD5 context for streaming updates - bool calculating_sha1; ///< True if whole-image SHA-1 being calculated on-the-fly. - sha1_ctx sha1_context; ///< Opaque SHA-1 context for streaming updates - bool calculating_sha256; ///< True if whole-image SHA-256 being calculated on-the-fly. - sha256_ctx sha256_context; ///< Opaque SHA-256 context for streaming updates + bool rewinded; ///< True if stream has been rewound after open (write path). + uint64_t last_written_block; ///< Last written block number (write path). + bool calculating_md5; ///< True if whole-image MD5 being calculated on-the-fly. + md5_ctx md5_context; ///< Opaque MD5 context for streaming updates + bool calculating_sha1; ///< True if whole-image SHA-1 being calculated on-the-fly. + sha1_ctx sha1_context; ///< Opaque SHA-1 context for streaming updates + bool calculating_sha256; ///< True if whole-image SHA-256 being calculated on-the-fly. + sha256_ctx sha256_context; ///< Opaque SHA-256 context for streaming updates + bool calculating_spamsum; ///< True if whole-image SpamSum being calculated on-the-fly. + spamsum_ctx *spamsum_context; ///< Opaque SpamSum context for streaming updates } aaruformatContext; /** \struct DumpHardwareEntriesWithData diff --git a/include/aaruformat/spamsum.h b/include/aaruformat/spamsum.h index 5f8c508..32ee7e7 100644 --- a/include/aaruformat/spamsum.h +++ b/include/aaruformat/spamsum.h @@ -21,8 +21,6 @@ #include -#include "decls.h" - #define SPAMSUM_LENGTH 64 #define NUM_BLOCKHASHES 31 #define ROLLING_WINDOW 7 diff --git a/src/close.c b/src/close.c index 99ba33d..a634f50 100644 --- a/src/close.c +++ b/src/close.c @@ -516,6 +516,13 @@ int aaruf_close(void *context) ctx->checksums.hasSha256 = true; aaruf_sha256_final(&ctx->sha256_context, ctx->checksums.sha256); } + if(ctx->calculating_spamsum) + { + ctx->checksums.hasSpamSum = true; + ctx->checksums.spamsum = calloc(1, FUZZY_MAX_RESULT); + aaruf_spamsum_final(ctx->spamsum_context, ctx->checksums.spamsum); + aaruf_spamsum_free(ctx->spamsum_context); + } // Write the checksums block bool has_checksums = diff --git a/src/create.c b/src/create.c index 9395325..e8d5a45 100644 --- a/src/create.c +++ b/src/create.c @@ -325,6 +325,11 @@ void *aaruf_create(const char *filepath, const uint32_t media_type, const uint32 ctx->calculating_sha256 = true; aaruf_sha256_init(&ctx->sha256_context); } + if(parsed_options.spamsum) + { + ctx->calculating_spamsum = true; + ctx->spamsum_context = aaruf_spamsum_init(); + } // Is writing ctx->isWriting = true; diff --git a/src/write.c b/src/write.c index 93be169..31d4914 100644 --- a/src/write.c +++ b/src/write.c @@ -158,6 +158,8 @@ int32_t aaruf_write_sector(void *context, uint64_t sector_address, bool negative if(ctx->calculating_sha1) ctx->calculating_sha1 = false; // Disable SHA256 calculation if(ctx->calculating_sha256) ctx->calculating_sha256 = false; + // Disable SpamSum calculation + if(ctx->calculating_spamsum) ctx->calculating_spamsum = false; } else ctx->last_written_block = sector_address; @@ -172,6 +174,9 @@ int32_t aaruf_write_sector(void *context, uint64_t sector_address, bool negative // Calculate SHA256 on-the-fly if requested and sector is within user sectors (not negative or overflow) if(ctx->calculating_sha256 && !negative && sector_address <= ctx->imageInfo.Sectors) aaruf_sha256_update(&ctx->sha256_context, data, length); + // Calculate SpamSum on-the-fly if requested and sector is within user sectors (not negative or overflow) + if(ctx->calculating_sha256 && !negative && sector_address <= ctx->imageInfo.Sectors) + aaruf_spamsum_update(&ctx->spamsum_context, data, length); // TODO: If optical disc check track