summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsave2010-05-19 09:36:57 +0000
committersave2010-05-19 09:36:57 +0000
commitd54f13c252dcb7fb0aaa5110542fd018ef075c86 (patch)
tree3bbfe548e7e0f68168c21f61dfb6c67bbb75a440
parent8410ab32a26d131c667c2d98ffa72e20d9b61c74 (diff)
cleo/u-boot/spidupd: check md5 of downloaded image without header, closes #1546
git-svn-id: svn+ssh://pessac/svn/cesar/trunk@7115 017c9cb6-072f-447c-8318-d5b54f68fe89
-rw-r--r--cleopatre/u-boot-1.1.6/net/spidupd.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/cleopatre/u-boot-1.1.6/net/spidupd.c b/cleopatre/u-boot-1.1.6/net/spidupd.c
index a1059056db..e5ad4d077e 100644
--- a/cleopatre/u-boot-1.1.6/net/spidupd.c
+++ b/cleopatre/u-boot-1.1.6/net/spidupd.c
@@ -566,19 +566,19 @@ static void md5_print(md5_byte_t digest[16])
#endif
/**
- * Calculate MD5 of an image.
+ * Calculate MD5 of an area.
*
+ * \param addr start address.
+ * \param len length for calcul.
* \param md5_sum md5 result.
*/
-static void md5_image(md5_byte_t md5_sum[16])
+static void md5_calculation(ulong addr, int len, md5_byte_t md5_sum[16])
{
md5_state_t state;
- struct update_image *image = ctx.image;
- struct update_place *place = ctx.place;
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
- ulong bdata = place->ram_addr;
- ulong edata = bdata + image->len;
+ ulong bdata = addr;
+ ulong edata = bdata + len;
#endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
md5_init(&state);
@@ -601,7 +601,7 @@ static void md5_image(md5_byte_t md5_sum[16])
}
#else /* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */
- md5_append(&state, (const md5_byte_t *)place->ram_addr, image->len);
+ md5_append(&state, (const md5_byte_t *)addr, len);
#endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
@@ -728,8 +728,8 @@ static void SpidupdHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len
VsUpdStartReq_t *vs_update_start_req;
VsUpdTransfReq_t *vs_update_transfer_req;
VsUpdEndReq_t *vs_update_end_req;
- uchar md5_server[16];
- uchar md5_client[16];
+ uchar md5_all_image[16];
+ uchar md5_image[16];
struct update_image *image = ctx.image;
struct update_place *place = ctx.place;
ushort mmtype;
@@ -948,10 +948,15 @@ static void SpidupdHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len
ctx.state = STATE_UPD_END;
/* Transfer is finished so calculate MD5 */
- memcpy(md5_client, vs_update_end_req->md5_sum, 16);
- md5_image((md5_byte_t *)md5_server);
-
- if( memcmp(md5_server, md5_client, 16) != 0 )
+ md5_calculation(place->ram_addr,
+ image->len,
+ (md5_byte_t *)md5_all_image);
+ md5_calculation(place->ram_addr + sizeof(spidcom_image_desc_t),
+ image->len - sizeof(spidcom_image_desc_t),
+ (md5_byte_t *)md5_image);
+
+ if((memcmp(md5_all_image, vs_update_end_req->md5_sum, 16) != 0) ||
+ (memcmp(md5_image, ((spidcom_image_desc_t *)place->ram_addr)->md5_sum, 16) != 0))
{
/* Wrong MD5 */
printf("Error (MD5 Error).\n");