openssl: bump to 3.0.8
This is a major update to the current LTS version, supported until 2026-09-07. Changelog: https://github.com/openssl/openssl/blob/openssl-3.0.8/CHANGES.md Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
This commit is contained in:
		 Eneas U de Queiroz
					Eneas U de Queiroz
				
			
				
					committed by
					
						 Christian Marangi
						Christian Marangi
					
				
			
			
				
	
			
			
			 Christian Marangi
						Christian Marangi
					
				
			
						parent
						
							eac6fe6f74
						
					
				
				
					commit
					7e7e76afca
				
			| @@ -1,8 +1,8 @@ | |||||||
| # SPDX-License-Identifier: GPL-2.0-only | # SPDX-License-Identifier: GPL-2.0-only | ||||||
| # | # | ||||||
| # Copyright (C) 2022 Enéas Ulir de Queiroz | # Copyright (C) 2022-2023 Enéas Ulir de Queiroz | ||||||
|  |  | ||||||
| ENGINES_DIR=engines-1.1 | ENGINES_DIR=engines-3 | ||||||
|  |  | ||||||
| define Package/openssl/engine/Default | define Package/openssl/engine/Default | ||||||
|   SECTION:=libs |   SECTION:=libs | ||||||
|   | |||||||
| @@ -8,11 +8,9 @@ config OPENSSL_OPTIMIZE_SPEED | |||||||
| 	prompt "Enable optimization for speed instead of size" | 	prompt "Enable optimization for speed instead of size" | ||||||
| 	select OPENSSL_WITH_ASM | 	select OPENSSL_WITH_ASM | ||||||
| 	help | 	help | ||||||
| 		Enabling this option increases code size (around 20%) and | 		Enabling this option increases code size and performance. | ||||||
| 		performance.  The increase in performance and size depends on the | 		The increase in performance and size depends on the | ||||||
| 		target CPU. EC and AES seem to benefit the most, with EC speed | 		target CPU. EC and AES seem to benefit the most. | ||||||
| 		increased by 20%-50% (mipsel & x86). |  | ||||||
| 		AES-GCM is supposed to be 3x faster on x86. YMMV. |  | ||||||
|  |  | ||||||
| config OPENSSL_WITH_ASM | config OPENSSL_WITH_ASM | ||||||
| 	bool | 	bool | ||||||
| @@ -22,19 +20,7 @@ config OPENSSL_WITH_ASM | |||||||
| 	help | 	help | ||||||
| 		Disabling this option will reduce code size and performance. | 		Disabling this option will reduce code size and performance. | ||||||
| 		The increase in performance and size depends on the target | 		The increase in performance and size depends on the target | ||||||
| 		CPU and on the algorithms being optimized.  As of 1.1.0i*: | 		CPU and on the algorithms being optimized. | ||||||
|  |  | ||||||
| 		Platform  Pkg Inc. Algorithms where assembly is used - ~% Speed Increase |  | ||||||
| 		aarch64   174K     BN, aes, sha1, sha256, sha512, nist256, poly1305 |  | ||||||
| 		arm       152K     BN, aes, sha1, sha256, sha512, nist256, poly1305 |  | ||||||
| 		i386      183K     BN+147%, aes+300%, rc4+55%, sha1+160%, sha256+114%, sha512+270%, nist256+282%, poly1305+292% |  | ||||||
| 		mipsel      1.5K   BN+97%, aes+4%, sha1+94%, sha256+60% |  | ||||||
| 		mips64	    3.7K   BN, aes, sha1, sha256, sha512, poly1305 |  | ||||||
| 		powerpc    20K     BN, aes, sha1, sha256, sha512, poly1305 |  | ||||||
| 		x86_64    228K     BN+220%, aes+173%, rc4+38%, sha1+40%, sha256+64%, sha512+31%, nist256+354%, poly1305+228% |  | ||||||
|  |  | ||||||
| 		* Only most common algorithms shown. Your mileage may vary. |  | ||||||
| 		  BN (bignum) performance was measured using RSA sign/verify. |  | ||||||
|  |  | ||||||
| config OPENSSL_WITH_SSE2 | config OPENSSL_WITH_SSE2 | ||||||
| 	bool | 	bool | ||||||
| @@ -42,21 +28,17 @@ config OPENSSL_WITH_SSE2 | |||||||
| 	prompt "Enable use of x86 SSE2 instructions" | 	prompt "Enable use of x86 SSE2 instructions" | ||||||
| 	depends on OPENSSL_WITH_ASM && i386 | 	depends on OPENSSL_WITH_ASM && i386 | ||||||
| 	help | 	help | ||||||
| 		Use of SSE2 instructions greatly increase performance (up to | 		Use of SSE2 instructions greatly increase performance with a | ||||||
| 		3x faster) with a minimum (~0.2%, or 23KB) increase in package | 		minimum increase in package size, but it will bring no benefit | ||||||
| 		size, but it will bring no benefit if your hardware does not | 		if your hardware does not support them, such as Geode GX and LX. | ||||||
| 		support them, such as Geode GX and LX.  In this case you may | 		AMD Geode NX, and Intel Pentium 4 and above support SSE2. | ||||||
| 		save 23KB by saying yes here.  AMD Geode NX, and Intel |  | ||||||
| 		Pentium 4 and above support SSE2. |  | ||||||
|  |  | ||||||
| config OPENSSL_WITH_DEPRECATED | config OPENSSL_WITH_DEPRECATED | ||||||
| 	bool | 	bool | ||||||
| 	default y | 	default y | ||||||
| 	prompt "Include deprecated APIs (See help for a list of packages that need this)" | 	prompt "Include deprecated APIs" | ||||||
| 	help | 	help | ||||||
| 		Since openssl 1.1.x is still new to openwrt, some packages | 		This drops all deprecated API, including engine support. | ||||||
| 		requiring this option do not list it as a requirement yet: |  | ||||||
| 		 * freeswitch-stable, freeswitch, python, python3, squid. |  | ||||||
|  |  | ||||||
| config OPENSSL_NO_DEPRECATED | config OPENSSL_NO_DEPRECATED | ||||||
| 	bool | 	bool | ||||||
| @@ -84,7 +66,6 @@ config OPENSSL_WITH_TLS13 | |||||||
| 		   protocol; | 		   protocol; | ||||||
| 		 * to increase performance by reducing the number of round-trips | 		 * to increase performance by reducing the number of round-trips | ||||||
| 		   when performing a full handshake. | 		   when performing a full handshake. | ||||||
| 		It increases package size by ~4KB. |  | ||||||
|  |  | ||||||
| config OPENSSL_WITH_DTLS | config OPENSSL_WITH_DTLS | ||||||
| 	bool | 	bool | ||||||
| @@ -233,6 +214,7 @@ comment "Engine/Hardware Support" | |||||||
|  |  | ||||||
| config OPENSSL_ENGINE | config OPENSSL_ENGINE | ||||||
| 	bool "Enable engine support" | 	bool "Enable engine support" | ||||||
|  | 	select OPENSSL_WITH_DEPRECATED | ||||||
| 	default y | 	default y | ||||||
| 	help | 	help | ||||||
| 		This enables alternative cryptography implementations, | 		This enables alternative cryptography implementations, | ||||||
|   | |||||||
| @@ -8,14 +8,13 @@ | |||||||
| include $(TOPDIR)/rules.mk | include $(TOPDIR)/rules.mk | ||||||
|  |  | ||||||
| PKG_NAME:=openssl | PKG_NAME:=openssl | ||||||
| PKG_BASE:=1.1.1 | PKG_VERSION:=3.0.8 | ||||||
| PKG_BUGFIX:=t |  | ||||||
| PKG_VERSION:=$(PKG_BASE)$(PKG_BUGFIX) |  | ||||||
| PKG_RELEASE:=1 | PKG_RELEASE:=1 | ||||||
| PKG_USE_MIPS16:=0 | PKG_USE_MIPS16:=0 | ||||||
|  |  | ||||||
| PKG_BUILD_PARALLEL:=1 | PKG_BUILD_PARALLEL:=1 | ||||||
|  |  | ||||||
|  | PKG_BASE:=$(subst $(space),.,$(wordlist 1,2,$(subst .,$(space),$(PKG_VERSION)))) | ||||||
| PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz | PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz | ||||||
| PKG_SOURCE_URL:= \ | PKG_SOURCE_URL:= \ | ||||||
| 	http://www.openssl.org/source/ \ | 	http://www.openssl.org/source/ \ | ||||||
| @@ -25,9 +24,9 @@ PKG_SOURCE_URL:= \ | |||||||
| 	ftp://ftp.pca.dfn.de/pub/tools/net/openssl/source/ \ | 	ftp://ftp.pca.dfn.de/pub/tools/net/openssl/source/ \ | ||||||
| 	ftp://ftp.pca.dfn.de/pub/tools/net/openssl/source/old/$(PKG_BASE)/ | 	ftp://ftp.pca.dfn.de/pub/tools/net/openssl/source/old/$(PKG_BASE)/ | ||||||
|  |  | ||||||
| PKG_HASH:=8dee9b24bdb1dcbf0c3d1e9b02fb8f6bf22165e807f45adeb7c9677536859d3b | PKG_HASH:=6c13d2bf38fdf31eac3ce2a347073673f5d63263398f1f69d0df4a41253e4b3e | ||||||
|  |  | ||||||
| PKG_LICENSE:=OpenSSL | PKG_LICENSE:=Apache-2.0 | ||||||
| PKG_LICENSE_FILES:=LICENSE | PKG_LICENSE_FILES:=LICENSE | ||||||
| PKG_MAINTAINER:=Eneas U de Queiroz <cotequeiroz@gmail.com> | PKG_MAINTAINER:=Eneas U de Queiroz <cotequeiroz@gmail.com> | ||||||
| PKG_CPE_ID:=cpe:/a:openssl:openssl | PKG_CPE_ID:=cpe:/a:openssl:openssl | ||||||
| @@ -95,9 +94,10 @@ $(call Package/openssl/Default) | |||||||
|   DEPENDS:=+OPENSSL_WITH_COMPRESSION:zlib \ |   DEPENDS:=+OPENSSL_WITH_COMPRESSION:zlib \ | ||||||
| 	   +OPENSSL_ENGINE_BUILTIN_AFALG:kmod-crypto-user \ | 	   +OPENSSL_ENGINE_BUILTIN_AFALG:kmod-crypto-user \ | ||||||
| 	   +OPENSSL_ENGINE_BUILTIN_DEVCRYPTO:kmod-cryptodev \ | 	   +OPENSSL_ENGINE_BUILTIN_DEVCRYPTO:kmod-cryptodev \ | ||||||
| 	   +OPENSSL_ENGINE_BUILTIN_PADLOCK:kmod-crypto-hw-padlock | 	   +OPENSSL_ENGINE_BUILTIN_PADLOCK:kmod-crypto-hw-padlock \ | ||||||
|  | 	   +(arm||armeb||mips||mipsel||ppc):libatomic | ||||||
|   TITLE+= (libraries) |   TITLE+= (libraries) | ||||||
|   ABI_VERSION:=1.1 |   ABI_VERSION:=$(firstword $(subst .,$(space),$(PKG_VERSION))) | ||||||
|   MENU:=1 |   MENU:=1 | ||||||
| endef | endef | ||||||
|  |  | ||||||
| @@ -186,7 +186,7 @@ and https://openwrt.org/docs/techref/hardware/cryptographic.hardware.accelerator | |||||||
| The engine_id is "padlock" | The engine_id is "padlock" | ||||||
| endef | endef | ||||||
|  |  | ||||||
| OPENSSL_OPTIONS:= shared | OPENSSL_OPTIONS:= shared no-tests | ||||||
|  |  | ||||||
| ifndef CONFIG_OPENSSL_WITH_BLAKE2 | ifndef CONFIG_OPENSSL_WITH_BLAKE2 | ||||||
|   OPENSSL_OPTIONS += no-blake2 |   OPENSSL_OPTIONS += no-blake2 | ||||||
| @@ -272,7 +272,7 @@ ifdef CONFIG_OPENSSL_ENGINE | |||||||
|       OPENSSL_OPTIONS += enable-devcryptoeng |       OPENSSL_OPTIONS += enable-devcryptoeng | ||||||
|     endif |     endif | ||||||
|     ifndef CONFIG_OPENSSL_ENGINE_BUILTIN_PADLOCK |     ifndef CONFIG_OPENSSL_ENGINE_BUILTIN_PADLOCK | ||||||
|       OPENSSL_OPTIONS += no-hw-padlock |       OPENSSL_OPTIONS += no-padlockeng | ||||||
|     endif |     endif | ||||||
|   else |   else | ||||||
|     ifdef CONFIG_PACKAGE_libopenssl-devcrypto |     ifdef CONFIG_PACKAGE_libopenssl-devcrypto | ||||||
| @@ -282,7 +282,7 @@ ifdef CONFIG_OPENSSL_ENGINE | |||||||
|       OPENSSL_OPTIONS += no-afalgeng |       OPENSSL_OPTIONS += no-afalgeng | ||||||
|     endif |     endif | ||||||
|     ifndef CONFIG_PACKAGE_libopenssl-padlock |     ifndef CONFIG_PACKAGE_libopenssl-padlock | ||||||
|       OPENSSL_OPTIONS += no-hw-padlock |       OPENSSL_OPTIONS += no-padlockeng | ||||||
|     endif |     endif | ||||||
|   endif |   endif | ||||||
| else | else | ||||||
|   | |||||||
| @@ -1,55 +0,0 @@ | |||||||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Andy Polyakov <appro@openssl.org> |  | ||||||
| Date: Sun, 5 May 2019 18:25:50 +0200 |  | ||||||
| Subject: crypto/perlasm/ppc-xlate.pl: add linux64v2 flavour |  | ||||||
| MIME-Version: 1.0 |  | ||||||
| Content-Type: text/plain; charset=UTF-8 |  | ||||||
| Content-Transfer-Encoding: 8bit |  | ||||||
|  |  | ||||||
| This is a big endian ELFv2 configuration. ELFv2 was already being |  | ||||||
| used for little endian, and big endian was traditionally ELFv1 |  | ||||||
| but there are practical configurations that use ELFv2 with big |  | ||||||
| endian nowadays (Adélie Linux, Void Linux, possibly Gentoo, etc.) |  | ||||||
|  |  | ||||||
| Reviewed-by: Paul Dale <paul.dale@oracle.com> |  | ||||||
| Reviewed-by: Richard Levitte <levitte@openssl.org> |  | ||||||
| (Merged from https://github.com/openssl/openssl/pull/8883) |  | ||||||
|  |  | ||||||
| --- a/crypto/perlasm/ppc-xlate.pl |  | ||||||
| +++ b/crypto/perlasm/ppc-xlate.pl |  | ||||||
| @@ -49,7 +49,7 @@ my $globl = sub { |  | ||||||
|  	/osx/		&& do { $name = "_$name"; |  | ||||||
|  				last; |  | ||||||
|  			      }; |  | ||||||
| -	/linux.*(32|64le)/ |  | ||||||
| +	/linux.*(32|64(le|v2))/ |  | ||||||
|  			&& do {	$ret .= ".globl	$name"; |  | ||||||
|  				if (!$$type) { |  | ||||||
|  				    $ret .= "\n.type	$name,\@function"; |  | ||||||
| @@ -80,7 +80,7 @@ my $globl = sub { |  | ||||||
|  }; |  | ||||||
|  my $text = sub { |  | ||||||
|      my $ret = ($flavour =~ /aix/) ? ".csect\t.text[PR],7" : ".text"; |  | ||||||
| -    $ret = ".abiversion	2\n".$ret	if ($flavour =~ /linux.*64le/); |  | ||||||
| +    $ret = ".abiversion	2\n".$ret	if ($flavour =~ /linux.*64(le|v2)/); |  | ||||||
|      $ret; |  | ||||||
|  }; |  | ||||||
|  my $machine = sub { |  | ||||||
| @@ -186,7 +186,7 @@ my $vmr = sub { |  | ||||||
|   |  | ||||||
|  # Some ABIs specify vrsave, special-purpose register #256, as reserved |  | ||||||
|  # for system use. |  | ||||||
| -my $no_vrsave = ($flavour =~ /aix|linux64le/); |  | ||||||
| +my $no_vrsave = ($flavour =~ /aix|linux64(le|v2)/); |  | ||||||
|  my $mtspr = sub { |  | ||||||
|      my ($f,$idx,$ra) = @_; |  | ||||||
|      if ($idx == 256 && $no_vrsave) { |  | ||||||
| @@ -318,7 +318,7 @@ while($line=<>) { |  | ||||||
|  	if ($label) { |  | ||||||
|  	    my $xlated = ($GLOBALS{$label} or $label); |  | ||||||
|  	    print "$xlated:"; |  | ||||||
| -	    if ($flavour =~ /linux.*64le/) { |  | ||||||
| +	    if ($flavour =~ /linux.*64(le|v2)/) { |  | ||||||
|  		if ($TYPES{$label} =~ /function/) { |  | ||||||
|  		    printf "\n.localentry	%s,0\n",$xlated; |  | ||||||
|  		} |  | ||||||
| @@ -10,7 +10,7 @@ Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> | |||||||
|  |  | ||||||
| --- a/Configure | --- a/Configure | ||||||
| +++ b/Configure | +++ b/Configure | ||||||
| @@ -1548,7 +1548,9 @@ unless ($disabled{"crypto-mdebug-backtra | @@ -1677,7 +1677,9 @@ $config{CFLAGS} = [ map { $_ eq '--ossl- | ||||||
|   |   | ||||||
|  unless ($disabled{afalgeng}) { |  unless ($disabled{afalgeng}) { | ||||||
|      $config{afalgeng}=""; |      $config{afalgeng}=""; | ||||||
|   | |||||||
| @@ -10,12 +10,12 @@ Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> | |||||||
|  |  | ||||||
| --- a/crypto/build.info | --- a/crypto/build.info | ||||||
| +++ b/crypto/build.info | +++ b/crypto/build.info | ||||||
| @@ -10,7 +10,7 @@ EXTRA=  ../ms/uplink-x86.pl ../ms/uplink | @@ -113,7 +113,7 @@ DEFINE[../libcrypto]=$UPLINKDEF | ||||||
|          ppccpuid.pl pariscid.pl alphacpuid.pl arm64cpuid.pl armv4cpuid.pl |  | ||||||
|   |   | ||||||
|  |  DEPEND[info.o]=buildinf.h | ||||||
|  DEPEND[cversion.o]=buildinf.h |  DEPEND[cversion.o]=buildinf.h | ||||||
| -GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(CC) $(LIB_CFLAGS) $(CPPFLAGS_Q)" "$(PLATFORM)" | -GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(CC) $(LIB_CFLAGS) $(CPPFLAGS_Q)" "$(PLATFORM)" | ||||||
| +GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(filter-out -I% -iremap% -fmacro-prefix-map% -ffile-prefix-map%,$(CC) $(LIB_CFLAGS) $(CPPFLAGS_Q))" "$(PLATFORM)" | +GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(filter-out -I% -iremap% -fmacro-prefix-map% -ffile-prefix-map%,$(CC) $(LIB_CFLAGS) $(CPPFLAGS_Q))" "$(PLATFORM)" | ||||||
|  DEPEND[buildinf.h]=../configdata.pm |  | ||||||
|   |   | ||||||
|  GENERATE[uplink-x86.s]=../ms/uplink-x86.pl $(PERLASM_SCHEME) |  GENERATE[uplink-x86.S]=../ms/uplink-x86.pl | ||||||
|  |  GENERATE[uplink-x86_64.s]=../ms/uplink-x86_64.pl | ||||||
|   | |||||||
							
								
								
									
										20
									
								
								package/libs/openssl/patches/130-dont-build-fuzz-docs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								package/libs/openssl/patches/130-dont-build-fuzz-docs.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Eneas U de Queiroz <cote2004-github@yahoo.com> | ||||||
|  | Date: Thu, 27 Sep 2018 08:34:38 -0300 | ||||||
|  | Subject: Do not build tests and fuzz directories | ||||||
|  |  | ||||||
|  | This shortens build time. | ||||||
|  |  | ||||||
|  | Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> | ||||||
|  |  | ||||||
|  | --- a/build.info | ||||||
|  | +++ b/build.info | ||||||
|  | @@ -1,7 +1,7 @@ | ||||||
|  |  # Note that some of these directories are filtered in Configure.  Look for | ||||||
|  |  # %skipdir there for further explanations. | ||||||
|  |   | ||||||
|  | -SUBDIRS=crypto ssl apps util tools fuzz providers doc | ||||||
|  | +SUBDIRS=crypto ssl apps util tools providers | ||||||
|  |  IF[{- !$disabled{tests} -}] | ||||||
|  |    SUBDIRS=test | ||||||
|  |  ENDIF | ||||||
| @@ -1,29 +0,0 @@ | |||||||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Eneas U de Queiroz <cote2004-github@yahoo.com> |  | ||||||
| Date: Thu, 27 Sep 2018 08:34:38 -0300 |  | ||||||
| Subject: Do not build tests and fuzz directories |  | ||||||
|  |  | ||||||
| This shortens build time. |  | ||||||
|  |  | ||||||
| Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> |  | ||||||
|  |  | ||||||
| --- a/Configure |  | ||||||
| +++ b/Configure |  | ||||||
| @@ -318,7 +318,7 @@ my $auto_threads=1;    # enable threads |  | ||||||
|  my $default_ranlib; |  | ||||||
|   |  | ||||||
|  # Top level directories to build |  | ||||||
| -$config{dirs} = [ "crypto", "ssl", "engines", "apps", "test", "util", "tools", "fuzz" ]; |  | ||||||
| +$config{dirs} = [ "crypto", "ssl", "engines", "apps", "util", "tools" ]; |  | ||||||
|  # crypto/ subdirectories to build |  | ||||||
|  $config{sdirs} = [ |  | ||||||
|      "objects", |  | ||||||
| @@ -330,7 +330,7 @@ $config{sdirs} = [ |  | ||||||
|      "cms", "ts", "srp", "cmac", "ct", "async", "kdf", "store" |  | ||||||
|      ]; |  | ||||||
|  # test/ subdirectories to build |  | ||||||
| -$config{tdirs} = [ "ossl_shim" ]; |  | ||||||
| +$config{tdirs} = []; |  | ||||||
|   |  | ||||||
|  # Known TLS and DTLS protocols |  | ||||||
|  my @tls = qw(ssl3 tls1 tls1_1 tls1_2 tls1_3); |  | ||||||
| @@ -14,30 +14,9 @@ when the client has it on top of its ciphersuite preference. | |||||||
|  |  | ||||||
| Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> | Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> | ||||||
|  |  | ||||||
| --- a/include/openssl/ssl.h |  | ||||||
| +++ b/include/openssl/ssl.h |  | ||||||
| @@ -173,9 +173,15 @@ extern "C" { |  | ||||||
|  # define SSL_DEFAULT_CIPHER_LIST "ALL:!COMPLEMENTOFDEFAULT:!eNULL" |  | ||||||
|  /* This is the default set of TLSv1.3 ciphersuites */ |  | ||||||
|  # if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) |  | ||||||
| -#  define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ |  | ||||||
| -                                   "TLS_CHACHA20_POLY1305_SHA256:" \ |  | ||||||
| -                                   "TLS_AES_128_GCM_SHA256" |  | ||||||
| +#  ifdef OPENSSL_PREFER_CHACHA_OVER_GCM |  | ||||||
| +#   define TLS_DEFAULT_CIPHERSUITES "TLS_CHACHA20_POLY1305_SHA256:" \ |  | ||||||
| +                                    "TLS_AES_256_GCM_SHA384:" \ |  | ||||||
| +                                    "TLS_AES_128_GCM_SHA256" |  | ||||||
| +#  else |  | ||||||
| +#   define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ |  | ||||||
| +                                    "TLS_CHACHA20_POLY1305_SHA256:" \ |  | ||||||
| +                                    "TLS_AES_128_GCM_SHA256" |  | ||||||
| +#  endif |  | ||||||
|  # else |  | ||||||
|  #  define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ |  | ||||||
|                                     "TLS_AES_128_GCM_SHA256" |  | ||||||
| --- a/ssl/ssl_ciph.c | --- a/ssl/ssl_ciph.c | ||||||
| +++ b/ssl/ssl_ciph.c | +++ b/ssl/ssl_ciph.c | ||||||
| @@ -1465,11 +1465,29 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_ | @@ -1505,11 +1505,29 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_ | ||||||
|      ssl_cipher_apply_rule(0, SSL_kECDHE, 0, 0, 0, 0, 0, CIPHER_DEL, -1, &head, |      ssl_cipher_apply_rule(0, SSL_kECDHE, 0, 0, 0, 0, 0, CIPHER_DEL, -1, &head, | ||||||
|                            &tail); |                            &tail); | ||||||
|   |   | ||||||
| @@ -67,7 +46,7 @@ Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> | |||||||
|   |   | ||||||
|      /* |      /* | ||||||
|       * ...and generally, our preferred cipher is AES. |       * ...and generally, our preferred cipher is AES. | ||||||
| @@ -1525,7 +1543,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_ | @@ -1564,7 +1582,7 @@ STACK_OF(SSL_CIPHER) *ssl_create_cipher_ | ||||||
|       * Within each group, ciphers remain sorted by strength and previous |       * Within each group, ciphers remain sorted by strength and previous | ||||||
|       * preference, i.e., |       * preference, i.e., | ||||||
|       * 1) ECDHE > DHE |       * 1) ECDHE > DHE | ||||||
| @@ -76,3 +55,38 @@ Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> | |||||||
|       * 3) AES > rest |       * 3) AES > rest | ||||||
|       * 4) TLS 1.2 > legacy |       * 4) TLS 1.2 > legacy | ||||||
|       * |       * | ||||||
|  | @@ -2235,7 +2253,13 @@ const char *OSSL_default_cipher_list(voi | ||||||
|  |   */ | ||||||
|  |  const char *OSSL_default_ciphersuites(void) | ||||||
|  |  { | ||||||
|  | +#ifdef OPENSSL_PREFER_CHACHA_OVER_GCM | ||||||
|  | +    return "TLS_CHACHA20_POLY1305_SHA256:" | ||||||
|  | +           "TLS_AES_256_GCM_SHA384:" | ||||||
|  | +           "TLS_AES_128_GCM_SHA256"; | ||||||
|  | +#else | ||||||
|  |      return "TLS_AES_256_GCM_SHA384:" | ||||||
|  |             "TLS_CHACHA20_POLY1305_SHA256:" | ||||||
|  |             "TLS_AES_128_GCM_SHA256"; | ||||||
|  | +#endif | ||||||
|  |  } | ||||||
|  | --- a/include/openssl/ssl.h.in | ||||||
|  | +++ b/include/openssl/ssl.h.in | ||||||
|  | @@ -195,9 +195,15 @@ extern "C" { | ||||||
|  |   * DEPRECATED IN 3.0.0, in favor of OSSL_default_ciphersuites() | ||||||
|  |   * Update both macro and function simultaneously | ||||||
|  |   */ | ||||||
|  | -#  define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ | ||||||
|  | -                                   "TLS_CHACHA20_POLY1305_SHA256:" \ | ||||||
|  | -                                   "TLS_AES_128_GCM_SHA256" | ||||||
|  | +#  ifdef OPENSSL_PREFER_CHACHA_OVER_GCM | ||||||
|  | +#   define TLS_DEFAULT_CIPHERSUITES "TLS_CHACHA20_POLY1305_SHA256:" \ | ||||||
|  | +                                    "TLS_AES_256_GCM_SHA384:" \ | ||||||
|  | +                                    "TLS_AES_128_GCM_SHA256" | ||||||
|  | +#  else | ||||||
|  | +#   define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ | ||||||
|  | +                                    "TLS_CHACHA20_POLY1305_SHA256:" \ | ||||||
|  | +                                    "TLS_AES_128_GCM_SHA256" | ||||||
|  | +#  endif | ||||||
|  |  # endif | ||||||
|  |  /* | ||||||
|  |   * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com> | |||||||
|  |  | ||||||
| --- a/apps/openssl.cnf | --- a/apps/openssl.cnf | ||||||
| +++ b/apps/openssl.cnf | +++ b/apps/openssl.cnf | ||||||
| @@ -22,6 +22,16 @@ oid_section		= new_oids | @@ -30,6 +30,16 @@ oid_section = new_oids | ||||||
|  # (Alternatively, use a configuration file that has only |  # (Alternatively, use a configuration file that has only | ||||||
|  # X.509v3 extensions in its main [= default] section.) |  # X.509v3 extensions in its main [= default] section.) | ||||||
|   |   | ||||||
| @@ -25,5 +25,5 @@ Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com> | |||||||
| +.include /etc/ssl/engines.cnf.d | +.include /etc/ssl/engines.cnf.d | ||||||
| + | + | ||||||
|  [ new_oids ] |  [ new_oids ] | ||||||
|   |  | ||||||
|  # We can add new OIDs in here for use by 'ca', 'req' and 'ts'. |  # We can add new OIDs in here for use by 'ca', 'req' and 'ts'. | ||||||
|  |  # Add a simple OID like this: | ||||||
|   | |||||||
| @@ -1,58 +0,0 @@ | |||||||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Eneas U de Queiroz <cote2004-github@yahoo.com> |  | ||||||
| Date: Mon, 5 Nov 2018 15:54:17 -0200 |  | ||||||
| Subject: eng_devcrypto: save ioctl if EVP_MD_..FLAG_ONESHOT |  | ||||||
|  |  | ||||||
| Since each ioctl causes a context switch, slowing things down, if |  | ||||||
| EVP_MD_CTX_FLAG_ONESHOT is set, then: |  | ||||||
|  - call the ioctl in digest_update, saving the result; and |  | ||||||
|  - just copy the result in digest_final, instead of using another ioctl. |  | ||||||
|  |  | ||||||
| Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> |  | ||||||
|  |  | ||||||
| Reviewed-by: Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com> |  | ||||||
| Reviewed-by: Richard Levitte <levitte@openssl.org> |  | ||||||
| (Merged from https://github.com/openssl/openssl/pull/7585) |  | ||||||
|  |  | ||||||
| --- a/crypto/engine/eng_devcrypto.c |  | ||||||
| +++ b/crypto/engine/eng_devcrypto.c |  | ||||||
| @@ -461,6 +461,7 @@ struct digest_ctx { |  | ||||||
|      struct session_op sess; |  | ||||||
|      /* This signals that the init function was called, not that it succeeded. */ |  | ||||||
|      int init_called; |  | ||||||
| +    unsigned char digest_res[HASH_MAX_LEN]; |  | ||||||
|  }; |  | ||||||
|   |  | ||||||
|  static const struct digest_data_st { |  | ||||||
| @@ -564,12 +565,15 @@ static int digest_update(EVP_MD_CTX *ctx |  | ||||||
|      if (digest_ctx == NULL) |  | ||||||
|          return 0; |  | ||||||
|   |  | ||||||
| -    if (digest_op(digest_ctx, data, count, NULL, COP_FLAG_UPDATE) < 0) { |  | ||||||
| -        SYSerr(SYS_F_IOCTL, errno); |  | ||||||
| -        return 0; |  | ||||||
| +    if (EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_ONESHOT)) { |  | ||||||
| +        if (digest_op(digest_ctx, data, count, digest_ctx->digest_res, 0) >= 0) |  | ||||||
| +            return 1; |  | ||||||
| +    } else if (digest_op(digest_ctx, data, count, NULL, COP_FLAG_UPDATE) >= 0) { |  | ||||||
| +        return 1; |  | ||||||
|      } |  | ||||||
|   |  | ||||||
| -    return 1; |  | ||||||
| +    SYSerr(SYS_F_IOCTL, errno); |  | ||||||
| +    return 0; |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|  static int digest_final(EVP_MD_CTX *ctx, unsigned char *md) |  | ||||||
| @@ -579,7 +583,10 @@ static int digest_final(EVP_MD_CTX *ctx, |  | ||||||
|   |  | ||||||
|      if (md == NULL || digest_ctx == NULL) |  | ||||||
|          return 0; |  | ||||||
| -    if (digest_op(digest_ctx, NULL, 0, md, COP_FLAG_FINAL) < 0) { |  | ||||||
| + |  | ||||||
| +    if (EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_ONESHOT)) { |  | ||||||
| +        memcpy(md, digest_ctx->digest_res, EVP_MD_CTX_size(ctx)); |  | ||||||
| +    } else if (digest_op(digest_ctx, NULL, 0, md, COP_FLAG_FINAL) < 0) { |  | ||||||
|          SYSerr(SYS_F_IOCTL, errno); |  | ||||||
|          return 0; |  | ||||||
|      } |  | ||||||
| @@ -1,566 +0,0 @@ | |||||||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Eneas U de Queiroz <cote2004-github@yahoo.com> |  | ||||||
| Date: Sat, 3 Nov 2018 15:41:10 -0300 |  | ||||||
| Subject: eng_devcrypto: add configuration options |  | ||||||
|  |  | ||||||
| USE_SOFTDRIVERS: whether to use software (not accelerated) drivers |  | ||||||
| CIPHERS: list of ciphers to enable |  | ||||||
| DIGESTS: list of digests to enable |  | ||||||
|  |  | ||||||
| Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> |  | ||||||
|  |  | ||||||
| Reviewed-by: Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com> |  | ||||||
| Reviewed-by: Richard Levitte <levitte@openssl.org> |  | ||||||
| (Merged from https://github.com/openssl/openssl/pull/7585) |  | ||||||
|  |  | ||||||
| --- a/crypto/engine/eng_devcrypto.c |  | ||||||
| +++ b/crypto/engine/eng_devcrypto.c |  | ||||||
| @@ -16,6 +16,7 @@ |  | ||||||
|  #include <unistd.h> |  | ||||||
|  #include <assert.h> |  | ||||||
|   |  | ||||||
| +#include <openssl/conf.h> |  | ||||||
|  #include <openssl/evp.h> |  | ||||||
|  #include <openssl/err.h> |  | ||||||
|  #include <openssl/engine.h> |  | ||||||
| @@ -36,6 +37,30 @@ |  | ||||||
|   * saner...  why re-open /dev/crypto for every session? |  | ||||||
|   */ |  | ||||||
|  static int cfd; |  | ||||||
| +#define DEVCRYPTO_REQUIRE_ACCELERATED 0 /* require confirmation of acceleration */ |  | ||||||
| +#define DEVCRYPTO_USE_SOFTWARE        1 /* allow software drivers */ |  | ||||||
| +#define DEVCRYPTO_REJECT_SOFTWARE     2 /* only disallow confirmed software drivers */ |  | ||||||
| + |  | ||||||
| +#define DEVCRYPTO_DEFAULT_USE_SOFDTRIVERS DEVCRYPTO_REJECT_SOFTWARE |  | ||||||
| +static int use_softdrivers = DEVCRYPTO_DEFAULT_USE_SOFDTRIVERS; |  | ||||||
| + |  | ||||||
| +/* |  | ||||||
| + * cipher/digest status & acceleration definitions |  | ||||||
| + * Make sure the defaults are set to 0 |  | ||||||
| + */ |  | ||||||
| +struct driver_info_st { |  | ||||||
| +    enum devcrypto_status_t { |  | ||||||
| +        DEVCRYPTO_STATUS_UNUSABLE       = -1, /* session open failed */ |  | ||||||
| +        DEVCRYPTO_STATUS_UNKNOWN        =  0, /* not tested yet */ |  | ||||||
| +        DEVCRYPTO_STATUS_USABLE         =  1  /* algo can be used */ |  | ||||||
| +    } status; |  | ||||||
| + |  | ||||||
| +    enum devcrypto_accelerated_t { |  | ||||||
| +        DEVCRYPTO_NOT_ACCELERATED       = -1, /* software implemented */ |  | ||||||
| +        DEVCRYPTO_ACCELERATION_UNKNOWN  =  0, /* acceleration support unkown */ |  | ||||||
| +        DEVCRYPTO_ACCELERATED           =  1  /* hardware accelerated */ |  | ||||||
| +    } accelerated; |  | ||||||
| +}; |  | ||||||
|   |  | ||||||
|  static int clean_devcrypto_session(struct session_op *sess) { |  | ||||||
|      if (ioctl(cfd, CIOCFSESSION, &sess->ses) < 0) { |  | ||||||
| @@ -119,13 +144,22 @@ static const struct cipher_data_st { |  | ||||||
|  #endif |  | ||||||
|  }; |  | ||||||
|   |  | ||||||
| -static size_t get_cipher_data_index(int nid) |  | ||||||
| +static size_t find_cipher_data_index(int nid) |  | ||||||
|  { |  | ||||||
|      size_t i; |  | ||||||
|   |  | ||||||
|      for (i = 0; i < OSSL_NELEM(cipher_data); i++) |  | ||||||
|          if (nid == cipher_data[i].nid) |  | ||||||
|              return i; |  | ||||||
| +    return (size_t)-1; |  | ||||||
| +} |  | ||||||
| + |  | ||||||
| +static size_t get_cipher_data_index(int nid) |  | ||||||
| +{ |  | ||||||
| +    size_t i = find_cipher_data_index(nid); |  | ||||||
| + |  | ||||||
| +    if (i != (size_t)-1) |  | ||||||
| +        return i; |  | ||||||
|   |  | ||||||
|      /* |  | ||||||
|       * Code further down must make sure that only NIDs in the table above |  | ||||||
| @@ -333,19 +367,40 @@ static int cipher_cleanup(EVP_CIPHER_CTX |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|  /* |  | ||||||
| - * Keep a table of known nids and associated methods. |  | ||||||
| + * Keep tables of known nids, associated methods, selected ciphers, and driver |  | ||||||
| + * info. |  | ||||||
|   * Note that known_cipher_nids[] isn't necessarily indexed the same way as |  | ||||||
| - * cipher_data[] above, which known_cipher_methods[] is. |  | ||||||
| + * cipher_data[] above, which the other tables are. |  | ||||||
|   */ |  | ||||||
|  static int known_cipher_nids[OSSL_NELEM(cipher_data)]; |  | ||||||
|  static int known_cipher_nids_amount = -1; /* -1 indicates not yet initialised */ |  | ||||||
|  static EVP_CIPHER *known_cipher_methods[OSSL_NELEM(cipher_data)] = { NULL, }; |  | ||||||
| +static int selected_ciphers[OSSL_NELEM(cipher_data)]; |  | ||||||
| +static struct driver_info_st cipher_driver_info[OSSL_NELEM(cipher_data)]; |  | ||||||
| + |  | ||||||
| + |  | ||||||
| +static int devcrypto_test_cipher(size_t cipher_data_index) |  | ||||||
| +{ |  | ||||||
| +    return (cipher_driver_info[cipher_data_index].status == DEVCRYPTO_STATUS_USABLE |  | ||||||
| +            && selected_ciphers[cipher_data_index] == 1 |  | ||||||
| +            && (cipher_driver_info[cipher_data_index].accelerated |  | ||||||
| +                    == DEVCRYPTO_ACCELERATED |  | ||||||
| +                || use_softdrivers == DEVCRYPTO_USE_SOFTWARE |  | ||||||
| +                || (cipher_driver_info[cipher_data_index].accelerated |  | ||||||
| +                        != DEVCRYPTO_NOT_ACCELERATED |  | ||||||
| +                    && use_softdrivers == DEVCRYPTO_REJECT_SOFTWARE))); |  | ||||||
| +} |  | ||||||
|   |  | ||||||
|  static void prepare_cipher_methods(void) |  | ||||||
|  { |  | ||||||
|      size_t i; |  | ||||||
|      struct session_op sess; |  | ||||||
|      unsigned long cipher_mode; |  | ||||||
| +#ifdef CIOCGSESSINFO |  | ||||||
| +    struct session_info_op siop; |  | ||||||
| +#endif |  | ||||||
| + |  | ||||||
| +    memset(&cipher_driver_info, 0, sizeof(cipher_driver_info)); |  | ||||||
|   |  | ||||||
|      memset(&sess, 0, sizeof(sess)); |  | ||||||
|      sess.key = (void *)"01234567890123456789012345678901234567890123456789"; |  | ||||||
| @@ -353,15 +408,16 @@ static void prepare_cipher_methods(void) |  | ||||||
|      for (i = 0, known_cipher_nids_amount = 0; |  | ||||||
|           i < OSSL_NELEM(cipher_data); i++) { |  | ||||||
|   |  | ||||||
| +        selected_ciphers[i] = 1; |  | ||||||
|          /* |  | ||||||
| -         * Check that the algo is really availably by trying to open and close |  | ||||||
| -         * a session. |  | ||||||
| +         * Check that the cipher is usable |  | ||||||
|           */ |  | ||||||
|          sess.cipher = cipher_data[i].devcryptoid; |  | ||||||
|          sess.keylen = cipher_data[i].keylen; |  | ||||||
| -        if (ioctl(cfd, CIOCGSESSION, &sess) < 0 |  | ||||||
| -            || ioctl(cfd, CIOCFSESSION, &sess.ses) < 0) |  | ||||||
| +        if (ioctl(cfd, CIOCGSESSION, &sess) < 0) { |  | ||||||
| +            cipher_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; |  | ||||||
|              continue; |  | ||||||
| +        } |  | ||||||
|   |  | ||||||
|          cipher_mode = cipher_data[i].flags & EVP_CIPH_MODE; |  | ||||||
|   |  | ||||||
| @@ -387,15 +443,41 @@ static void prepare_cipher_methods(void) |  | ||||||
|                                              cipher_cleanup) |  | ||||||
|              || !EVP_CIPHER_meth_set_impl_ctx_size(known_cipher_methods[i], |  | ||||||
|                                                    sizeof(struct cipher_ctx))) { |  | ||||||
| +            cipher_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; |  | ||||||
|              EVP_CIPHER_meth_free(known_cipher_methods[i]); |  | ||||||
|              known_cipher_methods[i] = NULL; |  | ||||||
|          } else { |  | ||||||
| +            cipher_driver_info[i].status = DEVCRYPTO_STATUS_USABLE; |  | ||||||
| +#ifdef CIOCGSESSINFO |  | ||||||
| +            siop.ses = sess.ses; |  | ||||||
| +            if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) |  | ||||||
| +                cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; |  | ||||||
| +            else if (!(siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY)) |  | ||||||
| +                cipher_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; |  | ||||||
| +            else |  | ||||||
| +                cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; |  | ||||||
| +#endif /* CIOCGSESSINFO */ |  | ||||||
| +        } |  | ||||||
| +        ioctl(cfd, CIOCFSESSION, &sess.ses); |  | ||||||
| +        if (devcrypto_test_cipher(i)) { |  | ||||||
|              known_cipher_nids[known_cipher_nids_amount++] = |  | ||||||
|                  cipher_data[i].nid; |  | ||||||
|          } |  | ||||||
|      } |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| +static void rebuild_known_cipher_nids(ENGINE *e) |  | ||||||
| +{ |  | ||||||
| +    size_t i; |  | ||||||
| + |  | ||||||
| +    for (i = 0, known_cipher_nids_amount = 0; i < OSSL_NELEM(cipher_data); i++) { |  | ||||||
| +        if (devcrypto_test_cipher(i)) |  | ||||||
| +            known_cipher_nids[known_cipher_nids_amount++] = cipher_data[i].nid; |  | ||||||
| +    } |  | ||||||
| +    ENGINE_unregister_ciphers(e); |  | ||||||
| +    ENGINE_register_ciphers(e); |  | ||||||
| +} |  | ||||||
| + |  | ||||||
|  static const EVP_CIPHER *get_cipher_method(int nid) |  | ||||||
|  { |  | ||||||
|      size_t i = get_cipher_data_index(nid); |  | ||||||
| @@ -438,6 +520,36 @@ static int devcrypto_ciphers(ENGINE *e, |  | ||||||
|      return *cipher != NULL; |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| +static void devcrypto_select_all_ciphers(int *cipher_list) |  | ||||||
| +{ |  | ||||||
| +    size_t i; |  | ||||||
| + |  | ||||||
| +    for (i = 0; i < OSSL_NELEM(cipher_data); i++) |  | ||||||
| +        cipher_list[i] = 1; |  | ||||||
| +} |  | ||||||
| + |  | ||||||
| +static int cryptodev_select_cipher_cb(const char *str, int len, void *usr) |  | ||||||
| +{ |  | ||||||
| +    int *cipher_list = (int *)usr; |  | ||||||
| +    char *name; |  | ||||||
| +    const EVP_CIPHER *EVP; |  | ||||||
| +    size_t i; |  | ||||||
| + |  | ||||||
| +    if (len == 0) |  | ||||||
| +        return 1; |  | ||||||
| +    if (usr == NULL || (name = OPENSSL_strndup(str, len)) == NULL) |  | ||||||
| +        return 0; |  | ||||||
| +    EVP = EVP_get_cipherbyname(name); |  | ||||||
| +    if (EVP == NULL) |  | ||||||
| +        fprintf(stderr, "devcrypto: unknown cipher %s\n", name); |  | ||||||
| +    else if ((i = find_cipher_data_index(EVP_CIPHER_nid(EVP))) != (size_t)-1) |  | ||||||
| +        cipher_list[i] = 1; |  | ||||||
| +    else |  | ||||||
| +        fprintf(stderr, "devcrypto: cipher %s not available\n", name); |  | ||||||
| +    OPENSSL_free(name); |  | ||||||
| +    return 1; |  | ||||||
| +} |  | ||||||
| + |  | ||||||
|  /* |  | ||||||
|   * We only support digests if the cryptodev implementation supports multiple |  | ||||||
|   * data updates and session copying.  Otherwise, we would be forced to maintain |  | ||||||
| @@ -493,13 +605,22 @@ static const struct digest_data_st { |  | ||||||
|  #endif |  | ||||||
|  }; |  | ||||||
|   |  | ||||||
| -static size_t get_digest_data_index(int nid) |  | ||||||
| +static size_t find_digest_data_index(int nid) |  | ||||||
|  { |  | ||||||
|      size_t i; |  | ||||||
|   |  | ||||||
|      for (i = 0; i < OSSL_NELEM(digest_data); i++) |  | ||||||
|          if (nid == digest_data[i].nid) |  | ||||||
|              return i; |  | ||||||
| +    return (size_t)-1; |  | ||||||
| +} |  | ||||||
| + |  | ||||||
| +static size_t get_digest_data_index(int nid) |  | ||||||
| +{ |  | ||||||
| +    size_t i = find_digest_data_index(nid); |  | ||||||
| + |  | ||||||
| +    if (i != (size_t)-1) |  | ||||||
| +        return i; |  | ||||||
|   |  | ||||||
|      /* |  | ||||||
|       * Code further down must make sure that only NIDs in the table above |  | ||||||
| @@ -516,8 +637,8 @@ static const struct digest_data_st *get_ |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|  /* |  | ||||||
| - * Following are the four necessary functions to map OpenSSL functionality |  | ||||||
| - * with cryptodev. |  | ||||||
| + * Following are the five necessary functions to map OpenSSL functionality |  | ||||||
| + * with cryptodev: init, update, final, cleanup, and copy. |  | ||||||
|   */ |  | ||||||
|   |  | ||||||
|  static int digest_init(EVP_MD_CTX *ctx) |  | ||||||
| @@ -630,52 +751,94 @@ static int digest_cleanup(EVP_MD_CTX *ct |  | ||||||
|      return clean_devcrypto_session(&digest_ctx->sess); |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| -static int devcrypto_test_digest(size_t digest_data_index) |  | ||||||
| -{ |  | ||||||
| -    struct session_op sess1, sess2; |  | ||||||
| -    struct cphash_op cphash; |  | ||||||
| -    int ret=0; |  | ||||||
| - |  | ||||||
| -    memset(&sess1, 0, sizeof(sess1)); |  | ||||||
| -    memset(&sess2, 0, sizeof(sess2)); |  | ||||||
| -    sess1.mac = digest_data[digest_data_index].devcryptoid; |  | ||||||
| -    if (ioctl(cfd, CIOCGSESSION, &sess1) < 0) |  | ||||||
| -        return 0; |  | ||||||
| -    /* Make sure the driver is capable of hash state copy */ |  | ||||||
| -    sess2.mac = sess1.mac; |  | ||||||
| -    if (ioctl(cfd, CIOCGSESSION, &sess2) >= 0) { |  | ||||||
| -        cphash.src_ses = sess1.ses; |  | ||||||
| -        cphash.dst_ses = sess2.ses; |  | ||||||
| -        if (ioctl(cfd, CIOCCPHASH, &cphash) >= 0) |  | ||||||
| -            ret = 1; |  | ||||||
| -        ioctl(cfd, CIOCFSESSION, &sess2.ses); |  | ||||||
| -    } |  | ||||||
| -    ioctl(cfd, CIOCFSESSION, &sess1.ses); |  | ||||||
| -    return ret; |  | ||||||
| -} |  | ||||||
| - |  | ||||||
|  /* |  | ||||||
| - * Keep a table of known nids and associated methods. |  | ||||||
| + * Keep tables of known nids, associated methods, selected digests, and |  | ||||||
| + * driver info. |  | ||||||
|   * Note that known_digest_nids[] isn't necessarily indexed the same way as |  | ||||||
| - * digest_data[] above, which known_digest_methods[] is. |  | ||||||
| + * digest_data[] above, which the other tables are. |  | ||||||
|   */ |  | ||||||
|  static int known_digest_nids[OSSL_NELEM(digest_data)]; |  | ||||||
|  static int known_digest_nids_amount = -1; /* -1 indicates not yet initialised */ |  | ||||||
|  static EVP_MD *known_digest_methods[OSSL_NELEM(digest_data)] = { NULL, }; |  | ||||||
| +static int selected_digests[OSSL_NELEM(digest_data)]; |  | ||||||
| +static struct driver_info_st digest_driver_info[OSSL_NELEM(digest_data)]; |  | ||||||
| + |  | ||||||
| +static int devcrypto_test_digest(size_t digest_data_index) |  | ||||||
| +{ |  | ||||||
| +    return (digest_driver_info[digest_data_index].status == DEVCRYPTO_STATUS_USABLE |  | ||||||
| +            && selected_digests[digest_data_index] == 1 |  | ||||||
| +            && (digest_driver_info[digest_data_index].accelerated |  | ||||||
| +                    == DEVCRYPTO_ACCELERATED |  | ||||||
| +                || use_softdrivers == DEVCRYPTO_USE_SOFTWARE |  | ||||||
| +                || (digest_driver_info[digest_data_index].accelerated |  | ||||||
| +                        != DEVCRYPTO_NOT_ACCELERATED |  | ||||||
| +                    && use_softdrivers == DEVCRYPTO_REJECT_SOFTWARE))); |  | ||||||
| +} |  | ||||||
| + |  | ||||||
| +static void rebuild_known_digest_nids(ENGINE *e) |  | ||||||
| +{ |  | ||||||
| +    size_t i; |  | ||||||
| + |  | ||||||
| +    for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data); i++) { |  | ||||||
| +        if (devcrypto_test_digest(i)) |  | ||||||
| +            known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid; |  | ||||||
| +    } |  | ||||||
| +    ENGINE_unregister_digests(e); |  | ||||||
| +    ENGINE_register_digests(e); |  | ||||||
| +} |  | ||||||
|   |  | ||||||
|  static void prepare_digest_methods(void) |  | ||||||
|  { |  | ||||||
|      size_t i; |  | ||||||
| +    struct session_op sess1, sess2; |  | ||||||
| +#ifdef CIOCGSESSINFO |  | ||||||
| +    struct session_info_op siop; |  | ||||||
| +#endif |  | ||||||
| +    struct cphash_op cphash; |  | ||||||
| + |  | ||||||
| +    memset(&digest_driver_info, 0, sizeof(digest_driver_info)); |  | ||||||
| + |  | ||||||
| +    memset(&sess1, 0, sizeof(sess1)); |  | ||||||
| +    memset(&sess2, 0, sizeof(sess2)); |  | ||||||
|   |  | ||||||
|      for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data); |  | ||||||
|           i++) { |  | ||||||
|   |  | ||||||
| +        selected_digests[i] = 1; |  | ||||||
| + |  | ||||||
|          /* |  | ||||||
| -         * Check that the algo is usable |  | ||||||
| +         * Check that the digest is usable |  | ||||||
|           */ |  | ||||||
| -        if (!devcrypto_test_digest(i)) |  | ||||||
| -            continue; |  | ||||||
| +        sess1.mac = digest_data[i].devcryptoid; |  | ||||||
| +        sess2.ses = 0; |  | ||||||
| +        if (ioctl(cfd, CIOCGSESSION, &sess1) < 0) { |  | ||||||
| +            digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; |  | ||||||
| +            goto finish; |  | ||||||
| +        } |  | ||||||
|   |  | ||||||
| +#ifdef CIOCGSESSINFO |  | ||||||
| +        /* gather hardware acceleration info from the driver */ |  | ||||||
| +        siop.ses = sess1.ses; |  | ||||||
| +        if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) |  | ||||||
| +            digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; |  | ||||||
| +        else if (siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY) |  | ||||||
| +            digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; |  | ||||||
| +        else |  | ||||||
| +            digest_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; |  | ||||||
| +#endif |  | ||||||
| + |  | ||||||
| +        /* digest must be capable of hash state copy */ |  | ||||||
| +        sess2.mac = sess1.mac; |  | ||||||
| +        if (ioctl(cfd, CIOCGSESSION, &sess2) < 0) { |  | ||||||
| +            digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; |  | ||||||
| +            goto finish; |  | ||||||
| +        } |  | ||||||
| +        cphash.src_ses = sess1.ses; |  | ||||||
| +        cphash.dst_ses = sess2.ses; |  | ||||||
| +        if (ioctl(cfd, CIOCCPHASH, &cphash) < 0) { |  | ||||||
| +            digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; |  | ||||||
| +            goto finish; |  | ||||||
| +        } |  | ||||||
|          if ((known_digest_methods[i] = EVP_MD_meth_new(digest_data[i].nid, |  | ||||||
|                                                         NID_undef)) == NULL |  | ||||||
|              || !EVP_MD_meth_set_input_blocksize(known_digest_methods[i], |  | ||||||
| @@ -689,11 +852,18 @@ static void prepare_digest_methods(void) |  | ||||||
|              || !EVP_MD_meth_set_cleanup(known_digest_methods[i], digest_cleanup) |  | ||||||
|              || !EVP_MD_meth_set_app_datasize(known_digest_methods[i], |  | ||||||
|                                               sizeof(struct digest_ctx))) { |  | ||||||
| +            digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; |  | ||||||
|              EVP_MD_meth_free(known_digest_methods[i]); |  | ||||||
|              known_digest_methods[i] = NULL; |  | ||||||
| -        } else { |  | ||||||
| -            known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid; |  | ||||||
| +            goto finish; |  | ||||||
|          } |  | ||||||
| +        digest_driver_info[i].status = DEVCRYPTO_STATUS_USABLE; |  | ||||||
| +finish: |  | ||||||
| +        ioctl(cfd, CIOCFSESSION, &sess1.ses); |  | ||||||
| +        if (sess2.ses != 0) |  | ||||||
| +            ioctl(cfd, CIOCFSESSION, &sess2.ses); |  | ||||||
| +        if (devcrypto_test_digest(i)) |  | ||||||
| +            known_digest_nids[known_digest_nids_amount++] = digest_data[i].nid; |  | ||||||
|      } |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| @@ -739,7 +909,153 @@ static int devcrypto_digests(ENGINE *e, |  | ||||||
|      return *digest != NULL; |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| +static void devcrypto_select_all_digests(int *digest_list) |  | ||||||
| +{ |  | ||||||
| +    size_t i; |  | ||||||
| + |  | ||||||
| +    for (i = 0; i < OSSL_NELEM(digest_data); i++) |  | ||||||
| +        digest_list[i] = 1; |  | ||||||
| +} |  | ||||||
| + |  | ||||||
| +static int cryptodev_select_digest_cb(const char *str, int len, void *usr) |  | ||||||
| +{ |  | ||||||
| +    int *digest_list = (int *)usr; |  | ||||||
| +    char *name; |  | ||||||
| +    const EVP_MD *EVP; |  | ||||||
| +    size_t i; |  | ||||||
| + |  | ||||||
| +    if (len == 0) |  | ||||||
| +        return 1; |  | ||||||
| +    if (usr == NULL || (name = OPENSSL_strndup(str, len)) == NULL) |  | ||||||
| +        return 0; |  | ||||||
| +    EVP = EVP_get_digestbyname(name); |  | ||||||
| +    if (EVP == NULL) |  | ||||||
| +        fprintf(stderr, "devcrypto: unknown digest %s\n", name); |  | ||||||
| +    else if ((i = find_digest_data_index(EVP_MD_type(EVP))) != (size_t)-1) |  | ||||||
| +        digest_list[i] = 1; |  | ||||||
| +    else |  | ||||||
| +        fprintf(stderr, "devcrypto: digest %s not available\n", name); |  | ||||||
| +    OPENSSL_free(name); |  | ||||||
| +    return 1; |  | ||||||
| +} |  | ||||||
| + |  | ||||||
| +#endif |  | ||||||
| + |  | ||||||
| +/****************************************************************************** |  | ||||||
| + * |  | ||||||
| + * CONTROL COMMANDS |  | ||||||
| + * |  | ||||||
| + *****/ |  | ||||||
| + |  | ||||||
| +#define DEVCRYPTO_CMD_USE_SOFTDRIVERS ENGINE_CMD_BASE |  | ||||||
| +#define DEVCRYPTO_CMD_CIPHERS (ENGINE_CMD_BASE + 1) |  | ||||||
| +#define DEVCRYPTO_CMD_DIGESTS (ENGINE_CMD_BASE + 2) |  | ||||||
| +#define DEVCRYPTO_CMD_DUMP_INFO (ENGINE_CMD_BASE + 3) |  | ||||||
| + |  | ||||||
| +/* Helper macros for CPP string composition */ |  | ||||||
| +#ifndef OPENSSL_MSTR |  | ||||||
| +# define OPENSSL_MSTR_HELPER(x) #x |  | ||||||
| +# define OPENSSL_MSTR(x) OPENSSL_MSTR_HELPER(x) |  | ||||||
| +#endif |  | ||||||
| + |  | ||||||
| +static const ENGINE_CMD_DEFN devcrypto_cmds[] = { |  | ||||||
| +#ifdef CIOCGSESSINFO |  | ||||||
| +   {DEVCRYPTO_CMD_USE_SOFTDRIVERS, |  | ||||||
| +    "USE_SOFTDRIVERS", |  | ||||||
| +    "specifies whether to use software (not accelerated) drivers (" |  | ||||||
| +        OPENSSL_MSTR(DEVCRYPTO_REQUIRE_ACCELERATED) "=use only accelerated drivers, " |  | ||||||
| +        OPENSSL_MSTR(DEVCRYPTO_USE_SOFTWARE) "=allow all drivers, " |  | ||||||
| +        OPENSSL_MSTR(DEVCRYPTO_REJECT_SOFTWARE) |  | ||||||
| +        "=use if acceleration can't be determined) [default=" |  | ||||||
| +        OPENSSL_MSTR(DEVCRYPTO_DEFAULT_USE_SOFDTRIVERS) "]", |  | ||||||
| +    ENGINE_CMD_FLAG_NUMERIC}, |  | ||||||
| +#endif |  | ||||||
| + |  | ||||||
| +   {DEVCRYPTO_CMD_CIPHERS, |  | ||||||
| +    "CIPHERS", |  | ||||||
| +    "either ALL, NONE, or a comma-separated list of ciphers to enable [default=ALL]", |  | ||||||
| +    ENGINE_CMD_FLAG_STRING}, |  | ||||||
| + |  | ||||||
| +#ifdef IMPLEMENT_DIGEST |  | ||||||
| +   {DEVCRYPTO_CMD_DIGESTS, |  | ||||||
| +    "DIGESTS", |  | ||||||
| +    "either ALL, NONE, or a comma-separated list of digests to enable [default=ALL]", |  | ||||||
| +    ENGINE_CMD_FLAG_STRING}, |  | ||||||
| +#endif |  | ||||||
| + |  | ||||||
| +   {0, NULL, NULL, 0} |  | ||||||
| +}; |  | ||||||
| + |  | ||||||
| +static int devcrypto_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)) |  | ||||||
| +{ |  | ||||||
| +    int *new_list; |  | ||||||
| +    switch (cmd) { |  | ||||||
| +#ifdef CIOCGSESSINFO |  | ||||||
| +    case DEVCRYPTO_CMD_USE_SOFTDRIVERS: |  | ||||||
| +        switch (i) { |  | ||||||
| +        case DEVCRYPTO_REQUIRE_ACCELERATED: |  | ||||||
| +        case DEVCRYPTO_USE_SOFTWARE: |  | ||||||
| +        case DEVCRYPTO_REJECT_SOFTWARE: |  | ||||||
| +            break; |  | ||||||
| +        default: |  | ||||||
| +            fprintf(stderr, "devcrypto: invalid value (%ld) for USE_SOFTDRIVERS\n", i); |  | ||||||
| +            return 0; |  | ||||||
| +        } |  | ||||||
| +        if (use_softdrivers == i) |  | ||||||
| +            return 1; |  | ||||||
| +        use_softdrivers = i; |  | ||||||
| +#ifdef IMPLEMENT_DIGEST |  | ||||||
| +        rebuild_known_digest_nids(e); |  | ||||||
|  #endif |  | ||||||
| +        rebuild_known_cipher_nids(e); |  | ||||||
| +        return 1; |  | ||||||
| +#endif /* CIOCGSESSINFO */ |  | ||||||
| + |  | ||||||
| +    case DEVCRYPTO_CMD_CIPHERS: |  | ||||||
| +        if (p == NULL) |  | ||||||
| +            return 1; |  | ||||||
| +        if (strcasecmp((const char *)p, "ALL") == 0) { |  | ||||||
| +            devcrypto_select_all_ciphers(selected_ciphers); |  | ||||||
| +        } else if (strcasecmp((const char*)p, "NONE") == 0) { |  | ||||||
| +            memset(selected_ciphers, 0, sizeof(selected_ciphers)); |  | ||||||
| +        } else { |  | ||||||
| +            new_list=OPENSSL_zalloc(sizeof(selected_ciphers)); |  | ||||||
| +            if (!CONF_parse_list(p, ',', 1, cryptodev_select_cipher_cb, new_list)) { |  | ||||||
| +                OPENSSL_free(new_list); |  | ||||||
| +                return 0; |  | ||||||
| +            } |  | ||||||
| +            memcpy(selected_ciphers, new_list, sizeof(selected_ciphers)); |  | ||||||
| +            OPENSSL_free(new_list); |  | ||||||
| +        } |  | ||||||
| +        rebuild_known_cipher_nids(e); |  | ||||||
| +        return 1; |  | ||||||
| + |  | ||||||
| +#ifdef IMPLEMENT_DIGEST |  | ||||||
| +    case DEVCRYPTO_CMD_DIGESTS: |  | ||||||
| +        if (p == NULL) |  | ||||||
| +            return 1; |  | ||||||
| +        if (strcasecmp((const char *)p, "ALL") == 0) { |  | ||||||
| +            devcrypto_select_all_digests(selected_digests); |  | ||||||
| +        } else if (strcasecmp((const char*)p, "NONE") == 0) { |  | ||||||
| +            memset(selected_digests, 0, sizeof(selected_digests)); |  | ||||||
| +        } else { |  | ||||||
| +            new_list=OPENSSL_zalloc(sizeof(selected_digests)); |  | ||||||
| +            if (!CONF_parse_list(p, ',', 1, cryptodev_select_digest_cb, new_list)) { |  | ||||||
| +                OPENSSL_free(new_list); |  | ||||||
| +                return 0; |  | ||||||
| +            } |  | ||||||
| +            memcpy(selected_digests, new_list, sizeof(selected_digests)); |  | ||||||
| +            OPENSSL_free(new_list); |  | ||||||
| +        } |  | ||||||
| +        rebuild_known_digest_nids(e); |  | ||||||
| +        return 1; |  | ||||||
| +#endif /* IMPLEMENT_DIGEST */ |  | ||||||
| + |  | ||||||
| +    default: |  | ||||||
| +        break; |  | ||||||
| +    } |  | ||||||
| +    return 0; |  | ||||||
| +} |  | ||||||
|   |  | ||||||
|  /****************************************************************************** |  | ||||||
|   * |  | ||||||
| @@ -806,6 +1122,8 @@ void engine_load_devcrypto_int() |  | ||||||
|   |  | ||||||
|      if (!ENGINE_set_id(e, "devcrypto") |  | ||||||
|          || !ENGINE_set_name(e, "/dev/crypto engine") |  | ||||||
| +        || !ENGINE_set_cmd_defns(e, devcrypto_cmds) |  | ||||||
| +        || !ENGINE_set_ctrl_function(e, devcrypto_ctrl) |  | ||||||
|   |  | ||||||
|  /* |  | ||||||
|   * Asymmetric ciphers aren't well supported with /dev/crypto.  Among the BSD |  | ||||||
| @@ -1,273 +0,0 @@ | |||||||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Eneas U de Queiroz <cote2004-github@yahoo.com> |  | ||||||
| Date: Tue, 6 Nov 2018 22:54:07 -0200 |  | ||||||
| Subject: eng_devcrypto: add command to dump driver info |  | ||||||
|  |  | ||||||
| This is useful to determine the kernel driver running each algorithm. |  | ||||||
|  |  | ||||||
| Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> |  | ||||||
|  |  | ||||||
| Reviewed-by: Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com> |  | ||||||
| Reviewed-by: Richard Levitte <levitte@openssl.org> |  | ||||||
| (Merged from https://github.com/openssl/openssl/pull/7585) |  | ||||||
|  |  | ||||||
| --- a/crypto/engine/eng_devcrypto.c |  | ||||||
| +++ b/crypto/engine/eng_devcrypto.c |  | ||||||
| @@ -50,16 +50,20 @@ static int use_softdrivers = DEVCRYPTO_D |  | ||||||
|   */ |  | ||||||
|  struct driver_info_st { |  | ||||||
|      enum devcrypto_status_t { |  | ||||||
| -        DEVCRYPTO_STATUS_UNUSABLE       = -1, /* session open failed */ |  | ||||||
| -        DEVCRYPTO_STATUS_UNKNOWN        =  0, /* not tested yet */ |  | ||||||
| -        DEVCRYPTO_STATUS_USABLE         =  1  /* algo can be used */ |  | ||||||
| +        DEVCRYPTO_STATUS_FAILURE         = -3, /* unusable for other reason */ |  | ||||||
| +        DEVCRYPTO_STATUS_NO_CIOCCPHASH   = -2, /* hash state copy not supported */ |  | ||||||
| +        DEVCRYPTO_STATUS_NO_CIOCGSESSION = -1, /* session open failed */ |  | ||||||
| +        DEVCRYPTO_STATUS_UNKNOWN         =  0, /* not tested yet */ |  | ||||||
| +        DEVCRYPTO_STATUS_USABLE          =  1  /* algo can be used */ |  | ||||||
|      } status; |  | ||||||
|   |  | ||||||
|      enum devcrypto_accelerated_t { |  | ||||||
| -        DEVCRYPTO_NOT_ACCELERATED       = -1, /* software implemented */ |  | ||||||
| -        DEVCRYPTO_ACCELERATION_UNKNOWN  =  0, /* acceleration support unkown */ |  | ||||||
| -        DEVCRYPTO_ACCELERATED           =  1  /* hardware accelerated */ |  | ||||||
| +        DEVCRYPTO_NOT_ACCELERATED        = -1, /* software implemented */ |  | ||||||
| +        DEVCRYPTO_ACCELERATION_UNKNOWN   =  0, /* acceleration support unkown */ |  | ||||||
| +        DEVCRYPTO_ACCELERATED            =  1  /* hardware accelerated */ |  | ||||||
|      } accelerated; |  | ||||||
| + |  | ||||||
| +    char *driver_name; |  | ||||||
|  }; |  | ||||||
|   |  | ||||||
|  static int clean_devcrypto_session(struct session_op *sess) { |  | ||||||
| @@ -415,7 +419,7 @@ static void prepare_cipher_methods(void) |  | ||||||
|          sess.cipher = cipher_data[i].devcryptoid; |  | ||||||
|          sess.keylen = cipher_data[i].keylen; |  | ||||||
|          if (ioctl(cfd, CIOCGSESSION, &sess) < 0) { |  | ||||||
| -            cipher_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; |  | ||||||
| +            cipher_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCGSESSION; |  | ||||||
|              continue; |  | ||||||
|          } |  | ||||||
|   |  | ||||||
| @@ -443,19 +447,24 @@ static void prepare_cipher_methods(void) |  | ||||||
|                                              cipher_cleanup) |  | ||||||
|              || !EVP_CIPHER_meth_set_impl_ctx_size(known_cipher_methods[i], |  | ||||||
|                                                    sizeof(struct cipher_ctx))) { |  | ||||||
| -            cipher_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; |  | ||||||
| +            cipher_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; |  | ||||||
|              EVP_CIPHER_meth_free(known_cipher_methods[i]); |  | ||||||
|              known_cipher_methods[i] = NULL; |  | ||||||
|          } else { |  | ||||||
|              cipher_driver_info[i].status = DEVCRYPTO_STATUS_USABLE; |  | ||||||
|  #ifdef CIOCGSESSINFO |  | ||||||
|              siop.ses = sess.ses; |  | ||||||
| -            if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) |  | ||||||
| +            if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) { |  | ||||||
|                  cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; |  | ||||||
| -            else if (!(siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY)) |  | ||||||
| -                cipher_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; |  | ||||||
| -            else |  | ||||||
| -                cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; |  | ||||||
| +            } else { |  | ||||||
| +                cipher_driver_info[i].driver_name = |  | ||||||
| +                    OPENSSL_strndup(siop.cipher_info.cra_driver_name, |  | ||||||
| +                                    CRYPTODEV_MAX_ALG_NAME); |  | ||||||
| +                if (!(siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY)) |  | ||||||
| +                    cipher_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; |  | ||||||
| +                else |  | ||||||
| +                    cipher_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; |  | ||||||
| +            } |  | ||||||
|  #endif /* CIOCGSESSINFO */ |  | ||||||
|          } |  | ||||||
|          ioctl(cfd, CIOCFSESSION, &sess.ses); |  | ||||||
| @@ -505,8 +514,11 @@ static void destroy_all_cipher_methods(v |  | ||||||
|  { |  | ||||||
|      size_t i; |  | ||||||
|   |  | ||||||
| -    for (i = 0; i < OSSL_NELEM(cipher_data); i++) |  | ||||||
| +    for (i = 0; i < OSSL_NELEM(cipher_data); i++) { |  | ||||||
|          destroy_cipher_method(cipher_data[i].nid); |  | ||||||
| +        OPENSSL_free(cipher_driver_info[i].driver_name); |  | ||||||
| +        cipher_driver_info[i].driver_name = NULL; |  | ||||||
| +    } |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|  static int devcrypto_ciphers(ENGINE *e, const EVP_CIPHER **cipher, |  | ||||||
| @@ -550,6 +562,40 @@ static int cryptodev_select_cipher_cb(co |  | ||||||
|      return 1; |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| +static void dump_cipher_info(void) |  | ||||||
| +{ |  | ||||||
| +    size_t i; |  | ||||||
| +    const char *name; |  | ||||||
| + |  | ||||||
| +    fprintf (stderr, "Information about ciphers supported by the /dev/crypto" |  | ||||||
| +             " engine:\n"); |  | ||||||
| +#ifndef CIOCGSESSINFO |  | ||||||
| +    fprintf(stderr, "CIOCGSESSINFO (session info call) unavailable\n"); |  | ||||||
| +#endif |  | ||||||
| +    for (i = 0; i < OSSL_NELEM(cipher_data); i++) { |  | ||||||
| +        name = OBJ_nid2sn(cipher_data[i].nid); |  | ||||||
| +        fprintf (stderr, "Cipher %s, NID=%d, /dev/crypto info: id=%d, ", |  | ||||||
| +                 name ? name : "unknown", cipher_data[i].nid, |  | ||||||
| +                 cipher_data[i].devcryptoid); |  | ||||||
| +        if (cipher_driver_info[i].status == DEVCRYPTO_STATUS_NO_CIOCGSESSION ) { |  | ||||||
| +            fprintf (stderr, "CIOCGSESSION (session open call) failed\n"); |  | ||||||
| +            continue; |  | ||||||
| +        } |  | ||||||
| +        fprintf (stderr, "driver=%s ", cipher_driver_info[i].driver_name ? |  | ||||||
| +                 cipher_driver_info[i].driver_name : "unknown"); |  | ||||||
| +        if (cipher_driver_info[i].accelerated == DEVCRYPTO_ACCELERATED) |  | ||||||
| +            fprintf(stderr, "(hw accelerated)"); |  | ||||||
| +        else if (cipher_driver_info[i].accelerated == DEVCRYPTO_NOT_ACCELERATED) |  | ||||||
| +            fprintf(stderr, "(software)"); |  | ||||||
| +        else |  | ||||||
| +            fprintf(stderr, "(acceleration status unknown)"); |  | ||||||
| +        if (cipher_driver_info[i].status == DEVCRYPTO_STATUS_FAILURE) |  | ||||||
| +            fprintf (stderr, ". Cipher setup failed"); |  | ||||||
| +        fprintf(stderr, "\n"); |  | ||||||
| +    } |  | ||||||
| +    fprintf(stderr, "\n"); |  | ||||||
| +} |  | ||||||
| + |  | ||||||
|  /* |  | ||||||
|   * We only support digests if the cryptodev implementation supports multiple |  | ||||||
|   * data updates and session copying.  Otherwise, we would be forced to maintain |  | ||||||
| @@ -812,31 +858,36 @@ static void prepare_digest_methods(void) |  | ||||||
|          sess1.mac = digest_data[i].devcryptoid; |  | ||||||
|          sess2.ses = 0; |  | ||||||
|          if (ioctl(cfd, CIOCGSESSION, &sess1) < 0) { |  | ||||||
| -            digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; |  | ||||||
| +            digest_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCGSESSION; |  | ||||||
|              goto finish; |  | ||||||
|          } |  | ||||||
|   |  | ||||||
|  #ifdef CIOCGSESSINFO |  | ||||||
|          /* gather hardware acceleration info from the driver */ |  | ||||||
|          siop.ses = sess1.ses; |  | ||||||
| -        if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) |  | ||||||
| +        if (ioctl(cfd, CIOCGSESSINFO, &siop) < 0) { |  | ||||||
|              digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATION_UNKNOWN; |  | ||||||
| -        else if (siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY) |  | ||||||
| -            digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; |  | ||||||
| -        else |  | ||||||
| -            digest_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; |  | ||||||
| +        } else { |  | ||||||
| +            digest_driver_info[i].driver_name = |  | ||||||
| +                OPENSSL_strndup(siop.hash_info.cra_driver_name, |  | ||||||
| +                                CRYPTODEV_MAX_ALG_NAME); |  | ||||||
| +            if (siop.flags & SIOP_FLAG_KERNEL_DRIVER_ONLY) |  | ||||||
| +                digest_driver_info[i].accelerated = DEVCRYPTO_ACCELERATED; |  | ||||||
| +            else |  | ||||||
| +                digest_driver_info[i].accelerated = DEVCRYPTO_NOT_ACCELERATED; |  | ||||||
| +        } |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
|          /* digest must be capable of hash state copy */ |  | ||||||
|          sess2.mac = sess1.mac; |  | ||||||
|          if (ioctl(cfd, CIOCGSESSION, &sess2) < 0) { |  | ||||||
| -            digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; |  | ||||||
| +            digest_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; |  | ||||||
|              goto finish; |  | ||||||
|          } |  | ||||||
|          cphash.src_ses = sess1.ses; |  | ||||||
|          cphash.dst_ses = sess2.ses; |  | ||||||
|          if (ioctl(cfd, CIOCCPHASH, &cphash) < 0) { |  | ||||||
| -            digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; |  | ||||||
| +            digest_driver_info[i].status = DEVCRYPTO_STATUS_NO_CIOCCPHASH; |  | ||||||
|              goto finish; |  | ||||||
|          } |  | ||||||
|          if ((known_digest_methods[i] = EVP_MD_meth_new(digest_data[i].nid, |  | ||||||
| @@ -852,7 +903,7 @@ static void prepare_digest_methods(void) |  | ||||||
|              || !EVP_MD_meth_set_cleanup(known_digest_methods[i], digest_cleanup) |  | ||||||
|              || !EVP_MD_meth_set_app_datasize(known_digest_methods[i], |  | ||||||
|                                               sizeof(struct digest_ctx))) { |  | ||||||
| -            digest_driver_info[i].status = DEVCRYPTO_STATUS_UNUSABLE; |  | ||||||
| +            digest_driver_info[i].status = DEVCRYPTO_STATUS_FAILURE; |  | ||||||
|              EVP_MD_meth_free(known_digest_methods[i]); |  | ||||||
|              known_digest_methods[i] = NULL; |  | ||||||
|              goto finish; |  | ||||||
| @@ -894,8 +945,11 @@ static void destroy_all_digest_methods(v |  | ||||||
|  { |  | ||||||
|      size_t i; |  | ||||||
|   |  | ||||||
| -    for (i = 0; i < OSSL_NELEM(digest_data); i++) |  | ||||||
| +    for (i = 0; i < OSSL_NELEM(digest_data); i++) { |  | ||||||
|          destroy_digest_method(digest_data[i].nid); |  | ||||||
| +        OPENSSL_free(digest_driver_info[i].driver_name); |  | ||||||
| +        digest_driver_info[i].driver_name = NULL; |  | ||||||
| +    } |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|  static int devcrypto_digests(ENGINE *e, const EVP_MD **digest, |  | ||||||
| @@ -939,6 +993,43 @@ static int cryptodev_select_digest_cb(co |  | ||||||
|      return 1; |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| +static void dump_digest_info(void) |  | ||||||
| +{ |  | ||||||
| +    size_t i; |  | ||||||
| +    const char *name; |  | ||||||
| + |  | ||||||
| +    fprintf (stderr, "Information about digests supported by the /dev/crypto" |  | ||||||
| +             " engine:\n"); |  | ||||||
| +#ifndef CIOCGSESSINFO |  | ||||||
| +    fprintf(stderr, "CIOCGSESSINFO (session info call) unavailable\n"); |  | ||||||
| +#endif |  | ||||||
| + |  | ||||||
| +    for (i = 0; i < OSSL_NELEM(digest_data); i++) { |  | ||||||
| +        name = OBJ_nid2sn(digest_data[i].nid); |  | ||||||
| +        fprintf (stderr, "Digest %s, NID=%d, /dev/crypto info: id=%d, driver=%s", |  | ||||||
| +                 name ? name : "unknown", digest_data[i].nid, |  | ||||||
| +                 digest_data[i].devcryptoid, |  | ||||||
| +                 digest_driver_info[i].driver_name ? digest_driver_info[i].driver_name : "unknown"); |  | ||||||
| +        if (digest_driver_info[i].status == DEVCRYPTO_STATUS_NO_CIOCGSESSION) { |  | ||||||
| +            fprintf (stderr, ". CIOCGSESSION (session open) failed\n"); |  | ||||||
| +            continue; |  | ||||||
| +        } |  | ||||||
| +        if (digest_driver_info[i].accelerated == DEVCRYPTO_ACCELERATED) |  | ||||||
| +            fprintf(stderr, " (hw accelerated)"); |  | ||||||
| +        else if (digest_driver_info[i].accelerated == DEVCRYPTO_NOT_ACCELERATED) |  | ||||||
| +            fprintf(stderr, " (software)"); |  | ||||||
| +        else |  | ||||||
| +            fprintf(stderr, " (acceleration status unknown)"); |  | ||||||
| +        if (cipher_driver_info[i].status == DEVCRYPTO_STATUS_FAILURE) |  | ||||||
| +            fprintf (stderr, ". Cipher setup failed\n"); |  | ||||||
| +        else if (digest_driver_info[i].status == DEVCRYPTO_STATUS_NO_CIOCCPHASH) |  | ||||||
| +            fprintf(stderr, ", CIOCCPHASH failed\n"); |  | ||||||
| +        else |  | ||||||
| +            fprintf(stderr, ", CIOCCPHASH capable\n"); |  | ||||||
| +    } |  | ||||||
| +    fprintf(stderr, "\n"); |  | ||||||
| +} |  | ||||||
| + |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
|  /****************************************************************************** |  | ||||||
| @@ -983,6 +1074,11 @@ static const ENGINE_CMD_DEFN devcrypto_c |  | ||||||
|      ENGINE_CMD_FLAG_STRING}, |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
| +   {DEVCRYPTO_CMD_DUMP_INFO, |  | ||||||
| +    "DUMP_INFO", |  | ||||||
| +    "dump info about each algorithm to stderr; use 'openssl engine -pre DUMP_INFO devcrypto'", |  | ||||||
| +    ENGINE_CMD_FLAG_NO_INPUT}, |  | ||||||
| + |  | ||||||
|     {0, NULL, NULL, 0} |  | ||||||
|  }; |  | ||||||
|   |  | ||||||
| @@ -1051,6 +1147,13 @@ static int devcrypto_ctrl(ENGINE *e, int |  | ||||||
|          return 1; |  | ||||||
|  #endif /* IMPLEMENT_DIGEST */ |  | ||||||
|   |  | ||||||
| +    case DEVCRYPTO_CMD_DUMP_INFO: |  | ||||||
| +        dump_cipher_info(); |  | ||||||
| +#ifdef IMPLEMENT_DIGEST |  | ||||||
| +        dump_digest_info(); |  | ||||||
| +#endif |  | ||||||
| +        return 1; |  | ||||||
| + |  | ||||||
|      default: |  | ||||||
|          break; |  | ||||||
|      } |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,41 +0,0 @@ | |||||||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Eneas U de Queiroz <cote2004-github@yahoo.com> |  | ||||||
| Date: Mon, 11 Mar 2019 09:29:13 -0300 |  | ||||||
| Subject: e_devcrypto: default to not use digests in engine |  | ||||||
|  |  | ||||||
| Digests are almost always slower when using /dev/crypto because of the |  | ||||||
| cost of the context switches.  Only for large blocks it is worth it. |  | ||||||
|  |  | ||||||
| Also, when forking, the open context structures are duplicated, but the |  | ||||||
| internal kernel sessions are still shared between forks, which means an |  | ||||||
| update/close operation in one fork affects all processes using that |  | ||||||
| session. |  | ||||||
|  |  | ||||||
| This affects digests, especially for HMAC, where the session with the |  | ||||||
| key hash is used as a source for subsequent operations.  At least one |  | ||||||
| popular application does this across a fork.  Disabling digests by |  | ||||||
| default will mitigate the problem, while still allowing the user to |  | ||||||
| turn them on if it is safe and fast enough. |  | ||||||
|  |  | ||||||
| Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> |  | ||||||
|  |  | ||||||
| --- a/engines/e_devcrypto.c |  | ||||||
| +++ b/engines/e_devcrypto.c |  | ||||||
| @@ -852,7 +852,7 @@ static void prepare_digest_methods(void) |  | ||||||
|      for (i = 0, known_digest_nids_amount = 0; i < OSSL_NELEM(digest_data); |  | ||||||
|           i++) { |  | ||||||
|   |  | ||||||
| -        selected_digests[i] = 1; |  | ||||||
| +        selected_digests[i] = 0; |  | ||||||
|   |  | ||||||
|          /* |  | ||||||
|           * Check that the digest is usable |  | ||||||
| @@ -1072,7 +1072,7 @@ static const ENGINE_CMD_DEFN devcrypto_c |  | ||||||
|  #ifdef IMPLEMENT_DIGEST |  | ||||||
|     {DEVCRYPTO_CMD_DIGESTS, |  | ||||||
|      "DIGESTS", |  | ||||||
| -    "either ALL, NONE, or a comma-separated list of digests to enable [default=ALL]", |  | ||||||
| +    "either ALL, NONE, or a comma-separated list of digests to enable [default=NONE]", |  | ||||||
|      ENGINE_CMD_FLAG_STRING}, |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
| @@ -1,24 +0,0 @@ | |||||||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Eneas U de Queiroz <cote2004-github@yahoo.com> |  | ||||||
| Date: Mon, 11 Mar 2019 10:15:14 -0300 |  | ||||||
| Subject: e_devcrypto: ignore error when closing session |  | ||||||
|  |  | ||||||
| In cipher_init, ignore an eventual error when closing the previous |  | ||||||
| session.  It may have been closed by another process after a fork. |  | ||||||
|  |  | ||||||
| Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> |  | ||||||
|  |  | ||||||
| --- a/engines/e_devcrypto.c |  | ||||||
| +++ b/engines/e_devcrypto.c |  | ||||||
| @@ -195,9 +195,8 @@ static int cipher_init(EVP_CIPHER_CTX *c |  | ||||||
|          get_cipher_data(EVP_CIPHER_CTX_nid(ctx)); |  | ||||||
|   |  | ||||||
|      /* cleanup a previous session */ |  | ||||||
| -    if (cipher_ctx->sess.ses != 0 && |  | ||||||
| -        clean_devcrypto_session(&cipher_ctx->sess) == 0) |  | ||||||
| -        return 0; |  | ||||||
| +    if (cipher_ctx->sess.ses != 0) |  | ||||||
| +        clean_devcrypto_session(&cipher_ctx->sess); |  | ||||||
|   |  | ||||||
|      cipher_ctx->sess.cipher = cipher_d->devcryptoid; |  | ||||||
|      cipher_ctx->sess.keylen = cipher_d->keylen; |  | ||||||
		Reference in New Issue
	
	Block a user