func ParseImage()

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
}