ISZ File Format Specification Version: 1.00 Revised: July 3, 2006 Copyright (c) 2002-2006 EZB Systems, Inc., All Rights Reserved. 1. Purpose ---------- This specification is intended to define an interoperable ISO CD/DVD image storage and transfer format. 2. Disclaimer --------------- Although EZB Systems will attempt to supply current and accurate information relating to its file formats, algorithms, and the subject programs, the possibility of error or omission cannot be eliminated. EZB Systems therefore expressly disclaims any warranty that the information contained in the associated materials relating to the subject programs and/or the format of the files created or accessed by the subject programs and/or the algorithms used by the subject programs, or any other matter, is current, correct or accurate as delivered. Any risk of damage due to any possible inaccurate information is assumed by the user of the information. Furthermore, the information relating to the subject programs and/or the file formats created or accessed by the subject programs and/or the algorithms used by the subject programs is subject to change without notice. 3. General Format of a .ISZ file -------------------------------- Large .ISZ files can span multiple disk media or be split into user-defined segment sizes. Overall .ISZ file format: [ISZ file header] [Segment defination table] [Chunk defination table] [Chunk #1 data] . . . [Chunk #n data] 3.1 ISZ file header: typedef struct isz_file_header { char signature[4]; // 'IsZ!' unsigned char header_size; // header size in bytes char ver; // version number unsigned int vsn; // volume serial number unsigned short sect_size; // sector size in bytes unsigned int total_sectors; // total sectors of ISO image char has_password; // is Password protected? __int64 segment_size; // size of segments in bytes unsigned int nblocks; // number of chunks in image unsigned int block_size; // chunk size in bytes (must be multiple of sector_size) unsigned char ptr_len; // chunk pointer length char seg_no; // segment number of this segment file, max 99 unsigned int ptr_offs; // offset of chunk pointers, zero = none unsigned int seg_offs; // offset of segment pointers, zero = none unsigned int data_offs; // data offset char reserved; } isz_header; The 'has_password' field should be one of the following values: #define ADI_PLAIN 0 // no encryption #define ADI_PASSWORD 1 // password protected (not used) #define ADI_AES128 2 // AES128 encryption #define ADI_AES192 3 // AES192 encryption #define ADI_AES256 4 // AES256 encryption 3.2. Segment defination table (SDT) This descriptor exists only if 'seg_offs' field of ISZ header is not zero. Immediately following the ISZ file header to define segment information. typedef struct isz_seg_st { __int64 size; // segment size in bytes int num_chks; // number of chunks in current file int first_chkno; // first chunk number in current file int chk_off; // offset to first chunk in current file int left_size; // uncompltete chunk bytes in next file } isz_seg; If an ISZ file is not segmented (has only one segment), no SDT should be stored. The 'seg_offs' field in ISZ file header should be zero. For ISZ files with N segments, N+1 SDT entries should be stored. 'size' field of the last SDT entry should be zero. 3.3. Chunk defination table (CDT) This descriptor exists only if 'ptr_offs' field of ISZ haeder is not zero. Immediately following the SDT to define chunk information. typedef struct isz_chunk_st { chunk_flag; blk_len; } isz_chunk; 'chunk_flag' and 'blk_len' defination is variable according to 'ptr_len' field of ISZ header. The 'chunk_flag' should be one of the following values: #define ADI_ZERO 0x00 // all zeros chunk #define ADI_DATA 0x40 // non-compressed data #define ADI_ZLIB 0x80 // ZLIB compressed #define ADI_BZ2 0xC0 // BZIP2 compressed Number of CDT entries should equal to 'nblocks' field in ISZ header, 'blk_len' field in CDT entry MUST be less or equal to 'block_size' in ISZ header. 3.4 Chunk data According to 'chunk_flag' defination, a chunk may have no data (ADI_ZERO) or 'blk_len' bytes of compressed (ADI_ZLIB or ADI_BZ2) or non-compressed data (ADI_DATA) 3.5. Splitting and Spanning ISZ files Spanning is the process of segmenting a ISZ file across multiple removable media. This support has typically been provided for floppy diskettes, CD-R discs and DVD-R discs. File splitting is a newer derivative of spanning. Splitting follows the same segmentation process as spanning, however, it does not require writing each segment to a unique removable medium and instead supports placing all pieces onto local or non-removable locations such as file systems, local drives, folders, etc... Split ISZ files are typically written to the same location and are subject to name collisions if the spanned name format is used since each segment will reside on the same drive. To avoid name collisions, split archives are named as follows. Segment 1 = filename.isz Segment 2 = filename.i01 Segment n = filename.i(n-1) The .ISZ extension is used on the first segment to support quickly reading the ISO image information directory. The segment number n should be a decimal value. Capacities for split archives are as follows. Maximum number of segments = 99 Minimum segment size = 100KB Maximum segment size = 4TB - 1 (64 bits) Segment sizes may be different however by convention, all segment sizes should be the same with the exception of the last, which may be smaller. 4. Encryption Method Only chunk data is encrypted if 'has_password' filed of ISZ header is defined. There are three encryption method may be used: AES128, AES192 and AES256. Reference implementations for these algorithms are available from either commercial or open source distributors. Readily available cryptographic toolkits make implementation of the encryption features straight-forward. Encryption is always applied to a chunk after compression. The block oriented algorithms all operate in Cypher Block Chaining (CBC) mode. The block size used for AES encryption is 16. 5. Compression Method Chunk data may be compressed by ZLIB or BZIP2 method. ZLIB is a compression library written by Jean-loup Gailly (compression) and Mark Adler (decompression). BZIP2 is an open-source data compression algorithm developed by Julian Seward. Information and source code for these algorithm can be found on the internet. The length of compressed data is defined by CDT entries, and the length of uncompressed data is always less than 'block_size' field in ISZ header. 6. Usful Tips 1) Capacity of an ISZ file can be caculated by 'total_sectors' field ('sect_size' is always 2048 for ISO CD/DVD images) 2) SDT and CDT are the central information of an ISZ file. Sector data can be located this way: - Calculate chunk number by: chk_no = (sector_no * sect_size) / block_size - Search in CDT, get chunk length and offset - Search in SDT, get which segment file to read. For data of last chunk, you may need to read left byte from next segment file - Decrypt chunk data as needed - Uncompress chunk data as needed - Get sector data from chunk buffer 3) Sengment files may be located in differnet folder. A dialogue box for asking file location is needed for this situation. Segment file can be verified by 'seg_no' and 'vsn' field in ISZ header. 7. Change Process ------------------ In order for the .ISZ file format to remain a viable definition, this specification should be considered as open for periodic review and revision. Although this format was originally designed with a certain level of extensibility, not all changes in technology (present or future) were or will be necessarily considered in its design. If your application requires new definitions to this format, or if you would like to submit new data structures, please forward your request to isz@ezbsystems.com. All submissions will be reviewed for possible inclusion into future versions of this specification. Periodic revisions to this specification will be published to ensure interoperability. We encourage comments and feedback that may help improve clarity or content. 8. Incorporating ISZ format into Your Product ------------------------------------------------------------------ EZB Systems offers a free license for certain technological aspects described above under certain restrictions and conditions. A free SDK package is also available. Please contact EZB Systems at isz@ezbsystems.com with regard to acquiring a license.