in image/parse.go [169:248]
func ParseImage(imgData []byte) (Image, error) {
img := Image{}
offset := 0
hdr, size, err := parseRawHeader(imgData, offset)
if err != nil {
return img, err
}
offset += size
body, size, err := parseRawBody(imgData, hdr, offset)
if err != nil {
return img, err
}
offset += size
var protTrailer *ImageTrailer
var protTlvs []ImageTlv
if hdr.ProtSz > 0 {
pt, size, err := parseRawTrailer(imgData, offset)
if err != nil {
return img, err
}
protTrailer = &pt
offset += size
tlvsLen := int(hdr.ProtSz) - IMAGE_TRAILER_SIZE
pts, err := parseRawTlvs(imgData, offset, tlvsLen)
if err != nil {
return img, err
}
protTlvs = pts
offset += tlvsLen
}
trailer, size, err := parseRawTrailer(imgData, offset)
if err != nil {
return img, err
}
offset += size
totalLen := int(hdr.HdrSz) + len(body) + int(trailer.TlvTotLen)
if protTrailer != nil {
totalLen += int(protTrailer.TlvTotLen)
}
if len(imgData) < totalLen {
return img, errors.Errorf("image data truncated: have=%d want=%d",
len(imgData), totalLen)
}
// Trim excess data following image trailer.
imgData = imgData[:totalLen]
remLen := len(imgData) - offset
tlvs, err := parseRawTlvs(imgData, offset, remLen)
if err != nil {
return img, err
}
tlvLen := IMAGE_TRAILER_SIZE
if int(trailer.TlvTotLen) != IMAGE_TRAILER_SIZE+remLen {
return img, errors.Errorf(
"invalid image: trailer indicates TLV-length=%d; actual=%d",
trailer.TlvTotLen, tlvLen)
}
img.Header = hdr
img.Body = body
img.Tlvs = tlvs
img.ProtTlvs = protTlvs
extra := img.Header.HdrSz - IMAGE_HEADER_SIZE
if extra > 0 {
img.Pad = make([]byte, extra)
}
return img, nil
}