|
|
|
@ -19,6 +19,7 @@ |
|
|
|
|
|
|
|
|
|
#include "imagetool.h" |
|
|
|
|
#include "mxsimage.h" |
|
|
|
|
#include "pbl_crc32.h" |
|
|
|
|
#include <image.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -231,29 +232,6 @@ static int sb_aes_reinit(struct sb_image_ctx *ictx, int enc) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* CRC32 |
|
|
|
|
*/ |
|
|
|
|
static uint32_t crc32(uint8_t *data, uint32_t len) |
|
|
|
|
{ |
|
|
|
|
const uint32_t poly = 0x04c11db7; |
|
|
|
|
uint32_t crc32 = 0xffffffff; |
|
|
|
|
unsigned int byte, bit; |
|
|
|
|
|
|
|
|
|
for (byte = 0; byte < len; byte++) { |
|
|
|
|
crc32 ^= data[byte] << 24; |
|
|
|
|
|
|
|
|
|
for (bit = 8; bit > 0; bit--) { |
|
|
|
|
if (crc32 & (1UL << 31)) |
|
|
|
|
crc32 = (crc32 << 1) ^ poly; |
|
|
|
|
else |
|
|
|
|
crc32 = (crc32 << 1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return crc32; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Debug |
|
|
|
|
*/ |
|
|
|
|
static void soprintf(struct sb_image_ctx *ictx, const char *fmt, ...) |
|
|
|
@ -998,7 +976,9 @@ static int sb_build_command_load(struct sb_image_ctx *ictx, |
|
|
|
|
|
|
|
|
|
ccmd->load.address = dest; |
|
|
|
|
ccmd->load.count = cctx->length; |
|
|
|
|
ccmd->load.crc32 = crc32(cctx->data, cctx->length); |
|
|
|
|
ccmd->load.crc32 = pbl_crc32(0, |
|
|
|
|
(const char *)cctx->data, |
|
|
|
|
cctx->length); |
|
|
|
|
|
|
|
|
|
cctx->size = sizeof(*ccmd) + cctx->length; |
|
|
|
|
|
|
|
|
@ -1834,7 +1814,9 @@ static int sb_verify_command(struct sb_image_ctx *ictx, |
|
|
|
|
EVP_DigestUpdate(&ictx->md_ctx, cctx->data, asize); |
|
|
|
|
sb_aes_crypt(ictx, cctx->data, cctx->data, asize); |
|
|
|
|
|
|
|
|
|
if (ccmd->load.crc32 != crc32(cctx->data, asize)) { |
|
|
|
|
if (ccmd->load.crc32 != pbl_crc32(0, |
|
|
|
|
(const char *)cctx->data, |
|
|
|
|
asize)) { |
|
|
|
|
fprintf(stderr, |
|
|
|
|
"ERR: SB LOAD command payload CRC32 invalid!\n"); |
|
|
|
|
return -EINVAL; |
|
|
|
|