func runHashableCmd()

in cli/image_cmds.go [298:363]


func runHashableCmd(cmd *cobra.Command, args []string) {
	if len(args) < 1 {
		ImgmodUsage(cmd, nil)
	}

	if OptOutFilename == "" {
		ImgmodUsage(cmd, errors.Errorf("--outfile (-o) option required"))
	}

	inFilename := args[0]
	outFilename := OptOutFilename

	img, err := readImage(inFilename)
	if err != nil {
		ImgmodUsage(cmd, err)
	}

	if (img.Header.Flags & image.IMAGE_F_ENCRYPTED) != 0 {
		iutil.Printf("warning: extracting hashable content from an encrypted image\n")
	}

	f, err := os.Create(outFilename)
	if err != nil {
		ImgmodUsage(nil, errors.Wrapf(err, "failed to create hashable output"))
	}
	defer f.Close()

	err = binary.Write(f, binary.LittleEndian, &img.Header)
	if err != nil {
		ImgmodUsage(nil, errors.Wrapf(err, "error writing image header"))
	}

	_, err = f.Write(img.Pad)
	if err != nil {
		ImgmodUsage(nil, errors.Wrapf(err, "error writing image padding"))
	}

	_, err = f.Write(img.Body)
	if err != nil {
		ImgmodUsage(nil, errors.Wrapf(err, "error writing image body"))
	}

	if len(img.ProtTlvs) > 0 {
		trailer := image.ImageTrailer{
			Magic:     image.IMAGE_PROT_TRAILER_MAGIC,
			TlvTotLen: img.Header.ProtSz,
		}
		err = binary.Write(f, binary.LittleEndian, trailer)
		if err != nil {
			ImgmodUsage(nil, errors.Wrapf(err, "error writing image protected TLV trailer"))
		}

		for _, t := range img.ProtTlvs {
			err = binary.Write(f, binary.LittleEndian, t.Header)
			if err != nil {
				ImgmodUsage(nil, errors.Wrapf(err, "error writing image protected TLVs"))
			}
			_, err = f.Write(t.Data)
			if err != nil {
				ImgmodUsage(nil, errors.Wrapf(err, "error writing image protected TLVs"))
			}
		}
	}

	iutil.Printf("Wrote hashable content to %s\n", outFilename)
}