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.
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.
// 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
}