[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
md5.c patch - recognize GNU checksum format
- To: tech@openbsd.org
- Subject: md5.c patch - recognize GNU checksum format
- From: Lawrence Teo <lteo.openbsd1@mailnull.com>
- Date: Tue, 02 Mar 2004 15:03:38 -0500
- User-Agent: Mozilla Thunderbird 0.5 (X11/20040208)
Here's a simple patch to make md5/sha1's -c flag recognize GNU's
checksum format. Unlike BSD, GNU's checksums use the form:
CHECKSUM FILENAME
For example, a GNU MD5 line may look like:
e25bd1eead91463817c3d98b60d64c62 somefile.txt
This patch would make it easier for OpenBSD admins/users to verify
MD5 checksum lists that are frequently distributed using the
GNU MD5 format.
Comments and feedback are welcome. If the code is not up to
OpenBSD's standards, I would appreciate any suggestions on how to
improve it. Thanks!
Lawrence Teo
lcteo_at_uncc.edu
Department of Software and Information Systems
University of North Carolina at Charlotte
--- md5.c.orig Sun Feb 29 18:03:32 2004
+++ md5.c Sun Feb 29 18:06:19 2004
@@ -263,26 +263,63 @@
* Crack the line into an algorithm, filename, and checksum.
* Lines are of the form:
* ALGORITHM (FILENAME) = CHECKSUM
+ *
+ * If that doesn't work, try GNU's form:
+ * CHECKSUM FILENAME
+ *
+ * In GNU's case, the algorithm name is obtained from the
+ * program name.
*/
algorithm = buf;
p = strchr(algorithm, ' ');
- if (p == NULL || *(p + 1) != '(')
- continue;
- *p = '\0';
- len = strlen(algorithm);
- if (len > algorithm_max || len < algorithm_min)
- continue;
+ if (p == NULL || *(p + 1) != '(') {
+ /* GNU form: Obtain algorithm name from program name */
+ for (hf = functions; hf->name != NULL; hf++) {
+ if (strcasecmp(__progname, hf->name) == 0)
+ break;
+ }
+ if (hf->name == NULL)
+ continue;
+ algorithm = hf->name;
- filename = p + 2;
- p = strrchr(filename, ')');
- if (p == NULL || strncmp(p + 1, " = ", (size_t)3) != 0)
- continue;
- *p = '\0';
+ checksum = buf;
+ p = strchr(checksum, ' ');
+ if (p == NULL)
+ continue;
+ *p = '\0';
+ p++;
- checksum = p + 4;
- p = strpbrk(checksum, " \t\r");
- if (p != NULL)
+ while (isspace(*p))
+ p++;
+
+ if (*p == '\0')
+ continue;
+
+ filename = p;
+ if (filename == NULL)
+ continue;
+
+ p = strpbrk(filename, " \t\r");
+ if (p != NULL)
+ *p = '\0';
+ } else {
+ /* Continue with BSD's form */
*p = '\0';
+ len = strlen(algorithm);
+ if (len > algorithm_max || len < algorithm_min)
+ continue;
+
+ filename = p + 2;
+ p = strrchr(filename, ')');
+ if (p == NULL || strncmp(p + 1, " = ", (size_t)3) != 0)
+ continue;
+ *p = '\0';
+
+ checksum = p + 4;
+ p = strpbrk(checksum, " \t\r");
+ if (p != NULL)
+ *p = '\0';
+ }
/*
* Check that the algorithm is one we recognize.