diff --git a/include/dicformat/decls.h b/include/dicformat/decls.h index ae02976..ca9ee7d 100644 --- a/include/dicformat/decls.h +++ b/include/dicformat/decls.h @@ -50,12 +50,12 @@ void *crc64_init(uint64_t polynomial, uint64_t seed); void *crc64_init_ecma(void); -void crc64_update(void *context, const char *data, size_t len); +void crc64_update(void *context, const uint8_t *data, size_t len); uint64_t crc64_final(void *context); -uint64_t crc64_data(const char *data, size_t len, uint64_t polynomial, uint64_t seed); +uint64_t crc64_data(const uint8_t *data, size_t len, uint64_t polynomial, uint64_t seed); -uint64_t crc64_data_ecma(const char *data, size_t len); +uint64_t crc64_data_ecma(const uint8_t *data, size_t len); #endif //LIBDICFORMAT_DECLS_H diff --git a/src/crc64.c b/src/crc64.c index 275f16a..af268e4 100644 --- a/src/crc64.c +++ b/src/crc64.c @@ -70,7 +70,7 @@ void *crc64_init_ecma(void) } -void crc64_update(void *context, const char *data, size_t len) +void crc64_update(void *context, const uint8_t *data, size_t len) { Crc64Context *ctx = context; @@ -85,7 +85,7 @@ uint64_t crc64_final(void *context) return ctx->hashInt ^ ctx->finalSeed; } -uint64_t crc64_data(const char *data, size_t len, uint64_t polynomial, uint64_t seed) +uint64_t crc64_data(const uint8_t *data, size_t len, uint64_t polynomial, uint64_t seed) { uint64_t table[256]; uint64_t hashInt = seed; @@ -108,7 +108,7 @@ uint64_t crc64_data(const char *data, size_t len, uint64_t polynomial, uint64_t return hashInt ^ seed; } -uint64_t crc64_data_ecma(const char *data, size_t len) +uint64_t crc64_data_ecma(const uint8_t *data, size_t len) { return crc64_data(data, len, CRC64_ECMA_POLY, CRC64_ECMA_SEED); } diff --git a/src/open.c b/src/open.c index b1a2b31..16acbe4 100644 --- a/src/open.c +++ b/src/open.c @@ -49,6 +49,7 @@ void *open(const char *filepath) IndexEntry *idxEntries; uint8_t *data; uint32_t *cdDdt; + uint64_t crc64; ctx = (dicformatContext *)malloc(sizeof(dicformatContext)); memset(ctx, 0, sizeof(dicformatContext)); @@ -273,7 +274,15 @@ void *open(const char *filepath) break; } - // TODO: Check CRC, if not correct, skip it + crc64 = crc64_data_ecma(data, blockHeader.length); + if(crc64 != blockHeader.crc64) + { + fprintf(stderr, + "libdicformat: Incorrect CRC found: 0x%"PRIx64" found, expected 0x%"PRIx64", continuing...", + crc64, + blockHeader.crc64); + break; + } dataLinkedList *mediaTag = NULL; @@ -757,6 +766,18 @@ void *open(const char *filepath) fprintf(stderr, "libdicformat: Could not read metadata block, continuing..."); } + crc64 = + crc64_data_ecma((const uint8_t *)ctx->trackEntries, + ctx->tracksHeader.entries * sizeof(TrackEntry)); + if(crc64 != ctx->tracksHeader.crc64) + { + fprintf(stderr, + "libdicformat: Incorrect CRC found: 0x%"PRIx64" found, expected 0x%"PRIx64", continuing...", + crc64, + ctx->tracksHeader.crc64); + break; + } + fprintf(stderr, "libdicformat: Found %d tracks at position %"PRIu64".", ctx->tracksHeader.entries, @@ -831,6 +852,29 @@ void *open(const char *filepath) idxEntries[i].offset); } + data = (uint8_t *)malloc(ctx->dumpHardwareHeader.length); + if(data != NULL) + { + readBytes = fread(data, ctx->dumpHardwareHeader.length, 1, ctx->imageStream); + + if(readBytes == ctx->dumpHardwareHeader.length) + { + crc64 = crc64_data_ecma(data, ctx->dumpHardwareHeader.length); + if(crc64 != ctx->dumpHardwareHeader.crc64) + { + free(data); + fprintf(stderr, + "libdicformat: Incorrect CRC found: 0x%"PRIx64" found, expected 0x%"PRIx64", continuing...", + crc64, + ctx->dumpHardwareHeader.crc64); + break; + } + } + + free(data); + fseek(ctx->imageStream, -readBytes, SEEK_CUR); + } + ctx->dumpHardwareEntriesWithData = (DumpHardwareEntriesWithData *)malloc(sizeof(DumpHardwareEntriesWithData) * ctx->dumpHardwareHeader.entries);