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)
}
}