mirror of
https://github.com/aaru-dps/libaaruformat.git
synced 2025-12-16 19:24:40 +00:00
Use CRC64.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
46
src/open.c
46
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);
|
||||
|
||||
Reference in New Issue
Block a user