commit a392cd475e1d164c940ab3e3cb893f533af2445a
parent ae1da536bb25e7af5e6a6b246e9895178cfe8c2e
Author: Mattias Andrée <maandree@kth.se>
Date: Wed, 24 Feb 2016 11:36:59 +0100
add sha512-224sum (SHA512/224) and sha512-256sum (SHA512/256)
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat:
10 files changed, 347 insertions(+), 109 deletions(-)
diff --git a/Makefile b/Makefile
@@ -15,6 +15,8 @@ HDR =\
sha256.h\
sha384.h\
sha512.h\
+ sha512-224.h\
+ sha512-256.h\
text.h\
utf.h\
util.h
@@ -68,6 +70,8 @@ LIBUTILSRC =\
libutil/sha256.c\
libutil/sha384.c\
libutil/sha512.c\
+ libutil/sha512-224.c\
+ libutil/sha512-256.c\
libutil/strcasestr.c\
libutil/strlcat.c\
libutil/strlcpy.c\
@@ -141,6 +145,8 @@ BIN =\
sha256sum\
sha384sum\
sha512sum\
+ sha512-224sum\
+ sha512-256sum\
sleep\
sort\
split\
@@ -227,21 +233,21 @@ sbase-box: $(LIB) $(SRC)
mkdir -p build
cp $(HDR) build
cp confstr_l.h limits_l.h sysconf_l.h pathconf_l.h build
- for f in $(SRC); do sed "s/^main(/$${f%.c}_&/" < $$f > build/$$f; done
- echo '#include <libgen.h>' > build/$@.c
- echo '#include <stdio.h>' >> build/$@.c
- echo '#include <stdlib.h>' >> build/$@.c
- echo '#include <string.h>' >> build/$@.c
- echo '#include "util.h"' >> build/$@.c
- for f in $(SRC); do echo "int $${f%.c}_main(int, char **);"; done >> build/$@.c
- echo 'int main(int argc, char *argv[]) { char *s = basename(argv[0]);' >> build/$@.c
- echo 'if(!strcmp(s,"sbase-box")) { argc--; argv++; s = basename(argv[0]); } if(0) ;' >> build/$@.c
- echo "else if (!strcmp(s, \"install\")) return xinstall_main(argc, argv);" >> build/$@.c
- echo "else if (!strcmp(s, \"[\")) return test_main(argc, argv);" >> build/$@.c
- for f in $(SRC); do echo "else if(!strcmp(s, \"$${f%.c}\")) return $${f%.c}_main(argc, argv);"; done >> build/$@.c
- echo 'else { fputs("[ ", stdout);' >> build/$@.c
- for f in $(SRC); do echo "fputs(\"$${f%.c} \", stdout);"; done >> build/$@.c
- echo 'putchar(0xa); }; return 0; }' >> build/$@.c
+ for f in $(SRC); do sed "s/^main(/$$(echo "$${f%.c}" | sed s/-/_/g)_&/" < $$f > build/$$f; done
+ echo '#include <libgen.h>' > build/$@.c
+ echo '#include <stdio.h>' >> build/$@.c
+ echo '#include <stdlib.h>' >> build/$@.c
+ echo '#include <string.h>' >> build/$@.c
+ echo '#include "util.h"' >> build/$@.c
+ for f in $(SRC); do echo "int $$(echo "$${f%.c}" | sed s/-/_/g)_main(int, char **);"; done >> build/$@.c
+ echo 'int main(int argc, char *argv[]) { char *s = basename(argv[0]);' >> build/$@.c
+ echo 'if(!strcmp(s,"sbase-box")) { argc--; argv++; s = basename(argv[0]); } if(0) ;' >> build/$@.c
+ echo "else if (!strcmp(s, \"install\")) return xinstall_main(argc, argv);" >> build/$@.c
+ echo "else if (!strcmp(s, \"[\")) return test_main(argc, argv);" >> build/$@.c
+ for f in $(SRC); do echo "else if(!strcmp(s, \"$${f%.c}\")) return $$(echo "$${f%.c}" | sed s/-/_/g)_main(argc, argv);"; done >> build/$@.c
+ echo 'else { fputs("[ ", stdout);' >> build/$@.c
+ for f in $(SRC); do echo "fputs(\"$${f%.c} \", stdout);"; done >> build/$@.c
+ echo 'putchar(0xa); }; return 0; }' >> build/$@.c
$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ build/*.c $(LIB)
rm -r build
diff --git a/README b/README
@@ -10,100 +10,102 @@ The following tools are implemented:
'|' -> Audited, 'o' -> POSIX 2013 compliant, 'x' -> Non-POSIX,
'()' -> Petty flag
- UTILITY MISSING
- ------- -------
-=*|o basename .
-=*|o cal .
-=*|o cat .
-=*|o chgrp .
-=*|o chmod .
-=*|o chown .
-=*|x chroot .
-=*|o cksum .
-=*|o cmp .
-#*|x cols .
-=*|o comm .
-=*|o cp (-i)
-=*|x cron .
-#*|o cut .
-=*|o date .
-=*|o dirname .
-=*|o du .
-=*|o echo .
- o ed .
-=*|o env .
-#*|o expand .
-#*|o expr .
-=*|o false .
-= find .
-=* x flock .
-#*|o fold .
-=*|o getconf (-v)
-=*|o grep .
-=*|o head .
-=*|x hostname .
-=*|x install .
-=* o join .
-=*|o kill .
-=*|o link .
-=*|o ln .
-=*|o logger .
-=*|o logname .
-#* o ls (-C, -k, -m, -p, -s, -x)
-=*|x md5sum .
-=*|o mkdir .
-=*|o mkfifo .
-=*|x mktemp .
-=*|o mv (-i)
-=*|o nice .
-#*|o nl .
-=*|o nohup .
-=*|o od .
-#* o pathchk .
-#*|o paste .
-=*|x printenv .
-#*|o printf .
-=*|o pwd .
-=*|x readlink .
-=*|o renice .
-=*|o rm (-i)
-=*|o rmdir .
-# sed .
-=*|x seq .
-=*|x setsid .
-=*|x sha1sum .
-=* x sha224sum .
-=*|x sha256sum .
-=* x sha238sum .
-=*|x sha512sum .
-=*|o sleep .
-#*|o sort .
-=*|o split .
-=*|x sponge .
-#*|o strings .
-=*|x sync .
-=*|o tail .
-=*|x tar .
-=*|o tee .
-=*|o test .
-=*|x tftp .
-=*|o time .
-=*|o touch .
-#*|o tr .
-=*|o true .
-=* o tsort .
-=*|o tty .
-=*|o uname .
-#*|o unexpand .
-=*|o uniq .
-=*|o unlink .
-=*|o uudecode .
-=*|o uuencode .
-#*|o wc .
-=*|x which .
-=*|x whoami .
-=*|o xargs (-p)
-=*|x yes .
+ UTILITY MISSING
+ ------- -------
+=*|o basename .
+=*|o cal .
+=*|o cat .
+=*|o chgrp .
+=*|o chmod .
+=*|o chown .
+=*|x chroot .
+=*|o cksum .
+=*|o cmp .
+#*|x cols .
+=*|o comm .
+=*|o cp (-i)
+=*|x cron .
+#*|o cut .
+=*|o date .
+=*|o dirname .
+=*|o du .
+=*|o echo .
+ o ed .
+=*|o env .
+#*|o expand .
+#*|o expr .
+=*|o false .
+= find .
+=* x flock .
+#*|o fold .
+=*|o getconf (-v)
+=*|o grep .
+=*|o head .
+=*|x hostname .
+=*|x install .
+=* o join .
+=*|o kill .
+=*|o link .
+=*|o ln .
+=*|o logger .
+=*|o logname .
+#* o ls (-C, -k, -m, -p, -s, -x)
+=*|x md5sum .
+=*|o mkdir .
+=*|o mkfifo .
+=*|x mktemp .
+=*|o mv (-i)
+=*|o nice .
+#*|o nl .
+=*|o nohup .
+=*|o od .
+#* o pathchk .
+#*|o paste .
+=*|x printenv .
+#*|o printf .
+=*|o pwd .
+=*|x readlink .
+=*|o renice .
+=*|o rm (-i)
+=*|o rmdir .
+# sed .
+=*|x seq .
+=*|x setsid .
+=*|x sha1sum .
+=* x sha224sum .
+=*|x sha256sum .
+=* x sha238sum .
+=*|x sha512sum .
+=* x sha512-224sum .
+=* x sha512-256sum .
+=*|o sleep .
+#*|o sort .
+=*|o split .
+=*|x sponge .
+#*|o strings .
+=*|x sync .
+=*|o tail .
+=*|x tar .
+=*|o tee .
+=*|o test .
+=*|x tftp .
+=*|o time .
+=*|o touch .
+#*|o tr .
+=*|o true .
+=* o tsort .
+=*|o tty .
+=*|o uname .
+#*|o unexpand .
+=*|o uniq .
+=*|o unlink .
+=*|o uudecode .
+=*|o uuencode .
+#*|o wc .
+=*|x which .
+=*|x whoami .
+=*|o xargs (-p)
+=*|x yes .
The complement of sbase is ubase[1] which is Linux-specific and
provides all the non-portable tools. Together they are intended to
diff --git a/libutil/sha512-224.c b/libutil/sha512-224.c
@@ -0,0 +1,26 @@
+/* public domain sha512/224 implementation based on fips180-3 */
+#include <stdint.h>
+#include "../sha512-224.h"
+
+extern void sha512_sum_n(void *, uint8_t *, int n);
+
+void
+sha512_224_init(void *ctx)
+{
+ struct sha512_224 *s = ctx;
+ s->len = 0;
+ s->h[0] = 0x8c3d37c819544da2ULL;
+ s->h[1] = 0x73e1996689dcd4d6ULL;
+ s->h[2] = 0x1dfab7ae32ff9c82ULL;
+ s->h[3] = 0x679dd514582f9fcfULL;
+ s->h[4] = 0x0f6d2b697bd44da8ULL;
+ s->h[5] = 0x77e36f7304c48942ULL;
+ s->h[6] = 0x3f9d85a86a1d36c8ULL;
+ s->h[7] = 0x1112e6ad91d692a1ULL;
+}
+
+void
+sha512_224_sum(void *ctx, uint8_t md[SHA512_224_DIGEST_LENGTH])
+{
+ sha512_sum_n(ctx, md, 4);
+}
diff --git a/libutil/sha512-256.c b/libutil/sha512-256.c
@@ -0,0 +1,26 @@
+/* public domain sha512/256 implementation based on fips180-3 */
+#include <stdint.h>
+#include "../sha512-256.h"
+
+extern void sha512_sum_n(void *, uint8_t *, int n);
+
+void
+sha512_256_init(void *ctx)
+{
+ struct sha512_256 *s = ctx;
+ s->len = 0;
+ s->h[0] = 0x22312194fc2bf72cULL;
+ s->h[1] = 0x9f555fa3c84c64c2ULL;
+ s->h[2] = 0x2393b86b6f53b151ULL;
+ s->h[3] = 0x963877195940eabdULL;
+ s->h[4] = 0x96283ee2a88effe3ULL;
+ s->h[5] = 0xbe5e1e2553863992ULL;
+ s->h[6] = 0x2b0199fc2c85b8aaULL;
+ s->h[7] = 0x0eb72ddc81c52ca2ULL;
+}
+
+void
+sha512_256_sum(void *ctx, uint8_t md[SHA512_256_DIGEST_LENGTH])
+{
+ sha512_sum_n(ctx, md, 4);
+}
diff --git a/sha512-224.h b/sha512-224.h
@@ -0,0 +1,16 @@
+/* public domain sha512/224 implementation based on fips180-3 */
+
+#include "sha512.h"
+
+#define sha512_224 sha512 /*struct*/
+
+enum { SHA512_224_DIGEST_LENGTH = 28 };
+
+/* reset state */
+void sha512_224_init(void *ctx);
+/* process message */
+#define sha512_224_update sha512_update
+/* 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 sha512_224_sum(void *ctx, uint8_t md[SHA512_224_DIGEST_LENGTH]);
diff --git a/sha512-224sum.1 b/sha512-224sum.1
@@ -0,0 +1,32 @@
+.Dd 2016-02-24
+.Dt SHA512-224SUM 1
+.Os sbase
+.Sh NAME
+.Nm sha512-224sum
+.Nd compute or check SHA-512/224 message digests
+.Sh SYNOPSIS
+.Nm
+.Op Fl c
+.Op Ar file ...
+.Sh DESCRIPTION
+.Nm
+writes SHA-512/224 (224-bit) checksums of each
+.Ar file
+to stdout.
+If no
+.Ar file
+is given
+.Nm
+reads from stdin.
+.Sh OPTIONS
+.Bl -tag -width Ds
+.It Fl c
+Read list of SHA-512/224 checksums from each
+.Ar file
+and check them.
+If no
+.Ar file
+is given
+.Nm
+reads from stdin.
+.El
diff --git a/sha512-224sum.c b/sha512-224sum.c
@@ -0,0 +1,41 @@
+/* See LICENSE file for copyright and license details. */
+#include <stdint.h>
+#include <stdio.h>
+
+#include "crypt.h"
+#include "sha512-224.h"
+#include "util.h"
+
+static struct sha512_224 s;
+struct crypt_ops sha512_224_ops = {
+ sha512_224_init,
+ sha512_224_update,
+ sha512_224_sum,
+ &s,
+};
+
+static void
+usage(void)
+{
+ eprintf("usage: %s [-c] [file ...]\n", argv0);
+}
+
+int
+main(int argc, char *argv[])
+{
+ int ret = 0, (*cryptfunc)(int, char **, struct crypt_ops *, uint8_t *, size_t) = cryptmain;
+ uint8_t md[SHA512_224_DIGEST_LENGTH];
+
+ ARGBEGIN {
+ case 'c':
+ cryptfunc = cryptcheck;
+ break;
+ default:
+ usage();
+ } ARGEND
+
+ ret |= cryptfunc(argc, argv, &sha512_224_ops, md, sizeof(md));
+ ret |= fshut(stdin, "<stdin>") | fshut(stdout, "<stdout>");
+
+ return ret;
+}
diff --git a/sha512-256.h b/sha512-256.h
@@ -0,0 +1,16 @@
+/* public domain sha512/256 implementation based on fips180-3 */
+
+#include "sha512.h"
+
+#define sha512_256 sha512 /*struct*/
+
+enum { SHA512_256_DIGEST_LENGTH = 32 };
+
+/* reset state */
+void sha512_256_init(void *ctx);
+/* process message */
+#define sha512_256_update sha512_update
+/* 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 sha512_256_sum(void *ctx, uint8_t md[SHA512_256_DIGEST_LENGTH]);
diff --git a/sha512-256sum.1 b/sha512-256sum.1
@@ -0,0 +1,32 @@
+.Dd 2016-02-24
+.Dt SHA512-256SUM 1
+.Os sbase
+.Sh NAME
+.Nm sha512-256sum
+.Nd compute or check SHA-512/256 message digests
+.Sh SYNOPSIS
+.Nm
+.Op Fl c
+.Op Ar file ...
+.Sh DESCRIPTION
+.Nm
+writes SHA-512/256 (256-bit) checksums of each
+.Ar file
+to stdout.
+If no
+.Ar file
+is given
+.Nm
+reads from stdin.
+.Sh OPTIONS
+.Bl -tag -width Ds
+.It Fl c
+Read list of SHA-512/256 checksums from each
+.Ar file
+and check them.
+If no
+.Ar file
+is given
+.Nm
+reads from stdin.
+.El
diff --git a/sha512-256sum.c b/sha512-256sum.c
@@ -0,0 +1,41 @@
+/* See LICENSE file for copyright and license details. */
+#include <stdint.h>
+#include <stdio.h>
+
+#include "crypt.h"
+#include "sha512-256.h"
+#include "util.h"
+
+static struct sha512_256 s;
+struct crypt_ops sha512_256_ops = {
+ sha512_256_init,
+ sha512_256_update,
+ sha512_256_sum,
+ &s,
+};
+
+static void
+usage(void)
+{
+ eprintf("usage: %s [-c] [file ...]\n", argv0);
+}
+
+int
+main(int argc, char *argv[])
+{
+ int ret = 0, (*cryptfunc)(int, char **, struct crypt_ops *, uint8_t *, size_t) = cryptmain;
+ uint8_t md[SHA512_256_DIGEST_LENGTH];
+
+ ARGBEGIN {
+ case 'c':
+ cryptfunc = cryptcheck;
+ break;
+ default:
+ usage();
+ } ARGEND
+
+ ret |= cryptfunc(argc, argv, &sha512_256_ops, md, sizeof(md));
+ ret |= fshut(stdin, "<stdin>") | fshut(stdout, "<stdout>");
+
+ return ret;
+}