wok rev 12210

syslinux: add md5sum.c32
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Mar 31 14:27:35 2012 +0200 (2012-03-31)
parents fa389f5b7eb9
children 7219c33850c6
files syslinux/receipt syslinux/stuff/extra/md5sum.c syslinux/stuff/isolinux.cfg
line diff
     1.1 --- a/syslinux/receipt	Fri Mar 30 14:26:56 2012 +0200
     1.2 +++ b/syslinux/receipt	Sat Mar 31 14:27:35 2012 +0200
     1.3 @@ -19,8 +19,9 @@
     1.4      cp $stuff/tools/isohybrid.sh .
     1.5      cp $stuff/tools/keytab-lilo.pl .
     1.6      cp $stuff/extra/ifmem.c com32/modules
     1.7 +    cp $stuff/extra/md5sum.c com32/modules
     1.8      grep -q ifmem.c32 com32/modules/Makefile ||
     1.9 -	sed -i 's/ifcpu64.c32/ifcpu64.c32 ifmem.c32/' com32/modules/Makefile
    1.10 +	sed -i 's/ifcpu64.c32/ifcpu64.c32 ifmem.c32 md5sum.c32/' com32/modules/Makefile
    1.11      make -C com32
    1.12      ./isohybrid.sh --build
    1.13      for i in /usr/share/kbd/keymaps/i386/*/*.map.gz; do
    1.14 @@ -38,6 +39,7 @@
    1.15      cp -a $src/core/isolinux.bin $fs/boot/isolinux
    1.16      cp -a $src/com32/modules/reboot.c32 $fs/boot/isolinux
    1.17      cp -a $src/com32/modules/ifmem.c32 $fs/boot/isolinux
    1.18 +    cp -a $src/com32/modules/md5sum.c32 $fs/boot/isolinux
    1.19      cp -a $src/com32/menu/vesamenu.c32 $fs/boot/isolinux
    1.20      cp -a $src/modules/poweroff.com $fs/boot/isolinux
    1.21      # $stuff/isolinux.msg is the old way the have a splash image.
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/syslinux/stuff/extra/md5sum.c	Sat Mar 31 14:27:35 2012 +0200
     2.3 @@ -0,0 +1,363 @@
     2.4 +/* vi: set sw=4 ts=4: */
     2.5 +/*
     2.6 + * Based on busybox code
     2.7 + *
     2.8 + * Utility routines.
     2.9 + *
    2.10 + * Copyright (C) 2010 Denys Vlasenko
    2.11 + *
    2.12 + * Licensed under GPLv2 or later, see file LICENSE in this source tree.
    2.13 + */
    2.14 +
    2.15 +#include <stdio.h>
    2.16 +#include <stdlib.h>
    2.17 +#include <string.h>
    2.18 +#include <unistd.h>
    2.19 +#include <fcntl.h>
    2.20 +#include <console.h>
    2.21 +#include <com32.h>
    2.22 +
    2.23 +#define ALIGN1
    2.24 +const char bb_hexdigits_upcase[] ALIGN1 = "0123456789ABCDEF";
    2.25 +
    2.26 +/* Emit a string of hex representation of bytes */
    2.27 +char* bin2hex(char *p, const char *cp, int count)
    2.28 +{
    2.29 +	while (count) {
    2.30 +		unsigned char c = *cp++;
    2.31 +		/* put lowercase hex digits */
    2.32 +		*p++ = 0x20 | bb_hexdigits_upcase[c >> 4];
    2.33 +		*p++ = 0x20 | bb_hexdigits_upcase[c & 0xf];
    2.34 +		count--;
    2.35 +	}
    2.36 +	return p;
    2.37 +}
    2.38 +
    2.39 +//#define rotl32(x,n) (((x) << (n)) | ((x) >> (32 - (n))))
    2.40 +static uint32_t rotl32(uint32_t x, unsigned n)
    2.41 +{
    2.42 +	return (x << n) | (x >> (32 - n));
    2.43 +}
    2.44 +
    2.45 +typedef struct md5_ctx_t {
    2.46 +	uint8_t wbuffer[64]; /* always correctly aligned for uint64_t */
    2.47 +	uint64_t total64;    /* must be directly before hash[] */
    2.48 +	uint32_t hash[8];    /* 4 elements for md5, 5 for sha1, 8 for sha256 */
    2.49 +} md5_ctx_t;
    2.50 +
    2.51 +static void md5_process_block64(md5_ctx_t *ctx);
    2.52 +
    2.53 +/* Feed data through a temporary buffer.
    2.54 + * The internal buffer remembers previous data until it has 64
    2.55 + * bytes worth to pass on.
    2.56 + */
    2.57 +static void common64_hash(md5_ctx_t *ctx, const void *buffer, size_t len)
    2.58 +{
    2.59 +	unsigned bufpos = ctx->total64 & 63;
    2.60 +
    2.61 +	ctx->total64 += len;
    2.62 +
    2.63 +	while (1) {
    2.64 +		unsigned remaining = 64 - bufpos;
    2.65 +		if (remaining > len)
    2.66 +			remaining = len;
    2.67 +		/* Copy data into aligned buffer */
    2.68 +		memcpy(ctx->wbuffer + bufpos, buffer, remaining);
    2.69 +		len -= remaining;
    2.70 +		buffer = (const char *)buffer + remaining;
    2.71 +		bufpos += remaining;
    2.72 +		/* clever way to do "if (bufpos != 64) break; ... ; bufpos = 0;" */
    2.73 +		bufpos -= 64;
    2.74 +		if (bufpos != 0)
    2.75 +			break;
    2.76 +		/* Buffer is filled up, process it */
    2.77 +		md5_process_block64(ctx);
    2.78 +		/*bufpos = 0; - already is */
    2.79 +	}
    2.80 +}
    2.81 +
    2.82 +/* Process the remaining bytes in the buffer */
    2.83 +static void common64_end(md5_ctx_t *ctx)
    2.84 +{
    2.85 +	unsigned bufpos = ctx->total64 & 63;
    2.86 +	/* Pad the buffer to the next 64-byte boundary with 0x80,0,0,0... */
    2.87 +	ctx->wbuffer[bufpos++] = 0x80;
    2.88 +
    2.89 +	/* This loop iterates either once or twice, no more, no less */
    2.90 +	while (1) {
    2.91 +		unsigned remaining = 64 - bufpos;
    2.92 +		memset(ctx->wbuffer + bufpos, 0, remaining);
    2.93 +		/* Do we have enough space for the length count? */
    2.94 +		if (remaining >= 8) {
    2.95 +			/* Store the 64-bit counter of bits in the buffer */
    2.96 +			uint64_t t = ctx->total64 << 3;
    2.97 +			/* wbuffer is suitably aligned for this */
    2.98 +			*(uint64_t *) (&ctx->wbuffer[64 - 8]) = t;
    2.99 +		}
   2.100 +		md5_process_block64(ctx);
   2.101 +		if (remaining >= 8)
   2.102 +			break;
   2.103 +		bufpos = 0;
   2.104 +	}
   2.105 +}
   2.106 +
   2.107 +
   2.108 +/*
   2.109 + * Compute MD5 checksum of strings according to the
   2.110 + * definition of MD5 in RFC 1321 from April 1992.
   2.111 + *
   2.112 + * Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
   2.113 + *
   2.114 + * Copyright (C) 1995-1999 Free Software Foundation, Inc.
   2.115 + * Copyright (C) 2001 Manuel Novoa III
   2.116 + * Copyright (C) 2003 Glenn L. McGrath
   2.117 + * Copyright (C) 2003 Erik Andersen
   2.118 + *
   2.119 + * Licensed under GPLv2 or later, see file LICENSE in this source tree.
   2.120 + */
   2.121 +
   2.122 +/* These are the four functions used in the four steps of the MD5 algorithm
   2.123 + * and defined in the RFC 1321.  The first function is a little bit optimized
   2.124 + * (as found in Colin Plumbs public domain implementation).
   2.125 + * #define FF(b, c, d) ((b & c) | (~b & d))
   2.126 + */
   2.127 +#undef FF
   2.128 +#undef FG
   2.129 +#undef FH
   2.130 +#undef FI
   2.131 +#define FF(b, c, d) (d ^ (b & (c ^ d)))
   2.132 +#define FG(b, c, d) FF(d, b, c)
   2.133 +#define FH(b, c, d) (b ^ c ^ d)
   2.134 +#define FI(b, c, d) (c ^ (b | ~d))
   2.135 +
   2.136 +/* Hash a single block, 64 bytes long and 4-byte aligned */
   2.137 +static void md5_process_block64(md5_ctx_t *ctx)
   2.138 +{
   2.139 +	/* Before we start, one word to the strange constants.
   2.140 +	   They are defined in RFC 1321 as
   2.141 +	   T[i] = (int)(4294967296.0 * fabs(sin(i))), i=1..64
   2.142 +	 */
   2.143 +	static const uint32_t C_array[] = {
   2.144 +		/* round 1 */
   2.145 +		0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
   2.146 +		0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
   2.147 +		0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
   2.148 +		0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
   2.149 +		/* round 2 */
   2.150 +		0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
   2.151 +		0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
   2.152 +		0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
   2.153 +		0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
   2.154 +		/* round 3 */
   2.155 +		0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
   2.156 +		0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
   2.157 +		0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05,
   2.158 +		0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
   2.159 +		/* round 4 */
   2.160 +		0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
   2.161 +		0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
   2.162 +		0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
   2.163 +		0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
   2.164 +	};
   2.165 +	static const char P_array[] ALIGN1 = {
   2.166 +		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 1 */
   2.167 +		1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, /* 2 */
   2.168 +		5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, /* 3 */
   2.169 +		0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9  /* 4 */
   2.170 +	};
   2.171 +	uint32_t *words = (void*) ctx->wbuffer;
   2.172 +	uint32_t A = ctx->hash[0];
   2.173 +	uint32_t B = ctx->hash[1];
   2.174 +	uint32_t C = ctx->hash[2];
   2.175 +	uint32_t D = ctx->hash[3];
   2.176 +
   2.177 +	static const char S_array[] ALIGN1 = {
   2.178 +		7, 12, 17, 22,
   2.179 +		5, 9, 14, 20,
   2.180 +		4, 11, 16, 23,
   2.181 +		6, 10, 15, 21
   2.182 +	};
   2.183 +	const uint32_t *pc;
   2.184 +	const char *pp;
   2.185 +	const char *ps;
   2.186 +	int i;
   2.187 +	uint32_t temp;
   2.188 +
   2.189 +
   2.190 +	pc = C_array;
   2.191 +	pp = P_array;
   2.192 +	ps = S_array - 4;
   2.193 +
   2.194 +	for (i = 0; i < 64; i++) {
   2.195 +		if ((i & 0x0f) == 0)
   2.196 +			ps += 4;
   2.197 +		temp = A;
   2.198 +		switch (i >> 4) {
   2.199 +		case 0:
   2.200 +			temp += FF(B, C, D);
   2.201 +			break;
   2.202 +		case 1:
   2.203 +			temp += FG(B, C, D);
   2.204 +			break;
   2.205 +		case 2:
   2.206 +			temp += FH(B, C, D);
   2.207 +			break;
   2.208 +		case 3:
   2.209 +			temp += FI(B, C, D);
   2.210 +		}
   2.211 +		temp += words[(int) (*pp++)] + *pc++;
   2.212 +		temp = rotl32(temp, ps[i & 3]);
   2.213 +		temp += B;
   2.214 +		A = D;
   2.215 +		D = C;
   2.216 +		C = B;
   2.217 +		B = temp;
   2.218 +	}
   2.219 +	/* Add checksum to the starting values */
   2.220 +	ctx->hash[0] += A;
   2.221 +	ctx->hash[1] += B;
   2.222 +	ctx->hash[2] += C;
   2.223 +	ctx->hash[3] += D;
   2.224 +
   2.225 +}
   2.226 +#undef FF
   2.227 +#undef FG
   2.228 +#undef FH
   2.229 +#undef FI
   2.230 +
   2.231 +/* Initialize structure containing state of computation.
   2.232 + * (RFC 1321, 3.3: Step 3)
   2.233 + */
   2.234 +void md5_begin(md5_ctx_t *ctx)
   2.235 +{
   2.236 +	ctx->hash[0] = 0x67452301;
   2.237 +	ctx->hash[1] = 0xefcdab89;
   2.238 +	ctx->hash[2] = 0x98badcfe;
   2.239 +	ctx->hash[3] = 0x10325476;
   2.240 +	ctx->total64 = 0;
   2.241 +}
   2.242 +
   2.243 +/* Used also for sha1 and sha256 */
   2.244 +void md5_hash(md5_ctx_t *ctx, const void *buffer, size_t len)
   2.245 +{
   2.246 +	common64_hash(ctx, buffer, len);
   2.247 +}
   2.248 +
   2.249 +/* Process the remaining bytes in the buffer and put result from CTX
   2.250 + * in first 16 bytes following RESBUF.  The result is always in little
   2.251 + * endian byte order, so that a byte-wise output yields to the wanted
   2.252 + * ASCII representation of the message digest.
   2.253 + */
   2.254 +void md5_end(md5_ctx_t *ctx, void *resbuf)
   2.255 +{
   2.256 +	/* MD5 stores total in LE, need to swap on BE arches: */
   2.257 +	common64_end(ctx);
   2.258 +
   2.259 +	/* The MD5 result is in little endian byte order */
   2.260 +	memcpy(resbuf, ctx->hash, sizeof(ctx->hash[0]) * 4);
   2.261 +}
   2.262 +
   2.263 +/*
   2.264 + *  Copyright (C) 2003 Glenn L. McGrath
   2.265 + *  Copyright (C) 2003-2004 Erik Andersen
   2.266 + *
   2.267 + * Licensed under GPLv2 or later, see file LICENSE in this source tree.
   2.268 + */
   2.269 +
   2.270 +/* This might be useful elsewhere */
   2.271 +static unsigned char *hash_bin_to_hex(unsigned char *hash_value,
   2.272 +				unsigned hash_length)
   2.273 +{
   2.274 +	static char hex_value[16*2+1];
   2.275 +	bin2hex(hex_value, (char*)hash_value, hash_length);
   2.276 +	return (unsigned char *)hex_value;
   2.277 +}
   2.278 +
   2.279 +static uint8_t *hash_file(const char *filename)
   2.280 +{
   2.281 +	int src_fd, count;
   2.282 +	md5_ctx_t context;
   2.283 +	uint8_t *hash_value, in_buf[4096];
   2.284 +
   2.285 +	src_fd = open(filename, O_RDONLY);
   2.286 +	if (src_fd < 0) {
   2.287 +		return NULL;
   2.288 +	}
   2.289 +
   2.290 +	md5_begin(&context);
   2.291 +	while ((count = read(src_fd, in_buf, 4096)) > 0) {
   2.292 +		md5_hash(&context, in_buf, count);
   2.293 +	}
   2.294 +	hash_value = NULL;
   2.295 +	if (count == 0) {
   2.296 +		md5_end(&context, in_buf);
   2.297 +		hash_value = hash_bin_to_hex(in_buf, 16);
   2.298 +	}
   2.299 +
   2.300 +	close(src_fd);
   2.301 +
   2.302 +	return hash_value;
   2.303 +}
   2.304 +
   2.305 +static int valid_name(char *name)
   2.306 +{
   2.307 +	int dots, suffix;
   2.308 +	for (dots = 0, suffix = 0; *name; name++) {
   2.309 +		if (dots) suffix++;
   2.310 +		if (*name == '.') dots++;
   2.311 +	}
   2.312 +	return dots < 2 && suffix <= 3;
   2.313 +}
   2.314 +
   2.315 +int main(int argc, char **argv)
   2.316 +{
   2.317 +	int return_value = EXIT_SUCCESS;
   2.318 +
   2.319 +	(void) argc;
   2.320 +	/* -c implied */
   2.321 +	openconsole(&dev_rawcon_r, &dev_stdcon_w);
   2.322 +
   2.323 +	do {
   2.324 +		FILE *fp;
   2.325 +		char *line, buffer[256];
   2.326 +		fp = fopen(*argv,"r");
   2.327 +
   2.328 +		while ((line = fgets(buffer,256,fp)) != NULL) {
   2.329 +			uint8_t *hash_value;
   2.330 +			char *filename_ptr, *status;
   2.331 +			int len = strlen(line);
   2.332 +#define BLANK "                                "
   2.333 +
   2.334 +			if (line[0] < '0')
   2.335 +				continue;
   2.336 +			if (line[len-1] == '\n')
   2.337 +				line[len-1] = 0;
   2.338 +			filename_ptr = strstr(line, "  ");
   2.339 +			/* handle format for binary checksums */
   2.340 +			if (filename_ptr == NULL) {
   2.341 +				filename_ptr = strstr(line, " *");
   2.342 +			}
   2.343 +			if (filename_ptr == NULL) {
   2.344 +				return_value = EXIT_FAILURE;
   2.345 +				continue;
   2.346 +			}
   2.347 +			*filename_ptr = '\0';
   2.348 +			*++filename_ptr = '/';
   2.349 +
   2.350 +			status = "SKIPPED" BLANK;
   2.351 +			if (valid_name(filename_ptr)) {
   2.352 +				hash_value = hash_file(filename_ptr);
   2.353 +				status = "OK" BLANK;
   2.354 +				if (hash_value == NULL || strcmp((char*)hash_value, line)) {
   2.355 +					return_value = EXIT_FAILURE;
   2.356 +					status = "FAILED" BLANK "\n";
   2.357 +				}
   2.358 +			}
   2.359 +			printf("\r%s: %s", filename_ptr, status);
   2.360 +		}
   2.361 +		fclose(fp);
   2.362 +	} while (*++argv);
   2.363 +	printf("\r" BLANK "\r");
   2.364 +
   2.365 +	return return_value;
   2.366 +}
     3.1 --- a/syslinux/stuff/isolinux.cfg	Fri Mar 30 14:26:56 2012 +0200
     3.2 +++ b/syslinux/stuff/isolinux.cfg	Sat Mar 31 14:27:35 2012 +0200
     3.3 @@ -38,6 +38,11 @@
     3.4  
     3.5  INCLUDE i18n.cfg
     3.6  
     3.7 +LABEL md5sum
     3.8 +	MENU LABEL Check media
     3.9 +	COM32 md5sum.c32
    3.10 +	append /md5sum
    3.11 +
    3.12  LABEL cmdline
    3.13  	MENU LABEL Command Line
    3.14  	MENU QUIT