12 #include "../config.h"
18 #ifdef HAVE_INTTYPES_H
39 #define Libisofs_md5_S11 7
40 #define Libisofs_md5_S12 12
41 #define Libisofs_md5_S13 17
42 #define Libisofs_md5_S14 22
43 #define Libisofs_md5_S21 5
44 #define Libisofs_md5_S22 9
45 #define Libisofs_md5_S23 14
46 #define Libisofs_md5_S24 20
47 #define Libisofs_md5_S31 4
48 #define Libisofs_md5_S32 11
49 #define Libisofs_md5_S33 16
50 #define Libisofs_md5_S34 23
51 #define Libisofs_md5_S41 6
52 #define Libisofs_md5_S42 10
53 #define Libisofs_md5_S43 15
54 #define Libisofs_md5_S44 21
59 #define Libisofs_md5_F(x, y, z) (((x) & (y)) | ((~x) & (z)))
60 #define Libisofs_md5_G(x, y, z) (((x) & (z)) | ((y) & (~z)))
61 #define Libisofs_md5_H(x, y, z) ((x) ^ (y) ^ (z))
62 #define Libisofs_md5_I(x, y, z) ((y) ^ ((x) | (~z)))
66 #define Libisofs_md5_ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
71 #define Libisofs_md5_FF(a, b, c, d, x, s, ac) { \
72 (a) += Libisofs_md5_F ((b), (c), (d)) + (x) + (uint32_t)(ac); \
73 (a) = Libisofs_md5_ROTATE_LEFT ((a), (s)); \
76 #define Libisofs_md5_GG(a, b, c, d, x, s, ac) { \
77 (a) += Libisofs_md5_G ((b), (c), (d)) + (x) + (uint32_t)(ac); \
78 (a) = Libisofs_md5_ROTATE_LEFT ((a), (s)); \
81 #define Libisofs_md5_HH(a, b, c, d, x, s, ac) { \
82 (a) += Libisofs_md5_H ((b), (c), (d)) + (x) + (uint32_t)(ac); \
83 (a) = Libisofs_md5_ROTATE_LEFT ((a), (s)); \
86 #define Libisofs_md5_II(a, b, c, d, x, s, ac) { \
87 (a) += Libisofs_md5_I ((b), (c), (d)) + (x) + (uint32_t)(ac); \
88 (a) = Libisofs_md5_ROTATE_LEFT ((a), (s)); \
110 for (i = 0, j = 0; j < 64; i++, j += 4)
111 x[i] = ((uint32_t)block[j]) | (((uint32_t)block[j+1]) << 8) |
112 (((uint32_t)block[j+2]) << 16) | (((uint32_t)block[j+3]) << 24);
192 memset ((
char *) x, 0,
sizeof (x));
202 for (i = 0, j = 0; j < len; i++, j += 4) {
203 output[j] = (
unsigned char)(input[i] & 0xff);
204 output[j+1] = (
unsigned char)((input[i] >> 8) & 0xff);
205 output[j+2] = (
unsigned char)((input[i] >> 16) & 0xff);
206 output[j+3] = (
unsigned char)((input[i] >> 24) & 0xff);
217 ctx->
state[0] = 0x67452301;
218 ctx->
state[1] = 0xefcdab89;
219 ctx->
state[2] = 0x98badcfe;
220 ctx->
state[3] = 0x10325476;
230 int datalen,
int flag)
232 int i, index, partlen;
235 index = ((ctx->
count[0] >> 3) & 0x3F);
237 if ((ctx->
count[0] += ((uint32_t) datalen << 3)) <
238 ((uint32_t) datalen << 3))
240 ctx->
count[1] += ((uint32_t) datalen >> 29);
241 partlen = 64 - index;
244 if (datalen >= partlen) {
245 memcpy((
char *) &ctx->
buffer[index], (
char *) data, partlen);
247 for (i = partlen; i + 63 < datalen; i += 64)
254 memcpy((
char *) &ctx->
buffer[index], (
char *) &data[i],datalen-i);
262 unsigned char bits[8], *respt;
263 unsigned int index, padlen;
264 static unsigned char PADDING[64] = {
265 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
266 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
267 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
273 index = (
unsigned int)((ctx->
count[0] >> 3) & 0x3f);
274 padlen = (index < 56) ? (56 - index) : (120 - index);
279 respt= (
unsigned char *) result;
282 memset ((
char *) ctx, 0,
sizeof (*ctx));
309 char result[16],
int flag)
318 unsigned char *datapt;
335 datapt= (
unsigned char *) data;
369 ret =
libisofs_md5(&md5_context, data, datalen, NULL, 0);
381 ret =
libisofs_md5(new_md5_context, old_md5_context, 0, NULL, 1 | 4);
395 ret =
libisofs_md5(md5_context, NULL, 0, result, 2 | (1 << 15));
407 for (i= 0; i < 16; i++)
408 if (first_md5[i] != second_md5[i])
436 if (old_data == NULL)
439 *new_data = old_data;
464 if (old_data == NULL)
466 *new_data = calloc(1, 16);
467 if (*new_data == NULL)
469 memcpy(*new_data, old_data, 16);
490 unsigned int idx = 0, old_idx = 0;
491 char *value = NULL, *md5_pt = NULL;
504 if (md5_pt == NULL) {
509 md5_pt = (
char *) xipt;
519 for (i = 0; i < 4; i++)
520 old_idx = (old_idx << 8) | ((
unsigned char *) &xipt)[i];
533 if (ret == 1 && value_length == 4) {
534 for (i = 0; i < 4; i++)
535 idx = (idx << 8) | ((
unsigned char *) value)[i];
536 if (idx > 0 && idx <= target->checksum_idx_counter) {
551 for (pos = ((
IsoDir *) node)->children; pos != NULL; pos = pos->
next) {
568 if (writer == NULL) {
630 if (writer == NULL) {
663 for (i = 0; i < size; i++) {
701 if (writer == NULL) {
727 off_t pos = 0, line_start;
728 int record_len, block_len, ret, i;
729 char postext[40], md5[16], *record = NULL;
732 line_start = strlen(tag_block);
740 if(pos >= 1000000000)
741 sprintf(postext,
"%u%9.9u", (
unsigned int) (pos / 1000000000),
742 (
unsigned int) (pos % 1000000000));
744 sprintf(postext,
"%u", (
unsigned int) pos);
746 record_len = strlen(record);
747 for (i = 0; i < 16; i++)
748 sprintf(record + record_len + 2 * i,
749 "%2.2x", ((
unsigned char *) md5)[i]);
758 sprintf(tag_block + line_start,
"scdbackup_checksum_tag_v0.1 %s %d %s ",
759 postext, record_len, record);
760 block_len = strlen(tag_block);
761 for (i = 0; i < 16; i++)
762 sprintf(tag_block + block_len + 2 * i,
763 "%2.2x", ((
unsigned char *) md5)[i]);
765 tag_block[block_len++]=
'\n';
769 block_len - line_start);
789 int ret, mode, l, i, wres, tag_id_len;
791 char md5[16], *tag_block = NULL, *tag_id;
792 uint32_t size = 0, pos = 0, start;
797 if (mode < 1 || mode > 4)
809 }
else if (mode == 3) {
811 }
else if (mode == 4) {
813 start = pos - (pos % 32);
821 sprintf(tag_block,
"%s pos=%u range_start=%u range_size=%u",
822 tag_id, pos, start, size);
824 l = strlen(tag_block);
827 }
else if (mode == 3) {
829 }
else if (mode == 4) {
830 sprintf(tag_block + l,
" session_start=%u", t->
opts->
ms_block);
832 strcat(tag_block + l,
" md5=");
833 l = strlen(tag_block);
834 for (i = 0; i < 16; i++)
835 sprintf(tag_block + l + 2 * i,
"%2.2x",
836 ((
unsigned char *) md5)[i]);
843 strcpy(tag_block + l,
" self=");
845 for (i = 0; i < 16; i++)
846 sprintf(tag_block + l + 2 * i,
"%2.2x",
847 ((
unsigned char *) md5)[i]);
849 tag_block[l + 32] =
'\n';
int iso_write(Ecma119Image *target, void *buf, size_t count)
static int checksum_writer_compute_data_blocks(IsoImageWriter *writer)
int iso_md5_clone(void *old_md5_context, void **new_md5_context)
int iso_md5_end(void **md5_context, char result[16])
static int md5__transform(uint32_t state[4], unsigned char block[64])
static int checksum_writer_free_data(IsoImageWriter *writer)
int iso_md5_write_tag(Ecma119Image *t, int flag)
int checksum_md5_xinfo_cloner(void *old_data, void **new_data, int flag)
static int md5__encode(unsigned char *output, uint32_t *input, unsigned int len)
int checksum_writer_create(Ecma119Image *target)
int checksum_cx_xinfo_func(void *data, int flag)
#define Libisofs_md5_II(a, b, c, d, x, s, ac)
int checksum_cx_xinfo_cloner(void *old_data, void **new_data, int flag)
int checksum_md5_xinfo_func(void *data, int flag)
static int libisofs_md5(void **ctx_in, char *data, int datalen, char result[16], int flag)
static int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag)
static int checksum_copy_old_nodes(Ecma119Image *target, IsoNode *node, int flag)
static int md5_init(libisofs_md5_ctx *ctx, int flag)
int iso_md5_match(char first_md5[16], char second_md5[16])
#define Libisofs_md5_HH(a, b, c, d, x, s, ac)
static int md5_update(libisofs_md5_ctx *ctx, unsigned char *data, int datalen, int flag)
static int checksum_writer_write_vol_desc(IsoImageWriter *writer)
int iso_md5_start(void **md5_context)
#define Libisofs_md5_GG(a, b, c, d, x, s, ac)
int iso_md5_compute(void *md5_context, char *data, int datalen)
#define Libisofs_md5_FF(a, b, c, d, x, s, ac)
static int checksum_writer_write_data(IsoImageWriter *writer)
static int md5_final(libisofs_md5_ctx *ctx, char result[16], int flag)
int iso_util_tag_magic(int tag_type, char **tag_magic, int *len, int flag)
#define LIBISO_FREE_MEM(pt)
#define LIBISO_ALLOC_MEM(pt, typ, count)
int iso_node_lookup_attr(IsoNode *node, char *name, size_t *value_length, char **value, int flag)
int iso_node_remove_xinfo(IsoNode *node, iso_node_xinfo_func proc)
int iso_node_get_xinfo(IsoNode *node, iso_node_xinfo_func proc, void **data)
#define ISO_SCDBACKUP_TAG_NOT_0
#define ISO_XINFO_NO_CLONE
#define ISO_WRONG_ARG_VALUE
#define ISO_ASSERT_FAILURE
int iso_msg_submit(int imgid, int errcode, int causedby, const char *fmt,...)
void iso_msg_debug(int imgid, const char *fmt,...)
int iso_root_set_isofsca(IsoNode *node, uint32_t start_lba, uint32_t end_lba, uint32_t count, uint32_t size, char *typetext, int flag)
unsigned int from_old_session
int(* write_data)(IsoImageWriter *writer)
int(* compute_data_blocks)(IsoImageWriter *writer)
int(* write_vol_desc)(IsoImageWriter *writer)
int(* free_data)(IsoImageWriter *writer)
uint32_t checksum_idx_count
uint32_t checksum_tag_pos
uint32_t checksum_tree_tag_pos
uint32_t checksum_rlsb_tag_pos
uint32_t checksum_range_start
uint32_t checksum_sb_tag_pos
IsoImageWriter ** writers
unsigned int checksum_idx_counter
uint32_t checksum_array_pos
uint32_t checksum_range_size
unsigned int md5_session_checksum
char * scdbackup_tag_written
char scdbackup_tag_parm[100]