Checking MD5 of whole session with -check_md5 and empty path list

This commit is contained in:
2009-08-12 20:23:31 +00:00
parent 16d84807da
commit d152de91f4
6 changed files with 121 additions and 16 deletions

View File

@ -8283,7 +8283,7 @@ int Xorriso_findi_sorted(struct XorrisO *xorriso, struct FindjoB *job,
ret= 1;
ex:;
if((flag & 8) && job->action == 35)
Xorriso_report_m5_outcome(xorriso, job->target, 0);
Xorriso_report_md5_outcome(xorriso, job->target, 0);
if(!(flag & (2 | 4)))
Xorriso_destroy_node_array(xorriso, 0);
if(hmboss != NULL)
@ -12208,3 +12208,97 @@ ex:;
iso_md5_end(&ctx, data_md5);
return(ret);
}
int Xorriso_check_md5_range(struct XorrisO *xorriso, off_t start_lba,
off_t end_lba, char md5[16], int flag)
{
int ret, i;
struct burn_drive_info *dinfo= NULL;
struct burn_drive *drive= NULL;
off_t pos, data_count, to_read;
char data[64 * 1024], data_md5[16];
void *ctx = NULL;
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
"on attempt to check session MD5 checksum", 0);
if(ret <= 0)
goto ex;
ret= iso_md5_start(&ctx);
if(ret <= 0) {
Xorriso_no_malloc_memory(xorriso, NULL, 0);
goto ex;
}
for(pos= start_lba; pos < end_lba; pos+= 32) {
to_read= 32;
if(pos + to_read > end_lba)
to_read= end_lba - pos;
ret= burn_read_data(drive, pos * (off_t) 2048, data,
to_read * (off_t) 2048, &data_count, 0);
if(ret <= 0)
goto ex;
iso_md5_compute(ctx, data, (int) data_count);
xorriso->pacifier_count+= data_count;
xorriso->pacifier_byte_count+= data_count;
Xorriso_pacifier_callback(xorriso, "content bytes read",
xorriso->pacifier_count, 0, "", 0);
}
iso_md5_end(&ctx, data_md5);
for(i= 0; i < 16; i++)
if(md5[i] != data_md5[i])
break;
ret= 1;
if(i < 16 )
ret= 0;
ex:;
Xorriso_process_msg_queues(xorriso,0);
if(ctx != NULL)
iso_md5_end(&ctx, data_md5);
return(ret);
}
int Xorriso_check_session_md5(struct XorrisO *xorriso, char *severity,
int flag)
{
int ret, i;
IsoImage *image;
uint32_t start_lba, end_lba;
char md5[16], md5_text[33];
ret= Xorriso_get_volume(xorriso, &image, 0);
if(ret<=0)
return(ret);
ret= iso_image_get_session_md5(image, &start_lba, &end_lba, md5, 0);
Xorriso_process_msg_queues(xorriso,0);
if(ret < 0)
return(ret);
if(ret == 0) {
sprintf(xorriso->info_text,
"No session MD5 is recorded with the loaded session");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
return(0);
}
for(i= 0; i < 16; i++)
sprintf(md5_text + 2 * i, "%2.2x", ((unsigned char *) md5)[i]);
sprintf(xorriso->info_text,
"Session MD5 %s , LBA %.f , %.f blocks\n",
md5_text, (double) start_lba, (double) end_lba - start_lba);
Xorriso_info(xorriso, 0);
ret= Xorriso_check_md5_range(xorriso, (off_t) start_lba, (off_t) end_lba,
md5, 0);
if(ret <= 0) {
sprintf(xorriso->result_line, "MD5 MISMATCH WITH DATA OF LOADED SESSION\n");
Xorriso_result(xorriso,0);
if(strcmp(severity, "ALL") != 0) {
sprintf(xorriso->info_text, "Event triggered by MD5 comparison mismatch");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, severity, 0);
}
} else {
sprintf(xorriso->result_line, "md5 of session data matches recorded md5\n");
Xorriso_result(xorriso,0);
}
return(ret);
}