Browse Source

Stefan Paletta:


			
			
				rocklinux
			
			
		
Stefan Paletta 22 years ago
parent
commit
bf4dff45d6
13 changed files with 1031 additions and 14 deletions
  1. +19
    -0
      misc/isomd5sum/Makefile
  2. +52
    -0
      misc/isomd5sum/checkisomd5.c
  3. +61
    -0
      misc/isomd5sum/implantisomd5.c
  4. +316
    -0
      misc/isomd5sum/libcheckisomd5.c
  5. +7
    -0
      misc/isomd5sum/libcheckisomd5.h
  6. +205
    -0
      misc/isomd5sum/libimplantisomd5.c
  7. +5
    -0
      misc/isomd5sum/libimplantisomd5.h
  8. +267
    -0
      misc/isomd5sum/md5.c
  9. +30
    -0
      misc/isomd5sum/md5.h
  10. +2
    -0
      scripts/Cleanup
  11. +15
    -4
      scripts/Create-ISO
  12. +6
    -2
      target/bootdisk/build_stage1.sh
  13. +46
    -8
      target/bootdisk/linuxrc.c

+ 19
- 0
misc/isomd5sum/Makefile

@ -0,0 +1,19 @@
CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -O -Wall -Werror
OBJECTS = md5.o implantisomd5.o libcheckisomd5.o implantisomd5.o checkisomd5.o
SOURCES = $(patsubst %.o,%.c,$(OBJECTS))
LDFLAGS = -lpopt
all: implantisomd5 checkisomd5
%.o: %.c
gcc -c -O $(CFLAGS) -o $@ $<
implantisomd5: implantisomd5.o md5.o libimplantisomd5.o
checkisomd5: checkisomd5.o md5.o libcheckisomd5.o
clean:
rm -f *.o *.lo *~
rm -f implantisomd5 checkisomd5

+ 52
- 0
misc/isomd5sum/checkisomd5.c

@ -0,0 +1,52 @@
/* simple program to check implanted md5sum in an iso 9660 image */
/* Copyright 2001 Red Hat, Inc. */
/* Michael Fulbright msf@redhat.com */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "md5.h"
#include "libcheckisomd5.h"
int main(int argc, char **argv) {
int i;
int rc;
int verbose;
int md5only;
int filearg;
if (argc < 2) {
printf("Usage: checkisomd5 [--md5sumonly] [--verbose] <isofilename>|<blockdevice>\n\n");
exit(1);
}
md5only = 0;
verbose = 0;
filearg = 1;
for (i=1; i < argc; i++) {
if (strcmp(argv[i], "--md5sumonly") == 0) {
md5only = 1;
filearg++;
} else if (strcmp(argv[i], "--verbose") == 0) {
filearg++;
verbose = 1;
} else
break;
}
if (md5only|verbose)
printMD5SUM(argv[filearg]);
if (md5only)
exit(0);
rc = mediaCheckFile(argv[filearg], !verbose);
/* 1 means it passed, 0 means it failed, -1 means we couldnt find chksum */
if (rc == 1)
exit(0);
else
exit(1);
}

+ 61
- 0
misc/isomd5sum/implantisomd5.c

@ -0,0 +1,61 @@
/* simple program to insert a md5sum into application data area of */
/* an iso9660 image */
/* Copyright 2001 Red Hat, Inc. */
/* Michael Fulbright msf@redhat.com */
#include <stdio.h>
#include <stdlib.h>
#include <popt.h>
#include "md5.h"
#include "libimplantisomd5.h"
static void usage(void) {
fprintf(stderr, "implantisomd5: implantisomd5 [--force] [--supported] <isofilename>\n");
exit(1);
}
int main(int argc, char **argv) {
int rc;
char *errstr;
const char **args;
int forceit=0;
int supported=0;
int help=0;
poptContext optCon;
struct poptOption options[] = {
{ "force", 'f', POPT_ARG_NONE, &forceit, 0 },
{ "supported-iso", 'S', POPT_ARG_NONE, &supported, 0 },
{ "help", 'h', POPT_ARG_NONE, &help, 0},
{ 0, 0, 0, 0, 0}
};
optCon = poptGetContext("implantisomd5", argc, (const char **)argv, options, 0);
if ((rc = poptGetNextOpt(optCon)) < -1) {
fprintf(stderr, "bad option %s: %s\n",
poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
poptStrerror(rc));
exit(1);
}
if (help)
usage();
args = poptGetArgs(optCon);
if (!args || !args[0] || !args[0][0])
usage();
rc = implantISOFile((char *)args[0], supported, forceit, 0, &errstr);
if (rc) {
fprintf(stderr, "ERROR: %s\n", errstr);
exit(1);
} else {
exit(0);
}
}

+ 316
- 0
misc/isomd5sum/libcheckisomd5.c

@ -0,0 +1,316 @@
/* Copyright 2001 Red Hat, Inc. */
/* Michael Fulbright msf@redhat.com */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include "md5.h"
#include "libcheckisomd5.h"
#define APPDATA_OFFSET 883
#define SIZE_OFFSET 84
#define MAX(x, y) ((x > y) ? x : y)
#define MIN(x, y) ((x < y) ? x : y)
/* finds primary volume descriptor and returns info from it */
/* mediasum must be a preallocated buffer at least 33 bytes long */
static int parsepvd(int isofd, char *mediasum, int *skipsectors, long long *isosize, int *supported) {
unsigned char buf[2048];
unsigned char buf2[512];
unsigned char tmpbuf[512];
int skipfnd, md5fnd, supportedfnd;
unsigned int loc;
long long offset;
unsigned char *p;
*supported = 0;
if (lseek(isofd, (off_t)(16L * 2048L), SEEK_SET) == -1)
return ((long long)-1);
offset = (16L * 2048L);
for (;1;) {
if (read(isofd, buf, 2048) <=0)
return ((long long)-1);
if (buf[0] == 1)
/* found primary volume descriptor */
break;
else if (buf[0] == 255)
/* hit end and didn't find primary volume descriptor */
return ((long long)-1);
offset += 2048L;
}
/* read out md5sum */
memcpy(buf2, buf + APPDATA_OFFSET, 512);
buf2[511] = '\0';
md5fnd = 0;
skipfnd = 0;
supportedfnd = 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 if (!strncmp(buf2 + loc, "RHLISOSTATUS=1", 14)) {
*supported = 1;
supportedfnd = 1;
} else if (!strncmp(buf2 + loc, "RHLISOSTATUS=0", 14)) {
*supported = 0;
supportedfnd = 1;
} else {
loc++;
}
if ((skipfnd & md5fnd) & supportedfnd)
break;
}
if (!(skipfnd & md5fnd))
return -1;
/* get isosize */
*isosize = (buf[SIZE_OFFSET]*0x1000000+buf[SIZE_OFFSET+1]*0x10000 +
buf[SIZE_OFFSET+2]*0x100 + buf[SIZE_OFFSET+3]) * 2048LL;
return offset;
}
/* returns -1 if no checksum encoded in media, 0 if no match, 1 if match */
/* mediasum is the sum encoded in media, computedsum is one we compute */
/* both strings must be pre-allocated at least 33 chars in length */
static int checkmd5sum(int isofd, char *mediasum, char *computedsum, int quiet) {
int nread;
int i;
int appdata_start_offset, appdata_end_offset;
int nattempt;
int skipsectors;
int supported;
unsigned int bufsize = 32768;
unsigned char md5sum[16];
unsigned int len;
unsigned char *buf;
long long isosize, offset, pvd_offset, apoff;
MD5_CTX md5ctx;
if ((pvd_offset = parsepvd(isofd, mediasum, &skipsectors, &isosize, &supported)) < 0)
return -1;
/* printf("Mediasum = %s\n",mediasum); */
/* rewind, compute md5sum */
lseek(isofd, 0L, SEEK_SET);
MD5_Init(&md5ctx);
offset = 0;
apoff = pvd_offset + APPDATA_OFFSET;
buf = malloc(bufsize * sizeof(unsigned char));
if (!quiet) {
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);
/* printf("%lld %lld %lld %d\n", offset, isosize, isosize-SKIPSECTORS*2048, nattempt); */
nread = read(isofd, buf, nattempt);
if (nread <= 0)
break;
/* overwrite md5sum we implanted with original data */
if (offset < apoff && offset+nread >= apoff) {
appdata_start_offset = apoff - offset;
appdata_end_offset = MIN(appdata_start_offset+MIN(nread, 512),
offset + nread - apoff);
len = appdata_end_offset - appdata_start_offset;
memset(buf+appdata_start_offset, ' ', len);
} else if (offset >= apoff && offset+nread < apoff + 512) {
appdata_start_offset = 0;
appdata_end_offset = nread;
len = appdata_end_offset - appdata_start_offset;
memset(buf+appdata_start_offset, ' ', len);
} else if (offset < apoff + 512 && offset+nread >= apoff + 512) {
appdata_start_offset = 0;
appdata_end_offset = apoff + 512 - offset;
len = appdata_end_offset - appdata_start_offset;
memset(buf+appdata_start_offset, ' ', len);
}
MD5_Update(&md5ctx, buf, nread);
offset = offset + nread;
/* XXX: print only once every few 100ms, in order not to overload a serial console. -stefanp */
if (!quiet) {
printf("\b\b\b\b\b\b%05.1f%%", (100.0*offset)/(isosize-skipsectors*2048.0));
fflush(stdout);
}
}
if (!quiet) {
printf("\b\b\b\b\b\b%05.1f%%\n", (100.0*offset)/(isosize-skipsectors*2048.0));
}
sleep(1);
free(buf);
MD5_Final(md5sum, &md5ctx);
*computedsum = '\0';
for (i=0; i<16; i++) {
char tmpstr[4];
snprintf (tmpstr, 4, "%02x", md5sum[i]);
strcat(computedsum, tmpstr);
}
/* printf("mediasum, computedsum = %s %s\n", mediasum, computedsum); */
if (strcmp(mediasum, computedsum))
return 0;
else
return 1;
}
#if 0
static void readCB(void *co, long long pos) {
struct progressCBdata *data = co;
static int tick = 0;
char tickmark[2] = "-";
char * ticks = "-\\|/";
newtScaleSet(data->scale, pos);
tick++;
if (tick > 399) tick = 0;
*tickmark = ticks[tick / 100];
newtLabelSetText(data->label, tickmark);
newtRefresh();
}
#endif
static int doMediaCheck(int isofd, char *mediasum, char *computedsum, long long *isosize, int *supported, int quiet) {
int rc;
int skipsectors;
if (parsepvd(isofd, mediasum, &skipsectors, isosize, supported) < 0) {
fprintf(stderr, "Unable to read the disc checksum from the "
"primary volume descriptor.\nThis probably "
"means the disc was created without adding the "
"checksum.\n");
return -1;
}
rc = checkmd5sum(isofd, mediasum, computedsum, quiet);
return rc;
}
int mediaCheckFile(char *file, int quiet) {
int isofd;
int rc;
char *result;
unsigned char mediasum[33], computedsum[33];
long long isosize;
int supported;
isofd = open(file, O_RDONLY);
if (isofd < 0) {
fprintf(stderr, "Unable to find install image %s\n", file);
return -1;
}
rc = doMediaCheck(isofd, mediasum, computedsum, &isosize, &supported, quiet);
close(isofd);
/* printf("isosize = %lld\n", isosize);
printf("%s\n%s\n", mediasum, computedsum);*/
/* if (!quiet)
fprintf(stderr, "The supported flag value is %d\n", supported);*/
if (rc == 0)
result = "FAIL.\n\nIt is not recommended to use this media.";
else if (rc > 0)
result = "PASS.\n\nIt is OK to install from this media.";
else
result = "NA.\n\nNo checksum information available, unable to verify media.";
if (!quiet)
fprintf(stderr, "The media check is complete, the "
"result is: %s\n", result);
return rc;
}
void printMD5SUM(char *file) {
int isofd;
char mediasum[64];
long long isosize;
int supported;
int skipsectors;
isofd = open(file, O_RDONLY);
if (isofd < 0) {
fprintf(stderr, "%s: Unable to find install image.\n", file);
exit(1);
}
if (parsepvd(isofd, mediasum, &skipsectors, &isosize, &supported) < 0) {
fprintf(stderr, "%s: Could not get pvd data", file);
fprintf(stderr, "\nUnable to read the disc checksum from the "
"primary volume descriptor.\nThis probably "
"means the disc was created without adding the "
"checksum.");
exit(1);
}
close(isofd);
printf("%s: %s\n", file, mediasum);
}

+ 7
- 0
misc/isomd5sum/libcheckisomd5.h

@ -0,0 +1,7 @@
#ifndef __LIBCHECKISOMD5_H__
#define __LIBCHECKISOMD5_H__
int mediaCheckFile(char *iso, int quiet);
void printMD5SUM(char *file);
#endif

+ 205
- 0
misc/isomd5sum/libimplantisomd5.c

@ -0,0 +1,205 @@
/* Copyright 2001 Red Hat, Inc. */
/* Michael Fulbright msf@redhat.com */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include "md5.h"
#include "libimplantisomd5.h"
#define APPDATA_OFFSET 883
#define SIZE_OFFSET 84
/* number of sectors to ignore at end of iso when computing sum */
#define SKIPSECTORS 15
#define MAX(x, y) ((x > y) ? x : y)
#define MIN(x, y) ((x < y) ? x : y)
/* finds primary volume descriptor and returns info from it */
/* mediasum must be a preallocated buffer at least 33 bytes long */
static int parsepvd(int isofd, char *mediasum, long long *isosize) {
unsigned char buf[2048];
long long offset;
unsigned char *p __attribute__((unused));
if (lseek(isofd, 16*2048, SEEK_SET) == -1)
return ((long long)-1);
offset = (16 * 2048);
for (;1;) {
if (read(isofd, buf, 2048L) == -1)
return ((long long)-1);
if (buf[0] == 1)
/* found primary volume descriptor */
break;
else if (buf[0] == 255)
/* hit end and didn't find primary volume descriptor */
return ((long long)-1);
offset += 2048L;
}
/* read out md5sum */
#if 0
memcpy(mediasum, buf + APPDATA_OFFSET + 13, 32);
mediasum[32] = '\0';
for (p=mediasum; *p; p++)
if (*p != ' ')
break;
/* if the md5sum was all spaces, we didn't find md5sum */
if (!*p)
return -1;
#endif
/* get isosize */
*isosize = (buf[SIZE_OFFSET]*0x1000000+buf[SIZE_OFFSET+1]*0x10000 +
buf[SIZE_OFFSET+2]*0x100 + buf[SIZE_OFFSET+3]) * 2048LL;
return offset;
}
static 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 implantISOFile(char *fname, int supported, int forceit, int quiet, char **errstr) {
int i;
int isofd;
int nread;
int dirty;
int pvd_offset;
long long isosize, total;
unsigned char md5sum[16];
unsigned int loc;
unsigned char buf[2048];
unsigned char orig_appdata[512];
unsigned char new_appdata[512];
unsigned char mediasum[33];
char md5str[40];
MD5_CTX md5ctx;
isofd = open(fname, O_RDWR);
if (isofd < 0) {
*errstr = "Error - Unable to open file %s\n\n";
return -1;
}
pvd_offset = parsepvd(isofd, mediasum, &isosize);
if (pvd_offset < 0) {
*errstr = "Could not find primary volumne!\n\n";
return -1;
}
lseek(isofd, pvd_offset + APPDATA_OFFSET, SEEK_SET);
nread = read(isofd, orig_appdata, 512);
if (!forceit) {
dirty = 0;
for (i=0; i < 512; i++)
if (orig_appdata[i] != ' ')
dirty = 1;
if (dirty) {
*errstr = "Application data has been used - not implanting md5sum!\n";
return -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);
total = 0;
/* read up to 15 sectors from end, due to problems reading last few */
/* sectors on burned CDs */
while (total < isosize - SKIPSECTORS*2048) {
nread = read(isofd, buf, 2048);
if (nread <= 0)
break;
MD5_Update(&md5ctx, buf, nread);
total = total + nread;
}
MD5_Final(md5sum, &md5ctx);
*md5str = '\0';
for (i=0; i<16; i++) {
char tmpstr[4];
snprintf (tmpstr, 4, "%02x", md5sum[i]);
strcat(md5str, tmpstr);
}
if (!quiet) {
printf("Inserting md5sum into iso image...\n");
printf("md5 = %s\n", md5str);
}
/* memcpy(new_appdata, orig_appdata, 512); */
memset(new_appdata, ' ', 512);
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);
if (supported) {
if (!quiet)
printf("Setting supported flag to 1\n");
loc = writeAppData(new_appdata, "RHLISOSTATUS=1", loc);
} else {
if (!quiet)
printf("Setting supported flag to 0\n");
loc = writeAppData(new_appdata, "RHLISOSTATUS=0", 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");
i = write(isofd, new_appdata, 512);
if (i<0) {
printf("write failed %d\n", i);
perror("");
}
close(isofd);
errstr = NULL;
return 0;
}

+ 5
- 0
misc/isomd5sum/libimplantisomd5.h

@ -0,0 +1,5 @@
#ifndef __LIBIMPLANTISOMD5_H__
#define __LIBIMPLANTISOMD5_H__
int implantISOFile(char *iso, int supported, int forceit, int quiet, char **errstr);
#endif

+ 267
- 0
misc/isomd5sum/md5.c

@ -0,0 +1,267 @@
/*
* $Id: md5.c,v 1.3 2003/06/23 19:02:38 katzj Exp $
*
* This code implements the MD5 message-digest algorithm.
* The algorithm is due to Ron Rivest. This code was
* written by Colin Plumb in 1993, no copyright is claimed.
* This code is in the public domain; do with it what you wish.
*
* Equivalent code is available from RSA Data Security, Inc.
* This code has been tested against that, and is equivalent,
* except that you don't need to include two pages of legalese
* with every copy.
*
* To compute the message digest of a chunk of bytes, declare an
* MD5Context structure, pass it to MD5Init, call MD5Update as
* needed on buffers full of bytes, and then call MD5Final, which
* will fill a supplied 16-byte array with the digest.
*
* Modified 12 June 2003 Jeremy Katz <katzj@redhat.com> to handle
* endianness better
*
*/
#include <string.h>
#include <endian.h>
#include "md5.h"
void MD5_Transform(uint32 *buf, uint32 const *in);
#define IS_BIG_ENDIAN() (__BYTE_ORDER == __BIG_ENDIAN)
#define IS_LITTLE_ENDIAN() (__BYTE_ORDER == __LITTLE_ENDIAN)
static void byteReverse(unsigned char *buf, unsigned longs);
#ifndef ASM_MD5
/*
* Note: this code is harmless on little-endian machines.
*/
static void byteReverse(unsigned char *buf, unsigned longs)
{
uint32 t;
do {
t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
((unsigned) buf[1] << 8 | buf[0]);
*(uint32 *) buf = t;
buf += 4;
} while (--longs);
}
#endif
/*
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
* initialization constants.
*/
void MD5_Init(struct MD5Context *ctx)
{
ctx->buf[0] = 0x67452301U;
ctx->buf[1] = 0xefcdab89U;
ctx->buf[2] = 0x98badcfeU;
ctx->buf[3] = 0x10325476U;
ctx->bits[0] = 0;
ctx->bits[1] = 0;
if (IS_BIG_ENDIAN())
ctx->doByteReverse = 1;
else
ctx->doByteReverse = 0;
}
/*
* Update context to reflect the concatenation of another buffer full
* of bytes.
*/
void MD5_Update(struct MD5Context *ctx, unsigned const char *buf, unsigned len)
{
uint32 t;
/* Update bitcount */
t = ctx->bits[0];
if ((ctx->bits[0] = t + ((uint32) len << 3)) < t)
ctx->bits[1]++; /* Carry from low to high */
ctx->bits[1] += len >> 29;
t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
/* Handle any leading odd-sized chunks */
if (t) {
unsigned char *p = (unsigned char *) ctx->in + t;
t = 64 - t;
if (len < t) {
memcpy(p, buf, len);
return;
}
memcpy(p, buf, t);
if (ctx->doByteReverse) byteReverse(ctx->in, 16);
MD5_Transform(ctx->buf, (uint32 *) ctx->in);
buf += t;
len -= t;
}
/* Process data in 64-byte chunks */
while (len >= 64) {
memcpy(ctx->in, buf, 64);
if (ctx->doByteReverse) byteReverse(ctx->in, 16);
MD5_Transform(ctx->buf, (uint32 *) ctx->in);
buf += 64;
len -= 64;
}
/* Handle any remaining bytes of data. */
memcpy(ctx->in, buf, len);
}
/*
* Final wrapup - pad to 64-byte boundary with the bit pattern
* 1 0* (64-bit count of bits processed, MSB-first)
*/
void MD5_Final(unsigned char digest[16], struct MD5Context *ctx)
{
unsigned count;
unsigned char *p;
/* Compute number of bytes mod 64 */
count = (ctx->bits[0] >> 3) & 0x3F;
/* Set the first char of padding to 0x80. This is safe since there is
always at least one byte free */
p = ctx->in + count;
*p++ = 0x80;
/* Bytes of padding needed to make 64 bytes */
count = 64 - 1 - count;
/* Pad out to 56 mod 64 */
if (count < 8) {
/* Two lots of padding: Pad the first block to 64 bytes */
memset(p, 0, count);
if (ctx->doByteReverse) byteReverse(ctx->in, 16);
MD5_Transform(ctx->buf, (uint32 *) ctx->in);
/* Now fill the next block with 56 bytes */
memset(ctx->in, 0, 56);
} else {
/* Pad block to 56 bytes */
memset(p, 0, count - 8);
}
if (ctx->doByteReverse) byteReverse(ctx->in, 14);
/* Append length in bits and transform */
((uint32 *) ctx->in)[14] = ctx->bits[0];
((uint32 *) ctx->in)[15] = ctx->bits[1];
MD5_Transform(ctx->buf, (uint32 *) ctx->in);
if (ctx->doByteReverse) byteReverse((unsigned char *) ctx->buf, 4);
memcpy(digest, ctx->buf, 16);
memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */
}
#ifndef ASM_MD5
/* The four core functions - F1 is optimized somewhat */
/* #define F1(x, y, z) (x & y | ~x & z) */
#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))
/* This is the central step in the MD5 algorithm. */
#define MD5STEP(f, w, x, y, z, data, s) \
( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
/*
* The core of the MD5 algorithm, this alters an existing MD5 hash to
* reflect the addition of 16 longwords of new data. MD5Update blocks
* the data and converts bytes into longwords for this routine.
*/
void MD5_Transform(uint32 buf[4], uint32 const in[16])
{
register uint32 a, b, c, d;
a = buf[0];
b = buf[1];
c = buf[2];
d = buf[3];
MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478U, 7);
MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756U, 12);
MD5STEP(F1, c, d, a, b, in[2] + 0x242070dbU, 17);
MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceeeU, 22);
MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0fafU, 7);
MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62aU, 12);
MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613U, 17);
MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501U, 22);
MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8U, 7);
MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7afU, 12);
MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1U, 17);
MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7beU, 22);
MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122U, 7);
MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193U, 12);
MD5STEP(F1, c, d, a, b, in[14] + 0xa679438eU, 17);
MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821U, 22);
MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562U, 5);
MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340U, 9);
MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51U, 14);
MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aaU, 20);
MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105dU, 5);
MD5STEP(F2, d, a, b, c, in[10] + 0x02441453U, 9);
MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681U, 14);
MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8U, 20);
MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6U, 5);
MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6U, 9);
MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87U, 14);
MD5STEP(F2, b, c, d, a, in[8] + 0x455a14edU, 20);
MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905U, 5);
MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8U, 9);
MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9U, 14);
MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8aU, 20);
MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942U, 4);
MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681U, 11);
MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122U, 16);
MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380cU, 23);
MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44U, 4);
MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9U, 11);
MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60U, 16);
MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70U, 23);
MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6U, 4);
MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127faU, 11);
MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085U, 16);
MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05U, 23);
MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039U, 4);
MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5U, 11);
MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8U, 16);
MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665U, 23);
MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244U, 6);
MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97U, 10);
MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7U, 15);
MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039U, 21);
MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3U, 6);
MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92U, 10);
MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47dU, 15);
MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1U, 21);
MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4fU, 6);
MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0U, 10);
MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314U, 15);
MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1U, 21);
MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82U, 6);
MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235U, 10);
MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bbU, 15);
MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391U, 21);
buf[0] += a;
buf[1] += b;
buf[2] += c;
buf[3] += d;
}
#endif

+ 30
- 0
misc/isomd5sum/md5.h

@ -0,0 +1,30 @@
#ifndef MD5_H
#define MD5_H
#include <sys/types.h>
#ifdef __dietlibc__
typedef uint32_t uint32;
#else
typedef u_int32_t uint32;
#endif
struct MD5Context {
uint32 buf[4];
uint32 bits[2];
unsigned char in[64];
int doByteReverse;
};
void MD5_Init(struct MD5Context *);
void MD5_Update(struct MD5Context *, unsigned const char *, unsigned);
void MD5_Final(unsigned char digest[16], struct MD5Context *);
/*
* This is needed to make RSAREF happy on some MS-DOS compilers.
*/
typedef struct MD5Context MD5_CTX;
#endif /* MD5_H */

+ 2
- 0
scripts/Cleanup

@ -42,6 +42,8 @@ while [ "$1" ] ; do
esac
done
make -C misc/isomd5sum clean || true
# Remove src*
#
for x in src src.* build/*/ROCK/src.*; do

+ 15
- 4
scripts/Create-ISO

@ -23,7 +23,7 @@ eval `grep rockver scripts/parse-config`
if [ $# -eq 0 ] ; then
echo
echo "Usage: $0 [ -size MB ] [ -source ] [ -mkdebug ] ISO-Prefix \\"
echo "Usage: $0 [ -size MB ] [ -source ] [ -mkdebug ] [ -nomd5 ] ISO-Prefix \\"
echo " ${0//?/ } Config [ Config [ .. ] ]"
echo
echo "E.g.: $0 mycdset install generic"
@ -33,8 +33,7 @@ fi
# default disk-size is 600 MB
dsize=$(( 600 * 1024 ))
src=0
mkdebug=0
src=0; mkdebug=0; implantisomd5=1
while true ; do
case "$1" in
@ -44,6 +43,8 @@ while true ; do
src=1 ; shift ;;
-mkdebug)
mkdebug=1 ; shift ;;
-nomd5)
implantisomd5=0 ; shift ;;
-* | '')
$0 ; exit 1 ;;
*)
@ -53,6 +54,11 @@ done
spacer=" "
if [ "$implantisomd5" = 1 -a ! -x ./misc/isomd5sum/implantisomd5 ] ; then
echo ; date "+ [%X] Creating ISO-MD5 tools ..."
make -C misc/isomd5sum all
fi
echo ; date "+ [%X] Removing old files with same prefix ..."
rm -rf ${isoprefix}_*
@ -255,10 +261,15 @@ for x in $disks ; do
bootoptions=""
if [ "$scripts" ] ; then
echo "Running post-processing scripts on image ..."
echo "$spacer Running post-processing scripts on image ..."
eval $scripts $x ${isoprefix}_cd$x.iso
fi
if [ "$implantisomd5" = 1 -a -x ./misc/isomd5sum/implantisomd5 ] ; then
echo "$spacer Calculating and implanting MD5 checksum ..."
./misc/isomd5sum/implantisomd5 ${isoprefix}_cd$x.iso >/dev/null
fi
if [ "$mkdebug" = 1 ] ; then
cat > ${isoprefix}_loop$x.sh << EOT
#!/bin/sh

+ 6
- 2
target/bootdisk/build_stage1.sh

@ -5,10 +5,14 @@ mkdir -p $disksdir/initrd/{dev,proc,tmp,scsi,net,bin}
cd $disksdir/initrd; ln -s bin sbin; ln -s . usr
#
echo_status "Create linuxrc binary."
diet $CC $base/target/$target/linuxrc.c -Wall \
diet $CC -c $base/misc/isomd5sum/md5.c -Wall -o md5.o || true
diet $CC -c $base/misc/isomd5sum/libcheckisomd5.c -Wall -o libcheckisomd5.o || true
diet $CC -c $base/target/$target/linuxrc.c -Wall -I $base/misc/isomd5sum/ \
-DSTAGE_2_BIG_IMAGE="\"${ROCKCFG_SHORTID}/2nd_stage.tar.gz\"" \
-DSTAGE_2_SMALL_IMAGE="\"${ROCKCFG_SHORTID}/2nd_stage_small.tar.gz\"" \
-o linuxrc # > $disksdir/tmp 2>&1
-o linuxrc.o || true
diet $CC linuxrc.o md5.o libcheckisomd5.o -o linuxrc
rm -f linuxrc.o md5.o libcheckisomd5.o
#
echo_status "Copy various helper applications."
cp ../2nd_stage/bin/{tar,gzip} bin/

+ 46
- 8
target/bootdisk/linuxrc.c

@ -40,6 +40,7 @@
#include <fcntl.h>
#include <errno.h>
#include <stdarg.h>
#include "libcheckisomd5.h"
#ifndef MS_MOVE
# define MS_MOVE 8192
@ -253,21 +254,23 @@ void load_modules(char * dir)
trywait(pid);
}
void load_ramdisk_file()
int getdevice(char* devstr, int devlen, int cdroms, int floppies)
{
char *devicelists[2] = { "/dev/cdroms/cdrom%d", "/dev/floppy/%d" };
char *devicenames[2] =
{ "CD-ROM #%d (IDE/ATAPI or SCSI)", "FDD (Floppy Disk Drive) #%d" };
char *devn[10], *desc[10];
char text[100], devicefile[100];
char filename[100];
int nr=0;
int i, tmp_nr;
int pid;
printf("Select a device for loading the 2nd stage system from: \n\n");
if (!cdroms && !floppies)
return -1;
for (i = 0; i < 2; i++) {
if ( (0 == i) && (!cdroms) ) continue;
if ( (1 == i) && (!floppies) ) continue;
for (tmp_nr = 0; tmp_nr < 10; ++tmp_nr) {
sprintf(devicefile, devicelists[i], tmp_nr);
sprintf(text, devicenames[i], tmp_nr+1);
@ -279,6 +282,8 @@ void load_ramdisk_file()
}
}
if (!nr) return -1;
desc[nr] = devn[nr] = NULL;
for (nr=0; desc[nr]; nr++) {
@ -294,21 +299,35 @@ void load_ramdisk_file()
while (1) {
if ( ! access(text, R_OK) ) {
strcpy(devicefile, text);
strncpy(devstr, text, devlen);
break;
}
if (atoi(text) >= 0 && atoi(text) < nr) {
strcpy(devicefile, devn[atoi(text)]);
strncpy(devstr, devn[atoi(text)], devlen);
break;
}
printf("No such device found. Try again (enter=back): ");
fflush(stdout);
trygets(text, 100);
if (text[0] == 0) return;
if (text[0] == 0) return -1;
}
return 1;
}
void load_ramdisk_file()
{
char text[100], devicefile[100];
char filename[100];
int pid;
printf("Select a device for loading the 2nd stage system from: \n\n");
if (getdevice(devicefile, 100, 1, 1) <= 0)
return;
printf("Select a stage 2 image file:\n\n"
" 1. %s\n 2. %s\n\n"
"Enter number or image file name (default=1): ",
@ -457,6 +476,20 @@ void exec_sh()
trywait(rc);
}
void checkisomd5()
{
char devicefile[100];
printf("Select a device for checking: \n\n");
if (getdevice(devicefile, 100, 1, 0) <= 0)
return;
mediaCheckFile(devicefile, 0);
printf("\nPress Return key to continue."); (void)getchar();
}
int main()
{
char text[100];
@ -495,8 +528,9 @@ drivers (if needed) and configure the installation source so the\n\
5. Load kernel modules from another disk\n\
6. Activate already formatted swap device\n\
7. Execute a (kiss) shell if present (for experts!)\n\
8. Validate a CD/DVD against its embedded checksum\n\
\n\
What do you want to do [0-7] (default=0)? ");
What do you want to do [0-8] (default=0)? ");
fflush(stdout);
trygets(text, 100);
@ -545,6 +579,10 @@ What do you want to do [0-7] (default=0)? ");
exec_sh();
break;
case 8:
checkisomd5();
break;
default:
perror ("No such option present!");
}

Loading…
Cancel
Save