int
main(int argc, char **argv)
{
- unsigned int arg, crc;
+ unsigned int arg, crc_header, crc_payload;
char *filename = NULL;
int fd, fd_mode;
unsigned char *buffer = NULL;
unsigned int offset = 0;
unsigned int count = 0;
unsigned int next = 1;
+ void *payload = NULL;
while (next) {
unsigned long len = 0;
+ crc_header = crc_payload = 0xffffffff;
+
if (count) // switch struct type after initial file header
header_len = sizeof(IMAGE_TAG);
} else {
next = *(unsigned char *)(pimage->imageNext);
len = atol(pimage->imageLen);
+ offset += sizeof(IMAGE_TAG);
}
- if (!count) {
- printf("Image Offset: 0x%08x\n", 0x20000);
+ crc_header = crc32(buffer, header_len - (count ? CRC_LEN : TOKEN_LEN), crc_header);
+
+ // read payload and calculate CRC32
+ lseek(fd, offset, SEEK_SET);
+ if ( (payload = heap_and_reap(NULL, len, 1)) != NULL) {
+ if ( (qty = read(fd, payload, len)) < len) {
+ fprintf(stderr, "skipping CRC calculation: only able to read %ld of %ld bytes\n", qty, len);
+ } else {
+ crc_payload = crc32(payload, len, crc_payload);
+
+ heap_and_reap(payload, 0, 0);
+ }
+ } else {
+ close(fd);
+ pr_error_exit(0, "unable to allocate memory (%ld bytes)\n", len);
+ }
+ if (!count) {
+ printf("Image Offset: 0x%08x\n", offset);
printf("%04lx Tag Version: %s\n"
"%04lx Signature 1: %s\n"
"%04lx Signature 2: %s\n"
"%04lx Internal Version: %s\n"
"%04lx Image Next: %u\n"
"%04lx Image Validation Token: 0x%08x\n"
- "%04lx Tag Validation Token: 0x%08x\n"
+ "%04lx Tag Validation Token: 0x%08x\n"
+ " Calculated Image CRC32: 0x%08x\n"
+ " Calculated Tag CRC32: 0x%08x\n"
"\n",
offsetof(struct _FILE_TAG, tagVersion), pfile->tagVersion,
offsetof(struct _FILE_TAG, signiture_1), pfile->signiture_1,
offsetof(struct _FILE_TAG, internalversion), pfile->internalversion,
offsetof(struct _FILE_TAG, imageNext), next,
offsetof(struct _FILE_TAG, imageValidationToken), ntohl( *((unsigned int *)(pfile->imageValidationToken)) ),
- offsetof(struct _FILE_TAG, tagValidationToken), ntohl( *((unsigned int *)(pfile->tagValidationToken)) )
+ offsetof(struct _FILE_TAG, tagValidationToken), ntohl( *((unsigned int *)(pfile->tagValidationToken)) ),
+ crc_payload,
+ crc_header
);
} else {
- printf("Image Offset: 0x%08lx\n", offset + sizeof(IMAGE_TAG));
+ printf("Image Offset: 0x%08x\n", offset);
printf("%04lx Image Next: %u\n"
"%04lx Image Type: %s (%lu)\n"
"%04lx Image Signature: %u\n"
"%04lx Image Len: %s (0x%08lx)\n"
"%04lx Image Validation Token: 0x%08x\n"
- "%04lx Tag Validation Token: 0x%08x\n"
+ "%04lx Tag Validation Token: 0x%08x\n"
+ " Calculated Image CRC32: 0x%08x\n"
+ " Calculated Tag CRC32: 0x%08x\n"
"\n",
offsetof(struct _IMAGE_TAG, imageNext), next,
offsetof(struct _IMAGE_TAG, imageType), image_type[atol(pimage->imageType)], atol(pimage->imageType),
offsetof(struct _IMAGE_TAG, imageSignature), (unsigned int)*pimage->imageSignature,
offsetof(struct _IMAGE_TAG, imageLen), pimage->imageLen, len,
offsetof(struct _IMAGE_TAG, imageValidationToken), ntohl( *((unsigned int *)(pimage->imageValidationToken)) ),
- offsetof(struct _IMAGE_TAG, tagValidationToken), ntohl( *((unsigned int *)(pimage->tagValidationToken)) )
+ offsetof(struct _IMAGE_TAG, tagValidationToken), ntohl( *((unsigned int *)(pimage->tagValidationToken)) ),
+ crc_payload,
+ crc_header
);
}
+
+ // next seek point will be end of current payload
offset += len;
heap_and_reap(buffer, 0, 0);