in image/create.go [419:474]
func calcHash(initialHash []byte, hdr ImageHdr, pad []byte,
plainBody []byte, protTlvs []ImageTlv) ([]byte, error) {
hash := sha256.New()
add := func(itf interface{}) error {
b := &bytes.Buffer{}
if err := binary.Write(b, binary.LittleEndian, itf); err != nil {
return err
}
if err := binary.Write(hash, binary.LittleEndian, itf); err != nil {
return errors.Wrapf(err, "failed to hash data")
}
return nil
}
if initialHash != nil {
if err := add(initialHash); err != nil {
return nil, err
}
}
if err := add(hdr); err != nil {
return nil, err
}
if err := add(pad); err != nil {
return nil, err
}
if err := add(plainBody); err != nil {
return nil, err
}
if len(protTlvs) > 0 {
trailer := ImageTrailer{
Magic: IMAGE_PROT_TRAILER_MAGIC,
TlvTotLen: hdr.ProtSz,
}
if err := add(trailer); err != nil {
return nil, err
}
for _, tlv := range protTlvs {
if err := add(tlv.Header); err != nil {
return nil, err
}
if err := add(tlv.Data); err != nil {
return nil, err
}
}
}
return hash.Sum(nil), nil
}