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 + * 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 $< -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 . # # # 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 #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 <<_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 <<\_ACEOF Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory @@ -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" && exit $ac_status if $ac_init_version; then cat <<\_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" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_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>>config.log { cat <<_ASUNAME @@ -4702,17 +4702,17 @@ exec 6>&1 _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/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 +.\" 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 + * 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 #endif #ifdef HAVE_LOCALE_H #include #endif #include #include #include #include +#include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #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 < argc ; i++) { + for (i = optind + 1 ; i < 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 + +#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 << c) | (v >> (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) |---> (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 & B2; + A[1 + 5*y] ^= ~B2 & B3; + A[2 + 5*y] ^= ~B3 & B4; + A[3 + 5*y] ^= ~B4 & B0; + A[4 + 5*y] ^= ~B0 & 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 < 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 + +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 +#include +#include +#include + +#include "keccak.h" + +#include "sha3.h" + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +void *(*volatile sha3_explicit_memset_impl)(void *, int, size_t) = &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] << 8) | + ((uint64_t)p[2] << 16) | + ((uint64_t)p[3] << 24) | + ((uint64_t)p[4] << 32) | + ((uint64_t)p[5] << 40) | + ((uint64_t)p[6] << 48) | + ((uint64_t)p[7] << 56)); +} + +static inline void +le64enc(void *buf, uint64_t v) +{ + uint8_t *p = buf; + + *p++ = v; v >>= 8; + *p++ = v; v >>= 8; + *p++ = v; v >>= 8; + *p++ = v; v >>= 8; + *p++ = v; v >>= 8; + *p++ = v; v >>= 8; + *p++ = v; v >>= 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->nb = 8*rw; + for (iw = 0; iw < 25; iw++) + C->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 < C->nb); + + /* If there's a partial word, try to fill it. */ + if ((C->nb % 8) != 0) { + T = 0; + for (ib = 0; ib < MIN(len, C->nb % 8); ib++) + T |= (uint64_t)data[ib] << (8*ib); + C->A[rw - (C->nb + 7)/8] ^= T << (8*(8 - (C->nb % 8))); + C->nb -= ib; + data += ib; + len -= ib; + + /* If we filled the buffer, permute now. */ + if (C->nb == 0) { + keccakf1600(C->A); + C->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->nb % 8) == 0); + if (C->nb < 8*rw) { + for (iw = 0; iw < MIN(len, C->nb)/8; iw++) + C->A[rw - C->nb/8 + iw] ^= le64dec(data + 8*iw); + C->nb -= 8*iw; + data += 8*iw; + len -= 8*iw; + + /* If we filled the buffer, permute now. */ + if (C->nb == 0) { + keccakf1600(C->A); + C->nb = 8*rw; + } else { + /* Otherwise, less than a word left. */ + assert(len < 8); + goto partial; + } + } + + /* At a buffer boundary. Absorb input one buffer at a time. */ + assert(C->nb == 8*rw); + while (8*rw <= len) { + for (iw = 0; iw < rw; iw++) + C->A[iw] ^= le64dec(data + 8*iw); + keccakf1600(C->A); + data += 8*rw; + len -= 8*rw; + } + + /* Partially fill the buffer with as many words as we can. */ + for (iw = 0; iw < len/8; iw++) + C->A[rw - C->nb/8 + iw] ^= le64dec(data + 8*iw); + C->nb -= 8*iw; + data += 8*iw; + len -= 8*iw; + +partial: + /* Partially fill the last word with as many bytes as we can. */ + assert(len < 8); + assert(0 < C->nb); + assert((C->nb % 8) == 0); + T = 0; + for (ib = 0; ib < len; ib++) + T |= (uint64_t)data[ib] << (8*ib); + C->A[rw - C->nb/8] ^= T; + C->nb -= ib; + assert(0 < C->nb); +} + +static void +sha3_final(uint8_t *h, unsigned d, struct sha3 *C, unsigned rw) +{ + unsigned nw, iw; + + assert(d <= 8*25); + assert(0 < C->nb); + + /* Append 01, pad with 10*1 up to buffer boundary, LSB first. */ + nw = (C->nb + 7)/8; + assert(0 < nw); + assert(nw <= rw); + C->A[rw - nw] ^= (uint64_t)0x06 << (8*(8*nw - C->nb)); + C->A[rw - 1] ^= 0x8000000000000000ULL; + + /* Permute one last time. */ + keccakf1600(C->A); + + /* Reveal the first 8d bits of state, forget 1600-8d of them. */ + for (iw = 0; iw < d/8; iw++) + le64enc(h + 8*iw, C->A[iw]); + h += 8*iw; + d -= 8*iw; + if (0 < d) { + /* For SHA3-224, we need to expose a partial word. */ + uint64_t T = C->A[iw]; + do { + *h++ = T & 0xff; + T >>= 8; + } while (--d); + } + (void)explicit_memset(C->A, 0, sizeof C->A); + C->nb = 0; +} + +static void +shake_final(uint8_t *h, unsigned d, struct sha3 *C, unsigned rw) +{ + unsigned nw, iw; + + assert(0 < C->nb); + + /* Append 1111, pad with 10*1 up to buffer boundary, LSB first. */ + nw = (C->nb + 7)/8; + assert(0 < nw); + assert(nw <= rw); + C->A[rw - nw] ^= (uint64_t)0x1f << (8*(8*nw - C->nb)); + C->A[rw - 1] ^= 0x8000000000000000ULL; + + /* Permute, reveal first rw words of state, repeat. */ + while (8*rw <= d) { + keccakf1600(C->A); + for (iw = 0; iw < rw; iw++) + le64enc(h + 8*iw, C->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 < d) { + keccakf1600(C->A); + for (iw = 0; iw < d/8; iw++) + le64enc(h + 8*iw, C->A[iw]); + h += 8*iw; + d -= 8*iw; + + /* + * If 8 does not divide d, more bytes are wanted: + * reveal them. + */ + if (0 < d) { + uint64_t T = C->A[iw]; + do { + *h++ = T & 0xff; + T >>= 8; + } while (--d); + } + } + + (void)explicit_memset(C->A, 0, sizeof C->A); + C->nb = 0; +} + +void +SHA3_224_Init(SHA3_224_CTX *C) +{ + + sha3_init(&C->C224, sha3_rate(SHA3_224_DIGEST_LENGTH)); +} + +void +SHA3_224_Update(SHA3_224_CTX *C, const uint8_t *data, size_t len) +{ + + sha3_update(&C->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, &C->C224, + sha3_rate(SHA3_224_DIGEST_LENGTH)); +} + +void +SHA3_256_Init(SHA3_256_CTX *C) +{ + + sha3_init(&C->C256, sha3_rate(SHA3_256_DIGEST_LENGTH)); +} + +void +SHA3_256_Update(SHA3_256_CTX *C, const uint8_t *data, size_t len) +{ + + sha3_update(&C->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, &C->C256, + sha3_rate(SHA3_256_DIGEST_LENGTH)); +} + +void +SHA3_384_Init(SHA3_384_CTX *C) +{ + + sha3_init(&C->C384, sha3_rate(SHA3_384_DIGEST_LENGTH)); +} + +void +SHA3_384_Update(SHA3_384_CTX *C, const uint8_t *data, size_t len) +{ + + sha3_update(&C->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, &C->C384, + sha3_rate(SHA3_384_DIGEST_LENGTH)); +} + +void +SHA3_512_Init(SHA3_512_CTX *C) +{ + + sha3_init(&C->C512, sha3_rate(SHA3_512_DIGEST_LENGTH)); +} + +void +SHA3_512_Update(SHA3_512_CTX *C, const uint8_t *data, size_t len) +{ + + sha3_update(&C->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, &C->C512, + sha3_rate(SHA3_512_DIGEST_LENGTH)); +} + +void +SHAKE128_Init(SHAKE128_CTX *C) +{ + + sha3_init(&C->C128, sha3_rate(128/8)); +} + +void +SHAKE128_Update(SHAKE128_CTX *C, const uint8_t *data, size_t len) +{ + + sha3_update(&C->C128, data, len, sha3_rate(128/8)); +} + +void +SHAKE128_Final(uint8_t *h, size_t d, SHAKE128_CTX *C) +{ + + shake_final(h, d, &C->C128, sha3_rate(128/8)); +} + +void +SHAKE256_Init(SHAKE256_CTX *C) +{ + + sha3_init(&C->C256, sha3_rate(256/8)); +} + +void +SHAKE256_Update(SHAKE256_CTX *C, const uint8_t *data, size_t len) +{ + + sha3_update(&C->C256, data, len, sha3_rate(256/8)); +} + +void +SHAKE256_Final(uint8_t *h, size_t d, SHAKE256_CTX *C) +{ + + shake_final(h, d, &C->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 >> 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 + * : + * 0-bit, 1600-bit repeated 0xa3 (= 0b10100011). + */ + SHA3_224_Init(&sha3224); + SHA3_224_Final(d, &sha3224); + if (memcmp(d, d224_0, 28) != 0) + return -1; + SHA3_256_Init(&sha3256); + SHA3_256_Final(d, &sha3256); + if (memcmp(d, d256_0, 32) != 0) + return -1; + SHA3_384_Init(&sha3384); + SHA3_384_Final(d, &sha3384); + if (memcmp(d, d384_0, 48) != 0) + return -1; + SHA3_512_Init(&sha3512); + SHA3_512_Final(d, &sha3512); + if (memcmp(d, d512_0, 64) != 0) + return -1; + SHAKE128_Init(&shake128); + SHAKE128_Final(d, 41, &shake128); + if (memcmp(d, shake128_0_41, 41) != 0) + return -1; + SHAKE256_Init(&shake256); + SHAKE256_Final(d, 73, &shake256); + if (memcmp(d, shake256_0_73, 73) != 0) + return -1; + + (void)memset(m, 0xa3, 200); + SHA3_224_Init(&sha3224); + SHA3_224_Update(&sha3224, m, 200); + SHA3_224_Final(d, &sha3224); + if (memcmp(d, d224_1600, 28) != 0) + return -1; + SHA3_256_Init(&sha3256); + SHA3_256_Update(&sha3256, m, 200); + SHA3_256_Final(d, &sha3256); + if (memcmp(d, d256_1600, 32) != 0) + return -1; + SHA3_384_Init(&sha3384); + SHA3_384_Update(&sha3384, m, 200); + SHA3_384_Final(d, &sha3384); + if (memcmp(d, d384_1600, 48) != 0) + return -1; + SHA3_512_Init(&sha3512); + SHA3_512_Update(&sha3512, m, 200); + SHA3_512_Final(d, &sha3512); + if (memcmp(d, d512_1600, 64) != 0) + return -1; + SHAKE128_Init(&shake128); + SHAKE128_Update(&shake128, m, 200); + SHAKE128_Final(d, 41, &shake128); + if (memcmp(d, shake128_1600_41, 41) != 0) + return -1; + SHAKE256_Init(&shake256); + SHAKE256_Update(&shake256, m, 200); + SHAKE256_Final(d, 73, &shake256); + if (memcmp(d, shake256_1600_73, 73) != 0) + return -1; + + /* + * Hand-crufted test vectors with unaligned message lengths. + */ + SHA3_512_Init(&ctx); + for (mi = 0; mi < 6; mi++) { + sha3_selftest_prng(m, mlen[mi], (224/8)*mlen[mi]); + SHA3_224_Init(&sha3224); + SHA3_224_Update(&sha3224, m, mlen[mi]); + SHA3_224_Final(d, &sha3224); + SHA3_512_Update(&ctx, d, 224/8); + } + for (mi = 0; mi < 6; mi++) { + sha3_selftest_prng(m, mlen[mi], (256/8)*mlen[mi]); + SHA3_256_Init(&sha3256); + SHA3_256_Update(&sha3256, m, mlen[mi]); + SHA3_256_Final(d, &sha3256); + SHA3_512_Update(&ctx, d, 256/8); + } + for (mi = 0; mi < 6; mi++) { + sha3_selftest_prng(m, mlen[mi], (384/8)*mlen[mi]); + SHA3_384_Init(&sha3384); + SHA3_384_Update(&sha3384, m, mlen[mi]); + SHA3_384_Final(d, &sha3384); + SHA3_512_Update(&ctx, d, 384/8); + } + for (mi = 0; mi < 6; mi++) { + sha3_selftest_prng(m, mlen[mi], (512/8)*mlen[mi]); + SHA3_512_Init(&sha3512); + SHA3_512_Update(&sha3512, m, mlen[mi]); + SHA3_512_Final(d, &sha3512); + SHA3_512_Update(&ctx, d, 512/8); + } + SHA3_512_Final(d, &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 +#include + +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 + * + * 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 +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#include "sha3.h" +#include +#include +#include +#include +#include + +#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(&ctx); + + if ((fd = open(filename, O_RDONLY)) < 0) + return (0); + + while ((num = read(fd, buffer, sizeof(buffer))) > 0) + SHA3_224_Update(&ctx, buffer, (size_t) num); + + oerrno = errno; + close(fd); + errno = oerrno; + return (num < 0 ? 0 : SHA3_224_End(&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 < SHA3_224_DIGEST_LENGTH; i++) { + *buffer++ = sha3_hex_digits[(*d & 0xf0) >> 4]; + *buffer++ = sha3_hex_digits[*d & 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(&ctx); + SHA3_224_Update(&ctx, data, len); + return SHA3_224_End(&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(&ctx); + + if ((fd = open(filename, O_RDONLY)) < 0) + return (0); + + while ((num = read(fd, buffer, sizeof(buffer))) > 0) + SHA3_256_Update(&ctx, buffer, (size_t) num); + + oerrno = errno; + close(fd); + errno = oerrno; + return (num < 0 ? 0 : SHA3_256_End(&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 < SHA3_256_DIGEST_LENGTH; i++) { + *buffer++ = sha3_hex_digits[(*d & 0xf0) >> 4]; + *buffer++ = sha3_hex_digits[*d & 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(&ctx); + SHA3_256_Update(&ctx, data, len); + return SHA3_256_End(&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(&ctx); + + if ((fd = open(filename, O_RDONLY)) < 0) + return (0); + + while ((num = read(fd, buffer, sizeof(buffer))) > 0) + SHA3_384_Update(&ctx, buffer, (size_t) num); + + oerrno = errno; + close(fd); + errno = oerrno; + return (num < 0 ? 0 : SHA3_384_End(&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 < SHA3_384_DIGEST_LENGTH; i++) { + *buffer++ = sha3_hex_digits[(*d & 0xf0) >> 4]; + *buffer++ = sha3_hex_digits[*d & 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(&ctx); + SHA3_384_Update(&ctx, data, len); + return SHA3_384_End(&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(&ctx); + + if ((fd = open(filename, O_RDONLY)) < 0) + return (0); + + while ((num = read(fd, buffer, sizeof(buffer))) > 0) + SHA3_512_Update(&ctx, buffer, (size_t) num); + + oerrno = errno; + close(fd); + errno = oerrno; + return (num < 0 ? 0 : SHA3_512_End(&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 < SHA3_512_DIGEST_LENGTH; i++) { + *buffer++ = sha3_hex_digits[(*d & 0xf0) >> 4]; + *buffer++ = sha3_hex_digits[*d & 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(&ctx); + SHA3_512_Update(&ctx, data, len); + return SHA3_512_End(&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 + * 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 #endif @@ -43,17 +36,17 @@ #endif #ifdef HAVE_UNISTD_H #include #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 *);