---
 common/image.c  |    2 +-
 common/update.c |   42 +++++++++++++++++++++++++++++++++++-------
 include/image.h |    3 +++
 3 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/common/image.c b/common/image.c
index f63a2ff..cdb7581 100644
--- a/common/image.c
+++ b/common/image.c
@@ -2398,7 +2398,7 @@ int fit_set_timestamp (void *fit, int noffset, time_t 
timestamp)
  *     0, on success
  *    -1, when algo is unsupported
  */
-static int calculate_hash (const void *data, int data_len, const char *algo,
+int calculate_hash (const void *data, int data_len, const char *algo,
                        uint8_t *value, int *value_len)
 {
        if (strcmp (algo, "crc32") == 0 ) {
diff --git a/common/update.c b/common/update.c
index 7528474..fe2139a 100644
--- a/common/update.c
+++ b/common/update.c
@@ -62,9 +62,10 @@ extern ulong load_addr;
 
 static uchar *saved_prot_info;
 
-static int update_load(char *filename, ulong msec_max, int cnt_max, ulong addr)
+static int update_load(char *filename, ulong msec_max, int cnt_max, ulong 
addr, int *size)
 {
-       int size, rv;
+       //int size, rv;
+       int rv;
        ulong saved_timeout_msecs;
        int saved_timeout_count;
        char *saved_netretry, *saved_bootfile;
@@ -86,12 +87,12 @@ static int update_load(char *filename, ulong msec_max, int 
cnt_max, ulong addr)
        /* download the update file */
        load_addr = addr;
        copy_filename(BootFile, filename, sizeof(BootFile));
-       size = NetLoop(TFTP);
+       *size = NetLoop(TFTP);
 
-       if (size < 0)
+       if (*size < 0)
                rv = 1;
-       else if (size > 0)
-               flush_cache(addr, size);
+       else if (*size > 0)
+               flush_cache(addr, *size);
 
        /* restore changed globals and env variable */
        TftpRRQTimeoutMSecs = saved_timeout_msecs;
@@ -245,6 +246,12 @@ void update_tftp(void)
        ulong update_addr, update_fladdr, update_size;
        ulong addr;
        void *fit;
+       uint8_t value[FIT_MAX_HASH_LEN];
+       char hash_string[2*FIT_MAX_HASH_LEN];
+       int value_len;
+       char *algo = "sha1";
+       char *current_hash;
+       int size = 0, i;
 
        printf("Auto-update from TFTP: ");
 
@@ -266,7 +273,7 @@ void update_tftp(void)
 
 
        if (update_load(filename, CONFIG_UPDATE_TFTP_MSEC_MAX,
-                                       CONFIG_UPDATE_TFTP_CNT_MAX, addr)) {
+                                       CONFIG_UPDATE_TFTP_CNT_MAX, addr, 
&size)) {
                printf("Can't load update file, aborting auto-update\n");
                return;
        }
@@ -279,6 +286,27 @@ void update_tftp(void)
                return;
        }
 
+       /* check for image hash */
+       current_hash = getenv("update_image_hash_sha1");
+
+       if (calculate_hash((void *)addr, size, algo, &value, &value_len)) {
+               printf(" Error: Error during hash calculation\n");
+               return 1;
+       }
+
+       /* make hash human readable, this doubles the size */
+       for (i=0; i < value_len; i++)
+               sprintf(hash_string + 2*i, "%02x", value[i]);
+
+       if (memcmp( &hash_string, current_hash, 2*value_len ) != 0) {
+               printf("Unequal hashes, start auto-update\n");
+               setenv("update_image_hash_sha1", hash_string);
+               saveenv();
+       } else {
+               printf("Equal hashes, stopping auto-update and start regular 
booting\n");
+               return 1;
+       }
+
        /* process updates */
        images_noffset = fdt_path_offset(fit, FIT_IMAGES_PATH);
 
diff --git a/include/image.h b/include/image.h
index 005e0d2..0132263 100644
--- a/include/image.h
+++ b/include/image.h
@@ -567,6 +567,9 @@ static inline ulong fit_get_size (const void *fit)
        return fdt_totalsize (fit);
 }
 
+int calculate_hash (const void *data, int data_len, const char *algo,
+                       uint8_t *value, int *value_len);
+
 /**
  * fit_get_end - get FIT image end
  * @fit: pointer to the FIT format image header
-- 
1.7.1

_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to