Further enhancements of new API call iso_util_decode_md5_tag().

release-1.5.4.branch
Thomas Schmitt 13 years ago
parent 955471a064
commit 07a67a59e7
  1. 55
      doc/checksums.txt
  2. 11
      libisofs/libisofs.h
  3. 10
      libisofs/util.c

@ -132,42 +132,51 @@ are strings of 32 hex digits:
Usage at Read Time
Checking a Whole Session
In order to check the trustworthyness of a whole session, read from its start
up to the session tag. Read the blocks and submit each single one of them to
iso_util_decode_md5_tag(block, &pos, &range_start, &range_size, md5, 1);
If this returns 1, then check whether the returned parameters pos, range_start,
and range_size match the state of block reading, and whether the returned
bytes in parameter md5 match the MD5 computed from the data blocks which were
read before the tag block.
Checking before Image Tree Loading
Checking Before Image Tree Loading
In order to check for a trustworthy loadable image tree, read the first 32
blocks to the session start and look in block 16 to 32 for the superblock
blocks from to the session start and look in block 16 to 32 for the superblock
checksum tag by
iso_util_decode_md5_tag(block, &pos, &range_start, &range_size, md5, 2);
If one appears and has plausible parameters, then check whether its MD5 matches
the MD5 of the data blocks read before.
iso_util_decode_md5_tag(block, &tag_type, &pos,
&range_start, &range_size, &next_tag, md5, 2);
If it appears and has plausible parameters, then check whether its MD5 matches
the MD5 of the data blocks which were read before.
(Keep the original MD5 context of the data blocks and clone one for obtaining
the MD5 bytes.)
Compute the block into the MD5 checksum after your are done with interpreting
it.
If those MD5s match, then compute the checksum block into the kept MD5 context
and go on with searching for the tree checksum tag. This can be found in a
read-in block by:
iso_util_decode_md5_tag(block, &pos, &range_start, &range_size, md5, 3)
and go on with reading and computing for the tree checksum tag. This will be
found at block address next_tag, verified and parsed by:
iso_util_decode_md5_tag(block, &tag_type, &pos,
&range_start, &range_size, &next_tag, md5, 3);
Again, if the parameters match the reading state, the MD5 must match the
MD5 computed from the data blocks before.
MD5 computed from the data blocks which were before.
If so, then the tree is ok and safe to be loaded by iso_image_import().
Checking a Whole Session
In order to check the trustworthyness of a whole session, continue reading
and checksumming after the tree was verified.
Read and checksum the blocks. When reaching block address next_tag (from the
tree tag) submit this block to
iso_util_decode_md5_tag(block, &tag_type, &pos,
&range_start, &range_size, &next_tag, md5, 1);
If this returns 1, then check whether the returned parameters pos, range_start,
and range_size match the state of block reading, and whether the returned
bytes in parameter md5 match the MD5 computed from the data blocks which were
read before the tag block.
Checking Single Files in a Loaded Image
The image has to be loaded, so you can obtain IsoNode objects which yield
Once the image has been loaded, you can obtain MD5 sums from IsoNode objects
which fulfill
iso_node_get_type(node) == LIBISO_FILE
The recorded checksum can be obtained by

@ -5052,6 +5052,11 @@ int iso_file_get_md5(IsoImage *image, IsoFile *file, char md5[16], int flag);
* start and look out for a session tag on the fly. See doc/checksum.txt .
* @param data
* A complete and aligned data block read from an ISO image session.
* @param tag_type
* 0= no tag
* 1= session tag
* 2= superblock tag
* 3= tree tag
* @param pos
* Returns the LBA where the tag supposes itself to be stored.
* If this does not match the data block LBA then the tag might be
@ -5078,16 +5083,14 @@ int iso_file_get_md5(IsoImage *image, IsoFile *file, char md5[16], int flag);
* 3= tree tag
* @return
* 0= not a checksum tag, return parameters are invalid
* 1= session tag found
* 2= superblock tag found
* 3= tree tag found
* 1= checksum tag found, return parameters arevalid
* <0= error
* return parameters are valid with error ISO_MD5_AREA_CORRUPTED
* but not trustworthy because the tag seems corrupted.
*
* @since 0.6.22
*/
int iso_util_decode_md5_tag(char data[2048], uint32_t *pos,
int iso_util_decode_md5_tag(char data[2048], int *tag_type, uint32_t *pos,
uint32_t *range_start, uint32_t *range_size,
uint32_t *next_tag, char md5[16], int flag);

@ -1563,7 +1563,7 @@ int iso_util_hex_to_bin(char *hex, char *bin, int bin_size, int *bin_count,
}
int iso_util_decode_md5_tag(char data[2048], uint32_t *pos,
int iso_util_decode_md5_tag(char data[2048], int *tag_type, uint32_t *pos,
uint32_t *range_start, uint32_t *range_size,
uint32_t *next_tag, char md5[16], int flag)
{
@ -1587,8 +1587,8 @@ int iso_util_decode_md5_tag(char data[2048], uint32_t *pos,
break;
if (i > magic_last )
return 0;
found = i;
cpt = data + magic_len[found] + 1;
*tag_type = i;
cpt = data + magic_len[*tag_type] + 1;
if (strncmp(cpt, "pos=", 4) != 0)
return 0;
cpt+= 4;
@ -1607,7 +1607,7 @@ int iso_util_decode_md5_tag(char data[2048], uint32_t *pos,
ret = iso_util_dec_to_uint32(cpt + 11, range_size, 0);
if (ret <= 0)
return 0;
if (found == 2 || found == 3) {
if (*tag_type == 2 || *tag_type == 3) {
cpt = strstr(cpt, "next=");
if (cpt == NULL)
return(0);
@ -1639,6 +1639,6 @@ int iso_util_decode_md5_tag(char data[2048], uint32_t *pos,
return ISO_MD5_AREA_CORRUPTED;
if (*(cpt + 5 + 32) != '\n')
return 0;
return(found);
return(1);
}

Loading…
Cancel
Save