From ce6750ac69a7a80a18db7f0d7a217cbf37c7a04c Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Thu, 29 Nov 2007 18:32:20 -0600 Subject: [PATCH] Add sha1sum. (No -c mode yet.) Slight tweaks to loopfiles() too. --- lib/lib.c | 2 +- toys/Config.in | 8 +++++ toys/catv.c | 2 +- toys/{sha1.c => sha1sum.c} | 78 +++++++++++++++++----------------------------- toys/toylist.h | 1 + 5 files changed, 39 insertions(+), 52 deletions(-) rename toys/{sha1.c => sha1sum.c} (71%) diff --git a/lib/lib.c b/lib/lib.c index 6aaf7b0..2fd7fb8 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -554,7 +554,7 @@ void loopfiles(char **argv, void (*function)(int fd, char *name)) int fd; // If no arguments, read from stdin. - if (!*argv) function(0, *argv); + if (!*argv) function(0, "-"); else do { // Filename "-" means read from stdin. // Inability to open a file prints a warning, but doesn't exit. diff --git a/toys/Config.in b/toys/Config.in index 0c3cb1e..7c75d25 100644 --- a/toys/Config.in +++ b/toys/Config.in @@ -269,6 +269,14 @@ config READLINK_F -f Show final location, including normal files and multiple symlinks. +config SHA1SUM + bool "sleep" + default y + help + usage: sha1sum [file...] + + Calculate sha1 hash of files (or stdin). + config SLEEP bool "sleep" default y diff --git a/toys/catv.c b/toys/catv.c index e541270..6770c64 100644 --- a/toys/catv.c +++ b/toys/catv.c @@ -12,7 +12,7 @@ // Callback function for loopfiles() -void do_catv(int fd, char *name) +static void do_catv(int fd, char *name) { for(;;) { int i, len; diff --git a/toys/sha1.c b/toys/sha1sum.c similarity index 71% rename from toys/sha1.c rename to toys/sha1sum.c index 7c598c8..6db3b55 100644 --- a/toys/sha1.c +++ b/toys/sha1sum.c @@ -1,15 +1,11 @@ /* + * Copyright 2007 Rob Landley + * * Based on the public domain SHA-1 in C by Steve Reid * from http://www.mirrors.wiretapped.net/security/cryptography/hashes/sha1/ */ -/* #define LITTLE_ENDIAN * This should be #define'd if true. */ -/* #define SHA1HANDSOFF * Copies data before messing with it. */ -#define LITTLE_ENDIAN - -#include -#include -#include +#include struct sha1 { uint32_t state[5]; @@ -23,17 +19,17 @@ struct sha1 { void sha1_init(struct sha1 *this); void sha1_transform(struct sha1 *this); -void sha1_update(struct sha1 *this, unsigned char *data, unsigned int len); -void sha1_final(struct sha1 *this, unsigned char digest[20]); +void sha1_update(struct sha1 *this, char *data, unsigned int len); +void sha1_final(struct sha1 *this, char digest[20]); #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) /* blk0() and blk() perform the initial expand. */ -/* I got the idea of expanding during the round function from SSLeay */ -#ifdef LITTLE_ENDIAN +/* The idea of expanding during the round function comes from SSLeay */ +#if 1 #define blk0(i) (block[i] = (rol(block[i],24)&0xFF00FF00) \ |(rol(block[i],8)&0x00FF00FF)) -#else +#else // big endian? #define blk0(i) block[i] #endif #define blk(i) (block[i&15] = rol(block[(i+13)&15]^block[(i+8)&15] \ @@ -41,14 +37,6 @@ void sha1_final(struct sha1 *this, unsigned char digest[20]); static const uint32_t rconsts[]={0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6}; -void printy(unsigned char *this) -{ - int i; - - for (i = 0; i < 20; i++) printf("%02x", this[i]); - xputc('\n'); -} - /* Hash a single 512-bit block. This is the core of the algorithm. */ void sha1_transform(struct sha1 *this) @@ -106,7 +94,7 @@ void sha1_init(struct sha1 *this) /* Run your data through this function. */ -void sha1_update(struct sha1 *this, unsigned char *data, unsigned int len) +void sha1_update(struct sha1 *this, char *data, unsigned int len) { unsigned int i, j; @@ -130,11 +118,11 @@ void sha1_update(struct sha1 *this, unsigned char *data, unsigned int len) /* Add padding and return the message digest. */ -void sha1_final(struct sha1 *this, unsigned char digest[20]) +void sha1_final(struct sha1 *this, char digest[20]) { uint64_t count = this->count << 3; unsigned int i; - unsigned char buf; + char buf; // End the message by appending a "1" bit to the data, ending with the // message size (in bits, big endian), and adding enough zero bits in @@ -150,41 +138,31 @@ void sha1_final(struct sha1 *this, unsigned char digest[20]) this->buffer.c[56+i] = count >> (8*(7-i)); sha1_transform(this); - for (i = 0; i < 20; i++) { - digest[i] = (unsigned char) - ((this->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); - } + for (i = 0; i < 20; i++) + digest[i] = this->state[i>>2] >> ((3-(i & 3)) * 8); /* Wipe variables */ memset(this, 0, sizeof(struct sha1)); } +// Callback for loopfiles() -/*************************************************************/ - - -int main(int argc, char** argv) +static void do_sha1(int fd, char *name) { - int i, j; struct sha1 this; - unsigned char digest[20], buffer[16384]; - FILE* file; + int len; - if (argc < 2) { - file = stdin; - } - else { - if (!(file = fopen(argv[1], "rb"))) { - fputs("Unable to open file.", stderr); - exit(-1); - } - } sha1_init(&this); - while (!feof(file)) { /* note: what if ferror(file) */ - i = fread(buffer, 1, 16384, file); - sha1_update(&this, buffer, i); + for (;;) { + len = read(fd, toybuf, sizeof(toybuf)); + if (len<1) break; + sha1_update(&this, toybuf, len); } - sha1_final(&this, digest); - fclose(file); - printy(digest); - exit(0); + sha1_final(&this, toybuf); + for (len = 0; len < 20; len++) printf("%02x", toybuf[len]); + printf(" %s\n", name); +} + +void sha1sum_main(void) +{ + loopfiles(toys.optargs, do_sha1); } diff --git a/toys/toylist.h b/toys/toylist.h index 074ddbb..e3fb4d7 100644 --- a/toys/toylist.h +++ b/toys/toylist.h @@ -124,6 +124,7 @@ USE_ONEIT(NEWTOY(oneit, "+<1p", TOYFLAG_SBIN)) USE_PWD(NEWTOY(pwd, NULL, TOYFLAG_BIN)) USE_READLINK(NEWTOY(readlink, "<1f", TOYFLAG_BIN)) USE_TOYSH(OLDTOY(sh, toysh, "c:i", TOYFLAG_BIN)) +USE_SHA1SUM(NEWTOY(sha1sum, NULL, TOYFLAG_USR|TOYFLAG_BIN)) USE_SLEEP(NEWTOY(sleep, "<1", TOYFLAG_BIN)) USE_SYNC(NEWTOY(sync, NULL, TOYFLAG_BIN)) USE_TOUCH(NEWTOY(touch, "l#t:r:mca", TOYFLAG_BIN)) -- 2.7.4