From 7590378fb9c686709492ceb142825cd058255956 Mon Sep 17 00:00:00 2001 From: Bartlomiej Sieka Date: Fri, 25 Apr 2008 13:54:02 +0200 Subject: [PATCH] Use watchdog-aware functions when calculating hashes of images - take two Some files didn't get updated properly with the "Use watchdog-aware functions when calculating hashes of images" commit, this commit fixes this. Signed-off-by: Bartlomiej Sieka Signed-off-by: Wolfgang Denk --- common/image.c | 42 ++++++++---------------------------------- include/image.h | 17 +++++++++++++++-- lib_generic/md5.c | 4 ++++ lib_generic/sha1.c | 4 ++++ 4 files changed, 31 insertions(+), 36 deletions(-) diff --git a/common/image.c b/common/image.c index 83e359312c..4a024d4dfb 100644 --- a/common/image.c +++ b/common/image.c @@ -156,6 +156,7 @@ static table_entry_t uimage_comp[] = { }; uint32_t crc32 (uint32_t, const unsigned char *, uint); +uint32_t crc32_wd (uint32_t, const unsigned char *, uint, uint); static void genimg_print_size (uint32_t size); #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || defined(USE_HOSTCC) static void genimg_print_time (time_t timestamp); @@ -183,39 +184,11 @@ int image_check_dcrc (image_header_t *hdr) { ulong data = image_get_data (hdr); ulong len = image_get_data_size (hdr); - ulong dcrc = crc32 (0, (unsigned char *)data, len); + ulong dcrc = crc32_wd (0, (unsigned char *)data, len, CHUNKSZ_CRC32); return (dcrc == image_get_dcrc (hdr)); } -#ifndef USE_HOSTCC -int image_check_dcrc_wd (image_header_t *hdr, ulong chunksz) -{ - ulong dcrc = 0; - ulong len = image_get_data_size (hdr); - ulong data = image_get_data (hdr); - -#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) - ulong cdata = data; - ulong edata = cdata + len; - - while (cdata < edata) { - ulong chunk = edata - cdata; - - if (chunk > chunksz) - chunk = chunksz; - dcrc = crc32 (dcrc, (unsigned char *)cdata, chunk); - cdata += chunk; - - WATCHDOG_RESET (); - } -#else - dcrc = crc32 (0, (unsigned char *)data, len); -#endif - - return (dcrc == image_get_dcrc (hdr)); -} -#endif /* !USE_HOSTCC */ /** * image_multi_count - get component (sub-image) count @@ -416,7 +389,7 @@ static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch, if (verify) { puts(" Verifying Checksum ... "); - if (!image_check_dcrc_wd (rd_hdr, CHUNKSZ)) { + if (!image_check_dcrc (rd_hdr)) { puts ("Bad Data CRC\n"); show_boot_progress (-12); return NULL; @@ -1923,15 +1896,16 @@ static int calculate_hash (const void *data, int data_len, const char *algo, uint8_t *value, int *value_len) { if (strcmp (algo, "crc32") == 0 ) { - *((uint32_t *)value) = crc32 (0, data, data_len); + *((uint32_t *)value) = crc32_wd (0, data, data_len, + CHUNKSZ_CRC32); *((uint32_t *)value) = cpu_to_uimage (*((uint32_t *)value)); *value_len = 4; } else if (strcmp (algo, "sha1") == 0 ) { - sha1_csum ((unsigned char *) data, data_len, - (unsigned char *) value); + sha1_csum_wd ((unsigned char *) data, data_len, + (unsigned char *) value, CHUNKSZ_SHA1); *value_len = 20; } else if (strcmp (algo, "md5") == 0 ) { - md5 ((unsigned char *)data, data_len, value); + md5_wd ((unsigned char *)data, data_len, value, CHUNKSZ_MD5); *value_len = 16; } else { debug ("Unsupported hash alogrithm\n"); diff --git a/include/image.h b/include/image.h index 4076484a5d..664e51e490 100644 --- a/include/image.h +++ b/include/image.h @@ -227,9 +227,23 @@ typedef struct bootm_headers { /* * Some systems (for example LWMON) have very short watchdog periods; * we must make sure to split long operations like memmove() or - * crc32() into reasonable chunks. + * checksum calculations into reasonable chunks. */ +#ifndef CHUNKSZ #define CHUNKSZ (64 * 1024) +#endif + +#ifndef CHUNKSZ_CRC32 +#define CHUNKSZ_CRC32 (64 * 1024) +#endif + +#ifndef CHUNKSZ_MD5 +#define CHUNKSZ_MD5 (64 * 1024) +#endif + +#ifndef CHUNKSZ_SHA1 +#define CHUNKSZ_SHA1 (64 * 1024) +#endif #define uimage_to_cpu(x) ntohl(x) #define cpu_to_uimage(x) htonl(x) @@ -363,7 +377,6 @@ static inline void image_set_name (image_header_t *hdr, const char *name) int image_check_hcrc (image_header_t *hdr); int image_check_dcrc (image_header_t *hdr); #ifndef USE_HOSTCC -int image_check_dcrc_wd (image_header_t *hdr, ulong chunksize); int getenv_yesno (char *var); ulong getenv_bootm_low(void); ulong getenv_bootm_size(void); diff --git a/lib_generic/md5.c b/lib_generic/md5.c index 20178b8dcd..78ef47535e 100644 --- a/lib_generic/md5.c +++ b/lib_generic/md5.c @@ -25,6 +25,10 @@ and to fit the cifs vfs by Steve French sfrench@us.ibm.com */ +#ifndef USE_HOSTCC +#include +#endif /* USE_HOSTCC */ +#include #include #include #include diff --git a/lib_generic/sha1.c b/lib_generic/sha1.c index 69506592f7..c8ef4d2827 100644 --- a/lib_generic/sha1.c +++ b/lib_generic/sha1.c @@ -29,6 +29,10 @@ #define _CRT_SECURE_NO_DEPRECATE 1 #endif +#ifndef USE_HOSTCC +#include +#endif /* USE_HOSTCC */ +#include #include #include "sha1.h" -- 2.39.5