<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">diff --git a/pkgtools/digest/files/COPYING b/pkgtools/digest/files/COPYING
--- a/pkgtools/digest/files/COPYING
+++ b/pkgtools/digest/files/COPYING
@@ -1,30 +1,24 @@
-/*
- * Copyright (c) 2001 Alistair G. Crooks.  All rights reserved.
+/*-
+ * Copyright (c) 2001-2016 Alistair Crooks &lt;agc@NetBSD.org&gt;
+ * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by Alistair G. Crooks.
- * 4. The name of the author may not be used to endorse or promote
- *    products derived from this software without specific prior written
- *    permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
diff --git a/pkgtools/digest/files/Makefile.in b/pkgtools/digest/files/Makefile.in
--- a/pkgtools/digest/files/Makefile.in
+++ b/pkgtools/digest/files/Makefile.in
@@ -37,22 +37,23 @@ LIBS= @LIBS@
 CPPFLAGS= @CPPFLAGS@
 DEFS= @DEFS@ -I. -I@srcdir@ -DHOST=\"$(CANONICAL_HOST)\" -DVERSION=\"$(PACKAGE_VERSION)\"
 CFLAGS= @CFLAGS@
 LDFLAGS= @LDFLAGS@
 
 LINK= $(CCLD) $(CFLAGS) $(LDFLAGS) -o $@
 COMPILE= $(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS)
 
-digest_OBJS = digest.o md5c.o rmd160.o rmd160hl.o sha2.o sha2hl.o \
-md5hl.o sha1.o sha1hl.o tiger.o whirlpool.o
+digest_OBJS = digest.o keccak.o md5c.o md5hl.o rmd160.o \
+rmd160hl.o sha1.o sha1hl.o sha2.o sha2hl.o sha3.o sha3hl.o \
+tiger.o whirlpool.o
 
-SRCS= digest.c md5c.c rmd160.c rmd160hl.c sha2.c sha2hl.c md5hl.c sha1.c \
-sha1hl.c md5.h rmd160.h sha1.h sha2.h tiger.c tiger.h whirlpool.c \
-whirlpool.h
+SRCS= digest.c md5c.c rmd160.c rmd160hl.c sha2.c \
+sha2hl.c md5hl.c sha1.c sha1hl.c md5.h rmd160.h \
+sha1.h sha2.h tiger.c tiger.h whirlpool.c whirlpool.h
 
 DISTFILES= $(SRCS) AUTHORS COPYING DESCR INSTALL Makefile.in NEWS aclocal.m4 \
 config.guess config.h.in config.sub configure configure.ac install-sh \
 missing mkinstalldirs regress.sh
 
 .c.o:
 	$(COMPILE) -c $&lt; -o $@
 
diff --git a/pkgtools/digest/files/configure b/pkgtools/digest/files/configure
--- a/pkgtools/digest/files/configure
+++ b/pkgtools/digest/files/configure
@@ -1,11 +1,11 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for nbsd-digest 20121220.
+# Generated by GNU Autoconf 2.69 for nbsd-digest 20160216.
 #
 # Report bugs to &lt;agc@netbsd.org&gt;.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
 #
 #
 # This configure script is free software; the Free Software Foundation
@@ -575,18 +575,18 @@ LIBOBJS=
 cross_compiling=no
 subdirs=
 MFLAGS=
 MAKEFLAGS=
 
 # Identity of this package.
 PACKAGE_NAME='nbsd-digest'
 PACKAGE_TARNAME='nbsd-digest'
-PACKAGE_VERSION='20121220'
-PACKAGE_STRING='nbsd-digest 20121220'
+PACKAGE_VERSION='20160216'
+PACKAGE_STRING='nbsd-digest 20160216'
 PACKAGE_BUGREPORT='agc@netbsd.org'
 PACKAGE_URL=''
 
 ac_unique_file="digest.c"
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include &lt;stdio.h&gt;
 #ifdef HAVE_SYS_TYPES_H
@@ -1237,17 +1237,17 @@ done
 
 #
 # Report the --help message.
 #
 if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat &lt;&lt;_ACEOF
-\`configure' configures nbsd-digest 20121220 to adapt to many kinds of systems.
+\`configure' configures nbsd-digest 20160216 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
 To assign environment variables (e.g., CC, CFLAGS...), specify them as
 VAR=VALUE.  See below for descriptions of some of the useful variables.
 
 Defaults for the options are specified in brackets.
 
@@ -1307,17 +1307,17 @@ Program names:
 System types:
   --build=BUILD     configure for building on BUILD [guessed]
   --host=HOST       cross-compile to build programs to run on HOST [BUILD]
 _ACEOF
 fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of nbsd-digest 20121220:";;
+     short | recursive ) echo "Configuration of nbsd-digest 20160216:";;
    esac
   cat &lt;&lt;\_ACEOF
 
 Some influential environment variables:
   CC          C compiler command
   CFLAGS      C compiler flags
   LDFLAGS     linker flags, e.g. -L&lt;lib dir&gt; if you have libraries in a
               nonstandard directory &lt;lib dir&gt;
@@ -1387,17 +1387,17 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_
     fi || ac_status=$?
     cd "$ac_pwd" || { ac_status=$?; break; }
   done
 fi
 
 test -n "$ac_init_help" &amp;&amp; exit $ac_status
 if $ac_init_version; then
   cat &lt;&lt;\_ACEOF
-nbsd-digest configure 20121220
+nbsd-digest configure 20160216
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
   exit
 fi
@@ -1932,17 +1932,17 @@ eval ac_res=\$$3
 $as_echo "$ac_res" &gt;&amp;6; }
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_func
 cat &gt;config.log &lt;&lt;_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by nbsd-digest $as_me 20121220, which was
+It was created by nbsd-digest $as_me 20160216, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
 
 _ACEOF
 exec 5&gt;&gt;config.log
 {
 cat &lt;&lt;_ASUNAME
@@ -4702,17 +4702,17 @@ exec 6&gt;&amp;1
 _ASEOF
 test $as_write_fail = 0 &amp;&amp; chmod +x $CONFIG_STATUS || ac_write_fail=1
 
 cat &gt;&gt;$CONFIG_STATUS &lt;&lt;\_ACEOF || ac_write_fail=1
 # Save the log message, to keep $0 and so on meaningful, and to
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by nbsd-digest $as_me 20121220, which was
+This file was extended by nbsd-digest $as_me 20160216, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
   CONFIG_LINKS    = $CONFIG_LINKS
   CONFIG_COMMANDS = $CONFIG_COMMANDS
   $ $0 $@
 
@@ -4764,17 +4764,17 @@ Configuration headers:
 $config_headers
 
 Report bugs to &lt;agc@netbsd.org&gt;."
 
 _ACEOF
 cat &gt;&gt;$CONFIG_STATUS &lt;&lt;_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&amp;/g'`"
 ac_cs_version="\\
-nbsd-digest config.status 20121220
+nbsd-digest config.status 20160216
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
 Copyright (C) 2012 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
 ac_pwd='$ac_pwd'
diff --git a/pkgtools/digest/files/configure.ac b/pkgtools/digest/files/configure.ac
--- a/pkgtools/digest/files/configure.ac
+++ b/pkgtools/digest/files/configure.ac
@@ -1,12 +1,12 @@
 dnl $Id: configure.ac,v 1.18 2013/01/03 10:20:31 dholland Exp $
 dnl Process this file with autoconf to produce a configure script.
 AC_PREREQ(2.57)
-AC_INIT([nbsd-digest],[20121220],[agc@netbsd.org])
+AC_INIT([nbsd-digest],[20160216],[agc@netbsd.org])
 AC_CONFIG_SRCDIR([digest.c])
 AC_CONFIG_HEADER(config.h)
 AC_ARG_PROGRAM
 
 AC_CANONICAL_HOST
 CANONICAL_HOST=$host
 AC_SUBST(CANONICAL_HOST)
 
diff --git a/pkgtools/digest/files/digest.1 b/pkgtools/digest/files/digest.1
--- a/pkgtools/digest/files/digest.1
+++ b/pkgtools/digest/files/digest.1
@@ -1,58 +1,65 @@
-.\" $NetBSD: digest.1,v 1.7 2013/07/20 21:50:52 wiz Exp $
+.\" $NetBSD: genraidconf.8,v 1.3 2011/05/17 11:23:41 wiz Exp $
 .\"
-.\"
-.\" Copyright (c) 2001 Alistair G. Crooks.  All rights reserved.
+.\" Copyright (c) 2001-2016 Alistair Crooks &lt;agc@NetBSD.org&gt;
+.\" All rights reserved.
 .\"
 .\" Redistribution and use in source and binary forms, with or without
 .\" modification, are permitted provided that the following conditions
 .\" are met:
 .\" 1. Redistributions of source code must retain the above copyright
 .\"    notice, this list of conditions and the following disclaimer.
 .\" 2. Redistributions in binary form must reproduce the above copyright
 .\"    notice, this list of conditions and the following disclaimer in the
 .\"    documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\"    must display the following acknowledgement:
-.\"	This product includes software developed by Alistair G. Crooks.
-.\" 4. The name of the author may not be used to endorse or promote
-.\"    products derived from this software without specific prior written
-.\"    permission.
 .\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
-.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-.\" SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\"
-.Dd March 23, 2005
+.Dd February 16, 2016
 .Dt DIGEST 1
 .Os
 .Sh NAME
 .Nm digest
 .Nd calculate message digests
 .Sh SYNOPSIS
 .Nm
+.Op Fl "Vt"
 .Ar algorithm
-.Op file ...
+.Op Ar
 .Sh DESCRIPTION
 The
 .Nm
 utility calculates message digests of files or,
 if no file is specified, standard input.
+.Pp
+It can also run self tests via the
+.Fl t
+command line option; the only self tests currently defined are
+for the
+.Dv SHA3
+set of digests.
+.Pp
+The
+.Fl V
+command line option prints the version number of
+.Nm
+and exits successfully.
+.Pp
 The list of possible algorithms is:
-.Bl -tag -width Ds
+.Bl -tag -width SHA3_512xxx
 .It md5
 the
 .Xr md5 3
 algorithm will be used.
 .It rmd160
 the
 .Xr rmd160 3
 algorithm will be used.
@@ -63,16 +70,32 @@ algorithm will be used.
 .It sha256
 the
 sha256
 algorithm will be used.
 .It sha384
 the
 sha384
 algorithm will be used.
+.It sha3_224
+the
+sha3_224
+algorithm will be used.
+.It sha3_256
+the
+sha3_256
+algorithm will be used.
+.It sha3_384
+the
+sha3_384
+algorithm will be used.
+.It sha3_512
+the
+sha3_512
+algorithm will be used.
 .It sha512
 the
 sha512
 algorithm will be used.
 .It tiger
 the
 tiger
 algorithm will be used.
diff --git a/pkgtools/digest/files/digest.c b/pkgtools/digest/files/digest.c
--- a/pkgtools/digest/files/digest.c
+++ b/pkgtools/digest/files/digest.c
@@ -1,61 +1,49 @@
 /*	$NetBSD: digest.c,v 1.15 2007/09/21 18:44:36 joerg Exp $ */
 
-/*
- * Copyright (c) 2001-2005 Alistair G. Crooks.  All rights reserved.
+/*-
+ * Copyright (c) 2001-2016 Alistair Crooks &lt;agc@NetBSD.org&gt;
+ * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by Alistair G. Crooks.
- * 4. The name of the author may not be used to endorse or promote
- *    products derived from this software without specific prior written
- *    permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#ifndef lint
-__COPYRIGHT("@(#) Copyright (c) 2001-2005 \
-	        The NetBSD Foundation, Inc.  All rights reserved.");
-__RCSID("$NetBSD: digest.c,v 1.15 2007/09/21 18:44:36 joerg Exp $");
-#endif
-
-
 #ifdef HAVE_ERRNO_H
 #include &lt;errno.h&gt;
 #endif
 #ifdef HAVE_LOCALE_H
 #include &lt;locale.h&gt;
 #endif
 #include &lt;md5.h&gt;
 #include &lt;rmd160.h&gt;
 #include &lt;sha1.h&gt;
 #include &lt;sha2.h&gt;
+#include &lt;sha3.h&gt;
 #include &lt;stdio.h&gt;
 #include &lt;stdlib.h&gt;
 #include &lt;string.h&gt;
 #include &lt;tiger.h&gt;
 #include &lt;whirlpool.h&gt;
 #ifdef HAVE_UNISTD_H
 #include &lt;unistd.h&gt;
 #endif
@@ -74,16 +62,20 @@ typedef struct alg_t {
 	HASH_end	hash_end;
 	HASH_file	hash_file;
 	union {
 		MD5_CTX			m;
 		SHA1_CTX		sha;
 		RMD160_CTX		rmd;
 		SHA256_CTX		sha256;
 		SHA384_CTX		sha384;
+		SHA3_224_CTX		sha3_224;
+		SHA3_256_CTX		sha3_256;
+		SHA3_384_CTX		sha3_384;
+		SHA3_512_CTX		sha3_512;
 		SHA512_CTX		sha512;
 		tiger_context_t		tiger;
 		whirlpool_context_t	whirlpool;
 	} hash_ctx, hash_ctx2;
 } alg_t;
 
 /* list of supported message digest algorithms */
 static alg_t algorithms[] = {
@@ -94,16 +86,28 @@ static alg_t algorithms[] = {
 	  (HASH_init) RMD160Init,	(HASH_update) RMD160Update,
 	  (HASH_end) RMD160End,		(HASH_file) RMD160File },
 	{ "SHA1",	20,
 	  (HASH_init) SHA1Init,		(HASH_update) SHA1Update,
 	  (HASH_end) SHA1End,		(HASH_file) SHA1File },
 	{ "SHA256",	SHA256_DIGEST_LENGTH,
 	  (HASH_init) SHA256_Init,	(HASH_update) SHA256_Update,
 	  (HASH_end) SHA256_End,	(HASH_file) SHA256_File },
+	{ "SHA3_224",	SHA3_224_DIGEST_LENGTH,
+	  (HASH_init) SHA3_224_Init,	(HASH_update) SHA3_224_Update,
+	  (HASH_end) SHA3_224_End,	(HASH_file) SHA3_224_File },
+	{ "SHA3_256",	SHA3_256_DIGEST_LENGTH,
+	  (HASH_init) SHA3_256_Init,	(HASH_update) SHA3_256_Update,
+	  (HASH_end) SHA3_256_End,	(HASH_file) SHA3_256_File },
+	{ "SHA3_384",	SHA3_384_DIGEST_LENGTH,
+	  (HASH_init) SHA3_384_Init,	(HASH_update) SHA3_384_Update,
+	  (HASH_end) SHA3_384_End,	(HASH_file) SHA3_384_File },
+	{ "SHA3_512",	SHA3_512_DIGEST_LENGTH,
+	  (HASH_init) SHA3_512_Init,	(HASH_update) SHA3_512_Update,
+	  (HASH_end) SHA3_512_End,	(HASH_file) SHA3_512_File },
 	{ "SHA384",	SHA384_DIGEST_LENGTH,
 	  (HASH_init) SHA384_Init,	(HASH_update) SHA384_Update,
 	  (HASH_end) SHA384_End,	(HASH_file) SHA384_File },
 	{ "SHA512",	SHA512_DIGEST_LENGTH,
 	  (HASH_init) SHA512_Init,	(HASH_update) SHA512_Update,
 	  (HASH_end) SHA512_End,	(HASH_file) SHA512_File },
 	{ "TIGER",	24,
 	  (HASH_init) TIGERInit,	(HASH_update) TIGERUpdate,
@@ -156,51 +160,63 @@ digest_file(char *fn, alg_t *alg)
 
 	return (rc);
 }
 
 int
 main(int argc, char **argv)
 {
 	alg_t  *alg;
-	int	rval;
+	int	test;
+	int	ok;
 	int	i;
 
 #ifdef HAVE_SETLOCALE
 	(void) setlocale(LC_ALL, "");
 #endif
-	while ((i = getopt(argc, argv, "V")) != -1) {
+	test = 0;
+	while ((i = getopt(argc, argv, "Vt")) != -1) {
 		switch(i) {
 		case 'V':
 			printf("%s\n", VERSION);
 			return EXIT_SUCCESS;
+		case 't':
+			test = 1;
+			break;
 		}
 	}
-	argc -= optind;
-	argv += optind;
-	
-	if (argc == 0) {
+	if (test) {
+		/* there's room for other tests here -- agc */
+		printf("self test mode starting\n");
+		ok = 1;
+		if (SHA3_Selftest() != 0) {
+			ok = 0;
+		}
+		printf("self test mode completed\n");
+		return (ok) ? EXIT_SUCCESS : EXIT_FAILURE;
+	}
+	/* check for correct usage */
+	if (argc == optind) {
 		(void) fprintf(stderr, "Usage: %s algorithm [file...]\n",
-		    argv[-optind]);
+		    argv[0]);
 		return EXIT_FAILURE;
 	}
-	if ((alg = find_algorithm(argv[0])) == NULL) {
-		(void) fprintf(stderr, "No such algorithm `%s'\n", argv[0]);
+	/* check we know the digest algorithm */
+	if ((alg = find_algorithm(argv[optind])) == NULL) {
+		(void) fprintf(stderr, "No such algorithm `%s'\n", argv[optind]);
 		exit(EXIT_FAILURE);
 	}
-	argc--;
-	argv++;
-	rval = EXIT_SUCCESS;
-	if (argc == 0) {
+	ok = 1;
+	if (argc == optind + 1) {
 		if (!digest_file(NULL, alg)) {
-			(void) fprintf(stderr, "stdin\n");
-			rval = EXIT_FAILURE;
+			fprintf(stderr, "stdin\n");
+			ok = 0;
 		}
 	} else {
-		for (i = 0 ; i &lt; argc ; i++) {
+		for (i = optind + 1 ; i &lt; argc ; i++) {
 			if (!digest_file(argv[i], alg)) {
-				(void) fprintf(stderr, "%s\n", argv[i]);
-				rval = EXIT_FAILURE;
+				fprintf(stderr, "%s\n", argv[i]);
+				ok = 0;
 			}
 		}
 	}
-	return rval;
+	return (ok) ? EXIT_SUCCESS : EXIT_FAILURE;
 }
diff --git a/pkgtools/digest/files/keccak.c b/pkgtools/digest/files/keccak.c
new file mode 100644
--- /dev/null
+++ b/pkgtools/digest/files/keccak.c
@@ -0,0 +1,178 @@
+/*-
+ * Copyright (c) 2015 Taylor R. Campbell
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#define	_POSIX_C_SOURCE	200809L
+
+#include &lt;stdint.h&gt;
+
+#include "keccak.h"
+
+#define	secret	/* can't use in variable-time operations, should zero */
+
+#define	FOR5(X, STMT) do						      \
+{									      \
+	(X) = 0; (STMT);						      \
+	(X) = 1; (STMT);						      \
+	(X) = 2; (STMT);						      \
+	(X) = 3; (STMT);						      \
+	(X) = 4; (STMT);						      \
+} while (0)
+
+static inline secret uint64_t
+rol64(secret uint64_t v, unsigned c)
+{
+
+	return ((v &lt;&lt; c) | (v &gt;&gt; (64 - c)));
+}
+
+static inline void
+keccakf1600_theta(secret uint64_t A[25])
+{
+	secret uint64_t C0, C1, C2, C3, C4;
+	unsigned y;
+
+	C0 = C1 = C2 = C3 = C4 = 0;
+	FOR5(y, {
+		C0 ^= A[0 + 5*y];
+		C1 ^= A[1 + 5*y];
+		C2 ^= A[2 + 5*y];
+		C3 ^= A[3 + 5*y];
+		C4 ^= A[4 + 5*y];
+	});
+	FOR5(y, {
+		A[0 + 5*y] ^= C4 ^ rol64(C1, 1);
+		A[1 + 5*y] ^= C0 ^ rol64(C2, 1);
+		A[2 + 5*y] ^= C1 ^ rol64(C3, 1);
+		A[3 + 5*y] ^= C2 ^ rol64(C4, 1);
+		A[4 + 5*y] ^= C3 ^ rol64(C0, 1);
+	});
+}
+
+static inline void
+keccakf1600_rho_pi(secret uint64_t A[25])
+{
+	secret uint64_t T, U;
+
+	/*
+	 * Permute by (x,y) |---&gt; (y, 2x + 3y mod 5) starting at (1,0),
+	 * rotate the ith element by (i + 1)(i + 2)/2 mod 64.
+	 */
+	U = A[ 1];                       T = U;
+	U = A[10]; A[10] = rol64(T,  1); T = U;
+	U = A[ 7]; A[ 7] = rol64(T,  3); T = U;
+	U = A[11]; A[11] = rol64(T,  6); T = U;
+	U = A[17]; A[17] = rol64(T, 10); T = U;
+	U = A[18]; A[18] = rol64(T, 15); T = U;
+	U = A[ 3]; A[ 3] = rol64(T, 21); T = U;
+	U = A[ 5]; A[ 5] = rol64(T, 28); T = U;
+	U = A[16]; A[16] = rol64(T, 36); T = U;
+	U = A[ 8]; A[ 8] = rol64(T, 45); T = U;
+	U = A[21]; A[21] = rol64(T, 55); T = U;
+	U = A[24]; A[24] = rol64(T,  2); T = U;
+	U = A[ 4]; A[ 4] = rol64(T, 14); T = U;
+	U = A[15]; A[15] = rol64(T, 27); T = U;
+	U = A[23]; A[23] = rol64(T, 41); T = U;
+	U = A[19]; A[19] = rol64(T, 56); T = U;
+	U = A[13]; A[13] = rol64(T,  8); T = U;
+	U = A[12]; A[12] = rol64(T, 25); T = U;
+	U = A[ 2]; A[ 2] = rol64(T, 43); T = U;
+	U = A[20]; A[20] = rol64(T, 62); T = U;
+	U = A[14]; A[14] = rol64(T, 18); T = U;
+	U = A[22]; A[22] = rol64(T, 39); T = U;
+	U = A[ 9]; A[ 9] = rol64(T, 61); T = U;
+	U = A[ 6]; A[ 6] = rol64(T, 20); T = U;
+	           A[ 1] = rol64(T, 44);
+}
+
+static inline void
+keccakf1600_chi(secret uint64_t A[25])
+{
+	secret uint64_t B0, B1, B2, B3, B4;
+	unsigned y;
+
+	FOR5(y, {
+		B0 = A[0 + 5*y];
+		B1 = A[1 + 5*y];
+		B2 = A[2 + 5*y];
+		B3 = A[3 + 5*y];
+		B4 = A[4 + 5*y];
+		A[0 + 5*y] ^= ~B1 &amp; B2;
+		A[1 + 5*y] ^= ~B2 &amp; B3;
+		A[2 + 5*y] ^= ~B3 &amp; B4;
+		A[3 + 5*y] ^= ~B4 &amp; B0;
+		A[4 + 5*y] ^= ~B0 &amp; B1;
+	});
+}
+
+static void
+keccakf1600_round(secret uint64_t A[25])
+{
+
+	keccakf1600_theta(A);
+	keccakf1600_rho_pi(A);
+	keccakf1600_chi(A);
+}
+
+void
+keccakf1600(secret uint64_t A[25])
+{
+	/*
+	 * RC[i] = \sum_{j = 0,...,6} rc(j + 7i) 2^(2^j - 1),
+	 * rc(t) = (x^t mod x^8 + x^6 + x^5 + x^4 + 1) mod x in GF(2)[x]
+	 */
+	static const uint64_t RC[24] = {
+		0x0000000000000001ULL,
+		0x0000000000008082ULL,
+		0x800000000000808aULL,
+		0x8000000080008000ULL,
+		0x000000000000808bULL,
+		0x0000000080000001ULL,
+		0x8000000080008081ULL,
+		0x8000000000008009ULL,
+		0x000000000000008aULL,
+		0x0000000000000088ULL,
+		0x0000000080008009ULL,
+		0x000000008000000aULL,
+		0x000000008000808bULL,
+		0x800000000000008bULL,
+		0x8000000000008089ULL,
+		0x8000000000008003ULL,
+		0x8000000000008002ULL,
+		0x8000000000000080ULL,
+		0x000000000000800aULL,
+		0x800000008000000aULL,
+		0x8000000080008081ULL,
+		0x8000000000008080ULL,
+		0x0000000080000001ULL,
+		0x8000000080008008ULL,
+	};
+	unsigned i;
+
+	for (i = 0; i &lt; 24; i++) {
+		keccakf1600_round(A);
+		A[0] ^= RC[i];
+	}
+}
diff --git a/pkgtools/digest/files/keccak.h b/pkgtools/digest/files/keccak.h
new file mode 100644
--- /dev/null
+++ b/pkgtools/digest/files/keccak.h
@@ -0,0 +1,34 @@
+/*-
+ * Copyright (c) 2015 Taylor R. Campbell
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef	KECCAK_H
+#define	KECCAK_H
+
+#include &lt;stdint.h&gt;
+
+void	keccakf1600(uint64_t A[25]);
+
+#endif	/* KECCAK_H */
diff --git a/pkgtools/digest/files/sha3.c b/pkgtools/digest/files/sha3.c
new file mode 100644
--- /dev/null
+++ b/pkgtools/digest/files/sha3.c
@@ -0,0 +1,638 @@
+/*-
+ * Copyright (c) 2015 Taylor R. Campbell
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * SHA-3: FIPS-202, Permutation-Based Hash and Extendable-Ouptut Functions
+ */
+
+#define	_POSIX_C_SOURCE	200809L
+
+#include &lt;assert.h&gt;
+#include &lt;stddef.h&gt;
+#include &lt;stdint.h&gt;
+#include &lt;string.h&gt;
+
+#include "keccak.h"
+
+#include "sha3.h"
+
+#define	MIN(a,b)	((a) &lt; (b) ? (a) : (b))
+
+void *(*volatile sha3_explicit_memset_impl)(void *, int, size_t) = &amp;memset;
+static void *
+explicit_memset(void *buf, int c, size_t n)
+{
+
+	return (*sha3_explicit_memset_impl)(buf, c, n);
+}
+
+static inline uint64_t
+le64dec(const void *buf)
+{
+	const uint8_t *p = buf;
+
+	return (((uint64_t)p[0]) |
+	    ((uint64_t)p[1] &lt;&lt; 8) |
+	    ((uint64_t)p[2] &lt;&lt; 16) |
+	    ((uint64_t)p[3] &lt;&lt; 24) |
+	    ((uint64_t)p[4] &lt;&lt; 32) |
+	    ((uint64_t)p[5] &lt;&lt; 40) |
+	    ((uint64_t)p[6] &lt;&lt; 48) |
+	    ((uint64_t)p[7] &lt;&lt; 56));
+}
+
+static inline void
+le64enc(void *buf, uint64_t v)
+{
+	uint8_t *p = buf;
+
+	*p++ = v; v &gt;&gt;= 8;
+	*p++ = v; v &gt;&gt;= 8;
+	*p++ = v; v &gt;&gt;= 8;
+	*p++ = v; v &gt;&gt;= 8;
+	*p++ = v; v &gt;&gt;= 8;
+	*p++ = v; v &gt;&gt;= 8;
+	*p++ = v; v &gt;&gt;= 8;
+	*p++ = v;
+}
+
+/*
+ * Common body.  All the SHA-3 functions share code structure.  They
+ * differ only in the size of the chunks they split the message into:
+ * for digest size d, they are split into chunks of 200 - d bytes.
+ */
+
+static inline unsigned
+sha3_rate(unsigned d)
+{
+	const unsigned cw = 2*d/8;	/* capacity in words */
+
+	return 25 - cw;
+}
+
+static void
+sha3_init(struct sha3 *C, unsigned rw)
+{
+	unsigned iw;
+
+	C-&gt;nb = 8*rw;
+	for (iw = 0; iw &lt; 25; iw++)
+		C-&gt;A[iw] = 0;
+}
+
+static void
+sha3_update(struct sha3 *C, const uint8_t *data, size_t len, unsigned rw)
+{
+	uint64_t T;
+	unsigned ib, iw;		/* index of byte/word */
+
+	assert(0 &lt; C-&gt;nb);
+
+	/* If there's a partial word, try to fill it.  */
+	if ((C-&gt;nb % 8) != 0) {
+		T = 0;
+		for (ib = 0; ib &lt; MIN(len, C-&gt;nb % 8); ib++)
+			T |= (uint64_t)data[ib] &lt;&lt; (8*ib);
+		C-&gt;A[rw - (C-&gt;nb + 7)/8] ^= T &lt;&lt; (8*(8 - (C-&gt;nb % 8)));
+		C-&gt;nb -= ib;
+		data += ib;
+		len -= ib;
+
+		/* If we filled the buffer, permute now.  */
+		if (C-&gt;nb == 0) {
+			keccakf1600(C-&gt;A);
+			C-&gt;nb = 8*rw;
+		}
+
+		/* If that exhausted the input, we're done.  */
+		if (len == 0)
+			return;
+	}
+
+	/* At a word boundary.  Fill any partial buffer.  */
+	assert((C-&gt;nb % 8) == 0);
+	if (C-&gt;nb &lt; 8*rw) {
+		for (iw = 0; iw &lt; MIN(len, C-&gt;nb)/8; iw++)
+			C-&gt;A[rw - C-&gt;nb/8 + iw] ^= le64dec(data + 8*iw);
+		C-&gt;nb -= 8*iw;
+		data += 8*iw;
+		len -= 8*iw;
+
+		/* If we filled the buffer, permute now.  */
+		if (C-&gt;nb == 0) {
+			keccakf1600(C-&gt;A);
+			C-&gt;nb = 8*rw;
+		} else {
+			/* Otherwise, less than a word left.  */
+			assert(len &lt; 8);
+			goto partial;
+		}
+	}
+
+	/* At a buffer boundary.  Absorb input one buffer at a time.  */
+	assert(C-&gt;nb == 8*rw);
+	while (8*rw &lt;= len) {
+		for (iw = 0; iw &lt; rw; iw++)
+			C-&gt;A[iw] ^= le64dec(data + 8*iw);
+		keccakf1600(C-&gt;A);
+		data += 8*rw;
+		len -= 8*rw;
+	}
+
+	/* Partially fill the buffer with as many words as we can.  */
+	for (iw = 0; iw &lt; len/8; iw++)
+		C-&gt;A[rw - C-&gt;nb/8 + iw] ^= le64dec(data + 8*iw);
+	C-&gt;nb -= 8*iw;
+	data += 8*iw;
+	len -= 8*iw;
+
+partial:
+	/* Partially fill the last word with as many bytes as we can.  */
+	assert(len &lt; 8);
+	assert(0 &lt; C-&gt;nb);
+	assert((C-&gt;nb % 8) == 0);
+	T = 0;
+	for (ib = 0; ib &lt; len; ib++)
+		T |= (uint64_t)data[ib] &lt;&lt; (8*ib);
+	C-&gt;A[rw - C-&gt;nb/8] ^= T;
+	C-&gt;nb -= ib;
+	assert(0 &lt; C-&gt;nb);
+}
+
+static void
+sha3_final(uint8_t *h, unsigned d, struct sha3 *C, unsigned rw)
+{
+	unsigned nw, iw;
+
+	assert(d &lt;= 8*25);
+	assert(0 &lt; C-&gt;nb);
+
+	/* Append 01, pad with 10*1 up to buffer boundary, LSB first.  */
+	nw = (C-&gt;nb + 7)/8;
+	assert(0 &lt; nw);
+	assert(nw &lt;= rw);
+	C-&gt;A[rw - nw] ^= (uint64_t)0x06 &lt;&lt; (8*(8*nw - C-&gt;nb));
+	C-&gt;A[rw - 1] ^= 0x8000000000000000ULL;
+
+	/* Permute one last time.  */
+	keccakf1600(C-&gt;A);
+
+	/* Reveal the first 8d bits of state, forget 1600-8d of them.  */
+	for (iw = 0; iw &lt; d/8; iw++)
+		le64enc(h + 8*iw, C-&gt;A[iw]);
+	h += 8*iw;
+	d -= 8*iw;
+	if (0 &lt; d) {
+		/* For SHA3-224, we need to expose a partial word.  */
+		uint64_t T = C-&gt;A[iw];
+		do {
+			*h++ = T &amp; 0xff;
+			T &gt;&gt;= 8;
+		} while (--d);
+	}
+	(void)explicit_memset(C-&gt;A, 0, sizeof C-&gt;A);
+	C-&gt;nb = 0;
+}
+
+static void
+shake_final(uint8_t *h, unsigned d, struct sha3 *C, unsigned rw)
+{
+	unsigned nw, iw;
+
+	assert(0 &lt; C-&gt;nb);
+
+	/* Append 1111, pad with 10*1 up to buffer boundary, LSB first.  */
+	nw = (C-&gt;nb + 7)/8;
+	assert(0 &lt; nw);
+	assert(nw &lt;= rw);
+	C-&gt;A[rw - nw] ^= (uint64_t)0x1f &lt;&lt; (8*(8*nw - C-&gt;nb));
+	C-&gt;A[rw - 1] ^= 0x8000000000000000ULL;
+
+	/* Permute, reveal first rw words of state, repeat.  */
+	while (8*rw &lt;= d) {
+		keccakf1600(C-&gt;A);
+		for (iw = 0; iw &lt; rw; iw++)
+			le64enc(h + 8*iw, C-&gt;A[iw]);
+		h += 8*iw;
+		d -= 8*iw;
+	}
+
+	/*
+	 * If 8*rw (the output rate in bytes) does not divide d, more
+	 * words are wanted: permute again and reveal a little more.
+	 */
+	if (0 &lt; d) {
+		keccakf1600(C-&gt;A);
+		for (iw = 0; iw &lt; d/8; iw++)
+			le64enc(h + 8*iw, C-&gt;A[iw]);
+		h += 8*iw;
+		d -= 8*iw;
+
+		/*
+		 * If 8 does not divide d, more bytes are wanted:
+		 * reveal them.
+		 */
+		if (0 &lt; d) {
+			uint64_t T = C-&gt;A[iw];
+			do {
+				*h++ = T &amp; 0xff;
+				T &gt;&gt;= 8;
+			} while (--d);
+		}
+	}
+
+	(void)explicit_memset(C-&gt;A, 0, sizeof C-&gt;A);
+	C-&gt;nb = 0;
+}
+
+void
+SHA3_224_Init(SHA3_224_CTX *C)
+{
+
+	sha3_init(&amp;C-&gt;C224, sha3_rate(SHA3_224_DIGEST_LENGTH));
+}
+
+void
+SHA3_224_Update(SHA3_224_CTX *C, const uint8_t *data, size_t len)
+{
+
+	sha3_update(&amp;C-&gt;C224, data, len, sha3_rate(SHA3_224_DIGEST_LENGTH));
+}
+
+void
+SHA3_224_Final(uint8_t h[SHA3_224_DIGEST_LENGTH], SHA3_224_CTX *C)
+{
+
+	sha3_final(h, SHA3_224_DIGEST_LENGTH, &amp;C-&gt;C224,
+	    sha3_rate(SHA3_224_DIGEST_LENGTH));
+}
+
+void
+SHA3_256_Init(SHA3_256_CTX *C)
+{
+
+	sha3_init(&amp;C-&gt;C256, sha3_rate(SHA3_256_DIGEST_LENGTH));
+}
+
+void
+SHA3_256_Update(SHA3_256_CTX *C, const uint8_t *data, size_t len)
+{
+
+	sha3_update(&amp;C-&gt;C256, data, len, sha3_rate(SHA3_256_DIGEST_LENGTH));
+}
+
+void
+SHA3_256_Final(uint8_t h[SHA3_256_DIGEST_LENGTH], SHA3_256_CTX *C)
+{
+
+	sha3_final(h, SHA3_256_DIGEST_LENGTH, &amp;C-&gt;C256,
+	    sha3_rate(SHA3_256_DIGEST_LENGTH));
+}
+
+void
+SHA3_384_Init(SHA3_384_CTX *C)
+{
+
+	sha3_init(&amp;C-&gt;C384, sha3_rate(SHA3_384_DIGEST_LENGTH));
+}
+
+void
+SHA3_384_Update(SHA3_384_CTX *C, const uint8_t *data, size_t len)
+{
+
+	sha3_update(&amp;C-&gt;C384, data, len, sha3_rate(SHA3_384_DIGEST_LENGTH));
+}
+
+void
+SHA3_384_Final(uint8_t h[SHA3_384_DIGEST_LENGTH], SHA3_384_CTX *C)
+{
+
+	sha3_final(h, SHA3_384_DIGEST_LENGTH, &amp;C-&gt;C384,
+	    sha3_rate(SHA3_384_DIGEST_LENGTH));
+}
+
+void
+SHA3_512_Init(SHA3_512_CTX *C)
+{
+
+	sha3_init(&amp;C-&gt;C512, sha3_rate(SHA3_512_DIGEST_LENGTH));
+}
+
+void
+SHA3_512_Update(SHA3_512_CTX *C, const uint8_t *data, size_t len)
+{
+
+	sha3_update(&amp;C-&gt;C512, data, len, sha3_rate(SHA3_512_DIGEST_LENGTH));
+}
+
+void
+SHA3_512_Final(uint8_t h[SHA3_512_DIGEST_LENGTH], SHA3_512_CTX *C)
+{
+
+	sha3_final(h, SHA3_512_DIGEST_LENGTH, &amp;C-&gt;C512,
+	    sha3_rate(SHA3_512_DIGEST_LENGTH));
+}
+
+void
+SHAKE128_Init(SHAKE128_CTX *C)
+{
+
+	sha3_init(&amp;C-&gt;C128, sha3_rate(128/8));
+}
+
+void
+SHAKE128_Update(SHAKE128_CTX *C, const uint8_t *data, size_t len)
+{
+
+	sha3_update(&amp;C-&gt;C128, data, len, sha3_rate(128/8));
+}
+
+void
+SHAKE128_Final(uint8_t *h, size_t d, SHAKE128_CTX *C)
+{
+
+	shake_final(h, d, &amp;C-&gt;C128, sha3_rate(128/8));
+}
+
+void
+SHAKE256_Init(SHAKE256_CTX *C)
+{
+
+	sha3_init(&amp;C-&gt;C256, sha3_rate(256/8));
+}
+
+void
+SHAKE256_Update(SHAKE256_CTX *C, const uint8_t *data, size_t len)
+{
+
+	sha3_update(&amp;C-&gt;C256, data, len, sha3_rate(256/8));
+}
+
+void
+SHAKE256_Final(uint8_t *h, size_t d, SHAKE256_CTX *C)
+{
+
+	shake_final(h, d, &amp;C-&gt;C256, sha3_rate(256/8));
+}
+
+static void
+sha3_selftest_prng(void *buf, size_t len, uint32_t seed)
+{
+	uint8_t *p = buf;
+	size_t n = len;
+	uint32_t t, a, b;
+
+	a = 0xdead4bad * seed;
+	b = 1;
+
+	while (n--) {
+		t = a + b;
+		*p++ = t &gt;&gt; 24;
+		a = b;
+		b = t;
+	}
+}
+
+int
+SHA3_Selftest(void)
+{
+	const uint8_t d224_0[] = { /* SHA3-224(0-bit) */
+		0x6b,0x4e,0x03,0x42,0x36,0x67,0xdb,0xb7,
+		0x3b,0x6e,0x15,0x45,0x4f,0x0e,0xb1,0xab,
+		0xd4,0x59,0x7f,0x9a,0x1b,0x07,0x8e,0x3f,
+		0x5b,0x5a,0x6b,0xc7,
+	};
+	const uint8_t d256_0[] = { /* SHA3-256(0-bit) */
+		0xa7,0xff,0xc6,0xf8,0xbf,0x1e,0xd7,0x66,
+		0x51,0xc1,0x47,0x56,0xa0,0x61,0xd6,0x62,
+		0xf5,0x80,0xff,0x4d,0xe4,0x3b,0x49,0xfa,
+		0x82,0xd8,0x0a,0x4b,0x80,0xf8,0x43,0x4a,
+	};
+	const uint8_t d384_0[] = { /* SHA3-384(0-bit) */
+		0x0c,0x63,0xa7,0x5b,0x84,0x5e,0x4f,0x7d,
+		0x01,0x10,0x7d,0x85,0x2e,0x4c,0x24,0x85,
+		0xc5,0x1a,0x50,0xaa,0xaa,0x94,0xfc,0x61,
+		0x99,0x5e,0x71,0xbb,0xee,0x98,0x3a,0x2a,
+		0xc3,0x71,0x38,0x31,0x26,0x4a,0xdb,0x47,
+		0xfb,0x6b,0xd1,0xe0,0x58,0xd5,0xf0,0x04,
+	};
+	const uint8_t d512_0[] = { /* SHA3-512(0-bit) */
+		0xa6,0x9f,0x73,0xcc,0xa2,0x3a,0x9a,0xc5,
+		0xc8,0xb5,0x67,0xdc,0x18,0x5a,0x75,0x6e,
+		0x97,0xc9,0x82,0x16,0x4f,0xe2,0x58,0x59,
+		0xe0,0xd1,0xdc,0xc1,0x47,0x5c,0x80,0xa6,
+		0x15,0xb2,0x12,0x3a,0xf1,0xf5,0xf9,0x4c,
+		0x11,0xe3,0xe9,0x40,0x2c,0x3a,0xc5,0x58,
+		0xf5,0x00,0x19,0x9d,0x95,0xb6,0xd3,0xe3,
+		0x01,0x75,0x85,0x86,0x28,0x1d,0xcd,0x26,
+	};
+	const uint8_t shake128_0_41[] = { /* SHAKE128(0-bit, 41) */
+		0x7f,0x9c,0x2b,0xa4,0xe8,0x8f,0x82,0x7d,
+		0x61,0x60,0x45,0x50,0x76,0x05,0x85,0x3e,
+		0xd7,0x3b,0x80,0x93,0xf6,0xef,0xbc,0x88,
+		0xeb,0x1a,0x6e,0xac,0xfa,0x66,0xef,0x26,
+		0x3c,0xb1,0xee,0xa9,0x88,0x00,0x4b,0x93,0x10,
+	};
+	const uint8_t shake256_0_73[] = { /* SHAKE256(0-bit, 73) */
+		0x46,0xb9,0xdd,0x2b,0x0b,0xa8,0x8d,0x13,
+		0x23,0x3b,0x3f,0xeb,0x74,0x3e,0xeb,0x24,
+		0x3f,0xcd,0x52,0xea,0x62,0xb8,0x1b,0x82,
+		0xb5,0x0c,0x27,0x64,0x6e,0xd5,0x76,0x2f,
+		0xd7,0x5d,0xc4,0xdd,0xd8,0xc0,0xf2,0x00,
+		0xcb,0x05,0x01,0x9d,0x67,0xb5,0x92,0xf6,
+		0xfc,0x82,0x1c,0x49,0x47,0x9a,0xb4,0x86,
+		0x40,0x29,0x2e,0xac,0xb3,0xb7,0xc4,0xbe,
+		0x14,0x1e,0x96,0x61,0x6f,0xb1,0x39,0x57,0x69,
+	};
+	const uint8_t d224_1600[] = { /* SHA3-224(200 * 0xa3) */
+		0x93,0x76,0x81,0x6a,0xba,0x50,0x3f,0x72,
+		0xf9,0x6c,0xe7,0xeb,0x65,0xac,0x09,0x5d,
+		0xee,0xe3,0xbe,0x4b,0xf9,0xbb,0xc2,0xa1,
+		0xcb,0x7e,0x11,0xe0,
+	};
+	const uint8_t d256_1600[] = { /* SHA3-256(200 * 0xa3) */
+		0x79,0xf3,0x8a,0xde,0xc5,0xc2,0x03,0x07,
+		0xa9,0x8e,0xf7,0x6e,0x83,0x24,0xaf,0xbf,
+		0xd4,0x6c,0xfd,0x81,0xb2,0x2e,0x39,0x73,
+		0xc6,0x5f,0xa1,0xbd,0x9d,0xe3,0x17,0x87,
+	};
+	const uint8_t d384_1600[] = { /* SHA3-384(200 * 0xa3) */
+		0x18,0x81,0xde,0x2c,0xa7,0xe4,0x1e,0xf9,
+		0x5d,0xc4,0x73,0x2b,0x8f,0x5f,0x00,0x2b,
+		0x18,0x9c,0xc1,0xe4,0x2b,0x74,0x16,0x8e,
+		0xd1,0x73,0x26,0x49,0xce,0x1d,0xbc,0xdd,
+		0x76,0x19,0x7a,0x31,0xfd,0x55,0xee,0x98,
+		0x9f,0x2d,0x70,0x50,0xdd,0x47,0x3e,0x8f,
+	};
+	const uint8_t d512_1600[] = { /* SHA3-512(200 * 0xa3) */
+		0xe7,0x6d,0xfa,0xd2,0x20,0x84,0xa8,0xb1,
+		0x46,0x7f,0xcf,0x2f,0xfa,0x58,0x36,0x1b,
+		0xec,0x76,0x28,0xed,0xf5,0xf3,0xfd,0xc0,
+		0xe4,0x80,0x5d,0xc4,0x8c,0xae,0xec,0xa8,
+		0x1b,0x7c,0x13,0xc3,0x0a,0xdf,0x52,0xa3,
+		0x65,0x95,0x84,0x73,0x9a,0x2d,0xf4,0x6b,
+		0xe5,0x89,0xc5,0x1c,0xa1,0xa4,0xa8,0x41,
+		0x6d,0xf6,0x54,0x5a,0x1c,0xe8,0xba,0x00,
+	};
+	const uint8_t shake128_1600_41[] = { /* SHAKE128(200 * 0xa3, 41) */
+		0x13,0x1a,0xb8,0xd2,0xb5,0x94,0x94,0x6b,
+		0x9c,0x81,0x33,0x3f,0x9b,0xb6,0xe0,0xce,
+		0x75,0xc3,0xb9,0x31,0x04,0xfa,0x34,0x69,
+		0xd3,0x91,0x74,0x57,0x38,0x5d,0xa0,0x37,
+		0xcf,0x23,0x2e,0xf7,0x16,0x4a,0x6d,0x1e,0xb4,
+	};
+	const uint8_t shake256_1600_73[] = { /* SHAKE256(200 * 0xa3, 73) */
+		0xcd,0x8a,0x92,0x0e,0xd1,0x41,0xaa,0x04,
+		0x07,0xa2,0x2d,0x59,0x28,0x86,0x52,0xe9,
+		0xd9,0xf1,0xa7,0xee,0x0c,0x1e,0x7c,0x1c,
+		0xa6,0x99,0x42,0x4d,0xa8,0x4a,0x90,0x4d,
+		0x2d,0x70,0x0c,0xaa,0xe7,0x39,0x6e,0xce,
+		0x96,0x60,0x44,0x40,0x57,0x7d,0xa4,0xf3,
+		0xaa,0x22,0xae,0xb8,0x85,0x7f,0x96,0x1c,
+		0x4c,0xd8,0xe0,0x6f,0x0a,0xe6,0x61,0x0b,
+		0x10,0x48,0xa7,0xf6,0x4e,0x10,0x74,0xcd,0x62,
+	};
+	const uint8_t d0[] = {
+		0x6c,0x02,0x1a,0xc6,0x65,0xaf,0x80,0xfb,
+		0x52,0xe6,0x2d,0x27,0xe5,0x02,0x88,0x84,
+		0xec,0x1c,0x0c,0xe7,0x0b,0x94,0x55,0x83,
+		0x19,0xf2,0xbf,0x09,0x86,0xeb,0x1a,0xbb,
+		0xc3,0x0d,0x1c,0xef,0x22,0xfe,0xc5,0x4c,
+		0x45,0x90,0x66,0x14,0x00,0x6e,0xc8,0x79,
+		0xdf,0x1e,0x02,0xbd,0x75,0xe9,0x60,0xd8,
+		0x60,0x39,0x85,0xc9,0xc4,0xee,0x33,0xab,
+	};
+	const unsigned mlen[6] = { 0, 3, 128, 129, 255, 1024 };
+	uint8_t m[1024], d[73];
+	SHA3_224_CTX sha3224;
+	SHA3_256_CTX sha3256;
+	SHA3_384_CTX sha3384;
+	SHA3_512_CTX sha3512;
+	SHAKE128_CTX shake128;
+	SHAKE256_CTX shake256;
+	SHA3_512_CTX ctx;
+	unsigned mi;
+
+	/*
+	 * NIST test vectors from
+	 * &lt;http://csrc.nist.gov/groups/ST/toolkit/examples.html#aHashing&gt;:
+	 * 0-bit, 1600-bit repeated 0xa3 (= 0b10100011).
+	 */
+	SHA3_224_Init(&amp;sha3224);
+	SHA3_224_Final(d, &amp;sha3224);
+	if (memcmp(d, d224_0, 28) != 0)
+		return -1;
+	SHA3_256_Init(&amp;sha3256);
+	SHA3_256_Final(d, &amp;sha3256);
+	if (memcmp(d, d256_0, 32) != 0)
+		return -1;
+	SHA3_384_Init(&amp;sha3384);
+	SHA3_384_Final(d, &amp;sha3384);
+	if (memcmp(d, d384_0, 48) != 0)
+		return -1;
+	SHA3_512_Init(&amp;sha3512);
+	SHA3_512_Final(d, &amp;sha3512);
+	if (memcmp(d, d512_0, 64) != 0)
+		return -1;
+	SHAKE128_Init(&amp;shake128);
+	SHAKE128_Final(d, 41, &amp;shake128);
+	if (memcmp(d, shake128_0_41, 41) != 0)
+		return -1;
+	SHAKE256_Init(&amp;shake256);
+	SHAKE256_Final(d, 73, &amp;shake256);
+	if (memcmp(d, shake256_0_73, 73) != 0)
+		return -1;
+
+	(void)memset(m, 0xa3, 200);
+	SHA3_224_Init(&amp;sha3224);
+	SHA3_224_Update(&amp;sha3224, m, 200);
+	SHA3_224_Final(d, &amp;sha3224);
+	if (memcmp(d, d224_1600, 28) != 0)
+		return -1;
+	SHA3_256_Init(&amp;sha3256);
+	SHA3_256_Update(&amp;sha3256, m, 200);
+	SHA3_256_Final(d, &amp;sha3256);
+	if (memcmp(d, d256_1600, 32) != 0)
+		return -1;
+	SHA3_384_Init(&amp;sha3384);
+	SHA3_384_Update(&amp;sha3384, m, 200);
+	SHA3_384_Final(d, &amp;sha3384);
+	if (memcmp(d, d384_1600, 48) != 0)
+		return -1;
+	SHA3_512_Init(&amp;sha3512);
+	SHA3_512_Update(&amp;sha3512, m, 200);
+	SHA3_512_Final(d, &amp;sha3512);
+	if (memcmp(d, d512_1600, 64) != 0)
+		return -1;
+	SHAKE128_Init(&amp;shake128);
+	SHAKE128_Update(&amp;shake128, m, 200);
+	SHAKE128_Final(d, 41, &amp;shake128);
+	if (memcmp(d, shake128_1600_41, 41) != 0)
+		return -1;
+	SHAKE256_Init(&amp;shake256);
+	SHAKE256_Update(&amp;shake256, m, 200);
+	SHAKE256_Final(d, 73, &amp;shake256);
+	if (memcmp(d, shake256_1600_73, 73) != 0)
+		return -1;
+
+	/*
+	 * Hand-crufted test vectors with unaligned message lengths.
+	 */
+	SHA3_512_Init(&amp;ctx);
+	for (mi = 0; mi &lt; 6; mi++) {
+		sha3_selftest_prng(m, mlen[mi], (224/8)*mlen[mi]);
+		SHA3_224_Init(&amp;sha3224);
+		SHA3_224_Update(&amp;sha3224, m, mlen[mi]);
+		SHA3_224_Final(d, &amp;sha3224);
+		SHA3_512_Update(&amp;ctx, d, 224/8);
+	}
+	for (mi = 0; mi &lt; 6; mi++) {
+		sha3_selftest_prng(m, mlen[mi], (256/8)*mlen[mi]);
+		SHA3_256_Init(&amp;sha3256);
+		SHA3_256_Update(&amp;sha3256, m, mlen[mi]);
+		SHA3_256_Final(d, &amp;sha3256);
+		SHA3_512_Update(&amp;ctx, d, 256/8);
+	}
+	for (mi = 0; mi &lt; 6; mi++) {
+		sha3_selftest_prng(m, mlen[mi], (384/8)*mlen[mi]);
+		SHA3_384_Init(&amp;sha3384);
+		SHA3_384_Update(&amp;sha3384, m, mlen[mi]);
+		SHA3_384_Final(d, &amp;sha3384);
+		SHA3_512_Update(&amp;ctx, d, 384/8);
+	}
+	for (mi = 0; mi &lt; 6; mi++) {
+		sha3_selftest_prng(m, mlen[mi], (512/8)*mlen[mi]);
+		SHA3_512_Init(&amp;sha3512);
+		SHA3_512_Update(&amp;sha3512, m, mlen[mi]);
+		SHA3_512_Final(d, &amp;sha3512);
+		SHA3_512_Update(&amp;ctx, d, 512/8);
+	}
+	SHA3_512_Final(d, &amp;ctx);
+	if (memcmp(d, d0, 64) != 0)
+		return -1;
+
+	return 0;
+}
diff --git a/pkgtools/digest/files/sha3.h b/pkgtools/digest/files/sha3.h
new file mode 100644
--- /dev/null
+++ b/pkgtools/digest/files/sha3.h
@@ -0,0 +1,141 @@
+/*-
+ * Copyright (c) 2015 Taylor R. Campbell
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef	SHA3_H
+#define	SHA3_H
+
+#include &lt;stddef.h&gt;
+#include &lt;stdint.h&gt;
+
+struct sha3 {
+	uint64_t A[25];
+	unsigned nb;		/* number of bytes remaining to fill buffer */
+};
+
+typedef struct { struct sha3 C224; } SHA3_224_CTX;
+typedef struct { struct sha3 C256; } SHA3_256_CTX;
+typedef struct { struct sha3 C384; } SHA3_384_CTX;
+typedef struct { struct sha3 C512; } SHA3_512_CTX;
+typedef struct { struct sha3 C128; } SHAKE128_CTX;
+typedef struct { struct sha3 C256; } SHAKE256_CTX;
+
+#define	SHA3_224_DIGEST_LENGTH	28
+#define	SHA3_256_DIGEST_LENGTH	32
+#define	SHA3_384_DIGEST_LENGTH	48
+#define	SHA3_512_DIGEST_LENGTH	64
+
+#define	SHA3_224_DIGEST_STRING_LENGTH	((2 * SHA3_224_DIGEST_LENGTH) + 1)
+#define	SHA3_256_DIGEST_STRING_LENGTH	((2 * SHA3_256_DIGEST_LENGTH) + 1)
+#define	SHA3_384_DIGEST_STRING_LENGTH	((2 * SHA3_384_DIGEST_LENGTH) + 1)
+#define	SHA3_512_DIGEST_STRING_LENGTH	((2 * SHA3_512_DIGEST_LENGTH) + 1)
+
+#ifdef SHA3_PROTECT_NAMESPACE
+#define	SHA3_224_Init	digest_SHA3_224_Init
+#define	SHA3_224_Update	digest_SHA3_224_Update
+#define	SHA3_224_Final	digest_SHA3_224_Final
+#define	SHA3_224_End	digest_SHA3_224_End
+#define	SHA3_224_Data	digest_SHA3_224_Data
+#define	SHA3_224_File	digest_SHA3_224_File
+
+#define	SHA3_256_Init	digest_SHA3_256_Init
+#define	SHA3_256_Update	digest_SHA3_256_Update
+#define	SHA3_256_Final	digest_SHA3_256_Final
+#define	SHA3_256_End	digest_SHA3_256_End
+#define	SHA3_256_Data	digest_SHA3_256_Data
+#define	SHA3_256_File	digest_SHA3_256_File
+
+#define	SHA3_384_Init	digest_SHA3_384_Init
+#define	SHA3_384_Update	digest_SHA3_384_Update
+#define	SHA3_384_Final	digest_SHA3_384_Final
+#define	SHA3_384_End	digest_SHA3_384_End
+#define	SHA3_384_Data	digest_SHA3_384_Data
+#define	SHA3_384_File	digest_SHA3_384_File
+
+#define	SHA3_512_Init	digest_SHA3_512_Init
+#define	SHA3_512_Update	digest_SHA3_512_Update
+#define	SHA3_512_Final	digest_SHA3_512_Final
+#define	SHA3_512_End	digest_SHA3_512_End
+#define	SHA3_512_Data	digest_SHA3_512_Data
+#define	SHA3_512_File	digest_SHA3_512_File
+#endif /* SHA3_PROTECT_NAMESPACE */
+
+#ifndef __BEGIN_DECLS
+#  if defined(__cplusplus)
+#  define __BEGIN_DECLS           extern "C" {
+#  define __END_DECLS             }
+#  else
+#  define __BEGIN_DECLS
+#  define __END_DECLS
+#  endif
+#endif
+
+__BEGIN_DECLS
+
+void	SHA3_224_Init(SHA3_224_CTX *);
+void	SHA3_224_Update(SHA3_224_CTX *, const uint8_t *, size_t);
+void	SHA3_224_Final(uint8_t[SHA3_224_DIGEST_LENGTH], SHA3_224_CTX *);
+
+void	SHA3_256_Init(SHA3_256_CTX *);
+void	SHA3_256_Update(SHA3_256_CTX *, const uint8_t *, size_t);
+void	SHA3_256_Final(uint8_t[SHA3_256_DIGEST_LENGTH], SHA3_256_CTX *);
+
+void	SHA3_384_Init(SHA3_384_CTX *);
+void	SHA3_384_Update(SHA3_384_CTX *, const uint8_t *, size_t);
+void	SHA3_384_Final(uint8_t[SHA3_384_DIGEST_LENGTH], SHA3_384_CTX *);
+
+void	SHA3_512_Init(SHA3_512_CTX *);
+void	SHA3_512_Update(SHA3_512_CTX *, const uint8_t *, size_t);
+void	SHA3_512_Final(uint8_t[SHA3_512_DIGEST_LENGTH], SHA3_512_CTX *);
+
+void	SHAKE128_Init(SHAKE128_CTX *);
+void	SHAKE128_Update(SHAKE128_CTX *, const uint8_t *, size_t);
+void	SHAKE128_Final(uint8_t *, size_t, SHAKE128_CTX *);
+
+void	SHAKE256_Init(SHAKE256_CTX *);
+void	SHAKE256_Update(SHAKE256_CTX *, const uint8_t *, size_t);
+void	SHAKE256_Final(uint8_t *, size_t, SHAKE256_CTX *);
+
+int	SHA3_Selftest(void);
+
+char *SHA3_224_End(SHA3_224_CTX*, char[SHA3_224_DIGEST_STRING_LENGTH]);
+char *SHA3_224_Data(const uint8_t*, size_t, unsigned char *);
+char *SHA3_224_File(char *, char *);
+
+char *SHA3_256_End(SHA3_256_CTX*, char[SHA3_256_DIGEST_STRING_LENGTH]);
+char *SHA3_256_Data(const uint8_t*, size_t, unsigned char *);
+char *SHA3_256_File(char *, char *);
+
+char *SHA3_384_End(SHA3_384_CTX*, char[SHA3_384_DIGEST_STRING_LENGTH]);
+char *SHA3_384_Data(const uint8_t*, size_t, unsigned char *);
+char *SHA3_384_File(char *, char *);
+
+char *SHA3_512_End(SHA3_512_CTX*, char[SHA3_512_DIGEST_STRING_LENGTH]);
+char *SHA3_512_Data(const uint8_t*, size_t, unsigned char *);
+char *SHA3_512_File(char *, char *);
+
+__END_DECLS
+
+#endif	/* SHA3_H */
diff --git a/pkgtools/digest/files/sha3hl.c b/pkgtools/digest/files/sha3hl.c
new file mode 100644
--- /dev/null
+++ b/pkgtools/digest/files/sha3hl.c
@@ -0,0 +1,316 @@
+/* $NetBSD: sha3hl.c,v 1.8 2011/11/08 18:20:03 joerg Exp $	 */
+
+/*
+ * sha3hl.c
+ * This code is derived from sha2hl.c, hence the following licence
+ * reproduction.
+ *
+ * This code is not a verbatim copy, since some routines have been added,
+ * and some bugs have been fixed.
+ *
+ * Version 1.0.0beta1
+ *
+ * Written by Aaron D. Gifford &lt;me@aarongifford.com&gt;
+ *
+ * Copyright 2000 Aaron D. Gifford.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include &lt;errno.h&gt;
+#endif
+#ifdef HAVE_FCNTL_H
+#include &lt;fcntl.h&gt;
+#endif
+#include "sha3.h"
+#include &lt;assert.h&gt;
+#include &lt;stdio.h&gt;
+#include &lt;string.h&gt;
+#include &lt;stdlib.h&gt;
+#include &lt;unistd.h&gt;
+
+#ifndef _DIAGASSERT
+#define _DIAGASSERT(cond)	assert(cond)
+#endif
+
+#ifndef MEMSET_BZERO
+#define MEMSET_BZERO(p,l)	memset((p), 0, (l))
+#endif
+
+/*
+ * Constant used by SHA3_224/256/384/512_End() functions for converting the
+ * digest to a readable hexadecimal character string:
+ */
+static const char sha3_hex_digits[] = "0123456789abcdef";
+
+char           *
+SHA3_224_File(char *filename, char *buf)
+{
+	unsigned char          buffer[BUFSIZ * 20];
+	SHA3_224_CTX      ctx;
+	int             fd, num, oerrno;
+
+	_DIAGASSERT(filename != NULL);
+	/* XXX: buf may be NULL ? */
+
+	SHA3_224_Init(&amp;ctx);
+
+	if ((fd = open(filename, O_RDONLY)) &lt; 0)
+		return (0);
+
+	while ((num = read(fd, buffer, sizeof(buffer))) &gt; 0)
+		SHA3_224_Update(&amp;ctx, buffer, (size_t) num);
+
+	oerrno = errno;
+	close(fd);
+	errno = oerrno;
+	return (num &lt; 0 ? 0 : SHA3_224_End(&amp;ctx, buf));
+}
+
+
+char           *
+SHA3_224_End(SHA3_224_CTX *ctx, char buffer[])
+{
+	unsigned char          digest[SHA3_224_DIGEST_LENGTH], *d = digest;
+	unsigned char	       *ret;
+	int             i;
+
+	/* Sanity check: */
+	assert(ctx != NULL);
+
+	if ((ret = buffer) != NULL) {
+		SHA3_224_Final(digest, ctx);
+
+		for (i = 0; i &lt; SHA3_224_DIGEST_LENGTH; i++) {
+			*buffer++ = sha3_hex_digits[(*d &amp; 0xf0) &gt;&gt; 4];
+			*buffer++ = sha3_hex_digits[*d &amp; 0x0f];
+			d++;
+		}
+		*buffer = (char) 0;
+	} else {
+		(void) MEMSET_BZERO(ctx, sizeof(SHA3_224_CTX));
+	}
+	(void) MEMSET_BZERO(digest, SHA3_224_DIGEST_LENGTH);
+	return ret;
+}
+
+char           *
+SHA3_224_Data(const uint8_t * data, size_t len, unsigned char *digest)
+{
+	SHA3_224_CTX      ctx;
+
+	SHA3_224_Init(&amp;ctx);
+	SHA3_224_Update(&amp;ctx, data, len);
+	return SHA3_224_End(&amp;ctx, digest);
+}
+
+char           *
+SHA3_256_File(char *filename, char *buf)
+{
+	unsigned char          buffer[BUFSIZ * 20];
+	SHA3_256_CTX      ctx;
+	int             fd, num, oerrno;
+
+	_DIAGASSERT(filename != NULL);
+	/* XXX: buf may be NULL ? */
+
+	SHA3_256_Init(&amp;ctx);
+
+	if ((fd = open(filename, O_RDONLY)) &lt; 0)
+		return (0);
+
+	while ((num = read(fd, buffer, sizeof(buffer))) &gt; 0)
+		SHA3_256_Update(&amp;ctx, buffer, (size_t) num);
+
+	oerrno = errno;
+	close(fd);
+	errno = oerrno;
+	return (num &lt; 0 ? 0 : SHA3_256_End(&amp;ctx, buf));
+}
+
+
+char           *
+SHA3_256_End(SHA3_256_CTX *ctx, char buffer[])
+{
+	unsigned char          digest[SHA3_256_DIGEST_LENGTH], *d = digest;
+	unsigned char	       *ret;
+	int             i;
+
+	/* Sanity check: */
+	assert(ctx != NULL);
+
+	if ((ret = buffer) != NULL) {
+		SHA3_256_Final(digest, ctx);
+
+		for (i = 0; i &lt; SHA3_256_DIGEST_LENGTH; i++) {
+			*buffer++ = sha3_hex_digits[(*d &amp; 0xf0) &gt;&gt; 4];
+			*buffer++ = sha3_hex_digits[*d &amp; 0x0f];
+			d++;
+		}
+		*buffer = (char) 0;
+	} else {
+		(void) MEMSET_BZERO(ctx, sizeof(SHA3_256_CTX));
+	}
+	(void) MEMSET_BZERO(digest, SHA3_256_DIGEST_LENGTH);
+	return ret;
+}
+
+char           *
+SHA3_256_Data(const uint8_t * data, size_t len, unsigned char *digest)
+{
+	SHA3_256_CTX      ctx;
+
+	SHA3_256_Init(&amp;ctx);
+	SHA3_256_Update(&amp;ctx, data, len);
+	return SHA3_256_End(&amp;ctx, digest);
+}
+
+char           *
+SHA3_384_File(char *filename, char *buf)
+{
+	unsigned char          buffer[BUFSIZ * 20];
+	SHA3_384_CTX      ctx;
+	int             fd, num, oerrno;
+
+	_DIAGASSERT(filename != NULL);
+	/* XXX: buf may be NULL ? */
+
+	SHA3_384_Init(&amp;ctx);
+
+	if ((fd = open(filename, O_RDONLY)) &lt; 0)
+		return (0);
+
+	while ((num = read(fd, buffer, sizeof(buffer))) &gt; 0)
+		SHA3_384_Update(&amp;ctx, buffer, (size_t) num);
+
+	oerrno = errno;
+	close(fd);
+	errno = oerrno;
+	return (num &lt; 0 ? 0 : SHA3_384_End(&amp;ctx, buf));
+}
+
+
+char           *
+SHA3_384_End(SHA3_384_CTX *ctx, char buffer[])
+{
+	unsigned char          digest[SHA3_384_DIGEST_LENGTH], *d = digest;
+	unsigned char	       *ret;
+	int             i;
+
+	/* Sanity check: */
+	assert(ctx != NULL);
+
+	if ((ret = buffer) != NULL) {
+		SHA3_384_Final(digest, ctx);
+
+		for (i = 0; i &lt; SHA3_384_DIGEST_LENGTH; i++) {
+			*buffer++ = sha3_hex_digits[(*d &amp; 0xf0) &gt;&gt; 4];
+			*buffer++ = sha3_hex_digits[*d &amp; 0x0f];
+			d++;
+		}
+		*buffer = (char) 0;
+	} else {
+		(void) MEMSET_BZERO(ctx, sizeof(SHA3_384_CTX));
+	}
+	(void) MEMSET_BZERO(digest, SHA3_384_DIGEST_LENGTH);
+	return ret;
+}
+
+char           *
+SHA3_384_Data(const uint8_t * data, size_t len, unsigned char *digest)
+{
+	SHA3_384_CTX      ctx;
+
+	SHA3_384_Init(&amp;ctx);
+	SHA3_384_Update(&amp;ctx, data, len);
+	return SHA3_384_End(&amp;ctx, digest);
+}
+
+char           *
+SHA3_512_File(char *filename, char *buf)
+{
+	unsigned char          buffer[BUFSIZ * 20];
+	SHA3_512_CTX      ctx;
+	int             fd, num, oerrno;
+
+	_DIAGASSERT(filename != NULL);
+	/* XXX: buf may be NULL ? */
+
+	SHA3_512_Init(&amp;ctx);
+
+	if ((fd = open(filename, O_RDONLY)) &lt; 0)
+		return (0);
+
+	while ((num = read(fd, buffer, sizeof(buffer))) &gt; 0)
+		SHA3_512_Update(&amp;ctx, buffer, (size_t) num);
+
+	oerrno = errno;
+	close(fd);
+	errno = oerrno;
+	return (num &lt; 0 ? 0 : SHA3_512_End(&amp;ctx, buf));
+}
+
+
+char           *
+SHA3_512_End(SHA3_512_CTX *ctx, char buffer[])
+{
+	unsigned char          digest[SHA3_512_DIGEST_LENGTH], *d = digest;
+	unsigned char	       *ret;
+	int             i;
+
+	/* Sanity check: */
+	assert(ctx != NULL);
+
+	if ((ret = buffer) != NULL) {
+		SHA3_512_Final(digest, ctx);
+
+		for (i = 0; i &lt; SHA3_512_DIGEST_LENGTH; i++) {
+			*buffer++ = sha3_hex_digits[(*d &amp; 0xf0) &gt;&gt; 4];
+			*buffer++ = sha3_hex_digits[*d &amp; 0x0f];
+			d++;
+		}
+		*buffer = (char) 0;
+	} else {
+		(void) MEMSET_BZERO(ctx, sizeof(SHA3_512_CTX));
+	}
+	(void) MEMSET_BZERO(digest, SHA3_512_DIGEST_LENGTH);
+	return ret;
+}
+
+char           *
+SHA3_512_Data(const uint8_t * data, size_t len, unsigned char *digest)
+{
+	SHA3_512_CTX      ctx;
+
+	SHA3_512_Init(&amp;ctx);
+	SHA3_512_Update(&amp;ctx, data, len);
+	return SHA3_512_End(&amp;ctx, digest);
+}
+
diff --git a/pkgtools/digest/files/tiger.h b/pkgtools/digest/files/tiger.h
--- a/pkgtools/digest/files/tiger.h
+++ b/pkgtools/digest/files/tiger.h
@@ -1,40 +1,33 @@
 /* $NetBSD: tiger.h,v 1.6 2010/01/23 13:25:12 obache Exp $ */
 
-/*
- * Copyright © 2005 Alistair Crooks.  All rights reserved.
+/*-
+ * Copyright (c) 2005-2016 Alistair Crooks &lt;agc@NetBSD.org&gt;
+ * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by Alistair Crooks
- *	for the NetBSD project.
- * 4. The name of the author may not be used to endorse or promote
- *    products derived from this software without specific prior written
- *    permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #ifndef TIGER_H_
 #define TIGER_H_
 
 #ifdef HAVE_INTTYPES_H
 #include &lt;inttypes.h&gt;
 #endif
 
@@ -43,17 +36,17 @@
 #endif
 
 #ifdef HAVE_UNISTD_H
 #include &lt;unistd.h&gt;
 #endif
 
 typedef struct tiger_context_t {
 	uint64_t	ctx[3];
-	int first_time;
+	int		first_time;
 } tiger_context_t;
 
 void TIGERInit(tiger_context_t *);
 void TIGERUpdate(tiger_context_t *, const uint8_t *, size_t);
 void TIGERFinal(uint8_t *, tiger_context_t *);
 
 char *TIGEREnd(tiger_context_t *, char *);
 char *TIGERFile(char *, char *);
</pre></body></html>