/* Check header CRC of the uImage header */ static int image_check_hcrc(const image_header_t *hdr) { uint32_t hcrc; image_header_t header; /* Copy header so we can blank CRC field for re-calculation */ memcpy(&header, hdr, sizeof(header)); image_set_hcrc(&header, 0); hcrc = crc32(0, &header, sizeof(header)); return (hcrc == image_get_hcrc(hdr)); }
int image_check_hcrc(const image_header_t *hdr) { ulong hcrc; ulong len = image_get_header_size(); image_header_t header; /* Copy header so we can blank CRC field for re-calculation */ memmove(&header, (char *)hdr, image_get_header_size()); image_set_hcrc(&header, 0); hcrc = crc32(0, (unsigned char *)&header, len); return (hcrc == image_get_hcrc(hdr)); }
static int image_verify_header(char *ptr, int fd) { int len, nread; char *data; uint32_t checksum; image_header_t *hdr = (image_header_t *)ptr; char buf[PAGE_SIZE]; if (image_get_magic(hdr) != IH_MAGIC) return 0; data = (char *)hdr; len = image_get_header_size(); checksum = image_get_hcrc(hdr); hdr->ih_hcrc = htonl(0); /* clear for re-calculation */ if (crc32(0, data, len) != checksum) { fprintf(stderr, "%s: Maybe image found but it has bad header checksum!\n", cmdname); return 0; } len = image_get_size(hdr); checksum = 0; while (len > 0) { nread = read(fd, buf, MIN(len,PAGE_SIZE)); if (nread != MIN(len,PAGE_SIZE)) { fprintf(stderr, "%s: Error while reading: %s\n", cmdname, strerror(errno)); exit(EXIT_FAILURE); } checksum = crc32(checksum, buf, nread); len -= nread; } if (checksum != image_get_dcrc(hdr)) { fprintf (stderr, "%s: Maybe image found but it has corrupted data!\n", cmdname); return 0; } return 1; }