U-Boot Image wrapper: Go parsing library

The legacy U-Boot image format (uImage), as created by mkimage: a 64-byte header followed by the image data (e.g. a Linux kernel, a ramdisk or a script). The header describes the data (OS, CPU architecture, image type, compression, load and entry point addresses, name) and protects both the header and the data with CRC-32 checksums.

U-Boot's newer FIT (Flattened Image Tree) format is not covered by this spec.

Application

U-Boot

File extension

["bin", "img", "scr", "trx", "bix", "uimg"]

KS implementation details

License: CC0-1.0
Minimal Kaitai Struct required: 0.11

References

This page hosts a formal specification of U-Boot Image wrapper using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

Go source code to parse U-Boot Image wrapper

uimage.go

// Code generated by kaitai-struct-compiler from a .ksy source file. DO NOT EDIT.

import (
	"github.com/kaitai-io/kaitai_struct_go_runtime/kaitai"
	"io"
	"bytes"
)


/**
 * The legacy U-Boot image format (uImage), as created by `mkimage`: a 64-byte
 * header followed by the image data (e.g. a Linux kernel, a ramdisk or a
 * script). The header describes the data (OS, CPU architecture, image type,
 * compression, load and entry point addresses, name) and protects both the
 * header and the data with CRC-32 checksums.
 * 
 * U-Boot's newer FIT (Flattened Image Tree) format is not covered by this spec.
 * @see <a href="https://github.com/u-boot/u-boot/blob/ece349ade2973e220f524ce59e59711cc919263f/include/image.h">Git tag "v2026.07"</a>
 */

type Uimage_MagicTypes int
const (
	Uimage_MagicTypes__AllnetAllSg8316m Uimage_MagicTypes = 5
	Uimage_MagicTypes__AllnetAllSg8208m Uimage_MagicTypes = 6
	Uimage_MagicTypes__AllnetAllSg8324m Uimage_MagicTypes = 22
	Uimage_MagicTypes__DattoL8 Uimage_MagicTypes = 7353344
	Uimage_MagicTypes__AllnetAllWapc0450c Uimage_MagicTypes = 9453568
	Uimage_MagicTypes__EngeniusEws2910pV3 Uimage_MagicTypes = 50398464
	Uimage_MagicTypes__EngeniusEws120028tfp Uimage_MagicTypes = 50402048
	Uimage_MagicTypes__EngeniusEws7926efp Uimage_MagicTypes = 50402050
	Uimage_MagicTypes__EngeniusEws7952p Uimage_MagicTypes = 50406401
	Uimage_MagicTypes__EngeniusEws2908p Uimage_MagicTypes = 50409728
	Uimage_MagicTypes__EngeniusEws7928pV2 Uimage_MagicTypes = 51450112
	Uimage_MagicTypes__EngeniusEws120028tfpV2 Uimage_MagicTypes = 51450624
	Uimage_MagicTypes__EngeniusEws2910p Uimage_MagicTypes = 58730768
	Uimage_MagicTypes__EngeniusEws5912fp Uimage_MagicTypes = 58743058
	Uimage_MagicTypes__EngeniusEws7928p Uimage_MagicTypes = 58751272
	Uimage_MagicTypes__EngeniusEws1200d10t Uimage_MagicTypes = 59187216
	Uimage_MagicTypes__EngeniusEws120028t Uimage_MagicTypes = 59187240
	Uimage_MagicTypes__EngeniusEws7928fp Uimage_MagicTypes = 59216527
	Uimage_MagicTypes__EngeniusEws120052t Uimage_MagicTypes = 60235858
	Uimage_MagicTypes__EngeniusEws7952fp Uimage_MagicTypes = 60265775
	Uimage_MagicTypes__YoukuYkL1 Uimage_MagicTypes = 304680960
	Uimage_MagicTypes__RealtekSdk Uimage_MagicTypes = 305418240
	Uimage_MagicTypes__NetgearGs750e Uimage_MagicTypes = 391006017
	Uimage_MagicTypes__NetgearGs728tpV2 Uimage_MagicTypes = 391006018
	Uimage_MagicTypes__BoltBl100 Uimage_MagicTypes = 638656533
	Uimage_MagicTypes__Uimage Uimage_MagicTypes = 654645590
	Uimage_MagicTypes__NetgearWnce4004 Uimage_MagicTypes = 654645607
	Uimage_MagicTypes__NetgearWnr612V2Early Uimage_MagicTypes = 808857906
	Uimage_MagicTypes__NetgearWnr1000V2Vc Uimage_MagicTypes = 825241648
	Uimage_MagicTypes__NetgearWnr1000V2 Uimage_MagicTypes = 825241649
	Uimage_MagicTypes__NetgearWnr1000V2Vm Uimage_MagicTypes = 825241650
	Uimage_MagicTypes__NetgearWnr1000V4 Uimage_MagicTypes = 825241652
	Uimage_MagicTypes__NetgearWpn824n Uimage_MagicTypes = 825307184
	Uimage_MagicTypes__ZyxelUag50 Uimage_MagicTypes = 827343191
	Uimage_MagicTypes__NetgearWnr2000 Uimage_MagicTypes = 842018865
	Uimage_MagicTypes__NetgearWnr2000V3 Uimage_MagicTypes = 842018867
	Uimage_MagicTypes__NetgearWnr2000V4 Uimage_MagicTypes = 842018868
	Uimage_MagicTypes__NetgearWnr612V2 Uimage_MagicTypes = 842020401
	Uimage_MagicTypes__NetgearWnr2200 Uimage_MagicTypes = 842149936
	Uimage_MagicTypes__NetgearWndr3700 Uimage_MagicTypes = 859254832
	Uimage_MagicTypes__NetgearWndr3700V2 Uimage_MagicTypes = 859254833
	Uimage_MagicTypes__NetgearWndr3700V4 Uimage_MagicTypes = 859254835
	Uimage_MagicTypes__NetgearR6100 Uimage_MagicTypes = 909127728
	Uimage_MagicTypes__NetgearWnr612 Uimage_MagicTypes = 909193778
	Uimage_MagicTypes__MitrastarComb Uimage_MagicTypes = 1129270594
	Uimage_MagicTypes__MitrastarComc Uimage_MagicTypes = 1129270595
	Uimage_MagicTypes__NetgearGs308t Uimage_MagicTypes = 1313293109
	Uimage_MagicTypes__NetgearNge Uimage_MagicTypes = 1313293600
	Uimage_MagicTypes__NetgearNgf Uimage_MagicTypes = 1313293856
	Uimage_MagicTypes__NetgearNgg Uimage_MagicTypes = 1313294112
	Uimage_MagicTypes__NetgearNgh Uimage_MagicTypes = 1313294368
	Uimage_MagicTypes__NetgearNgi Uimage_MagicTypes = 1313294624
	Uimage_MagicTypes__NetgearNgp Uimage_MagicTypes = 1313296416
	Uimage_MagicTypes__OpenwrtOkli Uimage_MagicTypes = 1330334793
	Uimage_MagicTypes__OpenwrtDlinkCovr Uimage_MagicTypes = 1752396147
	Uimage_MagicTypes__OpenwrtSenaoOkli Uimage_MagicTypes = 1936805707
	Uimage_MagicTypes__EngeniusEcs1112fp Uimage_MagicTypes = 2155872258
	Uimage_MagicTypes__EngeniusFitswitch Uimage_MagicTypes = 2155872259
	Uimage_MagicTypes__EngeniusEws120028tfpOldFw Uimage_MagicTypes = 2197885696
	Uimage_MagicTypes__EngeniusEws7926efpOldFw Uimage_MagicTypes = 2197885698
	Uimage_MagicTypes__EngeniusEws7952pOldFw Uimage_MagicTypes = 2197890049
	Uimage_MagicTypes__RealtekRtl838x Uimage_MagicTypes = 2206203904
	Uimage_MagicTypes__IodataBshG08m Uimage_MagicTypes = 2206203905
	Uimage_MagicTypes__IodataBshGp08 Uimage_MagicTypes = 2206203906
	Uimage_MagicTypes__IodataBshG16m Uimage_MagicTypes = 2206203907
	Uimage_MagicTypes__IodataBshG24m Uimage_MagicTypes = 2206203908
	Uimage_MagicTypes__IodataBshG08mb Uimage_MagicTypes = 2206203920
	Uimage_MagicTypes__IodataBshGp08mb Uimage_MagicTypes = 2206203921
	Uimage_MagicTypes__IodataBshG16mb Uimage_MagicTypes = 2206203922
	Uimage_MagicTypes__IodataBshG24mb Uimage_MagicTypes = 2206203923
	Uimage_MagicTypes__TrendnetTpe3012ls Uimage_MagicTypes = 2206210573
	Uimage_MagicTypes__TrendnetTpe3018ls Uimage_MagicTypes = 2206210574
	Uimage_MagicTypes__EngeniusEgs2108pOldFw Uimage_MagicTypes = 2206212360
	Uimage_MagicTypes__EngeniusEgs2110pOldFw Uimage_MagicTypes = 2206212368
	Uimage_MagicTypes__EngeniusEws2910pOldFw Uimage_MagicTypes = 2206214416
	Uimage_MagicTypes__EngeniusEgs5110pOldFw Uimage_MagicTypes = 2206224656
	Uimage_MagicTypes__EngeniusEgs5212fpOldFw Uimage_MagicTypes = 2206224914
	Uimage_MagicTypes__EngeniusEws5912fpOldFw Uimage_MagicTypes = 2206226706
	Uimage_MagicTypes__EngeniusEws7928pOldFw Uimage_MagicTypes = 2206234920
	Uimage_MagicTypes__EngeniusEws1200d10tOldFw Uimage_MagicTypes = 2206670864
	Uimage_MagicTypes__EngeniusEws120028tOldFw Uimage_MagicTypes = 2206670888
	Uimage_MagicTypes__EngeniusEgs7228fpOldFw Uimage_MagicTypes = 2206671503
	Uimage_MagicTypes__EngeniusEws7928fpOldFw Uimage_MagicTypes = 2206700175
	Uimage_MagicTypes__RealtekRtl839x Uimage_MagicTypes = 2207252480
	Uimage_MagicTypes__RealtekRtl8396 Uimage_MagicTypes = 2207645696
	Uimage_MagicTypes__EngeniusEws120052tOldFw Uimage_MagicTypes = 2207719506
	Uimage_MagicTypes__EngeniusEgs7252fpOldFw Uimage_MagicTypes = 2207720751
	Uimage_MagicTypes__EngeniusEws7952fpOldFw Uimage_MagicTypes = 2207749423
	Uimage_MagicTypes__RealtekRtl930x Uimage_MagicTypes = 2466250752
	Uimage_MagicTypes__ZyxelXgs101012 Uimage_MagicTypes = 2466254864
	Uimage_MagicTypes__ZyxelXgs121012 Uimage_MagicTypes = 2466255376
	Uimage_MagicTypes__ZyxelXgs125012 Uimage_MagicTypes = 2466255440
	Uimage_MagicTypes__NicgigaS1000800sM Uimage_MagicTypes = 2466447360
	Uimage_MagicTypes__PlasmacloudPsx28 Uimage_MagicTypes = 2467299328
)
var values_Uimage_MagicTypes = map[Uimage_MagicTypes]struct{}{5: {}, 6: {}, 22: {}, 7353344: {}, 9453568: {}, 50398464: {}, 50402048: {}, 50402050: {}, 50406401: {}, 50409728: {}, 51450112: {}, 51450624: {}, 58730768: {}, 58743058: {}, 58751272: {}, 59187216: {}, 59187240: {}, 59216527: {}, 60235858: {}, 60265775: {}, 304680960: {}, 305418240: {}, 391006017: {}, 391006018: {}, 638656533: {}, 654645590: {}, 654645607: {}, 808857906: {}, 825241648: {}, 825241649: {}, 825241650: {}, 825241652: {}, 825307184: {}, 827343191: {}, 842018865: {}, 842018867: {}, 842018868: {}, 842020401: {}, 842149936: {}, 859254832: {}, 859254833: {}, 859254835: {}, 909127728: {}, 909193778: {}, 1129270594: {}, 1129270595: {}, 1313293109: {}, 1313293600: {}, 1313293856: {}, 1313294112: {}, 1313294368: {}, 1313294624: {}, 1313296416: {}, 1330334793: {}, 1752396147: {}, 1936805707: {}, 2155872258: {}, 2155872259: {}, 2197885696: {}, 2197885698: {}, 2197890049: {}, 2206203904: {}, 2206203905: {}, 2206203906: {}, 2206203907: {}, 2206203908: {}, 2206203920: {}, 2206203921: {}, 2206203922: {}, 2206203923: {}, 2206210573: {}, 2206210574: {}, 2206212360: {}, 2206212368: {}, 2206214416: {}, 2206224656: {}, 2206224914: {}, 2206226706: {}, 2206234920: {}, 2206670864: {}, 2206670888: {}, 2206671503: {}, 2206700175: {}, 2207252480: {}, 2207645696: {}, 2207719506: {}, 2207720751: {}, 2207749423: {}, 2466250752: {}, 2466254864: {}, 2466255376: {}, 2466255440: {}, 2466447360: {}, 2467299328: {}}
func (v Uimage_MagicTypes) isDefined() bool {
	_, ok := values_Uimage_MagicTypes[v]
	return ok
}

type Uimage_UimageArch int
const (
	Uimage_UimageArch__Invalid Uimage_UimageArch = 0
	Uimage_UimageArch__Alpha Uimage_UimageArch = 1
	Uimage_UimageArch__Arm Uimage_UimageArch = 2
	Uimage_UimageArch__I386 Uimage_UimageArch = 3
	Uimage_UimageArch__Ia64 Uimage_UimageArch = 4
	Uimage_UimageArch__Mips Uimage_UimageArch = 5
	Uimage_UimageArch__Mips64 Uimage_UimageArch = 6
	Uimage_UimageArch__Ppc Uimage_UimageArch = 7
	Uimage_UimageArch__S390 Uimage_UimageArch = 8
	Uimage_UimageArch__Sh Uimage_UimageArch = 9
	Uimage_UimageArch__Sparc Uimage_UimageArch = 10
	Uimage_UimageArch__Sparc64 Uimage_UimageArch = 11
	Uimage_UimageArch__M68k Uimage_UimageArch = 12
	Uimage_UimageArch__Nios Uimage_UimageArch = 13
	Uimage_UimageArch__Microblaze Uimage_UimageArch = 14
	Uimage_UimageArch__Nios2 Uimage_UimageArch = 15
	Uimage_UimageArch__Blackfin Uimage_UimageArch = 16
	Uimage_UimageArch__Avr32 Uimage_UimageArch = 17
	Uimage_UimageArch__St200 Uimage_UimageArch = 18
	Uimage_UimageArch__Sandbox Uimage_UimageArch = 19
	Uimage_UimageArch__Nds32 Uimage_UimageArch = 20
	Uimage_UimageArch__Openrisc Uimage_UimageArch = 21
	Uimage_UimageArch__Arm64 Uimage_UimageArch = 22
	Uimage_UimageArch__Arc Uimage_UimageArch = 23
	Uimage_UimageArch__X8664 Uimage_UimageArch = 24
	Uimage_UimageArch__Xtensa Uimage_UimageArch = 25
	Uimage_UimageArch__Riscv Uimage_UimageArch = 26
)
var values_Uimage_UimageArch = map[Uimage_UimageArch]struct{}{0: {}, 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {}, 8: {}, 9: {}, 10: {}, 11: {}, 12: {}, 13: {}, 14: {}, 15: {}, 16: {}, 17: {}, 18: {}, 19: {}, 20: {}, 21: {}, 22: {}, 23: {}, 24: {}, 25: {}, 26: {}}
func (v Uimage_UimageArch) isDefined() bool {
	_, ok := values_Uimage_UimageArch[v]
	return ok
}

type Uimage_UimageComp int
const (
	Uimage_UimageComp__None Uimage_UimageComp = 0
	Uimage_UimageComp__Gzip Uimage_UimageComp = 1
	Uimage_UimageComp__Bzip2 Uimage_UimageComp = 2
	Uimage_UimageComp__Lzma Uimage_UimageComp = 3
	Uimage_UimageComp__Lzo Uimage_UimageComp = 4
	Uimage_UimageComp__Lz4 Uimage_UimageComp = 5
	Uimage_UimageComp__Zstd Uimage_UimageComp = 6
	Uimage_UimageComp__Mz Uimage_UimageComp = 9
	Uimage_UimageComp__Xip Uimage_UimageComp = 10
)
var values_Uimage_UimageComp = map[Uimage_UimageComp]struct{}{0: {}, 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 9: {}, 10: {}}
func (v Uimage_UimageComp) isDefined() bool {
	_, ok := values_Uimage_UimageComp[v]
	return ok
}

type Uimage_UimageOs int
const (
	Uimage_UimageOs__Invalid Uimage_UimageOs = 0
	Uimage_UimageOs__Openbsd Uimage_UimageOs = 1
	Uimage_UimageOs__Netbsd Uimage_UimageOs = 2
	Uimage_UimageOs__Freebsd Uimage_UimageOs = 3
	Uimage_UimageOs__Bsd44 Uimage_UimageOs = 4
	Uimage_UimageOs__Linux Uimage_UimageOs = 5
	Uimage_UimageOs__Svr4 Uimage_UimageOs = 6
	Uimage_UimageOs__Esix Uimage_UimageOs = 7
	Uimage_UimageOs__Solaris Uimage_UimageOs = 8
	Uimage_UimageOs__Irix Uimage_UimageOs = 9
	Uimage_UimageOs__Sco Uimage_UimageOs = 10
	Uimage_UimageOs__Dell Uimage_UimageOs = 11
	Uimage_UimageOs__Ncr Uimage_UimageOs = 12
	Uimage_UimageOs__Lynxos Uimage_UimageOs = 13
	Uimage_UimageOs__Vxworks Uimage_UimageOs = 14
	Uimage_UimageOs__Psos Uimage_UimageOs = 15
	Uimage_UimageOs__Qnx Uimage_UimageOs = 16
	Uimage_UimageOs__UBoot Uimage_UimageOs = 17
	Uimage_UimageOs__Rtems Uimage_UimageOs = 18
	Uimage_UimageOs__Artos Uimage_UimageOs = 19
	Uimage_UimageOs__Unity Uimage_UimageOs = 20
	Uimage_UimageOs__Integrity Uimage_UimageOs = 21
	Uimage_UimageOs__Ose Uimage_UimageOs = 22
	Uimage_UimageOs__Plan9 Uimage_UimageOs = 23
	Uimage_UimageOs__Openrtos Uimage_UimageOs = 24
	Uimage_UimageOs__ArmTrustedFirmware Uimage_UimageOs = 25
	Uimage_UimageOs__Tee Uimage_UimageOs = 26
	Uimage_UimageOs__Opensbi Uimage_UimageOs = 27
	Uimage_UimageOs__Efi Uimage_UimageOs = 28
	Uimage_UimageOs__Elf Uimage_UimageOs = 29
)
var values_Uimage_UimageOs = map[Uimage_UimageOs]struct{}{0: {}, 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {}, 8: {}, 9: {}, 10: {}, 11: {}, 12: {}, 13: {}, 14: {}, 15: {}, 16: {}, 17: {}, 18: {}, 19: {}, 20: {}, 21: {}, 22: {}, 23: {}, 24: {}, 25: {}, 26: {}, 27: {}, 28: {}, 29: {}}
func (v Uimage_UimageOs) isDefined() bool {
	_, ok := values_Uimage_UimageOs[v]
	return ok
}

type Uimage_UimageType int
const (
	Uimage_UimageType__Invalid Uimage_UimageType = 0
	Uimage_UimageType__Standalone Uimage_UimageType = 1
	Uimage_UimageType__Kernel Uimage_UimageType = 2
	Uimage_UimageType__Ramdisk Uimage_UimageType = 3
	Uimage_UimageType__Multi Uimage_UimageType = 4
	Uimage_UimageType__Firmware Uimage_UimageType = 5
	Uimage_UimageType__Script Uimage_UimageType = 6
	Uimage_UimageType__Filesystem Uimage_UimageType = 7
	Uimage_UimageType__Flatdt Uimage_UimageType = 8
	Uimage_UimageType__Kwbimage Uimage_UimageType = 9
	Uimage_UimageType__Imximage Uimage_UimageType = 10
	Uimage_UimageType__Ublimage Uimage_UimageType = 11
	Uimage_UimageType__Omapimage Uimage_UimageType = 12
	Uimage_UimageType__Aisimage Uimage_UimageType = 13
	Uimage_UimageType__KernelNoload Uimage_UimageType = 14
	Uimage_UimageType__Pblimage Uimage_UimageType = 15
	Uimage_UimageType__Mxsimage Uimage_UimageType = 16
	Uimage_UimageType__Gpimage Uimage_UimageType = 17
	Uimage_UimageType__Atmelimage Uimage_UimageType = 18
	Uimage_UimageType__Socfpgaimage Uimage_UimageType = 19
	Uimage_UimageType__X86Setup Uimage_UimageType = 20
	Uimage_UimageType__Lpc32xximage Uimage_UimageType = 21
	Uimage_UimageType__Loadable Uimage_UimageType = 22
	Uimage_UimageType__Rkimage Uimage_UimageType = 23
	Uimage_UimageType__Rksd Uimage_UimageType = 24
	Uimage_UimageType__Rkspi Uimage_UimageType = 25
	Uimage_UimageType__Zynqimage Uimage_UimageType = 26
	Uimage_UimageType__Zynqmpimage Uimage_UimageType = 27
	Uimage_UimageType__Zynqmpbif Uimage_UimageType = 28
	Uimage_UimageType__Fpga Uimage_UimageType = 29
	Uimage_UimageType__Vybridimage Uimage_UimageType = 30
	Uimage_UimageType__Tee Uimage_UimageType = 31
	Uimage_UimageType__FirmwareIvt Uimage_UimageType = 32
	Uimage_UimageType__Pmmc Uimage_UimageType = 33
	Uimage_UimageType__Stm32image Uimage_UimageType = 34
	Uimage_UimageType__SocfpgaimageV1 Uimage_UimageType = 35
	Uimage_UimageType__Mtkimage Uimage_UimageType = 36
	Uimage_UimageType__Imx8mimage Uimage_UimageType = 37
	Uimage_UimageType__Imx8image Uimage_UimageType = 38
	Uimage_UimageType__Copro Uimage_UimageType = 39
	Uimage_UimageType__SunxiEgon Uimage_UimageType = 40
	Uimage_UimageType__SunxiToc0 Uimage_UimageType = 41
	Uimage_UimageType__FdtLegacy Uimage_UimageType = 42
	Uimage_UimageType__RenesasSpkg Uimage_UimageType = 43
	Uimage_UimageType__StarfiveSpl Uimage_UimageType = 44
	Uimage_UimageType__TfaBl31 Uimage_UimageType = 45
	Uimage_UimageType__Stm32imageV2 Uimage_UimageType = 46
	Uimage_UimageType__Amlimage Uimage_UimageType = 47
)
var values_Uimage_UimageType = map[Uimage_UimageType]struct{}{0: {}, 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {}, 8: {}, 9: {}, 10: {}, 11: {}, 12: {}, 13: {}, 14: {}, 15: {}, 16: {}, 17: {}, 18: {}, 19: {}, 20: {}, 21: {}, 22: {}, 23: {}, 24: {}, 25: {}, 26: {}, 27: {}, 28: {}, 29: {}, 30: {}, 31: {}, 32: {}, 33: {}, 34: {}, 35: {}, 36: {}, 37: {}, 38: {}, 39: {}, 40: {}, 41: {}, 42: {}, 43: {}, 44: {}, 45: {}, 46: {}, 47: {}}
func (v Uimage_UimageType) isDefined() bool {
	_, ok := values_Uimage_UimageType[v]
	return ok
}
type Uimage struct {
	Header *Uimage_Uheader
	Data []byte
	_io *kaitai.Stream
	_root *Uimage
	_parent kaitai.Struct
}
func NewUimage() *Uimage {
	return &Uimage{
	}
}

func (this Uimage) IO_() *kaitai.Stream {
	return this._io
}

func (this *Uimage) Read(io *kaitai.Stream, parent kaitai.Struct, root *Uimage) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp1 := NewUimage_Uheader()
	err = tmp1.Read(this._io, this, this._root)
	if err != nil {
		return err
	}
	this.Header = tmp1
	tmp2, err := this._io.ReadBytes(int(this.Header.LenImage))
	if err != nil {
		return err
	}
	tmp2 = tmp2
	this.Data = tmp2
	return err
}

/**
 * ASUS firmware images [overlay the 32-byte image
 * name](https://github.com/drag0njoe/RT-AC55U/blob/cf5874684ab6995ee07e91a52dfdd0562fcc2655/release/src/asustools/mkimage.src/include/image.h#L185-L188)
 * with a [`TAIL`
 * structure](https://github.com/drag0njoe/RT-AC55U/blob/cf5874684ab6995ee07e91a52dfdd0562fcc2655/release/src/asustools/mkimage.src/include/image.h#L151-L171)
 * that contains version information and the product ID (model name).
 * 
 * The first 16 bytes have the same structure in all three known variants of
 * the `TAIL` structure. The meaning of the last 16 bytes differs across the
 * variants - therefore, for simplicity, this Kaitai Struct implementation
 * treats them as an opaque byte array named `extra_info`. For an overview of
 * the variants, see the documentation for `extra_info`.
 */
type Uimage_AsusFirmwareInformation struct {
	KernelVersion *Uimage_Version
	FsVersion *Uimage_Version
	ProductId string
	ExtraInfo []byte
	_io *kaitai.Stream
	_root *Uimage
	_parent *Uimage_NameOrAsusInfo
}
func NewUimage_AsusFirmwareInformation() *Uimage_AsusFirmwareInformation {
	return &Uimage_AsusFirmwareInformation{
	}
}

func (this Uimage_AsusFirmwareInformation) IO_() *kaitai.Stream {
	return this._io
}

func (this *Uimage_AsusFirmwareInformation) Read(io *kaitai.Stream, parent *Uimage_NameOrAsusInfo, root *Uimage) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp3 := NewUimage_Version()
	err = tmp3.Read(this._io, this, this._root)
	if err != nil {
		return err
	}
	this.KernelVersion = tmp3
	tmp4 := NewUimage_Version()
	err = tmp4.Read(this._io, this, this._root)
	if err != nil {
		return err
	}
	this.FsVersion = tmp4
	tmp5, err := this._io.ReadBytes(int(12))
	if err != nil {
		return err
	}
	tmp5 = kaitai.BytesTerminate(tmp5, 0, false)
	this.ProductId = string(tmp5)
	tmp6, err := this._io.ReadBytes(int(16))
	if err != nil {
		return err
	}
	tmp6 = tmp6
	this.ExtraInfo = tmp6
	return err
}

/**
 * In the Ralink SDK variant (see `extra_info`), the product ID field is
 * actually 23 bytes long, but no known product ID is longer than 12
 * bytes.
 */

/**
 * The structure of these bytes varies among the three known variants of
 * the `TAIL` structure, and the header doesn't say which one is used:
 * 
 * * Plain: 8 hardware versions (using the `version` type) - see
 *   <https://github.com/drag0njoe/RT-AC55U/blob/cf5874684ab6995ee07e91a52dfdd0562fcc2655/release/src/asustools/mkimage.src/include/image.h#L170>
 * 
 *   Sample file: `RT-AC51U_3.0.0.4_380_8591-ga8dd632.trx` from
 *   <https://dlcdnets.asus.com/pub/ASUS/wireless/RT-AC51U/FW_RT_AC51U_30043808591.zip>,
 *   released on 2020-09-22 and listed on
 *   <https://www.asus.com/supportonly/rt-ac51u/helpdesk_bios/>.
 * 
 *   Source code links:
 * 
 *   - [ASUS GPL source, RT-AC55UHP
 *     3.0.0.4.382.51915](https://dlcdnets.asus.com/pub/ASUS/wireless/RT-AC55UHP/GPL_RT_AC55UHP_300438251915.zip)
 *     (`asuswrt/release/src/asustools/mkimage.src/` in
 *     `GPL_RT-AC55UHP_3.0.0.4.382.51915-g4086e57.tgz`)
 *   - [ASUS GPL source, RT-AC55U 3.0.0.4.382.50702 (unofficial
 *     mirror)](https://github.com/drag0njoe/RT-AC55U/tree/cf5874684ab6995ee07e91a52dfdd0562fcc2655/release/src/asustools/mkimage.src)
 * 
 * * `TRX_NEW` (a macro defined when building `mkimage`): the
 *   build number and extended build number (`u2le` each), two key bytes
 *   and 5 hardware versions - see
 *   <https://github.com/drag0njoe/RT-AC55U/blob/cf5874684ab6995ee07e91a52dfdd0562fcc2655/release/src-qca/asustools/mkimage.src/include/image.h#L174-L180>
 * 
 *   `mkimage` [overwrites the first 3 hardware
 *   versions](https://github.com/drag0njoe/RT-AC55U/blob/cf5874684ab6995ee07e91a52dfdd0562fcc2655/release/src-qca/asustools/mkimage.src/mkimage.c#L546-L569)
 *   with values derived from the key bytes.
 * 
 *   Sample file: `RT-AC55UHP_3.0.0.4_382_52236-ga0f880d.trx` (build 382,
 *   extended build 52236) from
 *   <https://dlcdnets.asus.com/pub/ASUS/wireless/RT-AC55UHP/FW_RT_AC55UHP_300438252236.zip>,
 *   released on 2020-06-04 and listed on
 *   <https://www.asus.com/supportonly/rt-ac55uhp/helpdesk_bios/>.
 * 
 *   Source code links:
 * 
 *   - [ASUS GPL source, RT-AC55UHP
 *     3.0.0.4.382.51915](https://dlcdnets.asus.com/pub/ASUS/wireless/RT-AC55UHP/GPL_RT_AC55UHP_300438251915.zip)
 *     (`asuswrt/release/src-qca/asustools/mkimage.src/` in
 *     `GPL_RT-AC55UHP_3.0.0.4.382.51915-g4086e57.tgz`)
 *   - [ASUS GPL source, RT-AC55U 3.0.0.4.382.50702 (unofficial
 *     mirror)](https://github.com/drag0njoe/RT-AC55U/tree/cf5874684ab6995ee07e91a52dfdd0562fcc2655/release/src-qca/asustools/mkimage.src)
 * 
 * * Ralink SDK: the rest of a 23-byte product ID (see `product_id`),
 *   a version suffix letter and the kernel part size (called `ih_ksz`) -
 *   see <https://github.com/andy-padavan/rt-n56u/blob/32a93db4026cc2cff585d7008373432d888fc1aa/trunk/tools/mkimage/include/image.h#L164-L165>
 * 
 *   Sample file: `RP-N12_1.0.1.1f.trx` from
 *   <https://dlcdnets.asus.com/pub/ASUS/wireless/RP-N12/FW_RP-N12_1.0.1.1f.zip>,
 *   released on 2019-11-12 and listed on
 *   <https://www.asus.com/supportonly/rp-n12/helpdesk_bios/>.
 * 
 *   Source code links:
 * 
 *   - [ASUS GPL source, RP-N12
 *     1.0.1.1f](https://dlcdnets.asus.com/pub/ASUS/wireless/RP-N12/GPL_RP_N12_1011f.zip)
 *     (`GPL_RP-N12_source.1011f/user/mkimage/include/image.h` in
 *     `GPL_RP-N12_source.1011f.tar.bz2`)
 *   - [rt-n56u custom firmware by Andy
 *     Padavan](https://github.com/andy-padavan/rt-n56u/blob/32a93db4026cc2cff585d7008373432d888fc1aa/trunk/tools/mkimage/include/image.h)
 * 
 * In the plain and `TRX_NEW` variants, the last 4 bytes may instead
 * contain the offset of the root file system, which is [written by
 * `mkimage -r`](https://github.com/drag0njoe/RT-AC55U/blob/cf5874684ab6995ee07e91a52dfdd0562fcc2655/release/src/asustools/mkimage.src/mkimage.c#L527-L542)
 * as the magic byte 0xA9
 * ([`ROOTFS_OFFSET_MAGIC`](https://github.com/drag0njoe/RT-AC55U/blob/cf5874684ab6995ee07e91a52dfdd0562fcc2655/release/src/asustools/mkimage.src/include/image.h#L154-L159))
 * followed by the offset as a 24-bit big-endian integer.
 */
type Uimage_NameOrAsusInfo struct {
	Name string
	AsusInfo *Uimage_AsusFirmwareInformation
	_io *kaitai.Stream
	_root *Uimage
	_parent *Uimage_Uheader
	_f_byte0 bool
	byte0 uint8
	_f_byte4 bool
	byte4 uint8
	_f_hasAsusInfo bool
	hasAsusInfo bool
}
func NewUimage_NameOrAsusInfo() *Uimage_NameOrAsusInfo {
	return &Uimage_NameOrAsusInfo{
	}
}

func (this Uimage_NameOrAsusInfo) IO_() *kaitai.Stream {
	return this._io
}

func (this *Uimage_NameOrAsusInfo) Read(io *kaitai.Stream, parent *Uimage_Uheader, root *Uimage) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp7, err := this.HasAsusInfo()
	if err != nil {
		return err
	}
	if (!(tmp7)) {
		tmp8, err := this._io.ReadBytesTerm(0, false, true, false)
		if err != nil {
			return err
		}
		this.Name = string(tmp8)
	}
	tmp9, err := this.HasAsusInfo()
	if err != nil {
		return err
	}
	if (tmp9) {
		tmp10 := NewUimage_AsusFirmwareInformation()
		err = tmp10.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.AsusInfo = tmp10
	}
	return err
}
func (this *Uimage_NameOrAsusInfo) Byte0() (v uint8, err error) {
	if (this._f_byte0) {
		return this.byte0, nil
	}
	this._f_byte0 = true
	_pos, err := this._io.Pos()
	if err != nil {
		return 0, err
	}
	_, err = this._io.Seek(int64(0), io.SeekStart)
	if err != nil {
		return 0, err
	}
	tmp11, err := this._io.ReadU1()
	if err != nil {
		return 0, err
	}
	this.byte0 = tmp11
	_, err = this._io.Seek(_pos, io.SeekStart)
	if err != nil {
		return 0, err
	}
	return this.byte0, nil
}
func (this *Uimage_NameOrAsusInfo) Byte4() (v uint8, err error) {
	if (this._f_byte4) {
		return this.byte4, nil
	}
	this._f_byte4 = true
	_pos, err := this._io.Pos()
	if err != nil {
		return 0, err
	}
	_, err = this._io.Seek(int64(4), io.SeekStart)
	if err != nil {
		return 0, err
	}
	tmp12, err := this._io.ReadU1()
	if err != nil {
		return 0, err
	}
	this.byte4 = tmp12
	_, err = this._io.Seek(_pos, io.SeekStart)
	if err != nil {
		return 0, err
	}
	return this.byte4, nil
}

/**
 * Whether this type stores ASUS firmware information (`asus_info`)
 * rather than an image name (`name`).
 * 
 * The header doesn't say which one it is, so we infer it using a
 * heuristic based on the layout of the `asus_firmware_information` type.
 * If ASUS firmware info is present, the first byte (the major kernel
 * version number) is a small integer (i.e. not a printable character),
 * and byte 4 (first byte of the product ID/model name) is a printable
 * character. An empty name is not mistaken for ASUS information, because
 * its byte 4 is a null byte.
 * 
 * The highest known major kernel version number is 9 (e.g. in
 * `DSL-N55U_9.0.0.4_380_3925-gad8f412_Annex_A.trx` from
 * <https://dlcdnets.asus.com/pub/ASUS/wireless/DSL-N55U/FW_DSL_N55U_90043803925.zip>,
 * released on 2016-08-04 and listed on
 * <https://www.asus.com/supportonly/dsl-n55u/helpdesk_bios/>). ASUS
 * seems to use such high major versions (9, sometimes 7) for beta
 * releases, whereas regular releases use 3 (or 1 in older firmware).
 * 
 * It can also be 0, in particular due to a bug in the MediaTek MT798X
 * build of ASUS's `mkimage` (it reads the `-V` values from fixed `argv`
 * positions, even though it parses the options using `getopt()` - see
 * <https://github.com/blocktrron/tuf-ax4200-gpl/blob/a4fe37f4d78473f97c6d47cf93d97c3811af90cc/release/src-mtk-MT798X/Uboot-upstream/tools/mkimage.c#L317-L333>).
 * For example, this is the case in
 * `RT-AX52_3.0.0.4_388_34015-g9488655.trx` from
 * <https://dlcdnets.asus.com/pub/ASUS/wireless/RT-AX52/FW_RT-AX52_300438834015.zip>,
 * released on 2026-03-20 and listed on
 * <https://www.asus.com/supportonly/rt-ax52/helpdesk_bios?model2Name=RT-AX52>.
 */
func (this *Uimage_NameOrAsusInfo) HasAsusInfo() (v bool, err error) {
	if (this._f_hasAsusInfo) {
		return this.hasAsusInfo, nil
	}
	this._f_hasAsusInfo = true
	tmp13, err := this.Byte0()
	if err != nil {
		return false, err
	}
	tmp14, err := this.Byte4()
	if err != nil {
		return false, err
	}
	tmp15, err := this.Byte4()
	if err != nil {
		return false, err
	}
	this.hasAsusInfo = bool( ((tmp13 < 32) && (tmp14 >= 32) && (tmp15 < 127)) )
	return this.hasAsusInfo, nil
}
type Uimage_Uheader struct {
	Magic Uimage_MagicTypes
	HeaderCrc uint32
	Timestamp uint32
	LenImage uint32
	LoadAddress uint32
	EntryAddress uint32
	DataCrc uint32
	OsType Uimage_UimageOs
	Architecture Uimage_UimageArch
	ImageType Uimage_UimageType
	CompressionType Uimage_UimageComp
	NameOrAsusInfo *Uimage_NameOrAsusInfo
	_io *kaitai.Stream
	_root *Uimage
	_parent *Uimage
	_raw_NameOrAsusInfo []byte
}
func NewUimage_Uheader() *Uimage_Uheader {
	return &Uimage_Uheader{
	}
}

func (this Uimage_Uheader) IO_() *kaitai.Stream {
	return this._io
}

func (this *Uimage_Uheader) Read(io *kaitai.Stream, parent *Uimage, root *Uimage) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp16, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.Magic = Uimage_MagicTypes(tmp16)
	if !this.Magic.isDefined() {
		return kaitai.NewValidationNotInEnumError(this.Magic, this._io, "/types/uheader/seq/0")
	}
	tmp17, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.HeaderCrc = uint32(tmp17)
	tmp18, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.Timestamp = uint32(tmp18)
	tmp19, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.LenImage = uint32(tmp19)
	tmp20, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.LoadAddress = uint32(tmp20)
	tmp21, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.EntryAddress = uint32(tmp21)
	tmp22, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.DataCrc = uint32(tmp22)
	tmp23, err := this._io.ReadU1()
	if err != nil {
		return err
	}
	this.OsType = Uimage_UimageOs(tmp23)
	if !this.OsType.isDefined() {
		return kaitai.NewValidationNotInEnumError(this.OsType, this._io, "/types/uheader/seq/7")
	}
	tmp24, err := this._io.ReadU1()
	if err != nil {
		return err
	}
	this.Architecture = Uimage_UimageArch(tmp24)
	if !this.Architecture.isDefined() {
		return kaitai.NewValidationNotInEnumError(this.Architecture, this._io, "/types/uheader/seq/8")
	}
	tmp25, err := this._io.ReadU1()
	if err != nil {
		return err
	}
	this.ImageType = Uimage_UimageType(tmp25)
	if !this.ImageType.isDefined() {
		return kaitai.NewValidationNotInEnumError(this.ImageType, this._io, "/types/uheader/seq/9")
	}
	tmp26, err := this._io.ReadU1()
	if err != nil {
		return err
	}
	this.CompressionType = Uimage_UimageComp(tmp26)
	if !this.CompressionType.isDefined() {
		return kaitai.NewValidationNotInEnumError(this.CompressionType, this._io, "/types/uheader/seq/10")
	}
	tmp27, err := this._io.ReadBytes(int(32))
	if err != nil {
		return err
	}
	tmp27 = tmp27
	this._raw_NameOrAsusInfo = tmp27
	_io__raw_NameOrAsusInfo := kaitai.NewStream(bytes.NewReader(this._raw_NameOrAsusInfo))
	tmp28 := NewUimage_NameOrAsusInfo()
	err = tmp28.Read(_io__raw_NameOrAsusInfo, this, this._root)
	if err != nil {
		return err
	}
	this.NameOrAsusInfo = tmp28
	return err
}

/**
 * Besides the standard U-Boot magic, some vendors' bootloaders expect
 * their own value (often a different one for each device model), with
 * the rest of the header unchanged. `magic_types` lists the values
 * known so far; images with any other magic are rejected.
 */
type Uimage_Version struct {
	Major uint8
	Minor uint8
	_io *kaitai.Stream
	_root *Uimage
	_parent *Uimage_AsusFirmwareInformation
}
func NewUimage_Version() *Uimage_Version {
	return &Uimage_Version{
	}
}

func (this Uimage_Version) IO_() *kaitai.Stream {
	return this._io
}

func (this *Uimage_Version) Read(io *kaitai.Stream, parent *Uimage_AsusFirmwareInformation, root *Uimage) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp29, err := this._io.ReadU1()
	if err != nil {
		return err
	}
	this.Major = tmp29
	tmp30, err := this._io.ReadU1()
	if err != nil {
		return err
	}
	this.Minor = tmp30
	return err
}