提交 7d914bc7 编写于 作者: T Tom Rini

Merge branch '2020-08-07-mkimage-improvements'

- Assorted mkimage improvements related to FIT images and verified boot
...@@ -606,8 +606,8 @@ static int fit_import_data(struct image_tool_params *params, const char *fname) ...@@ -606,8 +606,8 @@ static int fit_import_data(struct image_tool_params *params, const char *fname)
continue; continue;
debug("Importing data size %x\n", len); debug("Importing data size %x\n", len);
ret = fdt_setprop(fdt, node, "data", fdt + data_base + buf_ptr, ret = fdt_setprop(fdt, node, "data",
len); old_fdt + data_base + buf_ptr, len);
if (ret) { if (ret) {
debug("%s: Failed to write property: %s\n", __func__, debug("%s: Failed to write property: %s\n", __func__,
fdt_strerror(ret)); fdt_strerror(ret));
......
...@@ -323,15 +323,15 @@ err: ...@@ -323,15 +323,15 @@ err:
static int fit_image_setup_cipher(struct image_cipher_info *info, static int fit_image_setup_cipher(struct image_cipher_info *info,
const char *keydir, void *fit, const char *keydir, void *fit,
const char *image_name, int image_noffset, const char *image_name, int image_noffset,
const char *node_name, int noffset) int noffset)
{ {
char *algo_name; char *algo_name;
char filename[128]; char filename[128];
int ret = -1; int ret = -1;
if (fit_image_cipher_get_algo(fit, noffset, &algo_name)) { if (fit_image_cipher_get_algo(fit, noffset, &algo_name)) {
printf("Can't get algo name for cipher '%s' in image '%s'\n", printf("Can't get algo name for cipher in image '%s'\n",
node_name, image_name); image_name);
goto out; goto out;
} }
...@@ -340,16 +340,16 @@ static int fit_image_setup_cipher(struct image_cipher_info *info, ...@@ -340,16 +340,16 @@ static int fit_image_setup_cipher(struct image_cipher_info *info,
/* Read the key name */ /* Read the key name */
info->keyname = fdt_getprop(fit, noffset, FIT_KEY_HINT, NULL); info->keyname = fdt_getprop(fit, noffset, FIT_KEY_HINT, NULL);
if (!info->keyname) { if (!info->keyname) {
printf("Can't get key name for cipher '%s' in image '%s'\n", printf("Can't get key name for cipher in image '%s'\n",
node_name, image_name); image_name);
goto out; goto out;
} }
/* Read the IV name */ /* Read the IV name */
info->ivname = fdt_getprop(fit, noffset, "iv-name-hint", NULL); info->ivname = fdt_getprop(fit, noffset, "iv-name-hint", NULL);
if (!info->ivname) { if (!info->ivname) {
printf("Can't get iv name for cipher '%s' in image '%s'\n", printf("Can't get iv name for cipher in image '%s'\n",
node_name, image_name); image_name);
goto out; goto out;
} }
...@@ -399,23 +399,24 @@ int fit_image_write_cipher(void *fit, int image_noffset, int noffset, ...@@ -399,23 +399,24 @@ int fit_image_write_cipher(void *fit, int image_noffset, int noffset,
{ {
int ret = -1; int ret = -1;
/* Remove unciphered data */ /* Replace data with ciphered data */
ret = fdt_delprop(fit, image_noffset, FIT_DATA_PROP);
if (ret) {
printf("Can't remove data (err = %d)\n", ret);
goto out;
}
/* Add ciphered data */
ret = fdt_setprop(fit, image_noffset, FIT_DATA_PROP, ret = fdt_setprop(fit, image_noffset, FIT_DATA_PROP,
data_ciphered, data_ciphered_len); data_ciphered, data_ciphered_len);
if (ret == -FDT_ERR_NOSPACE) {
ret = -ENOSPC;
goto out;
}
if (ret) { if (ret) {
printf("Can't add ciphered data (err = %d)\n", ret); printf("Can't replace data with ciphered data (err = %d)\n", ret);
goto out; goto out;
} }
/* add non ciphered data size */ /* add non ciphered data size */
ret = fdt_setprop_u32(fit, image_noffset, "data-size-unciphered", size); ret = fdt_setprop_u32(fit, image_noffset, "data-size-unciphered", size);
if (ret == -FDT_ERR_NOSPACE) {
ret = -ENOSPC;
goto out;
}
if (ret) { if (ret) {
printf("Can't add unciphered data size (err = %d)\n", ret); printf("Can't add unciphered data size (err = %d)\n", ret);
goto out; goto out;
...@@ -428,8 +429,7 @@ int fit_image_write_cipher(void *fit, int image_noffset, int noffset, ...@@ -428,8 +429,7 @@ int fit_image_write_cipher(void *fit, int image_noffset, int noffset,
static int static int
fit_image_process_cipher(const char *keydir, void *keydest, void *fit, fit_image_process_cipher(const char *keydir, void *keydest, void *fit,
const char *image_name, int image_noffset, const char *image_name, int image_noffset,
const char *node_name, int node_noffset, int node_noffset, const void *data, size_t size,
const void *data, size_t size,
const char *cmdname) const char *cmdname)
{ {
struct image_cipher_info info; struct image_cipher_info info;
...@@ -440,7 +440,7 @@ fit_image_process_cipher(const char *keydir, void *keydest, void *fit, ...@@ -440,7 +440,7 @@ fit_image_process_cipher(const char *keydir, void *keydest, void *fit,
memset(&info, 0, sizeof(info)); memset(&info, 0, sizeof(info));
ret = fit_image_setup_cipher(&info, keydir, fit, image_name, ret = fit_image_setup_cipher(&info, keydir, fit, image_name,
image_noffset, node_name, node_noffset); image_noffset, node_noffset);
if (ret) if (ret)
goto out; goto out;
...@@ -482,7 +482,7 @@ int fit_image_cipher_data(const char *keydir, void *keydest, ...@@ -482,7 +482,7 @@ int fit_image_cipher_data(const char *keydir, void *keydest,
const char *image_name; const char *image_name;
const void *data; const void *data;
size_t size; size_t size;
int node_noffset; int cipher_node_offset, len;
/* Get image name */ /* Get image name */
image_name = fit_get_name(fit, image_noffset, NULL); image_name = fit_get_name(fit, image_noffset, NULL);
...@@ -497,32 +497,33 @@ int fit_image_cipher_data(const char *keydir, void *keydest, ...@@ -497,32 +497,33 @@ int fit_image_cipher_data(const char *keydir, void *keydest,
return -1; return -1;
} }
/* Process all hash subnodes of the component image node */ /*
for (node_noffset = fdt_first_subnode(fit, image_noffset); * Don't cipher ciphered data.
node_noffset >= 0; *
node_noffset = fdt_next_subnode(fit, node_noffset)) { * If the data-size-unciphered property is present the data for this
const char *node_name; * image is already encrypted. This is important as 'mkimage -F' can be
int ret = 0; * run multiple times on a FIT image.
*/
node_name = fit_get_name(fit, node_noffset, NULL); if (fdt_getprop(fit, image_noffset, "data-size-unciphered", &len))
if (!node_name) { return 0;
printf("Can't get node name\n"); if (len != -FDT_ERR_NOTFOUND) {
return -1; printf("Failure testing for data-size-unciphered\n");
} return -1;
if (IMAGE_ENABLE_ENCRYPT && keydir &&
!strncmp(node_name, FIT_CIPHER_NODENAME,
strlen(FIT_CIPHER_NODENAME)))
ret = fit_image_process_cipher(keydir, keydest,
fit, image_name,
image_noffset,
node_name, node_noffset,
data, size, cmdname);
if (ret)
return ret;
} }
return 0; /* Process cipher node if present */
cipher_node_offset = fdt_subnode_offset(fit, image_noffset,
FIT_CIPHER_NODENAME);
if (cipher_node_offset == -FDT_ERR_NOTFOUND)
return 0;
if (cipher_node_offset < 0) {
printf("Failure getting cipher node\n");
return -1;
}
if (!IMAGE_ENABLE_ENCRYPT || !keydir)
return 0;
return fit_image_process_cipher(keydir, keydest, fit, image_name,
image_noffset, cipher_node_offset, data, size, cmdname);
} }
/** /**
...@@ -743,6 +744,23 @@ static int fit_config_get_hash_list(void *fit, int conf_noffset, ...@@ -743,6 +744,23 @@ static int fit_config_get_hash_list(void *fit, int conf_noffset,
return -ENOMSG; return -ENOMSG;
} }
/* Add this image's cipher node if present */
noffset = fdt_subnode_offset(fit, image_noffset,
FIT_CIPHER_NODENAME);
if (noffset != -FDT_ERR_NOTFOUND) {
if (noffset < 0) {
printf("Failed to get cipher node in configuration '%s/%s' image '%s': %s\n",
conf_name, sig_name, iname,
fdt_strerror(noffset));
return -EIO;
}
ret = fdt_get_path(fit, noffset, path, sizeof(path));
if (ret < 0)
goto err_path;
if (strlist_add(node_inc, path))
goto err_mem;
}
image_count++; image_count++;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册