diff options
| author | Simon Glass <sjg@chromium.org> | 2013-05-07 06:11:58 +0000 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2013-05-14 15:37:25 -0400 | 
| commit | ab9efc665a5695cc7ff7bcb35b2d6bb5726bb9f3 (patch) | |
| tree | 75f327deb9361f4e3217c5c3d6e9deb4f1bfcc00 /common/image-fit.c | |
| parent | b8da8366500f7a88f1f5117f22f713fe920bcdd9 (diff) | |
| download | olio-uboot-2014.01-ab9efc665a5695cc7ff7bcb35b2d6bb5726bb9f3.tar.xz olio-uboot-2014.01-ab9efc665a5695cc7ff7bcb35b2d6bb5726bb9f3.zip | |
image: Move hash checking into its own function
The existing function is long and most of the code is indented a long
way. Before adding yet more code, split this out into its own function.
Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de> (v1)
Diffstat (limited to 'common/image-fit.c')
| -rw-r--r-- | common/image-fit.c | 128 | 
1 files changed, 66 insertions, 62 deletions
| diff --git a/common/image-fit.c b/common/image-fit.c index 9360af2f8..c2af55227 100644 --- a/common/image-fit.c +++ b/common/image-fit.c @@ -748,7 +748,6 @@ int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value,  	return 0;  } -#ifndef USE_HOSTCC  /**   * fit_image_hash_get_ignore - get hash ignore flag   * @fit: pointer to the FIT format image header @@ -763,7 +762,7 @@ int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value,   *     0, on ignore not found   *     value, on ignore found   */ -int fit_image_hash_get_ignore(const void *fit, int noffset, int *ignore) +static int fit_image_hash_get_ignore(const void *fit, int noffset, int *ignore)  {  	int len;  	int *value; @@ -776,7 +775,6 @@ int fit_image_hash_get_ignore(const void *fit, int noffset, int *ignore)  	return 0;  } -#endif  /**   * fit_set_timestamp - set node timestamp property @@ -849,6 +847,57 @@ int calculate_hash(const void *data, int data_len, const char *algo,  	return 0;  } +static int fit_image_check_hash(const void *fit, int noffset, const void *data, +				size_t size, char **err_msgp) +{ +	uint8_t value[FIT_MAX_HASH_LEN]; +	int value_len; +	char *algo; +	uint8_t *fit_value; +	int fit_value_len; +	int ignore; + +	*err_msgp = NULL; + +	if (fit_image_hash_get_algo(fit, noffset, &algo)) { +		*err_msgp = " error!\nCan't get hash algo " +				"property"; +		return -1; +	} +	printf("%s", algo); + +	if (IMAGE_ENABLE_IGNORE) { +		fit_image_hash_get_ignore(fit, noffset, &ignore); +		if (ignore) { +			printf("-skipped "); +			return 0; +		} +	} + +	if (fit_image_hash_get_value(fit, noffset, &fit_value, +				     &fit_value_len)) { +		*err_msgp = " error!\nCan't get hash value " +				"property"; +		return -1; +	} + +	if (calculate_hash(data, size, algo, value, &value_len)) { +		*err_msgp = " error!\n" +				"Unsupported hash algorithm"; +		return -1; +	} + +	if (value_len != fit_value_len) { +		*err_msgp = " error !\nBad hash value len"; +		return -1; +	} else if (memcmp(value, fit_value, value_len) != 0) { +		*err_msgp = " error!\nBad hash value"; +		return -1; +	} + +	return 0; +} +  /**   * fit_image_verify - verify data intergity   * @fit: pointer to the FIT format image header @@ -866,16 +915,7 @@ int fit_image_verify(const void *fit, int image_noffset)  {  	const void	*data;  	size_t		size; -	char		*algo; -	uint8_t		*fit_value; -	int		fit_value_len; -#ifndef USE_HOSTCC -	int		ignore; -#endif -	uint8_t		value[FIT_MAX_HASH_LEN]; -	int		value_len;  	int		noffset; -	int		ndepth;  	char		*err_msg = "";  	/* Get image data and data length */ @@ -885,58 +925,22 @@ int fit_image_verify(const void *fit, int image_noffset)  	}  	/* Process all hash subnodes of the component image node */ -	for (ndepth = 0, noffset = fdt_next_node(fit, image_noffset, &ndepth); -	     (noffset >= 0) && (ndepth > 0); -	     noffset = fdt_next_node(fit, noffset, &ndepth)) { -		if (ndepth == 1) { -			/* Direct child node of the component image node */ +	for (noffset = fdt_first_subnode(fit, image_noffset); +	     noffset >= 0; +	     noffset = fdt_next_subnode(fit, noffset)) { +		const char *name = fit_get_name(fit, noffset, NULL); -			/* -			 * Check subnode name, must be equal to "hash". -			 * Multiple hash nodes require unique unit node -			 * names, e.g. hash@1, hash@2, etc. -			 */ -			if (strncmp(fit_get_name(fit, noffset, NULL), -				    FIT_HASH_NODENAME, -				    strlen(FIT_HASH_NODENAME)) != 0) -				continue; - -			if (fit_image_hash_get_algo(fit, noffset, &algo)) { -				err_msg = " error!\nCan't get hash algo property"; -				goto error; -			} -			printf("%s", algo); - -#ifndef USE_HOSTCC -			fit_image_hash_get_ignore(fit, noffset, &ignore); -			if (ignore) { -				printf("-skipped "); -				continue; -			} -#endif - -			if (fit_image_hash_get_value(fit, noffset, &fit_value, -						     &fit_value_len)) { -				err_msg = " error!\nCan't get hash value " -						"property"; -				goto error; -			} - -			if (calculate_hash(data, size, algo, value, -					   &value_len)) { -				err_msg = " error!\n" -						"Unsupported hash algorithm"; -				goto error; -			} - -			if (value_len != fit_value_len) { -				err_msg = " error !\nBad hash value len"; -				goto error; -			} else if (memcmp(value, fit_value, value_len) != 0) { -				err_msg = " error!\nBad hash value"; +		/* +		 * Check subnode name, must be equal to "hash". +		 * Multiple hash nodes require unique unit node +		 * names, e.g. hash@1, hash@2, etc. +		 */ +		if (!strncmp(name, FIT_HASH_NODENAME, +			     strlen(FIT_HASH_NODENAME))) { +			if (fit_image_check_hash(fit, noffset, data, size, +						 &err_msg))  				goto error; -			} -			printf("+ "); +			puts("+ ");  		}  	} |