in image/create.go [342:416]
func GenerateImage(opts ImageCreateOpts) (Image, error) {
ic := NewImageCreator()
srcBin, err := ioutil.ReadFile(opts.SrcBinFilename)
if err != nil {
return Image{}, errors.Wrapf(err, "Can't read app binary")
}
ic.Body = srcBin
ic.Version = opts.Version
ic.SigKeys = opts.SigKeys
ic.HWKeyIndex = opts.SrcEncKeyIndex
ic.Sections = opts.Sections
ic.UseLegacyTLV = opts.UseLegacyTLV
if opts.LoaderHash != nil {
ic.InitialHash = opts.LoaderHash
ic.Bootable = false
} else {
ic.Bootable = true
}
if opts.HdrPad > 0 {
ic.HeaderSize = opts.HdrPad
}
if opts.ImagePad > 0 {
tail_pad := opts.ImagePad - (len(ic.Body) % opts.ImagePad)
ic.Body = append(ic.Body, bytes.Repeat([]byte{byte(0xff)}, tail_pad)...)
}
if ic.HWKeyIndex >= 0 {
hash := sha256.Sum256(ic.Body)
ic.Nonce = hash[:8]
}
if opts.SrcEncKeyFilename != "" {
plainSecret, err := GeneratePlainSecret()
if err != nil {
return Image{}, err
}
pubKeBytes, err := ioutil.ReadFile(opts.SrcEncKeyFilename)
if err != nil {
return Image{}, errors.Wrapf(err, "error reading pubkey file")
}
if ic.HWKeyIndex < 0 {
pubKe, err := sec.ParsePubEncKey(pubKeBytes)
if err != nil {
return Image{}, err
}
cipherSecret, err := pubKe.Encrypt(plainSecret)
if err != nil {
return Image{}, err
}
ic.CipherSecret = cipherSecret
ic.PlainSecret = plainSecret
} else {
ic.PlainSecret, err = base64.StdEncoding.DecodeString(string(pubKeBytes))
if err != nil {
return Image{}, err
}
}
}
ri, err := ic.Create()
if err != nil {
return Image{}, err
}
return ri, nil
}