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.

