Jump to content

Recommended Posts

Posted

ISZ File Format Specification

Version: 1.00

Revised: July 3, 2006

Copyright © 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.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.