Checking MD5 of whole session with -check_md5 and empty path list
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user