Use CRC64.

This commit is contained in:
2019-03-20 23:55:32 +00:00
parent cbbd54be89
commit 4ab2e1bb49
3 changed files with 51 additions and 7 deletions

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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);