diff options
Diffstat (limited to 'isomd5sum')
-rw-r--r-- | isomd5sum/checkisomd5.c | 81 | ||||
-rw-r--r-- | isomd5sum/implantisomd5.c | 35 |
2 files changed, 93 insertions, 23 deletions
diff --git a/isomd5sum/checkisomd5.c b/isomd5sum/checkisomd5.c index dfaba9d42..539fcfd89 100644 --- a/isomd5sum/checkisomd5.c +++ b/isomd5sum/checkisomd5.c @@ -18,13 +18,14 @@ #define MAX(x, y) ((x > y) ? x : y) #define MIN(x, y) ((x < y) ? x : y) -/* number of sectors to ignore at end of iso when computing sum */ -#define SKIPSECTORS 15 - /* finds primary volume descriptor and returns info from it */ /* mediasum must be a preallocated buffer at least 33 bytes long */ -int parsepvd(int isofd, char *mediasum, long long *isosize) { +int parsepvd(int isofd, char *mediasum, int *skipsectors, long long *isosize) { unsigned char buf[2048]; + unsigned char buf2[512]; + unsigned char tmpbuf[512]; + int skipfnd, md5fnd; + unsigned int loc; long long offset; unsigned char *p; @@ -44,15 +45,55 @@ int parsepvd(int isofd, char *mediasum, long long *isosize) { } /* read out md5sum */ - memcpy(mediasum, buf + APPDATA_OFFSET + 13, 32); - mediasum[32] = '\0'; - - for (p=mediasum; *p; p++) - if (*p != ' ') - break; + memcpy(buf2, buf + APPDATA_OFFSET, 512); + buf2[511] = '\0'; + + md5fnd = 0; + skipfnd = 0; + loc = 0; + while (loc < 512) { + if (!strncmp(buf2 + loc, "ISO MD5SUM = ", 13)) { + + /* make sure we dont walk off end */ + if ((loc + 32) > 511) + return -1; + + memcpy(mediasum, buf2 + loc + 13, 32); + mediasum[32] = '\0'; + md5fnd = 1; + loc += 45; + for (p=buf2+loc; *p != ';' && loc < 512; p++, loc++); + } else if (!strncmp(buf2 + loc, "SKIPSECTORS = ", 14)) { + char *errptr; + + /* make sure we dont walk off end */ + if ((loc + 14) > 511) + return -1; + + loc = loc + 14; + for (p=tmpbuf; buf2[loc] != ';' && loc < 512; p++, loc++) + *p = buf2[loc]; + + *p = '\0'; + + *skipsectors = strtol(tmpbuf, &errptr, 10); + if (errptr && *errptr) { + return -1; + } else { + skipfnd = 1; + } + + for (p=buf2+loc; *p != ';' && loc < 512; p++, loc++); + } else { + loc += 1; + } - /* if the md5sum was all spaces, we didn't find md5sum */ - if (!*p) + if (skipfnd & md5fnd) + break; + } + + + if (!(skipfnd & md5fnd)) return -1; /* get isosize */ @@ -70,6 +111,7 @@ int checkmd5sum(int isofd, char *mediasum, char *computedsum) { int i; int appdata_start_offset, appdata_end_offset; int nattempt; + int skipsectors; unsigned int bufsize = 32768; unsigned char md5sum[16]; unsigned int len; @@ -77,7 +119,7 @@ int checkmd5sum(int isofd, char *mediasum, char *computedsum) { long long isosize, offset, pvd_offset, apoff; MD5_CTX md5ctx; - if ((pvd_offset = parsepvd(isofd, mediasum, &isosize)) < 0) + if ((pvd_offset = parsepvd(isofd, mediasum, &skipsectors, &isosize)) < 0) return -1; /* printf("Mediasum = %s\n",mediasum); */ @@ -91,10 +133,10 @@ int checkmd5sum(int isofd, char *mediasum, char *computedsum) { apoff = pvd_offset + APPDATA_OFFSET; buf = malloc(bufsize * sizeof(unsigned char)); - printf("Percent complete: %05.1f%%", (100.0*offset)/(isosize-SKIPSECTORS*2048.0)); + printf("Percent complete: %05.1f%%", (100.0*offset)/(isosize-skipsectors*2048.0)); fflush(stdout); - while (offset < isosize - SKIPSECTORS*2048) { - nattempt = MIN(isosize - SKIPSECTORS*2048 - offset, bufsize); + while (offset < isosize - skipsectors*2048) { + nattempt = MIN(isosize - skipsectors*2048 - offset, bufsize); /* printf("%lld %lld %lld %d\n", offset, isosize, isosize-SKIPSECTORS*2048, nattempt); */ @@ -124,11 +166,11 @@ int checkmd5sum(int isofd, char *mediasum, char *computedsum) { MD5_Update(&md5ctx, buf, nread); offset = offset + nread; - printf("\b\b\b\b\b\b%05.1f%%", (100.0*offset)/(isosize-SKIPSECTORS*2048.0)); + printf("\b\b\b\b\b\b%05.1f%%", (100.0*offset)/(isosize-skipsectors*2048.0)); fflush(stdout); } - printf("\b\b\b\b\b\b\n\n", (100.0*offset)/(isosize-SKIPSECTORS*2048.0)); + printf("\b\b\b\b\b\b\n\n", (100.0*offset)/(isosize-skipsectors*2048.0)); sleep(1); @@ -172,8 +214,9 @@ static void readCB(void *co, long long pos) { int doMediaCheck(int isofd, char *mediasum, char *computedsum, long long *isosize) { int rc; int llen; + int skipsectors; - if (parsepvd(isofd, mediasum, isosize) < 0) { + if (parsepvd(isofd, mediasum, &skipsectors, isosize) < 0) { fprintf(stderr, "Unable to read the disc checksum from the " "primary volume descriptor. This probably " "means the disc was created without adding the " diff --git a/isomd5sum/implantisomd5.c b/isomd5sum/implantisomd5.c index 5e30a4331..e2f55b497 100644 --- a/isomd5sum/implantisomd5.c +++ b/isomd5sum/implantisomd5.c @@ -64,6 +64,17 @@ int parsepvd(int isofd, char *mediasum, long long *isosize) { } +unsigned int writeAppData(unsigned char *appdata, char *valstr, unsigned int loc) { + if (loc + strlen(valstr) > 511) { + printf("Attempted to write too much appdata, exiting...\n"); + exit(-1); + } + + memcpy(appdata + loc, valstr, strlen(valstr)); + + return loc+strlen(valstr); +} + int main(int argc, char **argv) { int isofd; @@ -75,6 +86,7 @@ int main(int argc, char **argv) { long long isosize; unsigned char md5sum[16]; unsigned int total; + unsigned int loc; unsigned char *fname; unsigned char buf[2048]; unsigned char orig_appdata[512]; @@ -122,9 +134,18 @@ int main(int argc, char **argv) { fprintf(stderr, "Application data has been used - not implanting md5sum!\n"); exit(1); } + } else { + /* write out blanks to erase old app data */ + lseek(isofd, pvd_offset + APPDATA_OFFSET, SEEK_SET); + memset(new_appdata, ' ', 512); + i = write(isofd, new_appdata, 512); + if (i<0) { + printf("write failed %d\n", i); + perror(""); + } } - + /* now do md5sum */ lseek(isofd, 0L, SEEK_SET); MD5_Init(&md5ctx); @@ -154,10 +175,16 @@ int main(int argc, char **argv) { printf("md5 = %s\n", md5str); /* memcpy(new_appdata, orig_appdata, 512); */ memset(new_appdata, ' ', 512); - memcpy(new_appdata, "ISO MD5SUM = ", 13); - memcpy(new_appdata+13, md5str, 33); - memcpy(new_appdata+47, "THIS IS NOT THE SAME AS RUNNING MD5SUM ON THIS ISO!!", 51); + loc = 0; + loc = writeAppData(new_appdata, "ISO MD5SUM = ", loc); + loc = writeAppData(new_appdata, md5str, loc); + loc = writeAppData(new_appdata, ";", loc); + snprintf(buf, sizeof(buf), "SKIPSECTORS = %d", SKIPSECTORS); + loc = writeAppData(new_appdata, buf, loc); + loc = writeAppData(new_appdata, ";", loc); + loc = writeAppData(new_appdata, "THIS IS NOT THE SAME AS RUNNING MD5SUM ON THIS ISO!!", loc); + i = lseek(isofd, pvd_offset + APPDATA_OFFSET, SEEK_SET); if (i<0) printf("seek failed\n"); |