|
|
|
@ -698,6 +698,66 @@ int checksum_writer_create(Ecma119Image *target)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static |
|
|
|
|
int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
#ifdef Libisofs_with_checksumS |
|
|
|
|
|
|
|
|
|
void *ctx = NULL; |
|
|
|
|
off_t pos = 0, line_start; |
|
|
|
|
int record_len, block_len, res, i; |
|
|
|
|
char postext[20], md5[16], record[160]; |
|
|
|
|
|
|
|
|
|
line_start = strlen(tag_block); |
|
|
|
|
iso_md5_compute(t->checksum_ctx, tag_block, line_start); |
|
|
|
|
res = iso_md5_clone(t->checksum_ctx, &ctx); |
|
|
|
|
if (res < 0) |
|
|
|
|
goto ex; |
|
|
|
|
res = iso_md5_end(&ctx, md5); |
|
|
|
|
|
|
|
|
|
pos = (off_t) t->checksum_tag_pos * (off_t) 2048 + line_start; |
|
|
|
|
if(pos >= 1000000000) |
|
|
|
|
sprintf(postext, "%u%9.9u", (unsigned int) (pos / 1000000000), |
|
|
|
|
(unsigned int) (pos % 1000000000)); |
|
|
|
|
else |
|
|
|
|
sprintf(postext, "%u", (unsigned int) pos), |
|
|
|
|
|
|
|
|
|
sprintf(record, "%s %s ", t->scdbackup_tag_parm, postext); |
|
|
|
|
record_len = strlen(record); |
|
|
|
|
for (i = 0; i < 16; i++) |
|
|
|
|
sprintf(record + record_len + 2 * i, |
|
|
|
|
"%2.2x", ((unsigned char *) md5)[i]); |
|
|
|
|
record_len+= 32; |
|
|
|
|
res = iso_md5_start(&ctx); |
|
|
|
|
if (res < 0) |
|
|
|
|
goto ex; |
|
|
|
|
iso_md5_compute(ctx, record, record_len); |
|
|
|
|
iso_md5_end(&ctx, md5); |
|
|
|
|
|
|
|
|
|
sprintf(tag_block + line_start, "scdbackup_checksum_tag_v0.1 %s %d %s ", |
|
|
|
|
postext, record_len, record); |
|
|
|
|
block_len = strlen(tag_block); |
|
|
|
|
for (i = 0; i < 16; i++) |
|
|
|
|
sprintf(tag_block + block_len + 2 * i, |
|
|
|
|
"%2.2x", ((unsigned char *) md5)[i]); |
|
|
|
|
block_len+= 32; |
|
|
|
|
tag_block[block_len++]= '\n'; |
|
|
|
|
|
|
|
|
|
res = ISO_SUCCESS; |
|
|
|
|
ex:; |
|
|
|
|
if (ctx != NULL) |
|
|
|
|
iso_md5_end(&ctx, md5); |
|
|
|
|
return res; |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
|
|
return ISO_SUCCESS; |
|
|
|
|
|
|
|
|
|
#endif /* Libisofs_with_checksumS */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Write stream detectable checksum tag to extra block.
|
|
|
|
|
* @flag bit0-7= tag type |
|
|
|
|
* 1= session tag (End checksumming.) |
|
|
|
@ -719,11 +779,16 @@ int iso_md5_write_tag(Ecma119Image *t, int flag)
|
|
|
|
|
start = t->checksum_range_start; |
|
|
|
|
memset(tag_block, 0, 2048); |
|
|
|
|
mode = flag & 255; |
|
|
|
|
if (mode < 1 || mode > 4) |
|
|
|
|
return ISO_WRONG_ARG_VALUE; |
|
|
|
|
res = iso_md5_clone(t->checksum_ctx, &ctx); |
|
|
|
|
if (res < 0) |
|
|
|
|
return res; |
|
|
|
|
res = iso_md5_end(&ctx, md5); |
|
|
|
|
if (mode == 1) { |
|
|
|
|
res = iso_md5_end(&(t->checksum_ctx), md5); |
|
|
|
|
size = t->checksum_range_size; |
|
|
|
|
pos = t->checksum_tag_pos; |
|
|
|
|
} else if (mode >= 2 && mode <= 4) { |
|
|
|
|
} else { |
|
|
|
|
if (mode == 2) { |
|
|
|
|
pos = t->checksum_sb_tag_pos; |
|
|
|
|
} else if (mode == 3) { |
|
|
|
@ -733,46 +798,51 @@ int iso_md5_write_tag(Ecma119Image *t, int flag)
|
|
|
|
|
start = pos - (pos % 32); |
|
|
|
|
} |
|
|
|
|
size = pos - start; |
|
|
|
|
res = iso_md5_clone(t->checksum_ctx, &ctx); |
|
|
|
|
if (res < 0) |
|
|
|
|
return res; |
|
|
|
|
res = iso_md5_end(&ctx, md5); |
|
|
|
|
} else { |
|
|
|
|
return ISO_WRONG_ARG_VALUE; |
|
|
|
|
} |
|
|
|
|
if (res > 0) { |
|
|
|
|
iso_util_tag_magic(mode, &tag_id, &tag_id_len, 0); |
|
|
|
|
sprintf(tag_block, |
|
|
|
|
"%s pos=%u range_start=%u range_size=%u", |
|
|
|
|
tag_id, pos, start, size); |
|
|
|
|
if (res < 0) |
|
|
|
|
goto ex; |
|
|
|
|
|
|
|
|
|
l = strlen(tag_block); |
|
|
|
|
if (mode == 2) { |
|
|
|
|
sprintf(tag_block + l, " next=%u", t->checksum_tree_tag_pos); |
|
|
|
|
} else if (mode == 3) { |
|
|
|
|
sprintf(tag_block + l, " next=%u", t->checksum_tag_pos); |
|
|
|
|
} else if (mode == 4) { |
|
|
|
|
sprintf(tag_block + l, " session_start=%u", t->ms_block); |
|
|
|
|
} |
|
|
|
|
strcat(tag_block + l, " md5="); |
|
|
|
|
l = strlen(tag_block); |
|
|
|
|
iso_util_tag_magic(mode, &tag_id, &tag_id_len, 0); |
|
|
|
|
sprintf(tag_block, "%s pos=%u range_start=%u range_size=%u", |
|
|
|
|
tag_id, pos, start, size); |
|
|
|
|
|
|
|
|
|
l = strlen(tag_block); |
|
|
|
|
if (mode == 2) { |
|
|
|
|
sprintf(tag_block + l, " next=%u", t->checksum_tree_tag_pos); |
|
|
|
|
} else if (mode == 3) { |
|
|
|
|
sprintf(tag_block + l, " next=%u", t->checksum_tag_pos); |
|
|
|
|
} else if (mode == 4) { |
|
|
|
|
sprintf(tag_block + l, " session_start=%u", t->ms_block); |
|
|
|
|
} |
|
|
|
|
strcat(tag_block + l, " md5="); |
|
|
|
|
l = strlen(tag_block); |
|
|
|
|
for (i = 0; i < 16; i++) |
|
|
|
|
sprintf(tag_block + l + 2 * i, "%2.2x", |
|
|
|
|
((unsigned char *) md5)[i]); |
|
|
|
|
l+= 32; |
|
|
|
|
|
|
|
|
|
res = iso_md5_start(&ctx); |
|
|
|
|
if (res > 0) { |
|
|
|
|
iso_md5_compute(ctx, tag_block, l); |
|
|
|
|
iso_md5_end(&ctx, md5); |
|
|
|
|
strcpy(tag_block + l, " self="); |
|
|
|
|
l += 6; |
|
|
|
|
for (i = 0; i < 16; i++) |
|
|
|
|
sprintf(tag_block + l + 2 * i, "%2.2x", |
|
|
|
|
((unsigned char *) md5)[i]); |
|
|
|
|
l+= 32; |
|
|
|
|
|
|
|
|
|
res = iso_md5_start(&ctx); |
|
|
|
|
if (res > 0) { |
|
|
|
|
iso_md5_compute(ctx, tag_block, l); |
|
|
|
|
iso_md5_end(&ctx, md5); |
|
|
|
|
strcpy(tag_block + l, " self="); |
|
|
|
|
l += 6; |
|
|
|
|
for (i = 0; i < 16; i++) |
|
|
|
|
sprintf(tag_block + l + 2 * i, "%2.2x", |
|
|
|
|
((unsigned char *) md5)[i]); |
|
|
|
|
} |
|
|
|
|
tag_block[l + 32] = '\n'; |
|
|
|
|
|
|
|
|
|
if (mode == 1 && t->scdbackup_tag_parm[0]) { |
|
|
|
|
if (t->ms_block > 0) { |
|
|
|
|
iso_msg_submit(t->image->id, ISO_SCDBACKUP_TAG_NOT_0, 0, NULL); |
|
|
|
|
} else { |
|
|
|
|
res = iso_md5_write_scdbackup_tag(t, tag_block, 0); |
|
|
|
|
if (res < 0) |
|
|
|
|
goto ex; |
|
|
|
|
} |
|
|
|
|
tag_block[l + 32] = '\n'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (mode == 4) { |
|
|
|
|
if (t->opts_overwrite != NULL) |
|
|
|
|
memcpy(t->opts_overwrite + pos * 2048, tag_block, 2048); |
|
|
|
@ -783,6 +853,7 @@ int iso_md5_write_tag(Ecma119Image *t, int flag)
|
|
|
|
|
goto ex; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
res = ISO_SUCCESS; |
|
|
|
|
ex:; |
|
|
|
|
if (ctx != NULL) |
|
|
|
|