On Fri, Oct 11, 2019 at 06:52:04PM +0200, David Sterba wrote: > The patch brings support of several BLAKE2 variants (2b with various > digest lengths). The keyed digest is supported, using tfm->setkey call. > The in-tree user will be btrfs (for checksumming), we're going to use > the BLAKE2b-256 variant. > > The code is reference implementation taken from the official sources and > modified in terms of kernel coding style (whitespace, comments, uintXX_t > -> uXX types, removed unused prototypes and #ifdefs, removed testing > code, changed secure_zero_memory -> memzero_explicit, used own helpers > for unaligned reads/writes and rotations). > > Further changes removed sanity checks of key length or output size, > these values are verified in the crypto API callbacks or hardcoded in > shash_alg and not exposed to users. > > Signed-off-by: David Sterba <dsterba@xxxxxxxx> > --- > crypto/Kconfig | 17 ++ > crypto/Makefile | 1 + > crypto/blake2b_generic.c | 418 +++++++++++++++++++++++++++++++++++++++ > include/crypto/blake2b.h | 48 +++++ > 4 files changed, 484 insertions(+) > create mode 100644 crypto/blake2b_generic.c > create mode 100644 include/crypto/blake2b.h > > diff --git a/crypto/Kconfig b/crypto/Kconfig > index e801450bcb1c..192cbb824928 100644 > --- a/crypto/Kconfig > +++ b/crypto/Kconfig > @@ -691,6 +691,23 @@ config CRYPTO_XXHASH > xxHash non-cryptographic hash algorithm. Extremely fast, working at > speeds close to RAM limits. > > +config CRYPTO_BLAKE2B > + tristate "BLAKE2b digest algorithm" > + select CRYPTO_HASH > + help > + Implementation of cryptographic hash function BLAKE2b (or just BLAKE2), > + optimized for 64bit platforms and can produce digests of any size > + between 1 to 64. The keyed hash is also implemented. > + > + This module provides the following algorithms: > + > + - blake2b-160 > + - blake2b-256 > + - blake2b-384 > + - blake2b-512 > + > + See https://blake2.net for further information. > + > config CRYPTO_CRCT10DIF > tristate "CRCT10DIF algorithm" > select CRYPTO_HASH > diff --git a/crypto/Makefile b/crypto/Makefile > index 9479e1a45d8c..2318420d3e71 100644 > --- a/crypto/Makefile > +++ b/crypto/Makefile > @@ -74,6 +74,7 @@ obj-$(CONFIG_CRYPTO_STREEBOG) += streebog_generic.o > obj-$(CONFIG_CRYPTO_WP512) += wp512.o > CFLAGS_wp512.o := $(call cc-option,-fno-schedule-insns) # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79149 > obj-$(CONFIG_CRYPTO_TGR192) += tgr192.o > +obj-$(CONFIG_CRYPTO_BLAKE2B) += blake2b_generic.o > obj-$(CONFIG_CRYPTO_GF128MUL) += gf128mul.o > obj-$(CONFIG_CRYPTO_ECB) += ecb.o > obj-$(CONFIG_CRYPTO_CBC) += cbc.o > diff --git a/crypto/blake2b_generic.c b/crypto/blake2b_generic.c > new file mode 100644 > index 000000000000..e31fb669383b > --- /dev/null > +++ b/crypto/blake2b_generic.c > @@ -0,0 +1,418 @@ > +// SPDX-License-Identifier: (GPL-2.0-only OR Apache-2.0) > +/* > + * BLAKE2b reference source code package - reference C implementations > + * > + * Copyright 2012, Samuel Neves <sneves@xxxxxxxxx>. You may use this under the > + * terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at > + * your option. The terms of these licenses can be found at: > + * > + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 > + * - OpenSSL license : https://www.openssl.org/source/license.html > + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 > + * > + * More information about the BLAKE2 hash function can be found at > + * https://blake2.net. > + */ Can you also adjust this comment to make it clear that this isn't the reference implementation verbatim, but rather it's been modified for inclusion in the kernel? Thanks! - Eric