mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-08 19:11:53 +00:00
SPL: Add signature verification when loading image
U-boot proper signature is not verified by SPL on most platforms even config SPL_FIT_SIGNATURE is enabled. Only fsl-layerscape platform support secure boot in platform specific code. So verified boot cannot be achieved if u-boot proper is loaded by SPL. This patch add signature verification to u-boot proper images when loading FIT image in SPL. It is tested on Allwinner bananapi zero board with H2+ SoC. Signed-off-by: Jun Nie <jun.nie@linaro.org>
This commit is contained in:
parent
50905b55c7
commit
5c643db4cc
3 changed files with 48 additions and 22 deletions
|
@ -1068,34 +1068,14 @@ static int fit_image_check_hash(const void *fit, int noffset, const void *data,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
int fit_image_verify_with_data(const void *fit, int image_noffset,
|
||||||
* fit_image_verify - verify data integrity
|
const void *data, size_t size)
|
||||||
* @fit: pointer to the FIT format image header
|
|
||||||
* @image_noffset: component image node offset
|
|
||||||
*
|
|
||||||
* fit_image_verify() goes over component image hash nodes,
|
|
||||||
* re-calculates each data hash and compares with the value stored in hash
|
|
||||||
* node.
|
|
||||||
*
|
|
||||||
* returns:
|
|
||||||
* 1, if all hashes are valid
|
|
||||||
* 0, otherwise (or on error)
|
|
||||||
*/
|
|
||||||
int fit_image_verify(const void *fit, int image_noffset)
|
|
||||||
{
|
{
|
||||||
const void *data;
|
|
||||||
size_t size;
|
|
||||||
int noffset = 0;
|
int noffset = 0;
|
||||||
char *err_msg = "";
|
char *err_msg = "";
|
||||||
int verify_all = 1;
|
int verify_all = 1;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Get image data and data length */
|
|
||||||
if (fit_image_get_data(fit, image_noffset, &data, &size)) {
|
|
||||||
err_msg = "Can't get image data/size";
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Verify all required signatures */
|
/* Verify all required signatures */
|
||||||
if (IMAGE_ENABLE_VERIFY &&
|
if (IMAGE_ENABLE_VERIFY &&
|
||||||
fit_image_verify_required_sigs(fit, image_noffset, data, size,
|
fit_image_verify_required_sigs(fit, image_noffset, data, size,
|
||||||
|
@ -1152,6 +1132,38 @@ error:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fit_image_verify - verify data integrity
|
||||||
|
* @fit: pointer to the FIT format image header
|
||||||
|
* @image_noffset: component image node offset
|
||||||
|
*
|
||||||
|
* fit_image_verify() goes over component image hash nodes,
|
||||||
|
* re-calculates each data hash and compares with the value stored in hash
|
||||||
|
* node.
|
||||||
|
*
|
||||||
|
* returns:
|
||||||
|
* 1, if all hashes are valid
|
||||||
|
* 0, otherwise (or on error)
|
||||||
|
*/
|
||||||
|
int fit_image_verify(const void *fit, int image_noffset)
|
||||||
|
{
|
||||||
|
const void *data;
|
||||||
|
size_t size;
|
||||||
|
int noffset = 0;
|
||||||
|
char *err_msg = "";
|
||||||
|
|
||||||
|
/* Get image data and data length */
|
||||||
|
if (fit_image_get_data(fit, image_noffset, &data, &size)) {
|
||||||
|
err_msg = "Can't get image data/size";
|
||||||
|
printf("error!\n%s for '%s' hash node in '%s' image node\n",
|
||||||
|
err_msg, fit_get_name(fit, noffset, NULL),
|
||||||
|
fit_get_name(fit, image_noffset, NULL));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fit_image_verify_with_data(fit, image_noffset, data, size);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fit_all_image_verify - verify data integrity for all images
|
* fit_all_image_verify - verify data integrity for all images
|
||||||
* @fit: pointer to the FIT format image header
|
* @fit: pointer to the FIT format image header
|
||||||
|
|
|
@ -174,6 +174,9 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
|
||||||
uint8_t image_comp = -1, type = -1;
|
uint8_t image_comp = -1, type = -1;
|
||||||
const void *data;
|
const void *data;
|
||||||
bool external_data = false;
|
bool external_data = false;
|
||||||
|
#ifdef CONFIG_SPL_FIT_SIGNATURE
|
||||||
|
int ret;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_SPL_OS_BOOT) && IS_ENABLED(CONFIG_SPL_GZIP)) {
|
if (IS_ENABLED(CONFIG_SPL_OS_BOOT) && IS_ENABLED(CONFIG_SPL_GZIP)) {
|
||||||
if (fit_image_get_comp(fit, node, &image_comp))
|
if (fit_image_get_comp(fit, node, &image_comp))
|
||||||
|
@ -252,7 +255,16 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
|
||||||
image_info->entry_point = fdt_getprop_u32(fit, node, "entry");
|
image_info->entry_point = fdt_getprop_u32(fit, node, "entry");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPL_FIT_SIGNATURE
|
||||||
|
printf("## Checking hash(es) for Image %s ...\n",
|
||||||
|
fit_get_name(fit, node, NULL));
|
||||||
|
ret = fit_image_verify_with_data(fit, node,
|
||||||
|
(const void *)load_addr, length);
|
||||||
|
printf("\n");
|
||||||
|
return !ret;
|
||||||
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int spl_fit_append_fdt(struct spl_image_info *spl_image,
|
static int spl_fit_append_fdt(struct spl_image_info *spl_image,
|
||||||
|
|
|
@ -1013,6 +1013,8 @@ int fit_add_verification_data(const char *keydir, void *keydest, void *fit,
|
||||||
const char *comment, int require_keys,
|
const char *comment, int require_keys,
|
||||||
const char *engine_id);
|
const char *engine_id);
|
||||||
|
|
||||||
|
int fit_image_verify_with_data(const void *fit, int image_noffset,
|
||||||
|
const void *data, size_t size);
|
||||||
int fit_image_verify(const void *fit, int noffset);
|
int fit_image_verify(const void *fit, int noffset);
|
||||||
int fit_config_verify(const void *fit, int conf_noffset);
|
int fit_config_verify(const void *fit, int conf_noffset);
|
||||||
int fit_all_image_verify(const void *fit);
|
int fit_all_image_verify(const void *fit);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue