Skip to content

Commit

Permalink
Add new SHA2 files
Browse files Browse the repository at this point in the history
The C files are generic public domain files which are mostly faster the
the BSD ones - this depends on compiler and it's flags of cause ;)

The assembly files are taken from current openssl master, and are
licensed under the Apache License Version 2.0:
- sha256-x86_64.S: SSSE3, AVX, AVX2, SHA-NI
- sha512-x86_64.S: AVX, AVX2
- sha256-armv8.S:  NEON, ARMv8 Cryptography Extension
- sha512-armv8.S:  ARMv8 Cryptography Extension
- sha256-ppc.S:    generic PPC64 LE/BE
- sha512-ppc.S:    generic PPC64 LE/BE
- sha256-p8.S:     Power ISA Version 2.07 LE/BE
- sha512-p8.S:     Power ISA Version 2.07 LE/BE

Signed-off-by: Tino Reichardt <[email protected]>
  • Loading branch information
mcmilk committed Aug 5, 2022
1 parent 3886f99 commit 97c0f4c
Show file tree
Hide file tree
Showing 41 changed files with 18,963 additions and 1,899 deletions.
6 changes: 4 additions & 2 deletions cmd/ztest.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@
#include <libnvpair.h>
#include <libzutil.h>
#include <sys/crypto/icp.h>
#include <sys/zfs_impl.h>
#if (__GLIBC__ && !__UCLIBC__)
#include <execinfo.h> /* for backtrace() */
#endif
Expand Down Expand Up @@ -6389,6 +6390,7 @@ ztest_blake3(ztest_ds_t *zd, uint64_t id)
int i, *ptr;
uint32_t size;
BLAKE3_CTX ctx;
const zfs_impl_t *blake3 = zfs_impl_get_ops("blake3");

size = ztest_random_blocksize();
buf = umem_alloc(size, UMEM_NOFAIL);
Expand All @@ -6413,7 +6415,7 @@ ztest_blake3(ztest_ds_t *zd, uint64_t id)
void *res2 = &zc_res2;

/* BLAKE3_KEY_LEN = 32 */
VERIFY0(blake3_set_impl_name("generic"));
VERIFY0(blake3->setname("generic"));
templ = abd_checksum_blake3_tmpl_init(&salt);
Blake3_InitKeyed(&ctx, salt_ptr);
Blake3_Update(&ctx, buf, size);
Expand All @@ -6422,7 +6424,7 @@ ztest_blake3(ztest_ds_t *zd, uint64_t id)
ZIO_CHECKSUM_BSWAP(&zc_ref2);
abd_checksum_blake3_tmpl_free(templ);

VERIFY0(blake3_set_impl_name("cycle"));
VERIFY0(blake3->setname("cycle"));
while (run_count-- > 0) {

/* Test current implementation */
Expand Down
2 changes: 2 additions & 0 deletions include/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ COMMON_H = \
sys/rrwlock.h \
sys/sa.h \
sys/sa_impl.h \
sys/sha2.h \
sys/skein.h \
sys/spa.h \
sys/spa_boot.h \
Expand Down Expand Up @@ -124,6 +125,7 @@ COMMON_H = \
sys/zfs_delay.h \
sys/zfs_file.h \
sys/zfs_fuid.h \
sys/zfs_impl.h \
sys/zfs_project.h \
sys/zfs_quota.h \
sys/zfs_racct.h \
Expand Down
9 changes: 9 additions & 0 deletions include/os/freebsd/spl/sys/mod_os.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,15 @@
#define fletcher_4_param_set_args(var) \
CTLTYPE_STRING, NULL, 0, fletcher_4_param, "A"

#define blake3_param_set_args(var) \
CTLTYPE_STRING, NULL, 0, blake3_param, "A"

#define sha256_param_set_args(var) \
CTLTYPE_STRING, NULL, 0, sha256_param, "A"

#define sha512_param_set_args(var) \
CTLTYPE_STRING, NULL, 0, sha512_param, "A"

#include <sys/kernel.h>
#define module_init(fn) \
static void \
Expand Down
31 changes: 5 additions & 26 deletions include/sys/blake3.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@
/*
* Based on BLAKE3 v1.3.1, https://github.com/BLAKE3-team/BLAKE3
* Copyright (c) 2019-2020 Samuel Neves and Jack O'Connor
* Copyright (c) 2021 Tino Reichardt <[email protected]>
* Copyright (c) 2021-2022 Tino Reichardt <[email protected]>
*/

#ifndef BLAKE3_H
#define BLAKE3_H
#ifndef _SYS_BLAKE3_H
#define _SYS_BLAKE3_H

#ifdef _KERNEL
#include <sys/types.h>
Expand Down Expand Up @@ -72,7 +72,7 @@ typedef struct {
*/
uint8_t cv_stack[(BLAKE3_MAX_DEPTH + 1) * BLAKE3_OUT_LEN];

/* const blake3_impl_ops_t *ops */
/* const blake3_ops_t *ops */
const void *ops;
} BLAKE3_CTX;

Expand All @@ -97,29 +97,8 @@ extern void **blake3_per_cpu_ctx;
extern void blake3_per_cpu_ctx_init(void);
extern void blake3_per_cpu_ctx_fini(void);

/* return number of supported implementations */
extern int blake3_get_impl_count(void);

/* return id of selected implementation */
extern int blake3_get_impl_id(void);

/* return name of selected implementation */
extern const char *blake3_get_impl_name(void);

/* setup id as fastest implementation */
extern void blake3_set_impl_fastest(uint32_t id);

/* set implementation by id */
extern void blake3_set_impl_id(uint32_t id);

/* set implementation by name */
extern int blake3_set_impl_name(const char *name);

/* set startup implementation */
extern void blake3_setup_impl(void);

#ifdef __cplusplus
}
#endif

#endif /* BLAKE3_H */
#endif /* _SYS_BLAKE3_H */
107 changes: 107 additions & 0 deletions include/sys/sha2.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or https://opensource.org/licenses/CDDL-1.0.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/

/*
* Copyright (c) 2022 Tino Reichardt <[email protected]>
*/

#ifndef _SYS_SHA2_H
#define _SYS_SHA2_H

#ifdef _KERNEL
#include <sys/types.h>
#else
#include <stdint.h>
#include <stdlib.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

#define SHA224_BLOCK_LENGTH 64
#define SHA256_BLOCK_LENGTH 64
#define SHA384_BLOCK_LENGTH 128
#define SHA512_BLOCK_LENGTH 128

#define SHA224_DIGEST_LENGTH 28
#define SHA256_DIGEST_LENGTH 32
#define SHA384_DIGEST_LENGTH 48
#define SHA512_DIGEST_LENGTH 64

#define SHA512_224_DIGEST_LENGTH 28
#define SHA512_256_DIGEST_LENGTH 32

/* sha256 context */
typedef struct {
uint32_t state[8];
uint64_t count[2];
uint8_t wbuf[64];

/* const sha256_ops_t *ops */
const void *ops;
} sha256_ctx;

/* sha512 context */
typedef struct {
uint64_t state[8];
uint64_t count[2];
uint8_t wbuf[128];

/* const sha256_ops_t *ops */
const void *ops;
} sha512_ctx;

/* SHA2 context */
typedef struct {
union {
sha256_ctx sha256;
sha512_ctx sha512;
};

/* algorithm type */
int algotype;
} SHA2_CTX;

/* SHA2 algorithm types */
enum sha2_algotype {
SHA224 = 0,
SHA256,
SHA384,
SHA512,
SHA512_224,
SHA512_256
};

/* SHA2 Init function */
extern void SHA2Init(SHA2_CTX *ctx, int algotype);

/* SHA2 Update function */
extern void SHA2Update(SHA2_CTX *ctx, const void *data, size_t len);

/* SHA2 Final function */
extern void SHA2Final(SHA2_CTX *ctx, void *digest);

#ifdef __cplusplus
}
#endif

#endif /* SYS_SHA2_H */
69 changes: 69 additions & 0 deletions include/sys/zfs_impl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or https://opensource.org/licenses/CDDL-1.0.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/

/*
* Copyright (c) 2022 Tino Reichardt <[email protected]>
*/

#ifndef _SYS_ZFS_IMPL_H
#define _SYS_ZFS_IMPL_H

#ifdef __cplusplus
extern "C" {
#endif

/* generic implementation backends */
typedef struct
{
/* algorithm name */
const char *name;

/* get number of supported implementations */
uint32_t (*getcnt)(void);

/* get id of selected implementation */
uint32_t (*getid)(void);

/* get name of selected implementation */
const char *(*getname)(void);

/* setup id as fastest implementation */
void (*set_fastest)(uint32_t id);

/* set implementation by id */
void (*setid)(uint32_t id);

/* set implementation by name */
int (*setname)(const char *val);
} zfs_impl_t;

/* return some set of function pointer */
extern const zfs_impl_t *zfs_impl_get_ops(const char *algo);

extern const zfs_impl_t zfs_blake3_ops;
extern const zfs_impl_t zfs_sha256_ops;
extern const zfs_impl_t zfs_sha512_ops;

#ifdef __cplusplus
}
#endif

#endif /* _SYS_ZFS_IMPL_H */
6 changes: 3 additions & 3 deletions include/sys/zio_checksum.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,9 @@ _SYS_ZIO_CHECKSUM_H const zio_checksum_info_t
*/

/* SHA2 */
extern zio_checksum_t abd_checksum_SHA256;
extern zio_checksum_t abd_checksum_SHA512_native;
extern zio_checksum_t abd_checksum_SHA512_byteswap;
extern zio_checksum_t abd_checksum_sha256;
extern zio_checksum_t abd_checksum_sha512_native;
extern zio_checksum_t abd_checksum_sha512_byteswap;

/* Skein */
extern zio_checksum_t abd_checksum_skein_native;
Expand Down
23 changes: 15 additions & 8 deletions lib/libicp/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ nodist_libicp_la_SOURCES = \
module/icp/algs/blake3/blake3.c \
module/icp/algs/blake3/blake3_generic.c \
module/icp/algs/blake3/blake3_impl.c \
module/icp/algs/blake3/blake3_x86-64.c \
module/icp/algs/edonr/edonr.c \
module/icp/algs/modes/modes.c \
module/icp/algs/modes/cbc.c \
Expand All @@ -26,30 +25,38 @@ nodist_libicp_la_SOURCES = \
module/icp/algs/modes/ctr.c \
module/icp/algs/modes/ccm.c \
module/icp/algs/modes/ecb.c \
module/icp/algs/sha2/sha2.c \
module/icp/algs/sha2/sha2_generic.c \
module/icp/algs/sha2/sha256_impl.c \
module/icp/algs/sha2/sha512_impl.c \
module/icp/algs/skein/skein.c \
module/icp/algs/skein/skein_block.c \
module/icp/algs/skein/skein_iv.c \
module/icp/illumos-crypto.c \
module/icp/io/aes.c \
module/icp/io/sha2_mod.c \
module/icp/io/skein_mod.c \
module/icp/core/kcf_sched.c \
module/icp/core/kcf_prov_lib.c \
module/icp/core/kcf_callprov.c \
module/icp/core/kcf_mech_tabs.c \
module/icp/core/kcf_prov_tabs.c
module/icp/core/kcf_prov_tabs.c \
module/zfs/zfs_impl.c

if TARGET_CPU_AARCH64
nodist_libicp_la_SOURCES += \
module/icp/asm-aarch64/blake3/b3_aarch64_sse2.S \
module/icp/asm-aarch64/blake3/b3_aarch64_sse41.S
module/icp/asm-aarch64/blake3/b3_aarch64_sse41.S \
module/icp/asm-aarch64/sha2/sha256-armv8.S \
module/icp/asm-aarch64/sha2/sha512-armv8.S
endif

if TARGET_CPU_POWERPC
nodist_libicp_la_SOURCES += \
module/icp/asm-ppc64/blake3/b3_ppc64le_sse2.S \
module/icp/asm-ppc64/blake3/b3_ppc64le_sse41.S
module/icp/asm-ppc64/blake3/b3_ppc64le_sse41.S \
module/icp/asm-ppc64/sha2/sha256-ppc.S \
module/icp/asm-ppc64/sha2/sha512-ppc.S \
module/icp/asm-ppc64/sha2/sha256-p8.S \
module/icp/asm-ppc64/sha2/sha512-p8.S
endif

if TARGET_CPU_X86_64
Expand All @@ -60,8 +67,8 @@ nodist_libicp_la_SOURCES += \
module/icp/asm-x86_64/modes/gcm_pclmulqdq.S \
module/icp/asm-x86_64/modes/aesni-gcm-x86_64.S \
module/icp/asm-x86_64/modes/ghash-x86_64.S \
module/icp/asm-x86_64/sha2/sha256_impl.S \
module/icp/asm-x86_64/sha2/sha512_impl.S \
module/icp/asm-x86_64/sha2/sha256-x86_64.S \
module/icp/asm-x86_64/sha2/sha512-x86_64.S \
module/icp/asm-x86_64/blake3/blake3_avx2.S \
module/icp/asm-x86_64/blake3/blake3_avx512.S \
module/icp/asm-x86_64/blake3/blake3_sse2.S \
Expand Down
1 change: 0 additions & 1 deletion lib/libspl/include/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ libspl_sys_HEADERS = \
%D%/sys/poll.h \
%D%/sys/priv.h \
%D%/sys/processor.h \
%D%/sys/sha2.h \
%D%/sys/simd.h \
%D%/sys/stack.h \
%D%/sys/stdtypes.h \
Expand Down
3 changes: 0 additions & 3 deletions lib/libzfs/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@ dist_libzfs_la_SOURCES += \
endif

nodist_libzfs_la_SOURCES = \
module/icp/algs/sha2/sha2.c \
\
module/zcommon/cityhash.c \
module/zcommon/zfeature_common.c \
module/zcommon/zfs_comutil.c \
Expand All @@ -52,7 +50,6 @@ nodist_libzfs_la_SOURCES = \
module/zcommon/zpool_prop.c \
module/zcommon/zprop_common.c


libzfs_la_LIBADD = \
libshare.la \
libzfs_core.la \
Expand Down
Loading

0 comments on commit 97c0f4c

Please sign in to comment.