// Code generated by kaitai-struct-compiler from a .ksy source file. DO NOT EDIT. import ( "github.com/kaitai-io/kaitai_struct_go_runtime/kaitai" "bytes" "io" ) /** * A phar (PHP archive) file. The phar format is a custom archive format * from the PHP ecosystem that is used to package a complete PHP library * or application into a single self-contained archive. * All phar archives start with an executable PHP stub, which can be used to * allow executing or including phar files as if they were regular PHP scripts. * PHP 5.3 and later include the phar extension, which adds native support for * reading and manipulating phar files. * * The phar format was originally developed as part of the PEAR library * PHP_Archive, first released in 2005. Later, a native PHP extension * named "phar" was developed, which was first released on PECL in 2007, * and is included with PHP 5.3 and later. The phar extension has effectively * superseded the PHP_Archive library, which has not been updated since 2010. * The phar extension is also no longer released independently on PECL; * it is now developed and released as part of PHP itself. * * Because of current limitations in Kaitai Struct * (seekaitai-io/kaitai_struct#158 and kaitai-io/kaitai_struct#538), * the executable PHP stub that precedes the rest of the archive is not handled * by this spec. Before parsing a phar using this spec, the stub must be * removed manually. * * A phar's stub is terminated by the special token `__HALT_COMPILER();` * (which may be followed by at most one space, the PHP tag end `?>`, * and an optional line terminator). The stub termination sequence is * immediately followed by the remaining parts of the phar format, * as described in this spec. * * The phar stub usually contains code that loads the phar and runs * a contained PHP file, but this is not required. A minimal valid phar stub * is `Source * @see Source * @see Source * @see Source */ type PharWithoutStub_SignatureType int const ( PharWithoutStub_SignatureType__Md5 PharWithoutStub_SignatureType = 1 PharWithoutStub_SignatureType__Sha1 PharWithoutStub_SignatureType = 2 PharWithoutStub_SignatureType__Sha256 PharWithoutStub_SignatureType = 4 PharWithoutStub_SignatureType__Sha512 PharWithoutStub_SignatureType = 8 PharWithoutStub_SignatureType__Openssl PharWithoutStub_SignatureType = 16 ) type PharWithoutStub struct { Manifest *PharWithoutStub_Manifest Files [][]byte Signature *PharWithoutStub_Signature _io *kaitai.Stream _root *PharWithoutStub _parent interface{} _raw_Signature []byte } func NewPharWithoutStub() *PharWithoutStub { return &PharWithoutStub{ } } func (this *PharWithoutStub) Read(io *kaitai.Stream, parent interface{}, root *PharWithoutStub) (err error) { this._io = io this._parent = parent this._root = root tmp1 := NewPharWithoutStub_Manifest() err = tmp1.Read(this._io, this, this._root) if err != nil { return err } this.Manifest = tmp1 for i := 0; i < int(this.Manifest.NumFiles); i++ { _ = i tmp2, err := this._io.ReadBytes(int(this.Manifest.FileEntries[i].LenDataCompressed)) if err != nil { return err } tmp2 = tmp2 this.Files = append(this.Files, tmp2) } tmp3, err := this.Manifest.Flags.HasSignature() if err != nil { return err } if (tmp3) { tmp4, err := this._io.ReadBytesFull() if err != nil { return err } tmp4 = tmp4 this._raw_Signature = tmp4 _io__raw_Signature := kaitai.NewStream(bytes.NewReader(this._raw_Signature)) tmp5 := NewPharWithoutStub_Signature() err = tmp5.Read(_io__raw_Signature, this, this._root) if err != nil { return err } this.Signature = tmp5 } return err } /** * The archive's manifest, containing general metadata about the archive * and its files. */ /** * The contents of each file in the archive (possibly compressed, * as indicated by the file's flags in the manifest). The files are stored * in the same order as they appear in the manifest. */ /** * The archive's signature - a digest of all archive data before * the signature itself. * * Note: Almost all of the available "signature" types are actually hashes, * not signatures, and cannot be used to verify that the archive has not * been tampered with. Only the OpenSSL signature type is a true * cryptographic signature. */ type PharWithoutStub_SerializedValue struct { Raw []byte _io *kaitai.Stream _root *PharWithoutStub _parent interface{} _f_parsed bool parsed *PhpSerializedValue } func NewPharWithoutStub_SerializedValue() *PharWithoutStub_SerializedValue { return &PharWithoutStub_SerializedValue{ } } func (this *PharWithoutStub_SerializedValue) Read(io *kaitai.Stream, parent interface{}, root *PharWithoutStub) (err error) { this._io = io this._parent = parent this._root = root tmp6, err := this._io.ReadBytesFull() if err != nil { return err } tmp6 = tmp6 this.Raw = tmp6 return err } /** * The serialized value, parsed as a structure. */ func (this *PharWithoutStub_SerializedValue) Parsed() (v *PhpSerializedValue, err error) { if (this._f_parsed) { return this.parsed, nil } _pos, err := this._io.Pos() if err != nil { return nil, err } _, err = this._io.Seek(int64(0), io.SeekStart) if err != nil { return nil, err } tmp7 := NewPhpSerializedValue() err = tmp7.Read(this._io, this, nil) if err != nil { return nil, err } this.parsed = tmp7 _, err = this._io.Seek(_pos, io.SeekStart) if err != nil { return nil, err } this._f_parsed = true this._f_parsed = true return this.parsed, nil } /** * The serialized value, as a raw byte array. */ type PharWithoutStub_Signature struct { Data []byte Type PharWithoutStub_SignatureType Magic []byte _io *kaitai.Stream _root *PharWithoutStub _parent *PharWithoutStub } func NewPharWithoutStub_Signature() *PharWithoutStub_Signature { return &PharWithoutStub_Signature{ } } func (this *PharWithoutStub_Signature) Read(io *kaitai.Stream, parent *PharWithoutStub, root *PharWithoutStub) (err error) { this._io = io this._parent = parent this._root = root tmp8, err := this._io.Size() if err != nil { return err } tmp9, err := this._io.Pos() if err != nil { return err } tmp10, err := this._io.ReadBytes(int(((tmp8 - tmp9) - 8))) if err != nil { return err } tmp10 = tmp10 this.Data = tmp10 tmp11, err := this._io.ReadU4le() if err != nil { return err } this.Type = PharWithoutStub_SignatureType(tmp11) tmp12, err := this._io.ReadBytes(int(4)) if err != nil { return err } tmp12 = tmp12 this.Magic = tmp12 if !(bytes.Equal(this.Magic, []uint8{71, 66, 77, 66})) { return kaitai.NewValidationNotEqualError([]uint8{71, 66, 77, 66}, this.Magic, this._io, "/types/signature/seq/2") } return err } /** * The signature data. The size and contents depend on the * signature type. */ /** * The signature type. */ type PharWithoutStub_FileFlags struct { Value uint32 _io *kaitai.Stream _root *PharWithoutStub _parent *PharWithoutStub_FileEntry _f_permissions bool permissions int _f_zlibCompressed bool zlibCompressed bool _f_bzip2Compressed bool bzip2Compressed bool } func NewPharWithoutStub_FileFlags() *PharWithoutStub_FileFlags { return &PharWithoutStub_FileFlags{ } } func (this *PharWithoutStub_FileFlags) Read(io *kaitai.Stream, parent *PharWithoutStub_FileEntry, root *PharWithoutStub) (err error) { this._io = io this._parent = parent this._root = root tmp13, err := this._io.ReadU4le() if err != nil { return err } this.Value = uint32(tmp13) return err } /** * The file's permission bits. */ func (this *PharWithoutStub_FileFlags) Permissions() (v int, err error) { if (this._f_permissions) { return this.permissions, nil } this.permissions = int((this.Value & 511)) this._f_permissions = true return this.permissions, nil } /** * Whether this file's data is stored using zlib compression. */ func (this *PharWithoutStub_FileFlags) ZlibCompressed() (v bool, err error) { if (this._f_zlibCompressed) { return this.zlibCompressed, nil } this.zlibCompressed = bool((this.Value & 4096) != 0) this._f_zlibCompressed = true return this.zlibCompressed, nil } /** * Whether this file's data is stored using bzip2 compression. */ func (this *PharWithoutStub_FileFlags) Bzip2Compressed() (v bool, err error) { if (this._f_bzip2Compressed) { return this.bzip2Compressed, nil } this.bzip2Compressed = bool((this.Value & 8192) != 0) this._f_bzip2Compressed = true return this.bzip2Compressed, nil } /** * The unparsed flag bits. */ /** * A phar API version number. This version number is meant to indicate * which features are used in a specific phar, so that tools reading * the phar can easily check that they support all necessary features. * * The following API versions exist so far: * * * 0.5, 0.6, 0.7, 0.7.1: The first official API versions. At this point, * the phar format was only used by the PHP_Archive library, and the * API version numbers were identical to the PHP_Archive versions that * supported them. Development of the native phar extension started around * API version 0.7. These API versions could only be queried using the * `PHP_Archive::APIversion()` method, but were not stored physically * in archives. These API versions are not supported by this spec. * * 0.8.0: Used by PHP_Archive 0.8.0 (released 2006-07-18) and * later development versions of the phar extension. This is the first * version number to be physically stored in archives. This API version * is not supported by this spec. * * 0.9.0: Used by later development/early beta versions of the * phar extension. Also temporarily used by PHP_Archive 0.9.0 * (released 2006-12-15), but reverted back to API version 0.8.0 in * PHP_Archive 0.9.1 (released 2007-01-05). * * 1.0.0: Supported since PHP_Archive 0.10.0 (released 2007-05-29) * and phar extension 1.0.0 (released 2007-03-28). This is the first * stable, forwards-compatible and documented version of the format. * * 1.1.0: Supported since PHP_Archive 0.12.0 (released 2015-07-06) * and phar extension 1.1.0 (released 2007-04-12). Adds SHA-256 and * SHA-512 signature types. * * 1.1.1: Supported since phar extension 2.0.0 (released 2009-07-29 and * included with PHP 5.3 and later). (PHP_Archive 0.12.0 also supports * all features from API verison 1.1.1, but it reports API version 1.1.0.) * Adds the OpenSSL signature type and support for storing * empty directories. */ type PharWithoutStub_ApiVersion struct { Release uint64 Major uint64 Minor uint64 Unused uint64 _io *kaitai.Stream _root *PharWithoutStub _parent *PharWithoutStub_Manifest } func NewPharWithoutStub_ApiVersion() *PharWithoutStub_ApiVersion { return &PharWithoutStub_ApiVersion{ } } func (this *PharWithoutStub_ApiVersion) Read(io *kaitai.Stream, parent *PharWithoutStub_Manifest, root *PharWithoutStub) (err error) { this._io = io this._parent = parent this._root = root tmp14, err := this._io.ReadBitsIntBe(4) if err != nil { return err } this.Release = tmp14 tmp15, err := this._io.ReadBitsIntBe(4) if err != nil { return err } this.Major = tmp15 tmp16, err := this._io.ReadBitsIntBe(4) if err != nil { return err } this.Minor = tmp16 tmp17, err := this._io.ReadBitsIntBe(4) if err != nil { return err } this.Unused = tmp17 return err } type PharWithoutStub_GlobalFlags struct { Value uint32 _io *kaitai.Stream _root *PharWithoutStub _parent *PharWithoutStub_Manifest _f_anyZlibCompressed bool anyZlibCompressed bool _f_anyBzip2Compressed bool anyBzip2Compressed bool _f_hasSignature bool hasSignature bool } func NewPharWithoutStub_GlobalFlags() *PharWithoutStub_GlobalFlags { return &PharWithoutStub_GlobalFlags{ } } func (this *PharWithoutStub_GlobalFlags) Read(io *kaitai.Stream, parent *PharWithoutStub_Manifest, root *PharWithoutStub) (err error) { this._io = io this._parent = parent this._root = root tmp18, err := this._io.ReadU4le() if err != nil { return err } this.Value = uint32(tmp18) return err } /** * Whether any of the files in this phar are stored using * zlib compression. */ func (this *PharWithoutStub_GlobalFlags) AnyZlibCompressed() (v bool, err error) { if (this._f_anyZlibCompressed) { return this.anyZlibCompressed, nil } this.anyZlibCompressed = bool((this.Value & 4096) != 0) this._f_anyZlibCompressed = true return this.anyZlibCompressed, nil } /** * Whether any of the files in this phar are stored using * bzip2 compression. */ func (this *PharWithoutStub_GlobalFlags) AnyBzip2Compressed() (v bool, err error) { if (this._f_anyBzip2Compressed) { return this.anyBzip2Compressed, nil } this.anyBzip2Compressed = bool((this.Value & 8192) != 0) this._f_anyBzip2Compressed = true return this.anyBzip2Compressed, nil } /** * Whether this phar contains a signature. */ func (this *PharWithoutStub_GlobalFlags) HasSignature() (v bool, err error) { if (this._f_hasSignature) { return this.hasSignature, nil } this.hasSignature = bool((this.Value & 65536) != 0) this._f_hasSignature = true return this.hasSignature, nil } /** * The unparsed flag bits. */ type PharWithoutStub_Manifest struct { LenManifest uint32 NumFiles uint32 ApiVersion *PharWithoutStub_ApiVersion Flags *PharWithoutStub_GlobalFlags LenAlias uint32 Alias []byte LenMetadata uint32 Metadata *PharWithoutStub_SerializedValue FileEntries []*PharWithoutStub_FileEntry _io *kaitai.Stream _root *PharWithoutStub _parent *PharWithoutStub _raw_Metadata []byte } func NewPharWithoutStub_Manifest() *PharWithoutStub_Manifest { return &PharWithoutStub_Manifest{ } } func (this *PharWithoutStub_Manifest) Read(io *kaitai.Stream, parent *PharWithoutStub, root *PharWithoutStub) (err error) { this._io = io this._parent = parent this._root = root tmp19, err := this._io.ReadU4le() if err != nil { return err } this.LenManifest = uint32(tmp19) tmp20, err := this._io.ReadU4le() if err != nil { return err } this.NumFiles = uint32(tmp20) tmp21 := NewPharWithoutStub_ApiVersion() err = tmp21.Read(this._io, this, this._root) if err != nil { return err } this.ApiVersion = tmp21 tmp22 := NewPharWithoutStub_GlobalFlags() err = tmp22.Read(this._io, this, this._root) if err != nil { return err } this.Flags = tmp22 tmp23, err := this._io.ReadU4le() if err != nil { return err } this.LenAlias = uint32(tmp23) tmp24, err := this._io.ReadBytes(int(this.LenAlias)) if err != nil { return err } tmp24 = tmp24 this.Alias = tmp24 tmp25, err := this._io.ReadU4le() if err != nil { return err } this.LenMetadata = uint32(tmp25) if (this.LenMetadata != 0) { tmp26, err := this._io.ReadBytes(int(this.LenMetadata)) if err != nil { return err } tmp26 = tmp26 this._raw_Metadata = tmp26 _io__raw_Metadata := kaitai.NewStream(bytes.NewReader(this._raw_Metadata)) tmp27 := NewPharWithoutStub_SerializedValue() err = tmp27.Read(_io__raw_Metadata, this, this._root) if err != nil { return err } this.Metadata = tmp27 } for i := 0; i < int(this.NumFiles); i++ { _ = i tmp28 := NewPharWithoutStub_FileEntry() err = tmp28.Read(this._io, this, this._root) if err != nil { return err } this.FileEntries = append(this.FileEntries, tmp28) } return err } /** * The length of the manifest, in bytes. * * Note: The phar extension does not allow reading manifests * larger than 100 MiB. */ /** * The number of files in this phar. */ /** * The API version used by this phar manifest. */ /** * Global flags for this phar. */ /** * The length of the alias, in bytes. */ /** * The phar's alias, i. e. the name under which it is loaded into PHP. */ /** * The size of the metadata, in bytes, or 0 if there is none. */ /** * Metadata for this phar, in the format used by PHP's * `serialize` function. The meaning of the serialized data is not * specified further, it may be used to store arbitrary custom data * about the archive. */ /** * Manifest entries for the files contained in this phar. */ type PharWithoutStub_FileEntry struct { LenFilename uint32 Filename []byte LenDataUncompressed uint32 Timestamp uint32 LenDataCompressed uint32 Crc32 uint32 Flags *PharWithoutStub_FileFlags LenMetadata uint32 Metadata *PharWithoutStub_SerializedValue _io *kaitai.Stream _root *PharWithoutStub _parent *PharWithoutStub_Manifest _raw_Metadata []byte } func NewPharWithoutStub_FileEntry() *PharWithoutStub_FileEntry { return &PharWithoutStub_FileEntry{ } } func (this *PharWithoutStub_FileEntry) Read(io *kaitai.Stream, parent *PharWithoutStub_Manifest, root *PharWithoutStub) (err error) { this._io = io this._parent = parent this._root = root tmp29, err := this._io.ReadU4le() if err != nil { return err } this.LenFilename = uint32(tmp29) tmp30, err := this._io.ReadBytes(int(this.LenFilename)) if err != nil { return err } tmp30 = tmp30 this.Filename = tmp30 tmp31, err := this._io.ReadU4le() if err != nil { return err } this.LenDataUncompressed = uint32(tmp31) tmp32, err := this._io.ReadU4le() if err != nil { return err } this.Timestamp = uint32(tmp32) tmp33, err := this._io.ReadU4le() if err != nil { return err } this.LenDataCompressed = uint32(tmp33) tmp34, err := this._io.ReadU4le() if err != nil { return err } this.Crc32 = uint32(tmp34) tmp35 := NewPharWithoutStub_FileFlags() err = tmp35.Read(this._io, this, this._root) if err != nil { return err } this.Flags = tmp35 tmp36, err := this._io.ReadU4le() if err != nil { return err } this.LenMetadata = uint32(tmp36) if (this.LenMetadata != 0) { tmp37, err := this._io.ReadBytes(int(this.LenMetadata)) if err != nil { return err } tmp37 = tmp37 this._raw_Metadata = tmp37 _io__raw_Metadata := kaitai.NewStream(bytes.NewReader(this._raw_Metadata)) tmp38 := NewPharWithoutStub_SerializedValue() err = tmp38.Read(_io__raw_Metadata, this, this._root) if err != nil { return err } this.Metadata = tmp38 } return err } /** * The length of the file name, in bytes. */ /** * The name of this file. If the name ends with a slash, this entry * represents a directory, otherwise a regular file. Directory entries * are supported since phar API version 1.1.1. * (Explicit directory entries are only needed for empty directories. * Non-empty directories are implied by the files located inside them.) */ /** * The length of the file's data when uncompressed, in bytes. */ /** * The time at which the file was added or last updated, as a * Unix timestamp. */ /** * The length of the file's data when compressed, in bytes. */ /** * The CRC32 checksum of the file's uncompressed data. */ /** * Flags for this file. */ /** * The length of the metadata, in bytes, or 0 if there is none. */ /** * Metadata for this file, in the format used by PHP's * `serialize` function. The meaning of the serialized data is not * specified further, it may be used to store arbitrary custom data * about the file. */