22783053 update libgcrypt to version 1.6.4
authorJan Friedel <jan.friedel@oracle.com>
Mon, 23 May 2016 23:10:00 -0700
changeset 6051 b82321ce36f1
parent 6050 7adf81b65d0d
child 6052 0e7e6e8c8703
22783053 update libgcrypt to version 1.6.4
components/libgcrypt-15/Makefile
components/libgcrypt-15/test/results-all.master
components/libgcrypt/Makefile
components/libgcrypt/libgcrypt-15.p5m.abi_transition
components/libgcrypt/libgcrypt.p5m
components/libgcrypt/patches/libgcrypt-01-asm-divide.patch
components/libgcrypt/patches/libgcrypt-02-automake.patch
components/libgcrypt/patches/libgcrypt-03-aliasing.patch
components/libgcrypt/test/results-all.master
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libgcrypt-15/Makefile	Mon May 23 23:10:00 2016 -0700
@@ -0,0 +1,80 @@
+#
+# 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 http://www.opensolaris.org/os/licensing.
+# 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) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
+#
+BUILD_BITS= 64_and_32
+include ../../make-rules/shared-macros.mk
+
+COMPONENT_NAME=		libgcrypt
+COMPONENT_VERSION=	1.5.3
+COMPONENT_PROJECT_URL=  ftp://ftp.gnupg.org/gcrypt/libgcrypt/ 
+COMPONENT_ARCHIVE=	$(COMPONENT_SRC).tar.bz2
+COMPONENT_ARCHIVE_HASH= \
+    sha256:bcf5334e7da352c45de6aec5d2084ce9a1d30029ff4a4a5da13f1848874759d1
+COMPONENT_ARCHIVE_URL=  ftp://ftp.gnupg.org/gcrypt/$(COMPONENT_NAME)/$(COMPONENT_ARCHIVE)
+COMPONENT_BUGDB=	library/libgcrypt
+
+TPNO=			7588
+
+COMPONENT_BUILD_TARGETS = all info
+
+include $(WS_MAKE_RULES)/common.mk
+
+CONFIGURE_OPTIONS += --sysconfdir=$(ETCDIR)
+CONFIGURE_OPTIONS += --infodir=$(CONFIGURE_INFODIR)
+CONFIGURE_OPTIONS += --enable-maintainer-mode 
+CONFIGURE_OPTIONS += --disable-asm 
+CONFIGURE_OPTIONS += --enable-ciphers=arcfour:blowfish:des:aes:twofish:serpent:rfc2268:seed:camellia:cast5
+
+#
+# The following target is used during switch of the incompatible libgcrypt.11
+# to libgcrypt.20.  Libgcrypt-15 is not delivered as a package. If it has not
+# been built yet, we build the library as a target dependency from here and
+# deliver a subset of the library (the shared objects only and the second
+# level links) to satisfy the ABI compatibility requirements during the ABI
+# upgrade period.
+$(COMPONENT_DIR)/../libgcrypt/build/$(MACH32)/.installed \
+$(COMPONENT_DIR)/../libgcrypt/build/$(MACH64)/.installed:
+	$(GMAKE) install
+
+ASLR_MODE = $(ASLR_ENABLE)
+
+include ../../make-rules/shared-targets.mk
+
+COMPONENT_TEST_MASTER = $(COMPONENT_TEST_RESULTS_DIR)/results-all.master
+
+COMPONENT_TEST_TRANSFORMS += \
+        '-n -e "/PASS/p" ' \
+        '-e "/FAIL/p" ' \
+        '-e "/All/p" '
+
+LIBGCRYPT_PROTO_USRLIB = \
+	$(WS_COMPONENTS)/libgcrypt/build/prototype/$(MACH)$(USRLIB)
+COMPONENT_POST_INSTALL_ACTION = \
+	$(INSTALL) -D -m 644 \
+		$(BUILD_DIR)/$(MACH$(BITS))/src/.libs/libgcrypt.so.11.8.2 \
+		-t $(LIBGCRYPT_PROTO_USRLIB); \
+	(cd $(LIBGCRYPT_PROTO_USRLIB); $(RM) -f libgcrypt.so.11; \
+	$(LN) -s -f libgcrypt.so.11.8.2 libgcrypt.so.11)
+
+REQUIRED_PACKAGES += library/security/libgpg-error
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libgcrypt-15/test/results-all.master	Mon May 23 23:10:00 2016 -0700
@@ -0,0 +1,22 @@
+PASS: version
+PASS: t-mpi-bit
+PASS: prime
+PASS: register
+PASS: ac
+PASS: ac-schemes
+PASS: ac-data
+PASS: basic
+PASS: mpitests
+PASS: tsexp
+PASS: keygen
+PASS: pubkey
+PASS: hmac
+PASS: keygrip
+PASS: fips186-dsa
+PASS: aeswrap
+PASS: curves
+PASS: t-kdf
+PASS: pkcs1v2
+PASS: random
+PASS: benchmark
+All 21 tests passed
--- a/components/libgcrypt/Makefile	Mon May 23 23:09:59 2016 -0700
+++ b/components/libgcrypt/Makefile	Mon May 23 23:10:00 2016 -0700
@@ -26,30 +26,64 @@
 include ../../make-rules/shared-macros.mk
 
 COMPONENT_NAME=		libgcrypt
-COMPONENT_VERSION=	1.5.3
+COMPONENT_VERSION=	1.6.4
 COMPONENT_PROJECT_URL=  ftp://ftp.gnupg.org/gcrypt/libgcrypt/ 
 COMPONENT_ARCHIVE=	$(COMPONENT_SRC).tar.bz2
 COMPONENT_ARCHIVE_HASH= \
-    sha256:bcf5334e7da352c45de6aec5d2084ce9a1d30029ff4a4a5da13f1848874759d1
+    sha256:c9bc2c7fe2e5f4ea13b0c74f9d24bcbb1ad889bb39297d8082aebf23f4336026
 COMPONENT_ARCHIVE_URL=  ftp://ftp.gnupg.org/gcrypt/$(COMPONENT_NAME)/$(COMPONENT_ARCHIVE)
 COMPONENT_BUGDB=	library/libgcrypt
 
-TPNO=			7588
+TPNO=			26276
 
 COMPONENT_BUILD_TARGETS = all info
 
 include $(WS_MAKE_RULES)/common.mk
+#
+# Any improvements made by the upstream to enable compilation of
+# libgcrypt library on Solaris primarily reference GNU tools.  The
+# library assembly source code contains ANSI notations currently not
+# supported by Solaris C language preprocessor, cpp(1). Heavy manual
+# patching in a potentially dangerous area would be needed to allow use
+# of Solaris Studio as the component compiler.
+COMPILER =		gcc
+
+#
+# The gcc deliverred with Solaris prior the gcc version 5.3 uses
+# different assembler versions on x86 and SPARC platforms. This causes
+# compilation issues. The GCC_ROOT explicitly sets the version of the
+# compiler to version 5.3 which resolves this problem. The line should
+# be removed once gcc on both platforms starts using the same assembler.
+GCC_ROOT = /usr/gcc/5.3
 
 CONFIGURE_OPTIONS += --sysconfdir=$(ETCDIR)
 CONFIGURE_OPTIONS += --infodir=$(CONFIGURE_INFODIR)
 CONFIGURE_OPTIONS += --enable-maintainer-mode 
-CONFIGURE_OPTIONS += --disable-asm 
+CONFIGURE_OPTIONS += --disable-asm
+CONFIGURE_OPTIONS += --enable-threads=posix
 CONFIGURE_OPTIONS += --enable-ciphers=arcfour:blowfish:des:aes:twofish:serpent:rfc2268:seed:camellia:cast5
 
 ASLR_MODE = $(ASLR_ENABLE)
 
 include ../../make-rules/shared-targets.mk
 
+#
+# The following target is used during switch of the incompatible libgcrypt.11
+# to libgcrypt.20.  Libgcrypt-15 is not delivered as a package. If it has not
+# been built yet, we build the library as a target dependency from here and
+# deliver a subset of the library (the shared objects only and the second
+# level links) to satisfy the ABI compatibility requirements during the ABI
+# upgrade period.
+$(WS_COMPONENTS)/libgcrypt-15/build/$(MACH$(BITS))/.installed:
+	$(GMAKE) -C $(WS_COMPONENTS)/libgcrypt-15 install
+
+$(WS_COMPONENTS)/libgcrypt-15/build/$(MACH$(BITS))/.FRC_%:
+	$(GMAKE) -C $(WS_COMPONENTS)/libgcrypt-15 $(@F:.FRC_%=%)
+
+install: $(WS_COMPONENTS)/libgcrypt-15/build/$(MACH$(BITS))/.installed
+
+clean clobber:: % : $(WS_COMPONENTS)/libgcrypt-15/build/$(MACH$(BITS))/.FRC_%
+
 COMPONENT_TEST_MASTER = $(COMPONENT_TEST_RESULTS_DIR)/results-all.master
 
 COMPONENT_TEST_TRANSFORMS += \
@@ -58,3 +92,5 @@
         '-e "/All/p" '
 
 REQUIRED_PACKAGES += library/security/libgpg-error
+REQUIRED_PACKAGES += shell/ksh93
+REQUIRED_PACKAGES += system/library/gcc/gcc-c-runtime
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libgcrypt/libgcrypt-15.p5m.abi_transition	Mon May 23 23:10:00 2016 -0700
@@ -0,0 +1,5 @@
+# ABI transition state temporary deliverables
+link path=usr/lib/$(MACH64)/libgcrypt.so.11 target=libgcrypt.so.11.8.2
+file path=usr/lib/$(MACH64)/libgcrypt.so.11.8.2
+link path=usr/lib/libgcrypt.so.11 target=libgcrypt.so.11.8.2
+file path=usr/lib/libgcrypt.so.11.8.2
--- a/components/libgcrypt/libgcrypt.p5m	Mon May 23 23:09:59 2016 -0700
+++ b/components/libgcrypt/libgcrypt.p5m	Mon May 23 23:10:00 2016 -0700
@@ -20,9 +20,11 @@
 #
 
 #
-# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
 #
 
+<transform file path=usr.*/man/.+ -> default mangler.man.stability volatile>
+<include libgcrypt-15.p5m.abi_transition>
 set name=pkg.fmri \
     value=pkg:/system/library/security/libgcrypt@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION)
 set name=pkg.summary value="libgcrypt - cryptographic library"
@@ -41,14 +43,16 @@
 file path=usr/bin/dumpsexp
 file path=usr/bin/hmac256
 file usr/bin/$(MACH32)/libgcrypt-config path=usr/bin/libgcrypt-config
-file path=usr/include/gcrypt-module.h
+file path=usr/bin/mpicalc
 file path=usr/include/gcrypt.h
-link path=usr/lib/$(MACH64)/libgcrypt.so target=libgcrypt.so.11.8.2
-link path=usr/lib/$(MACH64)/libgcrypt.so.11 target=libgcrypt.so.11.8.2
-file path=usr/lib/$(MACH64)/libgcrypt.so.11.8.2
-link path=usr/lib/libgcrypt.so target=libgcrypt.so.11.8.2
-link path=usr/lib/libgcrypt.so.11 target=libgcrypt.so.11.8.2
-file path=usr/lib/libgcrypt.so.11.8.2
+link path=usr/lib/$(MACH64)/libgcrypt.so target=libgcrypt.so.20.0.4
+link path=usr/lib/$(MACH64)/libgcrypt.so.20 target=libgcrypt.so.20.0.4
+file path=usr/lib/$(MACH64)/libgcrypt.so.20.0.4
+link path=usr/lib/libgcrypt.so target=libgcrypt.so.20.0.4
+link path=usr/lib/libgcrypt.so.20 target=libgcrypt.so.20.0.4
+file path=usr/lib/libgcrypt.so.20.0.4
 file path=usr/share/aclocal/libgcrypt.m4
+file path=usr/share/info/gcrypt.info
+file path=usr/share/man/man1/hmac256.1
 license COPYING license=GPLv2
 license COPYING.LIB license=LGPLv2.1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libgcrypt/patches/libgcrypt-01-asm-divide.patch	Mon May 23 23:10:00 2016 -0700
@@ -0,0 +1,20 @@
+#
+# This patch addresses https://bugs.gnupg.org/gnupg/issue2102
+#
+# The patch comes from the upstream. Its content is a relevant part of
+# the following diff: http://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commitdiff;h=43376891c01f4aff1fbfb23beafebb5adfd0868c
+#
+--- ./configure.orig	Sat Apr 16 01:42:26 2016
++++ ./configure	Sat Apr 16 01:42:31 2016
+@@ -16519,6 +16519,11 @@
+ 		"asmfunc:\n\t"
+                 ".size asmfunc,.-asmfunc;\n\t"
+                 ".type asmfunc,@function;\n\t"
++		/* Test if assembler allows use of '/' for constant division
++		 * (Solaris/x86 issue). If previous constant division check
++		 * and "-Wa,--divide" workaround failed, this causes assembly
++		 * to be disable on this machine. */
++		"xorl \$(123456789/12345678), %ebp;\n\t"
+             );
+ _ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libgcrypt/patches/libgcrypt-02-automake.patch	Mon May 23 23:10:00 2016 -0700
@@ -0,0 +1,21 @@
+Source:
+External
+
+Info:
+configure script enforces particular version of automake(1); userland
+build machines have recently switched from 1.11 to 1.15.
+
+Status:
+N/A
+
+--- ./configure.orig	Wed Dec 30 22:28:45 2015
++++ ./configure	Wed Dec 30 22:30:16 2015
+@@ -2733,7 +2733,7 @@
+ 
+ 
+ 
+-am__api_version='1.14'
++am__api_version='1.15'
+ 
+ # Find a good install program.  We prefer a C program (faster),
+ # so one script is as good as another.  But avoid the broken or
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libgcrypt/patches/libgcrypt-03-aliasing.patch	Mon May 23 23:10:00 2016 -0700
@@ -0,0 +1,198 @@
+#
+# Resolves issues reported by 'make check':
+# selftest for CFB failed - see syslog for details
+# pass 0, algo 4, mode 1, gcry_cipher_setkey failed: Selftest failed
+# pass 0, algo 4, mode 2, gcry_cipher_setkey failed: Selftest failed
+# pass 0, algo 4, mode 5, gcry_cipher_setkey failed: Selftest failed
+# pass 0, algo 4, mode 3, gcry_cipher_setkey failed: Selftest failed
+# pass 0, algo 4, mode 3, gcry_cipher_setkey failed: Selftest failed
+# pass 0, algo 4, mode 6, gcry_cipher_setkey failed: Selftest failed
+# FAIL: basic
+# 
+# The original bug in the upstream: https://bugs.gnupg.org/gnupg/issue2144
+# This is an alternate patch to the fix delivered by the upstream. This
+# is because upstream has resolved the issue in a source code of a later
+# version of libgcrypt (post 1.6.4); the patch used by the upstream
+# patches files not yet existing in the version 1.6.4. This patch will
+# go away once libgcrypt is update to a version > 1.6.4.
+#
+# This is an in-house developed patch inspired by the comments made by
+# the libgcrypt community in the respective email thread on
+# [email protected].
+#
+--- ./cipher/bufhelp.h.aliasing	2015-02-27 10:54:03.000000000 +0100
++++ ./cipher/bufhelp.h	2015-03-13 15:03:43.301749751 +0100
+@@ -80,7 +80,7 @@ do_bytes:
+   for (; len; len--)
+     *dst++ = *src++;
+ #endif /*__GNUC__ >= 4 && (__x86_64__ || __i386__)*/
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ 
+ /* Optimized function for buffer xoring */
+@@ -117,7 +117,7 @@ do_bytes:
+   /* Handle tail.  */
+   for (; len; len--)
+     *dst++ = *src1++ ^ *src2++;
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ 
+ /* Optimized function for buffer xoring with two destination buffers.  Used
+@@ -155,7 +155,7 @@ do_bytes:
+   /* Handle tail.  */
+   for (; len; len--)
+     *dst1++ = (*dst2++ ^= *src++);
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ 
+ /* Optimized function for combined buffer xoring and copying.  Used by mainly
+@@ -208,7 +208,7 @@ do_bytes:
+       *dst_xor++ = *srcdst_cpy ^ *src_xor++;
+       *srcdst_cpy++ = temp;
+     }
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ 
+ /* Optimized function for combined buffer xoring and copying.  Used by mainly
+@@ -234,7 +234,7 @@ buf_eq_const(const void *_a, const void
+     diff -= !!(a[i] - b[i]);
+ 
+   return !diff;
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ 
+ #ifndef BUFHELP_FAST_UNALIGNED_ACCESS
+@@ -246,14 +246,14 @@ static inline u32 buf_get_be32(const voi
+   const byte *in = _buf;
+   return ((u32)in[0] << 24) | ((u32)in[1] << 16) | \
+          ((u32)in[2] << 8) | (u32)in[3];
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ static inline u32 buf_get_le32(const void *_buf)
+ {
+   const byte *in = _buf;
+   return ((u32)in[3] << 24) | ((u32)in[2] << 16) | \
+          ((u32)in[1] << 8) | (u32)in[0];
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ static inline void buf_put_be32(void *_buf, u32 val)
+ {
+@@ -262,7 +262,7 @@ static inline void buf_put_be32(void *_b
+   out[1] = val >> 16;
+   out[2] = val >> 8;
+   out[3] = val;
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ static inline void buf_put_le32(void *_buf, u32 val)
+ {
+@@ -271,7 +271,7 @@ static inline void buf_put_le32(void *_b
+   out[2] = val >> 16;
+   out[1] = val >> 8;
+   out[0] = val;
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ #ifdef HAVE_U64_TYPEDEF
+ /* Functions for loading and storing unaligned u64 values of different
+@@ -283,7 +283,7 @@ static inline u64 buf_get_be64(const voi
+          ((u64)in[2] << 40) | ((u64)in[3] << 32) | \
+          ((u64)in[4] << 24) | ((u64)in[5] << 16) | \
+          ((u64)in[6] << 8) | (u64)in[7];
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ static inline u64 buf_get_le64(const void *_buf)
+ {
+@@ -292,7 +292,7 @@ static inline u64 buf_get_le64(const voi
+          ((u64)in[5] << 40) | ((u64)in[4] << 32) | \
+          ((u64)in[3] << 24) | ((u64)in[2] << 16) | \
+          ((u64)in[1] << 8) | (u64)in[0];
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ static inline void buf_put_be64(void *_buf, u64 val)
+ {
+@@ -305,7 +305,7 @@ static inline void buf_put_be64(void *_b
+   out[5] = val >> 16;
+   out[6] = val >> 8;
+   out[7] = val;
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ static inline void buf_put_le64(void *_buf, u64 val)
+ {
+@@ -318,7 +318,7 @@ static inline void buf_put_le64(void *_b
+   out[2] = val >> 16;
+   out[1] = val >> 8;
+   out[0] = val;
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ #endif /*HAVE_U64_TYPEDEF*/
+ 
+ #else /*BUFHELP_FAST_UNALIGNED_ACCESS*/
+@@ -328,24 +328,24 @@ static inline void buf_put_le64(void *_b
+ static inline u32 buf_get_be32(const void *_buf)
+ {
+   return be_bswap32(*(const u32 *)_buf);
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ static inline u32 buf_get_le32(const void *_buf)
+ {
+   return le_bswap32(*(const u32 *)_buf);
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ static inline void buf_put_be32(void *_buf, u32 val)
+ {
+   u32 *out = _buf;
+   *out = be_bswap32(val);
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ static inline void buf_put_le32(void *_buf, u32 val)
+ {
+   u32 *out = _buf;
+   *out = le_bswap32(val);
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ #ifdef HAVE_U64_TYPEDEF
+ /* Functions for loading and storing unaligned u64 values of different
+@@ -353,24 +353,24 @@ static inline void buf_put_le32(void *_b
+ static inline u64 buf_get_be64(const void *_buf)
+ {
+   return be_bswap64(*(const u64 *)_buf);
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ static inline u64 buf_get_le64(const void *_buf)
+ {
+   return le_bswap64(*(const u64 *)_buf);
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ static inline void buf_put_be64(void *_buf, u64 val)
+ {
+   u64 *out = _buf;
+   *out = be_bswap64(val);
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ 
+ static inline void buf_put_le64(void *_buf, u64 val)
+ {
+   u64 *out = _buf;
+   *out = le_bswap64(val);
+-}
++} __attribute__ ((optimize("no-strict-aliasing")))
+ #endif /*HAVE_U64_TYPEDEF*/
+ 
+ #endif /*BUFHELP_FAST_UNALIGNED_ACCESS*/
--- a/components/libgcrypt/test/results-all.master	Mon May 23 23:09:59 2016 -0700
+++ b/components/libgcrypt/test/results-all.master	Mon May 23 23:10:00 2016 -0700
@@ -1,22 +1,25 @@
 PASS: version
-PASS: t-mpi-bit
-PASS: prime
-PASS: register
-PASS: ac
-PASS: ac-schemes
-PASS: ac-data
-PASS: basic
 PASS: mpitests
 PASS: tsexp
+PASS: t-convert
+PASS: t-mpi-bit
+PASS: t-mpi-point
+PASS: curves
+PASS: t-lock
+PASS: prime
+PASS: basic
 PASS: keygen
 PASS: pubkey
 PASS: hmac
+PASS: hashtest
+PASS: t-kdf
 PASS: keygrip
 PASS: fips186-dsa
 PASS: aeswrap
-PASS: curves
-PASS: t-kdf
 PASS: pkcs1v2
 PASS: random
+PASS: dsa-rfc6979
+PASS: t-ed25519
 PASS: benchmark
-All 21 tests passed
+PASS: bench-slope
+All 24 tests passed