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 esac
done done
make -C misc/isomd5sum clean || true
# Remove src* # Remove src*
# #
for x in src src.* build/*/ROCK/src.*; do 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 if [ $# -eq 0 ] ; then
echo 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 " ${0//?/ } Config [ Config [ .. ] ]"
echo echo
echo "E.g.: $0 mycdset install generic" echo "E.g.: $0 mycdset install generic"
@ -33,8 +33,7 @@ fi
# default disk-size is 600 MB # default disk-size is 600 MB
dsize=$(( 600 * 1024 )) dsize=$(( 600 * 1024 ))
src=0
mkdebug=0
src=0; mkdebug=0; implantisomd5=1
while true ; do while true ; do
case "$1" in case "$1" in
@ -44,6 +43,8 @@ while true ; do
src=1 ; shift ;; src=1 ; shift ;;
-mkdebug) -mkdebug)
mkdebug=1 ; shift ;; mkdebug=1 ; shift ;;
-nomd5)
implantisomd5=0 ; shift ;;
-* | '') -* | '')
$0 ; exit 1 ;; $0 ; exit 1 ;;
*) *)
@ -53,6 +54,11 @@ done
spacer=" " 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 ..." echo ; date "+ [%X] Removing old files with same prefix ..."
rm -rf ${isoprefix}_* rm -rf ${isoprefix}_*
@ -255,10 +261,15 @@ for x in $disks ; do
bootoptions="" bootoptions=""
if [ "$scripts" ] ; then 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 eval $scripts $x ${isoprefix}_cd$x.iso
fi 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 if [ "$mkdebug" = 1 ] ; then
cat > ${isoprefix}_loop$x.sh << EOT cat > ${isoprefix}_loop$x.sh << EOT
#!/bin/sh #!/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 cd $disksdir/initrd; ln -s bin sbin; ln -s . usr
# #
echo_status "Create linuxrc binary." 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_BIG_IMAGE="\"${ROCKCFG_SHORTID}/2nd_stage.tar.gz\"" \
-DSTAGE_2_SMALL_IMAGE="\"${ROCKCFG_SHORTID}/2nd_stage_small.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." echo_status "Copy various helper applications."
cp ../2nd_stage/bin/{tar,gzip} bin/ cp ../2nd_stage/bin/{tar,gzip} bin/

+ 46
- 8
target/bootdisk/linuxrc.c

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

Loading…
Cancel
Save