mkimage: fit: Support signed configurations in 'auto' FITs
[platform/kernel/u-boot.git] / tools / fit_image.c
index 8a18b1b..8763a36 100644 (file)
@@ -201,36 +201,59 @@ static void get_basename(char *str, int size, const char *fname)
 }
 
 /**
- * add_hash_node() - Add a hash or signature node
+ * fit_add_hash_or_sign() - Add a hash or signature node
  *
  * @params: Image parameters
  * @fdt: Device tree to add to (in sequential-write mode)
+ * @is_images_subnode: true to add hash even if key name hint is provided
  *
- * If there is a key name hint, try to sign the images. Otherwise, just add a
- * CRC.
- *
- * Return: 0 on success, or -1 on failure
+ * If do_add_hash is false (default) and there is a key name hint, try to add
+ * a sign node to parent. Otherwise, just add a CRC. Rationale: if conf have
+ * to be signed, image/dt have to be hashed even if there is a key name hint.
  */
-static int add_hash_node(struct image_tool_params *params, void *fdt)
+static void fit_add_hash_or_sign(struct image_tool_params *params, void *fdt,
+                                bool is_images_subnode)
 {
-       if (params->keyname) {
-               if (!params->algo_name) {
-                       fprintf(stderr,
-                               "%s: Algorithm name must be specified\n",
-                               params->cmdname);
-                       return -1;
+       const char *hash_algo = "crc32";
+       bool do_hash = false;
+       bool do_sign = false;
+
+       switch (params->auto_fit) {
+       case AF_OFF:
+               break;
+       case AF_HASHED_IMG:
+               do_hash = is_images_subnode;
+               break;
+       case AF_SIGNED_IMG:
+               do_sign = is_images_subnode;
+               break;
+       case AF_SIGNED_CONF:
+               if (is_images_subnode) {
+                       do_hash = true;
+                       hash_algo = "sha1";
+               } else {
+                       do_sign = true;
                }
+               break;
+       default:
+               fprintf(stderr,
+                       "%s: Unsupported auto FIT mode %u\n",
+                       params->cmdname, params->auto_fit);
+               break;
+       }
+
+       if (do_hash) {
+               fdt_begin_node(fdt, FIT_HASH_NODENAME);
+               fdt_property_string(fdt, FIT_ALGO_PROP, hash_algo);
+               fdt_end_node(fdt);
+       }
 
-               fdt_begin_node(fdt, "signature-1");
+       if (do_sign) {
+               fdt_begin_node(fdt, FIT_SIG_NODENAME);
                fdt_property_string(fdt, FIT_ALGO_PROP, params->algo_name);
                fdt_property_string(fdt, FIT_KEY_HINT, params->keyname);
-       } else {
-               fdt_begin_node(fdt, "hash-1");
-               fdt_property_string(fdt, FIT_ALGO_PROP, "crc32");
+               fdt_end_node(fdt);
        }
-
-       fdt_end_node(fdt);
-       return 0;
 }
 
 /**
@@ -271,9 +294,7 @@ static int fit_write_images(struct image_tool_params *params, char *fdt)
        ret = fdt_property_file(params, fdt, FIT_DATA_PROP, params->datafile);
        if (ret)
                return ret;
-       ret = add_hash_node(params, fdt);
-       if (ret)
-               return ret;
+       fit_add_hash_or_sign(params, fdt, true);
        fdt_end_node(fdt);
 
        /* Now the device tree files if available */
@@ -296,7 +317,7 @@ static int fit_write_images(struct image_tool_params *params, char *fdt)
                                    genimg_get_arch_short_name(params->arch));
                fdt_property_string(fdt, FIT_COMP_PROP,
                                    genimg_get_comp_short_name(IH_COMP_NONE));
-               ret = add_hash_node(params, fdt);
+               fit_add_hash_or_sign(params, fdt, true);
                if (ret)
                        return ret;
                fdt_end_node(fdt);
@@ -316,7 +337,7 @@ static int fit_write_images(struct image_tool_params *params, char *fdt)
                                        params->fit_ramdisk);
                if (ret)
                        return ret;
-               ret = add_hash_node(params, fdt);
+               fit_add_hash_or_sign(params, fdt, true);
                if (ret)
                        return ret;
                fdt_end_node(fdt);
@@ -368,6 +389,7 @@ static void fit_write_configs(struct image_tool_params *params, char *fdt)
 
                snprintf(str, sizeof(str), FIT_FDT_PROP "-%d", upto);
                fdt_property_string(fdt, FIT_FDT_PROP, str);
+               fit_add_hash_or_sign(params, fdt, false);
                fdt_end_node(fdt);
        }
 
@@ -380,6 +402,7 @@ static void fit_write_configs(struct image_tool_params *params, char *fdt)
                if (params->fit_ramdisk)
                        fdt_property_string(fdt, FIT_RAMDISK_PROP,
                                            FIT_RAMDISK_PROP "-1");
+               fit_add_hash_or_sign(params, fdt, false);
 
                fdt_end_node(fdt);
        }
@@ -723,7 +746,7 @@ static int fit_handle_file(struct image_tool_params *params)
        sprintf (tmpfile, "%s%s", params->imagefile, MKIMAGE_TMPFILE_SUFFIX);
 
        /* We either compile the source file, or use the existing FIT image */
-       if (params->auto_its) {
+       if (params->auto_fit) {
                if (fit_build(params, tmpfile)) {
                        fprintf(stderr, "%s: failed to build FIT\n",
                                params->cmdname);
@@ -907,7 +930,7 @@ static int fit_extract_contents(void *ptr, struct image_tool_params *params)
 
 static int fit_check_params(struct image_tool_params *params)
 {
-       if (params->auto_its)
+       if (params->auto_fit)
                return 0;
        return  ((params->dflag && params->fflag) ||
                 (params->fflag && params->lflag) ||