[hackers] [sbase] Add crypt.[ch] and update md5sum and sha1sum || sin

From: <git_AT_suckless.org>
Date: Thu, 18 Jul 2013 15:51:03 +0200

commit 9ac01f59be72a4f1c922774651e4fd715b1e065e
Author: sin <sin_AT_2f30.org>
Date: Sun Jul 7 15:29:45 2013 +0100

    Add crypt.[ch] and update md5sum and sha1sum
    
    Factor out the code from md5sum and sha1sum into a util function.
    
    Use FILE * instead of a file descriptor. This will make it a bit
    easier/more consistent when we implement support for the -c option.

diff --git a/Makefile b/Makefile
index f825ec4..909f1ce 100644
--- a/Makefile
+++ b/Makefile
_AT_@ -3,13 +3,14 @@ include config.mk
 .POSIX:
 .SUFFIXES: .c .o
 
-HDR = fs.h text.h util.h arg.h
+HDR = crypt.h fs.h text.h md5.h sha1.h util.h arg.h
 LIB = \
         util/afgets.o \
         util/agetcwd.o \
         util/apathmax.o \
         util/concat.o \
         util/cp.o \
+ util/crypt.o \
         util/enmasse.o \
         util/eprintf.o \
         util/estrtol.o \
diff --git a/crypt.h b/crypt.h
new file mode 100644
index 0000000..9eedabf
--- /dev/null
+++ b/crypt.h
_AT_@ -0,0 +1,10 @@
+struct crypt_ops {
+ void (*init)(void *);
+ void (*update)(void *, const void *, unsigned long);
+ void (*sum)(void *, uint8_t *);
+ void *s;
+};
+
+int cryptsum(struct crypt_ops *ops, FILE *fp, const char *f,
+ uint8_t *md);
+void mdprint(const uint8_t *md, const char *f, size_t len);
diff --git a/md5.h b/md5.h
index 0895d3e..0b5005e 100644
--- a/md5.h
+++ b/md5.h
_AT_@ -9,10 +9,10 @@ struct md5 {
 enum { MD5_DIGEST_LENGTH = 16 };
 
 /* reset state */
-void md5_init(struct md5 *s);
+void md5_init(void *ctx);
 /* process message */
-void md5_update(struct md5 *s, const void *m, unsigned long len);
+void md5_update(void *ctx, const void *m, unsigned long len);
 /* get message digest */
 /* state is ruined after sum, keep a copy if multiple sum is needed */
 /* part of the message might be left in s, zero it if secrecy is needed */
-void md5_sum(struct md5 *s, uint8_t md[MD5_DIGEST_LENGTH]);
+void md5_sum(void *ctx, uint8_t md[MD5_DIGEST_LENGTH]);
diff --git a/md5sum.c b/md5sum.c
index 722416f..4fd449f 100644
--- a/md5sum.c
+++ b/md5sum.c
_AT_@ -1,15 +1,18 @@
 /* See LICENSE file for copyright and license details. */
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include "util.h"
+#include "crypt.h"
 #include "md5.h"
 
-static void md5sum(int fd, const char *f);
+struct md5 s;
+struct crypt_ops md5_ops = {
+ md5_init,
+ md5_update,
+ md5_sum,
+ &s,
+};
 
 static void
 usage(void)
_AT_@ -20,7 +23,8 @@ usage(void)
 int
 main(int argc, char *argv[])
 {
- int fd;
+ FILE *fp;
+ uint8_t md[MD5_DIGEST_LENGTH];
 
         ARGBEGIN {
         default:
_AT_@ -28,40 +32,18 @@ main(int argc, char *argv[])
         } ARGEND;
 
         if (argc == 0) {
- md5sum(STDIN_FILENO, "<stdin>");
+ cryptsum(&md5_ops, stdin, "<stdin>", md);
+ mdprint(md, "<stdin>", sizeof(md));
         } else {
                 for (; argc > 0; argc--) {
- if ((fd = open(*argv, O_RDONLY)) < 0)
- eprintf("open %s:", *argv);
- md5sum(fd, *argv);
- close(fd);
+ if ((fp = fopen(*argv, "r")) == NULL)
+ eprintf("fopen %s:", *argv);
+ cryptsum(&md5_ops, fp, *argv, md);
+ mdprint(md, *argv, sizeof(md));
+ fclose(fp);
                         argv++;
                 }
         }
 
         return 0;
 }
-
-static void
-md5sum(int fd, const char *f)
-{
- unsigned char buf[BUFSIZ];
- unsigned char digest[MD5_DIGEST_LENGTH];
- struct md5 s;
- ssize_t n;
- int i;
-
- md5_init(&s);
- while ((n = read(fd, buf, sizeof buf)) > 0)
- md5_update(&s, buf, n);
- if (n < 0) {
- eprintf("%s: read error:", f);
- return;
- }
-
- md5_sum(&s, digest);
-
- for (i = 0; i < sizeof(digest); i++)
- printf("%02x", digest[i]);
- printf(" %s
", f);
-}
diff --git a/sha1.h b/sha1.h
index e11f49e..8631777 100644
--- a/sha1.h
+++ b/sha1.h
_AT_@ -9,10 +9,10 @@ struct sha1 {
 enum { SHA1_DIGEST_LENGTH = 20 };
 
 /* reset state */
-void sha1_init(struct sha1 *s);
+void sha1_init(void *ctx);
 /* process message */
-void sha1_update(struct sha1 *s, const void *m, unsigned long len);
+void sha1_update(void *ctx, const void *m, unsigned long len);
 /* get message digest */
 /* state is ruined after sum, keep a copy if multiple sum is needed */
 /* part of the message might be left in s, zero it if secrecy is needed */
-void sha1_sum(struct sha1 *s, uint8_t md[SHA1_DIGEST_LENGTH]);
+void sha1_sum(void *ctx, uint8_t md[SHA1_DIGEST_LENGTH]);
diff --git a/sha1sum.c b/sha1sum.c
index e38346a..11b9111 100644
--- a/sha1sum.c
+++ b/sha1sum.c
_AT_@ -1,15 +1,18 @@
 /* See LICENSE file for copyright and license details. */
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include "util.h"
+#include "crypt.h"
 #include "sha1.h"
 
-static void sha1sum(int fd, const char *f);
+struct sha1 s;
+struct crypt_ops sha1_ops = {
+ sha1_init,
+ sha1_update,
+ sha1_sum,
+ &s,
+};
 
 static void
 usage(void)
_AT_@ -20,7 +23,8 @@ usage(void)
 int
 main(int argc, char *argv[])
 {
- int fd;
+ FILE *fp;
+ uint8_t md[SHA1_DIGEST_LENGTH];
 
         ARGBEGIN {
         default:
_AT_@ -28,40 +32,18 @@ main(int argc, char *argv[])
         } ARGEND;
 
         if (argc == 0) {
- sha1sum(STDIN_FILENO, "<stdin>");
+ cryptsum(&sha1_ops, stdin, "<stdin>", md);
+ mdprint(md, "<stdin>", sizeof(md));
         } else {
                 for (; argc > 0; argc--) {
- if ((fd = open(*argv, O_RDONLY)) < 0)
- eprintf("open %s:", *argv);
- sha1sum(fd, *argv);
- close(fd);
+ if ((fp = fopen(*argv, "r")) == NULL)
+ eprintf("fopen %s:", *argv);
+ cryptsum(&sha1_ops, fp, *argv, md);
+ mdprint(md, *argv, sizeof(md));
+ fclose(fp);
                         argv++;
                 }
         }
 
         return 0;
 }
-
-static void
-sha1sum(int fd, const char *f)
-{
- unsigned char buf[BUFSIZ];
- unsigned char digest[SHA1_DIGEST_LENGTH];
- struct sha1 s;
- ssize_t n;
- int i;
-
- sha1_init(&s);
- while ((n = read(fd, buf, sizeof buf)) > 0)
- sha1_update(&s, buf, n);
- if (n < 0) {
- eprintf("%s: read error:", f);
- return;
- }
-
- sha1_sum(&s, digest);
-
- for (i = 0; i < sizeof(digest); i++)
- printf("%02x", digest[i]);
- printf(" %s
", f);
-}
diff --git a/util/crypt.c b/util/crypt.c
new file mode 100644
index 0000000..2f05275
--- /dev/null
+++ b/util/crypt.c
_AT_@ -0,0 +1,33 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include "../util.h"
+#include "../crypt.h"
+
+int
+cryptsum(struct crypt_ops *ops, FILE *fp, const char *f,
+ uint8_t *md)
+{
+ unsigned char buf[BUFSIZ];
+ size_t n;
+
+ ops->init(ops->s);
+ while ((n = fread(buf, 1, sizeof(buf), fp)) > 0)
+ ops->update(ops->s, buf, n);
+ if (ferror(fp)) {
+ eprintf("%s: read error:", f);
+ return 1;
+ }
+ ops->sum(ops->s, md);
+ return 0;
+}
+
+void
+mdprint(const uint8_t *md, const char *f, size_t len)
+{
+ size_t i;
+
+ for (i = 0; i < len; i++)
+ printf("%02x", md[i]);
+ printf(" %s
", f);
+}
diff --git a/util/md5.c b/util/md5.c
index 0d8353d..b68f729 100644
--- a/util/md5.c
+++ b/util/md5.c
_AT_@ -95,8 +95,9 @@ static void pad(struct md5 *s)
         processblock(s, s->buf);
 }
 
-void md5_init(struct md5 *s)
+void md5_init(void *ctx)
 {
+ struct md5 *s = ctx;
         s->len = 0;
         s->h[0] = 0x67452301;
         s->h[1] = 0xefcdab89;
_AT_@ -104,8 +105,9 @@ void md5_init(struct md5 *s)
         s->h[3] = 0x10325476;
 }
 
-void md5_sum(struct md5 *s, uint8_t md[16])
+void md5_sum(void *ctx, uint8_t md[16])
 {
+ struct md5 *s = ctx;
         int i;
 
         pad(s);
_AT_@ -117,8 +119,9 @@ void md5_sum(struct md5 *s, uint8_t md[16])
         }
 }
 
-void md5_update(struct md5 *s, const void *m, unsigned long len)
+void md5_update(void *ctx, const void *m, unsigned long len)
 {
+ struct md5 *s = ctx;
         const uint8_t *p = m;
         unsigned r = s->len % 64;
 
diff --git a/util/sha1.c b/util/sha1.c
index 9910d78..a298f9f 100644
--- a/util/sha1.c
+++ b/util/sha1.c
_AT_@ -89,8 +89,10 @@ static void pad(struct sha1 *s)
         processblock(s, s->buf);
 }
 
-void sha1_init(struct sha1 *s)
+void sha1_init(void *ctx)
 {
+ struct sha1 *s = ctx;
+
         s->len = 0;
         s->h[0] = 0x67452301;
         s->h[1] = 0xEFCDAB89;
_AT_@ -99,8 +101,9 @@ void sha1_init(struct sha1 *s)
         s->h[4] = 0xC3D2E1F0;
 }
 
-void sha1_sum(struct sha1 *s, uint8_t md[20])
+void sha1_sum(void *ctx, uint8_t md[20])
 {
+ struct sha1 *s = ctx;
         int i;
 
         pad(s);
_AT_@ -112,8 +115,9 @@ void sha1_sum(struct sha1 *s, uint8_t md[20])
         }
 }
 
-void sha1_update(struct sha1 *s, const void *m, unsigned long len)
+void sha1_update(void *ctx, const void *m, unsigned long len)
 {
+ struct sha1 *s = ctx;
         const uint8_t *p = m;
         unsigned r = s->len % 64;
 
Received on Thu Jul 18 2013 - 15:51:03 CEST

This archive was generated by hypermail 2.3.0 : Thu Jul 18 2013 - 16:00:13 CEST