func runAddsigCmd()

in cli/image_cmds.go [365:427]


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

	imgFilename := args[0]
	keyFilename := args[1]
	sigFilename := args[2]

	sigType, err := strconv.ParseUint(args[3], 0, 8)
	if err != nil || !image.ImageTlvTypeIsSig(uint8(sigType)) {

		ImgmodUsage(cmd, errors.Errorf("invalid signature type: %s", args[3]))
	}

	outFilename, err := CalcOutFilename(imgFilename)
	if err != nil {
		ImgmodUsage(cmd, err)
	}

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

	keyData, err := ioutil.ReadFile(keyFilename)
	if err != nil {
		ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file"))
	}

	sigData, err := ioutil.ReadFile(sigFilename)
	if err != nil {
		ImgmodUsage(cmd, errors.Wrapf(err, "error reading signature file"))
	}

	// ECDSA256 signatures need to be padded out to >=72 bytes.
	if sigType == image.IMAGE_TLV_ECDSA256 {
		sigData, err = iimg.PadEcdsa256Sig(sigData)
		if err != nil {
			ImgmodUsage(nil, err)
		}
	}

	// Build and append key hash TLV.
	keyHashTlv := image.BuildKeyHashTlv(keyData)
	iutil.Printf("Adding TLV%d (%s)\n", len(img.Tlvs), tlvStr(keyHashTlv))
	img.Tlvs = append(img.Tlvs, keyHashTlv)

	// Build and append signature TLV.
	sigTlv := image.ImageTlv{
		Header: image.ImageTlvHdr{
			Type: uint8(sigType),
			Len:  uint16(len(sigData)),
		},
		Data: sigData,
	}
	iutil.Printf("Adding TLV%d (%s)\n", len(img.Tlvs), tlvStr(sigTlv))
	img.Tlvs = append(img.Tlvs, sigTlv)

	if err := writeImage(img, outFilename); err != nil {
		ImgmodUsage(nil, err)
	}
}